Version 2.16.0

Merge '2.16.0-134.6.beta' into stable
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 981de4b..284ed91 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-10-26T10:20:01.277340",
+  "generated": "2021-12-10T17:31:54.553345",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -88,7 +88,7 @@
       "name": "analyzer_cli",
       "rootUri": "../pkg/analyzer_cli",
       "packageUri": "lib/",
-      "languageVersion": "2.7"
+      "languageVersion": "2.14"
     },
     {
       "name": "analyzer_plugin",
@@ -124,7 +124,7 @@
       "name": "bazel_worker",
       "rootUri": "../third_party/pkg/bazel_worker",
       "packageUri": "lib/",
-      "languageVersion": "2.12"
+      "languageVersion": "2.14"
     },
     {
       "name": "benchmark_harness",
@@ -262,7 +262,7 @@
       "name": "dev_compiler",
       "rootUri": "../pkg/dev_compiler",
       "packageUri": "lib/",
-      "languageVersion": "2.12"
+      "languageVersion": "2.15"
     },
     {
       "name": "devtools_server",
@@ -381,7 +381,7 @@
       "name": "js",
       "rootUri": "../pkg/js",
       "packageUri": "lib/",
-      "languageVersion": "2.12"
+      "languageVersion": "2.16"
     },
     {
       "name": "js_ast",
@@ -659,7 +659,7 @@
       "name": "stream_channel",
       "rootUri": "../third_party/pkg/stream_channel",
       "packageUri": "lib/",
-      "languageVersion": "2.10"
+      "languageVersion": "2.14"
     },
     {
       "name": "string_scanner",
@@ -710,6 +710,11 @@
       "languageVersion": "2.12"
     },
     {
+      "name": "test_package",
+      "rootUri": "../pkg/vm_service/test/test_package",
+      "languageVersion": "2.12"
+    },
+    {
       "name": "test_process",
       "rootUri": "../third_party/pkg/test_process",
       "packageUri": "lib/",
@@ -755,7 +760,7 @@
       "name": "vm",
       "rootUri": "../pkg/vm",
       "packageUri": "lib/",
-      "languageVersion": "2.12"
+      "languageVersion": "2.15"
     },
     {
       "name": "vm_service",
@@ -812,4 +817,4 @@
       "languageVersion": "2.12"
     }
   ]
-}
+}
\ No newline at end of file
diff --git a/.packages b/.packages
index 568fa66..f5ea5bc 100644
--- a/.packages
+++ b/.packages
@@ -105,6 +105,7 @@
 test_api:third_party/pkg/test/pkgs/test_api/lib
 test_core:third_party/pkg/test/pkgs/test_core/lib
 test_descriptor:third_party/pkg/test_descriptor/lib
+test_package:pkg/vm_service/test/test_package
 test_process:third_party/pkg/test_process/lib
 test_reflective_loader:third_party/pkg/test_reflective_loader/lib
 test_runner:pkg/test_runner/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8b1f6cf..b4c038a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,75 @@
+## 2.16.0
+
+### Core libraries
+
+#### `dart:core`
+
+- **Breaking Change** [#47653](https://github.com/dart-lang/sdk/issues/47653):
+  On Windows, `Directory.rename` will no longer delete a directory if
+  `newPath` specifies one. Instead, a `FileSystemException` will be thrown.
+
+- Add `Error.throwWithStackTrace` which can `throw` an
+  error with an existing stack trace, instead of creating
+  a new stack trace.
+
+#### `dart:io`
+
+- **Breaking Change** [#47769](https://github.com/dart-lang/sdk/issues/47769):
+The `Platform.packageRoot` API has been removed. It had been marked deprecated
+in 2018, as it doesn't work with any Dart 2.x release.
+- Add optional `sourcePort` parameter to `Socket.connect`, `Socket.startConnect`, `RawSocket.connect` and `RawSocket.startConnect`
+
+- **Breaking Change** [#45410](https://github.com/dart-lang/sdk/issues/45410):
+  `HttpClient` no longer transmits some headers (i.e. `authorization`,
+  `www-authenticate`, `cookie`, `cookie2`) when processing redirects to
+  a different domain.
+
+#### `dart:isolate`
+
+- **Breaking Change** [#47769](https://github.com/dart-lang/sdk/issues/47769):
+The `Isolate.packageRoot` API has been removed. It had been marked deprecated
+in 2018, as it doesn't work with any Dart 2.x release.
+
+### Tools
+
+#### Dart command line
+
+- **Breaking Change** [#46100](https://github.com/dart-lang/sdk/issues/46100):
+  The standalone `dartanalyzer` tool has been
+  marked deprecated as previously announced.
+  Its replacement is the `dart analyze` command.
+  Should you find any issues, or missing features, in the replacement
+  command, kindly file [an issue][].
+
+[an issue]: https://github.com/dart-lang/sdk/issues/new
+
+- **Breaking Change** [#46100](https://github.com/dart-lang/sdk/issues/46100):
+  The standalone `dartdoc` tool has been
+  marked deprecated as previously announced.
+  Its replacement is the `dart doc` command.
+  Should you find any issues, or missing features, in the replacement
+  command, kindly file [an issue][].
+
+[an issue]: https://github.com/dart-lang/sdk/issues/new
+
+#### Linter
+
+Updated the Linter to `1.17.1`, which includes changes that
+- adds new lint: `unnecessary_late`.
+- improves docs for `prefer_initializing_formals`.
+- updates `secure_pubspec_urls` to check `issue_tracker` and
+  `repository` entries.
+- adds new lint: `conditional_uri_does_not_exist`.
+- improves performance for
+  `missing_whitespace_between_adjacent_strings`.
+- adds new lint: `avoid_final_parameters`.
+- adds new lint: `no_leading_underscores_for_library_prefixes`.
+- adds new lint: `no_leading_underscores_for_local_identifiers`.
+- adds new lint: `secure_pubspec_urls`.
+- adds new lint: `sized_box_shrink_expand`.
+- adds new lint: `use_decorated_box`.
+- improves docs for `omit_local_variable_types`.
+
 ## 2.15.1 - 2021-12-14
 
 This is a patch release that fixes:
@@ -23,8 +95,8 @@
   instance to be passed as a closure, and similarly for static methods. This is
   commonly referred to as "closurizing" or "tearing off" a method. Constructors
   were not previously eligible for closurization, forcing users to explicitly
-  write wrapper functions when using constructors as first class functions, as
-  in the calls to `map()` in the following example:
+  write wrapper functions when using constructors as first class functions.
+  See the calls to `map()` in this example:
 
   ```dart
   class A {
@@ -46,9 +118,9 @@
   ```
 
   New in Dart 2.15, constructors are now allowed to be torn off. Named
-  constructors are closurized using their declared name (here `A.fromString`),
-  and unnamed closures are referred to for closurization using the keyword `new`
-  (here `A.new`). The example above may now be written as:
+  constructors are closurized using their declared name (here `A.fromString`).
+  To closurize unnamed constructors, use the keyword `new` (here `A.new`).
+  The above example may now be written as:
 
   ```dart
   class A {
@@ -70,11 +142,11 @@
   ```
 
   Constructors for generic classes may be torn off as generic functions, or
-  instantiated at the tear-off site. So in the following code, the tear-off
-  `G.new` used to initialize the variable `f` produces a generic function which
-  may be used to produce an instance of `G<T>` for any type `T` provided when
-  `f` is called. The tear-off `G<String>.new` used to initialize the variable
-  `g` on the other hand produces a non-generic function which may only be used
+  instantiated at the tear-off site. In the following example, the tear-off
+  `G.new` is used to initialize the variable `f` produces a generic function
+  which may be used to produce an instance of `G<T>` for any type `T` provided
+  when `f` is called. The tear-off `G<String>.new` is used to initialize the
+  variable `g` to produce a non-generic function which may only be used
   to produce instances of type `G<String>`.
 
   ```dart
@@ -91,7 +163,7 @@
   }
   ```
 
-[constructor tear-offs]: https://github.com/dart-lang/language/blob/master/accepted/future-releases/constructor-tearoffs/feature-specification.md
+[constructor tear-offs]: https://github.com/dart-lang/language/blob/master/accepted/2.15/constructor-tearoffs/feature-specification.md
 
 - **[Generic type literals][explicit instantiation]**: Previous Dart versions
   allowed class names to be used as type literals. So for example,`int` may be
@@ -165,14 +237,15 @@
   }
   ```
 
-[explicit instantiation]: https://github.com/dart-lang/language/blob/master/accepted/future-releases/constructor-tearoffs/feature-specification.md#explicitly-instantiated-classes-and-functions
+[explicit instantiation]: https://github.com/dart-lang/language/blob/master/accepted/2.15/constructor-tearoffs/feature-specification.md#explicitly-instantiated-classes-and-functions
 
 - **[Generic instantiation of function objects][object instantiation]**: Generic
   function instantiation was previously restricted to function declarations. For
-  example, as soon as a function had already been torn off, it could not be
+  example, as soon as a function had been torn off, it could not be
   instantiated:
 
   ```dart
+  // Before Dart 2.15:
   X id<X>(X x) => x;
 
   void main() {
@@ -183,7 +256,7 @@
   }
   ```
 
-  New in Dart 2.15, this restriction has been lifted, and it is now possible
+  New in Dart 2.15, this restriction has been lifted. It is now possible
   to obtain a generic instantiation of an existing function object, both
   explicitly and implicitly (again, this works the same for non-constants):
 
@@ -244,36 +317,36 @@
   }
   ```
 
-  Previously, the above program had a compile-time error because type promotion
-  due to a bug ([#1785][]) which prevented the initializer expression (`i ==
-  null`) from being accounted for when the variable in question (`iIsNull`)
-  lacked an explicit type.
+  Previously, the above program had a compile-time error due to a bug
+  ([#1785][]) in type promotion which prevented the initializer expression
+  (`i == null`) from being accounted for when the variable in question
+  (`iIsNull`) lacked an explicit type.
 
   To avoid causing problems for packages that are intended to work with older
-  versions of Dart, the fix only takes effect when the "constructor tear-offs"
-  language feature is enabled.
+  versions of Dart, the fix only takes effect when the minimum SDK of the source
+  packages is 2.15 or greater.
 
 [#1785]: https://github.com/dart-lang/language/issues/1785
 
 - Restrictions on members of a class with a constant constructor are relaxed
   such that they only apply when the class has a _generative_ constant
-  constructor.  For example, this used to be an error, but is now permitted:
+  constructor. For example, this used to be an error, but is now permitted:
 
   ```dart
   abstract class A {
+    const factory A() = B;
     var v1;
     late final v2 = Random().nextInt(10);
     late final v3;
-    const factory A() = B;
   }
 
   class B implements A {
+    const B([this.v3 = 1]);
     get v1 => null;
     set v1(_) => throw 'Cannot mutate B.v1';
     final v2 = 0;
     final v3;
     set v3(_) => throw 'Cannot initialize B.v3';
-    const B([this.v3 = 1]);
   }
   ```
 
@@ -289,7 +362,7 @@
   In particular, function objects are now equal when they are obtained by
   generic instantiation from the same function with the same actual type
   arguments, even when that type argument is not known at compile time.
-  When the expressions are constant then said function objects are identical.
+  When the expressions are constant then the function objects are identical.
   Constant expressions are treated as such even when they do not occur in a
   constant context (e.g., `var f = top;`).
 
@@ -298,14 +371,12 @@
 #### `dart:async`
 
 - Make the `unawaited` function's argument nullable, to allow calls like
-  `unawaited(foo?.bar())` too.
+  `unawaited(foo?.bar())`.
 
 #### `dart:cli`
 
 - The experimental `waitFor` functionality, and the library containing only that
   function, are now deprecated.
-- When a script is `dart run` it will always be precompiled, but with
-  incremental precompilation for following runs.
 
 #### `dart:core`
 
@@ -348,8 +419,8 @@
 #### `dart:html`
 
 - **Breaking Change** [#46316](https://github.com/dart-lang/sdk/issues/46316):
-  Related to the removal of `dart:web_sql` (see above), the
-  `window.openDatabase` has been removed as well.
+  Related to the removal of `dart:web_sql` (see above), `window.openDatabase`
+  has been removed.
 
 ### Tools
 
@@ -366,6 +437,9 @@
   Note that `dart format` has [a different set of options and
   defaults][dartfmt cli] than `dartfmt`.
 
+- When a script is `dart run` it will always be precompiled, but with
+  incremental precompilation for following runs.
+
 #### Dart VM
 
 - **Breaking Change** [#45451](https://github.com/dart-lang/sdk/issues/45451):
@@ -400,53 +474,48 @@
 #### Linter
 
 Updated the Linter to `1.14.0`, which includes changes that
-- fix `omit_local_variable_types` to not flag a local type that is
-  required for inference.
-- allow `while (true) { ... }` in `literal_only_boolean_expressions`.
-- fix `file_names` to report at the start of the file (not the entire
-  compilation unit).
-- fix `prefer_collection_literals` named typed parameter false positives.
-- improve control flow analysis for `use_build_context_synchronously`.
-- update `avoid_print` to allow `kDebugMode`-wrapped print calls.
-- fix handling of initializing formals in `prefer_final_parameters`.
-- fix `unnecessary_parenthesis` false positive with function expressions.
-- adds support for constructor tear-offs to `avoid_redundant_argument_values`,
-  `unnecessary_lambdas`, and `unnecessary_parenthesis`.
-- adds a new lint: `unnecessary_constructor_name` to flag unnecessary uses of
-  `.new`.
-- improves regular expression parsing performance for common checks
-  (`camel_case_types`, `file_names`, etc.).
-- (internal) migrates to analyzer 2.1.0 APIs.
-- fixes false positive in `use_build_context_synchronously` in awaits inside
-  anonymous functions.
-- fixes `overridden_fields` false positive w/ static fields.
-- fixes false positive in `avoid_null_checks_in_equality_operators` w/
-  non-nullable params.
-- fixes false positive for deferred imports in `prefer_const_constructors`.
-- marks `avoid_dynamic_calls` stable.
-- (internal) removes unused `MockPubVisitor` and `MockRule` classes.
-- fixes a `prefer_void_to_null` false positive w/ overridden properties.
-- (internal) removes references to `NodeLintRule` in lint rule declarations.
-- fixes `prefer_void_to_null` false positives on overriding returns.
-- fixes `prefer_generic_function_type_aliases` false positives w/ incomplete
-  statements.
-- fixes false positives for `prefer_initializing_formals` with factory
-  constructors.
-- fixes `void_checks` false positives with incomplete source.
-- updates `unnecessary_getters_setters` to only flag the getter.
-- improves messages for `avoid_renaming_method_parameters`.
-- fixes false positives in `prefer_void_to_null`.
-- fixes false positives in `omit_local_variable_types`.
-- fixes false positives in `use_rethrow_when_possible`.
 - improves performance for `annotate_overrides`, `prefer_contains`, and
   `prefer_void_to_null`.
+- marks `avoid_dynamic_calls` stable.
+- fixed `avoid_null_checks_in_equality_operators` false positive with
+  non-nullable params.
+- update `avoid_print` to allow `kDebugMode`-wrapped print calls.
+- adds support for constructor tear-offs to `avoid_redundant_argument_values`,
+  `unnecessary_lambdas`, and `unnecessary_parenthesis`.
+- improves messages for `avoid_renaming_method_parameters`.
+- improves regular expression parsing performance for common checks
+  (`camel_case_types`, `file_names`, etc.).
+- fixed `file_names` to report at the start of the file
+  (not the entire compilation unit).
+- allow `while (true) { ... }` in `literal_only_boolean_expressions`.
+- fixed `omit_local_variable_types` false positives.
+- fixed `omit_local_variable_types` to not flag a local type that is required
+  for inference.
+- fixed `overridden_fields` false positive with static fields.
+- fixed `prefer_collection_literals` named typed parameter false positives.
+- fixed `prefer_const_constructors` false positive for deferred imports.
+- fixed `prefer_final_parameters` handling of initializing formals.
+- fixed `prefer_generic_function_type_aliases` false positives with incomplete
+  statements.
+- fixed `prefer_initializing_formals` false positives with factory constructors.
+- fixed `prefer_void_to_null` false positive with overridden properties.
+- fixed `prefer_void_to_null` false positives on overriding returns.
+- fixed `prefer_void_to_null` false positives.
+- adds a new lint: `unnecessary_constructor_name` to flag unnecessary uses of
+  `.new`.
+- updates `unnecessary_getters_setters` to only flag the getter.
+- fixed `unnecessary_parenthesis` false positive with function expressions.
+- fixed `use_build_context_synchronously` false positive in awaits inside
+  anonymous functions.
+- improve control flow analysis for `use_build_context_synchronously`.
+- fixed `use_rethrow_when_possible` false positives.
+- fixed `void_checks` false positives with incomplete source.
 
 ### Pub
 
 - If you have analytics enabled `dart pub get` will send
   [usage metrics](https://github.com/dart-lang/pub/blob/0035a40f25d027130c0314571da53ffafc6d973b/lib/src/solver/result.dart#L131-L175)
   for packages from pub.dev, intended for popularity analysis.
-
 - Adds support for token-based authorization to third-party package-repositories
   with the new command `dart pub token`.
 - Credentials are no longer stored in the pub-cache, but in a platform dependent
@@ -458,7 +527,7 @@
 - The syntax for dependencies hosted at a third-party package repository has
   been simplified. Before you would need to write:
 
-```
+```yaml
 dependencies:
   colorizer:
     hosted:
@@ -471,7 +540,7 @@
 
 Now you can write:
 
-```
+```yaml
 dependencies:
   colorizer:
     hosted: 'https://custom-pub-server.com'
diff --git a/DEPS b/DEPS
index 7a961aa..60bf931 100644
--- a/DEPS
+++ b/DEPS
@@ -39,21 +39,22 @@
 
   # Checked-in SDK version. The checked-in SDK is a Dart SDK distribution in a
   # cipd package used to run Dart scripts in the build and test infrastructure.
-  "sdk_tag": "version:2.15.0-82.0.dev",
+  "sdk_tag": "version:2.15.1",
 
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "73545b2bf6c7f8e4eb931bb04d86e38d6485deee",
+  "co19_rev": "a4144628905e0d3326b2549c9a1425bfca06c681",
   # This line prevents conflicts when both packages are rolled simultaneously.
-  "co19_2_rev": "52d3d2a6d2550ccd69c8facf8a36099be66f1493",
+  "co19_2_rev": "995745937abffe9fc3a6441f9f0db27b2d706e4c",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
   "benchmarks_internal_rev": "076df10d9b77af337f2d8029725787155eb1cd52",
   "checkout_benchmarks_internal": False,
 
   # Checkout Android dependencies only on Mac and Linux.
-  "download_android_deps": 'host_os == "mac" or host_os == "linux"',
+  "download_android_deps":
+    "(host_os == mac or host_os == linux) and host_cpu == x64",
 
   # Checkout extra javascript engines for testing or benchmarking.
   # d8, the V8 shell, is always checked out.
@@ -64,8 +65,8 @@
   # The list of revisions for these tools comes from Fuchsia, here:
   # https://fuchsia.googlesource.com/integration/+/HEAD/prebuilts
   # If there are problems with the toolchain, contact fuchsia-toolchain@.
-  "clang_revision": "f37e8b0b831e61d3b6033829fff05d6d193ab735",
-  "gn_revision": "693f9fb87e4febdd4299db9f73d8d2c958e63148",
+  "clang_revision": "e3a7f0e2f9ab566bd9b71fb54fe77e947b061a12",
+  "gn_revision": "b79031308cc878488202beb99883ec1f2efd9a6d",
 
   # Scripts that make 'git cl format' work.
   "clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda",
@@ -75,11 +76,11 @@
   # Revisions of /third_party/* dependencies.
   "args_rev": "3b3f55766af13d895d2020ec001a28e8dc147f91",
   "async_rev": "80886150a5e6c58006c8ae5a6c2aa7108638e2a9",
-  "bazel_worker_rev": "0885637b037979afbf5bcd05fd748b309fd669c0",
+  "bazel_worker_rev": "ceeba0982d4ff40d32371c9d35f3d2dc1868de20",
   "benchmark_harness_rev": "c546dbd9f639f75cd2f75de8df2eb9f8ea15e8e7",
   "boolean_selector_rev": "665e6921ab246569420376f827bff4585dff0b14",
-  "boringssl_gen_rev": "7322fc15cc065d8d2957fccce6b62a509dc4d641",
-  "boringssl_rev" : "1607f54fed72c6589d560254626909a64124f091",
+  "boringssl_gen_rev": "ced85ef0a00bbca77ce5a91261a5f2ae61b1e62f",
+  "boringssl_rev" : "87f316d7748268eb56f2dc147bd593254ae93198",
   "browser-compat-data_tag": "v1.0.22",
   "browser_launcher_rev": "c6cc1025d6901926cf022e144ba109677e3548f1",
   "characters_rev": "6ec389c4dfa8fce14820dc5cbf6e693202e7e052",
@@ -90,7 +91,7 @@
   "collection_rev": "a4c941ab94044d118b2086a3f261c30377604127",
   "convert_rev": "e063fdca4bebffecbb5e6aa5525995120982d9ce",
   "crypto_rev": "b5024e4de2b1c474dd558bef593ddbf0bfade152",
-  "csslib_rev": "6f35da3d93eb56eb25925779d235858d4090ce6f",
+  "csslib_rev": "158bfa94eed08c12c07a8ee0a3fded0ebdcd1fcb",
 
   # Note: Updates to dart_style have to be coordinated with the infrastructure
   # team so that the internal formatter `tools/sdks/dart-sdk/bin/dart format`
@@ -106,8 +107,8 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
   "dart_style_rev": "08b0294d0a500d5c02168ef57dcb8868d0c3cb48",
 
-  "dartdoc_rev" : "520e64977de7a87b2fd5be56e5c2e1a58d55bdad",
-  "devtools_rev" : "3a2f570813200e6dee141f3e7a9edcae5f31c2e8",
+  "dartdoc_rev" : "11c4b3c9723bfa7155efcf0fef02329233a6381d",
+  "devtools_rev" : "013958fbd45351e5975068756b7b9114465a7f98",
   "jsshell_tag": "version:88.0",
   "ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
@@ -122,24 +123,24 @@
   "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "7e00f893440a72de0637970325e4ea44bd1e8c8e",
-  "linter_tag": "1.14.0",
+  "linter_tag": "1.17.1",
   "lints_tag": "f9670df2a66e0ec12eb51554e70c1cbf56c8f5d0",
   "logging_rev": "575781ef196e4fed4fb737e38fb4b73d62727187",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
-  "markdown_rev": "9c4beaac96d8f008078e00b027915f81b665d2de",
+  "markdown_rev": "7479783f0493f6717e1d7ae31cb37d39a91026b2",
   "matcher_rev": "6ba4a6d68bdfacff3d572c9ea98333dfc66fd6bf",
   "mime_rev": "c931f4bed87221beaece356494b43731445ce7b8",
   "mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
   "oauth2_rev": "7cd3284049fe5badbec9f2bea2afc41d14c01057",
   "package_config_rev": "fb736aa12316dd2d882b202a438a6946a4b4bea0",
-  "path_rev": "c20d73c3516d3a0061c90f14b761ff532b9bf707",
+  "path_rev": "baedce9d2ca11ea2cdf54395a74eb038087777a4",
   "pedantic_rev": "66f2f6c27581c7936482e83be80b27be2719901c",
-  "platform_rev": "c20e6fa315e9f8820e51c0ae721f63aff33b8e17",
+  "platform_rev": "1ffad63428bbd1b3ecaa15926bacfb724023648c",
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
-  "pub_rev": "b9edfa5e288ea3d1a57d1db054ef844ae7b27d99",
+  "pub_rev": "dcb6abac2d7d43258c03b348be42bf4aab9529b1",
   "pub_semver_rev": "a43ad72fb6b7869607581b5fedcb186d1e74276a",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
@@ -153,8 +154,8 @@
   "source_maps_rev": "6499ee3adac8d469e2953e2e8ba4bdb4c2fbef90",
   "source_span_rev": "1be3c44045a06dff840d2ed3a13e6082d7a03a23",
   "sse_rev": "9084339389eb441d0c0518cddac211a097e78657",
-  "stack_trace_rev": "6788afc61875079b71b3d1c3e65aeaa6a25cbc2f",
-  "stream_channel_rev": "d7251e61253ec389ee6e045ee1042311bced8f1d",
+  "stack_trace_rev": "5220580872625ddee41e9ca9a5f3364789b2f0f6",
+  "stream_channel_rev": "3fa3e40c75c210d617b8b943b9b8f580e9866a89",
   "string_scanner_rev": "1b63e6e5db5933d7be0a45da6e1129fe00262734",
   "sync_http_rev": "b59c134f2e34d12acac110d4f17f83e5a7db4330",
   "test_descriptor_rev": "ead23c1e7df079ac0f6457a35f7a71432892e527",
@@ -277,7 +278,7 @@
   Var("dart_root") + "/third_party/gsutil": {
       "packages": [{
           "package": "infra/3pp/tools/gsutil",
-          "version": "version:4.58",
+          "version": "version:2@5.5",
       }],
       "dep_type": "cipd",
   },
@@ -655,6 +656,15 @@
       ],
           "dep_type": "cipd",
   },
+  Var("dart_root") + "/benchmarks/NativeCall/native/out/": {
+      "packages": [
+          {
+              "package": "dart/benchmarks/nativecall",
+              "version": "w1JKzCIHSfDNIjqnioMUPq0moCXKwX67aUfhyrvw4E0C",
+          },
+      ],
+          "dep_type": "cipd",
+  },
   Var("dart_root") + "/third_party/browsers/chrome": {
       "packages": [
           {
diff --git a/benchmarks/FfiAsTypedList/dart/FfiAsTypedList.dart b/benchmarks/FfiAsTypedList/dart/FfiAsTypedList.dart
new file mode 100644
index 0000000..f32f5d0
--- /dev/null
+++ b/benchmarks/FfiAsTypedList/dart/FfiAsTypedList.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Micro-benchmark for creating TypeData lists from Pointers.
+//
+// The FfiMemory benchmark tests accessing memory through TypedData.
+
+import 'dart:ffi';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+import 'package:ffi/ffi.dart';
+
+//
+// Benchmark fixture.
+//
+
+// Number of repeats: 1000
+const N = 1000;
+
+class FromPointerInt8 extends BenchmarkBase {
+  Pointer<Int8> pointer = nullptr;
+  FromPointerInt8() : super('FfiAsTypedList.FromPointerInt8');
+
+  @override
+  void setup() => pointer = calloc(1);
+  @override
+  void teardown() => calloc.free(pointer);
+
+  @override
+  void run() {
+    for (var i = 0; i < N; i++) {
+      pointer.asTypedList(1);
+    }
+  }
+}
+
+//
+// Main driver.
+//
+
+void main() {
+  final benchmarks = [
+    () => FromPointerInt8(),
+  ];
+  for (final benchmark in benchmarks) {
+    benchmark().report();
+  }
+}
diff --git a/benchmarks/FfiAsTypedList/dart2/FfiAsTypedList.dart b/benchmarks/FfiAsTypedList/dart2/FfiAsTypedList.dart
new file mode 100644
index 0000000..bab621d
--- /dev/null
+++ b/benchmarks/FfiAsTypedList/dart2/FfiAsTypedList.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Micro-benchmark for creating TypeData lists from Pointers.
+//
+// The FfiMemory benchmark tests accessing memory through TypedData.
+
+// @dart=2.9
+
+import 'dart:ffi';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+import 'package:ffi/ffi.dart';
+
+//
+// Benchmark fixture.
+//
+
+// Number of repeats: 1000
+const N = 1000;
+
+class FromPointerInt8 extends BenchmarkBase {
+  Pointer<Int8> pointer = nullptr;
+  FromPointerInt8() : super('FfiAsTypedList.FromPointerInt8');
+
+  @override
+  void setup() => pointer = calloc(1);
+  @override
+  void teardown() => calloc.free(pointer);
+
+  @override
+  void run() {
+    for (var i = 0; i < N; i++) {
+      pointer.asTypedList(1);
+    }
+  }
+}
+
+//
+// Main driver.
+//
+
+void main() {
+  final benchmarks = [
+    () => FromPointerInt8(),
+  ];
+  for (final benchmark in benchmarks) {
+    benchmark().report();
+  }
+}
diff --git a/benchmarks/FfiMemory/dart/FfiMemory.dart b/benchmarks/FfiMemory/dart/FfiMemory.dart
index 26ff8e7..686d6bd 100644
--- a/benchmarks/FfiMemory/dart/FfiMemory.dart
+++ b/benchmarks/FfiMemory/dart/FfiMemory.dart
@@ -15,6 +15,34 @@
 import 'package:ffi/ffi.dart';
 import 'package:benchmark_harness/benchmark_harness.dart';
 
+/// Represents a native unsigned pointer-sized integer in C.
+///
+/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint64(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint64(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+
 //
 // Pointer store.
 //
@@ -73,6 +101,12 @@
   }
 }
 
+void doStoreUintPtr(Pointer<UintPtr> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer[i] = 1;
+  }
+}
+
 void doStoreFloat(Pointer<Float> pointer, int length) {
   for (int i = 0; i < length; i++) {
     pointer[i] = 1.0;
@@ -174,6 +208,14 @@
   return x;
 }
 
+int doLoadUintPtr(Pointer<UintPtr> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer[i];
+  }
+  return x;
+}
+
 double doLoadFloat(Pointer<Float> pointer, int length) {
   double x = 0;
   for (int i = 0; i < length; i++) {
@@ -452,6 +494,25 @@
   }
 }
 
+class PointerUintPtr extends BenchmarkBase {
+  Pointer<UintPtr> pointer = nullptr;
+  PointerUintPtr() : super('FfiMemory.PointerUintPtr');
+
+  @override
+  void setup() => pointer = calloc(N);
+  @override
+  void teardown() => calloc.free(pointer);
+
+  @override
+  void run() {
+    doStoreUintPtr(pointer, N);
+    final int x = doLoadUintPtr(pointer, N);
+    if (x != N) {
+      throw Exception('$name: Unexpected result: $x');
+    }
+  }
+}
+
 class PointerFloat extends BenchmarkBase {
   Pointer<Float> pointer = nullptr;
   PointerFloat() : super('FfiMemory.PointerFloat');
@@ -555,6 +616,7 @@
     () => PointerInt64(),
     () => PointerInt64Mint(),
     () => PointerUint64(),
+    () => PointerUintPtr(),
     () => PointerFloat(),
     () => PointerDouble(),
     () => PointerPointer(),
diff --git a/benchmarks/FfiMemory/dart2/FfiMemory.dart b/benchmarks/FfiMemory/dart2/FfiMemory.dart
index 8ed6302..a170aaa 100644
--- a/benchmarks/FfiMemory/dart2/FfiMemory.dart
+++ b/benchmarks/FfiMemory/dart2/FfiMemory.dart
@@ -17,6 +17,34 @@
 import 'package:ffi/ffi.dart';
 import 'package:benchmark_harness/benchmark_harness.dart';
 
+/// Represents a native unsigned pointer-sized integer in C.
+///
+/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint64(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint64(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+
 //
 // Pointer store.
 //
@@ -75,6 +103,12 @@
   }
 }
 
+void doStoreUintPtr(Pointer<UintPtr> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer[i] = 1;
+  }
+}
+
 void doStoreFloat(Pointer<Float> pointer, int length) {
   for (int i = 0; i < length; i++) {
     pointer[i] = 1.0;
@@ -176,6 +210,14 @@
   return x;
 }
 
+int doLoadUintPtr(Pointer<UintPtr> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer[i];
+  }
+  return x;
+}
+
 double doLoadFloat(Pointer<Float> pointer, int length) {
   double x = 0;
   for (int i = 0; i < length; i++) {
@@ -391,7 +433,7 @@
 }
 
 class PointerUint32Unaligned extends BenchmarkBase {
-  Pointer<Float> pointer;
+  Pointer<Uint32> pointer;
   Pointer<Uint32> unalignedPointer;
   PointerUint32Unaligned() : super('FfiMemory.PointerUint32Unaligned');
 
@@ -452,6 +494,25 @@
   }
 }
 
+class PointerUintPtr extends BenchmarkBase {
+  Pointer<UintPtr> pointer;
+  PointerUintPtr() : super('FfiMemory.PointerUintPtr');
+
+  @override
+  void setup() => pointer = calloc(N);
+  @override
+  void teardown() => calloc.free(pointer);
+
+  @override
+  void run() {
+    doStoreUintPtr(pointer, N);
+    final int x = doLoadUintPtr(pointer, N);
+    if (x != N) {
+      throw Exception('$name: Unexpected result: $x');
+    }
+  }
+}
+
 class PointerFloat extends BenchmarkBase {
   Pointer<Float> pointer;
   PointerFloat() : super('FfiMemory.PointerFloat');
@@ -555,6 +616,7 @@
     () => PointerInt64(),
     () => PointerInt64Mint(),
     () => PointerUint64(),
+    () => PointerUintPtr(),
     () => PointerFloat(),
     () => PointerDouble(),
     () => PointerPointer(),
diff --git a/benchmarks/IsolateFibonacci/dart/IsolateFibonacci.dart b/benchmarks/IsolateFibonacci/dart/IsolateFibonacci.dart
index 84b7572..4af3028 100644
--- a/benchmarks/IsolateFibonacci/dart/IsolateFibonacci.dart
+++ b/benchmarks/IsolateFibonacci/dart/IsolateFibonacci.dart
@@ -34,8 +34,7 @@
   final rpRun = ReceivePort();
   final int nWarmup = 17; // enough runs to trigger optimized compilation
   final int nWarmupFactorial = 2584;
-  // With --enable-isolate-groups runs for about 8 seconds.
-  // Should not be run witout --enable-isolate-groups as it would be too slow.
+  // Runs for about 8 seconds.
   final int n = 21;
   final int nFactorial = 17711;
   final beforeRss = ProcessInfo.currentRss;
@@ -48,8 +47,7 @@
   final watch = Stopwatch();
   watch.start();
 
-  // For the benefit of enable-isolate-groups configuration, warm up target
-  // isolate code by running couple iterations in the main isolate.
+  // Warm up code by running a couple iterations in the main isolate.
   await Isolate.spawn(fibonacciRecursive, [rpWarmup.sendPort, nWarmup]);
   Expect.equals(nWarmupFactorial, await rpWarmup.first);
 
@@ -60,7 +58,7 @@
 
   final done = watch.elapsedMicroseconds;
 
-  print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done-warmup} us.');
-  print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss-beforeRss}');
+  print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done - warmup} us.');
+  print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss - beforeRss}');
   rssTimer.cancel();
 }
diff --git a/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart b/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart
index 84b7572..4af3028 100644
--- a/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart
+++ b/benchmarks/IsolateFibonacci/dart2/IsolateFibonacci.dart
@@ -34,8 +34,7 @@
   final rpRun = ReceivePort();
   final int nWarmup = 17; // enough runs to trigger optimized compilation
   final int nWarmupFactorial = 2584;
-  // With --enable-isolate-groups runs for about 8 seconds.
-  // Should not be run witout --enable-isolate-groups as it would be too slow.
+  // Runs for about 8 seconds.
   final int n = 21;
   final int nFactorial = 17711;
   final beforeRss = ProcessInfo.currentRss;
@@ -48,8 +47,7 @@
   final watch = Stopwatch();
   watch.start();
 
-  // For the benefit of enable-isolate-groups configuration, warm up target
-  // isolate code by running couple iterations in the main isolate.
+  // Warm up code by running a couple iterations in the main isolate.
   await Isolate.spawn(fibonacciRecursive, [rpWarmup.sendPort, nWarmup]);
   Expect.equals(nWarmupFactorial, await rpWarmup.first);
 
@@ -60,7 +58,7 @@
 
   final done = watch.elapsedMicroseconds;
 
-  print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done-warmup} us.');
-  print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss-beforeRss}');
+  print('IsolateFibonacci_$n.Calculation(RunTimeRaw): ${done - warmup} us.');
+  print('IsolateFibonacci_$n.DeltaPeak(MemoryUse): ${maxRss - beforeRss}');
   rssTimer.cancel();
 }
diff --git a/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart b/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart
index 1f7b009..0160c03 100644
--- a/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart
+++ b/benchmarks/IsolateSpawnMemory/dart/IsolateSpawnMemory.dart
@@ -158,16 +158,6 @@
 }
 
 // Returns the set of isolate groups for which we should count the heap usage.
-//
-// We have two cases
-//
-//   a) --enable-isolate-groups: All isolates will be within the same isolate
-//   group.
-//
-//   b) --no-enable-isolate-groups: All isolates will be within their own,
-//   separate isolate group.
-//
-// In both cases we want to sum up the heap sizes of all isolate groups.
 Future<List<String>> getGroupIds(vm_service.VmService vmService) async {
   final groupIds = <String>{};
   final vm = await vmService.getVM();
diff --git a/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart b/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
index 115e705..28fee38 100644
--- a/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
+++ b/benchmarks/IsolateSpawnMemory/dart2/IsolateSpawnMemory.dart
@@ -160,16 +160,6 @@
 }
 
 // Returns the set of isolate groups for which we should count the heap usage.
-//
-// We have two cases
-//
-//   a) --enable-isolate-groups: All isolates will be within the same isolate
-//   group.
-//
-//   b) --no-enable-isolate-groups: All isolates will be within their own,
-//   separate isolate group.
-//
-// In both cases we want to sum up the heap sizes of all isolate groups.
 Future<List<String>> getGroupIds(vm_service.VmService vmService) async {
   final groupIds = <String>{};
   final vm = await vmService.getVM();
diff --git a/benchmarks/NativeCall/dart/NativeCall.dart b/benchmarks/NativeCall/dart/NativeCall.dart
new file mode 100644
index 0000000..c453038
--- /dev/null
+++ b/benchmarks/NativeCall/dart/NativeCall.dart
@@ -0,0 +1,277 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// These micro benchmarks track the speed of native calls.
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+import 'dlopen_helper.dart';
+
+// Number of benchmark iterations per function.
+const N = 1000;
+
+// The native library that holds all the native functions being called.
+final nativeFunctionsLib = dlopenPlatformSpecific('native_functions',
+    path: Platform.script.resolve('../native/out/').path);
+
+final getRootLibraryUrl = nativeFunctionsLib
+    .lookupFunction<Handle Function(), Object Function()>('GetRootLibraryUrl');
+
+final setNativeResolverForTest = nativeFunctionsLib.lookupFunction<
+    Void Function(Handle), void Function(Object)>('SetNativeResolverForTest');
+
+//
+// Benchmark fixtures.
+//
+
+abstract class NativeCallBenchmarkBase extends BenchmarkBase {
+  NativeCallBenchmarkBase(String name) : super(name);
+
+  void expectEquals(actual, expected) {
+    if (actual != expected) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+
+  void expectApprox(actual, expected) {
+    if (0.999 * expected > actual || actual > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+
+  void expectIdentical(actual, expected) {
+    if (!identical(actual, expected)) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+}
+
+class Uint8x01 extends NativeCallBenchmarkBase {
+  Uint8x01() : super('NativeCall.Uint8x01');
+
+  @pragma('vm:external-name', 'Function1Uint8')
+  external static int f(int a);
+
+  @override
+  void run() {
+    int x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(17);
+    }
+    expectEquals(x, N * 17 + N * 42);
+  }
+}
+
+class Int64x20 extends NativeCallBenchmarkBase {
+  Int64x20() : super('NativeCall.Int64x20');
+
+  @pragma('vm:external-name', 'Function20Int64')
+  external static int f(
+      int a,
+      int b,
+      int c,
+      int d,
+      int e,
+      int f,
+      int g,
+      int h,
+      int i,
+      int j,
+      int k,
+      int l,
+      int m,
+      int n,
+      int o,
+      int p,
+      int q,
+      int r,
+      int s,
+      int t);
+
+  @override
+  void run() {
+    int x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+    }
+    expectEquals(x, N * (N - 1) * 20 / 2);
+  }
+}
+
+class Doublex01 extends NativeCallBenchmarkBase {
+  Doublex01() : super('NativeCall.Doublex01');
+
+  @pragma('vm:external-name', 'Function1Double')
+  external static double f(double a);
+
+  @override
+  void run() {
+    double x = 0.0;
+    for (int i = 0; i < N; i++) {
+      x += f(17.0);
+    }
+    final double expected = N * (17.0 + 42.0);
+    expectApprox(x, expected);
+  }
+}
+
+class Doublex20 extends NativeCallBenchmarkBase {
+  Doublex20() : super('NativeCall.Doublex20');
+
+  @pragma('vm:external-name', 'Function20Double')
+  external static double f(
+      double a,
+      double b,
+      double c,
+      double d,
+      double e,
+      double f,
+      double g,
+      double h,
+      double i,
+      double j,
+      double k,
+      double l,
+      double m,
+      double n,
+      double o,
+      double p,
+      double q,
+      double r,
+      double s,
+      double t);
+
+  @override
+  void run() {
+    double x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0,
+          13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0);
+    }
+    final double expected = N *
+        (1.0 +
+            2.0 +
+            3.0 +
+            4.0 +
+            5.0 +
+            6.0 +
+            7.0 +
+            8.0 +
+            9.0 +
+            10.0 +
+            11.0 +
+            12.0 +
+            13.0 +
+            14.0 +
+            15.0 +
+            16.0 +
+            17.0 +
+            18.0 +
+            19.0 +
+            20.0);
+    expectApprox(x, expected);
+  }
+}
+
+class MyClass {
+  int a;
+  MyClass(this.a);
+}
+
+class Handlex01 extends NativeCallBenchmarkBase {
+  Handlex01() : super('NativeCall.Handlex01');
+
+  @pragma('vm:external-name', 'Function1Handle')
+  external static Object f(Object a);
+
+  @override
+  void run() {
+    final p1 = MyClass(123);
+    Object x = p1;
+    for (int i = 0; i < N; i++) {
+      x = f(x);
+    }
+    expectIdentical(x, p1);
+  }
+}
+
+class Handlex20 extends NativeCallBenchmarkBase {
+  Handlex20() : super('NativeCall.Handlex20');
+
+  @pragma('vm:external-name', 'Function20Handle')
+  external static Object f(
+      Object a,
+      Object b,
+      Object c,
+      Object d,
+      Object e,
+      Object f,
+      Object g,
+      Object h,
+      Object i,
+      Object j,
+      Object k,
+      Object l,
+      Object m,
+      Object n,
+      Object o,
+      Object p,
+      Object q,
+      Object r,
+      Object s,
+      Object t);
+
+  @override
+  void run() {
+    final p1 = MyClass(123);
+    final p2 = MyClass(2);
+    final p3 = MyClass(3);
+    final p4 = MyClass(4);
+    final p5 = MyClass(5);
+    final p6 = MyClass(6);
+    final p7 = MyClass(7);
+    final p8 = MyClass(8);
+    final p9 = MyClass(9);
+    final p10 = MyClass(10);
+    final p11 = MyClass(11);
+    final p12 = MyClass(12);
+    final p13 = MyClass(13);
+    final p14 = MyClass(14);
+    final p15 = MyClass(15);
+    final p16 = MyClass(16);
+    final p17 = MyClass(17);
+    final p18 = MyClass(18);
+    final p19 = MyClass(19);
+    final p20 = MyClass(20);
+    Object x = p1;
+    for (int i = 0; i < N; i++) {
+      x = f(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15,
+          p16, p17, p18, p19, p20);
+    }
+    expectIdentical(x, p1);
+  }
+}
+
+//
+// Main driver.
+//
+
+void main() {
+  setNativeResolverForTest(getRootLibraryUrl());
+
+  final benchmarks = [
+    () => Uint8x01(),
+    () => Int64x20(),
+    () => Doublex01(),
+    () => Doublex20(),
+    () => Handlex01(),
+    () => Handlex20(),
+  ];
+  for (final benchmark in benchmarks) {
+    benchmark().report();
+  }
+}
diff --git a/benchmarks/NativeCall/dart/dlopen_helper.dart b/benchmarks/NativeCall/dart/dlopen_helper.dart
new file mode 100644
index 0000000..7e6129e
--- /dev/null
+++ b/benchmarks/NativeCall/dart/dlopen_helper.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+import 'dart:io';
+
+const arm = 'arm';
+const arm64 = 'arm64';
+const ia32 = 'ia32';
+const x64 = 'x64';
+
+// https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
+final _unames = {
+  'arm': arm,
+  'aarch64_be': arm64,
+  'aarch64': arm64,
+  'armv8b': arm64,
+  'armv8l': arm64,
+  'i386': ia32,
+  'i686': ia32,
+  'x86_64': x64,
+};
+
+String _checkRunningMode(String architecture) {
+  // Check if we're running in 32bit mode.
+  final int pointerSize = sizeOf<IntPtr>();
+  if (pointerSize == 4 && architecture == x64) return ia32;
+  if (pointerSize == 4 && architecture == arm64) return arm;
+
+  return architecture;
+}
+
+String _architecture() {
+  final String uname = Process.runSync('uname', ['-m']).stdout.trim();
+  final String? architecture = _unames[uname];
+  if (architecture == null) {
+    throw Exception('Unrecognized architecture: "$uname"');
+  }
+
+  // Check if we're running in 32bit mode.
+  return _checkRunningMode(architecture);
+}
+
+String _platformPath(String name, String path) {
+  if (Platform.isMacOS || Platform.isIOS) {
+    return '${path}mac/${_architecture()}/lib$name.dylib';
+  }
+
+  if (Platform.isWindows) {
+    return '${path}win/${_checkRunningMode(x64)}/$name.dll';
+  }
+
+  // Unknown platforms default to Unix implementation.
+  return '${path}linux/${_architecture()}/lib$name.so';
+}
+
+DynamicLibrary dlopenPlatformSpecific(String name, {String path = ''}) {
+  final String fullPath = _platformPath(name, path);
+  return DynamicLibrary.open(fullPath);
+}
diff --git a/benchmarks/NativeCall/dart2/NativeCall.dart b/benchmarks/NativeCall/dart2/NativeCall.dart
new file mode 100644
index 0000000..c2dbf13
--- /dev/null
+++ b/benchmarks/NativeCall/dart2/NativeCall.dart
@@ -0,0 +1,279 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// These micro benchmarks track the speed of native calls.
+
+// @dart=2.9
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+import 'dlopen_helper.dart';
+
+// Number of benchmark iterations per function.
+const N = 1000;
+
+// The native library that holds all the native functions being called.
+final nativeFunctionsLib = dlopenPlatformSpecific('native_functions',
+    path: Platform.script.resolve('../native/out/').path);
+
+final getRootLibraryUrl = nativeFunctionsLib
+    .lookupFunction<Handle Function(), Object Function()>('GetRootLibraryUrl');
+
+final setNativeResolverForTest = nativeFunctionsLib.lookupFunction<
+    Void Function(Handle), void Function(Object)>('SetNativeResolverForTest');
+
+//
+// Benchmark fixtures.
+//
+
+abstract class NativeCallBenchmarkBase extends BenchmarkBase {
+  NativeCallBenchmarkBase(String name) : super(name);
+
+  void expectEquals(actual, expected) {
+    if (actual != expected) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+
+  void expectApprox(actual, expected) {
+    if (0.999 * expected > actual || actual > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+
+  void expectIdentical(actual, expected) {
+    if (!identical(actual, expected)) {
+      throw Exception('$name: Unexpected result: $actual, expected $expected');
+    }
+  }
+}
+
+class Uint8x01 extends NativeCallBenchmarkBase {
+  Uint8x01() : super('NativeCall.Uint8x01');
+
+  @pragma('vm:external-name', 'Function1Uint8')
+  external static int f(int a);
+
+  @override
+  void run() {
+    int x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(17);
+    }
+    expectEquals(x, N * 17 + N * 42);
+  }
+}
+
+class Int64x20 extends NativeCallBenchmarkBase {
+  Int64x20() : super('NativeCall.Int64x20');
+
+  @pragma('vm:external-name', 'Function20Int64')
+  external static int f(
+      int a,
+      int b,
+      int c,
+      int d,
+      int e,
+      int f,
+      int g,
+      int h,
+      int i,
+      int j,
+      int k,
+      int l,
+      int m,
+      int n,
+      int o,
+      int p,
+      int q,
+      int r,
+      int s,
+      int t);
+
+  @override
+  void run() {
+    int x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+    }
+    expectEquals(x, N * (N - 1) * 20 / 2);
+  }
+}
+
+class Doublex01 extends NativeCallBenchmarkBase {
+  Doublex01() : super('NativeCall.Doublex01');
+
+  @pragma('vm:external-name', 'Function1Double')
+  external static double f(double a);
+
+  @override
+  void run() {
+    double x = 0.0;
+    for (int i = 0; i < N; i++) {
+      x += f(17.0);
+    }
+    final double expected = N * (17.0 + 42.0);
+    expectApprox(x, expected);
+  }
+}
+
+class Doublex20 extends NativeCallBenchmarkBase {
+  Doublex20() : super('NativeCall.Doublex20');
+
+  @pragma('vm:external-name', 'Function20Double')
+  external static double f(
+      double a,
+      double b,
+      double c,
+      double d,
+      double e,
+      double f,
+      double g,
+      double h,
+      double i,
+      double j,
+      double k,
+      double l,
+      double m,
+      double n,
+      double o,
+      double p,
+      double q,
+      double r,
+      double s,
+      double t);
+
+  @override
+  void run() {
+    double x = 0;
+    for (int i = 0; i < N; i++) {
+      x += f(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0,
+          13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0);
+    }
+    final double expected = N *
+        (1.0 +
+            2.0 +
+            3.0 +
+            4.0 +
+            5.0 +
+            6.0 +
+            7.0 +
+            8.0 +
+            9.0 +
+            10.0 +
+            11.0 +
+            12.0 +
+            13.0 +
+            14.0 +
+            15.0 +
+            16.0 +
+            17.0 +
+            18.0 +
+            19.0 +
+            20.0);
+    expectApprox(x, expected);
+  }
+}
+
+class MyClass {
+  int a;
+  MyClass(this.a);
+}
+
+class Handlex01 extends NativeCallBenchmarkBase {
+  Handlex01() : super('NativeCall.Handlex01');
+
+  @pragma('vm:external-name', 'Function1Handle')
+  external static Object f(Object a);
+
+  @override
+  void run() {
+    final p1 = MyClass(123);
+    Object x = p1;
+    for (int i = 0; i < N; i++) {
+      x = f(x);
+    }
+    expectIdentical(x, p1);
+  }
+}
+
+class Handlex20 extends NativeCallBenchmarkBase {
+  Handlex20() : super('NativeCall.Handlex20');
+
+  @pragma('vm:external-name', 'Function20Handle')
+  external static Object f(
+      Object a,
+      Object b,
+      Object c,
+      Object d,
+      Object e,
+      Object f,
+      Object g,
+      Object h,
+      Object i,
+      Object j,
+      Object k,
+      Object l,
+      Object m,
+      Object n,
+      Object o,
+      Object p,
+      Object q,
+      Object r,
+      Object s,
+      Object t);
+
+  @override
+  void run() {
+    final p1 = MyClass(123);
+    final p2 = MyClass(2);
+    final p3 = MyClass(3);
+    final p4 = MyClass(4);
+    final p5 = MyClass(5);
+    final p6 = MyClass(6);
+    final p7 = MyClass(7);
+    final p8 = MyClass(8);
+    final p9 = MyClass(9);
+    final p10 = MyClass(10);
+    final p11 = MyClass(11);
+    final p12 = MyClass(12);
+    final p13 = MyClass(13);
+    final p14 = MyClass(14);
+    final p15 = MyClass(15);
+    final p16 = MyClass(16);
+    final p17 = MyClass(17);
+    final p18 = MyClass(18);
+    final p19 = MyClass(19);
+    final p20 = MyClass(20);
+    Object x = p1;
+    for (int i = 0; i < N; i++) {
+      x = f(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15,
+          p16, p17, p18, p19, p20);
+    }
+    expectIdentical(x, p1);
+  }
+}
+
+//
+// Main driver.
+//
+
+void main() {
+  setNativeResolverForTest(getRootLibraryUrl());
+
+  final benchmarks = [
+    () => Uint8x01(),
+    () => Int64x20(),
+    () => Doublex01(),
+    () => Doublex20(),
+    () => Handlex01(),
+    () => Handlex20(),
+  ];
+  for (final benchmark in benchmarks) {
+    benchmark().report();
+  }
+}
diff --git a/benchmarks/NativeCall/dart2/dlopen_helper.dart b/benchmarks/NativeCall/dart2/dlopen_helper.dart
new file mode 100644
index 0000000..e6e3bfa
--- /dev/null
+++ b/benchmarks/NativeCall/dart2/dlopen_helper.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+import 'dart:ffi';
+import 'dart:io';
+
+const arm = 'arm';
+const arm64 = 'arm64';
+const ia32 = 'ia32';
+const x64 = 'x64';
+
+// https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
+final _unames = {
+  'arm': arm,
+  'aarch64_be': arm64,
+  'aarch64': arm64,
+  'armv8b': arm64,
+  'armv8l': arm64,
+  'i386': ia32,
+  'i686': ia32,
+  'x86_64': x64,
+};
+
+String _checkRunningMode(String architecture) {
+  // Check if we're running in 32bit mode.
+  final int pointerSize = sizeOf<IntPtr>();
+  if (pointerSize == 4 && architecture == x64) return ia32;
+  if (pointerSize == 4 && architecture == arm64) return arm;
+
+  return architecture;
+}
+
+String _architecture() {
+  final String uname = Process.runSync('uname', ['-m']).stdout.trim();
+  final String architecture = _unames[uname];
+  if (architecture == null) {
+    throw Exception('Unrecognized architecture: "$uname"');
+  }
+
+  // Check if we're running in 32bit mode.
+  return _checkRunningMode(architecture);
+}
+
+String _platformPath(String name, {String path = ''}) {
+  if (Platform.isMacOS || Platform.isIOS) {
+    return '${path}mac/${_architecture()}/lib$name.dylib';
+  }
+
+  if (Platform.isWindows) {
+    return '${path}win/${_checkRunningMode(x64)}/$name.dll';
+  }
+
+  // Unknown platforms default to Unix implementation.
+  return '${path}linux/${_architecture()}/lib$name.so';
+}
+
+DynamicLibrary dlopenPlatformSpecific(String name, {String path}) {
+  final String fullPath = _platformPath(name, path: path);
+  return DynamicLibrary.open(fullPath);
+}
diff --git a/benchmarks/NativeCall/native/.gitignore b/benchmarks/NativeCall/native/.gitignore
new file mode 100644
index 0000000..e778c6f
--- /dev/null
+++ b/benchmarks/NativeCall/native/.gitignore
@@ -0,0 +1,5 @@
+# Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+out/
diff --git a/benchmarks/NativeCall/native/Makefile b/benchmarks/NativeCall/native/Makefile
new file mode 100644
index 0000000..9a2eb44
--- /dev/null
+++ b/benchmarks/NativeCall/native/Makefile
@@ -0,0 +1,57 @@
+# Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# TODO(37531): Remove this makefile and build with sdk instead when
+# benchmark runner gets support for that.
+
+CC=gcc
+CCARM=arm-linux-gnueabihf-gcc
+CCARM64=aarch64-linux-gnu-gcc
+CFLAGS=-Wall -g -O -fPIC -I../../../runtime/
+
+.PHONY: all clean
+
+all: out/linux/x64/libnative_functions.so out/linux/ia32/libnative_functions.so out/linux/arm64/libnative_functions.so out/linux/arm/libnative_functions.so
+
+cipd:
+	cipd create -name dart/benchmarks/nativecall -in out -install-mode copy
+
+clean:
+	rm -rf *.o *.so out
+
+out/linux/x64:
+	mkdir -p out/linux/x64
+
+out/linux/x64/native_functions.o: native_functions.c | out/linux/x64
+	$(CC) $(CFLAGS) -c -o $@ native_functions.c
+
+out/linux/x64/libnative_functions.so: out/linux/x64/native_functions.o
+	$(CC) $(CFLAGS) -s -shared -o $@ out/linux/x64/native_functions.o
+
+out/linux/ia32:
+	mkdir -p out/linux/ia32
+
+out/linux/ia32/native_functions.o: native_functions.c | out/linux/ia32
+	$(CC) $(CFLAGS) -m32 -c -o $@ native_functions.c
+
+out/linux/ia32/libnative_functions.so: out/linux/ia32/native_functions.o
+	$(CC) $(CFLAGS) -m32 -s -shared -o $@ out/linux/ia32/native_functions.o
+
+out/linux/arm64:
+	mkdir -p out/linux/arm64
+
+out/linux/arm64/native_functions.o: native_functions.c | out/linux/arm64
+	$(CCARM64) $(CFLAGS) -c -o $@ native_functions.c
+
+out/linux/arm64/libnative_functions.so: out/linux/arm64/native_functions.o
+	$(CCARM64) $(CFLAGS) -s -shared -o $@ out/linux/arm64/native_functions.o
+
+out/linux/arm:
+	mkdir -p out/linux/arm
+
+out/linux/arm/native_functions.o: native_functions.c | out/linux/arm
+	$(CCARM) $(CFLAGS) -c -o $@ native_functions.c
+
+out/linux/arm/libnative_functions.so: out/linux/arm/native_functions.o
+	$(CCARM) $(CFLAGS) -s -shared -o $@ out/linux/arm/native_functions.o
diff --git a/benchmarks/NativeCall/native/native_functions.c b/benchmarks/NativeCall/native/native_functions.c
new file mode 100644
index 0000000..c19251d
--- /dev/null
+++ b/benchmarks/NativeCall/native/native_functions.c
@@ -0,0 +1,119 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+// TODO(dartbug.com/40579): This requires static linking to either link
+// dart.exe or dart_precompiled_runtime.exe on Windows.
+// The sample currently fails on Windows in AOT mode.
+#include "include/dart_api.h"
+
+#define ENSURE(X)                                                              \
+  if (!(X)) {                                                                  \
+    fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, "Check failed: " #X);   \
+    exit(1);                                                                   \
+  }
+
+#define ENSURE_VALID(X) ENSURE(!Dart_IsError(X))
+
+//
+// Functions under test.
+//
+
+void Function1Uint8(Dart_NativeArguments args) {
+  int64_t arg = 0;
+  Dart_GetNativeIntegerArgument(args, /*index=*/0, &arg);
+  Dart_SetIntegerReturnValue(args, arg + 42);
+}
+
+void Function20Int64(Dart_NativeArguments args) {
+  int64_t arg = 0;
+  int64_t result = 0;
+  for (int i = 0; i < 20; i++) {
+    Dart_GetNativeIntegerArgument(args, /*index=*/i, &arg);
+    result += arg;
+  }
+  Dart_SetIntegerReturnValue(args, result);
+}
+
+void Function1Double(Dart_NativeArguments args) {
+  double arg = 0.0;
+  Dart_GetNativeDoubleArgument(args, /*index=*/0, &arg);
+  Dart_SetDoubleReturnValue(args, arg + 42.0);
+}
+
+void Function20Double(Dart_NativeArguments args) {
+  double arg = 0;
+  double result = 0;
+  for (int i = 0; i < 20; i++) {
+    Dart_GetNativeDoubleArgument(args, /*index=*/i, &arg);
+    result += arg;
+  }
+  Dart_SetDoubleReturnValue(args, result);
+}
+
+void Function1Handle(Dart_NativeArguments args) {
+  Dart_Handle arg = Dart_GetNativeArgument(args, /*index=*/0);
+  Dart_SetReturnValue(args, arg);
+}
+
+void Function20Handle(Dart_NativeArguments args) {
+  Dart_Handle arg = Dart_GetNativeArgument(args, /*index=*/0);
+  Dart_SetReturnValue(args, arg);
+}
+
+//
+// Test helpers.
+//
+
+DART_EXPORT Dart_Handle GetRootLibraryUrl() {
+  Dart_Handle root_lib = Dart_RootLibrary();
+  Dart_Handle lib_url = Dart_LibraryUrl(root_lib);
+  ENSURE_VALID(lib_url);
+  return lib_url;
+}
+
+Dart_NativeFunction NativeEntryResolver(Dart_Handle name,
+                                        int num_of_arguments,
+                                        bool* auto_setup_scope) {
+  ENSURE(Dart_IsString(name));
+
+  ENSURE(auto_setup_scope != NULL);
+  *auto_setup_scope = true;
+
+  const char* name_str = NULL;
+  ENSURE_VALID(Dart_StringToCString(name, &name_str));
+
+  if (strcmp(name_str, "Function1Uint8") == 0 && num_of_arguments == 1) {
+    return &Function1Uint8;
+  } else if (strcmp(name_str, "Function20Int64") == 0 &&
+             num_of_arguments == 20) {
+    return &Function20Int64;
+  } else if (strcmp(name_str, "Function1Double") == 0 &&
+             num_of_arguments == 1) {
+    return &Function1Double;
+  } else if (strcmp(name_str, "Function20Double") == 0 &&
+             num_of_arguments == 20) {
+    return &Function20Double;
+  } else if (strcmp(name_str, "Function1Handle") == 0 &&
+             num_of_arguments == 1) {
+    return &Function1Handle;
+  } else if (strcmp(name_str, "Function20Handle") == 0 &&
+             num_of_arguments == 20) {
+    return &Function20Handle;
+  }
+
+  // Unreachable in benchmark.
+  ENSURE(false);
+}
+
+DART_EXPORT void SetNativeResolverForTest(Dart_Handle url) {
+  Dart_Handle library = Dart_LookupLibrary(url);
+  ENSURE_VALID(library);
+  Dart_Handle result =
+      Dart_SetNativeResolver(library, &NativeEntryResolver, NULL);
+  ENSURE_VALID(result);
+}
diff --git a/build/mac/find_sdk.py b/build/mac/find_sdk.py
index d2bf424..e28244a 100755
--- a/build/mac/find_sdk.py
+++ b/build/mac/find_sdk.py
@@ -96,19 +96,16 @@
     if job.returncode != 0:
         print(out, file=sys.stderr)
         print(err, file=sys.stderr)
-        raise Exception((
-            'Error %d running xcode-select, you might have to run '
-            '|sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer| '
-            'if you are using Xcode 4.') % job.returncode)
-    # The Developer folder moved in Xcode 4.3.
-    xcode43_sdk_path = os.path.join(out.rstrip(),
-                                    'Platforms/MacOSX.platform/Developer/SDKs')
-    if os.path.isdir(xcode43_sdk_path):
-        sdk_dir = xcode43_sdk_path
-    else:
-        sdk_dir = os.path.join(out.rstrip(), 'SDKs')
+        raise Exception('Error %d running xcode-select' % job.returncode)
+    sdk_dir = os.path.join(out.rstrip(),
+                           'Platforms/MacOSX.platform/Developer/SDKs')
+    if not os.path.isdir(sdk_dir):
+        raise Exception(
+            'Install Xcode, launch it, accept the license ' +
+            'agreement, and run `sudo xcode-select -s /path/to/Xcode.app` ' +
+            'to continue.')
     sdks = [
-        re.findall('^MacOSX(1[01]\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)
+        re.findall('^MacOSX(\d+\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)
     ]
     sdks = [s[0] for s in sdks if s]  # [['10.5'], ['10.6']] => ['10.5', '10.6']
     sdks = [
diff --git a/client/.gitignore b/client/.gitignore
deleted file mode 100644
index 067c596..0000000
--- a/client/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/Makefile
-/out
-/xcodebuild
-/dart.xcodeproj
-/tests
diff --git a/client/dart.js b/client/dart.js
deleted file mode 100644
index 43a6497..0000000
--- a/client/dart.js
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-var warning = [
-  'WARNING: This page is using a deprecated dart.js file. ',
-  'Please update this page as described here: ',
-  'http://news.dartlang.org/2013/01/big-breaking-change-dartjs-bootstrap-file-moving-to-pub.html'
-].join('');
-console.error(warning);
-
-// Bootstrap support for Dart scripts on the page as this script.
-if (navigator.userAgent.indexOf('(Dart)') === -1) {
-  // TODO:
-  // - Support in-browser compilation.
-  // - Handle inline Dart scripts.
-  window.addEventListener("DOMContentLoaded", function (e) {
-    // Fall back to compiled JS. Run through all the scripts and
-    // replace them if they have a type that indicate that they source
-    // in Dart code.
-    //
-    //   <script type="application/dart" src="..."></script>
-    //
-    var scripts = document.getElementsByTagName("script");
-    var length = scripts.length;
-    for (var i = 0; i < length; ++i) {
-      if (scripts[i].type == "application/dart") {
-        // Remap foo.dart to foo.dart.js.
-        if (scripts[i].src && scripts[i].src != '') {
-          var script = document.createElement('script');
-          script.src = scripts[i].src + '.js';
-          var parent = scripts[i].parentNode;
-          parent.replaceChild(script, scripts[i]);
-        }
-      }
-    }
-  }, false);
-}
-
-// ---------------------------------------------------------------------------
-// Experimental support for JS interoperability
-// ---------------------------------------------------------------------------
-function SendPortSync() {
-}
-
-function ReceivePortSync() {
-  this.id = ReceivePortSync.id++;
-  ReceivePortSync.map[this.id] = this;
-}
-
-(function() {
-  // Serialize the following types as follows:
-  //  - primitives / null: unchanged
-  //  - lists: [ 'list', internal id, list of recursively serialized elements ]
-  //  - maps: [ 'map', internal id, map of keys and recursively serialized values ]
-  //  - send ports: [ 'sendport', type, isolate id, port id ]
-  //
-  // Note, internal id's are for cycle detection.
-  function serialize(message) {
-    var visited = [];
-    function checkedSerialization(obj, serializer) {
-      // Implementation detail: for now use linear search.
-      // Another option is expando, but it may prohibit
-      // VM optimizations (like putting object into slow mode
-      // on property deletion.)
-      var id = visited.indexOf(obj);
-      if (id != -1) return [ 'ref', id ];
-      var id = visited.length;
-      visited.push(obj);
-      return serializer(id);
-    }
-
-    function doSerialize(message) {
-      if (message == null) {
-        return null;  // Convert undefined to null.
-      } else if (typeof(message) == 'string' ||
-                 typeof(message) == 'number' ||
-                 typeof(message) == 'boolean') {
-        return message;
-      } else if (message instanceof Array) {
-        return checkedSerialization(message, function(id) {
-          var values = new Array(message.length);
-          for (var i = 0; i < message.length; i++) {
-            values[i] = doSerialize(message[i]);
-          }
-          return [ 'list', id, values ];
-        });
-      } else if (message instanceof LocalSendPortSync) {
-        return [ 'sendport', 'nativejs', message.receivePort.id ];
-      } else if (message instanceof DartSendPortSync) {
-        return [ 'sendport', 'dart', message.isolateId, message.portId ];
-      } else {
-        return checkedSerialization(message, function(id) {
-          var keys = Object.getOwnPropertyNames(message);
-          var values = new Array(keys.length);
-          for (var i = 0; i < keys.length; i++) {
-            values[i] = doSerialize(message[keys[i]]);
-          }
-          return [ 'map', id, keys, values ];
-        });
-      }
-    }
-    return doSerialize(message);
-  }
-
-  function deserialize(message) {
-    return deserializeHelper(message);
-  }
-
-  function deserializeHelper(message) {
-    if (message == null ||
-        typeof(message) == 'string' ||
-        typeof(message) == 'number' ||
-        typeof(message) == 'boolean') {
-      return message;
-    }
-    switch (message[0]) {
-      case 'map': return deserializeMap(message);
-      case 'sendport': return deserializeSendPort(message);
-      case 'list': return deserializeList(message);
-      default: throw 'unimplemented';
-    }
-  }
-
-  function deserializeMap(message) {
-    var result = { };
-    var id = message[1];
-    var keys = message[2];
-    var values = message[3];
-    for (var i = 0, length = keys.length; i < length; i++) {
-      var key = deserializeHelper(keys[i]);
-      var value = deserializeHelper(values[i]);
-      result[key] = value;
-    }
-    return result;
-  }
-
-  function deserializeSendPort(message) {
-    var tag = message[1];
-    switch (tag) {
-      case 'nativejs':
-        var id = message[2];
-        return new LocalSendPortSync(ReceivePortSync.map[id]);
-      case 'dart':
-        var isolateId = message[2];
-        var portId = message[3];
-        return new DartSendPortSync(isolateId, portId);
-      default:
-        throw 'Illegal SendPortSync type: $tag';
-    }
-  }
-
-  function deserializeList(message) {
-    var values = message[2];
-    var length = values.length;
-    var result = new Array(length);
-    for (var i = 0; i < length; i++) {
-      result[i] = deserializeHelper(values[i]);
-    }
-    return result;
-  }
-
-  window.registerPort = function(name, port) {
-    var stringified = JSON.stringify(serialize(port));
-    var attrName = 'dart-port:' + name;
-    document.documentElement.setAttribute(attrName, stringified);
-    // TODO(vsm): Phase out usage of localStorage and delete the
-    // below.  We're leaving it in temporarily for backwards
-    // compatibility.
-    try {
-      window.localStorage[attrName] = stringified;
-    } catch (e) {
-      // Swallow errors (e.g., Chrome apps disallow this access).
-    }
-  };
-
-  window.lookupPort = function(name) {
-    var attrName = 'dart-port:' + name;
-    var stringified = document.documentElement.getAttribute(attrName);
-    // TODO(vsm): Phase out usage of localStorage.  We're leaving it in
-    // temporarily for backwards compatibility.
-    if (!stringified) {
-      stringified = window.localStorage[attrName];
-    }
-    return deserialize(JSON.parse(stringified));
-  };
-
-  ReceivePortSync.id = 0;
-  ReceivePortSync.map = {};
-
-  ReceivePortSync.dispatchCall = function(id, message) {
-    // TODO(vsm): Handle and propagate exceptions.
-    var deserialized = deserialize(message);
-    var result = ReceivePortSync.map[id].callback(deserialized);
-    return serialize(result);
-  };
-
-  ReceivePortSync.prototype.receive = function(callback) {
-    this.callback = callback;
-  };
-
-  ReceivePortSync.prototype.toSendPort = function() {
-    return new LocalSendPortSync(this);
-  };
-
-  ReceivePortSync.prototype.close = function() {
-    delete ReceivePortSync.map[this.id];
-  };
-
-  if (navigator.userAgent.indexOf('(Dart)') !== -1) {
-    window.addEventListener('js-sync-message', function(event) {
-      var data = JSON.parse(getPortSyncEventData(event));
-      var deserialized = deserialize(data.message);
-      var result = ReceivePortSync.map[data.id].callback(deserialized);
-      // TODO(vsm): Handle and propagate exceptions.
-      dispatchEvent('js-result', serialize(result));
-    }, false);
-  }
-
-  function LocalSendPortSync(receivePort) {
-    this.receivePort = receivePort;
-  }
-
-  LocalSendPortSync.prototype = new SendPortSync();
-
-  LocalSendPortSync.prototype.callSync = function(message) {
-    // TODO(vsm): Do a direct deepcopy.
-    message = deserialize(serialize(message));
-    return this.receivePort.callback(message);
-  }
-
-  function DartSendPortSync(isolateId, portId) {
-    this.isolateId = isolateId;
-    this.portId = portId;
-  }
-
-  DartSendPortSync.prototype = new SendPortSync();
-
-  function dispatchEvent(receiver, message) {
-    var string = JSON.stringify(message);
-    var event = document.createEvent('CustomEvent');
-    event.initCustomEvent(receiver, false, false, string);
-    window.dispatchEvent(event);
-  }
-
-  function getPortSyncEventData(event) {
-    return event.detail;
-  }
-
-  DartSendPortSync.prototype.callSync = function(message) {
-    var serialized = serialize(message);
-    var target = 'dart-port-' + this.isolateId + '-' + this.portId;
-    // TODO(vsm): Make this re-entrant.
-    // TODO(vsm): Set this up set once, on the first call.
-    var source = target + '-result';
-    var result = null;
-    var listener = function (e) {
-      result = JSON.parse(getPortSyncEventData(e));
-    };
-    window.addEventListener(source, listener, false);
-    dispatchEvent(target, [source, serialized]);
-    window.removeEventListener(source, listener, false);
-    return deserialize(result);
-  }
-})();
diff --git a/client/idea/.idea/.name b/client/idea/.idea/.name
deleted file mode 100644
index ad82b85..0000000
--- a/client/idea/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-sdk
\ No newline at end of file
diff --git a/client/idea/.idea/inspectionProfiles/Project_Default.xml b/client/idea/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index 9b0c20c..0000000
--- a/client/idea/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<component name="InspectionProjectProfileManager">
-  <profile version="1.0">
-    <option name="myName" value="Project Default" />
-    <inspection_tool class="DartOutdatedDependencies" enabled="false" level="WARNING" enabled_by_default="false" />
-    <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
-      <option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
-      <option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
-    </inspection_tool>
-  </profile>
-</component>
\ No newline at end of file
diff --git a/client/idea/.idea/vcs.xml b/client/idea/.idea/vcs.xml
deleted file mode 100644
index b2bdec2..0000000
--- a/client/idea/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/client/idea/readme.md b/client/idea/readme.md
deleted file mode 100644
index f463828..0000000
--- a/client/idea/readme.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Working on the SDK repo using IntelliJ
-
-To work on Dart code in the SDK repo, we recommend either IntelliJ Community
-Edition or IntelliJ Ultimate.
-
-## Opening from IntelliJ
-
-To open the sdk repo using IntelliJ, choose `File` > `Open...` and select the
-`<sdk>/client/idea` directory.
-
-## Opening from the command-line
-
-To open from the command-line, type:
-
-```
-idea <sdk>/client/idea
-```
-
-This depends on having previously set up the IntelliJ command-line launcher. To
-do this, from the `Tools` menu, select `Create Command-line Launcher...`.
diff --git a/docs/process/breaking-changes.md b/docs/process/breaking-changes.md
index 64a0df4..4ea8bda 100644
--- a/docs/process/breaking-changes.md
+++ b/docs/process/breaking-changes.md
@@ -53,7 +53,8 @@
 
 ### Step 1: Announcement
 
-* Create an issue in the Dart SDK issue tracker labelled
+* Create an issue in the
+  [Dart SDK issue tracker](https://github.com/dart-lang/sdk/issues) labelled
   `breaking-change-request` containing the following:
 
   * The intended change in behavior.
@@ -64,8 +65,6 @@
 
   * Clear steps for mitigating the change.
 
-[TODO: Link to an issue template for this]
-
 * Email Dart Announce (`announce@dartlang.org`):
 
   * Subject: 'Breaking change [bug ID]: [short summary]'
@@ -77,7 +76,7 @@
   * A request that developers may leave comments in the linked issue, if this
     breaking change poses a severe problem.
 
-Once you have sent the announce email, please let @devoncarew know in order
+Once you have sent the announce email, please let devoncarew@ know in order
 to start the review and approval process.
 
 ### Step 2: Approval
@@ -119,7 +118,7 @@
   * The impact of the change was significantly larger than described in the
     breaking change announcement
 
-, then they may file a 'request for roll-back' using the following steps:
+Then they may file a 'request for roll-back' using the following steps:
 
 * Create an issue in the Dart SDK issue tracker labelled
   `roll-back-request` containing the following:
@@ -132,8 +131,6 @@
   * A link to the program that was affected, or another program that illustrated
     the same effect.
 
-[TODO: Link to an issue template for this]
-
 Upon receiving such an issue the Dart SDK team will either:
 
   * Roll-back the change, or
diff --git a/pkg/_fe_analyzer_shared/lib/src/base/errors.dart b/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
index eb92d87..bcaa62b 100644
--- a/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/base/errors.dart
@@ -50,17 +50,14 @@
     this.hasPublishedDocs = false,
     this.isUnresolvedIdentifier: false,
     required this.name,
-    @Deprecated('Please use problemMessage') String? message,
-    String? problemMessage,
+    required String problemMessage,
     required this.uniqueName,
   })  : _correctionMessage = correctionMessage,
-        _problemMessage = problemMessage ?? message ?? 'NO MESSAGE',
+        _problemMessage = problemMessage,
         // ignore: unnecessary_null_comparison
         assert(hasPublishedDocs != null),
         // ignore: unnecessary_null_comparison
-        assert(isUnresolvedIdentifier != null),
-        assert((message == null) != (problemMessage == null),
-            'Either problemMessage or message must be provided (not both)');
+        assert(isUnresolvedIdentifier != null);
 
   /**
    * The template used to create the correction to be displayed for this error,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api.dart
new file mode 100644
index 0000000..5d5c262
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+part 'api/builders.dart';
+part 'api/code.dart';
+part 'api/introspection.dart';
+part 'api/macros.dart';
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
new file mode 100644
index 0000000..74bf73c
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of '../api.dart';
+
+/// The base interface used to add declarations to the program as well
+/// as augment existing ones.
+abstract class Builder {}
+
+/// The api used by [Macro]s to contribute new type declarations to the
+/// current library, and get [TypeAnnotation]s from runtime [Type] objects.
+abstract class TypeBuilder implements Builder {
+  /// Adds a new type declaration to the surrounding library.
+  void declareType(DeclarationCode typeDeclaration);
+}
+
+/// The interface to resolve a [TypeAnnotation] to a [StaticType].
+///
+/// The [StaticType]s can be compared against other [StaticType]s to see how
+/// they relate to each other.
+///
+/// This api is only available to the declaration and definition phases of
+/// macro expansion.
+abstract class TypeResolver {
+  /// Resolves [typeAnnotation] to a [StaticType].
+  ///
+  /// Throws an error if the type annotation cannot be resolved. This should
+  /// only happen in the case of incomplete or invalid programs, but macros
+  /// may be asked to run in this state during the development cycle. It is
+  /// helpful for users if macros provide a best effort implementation in that
+  /// case or handle the error in a useful way.
+  Future<StaticType> resolve(TypeAnnotation typeAnnotation);
+}
+
+/// The api used to introspect on a [ClassDeclaration].
+///
+/// Available in the declaration and definition phases, but limited in the
+/// declaration phase to immediately annotated [ClassDeclaration]s. This is
+/// done by limiting the access to the [TypeDeclarationResolver] to the
+/// definition phase.
+abstract class ClassIntrospector {
+  /// The fields available for [clazz].
+  ///
+  /// This may be incomplete if in the declaration phase and additional macros
+  /// are going to run on this class.
+  Future<List<FieldDeclaration>> fieldsOf(ClassDeclaration clazz);
+
+  /// The methods available so far for the current class.
+  ///
+  /// This may be incomplete if additional declaration macros are running on
+  /// this class.
+  Future<List<MethodDeclaration>> methodsOf(ClassDeclaration clazz);
+
+  /// The constructors available so far for the current class.
+  ///
+  /// This may be incomplete if additional declaration macros are running on
+  /// this class.
+  Future<List<ConstructorDeclaration>> constructorsOf(ClassDeclaration clazz);
+
+  /// The class that is directly extended via an `extends` clause.
+  Future<ClassDeclaration?> superclassOf(ClassDeclaration clazz);
+
+  /// All of the classes that are mixed in with `with` clauses.
+  Future<List<ClassDeclaration>> mixinsOf(ClassDeclaration clazz);
+
+  /// All of the classes that are implemented with an `implements` clause.
+  Future<List<ClassDeclaration>> interfacesOf(ClassDeclaration clazz);
+}
+
+/// The api used by [Macro]s to contribute new (non-type)
+/// declarations to the current library.
+///
+/// Can also be used to do subtype checks on types.
+abstract class DeclarationBuilder
+    implements Builder, TypeResolver, ClassIntrospector {
+  /// Adds a new regular declaration to the surrounding library.
+  ///
+  /// Note that type declarations are not supported.
+  void declareInLibrary(DeclarationCode declaration);
+}
+
+/// The api used by [Macro]s to contribute new members to a class.
+abstract class ClassMemberDeclarationBuilder implements DeclarationBuilder {
+  /// Adds a new declaration to the surrounding class.
+  void declareInClass(DeclarationCode declaration);
+}
+
+/// The api used by [Macro]s to reflect on the currently available
+/// members, superclass, and mixins for a given [ClassDeclaration]
+abstract class ClassDeclarationBuilder
+    implements ClassMemberDeclarationBuilder, ClassIntrospector {}
+
+/// The interface used by [Macro]s to resolve any [NamedStaticType] to its
+/// declaration.
+///
+/// Only available in the definition phase of macro expansion.
+abstract class TypeDeclarationResolver {
+  /// Resolves a [NamedStaticType] to its [TypeDeclaration].
+  Future<TypeDeclaration> declarationOf(NamedStaticType annotation);
+}
+
+/// The base class for builders in the definition phase. These can convert
+/// any [TypeAnnotation] into its corresponding [TypeDeclaration], and also
+/// reflect more deeply on those.
+abstract class DefinitionBuilder
+    implements
+        Builder,
+        TypeResolver,
+        ClassIntrospector,
+        TypeDeclarationResolver {}
+
+/// The apis used by [Macro]s that run on classes, to fill in the definitions
+/// of any external declarations within that class.
+abstract class ClassDefinitionBuilder implements DefinitionBuilder {
+  /// Retrieve a [VariableDefinitionBuilder] for a field by [name].
+  ///
+  /// Throws an [ArgumentError] if there is no field by that name.
+  VariableDefinitionBuilder buildField(String name);
+
+  /// Retrieve a [FunctionDefinitionBuilder] for a method by [name].
+  ///
+  /// Throws an [ArgumentError] if there is no method by that name.
+  FunctionDefinitionBuilder buildMethod(String name);
+
+  /// Retrieve a [ConstructorDefinitionBuilder] for a constructor by [name].
+  ///
+  /// Throws an [ArgumentError] if there is no constructor by that name.
+  ConstructorDefinitionBuilder buildConstructor(String name);
+}
+
+/// The apis used by [Macro]s to define the body of a constructor
+/// or wrap the body of an existing constructor with additional statements.
+abstract class ConstructorDefinitionBuilder implements DefinitionBuilder {
+  /// Augments an existing constructor body with [body].
+  ///
+  /// TODO: Link the library augmentations proposal to describe the semantics.
+  void augment({FunctionBodyCode? body, List<Code>? initializers});
+}
+
+/// The apis used by [Macro]s to augment functions or methods.
+abstract class FunctionDefinitionBuilder implements DefinitionBuilder {
+  /// Augments the function.
+  ///
+  /// TODO: Link the library augmentations proposal to describe the semantics.
+  void augment(FunctionBodyCode body);
+}
+
+/// The api used by [Macro]s to augment a top level variable or instance field.
+abstract class VariableDefinitionBuilder implements DefinitionBuilder {
+  /// Augments the field.
+  ///
+  /// TODO: Link the library augmentations proposal to describe the semantics.
+  void augment({
+    DeclarationCode? getter,
+    DeclarationCode? setter,
+    ExpressionCode? initializer,
+  });
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/code.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/code.dart
new file mode 100644
index 0000000..89f169f
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/code.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of '../api.dart';
+
+/// The base class representing an arbitrary chunk of Dart code, which may or
+/// may not be syntactically or semantically valid yet.
+class Code {
+  /// All the chunks of [Code] or raw [String]s that comprise this [Code]
+  /// object.
+  final List<Object> parts;
+
+  Code.fromString(String code) : parts = [code];
+
+  Code.fromParts(this.parts);
+}
+
+/// A piece of code representing a syntactically valid declaration.
+class DeclarationCode extends Code {
+  DeclarationCode.fromString(String code) : super.fromString(code);
+
+  DeclarationCode.fromParts(List<Object> parts) : super.fromParts(parts);
+}
+
+/// A piece of code representing a syntactically valid element.
+///
+/// Should not include any trailing commas,
+class ElementCode extends Code {
+  ElementCode.fromString(String code) : super.fromString(code);
+
+  ElementCode.fromParts(List<Object> parts) : super.fromParts(parts);
+}
+
+/// A piece of code representing a syntactically valid expression.
+class ExpressionCode extends Code {
+  ExpressionCode.fromString(String code) : super.fromString(code);
+
+  ExpressionCode.fromParts(List<Object> parts) : super.fromParts(parts);
+}
+
+/// A piece of code representing a syntactically valid function body.
+///
+/// This includes any and all code after the parameter list of a function,
+/// including modifiers like `async`.
+///
+/// Both arrow and block function bodies are allowed.
+class FunctionBodyCode extends Code {
+  FunctionBodyCode.fromString(String code) : super.fromString(code);
+
+  FunctionBodyCode.fromParts(List<Object> parts) : super.fromParts(parts);
+}
+
+/// A piece of code representing a syntactically valid identifier.
+class IdentifierCode extends Code {
+  IdentifierCode.fromString(String code) : super.fromString(code);
+
+  IdentifierCode.fromParts(List<Object> parts) : super.fromParts(parts);
+}
+
+/// A piece of code identifying a named argument.
+///
+/// This should not include any trailing commas.
+class NamedArgumentCode extends Code {
+  NamedArgumentCode.fromString(String code) : super.fromString(code);
+
+  NamedArgumentCode.fromParts(List<Object> parts) : super.fromParts(parts);
+}
+
+/// A piece of code identifying a syntactically valid function parameter.
+///
+/// This should not include any trailing commas, but may include modifiers
+/// such as `required`, and default values.
+///
+/// There is no distinction here made between named and positional parameters,
+/// nor between optional or required parameters. It is the job of the user to
+/// construct and combine these together in a way that creates valid parameter
+/// lists.
+class ParameterCode extends Code {
+  ParameterCode.fromString(String code) : super.fromString(code);
+
+  ParameterCode.fromParts(List<Object> parts) : super.fromParts(parts);
+}
+
+/// A piece of code representing a syntactically valid statement.
+///
+/// Should always end with a semicolon.
+class StatementCode extends Code {
+  StatementCode.fromString(String code) : super.fromString(code);
+
+  StatementCode.fromParts(List<Object> parts) : super.fromParts(parts);
+}
+
+extension Join<T extends Code> on List<T> {
+  /// Joins all the items in [this] with [separator], and returns
+  /// a new list.
+  List<Code> joinAsCode(String separator) => [
+        for (int i = 0; i < length - 1; i++) ...[
+          this[i],
+          new Code.fromString(separator),
+        ],
+        last,
+      ];
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
new file mode 100644
index 0000000..e892296
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
@@ -0,0 +1,192 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of '../api.dart';
+
+/// The base class for an unresolved reference to a type.
+///
+/// See the subtypes [FunctionTypeAnnotation] and [NamedTypeAnnotation].
+abstract class TypeAnnotation {
+  /// Whether or not the type annotation is explicitly nullable (contains a
+  /// trailing `?`)
+  bool get isNullable;
+
+  /// A [Code] object representation of this type annotation.
+  Code get code;
+}
+
+/// The base class for function type declarations.
+abstract class FunctionTypeAnnotation implements TypeAnnotation {
+  /// The return type of this function.
+  TypeAnnotation get returnType;
+
+  /// The positional parameters for this function.
+  Iterable<ParameterDeclaration> get positionalParameters;
+
+  /// The named parameters for this function.
+  Iterable<ParameterDeclaration> get namedParameters;
+
+  /// The type parameters for this function.
+  Iterable<TypeParameterDeclaration> get typeParameters;
+}
+
+/// An unresolved reference to a type.
+///
+/// These can be resolved to a [TypeDeclaration] using the `builder` classes
+/// depending on the phase a macro is running in.
+abstract class NamedTypeAnnotation implements TypeAnnotation {
+  /// The name of the type as it exists in the type annotation.
+  String get name;
+
+  /// The type arguments, if applicable.
+  Iterable<TypeAnnotation> get typeArguments;
+}
+
+/// The interface representing a resolved type.
+///
+/// Resolved types understand exactly what type they represent, and can be
+/// compared to other static types.
+abstract class StaticType {
+  /// Returns true if this is a subtype of [other].
+  Future<bool> isSubtypeOf(StaticType other);
+
+  /// Returns true if this is an identical type to [other].
+  Future<bool> isExactly(StaticType other);
+}
+
+/// A subtype of [StaticType] representing types that can be resolved by name
+/// to a concrete declaration.
+abstract class NamedStaticType implements StaticType {
+  String get name;
+}
+
+/// The base class for all declarations.
+abstract class Declaration {
+  /// The name of this declaration.
+  String get name;
+}
+
+/// A declaration that defines a new type in the program.
+abstract class TypeDeclaration implements Declaration {
+  /// The type parameters defined for this type declaration.
+  Iterable<TypeParameterDeclaration> get typeParameters;
+
+  /// Create a static type representing this type with [typeArguments].
+  ///
+  /// If [isNullable] is `true`, then this type will behave as if it has a
+  /// trailing `?`.
+  ///
+  /// Throws an exception if the type could not be instantiated, typically due
+  /// to one of the type arguments not matching the bounds of the corresponding
+  /// type parameter.
+  Future<StaticType> instantiate(
+      {required List<StaticType> typeArguments, required bool isNullable});
+}
+
+/// Class (and enum) introspection information.
+///
+/// Information about fields, methods, and constructors must be retrieved from
+/// the `builder` objects.
+abstract class ClassDeclaration implements TypeDeclaration {
+  /// Whether this class has an `abstract` modifier.
+  bool get isAbstract;
+
+  /// Whether this class has an `external` modifier.
+  bool get isExternal;
+
+  /// The `extends` type annotation, if present.
+  TypeAnnotation? get superclass;
+
+  /// All the `implements` type annotations.
+  Iterable<TypeAnnotation> get interfaces;
+
+  /// All the `with` type annotations.
+  Iterable<TypeAnnotation> get mixins;
+
+  /// All the type arguments, if applicable.
+  Iterable<TypeParameterDeclaration> get typeParameters;
+}
+
+/// Function introspection information.
+abstract class FunctionDeclaration implements Declaration {
+  /// Whether this function has an `abstract` modifier.
+  bool get isAbstract;
+
+  /// Whether this function has an `external` modifier.
+  bool get isExternal;
+
+  /// Whether this function is actually a getter.
+  bool get isGetter;
+
+  /// Whether this function is actually a setter.
+  bool get isSetter;
+
+  /// The return type of this function.
+  TypeAnnotation get returnType;
+
+  /// The positional parameters for this function.
+  Iterable<ParameterDeclaration> get positionalParameters;
+
+  /// The named parameters for this function.
+  Iterable<ParameterDeclaration> get namedParameters;
+
+  /// The type parameters for this function.
+  Iterable<TypeParameterDeclaration> get typeParameters;
+}
+
+/// Method introspection information.
+abstract class MethodDeclaration implements FunctionDeclaration {
+  /// The class that defines this method.
+  TypeAnnotation get definingClass;
+}
+
+/// Constructor introspection information.
+abstract class ConstructorDeclaration implements MethodDeclaration {
+  /// Whether or not this is a factory constructor.
+  bool get isFactory;
+}
+
+/// Variable introspection information.
+abstract class VariableDeclaration implements Declaration {
+  /// Whether this function has an `abstract` modifier.
+  bool get isAbstract;
+
+  /// Whether this function has an `external` modifier.
+  bool get isExternal;
+
+  /// The type of this field.
+  TypeAnnotation get type;
+
+  /// A [Code] object representing the initializer for this field, if present.
+  Code? get initializer;
+}
+
+/// Field introspection information ..
+abstract class FieldDeclaration implements VariableDeclaration {
+  /// The class that defines this method.
+  TypeAnnotation get definingClass;
+}
+
+/// Parameter introspection information.
+abstract class ParameterDeclaration implements Declaration {
+  /// The type of this parameter.
+  TypeAnnotation get type;
+
+  /// Whether or not this is a named parameter.
+  bool get isNamed;
+
+  /// Whether or not this parameter is either a non-optional positional
+  /// parameter or an optional parameter with the `required` keyword.
+  bool get isRequired;
+
+  /// A [Code] object representing the default value for this parameter, if
+  /// present. Can be used to copy default values to other parameters.
+  Code? get defaultValue;
+}
+
+/// Type parameter introspection information.
+abstract class TypeParameterDeclaration implements Declaration {
+  /// The bounds for this type parameter, if it has any.
+  TypeAnnotation? get bounds;
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/macros.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/macros.dart
new file mode 100644
index 0000000..7685589a
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/macros.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of '../api.dart';
+
+/// The marker interface for all types of macros.
+abstract class Macro {}
+
+/// The interface for [Macro]s that can be applied to any top level function,
+/// instance method, or static method, and wants to contribute new type
+/// declarations to the program.
+abstract class FunctionTypesMacro implements Macro {
+  FutureOr<void> buildTypesForFunction(
+      FunctionDeclaration function, TypeBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any top level function,
+/// instance method, or static method, and wants to contribute new non-type
+/// declarations to the program.
+abstract class FunctionDeclarationsMacro implements Macro {
+  FutureOr<void> buildDeclarationsForFunction(
+      FunctionDeclaration function, DeclarationBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any top level function,
+/// instance method, or static method, and wants to augment the function
+/// definition.
+abstract class FunctionDefinitionMacro implements Macro {
+  FutureOr<void> buildDefinitionForFunction(
+      FunctionDeclaration function, FunctionDefinitionBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any top level variable or
+/// instance field, and wants to contribute new type declarations to the
+/// program.
+abstract class VariableTypesMacro implements Macro {
+  FutureOr<void> buildTypesForVariable(
+      VariableDeclaration variable, TypeBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any top level variable or
+/// instance field and wants to contribute new non-type declarations to the
+/// program.
+abstract class VariableDeclarationsMacro implements Macro {
+  FutureOr<void> buildDeclarationsForVariable(
+      VariableDeclaration variable, DeclarationBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any top level variable
+/// or instance field, and wants to augment the variable definition.
+abstract class VariableDefinitionMacro implements Macro {
+  FutureOr<void> buildDefinitionForFunction(
+      VariableDeclaration variable, VariableDefinitionBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any class, and wants to
+/// contribute new type declarations to the program.
+abstract class ClassTypesMacro implements Macro {
+  FutureOr<void> buildTypesForClass(
+      ClassDeclaration clazz, TypeBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any class, and wants to
+/// contribute new non-type declarations to the program.
+abstract class ClassDeclarationsMacro implements Macro {
+  FutureOr<void> buildDeclarationsForClass(
+      ClassDeclaration clazz, ClassDeclarationBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any class, and wants to
+/// augment the definitions of members on the class.
+abstract class ClassDefinitionMacro implements Macro {
+  FutureOr<void> buildDefinitionForClass(
+      ClassDeclaration clazz, ClassDefinitionBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any field, and wants to
+/// contribute new type declarations to the program.
+abstract class FieldTypesMacro implements Macro {
+  FutureOr<void> buildTypesForField(
+      FieldDeclaration field, TypeBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any field, and wants to
+/// contribute new type declarations to the program.
+abstract class FieldDeclarationsMacro implements Macro {
+  FutureOr<void> buildTypesForField(
+      FieldDeclaration field, ClassMemberDeclarationBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any field, and wants to
+/// augment the field definition.
+abstract class FieldDefinitionsMacro implements Macro {
+  FutureOr<void> buildDefinitionForField(
+      FieldDeclaration field, VariableDefinitionBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any method, and wants to
+/// contribute new type declarations to the program.
+abstract class MethodTypesMacro implements Macro {
+  FutureOr<void> buildTypesForMethod(
+      MethodDeclaration method, TypeBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any method, and wants to
+/// contribute new non-type declarations to the program.
+abstract class MethodDeclarationDeclarationsMacro implements Macro {
+  FutureOr<void> buildDeclarationsForMethod(
+      MethodDeclaration method, ClassMemberDeclarationBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any method, and wants to
+/// augment the function definition.
+abstract class MethodDefinitionMacro implements Macro {
+  FutureOr<void> buildDefinitionForMethod(
+      MethodDeclaration method, FunctionDefinitionBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any constructor, and wants
+/// to contribute new type declarations to the program.
+abstract class ConstructorTypesMacro implements Macro {
+  FutureOr<void> buildTypesForConstructor(
+      ConstructorDeclaration method, TypeBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any constructors, and
+/// wants to contribute new non-type declarations to the program.
+abstract class ConstructorDeclarationDeclarationsMacro implements Macro {
+  FutureOr<void> buildDeclarationsForConstructor(
+      ConstructorDeclaration method, ClassMemberDeclarationBuilder builder);
+}
+
+/// The interface for [Macro]s that can be applied to any constructor, and wants
+/// to augment the function definition.
+abstract class ConstructorDefinitionMacro implements Macro {
+  FutureOr<void> buildDefinitionForConstructor(
+      ConstructorDeclaration method, ConstructorDefinitionBuilder builder);
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
new file mode 100644
index 0000000..0d4e878
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'api.dart';
+
+/// The interface used by Dart language implementations, in order to load
+/// and execute macros, as well as produce library augmentations from those
+/// macro applications.
+///
+/// This class more clearly defines the role of a Dart language implementation
+/// during macro discovery and expansion, and unifies how augmentation libraries
+/// are produced.
+abstract class MacroExecutor {
+  /// Invoked when an implementation discovers a new macro definition in a
+  /// [library] with [name], and prepares this executor to run the macro.
+  ///
+  /// May be invoked more than once for the same macro, which will cause the
+  /// macro to be re-loaded. Previous [MacroClassIdentifier]s and
+  /// [MacroInstanceIdentifier]s given for this macro will be invalid after
+  /// that point and should be discarded.
+  ///
+  /// Throws an exception if the macro fails to load.
+  Future<MacroClassIdentifier> loadMacro(Uri library, String name);
+
+  /// Creates an instance of [macroClass] in the executor, and returns an
+  /// identifier for that instance.
+  ///
+  /// Throws an exception if an instance is not created.
+  Future<MacroInstanceIdentifier> instantiateMacro(
+      MacroClassIdentifier macroClass, String constructor, Arguments arguments);
+
+  /// Runs the type phase for [macro] on a given [declaration].
+  ///
+  /// Throws an exception if there is an error executing the macro.
+  Future<MacroExecutionResult> executeTypesPhase(
+      MacroInstanceIdentifier macro, Declaration declaration);
+
+  /// Runs the declarations phase for [macro] on a given [declaration].
+  ///
+  /// Throws an exception if there is an error executing the macro.
+  Future<MacroExecutionResult> executeDeclarationsPhase(
+      MacroInstanceIdentifier macro,
+      Declaration declaration,
+      TypeResolver typeResolver,
+      ClassIntrospector classIntrospector);
+
+  /// Runs the definitions phase for [macro] on a given [declaration].
+  ///
+  /// Throws an exception if there is an error executing the macro.
+  Future<MacroExecutionResult> executeDefinitionsPhase(
+      MacroInstanceIdentifier macro,
+      Declaration declaration,
+      TypeResolver typeResolver,
+      ClassIntrospector classIntrospector,
+      TypeDeclarationResolver typeDeclarationResolver);
+
+  /// Combines multiple [MacroExecutionResult]s into a single library
+  /// augmentation file, and returns a [String] representing that file.
+  Future<String> buildAugmentationLibrary(
+      Iterable<MacroExecutionResult> macroResults);
+
+  /// Tell the executor to shut down and clean up any resources it may have
+  /// allocated.
+  void close();
+}
+
+/// The arguments passed to a macro constructor.
+///
+/// All argument instances must be of type [Code] or a built-in value type that
+/// is serializable (num, bool, String, null, etc).
+class Arguments {
+  final List<Object?> positional;
+
+  final Map<String, Object?> named;
+
+  Arguments(this.positional, this.named);
+}
+
+/// An opaque identifier for a macro class, retrieved by
+/// [MacroExecutor.loadMacro].
+///
+/// Used to execute or reload this macro in the future.
+abstract class MacroClassIdentifier {}
+
+/// An opaque identifier for an instance of a macro class, retrieved by
+/// [MacroExecutor.instantiateMacro].
+///
+/// Used to execute or reload this macro in the future.
+abstract class MacroInstanceIdentifier {}
+
+/// A summary of the results of running a macro in a given phase.
+///
+/// All modifications are expressed in terms of library augmentation
+/// declarations.
+abstract class MacroExecutionResult {
+  /// Any library imports that should be added to support the code used in
+  /// the augmentations.
+  Iterable<DeclarationCode> get imports;
+
+  /// Any augmentations that should be applied as a result of executing a macro.
+  Iterable<DeclarationCode> get augmentations;
+}
+
+/// Each of the different macro execution phases.
+enum Phase {
+  /// Only new types are added in this phase.
+  types,
+
+  /// New non-type declarations are added in this phase.
+  declarations,
+
+  /// This phase allows augmenting existing declarations.
+  definitions,
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart
new file mode 100644
index 0000000..d6476af
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:mirrors';
+
+import 'isolate_mirrors_impl.dart';
+import 'protocol.dart';
+import '../executor.dart';
+import '../api.dart';
+
+/// A [MacroExecutor] implementation which relies on [IsolateMirror.loadUri]
+/// in order to load macros libraries.
+///
+/// All actual work happens in a separate [Isolate], and this class serves as
+/// a bridge between that isolate and the language frontends.
+class IsolateMirrorMacroExecutor implements MacroExecutor {
+  /// The actual isolate doing macro loading and execution.
+  final Isolate _macroIsolate;
+
+  /// The channel used to send requests to the [_macroIsolate].
+  final SendPort _sendPort;
+
+  /// The stream of responses from the [_macroIsolate].
+  final Stream<GenericResponse> _responseStream;
+
+  /// A map of response completers by request id.
+  final _responseCompleters = <int, Completer<GenericResponse>>{};
+
+  /// A function that should be invoked when shutting down this executor
+  /// to perform any necessary cleanup.
+  final void Function() _onClose;
+
+  IsolateMirrorMacroExecutor._(
+      this._macroIsolate, this._sendPort, this._responseStream, this._onClose) {
+    _responseStream.listen((event) {
+      Completer<GenericResponse>? completer =
+          _responseCompleters.remove(event.requestId);
+      if (completer == null) {
+        throw new StateError(
+            'Got a response for an unrecognized request id ${event.requestId}');
+      }
+      completer.complete(event);
+    });
+  }
+
+  /// Initialize an [IsolateMirrorMacroExecutor] and return it once ready.
+  ///
+  /// Spawns the macro isolate and sets up a communication channel.
+  static Future<MacroExecutor> start() async {
+    ReceivePort receivePort = new ReceivePort();
+    Completer<SendPort> sendPortCompleter = new Completer<SendPort>();
+    StreamController<GenericResponse> responseStreamController =
+        new StreamController<GenericResponse>(sync: true);
+    receivePort.listen((message) {
+      if (!sendPortCompleter.isCompleted) {
+        sendPortCompleter.complete(message as SendPort);
+      } else {
+        responseStreamController.add(message as GenericResponse);
+      }
+    }).onDone(responseStreamController.close);
+    Isolate macroIsolate = await Isolate.spawn(spawn, receivePort.sendPort);
+
+    return new IsolateMirrorMacroExecutor._(
+        macroIsolate,
+        await sendPortCompleter.future,
+        responseStreamController.stream,
+        receivePort.close);
+  }
+
+  @override
+  Future<String> buildAugmentationLibrary(
+      Iterable<MacroExecutionResult> macroResults) {
+    // TODO: implement buildAugmentationLibrary
+    throw new UnimplementedError();
+  }
+
+  @override
+  void close() {
+    _onClose();
+    _macroIsolate.kill();
+  }
+
+  @override
+  Future<MacroExecutionResult> executeDeclarationsPhase(
+      MacroInstanceIdentifier macro,
+      Declaration declaration,
+      TypeResolver typeResolver,
+      ClassIntrospector classIntrospector) {
+    // TODO: implement executeDeclarationsPhase
+    throw new UnimplementedError();
+  }
+
+  @override
+  Future<MacroExecutionResult> executeDefinitionsPhase(
+          MacroInstanceIdentifier macro,
+          Declaration declaration,
+          TypeResolver typeResolver,
+          ClassIntrospector classIntrospector,
+          TypeDeclarationResolver typeDeclarationResolver) =>
+      _sendRequest(new ExecuteDefinitionsPhaseRequest(macro, declaration,
+          typeResolver, classIntrospector, typeDeclarationResolver));
+
+  @override
+  Future<MacroExecutionResult> executeTypesPhase(
+      MacroInstanceIdentifier macro, Declaration declaration) {
+    // TODO: implement executeTypesPhase
+    throw new UnimplementedError();
+  }
+
+  @override
+  Future<MacroInstanceIdentifier> instantiateMacro(
+          MacroClassIdentifier macroClass,
+          String constructor,
+          Arguments arguments) =>
+      _sendRequest(
+          new InstantiateMacroRequest(macroClass, constructor, arguments));
+
+  @override
+  Future<MacroClassIdentifier> loadMacro(Uri library, String name) =>
+      _sendRequest(new LoadMacroRequest(library, name));
+
+  /// Sends a request and returns the response, casting it to the expected
+  /// type.
+  Future<T> _sendRequest<T>(Request request) async {
+    _sendPort.send(request);
+    Completer<GenericResponse<T>> completer =
+        new Completer<GenericResponse<T>>();
+    _responseCompleters[request.id] = completer;
+    GenericResponse<T> response = await completer.future;
+    T? result = response.response;
+    if (result != null) return result;
+    throw response.error!;
+  }
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_impl.dart b/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_impl.dart
new file mode 100644
index 0000000..3cf24a5
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/isolate_mirrors_impl.dart
@@ -0,0 +1,255 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:mirrors';
+
+import 'protocol.dart';
+import '../executor.dart';
+import '../api.dart';
+
+/// Spawns a new isolate for loading and executing macros.
+void spawn(SendPort sendPort) {
+  ReceivePort receivePort = new ReceivePort();
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen((message) async {
+    if (message is LoadMacroRequest) {
+      GenericResponse<MacroClassIdentifier> response =
+          await _loadMacro(message);
+      sendPort.send(response);
+    } else if (message is InstantiateMacroRequest) {
+      GenericResponse<MacroInstanceIdentifier> response =
+          await _instantiateMacro(message);
+      sendPort.send(response);
+    } else if (message is ExecuteDefinitionsPhaseRequest) {
+      GenericResponse<MacroExecutionResult> response =
+          await _executeDefinitionsPhase(message);
+      sendPort.send(response);
+    } else {
+      throw new StateError('Unrecognized event type $message');
+    }
+  });
+}
+
+/// Maps macro identifiers to class mirrors.
+final _macroClasses = <_MacroClassIdentifier, ClassMirror>{};
+
+/// Handles [LoadMacroRequest]s.
+Future<GenericResponse<MacroClassIdentifier>> _loadMacro(
+    LoadMacroRequest request) async {
+  try {
+    _MacroClassIdentifier identifier =
+        new _MacroClassIdentifier(request.library, request.name);
+    if (_macroClasses.containsKey(identifier)) {
+      throw new UnsupportedError(
+          'Reloading macros is not supported by this implementation');
+    }
+    LibraryMirror libMirror =
+        await currentMirrorSystem().isolate.loadUri(request.library);
+    ClassMirror macroClass =
+        libMirror.declarations[new Symbol(request.name)] as ClassMirror;
+    _macroClasses[identifier] = macroClass;
+    return new GenericResponse(response: identifier, requestId: request.id);
+  } catch (e) {
+    return new GenericResponse(error: e, requestId: request.id);
+  }
+}
+
+/// Maps macro instance identifiers to instances.
+final _macroInstances = <_MacroInstanceIdentifier, Macro>{};
+
+/// Handles [InstantiateMacroRequest]s.
+Future<GenericResponse<MacroInstanceIdentifier>> _instantiateMacro(
+    InstantiateMacroRequest request) async {
+  try {
+    ClassMirror? clazz = _macroClasses[request.macroClass];
+    if (clazz == null) {
+      throw new ArgumentError('Unrecognized macro class ${request.macroClass}');
+    }
+    Macro instance = clazz.newInstance(
+        new Symbol(request.constructorName), request.arguments.positional, {
+      for (MapEntry<String, Object?> entry in request.arguments.named.entries)
+        new Symbol(entry.key): entry.value,
+    }).reflectee as Macro;
+    _MacroInstanceIdentifier identifier = new _MacroInstanceIdentifier();
+    _macroInstances[identifier] = instance;
+    return new GenericResponse<MacroInstanceIdentifier>(
+        response: identifier, requestId: request.id);
+  } catch (e) {
+    return new GenericResponse(error: e, requestId: request.id);
+  }
+}
+
+Future<GenericResponse<MacroExecutionResult>> _executeDefinitionsPhase(
+    ExecuteDefinitionsPhaseRequest request) async {
+  try {
+    Macro? instance = _macroInstances[request.macro];
+    if (instance == null) {
+      throw new StateError('Unrecognized macro instance ${request.macro}\n'
+          'Known instances: $_macroInstances)');
+    }
+    Declaration declaration = request.declaration;
+    if (instance is FunctionDefinitionMacro &&
+        declaration is FunctionDeclaration) {
+      _FunctionDefinitionBuilder builder = new _FunctionDefinitionBuilder(
+          declaration,
+          request.typeResolver,
+          request.typeDeclarationResolver,
+          request.classIntrospector);
+      await instance.buildDefinitionForFunction(declaration, builder);
+      return new GenericResponse(
+          response: builder.result, requestId: request.id);
+    } else {
+      throw new UnsupportedError(
+          ('Only FunctionDefinitionMacros are supported currently'));
+    }
+  } catch (e) {
+    return new GenericResponse(error: e, requestId: request.id);
+  }
+}
+
+/// Our implementation of [MacroClassIdentifier].
+class _MacroClassIdentifier implements MacroClassIdentifier {
+  final String id;
+
+  _MacroClassIdentifier(Uri library, String name) : id = '$library#$name';
+
+  operator ==(other) => other is _MacroClassIdentifier && id == other.id;
+
+  int get hashCode => id.hashCode;
+}
+
+/// Our implementation of [MacroInstanceIdentifier].
+class _MacroInstanceIdentifier implements MacroInstanceIdentifier {
+  static int _next = 0;
+
+  final int id;
+
+  _MacroInstanceIdentifier() : id = _next++;
+
+  operator ==(other) => other is _MacroInstanceIdentifier && id == other.id;
+
+  int get hashCode => id;
+}
+
+/// Our implementation of [MacroExecutionResult].
+class _MacroExecutionResult implements MacroExecutionResult {
+  @override
+  final List<DeclarationCode> augmentations = <DeclarationCode>[];
+
+  @override
+  final List<DeclarationCode> imports = <DeclarationCode>[];
+}
+
+/// Custom implementation of [FunctionDefinitionBuilder].
+class _FunctionDefinitionBuilder implements FunctionDefinitionBuilder {
+  final TypeResolver typeResolver;
+  final TypeDeclarationResolver typeDeclarationResolver;
+  final ClassIntrospector classIntrospector;
+
+  /// The declaration this is a builder for.
+  final FunctionDeclaration declaration;
+
+  /// The final result, will be built up over `augment` calls.
+  final _MacroExecutionResult result = new _MacroExecutionResult();
+
+  _FunctionDefinitionBuilder(this.declaration, this.typeResolver,
+      this.typeDeclarationResolver, this.classIntrospector);
+
+  @override
+  void augment(FunctionBodyCode body) {
+    result.augmentations.add(new DeclarationCode.fromParts([
+      'augment ',
+      declaration.returnType.code,
+      ' ',
+      declaration.name,
+      if (declaration.typeParameters.isNotEmpty) ...[
+        '<',
+        for (TypeParameterDeclaration typeParam
+            in declaration.typeParameters) ...[
+          typeParam.name,
+          if (typeParam.bounds != null) ...['extends ', typeParam.bounds!.code],
+          if (typeParam != declaration.typeParameters.last) ', ',
+        ],
+        '>',
+      ],
+      '(',
+      for (ParameterDeclaration positionalRequired
+          in declaration.positionalParameters.where((p) => p.isRequired)) ...[
+        new ParameterCode.fromParts([
+          positionalRequired.type.code,
+          ' ',
+          positionalRequired.name,
+        ]),
+        ', '
+      ],
+      if (declaration.positionalParameters.any((p) => !p.isRequired)) ...[
+        '[',
+        for (ParameterDeclaration positionalOptional in declaration
+            .positionalParameters
+            .where((p) => !p.isRequired)) ...[
+          new ParameterCode.fromParts([
+            positionalOptional.type.code,
+            ' ',
+            positionalOptional.name,
+          ]),
+          ', ',
+        ],
+        ']',
+      ],
+      if (declaration.namedParameters.isNotEmpty) ...[
+        '{',
+        for (ParameterDeclaration named in declaration.namedParameters) ...[
+          new ParameterCode.fromParts([
+            if (named.isRequired) 'required ',
+            named.type.code,
+            ' ',
+            named.name,
+            if (named.defaultValue != null) ...[
+              ' = ',
+              named.defaultValue!,
+            ],
+          ]),
+          ', ',
+        ],
+        '}',
+      ],
+      ') ',
+      body,
+    ]));
+  }
+
+  @override
+  Future<List<ConstructorDeclaration>> constructorsOf(ClassDeclaration clazz) =>
+      classIntrospector.constructorsOf(clazz);
+
+  @override
+  Future<List<FieldDeclaration>> fieldsOf(ClassDeclaration clazz) =>
+      classIntrospector.fieldsOf(clazz);
+
+  @override
+  Future<List<ClassDeclaration>> interfacesOf(ClassDeclaration clazz) =>
+      classIntrospector.interfacesOf(clazz);
+
+  @override
+  Future<List<MethodDeclaration>> methodsOf(ClassDeclaration clazz) =>
+      classIntrospector.methodsOf(clazz);
+
+  @override
+  Future<List<ClassDeclaration>> mixinsOf(ClassDeclaration clazz) =>
+      classIntrospector.mixinsOf(clazz);
+
+  @override
+  Future<TypeDeclaration> declarationOf(NamedStaticType annotation) =>
+      typeDeclarationResolver.declarationOf(annotation);
+
+  @override
+  Future<ClassDeclaration?> superclassOf(ClassDeclaration clazz) =>
+      classIntrospector.superclassOf(clazz);
+
+  @override
+  Future<StaticType> resolve(TypeAnnotation typeAnnotation) =>
+      typeResolver.resolve(typeAnnotation);
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/protocol.dart b/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/protocol.dart
new file mode 100644
index 0000000..96a2724
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/isolate_mirrors_executor/protocol.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Defines the objects used for communication between the macro executor and
+/// the isolate doing the work of macro loading and execution.
+library protocol;
+
+import '../executor.dart';
+import '../api.dart';
+
+/// Base class all requests extend, provides a unique id for each request.
+class Request {
+  final int id;
+
+  Request() : id = _next++;
+
+  static int _next = 0;
+}
+
+/// A generic response object that is either an instance of [T] or an error.
+class GenericResponse<T> {
+  final T? response;
+  final Object? error;
+  final int requestId;
+
+  GenericResponse({this.response, this.error, required this.requestId})
+      : assert(response != null || error != null),
+        assert(response == null || error == null);
+}
+
+/// A request to load a macro in this isolate.
+class LoadMacroRequest extends Request {
+  final Uri library;
+  final String name;
+
+  LoadMacroRequest(this.library, this.name);
+}
+
+/// A request to instantiate a macro instance.
+class InstantiateMacroRequest extends Request {
+  final MacroClassIdentifier macroClass;
+  final String constructorName;
+  final Arguments arguments;
+
+  InstantiateMacroRequest(
+      this.macroClass, this.constructorName, this.arguments);
+}
+
+/// A request to execute a macro on a particular declaration in the definition
+/// phase.
+class ExecuteDefinitionsPhaseRequest extends Request {
+  final MacroInstanceIdentifier macro;
+  final Declaration declaration;
+  final TypeResolver typeResolver;
+  final ClassIntrospector classIntrospector;
+  final TypeDeclarationResolver typeDeclarationResolver;
+
+  ExecuteDefinitionsPhaseRequest(this.macro, this.declaration,
+      this.typeResolver, this.classIntrospector, this.typeDeclarationResolver);
+}
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 5e5e650..14682ea 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2768,6 +2768,16 @@
     problemMessage: r"""An enum declaration can't be empty.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumDeclaresFactory = messageEnumDeclaresFactory;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumDeclaresFactory = const MessageCode(
+    "EnumDeclaresFactory",
+    problemMessage: r"""Enums can't declare factory constructors.""",
+    correctionMessage:
+        r"""Try removing the factory constructor declaration.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumInClass = messageEnumInClass;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3826,6 +3836,26 @@
   -h        Display this message (add -v for information about all options).""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeFfiAbiSpecificIntegerInvalid =
+    messageFfiAbiSpecificIntegerInvalid;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageFfiAbiSpecificIntegerInvalid = const MessageCode(
+    "FfiAbiSpecificIntegerInvalid",
+    problemMessage:
+        r"""Classes extending 'AbiSpecificInteger' must have exactly one const constructor, no other members, and no type arguments.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeFfiAbiSpecificIntegerMappingInvalid =
+    messageFfiAbiSpecificIntegerMappingInvalid;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageFfiAbiSpecificIntegerMappingInvalid = const MessageCode(
+    "FfiAbiSpecificIntegerMappingInvalid",
+    problemMessage:
+        r"""Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a NativeType integer with a fixed size.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String string,
@@ -5661,6 +5691,17 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInternalProblemOmittedTypeNameInConstructorReference =
+    messageInternalProblemOmittedTypeNameInConstructorReference;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInternalProblemOmittedTypeNameInConstructorReference =
+    const MessageCode("InternalProblemOmittedTypeNameInConstructorReference",
+        severity: Severity.internalProblem,
+        problemMessage:
+            r"""Unsupported omission of the type name in a constructor reference outside of an enum element declaration.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInternalProblemPreviousTokenNotFound =
     messageInternalProblemPreviousTokenNotFound;
 
@@ -8789,6 +8830,16 @@
     correctionMessage: r"""Try replacing ':' with '='.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codePositionalSuperParametersAndArguments =
+    messagePositionalSuperParametersAndArguments;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messagePositionalSuperParametersAndArguments = const MessageCode(
+    "PositionalSuperParametersAndArguments",
+    problemMessage:
+        r"""Positional super-initializer parameters cannot be used when the super initializer has positional arguments.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePrefixAfterCombinator = messagePrefixAfterCombinator;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9387,10 +9438,20 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperInitializerNotLast = const MessageCode(
     "SuperInitializerNotLast",
-    analyzerCodes: <String>["INVALID_SUPER_INVOCATION"],
+    analyzerCodes: <String>["SUPER_INVOCATION_NOT_LAST"],
     problemMessage: r"""Can't have initializers after 'super'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSuperInitializerParameter =
+    messageSuperInitializerParameter;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSuperInitializerParameter = const MessageCode(
+    "SuperInitializerParameter",
+    severity: Severity.context,
+    problemMessage: r"""This is the super-initializer parameter.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSuperNullAware = messageSuperNullAware;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart b/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
index 7037020..1efc9da 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/declaration_kind.dart
@@ -14,4 +14,7 @@
 
   /// An extension declaration.
   Extension,
+
+  /// An enum.
+  Enum,
 }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
index 042507d..9741d8c 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart
@@ -61,8 +61,9 @@
   }
 
   @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
-    listener?.beginClassDeclaration(begin, abstractToken, name);
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
+    listener?.beginClassDeclaration(begin, abstractToken, macroToken, name);
   }
 
   @override
@@ -339,8 +340,9 @@
 
   @override
   void beginNamedMixinApplication(
-      Token begin, Token? abstractToken, Token name) {
-    listener?.beginNamedMixinApplication(begin, abstractToken, name);
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
+    listener?.beginNamedMixinApplication(
+        begin, abstractToken, macroToken, name);
   }
 
   @override
@@ -636,8 +638,66 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    listener?.endEnum(enumKeyword, leftBrace, count);
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    listener?.endEnum(enumKeyword, leftBrace, memberCount);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    listener?.endEnumConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    listener?.handleEnumElement(beginToken);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    listener?.handleEnumElements(elementsEndToken, elementsCount);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    listener?.handleEnumHeader(enumKeyword, leftBrace);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    listener?.endEnumFactoryMethod(beginToken, factoryKeyword, endToken);
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    listener?.endClassFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    listener?.endEnumMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -728,14 +788,22 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
-    listener?.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
-        initializerStart, initializerEnd, kind, memberKind);
+    listener?.endFormalParameter(
+        thisKeyword,
+        superKeyword,
+        periodAfterThisOrSuper,
+        nameToken,
+        initializerStart,
+        initializerEnd,
+        kind,
+        memberKind);
   }
 
   @override
@@ -1165,9 +1233,13 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+  void handleEnumNoWithClause() {
+    listener?.handleEnumNoWithClause();
+  }
+
+  @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    listener?.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
@@ -1183,9 +1255,20 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    listener?.handleEnumWithClause(withKeyword);
+  }
+
+  @override
   void handleCommentReference(
-      Token? newKeyword, Token? prefix, Token? period, Token token) {
-    listener?.handleCommentReference(newKeyword, prefix, period, token);
+      Token? newKeyword,
+      Token? firstToken,
+      Token? firstPeriod,
+      Token? secondToken,
+      Token? secondPeriod,
+      Token thirdToken) {
+    listener?.handleCommentReference(newKeyword, firstToken, firstPeriod,
+        secondToken, secondPeriod, thirdToken);
   }
 
   @override
@@ -1540,6 +1623,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    listener?.handleNoTypeNameInConstructorReference(token);
+  }
+
+  @override
   void handleNoTypeVariables(Token token) {
     listener?.handleNoTypeVariables(token);
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
index 63a247f..2f5e2a4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/listener.dart
@@ -126,7 +126,8 @@
   /// (or extraneous modifiers in the case of recovery) preceding [name].
   ///
   /// At this point we have parsed the name and type parameter declarations.
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {}
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {}
 
   /// Handle an extends clause in a class declaration. Substructures:
   /// - supertype (may be a mixin application)
@@ -137,12 +138,11 @@
     logEvent("ClassExtends");
   }
 
-  /// Handle an implements clause in a class or mixin declaration.
+  /// Handle an implements clause in a class, mixin or enum declaration.
   /// Substructures:
   /// - implemented types
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    logEvent("ClassImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    logEvent("Implements");
   }
 
   /// Handle a show clause in an extension declaration.
@@ -306,12 +306,55 @@
   void beginEnum(Token enumKeyword) {}
 
   /// Handle the end of an enum declaration.  Substructures:
+  /// - [memberCount] times:
+  ///   - Enum member
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    logEvent("Enum");
+  }
+
+  /// Handle the end of an enum constructor declaration.  Substructures:
+  /// - metadata
+  /// - return type
+  /// - method name (identifier, possibly qualified)
+  /// - type variables
+  /// - formal parameters
+  /// - initializers
+  /// - async marker
+  /// - body
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(danrubel): push implementation into subclasses
+    endClassMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  /// Handle the enum elements. Substructures:
+  /// - [elementsCount] times:
+  ///   - Enum element
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    logEvent("EnumElements");
+  }
+
+  /// Handle the header of an enum declaration.  Substructures:
   /// - Metadata
   /// - Enum name (identifier)
-  /// - [count] times:
-  ///   - Enum value (identifier)
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    logEvent("Enum");
+  /// - type variables
+  /// - with clause
+  /// - implemented types
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    logEvent("EnumHeader");
+  }
+
+  /// Handle the enum element. Substructures:
+  /// - Metadata
+  /// - Enum value (identifier)
+  void handleEnumElement(Token beginToken) {
+    logEvent("EnumElement");
+  }
+
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    endClassFactoryMethod(beginToken, factoryKeyword, endToken);
   }
 
   void beginExport(Token token) {}
@@ -363,7 +406,8 @@
 
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
@@ -447,6 +491,42 @@
         lateToken, varFinalOrConst, count, beginToken, endToken);
   }
 
+  /// Handle the end of an enum field declaration.  Substructures:
+  /// - Metadata
+  /// - Modifiers
+  /// - Type
+  /// - Variable declarations (count times)
+  ///
+  /// Started by [beginFields].
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    endClassFields(abstractToken, externalToken, staticToken, covariantToken,
+        lateToken, varFinalOrConst, count, beginToken, endToken);
+  }
+
+  /// Handle the end of an enum method declaration.  Substructures:
+  /// - metadata
+  /// - return type
+  /// - method name (identifier, possibly qualified)
+  /// - type variables
+  /// - formal parameters
+  /// - initializers
+  /// - async marker
+  /// - body
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    endClassMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
   /// Marks that the grammar term `forInitializerStatement` has been parsed and
   /// it was an empty statement.
   void handleForInitializerEmptyStatement(Token token) {
@@ -608,25 +688,40 @@
     logEvent("FunctionTypeAlias");
   }
 
-  /// Handle the end of a with clause (e.g. "with B, C").
+  /// Handle the end of a class with clause (e.g. "with B, C").
   /// Substructures:
   /// - mixin types (TypeList)
   void handleClassWithClause(Token withKeyword) {
     logEvent("ClassWithClause");
   }
 
-  /// Handle the absence of a with clause.
+  /// Handle the absence of a class with clause.
   void handleClassNoWithClause() {
     logEvent("ClassNoWithClause");
   }
 
+  /// Handle the end of an enum with clause (e.g. "with B, C").
+  /// Substructures:
+  /// - mixin types (TypeList)
+  ///
+  /// This method is separated from [handleClassWithClause] to simplify
+  /// handling the different objects in the context.
+  void handleEnumWithClause(Token withKeyword) {
+    logEvent("EnumWithClause");
+  }
+
+  /// Handle the absence of an enum with clause.
+  void handleEnumNoWithClause() {
+    logEvent("EnumNoWithClause");
+  }
+
   /// Handle the beginning of a named mixin application.
   /// [beginToken] may be the same as [name], or may point to modifiers
   /// (or extraneous modifiers in the case of recovery) preceding [name].
   ///
   /// At this point we have parsed the name and type parameter declarations.
   void beginNamedMixinApplication(
-      Token begin, Token? abstractToken, Token name) {}
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {}
 
   /// Handle a named mixin application with clause (e.g. "A with B, C").
   /// Substructures:
@@ -1566,6 +1661,10 @@
     logEvent("NoConstructorReferenceContinuationAfterTypeArguments");
   }
 
+  void handleNoTypeNameInConstructorReference(Token token) {
+    logEvent("NoTypeNameInConstructorReference");
+  }
+
   void handleNoType(Token lastConsumed) {
     logEvent("NoType");
   }
@@ -1742,13 +1841,20 @@
 
   /// A single comment reference has been parsed.
   /// * [newKeyword] may be null.
-  /// * [prefix] and [period] are either both tokens or both `null`.
-  /// * [token] can be an identifier or an operator.
+  /// * [firstToken] and [firstPeriod] are either both tokens or both
+  ///   `null`.
+  /// * [secondToken] and [secondPeriod] are either both tokens or both `null`.
+  /// * [thirdToken] can be an identifier or an operator.
   ///
   /// This event is generated by the parser when the parser's
   /// `parseOneCommentReference` method is called.
   void handleCommentReference(
-      Token? newKeyword, Token? prefix, Token? period, Token token) {}
+      Token? newKeyword,
+      Token? firstToken,
+      Token? firstPeriod,
+      Token? secondToken,
+      Token? secondPeriod,
+      Token thirdToken) {}
 
   /// This event is generated by the parser when the parser's
   /// `parseOneCommentReference` method is called.
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index cb1ef21..43e8331 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -494,7 +494,8 @@
     token = parseMetadataStar(token);
     Token next = token.next!;
     if (next.isTopLevelKeyword) {
-      return parseTopLevelKeywordDeclaration(token, next, directiveState);
+      return parseTopLevelKeywordDeclaration(/* start = */ token,
+          /* keyword = */ next, /* macroToken = */ null, directiveState);
     }
     Token start = token;
     // Skip modifiers to find a top level keyword or identifier
@@ -513,8 +514,16 @@
       }
     }
     next = token.next!;
+    Token? macroToken;
+    if (next.isIdentifier &&
+        next.lexeme == 'macro' &&
+        optional('class', next.next!)) {
+      macroToken = next;
+      next = next.next!;
+    }
     if (next.isTopLevelKeyword) {
-      return parseTopLevelKeywordDeclaration(start, next, directiveState);
+      return parseTopLevelKeywordDeclaration(/* start = */ start,
+          /* keyword = */ next, /* macroToken = */ macroToken, directiveState);
     } else if (next.isKeywordOrIdentifier) {
       // TODO(danrubel): improve parseTopLevelMember
       // so that we don't parse modifiers twice.
@@ -591,14 +600,16 @@
 
   /// Parse any top-level declaration that begins with a keyword.
   /// [start] is the token before any modifiers preceding [keyword].
-  Token parseTopLevelKeywordDeclaration(
-      Token start, Token keyword, DirectiveContext? directiveState) {
+  Token parseTopLevelKeywordDeclaration(Token start, Token keyword,
+      Token? macroToken, DirectiveContext? directiveState) {
     assert(keyword.isTopLevelKeyword);
     final String? value = keyword.stringValue;
     if (identical(value, 'class')) {
       directiveState?.checkDeclaration();
-      Token? abstractToken = parseClassDeclarationModifiers(start, keyword);
-      return parseClassOrNamedMixinApplication(abstractToken, keyword);
+      Token? abstractToken =
+          parseClassDeclarationModifiers(start, macroToken ?? keyword);
+      return parseClassOrNamedMixinApplication(
+          abstractToken, macroToken, keyword);
     } else if (identical(value, 'enum')) {
       directiveState?.checkDeclaration();
       parseTopLevelKeywordModifiers(start, keyword);
@@ -1286,7 +1297,7 @@
     return token;
   }
 
-  Token parseWithClauseOpt(Token token) {
+  Token parseClassWithClauseOpt(Token token) {
     // <mixins> ::= with <typeNotVoidList>
     Token withKeyword = token.next!;
     if (optional('with', withKeyword)) {
@@ -1298,6 +1309,18 @@
     return token;
   }
 
+  Token parseEnumWithClauseOpt(Token token) {
+    // <mixins> ::= with <typeNotVoidList>
+    Token withKeyword = token.next!;
+    if (optional('with', withKeyword)) {
+      token = parseTypeList(withKeyword);
+      listener.handleEnumWithClause(withKeyword);
+    } else {
+      listener.handleEnumNoWithClause();
+    }
+    return token;
+  }
+
   /// Parse the formal parameters of a getter (which shouldn't have parameters)
   /// or function or method.
   Token parseGetterOrFormalParameters(
@@ -1612,13 +1635,19 @@
         parameterKind == FormalParameterKind.optionalNamed;
 
     Token? thisKeyword;
-    Token? periodAfterThis;
+    Token? superKeyword;
+    Token? periodAfterThisOrSuper;
     IdentifierContext nameContext =
         IdentifierContext.formalParameterDeclaration;
 
-    if (!inFunctionType && optional('this', next)) {
+    if (!inFunctionType &&
+        (optional('this', next) || optional('super', next))) {
       Token originalToken = token;
-      thisKeyword = token = next;
+      if (optional('this', next)) {
+        thisKeyword = token = next;
+      } else {
+        superKeyword = token = next;
+      }
       next = token.next!;
       if (!optional('.', next)) {
         if (isOneOf(next, okNextValueInFormalParameter)) {
@@ -1626,7 +1655,7 @@
           // later that it's not an allowed identifier.
           token = originalToken;
           next = token.next!;
-          thisKeyword = null;
+          thisKeyword = superKeyword = null;
         } else {
           // Recover from a missing period by inserting one.
           next = rewriteAndRecover(
@@ -1634,13 +1663,13 @@
               codes.templateExpectedButGot.withArguments('.'),
               new SyntheticToken(TokenType.PERIOD, next.charOffset));
           // These 3 lines are duplicated here and below.
-          periodAfterThis = token = next;
+          periodAfterThisOrSuper = token = next;
           next = token.next!;
           nameContext = IdentifierContext.fieldInitializer;
         }
       } else {
         // These 3 lines are duplicated here and above.
-        periodAfterThis = token = next;
+        periodAfterThisOrSuper = token = next;
         next = token.next!;
         nameContext = IdentifierContext.fieldInitializer;
       }
@@ -1711,8 +1740,8 @@
     }
 
     Token nameToken;
-    if (periodAfterThis != null) {
-      token = periodAfterThis;
+    if (periodAfterThisOrSuper != null) {
+      token = periodAfterThisOrSuper;
     }
     next = token.next!;
     if (inFunctionType &&
@@ -1759,8 +1788,15 @@
     } else {
       listener.handleFormalParameterWithoutValue(next);
     }
-    listener.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
-        initializerStart, initializerEnd, parameterKind, memberKind);
+    listener.endFormalParameter(
+        thisKeyword,
+        superKeyword,
+        periodAfterThisOrSuper,
+        nameToken,
+        initializerStart,
+        initializerEnd,
+        parameterKind,
+        memberKind);
     return token;
   }
 
@@ -1917,35 +1953,45 @@
 
   /// ```
   /// enumType:
-  ///   metadata 'enum' id '{' metadata id [',' metadata id]* [','] '}'
-  /// ;
+  ///   metadata 'enum' id typeParameters? mixins? interfaces? '{'
+  ///      enumEntry (',' enumEntry)* (',')? (';'
+  ///      (metadata classMemberDefinition)*
+  ///      )?
+  ///   '}'
+  ///
+  /// enumEntry:
+  ///     metadata id argumentPart?
+  ///   | metadata id typeArguments? '.' id arguments
   /// ```
   Token parseEnum(Token enumKeyword) {
     assert(optional('enum', enumKeyword));
     listener.beginUncategorizedTopLevelDeclaration(enumKeyword);
-    listener.beginEnum(enumKeyword);
     Token token =
         ensureIdentifier(enumKeyword, IdentifierContext.enumDeclaration);
+    String name = token.lexeme;
+    listener.beginEnum(enumKeyword);
+    token = parseEnumHeaderOpt(token, enumKeyword);
     Token leftBrace = token.next!;
-    int count = 0;
+    int elementCount = 0;
+    int memberCount = 0;
     if (optional('{', leftBrace)) {
+      listener.handleEnumHeader(enumKeyword, leftBrace);
       token = leftBrace;
       while (true) {
         Token next = token.next!;
-        if (optional('}', next)) {
+        if (optional('}', next) || optional(';', next)) {
           token = next;
-          if (count == 0) {
+          if (elementCount == 0) {
             reportRecoverableError(token, codes.messageEnumDeclarationEmpty);
           }
           break;
         }
-        token = parseMetadataStar(token);
-        token = ensureIdentifier(token, IdentifierContext.enumValueDeclaration);
+        token = parseEnumElement(token);
         next = token.next!;
-        count++;
+        elementCount++;
         if (optional(',', next)) {
           token = next;
-        } else if (optional('}', next)) {
+        } else if (optional('}', next) || optional(';', next)) {
           token = next;
           break;
         } else {
@@ -1971,19 +2017,56 @@
           }
         }
       }
+      listener.handleEnumElements(token, elementCount);
+      if (optional(';', token)) {
+        while (notEofOrValue('}', token.next!)) {
+          token = parseClassOrMixinOrExtensionOrEnumMemberImpl(
+              token, DeclarationKind.Enum, name);
+          ++memberCount;
+        }
+        token = token.next!;
+        assert(token.isEof || optional('}', token));
+      }
     } else {
       // TODO(danrubel): merge this error message with missing class/mixin body
       leftBrace = ensureBlock(
           token, codes.templateExpectedEnumBody, /* missingBlockName = */ null);
+      listener.handleEnumHeader(enumKeyword, leftBrace);
+      listener.handleEnumElements(token, elementCount);
       token = leftBrace.endGroup!;
     }
     assert(optional('}', token));
-    listener.endEnum(enumKeyword, leftBrace, count);
+    listener.endEnum(enumKeyword, leftBrace, memberCount);
+    return token;
+  }
+
+  Token parseEnumHeaderOpt(Token token, Token enumKeyword) {
+    token = computeTypeParamOrArg(
+            token, /* inDeclaration = */ true, /* allowsVariance = */ true)
+        .parseVariables(token, this);
+    token = parseEnumWithClauseOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
+    return token;
+  }
+
+  Token parseEnumElement(Token token) {
+    Token beginToken = token;
+    token = parseMetadataStar(token);
+    token = ensureIdentifier(token, IdentifierContext.enumValueDeclaration);
+    token = parseConstructorReference(token, ConstructorReferenceContext.Const,
+        /* typeArg = */ null, /* isImplicitTypeName = */ true);
+    Token next = token.next!;
+    if (optional('(', next) || optional('<', next)) {
+      token = parseConstructorInvocationArguments(token);
+    } else {
+      listener.handleNoArguments(token);
+    }
+    listener.handleEnumElement(beginToken);
     return token;
   }
 
   Token parseClassOrNamedMixinApplication(
-      Token? abstractToken, Token classKeyword) {
+      Token? abstractToken, Token? macroToken, Token classKeyword) {
     assert(optional('class', classKeyword));
     Token begin = abstractToken ?? classKeyword;
     listener.beginClassOrMixinOrNamedMixinApplicationPrelude(begin);
@@ -1993,10 +2076,11 @@
             name, /* inDeclaration = */ true, /* allowsVariance = */ true)
         .parseVariables(name, this);
     if (optional('=', token.next!)) {
-      listener.beginNamedMixinApplication(begin, abstractToken, name);
+      listener.beginNamedMixinApplication(
+          begin, abstractToken, macroToken, name);
       return parseNamedMixinApplication(token, begin, classKeyword);
     } else {
-      listener.beginClassDeclaration(begin, abstractToken, name);
+      listener.beginClassDeclaration(begin, abstractToken, macroToken, name);
       return parseClass(token, begin, classKeyword, name.lexeme);
     }
   }
@@ -2047,8 +2131,8 @@
 
   Token parseClassHeaderOpt(Token token, Token begin, Token classKeyword) {
     token = parseClassExtendsOpt(token);
-    token = parseWithClauseOpt(token);
-    token = parseClassOrMixinImplementsOpt(token);
+    token = parseClassWithClauseOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
     Token? nativeToken;
     if (optional('native', token.next!)) {
       nativeToken = token.next!;
@@ -2114,7 +2198,7 @@
         }
       }
 
-      token = parseWithClauseOpt(token);
+      token = parseClassWithClauseOpt(token);
 
       if (recoveryListener.withKeyword != null) {
         if (hasWith) {
@@ -2129,7 +2213,7 @@
         }
       }
 
-      token = parseClassOrMixinImplementsOpt(token);
+      token = parseClassOrMixinOrEnumImplementsOpt(token);
 
       if (recoveryListener.implementsKeyword != null) {
         if (hasImplements) {
@@ -2191,7 +2275,7 @@
   ///   'implements' typeName (',' typeName)*
   /// ;
   /// ```
-  Token parseClassOrMixinImplementsOpt(Token token) {
+  Token parseClassOrMixinOrEnumImplementsOpt(Token token) {
     Token? implementsKeyword;
     int interfacesCount = 0;
     if (optional('implements', token.next!)) {
@@ -2202,7 +2286,7 @@
         ++interfacesCount;
       } while (optional(',', token.next!));
     }
-    listener.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    listener.handleImplements(implementsKeyword, interfacesCount);
     return token;
   }
 
@@ -2237,7 +2321,7 @@
 
   Token parseMixinHeaderOpt(Token token, Token mixinKeyword) {
     token = parseMixinOnOpt(token);
-    token = parseClassOrMixinImplementsOpt(token);
+    token = parseClassOrMixinOrEnumImplementsOpt(token);
     listener.handleMixinHeader(mixinKeyword);
     return token;
   }
@@ -2294,7 +2378,7 @@
         }
       }
 
-      token = parseClassOrMixinImplementsOpt(token);
+      token = parseClassOrMixinOrEnumImplementsOpt(token);
 
       if (recoveryListener.implementsKeyword != null) {
         if (hasImplements) {
@@ -2993,6 +3077,18 @@
             beforeStart.next!,
             token);
         break;
+      case DeclarationKind.Enum:
+        listener.endEnumFields(
+            abstractToken,
+            externalToken,
+            staticToken,
+            covariantToken,
+            lateToken,
+            varFinalOrConst,
+            fieldCount,
+            beforeStart.next!,
+            token);
+        break;
     }
     return token;
   }
@@ -3537,7 +3633,7 @@
     listener.beginClassOrMixinOrExtensionBody(kind, token);
     int count = 0;
     while (notEofOrValue('}', token.next!)) {
-      token = parseClassOrMixinOrExtensionMemberImpl(
+      token = parseClassOrMixinOrExtensionOrEnumMemberImpl(
           token, kind, enclosingDeclarationName);
       ++count;
     }
@@ -3559,7 +3655,7 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseClassMember(Token token, String? className) {
-    return parseClassOrMixinOrExtensionMemberImpl(
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
             syntheticPreviousToken(token), DeclarationKind.Class, className)
         .next!;
   }
@@ -3571,7 +3667,7 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseMixinMember(Token token, String mixinName) {
-    return parseClassOrMixinOrExtensionMemberImpl(
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
             syntheticPreviousToken(token), DeclarationKind.Mixin, mixinName)
         .next!;
   }
@@ -3583,8 +3679,10 @@
   /// token and returns the token after the last consumed token rather than the
   /// last consumed token.
   Token parseExtensionMember(Token token, String extensionName) {
-    return parseClassOrMixinOrExtensionMemberImpl(syntheticPreviousToken(token),
-            DeclarationKind.Extension, extensionName)
+    return parseClassOrMixinOrExtensionOrEnumMemberImpl(
+            syntheticPreviousToken(token),
+            DeclarationKind.Extension,
+            extensionName)
         .next!;
   }
 
@@ -3623,7 +3721,7 @@
   ///   methodDeclaration
   /// ;
   /// ```
-  Token parseClassOrMixinOrExtensionMemberImpl(
+  Token parseClassOrMixinOrExtensionOrEnumMemberImpl(
       Token token, DeclarationKind kind, String? enclosingDeclarationName) {
     Token beforeStart = token = parseMetadataStar(token);
 
@@ -4147,6 +4245,10 @@
           break;
         case DeclarationKind.TopLevel:
           throw "Internal error: TopLevel constructor.";
+        case DeclarationKind.Enum:
+          listener.endEnumConstructor(getOrSet, beforeStart.next!,
+              beforeParam.next!, beforeInitializers?.next, token);
+          break;
       }
     } else {
       //
@@ -4176,6 +4278,10 @@
           break;
         case DeclarationKind.TopLevel:
           throw "Internal error: TopLevel method.";
+        case DeclarationKind.Enum:
+          listener.endEnumMethod(getOrSet, beforeStart.next!, beforeParam.next!,
+              beforeInitializers?.next, token);
+          break;
       }
     }
     return token;
@@ -4268,6 +4374,11 @@
         break;
       case DeclarationKind.TopLevel:
         throw "Internal error: TopLevel factory.";
+      case DeclarationKind.Enum:
+        reportRecoverableError(
+            factoryKeyword, codes.messageEnumDeclaresFactory);
+        listener.endEnumFactoryMethod(beforeStart.next!, factoryKeyword, token);
+        break;
     }
     return token;
   }
@@ -4391,12 +4502,19 @@
 
   Token parseConstructorReference(
       Token token, ConstructorReferenceContext constructorReferenceContext,
-      [TypeParamOrArgInfo? typeArg]) {
-    Token start =
-        ensureIdentifier(token, IdentifierContext.constructorReference);
+      [TypeParamOrArgInfo? typeArg, bool isImplicitTypeName = false]) {
+    Token start;
+    if (isImplicitTypeName) {
+      listener.handleNoTypeNameInConstructorReference(token.next!);
+      start = token;
+    } else {
+      start = ensureIdentifier(token, IdentifierContext.constructorReference);
+    }
     listener.beginConstructorReference(start);
-    token = parseQualifiedRestOpt(
-        start, IdentifierContext.constructorReferenceContinuation);
+    if (!isImplicitTypeName) {
+      token = parseQualifiedRestOpt(
+          start, IdentifierContext.constructorReferenceContinuation);
+    }
     typeArg ??= computeTypeParamOrArg(token);
     token = typeArg.parseArguments(token, this);
     Token? period = null;
@@ -6050,8 +6168,8 @@
     }
 
     listener.beginNewExpression(newKeyword);
-    token = parseConstructorReference(
-        newKeyword, ConstructorReferenceContext.New, potentialTypeArg);
+    token = parseConstructorReference(newKeyword,
+        ConstructorReferenceContext.New, /* typeArg = */ potentialTypeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endNewExpression(newKeyword);
     return token;
@@ -6062,7 +6180,7 @@
     Token begin = token.next!; // This is the class name.
     listener.beginImplicitCreationExpression(begin);
     token = parseConstructorReference(
-        token, ConstructorReferenceContext.Implicit, typeArg);
+        token, ConstructorReferenceContext.Implicit, /* typeArg = */ typeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endImplicitCreationExpression(begin, openAngleBracket);
     return token;
@@ -6178,8 +6296,8 @@
       }
     }
     listener.beginConstExpression(constKeyword);
-    token = parseConstructorReference(
-        token, ConstructorReferenceContext.Const, potentialTypeArg);
+    token = parseConstructorReference(token, ConstructorReferenceContext.Const,
+        /* typeArg = */ potentialTypeArg);
     token = parseConstructorInvocationArguments(token);
     listener.endConstExpression(constKeyword);
     return token;
@@ -8249,26 +8367,33 @@
       newKeyword = token;
       token = token.next!;
     }
-    Token? prefix, period;
+    Token? firstToken, firstPeriod, secondToken, secondPeriod;
     if (token.isIdentifier && optional('.', token.next!)) {
-      prefix = token;
-      period = token.next!;
-      Token identifier = period.next!;
+      secondToken = token;
+      secondPeriod = token.next!;
+      if (secondPeriod.next!.isIdentifier &&
+          optional('.', secondPeriod.next!.next!)) {
+        firstToken = secondToken;
+        firstPeriod = secondPeriod;
+        secondToken = secondPeriod.next!;
+        secondPeriod = secondToken.next!;
+      }
+      Token identifier = secondPeriod.next!;
       if (identifier.kind == KEYWORD_TOKEN && optional('new', identifier)) {
         // Treat `new` after `.` is as an identifier so that it can represent an
         // unnamed constructor. This support is separate from the
         // constructor-tearoffs feature.
         rewriter.replaceTokenFollowing(
-            period,
+            secondPeriod,
             new StringToken(TokenType.IDENTIFIER, identifier.lexeme,
                 identifier.charOffset));
       }
-      token = period.next!;
+      token = secondPeriod.next!;
     }
     if (token.isEof) {
       // Recovery: Insert a synthetic identifier for code completion
       token = rewriter.insertSyntheticIdentifier(
-          period ?? newKeyword ?? syntheticPreviousToken(token));
+          secondPeriod ?? newKeyword ?? syntheticPreviousToken(token));
       if (begin == token.next!) {
         begin = token;
       }
@@ -8280,21 +8405,21 @@
     }
     if (token.isUserDefinableOperator) {
       if (token.next!.isEof) {
-        parseOneCommentReferenceRest(
-            begin, referenceOffset, newKeyword, prefix, period, token);
+        parseOneCommentReferenceRest(begin, referenceOffset, newKeyword,
+            firstToken, firstPeriod, secondToken, secondPeriod, token);
         return true;
       }
     } else {
       token = operatorKeyword ?? token;
       if (token.next!.isEof) {
         if (token.isIdentifier) {
-          parseOneCommentReferenceRest(
-              begin, referenceOffset, newKeyword, prefix, period, token);
+          parseOneCommentReferenceRest(begin, referenceOffset, newKeyword,
+              firstToken, firstPeriod, secondToken, secondPeriod, token);
           return true;
         }
         Keyword? keyword = token.keyword;
         if (newKeyword == null &&
-            prefix == null &&
+            secondToken == null &&
             (keyword == Keyword.THIS ||
                 keyword == Keyword.NULL ||
                 keyword == Keyword.TRUE ||
@@ -8315,8 +8440,10 @@
       Token begin,
       int referenceOffset,
       Token? newKeyword,
-      Token? prefix,
-      Token? period,
+      Token? firstToken,
+      Token? firstPeriod,
+      Token? secondToken,
+      Token? secondPeriod,
       Token identifierOrOperator) {
     // Adjust the token offsets to match the enclosing comment token.
     Token token = begin;
@@ -8325,8 +8452,8 @@
       token = token.next!;
     } while (!token.isEof);
 
-    listener.handleCommentReference(
-        newKeyword, prefix, period, identifierOrOperator);
+    listener.handleCommentReference(newKeyword, firstToken, firstPeriod,
+        secondToken, secondPeriod, identifierOrOperator);
   }
 
   /// Given that we have just found bracketed text within the given [comment],
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart b/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
index 5c24c53..7936de0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/recovery_listeners.dart
@@ -24,10 +24,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     this.implementsKeyword = implementsKeyword;
-    super.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    super.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
@@ -82,10 +81,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     this.implementsKeyword = implementsKeyword;
-    super.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
+    super.handleImplements(implementsKeyword, interfacesCount);
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index 245bef3..fbc3ab3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -37,6 +37,7 @@
   ConditionallySelectedImport,
   ConstructorInitializerSeparator,
   ConstructorInitializers,
+  ConstructorReference,
   ConstructorReferenceContinuationAfterTypeArguments,
   ContinueTarget,
   Deferred,
@@ -346,9 +347,8 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    debugEvent("ClassImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    debugEvent("Implements");
   }
 
   @override
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index 41a87a0..9b35add 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,5 +1,5 @@
 name: _fe_analyzer_shared
-version: 30.0.0
+version: 32.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/_fe_analyzer_shared
 
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
new file mode 100644
index 0000000..48ca97b
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:_fe_analyzer_shared/src/macros/api.dart';
+import 'package:_fe_analyzer_shared/src/macros/executor.dart';
+import 'package:_fe_analyzer_shared/src/macros/isolate_mirrors_executor/isolate_mirrors_executor.dart';
+
+import 'package:test/fake.dart';
+import 'package:test/test.dart';
+
+void main() {
+  late MacroExecutor executor;
+
+  setUp(() async {
+    executor = await IsolateMirrorMacroExecutor.start();
+  });
+
+  tearDown(() {
+    executor.close();
+  });
+
+  test('can load macros and create instances', () async {
+    var clazzId = await executor.loadMacro(
+        // Tests run from the root of the repo.
+        File('pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/simple_macro.dart')
+            .absolute
+            .uri,
+        'SimpleMacro');
+    expect(clazzId, isNotNull, reason: 'Can load a macro.');
+
+    var instanceId =
+        await executor.instantiateMacro(clazzId, '', Arguments([], {}));
+    expect(instanceId, isNotNull,
+        reason: 'Can create an instance with no arguments.');
+
+    instanceId =
+        await executor.instantiateMacro(clazzId, '', Arguments([1, 2], {}));
+    expect(instanceId, isNotNull,
+        reason: 'Can create an instance with positional arguments.');
+
+    instanceId = await executor.instantiateMacro(
+        clazzId, 'named', Arguments([], {'x': 1, 'y': 2}));
+    expect(instanceId, isNotNull,
+        reason: 'Can create an instance with named arguments.');
+
+    var definitionResult = await executor.executeDefinitionsPhase(
+        instanceId,
+        _FunctionDeclaration(
+          isAbstract: false,
+          isExternal: false,
+          isGetter: false,
+          isSetter: false,
+          name: 'foo',
+          namedParameters: [],
+          positionalParameters: [],
+          returnType:
+              _TypeAnnotation(Code.fromString('String'), isNullable: false),
+          typeParameters: [],
+        ),
+        _FakeTypeResolver(),
+        _FakeClassIntrospector(),
+        _FakeTypeDeclarationResolver());
+    expect(definitionResult.augmentations, hasLength(1));
+    expect(definitionResult.augmentations.first.debugString().toString(),
+        equalsIgnoringWhitespace('''
+            augment String foo() {
+              print('x: 1, y: 2');
+              return augment super();
+            }'''));
+  });
+}
+
+class _FakeClassIntrospector with Fake implements ClassIntrospector {}
+
+class _FakeTypeResolver with Fake implements TypeResolver {}
+
+class _FakeTypeDeclarationResolver
+    with Fake
+    implements TypeDeclarationResolver {}
+
+class _FunctionDeclaration implements FunctionDeclaration {
+  @override
+  final bool isAbstract;
+
+  @override
+  final bool isExternal;
+
+  @override
+  final bool isGetter;
+
+  @override
+  final bool isSetter;
+
+  @override
+  final String name;
+
+  @override
+  final Iterable<ParameterDeclaration> namedParameters;
+
+  @override
+  final Iterable<ParameterDeclaration> positionalParameters;
+
+  @override
+  final TypeAnnotation returnType;
+
+  @override
+  final Iterable<TypeParameterDeclaration> typeParameters;
+
+  _FunctionDeclaration({
+    required this.isAbstract,
+    required this.isExternal,
+    required this.isGetter,
+    required this.isSetter,
+    required this.name,
+    required this.namedParameters,
+    required this.positionalParameters,
+    required this.returnType,
+    required this.typeParameters,
+  });
+}
+
+class _TypeAnnotation implements TypeAnnotation {
+  @override
+  final Code code;
+
+  @override
+  final bool isNullable;
+
+  _TypeAnnotation(this.code, {required this.isNullable});
+}
+
+extension _ on Code {
+  StringBuffer debugString([StringBuffer? buffer]) {
+    buffer ??= StringBuffer();
+    for (var part in parts) {
+      if (part is Code) {
+        part.debugString(buffer);
+      } else {
+        buffer.write(part.toString());
+      }
+    }
+    return buffer;
+  }
+}
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/simple_macro.dart b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/simple_macro.dart
new file mode 100644
index 0000000..b95da0b
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/simple_macro.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:_fe_analyzer_shared/src/macros/api.dart';
+
+/// A very simple macro that annotates functions (or getters) with no arguments
+/// and adds a print statement to the top of them.
+class SimpleMacro implements FunctionDefinitionMacro {
+  final int? x;
+  final int? y;
+
+  SimpleMacro([this.x, this.y]);
+
+  SimpleMacro.named({this.x, this.y});
+
+  @override
+  FutureOr<void> buildDefinitionForFunction(
+      FunctionDeclaration method, FunctionDefinitionBuilder builder) {
+    if (method.namedParameters
+        .followedBy(method.positionalParameters)
+        .isNotEmpty) {
+      throw ArgumentError(
+          'This macro can only be run on functions with no arguments!');
+    }
+    builder.augment(FunctionBodyCode.fromString('''{
+      print('x: $x, y: $y');
+      return augment super();
+    }'''));
+  }
+}
diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index 24937db..e9f6fb0 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.dart
@@ -252,7 +252,8 @@
 
     if (_classHasStaticInteropAnnotation &&
         procedure.isInstanceMember &&
-        !procedure.isFactory) {
+        !procedure.isFactory &&
+        !procedure.isSynthetic) {
       _diagnosticsReporter.report(
           templateJsInteropStaticInteropWithInstanceMembers
               .withArguments(procedure.enclosingClass!.name),
diff --git a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index 2e4f847..4a20a40 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -139,11 +139,10 @@
           VariableGet(function.positionalParameters.first),
           StringLiteral(_getExtensionMemberName(node))
         ], types: [
-          DynamicType()
+          function.returnType
         ]))
       ..fileOffset = node.fileOffset;
-    return ReturnStatement(
-        AsExpression(getPropertyInvocation, function.returnType));
+    return ReturnStatement(getPropertyInvocation);
   }
 
   /// Returns a new function body for the given [node] external setter.
@@ -153,18 +152,18 @@
   ReturnStatement _getExternalSetterBody(Procedure node) {
     var function = node.function;
     assert(function.positionalParameters.length == 2);
+    var value = function.positionalParameters.last;
     var setPropertyInvocation = StaticInvocation(
         _setPropertyTarget,
         Arguments([
           VariableGet(function.positionalParameters.first),
           StringLiteral(_getExtensionMemberName(node)),
-          VariableGet(function.positionalParameters.last)
+          VariableGet(value)
         ], types: [
-          DynamicType()
+          value.type
         ]))
       ..fileOffset = node.fileOffset;
-    return ReturnStatement(AsExpression(
-        _lowerSetProperty(setPropertyInvocation), function.returnType));
+    return ReturnStatement(_lowerSetProperty(setPropertyInvocation));
   }
 
   /// Returns a new function body for the given [node] external method.
@@ -183,11 +182,10 @@
               .map((argument) => VariableGet(argument))
               .toList())
         ], types: [
-          DynamicType()
+          function.returnType
         ]))
       ..fileOffset = node.fileOffset;
-    return ReturnStatement(AsExpression(
-        _lowerCallMethod(callMethodInvocation), function.returnType));
+    return ReturnStatement(_lowerCallMethod(callMethodInvocation));
   }
 
   /// Returns the extension member name.
diff --git a/pkg/_js_interop_checks/lib/src/transformations/static_interop_class_eraser.dart b/pkg/_js_interop_checks/lib/src/transformations/static_interop_class_eraser.dart
new file mode 100644
index 0000000..e00c88e
--- /dev/null
+++ b/pkg/_js_interop_checks/lib/src/transformations/static_interop_class_eraser.dart
@@ -0,0 +1,183 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/clone.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/src/replacement_visitor.dart';
+import 'package:_js_interop_checks/src/js_interop.dart';
+
+class _TypeSubstitutor extends ReplacementVisitor {
+  final Class _javaScriptObject;
+  _TypeSubstitutor(this._javaScriptObject);
+
+  @override
+  DartType? visitInterfaceType(InterfaceType type, int variance) {
+    if (hasStaticInteropAnnotation(type.classNode)) {
+      return InterfaceType(_javaScriptObject, type.declaredNullability);
+    }
+    return super.visitInterfaceType(type, variance);
+  }
+}
+
+/// Erases usage of `@JS` classes that are annotated with `@staticInterop` in
+/// favor of `JavaScriptObject`.
+class StaticInteropClassEraser extends Transformer {
+  final Class _javaScriptObject;
+  final CloneVisitorNotMembers _cloner = CloneVisitorNotMembers();
+  late final _TypeSubstitutor _typeSubstitutor;
+
+  StaticInteropClassEraser(CoreTypes coreTypes)
+      : _javaScriptObject =
+            coreTypes.index.getClass('dart:_interceptors', 'JavaScriptObject') {
+    _typeSubstitutor = _TypeSubstitutor(_javaScriptObject);
+  }
+
+  String _factoryStubName(Procedure factoryTarget) =>
+      '${factoryTarget.name}|staticInteropFactoryStub';
+
+  /// Either finds or creates a static method stub to replace factories with a
+  /// body in a static interop class.
+  ///
+  /// Modifies [factoryTarget]'s enclosing class to include the new method.
+  Procedure _findOrCreateFactoryStub(Procedure factoryTarget) {
+    assert(factoryTarget.isFactory);
+    var factoryClass = factoryTarget.enclosingClass!;
+    assert(hasStaticInteropAnnotation(factoryClass));
+    var stubName = _factoryStubName(factoryTarget);
+    var stubs = factoryClass.procedures
+        .where((procedure) => procedure.name.text == stubName);
+    if (stubs.isEmpty) {
+      // Note that the return type of the cloned function is transformed.
+      var functionNode =
+          super.visitFunctionNode(_cloner.clone(factoryTarget.function))
+              as FunctionNode;
+      var staticMethod = Procedure(
+          Name(stubName), ProcedureKind.Method, functionNode,
+          isStatic: true, fileUri: factoryTarget.fileUri)
+        ..parent = factoryClass;
+      factoryClass.procedures.add(staticMethod);
+      return staticMethod;
+    } else {
+      assert(stubs.length == 1);
+      return stubs.first;
+    }
+  }
+
+  @override
+  TreeNode visitConstructor(Constructor node) {
+    if (hasStaticInteropAnnotation(node.enclosingClass)) {
+      // Transform children of the constructor node excluding the return type.
+      var returnType = node.function.returnType;
+      var newConstructor = super.visitConstructor(node) as Constructor;
+      newConstructor.function.returnType = returnType;
+      return newConstructor;
+    }
+    return super.visitConstructor(node);
+  }
+
+  @override
+  TreeNode visitProcedure(Procedure node) {
+    // Avoid changing the return types of factories, but rather cast the type of
+    // the invocation.
+    if (node.isFactory && hasStaticInteropAnnotation(node.enclosingClass!)) {
+      if (node.function.body != null && !node.isRedirectingFactory) {
+        // Bodies of factories may undergo transformation, which may result in
+        // type invariants breaking. For a motivating example, consider:
+        //
+        // ```
+        // factory Foo.fact() => Foo.cons();
+        // ```
+        //
+        // The invocation of `cons` would have its type erased, but then it
+        // would no longer match the return type of `fact`, whose return type
+        // shouldn't get erased as it is a factory. Note that this is only an
+        // issue when the factory has a body that doesn't simply redirect.
+        //
+        // In order to circumvent this, we introduce a new static method that
+        // clones the factory body and has a return type of
+        // `JavaScriptObject`. Invocations of the factory are turned into
+        // invocations of the static method. The original factory is still kept
+        // in order to make modular compilations work.
+        _findOrCreateFactoryStub(node);
+        return node;
+      } else {
+        // Transform children of the factory node excluding the return type and
+        // return type of the signature type.
+        var returnType = node.function.returnType;
+        var signatureReturnType = node.signatureType?.returnType;
+        var newProcedure = super.visitProcedure(node) as Procedure;
+        newProcedure.function.returnType = returnType;
+        var signatureType = newProcedure.signatureType;
+        if (signatureType != null && signatureReturnType != null) {
+          newProcedure.signatureType = FunctionType(
+              signatureType.positionalParameters,
+              signatureReturnType,
+              signatureType.declaredNullability,
+              namedParameters: signatureType.namedParameters,
+              typeParameters: signatureType.typeParameters,
+              requiredParameterCount: signatureType.requiredParameterCount,
+              typedefType: signatureType.typedefType);
+        }
+        return newProcedure;
+      }
+    }
+    return super.visitProcedure(node);
+  }
+
+  @override
+  TreeNode visitConstructorInvocation(ConstructorInvocation node) {
+    if (hasStaticInteropAnnotation(node.target.enclosingClass)) {
+      // Add a cast so that the result gets typed as `JavaScriptObject`.
+      var newInvocation = super.visitConstructorInvocation(node) as Expression;
+      return AsExpression(
+          newInvocation,
+          InterfaceType(_javaScriptObject,
+              node.target.function.returnType.declaredNullability))
+        ..fileOffset = newInvocation.fileOffset;
+    }
+    return super.visitConstructorInvocation(node);
+  }
+
+  /// Transform static invocations that correspond only to factories of static
+  /// interop classes.
+  @override
+  TreeNode visitStaticInvocation(StaticInvocation node) {
+    var targetClass = node.target.enclosingClass;
+    if (node.target.isFactory &&
+        targetClass != null &&
+        hasStaticInteropAnnotation(targetClass)) {
+      var factoryTarget = node.target;
+      if (factoryTarget.function.body != null &&
+          !factoryTarget.isRedirectingFactory) {
+        // Use or create the static method that replaces this factory instead.
+        // Note that the static method will not have been created yet in the
+        // case where we visit the factory later. Also note that a cast is not
+        // needed since the static method already has its type erased.
+        var args = super.visitArguments(node.arguments) as Arguments;
+        return StaticInvocation(_findOrCreateFactoryStub(factoryTarget), args,
+            isConst: node.isConst)
+          ..fileOffset = node.fileOffset;
+      } else {
+        // Add a cast so that the result gets typed as `JavaScriptObject`.
+        var newInvocation = super.visitStaticInvocation(node) as Expression;
+        return AsExpression(
+            newInvocation,
+            InterfaceType(_javaScriptObject,
+                node.target.function.returnType.declaredNullability))
+          ..fileOffset = newInvocation.fileOffset;
+      }
+    }
+    return super.visitStaticInvocation(node);
+  }
+
+  @override
+  DartType visitDartType(DartType type) {
+    // Variance is not a factor in our type transformation here, so just choose
+    // `unrelated` as a default.
+    var substitutedType = type.accept1(_typeSubstitutor, Variance.unrelated);
+    return substitutedType != null ? substitutedType : type;
+  }
+}
diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index 90f1d22..fdda3f2 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -1,9 +1,8 @@
 include: package:pedantic/analysis_options.1.9.0.yaml
 
 analyzer:
-  # This currently finds ~1,200 implicit-casts issues when enabled.
-  # strong-mode:
-  #   implicit-casts: false
+  language:
+    strict-casts: true
   exclude:
     - test/mock_packages/**
   errors:
diff --git a/pkg/analysis_server/benchmark/benchmarks.dart b/pkg/analysis_server/benchmark/benchmarks.dart
index c6b391f..7037a85 100644
--- a/pkg/analysis_server/benchmark/benchmarks.dart
+++ b/pkg/analysis_server/benchmark/benchmarks.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer_utilities/package_root.dart';
 import 'package:args/command_runner.dart';
-import 'package:intl/intl.dart';
 import 'package:path/path.dart' as path;
 
 import 'perf/benchmarks_impl.dart';
@@ -88,8 +87,6 @@
 }
 
 class BenchMarkResult {
-  static final NumberFormat nf = NumberFormat.decimalPattern();
-
   /// One of 'bytes', 'micros', or 'compound'.
   final String kindName;
 
@@ -104,7 +101,7 @@
   Map toJson() => {kindName: value};
 
   @override
-  String toString() => '$kindName: ${nf.format(value)}';
+  String toString() => '$kindName: $value';
 }
 
 class CompoundBenchMarkResult extends BenchMarkResult {
@@ -222,16 +219,20 @@
 
   @override
   Future run() async {
-    if (argResults!.rest.isEmpty) {
+    var args = argResults;
+    if (args == null) {
+      throw StateError('argResults have not been set');
+    }
+    if (args.rest.isEmpty) {
       printUsage();
       exit(1);
     }
 
-    var benchmarkId = argResults!.rest.first;
-    var repeatCount = int.parse(argResults!['repeat'] as String);
-    var flutterRepository = argResults!['flutter-repository'] as String?;
-    var quick = argResults!['quick'];
-    var verbose = argResults!['verbose'];
+    var benchmarkId = args.rest.first;
+    var repeatCount = int.parse(args['repeat'] as String);
+    var flutterRepository = args['flutter-repository'] as String?;
+    var quick = args['quick'] as bool;
+    var verbose = args['verbose'] as bool;
 
     var benchmark =
         benchmarks.firstWhere((b) => b.id == benchmarkId, orElse: () {
@@ -241,8 +242,14 @@
 
     if (benchmark is FlutterBenchmark) {
       if (flutterRepository != null) {
-        (benchmark as FlutterBenchmark).flutterRepositoryPath =
-            flutterRepository;
+        if (path.isAbsolute(flutterRepository) &&
+            path.normalize(flutterRepository) == flutterRepository) {
+          (benchmark as FlutterBenchmark).flutterRepositoryPath =
+              flutterRepository;
+        } else {
+          print('The path must be absolute and normalized: $flutterRepository');
+          exit(1);
+        }
       } else {
         print('The option --flutter-repository is required to '
             "run '$benchmarkId'.");
diff --git a/pkg/analysis_server/benchmark/integration/input_converter.dart b/pkg/analysis_server/benchmark/integration/input_converter.dart
index da47e28..aec8d14 100644
--- a/pkg/analysis_server/benchmark/integration/input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/input_converter.dart
@@ -62,7 +62,7 @@
 
   /// Return an operation for the notification or `null` if none.
   Operation? convertNotification(Map<String, dynamic> json) {
-    String event = json['event'];
+    var event = json['event'] as String;
     if (event == SERVER_NOTIFICATION_STATUS) {
       // {"event":"server.status","params":{"analysis":{"isAnalyzing":false}}}
       var params = asMap2(json['params']);
@@ -214,21 +214,21 @@
   /// Recursively translate source paths in the specified JSON to reference
   /// the temporary source used during performance measurement rather than
   /// the original source when the instrumentation or log file was generated.
-  dynamic translateSrcPaths(json) {
+  Object? translateSrcPaths(Object? json) {
     if (json is String) {
       return srcPathMap.translate(json);
     }
     if (json is List) {
-      var result = [];
+      var result = <Object?>[];
       for (var i = 0; i < json.length; ++i) {
-        result.add(translateSrcPaths(json[i]));
+        result.add(translateSrcPaths(json[i] as Object?));
       }
       return result;
     }
     if (json is Map) {
       var result = <String, Object?>{};
       json.forEach((origKey, value) {
-        result[translateSrcPaths(origKey)] = translateSrcPaths(value);
+        result[translateSrcPaths(origKey) as String] = translateSrcPaths(value);
       });
       return result;
     }
diff --git a/pkg/analysis_server/benchmark/integration/main.dart b/pkg/analysis_server/benchmark/integration/main.dart
index b63675e..07ce8bb 100644
--- a/pkg/analysis_server/benchmark/integration/main.dart
+++ b/pkg/analysis_server/benchmark/integration/main.dart
@@ -130,8 +130,8 @@
     printHelp();
     exit(1);
   }
-
-  var showHelp = args[HELP_CMDLINE_OPTION] || args.rest.isNotEmpty;
+  var helpArg = args[HELP_CMDLINE_OPTION] as bool;
+  var showHelp = helpArg || args.rest.isNotEmpty;
 
   var inputArg = args[INPUT_CMDLINE_OPTION];
   if (inputArg is! String || inputArg.isEmpty) {
@@ -141,7 +141,8 @@
     perfArgs.inputPath = inputArg;
   }
 
-  for (var pair in args[MAP_OPTION]) {
+  var mapArg = args[MAP_OPTION] as List<Object?>;
+  for (var pair in mapArg) {
     if (pair is String) {
       var index = pair.indexOf(',');
       if (index != -1 && !pair.contains(',', index + 1)) {
@@ -175,9 +176,10 @@
     }
   }
 
-  if (args[VERY_VERBOSE_CMDLINE_OPTION] || rawArgs.contains('-vv')) {
+  var verboseArg = args[VERY_VERBOSE_CMDLINE_OPTION] as bool;
+  if (verboseArg || rawArgs.contains('-vv')) {
     Logger.root.level = Level.FINE;
-  } else if (args[VERBOSE_CMDLINE_OPTION]) {
+  } else if (verboseArg) {
     Logger.root.level = Level.INFO;
   } else {
     Logger.root.level = Level.WARNING;
diff --git a/pkg/analysis_server/benchmark/integration/operation.dart b/pkg/analysis_server/benchmark/integration/operation.dart
index 311e979..db0bfcf 100644
--- a/pkg/analysis_server/benchmark/integration/operation.dart
+++ b/pkg/analysis_server/benchmark/integration/operation.dart
@@ -70,8 +70,8 @@
   @override
   Future<void>? perform(Driver driver) {
     var stopwatch = Stopwatch();
-    String originalId = json['id'];
-    String method = json['method'];
+    var originalId = json['id'] as String;
+    var method = json['method'] as String;
     json['clientRequestTime'] = DateTime.now().millisecondsSinceEpoch;
     driver.logger.log(Level.FINE, 'Sending request: $method\n  $json');
     stopwatch.start();
diff --git a/pkg/analysis_server/benchmark/perf/flutter_completion_benchmark.dart b/pkg/analysis_server/benchmark/perf/flutter_completion_benchmark.dart
index e2bac08..7863130 100644
--- a/pkg/analysis_server/benchmark/perf/flutter_completion_benchmark.dart
+++ b/pkg/analysis_server/benchmark/perf/flutter_completion_benchmark.dart
@@ -33,7 +33,7 @@
         );
 
   @override
-  int get maxIterations => 2;
+  int get maxIterations => 1;
 
   @override
   Future<BenchMarkResult> run({
@@ -77,8 +77,10 @@
     // time analyzing, and do apply the filter.
     // Total number of suggestions: 2322.
     // Filtered to: 82.
+    // Long name: completion-smallFile-body
+    var name = 'completion-1';
     result.add(
-      'completion-smallFile-body',
+      name,
       BenchMarkResult(
         'micros',
         await _completionTiming(
@@ -86,7 +88,7 @@
           filePath: '$flutterPkgPath/lib/src/material/flutter_logo.dart',
           uniquePrefix: 'Widget build(BuildContext context) {',
           insertStringGenerator: () => 'M',
-          name: 'completion-smallFile-body',
+          name: name,
         ),
       ),
     );
@@ -98,8 +100,10 @@
       // JSON in the server, and deserializing on the client.
       // Total number of suggestions: 2322.
       // Filtered to: 2322.
+      // Long name: completion-smallFile-body-withoutPrefix
+      name = 'completion-2';
       result.add(
-        'completion-smallFile-body-withoutPrefix',
+        name,
         BenchMarkResult(
           'micros',
           await _completionTiming(
@@ -107,7 +111,7 @@
             filePath: '$flutterPkgPath/lib/src/material/flutter_logo.dart',
             uniquePrefix: 'Widget build(BuildContext context) {',
             insertStringGenerator: null,
-            name: 'completion-smallFile-body-withoutPrefix',
+            name: name,
           ),
         ),
       );
@@ -118,8 +122,10 @@
       // The target method body is small, so something could be optimized.
       // Total number of suggestions: 4654.
       // Filtered to: 182.
+      // Long name: completion-smallLibraryCycle-largeFile-smallBody
+      name = 'completion-3';
       result.add(
-        'completion-smallLibraryCycle-largeFile-smallBody',
+        name,
         BenchMarkResult(
           'micros',
           await _completionTiming(
@@ -127,7 +133,7 @@
             filePath: '$flutterPkgPath/test/material/text_field_test.dart',
             uniquePrefix: 'getOpacity(WidgetTester tester, Finder finder) {',
             insertStringGenerator: () => 'M',
-            name: 'completion-smallLibraryCycle-largeFile-smallBody',
+            name: name,
           ),
         ),
       );
@@ -143,8 +149,10 @@
       // TODO(scheglov) Remove the previous sentence when improved.
       // Total number of suggestions: 3429.
       // Filtered to: 133.
+      // Long name: completion-mediumLibraryCycle-mediumFile-smallBody
+      name = 'completion-4';
       result.add(
-        'completion-mediumLibraryCycle-mediumFile-smallBody',
+        name,
         BenchMarkResult(
           'micros',
           await _completionTiming(
@@ -152,7 +160,7 @@
             filePath: '$flutterPkgPath/lib/src/material/app_bar.dart',
             uniquePrefix: 'computeDryLayout(BoxConstraints constraints) {',
             insertStringGenerator: () => 'M',
-            name: 'completion-mediumLibraryCycle-mediumFile-smallBody',
+            name: name,
           ),
         ),
       );
@@ -163,8 +171,10 @@
       // cycle. This is expensive.
       // Total number of suggestions: 1510.
       // Filtered to: 0.
+      // Long name: completion-mediumLibraryCycle-mediumFile-api-parameterType
+      name = 'completion-5';
       result.add(
-        'completion-mediumLibraryCycle-mediumFile-api-parameterType',
+        name,
         BenchMarkResult(
           'micros',
           await _completionTiming(
@@ -172,7 +182,7 @@
             filePath: '$flutterPkgPath/lib/src/material/app_bar.dart',
             uniquePrefix: 'computeDryLayout(BoxConstraints',
             insertStringGenerator: _IncrementingStringGenerator(),
-            name: 'completion-mediumLibraryCycle-mediumFile-api-parameterType',
+            name: name,
           ),
         ),
       );
@@ -233,12 +243,12 @@
     // Perform warm-up.
     // The cold start does not matter.
     // The sustained performance is much more important.
-    const kWarmUpCount = 20;
+    const kWarmUpCount = 5;
     for (var i = 0; i < kWarmUpCount; i++) {
       await perform();
     }
 
-    const kRepeatCount = 10;
+    const kRepeatCount = 5;
     final timer = Stopwatch()..start();
     for (var i = 0; i < kRepeatCount; i++) {
       await perform();
diff --git a/pkg/analysis_server/benchmark/perf/memory_tests.dart b/pkg/analysis_server/benchmark/perf/memory_tests.dart
index 528f672..1837834 100644
--- a/pkg/analysis_server/benchmark/perf/memory_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/memory_tests.dart
@@ -230,7 +230,7 @@
   Map<String, List<Diagnostic>> currentAnalysisErrors = {};
 
   @override
-  void expect(actual, matcher, {String? reason}) =>
+  void expect(Object? actual, Matcher matcher, {String? reason}) =>
       outOfTestExpect(actual, matcher, reason: reason);
 
   /// The server is automatically started before every test.
@@ -265,8 +265,8 @@
 
     var total = 0;
 
-    List isolateGroupsRefs = vm['isolateGroups'];
-    for (Map isolateGroupRef in isolateGroupsRefs) {
+    var isolateGroupsRefs = vm['isolateGroups'] as List<Object?>;
+    for (var isolateGroupRef in isolateGroupsRefs.cast<Map>()) {
       final heapUsage = await service.call('getIsolateGroupMemoryUsage',
           {'isolateGroupId': isolateGroupRef['id']});
       total += heapUsage['heapUsage'] + heapUsage['externalUsage'] as int;
@@ -312,10 +312,10 @@
     }
 
     try {
-      dynamic json = jsonDecode(message);
+      var json = jsonDecode(message) as Map<Object?, Object?>;
       if (json.containsKey('id')) {
-        dynamic id = json['id'];
-        _completers[id]?.complete(json['result']);
+        var id = json['id'];
+        _completers[id]?.complete(json['result'] as Map<Object?, Object?>);
         _completers.remove(id);
       }
     } catch (e) {
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index b84e3fd..1bb0ba8 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.32.7
+  1.32.8
 </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.32.8</h4>
+<ul>
+  <li>Added <tt>server.cancelRequest</tt> to allow clients to request cancellation
+  of outstanding requests.</li>
+</ul>
 <h4>1.32.7</h4>
 <ul>
   <li><tt>HoverInformation.elementDescription</tt> may now include linebreaks to
@@ -286,6 +291,7 @@
 <p><a href="#domain_server">Server</a></p><ul><li><a href="#request_server.getVersion">server.getVersion</a></li>
 <li><a href="#request_server.shutdown">server.shutdown</a></li>
 <li><a href="#request_server.setSubscriptions">server.setSubscriptions</a></li>
+<li><a href="#request_server.cancelRequest">server.cancelRequest</a></li>
 </ul>
 
 <p><a href="#domain_analysis">Analysis</a></p><ul><li><a href="#request_analysis.getErrors">analysis.getErrors</a></li>
@@ -421,6 +427,7 @@
   
   
   
+  
 <h3>Requests</h3><dl><dt class="request"><a name="request_server.getVersion">server.getVersion</a></dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "server.getVersion"
@@ -474,6 +481,32 @@
   <h4>parameters:</h4><dl><dt class="field"><b>subscriptions: List&lt;<a href="#type_ServerService">ServerService</a>&gt;</b></dt><dd>
         
         <p>A list of the services being subscribed to.</p>
+      </dd></dl></dd><dt class="request"><a name="request_server.cancelRequest">server.cancelRequest</a></dt><dd><div class="box"><pre>request: {
+  "<b>id</b>": String
+  "method": "server.cancelRequest"
+  "params": {
+    "<b>id</b>": String
+  }
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+}</pre></div>
+    <p>Requests cancellation of a request sent by the client by id.
+      This is provided on a best-effort basis and there is no
+      guarantee the server will be able to cancel any specific
+      request.
+
+      The server will still always produce a response to the request
+      even in the case of cancellation, but clients should discard
+      any results of any cancelled request because they may be
+      incomplete or inaccurate.
+      
+      This request always completes without error regardless of
+      whether the request is successfully cancelled.</p>
+    
+  <h4>parameters:</h4><dl><dt class="field"><b>id: String</b></dt><dd>
+        
+        <p>The id of the request that should be cancelled.</p>
       </dd></dl></dd></dl><h3>Notifications</h3><dl><dt class="notification"><a name="notification_server.connected">server.connected</a></dt><dd><div class="box"><pre>notification: {
   "event": "server.connected"
   "params": {
@@ -6065,7 +6098,7 @@
   TODO: TBD
 </p>
 <h2 class="domain"><a name="index">Index</a></h2>
-<h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.log">log</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.getReachableSources">getReachableSources</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.closingLabels">closingLabels</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.implemented">implemented</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li><li><a href="#request_completion.setSubscriptions">setSubscriptions</a></li><li><a href="#request_completion.registerLibraryPaths">registerLibraryPaths</a></li><li><a href="#request_completion.getSuggestionDetails">getSuggestionDetails</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li><li><a href="#notification_completion.availableSuggestions">availableSuggestions</a></li><li><a href="#notification_completion.existingImports">existingImports</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getPostfixCompletion">getPostfixCompletion</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.getSuggestions">getSuggestions</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h4>diagnostic (<a href="#domain_diagnostic">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_diagnostic.getDiagnostics">getDiagnostics</a></li><li><a href="#request_diagnostic.getServerPort">getServerPort</a></li></ul></div><h4>flutter (<a href="#domain_flutter">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_flutter.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_flutter.outline">outline</a></li></ul></div></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_AvailableSuggestion">AvailableSuggestion</a></li><li><a href="#type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag</a></li><li><a href="#type_AvailableSuggestionSet">AvailableSuggestionSet</a></li><li><a href="#type_BulkFix">BulkFix</a></li><li><a href="#type_BulkFixDetail">BulkFixDetail</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_ClosingLabel">ClosingLabel</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionService">CompletionService</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextData">ContextData</a></li><li><a href="#type_DiagnosticMessage">DiagnosticMessage</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementDeclaration">ElementDeclaration</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_ExistingImport">ExistingImport</a></li><li><a href="#type_ExistingImports">ExistingImports</a></li><li><a href="#type_FileKind">FileKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FlutterOutline">FlutterOutline</a></li><li><a href="#type_FlutterOutlineAttribute">FlutterOutlineAttribute</a></li><li><a href="#type_FlutterOutlineKind">FlutterOutlineKind</a></li><li><a href="#type_FlutterService">FlutterService</a></li><li><a href="#type_FlutterWidgetProperty">FlutterWidgetProperty</a></li><li><a href="#type_FlutterWidgetPropertyEditor">FlutterWidgetPropertyEditor</a></li><li><a href="#type_FlutterWidgetPropertyEditorKind">FlutterWidgetPropertyEditorKind</a></li><li><a href="#type_FlutterWidgetPropertyValue">FlutterWidgetPropertyValue</a></li><li><a href="#type_FlutterWidgetPropertyValueEnumItem">FlutterWidgetPropertyValueEnumItem</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_ImplementedClass">ImplementedClass</a></li><li><a href="#type_ImplementedMember">ImplementedMember</a></li><li><a href="#type_ImportedElementSet">ImportedElementSet</a></li><li><a href="#type_ImportedElements">ImportedElements</a></li><li><a href="#type_IncludedSuggestionRelevanceTag">IncludedSuggestionRelevanceTag</a></li><li><a href="#type_IncludedSuggestionSet">IncludedSuggestionSet</a></li><li><a href="#type_KytheEntry">KytheEntry</a></li><li><a href="#type_KytheVName">KytheVName</a></li><li><a href="#type_LibraryPathSet">LibraryPathSet</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PostfixTemplateDescriptor">PostfixTemplateDescriptor</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_RuntimeCompletionExpression">RuntimeCompletionExpression</a></li><li><a href="#type_RuntimeCompletionExpressionType">RuntimeCompletionExpressionType</a></li><li><a href="#type_RuntimeCompletionExpressionTypeKind">RuntimeCompletionExpressionTypeKind</a></li><li><a href="#type_RuntimeCompletionVariable">RuntimeCompletionVariable</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_EXTRACT_WIDGET">EXTRACT_WIDGET</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
+<h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li><li><a href="#request_server.cancelRequest">cancelRequest</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.log">log</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.getReachableSources">getReachableSources</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.closingLabels">closingLabels</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.implemented">implemented</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li><li><a href="#request_completion.setSubscriptions">setSubscriptions</a></li><li><a href="#request_completion.registerLibraryPaths">registerLibraryPaths</a></li><li><a href="#request_completion.getSuggestionDetails">getSuggestionDetails</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li><li><a href="#notification_completion.availableSuggestions">availableSuggestions</a></li><li><a href="#notification_completion.existingImports">existingImports</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getPostfixCompletion">getPostfixCompletion</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.getSuggestions">getSuggestions</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h4>diagnostic (<a href="#domain_diagnostic">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_diagnostic.getDiagnostics">getDiagnostics</a></li><li><a href="#request_diagnostic.getServerPort">getServerPort</a></li></ul></div><h4>flutter (<a href="#domain_flutter">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_flutter.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_flutter.outline">outline</a></li></ul></div></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_AvailableSuggestion">AvailableSuggestion</a></li><li><a href="#type_AvailableSuggestionRelevanceTag">AvailableSuggestionRelevanceTag</a></li><li><a href="#type_AvailableSuggestionSet">AvailableSuggestionSet</a></li><li><a href="#type_BulkFix">BulkFix</a></li><li><a href="#type_BulkFixDetail">BulkFixDetail</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_ClosingLabel">ClosingLabel</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionService">CompletionService</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextData">ContextData</a></li><li><a href="#type_DiagnosticMessage">DiagnosticMessage</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementDeclaration">ElementDeclaration</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_ExistingImport">ExistingImport</a></li><li><a href="#type_ExistingImports">ExistingImports</a></li><li><a href="#type_FileKind">FileKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FlutterOutline">FlutterOutline</a></li><li><a href="#type_FlutterOutlineAttribute">FlutterOutlineAttribute</a></li><li><a href="#type_FlutterOutlineKind">FlutterOutlineKind</a></li><li><a href="#type_FlutterService">FlutterService</a></li><li><a href="#type_FlutterWidgetProperty">FlutterWidgetProperty</a></li><li><a href="#type_FlutterWidgetPropertyEditor">FlutterWidgetPropertyEditor</a></li><li><a href="#type_FlutterWidgetPropertyEditorKind">FlutterWidgetPropertyEditorKind</a></li><li><a href="#type_FlutterWidgetPropertyValue">FlutterWidgetPropertyValue</a></li><li><a href="#type_FlutterWidgetPropertyValueEnumItem">FlutterWidgetPropertyValueEnumItem</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_ImplementedClass">ImplementedClass</a></li><li><a href="#type_ImplementedMember">ImplementedMember</a></li><li><a href="#type_ImportedElementSet">ImportedElementSet</a></li><li><a href="#type_ImportedElements">ImportedElements</a></li><li><a href="#type_IncludedSuggestionRelevanceTag">IncludedSuggestionRelevanceTag</a></li><li><a href="#type_IncludedSuggestionSet">IncludedSuggestionSet</a></li><li><a href="#type_KytheEntry">KytheEntry</a></li><li><a href="#type_KytheVName">KytheVName</a></li><li><a href="#type_LibraryPathSet">LibraryPathSet</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PostfixTemplateDescriptor">PostfixTemplateDescriptor</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_RuntimeCompletionExpression">RuntimeCompletionExpression</a></li><li><a href="#type_RuntimeCompletionExpressionType">RuntimeCompletionExpressionType</a></li><li><a href="#type_RuntimeCompletionExpressionTypeKind">RuntimeCompletionExpressionTypeKind</a></li><li><a href="#type_RuntimeCompletionVariable">RuntimeCompletionVariable</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_EXTRACT_WIDGET">EXTRACT_WIDGET</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
 
 
 </body></html>
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
index 03ef62f..5c222c3 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_custom_generated.dart
@@ -846,7 +846,7 @@
       try {
         final attributes = obj['attributes'];
         if (attributes != null &&
-            !((attributes is List &&
+            !((attributes is List<Object?> &&
                 (attributes.every((item) =>
                     FlutterOutlineAttribute.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<FlutterOutlineAttribute>');
@@ -905,7 +905,7 @@
       try {
         final children = obj['children'];
         if (children != null &&
-            !((children is List &&
+            !((children is List<Object?> &&
                 (children.every(
                     (item) => FlutterOutline.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<FlutterOutline>');
@@ -1168,7 +1168,7 @@
       try {
         final children = obj['children'];
         if (children != null &&
-            !((children is List &&
+            !((children is List<Object?> &&
                 (children
                     .every((item) => Outline.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Outline>');
@@ -1376,7 +1376,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((labels is List &&
+        if (!((labels is List<Object?> &&
             (labels.every((item) => ClosingLabel.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<ClosingLabel>');
           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 e792375..e8de391 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -452,7 +452,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((fromRanges is List &&
+        if (!((fromRanges is List<Object?> &&
             (fromRanges.every((item) => Range.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Range>');
           return false;
@@ -741,7 +741,7 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List &&
+            !((tags is List<Object?> &&
                 (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
@@ -963,7 +963,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((fromRanges is List &&
+        if (!((fromRanges is List<Object?> &&
             (fromRanges.every((item) => Range.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Range>');
           return false;
@@ -1298,7 +1298,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -2585,7 +2585,7 @@
       try {
         final diagnostics = obj['diagnostics'];
         if (diagnostics != null &&
-            !((diagnostics is List &&
+            !((diagnostics is List<Object?> &&
                 (diagnostics
                     .every((item) => Diagnostic.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Diagnostic>');
@@ -2926,7 +2926,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List &&
+        if (!((valueSet is List<Object?> &&
             (valueSet
                 .every((item) => CodeActionKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<CodeActionKind>');
@@ -3071,7 +3071,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((properties is List &&
+        if (!((properties is List<Object?> &&
             (properties.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -3160,7 +3160,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((diagnostics is List &&
+        if (!((diagnostics is List<Object?> &&
             (diagnostics
                 .every((item) => Diagnostic.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Diagnostic>');
@@ -3173,7 +3173,7 @@
       try {
         final only = obj['only'];
         if (only != null &&
-            !((only is List &&
+            !((only is List<Object?> &&
                 (only.every(
                     (item) => CodeActionKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<CodeActionKind>');
@@ -3280,7 +3280,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -3402,7 +3402,7 @@
       try {
         final codeActionKinds = obj['codeActionKinds'];
         if (codeActionKinds != null &&
-            !((codeActionKinds is List &&
+            !((codeActionKinds is List<Object?> &&
                 (codeActionKinds.every(
                     (item) => CodeActionKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<CodeActionKind>');
@@ -3712,7 +3712,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -3725,7 +3725,7 @@
       try {
         final codeActionKinds = obj['codeActionKinds'];
         if (codeActionKinds != null &&
-            !((codeActionKinds is List &&
+            !((codeActionKinds is List<Object?> &&
                 (codeActionKinds.every(
                     (item) => CodeActionKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<CodeActionKind>');
@@ -4262,7 +4262,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -4698,7 +4698,7 @@
       try {
         final additionalTextEdits = obj['additionalTextEdits'];
         if (additionalTextEdits != null &&
-            !((additionalTextEdits is List &&
+            !((additionalTextEdits is List<Object?> &&
                 (additionalTextEdits
                     .every((item) => TextEdit.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<TextEdit>');
@@ -4990,7 +4990,8 @@
       try {
         final arguments = obj['arguments'];
         if (arguments != null &&
-            !((arguments is List && (arguments.every((item) => true))))) {
+            !((arguments is List<Object?> &&
+                (arguments.every((item) => true))))) {
           reporter.reportError('must be of type List<Object?>');
           return false;
         }
@@ -5323,7 +5324,7 @@
       try {
         final documentationFormat = obj['documentationFormat'];
         if (documentationFormat != null &&
-            !((documentationFormat is List &&
+            !((documentationFormat is List<Object?> &&
                 (documentationFormat
                     .every((item) => MarkupKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<MarkupKind>');
@@ -5482,7 +5483,7 @@
       try {
         final valueSet = obj['valueSet'];
         if (valueSet != null &&
-            !((valueSet is List &&
+            !((valueSet is List<Object?> &&
                 (valueSet.every(
                     (item) => CompletionItemKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<CompletionItemKind>');
@@ -5554,7 +5555,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List &&
+        if (!((valueSet is List<Object?> &&
             (valueSet
                 .every((item) => InsertTextMode.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<InsertTextMode>');
@@ -5627,7 +5628,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((properties is List &&
+        if (!((properties is List<Object?> &&
             (properties.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -5698,7 +5699,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List &&
+        if (!((valueSet is List<Object?> &&
             (valueSet.every(
                 (item) => CompletionItemTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<CompletionItemTag>');
@@ -6124,7 +6125,7 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List &&
+            !((tags is List<Object?> &&
                 (tags.every(
                     (item) => CompletionItemTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<CompletionItemTag>');
@@ -6245,7 +6246,7 @@
       try {
         final additionalTextEdits = obj['additionalTextEdits'];
         if (additionalTextEdits != null &&
-            !((additionalTextEdits is List &&
+            !((additionalTextEdits is List<Object?> &&
                 (additionalTextEdits
                     .every((item) => TextEdit.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<TextEdit>');
@@ -6258,7 +6259,7 @@
       try {
         final commitCharacters = obj['commitCharacters'];
         if (commitCharacters != null &&
-            !((commitCharacters is List &&
+            !((commitCharacters is List<Object?> &&
                 (commitCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -6353,7 +6354,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -6403,7 +6404,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -6483,7 +6484,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List &&
+        if (!((items is List<Object?> &&
             (items
                 .every((item) => CompletionItem.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<CompletionItem>');
@@ -6600,7 +6601,7 @@
       try {
         final triggerCharacters = obj['triggerCharacters'];
         if (triggerCharacters != null &&
-            !((triggerCharacters is List &&
+            !((triggerCharacters is List<Object?> &&
                 (triggerCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -6612,7 +6613,7 @@
       try {
         final allCommitCharacters = obj['allCommitCharacters'];
         if (allCommitCharacters != null &&
-            !((allCommitCharacters is List &&
+            !((allCommitCharacters is List<Object?> &&
                 (allCommitCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -6946,7 +6947,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -6959,7 +6960,7 @@
       try {
         final triggerCharacters = obj['triggerCharacters'];
         if (triggerCharacters != null &&
-            !((triggerCharacters is List &&
+            !((triggerCharacters is List<Object?> &&
                 (triggerCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -6971,7 +6972,7 @@
       try {
         final allCommitCharacters = obj['allCommitCharacters'];
         if (allCommitCharacters != null &&
-            !((allCommitCharacters is List &&
+            !((allCommitCharacters is List<Object?> &&
                 (allCommitCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -7042,7 +7043,7 @@
 
   final num _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     switch (obj) {
       case 1:
       case 2:
@@ -7183,7 +7184,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((items is List &&
+        if (!((items is List<Object?> &&
             (items.every(
                 (item) => ConfigurationItem.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<ConfigurationItem>');
@@ -7473,7 +7474,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((files is List &&
+        if (!((files is List<Object?> &&
             (files.every((item) => FileCreate.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<FileCreate>');
           return false;
@@ -7869,7 +7870,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -8252,7 +8253,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -8554,7 +8555,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((files is List &&
+        if (!((files is List<Object?> &&
             (files.every((item) => FileDelete.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<FileDelete>');
           return false;
@@ -8788,7 +8789,7 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List &&
+            !((tags is List<Object?> &&
                 (tags.every(
                     (item) => DiagnosticTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DiagnosticTag>');
@@ -8801,7 +8802,7 @@
       try {
         final relatedInformation = obj['relatedInformation'];
         if (relatedInformation != null &&
-            !((relatedInformation is List &&
+            !((relatedInformation is List<Object?> &&
                 (relatedInformation.every((item) =>
                     DiagnosticRelatedInformation.canParse(item, reporter)))))) {
           reporter.reportError(
@@ -8954,7 +8955,7 @@
 
   final num _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is num;
   }
 
@@ -8989,7 +8990,7 @@
 
   final num _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is num;
   }
 
@@ -9211,7 +9212,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((contentChanges is List &&
+        if (!((contentChanges is List<Object?> &&
             (contentChanges.every((item) =>
                 (TextDocumentContentChangeEvent1.canParse(item, reporter) ||
                     TextDocumentContentChangeEvent2.canParse(
@@ -9356,7 +9357,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((changes is List &&
+        if (!((changes is List<Object?> &&
             (changes.every((item) => FileEvent.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<FileEvent>');
           return false;
@@ -9427,7 +9428,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((watchers is List &&
+        if (!((watchers is List<Object?> &&
             (watchers.every(
                 (item) => FileSystemWatcher.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<FileSystemWatcher>');
@@ -10040,7 +10041,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -10493,7 +10494,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -10693,7 +10694,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -10982,7 +10983,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -11492,7 +11493,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -11672,7 +11673,7 @@
       try {
         final moreTriggerCharacter = obj['moreTriggerCharacter'];
         if (moreTriggerCharacter != null &&
-            !((moreTriggerCharacter is List &&
+            !((moreTriggerCharacter is List<Object?> &&
                 (moreTriggerCharacter.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -11919,7 +11920,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -11950,7 +11951,7 @@
       try {
         final moreTriggerCharacter = obj['moreTriggerCharacter'];
         if (moreTriggerCharacter != null &&
-            !((moreTriggerCharacter is List &&
+            !((moreTriggerCharacter is List<Object?> &&
                 (moreTriggerCharacter.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -12310,7 +12311,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -12512,7 +12513,7 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List &&
+            !((tags is List<Object?> &&
                 (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
@@ -12570,7 +12571,7 @@
       try {
         final children = obj['children'];
         if (children != null &&
-            !((children is List &&
+            !((children is List<Object?> &&
                 (children.every(
                     (item) => DocumentSymbol.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentSymbol>');
@@ -12818,7 +12819,7 @@
       try {
         final valueSet = obj['valueSet'];
         if (valueSet != null &&
-            !((valueSet is List &&
+            !((valueSet is List<Object?> &&
                 (valueSet
                     .every((item) => SymbolKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SymbolKind>');
@@ -12890,7 +12891,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List &&
+        if (!((valueSet is List<Object?> &&
             (valueSet.every((item) => SymbolTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
@@ -13189,7 +13190,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -13252,7 +13253,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -13402,7 +13403,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((commands is List &&
+        if (!((commands is List<Object?> &&
             (commands.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -13515,7 +13516,8 @@
       try {
         final arguments = obj['arguments'];
         if (arguments != null &&
-            !((arguments is List && (arguments.every((item) => true))))) {
+            !((arguments is List<Object?> &&
+                (arguments.every((item) => true))))) {
           reporter.reportError('must be of type List<Object?>');
           return false;
         }
@@ -13606,7 +13608,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((commands is List &&
+        if (!((commands is List<Object?> &&
             (commands.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -13656,7 +13658,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     switch (obj) {
       case 'abort':
       case 'transactional':
@@ -13704,7 +13706,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -14160,7 +14162,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -14281,7 +14283,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((filters is List &&
+        if (!((filters is List<Object?> &&
             (filters.every(
                 (item) => FileOperationFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<FileOperationFilter>');
@@ -14781,7 +14783,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -15048,7 +15050,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -15408,7 +15410,7 @@
       try {
         final contentFormat = obj['contentFormat'];
         if (contentFormat != null &&
-            !((contentFormat is List &&
+            !((contentFormat is List<Object?> &&
                 (contentFormat
                     .every((item) => MarkupKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<MarkupKind>');
@@ -15663,7 +15665,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -16066,7 +16068,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -16356,7 +16358,7 @@
       try {
         final workspaceFolders = obj['workspaceFolders'];
         if (workspaceFolders != null &&
-            !((workspaceFolders is List &&
+            !((workspaceFolders is List<Object?> &&
                 (workspaceFolders.every(
                     (item) => WorkspaceFolder.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<WorkspaceFolder>');
@@ -16831,7 +16833,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     switch (obj) {
       case 1:
       case 2:
@@ -16870,7 +16872,7 @@
 
   final num _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is num;
   }
 
@@ -17203,7 +17205,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -17308,7 +17310,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((ranges is List &&
+        if (!((ranges is List<Object?> &&
             (ranges.every((item) => Range.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Range>');
           return false;
@@ -17955,7 +17957,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     switch (obj) {
       case 'plaintext':
       case 'markdown':
@@ -18118,7 +18120,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -18152,7 +18154,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -18624,7 +18626,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -18904,7 +18906,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -19567,7 +19569,7 @@
 
   final num _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is num;
   }
 
@@ -19859,7 +19861,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List &&
+        if (!((valueSet is List<Object?> &&
             (valueSet
                 .every((item) => DiagnosticTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DiagnosticTag>');
@@ -19975,7 +19977,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((diagnostics is List &&
+        if (!((diagnostics is List<Object?> &&
             (diagnostics
                 .every((item) => Diagnostic.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Diagnostic>');
@@ -20584,7 +20586,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -20765,7 +20767,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((registrations is List &&
+        if (!((registrations is List<Object?> &&
             (registrations
                 .every((item) => Registration.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Registration>');
@@ -21317,7 +21319,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((files is List &&
+        if (!((files is List<Object?> &&
             (files.every((item) => FileRename.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<FileRename>');
           return false;
@@ -21630,7 +21632,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -21822,7 +21824,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     switch (obj) {
       case 'create':
       case 'rename':
@@ -22440,7 +22442,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((positions is List &&
+        if (!((positions is List<Object?> &&
             (positions.every((item) => Position.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Position>');
           return false;
@@ -22567,7 +22569,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -22620,7 +22622,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -22653,7 +22655,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -22749,7 +22751,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((data is List && (data.every((item) => item is int))))) {
+        if (!((data is List<Object?> && (data.every((item) => item is int))))) {
           reporter.reportError('must be of type List<int>');
           return false;
         }
@@ -22917,7 +22919,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((tokenTypes is List &&
+        if (!((tokenTypes is List<Object?> &&
             (tokenTypes.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -22936,7 +22938,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((tokenModifiers is List &&
+        if (!((tokenModifiers is List<Object?> &&
             (tokenModifiers.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -22955,7 +22957,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((formats is List &&
+        if (!((formats is List<Object?> &&
             (formats.every((item) => TokenFormat.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<TokenFormat>');
           return false;
@@ -23284,7 +23286,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((edits is List &&
+        if (!((edits is List<Object?> &&
             (edits.every(
                 (item) => SemanticTokensEdit.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SemanticTokensEdit>');
@@ -23509,7 +23511,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((edits is List &&
+        if (!((edits is List<Object?> &&
             (edits.every(
                 (item) => SemanticTokensEdit.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SemanticTokensEdit>');
@@ -23622,7 +23624,7 @@
       try {
         final data = obj['data'];
         if (data != null &&
-            !((data is List && (data.every((item) => item is int))))) {
+            !((data is List<Object?> && (data.every((item) => item is int))))) {
           reporter.reportError('must be of type List<int>');
           return false;
         }
@@ -23700,7 +23702,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((tokenTypes is List &&
+        if (!((tokenTypes is List<Object?> &&
             (tokenTypes.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -23719,7 +23721,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((tokenModifiers is List &&
+        if (!((tokenModifiers is List<Object?> &&
             (tokenModifiers.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -24162,7 +24164,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((data is List && (data.every((item) => item is int))))) {
+        if (!((data is List<Object?> && (data.every((item) => item is int))))) {
           reporter.reportError('must be of type List<int>');
           return false;
         }
@@ -24452,7 +24454,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -26627,7 +26629,7 @@
       try {
         final actions = obj['actions'];
         if (actions != null &&
-            !((actions is List &&
+            !((actions is List<Object?> &&
                 (actions.every(
                     (item) => MessageActionItem.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<MessageActionItem>');
@@ -26735,7 +26737,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((signatures is List &&
+        if (!((signatures is List<Object?> &&
             (signatures.every(
                 (item) => SignatureInformation.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SignatureInformation>');
@@ -27036,7 +27038,7 @@
       try {
         final documentationFormat = obj['documentationFormat'];
         if (documentationFormat != null &&
-            !((documentationFormat is List &&
+            !((documentationFormat is List<Object?> &&
                 (documentationFormat
                     .every((item) => MarkupKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<MarkupKind>');
@@ -27312,7 +27314,7 @@
       try {
         final triggerCharacters = obj['triggerCharacters'];
         if (triggerCharacters != null &&
-            !((triggerCharacters is List &&
+            !((triggerCharacters is List<Object?> &&
                 (triggerCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -27324,7 +27326,7 @@
       try {
         final retriggerCharacters = obj['retriggerCharacters'];
         if (retriggerCharacters != null &&
-            !((retriggerCharacters is List &&
+            !((retriggerCharacters is List<Object?> &&
                 (retriggerCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -27598,7 +27600,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -27611,7 +27613,7 @@
       try {
         final triggerCharacters = obj['triggerCharacters'];
         if (triggerCharacters != null &&
-            !((triggerCharacters is List &&
+            !((triggerCharacters is List<Object?> &&
                 (triggerCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -27623,7 +27625,7 @@
       try {
         final retriggerCharacters = obj['retriggerCharacters'];
         if (retriggerCharacters != null &&
-            !((retriggerCharacters is List &&
+            !((retriggerCharacters is List<Object?> &&
                 (retriggerCharacters.every((item) => item is String))))) {
           reporter.reportError('must be of type List<String>');
           return false;
@@ -27683,7 +27685,7 @@
 
   final num _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is num;
   }
 
@@ -27815,7 +27817,7 @@
       try {
         final parameters = obj['parameters'];
         if (parameters != null &&
-            !((parameters is List &&
+            !((parameters is List<Object?> &&
                 (parameters.every((item) =>
                     ParameterInformation.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<ParameterInformation>');
@@ -28077,7 +28079,7 @@
       try {
         final tags = obj['tags'];
         if (tags != null &&
-            !((tags is List &&
+            !((tags is List<Object?> &&
                 (tags.every((item) => SymbolTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
@@ -28159,7 +28161,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -28209,7 +28211,7 @@
 
   final num _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is num;
   }
 
@@ -28292,7 +28294,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -29338,7 +29340,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((edits is List &&
+        if (!((edits is List<Object?> &&
             (edits.every((item) => (SnippetTextEdit.canParse(item, reporter) ||
                 AnnotatedTextEdit.canParse(item, reporter) ||
                 TextEdit.canParse(item, reporter))))))) {
@@ -29850,7 +29852,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -29891,7 +29893,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -29973,7 +29975,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -30146,7 +30148,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -30433,7 +30435,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -30807,7 +30809,7 @@
         }
         final documentSelector = obj['documentSelector'];
         if (documentSelector != null &&
-            !((documentSelector is List &&
+            !((documentSelector is List<Object?> &&
                 (documentSelector.every(
                     (item) => DocumentFilter.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<DocumentFilter>');
@@ -30871,7 +30873,7 @@
 
   final String _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is String;
   }
 
@@ -31027,7 +31029,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((unregisterations is List &&
+        if (!((unregisterations is List<Object?> &&
             (unregisterations
                 .every((item) => Unregistration.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<Unregistration>');
@@ -31159,7 +31161,7 @@
 
   final int _value;
 
-  static bool canParse(Object obj, LspJsonReporter reporter) {
+  static bool canParse(Object? obj, LspJsonReporter reporter) {
     return obj is int;
   }
 
@@ -32116,15 +32118,14 @@
     final documentChangesJson = json['documentChanges'];
     final documentChanges = documentChangesJson == null
         ? null
-        : ((documentChangesJson is List &&
+        : ((documentChangesJson is List<Object?> &&
                 (documentChangesJson.every((item) =>
                     TextDocumentEdit.canParse(item, nullLspJsonReporter))))
-            ? Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t1(
-                (documentChangesJson)
-                    .map((item) =>
-                        TextDocumentEdit.fromJson(item as Map<String, Object?>))
-                    .toList())
-            : ((documentChangesJson is List &&
+            ? Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t1((documentChangesJson)
+                .map((item) =>
+                    TextDocumentEdit.fromJson(item as Map<String, Object?>))
+                .toList())
+            : ((documentChangesJson is List<Object?> &&
                     (documentChangesJson.every((item) =>
                         (TextDocumentEdit.canParse(item, nullLspJsonReporter) ||
                             CreateFile.canParse(item, nullLspJsonReporter) ||
@@ -32194,7 +32195,7 @@
             !((changes is Map &&
                 (changes.keys.every((item) =>
                     item is String &&
-                    changes.values.every((item) => (item is List &&
+                    changes.values.every((item) => (item is List<Object?> &&
                         (item.every((item) =>
                             TextEdit.canParse(item, reporter)))))))))) {
           reporter.reportError('must be of type Map<String, List<TextEdit>>');
@@ -32207,10 +32208,10 @@
       try {
         final documentChanges = obj['documentChanges'];
         if (documentChanges != null &&
-            !(((documentChanges is List &&
+            !(((documentChanges is List<Object?> &&
                     (documentChanges.every((item) =>
                         TextDocumentEdit.canParse(item, reporter)))) ||
-                (documentChanges is List &&
+                (documentChanges is List<Object?> &&
                     (documentChanges.every((item) =>
                         (TextDocumentEdit.canParse(item, reporter) ||
                             CreateFile.canParse(item, reporter) ||
@@ -32368,7 +32369,7 @@
       try {
         final resourceOperations = obj['resourceOperations'];
         if (resourceOperations != null &&
-            !((resourceOperations is List &&
+            !((resourceOperations is List<Object?> &&
                 (resourceOperations.every((item) =>
                     ResourceOperationKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<ResourceOperationKind>');
@@ -32642,7 +32643,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((added is List &&
+        if (!((added is List<Object?> &&
             (added
                 .every((item) => WorkspaceFolder.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<WorkspaceFolder>');
@@ -32662,7 +32663,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((removed is List &&
+        if (!((removed is List<Object?> &&
             (removed
                 .every((item) => WorkspaceFolder.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<WorkspaceFolder>');
@@ -32945,7 +32946,7 @@
       try {
         final valueSet = obj['valueSet'];
         if (valueSet != null &&
-            !((valueSet is List &&
+            !((valueSet is List<Object?> &&
                 (valueSet
                     .every((item) => SymbolKind.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SymbolKind>');
@@ -33017,7 +33018,7 @@
           reporter.reportError('must not be null');
           return false;
         }
-        if (!((valueSet is List &&
+        if (!((valueSet is List<Object?> &&
             (valueSet.every((item) => SymbolTag.canParse(item, reporter)))))) {
           reporter.reportError('must be of type List<SymbolTag>');
           return false;
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
index c4469ea..c56e634 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
@@ -15,7 +15,9 @@
   /// Assists with the same relevance are sorted alphabetically.
   static final Comparator<Assist> SORT_BY_RELEVANCE = (Assist a, Assist b) {
     if (a.kind.priority != b.kind.priority) {
-      return a.kind.priority - b.kind.priority;
+      // A higher priority indicates a higher relevance
+      // and should be sorted before a lower priority.
+      return b.kind.priority - a.kind.priority;
     }
     return a.change.message.compareTo(b.change.message);
   };
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
index 3550b96..327a6e6 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
@@ -3,9 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
-import 'package:analysis_server/src/services/completion/dart/extension_cache.dart';
-import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/instrumentation/service.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
@@ -13,9 +12,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class DartFixContext implements FixContext {
-  /// Return the extension cache used to find available extensions.
-  ExtensionCache get extensionCache;
-
   /// Return the instrumentation service used to report errors that prevent a
   /// fix from being composed.
   InstrumentationService get instrumentationService;
@@ -26,7 +22,13 @@
   /// The workspace in which the fix contributor operates.
   ChangeWorkspace get workspace;
 
-  /// Return top-level declarations with the [name] in libraries that are
-  /// available to this context.
-  List<TopLevelDeclaration> getTopLevelDeclarations(String name);
+  /// Return the mapping from a library (that is available to this context) to
+  /// a top-level declaration that is exported (not necessary declared) by this
+  /// library, and has the requested base name. For getters and setters the
+  /// corresponding top-level variable is returned.
+  Future<Map<LibraryElement, Element>> getTopLevelDeclarations(String name);
+
+  /// Return libraries with extensions that declare non-static public
+  /// extension members with the [memberName].
+  Stream<LibraryElement> librariesWithExtensions(String memberName);
 }
diff --git a/pkg/analysis_server/lib/protocol/protocol.dart b/pkg/analysis_server/lib/protocol/protocol.dart
index 9d15dac..3481a4c 100644
--- a/pkg/analysis_server/lib/protocol/protocol.dart
+++ b/pkg/analysis_server/lib/protocol/protocol.dart
@@ -8,6 +8,7 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 
 export 'package:analyzer_plugin/protocol/protocol.dart' show Enum;
 
@@ -28,7 +29,7 @@
 
   /// A table mapping the names of notification parameters to their values, or
   /// `null` if there are no notification parameters.
-  final Map<String, Object>? params;
+  final Map<String, Object?>? params;
 
   /// Initialize a newly created [Notification] to have the given [event] name.
   /// If [params] is provided, it will be used as the params; otherwise no
@@ -37,8 +38,8 @@
 
   /// Initialize a newly created instance based on the given JSON data.
   factory Notification.fromJson(Map json) {
-    return Notification(json[Notification.EVENT],
-        json[Notification.PARAMS] as Map<String, Object>?);
+    return Notification(json[Notification.EVENT] as String,
+        json[Notification.PARAMS] as Map<String, Object?>?);
   }
 
   /// Return a table representing the structure of the Json object that will be
@@ -270,7 +271,7 @@
   /// this handler, return `null` so that other handlers will be given a chance
   /// to handle it. Otherwise, return the response that should be passed back to
   /// the client.
-  Response? handleRequest(Request request);
+  Response? handleRequest(Request request, CancellationToken cancellationToken);
 }
 
 /// A response to a request.
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 2689506..00b690a 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -6,7 +6,7 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
-const String PROTOCOL_VERSION = '1.32.7';
+const String PROTOCOL_VERSION = '1.32.8';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
@@ -141,6 +141,7 @@
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_FILE = 'file';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_MAX_RESULTS = 'maxResults';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_OFFSET = 'offset';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_TIMEOUT = 'timeout';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS_FILE = 'file';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS_OFFSET = 'offset';
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS =
@@ -355,6 +356,8 @@
 const String SERVER_NOTIFICATION_STATUS = 'server.status';
 const String SERVER_NOTIFICATION_STATUS_ANALYSIS = 'analysis';
 const String SERVER_NOTIFICATION_STATUS_PUB = 'pub';
+const String SERVER_REQUEST_CANCEL_REQUEST = 'server.cancelRequest';
+const String SERVER_REQUEST_CANCEL_REQUEST_ID = 'id';
 const String SERVER_REQUEST_GET_VERSION = 'server.getVersion';
 const String SERVER_REQUEST_SET_SUBSCRIPTIONS = 'server.setSubscriptions';
 const String SERVER_REQUEST_SET_SUBSCRIPTIONS_SUBSCRIPTIONS = 'subscriptions';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 8cd904d..8d9f921 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -4698,7 +4698,14 @@
   /// to true.
   int maxResults;
 
-  CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults);
+  /// The approximate time in milliseconds that the server should spend. The
+  /// server will perform some steps anyway, even if it takes longer than the
+  /// specified timeout. This field is intended to be used for benchmarking,
+  /// and usually should not be provided, so that the default timeout is used.
+  int? timeout;
+
+  CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults,
+      {this.timeout});
 
   factory CompletionGetSuggestions2Params.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object? json) {
@@ -4723,7 +4730,12 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'maxResults');
       }
-      return CompletionGetSuggestions2Params(file, offset, maxResults);
+      int? timeout;
+      if (json.containsKey('timeout')) {
+        timeout = jsonDecoder.decodeInt(jsonPath + '.timeout', json['timeout']);
+      }
+      return CompletionGetSuggestions2Params(file, offset, maxResults,
+          timeout: timeout);
     } else {
       throw jsonDecoder.mismatch(
           jsonPath, 'completion.getSuggestions2 params', json);
@@ -4741,6 +4753,10 @@
     result['file'] = file;
     result['offset'] = offset;
     result['maxResults'] = maxResults;
+    var timeout = this.timeout;
+    if (timeout != null) {
+      result['timeout'] = timeout;
+    }
     return result;
   }
 
@@ -4757,7 +4773,8 @@
     if (other is CompletionGetSuggestions2Params) {
       return file == other.file &&
           offset == other.offset &&
-          maxResults == other.maxResults;
+          maxResults == other.maxResults &&
+          timeout == other.timeout;
     }
     return false;
   }
@@ -4767,6 +4784,7 @@
         file,
         offset,
         maxResults,
+        timeout,
       );
 }
 
@@ -11547,7 +11565,7 @@
       double? doubleValue;
       if (json.containsKey('doubleValue')) {
         doubleValue = jsonDecoder.decodeDouble(
-            jsonPath + '.doubleValue', json['doubleValue']);
+            jsonPath + '.doubleValue', json['doubleValue'] as Object);
       }
       int? intValue;
       if (json.containsKey('intValue')) {
@@ -15615,6 +15633,91 @@
       );
 }
 
+/// server.cancelRequest params
+///
+/// {
+///   "id": String
+/// }
+///
+/// Clients may not extend, implement or mix-in this class.
+class ServerCancelRequestParams implements RequestParams {
+  /// The id of the request that should be cancelled.
+  String id;
+
+  ServerCancelRequestParams(this.id);
+
+  factory ServerCancelRequestParams.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
+    json ??= {};
+    if (json is Map) {
+      String id;
+      if (json.containsKey('id')) {
+        id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, 'id');
+      }
+      return ServerCancelRequestParams(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, 'server.cancelRequest params', json);
+    }
+  }
+
+  factory ServerCancelRequestParams.fromRequest(Request request) {
+    return ServerCancelRequestParams.fromJson(
+        RequestDecoder(request), 'params', request.params);
+  }
+
+  @override
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
+    result['id'] = id;
+    return result;
+  }
+
+  @override
+  Request toRequest(String id) {
+    return Request(id, 'server.cancelRequest', toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is ServerCancelRequestParams) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => id.hashCode;
+}
+
+/// server.cancelRequest result
+///
+/// Clients may not extend, implement or mix-in this class.
+class ServerCancelRequestResult implements ResponseResult {
+  @override
+  Map<String, Object> toJson() => <String, Object>{};
+
+  @override
+  Response toResponse(String id) {
+    return Response(id, result: null);
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is ServerCancelRequestResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => 183255719;
+}
+
 /// server.connected params
 ///
 /// {
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index fd9daec..4c8b529 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -33,6 +33,7 @@
 import 'package:analysis_server/src/protocol_server.dart' as server;
 import 'package:analysis_server/src/search/search_domain.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
+import 'package:analysis_server/src/server/debounce_requests.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/server/error_notifier.dart';
@@ -40,6 +41,7 @@
 import 'package:analysis_server/src/server/sdk_configuration.dart';
 import 'package:analysis_server/src/services/flutter/widget_descriptions.dart';
 import 'package:analysis_server/src/utilities/process.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analysis_server/src/utilities/request_statistics.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -55,6 +57,7 @@
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation_dart.dart';
 import 'package:http/http.dart' as http;
+import 'package:meta/meta.dart';
 import 'package:telemetry/crash_reporting.dart';
 import 'package:telemetry/telemetry.dart' as telemetry;
 import 'package:watcher/watcher.dart';
@@ -79,6 +82,13 @@
   /// A set of the [ServerService]s to send notifications for.
   Set<ServerService> serverServices = HashSet<ServerService>();
 
+  /// A table mapping request ids to cancellation tokens that allow cancelling
+  /// the request.
+  ///
+  /// Tokens are removed once a request completes and should not be assumed to
+  /// exist in this table just because cancellation was requested.
+  Map<String, CancelableToken> cancellationTokens = {};
+
   /// A set of the [GeneralAnalysisService]s to send notifications for.
   Set<GeneralAnalysisService> generalAnalysisServices =
       HashSet<GeneralAnalysisService>();
@@ -115,6 +125,12 @@
 
   final DetachableFileSystemManager? detachableFileSystemManager;
 
+  /// The broadcast stream of requests that were discarded because there
+  /// was another request that made this one irrelevant.
+  @visibleForTesting
+  final StreamController<Request> discardedRequests =
+      StreamController.broadcast(sync: true);
+
   /// Initialize a newly created server to receive requests from and send
   /// responses to the given [channel].
   ///
@@ -161,10 +177,14 @@
         performance = performanceAfterStartup = ServerPerformance();
       });
     });
-    var notification =
-        ServerConnectedParams(PROTOCOL_VERSION, io.pid).toNotification();
-    channel.sendNotification(notification);
-    channel.listen(handleRequest, onDone: done, onError: error);
+    channel.sendNotification(
+      ServerConnectedParams(
+        options.reportProtocolVersion ?? PROTOCOL_VERSION,
+        io.pid,
+      ).toNotification(),
+    );
+    debounceRequests(channel, discardedRequests)
+        .listen(handleRequest, onDone: done, onError: error);
     handlers = <server.RequestHandler>[
       ServerDomainHandler(this),
       AnalysisDomainHandler(this),
@@ -207,6 +227,10 @@
     return sdkManager.defaultSdkDirectory;
   }
 
+  void cancelRequest(String id) {
+    cancellationTokens[id]?.cancel();
+  }
+
   /// The socket from which requests are being read has been closed.
   void done() {}
 
@@ -229,30 +253,32 @@
   void handleRequest(Request request) {
     performance.logRequestTiming(request.clientRequestTime);
     runZonedGuarded(() {
+      var cancellationToken = CancelableToken();
+      cancellationTokens[request.id] = cancellationToken;
       var count = handlers.length;
       for (var i = 0; i < count; i++) {
         try {
-          var response = handlers[i].handleRequest(request);
+          var response = handlers[i].handleRequest(request, cancellationToken);
           if (response == Response.DELAYED_RESPONSE) {
             return;
           }
           if (response != null) {
-            channel.sendResponse(response);
+            sendResponse(response);
             return;
           }
         } on RequestFailure catch (exception) {
-          channel.sendResponse(exception.response);
+          sendResponse(exception.response);
           return;
         } catch (exception, stackTrace) {
           var error =
               RequestError(RequestErrorCode.SERVER_ERROR, exception.toString());
           error.stackTrace = stackTrace.toString();
           var response = Response(request.id, error: error);
-          channel.sendResponse(response);
+          sendResponse(response);
           return;
         }
       }
-      channel.sendResponse(Response.unknownRequest(request));
+      sendResponse(Response.unknownRequest(request));
     }, (exception, stackTrace) {
       instrumentationService.logException(
         FatalException(
@@ -298,6 +324,7 @@
   /// Send the given [response] to the client.
   void sendResponse(Response response) {
     channel.sendResponse(response);
+    cancellationTokens.remove(response.id);
   }
 
   /// If the [path] is not a valid file path, that is absolute and normalized,
@@ -635,6 +662,9 @@
 
   /// The set of enabled features.
   FeatureSet featureSet = FeatureSet();
+
+  /// If set, this string will be reported as the protocol version.
+  String? reportProtocolVersion;
 }
 
 class ServerContextManagerCallbacks extends ContextManagerCallbacks {
@@ -753,7 +783,6 @@
     var path = result.path;
 
     analysisServer.getDocumentationCacheFor(result)?.cacheFromResult(result);
-    analysisServer.getExtensionCacheFor(result)?.cacheFromResult(result);
 
     var unit = result.unit;
     if (analysisServer._hasAnalysisServiceSubscription(
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 9e758b6..b94ee3f 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -15,7 +15,6 @@
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/services/completion/dart/documentation_cache.dart';
-import 'package:analysis_server/src/services/completion/dart/extension_cache.dart';
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/pub/pub_api.dart';
 import 'package:analysis_server/src/services/pub/pub_command.dart';
@@ -44,12 +43,14 @@
     show EvictingFileByteStore;
 import 'package:analyzer/src/dart/analysis/file_content_cache.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:collection/collection.dart';
 import 'package:http/http.dart' as http;
 import 'package:meta/meta.dart';
@@ -93,10 +94,6 @@
   /// each context.
   Map<AnalysisContext, DocumentationCache> documentationForContext = {};
 
-  /// A map from analysis contexts to the extension cache associated with
-  /// each context.
-  Map<AnalysisContext, ExtensionCache> extensionForContext = {};
-
   /// The DiagnosticServer for this AnalysisServer. If available, it can be used
   /// to start an http diagnostics server or return the port for an existing
   /// server.
@@ -250,7 +247,6 @@
   void addContextsToDeclarationsTracker() {
     declarationsTracker?.discardContexts();
     documentationForContext.clear();
-    extensionForContext.clear();
     for (var driver in driverMap.values) {
       declarationsTracker?.addContext(driver.analysisContext!);
     }
@@ -302,8 +298,14 @@
   }
 
   DartdocDirectiveInfo getDartdocDirectiveInfoFor(ResolvedUnitResult result) {
+    return getDartdocDirectiveInfoForSession(result.session);
+  }
+
+  DartdocDirectiveInfo getDartdocDirectiveInfoForSession(
+    AnalysisSession session,
+  ) {
     return declarationsTracker
-            ?.getContext(result.session.analysisContext)
+            ?.getContext(session.analysisContext)
             ?.dartdocDirectiveInfo ??
         DartdocDirectiveInfo();
   }
@@ -312,7 +314,14 @@
   /// context that produced the [result], or `null` if there is no cache for the
   /// context.
   DocumentationCache? getDocumentationCacheFor(ResolvedUnitResult result) {
-    var context = result.session.analysisContext;
+    return getDocumentationCacheForSession(result.session);
+  }
+
+  /// Return the object used to cache the documentation for elements in the
+  /// context that produced the [session], or `null` if there is no cache for
+  /// the context.
+  DocumentationCache? getDocumentationCacheForSession(AnalysisSession session) {
+    var context = session.analysisContext;
     var tracker = declarationsTracker?.getContext(context);
     if (tracker == null) {
       return null;
@@ -368,14 +377,6 @@
     return element;
   }
 
-  /// Return the object used to cache information about extensions in the
-  /// context that produced the [result], or `null` if there is no cache for the
-  /// context.
-  ExtensionCache? getExtensionCacheFor(ResolvedUnitResult result) {
-    var context = result.session.analysisContext;
-    return extensionForContext.putIfAbsent(context, () => ExtensionCache());
-  }
-
   /// Return a [Future] that completes with the resolved [AstNode] at the
   /// given [offset] of the given [file], or with `null` if there is no node as
   /// the [offset].
@@ -416,7 +417,7 @@
     return driver
         .getResult(path, sendCachedToStream: sendCachedToStream)
         .then((value) => value is ResolvedUnitResult ? value : null)
-        .catchError((e, st) {
+        .catchError((Object e, StackTrace st) {
       instrumentationService.logException(e, st);
       return null;
     });
@@ -462,11 +463,37 @@
     contextManager.refresh();
   }
 
+  ResolvedForCompletionResultImpl? resolveForCompletion({
+    required String path,
+    required int offset,
+    required OperationPerformanceImpl performance,
+  }) {
+    if (!file_paths.isDart(resourceProvider.pathContext, path)) {
+      return null;
+    }
+
+    var driver = getAnalysisDriver(path);
+    if (driver == null) {
+      return null;
+    }
+
+    try {
+      return driver.resolveForCompletion(
+        path: path,
+        offset: offset,
+        performance: performance,
+      );
+    } catch (e, st) {
+      instrumentationService.logException(e, st);
+    }
+    return null;
+  }
+
   /// Sends an error notification to the user.
   void sendServerErrorNotification(
     String message,
-    dynamic exception,
-    /*StackTrace*/ stackTrace, {
+    Object exception,
+    StackTrace? stackTrace, {
     bool fatal = false,
   });
 
diff --git a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
index bfbc6ba..955e547 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -73,7 +73,6 @@
 /// standard input and standard output) to communicate with clients.
 class ByteStreamServerChannel implements ServerCommunicationChannel {
   final Stream _input;
-
   final IOSink _output;
 
   /// The instrumentation service that is to be used by this analysis server.
@@ -88,6 +87,20 @@
   /// True if [close] has been called.
   bool _closeRequested = false;
 
+  @override
+  late final Stream<Request> requests = _input
+      .transform(const Utf8Decoder())
+      .transform(const LineSplitter())
+      .transform(
+        StreamTransformer.fromHandlers(
+          handleData: _readRequest,
+          handleDone: (sink) {
+            close();
+            sink.close();
+          },
+        ),
+      );
+
   ByteStreamServerChannel(
       this._input, this._output, this._instrumentationService,
       {RequestStatisticsHelper? requestStatistics})
@@ -110,17 +123,6 @@
   }
 
   @override
-  void listen(void Function(Request request) onRequest,
-      {Function? onError, void Function()? onDone}) {
-    _input.transform(const Utf8Decoder()).transform(LineSplitter()).listen(
-        (String data) => _readRequest(data, onRequest),
-        onError: onError, onDone: () {
-      close();
-      onDone?.call();
-    });
-  }
-
-  @override
   void sendNotification(Notification notification) {
     // Don't send any further notifications after the communication channel is
     // closed.
@@ -159,7 +161,7 @@
 
   /// Read a request from the given [data] and use the given function to handle
   /// the request.
-  void _readRequest(String data, void Function(Request request) onRequest) {
+  void _readRequest(String data, Sink<Request> sink) {
     // Ignore any further requests after the communication channel is closed.
     if (_closed.isCompleted) {
       return;
@@ -173,6 +175,6 @@
       return;
     }
     _requestStatistics?.addRequest(request);
-    onRequest(request);
+    sink.add(request);
   }
 }
diff --git a/pkg/analysis_server/lib/src/channel/channel.dart b/pkg/analysis_server/lib/src/channel/channel.dart
index 6b5e95f..37a6e86 100644
--- a/pkg/analysis_server/lib/src/channel/channel.dart
+++ b/pkg/analysis_server/lib/src/channel/channel.dart
@@ -98,17 +98,12 @@
 /// objects that allow an [AnalysisServer] to receive [Request]s and to return
 /// both [Response]s and [Notification]s.
 abstract class ServerCommunicationChannel {
+  /// The single-subscription stream of requests.
+  Stream<Request> get requests;
+
   /// Close the communication channel.
   void close();
 
-  /// Listen to the channel for requests. If a request is received, invoke the
-  /// [onRequest] function. If an error is encountered while trying to read from
-  /// the socket, invoke the [onError] function. If the socket is closed by the
-  /// client, invoke the [onDone] function.
-  /// Only one listener is allowed per channel.
-  void listen(void Function(Request request) onRequest,
-      {Function onError, void Function() onDone});
-
   /// Send the given [notification] to the client.
   void sendNotification(Notification notification);
 
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 17f00da..4f6aaaa3 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -70,7 +70,7 @@
       var lineInfo = resolvedUnit.lineInfo;
       var offset = lineInfo.getOffsetOfLine(line) + column;
 
-      _dartCompletionRequest = DartCompletionRequest(
+      _dartCompletionRequest = DartCompletionRequest.forResolvedUnit(
         resolvedUnit: resolvedUnit,
         offset: offset,
       );
diff --git a/pkg/analysis_server/lib/src/cider/fixes.dart b/pkg/analysis_server/lib/src/cider/fixes.dart
index b3898bd..6b65f24 100644
--- a/pkg/analysis_server/lib/src/cider/fixes.dart
+++ b/pkg/analysis_server/lib/src/cider/fixes.dart
@@ -7,12 +7,14 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/instrumentation/service.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/dart/micro/library_graph.dart' as cider;
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
 class CiderErrorFixes {
   final AnalysisError error;
@@ -47,12 +49,11 @@
         var errorLine = lineInfo.getLocation(error.offset).lineNumber;
         if (errorLine == lineNumber) {
           var workspace = DartChangeWorkspace([resolvedUnit.session]);
-          var context = DartFixContextImpl(
-            InstrumentationService.NULL_SERVICE,
+          var context = _CiderDartFixContextImpl(
+            _fileResolver,
             workspace,
             resolvedUnit,
             error,
-            _topLevelDeclarations,
           );
 
           var fixes = await DartFixContributor().computeFixes(context);
@@ -67,33 +68,36 @@
 
     return result;
   }
+}
 
-  List<TopLevelDeclaration> _topLevelDeclarations(String name) {
-    var result = <TopLevelDeclaration>[];
+class _CiderDartFixContextImpl extends DartFixContextImpl {
+  final FileResolver _fileResolver;
+
+  _CiderDartFixContextImpl(
+    this._fileResolver,
+    ChangeWorkspace workspace,
+    ResolvedUnitResult resolvedUnit,
+    AnalysisError error,
+  ) : super(InstrumentationService.NULL_SERVICE, workspace, resolvedUnit,
+            error);
+
+  @override
+  Future<Map<LibraryElement, Element>> getTopLevelDeclarations(
+    String name,
+  ) async {
+    var result = <LibraryElement, Element>{};
     var files = _fileResolver.getFilesWithTopLevelDeclarations(name);
-    for (var fileWithKind in files) {
-      void addDeclaration(TopLevelDeclarationKind kind) {
-        var file = fileWithKind.file;
-        result.add(
-          TopLevelDeclaration(file.path, file.uri, kind, name, false),
+    for (var file in files) {
+      if (file.partOfLibrary == null) {
+        var libraryElement = _fileResolver.getLibraryByUri(
+          uriStr: file.uriStr,
         );
-      }
-
-      switch (fileWithKind.kind) {
-        case cider.FileTopLevelDeclarationKind.extension:
-          addDeclaration(TopLevelDeclarationKind.extension);
-          break;
-        case cider.FileTopLevelDeclarationKind.function:
-          addDeclaration(TopLevelDeclarationKind.function);
-          break;
-        case cider.FileTopLevelDeclarationKind.type:
-          addDeclaration(TopLevelDeclarationKind.type);
-          break;
-        case cider.FileTopLevelDeclarationKind.variable:
-          addDeclaration(TopLevelDeclarationKind.variable);
-          break;
+        TopLevelDeclarations.addElement(result, libraryElement, name);
       }
     }
     return result;
   }
+
+  @override
+  Stream<LibraryElement> librariesWithExtensions(String memberName) async* {}
 }
diff --git a/pkg/analysis_server/lib/src/cider/rename.dart b/pkg/analysis_server/lib/src/cider/rename.dart
index 6ff6528..0b7a0fc 100644
--- a/pkg/analysis_server/lib/src/cider/rename.dart
+++ b/pkg/analysis_server/lib/src/cider/rename.dart
@@ -5,26 +5,105 @@
 import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
 import 'package:analyzer/src/dart/micro/utils.dart';
+import 'package:analyzer/src/utilities/extensions/collection.dart';
 
 class CanRenameResponse {
   final LineInfo lineInfo;
   final RenameRefactoringElement refactoringElement;
-  final String oldName;
+  final FileResolver _fileResolver;
+  final String filePath;
 
-  CanRenameResponse(this.lineInfo, this.refactoringElement, this.oldName);
+  FlutterWidgetState? _flutterWidgetState;
+
+  CanRenameResponse(this.lineInfo, this.refactoringElement, this._fileResolver,
+      this.filePath);
+
+  String get oldName => refactoringElement.element.displayName;
+
+  CheckNameResponse? checkNewName(String name) {
+    var element = refactoringElement.element;
+    _flutterWidgetState = _findFlutterStateClass(element, name);
+
+    RefactoringStatus? status;
+    if (element is LocalVariableElement) {
+      status = validateVariableName(name);
+    } else if (element is ParameterElement) {
+      status = validateParameterName(name);
+    } else if (element is FunctionElement) {
+      status = validateFunctionName(name);
+    } else if (element is TopLevelVariableElement) {
+      status = validateVariableName(name);
+    } else if (element is TypeAliasElement) {
+      status = validateTypeAliasName(name);
+    } else if (element is ClassElement) {
+      status = validateClassName(name);
+    } else if (status == null) {
+      return null;
+    }
+    return CheckNameResponse(status, this);
+  }
+
+  FlutterWidgetState? _findFlutterStateClass(Element element, String newName) {
+    if (Flutter.instance.isStatefulWidgetDeclaration(element)) {
+      var oldStateName = element.displayName + 'State';
+      var library = element.library!;
+      var state =
+          library.getType(oldStateName) ?? library.getType('_' + oldStateName);
+      if (state != null) {
+        var flutterWidgetStateNewName = newName + 'State';
+        // If the State was private, ensure that it stays private.
+        if (state.name.startsWith('_') &&
+            !flutterWidgetStateNewName.startsWith('_')) {
+          flutterWidgetStateNewName = '_' + flutterWidgetStateNewName;
+        }
+        return FlutterWidgetState(state, flutterWidgetStateNewName);
+      }
+    }
+    return null;
+  }
 }
 
 class CheckNameResponse {
-  final LineInfo lineInfo;
   final RefactoringStatus status;
-  final String oldName;
+  final CanRenameResponse canRename;
 
-  CheckNameResponse(this.lineInfo, this.status, this.oldName);
+  CheckNameResponse(this.status, this.canRename);
+
+  LineInfo get lineInfo => canRename.lineInfo;
+
+  String get oldName => canRename.refactoringElement.element.displayName;
+
+  RenameResponse? computeRenameRanges() {
+    var elements = <Element>[];
+    var element = canRename.refactoringElement.element;
+    if (element is PropertyInducingElement && element.isSynthetic) {
+      var property = element;
+      var getter = property.getter;
+      var setter = property.setter;
+      elements.addIfNotNull(getter);
+      elements.addIfNotNull(setter);
+    } else {
+      elements.add(element);
+    }
+    var matches = <CiderSearchMatch>[];
+    for (var element in elements) {
+      matches.addAll(canRename._fileResolver.findReferences(element));
+    }
+
+    FlutterWidgetRename? flutterRename;
+    if (canRename._flutterWidgetState != null) {
+      var stateWidget = canRename._flutterWidgetState!;
+      var match = canRename._fileResolver.findReferences(stateWidget.state);
+      flutterRename = FlutterWidgetRename(stateWidget.newName, match);
+    }
+    return RenameResponse(matches, this, flutterWidgetRename: flutterRename);
+  }
 }
 
 class CiderRenameComputer {
@@ -45,61 +124,62 @@
     if (node == null || element == null) {
       return null;
     }
-    if (element.source != null && element.source!.isInSystemLibrary) {
+    if (element.source != null && element.source!.uri.isScheme('dart')) {
       return null;
     }
     if (element is MethodElement && element.isOperator) {
       return null;
     }
+    if (element is PropertyAccessorElement) {
+      element = element.variable;
+    }
     if (!_canRenameElement(element)) {
       return null;
     }
     var refactoring = RenameRefactoring.getElementToRename(node, element);
     if (refactoring != null) {
-      return CanRenameResponse(lineInfo, refactoring, element.displayName);
+      return CanRenameResponse(lineInfo, refactoring, _fileResolver, filePath);
     }
     return null;
   }
 
-  CheckNameResponse? checkNewName(
-      String filePath, int line, int column, String name) {
-    var resolvedUnit = _fileResolver.resolve(path: filePath);
-    var lineInfo = resolvedUnit.lineInfo;
-    var offset = lineInfo.getOffsetOfLine(line) + column;
-
-    var node = NodeLocator(offset).searchWithin(resolvedUnit.unit);
-    var element = getElementOfNode(node);
-
-    if (node == null || element == null) {
-      return null;
-    }
-
-    RefactoringStatus? status;
-    if (element is LocalVariableElement) {
-      status = validateVariableName(name);
-    } else if (element is ParameterElement) {
-      status = validateParameterName(name);
-    } else if (element is FunctionElement) {
-      status = validateFunctionName(name);
-    }
-    if (status == null) {
-      return null;
-    }
-    return CheckNameResponse(lineInfo, status, element.displayName);
-  }
-
   bool _canRenameElement(Element element) {
-    if (element is PropertyAccessorElement) {
-      element = element.variable;
-    }
     var enclosingElement = element.enclosingElement;
+    if (element is ConstructorElement) {
+      return false;
+    }
     if (element is LabelElement || element is LocalElement) {
       return true;
     }
     if (enclosingElement is ClassElement ||
-        enclosingElement is ExtensionElement) {
+        enclosingElement is ExtensionElement ||
+        enclosingElement is CompilationUnitElement) {
       return true;
     }
+
     return false;
   }
 }
+
+class FlutterWidgetRename {
+  final String name;
+  final List<CiderSearchMatch> matches;
+
+  FlutterWidgetRename(this.name, this.matches);
+}
+
+/// The corresponding `State` declaration of a  Flutter `StatefulWidget`.
+class FlutterWidgetState {
+  ClassElement state;
+  String newName;
+
+  FlutterWidgetState(this.state, this.newName);
+}
+
+class RenameResponse {
+  final List<CiderSearchMatch> matches;
+  final CheckNameResponse checkName;
+  FlutterWidgetRename? flutterWidgetRename;
+
+  RenameResponse(this.matches, this.checkName, {this.flutterWidgetRename});
+}
diff --git a/pkg/analysis_server/lib/src/cider/signature_help.dart b/pkg/analysis_server/lib/src/cider/signature_help.dart
new file mode 100644
index 0000000..6b3616a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/cider/signature_help.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/computer/computer_signature.dart';
+import 'package:analysis_server/src/computer/computer_type_arguments_signature.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/micro/resolve_file.dart';
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
+
+class CiderSignatureHelpComputer {
+  final FileResolver _fileResolver;
+
+  CiderSignatureHelpComputer(this._fileResolver);
+
+  SignatureHelpResponse? compute(String filePath, int line, int column) {
+    var resolvedUnit = _fileResolver.resolve(path: filePath);
+    var lineInfo = resolvedUnit.lineInfo;
+    var offset = lineInfo.getOffsetOfLine(line) + column;
+    final formats = <MarkupKind>{MarkupKind.Markdown};
+
+    var dartDocInfo = DartdocDirectiveInfo();
+    final typeArgsComputer = DartTypeArgumentsSignatureComputer(
+        dartDocInfo, resolvedUnit.unit, offset, formats);
+    if (typeArgsComputer.offsetIsValid) {
+      final typeSignature = typeArgsComputer.compute();
+
+      if (typeSignature != null) {
+        return SignatureHelpResponse(typeSignature,
+            lineInfo.getLocation(typeArgsComputer.argumentList.offset + 1));
+      }
+    }
+
+    final computer =
+        DartUnitSignatureComputer(dartDocInfo, resolvedUnit.unit, offset);
+    if (computer.offsetIsValid) {
+      final signature = computer.compute();
+      if (signature != null) {
+        return SignatureHelpResponse(toSignatureHelp(formats, signature),
+            lineInfo.getLocation(computer.argumentList.offset + 1));
+      }
+    }
+    return null;
+  }
+}
+
+class SignatureHelpResponse {
+  final SignatureHelp signatureHelp;
+
+  /// The location of the left parenthesis.
+  final CharacterLocation callStart;
+
+  SignatureHelpResponse(this.signatureHelp, this.callStart);
+}
diff --git a/pkg/analysis_server/lib/src/computer/computer_color.dart b/pkg/analysis_server/lib/src/computer/computer_color.dart
new file mode 100644
index 0000000..1026b0a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computer/computer_color.dart
@@ -0,0 +1,367 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/constant/value.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/constant/value.dart' show GenericState;
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/type_system.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:collection/collection.dart';
+
+/// Computer for dart:ui/Flutter Color references.
+class ColorComputer {
+  final ResolvedUnitResult resolvedUnit;
+  final LinterContext _linterContext;
+  final List<ColorReference> _colors = [];
+  final Flutter _flutter = Flutter.instance;
+
+  ColorComputer(this.resolvedUnit)
+      : _linterContext = LinterContextImpl(
+          [], // unused
+          LinterContextUnit(resolvedUnit.content, resolvedUnit.unit),
+          resolvedUnit.session.declaredVariables,
+          resolvedUnit.typeProvider,
+          resolvedUnit.typeSystem as TypeSystemImpl,
+          InheritanceManager3(), // unused
+          resolvedUnit.session.analysisContext.analysisOptions,
+          null,
+        );
+
+  /// Returns information about the color references in [resolvedUnit].
+  ///
+  /// This method should only be called once for any instance of this class.
+  List<ColorReference> compute() {
+    final visitor = _ColorBuilder(this);
+    resolvedUnit.unit.accept(visitor);
+    return _colors;
+  }
+
+  /// Tries to add a color for the [expression].
+  ///
+  /// If [target] is supplied, will be used instead of [expression] allowing
+  /// a value to be read from the member [memberName] or from a swatch value
+  /// with index [index].
+  bool tryAddColor(
+    Expression expression, {
+    Expression? target,
+    String? memberName,
+    int? index,
+  }) {
+    if (!_isColor(expression.staticType)) return false;
+
+    target ??= expression;
+
+    // Try to evaluate the constant target.
+    final colorConstResult = _linterContext.evaluateConstant(target);
+    var colorConst = colorConstResult.value;
+    if (colorConstResult.errors.isNotEmpty || colorConst == null) return false;
+
+    // If we want a specific member or swatch index, read that.
+    if (memberName != null) {
+      colorConst = _getMember(colorConst, memberName);
+    } else if (index != null) {
+      colorConst = _getSwatchValue(colorConst, index);
+    }
+
+    return _tryRecordColor(expression, colorConst);
+  }
+
+  /// Tries to add a color for the instance creation [expression].
+  ///
+  /// This handles constructor calls that cannot be evaluated (for example
+  /// because they are not const) but are simple well-known dart:ui/Flutter
+  /// color constructors that we can manually parse.
+  bool tryAddKnownColorConstructor(InstanceCreationExpression expression) {
+    if (!_isColor(expression.staticType)) return false;
+
+    final constructor = expression.constructorName;
+    final staticElement = constructor.staticElement;
+    final classElement = staticElement?.enclosingElement;
+    final className = classElement?.name;
+    final constructorName = constructor.name?.name;
+    final constructorArgs = expression.argumentList.arguments
+        .map((e) => e is Literal ? e : null)
+        .toList();
+
+    int? colorValue;
+    if (_isDartUi(classElement) && className == 'Color') {
+      colorValue = _getDartUiColorValue(constructorName, constructorArgs);
+    } else if (_isFlutterPainting(classElement) && className == 'ColorSwatch') {
+      colorValue =
+          _getFlutterSwatchColorValue(constructorName, constructorArgs);
+    } else if (_isFlutterMaterial(classElement) &&
+        className == 'MaterialAccentColor') {
+      colorValue =
+          _getFlutterMaterialAccentColorValue(constructorName, constructorArgs);
+    }
+
+    return _tryRecordColorValue(expression, colorValue);
+  }
+
+  /// Creates a [ColorInformation] by extracting the argb values from
+  /// [value] encoded as 0xAARRGGBB as in the dart:ui Color class.
+  ColorInformation _colorInformationForColorValue(int value) {
+    // Extract color information according to dart:ui Color values.
+    final alpha = (0xff000000 & value) >> 24;
+    final red = (0x00ff0000 & value) >> 16;
+    final blue = (0x000000ff & value) >> 0;
+    final green = (0x0000ff00 & value) >> 8;
+
+    return ColorInformation(alpha, red, green, blue);
+  }
+
+  /// Extracts the integer color value from the dart:ui Color constant [color].
+  int? _colorValueForColorConst(DartObject? color) {
+    if (color == null || color.isNull) return null;
+
+    // If the object has a "color" field, walk down to that, because some colors
+    // like CupertinoColors have a "value=0" with an overridden getter that
+    // would always result in a value representing black.
+    color = color.getFieldFromHierarchy('color') ?? color;
+
+    return color.getFieldFromHierarchy('value')?.toIntValue();
+  }
+
+  /// Converts ARGB values into a single int value as 0xAARRGGBB as used by
+  /// the dart:ui Color class.
+  int _colorValueForComponents(int alpha, int red, int green, int blue) {
+    return (alpha << 24) | (red << 16) | (green << 8) | (blue << 0);
+  }
+
+  /// Extracts the color value from dart:ui Color constructor args.
+  int? _getDartUiColorValue(String? name, List<Literal?> args) {
+    if (name == null && args.length == 1) {
+      final arg0 = args[0];
+      return arg0 is IntegerLiteral ? arg0.value : null;
+    } else if (name == 'fromARGB' && args.length == 4) {
+      final arg0 = args[0];
+      final arg1 = args[1];
+      final arg2 = args[2];
+      final arg3 = args[3];
+
+      final alpha = arg0 is IntegerLiteral ? arg0.value : null;
+      final red = arg1 is IntegerLiteral ? arg1.value : null;
+      final green = arg2 is IntegerLiteral ? arg2.value : null;
+      final blue = arg3 is IntegerLiteral ? arg3.value : null;
+
+      return alpha != null && red != null && green != null && blue != null
+          ? _colorValueForComponents(alpha, red, green, blue)
+          : null;
+    } else if (name == 'fromRGBO' && args.length == 4) {
+      final arg0 = args[0];
+      final arg1 = args[1];
+      final arg2 = args[2];
+      final arg3 = args[3];
+
+      final red = arg0 is IntegerLiteral ? arg0.value : null;
+      final green = arg1 is IntegerLiteral ? arg1.value : null;
+      final blue = arg2 is IntegerLiteral ? arg2.value : null;
+      final opacity = arg3 is IntegerLiteral
+          ? arg3.value
+          : arg3 is DoubleLiteral
+              ? arg3.value
+              : null;
+      final alpha = opacity != null ? (opacity * 255).toInt() : null;
+
+      return alpha != null && red != null && green != null && blue != null
+          ? _colorValueForComponents(alpha, red, green, blue)
+          : null;
+    } else {
+      return null;
+    }
+  }
+
+  /// Extracts the color value from Flutter MaterialAccentColor constructor args.
+  int? _getFlutterMaterialAccentColorValue(String? name, List<Literal?> args) =>
+      // MaterialAccentColor is a subclass of SwatchColor and has the same
+      // constructor.
+      _getFlutterSwatchColorValue(name, args);
+
+  /// Extracts the color value from Flutter ColorSwatch constructor args.
+  int? _getFlutterSwatchColorValue(String? name, List<Literal?> args) {
+    if (name == null && args.isNotEmpty) {
+      final arg0 = args[0];
+      return arg0 is IntegerLiteral ? arg0.value : null;
+    } else {
+      return null;
+    }
+  }
+
+  /// Extracts a named member from a color.
+  ///
+  /// Well-known getters like `shade500` will be mapped onto the swatch value
+  /// with a matching index.
+  DartObject? _getMember(DartObject target, String memberName) {
+    final colorValue = target.getFieldFromHierarchy(memberName);
+    if (colorValue != null) {
+      return colorValue;
+    }
+
+    // If we didn't get a value but it's a getter we know how to read from a
+    // swatch, try that.
+    if (memberName.startsWith('shade')) {
+      final shadeNumber = int.tryParse(memberName.substring(5));
+      if (shadeNumber != null) {
+        return _getSwatchValue(target, shadeNumber);
+      }
+    }
+
+    return null;
+  }
+
+  /// Extracts a specific shade index from a Flutter SwatchColor.
+  DartObject? _getSwatchValue(DartObject target, int swatchValue) {
+    final swatch = target.getFieldFromHierarchy('_swatch')?.toMapValue();
+    if (swatch == null) return null;
+
+    final key = swatch.keys.firstWhereOrNull(
+      (key) => key?.toIntValue() == swatchValue,
+    );
+    if (key == null) return null;
+
+    return swatch[key];
+  }
+
+  /// Checks whether [type] is - or extends - the dart:ui Color class.
+  bool _isColor(DartType? type) => type != null && _flutter.isColor(type);
+
+  /// Checks whether this elements library is dart:ui.
+  bool _isDartUi(Element? element) => element?.library?.name == 'dart.ui';
+
+  /// Checks whether this elements library is Flutter Material colors.
+  bool _isFlutterMaterial(Element? element) =>
+      element?.library?.identifier ==
+      'package:flutter/src/material/colors.dart';
+
+  /// Checks whether this elements library is Flutter Painting colors.
+  bool _isFlutterPainting(Element? element) =>
+      element?.library?.identifier ==
+      'package:flutter/src/painting/colors.dart';
+
+  /// Tries to record a color value from [colorConst] for [expression].
+  ///
+  /// Returns whether a valid color was found and recorded.
+  bool _tryRecordColor(Expression expression, DartObject? colorConst) =>
+      _tryRecordColorValue(expression, _colorValueForColorConst(colorConst));
+
+  /// Tries to record the [colorValue] for [expression].
+  ///
+  /// Returns whether a valid color was found and recorded.
+  bool _tryRecordColorValue(Expression expression, int? colorValue) {
+    if (colorValue == null) return false;
+
+    // Build color information from the Color value.
+    final color = _colorInformationForColorValue(colorValue);
+
+    // Record the color against the original entire expression.
+    _colors.add(ColorReference(expression.offset, expression.length, color));
+    return true;
+  }
+}
+
+/// Information about a color that is present in a document.
+class ColorInformation {
+  final int alpha;
+  final int red;
+  final int green;
+  final int blue;
+
+  ColorInformation(this.alpha, this.red, this.green, this.blue);
+}
+
+/// Information about a specific known location of a [ColorInformation]
+/// reference in a document.
+class ColorReference {
+  final int offset;
+  final int length;
+  final ColorInformation color;
+
+  ColorReference(this.offset, this.length, this.color);
+}
+
+class _ColorBuilder extends RecursiveAstVisitor<void> {
+  final ColorComputer computer;
+
+  _ColorBuilder(this.computer);
+
+  @override
+  void visitIndexExpression(IndexExpression node) {
+    // Colors.redAccent[500].
+    final index = node.index;
+    final indexValue = index is IntegerLiteral ? index.value : null;
+    if (indexValue != null) {
+      if (computer.tryAddColor(
+        node,
+        target: node.realTarget,
+        index: indexValue,
+      )) {
+        return;
+      }
+    }
+    super.visitIndexExpression(node);
+  }
+
+  @override
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
+    // Usually we return after finding a color, but constructors can
+    // have nested colors in their arguments so we walk all the way down.
+    if (!computer.tryAddColor(node)) {
+      // If we couldn't evaluate the constant, try the well-known color
+      // constructors for dart:ui/Flutter.
+      computer.tryAddKnownColorConstructor(node);
+    }
+
+    super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
+    // Try the whole node as a constant (eg. `MyThemeClass.staticField`).
+    if (computer.tryAddColor(node)) {
+      return;
+    }
+
+    // Try a field of a static, (eg. `const MyThemeClass().instanceField`).
+    if (computer.tryAddColor(
+      node,
+      target: node.prefix,
+      memberName: node.identifier.name,
+    )) {
+      return;
+    }
+
+    super.visitPrefixedIdentifier(node);
+  }
+
+  @override
+  void visitPropertyAccess(PropertyAccess node) {
+    // Handle things like CupterinoColors.activeBlue.darkColor where we can't
+    // evaluate the whole expression, but can evaluate CupterinoColors.activeBlue
+    // and read the darkColor.
+    if (computer.tryAddColor(
+      node,
+      target: node.realTarget,
+      memberName: node.propertyName.name,
+    )) {
+      return;
+    }
+
+    super.visitPropertyAccess(node);
+  }
+}
+
+extension _DartObjectExtensions on DartObject {
+  /// Reads the value of the field [field] from this object.
+  ///
+  /// If the field is not found, recurses up the super classes.
+  DartObject? getFieldFromHierarchy(String fieldName) =>
+      getField(fieldName) ??
+      getField(GenericState.SUPERCLASS_FIELD)?.getFieldFromHierarchy(fieldName);
+}
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 1f568f7..ceb6b14 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -15,10 +15,8 @@
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/file_content_cache.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/pub.dart';
 import 'package:analyzer/src/manifest/manifest_validator.dart';
@@ -222,7 +220,7 @@
       this._performanceLog,
       this._scheduler,
       this._instrumentationService,
-      {required enableBazelWatcher})
+      {required bool enableBazelWatcher})
       : pathContext = resourceProvider.pathContext {
     if (enableBazelWatcher) {
       bazelWatcherService = BazelFileWatcherService(_instrumentationService);
@@ -280,7 +278,7 @@
     var convertedErrors = const <protocol.AnalysisError>[];
     try {
       var content = _readFile(path);
-      var lineInfo = _computeLineInfo(content);
+      var lineInfo = LineInfo.fromContent(content);
       var errors = analyzeAnalysisOptions(
         resourceProvider.getFile(path).createSource(),
         content,
@@ -305,7 +303,7 @@
       var content = _readFile(path);
       var validator =
           ManifestValidator(resourceProvider.getFile(path).createSource());
-      var lineInfo = _computeLineInfo(content);
+      var lineInfo = LineInfo.fromContent(content);
       var errors = validator.validate(
           content, driver.analysisOptions.chromeOsManifestChecks);
       var converter = AnalyzerConverter();
@@ -332,7 +330,8 @@
       parser.parse(content);
       var converter = AnalyzerConverter();
       convertedErrors = converter.convertAnalysisErrors(errorListener.errors,
-          lineInfo: _computeLineInfo(content), options: driver.analysisOptions);
+          lineInfo: LineInfo.fromContent(content),
+          options: driver.analysisOptions);
     } catch (exception) {
       // If the file cannot be analyzed, fall through to clear any previous
       // errors.
@@ -350,7 +349,7 @@
       if (node is YamlMap) {
         var validator = PubspecValidator(
             resourceProvider, resourceProvider.getFile(path).createSource());
-        var lineInfo = _computeLineInfo(content);
+        var lineInfo = LineInfo.fromContent(content);
         var errors = validator.validate(node.nodes);
         var converter = AnalyzerConverter();
         convertedErrors = converter.convertAnalysisErrors(errors,
@@ -413,12 +412,6 @@
     }
   }
 
-  /// Compute line information for the given [content].
-  LineInfo _computeLineInfo(String content) {
-    var lineStarts = StringUtilities.computeLineStarts(content);
-    return LineInfo(lineStarts);
-  }
-
   void _createAnalysisContexts() {
     _destroyAnalysisContexts();
     _fileContentCache.invalidateAll();
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 1595e38..d079a6b 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -13,6 +13,7 @@
 import 'package:analysis_server/src/plugin/result_merger.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/generated/engine.dart' as engine;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -254,7 +255,8 @@
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == ANALYSIS_REQUEST_GET_ERRORS) {
diff --git a/pkg/analysis_server/lib/src/domain_analytics.dart b/pkg/analysis_server/lib/src/domain_analytics.dart
index 66df103..cec9fa8 100644
--- a/pkg/analysis_server/lib/src/domain_analytics.dart
+++ b/pkg/analysis_server/lib/src/domain_analytics.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:telemetry/telemetry.dart';
 
 /// Instances of the class [AnalyticsDomainHandler] implement a [RequestHandler]
@@ -34,7 +35,8 @@
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     var requestName = request.method;
 
     if (requestName == ANALYTICS_REQUEST_IS_ENABLED) {
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index b1b2b36..661049b 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
@@ -16,10 +17,12 @@
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/fuzzy_filter_sort.dart';
+import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/yaml/analysis_options_generator.dart';
 import 'package:analysis_server/src/services/completion/yaml/fix_data_generator.dart';
 import 'package:analysis_server/src/services/completion/yaml/pubspec_generator.dart';
 import 'package:analysis_server/src/services/completion/yaml/yaml_completion_generator.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -29,6 +32,7 @@
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:collection/collection.dart';
 
 /// Instances of the class [CompletionDomainHandler] implement a
 /// [RequestHandler] that handles requests in the completion domain.
@@ -45,9 +49,6 @@
   /// The next completion response id.
   int _nextCompletionId = 0;
 
-  /// Code completion performance for the last completion operation.
-  CompletionPerformance? performance;
-
   /// A list of code completion performance measurements for the latest
   /// completion operation up to [performanceListMaxLength] measurements.
   final RecentBuffer<CompletionPerformance> performanceList =
@@ -75,7 +76,7 @@
     Set<ElementKind>? includedElementKinds,
     Set<String>? includedElementNames,
     List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags,
-    List<Uri>? librariesToImport,
+    Map<CompletionSuggestion, Uri>? notImportedSuggestions,
   }) async {
     //
     // Allow plugins to start computing fixes.
@@ -94,7 +95,7 @@
         includedElementKinds: includedElementKinds,
         includedElementNames: includedElementNames,
         includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
-        librariesToImport: librariesToImport,
+        notImportedSuggestions: notImportedSuggestions,
       );
 
       suggestions.addAll(
@@ -267,16 +268,34 @@
 
   /// Implement the 'completion.getSuggestions2' request.
   void getSuggestions2(Request request) async {
-    var budget = CompletionBudget(budgetDuration);
-
     var params = CompletionGetSuggestions2Params.fromRequest(request);
     var file = params.file;
     var offset = params.offset;
 
+    var timeoutMilliseconds = params.timeout;
+    var budget = CompletionBudget(
+      timeoutMilliseconds != null
+          ? Duration(milliseconds: timeoutMilliseconds)
+          : budgetDuration,
+    );
+
     var provider = server.resourceProvider;
     var pathContext = provider.pathContext;
 
-    // TODO(scheglov) Support non-Dart files.
+    if (file.endsWith('.yaml')) {
+      final suggestions = computeYamlSuggestions(file, offset);
+      server.sendResponse(
+        CompletionGetSuggestions2Result(
+          suggestions.replacementOffset,
+          suggestions.replacementLength,
+          suggestions.suggestions,
+          [],
+          false,
+        ).toResponse(request.id),
+      );
+      return;
+    }
+
     if (!file_paths.isDart(pathContext, file)) {
       server.sendResponse(
         CompletionGetSuggestions2Result(offset, 0, [], [], false)
@@ -285,85 +304,130 @@
       return;
     }
 
-    var resolvedUnit = await server.getResolvedUnit(file);
-    if (resolvedUnit == null) {
-      server.sendResponse(Response.fileNotAnalyzed(request, file));
-      return;
-    }
-
-    server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
-
-    if (offset < 0 || offset > resolvedUnit.content.length) {
-      server.sendResponse(Response.invalidParameter(
-          request,
-          'params.offset',
-          'Expected offset between 0 and source length inclusive,'
-              ' but found $offset'));
-      return;
-    }
-
-    final completionPerformance = CompletionPerformance();
-    recordRequest(completionPerformance, file, resolvedUnit.content, offset);
-
-    await completionPerformance.runRequestOperation((performance) async {
-      var completionRequest = DartCompletionRequest(
-        resolvedUnit: resolvedUnit,
-        offset: offset,
-        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
-          resolvedUnit,
-        ),
-        documentationCache: server.getDocumentationCacheFor(resolvedUnit),
-      );
-      setNewRequest(completionRequest);
-
-      var librariesToImport = <Uri>[];
-      var suggestions = <CompletionSuggestion>[];
-      try {
-        suggestions = await computeSuggestions(
-          budget: budget,
-          performance: performance,
-          request: completionRequest,
-          librariesToImport: librariesToImport,
+    var performance = OperationPerformanceImpl('<root>');
+    performance.runAsync(
+      'request',
+      (performance) async {
+        var resolvedUnit = performance.run(
+          'resolveForCompletion',
+          (performance) {
+            return server.resolveForCompletion(
+              path: file,
+              offset: offset,
+              performance: performance,
+            );
+          },
         );
-      } on AbortCompletion {
-        return server.sendResponse(
-          CompletionGetSuggestions2Result(
-            completionRequest.replacementOffset,
-            completionRequest.replacementLength,
-            [],
-            [],
-            true,
-          ).toResponse(request.id),
+        if (resolvedUnit == null) {
+          server.sendResponse(Response.fileNotAnalyzed(request, file));
+          return;
+        }
+
+        if (offset < 0 || offset > resolvedUnit.content.length) {
+          server.sendResponse(Response.invalidParameter(
+              request,
+              'params.offset',
+              'Expected offset between 0 and source length inclusive,'
+                  ' but found $offset'));
+          return;
+        }
+
+        final completionPerformance = CompletionPerformance(
+          operation: performance,
+          path: file,
+          content: resolvedUnit.content,
+          offset: offset,
         );
-      }
+        performanceList.add(completionPerformance);
 
-      performance.run('filter', (performance) {
-        performance.getDataInt('count').add(suggestions.length);
-        suggestions = fuzzyFilterSort(
-          pattern: completionRequest.targetPrefix,
-          suggestions: suggestions,
+        var analysisSession = resolvedUnit.analysisSession;
+        var enclosingNode =
+            resolvedUnit.resolvedNodes.lastOrNull ?? resolvedUnit.parsedUnit;
+
+        var completionRequest = DartCompletionRequest(
+          analysisSession: analysisSession,
+          filePath: resolvedUnit.path,
+          fileContent: resolvedUnit.content,
+          unitElement: resolvedUnit.unitElement,
+          enclosingNode: enclosingNode,
+          offset: offset,
+          dartdocDirectiveInfo:
+              server.getDartdocDirectiveInfoForSession(analysisSession),
+          documentationCache:
+              server.getDocumentationCacheForSession(analysisSession),
         );
-        performance.getDataInt('matchCount').add(suggestions.length);
-      });
+        setNewRequest(completionRequest);
 
-      var lengthRestricted = suggestions.take(params.maxResults).toList();
-      var isIncomplete = lengthRestricted.length < suggestions.length;
-      completionPerformance.suggestionCount = lengthRestricted.length;
+        var notImportedSuggestions =
+            HashMap<CompletionSuggestion, Uri>.identity();
+        var suggestions = <CompletionSuggestion>[];
+        try {
+          suggestions = await computeSuggestions(
+            budget: budget,
+            performance: performance,
+            request: completionRequest,
+            notImportedSuggestions: notImportedSuggestions,
+          );
+        } on AbortCompletion {
+          return server.sendResponse(
+            CompletionGetSuggestions2Result(
+              completionRequest.replacementOffset,
+              completionRequest.replacementLength,
+              [],
+              [],
+              true,
+            ).toResponse(request.id),
+          );
+        }
 
-      server.sendResponse(
-        CompletionGetSuggestions2Result(
-          completionRequest.replacementOffset,
-          completionRequest.replacementLength,
-          lengthRestricted,
-          librariesToImport.map((e) => '$e').toList(),
-          isIncomplete,
-        ).toResponse(request.id),
-      );
-    });
+        performance.run('filter', (performance) {
+          performance.getDataInt('count').add(suggestions.length);
+          suggestions = fuzzyFilterSort(
+            pattern: completionRequest.targetPrefix,
+            suggestions: suggestions,
+          );
+          performance.getDataInt('matchCount').add(suggestions.length);
+        });
+
+        var lengthRestricted = suggestions.take(params.maxResults).toList();
+        var isIncomplete = lengthRestricted.length < suggestions.length;
+        completionPerformance.suggestionCount = lengthRestricted.length;
+
+        // Update `libraryUriToImportIndex` for not yet imported.
+        // Gather referenced unique libraries to import.
+        var librariesToImport = <Uri, int>{};
+        for (var i = 0; i < lengthRestricted.length; i++) {
+          var suggestion = lengthRestricted[i];
+          var libraryToImport = notImportedSuggestions[suggestion];
+          if (libraryToImport != null) {
+            var index = librariesToImport.putIfAbsent(
+              libraryToImport,
+              () => librariesToImport.length,
+            );
+            lengthRestricted[i] = suggestion.copyWith(
+              libraryUriToImportIndex: CopyWithValue(index),
+            );
+          }
+        }
+
+        performance.run('sendResponse', (_) {
+          server.sendResponse(
+            CompletionGetSuggestions2Result(
+              completionRequest.replacementOffset,
+              completionRequest.replacementLength,
+              lengthRestricted,
+              librariesToImport.keys.map((e) => '$e').toList(),
+              isIncomplete,
+            ).toResponse(request.id),
+          );
+        });
+      },
+    );
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     if (!server.options.featureSet.completion) {
       return Response.invalidParameter(
         request,
@@ -410,161 +474,159 @@
   Future<void> processRequest(Request request) async {
     var budget = CompletionBudget(budgetDuration);
 
-    final performance = this.performance = CompletionPerformance();
+    // extract and validate params
+    var params = CompletionGetSuggestionsParams.fromRequest(request);
+    var file = params.file;
+    var offset = params.offset;
 
-    await performance.runRequestOperation((perf) async {
-      // extract and validate params
-      var params = CompletionGetSuggestionsParams.fromRequest(request);
-      var file = params.file;
-      var offset = params.offset;
-
-      if (server.sendResponseErrorIfInvalidFilePath(request, file)) {
-        return;
-      }
-      if (file.endsWith('.yaml')) {
-        // Return the response without results.
-        var completionId = (_nextCompletionId++).toString();
-        server.sendResponse(CompletionGetSuggestionsResult(completionId)
-            .toResponse(request.id));
-        // Send a notification with results.
-        final suggestions = computeYamlSuggestions(file, offset);
-        sendCompletionNotification(
-          completionId,
-          suggestions.replacementOffset,
-          suggestions.replacementLength,
-          suggestions.suggestions,
-          null,
-          null,
-          null,
-          null,
-        );
-        return;
-      } else if (!file.endsWith('.dart')) {
-        // Return the response without results.
-        var completionId = (_nextCompletionId++).toString();
-        server.sendResponse(CompletionGetSuggestionsResult(completionId)
-            .toResponse(request.id));
-        // Send a notification with results.
-        sendCompletionNotification(
-            completionId, offset, 0, [], null, null, null, null);
-        return;
-      }
-
-      var resolvedUnit = await server.getResolvedUnit(file);
-      if (resolvedUnit == null) {
-        server.sendResponse(Response.fileNotAnalyzed(request, 'params.offset'));
-        return;
-      }
-
-      server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
-
-      if (offset < 0 || offset > resolvedUnit.content.length) {
-        server.sendResponse(Response.invalidParameter(
-            request,
-            'params.offset',
-            'Expected offset between 0 and source length inclusive,'
-                ' but found $offset'));
-        return;
-      }
-
-      recordRequest(performance, file, resolvedUnit.content, offset);
-
-      var declarationsTracker = server.declarationsTracker;
-      if (declarationsTracker == null) {
-        server.sendResponse(Response.unsupportedFeature(
-            request.id, 'Completion is not enabled.'));
-        return;
-      }
-
-      var completionRequest = DartCompletionRequest(
-        resolvedUnit: resolvedUnit,
-        offset: offset,
-        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
-          resolvedUnit,
-        ),
-        documentationCache: server.getDocumentationCacheFor(resolvedUnit),
-      );
-
-      var completionId = (_nextCompletionId++).toString();
-
-      setNewRequest(completionRequest);
-
-      // initial response without results
-      server.sendResponse(
-          CompletionGetSuggestionsResult(completionId).toResponse(request.id));
-
-      // If the client opted into using available suggestion sets,
-      // create the kinds set, so signal the completion manager about opt-in.
-      Set<ElementKind>? includedElementKinds;
-      Set<String>? includedElementNames;
-      List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
-      if (subscriptions.contains(CompletionService.AVAILABLE_SUGGESTION_SETS)) {
-        includedElementKinds = <ElementKind>{};
-        includedElementNames = <String>{};
-        includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
-      }
-
-      // Compute suggestions in the background
-      try {
-        var suggestions = <CompletionSuggestion>[];
-        try {
-          suggestions = await computeSuggestions(
-            budget: budget,
-            performance: perf,
-            request: completionRequest,
-            includedElementKinds: includedElementKinds,
-            includedElementNames: includedElementNames,
-            includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
-          );
-        } on AbortCompletion {
-          // Continue with empty suggestions list.
-        }
-        String? libraryFile;
-        var includedSuggestionSets = <IncludedSuggestionSet>[];
-        if (includedElementKinds != null && includedElementNames != null) {
-          libraryFile = resolvedUnit.libraryElement.source.fullName;
-          server.sendNotification(
-            createExistingImportsNotification(resolvedUnit),
-          );
-          computeIncludedSetList(
-            declarationsTracker,
-            resolvedUnit,
-            includedSuggestionSets,
-            includedElementNames,
-          );
-        }
-
-        const SEND_NOTIFICATION_TAG = 'send notification';
-        perf.run(SEND_NOTIFICATION_TAG, (_) {
-          sendCompletionNotification(
-            completionId,
-            completionRequest.replacementOffset,
-            completionRequest.replacementLength,
-            suggestions,
-            libraryFile,
-            includedSuggestionSets,
-            includedElementKinds?.toList(),
-            includedSuggestionRelevanceTags,
-          );
-        });
-
-        performance.suggestionCount = suggestions.length;
-      } finally {
-        ifMatchesRequestClear(completionRequest);
-      }
-    });
-  }
-
-  /// If tracking code completion performance over time, then
-  /// record addition information about the request in the performance record.
-  void recordRequest(CompletionPerformance performance, String path,
-      String content, int offset) {
-    performance.path = path;
-    if (performanceListMaxLength == 0) {
+    if (server.sendResponseErrorIfInvalidFilePath(request, file)) {
       return;
     }
-    performance.setContentsAndOffset(content, offset);
-    performanceList.add(performance);
+
+    var performance = OperationPerformanceImpl('<root>');
+    performance.runAsync(
+      'request',
+      (performance) async {
+        if (file.endsWith('.yaml')) {
+          // Return the response without results.
+          var completionId = (_nextCompletionId++).toString();
+          server.sendResponse(CompletionGetSuggestionsResult(completionId)
+              .toResponse(request.id));
+          // Send a notification with results.
+          final suggestions = computeYamlSuggestions(file, offset);
+          sendCompletionNotification(
+            completionId,
+            suggestions.replacementOffset,
+            suggestions.replacementLength,
+            suggestions.suggestions,
+            null,
+            null,
+            null,
+            null,
+          );
+          return;
+        } else if (!file.endsWith('.dart')) {
+          // Return the response without results.
+          var completionId = (_nextCompletionId++).toString();
+          server.sendResponse(CompletionGetSuggestionsResult(completionId)
+              .toResponse(request.id));
+          // Send a notification with results.
+          sendCompletionNotification(
+              completionId, offset, 0, [], null, null, null, null);
+          return;
+        }
+
+        var resolvedUnit = await server.getResolvedUnit(file);
+        if (resolvedUnit == null) {
+          server.sendResponse(Response.fileNotAnalyzed(request, file));
+          return;
+        }
+
+        server.requestStatistics?.addItemTimeNow(request, 'resolvedUnit');
+
+        if (offset < 0 || offset > resolvedUnit.content.length) {
+          server.sendResponse(Response.invalidParameter(
+              request,
+              'params.offset',
+              'Expected offset between 0 and source length inclusive,'
+                  ' but found $offset'));
+          return;
+        }
+
+        final completionPerformance = CompletionPerformance(
+          operation: performance,
+          path: file,
+          content: resolvedUnit.content,
+          offset: offset,
+        );
+        performanceList.add(completionPerformance);
+
+        var declarationsTracker = server.declarationsTracker;
+        if (declarationsTracker == null) {
+          server.sendResponse(Response.unsupportedFeature(
+              request.id, 'Completion is not enabled.'));
+          return;
+        }
+
+        var completionRequest = DartCompletionRequest.forResolvedUnit(
+          resolvedUnit: resolvedUnit,
+          offset: offset,
+          dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
+            resolvedUnit,
+          ),
+          documentationCache: server.getDocumentationCacheFor(resolvedUnit),
+        );
+
+        var completionId = (_nextCompletionId++).toString();
+
+        setNewRequest(completionRequest);
+
+        // initial response without results
+        server.sendResponse(CompletionGetSuggestionsResult(completionId)
+            .toResponse(request.id));
+
+        // If the client opted into using available suggestion sets,
+        // create the kinds set, so signal the completion manager about opt-in.
+        Set<ElementKind>? includedElementKinds;
+        Set<String>? includedElementNames;
+        List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
+        if (subscriptions
+            .contains(CompletionService.AVAILABLE_SUGGESTION_SETS)) {
+          includedElementKinds = <ElementKind>{};
+          includedElementNames = <String>{};
+          includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
+        }
+
+        // Compute suggestions in the background
+        try {
+          var suggestions = <CompletionSuggestion>[];
+          try {
+            suggestions = await computeSuggestions(
+              budget: budget,
+              performance: performance,
+              request: completionRequest,
+              includedElementKinds: includedElementKinds,
+              includedElementNames: includedElementNames,
+              includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
+            );
+          } on AbortCompletion {
+            // Continue with empty suggestions list.
+          }
+          String? libraryFile;
+          var includedSuggestionSets = <IncludedSuggestionSet>[];
+          if (includedElementKinds != null && includedElementNames != null) {
+            libraryFile = resolvedUnit.libraryElement.source.fullName;
+            server.sendNotification(
+              createExistingImportsNotification(resolvedUnit),
+            );
+            computeIncludedSetList(
+              declarationsTracker,
+              completionRequest,
+              includedSuggestionSets,
+              includedElementNames,
+            );
+          }
+
+          const SEND_NOTIFICATION_TAG = 'send notification';
+          performance.run(SEND_NOTIFICATION_TAG, (_) {
+            sendCompletionNotification(
+              completionId,
+              completionRequest.replacementOffset,
+              completionRequest.replacementLength,
+              suggestions,
+              libraryFile,
+              includedSuggestionSets,
+              includedElementKinds?.toList(),
+              includedSuggestionRelevanceTags,
+            );
+          });
+
+          completionPerformance.suggestionCount = suggestions.length;
+        } finally {
+          ifMatchesRequestClear(completionRequest);
+        }
+      },
+    );
   }
 
   /// Send completion notification results.
@@ -670,11 +732,8 @@
   _RequestToPlugins? _sendRequestToPlugins(
     DartCompletionRequest completionRequest,
   ) {
-    var resolvedUnit = completionRequest.result;
-    var analysisContext = resolvedUnit.session.analysisContext;
-
     var pluginRequestParameters = plugin.CompletionGetSuggestionsParams(
-      resolvedUnit.path,
+      completionRequest.path,
       completionRequest.offset,
     );
 
@@ -683,7 +742,7 @@
       parameters: pluginRequestParameters,
       futures: server.pluginManager.broadcastRequest(
         pluginRequestParameters,
-        contextRoot: analysisContext.contextRoot,
+        contextRoot: completionRequest.analysisContext.contextRoot,
       ),
     );
   }
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index 59056f2..117bec4 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 
 /// Instances of the class [DiagnosticDomainHandler] implement a
@@ -45,7 +46,8 @@
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == DIAGNOSTIC_REQUEST_GET_DIAGNOSTICS) {
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index f047af1..c1e1b35 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -7,8 +7,8 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source.dart';
 
 /// Instances of the class [ExecutionDomainHandler] implement a [RequestHandler]
 /// that handles requests in the `execution` domain.
@@ -69,7 +69,8 @@
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == EXECUTION_REQUEST_CREATE_CONTEXT) {
@@ -122,10 +123,10 @@
       }
 
       var source = driver.fsState.getFileForPath(file).source;
-      if (source.uriKind != UriKind.FILE_URI) {
+      if (!source.uri.isScheme('file')) {
         uri = source.uri.toString();
       } else {
-        uri = sourceFactory.restoreUri(source).toString();
+        uri = sourceFactory.pathToUri(file).toString();
       }
       return ExecutionMapUriResult(uri: uri).toResponse(request.id);
     } else if (uri != null) {
diff --git a/pkg/analysis_server/lib/src/domain_kythe.dart b/pkg/analysis_server/lib/src/domain_kythe.dart
index 0316e8f..0be62d1 100644
--- a/pkg/analysis_server/lib/src/domain_kythe.dart
+++ b/pkg/analysis_server/lib/src/domain_kythe.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/domain_abstract.dart';
 import 'package:analysis_server/src/plugin/result_merger.dart';
 import 'package:analysis_server/src/services/kythe/kythe_visitors.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -70,7 +71,8 @@
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == KYTHE_REQUEST_GET_KYTHE_ENTRIES) {
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 5dca197..54efa9a 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -6,6 +6,7 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 
 /// Instances of the class [ServerDomainHandler] implement a [RequestHandler]
 /// that handles requests in the server domain.
@@ -17,13 +18,23 @@
   /// [server].
   ServerDomainHandler(this.server);
 
+  Response cancelRequest(Request request) {
+    final id = ServerCancelRequestParams.fromRequest(request).id;
+    server.cancelRequest(id);
+
+    return ServerCancelRequestResult().toResponse(request.id);
+  }
+
   /// Return the version number of the analysis server.
   Response getVersion(Request request) {
-    return ServerGetVersionResult(PROTOCOL_VERSION).toResponse(request.id);
+    return ServerGetVersionResult(
+      server.options.reportProtocolVersion ?? PROTOCOL_VERSION,
+    ).toResponse(request.id);
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == SERVER_REQUEST_GET_VERSION) {
@@ -33,6 +44,8 @@
       } else if (requestName == SERVER_REQUEST_SHUTDOWN) {
         shutdown(request);
         return Response.DELAYED_RESPONSE;
+      } else if (requestName == SERVER_REQUEST_CANCEL_REQUEST) {
+        return cancelRequest(request);
       }
     } on RequestFailure catch (exception) {
       return exception.response;
diff --git a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
index 1d4b4b5..e8838ce 100644
--- a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
+++ b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
@@ -3,29 +3,29 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 
-/// Compute which suggestion sets should be included into completion inside
-/// the given [resolvedUnit] of a file.  Depending on the file path, it might
+/// Compute which suggestion sets should be included into completion for
+/// the given completion [request].  Depending on the file path, it might
 /// include different sets, e.g. inside the `lib/` directory of a `Pub` package
 /// only regular dependencies can be referenced, but `test/` can reference
 /// both regular and "dev" dependencies.
 void computeIncludedSetList(
   DeclarationsTracker tracker,
-  ResolvedUnitResult resolvedUnit,
+  DartCompletionRequest request,
   List<protocol.IncludedSuggestionSet> includedSetList,
   Set<String> includedElementNames,
 ) {
-  var analysisContext = resolvedUnit.session.analysisContext;
-  var context = tracker.getContext(analysisContext);
+  var context = tracker.getContext(request.analysisContext);
   if (context == null) return;
 
-  var librariesObject = context.getLibraries(resolvedUnit.path);
+  var librariesObject = context.getLibraries(request.path);
 
-  var importedUriSet = resolvedUnit.libraryElement.importedLibraries
+  var importedUriSet = request.libraryElement.importedLibraries
       .map((importedLibrary) => importedLibrary.source.uri)
       .toSet();
 
@@ -48,7 +48,7 @@
       protocol.IncludedSuggestionSet(
         library.id,
         relevance,
-        displayUri: _getRelativeFileUri(resolvedUnit, library.uri),
+        displayUri: _getRelativeFileUri(request, library.uri),
       ),
     );
 
@@ -172,11 +172,11 @@
 }
 
 /// Computes the best URI to import [what] into the [unit] library.
-String? _getRelativeFileUri(ResolvedUnitResult unit, Uri what) {
+String? _getRelativeFileUri(DartCompletionRequest request, Uri what) {
   if (what.scheme == 'file') {
-    var pathContext = unit.session.resourceProvider.pathContext;
+    var pathContext = request.analysisSession.resourceProvider.pathContext;
 
-    var libraryPath = unit.libraryElement.source.fullName;
+    var libraryPath = request.libraryElement.source.fullName;
     var libraryFolder = pathContext.dirname(libraryPath);
 
     var whatPath = pathContext.fromUri(what);
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index a2f6ea6..e0eedc4 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -69,7 +69,7 @@
       return RuntimeCompletionResult([], []);
     }
 
-    var dartRequest = DartCompletionRequest(
+    var dartRequest = DartCompletionRequest.forResolvedUnit(
       resolvedUnit: targetResult,
       offset: targetOffset,
     );
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index b73448c..655d9d9 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -23,7 +23,6 @@
 import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/analysis_options/fix_generator.dart';
-import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/fix/manifest/fix_generator.dart';
 import 'package:analysis_server/src/services/correction/fix/pubspec/fix_generator.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
@@ -32,6 +31,7 @@
 import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart' as engine;
@@ -337,7 +337,8 @@
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == EDIT_REQUEST_FORMAT) {
@@ -534,7 +535,7 @@
       return;
     }
     // Do sort.
-    var sorter = MemberSorter(code, unit);
+    var sorter = MemberSorter(code, unit, result.lineInfo);
     var edits = sorter.sort();
     var fileEdit = SourceFileEdit(file, fileStamp, edits: edits);
     server.sendResponse(EditSortMembersResult(fileEdit).toResponse(request.id));
@@ -602,18 +603,7 @@
         if (errorLine == requestLine) {
           var workspace = DartChangeWorkspace(server.currentSessions);
           var context = DartFixContextImpl(
-              server.instrumentationService, workspace, result, error, (name) {
-            var tracker = server.declarationsTracker;
-            if (tracker == null) {
-              return const [];
-            }
-            var provider = TopLevelDeclarationsProvider(tracker);
-            return provider.get(
-              result.session.analysisContext,
-              result.path,
-              name,
-            );
-          }, extensionCache: server.getExtensionCacheFor(result));
+              server.instrumentationService, workspace, result, error);
 
           List<Fix> fixes;
           try {
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
index 6ec33cc..66bce33 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
@@ -7,6 +7,7 @@
 import 'package:analysis_server/src/domain_abstract.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 
 /// A [RequestHandler] that handles requests in the `flutter` domain.
@@ -71,7 +72,8 @@
   }
 
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == FLUTTER_REQUEST_GET_WIDGET_DESCRIPTION) {
diff --git a/pkg/analysis_server/lib/src/g3/fixes.dart b/pkg/analysis_server/lib/src/g3/fixes.dart
index 51c05f4..17f045c 100644
--- a/pkg/analysis_server/lib/src/g3/fixes.dart
+++ b/pkg/analysis_server/lib/src/g3/fixes.dart
@@ -96,7 +96,6 @@
       workspace,
       unitResult,
       error,
-      (name) => const [],
     );
 
     List<Fix> fixes;
diff --git a/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart b/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
index ed1ea21..a86e794 100644
--- a/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
@@ -80,7 +80,7 @@
       return;
     }
     _instrumentationService.logRequest(data);
-    final Map<String, Object?> json = jsonDecode(data);
+    final json = jsonDecode(data) as Map<String, Object?>;
     if (RequestMessage.canParse(json, nullLspJsonReporter)) {
       onMessage(RequestMessage.fromJson(json));
     } else if (NotificationMessage.canParse(json, nullLspJsonReporter)) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
index 20c4d27..4de8bfe 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/perform_refactor.dart
@@ -120,7 +120,7 @@
         final refactor = ExtractMethodRefactoring(
             server.searchEngine, result, offset, length);
 
-        var preferredName = options != null ? options['name'] : null;
+        var preferredName = options != null ? options['name'] as String : null;
         // checkInitialConditions will populate names with suggestions.
         if (preferredName == null) {
           await refactor.checkInitialConditions();
@@ -138,7 +138,7 @@
       case RefactoringKind.EXTRACT_LOCAL_VARIABLE:
         final refactor = ExtractLocalRefactoring(result, offset, length);
 
-        var preferredName = options != null ? options['name'] : null;
+        var preferredName = options != null ? options['name'] as String : null;
         // checkInitialConditions will populate names with suggestions.
         if (preferredName == null) {
           await refactor.checkInitialConditions();
@@ -162,7 +162,7 @@
         // to handle this better.
         // https://github.com/microsoft/language-server-protocol/issues/764
         refactor.name =
-            (options != null ? options['name'] : null) ?? 'NewWidget';
+            options != null ? options['name'] as String : 'NewWidget';
         return success(refactor);
 
       case RefactoringKind.INLINE_LOCAL_VARIABLE:
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
index d832d06..a4c2286 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
@@ -61,7 +61,7 @@
       ));
     }
 
-    final sorter = MemberSorter(code, unit);
+    final sorter = MemberSorter(code, unit, result.lineInfo);
     final edits = sorter.sort();
 
     if (edits.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
index 9f7152c..521927d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
@@ -14,7 +14,6 @@
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
 import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analyzer/dart/analysis/results.dart';
@@ -36,10 +35,11 @@
   // CodeAction class).
   final codeActionPriorities = Expando<int>();
 
-  /// A comparator that can be used to sort [CodeActions]s using priorties
-  /// in [codeActionPriorities]. The highest number priority will be sorted
-  /// before lower number priorityies. Items with the same relevance are sorted
-  /// alphabetically by their title.
+  /// A comparator that can be used to sort [CodeActions]s using priorities
+  /// in [codeActionPriorities].
+  ///
+  /// The highest number priority will be sorted before lower number priorities.
+  /// Items with the same priority are sorted alphabetically by their title.
   late final Comparator<CodeAction> _codeActionComparator =
       (CodeAction a, CodeAction b) {
     // We should never be sorting actions without priorities.
@@ -346,14 +346,7 @@
         }
         var workspace = DartChangeWorkspace(server.currentSessions);
         var context = DartFixContextImpl(
-            server.instrumentationService, workspace, unit, error, (name) {
-          var tracker = server.declarationsTracker!;
-          return TopLevelDeclarationsProvider(tracker).get(
-            unit.session.analysisContext,
-            unit.path,
-            name,
-          );
-        }, extensionCache: server.getExtensionCacheFor(unit));
+            server.instrumentationService, workspace, unit, error);
         final fixes = await fixContributor.computeFixes(context);
         if (fixes.isNotEmpty) {
           final diagnostic = toDiagnostic(
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index 85f3765..d2bd74d 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -26,6 +26,7 @@
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
@@ -64,8 +65,9 @@
     final unit = await path.mapResult(requireResolvedUnit);
 
     final lineInfo = await unit.map(
-      // If we don't have a unit, we can still try to obtain the line info for
-      // plugin contributors.
+      // If we don't have a unit, we can still try to obtain the line info from
+      // the server (this could be because the file is non-Dart, such as YAML or
+      // another handled by a plugin).
       (error) => path.mapResult(getLineInfo),
       (unit) => success(unit.lineInfo),
     );
@@ -202,216 +204,223 @@
     String? triggerCharacter,
     CancellationToken token,
   ) async {
-    final performance = CompletionPerformance();
-    performance.path = unit.path;
-    performance.setContentsAndOffset(unit.content, offset);
-    server.performanceStats.completion.add(performance);
-
-    return await performance.runRequestOperation((perf) async {
-      final completionRequest = DartCompletionRequest(
-        resolvedUnit: unit,
-        offset: offset,
-        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(unit),
-        completionPreference: CompletionPreference.replace,
-      );
-      final target = completionRequest.target;
-
-      if (triggerCharacter != null) {
-        if (!_triggerCharacterValid(offset, triggerCharacter, target)) {
-          return success([]);
-        }
-      }
-
-      Set<ElementKind>? includedElementKinds;
-      Set<String>? includedElementNames;
-      List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
-      if (includeSuggestionSets) {
-        includedElementKinds = <ElementKind>{};
-        includedElementNames = <String>{};
-        includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
-      }
-
-      try {
-        var contributor = DartCompletionManager(
-          budget: CompletionBudget(CompletionBudget.defaultDuration),
-          includedElementKinds: includedElementKinds,
-          includedElementNames: includedElementNames,
-          includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
+    var performance = OperationPerformanceImpl('<root>');
+    return await performance.runAsync(
+      'request',
+      (performance) async {
+        final completionPerformance = CompletionPerformance(
+          operation: performance,
+          path: unit.path,
+          content: unit.content,
+          offset: offset,
         );
+        server.performanceStats.completion.add(completionPerformance);
 
-        final serverSuggestions = await contributor.computeSuggestions(
-          completionRequest,
-          perf,
+        final completionRequest = DartCompletionRequest.forResolvedUnit(
+          resolvedUnit: unit,
+          offset: offset,
+          dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(unit),
+          completionPreference: CompletionPreference.replace,
         );
+        final target = completionRequest.target;
 
-        final insertLength = _computeInsertLength(
-          offset,
-          completionRequest.replacementOffset,
-          completionRequest.replacementLength,
-        );
-
-        if (token.isCancellationRequested) {
-          return cancelled();
+        if (triggerCharacter != null) {
+          if (!_triggerCharacterValid(offset, triggerCharacter, target)) {
+            return success([]);
+          }
         }
 
-        /// completeFunctionCalls should be suppressed if the target is an
-        /// invocation that already has an argument list, otherwise we would
-        /// insert dupes.
-        final completeFunctionCalls = _hasExistingArgList(target.entity)
-            ? false
-            : server.clientConfiguration.global.completeFunctionCalls;
+        Set<ElementKind>? includedElementKinds;
+        Set<String>? includedElementNames;
+        List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags;
+        if (includeSuggestionSets) {
+          includedElementKinds = <ElementKind>{};
+          includedElementNames = <String>{};
+          includedSuggestionRelevanceTags = <IncludedSuggestionRelevanceTag>[];
+        }
 
-        final results = serverSuggestions.map(
-          (item) {
-            var itemReplacementOffset =
-                item.replacementOffset ?? completionRequest.replacementOffset;
-            var itemReplacementLength =
-                item.replacementLength ?? completionRequest.replacementLength;
-            var itemInsertLength = insertLength;
-
-            // Recompute the insert length if it may be affected by the above.
-            if (item.replacementOffset != null ||
-                item.replacementLength != null) {
-              itemInsertLength = _computeInsertLength(
-                  offset, itemReplacementOffset, itemInsertLength);
-            }
-
-            return toCompletionItem(
-              capabilities,
-              unit.lineInfo,
-              item,
-              itemReplacementOffset,
-              itemInsertLength,
-              itemReplacementLength,
-              // TODO(dantup): Including commit characters in every completion
-              // increases the payload size. The LSP spec is ambigious
-              // about how this should be handled (and VS Code requires it) but
-              // this should be removed (or made conditional based on a capability)
-              // depending on how the spec is updated.
-              // https://github.com/microsoft/vscode-languageserver-node/issues/673
-              includeCommitCharacters:
-                  server.clientConfiguration.global.previewCommitCharacters,
-              completeFunctionCalls: completeFunctionCalls,
-            );
-          },
-        ).toList();
-
-        // Now compute items in suggestion sets.
-        var includedSuggestionSets = <IncludedSuggestionSet>[];
-        final declarationsTracker = server.declarationsTracker;
-        if (declarationsTracker != null &&
-            includedElementKinds != null &&
-            includedElementNames != null &&
-            includedSuggestionRelevanceTags != null) {
-          computeIncludedSetList(
-            declarationsTracker,
-            unit,
-            includedSuggestionSets,
-            includedElementNames,
+        try {
+          var contributor = DartCompletionManager(
+            budget: CompletionBudget(CompletionBudget.defaultDuration),
+            includedElementKinds: includedElementKinds,
+            includedElementNames: includedElementNames,
+            includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
           );
 
-          // Build a fast lookup for imported symbols so that we can filter out
-          // duplicates.
-          final alreadyImportedSymbols = _buildLookupOfImportedSymbols(unit);
+          final serverSuggestions = await contributor.computeSuggestions(
+            completionRequest,
+            performance,
+          );
 
-          includedSuggestionSets.forEach((includedSet) {
-            final library = declarationsTracker.getLibrary(includedSet.id);
-            if (library == null) {
-              return;
-            }
+          final insertLength = _computeInsertLength(
+            offset,
+            completionRequest.replacementOffset,
+            completionRequest.replacementLength,
+          );
 
-            // Make a fast lookup for tag relevance.
-            final tagBoosts = <String, int>{};
-            includedSuggestionRelevanceTags!
-                .forEach((t) => tagBoosts[t.tag] = t.relevanceBoost);
+          if (token.isCancellationRequested) {
+            return cancelled();
+          }
 
-            // Only specific types of child declarations should be included.
-            // This list matches what's in _protocolAvailableSuggestion in
-            // the DAS implementation.
-            bool shouldIncludeChild(Declaration child) =>
-                child.kind == DeclarationKind.CONSTRUCTOR ||
-                child.kind == DeclarationKind.ENUM_CONSTANT ||
-                (child.kind == DeclarationKind.GETTER && child.isStatic) ||
-                (child.kind == DeclarationKind.FIELD && child.isStatic);
+          /// completeFunctionCalls should be suppressed if the target is an
+          /// invocation that already has an argument list, otherwise we would
+          /// insert dupes.
+          final completeFunctionCalls = _hasExistingArgList(target.entity)
+              ? false
+              : server.clientConfiguration.global.completeFunctionCalls;
 
-            // Collect declarations and their children.
-            final allDeclarations = library.declarations
-                .followedBy(library.declarations
-                    .expand((decl) => decl.children.where(shouldIncludeChild)))
-                .toList();
+          final results = serverSuggestions.map(
+            (item) {
+              var itemReplacementOffset =
+                  item.replacementOffset ?? completionRequest.replacementOffset;
+              var itemReplacementLength =
+                  item.replacementLength ?? completionRequest.replacementLength;
+              var itemInsertLength = insertLength;
 
-            final setResults = allDeclarations
-                // Filter to only the kinds we should return.
-                .where((item) => includedElementKinds!
-                    .contains(protocolElementKind(item.kind)))
-                .where((item) {
-              // Check existing imports to ensure we don't already import
-              // this element (this exact element from its declaring
-              // library, not just something with the same name). If we do
-              // we'll want to skip it.
-              final declaringUri =
-                  item.parent?.locationLibraryUri ?? item.locationLibraryUri!;
+              // Recompute the insert length if it may be affected by the above.
+              if (item.replacementOffset != null ||
+                  item.replacementLength != null) {
+                itemInsertLength = _computeInsertLength(
+                    offset, itemReplacementOffset, itemInsertLength);
+              }
 
-              // For enums and named constructors, only the parent enum/class is in
-              // the list of imported symbols so we use the parents name.
-              final nameKey = item.kind == DeclarationKind.ENUM_CONSTANT ||
-                      item.kind == DeclarationKind.CONSTRUCTOR
-                  ? item.parent!.name
-                  : item.name;
-              final key = _createImportedSymbolKey(nameKey, declaringUri);
-              final importingUris = alreadyImportedSymbols[key];
+              return toCompletionItem(
+                capabilities,
+                unit.lineInfo,
+                item,
+                itemReplacementOffset,
+                itemInsertLength,
+                itemReplacementLength,
+                // TODO(dantup): Including commit characters in every completion
+                // increases the payload size. The LSP spec is ambigious
+                // about how this should be handled (and VS Code requires it) but
+                // this should be removed (or made conditional based on a capability)
+                // depending on how the spec is updated.
+                // https://github.com/microsoft/vscode-languageserver-node/issues/673
+                includeCommitCharacters:
+                    server.clientConfiguration.global.previewCommitCharacters,
+                completeFunctionCalls: completeFunctionCalls,
+              );
+            },
+          ).toList();
 
-              // Keep it only if:
-              // - no existing imports include it
-              //     (in which case all libraries will be offered as
-              //     auto-imports)
-              // - this is the first imported URI that includes it
-              //     (we don't want to repeat it for each imported library that
-              //     includes it)
-              return importingUris == null ||
-                  importingUris.first == '${library.uri}';
-            }).map((item) => declarationToCompletionItem(
-                      capabilities,
-                      unit.path,
-                      offset,
-                      includedSet,
-                      library,
-                      tagBoosts,
-                      unit.lineInfo,
-                      item,
-                      completionRequest.replacementOffset,
-                      insertLength,
-                      completionRequest.replacementLength,
-                      // TODO(dantup): Including commit characters in every completion
-                      // increases the payload size. The LSP spec is ambigious
-                      // about how this should be handled (and VS Code requires it) but
-                      // this should be removed (or made conditional based on a capability)
-                      // depending on how the spec is updated.
-                      // https://github.com/microsoft/vscode-languageserver-node/issues/673
-                      includeCommitCharacters: server
-                          .clientConfiguration.global.previewCommitCharacters,
-                      completeFunctionCalls: completeFunctionCalls,
-                    ));
-            results.addAll(setResults);
-          });
+          // Now compute items in suggestion sets.
+          var includedSuggestionSets = <IncludedSuggestionSet>[];
+          final declarationsTracker = server.declarationsTracker;
+          if (declarationsTracker != null &&
+              includedElementKinds != null &&
+              includedElementNames != null &&
+              includedSuggestionRelevanceTags != null) {
+            computeIncludedSetList(
+              declarationsTracker,
+              completionRequest,
+              includedSuggestionSets,
+              includedElementNames,
+            );
+
+            // Build a fast lookup for imported symbols so that we can filter out
+            // duplicates.
+            final alreadyImportedSymbols = _buildLookupOfImportedSymbols(unit);
+
+            includedSuggestionSets.forEach((includedSet) {
+              final library = declarationsTracker.getLibrary(includedSet.id);
+              if (library == null) {
+                return;
+              }
+
+              // Make a fast lookup for tag relevance.
+              final tagBoosts = <String, int>{};
+              includedSuggestionRelevanceTags!
+                  .forEach((t) => tagBoosts[t.tag] = t.relevanceBoost);
+
+              // Only specific types of child declarations should be included.
+              // This list matches what's in _protocolAvailableSuggestion in
+              // the DAS implementation.
+              bool shouldIncludeChild(Declaration child) =>
+                  child.kind == DeclarationKind.CONSTRUCTOR ||
+                  child.kind == DeclarationKind.ENUM_CONSTANT ||
+                  (child.kind == DeclarationKind.GETTER && child.isStatic) ||
+                  (child.kind == DeclarationKind.FIELD && child.isStatic);
+
+              // Collect declarations and their children.
+              final allDeclarations = library.declarations
+                  .followedBy(library.declarations.expand(
+                      (decl) => decl.children.where(shouldIncludeChild)))
+                  .toList();
+
+              final setResults = allDeclarations
+                  // Filter to only the kinds we should return.
+                  .where((item) => includedElementKinds!
+                      .contains(protocolElementKind(item.kind)))
+                  .where((item) {
+                // Check existing imports to ensure we don't already import
+                // this element (this exact element from its declaring
+                // library, not just something with the same name). If we do
+                // we'll want to skip it.
+                final declaringUri =
+                    item.parent?.locationLibraryUri ?? item.locationLibraryUri!;
+
+                // For enums and named constructors, only the parent enum/class is in
+                // the list of imported symbols so we use the parents name.
+                final nameKey = item.kind == DeclarationKind.ENUM_CONSTANT ||
+                        item.kind == DeclarationKind.CONSTRUCTOR
+                    ? item.parent!.name
+                    : item.name;
+                final key = _createImportedSymbolKey(nameKey, declaringUri);
+                final importingUris = alreadyImportedSymbols[key];
+
+                // Keep it only if:
+                // - no existing imports include it
+                //     (in which case all libraries will be offered as
+                //     auto-imports)
+                // - this is the first imported URI that includes it
+                //     (we don't want to repeat it for each imported library that
+                //     includes it)
+                return importingUris == null ||
+                    importingUris.first == '${library.uri}';
+              }).map((item) => declarationToCompletionItem(
+                        capabilities,
+                        unit.path,
+                        offset,
+                        includedSet,
+                        library,
+                        tagBoosts,
+                        unit.lineInfo,
+                        item,
+                        completionRequest.replacementOffset,
+                        insertLength,
+                        completionRequest.replacementLength,
+                        // TODO(dantup): Including commit characters in every completion
+                        // increases the payload size. The LSP spec is ambigious
+                        // about how this should be handled (and VS Code requires it) but
+                        // this should be removed (or made conditional based on a capability)
+                        // depending on how the spec is updated.
+                        // https://github.com/microsoft/vscode-languageserver-node/issues/673
+                        includeCommitCharacters: server
+                            .clientConfiguration.global.previewCommitCharacters,
+                        completeFunctionCalls: completeFunctionCalls,
+                      ));
+              results.addAll(setResults);
+            });
+          }
+
+          // Perform fuzzy matching based on the identifier in front of the caret to
+          // reduce the size of the payload.
+          final fuzzyPattern = completionRequest.targetPrefix;
+          final fuzzyMatcher =
+              FuzzyMatcher(fuzzyPattern, matchStyle: MatchStyle.TEXT);
+
+          final matchingResults =
+              results.where((e) => fuzzyMatcher.score(e.label) > 0).toList();
+
+          completionPerformance.suggestionCount = results.length;
+
+          return success(matchingResults);
+        } on AbortCompletion {
+          return success([]);
         }
-
-        // Perform fuzzy matching based on the identifier in front of the caret to
-        // reduce the size of the payload.
-        final fuzzyPattern = completionRequest.targetPrefix;
-        final fuzzyMatcher =
-            FuzzyMatcher(fuzzyPattern, matchStyle: MatchStyle.TEXT);
-
-        final matchingResults =
-            results.where((e) => fuzzyMatcher.score(e.label) > 0).toList();
-
-        performance.suggestionCount = results.length;
-
-        return success(matchingResults);
-      } on AbortCompletion {
-        return success([]);
-      }
-    });
+      },
+    );
   }
 
   Future<ErrorOr<List<CompletionItem>>> _getServerYamlItems(
@@ -474,7 +483,9 @@
     return (node is ast.InvocationExpression &&
             !node.argumentList.beginToken.isSynthetic) ||
         (node is ast.InstanceCreationExpression &&
-            !node.argumentList.beginToken.isSynthetic);
+            !node.argumentList.beginToken.isSynthetic) ||
+        // "ClassName.^()" will appear as accessing a property named '('.
+        (node is ast.PropertyAccess && node.propertyName.name.startsWith('('));
   }
 
   Iterable<CompletionItem> _pluginResultsToItems(
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
index 30935d6..72903a8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion_resolve.dart
@@ -60,11 +60,12 @@
           'Requests not before server is initilized');
     }
 
-    final lineInfo = server.getLineInfo(data.file);
+    final file = data.file;
+    final lineInfo = server.getLineInfo(file);
     if (lineInfo == null) {
       return error(
         ErrorCodes.InternalError,
-        'Line info not available for ${data.file}',
+        'Line info not available for $file',
         null,
       );
     }
@@ -99,7 +100,7 @@
     _latestCompletionItem = item;
     while (item == _latestCompletionItem && timer.elapsed < timeout) {
       try {
-        final analysisDriver = server.getAnalysisDriver(data.file);
+        final analysisDriver = server.getAnalysisDriver(file);
         final session = analysisDriver?.currentSession;
 
         // We shouldn't not get a driver/session, but if we did perhaps the file
@@ -139,7 +140,7 @@
 
         var newInsertText = item.insertText ?? item.label;
         final builder = ChangeBuilder(session: session);
-        await builder.addDartFileEdit(data.file, (builder) {
+        await builder.addDartFileEdit(file, (builder) {
           final result = builder.importLibraryElement(library.uri);
           if (result.prefix != null) {
             newInsertText = '${result.prefix}.$newInsertText';
@@ -152,9 +153,9 @@
 
         final changes = builder.sourceChange;
         final thisFilesChanges =
-            changes.edits.where((e) => e.file == data.file).toList();
+            changes.edits.where((e) => e.file == file).toList();
         final otherFilesChanges =
-            changes.edits.where((e) => e.file != data.file).toList();
+            changes.edits.where((e) => e.file != file).toList();
 
         // If this completion involves editing other files, we'll need to build
         // a command that the client will call to apply those edits later.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart
new file mode 100644
index 0000000..07bf25b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/computer/computer_color.dart'
+    show ColorComputer, ColorReference;
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+
+/// Handles textDocument/documentColor requests.
+///
+/// This request is sent by the client to the server to request the locations
+/// of any colors in the document so that it can render color previews. If the
+/// editor has a color picker, it may also call textDocument/colorPresentation
+/// to obtain the code to insert when a new color is selected (see
+/// [DocumentColorPresentationHandler]).
+class DocumentColorHandler
+    extends MessageHandler<DocumentColorParams, List<ColorInformation>> {
+  DocumentColorHandler(LspAnalysisServer server) : super(server);
+  @override
+  Method get handlesMessage => Method.textDocument_documentColor;
+
+  @override
+  LspJsonHandler<DocumentColorParams> get jsonHandler =>
+      DocumentColorParams.jsonHandler;
+
+  @override
+  Future<ErrorOr<List<ColorInformation>>> handle(
+      DocumentColorParams params, CancellationToken token) async {
+    if (!isDartDocument(params.textDocument)) {
+      return success([]);
+    }
+
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireResolvedUnit);
+    return unit.mapResult((unit) => _getColors(unit));
+  }
+
+  ErrorOr<List<ColorInformation>> _getColors(ResolvedUnitResult unit) {
+    ColorInformation _toColorInformation(ColorReference reference) {
+      return ColorInformation(
+        range: toRange(unit.lineInfo, reference.offset, reference.length),
+        color: Color(
+          // LSP colors are decimal in the range 0-1 but our internal references
+          // are 0-255, so divide them.
+          alpha: reference.color.alpha / 255,
+          red: reference.color.red / 255,
+          green: reference.color.green / 255,
+          blue: reference.color.blue / 255,
+        ),
+      );
+    }
+
+    final computer = ColorComputer(unit);
+    final colors = computer.compute();
+    return success(colors.map(_toColorInformation).toList());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
new file mode 100644
index 0000000..06fdd44
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_color_presentation.dart
@@ -0,0 +1,169 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+
+/// Handles textDocument/colorPresentation.
+///
+/// This request is sent by the client if it allowed the user to pick a color
+/// using a color picker (in a location returned by textDocument/documentColor)
+/// and needs a representation of this color, including the edits to insert it
+/// into the source file.
+class DocumentColorPresentationHandler
+    extends MessageHandler<ColorPresentationParams, List<ColorPresentation>> {
+  DocumentColorPresentationHandler(LspAnalysisServer server) : super(server);
+  @override
+  Method get handlesMessage => Method.textDocument_colorPresentation;
+
+  @override
+  LspJsonHandler<ColorPresentationParams> get jsonHandler =>
+      ColorPresentationParams.jsonHandler;
+
+  @override
+  Future<ErrorOr<List<ColorPresentation>>> handle(
+    ColorPresentationParams params,
+    CancellationToken token,
+  ) async {
+    if (!isDartDocument(params.textDocument)) {
+      return success([]);
+    }
+
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireResolvedUnit);
+    return unit.mapResult((unit) => _getPresentations(params, unit));
+  }
+
+  /// Converts individual 0-255 ARGB values into a single int value as
+  /// 0xAARRGGBB as used by the dart:ui Color class.
+  int _colorValueForComponents(int alpha, int red, int green, int blue) {
+    return (alpha << 24) | (red << 16) | (green << 8) | (blue << 0);
+  }
+
+  /// Creates a [ColorPresentation] for inserting code to produce a dart:ui
+  /// or Flutter Color at [editRange].
+  ///
+  /// [colorType] is the Type of the Color class whose constructor will be
+  /// called. This will be replaced into [editRange] and any required import
+  /// statement will produce additional edits.
+  ///
+  /// [label] is the visible label shown to the user and should roughly reflect
+  /// the code that will be inserted.
+  ///
+  /// [invocationString] is written immediately after [colorType] in [editRange].
+  Future<ColorPresentation> _createColorPresentation(
+    ResolvedUnitResult unit,
+    SourceRange editRange,
+    ClassElement colorType,
+    String label,
+    String invocationString,
+  ) async {
+    final builder = ChangeBuilder(session: unit.session);
+    await builder.addDartFileEdit(unit.path, (builder) {
+      builder.addReplacement(editRange, (builder) {
+        builder.writeType(colorType.thisType);
+        builder.write(invocationString);
+      });
+    });
+
+    // We can only apply changes to the same file, so filter any change from the
+    // builder to only include this file, otherwise we may corrupt the users
+    // source (although hopefully we don't produce edits for other files).
+    final editsForThisFile = builder.sourceChange.edits
+        .where((edit) => edit.file == unit.path)
+        .expand((edit) => edit.edits)
+        .toList();
+
+    // LSP requires that we separate the main edit (changing the color code)
+    // from anything else (imports).
+    final mainEdit =
+        editsForThisFile.singleWhere((edit) => edit.offset == editRange.offset);
+    final otherEdits =
+        editsForThisFile.where((edit) => edit.offset != editRange.offset);
+
+    return ColorPresentation(
+      label: label,
+      textEdit: toTextEdit(unit.lineInfo, mainEdit),
+      additionalTextEdits: otherEdits.isNotEmpty
+          ? otherEdits.map((edit) => toTextEdit(unit.lineInfo, edit)).toList()
+          : null,
+    );
+  }
+
+  /// Builds a list of valid color presentations for the requested color.
+  Future<ErrorOr<List<ColorPresentation>>> _getPresentations(
+    ColorPresentationParams params,
+    ResolvedUnitResult unit,
+  ) async {
+    // The values in LSP are decimals 0-1 so should be scaled up to 255 that
+    // we use internally (except for opacity is which 0-1).
+    final alpha = (params.color.alpha * 255).toInt();
+    final red = (params.color.red * 255).toInt();
+    final green = (params.color.green * 255).toInt();
+    final blue = (params.color.blue * 255).toInt();
+    final opacity = params.color.alpha;
+
+    final editStart = toOffset(unit.lineInfo, params.range.start);
+    final editEnd = toOffset(unit.lineInfo, params.range.end);
+
+    if (editStart.isError) return failure(editStart);
+    if (editEnd.isError) return failure(editEnd);
+
+    final editRange =
+        SourceRange(editStart.result, editEnd.result - editStart.result);
+
+    final sessionHelper = AnalysisSessionHelper(unit.session);
+    final flutter = Flutter.instance;
+    final colorType = await sessionHelper.getClass(flutter.widgetsUri, 'Color');
+    if (colorType == null) {
+      // If we can't find the class (perhaps because this isn't a Flutter
+      // project) we will not include any results. In theory the client should
+      // not be calling this request in that case.
+      return success([]);
+    }
+
+    final colorValue = _colorValueForComponents(alpha, red, green, blue);
+    final colorValueHex =
+        '0x${colorValue.toRadixString(16).toUpperCase().padLeft(8, '0')}';
+
+    final colorFromARGB = await _createColorPresentation(
+      unit,
+      editRange,
+      colorType,
+      'Color.fromARGB($alpha, $red, $green, $blue)',
+      '.fromARGB($alpha, $red, $green, $blue)',
+    );
+
+    final colorFromRGBO = await _createColorPresentation(
+      unit,
+      editRange,
+      colorType,
+      'Color.fromRGBO($red, $green, $blue, $opacity)',
+      '.fromRGBO($red, $green, $blue, $opacity)',
+    );
+
+    final colorDefault = await _createColorPresentation(
+      unit,
+      editRange,
+      colorType,
+      'Color($colorValueHex)',
+      '($colorValueHex)',
+    );
+
+    return success([
+      colorFromARGB,
+      colorFromRGBO,
+      colorDefault,
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
index c0e413d..0d9eb19 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -15,6 +15,8 @@
 import 'package:analysis_server/src/lsp/handlers/handler_completion.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_completion_resolve.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_definition.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_document_color.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_document_color_presentation.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_document_highlights.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_document_symbols.dart';
 import 'package:analysis_server/src/lsp/handlers/handler_execute_command.dart';
@@ -77,6 +79,8 @@
       server,
       server.initializationOptions.suggestFromUnimportedLibraries,
     ));
+    registerHandler(DocumentColorHandler(server));
+    registerHandler(DocumentColorPresentationHandler(server));
     registerHandler(CompletionResolveHandler(server));
     registerHandler(SignatureHelpHandler(server));
     registerHandler(DefinitionHandler(server));
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
index 96a2cae..435013c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_workspace_symbols.dart
@@ -7,7 +7,7 @@
 import 'package:analysis_server/src/lsp/handlers/handlers.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
-import 'package:analysis_server/src/search/workspace_symbols.dart' as search;
+import 'package:analyzer/src/dart/analysis/search.dart' as search;
 
 class WorkspaceSymbolHandler
     extends MessageHandler<WorkspaceSymbolParams, List<SymbolInformation>> {
@@ -52,24 +52,19 @@
     // huge numbers on large projects.
     var remainingResults = 500;
 
-    final filePathsHashSet = <String>{};
-    final tracker = server.declarationsTracker!;
-    final declarations = search.WorkspaceSymbols(tracker).declarations(
-      regex,
-      remainingResults,
-      filePathsHashSet,
-    );
-
-    // Convert the file paths to something we can quickly index into since
-    // we'll be looking things up by index a lot.
-    final filePaths = filePathsHashSet.toList();
+    var workspaceSymbols = search.WorkspaceSymbols();
+    var analysisDrivers = server.driverMap.values.toList();
+    for (var analysisDriver in analysisDrivers) {
+      await analysisDriver.search
+          .declarations(workspaceSymbols, regex, remainingResults);
+    }
 
     // Map the results to SymbolInformations and flatten the list of lists.
-    final symbols = declarations
+    final symbols = workspaceSymbols.declarations
         .map((declaration) => _asSymbolInformation(
               declaration,
               supportedSymbolKinds,
-              filePaths,
+              workspaceSymbols.files,
             ))
         .toList();
 
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
index 6b87d05..e0f497c 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -14,11 +14,14 @@
 import 'package:analysis_server/src/lsp/json_parsing.dart';
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/progress.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/src/protocol/protocol_internal.dart';
 
+export 'package:analysis_server/src/utilities/progress.dart';
+
 /// Converts an iterable using the provided function and skipping over any
 /// null values.
 Iterable<T> convert<T, E>(Iterable<E> items, T Function(E) converter) {
@@ -27,22 +30,6 @@
   return items.map(converter).where((item) => item != null);
 }
 
-class CancelableToken extends CancellationToken {
-  bool _isCancelled = false;
-
-  @override
-  bool get isCancellationRequested => _isCancelled;
-
-  void cancel() => _isCancelled = true;
-}
-
-/// A token used to signal cancellation of an operation. This allows computation
-/// to be skipped when a caller is no longer interested in the result, for example
-/// when a $/cancel request is recieved for an in-progress request.
-abstract class CancellationToken {
-  bool get isCancellationRequested;
-}
-
 abstract class CommandHandler<P, R> with Handler<P, R> {
   @override
   final LspAnalysisServer server;
@@ -134,7 +121,8 @@
   FutureOr<ErrorOr<R>> handleMessage(
       IncomingMessage message, CancellationToken token) {
     final reporter = LspJsonReporter('params');
-    if (!jsonHandler.validateParams(message.params, reporter)) {
+    final paramsJson = message.params as Map<String, Object?>?;
+    if (!jsonHandler.validateParams(paramsJson, reporter)) {
       return error(
         ErrorCodes.InvalidParams,
         'Invalid params for ${message.method}:\n'
@@ -144,18 +132,12 @@
       );
     }
 
-    final params = message.params != null
-        ? jsonHandler.convertParams(message.params)
-        : null as P;
+    final params =
+        paramsJson != null ? jsonHandler.convertParams(paramsJson) : null as P;
     return handle(params, token);
   }
 }
 
-class NotCancelableToken extends CancellationToken {
-  @override
-  bool get isCancellationRequested => false;
-}
-
 /// A message handler that handles all messages for a given server state.
 abstract class ServerStateMessageHandler {
   final LspAnalysisServer server;
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index d33a96e..e4e8d17 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -261,12 +261,23 @@
     capabilitiesComputer.performDynamicRegistration();
   }
 
-  /// Return the LineInfo for the file with the given [path]. The file is
-  /// analyzed in one of the analysis drivers to which the file was added,
-  /// otherwise in the first driver, otherwise `null` is returned.
+  /// Return a [LineInfo] for the file with the given [path].
+  ///
+  /// If the file does not exist or cannot be read, returns `null`.
+  ///
+  /// This method supports non-Dart files but uses the current content of the
+  /// file which may not be the latest analyzed version of the file if it was
+  /// recently modified, so using the lineInfo from an analyzed result may be
+  /// preferable.
   LineInfo? getLineInfo(String path) {
-    var result = getAnalysisDriver(path)?.getFileSync(path);
-    return result is FileResult ? result.lineInfo : null;
+    try {
+      final content = resourceProvider.getFile(path).readAsStringSync();
+      return LineInfo.fromContent(content);
+    } on FileSystemException {
+      // If the file does not exist or cannot be read, return null to allow
+      // the caller to decide how to handle this.
+      return null;
+    }
   }
 
   /// Gets the version of a document known to the server, returning a
@@ -374,17 +385,18 @@
 
   /// Logs an exception by sending it to the client (window/logMessage) and
   /// recording it in a buffer on the server for diagnostics.
-  void logException(String message, exception, stackTrace) {
+  void logException(String message, Object exception, StackTrace? stackTrace) {
     var fullMessage = message;
     if (exception is CaughtException) {
       stackTrace ??= exception.stackTrace;
       fullMessage = '$fullMessage: ${exception.exception}';
-    } else if (exception != null) {
+    } else {
       fullMessage = '$fullMessage: $exception';
     }
 
     final fullError =
         stackTrace == null ? fullMessage : '$fullMessage\n$stackTrace';
+    stackTrace ??= StackTrace.current;
 
     // Log the full message since showMessage above may be truncated or
     // formatted badly (eg. VS Code takes the newlines out).
@@ -394,7 +406,7 @@
     exceptions.add(ServerException(
       message,
       exception,
-      stackTrace is StackTrace ? stackTrace : StackTrace.current,
+      stackTrace,
       false,
     ));
 
@@ -550,9 +562,10 @@
   }
 
   @override
-  void sendServerErrorNotification(String message, exception, stackTrace,
+  void sendServerErrorNotification(
+      String message, Object exception, StackTrace? stackTrace,
       {bool fatal = false}) {
-    message = exception == null ? message : '$message: $exception';
+    message = '$message: $exception';
 
     // Show message (without stack) to the user.
     showErrorMessageToUser(message);
@@ -652,9 +665,9 @@
 
   /// There was an error related to the socket from which messages are being
   /// read.
-  void socketError(error, stack) {
+  void socketError(Object error, StackTrace? stackTrace) {
     // Don't send to instrumentation service; not an internal error.
-    sendServerErrorNotification('Socket error', error, stack);
+    sendServerErrorNotification('Socket error', error, stackTrace);
   }
 
   Future<void> updateWorkspaceFolders(
@@ -670,7 +683,7 @@
     _refreshAnalysisRoots();
   }
 
-  void _afterOverlayChanged(String path, dynamic changeForPlugins) {
+  void _afterOverlayChanged(String path, plugin.HasToJson changeForPlugins) {
     driverMap.values.forEach((driver) => driver.changeFile(path));
     pluginManager.setAnalysisUpdateContentParams(
       plugin.AnalysisUpdateContentParams({path: changeForPlugins}),
@@ -894,7 +907,6 @@
     var path = result.path;
 
     analysisServer.getDocumentationCacheFor(result)?.cacheFromResult(result);
-    analysisServer.getExtensionCacheFor(result)?.cacheFromResult(result);
 
     final unit = result.unit;
     if (analysisServer.shouldSendClosingLabelsFor(path)) {
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index 3a3e421..8a26c20 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -20,12 +20,13 @@
 import 'package:analysis_server/src/lsp/source_edits.dart';
 import 'package:analysis_server/src/protocol_server.dart' as server
     hide AnalysisError;
-import 'package:analysis_server/src/search/workspace_symbols.dart' as server
-    show DeclarationKind;
 import 'package:analyzer/dart/analysis/results.dart' as server;
 import 'package:analyzer/error/error.dart' as server;
 import 'package:analyzer/source/line_info.dart' as server;
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/source/source_range.dart' as server;
+import 'package:analyzer/src/dart/analysis/search.dart' as server
+    show DeclarationKind;
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/services/available_declarations.dart' as dec;
@@ -123,8 +124,11 @@
       edits
           .map((e) => FileEditInformation(
                 server.getVersionedDocumentIdentifier(e.file),
-                // We should never produce edits for a file with no LineInfo.
-                server.getLineInfo(e.file)!,
+                // If we expect to create the file, server.getLineInfo() won't
+                // provide a LineInfo so create one from empty contents.
+                e.fileStamp == -1
+                    ? LineInfo.fromContent('')
+                    : server.getLineInfo(e.file)!,
                 e.edits,
                 // fileStamp == 1 is used by the server to indicate the file needs creating.
                 newFile: e.fileStamp == -1,
@@ -1225,12 +1229,12 @@
 ErrorOr<int> toOffset(
   server.LineInfo lineInfo,
   lsp.Position pos, {
-  failureIsCritial = false,
+  bool failureIsCritical = false,
 }) {
   // line is zero-based so cannot equal lineCount
   if (pos.line >= lineInfo.lineCount) {
     return ErrorOr<int>.error(lsp.ResponseError(
-        code: failureIsCritial
+        code: failureIsCritical
             ? lsp.ServerErrorCodes.ClientServerInconsistentState
             : lsp.ServerErrorCodes.InvalidFileLineCol,
         message: 'Invalid line number',
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 36bff9b..0b28c2c 100644
--- a/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
+++ b/pkg/analysis_server/lib/src/lsp/server_capabilities_computer.dart
@@ -30,6 +30,7 @@
     Method.textDocument_signatureHelp,
     Method.textDocument_references,
     Method.textDocument_documentHighlight,
+    Method.textDocument_documentColor,
     Method.textDocument_formatting,
     Method.textDocument_onTypeFormatting,
     Method.textDocument_rangeFormatting,
@@ -52,6 +53,9 @@
   bool get codeActions =>
       _capabilities.textDocument?.foldingRange?.dynamicRegistration ?? false;
 
+  bool get colorProvider =>
+      _capabilities.textDocument?.colorProvider?.dynamicRegistration ?? false;
+
   bool get completion =>
       _capabilities.textDocument?.completion?.dynamicRegistration ?? false;
 
@@ -130,8 +134,15 @@
   Set<Registration> currentRegistrations = {};
   var _lastRegistrationId = 0;
 
-  ServerCapabilitiesComputer(this._server);
+  final dartFiles = DocumentFilter(language: 'dart', scheme: 'file');
+  final pubspecFile = DocumentFilter(
+      language: 'yaml', scheme: 'file', pattern: '**/pubspec.yaml');
+  final analysisOptionsFile = DocumentFilter(
+      language: 'yaml', scheme: 'file', pattern: '**/analysis_options.yaml');
+  final fixDataFile = DocumentFilter(
+      language: 'yaml', scheme: 'file', pattern: '**/lib/fix_data.yaml');
 
+  ServerCapabilitiesComputer(this._server);
   ServerCapabilities computeServerCapabilities(
       LspClientCapabilities clientCapabilities) {
     final codeActionLiteralSupport = clientCapabilities.literalCodeActions;
@@ -210,6 +221,11 @@
                   codeActionKinds: DartCodeActionKind.serverSupportedKinds,
                 ))
               : Either2<bool, CodeActionOptions>.t1(true),
+      colorProvider: dynamicRegistrations.colorProvider
+          ? null
+          : Either3<bool, DocumentColorOptions,
+                  DocumentColorRegistrationOptions>.t3(
+              DocumentColorRegistrationOptions(documentSelector: [dartFiles])),
       documentFormattingProvider: dynamicRegistrations.formatting
           ? null
           : Either2<bool, DocumentFormattingOptions>.t1(enableFormatter),
@@ -279,14 +295,6 @@
   /// support and it will be up to them to decide which file types they will
   /// send requests for.
   Future<void> performDynamicRegistration() async {
-    final dartFiles = DocumentFilter(language: 'dart', scheme: 'file');
-    final pubspecFile = DocumentFilter(
-        language: 'yaml', scheme: 'file', pattern: '**/pubspec.yaml');
-    final analysisOptionsFile = DocumentFilter(
-        language: 'yaml', scheme: 'file', pattern: '**/analysis_options.yaml');
-    final fixDataFile = DocumentFilter(
-        language: 'yaml', scheme: 'file', pattern: '**/lib/fix_data.yaml');
-
     final pluginTypes = _server.pluginManager.plugins
         .expand((plugin) => plugin.currentSession?.interestingFiles ?? const [])
         // All published plugins use something like `*.extension` as
@@ -410,6 +418,12 @@
       TextDocumentRegistrationOptions(documentSelector: fullySupportedTypes),
     );
     register(
+      dynamicRegistrations.colorProvider,
+      // This registration covers both documentColor and colorPresentation.
+      Method.textDocument_documentColor,
+      DocumentColorRegistrationOptions(documentSelector: [dartFiles]),
+    );
+    register(
       enableFormatter && dynamicRegistrations.formatting,
       Method.textDocument_formatting,
       TextDocumentRegistrationOptions(documentSelector: fullySupportedTypes),
@@ -523,30 +537,43 @@
       ..removeAll(registrationsToRemove)
       ..addAll(registrationsToAdd);
 
+    Future<void>? unregistrationRequest;
     if (registrationsToRemove.isNotEmpty) {
       final unregistrations = registrationsToRemove
           .map((r) => Unregistration(id: r.id, method: r.method))
           .toList();
-      await _server.sendRequest(Method.client_unregisterCapability,
+      // It's important not to await this request here, as we must ensure
+      // we cannot re-enter this method until we have sent both the unregister
+      // and register requests to the client atomically.
+      // https://github.com/dart-lang/sdk/issues/47851#issuecomment-988093109
+      unregistrationRequest = _server.sendRequest(
+          Method.client_unregisterCapability,
           UnregistrationParams(unregisterations: unregistrations));
     }
 
+    Future<void>? registrationRequest;
     // Only send the registration request if we have at least one (since
     // otherwise we don't know that the client supports registerCapability).
     if (registrationsToAdd.isNotEmpty) {
-      final registrationResponse = await _server.sendRequest(
-        Method.client_registerCapability,
-        RegistrationParams(registrations: registrationsToAdd),
-      );
-
-      final error = registrationResponse.error;
-      if (error != null) {
-        _server.logErrorToClient(
-          'Failed to register capabilities with client: '
-          '(${error.code}) '
-          '${error.message}',
-        );
-      }
+      registrationRequest = _server
+          .sendRequest(Method.client_registerCapability,
+              RegistrationParams(registrations: registrationsToAdd))
+          .then((registrationResponse) {
+        final error = registrationResponse.error;
+        if (error != null) {
+          _server.logErrorToClient(
+            'Failed to register capabilities with client: '
+            '(${error.code}) '
+            '${error.message}',
+          );
+        }
+      });
     }
+
+    // Only after we have sent both unregistration + registration events may
+    // we await them, knowing another "thread" could not have executed this
+    // method between them.
+    await unregistrationRequest;
+    await registrationRequest;
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/source_edits.dart b/pkg/analysis_server/lib/src/lsp/source_edits.dart
index 2a5834e..1e2b464 100644
--- a/pkg/analysis_server/lib/src/lsp/source_edits.dart
+++ b/pkg/analysis_server/lib/src/lsp/source_edits.dart
@@ -31,7 +31,7 @@
           Either2<TextDocumentContentChangeEvent1,
               TextDocumentContentChangeEvent2>>
       changes, {
-  failureIsCritical = false,
+  bool failureIsCritical = false,
 }) {
   var newContent = oldContent;
   final serverEdits = <server.SourceEdit>[];
@@ -45,9 +45,9 @@
       (change) {
         final lines = LineInfo.fromContent(newContent);
         final offsetStart = toOffset(lines, change.range.start,
-            failureIsCritial: failureIsCritical);
+            failureIsCritical: failureIsCritical);
         final offsetEnd = toOffset(lines, change.range.end,
-            failureIsCritial: failureIsCritical);
+            failureIsCritical: failureIsCritical);
         if (offsetStart.isError) {
           return ErrorOr.error(offsetStart.error);
         }
@@ -180,7 +180,10 @@
       // To handle this, if both unformatted/formatted contain at least one
       // newline, split this change into two around the last newline so that the
       // final part (likely leading whitespace) can be included without
-      // including the whole change.
+      // including the whole change. This cannot be done if the newline is at
+      // the end of the source whitespace though, as this would create a split
+      // where the first part is the same and the second part is empty,
+      // resulting in an infinite loop/stack overflow.
       //
       // Without this, functionality like VS Code's "format modified lines"
       // (which uses Git status to know which lines are edited) may appear to
@@ -188,7 +191,8 @@
       if (unformattedStart < rangeStart.result &&
           unformattedEnd > rangeStart.result &&
           unformattedWhitespace.contains('\n') &&
-          formattedWhitespace.contains('\n')) {
+          formattedWhitespace.contains('\n') &&
+          !unformattedWhitespace.endsWith('\n')) {
         // Find the offsets of the character after the last newlines.
         final unformattedOffset = unformattedWhitespace.lastIndexOf('\n') + 1;
         final formattedOffset = formattedWhitespace.lastIndexOf('\n') + 1;
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index 5972a14..fa6eee9 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -743,7 +743,7 @@
         sourceUrl: pubspecFile.toUri());
     var contents = document.contents;
     if (contents is YamlMap) {
-      YamlNode dependencies = contents['dependencies'];
+      var dependencies = contents['dependencies'] as YamlNode?;
       if (dependencies is YamlMap) {
         return dependencies.keys.cast<String>();
       }
diff --git a/pkg/analysis_server/lib/src/plugin/result_merger.dart b/pkg/analysis_server/lib/src/plugin/result_merger.dart
index 6e1257a..e8e51f3 100644
--- a/pkg/analysis_server/lib/src/plugin/result_merger.dart
+++ b/pkg/analysis_server/lib/src/plugin/result_merger.dart
@@ -239,9 +239,9 @@
     /// Return the index of the region in the collection of [mergedRegions] that
     /// covers exactly the same region as the [newRegion], or `-1` if there is
     /// no such region.
-    int matchingRegion(newRegion) {
-      int newOffset = newRegion.offset;
-      int newLength = newRegion.length;
+    int matchingRegion(NavigationRegion newRegion) {
+      var newOffset = newRegion.offset;
+      var newLength = newRegion.length;
       for (var i = 0; i < mergedRegions.length; i++) {
         var mergedRegion = mergedRegions[i];
         if (newOffset == mergedRegion.offset &&
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index 632f7f8..f854cc4 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -5,12 +5,15 @@
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/protocol/protocol_internal.dart'
+    show ResponseResult;
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/search/element_references.dart';
 import 'package:analysis_server/src/search/type_hierarchy.dart';
-import 'package:analysis_server/src/search/workspace_symbols.dart' as search;
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/search.dart' as search;
 
 /// Instances of the class [SearchDomainHandler] implement a [RequestHandler]
 /// that handles requests in the search domain.
@@ -161,21 +164,21 @@
       }
     }
 
-    var tracker = server.declarationsTracker;
-    if (tracker == null) {
+    if (!server.options.featureSet.completion) {
       server.sendResponse(Response.unsupportedFeature(
           request.id, 'Completion is not enabled.'));
       return;
     }
-    var files = <String>{};
-    var remainingMaxResults = params.maxResults;
-    var declarations = search.WorkspaceSymbols(tracker).declarations(
-      regExp,
-      remainingMaxResults,
-      files,
-      onlyForFile: params.file,
-    );
 
+    var workspaceSymbols = search.WorkspaceSymbols();
+    var analysisDrivers = server.driverMap.values.toList();
+    for (var analysisDriver in analysisDrivers) {
+      await analysisDriver.search.declarations(
+          workspaceSymbols, regExp, params.maxResults,
+          onlyForFile: params.file);
+    }
+
+    var declarations = workspaceSymbols.declarations;
     var elementDeclarations = declarations.map((declaration) {
       return protocol.ElementDeclaration(
           declaration.name,
@@ -192,7 +195,7 @@
     }).toList();
 
     server.sendResponse(protocol.SearchGetElementDeclarationsResult(
-            elementDeclarations, files.toList())
+            elementDeclarations, workspaceSymbols.files)
         .toResponse(request.id));
   }
 
@@ -226,7 +229,8 @@
   }
 
   @override
-  protocol.Response? handleRequest(protocol.Request request) {
+  protocol.Response? handleRequest(
+      protocol.Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == SEARCH_REQUEST_FIND_ELEMENT_REFERENCES) {
@@ -262,8 +266,8 @@
   }
 
   /// Send a search response with the given [result] to the given [request].
-  void _sendSearchResult(protocol.Request request, result) {
-    protocol.Response response = result.toResponse(request.id);
+  void _sendSearchResult(protocol.Request request, ResponseResult result) {
+    var response = result.toResponse(request.id);
     server.sendResponse(response);
   }
 
diff --git a/pkg/analysis_server/lib/src/search/workspace_symbols.dart b/pkg/analysis_server/lib/src/search/workspace_symbols.dart
deleted file mode 100644
index bbcf5ac..0000000
--- a/pkg/analysis_server/lib/src/search/workspace_symbols.dart
+++ /dev/null
@@ -1,203 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/services/available_declarations.dart';
-import 'package:analyzer/src/services/available_declarations.dart' as ad;
-
-class Declaration {
-  final int fileIndex;
-  final LineInfo lineInfo;
-  final String name;
-  final DeclarationKind kind;
-  final int offset;
-  final int line;
-  final int column;
-  final int codeOffset;
-  final int codeLength;
-  final String? className;
-  final String? mixinName;
-  final String? parameters;
-
-  Declaration(
-    this.fileIndex,
-    this.lineInfo,
-    this.name,
-    this.kind,
-    this.offset,
-    this.line,
-    this.column,
-    this.codeOffset,
-    this.codeLength,
-    this.className,
-    this.mixinName,
-    this.parameters,
-  );
-}
-
-enum DeclarationKind {
-  CLASS,
-  CLASS_TYPE_ALIAS,
-  CONSTRUCTOR,
-  ENUM,
-  ENUM_CONSTANT,
-  EXTENSION,
-  FIELD,
-  FUNCTION,
-  FUNCTION_TYPE_ALIAS,
-  GETTER,
-  METHOD,
-  MIXIN,
-  SETTER,
-  TYPE_ALIAS,
-  VARIABLE
-}
-
-class WorkspaceSymbols {
-  final DeclarationsTracker tracker;
-
-  WorkspaceSymbols(this.tracker);
-
-  List<Declaration> declarations(
-      RegExp? regExp, int? maxResults, Set<String> files,
-      {String? onlyForFile}) {
-    _doTrackerWork();
-
-    var declarations = <Declaration>[];
-
-    var pathToIndex = <String, int>{};
-
-    int getPathIndex(String path) {
-      var index = pathToIndex[path];
-      if (index == null) {
-        index = files.length;
-        files.add(path);
-        pathToIndex[path] = index;
-      }
-      return index;
-    }
-
-    if (maxResults != null && declarations.length >= maxResults) {
-      throw const _MaxNumberOfDeclarationsError();
-    }
-
-    void addDeclaration(ad.Declaration declaration) {
-      if (maxResults != null && declarations.length >= maxResults) {
-        throw const _MaxNumberOfDeclarationsError();
-      }
-
-      var path = declaration.locationPath;
-      if (onlyForFile != null && path != onlyForFile) {
-        return;
-      }
-
-      declaration.children.forEach(addDeclaration);
-
-      var name = declaration.name;
-      if (name.isEmpty) {
-        return;
-      }
-      if (name.endsWith('=')) {
-        name = name.substring(0, name.length - 1);
-      }
-      if (regExp != null && !regExp.hasMatch(name)) {
-        return;
-      }
-
-      var parent = declaration.parent;
-
-      String? className;
-      if (parent != null && parent.kind == ad.DeclarationKind.CLASS) {
-        className = parent.name;
-      }
-
-      String? mixinName;
-      if (parent != null && parent.kind == ad.DeclarationKind.MIXIN) {
-        mixinName = parent.name;
-      }
-
-      var topKind = _getTopKind(declaration.kind);
-      if (topKind == null) {
-        return;
-      }
-
-      declarations.add(
-        Declaration(
-          getPathIndex(path),
-          declaration.lineInfo,
-          name,
-          topKind,
-          declaration.locationOffset,
-          declaration.locationStartLine,
-          declaration.locationStartColumn,
-          declaration.codeOffset,
-          declaration.codeLength,
-          className,
-          mixinName,
-          declaration.parameters,
-        ),
-      );
-    }
-
-    var libraries = tracker.allLibraries;
-    try {
-      for (var library in libraries) {
-        library.declarations.forEach(addDeclaration);
-      }
-    } on _MaxNumberOfDeclarationsError {
-      // Uses an exception to short circuit the recursion when there are too
-      // many declarations.
-    }
-
-    return declarations;
-  }
-
-  void _doTrackerWork() {
-    while (tracker.hasWork) {
-      tracker.doWork();
-    }
-  }
-
-  static DeclarationKind? _getTopKind(ad.DeclarationKind kind) {
-    switch (kind) {
-      case ad.DeclarationKind.CLASS:
-        return DeclarationKind.CLASS;
-      case ad.DeclarationKind.CLASS_TYPE_ALIAS:
-        return DeclarationKind.CLASS_TYPE_ALIAS;
-      case ad.DeclarationKind.CONSTRUCTOR:
-        return DeclarationKind.CONSTRUCTOR;
-      case ad.DeclarationKind.ENUM:
-        return DeclarationKind.ENUM;
-      case ad.DeclarationKind.ENUM_CONSTANT:
-        return DeclarationKind.ENUM_CONSTANT;
-      case ad.DeclarationKind.EXTENSION:
-        return DeclarationKind.EXTENSION;
-      case ad.DeclarationKind.FIELD:
-        return DeclarationKind.FIELD;
-      case ad.DeclarationKind.FUNCTION_TYPE_ALIAS:
-        return DeclarationKind.FUNCTION_TYPE_ALIAS;
-      case ad.DeclarationKind.METHOD:
-        return DeclarationKind.METHOD;
-      case ad.DeclarationKind.MIXIN:
-        return DeclarationKind.MIXIN;
-      case ad.DeclarationKind.FUNCTION:
-        return DeclarationKind.FUNCTION;
-      case ad.DeclarationKind.GETTER:
-        return DeclarationKind.GETTER;
-      case ad.DeclarationKind.SETTER:
-        return DeclarationKind.SETTER;
-      case ad.DeclarationKind.TYPE_ALIAS:
-        return DeclarationKind.TYPE_ALIAS;
-      case ad.DeclarationKind.VARIABLE:
-        return DeclarationKind.VARIABLE;
-      default:
-        return null;
-    }
-  }
-}
-
-/// The marker class that is thrown to stop adding declarations.
-class _MaxNumberOfDeclarationsError {
-  const _MaxNumberOfDeclarationsError();
-}
diff --git a/pkg/analysis_server/lib/src/server/debounce_requests.dart b/pkg/analysis_server/lib/src/server/debounce_requests.dart
new file mode 100644
index 0000000..4ee01d6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/server/debounce_requests.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_constants.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/channel/channel.dart';
+
+/// Return the stream of requests that is filtered to exclude requests for
+/// which the client does not need actual responses.
+///
+/// If there is one completion request, and then another completion request,
+/// then most probably the user continued typing, and there is no need to
+/// compute results for the first request. But we will have to respond, an
+/// empty response is enough.
+///
+/// Discarded requests are reported into [discardedRequests].
+Stream<Request> debounceRequests(
+  ServerCommunicationChannel channel,
+  StreamController<Request> discardedRequests,
+) {
+  return _DebounceRequests(channel, discardedRequests).requests;
+}
+
+class _DebounceRequests {
+  final ServerCommunicationChannel channel;
+  final StreamController<Request> discardedRequests;
+  late final Stream<Request> requests;
+
+  _DebounceRequests(this.channel, this.discardedRequests) {
+    var buffer = <Request>[];
+    Timer? timer;
+
+    requests = channel.requests.transform(
+      StreamTransformer.fromHandlers(
+        handleData: (request, sink) {
+          buffer.add(request);
+          // Accumulate requests for a short period of time.
+          // When we were busy processing a request, the client could put
+          // multiple requests into the event queue. So, when we look, we will
+          // quickly get all of them. So, even 1 ms should be enough.
+          timer ??= Timer(const Duration(milliseconds: 1), () {
+            timer = null;
+            var filtered = _filterCompletion(buffer);
+            buffer = [];
+            for (var request in filtered) {
+              sink.add(request);
+            }
+          });
+        },
+      ),
+    );
+  }
+
+  List<Request> _filterCompletion(List<Request> requests) {
+    var reversed = <Request>[];
+    var abortCompletionRequests = false;
+    for (var request in requests.reversed) {
+      if (request.method == ANALYSIS_REQUEST_UPDATE_CONTENT) {
+        abortCompletionRequests = true;
+      }
+      if (request.method == COMPLETION_REQUEST_GET_SUGGESTIONS2) {
+        if (abortCompletionRequests) {
+          discardedRequests.add(request);
+          var params = CompletionGetSuggestions2Params.fromRequest(request);
+          var offset = params.offset;
+          channel.sendResponse(
+            CompletionGetSuggestions2Result(offset, 0, [], [], true)
+                .toResponse(request.id),
+          );
+          continue;
+        } else {
+          abortCompletionRequests = true;
+        }
+      }
+      reversed.add(request);
+    }
+    return reversed.reversed.toList();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/server/dev_server.dart b/pkg/analysis_server/lib/src/server/dev_server.dart
index 62886da6..d59e2fa 100644
--- a/pkg/analysis_server/lib/src/server/dev_server.dart
+++ b/pkg/analysis_server/lib/src/server/dev_server.dart
@@ -80,20 +80,21 @@
           continue;
         }
 
-        String severity = error['severity'].toLowerCase();
+        var severity = (error['severity'] as String).toLowerCase();
         if (severity == 'warning' && exitCode < 1) {
           exitCode = 1;
         } else if (severity == 'error' && exitCode < 2) {
           exitCode = 2;
         }
 
-        String message = error['message'];
+        var message = error['message'] as String;
         if (message.endsWith('.')) {
           message = message.substring(0, message.length - 1);
         }
-        String code = error['code'];
-        int line = error['location']['startLine'];
-        int column = error['location']['startColumn'];
+        var code = error['code'] as String;
+        var location = error['location'] as Map<Object?, Object?>;
+        var line = location['startLine'] as int;
+        var column = location['startColumn'] as int;
 
         print('  $severity • $bold$message$none at $filePath:$line:$column • '
             '($code)');
@@ -165,21 +166,11 @@
   Stream<Notification> get onNotification => _notificationController.stream;
 
   @override
-  void close() {
-    _notificationController.close();
-  }
+  Stream<Request> get requests => _requestController.stream;
 
   @override
-  void listen(
-    void Function(Request request) onRequest, {
-    Function? onError,
-    void Function()? onDone,
-  }) {
-    _requestController.stream.listen(
-      onRequest,
-      onError: onError,
-      onDone: onDone,
-    );
+  void close() {
+    _notificationController.close();
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 025eb5b..47504a4 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -101,6 +101,9 @@
   /// The path to the package config file override.
   static const String PACKAGES_FILE = 'packages';
 
+  /// The forced protocol version that the server will report to the client.
+  static const String REPORT_PROTOCOL_VERSION = 'report-protocol-version';
+
   /// The name of the flag specifying the server protocol to use.
   static const String SERVER_PROTOCOL = 'protocol';
   static const String PROTOCOL_ANALYZER = 'analyzer';
@@ -142,10 +145,12 @@
 
     var analysisServerOptions = AnalysisServerOptions();
     analysisServerOptions.newAnalysisDriverLog =
-        results[ANALYSIS_DRIVER_LOG] ?? results[ANALYSIS_DRIVER_LOG_ALIAS];
-    analysisServerOptions.clientId = results[CLIENT_ID];
+        (results[ANALYSIS_DRIVER_LOG] ?? results[ANALYSIS_DRIVER_LOG_ALIAS])
+            as String?;
+    analysisServerOptions.clientId = results[CLIENT_ID] as String?;
     if (results.wasParsed(USE_LSP)) {
-      analysisServerOptions.useLanguageServerProtocol = results[USE_LSP];
+      analysisServerOptions.useLanguageServerProtocol =
+          results[USE_LSP] as bool;
     } else {
       analysisServerOptions.useLanguageServerProtocol =
           results[SERVER_PROTOCOL] == PROTOCOL_LSP;
@@ -157,16 +162,18 @@
             ? 'unknown.client.lsp'
             : 'unknown.client.classic';
 
-    analysisServerOptions.clientVersion = results[CLIENT_VERSION];
-    analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
-    analysisServerOptions.packagesFile = results[PACKAGES_FILE];
+    analysisServerOptions.clientVersion = results[CLIENT_VERSION] as String?;
+    analysisServerOptions.cacheFolder = results[CACHE_FOLDER] as String?;
+    analysisServerOptions.packagesFile = results[PACKAGES_FILE] as String?;
+    analysisServerOptions.reportProtocolVersion =
+        results[REPORT_PROTOCOL_VERSION] as String?;
 
     // Read in any per-SDK overrides specified in <sdk>/config/settings.json.
     var sdkConfig = SdkConfiguration.readFromSdk();
     analysisServerOptions.configurationOverrides = sdkConfig;
 
     // Analytics
-    bool disableAnalyticsForSession = results[SUPPRESS_ANALYTICS_FLAG];
+    var disableAnalyticsForSession = results[SUPPRESS_ANALYTICS_FLAG] as bool;
     if (results.wasParsed(TRAIN_USING)) {
       disableAnalyticsForSession = true;
     }
@@ -207,15 +214,16 @@
 
     if (telemetry.showAnalyticsUI) {
       if (results.wasParsed(ANALYTICS_FLAG)) {
-        analytics.enabled = results[ANALYTICS_FLAG];
+        analytics.enabled = results[ANALYTICS_FLAG] as bool;
         print(telemetry.createAnalyticsStatusMessage(analytics.enabled));
         return null;
       }
     }
 
     {
-      bool disableCompletion = results[DISABLE_SERVER_FEATURE_COMPLETION];
-      bool disableSearch = results[DISABLE_SERVER_FEATURE_SEARCH];
+      var disableCompletion =
+          results[DISABLE_SERVER_FEATURE_COMPLETION] as bool;
+      var disableSearch = results[DISABLE_SERVER_FEATURE_SEARCH] as bool;
       if (disableCompletion || disableSearch) {
         analysisServerOptions.featureSet = FeatureSet(
           completion: !disableCompletion,
@@ -224,7 +232,7 @@
       }
     }
 
-    if (results[HELP_OPTION]) {
+    if (results[HELP_OPTION] as bool) {
       _printUsage(parser, analytics, fromHelp: true);
       return null;
     }
@@ -239,8 +247,8 @@
     //
     // Initialize the instrumentation service.
     //
-    var logFilePath =
-        results[PROTOCOL_TRAFFIC_LOG] ?? results[PROTOCOL_TRAFFIC_LOG_ALIAS];
+    var logFilePath = (results[PROTOCOL_TRAFFIC_LOG] ??
+        results[PROTOCOL_TRAFFIC_LOG_ALIAS]) as String?;
     var allInstrumentationServices = this.instrumentationService == null
         ? <InstrumentationService>[]
         : [this.instrumentationService!];
@@ -269,8 +277,8 @@
     AnalysisEngine.instance.instrumentationService = instrumentationService;
 
     int? diagnosticServerPort;
-    final String? portValue =
-        results[DIAGNOSTIC_PORT] ?? results[DIAGNOSTIC_PORT_ALIAS];
+    final portValue =
+        (results[DIAGNOSTIC_PORT] ?? results[DIAGNOSTIC_PORT_ALIAS]) as String?;
     if (portValue != null) {
       try {
         diagnosticServerPort = int.parse(portValue);
@@ -319,10 +327,10 @@
     ErrorNotifier errorNotifier,
     SendPort? sendPort,
   ) {
-    var capture = results[DISABLE_SERVER_EXCEPTION_HANDLING]
+    var capture = results[DISABLE_SERVER_EXCEPTION_HANDLING] as bool
         ? (_, Function f, {Function(String)? print}) => f()
         : _captureExceptions;
-    var trainDirectory = results[TRAIN_USING];
+    var trainDirectory = results[TRAIN_USING] as String?;
     if (trainDirectory != null) {
       if (!FileSystemEntity.isDirectorySync(trainDirectory)) {
         print("Training directory '$trainDirectory' not found.\n");
@@ -421,7 +429,7 @@
           if (sendPort == null) exit(0);
         });
       },
-          print: results[INTERNAL_PRINT_TO_CONSOLE]
+          print: results[INTERNAL_PRINT_TO_CONSOLE] as bool
               ? null
               : httpServer!.recordPrint);
     }
@@ -435,7 +443,7 @@
     int? diagnosticServerPort,
     ErrorNotifier errorNotifier,
   ) {
-    var capture = args[DISABLE_SERVER_EXCEPTION_HANDLING]
+    var capture = args[DISABLE_SERVER_EXCEPTION_HANDLING] as bool
         ? (_, Function f, {Function(String)? print}) => f()
         : _captureExceptions;
 
@@ -478,7 +486,7 @@
       InstrumentationService service, void Function() callback,
       {void Function(String line)? print}) {
     void errorFunction(Zone self, ZoneDelegate parent, Zone zone,
-        dynamic exception, StackTrace stackTrace) {
+        Object exception, StackTrace stackTrace) {
       service.logException(exception, stackTrace);
       throw exception;
     }
@@ -688,6 +696,14 @@
         defaultsTo: false,
         negatable: false,
         hide: true);
+    parser.addOption(
+      REPORT_PROTOCOL_VERSION,
+      valueHelp: 'version',
+      help: 'The protocol version that the server will report to the client, '
+          'can be used to temporary enabling features that we expect to be '
+          'available in future versions.',
+      hide: true,
+    );
 
     //
     // Hidden; these are deprecated and no longer read from.
diff --git a/pkg/analysis_server/lib/src/server/sdk_configuration.dart b/pkg/analysis_server/lib/src/server/sdk_configuration.dart
index 39eb0d1..23d6a76 100644
--- a/pkg/analysis_server/lib/src/server/sdk_configuration.dart
+++ b/pkg/analysis_server/lib/src/server/sdk_configuration.dart
@@ -40,19 +40,21 @@
   }
 
   /// Whether analytics is forced on.
-  bool? get analyticsForceEnabled => _values['server.analytics.forceEnabled'];
+  bool? get analyticsForceEnabled =>
+      _values['server.analytics.forceEnabled'] as bool?;
 
   /// Return an override value for the analysis server's google analytics ID, or
   /// `null` if the default value should be used.
-  String? get analyticsId => _values['server.analytics.id'];
+  String? get analyticsId => _values['server.analytics.id'] as String?;
 
   /// Whether crash reporting is forced on.
   bool? get crashReportingForceEnabled =>
-      _values['server.crash.reporting.forceEnabled'];
+      _values['server.crash.reporting.forceEnabled'] as bool?;
 
   /// Return an override value for the analysis server's crash reporting product
   /// ID, or `null` if the default value should be used.
-  String? get crashReportingId => _values['server.crash.reporting.id'];
+  String? get crashReportingId =>
+      _values['server.crash.reporting.id'] as String?;
 
   /// Return a string describing the contents of this SDK configuration.
   String get displayString {
@@ -67,9 +69,10 @@
 
   void _readFromFile(File file) {
     try {
-      Map m = jsonDecode(file.readAsStringSync());
-      for (var key in m.keys) {
-        _values[key] = m[key];
+      var content =
+          jsonDecode(file.readAsStringSync()) as Map<Object?, Object?>;
+      for (var key in content.keys) {
+        _values[key as String] = content[key];
       }
     } catch (_) {
       // ignore issues reading the file
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_performance.dart b/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
index b0c2ac4..7815def 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
@@ -35,16 +35,19 @@
 
 /// Overall performance of a code completion operation.
 class CompletionPerformance {
-  String? path;
-  String snippet = '';
+  final OperationPerformance operation;
+  final String path;
+  final String snippet;
   int suggestionCount = -1;
-  OperationPerformance? _operation;
+
+  CompletionPerformance({
+    required this.operation,
+    required this.path,
+    required String content,
+    required int offset,
+  }) : snippet = _computeCompletionSnippet(content, offset);
 
   int get elapsedInMilliseconds {
-    var operation = _operation;
-    if (operation == null) {
-      throw StateError('Access of elapsed time before the operation is run');
-    }
     return operation.elapsed.inMilliseconds;
   }
 
@@ -52,21 +55,4 @@
     if (suggestionCount < 1) return '';
     return '$suggestionCount';
   }
-
-  Future<T> runRequestOperation<T>(
-    Future<T> Function(OperationPerformanceImpl) operation,
-  ) async {
-    var rootOperation = OperationPerformanceImpl('<root>');
-    try {
-      return rootOperation.runAsync('<request>', (performance) async {
-        return await operation(performance);
-      });
-    } finally {
-      _operation = rootOperation.children.first;
-    }
-  }
-
-  void setContentsAndOffset(String contents, int offset) {
-    snippet = _computeCompletionSnippet(contents, offset);
-  }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index a6ff620..8cdcb87 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
@@ -7,10 +7,9 @@
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 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';
 
 /// A contributor that produces suggestions for named expression labels that
 /// correspond to named parameters when completing in argument lists.
@@ -100,7 +99,9 @@
     if (_isEditingNamedArgLabel() ||
         _isAppendingToArgList() ||
         _isAddingLabelToPositional()) {
-      if (requiredCount == 0 || requiredCount < _argCount()) {
+      if (request.featureSet.isEnabled(Feature.named_arguments_anywhere) ||
+          requiredCount == 0 ||
+          requiredCount < _argCount()) {
         // If there's a replacement range that starts at the caret, it will be
         // for an identifier that is not the named label and therefore it should
         // not be replaced.
@@ -110,7 +111,8 @@
                 ? 0
                 : null;
 
-        var addTrailingComma = !_isFollowedByAComma() && _isInFlutterCreation();
+        var addTrailingComma =
+            !request.target.isFollowedByComma && _isInFlutterCreation();
         _addDefaultParamSuggestions(parameters,
             appendComma: addTrailingComma,
             replacementLength: replacementLength);
@@ -119,12 +121,7 @@
       _addDefaultParamSuggestions(parameters, appendComma: true);
     } else if (_isInsertingToArgListWithSynthetic()) {
       _addDefaultParamSuggestions(parameters,
-          appendComma: !_isFollowedByAComma());
-    } else {
-      var argument = request.target.containingNode;
-      if (argument is NamedExpression) {
-        _buildClosureSuggestions(argument);
-      }
+          appendComma: !request.target.isFollowedByComma);
     }
   }
 
@@ -144,15 +141,6 @@
     return 0;
   }
 
-  void _buildClosureSuggestions(NamedExpression argument) {
-    var type = argument.staticParameterElement?.type;
-    if (type is FunctionType) {
-      builder.suggestClosure(type,
-          includeTrailingComma:
-              argument.endToken.next?.type != TokenType.COMMA);
-    }
-  }
-
   /// Return `true` if the caret is preceding an arg where a name could be added
   /// (turning a positional arg into a named arg).
   bool _isAddingLabelToPositional() {
@@ -219,24 +207,6 @@
     return false;
   }
 
-  bool _isFollowedByAComma() {
-    // new A(^); NO
-    // new A(one: 1, ^); NO
-    // new A(^ , one: 1); YES
-    // new A(^), ... NO
-
-    var containingNode = request.target.containingNode;
-    var entity = request.target.entity;
-    var token = entity is AstNode
-        ? entity.endToken
-        : entity is Token
-            ? entity
-            : null;
-    return (token != containingNode.endToken) &&
-        token?.next?.type == TokenType.COMMA &&
-        !(token?.next?.isSynthetic ?? false);
-  }
-
   bool _isInFlutterCreation() {
     var flutter = Flutter.instance;
     var containingNode = request.target.containingNode;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/closure_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/closure_contributor.dart
new file mode 100644
index 0000000..5700872
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/dart/closure_contributor.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/type.dart';
+
+/// A contributor that produces a closure matching the context type.
+class ClosureContributor extends DartCompletionContributor {
+  ClosureContributor(
+    DartCompletionRequest request,
+    SuggestionBuilder builder,
+  ) : super(request, builder);
+
+  bool get _isArgument {
+    var node = request.target.containingNode;
+    return node is ArgumentList || node is NamedExpression;
+  }
+
+  @override
+  Future<void> computeSuggestions() async {
+    var contextType = request.contextType;
+    if (contextType is FunctionType) {
+      builder.suggestClosure(
+        contextType,
+        includeTrailingComma: _isArgument && !request.target.isFollowedByComma,
+      );
+    }
+  }
+}
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 78fef2f..4193128 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
@@ -6,6 +6,7 @@
 import 'package:analysis_server/src/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
+import 'package:analysis_server/src/services/completion/dart/closure_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/combinator_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/documentation_cache.dart';
 import 'package:analysis_server/src/services/completion/dart/extension_member_contributor.dart';
@@ -37,6 +38,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
@@ -90,10 +92,11 @@
   /// suggestions, or `null` if no notification should occur.
   final SuggestionListener? listener;
 
-  /// If specified, will be filled with URIs of libraries that are not yet
-  /// imported, but could be imported into the requested target. Corresponding
-  /// [CompletionSuggestion] will have the import index into this list.
-  final List<Uri>? librariesToImport;
+  /// If specified, will be filled with suggestions and URIs from libraries
+  /// that are not yet imported, but could be imported into the requested
+  /// target. It is up to the client to make copies of [CompletionSuggestion]s
+  /// with the import index property updated.
+  final Map<protocol.CompletionSuggestion, Uri>? notImportedSuggestions;
 
   /// Initialize a newly created completion manager. The parameters
   /// [includedElementKinds], [includedElementNames], and
@@ -105,7 +108,7 @@
     this.includedElementNames,
     this.includedSuggestionRelevanceTags,
     this.listener,
-    this.librariesToImport,
+    this.notImportedSuggestions,
   }) : assert((includedElementKinds != null &&
                 includedElementNames != null &&
                 includedSuggestionRelevanceTags != null) ||
@@ -121,7 +124,7 @@
   }) async {
     request.checkAborted();
     var pathContext = request.resourceProvider.pathContext;
-    if (!file_paths.isDart(pathContext, request.result.path)) {
+    if (!file_paths.isDart(pathContext, request.path)) {
       return const <CompletionSuggestion>[];
     }
 
@@ -136,6 +139,7 @@
     var builder = SuggestionBuilder(request, listener: listener);
     var contributors = <DartCompletionContributor>[
       ArgListContributor(request, builder),
+      ClosureContributor(request, builder),
       CombinatorContributor(request, builder),
       ExtensionMemberContributor(request, builder),
       FieldFormalContributor(request, builder),
@@ -163,10 +167,11 @@
       );
     }
 
-    final librariesToImport = this.librariesToImport;
-    if (librariesToImport != null) {
+    final notImportedSuggestions = this.notImportedSuggestions;
+    if (notImportedSuggestions != null) {
       contributors.add(
-        NotImportedContributor(request, builder, budget, librariesToImport),
+        NotImportedContributor(
+            request, builder, budget, notImportedSuggestions),
       );
     }
 
@@ -274,8 +279,14 @@
 
 /// The information about a requested list of completions within a Dart file.
 class DartCompletionRequest {
+  /// The analysis session that produced the elements of the request.
+  final AnalysisSessionImpl analysisSession;
+
   final CompletionPreference completionPreference;
 
+  /// The content of the file in which completion is requested.
+  final String content;
+
   /// Return the type imposed on the target's `containingNode` based on its
   /// context, or `null` if the context does not impose any type.
   final DartType? contextType;
@@ -289,6 +300,9 @@
   /// compute relevance scores for suggestions.
   final FeatureComputer featureComputer;
 
+  /// The library element of the file in which completion is requested.
+  final LibraryElement libraryElement;
+
   /// Return the offset within the source at which the completion is being
   /// requested.
   final int offset;
@@ -297,14 +311,13 @@
   /// request.
   final OpType opType;
 
+  /// The absolute path of the file where completion is requested.
+  final String path;
+
   /// The source range that represents the region of text that should be
   /// replaced when a suggestion is selected.
   final SourceRange replacementRange;
 
-  /// The analysis result for the file in which the completion is being
-  /// requested.
-  final ResolvedUnitResult result;
-
   /// Return the source in which the completion is being requested.
   final Source source;
 
@@ -317,17 +330,22 @@
   bool _aborted = false;
 
   factory DartCompletionRequest({
-    required ResolvedUnitResult resolvedUnit,
+    required AnalysisSession analysisSession,
+    required String filePath,
+    required String fileContent,
+    required CompilationUnitElement unitElement,
+    required AstNode enclosingNode,
     required int offset,
     DartdocDirectiveInfo? dartdocDirectiveInfo,
     CompletionPreference completionPreference = CompletionPreference.insert,
     DocumentationCache? documentationCache,
   }) {
-    var target = CompletionTarget.forOffset(resolvedUnit.unit, offset);
+    var target = CompletionTarget.forOffset(enclosingNode, offset);
 
+    var libraryElement = unitElement.library;
     var featureComputer = FeatureComputer(
-      resolvedUnit.typeSystem,
-      resolvedUnit.typeProvider,
+      libraryElement.typeSystem,
+      libraryElement.typeProvider,
     );
 
     var contextType = featureComputer.computeContextType(
@@ -341,34 +359,65 @@
     }
 
     return DartCompletionRequest._(
+      analysisSession: analysisSession as AnalysisSessionImpl,
       completionPreference: completionPreference,
+      content: fileContent,
       contextType: contextType,
       dartdocDirectiveInfo: dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
       documentationCache: documentationCache,
       featureComputer: featureComputer,
+      libraryElement: libraryElement,
       offset: offset,
       opType: opType,
+      path: filePath,
       replacementRange: target.computeReplacementRange(offset),
-      result: resolvedUnit,
-      source: resolvedUnit.unit.declaredElement!.source,
+      source: unitElement.source,
       target: target,
     );
   }
 
+  factory DartCompletionRequest.forResolvedUnit({
+    required ResolvedUnitResult resolvedUnit,
+    required int offset,
+    DartdocDirectiveInfo? dartdocDirectiveInfo,
+    CompletionPreference completionPreference = CompletionPreference.insert,
+    DocumentationCache? documentationCache,
+  }) {
+    return DartCompletionRequest(
+      analysisSession: resolvedUnit.session,
+      filePath: resolvedUnit.path,
+      fileContent: resolvedUnit.content,
+      unitElement: resolvedUnit.unit.declaredElement!,
+      enclosingNode: resolvedUnit.unit,
+      offset: offset,
+      dartdocDirectiveInfo: dartdocDirectiveInfo,
+      completionPreference: completionPreference,
+      documentationCache: documentationCache,
+    );
+  }
+
   DartCompletionRequest._({
+    required this.analysisSession,
     required this.completionPreference,
+    required this.content,
     required this.contextType,
     required this.dartdocDirectiveInfo,
     required this.documentationCache,
     required this.featureComputer,
+    required this.libraryElement,
     required this.offset,
     required this.opType,
+    required this.path,
     required this.replacementRange,
-    required this.result,
     required this.source,
     required this.target,
   });
 
+  DriverBasedAnalysisContext get analysisContext {
+    var analysisContext = analysisSession.analysisContext;
+    return analysisContext as DriverBasedAnalysisContext;
+  }
+
   /// Return the feature set that was used to analyze the compilation unit in
   /// which suggestions are being made.
   FeatureSet get featureSet => libraryElement.featureSet;
@@ -384,10 +433,6 @@
     return entity is Expression && entity.inConstantContext;
   }
 
-  /// Return the library element which contains the unit in which the completion
-  /// is occurring.
-  LibraryElement get libraryElement => result.libraryElement;
-
   /// Answer the [DartType] for Object in dart:core
   DartType get objectType => libraryElement.typeProvider.objectType;
 
@@ -406,16 +451,11 @@
   int get replacementOffset => replacementRange.offset;
 
   /// Return the resource provider associated with this request.
-  ResourceProvider get resourceProvider => result.session.resourceProvider;
-
-  /// Return the content of the [source] in which the completion is being
-  /// requested, or `null` if the content could not be accessed.
-  String? get sourceContents => result.content;
+  ResourceProvider get resourceProvider => analysisSession.resourceProvider;
 
   /// Return the [SourceFactory] of the request.
   SourceFactory get sourceFactory {
-    var context = result.session.analysisContext as DriverBasedAnalysisContext;
-    return context.driver.sourceFactory;
+    return analysisContext.driver.sourceFactory;
   }
 
   /// Return prefix that already exists in the document for [target] or empty
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart b/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
index 0ca62d6..8411094 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/documentation_cache.dart
@@ -162,17 +162,16 @@
 }
 
 extension on Map<String, DocumentationWithSummary> {
-  /// Cache the data associated with the top-level [element], and return the
-  /// [key] used for the element. This does not cache any data associated with
-  /// any other elements, including children of the [element].
-  String? cacheTopLevelElement(
-      DartdocDirectiveInfo dartdocDirectiveInfo, Element element) {
-    var key = element.name;
-    if (key == null) {
-      return null;
+  /// Cache the data associated with the [element], using the given [key].
+  DocumentationWithSummary? cacheElement(
+      DartdocDirectiveInfo dartdocDirectiveInfo, String key, Element element) {
+    var documentation = DartUnitHoverComputer.computeDocumentation(
+        dartdocDirectiveInfo, element,
+        includeSummary: true);
+    if (documentation is DocumentationWithSummary) {
+      return this[key] = documentation;
     }
-    cacheElement(dartdocDirectiveInfo, key, element);
-    return key;
+    return this[key] = DocumentationCache._emptyDocs;
   }
 
   /// Cache the data associated with the [member] element given that the key
@@ -186,15 +185,16 @@
     cacheElement(dartdocDirectiveInfo, '$parentKey.$name', member);
   }
 
-  /// Cache the data associated with the [element], using the given [key].
-  DocumentationWithSummary? cacheElement(
-      DartdocDirectiveInfo dartdocDirectiveInfo, String key, Element element) {
-    var documentation = DartUnitHoverComputer.computeDocumentation(
-        dartdocDirectiveInfo, element,
-        includeSummary: true);
-    if (documentation is DocumentationWithSummary) {
-      return this[key] = documentation;
+  /// Cache the data associated with the top-level [element], and return the
+  /// [key] used for the element. This does not cache any data associated with
+  /// any other elements, including children of the [element].
+  String? cacheTopLevelElement(
+      DartdocDirectiveInfo dartdocDirectiveInfo, Element element) {
+    var key = element.name;
+    if (key == null) {
+      return null;
     }
-    return this[key] = DocumentationCache._emptyDocs;
+    cacheElement(dartdocDirectiveInfo, key, element);
+    return key;
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_cache.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_cache.dart
deleted file mode 100644
index 38481dc..0000000
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_cache.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-
-/// Cached data about the extensions defined in a single analysis context.
-class ExtensionCache {
-  /// A set containing the paths of the compilation units that have been cached.
-  /// The set is used to prevent caching the same data multiple times.
-  final Set<String> processedUnits = {};
-
-  /// A map from the name of a non-static public extension member to the set of
-  /// paths to libraries defining an extension member with that name.
-  final Map<String, Set<UnitInLibrary>> membersByName = {};
-
-  /// Initialize a newly created cache.
-  ExtensionCache();
-
-  /// Fill the cache with data from the [result].
-  void cacheFromResult(ResolvedUnitResult result) {
-    var element = result.unit.declaredElement;
-    if (element != null) {
-      _cacheFromElement(element);
-      for (var library in result.libraryElement.importedLibraries) {
-        _cacheLibrary(library);
-      }
-    }
-  }
-
-  /// Fill the cache with data from the [compilationUnit].
-  void _cacheFromElement(CompilationUnitElement compilationUnit) {
-    // Record that we've cached data for the compilation unit.
-    var unitPath = _keyForUnit(compilationUnit);
-    processedUnits.add(unitPath);
-
-    // Flush any data that was previously cached for the compilation unit.
-    for (var set in membersByName.values) {
-      set.removeWhere((element) => element.unitPath == unitPath);
-    }
-
-    // Cache the data for the compilation unit.
-    var libraryPath = compilationUnit.librarySource.fullName;
-    for (var extension in compilationUnit.extensions) {
-      var extensionName = extension.name;
-      if (extensionName != null && !Identifier.isPrivateName(extensionName)) {
-        for (var member in extension.accessors) {
-          if (!member.isSynthetic) {
-            _recordMember(unitPath, libraryPath, member.displayName);
-          }
-        }
-        for (var member in extension.fields) {
-          if (!member.isSynthetic) {
-            _recordMember(unitPath, libraryPath, member.name);
-          }
-        }
-        for (var member in extension.methods) {
-          _recordMember(unitPath, libraryPath, member.name);
-        }
-      }
-    }
-  }
-
-  /// Cache the data for the given [library] and every library exported from it
-  /// if it hasn't already been cached.
-  void _cacheLibrary(LibraryElement library) {
-    if (_hasDataFor(library.definingCompilationUnit)) {
-      return;
-    }
-    for (var unit in library.units) {
-      _cacheFromElement(unit);
-    }
-    for (var exported in library.exportedLibraries) {
-      _cacheLibrary(exported);
-    }
-  }
-
-  /// Return `true` if the cache contains data for the [compilationUnit].
-  bool _hasDataFor(CompilationUnitElement compilationUnit) {
-    return processedUnits.contains(_keyForUnit(compilationUnit));
-  }
-
-  /// Return the key used in the [extensionCache] for the [compilationUnit].
-  String _keyForUnit(CompilationUnitElement compilationUnit) =>
-      compilationUnit.source.fullName;
-
-  /// Record that an extension member with the given [name] is defined in the
-  /// compilation unit with the [unitPath] in the library with the
-  /// [libraryPath].
-  void _recordMember(String unitPath, String libraryPath, String name) {
-    membersByName
-        .putIfAbsent(name, () => {})
-        .add(UnitInLibrary(unitPath, libraryPath));
-  }
-}
-
-/// A representation of a compilation unit in a library.
-class UnitInLibrary {
-  final String unitPath;
-  final String libraryPath;
-
-  UnitInLibrary(this.unitPath, this.libraryPath);
-}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index aa75988..3b4f5f2 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -7,10 +7,10 @@
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analysis_server/src/utilities/extensions/element.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/resolver/applicable_extensions.dart';
 
 /// A contributor that produces suggestions based on the members of an
 /// extension.
@@ -115,21 +115,21 @@
 
   void _addExtensionMembers(List<ExtensionElement> extensions,
       CompletionSuggestionKind? kind, DartType type) {
-    var containingLibrary = request.libraryElement;
-    var typeSystem = containingLibrary.typeSystem;
-    for (var extension in extensions) {
-      var extendedType =
-          extension.resolvedExtendedType(containingLibrary, type);
-      if (extendedType != null && typeSystem.isSubtypeOf(type, extendedType)) {
-        var inheritanceDistance = 0.0;
-        if (type is InterfaceType && extendedType is InterfaceType) {
-          inheritanceDistance = memberBuilder.request.featureComputer
-              .inheritanceDistanceFeature(type.element, extendedType.element);
-        }
-        // TODO(brianwilkerson) We might want to apply the substitution to the
-        //  members of the extension for display purposes.
-        _addInstanceMembers(extension, kind, inheritanceDistance);
+    var applicableExtensions = extensions.applicableTo(
+      targetLibrary: request.libraryElement,
+      targetType: type,
+    );
+    for (var instantiatedExtension in applicableExtensions) {
+      var extendedType = instantiatedExtension.extendedType;
+      var inheritanceDistance = 0.0;
+      if (type is InterfaceType && extendedType is InterfaceType) {
+        inheritanceDistance = memberBuilder.request.featureComputer
+            .inheritanceDistanceFeature(type.element, extendedType.element);
       }
+      // TODO(brianwilkerson) We might want to apply the substitution to the
+      //  members of the extension for display purposes.
+      _addInstanceMembers(
+          instantiatedExtension.extension, kind, inheritanceDistance);
     }
   }
 
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 734a36e..2441362 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
@@ -163,13 +163,8 @@
       return;
     }
 
-    var libraryUnits = request.result.unit.declaredElement?.library.units;
-    if (libraryUnits == null) {
-      return;
-    }
-
     var visitor = LibraryElementSuggestionBuilder(request, builder);
-    for (var unit in libraryUnits) {
+    for (var unit in request.libraryElement.units) {
       if (unit.source != request.source) {
         unit.accept(visitor);
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/not_imported_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/not_imported_contributor.dart
index 629fe475..070294f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/not_imported_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/not_imported_contributor.dart
@@ -4,43 +4,35 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/extension_member_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:analyzer/src/dart/analysis/session.dart';
-import 'package:analyzer/src/lint/pub.dart';
-import 'package:analyzer/src/workspace/pub.dart';
-import 'package:collection/collection.dart';
-import 'package:meta/meta.dart';
+import 'package:analyzer/src/dart/analysis/file_state_filter.dart';
 
 /// A contributor of suggestions from not yet imported libraries.
 class NotImportedContributor extends DartCompletionContributor {
-  /// Tests set this function to abort the current request.
-  @visibleForTesting
-  static void Function(FileState)? onFile;
-
   final CompletionBudget budget;
-  final List<Uri> librariesToImport;
+  final Map<protocol.CompletionSuggestion, Uri> notImportedSuggestions;
 
   NotImportedContributor(
     DartCompletionRequest request,
     SuggestionBuilder builder,
     this.budget,
-    this.librariesToImport,
+    this.notImportedSuggestions,
   ) : super(request, builder);
 
   @override
   Future<void> computeSuggestions() async {
-    var session = request.result.session as AnalysisSessionImpl;
-    var analysisDriver = session.getDriver(); // ignore: deprecated_member_use
+    var analysisDriver = request.analysisContext.driver;
 
     var fsState = analysisDriver.fsState;
-    var filter = _buildFilter(fsState);
+    var filter = FileStateFilter(
+      fsState.getFileForPath(request.path),
+    );
 
     try {
       await analysisDriver.discoverAvailableFiles().timeout(budget.left);
@@ -53,9 +45,6 @@
 
     var knownFiles = fsState.knownFiles.toList();
     for (var file in knownFiles) {
-      onFile?.call(file);
-      request.checkAborted();
-
       if (budget.isEmpty) {
         return;
       }
@@ -64,15 +53,18 @@
         continue;
       }
 
-      var elementResult = await session.getLibraryByUri(file.uriStr);
-      if (elementResult is! LibraryElementResult) {
+      var element = analysisDriver.getLibraryByFile(file);
+      if (element == null) {
         continue;
       }
 
-      var exportNamespace = elementResult.element.exportNamespace;
+      var exportNamespace = element.exportNamespace;
       var exportElements = exportNamespace.definedNames.values.toList();
 
-      var newSuggestions = builder.markSuggestions();
+      builder.laterReplacesEarlier = false;
+      builder.suggestionAdded = (suggestion) {
+        notImportedSuggestions[suggestion] = file.uri;
+      };
 
       if (request.includeIdentifiers) {
         _buildSuggestions(exportElements);
@@ -81,22 +73,10 @@
       extensionContributor.addExtensions(
         exportElements.whereType<ExtensionElement>().toList(),
       );
-
-      newSuggestions.setLibraryUriToImportIndex(() {
-        librariesToImport.add(file.uri);
-        return librariesToImport.length - 1;
-      });
     }
-  }
 
-  _Filter _buildFilter(FileSystemState fsState) {
-    var file = fsState.getFileForPath(request.result.path);
-    var workspacePackage = file.workspacePackage;
-    if (workspacePackage is PubWorkspacePackage) {
-      return _PubFilter(workspacePackage, file.path);
-    } else {
-      return _AnyFilter();
-    }
+    builder.laterReplacesEarlier = true;
+    builder.suggestionAdded = null;
   }
 
   void _buildSuggestions(List<Element> elements) {
@@ -106,102 +86,3 @@
     }
   }
 }
-
-class _AnyFilter implements _Filter {
-  @override
-  bool shouldInclude(FileState file) => true;
-}
-
-abstract class _Filter {
-  bool shouldInclude(FileState file);
-}
-
-class _PubFilter implements _Filter {
-  final PubWorkspacePackage targetPackage;
-  final String? targetPackageName;
-  final bool targetInLib;
-  final Set<String> dependencies;
-
-  factory _PubFilter(PubWorkspacePackage package, String path) {
-    var inLib = package.workspace.provider
-        .getFolder(package.root)
-        .getChildAssumingFolder('lib')
-        .contains(path);
-
-    var dependencies = <String>{};
-    var pubspec = package.pubspec;
-    if (pubspec != null) {
-      dependencies.addAll(pubspec.dependencies.names);
-      if (!inLib) {
-        dependencies.addAll(pubspec.devDependencies.names);
-      }
-    }
-
-    return _PubFilter._(
-      targetPackage: package,
-      targetPackageName: pubspec?.name?.value.text,
-      targetInLib: inLib,
-      dependencies: dependencies,
-    );
-  }
-
-  _PubFilter._({
-    required this.targetPackage,
-    required this.targetPackageName,
-    required this.targetInLib,
-    required this.dependencies,
-  });
-
-  @override
-  bool shouldInclude(FileState file) {
-    var uri = file.uri;
-    if (uri.isScheme('dart')) {
-      return true;
-    }
-
-    // Normally only package URIs are available.
-    // But outside of lib/ we allow any files of this package.
-    if (!uri.isScheme('package')) {
-      if (targetInLib) {
-        return false;
-      } else {
-        var filePackage = file.workspacePackage;
-        return filePackage is PubWorkspacePackage &&
-            filePackage.root == targetPackage.root;
-      }
-    }
-
-    // Sanity check.
-    var uriPathSegments = uri.pathSegments;
-    if (uriPathSegments.length < 2) {
-      return false;
-    }
-
-    // Any `package:` library from the same package.
-    var packageName = uriPathSegments[0];
-    if (packageName == targetPackageName) {
-      return true;
-    }
-
-    // If not the same package, must be public.
-    if (uriPathSegments[1] == 'src') {
-      return false;
-    }
-
-    return dependencies.contains(packageName);
-  }
-}
-
-extension on PSDependencyList? {
-  List<String> get names {
-    final self = this;
-    if (self == null) {
-      return const [];
-    } else {
-      return self
-          .map((dependency) => dependency.name?.text)
-          .whereNotNull()
-          .toList();
-    }
-  }
-}
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 7de9949..0e7d181 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
@@ -25,6 +25,16 @@
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
+/// Wrapper around a potentially nullable value.
+///
+/// When the wrapper instance is provided for a property, the property
+/// value is replaced, even if the value to set is `null` itself.
+class CopyWithValue<T> {
+  final T value;
+
+  CopyWithValue(this.value);
+}
+
 /// This class provides suggestions based upon the visible instance members in
 /// an interface type.
 class MemberSuggestionBuilder {
@@ -138,54 +148,6 @@
   }
 }
 
-class NewSuggestionsProcessor {
-  final SuggestionBuilder _builder;
-  final Set<protocol.CompletionSuggestion> _current = Set.identity();
-
-  NewSuggestionsProcessor._(this._builder) {
-    _current.addAll(_builder._suggestionMap.values);
-  }
-
-  /// Update suggestions added since this marker was created.
-  void setLibraryUriToImportIndex(int Function() produce) {
-    int? libraryUriToImportIndex;
-    var suggestionMap = _builder._suggestionMap;
-    for (var entry in suggestionMap.entries.toList()) {
-      var suggestion = entry.value;
-      if (!_current.contains(suggestion)) {
-        libraryUriToImportIndex ??= produce();
-        suggestionMap[entry.key] = protocol.CompletionSuggestion(
-          suggestion.kind,
-          suggestion.relevance,
-          suggestion.completion,
-          suggestion.selectionOffset,
-          suggestion.selectionLength,
-          suggestion.isDeprecated,
-          suggestion.isPotential,
-          displayText: suggestion.displayText,
-          replacementOffset: suggestion.replacementOffset,
-          replacementLength: suggestion.replacementLength,
-          docSummary: suggestion.docSummary,
-          docComplete: suggestion.docComplete,
-          declaringType: suggestion.declaringType,
-          defaultArgumentListString: suggestion.defaultArgumentListString,
-          defaultArgumentListTextRanges:
-              suggestion.defaultArgumentListTextRanges,
-          element: suggestion.element,
-          returnType: suggestion.returnType,
-          parameterNames: suggestion.parameterNames,
-          parameterTypes: suggestion.parameterTypes,
-          requiredParameterCount: suggestion.requiredParameterCount,
-          hasNamedParameters: suggestion.hasNamedParameters,
-          parameterName: suggestion.parameterName,
-          parameterType: suggestion.parameterType,
-          libraryUriToImportIndex: libraryUriToImportIndex,
-        );
-      }
-    }
-  }
-}
-
 /// An object used to build a list of suggestions in response to a single
 /// completion request.
 class SuggestionBuilder {
@@ -212,6 +174,9 @@
   /// suggestions, or `null` if no notification should occur.
   final SuggestionListener? listener;
 
+  /// The function to be invoked when a new suggestion is added.
+  void Function(protocol.CompletionSuggestion)? suggestionAdded;
+
   /// A map from a completion identifier to a completion suggestion.
   final Map<String, CompletionSuggestion> _suggestionMap =
       <String, CompletionSuggestion>{};
@@ -264,11 +229,6 @@
   bool get _isNonNullableByDefault =>
       request.libraryElement.isNonNullableByDefault;
 
-  /// Return an object that knows which suggestions exist, and which are new.
-  NewSuggestionsProcessor markSuggestions() {
-    return NewSuggestionsProcessor._(this);
-  }
-
   /// Add a suggestion for an [accessor] declared within a class or extension.
   /// If the accessor is being invoked with a target of `super`, then the
   /// [containingMemberName] should be the name of the member containing the
@@ -587,8 +547,7 @@
       var suggestion = CompletionSuggestion(CompletionSuggestionKind.IDENTIFIER,
           Relevance.label, completion, completion.length, 0, false, false);
       suggestion.element = createLocalElement(
-          request.source, protocol.ElementKind.LABEL, label.label,
-          returnType: NO_RETURN_TYPE);
+          request.source, protocol.ElementKind.LABEL, label.label);
       _add(suggestion);
     }
   }
@@ -778,8 +737,8 @@
   Future<void> suggestOverride(SimpleIdentifier targetId,
       ExecutableElement element, bool invokeSuper) async {
     var displayTextBuffer = StringBuffer();
-    var builder = ChangeBuilder(session: request.result.session);
-    await builder.addDartFileEdit(request.result.path, (builder) {
+    var builder = ChangeBuilder(session: request.analysisSession);
+    await builder.addDartFileEdit(request.path, (builder) {
       builder.addReplacement(range.node(targetId), (builder) {
         builder.writeOverride(
           element,
@@ -979,10 +938,9 @@
         key = '$key()';
       }
       listener?.builtSuggestion(suggestion);
-      if (laterReplacesEarlier) {
+      if (laterReplacesEarlier || !_suggestionMap.containsKey(key)) {
         _suggestionMap[key] = suggestion;
-      } else {
-        _suggestionMap.putIfAbsent(key, () => suggestion);
+        suggestionAdded?.call(suggestion);
       }
     }
   }
@@ -1314,3 +1272,45 @@
         other.prefix == prefix;
   }
 }
+
+extension CompletionSuggestionExtension on CompletionSuggestion {
+  CompletionSuggestion copyWith({
+    CopyWithValue<int?>? libraryUriToImportIndex,
+  }) {
+    return protocol.CompletionSuggestion(
+      kind,
+      relevance,
+      completion,
+      selectionOffset,
+      selectionLength,
+      isDeprecated,
+      isPotential,
+      displayText: displayText,
+      replacementOffset: replacementOffset,
+      replacementLength: replacementLength,
+      docSummary: docSummary,
+      docComplete: docComplete,
+      declaringType: declaringType,
+      defaultArgumentListString: defaultArgumentListString,
+      defaultArgumentListTextRanges: defaultArgumentListTextRanges,
+      element: element,
+      returnType: returnType,
+      parameterNames: parameterNames,
+      parameterTypes: parameterTypes,
+      requiredParameterCount: requiredParameterCount,
+      hasNamedParameters: hasNamedParameters,
+      parameterName: parameterName,
+      parameterType: parameterType,
+      libraryUriToImportIndex: libraryUriToImportIndex.orElse(
+        this.libraryUriToImportIndex,
+      ),
+    );
+  }
+}
+
+extension _CopyWithValueExtension<T> on CopyWithValue<T>? {
+  T orElse(T defaultValue) {
+    final self = this;
+    return self != null ? self.value : defaultValue;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
index 703acf8..4a11a87 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
@@ -57,7 +57,7 @@
             // Quoted empty string
             visitSimpleStringLiteral(uri);
           } else {
-            var data = request.sourceContents!;
+            var data = request.content;
             if (end == data.length) {
               var ch = data[end - 1];
               if (ch != '"' && ch != "'") {
@@ -69,7 +69,7 @@
           }
         }
       } else if (offset == start && offset == end) {
-        var data = request.sourceContents!;
+        var data = request.content;
         if (end == data.length) {
           var ch = data[end - 1];
           if (ch == '"' || ch == "'") {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 19d86b0..eef975c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -7,11 +7,8 @@
     show CompletionSuggestion, Location;
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_ast_factory.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/ast/token.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol
     show Element, ElementKind;
@@ -28,13 +25,6 @@
   return b.relevance.compareTo(a.relevance);
 };
 
-/// A marker used in place of `null` when a function has no return type.
-final NamedType NO_RETURN_TYPE = astFactory.namedType(
-  name: astFactory.simpleIdentifier(
-    StringToken(TokenType.IDENTIFIER, '', 0),
-  ),
-);
-
 /// Add default argument list text and ranges based on the given
 /// [requiredParams] and [namedParams].
 void addDefaultArgDetails(
@@ -197,7 +187,7 @@
 }
 
 String getRequestLineIndent(DartCompletionRequest request) {
-  var content = request.result.content;
+  var content = request.content;
   var lineStartOffset = request.offset;
   var notWhitespaceOffset = request.offset;
   for (; lineStartOffset > 0; lineStartOffset--) {
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index e337213..2da4819 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -262,7 +262,7 @@
   void _checkExpressions(AstNode node) {
     // Note: This may queue edits that have to be accounted for later.
     // See _lengthOfInsertions().
-    AstNode? errorMatching(errorCode, {partialMatch}) {
+    AstNode? errorMatching(ErrorCode errorCode, {Pattern? partialMatch}) {
       var error = _findError(errorCode, partialMatch: partialMatch);
       if (error == null) {
         return null;
@@ -1069,7 +1069,7 @@
         node, stmt, DartStatementCompletion.COMPLETE_WHILE_STMT);
   }
 
-  engine.AnalysisError? _findError(ErrorCode code, {partialMatch}) {
+  engine.AnalysisError? _findError(ErrorCode code, {Pattern? partialMatch}) {
     return errors.firstWhereOrNull((err) =>
         err.errorCode == code &&
         (partialMatch == null ? true : err.message.contains(partialMatch)));
@@ -1169,7 +1169,7 @@
     return Position(file, offset);
   }
 
-  void _removeError(errorCode, {partialMatch}) {
+  void _removeError(ErrorCode errorCode, {Pattern? partialMatch}) {
     var error = _findError(errorCode, partialMatch: partialMatch);
     if (error != null) {
       errors.remove(error);
diff --git a/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart b/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
index bd175b9..18f1072 100644
--- a/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
+++ b/pkg/analysis_server/lib/src/services/completion/yaml/analysis_options_generator.dart
@@ -23,6 +23,7 @@
       AnalyzerOptions.errors: EmptyProducer(),
       AnalyzerOptions.exclude: EmptyProducer(),
       AnalyzerOptions.language: MapProducer({
+        AnalyzerOptions.strictCasts: EmptyProducer(),
         AnalyzerOptions.strictInference: EmptyProducer(),
         AnalyzerOptions.strictRawTypes: EmptyProducer(),
       }),
diff --git a/pkg/analysis_server/lib/src/services/completion/yaml/fix_data_generator.dart b/pkg/analysis_server/lib/src/services/completion/yaml/fix_data_generator.dart
index 15ef594..d57592a 100644
--- a/pkg/analysis_server/lib/src/services/completion/yaml/fix_data_generator.dart
+++ b/pkg/analysis_server/lib/src/services/completion/yaml/fix_data_generator.dart
@@ -16,27 +16,7 @@
       'title': EmptyProducer(),
       'date': EmptyProducer(),
       'bulkApply': BooleanProducer(),
-      'element': MapProducer({
-        // TODO(brianwilkerson) Support suggesting uris.
-        'uris': EmptyProducer(),
-        'class': EmptyProducer(),
-        'constant': EmptyProducer(),
-        'constructor': EmptyProducer(),
-        'enum': EmptyProducer(),
-        'extension': EmptyProducer(),
-        'field': EmptyProducer(),
-        'function': EmptyProducer(),
-        'getter': EmptyProducer(),
-        'method': EmptyProducer(),
-        'mixin': EmptyProducer(),
-        'setter': EmptyProducer(),
-        'typedef': EmptyProducer(),
-        'variable': EmptyProducer(),
-        'inClass': EmptyProducer(),
-        'inEnum': EmptyProducer(),
-        'inExtension': EmptyProducer(),
-        'inMixin': EmptyProducer(),
-      }),
+      'element': _elementProducer,
       'changes': _changesProducer,
       'oneOf': ListProducer(MapProducer({
         'if': EmptyProducer(),
@@ -56,6 +36,7 @@
       'removeParameter',
       'rename',
       'renameParameter',
+      'replacedBy',
     ]),
     'index': EmptyProducer(),
     'name': EmptyProducer(),
@@ -69,8 +50,32 @@
     'extends': EmptyProducer(),
     'oldName': EmptyProducer(),
     'newName': EmptyProducer(),
+    'newElement': _elementProducer,
   }));
 
+  /// The producer representing the known valid structure of an element.
+  static const MapProducer _elementProducer = MapProducer({
+    // TODO(brianwilkerson) Support suggesting uris.
+    'uris': EmptyProducer(),
+    'class': EmptyProducer(),
+    'constant': EmptyProducer(),
+    'constructor': EmptyProducer(),
+    'enum': EmptyProducer(),
+    'extension': EmptyProducer(),
+    'field': EmptyProducer(),
+    'function': EmptyProducer(),
+    'getter': EmptyProducer(),
+    'method': EmptyProducer(),
+    'mixin': EmptyProducer(),
+    'setter': EmptyProducer(),
+    'typedef': EmptyProducer(),
+    'variable': EmptyProducer(),
+    'inClass': EmptyProducer(),
+    'inEnum': EmptyProducer(),
+    'inExtension': EmptyProducer(),
+    'inMixin': EmptyProducer(),
+  });
+
   /// Initialize a newly created suggestion generator for fix data files.
   FixDataGenerator(ResourceProvider resourceProvider)
       : super(resourceProvider, null);
diff --git a/pkg/analysis_server/lib/src/services/completion/yaml/yaml_completion_generator.dart b/pkg/analysis_server/lib/src/services/completion/yaml/yaml_completion_generator.dart
index 618ba40..53c3de6 100644
--- a/pkg/analysis_server/lib/src/services/completion/yaml/yaml_completion_generator.dart
+++ b/pkg/analysis_server/lib/src/services/completion/yaml/yaml_completion_generator.dart
@@ -131,7 +131,7 @@
         // value that was next in the path.
         var key = node.keyAtValue(path[i + 1]);
         if (key is YamlScalar) {
-          producer = producer.producerForKey(key.value);
+          producer = producer.producerForKey(key.value as String);
           // Otherwise, if the item next in the path was a key itself, use the
           // current producer to provide completion for the key.
         } else if (node.nodes.containsKey(path[i + 1])) {
@@ -154,10 +154,11 @@
     List<String> siblingsInList(YamlList list, YamlNode? currentElement) {
       var siblings = <String>[];
       for (var element in list.nodes) {
-        if (element != currentElement &&
-            element is YamlScalar &&
-            element.value is String) {
-          siblings.add(element.value);
+        if (element != currentElement && element is YamlScalar) {
+          var value = element.value;
+          if (value is String) {
+            siblings.add(value);
+          }
         }
       }
       return siblings;
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 47624e2..c7233ba 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -73,7 +73,7 @@
   );
   static const CONVERT_INTO_ASYNC_BODY = AssistKind(
     'dart.assist.convert.bodyToAsync',
-    29,
+    31,
     'Convert to async function body',
   );
   static const CONVERT_INTO_BLOCK_BODY = AssistKind(
@@ -222,77 +222,77 @@
   // Flutter wrap specific assists
   static const FLUTTER_WRAP_GENERIC = AssistKind(
     'dart.assist.flutter.wrap.generic',
-    31,
+    29,
     'Wrap with widget...',
   );
 
   static const FLUTTER_WRAP_BUILDER = AssistKind(
     'dart.assist.flutter.wrap.builder',
-    32,
+    28,
     'Wrap with Builder',
   );
   static const FLUTTER_WRAP_CENTER = AssistKind(
     'dart.assist.flutter.wrap.center',
-    32,
+    28,
     'Wrap with Center',
   );
   static const FLUTTER_WRAP_COLUMN = AssistKind(
     'dart.assist.flutter.wrap.column',
-    32,
+    28,
     'Wrap with Column',
   );
   static const FLUTTER_WRAP_CONTAINER = AssistKind(
     'dart.assist.flutter.wrap.container',
-    32,
+    28,
     'Wrap with Container',
   );
   static const FLUTTER_WRAP_PADDING = AssistKind(
     'dart.assist.flutter.wrap.padding',
-    32,
+    28,
     'Wrap with Padding',
   );
   static const FLUTTER_WRAP_ROW = AssistKind(
     'dart.assist.flutter.wrap.row',
-    32,
+    28,
     'Wrap with Row',
   );
   static const FLUTTER_WRAP_SIZED_BOX = AssistKind(
     'dart.assist.flutter.wrap.sizedBox',
-    32,
+    28,
     'Wrap with SizedBox',
   );
   static const FLUTTER_WRAP_STREAM_BUILDER = AssistKind(
     'dart.assist.flutter.wrap.streamBuilder',
-    32,
+    28,
     'Wrap with StreamBuilder',
   );
 
   // Flutter re-order assists
   static const FLUTTER_SWAP_WITH_CHILD = AssistKind(
     'dart.assist.flutter.swap.withChild',
-    33,
+    27,
     'Swap with child',
   );
   static const FLUTTER_SWAP_WITH_PARENT = AssistKind(
     'dart.assist.flutter.swap.withParent',
-    33,
+    27,
     'Swap with parent',
   );
   static const FLUTTER_MOVE_DOWN = AssistKind(
     'dart.assist.flutter.move.down',
-    34,
+    26,
     'Move widget down',
   );
   static const FLUTTER_MOVE_UP = AssistKind(
     'dart.assist.flutter.move.up',
-    34,
+    26,
     'Move widget up',
   );
 
   // Flutter remove assist
   static const FLUTTER_REMOVE_WIDGET = AssistKind(
     'dart.assist.flutter.removeWidget',
-    35,
+    25,
     'Remove this widget',
   );
 
@@ -334,7 +334,7 @@
   static const REMOVE_TYPE_ANNOTATION = AssistKind(
     // todo (pq): unify w/ fix
     'dart.assist.remove.typeAnnotation',
-    29,
+    31,
     'Remove type annotation',
   );
   static const REPLACE_CONDITIONAL_WITH_IF_ELSE = AssistKind(
@@ -374,47 +374,47 @@
   );
   static const SURROUND_WITH_BLOCK = AssistKind(
     'dart.assist.surround.block',
-    22,
+    38,
     'Surround with block',
   );
   static const SURROUND_WITH_DO_WHILE = AssistKind(
     'dart.assist.surround.doWhile',
-    27,
+    33,
     "Surround with 'do-while'",
   );
   static const SURROUND_WITH_FOR = AssistKind(
     'dart.assist.surround.forEach',
-    26,
+    34,
     "Surround with 'for'",
   );
   static const SURROUND_WITH_FOR_IN = AssistKind(
     'dart.assist.surround.forIn',
-    25,
+    35,
     "Surround with 'for-in'",
   );
   static const SURROUND_WITH_IF = AssistKind(
     'dart.assist.surround.if',
-    23,
+    37,
     "Surround with 'if'",
   );
   static const SURROUND_WITH_SET_STATE = AssistKind(
     'dart.assist.surround.setState',
-    27,
+    33,
     "Surround with 'setState'",
   );
   static const SURROUND_WITH_TRY_CATCH = AssistKind(
     'dart.assist.surround.tryCatch',
-    28,
+    32,
     "Surround with 'try-catch'",
   );
   static const SURROUND_WITH_TRY_FINALLY = AssistKind(
     'dart.assist.surround.tryFinally',
-    29,
+    31,
     "Surround with 'try-finally'",
   );
   static const SURROUND_WITH_WHILE = AssistKind(
     'dart.assist.surround.while',
-    24,
+    36,
     "Surround with 'while'",
   );
   static const USE_CURLY_BRACES = AssistKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index c2e4e39..2e8d400 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -221,7 +221,7 @@
     for (var multiGenerator in multiGenerators) {
       var multiProducer = multiGenerator();
       multiProducer.configure(context);
-      for (var producer in multiProducer.producers) {
+      await for (var producer in multiProducer.producers) {
         await compute(producer);
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index a09c3b7..5f286c8 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -7,10 +7,13 @@
 import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/dart/organize_imports.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_unused_import.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override_set.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override_set_parser.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
@@ -217,7 +220,6 @@
           workspace,
           unit,
           error,
-          (name) => [],
         );
         await _fixSingleError(fixContext, unit, error, overrideSet);
       }
@@ -226,28 +228,108 @@
     return builder;
   }
 
+  Future<void> _applyProducer(
+      CorrectionProducerContext context, CorrectionProducer producer) async {
+    producer.configure(context);
+    try {
+      var localBuilder = builder.copy();
+      await producer.compute(localBuilder);
+      builder = localBuilder;
+    } on ConflictingEditException {
+      // If a conflicting edit was added in [compute], then the [localBuilder]
+      // is discarded and we revert to the previous state of the builder.
+    }
+  }
+
   /// Use the change [builder] to create fixes for the diagnostics in the
   /// library associated with the analysis [result].
   Future<void> _fixErrorsInLibrary(ResolvedLibraryResult result) async {
     var analysisOptions = result.session.analysisContext.analysisOptions;
-    for (var unitResult in result.units) {
-      var overrideSet = _readOverrideSet(unitResult);
 
-      var errors = List.from(unitResult.errors, growable: false);
+    Iterable<AnalysisError> filteredErrors(ResolvedUnitResult result) sync* {
+      var errors = result.errors.toList();
       errors.sort((a, b) => a.offset.compareTo(b.offset));
-
+      // Only fix errors not filtered out in analysis options.
       for (var error in errors) {
         var processor = ErrorProcessor.getProcessor(analysisOptions, error);
-        // Only fix errors not filtered out in analysis options.
         if (processor == null || processor.severity != null) {
-          final fixContext = DartFixContextImpl(
-            instrumentationService,
-            workspace,
-            unitResult,
-            error,
-            (name) => [],
-          );
-          await _fixSingleError(fixContext, unitResult, error, overrideSet);
+          yield error;
+        }
+      }
+    }
+
+    DartFixContextImpl fixContext(
+        ResolvedUnitResult result, AnalysisError diagnostic) {
+      return DartFixContextImpl(
+        instrumentationService,
+        workspace,
+        result,
+        diagnostic,
+      );
+    }
+
+    CorrectionProducerContext? correctionContext(
+        ResolvedUnitResult result, AnalysisError diagnostic) {
+      var overrideSet = _readOverrideSet(result);
+      return CorrectionProducerContext.create(
+        applyingBulkFixes: true,
+        dartFixContext: fixContext(result, diagnostic),
+        diagnostic: diagnostic,
+        overrideSet: overrideSet,
+        resolvedResult: result,
+        selectionOffset: diagnostic.offset,
+        selectionLength: diagnostic.length,
+        workspace: workspace,
+      );
+    }
+
+    //
+    // Attempt to apply the fixes that aren't related to directives.
+    //
+    for (var unitResult in result.units) {
+      var overrideSet = _readOverrideSet(unitResult);
+      for (var error in filteredErrors(unitResult)) {
+        await _fixSingleError(
+            fixContext(unitResult, error), unitResult, error, overrideSet);
+      }
+    }
+    //
+    // If there are no such fixes in the defining compilation unit, then apply
+    // the fixes related to directives.
+    //
+    var definingUnit = result.units[0];
+    AnalysisError? directivesOrderingError;
+    var unusedImportErrors = <AnalysisError>[];
+    if (!builder.hasEditsFor(definingUnit.path)) {
+      for (var error in filteredErrors(definingUnit)) {
+        var errorCode = error.errorCode;
+        if (errorCode is LintCode) {
+          var lintName = errorCode.name;
+          if (lintName == LintNames.directives_ordering) {
+            directivesOrderingError = error;
+            break;
+          }
+        } else if (errorCode == HintCode.DUPLICATE_IMPORT ||
+            errorCode == HintCode.UNNECESSARY_IMPORT ||
+            errorCode == HintCode.UNUSED_IMPORT) {
+          unusedImportErrors.add(error);
+        }
+      }
+      if (directivesOrderingError != null) {
+        // `OrganizeImports` will also remove some of the unused imports, so we
+        // apply it first.
+        var context = correctionContext(definingUnit, directivesOrderingError);
+        if (context != null) {
+          await _generateFix(context, OrganizeImports.newInstance(),
+              directivesOrderingError.errorCode.name);
+        }
+      } else {
+        for (var error in unusedImportErrors) {
+          var context = correctionContext(definingUnit, error);
+          if (context != null) {
+            await _generateFix(context, RemoveUnusedImport.newInstance(),
+                error.errorCode.name);
+          }
         }
       }
     }
@@ -275,44 +357,21 @@
       return;
     }
 
-    Future<void> compute(CorrectionProducer producer) async {
-      producer.configure(context);
-      try {
-        var localBuilder = builder.copy();
-        await producer.compute(localBuilder);
-        builder = localBuilder;
-      } on ConflictingEditException {
-        // If a conflicting edit was added in [compute], then the [localBuilder]
-        // is discarded and we revert to the previous state of the builder.
-      }
-    }
-
-    int computeChangeHash() => (builder as ChangeBuilderImpl).changeHash;
-
-    Future<void> generate(CorrectionProducer producer, String code) async {
-      var oldHash = computeChangeHash();
-      await compute(producer);
-      var newHash = computeChangeHash();
-      if (newHash != oldHash) {
-        changeMap.add(result.path, code);
-      }
-    }
-
     Future<void> bulkApply(
         List<ProducerGenerator> generators, String codeName) async {
       for (var generator in generators) {
         var producer = generator();
         if (producer.canBeAppliedInBulk) {
-          await generate(producer, codeName);
+          await _generateFix(context, producer, codeName);
         }
       }
     }
 
     var errorCode = diagnostic.errorCode;
+    var codeName = errorCode.name;
     try {
-      var codeName = errorCode.name;
       if (errorCode is LintCode) {
-        var generators = FixProcessor.lintProducerMap[errorCode.name] ?? [];
+        var generators = FixProcessor.lintProducerMap[codeName] ?? [];
         await bulkApply(generators, codeName);
       } else {
         var generators = FixProcessor.nonLintProducerMap[errorCode] ?? [];
@@ -322,17 +381,27 @@
           for (var multiGenerator in multiGenerators) {
             var multiProducer = multiGenerator();
             multiProducer.configure(context);
-            for (var producer in multiProducer.producers) {
-              await generate(producer, codeName);
+            await for (var producer in multiProducer.producers) {
+              await _generateFix(context, producer, codeName);
             }
           }
         }
       }
     } catch (e, s) {
       throw CaughtException.withMessage(
-          'Exception generating fix for ${errorCode.name} in ${result.path}',
-          e,
-          s);
+          'Exception generating fix for $codeName in ${result.path}', e, s);
+    }
+  }
+
+  Future<void> _generateFix(CorrectionProducerContext context,
+      CorrectionProducer producer, String code) async {
+    int computeChangeHash() => (builder as ChangeBuilderImpl).changeHash;
+
+    var oldHash = computeChangeHash();
+    await _applyProducer(context, producer);
+    var newHash = computeChangeHash();
+    if (newHash != oldHash) {
+      changeMap.add(context.resolvedResult.path, code.toLowerCase());
     }
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index 56442ae..79f8ef3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -6,8 +6,6 @@
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/extension_cache.dart';
-import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_override_set.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
@@ -302,7 +300,7 @@
 /// assists).
 abstract class MultiCorrectionProducer extends _AbstractCorrectionProducer {
   /// Return each of the individual producers generated by this producer.
-  Iterable<CorrectionProducer> get producers;
+  Stream<CorrectionProducer> get producers;
 }
 
 /// An object that can compute a correction (fix or assist) in a Dart file.
@@ -413,9 +411,6 @@
   /// Returns the EOL to use for this [CompilationUnit].
   String get eol => utils.endOfLine;
 
-  /// Return the extension cache used to find available extensions.
-  ExtensionCache get extensionCache => _context.dartFixContext!.extensionCache;
-
   String get file => _context.file;
 
   Flutter get flutter => Flutter.instance;
@@ -491,10 +486,15 @@
     return utils.getRangeText(range);
   }
 
-  /// Return the top-level declarations with the [name] in libraries that are
-  /// available to this context.
-  List<TopLevelDeclaration> getTopLevelDeclarations(String name) =>
-      _context.dartFixContext!.getTopLevelDeclarations(name);
+  /// Return the mapping from a library (that is available to this context) to
+  /// a top-level declaration that is exported (not necessary declared) by this
+  /// library, and has the requested base name. For getters and setters the
+  /// corresponding top-level variable is returned.
+  Future<Map<LibraryElement, Element>> getTopLevelDeclarations(
+    String baseName,
+  ) {
+    return _context.dartFixContext!.getTopLevelDeclarations(baseName);
+  }
 
   /// Return `true` the lint with the given [name] is enabled.
   bool isLintEnabled(String name) {
@@ -523,6 +523,12 @@
     return false;
   }
 
+  /// Return libraries with extensions that declare non-static public
+  /// extension members with the [memberName].
+  Stream<LibraryElement> librariesWithExtensions(String memberName) {
+    return _context.dartFixContext!.librariesWithExtensions(memberName);
+  }
+
   /// Return `true` if the given [node] is in a location where an implicit
   /// constructor invocation would be allowed.
   bool mightBeImplicitConstructor(AstNode node) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter.dart
index 1f11731..04adf5d 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_parameter.dart
@@ -11,7 +11,7 @@
 
 class AddMissingParameter extends MultiCorrectionProducer {
   @override
-  Iterable<CorrectionProducer> get producers sync* {
+  Stream<CorrectionProducer> get producers async* {
     // node is the unmatched argument.
     var argumentList = node.parent;
     if (argumentList is! ArgumentList) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_return_null.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_return_null.dart
new file mode 100644
index 0000000..8b37810
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_return_null.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class AddReturnNull extends CorrectionProducer {
+  @override
+  bool get canBeAppliedInBulk => true;
+
+  @override
+  bool get canBeAppliedToFile => true;
+
+  @override
+  FixKind get fixKind => DartFixKind.ADD_RETURN_NULL;
+
+  @override
+  FixKind? get multiFixKind => DartFixKind.ADD_RETURN_NULL_MULTI;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    Block block;
+
+    var coveringNode = coveredNode;
+    if (coveringNode is Block) {
+      block = coveringNode;
+    } else if (coveringNode is SimpleIdentifier) {
+      var declaration = coveringNode.parent;
+      if (declaration is FunctionDeclaration) {
+        var body = declaration.functionExpression.body;
+        if (body is BlockFunctionBody) {
+          block = body.block;
+        } else {
+          return;
+        }
+      } else if (declaration is MethodDeclaration) {
+        var body = declaration.body;
+        if (body is BlockFunctionBody) {
+          block = body.block;
+        } else {
+          return;
+        }
+      } else {
+        return;
+      }
+    } else {
+      return;
+    }
+    int position;
+    String returnStatement;
+    if (block.statements.isEmpty) {
+      position = block.offset + 1;
+      var prefix = utils.getLinePrefix(block.offset);
+      returnStatement =
+          '$eol$prefix${utils.getIndent(1)}return null;$eol$prefix';
+    } else {
+      var lastStatement = block.statements.last;
+      position = lastStatement.offset + lastStatement.length;
+      var prefix = utils.getNodePrefix(lastStatement);
+      returnStatement = '$eol${prefix}return null;';
+    }
+
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addInsertion(position, (builder) {
+        builder.write(returnStatement);
+      });
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static AddReturnNull newInstance() => AddReturnNull();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart
index fa1537b..86f5968 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_super_constructor_invocation.dart
@@ -13,7 +13,7 @@
 
 class AddSuperConstructorInvocation extends MultiCorrectionProducer {
   @override
-  Iterable<CorrectionProducer> get producers sync* {
+  Stream<CorrectionProducer> get producers async* {
     var targetConstructor = node.parent;
     if (targetConstructor is! ConstructorDeclaration) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/change_argument_name.dart b/pkg/analysis_server/lib/src/services/correction/dart/change_argument_name.dart
index 0442afb..54c57a4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/change_argument_name.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/change_argument_name.dart
@@ -17,7 +17,7 @@
   static const _maxDistance = 4;
 
   @override
-  Iterable<CorrectionProducer> get producers sync* {
+  Stream<CorrectionProducer> get producers async* {
     var namedContext = _getNamedParameterNames();
     if (namedContext == null) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_field_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_field_parameter.dart
index 447adee..fde8eca 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_field_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_field_parameter.dart
@@ -126,6 +126,8 @@
         }
       }
     }
+
+    return null;
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart
index a40ed18..c571123 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor_super.dart
@@ -12,7 +12,7 @@
 
 class CreateConstructorSuper extends MultiCorrectionProducer {
   @override
-  Iterable<CorrectionProducer> get producers sync* {
+  Stream<CorrectionProducer> get producers async* {
     var targetClassNode = node.thisOrAncestorOfType<ClassDeclaration>();
     if (targetClassNode == null) {
       return;
@@ -76,26 +76,61 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     var constructorName = _constructor.name;
-    var requiredParameters = _constructor.parameters
+    var requiredPositionalParameters = _constructor.parameters
         .where((parameter) => parameter.isRequiredPositional);
+    var requiredNamedParameters =
+        _constructor.parameters.where((parameter) => parameter.isRequiredNamed);
     await builder.addDartFileEdit(file, (builder) {
       builder.addInsertion(_targetLocation.offset, (builder) {
-        void writeParameters(bool includeType) {
+        void writeParameters(bool isDefinition) {
+          void writeParameter(ParameterElement parameter) {
+            var parameterName = parameter.displayName;
+            var includeType = isDefinition;
+            var includeRequired = isDefinition && parameter.isRequiredNamed;
+            var includeLabel = !isDefinition && parameter.isRequiredNamed;
+
+            if (parameterName.length > 1 && parameterName.startsWith('_')) {
+              parameterName = parameterName.substring(1);
+            }
+            if (includeRequired) {
+              builder.write('required ');
+            }
+            if (includeType && builder.writeType(parameter.type)) {
+              builder.write(' ');
+            }
+            if (includeLabel) {
+              builder.write('$parameterName: ');
+            }
+            builder.write(parameterName);
+          }
+
           var firstParameter = true;
-          for (var parameter in requiredParameters) {
+          void writeComma() {
             if (firstParameter) {
               firstParameter = false;
             } else {
               builder.write(', ');
             }
-            var parameterName = parameter.displayName;
-            if (parameterName.length > 1 && parameterName.startsWith('_')) {
-              parameterName = parameterName.substring(1);
+          }
+
+          for (var parameter in requiredPositionalParameters) {
+            writeComma();
+            writeParameter(parameter);
+          }
+          if (requiredNamedParameters.isNotEmpty) {
+            var includeBraces = isDefinition;
+            if (includeBraces) {
+              writeComma();
+              firstParameter = true; // Reset since we just included a comma.
+              builder.write('{');
             }
-            if (includeType && builder.writeType(parameter.type)) {
-              builder.write(' ');
+            for (var parameter in requiredNamedParameters) {
+              writeComma();
+              writeParameter(parameter);
             }
-            builder.write(parameterName);
+            if (includeBraces) {
+              builder.write('}');
+            }
           }
         }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
index ec42942..3073989 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
@@ -96,7 +96,7 @@
     if (targetClassElement == null) {
       return;
     }
-    if (targetClassElement.librarySource.isInSystemLibrary) {
+    if (targetClassElement.librarySource.uri.isScheme('dart')) {
       return;
     }
     utils.targetClassElement = targetClassElement;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
index 3c9c661..cdc8339 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
@@ -74,7 +74,7 @@
       return;
     }
     var targetSource = targetElement.source;
-    if (targetSource == null || targetSource.isInSystemLibrary) {
+    if (targetSource == null || targetSource.uri.isScheme('dart')) {
       return;
     }
     // prepare target declaration
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
index 9009561..1774efe 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method.dart
@@ -139,7 +139,7 @@
         return;
       }
       targetElement = targetClassElement;
-      if (targetClassElement.librarySource.isInSystemLibrary) {
+      if (targetClassElement.librarySource.uri.isScheme('dart')) {
         return;
       }
       // prepare target ClassDeclaration
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
index 8958731..569e134 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
@@ -73,7 +73,7 @@
       return;
     }
     var targetSource = targetElement.source;
-    if (targetSource == null || targetSource.isInSystemLibrary) {
+    if (targetSource == null || targetSource.uri.isScheme('dart')) {
       return;
     }
     // prepare target declaration
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
index ed399ac..029d157 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
@@ -21,7 +21,7 @@
   static List<TransformSet>? transformSetsForTests;
 
   @override
-  Iterable<CorrectionProducer> get producers sync* {
+  Stream<CorrectionProducer> get producers async* {
     var importedUris = <Uri>[];
     var library = resolvedResult.libraryElement;
     for (var importElement in library.imports) {
@@ -92,7 +92,7 @@
     }
     var data = <Object>[];
     for (var change in changes) {
-      var result = change.validate(this);
+      var result = change.validate(this) as Object?;
       if (result == null) {
         return;
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
index 755c644..7f9a104 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_children.dart
@@ -42,16 +42,16 @@
   void _convertFlutterChildToChildren(
       NamedExpression namedExp,
       String eol,
-      Function getNodeText,
-      Function getLinePrefix,
-      Function getIndent,
-      Function getText,
+      String Function(Expression) getNodeText,
+      String Function(int) getLinePrefix,
+      String Function(int) getIndent,
+      String Function(int, int) getText,
       FileEditBuilder builder) {
     var childArg = namedExp.expression;
     var childLoc = namedExp.offset + 'child'.length;
     builder.addSimpleInsertion(childLoc, 'ren');
     var listLoc = childArg.offset;
-    String childArgSrc = getNodeText(childArg);
+    var childArgSrc = getNodeText(childArg);
     if (!childArgSrc.contains(eol)) {
       builder.addSimpleInsertion(listLoc, '[');
       builder.addSimpleInsertion(listLoc + childArg.length, ']');
@@ -60,11 +60,10 @@
       if (newlineLoc == childArgSrc.length) {
         newlineLoc -= 1;
       }
-      String indentOld =
-          getLinePrefix(childArg.offset + eol.length + newlineLoc);
+      var indentOld = getLinePrefix(childArg.offset + eol.length + newlineLoc);
       var indentNew = '$indentOld${getIndent(1)}';
       // The separator includes 'child:' but that has no newlines.
-      String separator =
+      var separator =
           getText(namedExp.offset, childArg.offset - namedExp.offset);
       var prefix = separator.contains(eol) ? '' : '$eol$indentNew';
       if (prefix.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
index 318a934..94a7a71 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart
@@ -15,7 +15,7 @@
 
 class FlutterWrap extends MultiCorrectionProducer {
   @override
-  Iterable<CorrectionProducer> get producers sync* {
+  Stream<CorrectionProducer> get producers async* {
     var widgetExpr = flutter.identifyWidgetExpression(node);
     if (widgetExpr != null) {
       var widgetType = widgetExpr.typeOrThrow;
@@ -36,7 +36,7 @@
     yield* _wrapMultipleWidgets();
   }
 
-  Iterable<CorrectionProducer> _wrapMultipleWidgets() sync* {
+  Stream<CorrectionProducer> _wrapMultipleWidgets() async* {
     var selectionRange = SourceRange(selectionOffset, selectionLength);
     var analyzer = SelectionAnalyzer(selectionRange);
     resolvedResult.unit.accept(analyzer);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
index 415f155..98cc241 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
@@ -6,19 +6,18 @@
 
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analysis_server/src/utilities/extensions/element.dart';
-import 'package:analyzer/dart/analysis/results.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/source/source_range.dart';
+import 'package:analyzer/src/dart/resolver/applicable_extensions.dart';
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/src/utilities/library.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
-import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 class ImportLibrary extends MultiCorrectionProducer {
   final _ImportKind _importKind;
@@ -26,36 +25,28 @@
   ImportLibrary(this._importKind);
 
   @override
-  Iterable<CorrectionProducer> get producers sync* {
+  Stream<CorrectionProducer> get producers async* {
     final node = this.node;
     if (_importKind == _ImportKind.dartAsync) {
       yield* _importLibrary(DartFixKind.IMPORT_ASYNC, Uri.parse('dart:async'));
     } else if (_importKind == _ImportKind.forExtension) {
       if (node is SimpleIdentifier) {
         var extensionName = node.name;
-        yield* _importLibraryForElement(
-            extensionName,
-            const [ElementKind.EXTENSION],
-            const [TopLevelDeclarationKind.extension]);
+        yield* _importLibraryForElement(extensionName, const [
+          ElementKind.EXTENSION,
+        ]);
       }
     } else if (_importKind == _ImportKind.forExtensionMember) {
       /// Return producers that will import extensions that apply to the
       /// [targetType] and that define a member with the given [memberName].
-      Iterable<CorrectionProducer> importMatchingExtensions(
-          String memberName, DartType? targetType) sync* {
+      Stream<CorrectionProducer> importMatchingExtensions(
+          String memberName, DartType? targetType) async* {
         if (targetType == null) {
           return;
         }
-        var definingLibraries =
-            extensionCache.membersByName[memberName]?.toList();
-        if (definingLibraries != null) {
-          for (var definingLibrary in definingLibraries) {
-            var libraryPath = definingLibrary.libraryPath;
-            var uri = sessionHelper.session.uriConverter.pathToUri(libraryPath);
-            if (uri != null) {
-              yield* _importExtensionInLibrary(uri, targetType, memberName);
-            }
-          }
+        await for (var libraryToImport in librariesWithExtensions(memberName)) {
+          yield* _importExtensionInLibrary(
+              libraryToImport, targetType, memberName);
         }
       }
 
@@ -82,10 +73,7 @@
         var name = node.name;
         yield* _importLibraryForElement(name, const [
           ElementKind.FUNCTION,
-          ElementKind.TOP_LEVEL_VARIABLE
-        ], const [
-          TopLevelDeclarationKind.function,
-          TopLevelDeclarationKind.variable
+          ElementKind.TOP_LEVEL_VARIABLE,
         ]);
       }
     } else if (_importKind == _ImportKind.forTopLevelVariable) {
@@ -101,10 +89,9 @@
       }
       if (targetNode is SimpleIdentifier) {
         var name = targetNode.name;
-        yield* _importLibraryForElement(
-            name,
-            const [ElementKind.TOP_LEVEL_VARIABLE],
-            const [TopLevelDeclarationKind.variable]);
+        yield* _importLibraryForElement(name, const [
+          ElementKind.TOP_LEVEL_VARIABLE,
+        ]);
       }
     } else if (_importKind == _ImportKind.forType) {
       var targetNode = node;
@@ -123,15 +110,15 @@
             : (targetNode as PrefixedIdentifier).prefix.name;
         yield* _importLibraryForElement(typeName, const [
           ElementKind.CLASS,
+          ElementKind.ENUM,
           ElementKind.FUNCTION_TYPE_ALIAS,
-          ElementKind.TYPE_ALIAS
-        ], const [
-          TopLevelDeclarationKind.type
+          ElementKind.TYPE_ALIAS,
         ]);
       } else if (mightBeImplicitConstructor(targetNode)) {
         var typeName = (targetNode as SimpleIdentifier).name;
-        yield* _importLibraryForElement(typeName, const [ElementKind.CLASS],
-            const [TopLevelDeclarationKind.type]);
+        yield* _importLibraryForElement(typeName, const [
+          ElementKind.CLASS,
+        ]);
       }
     }
   }
@@ -150,24 +137,11 @@
     return false;
   }
 
-  /// Returns the relative URI from the passed [library] to the given [path].
-  ///
-  /// If the [path] is not in the [library]'s directory, `null` is returned.
-  String? _getRelativeUriFromLibrary(LibraryElement library, String path) {
-    var librarySource = library.librarySource;
-    var pathContext = resourceProvider.pathContext;
-    var libraryDirectory = pathContext.dirname(librarySource.fullName);
-    var sourceDirectory = pathContext.dirname(path);
-    if (pathContext.isWithin(libraryDirectory, path) ||
-        pathContext.isWithin(sourceDirectory, libraryDirectory)) {
-      var relativeFile = pathContext.relative(path, from: libraryDirectory);
-      return pathContext.split(relativeFile).join('/');
-    }
-    return null;
-  }
-
-  Iterable<CorrectionProducer> _importExtensionInLibrary(
-      Uri uri, DartType targetType, String memberName) sync* {
+  Stream<CorrectionProducer> _importExtensionInLibrary(
+    LibraryElement libraryToImport,
+    DartType targetType,
+    String memberName,
+  ) async* {
     // Look to see whether the library at the [uri] is already imported. If it
     // is, then we can check the extension elements without needing to perform
     // additional analysis.
@@ -175,12 +149,17 @@
     for (var imp in libraryElement.imports) {
       // prepare element
       var importedLibrary = imp.importedLibrary;
-      if (importedLibrary == null || importedLibrary.source.uri != uri) {
+      if (importedLibrary == null || importedLibrary != libraryToImport) {
         continue;
       }
       foundImport = true;
-      for (var extension in importedLibrary.matchingExtensionsWithMember(
-          libraryElement, targetType, memberName)) {
+      var instantiatedExtensions = importedLibrary.exportedExtensions
+          .hasMemberWithBaseName(memberName)
+          .applicableTo(
+            targetLibrary: libraryElement,
+            targetType: targetType,
+          );
+      for (var instantiatedExtension in instantiatedExtensions) {
         // If the import has a combinator that needs to be updated, then offer
         // to update it.
         var combinators = imp.combinators;
@@ -190,8 +169,8 @@
             // TODO(brianwilkerson) Support removing the extension name from a
             //  hide combinator.
           } else if (combinator is ShowElementCombinator) {
-            yield _ImportLibraryShow(
-                uri.toString(), combinator, extension.name!);
+            yield _ImportLibraryShow(libraryToImport.source.uri.toString(),
+                combinator, instantiatedExtension.extension.name!);
           }
         }
       }
@@ -201,46 +180,52 @@
     // correction producer that will either add an import or not based on the
     // result of analyzing the library.
     if (!foundImport) {
-      yield _ImportLibraryContainingExtension(uri, targetType, memberName);
+      yield _ImportLibraryContainingExtension(
+          libraryToImport, targetType, memberName);
     }
   }
 
   /// Returns a list of one or two import corrections.
   ///
-  /// If [relativeUri] is `null`, only one correction, with an absolute import
-  /// path, is returned. Otherwise, a correction with an absolute import path
-  /// and a correction with a relative path are returned. If the
+  /// If [includeRelativeFix] is `false`, only one correction, with an absolute
+  /// import path, is returned. Otherwise, a correction with an absolute import
+  /// path and a correction with a relative path are returned. If the
   /// `prefer_relative_imports` lint rule is enabled, the relative path is
   /// returned first.
-  Iterable<CorrectionProducer> _importLibrary(FixKind fixKind, Uri library,
-      [String? relativeUri]) {
-    if (relativeUri == null || relativeUri.isEmpty) {
-      return [_ImportAbsoluteLibrary(fixKind, library)];
+  Stream<CorrectionProducer> _importLibrary(
+    FixKind fixKind,
+    Uri library, {
+    bool includeRelativeFix = false,
+  }) {
+    if (!includeRelativeFix) {
+      return Stream.fromIterable([
+        _ImportAbsoluteLibrary(fixKind, library),
+      ]);
     }
     if (isLintEnabled(LintNames.prefer_relative_imports)) {
-      return [
-        _ImportRelativeLibrary(fixKind, relativeUri),
+      return Stream.fromIterable([
+        _ImportRelativeLibrary(fixKind, library),
         _ImportAbsoluteLibrary(fixKind, library),
-      ];
+      ]);
     } else {
-      return [
+      return Stream.fromIterable([
         _ImportAbsoluteLibrary(fixKind, library),
-        _ImportRelativeLibrary(fixKind, relativeUri),
-      ];
+        _ImportRelativeLibrary(fixKind, library),
+      ]);
     }
   }
 
-  Iterable<CorrectionProducer> _importLibraryForElement(
-      String name,
-      List<ElementKind> elementKinds,
-      List<TopLevelDeclarationKind> kinds2) sync* {
+  Stream<CorrectionProducer> _importLibraryForElement(
+    String name,
+    List<ElementKind> kinds,
+  ) async* {
     // ignore if private
     if (name.startsWith('_')) {
       return;
     }
     // may be there is an existing import,
     // but it is with prefix and we don't use this prefix
-    var alreadyImportedWithPrefix = <String>{};
+    var alreadyImportedWithPrefix = <LibraryElement>{};
     for (var imp in libraryElement.imports) {
       // prepare element
       var libraryElement = imp.importedLibrary;
@@ -254,7 +239,7 @@
       if (element is PropertyAccessorElement) {
         element = element.variable;
       }
-      if (!elementKinds.contains(element.kind)) {
+      if (!kinds.contains(element.kind)) {
         continue;
       }
       // may be apply prefix
@@ -278,44 +263,50 @@
             libraryName = libraryElement.source.shortName;
           }
           // don't add this library again
-          alreadyImportedWithPrefix.add(libraryElement.source.fullName);
+          alreadyImportedWithPrefix.add(libraryElement);
           yield _ImportLibraryShow(libraryName, combinator, name);
         }
       }
     }
     // Find new top-level declarations.
-    var declarations = getTopLevelDeclarations(name);
-    for (var declaration in declarations) {
+    var librariesWithElements = await getTopLevelDeclarations(name);
+    for (var libraryEntry in librariesWithElements.entries) {
+      var libraryElement = libraryEntry.key;
+      var declaration = libraryEntry.value;
+      var librarySource = libraryElement.source;
       // Check the kind.
-      if (!kinds2.contains(declaration.kind)) {
+      if (!kinds.contains(declaration.kind)) {
         continue;
       }
       // Check the source.
-      if (alreadyImportedWithPrefix.contains(declaration.path)) {
+      if (alreadyImportedWithPrefix.contains(libraryElement)) {
         continue;
       }
       // Check that the import doesn't end with '.template.dart'
-      if (declaration.uri.path.endsWith('.template.dart')) {
+      if (librarySource.uri.path.endsWith('.template.dart')) {
         continue;
       }
       // Compute the fix kind.
       FixKind fixKind;
-      if (declaration.uri.isScheme('dart')) {
+      if (librarySource.uri.isScheme('dart')) {
         fixKind = DartFixKind.IMPORT_LIBRARY_SDK;
-      } else if (_isLibSrcPath(declaration.path)) {
+      } else if (_isLibSrcPath(librarySource.fullName)) {
         // Bad: non-API.
         fixKind = DartFixKind.IMPORT_LIBRARY_PROJECT3;
-      } else if (declaration.isExported) {
+      } else if (declaration.library != libraryElement) {
         // Ugly: exports.
         fixKind = DartFixKind.IMPORT_LIBRARY_PROJECT2;
       } else {
         // Good: direct declaration.
         fixKind = DartFixKind.IMPORT_LIBRARY_PROJECT1;
       }
-      // Add the fix.
-      var relativeUri =
-          _getRelativeUriFromLibrary(libraryElement, declaration.path);
-      yield* _importLibrary(fixKind, declaration.uri, relativeUri);
+      // If both files are in the same package's lib folder, also include a
+      // relative import.
+      var includeRelativeUri = canBeRelativeImport(
+          librarySource.uri, this.libraryElement.librarySource.uri);
+      // Add the fix(es).
+      yield* _importLibrary(fixKind, librarySource.uri,
+          includeRelativeFix: includeRelativeUri);
     }
   }
 
@@ -351,6 +342,8 @@
         return parent.declaredElement?.thisType;
       } else if (parent is ExtensionDeclaration) {
         return parent.extendedType.type;
+      } else {
+        return null;
       }
     }
 
@@ -368,6 +361,8 @@
       }
       parent = parent.parent;
     }
+
+    return null;
   }
 
   /// Return an instance of this class that will add an import of `dart:async`.
@@ -415,7 +410,9 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     await builder.addDartFileEdit(file, (builder) {
-      _uriText = builder.importLibrary(_library);
+      if (builder is DartFileEditBuilderImpl) {
+        _uriText = builder.importLibraryWithAbsoluteUri(_library);
+      }
     });
   }
 }
@@ -432,8 +429,8 @@
 /// A correction processor that can add an import of a library containing an
 /// extension, but which does so only if the extension applies to a given type.
 class _ImportLibraryContainingExtension extends CorrectionProducer {
-  /// The URI of the library defining the extension.
-  Uri uri;
+  /// The library defining the extension.
+  LibraryElement library;
 
   /// The type of the target that the extension must apply to.
   DartType targetType;
@@ -444,7 +441,11 @@
   /// The URI that is being proposed for the import directive.
   String _uriText = '';
 
-  _ImportLibraryContainingExtension(this.uri, this.targetType, this.memberName);
+  _ImportLibraryContainingExtension(
+    this.library,
+    this.targetType,
+    this.memberName,
+  );
 
   @override
   List<Object> get fixArguments => [_uriText];
@@ -454,16 +455,16 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var result = await sessionHelper.session.getLibraryByUri(uri.toString());
-    if (result is LibraryElementResult) {
-      var library = result.element;
-      if (library
-          .matchingExtensionsWithMember(libraryElement, targetType, memberName)
-          .isNotEmpty) {
-        await builder.addDartFileEdit(file, (builder) {
-          _uriText = builder.importLibrary(uri);
-        });
-      }
+    var instantiatedExtensions = library.exportedExtensions
+        .hasMemberWithBaseName(memberName)
+        .applicableTo(
+          targetLibrary: libraryElement,
+          targetType: targetType,
+        );
+    if (instantiatedExtensions.isNotEmpty) {
+      await builder.addDartFileEdit(file, (builder) {
+        _uriText = builder.importLibrary(library.source.uri);
+      });
     }
   }
 }
@@ -474,24 +475,23 @@
   final LibraryElement _importedLibrary;
   final PrefixElement _importPrefix;
 
-  String _libraryName = '';
-
-  String _prefixName = '';
-
   _ImportLibraryPrefix(this._importedLibrary, this._importPrefix);
 
   @override
-  List<Object> get fixArguments => [_libraryName, _prefixName];
+  List<Object> get fixArguments {
+    var uriStr = _importedLibrary.source.uri.toString();
+    return [uriStr, _prefixName];
+  }
 
   @override
   FixKind get fixKind => DartFixKind.IMPORT_LIBRARY_PREFIX;
 
+  String get _prefixName => _importPrefix.name;
+
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    _libraryName = _importedLibrary.displayName;
-    _prefixName = _importPrefix.displayName;
     await builder.addDartFileEdit(file, (builder) {
-      builder.addSimpleReplacement(range.startLength(node, 0), '$_prefixName.');
+      builder.addSimpleInsertion(node.offset, '$_prefixName.');
     });
   }
 }
@@ -532,12 +532,14 @@
 class _ImportRelativeLibrary extends CorrectionProducer {
   final FixKind _fixKind;
 
-  final String _relativeURI;
+  final Uri _library;
 
-  _ImportRelativeLibrary(this._fixKind, this._relativeURI);
+  String _uriText = '';
+
+  _ImportRelativeLibrary(this._fixKind, this._library);
 
   @override
-  List<Object> get fixArguments => [_relativeURI];
+  List<Object> get fixArguments => [_uriText];
 
   @override
   FixKind get fixKind => _fixKind;
@@ -546,7 +548,7 @@
   Future<void> compute(ChangeBuilder builder) async {
     await builder.addDartFileEdit(file, (builder) {
       if (builder is DartFileEditBuilderImpl) {
-        builder.importLibraryWithRelativeUri(_relativeURI);
+        _uriText = builder.importLibraryWithRelativeUri(_library);
       }
     });
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
index d5cf7c0..d655cc3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/organize_imports.dart
@@ -11,7 +11,8 @@
 
 class OrganizeImports extends CorrectionProducer {
   @override
-  bool get canBeAppliedInBulk => true;
+  // Bulk application is supported by a distinct import cleanup fix phase.
+  bool get canBeAppliedInBulk => false;
 
   @override
   // The fix is to sort all the directives, which will already fix all of the
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
index fb29e4f..9d3b8dd 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
@@ -9,6 +9,12 @@
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 class ReplaceReturnTypeFuture extends CorrectionProducer {
+  /// The text for the type argument to 'Future'.
+  String _typeArgument = '';
+
+  @override
+  List<Object>? get fixArguments => [_typeArgument];
+
   @override
   FixKind get fixKind => DartFixKind.REPLACE_RETURN_TYPE_FUTURE;
 
@@ -19,6 +25,7 @@
     if (typeAnnotation == null) {
       return;
     }
+    _typeArgument = utils.getNodeText(typeAnnotation);
 
     await builder.addDartFileEdit(file, (builder) {
       builder.replaceTypeWithFuture(typeAnnotation, typeProvider);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_iterable.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_iterable.dart
new file mode 100644
index 0000000..cc491aa
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_iterable.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ReplaceReturnTypeIterable extends CorrectionProducer {
+  /// The text for the type argument to 'Iterable'.
+  String _typeArgument = '';
+
+  @override
+  List<Object>? get fixArguments => [_typeArgument];
+
+  @override
+  FixKind get fixKind => DartFixKind.REPLACE_RETURN_TYPE_ITERABLE;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    // prepare the existing type
+    var typeAnnotation = node.thisOrAncestorOfType<TypeAnnotation>();
+    if (typeAnnotation == null) {
+      return;
+    }
+    var type = typeAnnotation.type;
+    if (type == null || type.isDynamic || type.isDartCoreIterable) {
+      return;
+    }
+    _typeArgument = utils.getNodeText(typeAnnotation);
+
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addReplacement(range.node(typeAnnotation), (builder) {
+        builder.writeType(typeProvider.iterableType(type));
+      });
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ReplaceReturnTypeIterable newInstance() => ReplaceReturnTypeIterable();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_stream.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_stream.dart
new file mode 100644
index 0000000..829ebe6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_stream.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class ReplaceReturnTypeStream extends CorrectionProducer {
+  /// The text for the type argument to 'Stream'.
+  String _typeArgument = '';
+
+  @override
+  List<Object>? get fixArguments => [_typeArgument];
+
+  @override
+  FixKind get fixKind => DartFixKind.REPLACE_RETURN_TYPE_STREAM;
+
+  @override
+  Future<void> compute(ChangeBuilder builder) async {
+    // prepare the existing type
+    var typeAnnotation = node.thisOrAncestorOfType<TypeAnnotation>();
+    if (typeAnnotation == null) {
+      return;
+    }
+    var type = typeAnnotation.type;
+    if (type == null || type.isDynamic || type.isDartAsyncStream) {
+      return;
+    }
+    _typeArgument = utils.getNodeText(typeAnnotation);
+
+    await builder.addDartFileEdit(file, (builder) {
+      builder.addReplacement(range.node(typeAnnotation), (builder) {
+        builder.writeType(typeProvider.streamType(type));
+      });
+    });
+  }
+
+  /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
+  static ReplaceReturnTypeStream newInstance() => ReplaceReturnTypeStream();
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart b/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
index 84d8648..87abf94 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/surround_with.dart
@@ -12,7 +12,7 @@
 
 class SurroundWith extends MultiCorrectionProducer {
   @override
-  Iterable<CorrectionProducer> get producers sync* {
+  Stream<CorrectionProducer> get producers async* {
     // If the node is the CompilationUnit, the selected statements must span multiple
     // top level items and cannot be surrounded with anything.
     if (node is CompilationUnit) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart b/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart
index c12a2e2..e3acc88 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/update_sdk_constraints.dart
@@ -77,6 +77,7 @@
         return pubspecFile;
       }
     }
+    return null;
   }
 
   /// Return an instance of this class that will update the SDK constraints to
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
index 53c87c90..9915a0a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/wrap_in_text.dart
@@ -62,6 +62,8 @@
         }
       }
     }
+
+    return null;
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 84a648c..666ea13 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -3,10 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/extension_cache.dart';
+import 'package:analysis_server/src/services/correction/fix/dart/extensions.dart';
 import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/instrumentation/service.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -55,20 +56,18 @@
   @override
   final AnalysisError error;
 
-  @override
-  final ExtensionCache extensionCache;
-
-  final List<TopLevelDeclaration> Function(String name)
-      getTopLevelDeclarationsFunction;
-
   DartFixContextImpl(this.instrumentationService, this.workspace,
-      this.resolveResult, this.error, this.getTopLevelDeclarationsFunction,
-      {ExtensionCache? extensionCache})
-      : extensionCache = extensionCache ?? ExtensionCache();
+      this.resolveResult, this.error);
 
   @override
-  List<TopLevelDeclaration> getTopLevelDeclarations(String name) {
-    return getTopLevelDeclarationsFunction(name);
+  Future<Map<LibraryElement, Element>> getTopLevelDeclarations(
+      String name) async {
+    return TopLevelDeclarations(resolveResult).withName(name);
+  }
+
+  @override
+  Stream<LibraryElement> librariesWithExtensions(String memberName) {
+    return Extensions(resolveResult).libraries(memberName);
   }
 }
 
@@ -214,6 +213,16 @@
     DartFixKindPriority.IN_FILE,
     "Add 'required' keywords everywhere in file",
   );
+  static const ADD_RETURN_NULL = FixKind(
+    'dart.fix.add.returnNull',
+    DartFixKindPriority.DEFAULT,
+    "Add 'return null'",
+  );
+  static const ADD_RETURN_NULL_MULTI = FixKind(
+    'dart.fix.add.returnNull.multi',
+    DartFixKindPriority.IN_FILE,
+    "Add 'return null' everywhere in file",
+  );
   static const ADD_RETURN_TYPE = FixKind(
     'dart.fix.add.returnType',
     DartFixKindPriority.DEFAULT,
@@ -1252,7 +1261,17 @@
   static const REPLACE_RETURN_TYPE_FUTURE = FixKind(
     'dart.fix.replace.returnTypeFuture',
     DartFixKindPriority.DEFAULT,
-    "Return 'Future' from 'async' function",
+    "Return 'Future<{0}>'",
+  );
+  static const REPLACE_RETURN_TYPE_ITERABLE = FixKind(
+    'dart.fix.replace.returnTypeIterable',
+    DartFixKindPriority.DEFAULT,
+    "Return 'Iterable<{0}>'",
+  );
+  static const REPLACE_RETURN_TYPE_STREAM = FixKind(
+    'dart.fix.replace.returnTypeStream',
+    DartFixKindPriority.DEFAULT,
+    "Return 'Stream<{0}>'",
   );
   static const REPLACE_CONTAINER_WITH_SIZED_BOX = FixKind(
     'dart.fix.replace.containerWithSizedBox',
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
index d3b6ac3..8c148db 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
@@ -151,7 +151,7 @@
           } else if (nodes.containsValue(child)) {
             for (var entry in nodes.entries) {
               if (child == entry.value) {
-                key = entry.key;
+                key = entry.key as YamlNode?;
                 value = child;
                 break;
               }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/dart/extensions.dart b/pkg/analysis_server/lib/src/services/correction/fix/dart/extensions.dart
new file mode 100644
index 0000000..b613ec7
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/dart/extensions.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/dart/analysis/file_state_filter.dart';
+
+class Extensions {
+  final ResolvedUnitResult resolvedUnit;
+
+  Extensions(this.resolvedUnit);
+
+  DriverBasedAnalysisContext get _analysisContext {
+    var analysisContext = resolvedUnit.session.analysisContext;
+    return analysisContext as DriverBasedAnalysisContext;
+  }
+
+  /// Return libraries that may be imported into the [resolvedUnit] file,
+  /// and might have extensions that define a non-static public member with
+  /// the [memberName].
+  Stream<LibraryElement> libraries(String memberName) async* {
+    var analysisDriver = _analysisContext.driver;
+    await analysisDriver.discoverAvailableFiles();
+
+    var fsState = analysisDriver.fsState;
+    var filter = FileStateFilter(
+      fsState.getFileForPath(resolvedUnit.path),
+    );
+
+    for (var file in fsState.knownFiles.toList()) {
+      if (!filter.shouldInclude(file)) {
+        continue;
+      }
+
+      var libraryElement = analysisDriver.getLibraryByFile(file);
+      if (libraryElement == null) {
+        continue;
+      }
+
+      yield libraryElement;
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart b/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart
index 3bc6161..0106ff1 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart
@@ -2,108 +2,70 @@
 // 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/analysis_context.dart';
-import 'package:analyzer/src/services/available_declarations.dart';
+import 'dart:async';
 
-/// Information about a single top-level declaration.
-class TopLevelDeclaration {
-  /// The path of the library that exports this declaration.
-  final String path;
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/dart/analysis/file_state_filter.dart';
 
-  /// The URI of the library that exports this declaration.
-  final Uri uri;
+class TopLevelDeclarations {
+  final ResolvedUnitResult resolvedUnit;
 
-  final TopLevelDeclarationKind kind;
+  TopLevelDeclarations(this.resolvedUnit);
 
-  final String name;
-
-  /// Is `true` if the declaration is exported, not declared in the [path].
-  final bool isExported;
-
-  TopLevelDeclaration(
-    this.path,
-    this.uri,
-    this.kind,
-    this.name,
-    this.isExported,
-  );
-
-  @override
-  String toString() => '($path, $uri, $kind, $name, $isExported)';
-}
-
-/// Kind of a top-level declaration.
-///
-/// We don't need it to be precise, just enough to support quick fixes.
-enum TopLevelDeclarationKind { type, extension, function, variable }
-
-class TopLevelDeclarationsProvider {
-  final DeclarationsTracker tracker;
-
-  TopLevelDeclarationsProvider(this.tracker);
-
-  void doTrackerWork() {
-    while (tracker.hasWork) {
-      tracker.doWork();
-    }
+  DriverBasedAnalysisContext get _analysisContext {
+    var analysisContext = resolvedUnit.session.analysisContext;
+    return analysisContext as DriverBasedAnalysisContext;
   }
 
-  List<TopLevelDeclaration> get(
-    AnalysisContext analysisContext,
-    String path,
-    String name,
+  /// Return the mapping from a library (that is available to this context) to
+  /// a top-level declaration that is exported (not necessary declared) by this
+  /// library, and has the requested base name. For getters and setters the
+  /// corresponding top-level variable is returned.
+  Future<Map<LibraryElement, Element>> withName(String baseName) async {
+    var analysisDriver = _analysisContext.driver;
+    await analysisDriver.discoverAvailableFiles();
+
+    var fsState = analysisDriver.fsState;
+    var filter = FileStateFilter(
+      fsState.getFileForPath(resolvedUnit.path),
+    );
+
+    var result = <LibraryElement, Element>{};
+
+    for (var file in fsState.knownFiles.toList()) {
+      if (!filter.shouldInclude(file)) {
+        continue;
+      }
+
+      var libraryElement = analysisDriver.getLibraryByFile(file);
+      if (libraryElement == null) {
+        continue;
+      }
+
+      addElement(result, libraryElement, baseName);
+    }
+
+    return result;
+  }
+
+  static void addElement(
+    Map<LibraryElement, Element> result,
+    LibraryElement libraryElement,
+    String baseName,
   ) {
-    var declarations = <TopLevelDeclaration>[];
-
-    void addDeclarations(Library library) {
-      for (var declaration in library.declarations) {
-        if (declaration.name != name) continue;
-
-        var kind = _getTopKind(declaration.kind);
-        if (kind == null) continue;
-
-        declarations.add(
-          TopLevelDeclaration(
-            library.path,
-            library.uri,
-            kind,
-            name,
-            declaration.locationLibraryUri != library.uri,
-          ),
-        );
+    void addSingle(String name) {
+      var element = libraryElement.exportNamespace.get(name);
+      if (element is PropertyAccessorElement) {
+        element = element.variable;
+      }
+      if (element != null) {
+        result[libraryElement] = element;
       }
     }
 
-    var declarationsContext = tracker.getContext(analysisContext);
-    if (declarationsContext == null) return const [];
-
-    var libraries = declarationsContext.getLibraries(path);
-    libraries.context.forEach(addDeclarations);
-    libraries.dependencies.forEach(addDeclarations);
-    libraries.sdk.forEach(addDeclarations);
-
-    return declarations;
-  }
-
-  TopLevelDeclarationKind? _getTopKind(DeclarationKind kind) {
-    switch (kind) {
-      case DeclarationKind.CLASS:
-      case DeclarationKind.CLASS_TYPE_ALIAS:
-      case DeclarationKind.ENUM:
-      case DeclarationKind.FUNCTION_TYPE_ALIAS:
-      case DeclarationKind.TYPE_ALIAS:
-      case DeclarationKind.MIXIN:
-        return TopLevelDeclarationKind.type;
-      case DeclarationKind.EXTENSION:
-        return TopLevelDeclarationKind.extension;
-      case DeclarationKind.FUNCTION:
-        return TopLevelDeclarationKind.function;
-      case DeclarationKind.GETTER:
-      case DeclarationKind.SETTER:
-      case DeclarationKind.VARIABLE:
-        return TopLevelDeclarationKind.variable;
-      default:
-        return null;
-    }
+    addSingle(baseName);
+    addSingle('$baseName=');
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
index 4b9619d..e512626 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
@@ -7,7 +7,7 @@
 import 'package:analyzer/dart/element/element.dart' show ClassElement;
 import 'package:analyzer/dart/element/type.dart';
 
-/// The path to an element.
+/// A description of an element.
 class ElementDescriptor {
   /// The URIs of the library in which the element is defined.
   final List<Uri> libraryUris;
@@ -15,6 +15,14 @@
   /// The kind of element that was changed.
   final ElementKind kind;
 
+  /// A flag indicating whether the element is a static member of a container
+  /// such as a class, enum, mixin, or extension.
+  ///
+  /// The flag should be `false` for top-level declarations. The implication is
+  /// that the flag will only be true if the list of [components] has more than
+  /// one element.
+  final bool isStatic;
+
   /// The components that uniquely identify the element within its library. The
   /// components are ordered from the most local to the most global.
   final List<String> components;
@@ -26,122 +34,139 @@
   ElementDescriptor(
       {required this.libraryUris,
       required this.kind,
+      required this.isStatic,
       required this.components});
 
   /// Return `true` if the described element is a constructor.
   bool get isConstructor => kind == ElementKind.constructorKind;
 
-  /// Return `true` if the given [node] appears to be consistent with this kind
-  /// of element.
+  /// Return `true` if the given [node] appears to be consistent with the
+  /// element being described.
   bool matches(AstNode node) {
-    // TODO(brianwilkerson) Check the resolved element if one exists for more
+    // TODO(brianwilkerson) Check the resolved element, if one exists, for more
     //  accurate results.
     switch (kind) {
       case ElementKind.classKind:
-        // TODO: Handle this case.
+        // TODO(brianwilkerson) Handle this case.
         return false;
       case ElementKind.constantKind:
-        // TODO: Handle this case.
+        // TODO(brianwilkerson) Handle this case.
         return false;
       case ElementKind.constructorKind:
-        if (node is Annotation) {
-          var className = _nameFromIdentifier(node.name);
-          var constructorName = node.constructorName ?? '';
-          if (components[0] == constructorName && components[1] == className) {
-            return true;
-          }
-        } else if (node is InstanceCreationExpression) {
-          var name = node.constructorName;
-          var className = _nameFromIdentifier(name.type2.name);
-          var constructorName = name.name?.name ?? '';
-          if (components[0] == constructorName && components[1] == className) {
-            return true;
-          }
-        } else if (node is MethodInvocation) {
-          var target = node.target;
-          if (target == null) {
-            if (components[0] == '' && components[1] == node.methodName.name) {
-              return true;
-            }
-          } else if (target is Identifier) {
-            var className = _nameFromIdentifier(target);
-            var constructorName = node.methodName.name;
-            if (components[0] == constructorName &&
-                components[1] == className) {
-              return true;
-            }
-          }
-        }
-        return false;
+        return _matchesConstructor(node);
       case ElementKind.enumKind:
-        // TODO: Handle this case.
+        // TODO(brianwilkerson) Handle this case.
         return false;
       case ElementKind.extensionKind:
-        // TODO: Handle this case.
+        // TODO(brianwilkerson) Handle this case.
         return false;
       case ElementKind.fieldKind:
-        // TODO: Handle this case.
+        // TODO(brianwilkerson) Handle this case.
         return false;
       case ElementKind.functionKind:
-        if (node is MethodInvocation) {
-          if (node.realTarget == null &&
-              components[0] == node.methodName.name) {
-            return true;
-          }
-        }
-        return false;
+        return _matchesFunction(node);
       case ElementKind.getterKind:
-        // TODO: Handle this case.
+        // TODO(brianwilkerson) Handle this case.
         return false;
       case ElementKind.methodKind:
-        if (node is MethodInvocation) {
-          if (components[0] == node.methodName.name) {
-            var target = node.realTarget;
-            if (target == null) {
-              // TODO(brianwilkerson) If `node.target == null` then the invocation
-              //  should be in a subclass of the element's class.
-              return true;
-            } else {
-              var type = target.staticType;
-              if (type == null && target is SimpleIdentifier) {
-                var element = target.staticElement;
-                // TODO(brianwilkerson) Handle more than `ClassElement`.
-                if (element is ClassElement) {
-                  type = element.thisType;
-                }
-              }
-              if (type == null) {
-                // We can't get more specific type information, so we assume
-                // that the method might have been in the element's class.
+        return _matchesMethod(node);
+      case ElementKind.mixinKind:
+        // TODO(brianwilkerson) Handle this case.
+        return false;
+      case ElementKind.setterKind:
+        // TODO(brianwilkerson) Handle this case.
+        return false;
+      case ElementKind.typedefKind:
+        // TODO(brianwilkerson) Handle this case.
+        return false;
+      case ElementKind.variableKind:
+        // TODO(brianwilkerson) Handle this case.
+        return false;
+    }
+  }
+
+  /// Return `true` if the given [node] appears to be consistent with the
+  /// constructor being described.
+  bool _matchesConstructor(AstNode node) {
+    if (node is Annotation) {
+      var className = _nameFromIdentifier(node.name);
+      var constructorName = node.constructorName ?? '';
+      if (components[0] == constructorName && components[1] == className) {
+        return true;
+      }
+    } else if (node is InstanceCreationExpression) {
+      var name = node.constructorName;
+      var className = _nameFromIdentifier(name.type2.name);
+      var constructorName = name.name?.name ?? '';
+      if (components[0] == constructorName && components[1] == className) {
+        return true;
+      }
+    } else if (node is MethodInvocation) {
+      var target = node.target;
+      if (target == null) {
+        if (components[0] == '' && components[1] == node.methodName.name) {
+          return true;
+        }
+      } else if (target is Identifier) {
+        var className = _nameFromIdentifier(target);
+        var constructorName = node.methodName.name;
+        if (components[0] == constructorName && components[1] == className) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /// Return `true` if the given [node] appears to be consistent with the
+  /// function being described.
+  bool _matchesFunction(AstNode node) {
+    if (node is MethodInvocation) {
+      if (node.realTarget == null && components[0] == node.methodName.name) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /// Return `true` if the given [node] appears to be consistent with the
+  /// method being described.
+  bool _matchesMethod(AstNode node) {
+    if (node is MethodInvocation) {
+      if (components[0] == node.methodName.name) {
+        var target = node.realTarget;
+        if (target == null) {
+          // TODO(brianwilkerson) If `node.target == null` then the invocation
+          //  should be in a subclass of the element's class.
+          return true;
+        } else {
+          var type = target.staticType;
+          if (type == null && target is SimpleIdentifier) {
+            var element = target.staticElement;
+            // TODO(brianwilkerson) Handle more than `ClassElement`.
+            if (element is ClassElement) {
+              type = element.thisType;
+            }
+          }
+          if (type == null) {
+            // We can't get more specific type information, so we assume
+            // that the method might have been in the element's class.
+            return true;
+          }
+          if (components[1] == type.element?.name) {
+            return true;
+          }
+          if (type is InterfaceType) {
+            for (var supertype in type.allSupertypes) {
+              if (components[1] == supertype.element.name) {
                 return true;
               }
-              if (components[1] == type.element?.name) {
-                return true;
-              }
-              if (type is InterfaceType) {
-                for (var supertype in type.allSupertypes) {
-                  if (components[1] == supertype.element.name) {
-                    return true;
-                  }
-                }
-              }
             }
           }
         }
-        return false;
-      case ElementKind.mixinKind:
-        // TODO: Handle this case.
-        return false;
-      case ElementKind.setterKind:
-        // TODO: Handle this case.
-        return false;
-      case ElementKind.typedefKind:
-        // TODO: Handle this case.
-        return false;
-      case ElementKind.variableKind:
-        // TODO: Handle this case.
-        return false;
+      }
     }
+    return false;
   }
 
   String _nameFromIdentifier(Identifier identifier) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
index a3fb8b1..4da8683 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_kind.dart
@@ -20,6 +20,38 @@
 }
 
 extension ElementKindUtilities on ElementKind {
+  /// Return a human readable name for the kind.
+  String get displayName {
+    switch (this) {
+      case ElementKind.classKind:
+        return 'class';
+      case ElementKind.constantKind:
+        return 'constant';
+      case ElementKind.constructorKind:
+        return 'constructor';
+      case ElementKind.enumKind:
+        return 'enum';
+      case ElementKind.extensionKind:
+        return 'extension';
+      case ElementKind.fieldKind:
+        return 'field';
+      case ElementKind.functionKind:
+        return 'function';
+      case ElementKind.getterKind:
+        return 'getter';
+      case ElementKind.methodKind:
+        return 'method';
+      case ElementKind.mixinKind:
+        return 'mixin';
+      case ElementKind.setterKind:
+        return 'setter';
+      case ElementKind.typedefKind:
+        return 'typedef';
+      case ElementKind.variableKind:
+        return 'variable';
+    }
+  }
+
   /// Return the element kind corresponding to the given [name].
   static ElementKind? fromName(String name) {
     for (var kind in ElementKind.values) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
index 49751f1..837025a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
@@ -342,20 +342,27 @@
           // If the old class has been removed then this might have been a
           // constructor invocation.
           ElementKind.constructorKind,
+          ElementKind.functionKind, // tear-off
           ElementKind.getterKind,
           ElementKind.setterKind,
           ElementKind.variableKind
         ];
       }
       return const [
+        ElementKind.constantKind,
         ElementKind.fieldKind,
+        ElementKind.functionKind, // tear-off
         ElementKind.getterKind,
+        ElementKind.methodKind, // tear-off
         ElementKind.setterKind
       ];
     } else if (node is PropertyAccess) {
       return const [
+        ElementKind.constantKind,
         ElementKind.fieldKind,
+        ElementKind.functionKind, // tear-off, prefixed
         ElementKind.getterKind,
+        ElementKind.methodKind, // tear-off, prefixed
         ElementKind.setterKind
       ];
     } else if (node is SimpleIdentifier) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
index 1072578..19ca94a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
@@ -111,20 +111,6 @@
 }
 
 extension on MethodDeclaration {
-  /// Return the parameter of this method whose name matches the given [name],
-  /// or `null` if there is no such parameter.
-  FormalParameter? parameterNamed(String name) {
-    final parameters = this.parameters;
-    if (parameters != null) {
-      for (var parameter in parameters.parameters) {
-        if (parameter.declaredElement?.name == name) {
-          return parameter;
-        }
-      }
-    }
-    return null;
-  }
-
   /// Return the element that this method overrides, or `null` if this method
   /// doesn't override any inherited member.
   ExecutableElement? overriddenElement() {
@@ -138,6 +124,20 @@
     }
     return null;
   }
+
+  /// Return the parameter of this method whose name matches the given [name],
+  /// or `null` if there is no such parameter.
+  FormalParameter? parameterNamed(String name) {
+    final parameters = this.parameters;
+    if (parameters != null) {
+      for (var parameter in parameters.parameters) {
+        if (parameter.declaredElement?.name == name) {
+          return parameter;
+        }
+      }
+    }
+    return null;
+  }
 }
 
 extension on ExecutableElement {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
new file mode 100644
index 0000000..92e23b9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+/// The data related to an element that has been replaced by another element.
+class ReplacedBy extends Change<_Data> {
+  /// The replacing element.
+  final ElementDescriptor newElement;
+
+  /// Initialize a newly created transform to describe a replacement of an old
+  /// element by a [newElement].
+  ReplacedBy({required this.newElement});
+
+  @override
+  void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
+    var referenceRange = data.referenceRange;
+    builder.addSimpleReplacement(referenceRange, _referenceTo(newElement));
+  }
+
+  @override
+  _Data? validate(DataDrivenFix fix) {
+    var node = fix.node;
+    if (node is SimpleIdentifier) {
+      var components = fix.element.components;
+      if (components.isEmpty) {
+        return null;
+      } else if (components.length == 1) {
+        if (components[0] != node.name) {
+          return null;
+        }
+        // We have an '<element>' pattern, so we replace the name.
+        return _Data(range.node(node));
+      }
+      // The element being replaced is a member in a top-level element.
+      var containerName = components[1];
+      if (components[0].isEmpty && containerName == node.name) {
+        // We have a '<className>()' pattern, so we replace the class name.
+        return _Data(range.node(node));
+      }
+      var parent = node.parent;
+      if (parent is MethodInvocation) {
+        var target = parent.target;
+        if (target == null) {
+          // We have a '<member>()' pattern, so we replace the member name.
+          return _Data(range.node(node));
+        } else if (target is SimpleIdentifier && target.name == containerName) {
+          // We have a '<container>.<member>()' pattern, so we replace both parts.
+          return _Data(range.startEnd(target, node));
+        } else if (target is PrefixedIdentifier) {
+          if (target.prefix.staticElement is PrefixElement &&
+              target.identifier.name == containerName) {
+            // We have a '<prefix>.<container>.<member>()' pattern so we leave
+            // the prefix while replacing the rest.
+            return _Data(range.startEnd(target.identifier, node));
+          }
+          // We shouldn't get here.
+          return null;
+        }
+      } else if (parent is PrefixedIdentifier) {
+        if (parent.prefix.staticElement is PrefixElement) {
+          // We have a '<prefix>.<topLevel>' pattern so we leave the prefix
+          // while replacing the rest.
+          return _Data(range.node(node));
+        }
+        // We have a '<container>.<member>' pattern so we replace both parts.
+        return _Data(range.node(parent));
+      } else if (parent is PropertyAccess) {
+        var target = parent.target;
+        if (target is PrefixedIdentifier) {
+          // We have a '<prefix>.<container>.<member>' pattern so we leave the
+          // prefix while replacing the rest.
+          return _Data(range.startEnd(target.identifier, node));
+        }
+        // We have a '<container>.<member>' pattern so we replace both parts.
+        return _Data(range.node(parent));
+      }
+      // We have a '<member>' pattern so we replace the member name.
+      return _Data(range.node(node));
+    } else if (node is PrefixedIdentifier) {
+      var parent = node.parent;
+      if (parent is NamedType) {
+        var identifier = node.identifier;
+        var components = fix.element.components;
+        if (components.length > 1 &&
+            components[0].isEmpty &&
+            components[1] == identifier.name) {
+          // We have a '<prefix>.<className>' pattern, so we replace only the
+          // class name.
+          return _Data(range.node(identifier));
+        }
+      }
+    } else if (node is ConstructorName) {
+      var typeName = node.type2.name;
+      SimpleIdentifier classNameNode;
+      if (typeName is SimpleIdentifier) {
+        classNameNode = typeName;
+      } else if (typeName is PrefixedIdentifier) {
+        classNameNode = typeName.identifier;
+      } else {
+        return null;
+      }
+      var constructorNameNode = node.name;
+      var constructorName = constructorNameNode?.name ?? '';
+      var components = fix.element.components;
+      if (components.length == 2 &&
+          constructorName == components[0] &&
+          classNameNode.name == components[1]) {
+        if (constructorNameNode != null) {
+          return _Data(range.startEnd(classNameNode, constructorNameNode));
+        }
+        return _Data(range.node(classNameNode));
+      }
+    }
+    return null;
+  }
+
+  String _referenceTo(ElementDescriptor element) {
+    var components = element.components;
+    if (components[0].isEmpty) {
+      return components[1];
+    }
+    return components.reversed.join('.');
+  }
+}
+
+/// The data about a reference to an element that's been replaced.
+class _Data {
+  final SourceRange referenceRange;
+
+  _Data(this.referenceRange);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_override_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_override_set_parser.dart
index aec5cc03..8eb7537 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_override_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_override_set_parser.dart
@@ -91,6 +91,7 @@
   /// Report any keys in the [map] whose values are not in [validKeys].
   void _reportUnsupportedKeys(YamlMap map, Set<String> validKeys) {
     for (var keyNode in map.nodes.keys) {
+      keyNode as YamlNode;
       var key = _translateKey(keyNode);
       if (key != null && !validKeys.contains(key)) {
         _reportError(TransformSetErrorCode.unsupportedKey, keyNode, [key]);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
index 1c992e0..7fc4864 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_error_code.dart
@@ -25,6 +25,26 @@
 
   /**
    * Parameters:
+   * 0: the old kind
+   * 1: the new kind
+   */
+  static const TransformSetErrorCode incompatibleElementKind =
+      TransformSetErrorCode(
+          'incompatible_element_kind',
+          "An element of kind '{0}' can't be replaced by "
+              "an element of kind '{1}'.");
+
+  /**
+   * Parameters:
+   * 0: the change kind that is invalid
+   * 1: the element kind for the transform
+   */
+  static const TransformSetErrorCode invalidChangeForKind =
+      TransformSetErrorCode('invalid_change_for_kind',
+          "A change of type '{0}' can't be used for an element of kind '{1}'.");
+
+  /**
+   * Parameters:
    * 0: the character that is invalid
    */
   static const TransformSetErrorCode invalidCharacter =
@@ -136,6 +156,22 @@
   /**
    * No parameters.
    */
+  static const TransformSetErrorCode unsupportedStatic = TransformSetErrorCode(
+      'unsupported_static',
+      "The key 'static' is only supported for elements in a class, enum, "
+          "extension, or mixin.");
+
+  /**
+   * No parameters.
+   */
+  static const TransformSetErrorCode unsupportedUriChange = TransformSetErrorCode(
+      'unsupported_uri_change',
+      "The set of URIs for the replacement element must match the transformed "
+          "element.");
+
+  /**
+   * No parameters.
+   */
   static const TransformSetErrorCode unsupportedVersion = TransformSetErrorCode(
       'unsupported_version', "Only version '1' is supported at this time.");
 
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index 4605bd6..29913b3 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename_parameter.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/replaced_by.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
@@ -64,11 +65,13 @@
   static const String _methodKey = 'method';
   static const String _mixinKey = 'mixin';
   static const String _nameKey = 'name';
+  static const String _newElementKey = 'newElement';
   static const String _newNameKey = 'newName';
   static const String _oldNameKey = 'oldName';
   static const String _oneOfKey = 'oneOf';
   static const String _requiredIfKey = 'requiredIf';
   static const String _setterKey = 'setter';
+  static const String _staticKey = 'static';
   static const String _styleKey = 'style';
   static const String _titleKey = 'title';
   static const String _transformsKey = 'transforms';
@@ -97,6 +100,7 @@
   static const String _removeParameterKind = 'removeParameter';
   static const String _renameKind = 'rename';
   static const String _renameParameterKind = 'renameParameter';
+  static const String _replacedByKind = 'replacedBy';
 
   /// The valid values for the [_styleKey] in an [_addParameterKind] change.
   static const List<String> validStyles = [
@@ -106,6 +110,11 @@
     'required_positional'
   ];
 
+  /// A table mapping the kinds of elements that can be replaced by a different
+  /// element to a set of the kinds of elements with which they can be replaced.
+  static final Map<ElementKind, Set<ElementKind>> compatibleReplacementTypes =
+      _createCompatibleReplacementTypes();
+
   static const String _openComponent = '{%';
   static const String _closeComponent = '%}';
 
@@ -125,6 +134,12 @@
   /// found.
   final String packageName;
 
+  /// The description of the element that is being transformed by the current
+  /// transformation, or `null` if we are not in the process of parsing a
+  /// transformation or if the element associated with the transformation is not
+  /// valid.
+  ElementDescriptor? elementBeingTransformed;
+
   /// The variable scope defined for the current transform.
   VariableScope transformVariableScope = VariableScope.empty;
 
@@ -147,6 +162,13 @@
     return _translateTransformSet(map);
   }
 
+  bool _equalUris(List<Uri> oldUris, List<Uri> newUris) {
+    var oldSet = oldUris.toSet();
+    var newSet = newUris.toSet();
+    return oldSet.difference(newSet).isEmpty &&
+        newSet.difference(oldSet).isEmpty;
+  }
+
   /// Convert the given [template] into a list of components. Variable
   /// references in the template are looked up in the map of [generators].
   List<TemplateComponent> _extractTemplateComponents(
@@ -271,6 +293,7 @@
   /// Report any keys in the [map] whose values are not in [validKeys].
   void _reportUnsupportedKeys(YamlMap map, Set<String> validKeys) {
     for (var keyNode in map.nodes.keys) {
+      keyNode as YamlNode;
       var key = _translateKey(keyNode);
       if (key != null && !validKeys.contains(key)) {
         _reportError(TransformSetErrorCode.unsupportedKey, keyNode, [key]);
@@ -446,6 +469,8 @@
         return _translateRenameChange(node);
       } else if (kind == _renameParameterKind) {
         return _translateRenameParameterChange(node);
+      } else if (kind == _replacedByKind) {
+        return _translateReplacedByChange(node);
       }
       return _reportInvalidValueOneOf(kindNode, kindContext, [
         _addParameterKind,
@@ -453,6 +478,7 @@
         _removeParameterKind,
         _renameKind,
         _renameParameterKind,
+        _replacedByKind,
       ]);
     } else {
       return _reportInvalidValue(node, context, 'Map');
@@ -637,6 +663,8 @@
         return null;
       }
       var components = [elementName];
+      var isStatic = false;
+      var staticNode = node.valueAt(_staticKey);
       if (_containerKeyMap.containsKey(elementKey)) {
         var validContainerKeys = _containerKeyMap[elementKey]!;
         var containerKey =
@@ -659,6 +687,20 @@
         } else {
           components.add(containerName);
         }
+        if (staticNode != null) {
+          var staticValue = _translateBool(
+              staticNode, ErrorContext(key: _staticKey, parentNode: node));
+          if (staticValue != null) {
+            if (components.length == 1) {
+              _reportError(TransformSetErrorCode.unsupportedStatic,
+                  node.getKey(_staticKey)!);
+            }
+            isStatic = staticValue;
+          }
+        }
+      } else if (staticNode != null) {
+        _reportError(
+            TransformSetErrorCode.unsupportedStatic, node.getKey(_staticKey)!);
       }
       if (uris == null) {
         // The error has already been reported.
@@ -673,6 +715,7 @@
       return ElementDescriptor(
           libraryUris: uris,
           kind: ElementKindUtilities.fromName(elementKey)!,
+          isStatic: isStatic,
           components: components);
     } else if (node == null) {
       return _reportMissingKey(context);
@@ -821,6 +864,41 @@
     return RenameParameter(newName: newName, oldName: oldName);
   }
 
+  /// Translate the [node] into a replaced_by change. Return the resulting
+  /// change, or `null` if the [node] does not represent a valid replaced_by
+  /// change.
+  ReplacedBy? _translateReplacedByChange(YamlMap node) {
+    _reportUnsupportedKeys(node, const {_kindKey, _newElementKey});
+    var newElement = _translateElement(node.valueAt(_newElementKey),
+        ErrorContext(key: _newElementKey, parentNode: node));
+    if (newElement == null) {
+      // The error has already been reported.
+      return null;
+    }
+    var oldElement = elementBeingTransformed;
+    if (oldElement != null) {
+      if (!_equalUris(oldElement.libraryUris, newElement.libraryUris)) {
+        _reportError(TransformSetErrorCode.unsupportedUriChange,
+            (node.valueAt(_newElementKey) as YamlMap).valueAt(_urisKey)!);
+      }
+      var compatibleTypes = compatibleReplacementTypes[oldElement.kind];
+      if (compatibleTypes == null) {
+        _reportError(
+            TransformSetErrorCode.invalidChangeForKind,
+            node.valueAt(_newElementKey)!,
+            [_replacedByKind, oldElement.kind.displayName]);
+        return null;
+      } else if (!compatibleTypes.contains(newElement.kind)) {
+        _reportError(
+            TransformSetErrorCode.incompatibleElementKind,
+            node.valueAt(_newElementKey)!,
+            [oldElement.kind.displayName, newElement.kind.displayName]);
+        return null;
+      }
+    }
+    return ReplacedBy(newElement: newElement);
+  }
+
   /// Translate the [node] into a string. Return the resulting string, or `null`
   /// if the [node] doesn't represent a valid string. If the [node] isn't valid,
   /// use the [context] to report the error. If the [node] doesn't exist and
@@ -851,7 +929,7 @@
     if (node is YamlMap) {
       var generators = <String, ValueGenerator>{};
       for (var entry in node.nodes.entries) {
-        var name = _translateKey(entry.key);
+        var name = _translateKey(entry.key as YamlNode);
         if (name != null) {
           var value = _translateValueGenerator(
               entry.value, ErrorContext(key: name, parentNode: node));
@@ -893,6 +971,7 @@
           true;
       var element = _translateElement(node.valueAt(_elementKey),
           ErrorContext(key: _elementKey, parentNode: node));
+      elementBeingTransformed = element;
       transformVariableScope = _translateTemplateVariables(
           node.valueAt(_variablesKey),
           ErrorContext(key: _variablesKey, parentNode: node));
@@ -1032,4 +1111,43 @@
       return _reportInvalidValue(node, context, 'Map');
     }
   }
+
+  static Map<ElementKind, Set<ElementKind>>
+      _createCompatibleReplacementTypes() {
+    var types = <ElementKind, Set<ElementKind>>{};
+
+    void addSet(Set<ElementKind> set) {
+      for (var kind in set) {
+        types.putIfAbsent(kind, () => {}).addAll(set);
+      }
+    }
+
+    // Constructors can replace constructors.
+    addSet({
+      ElementKind.constructorKind,
+    });
+    // Static methods and top-level functions can replace each other.
+    addSet({
+      ElementKind.functionKind,
+      ElementKind.methodKind,
+    });
+    // Static getters and getter-inducing elements can replace each other.
+    addSet({
+      ElementKind.constantKind,
+      ElementKind.fieldKind,
+      ElementKind.getterKind,
+      ElementKind.variableKind,
+    });
+    // Static setters and setter-inducing elements can replace each other.
+    // TODO(brianwilkerson) We can't currently distinguish between final and
+    //  non-final elements, but we don't support replacing setters with final
+    //  elements, nor vice versa. We need a way to distinguish these cases if we
+    //  want to be able to report an error.
+    addSet({
+      ElementKind.fieldKind,
+      ElementKind.setterKind,
+      ElementKind.variableKind,
+    });
+    return types;
+  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 26bcfbd..0186ba9 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -25,6 +25,7 @@
 import 'package:analysis_server/src/services/correction/dart/add_override.dart';
 import 'package:analysis_server/src/services/correction/dart/add_required.dart';
 import 'package:analysis_server/src/services/correction/dart/add_required_keyword.dart';
+import 'package:analysis_server/src/services/correction/dart/add_return_null.dart';
 import 'package:analysis_server/src/services/correction/dart/add_return_type.dart';
 import 'package:analysis_server/src/services/correction/dart/add_static.dart';
 import 'package:analysis_server/src/services/correction/dart/add_super_constructor_invocation.dart';
@@ -150,6 +151,8 @@
 import 'package:analysis_server/src/services/correction/dart/replace_null_with_closure.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_return_type.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_return_type_future.dart';
+import 'package:analysis_server/src/services/correction/dart/replace_return_type_iterable.dart';
+import 'package:analysis_server/src/services/correction/dart/replace_return_type_stream.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_var_with_dynamic.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_brackets.dart';
 import 'package:analysis_server/src/services/correction/dart/replace_with_conditional_assignment.dart';
@@ -251,8 +254,6 @@
             workspace,
             resolveResult,
             error,
-            (name) => [],
-            extensionCache: context.extensionCache,
           );
           fixState = await _fixError(fixContext, fixState, generator(), error);
         }
@@ -311,7 +312,7 @@
 
   List<ProducerGenerator> _getGenerators(ErrorCode errorCode) {
     if (errorCode is LintCode) {
-      return FixProcessor.lintProducerMap[errorCode.name] ?? [];
+      return FixProcessor.lintProducerMap[errorCode.uniqueLintName] ?? [];
     } else {
       // todo (pq): consider support for multiGenerators
       return FixProcessor.nonLintProducerMap[errorCode] ?? [];
@@ -325,6 +326,12 @@
   /// used to create correction producers. The generators are then used to build
   /// fixes for those diagnostics. The generators used for non-lint diagnostics
   /// are in the [nonLintProducerMap].
+  ///
+  /// The keys of the map are the unique names of the lint codes without the
+  /// `LintCode.` prefix. Generally the unique name is the same as the name of
+  /// the lint, so most of the keys are constants defined by [LintNames]. But
+  /// when a lint produces multiple codes, each with a different unique name,
+  /// the unique name must be used here.
   static final Map<String, List<ProducerGenerator>> lintProducerMap = {
     LintNames.always_declare_return_types: [
       AddReturnType.newInstance,
@@ -843,9 +850,15 @@
     CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS: [
       AddFieldFormalParameters.newInstance,
     ],
+    CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE: [
+      ReplaceReturnTypeStream.newInstance,
+    ],
     CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE: [
       ReplaceReturnTypeFuture.newInstance,
     ],
+    CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE: [
+      ReplaceReturnTypeIterable.newInstance,
+    ],
     CompileTimeErrorCode.IMPLEMENTS_NON_CLASS: [
       ChangeTo.classOrMixin,
       CreateClass.newInstance,
@@ -1079,6 +1092,9 @@
       MakeReturnTypeNullable.newInstance,
     ],
 
+    HintCode.BODY_MIGHT_COMPLETE_NORMALLY_NULLABLE: [
+      AddReturnNull.newInstance,
+    ],
     HintCode.CAN_BE_NULL_AFTER_NULL_AWARE: [
       ReplaceWithNullAware.inChain,
     ],
@@ -1345,7 +1361,7 @@
 
     var errorCode = error.errorCode;
     if (errorCode is LintCode) {
-      var generators = lintProducerMap[errorCode.name] ?? [];
+      var generators = lintProducerMap[errorCode.uniqueLintName] ?? [];
       for (var generator in generators) {
         await compute(generator());
       }
@@ -1359,7 +1375,7 @@
         for (var multiGenerator in multiGenerators) {
           var multiProducer = multiGenerator();
           multiProducer.configure(context);
-          for (var producer in multiProducer.producers) {
+          await for (var producer in multiProducer.producers) {
             await compute(producer);
           }
         }
@@ -1418,3 +1434,12 @@
     required this.fixCount,
   });
 }
+
+extension on LintCode {
+  String get uniqueLintName {
+    if (uniqueName.startsWith('LintCode.')) {
+      return uniqueName.substring(9);
+    }
+    return uniqueName;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
index 3708b48..e4438f2 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
@@ -2,15 +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:math' as math;
+
 import 'package:analysis_server/src/utilities/strings.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/ignore_comments/ignore_info.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError, Element;
+import 'package:collection/collection.dart';
+import 'package:meta/meta_meta.dart';
 
 /// Organizer of imports (and other directives) in the [unit].
 class ImportOrganizer {
@@ -67,6 +72,13 @@
     var lineInfo = unit.lineInfo ?? LineInfo.fromContent(code);
     var hasLibraryDirective = false;
     var directives = <_DirectiveInfo>[];
+    // Track the end offset of any library-level comment/annotations that should
+    // remain at the top of the file regardless of whether it was attached to a
+    // directive that's moved/removed.
+    // Code up to this offset will be excluded from the comment/docs/annotation
+    // text for the computed DirectiveInfo and also its range for replacement
+    // in the document.
+    int? libraryDocsAndAnnotationsEndOffset;
     for (var directive in unit.directives) {
       if (directive is LibraryDirective) {
         hasLibraryDirective = true;
@@ -77,15 +89,60 @@
           var offset = directive.offset;
           var end = directive.end;
 
-          final leadingComment = getLeadingComment(unit, directive, lineInfo);
-          final trailingComment =
-              getTrailingComment(unit, directive, lineInfo, end);
+          final isPsuedoLibraryDirective = directive == unit.directives.first;
+          Annotation? lastLibraryAnnotation;
+          if (isPsuedoLibraryDirective) {
+            // Find the last library-level annotation that does not come
+            // after any non-library annotation. If there are already
+            // non-library annotations before library annotations, we will not
+            // try to correct those.
+            lastLibraryAnnotation = directive.metadata
+                .takeWhile(_isLibraryTargetAnnotation)
+                .lastOrNull;
+            if (lastLibraryAnnotation != null) {
+              libraryDocsAndAnnotationsEndOffset =
+                  lineInfo.getOffsetOfLineAfter(lastLibraryAnnotation.end);
+              // In the case of a blank line after the last library annotation
+              // we should include that in the library part. Otherwise it will
+              // be included in the top of the following directive and may
+              // result in an extra blank line in the annotation block if it
+              // is moved.
+              final nextLineOffset = lineInfo
+                  .getOffsetOfLineAfter(libraryDocsAndAnnotationsEndOffset);
+              if (code
+                  .substring(libraryDocsAndAnnotationsEndOffset, nextLineOffset)
+                  .trim()
+                  .isEmpty) {
+                libraryDocsAndAnnotationsEndOffset = nextLineOffset;
+              }
+            }
+          }
+
+          // Usually we look for leading comments on the directive. However if
+          // some library annotations were trimmed off, those comments are part
+          // of that and should not also be included here.
+          final leadingToken =
+              lastLibraryAnnotation == null ? directive.beginToken : null;
+          final leadingComment = leadingToken != null
+              ? getLeadingComment(unit, leadingToken, lineInfo)
+              : null;
+          final trailingComment = getTrailingComment(unit, directive, lineInfo);
+
+          /// Computes the offset to use for the start of directive-specific
+          /// code below taking into account code already included by
+          /// [libraryDocsAndAnnotationsEndOffset].
+          final clampedOffset = libraryDocsAndAnnotationsEndOffset == null
+              ? (int offset) => offset
+              : (int offset) =>
+                  math.max(libraryDocsAndAnnotationsEndOffset!, offset);
 
           String? leadingCommentText;
-          if (leadingComment != null) {
-            leadingCommentText =
-                code.substring(leadingComment.offset, directive.offset);
-            offset = leadingComment.offset;
+          if (leadingComment != null && leadingToken != null) {
+            offset = clampedOffset(leadingComment.offset);
+            leadingCommentText = code.substring(
+              offset,
+              clampedOffset(leadingToken.offset),
+            );
           }
           String? trailingCommentText;
           if (trailingComment != null) {
@@ -97,13 +154,33 @@
           var documentationComment = directive.documentationComment;
           if (documentationComment != null) {
             documentationText = code.substring(
-                documentationComment.offset, documentationComment.end);
+              clampedOffset(documentationComment.offset),
+              clampedOffset(documentationComment.end),
+            );
           }
           String? annotationText;
+          String? postAnnotationCommentText;
           var beginToken = directive.metadata.beginToken;
           var endToken = directive.metadata.endToken;
           if (beginToken != null && endToken != null) {
-            annotationText = code.substring(beginToken.offset, endToken.end);
+            var annotationOffset = clampedOffset(beginToken.offset);
+            var annotationEnd = clampedOffset(endToken.end);
+            if (annotationOffset != annotationEnd) {
+              annotationText = code.substring(
+                annotationOffset,
+                annotationEnd,
+              );
+            }
+            // Capture text between the end of the annotation and the directive
+            // text as there may be end-of line or line comments between.
+            // If not, this will capture the newline between the two, as it
+            // cannot be assumed there is a newline after annotationText because
+            // of the possibility of comments.
+            if (annotationEnd <
+                directive.firstTokenAfterCommentAndMetadata.offset) {
+              postAnnotationCommentText = code.substring(annotationEnd,
+                  directive.firstTokenAfterCommentAndMetadata.offset);
+            }
           }
           var text = code.substring(
               directive.firstTokenAfterCommentAndMetadata.offset,
@@ -116,9 +193,12 @@
               leadingCommentText,
               documentationText,
               annotationText,
+              postAnnotationCommentText,
               uriContent,
               trailingCommentText,
-              offset,
+              isPsuedoLibraryDirective
+                  ? (libraryDocsAndAnnotationsEndOffset ?? offset)
+                  : offset,
               end,
               text,
             ),
@@ -151,7 +231,7 @@
         sb.write(libraryDocumentationDirective.documentationText);
         sb.write(endOfLine);
       }
-      var currentPriority = directives.first.priority;
+      _DirectivePriority? currentPriority;
       for (var directiveInfo in directives) {
         if (!hasUnresolvedIdentifierError) {
           var directive = directiveInfo.directive;
@@ -160,7 +240,9 @@
           }
         }
         if (currentPriority != directiveInfo.priority) {
-          sb.write(endOfLine);
+          if (currentPriority != null) {
+            sb.write(endOfLine);
+          }
           currentPriority = directiveInfo.priority;
         }
         if (directiveInfo.leadingCommentText != null) {
@@ -173,7 +255,9 @@
         }
         if (directiveInfo.annotationText != null) {
           sb.write(directiveInfo.annotationText);
-          sb.write(endOfLine);
+        }
+        if (directiveInfo.postAnnotationCommentText != null) {
+          sb.write(directiveInfo.postAnnotationCommentText);
         }
         sb.write(directiveInfo.text);
         if (directiveInfo.trailingCommentText != null) {
@@ -230,7 +314,7 @@
   }
 
   /// Gets the first comment token considered to be the leading comment for this
-  /// directive.
+  /// token.
   ///
   /// Leading comments for the first directive in a file are considered library
   /// comments and not returned unless they contain blank lines, in which case
@@ -239,12 +323,12 @@
   /// '// ignore:' comment which should always be treated as attached to the
   /// import.
   static Token? getLeadingComment(
-      CompilationUnit unit, UriBasedDirective directive, LineInfo lineInfo) {
-    if (directive.beginToken.precedingComments == null) {
+      CompilationUnit unit, Token beginToken, LineInfo lineInfo) {
+    if (beginToken.precedingComments == null) {
       return null;
     }
 
-    Token? firstComment = directive.beginToken.precedingComments;
+    Token? firstComment = beginToken.precedingComments;
     var comment = firstComment;
     var nextComment = comment?.next;
     // Don't connect comments that have a blank line between them
@@ -274,7 +358,7 @@
     // Skip over any comments on the same line as the previous directive
     // as they will be attached to the end of it.
     var previousDirectiveLine =
-        lineInfo.getLocation(directive.beginToken.previous!.end).lineNumber;
+        lineInfo.getLocation(beginToken.previous!.end).lineNumber;
     comment = firstComment;
     while (comment != null &&
         previousDirectiveLine ==
@@ -289,9 +373,9 @@
   ///
   /// To be considered a trailing comment, the comment must be on the same line
   /// as the directive.
-  static Token? getTrailingComment(CompilationUnit unit,
-      UriBasedDirective directive, LineInfo lineInfo, int end) {
-    var line = lineInfo.getLocation(end).lineNumber;
+  static Token? getTrailingComment(
+      CompilationUnit unit, UriBasedDirective directive, LineInfo lineInfo) {
+    var line = lineInfo.getLocation(directive.end).lineNumber;
     Token? comment = directive.endToken.next!.precedingComments;
     while (comment != null) {
       if (lineInfo.getLocation(comment.offset).lineNumber == line) {
@@ -306,6 +390,10 @@
   /// '// ignore_for_file:' comment).
   static bool _isIgnoreComment(Token token) =>
       IgnoreInfo.IGNORE_MATCHER.matchAsPrefix(token.lexeme) != null;
+
+  static bool _isLibraryTargetAnnotation(Annotation annotation) =>
+      annotation.elementAnnotation?.targetKinds.contains(TargetKind.library) ??
+      false;
 }
 
 class _DirectiveInfo implements Comparable<_DirectiveInfo> {
@@ -314,6 +402,7 @@
   final String? leadingCommentText;
   final String? documentationText;
   final String? annotationText;
+  final String? postAnnotationCommentText;
   final String uri;
   final String? trailingCommentText;
 
@@ -332,6 +421,7 @@
     this.leadingCommentText,
     this.documentationText,
     this.annotationText,
+    this.postAnnotationCommentText,
     this.uri,
     this.trailingCommentText,
     this.offset,
diff --git a/pkg/analysis_server/lib/src/services/correction/sort_members.dart b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
index 93e103a..d257984 100644
--- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart
+++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
@@ -3,9 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/organize_imports.dart';
+import 'package:analysis_server/src/utilities/extensions/range_factory.dart';
 import 'package:analysis_server/src/utilities/strings.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
+import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 /// Sorter for unit/class members.
 class MemberSorter {
@@ -45,11 +48,14 @@
 
   final CompilationUnit unit;
 
+  final LineInfo lineInfo;
+
   String code;
 
   String endOfLine = '\n';
 
-  MemberSorter(this.initialCode, this.unit) : code = initialCode {
+  MemberSorter(this.initialCode, this.unit, this.lineInfo)
+      : code = initialCode {
     endOfLine = getEOL(code);
   }
 
@@ -88,15 +94,17 @@
   void _sortClassesMembers() {
     for (var unitMember in unit.declarations) {
       if (unitMember is ClassOrMixinDeclaration) {
-        _sortClassMembers(unitMember);
+        _sortClassMembers(unitMember.members);
+      } else if (unitMember is ExtensionDeclaration) {
+        _sortClassMembers(unitMember.members);
       }
     }
   }
 
   /// Sorts all members of the given [classDeclaration].
-  void _sortClassMembers(ClassOrMixinDeclaration classDeclaration) {
+  void _sortClassMembers(List<ClassMember> membersToSort) {
     var members = <_MemberInfo>[];
-    for (var member in classDeclaration.members) {
+    for (var member in membersToSort) {
       _MemberKind kind;
       var isStatic = false;
       String name;
@@ -136,8 +144,9 @@
         throw StateError('Unsupported class of member: ${member.runtimeType}');
       }
       var item = _PriorityItem.forName(isStatic, name, kind);
-      var offset = member.offset;
-      var length = member.length;
+      var nodeRange = range.nodeWithComments(lineInfo, member);
+      var offset = nodeRange.offset;
+      var length = nodeRange.length;
       var text = code.substring(offset, offset + length);
       members.add(_MemberInfo(item, name, offset, length, text));
     }
@@ -212,8 +221,9 @@
         throw StateError('Unsupported class of member: ${member.runtimeType}');
       }
       var item = _PriorityItem.forName(false, name, kind);
-      var offset = member.offset;
-      var length = member.length;
+      var nodeRange = range.nodeWithComments(lineInfo, member);
+      var offset = nodeRange.offset;
+      var length = nodeRange.length;
       var text = code.substring(offset, offset + length);
       members.add(_MemberInfo(item, name, offset, length, text));
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index be7ef60..9066429 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -492,8 +492,8 @@
 }
 
 /// Return `true` if the given [lists] are identical at the given [position].
-bool _allListsIdentical(List<List> lists, int position) {
-  Object element = lists[0][position];
+bool _allListsIdentical(List<List<Object>> lists, int position) {
+  var element = lists[0][position];
   for (var list in lists) {
     if (list[position] != element) {
       return false;
diff --git a/pkg/analysis_server/lib/src/services/pub/pub_api.dart b/pkg/analysis_server/lib/src/services/pub/pub_api.dart
index d89d165..b2f9fe1 100644
--- a/pkg/analysis_server/lib/src/services/pub/pub_api.dart
+++ b/pkg/analysis_server/lib/src/services/pub/pub_api.dart
@@ -59,7 +59,7 @@
 
     final packageNames = json['packages'];
     return packageNames is List
-        ? packageNames.map((name) => PubApiPackage(name)).toList()
+        ? packageNames.map((name) => PubApiPackage(name as String)).toList()
         : null;
   }
 
@@ -103,7 +103,7 @@
             await httpClient.get(Uri.parse(url), headers: _headers);
         if (response.statusCode == 200) {
           instrumentationService.logInfo('Pub API request successful for $url');
-          return jsonDecode(response.body);
+          return jsonDecode(response.body) as Map<String, Object?>?;
         } else if (response.statusCode >= 400 && response.statusCode < 500) {
           // Do not retry 4xx responses.
           instrumentationService.logError(
diff --git a/pkg/analysis_server/lib/src/services/pub/pub_command.dart b/pkg/analysis_server/lib/src/services/pub/pub_command.dart
index f6188e0..2351441 100644
--- a/pkg/analysis_server/lib/src/services/pub/pub_command.dart
+++ b/pkg/analysis_server/lib/src/services/pub/pub_command.dart
@@ -136,7 +136,7 @@
       try {
         final results = jsonDecode(stdout);
         _instrumentationService.logInfo('pub command completed successfully');
-        return results;
+        return results as Map<String, Object?>?;
       } catch (e) {
         _instrumentationService
             .logError('pub command returned invalid JSON: $e.');
diff --git a/pkg/analysis_server/lib/src/services/pub/pub_package_service.dart b/pkg/analysis_server/lib/src/services/pub/pub_package_service.dart
index 1db29fd..db78765 100644
--- a/pkg/analysis_server/lib/src/services/pub/pub_package_service.dart
+++ b/pkg/analysis_server/lib/src/services/pub/pub_package_service.dart
@@ -322,6 +322,8 @@
       final json = jsonDecode(contents);
       if (json is Map<String, Object?>) {
         return PackageDetailsCache.fromJson(json);
+      } else {
+        return null;
       }
     } catch (e) {
       _instrumentationService.logError('Error reading pub cache file: $e');
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 6e97072..f3cae42 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -158,9 +158,7 @@
     var refDir = pathContext.dirname(reference.file);
     // Try to keep package: URI
     if (_isPackageReference(reference)) {
-      Source newSource =
-          NonExistingSource(newFile, pathos.toUri(newFile), UriKind.FILE_URI);
-      var restoredUri = driver.sourceFactory.restoreUri(newSource);
+      var restoredUri = driver.sourceFactory.pathToUri(newFile);
       // If the new URI is not a package: URI, fall back to computing a relative
       // URI below.
       if (restoredUri?.isScheme('package') ?? false) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index 3ca9d77..8fbe15a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -73,7 +73,7 @@
   @override
   Future<RefactoringStatus> checkInitialConditions() {
     var result = RefactoringStatus();
-    if (element.source!.isInSystemLibrary) {
+    if (element.source!.uri.isScheme('dart')) {
       var message = format(
           "The {0} '{1}' is defined in the SDK, so cannot be renamed.",
           getElementKindName(element),
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 59cafe6..8e938ef 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -62,7 +62,7 @@
       var error = RequestError(
           RequestErrorCode.SERVER_ALREADY_STARTED, 'Server already started');
       serverChannel.sendResponse(Response('', error: error));
-      serverChannel.listen((Request request) {
+      serverChannel.requests.listen((Request request) {
         serverChannel.sendResponse(Response(request.id, error: error));
       });
       return;
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 0d4629c..b7f2f61 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -206,7 +206,7 @@
     buf.writeln(
         '<tr><th>Time</th><th>Results</th><th>Source</th><th>Snippet</th></tr>');
     for (var completion in completions) {
-      var shortName = pathContext.basename(completion.path ?? '<missing path>');
+      var shortName = pathContext.basename(completion.path);
       buf.writeln('<tr>'
           '<td class="pre right">${printMilliseconds(completion.elapsedInMilliseconds)}</td>'
           '<td class="right">${completion.suggestionCountStr}</td>'
@@ -333,9 +333,8 @@
         latencyCount > 0 ? (perf.slowRequestCount / latencyCount) : 0.0;
 
     buf.write('<table>');
-    writeRow([printInteger(requestCount), 'requests'],
-        classes: ['right', null]);
-    writeRow([printInteger(latencyCount), 'requests with latency information'],
+    writeRow(['$requestCount', 'requests'], classes: ['right', null]);
+    writeRow(['$latencyCount', 'requests with latency information'],
         classes: ['right', null]);
     if (latencyCount > 0) {
       writeRow([printMilliseconds(averageLatency), 'average latency'],
@@ -431,7 +430,7 @@
                 'An analysis context defines the options and the set of sources being analyzed.');
 
   @override
-  String get navDetail => printInteger(server.driverMap.length);
+  String get navDetail => '${server.driverMap.length}';
 
   String describe(AnalysisOptionsImpl options) {
     var b = StringBuffer();
@@ -898,7 +897,7 @@
   Iterable<ServerException> get exceptions => server.exceptions.items;
 
   @override
-  String get navDetail => printInteger(exceptions.length);
+  String get navDetail => '${exceptions.length}';
 
   @override
   Future generateContent(Map<String, String> params) async {
@@ -1064,8 +1063,7 @@
     if (usage != null) {
       buf.writeln(
           writeOption('CPU', printPercentage(usage.cpuPercentage / 100.0)));
-      buf.writeln(
-          writeOption('Memory', '${printInteger(usage.memoryMB.round())} MB'));
+      buf.writeln(writeOption('Memory', '${usage.memoryMB.round()} MB'));
 
       h3('VM');
 
diff --git a/pkg/analysis_server/lib/src/status/pages.dart b/pkg/analysis_server/lib/src/status/pages.dart
index e626e02..d2c6bb3 100644
--- a/pkg/analysis_server/lib/src/status/pages.dart
+++ b/pkg/analysis_server/lib/src/status/pages.dart
@@ -5,17 +5,11 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:intl/intl.dart';
-
-final NumberFormat numberFormat = NumberFormat.decimalPattern();
-
 String escape(String? text) => text == null ? '' : htmlEscape.convert(text);
 
-String printInteger(int value) => numberFormat.format(value);
+String printMilliseconds(int value) => '$value ms';
 
-String printMilliseconds(num value) => '${numberFormat.format(value)} ms';
-
-String printPercentage(num value, [fractionDigits = 1]) =>
+String printPercentage(num value, [int fractionDigits = 1]) =>
     '${(value * 100).toStringAsFixed(fractionDigits)}%';
 
 /// An entity that knows how to serve itself over http.
diff --git a/pkg/analysis_server/lib/src/status/tree_writer.dart b/pkg/analysis_server/lib/src/status/tree_writer.dart
index ec20780..01543e1 100644
--- a/pkg/analysis_server/lib/src/status/tree_writer.dart
+++ b/pkg/analysis_server/lib/src/status/tree_writer.dart
@@ -80,13 +80,13 @@
 
   /// Write the [value] of the property with the given [name].
   void _writePropertyValue(Object value, int baseIndent) {
-    if (value is List) {
+    if (value is List<Object>) {
       if (value.isEmpty) {
         buffer.write('[]');
       } else {
         var elementIndent = baseIndent + 2;
         buffer.write('[<br>');
-        for (Object element in value) {
+        for (var element in value) {
           indent(elementIndent);
           _writePropertyValue(element, elementIndent);
           buffer.write('<br>');
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
index 97ab036..b92d957 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/ast.dart
@@ -8,6 +8,18 @@
 import 'package:analyzer/dart/element/element.dart';
 
 extension AstNodeExtensions on AstNode {
+  /// Return the [IfStatement] associated with `this`.
+  IfStatement? get enclosingIfStatement {
+    for (var node in withParents) {
+      if (node is IfStatement) {
+        return node;
+      } else if (node is! Expression) {
+        return null;
+      }
+    }
+    return null;
+  }
+
   /// Return `true` if this node has an `override` annotation.
   bool get hasOverride {
     var node = this;
@@ -62,17 +74,6 @@
 
   bool get inWhileLoop => thisOrAncestorOfType<WhileStatement>() != null;
 
-  /// Return the [IfStatement] associated with `this`.
-  IfStatement? get enclosingIfStatement {
-    for (var node in withParents) {
-      if (node is IfStatement) {
-        return node;
-      } else if (node is! Expression) {
-        return null;
-      }
-    }
-  }
-
   /// Return this node and all its parents.
   Iterable<AstNode> get withParents sync* {
     var current = this;
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/element.dart b/pkg/analysis_server/lib/src/utilities/extensions/element.dart
index 764d8ab..1bc51b1 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/element.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/element.dart
@@ -2,12 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/generic_inferrer.dart';
-import 'package:analyzer/src/dart/element/type_algebra.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
 
 extension ClassElementExtensions on ClassElement {
   /// Return `true` if this element represents the class `Iterable` from
@@ -60,55 +55,10 @@
   }
 }
 
-extension ExtensionElementExtensions on ExtensionElement {
-  /// Use the [type] of the object being extended in the [library] to compute
-  /// the actual type extended by this [extension]. Return the computed type,
-  /// or `null` if the type can't be computed.
-  DartType? resolvedExtendedType(LibraryElement library, DartType type) {
-    final typeParameters = this.typeParameters;
-    var inferrer =
-        GenericInferrer(library.typeSystem as TypeSystemImpl, typeParameters);
-    inferrer.constrainArgument(
-      type,
-      extendedType,
-      'extendedType',
-    );
-    var typeArguments = inferrer.infer(typeParameters,
-        failAtError: true, genericMetadataIsEnabled: true);
-    if (typeArguments == null) {
-      return null;
-    }
-    var substitution = Substitution.fromPairs(
-      typeParameters,
-      typeArguments,
-    );
-    return substitution.substituteType(
-      extendedType,
-    );
-  }
-}
-
 extension LibraryElementExtensions on LibraryElement {
-  /// Return the extensions in this library that can be applied, within the
-  /// [containingLibrary], to the [targetType] and that define a member with the
-  /// given [memberName].
-  Iterable<ExtensionElement> matchingExtensionsWithMember(
-      LibraryElement containingLibrary,
-      DartType targetType,
-      String memberName) sync* {
-    for (var unit in units) {
-      for (var extension in unit.extensions) {
-        var extensionName = extension.name;
-        if (extensionName != null && !Identifier.isPrivateName(extensionName)) {
-          var extendedType =
-              extension.resolvedExtendedType(containingLibrary, targetType);
-          if (extendedType != null &&
-              typeSystem.isSubtypeOf(targetType, extendedType)) {
-            yield extension;
-          }
-        }
-      }
-    }
+  /// Return all extensions exported from this library.
+  Iterable<ExtensionElement> get exportedExtensions {
+    return exportNamespace.definedNames.values.whereType();
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/range_factory.dart b/pkg/analysis_server/lib/src/utilities/extensions/range_factory.dart
index 4b8451a..95c5384 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/range_factory.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/range_factory.dart
@@ -9,15 +9,15 @@
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
 extension RangeFactoryExtensions on RangeFactory {
-  /// Return a source range that covers the given [item] in the containing
+  /// Return a source range that covers the given [node] in the containing
   /// [list]. This includes a leading or trailing comma, as appropriate, and any
   /// leading or trailing comments. The [lineInfo] is used to differentiate
-  /// trailing comments (on the same line as the end of the item) from leading
-  /// comments (on lines between the start of the item and the preceding comma).
+  /// trailing comments (on the same line as the end of the node) from leading
+  /// comments (on lines between the start of the node and the preceding comma).
   ///
-  /// Throws an `ArgumentError` if the [item] is not an element of the [list].
+  /// Throws an `ArgumentError` if the [node] is not an element of the [list].
   SourceRange nodeInListWithComments<T extends AstNode>(
-      LineInfo lineInfo, NodeList<T> list, T item) {
+      LineInfo lineInfo, NodeList<T> list, T node) {
     // TODO(brianwilkerson) Improve the name and signature of this method and
     //  make it part of the API of either `RangeFactory` or
     //  `DartFileEditBuilder`. The implementation currently assumes that the
@@ -28,24 +28,24 @@
     // TODO(brianwilkerson) Consider adding a `separator` parameter so that we
     //  can handle things like statements in a block.
     if (list.length == 1) {
-      if (list[0] != item) {
-        throw ArgumentError('The item must be in the list.');
+      if (list[0] != node) {
+        throw ArgumentError('The node must be in the list.');
       }
       // If there's only one item in the list, then delete everything including
       // any leading or trailing comments, including any trailing comma.
-      var leadingComment = _leadingComment(lineInfo, item.beginToken);
-      var trailingComment = _trailingComment(lineInfo, item.endToken, true);
+      var leadingComment = _leadingComment(lineInfo, node.beginToken);
+      var trailingComment = _trailingComment(lineInfo, node.endToken, true);
       return startEnd(leadingComment, trailingComment);
     }
-    final index = list.indexOf(item);
+    final index = list.indexOf(node);
     if (index < 0) {
-      throw ArgumentError('The item must be in the list.');
+      throw ArgumentError('The node must be in the list.');
     }
     if (index == 0) {
       // If this is the first item in the list, then delete everything from the
       // leading comment for this item to the leading comment for the next item.
       // This will include the comment after this item.
-      var thisLeadingComment = _leadingComment(lineInfo, item.beginToken);
+      var thisLeadingComment = _leadingComment(lineInfo, node.beginToken);
       var nextLeadingComment = _leadingComment(lineInfo, list[1].beginToken);
       return startStart(thisLeadingComment, nextLeadingComment);
     } else {
@@ -56,7 +56,7 @@
           _trailingComment(lineInfo, list[index - 1].endToken, false);
       var previousHasTrailingComment = previousTrailingComment is CommentToken;
       var thisTrailingComment =
-          _trailingComment(lineInfo, item.endToken, previousHasTrailingComment);
+          _trailingComment(lineInfo, node.endToken, previousHasTrailingComment);
       if (!previousHasTrailingComment && thisTrailingComment is CommentToken) {
         // But if this item has a trailing comment and the previous didn't, then
         // we'd be deleting both commas, which would leave invalid code. We
@@ -67,6 +67,48 @@
     }
   }
 
+  /// Return a source range that covers the given [node] with any leading and
+  /// trailing comments.
+  ///
+  /// The range begins at the start of any leading comment token (excluding any
+  /// token considered a trailing comment for the previous node) or the start
+  /// of the node itself if there are none.
+  ///
+  /// The range ends at the end of the trailing comment token or the end of the
+  /// node itself if there is not one.
+  SourceRange nodeWithComments(LineInfo lineInfo, AstNode node) {
+    // If the node is the first thing in the unit, leading comments are treated
+    // as headers and should never be included in the range.
+    final isFirstItem = node.beginToken == node.root.beginToken;
+
+    var thisLeadingComment = isFirstItem
+        ? node.beginToken
+        : _leadingComment(lineInfo, node.beginToken);
+    var thisTrailingComment = _trailingComment(lineInfo, node.endToken, false);
+
+    return startEnd(thisLeadingComment, thisTrailingComment);
+  }
+
+  /// Return the left-most comment immediately before the [token] that is not on
+  /// the same line as the first non-comment token before the [token]. Return
+  /// the [token] if there is no such comment.
+  Token _leadingComment(LineInfo lineInfo, Token token) {
+    var previous = token.previous;
+    if (previous == null || previous.type == TokenType.EOF) {
+      return token.precedingComments ?? token;
+    }
+    var previousLine = lineInfo.getLocation(previous.offset).lineNumber;
+    Token? comment = token.precedingComments;
+    while (comment != null) {
+      var commentLine = lineInfo.getLocation(comment.offset).lineNumber;
+      if (commentLine != previousLine) {
+        break;
+      }
+      comment = comment.next;
+    }
+    return comment ?? token;
+  }
+
   /// Return the comment token immediately following the [token] if it is on the
   /// same line as the [token], or the [token] if there is no comment after the
   /// [token] or if the comment is on a different line than the [token]. If
@@ -89,20 +131,4 @@
     }
     return returnComma ? lastToken : token;
   }
-
-  /// Return the left-most comment immediately before the [token] that is not on
-  /// the same line as the first non-comment token before the [token]. Return
-  /// the [token] if there is no such comment.
-  Token _leadingComment(LineInfo lineInfo, Token token) {
-    var previousLine = lineInfo.getLocation(token.previous!.offset).lineNumber;
-    Token? comment = token.precedingComments;
-    while (comment != null) {
-      var commentLine = lineInfo.getLocation(comment.offset).lineNumber;
-      if (commentLine != previousLine) {
-        break;
-      }
-      comment = comment.next;
-    }
-    return comment ?? token;
-  }
 }
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/yaml.dart b/pkg/analysis_server/lib/src/utilities/extensions/yaml.dart
index 474b711..b3c0c2e 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/yaml.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/yaml.dart
@@ -29,8 +29,9 @@
         var nextEntryOffset = i + 1 < entries.length
             ? (entries[i + 1].key as YamlNode).span.start.offset
             : null;
-        if ((entry.key as YamlNode).containsOffset(offset)) {
-          return entry.key;
+        var key = entry.key as YamlNode;
+        if (key.containsOffset(offset)) {
+          return key;
         }
         var value = entry.value;
         if (value.containsOffset(offset) ||
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index b733540..4cb6d42 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -72,64 +72,20 @@
     return null;
   }
 
-  void convertChildToChildren(
-      InstanceCreationExpression childArg,
-      NamedExpression namedExp,
-      String eol,
-      Function getNodeText,
-      Function getLinePrefix,
-      Function getIndent,
-      Function getText,
-      Function _addInsertEdit,
-      Function _addRemoveEdit,
-      Function _addReplaceEdit,
-      Function rangeNode) {
-    var childLoc = namedExp.offset + 'child'.length;
-    _addInsertEdit(childLoc, 'ren');
-    var listLoc = childArg.offset;
-    String childArgSrc = getNodeText(childArg);
-    if (!childArgSrc.contains(eol)) {
-      _addInsertEdit(listLoc, '[');
-      _addInsertEdit(listLoc + childArg.length, ']');
-    } else {
-      var newlineLoc = childArgSrc.lastIndexOf(eol);
-      if (newlineLoc == childArgSrc.length) {
-        newlineLoc -= 1;
-      }
-      String indentOld =
-          getLinePrefix(childArg.offset + eol.length + newlineLoc);
-      var indentNew = '$indentOld${getIndent(1)}';
-      // The separator includes 'child:' but that has no newlines.
-      String separator =
-          getText(namedExp.offset, childArg.offset - namedExp.offset);
-      var prefix = separator.contains(eol) ? '' : '$eol$indentNew';
-      if (prefix.isEmpty) {
-        _addInsertEdit(namedExp.offset + 'child:'.length, ' [');
-        _addRemoveEdit(SourceRange(childArg.offset - 2, 2));
-      } else {
-        _addInsertEdit(listLoc, '[');
-      }
-      var newChildArgSrc = childArgSrc.replaceAll(
-          RegExp('^$indentOld', multiLine: true), '$indentNew');
-      newChildArgSrc = '$prefix$newChildArgSrc,$eol$indentOld]';
-      _addReplaceEdit(rangeNode(childArg), newChildArgSrc);
-    }
-  }
-
   void convertChildToChildren2(
       DartFileEditBuilder builder,
       Expression childArg,
       NamedExpression namedExp,
       String eol,
-      Function getNodeText,
-      Function getLinePrefix,
-      Function getIndent,
-      Function getText,
-      Function rangeNode) {
+      String Function(Expression) getNodeText,
+      String Function(int) getLinePrefix,
+      String Function(int) getIndent,
+      String Function(int, int) getText,
+      SourceRange Function(Expression) rangeNode) {
     var childLoc = namedExp.offset + 'child'.length;
     builder.addSimpleInsertion(childLoc, 'ren');
     var listLoc = childArg.offset;
-    String childArgSrc = getNodeText(childArg);
+    var childArgSrc = getNodeText(childArg);
     if (!childArgSrc.contains(eol)) {
       builder.addSimpleInsertion(listLoc, '[');
       builder.addSimpleInsertion(listLoc + childArg.length, ']');
@@ -138,11 +94,10 @@
       if (newlineLoc == childArgSrc.length) {
         newlineLoc -= 1;
       }
-      String indentOld =
-          getLinePrefix(childArg.offset + eol.length + newlineLoc);
+      var indentOld = getLinePrefix(childArg.offset + eol.length + newlineLoc);
       var indentNew = '$indentOld${getIndent(1)}';
       // The separator includes 'child:' but that has no newlines.
-      String separator =
+      var separator =
           getText(namedExp.offset, childArg.offset - namedExp.offset);
       var prefix = separator.contains(eol) ? '' : '$eol$indentNew';
       if (prefix.isEmpty) {
diff --git a/pkg/analysis_server/lib/src/utilities/mocks.dart b/pkg/analysis_server/lib/src/utilities/mocks.dart
index 9c581cd..bef5102 100644
--- a/pkg/analysis_server/lib/src/utilities/mocks.dart
+++ b/pkg/analysis_server/lib/src/utilities/mocks.dart
@@ -36,6 +36,9 @@
   MockServerChannel();
 
   @override
+  Stream<Request> get requests => requestController.stream;
+
+  @override
   void close() {
     _closed = true;
   }
@@ -46,13 +49,6 @@
   }
 
   @override
-  void listen(void Function(Request request) onRequest,
-      {Function? onError, void Function()? onDone}) {
-    requestController.stream
-        .listen(onRequest, onError: onError, onDone: onDone);
-  }
-
-  @override
   void sendNotification(Notification notification) {
     // Don't deliver notifications after the connection is closed.
     if (_closed) {
diff --git a/pkg/analysis_server/lib/src/utilities/profiling.dart b/pkg/analysis_server/lib/src/utilities/profiling.dart
index b5e41fb..f1fcddb 100644
--- a/pkg/analysis_server/lib/src/utilities/profiling.dart
+++ b/pkg/analysis_server/lib/src/utilities/profiling.dart
@@ -56,7 +56,7 @@
           return Future.value(null);
         }
 
-        return Future.value(_parse(result.stdout));
+        return Future.value(_parse(result.stdout as String));
       });
     } catch (e) {
       return Future.error(e);
diff --git a/pkg/analysis_server/lib/src/utilities/progress.dart b/pkg/analysis_server/lib/src/utilities/progress.dart
new file mode 100644
index 0000000..822b750
--- /dev/null
+++ b/pkg/analysis_server/lib/src/utilities/progress.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class CancelableToken extends CancellationToken {
+  bool _isCancelled = false;
+
+  @override
+  bool get isCancellationRequested => _isCancelled;
+
+  void cancel() => _isCancelled = true;
+}
+
+/// A token used to signal cancellation of an operation. This allows computation
+/// to be skipped when a caller is no longer interested in the result, for example
+/// when a $/cancel request is recieved for an in-progress request.
+abstract class CancellationToken {
+  bool get isCancellationRequested;
+}
+
+/// A [CancellationToken] that cannot be cancelled.
+class NotCancelableToken extends CancellationToken {
+  @override
+  bool get isCancellationRequested => false;
+}
diff --git a/pkg/analysis_server/lib/src/utilities/yaml_node_locator.dart b/pkg/analysis_server/lib/src/utilities/yaml_node_locator.dart
index c8c49ef..c04e29e 100644
--- a/pkg/analysis_server/lib/src/utilities/yaml_node_locator.dart
+++ b/pkg/analysis_server/lib/src/utilities/yaml_node_locator.dart
@@ -49,7 +49,7 @@
     } else if (node is YamlMap) {
       var nodeMap = node.nodes;
       for (var entry in nodeMap.entries) {
-        _searchWithin(path, entry.key);
+        _searchWithin(path, entry.key as YamlNode);
         if (path.isNotEmpty) {
           path.add(node);
           return;
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index bb60379..39518e8 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -20,7 +20,6 @@
   dart_style: any
   http: any
   html: any
-  intl: any
   linter: any
   meta:
     path: ../meta
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index d727774..432a8b3 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -5,8 +5,6 @@
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 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/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
@@ -23,24 +21,6 @@
 
 import 'src/utilities/mock_packages.dart';
 
-/// Finds an [Element] with the given [name].
-Element? findChildElement(Element root, String name, [ElementKind? kind]) {
-  Element? result;
-  root.accept(_ElementVisitorFunctionWrapper((Element element) {
-    if (element.name != name) {
-      return;
-    }
-    if (kind != null && element.kind != kind) {
-      return;
-    }
-    result = element;
-  }));
-  return result;
-}
-
-/// A function to be called for every [Element].
-typedef _ElementVisitorFunction = void Function(Element element);
-
 class AbstractContextTest with ResourceProviderMixin {
   static bool _lintRulesAreRegistered = false;
 
@@ -65,10 +45,20 @@
     throw 0;
   }
 
+  /// Return a list of the experiments that are to be enabled for tests in this
+  /// class, an empty list if there are no experiments that should be enabled.
+  List<String> get experiments => [
+        EnableString.constructor_tearoffs,
+        EnableString.named_arguments_anywhere,
+      ];
+
   String get latestLanguageVersion =>
       '${ExperimentStatus.currentVersion.major}.'
       '${ExperimentStatus.currentVersion.minor}';
 
+  /// The path that is not in [workspaceRootPath], contains external packages.
+  String get packagesRootPath => '/packages';
+
   Folder get sdkRoot => newFolder('/sdk');
 
   AnalysisSession get session => contextFor('/home/test').currentSession;
@@ -79,6 +69,8 @@
 
   String get testPackageRootPath => '$workspaceRootPath/test';
 
+  String get testPackageTestPath => '$testPackageRootPath/test';
+
   /// The file system specific `/home/test/pubspec.yaml` path.
   String get testPubspecPath => convertPath('/home/test/pubspec.yaml');
 
@@ -192,6 +184,10 @@
     );
 
     writeTestPackageConfig();
+
+    createAnalysisOptionsFile(
+      experiments: experiments,
+    );
   }
 
   void setupResourceProvider() {}
@@ -302,16 +298,3 @@
     verifyCreatedCollection();
   }
 }
-
-/// Wraps the given [_ElementVisitorFunction] into an instance of
-/// [engine.GeneralizingElementVisitor].
-class _ElementVisitorFunctionWrapper extends GeneralizingElementVisitor<void> {
-  final _ElementVisitorFunction function;
-  _ElementVisitorFunctionWrapper(this.function);
-
-  @override
-  void visitElement(Element element) {
-    function(element);
-    super.visitElement(element);
-  }
-}
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index b18416c..0c09690 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -64,13 +64,8 @@
     return super.newFile(path, content: content);
   }
 
-  Future<void> resolveTestCode(String code) async {
-    addTestSource(code);
-    await resolveTestFile();
-  }
-
-  Future<void> resolveTestFile() async {
-    var result = await session.getResolvedUnit(testFile) as ResolvedUnitResult;
+  Future<void> resolveFile2(String path) async {
+    var result = await session.getResolvedUnit(path) as ResolvedUnitResult;
     testAnalysisResult = result;
     testCode = result.content;
     testUnit = result.unit;
@@ -91,9 +86,18 @@
     findElement = FindElement(testUnit);
   }
 
+  Future<void> resolveTestCode(String code) async {
+    addTestSource(code);
+    await resolveTestFile();
+  }
+
+  Future<void> resolveTestFile() async {
+    await resolveFile2(testFile);
+  }
+
   @override
   void setUp() {
     super.setUp();
-    testFile = convertPath('/home/test/lib/test.dart');
+    testFile = convertPath('$testPackageLibPath/test.dart');
   }
 }
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 809d27a..558a318 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -145,7 +146,7 @@
   /// Validates that the given [request] is handled successfully.
   Response handleSuccessfulRequest(Request request, {RequestHandler? handler}) {
     handler ??= this.handler;
-    var response = handler.handleRequest(request)!;
+    var response = handler.handleRequest(request, NotCancelableToken())!;
     expect(response, isResponseSuccess(request.id));
     return response;
   }
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 4b41a22..907c39a 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -94,7 +95,7 @@
   }
 
   Future test_echo() {
-    server.handlers = [EchoHandler()];
+    server.handlers = [EchoHandler(server)];
     var request = Request('my22', 'echo');
     return channel.sendRequest(request).then((Response response) {
       expect(response.id, equals('my22'));
@@ -215,8 +216,39 @@
     });
   }
 
+  Future test_slowEcho_cancelled() async {
+    server.handlers = [
+      ServerDomainHandler(server),
+      EchoHandler(server),
+    ];
+    // Send the normal request.
+    var responseFuture = channel.sendRequest(Request('my22', 'slowEcho'));
+    // Send a cancellation for it for waiting for it to complete.
+    channel.sendRequest(
+      Request(
+        'my23',
+        'server.cancelRequest',
+        {'id': 'my22'},
+      ),
+    );
+    var response = await responseFuture;
+    expect(response.id, equals('my22'));
+    expect(response.error, isNull);
+    expect(response.result!['cancelled'], isTrue);
+  }
+
+  Future test_slowEcho_notCancelled() {
+    server.handlers = [EchoHandler(server)];
+    var request = Request('my22', 'slowEcho');
+    return channel.sendRequest(request).then((Response response) {
+      expect(response.id, equals('my22'));
+      expect(response.error, isNull);
+      expect(response.result!['cancelled'], isFalse);
+    });
+  }
+
   Future test_unknownRequest() {
-    server.handlers = [EchoHandler()];
+    server.handlers = [EchoHandler(server)];
     var request = Request('my22', 'randomRequest');
     return channel.sendRequest(request).then((Response response) {
       expect(response.id, equals('my22'));
@@ -226,11 +258,29 @@
 }
 
 class EchoHandler implements RequestHandler {
+  final AnalysisServer server;
+
+  EchoHandler(this.server);
+
   @override
-  Response? handleRequest(Request request) {
+  Response? handleRequest(
+      Request request, CancellationToken cancellationToken) {
     if (request.method == 'echo') {
       return Response(request.id, result: {'echo': true});
+    } else if (request.method == 'slowEcho') {
+      _slowEcho(request, cancellationToken);
+      return Response.DELAYED_RESPONSE;
     }
     return null;
   }
+
+  void _slowEcho(Request request, CancellationToken cancellationToken) async {
+    for (var i = 0; i < 100; i++) {
+      if (cancellationToken.isCancellationRequested) {
+        server.sendResponse(Response(request.id, result: {'cancelled': true}));
+      }
+      await Future.delayed(const Duration(milliseconds: 10));
+    }
+    server.sendResponse(Response(request.id, result: {'cancelled': false}));
+  }
 }
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 87a822e..30e5da63 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -61,7 +61,7 @@
     [path.join('benchmark', 'benchmarks.dart'), 'list', '--machine'],
     workingDirectory: _serverSourcePath,
   );
-  Map m = json.decode(result.stdout);
-  List benchmarks = m['benchmarks'];
+  var output = json.decode(result.stdout as String) as Map<Object?, Object?>;
+  var benchmarks = (output['benchmarks'] as List).cast<Map<Object?, Object?>>();
   return benchmarks.map((b) => b['id']).cast<String>().toList();
 }
diff --git a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
index 0724bfe..d89741d 100644
--- a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
+++ b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
@@ -135,7 +135,7 @@
     errorStream = errorStreamController.stream;
     var doneCompleter = Completer();
     doneFuture = doneCompleter.future;
-    channel.listen((Request request) {
+    channel.requests.listen((Request request) {
       requestStreamController.add(request);
     }, onError: (error) {
       errorStreamController.add(error);
diff --git a/pkg/analysis_server/test/client/impl/abstract_client.dart b/pkg/analysis_server/test/client/impl/abstract_client.dart
index 51bd14d..999451f 100644
--- a/pkg/analysis_server/test/client/impl/abstract_client.dart
+++ b/pkg/analysis_server/test/client/impl/abstract_client.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -132,7 +133,7 @@
   /// Validate that the given [request] is handled successfully.
   Response handleSuccessfulRequest(Request request, {RequestHandler? handler}) {
     handler ??= analysisHandler;
-    var response = handler.handleRequest(request)!;
+    var response = handler.handleRequest(request, NotCancelableToken())!;
     expect(response, isResponseSuccess(request.id));
     return response;
   }
diff --git a/pkg/analysis_server/test/client/impl/expect_mixin.dart b/pkg/analysis_server/test/client/impl/expect_mixin.dart
index 7f75f64..67cdc1c 100644
--- a/pkg/analysis_server/test/client/impl/expect_mixin.dart
+++ b/pkg/analysis_server/test/client/impl/expect_mixin.dart
@@ -30,7 +30,7 @@
     } else if (x is _Predicate<Null>) {
       // x is a unary predicate, but expects a specific type
       // so wrap it.
-      return predicate((a) => (x as dynamic)(a));
+      return predicate((a) => (x as dynamic)(a) as bool);
     } else {
       return equals(x);
     }
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 8ea43c3..fa3b3e4 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
@@ -18,6 +19,8 @@
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
+import 'package:analyzer_plugin/src/protocol/protocol_internal.dart'
+    show HasToJson;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -87,7 +90,7 @@
     var contentChange = ChangeContentOverlay([edit]);
     var request = AnalysisUpdateContentParams({helper.testFile: contentChange})
         .toRequest('0');
-    var response = helper.handler.handleRequest(request);
+    var response = helper.handler.handleRequest(request, NotCancelableToken());
     expect(response,
         isResponseFailure('0', RequestErrorCode.INVALID_OVERLAY_CHANGE));
   }
@@ -154,7 +157,7 @@
     var request = AnalysisSetPriorityFilesParams(
       [convertPath('/project/lib.dart')],
     ).toRequest('0');
-    var response = handler.handleRequest(request);
+    var response = handler.handleRequest(request, NotCancelableToken());
     expect(response, isResponseSuccess('0'));
   }
 
@@ -170,12 +173,13 @@
 
     var setRootsRequest =
         AnalysisSetAnalysisRootsParams([p1, p2], []).toRequest('0');
-    var setRootsResponse = handler.handleRequest(setRootsRequest);
+    var setRootsResponse =
+        handler.handleRequest(setRootsRequest, NotCancelableToken());
     expect(setRootsResponse, isResponseSuccess('0'));
 
     void setPriorityFiles(List<String> fileList) {
       var request = AnalysisSetPriorityFilesParams(fileList).toRequest('0');
-      var response = handler.handleRequest(request);
+      var response = handler.handleRequest(request, NotCancelableToken());
       expect(response, isResponseSuccess('0'));
       // TODO(brianwilkerson) Enable the line below after getPriorityFiles
       // has been implemented.
@@ -198,7 +202,7 @@
         }
       }
     });
-    var response = helper.handler.handleRequest(request);
+    var response = helper.handler.handleRequest(request, NotCancelableToken());
     expect(response, isResponseFailure('0'));
   }
 
@@ -288,7 +292,7 @@
     var request = Request('0', ANALYSIS_REQUEST_UPDATE_OPTIONS, {
       ANALYSIS_REQUEST_UPDATE_OPTIONS_OPTIONS: {'not-an-option': true}
     });
-    var response = handler.handleRequest(request);
+    var response = handler.handleRequest(request, NotCancelableToken());
     // Invalid options should be silently ignored.
     expect(response, isResponseSuccess('0'));
   }
@@ -297,14 +301,14 @@
     // null is allowed as a synonym for {}.
     var request = Request('0', ANALYSIS_REQUEST_UPDATE_OPTIONS,
         {ANALYSIS_REQUEST_UPDATE_OPTIONS_OPTIONS: null});
-    var response = handler.handleRequest(request);
+    var response = handler.handleRequest(request, NotCancelableToken());
     expect(response, isResponseSuccess('0'));
   }
 
   Response testSetAnalysisRoots(List<String> included, List<String> excluded) {
     var request =
         AnalysisSetAnalysisRootsParams(included, excluded).toRequest('0');
-    return handler.handleRequest(request)!;
+    return handler.handleRequest(request, NotCancelableToken())!;
   }
 
   Future<void> xtest_getReachableSources_invalidSource() async {
@@ -317,7 +321,7 @@
 
     var request = AnalysisGetReachableSourcesParams('/does/not/exist.dart')
         .toRequest('0');
-    var response = handler.handleRequest(request)!;
+    var response = handler.handleRequest(request, NotCancelableToken())!;
     var error = response.error!;
     expect(error.code, RequestErrorCode.GET_REACHABLE_SOURCES_INVALID_FILE);
   }
@@ -333,7 +337,7 @@
     await server.onAnalysisComplete;
 
     var request = AnalysisGetReachableSourcesParams(fileA).toRequest('0');
-    var response = handler.handleRequest(request)!;
+    var response = handler.handleRequest(request, NotCancelableToken())!;
 
     var json = response.toJson()[Response.RESULT] as Map<String, dynamic>;
 
@@ -1575,12 +1579,12 @@
 
   /// Validates that the given [request] is handled successfully.
   void handleSuccessfulRequest(Request request) {
-    var response = handler.handleRequest(request);
+    var response = handler.handleRequest(request, NotCancelableToken());
     expect(response, isResponseSuccess('0'));
   }
 
   /// Send an `updateContent` request for [testFile].
-  void sendContentChange(dynamic contentChange) {
+  void sendContentChange(HasToJson contentChange) {
     var request =
         AnalysisUpdateContentParams({testFile: contentChange}).toRequest('0');
     handleSuccessfulRequest(request);
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 2a46330..e3a94a0 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -11,7 +11,6 @@
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
-import 'package:analysis_server/src/services/completion/dart/not_imported_contributor.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/service.dart';
@@ -21,12 +20,15 @@
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
+import 'package:analyzer_utilities/check/check.dart';
+import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'domain_completion_util.dart';
 import 'mocks.dart';
 import 'src/plugin/plugin_manager_test.dart';
+import 'utils/change_check.dart';
 
 void main() {
   defineReflectiveSuite(() {
@@ -42,30 +44,31 @@
   Future<void> test_alreadyImported() async {
     await _configureWithWorkspaceRoot();
 
-    var validator = await _getTestCodeDetails('''
+    var details = await _getTestCodeDetails('''
 import 'dart:math';
 void f() {
   Rand^
 }
 ''', completion: 'Random', libraryUri: 'dart:math');
-    validator
-      ..hasCompletion('Random')
-      ..hasChange().assertNoFileEdits();
+    check(details)
+      ..completion.isEqualTo('Random')
+      ..change.edits.isEmpty;
   }
 
   Future<void> test_import_dart() async {
     await _configureWithWorkspaceRoot();
 
-    var validator = await _getTestCodeDetails('''
+    var details = await _getTestCodeDetails('''
 void f() {
   R^
 }
 ''', completion: 'Random', libraryUri: 'dart:math');
-    validator
-      ..hasCompletion('Random')
-      ..hasChange()
+    check(details)
+      ..completion.isEqualTo('Random')
+      ..change
           .hasFileEdit(testFilePathPlatform)
-          .whenApplied(testFileContent, r'''
+          .appliedTo(testFileContent)
+          .isEqualTo(r'''
 import 'dart:math';
 
 void f() {
@@ -75,8 +78,7 @@
   }
 
   Future<void> test_import_package_dependencies() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 dependencies:
   aaa: any
@@ -94,16 +96,17 @@
 
     await _configureWithWorkspaceRoot();
 
-    var validator = await _getTestCodeDetails('''
+    var details = await _getTestCodeDetails('''
 void f() {
   T^
 }
 ''', completion: 'Test', libraryUri: 'package:aaa/a.dart');
-    validator
-      ..hasCompletion('Test')
-      ..hasChange()
+    check(details)
+      ..completion.isEqualTo('Test')
+      ..change
           .hasFileEdit(testFilePathPlatform)
-          .whenApplied(testFileContent, r'''
+          .appliedTo(testFileContent)
+          .isEqualTo(r'''
 import 'package:aaa/a.dart';
 
 void f() {
@@ -119,16 +122,17 @@
 
     await _configureWithWorkspaceRoot();
 
-    var validator = await _getTestCodeDetails('''
+    var details = await _getTestCodeDetails('''
 void f() {
   T^
 }
 ''', completion: 'Test', libraryUri: 'package:test/a.dart');
-    validator
-      ..hasCompletion('Test')
-      ..hasChange()
+    check(details)
+      ..completion.isEqualTo('Test')
+      ..change
           .hasFileEdit(testFilePathPlatform)
-          .whenApplied(testFileContent, r'''
+          .appliedTo(testFileContent)
+          .isEqualTo(r'''
 import 'package:test/a.dart';
 
 void f() {
@@ -160,7 +164,7 @@
     expect(response.error?.code, RequestErrorCode.INVALID_FILE_PATH_FORMAT);
   }
 
-  Future<GetSuggestionDetails2Validator> _getCodeDetails({
+  Future<CompletionGetSuggestionDetails2Result> _getCodeDetails({
     required String path,
     required String content,
     required String completion,
@@ -184,7 +188,7 @@
     );
   }
 
-  Future<GetSuggestionDetails2Validator> _getDetails({
+  Future<CompletionGetSuggestionDetails2Result> _getDetails({
     required String path,
     required int completionOffset,
     required String completion,
@@ -198,11 +202,10 @@
     ).toRequest('0');
 
     var response = await _handleSuccessfulRequest(request);
-    var result = CompletionGetSuggestionDetails2Result.fromResponse(response);
-    return GetSuggestionDetails2Validator(result);
+    return CompletionGetSuggestionDetails2Result.fromResponse(response);
   }
 
-  Future<GetSuggestionDetails2Validator> _getTestCodeDetails(
+  Future<CompletionGetSuggestionDetails2Result> _getTestCodeDetails(
     String content, {
     required String completion,
     required String libraryUri,
@@ -225,24 +228,75 @@
     completionDomain.budgetDuration = const Duration(seconds: 30);
   }
 
-  void tearDown() {
-    NotImportedContributor.onFile = null;
-  }
+  Future<void> test_abort_onAnotherCompletionRequest() async {
+    var abortedIdSet = <String>{};
+    server.discardedRequests.stream.listen((request) {
+      abortedIdSet.add(request.id);
+    });
 
-  Future<void> test_notImported_abort() async {
+    newFile(testFilePath, content: '');
+
     await _configureWithWorkspaceRoot();
 
-    NotImportedContributor.onFile = (file) {
-      if (file.uriStr == 'dart:math') {
-        unawaited(
-          _getSuggestions(
-            path: convertPath(testFilePath),
-            completionOffset: 0,
-            maxResults: 100,
-          ),
-        );
-      }
-    };
+    // Send three requests, the first two should be aborted.
+    var response0 = _sendTestCompletionRequest('0', 0);
+    var response1 = _sendTestCompletionRequest('1', 0);
+    var response2 = _sendTestCompletionRequest('2', 0);
+
+    // Wait for all three.
+    var validator0 = await response0.toResult();
+    var validator1 = await response1.toResult();
+    var validator2 = await response2.toResult();
+
+    // The first two should be aborted.
+    expect(abortedIdSet, {'0', '1'});
+
+    validator0
+      ..assertIncomplete()
+      ..suggestions.assertEmpty();
+
+    validator1
+      ..assertIncomplete()
+      ..suggestions.assertEmpty();
+
+    validator2
+      ..assertComplete()
+      ..suggestions.assertCompletionsContainsAll(
+        ['int', 'double', 'Future', 'Directory'],
+      );
+  }
+
+  Future<void> test_abort_onUpdateContent() async {
+    var abortedIdSet = <String>{};
+    server.discardedRequests.stream.listen((request) {
+      abortedIdSet.add(request.id);
+    });
+
+    newFile(testFilePath, content: '');
+
+    await _configureWithWorkspaceRoot();
+
+    // Schedule a completion request.
+    var response = _sendTestCompletionRequest('0', 0);
+
+    // Simulate typing in the IDE.
+    await _handleSuccessfulRequest(
+      AnalysisUpdateContentParams({
+        testFilePathPlatform: AddContentOverlay('void f() {}'),
+      }).toRequest('1'),
+    );
+
+    // The request should be aborted.
+    var validator = await response.toResult();
+    expect(abortedIdSet, {'0'});
+
+    validator
+      ..assertIncomplete()
+      ..suggestions.assertEmpty();
+  }
+
+  Future<void> test_notImported_dart() async {
+    await _configureWithWorkspaceRoot();
 
     var responseValidator = await _getTestCodeSuggestions('''
 void f() {
@@ -251,14 +305,21 @@
 ''');
 
     responseValidator
-      ..assertIncomplete()
+      ..assertComplete()
       ..assertReplacementBack(4)
-      ..assertLibrariesToImport(includes: [], excludes: [
-        'dart:core',
+      ..assertLibrariesToImport(includes: [
         'dart:math',
+      ], excludes: [
+        'dart:async',
+        'dart:core',
+        'package:test/test.dart',
       ]);
 
-    responseValidator.suggestions.assertEmpty();
+    var classes = responseValidator.suggestions.withElementClass();
+    classes.assertCompletions(['Random']);
+    classes.withCompletion('Random').assertSingle()
+      ..assertClass()
+      ..assertLibraryToImport('dart:math');
   }
 
   Future<void> test_notImported_emptyBudget() async {
@@ -285,8 +346,7 @@
   }
 
   Future<void> test_notImported_pub_dependencies_inLib() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 dependencies:
   aaa: any
@@ -343,8 +403,7 @@
   }
 
   Future<void> test_notImported_pub_dependencies_inTest() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 dependencies:
   aaa: any
@@ -407,8 +466,6 @@
       ..assertLibraryToImport('package:bbb/f.dart');
   }
 
-  /// TODO(scheglov) Only lib/ libraries in lib/, no test/.
-  /// TODO(scheglov) Suggestions from available Pub packages.
   Future<void> test_notImported_pub_this() async {
     newFile('$testPackageLibPath/a.dart', content: '''
 class A01 {}
@@ -430,12 +487,12 @@
       ..assertComplete()
       ..assertReplacementBack(2)
       ..assertLibrariesToImport(includes: [
-        'dart:async',
-        'dart:math',
         'package:test/a.dart',
         'package:test/b.dart',
       ], excludes: [
+        'dart:async',
         'dart:core',
+        'dart:math',
         'package:test/test.dart',
       ]);
 
@@ -473,11 +530,11 @@
       ..assertComplete()
       ..assertReplacementBack(2)
       ..assertLibrariesToImport(includes: [
-        'dart:async',
-        'dart:math',
         'package:test/b.dart',
       ], excludes: [
+        'dart:async',
         'dart:core',
+        'dart:math',
         'package:test/a.dart',
         'package:test/test.dart',
       ]);
@@ -519,12 +576,12 @@
       ..assertComplete()
       ..assertReplacementBack(2)
       ..assertLibrariesToImport(includes: [
-        'dart:async',
-        'dart:math',
         'package:test/a.dart',
         'package:test/b.dart',
       ], excludes: [
+        'dart:async',
         'dart:core',
+        'dart:math',
         'package:test/test.dart',
       ]);
 
@@ -542,8 +599,7 @@
   }
 
   Future<void> test_notImported_pub_this_inLib_excludesTest() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 ''');
 
@@ -582,8 +638,7 @@
   }
 
   Future<void> test_notImported_pub_this_inLib_includesThisSrc() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 ''');
 
@@ -625,8 +680,7 @@
   }
 
   Future<void> test_notImported_pub_this_inTest_includesTest() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 ''');
 
@@ -673,8 +727,7 @@
   }
 
   Future<void> test_notImported_pub_this_inTest_includesThisSrc() async {
-    // TODO(scheglov) Switch to PubspecYamlFileConfig
-    newPubspecYamlFile(testPackageRootPath, r'''
+    writeTestPackagePubspecYamlFile(r'''
 name: test
 ''');
 
@@ -1398,6 +1451,71 @@
     suggestionsValidator.assertCompletions(['foo02', 'foo01']);
   }
 
+  Future<void> test_yaml_analysisOptions_root() async {
+    await _configureWithWorkspaceRoot();
+
+    var path = convertPath('$testPackageRootPath/analysis_options.yaml');
+    var responseValidator = await _getCodeSuggestions(
+      path: path,
+      content: '^',
+    );
+
+    responseValidator
+      ..assertComplete()
+      ..assertEmptyReplacement();
+
+    responseValidator.suggestions
+        .withKindIdentifier()
+        .assertCompletionsContainsAll([
+      'analyzer: ',
+      'include: ',
+      'linter: ',
+    ]);
+  }
+
+  Future<void> test_yaml_fixData_root() async {
+    await _configureWithWorkspaceRoot();
+
+    var path = convertPath('$testPackageRootPath/fix_data.yaml');
+    var responseValidator = await _getCodeSuggestions(
+      path: path,
+      content: '^',
+    );
+
+    responseValidator
+      ..assertComplete()
+      ..assertEmptyReplacement();
+
+    responseValidator.suggestions
+        .withKindIdentifier()
+        .assertCompletionsContainsAll([
+      'version: ',
+      'transforms:',
+    ]);
+  }
+
+  Future<void> test_yaml_pubspec_root() async {
+    await _configureWithWorkspaceRoot();
+
+    var path = convertPath('$testPackageRootPath/pubspec.yaml');
+    var responseValidator = await _getCodeSuggestions(
+      path: path,
+      content: '^',
+    );
+
+    responseValidator
+      ..assertComplete()
+      ..assertEmptyReplacement();
+
+    responseValidator.suggestions
+        .withKindIdentifier()
+        .assertCompletionsContainsAll([
+      'name: ',
+      'dependencies: ',
+      'dev_dependencies: ',
+    ]);
+  }
+
   Future<CompletionGetSuggestions2ResponseValidator> _getCodeSuggestions({
     required String path,
     required String content,
@@ -1446,6 +1564,16 @@
       maxResults: maxResults,
     );
   }
+
+  RequestWithFutureResponse _sendTestCompletionRequest(String id, int offset) {
+    var request = CompletionGetSuggestions2Params(
+      testFilePathPlatform,
+      0,
+      1 << 10,
+    ).toRequest(id);
+    var futureResponse = _handleRequest(request);
+    return RequestWithFutureResponse(offset, request, futureResponse);
+  }
 }
 
 @reflectiveTest
@@ -2387,20 +2515,6 @@
   }
 }
 
-class GetSuggestionDetails2Validator {
-  final CompletionGetSuggestionDetails2Result result;
-
-  GetSuggestionDetails2Validator(this.result);
-
-  SourceChangeValidator hasChange() {
-    return SourceChangeValidator(result.change);
-  }
-
-  void hasCompletion(Object completion) {
-    expect(result.completion, completion);
-  }
-}
-
 class PubPackageAnalysisServerTest with ResourceProviderMixin {
   late final MockServerChannel serverChannel;
   late final AnalysisServer server;
@@ -2493,6 +2607,10 @@
     writePackageConfig(testPackageRoot, config);
   }
 
+  void writeTestPackagePubspecYamlFile(String content) {
+    newPubspecYamlFile(testPackageRootPath, content);
+  }
+
   Future<void> _configureWithWorkspaceRoot() async {
     await setRoots(included: [workspaceRootPath], excluded: []);
     await server.onAnalysisComplete;
@@ -2510,6 +2628,21 @@
   }
 }
 
+class RequestWithFutureResponse {
+  final int offset;
+  final Request request;
+  final Future<Response> futureResponse;
+
+  RequestWithFutureResponse(this.offset, this.request, this.futureResponse);
+
+  Future<CompletionGetSuggestions2ResponseValidator> toResult() async {
+    var response = await futureResponse;
+    expect(response, isResponseSuccess(request.id));
+    var result = CompletionGetSuggestions2Result.fromResponse(response);
+    return CompletionGetSuggestions2ResponseValidator(offset, result);
+  }
+}
+
 class SingleSuggestionValidator {
   final CompletionSuggestion suggestion;
   final List<String>? libraryUrisToImport;
@@ -2559,32 +2692,6 @@
   }
 }
 
-class SourceChangeValidator {
-  final SourceChange change;
-
-  SourceChangeValidator(this.change);
-
-  void assertNoFileEdits() {
-    expect(change.edits, isEmpty);
-  }
-
-  SourceFileEditValidator hasFileEdit(String path) {
-    var edit = change.edits.singleWhere((e) => e.file == path);
-    return SourceFileEditValidator(edit);
-  }
-}
-
-class SourceFileEditValidator {
-  final SourceFileEdit edit;
-
-  SourceFileEditValidator(this.edit);
-
-  void whenApplied(String applyTo, Object expected) {
-    var actual = SourceEdit.applySequence(applyTo, edit.edits);
-    expect(actual, expected);
-  }
-}
-
 class SuggestionsValidator {
   final List<CompletionSuggestion> suggestions;
   final List<String>? libraryUrisToImport;
@@ -2605,8 +2712,17 @@
     expect(actual, completions);
   }
 
+  /// Assert that this has suggestions with all [expected] completions.
+  /// There might be more suggestions, with other completions.
+  ///
+  /// Does not check the order, kinds, elements, etc.
+  void assertCompletionsContainsAll(Iterable<String> expected) {
+    var actual = suggestions.map((e) => e.completion).toSet();
+    expect(actual, containsAll(expected));
+  }
+
   void assertEmpty() {
-    expect(suggestions, isEmpty);
+    check(suggestions).isEmpty;
   }
 
   void assertLength(Object matcher) {
@@ -2650,4 +2766,35 @@
       libraryUrisToImport: libraryUrisToImport,
     );
   }
+
+  SuggestionsValidator withKind(CompletionSuggestionKind kind) {
+    return SuggestionsValidator(
+      suggestions.where((suggestion) {
+        return suggestion.kind == kind;
+      }).toList(),
+      libraryUrisToImport: libraryUrisToImport,
+    );
+  }
+
+  SuggestionsValidator withKindIdentifier() {
+    return withKind(CompletionSuggestionKind.IDENTIFIER);
+  }
+}
+
+extension on CheckTarget<CompletionGetSuggestionDetails2Result> {
+  @useResult
+  CheckTarget<SourceChange> get change {
+    return nest(
+      value.change,
+      (selected) => 'has change ${valueStr(selected)}',
+    );
+  }
+
+  @useResult
+  CheckTarget<String> get completion {
+    return nest(
+      value.completion,
+      (selected) => 'has completion ${valueStr(selected)}',
+    );
+  }
 }
diff --git a/pkg/analysis_server/test/domain_diagnostic_test.dart b/pkg/analysis_server/test/domain_diagnostic_test.dart
index f83771a..92ab990 100644
--- a/pkg/analysis_server/test/domain_diagnostic_test.dart
+++ b/pkg/analysis_server/test/domain_diagnostic_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/domain_diagnostic.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -33,7 +34,7 @@
     await server.onAnalysisComplete;
 
     var request = DiagnosticGetDiagnosticsParams().toRequest('0');
-    var response = handler.handleRequest(request)!;
+    var response = handler.handleRequest(request, NotCancelableToken())!;
     var result = DiagnosticGetDiagnosticsResult.fromResponse(response);
 
     expect(result.contexts, hasLength(1));
@@ -49,7 +50,7 @@
 
   Future<void> test_getDiagnostics_noRoot() async {
     var request = DiagnosticGetDiagnosticsParams().toRequest('0');
-    var response = handler.handleRequest(request)!;
+    var response = handler.handleRequest(request, NotCancelableToken())!;
     var result = DiagnosticGetDiagnosticsResult.fromResponse(response);
     expect(result.contexts, isEmpty);
   }
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index 107cab5..7095b0c 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -40,13 +41,13 @@
     group('createContext/deleteContext', () {
       test('create/delete multiple contexts', () {
         var request = ExecutionCreateContextParams('/a/b.dart').toRequest('0');
-        var response = handler.handleRequest(request)!;
+        var response = handler.handleRequest(request, NotCancelableToken())!;
         expect(response, isResponseSuccess('0'));
         var result = ExecutionCreateContextResult.fromResponse(response);
         var id0 = result.id;
 
         request = ExecutionCreateContextParams('/c/d.dart').toRequest('1');
-        response = handler.handleRequest(request)!;
+        response = handler.handleRequest(request, NotCancelableToken())!;
         expect(response, isResponseSuccess('1'));
         result = ExecutionCreateContextResult.fromResponse(response);
         var id1 = result.id;
@@ -54,17 +55,17 @@
         expect(id0 == id1, isFalse);
 
         request = ExecutionDeleteContextParams(id0).toRequest('2');
-        response = handler.handleRequest(request)!;
+        response = handler.handleRequest(request, NotCancelableToken())!;
         expect(response, isResponseSuccess('2'));
 
         request = ExecutionDeleteContextParams(id1).toRequest('3');
-        response = handler.handleRequest(request)!;
+        response = handler.handleRequest(request, NotCancelableToken())!;
         expect(response, isResponseSuccess('3'));
       });
 
       test('delete non-existent context', () {
         var request = ExecutionDeleteContextParams('13').toRequest('0');
-        var response = handler.handleRequest(request);
+        var response = handler.handleRequest(request, NotCancelableToken());
         // TODO(brianwilkerson) It isn't currently specified to be an error if a
         // client attempts to delete a context that doesn't exist. Should it be?
 //        expect(response, isResponseFailure('0'));
@@ -79,7 +80,7 @@
 //
 //      void createExecutionContextIdForFile(String path) {
 //        Request request = new ExecutionCreateContextParams(path).toRequest('0');
-//        Response response = handler.handleRequest(request);
+//        Response response = handler.handleRequest(request, NotCancelableToken());
 //        expect(response, isResponseSuccess('0'));
 //        ExecutionCreateContextResult result =
 //            new ExecutionCreateContextResult.fromResponse(response);
@@ -102,7 +103,7 @@
 //      tearDown(() {
 //        Request request =
 //            new ExecutionDeleteContextParams(contextId).toRequest('1');
-//        Response response = handler.handleRequest(request);
+//        Response response = handler.handleRequest(request, NotCancelableToken());
 //        expect(response, isResponseSuccess('1'));
 //      });
 //
@@ -111,7 +112,7 @@
 //          Request request =
 //              new ExecutionMapUriParams(contextId, file: '/a/c.dart')
 //                  .toRequest('2');
-//          Response response = handler.handleRequest(request);
+//          Response response = handler.handleRequest(request, NotCancelableToken());
 //          expect(response, isResponseFailure('2'));
 //        });
 //
@@ -119,7 +120,7 @@
 //          provider.newFolder('/a/d');
 //          Request request =
 //              new ExecutionMapUriParams(contextId, file: '/a/d').toRequest('2');
-//          Response response = handler.handleRequest(request);
+//          Response response = handler.handleRequest(request, NotCancelableToken());
 //          expect(response, isResponseFailure('2'));
 //        });
 //      });
@@ -129,7 +130,7 @@
 //          Request request =
 //              new ExecutionMapUriParams(contextId, uri: 'foo:///a/b.dart')
 //                  .toRequest('2');
-//          Response response = handler.handleRequest(request);
+//          Response response = handler.handleRequest(request, NotCancelableToken());
 //          expect(response, isResponseFailure('2'));
 //        });
 //      });
@@ -137,20 +138,20 @@
 //      test('invalid context id', () {
 //        Request request =
 //            new ExecutionMapUriParams('xxx', uri: '').toRequest('4');
-//        Response response = handler.handleRequest(request);
+//        Response response = handler.handleRequest(request, NotCancelableToken());
 //        expect(response, isResponseFailure('4'));
 //      });
 //
 //      test('both file and uri', () {
 //        Request request =
 //            new ExecutionMapUriParams('xxx', file: '', uri: '').toRequest('5');
-//        Response response = handler.handleRequest(request);
+//        Response response = handler.handleRequest(request, NotCancelableToken());
 //        expect(response, isResponseFailure('5'));
 //      });
 //
 //      test('neither file nor uri', () {
 //        Request request = new ExecutionMapUriParams('xxx').toRequest('6');
-//        Response response = handler.handleRequest(request);
+//        Response response = handler.handleRequest(request, NotCancelableToken());
 //        expect(response, isResponseFailure('6'));
 //      });
 //    });
@@ -237,7 +238,7 @@
 
   void _createExecutionContext(String path) {
     var request = ExecutionCreateContextParams(path).toRequest('0');
-    var response = handler.handleRequest(request)!;
+    var response = handler.handleRequest(request, NotCancelableToken())!;
     expect(response, isResponseSuccess('0'));
     var result = ExecutionCreateContextResult.fromResponse(response);
     contextId = result.id;
@@ -245,14 +246,14 @@
 
   void _disposeExecutionContext() {
     var request = ExecutionDeleteContextParams(contextId).toRequest('1');
-    var response = handler.handleRequest(request);
+    var response = handler.handleRequest(request, NotCancelableToken());
     expect(response, isResponseSuccess('1'));
   }
 
   ExecutionMapUriResult _mapUri({String? file, String? uri}) {
     var request =
         ExecutionMapUriParams(contextId, file: file, uri: uri).toRequest('2');
-    var response = handler.handleRequest(request)!;
+    var response = handler.handleRequest(request, NotCancelableToken())!;
     expect(response, isResponseSuccess('2'));
     return ExecutionMapUriResult.fromResponse(response);
   }
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 2202712..b7bfaa8 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -38,7 +39,7 @@
   group('ServerDomainHandler', () {
     test('getVersion', () {
       var request = ServerGetVersionParams().toRequest('0');
-      var response = handler.handleRequest(request)!;
+      var response = handler.handleRequest(request, NotCancelableToken())!;
       expect(
           response.toJson(),
           equals({
@@ -52,7 +53,7 @@
         var request = Request('0', SERVER_REQUEST_SET_SUBSCRIPTIONS, {
           SUBSCRIPTIONS: ['noSuchService']
         });
-        var response = handler.handleRequest(request);
+        var response = handler.handleRequest(request, NotCancelableToken());
         expect(response, isResponseFailure('0'));
       });
 
@@ -61,7 +62,7 @@
         // send request
         var request =
             ServerSetSubscriptionsParams([ServerService.STATUS]).toRequest('0');
-        var response = handler.handleRequest(request);
+        var response = handler.handleRequest(request, NotCancelableToken());
         expect(response, isResponseSuccess('0'));
         // set of services has been changed
         expect(server.serverServices, contains(ServerService.STATUS));
diff --git a/pkg/analysis_server/test/edit/format_test.dart b/pkg/analysis_server/test/edit/format_test.dart
index 1990b31..e5576f7 100644
--- a/pkg/analysis_server/test/edit/format_test.dart
+++ b/pkg/analysis_server/test/edit/format_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/edit/edit_domain.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -104,7 +105,7 @@
 ''');
     return waitForTasksFinished().then((_) {
       var request = EditFormatParams(testFile, 0, 3).toRequest('0');
-      var response = handler.handleRequest(request);
+      var response = handler.handleRequest(request, NotCancelableToken());
       expect(response, isResponseFailure('0'));
     });
   }
diff --git a/pkg/analysis_server/test/edit/postfix_completion_test.dart b/pkg/analysis_server/test/edit/postfix_completion_test.dart
index e58ee6c..86085b1 100644
--- a/pkg/analysis_server/test/edit/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/edit/postfix_completion_test.dart
@@ -67,21 +67,12 @@
     );
   }
 
-  void _assertHasChange(String message, String expectedCode, [Function? cmp]) {
+  void _assertHasChange(String message, String expectedCode) {
     if (change.message == message) {
       if (change.edits.isNotEmpty) {
         var resultCode =
             SourceEdit.applySequence(testCode, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
-        if (cmp != null) {
-          int offset = cmp(resultCode);
-          expect(change.selection!.offset, offset);
-        }
-      } else {
-        if (cmp != null) {
-          int offset = cmp(testCode);
-          expect(change.selection!.offset, offset);
-        }
       }
       return;
     }
diff --git a/pkg/analysis_server/test/edit/statement_completion_test.dart b/pkg/analysis_server/test/edit/statement_completion_test.dart
index 09e11a7..a692a0f 100644
--- a/pkg/analysis_server/test/edit/statement_completion_test.dart
+++ b/pkg/analysis_server/test/edit/statement_completion_test.dart
@@ -101,19 +101,20 @@
         (s) => s.indexOf(match) + match.length); // Ensure cursor after '='.
   }
 
-  void _assertHasChange(String message, String expectedCode, [Function? cmp]) {
+  void _assertHasChange(String message, String expectedCode,
+      [int Function(String)? cmp]) {
     if (change.message == message) {
       if (change.edits.isNotEmpty) {
         var resultCode =
             SourceEdit.applySequence(testCode, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
         if (cmp != null) {
-          int offset = cmp(resultCode);
+          var offset = cmp(resultCode);
           expect(change.selection!.offset, offset);
         }
       } else {
         if (cmp != null) {
-          int offset = cmp(testCode);
+          var offset = cmp(testCode);
           expect(change.selection!.offset, offset);
         }
       }
diff --git a/pkg/analysis_server/test/integration/coverage.md b/pkg/analysis_server/test/integration/coverage.md
index b91da0a..9cd7a76 100644
--- a/pkg/analysis_server/test/integration/coverage.md
+++ b/pkg/analysis_server/test/integration/coverage.md
@@ -84,6 +84,7 @@
 - [ ] server.error
 - [ ] server.log
 - [x] server.status
+- [ ] server.cancelRequest
 
 ## analytics domain
 - [x] analytics.isEnabled
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index 9a707cf..b8704aa 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -64,6 +64,26 @@
     return null;
   }
 
+  /// Requests cancellation of a request sent by the client by id. This is
+  /// provided on a best-effort basis and there is no guarantee the server will
+  /// be able to cancel any specific request. The server will still always
+  /// produce a response to the request even in the case of cancellation, but
+  /// clients should discard any results of any cancelled request because they
+  /// may be incomplete or inaccurate. This request always completes without
+  /// error regardless of whether the request is successfully cancelled.
+  ///
+  /// Parameters
+  ///
+  /// id: String
+  ///
+  ///   The id of the request that should be cancelled.
+  Future sendServerCancelRequest(String id) async {
+    var params = ServerCancelRequestParams(id).toJson();
+    var result = await server.send('server.cancelRequest', params);
+    outOfTestExpect(result, isNull);
+    return null;
+  }
+
   /// Reports that the server is running. This notification is issued once
   /// after the server has started running but before any requests are
   /// processed to let the client know that it started correctly.
@@ -1020,9 +1040,11 @@
   ///   True if the number of suggestions after filtering was greater than the
   ///   requested maxResults.
   Future<CompletionGetSuggestions2Result> sendCompletionGetSuggestions2(
-      String file, int offset, int maxResults) async {
-    var params =
-        CompletionGetSuggestions2Params(file, offset, maxResults).toJson();
+      String file, int offset, int maxResults,
+      {int? timeout}) async {
+    var params = CompletionGetSuggestions2Params(file, offset, maxResults,
+            timeout: timeout)
+        .toJson();
     var result = await server.send('completion.getSuggestions2', params);
     var decoder = ResponseDecoder(null);
     return CompletionGetSuggestions2Result.fromJson(decoder, 'result', result);
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index 6ca048e..3ef73c2 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -41,7 +41,7 @@
 Matcher isOneOf(List<Matcher> choiceMatchers) => _OneOf(choiceMatchers);
 
 /// Assert that [actual] matches [matcher].
-void outOfTestExpect(actual, Matcher matcher,
+void outOfTestExpect(Object? actual, Matcher matcher,
     {String? reason, skip, bool verbose = false}) {
   var matchState = {};
   try {
@@ -377,8 +377,8 @@
       description.add(this.description);
 
   @override
-  void populateMismatches(item, List<MismatchDescriber> mismatches) {
-    if (item is! Map) {
+  void populateMismatches(Object? item, List<MismatchDescriber> mismatches) {
+    if (item is! Map<String, Object?>) {
       mismatches.add(simpleDescription('is not a map'));
       return;
     }
@@ -535,7 +535,7 @@
       _recordStdio('<== $trimmedLine');
       Map message;
       try {
-        message = json.decoder.convert(trimmedLine);
+        message = json.decoder.convert(trimmedLine) as Map<Object?, Object?>;
       } catch (exception) {
         _badDataFromServer('JSON decode failure: $exception');
         return;
@@ -543,7 +543,7 @@
       outOfTestExpect(message, isMap);
       if (message.containsKey('id')) {
         outOfTestExpect(message['id'], isString);
-        String id = message['id'];
+        var id = message['id'] as String;
         var completer = _pendingCommands[id];
         if (completer == null) {
           fail('Unexpected response from server: id=$id');
@@ -553,7 +553,7 @@
         if (message.containsKey('error')) {
           completer.completeError(ServerErrorMessage(message));
         } else {
-          completer.complete(message['result']);
+          completer.complete(message['result'] as Map<String, Object?>?);
         }
         // Check that the message is well-formed.  We do this after calling
         // completer.complete() or completer.completeError() so that we don't
@@ -564,7 +564,8 @@
         // params.
         outOfTestExpect(message, contains('event'));
         outOfTestExpect(message['event'], isString);
-        notificationProcessor(message['event'], message['params']);
+        notificationProcessor(message['event'] as String,
+            message['params'] as Map<Object?, Object?>);
         // Check that the message is well-formed.  We do this after calling
         // notificationController.add() so that we don't stall the test in the
         // event of an error.
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 5fd8c3c..a7e358db 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -2139,7 +2139,8 @@
 /// }
 final Matcher isCompletionGetSuggestions2Params = LazyMatcher(() =>
     MatchesJsonObject('completion.getSuggestions2 params',
-        {'file': isFilePath, 'offset': isInt, 'maxResults': isInt}));
+        {'file': isFilePath, 'offset': isInt, 'maxResults': isInt},
+        optionalFields: {'timeout': isInt}));
 
 /// completion.getSuggestions2 result
 ///
@@ -3013,6 +3014,17 @@
     'search.results params',
     {'id': isSearchId, 'results': isListOf(isSearchResult), 'isLast': isBool}));
 
+/// server.cancelRequest params
+///
+/// {
+///   "id": String
+/// }
+final Matcher isServerCancelRequestParams = LazyMatcher(
+    () => MatchesJsonObject('server.cancelRequest params', {'id': isString}));
+
+/// server.cancelRequest result
+final Matcher isServerCancelRequestResult = isNull;
+
 /// server.connected params
 ///
 /// {
diff --git a/pkg/analysis_server/test/lsp/code_actions_assists_test.dart b/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
index 2797109..cf67637f 100644
--- a/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
@@ -393,6 +393,39 @@
     }
   }
 
+  Future<void> test_sort() async {
+    const content = '''
+    import 'package:flutter/widgets.dart';
+
+    build() => Contai^ner(child: Container());
+    ''';
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.Refactor]),
+      workspaceCapabilities:
+          withDocumentChangesSupport(emptyWorkspaceClientCapabilities),
+    );
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        position: positionFromMarker(content));
+    final names = codeActions.map(
+      (e) => e.map((command) => command.title, (action) => action.title),
+    );
+
+    expect(
+      names,
+      containsAllInOrder([
+        // Check the ordering for two well-known assists that should always be
+        // sorted this way.
+        // https://github.com/Dart-Code/Dart-Code/issues/3646
+        'Wrap with widget...',
+        'Remove this widget',
+      ]),
+    );
+  }
+
   List<TextDocumentEdit> _extractTextDocumentEdits(
           Either2<
                   List<TextDocumentEdit>,
@@ -424,5 +457,5 @@
   _RawParams(this._json);
 
   @override
-  Object toJson() => jsonDecode(_json);
+  Object toJson() => jsonDecode(_json) as Object;
 }
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 9ccf020..cbacc55 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -4,9 +4,11 @@
 
 import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
 import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 import 'package:collection/collection.dart';
+import 'package:linter/src/rules.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -234,6 +236,21 @@
         insertText: 'myFunction',
       );
 
+  Future<void> test_completeFunctionCalls_existingArgList_member_noPrefix() =>
+      // https://github.com/Dart-Code/Dart-Code/issues/3672
+      checkCompleteFunctionCallInsertText(
+        '''
+        class Aaaaa {
+          static foo(int a) {}
+        }
+        void f() {
+          Aaaaa.[[^]]()
+        }
+        ''',
+        'foo(…)',
+        insertText: 'foo',
+      );
+
   Future<void> test_completeFunctionCalls_existingArgList_namedConstructor() =>
       checkCompleteFunctionCallInsertText(
         '''
@@ -1606,6 +1623,36 @@
     expect(resolved.detail, isNull);
   }
 
+  Future<void> test_suggestionSets_importsPackageUri() async {
+    newFile(
+      join(projectFolderPath, 'lib', 'my_class.dart'),
+      content: 'class MyClass {}',
+    );
+
+    final content = '''
+void f() {
+  MyClas^
+}
+    ''';
+
+    final expectedContent = '''
+import 'package:test/my_class.dart';
+
+void f() {
+  MyClass
+}
+    ''';
+
+    final completionLabel = 'MyClass';
+
+    await _checkCompletionEdits(
+      mainFileUri,
+      content,
+      completionLabel,
+      expectedContent,
+    );
+  }
+
   Future<void>
       test_suggestionSets_includesReexportedSymbolsForEachFile() async {
     newFile(
@@ -2003,6 +2050,78 @@
     '''));
   }
 
+  Future<void> test_suggestionSets_preferRelativeImportsLib_insideLib() async {
+    _enableLints([LintNames.prefer_relative_imports]);
+    final importingFilePath =
+        join(projectFolderPath, 'lib', 'nested1', 'main.dart');
+    final importingFileUri = Uri.file(importingFilePath);
+    final importedFilePath =
+        join(projectFolderPath, 'lib', 'nested2', 'imported.dart');
+
+    // Create a file that will be auto-imported from completion.
+    newFile(importedFilePath, content: 'class MyClass {}');
+
+    final content = '''
+void f() {
+  MyClas^
+}
+    ''';
+
+    final expectedContent = '''
+import '../nested2/imported.dart';
+
+void f() {
+  MyClass
+}
+    ''';
+
+    final completionLabel = 'MyClass';
+
+    await _checkCompletionEdits(
+      importingFileUri,
+      content,
+      completionLabel,
+      expectedContent,
+    );
+  }
+
+  Future<void> test_suggestionSets_preferRelativeImportsLib_outsideLib() async {
+    // Files outside of the lib folder should still get absolute imports to
+    // files inside lib, even with the lint enabled.
+    _enableLints([LintNames.prefer_relative_imports]);
+    final importingFilePath =
+        join(projectFolderPath, 'bin', 'nested1', 'main.dart');
+    final importingFileUri = Uri.file(importingFilePath);
+    final importedFilePath =
+        join(projectFolderPath, 'lib', 'nested2', 'imported.dart');
+
+    // Create a file that will be auto-imported from completion.
+    newFile(importedFilePath, content: 'class MyClass {}');
+
+    final content = '''
+void f() {
+  MyClas^
+}
+    ''';
+
+    final expectedContent = '''
+import 'package:test/nested2/imported.dart';
+
+void f() {
+  MyClass
+}
+    ''';
+
+    final completionLabel = 'MyClass';
+
+    await _checkCompletionEdits(
+      importingFileUri,
+      content,
+      completionLabel,
+      expectedContent,
+    );
+  }
+
   Future<void> test_suggestionSets_unavailableIfDisabled() async {
     newFile(
       join(projectFolderPath, 'other_file.dart'),
@@ -2085,6 +2204,39 @@
     expect(updated, contains('a.abcdefghij'));
   }
 
+  /// Sets up the server with a file containing [content] and checks that
+  /// accepting a specific completion produces [expectedContent].
+  ///
+  /// [content] should contain a `^` at the location where completion should be
+  /// invoked/accepted.
+  Future<void> _checkCompletionEdits(
+    Uri fileUri,
+    String content,
+    String completionLabel,
+    String expectedContent,
+  ) async {
+    final initialAnalysis = waitForAnalysisComplete();
+    await initialize(
+        workspaceCapabilities:
+            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await openFile(fileUri, withoutMarkers(content));
+    await initialAnalysis;
+    final res = await getCompletion(fileUri, positionFromMarker(content));
+
+    final completion = res.where((c) => c.label == completionLabel).single;
+    final resolvedCompletion = await resolveCompletion(completion);
+
+    // Apply both the main completion edit and the additionalTextEdits atomically.
+    final newContent = applyTextEdits(
+      withoutMarkers(content),
+      [toTextEdit(resolvedCompletion.textEdit!)]
+          .followedBy(resolvedCompletion.additionalTextEdits!)
+          .toList(),
+    );
+
+    expect(newContent, equals(expectedContent));
+  }
+
   Future<void> _checkResultsForTriggerCharacters(String content,
       List<String> triggerCharacters, Matcher expectedResults) async {
     await initialize();
@@ -2099,6 +2251,16 @@
       expect(res, expectedResults);
     }
   }
+
+  void _enableLints(List<String> lintNames) {
+    registerLintRules();
+    final lintsYaml = lintNames.map((name) => '    - $name\n').join();
+    newFile(analysisOptionsPath, content: '''
+linter:
+  rules:
+$lintsYaml
+''');
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
index fc6dffe..3b7fc18 100644
--- a/pkg/analysis_server/test/lsp/diagnostic_test.dart
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -88,7 +88,7 @@
 linter:
   rules:
     - invalid_lint_rule_name
-''').path;
+''');
 
     final firstDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
     await initialize();
@@ -102,7 +102,7 @@
   Future<void> test_analysisOptionsFile_packageInclude() async {
     newFile(analysisOptionsPath, content: '''
 include: package:pedantic/analysis_options.yaml
-''').path;
+''');
 
     // Verify there's an error for the import.
     final firstDiagnosticsUpdate = waitForDiagnostics(analysisOptionsUri);
diff --git a/pkg/analysis_server/test/lsp/document_color_test.dart b/pkg/analysis_server/test/lsp/document_color_test.dart
new file mode 100644
index 0000000..55dbf74
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/document_color_test.dart
@@ -0,0 +1,158 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DocumentColorTest);
+    defineReflectiveTests(DocumentColorPresentationTest);
+  });
+}
+
+@reflectiveTest
+class DocumentColorPresentationTest extends AbstractLspAnalysisServerTest {
+  late Range colorRange, importRange;
+  final uiImportUri = 'package:ui/ui.dart';
+
+  @override
+  void setUp() {
+    super.setUp();
+    writePackageConfig(projectFolderPath, flutter: true);
+  }
+
+  Future<void> test_includesImportEdit() async {
+    // Create a file that doesn't already import the required library.
+    //
+    // We don't need a real color reference in the file right now, as we're
+    // calling colorPresentation directly to get the new code (and not fetching
+    // colors already in the file).
+    const content = '''
+[[]]const white = [[]];
+''';
+
+    final ranges = rangesFromMarkers(content);
+    importRange = ranges[0];
+    colorRange = ranges[1];
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    final colorPresentations = await getColorPresentation(
+      mainFileUri.toString(),
+      colorRange,
+      Color(alpha: 1, red: 1, green: 1, blue: 1),
+    );
+
+    expect(
+      colorPresentations,
+      equals([
+        _color('Color.fromARGB(255, 255, 255, 255)', importUri: uiImportUri),
+        _color('Color.fromRGBO(255, 255, 255, 1)', importUri: uiImportUri),
+        _color('Color(0xFFFFFFFF)', importUri: uiImportUri),
+      ]),
+    );
+  }
+
+  Future<void> test_nonDartFile() async {
+    newFile(pubspecFilePath, content: simplePubspecContent);
+    await initialize();
+
+    final colors = await getColorPresentation(
+      pubspecFileUri.toString(),
+      startOfDocRange,
+      Color(alpha: 1, red: 1, green: 1, blue: 1),
+    );
+    expect(colors, isEmpty);
+  }
+
+  Future<void> test_simpleColor() async {
+    const content = '''
+    import 'package:flutter/material.dart';
+
+    const white = [[Color(0xFFFFFFFF)]];
+    ''';
+    colorRange = rangeFromMarkers(content);
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    final colorPresentations = await getColorPresentation(
+      mainFileUri.toString(),
+      colorRange,
+      // Send a different color to what's in the source to simulate the user
+      // having changed in the color picker. This is the one that we should be
+      // creating a presentation for, not the one in the source.
+      Color(alpha: 1, red: 1, green: 0, blue: 0),
+    );
+
+    expect(
+      colorPresentations,
+      equals([
+        _color('Color.fromARGB(255, 255, 0, 0)'),
+        _color('Color.fromRGBO(255, 0, 0, 1)'),
+        _color('Color(0xFFFF0000)'),
+      ]),
+    );
+  }
+
+  /// Creates a [ColorPresentation] for comparing against actual results.
+  ColorPresentation _color(
+    String label, {
+    String? colorCode,
+    String? importUri,
+  }) {
+    final edit = TextEdit(range: colorRange, newText: colorCode ?? label);
+    final additionalEdits = importUri != null
+        ? [TextEdit(range: importRange, newText: "import '$importUri';\n\n")]
+        : null;
+
+    return ColorPresentation(
+      label: label,
+      textEdit: edit,
+      additionalTextEdits: additionalEdits,
+    );
+  }
+}
+
+@reflectiveTest
+class DocumentColorTest extends AbstractLspAnalysisServerTest {
+  @override
+  void setUp() {
+    super.setUp();
+    writePackageConfig(projectFolderPath, flutter: true);
+  }
+
+  Future<void> test_nonDartFile() async {
+    newFile(pubspecFilePath, content: simplePubspecContent);
+    await initialize();
+
+    final colors = await getDocumentColors(pubspecFileUri.toString());
+    expect(colors, isEmpty);
+  }
+
+  Future<void> test_simpleColor() async {
+    const content = '''
+    import 'package:flutter/material.dart';
+
+    const red = [[Colors.red]];
+    ''';
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    final colors = await getDocumentColors(mainFileUri.toString());
+    expect(colors, hasLength(1));
+
+    final color = colors[0];
+    expect(color.range, rangeFromMarkers(content));
+    expect(color.color.alpha, equals(1));
+    expect(color.color.red, equals(1));
+    expect(color.color.green, equals(0));
+    expect(color.color.blue, equals(0));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/format_test.dart b/pkg/analysis_server/test/lsp/format_test.dart
index 61bac2e..7ffff8a 100644
--- a/pkg/analysis_server/test/lsp/format_test.dart
+++ b/pkg/analysis_server/test/lsp/format_test.dart
@@ -295,6 +295,26 @@
     await expectRangeFormattedContents(mainFileUri, contents, expected);
   }
 
+  Future<void> test_formatRange_trailingNewline_47702() async {
+    // Check we complete when a formatted block ends with a newline.
+    // https://github.com/dart-lang/sdk/issues/47702
+    const contents = '''
+int a;
+[[
+    int b;
+]]
+''';
+    final expected = '''
+int a;
+
+int b;
+
+''';
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(contents));
+    await expectRangeFormattedContents(mainFileUri, contents, expected);
+  }
+
   Future<void> test_invalidSyntax() async {
     const contents = '''void f(((( {
   print('test');
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index b6bbc58..413afeb 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -136,6 +136,94 @@
     );
   }
 
+  Future<void> test_dynamicRegistration_areNotInterleaved() async {
+    // Some of the issues in https://github.com/dart-lang/sdk/issues/47851
+    // (duplicate hovers/code actions/etc.) were caused by duplicate
+    // registrations. This happened when we tried to rebuild registrations
+    // concurrently as the code would:
+    //
+    // 1. compute the new set of registrations
+    // 2. compute which had changed
+    // 3. send _and await_ the unregistration
+    // 4. send _and await_ the new registration
+    //
+    // If the code was triggered multiple times concurrently, it was possible
+    // for step 3 in second request to occur before step 4 in the first, which
+    // would result in unregistrations being sent for registrations that had
+    // not been sent. They would be silently dropped, and then we'd end up with
+    // multiple registrations.
+    //
+    // This test triggers the rebuild via pluginManager.pluginsChangedController
+    // multiple times and ensures the events all arrive in the correct order,
+    // that is, no unregistration ever contains the ID of something that is not
+    // currently registered.
+
+    final registrations = <Registration>[];
+    await monitorDynamicRegistrations(
+      registrations,
+      () => initialize(
+          textDocumentCapabilities:
+              withAllSupportedTextDocumentDynamicRegistrations(
+                  emptyTextDocumentClientCapabilities)),
+    );
+
+    final knownRegistrationsIds =
+        registrations.map((registration) => registration.id).toSet();
+
+    final numberOfReregistrations = 10;
+
+    // Listen to incoming registrations, ensure they're not in the set, and add
+    // them.
+    final registrationsDone = requestsFromServer
+        .where((n) => n.method == Method.client_registerCapability)
+        .take(numberOfReregistrations)
+        .listen((request) {
+      respondTo(request, null);
+      final registrations =
+          RegistrationParams.fromJson(request.params as Map<String, Object?>)
+              .registrations;
+      for (final registration in registrations) {
+        final id = registration.id;
+        if (!knownRegistrationsIds.add(id)) {
+          throw 'Registration $id was already in the existing set!';
+        }
+      }
+    }).asFuture();
+
+    // Listen to incoming unregistrations, verify they're in the set, and remove
+    // them.
+    final unregistrationsDone = requestsFromServer
+        .where((n) => n.method == Method.client_unregisterCapability)
+        .take(numberOfReregistrations)
+        .listen((request) {
+      respondTo(request, null);
+      final unregistrations =
+          UnregistrationParams.fromJson(request.params as Map<String, Object?>)
+              .unregisterations;
+      for (final unregistration in unregistrations) {
+        final id = unregistration.id;
+        if (!knownRegistrationsIds.remove(id)) {
+          throw 'Registration $id was not in the existing set!';
+        }
+      }
+    }).asFuture();
+
+    // Trigger multiple plugin events that will rebuild the registrations.
+    for (var i = 0; i < numberOfReregistrations; i++) {
+      final plugin = configureTestPlugin();
+      plugin.currentSession = PluginSession(plugin);
+      // Ensure they have different file types so the registrations change,
+      // otherwise they will be optimised out as not changing.
+      plugin.currentSession!.interestingFiles = ['*.foo$i'];
+      pluginManager.pluginsChangedController.add(null);
+      await null; // Allow the server to begin processing the change.
+    }
+
+    // Wait for both streams to have handled all of the numberOfReregistrations
+    // expected events (without throwing).
+    await Future.wait([registrationsDone, unregistrationsDone]);
+  }
+
   Future<void> test_dynamicRegistration_containsAppropriateSettings() async {
     // Basic check that the server responds with the capabilities we'd expect,
     // for ex including analysis_options.yaml in text synchronization but not
@@ -230,6 +318,7 @@
     expect(initResult.capabilities.hoverProvider, isNotNull);
     expect(initResult.capabilities.signatureHelpProvider, isNotNull);
     expect(initResult.capabilities.referencesProvider, isNotNull);
+    expect(initResult.capabilities.colorProvider, isNotNull);
     expect(initResult.capabilities.documentHighlightProvider, isNotNull);
     expect(initResult.capabilities.documentFormattingProvider, isNotNull);
     expect(initResult.capabilities.documentOnTypeFormattingProvider, isNotNull);
@@ -289,6 +378,7 @@
     expect(initResult.capabilities.hoverProvider, isNull);
     expect(initResult.capabilities.signatureHelpProvider, isNull);
     expect(initResult.capabilities.referencesProvider, isNull);
+    expect(initResult.capabilities.colorProvider, isNull);
     expect(initResult.capabilities.documentHighlightProvider, isNull);
     expect(initResult.capabilities.documentFormattingProvider, isNull);
     expect(initResult.capabilities.documentOnTypeFormattingProvider, isNull);
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 6b8ba52..851966e 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -261,9 +261,11 @@
 
   void mergeJson(Map<String, dynamic> source, Map<String, dynamic> dest) {
     source.keys.forEach((key) {
-      if (source[key] is Map<String, dynamic> &&
-          dest[key] is Map<String, dynamic>) {
-        mergeJson(source[key], dest[key]);
+      var sourceValue = source[key];
+      var destValue = dest[key];
+      if (sourceValue is Map<String, dynamic> &&
+          destValue is Map<String, dynamic>) {
+        mergeJson(sourceValue, destValue);
       } else {
         dest[key] = source[key];
       }
@@ -284,6 +286,7 @@
       'references': {'dynamicRegistration': true},
       'documentHighlight': {'dynamicRegistration': true},
       'documentSymbol': {'dynamicRegistration': true},
+      'colorProvider': {'dynamicRegistration': true},
       'formatting': {'dynamicRegistration': true},
       'onTypeFormatting': {'dynamicRegistration': true},
       'rangeFormatting': {'dynamicRegistration': true},
@@ -877,7 +880,7 @@
     return expectSuccessfulResponseTo(request, (result) => result);
   }
 
-  void expect(actual, matcher, {String? reason}) =>
+  void expect(Object? actual, Matcher matcher, {String? reason}) =>
       test.expect(actual, matcher, reason: reason);
 
   void expectDocumentVersion(
@@ -1035,6 +1038,22 @@
     );
   }
 
+  Future<List<ColorPresentation>> getColorPresentation(
+      String fileUri, Range range, Color color) {
+    final request = makeRequest(
+      Method.textDocument_colorPresentation,
+      ColorPresentationParams(
+        textDocument: TextDocumentIdentifier(uri: fileUri),
+        range: range,
+        color: color,
+      ),
+    );
+    return expectSuccessfulResponseTo(
+      request,
+      _fromJsonList(ColorPresentation.fromJson),
+    );
+  }
+
   Future<List<CompletionItem>> getCompletion(Uri uri, Position pos,
       {CompletionContext? context}) {
     final request = makeRequest(
@@ -1093,6 +1112,19 @@
     return expectSuccessfulResponseTo(request, DartDiagnosticServer.fromJson);
   }
 
+  Future<List<ColorInformation>> getDocumentColors(String fileUri) {
+    final request = makeRequest(
+      Method.textDocument_documentColor,
+      DocumentColorParams(
+        textDocument: TextDocumentIdentifier(uri: fileUri),
+      ),
+    );
+    return expectSuccessfulResponseTo(
+      request,
+      _fromJsonList(ColorInformation.fromJson),
+    );
+  }
+
   Future<List<DocumentHighlight>?> getDocumentHighlights(
       Uri uri, Position pos) {
     final request = makeRequest(
@@ -1164,7 +1196,7 @@
   Future<List<Location>> getReferences(
     Uri uri,
     Position pos, {
-    includeDeclarations = false,
+    bool includeDeclarations = false,
   }) {
     final request = makeRequest(
       Method.textDocument_references,
diff --git a/pkg/analysis_server/test/lsp/signature_help_test.dart b/pkg/analysis_server/test/lsp/signature_help_test.dart
index edaeefd..a9de8f5 100644
--- a/pkg/analysis_server/test/lsp/signature_help_test.dart
+++ b/pkg/analysis_server/test/lsp/signature_help_test.dart
@@ -305,6 +305,33 @@
     );
   }
 
+  Future<void> test_params_multipleNamed_retrigger() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, {bool b = true, bool a}) {
+      foo('s',^);
+    }
+    ''';
+
+    final expectedLabel = 'foo(String s, {bool b = true, bool a})';
+    final expectedDoc = 'Does foo.';
+
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        ParameterInformation(label: 'String s'),
+        ParameterInformation(label: 'bool b = true'),
+        ParameterInformation(label: 'bool a'),
+      ],
+    );
+  }
+
   Future<void> test_params_multipleOptional() async {
     final content = '''
     /// Does foo.
diff --git a/pkg/analysis_server/test/lsp/test_all.dart b/pkg/analysis_server/test/lsp/test_all.dart
index 752d3f1..bd22081 100644
--- a/pkg/analysis_server/test/lsp/test_all.dart
+++ b/pkg/analysis_server/test/lsp/test_all.dart
@@ -20,6 +20,7 @@
 import 'definition_test.dart' as definition;
 import 'diagnostic_test.dart' as diagnostic;
 import 'document_changes_test.dart' as document_changes;
+import 'document_color_test.dart' as document_color;
 import 'document_highlights_test.dart' as document_highlights;
 import 'document_symbols_test.dart' as document_symbols;
 import 'file_modification_test.dart' as file_modification;
@@ -63,6 +64,7 @@
     document_changes.main();
     document_highlights.main();
     document_symbols.main();
+    document_color.main();
     file_modification.main();
     flutter_outline.main();
     folding.main();
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/cupertino.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/cupertino.dart
new file mode 100644
index 0000000..828a456
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/cupertino.dart
@@ -0,0 +1,5 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+export 'src/cupertino/colors.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart
index 466ed8e..a1cecbd 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 export 'src/material/app_bar.dart';
+export 'src/material/colors.dart';
 export 'src/material/icons.dart';
 export 'src/material/scaffold.dart';
 export 'widgets.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart
index a3323f6..6eec7c5 100644
--- a/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart
@@ -5,6 +5,7 @@
 export 'src/painting/alignment.dart';
 export 'src/painting/basic_types.dart';
 export 'src/painting/box_decoration.dart';
+export 'src/painting/colors.dart';
 export 'src/painting/decoration.dart';
 export 'src/painting/edge_insets.dart';
 export 'src/painting/text_painter.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/cupertino/colors.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/cupertino/colors.dart
new file mode 100644
index 0000000..62356d5
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/cupertino/colors.dart
@@ -0,0 +1,102 @@
+// Copyright 2021 The Chromium Authors. 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:flutter/painting.dart';
+
+class CupertinoColors {
+  CupertinoColors._();
+
+  static const CupertinoDynamicColor activeBlue = systemBlue;
+
+  static const Color black = Color(0xFF000000);
+  static const Color white = Color(0xFFFFFFFF);
+
+  static const CupertinoDynamicColor systemBlue =
+      CupertinoDynamicColor.withBrightnessAndContrast(
+    color: Color.fromARGB(255, 0, 0, 0xFF),
+    darkColor: Color.fromARGB(255, 0, 0, 0x99),
+    highContrastColor: Color.fromARGB(255, 0, 0, 0x66),
+    darkHighContrastColor: Color.fromARGB(255, 0, 0, 0x33),
+  );
+}
+
+class CupertinoDynamicColor extends Color {
+  const CupertinoDynamicColor({
+    Color color,
+    Color darkColor,
+    Color highContrastColor,
+    Color darkHighContrastColor,
+    Color elevatedColor,
+    Color darkElevatedColor,
+    Color highContrastElevatedColor,
+    Color darkHighContrastElevatedColor,
+  }) : this._(
+          color,
+          color,
+          darkColor,
+          highContrastColor,
+          darkHighContrastColor,
+          elevatedColor,
+          darkElevatedColor,
+          highContrastElevatedColor,
+          darkHighContrastElevatedColor,
+          null,
+        );
+
+  const CupertinoDynamicColor.withBrightnessAndContrast({
+    Color color,
+    Color darkColor,
+    Color highContrastColor,
+    Color darkHighContrastColor,
+  }) : this(
+          color: color,
+          darkColor: darkColor,
+          highContrastColor: highContrastColor,
+          darkHighContrastColor: darkHighContrastColor,
+          elevatedColor: color,
+          darkElevatedColor: darkColor,
+          highContrastElevatedColor: highContrastColor,
+          darkHighContrastElevatedColor: darkHighContrastColor,
+        );
+
+  const CupertinoDynamicColor.withBrightness({
+    Color color,
+    Color darkColor,
+  }) : this(
+          color: color,
+          darkColor: darkColor,
+          highContrastColor: color,
+          darkHighContrastColor: darkColor,
+          elevatedColor: color,
+          darkElevatedColor: darkColor,
+          highContrastElevatedColor: color,
+          darkHighContrastElevatedColor: darkColor,
+        );
+
+  const CupertinoDynamicColor._(
+    this._effectiveColor,
+    this.color,
+    this.darkColor,
+    this.highContrastColor,
+    this.darkHighContrastColor,
+    this.elevatedColor,
+    this.darkElevatedColor,
+    this.highContrastElevatedColor,
+    this.darkHighContrastElevatedColor,
+  ) : super(0);
+
+  final Color _effectiveColor;
+
+  @override
+  int get value => _effectiveColor.value;
+
+  final Color color;
+  final Color darkColor;
+  final Color highContrastColor;
+  final Color darkHighContrastColor;
+  final Color elevatedColor;
+  final Color darkElevatedColor;
+  final Color highContrastElevatedColor;
+  final Color darkHighContrastElevatedColor;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/colors.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/colors.dart
new file mode 100644
index 0000000..803f7a5
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/colors.dart
@@ -0,0 +1,71 @@
+// Copyright 2021 The Chromium Authors. 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:flutter/painting.dart';
+
+class MaterialColor extends ColorSwatch<int> {
+  const MaterialColor(int primary, Map<int, Color> swatch)
+      : super(primary, swatch);
+
+  Color get shade100 => this[100];
+  Color get shade200 => this[200];
+  Color get shade300 => this[300];
+  Color get shade400 => this[400];
+  Color get shade50 => this[50];
+  Color get shade500 => this[500];
+  Color get shade600 => this[600];
+  Color get shade700 => this[700];
+  Color get shade800 => this[800];
+  Color get shade900 => this[900];
+}
+
+class MaterialAccentColor extends ColorSwatch<int> {
+  const MaterialAccentColor(int primary, Map<int, Color> swatch)
+      : super(primary, swatch);
+
+  Color get shade50 => this[50];
+  Color get shade100 => this[100];
+  Color get shade200 => this[200];
+  Color get shade400 => this[400];
+  Color get shade700 => this[700];
+}
+
+class Colors {
+  Colors._();
+
+  static const Color black = Color(0xFF000000);
+  static const Color white = Color(0xFFFFFFFF);
+
+  static const MaterialColor red = MaterialColor(
+    _redPrimaryValue,
+    <int, Color>{
+      // For simpler testing, these values are not the real Flutter values
+      // but just varying alphas on a primary value.
+      50: Color(0x05FF0000),
+      100: Color(0x10FF0000),
+      200: Color(0x20FF0000),
+      300: Color(0x30FF0000),
+      400: Color(0x40FF0000),
+      500: Color(0x50FF0000),
+      600: Color(0x60FF0000),
+      700: Color(0x70FF0000),
+      800: Color(0x80FF0000),
+      900: Color(0x90FF0000),
+    },
+  );
+  static const int _redPrimaryValue = 0xFFFF0000;
+
+  static const MaterialAccentColor redAccent = MaterialAccentColor(
+    _redAccentValue,
+    <int, Color>{
+      // For simpler testing, these values are not the real Flutter values
+      // but just varying alphas on a primary value.
+      100: Color(0x10FFAA00),
+      200: Color(0x20FFAA00),
+      400: Color(0x40FFAA00),
+      700: Color(0x70FFAA00),
+    },
+  );
+  static const int _redAccentValue = 0xFFFFAA00;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/colors.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/colors.dart
new file mode 100644
index 0000000..f0dbfae
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/colors.dart
@@ -0,0 +1,16 @@
+// Copyright 2021 The Chromium Authors. 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:flutter/foundation.dart';
+import 'package:flutter/painting.dart';
+
+@immutable
+class ColorSwatch<T> extends Color {
+  const ColorSwatch(int primary, this._swatch) : super(primary);
+
+  @protected
+  final Map<T, Color> _swatch;
+
+  Color operator [](T index) => _swatch[index];
+}
diff --git a/pkg/analysis_server/test/mock_packages/meta/lib/meta_meta.dart b/pkg/analysis_server/test/mock_packages/meta/lib/meta_meta.dart
new file mode 100644
index 0000000..18902be
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/meta/lib/meta_meta.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Annotations that describe the intended use of other annotations.
+library meta_meta;
+
+/// An annotation used on classes that are intended to be used as annotations
+/// to indicate the kinds of declarations and directives for which the
+/// annotation is appropriate.
+///
+/// The kinds are represented by the constants defined in [TargetKind].
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a class, where the
+///   class must be usable as an annotation (that is, contain at least one
+///   `const` constructor).
+/// * the annotated annotation is associated with anything other than the kinds
+///   of declarations listed as valid targets.
+@Target({TargetKind.classType})
+class Target {
+  /// The kinds of declarations with which the annotated annotation can be
+  /// associated.
+  final Set<TargetKind> kinds;
+
+  const Target(this.kinds);
+}
+
+/// An enumeration of the kinds of targets to which an annotation can be
+/// applied.
+enum TargetKind {
+  /// Indicates that an annotation is valid on any class declaration.
+  classType,
+
+  /// Indicates that an annotation is valid on any enum declaration.
+  enumType,
+
+  /// Indicates that an annotation is valid on any extension declaration.
+  extension,
+
+  /// Indicates that an annotation is valid on any field declaration, both
+  /// instance and static fields, whether it's in a class, mixin or extension.
+  field,
+
+  /// Indicates that an annotation is valid on any top-level function
+  /// declaration.
+  function,
+
+  /// Indicates that an annotation is valid on the first directive in a library,
+  /// whether that's a `library`, `import`, `export` or `part` directive. This
+  /// doesn't include the `part of` directive in a part file.
+  library,
+
+  /// Indicates that an annotation is valid on any getter declaration, both
+  /// instance or static getters, whether it's in a class, mixin, extension, or
+  /// at the top-level of a library.
+  getter,
+
+  /// Indicates that an annotation is valid on any method declaration, both
+  /// instance and static methods, whether it's in a class, mixin or extension.
+  method,
+
+  /// Indicates that an annotation is valid on any mixin declaration.
+  mixinType,
+
+  /// Indicates that an annotation is valid on any formal parameter declaration,
+  /// whether it's in a function, method, constructor, or closure.
+  parameter,
+
+  /// Indicates that an annotation is valid on any setter declaration, both
+  /// instance or static setters, whether it's in a class, mixin, extension, or
+  /// at the top-level of a library.
+  setter,
+
+  /// Indicates that an annotation is valid on any top-level variable
+  /// declaration.
+  topLevelVariable,
+
+  /// Indicates that an annotation is valid on any declaration that introduces a
+  /// type. This includes classes, enums, mixins and typedefs, but does not
+  /// include extensions because extensions don't introduce a type.
+  type,
+
+  /// Indicates that an annotation is valid on any typedef declaration.
+  typedefType,
+}
+
+extension TargetKindExtension on TargetKind {
+  /// Return a user visible string used to describe this target kind.
+  String get displayString {
+    switch (this) {
+      case TargetKind.classType:
+        return 'classes';
+      case TargetKind.enumType:
+        return 'enums';
+      case TargetKind.extension:
+        return 'extensions';
+      case TargetKind.field:
+        return 'fields';
+      case TargetKind.function:
+        return 'top-level functions';
+      case TargetKind.library:
+        return 'libraries';
+      case TargetKind.getter:
+        return 'getters';
+      case TargetKind.method:
+        return 'methods';
+      case TargetKind.mixinType:
+        return 'mixins';
+      case TargetKind.parameter:
+        return 'parameters';
+      case TargetKind.setter:
+        return 'setters';
+      case TargetKind.topLevelVariable:
+        return 'top-level variables';
+      case TargetKind.type:
+        return 'types (classes, enums, mixins, or typedefs)';
+      case TargetKind.typedefType:
+        return 'typedefs';
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index b8e733e..60c1114 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -155,9 +155,9 @@
   }
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    Response response = item;
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
+    var response = item as Response;
     var id = response.id;
     var error = response.error;
     mismatchDescription.add('has identifier "$id"');
@@ -170,8 +170,8 @@
   }
 
   @override
-  bool matches(item, Map matchState) {
-    Response response = item;
+  bool matches(Object? item, Map matchState) {
+    var response = item as Response;
     var error = response.error;
     if (response.id != _id || error == null) {
       return false;
@@ -196,9 +196,9 @@
   }
 
   @override
-  Description describeMismatch(
-      item, Description mismatchDescription, Map matchState, bool verbose) {
-    Response? response = item;
+  Description describeMismatch(Object? item, Description mismatchDescription,
+      Map matchState, bool verbose) {
+    var response = item as Response?;
     if (response == null) {
       mismatchDescription.add('is null response');
     } else {
@@ -213,8 +213,8 @@
   }
 
   @override
-  bool matches(item, Map matchState) {
-    Response? response = item;
+  bool matches(Object? item, Map matchState) {
+    var response = item as Response?;
     return response != null && response.id == _id && response.error == null;
   }
 }
diff --git a/pkg/analysis_server/test/mocks_lsp.dart b/pkg/analysis_server/test/mocks_lsp.dart
index 35b3c1f..6c83f82 100644
--- a/pkg/analysis_server/test/mocks_lsp.dart
+++ b/pkg/analysis_server/test/mocks_lsp.dart
@@ -191,6 +191,7 @@
   /// than the maps as they would be (the server expects to do the conversion).
   T _convertJson<T>(
       lsp.ToJsonable message, T Function(Map<String, dynamic>) constructor) {
-    return constructor(jsonDecode(jsonEncode(message.toJson())));
+    return constructor(
+        jsonDecode(jsonEncode(message.toJson())) as Map<String, Object?>);
   }
 }
diff --git a/pkg/analysis_server/test/search/declarations_test.dart b/pkg/analysis_server/test/search/declarations_test.dart
index 3d64012..3c0a02f 100644
--- a/pkg/analysis_server/test/search/declarations_test.dart
+++ b/pkg/analysis_server/test/search/declarations_test.dart
@@ -208,8 +208,8 @@
     assertHas('s', ElementKind.SETTER);
     assertHas('f', ElementKind.FUNCTION);
     assertHas('v', ElementKind.TOP_LEVEL_VARIABLE);
-    assertHas('tf1', ElementKind.FUNCTION_TYPE_ALIAS);
-    assertHas('tf2', ElementKind.FUNCTION_TYPE_ALIAS);
+    assertHas('tf1', ElementKind.TYPE_ALIAS);
+    assertHas('tf2', ElementKind.TYPE_ALIAS);
     assertHas('td3', ElementKind.TYPE_ALIAS);
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 690b251..f320c5f 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -6,7 +6,6 @@
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -76,7 +75,6 @@
   /// the only suggestions.
   void assertSuggestArgumentsAndTypes(
       {required Map<String, String> namedArgumentsWithTypes,
-      List<int> requiredParamIndices = const <int>[],
       bool includeColon = true,
       bool includeComma = false}) {
     var expected = <CompletionSuggestion>[];
@@ -122,663 +120,7 @@
 @reflectiveTest
 class ArgListContributorTest extends DartCompletionContributorTest
     with ArgListContributorMixin {
-  Future<void> test_Annotation_imported_constructor_named_param() async {
-    addSource('/home/test/lib/a.dart', '''
-library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
-    addTestSource('import "a.dart"; @A(^) main() { }');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
-  }
-
-  Future<void> test_Annotation_importedConstructor_prefixed() async {
-    addSource('/home/test/lib/a.dart', '''
-class A {
-  const A({int value});
-}
-''');
-    addTestSource('''
-import "a.dart" as p;
-@p.A(^)
-main() {}
-''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'value': 'int'});
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(^) main() { }''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
-  }
-
-  @failingTest
-  Future<void> test_Annotation_local_constructor_named_param_10() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(two: '2' ^) main() { }''');
-    await computeSuggestions();
-    assertSuggestions([', one: ']);
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_11() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(two: '2', ^) main() { }''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_2() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(^ two: '2') main() { }''');
-    await computeSuggestions();
-    assertSuggestions(['one: ,']);
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_3() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(^two: '2') main() { }''');
-    await computeSuggestions();
-    assertSuggestions(['one: ,']);
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_4() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(^, two: '2') main() { }''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_5() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(^ , two: '2') main() { }''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_6() async {
-    addTestSource('''
-class A { const A(int zero, {int one, String two: 'defaultValue'}); }
-@A(0, ^, two: '2') main() { }''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_7() async {
-    addTestSource('''
-class A { const A(int zero, {int one, String two: 'defaultValue'}); }
-@A(0, ^ two: '2') main() { }''');
-    await computeSuggestions();
-    assertSuggestions(['one: ,']);
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_8() async {
-    addTestSource('''
-class A { const A(int zero, {int one, String two: 'defaultValue'}); }
-@A(0, ^two: '2') main() { }''');
-    await computeSuggestions();
-    assertSuggestions(['one: ,']);
-  }
-
-  @failingTest
-  Future<void> test_Annotation_local_constructor_named_param_9() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(two: '2'^) main() { }''');
-    await computeSuggestions();
-    assertSuggestions([', one: ']);
-  }
-
-  Future<void> test_Annotation_local_constructor_named_param_negative() async {
-    addTestSource('''
-class A { const A(int one, int two, int three, {int four, String five:
-  'defaultValue'}); }
-@A(1, ^, 3) main() { }''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_closureFunction_namedParameter() async {
-    addTestSource(r'''
-void f({void Function(int a, String b) closure}) {}
-
-void main() {
-  f(closure: ^);
-}
-''');
-    await computeSuggestions();
-
-    assertSuggest(
-      '(a, b) => ,',
-      selectionOffset: 10,
-    );
-
-    assertSuggest(
-      '''
-(a, b) {
-${' ' * 4}
-${' ' * 2}},''',
-      selectionOffset: 13,
-    );
-  }
-
-  Future<void>
-      test_ArgumentList_closureFunction_namedParameter_hasComma() async {
-    addTestSource(r'''
-void f({void Function(int a, String b) closure}) {}
-
-void main() {
-  f(
-    closure: ^,
-  );
-}
-''');
-    await computeSuggestions();
-
-    assertSuggest(
-      '(a, b) => ',
-      selectionOffset: 10,
-    );
-
-    assertSuggest(
-      '''
-(a, b) {
-${' ' * 6}
-${' ' * 4}}''',
-      selectionOffset: 15,
-    );
-  }
-
-  /// todo (pq): implement positional functional parameters
-  @failingTest
-  Future<void> test_ArgumentList_closureFunction_positionalParameter() async {
-    addTestSource(r'''
-void f(void Function(int a, int b) closure) {}
-
-void main() {
-  f(^);
-}
-''');
-    await computeSuggestions();
-
-    assertSuggest(
-      '(a, b, c) => ,',
-      selectionOffset: 13,
-    );
-  }
-
-  Future<void> test_ArgumentList_closureMethod_namedParameter() async {
-    addTestSource(r'''
-class C {
-  void f({void Function(int a, String b) closure}) {}
-
-  void main() {
-    f(closure: ^);
-  }
-}
-''');
-    await computeSuggestions();
-
-    assertSuggest(
-      '(a, b) => ,',
-      selectionOffset: 10,
-    );
-
-    assertSuggest(
-      '''
-(a, b) {
-${' ' * 6}
-${' ' * 4}},''',
-      selectionOffset: 15,
-    );
-  }
-
-  Future<void> test_ArgumentList_closureParam() async {
-    addTestSource(r'''
-void f({void Function(int a, {int b, int c}) closure}) {}
-
-void main() {
-  f(closure: ^);
-}
-''');
-    await computeSuggestions();
-
-    assertSuggest(
-      '(a, {b, c}) => ,',
-      selectionOffset: 15,
-    );
-  }
-
-  Future<void> test_ArgumentList_closureParameterOptionalNamed() async {
-    addTestSource(r'''
-void f({void Function(int a, {int b, int c}) closure}) {}
-
-void main() {
-  f(closure: ^);
-}
-''');
-    await computeSuggestions();
-
-    assertSuggest(
-      '(a, {b, c}) => ,',
-      selectionOffset: 15,
-    );
-  }
-
-  Future<void> test_ArgumentList_closureParameterOptionalPositional() async {
-    addTestSource(r'''
-void f({void Function(int a, [int b, int c]) closure]) {}
-
-void main() {
-  f(closure: ^);
-}
-''');
-    await computeSuggestions();
-
-    assertSuggest(
-      '(a, [b, c]) => ,',
-      selectionOffset: 15,
-    );
-  }
-
-  Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_0() async {
-    writeTestPackageConfig(flutter: true);
-
-    addTestSource('''
-import 'package:flutter/widgets.dart';
-
-build() => new Row(
-    ^
-  );
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('children: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 11,
-        defaultArgumentListTextRanges: null);
-  }
-
-  Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_01() async {
-    writeTestPackageConfig(flutter: true);
-
-    addTestSource('''
-import 'package:flutter/material.dart';
-
-  build() => new Scaffold(
-        appBar: new AppBar(
-          ^
-        ),
-  );
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('backgroundColor: ,',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null, // No default values.
-        selectionOffset: 17);
-  }
-
-  Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_1() async {
-    writeTestPackageConfig(flutter: true);
-
-    addTestSource('''
-import 'package:flutter/material.dart';
-
-build() => new Row(
-    key: null,
-    ^
-  );
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('children: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 11,
-        defaultArgumentListTextRanges: null);
-  }
-
-  Future<void> test_ArgumentList_Flutter_InstanceCreationExpression_2() async {
-    writeTestPackageConfig(flutter: true);
-
-    addTestSource('''
-import 'package:flutter/material.dart';
-
-build() => new Row(
-    ^
-    key: null,
-  );
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('children: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 11,
-        defaultArgumentListTextRanges: null);
-  }
-
-  Future<void>
-      test_ArgumentList_Flutter_InstanceCreationExpression_children_dynamic() async {
-    // Ensure we don't generate unneeded <dynamic> param if a future API doesn't
-    // type it's children.
-    writeTestPackageConfig(flutter: true);
-
-    addTestSource('''
-import 'package:flutter/material.dart';
-
-build() => new Container(
-    child: new DynamicRow(^);
-  );
-
-class DynamicRow extends Widget {
-  DynamicRow({List children: null});
-}
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('children: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 11,
-        defaultArgumentListTextRanges: null);
-  }
-
-  Future<void>
-      test_ArgumentList_Flutter_InstanceCreationExpression_children_Map() async {
-    // Ensure we don't generate Map params for a future API
-    writeTestPackageConfig(flutter: true);
-
-    addTestSource('''
-import 'package:flutter/material.dart';
-
-build() => new Container(
-    child: new MapRow(^);
-  );
-
-class MapRow extends Widget {
-  MapRow({Map<Object, Object> children: null});
-}
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('children: ,',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        selectionOffset: 10,
-        defaultArgListString: null);
-  }
-
-  Future<void>
-      test_ArgumentList_Flutter_InstanceCreationExpression_slivers() async {
-    writeTestPackageConfig(flutter: true);
-
-    addTestSource('''
-import 'package:flutter/material.dart';
-
-build() => new CustomScrollView(
-    ^
-  );
-
-class CustomScrollView extends Widget {
-  CustomScrollView({List<Widget> slivers});
-}
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('slivers: [],',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null,
-        selectionOffset: 10,
-        defaultArgumentListTextRanges: null);
-  }
-
-  Future<void> test_ArgumentList_Flutter_MethodExpression_children() async {
-    // Ensure we don't generate params for a method call
-    // TODO(brianwilkerson) This test has been changed so that it no longer has
-    // anything to do with Flutter (by moving the declaration of `foo` out of
-    // the 'material' library). Determine whether the test is still valid.
-    writeTestPackageConfig(flutter: true);
-
-    addTestSource('''
-import 'package:flutter/material.dart';
-
-main() {
-  foo(^);
-}
-
-foo({String children}) {}
-''');
-
-    await computeSuggestions();
-
-    assertSuggest('children: ',
-        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-        defaultArgListString: null);
-  }
-
-  Future<void> test_ArgumentList_getter() async {
-    addTestSource('class A {int get foo => 7; main() {foo(^)}');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_imported_constructor_named_param() async {
-    // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart', 'library libA; class A{A({int one}); }');
-    addTestSource('import "a.dart"; main() { new A(^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-  }
-
-  Future<void> test_ArgumentList_imported_constructor_named_param2() async {
-    // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource(
-        '/home/test/lib/a.dart', 'library libA; class A{A.foo({int one}); }');
-    addTestSource('import "a.dart"; main() { new A.foo(^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-  }
-
-  Future<void>
-      test_ArgumentList_imported_constructor_named_typed_param() async {
-    // ArgumentList  InstanceCreationExpression  VariableDeclaration
-    addSource('/home/test/lib/a.dart',
-        'library libA; class A { A({int i, String s, d}) {} }}');
-    addTestSource('import "a.dart"; main() { var a = new A(^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'i': 'int', 's': 'String', 'd': 'dynamic'});
-  }
-
-  Future<void> test_ArgumentList_imported_factory_named_param() async {
-    // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart',
-        'library libA; class A{factory A({int one}) => throw 0;}');
-    addTestSource('import "a.dart"; main() { new A(^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-  }
-
-  Future<void> test_ArgumentList_imported_factory_named_param2() async {
-    // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart',
-        'library libA; abstract class A{factory A.foo({int one});}');
-    addTestSource('import "a.dart"; main() { new A.foo(^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-  }
-
-  Future<void> test_ArgumentList_imported_factory_named_typed_param() async {
-    // ArgumentList  InstanceCreationExpression  VariableDeclaration
-    addSource('/home/test/lib/a.dart',
-        'library libA; class A {factory A({int i, String s, d}) {} }}');
-    addTestSource('import "a.dart"; main() { var a = new A(^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'i': 'int', 's': 'String', 'd': 'dynamic'});
-  }
-
-  Future<void> test_ArgumentList_imported_function_0() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
-      library A;
-      bool hasLength(int expected) { }
-      expect() { }
-      void baz() { }''');
-    addTestSource('''
-      import 'a.dart'
-      class B { }
-      String bar() => true;
-      void main() {expect(a^)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_imported_function_3a() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
-      library A;
-      bool hasLength(int expected) { }
-      expect(String arg1, int arg2, {bool arg3}) { }
-      void baz() { }''');
-    addTestSource('''
-      import 'a.dart'
-      class B { }
-      String bar() => true;
-      void main() {expect('hello', ^)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_imported_function_3b() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
-      library A;
-      bool hasLength(int expected) { }
-      expect(String arg1, int arg2, {bool arg3}) { }
-      void baz() { }''');
-    addTestSource('''
-      import 'a.dart'
-      class B { }
-      String bar() => true;
-      void main() {expect('hello', ^x)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_imported_function_3c() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
-      library A;
-      bool hasLength(int expected) { }
-      expect(String arg1, int arg2, {bool arg3}) { }
-      void baz() { }''');
-    addTestSource('''
-      import 'a.dart'
-      class B { }
-      String bar() => true;
-      void main() {expect('hello', x^)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_imported_function_3d() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
-      library A;
-      bool hasLength(int expected) { }
-      expect(String arg1, int arg2, {bool arg3}) { }
-      void baz() { }''');
-    addTestSource('''
-      import 'a.dart'
-      class B { }
-      String bar() => true;
-      void main() {expect('hello', x ^)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_imported_function_named_param() async {
-    //
-    addTestSource('main() { int.parse("16", ^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'radix': 'int?',
-      'onError': 'int Function(String)?'
-    });
-  }
-
-  Future<void> test_ArgumentList_imported_function_named_param1() async {
-    //
-    addTestSource('main() { int.parse("16", r^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'radix': 'int?',
-      'onError': 'int Function(String)?'
-    });
-  }
-
-  Future<void> test_ArgumentList_imported_function_named_param2() async {
-    //
-    addTestSource('main() { int.parse("16", radix: 7, ^);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'onError': 'int Function(String)?'});
-  }
-
-  Future<void> test_ArgumentList_imported_function_named_param2a() async {
-    //
-    addTestSource('main() { int.parse("16", radix: ^);}');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_imported_function_named_param_label1() async {
-    //
-    addTestSource('main() { int.parse("16", r^: 16);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'radix': 'int?',
-      'onError': 'int Function(String)?'
-    }, includeColon: false);
-  }
-
-  Future<void> test_ArgumentList_imported_function_named_param_label2() async {
-    //
-    addTestSource('main() { int.parse("16", ^r: 16);}');
-    await computeSuggestions();
-    assertSuggestions(['radix: ,', 'onError: ,']);
-  }
-
-  Future<void> test_ArgumentList_imported_function_named_param_label3() async {
-    //
-    addTestSource('main() { int.parse("16", ^: 16);}');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'radix': 'int?',
-      'onError': 'int Function(String)?'
-    });
-  }
-
-  Future<void>
-      test_ArgumentList_local_constructor_named_fieldFormal_documentation() async {
+  Future<void> test_fieldFormal_documentation() async {
     var content = '''
 class A {
   /// aaa
@@ -806,8 +148,7 @@
     expect(element.location!.offset, content.indexOf('fff})'));
   }
 
-  Future<void>
-      test_ArgumentList_local_constructor_named_fieldFormal_noDocumentation() async {
+  Future<void> test_fieldFormal_noDocumentation() async {
     var content = '''
 class A {
   int fff;
@@ -831,327 +172,646 @@
     expect(element.location!.offset, content.indexOf('fff})'));
   }
 
-  Future<void> test_ArgumentList_local_constructor_named_param() async {
-    //
+  Future<void> test_flutter_InstanceCreationExpression_0() async {
+    writeTestPackageConfig(flutter: true);
+
     addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(^);}''');
+import 'package:flutter/widgets.dart';
+
+build() => new Row(
+    ^
+  );
+''');
+
     await computeSuggestions();
 
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ', selectionOffset: 5);
+    assertSuggest('children: [],',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        defaultArgListString: null,
+        selectionOffset: 11,
+        defaultArgumentListTextRanges: null);
   }
 
-  Future<void> test_ArgumentList_local_constructor_named_param_1() async {
-    //
+  Future<void> test_flutter_InstanceCreationExpression_01() async {
+    writeTestPackageConfig(flutter: true);
+
     addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(o^);}''');
+import 'package:flutter/material.dart';
+
+  build() => new Scaffold(
+        appBar: new AppBar(
+          ^
+        ),
+  );
+''');
+
     await computeSuggestions();
 
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ', selectionOffset: 5);
+    assertSuggest('backgroundColor: ,',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        defaultArgListString: null, // No default values.
+        selectionOffset: 17);
   }
 
-  Future<void> test_ArgumentList_local_constructor_named_param_2() async {
-    //
+  Future<void> test_flutter_InstanceCreationExpression_1() async {
+    writeTestPackageConfig(flutter: true);
+
     addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(^o,);}''');
+import 'package:flutter/material.dart';
+
+build() => new Row(
+    key: null,
+    ^
+  );
+''');
+
     await computeSuggestions();
 
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ', selectionOffset: 5);
+    assertSuggest('children: [],',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        defaultArgListString: null,
+        selectionOffset: 11,
+        defaultArgumentListTextRanges: null);
   }
 
-  Future<void> test_ArgumentList_local_constructor_named_param_3() async {
-    //
+  Future<void> test_flutter_InstanceCreationExpression_2() async {
+    writeTestPackageConfig(flutter: true);
+
     addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(two: 'foo', ^);}''');
+import 'package:flutter/material.dart';
+
+build() => new Row(
+    ^
+    key: null,
+  );
+''');
+
     await computeSuggestions();
 
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ', selectionOffset: 5);
-  }
-
-  Future<void> test_ArgumentList_local_constructor_named_param_4() async {
-    //
-    addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(two: 'foo', o^);}''');
-    await computeSuggestions();
-
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ', selectionOffset: 5);
-  }
-
-  Future<void> test_ArgumentList_local_constructor_named_param_5() async {
-    //
-    addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(two: 'foo', o^,);}''');
-    await computeSuggestions();
-
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ', selectionOffset: 5);
-  }
-
-  Future<void> test_ArgumentList_local_constructor_named_param_6() async {
-    //
-    addTestSource('''
-class A { A.foo({int one, String two: 'defaultValue'}) { } }
-main() { new A.foo(^);}''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
+    assertSuggest('children: [],',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        defaultArgListString: null,
+        selectionOffset: 11,
+        defaultArgumentListTextRanges: null);
   }
 
   Future<void>
-      test_ArgumentList_local_constructor_named_param_prefixed_prepend() async {
-    //
+      test_flutter_InstanceCreationExpression_children_dynamic() async {
+    // Ensure we don't generate unneeded <dynamic> param if a future API doesn't
+    // type it's children.
+    writeTestPackageConfig(flutter: true);
+
     addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(o^ two: 'foo');}''');
-    await computeSuggestions();
+import 'package:flutter/material.dart';
 
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int'}, includeComma: true);
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ,', selectionOffset: 5);
-  }
+build() => new Container(
+    child: new DynamicRow(^);
+  );
 
-  Future<void> test_ArgumentList_local_constructor_named_param_prepend() async {
-    //
-    addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(^ two: 'foo');}''');
-    await computeSuggestions();
-
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int'}, includeComma: true);
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ,', selectionOffset: 5);
-  }
-
-  Future<void>
-      test_ArgumentList_local_constructor_named_param_prepend_1() async {
-    //
-    addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(o^, two: 'foo');}''');
-    await computeSuggestions();
-
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int'}, includeComma: false);
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ', selectionOffset: 5);
-  }
-
-  Future<void>
-      test_ArgumentList_local_constructor_named_param_prepend_2() async {
-    //
-    addTestSource('''
-class A { A({int one, String two: 'defaultValue'}) { } }
-main() { new A(^, two: 'foo');}''');
-    await computeSuggestions();
-
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int'}, includeComma: false);
-    assertSuggestArgumentAndCompletion('one',
-        completion: 'one: ', selectionOffset: 5);
-  }
-
-  Future<void> test_ArgumentList_local_constructor_required_param_0() async {
-    writeTestPackageConfig(meta: true);
-    addTestSource('''
-import 'package:meta/meta.dart';
-class A { A({int one, @required String two: 'defaultValue'}) { } }
-main() { new A(^);}''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'one': 'int', 'two': 'String'},
-        requiredParamIndices: [1]);
-  }
-
-  Future<void> test_ArgumentList_local_function_3a() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addTestSource('''
-      expect(arg1, int arg2, {bool arg3}) { }
-      class B { }
-      String bar() => true;
-      void main() {expect('hello', ^)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_local_function_3b() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addTestSource('''
-      expect(arg1, int arg2, {bool arg3}) { }
-      class B { }
-      String bar() => true;
-      void main() {expect('hello', ^x)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_local_function_3c() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addTestSource('''
-      expect(arg1, int arg2, {bool arg3}) { }
-      class B { }
-      String bar() => true;
-      void main() {expect('hello', x^)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_local_function_3d() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addTestSource('''
-      expect(arg1, int arg2, {bool arg3}) { }
-      class B { }
-      String bar() => true;
-      void main() {expect('hello', x ^)}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_local_function_named_param() async {
-    //
-    addTestSource('''
-f(v,{int radix, int onError(String s)}){}
-main() { f("16", ^);}''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'radix': 'int',
-      'onError': 'int Function(String)'
-    });
-  }
-
-  Future<void> test_ArgumentList_local_function_named_param1() async {
-    //
-    addTestSource('''
-f(v,{int radix, int onError(String s)}){}
-main() { f("16", r^);}''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'radix': 'int',
-      'onError': 'int Function(String)'
-    });
-  }
-
-  Future<void> test_ArgumentList_local_function_named_param2() async {
-    //
-    addTestSource('''
-f(v,{int radix, int onError(String s)}){}
-main() { f("16", radix: 7, ^);}''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'onError': 'int Function(String)'});
-  }
-
-  Future<void> test_ArgumentList_local_function_named_param2a() async {
-    //
-    addTestSource('''
-f(v,{int radix, int onError(String s)}){}
-main() { f("16", radix: ^);}''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_local_functionExpression_params() async {
-    // https://github.com/dart-lang/sdk/issues/42064
-    addTestSource('''
-    void main2() {
-      final add1 = ({int a}) => a + 1;
-      add1(^);
-    }
-    ''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'a': 'int'});
-  }
-
-  Future<void> test_ArgumentList_local_method_0() async {
-    // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
-      library A;
-      bool hasLength(int expected) { }
-      void baz() { }''');
-    addTestSource('''
-      import 'a.dart'
-      class B {
-        expect() { }
-        void foo() {expect(^)}}
-      String bar() => true;''');
-    await computeSuggestions();
-    assertNoSuggestions();
-  }
-
-  Future<void> test_ArgumentList_nnbd_function_named_param() async {
-    addTestSource(r'''
-f({int? nullable, int nonnullable}) {}
-main() { f(^);}');
+class DynamicRow extends Widget {
+  DynamicRow({List children: null});
+}
 ''');
+
     await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'nullable': 'int?',
-      'nonnullable': 'int',
-    });
+
+    assertSuggest('children: [],',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        defaultArgListString: null,
+        selectionOffset: 11,
+        defaultArgumentListTextRanges: null);
   }
 
-  Future<void> test_ArgumentList_nnbd_function_named_param_imported() async {
-    addSource('/home/test/lib/a.dart', '''
-f({int? nullable, int nonnullable}) {}''');
-    createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    addTestSource(r'''
-import "a.dart";
-main() { f(^);}');
-''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'nullable': 'int?',
-      'nonnullable': 'int',
-    });
-  }
+  Future<void> test_flutter_InstanceCreationExpression_children_Map() async {
+    // Ensure we don't generate Map params for a future API
+    writeTestPackageConfig(flutter: true);
 
-  Future<void> test_ArgumentList_nnbd_function_named_param_legacy() async {
-    addSource('/home/test/lib/a.dart', '''
-// @dart = 2.8
-f({int named}) {}''');
-    addTestSource(r'''
-import "a.dart";
-main() { f(^);}');
-''');
-    await computeSuggestions();
-    assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {
-      'named': 'int*',
-    });
-  }
-
-  Future<void> test_superConstructorInvocation() async {
     addTestSource('''
+import 'package:flutter/material.dart';
+
+build() => new Container(
+    child: new MapRow(^);
+  );
+
+class MapRow extends Widget {
+  MapRow({Map<Object, Object> children: null});
+}
+''');
+
+    await computeSuggestions();
+
+    assertSuggest('children: ,',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        selectionOffset: 10,
+        defaultArgListString: null);
+  }
+
+  Future<void> test_flutter_InstanceCreationExpression_slivers() async {
+    writeTestPackageConfig(flutter: true);
+
+    addTestSource('''
+import 'package:flutter/material.dart';
+
+build() => new CustomScrollView(
+    ^
+  );
+
+class CustomScrollView extends Widget {
+  CustomScrollView({List<Widget> slivers});
+}
+''');
+
+    await computeSuggestions();
+
+    assertSuggest('slivers: [],',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        defaultArgListString: null,
+        selectionOffset: 10,
+        defaultArgumentListTextRanges: null);
+  }
+
+  Future<void> test_flutter_MethodExpression_children() async {
+    // Ensure we don't generate params for a method call
+    // TODO(brianwilkerson) This test has been changed so that it no longer has
+    // anything to do with Flutter (by moving the declaration of `foo` out of
+    // the 'material' library). Determine whether the test is still valid.
+    writeTestPackageConfig(flutter: true);
+
+    addTestSource('''
+import 'package:flutter/material.dart';
+
+main() {
+  foo(^);
+}
+
+foo({String children}) {}
+''');
+
+    await computeSuggestions();
+
+    assertSuggest('children: ',
+        csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+        defaultArgListString: null);
+  }
+
+  Future<void> test_named_01() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(^)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
+        );
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_02() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(o^)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
+        );
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_03() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(o^ two: 2)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+            namedArgumentsWithTypes: {'one': 'bool'}, includeComma: true);
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ,', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_04() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(o^, two: 2)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+            namedArgumentsWithTypes: {'one': 'bool'}, includeComma: false);
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_05() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(o^ , two: 2)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+            namedArgumentsWithTypes: {'one': 'bool'}, includeComma: false);
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_06() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(^o,)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
+        );
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_07() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(^ two: 2)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+            namedArgumentsWithTypes: {'one': 'bool'}, includeComma: true);
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ,', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_08() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(^two: 2)',
+      check: () {
+        assertSuggestions(['one: ,']);
+      },
+    );
+  }
+
+  Future<void> test_named_09() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(^, two: 2)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool'},
+          includeComma: false,
+        );
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_10() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(^ , two: 2)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool'},
+        );
+      },
+    );
+  }
+
+  Future<void> test_named_11() async {
+    await _tryParametersArguments(
+      parameters: '(int one, {bool two, int three})',
+      arguments: '(1, ^, three: 3)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'two': 'bool'},
+        );
+      },
+    );
+  }
+
+  Future<void> test_named_12() async {
+    await _tryParametersArguments(
+      parameters: '(int one, {bool two, int three})',
+      arguments: '(1, ^ three: 3)',
+      check: () {
+        assertSuggestions(['two: ,']);
+      },
+    );
+  }
+
+  Future<void> test_named_13() async {
+    await _tryParametersArguments(
+      parameters: '(int one, {bool two, int three})',
+      arguments: '(1, ^three: 3)',
+      check: () {
+        assertSuggestions(['two: ,']);
+      },
+    );
+  }
+
+  @failingTest
+  Future<void> test_named_14() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(two: 2^)',
+      check: () {
+        assertSuggestions([', one: ']);
+      },
+    );
+  }
+
+  @failingTest
+  Future<void> test_named_15() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(two: 2 ^)',
+      check: () {
+        assertSuggestions([', one: ']);
+      },
+    );
+  }
+
+  Future<void> test_named_16() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(two: 2, ^)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool'},
+        );
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_17() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(two: 2, o^)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool'},
+        );
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_18() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(two: 2, o^,)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool'},
+        );
+        assertSuggestArgumentAndCompletion('one',
+            completion: 'one: ', selectionOffset: 5);
+      },
+    );
+  }
+
+  Future<void> test_named_19() async {
+    await _tryParametersArguments(
+      parameters: '(int one, int two, int three, {int four, int five})',
+      arguments: '(1, ^, 3)',
+      check: () {
+        assertSuggestions(['four: ', 'five: ']);
+      },
+    );
+  }
+
+  Future<void> test_named_20() async {
+    await _tryParametersArguments(
+      languageVersion: '2.15',
+      parameters: '(int one, int two, int three, {int four, int five})',
+      arguments: '(1, ^, 3)',
+      check: () {
+        assertNoSuggestions();
+      },
+    );
+  }
+
+  Future<void> test_named_21() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(o^: false)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'one': 'bool', 'two': 'int'},
+          includeColon: false,
+        );
+      },
+    );
+  }
+
+  Future<void> test_named_22() async {
+    await _tryParametersArguments(
+      parameters: '(bool one, {int two, double three})',
+      arguments: '(false, ^t: 2)',
+      check: () {
+        assertSuggestions(['two: ,', 'three: ,']);
+      },
+    );
+  }
+
+  Future<void> test_named_23() async {
+    await _tryParametersArguments(
+      parameters: '(bool one, {int two, double three})',
+      arguments: '(false, ^: 2)',
+      check: () {
+        assertSuggestArgumentsAndTypes(
+          namedArgumentsWithTypes: {'two': 'int', 'three': 'double'},
+        );
+      },
+    );
+  }
+
+  Future<void> test_named_24() async {
+    await _tryParametersArguments(
+      parameters: '({bool one, int two})',
+      arguments: '(one: ^)',
+      check: () {
+        assertNoSuggestions();
+      },
+    );
+  }
+
+  Future<void> _tryParametersArguments({
+    String? languageVersion,
+    required String parameters,
+    required String arguments,
+    required void Function() check,
+  }) async {
+    var languageVersionLine = languageVersion != null
+        ? '// @dart = $languageVersion'
+        : '// no language version override';
+
+    // Annotation, local class.
+    addTestSource2('''
+$languageVersionLine
 class A {
-  final bool field1;
-  final int field2;
-  A({this.field1, this.field2});
+  const A$parameters;
+}
+@A$arguments
+void f() {}
+''');
+    await computeSuggestions();
+    check();
+
+    // Annotation, imported class.
+    newFile('$testPackageLibPath/a.dart', content: '''
+class A {
+  const A$parameters;
+}
+''');
+    addTestSource2('''
+$languageVersionLine
+import 'a.dart';
+@A$arguments
+void f() {}
+''');
+    await computeSuggestions();
+    check();
+
+    // Annotation, imported class, prefixed.
+    newFile('$testPackageLibPath/a.dart', content: '''
+class A {
+  const A$parameters;
+}
+''');
+    addTestSource2('''
+$languageVersionLine
+import 'a.dart' as p;
+@p.A$arguments
+void f() {}
+''');
+    await computeSuggestions();
+    check();
+
+    // Function expression invocation.
+    addTestSource2('''
+$languageVersionLine
+import 'a.dart';
+void f$parameters() {}
+var v = (f)$arguments;
+''');
+    await computeSuggestions();
+    check();
+
+    // Instance creation, local class, generative.
+    addTestSource2('''
+$languageVersionLine
+class A {
+  A$parameters;
+}
+var v = A$arguments;
+''');
+    await computeSuggestions();
+    check();
+
+    // Instance creation, imported class, generative.
+    newFile('$testPackageLibPath/a.dart', content: '''
+class A {
+  A$parameters;
+}
+''');
+    addTestSource2('''
+$languageVersionLine
+import 'a.dart';
+var v = A$arguments;
+''');
+    await computeSuggestions();
+    check();
+
+    // Instance creation, imported class, factory.
+    newFile('$testPackageLibPath/a.dart', content: '''
+class A {
+  factory A$parameters => throw 0;
+}
+''');
+    addTestSource2('''
+$languageVersionLine
+import 'a.dart';
+var v = A$arguments;
+''');
+    await computeSuggestions();
+    check();
+
+    // Method invocation, local method.
+    addTestSource2('''
+$languageVersionLine
+class A {
+  void foo$parameters() {}
+}
+var v = A().foo$arguments;
+''');
+    await computeSuggestions();
+    check();
+
+    // Method invocation, local function.
+    addTestSource2('''
+$languageVersionLine
+void f$parameters() {}
+var v = f$arguments;
+''');
+    await computeSuggestions();
+    check();
+
+    // Method invocation, imported function.
+    newFile('$testPackageLibPath/a.dart', content: '''
+void f$parameters() {}
+''');
+    addTestSource2('''
+$languageVersionLine
+import 'a.dart';
+var v = f$arguments;
+''');
+    await computeSuggestions();
+    check();
+
+    // Super constructor invocation.
+    addTestSource2('''
+$languageVersionLine
+class A {
+  A$parameters;
 }
 class B extends A {
-  B() : super(^);
+  B() : super$arguments;
 }
 ''');
     await computeSuggestions();
-    assertSuggestArgumentsAndTypes(
-        namedArgumentsWithTypes: {'field1': 'bool', 'field2': 'int'});
+    check();
+
+    // This constructor invocation.
+    addTestSource2('''
+$languageVersionLine
+class A {
+  A$parameters;
+  A.named() : this$arguments;
+}
+''');
+    await computeSuggestions();
+    check();
+
+    // Invalid: getter invocation.
+    // Parameters not used. Check not used.
+    addTestSource2('''
+$languageVersionLine
+int get foo => 0;
+var v = foo$arguments;
+''');
+    await computeSuggestions();
+    assertNoSuggestions();
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/closure_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/closure_contributor_test.dart
new file mode 100644
index 0000000..21a2ef7
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/closure_contributor_test.dart
@@ -0,0 +1,154 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/closure_contributor.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'completion_contributor_util.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ClosureContributorTest);
+  });
+}
+
+@reflectiveTest
+class ClosureContributorTest extends DartCompletionContributorTest {
+  @override
+  DartCompletionContributor createContributor(
+    DartCompletionRequest request,
+    SuggestionBuilder builder,
+  ) {
+    return ClosureContributor(request, builder);
+  }
+
+  Future<void> test_argumentList_named() async {
+    addTestSource(r'''
+void f({void Function(int a, String b) closure}) {}
+
+void main() {
+  f(closure: ^);
+}
+''');
+    await computeSuggestions();
+
+    assertSuggest(
+      '(a, b) => ,',
+      selectionOffset: 10,
+    );
+
+    assertSuggest(
+      '''
+(a, b) {
+${' ' * 4}
+${' ' * 2}},''',
+      selectionOffset: 13,
+    );
+  }
+
+  Future<void> test_argumentList_named_hasComma() async {
+    addTestSource(r'''
+void f({void Function(int a, String b) closure}) {}
+
+void main() {
+  f(
+    closure: ^,
+  );
+}
+''');
+    await computeSuggestions();
+
+    assertSuggest(
+      '(a, b) => ',
+      selectionOffset: 10,
+    );
+
+    assertSuggest(
+      '''
+(a, b) {
+${' ' * 6}
+${' ' * 4}}''',
+      selectionOffset: 15,
+    );
+  }
+
+  Future<void> test_argumentList_positional() async {
+    addTestSource(r'''
+void f(void Function(int a, int b) closure) {}
+
+void main() {
+  f(^);
+}
+''');
+    await computeSuggestions();
+
+    assertSuggest(
+      '(a, b) => ,',
+      selectionOffset: 10,
+    );
+  }
+
+  Future<void> test_argumentList_positional_hasComma() async {
+    addTestSource(r'''
+void f(void Function(int a, int b) closure) {}
+
+void main() {
+  f(^,);
+}
+''');
+    await computeSuggestions();
+
+    assertSuggest(
+      '(a, b) => ',
+      selectionOffset: 10,
+    );
+  }
+
+  Future<void> test_parameters_optionalNamed() async {
+    addTestSource(r'''
+void f({void Function(int a, {int b, int c}) closure}) {}
+
+void main() {
+  f(closure: ^);
+}
+''');
+    await computeSuggestions();
+
+    assertSuggest(
+      '(a, {b, c}) => ,',
+      selectionOffset: 15,
+    );
+  }
+
+  Future<void> test_parameters_optionalPositional() async {
+    addTestSource(r'''
+void f({void Function(int a, [int b, int c]) closure]) {}
+
+void main() {
+  f(closure: ^);
+}
+''');
+    await computeSuggestions();
+
+    assertSuggest(
+      '(a, [b, c]) => ,',
+      selectionOffset: 15,
+    );
+  }
+
+  Future<void> test_variableInitializer() async {
+    addTestSource(r'''
+void Function(int a, int b) v = ^;
+''');
+    await computeSuggestions();
+
+    assertSuggest(
+      '(a, b) => ',
+      selectionOffset: 10,
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index 3099fcf..a04f0be 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
@@ -41,17 +41,17 @@
 
   Future<void> test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
       library libAB;
       part "ab_part.dart";
       class A { }
       class B { }''');
-    addSource('/home/test/lib/ab_part.dart', '''
+    addSource('$testPackageLibPath/ab_part.dart', '''
       part of libAB;
       var T1;
       PB F1() => new PB();
       class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
       class C { }
       class D { }''');
     addTestSource('''
@@ -81,20 +81,20 @@
 
   Future<void> test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
       library libAB;
       part "ab_part.dart";
       class A { }
       class B { }
       class _AB''');
-    addSource('/home/test/lib/ab_part.dart', '''
+    addSource('$testPackageLibPath/ab_part.dart', '''
       part of libAB;
       var T1;
       PB F1() => new PB();
       typedef PB2 F2(int blat);
       class Clz = Object with Object;
       class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
       class C { }
       class D { }''');
     addTestSource('''
@@ -129,11 +129,11 @@
   }
 
   Future<void> test_Combinator_show_export_withShow() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 class B {}
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 export 'a.dart' show A;
 ''');
     addTestSource(r'''
@@ -152,10 +152,10 @@
   }
 
   Future<void> test_Combinator_show_recursive() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {}
 ''');
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 export 'a.dart';
 export 'b.dart';
 class B {}
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 4926490..0485895 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -5,7 +5,6 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'
     show DartCompletionRequest;
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -105,6 +104,19 @@
     addSource(testFile, content);
   }
 
+  /// A variant of [addTestSource] that can be invoked more than once,
+  /// and will notify the driver that the file changed.
+  void addTestSource2(String content) {
+    _completionOffset = content.indexOf('^');
+    expect(_completionOffset, greaterThanOrEqualTo(0), reason: 'missing ^');
+    var nextOffset = content.indexOf('^', _completionOffset + 1);
+    expect(nextOffset, equals(-1), reason: 'too many ^');
+    content = content.substring(0, _completionOffset) +
+        content.substring(_completionOffset + 1);
+    addSource(testFile, content);
+    driverFor(testFile).changeFile(testFile);
+  }
+
   void assertCoreTypeSuggestions() {
     assertSuggest('Comparable');
     assertSuggest('Comparator');
@@ -530,24 +542,21 @@
 
   Future computeSuggestions({int times = 200}) async {
     result = await session.getResolvedUnit(testFile) as ResolvedUnitResult;
-    return await CompletionPerformance().runRequestOperation(
-      (performance) async {
-        // Build the request
-        var request = DartCompletionRequest(
-          resolvedUnit: result,
-          offset: completionOffset,
-          dartdocDirectiveInfo: dartdocInfo,
-        );
 
-        var range = request.target.computeReplacementRange(request.offset);
-        replacementOffset = range.offset;
-        replacementLength = range.length;
-
-        // Request completions
-        suggestions = await computeContributedSuggestions(request);
-        expect(suggestions, isNotNull, reason: 'expected suggestions');
-      },
+    // Build the request
+    var request = DartCompletionRequest.forResolvedUnit(
+      resolvedUnit: result,
+      offset: completionOffset,
+      dartdocDirectiveInfo: dartdocInfo,
     );
+
+    var range = request.target.computeReplacementRange(request.offset);
+    replacementOffset = range.offset;
+    replacementLength = range.length;
+
+    // Request completions
+    suggestions = await computeContributedSuggestions(request);
+    expect(suggestions, isNotNull, reason: 'expected suggestions');
   }
 
   Never failedCompletion(String message,
@@ -613,7 +622,7 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = convertPath('/home/test/lib/test.dart');
+    testFile = convertPath('$testPackageLibPath/test.dart');
   }
 
   CompletionSuggestion suggestionWith(
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index 972198c..be920e7 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
@@ -52,12 +52,12 @@
     // Build the request
     var resolvedUnit =
         await session.getResolvedUnit(testFile) as ResolvedUnitResult;
-    request = DartCompletionRequest(
+    request = DartCompletionRequest.forResolvedUnit(
       resolvedUnit: resolvedUnit,
       offset: completionOffset,
     );
 
-    var directives = request.target.unit.directives;
+    var directives = resolvedUnit.unit.directives;
 
     var imports = request.libraryElement.imports;
     expect(imports, hasLength(directives.length + 1));
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 6f277c3..534635b 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
@@ -36,7 +36,7 @@
 class ImportedReferenceContributorTest extends DartCompletionContributorTest
     with ImportedReferenceContributorMixin {
   Future<void> test_Annotation_typeArguments() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class C {}
 typedef T1 = void Function();
 typedef T2 = List<int>;
@@ -67,7 +67,7 @@
   Future<void> test_ArgDefaults_function_with_required_named() async {
     writeTestPackageConfig(meta: true);
 
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib B;
 import 'package:meta/meta.dart';
 
@@ -85,7 +85,7 @@
 
   Future<void> test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -110,7 +110,7 @@
 
   Future<void> test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         expect(arg) { }
@@ -137,7 +137,7 @@
   Future<void>
       test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -167,7 +167,7 @@
 
   Future<void> test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         typedef Funct();
         class A { A(Funct f) { } }
@@ -198,7 +198,7 @@
 
   Future<void> test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -224,7 +224,7 @@
 
   Future<void> test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -250,7 +250,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -280,7 +280,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -309,7 +309,7 @@
   Future<void> test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }''');
     addTestSource('''
@@ -331,7 +331,7 @@
   }
 
   Future<void> test_AsExpression() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
         class A {var b; X _c; foo() {var a; (a as ^).foo();}''');
 
@@ -351,8 +351,8 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  AsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  AsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
           foo() { }
           class A {} class B extends A {} class C extends B {}
           class X {X.c(); X._d(); z() {}}''');
@@ -378,8 +378,8 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  AsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  AsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
           foo() { }
           class A {} class B implements A {} class C implements B {}
           class X {X.c(); X._d(); z() {}}''');
@@ -423,7 +423,7 @@
   }
 
   Future<void> test_AssignmentExpression_type() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -446,7 +446,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -468,7 +468,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -491,7 +491,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -528,7 +528,7 @@
   }
 
   Future<void> test_AwaitExpression_function() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 Future y() async {return 0;}
 ''');
     addTestSource('''
@@ -548,7 +548,7 @@
 
   Future<void> test_AwaitExpression_inherited() async {
     // SimpleIdentifier  AwaitExpression  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A {
   Future y() async { return 0; }
@@ -602,21 +602,21 @@
 
   Future<void> test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -657,7 +657,7 @@
     assertNotSuggested('x');
     assertNotSuggested('partT8');
 
-    assertSuggestClass('A', elemFile: '/home/test/lib/ab.dart');
+    assertSuggestClass('A', elemFile: '$testPackageLibPath/ab.dart');
     if (suggestConstructorsWithoutNew) {
       assertSuggestConstructor('A');
     }
@@ -705,21 +705,21 @@
 
   Future<void> test_Block_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -818,21 +818,21 @@
 
   Future<void> test_Block_final_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -919,21 +919,21 @@
 
   Future<void> test_Block_final_var() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -1017,21 +1017,21 @@
   }
 
   Future<void> test_Block_identifier_partial() async {
-    resolveSource('/home/test/lib/ab.dart', '''
+    resolveSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class DF { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         class D3 { }
         int T3;
@@ -1094,7 +1094,7 @@
 
   Future<void> test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
         class E extends F { var e1; e2() { } }
@@ -1148,21 +1148,21 @@
   }
 
   Future<void> test_Block_local_function() async {
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -1200,21 +1200,21 @@
 
   Future<void> test_Block_partial_results() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
@@ -1252,7 +1252,7 @@
 
   Future<void> test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import 'b.dart';
@@ -1277,7 +1277,7 @@
 
   Future<void> test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import 'b.dart';
@@ -1300,7 +1300,7 @@
 
   Future<void> test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import 'b.dart';
@@ -1342,7 +1342,7 @@
   }
 
   Future<void> test_CatchClause_onType() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^ {}}}');
 
     await computeSuggestions();
@@ -1355,7 +1355,7 @@
   }
 
   Future<void> test_CatchClause_onType_noBrackets() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^}}');
 
     await computeSuggestions();
@@ -1395,7 +1395,7 @@
 
   Future<void> test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1420,7 +1420,7 @@
 
   Future<void> test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1441,7 +1441,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1462,7 +1462,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as Soo;
@@ -1483,7 +1483,7 @@
 
   Future<void> test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1504,7 +1504,7 @@
 
   Future<void> test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1525,7 +1525,7 @@
 
   Future<void> test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         library libAB;
         part 'partAB.dart';
         class A { }
@@ -1535,7 +1535,7 @@
         var T1;
         PB F1() => new PB();
         class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         class C { }
         class D { }''');
     addTestSource('''
@@ -1549,7 +1549,7 @@
 
   Future<void> test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
         library libAB;
         part 'partAB.dart';
         class A { }
@@ -1561,7 +1561,7 @@
         typedef PB2 F2(int blat);
         class Clz = Object with Object;
         class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
         class C { }
         class D { }''');
     addTestSource('''
@@ -1575,7 +1575,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1595,7 +1595,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1624,7 +1624,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1644,7 +1644,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1673,7 +1673,7 @@
 
   Future<void> test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1692,9 +1692,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -1717,9 +1717,9 @@
   }
 
   Future<void> test_ConstructorName_importedFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -1742,7 +1742,7 @@
   }
 
   Future<void> test_ConstructorName_importedFactory2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         void f() {new String.fr^omCharCodes([]);}''');
@@ -1760,7 +1760,7 @@
   }
 
   Future<void> test_ConstructorName_localClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -1781,7 +1781,7 @@
   }
 
   Future<void> test_ConstructorName_localFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -1820,7 +1820,7 @@
   }
 
   Future<void> test_doc_class() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 library A;
 /// My class.
 /// Short description.
@@ -1842,7 +1842,7 @@
   }
 
   Future<void> test_doc_function() async {
-    resolveSource('/home/test/lib/a.dart', r'''
+    resolveSource('$testPackageLibPath/a.dart', r'''
 library A;
 /// My function.
 /// Short description.
@@ -1861,7 +1861,7 @@
   }
 
   Future<void> test_doc_function_c_style() async {
-    resolveSource('/home/test/lib/a.dart', r'''
+    resolveSource('$testPackageLibPath/a.dart', r'''
 library A;
 /**
  * My function.
@@ -1882,7 +1882,7 @@
   }
 
   Future<void> test_enum() async {
-    addSource('/home/test/lib/a.dart', 'library A; enum E { one, two }');
+    addSource('$testPackageLibPath/a.dart', 'library A; enum E { one, two }');
     addTestSource('import "a.dart"; void f() {^}');
     await computeSuggestions();
     assertSuggestEnum('E');
@@ -1891,8 +1891,8 @@
   }
 
   Future<void> test_enum_deprecated() async {
-    addSource(
-        '/home/test/lib/a.dart', 'library A; @deprecated enum E { one, two }');
+    addSource('$testPackageLibPath/a.dart',
+        'library A; @deprecated enum E { one, two }');
     addTestSource('import "a.dart"; void f() {^}');
     await computeSuggestions();
     // TODO(danrube) investigate why suggestion/element is not deprecated
@@ -1903,7 +1903,7 @@
   }
 
   Future<void> test_enum_filter() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 enum E { one, two }
 enum F { three, four }
 ''');
@@ -1929,7 +1929,7 @@
 
   Future<void> test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         _B F1() { }
         class A {int x;}
         class _B { }''');
@@ -1959,7 +1959,7 @@
 
   Future<void> test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
@@ -1971,7 +1971,7 @@
   }
 
   Future<void> test_ExtendsClause() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -1982,7 +1982,7 @@
   }
 
   Future<void> test_ExtensionDeclaration_extendedType() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -1994,7 +1994,7 @@
   }
 
   Future<void> test_ExtensionDeclaration_extendedType2() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -2006,7 +2006,7 @@
   }
 
   Future<void> test_ExtensionDeclaration_member() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -2019,7 +2019,7 @@
   Future<void> test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {A ^}''');
@@ -2031,7 +2031,7 @@
   Future<void> test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {var ^}''');
@@ -2043,7 +2043,7 @@
   Future<void> test_FieldDeclaration_type() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {^ foo;) ''');
@@ -2056,7 +2056,7 @@
   Future<void> test_FieldDeclaration_type_after_comment1() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {
@@ -2072,7 +2072,7 @@
   Future<void> test_FieldDeclaration_type_after_comment2() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {
@@ -2088,7 +2088,7 @@
   Future<void> test_FieldDeclaration_type_after_comment3() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {
@@ -2104,7 +2104,7 @@
   Future<void> test_FieldDeclaration_type_without_semicolon() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         class C {^ foo} ''');
@@ -2287,7 +2287,7 @@
   }
 
   Future<void> test_function_parameters_mixed_required_and_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 int m(x, {int y}) {}
 ''');
     addTestSource('''
@@ -2310,7 +2310,7 @@
   }
 
   Future<void> test_function_parameters_mixed_required_and_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, [int y]) {}
 ''');
     addTestSource('''
@@ -2333,7 +2333,7 @@
   }
 
   Future<void> test_function_parameters_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m({x, int y}) {}
 ''');
     addTestSource('''
@@ -2357,7 +2357,7 @@
 
   Future<void> test_function_parameters_nnbd_required() async {
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(int? nullable, int nonNullable) {}
 ''');
     addTestSource('''
@@ -2380,7 +2380,7 @@
 
   Future<void> test_function_parameters_nnbd_required_into_legacy() async {
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(int? nullable, int nonNullable) {}
 ''');
     addTestSource('''
@@ -2404,7 +2404,7 @@
 
   Future<void> test_function_parameters_nnbd_required_legacy() async {
     createAnalysisOptionsFile(experiments: [EnableString.non_nullable]);
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 // @dart = 2.8
 void m(int param) {}
 ''');
@@ -2425,7 +2425,7 @@
   }
 
   Future<void> test_function_parameters_none() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m() {}
 ''');
     addTestSource('''
@@ -2444,7 +2444,7 @@
   }
 
   Future<void> test_function_parameters_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m([x, int y]) {}
 ''');
     addTestSource('''
@@ -2467,7 +2467,7 @@
   }
 
   Future<void> test_function_parameters_required() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, int y) {}
 ''');
     addTestSource('''
@@ -2491,7 +2491,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2522,7 +2522,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2553,7 +2553,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2600,7 +2600,7 @@
   }
 
   Future<void> test_functionTypeAlias_genericTypeAlias() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef F = void Function();
 ''');
     addTestSource(r'''
@@ -2616,7 +2616,7 @@
   }
 
   Future<void> test_functionTypeAlias_old() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef void F();
 ''');
     addTestSource(r'''
@@ -2697,7 +2697,7 @@
   }
 
   Future<void> test_implementsClause() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
     addTestSource('''
 import 'a.dart';
 
@@ -2708,7 +2708,7 @@
   }
 
   Future<void> test_implicitCreation() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   A.a1();
   A.a2();
@@ -2748,7 +2748,7 @@
 
   Future<void> test_IndexExpression() async {
     // ExpressionStatement  Block
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -2777,7 +2777,7 @@
 
   Future<void> test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -2796,7 +2796,7 @@
   }
 
   Future<void> test_InstanceCreationExpression() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {foo(){var f; {var x;}}}
 class B {B(this.x, [String boo]) { } int x;}
 class C {C.bar({boo: 'hoo', int z: 0}) { } }''');
@@ -2850,7 +2850,7 @@
   }
 
   Future<void> test_InstanceCreationExpression_abstractClass() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 abstract class A {
   A();
   A.generative();
@@ -2873,7 +2873,7 @@
 
   Future<void>
       test_InstanceCreationExpression_abstractClass_implicitConstructor() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 abstract class A {}
 ''');
     addTestSource('''
@@ -2889,7 +2889,7 @@
   }
 
   Future<void> test_InstanceCreationExpression_filter() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {}
 class B extends A {}
 class C implements A {}
@@ -2911,8 +2911,8 @@
   }
 
   Future<void> test_InstanceCreationExpression_imported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/home/test/lib/a.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {A(this.x) { } int x;}''');
@@ -2954,8 +2954,8 @@
   }
 
   Future<void> test_InstanceCreationExpression_unimported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/home/test/lib/ab.dart', 'class Clip { }');
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
+    addSource('$testPackageLibPath/ab.dart', 'class Clip { }');
     addTestSource('class A {foo(){new C^}}');
 
     await computeSuggestions();
@@ -2979,7 +2979,7 @@
 
   Future<void> test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3013,7 +3013,7 @@
 
   Future<void> test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3087,8 +3087,8 @@
   }
 
   Future<void> test_IsExpression() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class X {X.c(); X._d(); z() {}}''');
@@ -3127,7 +3127,7 @@
   }
 
   Future<void> test_IsExpression_type() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
         class A {int x; int y() => 0;}
         void f(){var a; if (a is ^)}''');
@@ -3142,7 +3142,7 @@
   }
 
   Future<void> test_IsExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
         class A {int x; int y() => 0;}
         void f(){var a; if (a is Obj^)}''');
@@ -3162,8 +3162,8 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
         foo() { }
         class A {} class B extends A {} class C extends B {}
         class X {X.c(); X._d(); z() {}}''');
@@ -3189,8 +3189,8 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
         foo() { }
         class A {} class B implements A {} class C implements B {}
         class X {X.c(); X._d(); z() {}}''');
@@ -3211,7 +3211,7 @@
   }
 
   Future<void> test_keyword() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
         lib B;
         int newT1;
         int T1;
@@ -3272,7 +3272,7 @@
 
   Future<void> test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3310,7 +3310,7 @@
 
   Future<void> test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3337,7 +3337,7 @@
 
   Future<void> test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3358,7 +3358,7 @@
   }
 
   Future<void> test_method_parameters_mixed_required_and_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, {int y}) {}
 ''');
     addTestSource('''
@@ -3381,7 +3381,7 @@
   }
 
   Future<void> test_method_parameters_mixed_required_and_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, [int y]) {}
 ''');
     addTestSource('''
@@ -3404,7 +3404,7 @@
   }
 
   Future<void> test_method_parameters_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m({x, int y}) {}
 ''');
     addTestSource('''
@@ -3427,7 +3427,7 @@
   }
 
   Future<void> test_method_parameters_none() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m() {}
 ''');
     addTestSource('''
@@ -3446,7 +3446,7 @@
   }
 
   Future<void> test_method_parameters_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m([x, int y]) {}
 ''');
     addTestSource('''
@@ -3469,7 +3469,7 @@
   }
 
   Future<void> test_method_parameters_required() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 void m(x, int y) {}
 ''');
     addTestSource('''
@@ -3505,7 +3505,7 @@
 
   Future<void> test_MethodDeclaration_body_static() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/c.dart', '''
+    addSource('$testPackageLibPath/c.dart', '''
         class C {
           c1() {}
           var c2;
@@ -3591,7 +3591,7 @@
 
   Future<void> test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3621,7 +3621,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3651,7 +3651,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3681,7 +3681,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3745,7 +3745,7 @@
   }
 
   Future<void> test_MethodTypeArgumentList() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {}
 class B {}
 ''');
@@ -3786,7 +3786,7 @@
   }
 
   Future<void> test_mixin_ordering() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class B {}
 class M1 {
   void m() {}
@@ -3820,7 +3820,7 @@
   }
 
   Future<void> test_no_parameters_field() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int x;
 ''');
     addTestSource('''
@@ -3835,7 +3835,7 @@
   }
 
   Future<void> test_no_parameters_getter() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 int get x => null;
 ''');
     addTestSource('''
@@ -3850,7 +3850,7 @@
   }
 
   Future<void> test_no_parameters_setter() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 set x(int value) {};
 ''');
     addTestSource('''
@@ -3872,7 +3872,7 @@
   }
 
   Future<void> test_partFile_TypeName() async {
-    // SimpleIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  NamedType  ConstructorName
     addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
@@ -3909,13 +3909,13 @@
   }
 
   Future<void> test_partFile_TypeName2() async {
-    // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName
+    addSource('$testPackageLibPath/b.dart', '''
         lib libB;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         part of libA;
         class B { }''');
     addTestSource('''
@@ -3945,7 +3945,7 @@
 
   Future<void> test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -3992,7 +3992,7 @@
 
   Future<void> test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {X get f => new A();get _g => new A();}
         class A implements I {
@@ -4071,7 +4071,7 @@
 
   Future<void> test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -4097,8 +4097,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -4124,8 +4124,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -4152,7 +4152,7 @@
 
   Future<void> test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
@@ -4171,7 +4171,7 @@
 
   Future<void> test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
@@ -4317,7 +4317,7 @@
 
   Future<void> test_PropertyAccess_noTarget() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/home/test/lib/ab.dart', 'class Foo { }');
+    addSource('$testPackageLibPath/ab.dart', 'class Foo { }');
     addTestSource('class C {foo(){.^}}');
 
     await computeSuggestions();
@@ -4326,7 +4326,7 @@
 
   Future<void> test_PropertyAccess_noTarget2() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/home/test/lib/ab.dart', 'class Foo { }');
+    addSource('$testPackageLibPath/ab.dart', 'class Foo { }');
     addTestSource('void f() {.^}');
 
     await computeSuggestions();
@@ -4598,7 +4598,7 @@
   Future<void> test_TopLevelVariableDeclaration_type() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         ^ foo; ''');
@@ -4611,7 +4611,7 @@
   Future<void> test_TopLevelVariableDeclaration_type_after_comment1() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         // comment
@@ -4625,7 +4625,7 @@
   Future<void> test_TopLevelVariableDeclaration_type_after_comment2() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         /* comment */
@@ -4639,7 +4639,7 @@
   Future<void> test_TopLevelVariableDeclaration_type_after_comment3() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         /// some dartdoc
@@ -4653,7 +4653,7 @@
   Future<void> test_TopLevelVariableDeclaration_type_without_semicolon() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // TopLevelVariableDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import 'a.dart';
         ^ foo ''');
@@ -4730,7 +4730,7 @@
 
   Future<void> test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
@@ -4756,8 +4756,8 @@
   }
 
   Future<void> test_TypeArgumentList2() async {
-    // TypeName  TypeArgumentList  TypeName
-    addSource('/home/test/lib/a.dart', '''
+    // NamedType  TypeArgumentList  NamedType
+    addSource('$testPackageLibPath/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
@@ -4795,10 +4795,10 @@
   }
 
   Future<void> test_TypeArgumentList_recursive() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {}
 ''');
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 export 'a.dart';
 export 'b.dart';
 class B {}
@@ -4817,7 +4817,7 @@
   Future<void> test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class _B { }
@@ -4844,7 +4844,7 @@
   Future<void> test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class _B { }
@@ -4869,7 +4869,7 @@
   Future<void> test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo1() { }
         void bar1() { }
@@ -4898,7 +4898,7 @@
   }
 
   Future<void> test_withClause_mixin() async {
-    newFile('/home/test/lib/a.dart', content: 'mixin M {}');
+    newFile('$testPackageLibPath/a.dart', content: 'mixin M {}');
     addTestSource('''
 import 'a.dart';
 
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index 5c1db88..d9dc05e 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -29,7 +29,7 @@
 
   Future<void> test_extension() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 extension MyExt on int {}
 ''');
     addTestSource('''
@@ -134,7 +134,7 @@
 
   Future<void> test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -158,11 +158,11 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_export_withShow() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 class B {}
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 export 'a.dart' show A;
 ''');
     addTestSource(r'''
@@ -177,7 +177,7 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_import_withShow() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 class B {}
 ''');
@@ -224,7 +224,7 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
     newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
@@ -257,7 +257,7 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
     newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         var T1;
diff --git a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
index aa2e6a2..34904db 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
@@ -45,21 +45,21 @@
 
   Future<void> test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -186,7 +186,7 @@
 
   Future<void> test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -201,7 +201,7 @@
 
   Future<void> test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -216,7 +216,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -231,7 +231,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as Soo;
@@ -246,7 +246,7 @@
 
   Future<void> test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -261,7 +261,7 @@
 
   Future<void> test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -275,7 +275,7 @@
   }
 
   Future<void> test_InstanceCreationExpression() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {foo(){var f; {var x;}}}
 class B {B(this.x, [String boo]) { } int x;}
 class C {C.bar({boo: 'hoo', int z: 0}) { } }''');
@@ -294,11 +294,11 @@
   }
 
   Future<void> test_InstanceCreationExpression_inPart() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {foo(){var f; {var x;}}}
 class B {B(this.x, [String boo]) { } int x;}
 class C {C.bar({boo: 'hoo', int z: 0}) { } }''');
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 library testB;
 import "a.dart" as t;
 import "dart:math" as math;
@@ -313,11 +313,11 @@
   }
 
   Future<void> test_InstanceCreationExpression_inPart_detached() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {foo(){var f; {var x;}}}
 class B {B(this.x, [String boo]) { } int x;}
 class C {C.bar({boo: 'hoo', int z: 0}) { } }''');
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 library testB;
 import "a.dart" as t;
 import "dart:math" as math;
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index 3a6fa56..52c6b90 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -28,7 +28,7 @@
   }
 
   Future<void> test_partFile_Constructor() async {
-    // SimpleIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  NamedType  ConstructorName
     newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_partFile_Constructor2() async {
-    // SimpleIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  NamedType  ConstructorName
     newFile('$testPackageLibPath/b.dart', content: '''
         lib B;
         int T1;
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 6e7253d..804bc3a 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
@@ -81,7 +81,7 @@
 
   Future<void> test_ArgDefaults_inherited_method_with_required_named() async {
     writeTestPackageConfig(meta: true);
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 import 'package:meta/meta.dart';
 
 lib libB;
@@ -120,7 +120,7 @@
 
   Future<void> test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
@@ -145,7 +145,7 @@
 
   Future<void> test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 expect(arg) { }
@@ -172,7 +172,7 @@
   Future<void>
       test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
@@ -201,7 +201,7 @@
 
   Future<void> test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 typedef Funct();
 class A { A(Funct f) { } }
@@ -231,7 +231,7 @@
 
   Future<void> test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
@@ -257,7 +257,7 @@
 
   Future<void> test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
@@ -283,7 +283,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
@@ -314,7 +314,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_functionalArg2() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
@@ -350,7 +350,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
@@ -375,7 +375,7 @@
   }
 
   Future<void> test_ArgumentList_namedFieldParam_tear_off() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 typedef void VoidCallback();
 
 class Button {
@@ -406,7 +406,7 @@
   Future<void> test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library A;
 bool hasLength(int expected) { }''');
     addTestSource('''
@@ -452,7 +452,7 @@
   }
 
   Future<void> test_ArgumentList_namedParam_tear_off() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 typedef void VoidCallback();
 
 class Button {
@@ -480,7 +480,7 @@
   }
 
   Future<void> test_ArgumentList_namedParam_tear_off_1() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 typedef void VoidCallback();
 
 class Button {
@@ -508,7 +508,7 @@
   }
 
   Future<void> test_ArgumentList_namedParam_tear_off_2() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 typedef void VoidCallback();
 
 class Button {
@@ -536,7 +536,7 @@
   }
 
   Future<void> test_AsExpression_type() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
         class A {var b; X _c; foo() {var a; (a as ^).foo();}''');
     await computeSuggestions();
@@ -556,7 +556,7 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
 class A {} class B extends A {} class C extends A {} class D {}
 f(A a){ (a as ^) }''');
@@ -577,7 +577,7 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
 class A {} class B implements A {} class C implements A {} class D {}
 f(A a){ (a as ^) }''');
@@ -593,7 +593,7 @@
   }
 
   Future<void> test_AsExpression_type_filter_undefined_type() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
 class A {}
 f(U u){ (u as ^) }''');
@@ -628,7 +628,7 @@
   }
 
   Future<void> test_AssignmentExpression_type() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
 class A {} void f() {
@@ -652,7 +652,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
 class A {} void f() {
@@ -675,7 +675,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
 class A {} void f() {
@@ -699,7 +699,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
 class A {} void f() {
@@ -755,7 +755,7 @@
 
   Future<void> test_AwaitExpression_inherited() async {
     // SimpleIdentifier  AwaitExpression  ExpressionStatement
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A {
   Future y() async {return 0;}
@@ -812,21 +812,21 @@
 
   Future<void> test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -905,21 +905,21 @@
 
   Future<void> test_Block_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -1018,21 +1018,21 @@
 
   Future<void> test_Block_final_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -1117,21 +1117,21 @@
 
   Future<void> test_Block_final_var() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -1215,21 +1215,21 @@
   }
 
   Future<void> test_Block_identifier_partial() async {
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 class D3 { }
 int T3;
@@ -1294,7 +1294,7 @@
 
   Future<void> test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib B;
 class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
 class E extends F { var e1; e2() { } }
@@ -1322,7 +1322,7 @@
 
   Future<void> test_Block_inherited_imported_from_constructor() async {
     // Block  BlockFunctionBody  ConstructorDeclaration  ClassDeclaration
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
       lib B;
       class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
       class E extends F { var e1; e2() { } }
@@ -1349,7 +1349,7 @@
 
   Future<void> test_Block_inherited_imported_from_method() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
       lib B;
       class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
       class E extends F { var e1; e2() { } }
@@ -1448,21 +1448,21 @@
   }
 
   Future<void> test_Block_local_function() async {
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/home/test/lib/eef.dart', '''
+    addSource('$testPackageLibPath/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/home/test/lib/g.dart', 'class G { }');
-    addSource('/home/test/lib/h.dart', '''
+    addSource('$testPackageLibPath/g.dart', 'class G { }');
+    addSource('$testPackageLibPath/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
@@ -1526,7 +1526,7 @@
 
   Future<void> test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart";
@@ -1551,7 +1551,7 @@
 
   Future<void> test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart";
@@ -1574,7 +1574,7 @@
 
   Future<void> test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart";
@@ -1616,7 +1616,7 @@
   }
 
   Future<void> test_CatchClause_onType() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^ {}}}');
     await computeSuggestions();
 
@@ -1629,7 +1629,7 @@
   }
 
   Future<void> test_CatchClause_onType_noBrackets() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^}}');
     await computeSuggestions();
 
@@ -1680,7 +1680,7 @@
 
   Future<void> test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1709,7 +1709,7 @@
 
   Future<void> test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1730,7 +1730,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1751,7 +1751,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as Soo;
@@ -1772,7 +1772,7 @@
 
   Future<void> test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1793,7 +1793,7 @@
 
   Future<void> test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -1839,7 +1839,7 @@
 
   Future<void> test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 library libAB;
 part 'partAB.dart';
 class A { }
@@ -1849,7 +1849,7 @@
 var T1;
 PB F1() => new PB();
 class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 class C { }
 class D { }''');
     addTestSource('''
@@ -1863,7 +1863,7 @@
 
   Future<void> test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/home/test/lib/ab.dart', '''
+    addSource('$testPackageLibPath/ab.dart', '''
 library libAB;
 part 'partAB.dart';
 class A { }
@@ -1875,7 +1875,7 @@
 typedef PB2 F2(int blat);
 class Clz = Object with Object;
 class PB { }''');
-    addSource('/home/test/lib/cd.dart', '''
+    addSource('$testPackageLibPath/cd.dart', '''
 class C { }
 class D { }''');
     addTestSource('''
@@ -1889,7 +1889,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -1909,7 +1909,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -1935,7 +1935,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -1955,7 +1955,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -1981,7 +1981,7 @@
 
   Future<void> test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -2066,9 +2066,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 int T1;
 F1() { }
@@ -2091,9 +2091,9 @@
   }
 
   Future<void> test_ConstructorName_importedFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 int T1;
 F1() { }
@@ -2116,7 +2116,7 @@
   }
 
   Future<void> test_ConstructorName_importedFactory2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         void f() {new String.fr^omCharCodes([]);}''');
@@ -2134,7 +2134,7 @@
   }
 
   Future<void> test_ConstructorName_localClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
 int T1;
@@ -2155,7 +2155,7 @@
   }
 
   Future<void> test_ConstructorName_localFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
 int T1;
@@ -2572,7 +2572,7 @@
 
   Future<void> test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 _B F1() { }
 class A {int x;}
 class _B { }''');
@@ -2600,7 +2600,7 @@
 
   Future<void> test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
@@ -2670,7 +2670,7 @@
 
   Future<void> test_extensionDeclaration_notInBody() async {
     // ExtensionDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -2723,7 +2723,7 @@
   Future<void> test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import "a.dart";
         class C {A ^}''');
@@ -2735,7 +2735,7 @@
   Future<void> test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import "a.dart";
         class C {var ^}''');
@@ -3232,7 +3232,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -3263,7 +3263,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -3294,7 +3294,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -3560,7 +3560,7 @@
 
   Future<void> test_IndexExpression() async {
     // ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -3586,7 +3586,7 @@
 
   Future<void> test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
@@ -3611,7 +3611,7 @@
   }
 
   Future<void> test_inherited() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -3762,8 +3762,8 @@
   }
 
   Future<void> test_InstanceCreationExpression_imported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/home/test/lib/a.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 class A {A(this.x) { } int x;}''');
@@ -3822,7 +3822,7 @@
   }
 
   Future<void> test_InstanceCreationExpression_unimported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
     addSource('/testAB.dart', 'class Foo { }');
     addTestSource('class C {foo(){new F^}}');
     await computeSuggestions();
@@ -3865,7 +3865,7 @@
 
   Future<void> test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -3937,8 +3937,8 @@
   }
 
   Future<void> test_IsExpression() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 foo() { }
 class X {X.c(); X._d(); z() {}}''');
@@ -3977,7 +3977,7 @@
   }
 
   Future<void> test_IsExpression_type() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
 class A {int x; int y() => 0;}
 void f(){var a; if (a is ^)}''');
@@ -3997,7 +3997,7 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
 class A {} class B extends A {} class C extends A {} class D {}
 f(A a){ if (a is ^) {}}''');
@@ -4018,7 +4018,7 @@
     // suggesting types. We ought to do so because there's no reason to cast a
     // value to the type it already has.
 
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
 class A {} class B implements A {} class C implements A {} class D {}
 f(A a){ if (a is ^) {}}''');
@@ -4034,7 +4034,7 @@
   }
 
   Future<void> test_IsExpression_type_filter_undefined_type() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
 class A {}
 f(U u){ (u as ^) }''');
@@ -4046,7 +4046,7 @@
   }
 
   Future<void> test_IsExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
 class A {int x; int y() => 0;}
 void f(){var a; if (a is Obj^)}''');
@@ -4061,7 +4061,7 @@
   }
 
   Future<void> test_keyword() async {
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 int newT1;
 int T1;
@@ -4214,7 +4214,7 @@
 
   Future<void> test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4244,7 +4244,7 @@
 
   Future<void> test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4266,7 +4266,7 @@
 
   Future<void> test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4322,7 +4322,7 @@
   }
 
   Future<void> test_method_parameters_mixed_required_and_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m(x, {int y}) {}
 }
@@ -4369,7 +4369,7 @@
   }
 
   Future<void> test_method_parameters_mixed_required_and_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m(x, [int y]) {}
 }
@@ -4417,7 +4417,7 @@
   }
 
   Future<void> test_method_parameters_named() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m({x, int y}) {}
 }
@@ -4464,7 +4464,7 @@
   }
 
   Future<void> test_method_parameters_none() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m() {}
 }
@@ -4501,7 +4501,7 @@
   }
 
   Future<void> test_method_parameters_positional() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m([x, int y]) {}
 }
@@ -4548,7 +4548,7 @@
   }
 
   Future<void> test_method_parameters_required() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   void m(x, int y) {}
 }
@@ -4607,7 +4607,7 @@
 
   Future<void> test_MethodDeclaration_body_static() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/c.dart', '''
+    addSource('$testPackageLibPath/c.dart', '''
 class C {
   c1() {}
   var c2;
@@ -4784,7 +4784,7 @@
 
   Future<void> test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4814,7 +4814,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4844,7 +4844,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -4874,7 +4874,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
@@ -5008,7 +5008,7 @@
   }
 
   Future<void> test_mixin_ordering() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class B {}
 class M1 {
   void m() {}
@@ -5031,7 +5031,7 @@
 
   Future<void> test_MixinDeclaration_body() async {
     // MixinDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 class B { }''');
     addTestSource('''
 import "b.dart" as x;
@@ -5115,7 +5115,7 @@
   }
 
   Future<void> test_no_parameters_field() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   int x;
 }
@@ -5132,7 +5132,7 @@
   }
 
   Future<void> test_no_parameters_getter() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   int get x => null;
 }
@@ -5149,7 +5149,7 @@
   }
 
   Future<void> test_no_parameters_setter() async {
-    resolveSource('/home/test/lib/a.dart', '''
+    resolveSource('$testPackageLibPath/a.dart', '''
 class A {
   set x(int value) {};
 }
@@ -5166,7 +5166,7 @@
   }
 
   Future<void> test_outside_class() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -5253,7 +5253,7 @@
 
   Future<void> test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 class I {
   static const scI = 'boo';
@@ -5300,7 +5300,7 @@
 
   Future<void> test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 class I {X get f => new A();get _g => new A();}
 class A implements I {
@@ -5379,7 +5379,7 @@
 
   Future<void> test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 var T1;
 class X { }
@@ -5405,8 +5405,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 var T1;
 class X { }
@@ -5432,8 +5432,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 var T1;
 class X { }
@@ -5460,7 +5460,7 @@
 
   Future<void> test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 class _W {M y; var _z;}
 class X extends _W {}
@@ -5479,7 +5479,7 @@
 
   Future<void> test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {static int bar = 10;}
 _B() {}''');
     addTestSource('''
@@ -5643,7 +5643,7 @@
 
   Future<void> test_PropertyAccess_noTarget() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/home/test/lib/ab.dart', 'class Foo { }');
+    addSource('$testPackageLibPath/ab.dart', 'class Foo { }');
     addTestSource('class C {foo(){.^}}');
     await computeSuggestions();
 
@@ -5652,7 +5652,7 @@
 
   Future<void> test_PropertyAccess_noTarget2() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/home/test/lib/ab.dart', 'class Foo { }');
+    addSource('$testPackageLibPath/ab.dart', 'class Foo { }');
     addTestSource('void f() {.^}');
     await computeSuggestions();
 
@@ -5680,7 +5680,7 @@
   }
 
   Future<void> test_static_field() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -5722,7 +5722,7 @@
   }
 
   Future<void> test_static_method() async {
-    resolveSource('/home/test/lib/b.dart', '''
+    resolveSource('$testPackageLibPath/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -6107,7 +6107,7 @@
 
   Future<void> test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class C1 {int x;}
 F1() => 0;
 typedef String T1(int blat);''');
@@ -6133,8 +6133,8 @@
   }
 
   Future<void> test_TypeArgumentList2() async {
-    // TypeName  TypeArgumentList  TypeName
-    addSource('/home/test/lib/a.dart', '''
+    // NamedType  TypeArgumentList  NamedType
+    addSource('$testPackageLibPath/a.dart', '''
 class C1 {int x;}
 F1() => 0;
 typedef String T1(int blat);''');
@@ -6198,7 +6198,7 @@
   Future<void> test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 foo() { }
 class _B { }
@@ -6225,7 +6225,7 @@
   Future<void> test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 foo() { }
 class _B { }
@@ -6250,7 +6250,7 @@
   Future<void> test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 lib B;
 foo1() { }
 void bar1() { }
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index a671eeb..7c9b3d8 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
@@ -290,9 +290,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -318,9 +318,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass_unresolved() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -347,9 +347,9 @@
   }
 
   Future<void> test_ConstructorName_importedFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -375,7 +375,7 @@
   }
 
   Future<void> test_ConstructorName_importedFactory2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         main() {new String.fr^omCharCodes([]);}''');
@@ -395,7 +395,7 @@
   }
 
   Future<void> test_ConstructorName_localClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -422,7 +422,7 @@
   }
 
   Future<void> test_ConstructorName_localFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -450,7 +450,7 @@
 
   Future<void>
       test_importPrefix_className_typeArguments_period_nothing_functionTypeContext_matchingReturnType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A<T> {
   A.named();
   A.new();
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index e8eff71..0e65414 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -153,7 +153,7 @@
   }
 
   Future<void> test_fromPart() async {
-    addSource('/home/test/lib/myLib.dart', '''
+    addSource('$testPackageLibPath/myLib.dart', '''
 library myLib;
 part 'test.dart';
 part 'otherPart.dart';
@@ -162,7 +162,7 @@
   B suggested2(String y) => null;
 }
 ''');
-    addSource('/home/test/lib/otherPart.dart', '''
+    addSource('$testPackageLibPath/otherPart.dart', '''
 part of myLib;
 class B extends A {
   B suggested2(String y) => null;
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index e4bc0d3..7c2a610 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -28,7 +28,7 @@
   }
 
   Future<void> test_class_static_notPrivate() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   static int _f;
   static String get _g => '';
@@ -138,7 +138,7 @@
   }
 
   Future<void> test_extension_static_notPrivate() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 extension E {
   static int _f;
   static String get _g => '';
@@ -160,7 +160,7 @@
   }
 
   Future<void> test_implicitCreation() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   A.foo();
   A.bar();
@@ -181,7 +181,7 @@
 
   Future<void>
       test_implicitCreation_functionContextType_matchingReturnType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   A.foo();
   A.bar();
@@ -202,7 +202,7 @@
 
   Future<void>
       test_implicitCreation_functionContextType_notMatchingReturnType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   A.foo();
   A.bar();
@@ -365,7 +365,7 @@
 
   Future<void> test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -409,7 +409,7 @@
   }
 
   Future<void> test_simpleIdentifier_typeAlias_interfaceType_class() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   static int _privateField = 0;
   static int get _privateGetter => 0;
@@ -451,7 +451,7 @@
   }
 
   Future<void> test_simpleIdentifier_typeAlias_interfaceType_enum() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 enum E {
   aaa,
   _bbb,
diff --git a/pkg/analysis_server/test/services/completion/dart/test_all.dart b/pkg/analysis_server/test/services/completion/dart/test_all.dart
index c8ccce6..4ed7cd0 100644
--- a/pkg/analysis_server/test/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/test_all.dart
@@ -5,6 +5,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'arglist_contributor_test.dart' as arglist_test;
+import 'closure_contributor_test.dart' as closure_contributor;
 import 'combinator_contributor_test.dart' as combinator_test;
 import 'completion_manager_test.dart' as completion_manager;
 import 'extension_member_contributor_test.dart' as extension_member_contributor;
@@ -27,6 +28,7 @@
 void main() {
   defineReflectiveSuite(() {
     arglist_test.main();
+    closure_contributor.main();
     combinator_test.main();
     completion_manager.main();
     extension_member_contributor.main();
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index c7f9a18..47000b2 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -114,7 +114,7 @@
 
   Future<void> test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -138,7 +138,7 @@
 
   Future<void> test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         expect(arg) { }
@@ -164,7 +164,7 @@
   Future<void>
       test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -191,7 +191,7 @@
 
   Future<void> test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         typedef Funct();
         class A { A(Funct f) { } }
@@ -219,7 +219,7 @@
 
   Future<void> test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -244,7 +244,7 @@
 
   Future<void> test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
@@ -269,7 +269,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -296,7 +296,7 @@
 
   Future<void> test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
@@ -322,7 +322,7 @@
   Future<void> test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library A;
         bool hasLength(int expected) { }''');
     addTestSource('''
@@ -338,7 +338,7 @@
   }
 
   Future<void> test_AsExpression() async {
-    // SimpleIdentifier  TypeName  AsExpression
+    // SimpleIdentifier  NamedType  AsExpression
     addTestSource('''
         class A {var b; X _c; foo() {var a; (a as ^).foo();}''');
     await computeSuggestions();
@@ -373,7 +373,7 @@
   }
 
   Future<void> test_AssignmentExpression_type() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -395,7 +395,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -416,7 +416,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -438,7 +438,7 @@
   }
 
   Future<void> test_AssignmentExpression_type_partial_newline() async {
-    // SimpleIdentifier  TypeName  VariableDeclarationList
+    // SimpleIdentifier  NamedType  VariableDeclarationList
     // VariableDeclarationStatement  Block
     addTestSource('''
         class A {} void f() {
@@ -977,7 +977,7 @@
 
   Future<void> test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
         class E extends F { var e1; e2() { } }
@@ -1093,7 +1093,7 @@
 
   Future<void> test_CascadeExpression_method1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart";
@@ -1117,7 +1117,7 @@
 
   Future<void> test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart";
@@ -1141,7 +1141,7 @@
 
   Future<void> test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart";
@@ -1163,7 +1163,7 @@
 
   Future<void> test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart";
@@ -1203,7 +1203,7 @@
   }
 
   Future<void> test_CatchClause_onType() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^ {}}}');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -1215,7 +1215,7 @@
   }
 
   Future<void> test_CatchClause_onType_noBrackets() async {
-    // TypeName  CatchClause  TryStatement
+    // NamedType  CatchClause  TryStatement
     addTestSource('class A {a() {try{var x;} on ^}}');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -1252,7 +1252,7 @@
 
   Future<void> test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1271,7 +1271,7 @@
 
   Future<void> test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1290,7 +1290,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1309,7 +1309,7 @@
 
   Future<void> test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as Soo;
@@ -1328,7 +1328,7 @@
 
   Future<void> test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1347,7 +1347,7 @@
 
   Future<void> test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         class B { }''');
     addTestSource('''
         import "b.dart" as x;
@@ -1414,7 +1414,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1433,7 +1433,7 @@
 
   Future<void> test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1458,7 +1458,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1477,7 +1477,7 @@
 
   Future<void> test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1502,7 +1502,7 @@
 
   Future<void> test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -1520,9 +1520,9 @@
   }
 
   Future<void> test_ConstructorName_importedClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -1544,9 +1544,9 @@
   }
 
   Future<void> test_ConstructorName_importedFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
@@ -1568,7 +1568,7 @@
   }
 
   Future<void> test_ConstructorName_importedFactory2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         void f() {new String.fr^omCharCodes([]);}''');
@@ -1585,7 +1585,7 @@
   }
 
   Future<void> test_ConstructorName_localClass() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -1605,7 +1605,7 @@
   }
 
   Future<void> test_ConstructorName_localFactory() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
+    // SimpleIdentifier  PrefixedIdentifier  NamedType  ConstructorName
     // InstanceCreationExpression
     addTestSource('''
         int T1;
@@ -1706,7 +1706,7 @@
 
   Future<void> test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         _B F1() { }
         class A {int x;}
         class _B { }''');
@@ -1732,7 +1732,7 @@
 
   Future<void> test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
@@ -1759,7 +1759,7 @@
   Future<void> test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import "a.dart";
         class C {A ^}''');
@@ -1770,7 +1770,7 @@
   Future<void> test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
     addTestSource('''
         import "a.dart";
         class C {var ^}''');
@@ -1922,7 +1922,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -1951,7 +1951,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -1980,7 +1980,7 @@
 
   Future<void> test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2174,7 +2174,7 @@
 
   Future<void> test_IndexExpression() async {
     // ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -2199,7 +2199,7 @@
 
   Future<void> test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
@@ -2217,8 +2217,8 @@
   }
 
   Future<void> test_InstanceCreationExpression_imported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/home/test/lib/a.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         class A {A(this.x) { } int x;}''');
@@ -2247,7 +2247,7 @@
   }
 
   Future<void> test_InstanceCreationExpression_unimported() async {
-    // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
+    // SimpleIdentifier  NamedType  ConstructorName  InstanceCreationExpression
     addSource('/testAB.dart', 'class Foo { }');
     addTestSource('class C {foo(){new F^}}');
     await computeSuggestions();
@@ -2304,7 +2304,7 @@
 
   Future<void> test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2333,7 +2333,7 @@
 
   Future<void> test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2398,8 +2398,8 @@
   }
 
   Future<void> test_IsExpression() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class X {X.c(); X._d(); z() {}}''');
@@ -2436,7 +2436,7 @@
   }
 
   Future<void> test_IsExpression_type() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
         class A {int x; int y() => 0;}
         void f(){var a; if (a is ^)}''');
@@ -2450,7 +2450,7 @@
   }
 
   Future<void> test_IsExpression_type_partial() async {
-    // SimpleIdentifier  TypeName  IsExpression  IfStatement
+    // SimpleIdentifier  NamedType  IsExpression  IfStatement
     addTestSource('''
         class A {int x; int y() => 0;}
         void f(){var a; if (a is Obj^)}''');
@@ -2472,7 +2472,7 @@
   }
 
   Future<void> test_keyword2() async {
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int newT1;
         int T1;
@@ -2532,8 +2532,8 @@
   }
 
   Future<void> test_libraryPrefix_with_exports() async {
-    addSource('/home/test/lib/a.dart', 'class A { }');
-    addSource('/home/test/lib/b.dart', 'export "a.dart"; class B { }');
+    addSource('$testPackageLibPath/a.dart', 'class A { }');
+    addSource('$testPackageLibPath/b.dart', 'export "a.dart"; class B { }');
     addTestSource('import "b.dart" as foo; void f() {foo.^} class C { }');
     await computeSuggestions();
     // Suggested by LibraryMemberContributor
@@ -2591,7 +2591,7 @@
 
   Future<void> test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2618,7 +2618,7 @@
 
   Future<void> test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2638,7 +2638,7 @@
 
   Future<void> test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2937,7 +2937,7 @@
 
   Future<void> test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2965,7 +2965,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -2993,7 +2993,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3021,7 +3021,7 @@
 
   Future<void> test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
@@ -3267,13 +3267,13 @@
   }
 
   Future<void> test_partFile_TypeName() async {
-    // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         library libA;
         import "b.dart";
         part "${resourceProvider.pathContext.basename(testFile)}";
@@ -3299,13 +3299,13 @@
   }
 
   Future<void> test_partFile_TypeName2() async {
-    // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  NamedType  ConstructorName
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         part of libA;
         class B { }''');
     addTestSource('''
@@ -3332,7 +3332,7 @@
 
   Future<void> test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -3378,7 +3378,7 @@
 
   Future<void> test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class I {X get f => new A();get _g => new A();}
         class A implements I {
@@ -3454,7 +3454,7 @@
 
   Future<void> test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -3479,8 +3479,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -3505,8 +3505,8 @@
   }
 
   Future<void> test_PrefixedIdentifier_library_typesOnly2() async {
-    // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/home/test/lib/b.dart', '''
+    // SimpleIdentifier  PrefixedIdentifier  NamedType
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         var T1;
         class X { }
@@ -3532,7 +3532,7 @@
 
   Future<void> test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
@@ -3550,7 +3550,7 @@
 
   Future<void> test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
@@ -4149,7 +4149,7 @@
 
   Future<void> test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
@@ -4173,8 +4173,8 @@
   }
 
   Future<void> test_TypeArgumentList2() async {
-    // TypeName  TypeArgumentList  TypeName
-    addSource('/home/test/lib/a.dart', '''
+    // NamedType  TypeArgumentList  NamedType
+    addSource('$testPackageLibPath/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
@@ -4218,7 +4218,7 @@
   Future<void> test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class _B { }
@@ -4243,7 +4243,7 @@
   Future<void> test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo() { }
         class _B { }
@@ -4267,7 +4267,7 @@
   Future<void> test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
         lib B;
         foo1() { }
         void bar1() { }
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index 92e87d3..db354c4 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
@@ -24,8 +24,6 @@
 
 @reflectiveTest
 class UriContributorTest extends DartCompletionContributorTest {
-  String get testPackageTestPath => '$testPackageRootPath/test';
-
   @override
   DartCompletionContributor createContributor(
     DartCompletionRequest request,
diff --git a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
index 5e73ef0..bc6f11e 100644
--- a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
@@ -28,19 +28,20 @@
   late PostfixCompletionProcessor processor;
   late SourceChange change;
 
-  void _assertHasChange(String message, String expectedCode, [Function? cmp]) {
+  void _assertHasChange(String message, String expectedCode,
+      [int Function(String)? cmp]) {
     if (change.message == message) {
       if (change.edits.isNotEmpty) {
         var resultCode =
             SourceEdit.applySequence(testCode, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
         if (cmp != null) {
-          int offset = cmp(resultCode);
+          var offset = cmp(resultCode);
           expect(change.selection!.offset, offset);
         }
       } else {
         if (cmp != null) {
-          int offset = cmp(testCode);
+          var offset = cmp(testCode);
           expect(change.selection!.offset, offset);
         }
       }
@@ -738,7 +739,7 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_into_legacy() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 String? x;
 ''');
     await _prepareCompletion('.tryon', '''
@@ -762,7 +763,7 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_into_legacy_nested() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 List<String?> x;
 ''');
     await _prepareCompletion('.tryon', '''
@@ -786,7 +787,7 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_legacy() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 // @dart = 2.8
 String x;
 ''');
@@ -809,7 +810,7 @@
   }
 
   Future<void> test_tryonThrowStatement_nnbd_legacy_nested() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 // @dart = 2.8
 List<String> x;
 ''');
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index f28613f..8ecae36 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -22,6 +22,12 @@
 class OrganizeDirectivesTest extends AbstractSingleUnitTest {
   late List<AnalysisError> testErrors;
 
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(meta: true);
+  }
+
   Future<void> test_docComment_beforeDirective_hasUnresolvedIdentifier() async {
     await _computeUnitAndErrors(r'''
 /// Library documentation comment A
@@ -682,6 +688,219 @@
 import 'package:b/a.dart';''');
   }
 
+  Future<void> test_sort_libraryAnnotation_movedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+// annotations
+import 'annotations.dart';
+
+// io
+import 'dart:io';
+''');
+    // Validate annotation is not moved with import.
+    _assertOrganize(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+// io
+import 'dart:io';
+
+// annotations
+import 'annotations.dart';
+''');
+  }
+
+  Future<void> test_sort_libraryAnnotation_removedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+// io
+import 'dart:io'; // unused
+// annotations
+import 'annotations.dart'; // used
+''');
+    // Validate annotation is not removed with import.
+    _assertOrganize(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+// annotations
+import 'annotations.dart'; // used
+''', removeUnused: true);
+  }
+
+  Future<void> test_sort_multipleAnnotation_movedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+@nonLibraryAnnotation
+import 'annotations.dart';
+@nonLibraryAnnotation
+import 'dart:io';
+''');
+    // Validate only the non-library annotation is moved with import.
+    _assertOrganize(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+@nonLibraryAnnotation
+import 'dart:io';
+
+@nonLibraryAnnotation
+import 'annotations.dart';
+''');
+  }
+
+  Future<void> test_sort_multipleAnnotation_removedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+@nonLibraryAnnotation
+import 'dart:io';
+@nonLibraryAnnotation
+import 'annotations.dart';
+''');
+    // Validate only the non-library annotation is removed with import.
+    _assertOrganize(r'''
+@libraryAnnotation
+@LibraryAnnotation()
+
+@nonLibraryAnnotation
+import 'annotations.dart';
+''', removeUnused: true);
+  }
+
+  Future<void> test_sort_multipleAnnotationWithComments_movedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+// lib1
+@libraryAnnotation // lib1
+// lib2
+@LibraryAnnotation() // lib2
+
+// nonLib on annotations import
+@nonLibraryAnnotation // nonLib on annotations import
+// annotations import
+import 'annotations.dart'; // annotations import
+// nonLib on io import
+@nonLibraryAnnotation // nonLib on io import
+// io import
+import 'dart:io'; // io import
+''');
+    // Validate only the non-library annotation is moved with import.
+    _assertOrganize(r'''
+// lib1
+@libraryAnnotation // lib1
+// lib2
+@LibraryAnnotation() // lib2
+
+// nonLib on io import
+@nonLibraryAnnotation // nonLib on io import
+// io import
+import 'dart:io'; // io import
+
+// nonLib on annotations import
+@nonLibraryAnnotation // nonLib on annotations import
+// annotations import
+import 'annotations.dart'; // annotations import
+''');
+  }
+
+  Future<void>
+      test_sort_multipleAnnotationWithComments_removedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+// lib1
+@libraryAnnotation // lib1
+// lib2
+@LibraryAnnotation() // lib2
+
+// nonLib on io import
+@nonLibraryAnnotation // nonLib on io import
+// io import
+import 'dart:io'; // io import
+// nonLib on annotations import
+@nonLibraryAnnotation // nonLib on annotations import
+// annotations import
+import 'annotations.dart'; // annotations import
+''');
+    // Validate only the non-library annotation is removed with import.
+    _assertOrganize(r'''
+// lib1
+@libraryAnnotation // lib1
+// lib2
+@LibraryAnnotation() // lib2
+
+// nonLib on annotations import
+@nonLibraryAnnotation // nonLib on annotations import
+// annotations import
+import 'annotations.dart'; // annotations import
+''', removeUnused: true);
+  }
+
+  Future<void> test_sort_nonLibraryAnnotation_movedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@nonLibraryAnnotation
+import 'annotations.dart';
+
+import 'dart:io';
+''');
+    // Validate annotation is moved with import.
+    _assertOrganize(r'''
+import 'dart:io';
+
+@nonLibraryAnnotation
+import 'annotations.dart';
+''');
+  }
+
+  Future<void> test_sort_nonLibraryAnnotation_removedDirective() async {
+    await _addAnnotationsFile();
+    await _computeUnitAndErrors(r'''
+@nonLibraryAnnotation
+// io
+import 'dart:io'; // unused
+// annotations
+import 'annotations.dart'; // used
+''');
+    // Validate annotation is removed with import.
+    _assertOrganize(r'''
+// annotations
+import 'annotations.dart'; // used
+''', removeUnused: true);
+  }
+
+  Future<void> _addAnnotationsFile() async {
+    final annotationsFile = convertPath('$testPackageLibPath/annotations.dart');
+    const annotationsContent = '''
+import 'package:meta/meta_meta.dart';
+
+const libraryAnnotation = LibraryAnnotation();
+const nonLibraryAnnotation = NonLibraryAnnotation();
+
+@Target({TargetKind.library})
+class LibraryAnnotation {
+  const LibraryAnnotation();
+}
+
+@Target({TargetKind.classType})
+class NonLibraryAnnotation {
+  const NonLibraryAnnotation();
+}
+    ''';
+    addSource(annotationsFile, annotationsContent);
+  }
+
   void _assertOrganize(String expectedCode, {bool removeUnused = false}) {
     var organizer = ImportOrganizer(testCode, testUnit, testErrors,
         removeUnused: removeUnused);
diff --git a/pkg/analysis_server/test/services/correction/sort_members_test.dart b/pkg/analysis_server/test/services/correction/sort_members_test.dart
index e434168..87042b0 100644
--- a/pkg/analysis_server/test/services/correction/sort_members_test.dart
+++ b/pkg/analysis_server/test/services/correction/sort_members_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/services/correction/sort_members.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -18,7 +19,9 @@
 
 @reflectiveTest
 class SortMembersTest extends AbstractSingleUnitTest {
-  Future<void> test_classMembers_accessor() async {
+  LineInfo? lineInfo;
+
+  Future<void> test_class_accessor() async {
     await _parseTestUnit(r'''
 class A {
   set c(x) {}
@@ -42,7 +45,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_accessor_static() async {
+  Future<void> test_class_accessor_static() async {
     await _parseTestUnit(r'''
 class A {
   get a => null;
@@ -62,7 +65,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_constructor() async {
+  Future<void> test_class_constructor() async {
     await _parseTestUnit(r'''
 class A {
   A.c() {   }
@@ -82,7 +85,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_external_constructorMethod() async {
+  Future<void> test_class_external_constructorMethod() async {
     await _parseTestUnit(r'''
 class Chart {
   external Pie();
@@ -98,7 +101,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_field() async {
+  Future<void> test_class_field() async {
     await _parseTestUnit(r'''
 class A {
   String c;
@@ -118,7 +121,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_field_static() async {
+  Future<void> test_class_field_static() async {
     await _parseTestUnit(r'''
 class A {
   int b;
@@ -138,7 +141,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_method() async {
+  Future<void> test_class_method() async {
     await _parseTestUnit(r'''
 class A {
   c() {}
@@ -156,7 +159,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_method_emptyLine() async {
+  Future<void> test_class_method_emptyLine() async {
     await _parseTestUnit(r'''
 class A {
   b() {}
@@ -174,7 +177,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_method_ignoreCase() async {
+  Future<void> test_class_method_ignoreCase() async {
     await _parseTestUnit(r'''
 class A {
   m_C() {}
@@ -192,7 +195,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_method_static() async {
+  Future<void> test_class_method_static() async {
     await _parseTestUnit(r'''
 class A {
   static a() {}
@@ -208,7 +211,7 @@
 ''');
   }
 
-  Future<void> test_classMembers_mix() async {
+  Future<void> test_class_mix() async {
     await _parseTestUnit(r'''
 class A {
   /// static field public
@@ -308,6 +311,34 @@
 ''');
   }
 
+  Future<void> test_class_trailingComments() async {
+    await _parseTestUnit(r'''
+class A { // classA
+  // instanceA
+  int instanceA; // instanceA
+  // A()
+  A(); // A()
+  // staticA
+  static int staticA; // staticA
+  // static_b
+  static int static_b; // static_b
+}
+''');
+    // validate change
+    _assertSort(r'''
+class A { // classA
+  // staticA
+  static int staticA; // staticA
+  // static_b
+  static int static_b; // static_b
+  // instanceA
+  int instanceA; // instanceA
+  // A()
+  A(); // A()
+}
+''');
+  }
+
   Future<void> test_directives() async {
     await _parseTestUnit(r'''
 library lib;
@@ -554,9 +585,73 @@
 ''');
   }
 
-  Future<void> test_mixinMembers_method() async {
+  Future<void> test_extension_accessor() async {
     await _parseTestUnit(r'''
-mixin A {
+extension E on int {
+  set c(x) {}
+  set a(x) {}
+  get a => null;
+  get b => null;
+  set b(x) {}
+  get c => null;
+}
+''');
+    // validate change
+    _assertSort(r'''
+extension E on int {
+  get a => null;
+  set a(x) {}
+  get b => null;
+  set b(x) {}
+  get c => null;
+  set c(x) {}
+}
+''');
+  }
+
+  Future<void> test_extension_accessor_static() async {
+    await _parseTestUnit(r'''
+extension E on int {
+  get a => null;
+  set a(x) {}
+  static get b => null;
+  static set b(x) {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+extension E on int {
+  static get b => null;
+  static set b(x) {}
+  get a => null;
+  set a(x) {}
+}
+''');
+  }
+
+  Future<void> test_extension_field_static() async {
+    await _parseTestUnit(r'''
+extension E on int {
+  int b;
+  int a;
+  static int d;
+  static int c;
+}
+''');
+    // validate change
+    _assertSort(r'''
+extension E on int {
+  static int d;
+  static int c;
+  int b;
+  int a;
+}
+''');
+  }
+
+  Future<void> test_extension_method() async {
+    await _parseTestUnit(r'''
+extension E on int {
   c() {}
   a() {}
   b() {}
@@ -564,7 +659,7 @@
 ''');
     // validate change
     _assertSort(r'''
-mixin A {
+extension E on int {
   a() {}
   b() {}
   c() {}
@@ -572,7 +667,317 @@
 ''');
   }
 
-  Future<void> test_unitMembers_class() async {
+  Future<void> test_extension_method_emptyLine() async {
+    await _parseTestUnit(r'''
+extension E on int {
+  b() {}
+
+  a() {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+extension E on int {
+  a() {}
+
+  b() {}
+}
+''');
+  }
+
+  Future<void> test_extension_method_ignoreCase() async {
+    await _parseTestUnit(r'''
+extension E on int {
+  m_C() {}
+  m_a() {}
+  m_B() {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+extension E on int {
+  m_a() {}
+  m_B() {}
+  m_C() {}
+}
+''');
+  }
+
+  Future<void> test_extension_method_static() async {
+    await _parseTestUnit(r'''
+extension E on int {
+  static a() {}
+  b() {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+extension E on int {
+  b() {}
+  static a() {}
+}
+''');
+  }
+
+  Future<void> test_mixin_accessor() async {
+    await _parseTestUnit(r'''
+mixin M {
+  set c(x) {}
+  set a(x) {}
+  get a => null;
+  get b => null;
+  set b(x) {}
+  get c => null;
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  get a => null;
+  set a(x) {}
+  get b => null;
+  set b(x) {}
+  get c => null;
+  set c(x) {}
+}
+''');
+  }
+
+  Future<void> test_mixin_accessor_static() async {
+    await _parseTestUnit(r'''
+mixin M {
+  get a => null;
+  set a(x) {}
+  static get b => null;
+  static set b(x) {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  static get b => null;
+  static set b(x) {}
+  get a => null;
+  set a(x) {}
+}
+''');
+  }
+
+  Future<void> test_mixin_field() async {
+    await _parseTestUnit(r'''
+mixin M {
+  String c;
+  int a;
+  void toString() => null;
+  double b;
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  String c;
+  int a;
+  double b;
+  void toString() => null;
+}
+''');
+  }
+
+  Future<void> test_mixin_field_static() async {
+    await _parseTestUnit(r'''
+mixin M {
+  int b;
+  int a;
+  static int d;
+  static int c;
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  static int d;
+  static int c;
+  int b;
+  int a;
+}
+''');
+  }
+
+  Future<void> test_mixin_method() async {
+    await _parseTestUnit(r'''
+mixin M {
+  c() {}
+  a() {}
+  b() {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  a() {}
+  b() {}
+  c() {}
+}
+''');
+  }
+
+  Future<void> test_mixin_method_emptyLine() async {
+    await _parseTestUnit(r'''
+mixin M {
+  b() {}
+
+  a() {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  a() {}
+
+  b() {}
+}
+''');
+  }
+
+  Future<void> test_mixin_method_ignoreCase() async {
+    await _parseTestUnit(r'''
+mixin M {
+  m_C() {}
+  m_a() {}
+  m_B() {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  m_a() {}
+  m_B() {}
+  m_C() {}
+}
+''');
+  }
+
+  Future<void> test_mixin_method_static() async {
+    await _parseTestUnit(r'''
+mixin M {
+  static a() {}
+  b() {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  b() {}
+  static a() {}
+}
+''');
+  }
+
+  Future<void> test_mixin_mix() async {
+    await _parseTestUnit(r'''
+mixin M {
+  /// static field public
+  static int nnn;
+  /// static field private
+  static int _nnn;
+  /// instance getter public
+  int get nnn => null;
+  /// instance setter public
+  set nnn(x) {}
+  /// instance getter private
+  int get _nnn => null;
+  /// instance setter private
+  set _nnn(x) {}
+  /// instance method public
+  nnn() {}
+  /// instance method private
+  _nnn() {}
+  /// static method public
+  static nnn() {}
+  /// static method private
+  static _nnn() {}
+  /// static getter public
+  static int get nnn => null;
+  /// static setter public
+  static set nnn(x) {}
+  /// static getter private
+  static int get _nnn => null;
+  /// static setter private
+  static set _nnn(x) {}
+  /// instance field public
+  int nnn;
+  /// instance field private
+  int _nnn;
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M {
+  /// static field public
+  static int nnn;
+  /// static field private
+  static int _nnn;
+  /// static getter public
+  static int get nnn => null;
+  /// static setter public
+  static set nnn(x) {}
+  /// static getter private
+  static int get _nnn => null;
+  /// static setter private
+  static set _nnn(x) {}
+  /// instance field public
+  int nnn;
+  /// instance field private
+  int _nnn;
+  /// instance getter public
+  int get nnn => null;
+  /// instance setter public
+  set nnn(x) {}
+  /// instance getter private
+  int get _nnn => null;
+  /// instance setter private
+  set _nnn(x) {}
+  /// instance method public
+  nnn() {}
+  /// instance method private
+  _nnn() {}
+  /// static method public
+  static nnn() {}
+  /// static method private
+  static _nnn() {}
+}
+''');
+  }
+
+  Future<void> test_mixin_trailingComments() async {
+    await _parseTestUnit(r'''
+mixin M { // mixinM
+  // instanceA
+  int instanceA; // instanceA
+  // foo()
+  void foo() {} // foo()
+  // staticA
+  static int staticA; // staticA
+  // static_b
+  static int static_b; // static_b
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin M { // mixinM
+  // staticA
+  static int staticA; // staticA
+  // static_b
+  static int static_b; // static_b
+  // instanceA
+  int instanceA; // instanceA
+  // foo()
+  void foo() {} // foo()
+}
+''');
+  }
+
+  Future<void> test_unit_class() async {
     await _parseTestUnit(r'''
 class C {}
 class A {}
@@ -586,7 +991,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_class_ignoreCase() async {
+  Future<void> test_unit_class_ignoreCase() async {
     await _parseTestUnit(r'''
 class C {}
 class a {}
@@ -600,7 +1005,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_classTypeAlias() async {
+  Future<void> test_unit_classTypeAlias() async {
     await _parseTestUnit(r'''
 class M {}
 class C = Object with M;
@@ -616,7 +1021,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_directive_hasDirective() async {
+  Future<void> test_unit_directive_hasDirective() async {
     await _parseTestUnit(r'''
 library lib;
 class C {}
@@ -632,7 +1037,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_directive_noDirective_hasComment_line() async {
+  Future<void> test_unit_directive_noDirective_hasComment_line() async {
     await _parseTestUnit(r'''
 // Some comment
 
@@ -650,7 +1055,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_directive_noDirective_noComment() async {
+  Future<void> test_unit_directive_noDirective_noComment() async {
     await _parseTestUnit(r'''
 
 class B {}
@@ -666,7 +1071,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_enum() async {
+  Future<void> test_unit_enum() async {
     await _parseTestUnit(r'''
 enum C {x, y}
 enum A {x, y}
@@ -680,7 +1085,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_enumClass() async {
+  Future<void> test_unit_enumClass() async {
     await _parseTestUnit(r'''
 enum C {x, y}
 class A {}
@@ -696,7 +1101,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_extensionClass() async {
+  Future<void> test_unit_extensionClass() async {
     await _parseTestUnit(r'''
 extension E on C {}
 class C {}
@@ -708,7 +1113,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_extensions() async {
+  Future<void> test_unit_extensions() async {
     await _parseTestUnit(r'''
 extension E2 on String {}
 extension on List {}
@@ -724,7 +1129,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_function() async {
+  Future<void> test_unit_function() async {
     await _parseTestUnit(r'''
 fc() {}
 fa() {}
@@ -738,7 +1143,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_functionTypeAlias() async {
+  Future<void> test_unit_functionTypeAlias() async {
     await _parseTestUnit(r'''
 typedef FC();
 typedef FA();
@@ -752,7 +1157,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_genericTypeAlias() async {
+  Future<void> test_unit_genericTypeAlias() async {
     await _parseTestUnit(r'''
 typedef FC = void Function();
 typedef FA = void Function();
@@ -766,7 +1171,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_importsAndDeclarations() async {
+  Future<void> test_unit_importsAndDeclarations() async {
     await _parseTestUnit(r'''
 import 'dart:a';
 import 'package:b';
@@ -789,7 +1194,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_mainFirst() async {
+  Future<void> test_unit_mainFirst() async {
     await _parseTestUnit(r'''
 class C {}
 aaa() {}
@@ -809,7 +1214,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_mix() async {
+  Future<void> test_unit_mix() async {
     await _parseTestUnit(r'''
 _mmm() {}
 typedef nnn();
@@ -871,7 +1276,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_mixin() async {
+  Future<void> test_unit_mixin() async {
     await _parseTestUnit(r'''
 mixin C {}
 mixin A {}
@@ -884,7 +1289,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_topLevelVariable() async {
+  Future<void> test_unit_topLevelVariable() async {
     await _parseTestUnit(r'''
 int c;
 int a;
@@ -898,7 +1303,7 @@
 ''');
   }
 
-  Future<void> test_unitMembers_topLevelVariable_withConst() async {
+  Future<void> test_unit_topLevelVariable_withConst() async {
     await _parseTestUnit(r'''
 int c;
 int a;
@@ -916,8 +1321,40 @@
 ''');
   }
 
+  Future<void> test_unit_trailingComments() async {
+    await _parseTestUnit(r'''
+// Header
+class B {} // B
+// A
+class A {} // A
+// C
+class C {} // C
+// b
+var b; // b
+// a
+var a; // a
+// c
+var c; // c
+''');
+    // validate change
+    _assertSort(r'''
+// Header
+// a
+var a; // a
+// b
+var b; // b
+// c
+var c; // c
+// A
+class A {} // A
+class B {} // B
+// C
+class C {} // C
+''');
+  }
+
   void _assertSort(String expectedCode) {
-    var sorter = MemberSorter(testCode, testUnit);
+    var sorter = MemberSorter(testCode, testUnit, lineInfo!);
     var edits = sorter.sort();
     var result = SourceEdit.applySequence(testCode, edits);
     expect(result, expectedCode);
@@ -926,6 +1363,7 @@
   Future<void> _parseTestUnit(String code) async {
     addTestSource(code);
     var result = session.getParsedUnit(testFile) as ParsedUnitResult;
+    lineInfo = result.lineInfo;
     testUnit = result.unit;
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
index b8cc8eb..8b090db 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_change_multipleFiles() async {
-    await indexUnit('/home/test/lib/other.dart', r'''
+    await indexUnit('$testPackageLibPath/other.dart', r'''
 class A {
   int get test => 1;
 }
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
index c95f9e0..58aea84 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -88,7 +88,7 @@
   }
 
   Future<void> test_change_multipleFiles() async {
-    await indexUnit('/home/test/lib/other.dart', r'''
+    await indexUnit('$testPackageLibPath/other.dart', r'''
 class A {
   int test() => 1;
 }
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index 527b60f..98584b89 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -2871,7 +2871,7 @@
   }
 
   void _addLibraryReturningAsync() {
-    addSource('/home/test/lib/asyncLib.dart', r'''
+    addSource('$testPackageLibPath/asyncLib.dart', r'''
 import 'dart:async';
 
 Completer<int> newCompleter() => null;
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
index 5094b24..52fe0df 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_file_imported_with_package_uri_down() async {
-    var file = newFile('/home/test/lib/old_name.dart', content: '');
+    var file = newFile('$testPackageLibPath/old_name.dart', content: '');
     addTestSource(r'''
 import 'package:test/old_name.dart';
 ''');
@@ -69,7 +69,8 @@
     testAnalysisResult =
         await session.getResolvedUnit(file.path) as ResolvedUnitResult;
 
-    _createRefactoring('/home/test/lib/222/new_name.dart', oldFile: file.path);
+    _createRefactoring('$testPackageLibPath/222/new_name.dart',
+        oldFile: file.path);
     await _assertSuccessfulRefactoring();
 
     assertFileChangeResult(testFile, '''
@@ -150,7 +151,7 @@
   }
 
   Future<void> test_file_imported_with_package_uri_sideways() async {
-    var file = newFile('/home/test/lib/111/old_name.dart', content: '');
+    var file = newFile('$testPackageLibPath/111/old_name.dart', content: '');
     addTestSource(r'''
 import 'package:test/111/old_name.dart';
 ''');
@@ -162,7 +163,8 @@
     testAnalysisResult =
         await session.getResolvedUnit(file.path) as ResolvedUnitResult;
 
-    _createRefactoring('/home/test/lib/222/new_name.dart', oldFile: file.path);
+    _createRefactoring('$testPackageLibPath/222/new_name.dart',
+        oldFile: file.path);
     await _assertSuccessfulRefactoring();
 
     assertFileChangeResult(testFile, '''
@@ -171,7 +173,7 @@
   }
 
   Future<void> test_file_imported_with_package_uri_up() async {
-    var file = newFile('/home/test/lib/222/old_name.dart', content: '');
+    var file = newFile('$testPackageLibPath/222/old_name.dart', content: '');
     addTestSource(r'''
 import 'package:test/222/old_name.dart';
 ''');
@@ -183,7 +185,7 @@
     testAnalysisResult =
         await session.getResolvedUnit(file.path) as ResolvedUnitResult;
 
-    _createRefactoring('/home/test/lib/new_name.dart', oldFile: file.path);
+    _createRefactoring('$testPackageLibPath/new_name.dart', oldFile: file.path);
     await _assertSuccessfulRefactoring();
 
     assertFileChangeResult(testFile, '''
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index 872fe9d..27a8207 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -157,7 +157,7 @@
   test() {}
 }
 ''');
-    await indexUnit('/home/test/lib/lib.dart', '''
+    await indexUnit('$testPackageLibPath/lib.dart', '''
 library my.lib;
 import 'test.dart';
 
@@ -181,7 +181,7 @@
   var foo = 1;
 }
 ''');
-    await indexUnit('/home/test/lib/lib.dart', '''
+    await indexUnit('$testPackageLibPath/lib.dart', '''
 import 'test.dart';
 
 void f(A a) {
@@ -387,7 +387,7 @@
   newName() {} // marker
 }
 ''';
-    await indexUnit('/home/test/lib/lib.dart', libCode);
+    await indexUnit('$testPackageLibPath/lib.dart', libCode);
     await indexTestUnit('''
 import 'lib.dart';
 class B extends A {
@@ -738,7 +738,7 @@
   }
 
   Future<void> test_createChange_MethodElement_potential_inPubCache() async {
-    var externalPath = '/.pub-cache/aaa/lib/lib.dart';
+    var externalPath = '$packagesRootPath/aaa/lib/lib.dart';
     newFile(externalPath, content: r'''
 processObj(p) {
   p.test();
@@ -747,7 +747,7 @@
 
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
-        ..add(name: 'aaa', rootPath: '/.pub-cache/aaa/'),
+        ..add(name: 'aaa', rootPath: '$packagesRootPath/aaa'),
     );
 
     await indexTestUnit('''
diff --git a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
index 2f37e06..0b6b03c 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -35,7 +35,7 @@
   }
 
   Future<void> test_createChange() async {
-    addSource('/home/test/lib/part.dart', '''
+    addSource('$testPackageLibPath/part.dart', '''
 part of my.app;
 ''');
     await indexTestUnit('''
@@ -52,13 +52,13 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/home/test/lib/part.dart', '''
+    assertFileChangeResult('$testPackageLibPath/part.dart', '''
 part of the.new.name;
 ''');
   }
 
   Future<void> test_createChange_hasWhitespaces() async {
-    addSource('/home/test/lib/part.dart', '''
+    addSource('$testPackageLibPath/part.dart', '''
 part of my .  app;
 ''');
     await indexTestUnit('''
@@ -75,7 +75,7 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/home/test/lib/part.dart', '''
+    assertFileChangeResult('$testPackageLibPath/part.dart', '''
 part of the.new.name;
 ''');
   }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 5c43032..5b42916 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -442,9 +442,38 @@
 ''');
   }
 
+  Future<void> test_createChange_parameter_named_anywhere() async {
+    await indexTestUnit('''
+myFunction(int a, int b, {required int test}) {
+  test = 1;
+  test += 2;
+  print(test);
+}
+void f() {
+  myFunction(0, test: 2, 1);
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test}) {');
+    expect(refactoring.refactoringName, 'Rename Parameter');
+    expect(refactoring.elementKindName, 'parameter');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+myFunction(int a, int b, {required int newName}) {
+  newName = 1;
+  newName += 2;
+  print(newName);
+}
+void f() {
+  myFunction(0, newName: 2, 1);
+}
+''');
+  }
+
   Future<void> test_createChange_parameter_named_inOtherFile() async {
-    var a = convertPath('/home/test/lib/a.dart');
-    var b = convertPath('/home/test/lib/b.dart');
+    var a = convertPath('$testPackageLibPath/a.dart');
+    var b = convertPath('$testPackageLibPath/b.dart');
 
     newFile(a, content: r'''
 class A {
@@ -537,7 +566,7 @@
   }
 
   Future<void> test_createChange_parameter_named_updateHierarchy() async {
-    await indexUnit('/home/test/lib/test2.dart', '''
+    await indexUnit('$testPackageLibPath/test2.dart', '''
 library test2;
 class A {
   void foo({int? test}) {
@@ -581,7 +610,7 @@
   }
 }
 ''');
-    assertFileChangeResult('/home/test/lib/test2.dart', '''
+    assertFileChangeResult('$testPackageLibPath/test2.dart', '''
 library test2;
 class A {
   void foo({int? newName}) {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index a65f922..e0ebb09 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -71,7 +71,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit('/home/test/lib/lib.dart', '''
+    await indexUnit('$testPackageLibPath/lib.dart', '''
 library my.lib;
 import 'test.dart';
 
@@ -112,7 +112,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit('/home/test/lib/lib.dart', '''
+    await indexUnit('$testPackageLibPath/lib.dart', '''
 library my.lib;
 import 'test.dart';
 class A {
@@ -610,7 +610,7 @@
   }
 
   Future<void> test_createChange_FunctionElement_imported() async {
-    await indexUnit('/home/test/lib/foo.dart', r'''
+    await indexUnit('$testPackageLibPath/foo.dart', r'''
 test() {}
 foo() {}
 ''');
@@ -637,7 +637,7 @@
   foo();
 }
 ''');
-    assertFileChangeResult('/home/test/lib/foo.dart', '''
+    assertFileChangeResult('$testPackageLibPath/foo.dart', '''
 newName() {}
 foo() {}
 ''');
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 1c7bb82..1fbf2a5 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/server/error_notifier.dart';
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analysis_server/src/utilities/mocks.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:test/test.dart';
@@ -123,7 +124,7 @@
   _MockRequestHandler(this.futureException);
 
   @override
-  Response handleRequest(Request request) {
+  Response handleRequest(Request request, CancellationToken cancellationToken) {
     if (futureException) {
       Future(throwException);
       return Response(request.id);
diff --git a/pkg/analysis_server/test/src/cider/rename_test.dart b/pkg/analysis_server/test/src/cider/rename_test.dart
index 028aaea..02368a6 100644
--- a/pkg/analysis_server/test/src/cider/rename_test.dart
+++ b/pkg/analysis_server/test/src/cider/rename_test.dart
@@ -4,9 +4,11 @@
 
 import 'package:analysis_server/src/cider/rename.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/micro/resolve_file.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../utilities/mock_packages.dart';
 import 'cider_service.dart';
 
 void main() {
@@ -19,6 +21,22 @@
 class CiderRenameComputerTest extends CiderServiceTest {
   late _CorrectionContext _correctionContext;
 
+  @override
+  void setUp() {
+    super.setUp();
+    BazelMockPackages.instance.addFlutter(resourceProvider);
+  }
+
+  void test_canRename_class() {
+    var refactor = _compute(r'''
+class ^Old {}
+}
+''');
+
+    expect(refactor!.refactoringElement.element.name, 'Old');
+    expect(refactor.refactoringElement.offset, _correctionContext.offset);
+  }
+
   void test_canRename_field() {
     var refactor = _compute(r'''
 class A {
@@ -29,7 +47,6 @@
 }
 ''');
 
-    expect(refactor, isNotNull);
     expect(refactor!.refactoringElement.element.name, 'bar');
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
@@ -40,7 +57,6 @@
 }
 ''');
 
-    expect(refactor, isNotNull);
     expect(refactor!.refactoringElement.element.name, 'foo');
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
@@ -68,7 +84,6 @@
 }
 ''');
 
-    expect(refactor, isNotNull);
     expect(refactor!.refactoringElement.element.name, 'a');
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
@@ -80,7 +95,6 @@
 }
 ''');
 
-    expect(refactor, isNotNull);
     expect(refactor!.refactoringElement.element.name, 'foo');
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
@@ -107,14 +121,22 @@
     expect(refactor.refactoringElement.offset, _correctionContext.offset);
   }
 
+  void test_checkName_class() {
+    var result = _checkName(r'''
+class ^Old {}
+''', 'New');
+
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'Old');
+  }
+
   void test_checkName_function() {
     var result = _checkName(r'''
 int ^foo() => 2;
 ''', 'bar');
 
-    expect(result, isNotNull);
-    expect(result?.status.problems.length, 0);
-    expect(result?.oldName, 'foo');
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'foo');
   }
 
   void test_checkName_local() {
@@ -124,9 +146,8 @@
 }
 ''', 'bar');
 
-    expect(result, isNotNull);
-    expect(result?.status.problems.length, 0);
-    expect(result?.oldName, 'a');
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'a');
   }
 
   void test_checkName_local_invalid() {
@@ -136,9 +157,8 @@
 }
 ''', 'Aa');
 
-    expect(result, isNotNull);
-    expect(result?.status.problems.length, 1);
-    expect(result?.oldName, 'a');
+    expect(result!.status.problems.length, 1);
+    expect(result.oldName, 'a');
   }
 
   void test_checkName_parameter() {
@@ -148,9 +168,189 @@
 }
 ''', 'bar');
 
-    expect(result, isNotNull);
-    expect(result?.status.problems.length, 0);
-    expect(result?.oldName, 'a');
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'a');
+  }
+
+  void test_checkName_topLevelVariable() {
+    var result = _checkName(r'''
+var ^foo;
+''', 'bar');
+
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'foo');
+  }
+
+  void test_checkName_TypeAlias() {
+    var result = _checkName(r'''
+typedef ^Foo = void Function();
+''', 'Bar');
+
+    expect(result!.status.problems.length, 0);
+    expect(result.oldName, 'Foo');
+  }
+
+  void test_rename_class() {
+    var result = _rename(r'''
+class ^Old implements Other {
+  Old() {}
+  Old.named() {}
+}
+class Other {
+  factory Other.a() = Old;
+  factory Other.b() = Old.named;
+}
+void f() {
+  Old t1 = new Old();
+  Old t2 = new Old.named();
+}
+''', 'New');
+
+    expect(result!.matches.length, 1);
+    expect(result.matches, [
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'), [
+        CharacterLocation(1, 7),
+        CharacterLocation(2, 3),
+        CharacterLocation(3, 3),
+        CharacterLocation(6, 23),
+        CharacterLocation(7, 23),
+        CharacterLocation(10, 3),
+        CharacterLocation(10, 16),
+        CharacterLocation(11, 3),
+        CharacterLocation(11, 16)
+      ])
+    ]);
+  }
+
+  void test_rename_class_flutterWidget() {
+    var result = _rename(r'''
+import 'package:flutter/material.dart';
+
+class ^TestPage extends StatefulWidget {
+  const TestPage();
+
+  @override
+  State<TestPage> createState() => TestPageState();
+}
+
+class TestPageState extends State<TestPage> {
+  @override
+  Widget build(BuildContext context) => throw 0;
+}
+''', 'NewPage');
+
+    expect(result!.matches.length, 1);
+    expect(result.matches, [
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'), [
+        CharacterLocation(3, 7),
+        CharacterLocation(4, 9),
+        CharacterLocation(7, 9),
+        CharacterLocation(10, 35)
+      ])
+    ]);
+    expect(result.flutterWidgetRename != null, isTrue);
+    expect(result.flutterWidgetRename!.name, 'NewPageState');
+    expect(result.flutterWidgetRename!.matches, [
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
+          [CharacterLocation(7, 36), CharacterLocation(10, 7)])
+    ]);
+  }
+
+  void test_rename_function() {
+    var result = _rename(r'''
+test() {}
+^foo() {}
+void f() {
+  print(test);
+  print(test());
+  foo();
+}
+''', 'bar');
+
+    expect(result!.matches.length, 1);
+    expect(result.matches, [
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'), [
+        CharacterLocation(2, 1),
+        CharacterLocation(6, 3),
+      ])
+    ]);
+  }
+
+  void test_rename_function_imported() {
+    var a = newFile('/workspace/dart/test/lib/a.dart', content: r'''
+foo() {}
+''');
+    fileResolver.resolve(path: a.path);
+    var result = _rename(r'''
+import 'a.dart';
+void f() {
+  ^foo();
+}
+''', 'bar');
+    expect(result!.matches.length, 2);
+    expect(result.matches, [
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/a.dart'), [
+        CharacterLocation(1, 1),
+      ]),
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
+          [CharacterLocation(3, 3)])
+    ]);
+  }
+
+  void test_rename_local() {
+    var result = _rename(r'''
+void foo() {
+  var ^a = 0; var b = a + 1;
+}
+''', 'bar');
+
+    expect(result!.matches.length, 1);
+    expect(
+        result.matches[0],
+        CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
+            [CharacterLocation(2, 7), CharacterLocation(2, 22)]));
+  }
+
+  void test_rename_parameter() {
+    var result = _rename(r'''
+void foo(String ^a) {
+  var b = a + 1;
+}
+''', 'bar');
+    expect(result!.matches.length, 1);
+    expect(result.checkName.oldName, 'a');
+  }
+
+  void test_rename_propertyAccessor() {
+    var result = _rename(r'''
+get foo {}
+set foo(x) {}
+void f() {
+  print(foo);
+  ^foo = 1;
+  foo += 2;
+''', 'bar');
+    expect(result!.matches, [
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
+          [CharacterLocation(1, 5), CharacterLocation(4, 9)]),
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'), [
+        CharacterLocation(2, 5),
+        CharacterLocation(5, 3),
+        CharacterLocation(6, 3)
+      ])
+    ]);
+  }
+
+  void test_typeAlias_functionType() {
+    var result = _rename(r'''
+typedef ^F = void Function();
+void f(F a) {}
+''', 'bar');
+
+    expect(result!.matches, [
+      CiderSearchMatch(convertPath('/workspace/dart/test/lib/test.dart'),
+          [CharacterLocation(1, 9), CharacterLocation(2, 8)])
+    ]);
   }
 
   CheckNameResponse? _checkName(String content, String newName) {
@@ -158,12 +358,13 @@
 
     return CiderRenameComputer(
       fileResolver,
-    ).checkNewName(
-      convertPath(testPath),
-      _correctionContext.line,
-      _correctionContext.character,
-      newName,
-    );
+    )
+        .canRename(
+          convertPath(testPath),
+          _correctionContext.line,
+          _correctionContext.character,
+        )
+        ?.checkNewName(newName);
   }
 
   CanRenameResponse? _compute(String content) {
@@ -178,6 +379,21 @@
     );
   }
 
+  RenameResponse? _rename(String content, String newName) {
+    _updateFile(content);
+
+    return CiderRenameComputer(
+      fileResolver,
+    )
+        .canRename(
+          convertPath(testPath),
+          _correctionContext.line,
+          _correctionContext.character,
+        )
+        ?.checkNewName(newName)
+        ?.computeRenameRanges();
+  }
+
   void _updateFile(String content) {
     var offset = content.indexOf('^');
     expect(offset, isPositive, reason: 'Expected to find ^');
diff --git a/pkg/analysis_server/test/src/cider/signature_help_test.dart b/pkg/analysis_server/test/src/cider/signature_help_test.dart
new file mode 100644
index 0000000..2b99d72
--- /dev/null
+++ b/pkg/analysis_server/test/src/cider/signature_help_test.dart
@@ -0,0 +1,253 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/cider/signature_help.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:collection/collection.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'cider_service.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CiderSignatureHelpComputerTest);
+  });
+}
+
+@reflectiveTest
+class CiderSignatureHelpComputerTest extends CiderServiceTest {
+  late _CorrectionContext _correctionContext;
+
+  void test_noDefaultConstructor() {
+    var result = _compute('''
+class A {
+  A._();
+}
+
+final a = A(^);
+''');
+
+    expect(result, null);
+  }
+
+  void test_params_multipleNamed() {
+    final content = '''
+/// Does foo.
+foo(String s, {bool b = true, bool a}) {
+  foo(^);
+}
+''';
+    final expectedLabel = 'foo(String s, {bool b = true, bool a})';
+
+    testSignature(
+        content,
+        expectedLabel,
+        'Does foo.',
+        [
+          ParameterInformation(label: 'String s'),
+          ParameterInformation(label: 'bool b = true'),
+          ParameterInformation(label: 'bool a'),
+        ],
+        CharacterLocation(3, 7));
+  }
+
+  void test_params_multipleOptional() {
+    final content = '''
+/// Does foo.
+foo(String s, [bool b = true, bool a]) {
+  foo(^);
+}
+''';
+
+    final expectedLabel = 'foo(String s, [bool b = true, bool a])';
+    testSignature(
+        content,
+        expectedLabel,
+        'Does foo.',
+        [
+          ParameterInformation(label: 'String s'),
+          ParameterInformation(label: 'bool b = true'),
+          ParameterInformation(label: 'bool a'),
+        ],
+        CharacterLocation(3, 7));
+  }
+
+  void test_retrigger_validLocation() {
+    final content = '''
+/// Does foo.
+foo(String s, {bool b = true, bool a}) {
+  foo('ssss',^);
+}
+''';
+    final expectedLabel = 'foo(String s, {bool b = true, bool a})';
+
+    testSignature(
+        content,
+        expectedLabel,
+        'Does foo.',
+        [
+          ParameterInformation(label: 'String s'),
+          ParameterInformation(label: 'bool b = true'),
+          ParameterInformation(label: 'bool a'),
+        ],
+        CharacterLocation(3, 7));
+  }
+
+  void test_simple() {
+    final content = '''
+/// Does foo.
+foo(String s, int i) {
+  foo(^);
+}
+''';
+    final expectedLabel = 'foo(String s, int i)';
+    testSignature(
+        content,
+        expectedLabel,
+        'Does foo.',
+        [
+          ParameterInformation(label: 'String s'),
+          ParameterInformation(label: 'int i'),
+        ],
+        CharacterLocation(3, 7));
+  }
+
+  void test_triggerCharacter_validLocation() {
+    final content = '''
+/// Does foo.
+foo(String s, int i) {
+  foo(^
+}
+''';
+
+    final expectedLabel = 'foo(String s, int i)';
+    testSignature(
+        content,
+        expectedLabel,
+        'Does foo.',
+        [
+          ParameterInformation(label: 'String s'),
+          ParameterInformation(label: 'int i'),
+        ],
+        CharacterLocation(3, 7));
+  }
+
+  void test_typeParams_class() {
+    final content = '''
+/// My Foo.
+class Foo<T1, T2 extends String> {}
+
+class Bar extends Foo<^> {}
+''';
+
+    testSignature(
+        content,
+        'class Foo<T1, T2 extends String>',
+        'My Foo.',
+        [
+          ParameterInformation(label: 'T1'),
+          ParameterInformation(label: 'T2 extends String')
+        ],
+        CharacterLocation(4, 23));
+  }
+
+  void test_typeParams_function() {
+    final content = '''
+/// My Foo.
+void foo<T1, T2 extends String>() {
+  foo<^>();
+}
+''';
+
+    testSignature(
+        content,
+        'void foo<T1, T2 extends String>()',
+        'My Foo.',
+        [
+          ParameterInformation(label: 'T1'),
+          ParameterInformation(label: 'T2 extends String')
+        ],
+        CharacterLocation(3, 7));
+  }
+
+  void test_typeParams_method() {
+    final content = '''
+class Foo {
+  /// My Foo.
+  void foo<T1, T2 extends String>() {
+    foo<^>();
+  }
+}
+''';
+
+    testSignature(
+        content,
+        'void foo<T1, T2 extends String>()',
+        'My Foo.',
+        [
+          ParameterInformation(label: 'T1'),
+          ParameterInformation(label: 'T2 extends String')
+        ],
+        CharacterLocation(4, 9));
+  }
+
+  void testSignature(
+      String content,
+      String expectedLabel,
+      String expectedDoc,
+      List<ParameterInformation> expectedParameters,
+      CharacterLocation leftParenLocation) {
+    var result = _compute(content);
+    var signature = result!.signatureHelp.signatures.first;
+    final expected =
+        MarkupContent(kind: MarkupKind.Markdown, value: expectedDoc);
+    expect(signature.label, expectedLabel);
+    expect(signature.documentation!.valueEquals(expected), isTrue);
+    expect(ListEquality().equals(expectedParameters, signature.parameters),
+        isTrue);
+    expect(result.callStart == leftParenLocation, isTrue);
+  }
+
+  SignatureHelpResponse? _compute(String content) {
+    _updateFile(content);
+
+    return CiderSignatureHelpComputer(
+      fileResolver,
+    ).compute(
+      convertPath(testPath),
+      _correctionContext.line,
+      _correctionContext.character,
+    );
+  }
+
+  void _updateFile(String content) {
+    var offset = content.indexOf('^');
+    expect(offset, isPositive, reason: 'Expected to find ^');
+    expect(content.indexOf('^', offset + 1), -1, reason: 'Expected only one ^');
+
+    var lineInfo = LineInfo.fromContent(content);
+    var location = lineInfo.getLocation(offset);
+
+    content = content.substring(0, offset) + content.substring(offset + 1);
+    newFile(testPath, content: content);
+
+    _correctionContext = _CorrectionContext(
+      content,
+      offset,
+      location.lineNumber - 1,
+      location.columnNumber - 1,
+    );
+  }
+}
+
+class _CorrectionContext {
+  final String content;
+  final int offset;
+  final int line;
+  final int character;
+
+  _CorrectionContext(this.content, this.offset, this.line, this.character);
+}
diff --git a/pkg/analysis_server/test/src/cider/test_all.dart b/pkg/analysis_server/test/src/cider/test_all.dart
index 95c39ca..2220710 100644
--- a/pkg/analysis_server/test/src/cider/test_all.dart
+++ b/pkg/analysis_server/test/src/cider/test_all.dart
@@ -8,6 +8,7 @@
 import 'completion_test.dart' as completion;
 import 'fixes_test.dart' as fixes;
 import 'rename_test.dart' as rename;
+import 'signature_help_test.dart' as signature;
 
 void main() {
   defineReflectiveSuite(() {
@@ -15,5 +16,6 @@
     completion.main();
     fixes.main();
     rename.main();
+    signature.main();
   });
 }
diff --git a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
index 83a9954..3c99d77 100644
--- a/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closing_labels_computer_test.dart
@@ -23,7 +23,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_adjacentLinesExcluded() async {
diff --git a/pkg/analysis_server/test/src/computer/color_computer_test.dart b/pkg/analysis_server/test/src/computer/color_computer_test.dart
new file mode 100644
index 0000000..1178812
--- /dev/null
+++ b/pkg/analysis_server/test/src/computer/color_computer_test.dart
@@ -0,0 +1,343 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/computer/computer_color.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/diagnostic/diagnostic.dart';
+import 'package:collection/collection.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../abstract_context.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ColorComputerTest);
+  });
+}
+
+@reflectiveTest
+class ColorComputerTest extends AbstractContextTest {
+  /// A map of Dart source code that represents different types/formats
+  /// that are valid in const contexts.
+  ///
+  /// Values are the color that should be discovered (in 0xAARRGGBB format).
+  ///
+  /// Color values may not match the actual Flutter framework but are
+  /// values that are more identifyable for ease of testing. They are
+  /// defined in:
+  ///  - test/mock_packages/flutter/lib/src/material/colors.dart.
+  ///  - test/mock_packages/flutter/lib/src/cupertino/colors.dart.
+  ///
+  /// These values will be iterated in tests and inserted into various
+  /// code snippets for testing.
+  static const colorCodesConst = {
+    // dart:ui Colors
+    'Colors.white': 0xFFFFFFFF,
+    'Color(0xFF0000FF)': 0xFF0000FF,
+    'Color.fromARGB(255, 0, 0, 255)': 0xFF0000FF,
+    'Color.fromRGBO(0, 0, 255, 1)': 0xFF0000FF,
+    // Flutter Painting
+    'ColorSwatch(0xFF89ABCD, {})': 0xFF89ABCD,
+    // Flutter Material
+    'Colors.red': 0xFFFF0000,
+    'Colors.redAccent': 0xFFFFAA00,
+    'MaterialAccentColor(0xFF89ABCD, {})': 0xFF89ABCD,
+    // Flutter Cupertino
+    'CupertinoColors.black': 0xFF000000,
+    'CupertinoColors.systemBlue': 0xFF0000FF,
+    'CupertinoColors.activeBlue': 0xFF0000FF,
+  };
+
+  /// A map of Dart source code that represents different types/formats
+  /// that are not valid in const contexts.
+  ///
+  /// Values are the color that should be discovered (in 0xAARRGGBB format).
+  static const colorCodesNonConst = {
+    // Flutter Material
+    'Colors.red.shade100': 0x10FF0000,
+    'Colors.red[100]': 0x10FF0000,
+    // Flutter Cupertino
+    'CupertinoColors.systemBlue.color': 0xFF0000FF,
+    'CupertinoColors.systemBlue.darkColor': 0xFF000099,
+    'CupertinoColors.activeBlue.color': 0xFF0000FF,
+    'CupertinoColors.activeBlue.darkColor': 0xFF000099,
+    'CupertinoColors.activeBlue.highContrastColor': 0xFF000066,
+    'CupertinoColors.activeBlue.darkHighContrastColor': 0xFF000033,
+    'CupertinoColors.activeBlue.elevatedColor': 0xFF0000FF,
+    'CupertinoColors.activeBlue.darkElevatedColor': 0xFF000099,
+  };
+
+  /// A map of Dart source code that creates multiple nested color references.
+  ///
+  /// The key is the source code, and the value is a map of the expressions and
+  /// colors that should be produced (where the null key represents the
+  /// entire expression).
+  static const colorCodesNested = {
+    // TODO(dantup): Remove this "const" when we can evaluate constructors
+    // in non-const contexts.
+    'const CupertinoDynamicColor.withBrightness(color: CupertinoColors.white, darkColor: CupertinoColors.black)':
+        {
+      null: 0xFFFFFFFF,
+      'CupertinoColors.white': 0xFFFFFFFF,
+      'CupertinoColors.black': 0xFF000000,
+    },
+  };
+
+  late String testPath;
+  late String otherPath;
+
+  late ColorComputer computer;
+
+  /// Tests that all of the known color codes replaced into [code] produce the
+  /// expected nested color values.
+  ///
+  /// If [onlyConst] is `true`, only the test values that are const will be
+  /// tested.
+  Future<void> checkAllColors(String code, {bool onlyConst = false}) async {
+    // Combine the flat and nested colours into the same format.
+    final allColorCodes = <String, Map<String?, int>>{
+      ...colorCodesConst.map((key, value) => MapEntry(key, {key: value})),
+      if (!onlyConst)
+        ...colorCodesNonConst.map((key, value) => MapEntry(key, {key: value})),
+      ...colorCodesNested,
+    };
+
+    for (final entry in allColorCodes.entries) {
+      final colorDartCode = entry.key;
+      final expectedColorValues = entry.value.map(
+        // A null key means we should expect the full code.
+        (key, value) => MapEntry(key ?? colorDartCode, value),
+      );
+
+      await expectColors(
+        code.replaceAll('[[COLOR]]', colorDartCode),
+        expectedColorValues,
+      );
+    }
+  }
+
+  /// Checks that all of [expectedColorValues] are produced for [dartCode].
+  Future<void> expectColors(
+    String dartCode,
+    Map<String, int> expectedColorValues, {
+    String? otherCode,
+  }) async {
+    dartCode = _withCommonImports(dartCode);
+    otherCode = otherCode != null ? _withCommonImports(otherCode) : null;
+
+    newFile(testPath, content: dartCode);
+    if (otherCode != null) {
+      newFile(otherPath, content: otherCode);
+      final otherResult =
+          await session.getResolvedUnit(otherPath) as ResolvedUnitResult;
+      expectNoErrors(otherResult);
+    }
+    final result =
+        await session.getResolvedUnit(testPath) as ResolvedUnitResult;
+    expectNoErrors(result);
+
+    computer = ColorComputer(result);
+    final colors = computer.compute();
+
+    expect(
+      colors,
+      hasLength(expectedColorValues.length),
+      reason: '${expectedColorValues.length} colors should be detected in:\n'
+          '$dartCode',
+    );
+
+    expectedColorValues.entries.forEachIndexed((i, expectedColor) {
+      final color = colors[i];
+      final expectedColorCode = expectedColor.key;
+      final expectedColorValue = expectedColor.value;
+      final expectedAlpha = (0xff000000 & expectedColorValue) >> 24;
+      final expectedRed = (0x00ff0000 & expectedColorValue) >> 16;
+      final expectedGreen = (0x0000ff00 & expectedColorValue) >> 8;
+      final expectedBlue = (0x000000ff & expectedColorValue) >> 0;
+
+      final regionText =
+          dartCode.substring(color.offset, color.offset + color.length);
+      expect(
+        regionText,
+        equals(expectedColorCode),
+        reason: 'Color $i expected $expectedColorCode but was $regionText',
+      );
+
+      void expectComponent(int actual, int expected, String name) => expect(
+            actual,
+            expected,
+            reason: '$name value for $expectedColorCode is not correct',
+          );
+
+      expectComponent(color.color.alpha, expectedAlpha, 'Alpha');
+      expectComponent(color.color.red, expectedRed, 'Red');
+      expectComponent(color.color.green, expectedGreen, 'Green');
+      expectComponent(color.color.blue, expectedBlue, 'Blue');
+    });
+  }
+
+  void expectNoErrors(ResolvedUnitResult result) {
+    // If the test code has errors, generate a suitable failure to help debug.
+    final errors = result.errors
+        .where((error) => error.severity == Severity.error)
+        .toList();
+    if (errors.isNotEmpty) {
+      throw 'Code has errors: $errors\n\n${result.content}';
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    writeTestPackageConfig(flutter: true);
+    testPath = convertPath('$testPackageLibPath/test.dart');
+    otherPath = convertPath('$testPackageLibPath/other_file.dart');
+  }
+
+  Future<void> test_collectionLiteral_const() async {
+    const testCode = '''
+main() {
+  const colors = [
+    [[COLOR]],
+  ];
+}
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_collectionLiteral_nonConst() async {
+    const testCode = '''
+main() {
+  final colors = [
+    [[COLOR]],
+  ];
+}
+''';
+    await checkAllColors(testCode);
+  }
+
+  Future<void> test_customClass() async {
+    const testCode = '''
+import 'other_file.dart';
+
+void main() {
+  final a1 = MyTheme.staticWhite;
+  final a2 = MyTheme.staticMaterialRedAccent;
+  const theme = MyTheme();
+  final b1 = theme.instanceWhite;
+  final b2 = theme.instanceMaterialRedAccent;
+}
+''';
+
+    const otherCode = '''
+class MyTheme {
+  static const Color staticWhite = Colors.white;
+  static const MaterialAccentColor staticMaterialRedAccent = Colors.redAccent;
+
+  final Color instanceWhite;
+  final MaterialAccentColor instanceMaterialRedAccent;
+
+  const MyTheme()
+      : instanceWhite = Colors.white,
+        instanceMaterialRedAccent = Colors.redAccent;
+}
+''';
+    await expectColors(
+      testCode,
+      {
+        'MyTheme.staticWhite': 0xFFFFFFFF,
+        'MyTheme.staticMaterialRedAccent': 0xFFFFAA00,
+        'theme.instanceWhite': 0xFFFFFFFF,
+        'theme.instanceMaterialRedAccent': 0xFFFFAA00,
+      },
+      otherCode: otherCode,
+    );
+  }
+
+  Future<void> test_local_const() async {
+    const testCode = '''
+main() {
+  const a = [[COLOR]];
+}
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_local_nonConst() async {
+    const testCode = '''
+main() {
+  final a = [[COLOR]];
+}
+''';
+    await checkAllColors(testCode);
+  }
+
+  Future<void> test_namedParameter_const() async {
+    const testCode = '''
+main() {
+  const w = Widget(color: [[COLOR]]);
+}
+
+class Widget {
+  final Color? color;
+  const Widget({this.color});
+}
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_namedParameter_nonConst() async {
+    const testCode = '''
+main() {
+  final w = Widget(color: [[COLOR]]);
+}
+
+class Widget {
+  final Color? color;
+  Widget({this.color});
+}
+''';
+    await checkAllColors(testCode);
+  }
+
+  Future<void> test_nested_const() async {
+    const testCode = '''
+main() {
+  const a = [[COLOR]];
+}
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_nested_nonConst() async {
+    const testCode = '''
+main() {
+  final a = [[COLOR]];
+}
+''';
+    await checkAllColors(testCode);
+  }
+
+  Future<void> test_topLevel_const() async {
+    const testCode = '''
+const a = [[COLOR]];
+''';
+    await checkAllColors(testCode, onlyConst: true);
+  }
+
+  Future<void> test_topLevel_nonConst() async {
+    const testCode = '''
+final a = [[COLOR]];
+''';
+    await checkAllColors(testCode);
+  }
+
+  String _withCommonImports(String code) => '''
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/painting.dart';
+import 'package:flutter/material.dart';
+
+$code''';
+}
diff --git a/pkg/analysis_server/test/src/computer/folding_computer_test.dart b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
index f63607d..bba4d0b 100644
--- a/pkg/analysis_server/test/src/computer/folding_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
@@ -29,7 +29,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_annotations() async {
diff --git a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
index 46a6c44..d1a90d3 100644
--- a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
@@ -25,7 +25,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_comment() async {
diff --git a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
index fed52b7..133ab24 100644
--- a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
@@ -57,7 +57,7 @@
   @override
   void setUp() {
     super.setUp();
-    path = convertPath('/home/test/lib/test.dart');
+    path = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_createEdits_addImport_noDirectives() async {
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index a63d9bc..cf1cf9a 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -46,7 +46,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_dartAsync_noPrefix() async {
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index 185338f..c215a6c 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -24,7 +24,7 @@
   @override
   void setUp() {
     super.setUp();
-    testPath = convertPath('/home/test/lib/test.dart');
+    testPath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<Outline> _computeOutline(String code) async {
@@ -123,7 +123,7 @@
     void writeOutline(Outline outline, String indent) {
       buffer.write(indent);
       buffer.writeln(outline.element.name);
-      for (var child in outline.children ?? const []) {
+      for (var child in outline.children ?? const <Outline>[]) {
         writeOutline(child, '$indent  ');
       }
     }
diff --git a/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart b/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
index 27e9e7f..ee07e86 100644
--- a/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/selection_range_computer_test.dart
@@ -22,7 +22,7 @@
   @override
   void setUp() {
     super.setUp();
-    sourcePath = convertPath('/home/test/lib/test.dart');
+    sourcePath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_arguments() async {
diff --git a/pkg/analysis_server/test/src/computer/test_all.dart b/pkg/analysis_server/test/src/computer/test_all.dart
index 6f67c7a..af15c51 100644
--- a/pkg/analysis_server/test/src/computer/test_all.dart
+++ b/pkg/analysis_server/test/src/computer/test_all.dart
@@ -5,6 +5,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'closing_labels_computer_test.dart' as closing_labels_computer;
+import 'color_computer_test.dart' as color_computer;
 import 'folding_computer_test.dart' as folding_computer;
 import 'highlights_computer_test.dart' as highlights_computer;
 import 'import_elements_computer_test.dart' as import_elements_computer;
@@ -15,6 +16,7 @@
 void main() {
   defineReflectiveSuite(() {
     closing_labels_computer.main();
+    color_computer.main();
     folding_computer.main();
     highlights_computer.main();
     import_elements_computer.main();
diff --git a/pkg/analysis_server/test/src/domain_abstract_test.dart b/pkg/analysis_server/test/src/domain_abstract_test.dart
index 1116cbf..5a64d54 100644
--- a/pkg/analysis_server/test/src/domain_abstract_test.dart
+++ b/pkg/analysis_server/test/src/domain_abstract_test.dart
@@ -2,9 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_abstract.dart';
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/protocol_server.dart' hide Element;
+import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:analyzer/instrumentation/service.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -92,10 +94,10 @@
 }
 
 class TestAbstractRequestHandler extends AbstractRequestHandler {
-  TestAbstractRequestHandler(server) : super(server);
+  TestAbstractRequestHandler(AnalysisServer server) : super(server);
 
   @override
-  Response handleRequest(Request request) {
+  Response handleRequest(Request request, CancellationToken cancellationToken) {
     fail('Unexpected invocation of handleRequest');
   }
 }
diff --git a/pkg/analysis_server/test/src/domains/execution/completion_test.dart b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
index 81d2594..4f3af62 100644
--- a/pkg/analysis_server/test/src/domains/execution/completion_test.dart
+++ b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
@@ -25,7 +25,7 @@
   late RuntimeCompletionResult result;
 
   void addContextFile(String content) {
-    contextFile = convertPath('/home/test/lib/context.dart');
+    contextFile = convertPath('$testPackageLibPath/context.dart');
     addSource(contextFile, content);
 
     contextOffset = content.indexOf('// context line');
@@ -120,13 +120,13 @@
 
   @FailingTest(reason: 'No support for OverlayResourceProvider')
   Future<void> test_inPart() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 part 'b.dart';
 part 'context.dart';
 
 int a;
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 part of 'a.dart';
 
 double b;
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index c224c12..e55c554 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -27,7 +27,7 @@
   void setUp() {
     super.setUp();
     writeTestPackageConfig(flutter: true);
-    testPath = convertPath('/home/test/lib/test.dart');
+    testPath = convertPath('$testPackageLibPath/test.dart');
   }
 
   Future<void> test_attribute_namedExpression() async {
@@ -234,7 +234,7 @@
   }
 
   Future<void> test_children_closure_blockBody() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 import 'package:flutter/widgets.dart';
 
 class WidgetA extends StatelessWidget {
@@ -270,7 +270,7 @@
   }
 
   Future<void> test_children_closure_expressionBody() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 import 'package:flutter/widgets.dart';
 
 class WidgetA extends StatelessWidget {
@@ -443,7 +443,7 @@
   }
 
   Future<void> test_parentAssociationLabel() async {
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 import 'package:flutter/widgets.dart';
 
 class WidgetA extends StatelessWidget {
diff --git a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
index 0f7483d..5504afb 100644
--- a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
@@ -468,23 +468,10 @@
   server.Notification? sentNotification;
 
   @override
-  void close() {
-    fail('Unexpected invocation of close');
-  }
-
-  @override
-  void listen(void Function(server.Request) onRequest,
-      {Function? onError, void Function()? onDone}) {
-    fail('Unexpected invocation of listen');
-  }
+  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 
   @override
   void sendNotification(server.Notification notification) {
     sentNotification = notification;
   }
-
-  @override
-  void sendResponse(server.Response response) {
-    fail('Unexpected invocation of sendResponse');
-  }
 }
diff --git a/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart b/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
index 8c8bc43..9f66816 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
@@ -27,7 +27,7 @@
   }
 
   Future<CompletionSuggestion> forTopLevelFunction(String functionName) async {
-    var request = DartCompletionRequest(
+    var request = DartCompletionRequest.forResolvedUnit(
       resolvedUnit: testAnalysisResult,
       offset: 0,
     );
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
index a12a654..c9d3b7f 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
@@ -84,7 +84,7 @@
   }
 
   Future<void> test_declaredIdentifier_addImport_dartUri() async {
-    addSource('/home/test/lib/my_lib.dart', r'''
+    addSource('$testPackageLibPath/my_lib.dart', r'''
 import 'dart:collection';
 List<HashMap<String, int>> getMap() => null;
 ''');
@@ -173,7 +173,7 @@
   }
 
   Future<void> test_local_addImport_dartUri() async {
-    addSource('/home/test/lib/my_lib.dart', r'''
+    addSource('$testPackageLibPath/my_lib.dart', r'''
 import 'dart:collection';
 HashMap<String, int> getMap() => null;
 ''');
@@ -194,7 +194,7 @@
   }
 
   Future<void> test_local_addImport_notLibraryUnit() async {
-    addSource('/home/test/lib/my_lib.dart', r'''
+    addSource('$testPackageLibPath/my_lib.dart', r'''
 import 'dart:collection';
 HashMap<String, int> getMap() => null;
 ''');
@@ -211,7 +211,7 @@
 }
 ''');
 
-    var appPath = convertPath('/home/test/lib/app.dart');
+    var appPath = convertPath('$testPackageLibPath/app.dart');
     addSource(appPath, appCode);
     await analyzeTestPackageFiles();
     await resolveTestFile();
@@ -646,7 +646,7 @@
   }
 
   Future<void> test_privateType_closureParameter() async {
-    addSource('/home/test/lib/my_lib.dart', '''
+    addSource('$testPackageLibPath/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -662,7 +662,7 @@
   }
 
   Future<void> test_privateType_declaredIdentifier() async {
-    addSource('/home/test/lib/my_lib.dart', '''
+    addSource('$testPackageLibPath/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -683,7 +683,7 @@
   Future<void> test_privateType_list() async {
     // This is now failing because we're suggesting "List" rather than nothing.
     // Is it really better to produce nothing?
-    addSource('/home/test/lib/my_lib.dart', '''
+    addSource('$testPackageLibPath/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
@@ -721,7 +721,7 @@
   }
 
   Future<void> test_privateType_variable() async {
-    addSource('/home/test/lib/my_lib.dart', '''
+    addSource('$testPackageLibPath/my_lib.dart', '''
 library my_lib;
 class A {}
 class _B extends A {}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
index 4f99ef9..37f3d66 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
@@ -20,12 +20,12 @@
   AssistKind get kind => DartAssistKind.CONVERT_PART_OF_TO_URI;
 
   Future<void> test_nonSibling() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 library foo;
 part 'src/bar.dart';
 ''');
 
-    testFile = convertPath('/home/test/lib/src/bar.dart');
+    testFile = convertPath('$testPackageLibPath/src/bar.dart');
     addTestSource('''
 part of foo;
 ''');
@@ -38,12 +38,12 @@
   }
 
   Future<void> test_sibling() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 library foo;
 part 'bar.dart';
 ''');
 
-    testFile = convertPath('/home/test/lib/bar.dart');
+    testFile = convertPath('$testPackageLibPath/bar.dart');
     addTestSource('''
 part of foo;
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
index 1fe3d84..3665770 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_package_import_test.dart
@@ -21,7 +21,7 @@
   AssistKind get kind => DartAssistKind.CONVERT_TO_PACKAGE_IMPORT;
 
   Future<void> test_fileName_onImport() async {
-    addSource('/home/test/lib/foo.dart', '');
+    addSource('$testPackageLibPath/foo.dart', '');
 
     await resolveTestCode('''
 import 'foo.dart';
@@ -33,7 +33,7 @@
   }
 
   Future<void> test_fileName_onUri() async {
-    addSource('/home/test/lib/foo.dart', '');
+    addSource('$testPackageLibPath/foo.dart', '');
 
     await resolveTestCode('''
 import 'foo.dart';
@@ -52,8 +52,8 @@
   }
 
   Future<void> test_nonPackage_Uri() async {
-    addSource('/home/test/lib/foo.dart', '');
-    testFile = convertPath('/home/test/lib/src/test.dart');
+    addSource('$testPackageLibPath/foo.dart', '');
+    testFile = convertPath('$testPackageLibPath/src/test.dart');
     await resolveTestCode('''
 import 'dart:core';
 ''');
@@ -63,7 +63,7 @@
   }
 
   Future<void> test_packageUri() async {
-    addSource('/home/test/lib/foo.dart', '');
+    addSource('$testPackageLibPath/foo.dart', '');
 
     await resolveTestCode('''
 import 'package:test/foo.dart';
@@ -73,9 +73,9 @@
   }
 
   Future<void> test_path() async {
-    addSource('/home/test/lib/foo/bar.dart', '');
+    addSource('$testPackageLibPath/foo/bar.dart', '');
 
-    testFile = convertPath('/home/test/lib/src/test.dart');
+    testFile = convertPath('$testPackageLibPath/src/test.dart');
 
     await resolveTestCode('''
 import '../foo/bar.dart';
@@ -89,7 +89,7 @@
   Future<void> test_relativeImport_noAssistWithLint() async {
     createAnalysisOptionsFile(lints: [LintNames.avoid_relative_lib_imports]);
     verifyNoTestUnitErrors = false;
-    addSource('/home/test/lib/foo.dart', '');
+    addSource('$testPackageLibPath/foo.dart', '');
 
     await resolveTestCode('''
 import '../lib/foo.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
index 58b527a..320890d 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
@@ -85,7 +85,7 @@
   }
 
   Future<void> test_setterOnDirective() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 void set setter(int i) {}
 ''');
     await resolveTestCode('''
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
index 4fb3e72..b02dad3 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
@@ -120,7 +120,7 @@
   }
 
   Future<void> test_privateType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   _B b => _B();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
index 8ff04db..6cc2306 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_late_test.dart
@@ -40,7 +40,7 @@
   FixKind get kind => DartFixKind.ADD_LATE;
 
   Future<void> test_changeInImportedLib() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class C {
   final String s;
 }
@@ -56,11 +56,11 @@
 class C {
   late final String s;
 }
-''', target: '/home/test/lib/a.dart');
+''', target: '$testPackageLibPath/a.dart');
   }
 
   Future<void> test_changeInPart() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 part 'test.dart';
 
 class C {
@@ -80,7 +80,7 @@
 class C {
   late final String s;
 }
-''', target: '/home/test/lib/a.dart');
+''', target: '$testPackageLibPath/a.dart');
   }
 
   Future<void> test_withFinal() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
index dc08b79..798725d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
@@ -102,7 +102,7 @@
   }
 
   Future<void> test_constructor_single() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {
   A({required int a}) {}
 }
@@ -126,7 +126,7 @@
   }
 
   Future<void> test_constructor_single_closure() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef void VoidCallback();
 
 class A {
@@ -152,7 +152,7 @@
   }
 
   Future<void> test_constructor_single_closure2() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef void Callback(e);
 
 class A {
@@ -178,7 +178,7 @@
   }
 
   Future<void> test_constructor_single_closure3() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef void Callback(a,b,c);
 
 class A {
@@ -204,7 +204,7 @@
   }
 
   Future<void> test_constructor_single_closure4() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef int Callback(int a, String b,c);
 
 class A {
@@ -230,7 +230,7 @@
   }
 
   Future<void> test_constructor_single_closure_nnbd() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef int Callback(int? a);
 
 class A {
@@ -256,7 +256,7 @@
   }
 
   Future<void> test_constructor_single_closure_nnbd_from_legacy() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 // @dart = 2.8
 import 'package:meta/meta.dart';
 
@@ -287,7 +287,7 @@
   }
 
   Future<void> test_constructor_single_closure_nnbd_into_legacy() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 typedef int Callback(int? a);
 
 class A {
@@ -315,7 +315,7 @@
   }
 
   Future<void> test_constructor_single_list() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {
   A({required List<String> names}) {}
 }
@@ -338,6 +338,28 @@
 ''');
   }
 
+  Future<void> test_constructor_single_namedAnywhere() async {
+    addSource('$testPackageLibPath/a.dart', r'''
+class A {
+  A(int a, int b, {int? c, required int d}) {}
+}
+''');
+    await resolveTestCode('''
+import 'package:test/a.dart';
+
+void f() {
+  A(0, c: 1, 2);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  A(0, c: 1, 2, d: null);
+}
+''');
+  }
+
   Future<void> test_multiple() async {
     await resolveTestCode('''
 test({required int a, required int bcd}) {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
index 5cb45e5..65b56f4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_null_check_test.dart
@@ -363,7 +363,7 @@
 }
 ''',
         errorFilter: (AnalysisError error) =>
-            error.errorCode != CompileTimeErrorCode.YIELD_OF_INVALID_TYPE);
+            error.errorCode != CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE);
   }
 
   Future<void> test_yieldEach_localFunction() async {
@@ -402,7 +402,7 @@
 }
 ''',
         errorFilter: (AnalysisError error) =>
-            error.errorCode != CompileTimeErrorCode.YIELD_OF_INVALID_TYPE);
+            error.errorCode != CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE);
   }
 
   Future<void> test_yieldEach_topLevel() async {
@@ -417,6 +417,6 @@
 }
 ''',
         errorFilter: (AnalysisError error) =>
-            error.errorCode != CompileTimeErrorCode.YIELD_OF_INVALID_TYPE);
+            error.errorCode != CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE);
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_return_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_return_null_test.dart
new file mode 100644
index 0000000..f12fd37
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_return_null_test.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddReturnNullBulkTest);
+    defineReflectiveTests(AddReturnNullTest);
+  });
+}
+
+@reflectiveTest
+class AddReturnNullBulkTest extends BulkFixProcessorTest {
+  Future<void> test_singleFile() async {
+    await resolveTestCode('''
+int? f() {
+  // ignore: unused_element
+  int? g() {
+    if (1 == 2) return 5;
+  }
+  if (1 == 2) return 7;
+}
+''');
+    await assertHasFix('''
+int? f() {
+  // ignore: unused_element
+  int? g() {
+    if (1 == 2) return 5;
+    return null;
+  }
+  if (1 == 2) return 7;
+  return null;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class AddReturnNullTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_RETURN_NULL;
+
+  Future<void> test_functionExpression() async {
+    await resolveTestCode('''
+int? Function() f = () {
+  if (1 == 2) return 7;
+};
+''');
+    await assertHasFix('''
+int? Function() f = () {
+  if (1 == 2) return 7;
+  return null;
+};
+''');
+  }
+
+  Future<void> test_functionExpression_empty() async {
+    await resolveTestCode('''
+int? Function() f = () {};
+''');
+    await assertHasFix('''
+int? Function() f = () {
+  return null;
+};
+''');
+  }
+
+  Future<void> test_localFunction() async {
+    await resolveTestCode('''
+void m() {
+  // ignore: unused_element
+  int? f() {
+    if (1 == 2) return 7;
+  }
+}
+''');
+    await assertHasFix('''
+void m() {
+  // ignore: unused_element
+  int? f() {
+    if (1 == 2) return 7;
+    return null;
+  }
+}
+''');
+  }
+
+  Future<void> test_method() async {
+    await resolveTestCode('''
+class A {
+  int? m() {
+    if (1 == 2) return 7;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int? m() {
+    if (1 == 2) return 7;
+    return null;
+  }
+}
+''');
+  }
+
+  Future<void> test_topLevelFunction_block() async {
+    await resolveTestCode('''
+int? f() {
+  if (1 == 2) return 7;
+}
+''');
+    await assertHasFix('''
+int? f() {
+  if (1 == 2) return 7;
+  return null;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
index 1a40007..e00bd37 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_return_type_test.dart
@@ -179,7 +179,7 @@
   }
 
   Future<void> test_privateType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   _B b => _B();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
index 63abb76..12c14cf3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
@@ -58,12 +58,12 @@
   }
 
   Future<void> test_method_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {
   static foo() {}
 }
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 class B extends A {}
@@ -142,12 +142,12 @@
   }
 
   Future<void> test_property_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {
   static get foo => null;
 }
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 class B extends A {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
index ca26deb..9db4307 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
@@ -57,7 +57,7 @@
   }
 
   Future<void> test_privateType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   _B b => _B();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
index e4952f3..c59880a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_package_import_test.dart
@@ -24,7 +24,7 @@
   @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44673')
   Future<void> test_singleFile() async {
     writeTestPackageConfig(config: PackageConfigFileBuilder());
-    addSource('/home/test/lib/bar.dart', 'class Bar {}');
+    addSource('$testPackageLibPath/bar.dart', 'class Bar {}');
 
     testFile = convertPath('/home/test/tool/test.dart');
 
@@ -55,7 +55,7 @@
     // This test fails because any attempt to specify a relative path that
     // includes 'lib' (which the lint requires) results in a malformed URI when
     // trying to resolve the import.
-    newFile('/home/test/lib/foo/bar.dart', content: '''
+    newFile('$testPackageLibPath/foo/bar.dart', content: '''
 class C {}
 ''');
     await resolveTestCode('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
index 260d20f..dfd5961 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_relative_import_test.dart
@@ -23,13 +23,13 @@
   String get lintCode => LintNames.prefer_relative_imports;
 
   Future<void> test_singleFile() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    addSource('/home/test/lib/bar.dart', '''
+    addSource('$testPackageLibPath/bar.dart', '''
 class D {}
 ''');
-    testFile = convertPath('/home/test/lib/src/test.dart');
+    testFile = convertPath('$testPackageLibPath/src/test.dart');
 
     await resolveTestCode('''
 import 'package:test/bar.dart';
@@ -55,10 +55,10 @@
   String get lintCode => LintNames.prefer_relative_imports;
 
   Future<void> test_relativeImport() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    testFile = convertPath('/home/test/lib/src/test.dart');
+    testFile = convertPath('$testPackageLibPath/src/test.dart');
     await resolveTestCode('''
 import 'package:test/foo.dart';
 C? c;
@@ -82,8 +82,8 @@
   }
 
   Future<void> test_relativeImportGarbledUri() async {
-    addSource('/home/test/lib/foo.dart', '');
-    testFile = convertPath('/home/test/lib/bar.dart');
+    addSource('$testPackageLibPath/foo.dart', '');
+    testFile = convertPath('$testPackageLibPath/bar.dart');
     await resolveTestCode('''
 import 'package:test/foo';
 ''');
@@ -96,10 +96,10 @@
   }
 
   Future<void> test_relativeImportRespectQuoteStyle() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    testFile = convertPath('/home/test/lib/bar.dart');
+    testFile = convertPath('$testPackageLibPath/bar.dart');
     await resolveTestCode('''
 import "package:test/foo.dart";
 C? c;
@@ -112,10 +112,10 @@
   }
 
   Future<void> test_relativeImportSameDirectory() async {
-    addSource('/home/test/lib/foo.dart', '''
+    addSource('$testPackageLibPath/foo.dart', '''
 class C {}
 ''');
-    testFile = convertPath('/home/test/lib/bar.dart');
+    testFile = convertPath('$testPackageLibPath/bar.dart');
     await resolveTestCode('''
 import 'package:test/foo.dart';
 C? c;
@@ -128,10 +128,10 @@
   }
 
   Future<void> test_relativeImportSubDirectory() async {
-    addSource('/home/test/lib/baz/foo.dart', '''
+    addSource('$testPackageLibPath/baz/foo.dart', '''
 class C {}
 ''');
-    testFile = convertPath('/home/test/lib/test.dart');
+    testFile = convertPath('$testPackageLibPath/test.dart');
     await resolveTestCode('''
 import 'package:test/baz/foo.dart';
 C? c;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
index b8df672..976bef5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
@@ -73,7 +73,7 @@
   }
 
   Future<void> test_inLibraryOfPrefix() async {
-    addSource('/home/test/lib/lib.dart', r'''
+    addSource('$testPackageLibPath/lib.dart', r'''
 class A {}
 ''');
 
@@ -92,7 +92,7 @@
 
 class Test {
 }
-''', target: '/home/test/lib/lib.dart');
+''', target: '$testPackageLibPath/lib.dart');
     expect(change.linkedEditGroups, hasLength(1));
   }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart
index 4831635..6095520 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart
@@ -50,10 +50,10 @@
   }
 
   Future<void> test_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 class B {
@@ -104,7 +104,7 @@
 ''');
   }
 
-  Future<void> test_named() async {
+  Future<void> test_namedConstructor() async {
     await resolveTestCode('''
 class A {
   A.named(p1, int p2);
@@ -129,6 +129,56 @@
 ''');
   }
 
+  Future<void> test_namedOptionalParams() async {
+    await resolveTestCode('''
+class A {
+  A(p1, int p2, List<String> p3, {int? p4});
+}
+class B extends A {
+  int existingField = 0;
+
+  void existingMethod() {}
+}
+''');
+    await assertHasFix('''
+class A {
+  A(p1, int p2, List<String> p3, {int? p4});
+}
+class B extends A {
+  int existingField = 0;
+
+  B(p1, int p2, List<String> p3) : super(p1, p2, p3);
+
+  void existingMethod() {}
+}
+''');
+  }
+
+  Future<void> test_namedRequiredParams() async {
+    await resolveTestCode('''
+class A {
+  A(p1, int p2, List<String> p3, {required int p4, required int p5});
+}
+class B extends A {
+  int existingField = 0;
+
+  void existingMethod() {}
+}
+''');
+    await assertHasFix('''
+class A {
+  A(p1, int p2, List<String> p3, {required int p4, required int p5});
+}
+class B extends A {
+  int existingField = 0;
+
+  B(p1, int p2, List<String> p3, {required int p4, required int p5}) : super(p1, p2, p3, p4: p4, p5: p5);
+
+  void existingMethod() {}
+}
+''');
+  }
+
   Future<void> test_optional() async {
     await resolveTestCode('''
 class A {
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 8b98fb5..96d0f22 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
@@ -41,7 +41,7 @@
   FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR;
 
   Future<void> test_inLibrary_insteadOfSyntheticDefault() async {
-    var a = newFile('/home/test/lib/a.dart', content: '''
+    var a = newFile('$testPackageLibPath/a.dart', content: '''
 /// $_text200
 class A {}
 ''').path;
@@ -61,7 +61,7 @@
   }
 
   Future<void> test_inLibrary_named() async {
-    var a = newFile('/home/test/lib/a.dart', content: '''
+    var a = newFile('$testPackageLibPath/a.dart', content: '''
 /// $_text200
 class A {}
 ''').path;
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 1e0b056..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
@@ -131,7 +131,7 @@
   }
 
   Future<void> test_getter_qualified_instance_differentLibrary() async {
-    addSource('/home/test/lib/other.dart', '''
+    addSource('$testPackageLibPath/other.dart', '''
 /**
  * A comment to push the offset of the braces for the following class
  * declaration past the end of the content of the test file. Used to catch an
@@ -161,7 +161,7 @@
 class A {
   int test;
 }
-''', target: '/home/test/lib/other.dart');
+''', target: '$testPackageLibPath/other.dart');
   }
 
   Future<void> test_getter_qualified_instance_dynamicType() async {
@@ -317,11 +317,11 @@
   }
 
   Future<void> test_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 ''');
 
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 A getA() => null;
@@ -365,7 +365,7 @@
   }
 
   Future<void> test_inPart_imported() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 part of lib;
 class A {}
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart
index 988c679..f9e4644 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart
@@ -29,7 +29,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/my_file.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/my_file.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(
@@ -47,7 +47,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/my_file.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/my_file.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(
@@ -72,7 +72,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/a/bb/my_lib.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/a/bb/my_lib.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(
@@ -110,7 +110,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/my_part.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/my_part.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(fileEdit.edits[0].replacement, contains("part of 'test.dart';"));
@@ -125,7 +125,7 @@
     var fileEdits = change.edits;
     expect(fileEdits, hasLength(1));
     var fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/home/test/lib/foo/my_part.dart'));
+    expect(fileEdit.file, convertPath('$testPackageLibPath/foo/my_part.dart'));
     expect(fileEdit.fileStamp, -1);
     expect(fileEdit.edits, hasLength(1));
     expect(fileEdit.edits[0].replacement, contains("part of '../test.dart';"));
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
index 2d663fc..1018a76 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
@@ -259,10 +259,10 @@
   }
 
   Future<void> test_functionType_importType() async {
-    addSource('/home/test/lib/a.dart', r'''
+    addSource('$testPackageLibPath/a.dart', r'''
 class A {}
 ''');
-    addSource('/home/test/lib/b.dart', r'''
+    addSource('$testPackageLibPath/b.dart', r'''
 import 'package:test/a.dart';
 
 useFunction(int g(A a)) {}
@@ -348,7 +348,7 @@
   }
 
   Future<void> test_importType() async {
-    addSource('/home/test/lib/lib.dart', r'''
+    addSource('$testPackageLibPath/lib.dart', r'''
 library lib;
 import 'dart:async';
 Future getFuture() => null;
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 7c382e6..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
@@ -249,7 +249,7 @@
   }
 
   Future<void> test_qualified_instance_differentLibrary() async {
-    addSource('/home/test/lib/other.dart', '''
+    addSource('$testPackageLibPath/other.dart', '''
 /**
  * A comment to push the offset of the braces for the following class
  * declaration past the end of the content of the test file. Used to catch an
@@ -279,7 +279,7 @@
 class A {
   int get test => null;
 }
-''', target: '/home/test/lib/other.dart');
+''', target: '$testPackageLibPath/other.dart');
   }
 
   Future<void> test_qualified_instance_dynamicType() async {
@@ -307,7 +307,7 @@
   }
 
   Future<void> test_qualified_instance_inPart_imported() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 part of lib;
 
 class A {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart
index 185784b..dbfcc51 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart
@@ -834,8 +834,8 @@
 }
 ''';
 
-    addSource('/home/test/lib/test2.dart', code2);
-    addSource('/home/test/lib/test3.dart', r'''
+    addSource('$testPackageLibPath/test2.dart', code2);
+    addSource('$testPackageLibPath/test3.dart', r'''
 library test3;
 class E {}
 ''');
@@ -855,11 +855,11 @@
 class D {
   void foo(bbb.E e) {}
 }
-''', target: '/home/test/lib/test2.dart');
+''', target: '$testPackageLibPath/test2.dart');
   }
 
   Future<void> test_parameterType_inTargetUnit() async {
-    addSource('/home/test/lib/test2.dart', r'''
+    addSource('$testPackageLibPath/test2.dart', r'''
 class D {
 }
 
@@ -880,7 +880,7 @@
 }
 
 class E {}
-''', target: '/home/test/lib/test2.dart');
+''', target: '$testPackageLibPath/test2.dart');
   }
 
   Future<void> test_static() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart
index b0871a1..fb68eca 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart
@@ -35,7 +35,7 @@
     var libCode = r'''
 class A {}
 ''';
-    addSource('/home/test/lib/lib.dart', libCode);
+    addSource('$testPackageLibPath/lib.dart', libCode);
     await resolveTestCode('''
 import 'lib.dart' as lib;
 
@@ -50,7 +50,7 @@
 
 mixin Test {
 }
-''', target: '/home/test/lib/lib.dart');
+''', target: '$testPackageLibPath/lib.dart');
     expect(change.linkedEditGroups, hasLength(1));
   }
 
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 4534817..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
@@ -245,7 +245,7 @@
   }
 
   Future<void> test_qualified_instance_differentLibrary() async {
-    addSource('/home/test/lib/other.dart', '''
+    addSource('$testPackageLibPath/other.dart', '''
 /**
  * A comment to push the offset of the braces for the following class
  * declaration past the end of the content of the test file. Used to catch an
@@ -274,7 +274,7 @@
 class A {
   set test(int test) {}
 }
-''', target: '/home/test/lib/other.dart');
+''', target: '$testPackageLibPath/other.dart');
   }
 
   Future<void> test_qualified_instance_dynamicType() async {
@@ -302,7 +302,7 @@
   }
 
   Future<void> test_qualified_instance_inPart_imported() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 part of lib;
 
 class A {}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
index fab212b..dff9c05 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart
@@ -477,13 +477,17 @@
   /// Return the kind of element whose parameters are being modified.
   String get _kind;
 
-  Transform _add(int index, {List<String>? components, String? extendedType}) =>
+  Transform _add(int index,
+          {List<String>? components,
+          String? extendedType,
+          bool isStatic = false}) =>
       Transform(
           title: 'title',
           date: DateTime.now(),
           element: ElementDescriptor(
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind)!,
+              isStatic: isStatic,
               components: components ?? ['m', 'C']),
           bulkApply: false,
           changesSelector: UnconditionalChangesSelector([
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
index cb280c7..82353b0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test.dart
@@ -1134,7 +1134,7 @@
     - kind: 'rename'
       newName: 'New'
 ''');
-    addSource('/home/test/lib/test.config', '''
+    addSource('$testPackageLibPath/test.config', '''
 'Rename to New':
   bulkApply: true
 ''');
@@ -1169,7 +1169,9 @@
 import '$importUri';
 void f(Old p) {}
 ''');
-    await assertNoFix();
+    await assertHasFix('''
+void f(Old p) {}
+''');
   }
 }
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/incompatible_element_kind_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/incompatible_element_kind_test.dart
new file mode 100644
index 0000000..4561ddd
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/incompatible_element_kind_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IncompatibleElementKindTest);
+  });
+}
+
+@reflectiveTest
+class IncompatibleElementKindTest extends AbstractTransformSetParserTest {
+  void test_integer() {
+    assertErrors('''
+version: 1
+transforms:
+- title: 'Replace'
+  date: 2021-11-30
+  element:
+    uris: ['test.dart']
+    method: 'm'
+    inClass: 'C'
+  changes:
+    - kind: 'replacedBy'
+      newElement:
+        uris: ['test.dart']
+        variable: 'v'
+''', [
+      error(TransformSetErrorCode.incompatibleElementKind, 191, 42),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_change_for_kind_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_change_for_kind_test.dart
new file mode 100644
index 0000000..ee118e9
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_change_for_kind_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidChangeForKindTest);
+  });
+}
+
+@reflectiveTest
+class InvalidChangeForKindTest extends AbstractTransformSetParserTest {
+  void test_integer() {
+    assertErrors('''
+version: 1
+transforms:
+- title: 'Replace'
+  date: 2021-11-30
+  element:
+    uris: ['test.dart']
+    class: 'C'
+  changes:
+    - kind: 'replacedBy'
+      newElement:
+        uris: ['test.dart']
+        class: 'D'
+''', [
+      error(TransformSetErrorCode.invalidChangeForKind, 173, 39),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
index bb2464ae..6ec3458 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/test_all.dart
@@ -6,6 +6,8 @@
 
 import 'conflicting_key_test.dart' as conflicting_key;
 import 'expected_primary_test.dart' as expected_primary;
+import 'incompatible_element_kind_test.dart' as incompatible_element_kind;
+import 'invalid_change_for_kind_test.dart' as invalid_change_for_kind;
 import 'invalid_character_test.dart' as invalid_character;
 import 'invalid_key_test.dart' as invalid_key;
 import 'invalid_parameter_style_test.dart' as invalid_parameter_style;
@@ -21,6 +23,8 @@
 import 'unexpected_token_test.dart' as unexpected_token;
 import 'unknown_accessor_test.dart' as unknown_accessor;
 import 'unsupported_key_test.dart' as unsupported_key;
+import 'unsupported_static_test.dart' as unsupported_static;
+import 'unsupported_uri_change_test.dart' as unsupported_uri_change;
 import 'unsupported_version_test.dart' as unsupported_version;
 import 'wrong_token_test.dart' as wrong_token;
 import 'yaml_syntax_error_test.dart' as yaml_syntax_error;
@@ -29,6 +33,8 @@
   defineReflectiveSuite(() {
     conflicting_key.main();
     expected_primary.main();
+    incompatible_element_kind.main();
+    invalid_change_for_kind.main();
     invalid_character.main();
     invalid_key.main();
     invalid_parameter_style.main();
@@ -44,6 +50,8 @@
     unexpected_token.main();
     unknown_accessor.main();
     unsupported_key.main();
+    unsupported_static.main();
+    unsupported_uri_change.main();
     unsupported_version.main();
     wrong_token.main();
     yaml_syntax_error.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_static_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_static_test.dart
new file mode 100644
index 0000000..2ef1446
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_static_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnsupportedStaticTest);
+  });
+}
+
+@reflectiveTest
+class UnsupportedStaticTest extends AbstractTransformSetParserTest {
+  void test_class() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2021-11-22
+  element:
+    uris: ['test.dart']
+    class: 'C'
+    static: true
+  changes: []
+''', [
+      error(TransformSetErrorCode.unsupportedStatic, 108, 6),
+    ]);
+  }
+
+  void test_getter_inClass() {
+    assertNoErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2021-11-22
+  element:
+    uris: ['test.dart']
+    getter: 'm'
+    inClass: 'C'
+    static: true
+  changes: []
+''');
+  }
+
+  void test_getter_topLevel() {
+    assertErrors('''
+version: 1
+transforms:
+- title: ''
+  date: 2021-11-22
+  element:
+    uris: ['test.dart']
+    getter: 'g'
+    static: true
+  changes: []
+''', [
+      error(TransformSetErrorCode.unsupportedStatic, 109, 6),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_uri_change_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_uri_change_test.dart
new file mode 100644
index 0000000..ecc493a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_uri_change_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../transform_set_parser_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnsupportedUriChangeTest);
+  });
+}
+
+@reflectiveTest
+class UnsupportedUriChangeTest extends AbstractTransformSetParserTest {
+  void test_integer() {
+    assertErrors('''
+version: 1
+transforms:
+- title: 'Replace'
+  date: 2021-11-30
+  element:
+    uris: ['test.dart']
+    function: 'f'
+  changes:
+    - kind: 'replacedBy'
+      newElement:
+        uris: ['other.dart']
+        function: 'g'
+''', [
+      error(TransformSetErrorCode.unsupportedUriChange, 182, 14),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
index e9e0363..16ec4ae 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart
@@ -41,8 +41,11 @@
 class ElementMatcherComponentAndKindTest extends AbstractElementMatcherTest {
   /// The kinds that are expected where a getter or setter is allowed.
   static List<ElementKind> accessorKinds = [
+    ElementKind.constantKind,
     ElementKind.fieldKind,
+    ElementKind.functionKind, // tear-off
     ElementKind.getterKind,
+    ElementKind.methodKind, // tear-off
     ElementKind.setterKind,
   ];
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
index 535320f..8fcb8d5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/modify_parameters_test.dart
@@ -1006,13 +1006,15 @@
   String get _kind;
 
   Transform _modify(List<String> originalComponents,
-          List<ParameterModification> modifications, {String? newName}) =>
+          List<ParameterModification> modifications,
+          {String? newName, bool isStatic = false}) =>
       Transform(
           title: 'title',
           date: DateTime.now(),
           element: ElementDescriptor(
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind)!,
+              isStatic: isStatic,
               components: originalComponents),
           bulkApply: false,
           changesSelector: UnconditionalChangesSelector([
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart
index 59d5f50..eb0bafa 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_parameter_test.dart
@@ -328,13 +328,15 @@
   /// Return the kind of element containing the parameter being renamed.
   String get _kind;
 
-  Transform _rename(List<String> components, String oldName, String newName) =>
+  Transform _rename(List<String> components, String oldName, String newName,
+          {bool isStatic = false}) =>
       Transform(
           title: 'title',
           date: DateTime.now(),
           element: ElementDescriptor(
               libraryUris: [Uri.parse(importUri)],
               kind: ElementKindUtilities.fromName(_kind)!,
+              isStatic: isStatic,
               components: components),
           bulkApply: false,
           changesSelector: UnconditionalChangesSelector([
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
index cf1aeb9..d39a127 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
@@ -1533,15 +1533,18 @@
   /// Return the kind of element being renamed.
   String get _kind;
 
-  Transform _rename(List<String> components, String newName) => Transform(
-      title: 'title',
-      date: DateTime.now(),
-      element: ElementDescriptor(
-          libraryUris: [Uri.parse(importUri)],
-          kind: ElementKindUtilities.fromName(_kind)!,
-          components: components),
-      bulkApply: false,
-      changesSelector: UnconditionalChangesSelector([
-        Rename(newName: newName),
-      ]));
+  Transform _rename(List<String> components, String newName,
+          {bool isStatic = false}) =>
+      Transform(
+          title: 'title',
+          date: DateTime.now(),
+          element: ElementDescriptor(
+              libraryUris: [Uri.parse(importUri)],
+              kind: ElementKindUtilities.fromName(_kind)!,
+              isStatic: isStatic,
+              components: components),
+          bulkApply: false,
+          changesSelector: UnconditionalChangesSelector([
+            Rename(newName: newName),
+          ]));
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/replaced_by_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/replaced_by_test.dart
new file mode 100644
index 0000000..a7b70a4
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/replaced_by_test.dart
@@ -0,0 +1,1076 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix/data_driven/changes_selector.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_kind.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/replaced_by.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'data_driven_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplacedByTest);
+  });
+}
+
+@reflectiveTest
+class ReplacedByTest extends DataDrivenFixProcessorTest {
+  Future<void> test_defaultConstructor_defaultConstructor() async {
+    await _assertReplacement(
+      _Element.defaultConstructor(isDeprecated: true, isOld: true),
+      _Element.defaultConstructor(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_defaultConstructor_defaultConstructor_prefixed() async {
+    await _assertReplacement(
+      _Element.defaultConstructor(isDeprecated: true, isOld: true),
+      _Element.defaultConstructor(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_defaultConstructor_namedConstructor() async {
+    await _assertReplacement(
+      _Element.defaultConstructor(isDeprecated: true, isOld: true),
+      _Element.namedConstructor(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_defaultConstructor_namedConstructor_prefixed() async {
+    await _assertReplacement(
+      _Element.defaultConstructor(isDeprecated: true, isOld: true),
+      _Element.namedConstructor(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_enumConstant() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_enumConstant_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_staticField() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_enumConstant_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_staticGetter() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_enumConstant_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_enumConstant_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_enumConstant_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_enumConstant_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.constant(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_function_function_invocation() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.topLevelFunction(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_function_function_invocation_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.topLevelFunction(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_function_function_tearoff() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.topLevelFunction(),
+    );
+  }
+
+  Future<void> test_function_function_tearoff_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.topLevelFunction(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_function_staticMethod_invocation() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.method(isStatic: true),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_function_staticMethod_invocation_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.method(isStatic: true),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_function_staticMethod_tearoff() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.method(isStatic: true),
+    );
+  }
+
+  Future<void> test_function_staticMethod_tearoff_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelFunction(isDeprecated: true, isOld: true),
+      _Element.method(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_namedConstructor_defaultConstructor() async {
+    await _assertReplacement(
+      _Element.namedConstructor(isDeprecated: true, isOld: true),
+      _Element.defaultConstructor(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_namedConstructor_defaultConstructor_prefixed() async {
+    await _assertReplacement(
+      _Element.namedConstructor(isDeprecated: true, isOld: true),
+      _Element.defaultConstructor(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_namedConstructor_namedConstructor() async {
+    await _assertReplacement(
+      _Element.namedConstructor(isDeprecated: true, isOld: true),
+      _Element.namedConstructor(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_namedConstructor_namedConstructor_prefixed() async {
+    await _assertReplacement(
+      _Element.namedConstructor(isDeprecated: true, isOld: true),
+      _Element.namedConstructor(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_enumConstant() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_staticField_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_staticField() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticField_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_staticGetter() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticField_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_staticSetter() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticField_staticSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_staticField_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_topLevelSetter() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticField_topLevelSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticField_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_staticField_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.field(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_enumConstant() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_staticGetter_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_staticField() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticGetter_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_staticGetter() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticGetter_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_staticGetter_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticGetter_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_staticGetter_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.getter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticMethod_function_invocation() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelFunction(),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_staticMethod_function_invocation_prefixed() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelFunction(),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticMethod_function_tearoff() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelFunction(),
+    );
+  }
+
+  Future<void> test_staticMethod_function_tearoff_prefixed() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelFunction(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticMethod_staticMethod_invocation() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.method(isStatic: true),
+      isInvocation: true,
+    );
+  }
+
+  Future<void> test_staticMethod_staticMethod_invocation_prefixed() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.method(isStatic: true),
+      isInvocation: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticMethod_staticMethod_tearoff() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.method(isStatic: true),
+    );
+  }
+
+  Future<void> test_staticMethod_staticMethod_tearoff_prefixed() async {
+    await _assertReplacement(
+      _Element.method(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.method(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticSetter_staticField() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticSetter_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.field(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticSetter_staticSetter() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticSetter_staticSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticSetter_topLevelSetter() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticSetter_topLevelSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_staticSetter_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_staticSetter_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.setter(isDeprecated: true, isOld: true, isStatic: true),
+      _Element.topLevelVariable(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_enumConstant() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_topLevelGetter_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_staticField() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_topLevelGetter_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_staticGetter() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_topLevelGetter_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_topLevelGetter_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelGetter_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_topLevelGetter_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelGetter(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_staticField() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_staticSetter() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_staticSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_topLevelSetter() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_topLevelSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelSetter_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelSetter(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_enumConstant() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.constant(),
+    );
+  }
+
+  Future<void> test_topLevelVariable_enumConstant_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.constant(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticField() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticField_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.field(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticGetter() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.getter(isStatic: true),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticSetter() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_staticSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.setter(isStatic: true),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelGetter() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelGetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelGetter(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelSetter() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelSetter_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelSetter(),
+      isAssignment: true,
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelVariable() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+    );
+  }
+
+  Future<void> test_topLevelVariable_topLevelVariable_prefixed() async {
+    await _assertReplacement(
+      _Element.topLevelVariable(isDeprecated: true, isOld: true),
+      _Element.topLevelVariable(),
+      isPrefixed: true,
+    );
+  }
+
+  Future<void> _assertReplacement(_Element oldElement, _Element newElement,
+      {bool isAssignment = false,
+      bool isInvocation = false,
+      bool isPrefixed = false}) async {
+    assert(!(isAssignment && isInvocation));
+    setPackageContent('''
+${oldElement.declaration}
+${newElement.declaration}
+''');
+    setPackageData(_replacedBy(oldElement.kind, oldElement.components,
+        newElement.kind, newElement.components));
+    var prefixDeclaration = isPrefixed ? ' as p' : '';
+    var prefixReference = isPrefixed ? 'p.' : '';
+    var invocation = isInvocation ? '()' : '';
+    if (isAssignment) {
+      await resolveTestCode('''
+import '$importUri'$prefixDeclaration;
+
+void g() {
+  $prefixReference${oldElement.reference} = 0;
+}
+''');
+      await assertHasFix('''
+import '$importUri'$prefixDeclaration;
+
+void g() {
+  $prefixReference${newElement.reference} = 0;
+}
+''');
+      return;
+    }
+    await resolveTestCode('''
+import '$importUri'$prefixDeclaration;
+
+var x = $prefixReference${oldElement.reference}$invocation;
+''');
+    await assertHasFix('''
+import '$importUri'$prefixDeclaration;
+
+var x = $prefixReference${newElement.reference}$invocation;
+''');
+  }
+
+  Transform _replacedBy(ElementKind oldKind, List<String> oldComponents,
+      ElementKind newKind, List<String> newComponents,
+      {bool isStatic = false}) {
+    var uris = [Uri.parse(importUri)];
+    var oldElement = ElementDescriptor(
+        libraryUris: uris,
+        kind: oldKind,
+        isStatic: isStatic,
+        components: oldComponents);
+    var newElement2 = ElementDescriptor(
+        libraryUris: uris,
+        kind: newKind,
+        isStatic: isStatic,
+        components: newComponents);
+    return Transform(
+        title: 'title',
+        date: DateTime.now(),
+        element: oldElement,
+        bulkApply: true,
+        changesSelector: UnconditionalChangesSelector([
+          ReplacedBy(newElement: newElement2),
+        ]));
+  }
+}
+
+class _Element {
+  final ElementKind kind;
+  final List<String> components;
+  final String declaration;
+
+  _Element(this.kind, this.components, this.declaration);
+
+  // ignore: unused_element
+  factory _Element.class_({bool isDeprecated = false, bool isOld = false}) {
+    var name = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated, isTopLevel: true);
+    return _Element(
+      ElementKind.classKind,
+      [name],
+      '''
+${annotation}class $name {}''',
+    );
+  }
+
+  factory _Element.constant({bool isDeprecated = false, bool isOld = false}) {
+    var enumName = isOld ? 'E_old' : 'E_new';
+    var constantName = isOld ? 'c_old' : 'c_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.constantKind,
+      [constantName, enumName],
+      '''
+enum $enumName {
+  $annotation$constantName
+}''',
+    );
+  }
+
+  factory _Element.defaultConstructor(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.constructorKind,
+      ['', className],
+      '''
+class $className {
+  $annotation$className();
+}''',
+    );
+  }
+
+  // ignore: unused_element
+  factory _Element.enum_({bool isDeprecated = false, bool isOld = false}) {
+    var enumName = isOld ? 'E_old' : 'E_new';
+    var constantName = isOld ? 'c_old' : 'c_new';
+    var annotation = _annotation(isDeprecated: isDeprecated, isTopLevel: true);
+    return _Element(
+      ElementKind.enumKind,
+      [enumName],
+      '''
+${annotation}enum $enumName { $constantName }''',
+    );
+  }
+
+  factory _Element.field(
+      {bool isDeprecated = false, bool isOld = false, bool isStatic = false}) {
+    var fieldName = isOld ? 'sf_old' : 'sf_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    var keyword = isStatic ? 'static ' : '';
+    return _Element(
+      ElementKind.fieldKind,
+      [fieldName, className],
+      '''
+class $className {
+  $annotation${keyword}int $fieldName = 0;
+}''',
+    );
+  }
+
+  factory _Element.getter(
+      {bool isDeprecated = false, bool isOld = false, bool isStatic = false}) {
+    var getterName = isOld ? 'g_old' : 'g_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    var keyword = isStatic ? 'static ' : '';
+    return _Element(
+      ElementKind.getterKind,
+      [getterName, className],
+      '''
+class $className {
+  $annotation${keyword}int get $getterName => 0;
+}''',
+    );
+  }
+
+  factory _Element.method(
+      {bool isDeprecated = false, bool isOld = false, bool isStatic = false}) {
+    var methodName = isOld ? 'm_old' : 'm_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    var keyword = isStatic ? 'static ' : '';
+    return _Element(
+      ElementKind.methodKind,
+      [methodName, className],
+      '''
+class $className {
+  $annotation${keyword}int $methodName() => 0;
+}''',
+    );
+  }
+
+  factory _Element.namedConstructor(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var constructorName = isOld ? 'c_old' : 'c_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.constructorKind,
+      [constructorName, className],
+      '''
+class $className {
+  $annotation$className.$constructorName();
+}''',
+    );
+  }
+
+  factory _Element.setter(
+      {bool isDeprecated = false, bool isOld = false, bool isStatic = false}) {
+    var setterName = isOld ? 's_old' : 's_new';
+    var className = isOld ? 'C_old' : 'C_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    var keyword = isStatic ? 'static ' : '';
+    return _Element(
+      ElementKind.setterKind,
+      [setterName, className],
+      '''
+class $className {
+  $annotation${keyword}set $setterName(int v) {}
+}''',
+    );
+  }
+
+  factory _Element.topLevelFunction(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var name = isOld ? 'f_old' : 'f_new';
+    var annotation = _annotation(isDeprecated: isDeprecated, isTopLevel: true);
+    return _Element(
+      ElementKind.functionKind,
+      [name],
+      '''
+${annotation}int $name() => 0;''',
+    );
+  }
+
+  factory _Element.topLevelGetter(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var getterName = isOld ? 'g_old' : 'g_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.getterKind,
+      [getterName],
+      '''
+${annotation}int get $getterName => 0;''',
+    );
+  }
+
+  factory _Element.topLevelSetter(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var setterName = isOld ? 's_old' : 's_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.setterKind,
+      [setterName],
+      '''
+${annotation}set $setterName(int v) {}''',
+    );
+  }
+
+  factory _Element.topLevelVariable(
+      {bool isDeprecated = false, bool isOld = false}) {
+    var name = isOld ? 'v_old' : 'v_new';
+    var annotation = _annotation(isDeprecated: isDeprecated, isTopLevel: true);
+    return _Element(
+      ElementKind.variableKind,
+      [name],
+      '''
+${annotation}int $name = 0;''',
+    );
+  }
+
+  // ignore: unused_element
+  factory _Element.typedef({bool isDeprecated = false, bool isOld = false}) {
+    var name = isOld ? 'T_old' : 'T_new';
+    var annotation = _annotation(isDeprecated: isDeprecated);
+    return _Element(
+      ElementKind.typedefKind,
+      [name],
+      '''
+${annotation}typedef $name = int Function();''',
+    );
+  }
+
+  String get reference {
+    if (components[0].isEmpty) {
+      return components[1];
+    }
+    return components.reversed.join('.');
+  }
+
+  static String _annotation(
+      {required bool isDeprecated, bool isTopLevel = false}) {
+    var indent = isTopLevel ? '' : '  ';
+    return isDeprecated ? '@deprecated\n$indent' : '';
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
index 64cffa2..544f27c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
@@ -15,6 +15,7 @@
 import 'modify_parameters_test.dart' as modify_parameters;
 import 'rename_parameter_test.dart' as rename_parameter;
 import 'rename_test.dart' as rename;
+import 'replaced_by_test.dart' as replaced_by;
 import 'sdk_fix_test.dart' as sdk_fix;
 import 'transform_override_set_parser_test.dart'
     as transform_override_set_parser;
@@ -34,6 +35,7 @@
     modify_parameters.main();
     rename_parameter.main();
     rename.main();
+    replaced_by.main();
     sdk_fix.main();
     transform_override_set_parser.main();
     transform_set_manager.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_override_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_override_set_parser_test.dart
index af7b127..9d4c388 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_override_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_override_set_parser_test.dart
@@ -15,7 +15,7 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(TransformSetParserTest);
+    defineReflectiveTests(TransformOverrideSetParserTest);
   });
 }
 
@@ -64,7 +64,8 @@
 }
 
 @reflectiveTest
-class TransformSetParserTest extends AbstractTransformOverrideSetParserTest {
+class TransformOverrideSetParserTest
+    extends AbstractTransformOverrideSetParserTest {
   void test_emptyFile() {
     assertErrors('''
 ''', [error(TransformSetErrorCode.invalidValue, 0, 0)]);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
index 42d762b..4205071 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_manager_test.dart
@@ -33,7 +33,7 @@
 
     addSource('/home/test/pubspec.yaml', '');
 
-    var testFile = convertPath('/home/test/lib/test.dart');
+    var testFile = convertPath('$testPackageLibPath/test.dart');
     addSource(testFile, '');
     var result = await session.getResolvedLibraryValid(testFile);
     var sets = manager.forLibrary(result.element);
@@ -44,7 +44,7 @@
     // addTestPackageDependency('p1', '/.pub-cache/p1');
     // addTestPackageDependency('p2', '/.pub-cache/p2');
     addSource('/home/test/pubspec.yaml', '');
-    var testFile = convertPath('/home/test/lib/test.dart');
+    var testFile = convertPath('$testPackageLibPath/test.dart');
     addSource(testFile, '');
     var result = await session.getResolvedLibraryValid(testFile);
     var sets = manager.forLibrary(result.element);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
index 08c69d5..95055f4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
@@ -7,11 +7,13 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/changes_selector.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_kind.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_matcher.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/expression.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/modify_parameters.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/replaced_by.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
@@ -523,6 +525,32 @@
     var transform = transforms[0];
     expect(transform.title, 'Rename m');
     expect(_changes(transform), isEmpty);
+    var element = transform.element;
+    expect(element.components, ['m', 'A']);
+    expect(element.isStatic, isFalse);
+  }
+
+  void test_element_method_inExtension_static() {
+    assertNoErrors('''
+version: 1
+transforms:
+- title: 'Rename m'
+  date: 2020-09-02
+  element:
+    uris: ['test.dart']
+    method: 'm'
+    inExtension: 'E'
+    static: true
+  changes: []
+''');
+    var transforms = _transforms('m');
+    expect(transforms, hasLength(1));
+    var transform = transforms[0];
+    expect(transform.title, 'Rename m');
+    expect(_changes(transform), isEmpty);
+    var element = transform.element;
+    expect(element.components, ['m', 'E']);
+    expect(element.isStatic, isTrue);
   }
 
   void test_element_variable() {
@@ -673,6 +701,34 @@
     expect(rename.newName, 'B');
   }
 
+  void test_replacedBy() {
+    assertNoErrors('''
+version: 1
+transforms:
+- title: 'Replace'
+  date: 2021-11-30
+  element:
+    uris: ['test.dart']
+    function: 'f'
+  changes:
+    - kind: 'replacedBy'
+      newElement:
+        uris: ['test.dart']
+        method: 'm'
+        inClass: 'C'
+''');
+    var transforms = _transforms('f');
+    expect(transforms, hasLength(1));
+    var transform = transforms[0];
+    expect(transform.title, 'Replace');
+    var changes = _changes(transform);
+    expect(changes, hasLength(1));
+    var change = changes[0] as ReplacedBy;
+    var newElement = change.newElement;
+    expect(newElement.kind, ElementKind.methodKind);
+    expect(newElement.components, ['m', 'C']);
+  }
+
   void test_requiredIf() {
     assertNoErrors('''
 version: 1
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index 00f2730..fc0eaa0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -3,13 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
-import 'package:analysis_server/src/services/completion/dart/extension_cache.dart';
 import 'package:analysis_server/src/services/correction/bulk_fix_processor.dart';
 import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
-import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
@@ -87,9 +84,11 @@
   /// neither [assertHasFix] nor [assertHasFixAllFix] has been invoked.
   late String resultCode;
 
-  /// Return a list of the experiments that are to be enabled for tests in this
-  /// class, or `null` if there are no experiments that should be enabled.
-  List<String>? get experiments => null;
+  /// The processor used to compute bulk fixes.
+  late BulkFixProcessor processor;
+
+  @override
+  List<String> get experiments => const [];
 
   /// Return the lint code being tested.
   String? get lintCode => null;
@@ -140,7 +139,7 @@
 
   /// Returns the source change for computed fixes in the specified [testUnit].
   Future<SourceChange> _computeSourceChange() async {
-    var processor = await computeFixes();
+    processor = await computeFixes();
     return processor.builder.sourceChange;
   }
 
@@ -195,21 +194,11 @@
 
   /// Computes fixes for the given [error] in [testUnit].
   Future<List<Fix>> _computeFixes(AnalysisError error) async {
-    var analysisContext = contextFor(testFile);
-
-    var tracker = DeclarationsTracker(MemoryByteStore(), resourceProvider);
-    tracker.addContext(analysisContext);
-
     var context = DartFixContextImpl(
       TestInstrumentationService(),
       workspace,
       testAnalysisResult,
       error,
-      (name) {
-        var provider = TopLevelDeclarationsProvider(tracker);
-        provider.doTrackerWork();
-        return provider.get(analysisContext, testFile, name);
-      },
     );
 
     var fixes = await FixInFileProcessor(context).compute();
@@ -254,18 +243,9 @@
 
 /// A base class defining support for writing fix processor tests.
 abstract class FixProcessorTest extends BaseFixProcessorTest {
-  /// The extension cache used for test purposes.
-  ExtensionCache extensionCache = ExtensionCache();
-
   /// Return the kind of fixes being tested by this test class.
   FixKind get kind;
 
-  Future<void> addUnimportedFile(String filePath, String content) async {
-    addSource(filePath, content);
-    var result = await session.getResolvedUnit(convertPath(filePath));
-    extensionCache.cacheFromResult(result as ResolvedUnitResult);
-  }
-
   Future<void> assertHasFix(String expected,
       {bool Function(AnalysisError)? errorFilter,
       int? length,
@@ -516,23 +496,11 @@
 
   /// Computes fixes for the given [error] in [testUnit].
   Future<List<Fix>> _computeFixes(AnalysisError error) async {
-    var analysisContext = contextFor(testFile);
-
-    var tracker = DeclarationsTracker(MemoryByteStore(), resourceProvider);
-    tracker.addContext(analysisContext);
-    extensionCache.cacheFromResult(testAnalysisResult);
-
     var context = DartFixContextImpl(
       TestInstrumentationService(),
       workspace,
       testAnalysisResult,
       error,
-      (name) {
-        var provider = TopLevelDeclarationsProvider(tracker);
-        provider.doTrackerWork();
-        return provider.get(analysisContext, testFile, name);
-      },
-      extensionCache: extensionCache,
     );
     return await DartFixContributor().computeFixes(context);
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart
index 9630237..3219e6e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart
@@ -21,57 +21,56 @@
 
   Future<void> test_withClass() async {
     await resolveTestCode('''
-import 'dart:collection' as pref;
-main() {
-  pref.HashMap? s = null;
-  LinkedHashMap? f = null;
-  print('\$s \$f');
-}
+import 'dart:collection' as prefix;
+
+void f(prefix.HashMap a, HashMap b) {}
 ''');
     await assertHasFix('''
-import 'dart:collection' as pref;
-main() {
-  pref.HashMap? s = null;
-  pref.LinkedHashMap? f = null;
-  print('\$s \$f');
-}
+import 'dart:collection' as prefix;
+
+void f(prefix.HashMap a, prefix.HashMap b) {}
 ''');
   }
 
   Future<void> test_withExtension() async {
-    addSource('/home/test/lib/lib.dart', '''
-class C {}
+    addSource('$testPackageLibPath/a.dart', '''
 extension E on int {
-  static String m() => '';
+  static int foo() => 0;
 }
 ''');
     await resolveTestCode('''
-import 'lib.dart' as p;
-void f(p.C c) {
-  print(E.m());
+import 'a.dart' as prefix;
+
+void f() {
+  prefix.E.foo();
+  E.foo();
 }
 ''');
     await assertHasFix('''
-import 'lib.dart' as p;
-void f(p.C c) {
-  print(p.E.m());
+import 'a.dart' as prefix;
+
+void f() {
+  prefix.E.foo();
+  prefix.E.foo();
 }
 ''');
   }
 
   Future<void> test_withTopLevelVariable() async {
     await resolveTestCode('''
-import 'dart:math' as pref;
-main() {
-  print(pref.e);
-  print(pi);
+import 'dart:math' as prefix;
+
+void f() {
+  prefix.e;
+  pi;
 }
 ''');
     await assertHasFix('''
-import 'dart:math' as pref;
-main() {
-  print(pref.e);
-  print(pref.pi);
+import 'dart:math' as prefix;
+
+void f() {
+  prefix.e;
+  prefix.pi;
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
index 5173579..75e8a94 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
@@ -24,7 +24,7 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT1;
 
   Future<void> test_alreadyImported_package() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class A {}
 class B {}
 ''');
@@ -40,14 +40,14 @@
   }
 
   Future<void> test_extension_notImported_field_onThisType_fromClass() async {
-    addUnimportedFile('/home/test/lib/lib2.dart', '''
+    addSource('$testPackageLibPath/lib2.dart', '''
 import 'package:test/lib1.dart';
 
 extension E on C {
   int m() => 0;
 }
 ''');
-    addSource('/home/test/lib/lib1.dart', '''
+    addSource('$testPackageLibPath/lib1.dart', '''
 class C {}
 ''');
     await resolveTestCode('''
@@ -68,7 +68,7 @@
   }
 
   Future<void> test_extension_notImported_getter() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 extension E on String {
   int get m => 0;
 }
@@ -88,7 +88,7 @@
   }
 
   Future<void> test_extension_notImported_method() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 extension E on String {
   void m() {}
 }
@@ -108,7 +108,7 @@
   }
 
   Future<void> test_extension_notImported_method_extendsGeneric() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 import 'package:test/lib1.dart';
 
 extension E<T extends num> on List<T> {
@@ -130,14 +130,14 @@
   }
 
   Future<void> test_extension_notImported_method_onThisType_fromClass() async {
-    addUnimportedFile('/home/test/lib/lib2.dart', '''
+    addSource('$testPackageLibPath/lib2.dart', '''
 import 'package:test/lib1.dart';
 
 extension E on C {
   void m() {}
 }
 ''');
-    addSource('/home/test/lib/lib1.dart', '''
+    addSource('$testPackageLibPath/lib1.dart', '''
 class C {}
 ''');
     await resolveTestCode('''
@@ -163,14 +163,14 @@
 
   Future<void>
       test_extension_notImported_method_onThisType_fromExtension() async {
-    addUnimportedFile('/home/test/lib/lib2.dart', '''
+    addSource('$testPackageLibPath/lib2.dart', '''
 import 'package:test/lib1.dart';
 
 extension E on C {
   void m() {}
 }
 ''');
-    addSource('/home/test/lib/lib1.dart', '''
+    addSource('$testPackageLibPath/lib1.dart', '''
 class C {}
 ''');
     await resolveTestCode('''
@@ -195,7 +195,7 @@
   }
 
   Future<void> test_extension_notImported_operator() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 extension E on String {
   String operator -(String other) => this;
 }
@@ -215,7 +215,7 @@
   }
 
   Future<void> test_extension_notImported_setter() async {
-    addUnimportedFile('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 extension E on String {
   set m(int v) {}
 }
@@ -234,8 +234,46 @@
 ''');
   }
 
+  Future<void> test_extension_otherPackage_exported_fromSrc() async {
+    var pkgRootPath = '$packagesRootPath/aaa';
+
+    newFile('$pkgRootPath/lib/a.dart', content: r'''
+export 'src/b.dart';
+''');
+
+    newFile('$pkgRootPath/lib/src/b.dart', content: r'''
+extension IntExtension on int {
+  int get foo => 0;
+}
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: pkgRootPath),
+    );
+
+    updateTestPubspecFile('''
+dependencies:
+  aaa: any
+''');
+
+    await resolveTestCode('''
+void f() {
+  0.foo;
+}
+''');
+
+    await assertHasFix('''
+import 'package:aaa/a.dart';
+
+void f() {
+  0.foo;
+}
+''');
+  }
+
   Future<void> test_invalidUri_interpolation() async {
-    addSource('/home/test/lib/lib.dart', r'''
+    addSource('$testPackageLibPath/lib.dart', r'''
 class Test {
   const Test();
 }
@@ -261,11 +299,13 @@
   }
 
   Future<void> test_lib() async {
-    newFile('/.pub-cache/my_pkg/lib/a.dart', content: 'class Test {}');
+    newFile('$packagesRootPath/my_pkg/lib/a.dart', content: '''
+class Test {}
+''');
 
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
-        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+        ..add(name: 'my_pkg', rootPath: '$packagesRootPath/my_pkg'),
     );
 
     newPubspecYamlFile('/home/test', r'''
@@ -291,7 +331,7 @@
   }
 
   Future<void> test_lib_extension() async {
-    newFile('/.pub-cache/my_pkg/lib/a.dart', content: '''
+    newFile('$packagesRootPath/my_pkg/lib/a.dart', content: '''
 extension E on int {
   static String m() => '';
 }
@@ -299,7 +339,7 @@
 
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
-        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+        ..add(name: 'my_pkg', rootPath: '$packagesRootPath/my_pkg'),
     );
 
     newPubspecYamlFile('/home/test', r'''
@@ -323,11 +363,13 @@
   }
 
   Future<void> test_lib_src() async {
-    newFile('/.pub-cache/my_pkg/lib/src/a.dart', content: 'class Test {}');
+    newFile('$packagesRootPath/my_pkg/lib/src/a.dart', content: '''
+class Test {}
+''');
 
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
-        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+        ..add(name: 'my_pkg', rootPath: '$packagesRootPath/my_pkg'),
     );
 
     newPubspecYamlFile('/home/test', r'''
@@ -344,7 +386,9 @@
   }
 
   Future<void> test_notInLib() async {
-    addSource('/home/other/test/lib.dart', 'class Test {}');
+    addSource('/home/other/test/lib.dart', '''
+class Test {}
+''');
     await resolveTestCode('''
 main() {
   Test t;
@@ -355,7 +399,7 @@
   }
 
   Future<void> test_relativeDirective() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class Foo {}
 ''');
     await resolveTestCode('''
@@ -377,7 +421,7 @@
   }
 
   Future<void> test_relativeDirective_downOneDirectory() async {
-    addSource('/home/test/lib/dir/a.dart', '''
+    addSource('$testPackageLibPath/dir/a.dart', '''
 class Foo {}
 ''');
     await resolveTestCode('''
@@ -394,7 +438,7 @@
 
   Future<void> test_relativeDirective_preferRelativeImports() async {
     createAnalysisOptionsFile(lints: [LintNames.prefer_relative_imports]);
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class Foo {}
 ''');
     await resolveTestCode('''
@@ -416,10 +460,10 @@
   }
 
   Future<void> test_relativeDirective_upOneDirectory() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class Foo {}
 ''');
-    testFile = convertPath('/home/test/lib/dir/test.dart');
+    testFile = convertPath('$testPackageLibPath/dir/test.dart');
     await resolveTestCode('''
 main() { new Foo(); }
 ''');
@@ -433,7 +477,7 @@
   }
 
   Future<void> test_withClass_annotation() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 class Test {
   const Test(int p);
@@ -454,7 +498,7 @@
   }
 
   Future<void> test_withClass_catchClause() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {}
 ''');
     await resolveTestCode('''
@@ -480,11 +524,11 @@
   }
 
   Future<void> test_withClass_hasOtherLibraryWithPrefix() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 library a;
 class One {}
 ''');
-    addSource('/home/test/lib/b.dart', '''
+    addSource('$testPackageLibPath/b.dart', '''
 library b;
 class One {}
 class Two {}
@@ -573,7 +617,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_const() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   const Test();
 }
@@ -593,7 +637,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_const_namedConstructor() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   const Test.named();
 }
@@ -613,7 +657,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_implicit() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   const Test();
 }
@@ -633,7 +677,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_new() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   const Test();
 }
@@ -653,7 +697,7 @@
   }
 
   Future<void> test_withClass_instanceCreation_new_namedConstructor() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class Test {
   Test.named();
 }
@@ -672,8 +716,226 @@
 ''');
   }
 
+  Future<void> test_withClass_pub_other_inLib_dependencies() async {
+    var aaaRoot = getFolder('$packagesRootPath/aaa');
+    newFile('${aaaRoot.path}/lib/a.dart', content: '''
+class Test {}
+''');
+
+    updateTestPubspecFile(r'''
+name: test
+dependencies:
+  aaa: any
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: aaaRoot.path),
+    );
+
+    await resolveTestCode('''
+void f(Test t) {}
+''');
+
+    await assertHasFix('''
+import 'package:aaa/a.dart';
+
+void f(Test t) {}
+''');
+  }
+
+  Future<void> test_withClass_pub_other_inLib_devDependencies() async {
+    var aaaRoot = getFolder('$packagesRootPath/aaa');
+    newFile('${aaaRoot.path}/lib/a.dart', content: '''
+class Test {}
+''');
+
+    updateTestPubspecFile(r'''
+name: test
+dev_dependencies:
+  aaa: any
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: aaaRoot.path),
+    );
+
+    await resolveTestCode('''
+void f(Test t) {}
+''');
+
+    await assertNoFix();
+  }
+
+  Future<void> test_withClass_pub_other_inLib_notListed() async {
+    var aaaRoot = getFolder('$packagesRootPath/aaa');
+    newFile('${aaaRoot.path}/lib/a.dart', content: '''
+class Test {}
+''');
+
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: aaaRoot.path),
+    );
+
+    await resolveTestCode('''
+void f(Test t) {}
+''');
+
+    // If `aaa` is not in `dependencies`, we will not suggest it.
+    await assertNoFix();
+  }
+
+  Future<void> test_withClass_pub_other_inTest_dependencies() async {
+    var aaaRoot = getFolder('$packagesRootPath/aaa');
+    newFile('${aaaRoot.path}/lib/a.dart', content: '''
+class Test {}
+''');
+
+    updateTestPubspecFile(r'''
+name: test
+dependencies:
+  aaa: any
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: aaaRoot.path),
+    );
+
+    var b = newFile('$testPackageTestPath/b.dart', content: r'''
+void f(Test t) {}
+''');
+
+    await resolveFile2(b.path);
+
+    await assertHasFix('''
+import 'package:aaa/a.dart';
+
+void f(Test t) {}
+''', target: b.path);
+  }
+
+  Future<void> test_withClass_pub_other_inTest_devDependencies() async {
+    var aaaRoot = getFolder('$packagesRootPath/aaa');
+    newFile('${aaaRoot.path}/lib/a.dart', content: '''
+class Test {}
+''');
+
+    updateTestPubspecFile(r'''
+name: test
+dev_dependencies:
+  aaa: any
+''');
+
+    writeTestPackageConfig(
+      config: PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: aaaRoot.path),
+    );
+
+    var b = newFile('$testPackageTestPath/b.dart', content: r'''
+void f(Test t) {}
+''');
+
+    await resolveFile2(b.path);
+
+    await assertHasFix('''
+import 'package:aaa/a.dart';
+
+void f(Test t) {}
+''', target: b.path);
+  }
+
+  Future<void> test_withClass_pub_this() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageLibPath/a.dart', content: r'''
+class Test {}
+''');
+
+    await resolveTestCode('''
+void f(Test t) {}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f(Test t) {}
+''');
+  }
+
+  Future<void> test_withClass_pub_this_inLib_excludesTest() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageTestPath/a.dart', content: r'''
+class Test {}
+''');
+
+    await resolveTestCode('''
+void f(Test t) {}
+''');
+    await assertNoFix();
+  }
+
+  Future<void> test_withClass_pub_this_inTest_includesTest() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageTestPath/a.dart', content: r'''
+class Test {}
+''');
+
+    var b = newFile('$testPackageTestPath/b.dart', content: r'''
+void f(Test t) {}
+''');
+
+    await resolveFile2(b.path);
+
+    await assertHasFix('''
+import 'a.dart';
+
+void f(Test t) {}
+''', target: b.path);
+  }
+
+  Future<void> test_withExtension_pub_this() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageLibPath/a.dart', content: r'''
+extension IntExtension on int {
+  int get foo => 0;
+}
+''');
+
+    await resolveTestCode('''
+void f() {
+  IntExtension(0).foo;
+}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  IntExtension(0).foo;
+}
+''');
+  }
+
   Future<void> test_withFunction() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 myFunction() {}
 ''');
@@ -692,7 +954,9 @@
   }
 
   Future<void> test_withFunction_functionTopLevelVariable() async {
-    addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
+    addSource('$testPackageLibPath/lib.dart', '''
+var myFunction = () {};
+''');
     await resolveTestCode('''
 main() {
   myFunction();
@@ -708,7 +972,9 @@
   }
 
   Future<void> test_withFunction_functionTopLevelVariableIdentifier() async {
-    addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
+    addSource('$testPackageLibPath/lib.dart', '''
+var myFunction = () {};
+''');
     await resolveTestCode('''
 main() {
   myFunction;
@@ -724,7 +990,7 @@
   }
 
   Future<void> test_withFunction_identifier() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 myFunction() {}
 ''');
@@ -744,7 +1010,9 @@
 
   @failingTest
   Future<void> test_withFunction_nonFunctionType() async {
-    addSource('/home/test/lib/lib.dart', 'int zero = 0;');
+    addSource('$testPackageLibPath/lib.dart', '''
+int zero = 0;
+''');
     await resolveTestCode('''
 main() {
   zero();
@@ -754,7 +1022,7 @@
   }
 
   Future<void> test_withFunction_unresolvedMethod() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 myFunction() {}
 ''');
@@ -777,7 +1045,7 @@
   }
 
   Future<void> test_withFunctionTypeAlias() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 library lib;
 typedef MyFunction();
 ''');
@@ -797,8 +1065,69 @@
 ''');
   }
 
+  Future<void> test_withGetter_read() async {
+    addSource('$testPackageLibPath/a.dart', '''
+int get foo => 0;
+''');
+
+    await resolveTestCode('''
+void f() {
+  foo;
+}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  foo;
+}
+''');
+  }
+
+  Future<void> test_withGetter_readWrite() async {
+    addSource('$testPackageLibPath/a.dart', '''
+int get foo => 0;
+''');
+
+    await resolveTestCode('''
+void f() {
+  foo++;
+}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  foo++;
+}
+''');
+  }
+
+  /// Not really useful, but shows what we have.
+  Future<void> test_withGetter_write() async {
+    addSource('$testPackageLibPath/a.dart', '''
+int get foo => 0;
+''');
+
+    await resolveTestCode('''
+void f() {
+  foo = 0;
+}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  foo = 0;
+}
+''');
+  }
+
   Future<void> test_withMixin() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 mixin Test {}
 ''');
     await resolveTestCode('''
@@ -811,21 +1140,80 @@
 ''');
   }
 
-  Future<void> test_withTopLevelVariable() async {
-    addSource('/home/test/lib/lib.dart', '''
-library lib;
-int MY_VAR = 42;
+  Future<void> test_withSetter_assignment() async {
+    addSource('$testPackageLibPath/a.dart', '''
+set foo(int _) {}
 ''');
+
     await resolveTestCode('''
-main() {
-  print(MY_VAR);
+void f() {
+  foo = 0;
 }
 ''');
-    await assertHasFix('''
-import 'package:test/lib.dart';
 
-main() {
-  print(MY_VAR);
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  foo = 0;
+}
+''');
+  }
+
+  Future<void> test_withTopLevelVariable_annotation() async {
+    addSource('$testPackageLibPath/a.dart', '''
+const foo = 0;
+''');
+
+    await resolveTestCode('''
+@foo
+void f() {}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+@foo
+void f() {}
+''');
+  }
+
+  Future<void> test_withTopLevelVariable_read() async {
+    addSource('$testPackageLibPath/a.dart', '''
+var foo = 0;
+''');
+
+    await resolveTestCode('''
+void f() {
+  foo;
+}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  foo;
+}
+''');
+  }
+
+  Future<void> test_withTopLevelVariable_write() async {
+    addSource('$testPackageLibPath/a.dart', '''
+var foo = 0;
+''');
+
+    await resolveTestCode('''
+void f() {
+  foo = 0;
+}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+void f() {
+  foo = 0;
 }
 ''');
   }
@@ -837,12 +1225,16 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2;
 
   Future<void> test_lib() async {
-    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'b.dart';");
-    newFile('/.pub-cache/my_pkg/lib/b.dart', content: 'class Test {}');
+    newFile('$packagesRootPath/my_pkg/lib/a.dart', content: '''
+export 'b.dart';
+''');
+    newFile('$packagesRootPath/my_pkg/lib/b.dart', content: '''
+class Test {}
+''');
 
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
-        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+        ..add(name: 'my_pkg', rootPath: '$packagesRootPath/my_pkg'),
     );
 
     newPubspecYamlFile('/home/test', r'''
@@ -866,12 +1258,16 @@
   }
 
   Future<void> test_lib_src() async {
-    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'src/b.dart';");
-    newFile('/.pub-cache/my_pkg/lib/src/b.dart', content: 'class Test {}');
+    newFile('$packagesRootPath/my_pkg/lib/a.dart', content: '''
+export 'src/b.dart';
+''');
+    newFile('$packagesRootPath/my_pkg/lib/src/b.dart', content: '''
+class Test {}
+''');
 
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
-        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+        ..add(name: 'my_pkg', rootPath: '$packagesRootPath/my_pkg'),
     );
 
     newPubspecYamlFile('/home/test', r'''
@@ -895,8 +1291,10 @@
   }
 
   Future<void> test_lib_src_extension() async {
-    newFile('/.pub-cache/my_pkg/lib/a.dart', content: "export 'src/b.dart';");
-    newFile('/.pub-cache/my_pkg/lib/src/b.dart', content: '''
+    newFile('$packagesRootPath/my_pkg/lib/a.dart', content: '''
+export 'src/b.dart';
+''');
+    newFile('$packagesRootPath/my_pkg/lib/src/b.dart', content: '''
 extension E on int {
   static String m() => '';
 }
@@ -904,7 +1302,7 @@
 
     writeTestPackageConfig(
       config: PackageConfigFileBuilder()
-        ..add(name: 'my_pkg', rootPath: '/.pub-cache/my_pkg'),
+        ..add(name: 'my_pkg', rootPath: '$packagesRootPath/my_pkg'),
     );
 
     newPubspecYamlFile('/home/test', r'''
@@ -931,49 +1329,8 @@
   @override
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3;
 
-  Future<void> test_inLibSrc_differentContextRoot() async {
-    newFile('/.pub-cache/bbb/lib/b1.dart', content: r'''
-import 'src/b2.dart';
-class A {}
-''');
-
-    writeTestPackageConfig(
-      config: PackageConfigFileBuilder()
-        ..add(name: 'bbb', rootPath: '/.pub-cache/bbb'),
-    );
-
-    newFile('/.pub-cache/bbb/lib/src/b2.dart', content: 'class Test {}');
-    await resolveTestCode('''
-import 'package:bbb/b1.dart';
-main() {
-  Test t;
-  A? a;
-  print('\$t \$a');
-}
-''');
-    await assertNoFix();
-  }
-
-  Future<void> test_inLibSrc_thisContextRoot() async {
-    addSource('/home/test/lib/src/lib.dart', 'class Test {}');
-    await resolveTestCode('''
-main() {
-  Test t;
-  print(t);
-}
-''');
-    await assertHasFix('''
-import 'package:test/src/lib.dart';
-
-main() {
-  Test t;
-  print(t);
-}
-''');
-  }
-
   Future<void> test_inLibSrc_thisContextRoot_extension() async {
-    addSource('/home/test/lib/src/lib.dart', '''
+    addSource('$testPackageLibPath/src/lib.dart', '''
 extension E on int {
   static String m() => '';
 }
@@ -991,4 +1348,46 @@
 }
 ''');
   }
+
+  Future<void> test_withClass_pub_this_inLib_includesThisSrc() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageLibPath/src/a.dart', content: r'''
+class Test {}
+''');
+
+    await resolveTestCode('''
+void f(Test t) {}
+''');
+
+    await assertHasFix('''
+import 'package:test/src/a.dart';
+
+void f(Test t) {}
+''');
+  }
+
+  Future<void> test_withClass_pub_this_inTest_includesThisSrc() async {
+    updateTestPubspecFile(r'''
+name: test
+''');
+
+    newFile('$testPackageLibPath/src/a.dart', content: r'''
+class Test {}
+''');
+
+    var b = newFile('$testPackageTestPath/b.dart', content: r'''
+void f(Test t) {}
+''');
+
+    await resolveFile2(b.path);
+
+    await assertHasFix('''
+import 'package:test/src/a.dart';
+
+void f(Test t) {}
+''', target: b.path);
+  }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart
index 05ba8ce..7c57f67 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart
@@ -20,7 +20,7 @@
   FixKind get kind => DartFixKind.IMPORT_LIBRARY_SHOW;
 
   Future<void> test_extension_notShown_getter() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on String {
   int get m => 0;
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_extension_notShown_method() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on String {
   void m() {}
@@ -66,7 +66,7 @@
   }
 
   Future<void> test_extension_notShown_operator() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on String {
   String operator -(String other) => this;
@@ -89,7 +89,7 @@
   }
 
   Future<void> test_extension_notShown_setter() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class C {}
 extension E on String {
   set m(int v) {}
@@ -112,7 +112,7 @@
   }
 
   Future<void> test_override_samePackage() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class A {}
 extension E on int {
   String m() => '';
@@ -133,7 +133,7 @@
   }
 
   Future<void> test_package() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class A {}
 class B {}
 ''');
@@ -175,7 +175,7 @@
   }
 
   Future<void> test_static_samePackage() async {
-    addSource('/home/test/lib/lib.dart', '''
+    addSource('$testPackageLibPath/lib.dart', '''
 class A {}
 extension E on int {
   static String m() => '';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart b/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
index 4a54aa0..8d5d664 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart
@@ -42,12 +42,12 @@
   }
 
   Future<void> test_organizePathImports() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
 ''');
-    newFile('/home/test/lib/a/b.dart', content: '''
+    newFile('$testPackageLibPath/a/b.dart', content: '''
 class B {
   static void m() {}
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart b/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
index 5c92c08..6d3cf03 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/qualify_reference_test.dart
@@ -43,7 +43,7 @@
   }
 
   Future<void> test_class_imported() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
@@ -60,7 +60,7 @@
   }
 
   Future<void> test_class_importedWithPrefix() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
@@ -104,12 +104,12 @@
   }
 
   Future<void> test_class_notImported() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
 ''');
-    newFile('/home/test/lib/b.dart', content: '''
+    newFile('$testPackageLibPath/b.dart', content: '''
 import 'a.dart';
 class B extends A {}
 ''');
@@ -148,7 +148,7 @@
   }
 
   Future<void> test_extension_imported() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
@@ -165,7 +165,7 @@
   }
 
   Future<void> test_extension_importedWithPrefix() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
@@ -209,12 +209,12 @@
   }
 
   Future<void> test_extension_notImported() async {
-    newFile('/home/test/lib/a.dart', content: '''
+    newFile('$testPackageLibPath/a.dart', content: '''
 class A {
   static void m() {}
 }
 ''');
-    newFile('/home/test/lib/b.dart', content: '''
+    newFile('$testPackageLibPath/b.dart', content: '''
 import 'a.dart';
 class B extends A {}
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
index 736da8c..9d27944 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_argument_test.dart
@@ -21,7 +21,7 @@
   @override
   String get lintCode => LintNames.avoid_redundant_argument_values;
 
-  Future<void> test_singleFile() async {
+  Future<void> test_independentInvocations() async {
     await resolveTestCode('''
 void f({bool valWithDefault = true, bool val}) {}
 void f2({bool valWithDefault = true, bool val}) {}
@@ -41,6 +41,45 @@
 }
 ''');
   }
+
+  Future<void> test_multipleInSingleInvocation_actual() async {
+    await resolveTestCode('''
+void f() {
+  g(a: 0, b: 1, c: 2);
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+    await assertHasFix('''
+void f() {
+  g(b: 1);
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+  }
+
+  @failingTest
+  Future<void> test_multipleInSingleInvocation_ideal() async {
+    // The edits currently conflict with each other because they're overlapping,
+    // so one of them isn't applied. This only impacts the fix-all-in-file case
+    // because the bulk-fix case catches the remaining argument on the second
+    // pass.
+    await resolveTestCode('''
+void f() {
+  g(a: 0, b: 1, c: 2);
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+    await assertHasFix('''
+void f() {
+  g();
+}
+
+void g({int a = 0, int b = 1, int c = 2}) {}
+''');
+  }
 }
 
 @reflectiveTest
@@ -51,7 +90,7 @@
   @override
   String get lintCode => LintNames.avoid_redundant_argument_values;
 
-  Future<void> test_named_param() async {
+  Future<void> test_named() async {
     await resolveTestCode('''
 void f({bool valWithDefault = true, bool? val}) {}
 
@@ -68,7 +107,27 @@
 ''');
   }
 
-  Future<void> test_named_param_2() async {
+  @FailingTest(
+    issue: 'https://github.com/dart-lang/linter/issues/3082',
+  )
+  Future<void> test_named_betweenRequiredPositional() async {
+    await resolveTestCode('''
+void foo(int a, int b, {bool c = true}) {}
+
+void f() {
+  foo(0, c: true, 1);
+}
+''');
+    await assertHasFix('''
+void foo(int a, int b, {bool c = true}) {}
+
+void f() {
+  foo(0, 1);
+}
+''');
+  }
+
+  Future<void> test_named_hasOtherNamed() async {
     await resolveTestCode('''
 void f({bool valWithDefault = true, bool? val}) {}
 
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
index 33821d3..4dec631 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
@@ -126,7 +126,7 @@
   @FailingTest(issue: 'https://github.com/dart-lang/linter/issues/1997')
   Future<void> test_method_nullSafety_optIn_fromOptOut() async {
     createAnalysisOptionsFile(lints: [lintCode]);
-    newFile('/home/test/lib/a.dart', content: r'''
+    newFile('$testPackageLibPath/a.dart', content: r'''
 class A {
   int foo() => 0;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart
index 6fbc9d8..0dd8430 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart
@@ -5,40 +5,97 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'fix_processor.dart';
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(RemoveUnusedImportTest);
+    defineReflectiveTests(RemoveUnusedImportBulkTest);
     defineReflectiveTests(RemoveUnusedImportMultiTest);
+    defineReflectiveTests(RemoveUnusedImportTest);
   });
 }
 
 @reflectiveTest
+class RemoveUnusedImportBulkTest extends BulkFixProcessorTest {
+  @FailingTest(reason: 'multiple deletions conflict')
+  Future<void> test_multipleOnSingleLine() async {
+    // TODO(brianwilkerson) Remove test_multipleOnSingleLine_temporary when this
+    //  test starts to pass.
+    await resolveTestCode('''
+import 'dart:collection'; import 'dart:math'; import 'dart:async';
+void f() {}
+''');
+    await assertHasFix('''
+
+void f() {}
+''');
+  }
+
+  Future<void> test_multipleOnSingleLine_temporary() async {
+    await resolveTestCode('''
+import 'dart:collection'; import 'dart:math'; import 'dart:async';
+void f() {}
+''');
+    await assertHasFix('''
+import 'dart:math';
+void f() {}
+''');
+  }
+
+  Future<void> test_multipleUnused() async {
+    await resolveTestCode('''
+import 'dart:collection';
+import 'dart:math';
+import 'dart:async';
+void f() {}
+''');
+    await assertHasFix('''
+void f() {}
+''');
+    var details = processor.fixDetails;
+    expect(details, hasLength(1));
+    var fixes = details[0].fixes;
+    expect(fixes, hasLength(1));
+    expect(fixes[0].occurrences, 3);
+  }
+
+  Future<void> test_usedAndUnused() async {
+    await resolveTestCode('''
+import 'dart:async';
+import 'dart:math' as math;
+import 'dart:async';
+
+var tau = math.pi * 2;
+
+void f() {}
+''');
+    await assertHasFix('''
+import 'dart:math' as math;
+
+var tau = math.pi * 2;
+
+void f() {}
+''');
+  }
+}
+
+@reflectiveTest
 class RemoveUnusedImportMultiTest extends FixProcessorTest {
   @override
   FixKind get kind => DartFixKind.REMOVE_UNUSED_IMPORT_MULTI;
 
-  @override
-  void setUp() {
-    super.setUp();
-    // TODO(dantup): Get these tests passing with either line ending.
-    useLineEndingsForPlatform = false;
-  }
-
   Future<void> test_all_diverseImports() async {
     await resolveTestCode('''
 import 'dart:math';
 import 'dart:math';
 import 'dart:async';
-main() {
-}
+void f() {}
 ''');
     await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
-main() {
-}
+void f() {}
 ''');
   }
 
@@ -50,29 +107,39 @@
 
 var tau = math.pi * 2;
 
-main() {
-}
+void f() {}
 ''');
     await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
 import 'dart:math' as math;
 
 var tau = math.pi * 2;
 
-main() {
-}
+void f() {}
 ''');
   }
 
-  @FailingTest(reason: 'one unused import remains unremoved')
+  @FailingTest(reason: 'multiple deletions conflict')
   Future<void> test_all_singleLine() async {
+    // TODO(brianwilkerson) Remove test_multipleOnSingleLine_temporary when this
+    //  test starts to pass.
     await resolveTestCode('''
 import 'dart:math'; import 'dart:math'; import 'dart:math';
-main() {
-}
+void f() {}
 ''');
     await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
-main() {
-}
+
+void f() {}
+''');
+  }
+
+  Future<void> test_all_singleLine_temporary() async {
+    await resolveTestCode('''
+import 'dart:math'; import 'dart:math'; import 'dart:math';
+void f() {}
+''');
+    await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
+import 'dart:math';
+void f() {}
 ''');
   }
 
@@ -81,12 +148,10 @@
 import 'dart:math';
 import 'dart:math';
 import 'dart:math';
-main() {
-}
+void f() {}
 ''');
     await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
-main() {
-}
+void f() {}
 ''');
   }
 }
@@ -96,13 +161,6 @@
   @override
   FixKind get kind => DartFixKind.REMOVE_UNUSED_IMPORT;
 
-  @override
-  void setUp() {
-    super.setUp();
-    // TODO(dantup): Get these tests passing with either line ending.
-    useLineEndingsForPlatform = false;
-  }
-
   Future<void> test_anotherImportOnLine() async {
     await resolveTestCode('''
 import 'dart:math'; import 'dart:async';
@@ -125,14 +183,14 @@
 import 'dart:math';
 import 'dart:math';
 
-main() {
+void f() {
   print(min(0, 1));
 }
 ''');
     await assertHasFix('''
 import 'dart:math';
 
-main() {
+void f() {
   print(min(0, 1));
 }
 ''');
@@ -142,11 +200,11 @@
     await resolveTestCode('''
 import
   'dart:math';
-main() {
+void f() {
 }
 ''');
     await assertHasFix('''
-main() {
+void f() {
 }
 ''');
   }
@@ -154,11 +212,11 @@
   Future<void> test_single() async {
     await resolveTestCode('''
 import 'dart:math';
-main() {
+void f() {
 }
 ''');
     await assertHasFix('''
-main() {
+void f() {
 }
 ''');
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
index 9cfafa7..818dad5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
@@ -20,38 +20,14 @@
   @override
   FixKind get kind => DartFixKind.REPLACE_RETURN_TYPE_FUTURE;
 
-  Future<void> test_adjacentNodes_withImport() async {
-    await resolveTestCode('''
-import 'dart:async';
-var v;int main() async => 0;
-''');
-    await assertHasFix('''
-import 'dart:async';
-var v;Future<int> main() async => 0;
-''', errorFilter: (error) {
-      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
-    });
-  }
-
-  Future<void> test_adjacentNodes_withoutImport() async {
-    await resolveTestCode('''
-var v;int main() async => 0;
-''');
-    await assertHasFix('''
-var v;Future<int> main() async => 0;
-''');
-  }
-
   Future<void> test_complexTypeName_withImport() async {
     await resolveTestCode('''
 import 'dart:async';
-List<int> main() async {
-}
+List<int> f() async {}
 ''');
     await assertHasFix('''
 import 'dart:async';
-Future<List<int>> main() async {
-}
+Future<List<int>> f() async {}
 ''', errorFilter: (error) {
       return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
@@ -59,25 +35,21 @@
 
   Future<void> test_complexTypeName_withoutImport() async {
     await resolveTestCode('''
-List<int> main() async {
-}
+List<int> f() async {}
 ''');
     await assertHasFix('''
-Future<List<int>> main() async {
-}
+Future<List<int>> f() async {}
 ''');
   }
 
   Future<void> test_importedWithPrefix() async {
     await resolveTestCode('''
 import 'dart:async' as al;
-int main() async {
-}
+int f() async {}
 ''');
     await assertHasFix('''
 import 'dart:async' as al;
-al.Future<int> main() async {
-}
+al.Future<int> f() async {}
 ''', errorFilter: (error) {
       return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
@@ -86,11 +58,11 @@
   Future<void> test_simpleTypeName_withImport() async {
     await resolveTestCode('''
 import 'dart:async';
-int main() async => 0;
+int f() async {}
 ''');
     await assertHasFix('''
 import 'dart:async';
-Future<int> main() async => 0;
+Future<int> f() async {}
 ''', errorFilter: (error) {
       return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
     });
@@ -98,40 +70,10 @@
 
   Future<void> test_simpleTypeName_withoutImport() async {
     await resolveTestCode('''
-int main() async => 0;
+int f() async {}
 ''');
     await assertHasFix('''
-Future<int> main() async => 0;
-''');
-  }
-
-  Future<void> test_withLibraryDirective_withImport() async {
-    await resolveTestCode('''
-library main;
-import 'dart:async';
-int main() async {
-}
-''');
-    await assertHasFix('''
-library main;
-import 'dart:async';
-Future<int> main() async {
-}
-''', errorFilter: (error) {
-      return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
-    });
-  }
-
-  Future<void> test_withLibraryDirective_withoutImport() async {
-    await resolveTestCode('''
-library main;
-int main() async {
-}
-''');
-    await assertHasFix('''
-library main;
-Future<int> main() async {
-}
+Future<int> f() async {}
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_iterable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_iterable_test.dart
new file mode 100644
index 0000000..e83a01c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_iterable_test.dart
@@ -0,0 +1,50 @@
+// 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceReturnTypeIterableTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceReturnTypeIterableTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_RETURN_TYPE_ITERABLE;
+
+  Future<void> test_complexTypeName() async {
+    await resolveTestCode('''
+List<int> f() sync* {}
+''');
+    await assertHasFix('''
+Iterable<List<int>> f() sync* {}
+''');
+  }
+
+  Future<void> test_importedWithPrefix() async {
+    await resolveTestCode('''
+import 'dart:core' as c;
+c.int f() sync* {}
+''');
+    await assertHasFix('''
+import 'dart:core' as c;
+c.Iterable<c.int> f() sync* {}
+''');
+  }
+
+  Future<void> test_simpleTypeName() async {
+    await resolveTestCode('''
+int f() sync* {}
+''');
+    await assertHasFix('''
+Iterable<int> f() sync* {}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_stream_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_stream_test.dart
new file mode 100644
index 0000000..e564385
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_stream_test.dart
@@ -0,0 +1,82 @@
+// 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceReturnTypeStreamTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceReturnTypeStreamTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_RETURN_TYPE_STREAM;
+
+  Future<void> test_complexTypeName_withImport() async {
+    await resolveTestCode('''
+import 'dart:async';
+List<int> f() async* {}
+''');
+    await assertHasFix('''
+import 'dart:async';
+Stream<List<int>> f() async* {}
+''', errorFilter: (error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE;
+    });
+  }
+
+  Future<void> test_complexTypeName_withoutImport() async {
+    await resolveTestCode('''
+List<int> f() async* {}
+''');
+    await assertHasFix('''
+Stream<List<int>> f() async* {}
+''');
+  }
+
+  Future<void> test_importedWithPrefix() async {
+    await resolveTestCode('''
+import 'dart:async' as al;
+int f() async* {}
+''');
+    await assertHasFix('''
+import 'dart:async' as al;
+al.Stream<int> f() async* {}
+''', errorFilter: (error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE;
+    });
+  }
+
+  Future<void> test_simpleTypeName_withImport() async {
+    await resolveTestCode('''
+import 'dart:async';
+int f() async* {}
+''');
+    await assertHasFix('''
+import 'dart:async';
+Stream<int> f() async* {}
+''', errorFilter: (error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE;
+    });
+  }
+
+  Future<void> test_simpleTypeName_withoutImport() async {
+    await resolveTestCode('''
+int f() async* {}
+''');
+    await assertHasFix('''
+Stream<int> f() async* {}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_test.dart
index da085a6..ac72607 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_test.dart
@@ -172,7 +172,7 @@
   }
 
   Future<void> test_privateType() async {
-    addSource('/home/test/lib/a.dart', '''
+    addSource('$testPackageLibPath/a.dart', '''
 class A {
   _B b => _B();
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
index 0bf4a84..eaf03e1 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_extension_name_test.dart
@@ -62,7 +62,7 @@
   }
 
   Future<void> test_qualified() async {
-    newFile('/home/test/lib/ext.dart', content: '''
+    newFile('$testPackageLibPath/ext.dart', content: '''
 extension E on String {
   static int m() => 0;
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
index 49f9041..e3245f3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
@@ -82,7 +82,6 @@
 ''');
   }
 
-  // @soloTest
   Future<void> test_constructorTearOff_nameUnnamed() async {
     await resolveTestCode('''
 class C {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 3753bfb..3174635 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -30,6 +30,7 @@
 import 'add_null_check_test.dart' as add_null_check;
 import 'add_override_test.dart' as add_override;
 import 'add_required_test.dart' as add_required;
+import 'add_return_null_test.dart' as add_return_null;
 import 'add_return_type_test.dart' as add_return_type;
 import 'add_static_test.dart' as add_static;
 import 'add_super_constructor_invocation_test.dart'
@@ -183,6 +184,8 @@
 import 'replace_new_with_const_test.dart' as replace_new_with_const;
 import 'replace_null_with_closure_test.dart' as replace_null_with_closure;
 import 'replace_return_type_future_test.dart' as replace_return_type_future;
+import 'replace_return_type_iterable_test.dart' as replace_return_type_iterable;
+import 'replace_return_type_stream_test.dart' as replace_return_type_stream;
 import 'replace_return_type_test.dart' as replace_return_type;
 import 'replace_var_with_dynamic_test.dart' as replace_var_with_dynamic;
 import 'replace_with_brackets_test.dart' as replace_with_brackets;
@@ -234,6 +237,7 @@
     add_null_check.main();
     add_override.main();
     add_required.main();
+    add_return_null.main();
     add_return_type.main();
     add_static.main();
     add_super_constructor_invocation.main();
@@ -370,6 +374,8 @@
     replace_null_with_void.main();
     replace_return_type.main();
     replace_return_type_future.main();
+    replace_return_type_iterable.main();
+    replace_return_type_stream.main();
     replace_var_with_dynamic.main();
     replace_with_brackets.main();
     replace_with_conditional_assignment.main();
diff --git a/pkg/analysis_server/test/src/utilities/extensions/range_factory_test.dart b/pkg/analysis_server/test/src/utilities/extensions/range_factory_test.dart
index d4bf8fd..e8d35e3 100644
--- a/pkg/analysis_server/test/src/utilities/extensions/range_factory_test.dart
+++ b/pkg/analysis_server/test/src/utilities/extensions/range_factory_test.dart
@@ -15,6 +15,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(RangeFactory_NodeInListTest);
     defineReflectiveTests(RangeFactory_NodeInListWithCommentsTest);
+    defineReflectiveTests(RangeFactory_NodeWithCommentsTest);
   });
 }
 
@@ -26,11 +27,54 @@
     return invocation.argumentList.arguments;
   }
 
-  void _assertRange(int index, SourceRange expectedRange) {
+  void _assertArgumentRange(int index, SourceRange expectedRange) {
     var list = _argumentList;
     expect(range.nodeInListWithComments(testUnit.lineInfo!, list, list[index]),
         expectedRange);
   }
+
+  void _assertClassMemberRanges(Map<int, SourceRange> expectedRanges) {
+    var class_ = findNode.classDeclaration('class');
+    var list = class_.members;
+    for (var entry in expectedRanges.entries) {
+      expect(range.nodeWithComments(testUnit.lineInfo!, list[entry.key]),
+          entry.value);
+    }
+  }
+
+  void _assertUnitRanges(Map<int, SourceRange> expectedRanges) {
+    var list = testUnit.declarations;
+    for (var entry in expectedRanges.entries) {
+      expect(range.nodeWithComments(testUnit.lineInfo!, list[entry.key]),
+          entry.value);
+    }
+  }
+
+  /// Create a [SourceRange] for the positions start/end before the supplied
+  /// search strings.
+  SourceRange _range({
+    String? startsBefore,
+    String? startsAfter,
+    String? endsBefore,
+    String? endsAfter,
+  }) {
+    expect(startsBefore == null, isNot(startsAfter == null),
+        reason: 'Specify exactly one of startsBefore/startsAfter');
+    expect(endsBefore == null, isNot(endsAfter == null),
+        reason: 'Specify exactly one of endsBefore/endsAfter');
+
+    final offset = startsBefore != null
+        ? testCode.indexOf(startsBefore)
+        : testCode.indexOf(startsAfter!) + startsAfter.length;
+    final end = endsBefore != null
+        ? testCode.indexOf(endsBefore)
+        : testCode.indexOf(endsAfter!) + endsAfter.length;
+
+    expect(offset, greaterThanOrEqualTo(0));
+    expect(end, greaterThanOrEqualTo(0));
+
+    return SourceRange(offset, end - offset);
+  }
 }
 
 /// Copied from `analyzer_plugin/test/utilities/range_factory_test.dart` in
@@ -46,7 +90,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(0, SourceRange(15, 6));
+    _assertArgumentRange(0, SourceRange(15, 6));
   }
 
   Future<void> test_argumentList_first_positional() async {
@@ -56,7 +100,7 @@
 }
 void g(int a, int b) {}
 ''');
-    _assertRange(0, SourceRange(15, 3));
+    _assertArgumentRange(0, SourceRange(15, 3));
   }
 
   Future<void> test_argumentList_last_named() async {
@@ -66,7 +110,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(1, SourceRange(19, 6));
+    _assertArgumentRange(1, SourceRange(19, 6));
   }
 
   Future<void> test_argumentList_last_positional() async {
@@ -76,7 +120,7 @@
 }
 void g(int a, int b) {}
 ''');
-    _assertRange(1, SourceRange(16, 3));
+    _assertArgumentRange(1, SourceRange(16, 3));
   }
 
   Future<void> test_argumentList_middle_named() async {
@@ -86,7 +130,7 @@
 }
 void g({int? a, int? b, int? c}) {}
 ''');
-    _assertRange(1, SourceRange(19, 6));
+    _assertArgumentRange(1, SourceRange(19, 6));
   }
 
   Future<void> test_argumentList_middle_positional() async {
@@ -96,7 +140,7 @@
 }
 void g(int a, int b, int c) {}
 ''');
-    _assertRange(1, SourceRange(16, 3));
+    _assertArgumentRange(1, SourceRange(16, 3));
   }
 
   Future<void> test_argumentList_only_named() async {
@@ -106,7 +150,7 @@
 }
 void g({int? a}) {}
 ''');
-    _assertRange(0, SourceRange(15, 4));
+    _assertArgumentRange(0, SourceRange(15, 4));
   }
 
   Future<void> test_argumentList_only_named_trailingComma() async {
@@ -116,7 +160,7 @@
 }
 void g({int? a}) {}
 ''');
-    _assertRange(0, SourceRange(15, 5));
+    _assertArgumentRange(0, SourceRange(15, 5));
   }
 
   Future<void> test_argumentList_only_positional() async {
@@ -126,7 +170,7 @@
 }
 void g(int a) {}
 ''');
-    _assertRange(0, SourceRange(15, 1));
+    _assertArgumentRange(0, SourceRange(15, 1));
   }
 
   Future<void> test_argumentList_only_positional_trailingComma() async {
@@ -136,7 +180,7 @@
 }
 void g(int a) {}
 ''');
-    _assertRange(0, SourceRange(15, 2));
+    _assertArgumentRange(0, SourceRange(15, 2));
   }
 }
 
@@ -154,7 +198,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(0, SourceRange(20, 36));
+    _assertArgumentRange(0, SourceRange(20, 36));
   }
 
   Future<void> test_argumentList_first_named_leadingComment() async {
@@ -169,7 +213,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(0, SourceRange(20, 25));
+    _assertArgumentRange(0, SourceRange(20, 25));
   }
 
   Future<void> test_argumentList_first_named_trailingComment() async {
@@ -183,7 +227,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(0, SourceRange(20, 21));
+    _assertArgumentRange(0, SourceRange(20, 21));
   }
 
   Future<void> test_argumentList_last_named_leadingAndTrailingComment() async {
@@ -197,7 +241,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(1, SourceRange(36, 36));
+    _assertArgumentRange(1, SourceRange(36, 36));
   }
 
   Future<void> test_argumentList_last_named_leadingComment() async {
@@ -211,7 +255,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(1, SourceRange(36, 25));
+    _assertArgumentRange(1, SourceRange(36, 25));
   }
 
   Future<void> test_argumentList_last_named_trailingComment() async {
@@ -224,7 +268,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(1, SourceRange(36, 21));
+    _assertArgumentRange(1, SourceRange(36, 21));
   }
 
   Future<void>
@@ -239,7 +283,7 @@
 }
 void g({int? a, int? b}) {}
 ''');
-    _assertRange(1, SourceRange(36, 21));
+    _assertArgumentRange(1, SourceRange(36, 21));
   }
 
   Future<void>
@@ -256,7 +300,7 @@
 }
 void g({int? a, int? b, int? c}) {}
 ''');
-    _assertRange(1, SourceRange(36, 36));
+    _assertArgumentRange(1, SourceRange(36, 36));
   }
 
   Future<void> test_argumentList_middle_named_leadingComment() async {
@@ -272,7 +316,7 @@
 }
 void g({int? a, int? b, int? c}) {}
 ''');
-    _assertRange(1, SourceRange(36, 25));
+    _assertArgumentRange(1, SourceRange(36, 25));
   }
 
   Future<void> test_argumentList_middle_named_trailingComment() async {
@@ -287,7 +331,7 @@
 }
 void g({int? a, int? b, int? c}) {}
 ''');
-    _assertRange(1, SourceRange(36, 21));
+    _assertArgumentRange(1, SourceRange(36, 21));
   }
 
   Future<void>
@@ -302,7 +346,7 @@
 }
 void g({int? a, int? b, int? c}) {}
 ''');
-    _assertRange(1, SourceRange(25, 21));
+    _assertArgumentRange(1, SourceRange(25, 21));
   }
 
   Future<void> test_argumentList_only_named_leadingAndTrailingComment() async {
@@ -315,7 +359,7 @@
 }
 void g({int? a}) {}
 ''');
-    _assertRange(0, SourceRange(20, 31));
+    _assertArgumentRange(0, SourceRange(20, 31));
   }
 
   Future<void> test_argumentList_only_named_leadingComment() async {
@@ -328,7 +372,7 @@
 }
 void g({int? a}) {}
 ''');
-    _assertRange(0, SourceRange(20, 20));
+    _assertArgumentRange(0, SourceRange(20, 20));
   }
 
   Future<void> test_argumentList_only_named_trailingComment() async {
@@ -340,6 +384,501 @@
 }
 void g({int? a}) {}
 ''');
-    _assertRange(0, SourceRange(20, 16));
+    _assertArgumentRange(0, SourceRange(20, 16));
+  }
+}
+
+@reflectiveTest
+class RangeFactory_NodeWithCommentsTest extends BaseRangeFactoryTest {
+  Future<void> test_class_multiple_leading() async {
+    await resolveTestCode('''
+class A {
+  // 1
+  int foo = 1;
+  // 2
+  int bar = 2;
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '= 1;'),
+      1: _range(startsBefore: '// 2', endsAfter: '= 2;'),
+    });
+  }
+
+  Future<void> test_class_multiple_leadingAndTrailing() async {
+    await resolveTestCode('''
+class A {
+  // 2
+  int foo = 1; // 3
+  // 4
+  int bar = 1; // 5
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+      1: _range(startsBefore: '// 4', endsAfter: '// 5'),
+    });
+  }
+
+  Future<void>
+      test_class_multiple_leadingAndTrailing_withClassBraceTrailing() async {
+    await resolveTestCode('''
+class A { // 1
+  // 2
+  int foo = 1; // 3
+  // 4
+  int bar = 1; // 5
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+      1: _range(startsBefore: '// 4', endsAfter: '// 5'),
+    });
+  }
+
+  Future<void> test_class_multiple_trailing() async {
+    await resolveTestCode('''
+class A {
+  int foo = 1; // 1
+  int bar = 2; // 2
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: 'int foo', endsAfter: '// 1'),
+      1: _range(startsBefore: 'int bar', endsAfter: '// 2'),
+    });
+  }
+
+  Future<void> test_class_single_field_leading() async {
+    await resolveTestCode('''
+class A {
+  // 1
+  int foo = 1;
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '= 1;'),
+    });
+  }
+
+  Future<void> test_class_single_field_leadingAndTrailing() async {
+    await resolveTestCode('''
+class A {
+  // 1
+  int foo = 1; // 2
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '; // 2'),
+    });
+  }
+
+  Future<void>
+      test_class_single_field_leadingAndTrailing_withClassBraceTrailing() async {
+    await resolveTestCode('''
+class A { // 1
+  // 2
+  int foo = 1; // 3
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+    });
+  }
+
+  Future<void> test_class_single_field_trailing() async {
+    await resolveTestCode('''
+class A {
+  int foo = 1; // 1
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: 'int foo', endsAfter: '// 1'),
+    });
+  }
+
+  Future<void> test_class_single_method_leading() async {
+    await resolveTestCode('''
+class A {
+  // 1
+  foo() {}
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '{}'),
+    });
+  }
+
+  Future<void> test_class_single_method_leadingAndTrailing() async {
+    await resolveTestCode('''
+class A {
+  // foo
+  foo() {} // foo
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// foo', endsAfter: '} // foo'),
+    });
+  }
+
+  Future<void>
+      test_class_single_method_leadingAndTrailing_withClassBraceTrailing() async {
+    await resolveTestCode('''
+class A { // 1
+  // 2
+  foo() {} // 3
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+    });
+  }
+
+  Future<void> test_class_single_method_trailing() async {
+    await resolveTestCode('''
+class A {
+  foo() {} // 1
+}
+''');
+    _assertClassMemberRanges({
+      0: _range(startsBefore: 'foo()', endsAfter: '// 1'),
+    });
+  }
+
+  Future<void> test_topLevel_fileHeader_dartDoc() async {
+    await resolveTestCode('''
+// Copyright (c) ...
+// ...
+
+/// 1
+int foo = 1; // 2
+
+/// 3
+int bar = 1; // 4
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '/// 1', endsAfter: '// 2'),
+      1: _range(startsBefore: '/// 3', endsAfter: '// 4'),
+    });
+  }
+
+  Future<void> test_topLevel_fileHeader_noDartDoc() async {
+    await resolveTestCode('''
+// Copyright (c) ...
+// ...
+
+int foo = 1; // 2
+
+int bar = 1; // 4
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: 'int foo', endsAfter: '// 2'),
+      1: _range(startsBefore: 'int bar', endsAfter: '// 4'),
+    });
+  }
+
+  Future<void> test_topLevel_languageVersion_dartDoc() async {
+    await resolveTestCode('''
+// @dart = 2.8
+
+/// 1
+int foo = 1; // 2
+
+/// 3
+int bar = 1; // 4
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '/// 1', endsAfter: '// 2'),
+      1: _range(startsBefore: '/// 3', endsAfter: '// 4'),
+    });
+  }
+
+  Future<void> test_topLevel_languageVersion_noDartDoc() async {
+    await resolveTestCode('''
+// @dart = 2.8
+
+int foo = 1; // 2
+
+int bar = 1; // 4
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: 'int foo', endsAfter: '// 2'),
+      1: _range(startsBefore: 'int bar', endsAfter: '// 4'),
+    });
+  }
+
+  Future<void> test_topLevel_multiple_leading() async {
+    await resolveTestCode('''
+import '';
+
+// 1
+int foo = 1;
+
+// 2
+int bar = 2;
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '= 1;'),
+      1: _range(startsBefore: '// 2', endsAfter: '= 2;'),
+    });
+  }
+
+  Future<void> test_topLevel_multiple_leadingAndTrailing() async {
+    await resolveTestCode('''
+import '';
+
+// 2
+int foo = 1; // 3
+
+// 4
+int bar = 1; // 5
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+      1: _range(startsBefore: '// 4', endsAfter: '// 5'),
+    });
+  }
+
+  Future<void> test_topLevel_multiple_mixedComents() async {
+    await resolveTestCode('''
+import '';
+
+// 1
+// 2
+int foo = 1; // 3
+
+// 4
+// 5
+int bar = 1; // 6
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '// 3'),
+      1: _range(startsBefore: '// 4', endsAfter: '// 6'),
+    });
+  }
+
+  Future<void> test_topLevel_multiple_trailing() async {
+    await resolveTestCode('''
+int foo = 1; // 1
+int bar = 2; // 2
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: 'int foo', endsAfter: '// 1'),
+      1: _range(startsBefore: 'int bar', endsAfter: '// 2'),
+    });
+  }
+
+  Future<void> test_topLevel_noTrailingNewline_leading() async {
+    await resolveTestCode('''
+import '';
+
+// 1
+int foo = 1;
+
+// 2
+int bar = 2;''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '= 1;'),
+      1: _range(startsBefore: '// 2', endsAfter: '= 2;'),
+    });
+  }
+
+  Future<void> test_topLevel_noTrailingNewline_leadingAndTrailing() async {
+    await resolveTestCode('''
+import '';
+
+// 2
+int foo = 1; // 3
+
+// 4
+int bar = 1; // 5''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+      1: _range(startsBefore: '// 4', endsAfter: '// 5'),
+    });
+  }
+
+  Future<void>
+      test_topLevel_noTrailingNewline_leadingAndTrailing_withClassBraceTrailing() async {
+    await resolveTestCode('''
+import '';
+
+// 2
+int foo = 1; // 3
+
+// 4
+int bar = 1; // 5''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+      1: _range(startsBefore: '// 4', endsAfter: '// 5'),
+    });
+  }
+
+  Future<void> test_topLevel_noTrailingNewline_trailing() async {
+    await resolveTestCode('''
+import '';
+
+int foo = 1; // 1
+int bar = 2; // 2''');
+    _assertUnitRanges({
+      0: _range(startsBefore: 'int foo', endsAfter: '// 1'),
+      1: _range(startsBefore: 'int bar', endsAfter: '// 2'),
+    });
+  }
+
+  Future<void> test_topLevel_single_field_leading() async {
+    await resolveTestCode('''
+import '';
+
+// 1
+int foo = 1;
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '= 1;'),
+    });
+  }
+
+  Future<void> test_topLevel_single_field_leadingAndTrailing() async {
+    await resolveTestCode('''
+import '';
+
+// 1
+int foo = 1; // 2
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '// 2'),
+    });
+  }
+
+  Future<void>
+      test_topLevel_single_field_leadingAndTrailing_withClassBraceTrailing() async {
+    await resolveTestCode('''
+import '';
+
+// 2
+int foo = 1; // 3
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+    });
+  }
+
+  Future<void> test_topLevel_single_field_trailing() async {
+    await resolveTestCode('''
+import '';
+
+int foo = 1; // 1
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: 'int foo', endsAfter: '// 1'),
+    });
+  }
+
+  Future<void> test_topLevel_single_method_leading() async {
+    await resolveTestCode('''
+import '';
+
+// 1
+foo() {}
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '{}'),
+    });
+  }
+
+  Future<void> test_topLevel_single_method_leadingAndTrailing() async {
+    await resolveTestCode('''
+import '';
+
+// 1
+foo() {} // 2
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '// 2'),
+    });
+  }
+
+  Future<void>
+      test_topLevel_single_method_leadingAndTrailing_withClassBraceTrailing() async {
+    await resolveTestCode('''
+import '';
+
+// 1
+foo() {} // 2
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '// 2'),
+    });
+  }
+
+  Future<void> test_topLevel_single_method_trailing() async {
+    await resolveTestCode('''
+foo() {} // 1
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: 'foo()', endsAfter: '// 1'),
+    });
+  }
+
+  Future<void> test_topLevel_withDirectives_leading() async {
+    await resolveTestCode('''
+import 'dart:async';
+
+// 1
+int foo = 1;
+
+// 2
+int bar = 2;
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 1', endsAfter: '= 1;'),
+      1: _range(startsBefore: '// 2', endsAfter: '= 2;'),
+    });
+  }
+
+  Future<void> test_topLevel_withDirectives_leadingAndTrailing() async {
+    await resolveTestCode('''
+import 'dart:async';
+
+// 2
+int foo = 1; // 3
+
+// 4
+int bar = 1; // 5
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+      1: _range(startsBefore: '// 4', endsAfter: '// 5'),
+    });
+  }
+
+  Future<void>
+      test_topLevel_withDirectives_leadingAndTrailing_withClassBraceTrailing() async {
+    await resolveTestCode('''
+import 'dart:async';
+
+// 2
+int foo = 1; // 3
+
+// 4
+int bar = 1; // 5
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: '// 2', endsAfter: '// 3'),
+      1: _range(startsBefore: '// 4', endsAfter: '// 5'),
+    });
+  }
+
+  Future<void> test_topLevel_withDirectives_trailing() async {
+    await resolveTestCode('''
+import 'dart:async';
+
+int foo = 1; // 1
+int bar = 2; // 2
+''');
+    _assertUnitRanges({
+      0: _range(startsBefore: 'int foo', endsAfter: '// 1'),
+      1: _range(startsBefore: 'int bar', endsAfter: '// 2'),
+    });
   }
 }
diff --git a/pkg/analysis_server/test/stress/completion/completion.dart b/pkg/analysis_server/test/stress/completion/completion.dart
index 41fc4ef..014efa1 100644
--- a/pkg/analysis_server/test/stress/completion/completion.dart
+++ b/pkg/analysis_server/test/stress/completion/completion.dart
@@ -18,10 +18,10 @@
 
     var runner = CompletionRunner(
         output: stdout,
-        printMissing: result['missing'],
-        printQuality: result['quality'],
-        timing: result['timing'],
-        verbose: result['verbose']);
+        printMissing: result['missing'] as bool?,
+        printQuality: result['quality'] as bool?,
+        timing: result['timing'] as bool?,
+        verbose: result['verbose'] as bool?);
     await runner.runAll(analysisRoot);
     await stdout.flush();
   }
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 136684a..2f7a688 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/utilities/null_string_sink.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
@@ -11,6 +10,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
 /// A runner that can request code completion at the location of each identifier
@@ -60,7 +60,6 @@
     var contributor = DartCompletionManager(
       budget: CompletionBudget(const Duration(seconds: 30)),
     );
-    var statistics = CompletionPerformance();
     var stamp = 1;
 
     var fileCount = 0;
@@ -100,17 +99,13 @@
           }
 
           timer.start();
-          var dartRequest = DartCompletionRequest(
+          var dartRequest = DartCompletionRequest.forResolvedUnit(
             resolvedUnit: result,
             offset: offset,
           );
-          var suggestions = await statistics.runRequestOperation(
-            (performance) async {
-              return await contributor.computeSuggestions(
-                dartRequest,
-                performance,
-              );
-            },
+          var suggestions = await contributor.computeSuggestions(
+            dartRequest,
+            OperationPerformanceImpl('<root>'),
           );
           timer.stop();
 
diff --git a/pkg/analysis_server/test/stress/replay/operation.dart b/pkg/analysis_server/test/stress/replay/operation.dart
index a83d8b8..b8d58b8 100644
--- a/pkg/analysis_server/test/stress/replay/operation.dart
+++ b/pkg/analysis_server/test/stress/replay/operation.dart
@@ -11,7 +11,7 @@
   final String filePath;
 
   /// The overlay used to update the content.
-  final dynamic overlay;
+  final Object overlay;
 
   /// Initialize an operation to send an 'analysis.updateContent' request with
   /// the given [filePath] and [overlay] as parameters.
diff --git a/pkg/analysis_server/test/stress/replay/replay.dart b/pkg/analysis_server/test/stress/replay/replay.dart
index da2cae0..a674281 100644
--- a/pkg/analysis_server/test/stress/replay/replay.dart
+++ b/pkg/analysis_server/test/stress/replay/replay.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/error/listener.dart' as error;
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/util/glob.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -260,19 +259,19 @@
       return false;
     }
 
-    if (results[HELP_FLAG_NAME]) {
+    if (results[HELP_FLAG_NAME] as bool) {
       _showUsage(parser);
       return false;
     }
 
-    String overlayStyleValue = results[OVERLAY_STYLE_OPTION_NAME];
+    var overlayStyleValue = results[OVERLAY_STYLE_OPTION_NAME] as String;
     if (overlayStyleValue == CHANGE_OVERLAY_STYLE) {
       overlayStyle = OverlayStyle.change;
     } else if (overlayStyleValue == MULTIPLE_ADD_OVERLAY_STYLE) {
       overlayStyle = OverlayStyle.multipleAdd;
     }
 
-    if (results[VERBOSE_FLAG_NAME]) {
+    if (results[VERBOSE_FLAG_NAME] as bool) {
       verbose = true;
       logger = Logger(stdout);
     }
@@ -497,7 +496,7 @@
       throw ArgumentError('Unhandled change of type ${record.status}');
     } else {
       content = File(filePath).readAsStringSync();
-      lineInfo = LineInfo(StringUtilities.computeLineStarts(content));
+      lineInfo = LineInfo.fromContent(content);
     }
     currentContent = content;
   }
diff --git a/pkg/analysis_server/test/stress/utilities/server.dart b/pkg/analysis_server/test/stress/utilities/server.dart
index 888056a..b2eefa3 100644
--- a/pkg/analysis_server/test/stress/utilities/server.dart
+++ b/pkg/analysis_server/test/stress/utilities/server.dart
@@ -766,7 +766,7 @@
       return;
     }
     logger?.log(fromServer, '$trimmedLine');
-    var message = asMap(json.decoder.convert(trimmedLine));
+    var message = asMap(json.decoder.convert(trimmedLine) as Object);
     if (message.containsKey('id')) {
       // The message is a response.
       var response = Response.fromJson(message)!;
diff --git a/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart b/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
index 265ac05..639b3eb 100644
--- a/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
+++ b/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
@@ -185,7 +185,7 @@
 }
 
 /// Returns matcher that can compare double values.
-Matcher doubleEquals(expected) => _DoubleEquals(expected);
+Matcher doubleEquals(double expected) => _DoubleEquals(expected);
 
 class _DoubleEquals extends Matcher {
   final double _value;
diff --git a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
index 824217e..04a78a6 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
@@ -334,7 +334,8 @@
   group('fromJson', () {
     test('parses JSON for types with unions (left side)', () {
       final input = '{"id":1,"method":"shutdown","jsonrpc":"test"}';
-      final message = RequestMessage.fromJson(jsonDecode(input));
+      final message =
+          RequestMessage.fromJson(jsonDecode(input) as Map<String, Object?>);
       expect(message.id, equals(Either2<num, String>.t1(1)));
       expect(message.id.valueEquals(1), isTrue);
       expect(message.jsonrpc, 'test');
@@ -343,7 +344,8 @@
 
     test('parses JSON for types with unions (right side)', () {
       final input = '{"id":"one","method":"shutdown","jsonrpc":"test"}';
-      final message = RequestMessage.fromJson(jsonDecode(input));
+      final message =
+          RequestMessage.fromJson(jsonDecode(input) as Map<String, Object?>);
       expect(message.id, equals(Either2<num, String>.t2('one')));
       expect(message.id.valueEquals('one'), isTrue);
       expect(message.jsonrpc, 'test');
@@ -352,13 +354,15 @@
 
     test('parses JSON with nulls for unions that allow null', () {
       final input = '{"id":null,"jsonrpc":"test"}';
-      final message = ResponseMessage.fromJson(jsonDecode(input));
+      final message =
+          ResponseMessage.fromJson(jsonDecode(input) as Map<String, Object?>);
       expect(message.id, isNull);
     });
 
     test('parses JSON with nulls for unions that allow null', () {
       final input = '{"method":"test","jsonrpc":"test"}';
-      final message = NotificationMessage.fromJson(jsonDecode(input));
+      final message = NotificationMessage.fromJson(
+          jsonDecode(input) as Map<String, Object?>);
       expect(message.params, isNull);
     });
 
@@ -370,7 +374,8 @@
             version: 111, uri: 'file:///foo/bar.dart'),
         position: Position(line: 1, character: 1),
       ).toJson());
-      final params = TextDocumentPositionParams.fromJson(jsonDecode(input));
+      final params = TextDocumentPositionParams.fromJson(
+          jsonDecode(input) as Map<String, Object?>);
       expect(params.textDocument,
           const TypeMatcher<VersionedTextDocumentIdentifier>());
     });
@@ -378,7 +383,8 @@
     test('parses JSON with unknown fields', () {
       final input =
           '{"id":1,"invalidField":true,"method":"foo","jsonrpc":"test"}';
-      final message = RequestMessage.fromJson(jsonDecode(input));
+      final message =
+          RequestMessage.fromJson(jsonDecode(input) as Map<String, Object?>);
       expect(message.id.valueEquals(1), isTrue);
       expect(message.method, equals(Method('foo')));
       expect(message.params, isNull);
@@ -401,7 +407,8 @@
       workspaceFolders: workspaceFolders,
     );
     final json = jsonEncode(obj);
-    final restoredObj = InitializeParams.fromJson(jsonDecode(json));
+    final restoredObj =
+        InitializeParams.fromJson(jsonDecode(json) as Map<String, Object?>);
     final restoredWorkspaceFolders = restoredObj.workspaceFolders!;
 
     expect(restoredWorkspaceFolders, hasLength(workspaceFolders.length));
@@ -420,7 +427,8 @@
         endCharacter: 4,
         kind: FoldingRangeKind.Comment);
     final json = jsonEncode(obj);
-    final restoredObj = FoldingRange.fromJson(jsonDecode(json));
+    final restoredObj =
+        FoldingRange.fromJson(jsonDecode(json) as Map<String, Object?>);
 
     expect(restoredObj.startLine, equals(obj.startLine));
     expect(restoredObj.startCharacter, equals(obj.startCharacter));
@@ -438,7 +446,8 @@
       'fileB': [TextEdit(range: range, newText: 'text B')]
     });
     final json = jsonEncode(obj);
-    final restoredObj = WorkspaceEdit.fromJson(jsonDecode(json));
+    final restoredObj =
+        WorkspaceEdit.fromJson(jsonDecode(json) as Map<String, Object?>);
 
     expect(restoredObj.documentChanges, equals(obj.documentChanges));
     expect(restoredObj.changes, equals(obj.changes));
diff --git a/pkg/analysis_server/test/utils/change_check.dart b/pkg/analysis_server/test/utils/change_check.dart
new file mode 100644
index 0000000..3cd3e2b
--- /dev/null
+++ b/pkg/analysis_server/test/utils/change_check.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer_utilities/check/check.dart';
+import 'package:meta/meta.dart';
+
+extension SourceChangeExtension on CheckTarget<SourceChange> {
+  @useResult
+  CheckTarget<List<SourceFileEdit>> get edits {
+    return nest(value.edits, (value) => 'has edits ${valueStr(value)}');
+  }
+
+  CheckTarget<SourceFileEdit> hasFileEdit(String path) {
+    return nest(
+      value.edits.singleWhere((e) => e.file == path),
+      (selected) => 'has edit ${valueStr(selected)}',
+    );
+  }
+}
+
+extension SourceFileEditExtension on CheckTarget<SourceFileEdit> {
+  @useResult
+  CheckTarget<String> appliedTo(String applyTo) {
+    var actual = SourceEdit.applySequence(applyTo, value.edits);
+    return nest(
+      actual,
+      (selected) => 'produces ${valueStr(selected)}',
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/verify_sorted_test.dart b/pkg/analysis_server/test/verify_sorted_test.dart
index 9033b16..bcde125 100644
--- a/pkg/analysis_server/test/verify_sorted_test.dart
+++ b/pkg/analysis_server/test/verify_sorted_test.dart
@@ -143,7 +143,7 @@
         if (errors.isNotEmpty) {
           fail('Errors found when parsing $path');
         }
-        var sorter = MemberSorter(code, unit);
+        var sorter = MemberSorter(code, unit, result.lineInfo);
         var edits = sorter.sort();
         if (edits.isNotEmpty) {
           fail('Unsorted file $path');
diff --git a/pkg/analysis_server/tool/bulk_fix/supported_diagnostics.dart b/pkg/analysis_server/tool/bulk_fix/supported_diagnostics.dart
index 2603f84..b2eab4e 100644
--- a/pkg/analysis_server/tool/bulk_fix/supported_diagnostics.dart
+++ b/pkg/analysis_server/tool/bulk_fix/supported_diagnostics.dart
@@ -16,8 +16,10 @@
   var hintEntries = FixProcessor.nonLintProducerMap.entries.where((e) =>
       e.key.type == ErrorType.HINT || e.key.type == ErrorType.STATIC_WARNING);
 
-  var diagnostics = List.from(hintEntries)
-    ..addAll(FixProcessor.lintProducerMap.entries);
+  var diagnostics = [
+    ...hintEntries,
+    ...FixProcessor.lintProducerMap.entries,
+  ];
   for (var diagnostic in diagnostics) {
     var canBeAppliedInBulk = false;
     var missingExplanations = <String>[];
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index c7a90fc..aba444c 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -10,7 +10,6 @@
 import 'package:analysis_server/src/domains/completion/available_suggestions.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/documentation_cache.dart';
 import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
@@ -95,7 +94,7 @@
   var provider = PhysicalResourceProvider.INSTANCE;
   if (result.wasParsed('reduceDir')) {
     var targetMetrics = <CompletionMetrics>[];
-    var dir = provider.getFolder(result['reduceDir']);
+    var dir = provider.getFolder(result['reduceDir'] as String);
     var computer = CompletionMetricsComputer('', options);
     for (var child in dir.getChildren()) {
       if (child is File) {
@@ -240,7 +239,7 @@
     printUsage(parser);
     return false;
   } else if (result.wasParsed('reduceDir')) {
-    return validateDir(parser, result['reduceDir']);
+    return validateDir(parser, result['reduceDir'] as String);
   } else if (result.rest.length != 1) {
     printUsage(parser, error: 'No package path specified.');
     return false;
@@ -403,13 +402,14 @@
         in (map['groupMrrComputers'] as Map<String, dynamic>).entries) {
       var group = CompletionGroup.values[int.parse(entry.key)];
       metrics.groupMrrComputers[group] = MeanReciprocalRankComputer(group.name)
-        ..fromJson(entry.value);
+        ..fromJson(entry.value as Map<String, Object?>);
     }
     for (var entry
         in (map['locationMrrComputers'] as Map<String, dynamic>).entries) {
       var location = entry.key;
       metrics.locationMrrComputers[location] =
-          MeanReciprocalRankComputer(location)..fromJson(entry.value);
+          MeanReciprocalRankComputer(location)
+            ..fromJson(entry.value as Map<String, Object?>);
     }
     metrics.charsBeforeTop
         .fromJson(map['charsBeforeTop'] as Map<String, dynamic>);
@@ -418,11 +418,11 @@
     metrics.insertionLengthTheoretical
         .fromJson(map['insertionLengthTheoretical'] as Map<String, dynamic>);
     for (var element in map['missingCompletionLocations'] as List<dynamic>) {
-      metrics.missingCompletionLocations.add(element);
+      metrics.missingCompletionLocations.add(element as String);
     }
     for (var element
         in map['missingCompletionLocationTables'] as List<dynamic>) {
-      metrics.missingCompletionLocationTables.add(element);
+      metrics.missingCompletionLocationTables.add(element as String);
     }
     for (var entry in (map['slowestResults'] as Map<String, dynamic>).entries) {
       var group = CompletionGroup.values[int.parse(entry.key)];
@@ -1227,7 +1227,7 @@
         listener: listener,
       ).computeSuggestions(dartRequest, performance);
 
-      computeIncludedSetList(declarationsTracker, dartRequest.result,
+      computeIncludedSetList(declarationsTracker, dartRequest,
           includedSuggestionSetList, includedElementNames);
 
       var includedSuggestionSetMap = {
@@ -1369,27 +1369,19 @@
             {required MetricsSuggestionListener listener,
             required CompletionMetrics metrics}) async {
           var stopwatch = Stopwatch()..start();
-          var request = DartCompletionRequest(
+          var request = DartCompletionRequest.forResolvedUnit(
             resolvedUnit: resolvedUnitResult,
             offset: expectedCompletion.offset,
             documentationCache: documentationCache,
           );
 
-          late OpType opType;
-          late List<protocol.CompletionSuggestion> suggestions;
-          await CompletionPerformance().runRequestOperation(
-            (performance) async {
-              opType = OpType.forCompletion(request.target, request.offset);
-              suggestions = await _computeCompletionSuggestions(
-                listener,
-                performance,
-                request,
-                metrics.availableSuggestions ? declarationsTracker : null,
-                metrics.availableSuggestions
-                    ? availableSuggestionsParams
-                    : null,
-              );
-            },
+          var opType = OpType.forCompletion(request.target, request.offset);
+          var suggestions = await _computeCompletionSuggestions(
+            listener,
+            OperationPerformanceImpl('<root>'),
+            request,
+            metrics.availableSuggestions ? declarationsTracker : null,
+            metrics.availableSuggestions ? availableSuggestionsParams : null,
           );
           stopwatch.stop();
 
@@ -1678,15 +1670,17 @@
 
   factory CompletionMetricsOptions(results) {
     return CompletionMetricsOptions._(
-        overlay: results[OVERLAY],
-        printMissedCompletionDetails: results[PRINT_MISSED_COMPLETION_DETAILS],
-        printMissedCompletionSummary: results[PRINT_MISSED_COMPLETION_SUMMARY],
-        printMissingInformation: results[PRINT_MISSING_INFORMATION],
-        printMrrByLocation: results[PRINT_MRR_BY_LOCATION],
+        overlay: results[OVERLAY] as String,
+        printMissedCompletionDetails:
+            results[PRINT_MISSED_COMPLETION_DETAILS] as bool,
+        printMissedCompletionSummary:
+            results[PRINT_MISSED_COMPLETION_SUMMARY] as bool,
+        printMissingInformation: results[PRINT_MISSING_INFORMATION] as bool,
+        printMrrByLocation: results[PRINT_MRR_BY_LOCATION] as bool,
         printShadowedCompletionDetails:
-            results[PRINT_SHADOWED_COMPLETION_DETAILS],
-        printSlowestResults: results[PRINT_SLOWEST_RESULTS],
-        printWorstResults: results[PRINT_WORST_RESULTS]);
+            results[PRINT_SHADOWED_COMPLETION_DETAILS] as bool,
+        printSlowestResults: results[PRINT_SLOWEST_RESULTS] as bool,
+        printWorstResults: results[PRINT_WORST_RESULTS] as bool);
   }
 
   CompletionMetricsOptions._(
diff --git a/pkg/analysis_server/tool/code_completion/corpus.dart b/pkg/analysis_server/tool/code_completion/corpus.dart
index 2bde6fe..d7f02f2 100644
--- a/pkg/analysis_server/tool/code_completion/corpus.dart
+++ b/pkg/analysis_server/tool/code_completion/corpus.dart
@@ -18,7 +18,7 @@
     exit(1);
   }
 
-  final repos = [];
+  final repos = <String>[];
   if (args.length == 1 && !Directory(args[0]).existsSync()) {
     final contents = File(args[0]).readAsStringSync();
     repos.addAll(LineSplitter().convert(contents));
@@ -86,7 +86,7 @@
     result = await Process.run(
         'git', ['clone', '--recurse-submodules', '$repo.git', cloneDir]);
   }
-  return CloneResult(result.exitCode, cloneDir, msg: result.stderr);
+  return CloneResult(result.exitCode, cloneDir, msg: result.stderr as String);
 }
 
 Future<String> _getBody(String url) async => (await _getResponse(url)).body;
@@ -105,11 +105,11 @@
   if (_hasPubspec(dir)) {
     final packageFile = path.join(dir.path, _package_config);
     if (!File(packageFile).existsSync() || forcePubUpdate) {
-      print(
-          'Getting pub dependencies for "${path.relative(dir.path, from: _appDir)}"...');
+      final relativeDirPath = path.relative(dir.path, from: _appDir);
+      print('Getting pub dependencies for "$relativeDirPath"...');
       final pubRun = await _runPub(dir.path);
       if (pubRun.exitCode != 0) {
-        print('Error: ' + pubRun.stderr);
+        print('Error: ${pubRun.stderr}');
       }
     }
   }
diff --git a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
index 8494fb4..83be746 100644
--- a/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
+++ b/pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart
@@ -31,7 +31,7 @@
     var computer = ImpliedTypeComputer();
     var stopwatch = Stopwatch();
     stopwatch.start();
-    await computer.compute(rootPath, verbose: result['verbose']);
+    await computer.compute(rootPath, verbose: result['verbose'] as bool);
     stopwatch.stop();
 
     var duration = Duration(milliseconds: stopwatch.elapsedMilliseconds);
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index e5ad8cc..157e2be 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -51,7 +51,7 @@
     var computer = RelevanceMetricsComputer();
     var stopwatch = Stopwatch();
     stopwatch.start();
-    await computer.compute(rootPath, verbose: result['verbose']);
+    await computer.compute(rootPath, verbose: result['verbose'] as bool);
     stopwatch.stop();
 
     var duration = Duration(milliseconds: stopwatch.elapsedMilliseconds);
diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
index 30fd62f..7111493 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
@@ -59,7 +59,7 @@
 
     if (result.wasParsed('reduceDir')) {
       var data = RelevanceData();
-      var dir = provider.getFolder(result['reduceDir']);
+      var dir = provider.getFolder(result['reduceDir'] as String);
       var suffix = result.rest.isNotEmpty ? result.rest[0] : '';
       for (var child in dir.getChildren()) {
         if (child is File) {
@@ -76,7 +76,7 @@
 
     var computer = RelevanceMetricsComputer();
     var stopwatch = Stopwatch()..start();
-    await computer.compute(rootPath, verbose: result['verbose']);
+    await computer.compute(rootPath, verbose: result['verbose'] as bool);
     if (result.wasParsed('mapFile')) {
       var mapFile = provider.getFile(result['mapFile'] as String);
       mapFile.writeAsStringSync(computer.data.toJson());
@@ -139,7 +139,7 @@
     printUsage(parser);
     return false;
   } else if (result.wasParsed('reduceDir')) {
-    return validateDir(parser, result['reduceDir']);
+    return validateDir(parser, result['reduceDir'] as String);
   } else if (result.rest.length != 1) {
     printUsage(parser, error: 'No package path specified.');
     return false;
diff --git a/pkg/analysis_server/tool/instrumentation/log/log.dart b/pkg/analysis_server/tool/instrumentation/log/log.dart
index 503f991..4ede5ea 100644
--- a/pkg/analysis_server/tool/instrumentation/log/log.dart
+++ b/pkg/analysis_server/tool/instrumentation/log/log.dart
@@ -307,7 +307,7 @@
           if (entry.isServerStatus) {
             var analysisStatus = entry.param('analysis');
             if (analysisStatus is Map) {
-              if (analysisStatus['isAnalyzing']) {
+              if (analysisStatus['isAnalyzing'] as bool) {
                 if (analysisStartEntry != null) {
                   analysisStartEntry.recordProblem(
                       'Analysis started without being terminated.');
@@ -331,7 +331,7 @@
             }
             var pubStatus = entry.param('pub');
             if (pubStatus is Map) {
-              if (pubStatus['isListingPackageDirs']) {
+              if (pubStatus['isListingPackageDirs'] as bool) {
                 if (pubStartEntry != null) {
                   pubStartEntry.recordProblem(
                       'Pub started without previous being terminated.');
@@ -441,9 +441,9 @@
       object.forEach((key, value) {
         var newIndent = indent + singleIndent;
         buffer.write(newIndent);
-        _format(buffer, newIndent, key);
+        _format(buffer, newIndent, key as Object);
         buffer.write(' : ');
-        _format(buffer, newIndent, value);
+        _format(buffer, newIndent, value as Object);
         buffer.write('<br>');
       });
       buffer.write(indent);
@@ -453,7 +453,7 @@
       object.forEach((element) {
         var newIndent = indent + singleIndent;
         buffer.write(newIndent);
-        _format(buffer, newIndent, element);
+        _format(buffer, newIndent, element as Object);
         buffer.write('<br>');
       });
       buffer.write(indent);
@@ -578,7 +578,7 @@
       } else if (entryKind == InstrumentationLogAdapter.TAG_LOG_ENTRY) {
         // Fall through
       } else if (entryKind == InstrumentationLogAdapter.TAG_NOTIFICATION) {
-        Map requestData = json.decode(components[2]);
+        var requestData = json.decode(components[2]) as Map<Object?, Object?>;
         return NotificationEntry(index, timeStamp, requestData);
       } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_ERROR) {
         return PluginErrorEntry(index, timeStamp, entryKind,
@@ -588,25 +588,25 @@
             components.sublist(2, 5), components.sublist(5));
       } else if (entryKind ==
           InstrumentationLogAdapter.TAG_PLUGIN_NOTIFICATION) {
-        Map requestData = json.decode(components[2]);
+        var requestData = json.decode(components[2]) as Map<Object?, Object?>;
         return PluginNotificationEntry(
             index, timeStamp, requestData, components.sublist(3));
       } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_REQUEST) {
-        Map requestData = json.decode(components[2]);
+        var requestData = json.decode(components[2]) as Map<Object?, Object?>;
         return PluginRequestEntry(
             index, timeStamp, requestData, components.sublist(3));
       } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_RESPONSE) {
-        Map responseData = json.decode(components[2]);
+        var responseData = json.decode(components[2]) as Map<Object?, Object?>;
         return PluginResponseEntry(
             index, timeStamp, responseData, components.sublist(3));
       } else if (entryKind == InstrumentationLogAdapter.TAG_PLUGIN_TIMEOUT) {
         return PluginErrorEntry(index, timeStamp, entryKind,
             components.sublist(2, 3), components.sublist(3));
       } else if (entryKind == InstrumentationLogAdapter.TAG_REQUEST) {
-        Map requestData = json.decode(components[2]);
+        var requestData = json.decode(components[2]) as Map<Object?, Object?>;
         return RequestEntry(index, timeStamp, requestData);
       } else if (entryKind == InstrumentationLogAdapter.TAG_RESPONSE) {
-        Map responseData = json.decode(components[2]);
+        var responseData = json.decode(components[2]) as Map<Object?, Object?>;
         return ResponseEntry(index, timeStamp, responseData);
       } else if (entryKind == InstrumentationLogAdapter.TAG_VERSION) {
         // Fall through
@@ -675,7 +675,7 @@
       : super(index, timeStamp, notificationData);
 
   /// Return the event field of the request.
-  String get event => data['event'];
+  String get event => data['event'] as String;
 
   /// Return `true` if this is a server error notification.
   bool get isServerError => event == 'server.error';
@@ -747,7 +747,7 @@
       : super(index, timeStamp, notificationData, pluginData);
 
   /// Return the event field of the notification.
-  String get event => data['event'];
+  String get event => data['event'] as String;
 
   @override
   String get kind => 'PluginNoti';
@@ -773,13 +773,13 @@
       : super(index, timeStamp, requestData, pluginData);
 
   /// Return the id field of the request.
-  String get id => data['id'];
+  String get id => data['id'] as String;
 
   @override
   String get kind => 'PluginReq';
 
   /// Return the method field of the request.
-  String get method => data['method'];
+  String get method => data['method'] as String;
 
   /// Return the value of the parameter with the given [parameterName], or
   /// `null` if there is no such parameter.
@@ -802,7 +802,7 @@
       : super(index, timeStamp, responseData, pluginData);
 
   /// Return the id field of the response.
-  String get id => data['id'];
+  String get id => data['id'] as String;
 
   @override
   String get kind => 'PluginRes';
@@ -827,16 +827,16 @@
       : super(index, timeStamp, requestData);
 
   /// Return the clientRequestTime field of the request.
-  int get clientRequestTime => data['clientRequestTime'];
+  int get clientRequestTime => data['clientRequestTime'] as int;
 
   /// Return the id field of the request.
-  String get id => data['id'];
+  String get id => data['id'] as String;
 
   @override
   String get kind => 'Req';
 
   /// Return the method field of the request.
-  String get method => data['method'];
+  String get method => data['method'] as String;
 
   /// Return the value of the parameter with the given [parameterName], or
   /// `null` if there is no such parameter.
@@ -858,7 +858,7 @@
       : super(index, timeStamp, responseData);
 
   /// Return the id field of the response.
-  String get id => data['id'];
+  String get id => data['id'] as String;
 
   @override
   String get kind => 'Res';
diff --git a/pkg/analysis_server/tool/instrumentation/log_viewer.dart b/pkg/analysis_server/tool/instrumentation/log_viewer.dart
index f3e5379d..6273c47 100644
--- a/pkg/analysis_server/tool/instrumentation/log_viewer.dart
+++ b/pkg/analysis_server/tool/instrumentation/log_viewer.dart
@@ -70,14 +70,14 @@
   void start(List<String> args) {
     var parser = createParser();
     var options = parser.parse(args);
-    if (options[helpFlag]) {
+    if (options[helpFlag] as bool) {
       printUsage(parser);
       return;
     }
 
     var port = defaultPortNumber;
     try {
-      port = int.parse(options[portOption]);
+      port = int.parse(options[portOption] as String);
     } catch (exception) {
       printUsage(parser, error: 'Invalid port number');
       return;
diff --git a/pkg/analysis_server/tool/instrumentation/page/log_page.dart b/pkg/analysis_server/tool/instrumentation/page/log_page.dart
index 9288cf5..addd9dc 100644
--- a/pkg/analysis_server/tool/instrumentation/page/log_page.dart
+++ b/pkg/analysis_server/tool/instrumentation/page/log_page.dart
@@ -142,7 +142,7 @@
       if (entry.isServerStatus) {
         var analysisStatus = entry.param('analysis');
         if (analysisStatus is Map) {
-          if (analysisStatus['isAnalyzing']) {
+          if (analysisStatus['isAnalyzing'] as bool) {
             description = '$description <span class="gray">(analyzing)</span>';
           } else {
             var duration = _getDuration(pairedEntry, entry);
@@ -152,7 +152,7 @@
         }
         var pubStatus = entry.param('pub');
         if (pubStatus is Map) {
-          if (pubStatus['isListingPackageDirs']) {
+          if (pubStatus['isListingPackageDirs'] as bool) {
             description = '$description <span class="gray">(pub)</span>';
           } else {
             var duration = _getDuration(pairedEntry, entry);
diff --git a/pkg/analysis_server/tool/lsp_spec/README.md b/pkg/analysis_server/tool/lsp_spec/README.md
index cc61b66..ccf6e8a 100644
--- a/pkg/analysis_server/tool/lsp_spec/README.md
+++ b/pkg/analysis_server/tool/lsp_spec/README.md
@@ -9,10 +9,10 @@
 
 ## Running the Server
 
-The analysis server snapshot is included in the `bin/snapshots` folder of the Dart SDK. Pass the `--lsp` flag to start the server in LSP mode and the `--client-id` and `--client-version` flags to identify your editor/plugin and version:
+Start the language server using the `dart language-server` command. Pass the `--client-id` and `--client-version` flags to identify your editor/plugin and version:
 
 ```
-dart bin/snapshots/analysis_server.dart.snapshot --lsp --client-id my-editor.my-plugin --client-version 1.2
+dart language-server --client-id my-editor.my-plugin --client-version 1.2
 ```
 
 Note: In LSP the client makes the first request so there is no obvious confirmation that the server is working correctly until the client sends an `initialize` request. Unlike standard JSON RPC, [LSP requires that headers are sent](https://microsoft.github.io/language-server-protocol/specification).
@@ -101,8 +101,8 @@
 | codeLens/resolve | | | | | |
 | textDocument/documentLink | | | | | |
 | documentLink/resolve | | | | | |
-| textDocument/documentColor | | | | | |
-| textDocument/colorPresentation | | | | | |
+| textDocument/documentColor | ✅ | ✅ | | ✅ | ✅ |
+| textDocument/colorPresentation | ✅ | ✅ | | ✅ | ✅ |
 | textDocument/formatting | ✅ | ✅ | | ✅ | ✅ |
 | textDocument/rangeFormatting | ✅ | ✅ | | ✅ | ✅ |
 | textDocument/onTypeFormatting | ✅ | ✅ | | ✅ | ✅ |
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 7b95c29..5383d50 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -60,7 +60,7 @@
       .forEach((namespace) => _namespaces[namespace.name] = namespace);
 }
 
-TypeBase resolveTypeAlias(TypeBase type, {resolveEnumClasses = false}) {
+TypeBase resolveTypeAlias(TypeBase type, {bool resolveEnumClasses = false}) {
   if (type is Type) {
     // The LSP spec contains type aliases for `integer` and `uinteger` that map
     // into the `number` type, with comments stating they must be integers. To
@@ -380,7 +380,7 @@
     ..writeIndentedln('final ${typeOfValues.dartTypeWithTypeArgs} _value;')
     ..writeln()
     ..writeIndentedln(
-        'static bool canParse(Object obj, LspJsonReporter reporter) {')
+        'static bool canParse(Object? obj, LspJsonReporter reporter) {')
     ..indent();
   if (allowsAnyValue) {
     buffer.writeIndentedln('return ');
@@ -866,7 +866,7 @@
   } else if (_isSpecType(type)) {
     buffer.write('$dartType.canParse($valueCode, $reporter)');
   } else if (type is ArrayType) {
-    buffer.write('($valueCode is List');
+    buffer.write('($valueCode is 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.
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index 24a06ed..f1783c2 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -16,7 +16,8 @@
 
 Future<void> main(List<String> arguments) async {
   final args = argParser.parse(arguments);
-  if (args[argHelp]) {
+  var help = args[argHelp] as bool;
+  if (help) {
     print(argParser.usage);
     return;
   }
@@ -189,15 +190,14 @@
   Field field(
     String name, {
     required String type,
-    array = false,
-    canBeNull = false,
-    canBeUndefined = false,
+    bool array = false,
+    bool canBeUndefined = false,
   }) {
     var fieldType =
         array ? ArrayType(Type.identifier(type)) : Type.identifier(type);
 
     return Field(
-        null, Token.identifier(name), fieldType, canBeNull, canBeUndefined);
+        null, Token.identifier(name), fieldType, false, canBeUndefined);
   }
 
   final customTypes = <AstNode>[
@@ -302,7 +302,8 @@
 }
 
 Future<List<AstNode>> getSpecClasses(ArgResults args) async {
-  if (args[argDownload]) {
+  var download = args[argDownload] as bool;
+  if (download) {
     await downloadSpec();
   }
   final spec = await readSpec();
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index 0339409..d6935bf 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -934,7 +934,8 @@
           case 'bool':
             return FromJsonFunction('jsonDecoder.decodeBool');
           case 'double':
-            return FromJsonFunction('jsonDecoder.decodeDouble');
+            return FromJsonFunction('jsonDecoder.decodeDouble',
+                castType: 'Object');
           case 'int':
           case 'long':
             return FromJsonFunction('jsonDecoder.decodeInt');
@@ -1120,14 +1121,17 @@
   @override
   final String asClosure;
 
-  FromJsonFunction(this.asClosure);
+  final String? castType;
+
+  FromJsonFunction(this.asClosure, {this.castType});
 
   @override
   bool get isIdentity => false;
 
   @override
-  String asSnippet(String jsonPath, String json) =>
-      '$asClosure($jsonPath, $json)';
+  String asSnippet(String jsonPath, String json) => castType == null
+      ? '$asClosure($jsonPath, $json)'
+      : '$asClosure($jsonPath, $json as $castType)';
 }
 
 /// Representation of FromJsonCode for the identity transformation.
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 9f7e268..c5022ea 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -441,8 +441,12 @@
    * @param offset The offset within the file at which suggestions are to be made.
    * @param maxResults The maximum number of suggestions to return. If the number of suggestions
    *         after filtering is greater than the maxResults, then isIncomplete is set to true.
+   * @param timeout The approximate time in milliseconds that the server should spend. The server
+   *         will perform some steps anyway, even if it takes longer than the specified timeout. This
+   *         field is intended to be used for benchmarking, and usually should not be provided, so
+   *         that the default timeout is used.
    */
-  public void completion_getSuggestions2(String file, int offset, int maxResults, GetSuggestions2Consumer consumer);
+  public void completion_getSuggestions2(String file, int offset, int maxResults, int timeout, GetSuggestions2Consumer consumer);
 
   /**
    * {@code completion.registerLibraryPaths}
@@ -977,6 +981,20 @@
   public void search_getTypeHierarchy(String file, int offset, boolean superOnly, GetTypeHierarchyConsumer consumer);
 
   /**
+   * {@code server.cancelRequest}
+   *
+   * Requests cancellation of a request sent by the client by id. This is provided on a best-effort
+   * basis and there is no guarantee the server will be able to cancel any specific request. The
+   * server will still always produce a response to the request even in the case of cancellation, but
+   * clients should discard any results of any cancelled request because they may be incomplete or
+   * inaccurate. This request always completes without error regardless of whether the request is
+   * successfully cancelled.
+   *
+   * @param id The id of the request that should be cancelled.
+   */
+  public void server_cancelRequest(String id);
+
+  /**
    * {@code server.getVersion}
    *
    * Return the version number of the analysis server.
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index aa08d74..c634b46 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.32.7</version>
+  <version>1.32.8</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.32.8</h4>
+<ul>
+  <li>Added <tt>server.cancelRequest</tt> to allow clients to request cancellation
+  of outstanding requests.</li>
+</ul>
 <h4>1.32.7</h4>
 <ul>
   <li><tt>HoverInformation.elementDescription</tt> may now include linebreaks to
@@ -294,6 +299,26 @@
       </field>
     </params>
   </request>
+  <request method="cancelRequest">
+    <p>Requests cancellation of a request sent by the client by id.
+      This is provided on a best-effort basis and there is no
+      guarantee the server will be able to cancel any specific
+      request.
+
+      The server will still always produce a response to the request
+      even in the case of cancellation, but clients should discard
+      any results of any cancelled request because they may be
+      incomplete or inaccurate.
+      
+      This request always completes without error regardless of
+      whether the request is successfully cancelled.</p>
+    <params>
+      <field name="id">
+        <ref>String</ref>
+        <p>The id of the request that should be cancelled.</p>
+      </field>
+    </params>
+  </request>
   <notification event="connected">
     <p>
       Reports that the server is running. This notification is
@@ -1482,6 +1507,16 @@
           then <tt>isIncomplete</tt> is set to <tt>true</tt>.
         </p>
       </field>
+      <field name="timeout" experimental="true" optional="true">
+        <ref>int</ref>
+        <p>
+          The approximate time in milliseconds that the server should spend.
+          The server will perform some steps anyway, even if it takes longer
+          than the specified timeout. This field is intended to be used for
+          benchmarking, and usually should not be  provided, so that the
+          default timeout is used.
+        </p>
+      </field>
     </params>
     <result>
       <field name="replacementOffset">
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 2689506..00b690a 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -6,7 +6,7 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
-const String PROTOCOL_VERSION = '1.32.7';
+const String PROTOCOL_VERSION = '1.32.8';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
@@ -141,6 +141,7 @@
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_FILE = 'file';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_MAX_RESULTS = 'maxResults';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS2_OFFSET = 'offset';
+const String COMPLETION_REQUEST_GET_SUGGESTIONS2_TIMEOUT = 'timeout';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS_FILE = 'file';
 const String COMPLETION_REQUEST_GET_SUGGESTIONS_OFFSET = 'offset';
 const String COMPLETION_REQUEST_GET_SUGGESTION_DETAILS =
@@ -355,6 +356,8 @@
 const String SERVER_NOTIFICATION_STATUS = 'server.status';
 const String SERVER_NOTIFICATION_STATUS_ANALYSIS = 'analysis';
 const String SERVER_NOTIFICATION_STATUS_PUB = 'pub';
+const String SERVER_REQUEST_CANCEL_REQUEST = 'server.cancelRequest';
+const String SERVER_REQUEST_CANCEL_REQUEST_ID = 'id';
 const String SERVER_REQUEST_GET_VERSION = 'server.getVersion';
 const String SERVER_REQUEST_SET_SUBSCRIPTIONS = 'server.setSubscriptions';
 const String SERVER_REQUEST_SET_SUBSCRIPTIONS_SUBSCRIPTIONS = 'subscriptions';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index 2dcbd32..c375b0c 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -4698,7 +4698,14 @@
   /// to true.
   int maxResults;
 
-  CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults);
+  /// The approximate time in milliseconds that the server should spend. The
+  /// server will perform some steps anyway, even if it takes longer than the
+  /// specified timeout. This field is intended to be used for benchmarking,
+  /// and usually should not be provided, so that the default timeout is used.
+  int? timeout;
+
+  CompletionGetSuggestions2Params(this.file, this.offset, this.maxResults,
+      {this.timeout});
 
   factory CompletionGetSuggestions2Params.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object? json) {
@@ -4723,7 +4730,12 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, 'maxResults');
       }
-      return CompletionGetSuggestions2Params(file, offset, maxResults);
+      int? timeout;
+      if (json.containsKey('timeout')) {
+        timeout = jsonDecoder.decodeInt(jsonPath + '.timeout', json['timeout']);
+      }
+      return CompletionGetSuggestions2Params(file, offset, maxResults,
+          timeout: timeout);
     } else {
       throw jsonDecoder.mismatch(
           jsonPath, 'completion.getSuggestions2 params', json);
@@ -4741,6 +4753,10 @@
     result['file'] = file;
     result['offset'] = offset;
     result['maxResults'] = maxResults;
+    var timeout = this.timeout;
+    if (timeout != null) {
+      result['timeout'] = timeout;
+    }
     return result;
   }
 
@@ -4757,7 +4773,8 @@
     if (other is CompletionGetSuggestions2Params) {
       return file == other.file &&
           offset == other.offset &&
-          maxResults == other.maxResults;
+          maxResults == other.maxResults &&
+          timeout == other.timeout;
     }
     return false;
   }
@@ -4767,6 +4784,7 @@
         file,
         offset,
         maxResults,
+        timeout,
       );
 }
 
@@ -11547,7 +11565,7 @@
       double? doubleValue;
       if (json.containsKey('doubleValue')) {
         doubleValue = jsonDecoder.decodeDouble(
-            jsonPath + '.doubleValue', json['doubleValue']);
+            jsonPath + '.doubleValue', json['doubleValue'] as Object);
       }
       int? intValue;
       if (json.containsKey('intValue')) {
@@ -15615,6 +15633,91 @@
       );
 }
 
+/// server.cancelRequest params
+///
+/// {
+///   "id": String
+/// }
+///
+/// Clients may not extend, implement or mix-in this class.
+class ServerCancelRequestParams implements RequestParams {
+  /// The id of the request that should be cancelled.
+  String id;
+
+  ServerCancelRequestParams(this.id);
+
+  factory ServerCancelRequestParams.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object? json) {
+    json ??= {};
+    if (json is Map) {
+      String id;
+      if (json.containsKey('id')) {
+        id = jsonDecoder.decodeString(jsonPath + '.id', json['id']);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, 'id');
+      }
+      return ServerCancelRequestParams(id);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, 'server.cancelRequest params', json);
+    }
+  }
+
+  factory ServerCancelRequestParams.fromRequest(Request request) {
+    return ServerCancelRequestParams.fromJson(
+        RequestDecoder(request), 'params', request.params);
+  }
+
+  @override
+  Map<String, Object> toJson() {
+    var result = <String, Object>{};
+    result['id'] = id;
+    return result;
+  }
+
+  @override
+  Request toRequest(String id) {
+    return Request(id, 'server.cancelRequest', toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is ServerCancelRequestParams) {
+      return id == other.id;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => id.hashCode;
+}
+
+/// server.cancelRequest result
+///
+/// Clients may not extend, implement or mix-in this class.
+class ServerCancelRequestResult implements ResponseResult {
+  @override
+  Map<String, Object> toJson() => <String, Object>{};
+
+  @override
+  Response toResponse(String id) {
+    return Response(id, result: null);
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is ServerCancelRequestResult) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode => 183255719;
+}
+
 /// server.connected params
 ///
 /// {
diff --git a/pkg/analysis_server_client/test/verify_sorted_test.dart b/pkg/analysis_server_client/test/verify_sorted_test.dart
index f4f4c57..8380e74 100644
--- a/pkg/analysis_server_client/test/verify_sorted_test.dart
+++ b/pkg/analysis_server_client/test/verify_sorted_test.dart
@@ -65,7 +65,7 @@
         if (errors.isNotEmpty) {
           fail('Errors found when parsing $path');
         }
-        var sorter = MemberSorter(code, unit);
+        var sorter = MemberSorter(code, unit, result.lineInfo);
         var edits = sorter.sort();
         if (edits.isNotEmpty) {
           fail('Unsorted file $path');
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index d672ae5..a6f4d42 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,7 +1,37 @@
-## 2.8.0-dev
+## 3.1.0-dev
+* New internal API for `package:dart_style`.
+* Removed deprecated non-API `MockSdk` class.
+
+## 3.0.0
+* Removed deprecated `DartType.aliasElement/aliasArguments`.
+* Removed deprecated constructors from `FeatureSet`.
+* Removed `UnitElementResult.signature` - unused by clients.
+* Removed deprecated `AnalysisError.withNamedArguments`.
+* Removed deprecated `ErrorReporter.reportErrorMessage`.
+* Removed deprecated `ResourceProvider.getModificationTimes()`.
+* Removed deprecated `MemoryResourceProvider.newDummyLink()`.
+* Removed deprecated `MemoryResourceProvider.updateFile()`.
+* Removed deprecated `Resource.parent`.
+* Removed deprecated `ResultState` and `AnalysisResult.state`.
+* Removed deprecated `summary_file_builder` library.
+* Removed deprecated `message` and `correction` from `ErrorCode`.
+* Removed deprecated `lookUp` methods from `InterfaceType`.
+* Removed deprecated `InterfaceType.getSmartLeastUpperBound`.
+* Removed deprecated `path` and `uri` from `AnalysisResult`.
+* Removed deprecated methods from `AnalysisSession`.
+* Removed `TypeName` and corresponding methods.
+* Removed deprecated methods from `TypeProvider`.
+
+## 2.8.0
 * Deprecations and renames for `getXyz` methods in `AnalysisDriver`.
 * Removed uppercase named constants from `double` in mock SDK.
 * Deprecated `path` and `uri` from `AnalysisResult`.
+* Deprecated `UriResolver.restoreAbsolute`, use `pathToUri` instead.
+* Deprecated `SourceFactory.restoreAbsolute`, use `pathToUri` instead.
+* Deprecated `UriKind` and `Source.uriKind`.
+* Deprecated `Source.modificationStamp`.
+* Deprecated `Source.isInSystemLibrary`, use `uri.isScheme('dart')` instead.
+* Fixed #47715.
 
 ## 2.7.0
 * Updated `ConstructorElement.displayName` to either `Class` or `Class.constructor`.
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index 9264322..9922aec 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/analysis/experiments.dart';
-import 'package:meta/meta.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 /// Information about a single language feature whose presence or absence
@@ -23,6 +22,9 @@
   static final control_flow_collections =
       ExperimentalFeatures.control_flow_collections;
 
+  /// Feature information for enhanced enums.
+  static final enhanced_enums = ExperimentalFeatures.enhanced_enums;
+
   /// Feature information for extension methods.
   static final extension_methods = ExperimentalFeatures.extension_methods;
 
@@ -32,12 +34,18 @@
   /// Feature information for generic metadata.
   static final generic_metadata = ExperimentalFeatures.generic_metadata;
 
+  /// Feature information for macros.
+  static final macros = ExperimentalFeatures.macros;
+
   /// Feature information for spread collections.
   static final spread_collections = ExperimentalFeatures.spread_collections;
 
   /// Feature information for set literals.
   static final set_literals = ExperimentalFeatures.set_literals;
 
+  /// Feature information for super parameters.
+  static final super_parameters = ExperimentalFeatures.super_parameters;
+
   /// Feature information for the triple-shift operator.
   static final triple_shift = ExperimentalFeatures.triple_shift;
 
@@ -68,23 +76,6 @@
 
 /// An unordered collection of [Feature] objects.
 abstract class FeatureSet {
-  /// Computes a set of features for use in a unit test.  Computes the set of
-  /// features enabled in [sdkVersion], plus any specified [additionalFeatures].
-  ///
-  /// If [sdkVersion] is not supplied (or is `null`), then the current set of
-  /// enabled features is used as the starting point.
-  @visibleForTesting
-  factory FeatureSet.forTesting(
-          {String sdkVersion, List<Feature> additionalFeatures}) =
-      // ignore: invalid_use_of_visible_for_testing_member
-      ExperimentStatus.forTesting;
-
-  /// Computes the set of features implied by the given set of experimental
-  /// enable flags.
-  @Deprecated("Use 'fromEnableFlags2' instead")
-  factory FeatureSet.fromEnableFlags(List<String> flags) =
-      ExperimentStatus.fromStrings;
-
   /// Computes the set of features implied by the given set of experimental
   /// enable flags.
   factory FeatureSet.fromEnableFlags2({
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index a6f1df5..97198d9 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -15,20 +15,8 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class AnalysisResult {
-  /// The absolute and normalized path of the file that was analyzed.
-  @Deprecated('Use FileResult.path instead')
-  String get path;
-
   /// Return the session used to compute this result.
   AnalysisSession get session;
-
-  /// The state of the results.
-  @Deprecated('Check for specific Result subtypes instead')
-  ResultState get state;
-
-  /// The absolute URI of the file that was analyzed.
-  @Deprecated('Use FileResult.uri instead')
-  Uri get uri;
 }
 
 /// An analysis result that includes the errors computed during analysis.
@@ -87,11 +75,9 @@
   LineInfo get lineInfo;
 
   /// The absolute and normalized path of the file that was analyzed.
-  @override
   String get path;
 
   /// The absolute URI of the file that was analyzed.
-  @override
   Uri get uri;
 }
 
@@ -254,31 +240,6 @@
   CompilationUnit get unit;
 }
 
-/// An indication of whether an analysis result is valid, and if not why.
-@Deprecated('Check for specific Result subtypes instead')
-enum ResultState {
-  /// An indication that analysis could not be performed because the path
-  /// represents a file of a type that cannot be analyzed.
-  INVALID_FILE_TYPE,
-
-  /// An indication that analysis could not be performed because the path does
-  /// not represent a file. It might represent something else, such as a
-  /// directory, or it might not represent anything.
-  @Deprecated("Check 'get exists' flag instead")
-  NOT_A_FILE,
-
-  /// An indication that analysis could not be performed because the path does
-  /// not represent the corresponding URI.
-  ///
-  /// This usually happens in Bazel workspaces, when a URI is resolved to
-  /// a generated file, but there is also a writable file to which this URI
-  /// would be resolved, if there were no generated file.
-  NOT_FILE_OF_URI,
-
-  /// An indication that analysis completed normally and the results are valid.
-  VALID
-}
-
 /// The result of computing all of the errors contained in a single file, both
 /// syntactic and semantic.
 ///
@@ -353,18 +314,6 @@
 abstract class UnitElementResult implements SomeUnitElementResult, FileResult {
   /// The element of the file.
   CompilationUnitElement get element;
-
-  /// The signature of the library containing the [element]. This is the same
-  /// signature returned by the method [AnalysisSession.getUnitElementSignature]
-  /// when given the path to the compilation unit represented by the [element].
-  ///
-  /// The signature is based on the APIs of the files of the library (including
-  /// the file itself), and the transitive closure of files imported and
-  /// exported by the library. If the signature of a file has not changed, then
-  /// there have been no changes that would cause any files that depend on it
-  /// to need to be re-analyzed.
-  @Deprecated('This field is not used by clients and will be removed')
-  String get signature;
 }
 
 /// The type of [InvalidResult] returned when something is wrong, but we
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index ade0e8e..dc14b0a 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -37,71 +37,32 @@
   /// a result state indicating the nature of the problem.
   Future<SomeErrorsResult> getErrors(String path);
 
-  /// Return a future that will complete with information about the errors
-  /// contained in the file with the given absolute, normalized [path].
-  ///
-  /// If the file cannot be analyzed by this session, then the result will have
-  /// a result state indicating the nature of the problem.
-  @Deprecated('Use getErrors() instead')
-  Future<SomeErrorsResult> getErrors2(String path);
-
   /// Return information about the file at the given absolute, normalized
   /// [path].
   SomeFileResult getFile(String path);
 
-  /// Return information about the file at the given absolute, normalized
-  /// [path].
-  @Deprecated('Use getFile() instead')
-  SomeFileResult getFile2(String path);
-
   /// Return a future that will complete with information about the library
   /// element representing the library with the given [uri].
   Future<SomeLibraryElementResult> getLibraryByUri(String uri);
 
-  /// Return a future that will complete with information about the library
-  /// element representing the library with the given [uri].
-  @Deprecated('Use getLibraryByUri() instead')
-  Future<SomeLibraryElementResult> getLibraryByUri2(String uri);
-
   /// Return information about the results of parsing units of the library file
   /// with the given absolute, normalized [path].
   SomeParsedLibraryResult getParsedLibrary(String path);
 
   /// Return information about the results of parsing units of the library file
-  /// with the given absolute, normalized [path].
-  @Deprecated('Use getParsedLibrary() instead')
-  SomeParsedLibraryResult getParsedLibrary2(String path);
-
-  /// Return information about the results of parsing units of the library file
   /// with the given library [element].
   SomeParsedLibraryResult getParsedLibraryByElement(LibraryElement element);
 
-  /// Return information about the results of parsing units of the library file
-  /// with the given library [element].
-  @Deprecated('Use getParsedLibraryByElement() instead')
-  SomeParsedLibraryResult getParsedLibraryByElement2(LibraryElement element);
-
   /// Return information about the results of parsing the file with the given
   /// absolute, normalized [path].
   SomeParsedUnitResult getParsedUnit(String path);
 
-  /// Return information about the results of parsing the file with the given
-  /// absolute, normalized [path].
-  @Deprecated('Use getParsedUnit() instead')
-  SomeParsedUnitResult getParsedUnit2(String path);
-
   /// Return a future that will complete with information about the results of
   /// resolving all of the files in the library with the given absolute,
   /// normalized [path].
   Future<SomeResolvedLibraryResult> getResolvedLibrary(String path);
 
   /// Return a future that will complete with information about the results of
-  /// resolving all of the files in the library with the given absolute,
-  /// normalized [path].
-  @Deprecated('Use getResolvedLibrary() instead')
-  Future<SomeResolvedLibraryResult> getResolvedLibrary2(String path);
-
-  /// Return a future that will complete with information about the results of
   /// resolving all of the files in the library with the library [element].
   ///
   /// Throw [ArgumentError] if the [element] was not produced by this session.
@@ -109,32 +70,13 @@
       LibraryElement element);
 
   /// Return a future that will complete with information about the results of
-  /// resolving all of the files in the library with the library [element].
-  ///
-  /// Throw [ArgumentError] if the [element] was not produced by this session.
-  @Deprecated('Use getResolvedLibraryByElement() instead')
-  Future<SomeResolvedLibraryResult> getResolvedLibraryByElement2(
-      LibraryElement element);
-
-  /// Return a future that will complete with information about the results of
   /// resolving the file with the given absolute, normalized [path].
   Future<SomeResolvedUnitResult> getResolvedUnit(String path);
 
   /// Return a future that will complete with information about the results of
-  /// resolving the file with the given absolute, normalized [path].
-  @Deprecated('Use getResolvedUnit() instead')
-  Future<SomeResolvedUnitResult> getResolvedUnit2(String path);
-
-  /// Return a future that will complete with information about the results of
   /// building the element model for the file with the given absolute,
   /// normalized [path].
   Future<SomeUnitElementResult> getUnitElement(String path);
-
-  /// Return a future that will complete with information about the results of
-  /// building the element model for the file with the given absolute,
-  /// normalized [path].
-  @Deprecated('Use getUnitElement() instead')
-  Future<SomeUnitElementResult> getUnitElement2(String path);
 }
 
 /// The exception thrown by an [AnalysisSession] if a result is requested that
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index ba209b7..a0b7a9c 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -38,7 +38,6 @@
 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/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 
 /// Two or more string literals that are implicitly concatenated because of
@@ -318,7 +317,9 @@
 
   /// Return either this node or the most immediate ancestor of this node for
   /// which the [predicate] returns `true`, or `null` if there is no such node.
-  E? thisOrAncestorMatching<E extends AstNode>(Predicate<AstNode> predicate);
+  E? thisOrAncestorMatching<E extends AstNode>(
+    bool Function(AstNode) predicate,
+  );
 
   /// Return either this node or the most immediate ancestor of this node that
   /// has the given type, or `null` if there is no such node.
@@ -570,6 +571,8 @@
 
   R? visitSuperExpression(SuperExpression node);
 
+  R? visitSuperFormalParameter(SuperFormalParameter node);
+
   R? visitSwitchCase(SwitchCase node);
 
   R? visitSwitchDefault(SwitchDefault node);
@@ -590,9 +593,6 @@
 
   R? visitTypeLiteral(TypeLiteral node);
 
-  @Deprecated('Override visitNamedType instead')
-  R? visitTypeName(TypeName node);
-
   R? visitTypeParameter(TypeParameter node);
 
   R? visitTypeParameterList(TypeParameterList node);
@@ -814,6 +814,9 @@
   /// Return `true` if this class is declared to be an abstract class.
   bool get isAbstract;
 
+  /// Return the 'macro' keyword, or `null` if the keyword was absent.
+  Token? get macroKeyword;
+
   /// Return the native clause for this class, or `null` if the class does not
   /// have a native clause.
   NativeClause? get nativeClause;
@@ -901,14 +904,14 @@
   /// Return `true` if this class is declared to be an abstract class.
   bool get isAbstract;
 
+  /// Return the token for the 'macro' keyword, or `null` if this is not
+  /// defining a macro class.
+  Token? get macroKeyword;
+
   @override
   SimpleIdentifier get name;
 
   /// Return the name of the superclass of the class being declared.
-  @Deprecated('Use superclass2 instead')
-  TypeName get superclass;
-
-  /// Return the name of the superclass of the class being declared.
   NamedType get superclass2;
 
   /// Return the type parameters for the class, or `null` if the class does not
@@ -1335,10 +1338,6 @@
   Token? get period;
 
   /// Return the name of the type defining the constructor.
-  @Deprecated('Use type2 instead')
-  TypeName get type;
-
-  /// Return the name of the type defining the constructor.
   NamedType get type2;
 }
 
@@ -1575,7 +1574,9 @@
 /// The declaration of an enumeration.
 ///
 ///    enumType ::=
-///        metadata 'enum' [SimpleIdentifier] '{' [SimpleIdentifier] (',' [SimpleIdentifier])* (',')? '}'
+///        metadata 'enum' [SimpleIdentifier] [TypeParameterList]?
+///        [WithClause]? [ImplementsClause]? '{' [SimpleIdentifier]
+///        (',' [SimpleIdentifier])* (';' [ClassMember]+)? '}'
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class EnumDeclaration implements NamedCompilationUnitMember {
@@ -1588,14 +1589,29 @@
   /// Return the 'enum' keyword.
   Token get enumKeyword;
 
+  /// Returns the `implements` clause for the enumeration, or `null` if the
+  /// enumeration does not implement any interfaces.
+  ImplementsClause? get implementsClause;
+
   /// Return the left curly bracket.
   Token get leftBracket;
 
+  /// Return the members declared by the enumeration.
+  NodeList<ClassMember> get members;
+
   @override
   SimpleIdentifier get name;
 
   /// Return the right curly bracket.
   Token get rightBracket;
+
+  /// Returns the type parameters for the enumeration, or `null` if the
+  /// enumeration does not have any type parameters.
+  TypeParameterList? get typeParameters;
+
+  /// Return the `with` clause for the enumeration, or `null` if the
+  /// enumeration does not have a `with` clause.
+  WithClause? get withClause;
 }
 
 /// An export directive.
@@ -1715,10 +1731,6 @@
   Token get extendsKeyword;
 
   /// Return the name of the class that is being extended.
-  @Deprecated('Use superclass2 instead')
-  TypeName get superclass;
-
-  /// Return the name of the class that is being extended.
   NamedType get superclass2;
 }
 
@@ -2200,6 +2212,7 @@
 ///        [BlockFunctionBody]
 ///      | [EmptyFunctionBody]
 ///      | [ExpressionFunctionBody]
+///      | [NativeFunctionBody]
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class FunctionBody implements AstNode {
@@ -2615,10 +2628,6 @@
   Token get implementsKeyword;
 
   /// Return the list of the interfaces that are being implemented.
-  @Deprecated('Use interfaces2 instead')
-  NodeList<TypeName> get interfaces;
-
-  /// Return the list of the interfaces that are being implemented.
   NodeList<NamedType> get interfaces2;
 }
 
@@ -3471,10 +3480,6 @@
   Token get onKeyword;
 
   /// Return the list of the classes are superclass constraints for the mixin.
-  @Deprecated('Use superclassConstraints2 instead')
-  NodeList<TypeName> get superclassConstraints;
-
-  /// Return the list of the classes are superclass constraints for the mixin.
   NodeList<NamedType> get superclassConstraints2;
 }
 
@@ -4058,6 +4063,48 @@
   Token get superKeyword;
 }
 
+/// A super-initializer formal parameter.
+///
+///    superFormalParameter ::=
+///        ('final' [TypeAnnotation] | 'const' [TypeAnnotation] | 'var' | [TypeAnnotation])?
+///        'super' '.' [SimpleIdentifier] ([TypeParameterList]? [FormalParameterList])?
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SuperFormalParameter implements NormalFormalParameter {
+  @override
+  SimpleIdentifier get identifier;
+
+  /// Return the token representing either the 'final', 'const' or 'var'
+  /// keyword, or `null` if no keyword was used.
+  Token? get keyword;
+
+  /// Return the parameters of the function-typed parameter, or `null` if this
+  /// is not a function-typed field formal parameter.
+  FormalParameterList? get parameters;
+
+  /// Return the token representing the period.
+  Token get period;
+
+  /// If the parameter is function-typed, and has the question mark, then its
+  /// function type is nullable. Having a nullable function type means that the
+  /// parameter can be null.
+  Token? get question;
+
+  /// Return the token representing the 'super' keyword.
+  Token get superKeyword;
+
+  /// Return the declared type of the parameter, or `null` if the parameter does
+  /// not have a declared type.
+  ///
+  /// Note that if this is a function-typed field formal parameter this is the
+  /// return type of the function.
+  TypeAnnotation? get type;
+
+  /// Return the type parameters associated with this method, or `null` if this
+  /// method is not a generic method.
+  TypeParameterList? get typeParameters;
+}
+
 /// A case in a switch statement.
 ///
 ///    switchCase ::=
@@ -4314,21 +4361,8 @@
 abstract class TypeLiteral implements Expression, CommentReferableExpression {
   /// The type represented by this literal.
   NamedType get type;
-
-  /// The type represented by this literal.
-  @Deprecated('Use namedType instead')
-  TypeName get typeName;
 }
 
-/// The name of a type, which can optionally include type arguments.
-///
-///    typeName ::=
-///        [Identifier] typeArguments?
-///
-/// Clients may not extend, implement or mix-in this class.
-@Deprecated('Use NamedType instead')
-abstract class TypeName implements NamedType {}
-
 /// A type parameter.
 ///
 ///    typeParameter ::=
@@ -4529,10 +4563,6 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class WithClause implements AstNode {
   /// Return the names of the mixins that were specified.
-  @Deprecated('Use mixinTypes2 instead')
-  NodeList<TypeName> get mixinTypes;
-
-  /// Return the names of the mixins that were specified.
   NodeList<NamedType> get mixinTypes2;
 
   /// Return the token representing the 'with' keyword.
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 8a714a8..9cb8248 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -118,7 +118,8 @@
   /// Returns a newly created class declaration. Either or both of the
   /// [comment] and [metadata] can be `null` if the class does not have the
   /// corresponding attribute. The [abstractKeyword] can be `null` if the class
-  /// is not abstract. The [typeParameters] can be `null` if the class does not
+  /// is not abstract. The [macroKeyword] can be `null` if the class is not a
+  /// macro class. The [typeParameters] can be `null` if the class does not
   /// have any type parameters. Any or all of the [extendsClause], [withClause],
   /// and [implementsClause] can be `null` if the class does not have the
   /// corresponding clause. The list of [members] can be `null` if the class
@@ -127,6 +128,7 @@
       Comment? comment,
       List<Annotation>? metadata,
       Token? abstractKeyword,
+      Token? macroKeyword,
       Token classKeyword,
       SimpleIdentifier name,
       TypeParameterList? typeParameters,
@@ -141,7 +143,8 @@
   /// and [metadata] can be `null` if the class type alias does not have the
   /// corresponding attribute. The [typeParameters] can be `null` if the class
   /// does not have any type parameters. The [abstractKeyword] can be `null` if
-  /// the class is not abstract. The [implementsClause] can be `null` if the
+  /// the class is not abstract. The [macroKeyword] can be `null` if the class
+  /// is not a macro class. The [implementsClause] can be `null` if the
   /// class does not implement any interfaces.
   ClassTypeAlias classTypeAlias(
       Comment? comment,
@@ -151,6 +154,7 @@
       TypeParameterList? typeParameters,
       Token equals,
       Token? abstractKeyword,
+      Token? macroKeyword,
       NamedType superclass,
       WithClause withClause,
       ImplementsClause? implementsClause,
@@ -301,6 +305,7 @@
   /// [comment] and [metadata] can be `null` if the declaration does not have
   /// the corresponding attribute. The list of [constants] must contain at least
   /// one value.
+  @Deprecated('Use enumDeclaration2() instead')
   EnumDeclaration enumDeclaration(
       Comment? comment,
       List<Annotation>? metadata,
@@ -310,6 +315,24 @@
       List<EnumConstantDeclaration> constants,
       Token rightBracket);
 
+  /// Returns a newly created enumeration declaration. Either or both of the
+  /// [comment] and [metadata] can be `null` if the declaration does not have
+  /// the corresponding attribute. The list of [constants] must contain at least
+  /// one value.
+  EnumDeclaration enumDeclaration2({
+    required Comment? comment,
+    required List<Annotation>? metadata,
+    required Token enumKeyword,
+    required SimpleIdentifier name,
+    required TypeParameterList? typeParameters,
+    required WithClause? withClause,
+    required ImplementsClause? implementsClause,
+    required Token leftBracket,
+    required List<EnumConstantDeclaration> constants,
+    required List<ClassMember> members,
+    required Token rightBracket,
+  });
+
   /// Returns a newly created export directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the directive does not have the
   /// corresponding attribute. The list of [combinators] can be `null` if there
@@ -872,6 +895,26 @@
   /// Returns a newly created super expression.
   SuperExpression superExpression(Token superKeyword);
 
+  /// Returns a newly created super-initializer parameter. Either or both of
+  /// the [comment] and [metadata] can be `null` if the parameter does not have
+  /// the corresponding attribute. The [keyword] can be `null` if there is a
+  /// type. The [type] must be `null` if the keyword is 'var'. The [parameters]
+  /// can be `null` if this is not a function-typed super-initializer
+  /// parameter.
+  SuperFormalParameter superFormalParameter(
+      {Comment? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
+      Token? keyword,
+      TypeAnnotation? type,
+      required Token superKeyword,
+      required Token period,
+      required SimpleIdentifier identifier,
+      TypeParameterList? typeParameters,
+      FormalParameterList? parameters,
+      Token? question});
+
   /// Returns a newly created switch case. The list of [labels] can be `null`
   /// if there are no labels.
   SwitchCase switchCase(List<Label> labels, Token keyword,
@@ -929,13 +972,6 @@
   /// Returns a newly created type literal.
   TypeLiteral typeLiteral({required NamedType typeName});
 
-  /// Returns a newly created type name. The [typeArguments] can be `null` if
-  /// there are no type arguments. The [question] can be `null` if there is no
-  /// question mark.
-  @Deprecated('Use namedType() instead')
-  TypeName typeName(Identifier name, TypeArgumentList? typeArguments,
-      {Token? question});
-
   /// Returns a newly created type parameter. Either or both of the [comment]
   /// and [metadata] can be `null` if the parameter does not have the
   /// corresponding attribute. The [extendsKeyword] and [bound] can be `null` if
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 5d3dda9..a77a83e 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -453,8 +453,7 @@
   R? visitNamedExpression(NamedExpression node) => visitExpression(node);
 
   @override
-  // ignore: deprecated_member_use_from_same_package
-  R? visitNamedType(NamedType node) => visitTypeName(node as TypeName);
+  R? visitNamedType(NamedType node) => visitNode(node);
 
   R? visitNamespaceDirective(NamespaceDirective node) =>
       visitUriBasedDirective(node);
@@ -561,6 +560,10 @@
   R? visitSuperExpression(SuperExpression node) => visitExpression(node);
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) =>
+      visitNormalFormalParameter(node);
+
+  @override
   R? visitSwitchCase(SwitchCase node) => visitSwitchMember(node);
 
   @override
@@ -599,10 +602,6 @@
   @override
   R? visitTypeLiteral(TypeLiteral node) => visitExpression(node);
 
-  @Deprecated('Override visitNamedType instead')
-  @override
-  R? visitTypeName(TypeName node) => visitNode(node);
-
   @override
   R? visitTypeParameter(TypeParameter node) => visitNode(node);
 
@@ -1147,8 +1146,8 @@
 
   @override
   R? visitNamedType(NamedType node) {
-    // ignore: deprecated_member_use_from_same_package
-    return visitTypeName(node as TypeName);
+    node.visitChildren(this);
+    return null;
   }
 
   @override
@@ -1309,6 +1308,12 @@
   }
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R? visitSwitchCase(SwitchCase node) {
     node.visitChildren(this);
     return null;
@@ -1368,13 +1373,6 @@
     return null;
   }
 
-  @Deprecated('Override visitNamedType instead')
-  @override
-  R? visitTypeName(TypeName node) {
-    node.visitChildren(this);
-    return null;
-  }
-
   @override
   R? visitTypeParameter(TypeParameter node) {
     node.visitChildren(this);
@@ -1687,8 +1685,7 @@
   R? visitNamedExpression(NamedExpression node) => null;
 
   @override
-  // ignore: deprecated_member_use_from_same_package
-  R? visitNamedType(NamedType node) => visitTypeName(node as TypeName);
+  R? visitNamedType(NamedType node) => null;
 
   @override
   R? visitNativeClause(NativeClause node) => null;
@@ -1771,6 +1768,9 @@
   R? visitSuperExpression(SuperExpression node) => null;
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) => null;
+
+  @override
   R? visitSwitchCase(SwitchCase node) => null;
 
   @override
@@ -1800,10 +1800,6 @@
   @override
   R? visitTypeLiteral(TypeLiteral node) => null;
 
-  @Deprecated('Override visitNamedType instead')
-  @override
-  R? visitTypeName(TypeName node) => null;
-
   @override
   R? visitTypeParameter(TypeParameter node) => null;
 
@@ -2099,8 +2095,7 @@
   R? visitNamedExpression(NamedExpression node) => _throw(node);
 
   @override
-  // ignore: deprecated_member_use_from_same_package
-  R? visitNamedType(NamedType node) => visitTypeName(node as TypeName);
+  R? visitNamedType(NamedType node) => _throw(node);
 
   @override
   R? visitNativeClause(NativeClause node) => _throw(node);
@@ -2184,6 +2179,9 @@
   R? visitSuperExpression(SuperExpression node) => _throw(node);
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) => _throw(node);
+
+  @override
   R? visitSwitchCase(SwitchCase node) => _throw(node);
 
   @override
@@ -2214,10 +2212,6 @@
   @override
   R? visitTypeLiteral(TypeLiteral node) => _throw(node);
 
-  @Deprecated('Override visitNamedType instead')
-  @override
-  R? visitTypeName(TypeName node) => _throw(node);
-
   @override
   R? visitTypeParameter(TypeParameter node) => _throw(node);
 
@@ -3145,6 +3139,14 @@
   }
 
   @override
+  T? visitSuperFormalParameter(SuperFormalParameter node) {
+    stopwatch.start();
+    T? result = _baseVisitor.visitSuperFormalParameter(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T? visitSwitchCase(SwitchCase node) {
     stopwatch.start();
     T? result = _baseVisitor.visitSwitchCase(node);
@@ -3224,15 +3226,6 @@
     return result;
   }
 
-  @Deprecated('Override visitNamedType instead')
-  @override
-  T? visitTypeName(TypeName node) {
-    stopwatch.start();
-    T? result = _baseVisitor.visitTypeName(node);
-    stopwatch.stop();
-    return result;
-  }
-
   @override
   T? visitTypeParameter(TypeParameter node) {
     stopwatch.start();
@@ -3577,8 +3570,7 @@
   R? visitNamedExpression(NamedExpression node) => visitNode(node);
 
   @override
-  // ignore: deprecated_member_use_from_same_package
-  R? visitNamedType(NamedType node) => visitTypeName(node as TypeName);
+  R? visitNamedType(NamedType node) => visitNode(node);
 
   @override
   R? visitNativeClause(NativeClause node) => visitNode(node);
@@ -3668,6 +3660,9 @@
   R? visitSuperExpression(SuperExpression node) => visitNode(node);
 
   @override
+  R? visitSuperFormalParameter(SuperFormalParameter node) => visitNode(node);
+
+  @override
   R? visitSwitchCase(SwitchCase node) => visitNode(node);
 
   @override
@@ -3698,10 +3693,6 @@
   @override
   R? visitTypeLiteral(TypeLiteral node) => visitNode(node);
 
-  @Deprecated('Override visitNamedType instead')
-  @override
-  R? visitTypeName(TypeName node) => visitNode(node);
-
   @override
   R? visitTypeParameter(TypeParameter node) => visitNode(node);
 
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 11b9950..400e918 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -46,7 +46,6 @@
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart' show Namespace;
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/task/api/model.dart' show AnalysisTarget;
@@ -727,7 +726,9 @@
   /// 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.
-  E? thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate);
+  E? thisOrAncestorMatching<E extends Element>(
+    bool Function(Element) predicate,
+  );
 
   /// Return either this element or the most immediate ancestor of this element
   /// that has the given type, or `null` if there is no such element.
@@ -1049,6 +1050,8 @@
 
   R? visitPropertyAccessorElement(PropertyAccessorElement element);
 
+  R? visitSuperFormalParameterElement(SuperFormalParameterElement element);
+
   R? visitTopLevelVariableElement(TopLevelVariableElement element);
 
   R? visitTypeAliasElement(TypeAliasElement element);
@@ -1574,6 +1577,9 @@
   /// parameter.
   bool get isRequiredPositional;
 
+  /// Return `true` if this parameter is a super formal parameter.
+  bool get isSuperFormal;
+
   @override
   String get name;
 
@@ -1730,6 +1736,19 @@
   List<String> get shownNames;
 }
 
+/// A super formal parameter defined within a constructor element.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class SuperFormalParameterElement implements ParameterElement {
+  /// The associated super-constructor parameter, from the super-constructor
+  /// that is referenced by the implicit or explicit super-constructor
+  /// invocation.
+  ///
+  /// Can be `null` for erroneous code - not existing super-constructor,
+  /// no corresponding parameter in the super-constructor.
+  ParameterElement? get superConstructorParameter;
+}
+
 /// A top-level variable.
 ///
 /// Clients may not extend, implement or mix-in this class.
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 2ff16e0..e3f102e 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -22,7 +22,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
-import 'package:analyzer/src/dart/element/type.dart' show InterfaceTypeImpl;
 
 /// The type associated with elements in the element model.
 ///
@@ -33,16 +32,6 @@
   /// Otherwise return `null`.
   InstantiatedTypeAliasElement? get alias;
 
-  /// If this type is an instantiation of a type alias, return the type
-  /// arguments used for the instantiation. Otherwise return `null`.
-  @Deprecated('Use alias instead')
-  List<DartType>? get aliasArguments;
-
-  /// If this type is an instantiation of a type alias, return it.
-  /// Otherwise return `null`.
-  @Deprecated('Use alias instead')
-  TypeAliasElement? get aliasElement;
-
   /// Return the name of this type as it should appear when presented to users
   /// in contexts such as error messages.
   ///
@@ -68,6 +57,10 @@
   /// the dart:async library.
   bool get isDartAsyncFutureOr;
 
+  /// Return `true` if this type represents the type 'Stream' defined in the
+  /// dart:async library.
+  bool get isDartAsyncStream;
+
   /// Return `true` if this type represents the type 'bool' defined in the
   /// dart:core library.
   bool get isDartCoreBool;
@@ -337,23 +330,6 @@
   /// </blockquote>
   ConstructorElement? lookUpConstructor(String? name, LibraryElement library);
 
-  /// Return the element representing the getter that results from looking up
-  /// the getter with the given [name] in this class with respect to the given
-  /// [library], or `null` if the look up fails. The behavior of this method is
-  /// defined by the Dart Language Specification in section 12.15.1:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is:
-  /// * If <i>C</i> declares an instance getter (respectively setter) named
-  ///   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
-  ///   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
-  ///   superclass <i>S</i>, then the result of the lookup is the result of
-  ///   looking up getter (respectively setter) <i>m</i> in <i>S</i> with
-  ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
-  /// </blockquote>
-  @Deprecated('Use lookupGetter2 instead')
-  PropertyAccessorElement? lookUpGetter(String name, LibraryElement library);
-
   /// Return the getter with the given [name].
   ///
   /// If [concrete] is `true`, then the concrete implementation is returned,
@@ -372,93 +348,6 @@
     bool recoveryStatic = false,
   });
 
-  /// Return the element representing the getter that results from looking up
-  /// the getter with the given [name] in the superclass of this class with
-  /// respect to the given [library], or `null` if the look up fails. The
-  /// behavior of this method is defined by the Dart Language Specification in
-  /// section 12.15.1:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is:
-  /// * If <i>C</i> declares an instance getter (respectively setter) named
-  ///   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
-  ///   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
-  ///   superclass <i>S</i>, then the result of the lookup is the result of
-  ///   looking up getter (respectively setter) <i>m</i> in <i>S</i> with
-  ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
-  /// </blockquote>
-  @Deprecated('Use lookupGetter2 instead')
-  PropertyAccessorElement? lookUpGetterInSuperclass(
-      String name, LibraryElement? library);
-
-  /// Look up the member with the given [name] in this type and all extended
-  /// and mixed in classes, and by default including [thisType]. If the search
-  /// fails, this will then search interfaces.
-  ///
-  /// Return the element representing the member that was found, or `null` if
-  /// there is no getter with the given name.
-  ///
-  /// The [library] determines if a private member name is visible, and does not
-  /// need to be supplied for public names.
-  @Deprecated('Use lookupGetter2 instead')
-  PropertyAccessorElement? lookUpInheritedGetter(String name,
-      {LibraryElement? library, bool thisType = true});
-
-  /// Look up the member with the given [name] in this type and all extended
-  /// and mixed in classes, starting from this type. If the search fails,
-  /// search interfaces.
-  ///
-  /// Return the element representing the member that was found, or `null` if
-  /// there is no getter with the given name.
-  ///
-  /// The [library] determines if a private member name is visible, and does not
-  /// need to be supplied for public names.
-  @Deprecated('Use lookupGetter2 and/or lookupMethod2 instead')
-  ExecutableElement? lookUpInheritedGetterOrMethod(String name,
-      {LibraryElement? library});
-
-  /// Look up the member with the given [name] in this type and all extended
-  /// and mixed in classes, and by default including [thisType]. If the search
-  /// fails, this will then search interfaces.
-  ///
-  /// Return the element representing the member that was found, or `null` if
-  /// there is no getter with the given name.
-  ///
-  /// The [library] determines if a private member name is visible, and does not
-  /// need to be supplied for public names.
-  @Deprecated('Use lookupMethod2 instead')
-  MethodElement? lookUpInheritedMethod(String name,
-      {LibraryElement? library, bool thisType = true});
-
-  /// Look up the member with the given [name] in this type and all extended
-  /// and mixed in classes, and by default including [thisType]. If the search
-  /// fails, this will then search interfaces.
-  ///
-  /// Return the element representing the member that was found, or `null` if
-  /// there is no getter with the given name.
-  ///
-  /// The [library] determines if a private member name is visible, and does not
-  /// need to be supplied for public names.
-  @Deprecated('Use lookupSetter2 instead')
-  PropertyAccessorElement? lookUpInheritedSetter(String name,
-      {LibraryElement? library, bool thisType = true});
-
-  /// Return the element representing the method that results from looking up
-  /// the method with the given [name] in this class with respect to the given
-  /// [library], or `null` if the look up fails. The behavior of this method is
-  /// defined by the Dart Language Specification in section 12.15.1:
-  /// <blockquote>
-  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
-  /// library <i>L</i> is:
-  /// * If <i>C</i> declares an instance method named <i>m</i> that is
-  ///   accessible to <i>L</i>, then that method is the result of the lookup.
-  ///   Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the
-  ///   lookup is the result of looking up method <i>m</i> in <i>S</i> with
-  ///   respect to <i>L</i> Otherwise, we say that the lookup has failed.
-  /// </blockquote>
-  @Deprecated('Use lookupMethod2 instead')
-  MethodElement? lookUpMethod(String name, LibraryElement library);
-
   /// Return the method with the given [name].
   ///
   /// If [concrete] is `true`, then the concrete implementation is returned,
@@ -477,41 +366,6 @@
     bool recoveryStatic = false,
   });
 
-  /// Return the element representing the method that results from looking up
-  /// the method with the given [name] in the superclass of this class with
-  /// respect to the given [library], or `null` if the look up fails. The
-  /// behavior of this method is defined by the Dart Language Specification in
-  /// section 12.15.1:
-  /// <blockquote>
-  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
-  /// library <i>L</i> is:
-  /// * If <i>C</i> declares an instance method named <i>m</i> that is
-  ///   accessible to <i>L</i>, then that method is the result of the lookup.
-  ///   Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the
-  /// * lookup is the result of looking up method <i>m</i> in <i>S</i> with
-  ///   respect to <i>L</i>.
-  /// * Otherwise, we say that the lookup has failed.
-  /// </blockquote>
-  @Deprecated('Use lookupMethod2 instead')
-  MethodElement? lookUpMethodInSuperclass(String name, LibraryElement library);
-
-  /// Return the element representing the setter that results from looking up
-  /// the setter with the given [name] in this class with respect to the given
-  /// [library], or `null` if the look up fails. The behavior of this method is
-  /// defined by the Dart Language Specification in section 12.16:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is:
-  /// * If <i>C</i> declares an instance getter (respectively setter) named
-  ///   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
-  ///   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
-  ///   superclass <i>S</i>, then the result of the lookup is the result of
-  ///   looking up getter (respectively setter) <i>m</i> in <i>S</i> with
-  ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
-  /// </blockquote>
-  @Deprecated('Use lookupSetter2 instead')
-  PropertyAccessorElement? lookUpSetter(String name, LibraryElement library);
-
   /// Return the setter with the given [name].
   ///
   /// If [concrete] is `true`, then the concrete implementation is returned,
@@ -529,36 +383,6 @@
     bool inherited = false,
     bool recoveryStatic = false,
   });
-
-  /// Return the element representing the setter that results from looking up
-  /// the setter with the given [name] in the superclass of this class with
-  /// respect to the given [library], or `null` if the look up fails. The
-  /// behavior of this method is defined by the Dart Language Specification in
-  /// section 12.16:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is:
-  /// * If <i>C</i> declares an instance getter (respectively setter) named
-  ///   <i>m</i> that is accessible to <i>L</i>, then that getter (respectively
-  ///   setter) is the result of the lookup. Otherwise, if <i>C</i> has a
-  ///   superclass <i>S</i>, then the result of the lookup is the result of
-  ///   looking up getter (respectively setter) <i>m</i> in <i>S</i> with
-  ///   respect to <i>L</i>. Otherwise, we say that the lookup has failed.
-  /// </blockquote>
-  @Deprecated('Use lookupSetter2 instead')
-  PropertyAccessorElement? lookUpSetterInSuperclass(
-      String name, LibraryElement library);
-
-  /// Returns a "smart" version of the "least upper bound" of the given types.
-  ///
-  /// If these types have the same element and differ only in terms of the type
-  /// arguments, attempts to find a compatible set of type arguments.
-  ///
-  /// Otherwise, returns the same result as [DartType.getLeastUpperBound].
-  @Deprecated('Use TypeSystem.leastUpperBound instead')
-  static InterfaceType getSmartLeastUpperBound(
-          InterfaceType first, InterfaceType second) =>
-      InterfaceTypeImpl.getSmartLeastUpperBound(first, second);
 }
 
 /// The type `Never` represents the uninhabited bottom type.
diff --git a/pkg/analyzer/lib/dart/element/type_provider.dart b/pkg/analyzer/lib/dart/element/type_provider.dart
index 752df98..e75d460 100644
--- a/pkg/analyzer/lib/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/dart/element/type_provider.dart
@@ -84,11 +84,6 @@
   /// Return the type representing the built-in type `Never`.
   DartType get neverType;
 
-  /// Return a list containing all of the types that cannot be either extended
-  /// or implemented.
-  @Deprecated('Use isNonSubtypableClass instead')
-  Set<ClassElement> get nonSubtypableClasses;
-
   /// Return the element representing the built-in class `Null`.
   ClassElement get nullElement;
 
@@ -138,20 +133,10 @@
   /// given [valueType]. The type has the nullability suffix of this provider.
   InterfaceType futureOrType(DartType valueType);
 
-  /// Return the instantiation of the built-in class `FutureOr` with the
-  /// given [valueType]. The type has the nullability suffix of this provider.
-  @Deprecated('Use futureOrType instead')
-  InterfaceType futureOrType2(DartType valueType);
-
   /// Return the instantiation of the built-in class `Future` with the
   /// given [valueType]. The type has the nullability suffix of this provider.
   InterfaceType futureType(DartType valueType);
 
-  /// Return the instantiation of the built-in class `Future` with the
-  /// given [valueType]. The type has the nullability suffix of this provider.
-  @Deprecated('Use futureType instead')
-  InterfaceType futureType2(DartType valueType);
-
   /// Return `true` if [element] cannot be extended, implemented, or mixed in.
   bool isNonSubtypableClass(ClassElement element);
 
@@ -169,46 +154,20 @@
   /// given [elementType]. The type has the nullability suffix of this provider.
   InterfaceType iterableType(DartType elementType);
 
-  /// Return the instantiation of the built-in class `Iterable` with the
-  /// given [elementType]. The type has the nullability suffix of this provider.
-  @Deprecated('Use iterableType instead')
-  InterfaceType iterableType2(DartType elementType);
-
   /// Return the instantiation of the built-in class `List` with the
   /// given [elementType]. The type has the nullability suffix of this provider.
   InterfaceType listType(DartType elementType);
 
   /// Return the instantiation of the built-in class `List` with the
-  /// given [elementType]. The type has the nullability suffix of this provider.
-  @Deprecated('Use listType instead')
-  InterfaceType listType2(DartType elementType);
-
-  /// Return the instantiation of the built-in class `List` with the
   /// given [keyType] and [valueType]. The type has the nullability suffix of
   /// this provider.
   InterfaceType mapType(DartType keyType, DartType valueType);
 
-  /// Return the instantiation of the built-in class `List` with the
-  /// given [keyType] and [valueType]. The type has the nullability suffix of
-  /// this provider.
-  @Deprecated('Use mapType instead')
-  InterfaceType mapType2(DartType keyType, DartType valueType);
-
   /// Return the instantiation of the built-in class `Set` with the
   /// given [elementType]. The type has the nullability suffix of this provider.
   InterfaceType setType(DartType elementType);
 
-  /// Return the instantiation of the built-in class `Set` with the
-  /// given [elementType]. The type has the nullability suffix of this provider.
-  @Deprecated('Use setType instead')
-  InterfaceType setType2(DartType elementType);
-
   /// Return the instantiation of the built-in class `Stream` with the
   /// given [elementType]. The type has the nullability suffix of this provider.
   InterfaceType streamType(DartType elementType);
-
-  /// Return the instantiation of the built-in class `Stream` with the
-  /// given [elementType]. The type has the nullability suffix of this provider.
-  @Deprecated('Use streamType instead')
-  InterfaceType streamType2(DartType elementType);
 }
diff --git a/pkg/analyzer/lib/dart/element/visitor.dart b/pkg/analyzer/lib/dart/element/visitor.dart
index 0654527..aede2b6 100644
--- a/pkg/analyzer/lib/dart/element/visitor.dart
+++ b/pkg/analyzer/lib/dart/element/visitor.dart
@@ -169,6 +169,10 @@
       visitVariableElement(element);
 
   @override
+  R? visitSuperFormalParameterElement(SuperFormalParameterElement element) =>
+      visitParameterElement(element);
+
+  @override
   R? visitTopLevelVariableElement(TopLevelVariableElement element) =>
       visitPropertyInducingElement(element);
 
@@ -306,6 +310,12 @@
   }
 
   @override
+  R? visitSuperFormalParameterElement(SuperFormalParameterElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
   R? visitTopLevelVariableElement(TopLevelVariableElement element) {
     element.visitChildren(this);
     return null;
@@ -391,6 +401,10 @@
   R? visitPropertyAccessorElement(PropertyAccessorElement element) => null;
 
   @override
+  R? visitSuperFormalParameterElement(SuperFormalParameterElement element) =>
+      null;
+
+  @override
   R? visitTopLevelVariableElement(TopLevelVariableElement element) => null;
 
   @override
@@ -471,6 +485,10 @@
       _throw(element);
 
   @override
+  R? visitSuperFormalParameterElement(SuperFormalParameterElement element) =>
+      _throw(element);
+
+  @override
   R? visitTopLevelVariableElement(TopLevelVariableElement element) =>
       _throw(element);
 
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 0bc425e..25895fe 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -256,7 +256,6 @@
   CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
   CompileTimeErrorCode.INVALID_OVERRIDE,
   CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
-  CompileTimeErrorCode.INVALID_SUPER_INVOCATION,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET,
@@ -407,6 +406,7 @@
   CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT,
   CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
   CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT,
+  CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST,
   CompileTimeErrorCode.SWITCH_CASE_COMPLETES_NORMALLY,
   CompileTimeErrorCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
   CompileTimeErrorCode.TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS,
@@ -475,7 +475,12 @@
   CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION,
   CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR,
   CompileTimeErrorCode.YIELD_IN_NON_GENERATOR,
+  CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE,
   CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
+  FfiCode.ABI_SPECIFIC_INTEGER_INVALID,
+  FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA,
+  FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING,
+  FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED,
   FfiCode.ANNOTATION_ON_POINTER_FIELD,
   FfiCode.ARGUMENT_MUST_BE_A_CONSTANT,
   FfiCode.CREATION_OF_STRUCT_OR_UNION,
@@ -518,6 +523,7 @@
   FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH,
   HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER,
   HintCode.ASSIGNMENT_OF_DO_NOT_STORE,
+  HintCode.BODY_MIGHT_COMPLETE_NORMALLY_NULLABLE,
   HintCode.CAN_BE_NULL_AFTER_NULL_AWARE,
   HintCode.DEAD_CODE,
   HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH,
@@ -1020,21 +1026,6 @@
         url: null);
   }
 
-  /// Initialize a newly created analysis error. The error is associated with
-  /// the given [source] and is located at the given [offset] with the given
-  /// [length]. The error will have the given [errorCode] and the map  of
-  /// [arguments] will be used to complete the message and correction. If any
-  /// [contextMessages] are provided, they will be recorded with the error.
-  ///
-  /// Deprecated - no analyzer errors use named arguments anymore.  Please use
-  /// `AnalysisError()`.
-  @deprecated
-  AnalysisError.withNamedArguments(Source source, int offset, int length,
-      ErrorCode errorCode, Map<String, dynamic> arguments,
-      {List<DiagnosticMessage> contextMessages = const []})
-      : this(source, offset, length, errorCode,
-            _translateNamedArguments(arguments), contextMessages);
-
   @override
   List<DiagnosticMessage> get contextMessages => _contextMessages;
 
@@ -1133,21 +1124,4 @@
     }
     return errors.toList();
   }
-
-  static List<Object?>? _translateNamedArguments(
-      Map<String, dynamic> arguments) {
-    // All analyzer errors now use positional arguments, so if this method is
-    // being called, either no arguments were provided to the
-    // AnalysisError.withNamedArguments constructor, or the client was
-    // developed against an older version of the analyzer that used named
-    // arguments.  In either case, we'll make a best effort translation of named
-    // arguments to positional ones.  In the case where some arguments were
-    // provided, we have an assertion to alert the developer that they may not
-    // get correct results.
-    assert(
-        arguments.isEmpty,
-        'AnalysisError.withNamedArguments is no longer supported.  Making a '
-        'best effort translation to positional arguments.  Please use '
-        'AnalysisError() instead.');
-  }
 }
diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart
index ba45f03..807499c 100644
--- a/pkg/analyzer/lib/error/listener.dart
+++ b/pkg/analyzer/lib/error/listener.dart
@@ -4,7 +4,6 @@
 
 import 'dart:collection';
 
-import 'package:_fe_analyzer_shared/src/messages/codes.dart' show Message;
 import 'package:analyzer/dart/ast/ast.dart'
     show AstNode, ConstructorDeclaration;
 import 'package:analyzer/dart/ast/token.dart';
@@ -125,19 +124,6 @@
         errorCode, token.offset, token.length, arguments, messages);
   }
 
-  /// Report an error with the given [errorCode] and [message]. The location of
-  /// the error is specified by the given [offset] and [length].
-  ///
-  /// Deprecated - the [Message] type assumes named arguments, and no analyzer
-  /// errors use named arguments anymore.  Please use other methods of
-  /// [ErrorReporter].
-  @deprecated
-  void reportErrorMessage(
-      ErrorCode errorCode, int offset, int length, Message message) {
-    _errorListener.onError(AnalysisError.withNamedArguments(
-        _source, offset, length, errorCode, message.arguments));
-  }
-
   /// Report an error with the given [errorCode] and [arguments]. The [node] is
   /// used to compute the location of the error. The arguments are expected to
   /// contain two or more types. Convert the types into strings by using the
@@ -165,6 +151,12 @@
         arguments[i] = argument.getDisplayString(
           withNullability: isNonNullableByDefault,
         );
+      } else if (!(argument is String ||
+          argument is DartType ||
+          argument is int ||
+          argument is Uri)) {
+        throw ArgumentError(
+            'Tried to format an error using ${argument.runtimeType}');
       }
     }
   }
diff --git a/pkg/analyzer/lib/file_system/file_system.dart b/pkg/analyzer/lib/file_system/file_system.dart
index 52bb3d7..0a2bd5d 100644
--- a/pkg/analyzer/lib/file_system/file_system.dart
+++ b/pkg/analyzer/lib/file_system/file_system.dart
@@ -127,11 +127,6 @@
   /// Return `true` if this resource exists.
   bool get exists;
 
-  /// Return the [Folder] that contains this resource, or `null` if this
-  /// resource is a root folder.
-  @Deprecated('Use parent2 instead')
-  Folder? get parent;
-
   /// Return the [Folder] that contains this resource, possibly itself if this
   /// resource is a root folder.
   Folder get parent2;
@@ -196,13 +191,6 @@
   /// A folder may or may not exist at this location.
   Folder getFolder(String path);
 
-  /// Complete with a list of modification times for the given [sources].
-  ///
-  /// If the file of a source is not managed by this provider, return `null`.
-  /// If the file a source does not exist, return `-1`.
-  @Deprecated('Not used by clients')
-  Future<List<int?>> getModificationTimes(List<Source> sources);
-
   /// Return the [Resource] that corresponds to the given [path].
   ///
   /// The [path] must be absolute and normalized.
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index f6d3b10..21ffb07 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -7,7 +7,7 @@
 import 'dart:typed_data';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:watcher/watcher.dart';
@@ -22,8 +22,7 @@
 
   final pathos.Context _pathContext;
 
-  MemoryResourceProvider(
-      {pathos.Context? context, @deprecated bool isWindows = false})
+  MemoryResourceProvider({pathos.Context? context})
       : _pathContext = context ??= pathos.style == pathos.Style.windows
             // On Windows, ensure that the current drive matches
             // the drive inserted by MemoryResourceProvider.convertPath
@@ -106,20 +105,6 @@
     return _MemoryFolder(this, path);
   }
 
-  @Deprecated('Not used by clients')
-  @override
-  Future<List<int>> getModificationTimes(List<Source> sources) async {
-    return sources.map((source) {
-      String path = source.fullName;
-      var file = getFile(path);
-      try {
-        return file.modificationStamp;
-      } on FileSystemException {
-        return -1;
-      }
-    }).toList();
-  }
-
   @override
   Resource getResource(String path) {
     _ensureAbsoluteAndNormalized(path);
@@ -148,17 +133,6 @@
     _notifyWatchers(path, ChangeType.MODIFY);
   }
 
-  /// Create a resource representing a dummy link (that is, a File object which
-  /// appears in its parent directory, but whose `exists` property is false)
-  @Deprecated('Not used by clients')
-  File newDummyLink(String path) {
-    _ensureAbsoluteAndNormalized(path);
-    newFolder(pathContext.dirname(path));
-    _MemoryDummyLink link = _MemoryDummyLink(this, path);
-    _notifyWatchers(path, ChangeType.ADD);
-    return link;
-  }
-
   File newFile(
     String path,
     String content, [
@@ -202,18 +176,6 @@
     _pathToLinkedPath[path] = target;
   }
 
-  @Deprecated('Not used by clients')
-  File updateFile(String path, String content, [int? stamp]) {
-    _ensureAbsoluteAndNormalized(path);
-    newFolder(pathContext.dirname(path));
-    _pathToData[path] = _FileData(
-      bytes: utf8.encode(content) as Uint8List,
-      timeStamp: stamp ?? nextStamp++,
-    );
-    _notifyWatchers(path, ChangeType.MODIFY);
-    return _MemoryFile(this, path);
-  }
-
   /// Write a representation of the file system on the given [sink].
   void writeOn(StringSink sink) {
     List<String> paths = _pathToData.keys.toList();
@@ -360,81 +322,6 @@
   final List<String> childNames = [];
 }
 
-/// An in-memory implementation of [File] which acts like a symbolic link to a
-/// non-existent file.
-class _MemoryDummyLink extends _MemoryResource implements File {
-  _MemoryDummyLink(MemoryResourceProvider provider, String path)
-      : super(provider, path);
-
-  @override
-  Stream<WatchEvent> get changes {
-    throw FileSystemException(path, "File does not exist");
-  }
-
-  @override
-  bool get exists => false;
-
-  @override
-  int get lengthSync {
-    throw FileSystemException(path, 'File could not be read');
-  }
-
-  @override
-  int get modificationStamp {
-    throw FileSystemException(path, "File does not exist");
-  }
-
-  @override
-  File copyTo(Folder parentFolder) {
-    throw FileSystemException(path, 'File could not be copied');
-  }
-
-  @override
-  Source createSource([Uri? uri]) {
-    throw FileSystemException(path, 'File could not be read');
-  }
-
-  @override
-  void delete() {
-    throw FileSystemException(path, 'File could not be deleted');
-  }
-
-  @override
-  bool isOrContains(String path) {
-    return path == this.path;
-  }
-
-  @override
-  Uint8List readAsBytesSync() {
-    throw FileSystemException(path, 'File could not be read');
-  }
-
-  @override
-  String readAsStringSync() {
-    throw FileSystemException(path, 'File could not be read');
-  }
-
-  @override
-  File renameSync(String newPath) {
-    throw FileSystemException(path, 'File could not be renamed');
-  }
-
-  @override
-  File resolveSymbolicLinksSync() {
-    return throw FileSystemException(path, "File does not exist");
-  }
-
-  @override
-  void writeAsBytesSync(List<int> bytes) {
-    throw FileSystemException(path, 'File could not be written');
-  }
-
-  @override
-  void writeAsStringSync(String content) {
-    throw FileSystemException(path, 'File could not be written');
-  }
-}
-
 /// An in-memory implementation of [File].
 class _MemoryFile extends _MemoryResource implements File {
   _MemoryFile(MemoryResourceProvider provider, String path)
@@ -699,16 +586,6 @@
   @override
   int get hashCode => path.hashCode;
 
-  @Deprecated('Use parent2 instead')
-  @override
-  Folder? get parent {
-    String parentPath = provider.pathContext.dirname(path);
-    if (parentPath == path) {
-      return null;
-    }
-    return provider.getFolder(parentPath);
-  }
-
   @override
   Folder get parent2 {
     String parentPath = provider.pathContext.dirname(path);
diff --git a/pkg/analyzer/lib/file_system/overlay_file_system.dart b/pkg/analyzer/lib/file_system/overlay_file_system.dart
index dbac07b..00d6da8 100644
--- a/pkg/analyzer/lib/file_system/overlay_file_system.dart
+++ b/pkg/analyzer/lib/file_system/overlay_file_system.dart
@@ -6,7 +6,7 @@
 import 'dart:typed_data';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:watcher/watcher.dart';
@@ -40,16 +40,6 @@
   Folder getFolder(String path) =>
       _OverlayFolder(this, baseProvider.getFolder(path));
 
-  @Deprecated('Not used by clients')
-  @override
-  Future<List<int>> getModificationTimes(List<Source> sources) async {
-    return sources.map((source) {
-      String path = source.fullName;
-      return _overlays[path]?.modificationStamp ??
-          baseProvider.getFile(path).modificationStamp;
-    }).toList();
-  }
-
   @override
   Resource getResource(String path) {
     if (hasOverlay(path)) {
@@ -354,16 +344,6 @@
   @override
   int get hashCode => path.hashCode;
 
-  @Deprecated('Use parent2 instead')
-  @override
-  Folder? get parent {
-    Folder? parent = _resource.parent;
-    if (parent == null) {
-      return null;
-    }
-    return _OverlayFolder(provider, parent);
-  }
-
   @override
   Folder get parent2 {
     var parent = _resource.parent2;
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index 9824499..bc4791d 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -6,7 +6,7 @@
 import 'dart:typed_data';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:path/path.dart';
 import 'package:watcher/watcher.dart';
@@ -32,27 +32,6 @@
       : null;
 }
 
-/// Return modification times for every file path in [paths].
-///
-/// If a path is `null`, the modification time is also `null`.
-///
-/// If any exception happens, the file is considered as a not existing and
-/// `-1` is its modification time.
-List<int?> _pathsToTimes(List<String?> paths) {
-  return paths.map((path) {
-    if (path != null) {
-      try {
-        io.File file = io.File(path);
-        return file.lastModifiedSync().millisecondsSinceEpoch;
-      } catch (_) {
-        return -1;
-      }
-    } else {
-      return null;
-    }
-  }).toList();
-}
-
 /// A `dart:io` based implementation of [ResourceProvider].
 class PhysicalResourceProvider implements ResourceProvider {
   static final PhysicalResourceProvider INSTANCE = PhysicalResourceProvider();
@@ -78,13 +57,6 @@
     return _PhysicalFolder(io.Directory(path));
   }
 
-  @Deprecated('Not used by clients')
-  @override
-  Future<List<int?>> getModificationTimes(List<Source> sources) async {
-    List<String> paths = sources.map((source) => source.fullName).toList();
-    return _pathsToTimes(paths);
-  }
-
   @override
   Resource getResource(String path) {
     _ensureAbsoluteAndNormalized(path);
@@ -356,16 +328,6 @@
   @override
   int get hashCode => path.hashCode;
 
-  @Deprecated('Use parent2 instead')
-  @override
-  Folder? get parent {
-    String parentPath = pathContext.dirname(path);
-    if (parentPath == path) {
-      return null;
-    }
-    return _PhysicalFolder(io.Directory(parentPath));
-  }
-
   @override
   Folder get parent2 {
     String parentPath = pathContext.dirname(path);
diff --git a/pkg/analyzer/lib/source/line_info.dart b/pkg/analyzer/lib/source/line_info.dart
index 1867017..41ce1ac 100644
--- a/pkg/analyzer/lib/source/line_info.dart
+++ b/pkg/analyzer/lib/source/line_info.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/generated/java_engine.dart';
-
 /// The location of a character represented as a line and column pair.
 class CharacterLocation {
   /// The one-based index of the line containing the character.
@@ -17,6 +15,12 @@
   CharacterLocation(this.lineNumber, this.columnNumber);
 
   @override
+  bool operator ==(Object object) =>
+      object is CharacterLocation &&
+      lineNumber == object.lineNumber &&
+      columnNumber == object.columnNumber;
+
+  @override
   String toString() => '$lineNumber:$columnNumber';
 }
 
@@ -39,9 +43,32 @@
   }
 
   /// Initialize a newly created set of line information corresponding to the
-  /// given file [content].
-  factory LineInfo.fromContent(String content) =>
-      LineInfo(StringUtilities.computeLineStarts(content));
+  /// given file [content]. Lines end with `\r`, `\n` or `\r\n`.
+  factory LineInfo.fromContent(String content) {
+    const slashN = 0x0A;
+    const slashR = 0x0D;
+
+    var lineStarts = <int>[0];
+    var length = content.length;
+    for (var i = 0; i < length; i++) {
+      var unit = content.codeUnitAt(i);
+      // Special-case \r\n.
+      if (unit == slashR) {
+        // Peek ahead to detect a following \n.
+        if (i + 1 < length && content.codeUnitAt(i + 1) == slashN) {
+          // Line start will get registered at next index at the \n.
+        } else {
+          lineStarts.add(i + 1);
+        }
+      }
+      // \n
+      if (unit == slashN) {
+        lineStarts.add(i + 1);
+      }
+    }
+
+    return LineInfo(lineStarts);
+  }
 
   /// The number of lines.
   int get lineCount => lineStarts.length;
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index efb2263..4269e6b 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -35,7 +35,7 @@
   /// Return the analysis options file from which options should be read, or
   /// `null` if there is no analysis options file for code in the given [root].
   ///
-  /// The given [root] directory will be searched first. If no file is found ,
+  /// The given [root] directory will be searched first. If no file is found,
   /// then enclosing directories will be searched.
   File? getOptionsFile(Folder root) {
     for (var current in root.withAncestors) {
@@ -44,6 +44,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Provide the options found in [file].
diff --git a/pkg/analyzer/lib/src/analysis_options/error/option_codes.g.dart b/pkg/analyzer/lib/src/analysis_options/error/option_codes.g.dart
index be84490..7690c44 100644
--- a/pkg/analyzer/lib/src/analysis_options/error/option_codes.g.dart
+++ b/pkg/analyzer/lib/src/analysis_options/error/option_codes.g.dart
@@ -193,7 +193,8 @@
     'SPEC_MODE_REMOVED',
     "The option 'strong-mode: false' is no longer supported.",
     correctionMessage:
-        "It's recommended to remove the 'strong-mode:' setting (and make your code Dart 2 compliant).",
+        "It's recommended to remove the 'strong-mode:' setting (and make your "
+        "code Dart 2 compliant).",
   );
 
   /**
@@ -235,7 +236,8 @@
   static const AnalysisOptionsWarningCode UNSUPPORTED_OPTION_WITH_LEGAL_VALUE =
       AnalysisOptionsWarningCode(
     'UNSUPPORTED_OPTION_WITH_LEGAL_VALUE',
-    "The option '{1}' isn't supported by '{0}'. Try using the only supported option: '{2}'.",
+    "The option '{1}' isn't supported by '{0}'. Try using the only supported "
+        "option: '{2}'.",
   );
 
   /**
diff --git a/pkg/analyzer/lib/src/clients/dart_style/rewrite_cascade.dart b/pkg/analyzer/lib/src/clients/dart_style/rewrite_cascade.dart
new file mode 100644
index 0000000..dc054a8
--- /dev/null
+++ b/pkg/analyzer/lib/src/clients/dart_style/rewrite_cascade.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/standard_ast_factory.dart';
+import 'package:analyzer/dart/ast/token.dart';
+
+/// Parenthesize the target of the [expressionStatement]'s expression (assumed
+/// to [cascadeExpression]) before removing the cascade.
+ExpressionStatement fixCascadeByParenthesizingTarget({
+  required ExpressionStatement expressionStatement,
+  required CascadeExpression cascadeExpression,
+}) {
+  assert(cascadeExpression.cascadeSections.length == 1);
+
+  var newTarget = astFactory.parenthesizedExpression(
+    Token(TokenType.OPEN_PAREN, 0)
+      ..previous = expressionStatement.beginToken.previous
+      ..next = cascadeExpression.target.beginToken,
+    cascadeExpression.target,
+    Token(TokenType.CLOSE_PAREN, 0)
+      ..previous = cascadeExpression.target.endToken
+      ..next = expressionStatement.semicolon,
+  );
+
+  return astFactory.expressionStatement(
+    astFactory.cascadeExpression(
+      newTarget,
+      cascadeExpression.cascadeSections,
+    ),
+    expressionStatement.semicolon,
+  );
+}
+
+/// Recursively insert [cascadeTarget] (the LHS of the cascade) into the
+/// LHS of the assignment expression that used to be the cascade's RHS.
+Expression insertCascadeTargetIntoExpression({
+  required Expression expression,
+  required Expression cascadeTarget,
+}) {
+  // Base case: We've recursed as deep as possible.
+  if (expression == cascadeTarget) return cascadeTarget;
+
+  // Otherwise, copy `expression` and recurse into its LHS.
+  if (expression is AssignmentExpression) {
+    return astFactory.assignmentExpression(
+      insertCascadeTargetIntoExpression(
+        expression: expression.leftHandSide,
+        cascadeTarget: cascadeTarget,
+      ),
+      expression.operator,
+      expression.rightHandSide,
+    );
+  } else if (expression is IndexExpression) {
+    var expressionTarget = expression.realTarget;
+    var question = expression.question;
+
+    // A null-aware cascade treats the `?` in `?..` as part of the token, but
+    // for a non-cascade index, it is a separate `?` token.
+    if (expression.period?.type == TokenType.QUESTION_PERIOD_PERIOD) {
+      question = _synthesizeToken(TokenType.QUESTION, expression.period!);
+    }
+
+    return astFactory.indexExpressionForTarget2(
+      target: insertCascadeTargetIntoExpression(
+        expression: expressionTarget,
+        cascadeTarget: cascadeTarget,
+      ),
+      question: question,
+      leftBracket: expression.leftBracket,
+      index: expression.index,
+      rightBracket: expression.rightBracket,
+    );
+  } else if (expression is MethodInvocation) {
+    var expressionTarget = expression.realTarget!;
+    return astFactory.methodInvocation(
+      insertCascadeTargetIntoExpression(
+        expression: expressionTarget,
+        cascadeTarget: cascadeTarget,
+      ),
+      // If we've reached the end, replace the `..` operator with `.`
+      expressionTarget == cascadeTarget
+          ? _synthesizeToken(TokenType.PERIOD, expression.operator!)
+          : expression.operator,
+      expression.methodName,
+      expression.typeArguments,
+      expression.argumentList,
+    );
+  } else if (expression is PropertyAccess) {
+    var expressionTarget = expression.realTarget;
+    return astFactory.propertyAccess(
+      insertCascadeTargetIntoExpression(
+        expression: expressionTarget,
+        cascadeTarget: cascadeTarget,
+      ),
+      // If we've reached the end, replace the `..` operator with `.`
+      expressionTarget == cascadeTarget
+          ? _synthesizeToken(TokenType.PERIOD, expression.operator)
+          : expression.operator,
+      expression.propertyName,
+    );
+  }
+  throw UnimplementedError('Unhandled ${expression.runtimeType}'
+      '($expression)');
+}
+
+/// Synthesize a token with [type] to replace the given [operator].
+///
+/// Offset, comments, and previous/next links are all preserved.
+Token _synthesizeToken(TokenType type, Token operator) =>
+    Token(type, operator.offset, operator.precedingComments)
+      ..previous = operator.previous
+      ..next = operator.next;
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 554eb1a..b603111 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/workspace/package_build.dart';
 
@@ -63,14 +64,6 @@
   }
 
   @override
-  void clearCache() {
-    _absoluteUriToSourceCache.clear();
-    for (var resolver in resolvers) {
-      resolver.clearCache();
-    }
-  }
-
-  @override
   Source? forUri(String absoluteUri) {
     try {
       Uri uri;
@@ -109,6 +102,17 @@
   }
 
   @override
+  Uri? pathToUri(String path) {
+    for (var resolver in resolvers) {
+      var uri = resolver.pathToUri(path);
+      if (uri != null) {
+        return uri;
+      }
+    }
+    return null;
+  }
+
+  @override
   Source? resolveUri(Source? containingSource, String? containedUri) {
     if (containedUri == null) {
       return null;
@@ -135,18 +139,13 @@
     }
   }
 
+  @Deprecated('Use pathToUri() instead')
   @override
   Uri? restoreUri(Source source) {
-    for (UriResolver resolver in resolvers) {
-      // First see if a resolver can restore the URI.
-      Uri? uri = resolver.restoreAbsolute(source);
-
-      if (uri != null) {
-        return uri;
-      }
+    if (source is InSummarySource) {
+      return source.uri;
     }
-
-    return null;
+    return pathToUri(source.fullName);
   }
 
   /// Return a source object representing the URI that results from resolving
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index d8131da..db6b26d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -198,6 +198,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Return the analysis options that should be used to analyze code in the
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index 38d0316..245db3d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -420,6 +420,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Return the analysis options file to be used to analyze files in the given
@@ -432,6 +433,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Return the packages file to be used to analyze files in the given
@@ -444,6 +446,7 @@
         return _PackagesFile(current, file);
       }
     }
+    return null;
   }
 
   /// Return a list containing the glob patterns used to exclude files from the
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 32ea11f..8b728b5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/exception/exception.dart';
@@ -29,6 +30,7 @@
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
 import 'package:analyzer/src/dart/analysis/testing_data.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/exception/exception.dart';
@@ -42,6 +44,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary2/ast_binary_flags.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:meta/meta.dart';
 
 /// This class computes [AnalysisResult]s for Dart files.
@@ -80,7 +83,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 = 190;
+  static const int DATA_VERSION = 193;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
@@ -686,6 +689,22 @@
     return completer.future;
   }
 
+  /// Return [LibraryElementResult] for the given [file], or `null` if the
+  /// file is a part.
+  LibraryElement? getLibraryByFile(FileState file) {
+    if (file.isPart) {
+      return null;
+    }
+
+    var element = libraryContext.getLibraryElementIfReady(file.uriStr);
+    if (element != null) {
+      return element;
+    }
+
+    libraryContext.load2(file);
+    return libraryContext.getLibraryElement(file.uri);
+  }
+
   /// Return a [Future] that completes with [LibraryElementResult] for the given
   /// [uri], which is either resynthesized from the provided external summary
   /// store, or built for a file to which the given [uri] is resolved.
@@ -760,7 +779,7 @@
       units.add(unitResult);
     }
 
-    return ParsedLibraryResultImpl(currentSession, path, file.uri, units);
+    return ParsedLibraryResultImpl(currentSession, units);
   }
 
   /// Return a [ParsedLibraryResult] for the library with the given [uri].
@@ -1274,6 +1293,7 @@
       return;
     }
     if (file_paths.isDart(resourceProvider.pathContext, path)) {
+      _lastProducedSignatures.remove(path);
       _priorityResults.clear();
       _removePotentiallyAffectedLibraries(path);
       _fileTracker.removeFile(path);
@@ -1281,6 +1301,63 @@
     }
   }
 
+  ResolvedForCompletionResultImpl? resolveForCompletion({
+    required String path,
+    required int offset,
+    required OperationPerformanceImpl performance,
+  }) {
+    if (!_isAbsolutePath(path)) {
+      return null;
+    }
+
+    if (!_fsState.hasUri(path)) {
+      return null;
+    }
+
+    // Process pending changes.
+    while (_fileTracker.verifyChangedFilesIfNeeded()) {}
+
+    var file = _fsState.getFileForPath(path);
+
+    var library = file.isPart ? file.library : file;
+    if (library == null) {
+      return null;
+    }
+
+    libraryContext.load2(library);
+    var unitElement = libraryContext.computeUnitElement(library, file)
+        as CompilationUnitElementImpl;
+
+    var analyzer = LibraryAnalyzer(
+        analysisOptions as AnalysisOptionsImpl,
+        declaredVariables,
+        sourceFactory,
+        libraryContext.analysisContext,
+        libraryContext.elementFactory.libraryOfUri2(library.uriStr),
+        libraryContext.analysisSession.inheritanceManager,
+        library,
+        testingData: testingData);
+
+    var analysisResult = analyzer.analyzeForCompletion(
+      file: file,
+      offset: offset,
+      unitElement: unitElement,
+      performance: performance,
+    );
+
+    return ResolvedForCompletionResultImpl(
+      analysisSession: currentSession,
+      path: path,
+      uri: file.uri,
+      exists: file.exists,
+      content: file.content,
+      lineInfo: file.lineInfo,
+      parsedUnit: analysisResult.parsedUnit,
+      unitElement: unitElement,
+      resolvedNodes: analysisResult.resolvedNodes,
+    );
+  }
+
   void _addDeclaredVariablesToSignature(ApiSignature buffer) {
     var variableNames = declaredVariables.variableNames;
     buffer.addInt(variableNames.length);
@@ -1470,8 +1547,6 @@
 
       return ResolvedLibraryResultImpl(
         currentSession,
-        library.path,
-        library.uri,
         resolvedUnits.first.libraryElement,
         resolvedUnits,
       );
@@ -1502,7 +1577,6 @@
         file.uri,
         file.lineInfo,
         file.isPart,
-        library.transitiveSignature,
         element,
       );
     });
@@ -1705,15 +1779,16 @@
   }
 
   void _removePotentiallyAffectedLibraries(String path) {
-    _logger.run('Invalidate affected by $path.', () {
-      _logger.writeln('Work in $name');
-      var affected = <FileState>{};
-      _fsState.collectAffected(path, affected);
-      _logger.writeln('Remove ${affected.length} libraries.');
-      _libraryContext?.elementFactory.removeLibraries(
-        affected.map((e) => e.uriStr).toSet(),
-      );
-    });
+    var affected = <FileState>{};
+    _fsState.collectAffected(path, affected);
+
+    for (var file in affected) {
+      file.invalidateLibraryCycle();
+    }
+
+    _libraryContext?.elementFactory.removeLibraries(
+      affected.map((e) => e.uriStr).toSet(),
+    );
   }
 
   void _reportException(String path, Object exception, StackTrace stackTrace) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
index 7d99407..b00f8df 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
@@ -51,37 +51,6 @@
     return ExperimentStatus.latestLanguageVersion();
   }
 
-  /// Computes a set of features for use in a unit test.  Computes the set of
-  /// features enabled in [sdkVersion], plus any specified [additionalFeatures].
-  ///
-  /// If [sdkVersion] is not supplied (or is `null`), then the current set of
-  /// enabled features is used as the starting point.
-  @visibleForTesting
-  factory ExperimentStatus.forTesting(
-      // ignore:avoid_unused_constructor_parameters
-      {String? sdkVersion,
-      List<Feature> additionalFeatures = const []}) {
-    var explicitFlags = decodeExplicitFlags([]);
-    for (var feature in additionalFeatures) {
-      explicitFlags.enabled[(feature as ExperimentalFeature).index] = true;
-    }
-
-    var sdkLanguageVersion = currentVersion;
-    var flags = restrictEnableFlagsToVersion(
-      sdkLanguageVersion: sdkLanguageVersion,
-      explicitEnabledFlags: explicitFlags.enabled,
-      explicitDisabledFlags: explicitFlags.disabled,
-      version: sdkLanguageVersion,
-    );
-
-    return ExperimentStatus._(
-      sdkLanguageVersion,
-      explicitFlags.enabled,
-      explicitFlags.disabled,
-      flags,
-    );
-  }
-
   factory ExperimentStatus.fromStorage(Uint8List encoded) {
     var byteIndex = 0;
 
@@ -121,19 +90,6 @@
   /// Always succeeds, even if the input flags are invalid.  Expired and
   /// unrecognized flags are ignored, conflicting flags are resolved in favor of
   /// the flag appearing last.
-  factory ExperimentStatus.fromStrings(List<String> flags) {
-    return ExperimentStatus.fromStrings2(
-      sdkLanguageVersion: currentVersion,
-      flags: flags,
-    );
-  }
-
-  /// Decodes the strings given in [flags] into a representation of the set of
-  /// experiments that should be enabled.
-  ///
-  /// Always succeeds, even if the input flags are invalid.  Expired and
-  /// unrecognized flags are ignored, conflicting flags are resolved in favor of
-  /// the flag appearing last.
   factory ExperimentStatus.fromStrings2({
     required Version sdkLanguageVersion,
     required List<String> flags,
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index ce99ad0..1fda845 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -8,7 +8,7 @@
 
 /// The current version of the Dart language (or, for non-stable releases, the
 /// version of the language currently in the process of being developed).
-const _currentVersion = '2.15.0';
+const _currentVersion = '2.16.0';
 
 /// A map containing information about all known experimental flags.
 final _knownFeatures = <String, ExperimentalFeature>{
@@ -21,6 +21,7 @@
   EnableString.extension_methods: ExperimentalFeatures.extension_methods,
   EnableString.extension_types: ExperimentalFeatures.extension_types,
   EnableString.generic_metadata: ExperimentalFeatures.generic_metadata,
+  EnableString.macros: ExperimentalFeatures.macros,
   EnableString.named_arguments_anywhere:
       ExperimentalFeatures.named_arguments_anywhere,
   EnableString.non_nullable: ExperimentalFeatures.non_nullable,
@@ -62,6 +63,9 @@
   /// String to enable the experiment "generic-metadata"
   static const String generic_metadata = 'generic-metadata';
 
+  /// String to enable the experiment "macros"
+  static const String macros = 'macros';
+
   /// String to enable the experiment "named-arguments-anywhere"
   static const String named_arguments_anywhere = 'named-arguments-anywhere';
 
@@ -177,8 +181,18 @@
     releaseVersion: Version.parse('2.14.0'),
   );
 
-  static final named_arguments_anywhere = ExperimentalFeature(
+  static final macros = ExperimentalFeature(
     index: 8,
+    enableString: EnableString.macros,
+    isEnabledByDefault: IsEnabledByDefault.macros,
+    isExpired: IsExpired.macros,
+    documentation: 'Static meta-programming',
+    experimentalReleaseVersion: null,
+    releaseVersion: null,
+  );
+
+  static final named_arguments_anywhere = ExperimentalFeature(
+    index: 9,
     enableString: EnableString.named_arguments_anywhere,
     isEnabledByDefault: IsEnabledByDefault.named_arguments_anywhere,
     isExpired: IsExpired.named_arguments_anywhere,
@@ -188,7 +202,7 @@
   );
 
   static final non_nullable = ExperimentalFeature(
-    index: 9,
+    index: 10,
     enableString: EnableString.non_nullable,
     isEnabledByDefault: IsEnabledByDefault.non_nullable,
     isExpired: IsExpired.non_nullable,
@@ -198,7 +212,7 @@
   );
 
   static final nonfunction_type_aliases = ExperimentalFeature(
-    index: 10,
+    index: 11,
     enableString: EnableString.nonfunction_type_aliases,
     isEnabledByDefault: IsEnabledByDefault.nonfunction_type_aliases,
     isExpired: IsExpired.nonfunction_type_aliases,
@@ -208,7 +222,7 @@
   );
 
   static final set_literals = ExperimentalFeature(
-    index: 11,
+    index: 12,
     enableString: EnableString.set_literals,
     isEnabledByDefault: IsEnabledByDefault.set_literals,
     isExpired: IsExpired.set_literals,
@@ -218,7 +232,7 @@
   );
 
   static final spread_collections = ExperimentalFeature(
-    index: 12,
+    index: 13,
     enableString: EnableString.spread_collections,
     isEnabledByDefault: IsEnabledByDefault.spread_collections,
     isExpired: IsExpired.spread_collections,
@@ -228,7 +242,7 @@
   );
 
   static final super_parameters = ExperimentalFeature(
-    index: 13,
+    index: 14,
     enableString: EnableString.super_parameters,
     isEnabledByDefault: IsEnabledByDefault.super_parameters,
     isExpired: IsExpired.super_parameters,
@@ -238,7 +252,7 @@
   );
 
   static final test_experiment = ExperimentalFeature(
-    index: 14,
+    index: 15,
     enableString: EnableString.test_experiment,
     isEnabledByDefault: IsEnabledByDefault.test_experiment,
     isExpired: IsExpired.test_experiment,
@@ -249,7 +263,7 @@
   );
 
   static final triple_shift = ExperimentalFeature(
-    index: 15,
+    index: 16,
     enableString: EnableString.triple_shift,
     isEnabledByDefault: IsEnabledByDefault.triple_shift,
     isExpired: IsExpired.triple_shift,
@@ -259,7 +273,7 @@
   );
 
   static final value_class = ExperimentalFeature(
-    index: 16,
+    index: 17,
     enableString: EnableString.value_class,
     isEnabledByDefault: IsEnabledByDefault.value_class,
     isExpired: IsExpired.value_class,
@@ -269,7 +283,7 @@
   );
 
   static final variance = ExperimentalFeature(
-    index: 17,
+    index: 18,
     enableString: EnableString.variance,
     isEnabledByDefault: IsEnabledByDefault.variance,
     isExpired: IsExpired.variance,
@@ -306,6 +320,9 @@
   /// Default state of the experiment "generic-metadata"
   static const bool generic_metadata = true;
 
+  /// Default state of the experiment "macros"
+  static const bool macros = false;
+
   /// Default state of the experiment "named-arguments-anywhere"
   static const bool named_arguments_anywhere = false;
 
@@ -365,6 +382,9 @@
   /// Expiration status of the experiment "generic-metadata"
   static const bool generic_metadata = false;
 
+  /// Expiration status of the experiment "macros"
+  static const bool macros = false;
+
   /// Expiration status of the experiment "named-arguments-anywhere"
   static const bool named_arguments_anywhere = false;
 
@@ -425,6 +445,9 @@
   /// Current state for the flag "generic-metadata"
   bool get generic_metadata => isEnabled(ExperimentalFeatures.generic_metadata);
 
+  /// Current state for the flag "macros"
+  bool get macros => isEnabled(ExperimentalFeatures.macros);
+
   /// Current state for the flag "named-arguments-anywhere"
   bool get named_arguments_anywhere =>
       isEnabled(ExperimentalFeatures.named_arguments_anywhere);
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index f0f35eb..2c3364c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -35,6 +35,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary2/informative_data.dart';
 import 'package:analyzer/src/util/either.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:collection/collection.dart';
 import 'package:convert/convert.dart';
@@ -94,6 +95,9 @@
   /// The absolute URI of the file.
   final Uri uri;
 
+  /// Properties of the [uri].
+  final FileUriProperties uriProperties;
+
   /// The [Source] of the file with the [uri].
   final Source source;
 
@@ -126,6 +130,9 @@
 
   UnlinkedUnit? _unlinked2;
 
+  /// Files that reference this file.
+  final List<FileState> referencingFiles = [];
+
   List<FileState?>? _importedFiles;
   List<FileState?>? _exportedFiles;
   List<FileState?>? _partedFiles;
@@ -148,7 +155,7 @@
     this.workspacePackage,
     this._contextFeatureSet,
     this.packageLanguageVersion,
-  );
+  ) : uriProperties = FileUriProperties(uri);
 
   /// The unlinked API signature of the file.
   Uint8List get apiSignature => _apiSignature!;
@@ -196,7 +203,10 @@
     return _exportedFiles ??= _unlinked2!.exports.map((directive) {
       var uri = _selectRelativeUri(directive);
       return _fileForRelativeUri(uri).map(
-        (file) => file,
+        (file) {
+          file?.referencingFiles.add(this);
+          return file;
+        },
         (_) => null,
       );
     }).toList();
@@ -210,7 +220,10 @@
     return _importedFiles ??= _unlinked2!.imports.map((directive) {
       var uri = _selectRelativeUri(directive);
       return _fileForRelativeUri(uri).map(
-        (file) => file,
+        (file) {
+          file?.referencingFiles.add(this);
+          return file;
+        },
         (_) => null,
       );
     }).toList();
@@ -276,6 +289,7 @@
       return _fileForRelativeUri(uri).map(
         (file) {
           if (file != null) {
+            file.referencingFiles.add(this);
             _fsState._partToLibraries
                 .putIfAbsent(file, () => <FileState>[])
                 .add(this);
@@ -338,6 +352,11 @@
     _libraryCycle = cycle;
   }
 
+  void invalidateLibraryCycle() {
+    _libraryCycle?.invalidate();
+    _libraryCycle = null;
+  }
+
   /// Return a new parsed unresolved [CompilationUnit].
   CompilationUnitImpl parse([AnalysisErrorListener? errorListener]) {
     errorListener ??= AnalysisErrorListener.NULL_LISTENER;
@@ -420,6 +439,9 @@
       }
     }
 
+    // It is possible that this file does not reference these files.
+    _stopReferencingByThisFile();
+
     // Read imports/exports on demand.
     _importedFiles = null;
     _exportedFiles = null;
@@ -559,6 +581,20 @@
     return directive.uri;
   }
 
+  void _stopReferencingByThisFile() {
+    void removeForOne(List<FileState?>? referencedFiles) {
+      if (referencedFiles != null) {
+        for (var referenced in referencedFiles) {
+          referenced?.referencingFiles.remove(this);
+        }
+      }
+    }
+
+    removeForOne(_importedFiles);
+    removeForOne(_exportedFiles);
+    removeForOne(_partedFiles);
+  }
+
   static UnlinkedUnit serializeAstUnlinked2(CompilationUnit unit) {
     var exports = <UnlinkedNamespaceDirective>[];
     var imports = <UnlinkedNamespaceDirective>[];
@@ -686,11 +722,8 @@
   /// Mapping from a path to the flag whether there is a URI for the path.
   final Map<String, bool> _hasUriForPath = {};
 
-  /// Mapping from a path to the corresponding [FileState]s, canonical or not.
-  final Map<String, List<FileState>> _pathToFiles = {};
-
-  /// Mapping from a path to the corresponding canonical [FileState].
-  final Map<String, FileState> _pathToCanonicalFile = {};
+  /// Mapping from a path to the corresponding [FileState].
+  final Map<String, FileState> _pathToFile = {};
 
   /// We don't read parts until requested, but if we need to know the
   /// library for a file, we need to read parts of every file to know
@@ -737,28 +770,24 @@
   /// Collected files that transitively reference a file with the [path].
   /// These files are potentially affected by the change.
   void collectAffected(String path, Set<FileState> affected) {
-    final knownFiles = this.knownFiles.toList();
-
-    final fileToReferences = <FileState, List<FileState>>{};
-    for (var file in knownFiles) {
-      for (var referenced in file.directReferencedFiles) {
-        var references = fileToReferences[referenced] ??= [];
-        references.add(file);
-      }
+    // TODO(scheglov) This should not be necessary.
+    // We use affected files to remove library elements, and we can only get
+    // these library elements when we link or load them, using library cycles.
+    // And we get library cycles by asking `directReferencedFiles`.
+    for (var file in knownFiles.toList()) {
+      file.directReferencedFiles;
     }
 
     collectAffected(FileState file) {
       if (affected.add(file)) {
-        var references = fileToReferences[file];
-        if (references != null) {
-          for (var other in references) {
-            collectAffected(other);
-          }
+        for (var other in file.referencingFiles) {
+          collectAffected(other);
         }
       }
     }
 
-    for (var file in _pathToFiles[path] ?? <FileState>[]) {
+    var file = _pathToFile[path];
+    if (file != null) {
       collectAffected(file);
     }
   }
@@ -791,36 +820,14 @@
     return featureSetProvider.getLanguageVersion(path, uri);
   }
 
-  /// Return the canonical [FileState] for the given absolute [path]. The
-  /// returned file has the last known state since if was last refreshed.
-  ///
-  /// Here "canonical" means that if the [path] is in a package `lib` then the
-  /// returned file will have the `package:` style URI.
+  /// Return the [FileState] for the given absolute [path]. The returned file
+  /// has the last known state since if was last refreshed.
   FileState getFileForPath(String path) {
-    FileState? file = _pathToCanonicalFile[path];
+    var file = _pathToFile[path];
     if (file == null) {
       File resource = _resourceProvider.getFile(path);
-      Source fileSource = resource.createSource();
-      Uri? uri = _sourceFactory.restoreUri(fileSource);
-      // Try to get the existing instance.
-      file = _uriToFile[uri];
-      // If we have a file, call it the canonical one and return it.
-      if (file != null) {
-        _pathToCanonicalFile[path] = file;
-        return file;
-      }
-      // Create a new file.
-      FileSource uriSource = FileSource(resource, uri!);
-      WorkspacePackage? workspacePackage = _workspace?.findPackageFor(path);
-      FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
-      Version packageLanguageVersion =
-          contextLanguageVersion(path, uri, workspacePackage);
-      file = FileState._(this, path, uri, uriSource, workspacePackage,
-          featureSet, packageLanguageVersion);
-      _uriToFile[uri] = file;
-      _addFileWithPath(path, file);
-      _pathToCanonicalFile[path] = file;
-      file.refresh();
+      Uri uri = _sourceFactory.pathToUri(path)!;
+      file = _newFile(resource, path, uri);
     }
     return file;
   }
@@ -847,7 +854,7 @@
 
     FileState? file = _uriToFile[uri];
     if (file == null) {
-      Source? uriSource = _sourceFactory.resolveUri(null, uri.toString());
+      Source? uriSource = _sourceFactory.forUri2(uri);
 
       // If the URI cannot be resolved, for example because the factory
       // does not understand the scheme, return the unresolved file instance.
@@ -856,34 +863,26 @@
       }
 
       String path = uriSource.fullName;
+
+      // Check if already resolved to this path via different URI.
+      // That different URI must be the canonical one.
+      file = _pathToFile[path];
+      if (file != null) {
+        return Either2.t1(file);
+      }
+
       File resource = _resourceProvider.getFile(path);
-      FileSource source = FileSource(resource, uri);
-      WorkspacePackage? workspacePackage = _workspace?.findPackageFor(path);
-      FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
-      Version packageLanguageVersion =
-          contextLanguageVersion(path, uri, workspacePackage);
-      file = FileState._(this, path, uri, source, workspacePackage, featureSet,
-          packageLanguageVersion);
-      _uriToFile[uri] = file;
-      _addFileWithPath(path, file);
-      file.refresh();
+
+      var rewrittenUri = rewriteToCanonicalUri(_sourceFactory, uri);
+      if (rewrittenUri == null) {
+        return Either2.t1(null);
+      }
+
+      file = _newFile(resource, path, rewrittenUri);
     }
     return Either2.t1(file);
   }
 
-  /// Return the list of all [FileState]s corresponding to the given [path]. The
-  /// list has at least one item, and the first item is the canonical file.
-  List<FileState> getFilesForPath(String path) {
-    FileState canonicalFile = getFileForPath(path);
-    List<FileState> allFiles = _pathToFiles[path]!.toList();
-    if (allFiles.length == 1) {
-      return allFiles;
-    }
-    return allFiles
-      ..remove(canonicalFile)
-      ..insert(0, canonicalFile);
-  }
-
   /// Return files where the given [name] is subtyped, i.e. used in `extends`,
   /// `with` or `implements` clauses.
   Set<FileState>? getFilesSubtypingName(String name) {
@@ -898,10 +897,8 @@
   bool hasUri(String path) {
     bool? flag = _hasUriForPath[path];
     if (flag == null) {
-      File resource = _resourceProvider.getFile(path);
-      Source fileSource = resource.createSource();
-      Uri? uri = _sourceFactory.restoreUri(fileSource);
-      Source? uriSource = _sourceFactory.forUri2(uri!);
+      Uri uri = _sourceFactory.pathToUri(path)!;
+      Source? uriSource = _sourceFactory.forUri2(uri);
       flag = uriSource?.fullName == path;
       _hasUriForPath[path] = flag;
     }
@@ -933,30 +930,34 @@
     _clearFiles();
   }
 
-  void _addFileWithPath(String path, FileState file) {
-    var files = _pathToFiles[path];
-    if (files == null) {
-      knownFilePaths.add(path);
-      knownFiles.add(file);
-      files = <FileState>[];
-      _pathToFiles[path] = files;
-      fileStamp++;
-    }
-    files.add(file);
-  }
-
   /// Clear all [FileState] data - all maps from path or URI, etc.
   void _clearFiles() {
     _uriToFile.clear();
     knownFilePaths.clear();
     knownFiles.clear();
     _hasUriForPath.clear();
-    _pathToFiles.clear();
-    _pathToCanonicalFile.clear();
+    _pathToFile.clear();
     _librariesWithoutPartsRead.clear();
     _partToLibraries.clear();
     _subtypedNameToFiles.clear();
   }
+
+  FileState _newFile(File resource, String path, Uri uri) {
+    FileSource uriSource = FileSource(resource, uri);
+    WorkspacePackage? workspacePackage = _workspace?.findPackageFor(path);
+    FeatureSet featureSet = contextFeatureSet(path, uri, workspacePackage);
+    Version packageLanguageVersion =
+        contextLanguageVersion(path, uri, workspacePackage);
+    var file = FileState._(this, path, uri, uriSource, workspacePackage,
+        featureSet, packageLanguageVersion);
+    _pathToFile[path] = file;
+    _uriToFile[uri] = file;
+    knownFilePaths.add(path);
+    knownFiles.add(file);
+    fileStamp++;
+    file.refresh();
+    return file;
+  }
 }
 
 @visibleForTesting
@@ -971,3 +972,46 @@
         .toSet();
   }
 }
+
+/// Precomputed properties of a file URI, used because [Uri] is relatively
+/// expensive to work with, if we do this thousand times.
+class FileUriProperties {
+  static const int _isDart = 1 << 0;
+  static const int _isSrc = 1 << 1;
+
+  final int _flags;
+  final String? packageName;
+
+  factory FileUriProperties(Uri uri) {
+    if (uri.isScheme('dart')) {
+      return const FileUriProperties._dart();
+    } else if (uri.isScheme('package')) {
+      var segments = uri.pathSegments;
+      if (segments.length >= 2) {
+        return FileUriProperties._package(
+          packageName: segments[0],
+          isSrc: segments[1] == 'src',
+        );
+      }
+    }
+    return const FileUriProperties._unknown();
+  }
+
+  const FileUriProperties._dart()
+      : _flags = _isDart,
+        packageName = null;
+
+  FileUriProperties._package({
+    required String packageName,
+    required bool isSrc,
+  })  : _flags = isSrc ? _isSrc : 0,
+        packageName = packageName;
+
+  const FileUriProperties._unknown()
+      : _flags = 0,
+        packageName = null;
+
+  bool get isDart => (_flags & _isDart) != 0;
+
+  bool get isSrc => (_flags & _isSrc) != 0;
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state_filter.dart b/pkg/analyzer/lib/src/dart/analysis/file_state_filter.dart
new file mode 100644
index 0000000..828d7ad
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state_filter.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/lint/pub.dart';
+import 'package:analyzer/src/workspace/pub.dart';
+import 'package:collection/collection.dart';
+
+abstract class FileStateFilter {
+  /// Return a filter of files that can be accessed by the [file].
+  factory FileStateFilter(FileState file) {
+    var workspacePackage = file.workspacePackage;
+    if (workspacePackage is PubWorkspacePackage) {
+      return _PubFilter(workspacePackage, file.path);
+    } else {
+      return _AnyFilter();
+    }
+  }
+
+  bool shouldInclude(FileState file);
+}
+
+class _AnyFilter implements FileStateFilter {
+  @override
+  bool shouldInclude(FileState file) => true;
+}
+
+class _PubFilter implements FileStateFilter {
+  final PubWorkspacePackage targetPackage;
+  final String? targetPackageName;
+  final bool targetInLib;
+  final Set<String> dependencies;
+
+  factory _PubFilter(PubWorkspacePackage package, String path) {
+    var inLib = package.workspace.provider
+        .getFolder(package.root)
+        .getChildAssumingFolder('lib')
+        .contains(path);
+
+    var dependencies = <String>{};
+    var pubspec = package.pubspec;
+    if (pubspec != null) {
+      dependencies.addAll(pubspec.dependencies.names);
+      if (!inLib) {
+        dependencies.addAll(pubspec.devDependencies.names);
+      }
+    }
+
+    return _PubFilter._(
+      targetPackage: package,
+      targetPackageName: pubspec?.name?.value.text,
+      targetInLib: inLib,
+      dependencies: dependencies,
+    );
+  }
+
+  _PubFilter._({
+    required this.targetPackage,
+    required this.targetPackageName,
+    required this.targetInLib,
+    required this.dependencies,
+  });
+
+  @override
+  bool shouldInclude(FileState file) {
+    var uri = file.uriProperties;
+    if (uri.isDart) {
+      return true;
+    }
+
+    // Normally only package URIs are available.
+    // But outside of lib/ we allow any files of this package.
+    var packageName = uri.packageName;
+    if (packageName == null) {
+      if (targetInLib) {
+        return false;
+      } else {
+        var filePackage = file.workspacePackage;
+        return filePackage is PubWorkspacePackage &&
+            filePackage.root == targetPackage.root;
+      }
+    }
+
+    // Any `package:` library from the same package.
+    if (packageName == targetPackageName) {
+      return true;
+    }
+
+    // If not the same package, must be public.
+    if (uri.isSrc) {
+      return false;
+    }
+
+    return dependencies.contains(packageName);
+  }
+}
+
+extension on PSDependencyList? {
+  List<String> get names {
+    final self = this;
+    if (self == null) {
+      return const [];
+    } else {
+      return self
+          .map((dependency) => dependency.name?.text)
+          .whereNotNull()
+          .toList();
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
index d183ecc..887f450 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
@@ -166,15 +166,9 @@
     return _logger.run('Verify API signature of $path', () {
       _logger.writeln('Work in ${_fsState.contextName}');
 
-      bool anyApiChanged = false;
-      List<FileState> files = _fsState.getFilesForPath(path);
-      for (FileState file in files) {
-        bool apiChanged = file.refresh();
-        if (apiChanged) {
-          anyApiChanged = true;
-        }
-      }
-      if (anyApiChanged) {
+      var file = _fsState.getFileForPath(path);
+      var apiChanged = file.refresh();
+      if (apiChanged) {
         _logger.writeln('API signatures mismatch found.');
         // TODO(scheglov) schedule analysis of only affected files
         var pendingChangedFiles = <String>{};
@@ -190,10 +184,8 @@
         // Add files that directly import the changed file.
         for (String addedPath in addedFiles) {
           FileState addedFile = _fsState.getFileForPath(addedPath);
-          for (FileState changedFile in files) {
-            if (addedFile.importedFiles.contains(changedFile)) {
-              pendingImportFiles.add(addedPath);
-            }
+          if (addedFile.importedFiles.contains(file)) {
+            pendingImportFiles.add(addedPath);
           }
         }
 
@@ -220,7 +212,7 @@
         _pendingErrorFiles = pendingErrorFiles;
         _pendingFiles = pendingFiles;
       }
-      return files[0];
+      return file;
     });
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index e3b952f..9ce7dda 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -596,6 +596,8 @@
           return;
         }
       }
+    } else if (expression is PropertyAccess) {
+      // Nothing to do?
     } else {
       throw UnimplementedError('Unhandled CommentReference expression type: '
           '${expression.runtimeType}');
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index f6a39e8..0b49b4e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -41,6 +41,7 @@
 import 'package:analyzer/src/generated/ffi_verifier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/hint/sdk_constraint_verifier.dart';
 import 'package:analyzer/src/ignore_comments/ignore_info.dart';
 import 'package:analyzer/src/lint/linter.dart';
@@ -48,6 +49,8 @@
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
+import 'package:analyzer/src/util/performance/operation_performance.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 var timerLibraryAnalyzer = Stopwatch();
@@ -57,6 +60,16 @@
 var timerLibraryAnalyzerSplicer = Stopwatch();
 var timerLibraryAnalyzerVerify = Stopwatch();
 
+class AnalysisForCompletionResult {
+  final CompilationUnit parsedUnit;
+  final List<AstNode> resolvedNodes;
+
+  AnalysisForCompletionResult({
+    required this.parsedUnit,
+    required this.resolvedNodes,
+  });
+}
+
 /// Analyzer of a single library.
 class LibraryAnalyzer {
   /// A marker object used to prevent the initialization of
@@ -192,6 +205,84 @@
     return results;
   }
 
+  AnalysisForCompletionResult analyzeForCompletion({
+    required FileState file,
+    required int offset,
+    required CompilationUnitElementImpl unitElement,
+    required OperationPerformanceImpl performance,
+  }) {
+    var parsedUnit = performance.run('parse', (performance) {
+      return _parse(file);
+    });
+
+    var node = NodeLocator(offset).searchWithin(parsedUnit);
+
+    if (_hasEmptyCompletionContext(node)) {
+      return AnalysisForCompletionResult(
+        parsedUnit: parsedUnit,
+        resolvedNodes: [],
+      );
+    }
+
+    var errorListener = RecordingErrorListener();
+
+    return performance.run('resolve', (performance) {
+      // TODO(scheglov) We don't need to do this for the whole unit.
+      parsedUnit.accept(
+        ResolutionVisitor(
+          unitElement: unitElement,
+          errorListener: errorListener,
+          featureSet: _libraryElement.featureSet,
+          nameScope: _libraryElement.scope,
+          elementWalker: ElementWalker.forCompilationUnit(
+            unitElement,
+            libraryFilePath: _library.path,
+            unitFilePath: file.path,
+          ),
+        ),
+      );
+
+      // TODO(scheglov) We don't need to do this for the whole unit.
+      parsedUnit.accept(ScopeResolverVisitor(
+          _libraryElement, file.source, _typeProvider, errorListener,
+          nameScope: _libraryElement.scope));
+
+      FlowAnalysisHelper flowAnalysisHelper = FlowAnalysisHelper(
+          _typeSystem, _testingData != null, _libraryElement.featureSet);
+      _testingData?.recordFlowAnalysisDataForTesting(
+          file.uri, flowAnalysisHelper.dataForTesting!);
+
+      var resolverVisitor = ResolverVisitor(_inheritance, _libraryElement,
+          file.source, _typeProvider, errorListener,
+          featureSet: _libraryElement.featureSet,
+          flowAnalysisHelper: flowAnalysisHelper);
+
+      var nodeToResolve = node?.thisOrAncestorMatching((e) {
+        return e.parent is ClassDeclaration ||
+            e.parent is CompilationUnit ||
+            e.parent is ExtensionDeclaration ||
+            e.parent is MixinDeclaration;
+      });
+      if (nodeToResolve != null) {
+        var can = resolverVisitor.prepareForResolving(nodeToResolve);
+        if (can) {
+          nodeToResolve.accept(resolverVisitor);
+          return AnalysisForCompletionResult(
+            parsedUnit: parsedUnit,
+            resolvedNodes: [nodeToResolve],
+          );
+        }
+      }
+
+      var resolvedUnits = analyze();
+      var resolvedUnit = resolvedUnits[file]!;
+      return AnalysisForCompletionResult(
+        parsedUnit: resolvedUnit.unit,
+        resolvedNodes: [resolvedUnit.unit],
+      );
+    });
+  }
+
   void _checkForInconsistentLanguageVersionOverride(
     Map<FileState, CompilationUnit> units,
   ) {
@@ -244,7 +335,7 @@
   /// Compute [_constants] in all units.
   void _computeConstants() {
     computeConstants(_typeProvider, _typeSystem, _declaredVariables,
-        _constants.toList(), _analysisOptions.experimentStatus);
+        _constants.toList(), _libraryElement.featureSet);
   }
 
   void _computeHints(FileState file, CompilationUnit unit) {
@@ -360,18 +451,15 @@
   }
 
   void _computeVerifyErrors(FileState file, CompilationUnit unit) {
-    RecordingErrorListener errorListener = _getErrorListener(file);
+    ErrorReporter errorReporter = _getErrorReporter(file);
 
     CodeChecker checker = CodeChecker(
       _typeProvider,
       _typeSystem,
-      _inheritance,
-      errorListener,
+      errorReporter,
     );
     checker.visitCompilationUnit(unit);
 
-    ErrorReporter errorReporter = _getErrorReporter(file);
-
     //
     // Validate the directives.
     //
@@ -683,6 +771,18 @@
         featureSet: unit.featureSet, flowAnalysisHelper: flowAnalysisHelper));
   }
 
+  Uri? _resolveRelativeUri(String relativeUriStr) {
+    Uri relativeUri;
+    try {
+      relativeUri = Uri.parse(relativeUriStr);
+    } on FormatException {
+      return null;
+    }
+
+    var absoluteUri = resolveRelativeUri(_library.uri, relativeUri);
+    return rewriteToCanonicalUri(_sourceFactory, absoluteUri);
+  }
+
   /// Return the result of resolve the given [uriContent], reporting errors
   /// against the [uriLiteral].
   Source? _resolveUri(FileState file, bool isImport, StringLiteral uriLiteral,
@@ -724,12 +824,12 @@
         directive.uriSource = defaultSource;
       }
       if (directive is NamespaceDirectiveImpl) {
-        var relativeUri = _selectRelativeUri(directive);
-        directive.selectedUriContent = relativeUri;
-        directive.selectedSource = _sourceFactory.resolveUri(
-          _library.source,
-          relativeUri,
-        );
+        var relativeUriStr = _selectRelativeUri(directive);
+        directive.selectedUriContent = relativeUriStr;
+        var absoluteUri = _resolveRelativeUri(relativeUriStr);
+        if (absoluteUri != null) {
+          directive.selectedSource = _sourceFactory.forUri2(absoluteUri);
+        }
         for (var configuration in directive.configurations) {
           configuration as ConfigurationImpl;
           var uriLiteral = configuration.uri;
@@ -816,6 +916,54 @@
       }
     }
   }
+
+  static bool _hasEmptyCompletionContext(AstNode? node) {
+    if (node is DoubleLiteral || node is IntegerLiteral) {
+      return true;
+    }
+
+    if (node is SimpleIdentifier) {
+      var parent = node.parent;
+
+      if (parent is ConstructorDeclaration && parent.name == node) {
+        return true;
+      }
+
+      if (parent is ConstructorFieldInitializer && parent.fieldName == node) {
+        return true;
+      }
+
+      // We have a contributor that looks at the type, but it is syntactic.
+      if (parent is FormalParameter && parent.identifier == node) {
+        return true;
+      }
+
+      if (parent is FunctionDeclaration && parent.name == node) {
+        return true;
+      }
+
+      if (parent is MethodDeclaration && parent.name == node) {
+        return true;
+      }
+
+      // The name of a NamedType does not provide any context.
+      // So, we don't need to resolve anything.
+      if (parent is NamedType) {
+        return true;
+      }
+
+      if (parent is TypeParameter && parent.name == node) {
+        return true;
+      }
+
+      // We have a contributor that looks at the type, but it is syntactic.
+      if (parent is VariableDeclaration && parent.name == node) {
+        return true;
+      }
+    }
+
+    return false;
+  }
 }
 
 /// Analysis result for single file.
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index dbdb140..4795da1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -81,6 +81,11 @@
     return elementFactory.libraryOfUri2('$uri');
   }
 
+  /// Return [LibraryElement] if it is ready.
+  LibraryElement? getLibraryElementIfReady(String uriStr) {
+    return elementFactory.libraryOfUriIfReady(uriStr);
+  }
+
   /// We are about to discard this context, mark all libraries invalid.
   void invalidAllLibraries() {
     elementFactory.invalidateAllLibraries();
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 4856a55..e799e6d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -16,15 +16,7 @@
   @override
   final AnalysisSession session;
 
-  @Deprecated('Use FileResult.path instead')
-  @override
-  final String path;
-
-  @Deprecated('Use FileResult.uri instead')
-  @override
-  final Uri uri;
-
-  AnalysisResultImpl(this.session, this.path, this.uri);
+  AnalysisResultImpl(this.session);
 }
 
 class ElementDeclarationResultImpl implements ElementDeclarationResult {
@@ -55,28 +47,20 @@
 
 class FileResultImpl extends AnalysisResultImpl implements FileResult {
   @override
+  final String path;
+
+  @override
+  final Uri uri;
+
+  @override
   final LineInfo lineInfo;
 
   @override
   final bool isPart;
 
   FileResultImpl(
-      AnalysisSession session, String path, Uri uri, this.lineInfo, this.isPart)
-      : super(session, path, uri);
-
-  @override
-  // TODO(scheglov) Convert into a field.
-  // ignore: deprecated_member_use_from_same_package, unnecessary_overrides
-  String get path => super.path;
-
-  @Deprecated('Check for specific Result subtypes instead')
-  @override
-  ResultState get state => ResultState.VALID;
-
-  @override
-  // TODO(scheglov) Convert into a field.
-  // ignore: deprecated_member_use_from_same_package, unnecessary_overrides
-  Uri get uri => super.uri;
+      AnalysisSession session, this.path, this.uri, this.lineInfo, this.isPart)
+      : super(session);
 }
 
 class LibraryElementResultImpl implements LibraryElementResult {
@@ -91,15 +75,7 @@
   @override
   final List<ParsedUnitResult> units;
 
-  ParsedLibraryResultImpl(
-      AnalysisSession session, String path, Uri uri, this.units)
-      : super(session, path, uri);
-
-  @Deprecated('Check for specific Result subtypes instead')
-  @override
-  ResultState get state {
-    return ResultState.VALID;
-  }
+  ParsedLibraryResultImpl(AnalysisSession session, this.units) : super(session);
 
   @override
   ElementDeclarationResult? getElementDeclaration(Element element) {
@@ -145,10 +121,6 @@
   ParsedUnitResultImpl(AnalysisSession session, String path, Uri uri,
       this.content, LineInfo lineInfo, bool isPart, this.unit, this.errors)
       : super(session, path, uri, lineInfo, isPart);
-
-  @Deprecated('Check for specific Result subtypes instead')
-  @override
-  ResultState get state => ResultState.VALID;
 }
 
 class ParseStringResultImpl implements ParseStringResult {
@@ -167,6 +139,48 @@
   LineInfo get lineInfo => unit.lineInfo!;
 }
 
+class ResolvedForCompletionResultImpl {
+  final AnalysisSession analysisSession;
+  final String path;
+  final Uri uri;
+  final bool exists;
+  final String content;
+  final LineInfo lineInfo;
+
+  /// The full parsed unit.
+  final CompilationUnit parsedUnit;
+
+  /// The full element for the unit.
+  final CompilationUnitElement unitElement;
+
+  /// Nodes from [parsedUnit] that were resolved to provide enough context
+  /// to perform completion. How much is enough depends on the location
+  /// where resolution for completion was requested, and our knowledge
+  /// how completion contributors work and what information they expect.
+  ///
+  /// This is usually a small subset of the whole unit - a method, a field.
+  /// It could be even empty if the location does not provide any context
+  /// information for any completion contributor, e.g. a type annotation.
+  /// But it could be the whole unit as well, if the location is not something
+  /// we have an optimization for.
+  ///
+  /// If this list is not empty, then the last node contains the requested
+  /// offset. Other nodes are provided mostly FYI.
+  final List<AstNode> resolvedNodes;
+
+  ResolvedForCompletionResultImpl({
+    required this.analysisSession,
+    required this.path,
+    required this.uri,
+    required this.exists,
+    required this.content,
+    required this.lineInfo,
+    required this.parsedUnit,
+    required this.unitElement,
+    required this.resolvedNodes,
+  });
+}
+
 class ResolvedLibraryResultImpl extends AnalysisResultImpl
     implements ResolvedLibraryResult {
   @override
@@ -175,15 +189,8 @@
   @override
   final List<ResolvedUnitResult> units;
 
-  ResolvedLibraryResultImpl(
-      AnalysisSession session, String path, Uri uri, this.element, this.units)
-      : super(session, path, uri);
-
-  @Deprecated('Check for specific Result subtypes instead')
-  @override
-  ResultState get state {
-    return ResultState.VALID;
-  }
+  ResolvedLibraryResultImpl(AnalysisSession session, this.element, this.units)
+      : super(session);
 
   @override
   TypeProvider get typeProvider => element.typeProvider;
@@ -250,10 +257,6 @@
     return unit.declaredElement!.library;
   }
 
-  @Deprecated('Check for specific Result subtypes instead')
-  @override
-  ResultState get state => ResultState.VALID;
-
   @override
   TypeProvider get typeProvider => libraryElement.typeProvider;
 
@@ -264,18 +267,11 @@
 class UnitElementResultImpl extends FileResultImpl
     implements UnitElementResult {
   @override
-  final String signature;
-
-  @override
   final CompilationUnitElement element;
 
   UnitElementResultImpl(AnalysisSession session, String path, Uri uri,
-      LineInfo lineInfo, bool isPart, this.signature, this.element)
+      LineInfo lineInfo, bool isPart, this.element)
       : super(session, path, uri, lineInfo, isPart);
-
-  @Deprecated('Check for specific Result subtypes instead')
-  @override
-  ResultState get state => ResultState.VALID;
 }
 
 class _DeclarationByElementLocator extends GeneralizingAstVisitor<void> {
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 4e0449b..651e0f9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/index.dart';
@@ -28,6 +29,102 @@
   return element;
 }
 
+DeclarationKind? _getSearchElementKind(Element element) {
+  if (element is ClassElement) {
+    if (element.isEnum) {
+      return DeclarationKind.ENUM;
+    }
+    if (element.isMixin) return DeclarationKind.MIXIN;
+    if (element.isMixinApplication) return DeclarationKind.CLASS_TYPE_ALIAS;
+    return DeclarationKind.CLASS;
+  }
+
+  if (element is ConstructorElement) {
+    return DeclarationKind.CONSTRUCTOR;
+  }
+
+  if (element is ExtensionElement) {
+    return DeclarationKind.EXTENSION;
+  }
+
+  if (element is FieldElement) {
+    if (element.isEnumConstant) return DeclarationKind.ENUM_CONSTANT;
+    return DeclarationKind.FIELD;
+  }
+
+  if (element is FunctionElement) {
+    return DeclarationKind.FUNCTION;
+  }
+
+  if (element is MethodElement) {
+    return DeclarationKind.METHOD;
+  }
+
+  if (element is PropertyAccessorElement) {
+    return element.isGetter ? DeclarationKind.GETTER : DeclarationKind.SETTER;
+  }
+
+  if (element is TypeAliasElement) {
+    return DeclarationKind.TYPE_ALIAS;
+  }
+
+  if (element is VariableElement) {
+    return DeclarationKind.VARIABLE;
+  }
+
+  return null;
+}
+
+/// An element declaration.
+class Declaration {
+  final int fileIndex;
+  final LineInfo lineInfo;
+  final String name;
+  final DeclarationKind kind;
+  final int offset;
+  final int line;
+  final int column;
+  final int codeOffset;
+  final int codeLength;
+  final String? className;
+  final String? mixinName;
+  final String? parameters;
+
+  Declaration(
+    this.fileIndex,
+    this.lineInfo,
+    this.name,
+    this.kind,
+    this.offset,
+    this.line,
+    this.column,
+    this.codeOffset,
+    this.codeLength,
+    this.className,
+    this.mixinName,
+    this.parameters,
+  );
+}
+
+/// The kind of a [Declaration].
+enum DeclarationKind {
+  CLASS,
+  CLASS_TYPE_ALIAS,
+  CONSTRUCTOR,
+  ENUM,
+  ENUM_CONSTANT,
+  EXTENSION,
+  FIELD,
+  FUNCTION,
+  FUNCTION_TYPE_ALIAS,
+  GETTER,
+  METHOD,
+  MIXIN,
+  SETTER,
+  TYPE_ALIAS,
+  VARIABLE
+}
+
 /// Search support for an [AnalysisDriver].
 class Search {
   final AnalysisDriver _driver;
@@ -64,6 +161,114 @@
     return elements;
   }
 
+  /// Add matching declarations to the [result].
+  Future<void> declarations(
+      WorkspaceSymbols result, RegExp? regExp, int? maxResults,
+      {String? onlyForFile}) async {
+    if (result.hasMoreDeclarationsThan(maxResults)) {
+      return;
+    }
+
+    void addDeclaration(LineInfo lineInfo, Element element) {
+      if (result.hasMoreDeclarationsThan(maxResults)) {
+        throw const _MaxNumberOfDeclarationsError();
+      }
+
+      if (element.isSynthetic) {
+        return;
+      }
+
+      var source = element.source;
+      if (source == null) {
+        return;
+      }
+
+      var path = source.fullName;
+      if (onlyForFile != null && path != onlyForFile) {
+        return;
+      }
+
+      var name = element.name;
+      if (name == null || name.isEmpty) {
+        return;
+      }
+      if (name.endsWith('=')) {
+        name = name.substring(0, name.length - 1);
+      }
+      if (regExp != null && !regExp.hasMatch(name)) {
+        return;
+      }
+
+      var enclosing = element.enclosingElement;
+
+      String? className;
+      String? mixinName;
+      if (enclosing is ClassElement) {
+        if (enclosing.isEnum) {
+          // skip
+        } else if (enclosing.isMixin) {
+          mixinName = enclosing.name;
+        } else {
+          className = enclosing.name;
+        }
+      }
+
+      var kind = _getSearchElementKind(element);
+      if (kind == null) {
+        return;
+      }
+
+      String? parameters;
+      if (element is ExecutableElement) {
+        var displayString = element.getDisplayString(withNullability: true);
+        var parameterIndex = displayString.indexOf('(');
+        if (parameterIndex > 0) {
+          parameters = displayString.substring(parameterIndex);
+        }
+      }
+
+      element as ElementImpl; // to access codeOffset/codeLength
+      var locationOffset = element.nameOffset;
+      var locationStart = lineInfo.getLocation(locationOffset);
+
+      result.declarations.add(
+        Declaration(
+          result._getPathIndex(path),
+          lineInfo,
+          name,
+          kind,
+          locationOffset,
+          locationStart.lineNumber,
+          locationStart.columnNumber,
+          element.codeOffset ?? 0,
+          element.codeLength ?? 0,
+          className,
+          mixinName,
+          parameters,
+        ),
+      );
+    }
+
+    await _driver.discoverAvailableFiles();
+    var knownFiles = _driver.fsState.knownFiles.toList();
+    for (var file in knownFiles) {
+      var libraryElement = _driver.getLibraryByFile(file);
+      if (libraryElement != null) {
+        for (var unitElement in libraryElement.units) {
+          try {
+            unitElement.accept(
+              _FunctionElementVisitor((element) {
+                addDeclaration(unitElement.lineInfo!, element);
+              }),
+            );
+          } on _MaxNumberOfDeclarationsError {
+            return;
+          }
+        }
+      }
+    }
+  }
+
   /// Returns references to the [element].
   Future<List<SearchResult>> references(
       Element? element, SearchedFiles searchedFiles) async {
@@ -604,6 +809,26 @@
   String toString() => id;
 }
 
+class WorkspaceSymbols {
+  final List<Declaration> declarations = [];
+  final List<String> files = [];
+  final Map<String, int> _pathToIndex = {};
+
+  bool hasMoreDeclarationsThan(int? maxResults) {
+    return maxResults != null && declarations.length >= maxResults;
+  }
+
+  int _getPathIndex(String path) {
+    var index = _pathToIndex[path];
+    if (index == null) {
+      index = files.length;
+      files.add(path);
+      _pathToIndex[path] = index;
+    }
+    return index;
+  }
+}
+
 /// A visitor that finds the deep-most [Element] that contains the [offset].
 class _ContainingElementFinder extends GeneralizingElementVisitor<void> {
   final int offset;
@@ -624,6 +849,19 @@
   }
 }
 
+/// A visitor that handles any element with a function.
+class _FunctionElementVisitor extends GeneralizingElementVisitor<void> {
+  final void Function(Element element) process;
+
+  _FunctionElementVisitor(this.process);
+
+  @override
+  void visitElement(Element element) {
+    process(element);
+    super.visitElement(element);
+  }
+}
+
 /// Visitor that adds [SearchResult]s for references to the [importElement].
 class _ImportElementReferencesVisitor extends RecursiveAstVisitor<void> {
   final List<SearchResult> results = <SearchResult>[];
@@ -950,3 +1188,8 @@
         enclosingElement, kind, node.offset, node.length, true, isQualified));
   }
 }
+
+/// The marker class that is thrown to stop adding declarations.
+class _MaxNumberOfDeclarationsError {
+  const _MaxNumberOfDeclarationsError();
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 319ddc6..32eeaca 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -60,48 +60,24 @@
     return _driver.getErrors(path);
   }
 
-  @Deprecated('Use getErrors() instead')
-  @override
-  Future<SomeErrorsResult> getErrors2(String path) {
-    return getErrors(path);
-  }
-
   @override
   SomeFileResult getFile(String path) {
     _checkConsistency();
     return _driver.getFileSync(path);
   }
 
-  @Deprecated('Use getFile() instead')
-  @override
-  SomeFileResult getFile2(String path) {
-    return getFile(path);
-  }
-
   @override
   Future<SomeLibraryElementResult> getLibraryByUri(String uri) {
     _checkConsistency();
     return _driver.getLibraryByUri(uri);
   }
 
-  @Deprecated('Use getLibraryByUri() instead')
-  @override
-  Future<SomeLibraryElementResult> getLibraryByUri2(String uri) {
-    return getLibraryByUri(uri);
-  }
-
   @override
   SomeParsedLibraryResult getParsedLibrary(String path) {
     _checkConsistency();
     return _driver.getParsedLibrary(path);
   }
 
-  @Deprecated('Use getParsedLibrary() instead')
-  @override
-  SomeParsedLibraryResult getParsedLibrary2(String path) {
-    return getParsedLibrary(path);
-  }
-
   @override
   SomeParsedLibraryResult getParsedLibraryByElement(LibraryElement element) {
     _checkConsistency();
@@ -113,36 +89,18 @@
     return _driver.getParsedLibraryByUri(element.source.uri);
   }
 
-  @Deprecated('Use getParsedLibraryByElement() instead')
-  @override
-  SomeParsedLibraryResult getParsedLibraryByElement2(LibraryElement element) {
-    return getParsedLibraryByElement(element);
-  }
-
   @override
   SomeParsedUnitResult getParsedUnit(String path) {
     _checkConsistency();
     return _driver.parseFileSync(path);
   }
 
-  @Deprecated('Use getParsedUnit() instead')
-  @override
-  SomeParsedUnitResult getParsedUnit2(String path) {
-    return getParsedUnit(path);
-  }
-
   @override
   Future<SomeResolvedLibraryResult> getResolvedLibrary(String path) {
     _checkConsistency();
     return _driver.getResolvedLibrary(path);
   }
 
-  @Deprecated('Use getResolvedLibrary() instead')
-  @override
-  Future<SomeResolvedLibraryResult> getResolvedLibrary2(String path) {
-    return getResolvedLibrary(path);
-  }
-
   @override
   Future<SomeResolvedLibraryResult> getResolvedLibraryByElement(
     LibraryElement element,
@@ -158,38 +116,18 @@
     return _driver.getResolvedLibraryByUri(element.source.uri);
   }
 
-  @Deprecated('Use getResolvedLibraryByElement() instead')
-  @override
-  Future<SomeResolvedLibraryResult> getResolvedLibraryByElement2(
-    LibraryElement element,
-  ) {
-    return getResolvedLibraryByElement(element);
-  }
-
   @override
   Future<SomeResolvedUnitResult> getResolvedUnit(String path) {
     _checkConsistency();
     return _driver.getResult(path);
   }
 
-  @Deprecated('Use getResolvedUnit() instead')
-  @override
-  Future<SomeResolvedUnitResult> getResolvedUnit2(String path) {
-    return getResolvedUnit(path);
-  }
-
   @override
   Future<SomeUnitElementResult> getUnitElement(String path) {
     _checkConsistency();
     return _driver.getUnitElement(path);
   }
 
-  @Deprecated('Use getUnitElement() instead')
-  @override
-  Future<SomeUnitElementResult> getUnitElement2(String path) {
-    return getUnitElement(path);
-  }
-
   /// Check to see that results from this session will be consistent, and throw
   /// an [InconsistentAnalysisException] if they might not be.
   void _checkConsistency() {
@@ -221,11 +159,13 @@
 
     _typeSystemLegacy?.updateOptions(
       implicitCasts: analysisOptions.implicitCasts,
+      strictCasts: analysisOptions.strictCasts,
       strictInference: analysisOptions.strictInference,
     );
 
     _typeSystemNonNullableByDefault?.updateOptions(
       implicitCasts: analysisOptions.implicitCasts,
+      strictCasts: analysisOptions.strictCasts,
       strictInference: analysisOptions.strictInference,
     );
   }
@@ -268,6 +208,7 @@
     _typeSystemLegacy = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: false,
+      strictCasts: _analysisOptions.strictCasts,
       strictInference: _analysisOptions.strictInference,
       typeProvider: legacy,
     );
@@ -275,6 +216,7 @@
     _typeSystemNonNullableByDefault = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: true,
+      strictCasts: _analysisOptions.strictCasts,
       strictInference: _analysisOptions.strictInference,
       typeProvider: nonNullableByDefault,
     );
diff --git a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
index 9e6bf4a..bda06b6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
@@ -5,7 +5,6 @@
 import 'package:analyzer/dart/analysis/uri_converter.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:path/src/context.dart';
 
 /// An implementation of a URI converter based on an analysis driver.
@@ -32,8 +31,7 @@
         }
       }
     }
-    Source source = provider.getFile(path).createSource();
-    return driver.sourceFactory.restoreUri(source);
+    return driver.sourceFactory.pathToUri(path);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 24e1241..ca91eb4 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -16,7 +16,6 @@
 import 'package:analyzer/src/dart/ast/to_source_visitor.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/fasta/token_utils.dart' as util show findPrevious;
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo, Source;
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
@@ -784,7 +783,9 @@
   }
 
   @override
-  E? thisOrAncestorMatching<E extends AstNode>(Predicate<AstNode> predicate) {
+  E? thisOrAncestorMatching<E extends AstNode>(
+    bool Function(AstNode) predicate,
+  ) {
     AstNode? node = this;
     while (node != null && !predicate(node)) {
       node = node.parent;
@@ -1394,6 +1395,10 @@
   @override
   Token? abstractKeyword;
 
+  /// The 'macro' keyword, or `null` if the keyword was absent.
+  @override
+  Token? macroKeyword;
+
   /// The token representing the 'class' keyword.
   @override
   Token classKeyword;
@@ -1422,6 +1427,7 @@
       CommentImpl? comment,
       List<Annotation>? metadata,
       this.abstractKeyword,
+      this.macroKeyword,
       this.classKeyword,
       SimpleIdentifierImpl name,
       TypeParameterListImpl? typeParameters,
@@ -1440,6 +1446,7 @@
   @override
   Iterable<SyntacticEntity> get childEntities => super._childEntities
     ..add(abstractKeyword)
+    ..add(macroKeyword)
     ..add(classKeyword)
     ..add(_name)
     ..add(_typeParameters)
@@ -1463,7 +1470,7 @@
 
   @override
   Token get firstTokenAfterCommentAndMetadata {
-    return abstractKeyword ?? classKeyword;
+    return abstractKeyword ?? macroKeyword ?? classKeyword;
   }
 
   @override
@@ -1643,6 +1650,11 @@
   @override
   Token? abstractKeyword;
 
+  /// The token for the 'macro' keyword, or `null` if this is not defining a
+  /// macro class.
+  @override
+  Token? macroKeyword;
+
   /// The name of the superclass of the class being declared.
   NamedTypeImpl _superclass;
 
@@ -1667,6 +1679,7 @@
       this._typeParameters,
       this.equals,
       this.abstractKeyword,
+      this.macroKeyword,
       this._superclass,
       this._withClause,
       this._implementsClause,
@@ -1685,6 +1698,7 @@
     ..add(_typeParameters)
     ..add(equals)
     ..add(abstractKeyword)
+    ..add(macroKeyword)
     ..add(_superclass)
     ..add(_withClause)
     ..add(_implementsClause)
@@ -1695,7 +1709,7 @@
 
   @override
   Token get firstTokenAfterCommentAndMetadata {
-    return abstractKeyword ?? typedefKeyword;
+    return abstractKeyword ?? macroKeyword ?? typedefKeyword;
   }
 
   @override
@@ -1709,10 +1723,6 @@
   @override
   bool get isAbstract => abstractKeyword != null;
 
-  @Deprecated('Use superclass2 instead')
-  @override
-  NamedTypeImpl get superclass => _superclass;
-
   set superclass(NamedType superclass) {
     _superclass = _becomeParentOf(superclass as NamedTypeImpl);
   }
@@ -2654,10 +2664,6 @@
     _name = _becomeParentOf(name as SimpleIdentifierImpl?);
   }
 
-  @Deprecated('Use type2 instead')
-  @override
-  NamedTypeImpl get type => _type;
-
   set type(NamedType type) {
     _type = _becomeParentOf(type as NamedTypeImpl);
   }
@@ -3286,14 +3292,27 @@
 /// The declaration of an enumeration.
 ///
 ///    enumType ::=
-///        metadata 'enum' [SimpleIdentifier] '{' [SimpleIdentifier]
-///        (',' [SimpleIdentifier])* (',')? '}'
+///        metadata 'enum' [SimpleIdentifier] [TypeParameterList]?
+///        [WithClause]? [ImplementsClause]? '{' [SimpleIdentifier]
+///        (',' [SimpleIdentifier])* (';' [ClassMember]+)? '}'
 class EnumDeclarationImpl extends NamedCompilationUnitMemberImpl
     implements EnumDeclaration {
   /// The 'enum' keyword.
   @override
   Token enumKeyword;
 
+  /// The type parameters, or `null` if the enumeration does not have any
+  /// type parameters.
+  TypeParameterListImpl? _typeParameters;
+
+  /// The `with` clause for the enumeration, or `null` if the class does not
+  /// have a `with` clause.
+  WithClauseImpl? _withClause;
+
+  /// The `implements` clause for the enumeration, or `null` if the enumeration
+  /// does not implement any interfaces.
+  ImplementsClauseImpl? _implementsClause;
+
   /// The left curly bracket.
   @override
   Token leftBracket;
@@ -3301,6 +3320,9 @@
   /// The enumeration constants being declared.
   final NodeListImpl<EnumConstantDeclaration> _constants = NodeListImpl._();
 
+  /// The members defined by the enum.
+  final NodeListImpl<ClassMember> _members = NodeListImpl._();
+
   /// The right curly bracket.
   @override
   Token rightBracket;
@@ -3314,11 +3336,19 @@
       List<Annotation>? metadata,
       this.enumKeyword,
       SimpleIdentifierImpl name,
+      this._typeParameters,
+      this._withClause,
+      this._implementsClause,
       this.leftBracket,
       List<EnumConstantDeclaration> constants,
+      List<ClassMember> members,
       this.rightBracket)
       : super(comment, metadata, name) {
+    _becomeParentOf(_typeParameters);
+    _becomeParentOf(_withClause);
+    _becomeParentOf(_implementsClause);
     _constants._initialize(this, constants);
+    _members._initialize(this, members);
   }
 
   @override
@@ -3326,8 +3356,12 @@
   Iterable<SyntacticEntity> get childEntities => super._childEntities
     ..add(enumKeyword)
     ..add(_name)
+    ..add(_typeParameters)
+    ..add(_withClause)
+    ..add(_implementsClause)
     ..add(leftBracket)
     ..addAll(_constants)
+    ..addAll(_members)
     ..add(rightBracket);
 
   @override
@@ -3343,13 +3377,42 @@
   Token get firstTokenAfterCommentAndMetadata => enumKeyword;
 
   @override
+  ImplementsClauseImpl? get implementsClause => _implementsClause;
+
+  set implementsClause(ImplementsClause? implementsClause) {
+    _implementsClause =
+        _becomeParentOf(implementsClause as ImplementsClauseImpl?);
+  }
+
+  @override
+  NodeListImpl<ClassMember> get members => _members;
+
+  @override
+  TypeParameterListImpl? get typeParameters => _typeParameters;
+
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
+  }
+
+  @override
+  WithClauseImpl? get withClause => _withClause;
+
+  set withClause(WithClause? withClause) {
+    _withClause = _becomeParentOf(withClause as WithClauseImpl?);
+  }
+
+  @override
   E? accept<E>(AstVisitor<E> visitor) => visitor.visitEnumDeclaration(this);
 
   @override
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     _name.accept(visitor);
+    _typeParameters?.accept(visitor);
+    _withClause?.accept(visitor);
+    _implementsClause?.accept(visitor);
     _constants.accept(visitor);
+    _members.accept(visitor);
   }
 }
 
@@ -3668,10 +3731,6 @@
   @override
   Token get endToken => _superclass.endToken;
 
-  @Deprecated('Use superclass2 instead')
-  @override
-  NamedTypeImpl get superclass => _superclass;
-
   set superclass(NamedType name) {
     _superclass = _becomeParentOf(name as NamedTypeImpl);
   }
@@ -5800,10 +5859,6 @@
   @override
   Token get endToken => _interfaces.endToken!;
 
-  @Deprecated('Use interfaces2 instead')
-  @override
-  NodeList<TypeName> get interfaces => _DelegatingTypeNameList(_interfaces);
-
   @override
   NodeListImpl<NamedType> get interfaces2 => _interfaces;
 
@@ -7459,7 +7514,7 @@
 ///    typeName ::=
 ///        [Identifier] typeArguments? '?'?
 /// ignore: deprecated_member_use_from_same_package
-class NamedTypeImpl extends TypeAnnotationImpl implements TypeName {
+class NamedTypeImpl extends TypeAnnotationImpl implements NamedType {
   /// The name of the type.
   IdentifierImpl _name;
 
@@ -8009,11 +8064,6 @@
   @override
   Token get endToken => _superclassConstraints.endToken!;
 
-  @Deprecated('Use superclassConstraints2 instead')
-  @override
-  NodeList<TypeName> get superclassConstraints =>
-      _DelegatingTypeNameList(_superclassConstraints);
-
   @override
   NodeListImpl<NamedType> get superclassConstraints2 => _superclassConstraints;
 
@@ -9300,12 +9350,11 @@
   Token literal;
 
   /// The value of the literal.
-  String _value;
+  @override
+  String value;
 
   /// Initialize a newly created simple string literal.
-  SimpleStringLiteralImpl(this.literal, this._value) {
-    _value = StringUtilities.intern(value);
-  }
+  SimpleStringLiteralImpl(this.literal, this.value);
 
   @override
   Token get beginToken => literal;
@@ -9334,13 +9383,6 @@
   @override
   bool get isSynthetic => literal.isSynthetic;
 
-  @override
-  String get value => _value;
-
-  set value(String string) {
-    _value = StringUtilities.intern(_value);
-  }
-
   StringLexemeHelper get _helper {
     return StringLexemeHelper(literal.lexeme, true, true);
   }
@@ -9543,12 +9585,12 @@
       if (isRaw) {
         start++;
       }
-      if (StringUtilities.startsWith3(lexeme, start, 0x27, 0x27, 0x27)) {
+      if (lexeme.startsWith("'''", start)) {
         isSingleQuoted = true;
         isMultiline = true;
         start += 3;
         start = _trimInitialWhitespace(start);
-      } else if (StringUtilities.startsWith3(lexeme, start, 0x22, 0x22, 0x22)) {
+      } else if (lexeme.startsWith('"""', start)) {
         isSingleQuoted = false;
         isMultiline = true;
         start += 3;
@@ -9566,12 +9608,10 @@
     end = lexeme.length;
     if (isLast) {
       if (start + 3 <= end &&
-          (StringUtilities.endsWith3(lexeme, 0x22, 0x22, 0x22) ||
-              StringUtilities.endsWith3(lexeme, 0x27, 0x27, 0x27))) {
+          (lexeme.endsWith("'''") || lexeme.endsWith('"""'))) {
         end -= 3;
       } else if (start + 1 <= end &&
-          (StringUtilities.endsWithChar(lexeme, 0x22) ||
-              StringUtilities.endsWithChar(lexeme, 0x27))) {
+          (lexeme.endsWith("'") || lexeme.endsWith('"'))) {
         end -= 1;
       }
     }
@@ -9751,6 +9791,144 @@
   }
 }
 
+/// A super-initializer formal parameter.
+///
+///    fieldFormalParameter ::=
+///        ('final' [TypeName] | 'const' [TypeName] | 'var' | [TypeName])?
+///        'super' '.' [SimpleIdentifier]
+///        ([TypeParameterList]? [FormalParameterList])?
+class SuperFormalParameterImpl extends NormalFormalParameterImpl
+    implements SuperFormalParameter {
+  /// The token representing either the 'final', 'const' or 'var' keyword, or
+  /// `null` if no keyword was used.
+  @override
+  Token? keyword;
+
+  /// The name of the declared type of the parameter, or `null` if the parameter
+  /// does not have a declared type.
+  TypeAnnotationImpl? _type;
+
+  /// The token representing the 'super' keyword.
+  @override
+  Token superKeyword;
+
+  /// The token representing the period.
+  @override
+  Token period;
+
+  /// The type parameters associated with the method, or `null` if the method is
+  /// not a generic method.
+  TypeParameterListImpl? _typeParameters;
+
+  /// The parameters of the function-typed parameter, or `null` if this is not a
+  /// function-typed field formal parameter.
+  FormalParameterListImpl? _parameters;
+
+  @override
+  Token? question;
+
+  /// Initialize a newly created formal parameter. Either or both of the
+  /// [comment] and [metadata] can be `null` if the parameter does not have the
+  /// corresponding attribute. The [keyword] can be `null` if there is a type.
+  /// The [type] must be `null` if the keyword is 'var'. The [thisKeyword] and
+  /// [period] can be `null` if the keyword 'this' was not provided.  The
+  /// [parameters] can be `null` if this is not a function-typed field formal
+  /// parameter.
+  SuperFormalParameterImpl(
+      CommentImpl? comment,
+      List<Annotation>? metadata,
+      Token? covariantKeyword,
+      Token? requiredKeyword,
+      this.keyword,
+      this._type,
+      this.superKeyword,
+      this.period,
+      SimpleIdentifierImpl identifier,
+      this._typeParameters,
+      this._parameters,
+      this.question)
+      : super(
+            comment, metadata, covariantKeyword, requiredKeyword, identifier) {
+    _becomeParentOf(_type);
+    _becomeParentOf(_typeParameters);
+    _becomeParentOf(_parameters);
+  }
+
+  @override
+  Token get beginToken {
+    final metadata = this.metadata;
+    if (metadata.isNotEmpty) {
+      return metadata.beginToken!;
+    } else if (requiredKeyword != null) {
+      return requiredKeyword!;
+    } else if (covariantKeyword != null) {
+      return covariantKeyword!;
+    } else if (keyword != null) {
+      return keyword!;
+    } else if (_type != null) {
+      return _type!.beginToken;
+    }
+    return superKeyword;
+  }
+
+  @override
+  Iterable<SyntacticEntity> get childEntities => super._childEntities
+    ..add(keyword)
+    ..add(_type)
+    ..add(superKeyword)
+    ..add(period)
+    ..add(identifier)
+    ..add(_parameters);
+
+  @override
+  Token get endToken {
+    return question ?? _parameters?.endToken ?? identifier.endToken;
+  }
+
+  @override
+  SimpleIdentifierImpl get identifier => super.identifier!;
+
+  @override
+  bool get isConst => keyword?.keyword == Keyword.CONST;
+
+  @override
+  bool get isFinal => keyword?.keyword == Keyword.FINAL;
+
+  @override
+  FormalParameterListImpl? get parameters => _parameters;
+
+  set parameters(FormalParameterList? parameters) {
+    _parameters = _becomeParentOf(parameters as FormalParameterListImpl?);
+  }
+
+  @override
+  TypeAnnotationImpl? get type => _type;
+
+  set type(TypeAnnotation? type) {
+    _type = _becomeParentOf(type as TypeAnnotationImpl);
+  }
+
+  @override
+  TypeParameterListImpl? get typeParameters => _typeParameters;
+
+  set typeParameters(TypeParameterList? typeParameters) {
+    _typeParameters = _becomeParentOf(typeParameters as TypeParameterListImpl?);
+  }
+
+  @override
+  E? accept<E>(AstVisitor<E> visitor) =>
+      visitor.visitSuperFormalParameter(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _type?.accept(visitor);
+    identifier.accept(visitor);
+    _typeParameters?.accept(visitor);
+    _parameters?.accept(visitor);
+  }
+}
+
 /// A case in a switch statement.
 ///
 ///    switchCase ::=
@@ -10392,10 +10570,6 @@
   @override
   NamedTypeImpl get type => _typeName;
 
-  @Deprecated('Use namedType instead')
-  @override
-  NamedTypeImpl get typeName => _typeName;
-
   set typeName(NamedTypeImpl value) {
     _typeName = _becomeParentOf(value);
   }
@@ -10976,10 +11150,6 @@
   @override
   Token get endToken => _mixinTypes.endToken!;
 
-  @Deprecated('Use mixinTypes2 instead')
-  @override
-  NodeList<TypeName> get mixinTypes => _DelegatingTypeNameList(_mixinTypes);
-
   @override
   NodeListImpl<NamedType> get mixinTypes2 => _mixinTypes;
 
@@ -11052,77 +11222,6 @@
   }
 }
 
-/// Implementation of `NodeList<TypeName>` that delegates.
-@Deprecated('Use NamedType instead')
-class _DelegatingTypeNameList
-    with ListMixin<TypeName>
-    implements NodeList<TypeName> {
-  final NodeListImpl<NamedType> _delegate;
-
-  _DelegatingTypeNameList(this._delegate);
-
-  @override
-  Token? get beginToken {
-    return _delegate.beginToken;
-  }
-
-  @override
-  Token? get endToken {
-    return _delegate.endToken;
-  }
-
-  @override
-  int get length => _delegate.length;
-
-  @override
-  set length(int newLength) {
-    _delegate.length = newLength;
-  }
-
-  @override
-  AstNodeImpl get owner => _delegate.owner;
-
-  @override
-  TypeName operator [](int index) {
-    return _delegate[index] as TypeName;
-  }
-
-  @override
-  void operator []=(int index, TypeName node) {
-    _delegate[index] = node;
-  }
-
-  @override
-  void accept(AstVisitor visitor) {
-    _delegate.accept(visitor);
-  }
-
-  @override
-  void add(NamedType node) {
-    _delegate.add(node);
-  }
-
-  @override
-  void addAll(Iterable<TypeName> nodes) {
-    _delegate.addAll(nodes);
-  }
-
-  @override
-  void clear() {
-    _delegate.clear();
-  }
-
-  @override
-  void insert(int index, TypeName node) {
-    _delegate.insert(index, node);
-  }
-
-  @override
-  TypeName removeAt(int index) {
-    return _delegate.removeAt(index) as TypeName;
-  }
-}
-
 /// An indication of the resolved kind of a [SetOrMapLiteral].
 enum _SetOrMapKind {
   /// Indicates that the literal represents a map.
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 23b899cdf..806d84e 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -155,6 +155,7 @@
           Comment? comment,
           List<Annotation>? metadata,
           Token? abstractKeyword,
+          Token? macroKeyword,
           Token classKeyword,
           SimpleIdentifier name,
           TypeParameterList? typeParameters,
@@ -168,6 +169,7 @@
           comment as CommentImpl?,
           metadata,
           abstractKeyword,
+          macroKeyword,
           classKeyword,
           name as SimpleIdentifierImpl,
           typeParameters as TypeParameterListImpl?,
@@ -187,6 +189,7 @@
           TypeParameterList? typeParameters,
           Token equals,
           Token? abstractKeyword,
+          Token? macroKeyword,
           NamedType superclass,
           WithClause withClause,
           ImplementsClause? implementsClause,
@@ -199,6 +202,7 @@
           typeParameters as TypeParameterListImpl?,
           equals,
           abstractKeyword,
+          macroKeyword,
           superclass as NamedTypeImpl,
           withClause as WithClauseImpl,
           implementsClause as ImplementsClauseImpl?,
@@ -383,6 +387,7 @@
       EnumConstantDeclarationImpl(
           comment as CommentImpl?, metadata, name as SimpleIdentifierImpl);
 
+  @Deprecated('Use enumDeclaration2() instead')
   @override
   EnumDeclarationImpl enumDeclaration(
           Comment? comment,
@@ -392,8 +397,47 @@
           Token leftBracket,
           List<EnumConstantDeclaration> constants,
           Token rightBracket) =>
-      EnumDeclarationImpl(comment as CommentImpl?, metadata, enumKeyword,
-          name as SimpleIdentifierImpl, leftBracket, constants, rightBracket);
+      enumDeclaration2(
+          comment: comment,
+          metadata: metadata,
+          enumKeyword: enumKeyword,
+          name: name,
+          typeParameters: null,
+          withClause: null,
+          implementsClause: null,
+          leftBracket: leftBracket,
+          constants: constants,
+          members: [],
+          rightBracket: rightBracket);
+
+  @override
+  EnumDeclarationImpl enumDeclaration2({
+    required Comment? comment,
+    required List<Annotation>? metadata,
+    required Token enumKeyword,
+    required SimpleIdentifier name,
+    required TypeParameterList? typeParameters,
+    required WithClause? withClause,
+    required ImplementsClause? implementsClause,
+    required Token leftBracket,
+    required List<EnumConstantDeclaration> constants,
+    required List<ClassMember> members,
+    required Token rightBracket,
+  }) {
+    return EnumDeclarationImpl(
+      comment as CommentImpl?,
+      metadata,
+      enumKeyword,
+      name as SimpleIdentifierImpl,
+      typeParameters as TypeParameterListImpl?,
+      withClause as WithClauseImpl?,
+      implementsClause as ImplementsClauseImpl?,
+      leftBracket,
+      constants,
+      members,
+      rightBracket,
+    );
+  }
 
   @override
   ExportDirectiveImpl exportDirective(
@@ -1185,6 +1229,34 @@
       SuperExpressionImpl(superKeyword);
 
   @override
+  SuperFormalParameterImpl superFormalParameter(
+          {Comment? comment,
+          List<Annotation>? metadata,
+          Token? covariantKeyword,
+          Token? requiredKeyword,
+          Token? keyword,
+          TypeAnnotation? type,
+          required Token superKeyword,
+          required Token period,
+          required SimpleIdentifier identifier,
+          TypeParameterList? typeParameters,
+          FormalParameterList? parameters,
+          Token? question}) =>
+      SuperFormalParameterImpl(
+          comment as CommentImpl?,
+          metadata,
+          covariantKeyword,
+          requiredKeyword,
+          keyword,
+          type as TypeAnnotationImpl?,
+          superKeyword,
+          period,
+          identifier as SimpleIdentifierImpl,
+          typeParameters as TypeParameterListImpl?,
+          parameters as FormalParameterListImpl?,
+          question);
+
+  @override
   SwitchCaseImpl switchCase(List<Label> labels, Token keyword,
           Expression expression, Token colon, List<Statement> statements) =>
       SwitchCaseImpl(
@@ -1259,14 +1331,6 @@
   TypeLiteralImpl typeLiteral({required NamedType typeName}) =>
       TypeLiteralImpl(typeName as NamedTypeImpl);
 
-  @Deprecated('Use namedType() instead')
-  @override
-  NamedTypeImpl typeName(Identifier name, TypeArgumentList? typeArguments,
-          {Token? question}) =>
-      NamedTypeImpl(
-          name as IdentifierImpl, typeArguments as TypeArgumentListImpl?,
-          question: question);
-
   @override
   TypeParameterImpl typeParameter(
           Comment? comment,
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index 3df0bb6..f30fcca 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -118,14 +118,14 @@
 
 /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
 extension IdentifierExtension on Identifier {
-  Element? get writeElement {
-    return _writeElement(this);
-  }
-
   Element? get readElement {
     return _readElement(this);
   }
 
+  Element? get writeElement {
+    return _writeElement(this);
+  }
+
   Element? get writeOrReadElement {
     return _writeElement(this) ?? staticElement;
   }
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index f9ac572..294a89f 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -151,6 +151,7 @@
   void visitClassDeclaration(ClassDeclaration node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     _visitToken(node.abstractKeyword, suffix: ' ');
+    _visitToken(node.macroKeyword, suffix: ' ');
     sink.write('class ');
     _visitNode(node.name);
     _visitNode(node.typeParameters);
@@ -168,6 +169,7 @@
     if (node.abstractKeyword != null) {
       sink.write('abstract ');
     }
+    _visitToken(node.macroKeyword, suffix: ' ');
     sink.write('class ');
     _visitNode(node.name);
     _visitNode(node.typeParameters);
@@ -314,8 +316,12 @@
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
     sink.write('enum ');
     _visitNode(node.name);
+    _visitNode(node.typeParameters);
+    _visitNode(node.withClause, prefix: ' ');
+    _visitNode(node.implementsClause, prefix: ' ');
     sink.write(' {');
     _visitNodeList(node.constants, separator: ', ');
+    _visitNodeList(node.members, prefix: '; ', separator: ' ');
     sink.write('}');
   }
 
@@ -953,6 +959,19 @@
   }
 
   @override
+  void visitSuperFormalParameter(SuperFormalParameter node) {
+    _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
+    _visitToken(node.requiredKeyword, suffix: ' ');
+    _visitToken(node.covariantKeyword, suffix: ' ');
+    _visitToken(node.keyword, suffix: ' ');
+    _visitNode(node.type, suffix: ' ');
+    sink.write('super.');
+    _visitNode(node.identifier);
+    _visitNode(node.typeParameters);
+    _visitNode(node.parameters);
+  }
+
+  @override
   void visitSwitchCase(SwitchCase node) {
     _visitNodeList(node.labels, separator: ' ', suffix: ' ');
     sink.write('case ');
@@ -1026,12 +1045,6 @@
     _visitNode(node.type);
   }
 
-  @Deprecated('Override visitNamedType instead')
-  @override
-  void visitTypeName(TypeName node) {
-    throw StateError('Should not be invoked');
-  }
-
   @override
   void visitTypeParameter(TypeParameter node) {
     _visitNodeList(node.metadata, separator: ' ', suffix: ' ');
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 1b2249a..4db6958 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/to_source_visitor.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 
@@ -1103,6 +1102,19 @@
   }
 
   @override
+  bool visitSuperFormalParameter(SuperFormalParameter node) {
+    SuperFormalParameter other = _other as SuperFormalParameter;
+    return isEqualNodes(
+            node.documentationComment, other.documentationComment) &&
+        _isEqualNodeLists(node.metadata, other.metadata) &&
+        isEqualTokens(node.keyword, other.keyword) &&
+        isEqualNodes(node.type, other.type) &&
+        isEqualTokens(node.superKeyword, other.superKeyword) &&
+        isEqualTokens(node.period, other.period) &&
+        isEqualNodes(node.identifier, other.identifier);
+  }
+
+  @override
   bool visitSwitchCase(SwitchCase node) {
     SwitchCase other = _other as SwitchCase;
     return _isEqualNodeLists(node.labels, other.labels) &&
@@ -1188,12 +1200,6 @@
     return isEqualNodes(node.type, other.type);
   }
 
-  @Deprecated('Override visitNamedType instead')
-  @override
-  bool visitTypeName(TypeName node) {
-    throw StateError('Should not be invoked');
-  }
-
   @override
   bool visitTypeParameter(TypeParameter node) {
     TypeParameter other = _other as TypeParameter;
@@ -1735,6 +1741,9 @@
     } else if (identical(node.stackTraceParameter, _oldNode)) {
       node.stackTraceParameter = _newNode as SimpleIdentifier;
       return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Block;
+      return true;
     }
     return visitNode(node);
   }
@@ -1986,8 +1995,19 @@
     if (identical(node.name, _oldNode)) {
       node.name = _newNode as SimpleIdentifier;
       return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.withClause, _oldNode)) {
+      node.withClause = _newNode as WithClause;
+      return true;
+    } else if (identical(node.implementsClause, _oldNode)) {
+      node.implementsClause = _newNode as ImplementsClause;
+      return true;
     } else if (_replaceInList(node.constants)) {
       return true;
+    } else if (_replaceInList(node.members)) {
+      return true;
     }
     return visitAnnotatedNode(node);
   }
@@ -2075,6 +2095,9 @@
     if (identical(node.type, _oldNode)) {
       node.type = _newNode as TypeAnnotation;
       return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
     } else if (identical(node.parameters, _oldNode)) {
       node.parameters = _newNode as FormalParameterList;
       return true;
@@ -2201,6 +2224,9 @@
     if (identical(node.parameters, _oldNode)) {
       node.parameters = _newNode as FormalParameterList;
       return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
     } else if (identical(node.body, _oldNode)) {
       node.body = _newNode as FunctionBody;
       return true;
@@ -2217,6 +2243,9 @@
     } else if (identical(node.argumentList, _oldNode)) {
       node.argumentList = _newNode as ArgumentList;
       return true;
+    } else if (identical(node.typeArguments, _oldNode)) {
+      node.typeArguments = _newNode as TypeArgumentList;
+      return true;
     }
     return visitNode(node);
   }
@@ -2260,6 +2289,9 @@
     } else if (identical(node.parameters, _oldNode)) {
       node.parameters = _newNode as FormalParameterList;
       return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
     }
     return visitNormalFormalParameter(node);
   }
@@ -2493,6 +2525,9 @@
     } else if (identical(node.parameters, _oldNode)) {
       node.parameters = _newNode as FormalParameterList;
       return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
     } else if (identical(node.body, _oldNode)) {
       node.body = _newNode as FunctionBody;
       return true;
@@ -2511,6 +2546,9 @@
     } else if (identical(node.argumentList, _oldNode)) {
       node.argumentList = _newNode as ArgumentList;
       return true;
+    } else if (identical(node.typeArguments, _oldNode)) {
+      node.typeArguments = _newNode as TypeArgumentList;
+      return true;
     }
     return visitNode(node);
   }
@@ -2793,6 +2831,21 @@
       visitNode(node);
 
   @override
+  bool visitSuperFormalParameter(covariant SuperFormalParameterImpl node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeAnnotation;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    }
+    return visitNormalFormalParameter(node);
+  }
+
+  @override
   bool visitSwitchCase(covariant SwitchCaseImpl node) {
     if (identical(node.expression, _oldNode)) {
       node.expression = _newNode as Expression;
@@ -2890,11 +2943,6 @@
   }
 
   @override
-  bool visitTypeName(covariant NamedTypeImpl node) {
-    throw StateError('Should not be invoked');
-  }
-
-  @override
   bool visitTypeParameter(covariant TypeParameterImpl node) {
     if (identical(node.name, _oldNode)) {
       node.name = _newNode as SimpleIdentifier;
@@ -3186,10 +3234,3 @@
     return node.end < _position;
   }
 }
-
-/// A visitor used to write a source representation of a visited AST node (and
-/// all of it's children) to a sink.
-@Deprecated('Use ToSourceVisitor')
-class ToSourceVisitor2 extends ToSourceVisitor {
-  ToSourceVisitor2(StringSink sink) : super(sink);
-}
diff --git a/pkg/analyzer/lib/src/dart/constant/compute.dart b/pkg/analyzer/lib/src/dart/constant/compute.dart
index 295c41c..cb56ffe 100644
--- a/pkg/analyzer/lib/src/dart/constant/compute.dart
+++ b/pkg/analyzer/lib/src/dart/constant/compute.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -17,8 +17,8 @@
     TypeSystemImpl typeSystem,
     DeclaredVariables declaredVariables,
     List<ConstantEvaluationTarget> constants,
-    ExperimentStatus experimentStatus) {
-  var walker = _ConstantWalker(declaredVariables, experimentStatus);
+    FeatureSet featureSet) {
+  var walker = _ConstantWalker(declaredVariables, featureSet);
 
   for (var constant in constants) {
     var node = walker._getNode(constant);
@@ -47,10 +47,10 @@
 /// [graph.DependencyWalker] for computing constants and detecting cycles.
 class _ConstantWalker extends graph.DependencyWalker<_ConstantNode> {
   final DeclaredVariables declaredVariables;
-  final ExperimentStatus experimentStatus;
+  final FeatureSet featureSet;
   final Map<ConstantEvaluationTarget, _ConstantNode> nodeMap = {};
 
-  _ConstantWalker(this.declaredVariables, this.experimentStatus);
+  _ConstantWalker(this.declaredVariables, this.featureSet);
 
   @override
   void evaluate(_ConstantNode node) {
@@ -79,7 +79,7 @@
   ConstantEvaluationEngine _getEvaluationEngine(_ConstantNode node) {
     return ConstantEvaluationEngine(
       declaredVariables: declaredVariables,
-      isNonNullableByDefault: experimentStatus.non_nullable,
+      isNonNullableByDefault: featureSet.isEnabled(Feature.non_nullable),
     );
   }
 
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index ac9fbb1..514d859 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -220,7 +220,7 @@
           if (superclass != null && !superclass.isDartCoreObject) {
             var unnamedConstructor =
                 superclass.element.unnamedConstructor?.declaration;
-            if (unnamedConstructor != null) {
+            if (unnamedConstructor != null && unnamedConstructor.isConst) {
               callback(unnamedConstructor);
             }
           }
@@ -612,22 +612,20 @@
     }
 
     var conditionResultBool = conditionResult.toBoolValue();
-    if (conditionResultBool == null) {
-      node.thenExpression.accept(this);
-      node.elseExpression.accept(this);
-    } else if (conditionResultBool == true) {
+    if (conditionResultBool == true) {
       _reportNotPotentialConstants(node.elseExpression);
       return node.thenExpression.accept(this);
     } else if (conditionResultBool == false) {
       _reportNotPotentialConstants(node.thenExpression);
       return node.elseExpression.accept(this);
+    } else {
+      node.thenExpression.accept(this);
+      node.elseExpression.accept(this);
+      return DartObjectImpl.validWithUnknownValue(
+        typeSystem,
+        node.typeOrThrow,
+      );
     }
-
-    // We used to return an object with a known type and an unknown value, but
-    // we can't do that without evaluating both the 'then' and 'else'
-    // expressions, and we're not suppose to do that under lazy semantics. I'm
-    // not sure which failure mode is worse.
-    return null;
   }
 
   @override
@@ -643,7 +641,7 @@
     TypeAliasElement? viaTypeAlias;
     if (typeElement is TypeAliasElementImpl) {
       if (constructorFunctionType.typeFormals.isNotEmpty &&
-          !typeElement.isProperRename()) {
+          !typeElement.isProperRename) {
         // The type alias is not a proper rename of the aliased class, so
         // the constructor tear-off is distinct from the associated
         // constructor function of the aliased class.
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 4882359..62f7b47 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -172,7 +172,7 @@
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.isConst) {
       var constructor = node.constructorName.staticElement?.declaration;
-      if (constructor != null) {
+      if (constructor != null && constructor.isConst) {
         _callback(constructor);
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 094b8b6..b6c4de1 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -165,7 +165,7 @@
   /// Create an object to represent an unknown value.
   factory DartObjectImpl.validWithUnknownValue(
     TypeSystemImpl typeSystem,
-    ParameterizedType type,
+    DartType type,
   ) {
     if (type.element!.library!.isDartCore) {
       if (type.isDartCoreBool) {
@@ -518,6 +518,7 @@
     var typeSystem = TypeSystemImpl(
       implicitCasts: false,
       isNonNullableByDefault: false,
+      strictCasts: false,
       strictInference: false,
       typeProvider: typeProvider,
     );
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index d5bc77f..43e9949 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -34,9 +34,7 @@
     show Namespace, NamespaceBuilder;
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/generated/element_type_provider.dart';
-import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisContext, AnalysisOptionsImpl;
-import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
@@ -45,6 +43,7 @@
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/task/inference_error.dart';
+import 'package:collection/collection.dart';
 
 /// A concrete implementation of a [ClassElement].
 abstract class AbstractClassElementImpl extends _ExistingElementImpl
@@ -391,7 +390,7 @@
     // TODO (jwren) revisit- should we append '=' here or require clients to
     // include it?
     // Do we need the check for isSetter below?
-    if (!StringUtilities.endsWithChar(setterName, 0x3D)) {
+    if (!setterName.endsWith('=')) {
       setterName += '=';
     }
     for (PropertyAccessorElement accessor in accessors) {
@@ -927,6 +926,9 @@
         implicitConstructor.parameters = implicitParameters;
       }
       implicitConstructor.enclosingElement = this;
+      // TODO(scheglov) Why do we manually map parameters types above?
+      implicitConstructor.superConstructor =
+          ConstructorMember.from(superclassConstructor, supertype!);
 
       var isNamed = superclassConstructor.name.isNotEmpty;
       implicitConstructor.constantInitializers = [
@@ -1298,6 +1300,9 @@
   bool get hasInitializer => false;
 
   @override
+  bool get isEnumConstant => true;
+
+  @override
   Element get nonSynthetic => this;
 
   @override
@@ -1410,6 +1415,14 @@
 class ConstructorElementImpl extends ExecutableElementImpl
     with ConstructorElementMixin
     implements ConstructorElement {
+  /// The super-constructor which this constructor is invoking, or `null` if
+  /// this constructor is not generative, or is redirecting, or the
+  /// super-constructor is not resolved, or the enclosing class is `Object`.
+  ///
+  /// TODO(scheglov) We cannot have both super and redirecting constructors.
+  /// So, ideally we should have some kind of "either" or "variant" here.
+  ConstructorElement? _superConstructor;
+
   /// The constructor to which this constructor is redirecting.
   ConstructorElement? _redirectedConstructor;
 
@@ -1540,6 +1553,15 @@
     return (_returnType ??= enclosingElement.thisType) as InterfaceType;
   }
 
+  ConstructorElement? get superConstructor {
+    linkedData?.read(this);
+    return _superConstructor;
+  }
+
+  set superConstructor(ConstructorElement? superConstructor) {
+    _superConstructor = superConstructor;
+  }
+
   @override
   FunctionType get type => ElementTypeProvider.current.getExecutableType(this);
 
@@ -1572,9 +1594,8 @@
   /// of formal parameters, are evaluated.
   void computeConstantDependencies() {
     if (!isConstantEvaluated) {
-      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
       computeConstants(library.typeProvider, library.typeSystem,
-          context.declaredVariables, [this], analysisOptions.experimentStatus);
+          context.declaredVariables, [this], library.featureSet);
     }
   }
 }
@@ -1650,9 +1671,17 @@
   /// of this variable could not be computed because of errors.
   DartObject? computeConstantValue() {
     if (evaluationResult == null) {
-      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
-      computeConstants(library!.typeProvider, library!.typeSystem,
-          context.declaredVariables, [this], analysisOptions.experimentStatus);
+      final library = this.library;
+      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/47915
+      if (library == null) {
+        throw StateError(
+          '[library: null][this: ($runtimeType) $this]'
+          '[enclosingElement: $enclosingElement]'
+          '[reference: $reference]',
+        );
+      }
+      computeConstants(library.typeProvider, library.typeSystem,
+          context.declaredVariables, [this], library.featureSet);
     }
     return evaluationResult?.value;
   }
@@ -1700,6 +1729,26 @@
   }
 }
 
+class DefaultSuperFormalParameterElementImpl
+    extends SuperFormalParameterElementImpl with ConstVariableElement {
+  /// Initialize a newly created parameter element to have the given [name] and
+  /// [nameOffset].
+  DefaultSuperFormalParameterElementImpl({
+    required String name,
+    required int nameOffset,
+    required ParameterKind parameterKind,
+  }) : super(
+          name: name,
+          nameOffset: nameOffset,
+          parameterKind: parameterKind,
+        );
+
+  @override
+  String? get defaultValueCode {
+    return constantInitializer?.toSource();
+  }
+}
+
 /// The synthetic element representing the declaration of the type `dynamic`.
 class DynamicElementImpl extends ElementImpl implements TypeDefiningElement {
   /// Return the unique instance of this class.
@@ -1982,10 +2031,9 @@
   @override
   DartObject? computeConstantValue() {
     if (evaluationResult == null) {
-      var analysisOptions = context.analysisOptions as AnalysisOptionsImpl;
       var library = compilationUnit.library;
       computeConstants(library.typeProvider, library.typeSystem,
-          context.declaredVariables, [this], analysisOptions.experimentStatus);
+          context.declaredVariables, [this], library.featureSet);
     }
     return evaluationResult?.value;
   }
@@ -2033,6 +2081,10 @@
 
 /// A base class for concrete implementations of an [Element].
 abstract class ElementImpl implements Element {
+  static const _metadataFlag_isReady = 1 << 0;
+  static const _metadataFlag_hasDeprecated = 1 << 1;
+  static const _metadataFlag_hasOverride = 1 << 2;
+
   /// An Unicode right arrow.
   @deprecated
   static final String RIGHT_ARROW = " \u2192 ";
@@ -2061,6 +2113,9 @@
   /// A list containing all of the metadata associated with this element.
   List<ElementAnnotation> _metadata = const [];
 
+  /// Cached flags denoting presence of specific annotations in [_metadata].
+  int _metadataFlags = 0;
+
   /// A cached copy of the calculated hashCode for this element.
   int? _cachedHashCode;
 
@@ -2079,8 +2134,7 @@
 
   /// Initialize a newly created element to have the given [name] at the given
   /// [_nameOffset].
-  ElementImpl(String? name, this._nameOffset, {this.reference}) {
-    _name = name != null ? StringUtilities.intern(name) : null;
+  ElementImpl(this._name, this._nameOffset, {this.reference}) {
     reference?.element = this;
   }
 
@@ -2138,14 +2192,7 @@
 
   @override
   bool get hasDeprecated {
-    final metadata = this.metadata;
-    for (var i = 0; i < metadata.length; i++) {
-      var annotation = metadata[i];
-      if (annotation.isDeprecated) {
-        return true;
-      }
-    }
-    return false;
+    return (_getMetadataFlags() & _metadataFlag_hasDeprecated) != 0;
   }
 
   @override
@@ -2277,14 +2324,7 @@
 
   @override
   bool get hasOverride {
-    final metadata = this.metadata;
-    for (var i = 0; i < metadata.length; i++) {
-      var annotation = metadata[i];
-      if (annotation.isOverride) {
-        return true;
-      }
-    }
-    return false;
+    return (_getMetadataFlags() & _metadataFlag_hasOverride) != 0;
   }
 
   /// Return `true` if this element has an annotation of the form
@@ -2561,7 +2601,9 @@
   }
 
   @override
-  E thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate) {
+  E thisOrAncestorMatching<E extends Element>(
+    bool Function(Element) predicate,
+  ) {
     Element? element = this;
     while (element != null && !predicate(element)) {
       element = element.enclosingElement;
@@ -2587,6 +2629,29 @@
   void visitChildren(ElementVisitor visitor) {
     // There are no children to visit
   }
+
+  /// Return flags that denote presence of a few specific annotations.
+  int _getMetadataFlags() {
+    var result = _metadataFlags;
+
+    // Has at least `_metadataFlag_isReady`.
+    if (result != 0) {
+      return result;
+    }
+
+    final metadata = this.metadata;
+    for (var i = 0; i < metadata.length; i++) {
+      var annotation = metadata[i];
+      if (annotation.isDeprecated) {
+        result |= _metadataFlag_hasDeprecated;
+      } else if (annotation.isOverride) {
+        result |= _metadataFlag_hasOverride;
+      }
+    }
+
+    result |= _metadataFlag_isReady;
+    return _metadataFlags = result;
+  }
 }
 
 /// Abstract base class for elements whose type is guaranteed to be a function
@@ -2775,10 +2840,7 @@
   bool get hasStaticMember => true;
 
   @override
-  List<InterfaceType> get interfaces {
-    var enumType = library.typeProvider.enumType;
-    return enumType != null ? <InterfaceType>[enumType] : const [];
-  }
+  List<InterfaceType> get interfaces => const [];
 
   @override
   bool get isAbstract => false;
@@ -2819,7 +2881,10 @@
   }
 
   @override
-  InterfaceType get supertype => library.typeProvider.objectType;
+  InterfaceType get supertype {
+    var enumType = library.typeProvider.enumType;
+    return enumType ?? library.typeProvider.objectType;
+  }
 
   @override
   List<TypeParameterElement> get typeParameters =>
@@ -3272,10 +3337,7 @@
   }
 
   @override
-  bool get isEnumConstant =>
-      enclosingElement is ClassElement &&
-      (enclosingElement as ClassElement).isEnum &&
-      !isSynthetic;
+  bool get isEnumConstant => false;
 
   @override
   bool get isExternal {
@@ -4605,8 +4667,11 @@
   }
 
   @override
-  E? thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate) =>
-      null;
+  E? thisOrAncestorMatching<E extends Element>(
+    bool Function(Element) predicate,
+  ) {
+    return null;
+  }
 
   @override
   E? thisOrAncestorOfType<E extends Element>() => null;
@@ -4711,8 +4776,8 @@
   @override
   final ParameterKind parameterKind;
 
-  /// The Dart code of the default value.
-  String? _defaultValueCode;
+  @override
+  String? defaultValueCode;
 
   /// True if this parameter inherits from a covariant parameter. This happens
   /// when it overrides a method in a supertype that has a corresponding
@@ -4744,18 +4809,6 @@
   ParameterElement get declaration => this;
 
   @override
-  String? get defaultValueCode {
-    return _defaultValueCode;
-  }
-
-  /// Set Dart code of the default value.
-  set defaultValueCode(String? defaultValueCode) {
-    _defaultValueCode = defaultValueCode != null
-        ? StringUtilities.intern(defaultValueCode)
-        : null;
-  }
-
-  @override
   bool get hasDefaultValue {
     return defaultValueCode != null;
   }
@@ -4786,6 +4839,9 @@
   bool get isLate => false;
 
   @override
+  bool get isSuperFormal => false;
+
+  @override
   ElementKind get kind => ElementKind.PARAMETER;
 
   @override
@@ -5399,6 +5455,56 @@
   }
 }
 
+class SuperFormalParameterElementImpl extends ParameterElementImpl
+    implements SuperFormalParameterElement {
+  /// Initialize a newly created parameter element to have the given [name] and
+  /// [nameOffset].
+  SuperFormalParameterElementImpl({
+    required String name,
+    required int nameOffset,
+    required ParameterKind parameterKind,
+  }) : super(
+          name: name,
+          nameOffset: nameOffset,
+          parameterKind: parameterKind,
+        );
+
+  /// Super parameters are visible only in the initializer list scope,
+  /// and introduce final variables.
+  @override
+  bool get isFinal => true;
+
+  @override
+  bool get isSuperFormal => true;
+
+  @override
+  ParameterElement? get superConstructorParameter {
+    final enclosingElement = this.enclosingElement;
+    if (enclosingElement is ConstructorElementImpl) {
+      var superConstructor = enclosingElement.superConstructor;
+      if (superConstructor != null) {
+        var superParameters = superConstructor.parameters;
+        if (isNamed) {
+          return superParameters.firstWhereOrNull((e) => e.name == name);
+        } else {
+          var index = enclosingElement.parameters
+              .whereType<SuperFormalParameterElementImpl>()
+              .toList()
+              .indexOf(this);
+          if (index >= 0 && index < superParameters.length) {
+            return superParameters[index];
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  T? accept<T>(ElementVisitor<T> visitor) =>
+      visitor.visitSuperFormalParameterElement(this);
+}
+
 /// A concrete implementation of a [TopLevelVariableElement].
 class TopLevelVariableElementImpl extends PropertyInducingElementImpl
     implements TopLevelVariableElement {
@@ -5482,6 +5588,34 @@
   CompilationUnitElement get enclosingElement =>
       super.enclosingElement as CompilationUnitElement;
 
+  /// Returns whether this alias is a "proper rename" of [aliasedClass], as
+  /// defined in the constructor-tearoffs specification.
+  bool get isProperRename {
+    var aliasedType_ = aliasedType;
+    if (aliasedType_ is! InterfaceType) {
+      return false;
+    }
+    var aliasedClass = aliasedType_.element;
+    var typeArguments = aliasedType_.typeArguments;
+    var typeParameterCount = typeParameters.length;
+    if (typeParameterCount != aliasedClass.typeParameters.length) {
+      return false;
+    }
+    for (var i = 0; i < typeParameterCount; i++) {
+      var bound = typeParameters[i].bound ?? library.typeProvider.dynamicType;
+      var aliasedBound = aliasedClass.typeParameters[i].bound ??
+          library.typeProvider.dynamicType;
+      if (!library.typeSystem.isSubtypeOf(bound, aliasedBound) ||
+          !library.typeSystem.isSubtypeOf(aliasedBound, bound)) {
+        return false;
+      }
+      if (typeParameters[i] != typeArguments[i].element) {
+        return false;
+      }
+    }
+    return true;
+  }
+
   @override
   ElementKind get kind {
     if (isNonFunctionTypeAliasesEnabled) {
@@ -5582,37 +5716,6 @@
     }
   }
 
-  /// Returns whether this alias is a "proper rename" of [aliasedClass], as
-  /// defined in the constructor-tearoffs specification.
-  bool isProperRename() {
-    var aliasedType_ = aliasedType;
-    if (aliasedType_ is! InterfaceType) {
-      return false;
-    }
-    var aliasedClass = aliasedType_.element;
-    var typeArguments = aliasedType_.typeArguments;
-    var typeParameterCount = typeParameters.length;
-    if (typeParameterCount != aliasedClass.typeParameters.length) {
-      return false;
-    }
-    if (typeParameterCount != typeArguments.length) {
-      return false;
-    }
-    for (var i = 0; i < typeParameterCount; i++) {
-      var bound = typeParameters[i].bound ?? library.typeProvider.dynamicType;
-      var aliasedBound = aliasedClass.typeParameters[i].bound ??
-          library.typeProvider.dynamicType;
-      if (!library.typeSystem.isSubtypeOf(bound, aliasedBound) ||
-          !library.typeSystem.isSubtypeOf(aliasedBound, bound)) {
-        return false;
-      }
-      if (typeParameters[i] != typeArguments[i].element) {
-        return false;
-      }
-    }
-    return true;
-  }
-
   void setLinkedData(Reference reference, ElementLinkedData linkedData) {
     this.reference = reference;
     reference.element = this;
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 6eaa94a..ad00f5e 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -6,25 +6,60 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:meta/meta_meta.dart';
+
+extension ElementAnnotationExtensions on ElementAnnotation {
+  static final Map<String, TargetKind> _targetKindsByName = {
+    for (final kind in TargetKind.values) kind.toString(): kind,
+  };
+
+  /// Return the target kinds defined for this [ElementAnnotation].
+  Set<TargetKind> get targetKinds {
+    final element = this.element;
+    ClassElement? classElement;
+    if (element is PropertyAccessorElement) {
+      if (element.isGetter) {
+        var type = element.returnType;
+        if (type is InterfaceType) {
+          classElement = type.element;
+        }
+      }
+    } else if (element is ConstructorElement) {
+      classElement = element.enclosingElement;
+    }
+    if (classElement == null) {
+      return const <TargetKind>{};
+    }
+    for (var annotation in classElement.metadata) {
+      if (annotation.isTarget) {
+        var value = annotation.computeConstantValue()!;
+        var kinds = <TargetKind>{};
+
+        for (var kindObject in value.getField('kinds')!.toSetValue()!) {
+          // We can't directly translate the index from the analyzed TargetKind
+          // constant to TargetKinds.values because the analyzer from the SDK
+          // may have been compiled with a different version of pkg:meta.
+          var index = kindObject.getField('index')!.toIntValue()!;
+          var targetKindClass =
+              (kindObject.type as InterfaceType).element as EnumElementImpl;
+          // Instead, map constants to their TargetKind by comparing getter
+          // names.
+          var getter = targetKindClass.constants[index];
+          var name = 'TargetKind.${getter.name}';
+
+          var foundTargetKind = _targetKindsByName[name];
+          if (foundTargetKind != null) {
+            kinds.add(foundTargetKind);
+          }
+        }
+        return kinds;
+      }
+    }
+    return const <TargetKind>{};
+  }
+}
 
 extension ElementExtension on Element {
-  /// Return `true` if this element is an instance member of a class or mixin.
-  ///
-  /// Only [MethodElement]s and [PropertyAccessorElement]s are supported.
-  /// We intentionally exclude [ConstructorElement]s - they can only be
-  /// invoked in instance creation expressions, and [FieldElement]s - they
-  /// cannot be invoked directly and are always accessed using corresponding
-  /// [PropertyAccessorElement]s.
-  bool get isInstanceMember {
-    var this_ = this;
-    var enclosing = this_.enclosingElement;
-    if (enclosing is ClassElement) {
-      return this_ is MethodElement && !this_.isStatic ||
-          this_ is PropertyAccessorElement && !this_.isStatic;
-    }
-    return false;
-  }
-
   /// Return `true` if this element, the enclosing class (if there is one), or
   /// the enclosing library, has been annotated with the `@doNotStore`
   /// annotation.
@@ -49,6 +84,23 @@
     return ancestor is CompilationUnitElement &&
         ancestor.enclosingElement.hasDoNotStore;
   }
+
+  /// Return `true` if this element is an instance member of a class or mixin.
+  ///
+  /// Only [MethodElement]s and [PropertyAccessorElement]s are supported.
+  /// We intentionally exclude [ConstructorElement]s - they can only be
+  /// invoked in instance creation expressions, and [FieldElement]s - they
+  /// cannot be invoked directly and are always accessed using corresponding
+  /// [PropertyAccessorElement]s.
+  bool get isInstanceMember {
+    var this_ = this;
+    var enclosing = this_.enclosingElement;
+    if (enclosing is ClassElement) {
+      return this_ is MethodElement && !this_.isStatic ||
+          this_ is PropertyAccessorElement && !this_.isStatic;
+    }
+    return false;
+  }
 }
 
 extension ParameterElementExtensions on ParameterElement {
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index cf52a23..168cc9a 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -401,7 +401,9 @@
       }
     }
 
-    if (getter != null && method != null) {
+    if (getter == null || method == null) {
+      return null;
+    } else {
       return GetterMethodConflict(name: name, getter: getter, method: method);
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 88dd044..f6195f1 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
@@ -612,8 +611,11 @@
   }
 
   @override
-  E? thisOrAncestorMatching<E extends Element>(Predicate<Element> predicate) =>
-      declaration.thisOrAncestorMatching(predicate);
+  E? thisOrAncestorMatching<E extends Element>(
+    bool Function(Element) predicate,
+  ) {
+    return declaration.thisOrAncestorMatching(predicate);
+  }
 
   @override
   E? thisOrAncestorOfType<E extends Element>() =>
@@ -840,6 +842,9 @@
   bool get isInitializingFormal => declaration.isInitializingFormal;
 
   @override
+  bool get isSuperFormal => declaration.isSuperFormal;
+
+  @override
   String get name => declaration.name;
 
   @deprecated
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 7561115..70f398c 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:collection';
-
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
@@ -20,27 +18,6 @@
 import 'package:analyzer/src/generated/element_type_provider.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 
-/// Transforms the given [list] by applying [transform] to all its elements.
-///
-/// If no changes are made (i.e. the return value of [transform] is identical
-/// to its parameter each time it is invoked), the original list is returned.
-List<T> _transformOrShare<T>(List<T> list, T Function(T) transform) {
-  var length = list.length;
-  for (int i = 0; i < length; i++) {
-    var item = list[i];
-    var transformed = transform(item);
-    if (!identical(item, transformed)) {
-      var newList = list.toList();
-      newList[i] = transformed;
-      for (i++; i < length; i++) {
-        newList[i] = transform(list[i]);
-      }
-      return newList;
-    }
-  }
-  return list;
-}
-
 /// The [Type] representing the type `dynamic`.
 class DynamicTypeImpl extends TypeImpl implements DynamicType {
   /// The unique instance of this class.
@@ -247,16 +224,12 @@
 
     var substitution = Substitution.fromPairs(typeFormals, argumentTypes);
 
-    ParameterElement transformParameter(ParameterElement p) {
-      return p.copyWith(
-        type: substitution.substituteType(p.type),
-      );
-    }
-
     return FunctionTypeImpl(
       returnType: substitution.substituteType(returnType),
       typeFormals: const [],
-      parameters: _transformOrShare(parameters, transformParameter),
+      parameters: parameters
+          .map((p) => p.copyWith(type: substitution.substituteType(p.type)))
+          .toList(),
       nullabilitySuffix: nullabilitySuffix,
     );
   }
@@ -544,6 +517,11 @@
   }
 
   @override
+  bool get isDartAsyncStream {
+    return element.name == "Stream" && element.library.isDartAsync;
+  }
+
+  @override
   bool get isDartCoreBool {
     return element.name == "bool" && element.library.isDartCore;
   }
@@ -731,17 +709,6 @@
     return ConstructorMember.from(constructorElement, this);
   }
 
-  @deprecated
-  @override
-  PropertyAccessorElement? lookUpGetter(
-      String getterName, LibraryElement? library) {
-    var element = getGetter(getterName);
-    if (element != null && element.isAccessibleIn(library)) {
-      return element;
-    }
-    return lookUpGetterInSuperclass(getterName, library);
-  }
-
   @override
   PropertyAccessorElement? lookUpGetter2(
     String name,
@@ -781,211 +748,6 @@
     return null;
   }
 
-  @deprecated
-  @override
-  PropertyAccessorElement? lookUpGetterInSuperclass(
-      String getterName, LibraryElement? library) {
-    for (InterfaceType mixin in mixins.reversed) {
-      var element = mixin.getGetter(getterName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-    }
-    for (InterfaceType constraint in superclassConstraints) {
-      var element = constraint.getGetter(getterName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-    }
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-    var supertype = superclass;
-    var supertypeElement = supertype?.element;
-    while (supertype != null &&
-        supertypeElement != null &&
-        !visitedClasses.contains(supertypeElement)) {
-      visitedClasses.add(supertypeElement);
-      var element = supertype.getGetter(getterName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-      for (InterfaceType mixin in supertype.mixins.reversed) {
-        element = mixin.getGetter(getterName);
-        if (element != null && element.isAccessibleIn(library)) {
-          return element;
-        }
-      }
-      supertype = supertype.superclass;
-      supertypeElement = supertype?.element;
-    }
-    return null;
-  }
-
-  @deprecated
-  @override
-  PropertyAccessorElement? lookUpInheritedGetter(String name,
-      {LibraryElement? library, bool thisType = true}) {
-    PropertyAccessorElement? result;
-    if (thisType) {
-      result = lookUpGetter(name, library);
-    } else {
-      result = lookUpGetterInSuperclass(name, library);
-    }
-    if (result != null) {
-      return result;
-    }
-    return _lookUpMemberInInterfaces(this, false, library,
-        HashSet<ClassElement>(), (InterfaceType t) => t.getGetter(name));
-  }
-
-  @deprecated
-  @override
-  ExecutableElement? lookUpInheritedGetterOrMethod(String name,
-      {LibraryElement? library}) {
-    var result = lookUpGetter(name, library) ?? lookUpMethod(name, library);
-
-    if (result != null) {
-      return result;
-    }
-    return _lookUpMemberInInterfaces(
-        this,
-        false,
-        library,
-        HashSet<ClassElement>(),
-        (InterfaceType t) => t.getGetter(name) ?? t.getMethod(name));
-  }
-
-  @deprecated
-  ExecutableElement? lookUpInheritedMember(String name, LibraryElement library,
-      {bool concrete = false,
-      bool forSuperInvocation = false,
-      int? startMixinIndex,
-      bool setter = false,
-      bool thisType = false}) {
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-
-    /// TODO(scheglov) Remove [includeSupers]. It is used only to work around
-    /// the problem with Flutter code base (using old super-mixins).
-    ExecutableElement? lookUpImpl(InterfaceType? type,
-        {bool acceptAbstract = false,
-        bool includeType = true,
-        bool inMixin = false,
-        int? startMixinIndex}) {
-      if (type == null || !visitedClasses.add(type.element)) {
-        return null;
-      }
-
-      if (includeType) {
-        ExecutableElement? result;
-        if (setter) {
-          result = type.getSetter(name);
-        } else {
-          result = type.getMethod(name);
-          result ??= type.getGetter(name);
-        }
-        if (result != null && result.isAccessibleIn(library)) {
-          if (!concrete || acceptAbstract || !result.isAbstract) {
-            return result;
-          }
-        }
-      }
-
-      if (!inMixin || acceptAbstract) {
-        var mixins = type.mixins;
-        startMixinIndex ??= mixins.length;
-        for (var i = startMixinIndex - 1; i >= 0; i--) {
-          var result = lookUpImpl(
-            mixins[i],
-            acceptAbstract: acceptAbstract,
-            inMixin: true,
-          );
-          if (result != null) {
-            return result;
-          }
-        }
-      }
-
-      // We were not able to find the concrete dispatch target.
-      // It is OK to look into interfaces, we need just some resolution now.
-      if (!concrete) {
-        for (InterfaceType mixin in type.interfaces) {
-          var result = lookUpImpl(mixin, acceptAbstract: acceptAbstract);
-          if (result != null) {
-            return result;
-          }
-        }
-      }
-
-      if (!inMixin || acceptAbstract) {
-        return lookUpImpl(type.superclass,
-            acceptAbstract: acceptAbstract, inMixin: inMixin);
-      }
-
-      return null;
-    }
-
-    if (element.isMixin) {
-      // TODO(scheglov) We should choose the most specific signature.
-      // Not just the first signature.
-      for (InterfaceType constraint in superclassConstraints) {
-        var result = lookUpImpl(constraint, acceptAbstract: true);
-        if (result != null) {
-          return result;
-        }
-      }
-      return null;
-    } else {
-      return lookUpImpl(
-        this,
-        includeType: thisType,
-        startMixinIndex: startMixinIndex,
-      );
-    }
-  }
-
-  @deprecated
-  @override
-  MethodElement? lookUpInheritedMethod(String name,
-      {LibraryElement? library, bool thisType = true}) {
-    MethodElement? result;
-    if (thisType) {
-      result = lookUpMethod(name, library);
-    } else {
-      result = lookUpMethodInSuperclass(name, library);
-    }
-    if (result != null) {
-      return result;
-    }
-    return _lookUpMemberInInterfaces(this, false, library,
-        HashSet<ClassElement>(), (InterfaceType t) => t.getMethod(name));
-  }
-
-  @deprecated
-  @override
-  PropertyAccessorElement? lookUpInheritedSetter(String name,
-      {LibraryElement? library, bool thisType = true}) {
-    PropertyAccessorElement? result;
-    if (thisType) {
-      result = lookUpSetter(name, library);
-    } else {
-      result = lookUpSetterInSuperclass(name, library);
-    }
-    if (result != null) {
-      return result;
-    }
-    return _lookUpMemberInInterfaces(this, false, library,
-        HashSet<ClassElement>(), (t) => t.getSetter(name));
-  }
-
-  @deprecated
-  @override
-  MethodElement? lookUpMethod(String methodName, LibraryElement? library) {
-    var element = getMethod(methodName);
-    if (element != null && element.isAccessibleIn(library)) {
-      return element;
-    }
-    return lookUpMethodInSuperclass(methodName, library);
-  }
-
   @override
   MethodElement? lookUpMethod2(
     String name,
@@ -1025,56 +787,6 @@
     return null;
   }
 
-  @deprecated
-  @override
-  MethodElement? lookUpMethodInSuperclass(
-      String methodName, LibraryElement? library) {
-    for (InterfaceType mixin in mixins.reversed) {
-      var element = mixin.getMethod(methodName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-    }
-    for (InterfaceType constraint in superclassConstraints) {
-      var element = constraint.getMethod(methodName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-    }
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-    var supertype = superclass;
-    var supertypeElement = supertype?.element;
-    while (supertype != null &&
-        supertypeElement != null &&
-        !visitedClasses.contains(supertypeElement)) {
-      visitedClasses.add(supertypeElement);
-      var element = supertype.getMethod(methodName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-      for (InterfaceType mixin in supertype.mixins.reversed) {
-        element = mixin.getMethod(methodName);
-        if (element != null && element.isAccessibleIn(library)) {
-          return element;
-        }
-      }
-      supertype = supertype.superclass;
-      supertypeElement = supertype?.element;
-    }
-    return null;
-  }
-
-  @deprecated
-  @override
-  PropertyAccessorElement? lookUpSetter(
-      String setterName, LibraryElement? library) {
-    var element = getSetter(setterName);
-    if (element != null && element.isAccessibleIn(library)) {
-      return element;
-    }
-    return lookUpSetterInSuperclass(setterName, library);
-  }
-
   @override
   PropertyAccessorElement? lookUpSetter2(
     String name,
@@ -1114,45 +826,6 @@
     return null;
   }
 
-  @deprecated
-  @override
-  PropertyAccessorElement? lookUpSetterInSuperclass(
-      String setterName, LibraryElement? library) {
-    for (InterfaceType mixin in mixins.reversed) {
-      var element = mixin.getSetter(setterName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-    }
-    for (InterfaceType constraint in superclassConstraints) {
-      var element = constraint.getSetter(setterName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-    }
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
-    var supertype = superclass;
-    var supertypeElement = supertype?.element;
-    while (supertype != null &&
-        supertypeElement != null &&
-        !visitedClasses.contains(supertypeElement)) {
-      visitedClasses.add(supertypeElement);
-      var element = supertype.getSetter(setterName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-      for (InterfaceType mixin in supertype.mixins.reversed) {
-        element = mixin.getSetter(setterName);
-        if (element != null && element.isAccessibleIn(library)) {
-          return element;
-        }
-      }
-      supertype = supertype.superclass;
-      supertypeElement = supertype?.element;
-    }
-    return null;
-  }
-
   @override
   bool referencesAny(Set<TypeParameterElement> parameters) {
     return typeArguments.any((argument) {
@@ -1185,140 +858,6 @@
     }
     return result;
   }
-
-  /// Returns a "smart" version of the "least upper bound" of the given types.
-  ///
-  /// If these types have the same element and differ only in terms of the type
-  /// arguments, attempts to find a compatible set of type arguments.
-  ///
-  /// Otherwise, calls [DartType.getLeastUpperBound].
-  @Deprecated('Use TypeSystem.leastUpperBound instead')
-  static InterfaceType getSmartLeastUpperBound(
-      InterfaceType first, InterfaceType second) {
-    // TODO(paulberry): this needs to be deprecated and replaced with a method
-    // in [TypeSystem], since it relies on the deprecated functionality of
-    // [DartType.getLeastUpperBound].
-    if (first.element == second.element) {
-      return _leastUpperBound(first, second);
-    }
-    var typeSystem = first.element.library.typeSystem as TypeSystemImpl;
-    return typeSystem.getLeastUpperBound(first, second) as InterfaceType;
-  }
-
-  /// Return the "least upper bound" of the given types under the assumption
-  /// that the types have the same element and differ only in terms of the type
-  /// arguments.
-  ///
-  /// The resulting type is composed by comparing the corresponding type
-  /// arguments, keeping those that are the same, and using 'dynamic' for those
-  /// that are different.
-  static InterfaceType _leastUpperBound(
-      InterfaceType firstType, InterfaceType secondType) {
-    ClassElement firstElement = firstType.element;
-    ClassElement secondElement = secondType.element;
-    if (firstElement != secondElement) {
-      throw ArgumentError('The same elements expected, but '
-          '$firstElement and $secondElement are given.');
-    }
-    if (firstType == secondType) {
-      return firstType;
-    }
-    List<DartType> firstArguments = firstType.typeArguments;
-    List<DartType> secondArguments = secondType.typeArguments;
-    int argumentCount = firstArguments.length;
-    if (argumentCount == 0) {
-      return firstType;
-    }
-    var lubArguments = List<DartType>.filled(
-      argumentCount,
-      DynamicTypeImpl.instance,
-    );
-    for (int i = 0; i < argumentCount; i++) {
-      //
-      // Ideally we would take the least upper bound of the two argument types,
-      // but this can cause an infinite recursion (such as when finding the
-      // least upper bound of String and num).
-      //
-      if (firstArguments[i] == secondArguments[i]) {
-        lubArguments[i] = firstArguments[i];
-      }
-    }
-
-    NullabilitySuffix computeNullability() {
-      NullabilitySuffix first = firstType.nullabilitySuffix;
-      NullabilitySuffix second = secondType.nullabilitySuffix;
-      if (first == NullabilitySuffix.question ||
-          second == NullabilitySuffix.question) {
-        return NullabilitySuffix.question;
-      } else if (first == NullabilitySuffix.star ||
-          second == NullabilitySuffix.star) {
-        return NullabilitySuffix.star;
-      }
-      return NullabilitySuffix.none;
-    }
-
-    return InterfaceTypeImpl(
-      element: firstElement,
-      typeArguments: lubArguments,
-      nullabilitySuffix: computeNullability(),
-    );
-  }
-
-  /// Look up the getter with the given name in the interfaces implemented by
-  /// the given [targetType], either directly or indirectly. Return the element
-  /// representing the getter that was found, or `null` if there is no getter
-  /// with the given name. The flag [includeTargetType] should be `true` if the
-  /// search should include the target type. The [visitedInterfaces] is a set
-  /// containing all of the interfaces that have been examined, used to prevent
-  /// infinite recursion and to optimize the search.
-  static T? _lookUpMemberInInterfaces<T extends ExecutableElement>(
-      InterfaceType targetType,
-      bool includeTargetType,
-      LibraryElement? library,
-      HashSet<ClassElement> visitedInterfaces,
-      T? Function(InterfaceType type) getMember) {
-    // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the
-    // specification (titled "Inheritance and Overriding" under "Interfaces")
-    // describes a much more complex scheme for finding the inherited member.
-    // We need to follow that scheme. The code below should cover the 80% case.
-    ClassElement targetClass = targetType.element;
-    if (!visitedInterfaces.add(targetClass)) {
-      return null;
-    }
-    if (includeTargetType) {
-      var member = getMember(targetType);
-      if (member != null && member.isAccessibleIn(library)) {
-        return member;
-      }
-    }
-    for (InterfaceType interfaceType in targetType.interfaces) {
-      var member = _lookUpMemberInInterfaces(
-          interfaceType, true, library, visitedInterfaces, getMember);
-      if (member != null) {
-        return member;
-      }
-    }
-    for (InterfaceType constraint in targetType.superclassConstraints) {
-      var member = _lookUpMemberInInterfaces(
-          constraint, true, library, visitedInterfaces, getMember);
-      if (member != null) {
-        return member;
-      }
-    }
-    for (InterfaceType mixinType in targetType.mixins.reversed) {
-      var member = _lookUpMemberInInterfaces(
-          mixinType, true, library, visitedInterfaces, getMember);
-      if (member != null) {
-        return member;
-      }
-    }
-    var superclass = targetType.superclass;
-    if (superclass == null) {
-      return null;
-    }
-    return _lookUpMemberInInterfaces(
-        superclass, true, library, visitedInterfaces, getMember);
-  }
 }
 
 /// The type `Never` represents the uninhabited bottom type.
@@ -1418,18 +957,6 @@
   /// Initialize a newly created type to be declared by the given [element].
   TypeImpl(this._element, {this.alias});
 
-  @Deprecated('Use alias instead')
-  @override
-  List<DartType>? get aliasArguments {
-    return alias?.typeArguments;
-  }
-
-  @Deprecated('Use alias instead')
-  @override
-  TypeAliasElement? get aliasElement {
-    return alias?.element;
-  }
-
   @deprecated
   @override
   String get displayName {
@@ -1452,6 +979,9 @@
   bool get isDartAsyncFutureOr => false;
 
   @override
+  bool get isDartAsyncStream => false;
+
+  @override
   bool get isDartCoreBool => false;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index 1ffe3d4..5e1389e 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -567,12 +567,13 @@
   InstantiatedTypeAliasElementImpl? _mapAlias(
     InstantiatedTypeAliasElement? alias,
   ) {
-    if (alias != null) {
-      return InstantiatedTypeAliasElementImpl(
-        element: alias.element,
-        typeArguments: _mapList(alias.typeArguments),
-      );
+    if (alias == null) {
+      return null;
     }
+    return InstantiatedTypeAliasElementImpl(
+      element: alias.element,
+      typeArguments: _mapList(alias.typeArguments),
+    );
   }
 
   List<DartType> _mapList(List<DartType> types) {
diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart
index 948b8c448..15242b5 100644
--- a/pkg/analyzer/lib/src/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart
@@ -149,8 +149,6 @@
 
   InterfaceType? _nullStar;
 
-  Set<ClassElement>? _nonSubtypableClasses;
-
   /// Initialize a newly created type provider to provide the types defined in
   /// the given [coreLibrary] and [asyncLibrary].
   TypeProviderImpl({
@@ -353,18 +351,6 @@
       ? NeverTypeImpl.instance
       : NeverTypeImpl.instanceLegacy;
 
-  @Deprecated('Use isNonSubtypableClass instead')
-  @override
-  Set<ClassElement> get nonSubtypableClasses => _nonSubtypableClasses ??= {
-        boolElement,
-        doubleElement,
-        futureOrElement,
-        intElement,
-        nullElement,
-        numElement,
-        stringElement,
-      };
-
   @override
   ClassElement get nullElement {
     return _nullElement ??= _getClassElement(_coreLibrary, 'Null');
@@ -473,12 +459,6 @@
     );
   }
 
-  @Deprecated('Use futureOrType instead')
-  @override
-  InterfaceType futureOrType2(DartType valueType) {
-    return futureOrType(valueType);
-  }
-
   @override
   InterfaceType futureType(DartType valueType) {
     return futureElement.instantiate(
@@ -487,12 +467,6 @@
     );
   }
 
-  @Deprecated('Use futureType instead')
-  @override
-  InterfaceType futureType2(DartType valueType) {
-    return futureType(valueType);
-  }
-
   @override
   bool isNonSubtypableClass(ClassElement element) {
     var name = element.name;
@@ -512,12 +486,6 @@
     );
   }
 
-  @Deprecated('Use iterableType instead')
-  @override
-  InterfaceType iterableType2(DartType elementType) {
-    return iterableType(elementType);
-  }
-
   @override
   InterfaceType listType(DartType elementType) {
     return listElement.instantiate(
@@ -526,12 +494,6 @@
     );
   }
 
-  @Deprecated('Use listType instead')
-  @override
-  InterfaceType listType2(DartType elementType) {
-    return listType(elementType);
-  }
-
   @override
   InterfaceType mapType(DartType keyType, DartType valueType) {
     return mapElement.instantiate(
@@ -540,12 +502,6 @@
     );
   }
 
-  @Deprecated('Use mapType instead')
-  @override
-  InterfaceType mapType2(DartType keyType, DartType valueType) {
-    return mapType(keyType, valueType);
-  }
-
   @override
   InterfaceType setType(DartType elementType) {
     return setElement.instantiate(
@@ -554,12 +510,6 @@
     );
   }
 
-  @Deprecated('Use setType instead')
-  @override
-  InterfaceType setType2(DartType elementType) {
-    return setType(elementType);
-  }
-
   @override
   InterfaceType streamType(DartType elementType) {
     return streamElement.instantiate(
@@ -568,12 +518,6 @@
     );
   }
 
-  @Deprecated('Use streamType instead')
-  @override
-  InterfaceType streamType2(DartType elementType) {
-    return streamType(elementType);
-  }
-
   /// Return the class with the given [name] from the given [library], or
   /// throw a [StateError] if there is no class with the given name.
   ClassElement _getClassElement(LibraryElement library, String name) {
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index ef329f4..b38a654 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -45,6 +45,11 @@
   /// This affects the behavior of [isAssignableTo].
   bool implicitCasts;
 
+  /// True if "strict casts" should be enforced.
+  ///
+  /// This affects the behavior of [isAssignableTo].
+  bool strictCasts;
+
   /// A flag indicating whether inference failures are allowed, off by default.
   ///
   /// This option is experimental and subject to change.
@@ -71,6 +76,7 @@
   TypeSystemImpl({
     required this.implicitCasts,
     required this.isNonNullableByDefault,
+    required this.strictCasts,
     required this.strictInference,
     required TypeProvider typeProvider,
   }) : typeProvider = typeProvider as TypeProviderImpl {
@@ -699,9 +705,10 @@
       }
     }
 
-    // First make sure --no-implicit-casts disables all downcasts, including
-    // dynamic casts.
-    if (!implicitCasts) {
+    // First make sure that the static analysis options, `implicit-casts: false`
+    // and `strict-casts: true` disable all downcasts, including casts from
+    // `dynamic`.
+    if (!implicitCasts || strictCasts) {
       return false;
     }
 
@@ -1537,9 +1544,11 @@
 
   void updateOptions({
     required bool implicitCasts,
+    required bool strictCasts,
     required bool strictInference,
   }) {
     this.implicitCasts = implicitCasts;
+    this.strictCasts = strictCasts;
     this.strictInference = strictInference;
   }
 
diff --git a/pkg/analyzer/lib/src/dart/error/ffi_code.g.dart b/pkg/analyzer/lib/src/dart/error/ffi_code.g.dart
index 4264f45..620289c 100644
--- a/pkg/analyzer/lib/src/dart/error/ffi_code.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/ffi_code.g.dart
@@ -18,9 +18,56 @@
   /**
    * No parameters.
    */
+  static const FfiCode ABI_SPECIFIC_INTEGER_INVALID = FfiCode(
+    'ABI_SPECIFIC_INTEGER_INVALID',
+    "Classes extending 'AbiSpecificInteger' must have exactly one const "
+        "constructor, no other members, and no type arguments.",
+    correctionMessage:
+        "Try removing all type arguments, removing all members, and adding one "
+        "const constructor.",
+  );
+
+  /**
+   * No parameters.
+   */
+  static const FfiCode ABI_SPECIFIC_INTEGER_MAPPING_EXTRA = FfiCode(
+    'ABI_SPECIFIC_INTEGER_MAPPING_EXTRA',
+    "Classes extending 'AbiSpecificInteger' must have exactly one "
+        "'AbiSpecificIntegerMapping' annotation specifying the mapping from "
+        "ABI to a 'NativeType' integer with a fixed size.",
+    correctionMessage: "Try removing the extra annotation.",
+  );
+
+  /**
+   * No parameters.
+   */
+  static const FfiCode ABI_SPECIFIC_INTEGER_MAPPING_MISSING = FfiCode(
+    'ABI_SPECIFIC_INTEGER_MAPPING_MISSING',
+    "Classes extending 'AbiSpecificInteger' must have exactly one "
+        "'AbiSpecificIntegerMapping' annotation specifying the mapping from "
+        "ABI to a 'NativeType' integer with a fixed size.",
+    correctionMessage: "Try adding an annotation.",
+  );
+
+  /**
+   * No parameters.
+   */
+  static const FfiCode ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED = FfiCode(
+    'ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED',
+    "Only mappings to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', "
+        "'UInt32', and 'Uint64' are supported.",
+    correctionMessage:
+        "Try changing the value to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', "
+        "'Uint16', 'UInt32', or 'Uint64'.",
+  );
+
+  /**
+   * No parameters.
+   */
   static const FfiCode ANNOTATION_ON_POINTER_FIELD = FfiCode(
     'ANNOTATION_ON_POINTER_FIELD',
-    "Fields in a struct class whose type is 'Pointer' should not have any annotations.",
+    "Fields in a struct class whose type is 'Pointer' should not have any "
+        "annotations.",
     correctionMessage: "Try removing the annotation.",
   );
 
@@ -39,7 +86,8 @@
    */
   static const FfiCode CREATION_OF_STRUCT_OR_UNION = FfiCode(
     'CREATION_OF_STRUCT_OR_UNION',
-    "Subclasses of 'Struct' and 'Union' are backed by native memory, and can't be instantiated by a generative constructor.",
+    "Subclasses of 'Struct' and 'Union' are backed by native memory, and can't "
+        "be instantiated by a generative constructor.",
     correctionMessage:
         "Try allocating it via allocation, or load from a 'Pointer'.",
   );
@@ -61,7 +109,8 @@
    */
   static const FfiCode EXTRA_ANNOTATION_ON_STRUCT_FIELD = FfiCode(
     'EXTRA_ANNOTATION_ON_STRUCT_FIELD',
-    "Fields in a struct class must have exactly one annotation indicating the native type.",
+    "Fields in a struct class must have exactly one annotation indicating the "
+        "native type.",
     correctionMessage: "Try removing the extra annotation.",
   );
 
@@ -101,7 +150,8 @@
    */
   static const FfiCode FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS = FfiCode(
     'FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS',
-    "Unexpected number of FfiNative annotation parameters. Expected {0} but has {1}.",
+    "Unexpected number of FfiNative annotation parameters. Expected {0} but "
+        "has {1}.",
     correctionMessage: "Make sure parameters match the function annotated.",
   );
 
@@ -113,9 +163,12 @@
   static const FfiCode
       FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS_WITH_RECEIVER = FfiCode(
     'FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS_WITH_RECEIVER',
-    "Unexpected number of FfiNative annotation parameters. Expected {0} but has {1}. FfiNative instance method annotation must have receiver as first argument.",
+    "Unexpected number of FfiNative annotation parameters. Expected {0} but "
+        "has {1}. FfiNative instance method annotation must have receiver as "
+        "first argument.",
     correctionMessage:
-        "Make sure parameters match the function annotated, including an extra first parameter for the receiver.",
+        "Make sure parameters match the function annotated, including an extra "
+        "first parameter for the receiver.",
   );
 
   /**
@@ -123,7 +176,8 @@
    */
   static const FfiCode FIELD_INITIALIZER_IN_STRUCT = FfiCode(
     'FIELD_INITIALIZER_IN_STRUCT',
-    "Constructors in subclasses of 'Struct' and 'Union' can't have field initializers.",
+    "Constructors in subclasses of 'Struct' and 'Union' can't have field "
+        "initializers.",
     correctionMessage:
         "Try removing the field initializer and marking the field as external.",
   );
@@ -162,7 +216,9 @@
    */
   static const FfiCode INVALID_EXCEPTION_VALUE = FfiCode(
     'INVALID_EXCEPTION_VALUE',
-    "The method 'Pointer.fromFunction' must not have an exceptional return value (the second argument) when the return type of the function is either 'void', 'Handle' or 'Pointer'.",
+    "The method 'Pointer.fromFunction' must not have an exceptional return "
+        "value (the second argument) when the return type of the function is "
+        "either 'void', 'Handle' or 'Pointer'.",
     correctionMessage: "Try removing the exceptional return value.",
   );
 
@@ -172,9 +228,12 @@
    */
   static const FfiCode INVALID_FIELD_TYPE_IN_STRUCT = FfiCode(
     'INVALID_FIELD_TYPE_IN_STRUCT',
-    "Fields in struct classes can't have the type '{0}'. They can only be declared as 'int', 'double', 'Array', 'Pointer', or subtype of 'Struct' or 'Union'.",
+    "Fields in struct classes can't have the type '{0}'. They can only be "
+        "declared as 'int', 'double', 'Array', 'Pointer', or subtype of "
+        "'Struct' or 'Union'.",
     correctionMessage:
-        "Try using 'int', 'double', 'Array', 'Pointer', or subtype of 'Struct' or 'Union'.",
+        "Try using 'int', 'double', 'Array', 'Pointer', or subtype of 'Struct' "
+        "or 'Union'.",
   );
 
   /**
@@ -202,7 +261,8 @@
     'MISMATCHED_ANNOTATION_ON_STRUCT_FIELD',
     "The annotation does not match the declared type of the field.",
     correctionMessage:
-        "Try using a different annotation or changing the declared type to match.",
+        "Try using a different annotation or changing the declared type to "
+        "match.",
   );
 
   /**
@@ -210,7 +270,8 @@
    */
   static const FfiCode MISSING_ANNOTATION_ON_STRUCT_FIELD = FfiCode(
     'MISSING_ANNOTATION_ON_STRUCT_FIELD',
-    "Fields in a struct class must either have the type 'Pointer' or an annotation indicating the native type.",
+    "Fields in a struct class must either have the type 'Pointer' or an "
+        "annotation indicating the native type.",
     correctionMessage: "Try adding an annotation.",
   );
 
@@ -219,7 +280,9 @@
    */
   static const FfiCode MISSING_EXCEPTION_VALUE = FfiCode(
     'MISSING_EXCEPTION_VALUE',
-    "The method 'Pointer.fromFunction' must have an exceptional return value (the second argument) when the return type of the function is neither 'void', 'Handle' or 'Pointer'.",
+    "The method 'Pointer.fromFunction' must have an exceptional return value "
+        "(the second argument) when the return type of the function is neither "
+        "'void', 'Handle' or 'Pointer'.",
     correctionMessage: "Try adding an exceptional return value.",
   );
 
@@ -229,7 +292,8 @@
    */
   static const FfiCode MISSING_FIELD_TYPE_IN_STRUCT = FfiCode(
     'MISSING_FIELD_TYPE_IN_STRUCT',
-    "Fields in struct classes must have an explicitly declared type of 'int', 'double' or 'Pointer'.",
+    "Fields in struct classes must have an explicitly declared type of 'int', "
+        "'double' or 'Pointer'.",
     correctionMessage: "Try using 'int', 'double' or 'Pointer'.",
   );
 
@@ -249,7 +313,8 @@
    */
   static const FfiCode MUST_BE_A_NATIVE_FUNCTION_TYPE = FfiCode(
     'MUST_BE_A_NATIVE_FUNCTION_TYPE',
-    "The type '{0}' given to '{1}' must be a valid 'dart:ffi' native function type.",
+    "The type '{0}' given to '{1}' must be a valid 'dart:ffi' native function "
+        "type.",
     correctionMessage:
         "Try changing the type to only use members for 'dart:ffi'.",
   );
@@ -272,7 +337,8 @@
    */
   static const FfiCode NON_CONSTANT_TYPE_ARGUMENT = FfiCode(
     'NON_CONSTANT_TYPE_ARGUMENT',
-    "The type arguments to '{0}' must be compile time constants but type parameters are not constants.",
+    "The type arguments to '{0}' must be compile time constants but type "
+        "parameters are not constants.",
     correctionMessage: "Try changing the type argument to be a constant type.",
   );
 
@@ -282,9 +348,11 @@
    */
   static const FfiCode NON_NATIVE_FUNCTION_TYPE_ARGUMENT_TO_POINTER = FfiCode(
     'NON_NATIVE_FUNCTION_TYPE_ARGUMENT_TO_POINTER',
-    "The type argument for the pointer '{0}' must be a valid 'NativeFunction' in order to use 'asFunction'.",
+    "The type argument for the pointer '{0}' must be a valid 'NativeFunction' "
+        "in order to use 'asFunction'.",
     correctionMessage:
-        "Try changing the function argument in 'NativeFunction' to only use NativeTypes.",
+        "Try changing the function argument in 'NativeFunction' to only use "
+        "NativeTypes.",
   );
 
   /**
@@ -302,9 +370,12 @@
    */
   static const FfiCode NON_SIZED_TYPE_ARGUMENT = FfiCode(
     'NON_SIZED_TYPE_ARGUMENT',
-    "Type arguments to '{0}' can't have the type '{1}'. They can only be declared as native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct' or 'Union'.",
+    "Type arguments to '{0}' can't have the type '{1}'. They can only be "
+        "declared as native integer, 'Float', 'Double', 'Pointer', or subtype "
+        "of 'Struct', 'Union', or 'AbiSpecificInteger'.",
     correctionMessage:
-        "Try using a native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct' or 'Union'.",
+        "Try using a native integer, 'Float', 'Double', 'Pointer', or subtype "
+        "of 'Struct', 'Union', or 'AbiSpecificInteger'.",
   );
 
   /**
@@ -333,9 +404,11 @@
    */
   static const FfiCode PACKED_NESTING_NON_PACKED = FfiCode(
     'PACKED_NESTING_NON_PACKED',
-    "Nesting the non-packed or less tightly packed struct '{0}' in a packed struct '{1}' is not supported.",
+    "Nesting the non-packed or less tightly packed struct '{0}' in a packed "
+        "struct '{1}' is not supported.",
     correctionMessage:
-        "Try packing the nested struct or packing the nested struct more tightly.",
+        "Try packing the nested struct or packing the nested struct more "
+        "tightly.",
   );
 
   /**
@@ -390,8 +463,10 @@
    */
   static const FfiCode SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS = FfiCode(
     'SUBTYPE_OF_STRUCT_CLASS',
-    "The class '{0}' can't extend '{1}' because '{1}' is a subtype of 'Struct' or 'Union'.",
-    correctionMessage: "Try extending 'Struct' or 'Union' directly.",
+    "The class '{0}' can't extend '{1}' because '{1}' is a subtype of "
+        "'Struct', 'Union', or 'AbiSpecificInteger'.",
+    correctionMessage:
+        "Try extending 'Struct', 'Union', or 'AbiSpecificInteger' directly.",
     uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS',
   );
 
@@ -402,8 +477,10 @@
    */
   static const FfiCode SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS = FfiCode(
     'SUBTYPE_OF_STRUCT_CLASS',
-    "The class '{0}' can't implement '{1}' because '{1}' is a subtype of 'Struct' or 'Union'.",
-    correctionMessage: "Try extending 'Struct' or 'Union' directly.",
+    "The class '{0}' can't implement '{1}' because '{1}' is a subtype of "
+        "'Struct', 'Union', or 'AbiSpecificInteger'.",
+    correctionMessage:
+        "Try extending 'Struct', 'Union', or 'AbiSpecificInteger' directly.",
     uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS',
   );
 
@@ -414,8 +491,10 @@
    */
   static const FfiCode SUBTYPE_OF_STRUCT_CLASS_IN_WITH = FfiCode(
     'SUBTYPE_OF_STRUCT_CLASS',
-    "The class '{0}' can't mix in '{1}' because '{1}' is a subtype of 'Struct' or 'Union'.",
-    correctionMessage: "Try extending 'Struct' or 'Union' directly.",
+    "The class '{0}' can't mix in '{1}' because '{1}' is a subtype of "
+        "'Struct', 'Union', or 'AbiSpecificInteger'.",
+    correctionMessage:
+        "Try extending 'Struct', 'Union', or 'AbiSpecificInteger' directly.",
     uniqueName: 'SUBTYPE_OF_STRUCT_CLASS_IN_WITH',
   );
 
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
index ecb67b1..8c78fc5 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.g.dart
@@ -75,7 +75,8 @@
   static const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER =
       HintCode(
     'ARGUMENT_TYPE_NOT_ASSIGNABLE_TO_ERROR_HANDLER',
-    "The argument type '{0}' can't be assigned to the parameter type '{1} Function(Object)' or '{1} Function(Object, StackTrace)'.",
+    "The argument type '{0}' can't be assigned to the parameter type '{1} "
+        "Function(Object)' or '{1} Function(Object, StackTrace)'.",
     hasPublishedDocs: true,
   );
 
@@ -84,11 +85,25 @@
    */
   static const HintCode ASSIGNMENT_OF_DO_NOT_STORE = HintCode(
     'ASSIGNMENT_OF_DO_NOT_STORE',
-    "'{0}' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable.",
+    "'{0}' is marked 'doNotStore' and shouldn't be assigned to a field or "
+        "top-level variable.",
     correctionMessage: "Try removing the assignment.",
   );
 
   /**
+   * Parameters:
+   * 0: the name of the declared return type
+   */
+  static const HintCode BODY_MIGHT_COMPLETE_NORMALLY_NULLABLE = HintCode(
+    'BODY_MIGHT_COMPLETE_NORMALLY_NULLABLE',
+    "This function has a nullable return type of '{0}', but ends without "
+        "returning a value.",
+    correctionMessage:
+        "Try adding a return statement, or if no value is ever returned, try "
+        "changing the return type to 'void'.",
+  );
+
+  /**
    * When the target expression uses '?.' operator, it can be `null`, so all the
    * subsequent invocations should also use '?.' operator.
    */
@@ -155,7 +170,8 @@
     'DEAD_CODE',
     "Dead code.",
     correctionMessage:
-        "Try removing the code, or fixing the code before it so that it can be reached.",
+        "Try removing the code, or fixing the code before it so that it can be "
+        "reached.",
     hasPublishedDocs: true,
   );
 
@@ -211,9 +227,11 @@
   // ```
   static const HintCode DEAD_CODE_CATCH_FOLLOWING_CATCH = HintCode(
     'DEAD_CODE_CATCH_FOLLOWING_CATCH',
-    "Dead code: Catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached.",
+    "Dead code: Catch clauses after a 'catch (e)' or an 'on Object catch (e)' "
+        "are never reached.",
     correctionMessage:
-        "Try reordering the catch clauses so that they can be reached, or removing the unreachable catch clauses.",
+        "Try reordering the catch clauses so that they can be reached, or "
+        "removing the unreachable catch clauses.",
     hasPublishedDocs: true,
   );
 
@@ -273,9 +291,11 @@
   // ```
   static const HintCode DEAD_CODE_ON_CATCH_SUBTYPE = HintCode(
     'DEAD_CODE_ON_CATCH_SUBTYPE',
-    "Dead code: This on-catch block won’t be executed because '{0}' is a subtype of '{1}' and hence will have been caught already.",
+    "Dead code: This on-catch block won’t be executed because '{0}' is a "
+        "subtype of '{1}' and hence will have been caught already.",
     correctionMessage:
-        "Try reordering the catch clauses so that this block can be reached, or removing the unreachable catch clause.",
+        "Try reordering the catch clauses so that this block can be reached, "
+        "or removing the unreachable catch clause.",
     hasPublishedDocs: true,
   );
 
@@ -551,9 +571,11 @@
   // ```
   static const HintCode DUPLICATE_IGNORE = HintCode(
     'DUPLICATE_IGNORE',
-    "The diagnostic '{0}' doesn't need to be ignored here because it's already being ignored.",
+    "The diagnostic '{0}' doesn't need to be ignored here because it's already "
+        "being ignored.",
     correctionMessage:
-        "Try removing the name from the list, or removing the whole comment if this is the only name in the list.",
+        "Try removing the name from the list, or removing the whole comment if "
+        "this is the only name in the list.",
     hasPublishedDocs: true,
   );
 
@@ -750,9 +772,11 @@
   static const HintCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE =
       HintCode(
     'FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE',
-    "A file in the 'lib' directory shouldn't import a file outside the 'lib' directory.",
+    "A file in the 'lib' directory shouldn't import a file outside the 'lib' "
+        "directory.",
     correctionMessage:
-        "Try removing the import, or moving the imported file inside the 'lib' directory.",
+        "Try removing the import, or moving the imported file inside the 'lib' "
+        "directory.",
   );
 
   /**
@@ -765,7 +789,8 @@
   static const HintCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE =
       HintCode(
     'FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE',
-    "A file outside the 'lib' directory shouldn't reference a file inside the 'lib' directory using a relative path.",
+    "A file outside the 'lib' directory shouldn't reference a file inside the "
+        "'lib' directory using a relative path.",
     correctionMessage: "Try using a package: URI instead.",
   );
 
@@ -844,9 +869,11 @@
   // with the `@optionalTypeArgs` annotation (from `package:meta`):
   static const HintCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION = HintCode(
     'IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION',
-    "The imported library defines a top-level function named 'loadLibrary' that is hidden by deferring this library.",
+    "The imported library defines a top-level function named 'loadLibrary' "
+        "that is hidden by deferring this library.",
     correctionMessage:
-        "Try changing the import to not be deferred, or rename the function in the imported library.",
+        "Try changing the import to not be deferred, or rename the function in "
+        "the imported library.",
     hasPublishedDocs: true,
   );
 
@@ -855,7 +882,8 @@
    */
   static const HintCode IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE = HintCode(
     'IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE',
-    "The library '{0}' is legacy, and should not be imported into a null safe library.",
+    "The library '{0}' is legacy, and should not be imported into a null safe "
+        "library.",
     correctionMessage: "Try migrating the imported library.",
   );
 
@@ -898,7 +926,8 @@
    */
   static const HintCode INFERENCE_FAILURE_ON_GENERIC_INVOCATION = HintCode(
     'INFERENCE_FAILURE_ON_GENERIC_INVOCATION',
-    "The type argument(s) of the generic function type '{0}' can't be inferred.",
+    "The type argument(s) of the generic function type '{0}' can't be "
+        "inferred.",
     correctionMessage: "Use explicit type argument(s) for '{0}'.",
   );
 
@@ -966,7 +995,8 @@
   static const HintCode INVALID_EXPORT_OF_INTERNAL_ELEMENT_INDIRECTLY =
       HintCode(
     'INVALID_EXPORT_OF_INTERNAL_ELEMENT_INDIRECTLY',
-    "The member '{0}' can't be exported as a part of a package's public API, but is indirectly exported as part of the signature of '{1}'.",
+    "The member '{0}' can't be exported as a part of a package's public API, "
+        "but is indirectly exported as part of the signature of '{1}'.",
     correctionMessage: "Try using a hide clause to hide '{0}'.",
   );
 
@@ -1016,7 +1046,8 @@
    */
   static const HintCode INVALID_INTERNAL_ANNOTATION = HintCode(
     'INVALID_INTERNAL_ANNOTATION',
-    "Only public elements in a package's private API can be annotated as being internal.",
+    "Only public elements in a package's private API can be annotated as being "
+        "internal.",
   );
 
   /**
@@ -1035,7 +1066,8 @@
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
     "The Dart language version override number must begin with '@dart'",
     correctionMessage:
-        "Specify a Dart language version override with a comment like '// @dart = 2.0'.",
+        "Specify a Dart language version override with a comment like '// "
+        "@dart = 2.0'.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_AT_SIGN',
   );
 
@@ -1053,22 +1085,26 @@
    */
   static const HintCode INVALID_LANGUAGE_VERSION_OVERRIDE_EQUALS = HintCode(
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
-    "The Dart language version override comment must be specified with an '=' character",
+    "The Dart language version override comment must be specified with an '=' "
+        "character",
     correctionMessage:
-        "Specify a Dart language version override with a comment like '// @dart = 2.0'.",
+        "Specify a Dart language version override with a comment like '// "
+        "@dart = 2.0'.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_EQUALS',
   );
 
   static const HintCode INVALID_LANGUAGE_VERSION_OVERRIDE_GREATER = HintCode(
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
-    "The language version override can't specify a version greater than the latest known language version: {0}.{1}",
+    "The language version override can't specify a version greater than the "
+        "latest known language version: {0}.{1}",
     correctionMessage: "Try removing the language version override.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_GREATER',
   );
 
   static const HintCode INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION = HintCode(
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
-    "The language version override must be before any declaration or directive.",
+    "The language version override must be before any declaration or "
+        "directive.",
     correctionMessage:
         "Try moving the language version override to the top of the file.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_LOCATION',
@@ -1088,9 +1124,11 @@
    */
   static const HintCode INVALID_LANGUAGE_VERSION_OVERRIDE_LOWER_CASE = HintCode(
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
-    "The Dart language version override comment must be specified with the word 'dart' in all lower case",
+    "The Dart language version override comment must be specified with the "
+        "word 'dart' in all lower case",
     correctionMessage:
-        "Specify a Dart language version override with a comment like '// @dart = 2.0'.",
+        "Specify a Dart language version override with a comment like '// "
+        "@dart = 2.0'.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_LOWER_CASE',
   );
 
@@ -1108,9 +1146,11 @@
    */
   static const HintCode INVALID_LANGUAGE_VERSION_OVERRIDE_NUMBER = HintCode(
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
-    "The Dart language version override comment must be specified with a version number, like '2.0', after the '=' character.",
+    "The Dart language version override comment must be specified with a "
+        "version number, like '2.0', after the '=' character.",
     correctionMessage:
-        "Specify a Dart language version override with a comment like '// @dart = 2.0'.",
+        "Specify a Dart language version override with a comment like '// "
+        "@dart = 2.0'.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_NUMBER',
   );
 
@@ -1130,7 +1170,8 @@
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
     "The Dart language version override number can't be prefixed with a letter",
     correctionMessage:
-        "Specify a Dart language version override with a comment like '// @dart = 2.0'.",
+        "Specify a Dart language version override with a comment like '// "
+        "@dart = 2.0'.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_PREFIX',
   );
 
@@ -1149,9 +1190,11 @@
   static const HintCode INVALID_LANGUAGE_VERSION_OVERRIDE_TRAILING_CHARACTERS =
       HintCode(
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
-    "The Dart language version override comment can't be followed by any non-whitespace characters",
+    "The Dart language version override comment can't be followed by any "
+        "non-whitespace characters",
     correctionMessage:
-        "Specify a Dart language version override with a comment like '// @dart = 2.0'.",
+        "Specify a Dart language version override with a comment like '// "
+        "@dart = 2.0'.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_TRAILING_CHARACTERS',
   );
 
@@ -1170,9 +1213,11 @@
   static const HintCode INVALID_LANGUAGE_VERSION_OVERRIDE_TWO_SLASHES =
       HintCode(
     'INVALID_LANGUAGE_VERSION_OVERRIDE',
-    "The Dart language version override comment must be specified with exactly two slashes.",
+    "The Dart language version override comment must be specified with exactly "
+        "two slashes.",
     correctionMessage:
-        "Specify a Dart language version override with a comment like '// @dart = 2.0'.",
+        "Specify a Dart language version override with a comment like '// "
+        "@dart = 2.0'.",
     uniqueName: 'INVALID_LANGUAGE_VERSION_OVERRIDE_TWO_SLASHES',
   );
 
@@ -1245,7 +1290,8 @@
    */
   static const HintCode INVALID_NON_VIRTUAL_ANNOTATION = HintCode(
     'INVALID_NON_VIRTUAL_ANNOTATION',
-    "The annotation '@nonVirtual' can only be applied to a concrete instance member.",
+    "The annotation '@nonVirtual' can only be applied to a concrete instance "
+        "member.",
     correctionMessage: "Try removing @nonVirtual.",
   );
 
@@ -1259,7 +1305,8 @@
    */
   static const HintCode INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER = HintCode(
     'INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER',
-    "The member '{0}' is declared non-virtual in '{1}' and can't be overridden in subclasses.",
+    "The member '{0}' is declared non-virtual in '{1}' and can't be overridden "
+        "in subclasses.",
   );
 
   /**
@@ -1271,7 +1318,8 @@
    */
   static const HintCode INVALID_REQUIRED_NAMED_PARAM = HintCode(
     'INVALID_REQUIRED_NAMED_PARAM',
-    "The type parameter '{0}' is annotated with @required but only named parameters without a default value can be annotated with it.",
+    "The type parameter '{0}' is annotated with @required but only named "
+        "parameters without a default value can be annotated with it.",
     correctionMessage: "Remove @required.",
   );
 
@@ -1284,7 +1332,8 @@
    */
   static const HintCode INVALID_REQUIRED_OPTIONAL_POSITIONAL_PARAM = HintCode(
     'INVALID_REQUIRED_OPTIONAL_POSITIONAL_PARAM',
-    "Incorrect use of the annotation @required on the optional positional parameter '{0}'. Optional positional parameters cannot be required.",
+    "Incorrect use of the annotation @required on the optional positional "
+        "parameter '{0}'. Optional positional parameters cannot be required.",
     correctionMessage: "Remove @required.",
   );
 
@@ -1297,7 +1346,8 @@
    */
   static const HintCode INVALID_REQUIRED_POSITIONAL_PARAM = HintCode(
     'INVALID_REQUIRED_POSITIONAL_PARAM',
-    "Redundant use of the annotation @required on the required positional parameter '{0}'.",
+    "Redundant use of the annotation @required on the required positional "
+        "parameter '{0}'.",
     correctionMessage: "Remove @required.",
   );
 
@@ -1335,7 +1385,8 @@
    */
   static const HintCode INVALID_USE_OF_PROTECTED_MEMBER = HintCode(
     'INVALID_USE_OF_PROTECTED_MEMBER',
-    "The member '{0}' can only be used within instance members of subclasses of '{1}'.",
+    "The member '{0}' can only be used within instance members of subclasses "
+        "of '{1}'.",
   );
 
   /**
@@ -1460,7 +1511,8 @@
   // ```
   static const HintCode INVALID_VISIBILITY_ANNOTATION = HintCode(
     'INVALID_VISIBILITY_ANNOTATION',
-    "The member '{0}' is annotated with '{1}', but this annotation is only meaningful on declarations of public members.",
+    "The member '{0}' is annotated with '{1}', but this annotation is only "
+        "meaningful on declarations of public members.",
     hasPublishedDocs: true,
   );
 
@@ -1495,7 +1547,8 @@
   // ```
   static const HintCode INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION = HintCode(
     'INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION',
-    "The annotation 'visibleForOverriding' can only be applied to a public instance member that can be overridden.",
+    "The annotation 'visibleForOverriding' can only be applied to a public "
+        "instance member that can be overridden.",
     hasPublishedDocs: true,
   );
 
@@ -1593,7 +1646,8 @@
   // `null` is the appropriate value.
   static const HintCode MISSING_RETURN = HintCode(
     'MISSING_RETURN',
-    "This function has a return type of '{0}', but doesn't end with a return statement.",
+    "This function has a return type of '{0}', but doesn't end with a return "
+        "statement.",
     correctionMessage:
         "Try adding a return statement, or changing the return type to 'void'.",
     hasPublishedDocs: true,
@@ -1641,9 +1695,12 @@
   // of the sealed class.
   static const HintCode MIXIN_ON_SEALED_CLASS = HintCode(
     'MIXIN_ON_SEALED_CLASS',
-    "The class '{0}' shouldn't be used as a mixin constraint because it is sealed, and any class mixing in this mixin must have '{0}' as a superclass.",
+    "The class '{0}' shouldn't be used as a mixin constraint because it is "
+        "sealed, and any class mixing in this mixin must have '{0}' as a "
+        "superclass.",
     correctionMessage:
-        "Try composing with this class, or refer to its documentation for more information.",
+        "Try composing with this class, or refer to its documentation for more "
+        "information.",
     hasPublishedDocs: true,
   );
 
@@ -1703,7 +1760,9 @@
   // ```
   static const HintCode MUST_BE_IMMUTABLE = HintCode(
     'MUST_BE_IMMUTABLE',
-    "This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: {0}",
+    "This class (or a class that this class inherits from) is marked as "
+        "'@immutable', but one or more of its instance fields aren't final: "
+        "{0}",
     hasPublishedDocs: true,
   );
 
@@ -1757,7 +1816,8 @@
   // ```
   static const HintCode MUST_CALL_SUPER = HintCode(
     'MUST_CALL_SUPER',
-    "This method overrides a method annotated as '@mustCallSuper' in '{0}', but doesn't invoke the overridden method.",
+    "This method overrides a method annotated as '@mustCallSuper' in '{0}', "
+        "but doesn't invoke the overridden method.",
     hasPublishedDocs: true,
   );
 
@@ -1807,7 +1867,8 @@
   // ```
   static const HintCode NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR = HintCode(
     'NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR',
-    "This instance creation must be 'const', because the {0} constructor is marked as '@literal'.",
+    "This instance creation must be 'const', because the {0} constructor is "
+        "marked as '@literal'.",
     correctionMessage: "Try adding a 'const' keyword.",
     hasPublishedDocs: true,
   );
@@ -1822,7 +1883,8 @@
   static const HintCode NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW =
       HintCode(
     'NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR',
-    "This instance creation must be 'const', because the {0} constructor is marked as '@literal'.",
+    "This instance creation must be 'const', because the {0} constructor is "
+        "marked as '@literal'.",
     correctionMessage: "Try replacing the 'new' keyword with 'const'.",
     hasPublishedDocs: true,
     uniqueName: 'NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW',
@@ -1866,7 +1928,8 @@
   // ```
   static const HintCode NULLABLE_TYPE_IN_CATCH_CLAUSE = HintCode(
     'NULLABLE_TYPE_IN_CATCH_CLAUSE',
-    "A potentially nullable type can't be used in an 'on' clause because it isn't valid to throw a nullable expression.",
+    "A potentially nullable type can't be used in an 'on' clause because it "
+        "isn't valid to throw a nullable expression.",
     correctionMessage: "Try using a non-nullable type.",
     hasPublishedDocs: true,
   );
@@ -1907,7 +1970,8 @@
   // ```
   static const HintCode NULL_ARGUMENT_TO_NON_NULL_TYPE = HintCode(
     'NULL_ARGUMENT_TO_NON_NULL_TYPE',
-    "'{0}' shouldn't be called with a null argument for the non-nullable type argument '{1}'.",
+    "'{0}' shouldn't be called with a null argument for the non-nullable type "
+        "argument '{1}'.",
     correctionMessage: "Try adding a non-null argument.",
     hasPublishedDocs: true,
   );
@@ -1927,9 +1991,11 @@
    */
   static const HintCode NULL_AWARE_IN_CONDITION = HintCode(
     'NULL_AWARE_IN_CONDITION',
-    "The value of the '?.' operator can be 'null', which isn't appropriate in a condition.",
+    "The value of the '?.' operator can be 'null', which isn't appropriate in "
+        "a condition.",
     correctionMessage:
-        "Try replacing the '?.' with a '.', testing the left-hand side for null if necessary.",
+        "Try replacing the '?.' with a '.', testing the left-hand side for "
+        "null if necessary.",
   );
 
   /**
@@ -1938,7 +2004,8 @@
    */
   static const HintCode NULL_AWARE_IN_LOGICAL_OPERATOR = HintCode(
     'NULL_AWARE_IN_LOGICAL_OPERATOR',
-    "The value of the '?.' operator can be 'null', which isn't appropriate as an operand of a logical operator.",
+    "The value of the '?.' operator can be 'null', which isn't appropriate as "
+        "an operand of a logical operator.",
   );
 
   /**
@@ -1947,7 +2014,8 @@
    */
   static const HintCode NULL_CHECK_ALWAYS_FAILS = HintCode(
     'NULL_CHECK_ALWAYS_FAILS',
-    "This null-check will always throw an exception because the expression will always evaluate to 'null'.",
+    "This null-check will always throw an exception because the expression "
+        "will always evaluate to 'null'.",
   );
 
   /**
@@ -1959,7 +2027,8 @@
     'OVERRIDE_ON_NON_OVERRIDING_MEMBER',
     "The field doesn't override an inherited getter or setter.",
     correctionMessage:
-        "Try updating this class to match the superclass, or removing the override annotation.",
+        "Try updating this class to match the superclass, or removing the "
+        "override annotation.",
     hasPublishedDocs: true,
     uniqueName: 'OVERRIDE_ON_NON_OVERRIDING_FIELD',
   );
@@ -1973,7 +2042,8 @@
     'OVERRIDE_ON_NON_OVERRIDING_MEMBER',
     "The getter doesn't override an inherited getter.",
     correctionMessage:
-        "Try updating this class to match the superclass, or removing the override annotation.",
+        "Try updating this class to match the superclass, or removing the "
+        "override annotation.",
     hasPublishedDocs: true,
     uniqueName: 'OVERRIDE_ON_NON_OVERRIDING_GETTER',
   );
@@ -2021,7 +2091,8 @@
     'OVERRIDE_ON_NON_OVERRIDING_MEMBER',
     "The method doesn't override an inherited method.",
     correctionMessage:
-        "Try updating this class to match the superclass, or removing the override annotation.",
+        "Try updating this class to match the superclass, or removing the "
+        "override annotation.",
     hasPublishedDocs: true,
     uniqueName: 'OVERRIDE_ON_NON_OVERRIDING_METHOD',
   );
@@ -2035,7 +2106,8 @@
     'OVERRIDE_ON_NON_OVERRIDING_MEMBER',
     "The setter doesn't override an inherited setter.",
     correctionMessage:
-        "Try updating this class to match the superclass, or removing the override annotation.",
+        "Try updating this class to match the superclass, or removing the "
+        "override annotation.",
     hasPublishedDocs: true,
     uniqueName: 'OVERRIDE_ON_NON_OVERRIDING_SETTER',
   );
@@ -2078,7 +2150,8 @@
    */
   static const HintCode RETURN_OF_DO_NOT_STORE = HintCode(
     'RETURN_OF_DO_NOT_STORE',
-    "'{0}' is annotated with 'doNotStore' and shouldn't be returned unless '{1}' is also annotated.",
+    "'{0}' is annotated with 'doNotStore' and shouldn't be returned unless "
+        "'{1}' is also annotated.",
     correctionMessage: "Annotate '{1}' with 'doNotStore'.",
   );
 
@@ -2138,7 +2211,8 @@
   // ```
   static const HintCode RETURN_OF_INVALID_TYPE_FROM_CATCH_ERROR = HintCode(
     'INVALID_RETURN_TYPE_FOR_CATCH_ERROR',
-    "A value of type '{0}' can't be returned by the 'onError' handler because it must be assignable to '{1}'.",
+    "A value of type '{0}' can't be returned by the 'onError' handler because "
+        "it must be assignable to '{1}'.",
     hasPublishedDocs: true,
     uniqueName: 'RETURN_OF_INVALID_TYPE_FROM_CATCH_ERROR',
   );
@@ -2150,7 +2224,8 @@
    */
   static const HintCode RETURN_TYPE_INVALID_FOR_CATCH_ERROR = HintCode(
     'INVALID_RETURN_TYPE_FOR_CATCH_ERROR',
-    "The return type '{0}' isn't assignable to '{1}', as required by 'Future.catchError'.",
+    "The return type '{0}' isn't assignable to '{1}', as required by "
+        "'Future.catchError'.",
     hasPublishedDocs: true,
     uniqueName: 'RETURN_TYPE_INVALID_FOR_CATCH_ERROR',
   );
@@ -2204,7 +2279,8 @@
   // ```
   static const HintCode SDK_VERSION_ASYNC_EXPORTED_FROM_CORE = HintCode(
     'SDK_VERSION_ASYNC_EXPORTED_FROM_CORE',
-    "The class '{0}' wasn't exported from 'dart:core' until version 2.1, but this code is required to be able to run on earlier versions.",
+    "The class '{0}' wasn't exported from 'dart:core' until version 2.1, but "
+        "this code is required to be able to run on earlier versions.",
     correctionMessage:
         "Try either importing 'dart:async' or updating the SDK constraints.",
     hasPublishedDocs: true,
@@ -2260,7 +2336,9 @@
   // ```
   static const HintCode SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT = HintCode(
     'SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT',
-    "The use of an as expression in a constant expression wasn't supported until version 2.3.2, but this code is required to be able to run on earlier versions.",
+    "The use of an as expression in a constant expression wasn't supported "
+        "until version 2.3.2, but this code is required to be able to run on "
+        "earlier versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2318,7 +2396,9 @@
   // ```
   static const HintCode SDK_VERSION_BOOL_OPERATOR_IN_CONST_CONTEXT = HintCode(
     'SDK_VERSION_BOOL_OPERATOR_IN_CONST_CONTEXT',
-    "The use of the operator '{0}' for 'bool' operands in a constant context wasn't supported until version 2.3.2, but this code is required to be able to run on earlier versions.",
+    "The use of the operator '{0}' for 'bool' operands in a constant context "
+        "wasn't supported until version 2.3.2, but this code is required to be "
+        "able to run on earlier versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2376,9 +2456,11 @@
   // ```
   static const HintCode SDK_VERSION_CONSTRUCTOR_TEAROFFS = HintCode(
     'SDK_VERSION_CONSTRUCTOR_TEAROFFS',
-    "Tearing off a constructor requires the 'constructor-tearoffs' language feature.",
+    "Tearing off a constructor requires the 'constructor-tearoffs' language "
+        "feature.",
     correctionMessage:
-        "Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.",
+        "Try updating your pubspec.yaml to set the minimum SDK constraint to "
+        "2.15 or higher, and running 'pub get'.",
     hasPublishedDocs: true,
   );
 
@@ -2438,7 +2520,9 @@
   // ```
   static const HintCode SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT = HintCode(
     'SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT',
-    "Using the operator '==' for non-primitive types wasn't supported until version 2.3.2, but this code is required to be able to run on earlier versions.",
+    "Using the operator '==' for non-primitive types wasn't supported until "
+        "version 2.3.2, but this code is required to be able to run on earlier "
+        "versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2498,7 +2582,8 @@
   // ```
   static const HintCode SDK_VERSION_EXTENSION_METHODS = HintCode(
     'SDK_VERSION_EXTENSION_METHODS',
-    "Extension methods weren't supported until version 2.6.0, but this code is required to be able to run on earlier versions.",
+    "Extension methods weren't supported until version 2.6.0, but this code is "
+        "required to be able to run on earlier versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2557,7 +2642,8 @@
   // ```
   static const HintCode SDK_VERSION_GT_GT_GT_OPERATOR = HintCode(
     'SDK_VERSION_GT_GT_GT_OPERATOR',
-    "The operator '>>>' wasn't supported until version 2.14.0, but this code is required to be able to run on earlier versions.",
+    "The operator '>>>' wasn't supported until version 2.14.0, but this code "
+        "is required to be able to run on earlier versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2613,7 +2699,9 @@
   // ```
   static const HintCode SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT = HintCode(
     'SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT',
-    "The use of an is expression in a constant context wasn't supported until version 2.3.2, but this code is required to be able to run on earlier versions.",
+    "The use of an is expression in a constant context wasn't supported until "
+        "version 2.3.2, but this code is required to be able to run on earlier "
+        "versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2665,7 +2753,8 @@
   // ```
   static const HintCode SDK_VERSION_NEVER = HintCode(
     'SDK_VERSION_NEVER',
-    "The type 'Never' wasn't supported until version 2.12.0, but this code is required to be able to run on earlier versions.",
+    "The type 'Never' wasn't supported until version 2.12.0, but this code is "
+        "required to be able to run on earlier versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2716,7 +2805,8 @@
   // ```
   static const HintCode SDK_VERSION_SET_LITERAL = HintCode(
     'SDK_VERSION_SET_LITERAL',
-    "Set literals weren't supported until version 2.2, but this code is required to be able to run on earlier versions.",
+    "Set literals weren't supported until version 2.2, but this code is "
+        "required to be able to run on earlier versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2776,7 +2866,8 @@
   // ```
   static const HintCode SDK_VERSION_UI_AS_CODE = HintCode(
     'SDK_VERSION_UI_AS_CODE',
-    "The for, if, and spread elements weren't supported until version 2.3.0, but this code is required to be able to run on earlier versions.",
+    "The for, if, and spread elements weren't supported until version 2.3.0, "
+        "but this code is required to be able to run on earlier versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2838,7 +2929,9 @@
   // ```
   static const HintCode SDK_VERSION_UI_AS_CODE_IN_CONST_CONTEXT = HintCode(
     'SDK_VERSION_UI_AS_CODE_IN_CONST_CONTEXT',
-    "The if and spread elements weren't supported in constant expressions until version 2.5.0, but this code is required to be able to run on earlier versions.",
+    "The if and spread elements weren't supported in constant expressions "
+        "until version 2.5.0, but this code is required to be able to run on "
+        "earlier versions.",
     correctionMessage: "Try updating the SDK constraints.",
     hasPublishedDocs: true,
   );
@@ -2907,9 +3000,11 @@
   // the same package as the sealed class.
   static const HintCode SUBTYPE_OF_SEALED_CLASS = HintCode(
     'SUBTYPE_OF_SEALED_CLASS',
-    "The class '{0}' shouldn't be extended, mixed in, or implemented because it's sealed.",
+    "The class '{0}' shouldn't be extended, mixed in, or implemented because "
+        "it's sealed.",
     correctionMessage:
-        "Try composing instead of inheriting, or refer to the documentation of '{0}' for more information.",
+        "Try composing instead of inheriting, or refer to the documentation of "
+        "'{0}' for more information.",
     hasPublishedDocs: true,
   );
 
@@ -2951,9 +3046,11 @@
   // ```
   static const HintCode TEXT_DIRECTION_CODE_POINT_IN_COMMENT = HintCode(
     'TEXT_DIRECTION_CODE_POINT_IN_COMMENT',
-    "The Unicode code point 'U+{0}' changes the appearance of text from how it's interpreted by the compiler.",
+    "The Unicode code point 'U+{0}' changes the appearance of text from how "
+        "it's interpreted by the compiler.",
     correctionMessage:
-        "Try removing the code point or using the Unicode escape sequence '\\u{0}'.",
+        "Try removing the code point or using the Unicode escape sequence "
+        "'\\u{0}'.",
   );
 
   /**
@@ -2994,9 +3091,11 @@
   // ```
   static const HintCode TEXT_DIRECTION_CODE_POINT_IN_LITERAL = HintCode(
     'TEXT_DIRECTION_CODE_POINT_IN_LITERAL',
-    "The Unicode code point 'U+{0}' changes the appearance of text from how it's interpreted by the compiler.",
+    "The Unicode code point 'U+{0}' changes the appearance of text from how "
+        "it's interpreted by the compiler.",
     correctionMessage:
-        "Try removing the code point or using the Unicode escape sequence '\\u{0}'.",
+        "Try removing the code point or using the Unicode escape sequence "
+        "'\\u{0}'.",
   );
 
   /**
@@ -3140,7 +3239,7 @@
   // ```
   static const HintCode UNDEFINED_REFERENCED_PARAMETER = HintCode(
     'UNDEFINED_REFERENCED_PARAMETER',
-    "The parameter '{0}' is not defined by '{1}'.",
+    "The parameter '{0}' isn't defined by '{1}'.",
     hasPublishedDocs: true,
   );
 
@@ -3190,7 +3289,8 @@
     'UNIGNORABLE_IGNORE',
     "The diagnostic '{0}' can't be ignored.",
     correctionMessage:
-        "Try removing the name from the list, or removing the whole comment if this is the only name in the list.",
+        "Try removing the name from the list, or removing the whole comment if "
+        "this is the only name in the list.",
   );
 
   /**
@@ -3238,9 +3338,11 @@
    */
   static const HintCode UNNECESSARY_IGNORE = HintCode(
     'UNNECESSARY_IGNORE',
-    "The diagnostic '{0}' isn't produced at this location so it doesn't need to be ignored.",
+    "The diagnostic '{0}' isn't produced at this location so it doesn't need "
+        "to be ignored.",
     correctionMessage:
-        "Try removing the name from the list, or removing the whole comment if this is the only name in the list.",
+        "Try removing the name from the list, or removing the whole comment if "
+        "this is the only name in the list.",
   );
 
   /**
@@ -3292,7 +3394,8 @@
   // the missing references to those names.
   static const HintCode UNNECESSARY_IMPORT = HintCode(
     'UNNECESSARY_IMPORT',
-    "The import of '{0}' is unnecessary because all of the used elements are also provided by the import of '{1}'.",
+    "The import of '{0}' is unnecessary because all of the used elements are "
+        "also provided by the import of '{1}'.",
     correctionMessage: "Try removing the import directive.",
     hasPublishedDocs: true,
   );
@@ -3408,7 +3511,8 @@
     'UNNECESSARY_NULL_COMPARISON',
     "The operand can't be null, so the condition is always false.",
     correctionMessage:
-        "Try removing the condition, an enclosing condition, or the whole conditional statement.",
+        "Try removing the condition, an enclosing condition, or the whole "
+        "conditional statement.",
     hasPublishedDocs: true,
     uniqueName: 'UNNECESSARY_NULL_COMPARISON_FALSE',
   );
@@ -3548,7 +3652,8 @@
   // ```
   static const HintCode UNUSED_CATCH_CLAUSE = HintCode(
     'UNUSED_CATCH_CLAUSE',
-    "The exception variable '{0}' isn't used, so the 'catch' clause can be removed.",
+    "The exception variable '{0}' isn't used, so the 'catch' clause can be "
+        "removed.",
     correctionMessage: "Try removing the catch clause.",
     hasPublishedDocs: true,
   );
@@ -3790,7 +3895,8 @@
     'UNUSED_LABEL',
     "The label '{0}' isn't used.",
     correctionMessage:
-        "Try removing the label, or using it in either a 'break' or 'continue' statement.",
+        "Try removing the label, or using it in either a 'break' or 'continue' "
+        "statement.",
     hasPublishedDocs: true,
   );
 
@@ -3900,7 +4006,8 @@
     'UNUSED_RESULT',
     "The value of '{0}' should be used.",
     correctionMessage:
-        "Try using the result by invoking a member, passing it to a function, or returning it from this function.",
+        "Try using the result by invoking a member, passing it to a function, "
+        "or returning it from this function.",
     hasPublishedDocs: true,
   );
 
@@ -3917,7 +4024,8 @@
     'UNUSED_RESULT',
     "'{0}' should be used. {1}.",
     correctionMessage:
-        "Try using the result by invoking a member, passing it to a function, or returning it from this function.",
+        "Try using the result by invoking a member, passing it to a function, "
+        "or returning it from this function.",
     hasPublishedDocs: true,
     uniqueName: 'UNUSED_RESULT_WITH_MESSAGE',
   );
diff --git a/pkg/analyzer/lib/src/dart/error/lint_codes.dart b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
index 45983c4..32b5cff 100644
--- a/pkg/analyzer/lib/src/dart/error/lint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
@@ -13,11 +13,10 @@
   const LintCode(
     String name,
     String problemMessage, {
-    @Deprecated('Use correctionMessage instead') String? correction,
     String? correctionMessage,
     String? uniqueName,
   }) : super(
-          correctionMessage: correctionMessage ?? correction,
+          correctionMessage: correctionMessage,
           problemMessage: problemMessage,
           name: name,
           uniqueName: uniqueName ?? 'LintCode.$name',
@@ -29,9 +28,6 @@
   @override
   int get hashCode => uniqueName.hashCode;
 
-  @Deprecated('Use problemMessage instead')
-  String get message => problemMessage;
-
   @override
   ErrorType get type => ErrorType.LINT;
 
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index 0bec5ea..1a6f7b2 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -142,7 +142,8 @@
     'ABSTRACT_CLASS_MEMBER',
     "Members of classes can't be declared to be 'abstract'.",
     correctionMessage:
-        "Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration.",
+        "Try removing the 'abstract' keyword. You can add the 'abstract' "
+        "keyword before the class declaration.",
   );
 
   static const ParserErrorCode ABSTRACT_ENUM = ParserErrorCode(
@@ -217,12 +218,14 @@
   static const ParserErrorCode ASYNC_KEYWORD_USED_AS_IDENTIFIER =
       ParserErrorCode(
     'ASYNC_KEYWORD_USED_AS_IDENTIFIER',
-    "The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function.",
+    "The keywords 'await' and 'yield' can't be used as identifiers in an "
+        "asynchronous or generator function.",
   );
 
   static const ParserErrorCode BINARY_OPERATOR_WRITTEN_OUT = ParserErrorCode(
     'BINARY_OPERATOR_WRITTEN_OUT',
-    "Binary operator '{0}' is written as '{1}' instead of the written out word.",
+    "Binary operator '{0}' is written as '{1}' instead of the written out "
+        "word.",
     correctionMessage: "Try replacing '{0}' with '{1}'.",
   );
 
@@ -236,14 +239,16 @@
     'CATCH_SYNTAX',
     "'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
     correctionMessage:
-        "No types are needed, the first is given by 'on', the second is always 'StackTrace'.",
+        "No types are needed, the first is given by 'on', the second is always "
+        "'StackTrace'.",
   );
 
   static const ParserErrorCode CATCH_SYNTAX_EXTRA_PARAMETERS = ParserErrorCode(
     'CATCH_SYNTAX_EXTRA_PARAMETERS',
     "'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
     correctionMessage:
-        "No types are needed, the first is given by 'on', the second is always 'StackTrace'.",
+        "No types are needed, the first is given by 'on', the second is always "
+        "'StackTrace'.",
   );
 
   static const ParserErrorCode CLASS_IN_CLASS = ParserErrorCode(
@@ -273,7 +278,8 @@
   static const ParserErrorCode CONSTRUCTOR_WITH_TYPE_ARGUMENTS =
       ParserErrorCode(
     'CONSTRUCTOR_WITH_TYPE_ARGUMENTS',
-    "A constructor invocation can't have type arguments after the constructor name.",
+    "A constructor invocation can't have type arguments after the constructor "
+        "name.",
     correctionMessage:
         "Try removing the type arguments or placing them after the class name.",
   );
@@ -288,7 +294,9 @@
     'CONST_CLASS',
     "Classes can't be declared to be 'const'.",
     correctionMessage:
-        "Try removing the 'const' keyword. If you're trying to indicate that instances of the class can be constants, place the 'const' keyword on  the class' constructor(s).",
+        "Try removing the 'const' keyword. If you're trying to indicate that "
+        "instances of the class can be constants, place the 'const' keyword on "
+        " the class' constructor(s).",
   );
 
   static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = ParserErrorCode(
@@ -307,7 +315,8 @@
     'CONST_FACTORY',
     "Only redirecting factory constructors can be declared to be 'const'.",
     correctionMessage:
-        "Try removing the 'const' keyword, or replacing the body with '=' followed by a valid target.",
+        "Try removing the 'const' keyword, or replacing the body with '=' "
+        "followed by a valid target.",
   );
 
   static const ParserErrorCode CONST_METHOD = ParserErrorCode(
@@ -332,7 +341,8 @@
     'CONTINUE_WITHOUT_LABEL_IN_CASE',
     "A continue statement in a switch statement must have a label as a target.",
     correctionMessage:
-        "Try adding a label associated with one of the case clauses to the continue statement.",
+        "Try adding a label associated with one of the case clauses to the "
+        "continue statement.",
   );
 
   static const ParserErrorCode COVARIANT_AND_STATIC = ParserErrorCode(
@@ -398,7 +408,8 @@
 
   static const ParserErrorCode DEFERRED_AFTER_PREFIX = ParserErrorCode(
     'DEFERRED_AFTER_PREFIX',
-    "The deferred keyword should come immediately before the prefix ('as' clause).",
+    "The deferred keyword should come immediately before the prefix ('as' "
+        "clause).",
     correctionMessage: "Try moving the deferred keyword before the prefix.",
   );
 
@@ -456,7 +467,8 @@
   static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND =
       ParserErrorCode(
     'EQUALITY_CANNOT_BE_EQUALITY_OPERAND',
-    "A comparison expression can't be an operand of another comparison expression.",
+    "A comparison expression can't be an operand of another comparison "
+        "expression.",
     correctionMessage: "Try putting parentheses around one of the comparisons.",
   );
 
@@ -533,7 +545,8 @@
     'EXPERIMENT_NOT_ENABLED',
     "This requires the '{0}' language feature to be enabled.",
     correctionMessage:
-        "Try updating your pubspec.yaml to set the minimum SDK constraint to {1} or higher, and running 'pub get'.",
+        "Try updating your pubspec.yaml to set the minimum SDK constraint to "
+        "{1} or higher, and running 'pub get'.",
   );
 
   static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
@@ -649,7 +662,8 @@
     'EXTERNAL_CONSTRUCTOR_WITH_BODY',
     "External constructors can't have a body.",
     correctionMessage:
-        "Try removing the body of the constructor, or removing the keyword 'external'.",
+        "Try removing the body of the constructor, or removing the keyword "
+        "'external'.",
   );
 
   static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER =
@@ -674,21 +688,24 @@
     'EXTERNAL_FACTORY_WITH_BODY',
     "External factories can't have a body.",
     correctionMessage:
-        "Try removing the body of the factory, or removing the keyword 'external'.",
+        "Try removing the body of the factory, or removing the keyword "
+        "'external'.",
   );
 
   static const ParserErrorCode EXTERNAL_FIELD = ParserErrorCode(
     'EXTERNAL_FIELD',
     "Fields can't be declared to be 'external'.",
     correctionMessage:
-        "Try removing the keyword 'external', or replacing the field by an external getter and/or setter.",
+        "Try removing the keyword 'external', or replacing the field by an "
+        "external getter and/or setter.",
   );
 
   static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = ParserErrorCode(
     'EXTERNAL_GETTER_WITH_BODY',
     "External getters can't have a body.",
     correctionMessage:
-        "Try removing the body of the getter, or removing the keyword 'external'.",
+        "Try removing the body of the getter, or removing the keyword "
+        "'external'.",
   );
 
   static const ParserErrorCode EXTERNAL_LATE_FIELD = ParserErrorCode(
@@ -706,14 +723,16 @@
     'EXTERNAL_OPERATOR_WITH_BODY',
     "External operators can't have a body.",
     correctionMessage:
-        "Try removing the body of the operator, or removing the keyword 'external'.",
+        "Try removing the body of the operator, or removing the keyword "
+        "'external'.",
   );
 
   static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = ParserErrorCode(
     'EXTERNAL_SETTER_WITH_BODY',
     "External setters can't have a body.",
     correctionMessage:
-        "Try removing the body of the setter, or removing the keyword 'external'.",
+        "Try removing the body of the setter, or removing the keyword "
+        "'external'.",
   );
 
   static const ParserErrorCode EXTERNAL_TYPEDEF = ParserErrorCode(
@@ -744,7 +763,8 @@
     'FACTORY_WITH_INITIALIZERS',
     "A 'factory' constructor can't have initializers.",
     correctionMessage:
-        "Try removing the 'factory' keyword to make this a generative constructor, or removing the initializers.",
+        "Try removing the 'factory' keyword to make this a generative "
+        "constructor, or removing the initializers.",
   );
 
   static const ParserErrorCode FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS =
@@ -752,7 +772,8 @@
     'FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS',
     "A field can only be initialized in its declaring class",
     correctionMessage:
-        "Try passing a value into the superclass constructor, or moving the initialization into the constructor body.",
+        "Try passing a value into the superclass constructor, or moving the "
+        "initialization into the constructor body.",
   );
 
   static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR =
@@ -772,9 +793,11 @@
   static const ParserErrorCode FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER =
       ParserErrorCode(
     'FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER',
-    "Members marked 'late' with an initializer can't be declared to be both 'final' and 'covariant'.",
+    "Members marked 'late' with an initializer can't be declared to be both "
+        "'final' and 'covariant'.",
     correctionMessage:
-        "Try removing either the 'final' or 'covariant' keyword, or removing the initializer.",
+        "Try removing either the 'final' or 'covariant' keyword, or removing "
+        "the initializer.",
   );
 
   static const ParserErrorCode FINAL_AND_VAR = ParserErrorCode(
@@ -815,7 +838,8 @@
 
   static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = ParserErrorCode(
     'FUNCTION_TYPED_PARAMETER_VAR',
-    "Function-typed parameters can't specify 'const', 'final' or 'var' in place of a return type.",
+    "Function-typed parameters can't specify 'const', 'final' or 'var' in "
+        "place of a return type.",
     correctionMessage: "Try replacing the keyword with a return type.",
   );
 
@@ -829,14 +853,16 @@
     'GETTER_IN_FUNCTION',
     "Getters can't be defined within methods or functions.",
     correctionMessage:
-        "Try moving the getter outside the method or function, or converting the getter to a function.",
+        "Try moving the getter outside the method or function, or converting "
+        "the getter to a function.",
   );
 
   static const ParserErrorCode GETTER_WITH_PARAMETERS = ParserErrorCode(
     'GETTER_WITH_PARAMETERS',
     "Getters must be declared without a parameter list.",
     correctionMessage:
-        "Try removing the parameter list, or removing the keyword 'get' to define a method rather than a getter.",
+        "Try removing the parameter list, or removing the keyword 'get' to "
+        "define a method rather than a getter.",
   );
 
   static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE =
@@ -898,7 +924,8 @@
 
   static const ParserErrorCode INVALID_COMMENT_REFERENCE = ParserErrorCode(
     'INVALID_COMMENT_REFERENCE',
-    "Comment references should contain a possibly prefixed identifier and can start with 'new', but shouldn't contain anything else.",
+    "Comment references should contain a possibly prefixed identifier and can "
+        "start with 'new', but shouldn't contain anything else.",
   );
 
   static const ParserErrorCode INVALID_CONSTRUCTOR_NAME = ParserErrorCode(
@@ -910,12 +937,14 @@
     'INVALID_GENERIC_FUNCTION_TYPE',
     "Invalid generic function type.",
     correctionMessage:
-        "Try using a generic function type (returnType 'Function(' parameters ')').",
+        "Try using a generic function type (returnType 'Function(' parameters "
+        "')').",
   );
 
   static const ParserErrorCode INVALID_HEX_ESCAPE = ParserErrorCode(
     'INVALID_HEX_ESCAPE',
-    "An escape sequence starting with '\\x' must be followed by 2 hexadecimal digits.",
+    "An escape sequence starting with '\\x' must be followed by 2 hexadecimal "
+        "digits.",
   );
 
   static const ParserErrorCode INVALID_INITIALIZER = ParserErrorCode(
@@ -955,7 +984,8 @@
   static const ParserErrorCode INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER =
       ParserErrorCode(
     'INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER',
-    "The operator '?.' cannot be used with 'super' because 'super' cannot be null.",
+    "The operator '?.' cannot be used with 'super' because 'super' cannot be "
+        "null.",
     correctionMessage: "Try replacing '?.' with '.'",
   );
 
@@ -967,7 +997,8 @@
 
   static const ParserErrorCode INVALID_SUPER_IN_INITIALIZER = ParserErrorCode(
     'INVALID_SUPER_IN_INITIALIZER',
-    "Can only use 'super' in an initializer for calling the superclass constructor (e.g. 'super()' or 'super.namedConstructor()')",
+    "Can only use 'super' in an initializer for calling the superclass "
+        "constructor (e.g. 'super()' or 'super.namedConstructor()')",
   );
 
   static const ParserErrorCode INVALID_SYNC = ParserErrorCode(
@@ -978,12 +1009,15 @@
 
   static const ParserErrorCode INVALID_THIS_IN_INITIALIZER = ParserErrorCode(
     'INVALID_THIS_IN_INITIALIZER',
-    "Can only use 'this' in an initializer for field initialization (e.g. 'this.x = something') and constructor redirection (e.g. 'this()' or 'this.namedConstructor())",
+    "Can only use 'this' in an initializer for field initialization (e.g. "
+        "'this.x = something') and constructor redirection (e.g. 'this()' or "
+        "'this.namedConstructor())",
   );
 
   static const ParserErrorCode INVALID_UNICODE_ESCAPE = ParserErrorCode(
     'INVALID_UNICODE_ESCAPE',
-    "An escape sequence starting with '\\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.",
+    "An escape sequence starting with '\\u' must be followed by 4 hexadecimal "
+        "digits or from 1 to 6 digits between '{' and '}'.",
   );
 
   /**
@@ -1079,7 +1113,8 @@
     'MISSING_CATCH_OR_FINALLY',
     "A try block must be followed by an 'on', 'catch', or 'finally' clause.",
     correctionMessage:
-        "Try adding either a catch or finally clause, or remove the try statement.",
+        "Try adding either a catch or finally clause, or remove the try "
+        "statement.",
   );
 
   static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = ParserErrorCode(
@@ -1091,7 +1126,8 @@
   static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE =
       ParserErrorCode(
     'MISSING_CONST_FINAL_VAR_OR_TYPE',
-    "Variables must be declared using the keywords 'const', 'final', 'var' or a type name.",
+    "Variables must be declared using the keywords 'const', 'final', 'var' or "
+        "a type name.",
     correctionMessage:
         "Try adding the name of the type of the variable or the keyword 'var'.",
   );
@@ -1107,14 +1143,16 @@
     'MISSING_EXPRESSION_IN_INITIALIZER',
     "Expected an expression after the assignment operator.",
     correctionMessage:
-        "Try adding the value to be assigned, or remove the assignment operator.",
+        "Try adding the value to be assigned, or remove the assignment "
+        "operator.",
   );
 
   static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = ParserErrorCode(
     'MISSING_EXPRESSION_IN_THROW',
     "Missing expression after 'throw'.",
     correctionMessage:
-        "Add an expression after 'throw' or use 'rethrow' to throw a caught exception",
+        "Add an expression after 'throw' or use 'rethrow' to throw a caught "
+        "exception",
   );
 
   static const ParserErrorCode MISSING_FUNCTION_BODY = ParserErrorCode(
@@ -1125,7 +1163,8 @@
 
   static const ParserErrorCode MISSING_FUNCTION_KEYWORD = ParserErrorCode(
     'MISSING_FUNCTION_KEYWORD',
-    "Function types must have the keyword 'Function' before the parameter list.",
+    "Function types must have the keyword 'Function' before the parameter "
+        "list.",
     correctionMessage: "Try adding the keyword 'Function'.",
   );
 
@@ -1176,7 +1215,8 @@
     'MISSING_NAME_IN_LIBRARY_DIRECTIVE',
     "Library directives must include a library name.",
     correctionMessage:
-        "Try adding a library name after the keyword 'library', or remove the library directive if the library doesn't have any parts.",
+        "Try adding a library name after the keyword 'library', or remove the "
+        "library directive if the library doesn't have any parts.",
   );
 
   static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE =
@@ -1224,13 +1264,15 @@
 
   static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = ParserErrorCode(
     'MISSING_VARIABLE_IN_FOR_EACH',
-    "A loop variable must be declared in a for-each loop before the 'in', but none was found.",
+    "A loop variable must be declared in a for-each loop before the 'in', but "
+        "none was found.",
     correctionMessage: "Try declaring a loop variable.",
   );
 
   static const ParserErrorCode MIXED_PARAMETER_GROUPS = ParserErrorCode(
     'MIXED_PARAMETER_GROUPS',
-    "Can't have both positional and named parameters in a single parameter list.",
+    "Can't have both positional and named parameters in a single parameter "
+        "list.",
     correctionMessage: "Try choosing a single style of optional parameters.",
   );
 
@@ -1249,7 +1291,8 @@
     'MULTIPLE_EXTENDS_CLAUSES',
     "Each class definition can have at most one extends clause.",
     correctionMessage:
-        "Try choosing one superclass and define your class to implement (or mix in) the others.",
+        "Try choosing one superclass and define your class to implement (or "
+        "mix in) the others.",
   );
 
   static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = ParserErrorCode(
@@ -1268,7 +1311,8 @@
   static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS =
       ParserErrorCode(
     'MULTIPLE_NAMED_PARAMETER_GROUPS',
-    "Can't have multiple groups of named parameters in a single parameter list.",
+    "Can't have multiple groups of named parameters in a single parameter "
+        "list.",
     correctionMessage: "Try combining all of the groups into a single group.",
   );
 
@@ -1288,7 +1332,8 @@
   static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS =
       ParserErrorCode(
     'MULTIPLE_POSITIONAL_PARAMETER_GROUPS',
-    "Can't have multiple groups of positional parameters in a single parameter list.",
+    "Can't have multiple groups of positional parameters in a single parameter "
+        "list.",
     correctionMessage: "Try combining all of the groups into a single group.",
   );
 
@@ -1298,7 +1343,8 @@
    */
   static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = ParserErrorCode(
     'MULTIPLE_VARIABLES_IN_FOR_EACH',
-    "A single loop variable must be declared in a for-each loop before the 'in', but {0} were found.",
+    "A single loop variable must be declared in a for-each loop before the "
+        "'in', but {0} were found.",
     correctionMessage:
         "Try moving all but one of the declarations inside the loop body.",
   );
@@ -1321,7 +1367,8 @@
     'NAMED_FUNCTION_EXPRESSION',
     "Function expressions can't be named.",
     correctionMessage:
-        "Try removing the name, or moving the function expression to a function declaration statement.",
+        "Try removing the name, or moving the function expression to a "
+        "function declaration statement.",
   );
 
   static const ParserErrorCode NAMED_FUNCTION_TYPE = ParserErrorCode(
@@ -1338,7 +1385,8 @@
 
   static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = ParserErrorCode(
     'NATIVE_CLAUSE_IN_NON_SDK_CODE',
-    "Native clause can only be used in the SDK and code that is loaded through native extensions.",
+    "Native clause can only be used in the SDK and code that is loaded through "
+        "native extensions.",
     correctionMessage: "Try removing the native clause.",
   );
 
@@ -1347,13 +1395,15 @@
     'NATIVE_CLAUSE_SHOULD_BE_ANNOTATION',
     "Native clause in this form is deprecated.",
     correctionMessage:
-        "Try removing this native clause and adding @native() or @native('native-name') before the declaration.",
+        "Try removing this native clause and adding @native() or "
+        "@native('native-name') before the declaration.",
   );
 
   static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE =
       ParserErrorCode(
     'NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE',
-    "Native functions can only be declared in the SDK and code that is loaded through native extensions.",
+    "Native functions can only be declared in the SDK and code that is loaded "
+        "through native extensions.",
     correctionMessage: "Try removing the word 'native'.",
   );
 
@@ -1373,7 +1423,8 @@
     'NON_PART_OF_DIRECTIVE_IN_PART',
     "The part-of directive must be the only directive in a part.",
     correctionMessage:
-        "Try removing the other directives, or moving them to the library for which this is a part.",
+        "Try removing the other directives, or moving them to the library for "
+        "which this is a part.",
   );
 
   static const ParserErrorCode NON_STRING_LITERAL_AS_URI = ParserErrorCode(
@@ -1397,7 +1448,8 @@
     'NORMAL_BEFORE_OPTIONAL_PARAMETERS',
     "Normal parameters must occur before optional parameters.",
     correctionMessage:
-        "Try moving all of the normal parameters before the optional parameters.",
+        "Try moving all of the normal parameters before the optional "
+        "parameters.",
   );
 
   static const ParserErrorCode NULL_AWARE_CASCADE_OUT_OF_ORDER =
@@ -1405,7 +1457,8 @@
     'NULL_AWARE_CASCADE_OUT_OF_ORDER',
     "The '?..' cascade operator must be first in the cascade sequence.",
     correctionMessage:
-        "Try moving the '?..' operator to be the first cascade operator in the sequence.",
+        "Try moving the '?..' operator to be the first cascade operator in the "
+        "sequence.",
   );
 
   static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT =
@@ -1413,7 +1466,8 @@
     'POSITIONAL_AFTER_NAMED_ARGUMENT',
     "Positional arguments must occur before named arguments.",
     correctionMessage:
-        "Try moving all of the positional arguments before the named arguments.",
+        "Try moving all of the positional arguments before the named "
+        "arguments.",
   );
 
   static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP =
@@ -1515,7 +1569,8 @@
     'TOP_LEVEL_OPERATOR',
     "Operators must be declared within a class.",
     correctionMessage:
-        "Try removing the operator, moving it to a class, or converting it to be a function.",
+        "Try removing the operator, moving it to a class, or converting it to "
+        "be a function.",
   );
 
   static const ParserErrorCode TYPEDEF_IN_CLASS = ParserErrorCode(
@@ -1601,14 +1656,16 @@
     'VAR_RETURN_TYPE',
     "The return type can't be 'var'.",
     correctionMessage:
-        "Try removing the keyword 'var', or replacing it with the name of the return type.",
+        "Try removing the keyword 'var', or replacing it with the name of the "
+        "return type.",
   );
 
   static const ParserErrorCode VAR_TYPEDEF = ParserErrorCode(
     'VAR_TYPEDEF',
     "Typedefs can't be declared to be 'var'.",
     correctionMessage:
-        "Try removing the keyword 'var', or replacing it with the name of the return type.",
+        "Try removing the keyword 'var', or replacing it with the name of the "
+        "return type.",
   );
 
   static const ParserErrorCode VOID_WITH_TYPE_ARGUMENTS = ParserErrorCode(
diff --git a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
index ef663ca..10b3313 100644
--- a/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/micro/analysis_context.dart
@@ -208,9 +208,7 @@
 
   @override
   Uri? pathToUri(String path, {String? containingPath}) {
-    var fileUri = resourceProvider.pathContext.toUri(path);
-    var fileSource = sourceFactory.forUri2(fileUri)!;
-    return sourceFactory.restoreUri(fileSource);
+    return sourceFactory.pathToUri(path);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index e904ee0..d3ba759 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -197,7 +197,7 @@
   /// Compute [_constants] in all units.
   void _computeConstants() {
     computeConstants(_typeProvider, _typeSystem, _declaredVariables,
-        _constants.toList(), _analysisOptions.experimentStatus);
+        _constants.toList(), _libraryElement.featureSet);
   }
 
   void _computeDiagnostics({
@@ -362,18 +362,15 @@
   }
 
   void _computeVerifyErrors(FileState file, CompilationUnit unit) {
-    RecordingErrorListener errorListener = _getErrorListener(file);
+    ErrorReporter errorReporter = _getErrorReporter(file);
 
     CodeChecker checker = CodeChecker(
       _typeProvider,
       _typeSystem,
-      _inheritance,
-      errorListener,
+      errorReporter,
     );
     checker.visitCompilationUnit(unit);
 
-    ErrorReporter errorReporter = _getErrorReporter(file);
-
     //
     // Validate the directives.
     //
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index 7bd4630..6476871 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -43,39 +43,9 @@
   libraryWalker.walk(libraryWalker.getNode(file));
 }
 
-class CiderUnitTopLevelDeclarations {
-  final List<String> extensionNames;
-  final List<String> functionNames;
-  final List<String> typeNames;
-  final List<String> variableNames;
-
-  CiderUnitTopLevelDeclarations({
-    required this.extensionNames,
-    required this.functionNames,
-    required this.typeNames,
-    required this.variableNames,
-  });
-
-  factory CiderUnitTopLevelDeclarations.read(SummaryDataReader reader) {
-    return CiderUnitTopLevelDeclarations(
-      extensionNames: reader.readStringUtf8List(),
-      functionNames: reader.readStringUtf8List(),
-      typeNames: reader.readStringUtf8List(),
-      variableNames: reader.readStringUtf8List(),
-    );
-  }
-
-  void write(BufferedSink sink) {
-    sink.writeStringUtf8Iterable(extensionNames);
-    sink.writeStringUtf8Iterable(functionNames);
-    sink.writeStringUtf8Iterable(typeNames);
-    sink.writeStringUtf8Iterable(variableNames);
-  }
-}
-
 class CiderUnlinkedUnit {
   /// Top-level declarations of the unit.
-  final CiderUnitTopLevelDeclarations topLevelDeclarations;
+  final Set<String> topLevelDeclarations;
 
   /// Unlinked summary of the compilation unit.
   final UnlinkedUnit unit;
@@ -93,7 +63,7 @@
 
   factory CiderUnlinkedUnit.read(SummaryDataReader reader) {
     return CiderUnlinkedUnit(
-      topLevelDeclarations: CiderUnitTopLevelDeclarations.read(reader),
+      topLevelDeclarations: reader.readStringUtf8Set(),
       unit: UnlinkedUnit.read(reader),
     );
   }
@@ -106,7 +76,7 @@
   }
 
   void write(BufferedSink sink) {
-    topLevelDeclarations.write(sink);
+    sink.writeStringUtf8Iterable(topLevelDeclarations);
     unit.write(sink);
   }
 }
@@ -335,10 +305,7 @@
       return file;
     }
 
-    var fileUri = _resourceProvider.pathContext.toUri(path);
-    var uri = _sourceFactory.restoreUri(
-      _FakeSource(path, fileUri),
-    );
+    var uri = _sourceFactory.pathToUri(path);
     if (uri == null) {
       throw StateError('Unable to convert path to URI: $path');
     }
@@ -389,50 +356,18 @@
   }
 
   /// Return files that have a top-level declaration with the [name].
-  List<FileWithTopLevelDeclaration> getFilesWithTopLevelDeclarations(
-    String name,
-  ) {
-    var result = <FileWithTopLevelDeclaration>[];
-
+  List<FileState> getFilesWithTopLevelDeclarations(String name) {
+    var result = <FileState>[];
     for (var file in _pathToFile.values) {
-      void addDeclaration(
-        List<String> names,
-        FileTopLevelDeclarationKind kind,
-      ) {
-        if (names.contains(name)) {
-          result.add(
-            FileWithTopLevelDeclaration(file: file, kind: kind),
-          );
-        }
+      if (file._unlinked.unlinked.topLevelDeclarations.contains(name)) {
+        result.add(file);
       }
-
-      var topLevelDeclarations = file._unlinked.unlinked.topLevelDeclarations;
-      addDeclaration(
-        topLevelDeclarations.extensionNames,
-        FileTopLevelDeclarationKind.extension,
-      );
-      addDeclaration(
-        topLevelDeclarations.functionNames,
-        FileTopLevelDeclarationKind.function,
-      );
-      addDeclaration(
-        topLevelDeclarations.typeNames,
-        FileTopLevelDeclarationKind.type,
-      );
-      addDeclaration(
-        topLevelDeclarations.variableNames,
-        FileTopLevelDeclarationKind.variable,
-      );
     }
     return result;
   }
 
   String? getPathForUri(Uri uri) {
-    var source = _sourceFactory.forUri2(uri);
-    if (source == null) {
-      return null;
-    }
-    return source.fullName;
+    return _sourceFactory.forUri2(uri)?.fullName;
   }
 
   /// Computes the set of [FileState]'s used/not used to analyze the given
@@ -534,20 +469,6 @@
   }
 }
 
-/// The kind in [FileWithTopLevelDeclaration].
-enum FileTopLevelDeclarationKind { extension, function, type, variable }
-
-/// The data structure for top-level declarations response.
-class FileWithTopLevelDeclaration {
-  final FileState file;
-  final FileTopLevelDeclarationKind kind;
-
-  FileWithTopLevelDeclaration({
-    required this.file,
-    required this.kind,
-  });
-}
-
 /// Information about libraries that reference each other, so form a cycle.
 class LibraryCycle {
   /// The libraries that belong to this cycle.
@@ -593,19 +514,6 @@
   });
 }
 
-class _FakeSource implements Source {
-  @override
-  final String fullName;
-
-  @override
-  final Uri uri;
-
-  _FakeSource(this.fullName, this.uri);
-
-  @override
-  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
 class _FileStateFiles {
   final List<FileState> imported = [];
   final List<FileState> exported = [];
@@ -712,19 +620,28 @@
     return _fsState._resourceProvider.getFile(path);
   }
 
+  Uri? resolveRelativeUriStr(String relativeUriStr) {
+    if (relativeUriStr.isEmpty) {
+      return null;
+    }
+
+    Uri relativeUri;
+    try {
+      relativeUri = Uri.parse(relativeUriStr);
+    } on FormatException {
+      return null;
+    }
+
+    return resolveRelativeUri(uri, relativeUri);
+  }
+
   FileState? _fileForRelativeUri({
     FileState? containingLibrary,
     required String relativeUri,
     required OperationPerformanceImpl performance,
   }) {
-    if (relativeUri.isEmpty) {
-      return null;
-    }
-
-    Uri absoluteUri;
-    try {
-      absoluteUri = resolveRelativeUri(uri, Uri.parse(relativeUri));
-    } on FormatException {
+    var absoluteUri = resolveRelativeUriStr(relativeUri);
+    if (absoluteUri == null) {
       return null;
     }
 
@@ -760,6 +677,7 @@
         }
       }
     }
+    return null;
   }
 
   _ContentWithDigest _getContent() {
@@ -890,51 +808,46 @@
     }
 
     var libraryUri = unlinked.unit.partOfUri;
-    if (libraryUri != null) {
-      location._fsState.testView.partsDiscoveredLibraries.add(location.path);
-      return _partOfLibrary = location._fileForRelativeUri(
-        relativeUri: libraryUri,
-        performance: performance,
-      );
+    if (libraryUri == null) {
+      return null;
     }
+    location._fsState.testView.partsDiscoveredLibraries.add(location.path);
+    return _partOfLibrary = location._fileForRelativeUri(
+      relativeUri: libraryUri,
+      performance: performance,
+    );
   }
 
   void _prefetchDirectReferences() {
-    if (location._fsState.prefetchFiles == null) {
+    var prefetchFiles = location._fsState.prefetchFiles;
+    if (prefetchFiles == null) {
       return;
     }
 
     var paths = <String>{};
 
-    /// TODO(scheglov) This is duplicate.
-    void findPathForUri(String relativeUri) {
-      if (relativeUri.isEmpty) {
-        return;
-      }
-      Uri absoluteUri;
-      try {
-        absoluteUri = resolveRelativeUri(location.uri, Uri.parse(relativeUri));
-      } on FormatException {
-        return;
-      }
-      var p = location._fsState.getPathForUri(absoluteUri);
-      if (p != null) {
-        paths.add(p);
+    void addRelativeUri(String relativeUri) {
+      var absoluteUri = location.resolveRelativeUriStr(relativeUri);
+      if (absoluteUri != null) {
+        var path = location._fsState.getPathForUri(absoluteUri);
+        if (path != null) {
+          paths.add(path);
+        }
       }
     }
 
     var unlinkedUnit = unlinked.unit;
     for (var directive in unlinkedUnit.imports) {
-      findPathForUri(directive.uri);
+      addRelativeUri(directive.uri);
     }
     for (var directive in unlinkedUnit.exports) {
-      findPathForUri(directive.uri);
+      addRelativeUri(directive.uri);
     }
     for (var uri in unlinkedUnit.parts) {
-      findPathForUri(uri);
+      addRelativeUri(uri);
     }
 
-    location._fsState.prefetchFiles!(paths.toList());
+    prefetchFiles(paths.toList());
   }
 
   static CompilationUnitImpl parse(AnalysisErrorListener errorListener,
@@ -1019,27 +932,24 @@
       );
     }
 
-    var declaredExtensions = <String>[];
-    var declaredFunctions = <String>[];
-    var declaredTypes = <String>[];
-    var declaredVariables = <String>[];
+    var topLevelDeclarations = <String>{};
     for (var declaration in unit.declarations) {
       if (declaration is ClassDeclaration) {
-        declaredTypes.add(declaration.name.name);
+        topLevelDeclarations.add(declaration.name.name);
       } else if (declaration is EnumDeclaration) {
-        declaredTypes.add(declaration.name.name);
+        topLevelDeclarations.add(declaration.name.name);
       } else if (declaration is ExtensionDeclaration) {
         var name = declaration.name;
         if (name != null) {
-          declaredExtensions.add(name.name);
+          topLevelDeclarations.add(name.name);
         }
       } else if (declaration is FunctionDeclaration) {
-        declaredFunctions.add(declaration.name.name);
+        topLevelDeclarations.add(declaration.name.name);
       } else if (declaration is MixinDeclaration) {
-        declaredTypes.add(declaration.name.name);
+        topLevelDeclarations.add(declaration.name.name);
       } else if (declaration is TopLevelVariableDeclaration) {
         for (var variable in declaration.variables.variables) {
-          declaredVariables.add(variable.name.name);
+          topLevelDeclarations.add(variable.name.name);
         }
       }
     }
@@ -1059,12 +969,7 @@
 
     return CiderUnlinkedUnit(
       unit: unlinkedUnit,
-      topLevelDeclarations: CiderUnitTopLevelDeclarations(
-        extensionNames: declaredExtensions,
-        functionNames: declaredFunctions,
-        typeNames: declaredTypes,
-        variableNames: declaredVariables,
-      ),
+      topLevelDeclarations: topLevelDeclarations,
     );
   }
 
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 89c1fe0..ac5a4809 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/dart/analysis/context_root.dart';
@@ -17,7 +18,6 @@
 import 'package:analyzer/src/dart/analysis/feature_set_provider.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/results.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/micro/analysis_context.dart';
 import 'package:analyzer/src/dart/micro/cider_byte_store.dart';
 import 'package:analyzer/src/dart/micro/library_analyzer.dart';
@@ -46,19 +46,20 @@
 
 class CiderSearchMatch {
   final String path;
-  final List<int> offsets;
+  final List<CharacterLocation?> startPositions;
 
-  CiderSearchMatch(this.path, this.offsets);
+  CiderSearchMatch(this.path, this.startPositions);
 
   @override
   bool operator ==(Object object) =>
       object is CiderSearchMatch &&
       path == object.path &&
-      const ListEquality<int>().equals(offsets, object.offsets);
+      const ListEquality<CharacterLocation?>()
+          .equals(startPositions, object.startPositions);
 
   @override
   String toString() {
-    return '($path, $offsets)';
+    return '($path, $startPositions)';
   }
 }
 
@@ -184,29 +185,46 @@
     removedCacheIds.addAll(libraryContext!.collectSharedDataIdentifiers());
   }
 
-  /// Looks for references to the Element at the given offset and path. All the
-  /// files currently cached by the resolver are searched, generated files are
-  /// ignored.
-  List<CiderSearchMatch> findReferences(int offset, String path,
+  /// Looks for references to the given Element. All the files currently
+  ///  cached by the resolver are searched, generated files are ignored.
+  List<CiderSearchMatch> findReferences(Element element,
       {OperationPerformanceImpl? performance}) {
-    var references = <CiderSearchMatch>[];
-    var unit = resolve(path: path);
-    var node = NodeLocator(offset).searchWithin(unit.unit);
-    var element = getElementOfNode(node);
-    if (element != null) {
+    return logger.run('findReferences for ${element.name}', () {
+      var references = <CiderSearchMatch>[];
+
+      void collectReferences(
+          String path, OperationPerformanceImpl performance) {
+        performance.run('collectReferences', (_) {
+          var resolved = resolve(path: path);
+          var collector = ReferencesCollector(element);
+          resolved.unit.accept(collector);
+          var offsets = collector.offsets;
+          if (offsets.isNotEmpty) {
+            var lineInfo = resolved.unit.lineInfo;
+            references.add(CiderSearchMatch(
+                path,
+                offsets
+                    .map((offset) => lineInfo?.getLocation(offset))
+                    .toList()));
+          }
+        });
+      }
+
+      performance ??= OperationPerformanceImpl('<default>');
       // TODO(keertip): check if element is named constructor.
-      var result = fsState!.getFilesContaining(element.displayName);
-      result.forEach((filePath) {
-        var resolved = resolve(path: filePath);
-        var collector = ReferencesCollector(element);
-        resolved.unit.accept(collector);
-        var offsets = collector.offsets;
-        if (offsets.isNotEmpty) {
-          references.add(CiderSearchMatch(filePath, offsets));
-        }
-      });
-    }
-    return references;
+      if (element is LocalVariableElement ||
+          (element is ParameterElement && !element.isNamed)) {
+        collectReferences(element.source!.fullName, performance!);
+      } else {
+        var result = performance!.run('getFilesContaining', (performance) {
+          return fsState!.getFilesContaining(element.displayName);
+        });
+        result.forEach((filePath) {
+          collectReferences(filePath, performance!);
+        });
+      }
+      return references;
+    });
   }
 
   ErrorsResult getErrors({
@@ -292,9 +310,7 @@
   }
 
   /// Return files that have a top-level declaration with the [name].
-  List<FileWithTopLevelDeclaration> getFilesWithTopLevelDeclarations(
-    String name,
-  ) {
+  List<FileState> getFilesWithTopLevelDeclarations(String name) {
     final fsState = this.fsState;
     if (fsState == null) {
       return const [];
@@ -551,7 +567,7 @@
 
       var libraryUnit = resolvedUnits.first;
       var result = ResolvedLibraryResultImpl(contextObjects!.analysisSession,
-          path, libraryUnit.uri, libraryUnit.libraryElement, resolvedUnits);
+          libraryUnit.libraryElement, resolvedUnits);
 
       if (completionPath == null) {
         cachedResults[path] = result;
@@ -635,6 +651,7 @@
         return file;
       }
     }
+    return null;
   }
 
   /// Return the analysis options.
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index aa594c5..0391099 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -263,6 +263,19 @@
     _visitArguments(node, whyNotPromotedList);
   }
 
+  void _localVariable(
+    AnnotationImpl node,
+    VariableElement element,
+    List<WhyNotPromotedGetter> whyNotPromotedList,
+  ) {
+    if (!element.isConst || node.arguments != null) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_ANNOTATION, node);
+    }
+
+    _visitArguments(node, whyNotPromotedList);
+  }
+
   void _propertyAccessorElement(
     AnnotationImpl node,
     SimpleIdentifierImpl name,
@@ -393,8 +406,8 @@
       return;
     }
 
-    // TODO(scheglov) Must be const.
     if (element1 is VariableElement) {
+      _localVariable(node, element1, whyNotPromotedList);
       return;
     }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
new file mode 100644
index 0000000..5d26817
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
@@ -0,0 +1,236 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/features.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/dart/element/generic_inferrer.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/resolver/resolution_result.dart';
+
+class InstantiatedExtensionWithMember {
+  final _NotInstantiatedExtensionWithMember candidate;
+  final MapSubstitution substitution;
+  final DartType extendedType;
+
+  InstantiatedExtensionWithMember(
+    this.candidate,
+    this.substitution,
+    this.extendedType,
+  );
+
+  ResolutionResult get asResolutionResult {
+    return ResolutionResult(getter: getter, setter: setter);
+  }
+
+  ExtensionElement get extension => candidate.extension;
+
+  ExecutableElement? get getter {
+    var getter = candidate.getter;
+    if (getter == null) {
+      return null;
+    }
+    return ExecutableMember.from2(getter, substitution);
+  }
+
+  ExecutableElement? get setter {
+    var setter = candidate.setter;
+    if (setter == null) {
+      return null;
+    }
+    return ExecutableMember.from2(setter, substitution);
+  }
+}
+
+class InstantiatedExtensionWithoutMember {
+  final ExtensionElement extension;
+  final MapSubstitution substitution;
+  final DartType extendedType;
+
+  InstantiatedExtensionWithoutMember(
+    this.extension,
+    this.substitution,
+    this.extendedType,
+  );
+}
+
+abstract class _NotInstantiatedExtension<R> {
+  final ExtensionElement extension;
+
+  _NotInstantiatedExtension(this.extension);
+
+  R instantiate({
+    required MapSubstitution substitution,
+    required DartType extendedType,
+  });
+}
+
+class _NotInstantiatedExtensionWithMember
+    extends _NotInstantiatedExtension<InstantiatedExtensionWithMember> {
+  final ExecutableElement? getter;
+  final ExecutableElement? setter;
+
+  _NotInstantiatedExtensionWithMember(ExtensionElement extension,
+      {this.getter, this.setter})
+      : assert(getter != null || setter != null),
+        super(extension);
+
+  @override
+  InstantiatedExtensionWithMember instantiate({
+    required MapSubstitution substitution,
+    required DartType extendedType,
+  }) {
+    return InstantiatedExtensionWithMember(this, substitution, extendedType);
+  }
+}
+
+/// [_NotInstantiatedExtension] for any [ExtensionElement].
+class _NotInstantiatedExtensionWithoutMember
+    extends _NotInstantiatedExtension<InstantiatedExtensionWithoutMember> {
+  _NotInstantiatedExtensionWithoutMember(ExtensionElement extension)
+      : super(extension);
+
+  @override
+  InstantiatedExtensionWithoutMember instantiate({
+    required MapSubstitution substitution,
+    required DartType extendedType,
+  }) {
+    return InstantiatedExtensionWithoutMember(
+        extension, substitution, extendedType);
+  }
+}
+
+extension ExtensionsExtensions on Iterable<ExtensionElement> {
+  /// Extensions that can be applied, within [targetLibrary], to [targetType].
+  List<InstantiatedExtensionWithoutMember> applicableTo({
+    required LibraryElement targetLibrary,
+    required DartType targetType,
+  }) {
+    return map((e) => _NotInstantiatedExtensionWithoutMember(e)).applicableTo(
+      targetLibrary: targetLibrary,
+      targetType: targetType,
+    );
+  }
+
+  List<_NotInstantiatedExtensionWithMember> hasMemberWithBaseName(
+    String baseName,
+  ) {
+    var result = <_NotInstantiatedExtensionWithMember>[];
+    for (var extension in this) {
+      if (baseName == '[]') {
+        ExecutableElement? getter;
+        ExecutableElement? setter;
+        for (var method in extension.methods) {
+          if (method.name == '[]') {
+            getter = method;
+          } else if (method.name == '[]=') {
+            setter = method;
+          }
+        }
+        if (getter != null || setter != null) {
+          result.add(
+            _NotInstantiatedExtensionWithMember(
+              extension,
+              getter: getter,
+              setter: setter,
+            ),
+          );
+        }
+      } else {
+        for (var field in extension.fields) {
+          if (field.name == baseName) {
+            result.add(
+              _NotInstantiatedExtensionWithMember(
+                extension,
+                getter: field.getter,
+                setter: field.setter,
+              ),
+            );
+            break;
+          }
+        }
+        for (var method in extension.methods) {
+          if (method.name == baseName) {
+            result.add(
+              _NotInstantiatedExtensionWithMember(
+                extension,
+                getter: method,
+              ),
+            );
+            break;
+          }
+        }
+      }
+    }
+    return result;
+  }
+}
+
+extension NotInstantiatedExtensionsExtensions<R>
+    on Iterable<_NotInstantiatedExtension<R>> {
+  /// Extensions that can be applied, within [targetLibrary], to [targetType].
+  List<R> applicableTo({
+    required LibraryElement targetLibrary,
+    required DartType targetType,
+  }) {
+    if (identical(targetType, NeverTypeImpl.instance)) {
+      return <R>[];
+    }
+
+    targetLibrary as LibraryElementImpl;
+    var typeSystem = targetLibrary.typeSystem;
+    var genericMetadataIsEnabled = targetLibrary.featureSet.isEnabled(
+      Feature.generic_metadata,
+    );
+
+    var instantiated = <R>[];
+
+    for (var notInstantiated in this) {
+      var extension = notInstantiated.extension;
+
+      var freshTypes = getFreshTypeParameters(extension.typeParameters);
+      var freshTypeParameters = freshTypes.freshTypeParameters;
+      var rawExtendedType = freshTypes.substitute(extension.extendedType);
+
+      var inferrer = GenericInferrer(typeSystem, freshTypeParameters);
+      inferrer.constrainArgument(
+        targetType,
+        rawExtendedType,
+        'extendedType',
+      );
+      var typeArguments = inferrer.infer(
+        freshTypeParameters,
+        failAtError: true,
+        genericMetadataIsEnabled: genericMetadataIsEnabled,
+      );
+      if (typeArguments == null) {
+        continue;
+      }
+
+      var substitution = Substitution.fromPairs(
+        extension.typeParameters,
+        typeArguments,
+      );
+      var extendedType = substitution.substituteType(
+        extension.extendedType,
+      );
+
+      if (!typeSystem.isSubtypeOf(targetType, extendedType)) {
+        continue;
+      }
+
+      instantiated.add(
+        notInstantiated.instantiate(
+          substitution: substitution,
+          extendedType: extendedType,
+        ),
+      );
+    }
+
+    return instantiated;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index 25dfe1a..61f364e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -232,7 +232,7 @@
       return node;
     }
     if (parent is CommentReference) {
-      // TODO(srawlins): This probably should be rewritten to a
+      // TODO(srawlins): This probably should be allowed to be rewritten to a
       // [ConstructorReference] at some point.
       return node;
     }
@@ -281,6 +281,11 @@
       // `Type`.
       return node;
     }
+    if (node.parent is CommentReference) {
+      // TODO(srawlins): This probably should be allowed to be rewritten to a
+      // [ConstructorReference] at some point.
+      return node;
+    }
     var receiver = node.target!;
 
     Identifier receiverIdentifier;
diff --git a/pkg/analyzer/lib/src/dart/resolver/comment_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/comment_reference_resolver.dart
new file mode 100644
index 0000000..e67b6b1
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/resolver/comment_reference_resolver.dart
@@ -0,0 +1,192 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
+import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+class CommentReferenceResolver {
+  final TypeProviderImpl _typeProvider;
+
+  final ResolverVisitor _resolver;
+
+  /// Helper for resolving properties on types.
+  final TypePropertyResolver _typePropertyResolver;
+
+  CommentReferenceResolver(this._typeProvider, this._resolver)
+      : _typePropertyResolver = _resolver.typePropertyResolver;
+
+  /// Resolves [commentReference].
+  void resolve(CommentReference commentReference) {
+    var expression = commentReference.expression;
+    if (expression is SimpleIdentifierImpl) {
+      _resolveSimpleIdentifierReference(expression,
+          hasNewKeyword: commentReference.newKeyword != null);
+    } else if (expression is PrefixedIdentifierImpl) {
+      _resolvePrefixedIdentifierReference(expression,
+          hasNewKeyword: commentReference.newKeyword != null);
+    } else if (expression is PropertyAccessImpl) {
+      _resolvePropertyAccessReference(expression,
+          hasNewKeyword: commentReference.newKeyword != null);
+    }
+  }
+
+  void _resolvePrefixedIdentifierReference(
+    PrefixedIdentifierImpl expression, {
+    required bool hasNewKeyword,
+  }) {
+    var prefix = expression.prefix;
+    var prefixElement = _resolveSimpleIdentifier(prefix);
+    prefix.staticElement = prefixElement;
+
+    if (prefixElement == null) {
+      return;
+    }
+
+    var name = expression.identifier;
+
+    if (prefixElement is PrefixElement) {
+      var prefixScope = prefixElement.scope;
+      var lookupResult = prefixScope.lookup(name.name);
+      var element = lookupResult.getter ?? lookupResult.setter;
+      element = _resolver.toLegacyElement(element);
+      name.staticElement = element;
+      return;
+    }
+
+    if (!hasNewKeyword) {
+      if (prefixElement is ClassElement) {
+        name.staticElement = prefixElement.getMethod(name.name) ??
+            prefixElement.getGetter(name.name) ??
+            prefixElement.getSetter(name.name) ??
+            prefixElement.getNamedConstructor(name.name);
+      } else if (prefixElement is ExtensionElement) {
+        name.staticElement = prefixElement.getMethod(name.name) ??
+            prefixElement.getGetter(name.name) ??
+            prefixElement.getSetter(name.name);
+      } else {
+        // TODO(brianwilkerson) Report this error.
+      }
+    } else if (prefixElement is ClassElement) {
+      var constructor = prefixElement.getNamedConstructor(name.name);
+      if (constructor == null) {
+        // TODO(brianwilkerson) Report this error.
+      } else {
+        name.staticElement = constructor;
+      }
+    } else {
+      // TODO(brianwilkerson) Report this error.
+    }
+  }
+
+  void _resolvePropertyAccessReference(
+    PropertyAccessImpl expression, {
+    required bool hasNewKeyword,
+  }) {
+    var target = expression.target;
+    if (target is! PrefixedIdentifierImpl) {
+      // A PropertyAccess with a target more complex than a
+      // [PrefixedIdentifier] is not a valid comment reference.
+      return;
+    }
+
+    var prefix = target.prefix;
+    var prefixElement = _resolveSimpleIdentifier(prefix);
+    prefix.staticElement = prefixElement;
+
+    if (prefixElement is! PrefixElement) {
+      // The only valid prefixElement is a PrefixElement; otherwise, this is
+      // not a comment reference.
+      return;
+    }
+
+    var name = target.identifier;
+    var prefixScope = prefixElement.scope;
+    var lookupResult = prefixScope.lookup(name.name);
+    var element = lookupResult.getter ?? lookupResult.setter;
+    element = _resolver.toLegacyElement(element);
+    name.staticElement = element;
+
+    var propertyName = expression.propertyName;
+    if (element is ClassElement) {
+      propertyName.staticElement = element.getMethod(propertyName.name) ??
+          element.getGetter(propertyName.name) ??
+          element.getSetter(propertyName.name) ??
+          element.getNamedConstructor(propertyName.name);
+    } else if (element is ExtensionElement) {
+      propertyName.staticElement = element.getMethod(propertyName.name) ??
+          element.getGetter(propertyName.name) ??
+          element.getSetter(propertyName.name);
+    }
+  }
+
+  /// Resolves the given simple [identifier] if possible.
+  ///
+  /// Returns the resolved element, or `null` if the identifier could not be
+  /// resolved. This does not record the results of the resolution.
+  Element? _resolveSimpleIdentifier(SimpleIdentifierImpl identifier) {
+    var lookupResult = identifier.scopeLookupResult!;
+
+    var element = _resolver.toLegacyElement(lookupResult.getter) ??
+        _resolver.toLegacyElement(lookupResult.setter);
+
+    if (element == null) {
+      InterfaceType enclosingType;
+      var enclosingClass = _resolver.enclosingClass;
+      if (enclosingClass != null) {
+        enclosingType = enclosingClass.thisType;
+      } else {
+        var enclosingExtension = _resolver.enclosingExtension;
+        if (enclosingExtension == null) {
+          return null;
+        }
+        var extendedType = enclosingExtension.extendedType
+            .resolveToBound(_typeProvider.objectType);
+        if (extendedType is InterfaceType) {
+          enclosingType = extendedType;
+        } else if (extendedType is FunctionType) {
+          enclosingType = _typeProvider.functionType;
+        } else {
+          return null;
+        }
+      }
+      var result = _typePropertyResolver.resolve(
+        receiver: null,
+        receiverType: enclosingType,
+        name: identifier.name,
+        propertyErrorEntity: identifier,
+        nameErrorEntity: identifier,
+      );
+      element = result.getter ?? result.setter;
+    }
+    return element;
+  }
+
+  void _resolveSimpleIdentifierReference(
+    SimpleIdentifierImpl expression, {
+    required bool hasNewKeyword,
+  }) {
+    var element = _resolveSimpleIdentifier(expression);
+    if (element == null) {
+      return;
+    }
+    expression.staticElement = element;
+    if (hasNewKeyword) {
+      if (element is ClassElement) {
+        var constructor = element.unnamedConstructor;
+        if (constructor == null) {
+          // TODO(brianwilkerson) Report this error.
+        } else {
+          expression.staticElement = constructor;
+        }
+      } else {
+        // TODO(brianwilkerson) Report this error.
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
index c7afae0..517ff5c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -13,10 +13,10 @@
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/generic_inferrer.dart';
 import 'package:analyzer/src/dart/element/member.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
+import 'package:analyzer/src/dart/resolver/applicable_extensions.dart';
 import 'package:analyzer/src/dart/resolver/resolution_result.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -54,7 +54,12 @@
     SyntacticEntity nameEntity,
     String name,
   ) {
-    var extensions = _getApplicable(type, name);
+    var extensions = _resolver.definingLibrary.accessibleExtensions
+        .hasMemberWithBaseName(name)
+        .applicableTo(
+          targetLibrary: _resolver.definingLibrary,
+          targetType: type,
+        );
 
     if (extensions.isEmpty) {
       return ResolutionResult.none;
@@ -263,10 +268,11 @@
 
   /// Return either the most specific extension, or a list of the extensions
   /// that are ambiguous.
-  Either2<_InstantiatedExtension, List<_InstantiatedExtension>>
-      _chooseMostSpecific(List<_InstantiatedExtension> extensions) {
-    _InstantiatedExtension? bestSoFar;
-    var noneMoreSpecific = <_InstantiatedExtension>[];
+  Either2<InstantiatedExtensionWithMember,
+          List<InstantiatedExtensionWithMember>>
+      _chooseMostSpecific(List<InstantiatedExtensionWithMember> extensions) {
+    InstantiatedExtensionWithMember? bestSoFar;
+    var noneMoreSpecific = <InstantiatedExtensionWithMember>[];
     for (var candidate in extensions) {
       if (noneMoreSpecific.isNotEmpty) {
         var isMostSpecific = true;
@@ -305,110 +311,6 @@
     }
   }
 
-  /// Return extensions for the [type] that match the given [name] in the
-  /// current scope.
-  List<_InstantiatedExtension> _getApplicable(DartType type, String name) {
-    if (identical(type, NeverTypeImpl.instance)) {
-      return const <_InstantiatedExtension>[];
-    }
-
-    var candidates = _getExtensionsWithMember(name);
-
-    var instantiatedExtensions = <_InstantiatedExtension>[];
-    for (var candidate in candidates) {
-      var extension = candidate.extension;
-
-      var freshTypes = getFreshTypeParameters(extension.typeParameters);
-      var freshTypeParameters = freshTypes.freshTypeParameters;
-      var rawExtendedType = freshTypes.substitute(extension.extendedType);
-
-      var inferrer = GenericInferrer(_typeSystem, freshTypeParameters);
-      inferrer.constrainArgument(
-        type,
-        rawExtendedType,
-        'extendedType',
-      );
-      var typeArguments = inferrer.infer(
-        freshTypeParameters,
-        failAtError: true,
-        genericMetadataIsEnabled: _genericMetadataIsEnabled,
-      );
-      if (typeArguments == null) {
-        continue;
-      }
-
-      var substitution = Substitution.fromPairs(
-        extension.typeParameters,
-        typeArguments,
-      );
-      var extendedType = substitution.substituteType(
-        extension.extendedType,
-      );
-      if (!_isSubtypeOf(type, extendedType)) {
-        continue;
-      }
-
-      instantiatedExtensions.add(
-        _InstantiatedExtension(candidate, substitution, extendedType),
-      );
-    }
-
-    return instantiatedExtensions;
-  }
-
-  /// Return extensions from the current scope, that define a member with the
-  /// given [name].
-  List<_CandidateExtension> _getExtensionsWithMember(String name) {
-    var candidates = <_CandidateExtension>[];
-
-    /// Add the given [extension] to the list of [candidates] if it defined a
-    /// member whose name matches the target [name].
-    void checkExtension(ExtensionElement extension) {
-      for (var field in extension.fields) {
-        if (field.name == name) {
-          candidates.add(
-            _CandidateExtension(
-              extension,
-              getter: field.getter,
-              setter: field.setter,
-            ),
-          );
-          return;
-        }
-      }
-      if (name == '[]') {
-        ExecutableElement? getter;
-        ExecutableElement? setter;
-        for (var method in extension.methods) {
-          if (method.name == '[]') {
-            getter = method;
-          } else if (method.name == '[]=') {
-            setter = method;
-          }
-        }
-        if (getter != null || setter != null) {
-          candidates.add(
-            _CandidateExtension(extension, getter: getter, setter: setter),
-          );
-        }
-      } else {
-        for (var method in extension.methods) {
-          if (method.name == name) {
-            candidates.add(
-              _CandidateExtension(extension, getter: method),
-            );
-            return;
-          }
-        }
-      }
-    }
-
-    for (var extension in _resolver.definingLibrary.accessibleExtensions) {
-      checkExtension(extension);
-    }
-    return candidates;
-  }
-
   /// Given the generic [element] element, either return types specified
   /// explicitly in [typeArguments], or infer type arguments from the given
   /// [receiverType].
@@ -469,7 +371,8 @@
   }
 
   /// Return `true` is [e1] is more specific than [e2].
-  bool _isMoreSpecific(_InstantiatedExtension e1, _InstantiatedExtension e2) {
+  bool _isMoreSpecific(
+      InstantiatedExtensionWithMember e1, InstantiatedExtensionWithMember e2) {
     // 1. The latter extension is declared in a platform library, and the
     //    former extension is not.
     // 2. They are both declared in platform libraries, or both declared in
@@ -531,42 +434,3 @@
         parent is PropertyAccess && parent.target == node;
   }
 }
-
-class _CandidateExtension {
-  final ExtensionElement extension;
-  final ExecutableElement? getter;
-  final ExecutableElement? setter;
-
-  _CandidateExtension(this.extension, {this.getter, this.setter})
-      : assert(getter != null || setter != null);
-}
-
-class _InstantiatedExtension {
-  final _CandidateExtension candidate;
-  final MapSubstitution substitution;
-  final DartType extendedType;
-
-  _InstantiatedExtension(this.candidate, this.substitution, this.extendedType);
-
-  ResolutionResult get asResolutionResult {
-    return ResolutionResult(getter: getter, setter: setter);
-  }
-
-  ExtensionElement get extension => candidate.extension;
-
-  ExecutableElement? get getter {
-    var getter = candidate.getter;
-    if (getter == null) {
-      return null;
-    }
-    return ExecutableMember.from2(getter, substitution);
-  }
-
-  ExecutableElement? get setter {
-    var setter = candidate.setter;
-    if (setter == null) {
-      return null;
-    }
-    return ExecutableMember.from2(setter, substitution);
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
index be1eec6..2558708 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_resolver.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:analyzer/src/dart/resolver/body_inference_context.dart';
 import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
 import 'package:analyzer/src/generated/migration.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -64,9 +63,7 @@
     _resolve2(node);
 
     if (_resolver.flowAnalysis.flow != null && !isFunctionDeclaration) {
-      var bodyContext = BodyInferenceContext.of(node.body);
       _resolver.checkForBodyMayCompleteNormally(
-        returnType: bodyContext?.contextType,
         body: body,
         errorNode: body,
       );
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 da8742a..dedb7b5 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -40,7 +40,7 @@
 
   ErrorReporter get _errorReporter => _resolver.errorReporter;
 
-  NullabilitySuffix get _nullabilitySuffixForTypeNames =>
+  NullabilitySuffix get _nullabilitySuffix =>
       _isNonNullableByDefault ? NullabilitySuffix.none : NullabilitySuffix.star;
 
   void resolve(FunctionReferenceImpl node) {
@@ -64,7 +64,10 @@
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
           typeArguments,
-          [function.constructorName.type2.name, function.constructorName.name!],
+          [
+            function.constructorName.type2.name.toSource(),
+            function.constructorName.name!.name
+          ],
         );
         _resolve(node: node, rawType: function.staticType);
       }
@@ -310,7 +313,7 @@
     );
     var type = element.instantiate(
       typeArguments: typeArguments,
-      nullabilitySuffix: _nullabilitySuffixForTypeNames,
+      nullabilitySuffix: _nullabilitySuffix,
     );
     _resolveTypeLiteral(node: node, instantiatedType: type, name: name);
   }
@@ -783,8 +786,9 @@
       CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
     );
     var type = element.instantiate(
-        typeArguments: typeArguments,
-        nullabilitySuffix: _nullabilitySuffixForTypeNames);
+      typeArguments: typeArguments,
+      nullabilitySuffix: _nullabilitySuffix,
+    );
     _resolveTypeLiteral(node: node, instantiatedType: type, name: typeAlias);
   }
 
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 36357aa..d7a8fd2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -129,10 +129,11 @@
       }
     }
 
-    if (typeParameters != null && rawElement != null) {
-      rawElement = _resolver.toLegacyElement(rawElement);
-      return ConstructorElementToInfer(typeParameters, rawElement);
+    if (typeParameters == null || rawElement == null) {
+      return null;
     }
+    rawElement = _resolver.toLegacyElement(rawElement);
+    return ConstructorElementToInfer(typeParameters, rawElement);
   }
 
   FunctionType? inferArgumentTypesForGeneric(AstNode inferenceNode,
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 157ba4c..d0f35da 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -240,7 +240,7 @@
         node: node,
         requested: writeElementRequested,
         recovery: writeElementRecovery,
-        receiverTypeObject: null,
+        receiverType: null,
       );
     }
 
@@ -469,7 +469,7 @@
           node: propertyName,
           requested: null,
           recovery: result.getter,
-          receiverTypeObject: targetType,
+          receiverType: targetType,
         );
       }
     }
@@ -543,7 +543,7 @@
           node: propertyName,
           requested: null,
           recovery: writeElementRecovery,
-          receiverTypeObject: typeReference.displayName,
+          receiverType: typeReference.thisType,
         );
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 0fb4f74..8138fda 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -63,7 +63,7 @@
   final bool _isNonNullableByDefault;
   final ErrorReporter _errorReporter;
   final AstRewriter _astRewriter;
-  final NamedTypeResolver _typeNameResolver;
+  final NamedTypeResolver _namedTypeResolver;
 
   /// This index is incremented every time we visit a [LibraryDirective].
   /// There is just one [LibraryElement], so we can support only one node.
@@ -103,7 +103,7 @@
       isNonNullableByDefault: isNonNullableByDefault,
     );
 
-    var typeNameResolver = NamedTypeResolver(
+    var namedTypeResolver = NamedTypeResolver(
       libraryElement,
       typeProvider,
       isNonNullableByDefault,
@@ -117,7 +117,7 @@
       isNonNullableByDefault,
       errorReporter,
       AstRewriter(errorReporter, typeProvider),
-      typeNameResolver,
+      namedTypeResolver,
       nameScope,
       elementWalker,
       ElementHolder(unitElement),
@@ -131,7 +131,7 @@
     this._isNonNullableByDefault,
     this._errorReporter,
     this._astRewriter,
-    this._typeNameResolver,
+    this._namedTypeResolver,
     this._nameScope,
     this._elementWalker,
     this._elementHolder,
@@ -218,7 +218,7 @@
   void visitClassDeclaration(covariant ClassDeclarationImpl node) {
     ClassElementImpl element = _elementWalker!.getClass();
     node.name.staticElement = element;
-    _typeNameResolver.enclosingClass = element;
+    _namedTypeResolver.enclosingClass = element;
 
     node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
@@ -247,14 +247,14 @@
       });
     });
 
-    _typeNameResolver.enclosingClass = null;
+    _namedTypeResolver.enclosingClass = null;
   }
 
   @override
   void visitClassTypeAlias(covariant ClassTypeAliasImpl node) {
     ClassElementImpl element = _elementWalker!.getClass();
     node.name.staticElement = element;
-    _typeNameResolver.enclosingClass = element;
+    _namedTypeResolver.enclosingClass = element;
 
     node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
@@ -275,7 +275,7 @@
       });
     });
 
-    _typeNameResolver.enclosingClass = null;
+    _namedTypeResolver.enclosingClass = null;
   }
 
   @override
@@ -885,11 +885,11 @@
   void visitNamedType(covariant NamedTypeImpl node) {
     node.typeArguments?.accept(this);
 
-    _typeNameResolver.nameScope = _nameScope;
-    _typeNameResolver.resolve(node);
+    _namedTypeResolver.nameScope = _nameScope;
+    _namedTypeResolver.resolve(node);
 
-    if (_typeNameResolver.rewriteResult != null) {
-      _typeNameResolver.rewriteResult!.accept(this);
+    if (_namedTypeResolver.rewriteResult != null) {
+      _namedTypeResolver.rewriteResult!.accept(this);
     }
   }
 
@@ -976,6 +976,57 @@
   }
 
   @override
+  void visitSuperFormalParameter(covariant SuperFormalParameterImpl node) {
+    SuperFormalParameterElementImpl element;
+    if (node.parent is DefaultFormalParameter) {
+      element = node.declaredElement as SuperFormalParameterElementImpl;
+    } else {
+      var nameNode = node.identifier;
+      if (_elementWalker != null) {
+        element =
+            _elementWalker!.getParameter() as SuperFormalParameterElementImpl;
+      } else {
+        // Only for recovery, this should not happen in valid code.
+        element = SuperFormalParameterElementImpl(
+          name: nameNode.name,
+          nameOffset: nameNode.offset,
+          parameterKind: node.kind,
+        );
+        _elementHolder.enclose(element);
+        element.isConst = node.isConst;
+        element.isExplicitlyCovariant = node.covariantKeyword != null;
+        element.isFinal = node.isFinal;
+        _setCodeRange(element, node);
+      }
+      nameNode.staticElement = element;
+    }
+
+    _setOrCreateMetadataElements(element, node.metadata);
+
+    _withElementHolder(ElementHolder(element), () {
+      _withElementWalker(
+        _elementWalker != null ? ElementWalker.forParameter(element) : null,
+        () {
+          _withNameScope(() {
+            _buildTypeParameterElements(node.typeParameters);
+            node.typeParameters?.accept(this);
+            node.type?.accept(this);
+            if (_elementWalker != null) {
+              node.parameters?.accept(this);
+            } else {
+              // Only for recovery, this should not happen in valid code.
+              element.type = node.type?.type ?? _dynamicType;
+              _withElementWalker(null, () {
+                node.parameters?.accept(this);
+              });
+            }
+          });
+        },
+      );
+    });
+  }
+
+  @override
   void visitSwitchCase(SwitchCase node) {
     _buildLabelElements(node.labels, false, true);
 
@@ -1242,11 +1293,11 @@
     if (redirectedConstructor == null) return;
 
     var namedType = redirectedConstructor.type2;
-    _typeNameResolver.redirectedConstructor_namedType = namedType;
+    _namedTypeResolver.redirectedConstructor_namedType = namedType;
 
     redirectedConstructor.accept(this);
 
-    _typeNameResolver.redirectedConstructor_namedType = null;
+    _namedTypeResolver.redirectedConstructor_namedType = null;
   }
 
   /// Return the [InterfaceType] of the given [namedType].
@@ -1258,11 +1309,11 @@
   /// classes).
   void _resolveType(NamedTypeImpl namedType, ErrorCode errorCode,
       {bool asClass = false}) {
-    _typeNameResolver.classHierarchy_namedType = namedType;
+    _namedTypeResolver.classHierarchy_namedType = namedType;
     visitNamedType(namedType);
-    _typeNameResolver.classHierarchy_namedType = null;
+    _namedTypeResolver.classHierarchy_namedType = null;
 
-    if (_typeNameResolver.hasErrorReported) {
+    if (_namedTypeResolver.hasErrorReported) {
       return;
     }
 
@@ -1303,12 +1354,12 @@
     if (clause == null) return;
 
     for (var namedType in clause.mixinTypes2) {
-      _typeNameResolver.withClause_namedType = namedType;
+      _namedTypeResolver.withClause_namedType = namedType;
       _resolveType(
         namedType as NamedTypeImpl,
         CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
       );
-      _typeNameResolver.withClause_namedType = null;
+      _namedTypeResolver.withClause_namedType = null;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index 6e47fa5..0016d66 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -70,9 +70,9 @@
   /// This method should only be called in generator functions.
   void _checkForYieldOfInvalidType(
     BodyInferenceContext bodyContext,
-    YieldStatement node,
-    bool isYieldEach,
-  ) {
+    YieldStatement node, {
+    required bool isYieldEach,
+  }) {
     var expression = node.expression;
     var expressionType = expression.typeOrThrow;
 
@@ -88,11 +88,27 @@
     var imposedReturnType = bodyContext.imposedType;
     if (imposedReturnType != null &&
         !_typeSystem.isAssignableTo(impliedReturnType, imposedReturnType)) {
-      _errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
-        expression,
-        [impliedReturnType, imposedReturnType],
+      if (isYieldEach) {
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE,
+          expression,
+          [impliedReturnType, imposedReturnType],
+        );
+        return;
+      }
+      var imposedSequenceType = imposedReturnType.asInstanceOf(
+        bodyContext.isSynchronous
+            ? _typeProvider.iterableElement
+            : _typeProvider.streamElement,
       );
+      if (imposedSequenceType != null) {
+        var imposedValueType = imposedSequenceType.typeArguments[0];
+        _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
+          expression,
+          [expressionType, imposedValueType],
+        );
+      }
       return;
     }
 
@@ -109,7 +125,7 @@
 
       if (!_typeSystem.isAssignableTo(impliedReturnType, requiredReturnType)) {
         _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
+          CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE,
           expression,
           [impliedReturnType, requiredReturnType],
         );
@@ -134,7 +150,8 @@
 
     bodyContext.addYield(node);
 
-    _checkForYieldOfInvalidType(bodyContext, node, node.star != null);
+    _checkForYieldOfInvalidType(bodyContext, node,
+        isYieldEach: node.star != null);
     _checkForUseOfVoidResult(node.expression);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index 35fb194..60cfa66 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -13,7 +13,7 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:yaml/yaml.dart';
 
@@ -46,17 +46,6 @@
   @override
   List<String> get uris => libraryMap.uris;
 
-  /// Add the extensions from one or more sdk extension files to this sdk. The
-  /// [extensions] should be a table mapping the names of extensions to the
-  /// paths where those extensions can be found.
-  void addExtensions(Map<String, String> extensions) {
-    extensions.forEach((String uri, String path) {
-      SdkLibraryImpl library = SdkLibraryImpl(uri);
-      library.path = path;
-      libraryMap.setLibrary(uri, library);
-    });
-  }
-
   /// Return info for debugging https://github.com/dart-lang/sdk/issues/35226.
   Map<String, Object> debugInfo() {
     return <String, Object>{
@@ -139,6 +128,23 @@
     return source;
   }
 
+  @override
+  Uri? pathToUri(String path) {
+    var file = resourceProvider.getFile(path);
+
+    var uriStr = _getPath(file);
+    if (uriStr == null) {
+      return null;
+    }
+
+    try {
+      return Uri.parse(uriStr);
+    } on FormatException {
+      return null;
+    }
+  }
+
+  /// TODO(scheglov) This name is misleading, returns `dart:foo/bar.dart`.
   String? _getPath(File file) {
     List<SdkLibrary> libraries = libraryMap.sdkLibraries;
     int length = libraries.length;
diff --git a/pkg/analyzer/lib/src/error/assignment_verifier.dart b/pkg/analyzer/lib/src/error/assignment_verifier.dart
index a995629..97cbefd 100644
--- a/pkg/analyzer/lib/src/error/assignment_verifier.dart
+++ b/pkg/analyzer/lib/src/error/assignment_verifier.dart
@@ -25,14 +25,14 @@
   /// element, which is definitely not a valid write target. We want to report
   /// a good error about this.
   ///
-  /// The [receiverTypeObject] might be a [DartType] or [String], and when
-  /// it is not `null`, we report [CompileTimeErrorCode.UNDEFINED_SETTER]
-  /// instead of a more generic [CompileTimeErrorCode.UNDEFINED_IDENTIFIER].
+  /// When the [receiverType] is not `null`, we report
+  /// [CompileTimeErrorCode.UNDEFINED_SETTER] instead of a more generic
+  /// [CompileTimeErrorCode.UNDEFINED_IDENTIFIER].
   void verify({
     required SimpleIdentifier node,
     required Element? requested,
     required Element? recovery,
-    required Object? receiverTypeObject,
+    required DartType? receiverType,
   }) {
     if (requested != null) {
       if (requested is VariableElement) {
@@ -106,11 +106,11 @@
       if (node.isSynthetic) {
         return;
       }
-      if (receiverTypeObject != null) {
+      if (receiverType != null) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.UNDEFINED_SETTER,
           node,
-          [node.name, receiverTypeObject],
+          [node.name, receiverType],
         );
       } else {
         _errorReporter.reportErrorForNode(
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 85441dc..45dce24 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -42,11 +42,7 @@
 /// Instances of the class `BestPracticesVerifier` traverse an AST structure
 /// looking for violations of Dart best practices.
 class BestPracticesVerifier extends RecursiveAstVisitor<void> {
-  static const String _TO_INT_METHOD_NAME = "toInt";
-
-  static final Map<String, TargetKind> _targetKindsByName = {
-    for (final kind in TargetKind.values) kind.toString(): kind,
-  };
+  static const String toIntMethodName = "toInt";
 
   /// The class containing the AST nodes being visited, or `null` if we are not
   /// in the scope of a class.
@@ -85,7 +81,7 @@
   final WorkspacePackage? _workspacePackage;
 
   /// The [LinterContext] used for possible const calculations.
-  late final LinterContext _linterContext;
+  final LinterContext _linterContext;
 
   /// Is `true` if the library being analyzed is non-nullable by default.
   final bool _isNonNullableByDefault;
@@ -93,9 +89,10 @@
   /// True if inference failures should be reported, otherwise false.
   final bool _strictInference;
 
-  /// Create a new instance of the [BestPracticesVerifier].
-  ///
-  /// @param errorReporter the error reporter
+  /// Whether [_currentLibrary] is part of its containing package's public API.
+  late final bool _inPublicPackageApi = _workspacePackage != null &&
+      _workspacePackage!.sourceIsInPublicApi(_currentLibrary.source);
+
   BestPracticesVerifier(
     this._errorReporter,
     TypeProviderImpl typeProvider,
@@ -121,28 +118,22 @@
         _errorHandlerVerifier =
             ErrorHandlerVerifier(_errorReporter, typeProvider, typeSystem),
         _nullSafeApiVerifier = NullSafeApiVerifier(_errorReporter, typeSystem),
-        _workspacePackage = workspacePackage {
+        _workspacePackage = workspacePackage,
+        _linterContext = LinterContextImpl(
+          [],
+          LinterContextUnit(content, unit),
+          declaredVariables,
+          typeProvider,
+          typeSystem,
+          inheritanceManager,
+          analysisOptions,
+          workspacePackage,
+        ) {
     _deprecatedVerifier.pushInDeprecatedValue(_currentLibrary.hasDeprecated);
     _inDoNotStoreMember = _currentLibrary.hasDoNotStore;
-
-    _linterContext = LinterContextImpl(
-      [],
-      LinterContextUnit(content, unit),
-      declaredVariables,
-      typeProvider,
-      _typeSystem,
-      _inheritanceManager,
-      analysisOptions,
-      _workspacePackage,
-    );
     _invalidAccessVerifier._inTestDirectory = _linterContext.inTestDir(unit);
   }
 
-  bool get _inPublicPackageApi {
-    return _workspacePackage != null &&
-        _workspacePackage!.sourceIsInPublicApi(_currentLibrary.source);
-  }
-
   @override
   void visitAnnotation(Annotation node) {
     var element = node.elementAnnotation;
@@ -305,7 +296,7 @@
       }
     }
 
-    var kinds = _targetKindsFor(element);
+    var kinds = element.targetKinds;
     if (kinds.isNotEmpty) {
       if (!_isValidTarget(parent, kinds)) {
         var invokedElement = element.element!;
@@ -407,7 +398,7 @@
   @override
   void visitConstructorDeclaration(ConstructorDeclaration node) {
     var element = node.declaredElement as ConstructorElementImpl;
-    if (!_isNonNullableByDefault && node.declaredElement!.isFactory) {
+    if (!_isNonNullableByDefault && element.isFactory) {
       if (node.body is BlockFunctionBody) {
         // Check the block for a return statement, if not, create the hint.
         if (!ExitDetector.exits(node.body)) {
@@ -482,9 +473,10 @@
           // always named, so we can safely assume
           // `overriddenElement.enclosingElement.name` is non-`null`.
           _errorReporter.reportErrorForNode(
-              HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
-              field.name,
-              [field.name, overriddenElement.enclosingElement.name!]);
+              HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, field.name, [
+            field.name.name,
+            overriddenElement.enclosingElement.displayName
+          ]);
         }
         if (!_invalidAccessVerifier._inTestDirectory) {
           _checkForAssignmentOfDoNotStore(field.initializer);
@@ -671,7 +663,7 @@
         _errorReporter.reportErrorForNode(
             HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER,
             node.name,
-            [node.name, overriddenElement.enclosingElement.name!]);
+            [node.name.name, overriddenElement.enclosingElement.displayName]);
       }
 
       super.visitMethodDeclaration(node);
@@ -907,7 +899,7 @@
           _wrapParenthesizedExpression(parent);
       var grandParent = parenthesizedExpression.parent;
       if (grandParent is MethodInvocation) {
-        if (_TO_INT_METHOD_NAME == grandParent.methodName.name &&
+        if (toIntMethodName == grandParent.methodName.name &&
             grandParent.argumentList.arguments.isEmpty) {
           _errorReporter.reportErrorForNode(
               HintCode.DIVISION_OPTIMIZATION, grandParent);
@@ -987,8 +979,6 @@
       return false;
     }
 
-    /// Return `true` if the given class [element] defines a non-final instance
-    /// field.
     Iterable<String> nonFinalInstanceFields(ClassElement element) {
       return element.fields
           .where((FieldElement field) =>
@@ -996,8 +986,6 @@
           .map((FieldElement field) => '${element.name}.${field.name}');
     }
 
-    /// Return `true` if the given class [element] defines or inherits a
-    /// non-final field.
     Iterable<String> definedOrInheritedNonFinalInstanceFields(
         ClassElement element, HashSet<ClassElement> visited) {
       Iterable<String> nonFinalFields = [];
@@ -1716,51 +1704,6 @@
     return false;
   }
 
-  /// Return the target kinds defined for the given [annotation].
-  Set<TargetKind> _targetKindsFor(ElementAnnotation annotation) {
-    var element = annotation.element;
-    ClassElement? classElement;
-    if (element is PropertyAccessorElement) {
-      if (element.isGetter) {
-        var type = element.returnType;
-        if (type is InterfaceType) {
-          classElement = type.element;
-        }
-      }
-    } else if (element is ConstructorElement) {
-      classElement = element.enclosingElement;
-    }
-    if (classElement == null) {
-      return const <TargetKind>{};
-    }
-    for (var annotation in classElement.metadata) {
-      if (annotation.isTarget) {
-        var value = annotation.computeConstantValue()!;
-        var kinds = <TargetKind>{};
-
-        for (var kindObject in value.getField('kinds')!.toSetValue()!) {
-          // We can't directly translate the index from the analyzed TargetKind
-          // constant to TargetKinds.values because the analyzer from the SDK
-          // may have been compiled with a different version of pkg:meta.
-          var index = kindObject.getField('index')!.toIntValue()!;
-          var targetKindClass =
-              (kindObject.type as InterfaceType).element as EnumElementImpl;
-          // Instead, map constants to their TargetKind by comparing getter
-          // names.
-          var getter = targetKindClass.constants[index];
-          var name = 'TargetKind.${getter.name}';
-
-          var foundTargetKind = _targetKindsByName[name];
-          if (foundTargetKind != null) {
-            kinds.add(foundTargetKind);
-          }
-        }
-        return kinds;
-      }
-    }
-    return const <TargetKind>{};
-  }
-
   /// Checks for the passed as expression for the [HintCode.UNNECESSARY_CAST]
   /// hint code.
   ///
@@ -1856,16 +1799,15 @@
   final LibraryElement _library;
   final WorkspacePackage? _workspacePackage;
 
-  late final bool _inTemplateSource;
+  final bool _inTemplateSource;
   late final bool _inTestDirectory;
 
   ClassElement? _enclosingClass;
 
   _InvalidAccessVerifier(
-      this._errorReporter, this._library, this._workspacePackage) {
-    var path = _library.source.fullName;
-    _inTemplateSource = path.contains(_templateExtension);
-  }
+      this._errorReporter, this._library, this._workspacePackage)
+      : _inTemplateSource =
+            _library.source.fullName.contains(_templateExtension);
 
   /// Produces a hint if [identifier] is accessed from an invalid location.
   ///
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
index 108cc22..6d06e03 100644
--- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
+++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -62,6 +62,17 @@
       } else {
         _errorReporter.reportErrorForNode(errorCode, expression, arguments);
       }
+    } else if (!_resolver.definingLibrary.isNonNullableByDefault) {
+      if (expression is InstanceCreationExpression) {
+        // In pre-null safety code, an implicit cast from a supertype is allowed
+        // unless the expression is an explicit instance creation expression,
+        // with the idea that the cast would likely fail at runtime.
+        var constructor = expression.constructorName.staticElement;
+        if (constructor == null || !constructor.isFactory) {
+          _errorReporter.reportErrorForNode(errorCode, expression, arguments);
+          return;
+        }
+      }
     }
   }
 
diff --git a/pkg/analyzer/lib/src/error/codes.g.dart b/pkg/analyzer/lib/src/error/codes.g.dart
index cd94929..42f8ae1 100644
--- a/pkg/analyzer/lib/src/error/codes.g.dart
+++ b/pkg/analyzer/lib/src/error/codes.g.dart
@@ -67,7 +67,8 @@
     'ABSTRACT_FIELD_INITIALIZER',
     "Abstract fields can't have initializers.",
     correctionMessage:
-        "Try removing the field initializer or the 'abstract' keyword from the field declaration.",
+        "Try removing the field initializer or the 'abstract' keyword from the "
+        "field declaration.",
     hasPublishedDocs: true,
     uniqueName: 'ABSTRACT_FIELD_CONSTRUCTOR_INITIALIZER',
   );
@@ -177,7 +178,8 @@
     'AMBIGUOUS_EXPORT',
     "The name '{0}' is defined in the libraries '{1}' and '{2}'.",
     correctionMessage:
-        "Try removing the export of one of the libraries, or explicitly hiding the name in one of the export directives.",
+        "Try removing the export of one of the libraries, or explicitly hiding "
+        "the name in one of the export directives.",
     hasPublishedDocs: true,
   );
 
@@ -245,7 +247,8 @@
     'AMBIGUOUS_EXTENSION_MEMBER_ACCESS',
     "A member named '{0}' is defined in {1}, and none are more specific.",
     correctionMessage:
-        "Try using an extension override to specify the extension you want to be chosen.",
+        "Try using an extension override to specify the extension you want to "
+        "be chosen.",
     hasPublishedDocs: true,
   );
 
@@ -322,7 +325,8 @@
     'AMBIGUOUS_IMPORT',
     "The name '{0}' is defined in the libraries {1}.",
     correctionMessage:
-        "Try using 'as prefix' for one of the import directives, or hiding the name from all but one of the imports.",
+        "Try using 'as prefix' for one of the import directives, or hiding the "
+        "name from all but one of the imports.",
     hasPublishedDocs: true,
   );
 
@@ -380,9 +384,12 @@
   static const CompileTimeErrorCode AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH =
       CompileTimeErrorCode(
     'AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH',
-    "The literal can't be either a map or a set because it contains at least one literal map entry or a spread operator spreading a 'Map', and at least one element which is neither of these.",
+    "The literal can't be either a map or a set because it contains at least "
+        "one literal map entry or a spread operator spreading a 'Map', and at "
+        "least one element which is neither of these.",
     correctionMessage:
-        "Try removing or changing some of the elements so that all of the elements are consistent.",
+        "Try removing or changing some of the elements so that all of the "
+        "elements are consistent.",
     hasPublishedDocs: true,
   );
 
@@ -460,9 +467,11 @@
   static const CompileTimeErrorCode AMBIGUOUS_SET_OR_MAP_LITERAL_EITHER =
       CompileTimeErrorCode(
     'AMBIGUOUS_SET_OR_MAP_LITERAL_EITHER',
-    "This literal must be either a map or a set, but the elements don't have enough information for type inference to work.",
+    "This literal must be either a map or a set, but the elements don't have "
+        "enough information for type inference to work.",
     correctionMessage:
-        "Try adding type arguments to the literal (one for sets, two for maps).",
+        "Try adding type arguments to the literal (one for sets, two for "
+        "maps).",
     hasPublishedDocs: true,
   );
 
@@ -635,7 +644,8 @@
     'ASSIGNMENT_TO_CONST',
     "Constant variables can't be assigned a value.",
     correctionMessage:
-        "Try removing the assignment, or remove the modifier 'const' from the variable.",
+        "Try removing the assignment, or remove the modifier 'const' from the "
+        "variable.",
     hasPublishedDocs: true,
   );
 
@@ -785,7 +795,8 @@
     'ASSIGNMENT_TO_FINAL_NO_SETTER',
     "There isn’t a setter named '{0}' in class '{1}'.",
     correctionMessage:
-        "Try correcting the name to reference an existing setter, or declare the setter.",
+        "Try correcting the name to reference an existing setter, or declare "
+        "the setter.",
     hasPublishedDocs: true,
   );
 
@@ -974,7 +985,8 @@
     'ASYNC_FOR_IN_WRONG_CONTEXT',
     "The async for-in loop can only be used in an async function.",
     correctionMessage:
-        "Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for-in loop.",
+        "Try marking the function body with either 'async' or 'async*', or "
+        "removing the 'await' before the for-in loop.",
     hasPublishedDocs: true,
   );
 
@@ -1020,9 +1032,11 @@
   static const CompileTimeErrorCode AWAIT_IN_LATE_LOCAL_VARIABLE_INITIALIZER =
       CompileTimeErrorCode(
     'AWAIT_IN_LATE_LOCAL_VARIABLE_INITIALIZER',
-    "The 'await' expression can't be used in a 'late' local variable's initializer.",
+    "The 'await' expression can't be used in a 'late' local variable's "
+        "initializer.",
     correctionMessage:
-        "Try removing the 'late' modifier, or rewriting the initializer without using the 'await' expression.",
+        "Try removing the 'late' modifier, or rewriting the initializer "
+        "without using the 'await' expression.",
     hasPublishedDocs: true,
   );
 
@@ -1101,20 +1115,23 @@
   // }
   // ```
   //
-  // If the method intentionally returns `null` at the end, then change the
+  // If the method intentionally returns `null` at the end, then add an
+  // explicit return of `null` at the end of the method and change the
   // return type so that it's valid to return `null`:
   //
   // ```dart
   // class C<T> {
   //   T? m(T t) {
   //     print(t);
+  //     return null;
   //   }
   // }
   // ```
   static const CompileTimeErrorCode BODY_MIGHT_COMPLETE_NORMALLY =
       CompileTimeErrorCode(
     'BODY_MIGHT_COMPLETE_NORMALLY',
-    "The body might complete normally, causing 'null' to be returned, but the return type is a potentially non-nullable type.",
+    "The body might complete normally, causing 'null' to be returned, but the "
+        "return type, '{0}', is a potentially non-nullable type.",
     correctionMessage:
         "Try adding either a return or a throw statement at the end.",
     hasPublishedDocs: true,
@@ -1342,7 +1359,8 @@
   static const CompileTimeErrorCode CASE_BLOCK_NOT_TERMINATED =
       CompileTimeErrorCode(
     'CASE_BLOCK_NOT_TERMINATED',
-    "The last statement of the 'case' should be 'break', 'continue', 'rethrow', 'return', or 'throw'.",
+    "The last statement of the 'case' should be 'break', 'continue', "
+        "'rethrow', 'return', or 'throw'.",
     correctionMessage: "Try adding one of the required statements.",
     hasPublishedDocs: true,
   );
@@ -1506,7 +1524,8 @@
       CASE_EXPRESSION_TYPE_IS_NOT_SWITCH_EXPRESSION_SUBTYPE =
       CompileTimeErrorCode(
     'CASE_EXPRESSION_TYPE_IS_NOT_SWITCH_EXPRESSION_SUBTYPE',
-    "The switch case expression type '{0}' must be a subtype of the switch expression type '{1}'.",
+    "The switch case expression type '{0}' must be a subtype of the switch "
+        "expression type '{1}'.",
     hasPublishedDocs: true,
   );
 
@@ -1540,7 +1559,8 @@
     'CAST_TO_NON_TYPE',
     "The name '{0}' isn't a type, so it can't be used in an 'as' expression.",
     correctionMessage:
-        "Try changing the name to the name of an existing type, or creating a type with the name '{0}'.",
+        "Try changing the name to the name of an existing type, or creating a "
+        "type with the name '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -1566,7 +1586,8 @@
     'CLASS_INSTANTIATION_ACCESS_TO_MEMBER',
     "The static member '{0}' can't be accessed on a class instantiation.",
     correctionMessage:
-        "Try removing the type arguments from the class name, or changing the member name to the name of a constructor.",
+        "Try removing the type arguments from the class name, or changing the "
+        "member name to the name of a constructor.",
     uniqueName: 'CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER',
   );
 
@@ -1579,7 +1600,8 @@
     'CLASS_INSTANTIATION_ACCESS_TO_MEMBER',
     "The class '{0} doesn't have a constructor named '{1}.",
     correctionMessage:
-        "Try invoking a different constructor, or defining a constructor named '{1}'.",
+        "Try invoking a different constructor, or defining a constructor named "
+        "'{1}'.",
     uniqueName: 'CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER',
   );
 
@@ -1671,7 +1693,8 @@
   static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD =
       CompileTimeErrorCode(
     'CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER',
-    "'{0}' can't be used to name both a constructor and a static field in this class.",
+    "'{0}' can't be used to name both a constructor and a static field in this "
+        "class.",
     correctionMessage: "Try renaming either the constructor or the field.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD',
@@ -1684,7 +1707,8 @@
   static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER =
       CompileTimeErrorCode(
     'CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER',
-    "'{0}' can't be used to name both a constructor and a static getter in this class.",
+    "'{0}' can't be used to name both a constructor and a static getter in "
+        "this class.",
     correctionMessage: "Try renaming either the constructor or the getter.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER',
@@ -1697,7 +1721,8 @@
   static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD =
       CompileTimeErrorCode(
     'CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER',
-    "'{0}' can't be used to name both a constructor and a static method in this class.",
+    "'{0}' can't be used to name both a constructor and a static method in "
+        "this class.",
     correctionMessage: "Try renaming either the constructor or the method.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD',
@@ -1710,7 +1735,8 @@
   static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER =
       CompileTimeErrorCode(
     'CONFLICTING_CONSTRUCTOR_AND_STATIC_MEMBER',
-    "'{0}' can't be used to name both a constructor and a static setter in this class.",
+    "'{0}' can't be used to name both a constructor and a static setter in "
+        "this class.",
     correctionMessage: "Try renaming either the constructor or the setter.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER',
@@ -1729,9 +1755,11 @@
   static const CompileTimeErrorCode CONFLICTING_FIELD_AND_METHOD =
       CompileTimeErrorCode(
     'CONFLICTING_FIELD_AND_METHOD',
-    "Class '{0}' can't define field '{1}' and have method '{2}.{1}' with the same name.",
+    "Class '{0}' can't define field '{1}' and have method '{2}.{1}' with the "
+        "same name.",
     correctionMessage:
-        "Try converting the getter to a method, or renaming the field to a name that doesn't conflict.",
+        "Try converting the getter to a method, or renaming the field to a "
+        "name that doesn't conflict.",
   );
 
   /**
@@ -1774,7 +1802,8 @@
   static const CompileTimeErrorCode CONFLICTING_GENERIC_INTERFACES =
       CompileTimeErrorCode(
     'CONFLICTING_GENERIC_INTERFACES',
-    "The class '{0}' can't implement both '{1}' and '{2}' because the type arguments are different.",
+    "The class '{0}' can't implement both '{1}' and '{2}' because the type "
+        "arguments are different.",
     hasPublishedDocs: true,
   );
 
@@ -1791,9 +1820,11 @@
   static const CompileTimeErrorCode CONFLICTING_METHOD_AND_FIELD =
       CompileTimeErrorCode(
     'CONFLICTING_METHOD_AND_FIELD',
-    "Class '{0}' can't define method '{1}' and have field '{2}.{1}' with the same name.",
+    "Class '{0}' can't define method '{1}' and have field '{2}.{1}' with the "
+        "same name.",
     correctionMessage:
-        "Try converting the method to a getter, or renaming the method to a name that doesn't conflict.",
+        "Try converting the method to a getter, or renaming the method to a "
+        "name that doesn't conflict.",
   );
 
   /**
@@ -1809,7 +1840,8 @@
   static const CompileTimeErrorCode CONFLICTING_STATIC_AND_INSTANCE =
       CompileTimeErrorCode(
     'CONFLICTING_STATIC_AND_INSTANCE',
-    "Class '{0}' can't define static member '{1}' and have instance member '{2}.{1}' with the same name.",
+    "Class '{0}' can't define static member '{1}' and have instance member "
+        "'{2}.{1}' with the same name.",
     correctionMessage:
         "Try renaming the member to a name that doesn't conflict.",
   );
@@ -1843,7 +1875,8 @@
   static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS =
       CompileTimeErrorCode(
     'CONFLICTING_TYPE_VARIABLE_AND_CONTAINER',
-    "'{0}' can't be used to name both a type variable and the class in which the type variable is defined.",
+    "'{0}' can't be used to name both a type variable and the class in which "
+        "the type variable is defined.",
     correctionMessage: "Try renaming either the type variable or the class.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_TYPE_VARIABLE_AND_CLASS',
@@ -1856,7 +1889,8 @@
   static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_EXTENSION =
       CompileTimeErrorCode(
     'CONFLICTING_TYPE_VARIABLE_AND_CONTAINER',
-    "'{0}' can't be used to name both a type variable and the extension in which the type variable is defined.",
+    "'{0}' can't be used to name both a type variable and the extension in "
+        "which the type variable is defined.",
     correctionMessage:
         "Try renaming either the type variable or the extension.",
     hasPublishedDocs: true,
@@ -1896,7 +1930,8 @@
   static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS =
       CompileTimeErrorCode(
     'CONFLICTING_TYPE_VARIABLE_AND_MEMBER',
-    "'{0}' can't be used to name both a type variable and a member in this class.",
+    "'{0}' can't be used to name both a type variable and a member in this "
+        "class.",
     correctionMessage: "Try renaming either the type variable or the member.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS',
@@ -1909,7 +1944,8 @@
   static const CompileTimeErrorCode
       CONFLICTING_TYPE_VARIABLE_AND_MEMBER_EXTENSION = CompileTimeErrorCode(
     'CONFLICTING_TYPE_VARIABLE_AND_MEMBER',
-    "'{0}' can't be used to name both a type variable and a member in this extension.",
+    "'{0}' can't be used to name both a type variable and a member in this "
+        "extension.",
     correctionMessage: "Try renaming either the type variable or the member.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_TYPE_VARIABLE_AND_MEMBER_EXTENSION',
@@ -1922,7 +1958,8 @@
   static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN =
       CompileTimeErrorCode(
     'CONFLICTING_TYPE_VARIABLE_AND_MEMBER',
-    "'{0}' can't be used to name both a type variable and a member in this mixin.",
+    "'{0}' can't be used to name both a type variable and a member in this "
+        "mixin.",
     correctionMessage: "Try renaming either the type variable or the member.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN',
@@ -1935,7 +1972,8 @@
   static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MIXIN =
       CompileTimeErrorCode(
     'CONFLICTING_TYPE_VARIABLE_AND_CONTAINER',
-    "'{0}' can't be used to name both a type variable and the mixin in which the type variable is defined.",
+    "'{0}' can't be used to name both a type variable and the mixin in which "
+        "the type variable is defined.",
     correctionMessage: "Try renaming either the type variable or the mixin.",
     hasPublishedDocs: true,
     uniqueName: 'CONFLICTING_TYPE_VARIABLE_AND_MIXIN',
@@ -1948,7 +1986,8 @@
   static const CompileTimeErrorCode CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH =
       CompileTimeErrorCode(
     'CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH',
-    "In a const constructor, a value of type '{0}' can't be assigned to the field '{1}', which has type '{2}'.",
+    "In a const constructor, a value of type '{0}' can't be assigned to the "
+        "field '{1}', which has type '{2}'.",
     correctionMessage: "Try using a subtype, or removing the keyword 'const'.",
   );
 
@@ -2002,7 +2041,8 @@
   static const CompileTimeErrorCode CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH =
       CompileTimeErrorCode(
     'CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH',
-    "A value of type '{0}' can't be assigned to a parameter of type '{1}' in a const constructor.",
+    "A value of type '{0}' can't be assigned to a parameter of type '{1}' in a "
+        "const constructor.",
     correctionMessage: "Try using a subtype, or removing the keyword 'const'.",
     hasPublishedDocs: true,
   );
@@ -2065,9 +2105,11 @@
       CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST =
       CompileTimeErrorCode(
     'CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST',
-    "Can't define the 'const' constructor because the field '{0}' is initialized with a non-constant value.",
+    "Can't define the 'const' constructor because the field '{0}' is "
+        "initialized with a non-constant value.",
     correctionMessage:
-        "Try initializing the field to a constant value, or removing the keyword 'const' from the constructor.",
+        "Try initializing the field to a constant value, or removing the "
+        "keyword 'const' from the constructor.",
     hasPublishedDocs: true,
   );
 
@@ -2088,9 +2130,11 @@
   static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD =
       CompileTimeErrorCode(
     'CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD',
-    "This constructor can't be declared 'const' because a mixin adds the instance field: {0}.",
+    "This constructor can't be declared 'const' because a mixin adds the "
+        "instance field: {0}.",
     correctionMessage:
-        "Try removing the 'const' keyword or removing the 'with' clause from the class declaration, or removing the field from the mixin class.",
+        "Try removing the 'const' keyword or removing the 'with' clause from "
+        "the class declaration, or removing the field from the mixin class.",
   );
 
   /**
@@ -2110,9 +2154,11 @@
   static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELDS =
       CompileTimeErrorCode(
     'CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD',
-    "This constructor can't be declared 'const' because the mixins add the instance fields: {0}.",
+    "This constructor can't be declared 'const' because the mixins add the "
+        "instance fields: {0}.",
     correctionMessage:
-        "Try removing the 'const' keyword or removing the 'with' clause from the class declaration, or removing the fields from the mixin classes.",
+        "Try removing the 'const' keyword or removing the 'with' clause from "
+        "the class declaration, or removing the fields from the mixin classes.",
     uniqueName: 'CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELDS',
   );
 
@@ -2190,9 +2236,11 @@
   static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER =
       CompileTimeErrorCode(
     'CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER',
-    "A constant constructor can't call a non-constant super constructor of '{0}'.",
+    "A constant constructor can't call a non-constant super constructor of "
+        "'{0}'.",
     correctionMessage:
-        "Try calling a constant constructor in the superclass, or removing the keyword 'const' from the constructor.",
+        "Try calling a constant constructor in the superclass, or removing the "
+        "keyword 'const' from the constructor.",
     hasPublishedDocs: true,
   );
 
@@ -2245,7 +2293,8 @@
     'CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD',
     "Can't define a const constructor for a class with non-final fields.",
     correctionMessage:
-        "Try making all of the fields final, or removing the keyword 'const' from the constructor.",
+        "Try making all of the fields final, or removing the keyword 'const' "
+        "from the constructor.",
     hasPublishedDocs: true,
   );
 
@@ -2296,7 +2345,8 @@
     'CONST_DEFERRED_CLASS',
     "Deferred classes can't be created with 'const'.",
     correctionMessage:
-        "Try using 'new' to create the instance, or changing the import to not be deferred.",
+        "Try using 'new' to create the instance, or changing the import to not "
+        "be deferred.",
     hasPublishedDocs: true,
   );
 
@@ -2317,7 +2367,8 @@
   static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE =
       CompileTimeErrorCode(
     'CONST_EVAL_THROWS_IDBZE',
-    "Evaluation of this constant expression throws an IntegerDivisionByZeroException.",
+    "Evaluation of this constant expression throws an "
+        "IntegerDivisionByZeroException.",
   );
 
   /**
@@ -2327,7 +2378,8 @@
    */
   static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = CompileTimeErrorCode(
     'CONST_EVAL_TYPE_BOOL',
-    "In constant expressions, operands of this operator must be of type 'bool'.",
+    "In constant expressions, operands of this operator must be of type "
+        "'bool'.",
   );
 
   /**
@@ -2338,7 +2390,8 @@
   static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_INT =
       CompileTimeErrorCode(
     'CONST_EVAL_TYPE_BOOL_INT',
-    "In constant expressions, operands of this operator must be of type 'bool' or 'int'.",
+    "In constant expressions, operands of this operator must be of type 'bool' "
+        "or 'int'.",
   );
 
   /**
@@ -2349,7 +2402,8 @@
   static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING =
       CompileTimeErrorCode(
     'CONST_EVAL_TYPE_BOOL_NUM_STRING',
-    "In constant expressions, operands of this operator must be of type 'bool', 'num', 'String' or 'null'.",
+    "In constant expressions, operands of this operator must be of type "
+        "'bool', 'num', 'String' or 'null'.",
   );
 
   /**
@@ -2375,7 +2429,8 @@
 
   static const CompileTimeErrorCode CONST_EVAL_TYPE_TYPE = CompileTimeErrorCode(
     'CONST_EVAL_TYPE_TYPE',
-    "In constant expressions, operands of this operator must be of type 'Type'.",
+    "In constant expressions, operands of this operator must be of type "
+        "'Type'.",
   );
 
   /**
@@ -2386,7 +2441,8 @@
   static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE =
       CompileTimeErrorCode(
     'FIELD_INITIALIZER_NOT_ASSIGNABLE',
-    "The initializer type '{0}' can't be assigned to the field type '{1}' in a const constructor.",
+    "The initializer type '{0}' can't be assigned to the field type '{1}' in a "
+        "const constructor.",
     correctionMessage: "Try using a subtype, or removing the 'const' keyword",
     hasPublishedDocs: true,
     uniqueName: 'CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE',
@@ -2483,9 +2539,11 @@
       CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY =
       CompileTimeErrorCode(
     'CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be used to initialize a 'const' variable.",
+    "Constant values from a deferred library can't be used to initialize a "
+        "'const' variable.",
     correctionMessage:
-        "Try initializing the variable without referencing members of the deferred library, or changing the import to not be deferred.",
+        "Try initializing the variable without referencing members of the "
+        "deferred library, or changing the import to not be deferred.",
     hasPublishedDocs: true,
   );
 
@@ -2589,9 +2647,11 @@
   static const CompileTimeErrorCode
       CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = CompileTimeErrorCode(
     'CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS',
-    "The type of a key in a constant map can't override the '==' operator, but the class '{0}' does.",
+    "The type of a key in a constant map can't override the '==' operator, but "
+        "the class '{0}' does.",
     correctionMessage:
-        "Try using a different value for the key, or removing the keyword 'const' from the map.",
+        "Try using a different value for the key, or removing the keyword "
+        "'const' from the map.",
     hasPublishedDocs: true,
   );
 
@@ -2682,9 +2742,11 @@
   static const CompileTimeErrorCode CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS =
       CompileTimeErrorCode(
     'CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS',
-    "The type of an element in a constant set can't override the '==' operator, but the type '{0}' does.",
+    "The type of an element in a constant set can't override the '==' "
+        "operator, but the type '{0}' does.",
     correctionMessage:
-        "Try using a different value for the element, or removing the keyword 'const' from the set.",
+        "Try using a different value for the element, or removing the keyword "
+        "'const' from the set.",
     hasPublishedDocs: true,
   );
 
@@ -2848,7 +2910,8 @@
     'CONST_WITH_NON_CONSTANT_ARGUMENT',
     "Arguments of a constant creation must be constant expressions.",
     correctionMessage:
-        "Try making the argument a valid constant, or use 'new' to call the constructor.",
+        "Try making the argument a valid constant, or use 'new' to call the "
+        "constructor.",
     hasPublishedDocs: true,
   );
 
@@ -2926,7 +2989,8 @@
   static const CompileTimeErrorCode
       CONST_WITH_TYPE_PARAMETERS_CONSTRUCTOR_TEAROFF = CompileTimeErrorCode(
     'CONST_WITH_TYPE_PARAMETERS',
-    "A constant constructor tearoff can't use a type parameter as a type argument.",
+    "A constant constructor tearoff can't use a type parameter as a type "
+        "argument.",
     correctionMessage:
         "Try replacing the type parameter with a different type.",
     hasPublishedDocs: true,
@@ -2939,7 +3003,8 @@
   static const CompileTimeErrorCode
       CONST_WITH_TYPE_PARAMETERS_FUNCTION_TEAROFF = CompileTimeErrorCode(
     'CONST_WITH_TYPE_PARAMETERS',
-    "A constant function tearoff can't use a type parameter as a type argument.",
+    "A constant function tearoff can't use a type parameter as a type "
+        "argument.",
     correctionMessage:
         "Try replacing the type parameter with a different type.",
     hasPublishedDocs: true,
@@ -3033,7 +3098,8 @@
   static const CompileTimeErrorCode DEFAULT_LIST_CONSTRUCTOR =
       CompileTimeErrorCode(
     'DEFAULT_LIST_CONSTRUCTOR',
-    "The default 'List' constructor isn't available when null safety is enabled.",
+    "The default 'List' constructor isn't available when null safety is "
+        "enabled.",
     correctionMessage:
         "Try using a list literal, 'List.filled' or 'List.generate'.",
     hasPublishedDocs: true,
@@ -3093,7 +3159,8 @@
   static const CompileTimeErrorCode
       DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = CompileTimeErrorCode(
     'DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR',
-    "Default values aren't allowed in factory constructors that redirect to another constructor.",
+    "Default values aren't allowed in factory constructors that redirect to "
+        "another constructor.",
     correctionMessage: "Try removing the default value.",
     hasPublishedDocs: true,
   );
@@ -3220,7 +3287,8 @@
     'DEFERRED_IMPORT_OF_EXTENSION',
     "Imports of deferred libraries must hide all extensions.",
     correctionMessage:
-        "Try adding either a show combinator listing the names you need to reference or a hide combinator listing all of the extensions.",
+        "Try adding either a show combinator listing the names you need to "
+        "reference or a hide combinator listing all of the extensions.",
     hasPublishedDocs: true,
   );
 
@@ -3272,9 +3340,11 @@
   static const CompileTimeErrorCode DISALLOWED_TYPE_INSTANTIATION_EXPRESSION =
       CompileTimeErrorCode(
     'DISALLOWED_TYPE_INSTANTIATION_EXPRESSION',
-    "Only a generic type, generic function, generic instance method, or generic constructor can be type instantiated.",
+    "Only a generic type, generic function, generic instance method, or "
+        "generic constructor can be type instantiated.",
     correctionMessage:
-        "Try instantiating the type(s) of a generic type, generic function, generic instance method, or generic constructor.",
+        "Try instantiating the type(s) of a generic type, generic function, "
+        "generic instance method, or generic constructor.",
   );
 
   /**
@@ -3444,7 +3514,8 @@
   static const CompileTimeErrorCode DUPLICATE_FIELD_FORMAL_PARAMETER =
       CompileTimeErrorCode(
     'DUPLICATE_FIELD_FORMAL_PARAMETER',
-    "The field '{0}' can't be initialized by multiple parameters in the same constructor.",
+    "The field '{0}' can't be initialized by multiple parameters in the same "
+        "constructor.",
     correctionMessage:
         "Try removing one of the parameters, or using different fields.",
     hasPublishedDocs: true,
@@ -3507,7 +3578,8 @@
     'DUPLICATE_NAMED_ARGUMENT',
     "The argument for the named parameter '{0}' was already specified.",
     correctionMessage:
-        "Try removing one of the named arguments, or correcting one of the names to reference a different named parameter.",
+        "Try removing one of the named arguments, or correcting one of the "
+        "names to reference a different named parameter.",
     hasPublishedDocs: true,
   );
 
@@ -3824,7 +3896,8 @@
   // names declared in the opted-out library.
   static const CompileTimeErrorCode EXPORT_LEGACY_SYMBOL = CompileTimeErrorCode(
     'EXPORT_LEGACY_SYMBOL',
-    "The symbol '{0}' is defined in a legacy library, and can't be re-exported from a library with null safety enabled.",
+    "The symbol '{0}' is defined in a legacy library, and can't be re-exported "
+        "from a library with null safety enabled.",
     correctionMessage:
         "Try removing the export or migrating the legacy library.",
     hasPublishedDocs: true,
@@ -3949,7 +4022,8 @@
     'SUBTYPE_OF_DEFERRED_CLASS',
     "Classes can't extend deferred classes.",
     correctionMessage:
-        "Try specifying a different superclass, or removing the extends clause.",
+        "Try specifying a different superclass, or removing the extends "
+        "clause.",
     hasPublishedDocs: true,
     uniqueName: 'EXTENDS_DEFERRED_CLASS',
   );
@@ -4015,7 +4089,8 @@
     'SUBTYPE_OF_DISALLOWED_TYPE',
     "Classes can't extend '{0}'.",
     correctionMessage:
-        "Try specifying a different superclass, or removing the extends clause.",
+        "Try specifying a different superclass, or removing the extends "
+        "clause.",
     hasPublishedDocs: true,
     uniqueName: 'EXTENDS_DISALLOWED_CLASS',
   );
@@ -4064,7 +4139,8 @@
     'EXTENDS_NON_CLASS',
     "Classes can only extend other classes.",
     correctionMessage:
-        "Try specifying a different superclass, or removing the extends clause.",
+        "Try specifying a different superclass, or removing the extends "
+        "clause.",
     hasPublishedDocs: true,
     isUnresolvedIdentifier: true,
   );
@@ -4102,9 +4178,11 @@
   static const CompileTimeErrorCode
       EXTENDS_TYPE_ALIAS_EXPANDS_TO_TYPE_PARAMETER = CompileTimeErrorCode(
     'SUPERTYPE_EXPANDS_TO_TYPE_PARAMETER',
-    "A type alias that expands to a type parameter can't be used as a superclass.",
+    "A type alias that expands to a type parameter can't be used as a "
+        "superclass.",
     correctionMessage:
-        "Try specifying a different superclass, or removing the extends clause.",
+        "Try specifying a different superclass, or removing the extends "
+        "clause.",
     hasPublishedDocs: true,
     uniqueName: 'EXTENDS_TYPE_ALIAS_EXPANDS_TO_TYPE_PARAMETER',
   );
@@ -4191,7 +4269,8 @@
   static const CompileTimeErrorCode EXTENSION_CONFLICTING_STATIC_AND_INSTANCE =
       CompileTimeErrorCode(
     'EXTENSION_CONFLICTING_STATIC_AND_INSTANCE',
-    "An extension can't define static member '{0}' and an instance member with the same name.",
+    "An extension can't define static member '{0}' and an instance member with "
+        "the same name.",
     correctionMessage:
         "Try renaming the member to a name that doesn't conflict.",
     hasPublishedDocs: true,
@@ -4231,7 +4310,8 @@
   static const CompileTimeErrorCode EXTENSION_DECLARES_MEMBER_OF_OBJECT =
       CompileTimeErrorCode(
     'EXTENSION_DECLARES_MEMBER_OF_OBJECT',
-    "Extensions can't declare members with the same name as a member declared by 'Object'.",
+    "Extensions can't declare members with the same name as a member declared "
+        "by 'Object'.",
     correctionMessage: "Try specifying a different name for the member.",
     hasPublishedDocs: true,
   );
@@ -4276,7 +4356,8 @@
   static const CompileTimeErrorCode EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER =
       CompileTimeErrorCode(
     'EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER',
-    "An extension override can't be used to access a static member from an extension.",
+    "An extension override can't be used to access a static member from an "
+        "extension.",
     correctionMessage: "Try using just the name of the extension.",
     hasPublishedDocs: true,
   );
@@ -4326,7 +4407,8 @@
   static const CompileTimeErrorCode EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE =
       CompileTimeErrorCode(
     'EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE',
-    "The type of the argument to the extension override '{0}' isn't assignable to the extended type '{1}'.",
+    "The type of the argument to the extension override '{0}' isn't assignable "
+        "to the extended type '{1}'.",
     hasPublishedDocs: true,
   );
 
@@ -4431,7 +4513,8 @@
   static const CompileTimeErrorCode EXTENSION_OVERRIDE_WITH_CASCADE =
       CompileTimeErrorCode(
     'EXTENSION_OVERRIDE_WITH_CASCADE',
-    "Extension overrides have no value so they can't be used as the receiver of a cascade expression.",
+    "Extension overrides have no value so they can't be used as the receiver "
+        "of a cascade expression.",
     correctionMessage: "Try using '.' instead of '..'.",
     hasPublishedDocs: true,
   );
@@ -4441,7 +4524,8 @@
     'EXTERNAL_FIELD_CONSTRUCTOR_INITIALIZER',
     "External fields cannot have initializers.",
     correctionMessage:
-        "Try removing the field initializer or the 'external' keyword from the field declaration.",
+        "Try removing the field initializer or the 'external' keyword from the "
+        "field declaration.",
   );
 
   static const CompileTimeErrorCode EXTERNAL_FIELD_INITIALIZER =
@@ -4553,7 +4637,8 @@
     'EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED',
     "Too many positional arguments: {0} expected, but {1} found.",
     correctionMessage:
-        "Try removing the extra positional arguments, or specifying the name for named arguments.",
+        "Try removing the extra positional arguments, or specifying the name "
+        "for named arguments.",
     hasPublishedDocs: true,
   );
 
@@ -4646,7 +4731,8 @@
   static const CompileTimeErrorCode
       FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = CompileTimeErrorCode(
     'FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION',
-    "Fields can't be initialized in the constructor if they are final and were already initialized at their declaration.",
+    "Fields can't be initialized in the constructor if they are final and were "
+        "already initialized at their declaration.",
     correctionMessage: "Try removing one of the initializations.",
     hasPublishedDocs: true,
   );
@@ -4709,7 +4795,8 @@
   static const CompileTimeErrorCode
       FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = CompileTimeErrorCode(
     'FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER',
-    "Fields can't be initialized in both the parameter list and the initializers.",
+    "Fields can't be initialized in both the parameter list and the "
+        "initializers.",
     correctionMessage: "Try removing one of the initializations.",
     hasPublishedDocs: true,
   );
@@ -4962,7 +5049,8 @@
     'FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE',
     "The parameter type '{0}' is incompatible with the field type '{1}'.",
     correctionMessage:
-        "Try changing or removing the parameter's type, or changing the field's type.",
+        "Try changing or removing the parameter's type, or changing the "
+        "field's type.",
     hasPublishedDocs: true,
   );
 
@@ -5014,7 +5102,8 @@
   static const CompileTimeErrorCode
       FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = CompileTimeErrorCode(
     'FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR',
-    "'{0}' is final and was given a value when it was declared, so it can't be set to a new value.",
+    "'{0}' is final and was given a value when it was declared, so it can't be "
+        "set to a new value.",
     correctionMessage: "Try removing one of the initializations.",
     hasPublishedDocs: true,
   );
@@ -5190,7 +5279,8 @@
   static const CompileTimeErrorCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS =
       CompileTimeErrorCode(
     'FINAL_NOT_INITIALIZED_CONSTRUCTOR',
-    "All final variables must be initialized, but '{0}', '{1}', and {2} others aren't.",
+    "All final variables must be initialized, but '{0}', '{1}', and {2} others "
+        "aren't.",
     correctionMessage: "Try adding initializers for the fields.",
     hasPublishedDocs: true,
     uniqueName: 'FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS',
@@ -5248,7 +5338,8 @@
   static const CompileTimeErrorCode FOR_IN_OF_INVALID_ELEMENT_TYPE =
       CompileTimeErrorCode(
     'FOR_IN_OF_INVALID_ELEMENT_TYPE',
-    "The type '{0}' used in the 'for' loop must implement '{1}' with a type argument that can be assigned to '{2}'.",
+    "The type '{0}' used in the 'for' loop must implement '{1}' with a type "
+        "argument that can be assigned to '{2}'.",
     hasPublishedDocs: true,
   );
 
@@ -5335,7 +5426,8 @@
     'FOR_IN_WITH_CONST_VARIABLE',
     "A for-in loop variable can't be a 'const'.",
     correctionMessage:
-        "Try removing the 'const' modifier from the variable, or use a different variable.",
+        "Try removing the 'const' modifier from the variable, or use a "
+        "different variable.",
     hasPublishedDocs: true,
   );
 
@@ -5348,7 +5440,8 @@
     'GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND',
     "Generic function types can't be used as type parameter bounds",
     correctionMessage:
-        "Try making the free variable in the function type part of the larger declaration signature",
+        "Try making the free variable in the function type part of the larger "
+        "declaration signature",
   );
 
   /**
@@ -5360,7 +5453,8 @@
     'GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT',
     "A generic function type can't be a type argument.",
     correctionMessage:
-        "Try removing type parameters from the generic function type, or using 'dynamic' as the type argument here.",
+        "Try removing type parameters from the generic function type, or using "
+        "'dynamic' as the type argument here.",
   );
 
   /**
@@ -5407,9 +5501,11 @@
   static const CompileTimeErrorCode
       GENERIC_METHOD_TYPE_INSTANTIATION_ON_DYNAMIC = CompileTimeErrorCode(
     'GENERIC_METHOD_TYPE_INSTANTIATION_ON_DYNAMIC',
-    "A method tear-off on a receiver whose type is 'dynamic' can't have type arguments.",
+    "A method tear-off on a receiver whose type is 'dynamic' can't have type "
+        "arguments.",
     correctionMessage:
-        "Specify the type of the receiver, or remove the type arguments from the method tear-off.",
+        "Specify the type of the receiver, or remove the type arguments from "
+        "the method tear-off.",
     hasPublishedDocs: true,
   );
 
@@ -5423,7 +5519,8 @@
   static const CompileTimeErrorCode GETTER_NOT_ASSIGNABLE_SETTER_TYPES =
       CompileTimeErrorCode(
     'GETTER_NOT_ASSIGNABLE_SETTER_TYPES',
-    "The return type of getter '{0}' is '{1}' which isn't assignable to the type '{2}' of its setter '{3}'.",
+    "The return type of getter '{0}' is '{1}' which isn't assignable to the "
+        "type '{2}' of its setter '{3}'.",
     correctionMessage: "Try changing the types so that they are compatible.",
   );
 
@@ -5481,7 +5578,8 @@
   static const CompileTimeErrorCode GETTER_NOT_SUBTYPE_SETTER_TYPES =
       CompileTimeErrorCode(
     'GETTER_NOT_SUBTYPE_SETTER_TYPES',
-    "The return type of getter '{0}' is '{1}' which isn't a subtype of the type '{2}' of its setter '{3}'.",
+    "The return type of getter '{0}' is '{1}' which isn't a subtype of the "
+        "type '{2}' of its setter '{3}'.",
     correctionMessage: "Try changing the types so that they are compatible.",
     hasPublishedDocs: true,
   );
@@ -5489,7 +5587,8 @@
   static const CompileTimeErrorCode IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY =
       CompileTimeErrorCode(
     'IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be used as values in an if condition inside a const collection literal.",
+    "Constant values from a deferred library can't be used as values in an if "
+        "condition inside a const collection literal.",
     correctionMessage: "Try making the deferred import non-deferred.",
   );
 
@@ -5529,9 +5628,11 @@
   static const CompileTimeErrorCode ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE =
       CompileTimeErrorCode(
     'ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE',
-    "Functions marked 'async*' must have a return type that is a supertype of 'Stream<T>' for some type 'T'.",
+    "Functions marked 'async*' must have a return type that is a supertype of "
+        "'Stream<T>' for some type 'T'.",
     correctionMessage:
-        "Try fixing the return type of the function, or removing the modifier 'async*' from the function body.",
+        "Try fixing the return type of the function, or removing the modifier "
+        "'async*' from the function body.",
     hasPublishedDocs: true,
   );
 
@@ -5577,7 +5678,8 @@
     'ILLEGAL_ASYNC_RETURN_TYPE',
     "Functions marked 'async' must have a return type assignable to 'Future'.",
     correctionMessage:
-        "Try fixing the return type of the function, or removing the modifier 'async' from the function body.",
+        "Try fixing the return type of the function, or removing the modifier "
+        "'async' from the function body.",
     hasPublishedDocs: true,
   );
 
@@ -5618,9 +5720,11 @@
   static const CompileTimeErrorCode ILLEGAL_SYNC_GENERATOR_RETURN_TYPE =
       CompileTimeErrorCode(
     'ILLEGAL_SYNC_GENERATOR_RETURN_TYPE',
-    "Functions marked 'sync*' must have a return type that is a supertype of 'Iterable<T>' for some type 'T'.",
+    "Functions marked 'sync*' must have a return type that is a supertype of "
+        "'Iterable<T>' for some type 'T'.",
     correctionMessage:
-        "Try fixing the return type of the function, or removing the modifier 'sync*' from the function body.",
+        "Try fixing the return type of the function, or removing the modifier "
+        "'sync*' from the function body.",
     hasPublishedDocs: true,
   );
 
@@ -5632,7 +5736,8 @@
     'SUBTYPE_OF_DEFERRED_CLASS',
     "Classes and mixins can't implement deferred classes.",
     correctionMessage:
-        "Try specifying a different interface, removing the class from the list, or changing the import to not be deferred.",
+        "Try specifying a different interface, removing the class from the "
+        "list, or changing the import to not be deferred.",
     hasPublishedDocs: true,
     uniqueName: 'IMPLEMENTS_DEFERRED_CLASS',
   );
@@ -5646,7 +5751,8 @@
     'SUBTYPE_OF_DISALLOWED_TYPE',
     "Classes and mixins can't implement '{0}'.",
     correctionMessage:
-        "Try specifying a different interface, or remove the class from the list.",
+        "Try specifying a different interface, or remove the class from the "
+        "list.",
     hasPublishedDocs: true,
     uniqueName: 'IMPLEMENTS_DISALLOWED_CLASS',
   );
@@ -5841,7 +5947,8 @@
     'IMPLICIT_THIS_REFERENCE_IN_INITIALIZER',
     "The instance member '{0}' can't be accessed in an initializer.",
     correctionMessage:
-        "Try replacing the reference to the instance member with a different expression",
+        "Try replacing the reference to the instance member with a different "
+        "expression",
     hasPublishedDocs: true,
   );
 
@@ -5957,7 +6064,8 @@
     'INCONSISTENT_INHERITANCE',
     "Superinterfaces don't have a valid override for '{0}': {1}.",
     correctionMessage:
-        "Try adding an explicit override that is consistent with all of the inherited members.",
+        "Try adding an explicit override that is consistent with all of the "
+        "inherited members.",
     hasPublishedDocs: true,
   );
 
@@ -5976,9 +6084,11 @@
   static const CompileTimeErrorCode INCONSISTENT_INHERITANCE_GETTER_AND_METHOD =
       CompileTimeErrorCode(
     'INCONSISTENT_INHERITANCE_GETTER_AND_METHOD',
-    "'{0}' is inherited as a getter (from '{1}') and also a method (from '{2}').",
+    "'{0}' is inherited as a getter (from '{1}') and also a method (from "
+        "'{2}').",
     correctionMessage:
-        "Try adjusting the supertypes of this class to remove the inconsistency.",
+        "Try adjusting the supertypes of this class to remove the "
+        "inconsistency.",
   );
 
   /**
@@ -5992,7 +6102,8 @@
   static const CompileTimeErrorCode INCONSISTENT_LANGUAGE_VERSION_OVERRIDE =
       CompileTimeErrorCode(
     'INCONSISTENT_LANGUAGE_VERSION_OVERRIDE',
-    "Parts must have exactly the same language version override as the library.",
+    "Parts must have exactly the same language version override as the "
+        "library.",
   );
 
   /**
@@ -6051,7 +6162,8 @@
     'INITIALIZER_FOR_NON_EXISTENT_FIELD',
     "'{0}' isn't a field in the enclosing class.",
     correctionMessage:
-        "Try correcting the name to match an existing field, or defining a field named '{0}'.",
+        "Try correcting the name to match an existing field, or defining a "
+        "field named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -6114,7 +6226,8 @@
   static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD =
       CompileTimeErrorCode(
     'INITIALIZER_FOR_STATIC_FIELD',
-    "'{0}' is a static field in the enclosing class. Fields initialized in a constructor can't be static.",
+    "'{0}' is a static field in the enclosing class. Fields initialized in a "
+        "constructor can't be static.",
     correctionMessage: "Try removing the initialization.",
     hasPublishedDocs: true,
   );
@@ -6199,7 +6312,8 @@
     'INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD',
     "'{0}' isn't a field in the enclosing class.",
     correctionMessage:
-        "Try correcting the name to match an existing field, or defining a field named '{0}'.",
+        "Try correcting the name to match an existing field, or defining a "
+        "field named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -6372,7 +6486,8 @@
     'INSTANCE_MEMBER_ACCESS_FROM_STATIC',
     "Instance members can't be accessed from a static method.",
     correctionMessage:
-        "Try removing the reference to the instance member, or removing the keyword 'static' from the method.",
+        "Try removing the reference to the instance member, or removing the "
+        "keyword 'static' from the method.",
     hasPublishedDocs: true,
   );
 
@@ -6534,9 +6649,11 @@
   static const CompileTimeErrorCode INTEGER_LITERAL_IMPRECISE_AS_DOUBLE =
       CompileTimeErrorCode(
     'INTEGER_LITERAL_IMPRECISE_AS_DOUBLE',
-    "The integer literal is being used as a double, but can't be represented as a 64-bit double without overflow or loss of precision: '{0}'.",
+    "The integer literal is being used as a double, but can't be represented "
+        "as a 64-bit double without overflow or loss of precision: '{0}'.",
     correctionMessage:
-        "Try using the class 'BigInt', or switch to the closest valid double: '{1}'.",
+        "Try using the class 'BigInt', or switch to the closest valid double: "
+        "'{1}'.",
     hasPublishedDocs: true,
   );
 
@@ -6571,7 +6688,8 @@
     'INTEGER_LITERAL_OUT_OF_RANGE',
     "The integer literal {0} can't be represented in 64 bits.",
     correctionMessage:
-        "Try using the 'BigInt' class if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.",
+        "Try using the 'BigInt' class if you need an integer larger than "
+        "9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.",
     hasPublishedDocs: true,
   );
 
@@ -6646,7 +6764,8 @@
   // ```
   static const CompileTimeErrorCode INVALID_ANNOTATION = CompileTimeErrorCode(
     'INVALID_ANNOTATION',
-    "Annotation must be either a const variable reference or const constructor invocation.",
+    "Annotation must be either a const variable reference or const constructor "
+        "invocation.",
     hasPublishedDocs: true,
   );
 
@@ -6705,7 +6824,8 @@
     'INVALID_ANNOTATION_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY',
     "Constant values from a deferred library can't be used in annotations.",
     correctionMessage:
-        "Try moving the constant from the deferred library, or removing 'deferred' from the import.",
+        "Try moving the constant from the deferred library, or removing "
+        "'deferred' from the import.",
     hasPublishedDocs: true,
   );
 
@@ -6759,7 +6879,8 @@
     'INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY',
     "Constant values from a deferred library can't be used as annotations.",
     correctionMessage:
-        "Try removing the annotation, or changing the import to not be deferred.",
+        "Try removing the annotation, or changing the import to not be "
+        "deferred.",
     hasPublishedDocs: true,
   );
 
@@ -6809,7 +6930,8 @@
     'INVALID_ASSIGNMENT',
     "A value of type '{0}' can't be assigned to a variable of type '{1}'.",
     correctionMessage:
-        "Try changing the type of the variable, or casting the right-hand type to '{1}'.",
+        "Try changing the type of the variable, or casting the right-hand type "
+        "to '{1}'.",
     hasPublishedDocs: true,
   );
 
@@ -6821,7 +6943,8 @@
   static const CompileTimeErrorCode INVALID_CAST_FUNCTION =
       CompileTimeErrorCode(
     'INVALID_CAST_FUNCTION',
-    "The function '{0}' has type '{1}' that isn't of expected type '{2}'. This means its parameter or return type doesn't match what is expected.",
+    "The function '{0}' has type '{1}' that isn't of expected type '{2}'. This "
+        "means its parameter or return type doesn't match what is expected.",
   );
 
   /**
@@ -6832,7 +6955,9 @@
   static const CompileTimeErrorCode INVALID_CAST_FUNCTION_EXPR =
       CompileTimeErrorCode(
     'INVALID_CAST_FUNCTION_EXPR',
-    "The function expression type '{0}' isn't of type '{1}'. This means its parameter or return type doesn't match what is expected. Consider changing parameter type(s) or the returned type(s).",
+    "The function expression type '{0}' isn't of type '{1}'. This means its "
+        "parameter or return type doesn't match what is expected. Consider "
+        "changing parameter type(s) or the returned type(s).",
   );
 
   /**
@@ -6853,7 +6978,9 @@
   static const CompileTimeErrorCode INVALID_CAST_LITERAL_LIST =
       CompileTimeErrorCode(
     'INVALID_CAST_LITERAL_LIST',
-    "The list literal type '{0}' isn't of expected type '{1}'. The list's type can be changed with an explicit generic type argument or by changing the element types.",
+    "The list literal type '{0}' isn't of expected type '{1}'. The list's type "
+        "can be changed with an explicit generic type argument or by changing "
+        "the element types.",
   );
 
   /**
@@ -6864,7 +6991,9 @@
   static const CompileTimeErrorCode INVALID_CAST_LITERAL_MAP =
       CompileTimeErrorCode(
     'INVALID_CAST_LITERAL_MAP',
-    "The map literal type '{0}' isn't of expected type '{1}'. The maps's type can be changed with an explicit generic type arguments or by changing the key and value types.",
+    "The map literal type '{0}' isn't of expected type '{1}'. The maps's type "
+        "can be changed with an explicit generic type arguments or by changing "
+        "the key and value types.",
   );
 
   /**
@@ -6875,7 +7004,9 @@
   static const CompileTimeErrorCode INVALID_CAST_LITERAL_SET =
       CompileTimeErrorCode(
     'INVALID_CAST_LITERAL_SET',
-    "The set literal type '{0}' isn't of expected type '{1}'. The set's type can be changed with an explicit generic type argument or by changing the element types.",
+    "The set literal type '{0}' isn't of expected type '{1}'. The set's type "
+        "can be changed with an explicit generic type argument or by changing "
+        "the element types.",
   );
 
   /**
@@ -6885,7 +7016,9 @@
    */
   static const CompileTimeErrorCode INVALID_CAST_METHOD = CompileTimeErrorCode(
     'INVALID_CAST_METHOD',
-    "The method tear-off '{0}' has type '{1}' that isn't of expected type '{2}'. This means its parameter or return type doesn't match what is expected.",
+    "The method tear-off '{0}' has type '{1}' that isn't of expected type "
+        "'{2}'. This means its parameter or return type doesn't match what is "
+        "expected.",
   );
 
   /**
@@ -6974,7 +7107,8 @@
   static const CompileTimeErrorCode INVALID_EXTENSION_ARGUMENT_COUNT =
       CompileTimeErrorCode(
     'INVALID_EXTENSION_ARGUMENT_COUNT',
-    "Extension overrides must have exactly one argument: the value of 'this' in the extension method.",
+    "Extension overrides must have exactly one argument: the value of 'this' "
+        "in the extension method.",
     correctionMessage: "Try specifying exactly one argument.",
     hasPublishedDocs: true,
   );
@@ -7038,7 +7172,8 @@
   static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS =
       CompileTimeErrorCode(
     'INVALID_FACTORY_NAME_NOT_A_CLASS',
-    "The name of a factory constructor must be the same as the name of the immediately enclosing class.",
+    "The name of a factory constructor must be the same as the name of the "
+        "immediately enclosing class.",
     hasPublishedDocs: true,
   );
 
@@ -7136,7 +7271,8 @@
   static const CompileTimeErrorCode INVALID_IMPLEMENTATION_OVERRIDE =
       CompileTimeErrorCode(
     'INVALID_IMPLEMENTATION_OVERRIDE',
-    "'{1}.{0}' ('{2}') isn't a valid concrete implementation of '{3}.{0}' ('{4}').",
+    "'{1}.{0}' ('{2}') isn't a valid concrete implementation of '{3}.{0}' "
+        "('{4}').",
     hasPublishedDocs: true,
   );
 
@@ -7169,9 +7305,11 @@
   static const CompileTimeErrorCode INVALID_INLINE_FUNCTION_TYPE =
       CompileTimeErrorCode(
     'INVALID_INLINE_FUNCTION_TYPE',
-    "Inline function types can't be used for parameters in a generic function type.",
+    "Inline function types can't be used for parameters in a generic function "
+        "type.",
     correctionMessage:
-        "Try using a generic function type (returnType 'Function(' parameters ')').",
+        "Try using a generic function type (returnType 'Function(' parameters "
+        "')').",
     hasPublishedDocs: true,
   );
 
@@ -7381,51 +7519,6 @@
   );
 
   /**
-   * No parameters.
-   */
-  // #### Description
-  //
-  // The analyzer produces this diagnostic when the initializer list of a
-  // constructor contains an invocation of a constructor in the superclass, but
-  // the invocation isn't the last item in the initializer list.
-  //
-  // #### Example
-  //
-  // The following code produces this diagnostic because the invocation of the
-  // superclass' constructor isn't the last item in the initializer list:
-  //
-  // ```dart
-  // class A {
-  //   A(int x);
-  // }
-  //
-  // class B extends A {
-  //   B(int x) : [!super!](x), assert(x >= 0);
-  // }
-  // ```
-  //
-  // #### Common fixes
-  //
-  // Move the invocation of the superclass' constructor to the end of the
-  // initializer list:
-  //
-  // ```dart
-  // class A {
-  //   A(int x);
-  // }
-  //
-  // class B extends A {
-  //   B(int x) : assert(x >= 0), super(x);
-  // }
-  // ```
-  static const CompileTimeErrorCode INVALID_SUPER_INVOCATION =
-      CompileTimeErrorCode(
-    'INVALID_SUPER_INVOCATION',
-    "The superclass call must be last in an initializer list: '{0}'.",
-    hasPublishedDocs: true,
-  );
-
-  /**
    * Parameters:
    * 0: the name of the type parameter
    */
@@ -7477,7 +7570,8 @@
   static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST =
       CompileTimeErrorCode(
     'INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL',
-    "Constant list literals can't include a type parameter as a type argument, such as '{0}'.",
+    "Constant list literals can't include a type parameter as a type argument, "
+        "such as '{0}'.",
     correctionMessage:
         "Try replacing the type parameter with a different type.",
     hasPublishedDocs: true,
@@ -7491,7 +7585,8 @@
   static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP =
       CompileTimeErrorCode(
     'INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL',
-    "Constant map literals can't include a type parameter as a type argument, such as '{0}'.",
+    "Constant map literals can't include a type parameter as a type argument, "
+        "such as '{0}'.",
     correctionMessage:
         "Try replacing the type parameter with a different type.",
     hasPublishedDocs: true,
@@ -7505,7 +7600,8 @@
   static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_SET =
       CompileTimeErrorCode(
     'INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL',
-    "Constant set literals can't include a type parameter as a type argument, such as '{0}'.",
+    "Constant set literals can't include a type parameter as a type argument, "
+        "such as '{0}'.",
     correctionMessage:
         "Try replacing the type parameter with a different type.",
     hasPublishedDocs: true,
@@ -7545,7 +7641,8 @@
   static const CompileTimeErrorCode INVALID_USE_OF_COVARIANT =
       CompileTimeErrorCode(
     'INVALID_USE_OF_COVARIANT',
-    "The 'covariant' keyword can only be used for parameters in instance methods or before non-final instance fields.",
+    "The 'covariant' keyword can only be used for parameters in instance "
+        "methods or before non-final instance fields.",
     correctionMessage: "Try removing the 'covariant' keyword.",
   );
 
@@ -7630,7 +7727,8 @@
   static const CompileTimeErrorCode INVOCATION_OF_EXTENSION_WITHOUT_CALL =
       CompileTimeErrorCode(
     'INVOCATION_OF_EXTENSION_WITHOUT_CALL',
-    "The extension '{0}' doesn't define a 'call' method so the override can't be used in an invocation.",
+    "The extension '{0}' doesn't define a 'call' method so the override can't "
+        "be used in an invocation.",
     hasPublishedDocs: true,
   );
 
@@ -7665,7 +7763,8 @@
     'INVOCATION_OF_NON_FUNCTION',
     "'{0}' isn't a function.",
     correctionMessage:
-        "Try correcting the name to match an existing function, or define a method or function named '{0}'.",
+        "Try correcting the name to match an existing function, or define a "
+        "method or function named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -7844,7 +7943,8 @@
     'LABEL_UNDEFINED',
     "Can't reference an undefined label '{0}'.",
     correctionMessage:
-        "Try defining the label, or correcting the name to match an existing label.",
+        "Try defining the label, or correcting the name to match an existing "
+        "label.",
     hasPublishedDocs: true,
   );
 
@@ -7895,9 +7995,11 @@
   static const CompileTimeErrorCode LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR =
       CompileTimeErrorCode(
     'LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR',
-    "Can't have a late final field in a class with a generative const constructor.",
+    "Can't have a late final field in a class with a generative const "
+        "constructor.",
     correctionMessage:
-        "Try removing the 'late' modifier, or don't declare 'const' constructors.",
+        "Try removing the 'late' modifier, or don't declare 'const' "
+        "constructors.",
     hasPublishedDocs: true,
   );
 
@@ -8041,7 +8143,8 @@
   static const CompileTimeErrorCode MAIN_FIRST_POSITIONAL_PARAMETER_TYPE =
       CompileTimeErrorCode(
     'MAIN_FIRST_POSITIONAL_PARAMETER_TYPE',
-    "The type of the first positional parameter of the 'main' function must be a supertype of 'List<String>'.",
+    "The type of the first positional parameter of the 'main' function must be "
+        "a supertype of 'List<String>'.",
     correctionMessage: "Try changing the type of the parameter.",
     hasPublishedDocs: true,
   );
@@ -8081,7 +8184,8 @@
     'MAIN_HAS_REQUIRED_NAMED_PARAMETERS',
     "The function 'main' can't have any required named parameters.",
     correctionMessage:
-        "Try using a different name for the function, or removing the 'required' modifier.",
+        "Try using a different name for the function, or removing the "
+        "'required' modifier.",
     hasPublishedDocs: true,
   );
 
@@ -8127,9 +8231,11 @@
   static const CompileTimeErrorCode
       MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS = CompileTimeErrorCode(
     'MAIN_HAS_TOO_MANY_REQUIRED_POSITIONAL_PARAMETERS',
-    "The function 'main' can't have more than two required positional parameters.",
+    "The function 'main' can't have more than two required positional "
+        "parameters.",
     correctionMessage:
-        "Try using a different name for the function, or removing extra parameters.",
+        "Try using a different name for the function, or removing extra "
+        "parameters.",
     hasPublishedDocs: true,
   );
 
@@ -8296,7 +8402,8 @@
   static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL =
       CompileTimeErrorCode(
     'MISSING_CONST_IN_LIST_LITERAL',
-    "List literals must be prefixed with 'const' when used as a constant expression.",
+    "List literals must be prefixed with 'const' when used as a constant "
+        "expression.",
     correctionMessage: "Try adding the keyword 'const' before the literal.",
   );
 
@@ -8306,7 +8413,8 @@
   static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL =
       CompileTimeErrorCode(
     'MISSING_CONST_IN_MAP_LITERAL',
-    "Map literals must be prefixed with 'const' when used as a constant expression.",
+    "Map literals must be prefixed with 'const' when used as a constant "
+        "expression.",
     correctionMessage: "Try adding the keyword 'const' before the literal.",
   );
 
@@ -8316,7 +8424,8 @@
   static const CompileTimeErrorCode MISSING_CONST_IN_SET_LITERAL =
       CompileTimeErrorCode(
     'MISSING_CONST_IN_SET_LITERAL',
-    "Set literals must be prefixed with 'const' when used as a constant expression.",
+    "Set literals must be prefixed with 'const' when used as a constant "
+        "expression.",
     correctionMessage: "Try adding the keyword 'const' before the literal.",
   );
 
@@ -8392,9 +8501,11 @@
   static const CompileTimeErrorCode MISSING_DEFAULT_VALUE_FOR_PARAMETER =
       CompileTimeErrorCode(
     'MISSING_DEFAULT_VALUE_FOR_PARAMETER',
-    "The parameter '{0}' can't have a value of 'null' because of its type, but the implicit default value is 'null'.",
+    "The parameter '{0}' can't have a value of 'null' because of its type, but "
+        "the implicit default value is 'null'.",
     correctionMessage:
-        "Try adding either an explicit non-'null' default value or the 'required' modifier.",
+        "Try adding either an explicit non-'null' default value or the "
+        "'required' modifier.",
     hasPublishedDocs: true,
   );
 
@@ -8432,7 +8543,8 @@
   static const CompileTimeErrorCode MISSING_REQUIRED_ARGUMENT =
       CompileTimeErrorCode(
     'MISSING_REQUIRED_ARGUMENT',
-    "The named parameter '{0}' is required, but there's no corresponding argument.",
+    "The named parameter '{0}' is required, but there's no corresponding "
+        "argument.",
     correctionMessage: "Try adding the required argument.",
     hasPublishedDocs: true,
   );
@@ -8555,7 +8667,8 @@
       MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE =
       CompileTimeErrorCode(
     'MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE',
-    "The super-invoked member '{0}' has the type '{1}', and the concrete member in the class has the type '{2}'.",
+    "The super-invoked member '{0}' has the type '{1}', and the concrete "
+        "member in the class has the type '{2}'.",
     hasPublishedDocs: true,
   );
 
@@ -8679,7 +8792,8 @@
   static const CompileTimeErrorCode
       MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER = CompileTimeErrorCode(
     'MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER',
-    "The class doesn't have a concrete implementation of the super-invoked member '{0}'.",
+    "The class doesn't have a concrete implementation of the super-invoked "
+        "member '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -8739,7 +8853,8 @@
   static const CompileTimeErrorCode MIXIN_CLASS_DECLARES_CONSTRUCTOR =
       CompileTimeErrorCode(
     'MIXIN_CLASS_DECLARES_CONSTRUCTOR',
-    "The class '{0}' can't be used as a mixin because it declares a constructor.",
+    "The class '{0}' can't be used as a mixin because it declares a "
+        "constructor.",
     hasPublishedDocs: true,
   );
 
@@ -8767,19 +8882,24 @@
   static const CompileTimeErrorCode
       MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES = CompileTimeErrorCode(
     'MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES',
-    "Type parameters couldn't be inferred for the mixin '{0}' because the base class implements the mixin's supertype constraint '{1}' in multiple conflicting ways",
+    "Type parameters couldn't be inferred for the mixin '{0}' because the base "
+        "class implements the mixin's supertype constraint '{1}' in multiple "
+        "conflicting ways",
   );
 
   static const CompileTimeErrorCode MIXIN_INFERENCE_NO_MATCHING_CLASS =
       CompileTimeErrorCode(
     'MIXIN_INFERENCE_NO_MATCHING_CLASS',
-    "Type parameters couldn't be inferred for the mixin '{0}' because the base class doesn't implement the mixin's supertype constraint '{1}'",
+    "Type parameters couldn't be inferred for the mixin '{0}' because the base "
+        "class doesn't implement the mixin's supertype constraint '{1}'",
   );
 
   static const CompileTimeErrorCode MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION =
       CompileTimeErrorCode(
     'MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION',
-    "Type parameters couldn't be inferred for the mixin '{0}' because no type parameter substitution could be found matching the mixin's supertype constraints",
+    "Type parameters couldn't be inferred for the mixin '{0}' because no type "
+        "parameter substitution could be found matching the mixin's supertype "
+        "constraints",
   );
 
   /**
@@ -8843,7 +8963,8 @@
   static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT =
       CompileTimeErrorCode(
     'MIXIN_INHERITS_FROM_NOT_OBJECT',
-    "The class '{0}' can't be used as a mixin because it extends a class other than 'Object'.",
+    "The class '{0}' can't be used as a mixin because it extends a class other "
+        "than 'Object'.",
     hasPublishedDocs: true,
   );
 
@@ -8884,7 +9005,8 @@
     'SUBTYPE_OF_DISALLOWED_TYPE',
     "Classes can't mixin '{0}'.",
     correctionMessage:
-        "Try specifying a different class or mixin, or remove the class or mixin from the list.",
+        "Try specifying a different class or mixin, or remove the class or "
+        "mixin from the list.",
     hasPublishedDocs: true,
     uniqueName: 'MIXIN_OF_DISALLOWED_CLASS',
   );
@@ -8941,7 +9063,8 @@
   static const CompileTimeErrorCode
       MIXIN_ON_TYPE_ALIAS_EXPANDS_TO_TYPE_PARAMETER = CompileTimeErrorCode(
     'SUPERTYPE_EXPANDS_TO_TYPE_PARAMETER',
-    "A type alias that expands to a type parameter can't be used as a superclass constraint.",
+    "A type alias that expands to a type parameter can't be used as a "
+        "superclass constraint.",
     hasPublishedDocs: true,
     uniqueName: 'MIXIN_ON_TYPE_ALIAS_EXPANDS_TO_TYPE_PARAMETER',
   );
@@ -8965,7 +9088,8 @@
     'SUBTYPE_OF_DISALLOWED_TYPE',
     "''{0}' can't be used as a superclass constraint.",
     correctionMessage:
-        "Try specifying a different super-class constraint, or remove the 'on' clause.",
+        "Try specifying a different super-class constraint, or remove the 'on' "
+        "clause.",
     hasPublishedDocs: true,
     uniqueName: 'MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS',
   );
@@ -9187,7 +9311,8 @@
     'NEW_WITH_UNDEFINED_CONSTRUCTOR',
     "The class '{0}' doesn't have a constructor named '{1}'.",
     correctionMessage:
-        "Try invoking a different constructor, or define a constructor named '{1}'.",
+        "Try invoking a different constructor, or define a constructor named "
+        "'{1}'.",
   );
 
   /**
@@ -9257,7 +9382,8 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS =
       CompileTimeErrorCode(
     'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
-    "Missing concrete implementations of '{0}', '{1}', '{2}', '{3}', and {4} more.",
+    "Missing concrete implementations of '{0}', '{1}', '{2}', '{3}', and {4} "
+        "more.",
     correctionMessage:
         "Try implementing the missing methods, or make the class abstract.",
     hasPublishedDocs: true,
@@ -9700,9 +9826,11 @@
   static const CompileTimeErrorCode
       NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = CompileTimeErrorCode(
     'NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be used as a case expression.",
+    "Constant values from a deferred library can't be used as a case "
+        "expression.",
     correctionMessage:
-        "Try re-writing the switch as a series of if statements, or changing the import to not be deferred.",
+        "Try re-writing the switch as a series of if statements, or changing "
+        "the import to not be deferred.",
     hasPublishedDocs: true,
   );
 
@@ -9806,9 +9934,11 @@
   static const CompileTimeErrorCode
       NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = CompileTimeErrorCode(
     'NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be used as a default parameter value.",
+    "Constant values from a deferred library can't be used as a default "
+        "parameter value.",
     correctionMessage:
-        "Try leaving the default as null and initializing the parameter inside the function body.",
+        "Try leaving the default as null and initializing the parameter inside "
+        "the function body.",
     hasPublishedDocs: true,
   );
 
@@ -9923,9 +10053,11 @@
   static const CompileTimeErrorCode
       NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = CompileTimeErrorCode(
     'COLLECTION_ELEMENT_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be used as values in a 'const' list literal.",
+    "Constant values from a deferred library can't be used as values in a "
+        "'const' list literal.",
     correctionMessage:
-        "Try removing the keyword 'const' from the list literal or removing the keyword 'deferred' from the import.",
+        "Try removing the keyword 'const' from the list literal or removing "
+        "the keyword 'deferred' from the import.",
     hasPublishedDocs: true,
     uniqueName: 'NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY',
   );
@@ -10028,9 +10160,11 @@
   static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY =
       CompileTimeErrorCode(
     'COLLECTION_ELEMENT_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be used as keys in a 'const' map literal.",
+    "Constant values from a deferred library can't be used as keys in a "
+        "'const' map literal.",
     correctionMessage:
-        "Try removing the keyword 'const' from the map literal or removing the keyword 'deferred' from the import.",
+        "Try removing the keyword 'const' from the map literal or removing the "
+        "keyword 'deferred' from the import.",
     hasPublishedDocs: true,
     uniqueName: 'NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY',
   );
@@ -10082,9 +10216,11 @@
   static const CompileTimeErrorCode
       NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = CompileTimeErrorCode(
     'COLLECTION_ELEMENT_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be used as values in a 'const' map literal.",
+    "Constant values from a deferred library can't be used as values in a "
+        "'const' map literal.",
     correctionMessage:
-        "Try removing the keyword 'const' from the map literal or removing the keyword 'deferred' from the import.",
+        "Try removing the keyword 'const' from the map literal or removing the "
+        "keyword 'deferred' from the import.",
     hasPublishedDocs: true,
     uniqueName: 'NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY',
   );
@@ -10140,7 +10276,8 @@
   static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT =
       CompileTimeErrorCode(
     'NON_CONST_MAP_AS_EXPRESSION_STATEMENT',
-    "A non-constant map or set literal without type arguments can't be used as an expression statement.",
+    "A non-constant map or set literal without type arguments can't be used as "
+        "an expression statement.",
   );
 
   /**
@@ -10192,7 +10329,8 @@
     'NON_GENERATIVE_CONSTRUCTOR',
     "The generative constructor '{0}' is expected, but a factory was found.",
     correctionMessage:
-        "Try calling a different constructor of the superclass, or making the called constructor not be a factory constructor.",
+        "Try calling a different constructor of the superclass, or making the "
+        "called constructor not be a factory constructor.",
     hasPublishedDocs: true,
   );
 
@@ -10209,9 +10347,13 @@
   static const CompileTimeErrorCode NON_GENERATIVE_IMPLICIT_CONSTRUCTOR =
       CompileTimeErrorCode(
     'NON_GENERATIVE_IMPLICIT_CONSTRUCTOR',
-    "The unnamed constructor of superclass '{0}' (called by the default constructor of '{1}') must be a generative constructor, but factory found.",
+    "The unnamed constructor of superclass '{0}' (called by the default "
+        "constructor of '{1}') must be a generative constructor, but factory "
+        "found.",
     correctionMessage:
-        "Try adding an explicit constructor that has a different superinitializer or changing the superclass constructor '{2}' to not be a factory constructor.",
+        "Try adding an explicit constructor that has a different "
+        "superinitializer or changing the superclass constructor '{2}' to not "
+        "be a factory constructor.",
   );
 
   /**
@@ -10301,7 +10443,8 @@
     'NON_TYPE_AS_TYPE_ARGUMENT',
     "The name '{0}' isn't a type so it can't be used as a type argument.",
     correctionMessage:
-        "Try correcting the name to an existing type, or defining a type named '{0}'.",
+        "Try correcting the name to an existing type, or defining a type named "
+        "'{0}'.",
     hasPublishedDocs: true,
     isUnresolvedIdentifier: true,
   );
@@ -10422,7 +10565,8 @@
     'NON_VOID_RETURN_FOR_SETTER',
     "The return type of the setter must be 'void' or absent.",
     correctionMessage:
-        "Try removing the return type, or define a method rather than a setter.",
+        "Try removing the return type, or define a method rather than a "
+        "setter.",
     hasPublishedDocs: true,
   );
 
@@ -10543,9 +10687,11 @@
       NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE =
       CompileTimeErrorCode(
     'NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE',
-    "The non-nullable local variable '{0}' must be assigned before it can be used.",
+    "The non-nullable local variable '{0}' must be assigned before it can be "
+        "used.",
     correctionMessage:
-        "Try giving it an initializer expression, or ensure that it's assigned on every execution path.",
+        "Try giving it an initializer expression, or ensure that it's assigned "
+        "on every execution path.",
     hasPublishedDocs: true,
   );
 
@@ -10725,7 +10871,8 @@
     'NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD',
     "Non-nullable instance field '{0}' must be initialized.",
     correctionMessage:
-        "Try adding an initializer expression, or a generative constructor that initializes it, or mark it 'late'.",
+        "Try adding an initializer expression, or a generative constructor "
+        "that initializes it, or mark it 'late'.",
     hasPublishedDocs: true,
   );
 
@@ -10739,7 +10886,8 @@
     'NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD',
     "Non-nullable instance field '{0}' must be initialized.",
     correctionMessage:
-        "Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.",
+        "Try adding an initializer expression, or add a field initializer in "
+        "this constructor, or mark it 'late'.",
     hasPublishedDocs: true,
     uniqueName: 'NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD_CONSTRUCTOR',
   );
@@ -10999,7 +11147,8 @@
     'NO_COMBINED_SUPER_SIGNATURE',
     "Can't infer missing types in '{0}' from overridden methods: {1}.",
     correctionMessage:
-        "Try providing explicit types for this method's parameters and return type.",
+        "Try providing explicit types for this method's parameters and return "
+        "type.",
     hasPublishedDocs: true,
   );
 
@@ -11013,7 +11162,8 @@
     'NO_DEFAULT_SUPER_CONSTRUCTOR',
     "The superclass '{0}' doesn't have a zero argument constructor.",
     correctionMessage:
-        "Try declaring a zero argument constructor in '{0}', or explicitly invoking a different constructor in '{0}'.",
+        "Try declaring a zero argument constructor in '{0}', or explicitly "
+        "invoking a different constructor in '{0}'.",
     uniqueName: 'NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT',
   );
 
@@ -11028,7 +11178,8 @@
     'NO_DEFAULT_SUPER_CONSTRUCTOR',
     "The superclass '{0}' doesn't have a zero argument constructor.",
     correctionMessage:
-        "Try declaring a zero argument constructor in '{0}', or declaring a constructor in {1} that explicitly invokes a constructor in '{0}'.",
+        "Try declaring a zero argument constructor in '{0}', or declaring a "
+        "constructor in {1} that explicitly invokes a constructor in '{0}'.",
     uniqueName: 'NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT',
   );
 
@@ -11044,9 +11195,13 @@
   static const CompileTimeErrorCode NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS =
       CompileTimeErrorCode(
     'NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS',
-    "The class '{0}' cannot extend '{1}' because '{1}' only has factory constructors (no generative constructors), and '{0}' has at least one generative constructor.",
+    "The class '{0}' cannot extend '{1}' because '{1}' only has factory "
+        "constructors (no generative constructors), and '{0}' has at least one "
+        "generative constructor.",
     correctionMessage:
-        "Try implementing the class instead, adding a generative (not factory) constructor to the superclass {0}, or a factory constructor to the subclass.",
+        "Try implementing the class instead, adding a generative (not factory) "
+        "constructor to the superclass {0}, or a factory constructor to the "
+        "subclass.",
   );
 
   /**
@@ -11356,7 +11511,8 @@
     'PART_OF_DIFFERENT_LIBRARY',
     "Expected this library to be part of '{0}', not '{1}'.",
     correctionMessage:
-        "Try including a different part, or changing the name of the library in the part's part-of directive.",
+        "Try including a different part, or changing the name of the library "
+        "in the part's part-of directive.",
     hasPublishedDocs: true,
   );
 
@@ -11449,9 +11605,11 @@
   static const CompileTimeErrorCode PART_OF_UNNAMED_LIBRARY =
       CompileTimeErrorCode(
     'PART_OF_UNNAMED_LIBRARY',
-    "The library is unnamed. A URI is expected, not a library name '{0}', in the part-of directive.",
+    "The library is unnamed. A URI is expected, not a library name '{0}', in "
+        "the part-of directive.",
     correctionMessage:
-        "Try changing the part-of directive to a URI, or try including a different part.",
+        "Try changing the part-of directive to a URI, or try including a "
+        "different part.",
     hasPublishedDocs: true,
   );
 
@@ -11497,7 +11655,8 @@
   static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER =
       CompileTimeErrorCode(
     'PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER',
-    "The name '{0}' is already used as an import prefix and can't be used to name a top-level element.",
+    "The name '{0}' is already used as an import prefix and can't be used to "
+        "name a top-level element.",
     correctionMessage:
         "Try renaming either the top-level element or the prefix.",
     hasPublishedDocs: true,
@@ -11546,7 +11705,8 @@
     'PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT',
     "The name '{0}' refers to an import prefix, so it must be followed by '.'.",
     correctionMessage:
-        "Try correcting the name to refer to something other than a prefix, or renaming the prefix.",
+        "Try correcting the name to refer to something other than a prefix, or "
+        "renaming the prefix.",
     hasPublishedDocs: true,
   );
 
@@ -11563,7 +11723,8 @@
   static const CompileTimeErrorCode PREFIX_SHADOWED_BY_LOCAL_DECLARATION =
       CompileTimeErrorCode(
     'PREFIX_SHADOWED_BY_LOCAL_DECLARATION',
-    "The prefix '{0}' can't be used here because it is shadowed by a local declaration.",
+    "The prefix '{0}' can't be used here because it is shadowed by a local "
+        "declaration.",
     correctionMessage:
         "Try renaming either the prefix or the local declaration.",
   );
@@ -11620,7 +11781,8 @@
   static const CompileTimeErrorCode PRIVATE_COLLISION_IN_MIXIN_APPLICATION =
       CompileTimeErrorCode(
     'PRIVATE_COLLISION_IN_MIXIN_APPLICATION',
-    "The private name '{0}', defined by '{1}', conflicts with the same name defined by '{2}'.",
+    "The private name '{0}', defined by '{1}', conflicts with the same name "
+        "defined by '{2}'.",
     correctionMessage: "Try removing '{1}' from the 'with' clause.",
     hasPublishedDocs: true,
   );
@@ -11662,14 +11824,16 @@
 
   static const CompileTimeErrorCode PRIVATE_SETTER = CompileTimeErrorCode(
     'PRIVATE_SETTER',
-    "The setter '{0}' is private and can't be accessed outside of the library that declares it.",
+    "The setter '{0}' is private and can't be accessed outside of the library "
+        "that declares it.",
     correctionMessage: "Try making it public.",
   );
 
   static const CompileTimeErrorCode READ_POTENTIALLY_UNASSIGNED_FINAL =
       CompileTimeErrorCode(
     'READ_POTENTIALLY_UNASSIGNED_FINAL',
-    "The final variable '{0}' can't be read because it is potentially unassigned at this point.",
+    "The final variable '{0}' can't be read because it is potentially "
+        "unassigned at this point.",
     correctionMessage:
         "Ensure that it is assigned on necessary execution paths.",
   );
@@ -11972,7 +12136,8 @@
     'REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR',
     "The constructor '{0}' couldn't be found in '{1}'.",
     correctionMessage:
-        "Try redirecting to a different constructor, or defining the constructor named '{0}'.",
+        "Try redirecting to a different constructor, or defining the "
+        "constructor named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -12032,7 +12197,8 @@
   static const CompileTimeErrorCode REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR =
       CompileTimeErrorCode(
     'REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR',
-    "The redirecting constructor '{0}' can't redirect to a constructor of the abstract class '{1}'.",
+    "The redirecting constructor '{0}' can't redirect to a constructor of the "
+        "abstract class '{1}'.",
     correctionMessage: "Try redirecting to a constructor of a different class.",
   );
 
@@ -12173,7 +12339,8 @@
   static const CompileTimeErrorCode REDIRECT_TO_INVALID_RETURN_TYPE =
       CompileTimeErrorCode(
     'REDIRECT_TO_INVALID_RETURN_TYPE',
-    "The return type '{0}' of the redirected constructor isn't a subtype of '{1}'.",
+    "The return type '{0}' of the redirected constructor isn't a subtype of "
+        "'{1}'.",
     correctionMessage: "Try redirecting to a different constructor.",
     hasPublishedDocs: true,
   );
@@ -12187,7 +12354,8 @@
     'REDIRECT_TO_MISSING_CONSTRUCTOR',
     "The constructor '{0}' couldn't be found in '{1}'.",
     correctionMessage:
-        "Try redirecting to a different constructor, or define the constructor named '{0}'.",
+        "Try redirecting to a different constructor, or define the constructor "
+        "named '{0}'.",
   );
 
   /**
@@ -12234,7 +12402,8 @@
   static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS =
       CompileTimeErrorCode(
     'REDIRECT_TO_NON_CLASS',
-    "The name '{0}' isn't a type and can't be used in a redirected constructor.",
+    "The name '{0}' isn't a type and can't be used in a redirected "
+        "constructor.",
     correctionMessage: "Try redirecting to a different constructor.",
     hasPublishedDocs: true,
   );
@@ -12283,7 +12452,8 @@
   static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR =
       CompileTimeErrorCode(
     'REDIRECT_TO_NON_CONST_CONSTRUCTOR',
-    "A constant redirecting constructor can't redirect to a non-constant constructor.",
+    "A constant redirecting constructor can't redirect to a non-constant "
+        "constructor.",
     correctionMessage: "Try redirecting to a different constructor.",
     hasPublishedDocs: true,
   );
@@ -12329,7 +12499,8 @@
   static const CompileTimeErrorCode
       REDIRECT_TO_TYPE_ALIAS_EXPANDS_TO_TYPE_PARAMETER = CompileTimeErrorCode(
     'REDIRECT_TO_TYPE_ALIAS_EXPANDS_TO_TYPE_PARAMETER',
-    "A redirecting constructor can't redirect to a type alias that expands to a type parameter.",
+    "A redirecting constructor can't redirect to a type alias that expands to "
+        "a type parameter.",
     correctionMessage: "Try replacing it with a class.",
     hasPublishedDocs: true,
   );
@@ -12390,7 +12561,9 @@
     'REFERENCED_BEFORE_DECLARATION',
     "Local variable '{0}' can't be referenced before it is declared.",
     correctionMessage:
-        "Try moving the declaration to before the first use, or renaming the local variable so that it doesn't hide a name from an enclosing scope.",
+        "Try moving the declaration to before the first use, or renaming the "
+        "local variable so that it doesn't hide a name from an enclosing "
+        "scope.",
     hasPublishedDocs: true,
   );
 
@@ -12443,7 +12616,8 @@
     'RETHROW_OUTSIDE_CATCH',
     "A rethrow must be inside of a catch clause.",
     correctionMessage:
-        "Try moving the expression into a catch clause, or using a 'throw' expression.",
+        "Try moving the expression into a catch clause, or using a 'throw' "
+        "expression.",
     hasPublishedDocs: true,
   );
 
@@ -12562,9 +12736,11 @@
   // ```
   static const CompileTimeErrorCode RETURN_IN_GENERATOR = CompileTimeErrorCode(
     'RETURN_IN_GENERATOR',
-    "Can't return a value from a generator function that uses the 'async*' or 'sync*' modifier.",
+    "Can't return a value from a generator function that uses the 'async*' or "
+        "'sync*' modifier.",
     correctionMessage:
-        "Try replacing 'return' with 'yield', using a block function body, or changing the method body modifier.",
+        "Try replacing 'return' with 'yield', using a block function body, or "
+        "changing the method body modifier.",
     hasPublishedDocs: true,
   );
 
@@ -12600,7 +12776,8 @@
   static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_CLOSURE =
       CompileTimeErrorCode(
     'RETURN_OF_INVALID_TYPE_FROM_CLOSURE',
-    "The return type '{0}' isn't a '{1}', as required by the closure's context.",
+    "The return type '{0}' isn't a '{1}', as required by the closure's "
+        "context.",
     hasPublishedDocs: true,
   );
 
@@ -12613,7 +12790,8 @@
   static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR =
       CompileTimeErrorCode(
     'RETURN_OF_INVALID_TYPE',
-    "A value of type '{0}' can't be returned from the constructor '{2}' because it has a return type of '{1}'.",
+    "A value of type '{0}' can't be returned from the constructor '{2}' "
+        "because it has a return type of '{1}'.",
     hasPublishedDocs: true,
     uniqueName: 'RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
   );
@@ -12655,7 +12833,8 @@
   static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_FUNCTION =
       CompileTimeErrorCode(
     'RETURN_OF_INVALID_TYPE',
-    "A value of type '{0}' can't be returned from the function '{2}' because it has a return type of '{1}'.",
+    "A value of type '{0}' can't be returned from the function '{2}' because "
+        "it has a return type of '{1}'.",
     hasPublishedDocs: true,
     uniqueName: 'RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
   );
@@ -12669,7 +12848,8 @@
   static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_METHOD =
       CompileTimeErrorCode(
     'RETURN_OF_INVALID_TYPE',
-    "A value of type '{0}' can't be returned from the method '{2}' because it has a return type of '{1}'.",
+    "A value of type '{0}' can't be returned from the method '{2}' because it "
+        "has a return type of '{1}'.",
     hasPublishedDocs: true,
     uniqueName: 'RETURN_OF_INVALID_TYPE_FROM_METHOD',
   );
@@ -12714,9 +12894,11 @@
   static const CompileTimeErrorCode SET_ELEMENT_FROM_DEFERRED_LIBRARY =
       CompileTimeErrorCode(
     'COLLECTION_ELEMENT_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be used as values in a 'const' set literal.",
+    "Constant values from a deferred library can't be used as values in a "
+        "'const' set literal.",
     correctionMessage:
-        "Try removing the keyword 'const' from the set literal or removing the keyword 'deferred' from the import.",
+        "Try removing the keyword 'const' from the set literal or removing the "
+        "keyword 'deferred' from the import.",
     hasPublishedDocs: true,
     uniqueName: 'SET_ELEMENT_FROM_DEFERRED_LIBRARY',
   );
@@ -12814,7 +12996,8 @@
   static const CompileTimeErrorCode SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY =
       CompileTimeErrorCode(
     'SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY',
-    "Constant values from a deferred library can't be spread into a const literal.",
+    "Constant values from a deferred library can't be spread into a const "
+        "literal.",
     correctionMessage: "Try making the deferred import non-deferred.",
   );
 
@@ -12892,6 +13075,52 @@
   );
 
   /**
+   * Parameters:
+   * 0: the superinitializer
+   */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the initializer list of a
+  // constructor contains an invocation of a constructor in the superclass, but
+  // the invocation isn't the last item in the initializer list.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because the invocation of the
+  // superclass' constructor isn't the last item in the initializer list:
+  //
+  // ```dart
+  // class A {
+  //   A(int x);
+  // }
+  //
+  // class B extends A {
+  //   B(int x) : [!super!](x), assert(x >= 0);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Move the invocation of the superclass' constructor to the end of the
+  // initializer list:
+  //
+  // ```dart
+  // class A {
+  //   A(int x);
+  // }
+  //
+  // class B extends A {
+  //   B(int x) : assert(x >= 0), super(x);
+  // }
+  // ```
+  static const CompileTimeErrorCode SUPER_INVOCATION_NOT_LAST =
+      CompileTimeErrorCode(
+    'SUPER_INVOCATION_NOT_LAST',
+    "The superconstructor call must be last in an initializer list: '{0}'.",
+    hasPublishedDocs: true,
+  );
+
+  /**
    * No parameters.
    */
   // #### Description
@@ -12922,7 +13151,8 @@
   // ```
   static const CompileTimeErrorCode SUPER_IN_EXTENSION = CompileTimeErrorCode(
     'SUPER_IN_EXTENSION',
-    "The 'super' keyword can't be used in an extension because an extension doesn't have a superclass.",
+    "The 'super' keyword can't be used in an extension because an extension "
+        "doesn't have a superclass.",
     hasPublishedDocs: true,
   );
 
@@ -13064,7 +13294,8 @@
   static const CompileTimeErrorCode SWITCH_EXPRESSION_NOT_ASSIGNABLE =
       CompileTimeErrorCode(
     'SWITCH_EXPRESSION_NOT_ASSIGNABLE',
-    "Type '{0}' of the switch expression isn't assignable to the type '{1}' of case expressions.",
+    "Type '{0}' of the switch expression isn't assignable to the type '{1}' of "
+        "case expressions.",
     hasPublishedDocs: true,
   );
 
@@ -13102,7 +13333,8 @@
     'TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS',
     "A generative constructor of an abstract class can't be torn off.",
     correctionMessage:
-        "Try tearing off a constructor of a concrete class, or a non-generative constructor.",
+        "Try tearing off a constructor of a concrete class, or a "
+        "non-generative constructor.",
     hasPublishedDocs: true,
   );
 
@@ -13189,9 +13421,11 @@
   // before any of the variables in the cycle are referenced.
   static const CompileTimeErrorCode TOP_LEVEL_CYCLE = CompileTimeErrorCode(
     'TOP_LEVEL_CYCLE',
-    "The type of '{0}' can't be inferred because it depends on itself through the cycle: {1}.",
+    "The type of '{0}' can't be inferred because it depends on itself through "
+        "the cycle: {1}.",
     correctionMessage:
-        "Try adding an explicit type to one or more of the variables in the cycle in order to break the cycle.",
+        "Try adding an explicit type to one or more of the variables in the "
+        "cycle in order to break the cycle.",
     hasPublishedDocs: true,
   );
 
@@ -13225,7 +13459,8 @@
   static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF =
       CompileTimeErrorCode(
     'TYPE_ALIAS_CANNOT_REFERENCE_ITSELF',
-    "Typedefs can't reference themselves directly or recursively via another typedef.",
+    "Typedefs can't reference themselves directly or recursively via another "
+        "typedef.",
     hasPublishedDocs: true,
   );
 
@@ -13272,9 +13507,11 @@
   static const CompileTimeErrorCode TYPE_ANNOTATION_DEFERRED_CLASS =
       CompileTimeErrorCode(
     'TYPE_ANNOTATION_DEFERRED_CLASS',
-    "The deferred type '{0}' can't be used in a declaration, cast, or type test.",
+    "The deferred type '{0}' can't be used in a declaration, cast, or type "
+        "test.",
     correctionMessage:
-        "Try using a different type, or changing the import to not be deferred.",
+        "Try using a different type, or changing the import to not be "
+        "deferred.",
     hasPublishedDocs: true,
   );
 
@@ -13363,7 +13600,8 @@
     'TYPE_PARAMETER_REFERENCED_BY_STATIC',
     "Static members can't reference type parameters of the class.",
     correctionMessage:
-        "Try removing the reference to the type parameter, or making the member an instance member.",
+        "Try removing the reference to the type parameter, or making the "
+        "member an instance member.",
     hasPublishedDocs: true,
   );
 
@@ -13516,7 +13754,8 @@
     'TYPE_TEST_WITH_UNDEFINED_NAME',
     "The name '{0}' isn't defined, so it can't be used in an 'is' expression.",
     correctionMessage:
-        "Try changing the name to the name of an existing type, or creating a type with the name '{0}'.",
+        "Try changing the name to the name of an existing type, or creating a "
+        "type with the name '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -13532,9 +13771,11 @@
   static const CompileTimeErrorCode
       UNCHECKED_METHOD_INVOCATION_OF_NULLABLE_VALUE = CompileTimeErrorCode(
     'UNCHECKED_USE_OF_NULLABLE_VALUE',
-    "The method '{0}' can't be unconditionally invoked because the receiver can be 'null'.",
+    "The method '{0}' can't be unconditionally invoked because the receiver "
+        "can be 'null'.",
     correctionMessage:
-        "Try making the call conditional (using '?.') or adding a null check to the target ('!').",
+        "Try making the call conditional (using '?.') or adding a null check "
+        "to the target ('!').",
     hasPublishedDocs: true,
     uniqueName: 'UNCHECKED_METHOD_INVOCATION_OF_NULLABLE_VALUE',
   );
@@ -13542,7 +13783,8 @@
   static const CompileTimeErrorCode
       UNCHECKED_OPERATOR_INVOCATION_OF_NULLABLE_VALUE = CompileTimeErrorCode(
     'UNCHECKED_USE_OF_NULLABLE_VALUE',
-    "The operator '{0}' can't be unconditionally invoked because the receiver can be 'null'.",
+    "The operator '{0}' can't be unconditionally invoked because the receiver "
+        "can be 'null'.",
     correctionMessage: "Try adding a null check to the target ('!').",
     hasPublishedDocs: true,
     uniqueName: 'UNCHECKED_OPERATOR_INVOCATION_OF_NULLABLE_VALUE',
@@ -13551,9 +13793,11 @@
   static const CompileTimeErrorCode
       UNCHECKED_PROPERTY_ACCESS_OF_NULLABLE_VALUE = CompileTimeErrorCode(
     'UNCHECKED_USE_OF_NULLABLE_VALUE',
-    "The property '{0}' can't be unconditionally accessed because the receiver can be 'null'.",
+    "The property '{0}' can't be unconditionally accessed because the receiver "
+        "can be 'null'.",
     correctionMessage:
-        "Try making the access conditional (using '?.') or adding a null check to the target ('!').",
+        "Try making the access conditional (using '?.') or adding a null check "
+        "to the target ('!').",
     hasPublishedDocs: true,
     uniqueName: 'UNCHECKED_PROPERTY_ACCESS_OF_NULLABLE_VALUE',
   );
@@ -13618,7 +13862,8 @@
     'UNCHECKED_USE_OF_NULLABLE_VALUE',
     "A nullable expression can't be used as a condition.",
     correctionMessage:
-        "Try checking that the value isn't 'null' before using it as a condition.",
+        "Try checking that the value isn't 'null' before using it as a "
+        "condition.",
     hasPublishedDocs: true,
     uniqueName: 'UNCHECKED_USE_OF_NULLABLE_VALUE_AS_CONDITION',
   );
@@ -13628,7 +13873,8 @@
     'UNCHECKED_USE_OF_NULLABLE_VALUE',
     "A nullable expression can't be used as an iterator in a for-in loop.",
     correctionMessage:
-        "Try checking that the value isn't 'null' before using it as an iterator.",
+        "Try checking that the value isn't 'null' before using it as an "
+        "iterator.",
     hasPublishedDocs: true,
     uniqueName: 'UNCHECKED_USE_OF_NULLABLE_VALUE_AS_ITERATOR',
   );
@@ -13638,7 +13884,8 @@
     'UNCHECKED_USE_OF_NULLABLE_VALUE',
     "A nullable expression can't be used in a spread.",
     correctionMessage:
-        "Try checking that the value isn't 'null' before using it in a spread, or use a null-aware spread.",
+        "Try checking that the value isn't 'null' before using it in a spread, "
+        "or use a null-aware spread.",
     hasPublishedDocs: true,
     uniqueName: 'UNCHECKED_USE_OF_NULLABLE_VALUE_IN_SPREAD',
   );
@@ -13648,7 +13895,8 @@
     'UNCHECKED_USE_OF_NULLABLE_VALUE',
     "A nullable expression can't be used in a yield-each statement.",
     correctionMessage:
-        "Try checking that the value isn't 'null' before using it in a yield-each statement.",
+        "Try checking that the value isn't 'null' before using it in a "
+        "yield-each statement.",
     hasPublishedDocs: true,
     uniqueName: 'UNCHECKED_USE_OF_NULLABLE_VALUE_IN_YIELD_EACH',
   );
@@ -13738,7 +13986,8 @@
     'UNDEFINED_CLASS',
     "Undefined class '{0}'.",
     correctionMessage:
-        "Try changing the name to the name of an existing class, or creating a class with the name '{0}'.",
+        "Try changing the name to the name of an existing class, or creating a "
+        "class with the name '{0}'.",
     hasPublishedDocs: true,
     isUnresolvedIdentifier: true,
   );
@@ -13828,7 +14077,8 @@
     'UNDEFINED_CONSTRUCTOR_IN_INITIALIZER',
     "The class '{0}' doesn't have a constructor named '{1}'.",
     correctionMessage:
-        "Try defining a constructor named '{1}' in '{0}', or invoking a different constructor.",
+        "Try defining a constructor named '{1}' in '{0}', or invoking a "
+        "different constructor.",
     hasPublishedDocs: true,
   );
 
@@ -13841,7 +14091,8 @@
     'UNDEFINED_CONSTRUCTOR_IN_INITIALIZER',
     "The class '{0}' doesn't have an unnamed constructor.",
     correctionMessage:
-        "Try defining an unnamed constructor in '{0}', or invoking a different constructor.",
+        "Try defining an unnamed constructor in '{0}', or invoking a different "
+        "constructor.",
     hasPublishedDocs: true,
     uniqueName: 'UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT',
   );
@@ -13892,7 +14143,8 @@
     'UNDEFINED_ENUM_CONSTANT',
     "There's no constant named '{0}' in '{1}'.",
     correctionMessage:
-        "Try correcting the name to the name of an existing constant, or defining a constant named '{0}'.",
+        "Try correcting the name to the name of an existing constant, or "
+        "defining a constant named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -13994,7 +14246,8 @@
     'UNDEFINED_EXTENSION_GETTER',
     "The getter '{0}' isn't defined for the extension '{1}'.",
     correctionMessage:
-        "Try correcting the name to the name of an existing getter, or defining a getter named '{0}'.",
+        "Try correcting the name to the name of an existing getter, or "
+        "defining a getter named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -14096,7 +14349,8 @@
     'UNDEFINED_EXTENSION_METHOD',
     "The method '{0}' isn't defined for the extension '{1}'.",
     correctionMessage:
-        "Try correcting the name to the name of an existing method, or defining a method named '{0}'.",
+        "Try correcting the name to the name of an existing method, or "
+        "defining a method named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -14253,7 +14507,8 @@
     'UNDEFINED_EXTENSION_SETTER',
     "The setter '{0}' isn't defined for the extension '{1}'.",
     correctionMessage:
-        "Try correcting the name to the name of an existing setter, or defining a setter named '{0}'.",
+        "Try correcting the name to the name of an existing setter, or "
+        "defining a setter named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -14300,7 +14555,8 @@
     'UNDEFINED_FUNCTION',
     "The function '{0}' isn't defined.",
     correctionMessage:
-        "Try importing the library that defines '{0}', correcting the name to the name of an existing function, or defining a function named '{0}'.",
+        "Try importing the library that defines '{0}', correcting the name to "
+        "the name of an existing function, or defining a function named '{0}'.",
     hasPublishedDocs: true,
     isUnresolvedIdentifier: true,
   );
@@ -14338,7 +14594,9 @@
     'UNDEFINED_GETTER',
     "The getter '{0}' isn't defined for the type '{1}'.",
     correctionMessage:
-        "Try importing the library that defines '{0}', correcting the name to the name of an existing getter, or defining a getter or field named '{0}'.",
+        "Try importing the library that defines '{0}', correcting the name to "
+        "the name of an existing getter, or defining a getter or field named "
+        "'{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -14352,7 +14610,8 @@
     'UNDEFINED_GETTER',
     "The getter '{0}' isn't defined for the '{1}' function type.",
     correctionMessage:
-        "Try wrapping the function type alias in parentheses in order to access '{0}' as an extension getter on 'Type'.",
+        "Try wrapping the function type alias in parentheses in order to "
+        "access '{0}' as an extension getter on 'Type'.",
     hasPublishedDocs: true,
     uniqueName: 'UNDEFINED_GETTER_ON_FUNCTION_TYPE',
   );
@@ -14429,7 +14688,8 @@
     'UNDEFINED_IDENTIFIER_AWAIT',
     "Undefined name 'await' in function body not marked with 'async'.",
     correctionMessage:
-        "Try correcting the name to one that is defined, defining the name, or adding 'async' to the enclosing function body.",
+        "Try correcting the name to one that is defined, defining the name, or "
+        "adding 'async' to the enclosing function body.",
     hasPublishedDocs: true,
   );
 
@@ -14466,7 +14726,8 @@
     'UNDEFINED_METHOD',
     "The method '{0}' isn't defined for the type '{1}'.",
     correctionMessage:
-        "Try correcting the name to the name of an existing method, or defining a method named '{0}'.",
+        "Try correcting the name to the name of an existing method, or "
+        "defining a method named '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -14480,7 +14741,8 @@
     'UNDEFINED_METHOD',
     "The method '{0}' isn't defined for the '{1}' function type.",
     correctionMessage:
-        "Try wrapping the function type alias in parentheses in order to access '{0}' as an extension method on 'Type'.",
+        "Try wrapping the function type alias in parentheses in order to "
+        "access '{0}' as an extension method on 'Type'.",
     hasPublishedDocs: true,
     uniqueName: 'UNDEFINED_METHOD_ON_FUNCTION_TYPE',
   );
@@ -14562,7 +14824,8 @@
     'UNDEFINED_NAMED_PARAMETER',
     "The named parameter '{0}' isn't defined.",
     correctionMessage:
-        "Try correcting the name to an existing named parameter's name, or defining a named parameter with the name '{0}'.",
+        "Try correcting the name to an existing named parameter's name, or "
+        "defining a named parameter with the name '{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -14637,9 +14900,11 @@
   static const CompileTimeErrorCode UNDEFINED_PREFIXED_NAME =
       CompileTimeErrorCode(
     'UNDEFINED_PREFIXED_NAME',
-    "The name '{0}' is being referenced through the prefix '{1}', but it isn't defined in any of the libraries imported using that prefix.",
+    "The name '{0}' is being referenced through the prefix '{1}', but it isn't "
+        "defined in any of the libraries imported using that prefix.",
     correctionMessage:
-        "Try correcting the prefix or importing the library that defines '{0}'.",
+        "Try correcting the prefix or importing the library that defines "
+        "'{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -14686,7 +14951,9 @@
     'UNDEFINED_SETTER',
     "The setter '{0}' isn't defined for the type '{1}'.",
     correctionMessage:
-        "Try importing the library that defines '{0}', correcting the name to the name of an existing setter, or defining a setter or field named '{0}'.",
+        "Try importing the library that defines '{0}', correcting the name to "
+        "the name of an existing setter, or defining a setter or field named "
+        "'{0}'.",
     hasPublishedDocs: true,
   );
 
@@ -14700,7 +14967,8 @@
     'UNDEFINED_SETTER',
     "The setter '{0}' isn't defined for the '{1}' function type.",
     correctionMessage:
-        "Try wrapping the function type alias in parentheses in order to access '{0}' as an extension getter on 'Type'.",
+        "Try wrapping the function type alias in parentheses in order to "
+        "access '{0}' as an extension getter on 'Type'.",
     hasPublishedDocs: true,
     uniqueName: 'UNDEFINED_SETTER_ON_FUNCTION_TYPE',
   );
@@ -14715,7 +14983,8 @@
     'UNDEFINED_SUPER_MEMBER',
     "The getter '{0}' isn't defined in a superclass of '{1}'.",
     correctionMessage:
-        "Try correcting the name to the name of an existing getter, or defining a getter or field named '{0}' in a superclass.",
+        "Try correcting the name to the name of an existing getter, or "
+        "defining a getter or field named '{0}' in a superclass.",
     hasPublishedDocs: true,
     uniqueName: 'UNDEFINED_SUPER_GETTER',
   );
@@ -14770,7 +15039,8 @@
     'UNDEFINED_SUPER_MEMBER',
     "The method '{0}' isn't defined in a superclass of '{1}'.",
     correctionMessage:
-        "Try correcting the name to the name of an existing method, or defining a method named '{0}' in a superclass.",
+        "Try correcting the name to the name of an existing method, or "
+        "defining a method named '{0}' in a superclass.",
     hasPublishedDocs: true,
     uniqueName: 'UNDEFINED_SUPER_METHOD',
   );
@@ -14799,7 +15069,8 @@
     'UNDEFINED_SUPER_MEMBER',
     "The setter '{0}' isn't defined in a superclass of '{1}'.",
     correctionMessage:
-        "Try correcting the name to the name of an existing setter, or defining a setter or field named '{0}' in a superclass.",
+        "Try correcting the name to the name of an existing setter, or "
+        "defining a setter or field named '{0}' in a superclass.",
     hasPublishedDocs: true,
     uniqueName: 'UNDEFINED_SUPER_SETTER',
   );
@@ -14851,7 +15122,8 @@
   static const CompileTimeErrorCode
       UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = CompileTimeErrorCode(
     'UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER',
-    "Static members from supertypes must be qualified by the name of the defining type.",
+    "Static members from supertypes must be qualified by the name of the "
+        "defining type.",
     correctionMessage: "Try adding '{0}.' before the name.",
     hasPublishedDocs: true,
   );
@@ -14920,7 +15192,8 @@
       UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE =
       CompileTimeErrorCode(
     'UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE',
-    "Static members from the extended type or one of its superclasses must be qualified by the name of the defining type.",
+    "Static members from the extended type or one of its superclasses must be "
+        "qualified by the name of the defining type.",
     correctionMessage: "Try adding '{0}.' before the name.",
     hasPublishedDocs: true,
   );
@@ -14952,7 +15225,8 @@
     'URI_DOES_NOT_EXIST',
     "Target of URI doesn't exist: '{0}'.",
     correctionMessage:
-        "Try creating the file referenced by the URI, or Try using a URI for a file that does exist.",
+        "Try creating the file referenced by the URI, or Try using a URI for a "
+        "file that does exist.",
     hasPublishedDocs: true,
   );
 
@@ -14994,7 +15268,8 @@
     'URI_HAS_NOT_BEEN_GENERATED',
     "Target of URI hasn't been generated: '{0}'.",
     correctionMessage:
-        "Try running the generator that will generate the file referenced by the URI.",
+        "Try running the generator that will generate the file referenced by "
+        "the URI.",
     hasPublishedDocs: true,
   );
 
@@ -15096,7 +15371,9 @@
     'USE_OF_VOID_RESULT',
     "This expression has a type of 'void' so its value can't be used.",
     correctionMessage:
-        "Try checking to see if you're using the correct API; there might be a function or call that returns void you didn't expect. Also check type parameters and variables which might also be void.",
+        "Try checking to see if you're using the correct API; there might be a "
+        "function or call that returns void you didn't expect. Also check type "
+        "parameters and variables which might also be void.",
     hasPublishedDocs: true,
   );
 
@@ -15143,7 +15420,8 @@
   static const CompileTimeErrorCode VARIABLE_TYPE_MISMATCH =
       CompileTimeErrorCode(
     'VARIABLE_TYPE_MISMATCH',
-    "A value of type '{0}' can't be assigned to a const variable of type '{1}'.",
+    "A value of type '{0}' can't be assigned to a const variable of type "
+        "'{1}'.",
     correctionMessage: "Try using a subtype, or removing the 'const' keyword",
     hasPublishedDocs: true,
   );
@@ -15169,9 +15447,11 @@
       WRONG_EXPLICIT_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE =
       CompileTimeErrorCode(
     'WRONG_EXPLICIT_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE',
-    "'{0}' is an '{1}' type parameter and can't be used in an '{2}' position in '{3}'.",
+    "'{0}' is an '{1}' type parameter and can't be used in an '{2}' position "
+        "in '{3}'.",
     correctionMessage:
-        "Try using 'in' type parameters in 'in' positions and 'out' type parameters in 'out' positions in the superinterface.",
+        "Try using 'in' type parameters in 'in' positions and 'out' type "
+        "parameters in 'out' positions in the superinterface.",
   );
 
   /**
@@ -15328,9 +15608,11 @@
   static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS =
       CompileTimeErrorCode(
     'WRONG_NUMBER_OF_TYPE_ARGUMENTS',
-    "The type '{0}' is declared with {1} type parameters, but {2} type arguments were given.",
+    "The type '{0}' is declared with {1} type parameters, but {2} type "
+        "arguments were given.",
     correctionMessage:
-        "Try adjusting the number of type arguments to match the number of type parameters.",
+        "Try adjusting the number of type arguments to match the number of "
+        "type parameters.",
     hasPublishedDocs: true,
   );
 
@@ -15342,9 +15624,11 @@
   static const CompileTimeErrorCode
       WRONG_NUMBER_OF_TYPE_ARGUMENTS_ANONYMOUS_FUNCTION = CompileTimeErrorCode(
     'WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION',
-    "This function is declared with {0} type parameters, but {1} type arguments were given.",
+    "This function is declared with {0} type parameters, but {1} type "
+        "arguments were given.",
     correctionMessage:
-        "Try adjusting the number of type arguments to match the number of type parameters.",
+        "Try adjusting the number of type arguments to match the number of "
+        "type parameters.",
     uniqueName: 'WRONG_NUMBER_OF_TYPE_ARGUMENTS_ANONYMOUS_FUNCTION',
   );
 
@@ -15448,7 +15732,8 @@
   static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION =
       CompileTimeErrorCode(
     'WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION',
-    "The extension '{0}' is declared with {1} type parameters, but {2} type arguments were given.",
+    "The extension '{0}' is declared with {1} type parameters, but {2} type "
+        "arguments were given.",
     correctionMessage: "Try adjusting the number of type arguments.",
     hasPublishedDocs: true,
   );
@@ -15462,9 +15747,11 @@
   static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION =
       CompileTimeErrorCode(
     'WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION',
-    "The function '{0}' is declared with {1} type parameters, but {2} type arguments were given.",
+    "The function '{0}' is declared with {1} type parameters, but {2} type "
+        "arguments were given.",
     correctionMessage:
-        "Try adjusting the number of type arguments to match the number of type parameters.",
+        "Try adjusting the number of type arguments to match the number of "
+        "type parameters.",
   );
 
   /**
@@ -15519,7 +15806,8 @@
   static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD =
       CompileTimeErrorCode(
     'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
-    "The method '{0}' is declared with {1} type parameters, but {2} type arguments are given.",
+    "The method '{0}' is declared with {1} type parameters, but {2} type "
+        "arguments are given.",
     correctionMessage: "Try adjusting the number of type arguments.",
     hasPublishedDocs: true,
   );
@@ -15534,7 +15822,9 @@
     'WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE',
     "'{0}' can't be used contravariantly or invariantly in '{1}'.",
     correctionMessage:
-        "Try not using class type parameters in types of formal parameters of function types, nor in explicitly contravariant or invariant superinterfaces.",
+        "Try not using class type parameters in types of formal parameters of "
+        "function types, nor in explicitly contravariant or invariant "
+        "superinterfaces.",
   );
 
   /**
@@ -15560,7 +15850,9 @@
     'WRONG_TYPE_PARAMETER_VARIANCE_POSITION',
     "The '{0}' type parameter '{1}' can't be used in an '{2}' position.",
     correctionMessage:
-        "Try removing the type parameter or change the explicit variance modifier declaration for the type parameter to another one of 'in', 'out', or 'inout'.",
+        "Try removing the type parameter or change the explicit variance "
+        "modifier declaration for the type parameter to another one of 'in', "
+        "'out', or 'inout'.",
   );
 
   /**
@@ -15606,7 +15898,8 @@
   static const CompileTimeErrorCode YIELD_EACH_IN_NON_GENERATOR =
       CompileTimeErrorCode(
     'YIELD_IN_NON_GENERATOR',
-    "Yield-each statements must be in a generator function (one marked with either 'async*' or 'sync*').",
+    "Yield-each statements must be in a generator function (one marked with "
+        "either 'async*' or 'sync*').",
     correctionMessage:
         "Try adding 'async*' or 'sync*' to the enclosing function.",
     hasPublishedDocs: true,
@@ -15614,6 +15907,20 @@
   );
 
   /**
+   * Parameters:
+   * 0: the type of the expression after `yield*`
+   * 1: the return type of the function containing the `yield*`
+   */
+  static const CompileTimeErrorCode YIELD_EACH_OF_INVALID_TYPE =
+      CompileTimeErrorCode(
+    'YIELD_OF_INVALID_TYPE',
+    "The type '{0}' implied by the 'yield*' expression must be assignable to "
+        "'{1}'.",
+    hasPublishedDocs: true,
+    uniqueName: 'YIELD_EACH_OF_INVALID_TYPE',
+  );
+
+  /**
    * ?? Yield: It is a compile-time error if a yield statement appears in a
    * function that is not a generator function.
    *
@@ -15622,7 +15929,8 @@
   static const CompileTimeErrorCode YIELD_IN_NON_GENERATOR =
       CompileTimeErrorCode(
     'YIELD_IN_NON_GENERATOR',
-    "Yield statements must be in a generator function (one marked with either 'async*' or 'sync*').",
+    "Yield statements must be in a generator function (one marked with either "
+        "'async*' or 'sync*').",
     correctionMessage:
         "Try adding 'async*' or 'sync*' to the enclosing function.",
     hasPublishedDocs: true,
@@ -15635,10 +15943,11 @@
    */
   // #### Description
   //
-  // The analyzer produces this diagnostic when the type of object produced by a
-  // `yield` expression doesn't match the type of objects that are to be
-  // returned from the `Iterable` or `Stream` types that are returned from a
-  // generator (a function or method marked with either `sync*` or `async*`).
+  // The analyzer produces this diagnostic when the type of object produced by
+  // a `yield` or `yield*` expression doesn't match the type of objects that
+  // are to be returned from the `Iterable` or `Stream` types that are returned
+  // from a generator (a function or method marked with either `sync*` or
+  // `async*`).
   //
   // #### Example
   //
@@ -15674,7 +15983,7 @@
   static const CompileTimeErrorCode YIELD_OF_INVALID_TYPE =
       CompileTimeErrorCode(
     'YIELD_OF_INVALID_TYPE',
-    "The type '{0}' implied by the 'yield' expression must be assignable to '{1}'.",
+    "A yielded value of type '{0}' must be assignable to '{1}'.",
     hasPublishedDocs: true,
   );
 
@@ -15707,70 +16016,80 @@
     'IMPLICIT_DYNAMIC_FIELD',
     "Missing field type for '{0}'.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_FUNCTION = LanguageCode(
     'IMPLICIT_DYNAMIC_FUNCTION',
     "Missing type arguments for generic function '{0}<{1}>'.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_INVOKE = LanguageCode(
     'IMPLICIT_DYNAMIC_INVOKE',
     "Missing type arguments for calling generic function type '{0}'.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_LIST_LITERAL = LanguageCode(
     'IMPLICIT_DYNAMIC_LIST_LITERAL',
     "Missing type argument for list literal.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_MAP_LITERAL = LanguageCode(
     'IMPLICIT_DYNAMIC_MAP_LITERAL',
     "Missing type arguments for map literal.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_METHOD = LanguageCode(
     'IMPLICIT_DYNAMIC_METHOD',
     "Missing type arguments for generic method '{0}<{1}>'.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_PARAMETER = LanguageCode(
     'IMPLICIT_DYNAMIC_PARAMETER',
     "Missing parameter type for '{0}'.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_RETURN = LanguageCode(
     'IMPLICIT_DYNAMIC_RETURN',
     "Missing return type for '{0}'.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_TYPE = LanguageCode(
     'IMPLICIT_DYNAMIC_TYPE',
     "Missing type arguments for generic type '{0}'.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   static const LanguageCode IMPLICIT_DYNAMIC_VARIABLE = LanguageCode(
     'IMPLICIT_DYNAMIC_VARIABLE',
     "Missing variable type for '{0}'.",
     correctionMessage:
-        "Try adding an explicit type, or remove implicit-dynamic from your analysis options file.",
+        "Try adding an explicit type, or remove implicit-dynamic from your "
+        "analysis options file.",
   );
 
   /// Initialize a newly created error code to have the given [name].
@@ -15923,7 +16242,7 @@
   // `isEven` if `s` is `null`. In other words, if `s` is `null`, then neither
   // `length` nor `isEven` will be invoked, and if `s` is non-`null`, then
   // `length` can't return a `null` value. Either way, `isEven` can't be invoked
-  // on a `null` value, so the null-aware operator is not necessary. See
+  // on a `null` value, so the null-aware operator isn't necessary. See
   // [Understanding null safety](/null-safety/understanding-null-safety#smarter-null-aware-methods)
   // for more details.
   //
@@ -15957,7 +16276,8 @@
   static const StaticWarningCode INVALID_NULL_AWARE_OPERATOR =
       StaticWarningCode(
     'INVALID_NULL_AWARE_OPERATOR',
-    "The receiver can't be null, so the null-aware operator '{0}' is unnecessary.",
+    "The receiver can't be null, so the null-aware operator '{0}' is "
+        "unnecessary.",
     correctionMessage: "Try replacing the operator '{0}' with '{1}'.",
     hasPublishedDocs: true,
   );
@@ -15970,7 +16290,8 @@
   static const StaticWarningCode
       INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT = StaticWarningCode(
     'INVALID_NULL_AWARE_OPERATOR',
-    "The receiver can't be null because of short-circuiting, so the null-aware operator '{0}' can't be used.",
+    "The receiver can't be null because of short-circuiting, so the null-aware "
+        "operator '{0}' can't be used.",
     correctionMessage: "Try replacing the operator '{0}' with '{1}'.",
     hasPublishedDocs: true,
     uniqueName: 'INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT',
@@ -15986,7 +16307,8 @@
   static const StaticWarningCode
       INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = StaticWarningCode(
     'INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED',
-    "Parameters can't override default values, this method overrides '{0}.{1}' where '{2}' has a different value.",
+    "Parameters can't override default values, this method overrides '{0}.{1}' "
+        "where '{2}' has a different value.",
     correctionMessage: "Try using the same default value in both methods.",
   );
 
@@ -16000,7 +16322,8 @@
   static const StaticWarningCode
       INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = StaticWarningCode(
     'INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL',
-    "Parameters can't override default values, this method overrides '{0}.{1}' where this positional parameter has a different value.",
+    "Parameters can't override default values, this method overrides '{0}.{1}' "
+        "where this positional parameter has a different value.",
     correctionMessage: "Try using the same default value in both methods.",
   );
 
@@ -16072,7 +16395,8 @@
     'MISSING_ENUM_CONSTANT_IN_SWITCH',
     "Missing case clause for '{0}'.",
     correctionMessage:
-        "Try adding a case clause for the missing constant, or adding a default clause.",
+        "Try adding a case clause for the missing constant, or adding a "
+        "default clause.",
     hasPublishedDocs: true,
   );
 
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 88d8a87..0ec6f98 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -790,6 +790,6 @@
     if (source2 == null) {
       return false;
     }
-    return !source1.isInSystemLibrary && source2.isInSystemLibrary;
+    return !source1.uri.isScheme('dart') && source2.uri.isScheme('dart');
   }
 }
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 9977e73..b6d1951 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -327,7 +327,7 @@
 
     // The SDK implementation may implement disallowed types. For example,
     // JSNumber in dart2js and _Smi in Dart VM both implement int.
-    if (library.source.isInSystemLibrary) {
+    if (library.source.uri.isScheme('dart')) {
       return false;
     }
 
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
index a6962f4..05ee001 100644
--- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart
+++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -138,7 +138,15 @@
   /// assigned to the [elementType] of the enclosing collection.
   void _verifySpreadForListOrSet(bool isNullAware, Expression expression) {
     var expressionType = expression.typeOrThrow;
-    if (expressionType.isDynamic) return;
+    if (expressionType.isDynamic) {
+      if (typeSystem.strictCasts) {
+        return errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.NOT_ITERABLE_SPREAD,
+          expression,
+        );
+      }
+      return;
+    }
 
     if (typeSystem.isNonNullableByDefault) {
       if (typeSystem.isSubtypeOf(expressionType, NeverTypeImpl.instance)) {
@@ -224,7 +232,15 @@
   /// its key and values are assignable to [mapKeyType] and [mapValueType].
   void _verifySpreadForMap(bool isNullAware, Expression expression) {
     var expressionType = expression.typeOrThrow;
-    if (expressionType.isDynamic) return;
+    if (expressionType.isDynamic) {
+      if (typeSystem.strictCasts) {
+        return errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.NOT_MAP_SPREAD,
+          expression,
+        );
+      }
+      return;
+    }
 
     if (typeSystem.isNonNullableByDefault) {
       if (typeSystem.isSubtypeOf(expressionType, NeverTypeImpl.instance)) {
diff --git a/pkg/analyzer/lib/src/error/return_type_verifier.dart b/pkg/analyzer/lib/src/error/return_type_verifier.dart
index 06ef0ed..2ae92c7 100644
--- a/pkg/analyzer/lib/src/error/return_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/return_type_verifier.dart
@@ -134,6 +134,12 @@
       return;
     }
 
+    if (enclosingExecutable.isGenerator) {
+      // [CompileTimeErrorCode.RETURN_IN_GENERATOR] has already been reported;
+      // do not report a duplicate error.
+      return;
+    }
+
     if (_typeSystem.isNonNullableByDefault) {
       _checkReturnExpression_nullSafety(expression);
     } else {
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index c2f2f09..9db6af2 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -499,7 +499,8 @@
       NodeList<TypeAnnotation> arguments, ErrorCode errorCode) {
     for (TypeAnnotation type in arguments) {
       if (type is NamedType && type.type is TypeParameterType) {
-        _errorReporter.reportErrorForNode(errorCode, type, [type.name]);
+        _errorReporter
+            .reportErrorForNode(errorCode, type, [type.name.toSource()]);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index 0d64b24..9984e82 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -439,15 +439,12 @@
     if (element.isSynthetic) {
       return true;
     }
-    if (_hasPragmaVmEntryPoint(element)) {
-      return true;
-    }
     if (element is LocalVariableElement ||
         element is FunctionElement && !element.isStatic) {
       // local variable or function
     } else if (element is ParameterElement) {
       var enclosingElement = element.enclosingElement;
-      // Only report unused parameters of methods or functions.
+      // Only report unused parameters of constructors, methods, and functions.
       if (enclosingElement is! ConstructorElement &&
           enclosingElement is! FunctionElement &&
           enclosingElement is! MethodElement) {
@@ -457,7 +454,22 @@
       if (!element.isOptional) {
         return true;
       }
+      if (enclosingElement is ConstructorElement &&
+          enclosingElement.enclosingElement.typeParameters.isNotEmpty) {
+        // There is an issue matching arguments of instance creation
+        // expressions for generic classes with parameters, so for now,
+        // consider every parameter of a constructor of a generic class
+        // "used". See https://github.com/dart-lang/sdk/issues/47839.
+        return true;
+      }
       if (enclosingElement is ExecutableElement) {
+        if (enclosingElement.typeParameters.isNotEmpty) {
+          // There is an issue matching arguments of generic function
+          // invocations with parameters, so for now, consider every parameter
+          // of a generic function "used". See
+          // https://github.com/dart-lang/sdk/issues/47839.
+          return true;
+        }
         if (_isPubliclyAccessible(enclosingElement)) {
           return true;
         }
@@ -470,6 +482,9 @@
         return true;
       }
     }
+    if (_hasPragmaVmEntryPoint(element)) {
+      return true;
+    }
     return _usedElements.elements.contains(element);
   }
 
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 4a50a3c..455a0f6 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -62,6 +62,8 @@
     show
         ClassDeclarationImpl,
         CompilationUnitImpl,
+        ConstructorNameImpl,
+        EnumDeclarationImpl,
         ExtensionDeclarationImpl,
         ImportDirectiveImpl,
         MethodInvocationImpl,
@@ -104,6 +106,9 @@
   /// The extension currently being parsed, or `null` if none.
   ExtensionDeclarationImpl? extensionDeclaration;
 
+  /// The enum currently being parsed, or `null` if none.
+  EnumDeclarationImpl? enumDeclaration;
+
   /// If true, this is building a full AST. Otherwise, only create method
   /// bodies.
   final bool isFullAst;
@@ -150,6 +155,15 @@
   /// `true` if named arguments anywhere are enabled
   final bool enableNamedArgumentsAnywhere;
 
+  /// `true` if super parameters are enabled
+  final bool enableSuperParameters;
+
+  /// `true` if enhanced enums are enabled
+  final bool enableEnhancedEnums;
+
+  /// `true` if macros are enabled
+  final bool enableMacros;
+
   final FeatureSet _featureSet;
 
   AstBuilder(ErrorReporter? errorReporter, this.fileUri, this.isFullAst,
@@ -170,6 +184,9 @@
         enableExtensionTypes = _featureSet.isEnabled(Feature.extension_types),
         enableNamedArgumentsAnywhere =
             _featureSet.isEnabled(Feature.named_arguments_anywhere),
+        enableSuperParameters = _featureSet.isEnabled(Feature.super_parameters),
+        enableEnhancedEnums = _featureSet.isEnabled(Feature.enhanced_enums),
+        enableMacros = _featureSet.isEnabled(Feature.macros),
         uri = uri ?? fileUri;
 
   NodeList<ClassMember> get currentDeclarationMembers {
@@ -177,8 +194,10 @@
       return classDeclaration!.members;
     } else if (mixinDeclaration != null) {
       return mixinDeclaration!.members;
-    } else {
+    } else if (extensionDeclaration != null) {
       return extensionDeclaration!.members;
+    } else {
+      return enumDeclaration!.members;
     }
   }
 
@@ -187,8 +206,10 @@
       return classDeclaration!.name;
     } else if (mixinDeclaration != null) {
       return mixinDeclaration!.name;
-    } else {
+    } else if (extensionDeclaration != null) {
       return extensionDeclaration!.name;
+    } else {
+      return enumDeclaration!.name;
     }
   }
 
@@ -223,11 +244,25 @@
   }
 
   @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     assert(classDeclaration == null &&
         mixinDeclaration == null &&
         extensionDeclaration == null);
     push(_Modifiers()..abstractKeyword = abstractToken);
+    if (macroToken != null && !enableMacros) {
+      var feature = ExperimentalFeatures.macros;
+      handleRecoverableError(
+          templateExperimentNotEnabled.withArguments(
+            feature.enableString,
+            _versionAsString(ExperimentStatus.currentVersion),
+          ),
+          macroToken,
+          macroToken);
+      // Pretend that 'macro' didn't occur while this feature is incomplete.
+      macroToken = null;
+    }
+    push(macroToken ?? NullValue.Token);
   }
 
   @override
@@ -236,6 +271,9 @@
   }
 
   @override
+  void beginEnum(Token enumKeyword) {}
+
+  @override
   void beginExtensionDeclaration(Token extensionKeyword, Token? nameToken) {
     assert(optional('extension', extensionKeyword));
     assert(classDeclaration == null &&
@@ -330,11 +368,7 @@
     }
     if (staticToken != null) {
       assert(staticToken.isModifier);
-      String? className = classDeclaration != null
-          ? classDeclaration!.name.name
-          : (mixinDeclaration != null
-              ? mixinDeclaration!.name.name
-              : extensionDeclaration!.name?.name);
+      String? className = currentDeclarationName?.name;
       if (name.lexeme != className || getOrSet != null) {
         modifiers.staticKeyword = staticToken;
       }
@@ -359,8 +393,21 @@
 
   @override
   void beginNamedMixinApplication(
-      Token begin, Token? abstractToken, Token name) {
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     push(_Modifiers()..abstractKeyword = abstractToken);
+    if (macroToken != null && !enableMacros) {
+      var feature = ExperimentalFeatures.macros;
+      handleRecoverableError(
+          templateExperimentNotEnabled.withArguments(
+            feature.enableString,
+            _versionAsString(ExperimentStatus.currentVersion),
+          ),
+          macroToken,
+          macroToken);
+      // Pretend that 'macro' didn't occur while this feature is incomplete.
+      macroToken = null;
+    }
+    push(macroToken ?? NullValue.Token);
   }
 
   @override
@@ -1173,17 +1220,18 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     assert(optional('enum', enumKeyword));
     assert(optional('{', leftBrace));
     debugEvent("Enum");
+  }
 
-    var constants = popTypedList2<EnumConstantDeclaration>(count);
-    var name = pop() as SimpleIdentifier;
-    var metadata = pop() as List<Annotation>?;
-    var comment = _findComment(metadata, enumKeyword);
-    declarations.add(ast.enumDeclaration(comment, metadata, enumKeyword, name,
-        leftBrace, constants, leftBrace.endGroup!));
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    debugEvent("endEnumConstructor");
+    endClassConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -1412,18 +1460,32 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     assert(optionalOrNull('this', thisKeyword));
-    assert(thisKeyword == null
-        ? periodAfterThis == null
-        : optional('.', periodAfterThis!));
+    assert(optionalOrNull('super', superKeyword));
+    assert(thisKeyword == null && superKeyword == null
+        ? periodAfterThisOrSuper == null
+        : optional('.', periodAfterThisOrSuper!));
     debugEvent("FormalParameter");
 
+    if (superKeyword != null && !enableSuperParameters) {
+      var feature = ExperimentalFeatures.super_parameters;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        superKeyword,
+        superKeyword,
+      );
+    }
+
     var defaultValue = pop() as _ParameterDefaultValue?;
     var name = pop() as SimpleIdentifier?;
     var typeOrFunctionTypedParameter = pop() as AstNode?;
@@ -1443,7 +1505,37 @@
       // This is a temporary AST node that was constructed in
       // [endFunctionTypedFormalParameter]. We now deconstruct it and create
       // the final AST node.
-      if (thisKeyword == null) {
+      if (superKeyword != null) {
+        assert(thisKeyword == null,
+            "Can't have both 'this' and 'super' in a parameter.");
+        node = ast.superFormalParameter(
+            identifier: name!,
+            comment: comment,
+            metadata: metadata,
+            covariantKeyword: covariantKeyword,
+            requiredKeyword: requiredKeyword,
+            type: typeOrFunctionTypedParameter.returnType,
+            superKeyword: superKeyword,
+            period: periodAfterThisOrSuper!,
+            typeParameters: typeOrFunctionTypedParameter.typeParameters,
+            parameters: typeOrFunctionTypedParameter.parameters,
+            question: typeOrFunctionTypedParameter.question);
+      } else if (thisKeyword != null) {
+        assert(superKeyword == null,
+            "Can't have both 'this' and 'super' in a parameter.");
+        node = ast.fieldFormalParameter2(
+            identifier: name!,
+            comment: comment,
+            metadata: metadata,
+            covariantKeyword: covariantKeyword,
+            requiredKeyword: requiredKeyword,
+            type: typeOrFunctionTypedParameter.returnType,
+            thisKeyword: thisKeyword,
+            period: periodAfterThisOrSuper!,
+            typeParameters: typeOrFunctionTypedParameter.typeParameters,
+            parameters: typeOrFunctionTypedParameter.parameters,
+            question: typeOrFunctionTypedParameter.question);
+      } else {
         node = ast.functionTypedFormalParameter2(
             identifier: name!,
             comment: comment,
@@ -1454,32 +1546,25 @@
             typeParameters: typeOrFunctionTypedParameter.typeParameters,
             parameters: typeOrFunctionTypedParameter.parameters,
             question: typeOrFunctionTypedParameter.question);
-      } else {
-        node = ast.fieldFormalParameter2(
-            identifier: name!,
-            comment: comment,
-            metadata: metadata,
-            covariantKeyword: covariantKeyword,
-            requiredKeyword: requiredKeyword,
-            type: typeOrFunctionTypedParameter.returnType,
-            thisKeyword: thisKeyword,
-            period: periodAfterThis!,
-            typeParameters: typeOrFunctionTypedParameter.typeParameters,
-            parameters: typeOrFunctionTypedParameter.parameters,
-            question: typeOrFunctionTypedParameter.question);
       }
     } else {
       var type = typeOrFunctionTypedParameter as TypeAnnotation?;
-      if (thisKeyword == null) {
-        node = ast.simpleFormalParameter2(
+      if (superKeyword != null) {
+        assert(thisKeyword == null,
+            "Can't have both 'this' and 'super' in a parameter.");
+        node = ast.superFormalParameter(
             comment: comment,
             metadata: metadata,
             covariantKeyword: covariantKeyword,
             requiredKeyword: requiredKeyword,
             keyword: keyword,
             type: type,
-            identifier: name);
-      } else {
+            superKeyword: superKeyword,
+            period: periodAfterThisOrSuper!,
+            identifier: name!);
+      } else if (thisKeyword != null) {
+        assert(superKeyword == null,
+            "Can't have both 'this' and 'super' in a parameter.");
         node = ast.fieldFormalParameter2(
             comment: comment,
             metadata: metadata,
@@ -1490,6 +1575,15 @@
             thisKeyword: thisKeyword,
             period: thisKeyword.next!,
             identifier: name!);
+      } else {
+        node = ast.simpleFormalParameter2(
+            comment: comment,
+            metadata: metadata,
+            covariantKeyword: covariantKeyword,
+            requiredKeyword: requiredKeyword,
+            keyword: keyword,
+            type: type,
+            identifier: name);
       }
     }
 
@@ -1982,6 +2076,7 @@
     }
     var withClause = pop(NullValue.WithClause) as WithClause;
     var superclass = pop() as NamedType;
+    var macroKeyword = pop(NullValue.Token) as Token?;
     var modifiers = pop() as _Modifiers?;
     var typeParameters = pop() as TypeParameterList?;
     var name = pop() as SimpleIdentifier;
@@ -1996,6 +2091,7 @@
         typeParameters,
         equalsToken,
         abstractKeyword,
+        macroKeyword,
         superclass,
         withClause,
         implementsClause,
@@ -2580,6 +2676,7 @@
     var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
     var withClause = pop(NullValue.WithClause) as WithClause?;
     var extendsClause = pop(NullValue.ExtendsClause) as ExtendsClause?;
+    var macroKeyword = pop(NullValue.Token) as Token?;
     var modifiers = pop() as _Modifiers?;
     var typeParameters = pop() as TypeParameterList?;
     var name = pop() as SimpleIdentifier;
@@ -2592,6 +2689,7 @@
       comment,
       metadata,
       abstractKeyword,
+      macroKeyword,
       classKeyword,
       name,
       typeParameters,
@@ -2613,20 +2711,6 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    assert(optionalOrNull('implements', implementsKeyword));
-    debugEvent("ClassImplements");
-
-    if (implementsKeyword != null) {
-      var interfaces = popTypedList2<NamedType>(interfacesCount);
-      push(ast.implementsClause(implementsKeyword, interfaces));
-    } else {
-      push(NullValue.IdentifierList);
-    }
-  }
-
-  @override
   void handleClassWithClause(Token withKeyword) {
     assert(optional('with', withKeyword));
     var mixinTypes = pop() as List<NamedType>;
@@ -2635,13 +2719,26 @@
 
   @override
   void handleCommentReference(
-      Token? newKeyword, Token? prefix, Token? period, Token token) {
-    Identifier identifier = ast.simpleIdentifier(token);
-    if (prefix != null) {
-      identifier = ast.prefixedIdentifier(ast.simpleIdentifier(prefix), period!,
-          identifier as SimpleIdentifier);
+    Token? newKeyword,
+    Token? firstToken,
+    Token? firstPeriod,
+    Token? secondToken,
+    Token? secondPeriod,
+    Token thirdToken,
+  ) {
+    var identifier = ast.simpleIdentifier(thirdToken);
+    if (firstToken != null) {
+      var target = ast.prefixedIdentifier(ast.simpleIdentifier(firstToken),
+          firstPeriod!, ast.simpleIdentifier(secondToken!));
+      var expression = ast.propertyAccess(target, secondPeriod!, identifier);
+      push(ast.commentReference(newKeyword, expression));
+    } else if (secondToken != null) {
+      var expression = ast.prefixedIdentifier(
+          ast.simpleIdentifier(secondToken), secondPeriod!, identifier);
+      push(ast.commentReference(newKeyword, expression));
+    } else {
+      push(ast.commentReference(newKeyword, identifier));
     }
-    push(ast.commentReference(newKeyword, identifier));
   }
 
   @override
@@ -2702,6 +2799,114 @@
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElement");
+    var arguments = pop() as MethodInvocationImpl?;
+    var constructorName = pop() as ConstructorNameImpl?;
+
+    if (!enableEnhancedEnums &&
+        (arguments != null ||
+            constructorName != null &&
+                (constructorName.type2.typeArguments != null ||
+                    constructorName.name != null))) {
+      Token token = arguments != null
+          ? arguments.argumentList.beginToken
+          : constructorName!.beginToken;
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        token,
+        token,
+      );
+    }
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
+
+    var constants = popTypedList2<EnumConstantDeclaration>(elementsCount);
+    enumDeclaration!.constants.addAll(constants);
+
+    if (!enableEnhancedEnums && optional(';', elementsEndToken)) {
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        elementsEndToken,
+        elementsEndToken,
+      );
+    }
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    assert(optional('enum', enumKeyword));
+    assert(optional('{', leftBrace));
+    debugEvent("EnumHeader");
+
+    var implementsClause = pop(NullValue.IdentifierList) as ImplementsClause?;
+    var withClause = pop(NullValue.WithClause) as WithClause?;
+    var typeParameters = pop() as TypeParameterList?;
+    var name = pop() as SimpleIdentifier;
+    var metadata = pop() as List<Annotation>?;
+    var comment = _findComment(metadata, enumKeyword);
+
+    if (!enableEnhancedEnums &&
+        (withClause != null ||
+            implementsClause != null ||
+            typeParameters != null)) {
+      var token = withClause != null
+          ? withClause.withKeyword
+          : implementsClause != null
+              ? implementsClause.implementsKeyword
+              : typeParameters!.beginToken;
+      var feature = ExperimentalFeatures.enhanced_enums;
+      handleRecoverableError(
+        templateExperimentNotEnabled.withArguments(
+          feature.enableString,
+          _versionAsString(ExperimentStatus.currentVersion),
+        ),
+        token,
+        token,
+      );
+    }
+
+    declarations.add(
+      enumDeclaration = ast.enumDeclaration2(
+        comment: comment,
+        metadata: metadata,
+        enumKeyword: enumKeyword,
+        name: name,
+        typeParameters: typeParameters,
+        withClause: withClause,
+        implementsClause: implementsClause,
+        leftBracket: leftBrace,
+        constants: [],
+        members: [],
+        rightBracket: leftBrace.endGroup!,
+      ),
+    );
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    push(NullValue.WithClause);
+  }
+
+  @override
+  void handleEnumWithClause(Token withKeyword) {
+    assert(optional('with', withKeyword));
+    var mixinTypes = pop() as List<NamedType>;
+    push(ast.withClause(withKeyword, mixinTypes));
+  }
+
+  @override
   void handleErrorToken(ErrorToken token) {
     translateErrorToken(token, errorReporter.reportScannerError);
   }
@@ -2929,6 +3134,19 @@
   }
 
   @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    assert(optionalOrNull('implements', implementsKeyword));
+    debugEvent("Implements");
+
+    if (implementsKeyword != null) {
+      var interfaces = popTypedList2<NamedType>(interfacesCount);
+      push(ast.implementsClause(implementsKeyword, interfaces));
+    } else {
+      push(NullValue.IdentifierList);
+    }
+  }
+
+  @override
   void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     assert(optionalOrNull('deferred', deferredKeyword));
     assert(optionalOrNull('as', asKeyword));
@@ -3371,6 +3589,14 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+    assert(enumDeclaration != null);
+
+    push(ast.simpleIdentifier(enumDeclaration!.name.token));
+  }
+
+  @override
   void handleNoVariableInitializer(Token token) {
     debugEvent("NoVariableInitializer");
   }
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 0159195..6ce8f76 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -191,10 +191,6 @@
         _reportByCode(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, message,
             offset, length);
         return;
-      case "INVALID_SUPER_INVOCATION":
-        errorReporter?.reportErrorForOffset(
-            CompileTimeErrorCode.INVALID_SUPER_INVOCATION, offset, length);
-        return;
       case "MISSING_DIGIT":
         errorReporter?.reportErrorForOffset(
             ScannerErrorCode.MISSING_DIGIT, offset, length);
@@ -265,6 +261,10 @@
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.RETURN_IN_GENERATOR, offset, length);
         return;
+      case "SUPER_INVOCATION_NOT_LAST":
+        errorReporter?.reportErrorForOffset(
+            CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST, offset, length);
+        return;
       case "SUPER_IN_REDIRECTING_CONSTRUCTOR":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
diff --git a/pkg/analyzer/lib/src/file_system/file_system.dart b/pkg/analyzer/lib/src/file_system/file_system.dart
index 16c7b2a..b7b4655 100644
--- a/pkg/analyzer/lib/src/file_system/file_system.dart
+++ b/pkg/analyzer/lib/src/file_system/file_system.dart
@@ -18,6 +18,11 @@
   ResourceProvider get provider => _provider;
 
   @override
+  Uri pathToUri(String path) {
+    return _provider.pathContext.toUri(path);
+  }
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     if (!isFileUri(uri)) {
       return null;
@@ -27,9 +32,9 @@
     return file.createSource(uri);
   }
 
+  @Deprecated('Use pathToUri() instead')
   @override
-  Uri restoreAbsolute(Source source) =>
-      _provider.pathContext.toUri(source.fullName);
+  Uri restoreAbsolute(Source source) => pathToUri(source.fullName);
 
   /// Return `true` if the given [uri] is a `file` URI.
   static bool isFileUri(Uri uri) => uri.scheme == FILE_SCHEME;
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index f17f0d2..4a09e59 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -99,9 +99,6 @@
   /// The library containing the expression(s) that will be evaluated.
   final LibraryElementImpl _library;
 
-  /// Initialize a newly created evaluator to evaluate expressions in the given
-  /// [source]. The [typeProvider] is the type provider used to access known
-  /// types.
   ConstantEvaluator(this._source, this._library);
 
   EvaluationResult evaluate(Expression expression) {
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 717940b..c430007 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -10,9 +10,9 @@
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
+import 'package:analyzer/src/dart/resolver/comment_reference_resolver.dart';
 import 'package:analyzer/src/dart/resolver/method_invocation_resolver.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
-import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/migratable_ast_info_provider.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -81,18 +81,17 @@
   /// The element for the library containing the compilation unit being visited.
   final LibraryElement _definingLibrary;
 
-  /// Helper for resolving properties on types.
-  final TypePropertyResolver _typePropertyResolver;
-
   final MethodInvocationResolver _methodInvocationResolver;
 
+  late final _commentReferenceResolver =
+      CommentReferenceResolver(_typeProvider, _resolver);
+
   /// Initialize a newly created visitor to work for the given [_resolver] to
   /// resolve the nodes in a compilation unit.
   ElementResolver(this._resolver,
       {MigratableAstInfoProvider migratableAstInfoProvider =
           const MigratableAstInfoProvider()})
       : _definingLibrary = _resolver.definingLibrary,
-        _typePropertyResolver = _resolver.typePropertyResolver,
         _methodInvocationResolver = MethodInvocationResolver(
           _resolver,
           migratableAstInfoProvider,
@@ -124,70 +123,8 @@
   }
 
   @override
-  void visitCommentReference(covariant CommentReferenceImpl node) {
-    var expression = node.expression;
-    if (expression is SimpleIdentifierImpl) {
-      var element = _resolveSimpleIdentifier(expression);
-      if (element == null) {
-        return;
-      }
-      expression.staticElement = element;
-      if (node.newKeyword != null) {
-        if (element is ClassElement) {
-          var constructor = element.unnamedConstructor;
-          if (constructor == null) {
-            // TODO(brianwilkerson) Report this error.
-          } else {
-            expression.staticElement = constructor;
-          }
-        } else {
-          // TODO(brianwilkerson) Report this error.
-        }
-      }
-    } else if (expression is PrefixedIdentifierImpl) {
-      var prefix = expression.prefix;
-      var prefixElement = _resolveSimpleIdentifier(prefix);
-      prefix.staticElement = prefixElement;
-
-      var name = expression.identifier;
-
-      if (prefixElement == null) {
-        return;
-      }
-
-      if (prefixElement is PrefixElement) {
-        var prefixScope = prefixElement.scope;
-        var lookupResult = prefixScope.lookup(name.name);
-        var element = lookupResult.getter ?? lookupResult.setter;
-        element = _resolver.toLegacyElement(element);
-        name.staticElement = element;
-        return;
-      }
-
-      if (node.newKeyword == null) {
-        if (prefixElement is ClassElement) {
-          name.staticElement = prefixElement.getMethod(name.name) ??
-              prefixElement.getGetter(name.name) ??
-              prefixElement.getSetter(name.name) ??
-              prefixElement.getNamedConstructor(name.name);
-        } else if (prefixElement is ExtensionElement) {
-          name.staticElement = prefixElement.getMethod(name.name) ??
-              prefixElement.getGetter(name.name) ??
-              prefixElement.getSetter(name.name);
-        } else {
-          // TODO(brianwilkerson) Report this error.
-        }
-      } else if (prefixElement is ClassElement) {
-        var constructor = prefixElement.getNamedConstructor(name.name);
-        if (constructor == null) {
-          // TODO(brianwilkerson) Report this error.
-        } else {
-          name.staticElement = constructor;
-        }
-      } else {
-        // TODO(brianwilkerson) Report this error.
-      }
-    }
+  void visitCommentReference(CommentReference node) {
+    _commentReferenceResolver.resolve(node);
   }
 
   @override
@@ -438,7 +375,7 @@
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
             node,
-            [superType, name]);
+            [superType, name.name]);
       } else {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
@@ -571,88 +508,6 @@
     _resolveAnnotations(node.metadata);
   }
 
-  /// Resolve the given simple [identifier] if possible. Return the element to
-  /// which it could be resolved, or `null` if it could not be resolved. This
-  /// does not record the results of the resolution.
-  Element? _resolveSimpleIdentifier(SimpleIdentifierImpl identifier) {
-    var lookupResult = identifier.scopeLookupResult!;
-
-    var element = lookupResult.getter;
-    element = _resolver.toLegacyElement(element);
-
-    if (element is PropertyAccessorElement && identifier.inSetterContext()) {
-      var setter = lookupResult.setter;
-      if (setter == null) {
-        //
-        // Check to see whether there might be a locally defined getter and
-        // an inherited setter.
-        //
-        var enclosingClass = _resolver.enclosingClass;
-        if (enclosingClass != null) {
-          var result = _typePropertyResolver.resolve(
-            receiver: null,
-            receiverType: enclosingClass.thisType,
-            name: identifier.name,
-            propertyErrorEntity: identifier,
-            nameErrorEntity: identifier,
-          );
-          setter = result.setter;
-        }
-      }
-      if (setter != null) {
-        setter = _resolver.toLegacyElement(setter);
-        element = setter;
-      }
-    } else if (element == null &&
-        (identifier.inSetterContext() ||
-            identifier.parent is CommentReference)) {
-      element = lookupResult.setter;
-      element = _resolver.toLegacyElement(element);
-    }
-    if (element == null) {
-      InterfaceType enclosingType;
-      var enclosingClass = _resolver.enclosingClass;
-      if (enclosingClass == null) {
-        var enclosingExtension = _resolver.enclosingExtension;
-        if (enclosingExtension == null) {
-          return null;
-        }
-        DartType extendedType =
-            _resolveTypeParameter(enclosingExtension.extendedType);
-        if (extendedType is InterfaceType) {
-          enclosingType = extendedType;
-        } else if (extendedType is FunctionType) {
-          enclosingType = _typeProvider.functionType;
-        } else {
-          return null;
-        }
-      } else {
-        enclosingType = enclosingClass.thisType;
-      }
-      if (element == null) {
-        var result = _typePropertyResolver.resolve(
-          receiver: null,
-          receiverType: enclosingType,
-          name: identifier.name,
-          propertyErrorEntity: identifier,
-          nameErrorEntity: identifier,
-        );
-        if (identifier.inSetterContext() ||
-            identifier.parent is CommentReference) {
-          element = result.setter;
-        }
-        element ??= result.getter;
-      }
-    }
-    return element;
-  }
-
-  /// If the given [type] is a type parameter, resolve it to the type that
-  /// should be used when looking up members. Otherwise, return the original
-  /// type.
-  DartType _resolveTypeParameter(DartType type) =>
-      type.resolveToBound(_typeProvider.objectType);
-
   /// Checks whether the given [expression] is a reference to a class. If it is
   /// then the element representing the class is returned, otherwise `null` is
   /// returned.
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index c678842..6741d98 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -285,6 +285,9 @@
   /// re-throwing them)
   bool propagateLinterExceptions = false;
 
+  /// Whether implicit casts should be reported as potential problems.
+  bool strictCasts = false;
+
   /// A flag indicating whether inference failures are allowed, off by default.
   ///
   /// This option is experimental and subject to change.
@@ -338,11 +341,6 @@
     nonPackageFeatureSet = featureSet;
   }
 
-  @deprecated
-  set enabledExperiments(List<String> enabledExperiments) {
-    _contextFeatures = ExperimentStatus.fromStrings(enabledExperiments);
-  }
-
   @override
   List<ErrorProcessor> get errorProcessors =>
       _errorProcessors ??= const <ErrorProcessor>[];
@@ -388,6 +386,7 @@
       buffer.addBool(implicitCasts);
       buffer.addBool(implicitDynamic);
       buffer.addBool(propagateLinterExceptions);
+      buffer.addBool(strictCasts);
       buffer.addBool(strictInference);
       buffer.addBool(strictRawTypes);
       buffer.addBool(useFastaParser);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b53caa5..1d7d77c 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -42,9 +42,9 @@
 import 'package:analyzer/src/generated/element_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error_detection_helpers.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/this_access_tracker.dart';
+import 'package:analyzer/src/utilities/extensions/string.dart';
 import 'package:collection/collection.dart';
 
 class EnclosingExecutableContext {
@@ -86,16 +86,7 @@
   EnclosingExecutableContext.empty() : this(null);
 
   String? get displayName {
-    final element = this.element;
-    if (element is ConstructorElement) {
-      var className = element.enclosingElement.displayName;
-      var constructorName = element.displayName;
-      return constructorName.isEmpty
-          ? className
-          : '$className.$constructorName';
-    } else {
-      return element?.displayName;
-    }
+    return element?.displayName;
   }
 
   bool get isClosure {
@@ -260,7 +251,7 @@
         _requiredParametersVerifier = RequiredParametersVerifier(errorReporter),
         _duplicateDefinitionVerifier =
             DuplicateDefinitionVerifier(_currentLibrary, errorReporter) {
-    _isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
+    _isInSystemLibrary = _currentLibrary.source.uri.isScheme('dart');
     _isInCatchClause = false;
     _isInStaticVariableDeclaration = false;
     _isInConstructorInitializer = false;
@@ -517,7 +508,7 @@
       }
       _constructorFieldsVerifier.verify(node);
       _checkForRedirectingConstructorErrorCodes(node);
-      _checkForMultipleSuperInitializers(node);
+      _checkForConflictingInitializerErrorCodes(node);
       _checkForRecursiveConstructorRedirect(node, element);
       if (!_checkForRecursiveFactoryRedirect(node, element)) {
         _checkForAllRedirectConstructorErrorCodes(node);
@@ -795,7 +786,7 @@
         if (parameterType is FunctionType &&
             parameterType.returnType.isDynamic) {
           errorReporter.reportErrorForNode(LanguageCode.IMPLICIT_DYNAMIC_RETURN,
-              node.identifier, [node.identifier]);
+              node.identifier, [node.identifier.name]);
         }
       }
 
@@ -1501,7 +1492,7 @@
           conflictingMembers.map((e) => _getLibraryName(e)).toList();
       libraryNames.sort();
       errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_IMPORT,
-          node, [name, StringUtilities.printListOfQuotedNames(libraryNames)]);
+          node, [name, libraryNames.quotedAndCommaSeparatedWithAnd]);
     }
   }
 
@@ -1848,6 +1839,99 @@
     }
   }
 
+  /// Check that the given constructor [declaration] has a valid combination of
+  /// redirecting constructor invocation(s), super constructor invocation(s),
+  /// field initializers, and assert initializers.
+  void _checkForConflictingInitializerErrorCodes(
+      ConstructorDeclaration declaration) {
+    // Count and check each redirecting initializer.
+    var redirectingInitializerCount = 0;
+    var superInitializerCount = 0;
+    late SuperConstructorInvocation superInitializer;
+    for (ConstructorInitializer initializer in declaration.initializers) {
+      if (initializer is RedirectingConstructorInvocation) {
+        if (redirectingInitializerCount > 0) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
+              initializer);
+        }
+        if (declaration.factoryKeyword == null) {
+          RedirectingConstructorInvocation invocation = initializer;
+          var redirectingElement = invocation.staticElement;
+          if (redirectingElement == null) {
+            String enclosingNamedType = _enclosingClass!.displayName;
+            String constructorStrName = enclosingNamedType;
+            if (invocation.constructorName != null) {
+              constructorStrName += ".${invocation.constructorName!.name}";
+            }
+            errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
+                invocation,
+                [constructorStrName, enclosingNamedType]);
+          } else {
+            if (redirectingElement.isFactory) {
+              errorReporter.reportErrorForNode(
+                  CompileTimeErrorCode
+                      .REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR,
+                  initializer);
+            }
+          }
+        }
+        // [declaration] is a redirecting constructor via a redirecting
+        // initializer.
+        _checkForRedirectToNonConstConstructor(
+          declaration.declaredElement!,
+          initializer.staticElement,
+          initializer.constructorName ?? initializer.thisKeyword,
+        );
+        redirectingInitializerCount++;
+      } else if (initializer is SuperConstructorInvocation) {
+        if (superInitializerCount == 1) {
+          // Only report the second (first illegal) superinitializer.
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer);
+        }
+        superInitializer = initializer;
+        superInitializerCount++;
+      }
+    }
+    // Check for initializers which are illegal when alongside a redirecting
+    // initializer.
+    if (redirectingInitializerCount > 0) {
+      for (ConstructorInitializer initializer in declaration.initializers) {
+        if (initializer is SuperConstructorInvocation) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
+              initializer);
+        }
+        if (initializer is ConstructorFieldInitializer) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
+              initializer);
+        }
+        if (initializer is AssertInitializer) {
+          errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR,
+              initializer);
+        }
+      }
+    }
+    if (redirectingInitializerCount == 0 &&
+        superInitializerCount == 1 &&
+        superInitializer != declaration.initializers.last) {
+      var superNamedType = _enclosingClass!.supertype!.element.displayName;
+      var constructorStrName = superNamedType;
+      var constructorName = superInitializer.constructorName;
+      if (constructorName != null) {
+        constructorStrName += '.${constructorName.name}';
+      }
+      errorReporter.reportErrorForToken(
+          CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST,
+          superInitializer.superKeyword,
+          [constructorStrName]);
+    }
+  }
+
   /// Verify that if the given [constructor] declaration is 'const' then there
   /// are no invocations of non-'const' super constructors, and that there are
   /// no instance variables mixed in.
@@ -2089,12 +2173,12 @@
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
           name,
-          [className, name]);
+          [className.toSource(), name.name]);
     } else {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
           constructorName,
-          [className]);
+          [className.toSource()]);
     }
   }
 
@@ -2166,6 +2250,26 @@
 
     DartType iterableType = node.iterable.typeOrThrow;
 
+    Token? awaitKeyword;
+    var parent = node.parent;
+    if (parent is ForStatement) {
+      awaitKeyword = parent.awaitKeyword;
+    } else if (parent is ForElement) {
+      awaitKeyword = parent.awaitKeyword;
+    }
+
+    // Use an explicit string instead of [loopType] to remove the "<E>".
+    String loopNamedType = awaitKeyword != null ? 'Stream' : 'Iterable';
+
+    if (iterableType.isDynamic && typeSystem.strictCasts) {
+      errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
+        node.iterable,
+        [iterableType, loopNamedType],
+      );
+      return false;
+    }
+
     // TODO(scheglov) use NullableDereferenceVerifier
     if (_isNonNullableByDefault) {
       if (typeSystem.isNullable(iterableType)) {
@@ -2182,14 +2286,6 @@
       return false;
     }
 
-    Token? awaitKeyword;
-    var parent = node.parent;
-    if (parent is ForStatement) {
-      awaitKeyword = parent.awaitKeyword;
-    } else if (parent is ForElement) {
-      awaitKeyword = parent.awaitKeyword;
-    }
-
     // The object being iterated has to implement Iterable<T> for some T that
     // is assignable to the variable's type.
     // TODO(rnystrom): Move this into mostSpecificTypeArgument()?
@@ -2204,8 +2300,6 @@
     }
 
     if (!typeSystem.isAssignableTo(iterableType, requiredSequenceType)) {
-      // Use an explicit string instead of [loopType] to remove the "<E>".
-      String loopNamedType = awaitKeyword != null ? 'Stream' : 'Iterable';
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
         node.iterable,
@@ -2403,7 +2497,7 @@
     }
     // The SDK implementation may implement disallowed types. For example,
     // JSNumber in dart2js and _Smi in Dart VM both implement int.
-    if (_currentLibrary.source.isInSystemLibrary) {
+    if (_currentLibrary.source.uri.isScheme('dart')) {
       return false;
     }
     var type = namedType.type;
@@ -2593,7 +2687,7 @@
       }
       // Parameters associated with a variable always have a name, so we can
       // safely rely on [id] being non-`null`.
-      errorReporter.reportErrorForNode(errorCode, node, [id!]);
+      errorReporter.reportErrorForNode(errorCode, node, [id!.toSource()]);
     }
   }
 
@@ -2739,18 +2833,18 @@
         errorReporter.reportErrorForNode(
             CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
             initializer,
-            [fieldName]);
+            [fieldName.name]);
       } else if (staticElement.isStatic) {
         errorReporter.reportErrorForNode(
             CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
             initializer,
-            [fieldName]);
+            [fieldName.name]);
       }
     } else {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
           initializer,
-          [fieldName]);
+          [fieldName.name]);
       return;
     }
   }
@@ -3085,6 +3179,10 @@
   /// See [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
   bool _checkForMixinInheritsNotFromObject(
       NamedType mixinName, ClassElement mixinElement) {
+    if (mixinElement.isEnum) {
+      return false;
+    }
+
     var mixinSupertype = mixinElement.supertype;
     if (mixinSupertype == null || mixinSupertype.isDartCoreObject) {
       var mixins = mixinElement.mixins;
@@ -3270,22 +3368,6 @@
     }
   }
 
-  /// Verify that the given [constructor] has at most one 'super' initializer.
-  ///
-  /// See [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS].
-  void _checkForMultipleSuperInitializers(ConstructorDeclaration constructor) {
-    bool hasSuperInitializer = false;
-    for (ConstructorInitializer initializer in constructor.initializers) {
-      if (initializer is SuperConstructorInvocation) {
-        if (hasSuperInitializer) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer);
-        }
-        hasSuperInitializer = true;
-      }
-    }
-  }
-
   /// Checks to ensure that the given native function [body] is in SDK code.
   ///
   /// See [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE].
@@ -3328,12 +3410,12 @@
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR,
           name,
-          [className, name]);
+          [className.toSource(), name.name]);
     } else {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
           constructorName,
-          [className]);
+          [className.toSource()]);
     }
   }
 
@@ -3651,8 +3733,9 @@
 
       if (treatedAsDouble) {
         // Suggest the nearest valid double (as a BigInt for printing reasons).
-        extraErrorArgs
-            .add(BigInt.from(IntegerLiteralImpl.nearestValidDouble(lexeme)));
+        extraErrorArgs.add(
+            BigInt.from(IntegerLiteralImpl.nearestValidDouble(lexeme))
+                .toString());
       }
 
       errorReporter.reportErrorForNode(
@@ -3727,112 +3810,44 @@
     return true;
   }
 
-  /// Check that the given constructor [declaration] has a valid combination of
-  /// redirected constructor invocation(s), super constructor invocations and
-  /// field initializers.
-  ///
-  /// See [CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR],
-  /// [CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR],
-  /// [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR],
-  /// [CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS],
-  /// [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR], and
-  /// [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR].
+  /// Check that the given constructor [declaration] has a valid redirected
+  /// constructor.
   void _checkForRedirectingConstructorErrorCodes(
       ConstructorDeclaration declaration) {
-    // Check for default values in the parameters
+    // Check for default values in the parameters.
     var redirectedConstructor = declaration.redirectedConstructor;
-    if (redirectedConstructor != null) {
-      for (FormalParameter parameter in declaration.parameters.parameters) {
-        if (parameter is DefaultFormalParameter &&
-            parameter.defaultValue != null) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode
-                  .DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
-              parameter.identifier!);
-        }
-      }
-      var redirectedElement = redirectedConstructor.staticElement;
-      _checkForRedirectToNonConstConstructor(
-        declaration.declaredElement!,
-        redirectedElement,
-        redirectedConstructor,
-      );
-      var redirectedClass = redirectedElement?.enclosingElement;
-      if (redirectedClass is ClassElement &&
-          redirectedClass.isAbstract &&
-          redirectedElement != null &&
-          !redirectedElement.isFactory) {
-        String enclosingNamedType = _enclosingClass!.displayName;
-        String constructorStrName = enclosingNamedType;
-        if (declaration.name != null) {
-          constructorStrName += ".${declaration.name!.name}";
-        }
+    if (redirectedConstructor == null) {
+      return;
+    }
+    for (FormalParameter parameter in declaration.parameters.parameters) {
+      if (parameter is DefaultFormalParameter &&
+          parameter.defaultValue != null) {
         errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR,
-            redirectedConstructor,
-            [constructorStrName, redirectedClass.name]);
+            CompileTimeErrorCode
+                .DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
+            parameter.identifier!);
       }
     }
-    // check if there are redirected invocations
-    int numRedirections = 0;
-    for (ConstructorInitializer initializer in declaration.initializers) {
-      if (initializer is RedirectingConstructorInvocation) {
-        if (numRedirections > 0) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
-              initializer);
-        }
-        if (declaration.factoryKeyword == null) {
-          RedirectingConstructorInvocation invocation = initializer;
-          var redirectingElement = invocation.staticElement;
-          if (redirectingElement == null) {
-            String enclosingNamedType = _enclosingClass!.displayName;
-            String constructorStrName = enclosingNamedType;
-            if (invocation.constructorName != null) {
-              constructorStrName += ".${invocation.constructorName!.name}";
-            }
-            errorReporter.reportErrorForNode(
-                CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
-                invocation,
-                [constructorStrName, enclosingNamedType]);
-          } else {
-            if (redirectingElement.isFactory) {
-              errorReporter.reportErrorForNode(
-                  CompileTimeErrorCode
-                      .REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR,
-                  initializer);
-            }
-          }
-        }
-        // [declaration] is a redirecting constructor via a redirecting
-        // initializer.
-        _checkForRedirectToNonConstConstructor(
-          declaration.declaredElement!,
-          initializer.staticElement,
-          initializer.constructorName ?? initializer.thisKeyword,
-        );
-        numRedirections++;
+    var redirectedElement = redirectedConstructor.staticElement;
+    _checkForRedirectToNonConstConstructor(
+      declaration.declaredElement!,
+      redirectedElement,
+      redirectedConstructor,
+    );
+    var redirectedClass = redirectedElement?.enclosingElement;
+    if (redirectedClass is ClassElement &&
+        redirectedClass.isAbstract &&
+        redirectedElement != null &&
+        !redirectedElement.isFactory) {
+      String enclosingNamedType = _enclosingClass!.displayName;
+      String constructorStrName = enclosingNamedType;
+      if (declaration.name != null) {
+        constructorStrName += ".${declaration.name!.name}";
       }
-    }
-    // check for other initializers
-    if (numRedirections > 0) {
-      for (ConstructorInitializer initializer in declaration.initializers) {
-        if (initializer is SuperConstructorInvocation) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
-              initializer);
-        }
-        if (initializer is ConstructorFieldInitializer) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
-              initializer);
-        }
-        if (initializer is AssertInitializer) {
-          errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.ASSERT_IN_REDIRECTING_CONSTRUCTOR,
-              initializer);
-        }
-      }
+      errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.REDIRECT_TO_ABSTRACT_CLASS_CONSTRUCTOR,
+          redirectedConstructor,
+          [constructorStrName, redirectedClass.name]);
     }
   }
 
@@ -4063,7 +4078,7 @@
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS,
           type,
-          [type.name]);
+          [type.name.toSource()]);
     }
   }
 
@@ -4144,6 +4159,15 @@
       return;
     }
 
+    // TODO(scheglov) Restore when working on errors.
+    if (_currentLibrary.featureSet.isEnabled(Feature.super_parameters)) {
+      if (constructor.parameters.parameters.any((parameter) {
+        return parameter.notDefault is SuperFormalParameter;
+      })) {
+        return;
+      }
+    }
+
     // Ignore if the constructor has either an implicit super constructor
     // invocation or a redirecting constructor invocation.
     for (ConstructorInitializer constructorInitializer
@@ -4750,12 +4774,27 @@
 
   void _checkUseOfCovariantInParameters(FormalParameterList node) {
     var parent = node.parent;
-    if (_enclosingClass != null &&
-        parent is MethodDeclaration &&
-        !parent.isStatic) {
+    if (_enclosingClass != null && parent is MethodDeclaration) {
+      // Either [parent] is a static method, in which case `EXTRANEOUS_MODIFIER`
+      // is reported by the parser, or [parent] is an instance method, in which
+      // case any use of `covariant` is legal.
       return;
     }
 
+    if (_enclosingExtension != null) {
+      // `INVALID_USE_OF_COVARIANT_IN_EXTENSION` is reported by the parser.
+      return;
+    }
+
+    if (parent is FunctionExpression) {
+      var parent2 = parent.parent;
+      if (parent2 is FunctionDeclaration && parent2.parent is CompilationUnit) {
+        // `EXTRANEOUS_MODIFIER` is reported by the parser, for library-level
+        // functions.
+        return;
+      }
+    }
+
     NodeList<FormalParameter> parameters = node.parameters;
     int length = parameters.length;
     for (int i = 0; i < length; i++) {
@@ -4765,14 +4804,10 @@
       }
       var keyword = parameter.covariantKeyword;
       if (keyword != null) {
-        if (_enclosingExtension != null) {
-          // Reported by the parser.
-        } else {
-          errorReporter.reportErrorForToken(
-            CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
-            keyword,
-          );
-        }
+        errorReporter.reportErrorForToken(
+          CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
+          keyword,
+        );
       }
     }
   }
@@ -4899,11 +4934,11 @@
   /// Return the name of the library that defines given [element].
   String _getLibraryName(Element? element) {
     if (element == null) {
-      return StringUtilities.EMPTY;
+      return '';
     }
     var library = element.library;
     if (library == null) {
-      return StringUtilities.EMPTY;
+      return '';
     }
     List<ImportElement> imports = _currentLibrary.imports;
     int count = imports.length;
@@ -4932,7 +4967,7 @@
       buffer.write(" (via ");
       if (indirectCount > 1) {
         indirectSources.sort();
-        buffer.write(StringUtilities.printListOfQuotedNames(indirectSources));
+        buffer.write(indirectSources.quotedAndCommaSeparatedWithAnd);
       } else {
         buffer.write(indirectSources[0]);
       }
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 4d6223c..53ec6ae 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -16,6 +16,9 @@
 /// used. See 'pkg/vm/lib/transformations/ffi_checks.md' for the specification
 /// of the desired hints.
 class FfiVerifier extends RecursiveAstVisitor<void> {
+  static const _abiSpecificIntegerClassName = 'AbiSpecificInteger';
+  static const _abiSpecificIntegerMappingClassName =
+      'AbiSpecificIntegerMapping';
   static const _allocatorClassName = 'Allocator';
   static const _allocateExtensionMethodName = 'call';
   static const _allocatorExtensionName = 'AllocatorAlloc';
@@ -25,7 +28,7 @@
   static const _opaqueClassName = 'Opaque';
   static const _ffiNativeName = 'FfiNative';
 
-  static const List<String> _primitiveIntegerNativeTypes = [
+  static const Set<String> _primitiveIntegerNativeTypesFixedSize = {
     'Int8',
     'Int16',
     'Int32',
@@ -34,13 +37,16 @@
     'Uint16',
     'Uint32',
     'Uint64',
+  };
+  static const Set<String> _primitiveIntegerNativeTypes = {
+    ..._primitiveIntegerNativeTypesFixedSize,
     'IntPtr'
-  ];
+  };
 
-  static const List<String> _primitiveDoubleNativeTypes = [
+  static const Set<String> _primitiveDoubleNativeTypes = {
     'Float',
     'Double',
-  ];
+  };
 
   static const _primitiveBoolNativeType = 'Bool';
 
@@ -85,14 +91,20 @@
           if (className == _structClassName) {
             _validatePackedAnnotation(node.metadata);
           }
+        } else if (className == _abiSpecificIntegerClassName) {
+          _validateAbiSpecificIntegerAnnotation(node);
+          _validateAbiSpecificIntegerMappingAnnotation(
+              node.name, node.metadata);
         } else if (className != _allocatorClassName &&
-            className != _opaqueClassName) {
+            className != _opaqueClassName &&
+            className != _abiSpecificIntegerClassName) {
           _errorReporter.reportErrorForNode(
               FfiCode.SUBTYPE_OF_FFI_CLASS_IN_EXTENDS,
               superclass.name,
               [node.name.name, superclass.name.name]);
         }
-      } else if (superclass.isCompoundSubtype) {
+      } else if (superclass.isCompoundSubtype ||
+          superclass.isAbiSpecificIntegerSubtype) {
         _errorReporter.reportErrorForNode(
             FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS,
             superclass,
@@ -108,11 +120,12 @@
         return;
       }
       if (typename.ffiClass != null) {
-        _errorReporter.reportErrorForNode(
-            subtypeOfFfiCode, typename, [node.name, typename.name]);
-      } else if (typename.isCompoundSubtype) {
-        _errorReporter.reportErrorForNode(
-            subtypeOfStructCode, typename, [node.name, typename.name]);
+        _errorReporter.reportErrorForNode(subtypeOfFfiCode, typename,
+            [node.name.name, typename.name.toSource()]);
+      } else if (typename.isCompoundSubtype ||
+          typename.isAbiSpecificIntegerSubtype) {
+        _errorReporter.reportErrorForNode(subtypeOfStructCode, typename,
+            [node.name.name, typename.name.toSource()]);
       }
     }
 
@@ -133,7 +146,7 @@
 
     if (inCompound && node.declaredElement!.typeParameters.isNotEmpty) {
       _errorReporter.reportErrorForNode(
-          FfiCode.GENERIC_STRUCT_SUBCLASS, node.name, [node.name]);
+          FfiCode.GENERIC_STRUCT_SUBCLASS, node.name, [node.name.name]);
     }
     super.visitClassDeclaration(node);
   }
@@ -452,6 +465,9 @@
     if (nativeType.isArray) {
       return true;
     }
+    if (nativeType.isAbiSpecificIntegerSubtype) {
+      return true;
+    }
     return false;
   }
 
@@ -523,6 +539,9 @@
       if (nativeType.isOpaqueSubtype) {
         return true;
       }
+      if (nativeType.isAbiSpecificIntegerSubtype) {
+        return true;
+      }
       if (allowArray && nativeType.isArray) {
         return _isValidFfiNativeType(nativeType.typeArguments.single,
             allowVoid: false, allowEmptyStruct: false);
@@ -591,10 +610,61 @@
       } else if (_primitiveBoolNativeType == name) {
         return _PrimitiveDartType.bool;
       }
+      if (element.type.returnType.isAbiSpecificIntegerSubtype) {
+        return _PrimitiveDartType.int;
+      }
     }
     return _PrimitiveDartType.none;
   }
 
+  void _validateAbiSpecificIntegerAnnotation(ClassDeclaration node) {
+    if ((node.typeParameters?.length ?? 0) != 0 ||
+        node.members.length != 1 ||
+        node.members.single is! ConstructorDeclaration ||
+        (node.members.single as ConstructorDeclaration).constKeyword == null) {
+      _errorReporter.reportErrorForNode(
+          FfiCode.ABI_SPECIFIC_INTEGER_INVALID, node.name);
+    }
+  }
+
+  /// Validate that the [annotations] include at most one mapping annotation.
+  void _validateAbiSpecificIntegerMappingAnnotation(
+      AstNode errorNode, NodeList<Annotation> annotations) {
+    final ffiPackedAnnotations = annotations
+        .where((annotation) => annotation.isAbiSpecificIntegerMapping)
+        .toList();
+
+    if (ffiPackedAnnotations.isEmpty) {
+      _errorReporter.reportErrorForNode(
+          FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING, errorNode);
+      return;
+    }
+
+    if (ffiPackedAnnotations.length > 1) {
+      final extraAnnotations = ffiPackedAnnotations.skip(1);
+      for (final annotation in extraAnnotations) {
+        _errorReporter.reportErrorForNode(
+            FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA, annotation.name);
+      }
+    }
+
+    final annotationConstant =
+        ffiPackedAnnotations.first.elementAnnotation?.computeConstantValue();
+    final mappingValues = annotationConstant?.getField('mapping')?.toMapValue();
+    if (mappingValues == null) {
+      return;
+    }
+    for (final nativeType in mappingValues.values) {
+      final nativeTypeName = nativeType?.type?.element?.name;
+      if (nativeTypeName != null &&
+          !_primitiveIntegerNativeTypesFixedSize.contains(nativeTypeName)) {
+        _errorReporter.reportErrorForNode(
+            FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED,
+            ffiPackedAnnotations.first.name);
+      }
+    }
+  }
+
   void _validateAllocate(FunctionExpressionInvocation node) {
     final typeArgumentTypes = node.typeArgumentTypes;
     if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
@@ -619,7 +689,9 @@
     bool requiredFound = false;
     List<Annotation> extraAnnotations = [];
     for (Annotation annotation in annotations) {
-      if (annotation.element.ffiClass != null) {
+      if (annotation.element.ffiClass != null ||
+          annotation.element?.enclosingElement.isAbiSpecificIntegerSubclass ==
+              true) {
         if (requiredFound) {
           extraAnnotations.add(annotation);
         } else {
@@ -744,7 +816,10 @@
   bool _validateCompatibleNativeType(
       DartType dartType, DartType nativeType, bool checkCovariance) {
     final nativeReturnType = _primitiveNativeType(nativeType);
-    if (nativeReturnType == _PrimitiveDartType.int) {
+    if (nativeReturnType == _PrimitiveDartType.int ||
+        (nativeType is InterfaceType &&
+            nativeType.superclass?.element.name ==
+                _abiSpecificIntegerClassName)) {
       return dartType.isDartCoreInt;
     } else if (nativeReturnType == _PrimitiveDartType.double) {
       return dartType.isDartCoreDouble;
@@ -1184,6 +1259,14 @@
 }
 
 extension on Annotation {
+  bool get isAbiSpecificIntegerMapping {
+    final element = this.element;
+    return element is ConstructorElement &&
+        element.ffiClass != null &&
+        element.enclosingElement.name ==
+            FfiVerifier._abiSpecificIntegerMappingClassName;
+  }
+
   bool get isArray {
     final element = this.element;
     return element is ConstructorElement &&
@@ -1200,22 +1283,6 @@
 }
 
 extension on ElementAnnotation {
-  bool get isArray {
-    final element = this.element;
-    return element is ConstructorElement &&
-        element.ffiClass != null &&
-        element.enclosingElement.name == 'Array';
-    // Note: this is 'Array' instead of '_ArraySize' because it finds the
-    // forwarding factory instead of the forwarded constructor.
-  }
-
-  bool get isPacked {
-    final element = this.element;
-    return element is ConstructorElement &&
-        element.ffiClass != null &&
-        element.enclosingElement.name == 'Packed';
-  }
-
   List<int> get arraySizeDimensions {
     assert(isArray);
     final value = computeConstantValue();
@@ -1251,6 +1318,22 @@
     return result;
   }
 
+  bool get isArray {
+    final element = this.element;
+    return element is ConstructorElement &&
+        element.ffiClass != null &&
+        element.enclosingElement.name == 'Array';
+    // Note: this is 'Array' instead of '_ArraySize' because it finds the
+    // forwarding factory instead of the forwarded constructor.
+  }
+
+  bool get isPacked {
+    final element = this.element;
+    return element is ConstructorElement &&
+        element.ffiClass != null &&
+        element.enclosingElement.name == 'Packed';
+  }
+
   int? get packedMemberAlignment {
     assert(isPacked);
     final value = computeConstantValue();
@@ -1259,6 +1342,33 @@
 }
 
 extension on Element? {
+  /// If this is a class element from `dart:ffi`, return it.
+  ClassElement? get ffiClass {
+    var element = this;
+    if (element is ConstructorElement) {
+      element = element.enclosingElement;
+    }
+    if (element is ClassElement && element.isFfiClass) {
+      return element;
+    }
+    return null;
+  }
+
+  /// Return `true` if this represents the class `AbiSpecificInteger`.
+  bool get isAbiSpecificInteger {
+    final element = this;
+    return element is ClassElement &&
+        element.name == FfiVerifier._abiSpecificIntegerClassName &&
+        element.isFfiClass;
+  }
+
+  /// Return `true` if this represents a subclass of the class
+  /// `AbiSpecificInteger`.
+  bool get isAbiSpecificIntegerSubclass {
+    final element = this;
+    return element is ClassElement && element.supertype.isAbiSpecificInteger;
+  }
+
   /// Return `true` if this represents the extension `AllocatorAlloc`.
   bool get isAllocatorExtension {
     final element = this;
@@ -1267,6 +1377,14 @@
         element.isFfiExtension;
   }
 
+  /// Return `true` if this represents the extension `DynamicLibraryExtension`.
+  bool get isDynamicLibraryExtension {
+    final element = this;
+    return element is ExtensionElement &&
+        element.name == 'DynamicLibraryExtension' &&
+        element.isFfiExtension;
+  }
+
   bool get isNativeFunctionPointerExtension {
     final element = this;
     return element is ExtensionElement &&
@@ -1288,14 +1406,6 @@
         element.isFfiExtension;
   }
 
-  /// Return `true` if this represents the extension `DynamicLibraryExtension`.
-  bool get isDynamicLibraryExtension {
-    final element = this;
-    return element is ExtensionElement &&
-        element.name == 'DynamicLibraryExtension' &&
-        element.isFfiExtension;
-  }
-
   /// Return `true` if this represents the class `Pointer`.
   bool get isPointer {
     final element = this;
@@ -1331,18 +1441,6 @@
     final element = this;
     return element is ClassElement && element.supertype.isUnion;
   }
-
-  /// If this is a class element from `dart:ffi`, return it.
-  ClassElement? get ffiClass {
-    var element = this;
-    if (element is ConstructorElement) {
-      element = element.enclosingElement;
-    }
-    if (element is ClassElement && element.isFfiClass) {
-      return element;
-    }
-    return null;
-  }
 }
 
 extension on ClassElement {
@@ -1389,6 +1487,11 @@
 }
 
 extension on DartType? {
+  bool get isAbiSpecificInteger {
+    final self = this;
+    return self is InterfaceType && self.element.isAbiSpecificInteger;
+  }
+
   bool get isStruct {
     final self = this;
     return self is InterfaceType && self.element.isStruct;
@@ -1401,16 +1504,6 @@
 }
 
 extension on DartType {
-  /// Return `true` if this represents the class `Array`.
-  bool get isArray {
-    final self = this;
-    if (self is InterfaceType) {
-      final element = self.element;
-      return element.name == FfiVerifier._arrayClassName && element.isFfiClass;
-    }
-    return false;
-  }
-
   int get arrayDimensions {
     DartType iterator = this;
     int dimensions = 0;
@@ -1433,9 +1526,65 @@
     return iterator;
   }
 
-  bool get isPointer {
+  bool get isAbiSpecificInteger {
     final self = this;
-    return self is InterfaceType && self.element.isPointer;
+    if (self is InterfaceType) {
+      final element = self.element;
+      final name = element.name;
+      return name == FfiVerifier._abiSpecificIntegerClassName &&
+          element.isFfiClass;
+    }
+    return false;
+  }
+
+  /// Returns `true` iff this is an Abi-specific integer type,
+  /// i.e. a subtype of `AbiSpecificInteger`.
+  bool get isAbiSpecificIntegerSubtype {
+    final self = this;
+    if (self is InterfaceType) {
+      final superType = self.element.supertype;
+      if (superType != null) {
+        final superClassElement = superType.element;
+        return superClassElement.name ==
+                FfiVerifier._abiSpecificIntegerClassName &&
+            superClassElement.isFfiClass;
+      }
+    }
+    return false;
+  }
+
+  /// Return `true` if this represents the class `Array`.
+  bool get isArray {
+    final self = this;
+    if (self is InterfaceType) {
+      final element = self.element;
+      return element.name == FfiVerifier._arrayClassName && element.isFfiClass;
+    }
+    return false;
+  }
+
+  bool get isCompound {
+    final self = this;
+    if (self is InterfaceType) {
+      final element = self.element;
+      final name = element.name;
+      return (name == FfiVerifier._structClassName ||
+              name == FfiVerifier._unionClassName) &&
+          element.isFfiClass;
+    }
+    return false;
+  }
+
+  /// Returns `true` if this is a struct type, i.e. a subtype of `Struct`.
+  bool get isCompoundSubtype {
+    final self = this;
+    if (self is InterfaceType) {
+      final superType = self.element.supertype;
+      if (superType != null) {
+        return superType.isCompound;
+      }
+    }
+    return false;
   }
 
   bool get isHandle {
@@ -1481,28 +1630,9 @@
     return false;
   }
 
-  bool get isCompound {
+  bool get isPointer {
     final self = this;
-    if (self is InterfaceType) {
-      final element = self.element;
-      final name = element.name;
-      return (name == FfiVerifier._structClassName ||
-              name == FfiVerifier._unionClassName) &&
-          element.isFfiClass;
-    }
-    return false;
-  }
-
-  /// Returns `true` if this is a struct type, i.e. a subtype of `Struct`.
-  bool get isCompoundSubtype {
-    final self = this;
-    if (self is InterfaceType) {
-      final superType = self.element.supertype;
-      if (superType != null) {
-        return superType.isCompound;
-      }
-    }
-    return false;
+    return self is InterfaceType && self.element.isPointer;
   }
 }
 
@@ -1513,16 +1643,19 @@
   }
 
   /// Return `true` if this represents a subtype of `Struct` or `Union`.
+  bool get isAbiSpecificIntegerSubtype {
+    var element = name.staticElement;
+    if (element is ClassElement) {
+      return element.allSupertypes.any((e) => e.isAbiSpecificInteger);
+    }
+    return false;
+  }
+
+  /// Return `true` if this represents a subtype of `Struct` or `Union`.
   bool get isCompoundSubtype {
     var element = name.staticElement;
     if (element is ClassElement) {
-      bool isCompound(InterfaceType? type) {
-        return type != null && type.isCompound;
-      }
-
-      return isCompound(element.supertype) ||
-          element.interfaces.any(isCompound) ||
-          element.mixins.any(isCompound);
+      return element.allSupertypes.any((e) => e.isCompound);
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/generated/java_engine.dart b/pkg/analyzer/lib/src/generated/java_engine.dart
deleted file mode 100644
index 82c2f23..0000000
--- a/pkg/analyzer/lib/src/generated/java_engine.dart
+++ /dev/null
@@ -1,264 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/generated/interner.dart';
-import 'package:analyzer/src/generated/java_core.dart';
-
-export 'package:analyzer/exception/exception.dart';
-
-/// A predicate is a one-argument function that returns a boolean value.
-typedef Predicate<E> = bool Function(E argument);
-
-class StringUtilities {
-  static const String EMPTY = '';
-  static const List<String> EMPTY_ARRAY = <String>[];
-
-  static Interner INTERNER = NullInterner();
-
-  /// Compute line starts for the given [content].
-  /// Lines end with `\r`, `\n` or `\r\n`.
-  static List<int> computeLineStarts(String content) {
-    List<int> lineStarts = <int>[0];
-    int length = content.length;
-    int unit;
-    for (int index = 0; index < length; index++) {
-      unit = content.codeUnitAt(index);
-      // Special-case \r\n.
-      if (unit == 0x0D /* \r */) {
-        // Peek ahead to detect a following \n.
-        if ((index + 1 < length) && content.codeUnitAt(index + 1) == 0x0A) {
-          // Line start will get registered at next index at the \n.
-        } else {
-          lineStarts.add(index + 1);
-        }
-      }
-      // \n
-      if (unit == 0x0A) {
-        lineStarts.add(index + 1);
-      }
-    }
-    return lineStarts;
-  }
-
-  static bool endsWith3(String str, int c1, int c2, int c3) {
-    var length = str.length;
-    return length >= 3 &&
-        str.codeUnitAt(length - 3) == c1 &&
-        str.codeUnitAt(length - 2) == c2 &&
-        str.codeUnitAt(length - 1) == c3;
-  }
-
-  static bool endsWithChar(String str, int c) {
-    int length = str.length;
-    return length > 0 && str.codeUnitAt(length - 1) == c;
-  }
-
-  static int indexOf1(String str, int start, int c) {
-    int index = start;
-    int last = str.length;
-    while (index < last) {
-      if (str.codeUnitAt(index) == c) {
-        return index;
-      }
-      index++;
-    }
-    return -1;
-  }
-
-  static int indexOf2(String str, int start, int c1, int c2) {
-    int index = start;
-    int last = str.length - 1;
-    while (index < last) {
-      if (str.codeUnitAt(index) == c1 && str.codeUnitAt(index + 1) == c2) {
-        return index;
-      }
-      index++;
-    }
-    return -1;
-  }
-
-  static int indexOf4(
-      String string, int start, int c1, int c2, int c3, int c4) {
-    int index = start;
-    int last = string.length - 3;
-    while (index < last) {
-      if (string.codeUnitAt(index) == c1 &&
-          string.codeUnitAt(index + 1) == c2 &&
-          string.codeUnitAt(index + 2) == c3 &&
-          string.codeUnitAt(index + 3) == c4) {
-        return index;
-      }
-      index++;
-    }
-    return -1;
-  }
-
-  static int indexOf5(
-      String str, int start, int c1, int c2, int c3, int c4, int c5) {
-    int index = start;
-    int last = str.length - 4;
-    while (index < last) {
-      if (str.codeUnitAt(index) == c1 &&
-          str.codeUnitAt(index + 1) == c2 &&
-          str.codeUnitAt(index + 2) == c3 &&
-          str.codeUnitAt(index + 3) == c4 &&
-          str.codeUnitAt(index + 4) == c5) {
-        return index;
-      }
-      index++;
-    }
-    return -1;
-  }
-
-  /// Return the index of the first not letter/digit character in the [string]
-  /// that is at or after the [startIndex]. Return the length of the [string] if
-  /// all characters to the end are letters/digits.
-  static int indexOfFirstNotLetterDigit(String string, int startIndex) {
-    int index = startIndex;
-    int last = string.length;
-    while (index < last) {
-      int c = string.codeUnitAt(index);
-      if (!Character.isLetterOrDigit(c)) {
-        return index;
-      }
-      index++;
-    }
-    return last;
-  }
-
-  static String intern(String string) => INTERNER.intern(string);
-  static bool isEmpty(String? s) {
-    return s == null || s.isEmpty;
-  }
-
-  static bool isTagName(String? s) {
-    if (s == null || s.isEmpty) {
-      return false;
-    }
-    int sz = s.length;
-    for (int i = 0; i < sz; i++) {
-      int c = s.codeUnitAt(i);
-      if (!Character.isLetter(c)) {
-        if (i == 0) {
-          return false;
-        }
-        if (!Character.isDigit(c) && c != 0x2D) {
-          return false;
-        }
-      }
-    }
-    return true;
-  }
-
-  /// Produce a string containing all of the names in the given array,
-  /// surrounded by single quotes, and separated by commas.
-  ///
-  /// The list must contain at least two elements.
-  ///
-  /// @param names the names to be printed
-  /// @return the result of printing the names
-  static String printListOfQuotedNames(List<String>? names) {
-    if (names == null) {
-      throw ArgumentError("The list must not be null");
-    }
-    int count = names.length;
-    if (count < 2) {
-      throw ArgumentError("The list must contain at least two names");
-    }
-    StringBuffer buffer = StringBuffer();
-    buffer.write("'");
-    buffer.write(names[0]);
-    buffer.write("'");
-    for (int i = 1; i < count - 1; i++) {
-      buffer.write(", '");
-      buffer.write(names[i]);
-      buffer.write("'");
-    }
-    buffer.write(" and '");
-    buffer.write(names[count - 1]);
-    buffer.write("'");
-    return buffer.toString();
-  }
-
-  static bool startsWith2(String str, int start, int c1, int c2) {
-    return str.length - start >= 2 &&
-        str.codeUnitAt(start) == c1 &&
-        str.codeUnitAt(start + 1) == c2;
-  }
-
-  static bool startsWith3(String str, int start, int c1, int c2, int c3) {
-    return str.length - start >= 3 &&
-        str.codeUnitAt(start) == c1 &&
-        str.codeUnitAt(start + 1) == c2 &&
-        str.codeUnitAt(start + 2) == c3;
-  }
-
-  static bool startsWith4(
-      String str, int start, int c1, int c2, int c3, int c4) {
-    return str.length - start >= 4 &&
-        str.codeUnitAt(start) == c1 &&
-        str.codeUnitAt(start + 1) == c2 &&
-        str.codeUnitAt(start + 2) == c3 &&
-        str.codeUnitAt(start + 3) == c4;
-  }
-
-  static bool startsWith5(
-      String str, int start, int c1, int c2, int c3, int c4, int c5) {
-    return str.length - start >= 5 &&
-        str.codeUnitAt(start) == c1 &&
-        str.codeUnitAt(start + 1) == c2 &&
-        str.codeUnitAt(start + 2) == c3 &&
-        str.codeUnitAt(start + 3) == c4 &&
-        str.codeUnitAt(start + 4) == c5;
-  }
-
-  static bool startsWith6(
-      String str, int start, int c1, int c2, int c3, int c4, int c5, int c6) {
-    return str.length - start >= 6 &&
-        str.codeUnitAt(start) == c1 &&
-        str.codeUnitAt(start + 1) == c2 &&
-        str.codeUnitAt(start + 2) == c3 &&
-        str.codeUnitAt(start + 3) == c4 &&
-        str.codeUnitAt(start + 4) == c5 &&
-        str.codeUnitAt(start + 5) == c6;
-  }
-
-  static String? substringBefore(String? str, String? separator) {
-    if (str == null || str.isEmpty) {
-      return str;
-    }
-    if (separator == null) {
-      return str;
-    }
-    int pos = str.indexOf(separator);
-    if (pos < 0) {
-      return str;
-    }
-    return str.substring(0, pos);
-  }
-
-  static String substringBeforeChar(String str, int c) {
-    if (isEmpty(str)) {
-      return str;
-    }
-    int pos = indexOf1(str, 0, c);
-    if (pos < 0) {
-      return str;
-    }
-    return str.substring(0, pos);
-  }
-}
-
-class UUID {
-  static const int __nextId = 0;
-
-  final String id;
-
-  UUID(this.id);
-
-  @override
-  String toString() => id;
-
-  static UUID randomUUID() => UUID((__nextId).toString());
-}
diff --git a/pkg/analyzer/lib/src/generated/java_engine_io.dart b/pkg/analyzer/lib/src/generated/java_engine_io.dart
index 5ee3c34..96e9e51 100644
--- a/pkg/analyzer/lib/src/generated/java_engine_io.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine_io.dart
@@ -4,14 +4,6 @@
 
 import "dart:io";
 
-import "package:analyzer/src/generated/java_io.dart";
-
-class FileUtilities2 {
-  static JavaFile createFile(String path) {
-    return JavaFile(path).getAbsoluteFile();
-  }
-}
-
 class OSUtilities {
   static String LINE_SEPARATOR = isWindows() ? '\r\n' : '\n';
   static bool isMac() => Platform.operatingSystem == 'macos';
diff --git a/pkg/analyzer/lib/src/generated/java_io.dart b/pkg/analyzer/lib/src/generated/java_io.dart
index 3ab4863..4751bc4 100644
--- a/pkg/analyzer/lib/src/generated/java_io.dart
+++ b/pkg/analyzer/lib/src/generated/java_io.dart
@@ -6,6 +6,7 @@
 
 import 'package:path/path.dart' as path;
 
+@Deprecated('Use ResourceProvider and path context instead.')
 class JavaFile {
   @deprecated
   static path.Context pathContext = path.context;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 5f87d47..ddcbc07 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -472,7 +472,6 @@
   }
 
   void checkForBodyMayCompleteNormally({
-    required DartType? returnType,
     required FunctionBody body,
     required AstNode errorNode,
   }) {
@@ -481,6 +480,12 @@
       return;
     }
 
+    // TODO(scheglov) encapsulate
+    var bodyContext = BodyInferenceContext.of(body);
+    if (bodyContext == null) {
+      return null;
+    }
+    var returnType = bodyContext.contextType;
     if (returnType == null) {
       return;
     }
@@ -490,24 +495,59 @@
         return;
       }
 
-      if (typeSystem.isPotentiallyNonNullable(returnType)) {
-        if (errorNode is ConstructorDeclaration) {
-          errorReporter.reportErrorForName(
-            CompileTimeErrorCode.BODY_MIGHT_COMPLETE_NORMALLY,
-            errorNode,
-          );
-        } else if (errorNode is BlockFunctionBody) {
-          errorReporter.reportErrorForToken(
-            CompileTimeErrorCode.BODY_MIGHT_COMPLETE_NORMALLY,
-            errorNode.block.leftBracket,
-          );
-        } else {
-          errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.BODY_MIGHT_COMPLETE_NORMALLY,
-            errorNode,
-          );
+      if (body.isAsynchronous) {
+        // Check whether the return type is legal. If not, return rather than
+        // reporting a second error.
+
+        // This is the same check as [ReturnTypeVerifier._isLegalReturnType].
+        // TODO(srawlins): When this check is moved into the resolution stage,
+        // use the result of that check to determine whether this check should
+        // be done.
+        var lowerBound = typeProvider.futureElement.instantiate(
+          typeArguments: [NeverTypeImpl.instance],
+          nullabilitySuffix: NullabilitySuffix.star,
+        );
+        var imposedType = bodyContext.imposedType;
+        if (imposedType != null &&
+            !typeSystem.isSubtypeOf(lowerBound, imposedType)) {
+          // [imposedType] is an illegal return type for an asynchronous
+          // non-generator function; do not report an additional error here.
+          return;
         }
       }
+
+      ErrorCode errorCode;
+      if (typeSystem.isPotentiallyNonNullable(returnType)) {
+        errorCode = CompileTimeErrorCode.BODY_MIGHT_COMPLETE_NORMALLY;
+      } else {
+        var returnTypeBase = typeSystem.futureOrBase(returnType);
+        if (returnTypeBase.isVoid ||
+            returnTypeBase.isDynamic ||
+            returnTypeBase.isDartCoreNull) {
+          return;
+        } else {
+          errorCode = HintCode.BODY_MIGHT_COMPLETE_NORMALLY_NULLABLE;
+        }
+      }
+      if (errorNode is ConstructorDeclaration) {
+        errorReporter.reportErrorForName(
+          errorCode,
+          errorNode,
+          arguments: [returnType],
+        );
+      } else if (errorNode is BlockFunctionBody) {
+        errorReporter.reportErrorForToken(
+          errorCode,
+          errorNode.block.leftBracket,
+          [returnType],
+        );
+      } else {
+        errorReporter.reportErrorForNode(
+          errorCode,
+          errorNode,
+          [returnType],
+        );
+      }
     }
   }
 
@@ -800,8 +840,10 @@
 
     if (parent is CompilationUnit) {
       return node is ClassDeclaration ||
+          node is Directive ||
           node is ExtensionDeclaration ||
-          node is FunctionDeclaration;
+          node is FunctionDeclaration ||
+          node is TopLevelVariableDeclaration;
     }
 
     void forClassElement(ClassElement parentElement) {
@@ -813,6 +855,11 @@
       return true;
     }
 
+    if (parent is ExtensionDeclaration) {
+      enclosingExtension = parent.declaredElement!;
+      return true;
+    }
+
     if (parent is MixinDeclaration) {
       forClassElement(parent.declaredElement!);
       return true;
@@ -1038,20 +1085,16 @@
     var callerType = InferenceContext.getContext(node);
     NodeList<Expression> arguments = node.arguments;
     if (callerType is FunctionType) {
-      Map<String, DartType> namedParameterTypes =
-          callerType.namedParameterTypes;
-      List<DartType> normalParameterTypes = callerType.normalParameterTypes;
-      List<DartType> optionalParameterTypes = callerType.optionalParameterTypes;
-      int normalCount = normalParameterTypes.length;
-      int optionalCount = optionalParameterTypes.length;
+      var parameters = callerType.parameters;
 
-      Iterable<Expression> positional =
-          arguments.takeWhile((l) => l is! NamedExpression);
-      Iterable<Expression> required = positional.take(normalCount);
-      Iterable<Expression> optional =
-          positional.skip(normalCount).take(optionalCount);
-      Iterable<Expression> named =
-          arguments.skipWhile((l) => l is! NamedExpression);
+      var namedParameters = <String, ParameterElement>{};
+      for (var i = 0; i < parameters.length; i++) {
+        var parameter = parameters[i];
+        if (parameter.isNamed) {
+          namedParameters[parameter.name] = parameter;
+        }
+      }
+
       var parent = node.parent;
       DartType? targetType;
       Element? methodElement;
@@ -1065,28 +1108,29 @@
       //TODO(leafp): Consider using the parameter elements here instead.
       //TODO(leafp): Make sure that the parameter elements are getting
       // setup correctly with inference.
-      int index = 0;
-      for (Expression argument in required) {
-        var parameterType = normalParameterTypes[index++];
-        if (targetType != null) {
-          InferenceContext.setType(
-              argument,
-              typeSystem.refineNumericInvocationContext(
-                  targetType, methodElement, invocationContext, parameterType));
-        } else {
-          InferenceContext.setType(argument, parameterType);
-        }
-      }
-      index = 0;
-      for (Expression argument in optional) {
-        InferenceContext.setType(argument, optionalParameterTypes[index++]);
-      }
-
-      for (Expression argument in named) {
+      var positionalParameterIndex = 0;
+      for (var i = 0; i < arguments.length; i++) {
+        var argument = arguments[i];
+        ParameterElement? parameter;
         if (argument is NamedExpression) {
-          var type = namedParameterTypes[argument.name.label.name];
-          if (type != null) {
-            InferenceContext.setType(argument, type);
+          parameter = namedParameters[argument.name.label.name];
+        } else {
+          while (positionalParameterIndex < parameters.length) {
+            parameter = parameters[positionalParameterIndex++];
+            if (!parameter.isNamed) {
+              break;
+            }
+          }
+        }
+        if (parameter != null) {
+          var parameterType = parameter.type;
+          if (targetType != null) {
+            InferenceContext.setType(
+                argument,
+                typeSystem.refineNumericInvocationContext(targetType,
+                    methodElement, invocationContext, parameterType));
+          } else {
+            InferenceContext.setType(argument, parameterType);
           }
         }
       }
@@ -1249,7 +1293,7 @@
   @override
   void visitCommentReference(CommentReference node) {
     //
-    // We do not visit the identifier because it needs to be visited in the
+    // We do not visit the expression because it needs to be visited in the
     // context of the reference.
     //
     node.accept(elementResolver);
@@ -1338,9 +1382,7 @@
     }
 
     if (node.factoryKeyword != null) {
-      var bodyContext = BodyInferenceContext.of(node.body);
       checkForBodyMayCompleteNormally(
-        returnType: bodyContext?.contextType,
         body: node.body,
         errorNode: node,
       );
@@ -1569,12 +1611,7 @@
     }
 
     if (!node.isSetter) {
-      // TODO(scheglov) encapsulate
-      var bodyContext = BodyInferenceContext.of(
-        node.functionExpression.body,
-      );
       checkForBodyMayCompleteNormally(
-        returnType: bodyContext?.contextType,
         body: node.functionExpression.body,
         errorNode: node.name,
       );
@@ -1800,10 +1837,7 @@
     }
 
     if (!node.isSetter) {
-      // TODO(scheglov) encapsulate
-      var bodyContext = BodyInferenceContext.of(node.body);
       checkForBodyMayCompleteNormally(
-        returnType: bodyContext?.contextType,
         body: node.body,
         errorNode: node.name,
       );
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 1fd1ec8..265ce79 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -59,6 +59,10 @@
   /// Return the source representing the library with the given 'dart:' [uri],
   /// or `null` if the given URI does not denote a library in this SDK.
   Source? mapDartUri(String uri);
+
+  /// Return the `dart` URI representing the given [path] if the file is in
+  /// this SDK, or `null` if the file is not in this SDK.
+  Uri? pathToUri(String path);
 }
 
 /// Manages the DartSdk's that have been created. Clients need to create
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index f134a33..ed375ff 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -6,16 +6,11 @@
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
-import 'package:analyzer/src/task/api/model.dart';
 import 'package:path/path.dart' as pathos;
 
 export 'package:analyzer/source/line_info.dart' show LineInfo;
 export 'package:analyzer/source/source_range.dart';
 
-/// A function that is used to visit [ContentCache] entries.
-typedef ContentCacheVisitor = void Function(
-    String fullPath, int stamp, String contents);
-
 /// Base class providing implementations for the methods in [Source] that don't
 /// require filesystem access.
 abstract class BasicSource extends Source {
@@ -24,6 +19,7 @@
 
   BasicSource(this.uri);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => uri.toString();
 
@@ -33,6 +29,7 @@
   @override
   int get hashCode => uri.hashCode;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => uri.scheme == 'dart';
 
@@ -61,6 +58,11 @@
   DartSdk get dartSdk => _sdk;
 
   @override
+  Uri? pathToUri(String path) {
+    return _sdk.pathToUri(path);
+  }
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     if (!isDartUri(uri)) {
       return null;
@@ -68,12 +70,6 @@
     return _sdk.mapDartUri(uri.toString());
   }
 
-  @override
-  Uri? restoreAbsolute(Source source) {
-    var dartSource = _sdk.fromFileUri(source.uri);
-    return dartSource?.uri;
-  }
-
   /// Return `true` if the given URI is a `dart:` URI.
   ///
   /// @param uri the URI being tested
@@ -84,7 +80,9 @@
 /// An implementation of an non-existing [Source].
 class NonExistingSource extends Source {
   static final unknown = NonExistingSource(
-      '/unknown.dart', pathos.toUri('/unknown.dart'), UriKind.FILE_URI);
+    '/unknown.dart',
+    pathos.toUri('/unknown.dart'),
+  );
 
   @override
   final String fullName;
@@ -92,35 +90,41 @@
   @override
   final Uri uri;
 
-  @override
-  final UriKind uriKind;
-
-  NonExistingSource(this.fullName, this.uri, this.uriKind);
+  NonExistingSource(this.fullName, this.uri);
 
   @override
   TimestampedData<String> get contents {
     throw UnsupportedError('$fullName does not exist.');
   }
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => uri.toString();
 
   @override
   int get hashCode => fullName.hashCode;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => false;
 
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp => -1;
 
   @override
   String get shortName => pathos.basename(fullName);
 
+  @Deprecated('Use Source.uri instead')
+  @override
+  UriKind get uriKind {
+    return UriKind.FILE_URI;
+  }
+
   @override
   bool operator ==(Object other) {
     if (other is NonExistingSource) {
-      return other.uriKind == uriKind && other.fullName == fullName;
+      return other.uri == uri && other.fullName == fullName;
     }
     return false;
   }
@@ -154,7 +158,7 @@
 /// represent non-existent files must also be retained so that if those files
 /// are created at a later date the long-lived sources representing those files
 /// will know that they now exist.
-abstract class Source implements AnalysisTarget {
+abstract class Source {
   /// Get the contents and timestamp of this source.
   ///
   /// Clients should consider using the method [AnalysisContext.getContents]
@@ -170,7 +174,7 @@
   ///
   /// @return an encoded representation of this source
   /// See [SourceFactory.fromEncoding].
-  @deprecated
+  @Deprecated('Not used anymore')
   String get encoding;
 
   /// Return the full (long) version of the name that can be displayed to the
@@ -190,11 +194,9 @@
   /// Return `true` if this source is in one of the system libraries.
   ///
   /// @return `true` if this is in a system library
+  @Deprecated('Use uri.isScheme("dart") instead')
   bool get isInSystemLibrary;
 
-  @override
-  Source get librarySource => throw UnimplementedError();
-
   /// Return the modification stamp for this source, or a negative value if the
   /// source does not exist. A modification stamp is a non-negative integer with
   /// the property that if the contents of the source have not been modified
@@ -206,6 +208,7 @@
   /// Clients should consider using the method
   /// [AnalysisContext.getModificationStamp] because contexts can have local
   /// overrides of the content of a source that the source is not aware of.
+  @Deprecated('Not used anymore')
   int get modificationStamp;
 
   /// Return a short version of the name that can be displayed to the user to
@@ -215,9 +218,6 @@
   /// @return a name that can be displayed to the user to denote this source
   String get shortName;
 
-  @override
-  Source get source => this;
-
   /// Return the URI from which this source was originally derived.
   ///
   /// @return the URI from which this source was originally derived
@@ -230,6 +230,7 @@
   /// against which the relative URI was resolved.
   ///
   /// @return the kind of URI from which this source was originally derived
+  @Deprecated('Use Source.uri instead')
   UriKind get uriKind;
 
   /// Return `true` if the given object is a source that represents the same
@@ -271,10 +272,6 @@
   /// the package (or [null] if there is no registered package URI resolver).
   Map<String, List<Folder>>? get packageMap;
 
-  /// Clear any cached URI resolution information in the [SourceFactory] itself,
-  /// and also ask each [UriResolver]s to clear its caches.
-  void clearCache();
-
   /// Return a source object representing the given absolute URI, or `null` if
   /// the URI is not a valid URI or if it is not an absolute URI.
   ///
@@ -289,6 +286,13 @@
   /// @return a source object representing the absolute URI
   Source? forUri2(Uri absoluteUri);
 
+  /// Return the URI that should be used to reference the file at the absolute
+  /// [path], or `null` if there is no valid way to reference the file.
+  /// The file at that path is not required to exist.
+  ///
+  /// Throws an [ArgumentError] if the [path] is not a valid path.
+  Uri? pathToUri(String path);
+
   /// Return a source representing the URI that results from resolving the given
   /// (possibly relative) [containedUri] against the URI associated with the
   /// [containingSource], whether or not the resulting source exists, or `null`
@@ -301,6 +305,7 @@
   ///
   /// @param source the source to get URI for
   /// @return the absolute URI representing the given source
+  @Deprecated('Use pathToUri() instead')
   Uri? restoreUri(Source source);
 }
 
@@ -348,6 +353,7 @@
 /// The enumeration `UriKind` defines the different kinds of URI's that are
 /// known to the analysis engine. These are used to keep track of the kind of
 /// URI associated with a given source.
+@Deprecated('Use Source.uri instead')
 class UriKind implements Comparable<UriKind> {
   /// A 'dart:' URI.
   static const UriKind DART_URI = UriKind('DART_URI', 0, 0x64);
@@ -413,15 +419,14 @@
 /// The abstract class `UriResolver` defines the behavior of objects that are
 /// used to resolve URI's for a source factory. Subclasses of this class are
 /// expected to resolve a single scheme of absolute URI.
-///
-/// NOTICE: in a future breaking change release of the analyzer, a method
-/// `void clearCache()` will be added.  Clients that implement, but do not
-/// extend, this class, can prepare for the breaking change by adding an
-/// implementation of this method that clears any cached URI resolution
-/// information.
 abstract class UriResolver {
-  /// Clear any cached URI resolution information.
-  void clearCache() {}
+  /// Return the absolute URI that should be used to reference the file at the
+  /// absolute [path], or `null` if this resolver cannot reference this file.
+  /// The file at that path is not required to exist.
+  ///
+  /// Throws an [ArgumentError] if the [path] is not a valid path.
+  /// ignore: deprecated_member_use_from_same_package
+  Uri? pathToUri(String path) => restoreAbsolute(_FakeSource(path));
 
   /// Resolve the given absolute [uri]. Return a [Source] representing the file
   /// to which it was resolved, whether or not the resulting source exists, or
@@ -432,5 +437,21 @@
   /// valid URI cannot be computed.
   ///
   /// The computation should be based solely on [source.fullName].
-  Uri? restoreAbsolute(Source source) => null;
+  @Deprecated('Use pathToUri() instead')
+  Uri? restoreAbsolute(Source source) {
+    return pathToUri(source.fullName);
+  }
+}
+
+class _FakeSource implements Source {
+  @override
+  final String fullName;
+
+  _FakeSource(this.fullName);
+
+  @override
+  Uri get uri => pathos.toUri(fullName);
+
+  @override
+  dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 906a677..1eb71fb 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -2,112 +2,5 @@
 // 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:collection';
-
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/source.dart';
-
+@Deprecated('Import source.dart instead')
 export 'package:analyzer/src/generated/source.dart';
-
-/// Instances of the class `FileBasedSource` implement a source that represents
-/// a file.
-class FileBasedSource extends Source {
-  /// Map from encoded URI/filepath pair to a unique integer identifier.  This
-  /// identifier is used for equality tests and hash codes.
-  ///
-  /// The URI and filepath are joined into a pair by separating them with an '@'
-  /// character.
-  static final Map<String, int> _idTable = HashMap<String, int>();
-
-  /// The URI from which this source was originally derived.
-  @override
-  final Uri uri;
-
-  /// The unique ID associated with this [FileBasedSource].
-  final int id;
-
-  /// The file represented by this source.
-  final JavaFile file;
-
-  /// The cached absolute path of this source.
-  String? _absolutePath;
-
-  /// The cached encoding for this source.
-  String? _encoding;
-
-  /// Initialize a newly created source object to represent the given [file]. If
-  /// a [uri] is given, then it will be used as the URI from which the source
-  /// was derived, otherwise a `file:` URI will be created based on the [file].
-  FileBasedSource(JavaFile file, [Uri? uri])
-      : uri = uri ?? file.toURI(),
-        file = file,
-        id = _idTable.putIfAbsent(
-            '${uri ?? file.toURI()}@${file.getPath()}', () => _idTable.length);
-
-  @override
-  TimestampedData<String> get contents {
-    return contentsFromFile;
-  }
-
-  /// Get the contents and timestamp of the underlying file.
-  ///
-  /// Clients should consider using the method [AnalysisContext.getContents]
-  /// because contexts can have local overrides of the content of a source that
-  /// the source is not aware of.
-  ///
-  /// @return the contents of the source paired with the modification stamp of
-  /// the source
-  /// @throws Exception if the contents of this source could not be accessed
-  /// See [contents].
-  TimestampedData<String> get contentsFromFile {
-    return TimestampedData<String>(
-        file.lastModified(), file.readAsStringSync());
-  }
-
-  @override
-  String get encoding {
-    return _encoding ??= uri.toString();
-  }
-
-  @override
-  String get fullName {
-    return _absolutePath ??= file.getAbsolutePath();
-  }
-
-  @override
-  int get hashCode => uri.hashCode;
-
-  @override
-  bool get isInSystemLibrary => uri.scheme == DartUriResolver.DART_SCHEME;
-
-  @override
-  int get modificationStamp => file.lastModified();
-
-  @override
-  String get shortName => file.getName();
-
-  @override
-  UriKind get uriKind {
-    String scheme = uri.scheme;
-    return UriKind.fromScheme(scheme);
-  }
-
-  @override
-  bool operator ==(Object object) {
-    if (object is FileBasedSource) {
-      return id == object.id;
-    } else if (object is Source) {
-      return uri == object.uri;
-    }
-    return false;
-  }
-
-  @override
-  bool exists() => file.isFile();
-
-  @override
-  String toString() {
-    return file.getAbsolutePath();
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/super_context.dart b/pkg/analyzer/lib/src/generated/super_context.dart
index 8902ebb..7068c16 100644
--- a/pkg/analyzer/lib/src/generated/super_context.dart
+++ b/pkg/analyzer/lib/src/generated/super_context.dart
@@ -37,7 +37,7 @@
         return node.factoryKeyword == null
             ? SuperContext.valid
             : SuperContext.static;
-      } else if (node is ConstructorFieldInitializer) {
+      } else if (node is ConstructorInitializer) {
         return SuperContext.static;
       } else if (node is FieldDeclaration) {
         return node.staticKeyword == null && node.fields.lateKeyword != null
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index d722db43..9fb88ca 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -240,13 +240,15 @@
           ExtendsClause? extendsClause,
           WithClause? withClause,
           ImplementsClause? implementsClause,
-          [List<ClassMember> members = const []]) =>
+          {List<ClassMember> members = const [],
+          bool isMacro = false}) =>
       astFactory.classDeclaration(
           null,
           null,
           abstractKeyword == null
               ? null
               : TokenFactory.tokenFromKeyword(abstractKeyword),
+          isMacro ? TokenFactory.tokenFromString('macro') : null,
           TokenFactory.tokenFromKeyword(Keyword.CLASS),
           identifier3(name),
           typeParameters,
@@ -263,7 +265,8 @@
           Keyword? abstractKeyword,
           NamedType superclass,
           WithClause withClause,
-          ImplementsClause? implementsClause) =>
+          ImplementsClause? implementsClause,
+          {bool isMacro = false}) =>
       astFactory.classTypeAlias(
           null,
           null,
@@ -274,6 +277,7 @@
           abstractKeyword == null
               ? null
               : TokenFactory.tokenFromKeyword(abstractKeyword),
+          isMacro ? TokenFactory.tokenFromString('macro') : null,
           superclass,
           withClause,
           implementsClause,
@@ -458,29 +462,6 @@
   static EmptyStatementImpl emptyStatement() => astFactory
       .emptyStatement(TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
-  static EnumDeclarationImpl enumDeclaration(
-          SimpleIdentifier name, List<EnumConstantDeclaration> constants) =>
-      astFactory.enumDeclaration(
-          null,
-          null,
-          TokenFactory.tokenFromKeyword(Keyword.ENUM),
-          name,
-          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
-          constants,
-          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
-
-  static EnumDeclarationImpl enumDeclaration2(
-      String name, List<String> constantNames) {
-    var constants = constantNames.map((name) {
-      return astFactory.enumConstantDeclaration(
-        null,
-        null,
-        identifier3(name),
-      );
-    }).toList();
-    return enumDeclaration(identifier3(name), constants);
-  }
-
   static ExportDirectiveImpl exportDirective(
           List<Annotation> metadata, String uri,
           [List<Combinator> combinators = const []]) =>
@@ -1100,6 +1081,42 @@
               : TokenFactory.tokenFromType(TokenType.COLON),
           expression);
 
+  /// Create a type name whose name has been resolved to the given [element] and
+  /// whose type has been resolved to the type of the given element.
+  ///
+  /// <b>Note:</b> This method does not correctly handle class elements that
+  /// have type parameters.
+  static NamedTypeImpl namedType(ClassElement element,
+      [List<TypeAnnotation>? arguments]) {
+    var name = identifier3(element.name);
+    name.staticElement = element;
+    var typeName = namedType3(name, arguments);
+    typeName.type = element.instantiate(
+      typeArguments: List.filled(
+        element.typeParameters.length,
+        DynamicTypeImpl.instance,
+      ),
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+    return typeName;
+  }
+
+  static NamedTypeImpl namedType3(Identifier name,
+          [List<TypeAnnotation>? arguments]) =>
+      astFactory.namedType(
+        name: name,
+        typeArguments: typeArgumentList(arguments),
+      );
+
+  static NamedTypeImpl namedType4(String name,
+          [List<TypeAnnotation>? arguments, bool question = false]) =>
+      astFactory.namedType(
+        name: identifier3(name),
+        typeArguments: typeArgumentList(arguments),
+        question:
+            question ? TokenFactory.tokenFromType(TokenType.QUESTION) : null,
+      );
+
   static NativeClauseImpl nativeClause(String nativeCode) =>
       astFactory.nativeClause(
           TokenFactory.tokenFromString("native"), string2(nativeCode));
@@ -1296,6 +1313,21 @@
   static SuperExpressionImpl superExpression() =>
       astFactory.superExpression(TokenFactory.tokenFromKeyword(Keyword.SUPER));
 
+  static SuperFormalParameterImpl superFormalParameter(
+          Keyword? keyword, TypeAnnotation? type, String identifier,
+          [FormalParameterList? parameterList]) =>
+      astFactory.superFormalParameter(
+          keyword:
+              keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          type: type,
+          superKeyword: TokenFactory.tokenFromKeyword(Keyword.SUPER),
+          period: TokenFactory.tokenFromType(TokenType.PERIOD),
+          identifier: identifier3(identifier),
+          parameters: parameterList);
+
+  static SuperFormalParameterImpl superFormalParameter2(String identifier) =>
+      superFormalParameter(null, null, identifier);
+
   static SwitchCaseImpl switchCase(
           Expression expression, List<Statement> statements) =>
       switchCase2(<Label>[], expression, statements);
@@ -1422,42 +1454,6 @@
         types, TokenFactory.tokenFromType(TokenType.GT));
   }
 
-  /// Create a type name whose name has been resolved to the given [element] and
-  /// whose type has been resolved to the type of the given element.
-  ///
-  /// <b>Note:</b> This method does not correctly handle class elements that
-  /// have type parameters.
-  static NamedTypeImpl typeName(ClassElement element,
-      [List<TypeAnnotation>? arguments]) {
-    var name = identifier3(element.name);
-    name.staticElement = element;
-    var typeName = typeName3(name, arguments);
-    typeName.type = element.instantiate(
-      typeArguments: List.filled(
-        element.typeParameters.length,
-        DynamicTypeImpl.instance,
-      ),
-      nullabilitySuffix: NullabilitySuffix.star,
-    );
-    return typeName;
-  }
-
-  static NamedTypeImpl typeName3(Identifier name,
-          [List<TypeAnnotation>? arguments]) =>
-      astFactory.namedType(
-        name: name,
-        typeArguments: typeArgumentList(arguments),
-      );
-
-  static NamedTypeImpl typeName4(String name,
-          [List<TypeAnnotation>? arguments, bool question = false]) =>
-      astFactory.namedType(
-        name: identifier3(name),
-        typeArguments: typeArgumentList(arguments),
-        question:
-            question ? TokenFactory.tokenFromType(TokenType.QUESTION) : null,
-      );
-
   static TypeParameterImpl typeParameter(String name) =>
       astFactory.typeParameter(null, null, identifier3(name), null, null);
 
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index a33890a..cd89eef 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -17,12 +17,14 @@
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:collection/collection.dart';
+import 'package:meta/meta.dart';
 import 'package:path/path.dart';
 
 /// The class `ElementFactory` defines utility methods used to create elements
 /// for testing purposes. The elements that are created are complete in the
 /// sense that as much of the element model as can be created, given the
 /// provided information, has been created.
+@internal
 class ElementFactory {
   /// The element representing the class 'Object'.
   static ClassElementImpl? _objectElement;
@@ -90,8 +92,7 @@
 
   static CompilationUnitElementImpl compilationUnit(String fileName,
       [Source? librarySource]) {
-    Source source =
-        NonExistingSource(fileName, toUri(fileName), UriKind.FILE_URI);
+    Source source = NonExistingSource(fileName, toUri(fileName));
     CompilationUnitElementImpl unit = CompilationUnitElementImpl();
     unit.source = source;
     librarySource ??= source;
@@ -358,7 +359,7 @@
           ConstTopLevelVariableElementImpl(name, -1);
       var typeElement = type.element as ClassElement;
       var initializer = AstTestFactory.instanceCreationExpression2(
-          Keyword.CONST, AstTestFactory.typeName(typeElement));
+          Keyword.CONST, AstTestFactory.namedType(typeElement));
       if (type is InterfaceType) {
         var element = typeElement.unnamedConstructor;
         initializer.constructorName.staticElement = element;
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index f700ddd..9005be7 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -55,6 +55,7 @@
 
   _MockSource(this.uri);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => '$uri';
 
diff --git a/pkg/analyzer/lib/src/generated/testing/token_factory.dart b/pkg/analyzer/lib/src/generated/testing/token_factory.dart
index 71dabc7..10654de 100644
--- a/pkg/analyzer/lib/src/generated/testing/token_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/token_factory.dart
@@ -4,8 +4,10 @@
 
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:meta/meta.dart';
 
 /// A set of utility methods that can be used to create tokens.
+@internal
 class TokenFactory {
   static Token tokenFromKeyword(Keyword keyword) => KeywordToken(keyword, 0);
 
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index 2e6974e..7eb9520 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -67,10 +67,6 @@
   /// The path to a `.packages` configuration file
   String? packageConfigPath;
 
-  /// The path to the package root.
-  @Deprecated('https://github.com/dart-lang/sdk/issues/41197')
-  String? packageRootPath;
-
   /// Whether to use Dart's Strong Mode analyzer.
   bool strongMode = true;
 
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 0c8f774..8b32896 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -28,11 +28,7 @@
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart'
-    show
-        AnalysisErrorInfo,
-        AnalysisErrorInfoImpl,
-        AnalysisOptions,
-        AnalysisOptionsImpl;
+    show AnalysisErrorInfo, AnalysisErrorInfoImpl, AnalysisOptions;
 import 'package:analyzer/src/generated/resolver.dart' show ScopeResolverVisitor;
 import 'package:analyzer/src/generated/source.dart' show LineInfo;
 import 'package:analyzer/src/lint/analysis.dart';
@@ -368,11 +364,26 @@
       isNonNullableByDefault: libraryElement.isNonNullableByDefault,
     );
 
+    var evaluationEngine = ConstantEvaluationEngine(
+      declaredVariables: declaredVariables,
+      isNonNullableByDefault: isEnabled(Feature.non_nullable),
+    );
+
+    var dependencies = <ConstantEvaluationTarget>[];
+    node.accept(
+      ReferenceFinder(dependencies.add),
+    );
+
+    computeConstants(
+      typeProvider,
+      typeSystem,
+      declaredVariables,
+      dependencies,
+      libraryElement.featureSet,
+    );
+
     var visitor = ConstantVisitor(
-      ConstantEvaluationEngine(
-        declaredVariables: declaredVariables,
-        isNonNullableByDefault: isEnabled(Feature.non_nullable),
-      ),
+      evaluationEngine,
       libraryElement,
       errorReporter,
     );
@@ -476,7 +487,7 @@
       typeSystem,
       declaredVariables,
       dependenciesFinder.dependencies.toList(),
-      (analysisOptions as AnalysisOptionsImpl).experimentStatus,
+      libraryElement.featureSet,
     );
 
     var listener = _ConstantAnalysisErrorListener();
diff --git a/pkg/analyzer/lib/src/lint/pub.dart b/pkg/analyzer/lib/src/lint/pub.dart
index d68ecdf..be9b149 100644
--- a/pkg/analyzer/lib/src/lint/pub.dart
+++ b/pkg/analyzer/lib/src/lint/pub.dart
@@ -37,6 +37,12 @@
 
 PSGitRepo? _processGitRepo(
     YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
+  if (v is YamlScalar) {
+    _PSGitRepo repo = _PSGitRepo();
+    repo.token = _PSNode(key, resourceProvider);
+    repo.url = PSEntry(repo.token, _PSNode(v, resourceProvider));
+    return repo;
+  }
   if (v is! YamlMap) {
     return null;
   }
@@ -52,28 +58,27 @@
 
 PSHost? _processHost(
     YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
-  if (v is! YamlMap) {
-    return null;
+  if (v is YamlScalar) {
+    // dependencies:
+    //   mypkg:
+    //     hosted:  https://some-pub-server.com
+    //     version: ^1.2.3
+    _PSHost host = _PSHost(isShortForm: true);
+    host.token = _PSNode(key, resourceProvider);
+    host.url = _processScalar(key, v, resourceProvider);
+    return host;
   }
-  YamlMap hostMap = v;
-  // name: transmogrify
-  // url: http://your-package-server.com
-  _PSHost host = _PSHost();
-  host.token = _PSNode(key, resourceProvider);
-  host.name = _findEntry(hostMap, 'name', resourceProvider);
-  host.url = _findEntry(hostMap, 'url', resourceProvider);
-  return host;
-}
-
-PSNodeList? _processList(
-    YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
-  if (v is! YamlList) {
-    return null;
+  if (v is YamlMap) {
+    YamlMap hostMap = v;
+    // name: transmogrify
+    // url: http://your-package-server.com
+    _PSHost host = _PSHost(isShortForm: false);
+    host.token = _PSNode(key, resourceProvider);
+    host.name = _findEntry(hostMap, 'name', resourceProvider);
+    host.url = _findEntry(hostMap, 'url', resourceProvider);
+    return host;
   }
-  YamlList nodeList = v;
-
-  return _PSNodeList(_PSNode(key, resourceProvider),
-      nodeList.nodes.map((n) => _PSNode(n, resourceProvider)));
+  return null;
 }
 
 PSEntry? _processScalar(
@@ -86,6 +91,30 @@
       _PSNode(key, resourceProvider), _PSNode(value, resourceProvider));
 }
 
+PSNodeList? _processScalarList(
+    YamlScalar key, YamlNode v, ResourceProvider? resourceProvider) {
+  if (v is! YamlList) {
+    return null;
+  }
+  YamlList nodeList = v;
+
+  return _PSNodeList(
+      _PSNode(key, resourceProvider),
+      nodeList.nodes
+          .whereType<YamlScalar>()
+          .map((n) => _PSNode(n, resourceProvider)));
+}
+
+/// Representation of a key/value pair a map from package name to
+/// _package description_.
+///
+/// **Example** of a path-dependency:
+/// ```yaml
+/// dependencies:
+///   <name>:
+///     version: <version>
+///     path: <path>
+/// ```
 abstract class PSDependency {
   PSGitRepo? get git;
   PSHost? get host;
@@ -94,6 +123,8 @@
   PSEntry? get version;
 }
 
+/// Representation of the map from package name to _package description_ used
+/// under `dependencies`, `dev_dependencies` and `dependency_overrides`.
 abstract class PSDependencyList with IterableMixin<PSDependency> {}
 
 class PSEntry {
@@ -105,21 +136,96 @@
   String toString() => '${key != null ? (key.toString() + ': ') : ''}$value';
 }
 
+/// Representation of git-dependency in `pubspec.yaml`.
+///
+/// **Example** of a git-dependency:
+/// ```yaml
+/// dependencies:
+///   foo:
+///     git: # <-- this is the [token] property
+///       url: https://github.com/example/example
+///       ref: main # ref is optional
+/// ```
+///
+/// This may also be written in the form:
+/// ```yaml
+/// dependencies:
+///   foo:
+///     git:       https://github.com/example/example
+///     # ^-token  ^--url
+///     # In this case [ref] is `null`.
+/// ```
 abstract class PSGitRepo {
+  /// [PSEntry] for `ref: main` where [PSEntry.key] is `ref` and [PSEntry.value]
+  /// is `main`.
   PSEntry? get ref;
+
+  /// The `'git'` from the `pubspec.yaml`, this is the key that indicates this
+  /// is a git-dependency.
   PSNode? get token;
+
+  /// [PSEntry] for `url: https://...` or `git: https://`, where [PSEntry.key]
+  /// is either `url` or `git`, and [PSEntry.key] is the URL.
+  ///
+  /// If the git-dependency is given in the form:
+  /// ```yaml
+  /// dependencies:
+  ///   foo:
+  ///     git:       https://github.com/example/example
+  /// ```
+  /// Then [token] and [url.key] will be the same object.
   PSEntry? get url;
 }
 
 abstract class PSHost {
+  /// True, if _short-form_ for writing hosted-dependencies was used.
+  ///
+  /// **Example** of a hosted-dependency written in short-form:
+  /// ```yaml
+  /// dependencies:
+  ///   foo:
+  ///     hosted: https://some-pub-server.com
+  ///     version: ^1.2.3
+  /// ```
+  ///
+  /// The _long-form_ for writing the dependency given above is:
+  /// ```yaml
+  /// dependencies:
+  ///   foo:
+  ///     hosted:
+  ///       url: https://some-pub-server.com
+  ///       name: foo
+  ///     version: ^1.2.3
+  /// ```
+  ///
+  /// The short-form was added in Dart 2.15.0 because:
+  ///  * The `name` property just specifies the package name, which can be
+  ///    inferred from the context. So it is unnecessary to write it.
+  ///  * The nested object and `url` key becomes unnecessary when the `name`
+  ///    property is removed.
+  bool get isShortForm;
+
   PSEntry? get name;
   PSNode? get token;
   PSEntry? get url;
 }
 
+/// Representation of a leaf-node from `pubspec.yaml`.
 abstract class PSNode {
   Source get source;
   SourceSpan get span;
+
+  /// String value of the node, or `null` if value in pubspec.yaml is `null` or
+  /// omitted.
+  ///
+  /// **Example**
+  /// ```
+  /// name: foo
+  /// version:
+  /// ```
+  /// In the example above the [PSNode] for `foo` will have [text] "foo", and
+  /// the [PSNode] for `version` will have not have [text] as `null`, as empty
+  /// value or `"null"` is the same in YAML.
   String? get text;
 }
 
@@ -142,7 +248,9 @@
   PSDependencyList? get devDependencies;
   PSEntry? get documentation;
   PSEntry? get homepage;
+  PSEntry? get issueTracker;
   PSEntry? get name;
+  PSEntry? get repository;
   PSEntry? get version;
   void accept(PubspecVisitor visitor);
 }
@@ -159,7 +267,9 @@
   T? visitPackageDevDependency(PSDependency dependency) => null;
   T? visitPackageDocumentation(PSEntry documentation) => null;
   T? visitPackageHomepage(PSEntry homepage) => null;
+  T? visitPackageIssueTracker(PSEntry issueTracker) => null;
   T? visitPackageName(PSEntry name) => null;
+  T? visitPackageRepository(PSEntry repostory) => null;
   T? visitPackageVersion(PSEntry version) => null;
 }
 
@@ -276,11 +386,19 @@
 
 class _PSHost implements PSHost {
   @override
-  PSNode? token;
+  bool isShortForm;
+
   @override
   PSEntry? name;
+
+  @override
+  PSNode? token;
+
   @override
   PSEntry? url;
+
+  _PSHost({required this.isShortForm});
+
   @override
   String toString() => '''
     $token:
@@ -296,7 +414,7 @@
 
   final ResourceProvider? resourceProvider;
 
-  _PSNode(YamlNode node, this.resourceProvider)
+  _PSNode(YamlScalar node, this.resourceProvider)
       : text = node.value?.toString(),
         span = node.span;
 
@@ -337,8 +455,12 @@
   @override
   PSEntry? homepage;
   @override
+  PSEntry? issueTracker;
+  @override
   PSEntry? name;
   @override
+  PSEntry? repository;
+  @override
   PSEntry? version;
   @override
   PSDependencyList? dependencies;
@@ -372,6 +494,12 @@
     if (homepage != null) {
       visitor.visitPackageHomepage(homepage!);
     }
+    if (issueTracker != null) {
+      visitor.visitPackageIssueTracker(issueTracker!);
+    }
+    if (repository != null) {
+      visitor.visitPackageRepository(repository!);
+    }
     if (name != null) {
       visitor.visitPackageName(name!);
     }
@@ -401,6 +529,8 @@
     sb.writelin(authors);
     sb.writelin(description);
     sb.writelin(homepage);
+    sb.writelin(repository);
+    sb.writelin(issueTracker);
     sb.writelin(dependencies);
     sb.writelin(devDependencies);
     sb.writelin(dependencyOverrides);
@@ -424,11 +554,17 @@
           author = _processScalar(key, v, resourceProvider);
           break;
         case 'authors':
-          authors = _processList(key, v, resourceProvider);
+          authors = _processScalarList(key, v, resourceProvider);
           break;
         case 'homepage':
           homepage = _processScalar(key, v, resourceProvider);
           break;
+        case 'repository':
+          repository = _processScalar(key, v, resourceProvider);
+          break;
+        case 'issue_tracker':
+          issueTracker = _processScalar(key, v, resourceProvider);
+          break;
         case 'name':
           name = _processScalar(key, v, resourceProvider);
           break;
diff --git a/pkg/analyzer/lib/src/lint/util.dart b/pkg/analyzer/lib/src/lint/util.dart
index a0c25dc..392df53 100644
--- a/pkg/analyzer/lib/src/lint/util.dart
+++ b/pkg/analyzer/lib/src/lint/util.dart
@@ -12,19 +12,8 @@
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:path/path.dart' as path;
 
-final _identifier = RegExp(r'^([(_|$)a-zA-Z]+([_a-zA-Z0-9])*)$');
-
-final _lowerCamelCase = RegExp(r'^(_)*[?$a-z][a-z0-9?$]*([A-Z][a-z0-9?$]*)*$');
-
-final _lowerCaseUnderScore = RegExp(r'^([a-z]+([_]?[a-z0-9]+)*)+$');
-
-final _lowerCaseUnderScoreWithDots =
-    RegExp(r'^[a-z][_a-z0-9]*(\.[a-z][_a-z0-9]*)*$');
-
 final _pubspec = RegExp(r'^[_]?pubspec\.yaml$');
 
-final _underscores = RegExp(r'^[_]+$');
-
 /// Create a library name prefix based on [libraryPath], [projectRoot] and
 /// current [packageName].
 String createLibraryNamePrefix(
@@ -50,37 +39,9 @@
 /// Returns `true` if this [fileName] is a Dart file.
 bool isDartFileName(String fileName) => fileName.endsWith('.dart');
 
-/// Returns `true` if this [name] is a legal Dart identifier.
-@deprecated // Never intended for public use.
-bool isIdentifier(String name) => _identifier.hasMatch(name);
-
-/// Returns `true` of the given [name] is composed only of `_`s.
-@deprecated // Never intended for public use.
-bool isJustUnderscores(String name) => _underscores.hasMatch(name);
-
-/// Returns `true` if this [id] is `lowerCamelCase`.
-@deprecated // Never intended for public use.
-bool isLowerCamelCase(String id) =>
-    id.length == 1 && isUpperCase(id.codeUnitAt(0)) ||
-    id == '_' ||
-    _lowerCamelCase.hasMatch(id);
-
-/// Returns `true` if this [id] is `lower_camel_case_with_underscores`.
-@deprecated // Never intended for public use.
-bool isLowerCaseUnderScore(String id) => _lowerCaseUnderScore.hasMatch(id);
-
-/// Returns `true` if this [id] is `lower_camel_case_with_underscores_or.dots`.
-@deprecated // Never intended for public use.
-bool isLowerCaseUnderScoreWithDots(String id) =>
-    _lowerCaseUnderScoreWithDots.hasMatch(id);
-
 /// Returns `true` if this [fileName] is a Pubspec file.
 bool isPubspecFileName(String fileName) => _pubspec.hasMatch(fileName);
 
-/// Returns `true` if the given code unit [c] is upper case.
-@deprecated // Never intended for public use.
-bool isUpperCase(int c) => c >= 0x40 && c <= 0x5A;
-
 class Spelunker {
   final String path;
   final IOSink sink;
diff --git a/pkg/analyzer/lib/src/manifest/manifest_warning_code.g.dart b/pkg/analyzer/lib/src/manifest/manifest_warning_code.g.dart
index d988a94..8ac1bdd 100644
--- a/pkg/analyzer/lib/src/manifest/manifest_warning_code.g.dart
+++ b/pkg/analyzer/lib/src/manifest/manifest_warning_code.g.dart
@@ -21,9 +21,14 @@
   static const ManifestWarningCode CAMERA_PERMISSIONS_INCOMPATIBLE =
       ManifestWarningCode(
     'CAMERA_PERMISSIONS_INCOMPATIBLE',
-    "Camera permissions make app incompatible for Chrome OS, consider adding optional features \"android.hardware.camera\" and \"android.hardware.camera.autofocus\".",
+    "Camera permissions make app incompatible for Chrome OS, consider adding "
+        "optional features \"android.hardware.camera\" and "
+        "\"android.hardware.camera.autofocus\".",
     correctionMessage:
-        "Try adding `<uses-feature android:name=\"android.hardware.camera\"  android:required=\"false\">` `<uses-feature android:name=\"android.hardware.camera.autofocus\"  android:required=\"false\">`.",
+        "Try adding `<uses-feature android:name=\"android.hardware.camera\"  "
+        "android:required=\"false\">` `<uses-feature "
+        "android:name=\"android.hardware.camera.autofocus\"  "
+        "android:required=\"false\">`.",
   );
 
   /**
@@ -31,9 +36,11 @@
    */
   static const ManifestWarningCode NON_RESIZABLE_ACTIVITY = ManifestWarningCode(
     'NON_RESIZABLE_ACTIVITY',
-    "The `<activity>` element should be allowed to be resized to allow users to take advantage of the multi-window environment on Chrome OS",
+    "The `<activity>` element should be allowed to be resized to allow users "
+        "to take advantage of the multi-window environment on Chrome OS",
     correctionMessage:
-        "Consider declaring the corresponding activity element with `resizableActivity=\"true\"` attribute.",
+        "Consider declaring the corresponding activity element with "
+        "`resizableActivity=\"true\"` attribute.",
   );
 
   /**
@@ -42,9 +49,11 @@
    */
   static const ManifestWarningCode NO_TOUCHSCREEN_FEATURE = ManifestWarningCode(
     'NO_TOUCHSCREEN_FEATURE',
-    "The default \"android.hardware.touchscreen\" needs to be optional for Chrome OS. ",
-    correctionMessage:
-        "Consider adding <uses-feature android:name=\"android.hardware.touchscreen\" android:required=\"false\" /> to the manifest.",
+    "The default \"android.hardware.touchscreen\" needs to be optional for "
+        "Chrome OS. ",
+    correctionMessage: "Consider adding <uses-feature "
+        "android:name=\"android.hardware.touchscreen\" android:required=\"false\" "
+        "/> to the manifest.",
   );
 
   /**
@@ -54,9 +63,10 @@
   static const ManifestWarningCode PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE =
       ManifestWarningCode(
     'PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE',
-    "Permission makes app incompatible for Chrome OS, consider adding optional {0} feature tag, ",
-    correctionMessage:
-        " Try adding `<uses-feature android:name=\"{0}\"  android:required=\"false\">`.",
+    "Permission makes app incompatible for Chrome OS, consider adding optional "
+        "{0} feature tag, ",
+    correctionMessage: " Try adding `<uses-feature android:name=\"{0}\"  "
+        "android:required=\"false\">`.",
   );
 
   /**
@@ -65,9 +75,12 @@
   static const ManifestWarningCode SETTING_ORIENTATION_ON_ACTIVITY =
       ManifestWarningCode(
     'SETTING_ORIENTATION_ON_ACTIVITY',
-    "The `<activity>` element should not be locked to any orientation so that users can take advantage of the multi-window environments and larger screens on Chrome OS",
+    "The `<activity>` element should not be locked to any orientation so that "
+        "users can take advantage of the multi-window environments and larger "
+        "screens on Chrome OS",
     correctionMessage:
-        "Consider declaring the corresponding activity element with `screenOrientation=\"unspecified\"` or `\"fullSensor\"` attribute.",
+        "Consider declaring the corresponding activity element with "
+        "`screenOrientation=\"unspecified\"` or `\"fullSensor\"` attribute.",
   );
 
   /**
@@ -76,7 +89,8 @@
   static const ManifestWarningCode UNSUPPORTED_CHROME_OS_FEATURE =
       ManifestWarningCode(
     'UNSUPPORTED_CHROME_OS_FEATURE',
-    "The feature {0} is not supported on Chrome OS, consider making it optional.",
+    "The feature {0} isn't supported on Chrome OS, consider making it "
+        "optional.",
     correctionMessage:
         "Try changing to `android:required=\"false\"` for this feature.",
   );
@@ -88,7 +102,8 @@
   static const ManifestWarningCode UNSUPPORTED_CHROME_OS_HARDWARE =
       ManifestWarningCode(
     'UNSUPPORTED_CHROME_OS_HARDWARE',
-    "The feature {0} is not supported on Chrome OS, consider making it optional.",
+    "The feature {0} isn't supported on Chrome OS, consider making it "
+        "optional.",
     correctionMessage:
         "Try adding `android:required=\"false\"` for this feature.",
   );
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.g.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.g.dart
index 689c4ba..e1565ec 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.g.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.g.dart
@@ -120,7 +120,8 @@
   // ```
   static const PubspecWarningCode ASSET_FIELD_NOT_LIST = PubspecWarningCode(
     'ASSET_FIELD_NOT_LIST',
-    "The value of the 'asset' field is expected to be a list of relative file paths.",
+    "The value of the 'asset' field is expected to be a list of relative file "
+        "paths.",
     correctionMessage:
         "Try converting the value to be a list of relative file paths.",
     hasPublishedDocs: true,
@@ -291,7 +292,7 @@
   // #### Description
   //
   // The analyzer produces this diagnostic when a package under either
-  // `dependencies` or `dev_dependencies` is not a pub, `git`, or `path` based
+  // `dependencies` or `dev_dependencies` isn't a pub, `git`, or `path` based
   // dependency.
   //
   // See [Package dependencies](https://dart.dev/tools/pub/dependencies) for
@@ -300,7 +301,7 @@
   // #### Example
   //
   // The following code produces this diagnostic because the dependency on the
-  // package `transmogrify` is not a pub, `git`, or `path` based dependency:
+  // package `transmogrify` isn't a pub, `git`, or `path` based dependency:
   //
   // ```yaml
   // %uri="pubspec.yaml"
@@ -337,7 +338,8 @@
     'INVALID_DEPENDENCY',
     "Publishable packages can't have '{0}' dependencies.",
     correctionMessage:
-        "Try adding a 'publish_to: none' entry to mark the package as not for publishing or remove the {0} dependency.",
+        "Try adding a 'publish_to: none' entry to mark the package as not for "
+        "publishing or remove the {0} dependency.",
     hasPublishedDocs: true,
   );
 
@@ -518,7 +520,8 @@
     'PATH_PUBSPEC_DOES_NOT_EXIST',
     "The directory '{0}' doesn't contain a pubspec.",
     correctionMessage:
-        "Try creating a pubspec in the referenced directory or using a path that has a pubspec.",
+        "Try creating a pubspec in the referenced directory or using a path "
+        "that has a pubspec.",
     hasPublishedDocs: true,
   );
 
@@ -561,7 +564,8 @@
   static const PubspecWarningCode UNNECESSARY_DEV_DEPENDENCY =
       PubspecWarningCode(
     'UNNECESSARY_DEV_DEPENDENCY',
-    "The dev dependency on {0} is unnecessary because there is also a normal dependency on that package.",
+    "The dev dependency on {0} is unnecessary because there is also a normal "
+        "dependency on that package.",
     correctionMessage: "Try removing the dev dependency.",
     hasPublishedDocs: true,
   );
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 588b150..b5a3097 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -504,6 +504,10 @@
   /// The list of changed file paths.
   final List<String> _changedPaths = [];
 
+  /// While processing [_changedPaths] we accumulate libraries here.
+  /// Then we process all of them at once, and reset to the empty set.
+  Set<_File> _invalidatedLibraries = {};
+
   /// The list of files scheduled for processing.  It may include parts and
   /// libraries, but parts are ignored when we detect them.
   final List<_ScheduledFile> _scheduledFiles = [];
@@ -529,7 +533,9 @@
       _whenKnownFilesPulled = now;
       pullKnownFiles();
     }
-    return _changedPaths.isNotEmpty || _scheduledFiles.isNotEmpty;
+    return _changedPaths.isNotEmpty ||
+        _invalidatedLibraries.isNotEmpty ||
+        _scheduledFiles.isNotEmpty;
   }
 
   /// Add the [analysisContext], so that its libraries are reported via the
@@ -595,6 +601,13 @@
       return;
     }
 
+    // There are no more changes as far as we know.
+    // So, recompute exported declarations for all invalidated libraries.
+    if (_invalidatedLibraries.isNotEmpty) {
+      _processInvalidatedLibraries(_invalidatedLibraries);
+      _invalidatedLibraries = {};
+    }
+
     if (_scheduledFiles.isNotEmpty) {
       var scheduledFile = _scheduledFiles.removeLast();
       var file = _getFileByPath(scheduledFile.context, [], scheduledFile.path)!;
@@ -794,11 +807,33 @@
         _invalidateExportedDeclarations(invalidatedLibraries, newLibrary);
       }
     }
-    _computeExportedDeclarations(invalidatedLibraries);
 
-    var changedLibraries = <Library>[];
+    // Don't compute exported declarations now, there might be more changes.
+    // Instead, accumulate invalidated libraries, and recompute all later.
+    _invalidatedLibraries.addAll(invalidatedLibraries);
+
     var removedLibraries = <int>[];
     for (var libraryFile in invalidatedLibraries) {
+      if (!libraryFile.exists) {
+        _idToLibrary.remove(libraryFile.id);
+        removedLibraries.add(libraryFile.id);
+      }
+    }
+    for (var file in notLibraries) {
+      _idToLibrary.remove(file.id);
+      removedLibraries.add(file.id);
+    }
+    if (removedLibraries.isNotEmpty) {
+      _changesController.add(
+        LibraryChange._([], removedLibraries),
+      );
+    }
+  }
+
+  void _processInvalidatedLibraries(Set<_File> invalidatedLibraries) {
+    _computeExportedDeclarations(invalidatedLibraries);
+    var changedLibraries = <Library>[];
+    for (var libraryFile in invalidatedLibraries) {
       if (libraryFile.exists) {
         var library = Library._(
           libraryFile.id,
@@ -809,17 +844,10 @@
         );
         _idToLibrary[library.id] = library;
         changedLibraries.add(library);
-      } else {
-        _idToLibrary.remove(libraryFile.id);
-        removedLibraries.add(libraryFile.id);
       }
     }
-    for (var file in notLibraries) {
-      _idToLibrary.remove(file.id);
-      removedLibraries.add(file.id);
-    }
     _changesController.add(
-      LibraryChange._(changedLibraries, removedLibraries),
+      LibraryChange._(changedLibraries, []),
     );
   }
 
diff --git a/pkg/analyzer/lib/src/source/package_map_resolver.dart b/pkg/analyzer/lib/src/source/package_map_resolver.dart
index 0feee31..9b96f99 100644
--- a/pkg/analyzer/lib/src/source/package_map_resolver.dart
+++ b/pkg/analyzer/lib/src/source/package_map_resolver.dart
@@ -37,6 +37,22 @@
   }
 
   @override
+  Uri? pathToUri(String path) {
+    pathos.Context pathContext = resourceProvider.pathContext;
+    for (String pkgName in packageMap.keys) {
+      Folder pkgFolder = packageMap[pkgName]![0];
+      String pkgFolderPath = pkgFolder.path;
+      if (path.startsWith(pkgFolderPath + pathContext.separator)) {
+        String relPath = path.substring(pkgFolderPath.length + 1);
+        List<String> relPathComponents = pathContext.split(relPath);
+        String relUriPath = pathos.posix.joinAll(relPathComponents);
+        return Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath');
+      }
+    }
+    return null;
+  }
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     if (!isPackageUri(uri)) {
       return null;
@@ -61,23 +77,6 @@
     return null;
   }
 
-  @override
-  Uri? restoreAbsolute(Source source) {
-    String sourcePath = source.fullName;
-    pathos.Context pathContext = resourceProvider.pathContext;
-    for (String pkgName in packageMap.keys) {
-      Folder pkgFolder = packageMap[pkgName]![0];
-      String pkgFolderPath = pkgFolder.path;
-      if (sourcePath.startsWith(pkgFolderPath + pathContext.separator)) {
-        String relPath = sourcePath.substring(pkgFolderPath.length + 1);
-        List<String> relPathComponents = pathContext.split(relPath);
-        String relUriPath = pathos.posix.joinAll(relPathComponents);
-        return Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath');
-      }
-    }
-    return null;
-  }
-
   /// Returns `true` if [uri] is a `package` URI.
   static bool isPackageUri(Uri uri) {
     return uri.scheme == PACKAGE_SCHEME;
diff --git a/pkg/analyzer/lib/src/source/source_resource.dart b/pkg/analyzer/lib/src/source/source_resource.dart
index e9d258a..9334b31 100644
--- a/pkg/analyzer/lib/src/source/source_resource.dart
+++ b/pkg/analyzer/lib/src/source/source_resource.dart
@@ -65,9 +65,10 @@
   /// See [contents].
   TimestampedData<String> get contentsFromFile {
     return TimestampedData<String>(
-        modificationStamp, fileReadMode(file.readAsStringSync()));
+        file.modificationStamp, fileReadMode(file.readAsStringSync()));
   }
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => _encoding ??= uri.toString();
 
@@ -77,9 +78,11 @@
   @override
   int get hashCode => uri.hashCode;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => uri.scheme == DartUriResolver.DART_SCHEME;
 
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp {
     try {
@@ -92,6 +95,7 @@
   @override
   String get shortName => file.shortName;
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind => UriKind.fromScheme(uri.scheme);
 
diff --git a/pkg/analyzer/lib/src/string_source.dart b/pkg/analyzer/lib/src/string_source.dart
index de87280..a8e55db 100644
--- a/pkg/analyzer/lib/src/string_source.dart
+++ b/pkg/analyzer/lib/src/string_source.dart
@@ -29,18 +29,21 @@
   TimestampedData<String> get contents =>
       TimestampedData(modificationStamp, _contents);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => uri.toString();
 
   @override
   int get hashCode => _contents.hashCode ^ fullName.hashCode;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => false;
 
   @override
   String get shortName => fullName;
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind => UriKind.FILE_URI;
 
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index 03cce04..a332f28 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -72,9 +72,11 @@
   @override
   TimestampedData<String> get contents => TimestampedData<String>(0, '');
 
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp => 0;
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind => UriKind.PACKAGE_URI;
 
@@ -88,11 +90,12 @@
 /// The [UriResolver] that knows about sources that are served from their
 /// summaries.
 class InSummaryUriResolver extends UriResolver {
-  /// TODO(scheglov) Remove it, we don't need it.
-  ResourceProvider? resourceProvider;
   final SummaryDataStore _dataStore;
 
-  InSummaryUriResolver(this.resourceProvider, this._dataStore);
+  InSummaryUriResolver(this._dataStore);
+
+  @override
+  Uri? pathToUri(String path) => null;
 
   @override
   Source? resolveAbsolute(Uri uri) {
diff --git a/pkg/analyzer/lib/src/summary/summary_file_builder.dart b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
deleted file mode 100644
index 521f24b..0000000
--- a/pkg/analyzer/lib/src/summary/summary_file_builder.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-@Deprecated('Use package:analyzer/dart/sdk/build_sdk_summary.dart instead')
-library summary_file_builder;
-
-import 'dart:typed_data';
-
-import 'package:analyzer/dart/sdk/build_sdk_summary.dart' as api;
-import 'package:analyzer/file_system/file_system.dart';
-
-/// Build summary for SDK the at the given [sdkPath].
-///
-/// If [embedderYamlPath] is provided, then libraries from this file are
-/// appended to the libraries of the specified SDK.
-Uint8List buildSdkSummary({
-  required ResourceProvider resourceProvider,
-  required String sdkPath,
-  String? embedderYamlPath,
-}) {
-  return api.buildSdkSummary(
-    resourceProvider: resourceProvider,
-    sdkPath: sdkPath,
-    embedderYamlPath: embedderYamlPath,
-  );
-}
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index 1ad7efe..bb34ac0 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/file_system/file_system.dart' show ResourceProvider;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart' show Source;
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
@@ -14,29 +13,15 @@
 /// suitable only for command-line tools, but not for IDEs - it does not
 /// implement [sdkLibraries], [uris] and [fromFileUri].
 class SummaryBasedDartSdk implements DartSdk {
-  late final PackageBundleReader _bundle;
-  late final SummaryDataStore _dataStore;
+  final PackageBundleReader _bundle;
   late final InSummaryUriResolver _uriResolver;
 
-  /// TODO(scheglov) Remove it when the default constructor.
-  ResourceProvider? resourceProvider;
-
-  @Deprecated('Use SummaryBasedDartSdk.forBundle() instead')
-  SummaryBasedDartSdk(String summaryPath, bool _, {this.resourceProvider}) {
-    _dataStore = SummaryDataStore(<String>[summaryPath],
-        resourceProvider: resourceProvider);
-    _uriResolver = InSummaryUriResolver(resourceProvider, _dataStore);
-    _bundle = _dataStore.bundles.single;
-  }
-
-  SummaryBasedDartSdk.forBundle(PackageBundleReader bundle) {
-    _bundle = bundle;
-
-    _dataStore = SummaryDataStore([]);
+  SummaryBasedDartSdk.forBundle(this._bundle) {
+    var dataStore = SummaryDataStore([]);
     // TODO(scheglov) We need a solution to avoid these paths at all.
-    _dataStore.addBundle('', bundle);
+    dataStore.addBundle('', bundle);
 
-    _uriResolver = InSummaryUriResolver(resourceProvider, _dataStore);
+    _uriResolver = InSummaryUriResolver(dataStore);
   }
 
   @override
@@ -90,4 +75,10 @@
     Uri uri = Uri.parse(uriStr);
     return _uriResolver.resolveAbsolute(uri);
   }
+
+  @override
+  Uri? pathToUri(String path) {
+    // Libraries from summaries don't have corresponding Dart files.
+    return null;
+  }
 }
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index b763df3..b30141a 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -145,6 +145,7 @@
   void visitClassDeclaration(ClassDeclaration node) {
     _compilationUnitMember(node);
     _token(node.abstractKeyword);
+    _token(node.macroKeyword);
     _token(node.classKeyword);
     node.name.accept(this);
     node.typeParameters?.accept(this);
@@ -161,6 +162,7 @@
   void visitClassTypeAlias(ClassTypeAlias node) {
     _compilationUnitMember(node);
     _token(node.abstractKeyword);
+    _token(node.macroKeyword);
     _token(node.typedefKeyword);
     node.name.accept(this);
     node.typeParameters?.accept(this);
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 056696d..14aa0a2 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -161,6 +161,7 @@
     );
     reader._addFormalParameters(element.parameters);
     _readFormalParameters(reader, element.parameters);
+    element.superConstructor = reader.readElement() as ConstructorElement?;
     element.redirectedConstructor = reader.readElement() as ConstructorElement?;
     element.constantInitializers = reader._readNodeList();
     applyConstantOffsets?.perform();
@@ -942,6 +943,7 @@
     return List.generate(length, (_) {
       var name = _reader.readStringReference();
       var isInitializingFormal = _reader.readBool();
+      var isSuperFormal = _reader.readBool();
       var reference = containerRef.getChild(name);
 
       var kindIndex = _reader.readByte();
@@ -955,6 +957,12 @@
             nameOffset: -1,
             parameterKind: kind,
           );
+        } else if (isSuperFormal) {
+          element = SuperFormalParameterElementImpl(
+            name: name,
+            nameOffset: -1,
+            parameterKind: kind,
+          );
         } else {
           element = ParameterElementImpl(
             name: name,
@@ -969,6 +977,12 @@
             nameOffset: -1,
             parameterKind: kind,
           );
+        } else if (isSuperFormal) {
+          element = DefaultSuperFormalParameterElementImpl(
+            name: name,
+            nameOffset: -1,
+            parameterKind: kind,
+          );
         } else {
           element = DefaultParameterElementImpl(
             name: name,
@@ -1406,6 +1420,8 @@
   List<DartType>? readOptionalTypeList() {
     if (_reader.readBool()) {
       return _readTypeList();
+    } else {
+      return null;
     }
   }
 
@@ -1695,6 +1711,8 @@
   ExpressionImpl? _readOptionalExpression() {
     if (_reader.readBool()) {
       return _readRequiredNode() as ExpressionImpl;
+    } else {
+      return null;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index f6fdf85..946fd6e6 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -162,6 +162,7 @@
 
     _resolutionSink.localElements.withElements(element.parameters, () {
       _writeList(element.parameters, _writeParameterElement);
+      _resolutionSink.writeElement(element.superConstructor);
       _resolutionSink.writeElement(element.redirectedConstructor);
       _resolutionSink._writeNodeList(element.constantInitializers);
     });
@@ -173,7 +174,8 @@
     _sink._writeStringReference(element.name);
     _resolutionSink._writeAnnotationList(element.metadata);
 
-    var constants = element.fields.where((e) => !e.isSynthetic).toList();
+    var constants =
+        element.fields.whereType<ConstFieldElementImpl_EnumValue>().toList();
     _writeList<FieldElement>(constants, (field) {
       _sink._writeStringReference(field.name);
       _resolutionSink._writeAnnotationList(field.metadata);
@@ -334,6 +336,7 @@
     element as ParameterElementImpl;
     _sink._writeStringReference(element.name);
     _sink.writeBool(element.isInitializingFormal);
+    _sink.writeBool(element.isSuperFormal);
     _sink._writeFormalParameterKind(element);
     ParameterElementFlags.write(_sink, element);
 
diff --git a/pkg/analyzer/lib/src/summary2/data_reader.dart b/pkg/analyzer/lib/src/summary2/data_reader.dart
index ff6e1b8..e72e947 100644
--- a/pkg/analyzer/lib/src/summary2/data_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/data_reader.dart
@@ -57,18 +57,24 @@
   String? readOptionalStringReference() {
     if (readBool()) {
       return readStringReference();
+    } else {
+      return null;
     }
   }
 
   String? readOptionalStringUtf8() {
     if (readBool()) {
       return readStringUtf8();
+    } else {
+      return null;
     }
   }
 
   int? readOptionalUInt30() {
     if (readBool()) {
       return readUInt30();
+    } else {
+      return null;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 5d1e535..f0d5965 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/util/comment.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:collection/collection.dart';
 
 class ElementBuilder extends ThrowingAstVisitor<void> {
@@ -351,13 +352,12 @@
       _enclosingContext.addParameter(null, element);
     }
     element.hasImplicitType = node.type == null && node.parameters == null;
-    element.isExplicitlyCovariant = node.covariantKeyword != null;
-    element.isFinal = node.isFinal;
     element.metadata = _buildAnnotations(node.metadata);
     _setCodeRange(element, node);
 
     nameNode.staticElement = element;
 
+    // TODO(scheglov) check that we don't set reference for parameters
     var fakeReference = Reference.root();
     var holder = _EnclosingContext(fakeReference, element);
     _withEnclosing(holder, () {
@@ -793,6 +793,59 @@
   }
 
   @override
+  void visitSuperFormalParameter(
+    covariant SuperFormalParameterImpl node,
+  ) {
+    var nameNode = node.identifier;
+    var name = nameNode.name;
+    var nameOffset = nameNode.offset;
+
+    SuperFormalParameterElementImpl element;
+    var parent = node.parent;
+    if (parent is DefaultFormalParameter) {
+      element = DefaultSuperFormalParameterElementImpl(
+        name: name,
+        nameOffset: nameOffset,
+        parameterKind: node.kind,
+      )..constantInitializer = parent.defaultValue;
+      _linker.elementNodes[element] = parent;
+      _enclosingContext.addParameter(name, element);
+    } else {
+      element = SuperFormalParameterElementImpl(
+        name: name,
+        nameOffset: nameOffset,
+        parameterKind: node.kind,
+      );
+      _linker.elementNodes[element] = node;
+      _enclosingContext.addParameter(null, element);
+    }
+    element.hasImplicitType = node.type == null && node.parameters == null;
+    element.metadata = _buildAnnotations(node.metadata);
+    _setCodeRange(element, node);
+
+    nameNode.staticElement = element;
+
+    // TODO(scheglov) check that we don't set reference for parameters
+    var fakeReference = Reference.root();
+    var holder = _EnclosingContext(fakeReference, element);
+    _withEnclosing(holder, () {
+      var formalParameters = node.parameters;
+      if (formalParameters != null) {
+        formalParameters.accept(this);
+        element.parameters = holder.parameters;
+      }
+
+      var typeParameters = node.typeParameters;
+      if (typeParameters != null) {
+        typeParameters.accept(this);
+        element.typeParameters = holder.typeParameters;
+      }
+    });
+
+    _buildType(node.type);
+  }
+
+  @override
   void visitTopLevelVariableDeclaration(
     covariant TopLevelVariableDeclarationImpl node,
   ) {
@@ -904,15 +957,14 @@
     element.fields = holder.properties.whereType<FieldElement>().toList();
     element.methods = holder.methods;
 
-    var constructors = holder.constructors;
-    if (constructors.isEmpty) {
-      var containerRef = element.reference!.getChild('@constructor');
-      constructors = [
-        ConstructorElementImpl('', -1)
-          ..isSynthetic = true
-          ..reference = containerRef.getChild(''),
-      ];
+    if (holder.constructors.isEmpty) {
+      holder.addConstructor(
+        '',
+        ConstructorElementImpl('', -1)..isSynthetic = true,
+      );
     }
+
+    var constructors = holder.constructors;
     element.constructors = constructors;
 
     // We have all fields and constructors.
@@ -997,16 +1049,26 @@
     if (relativeUriStr == null) {
       return null;
     }
-    var relativeUri = Uri.parse(relativeUriStr);
-    return resolveRelativeUri(_libraryBuilder.uri, relativeUri);
+
+    Uri relativeUri;
+    try {
+      relativeUri = Uri.parse(relativeUriStr);
+    } on FormatException {
+      return null;
+    }
+
+    var absoluteUri = resolveRelativeUri(_libraryBuilder.uri, relativeUri);
+
+    var sourceFactory = _linker.analysisContext.sourceFactory;
+    return rewriteToCanonicalUri(sourceFactory, absoluteUri);
   }
 
   LibraryElement? _selectLibrary(NamespaceDirective node) {
-    try {
-      var uri = _selectAbsoluteUri(node);
-      return _linker.elementFactory.libraryOfUri('$uri');
-    } on FormatException {
+    var uri = _selectAbsoluteUri(node);
+    if (uri == null) {
       return null;
+    } else {
+      return _linker.elementFactory.libraryOfUri('$uri');
     }
   }
 
@@ -1261,7 +1323,9 @@
 
   Reference? addParameter(String? name, ParameterElementImpl element) {
     parameters.add(element);
-    if (name != null) {
+    if (name == null) {
+      return null;
+    } else {
       return _bindReference('@parameter', name, element);
     }
   }
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index d605919..cf733cc 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -17,6 +17,7 @@
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/summary2/simply_bounded.dart';
+import 'package:analyzer/src/summary2/super_constructor_resolver.dart';
 import 'package:analyzer/src/summary2/top_level_inference.dart';
 import 'package:analyzer/src/summary2/type_alias.dart';
 import 'package:analyzer/src/summary2/types_builder.dart';
@@ -89,6 +90,7 @@
     _createTypeSystem();
     _buildEnumChildren();
     _resolveTypes();
+    SuperConstructorResolver(this).perform();
     _performTopLevelInference();
     _resolveConstructors();
     _resolveConstantInitializers();
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 3833cc9..b91377d 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -180,11 +180,18 @@
   LibraryElementImpl libraryOfUri2(String uriStr) {
     var element = libraryOfUri(uriStr);
     if (element == null) {
+      libraryOfUri(uriStr);
       throw StateError('No library: $uriStr');
     }
     return element;
   }
 
+  /// Return the [LibraryElementImpl] if it is ready.
+  LibraryElementImpl? libraryOfUriIfReady(String uriStr) {
+    var element = rootReference.getChild(uriStr).element;
+    return element is LibraryElementImpl ? element : null;
+  }
+
   /// We have linked the bundle, and need to disconnect its libraries, so
   /// that the client can re-add the bundle, this time read from bytes.
   void removeBundle(Set<String> uriStrSet) {
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index 3bf8d56..286730c 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -203,6 +203,12 @@
   }
 
   @override
+  void visitSuperFormalParameter(SuperFormalParameter node) {
+    node.metadata.accept(this);
+    node.parameters?.accept(this);
+  }
+
+  @override
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     node.metadata.accept(this);
   }
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 6e6cbe2..4208e83 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -376,6 +376,22 @@
   }
 
   @override
+  void visitSuperFormalParameter(SuperFormalParameter node) {
+    var outerScope = scope;
+
+    var element = node.declaredElement as SuperFormalParameterElementImpl;
+
+    scope = TypeParameterScope(scope, element.typeParameters);
+
+    node.type?.accept(this);
+    node.typeParameters?.accept(this);
+    node.parameters?.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+  }
+
+  @override
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     node.variables.accept(this);
   }
diff --git a/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart b/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart
new file mode 100644
index 0000000..694f27d
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/super_constructor_resolver.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/summary2/link.dart';
+import 'package:collection/collection.dart';
+
+/// Resolves the explicit or implicit super-constructors invoked by
+/// non-redirecting generative constructors.
+class SuperConstructorResolver {
+  final Linker _linker;
+
+  SuperConstructorResolver(this._linker);
+
+  void perform() {
+    for (var builder in _linker.builders.values) {
+      for (var unitElement in builder.element.units) {
+        for (var classElement in unitElement.classes) {
+          for (var constructorElement in classElement.constructors) {
+            _constructor(classElement, constructorElement);
+          }
+        }
+      }
+    }
+  }
+
+  void _constructor(ClassElement classElement, ConstructorElement element) {
+    element as ConstructorElementImpl;
+
+    // Constructors of mixin applications are already configured.
+    if (classElement.isMixinApplication) {
+      return;
+    }
+
+    // We handle only generative constructors here.
+    if (element.isFactory) {
+      return;
+    }
+
+    var invokesDefaultSuperConstructor = true;
+    var node = _linker.getLinkingNode(element);
+    if (node is ConstructorDeclaration) {
+      for (var initializer in node.initializers) {
+        if (initializer is RedirectingConstructorInvocation) {
+          invokesDefaultSuperConstructor = false;
+        } else if (initializer is SuperConstructorInvocation) {
+          invokesDefaultSuperConstructor = false;
+          var name = initializer.constructorName?.name ?? '';
+          element.superConstructor = classElement.supertype?.constructors
+              .where((element) => element.name == name)
+              .firstOrNull;
+        }
+      }
+    }
+
+    if (invokesDefaultSuperConstructor) {
+      element.superConstructor = classElement.supertype?.constructors
+          .where((element) => element.name.isEmpty)
+          .firstOrNull;
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 6640e26..714e348 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -141,7 +141,8 @@
 class _ConstructorInferenceNode extends _InferenceNode {
   final _InferenceWalker _walker;
   final ConstructorElement _constructor;
-  final List<_FieldFormalParameterWithField> _parameters = [];
+  final List<_FieldFormalParameter> _fieldParameters = [];
+  final List<_SuperFormalParameter> _superParameters = [];
 
   /// If this node is a constructor of a mixin application, this field
   /// is the corresponding constructor of the superclass.
@@ -156,8 +157,17 @@
         if (parameter.hasImplicitType) {
           var field = parameter.field;
           if (field != null) {
-            _parameters.add(
-              _FieldFormalParameterWithField(parameter, field),
+            _fieldParameters.add(
+              _FieldFormalParameter(parameter, field),
+            );
+          }
+        }
+      } else if (parameter is SuperFormalParameterElementImpl) {
+        if (parameter.hasImplicitType) {
+          var superParameter = parameter.superConstructorParameter;
+          if (superParameter != null) {
+            _superParameters.add(
+              _SuperFormalParameter(parameter, superParameter),
             );
           }
         }
@@ -187,10 +197,12 @@
 
   @override
   List<_InferenceNode> computeDependencies() {
-    var dependencies = _parameters
-        .map((e) => _walker.getNode(e.field))
-        .whereNotNull()
-        .toList();
+    var dependencies = [
+      ..._fieldParameters.map((e) => _walker.getNode(e.field)).whereNotNull(),
+      ..._superParameters
+          .map((e) => _walker.getNode(e.superParameter))
+          .whereNotNull(),
+    ];
 
     dependencies.addIfNotNull(
       _walker.getNode(_baseConstructor?.element),
@@ -201,9 +213,11 @@
 
   @override
   void evaluate() {
-    for (var parameterWithField in _parameters) {
-      var parameter = parameterWithField.parameter;
-      parameter.type = parameterWithField.field.type;
+    for (var fieldParameter in _fieldParameters) {
+      fieldParameter.parameter.type = fieldParameter.field.type;
+    }
+    for (var superParameter in _superParameters) {
+      superParameter.parameter.type = superParameter.superParameter.type;
     }
 
     // We have inferred formal parameter types of the base constructor.
@@ -241,20 +255,22 @@
 
   @override
   void markCircular(List<_InferenceNode> cycle) {
-    for (var parameterWithField in _parameters) {
-      var parameter = parameterWithField.parameter;
-      parameter.type = DynamicTypeImpl.instance;
+    for (var fieldParameter in _fieldParameters) {
+      fieldParameter.parameter.type = DynamicTypeImpl.instance;
+    }
+    for (var superParameter in _superParameters) {
+      superParameter.parameter.type = DynamicTypeImpl.instance;
     }
     isEvaluated = true;
   }
 }
 
 /// A field formal parameter with a non-nullable field.
-class _FieldFormalParameterWithField {
+class _FieldFormalParameter {
   final FieldFormalParameterElementImpl parameter;
   final FieldElement field;
 
-  _FieldFormalParameterWithField(this.parameter, this.field);
+  _FieldFormalParameter(this.parameter, this.field);
 }
 
 class _InferenceDependenciesCollector extends RecursiveAstVisitor<void> {
@@ -408,6 +424,14 @@
   }
 }
 
+/// A super formal parameter with a non-nullable super-constructor parameter.
+class _SuperFormalParameter {
+  final SuperFormalParameterElementImpl parameter;
+  final ParameterElement superParameter;
+
+  _SuperFormalParameter(this.parameter, this.superParameter);
+}
+
 class _VariableInferenceNode extends _InferenceNode {
   final _InferenceWalker _walker;
   final CompilationUnitElementImpl _unitElement;
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 9887d9c..53b27e3 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -206,6 +206,8 @@
     } else if (node is SimpleFormalParameter) {
       var element = node.declaredElement as ParameterElementImpl;
       element.type = node.type?.type ?? _dynamicType;
+    } else if (node is SuperFormalParameter) {
+      _superFormalParameter(node);
     } else if (node is VariableDeclarationList) {
       var type = node.type?.type;
       if (type != null) {
@@ -310,6 +312,22 @@
     }
   }
 
+  void _superFormalParameter(SuperFormalParameter node) {
+    var element = node.declaredElement as SuperFormalParameterElementImpl;
+    var parameterList = node.parameters;
+    if (parameterList != null) {
+      var type = _buildFunctionType(
+        node.typeParameters,
+        node.type,
+        parameterList,
+        _nullability(node, node.question != null),
+      );
+      element.type = type;
+    } else {
+      element.type = node.type?.type ?? _dynamicType;
+    }
+  }
+
   List<TypeParameterElement> _typeParameters(TypeParameterList? node) {
     if (node == null) {
       return const <TypeParameterElement>[];
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index 6a393dc..682acc6 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/analysis_options/error/option_codes.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/lint/config.dart';
@@ -139,6 +138,7 @@
   static const String implicitDynamic = 'implicit-dynamic';
 
   // Language options (see AnalysisOptionsImpl for documentation).
+  static const String strictCasts = 'strict-casts';
   static const String strictInference = 'strict-inference';
   static const String strictRawTypes = 'strict-raw-types';
 
@@ -177,7 +177,11 @@
   ];
 
   /// Supported `analyzer` language options.
-  static const List<String> languageOptions = [strictInference, strictRawTypes];
+  static const List<String> languageOptions = [
+    strictCasts,
+    strictInference,
+    strictRawTypes,
+  ];
 
   /// Supported 'analyzer' optional checks options.
   static const List<String> optionalChecksOptions = [
@@ -360,7 +364,7 @@
 
   /// Pretty String listing legal values.
   static final String legalValueString =
-      StringUtilities.printListOfQuotedNames(legalValues);
+      legalValues.quotedAndCommaSeparatedWithAnd;
 
   /// Lazily populated set of error codes.
   static final Set<String> _errorCodes =
@@ -750,6 +754,9 @@
       AnalysisOptionsImpl options, Object? feature, Object value) {
     var boolValue = toBool(value);
     if (boolValue != null) {
+      if (feature == AnalyzerOptions.strictCasts) {
+        options.strictCasts = boolValue;
+      }
       if (feature == AnalyzerOptions.strictInference) {
         options.strictInference = boolValue;
       }
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 3d179d7..7c2569f 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -14,7 +14,6 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart' show CompileTimeErrorCode;
@@ -37,18 +36,13 @@
 
 /// Checks the body of functions and properties.
 class CodeChecker extends RecursiveAstVisitor {
-  final TypeSystemImpl rules;
-  final TypeProvider typeProvider;
-  final InheritanceManager3 inheritance;
-  final AnalysisErrorListener reporter;
+  final TypeSystemImpl _typeSystem;
+  final TypeProvider _typeProvider;
+  final ErrorReporter _errorReporter;
 
   late final FeatureSet _featureSet;
 
-  CodeChecker(TypeProvider typeProvider, TypeSystemImpl rules, this.inheritance,
-      AnalysisErrorListener reporter)
-      : typeProvider = typeProvider,
-        rules = rules,
-        reporter = reporter;
+  CodeChecker(this._typeProvider, this._typeSystem, this._errorReporter);
 
   bool get _isNonNullableByDefault =>
       _featureSet.isEnabled(Feature.non_nullable);
@@ -82,21 +76,14 @@
   }
 
   void checkAssignment(Expression expr, DartType to) {
-    checkForCast(expr, from: expr.typeOrThrow, to: to);
+    _checkImplicitCast(expr, from: expr.typeOrThrow, to: to);
   }
 
-  /// Analyzer checks boolean conversions, but we need to check too, because
-  /// it uses the default assignability rules that allow `dynamic` and `Object`
-  /// to be assigned to bool with no message.
-  void checkBoolean(Expression expr) =>
-      checkAssignment(expr, typeProvider.boolType);
-
   void checkCollectionElement(
       CollectionElement? element, DartType expectedType) {
     if (element is ForElement) {
       checkCollectionElement(element.body, expectedType);
     } else if (element is IfElement) {
-      checkBoolean(element.condition);
       checkCollectionElement(element.thenElement, expectedType);
       checkCollectionElement(element.elseElement, expectedType);
     } else if (element is Expression) {
@@ -104,11 +91,11 @@
     } else if (element is SpreadElement) {
       // Spread expression may be dynamic in which case it's implicitly downcast
       // to Iterable<dynamic>
-      DartType expressionCastType = typeProvider.iterableDynamicType;
+      DartType expressionCastType = _typeProvider.iterableDynamicType;
       checkAssignment(element.expression, expressionCastType);
 
       var exprType = element.expression.typeOrThrow;
-      var asIterableType = exprType.asInstanceOf(typeProvider.iterableElement);
+      var asIterableType = exprType.asInstanceOf(_typeProvider.iterableElement);
 
       if (asIterableType != null) {
         var elementType = asIterableType.typeArguments[0];
@@ -120,24 +107,11 @@
     }
   }
 
-  void checkForCast(
-    Expression expr, {
-    required DartType from,
-    required DartType to,
-  }) {
-    if (expr is ParenthesizedExpression) {
-      checkForCast(expr.expression, from: from, to: to);
-    } else {
-      _checkImplicitCast(expr, from: from, to: to);
-    }
-  }
-
   void checkMapElement(CollectionElement? element, DartType expectedKeyType,
       DartType expectedValueType) {
     if (element is ForElement) {
       checkMapElement(element.body, expectedKeyType, expectedValueType);
     } else if (element is IfElement) {
-      checkBoolean(element.condition);
       checkMapElement(element.thenElement, expectedKeyType, expectedValueType);
       checkMapElement(element.elseElement, expectedKeyType, expectedValueType);
     } else if (element is MapLiteralEntry) {
@@ -146,12 +120,12 @@
     } else if (element is SpreadElement) {
       // Spread expression may be dynamic in which case it's implicitly downcast
       // to Map<dynamic, dynamic>
-      DartType expressionCastType = typeProvider.mapType(
+      DartType expressionCastType = _typeProvider.mapType(
           DynamicTypeImpl.instance, DynamicTypeImpl.instance);
       checkAssignment(element.expression, expressionCastType);
 
       var exprType = element.expression.typeOrThrow;
-      var asMapType = exprType.asInstanceOf(typeProvider.mapElement);
+      var asMapType = exprType.asInstanceOf(_typeProvider.mapElement);
 
       if (asMapType != null) {
         var elementKeyType = asMapType.typeArguments[0];
@@ -178,17 +152,12 @@
 
   @override
   void visitAssignmentExpression(AssignmentExpression node) {
-    var left = node.leftHandSide;
-    var right = node.rightHandSide;
     Token operator = node.operator;
     TokenType operatorType = operator.type;
     if (operatorType == TokenType.EQ ||
         operatorType == TokenType.QUESTION_QUESTION_EQ) {
-      checkForCast(right, from: right.typeOrThrow, to: node.writeType!);
-    } else if (operatorType == TokenType.AMPERSAND_AMPERSAND_EQ ||
-        operatorType == TokenType.BAR_BAR_EQ) {
-      checkBoolean(left);
-      checkBoolean(right);
+      var right = node.rightHandSide;
+      _checkImplicitCast(right, from: right.typeOrThrow, to: node.writeType!);
     } else {
       _checkCompoundAssignment(node);
     }
@@ -196,28 +165,6 @@
   }
 
   @override
-  void visitBinaryExpression(BinaryExpression node) {
-    var op = node.operator;
-    if (!op.isUserDefinableOperator) {
-      switch (op.type) {
-        case TokenType.AMPERSAND_AMPERSAND:
-        case TokenType.BAR_BAR:
-          checkBoolean(node.leftOperand);
-          checkBoolean(node.rightOperand);
-          break;
-        case TokenType.BANG_EQ:
-        case TokenType.BANG_EQ_EQ:
-        case TokenType.EQ_EQ_EQ:
-        case TokenType.QUESTION_QUESTION:
-          break;
-        default:
-          assert(false);
-      }
-    }
-    node.visitChildren(this);
-  }
-
-  @override
   void visitComment(Comment node) {
     // skip, no need to do typechecking inside comments (they may contain
     // comment references which would require resolution).
@@ -231,31 +178,9 @@
 
   @override
   void visitConditionalExpression(ConditionalExpression node) {
-    checkBoolean(node.condition);
     node.visitChildren(this);
   }
 
-  /// Check constructor declaration to ensure correct super call placement.
-  @override
-  void visitConstructorDeclaration(ConstructorDeclaration node) {
-    node.visitChildren(this);
-
-    final init = node.initializers;
-    for (int i = 0, last = init.length - 1; i < last; i++) {
-      final initializer = init[i];
-      if (initializer is SuperConstructorInvocation) {
-        // TODO(srawlins): Don't report this when
-        //  [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR] or
-        //  [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS] is reported for
-        //  this constructor.
-        var source = (node.root as CompilationUnit).declaredElement!.source;
-        var token = initializer.superKeyword;
-        reporter.onError(AnalysisError(source, token.offset, token.length,
-            CompileTimeErrorCode.INVALID_SUPER_INVOCATION, [initializer]));
-      }
-    }
-  }
-
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     var field = node.fieldName;
@@ -281,12 +206,6 @@
   }
 
   @override
-  void visitDoStatement(DoStatement node) {
-    checkBoolean(node.condition);
-    node.visitChildren(this);
-  }
-
-  @override
   void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _checkReturnOrYield(node.expression, node);
     node.visitChildren(this);
@@ -305,36 +224,12 @@
   }
 
   @override
-  void visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
-    var condition = node.condition;
-    if (condition != null) {
-      checkBoolean(condition);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
-  void visitForPartsWithExpression(ForPartsWithExpression node) {
-    var condition = node.condition;
-    if (condition != null) {
-      checkBoolean(condition);
-    }
-    node.visitChildren(this);
-  }
-
-  @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     _checkFunctionApplication(node);
     node.visitChildren(this);
   }
 
   @override
-  void visitIfStatement(IfStatement node) {
-    checkBoolean(node.condition);
-    node.visitChildren(this);
-  }
-
-  @override
   void visitIndexExpression(IndexExpression node) {
     var element = node.writeOrReadElement;
     if (element is MethodElement) {
@@ -403,11 +298,7 @@
 
   @override
   void visitPrefixExpression(PrefixExpression node) {
-    if (node.operator.type == TokenType.BANG) {
-      checkBoolean(node.operand);
-    } else {
-      _checkUnary(node, node.operand, node.operator, node.staticElement);
-    }
+    _checkUnary(node, node.operand, node.operator, node.staticElement);
     node.visitChildren(this);
   }
 
@@ -523,7 +414,7 @@
       for (VariableDeclaration variable in node.variables) {
         var initializer = variable.initializer;
         if (initializer != null) {
-          checkForCast(initializer,
+          _checkImplicitCast(initializer,
               from: initializer.typeOrThrow, to: type.typeOrThrow);
         }
       }
@@ -533,12 +424,6 @@
   }
 
   @override
-  void visitWhileStatement(WhileStatement node) {
-    checkBoolean(node.condition);
-    node.visitChildren(this);
-  }
-
-  @override
   void visitYieldStatement(YieldStatement node) {
     _checkReturnOrYield(node.expression, node, yieldStar: node.star != null);
     node.visitChildren(this);
@@ -559,7 +444,7 @@
 
       // Refine the return type.
       var rhsType = expr.rightHandSide.typeOrThrow;
-      var returnType = rules.refineBinaryExpressionType(
+      var returnType = _typeSystem.refineBinaryExpressionType(
         expr.readType!,
         op,
         rhsType,
@@ -591,30 +476,29 @@
     }
   }
 
-  /// Given an expression [expr] of type [fromType], returns true if an implicit
-  /// downcast is required, false if it is not, or null if the types are
-  /// unrelated.
-  bool? _checkFunctionTypeCasts(
-      Expression expr, FunctionType to, DartType fromType) {
+  /// Returns true if an implicit downcast is required to assign an expression
+  /// of type [fromType] to type [to], false if it is not, or null if the
+  /// types are unrelated.
+  bool? _checkFunctionTypeCasts(FunctionType to, DartType fromType) {
     bool callTearoff = false;
     FunctionType? from;
     if (fromType is FunctionType) {
       from = fromType;
     } else if (fromType is InterfaceType) {
-      from = rules.getCallMethodType(fromType);
+      from = _typeSystem.getCallMethodType(fromType);
       callTearoff = true;
     }
     if (from == null) {
       return null; // unrelated
     }
 
-    if (rules.isSubtypeOf(from, to)) {
+    if (_typeSystem.isSubtypeOf(from, to)) {
       // Sound subtype.
       // However we may still need cast if we have a call tearoff.
       return callTearoff;
     }
 
-    if (rules.isSubtypeOf(to, from)) {
+    if (_typeSystem.isSubtypeOf(to, from)) {
       // Assignable, but needs cast.
       return true;
     }
@@ -640,6 +524,7 @@
       return;
     }
 
+    expr = expr.unParenthesized;
     if (_needsImplicitCast(expr, to: to, from: from) == true) {
       _recordImplicitCast(expr, to,
           from: from,
@@ -677,8 +562,8 @@
 
       // Refine the return type.
       var functionType = element.type;
-      var rhsType = typeProvider.intType;
-      var returnType = rules.refineBinaryExpressionType(
+      var rhsType = _typeProvider.intType;
+      var returnType = _typeSystem.refineBinaryExpressionType(
         node.readType!,
         TokenType.PLUS,
         rhsType,
@@ -720,18 +605,18 @@
     if (body.isAsynchronous) {
       if (body.isGenerator) {
         // Stream<T> -> T
-        expectedElement = typeProvider.streamElement;
+        expectedElement = _typeProvider.streamElement;
       } else {
         // Future<T> -> FutureOr<T>
-        var typeArg = (type.element == typeProvider.futureElement)
+        var typeArg = (type.element == _typeProvider.futureElement)
             ? (type as InterfaceType).typeArguments[0]
-            : typeProvider.dynamicType;
-        return typeProvider.futureOrType(typeArg);
+            : _typeProvider.dynamicType;
+        return _typeProvider.futureOrType(typeArg);
       }
     } else {
       if (body.isGenerator) {
         // Iterable<T> -> T
-        expectedElement = typeProvider.iterableElement;
+        expectedElement = _typeProvider.iterableElement;
       } else {
         // T -> T
         return type;
@@ -741,7 +626,7 @@
       if (type.isDynamic) {
         // Ensure it's at least a Stream / Iterable.
         return expectedElement.instantiate(
-          typeArguments: [typeProvider.dynamicType],
+          typeArguments: [_typeProvider.dynamicType],
           nullabilitySuffix: _noneOrStarSuffix,
         );
       } else {
@@ -778,7 +663,7 @@
     if (type is FunctionType) {
       return type;
     } else if (type is InterfaceType) {
-      return rules.getCallMethodType(type);
+      return _typeSystem.getCallMethodType(type);
     }
     return null;
   }
@@ -796,17 +681,17 @@
     if (from.isVoid) return null;
 
     if (to is FunctionType) {
-      var needsCast = _checkFunctionTypeCasts(expr, to, from);
+      var needsCast = _checkFunctionTypeCasts(to, from);
       if (needsCast != null) return needsCast;
     }
 
     // fromT <: toT, no coercion needed.
-    if (rules.isSubtypeOf(from, to)) {
+    if (_typeSystem.isSubtypeOf(from, to)) {
       return false;
     }
 
     // Down cast or legal sideways cast, coercion needed.
-    if (rules.isAssignableTo(from, to)) {
+    if (_typeSystem.isAssignableTo(from, to)) {
       return true;
     }
 
@@ -814,7 +699,7 @@
     // In this case, we're more permissive than assignability.
     if (to.isDartAsyncFutureOr) {
       var to1 = (to as InterfaceType).typeArguments[0];
-      var to2 = typeProvider.futureType(to1);
+      var to2 = _typeProvider.futureType(to1);
       return _needsImplicitCast(expr, to: to1, from: from) == true ||
           _needsImplicitCast(expr, to: to2, from: from) == true;
     }
@@ -837,9 +722,9 @@
       bool forSpreadValue = false}) {
     // If this is an implicit tearoff, we need to mark the cast, but we don't
     // want to warn if it's a legal subtype.
-    if (from is InterfaceType && rules.acceptsFunctionType(to)) {
-      var type = rules.getCallMethodType(from);
-      if (type != null && rules.isSubtypeOf(type, to)) {
+    if (from is InterfaceType && _typeSystem.acceptsFunctionType(to)) {
+      var type = _typeSystem.getCallMethodType(from);
+      if (type != null && _typeSystem.isSubtypeOf(type, to)) {
         return;
       }
     }
@@ -902,24 +787,23 @@
     }
   }
 
-  void _recordMessage(AstNode node, ErrorCode errorCode, List arguments) {
-    // TODO(brianwilkerson) Convert this class to use an ErrorReporter so that
-    //  the logic for converting types is in one place.
-    arguments = arguments.map((argument) {
-      if (argument is DartType) {
-        return argument.getDisplayString(withNullability: false);
-      } else {
-        return argument;
-      }
-    }).toList();
+  void _recordMessage(
+      AstNode node, ErrorCode errorCode, List<Object> arguments) {
+    var argumentStrings = [
+      for (var argument in arguments)
+        if (argument is DartType)
+          argument.getDisplayString(withNullability: false)
+        else
+          argument.toString(),
+    ];
 
     int begin = node is AnnotatedNode
         ? node.firstTokenAfterCommentAndMetadata.offset
         : node.offset;
     int length = node.end - begin;
     var source = (node.root as CompilationUnit).declaredElement!.source;
-    var error = AnalysisError(source, begin, length, errorCode, arguments);
-    reporter.onError(error);
+    _errorReporter.reportError(
+        AnalysisError(source, begin, length, errorCode, argumentStrings));
   }
 
   void _visitForEachParts(ForEachParts node, SimpleIdentifier loopVariable) {
@@ -941,8 +825,8 @@
     }
     // Find the element type of the sequence.
     var sequenceElement = awaitKeyword != null
-        ? typeProvider.streamElement
-        : typeProvider.iterableElement;
+        ? _typeProvider.streamElement
+        : _typeProvider.iterableElement;
     var iterableType = node.iterable.typeOrThrow;
     var elementType = _getInstanceTypeArgument(iterableType, sequenceElement);
 
@@ -951,11 +835,11 @@
     // we'll do a separate cast of the dynamic element to the variable's type.
     if (elementType == null) {
       var sequenceType = sequenceElement.instantiate(
-        typeArguments: [typeProvider.dynamicType],
+        typeArguments: [_typeProvider.dynamicType],
         nullabilitySuffix: _noneOrStarSuffix,
       );
 
-      if (rules.isSubtypeOf(sequenceType, iterableType)) {
+      if (_typeSystem.isSubtypeOf(sequenceType, iterableType)) {
         _recordImplicitCast(node.iterable, sequenceType, from: iterableType);
         elementType = DynamicTypeImpl.instance;
       }
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 195647b..8a894ec 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -636,3 +636,14 @@
     return class_(name).unnamedConstructor!;
   }
 }
+
+extension ExecutableElementExtensions on ExecutableElement {
+  SuperFormalParameterElement superFormalParameter(String name) {
+    for (var parameter in parameters) {
+      if (parameter is SuperFormalParameterElement && parameter.name == name) {
+        return parameter;
+      }
+    }
+    throw StateError('Not found: $name');
+  }
+}
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 21b51e7..b25d26f 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -27,6 +27,10 @@
     return result;
   }
 
+  AdjacentStrings adjacentStrings(String search) {
+    return _node(search, (n) => n is AdjacentStrings);
+  }
+
   Annotation annotation(String search) {
     return _node(search, (n) => n is Annotation);
   }
@@ -35,10 +39,18 @@
     return _node(search, (n) => true);
   }
 
+  ArgumentList argumentList(String search) {
+    return _node(search, (n) => n is ArgumentList);
+  }
+
   AsExpression as_(String search) {
     return _node(search, (n) => n is AsExpression);
   }
 
+  AssertStatement assertStatement(String search) {
+    return _node(search, (n) => n is AssertStatement);
+  }
+
   AssignmentExpression assignment(String search) {
     return _node(search, (n) => n is AssignmentExpression);
   }
@@ -55,6 +67,10 @@
     return _node(search, (n) => n is Block);
   }
 
+  BlockFunctionBody blockFunctionBody(String search) {
+    return _node(search, (n) => n is BlockFunctionBody);
+  }
+
   BooleanLiteral booleanLiteral(String search) {
     return _node(search, (n) => n is BooleanLiteral);
   }
@@ -83,6 +99,10 @@
     return _node(search, (n) => n is CollectionElement);
   }
 
+  Comment comment(String search) {
+    return _node(search, (n) => n is Comment);
+  }
+
   CommentReference commentReference(String search) {
     return _node(search, (n) => n is CommentReference);
   }
@@ -111,6 +131,10 @@
     return _node(search, (n) => n is ContinueStatement);
   }
 
+  DeclaredIdentifier declaredIdentifier(String search) {
+    return _node(search, (n) => n is DeclaredIdentifier);
+  }
+
   DefaultFormalParameter defaultParameter(String search) {
     return _node(search, (n) => n is DefaultFormalParameter);
   }
@@ -123,6 +147,10 @@
     return _node(search, (n) => n is DoubleLiteral);
   }
 
+  EnumConstantDeclaration enumConstantDeclaration(String search) {
+    return _node(search, (n) => n is EnumConstantDeclaration);
+  }
+
   EnumDeclaration enumDeclaration(String search) {
     return _node(search, (n) => n is EnumDeclaration);
   }
@@ -135,10 +163,18 @@
     return _node(search, (n) => n is Expression);
   }
 
+  ExpressionFunctionBody expressionFunctionBody(String search) {
+    return _node(search, (n) => n is ExpressionFunctionBody);
+  }
+
   ExpressionStatement expressionStatement(String search) {
     return _node(search, (n) => n is ExpressionStatement);
   }
 
+  ExtendsClause extendsClause(String search) {
+    return _node(search, (n) => n is ExtendsClause);
+  }
+
   ExtensionDeclaration extensionDeclaration(String search) {
     return _node(search, (n) => n is ExtensionDeclaration);
   }
@@ -155,6 +191,26 @@
     return _node(search, (n) => n is FieldFormalParameter);
   }
 
+  ForEachPartsWithDeclaration forEachPartsWithDeclaration(String search) {
+    return _node(search, (n) => n is ForEachPartsWithDeclaration);
+  }
+
+  ForEachPartsWithIdentifier forEachPartsWithIdentifier(String search) {
+    return _node(search, (n) => n is ForEachPartsWithIdentifier);
+  }
+
+  FormalParameterList formalParameterList(String search) {
+    return _node(search, (n) => n is FormalParameterList);
+  }
+
+  ForPartsWithDeclarations forPartsWithDeclarations(String search) {
+    return _node(search, (n) => n is ForPartsWithDeclarations);
+  }
+
+  ForPartsWithExpression forPartsWithExpression(String search) {
+    return _node(search, (n) => n is ForPartsWithExpression);
+  }
+
   ForStatement forStatement(String search) {
     return _node(search, (n) => n is ForStatement);
   }
@@ -167,6 +223,10 @@
     return _node(search, (n) => n is FunctionDeclaration);
   }
 
+  FunctionDeclarationStatement functionDeclarationStatement(String search) {
+    return _node(search, (n) => n is FunctionDeclarationStatement);
+  }
+
   FunctionExpression functionExpression(String search) {
     return _node(search, (n) => n is FunctionExpression);
   }
@@ -195,6 +255,10 @@
     return _node(search, (n) => n is GenericTypeAlias);
   }
 
+  HideCombinator hideCombinator(String search) {
+    return _node(search, (n) => n is HideCombinator);
+  }
+
   IfElement ifElement(String search) {
     return _node(search, (n) => n is IfElement);
   }
@@ -203,6 +267,10 @@
     return _node(search, (n) => n is IfStatement);
   }
 
+  ImplementsClause implementsClause(String search) {
+    return _node(search, (n) => n is ImplementsClause);
+  }
+
   ImplicitCallReference implicitCallReference(String search) {
     return _node(search, (n) => n is ImplicitCallReference);
   }
@@ -223,6 +291,10 @@
     return _node(search, (n) => n is IntegerLiteral);
   }
 
+  InterpolationExpression interpolationExpression(String search) {
+    return _node(search, (n) => n is InterpolationExpression);
+  }
+
   IsExpression isExpression(String search) {
     return _node(search, (n) => n is IsExpression);
   }
@@ -231,14 +303,26 @@
     return _node(search, (n) => n is Label);
   }
 
+  LabeledStatement labeledStatement(String search) {
+    return _node(search, (n) => n is LabeledStatement);
+  }
+
   LibraryDirective library(String search) {
     return _node(search, (n) => n is LibraryDirective);
   }
 
+  LibraryIdentifier libraryIdentifier(String search) {
+    return _node(search, (n) => n is LibraryIdentifier);
+  }
+
   ListLiteral listLiteral(String search) {
     return _node(search, (n) => n is ListLiteral);
   }
 
+  MapLiteralEntry mapLiteralEntry(String search) {
+    return _node(search, (n) => n is MapLiteralEntry);
+  }
+
   MethodDeclaration methodDeclaration(String search) {
     return _node(search, (n) => n is MethodDeclaration);
   }
@@ -263,6 +347,14 @@
     return _node(search, (n) => n is NamedType);
   }
 
+  NativeClause nativeClause(String search) {
+    return _node(search, (n) => n is NativeClause);
+  }
+
+  NativeFunctionBody nativeFunctionBody(String search) {
+    return _node(search, (n) => n is NativeFunctionBody);
+  }
+
   NullLiteral nullLiteral(String search) {
     return _node(search, (n) => n is NullLiteral);
   }
@@ -308,18 +400,35 @@
     return _node(search, (n) => n is PropertyAccess);
   }
 
+  RedirectingConstructorInvocation redirectingConstructorInvocation(
+      String search) {
+    return _node(search, (n) => n is RedirectingConstructorInvocation);
+  }
+
   RethrowExpression rethrow_(String search) {
     return _node(search, (n) => n is RethrowExpression);
   }
 
+  ReturnStatement returnStatement(String search) {
+    return _node(search, (n) => n is ReturnStatement);
+  }
+
   SetOrMapLiteral setOrMapLiteral(String search) {
     return _node(search, (n) => n is SetOrMapLiteral);
   }
 
+  ShowCombinator showCombinator(String search) {
+    return _node(search, (n) => n is ShowCombinator);
+  }
+
   SimpleIdentifier simple(String search) {
     return _node(search, (_) => true);
   }
 
+  SimpleFormalParameter simpleFormalParameter(String search) {
+    return _node(search, (n) => n is SimpleFormalParameter);
+  }
+
   SimpleFormalParameter simpleParameter(String search) {
     return _node(search, (n) => n is SimpleFormalParameter);
   }
@@ -344,6 +453,18 @@
     return _node(search, (n) => n is SuperConstructorInvocation);
   }
 
+  SuperFormalParameter superFormalParameter(String search) {
+    return _node(search, (n) => n is SuperFormalParameter);
+  }
+
+  SwitchCase switchCase(String search) {
+    return _node(search, (n) => n is SwitchCase);
+  }
+
+  SwitchDefault switchDefault(String search) {
+    return _node(search, (n) => n is SwitchDefault);
+  }
+
   SwitchStatement switchStatement(String search) {
     return _node(search, (n) => n is SwitchStatement);
   }
@@ -377,10 +498,18 @@
     throw StateError('$name');
   }
 
+  TryStatement tryStatement(String search) {
+    return _node(search, (n) => n is TryStatement);
+  }
+
   TypeAnnotation typeAnnotation(String search) {
     return _node(search, (n) => n is TypeAnnotation);
   }
 
+  TypeArgumentList typeArgumentList(String search) {
+    return _node(search, (n) => n is TypeArgumentList);
+  }
+
   TypedLiteral typedLiteral(String search) {
     return _node(search, (n) => n is TypedLiteral);
   }
@@ -393,6 +522,10 @@
     return _node(search, (n) => n is TypeParameter);
   }
 
+  TypeParameterList typeParameterList(String search) {
+    return _node(search, (n) => n is TypeParameterList);
+  }
+
   VariableDeclaration variableDeclaration(String search) {
     return _node(search, (n) => n is VariableDeclaration);
   }
@@ -401,10 +534,22 @@
     return _node(search, (n) => n is VariableDeclarationList);
   }
 
+  VariableDeclarationStatement variableDeclarationStatement(String search) {
+    return _node(search, (n) => n is VariableDeclarationStatement);
+  }
+
   WhileStatement whileStatement(String search) {
     return _node(search, (n) => n is WhileStatement);
   }
 
+  WithClause withClause(String search) {
+    return _node(search, (n) => n is WithClause);
+  }
+
+  YieldStatement yieldStatement(String search) {
+    return _node(search, (n) => n is YieldStatement);
+  }
+
   T _node<T>(String search, bool Function(AstNode) predicate) {
     int offset = this.offset(search);
 
@@ -417,7 +562,7 @@
     var result = node.thisOrAncestorMatching(predicate);
     if (result == null) {
       throw StateError(
-          'The node for |$search| had no matching ancestor in:\n$content');
+          'The node for |$search| had no matching ancestor in:\n$content\n$unit');
     }
     return result as T;
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index a7ecd5a..44a6369 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -7,13 +7,9 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
-import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:meta/meta.dart';
 
-@Deprecated('Use createMockSdk() instead')
-const String sdkRoot = '/sdk';
-
 final MockSdkLibrary _LIB_ASYNC = MockSdkLibrary('async', [
   MockSdkLibraryUnit(
     'async/async.dart',
@@ -47,7 +43,7 @@
 
   Future<T> whenComplete(action());
 
-  static Future<List<T>> wait<T>(Iterable<Future<T>> futures, 
+  static Future<List<T>> wait<T>(Iterable<Future<T>> futures,
     {void cleanUp(T successValue)?}) => throw 0;
 }
 
@@ -705,6 +701,10 @@
   const Double();
 }
 
+class IntPtr extends NativeType {
+  const IntPtr();
+}
+
 class Pointer<T extends NativeType> extends NativeType {
   external factory Pointer.fromAddress(int ptr);
 
@@ -789,6 +789,50 @@
   final bool isLeaf;
   const FfiNative(this.nativeName, {this.isLeaf: false});
 }
+
+class Abi {
+  static const androidArm = _androidArm;
+  static const androidArm64 = _androidArm64;
+  static const androidIA32 = _androidIA32;
+
+  static const _androidArm = Abi._(_Architecture.arm, _OS.android);
+  static const _androidArm64 = Abi._(_Architecture.arm64, _OS.android);
+  static const _androidIA32 = Abi._(_Architecture.ia32, _OS.android);
+
+  final _OS _os;
+
+  final _Architecture _architecture;
+
+  const Abi._(this._architecture, this._os);
+}
+
+enum _Architecture {
+  arm,
+  arm64,
+  ia32,
+  x64,
+}
+
+enum _OS {
+  android,
+  fuchsia,
+  ios,
+  linux,
+  macos,
+  windows,
+}
+
+
+class AbiSpecificInteger extends NativeType {
+  const AbiSpecificInteger();
+}
+
+class AbiSpecificIntegerMapping {
+  final Map<Abi, NativeType> mapping;
+
+  const AbiSpecificIntegerMapping(this.mapping);
+}
+
 ''',
   )
 ]);
@@ -1094,8 +1138,9 @@
       throw 0;
 }
 
-enum ProcessStartMode {
-  normal,
+class ProcessStartMode {
+  static const normal = const ProcessStartMode._internal(0);
+  const ProcessStartMode._internal(int mode);
 }
 
 abstract class Process {
@@ -1144,7 +1189,6 @@
     bool errorsAreFatal = true,
     bool? checked,
     Map<String, String>? environment,
-    @deprecated Uri? packageRoot,
     Uri? packageConfig,
     bool automaticPackageResolution = false,
     String? debugName,
@@ -1255,51 +1299,6 @@
       );
 }
 
-@Deprecated('Use createMockSdk() and FolderBasedDartSdk instead.')
-class MockSdk extends FolderBasedDartSdk {
-  /// Optional [additionalLibraries] should have unique URIs, and paths in
-  /// their units are relative (will be put into `sdkRoot/lib`).
-  factory MockSdk({
-    required MemoryResourceProvider resourceProvider,
-    List<MockSdkLibrary> additionalLibraries = const [],
-  }) {
-    var sdkDirectory = resourceProvider.getFolder(
-      resourceProvider.convertPath(sdkRoot),
-    );
-    createMockSdk(
-      resourceProvider: resourceProvider,
-      root: sdkDirectory,
-      additionalLibraries: additionalLibraries,
-    );
-    return MockSdk._(resourceProvider, sdkDirectory);
-  }
-
-  /// Initialize a newly created SDK to represent the Dart SDK installed in the
-  /// [sdkDirectory].
-  MockSdk._(ResourceProvider resourceProvider, Folder sdkDirectory)
-      : super(resourceProvider, sdkDirectory);
-
-  @override
-  MemoryResourceProvider get resourceProvider {
-    return super.resourceProvider as MemoryResourceProvider;
-  }
-
-  @override
-  List<SdkLibraryImpl> get sdkLibraries {
-    return super.sdkLibraries.map((library) {
-      var pathContext = resourceProvider.pathContext;
-      var path = library.path;
-      if (pathContext.isAbsolute(path)) {
-        return library;
-      }
-      return SdkLibraryImpl(library.shortName)
-        ..path = pathContext.join(directory.path, 'lib', path)
-        ..category = library.category
-        ..documented = library.isDocumented;
-    }).toList();
-  }
-}
-
 class MockSdkLibrary implements SdkLibrary {
   final String name;
   final String categories;
diff --git a/pkg/analyzer/lib/src/util/performance/operation_performance.dart b/pkg/analyzer/lib/src/util/performance/operation_performance.dart
index 3a090d2..3d5ac61b 100644
--- a/pkg/analyzer/lib/src/util/performance/operation_performance.dart
+++ b/pkg/analyzer/lib/src/util/performance/operation_performance.dart
@@ -155,12 +155,9 @@
   ) async {
     var child = _existingOrNewChild(name);
     child._timer.start();
-
-    try {
-      return await operation(child);
-    } finally {
-      child._timer.stop();
-    }
+    var result = await operation(child);
+    child._timer.stop();
+    return result;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/util/uri.dart b/pkg/analyzer/lib/src/util/uri.dart
index 963dafc..4d60895 100644
--- a/pkg/analyzer/lib/src/util/uri.dart
+++ b/pkg/analyzer/lib/src/util/uri.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.
 
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:path/path.dart';
 
 String fileUriToNormalizedPath(Context context, Uri fileUri) {
@@ -10,3 +12,19 @@
   path = context.normalize(path);
   return path;
 }
+
+/// Return the canonical URI for the given [absoluteUri], for example a `file`
+/// URI to the corresponding `package` URI. If the URI is not valid, so does
+/// not represent a valid file path, return `null`.
+Uri? rewriteToCanonicalUri(SourceFactory sourceFactory, Uri absoluteUri) {
+  var source = sourceFactory.forUri2(absoluteUri);
+  if (source == null) {
+    return null;
+  }
+
+  if (source is InSummarySource) {
+    return source.uri;
+  }
+
+  return sourceFactory.pathToUri(source.fullName);
+}
diff --git a/pkg/analyzer/lib/src/util/yaml.dart b/pkg/analyzer/lib/src/util/yaml.dart
index dfa104e..416828c 100644
--- a/pkg/analyzer/lib/src/util/yaml.dart
+++ b/pkg/analyzer/lib/src/util/yaml.dart
@@ -106,12 +106,15 @@
 }
 
 extension YamlMapExtensions on YamlMap {
-  /// Return the value associated with the key whose value matches the given
-  /// [key], or `null` if there is no matching key.
-  YamlNode? valueAt(String key) {
-    for (var keyNode in nodes.keys) {
-      if (keyNode is YamlScalar && keyNode.value == key) {
-        return nodes[keyNode];
+  /// Return [nodes] as a Map with [YamlNode] keys.
+  Map<YamlNode, YamlNode> get nodeMap => nodes.cast<YamlNode, YamlNode>();
+
+  /// Return the [YamlNode] associated with the given [key], or `null` if there
+  /// is no matching key.
+  YamlNode? getKey(String key) {
+    for (YamlNode k in nodes.keys) {
+      if (k is YamlScalar && k.value == key) {
+        return k;
       }
     }
     return null;
@@ -128,17 +131,14 @@
     return null;
   }
 
-  /// Return the [YamlNode] associated with the given [key], or `null` if there
-  /// is no matching key.
-  YamlNode? getKey(String key) {
-    for (YamlNode k in nodes.keys) {
-      if (k is YamlScalar && k.value == key) {
-        return k;
+  /// Return the value associated with the key whose value matches the given
+  /// [key], or `null` if there is no matching key.
+  YamlNode? valueAt(String key) {
+    for (var keyNode in nodes.keys) {
+      if (keyNode is YamlScalar && keyNode.value == key) {
+        return nodes[keyNode];
       }
     }
     return null;
   }
-
-  /// Return [nodes] as a Map with [YamlNode] keys.
-  Map<YamlNode, YamlNode> get nodeMap => nodes.cast<YamlNode, YamlNode>();
 }
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index aa3aec8..5198c44 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -53,9 +53,21 @@
         _context = workspace.provider.pathContext;
 
   @override
-  void clearCache() {
-    _sourceCache.clear();
-    _workspace.clearCache();
+  Uri? pathToUri(String path) {
+    // Search in each root.
+    for (var root in [
+      ..._workspace.binPaths,
+      _workspace.genfiles,
+      _workspace.readonly,
+      _workspace.root
+    ]) {
+      var uriParts = _restoreUriParts(root, path);
+      if (uriParts != null) {
+        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
+      }
+    }
+
+    return null;
   }
 
   @override
@@ -70,26 +82,6 @@
     return source;
   }
 
-  @override
-  Uri? restoreAbsolute(Source source) {
-    String filePath = source.fullName;
-
-    // Search in each root.
-    for (var root in [
-      ..._workspace.binPaths,
-      _workspace.genfiles,
-      _workspace.readonly,
-      _workspace.root
-    ]) {
-      var uriParts = _restoreUriParts(root, filePath);
-      if (uriParts != null) {
-        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
-      }
-    }
-
-    return null;
-  }
-
   Source? _resolveAbsolute(Uri uri) {
     if (uri.scheme == 'file') {
       var path = fileUriToNormalizedPath(_context, uri);
@@ -148,7 +140,7 @@
         String pathInLib = components.skip(4).join('/');
         return [packageName, pathInLib];
       } else {
-        for (int i = 2; i < components.length - 1; i++) {
+        for (int i = components.length - 2; i >= 2; i--) {
           String component = components[i];
           if (component == 'lib') {
             String packageName = components.getRange(0, i).join('.');
@@ -238,10 +230,6 @@
   @override
   UriResolver get packageUriResolver => BazelPackageUriResolver(this);
 
-  void clearCache() {
-    _directoryToPackage.clear();
-  }
-
   @override
   SourceFactory createSourceFactory(
     DartSdk? sdk,
@@ -254,7 +242,7 @@
     resolvers.add(packageUriResolver);
     resolvers.add(BazelFileUriResolver(this));
     if (summaryData != null) {
-      resolvers.add(InSummaryUriResolver(provider, summaryData));
+      resolvers.add(InSummaryUriResolver(summaryData));
     }
     return SourceFactory(resolvers);
   }
@@ -370,6 +358,8 @@
         return packageRootedAt(folder);
       }
     }
+
+    return null;
   }
 
   /// In some distributed build environments, BUILD files are not preserved.
@@ -509,10 +499,9 @@
             context.join(root, '$symlinkPrefix-genfiles'),
             lookForBuildFileSubstitutes: lookForBuildFileSubstitutes);
       }
-
-      // // Go up the folder.
-      // folder = parent;
     }
+
+    return null;
   }
 
   /// Find the "bin" folder path, by searching for it.
@@ -599,6 +588,8 @@
     for (var match in pattern.allMatches(content)) {
       return Version.parse('${match.group(1)}.0');
     }
+
+    return null;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/workspace/bazel_watcher.dart b/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
index b3f09ec..54b96a0 100644
--- a/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel_watcher.dart
@@ -123,6 +123,8 @@
         // folder, so we use a dummy value here. But this shouldn't really
         // matter, since the `symlinkTarget` should detect any modifications.
         return _ModifiedInfo(0, 0, symlinkTarget);
+      } else {
+        return null;
       }
     } on FileSystemException catch (_) {
       // File doesn't exist, so return null.
diff --git a/pkg/analyzer/lib/src/workspace/gn.dart b/pkg/analyzer/lib/src/workspace/gn.dart
index e22ce32..8ebed62 100644
--- a/pkg/analyzer/lib/src/workspace/gn.dart
+++ b/pkg/analyzer/lib/src/workspace/gn.dart
@@ -88,6 +88,7 @@
         return GnWorkspacePackage(folder.path, this);
       }
     }
+    return null;
   }
 
   /// Find the GN workspace that contains the given [filePath].
@@ -123,6 +124,7 @@
         return GnWorkspace._(provider, root, packageMap);
       }
     }
+    return null;
   }
 
   /// For a source at `$root/foo/bar`, the packages files are generated in
diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart
index ba6e15c..4e06f04 100644
--- a/pkg/analyzer/lib/src/workspace/package_build.dart
+++ b/pkg/analyzer/lib/src/workspace/package_build.dart
@@ -60,6 +60,18 @@
   Map<String, List<Folder>> get packageMap => _workspace.packageMap;
 
   @override
+  Uri? pathToUri(String path) {
+    if (_context.isWithin(_workspace.root, path)) {
+      var uriParts = _restoreUriParts(path);
+      if (uriParts != null) {
+        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
+      }
+    }
+
+    return _normalUriResolver.pathToUri(path);
+  }
+
+  @override
   Source? resolveAbsolute(Uri uri) {
     if (uri.scheme != 'package') {
       return null;
@@ -90,20 +102,6 @@
     return basicResolverSource;
   }
 
-  @override
-  Uri? restoreAbsolute(Source source) {
-    String filePath = source.fullName;
-
-    if (_context.isWithin(_workspace.root, filePath)) {
-      var uriParts = _restoreUriParts(filePath);
-      if (uriParts != null) {
-        return Uri.parse('package:${uriParts[0]}/${uriParts[1]}');
-      }
-    }
-
-    return _normalUriResolver.restoreAbsolute(source);
-  }
-
   List<String>? _restoreUriParts(String filePath) {
     String relative = _context.relative(filePath, from: _workspace.root);
     List<String> components = _context.split(relative);
@@ -330,13 +328,16 @@
         return null;
       }
     }
+    return null;
   }
 
   /// Return the content of the [file], `null` if cannot be read.
   static String? _fileContentOrNull(File file) {
     try {
       return file.readAsStringSync();
-    } catch (_) {}
+    } catch (_) {
+      return null;
+    }
   }
 }
 
diff --git a/pkg/analyzer/lib/src/workspace/pub.dart b/pkg/analyzer/lib/src/workspace/pub.dart
index e5059d7..1d83253 100644
--- a/pkg/analyzer/lib/src/workspace/pub.dart
+++ b/pkg/analyzer/lib/src/workspace/pub.dart
@@ -74,13 +74,16 @@
         return PubWorkspace._(provider, packageMap, root, pubspec);
       }
     }
+    return null;
   }
 
   /// Return the content of the [file], `null` if cannot be read.
   static String? _fileContentOrNull(File file) {
     try {
       return file.readAsStringSync();
-    } catch (_) {}
+    } catch (_) {
+      return null;
+    }
   }
 }
 
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index 3aa6e61..b079038 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -1082,7 +1082,7 @@
       immediately enclosing _a_ is not declared asynchronous. (Where _a_ is the
       await expression.)
   BODY_MIGHT_COMPLETE_NORMALLY:
-    problemMessage: "The body might complete normally, causing 'null' to be returned, but the return type is a potentially non-nullable type."
+    problemMessage: "The body might complete normally, causing 'null' to be returned, but the return type, '{0}', is a potentially non-nullable type."
     correctionMessage: Try adding either a return or a throw statement at the end.
     hasPublishedDocs: true
     comment: No parameters.
@@ -1146,13 +1146,15 @@
       }
       ```
 
-      If the method intentionally returns `null` at the end, then change the
+      If the method intentionally returns `null` at the end, then add an
+      explicit return of `null` at the end of the method and change the
       return type so that it's valid to return `null`:
 
       ```dart
       class C<T> {
         T? m(T t) {
           print(t);
+          return null;
         }
       }
       ```
@@ -6524,46 +6526,6 @@
 
       class C {}
       ```
-  INVALID_SUPER_INVOCATION:
-    problemMessage: "The superclass call must be last in an initializer list: '{0}'."
-    hasPublishedDocs: true
-    comment: No parameters.
-    documentation: |-
-      #### Description
-
-      The analyzer produces this diagnostic when the initializer list of a
-      constructor contains an invocation of a constructor in the superclass, but
-      the invocation isn't the last item in the initializer list.
-
-      #### Example
-
-      The following code produces this diagnostic because the invocation of the
-      superclass' constructor isn't the last item in the initializer list:
-
-      ```dart
-      class A {
-        A(int x);
-      }
-
-      class B extends A {
-        B(int x) : [!super!](x), assert(x >= 0);
-      }
-      ```
-
-      #### Common fixes
-
-      Move the invocation of the superclass' constructor to the end of the
-      initializer list:
-
-      ```dart
-      class A {
-        A(int x);
-      }
-
-      class B extends A {
-        B(int x) : assert(x >= 0), super(x);
-      }
-      ```
   INVALID_TYPE_ARGUMENT_IN_CONST_LIST:
     sharedName: INVALID_TYPE_ARGUMENT_IN_CONST_LITERAL
     problemMessage: "Constant list literals can't include a type parameter as a type argument, such as '{0}'."
@@ -11329,6 +11291,49 @@
       7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It
       is a compile-time error if a generative constructor of class Object
       includes a superinitializer.
+  SUPER_INVOCATION_NOT_LAST:
+    previousName: INVALID_SUPER_INVOCATION
+    problemMessage: "The superconstructor call must be last in an initializer list: '{0}'."
+    hasPublishedDocs: true
+    comment: |-
+      Parameters:
+      0: the superinitializer
+    documentation: |-
+      #### Description
+
+      The analyzer produces this diagnostic when the initializer list of a
+      constructor contains an invocation of a constructor in the superclass, but
+      the invocation isn't the last item in the initializer list.
+
+      #### Example
+
+      The following code produces this diagnostic because the invocation of the
+      superclass' constructor isn't the last item in the initializer list:
+
+      ```dart
+      class A {
+        A(int x);
+      }
+
+      class B extends A {
+        B(int x) : [!super!](x), assert(x >= 0);
+      }
+      ```
+
+      #### Common fixes
+
+      Move the invocation of the superclass' constructor to the end of the
+      initializer list:
+
+      ```dart
+      class A {
+        A(int x);
+      }
+
+      class B extends A {
+        B(int x) : assert(x >= 0), super(x);
+      }
+      ```
   SUPER_IN_EXTENSION:
     problemMessage: "The 'super' keyword can't be used in an extension because an extension doesn't have a superclass."
     hasPublishedDocs: true
@@ -12936,6 +12941,7 @@
       1: the name of the enclosing type where the getter is being looked for
   UNDEFINED_SUPER_METHOD:
     sharedName: UNDEFINED_SUPER_MEMBER
+    previousName: UNDEFINED_SUPER_METHOD
     problemMessage: "The method '{0}' isn't defined in a superclass of '{1}'."
     correctionMessage: "Try correcting the name to the name of an existing method, or defining a method named '{0}' in a superclass."
     hasPublishedDocs: true
@@ -13715,8 +13721,16 @@
       function that is not a generator function.
 
       No parameters.
+  YIELD_EACH_OF_INVALID_TYPE:
+    sharedName: YIELD_OF_INVALID_TYPE
+    problemMessage: "The type '{0}' implied by the 'yield*' expression must be assignable to '{1}'."
+    hasPublishedDocs: true
+    comment: |-
+      Parameters:
+      0: the type of the expression after `yield*`
+      1: the return type of the function containing the `yield*`
   YIELD_OF_INVALID_TYPE:
-    problemMessage: "The type '{0}' implied by the 'yield' expression must be assignable to '{1}'."
+    problemMessage: "A yielded value of type '{0}' must be assignable to '{1}'."
     hasPublishedDocs: true
     comment: |-
       Parameters:
@@ -13725,10 +13739,11 @@
     documentation: |-
       #### Description
 
-      The analyzer produces this diagnostic when the type of object produced by a
-      `yield` expression doesn't match the type of objects that are to be
-      returned from the `Iterable` or `Stream` types that are returned from a
-      generator (a function or method marked with either `sync*` or `async*`).
+      The analyzer produces this diagnostic when the type of object produced by
+      a `yield` or `yield*` expression doesn't match the type of objects that
+      are to be returned from the `Iterable` or `Stream` types that are returned
+      from a generator (a function or method marked with either `sync*` or
+      `async*`).
 
       #### Example
 
@@ -13762,6 +13777,22 @@
       }
       ```
 FfiCode:
+  ABI_SPECIFIC_INTEGER_INVALID:
+    problemMessage: "Classes extending 'AbiSpecificInteger' must have exactly one const constructor, no other members, and no type arguments."
+    correctionMessage: Try removing all type arguments, removing all members, and adding one const constructor.
+    comment: No parameters.
+  ABI_SPECIFIC_INTEGER_MAPPING_EXTRA:
+    problemMessage: "Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a 'NativeType' integer with a fixed size."
+    correctionMessage: Try removing the extra annotation.
+    comment: No parameters.
+  ABI_SPECIFIC_INTEGER_MAPPING_MISSING:
+    problemMessage: "Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a 'NativeType' integer with a fixed size."
+    correctionMessage: Try adding an annotation.
+    comment: No parameters.
+  ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED:
+    problemMessage: "Only mappings to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', and 'Uint64' are supported."
+    correctionMessage: Try changing the value to 'Int8', 'Int16', 'Int32', 'Int64', 'Uint8', 'Uint16', 'UInt32', or 'Uint64'.
+    comment: No parameters.
   ANNOTATION_ON_POINTER_FIELD:
     problemMessage: "Fields in a struct class whose type is 'Pointer' should not have any annotations."
     correctionMessage: Try removing the annotation.
@@ -13903,8 +13934,8 @@
     correctionMessage: Try changing the input to a positive number.
     comment: No parameters.
   NON_SIZED_TYPE_ARGUMENT:
-    problemMessage: "Type arguments to '{0}' can't have the type '{1}'. They can only be declared as native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct' or 'Union'."
-    correctionMessage: "Try using a native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct' or 'Union'."
+    problemMessage: "Type arguments to '{0}' can't have the type '{1}'. They can only be declared as native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct', 'Union', or 'AbiSpecificInteger'."
+    correctionMessage: "Try using a native integer, 'Float', 'Double', 'Pointer', or subtype of 'Struct', 'Union', or 'AbiSpecificInteger'."
     comment: |-
       Parameters:
       0: the type of the field
@@ -13953,24 +13984,24 @@
       1: the name of the class being extended, implemented, or mixed in
   SUBTYPE_OF_STRUCT_CLASS_IN_EXTENDS:
     sharedName: SUBTYPE_OF_STRUCT_CLASS
-    problemMessage: "The class '{0}' can't extend '{1}' because '{1}' is a subtype of 'Struct' or 'Union'."
-    correctionMessage: "Try extending 'Struct' or 'Union' directly."
+    problemMessage: "The class '{0}' can't extend '{1}' because '{1}' is a subtype of 'Struct', 'Union', or 'AbiSpecificInteger'."
+    correctionMessage: "Try extending 'Struct', 'Union', or 'AbiSpecificInteger' directly."
     comment: |-
       Parameters:
       0: the name of the subclass
       1: the name of the class being extended, implemented, or mixed in
   SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS:
     sharedName: SUBTYPE_OF_STRUCT_CLASS
-    problemMessage: "The class '{0}' can't implement '{1}' because '{1}' is a subtype of 'Struct' or 'Union'."
-    correctionMessage: "Try extending 'Struct' or 'Union' directly."
+    problemMessage: "The class '{0}' can't implement '{1}' because '{1}' is a subtype of 'Struct', 'Union', or 'AbiSpecificInteger'."
+    correctionMessage: "Try extending 'Struct', 'Union', or 'AbiSpecificInteger' directly."
     comment: |-
       Parameters:
       0: the name of the subclass
       1: the name of the class being extended, implemented, or mixed in
   SUBTYPE_OF_STRUCT_CLASS_IN_WITH:
     sharedName: SUBTYPE_OF_STRUCT_CLASS
-    problemMessage: "The class '{0}' can't mix in '{1}' because '{1}' is a subtype of 'Struct' or 'Union'."
-    correctionMessage: "Try extending 'Struct' or 'Union' directly."
+    problemMessage: "The class '{0}' can't mix in '{1}' because '{1}' is a subtype of 'Struct', 'Union', or 'AbiSpecificInteger'."
+    correctionMessage: "Try extending 'Struct', 'Union', or 'AbiSpecificInteger' directly."
     comment: |-
       Parameters:
       0: the name of the subclass
@@ -14040,6 +14071,13 @@
     problemMessage: "'{0}' is marked 'doNotStore' and shouldn't be assigned to a field or top-level variable."
     correctionMessage: Try removing the assignment.
     comment: Users should not assign values marked `@doNotStore`.
+  BODY_MIGHT_COMPLETE_NORMALLY_NULLABLE:
+    problemMessage: "This function has a nullable return type of '{0}', but ends without returning a value."
+    correctionMessage: "Try adding a return statement, or if no value is ever returned, try changing the return type to 'void'."
+    hasPublishedDocs: false
+    comment: |-
+      Parameters:
+      0: the name of the declared return type
   CAN_BE_NULL_AFTER_NULL_AWARE:
     problemMessage: "The receiver uses '?.', so its value can be null."
     correctionMessage: "Replace the '.' with a '?.' in the invocation."
@@ -16620,7 +16658,7 @@
       var x = min(0, 1);
       ```
   UNDEFINED_REFERENCED_PARAMETER:
-    problemMessage: "The parameter '{0}' is not defined by '{1}'."
+    problemMessage: "The parameter '{0}' isn't defined by '{1}'."
     hasPublishedDocs: true
     comment: |-
       Parameters:
@@ -17444,11 +17482,11 @@
     correctionMessage: Consider declaring the corresponding activity element with `screenOrientation="unspecified"` or `"fullSensor"` attribute.
     comment: A code indicating that the activity is locked to an orientation.
   UNSUPPORTED_CHROME_OS_FEATURE:
-    problemMessage: "The feature {0} is not supported on Chrome OS, consider making it optional."
+    problemMessage: "The feature {0} isn't supported on Chrome OS, consider making it optional."
     correctionMessage: "Try changing to `android:required=\"false\"` for this feature."
     comment: A code indicating that a specified feature is not supported on Chrome OS.
   UNSUPPORTED_CHROME_OS_HARDWARE:
-    problemMessage: "The feature {0} is not supported on Chrome OS, consider making it optional."
+    problemMessage: "The feature {0} isn't supported on Chrome OS, consider making it optional."
     correctionMessage: "Try adding `android:required=\"false\"` for this feature."
     comment: |-
       A code indicating that a specified hardware feature is not supported on
@@ -18015,7 +18053,7 @@
       #### Description
 
       The analyzer produces this diagnostic when a package under either
-      `dependencies` or `dev_dependencies` is not a pub, `git`, or `path` based
+      `dependencies` or `dev_dependencies` isn't a pub, `git`, or `path` based
       dependency.
 
       See [Package dependencies](https://dart.dev/tools/pub/dependencies) for
@@ -18024,7 +18062,7 @@
       #### Example
 
       The following code produces this diagnostic because the dependency on the
-      package `transmogrify` is not a pub, `git`, or `path` based dependency:
+      package `transmogrify` isn't a pub, `git`, or `path` based dependency:
 
       ```yaml
       %uri="pubspec.yaml"
@@ -18384,7 +18422,7 @@
       `isEven` if `s` is `null`. In other words, if `s` is `null`, then neither
       `length` nor `isEven` will be invoked, and if `s` is non-`null`, then
       `length` can't return a `null` value. Either way, `isEven` can't be invoked
-      on a `null` value, so the null-aware operator is not necessary. See
+      on a `null` value, so the null-aware operator isn't necessary. See
       [Understanding null safety](/null-safety/understanding-null-safety#smarter-null-aware-methods)
       for more details.
 
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 76dc2d2..e706822 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 2.8.0-dev
+version: 3.1.0-dev
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer
 
@@ -7,7 +7,7 @@
   sdk: '>=2.14.0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^30.0.0
+  _fe_analyzer_shared: ^32.0.0
   cli_util: ^0.3.0
   collection: ^1.15.0
   convert: ^3.0.0
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index 4718ea0..5519a0d 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -56,8 +56,9 @@
         "b",
         AstTestFactory.formalParameterList(),
         initializers);
-    ClassDeclaration clazz = AstTestFactory.classDeclaration(null, "Test", null,
-        null, null, null, [defaultConstructor, aConstructor, bConstructor]);
+    ClassDeclaration clazz = AstTestFactory.classDeclaration(
+        null, "Test", null, null, null, null,
+        members: [defaultConstructor, aConstructor, bConstructor]);
     expect(clazz.getConstructor(null), same(defaultConstructor));
     expect(clazz.getConstructor("a"), same(aConstructor));
     expect(clazz.getConstructor("b"), same(bConstructor));
@@ -68,11 +69,12 @@
     VariableDeclaration aVar = AstTestFactory.variableDeclaration("a");
     VariableDeclaration bVar = AstTestFactory.variableDeclaration("b");
     VariableDeclaration cVar = AstTestFactory.variableDeclaration("c");
-    ClassDeclaration clazz =
-        AstTestFactory.classDeclaration(null, "Test", null, null, null, null, [
-      AstTestFactory.fieldDeclaration2(false, null, [aVar]),
-      AstTestFactory.fieldDeclaration2(false, null, [bVar, cVar])
-    ]);
+    ClassDeclaration clazz = AstTestFactory.classDeclaration(
+        null, "Test", null, null, null, null,
+        members: [
+          AstTestFactory.fieldDeclaration2(false, null, [aVar]),
+          AstTestFactory.fieldDeclaration2(false, null, [bVar, cVar])
+        ]);
     expect(clazz.getField("a"), same(aVar));
     expect(clazz.getField("b"), same(bVar));
     expect(clazz.getField("c"), same(cVar));
@@ -95,7 +97,8 @@
         AstTestFactory.identifier3("b"),
         AstTestFactory.formalParameterList());
     ClassDeclaration clazz = AstTestFactory.classDeclaration(
-        null, "Test", null, null, null, null, [aMethod, bMethod]);
+        null, "Test", null, null, null, null,
+        members: [aMethod, bMethod]);
     expect(clazz.getMethod("a"), same(aMethod));
     expect(clazz.getMethod("b"), same(bMethod));
     expect(clazz.getMethod("noSuchMethod"), isNull);
@@ -122,8 +125,8 @@
                 "A",
                 null,
                 null,
-                AstTestFactory.typeName4('B'),
-                AstTestFactory.withClause([AstTestFactory.typeName4('M')]),
+                AstTestFactory.namedType4('B'),
+                AstTestFactory.withClause([AstTestFactory.namedType4('M')]),
                 null)
             .isAbstract,
         isFalse);
@@ -132,8 +135,8 @@
                 "B",
                 null,
                 Keyword.ABSTRACT,
-                AstTestFactory.typeName4('A'),
-                AstTestFactory.withClause([AstTestFactory.typeName4('M')]),
+                AstTestFactory.namedType4('A'),
+                AstTestFactory.withClause([AstTestFactory.namedType4('M')]),
                 null)
             .isAbstract,
         isTrue);
@@ -1142,7 +1145,7 @@
 
   void test_isQualified_inConstructorName() {
     ConstructorName constructor = AstTestFactory.constructorName(
-        AstTestFactory.typeName4('MyClass'), "test");
+        AstTestFactory.namedType4('MyClass'), "test");
     SimpleIdentifier name = constructor.name!;
     expect(name.isQualified, isTrue);
   }
@@ -1688,6 +1691,21 @@
 }
 
 @reflectiveTest
+class SuperFormalParameterTest {
+  void test_endToken_noParameters() {
+    SuperFormalParameter parameter =
+        AstTestFactory.superFormalParameter2('field');
+    expect(parameter.endToken, parameter.identifier.endToken);
+  }
+
+  void test_endToken_parameters() {
+    SuperFormalParameter parameter = AstTestFactory.superFormalParameter(
+        null, null, 'field', AstTestFactory.formalParameterList([]));
+    expect(parameter.endToken, parameter.parameters!.endToken);
+  }
+}
+
+@reflectiveTest
 class VariableDeclarationTest extends ParserTestCase {
   void test_getDocumentationComment_onGrandParent() {
     VariableDeclaration varDecl = AstTestFactory.variableDeclaration("a");
diff --git a/pkg/analyzer/test/file_system/file_system_test_support.dart b/pkg/analyzer/test/file_system/file_system_test_support.dart
index 722474a..11cf39f 100644
--- a/pkg/analyzer/test/file_system/file_system_test_support.dart
+++ b/pkg/analyzer/test/file_system/file_system_test_support.dart
@@ -103,7 +103,6 @@
     Source source = file.createSource();
     expect(source, isNotNull);
     expect(source.fullName, defaultFilePath);
-    expect(source.uriKind, UriKind.FILE_URI);
     expect(source.uri, Uri.file(defaultFilePath));
     expect(source.exists(), isTrue);
     expect(source.contents.data, defaultFileContent);
@@ -230,15 +229,6 @@
     expect(() => file.modificationStamp, throwsA(isFileSystemException));
   }
 
-  @deprecated
-  test_parent() {
-    File file = getFile(exists: true);
-
-    var parent = file.parent!;
-    expect(parent.exists, isTrue);
-    expect(parent.path, defaultFolderPath);
-  }
-
   test_parent2() {
     File file = getFile(exists: true);
 
@@ -926,22 +916,6 @@
     expect(folder.exists, isFalse);
   }
 
-  @Deprecated('Not used by clients')
-  test_getModificationTimes_existing() async {
-    Source source = getFile(exists: true).createSource();
-
-    var times = await provider.getModificationTimes([source]);
-    expect(times, [source.modificationStamp]);
-  }
-
-  @Deprecated('Not used by clients')
-  test_getModificationTimes_notExisting() async {
-    Source source = getFile(exists: false).createSource();
-
-    var times = await provider.getModificationTimes([source]);
-    expect(times, [-1]);
-  }
-
   test_getResource_file_existing() {
     String filePath = getFile(exists: true).path;
 
diff --git a/pkg/analyzer/test/file_system/memory_file_system_test.dart b/pkg/analyzer/test/file_system/memory_file_system_test.dart
index 9eecb33..873dc18 100644
--- a/pkg/analyzer/test/file_system/memory_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/memory_file_system_test.dart
@@ -216,6 +216,7 @@
     expect(source.fullName, sourcePath);
   }
 
+  @Deprecated('Not used anymore')
   test_modificationStamp() {
     expect(source.modificationStamp, -1);
   }
diff --git a/pkg/analyzer/test/file_system/overlay_file_system_test.dart b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
index fd9a6df..dae3df2 100644
--- a/pkg/analyzer/test/file_system/overlay_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
@@ -812,20 +812,6 @@
     expect(folder.exists, isTrue);
   }
 
-  @Deprecated('Not used by clients')
-  test_getModificationTimes_withoutOverlay() async {
-    Source source = _file(exists: true).createSource();
-    List<int> times = await provider.getModificationTimes([source]);
-    expect(times, [source.modificationStamp]);
-  }
-
-  @Deprecated('Not used by clients')
-  test_getModificationTimes_withOverlay() async {
-    Source source = _file(exists: true, withOverlay: true).createSource();
-    List<int> times = await provider.getModificationTimes([source]);
-    expect(times, [42]);
-  }
-
   test_getResource_file_existing_withoutOverlay() {
     String path = _file(exists: true).path;
     Resource resource = provider.getResource(path);
diff --git a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
index c6192fb..61f06df 100644
--- a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
+++ b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -29,6 +29,12 @@
     expect(resolver, isNotNull);
   }
 
+  void test_pathToUri() {
+    var path = convertPath('/test.dart');
+    var uri = toUri(path);
+    expect(resolver.pathToUri(path), uri);
+  }
+
   void test_resolveAbsolute_file() {
     var uri = toUri('/test.dart');
 
@@ -59,14 +65,15 @@
     expect(source, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute() {
     var uri = toUri('/test.dart');
 
     var source = resolver.resolveAbsolute(uri)!;
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver.restoreAbsolute(NonExistingSource(
-            source.fullName, Uri.parse('dart:math'), UriKind.DART_URI)),
+        resolver.restoreAbsolute(
+            NonExistingSource(source.fullName, Uri.parse('dart:math'))),
         uri);
   }
 }
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 2fd5fff..532fa53 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -5,10 +5,8 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart' hide SdkLibrariesReader;
-import 'package:analyzer/src/generated/java_engine_io.dart';
-import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
@@ -18,7 +16,6 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(DartUriResolverTest);
     defineReflectiveTests(ErrorSeverityTest);
-    defineReflectiveTests(FileBasedSourceTest);
     defineReflectiveTests(ResolveRelativeUriTest);
     defineReflectiveTests(UriKindTest);
   });
@@ -44,6 +41,18 @@
     expect(DartUriResolver.isDartUri(uri), isFalse);
   }
 
+  void test_pathToUri_library() {
+    var path = convertPath('/sdk/lib/core/core.dart');
+    var dartUri = resolver.pathToUri(path);
+    expect(dartUri.toString(), 'dart:core');
+  }
+
+  void test_pathToUri_part() {
+    var path = convertPath('/sdk/lib/core/int.dart');
+    var dartUri = resolver.pathToUri(path);
+    expect(dartUri.toString(), 'dart:core/int.dart');
+  }
+
   void test_resolve_dart_library() {
     var source = resolver.resolveAbsolute(Uri.parse('dart:core'));
     expect(source, isNotNull);
@@ -64,16 +73,18 @@
     expect(result, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute_library() {
     _SourceMock source = _SourceMock();
-    source.uri = toUri('/sdk/lib/core/core.dart');
+    source.fullName = convertPath('/sdk/lib/core/core.dart');
     var dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core');
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute_part() {
     _SourceMock source = _SourceMock();
-    source.uri = toUri('/sdk/lib/core/int.dart');
+    source.fullName = convertPath('/sdk/lib/core/int.dart');
     var dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core/int.dart');
   }
@@ -128,134 +139,6 @@
 }
 
 @reflectiveTest
-class FileBasedSourceTest {
-  test_equals_false_differentFiles() async {
-    JavaFile file1 = FileUtilities2.createFile("/does/not/exist1.dart");
-    JavaFile file2 = FileUtilities2.createFile("/does/not/exist2.dart");
-    FileBasedSource source1 = FileBasedSource(file1);
-    FileBasedSource source2 = FileBasedSource(file2);
-    expect(source1 == source2, isFalse);
-  }
-
-  test_equals_false_null() async {
-    JavaFile file = FileUtilities2.createFile("/does/not/exist1.dart");
-    FileBasedSource source1 = FileBasedSource(file);
-    expect(source1, isNotNull);
-  }
-
-  test_equals_true() async {
-    JavaFile file1 = FileUtilities2.createFile("/does/not/exist.dart");
-    JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source1 = FileBasedSource(file1);
-    FileBasedSource source2 = FileBasedSource(file2);
-    expect(source1 == source2, isTrue);
-  }
-
-  test_getFullName() async {
-    String fullPath = "/does/not/exist.dart";
-    JavaFile file = FileUtilities2.createFile(fullPath);
-    FileBasedSource source = FileBasedSource(file);
-    expect(source.fullName, file.getAbsolutePath());
-  }
-
-  test_getShortName() async {
-    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source.shortName, "exist.dart");
-  }
-
-  test_hashCode() async {
-    JavaFile file1 = FileUtilities2.createFile("/does/not/exist.dart");
-    JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source1 = FileBasedSource(file1);
-    FileBasedSource source2 = FileBasedSource(file2);
-    expect(source2.hashCode, source1.hashCode);
-  }
-
-  test_isInSystemLibrary_contagious() async {
-    DartSdk sdk = (_SimpleDartSdkTest()..setUp()).sdk;
-    UriResolver resolver = DartUriResolver(sdk);
-    SourceFactory factory = SourceFactory([resolver]);
-    // resolve dart:core
-    var result = resolver.resolveAbsolute(Uri.parse("dart:core"));
-    expect(result, isNotNull);
-    expect(result!.isInSystemLibrary, isTrue);
-    // system libraries reference only other system libraries
-    var partSource = factory.resolveUri(result, "num.dart");
-    expect(partSource, isNotNull);
-    expect(partSource!.isInSystemLibrary, isTrue);
-  }
-
-  test_isInSystemLibrary_false() async {
-    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source, isNotNull);
-    expect(source.fullName, file.getAbsolutePath());
-    expect(source.isInSystemLibrary, isFalse);
-  }
-
-  test_issue14500() async {
-    // see https://code.google.com/p/dart/issues/detail?id=14500
-    FileBasedSource source = FileBasedSource(
-        FileUtilities2.createFile("/some/packages/foo:bar.dart"));
-    expect(source, isNotNull);
-    expect(source.exists(), isFalse);
-  }
-
-  test_resolveRelative_file_fileName() async {
-    if (OSUtilities.isWindows()) {
-      // On Windows, the URI that is produced includes a drive letter,
-      // which I believe is not consistent across all machines that might run
-      // this test.
-      return;
-    }
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source, isNotNull);
-    Uri relative = resolveRelativeUri(source.uri, Uri.parse("lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "file:///a/b/lib.dart");
-  }
-
-  test_resolveRelative_file_filePath() async {
-    if (OSUtilities.isWindows()) {
-      // On Windows, the URI that is produced includes a drive letter,
-      // which I believe is not consistent across all machines that might run
-      // this test.
-      return;
-    }
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source, isNotNull);
-    Uri relative = resolveRelativeUri(source.uri, Uri.parse("c/lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "file:///a/b/c/lib.dart");
-  }
-
-  test_resolveRelative_file_filePathWithParent() async {
-    if (OSUtilities.isWindows()) {
-      // On Windows, the URI that is produced includes a drive letter, which I
-      // believe is not consistent across all machines that might run this test.
-      return;
-    }
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source = FileBasedSource(file);
-    expect(source, isNotNull);
-    Uri relative = resolveRelativeUri(source.uri, Uri.parse("../c/lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "file:///a/c/lib.dart");
-  }
-
-  test_system() async {
-    JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
-    FileBasedSource source = FileBasedSource(file, Uri.parse("dart:core"));
-    expect(source, isNotNull);
-    expect(source.fullName, file.getAbsolutePath());
-    expect(source.isInSystemLibrary, isTrue);
-  }
-}
-
-@reflectiveTest
 class ResolveRelativeUriTest {
   test_resolveRelative_dart_dartUri() async {
     _assertResolve('dart:foo', 'dart:bar', 'dart:bar');
@@ -310,6 +193,7 @@
 
 @reflectiveTest
 class UriKindTest {
+  @deprecated
   test_fromEncoding() async {
     expect(UriKind.fromEncoding(0x64), same(UriKind.DART_URI));
     expect(UriKind.fromEncoding(0x66), same(UriKind.FILE_URI));
@@ -317,6 +201,7 @@
     expect(UriKind.fromEncoding(0x58), isNull);
   }
 
+  @deprecated
   test_getEncoding() async {
     expect(UriKind.DART_URI.encoding, 0x64);
     expect(UriKind.FILE_URI.encoding, 0x66);
@@ -351,6 +236,9 @@
 
 class _SourceMock implements Source {
   @override
+  late final String fullName;
+
+  @override
   late final Uri uri;
 
   @override
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index a82b0a3..f6b0fed 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -2,33 +2,14 @@
 // 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/features.dart';
 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/scope.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/ast/ast_factory.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
-import 'package:analyzer/src/generated/element_resolver.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
-import 'package:analyzer/src/generated/testing/element_factory.dart';
-import 'package:analyzer/src/source/source_resource.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../src/dart/resolution/context_collection_resolution.dart';
 import '../util/element_type_matchers.dart';
-import 'elements_types_mixin.dart';
-import 'test_analysis_context.dart';
-import 'test_support.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -37,15 +18,6 @@
   });
 }
 
-/// Wrapper around the test package's `fail` function.
-///
-/// Unlike the test package's `fail` function, this function is not annotated
-/// with @alwaysThrows, so we can call it at the top of a test method without
-/// causing the rest of the method to be flagged as dead code.
-void _fail(String message) {
-  fail(message);
-}
-
 @reflectiveTest
 class AnnotationElementResolverTest extends PubPackageResolutionTest {
   test_class_namedConstructor() async {
@@ -265,545 +237,332 @@
 }
 
 @reflectiveTest
-class ElementResolverTest with ResourceProviderMixin, ElementsTypesMixin {
-  /// The error listener to which errors will be reported.
-  late GatheringErrorListener _listener;
-
-  /// The type provider used to access the types.
-  late TypeProvider _typeProvider;
-
-  /// The library containing the code being resolved.
-  late LibraryElementImpl _definingLibrary;
-
-  /// The resolver visitor that maintains the state for the resolver.
-  late ResolverVisitor _visitor;
-
-  /// The resolver being used to resolve the test cases.
-  late ElementResolver _resolver;
-
-  @override
-  TypeProvider get typeProvider => _typeProvider;
-
-  void fail_visitExportDirective_combinators() {
-    _fail("Not yet tested");
-    // Need to set up the exported library so that the identifier can be
-    // resolved.
-    ExportDirective directive = AstTestFactory.exportDirective2('dart:math', [
-      AstTestFactory.hideCombinator2(["A"])
-    ]);
-    _resolveNode(directive);
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitFunctionExpressionInvocation() {
-    _fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitImportDirective_combinators_noPrefix() {
-    _fail("Not yet tested");
-    // Need to set up the imported library so that the identifier can be
-    // resolved.
-    ImportDirective directive =
-        AstTestFactory.importDirective3('dart:math', null, [
-      AstTestFactory.showCombinator2(["A"])
-    ]);
-    _resolveNode(directive);
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitImportDirective_combinators_prefix() {
-    _fail("Not yet tested");
-    // Need to set up the imported library so that the identifiers can be
-    // resolved.
-    String prefixName = "p";
-    _definingLibrary.imports = <ImportElement>[
-      ElementFactory.importFor(
-          _LibraryElementMock(), ElementFactory.prefix(prefixName))
-    ];
-    ImportDirective directive =
-        AstTestFactory.importDirective3('dart:math', prefixName, [
-      AstTestFactory.showCombinator2(["A"]),
-      AstTestFactory.hideCombinator2(["B"])
-    ]);
-    _resolveNode(directive);
-    _listener.assertNoErrors();
-  }
-
-  void fail_visitRedirectingConstructorInvocation() {
-    _fail("Not yet tested");
-    _listener.assertNoErrors();
-  }
-
-  void setUp() {
-    _listener = GatheringErrorListener();
-    _createResolver();
-  }
-
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
+class ElementResolverTest extends PubPackageResolutionTest {
   test_visitBreakStatement_withLabel() async {
-    // loop: while (true) {
-    //   break loop;
-    // }
-    String label = "loop";
-    LabelElementImpl labelElement = LabelElementImpl(label, -1, false, false);
-    BreakStatement breakStatement = AstTestFactory.breakStatement2(label);
-    Expression condition = AstTestFactory.booleanLiteral(true);
-    WhileStatement whileStatement =
-        AstTestFactory.whileStatement(condition, breakStatement);
-    expect(_resolveBreak(breakStatement, labelElement, whileStatement),
-        same(labelElement));
-    expect(breakStatement.target, same(whileStatement));
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+test() {
+  loop: while (true) {
+    break loop;
+  }
+}
+''');
+    var breakStatement = findNode.breakStatement('break loop');
+    expect(breakStatement.label!.staticElement, findElement.label('loop'));
+    expect(breakStatement.target, findNode.whileStatement('while (true)'));
   }
 
   test_visitBreakStatement_withoutLabel() async {
-    BreakStatement statement = AstTestFactory.breakStatement();
-    _resolveStatement(statement, null, null);
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+test() {
+  while (true) {
+    break;
+  }
+}
+''');
+    var breakStatement = findNode.breakStatement('break');
+    expect(breakStatement.target, findNode.whileStatement('while (true)'));
   }
 
   test_visitCommentReference_prefixedIdentifier_class_getter() async {
-    LibraryElementImpl library =
-        ElementFactory.library(_definingLibrary.context, "lib");
-    CompilationUnitElementImpl unit =
-        library.definingCompilationUnit as CompilationUnitElementImpl;
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    unit.classes = [classA];
+    await assertNoErrorsInCode('''
+class A {
+  int get p => 0;
+  set p(int value) {}
+}
 
-    // set accessors
-    String propName = "p";
-    PropertyAccessorElement getter =
-        ElementFactory.getterElement(propName, false, _typeProvider.intType);
-    PropertyAccessorElement setter =
-        ElementFactory.setterElement(propName, false, _typeProvider.intType);
-    classA.accessors = <PropertyAccessorElement>[getter, setter];
-    // prepare "A.p"
-    PrefixedIdentifierImpl prefixed = AstTestFactory.identifier5('A', 'p');
-    prefixed.prefix.scopeLookupResult = ScopeLookupResult(classA, null);
-    CommentReference commentReference =
-        astFactory.commentReference(null, prefixed);
-    // resolve
-    _resolveNode(commentReference);
-    expect(prefixed.prefix.staticElement, classA);
-    expect(prefixed.identifier.staticElement, getter);
-    _listener.assertNoErrors();
+/// [A.p]
+test() {}
+''');
+    var prefixed = findNode.prefixed('A.p');
+    expect(prefixed.prefix.staticElement, findElement.class_('A'));
+    expect(prefixed.identifier.staticElement, findElement.getter('p'));
   }
 
   test_visitCommentReference_prefixedIdentifier_class_method() async {
-    LibraryElementImpl library =
-        ElementFactory.library(_definingLibrary.context, "lib");
-    CompilationUnitElementImpl unit =
-        library.definingCompilationUnit as CompilationUnitElementImpl;
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    unit.classes = [classA];
-    // set method
-    MethodElement method =
-        ElementFactory.methodElement("m", _typeProvider.intType);
-    classA.methods = <MethodElement>[method];
-    // prepare "A.m"
-    PrefixedIdentifierImpl prefixed = AstTestFactory.identifier5('A', 'm');
-    prefixed.prefix.scopeLookupResult = ScopeLookupResult(classA, null);
-    CommentReference commentReference =
-        astFactory.commentReference(null, prefixed);
-    // resolve
-    _resolveNode(commentReference);
-    expect(prefixed.prefix.staticElement, classA);
-    expect(prefixed.identifier.staticElement, method);
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+class A {
+  m() {}
+}
+
+/// [A.m]
+test() {}
+''');
+    var prefixed = findNode.prefixed('A.m');
+    expect(prefixed.prefix.staticElement, findElement.class_('A'));
+    expect(prefixed.identifier.staticElement, findElement.method('m'));
   }
 
   test_visitCommentReference_prefixedIdentifier_class_operator() async {
-    LibraryElementImpl library =
-        ElementFactory.library(_definingLibrary.context, "lib");
-    CompilationUnitElementImpl unit =
-        library.definingCompilationUnit as CompilationUnitElementImpl;
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    unit.classes = [classA];
-    // set method
-    MethodElement method =
-        ElementFactory.methodElement("==", _typeProvider.boolType);
-    classA.methods = <MethodElement>[method];
-    // prepare "A.=="
-    PrefixedIdentifierImpl prefixed = AstTestFactory.identifier5('A', '==');
-    prefixed.prefix.scopeLookupResult = ScopeLookupResult(classA, null);
-    CommentReference commentReference =
-        astFactory.commentReference(null, prefixed);
-    // resolve
-    _resolveNode(commentReference);
-    expect(prefixed.prefix.staticElement, classA);
-    expect(prefixed.identifier.staticElement, method);
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+class A {
+  operator ==(other) => true;
+}
+
+/// [A.==]
+test() {}
+''');
+    var prefixed = findNode.prefixed('A.==');
+    expect(prefixed.prefix.staticElement, findElement.class_('A'));
+    expect(prefixed.identifier.staticElement, findElement.method('=='));
   }
 
   test_visitConstructorName_named() async {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    _encloseElement(classA);
-    String constructorName = "a";
-    ConstructorElement constructor =
-        ElementFactory.constructorElement2(classA, constructorName);
-    classA.constructors = <ConstructorElement>[constructor];
-    ConstructorName name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
-    _resolveNode(name);
-    expect(name.staticElement, same(constructor));
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+class A implements B {
+  A.a();
+}
+class B {
+  factory B() = A.a/*reference*/;
+}
+''');
+    expect(findNode.constructorName('A.a/*reference*/').staticElement,
+        same(findElement.constructor('a')));
   }
 
   test_visitConstructorName_unnamed() async {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    _encloseElement(classA);
-    String constructorName = 'named';
-    ConstructorElement constructor =
-        ElementFactory.constructorElement2(classA, constructorName);
-    classA.constructors = <ConstructorElement>[constructor];
-    ConstructorName name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
-    _resolveNode(name);
-    expect(name.staticElement, same(constructor));
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+class A implements B {
+  A();
+}
+class B {
+  factory B() = A/*reference*/;
+}
+''');
+    expect(findNode.constructorName('A/*reference*/').staticElement,
+        same(findElement.unnamedConstructor('A')));
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitContinueStatement_withLabel() async {
-    // loop: while (true) {
-    //   continue loop;
-    // }
-    String label = "loop";
-    LabelElementImpl labelElement = LabelElementImpl(label, -1, false, false);
-    ContinueStatement continueStatement =
-        AstTestFactory.continueStatement(label);
-    Expression condition = AstTestFactory.booleanLiteral(true);
-    WhileStatement whileStatement =
-        AstTestFactory.whileStatement(condition, continueStatement);
-    expect(_resolveContinue(continueStatement, labelElement, whileStatement),
-        same(labelElement));
-    expect(continueStatement.target, same(whileStatement));
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+test() {
+  loop: while (true) {
+    continue loop;
+  }
+}
+''');
+    var continueStatement = findNode.continueStatement('continue loop');
+    expect(continueStatement.label!.staticElement, findElement.label('loop'));
+    expect(continueStatement.target, findNode.whileStatement('while (true)'));
   }
 
   test_visitContinueStatement_withoutLabel() async {
-    ContinueStatement statement = AstTestFactory.continueStatement();
-    _resolveStatement(statement, null, null);
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+test() {
+  while (true) {
+    continue;
+  }
+}
+''');
+    var continueStatement = findNode.continueStatement('continue');
+    expect(continueStatement.target, findNode.whileStatement('while (true)'));
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
+  test_visitExportDirective_combinators() async {
+    await assertNoErrorsInCode('''
+export 'dart:math' hide pi;
+''');
+    var pi = findElement
+        .export('dart:math')
+        .exportedLibrary!
+        .exportNamespace
+        .get('pi') as PropertyAccessorElement;
+    expect(findNode.simple('pi').staticElement, pi.variable);
+  }
+
   test_visitExportDirective_noCombinators() async {
-    var directive = AstTestFactory.exportDirective2('dart:math');
-    directive.element = ElementFactory.exportFor(
-        ElementFactory.library(_definingLibrary.context, "lib"));
-    _resolveNode(directive);
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+export 'dart:math';
+''');
+    expect(findNode.export('dart:math').element!.exportedLibrary!.name,
+        'dart.math');
   }
 
   test_visitFieldFormalParameter() async {
-    String fieldName = "f";
-    InterfaceType intType = _typeProvider.intType;
-    FieldElementImpl fieldElement =
-        ElementFactory.fieldElement(fieldName, false, false, false, intType);
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    classA.fields = <FieldElement>[fieldElement];
-    var parameter = AstTestFactory.fieldFormalParameter2(fieldName);
-    FieldFormalParameterElementImpl parameterElement =
-        ElementFactory.fieldFormalParameter(parameter.identifier);
-    parameterElement.field = fieldElement;
-    parameterElement.type = intType;
-    parameter.identifier.staticElement = parameterElement;
-    _resolveInClass(parameter, classA);
-    expect(parameter.declaredElement!.type, same(intType));
+    await assertNoErrorsInCode('''
+class A {
+  int f;
+  A(this.f);
+}
+''');
+    expect(
+        findNode.fieldFormalParameter('this.f').declaredElement!.type, intType);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
+  test_visitImportDirective_combinators_noPrefix() async {
+    await assertErrorsInCode('''
+import 'dart:math' show pi;
+''', [
+      error(HintCode.UNUSED_IMPORT, 7, 11),
+    ]);
+    var pi = findElement
+        .import('dart:math')
+        .importedLibrary!
+        .exportNamespace
+        .get('pi') as PropertyAccessorElement;
+    expect(findNode.simple('pi').staticElement, pi.variable);
+  }
+
+  test_visitImportDirective_combinators_prefix() async {
+    await assertErrorsInCode('''
+import 'dart:math' as p show pi hide ln10;
+''', [
+      error(HintCode.UNUSED_IMPORT, 7, 11),
+    ]);
+    var mathNamespace =
+        findElement.import('dart:math').importedLibrary!.exportNamespace;
+    var pi = mathNamespace.get('pi') as PropertyAccessorElement;
+    expect(findNode.simple('pi').staticElement, pi.variable);
+    var ln10 = mathNamespace.get('ln10') as PropertyAccessorElement;
+    expect(findNode.simple('ln10').staticElement, ln10.variable);
+  }
+
   test_visitImportDirective_noCombinators_noPrefix() async {
-    var directive = AstTestFactory.importDirective3('dart:math', null);
-    directive.element = ElementFactory.importFor(
-        ElementFactory.library(_definingLibrary.context, "lib"), null);
-    _resolveNode(directive);
-    _listener.assertNoErrors();
+    await assertErrorsInCode('''
+import 'dart:math';
+''', [
+      error(HintCode.UNUSED_IMPORT, 7, 11),
+    ]);
+    expect(findNode.import('dart:math').element!.importedLibrary!.name,
+        'dart.math');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitImportDirective_noCombinators_prefix() async {
-    String prefixName = "p";
-    ImportElement importElement = ElementFactory.importFor(
-        ElementFactory.library(_definingLibrary.context, "lib"),
-        ElementFactory.prefix(prefixName));
-    _definingLibrary.imports = <ImportElement>[importElement];
-    var directive = AstTestFactory.importDirective3('dart:math', prefixName);
-    directive.element = importElement;
-    _resolveNode(directive);
-    _listener.assertNoErrors();
+    await assertErrorsInCode('''
+import 'dart:math' as p;
+''', [
+      error(HintCode.UNUSED_IMPORT, 7, 11),
+    ]);
+    expect(findNode.import('dart:math').element!.importedLibrary!.name,
+        'dart.math');
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_visitImportDirective_withCombinators() async {
-    ShowCombinator combinator = AstTestFactory.showCombinator2(["A", "B", "C"]);
-    var directive =
-        AstTestFactory.importDirective3('dart:math', null, [combinator]);
-    LibraryElementImpl library =
-        ElementFactory.library(_definingLibrary.context, "lib");
-    TopLevelVariableElementImpl varA =
-        ElementFactory.topLevelVariableElement2("A");
-    TopLevelVariableElementImpl varB =
-        ElementFactory.topLevelVariableElement2("B");
-    TopLevelVariableElementImpl varC =
-        ElementFactory.topLevelVariableElement2("C");
-    CompilationUnitElementImpl unit =
-        library.definingCompilationUnit as CompilationUnitElementImpl;
-    unit.accessors = <PropertyAccessorElement>[
-      varA.getter!,
-      varA.setter!,
-      varB.getter!,
-      varC.setter!
-    ];
-    unit.topLevelVariables = <TopLevelVariableElement>[varA, varB, varC];
-    directive.element = ElementFactory.importFor(library, null);
-    _resolveNode(directive);
-    expect(combinator.shownNames[0].staticElement, same(varA));
-    expect(combinator.shownNames[1].staticElement, same(varB));
-    expect(combinator.shownNames[2].staticElement, same(varC));
-    _listener.assertNoErrors();
+    newFile('$testPackageLibPath/lib1.dart', content: r'''
+int v1 = 0;
+final int v2 = 0;
+''');
+    await assertErrorsInCode('''
+import 'lib1.dart' show v1, v2;
+''', [
+      error(HintCode.UNUSED_IMPORT, 7, 11),
+    ]);
+    var importedVariables = findNode
+        .import('lib1.dart')
+        .element!
+        .importedLibrary!
+        .definingCompilationUnit
+        .topLevelVariables;
+    var v1 = importedVariables.where((v) => v.name == 'v1').single;
+    var v2 = importedVariables.where((v) => v.name == 'v2').single;
+    expect(findNode.simple('v1').staticElement, same(v1));
+    expect(findNode.simple('v2').staticElement, same(v2));
   }
 
   test_visitInstanceCreationExpression_named() async {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    String constructorName = "a";
-    ConstructorElement constructor =
-        ElementFactory.constructorElement2(classA, constructorName);
-    classA.constructors = <ConstructorElement>[constructor];
-    var name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
-    name.staticElement = constructor;
-    InstanceCreationExpression creation =
-        AstTestFactory.instanceCreationExpression(Keyword.NEW, name);
-    _resolveNode(creation);
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+class A {
+  A.a();
+}
+test() => new A.a();
+''');
+    expect(findNode.instanceCreation('new A.a').constructorName.staticElement,
+        findElement.constructor('a'));
+  }
+
+  test_visitInstanceCreationExpression_named_namedParameter() async {
+    await assertNoErrorsInCode('''
+class A {
+  A.named({int a = 0});
+}
+test() => new A.named(a: 0);
+''');
+    expect(
+        findNode.simple('a:').staticElement, same(findElement.parameter('a')));
   }
 
   test_visitInstanceCreationExpression_unnamed() async {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    String constructorName = 'named';
-    ConstructorElement constructor =
-        ElementFactory.constructorElement2(classA, constructorName);
-    classA.constructors = <ConstructorElement>[constructor];
-    var name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
-    name.staticElement = constructor;
-    InstanceCreationExpression creation =
-        AstTestFactory.instanceCreationExpression(Keyword.NEW, name);
-    _resolveNode(creation);
-    _listener.assertNoErrors();
-  }
-
-  test_visitInstanceCreationExpression_unnamed_namedParameter() async {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    String constructorName = 'named';
-    ConstructorElementImpl constructor =
-        ElementFactory.constructorElement2(classA, constructorName);
-    String parameterName = "a";
-    ParameterElement parameter =
-        ElementFactory.namedParameter2(parameterName, _typeProvider.intType);
-    constructor.parameters = <ParameterElement>[parameter];
-    classA.constructors = <ConstructorElement>[constructor];
-    var name = AstTestFactory.constructorName(
-        AstTestFactory.typeName(classA), constructorName);
-    name.staticElement = constructor;
-    InstanceCreationExpression creation =
-        AstTestFactory.instanceCreationExpression(Keyword.NEW, name, [
-      AstTestFactory.namedExpression2(parameterName, AstTestFactory.integer(0))
-    ]);
-    _resolveNode(creation);
-    expect(
-        (creation.argumentList.arguments[0] as NamedExpression)
-            .name
-            .label
-            .staticElement,
-        same(parameter));
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+class A {}
+test() => new A();
+''');
+    expect(findNode.instanceCreation('new A').constructorName.staticElement,
+        findElement.unnamedConstructor('A'));
   }
 
   test_visitMethodInvocation() async {
-    InterfaceType numType = _typeProvider.numType;
-    var left = AstTestFactory.identifier3("i");
-    left.staticType = numType;
-    String methodName = "abs";
-    MethodInvocation invocation =
-        AstTestFactory.methodInvocation(left, methodName);
-    _resolveNode(invocation);
-    expect(invocation.methodName.staticElement!.declaration,
-        same(numType.getMethod(methodName)));
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+num get i => 0;
+test() => i.abs();
+''');
+    expect(
+        findNode
+            .methodInvocation('i.abs()')
+            .methodName
+            .staticElement!
+            .declaration,
+        same(typeProvider.numType.getMethod('abs')));
   }
 
   test_visitPrefixedIdentifier_dynamic() async {
-    DartType dynamicType = _typeProvider.dynamicType;
-    var target = AstTestFactory.identifier3("a");
-    VariableElementImpl variable = ElementFactory.localVariableElement(target);
-    variable.type = dynamicType;
-    target.staticElement = variable;
-    target.staticType = dynamicType;
-    PrefixedIdentifier identifier =
-        AstTestFactory.identifier(target, AstTestFactory.identifier3("b"));
-    _resolveNode(identifier);
+    await assertNoErrorsInCode('''
+test(dynamic a) => a.b;
+''');
+    var identifier = findNode.prefixed('a.b');
     expect(identifier.staticElement, isNull);
     expect(identifier.identifier.staticElement, isNull);
-    _listener.assertNoErrors();
+  }
+
+  test_visitRedirectingConstructorInvocation_named() async {
+    await assertNoErrorsInCode('''
+class C {
+  C(int x) : this.named(x /*usage*/);
+  C.named(int y);
+}
+''');
+    var invocation = findNode.redirectingConstructorInvocation('this');
+    var namedConstructor = findElement.constructor('named', of: 'C');
+    expect(invocation.staticElement, namedConstructor);
+    expect(invocation.constructorName!.staticElement, namedConstructor);
+    expect(findNode.simple('x /*usage*/').staticParameterElement,
+        findElement.parameter('y'));
+  }
+
+  test_visitRedirectingConstructorInvocation_unnamed() async {
+    await assertNoErrorsInCode('''
+class C {
+  C.named(int x) : this(x /*usage*/);
+  C(int y);
+}
+''');
+    expect(findNode.redirectingConstructorInvocation('this').staticElement,
+        findElement.unnamedConstructor('C'));
+    expect(findNode.simple('x /*usage*/').staticParameterElement,
+        findElement.parameter('y'));
   }
 
   test_visitSuperConstructorInvocation() async {
-    ClassElementImpl superclass = ElementFactory.classElement2("A");
-    _encloseElement(superclass);
-    ConstructorElementImpl superConstructor =
-        ElementFactory.constructorElement2(superclass, null);
-    superclass.constructors = <ConstructorElement>[superConstructor];
-    ClassElementImpl subclass =
-        ElementFactory.classElement("B", interfaceTypeStar(superclass));
-    _encloseElement(subclass);
-    ConstructorElementImpl subConstructor =
-        ElementFactory.constructorElement2(subclass, null);
-    subclass.constructors = <ConstructorElement>[subConstructor];
-    SuperConstructorInvocation invocation =
-        AstTestFactory.superConstructorInvocation();
-    AstTestFactory.classDeclaration(null, 'C', null, null, null, null, [
-      AstTestFactory.constructorDeclaration(AstTestFactory.identifier3('C'),
-          null, AstTestFactory.formalParameterList(), [invocation])
-    ]);
-    _resolveInClass(invocation, subclass);
-    expect(invocation.staticElement, superConstructor);
-    _listener.assertNoErrors();
+    await assertNoErrorsInCode('''
+class A {}
+class B extends A {
+  B() : super();
+}
+''');
+    expect(findNode.superConstructorInvocation('super').staticElement,
+        findElement.unnamedConstructor('A'));
   }
 
   test_visitSuperConstructorInvocation_namedParameter() async {
-    ClassElementImpl superclass = ElementFactory.classElement2("A");
-    _encloseElement(superclass);
-    ConstructorElementImpl superConstructor =
-        ElementFactory.constructorElement2(superclass, null);
-    String parameterName = "p";
-    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
-    superConstructor.parameters = <ParameterElement>[parameter];
-    superclass.constructors = <ConstructorElement>[superConstructor];
-    ClassElementImpl subclass =
-        ElementFactory.classElement("B", interfaceTypeStar(superclass));
-    _encloseElement(subclass);
-    ConstructorElementImpl subConstructor =
-        ElementFactory.constructorElement2(subclass, null);
-    subclass.constructors = <ConstructorElement>[subConstructor];
-    SuperConstructorInvocation invocation =
-        AstTestFactory.superConstructorInvocation([
-      AstTestFactory.namedExpression2(parameterName, AstTestFactory.integer(0))
-    ]);
-    AstTestFactory.classDeclaration(null, 'C', null, null, null, null, [
-      AstTestFactory.constructorDeclaration(AstTestFactory.identifier3('C'),
-          null, AstTestFactory.formalParameterList(), [invocation])
-    ]);
-    _resolveInClass(invocation, subclass);
-    expect(invocation.staticElement, superConstructor);
-    expect(
-        (invocation.argumentList.arguments[0] as NamedExpression)
-            .name
-            .label
-            .staticElement,
-        same(parameter));
-    _listener.assertNoErrors();
-  }
-
-  /// Create and return the resolver used by the tests.
-  void _createResolver() {
-    var context = TestAnalysisContext();
-    _typeProvider = context.typeProviderLegacy;
-
-    Source source = FileSource(getFile("/test.dart"));
-    CompilationUnitElementImpl unit = CompilationUnitElementImpl();
-    unit.librarySource = unit.source = source;
-    _definingLibrary = ElementFactory.library(context, "test");
-    _definingLibrary.definingCompilationUnit = unit;
-
-    _definingLibrary.typeProvider = context.typeProviderLegacy;
-    _definingLibrary.typeSystem = context.typeSystemLegacy;
-    var inheritance = InheritanceManager3();
-
-    var featureSet = FeatureSet.latestLanguageVersion();
-    _visitor = ResolverVisitor(
-        inheritance, _definingLibrary, source, _typeProvider, _listener,
-        featureSet: featureSet,
-        flowAnalysisHelper:
-            FlowAnalysisHelper(context.typeSystemLegacy, false, featureSet));
-    _resolver = _visitor.elementResolver;
-  }
-
-  void _encloseElement(ElementImpl element) {
-    if (element is ClassElement) {
-      element.enclosingElement = _definingLibrary;
-    }
-  }
-
-  /// Return the element associated with the label of [statement] after the
-  /// resolver has resolved it.  [labelElement] is the label element to be
-  /// defined in the statement's label scope, and [labelTarget] is the statement
-  /// the label resolves to.
-  Element? _resolveBreak(BreakStatement statement,
-      LabelElementImpl labelElement, Statement labelTarget) {
-    _resolveStatement(statement, labelElement, labelTarget);
-    return statement.label!.staticElement;
-  }
-
-  /// Return the element associated with the label [statement] after the
-  /// resolver has resolved it.  [labelElement] is the label element to be
-  /// defined in the statement's label scope, and [labelTarget] is the AST node
-  /// the label resolves to.
-  ///
-  /// @param statement the statement to be resolved
-  /// @param labelElement the label element to be defined in the statement's
-  ///          label scope
-  /// @return the element to which the statement's label was resolved
-  Element? _resolveContinue(ContinueStatement statement,
-      LabelElementImpl labelElement, AstNode labelTarget) {
-    _resolveStatement(statement, labelElement, labelTarget);
-    return statement.label!.staticElement;
-  }
-
-  /// Return the element associated with the given identifier after the resolver
-  /// has resolved the identifier.
-  ///
-  /// @param node the expression to be resolved
-  /// @param enclosingClass the element representing the class enclosing the
-  ///          identifier
-  /// @return the element to which the expression was resolved
-  void _resolveInClass(AstNode node, ClassElement enclosingClass) {
-    try {
-      _visitor.enclosingClass = enclosingClass;
-      node.accept(_resolver);
-    } finally {
-      _visitor.enclosingClass = null;
-    }
-  }
-
-  /// Return the element associated with the given identifier after the resolver
-  /// has resolved the identifier.
-  ///
-  /// @param node the expression to be resolved
-  /// @param definedElements the elements that are to be defined in the scope in
-  ///          which the element is being resolved
-  /// @return the element to which the expression was resolved
-  void _resolveNode(AstNode node) {
-    node.accept(_resolver);
-  }
-
-  /// Return the element associated with the label of the given statement after
-  /// the resolver has resolved the statement.
-  ///
-  /// @param statement the statement to be resolved
-  /// @param labelElement the label element to be defined in the statement's
-  ///          label scope
-  /// @return the element to which the statement's label was resolved
-  void _resolveStatement(Statement statement, LabelElementImpl? labelElement,
-      AstNode? labelTarget) {
-    statement.accept(_resolver);
-  }
+    await assertNoErrorsInCode('''
+class A {
+  A({dynamic p});
 }
-
-class _LibraryElementMock implements LibraryElement {
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+class B extends A {
+  B() : super(p: 0);
+}
+''');
+    expect(findNode.superConstructorInvocation('super').staticElement,
+        findElement.unnamedConstructor('A'));
+    expect(
+        findNode.simple('p:').staticElement, same(findElement.parameter('p')));
+  }
 }
diff --git a/pkg/analyzer/test/generated/java_io_test.dart b/pkg/analyzer/test/generated/java_io_test.dart
index 561b53a..35bfdeb 100644
--- a/pkg/analyzer/test/generated/java_io_test.dart
+++ b/pkg/analyzer/test/generated/java_io_test.dart
@@ -16,6 +16,7 @@
         expect(path.context.isAbsolute(absolutePath), isTrue,
             reason: '"$absolutePath" is not absolute');
         // test that toURI() returns an absolute URI
+        // ignore: deprecated_member_use_from_same_package
         Uri uri = JavaFile(absolutePath).toURI();
         expect(uri.isAbsolute, isTrue);
         expect(uri.scheme, 'file');
@@ -30,6 +31,7 @@
         // it may be not on Windows, if "temp" is on other disk.
         String relPath = path.context.relative(absolutePath);
         // test that toURI() returns an absolute URI
+        // ignore: deprecated_member_use_from_same_package
         Uri uri = JavaFile(relPath).toURI();
         expect(uri.isAbsolute, isTrue);
         expect(uri.scheme, 'file');
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index bf708fc..8891e87 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1451,6 +1451,26 @@
 ''');
   }
 
+  test_implicit_call_reference_in_top_level_type_inference() async {
+    // This test case is important because the variable `map` is subject to top
+    // level type inference, which means it gets resolved twice.  We need to
+    // make sure that on the second resolution pass, the resolver can handle the
+    // ImplicitCallReference node
+    await assertNoErrorsInCode(r'''
+typedef Object Func(Object x);
+
+class Bar {
+  int x = 42;
+
+  Object call(Object x) {
+    return 'Bar $x';
+  }
+}
+
+var map = <String, Func>{'bar': new Bar()};
+''');
+  }
+
   test_importDuplicatedLibraryName() async {
     newFile("$testPackageLibPath/lib.dart", content: "library lib;");
     await assertErrorsInCode(r'''
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 6cdd3b6..d588af2 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -87,8 +87,8 @@
 
   @override
   void beginClassDeclaration(
-      Token beginToken, Token? abstractToken, Token name) {
-    super.beginClassDeclaration(beginToken, abstractToken, name);
+      Token beginToken, Token? abstractToken, Token? macroToken, Token name) {
+    super.beginClassDeclaration(beginToken, abstractToken, macroToken, name);
     begin('ClassDeclaration');
   }
 
@@ -392,8 +392,9 @@
 
   @override
   void beginNamedMixinApplication(
-      Token beginToken, Token? abstractToken, Token name) {
-    super.beginNamedMixinApplication(beginToken, abstractToken, name);
+      Token beginToken, Token? abstractToken, Token? macroToken, Token name) {
+    super.beginNamedMixinApplication(
+        beginToken, abstractToken, macroToken, name);
     begin('NamedMixinApplication');
   }
 
@@ -732,9 +733,56 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     end('Enum');
-    super.endEnum(enumKeyword, leftBrace, count);
+    super.endEnum(enumKeyword, leftBrace, memberCount);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    end('Method');
+    super.endEnumConstructor(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    end('FactoryMethod');
+    super.endEnumFactoryMethod(beginToken, factoryKeyword, endToken);
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    expectIn('Member');
+    super.endEnumFields(
+        abstractToken,
+        externalToken,
+        staticToken,
+        covariantToken,
+        lateToken,
+        varFinalOrConst,
+        count,
+        beginToken,
+        endToken);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    end('Method');
+    super.endEnumMethod(
+        getOrSet, beginToken, beginParam, beginInitializers, endToken);
   }
 
   @override
@@ -838,15 +886,16 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     end('FormalParameter');
-    super.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
-        initializerStart, initializerEnd, kind, memberKind);
+    super.endFormalParameter(thisKeyword, superKeyword, periodAfterThisOrSuper,
+        nameToken, initializerStart, initializerEnd, kind, memberKind);
   }
 
   @override
@@ -1283,25 +1332,54 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    expectInOneOf(['ClassDeclaration', 'MixinDeclaration']);
-    listener?.handleClassOrMixinImplements(implementsKeyword, interfacesCount);
-  }
-
-  @override
   void handleDottedName(int count, Token firstIdentifier) {
     expectIn('ConditionalUri');
     super.handleDottedName(count, firstIdentifier);
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    expectIn('Enum');
+    super.handleEnumElement(beginToken);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    expectIn('Enum');
+    super.handleEnumElements(elementsEndToken, elementsCount);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    expectIn('Enum');
+    super.handleEnumHeader(enumKeyword, leftBrace);
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    expectIn('Enum');
+    super.handleEnumNoWithClause();
+  }
+
+  @override
+  void handleEnumWithClause(Token withKeyword) {
+    expectIn('Enum');
+    super.handleEnumWithClause(withKeyword);
+  }
+
+  @override
   void handleIdentifierList(int count) {
     expectInOneOf(['Hide', 'Show']);
     super.handleIdentifierList(count);
   }
 
   @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    expectInOneOf(['ClassDeclaration', 'MixinDeclaration', 'Enum']);
+    listener?.handleImplements(implementsKeyword, interfacesCount);
+  }
+
+  @override
   void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
     // This event normally happens within "Import",
     // but happens within "CompilationUnit" during recovery.
@@ -1346,6 +1424,12 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    expectIn('Enum');
+    super.handleNoTypeNameInConstructorReference(token);
+  }
+
+  @override
   void handleRecoverClassHeader() {
     expectIn('ClassDeclaration');
     listener?.handleRecoverClassHeader();
diff --git a/pkg/analyzer/test/generated/parser_test_base.dart b/pkg/analyzer/test/generated/parser_test_base.dart
index aed3955..4c2d5a6 100644
--- a/pkg/analyzer/test/generated/parser_test_base.dart
+++ b/pkg/analyzer/test/generated/parser_test_base.dart
@@ -814,6 +814,7 @@
         null,
         null,
         null,
+        null,
         Token(Keyword.CLASS, 0),
         astFactory.simpleIdentifier(
             fasta.StringToken.fromString(TokenType.IDENTIFIER, className, 6)),
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index 385bb7d..ba05ff5 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:test/test.dart';
 
 import '../src/dart/resolution/context_collection_resolution.dart';
@@ -238,7 +237,10 @@
   }
 
   void _checkResolved(
-      AstNode node, Element? element, Predicate<Element>? predicate) {
+    AstNode node,
+    Element? element,
+    bool Function(Element)? predicate,
+  ) {
     if (element == null) {
       if (_knownExceptions == null || !_knownExceptions!.contains(node)) {
         _unresolvedNodes.add(node);
diff --git a/pkg/analyzer/test/generated/source_factory_test.dart b/pkg/analyzer/test/generated/source_factory_test.dart
index 98e3f04..f13f48d 100644
--- a/pkg/analyzer/test/generated/source_factory_test.dart
+++ b/pkg/analyzer/test/generated/source_factory_test.dart
@@ -39,6 +39,16 @@
     expect(SourceFactory([]), isNotNull);
   }
 
+  void test_pathToUri() {
+    File file1 = getFile("/some/file1.dart");
+    File file2 = getFile("/some/file2.dart");
+    Uri expected1 = Uri.parse("file:///my_file.dart");
+    SourceFactory factory =
+        SourceFactory([UriResolver_restoreUri(file1.path, expected1)]);
+    expect(factory.pathToUri(file1.path), expected1);
+    expect(factory.pathToUri(file2.path), isNull);
+  }
+
   void test_resolveUri_absolute() {
     UriResolver_absolute resolver = UriResolver_absolute();
     SourceFactory factory = SourceFactory([resolver]);
@@ -95,6 +105,7 @@
     expect(result.uri.toString(), 'package:package/dir/second.dart');
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreUri() {
     File file1 = getFile("/some/file1.dart");
     File file2 = getFile("/some/file2.dart");
@@ -102,7 +113,7 @@
     Source source2 = FileSource(file2);
     Uri expected1 = Uri.parse("file:///my_file.dart");
     SourceFactory factory =
-        SourceFactory([UriResolver_restoreUri(source1, expected1)]);
+        SourceFactory([UriResolver_restoreUri(file1.path, expected1)]);
     expect(factory.restoreUri(source1), same(expected1));
     expect(factory.restoreUri(source2), isNull);
   }
@@ -121,20 +132,20 @@
 }
 
 class UriResolver_restoreUri extends UriResolver {
-  Source source1;
+  String path1;
   Uri expected1;
-  UriResolver_restoreUri(this.source1, this.expected1);
+  UriResolver_restoreUri(this.path1, this.expected1);
 
   @override
-  Source? resolveAbsolute(Uri uri) => null;
-
-  @override
-  Uri? restoreAbsolute(Source source) {
-    if (identical(source, source1)) {
+  Uri? pathToUri(String path) {
+    if (path == path1) {
       return expected1;
     }
     return null;
   }
+
+  @override
+  Source? resolveAbsolute(Uri uri) => null;
 }
 
 class UriResolver_SourceFactoryTest_test_fromEncoding_valid
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index affcebc..145865a 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -5,7 +5,9 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 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/scope.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
@@ -16,7 +18,6 @@
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/generated/resolver.dart' show ResolverVisitor;
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/static_type_analyzer.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/source/source_resource.dart';
@@ -54,8 +55,8 @@
   /// The library containing the code being resolved.
   late final LibraryElementImpl _definingLibrary;
 
-  /// The analyzer being used to analyze the test cases.
-  late final StaticTypeAnalyzer _analyzer;
+  /// The compilation unit containing the code being resolved.
+  late CompilationUnitElementImpl _definingCompilationUnit;
 
   /// The type provider used to access the types.
   late final TypeProvider _typeProvider;
@@ -230,7 +231,7 @@
     InterfaceType superclassType = interfaceTypeStar(superclass);
     ClassElement subclass = ElementFactory.classElement("B", superclassType);
     Expression node = AstTestFactory.asExpression(
-        AstTestFactory.thisExpression(), AstTestFactory.typeName(subclass));
+        AstTestFactory.thisExpression(), AstTestFactory.namedType(subclass));
     expect(_analyze(node, superclassType), interfaceTypeStar(subclass));
     _listener.assertNoErrors();
   }
@@ -272,8 +273,9 @@
 
   void test_visitCascadeExpression() {
     // a..length
-    Expression node = AstTestFactory.cascadeExpression(
-        _resolvedString("a"), [AstTestFactory.propertyAccess2(null, "length")]);
+    Expression node = AstTestFactory.cascadeExpression(_resolvedString("a"), [
+      AstTestFactory.propertyAccess2(null, "length", TokenType.PERIOD_PERIOD)
+    ]);
     expect(_analyze(node), same(_typeProvider.stringType));
     _listener.assertNoErrors();
   }
@@ -308,15 +310,17 @@
   void test_visitInstanceCreationExpression_named() {
     // new C.m()
     ClassElementImpl classElement = ElementFactory.classElement2("C");
+    _definingCompilationUnit.classes = [classElement];
     String constructorName = "m";
     ConstructorElementImpl constructor =
         ElementFactory.constructorElement2(classElement, constructorName);
     classElement.constructors = <ConstructorElement>[constructor];
     InstanceCreationExpression node =
         AstTestFactory.instanceCreationExpression2(
-            null,
-            AstTestFactory.typeName(classElement),
-            [AstTestFactory.identifier3(constructorName)]);
+            null, AstTestFactory.namedType(classElement), [
+      AstTestFactory.identifier3(constructorName)
+        ..scopeLookupResult = ScopeLookupResult(constructor, null)
+    ]);
     expect(_analyze(node), interfaceTypeStar(classElement));
     _listener.assertNoErrors();
   }
@@ -328,12 +332,13 @@
     ConstructorElementImpl constructor =
         ElementFactory.constructorElement2(elementC, null);
     elementC.constructors = <ConstructorElement>[constructor];
-    var typeName =
-        AstTestFactory.typeName(elementC, [AstTestFactory.typeName(elementI)]);
+    var typeName = AstTestFactory.namedType(
+        elementC, [AstTestFactory.namedType(elementI)]);
     typeName.type = interfaceTypeStar(elementC,
         typeArguments: [interfaceTypeStar(elementI)]);
     InstanceCreationExpression node =
         AstTestFactory.instanceCreationExpression2(null, typeName);
+    _definingCompilationUnit.classes = [elementC, elementI];
     InterfaceType type = _analyze(node) as InterfaceType;
     List<DartType> typeArgs = type.typeArguments;
     expect(typeArgs.length, 1);
@@ -344,12 +349,13 @@
   void test_visitInstanceCreationExpression_unnamed() {
     // new C()
     ClassElementImpl classElement = ElementFactory.classElement2("C");
+    _definingCompilationUnit.classes = [classElement];
     ConstructorElementImpl constructor =
         ElementFactory.constructorElement2(classElement, null);
     classElement.constructors = <ConstructorElement>[constructor];
     InstanceCreationExpression node =
         AstTestFactory.instanceCreationExpression2(
-            null, AstTestFactory.typeName(classElement));
+            null, AstTestFactory.namedType(classElement));
     expect(_analyze(node), interfaceTypeStar(classElement));
     _listener.assertNoErrors();
   }
@@ -365,7 +371,7 @@
   void test_visitIsExpression_negated() {
     // a is! String
     Expression node = AstTestFactory.isExpression(
-        _resolvedString("a"), true, AstTestFactory.typeName4("String"));
+        _resolvedString("a"), true, AstTestFactory.namedType4("String"));
     expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
@@ -373,7 +379,7 @@
   void test_visitIsExpression_notNegated() {
     // a is String
     Expression node = AstTestFactory.isExpression(
-        _resolvedString("a"), false, AstTestFactory.typeName4("String"));
+        _resolvedString("a"), false, AstTestFactory.namedType4("String"));
     expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
@@ -434,6 +440,13 @@
     InterfaceType thisType =
         interfaceTypeStar(ElementFactory.classElement("B", superType));
     Expression node = AstTestFactory.superExpression();
+    // Place the super expression inside a method declaration
+    // (`test() => super.foo;`) so that we don't provoke a
+    // SUPER_IN_INVALID_CONTEXT error
+    AstTestFactory.methodDeclaration4(
+        name: 'test',
+        body: AstTestFactory.expressionFunctionBody(
+            AstTestFactory.propertyAccess2(node, 'foo')));
     expect(_analyze(node, thisType), same(thisType));
     _listener.assertNoErrors();
   }
@@ -466,7 +479,7 @@
     if (thisType != null) {
       _visitor.setThisInterfaceType(thisType);
     }
-    node.accept(_analyzer);
+    node.accept(_visitor);
     return node.typeOrThrow;
   }
 
@@ -499,15 +512,14 @@
     var context = TestAnalysisContext();
     var inheritance = InheritanceManager3();
     Source source = FileSource(getFile("/lib.dart"));
-    CompilationUnitElementImpl definingCompilationUnit =
-        CompilationUnitElementImpl();
-    definingCompilationUnit.librarySource =
-        definingCompilationUnit.source = source;
+    _definingCompilationUnit = CompilationUnitElementImpl();
+    _definingCompilationUnit.librarySource =
+        _definingCompilationUnit.source = source;
     var featureSet = FeatureSet.latestLanguageVersion();
 
     _definingLibrary = LibraryElementImpl(
         context, _AnalysisSessionMock(), 'name', -1, 0, featureSet);
-    _definingLibrary.definingCompilationUnit = definingCompilationUnit;
+    _definingLibrary.definingCompilationUnit = _definingCompilationUnit;
 
     _definingLibrary.typeProvider = context.typeProviderLegacy;
     _definingLibrary.typeSystem = context.typeSystemLegacy;
@@ -518,7 +530,6 @@
         featureSet: featureSet,
         flowAnalysisHelper:
             FlowAnalysisHelper(context.typeSystemLegacy, false, featureSet));
-    _analyzer = _visitor.typeAnalyzer;
   }
 
   DartType _flatten(DartType type) => _typeSystem.flatten(type);
diff --git a/pkg/analyzer/test/generated/test_analysis_context.dart b/pkg/analyzer/test/generated/test_analysis_context.dart
index 840d225..7d5eae6 100644
--- a/pkg/analyzer/test/generated/test_analysis_context.dart
+++ b/pkg/analyzer/test/generated/test_analysis_context.dart
@@ -9,7 +9,7 @@
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk_elements.dart';
 
 class TestAnalysisContext implements AnalysisContext {
@@ -43,6 +43,7 @@
     _typeSystemLegacy = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: false,
+      strictCasts: _analysisOptions.strictCasts,
       strictInference: _analysisOptions.strictInference,
       typeProvider: _typeProviderLegacy,
     );
@@ -50,6 +51,7 @@
     _typeSystemNonNullableByDefault = TypeSystemImpl(
       implicitCasts: _analysisOptions.implicitCasts,
       isNonNullableByDefault: true,
+      strictCasts: _analysisOptions.strictCasts,
       strictInference: _analysisOptions.strictInference,
       typeProvider: _typeProviderNonNullableByDefault,
     );
@@ -105,6 +107,7 @@
 
   _MockSource(this.uri);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => '$uri';
 
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index be7a535..927a542 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -454,6 +454,7 @@
     return TimestampedData<String>(0, _contents);
   }
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => _name;
 
@@ -465,11 +466,13 @@
   @override
   int get hashCode => 0;
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary {
     return false;
   }
 
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp =>
       generateExceptionOnRead ? -1 : _modificationStamp;
@@ -482,6 +485,7 @@
   @override
   Uri get uri => Uri.file(_name);
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind {
     throw UnsupportedError('uriKind');
@@ -519,9 +523,11 @@
   TestSourceWithUri(String path, this.uri, [String content = ''])
       : super(path, content);
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => uri.toString();
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind {
     if (uri.scheme == 'dart') {
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 95aa605..cd93433 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -2,15 +2,15 @@
 // 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/features.dart';
 import 'package:analyzer/dart/analysis/utilities.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/src/dart/ast/ast_factory.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -20,7 +20,6 @@
     defineReflectiveTests(LineInfoTest);
     defineReflectiveTests(NodeReplacerTest);
     defineReflectiveTests(SourceRangeTest);
-    defineReflectiveTests(StringUtilitiesTest);
   });
 }
 
@@ -113,941 +112,6 @@
   }
 }
 
-class Getter_NodeReplacerTest_test_annotation
-    implements NodeReplacerTest_Getter<Annotation, ArgumentList> {
-  @override
-  ArgumentList? get(Annotation node) => node.arguments;
-}
-
-class Getter_NodeReplacerTest_test_annotation_2
-    implements NodeReplacerTest_Getter<Annotation, Identifier> {
-  @override
-  Identifier get(Annotation node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_annotation_3
-    implements NodeReplacerTest_Getter<Annotation, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(Annotation node) => node.constructorName;
-}
-
-class Getter_NodeReplacerTest_test_annotation_4
-    implements NodeReplacerTest_Getter<Annotation, TypeArgumentList> {
-  @override
-  TypeArgumentList? get(Annotation node) => node.typeArguments;
-}
-
-class Getter_NodeReplacerTest_test_asExpression
-    implements NodeReplacerTest_Getter<AsExpression, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(AsExpression node) => node.type;
-}
-
-class Getter_NodeReplacerTest_test_asExpression_2
-    implements NodeReplacerTest_Getter<AsExpression, Expression> {
-  @override
-  Expression get(AsExpression node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_assertStatement
-    implements NodeReplacerTest_Getter<AssertStatement, Expression> {
-  @override
-  Expression get(AssertStatement node) => node.condition;
-}
-
-class Getter_NodeReplacerTest_test_assertStatement_2
-    implements NodeReplacerTest_Getter<AssertStatement, Expression> {
-  @override
-  Expression? get(AssertStatement node) => node.message;
-}
-
-class Getter_NodeReplacerTest_test_assignmentExpression
-    implements NodeReplacerTest_Getter<AssignmentExpression, Expression> {
-  @override
-  Expression get(AssignmentExpression node) => node.rightHandSide;
-}
-
-class Getter_NodeReplacerTest_test_assignmentExpression_2
-    implements NodeReplacerTest_Getter<AssignmentExpression, Expression> {
-  @override
-  Expression get(AssignmentExpression node) => node.leftHandSide;
-}
-
-class Getter_NodeReplacerTest_test_awaitExpression
-    implements NodeReplacerTest_Getter<AwaitExpression, Expression> {
-  @override
-  Expression get(AwaitExpression node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_binaryExpression
-    implements NodeReplacerTest_Getter<BinaryExpression, Expression> {
-  @override
-  Expression get(BinaryExpression node) => node.leftOperand;
-}
-
-class Getter_NodeReplacerTest_test_binaryExpression_2
-    implements NodeReplacerTest_Getter<BinaryExpression, Expression> {
-  @override
-  Expression get(BinaryExpression node) => node.rightOperand;
-}
-
-class Getter_NodeReplacerTest_test_blockFunctionBody
-    implements NodeReplacerTest_Getter<BlockFunctionBody, Block> {
-  @override
-  Block get(BlockFunctionBody node) => node.block;
-}
-
-class Getter_NodeReplacerTest_test_breakStatement
-    implements NodeReplacerTest_Getter<BreakStatement, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(BreakStatement node) => node.label;
-}
-
-class Getter_NodeReplacerTest_test_cascadeExpression
-    implements NodeReplacerTest_Getter<CascadeExpression, Expression> {
-  @override
-  Expression get(CascadeExpression node) => node.target;
-}
-
-class Getter_NodeReplacerTest_test_catchClause
-    implements NodeReplacerTest_Getter<CatchClause, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(CatchClause node) => node.stackTraceParameter;
-}
-
-class Getter_NodeReplacerTest_test_catchClause_2
-    implements NodeReplacerTest_Getter<CatchClause, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(CatchClause node) => node.exceptionParameter;
-}
-
-class Getter_NodeReplacerTest_test_catchClause_3
-    implements NodeReplacerTest_Getter<CatchClause, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(CatchClause node) => node.exceptionType;
-}
-
-class Getter_NodeReplacerTest_test_classDeclaration
-    implements NodeReplacerTest_Getter<ClassDeclaration, ImplementsClause> {
-  @override
-  ImplementsClause? get(ClassDeclaration node) => node.implementsClause;
-}
-
-class Getter_NodeReplacerTest_test_classDeclaration_2
-    implements NodeReplacerTest_Getter<ClassDeclaration, WithClause> {
-  @override
-  WithClause? get(ClassDeclaration node) => node.withClause;
-}
-
-class Getter_NodeReplacerTest_test_classDeclaration_3
-    implements NodeReplacerTest_Getter<ClassDeclaration, NativeClause> {
-  @override
-  NativeClause? get(ClassDeclaration node) => node.nativeClause;
-}
-
-class Getter_NodeReplacerTest_test_classDeclaration_4
-    implements NodeReplacerTest_Getter<ClassDeclaration, ExtendsClause> {
-  @override
-  ExtendsClause? get(ClassDeclaration node) => node.extendsClause;
-}
-
-class Getter_NodeReplacerTest_test_classDeclaration_5
-    implements NodeReplacerTest_Getter<ClassDeclaration, TypeParameterList> {
-  @override
-  TypeParameterList? get(ClassDeclaration node) => node.typeParameters;
-}
-
-class Getter_NodeReplacerTest_test_classDeclaration_6
-    implements NodeReplacerTest_Getter<ClassDeclaration, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(ClassDeclaration node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_classTypeAlias
-    implements NodeReplacerTest_Getter<ClassTypeAlias, NamedType> {
-  @override
-  NamedType get(ClassTypeAlias node) => node.superclass2;
-}
-
-class Getter_NodeReplacerTest_test_classTypeAlias_2
-    implements NodeReplacerTest_Getter<ClassTypeAlias, ImplementsClause> {
-  @override
-  ImplementsClause? get(ClassTypeAlias node) => node.implementsClause;
-}
-
-class Getter_NodeReplacerTest_test_classTypeAlias_3
-    implements NodeReplacerTest_Getter<ClassTypeAlias, WithClause> {
-  @override
-  WithClause get(ClassTypeAlias node) => node.withClause;
-}
-
-class Getter_NodeReplacerTest_test_classTypeAlias_4
-    implements NodeReplacerTest_Getter<ClassTypeAlias, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(ClassTypeAlias node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_classTypeAlias_5
-    implements NodeReplacerTest_Getter<ClassTypeAlias, TypeParameterList> {
-  @override
-  TypeParameterList? get(ClassTypeAlias node) => node.typeParameters;
-}
-
-class Getter_NodeReplacerTest_test_commentReference
-    implements
-        NodeReplacerTest_Getter<CommentReference, CommentReferableExpression> {
-  @override
-  CommentReferableExpression get(CommentReference node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_compilationUnit
-    implements NodeReplacerTest_Getter<CompilationUnit, ScriptTag> {
-  @override
-  ScriptTag? get(CompilationUnit node) => node.scriptTag;
-}
-
-class Getter_NodeReplacerTest_test_conditionalExpression
-    implements NodeReplacerTest_Getter<ConditionalExpression, Expression> {
-  @override
-  Expression get(ConditionalExpression node) => node.elseExpression;
-}
-
-class Getter_NodeReplacerTest_test_conditionalExpression_2
-    implements NodeReplacerTest_Getter<ConditionalExpression, Expression> {
-  @override
-  Expression get(ConditionalExpression node) => node.thenExpression;
-}
-
-class Getter_NodeReplacerTest_test_conditionalExpression_3
-    implements NodeReplacerTest_Getter<ConditionalExpression, Expression> {
-  @override
-  Expression get(ConditionalExpression node) => node.condition;
-}
-
-class Getter_NodeReplacerTest_test_constructorDeclaration
-    implements
-        NodeReplacerTest_Getter<ConstructorDeclaration, ConstructorName> {
-  @override
-  ConstructorName? get(ConstructorDeclaration node) =>
-      node.redirectedConstructor;
-}
-
-class Getter_NodeReplacerTest_test_constructorDeclaration_2
-    implements
-        NodeReplacerTest_Getter<ConstructorDeclaration, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(ConstructorDeclaration node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_constructorDeclaration_3
-    implements NodeReplacerTest_Getter<ConstructorDeclaration, Identifier> {
-  @override
-  Identifier get(ConstructorDeclaration node) => node.returnType;
-}
-
-class Getter_NodeReplacerTest_test_constructorDeclaration_4
-    implements
-        NodeReplacerTest_Getter<ConstructorDeclaration, FormalParameterList> {
-  @override
-  FormalParameterList get(ConstructorDeclaration node) => node.parameters;
-}
-
-class Getter_NodeReplacerTest_test_constructorDeclaration_5
-    implements NodeReplacerTest_Getter<ConstructorDeclaration, FunctionBody> {
-  @override
-  FunctionBody? get(ConstructorDeclaration node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_constructorFieldInitializer
-    implements
-        NodeReplacerTest_Getter<ConstructorFieldInitializer, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(ConstructorFieldInitializer node) => node.fieldName;
-}
-
-class Getter_NodeReplacerTest_test_constructorFieldInitializer_2
-    implements
-        NodeReplacerTest_Getter<ConstructorFieldInitializer, Expression> {
-  @override
-  Expression get(ConstructorFieldInitializer node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_constructorName
-    implements NodeReplacerTest_Getter<ConstructorName, NamedType> {
-  @override
-  NamedType get(ConstructorName node) => node.type2;
-}
-
-class Getter_NodeReplacerTest_test_constructorName_2
-    implements NodeReplacerTest_Getter<ConstructorName, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(ConstructorName node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_continueStatement
-    implements NodeReplacerTest_Getter<ContinueStatement, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(ContinueStatement node) => node.label;
-}
-
-class Getter_NodeReplacerTest_test_declaredIdentifier
-    implements NodeReplacerTest_Getter<DeclaredIdentifier, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(DeclaredIdentifier node) => node.type;
-}
-
-class Getter_NodeReplacerTest_test_declaredIdentifier_2
-    implements NodeReplacerTest_Getter<DeclaredIdentifier, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(DeclaredIdentifier node) => node.identifier;
-}
-
-class Getter_NodeReplacerTest_test_defaultFormalParameter
-    implements
-        NodeReplacerTest_Getter<DefaultFormalParameter, NormalFormalParameter> {
-  @override
-  NormalFormalParameter get(DefaultFormalParameter node) => node.parameter;
-}
-
-class Getter_NodeReplacerTest_test_defaultFormalParameter_2
-    implements NodeReplacerTest_Getter<DefaultFormalParameter, Expression> {
-  @override
-  Expression? get(DefaultFormalParameter node) => node.defaultValue;
-}
-
-class Getter_NodeReplacerTest_test_doStatement
-    implements NodeReplacerTest_Getter<DoStatement, Expression> {
-  @override
-  Expression get(DoStatement node) => node.condition;
-}
-
-class Getter_NodeReplacerTest_test_doStatement_2
-    implements NodeReplacerTest_Getter<DoStatement, Statement> {
-  @override
-  Statement get(DoStatement node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_enumConstantDeclaration
-    implements
-        NodeReplacerTest_Getter<EnumConstantDeclaration, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(EnumConstantDeclaration node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_enumDeclaration
-    implements NodeReplacerTest_Getter<EnumDeclaration, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(EnumDeclaration node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_expressionFunctionBody
-    implements NodeReplacerTest_Getter<ExpressionFunctionBody, Expression> {
-  @override
-  Expression get(ExpressionFunctionBody node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_expressionStatement
-    implements NodeReplacerTest_Getter<ExpressionStatement, Expression> {
-  @override
-  Expression get(ExpressionStatement node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_extendsClause
-    implements NodeReplacerTest_Getter<ExtendsClause, NamedType> {
-  @override
-  NamedType get(ExtendsClause node) => node.superclass2;
-}
-
-class Getter_NodeReplacerTest_test_fieldDeclaration
-    implements
-        NodeReplacerTest_Getter<FieldDeclaration, VariableDeclarationList> {
-  @override
-  VariableDeclarationList get(FieldDeclaration node) => node.fields;
-}
-
-class Getter_NodeReplacerTest_test_fieldFormalParameter
-    implements
-        NodeReplacerTest_Getter<FieldFormalParameter, FormalParameterList> {
-  @override
-  FormalParameterList? get(FieldFormalParameter node) => node.parameters;
-}
-
-class Getter_NodeReplacerTest_test_fieldFormalParameter_2
-    implements NodeReplacerTest_Getter<FieldFormalParameter, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(FieldFormalParameter node) => node.type;
-}
-
-class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier
-    implements NodeReplacerTest_Getter<ForStatement, Statement> {
-  @override
-  Statement get(ForStatement node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_2
-    implements NodeReplacerTest_Getter<ForStatement, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(ForStatement node) =>
-      (node.forLoopParts as ForEachPartsWithIdentifier).identifier;
-}
-
-class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3
-    implements NodeReplacerTest_Getter<ForStatement, Expression> {
-  @override
-  Expression get(ForStatement node) =>
-      (node.forLoopParts as ForEachParts).iterable;
-}
-
-class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable
-    implements NodeReplacerTest_Getter<ForStatement, Expression> {
-  @override
-  Expression get(ForStatement node) =>
-      (node.forLoopParts as ForEachParts).iterable;
-}
-
-class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2
-    implements NodeReplacerTest_Getter<ForStatement, DeclaredIdentifier> {
-  @override
-  DeclaredIdentifier get(ForStatement node) =>
-      (node.forLoopParts as ForEachPartsWithDeclaration).loopVariable;
-}
-
-class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_3
-    implements NodeReplacerTest_Getter<ForStatement, Statement> {
-  @override
-  Statement get(ForStatement node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_forStatement_withInitialization
-    implements NodeReplacerTest_Getter<ForStatement, Statement> {
-  @override
-  Statement get(ForStatement node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_forStatement_withInitialization_2
-    implements NodeReplacerTest_Getter<ForStatement, Expression> {
-  @override
-  Expression? get(ForStatement node) =>
-      (node.forLoopParts as ForParts).condition;
-}
-
-class Getter_NodeReplacerTest_test_forStatement_withInitialization_3
-    implements NodeReplacerTest_Getter<ForStatement, Expression> {
-  @override
-  Expression? get(ForStatement node) =>
-      (node.forLoopParts as ForPartsWithExpression).initialization;
-}
-
-class Getter_NodeReplacerTest_test_forStatement_withVariables
-    implements NodeReplacerTest_Getter<ForStatement, Statement> {
-  @override
-  Statement get(ForStatement node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_forStatement_withVariables_2
-    implements NodeReplacerTest_Getter<ForStatement, VariableDeclarationList> {
-  @override
-  VariableDeclarationList get(ForStatement node) =>
-      (node.forLoopParts as ForPartsWithDeclarations).variables;
-}
-
-class Getter_NodeReplacerTest_test_forStatement_withVariables_3
-    implements NodeReplacerTest_Getter<ForStatement, Expression> {
-  @override
-  Expression? get(ForStatement node) =>
-      (node.forLoopParts as ForParts).condition;
-}
-
-class Getter_NodeReplacerTest_test_functionDeclaration
-    implements NodeReplacerTest_Getter<FunctionDeclaration, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(FunctionDeclaration node) => node.returnType;
-}
-
-class Getter_NodeReplacerTest_test_functionDeclaration_2
-    implements
-        NodeReplacerTest_Getter<FunctionDeclaration, FunctionExpression> {
-  @override
-  FunctionExpression get(FunctionDeclaration node) => node.functionExpression;
-}
-
-class Getter_NodeReplacerTest_test_functionDeclaration_3
-    implements NodeReplacerTest_Getter<FunctionDeclaration, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(FunctionDeclaration node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_functionDeclarationStatement
-    implements
-        NodeReplacerTest_Getter<FunctionDeclarationStatement,
-            FunctionDeclaration> {
-  @override
-  FunctionDeclaration get(FunctionDeclarationStatement node) =>
-      node.functionDeclaration;
-}
-
-class Getter_NodeReplacerTest_test_functionExpression
-    implements
-        NodeReplacerTest_Getter<FunctionExpression, FormalParameterList> {
-  @override
-  FormalParameterList? get(FunctionExpression node) => node.parameters;
-}
-
-class Getter_NodeReplacerTest_test_functionExpression_2
-    implements NodeReplacerTest_Getter<FunctionExpression, FunctionBody> {
-  @override
-  FunctionBody? get(FunctionExpression node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_functionExpressionInvocation
-    implements
-        NodeReplacerTest_Getter<FunctionExpressionInvocation, Expression> {
-  @override
-  Expression get(FunctionExpressionInvocation node) => node.function;
-}
-
-class Getter_NodeReplacerTest_test_functionExpressionInvocation_2
-    implements
-        NodeReplacerTest_Getter<FunctionExpressionInvocation, ArgumentList> {
-  @override
-  ArgumentList get(FunctionExpressionInvocation node) => node.argumentList;
-}
-
-class Getter_NodeReplacerTest_test_functionTypeAlias
-    implements NodeReplacerTest_Getter<FunctionTypeAlias, TypeParameterList> {
-  @override
-  TypeParameterList? get(FunctionTypeAlias node) => node.typeParameters;
-}
-
-class Getter_NodeReplacerTest_test_functionTypeAlias_2
-    implements NodeReplacerTest_Getter<FunctionTypeAlias, FormalParameterList> {
-  @override
-  FormalParameterList get(FunctionTypeAlias node) => node.parameters;
-}
-
-class Getter_NodeReplacerTest_test_functionTypeAlias_3
-    implements NodeReplacerTest_Getter<FunctionTypeAlias, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(FunctionTypeAlias node) => node.returnType;
-}
-
-class Getter_NodeReplacerTest_test_functionTypeAlias_4
-    implements NodeReplacerTest_Getter<FunctionTypeAlias, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(FunctionTypeAlias node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_functionTypedFormalParameter
-    implements
-        NodeReplacerTest_Getter<FunctionTypedFormalParameter, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(FunctionTypedFormalParameter node) => node.returnType;
-}
-
-class Getter_NodeReplacerTest_test_functionTypedFormalParameter_2
-    implements
-        NodeReplacerTest_Getter<FunctionTypedFormalParameter,
-            FormalParameterList> {
-  @override
-  FormalParameterList get(FunctionTypedFormalParameter node) => node.parameters;
-}
-
-class Getter_NodeReplacerTest_test_ifStatement
-    implements NodeReplacerTest_Getter<IfStatement, Expression> {
-  @override
-  Expression get(IfStatement node) => node.condition;
-}
-
-class Getter_NodeReplacerTest_test_ifStatement_2
-    implements NodeReplacerTest_Getter<IfStatement, Statement> {
-  @override
-  Statement? get(IfStatement node) => node.elseStatement;
-}
-
-class Getter_NodeReplacerTest_test_ifStatement_3
-    implements NodeReplacerTest_Getter<IfStatement, Statement> {
-  @override
-  Statement get(IfStatement node) => node.thenStatement;
-}
-
-class Getter_NodeReplacerTest_test_importDirective
-    implements NodeReplacerTest_Getter<ImportDirective, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(ImportDirective node) => node.prefix;
-}
-
-class Getter_NodeReplacerTest_test_indexExpression
-    implements NodeReplacerTest_Getter<IndexExpression, Expression> {
-  @override
-  Expression? get(IndexExpression node) => node.target;
-}
-
-class Getter_NodeReplacerTest_test_indexExpression_2
-    implements NodeReplacerTest_Getter<IndexExpression, Expression> {
-  @override
-  Expression get(IndexExpression node) => node.index;
-}
-
-class Getter_NodeReplacerTest_test_instanceCreationExpression
-    implements
-        NodeReplacerTest_Getter<InstanceCreationExpression, ArgumentList> {
-  @override
-  ArgumentList get(InstanceCreationExpression node) => node.argumentList;
-}
-
-class Getter_NodeReplacerTest_test_instanceCreationExpression_2
-    implements
-        NodeReplacerTest_Getter<InstanceCreationExpression, ConstructorName> {
-  @override
-  ConstructorName get(InstanceCreationExpression node) => node.constructorName;
-}
-
-class Getter_NodeReplacerTest_test_interpolationExpression
-    implements NodeReplacerTest_Getter<InterpolationExpression, Expression> {
-  @override
-  Expression get(InterpolationExpression node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_isExpression
-    implements NodeReplacerTest_Getter<IsExpression, Expression> {
-  @override
-  Expression get(IsExpression node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_isExpression_2
-    implements NodeReplacerTest_Getter<IsExpression, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(IsExpression node) => node.type;
-}
-
-class Getter_NodeReplacerTest_test_label
-    implements NodeReplacerTest_Getter<Label, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(Label node) => node.label;
-}
-
-class Getter_NodeReplacerTest_test_labeledStatement
-    implements NodeReplacerTest_Getter<LabeledStatement, Statement> {
-  @override
-  Statement get(LabeledStatement node) => node.statement;
-}
-
-class Getter_NodeReplacerTest_test_libraryDirective
-    implements NodeReplacerTest_Getter<LibraryDirective, LibraryIdentifier> {
-  @override
-  LibraryIdentifier get(LibraryDirective node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_mapLiteralEntry
-    implements NodeReplacerTest_Getter<MapLiteralEntry, Expression> {
-  @override
-  Expression get(MapLiteralEntry node) => node.value;
-}
-
-class Getter_NodeReplacerTest_test_mapLiteralEntry_2
-    implements NodeReplacerTest_Getter<MapLiteralEntry, Expression> {
-  @override
-  Expression get(MapLiteralEntry node) => node.key;
-}
-
-class Getter_NodeReplacerTest_test_methodDeclaration
-    implements NodeReplacerTest_Getter<MethodDeclaration, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(MethodDeclaration node) => node.returnType;
-}
-
-class Getter_NodeReplacerTest_test_methodDeclaration_2
-    implements NodeReplacerTest_Getter<MethodDeclaration, FunctionBody> {
-  @override
-  FunctionBody get(MethodDeclaration node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_methodDeclaration_3
-    implements NodeReplacerTest_Getter<MethodDeclaration, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(MethodDeclaration node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_methodDeclaration_4
-    implements NodeReplacerTest_Getter<MethodDeclaration, FormalParameterList> {
-  @override
-  FormalParameterList? get(MethodDeclaration node) => node.parameters;
-}
-
-class Getter_NodeReplacerTest_test_methodInvocation
-    implements NodeReplacerTest_Getter<MethodInvocation, ArgumentList> {
-  @override
-  ArgumentList get(MethodInvocation node) => node.argumentList;
-}
-
-class Getter_NodeReplacerTest_test_methodInvocation_2
-    implements NodeReplacerTest_Getter<MethodInvocation, Expression> {
-  @override
-  Expression? get(MethodInvocation node) => node.target;
-}
-
-class Getter_NodeReplacerTest_test_methodInvocation_3
-    implements NodeReplacerTest_Getter<MethodInvocation, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(MethodInvocation node) => node.methodName;
-}
-
-class Getter_NodeReplacerTest_test_namedExpression
-    implements NodeReplacerTest_Getter<NamedExpression, Label> {
-  @override
-  Label get(NamedExpression node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_namedExpression_2
-    implements NodeReplacerTest_Getter<NamedExpression, Expression> {
-  @override
-  Expression get(NamedExpression node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_nativeClause
-    implements NodeReplacerTest_Getter<NativeClause, StringLiteral> {
-  @override
-  StringLiteral? get(NativeClause node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_nativeFunctionBody
-    implements NodeReplacerTest_Getter<NativeFunctionBody, StringLiteral> {
-  @override
-  StringLiteral? get(NativeFunctionBody node) => node.stringLiteral;
-}
-
-class Getter_NodeReplacerTest_test_parenthesizedExpression
-    implements NodeReplacerTest_Getter<ParenthesizedExpression, Expression> {
-  @override
-  Expression get(ParenthesizedExpression node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_partOfDirective
-    implements NodeReplacerTest_Getter<PartOfDirective, LibraryIdentifier> {
-  @override
-  LibraryIdentifier? get(PartOfDirective node) => node.libraryName;
-}
-
-class Getter_NodeReplacerTest_test_postfixExpression
-    implements NodeReplacerTest_Getter<PostfixExpression, Expression> {
-  @override
-  Expression get(PostfixExpression node) => node.operand;
-}
-
-class Getter_NodeReplacerTest_test_prefixedIdentifier
-    implements NodeReplacerTest_Getter<PrefixedIdentifier, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(PrefixedIdentifier node) => node.identifier;
-}
-
-class Getter_NodeReplacerTest_test_prefixedIdentifier_2
-    implements NodeReplacerTest_Getter<PrefixedIdentifier, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(PrefixedIdentifier node) => node.prefix;
-}
-
-class Getter_NodeReplacerTest_test_prefixExpression
-    implements NodeReplacerTest_Getter<PrefixExpression, Expression> {
-  @override
-  Expression get(PrefixExpression node) => node.operand;
-}
-
-class Getter_NodeReplacerTest_test_propertyAccess
-    implements NodeReplacerTest_Getter<PropertyAccess, Expression> {
-  @override
-  Expression? get(PropertyAccess node) => node.target;
-}
-
-class Getter_NodeReplacerTest_test_propertyAccess_2
-    implements NodeReplacerTest_Getter<PropertyAccess, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(PropertyAccess node) => node.propertyName;
-}
-
-class Getter_NodeReplacerTest_test_redirectingConstructorInvocation
-    implements
-        NodeReplacerTest_Getter<RedirectingConstructorInvocation,
-            SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(RedirectingConstructorInvocation node) =>
-      node.constructorName;
-}
-
-class Getter_NodeReplacerTest_test_redirectingConstructorInvocation_2
-    implements
-        NodeReplacerTest_Getter<RedirectingConstructorInvocation,
-            ArgumentList> {
-  @override
-  ArgumentList get(RedirectingConstructorInvocation node) => node.argumentList;
-}
-
-class Getter_NodeReplacerTest_test_returnStatement
-    implements NodeReplacerTest_Getter<ReturnStatement, Expression> {
-  @override
-  Expression? get(ReturnStatement node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_simpleFormalParameter
-    implements NodeReplacerTest_Getter<SimpleFormalParameter, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(SimpleFormalParameter node) => node.type;
-}
-
-class Getter_NodeReplacerTest_test_superConstructorInvocation
-    implements
-        NodeReplacerTest_Getter<SuperConstructorInvocation, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(SuperConstructorInvocation node) =>
-      node.constructorName;
-}
-
-class Getter_NodeReplacerTest_test_superConstructorInvocation_2
-    implements
-        NodeReplacerTest_Getter<SuperConstructorInvocation, ArgumentList> {
-  @override
-  ArgumentList get(SuperConstructorInvocation node) => node.argumentList;
-}
-
-class Getter_NodeReplacerTest_test_switchCase
-    implements NodeReplacerTest_Getter<SwitchCase, Expression> {
-  @override
-  Expression get(SwitchCase node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_switchStatement
-    implements NodeReplacerTest_Getter<SwitchStatement, Expression> {
-  @override
-  Expression get(SwitchStatement node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_throwExpression
-    implements NodeReplacerTest_Getter<ThrowExpression, Expression> {
-  @override
-  Expression get(ThrowExpression node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_test_topLevelVariableDeclaration
-    implements
-        NodeReplacerTest_Getter<TopLevelVariableDeclaration,
-            VariableDeclarationList> {
-  @override
-  VariableDeclarationList get(TopLevelVariableDeclaration node) =>
-      node.variables;
-}
-
-class Getter_NodeReplacerTest_test_tryStatement
-    implements NodeReplacerTest_Getter<TryStatement, Block> {
-  @override
-  Block? get(TryStatement node) => node.finallyBlock;
-}
-
-class Getter_NodeReplacerTest_test_tryStatement_2
-    implements NodeReplacerTest_Getter<TryStatement, Block> {
-  @override
-  Block get(TryStatement node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_typeName
-    implements NodeReplacerTest_Getter<NamedType, TypeArgumentList> {
-  @override
-  TypeArgumentList? get(NamedType node) => node.typeArguments;
-}
-
-class Getter_NodeReplacerTest_test_typeName_2
-    implements NodeReplacerTest_Getter<NamedType, Identifier> {
-  @override
-  Identifier get(NamedType node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_typeParameter
-    implements NodeReplacerTest_Getter<TypeParameter, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(TypeParameter node) => node.bound;
-}
-
-class Getter_NodeReplacerTest_test_typeParameter_2
-    implements NodeReplacerTest_Getter<TypeParameter, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(TypeParameter node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_variableDeclaration
-    implements NodeReplacerTest_Getter<VariableDeclaration, SimpleIdentifier> {
-  @override
-  SimpleIdentifier get(VariableDeclaration node) => node.name;
-}
-
-class Getter_NodeReplacerTest_test_variableDeclaration_2
-    implements NodeReplacerTest_Getter<VariableDeclaration, Expression> {
-  @override
-  Expression? get(VariableDeclaration node) => node.initializer;
-}
-
-class Getter_NodeReplacerTest_test_variableDeclarationList
-    implements
-        NodeReplacerTest_Getter<VariableDeclarationList, TypeAnnotation> {
-  @override
-  TypeAnnotation? get(VariableDeclarationList node) => node.type;
-}
-
-class Getter_NodeReplacerTest_test_variableDeclarationStatement
-    implements
-        NodeReplacerTest_Getter<VariableDeclarationStatement,
-            VariableDeclarationList> {
-  @override
-  VariableDeclarationList get(VariableDeclarationStatement node) =>
-      node.variables;
-}
-
-class Getter_NodeReplacerTest_test_whileStatement
-    implements NodeReplacerTest_Getter<WhileStatement, Expression> {
-  @override
-  Expression get(WhileStatement node) => node.condition;
-}
-
-class Getter_NodeReplacerTest_test_whileStatement_2
-    implements NodeReplacerTest_Getter<WhileStatement, Statement> {
-  @override
-  Statement get(WhileStatement node) => node.body;
-}
-
-class Getter_NodeReplacerTest_test_yieldStatement
-    implements NodeReplacerTest_Getter<YieldStatement, Expression> {
-  @override
-  Expression get(YieldStatement node) => node.expression;
-}
-
-class Getter_NodeReplacerTest_testAnnotatedNode
-    implements NodeReplacerTest_Getter<AnnotatedNode, Comment> {
-  @override
-  Comment? get(AnnotatedNode node) => node.documentationComment;
-}
-
-class Getter_NodeReplacerTest_testNormalFormalParameter
-    implements
-        NodeReplacerTest_Getter<NormalFormalParameter, SimpleIdentifier> {
-  @override
-  SimpleIdentifier? get(NormalFormalParameter node) => node.identifier;
-}
-
-class Getter_NodeReplacerTest_testNormalFormalParameter_2
-    implements NodeReplacerTest_Getter<NormalFormalParameter, Comment> {
-  @override
-  Comment? get(NormalFormalParameter node) => node.documentationComment;
-}
-
-class Getter_NodeReplacerTest_testTypedLiteral
-    implements NodeReplacerTest_Getter<TypedLiteral, TypeArgumentList> {
-  @override
-  TypeArgumentList? get(TypedLiteral node) => node.typeArguments;
-}
-
-class Getter_NodeReplacerTest_testUriBasedDirective
-    implements NodeReplacerTest_Getter<UriBasedDirective, StringLiteral> {
-  @override
-  StringLiteral get(UriBasedDirective node) => node.uri;
-}
-
 @reflectiveTest
 class LineInfoTest {
   void test_creation() {
@@ -1060,6 +124,21 @@
     }, throwsArgumentError);
   }
 
+  void test_fromContent_n() {
+    var lineInfo = LineInfo.fromContent('a\nbb\nccc');
+    expect(lineInfo.lineStarts, <int>[0, 2, 5]);
+  }
+
+  void test_fromContent_r() {
+    var lineInfo = LineInfo.fromContent('a\rbb\rccc');
+    expect(lineInfo.lineStarts, <int>[0, 2, 5]);
+  }
+
+  void test_fromContent_rn() {
+    var lineInfo = LineInfo.fromContent('a\r\nbb\r\nccc');
+    expect(lineInfo.lineStarts, <int>[0, 3, 7]);
+  }
+
   void test_getLocation_firstLine() {
     LineInfo info = LineInfo(<int>[0, 12, 34]);
     var location = info.getLocation(4);
@@ -1099,1230 +178,1881 @@
   }
 }
 
-class ListGetter_NodeReplacerTest_test_adjacentStrings
-    extends NodeReplacerTest_ListGetter<AdjacentStrings, StringLiteral> {
-  ListGetter_NodeReplacerTest_test_adjacentStrings(int arg0) : super(arg0);
-
-  @override
-  NodeList<StringLiteral> getList(AdjacentStrings node) => node.strings;
-}
-
-class ListGetter_NodeReplacerTest_test_adjacentStrings_2
-    extends NodeReplacerTest_ListGetter<AdjacentStrings, StringLiteral> {
-  ListGetter_NodeReplacerTest_test_adjacentStrings_2(int arg0) : super(arg0);
-
-  @override
-  NodeList<StringLiteral> getList(AdjacentStrings node) => node.strings;
-}
-
-class ListGetter_NodeReplacerTest_test_argumentList
-    extends NodeReplacerTest_ListGetter<ArgumentList, Expression> {
-  ListGetter_NodeReplacerTest_test_argumentList(int arg0) : super(arg0);
-
-  @override
-  NodeList<Expression> getList(ArgumentList node) => node.arguments;
-}
-
-class ListGetter_NodeReplacerTest_test_block
-    extends NodeReplacerTest_ListGetter<Block, Statement> {
-  ListGetter_NodeReplacerTest_test_block(int arg0) : super(arg0);
-
-  @override
-  NodeList<Statement> getList(Block node) => node.statements;
-}
-
-class ListGetter_NodeReplacerTest_test_cascadeExpression
-    extends NodeReplacerTest_ListGetter<CascadeExpression, Expression> {
-  ListGetter_NodeReplacerTest_test_cascadeExpression(int arg0) : super(arg0);
-
-  @override
-  NodeList<Expression> getList(CascadeExpression node) => node.cascadeSections;
-}
-
-class ListGetter_NodeReplacerTest_test_classDeclaration
-    extends NodeReplacerTest_ListGetter<ClassDeclaration, ClassMember> {
-  ListGetter_NodeReplacerTest_test_classDeclaration(int arg0) : super(arg0);
-
-  @override
-  NodeList<ClassMember> getList(ClassDeclaration node) => node.members;
-}
-
-class ListGetter_NodeReplacerTest_test_comment
-    extends NodeReplacerTest_ListGetter<Comment, CommentReference> {
-  ListGetter_NodeReplacerTest_test_comment(int arg0) : super(arg0);
-
-  @override
-  NodeList<CommentReference> getList(Comment node) => node.references;
-}
-
-class ListGetter_NodeReplacerTest_test_compilationUnit
-    extends NodeReplacerTest_ListGetter<CompilationUnit, Directive> {
-  ListGetter_NodeReplacerTest_test_compilationUnit(int arg0) : super(arg0);
-
-  @override
-  NodeList<Directive> getList(CompilationUnit node) => node.directives;
-}
-
-class ListGetter_NodeReplacerTest_test_compilationUnit_2
-    extends NodeReplacerTest_ListGetter<CompilationUnit,
-        CompilationUnitMember> {
-  ListGetter_NodeReplacerTest_test_compilationUnit_2(int arg0) : super(arg0);
-
-  @override
-  NodeList<CompilationUnitMember> getList(CompilationUnit node) =>
-      node.declarations;
-}
-
-class ListGetter_NodeReplacerTest_test_constructorDeclaration
-    extends NodeReplacerTest_ListGetter<ConstructorDeclaration,
-        ConstructorInitializer> {
-  ListGetter_NodeReplacerTest_test_constructorDeclaration(int arg0)
-      : super(arg0);
-
-  @override
-  NodeList<ConstructorInitializer> getList(ConstructorDeclaration node) =>
-      node.initializers;
-}
-
-class ListGetter_NodeReplacerTest_test_formalParameterList
-    extends NodeReplacerTest_ListGetter<FormalParameterList, FormalParameter> {
-  ListGetter_NodeReplacerTest_test_formalParameterList(int arg0) : super(arg0);
-
-  @override
-  NodeList<FormalParameter> getList(FormalParameterList node) =>
-      node.parameters;
-}
-
-class ListGetter_NodeReplacerTest_test_forStatement_withInitialization
-    extends NodeReplacerTest_ListGetter<ForStatement, Expression> {
-  ListGetter_NodeReplacerTest_test_forStatement_withInitialization(int arg0)
-      : super(arg0);
-
-  @override
-  NodeList<Expression> getList(ForStatement node) =>
-      (node.forLoopParts as ForParts).updaters;
-}
-
-class ListGetter_NodeReplacerTest_test_forStatement_withVariables
-    extends NodeReplacerTest_ListGetter<ForStatement, Expression> {
-  ListGetter_NodeReplacerTest_test_forStatement_withVariables(int arg0)
-      : super(arg0);
-
-  @override
-  NodeList<Expression> getList(ForStatement node) =>
-      (node.forLoopParts as ForParts).updaters;
-}
-
-class ListGetter_NodeReplacerTest_test_hideCombinator
-    extends NodeReplacerTest_ListGetter<HideCombinator, SimpleIdentifier> {
-  ListGetter_NodeReplacerTest_test_hideCombinator(int arg0) : super(arg0);
-
-  @override
-  NodeList<SimpleIdentifier> getList(HideCombinator node) => node.hiddenNames;
-}
-
-class ListGetter_NodeReplacerTest_test_implementsClause
-    extends NodeReplacerTest_ListGetter<ImplementsClause, NamedType> {
-  ListGetter_NodeReplacerTest_test_implementsClause(int arg0) : super(arg0);
-
-  @override
-  NodeList<NamedType> getList(ImplementsClause node) => node.interfaces2;
-}
-
-class ListGetter_NodeReplacerTest_test_labeledStatement
-    extends NodeReplacerTest_ListGetter<LabeledStatement, Label> {
-  ListGetter_NodeReplacerTest_test_labeledStatement(int arg0) : super(arg0);
-
-  @override
-  NodeList<Label> getList(LabeledStatement node) => node.labels;
-}
-
-class ListGetter_NodeReplacerTest_test_libraryIdentifier
-    extends NodeReplacerTest_ListGetter<LibraryIdentifier, SimpleIdentifier> {
-  ListGetter_NodeReplacerTest_test_libraryIdentifier(int arg0) : super(arg0);
-
-  @override
-  NodeList<SimpleIdentifier> getList(LibraryIdentifier node) => node.components;
-}
-
-class ListGetter_NodeReplacerTest_test_listLiteral
-    extends NodeReplacerTest_ListGetter<ListLiteral, CollectionElement> {
-  ListGetter_NodeReplacerTest_test_listLiteral(int arg0) : super(arg0);
-
-  @override
-  NodeList<CollectionElement> getList(ListLiteral node) => node.elements;
-}
-
-class ListGetter_NodeReplacerTest_test_mapLiteral
-    extends NodeReplacerTest_ListGetter<SetOrMapLiteral, CollectionElement> {
-  ListGetter_NodeReplacerTest_test_mapLiteral(int arg0) : super(arg0);
-
-  @override
-  NodeList<CollectionElement> getList(SetOrMapLiteral node) => node.elements;
-}
-
-class ListGetter_NodeReplacerTest_test_showCombinator
-    extends NodeReplacerTest_ListGetter<ShowCombinator, SimpleIdentifier> {
-  ListGetter_NodeReplacerTest_test_showCombinator(int arg0) : super(arg0);
-
-  @override
-  NodeList<SimpleIdentifier> getList(ShowCombinator node) => node.shownNames;
-}
-
-class ListGetter_NodeReplacerTest_test_stringInterpolation
-    extends NodeReplacerTest_ListGetter<StringInterpolation,
-        InterpolationElement> {
-  ListGetter_NodeReplacerTest_test_stringInterpolation(int arg0) : super(arg0);
-
-  @override
-  NodeList<InterpolationElement> getList(StringInterpolation node) =>
-      node.elements;
-}
-
-class ListGetter_NodeReplacerTest_test_switchStatement
-    extends NodeReplacerTest_ListGetter<SwitchStatement, SwitchMember> {
-  ListGetter_NodeReplacerTest_test_switchStatement(int arg0) : super(arg0);
-
-  @override
-  NodeList<SwitchMember> getList(SwitchStatement node) => node.members;
-}
-
-class ListGetter_NodeReplacerTest_test_tryStatement
-    extends NodeReplacerTest_ListGetter<TryStatement, CatchClause> {
-  ListGetter_NodeReplacerTest_test_tryStatement(int arg0) : super(arg0);
-
-  @override
-  NodeList<CatchClause> getList(TryStatement node) => node.catchClauses;
-}
-
-class ListGetter_NodeReplacerTest_test_typeArgumentList
-    extends NodeReplacerTest_ListGetter<TypeArgumentList, TypeAnnotation> {
-  ListGetter_NodeReplacerTest_test_typeArgumentList(int arg0) : super(arg0);
-
-  @override
-  NodeList<TypeAnnotation> getList(TypeArgumentList node) => node.arguments;
-}
-
-class ListGetter_NodeReplacerTest_test_typeParameterList
-    extends NodeReplacerTest_ListGetter<TypeParameterList, TypeParameter> {
-  ListGetter_NodeReplacerTest_test_typeParameterList(int arg0) : super(arg0);
-
-  @override
-  NodeList<TypeParameter> getList(TypeParameterList node) =>
-      node.typeParameters;
-}
-
-class ListGetter_NodeReplacerTest_test_variableDeclarationList
-    extends NodeReplacerTest_ListGetter<VariableDeclarationList,
-        VariableDeclaration> {
-  ListGetter_NodeReplacerTest_test_variableDeclarationList(int arg0)
-      : super(arg0);
-
-  @override
-  NodeList<VariableDeclaration> getList(VariableDeclarationList node) =>
-      node.variables;
-}
-
-class ListGetter_NodeReplacerTest_test_withClause
-    extends NodeReplacerTest_ListGetter<WithClause, NamedType> {
-  ListGetter_NodeReplacerTest_test_withClause(int arg0) : super(arg0);
-
-  @override
-  NodeList<NamedType> getList(WithClause node) => node.mixinTypes2;
-}
-
-class ListGetter_NodeReplacerTest_testAnnotatedNode
-    extends NodeReplacerTest_ListGetter<AnnotatedNode, Annotation> {
-  ListGetter_NodeReplacerTest_testAnnotatedNode(int arg0) : super(arg0);
-
-  @override
-  NodeList<Annotation> getList(AnnotatedNode node) => node.metadata;
-}
-
-class ListGetter_NodeReplacerTest_testNamespaceDirective
-    extends NodeReplacerTest_ListGetter<NamespaceDirective, Combinator> {
-  ListGetter_NodeReplacerTest_testNamespaceDirective(int arg0) : super(arg0);
-
-  @override
-  NodeList<Combinator> getList(NamespaceDirective node) => node.combinators;
-}
-
-class ListGetter_NodeReplacerTest_testNormalFormalParameter
-    extends NodeReplacerTest_ListGetter<NormalFormalParameter, Annotation> {
-  ListGetter_NodeReplacerTest_testNormalFormalParameter(int arg0) : super(arg0);
-
-  @override
-  NodeList<Annotation> getList(NormalFormalParameter node) => node.metadata;
-}
-
-class ListGetter_NodeReplacerTest_testSwitchMember
-    extends NodeReplacerTest_ListGetter<SwitchMember, Label> {
-  ListGetter_NodeReplacerTest_testSwitchMember(int arg0) : super(arg0);
-
-  @override
-  NodeList<Label> getList(SwitchMember node) => node.labels;
-}
-
-class ListGetter_NodeReplacerTest_testSwitchMember_2
-    extends NodeReplacerTest_ListGetter<SwitchMember, Statement> {
-  ListGetter_NodeReplacerTest_testSwitchMember_2(int arg0) : super(arg0);
-
-  @override
-  NodeList<Statement> getList(SwitchMember node) => node.statements;
-}
-
 @reflectiveTest
 class NodeReplacerTest {
-  /// An empty list of tokens.
-  static const List<Token> EMPTY_TOKEN_LIST = <Token>[];
-
   void test_adjacentStrings() {
-    AdjacentStrings node = AstTestFactory.adjacentStrings(
-        [AstTestFactory.string2("a"), AstTestFactory.string2("b")]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_adjacentStrings_2(0));
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_adjacentStrings(1));
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  'aaa' 'bbb';
+}
+''');
+    var adjacentStrings = findNode.adjacentStrings('aaa');
+    _assertReplaceInList(
+      destination: adjacentStrings,
+      child: adjacentStrings.strings[0],
+      replacement: adjacentStrings.strings[1],
+    );
   }
 
   void test_annotation() {
-    Annotation node = AstTestFactory.annotation2(
-        AstTestFactory.identifier3("C"),
-        AstTestFactory.identifier3("c"),
-        AstTestFactory.argumentList([AstTestFactory.integer(0)]));
-    _assertReplace(node, Getter_NodeReplacerTest_test_annotation());
-    _assertReplace(node, Getter_NodeReplacerTest_test_annotation_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_annotation_2());
-  }
-
-  void test_annotation_generic() {
-    Annotation node = AstTestFactory.annotation2(
-        AstTestFactory.identifier3("C"),
-        AstTestFactory.identifier3("c"),
-        AstTestFactory.argumentList([AstTestFactory.integer(0)]),
-        typeArguments:
-            AstTestFactory.typeArgumentList2([AstTestFactory.typeName4('T')]));
-    _assertReplace(node, Getter_NodeReplacerTest_test_annotation());
-    _assertReplace(node, Getter_NodeReplacerTest_test_annotation_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_annotation_2());
+    var findNode = _parseStringToFindNode(r'''
+@prefix.A<int>.named(args)
+@prefix.B<double>.named(args)
+void f() {}
+''');
+    _assertReplacementForChildren<Annotation>(
+      destination: findNode.annotation('prefix.A'),
+      source: findNode.annotation('prefix.B'),
+      childAccessors: [
+        (node) => node.arguments!,
+        (node) => node.constructorName!,
+        (node) => node.name,
+        (node) => node.typeArguments!,
+      ],
+    );
   }
 
   void test_argumentList() {
-    ArgumentList node =
-        AstTestFactory.argumentList([AstTestFactory.integer(0)]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_argumentList(0));
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  g(0, 1);
+}
+''');
+    var argumentList = findNode.argumentList('(0, 1)');
+    _assertReplaceInList(
+      destination: argumentList,
+      child: argumentList.arguments[0],
+      replacement: argumentList.arguments[1],
+    );
   }
 
   void test_asExpression() {
-    AsExpression node = AstTestFactory.asExpression(
-        AstTestFactory.integer(0),
-        AstTestFactory.typeName3(
-            AstTestFactory.identifier3("a"), [AstTestFactory.typeName4("C")]));
-    _assertReplace(node, Getter_NodeReplacerTest_test_asExpression_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_asExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  0 as int;
+  1 as int;
+}
+''');
+    _assertReplacementForChildren<AsExpression>(
+      destination: findNode.as_('0 as'),
+      source: findNode.as_('1 as'),
+      childAccessors: [
+        (node) => node.expression,
+        (node) => node.type,
+      ],
+    );
   }
 
   void test_assertStatement() {
-    AssertStatement node = AstTestFactory.assertStatement(
-        AstTestFactory.booleanLiteral(true), AstTestFactory.string2('foo'));
-    _assertReplace(node, Getter_NodeReplacerTest_test_assertStatement());
-    _assertReplace(node, Getter_NodeReplacerTest_test_assertStatement_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  assert(true, 'first');
+  assert(true, 'second');
+}
+''');
+    _assertReplacementForChildren<AssertStatement>(
+      destination: findNode.assertStatement('first'),
+      source: findNode.assertStatement('second'),
+      childAccessors: [
+        (node) => node.condition,
+        (node) => node.message!,
+      ],
+    );
   }
 
   void test_assignmentExpression() {
-    AssignmentExpression node = AstTestFactory.assignmentExpression(
-        AstTestFactory.identifier3("l"),
-        TokenType.EQ,
-        AstTestFactory.identifier3("r"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_assignmentExpression_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_assignmentExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  a = 0;
+  b = 1;
+}
+''');
+    _assertReplacementForChildren<AssignmentExpression>(
+      destination: findNode.assignment('a ='),
+      source: findNode.assignment('b ='),
+      childAccessors: [
+        (node) => node.leftHandSide,
+        (node) => node.rightHandSide,
+      ],
+    );
   }
 
   void test_awaitExpression() {
-    var node = AstTestFactory.awaitExpression(AstTestFactory.identifier3("A"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_awaitExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() async {
+  await 0;
+  await 1;
+}
+''');
+    _assertReplacementForChildren<AwaitExpression>(
+      destination: findNode.awaitExpression('0'),
+      source: findNode.awaitExpression('1'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_binaryExpression() {
-    BinaryExpression node = AstTestFactory.binaryExpression(
-        AstTestFactory.identifier3("l"),
-        TokenType.PLUS,
-        AstTestFactory.identifier3("r"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_binaryExpression());
-    _assertReplace(node, Getter_NodeReplacerTest_test_binaryExpression_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  0 + 1;
+  1 + 2;
+}
+''');
+    _assertReplacementForChildren<BinaryExpression>(
+      destination: findNode.binary('0 + 1'),
+      source: findNode.binary('1 + 2'),
+      childAccessors: [
+        (node) => node.leftOperand,
+        (node) => node.rightOperand,
+      ],
+    );
   }
 
   void test_block() {
-    Block node = AstTestFactory.block([AstTestFactory.emptyStatement()]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_block(0));
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  print(0);
+  print(1);
+}
+''');
+    var block = findNode.block('{');
+    _assertReplaceInList(
+      destination: block,
+      child: block.statements[0],
+      replacement: block.statements[1],
+    );
   }
 
   void test_blockFunctionBody() {
-    BlockFunctionBody node =
-        AstTestFactory.blockFunctionBody(AstTestFactory.block());
-    _assertReplace(node, Getter_NodeReplacerTest_test_blockFunctionBody());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  print('fff');
+}
+
+void g() {
+  print('ggg');
+}
+''');
+    _assertReplacementForChildren<BlockFunctionBody>(
+      destination: findNode.blockFunctionBody('fff'),
+      source: findNode.blockFunctionBody('ggg'),
+      childAccessors: [
+        (node) => node.block,
+        (node) => node.block,
+      ],
+    );
   }
 
   void test_breakStatement() {
-    BreakStatement node = AstTestFactory.breakStatement2("l");
-    _assertReplace(node, Getter_NodeReplacerTest_test_breakStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  while (true) {
+    break first;
+    break second;
+  }
+}
+''');
+    _assertReplacementForChildren<BreakStatement>(
+      destination: findNode.breakStatement('first'),
+      source: findNode.breakStatement('second'),
+      childAccessors: [
+        (node) => node.label!,
+      ],
+    );
   }
 
   void test_cascadeExpression() {
-    CascadeExpression node = AstTestFactory.cascadeExpression(
-        AstTestFactory.integer(0),
-        [AstTestFactory.propertyAccess(null, AstTestFactory.identifier3("b"))]);
-    _assertReplace(node, Getter_NodeReplacerTest_test_cascadeExpression());
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_cascadeExpression(0));
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  0..foo..bar;
+  1..foo;
+}
+''');
+    var cascadeExpression = findNode.cascade('0');
+    _assertReplaceInList(
+      destination: cascadeExpression,
+      child: cascadeExpression.cascadeSections[0],
+      replacement: cascadeExpression.cascadeSections[1],
+    );
+
+    _assertReplacementForChildren<CascadeExpression>(
+      destination: findNode.cascade('0'),
+      source: findNode.cascade('1'),
+      childAccessors: [
+        (node) => node.target,
+      ],
+    );
   }
 
   void test_catchClause() {
-    CatchClause node = AstTestFactory.catchClause5(
-        AstTestFactory.typeName4("E"),
-        "e",
-        "s",
-        [AstTestFactory.emptyStatement()]);
-    _assertReplace(node, Getter_NodeReplacerTest_test_catchClause_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_catchClause_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_catchClause());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  try {} on E catch (e, st) {}
+  try {} on E2 catch (e2, st2) {}
+}
+''');
+    _assertReplacementForChildren<CatchClause>(
+      destination: findNode.catchClause('(e,'),
+      source: findNode.catchClause('(e2,'),
+      childAccessors: [
+        (node) => node.exceptionType!,
+        (node) => node.exceptionParameter!,
+        (node) => node.stackTraceParameter!,
+        (node) => node.body,
+      ],
+    );
   }
 
   void test_classDeclaration() {
-    var node = AstTestFactory.classDeclaration(
-        null,
-        "A",
-        AstTestFactory.typeParameterList(["E"]),
-        AstTestFactory.extendsClause(AstTestFactory.typeName4("B")),
-        AstTestFactory.withClause([AstTestFactory.typeName4("C")]),
-        AstTestFactory.implementsClause([AstTestFactory.typeName4("D")]), [
-      AstTestFactory.fieldDeclaration2(
-          false, null, [AstTestFactory.variableDeclaration("f")])
-    ]);
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    node.nativeClause = AstTestFactory.nativeClause("");
-    _assertReplace(node, Getter_NodeReplacerTest_test_classDeclaration_6());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classDeclaration_5());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classDeclaration_4());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classDeclaration_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classDeclaration());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classDeclaration_3());
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_classDeclaration(0));
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+/// Comment A.
+@myA1
+@myA2
+class A<T> extends A0 with M implements I {
+  void foo() {}
+  void bar() {}
+}
+
+/// Comment B.
+class B<U> extends B0 with N implements J {}
+''');
+    var A = findNode.classDeclaration('A<T>');
+    _assertAnnotatedNode(A);
+    _assertReplaceInList(
+      destination: A,
+      child: A.members[0],
+      replacement: A.members[1],
+    );
+    _assertReplacementForChildren<ClassDeclaration>(
+      destination: findNode.classDeclaration('A<T>'),
+      source: findNode.classDeclaration('B<U>'),
+      childAccessors: [
+        (node) => node.documentationComment!,
+        (node) => node.extendsClause!,
+        (node) => node.implementsClause!,
+        (node) => node.name,
+        (node) => node.typeParameters!,
+        (node) => node.withClause!,
+      ],
+    );
   }
 
   void test_classTypeAlias() {
-    var node = AstTestFactory.classTypeAlias(
-        "A",
-        AstTestFactory.typeParameterList(["E"]),
-        null,
-        AstTestFactory.typeName4("B"),
-        AstTestFactory.withClause([AstTestFactory.typeName4("C")]),
-        AstTestFactory.implementsClause([AstTestFactory.typeName4("D")]));
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_classTypeAlias_4());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classTypeAlias_5());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classTypeAlias());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classTypeAlias_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_classTypeAlias_2());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+/// Comment A.
+@myA1
+@myA2
+class A<T> = A0 with M implements I;
+
+/// Comment B.
+class B<U> = B0 with N implements J;
+''');
+    _assertAnnotatedNode(
+      findNode.classTypeAlias('A<T>'),
+    );
+    _assertReplacementForChildren<ClassTypeAlias>(
+      destination: findNode.classTypeAlias('A<T>'),
+      source: findNode.classTypeAlias('B<U>'),
+      childAccessors: [
+        (node) => node.documentationComment!,
+        (node) => node.superclass2,
+        (node) => node.implementsClause!,
+        (node) => node.name,
+        (node) => node.typeParameters!,
+        (node) => node.withClause,
+      ],
+    );
   }
 
   void test_comment() {
-    Comment node = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.references.add(
-        astFactory.commentReference(null, AstTestFactory.identifier3("x")));
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_comment(0));
+    var findNode = _parseStringToFindNode(r'''
+/// Has [foo] and [bar].
+void f() {}
+''');
+    var comment = findNode.comment('Has');
+    _assertReplaceInList(
+      destination: comment,
+      child: comment.references[0],
+      replacement: comment.references[1],
+    );
   }
 
   void test_commentReference() {
-    CommentReference node =
-        astFactory.commentReference(null, AstTestFactory.identifier3("x"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_commentReference());
+    var findNode = _parseStringToFindNode(r'''
+/// Has [foo] and [bar].
+void f() {}
+''');
+    _assertReplacementForChildren<CommentReference>(
+      destination: findNode.commentReference('foo'),
+      source: findNode.commentReference('bar'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_compilationUnit() {
-    CompilationUnit node = AstTestFactory.compilationUnit8("", [
-      AstTestFactory.libraryDirective2("lib")
-    ], [
-      AstTestFactory.topLevelVariableDeclaration2(
-          null, [AstTestFactory.variableDeclaration("X")])
-    ]);
-    _assertReplace(node, Getter_NodeReplacerTest_test_compilationUnit());
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_compilationUnit(0));
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_compilationUnit_2(0));
+    var findNode = _parseStringToFindNode(r'''
+import 'a.dart';
+import 'b.dart';
+class A {}
+class B {}
+''');
+    var unit = findNode.unit;
+    _assertReplaceInList(
+      destination: unit,
+      child: unit.directives[0],
+      replacement: unit.directives[1],
+    );
+    _assertReplaceInList(
+      destination: unit,
+      child: unit.declarations[0],
+      replacement: unit.declarations[1],
+    );
   }
 
   void test_conditionalExpression() {
-    ConditionalExpression node = AstTestFactory.conditionalExpression(
-        AstTestFactory.booleanLiteral(true),
-        AstTestFactory.integer(0),
-        AstTestFactory.integer(1));
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_conditionalExpression_3());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_conditionalExpression_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_conditionalExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  true ? 0 : 1;
+  false ? 2 : 3;
+}
+''');
+    _assertReplacementForChildren<ConditionalExpression>(
+      destination: findNode.conditionalExpression('true'),
+      source: findNode.conditionalExpression('false'),
+      childAccessors: [
+        (node) => node.condition,
+        (node) => node.thenExpression,
+        (node) => node.elseExpression,
+      ],
+    );
   }
 
   void test_constructorDeclaration() {
-    var node = AstTestFactory.constructorDeclaration2(
-        null,
-        null,
-        AstTestFactory.identifier3("C"),
-        "d",
-        AstTestFactory.formalParameterList(),
-        [
-          AstTestFactory.constructorFieldInitializer(
-              false, "x", AstTestFactory.integer(0))
-        ],
-        AstTestFactory.emptyFunctionBody());
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    node.redirectedConstructor =
-        AstTestFactory.constructorName(AstTestFactory.typeName4("B"), "a");
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_constructorDeclaration_3());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_constructorDeclaration_2());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_constructorDeclaration_4());
-    _assertReplace(node, Getter_NodeReplacerTest_test_constructorDeclaration());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_constructorDeclaration_5());
-    _assertReplace(
-        node, ListGetter_NodeReplacerTest_test_constructorDeclaration(0));
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  @myA1
+  @myA2
+  A.named(int a) : b = 0, c = 1;
+}
+
+class B {
+  B.named(int b);
+}
+''');
+    _assertReplacementForChildren<ConstructorDeclaration>(
+      destination: findNode.constructor('A.named'),
+      source: findNode.constructor('B.named'),
+      childAccessors: [
+        (node) => node.body,
+        (node) => node.name!,
+        (node) => node.parameters,
+        (node) => node.returnType,
+      ],
+    );
+    _assertAnnotatedNode(
+      findNode.constructor('A.named'),
+    );
+  }
+
+  void test_constructorDeclaration_redirectedConstructor() {
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  factory A() = R;
+}
+
+class B {
+  factory B() = R;
+}
+''');
+    _assertReplacementForChildren<ConstructorDeclaration>(
+      destination: findNode.constructor('factory A'),
+      source: findNode.constructor('factory B'),
+      childAccessors: [
+        (node) => node.redirectedConstructor!,
+      ],
+    );
   }
 
   void test_constructorFieldInitializer() {
-    ConstructorFieldInitializer node =
-        AstTestFactory.constructorFieldInitializer(
-            false, "f", AstTestFactory.integer(0));
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_constructorFieldInitializer());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_constructorFieldInitializer_2());
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  A() : a = 0, b = 1;
+}
+''');
+    _assertReplacementForChildren<ConstructorFieldInitializer>(
+      destination: findNode.constructorFieldInitializer('a ='),
+      source: findNode.constructorFieldInitializer('b ='),
+      childAccessors: [
+        (node) => node.fieldName,
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_constructorName() {
-    ConstructorName node =
-        AstTestFactory.constructorName(AstTestFactory.typeName4("C"), "n");
-    _assertReplace(node, Getter_NodeReplacerTest_test_constructorName());
-    _assertReplace(node, Getter_NodeReplacerTest_test_constructorName_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  new prefix.A.foo();
+  new prefix.B.bar();
+}
+''');
+    _assertReplacementForChildren<ConstructorName>(
+      destination: findNode.constructorName('A.foo'),
+      source: findNode.constructorName('B.bar'),
+      childAccessors: [
+        (node) => node.type2,
+        (node) => node.name!,
+      ],
+    );
   }
 
   void test_continueStatement() {
-    ContinueStatement node = AstTestFactory.continueStatement("l");
-    _assertReplace(node, Getter_NodeReplacerTest_test_continueStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  while (true) {
+    continue first;
+    continue second;
+  }
+}
+''');
+    _assertReplacementForChildren<ContinueStatement>(
+      destination: findNode.continueStatement('first'),
+      source: findNode.continueStatement('second'),
+      childAccessors: [
+        (node) => node.label!,
+      ],
+    );
   }
 
   void test_declaredIdentifier() {
-    var node =
-        AstTestFactory.declaredIdentifier4(AstTestFactory.typeName4("C"), "i");
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_declaredIdentifier());
-    _assertReplace(node, Getter_NodeReplacerTest_test_declaredIdentifier_2());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  for (int i in []) {}
+  for (double j in []) {}
+}
+''');
+    _assertReplacementForChildren<DeclaredIdentifier>(
+      destination: findNode.declaredIdentifier('i in'),
+      source: findNode.declaredIdentifier('j in'),
+      childAccessors: [
+        (node) => node.identifier,
+        (node) => node.type!,
+      ],
+    );
   }
 
   void test_defaultFormalParameter() {
-    DefaultFormalParameter node = AstTestFactory.positionalFormalParameter(
-        AstTestFactory.simpleFormalParameter3("p"), AstTestFactory.integer(0));
-    _assertReplace(node, Getter_NodeReplacerTest_test_defaultFormalParameter());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_defaultFormalParameter_2());
+    var findNode = _parseStringToFindNode(r'''
+void f({int a = 0, double b = 1}) {}
+''');
+    _assertReplacementForChildren<DefaultFormalParameter>(
+      destination: findNode.defaultParameter('a ='),
+      source: findNode.defaultParameter('b ='),
+      childAccessors: [
+        (node) => node.parameter,
+        (node) => node.defaultValue!,
+      ],
+    );
   }
 
   void test_doStatement() {
-    DoStatement node = AstTestFactory.doStatement(
-        AstTestFactory.block(), AstTestFactory.booleanLiteral(true));
-    _assertReplace(node, Getter_NodeReplacerTest_test_doStatement_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_doStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f({int a = 0, double b = 1}) {}
+''');
+    _assertReplacementForChildren<DefaultFormalParameter>(
+      destination: findNode.defaultParameter('a ='),
+      source: findNode.defaultParameter('b ='),
+      childAccessors: [
+        (node) => node.parameter,
+        (node) => node.defaultValue!,
+      ],
+    );
   }
 
   void test_enumConstantDeclaration() {
-    EnumConstantDeclaration node = astFactory.enumConstantDeclaration(
-        astFactory.endOfLineComment(EMPTY_TOKEN_LIST),
-        [AstTestFactory.annotation(AstTestFactory.identifier3("a"))],
-        AstTestFactory.identifier3("C"));
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_enumConstantDeclaration());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+enum E {
+  @myA1
+  @myA2
+  aaa,
+  bbb;
+}
+''');
+    _assertAnnotatedNode(
+      findNode.enumConstantDeclaration('aaa'),
+    );
+    _assertReplacementForChildren<EnumConstantDeclaration>(
+      destination: findNode.enumConstantDeclaration('aaa'),
+      source: findNode.enumConstantDeclaration('bbb'),
+      childAccessors: [
+        (node) => node.name,
+      ],
+    );
   }
 
   void test_enumDeclaration() {
-    var node = AstTestFactory.enumDeclaration2("E", ["ONE", "TWO"]);
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_enumDeclaration());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+enum E1<T> with M1 implements I1 {one, two}
+enum E2<U> with M2 implements I2 {one, two}
+''');
+    _assertReplacementForChildren<EnumDeclaration>(
+      destination: findNode.enumDeclaration('enum E1'),
+      source: findNode.enumDeclaration('enum E2'),
+      childAccessors: [
+        (node) => node.name,
+        (node) => node.typeParameters!,
+        (node) => node.withClause!,
+        (node) => node.implementsClause!,
+      ],
+    );
+  }
+
+  void test_enumDeclaration_constants() {
+    var findNode = _parseStringToFindNode(r'''
+enum E1 {one}
+enum E2 {two}
+''');
+    _assertReplaceInList(
+      destination: findNode.enumDeclaration('enum E1'),
+      child: findNode.enumConstantDeclaration('one'),
+      replacement: findNode.enumConstantDeclaration('two'),
+    );
+  }
+
+  void test_enumDeclaration_members() {
+    var findNode = _parseStringToFindNode(r'''
+enum E1 {one; void foo() {}}
+enum E2 {two; void bar() {}}
+''');
+    _assertReplaceInList(
+      destination: findNode.enumDeclaration('enum E1'),
+      child: findNode.methodDeclaration('foo'),
+      replacement: findNode.methodDeclaration('bar'),
+    );
   }
 
   void test_exportDirective() {
-    var node = AstTestFactory.exportDirective2("", [
-      AstTestFactory.hideCombinator2(["C"])
-    ]);
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _testNamespaceDirective(node);
+    var findNode = _parseStringToFindNode(r'''
+@myA1
+@myA2
+export 'a.dart' hide A show B;
+export 'b.dart';
+''');
+    var export_a = findNode.export('a.dart');
+    _assertAnnotatedNode(export_a);
+    _assertReplaceInList(
+      destination: export_a,
+      child: export_a.combinators[0],
+      replacement: export_a.combinators[1],
+    );
+    _assertReplacementForChildren<ExportDirective>(
+      destination: findNode.export('a.dart'),
+      source: findNode.export('b.dart'),
+      childAccessors: [
+        (node) => node.uri,
+      ],
+    );
   }
 
   void test_expressionFunctionBody() {
-    ExpressionFunctionBody node =
-        AstTestFactory.expressionFunctionBody(AstTestFactory.integer(0));
-    _assertReplace(node, Getter_NodeReplacerTest_test_expressionFunctionBody());
+    var findNode = _parseStringToFindNode(r'''
+void f() => 0;
+void g() => 1;
+''');
+    _assertReplacementForChildren<ExpressionFunctionBody>(
+      destination: findNode.expressionFunctionBody('0'),
+      source: findNode.expressionFunctionBody('1'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_expressionStatement() {
-    ExpressionStatement node =
-        AstTestFactory.expressionStatement(AstTestFactory.integer(0));
-    _assertReplace(node, Getter_NodeReplacerTest_test_expressionStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  0;
+  1;
+}
+''');
+    _assertReplacementForChildren<ExpressionStatement>(
+      destination: findNode.expressionStatement('0'),
+      source: findNode.expressionStatement('1'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_extendsClause() {
-    ExtendsClause node =
-        AstTestFactory.extendsClause(AstTestFactory.typeName4("S"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_extendsClause());
+    var findNode = _parseStringToFindNode(r'''
+class A extends A0 {}
+class B extends B0 {}
+''');
+    _assertReplacementForChildren<ExtendsClause>(
+      destination: findNode.extendsClause('A0'),
+      source: findNode.extendsClause('B0'),
+      childAccessors: [
+        (node) => node.superclass2,
+      ],
+    );
   }
 
   void test_fieldDeclaration() {
-    var node = AstTestFactory.fieldDeclaration(
-        false,
-        null,
-        AstTestFactory.typeName4("C"),
-        [AstTestFactory.variableDeclaration("c")]);
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_fieldDeclaration());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  @myA1
+  @myA2
+  int foo = 0;
+  int bar = 0;
+}
+class B extends B0 {}
+''');
+    _assertAnnotatedNode(
+      findNode.fieldDeclaration('foo'),
+    );
+    _assertReplacementForChildren<FieldDeclaration>(
+      destination: findNode.fieldDeclaration('foo'),
+      source: findNode.fieldDeclaration('bar'),
+      childAccessors: [
+        (node) => node.fields,
+      ],
+    );
   }
 
   void test_fieldFormalParameter() {
-    var node = AstTestFactory.fieldFormalParameter(
-        null,
-        AstTestFactory.typeName4("C"),
-        "f",
-        AstTestFactory.formalParameterList());
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata = [
-      AstTestFactory.annotation(AstTestFactory.identifier3("a"))
-    ];
-    _assertReplace(node, Getter_NodeReplacerTest_test_fieldFormalParameter_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_fieldFormalParameter());
-    _testNormalFormalParameter(node);
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  A(
+    @myA1
+    @myA2
+    int this.foo<T>(int a),
+    int this.bar<U>(int b),
+  );
+}
+''');
+    var foo = findNode.fieldFormalParameter('foo');
+    _assertFormalParameterMetadata(foo);
+    _assertReplacementForChildren<FieldFormalParameter>(
+      destination: findNode.fieldFormalParameter('foo'),
+      source: findNode.fieldFormalParameter('bar'),
+      childAccessors: [
+        (node) => node.identifier,
+        (node) => node.parameters!,
+        (node) => node.type!,
+        (node) => node.typeParameters!,
+      ],
+    );
+  }
+
+  void test_forEachPartsWithDeclaration() {
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  for (int a in []) {}
+  for (int b in []) {}
+}
+''');
+    _assertReplacementForChildren<ForEachPartsWithDeclaration>(
+      destination: findNode.forEachPartsWithDeclaration('a in'),
+      source: findNode.forEachPartsWithDeclaration('b in'),
+      childAccessors: [
+        (node) => node.loopVariable,
+        (node) => node.iterable,
+      ],
+    );
+  }
+
+  void test_forEachPartsWithIdentifier() {
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  for (a in []) {}
+  for (b in []) {}
+}
+''');
+    _assertReplacementForChildren<ForEachPartsWithIdentifier>(
+      destination: findNode.forEachPartsWithIdentifier('a in'),
+      source: findNode.forEachPartsWithIdentifier('b in'),
+      childAccessors: [
+        (node) => node.identifier,
+        (node) => node.iterable,
+      ],
+    );
   }
 
   void test_forEachStatement_withIdentifier() {
-    ForStatement node = AstTestFactory.forStatement(
-        AstTestFactory.forEachPartsWithIdentifier(
-            AstTestFactory.identifier3("i"), AstTestFactory.identifier3("l")),
-        AstTestFactory.block());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_2());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forEachStatement_withIdentifier());
-  }
-
-  void test_forEachStatement_withLoopVariable() {
-    ForStatement node = AstTestFactory.forStatement(
-        AstTestFactory.forEachPartsWithDeclaration(
-            AstTestFactory.declaredIdentifier3("e"),
-            AstTestFactory.identifier3("l")),
-        AstTestFactory.block());
-    _assertReplace(node,
-        Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable());
-    _assertReplace(node,
-        Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_3());
+    var findNode = _parseStringToFindNode(r'''
+void f(int a) {
+  for (a in []) {}
+  for (b in []) {}
+}
+''');
+    _assertReplacementForChildren<ForStatement>(
+      destination: findNode.forStatement('a in'),
+      source: findNode.forStatement('b in'),
+      childAccessors: [
+        (node) => node.body,
+        (node) => node.forLoopParts,
+      ],
+    );
   }
 
   void test_formalParameterList() {
-    FormalParameterList node = AstTestFactory.formalParameterList(
-        [AstTestFactory.simpleFormalParameter3("p")]);
-    _assertReplace(
-        node, ListGetter_NodeReplacerTest_test_formalParameterList(0));
+    var findNode = _parseStringToFindNode(r'''
+void f(int a, int b) {}
+''');
+    _assertReplaceInList(
+      destination: findNode.formalParameterList('int a'),
+      child: findNode.simpleFormalParameter('int a'),
+      replacement: findNode.simpleFormalParameter('int b'),
+    );
   }
 
-  void test_forStatement_withInitialization() {
-    ForStatement node = AstTestFactory.forStatement(
-        AstTestFactory.forPartsWithExpression(AstTestFactory.identifier3("a"),
-            AstTestFactory.booleanLiteral(true), [AstTestFactory.integer(0)]),
-        AstTestFactory.block());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forStatement_withInitialization_3());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forStatement_withInitialization_2());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forStatement_withInitialization());
-    _assertReplace(node,
-        ListGetter_NodeReplacerTest_test_forStatement_withInitialization(0));
+  void test_forPartsWithDeclarations() {
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  for (int i = 0; i < 8; i++, i += 2) {}
+  for (int j = 0; j < 8; j++) {}
+}
+''');
+    var for_i = findNode.forPartsWithDeclarations('i = 0');
+    _assertReplaceInList(
+      destination: for_i,
+      child: for_i.updaters[0],
+      replacement: for_i.updaters[1],
+    );
+    _assertReplacementForChildren<ForPartsWithDeclarations>(
+      destination: for_i,
+      source: findNode.forPartsWithDeclarations('j = 0'),
+      childAccessors: [
+        (node) => node.variables,
+        (node) => node.condition!,
+      ],
+    );
   }
 
-  void test_forStatement_withVariables() {
-    ForStatement node = AstTestFactory.forStatement(
-        AstTestFactory.forPartsWithDeclarations(
-            AstTestFactory.variableDeclarationList2(
-                null, [AstTestFactory.variableDeclaration("i")]),
-            AstTestFactory.booleanLiteral(true),
-            [AstTestFactory.integer(0)]),
-        AstTestFactory.block());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forStatement_withVariables_2());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forStatement_withVariables_3());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_forStatement_withVariables());
-    _assertReplace(
-        node, ListGetter_NodeReplacerTest_test_forStatement_withVariables(0));
+  void test_forPartsWithExpression() {
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  for (i = 0; i < 8; i++, i += 2) {}
+  for (j = 0; j < 8; j++) {}
+}
+''');
+    var for_i = findNode.forPartsWithExpression('i = 0');
+    _assertReplaceInList(
+      destination: for_i,
+      child: for_i.updaters[0],
+      replacement: for_i.updaters[1],
+    );
+    _assertReplacementForChildren<ForPartsWithExpression>(
+      destination: for_i,
+      source: findNode.forPartsWithExpression('j = 0'),
+      childAccessors: [
+        (node) => node.initialization!,
+        (node) => node.condition!,
+      ],
+    );
   }
 
   void test_functionDeclaration() {
-    var node = AstTestFactory.functionDeclaration(
-        AstTestFactory.typeName4("R"),
-        null,
-        "f",
-        AstTestFactory.functionExpression2(AstTestFactory.formalParameterList(),
-            AstTestFactory.blockFunctionBody(AstTestFactory.block())));
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionDeclaration());
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionDeclaration_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionDeclaration_2());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+@myA1
+@myA2
+int f() => 0;
+double g() => 0;
+''');
+    _assertAnnotatedNode(
+      findNode.functionDeclaration('f()'),
+    );
+    _assertReplacementForChildren<FunctionDeclaration>(
+      destination: findNode.functionDeclaration('f()'),
+      source: findNode.functionDeclaration('g()'),
+      childAccessors: [
+        (node) => node.functionExpression,
+        (node) => node.name,
+        (node) => node.returnType!,
+      ],
+    );
   }
 
   void test_functionDeclarationStatement() {
-    FunctionDeclarationStatement node =
-        AstTestFactory.functionDeclarationStatement(
-            AstTestFactory.typeName4("R"),
-            null,
-            "f",
-            AstTestFactory.functionExpression2(
-                AstTestFactory.formalParameterList(),
-                AstTestFactory.blockFunctionBody(AstTestFactory.block())));
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_functionDeclarationStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  void g() {}
+  void h() {}
+}
+''');
+    _assertReplacementForChildren<FunctionDeclarationStatement>(
+      destination: findNode.functionDeclarationStatement('g()'),
+      source: findNode.functionDeclarationStatement('h()'),
+      childAccessors: [
+        (node) => node.functionDeclaration,
+      ],
+    );
   }
 
   void test_functionExpression() {
-    FunctionExpression node = AstTestFactory.functionExpression2(
-        AstTestFactory.formalParameterList(),
-        AstTestFactory.blockFunctionBody(AstTestFactory.block()));
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionExpression());
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionExpression_2());
+    var findNode = _parseStringToFindNode(r'''
+void f<T>(int a) {
+  0;
+}
+void g<U>(double b) {
+  1;
+}
+''');
+    _assertReplacementForChildren<FunctionExpression>(
+      destination: findNode.functionExpression('<T>'),
+      source: findNode.functionExpression('<U>'),
+      childAccessors: [
+        (node) => node.body,
+        (node) => node.parameters!,
+        (node) => node.typeParameters!,
+      ],
+    );
   }
 
   void test_functionExpressionInvocation() {
-    FunctionExpressionInvocation node =
-        AstTestFactory.functionExpressionInvocation(
-            AstTestFactory.identifier3("f"), [AstTestFactory.integer(0)]);
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_functionExpressionInvocation());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_functionExpressionInvocation_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  (g)<int>(0);
+  (h)<double>(1);
+}
+''');
+    _assertReplacementForChildren<FunctionExpressionInvocation>(
+      destination: findNode.functionExpressionInvocation('<int>'),
+      source: findNode.functionExpressionInvocation('<double>'),
+      childAccessors: [
+        (node) => node.function,
+        (node) => node.typeArguments!,
+        (node) => node.argumentList,
+      ],
+    );
   }
 
   void test_functionTypeAlias() {
-    var node = AstTestFactory.typeAlias(
-        AstTestFactory.typeName4("R"),
-        "F",
-        AstTestFactory.typeParameterList(["E"]),
-        AstTestFactory.formalParameterList());
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionTypeAlias_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionTypeAlias_4());
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionTypeAlias());
-    _assertReplace(node, Getter_NodeReplacerTest_test_functionTypeAlias_2());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+@myA1
+@myA2
+typedef int F<T>(int a);
+typedef double G<U>(double b);
+''');
+    _assertAnnotatedNode(
+      findNode.functionTypeAlias('int F'),
+    );
+    _assertReplacementForChildren<FunctionTypeAlias>(
+      destination: findNode.functionTypeAlias('int F'),
+      source: findNode.functionTypeAlias('double G'),
+      childAccessors: [
+        (node) => node.name,
+        (node) => node.parameters,
+        (node) => node.returnType!,
+        (node) => node.typeParameters!,
+      ],
+    );
   }
 
   void test_functionTypedFormalParameter() {
-    var node = AstTestFactory.functionTypedFormalParameter(
-        AstTestFactory.typeName4("R"),
-        "f",
-        [AstTestFactory.simpleFormalParameter3("p")]);
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata = [
-      AstTestFactory.annotation(AstTestFactory.identifier3("a"))
-    ];
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_functionTypedFormalParameter());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_functionTypedFormalParameter_2());
-    _testNormalFormalParameter(node);
+    var findNode = _parseStringToFindNode(r'''
+void f(
+  @myA1
+  @myA2
+  int a<T>(int a1),
+  double b<U>(double b2),
+) {}
+''');
+    var a = findNode.functionTypedFormalParameter('a<T>');
+    _assertFormalParameterMetadata(a);
+    _assertReplacementForChildren<FunctionTypedFormalParameter>(
+      destination: findNode.functionTypedFormalParameter('a<T>'),
+      source: findNode.functionTypedFormalParameter('b<U>'),
+      childAccessors: [
+        (node) => node.returnType!,
+        (node) => node.identifier,
+        (node) => node.typeParameters!,
+        (node) => node.parameters,
+      ],
+    );
   }
 
   void test_hideCombinator() {
-    HideCombinator node = AstTestFactory.hideCombinator2(["A", "B"]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_hideCombinator(0));
+    var findNode = _parseStringToFindNode(r'''
+import '' hide A, B;
+''');
+    var node = findNode.hideCombinator('hide');
+    _assertReplaceInList(
+      destination: node,
+      child: node.hiddenNames[0],
+      replacement: node.hiddenNames[1],
+    );
   }
 
   void test_ifStatement() {
-    IfStatement node = AstTestFactory.ifStatement2(
-        AstTestFactory.booleanLiteral(true),
-        AstTestFactory.block(),
-        AstTestFactory.block());
-    _assertReplace(node, Getter_NodeReplacerTest_test_ifStatement());
-    _assertReplace(node, Getter_NodeReplacerTest_test_ifStatement_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_ifStatement_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  if (true) {
+    0;
+  } else {
+    1;
+  }
+  if (false) {
+    2;
+  } else {
+    3;
+  }
+}
+''');
+    _assertReplacementForChildren<IfStatement>(
+      destination: findNode.ifStatement('true'),
+      source: findNode.ifStatement('false'),
+      childAccessors: [
+        (node) => node.condition,
+        (node) => node.thenStatement,
+        (node) => node.elseStatement!,
+      ],
+    );
   }
 
   void test_implementsClause() {
-    ImplementsClause node = AstTestFactory.implementsClause(
-        [AstTestFactory.typeName4("I"), AstTestFactory.typeName4("J")]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_implementsClause(0));
+    var findNode = _parseStringToFindNode(r'''
+class A implements I, J {}
+''');
+    var node = findNode.implementsClause('implements');
+    _assertReplaceInList(
+      destination: node,
+      child: node.interfaces2[0],
+      replacement: node.interfaces2[1],
+    );
   }
 
   void test_importDirective() {
-    var node = AstTestFactory.importDirective3("", "p", [
-      AstTestFactory.showCombinator2(["A"]),
-      AstTestFactory.hideCombinator2(["B"])
-    ]);
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_importDirective());
-    _testNamespaceDirective(node);
+    var findNode = _parseStringToFindNode(r'''
+@myA1
+@myA2
+import 'a.dart' hide A show B;
+import 'b.dart';
+''');
+    var import_a = findNode.import('a.dart');
+    _assertAnnotatedNode(import_a);
+    _assertReplaceInList(
+      destination: import_a,
+      child: import_a.combinators[0],
+      replacement: import_a.combinators[1],
+    );
+    _assertReplacementForChildren<ImportDirective>(
+      destination: findNode.import('a.dart'),
+      source: findNode.import('b.dart'),
+      childAccessors: [
+        (node) => node.uri,
+      ],
+    );
   }
 
   void test_indexExpression() {
-    IndexExpression node = AstTestFactory.indexExpression(
-      target: AstTestFactory.identifier3("a"),
-      index: AstTestFactory.identifier3("i"),
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  a[0];
+  b[1];
+}
+''');
+    _assertReplacementForChildren<IndexExpression>(
+      destination: findNode.index('[0]'),
+      source: findNode.index('[1]'),
+      childAccessors: [
+        (node) => node.target!,
+        (node) => node.index,
+      ],
     );
-    _assertReplace(node, Getter_NodeReplacerTest_test_indexExpression());
-    _assertReplace(node, Getter_NodeReplacerTest_test_indexExpression_2());
   }
 
   void test_instanceCreationExpression() {
-    InstanceCreationExpression node =
-        AstTestFactory.instanceCreationExpression3(null,
-            AstTestFactory.typeName4("C"), "c", [AstTestFactory.integer(2)]);
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_instanceCreationExpression_2());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_instanceCreationExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  new A(0);
+  new B(1);
+}
+''');
+    _assertReplacementForChildren<InstanceCreationExpression>(
+      destination: findNode.instanceCreation('A('),
+      source: findNode.instanceCreation('B('),
+      childAccessors: [
+        (node) => node.constructorName,
+        (node) => node.argumentList,
+      ],
+    );
   }
 
   void test_interpolationExpression() {
-    InterpolationExpression node = AstTestFactory.interpolationExpression2("x");
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_interpolationExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  '$foo $bar';
+}
+''');
+    _assertReplacementForChildren<InterpolationExpression>(
+      destination: findNode.interpolationExpression('foo'),
+      source: findNode.interpolationExpression('bar'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_isExpression() {
-    IsExpression node = AstTestFactory.isExpression(
-        AstTestFactory.identifier3("v"), false, AstTestFactory.typeName4("T"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_isExpression());
-    _assertReplace(node, Getter_NodeReplacerTest_test_isExpression_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  0 is int;
+  1 is double;
+}
+''');
+    _assertReplacementForChildren<IsExpression>(
+      destination: findNode.isExpression('0 is'),
+      source: findNode.isExpression('1 is'),
+      childAccessors: [
+        (node) => node.expression,
+        (node) => node.type,
+      ],
+    );
   }
 
   void test_label() {
-    Label node = AstTestFactory.label2("l");
-    _assertReplace(node, Getter_NodeReplacerTest_test_label());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  foo: while (true) {}
+  bar: while (true) {}
+}
+''');
+    _assertReplacementForChildren<Label>(
+      destination: findNode.label('foo:'),
+      source: findNode.label('bar'),
+      childAccessors: [
+        (node) => node.label,
+      ],
+    );
   }
 
   void test_labeledStatement() {
-    LabeledStatement node = AstTestFactory.labeledStatement(
-        [AstTestFactory.label2("l")], AstTestFactory.block());
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_labeledStatement(0));
-    _assertReplace(node, Getter_NodeReplacerTest_test_labeledStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  foo: bar: 0;
+  baz: 1;
+}
+''');
+    var foo = findNode.labeledStatement('foo');
+    _assertReplaceInList(
+      destination: foo,
+      child: foo.labels[0],
+      replacement: foo.labels[1],
+    );
+    _assertReplacementForChildren<LabeledStatement>(
+      destination: foo,
+      source: findNode.labeledStatement('baz'),
+      childAccessors: [
+        (node) => node.statement,
+      ],
+    );
   }
 
   void test_libraryDirective() {
-    var node = AstTestFactory.libraryDirective2("lib");
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_libraryDirective());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+@myA1
+@myA2
+library foo;
+''');
+    var node = findNode.libraryDirective;
+    _assertAnnotatedNode(node);
+    _assertReplacementForChildren<LibraryDirective>(
+      destination: node,
+      source: node,
+      childAccessors: [
+        (node) => node.name,
+      ],
+    );
   }
 
   void test_libraryIdentifier() {
-    LibraryIdentifier node = AstTestFactory.libraryIdentifier2(["lib"]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_libraryIdentifier(0));
+    var findNode = _parseStringToFindNode(r'''
+library foo.bar;
+''');
+    var node = findNode.libraryIdentifier('foo');
+    _assertReplaceInList(
+      destination: node,
+      child: node.components[0],
+      replacement: node.components[1],
+    );
   }
 
   void test_listLiteral() {
-    ListLiteral node = AstTestFactory.listLiteral2(
-        null,
-        AstTestFactory.typeArgumentList([AstTestFactory.typeName4("E")]),
-        [AstTestFactory.identifier3("e")]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_listLiteral(0));
-    _testTypedLiteral(node);
-  }
-
-  void test_mapLiteral() {
-    SetOrMapLiteral node = AstTestFactory.setOrMapLiteral(
-        null,
-        AstTestFactory.typeArgumentList([AstTestFactory.typeName4("E")]),
-        [AstTestFactory.mapLiteralEntry("k", AstTestFactory.identifier3("v"))]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_mapLiteral(0));
-    _testTypedLiteral(node);
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  <int>[0, 1];
+  <double>[];
+}
+''');
+    var node = findNode.listLiteral('[0');
+    _assertReplaceInList(
+      destination: node,
+      child: node.elements[0],
+      replacement: node.elements[1],
+    );
+    _assertReplacementForChildren<ListLiteral>(
+      destination: findNode.listLiteral('<int>'),
+      source: findNode.listLiteral('<double>'),
+      childAccessors: [
+        (node) => node.typeArguments!,
+      ],
+    );
   }
 
   void test_mapLiteralEntry() {
-    MapLiteralEntry node =
-        AstTestFactory.mapLiteralEntry("k", AstTestFactory.identifier3("v"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_mapLiteralEntry_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_mapLiteralEntry());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  <int, int>{0: 1, 2: 3};
+}
+''');
+    _assertReplacementForChildren<MapLiteralEntry>(
+      destination: findNode.mapLiteralEntry('0: 1'),
+      source: findNode.mapLiteralEntry('2: 3'),
+      childAccessors: [
+        (node) => node.key,
+        (node) => node.value,
+      ],
+    );
   }
 
   void test_methodDeclaration() {
-    var node = AstTestFactory.methodDeclaration2(
-        null,
-        AstTestFactory.typeName4("A"),
-        null,
-        null,
-        AstTestFactory.identifier3("m"),
-        AstTestFactory.formalParameterList(),
-        AstTestFactory.blockFunctionBody(AstTestFactory.block()));
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_methodDeclaration());
-    _assertReplace(node, Getter_NodeReplacerTest_test_methodDeclaration_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_methodDeclaration_4());
-    _assertReplace(node, Getter_NodeReplacerTest_test_methodDeclaration_2());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  @myA1
+  @myA2
+  int foo<T>(int a) {}
+  double bar<U>(double b) {}
+}
+''');
+    var foo = findNode.methodDeclaration('foo');
+    _assertAnnotatedNode(foo);
+    _assertReplacementForChildren<MethodDeclaration>(
+      destination: foo,
+      source: findNode.methodDeclaration('bar'),
+      childAccessors: [
+        (node) => node.returnType!,
+        (node) => node.name,
+        (node) => node.typeParameters!,
+        (node) => node.parameters!,
+        (node) => node.body,
+      ],
+    );
   }
 
   void test_methodInvocation() {
-    MethodInvocation node = AstTestFactory.methodInvocation(
-        AstTestFactory.identifier3("t"), "m", [AstTestFactory.integer(0)]);
-    _assertReplace(node, Getter_NodeReplacerTest_test_methodInvocation_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_methodInvocation_3());
-    _assertReplace(node, Getter_NodeReplacerTest_test_methodInvocation());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  a.foo<int>(0);
+  b.bar<double>(1);
+}
+''');
+    _assertReplacementForChildren<MethodInvocation>(
+      destination: findNode.methodInvocation('foo'),
+      source: findNode.methodInvocation('bar'),
+      childAccessors: [
+        (node) => node.target!,
+        (node) => node.typeArguments!,
+        (node) => node.argumentList,
+      ],
+    );
   }
 
   void test_namedExpression() {
-    NamedExpression node =
-        AstTestFactory.namedExpression2("l", AstTestFactory.identifier3("v"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_namedExpression());
-    _assertReplace(node, Getter_NodeReplacerTest_test_namedExpression_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  g(foo: 0, bar: 1);
+}
+''');
+    _assertReplacementForChildren<NamedExpression>(
+      destination: findNode.namedExpression('foo'),
+      source: findNode.namedExpression('bar'),
+      childAccessors: [
+        (node) => node.name,
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_nativeClause() {
-    NativeClause node = AstTestFactory.nativeClause("");
-    _assertReplace(node, Getter_NodeReplacerTest_test_nativeClause());
+    var findNode = _parseStringToFindNode(r'''
+class A native 'foo' {}
+class B native 'bar' {}
+''');
+    _assertReplacementForChildren<NativeClause>(
+      destination: findNode.nativeClause('foo'),
+      source: findNode.nativeClause('bar'),
+      childAccessors: [
+        (node) => node.name!,
+      ],
+    );
   }
 
   void test_nativeFunctionBody() {
-    NativeFunctionBody node = AstTestFactory.nativeFunctionBody("m");
-    _assertReplace(node, Getter_NodeReplacerTest_test_nativeFunctionBody());
+    var findNode = _parseStringToFindNode(r'''
+void f() native 'foo';
+void g() native 'bar';
+''');
+    _assertReplacementForChildren<NativeFunctionBody>(
+      destination: findNode.nativeFunctionBody('foo'),
+      source: findNode.nativeFunctionBody('bar'),
+      childAccessors: [
+        (node) => node.stringLiteral!,
+      ],
+    );
   }
 
   void test_parenthesizedExpression() {
-    ParenthesizedExpression node =
-        AstTestFactory.parenthesizedExpression(AstTestFactory.integer(0));
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_parenthesizedExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  (0);
+  (1);
+}
+''');
+    _assertReplacementForChildren<ParenthesizedExpression>(
+      destination: findNode.parenthesized('0'),
+      source: findNode.parenthesized('1'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_partDirective() {
-    var node = AstTestFactory.partDirective2("");
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _testUriBasedDirective(node);
+    var findNode = _parseStringToFindNode(r'''
+@myA1
+@myA2
+part 'a.dart';
+part 'b.dart';
+''');
+    var part_a = findNode.part('a.dart');
+    _assertAnnotatedNode(part_a);
+    _assertReplacementForChildren<PartDirective>(
+      destination: findNode.part('a.dart'),
+      source: findNode.part('b.dart'),
+      childAccessors: [
+        (node) => node.uri,
+      ],
+    );
   }
 
   void test_partOfDirective() {
-    var node = AstTestFactory.partOfDirective(
-        AstTestFactory.libraryIdentifier2(["lib"]));
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_partOfDirective());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+@myA1
+@myA2
+part of 'a.dart';
+''');
+    var partOf_a = findNode.partOf('a.dart');
+    _assertAnnotatedNode(partOf_a);
+    _assertReplacementForChildren<PartOfDirective>(
+      destination: findNode.partOf('a.dart'),
+      source: findNode.partOf('a.dart'),
+      childAccessors: [
+        (node) => node.uri!,
+      ],
+    );
   }
 
   void test_postfixExpression() {
-    PostfixExpression node = AstTestFactory.postfixExpression(
-        AstTestFactory.identifier3("x"), TokenType.MINUS_MINUS);
-    _assertReplace(node, Getter_NodeReplacerTest_test_postfixExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  a++;
+  b++;
+}
+''');
+    _assertReplacementForChildren<PostfixExpression>(
+      destination: findNode.postfix('a++'),
+      source: findNode.postfix('b++'),
+      childAccessors: [
+        (node) => node.operand,
+      ],
+    );
   }
 
   void test_prefixedIdentifier() {
-    PrefixedIdentifier node = AstTestFactory.identifier5("a", "b");
-    _assertReplace(node, Getter_NodeReplacerTest_test_prefixedIdentifier_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_prefixedIdentifier());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  a.foo;
+  b.bar;
+}
+''');
+    _assertReplacementForChildren<PrefixedIdentifier>(
+      destination: findNode.prefixed('a.foo'),
+      source: findNode.prefixed('b.bar'),
+      childAccessors: [
+        (node) => node.prefix,
+        (node) => node.identifier,
+      ],
+    );
   }
 
   void test_prefixExpression() {
-    PrefixExpression node = AstTestFactory.prefixExpression(
-        TokenType.PLUS_PLUS, AstTestFactory.identifier3("y"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_prefixExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  ++a;
+  ++b;
+}
+''');
+    _assertReplacementForChildren<PrefixExpression>(
+      destination: findNode.prefix('++a'),
+      source: findNode.prefix('++b'),
+      childAccessors: [
+        (node) => node.operand,
+      ],
+    );
   }
 
   void test_propertyAccess() {
-    PropertyAccess node =
-        AstTestFactory.propertyAccess2(AstTestFactory.identifier3("x"), "y");
-    _assertReplace(node, Getter_NodeReplacerTest_test_propertyAccess());
-    _assertReplace(node, Getter_NodeReplacerTest_test_propertyAccess_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  (a).foo;
+  (b).bar;
+}
+''');
+    _assertReplacementForChildren<PropertyAccess>(
+      destination: findNode.propertyAccess('(a)'),
+      source: findNode.propertyAccess('(b)'),
+      childAccessors: [
+        (node) => node.target!,
+        (node) => node.propertyName,
+      ],
+    );
   }
 
   void test_redirectingConstructorInvocation() {
-    RedirectingConstructorInvocation node =
-        AstTestFactory.redirectingConstructorInvocation2(
-            "c", [AstTestFactory.integer(0)]);
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_redirectingConstructorInvocation());
-    _assertReplace(node,
-        Getter_NodeReplacerTest_test_redirectingConstructorInvocation_2());
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  A.named();
+  A.foo() : this.named(0);
+  A.bar() : this.named(1);
+}
+''');
+    _assertReplacementForChildren<RedirectingConstructorInvocation>(
+      destination: findNode.redirectingConstructorInvocation('(0)'),
+      source: findNode.redirectingConstructorInvocation('(1)'),
+      childAccessors: [
+        (node) => node.constructorName!,
+        (node) => node.argumentList,
+      ],
+    );
   }
 
   void test_returnStatement() {
-    ReturnStatement node =
-        AstTestFactory.returnStatement2(AstTestFactory.integer(0));
-    _assertReplace(node, Getter_NodeReplacerTest_test_returnStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  return 0;
+  return 1;
+}
+''');
+    _assertReplacementForChildren<ReturnStatement>(
+      destination: findNode.returnStatement('0;'),
+      source: findNode.returnStatement('1;'),
+      childAccessors: [
+        (node) => node.expression!,
+      ],
+    );
+  }
+
+  void test_setOrMapLiteral() {
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  <int, int>{0: 1, 2: 3};
+  <double, double>{};
+}
+''');
+    var node = findNode.setOrMapLiteral('<int');
+    _assertReplaceInList(
+      destination: node,
+      child: node.elements[0],
+      replacement: node.elements[1],
+    );
+    _assertReplacementForChildren<SetOrMapLiteral>(
+      destination: findNode.setOrMapLiteral('<int'),
+      source: findNode.setOrMapLiteral('<double'),
+      childAccessors: [
+        (node) => node.typeArguments!,
+      ],
+    );
   }
 
   void test_showCombinator() {
-    ShowCombinator node = AstTestFactory.showCombinator2(["X", "Y"]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_showCombinator(0));
+    var findNode = _parseStringToFindNode(r'''
+import '' show A, B;
+''');
+    var node = findNode.showCombinator('show');
+    _assertReplaceInList(
+      destination: node,
+      child: node.shownNames[0],
+      replacement: node.shownNames[1],
+    );
   }
 
   void test_simpleFormalParameter() {
-    var node = AstTestFactory.simpleFormalParameter4(
-        AstTestFactory.typeName4("T"), "p");
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata = [
-      AstTestFactory.annotation(AstTestFactory.identifier3("a"))
-    ];
-    _assertReplace(node, Getter_NodeReplacerTest_test_simpleFormalParameter());
-    _testNormalFormalParameter(node);
+    var findNode = _parseStringToFindNode(r'''
+void f(
+  @myA1
+  @myA2
+  int a,
+  int b
+) {}
+''');
+    var a = findNode.simpleFormalParameter('int a');
+    _assertFormalParameterMetadata(a);
+    _assertReplacementForChildren<SimpleFormalParameter>(
+      destination: a,
+      source: findNode.simpleFormalParameter('int b'),
+      childAccessors: [
+        (node) => node.type!,
+        (node) => node.identifier!,
+      ],
+    );
   }
 
   void test_stringInterpolation() {
-    var unit = parseString(content: 'var v = "first \$x last";').unit;
-    var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
-    var variable = declaration.variables.variables[0];
-    var node = variable.initializer as StringInterpolation;
-    _assertReplace(
-        node, ListGetter_NodeReplacerTest_test_stringInterpolation(0));
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  'my $foo other $bar';
+}
+''');
+    var node = findNode.stringInterpolation('foo');
+    _assertReplaceInList(
+      destination: node,
+      child: node.elements[0],
+      replacement: node.elements[1],
+    );
   }
 
   void test_superConstructorInvocation() {
-    SuperConstructorInvocation node =
-        AstTestFactory.superConstructorInvocation2(
-            "s", [AstTestFactory.integer(1)]);
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_superConstructorInvocation());
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_superConstructorInvocation_2());
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  A.foo() : super.first(0);
+  A.bar() : super.second(0);
+}
+''');
+    _assertReplacementForChildren<SuperConstructorInvocation>(
+      destination: findNode.superConstructorInvocation('first'),
+      source: findNode.superConstructorInvocation('second'),
+      childAccessors: [
+        (node) => node.constructorName!,
+        (node) => node.argumentList,
+      ],
+    );
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47951')
+  void test_superFormalParameter() {
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  A(num a);
+}
+
+class B extends A {
+  B.sub1(int super.a1);
+  B.sub2(double super.a2);
+}
+''');
+    _assertReplacementForChildren<SuperFormalParameter>(
+      destination: findNode.superFormalParameter('a1'),
+      source: findNode.superFormalParameter('a2'),
+      childAccessors: [
+        (node) => node.type!,
+        (node) => node.identifier,
+      ],
+    );
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47741')
+  void test_superFormalParameter_functionTyped() {
+    var findNode = _parseStringToFindNode(r'''
+class A {
+  A(int foo<T>(int a));
+}
+
+class B extends A {
+  B.sub1(double super.bar1<T1>(int a1),);
+  B.sub2(double super.bar2<T2>(int a2),);
+}
+''');
+    _assertReplacementForChildren<SuperFormalParameter>(
+      destination: findNode.superFormalParameter('bar1'),
+      source: findNode.superFormalParameter('bar2'),
+      childAccessors: [
+        (node) => node.type!,
+        (node) => node.identifier,
+        (node) => node.typeParameters!,
+        (node) => node.parameters!,
+      ],
+    );
   }
 
   void test_switchCase() {
-    SwitchCase node = AstTestFactory.switchCase2([AstTestFactory.label2("l")],
-        AstTestFactory.integer(0), [AstTestFactory.block()]);
-    _assertReplace(node, Getter_NodeReplacerTest_test_switchCase());
-    _testSwitchMember(node);
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  switch (x) {
+    foo: bar:
+    case 0: 0; 1;
+    case 1: break;
+  }
+}
+''');
+    _assertSwitchMember(
+      findNode.switchCase('case 0'),
+    );
+    _assertReplacementForChildren<SwitchCase>(
+      destination: findNode.switchCase('case 0'),
+      source: findNode.switchCase('case 1'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_switchDefault() {
-    SwitchDefault node = AstTestFactory.switchDefault(
-        [AstTestFactory.label2("l")], [AstTestFactory.block()]);
-    _testSwitchMember(node);
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  switch (x) {
+    foo: bar:
+    default: 0; 1;
+  }
+}
+''');
+    _assertSwitchMember(
+      findNode.switchDefault('default: 0'),
+    );
   }
 
   void test_switchStatement() {
-    SwitchStatement node =
-        AstTestFactory.switchStatement(AstTestFactory.identifier3("x"), [
-      AstTestFactory.switchCase2([AstTestFactory.label2("l")],
-          AstTestFactory.integer(0), [AstTestFactory.block()]),
-      AstTestFactory.switchDefault(
-          [AstTestFactory.label2("l")], [AstTestFactory.block()])
-    ]);
-    _assertReplace(node, Getter_NodeReplacerTest_test_switchStatement());
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_switchStatement(0));
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  switch (0) {
+    case 0: break;
+    case 1: break;
+  }
+  switch (1) {}
+}
+''');
+    _assertReplaceInList(
+      destination: findNode.switchStatement('(0)'),
+      child: findNode.switchCase('case 0'),
+      replacement: findNode.switchCase('case 1'),
+    );
+    _assertReplacementForChildren<SwitchStatement>(
+      destination: findNode.switchStatement('(0)'),
+      source: findNode.switchStatement('(1)'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_throwExpression() {
-    ThrowExpression node =
-        AstTestFactory.throwExpression2(AstTestFactory.identifier3("e"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_throwExpression());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  throw 0;
+  throw 1;
+}
+''');
+    _assertReplacementForChildren<ThrowExpression>(
+      destination: findNode.throw_('throw 0'),
+      source: findNode.throw_('throw 1'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
   void test_topLevelVariableDeclaration() {
-    var node = AstTestFactory.topLevelVariableDeclaration(
-        null,
-        AstTestFactory.typeName4("T"),
-        [AstTestFactory.variableDeclaration("t")]);
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_topLevelVariableDeclaration());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+@myA1
+@myA2
+var a = 0;
+var b = 1;
+''');
+    _assertAnnotatedNode(
+      findNode.topLevelVariableDeclaration('a = 0'),
+    );
+    _assertReplacementForChildren<TopLevelVariableDeclaration>(
+      destination: findNode.topLevelVariableDeclaration('a = 0'),
+      source: findNode.topLevelVariableDeclaration('b = 1'),
+      childAccessors: [
+        (node) => node.variables,
+      ],
+    );
   }
 
   void test_tryStatement() {
-    TryStatement node = AstTestFactory.tryStatement3(
-        AstTestFactory.block(),
-        [
-          AstTestFactory.catchClause("e", [AstTestFactory.block()])
-        ],
-        AstTestFactory.block());
-    _assertReplace(node, Getter_NodeReplacerTest_test_tryStatement_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_tryStatement());
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_tryStatement(0));
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  try { // 0
+    0;
+  } on E1 {
+  } on E2 {
+  } finally {
+    1;
+  }
+  try { // 1
+    2;
+  } finally {
+    3;
+  }
+}
+''');
+    _assertReplaceInList(
+      destination: findNode.tryStatement('// 0'),
+      child: findNode.catchClause('E1'),
+      replacement: findNode.catchClause('E2'),
+    );
+    _assertReplacementForChildren<TryStatement>(
+      destination: findNode.tryStatement('// 0'),
+      source: findNode.tryStatement('// 1'),
+      childAccessors: [
+        (node) => node.body,
+        (node) => node.finallyBlock!,
+      ],
+    );
   }
 
   void test_typeArgumentList() {
-    TypeArgumentList node =
-        AstTestFactory.typeArgumentList2([AstTestFactory.typeName4("A")]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_typeArgumentList(0));
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  g<int, double>();
+}
+''');
+    _assertReplaceInList(
+      destination: findNode.typeArgumentList('<int'),
+      child: findNode.namedType('int'),
+      replacement: findNode.namedType('double'),
+    );
   }
 
   void test_typeName() {
-    NamedType node = AstTestFactory.typeName4(
-        "T", [AstTestFactory.typeName4("E"), AstTestFactory.typeName4("F")]);
-    _assertReplace(node, Getter_NodeReplacerTest_test_typeName_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_typeName());
+    var findNode = _parseStringToFindNode(r'''
+void f(List<int> a, Set<double> b) {}
+''');
+    _assertReplacementForChildren<NamedType>(
+      destination: findNode.namedType('List<int>'),
+      source: findNode.namedType('Set<double>'),
+      childAccessors: [
+        (node) => node.name,
+        (node) => node.typeArguments!,
+      ],
+    );
   }
 
   void test_typeParameter() {
-    TypeParameter node =
-        AstTestFactory.typeParameter2("E", AstTestFactory.typeName4("B"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_typeParameter_2());
-    _assertReplace(node, Getter_NodeReplacerTest_test_typeParameter());
+    var findNode = _parseStringToFindNode(r'''
+class A<T extends int, U extends double> {}
+''');
+    _assertReplacementForChildren<TypeParameter>(
+      destination: findNode.typeParameter('T extends'),
+      source: findNode.typeParameter('U extends'),
+      childAccessors: [
+        (node) => node.name,
+        (node) => node.bound!,
+      ],
+    );
   }
 
   void test_typeParameterList() {
-    TypeParameterList node = AstTestFactory.typeParameterList2(["A", "B"]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_typeParameterList(0));
+    var findNode = _parseStringToFindNode(r'''
+class A<T, U> {}
+''');
+    var node = findNode.typeParameterList('<T, U>');
+    _assertReplaceInList(
+      destination: node,
+      child: node.typeParameters[0],
+      replacement: node.typeParameters[1],
+    );
   }
 
   void test_variableDeclaration() {
-    var node =
-        AstTestFactory.variableDeclaration2("a", AstTestFactory.nullLiteral());
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(node, Getter_NodeReplacerTest_test_variableDeclaration());
-    _assertReplace(node, Getter_NodeReplacerTest_test_variableDeclaration_2());
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  var a = 0;
+  var b = 1;
+}
+''');
+    _assertReplacementForChildren<VariableDeclaration>(
+      destination: findNode.variableDeclaration('a = 0'),
+      source: findNode.variableDeclaration('b = 1'),
+      childAccessors: [
+        (node) => node.name,
+        (node) => node.initializer!,
+      ],
+    );
   }
 
   void test_variableDeclarationList() {
-    var node = AstTestFactory.variableDeclarationList(
-        null,
-        AstTestFactory.typeName4("T"),
-        [AstTestFactory.variableDeclaration("a")]);
-    node.documentationComment = astFactory.endOfLineComment(EMPTY_TOKEN_LIST);
-    node.metadata
-        .add(AstTestFactory.annotation(AstTestFactory.identifier3("a")));
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_variableDeclarationList());
-    _assertReplace(
-        node, ListGetter_NodeReplacerTest_test_variableDeclarationList(0));
-    _testAnnotatedNode(node);
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  int a = 0, b = 1;
+  double c = 2;
+}
+''');
+    _assertReplaceInList(
+      destination: findNode.variableDeclarationList('int a'),
+      child: findNode.variableDeclaration('a = 0'),
+      replacement: findNode.variableDeclaration('b = 1'),
+    );
+    _assertReplacementForChildren<VariableDeclarationList>(
+      destination: findNode.variableDeclarationList('int a'),
+      source: findNode.variableDeclarationList('double c'),
+      childAccessors: [
+        (node) => node.type!,
+      ],
+    );
   }
 
   void test_variableDeclarationStatement() {
-    VariableDeclarationStatement node =
-        AstTestFactory.variableDeclarationStatement(
-            null,
-            AstTestFactory.typeName4("T"),
-            [AstTestFactory.variableDeclaration("a")]);
-    _assertReplace(
-        node, Getter_NodeReplacerTest_test_variableDeclarationStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  int a = 0;
+  double b = 1;
+}
+''');
+    _assertReplacementForChildren<VariableDeclarationStatement>(
+      destination: findNode.variableDeclarationStatement('int a'),
+      source: findNode.variableDeclarationStatement('double b'),
+      childAccessors: [
+        (node) => node.variables,
+      ],
+    );
   }
 
   void test_whileStatement() {
-    WhileStatement node = AstTestFactory.whileStatement(
-        AstTestFactory.booleanLiteral(true), AstTestFactory.block());
-    _assertReplace(node, Getter_NodeReplacerTest_test_whileStatement());
-    _assertReplace(node, Getter_NodeReplacerTest_test_whileStatement_2());
+    var findNode = _parseStringToFindNode(r'''
+void f() {
+  while (true) {
+    0;
+  }
+  while (false) {
+    1;
+  }
+}
+''');
+    _assertReplacementForChildren<WhileStatement>(
+      destination: findNode.whileStatement('(true)'),
+      source: findNode.whileStatement('(false)'),
+      childAccessors: [
+        (node) => node.condition,
+        (node) => node.body,
+      ],
+    );
   }
 
   void test_withClause() {
-    WithClause node =
-        AstTestFactory.withClause([AstTestFactory.typeName4("M")]);
-    _assertReplace(node, ListGetter_NodeReplacerTest_test_withClause(0));
+    var findNode = _parseStringToFindNode(r'''
+class A with M, N {}
+''');
+    var node = findNode.withClause('with');
+    _assertReplaceInList(
+      destination: node,
+      child: node.mixinTypes2[0],
+      replacement: node.mixinTypes2[1],
+    );
   }
 
   void test_yieldStatement() {
-    var node = AstTestFactory.yieldStatement(AstTestFactory.identifier3("A"));
-    _assertReplace(node, Getter_NodeReplacerTest_test_yieldStatement());
+    var findNode = _parseStringToFindNode(r'''
+void f() sync* {
+  yield 0;
+  yield 1;
+}
+''');
+    _assertReplacementForChildren<YieldStatement>(
+      destination: findNode.yieldStatement('yield 0;'),
+      source: findNode.yieldStatement('yield 1'),
+      childAccessors: [
+        (node) => node.expression,
+      ],
+    );
   }
 
-  void _assertReplace(AstNode parent, NodeReplacerTest_Getter getter) {
-    var child = getter.get(parent);
-    if (child != null) {
-      NodeReplacer.replace(child, child);
-      expect(getter.get(parent), child);
-      expect(child.parent, child.parent);
+  /// Asserts that the first annotation can be replaced with the second.
+  /// Expects that [node] has at least 2 annotations.
+  void _assertAnnotatedNode(AnnotatedNode node) {
+    _assertReplaceInList(
+      destination: node,
+      child: node.metadata[0],
+      replacement: node.metadata[1],
+    );
+  }
+
+  /// Asserts that the first annotation can be replaced with the second.
+  /// Expects that [node] has at least 2 annotations.
+  void _assertFormalParameterMetadata(FormalParameter node) {
+    _assertReplaceInList(
+      destination: node,
+      child: node.metadata[0],
+      replacement: node.metadata[1],
+    );
+  }
+
+  /// Asserts that a [child] node, with parent that is [destination], can
+  /// by replaced with the [replacement], and then its parent is [destination].
+  void _assertReplaceInList({
+    required AstNode destination,
+    required AstNode child,
+    required AstNode replacement,
+  }) {
+    expect(child.parent, destination);
+
+    NodeReplacer.replace(child, replacement);
+    expect(replacement.parent, destination);
+  }
+
+  /// Asserts for each child returned by a function from [childAccessors]
+  /// for [destination] that its parent is actually [destination], and then
+  /// replaces it with a node returned this function for [source]. At the end,
+  /// checks that the function, invoked for [destination] now returns the
+  /// replacement node, and its parent is now [destination].
+  void _assertReplacementForChildren<T extends AstNode>({
+    required T destination,
+    required T source,
+    required List<AstNode Function(T node)> childAccessors,
+  }) {
+    for (var childAccessor in childAccessors) {
+      var child = childAccessor(destination);
+      expect(child.parent, destination);
+
+      var replacement = childAccessor(source);
+      NodeReplacer.replace(child, replacement);
+      expect(childAccessor(destination), replacement);
+      expect(replacement.parent, destination);
     }
   }
 
-  void _testAnnotatedNode(AnnotatedNode node) {
-    _assertReplace(node, Getter_NodeReplacerTest_testAnnotatedNode());
-    _assertReplace(node, ListGetter_NodeReplacerTest_testAnnotatedNode(0));
+  void _assertSwitchMember(SwitchMember node) {
+    _assertReplaceInList(
+      destination: node,
+      child: node.labels[0],
+      replacement: node.labels[1],
+    );
+    _assertReplaceInList(
+      destination: node,
+      child: node.statements[0],
+      replacement: node.statements[1],
+    );
   }
 
-  void _testNamespaceDirective(NamespaceDirective node) {
-    _assertReplace(node, ListGetter_NodeReplacerTest_testNamespaceDirective(0));
-    _testUriBasedDirective(node);
+  FindNode _parseStringToFindNode(String content) {
+    var parseResult = parseString(
+      content: content,
+      featureSet: FeatureSet.fromEnableFlags2(
+        sdkLanguageVersion: ExperimentStatus.currentVersion,
+        flags: [
+          Feature.enhanced_enums.enableString,
+          Feature.super_parameters.enableString,
+        ],
+      ),
+    );
+    return FindNode(parseResult.content, parseResult.unit);
   }
-
-  void _testNormalFormalParameter(NormalFormalParameter node) {
-    _assertReplace(node, Getter_NodeReplacerTest_testNormalFormalParameter_2());
-    _assertReplace(node, Getter_NodeReplacerTest_testNormalFormalParameter());
-    _assertReplace(
-        node, ListGetter_NodeReplacerTest_testNormalFormalParameter(0));
-  }
-
-  void _testSwitchMember(SwitchMember node) {
-    _assertReplace(node, ListGetter_NodeReplacerTest_testSwitchMember(0));
-    _assertReplace(node, ListGetter_NodeReplacerTest_testSwitchMember_2(0));
-  }
-
-  void _testTypedLiteral(TypedLiteral node) {
-    _assertReplace(node, Getter_NodeReplacerTest_testTypedLiteral());
-  }
-
-  void _testUriBasedDirective(UriBasedDirective node) {
-    _assertReplace(node, Getter_NodeReplacerTest_testUriBasedDirective());
-    _testAnnotatedNode(node);
-  }
-}
-
-abstract class NodeReplacerTest_Getter<P, C extends AstNode> {
-  C? get(P parent);
-}
-
-abstract class NodeReplacerTest_ListGetter<P extends AstNode, C extends AstNode>
-    implements NodeReplacerTest_Getter<P, C> {
-  final int _index;
-
-  NodeReplacerTest_ListGetter(this._index);
-
-  @override
-  C? get(P parent) {
-    NodeList<C> list = getList(parent);
-    if (list.isEmpty) {
-      return null;
-    }
-    return list[_index];
-  }
-
-  NodeList<C> getList(P parent);
 }
 
 @reflectiveTest
@@ -2470,254 +2200,3 @@
     expect(r.toString(), "[offset=10, length=1]");
   }
 }
-
-@reflectiveTest
-class StringUtilitiesTest {
-  void test_computeLineStarts_n() {
-    List<int> starts = StringUtilities.computeLineStarts('a\nbb\nccc');
-    expect(starts, <int>[0, 2, 5]);
-  }
-
-  void test_computeLineStarts_r() {
-    List<int> starts = StringUtilities.computeLineStarts('a\rbb\rccc');
-    expect(starts, <int>[0, 2, 5]);
-  }
-
-  void test_computeLineStarts_rn() {
-    List<int> starts = StringUtilities.computeLineStarts('a\r\nbb\r\nccc');
-    expect(starts, <int>[0, 3, 7]);
-  }
-
-  void test_EMPTY() {
-    expect(StringUtilities.EMPTY, "");
-    expect(StringUtilities.EMPTY.isEmpty, isTrue);
-  }
-
-  void test_EMPTY_ARRAY() {
-    expect(StringUtilities.EMPTY_ARRAY.length, 0);
-  }
-
-  void test_endsWith3() {
-    expect(StringUtilities.endsWith3("abc", 0x61, 0x62, 0x63), isTrue);
-    expect(StringUtilities.endsWith3("abcdefghi", 0x67, 0x68, 0x69), isTrue);
-    expect(StringUtilities.endsWith3("abcdefghi", 0x64, 0x65, 0x61), isFalse);
-    // missing
-  }
-
-  void test_endsWithChar() {
-    expect(StringUtilities.endsWithChar("a", 0x61), isTrue);
-    expect(StringUtilities.endsWithChar("b", 0x61), isFalse);
-    expect(StringUtilities.endsWithChar("", 0x61), isFalse);
-  }
-
-  void test_indexOf1() {
-    expect(StringUtilities.indexOf1("a", 0, 0x61), 0);
-    expect(StringUtilities.indexOf1("abcdef", 0, 0x61), 0);
-    expect(StringUtilities.indexOf1("abcdef", 0, 0x63), 2);
-    expect(StringUtilities.indexOf1("abcdef", 0, 0x66), 5);
-    expect(StringUtilities.indexOf1("abcdef", 0, 0x7A), -1);
-    expect(StringUtilities.indexOf1("abcdef", 1, 0x61), -1);
-    // before start
-  }
-
-  void test_indexOf2() {
-    expect(StringUtilities.indexOf2("ab", 0, 0x61, 0x62), 0);
-    expect(StringUtilities.indexOf2("abcdef", 0, 0x61, 0x62), 0);
-    expect(StringUtilities.indexOf2("abcdef", 0, 0x63, 0x64), 2);
-    expect(StringUtilities.indexOf2("abcdef", 0, 0x65, 0x66), 4);
-    expect(StringUtilities.indexOf2("abcdef", 0, 0x64, 0x61), -1);
-    expect(StringUtilities.indexOf2("abcdef", 1, 0x61, 0x62), -1);
-    // before start
-  }
-
-  void test_indexOf4() {
-    expect(StringUtilities.indexOf4("abcd", 0, 0x61, 0x62, 0x63, 0x64), 0);
-    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64), 0);
-    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x63, 0x64, 0x65, 0x66), 2);
-    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x66, 0x67, 0x68, 0x69), 5);
-    expect(
-        StringUtilities.indexOf4("abcdefghi", 0, 0x64, 0x65, 0x61, 0x64), -1);
-    expect(
-        StringUtilities.indexOf4("abcdefghi", 1, 0x61, 0x62, 0x63, 0x64), -1);
-    // before start
-  }
-
-  void test_indexOf5() {
-    expect(
-        StringUtilities.indexOf5("abcde", 0, 0x61, 0x62, 0x63, 0x64, 0x65), 0);
-    expect(
-        StringUtilities.indexOf5("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65),
-        0);
-    expect(
-        StringUtilities.indexOf5("abcdefghi", 0, 0x63, 0x64, 0x65, 0x66, 0x67),
-        2);
-    expect(
-        StringUtilities.indexOf5("abcdefghi", 0, 0x65, 0x66, 0x67, 0x68, 0x69),
-        4);
-    expect(
-        StringUtilities.indexOf5("abcdefghi", 0, 0x64, 0x65, 0x66, 0x69, 0x6E),
-        -1);
-    expect(
-        StringUtilities.indexOf5("abcdefghi", 1, 0x61, 0x62, 0x63, 0x64, 0x65),
-        -1);
-    // before start
-  }
-
-  void test_isEmpty() {
-    expect(StringUtilities.isEmpty(""), isTrue);
-    expect(StringUtilities.isEmpty(" "), isFalse);
-    expect(StringUtilities.isEmpty("a"), isFalse);
-    expect(StringUtilities.isEmpty(StringUtilities.EMPTY), isTrue);
-  }
-
-  void test_isTagName() {
-    expect(StringUtilities.isTagName(null), isFalse);
-    expect(StringUtilities.isTagName(""), isFalse);
-    expect(StringUtilities.isTagName("-"), isFalse);
-    expect(StringUtilities.isTagName("0"), isFalse);
-    expect(StringUtilities.isTagName("0a"), isFalse);
-    expect(StringUtilities.isTagName("a b"), isFalse);
-    expect(StringUtilities.isTagName("a0"), isTrue);
-    expect(StringUtilities.isTagName("a"), isTrue);
-    expect(StringUtilities.isTagName("ab"), isTrue);
-    expect(StringUtilities.isTagName("a-b"), isTrue);
-  }
-
-  void test_printListOfQuotedNames_empty() {
-    expect(() {
-      StringUtilities.printListOfQuotedNames([]);
-    }, throwsArgumentError);
-  }
-
-  void test_printListOfQuotedNames_five() {
-    expect(
-        StringUtilities.printListOfQuotedNames(
-            <String>["a", "b", "c", "d", "e"]),
-        "'a', 'b', 'c', 'd' and 'e'");
-  }
-
-  void test_printListOfQuotedNames_null() {
-    expect(() {
-      StringUtilities.printListOfQuotedNames(null);
-    }, throwsArgumentError);
-  }
-
-  void test_printListOfQuotedNames_one() {
-    expect(() {
-      StringUtilities.printListOfQuotedNames(<String>["a"]);
-    }, throwsArgumentError);
-  }
-
-  void test_printListOfQuotedNames_three() {
-    expect(StringUtilities.printListOfQuotedNames(<String>["a", "b", "c"]),
-        "'a', 'b' and 'c'");
-  }
-
-  void test_printListOfQuotedNames_two() {
-    expect(StringUtilities.printListOfQuotedNames(<String>["a", "b"]),
-        "'a' and 'b'");
-  }
-
-  void test_startsWith2() {
-    expect(StringUtilities.startsWith2("ab", 0, 0x61, 0x62), isTrue);
-    expect(StringUtilities.startsWith2("abcdefghi", 0, 0x61, 0x62), isTrue);
-    expect(StringUtilities.startsWith2("abcdefghi", 2, 0x63, 0x64), isTrue);
-    expect(StringUtilities.startsWith2("abcdefghi", 5, 0x66, 0x67), isTrue);
-    expect(StringUtilities.startsWith2("abcdefghi", 0, 0x64, 0x64), isFalse);
-    // missing
-  }
-
-  void test_startsWith3() {
-    expect(StringUtilities.startsWith3("abc", 0, 0x61, 0x62, 0x63), isTrue);
-    expect(
-        StringUtilities.startsWith3("abcdefghi", 0, 0x61, 0x62, 0x63), isTrue);
-    expect(
-        StringUtilities.startsWith3("abcdefghi", 2, 0x63, 0x64, 0x65), isTrue);
-    expect(
-        StringUtilities.startsWith3("abcdefghi", 6, 0x67, 0x68, 0x69), isTrue);
-    expect(
-        StringUtilities.startsWith3("abcdefghi", 0, 0x64, 0x65, 0x61), isFalse);
-    // missing
-  }
-
-  void test_startsWith4() {
-    expect(
-        StringUtilities.startsWith4("abcd", 0, 0x61, 0x62, 0x63, 0x64), isTrue);
-    expect(StringUtilities.startsWith4("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64),
-        isTrue);
-    expect(StringUtilities.startsWith4("abcdefghi", 2, 0x63, 0x64, 0x65, 0x66),
-        isTrue);
-    expect(StringUtilities.startsWith4("abcdefghi", 5, 0x66, 0x67, 0x68, 0x69),
-        isTrue);
-    expect(StringUtilities.startsWith4("abcdefghi", 0, 0x64, 0x65, 0x61, 0x64),
-        isFalse);
-    // missing
-  }
-
-  void test_startsWith5() {
-    expect(
-        StringUtilities.startsWith5("abcde", 0, 0x61, 0x62, 0x63, 0x64, 0x65),
-        isTrue);
-    expect(
-        StringUtilities.startsWith5(
-            "abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65),
-        isTrue);
-    expect(
-        StringUtilities.startsWith5(
-            "abcdefghi", 2, 0x63, 0x64, 0x65, 0x66, 0x67),
-        isTrue);
-    expect(
-        StringUtilities.startsWith5(
-            "abcdefghi", 4, 0x65, 0x66, 0x67, 0x68, 0x69),
-        isTrue);
-    expect(
-        StringUtilities.startsWith5(
-            "abcdefghi", 0, 0x61, 0x62, 0x63, 0x62, 0x61),
-        isFalse);
-    // missing
-  }
-
-  void test_startsWith6() {
-    expect(
-        StringUtilities.startsWith6(
-            "abcdef", 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66),
-        isTrue);
-    expect(
-        StringUtilities.startsWith6(
-            "abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66),
-        isTrue);
-    expect(
-        StringUtilities.startsWith6(
-            "abcdefghi", 2, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68),
-        isTrue);
-    expect(
-        StringUtilities.startsWith6(
-            "abcdefghi", 3, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69),
-        isTrue);
-    expect(
-        StringUtilities.startsWith6(
-            "abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67),
-        isFalse);
-    // missing
-  }
-
-  void test_substringBefore() {
-    expect(StringUtilities.substringBefore(null, ""), null);
-    expect(StringUtilities.substringBefore(null, "a"), null);
-    expect(StringUtilities.substringBefore("", "a"), "");
-    expect(StringUtilities.substringBefore("abc", "a"), "");
-    expect(StringUtilities.substringBefore("abcba", "b"), "a");
-    expect(StringUtilities.substringBefore("abc", "c"), "ab");
-    expect(StringUtilities.substringBefore("abc", "d"), "abc");
-    expect(StringUtilities.substringBefore("abc", ""), "");
-    expect(StringUtilities.substringBefore("abc", null), "abc");
-  }
-
-  void test_substringBeforeChar() {
-    expect(StringUtilities.substringBeforeChar("", 0x61), "");
-    expect(StringUtilities.substringBeforeChar("abc", 0x61), "");
-    expect(StringUtilities.substringBeforeChar("abcba", 0x62), "a");
-    expect(StringUtilities.substringBeforeChar("abc", 0x63), "ab");
-    expect(StringUtilities.substringBeforeChar("abc", 0x64), "abc");
-  }
-}
diff --git a/pkg/analyzer/test/resource_utils.dart b/pkg/analyzer/test/resource_utils.dart
index 3337265..8d84e18 100644
--- a/pkg/analyzer/test/resource_utils.dart
+++ b/pkg/analyzer/test/resource_utils.dart
@@ -6,7 +6,6 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
@@ -88,11 +87,6 @@
   Folder getFolder(String path) => _provider.getFolder(_assertPath(path));
 
   @override
-  Future<List<int>> getModificationTimes(List<Source> sources) async {
-    return sources.map((source) => 0).toList();
-  }
-
-  @override
   Resource getResource(String path) => _provider.getResource(_assertPath(path));
 
   @override
diff --git a/pkg/analyzer/test/source/package_map_resolver_test.dart b/pkg/analyzer/test/source/package_map_resolver_test.dart
index 19aee6d..27d7a9c 100644
--- a/pkg/analyzer/test/source/package_map_resolver_test.dart
+++ b/pkg/analyzer/test/source/package_map_resolver_test.dart
@@ -39,6 +39,33 @@
     expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
   }
 
+  void test_pathToUri() {
+    String pkgFileA = provider.convertPath('/pkgA/lib/libA.dart');
+    String pkgFileB = provider.convertPath('/pkgB/lib/src/libB.dart');
+    provider.newFile(pkgFileA, 'library lib_a;');
+    provider.newFile(pkgFileB, 'library lib_b;');
+    PackageMapUriResolver resolver =
+        PackageMapUriResolver(provider, <String, List<Folder>>{
+      'pkgA': <Folder>[provider.getFolder(provider.convertPath('/pkgA/lib'))],
+      'pkgB': <Folder>[provider.getFolder(provider.convertPath('/pkgB/lib'))]
+    });
+    {
+      var path = provider.convertPath('/pkgA/lib/libA.dart');
+      var uri = resolver.pathToUri(path);
+      expect(uri, Uri.parse('package:pkgA/libA.dart'));
+    }
+    {
+      var path = provider.convertPath('/pkgB/lib/src/libB.dart');
+      var uri = resolver.pathToUri(path);
+      expect(uri, Uri.parse('package:pkgB/src/libB.dart'));
+    }
+    {
+      var path = provider.convertPath('/no/such/file');
+      var uri = resolver.pathToUri(path);
+      expect(uri, isNull);
+    }
+  }
+
   void test_resolve_multiple_folders() {
     var a = provider.newFile(provider.convertPath('/aaa/a.dart'), '');
     var b = provider.newFile(provider.convertPath('/bbb/b.dart'), '');
@@ -70,14 +97,14 @@
       Uri uri = Uri.parse('package:pkgA/libA.dart');
       var result = resolver.resolveAbsolute(uri)!;
       expect(result.exists(), isTrue);
-      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.uri, uri);
       expect(result.fullName, pkgFileA);
     }
     {
       Uri uri = Uri.parse('package:pkgB/libB.dart');
       var result = resolver.resolveAbsolute(uri)!;
       expect(result.exists(), isTrue);
-      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.uri, uri);
       expect(result.fullName, pkgFileB);
     }
   }
@@ -144,6 +171,7 @@
     expect(result, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute() {
     String pkgFileA = provider.convertPath('/pkgA/lib/libA.dart');
     String pkgFileB = provider.convertPath('/pkgB/lib/src/libB.dart');
@@ -173,7 +201,8 @@
     }
   }
 
+  @Deprecated('Use pathToUri() instead')
   Source _createFileSource(String path) {
-    return NonExistingSource(path, toUri(path), UriKind.FILE_URI);
+    return NonExistingSource(path, toUri(path));
   }
 }
diff --git a/pkg/analyzer/test/src/clients/dart_style/rewrite_cascade_test.dart b/pkg/analyzer/test/src/clients/dart_style/rewrite_cascade_test.dart
new file mode 100644
index 0000000..81d2486
--- /dev/null
+++ b/pkg/analyzer/test/src/clients/dart_style/rewrite_cascade_test.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/analysis/utilities.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/clients/dart_style/rewrite_cascade.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RewriteCascadeTest);
+  });
+}
+
+@reflectiveTest
+class RewriteCascadeTest {
+  test_fixCascadeByParenthesizingTarget() {
+    const pairs = {
+      'c ? a : b..method();': '(c ? a : b)..method();',
+      'a ?? b..method();': '(a ?? b)..method();',
+      'a && b..method();': '(a && b)..method();',
+      'a || b..method();': '(a || b)..method();',
+      'a == b..method();': '(a == b)..method();',
+      'a != b..method();': '(a != b)..method();',
+      'a < b..method();': '(a < b)..method();',
+      'a > b..method();': '(a > b)..method();',
+      'a <= b..method();': '(a <= b)..method();',
+      'a >= b..method();': '(a >= b)..method();',
+      'a ^ b..method();': '(a ^ b)..method();',
+      'a | b..method();': '(a | b)..method();',
+      'a << b..method();': '(a << b)..method();',
+      'a >> b..method();': '(a >> b)..method();',
+      'a + b..method();': '(a + b)..method();',
+      'a - b..method();': '(a - b)..method();',
+      'a * b..method();': '(a * b)..method();',
+      'a / b..method();': '(a / b)..method();',
+      'a ~/ b..method();': '(a ~/ b)..method();',
+      '-a..method();': '(-a)..method();',
+      '!a..method();': '(!a)..method();',
+      '~a..method();': '(~a)..method();',
+      'a++..method();': '(a++)..method();',
+      'a--..method();': '(a--)..method();',
+    };
+
+    void assertSingle({
+      required String input,
+      required String expected,
+    }) {
+      var statement = _parseStringToFindNode('''
+void f() {
+  $input
+}
+''').expressionStatement(input);
+      var result = fixCascadeByParenthesizingTarget(
+        expressionStatement: statement,
+        cascadeExpression: statement.expression as CascadeExpression,
+      );
+      expect(result.toSource(), expected);
+      expect(result.semicolon, same(statement.semicolon));
+    }
+
+    for (var entry in pairs.entries) {
+      assertSingle(
+        input: entry.key,
+        expected: entry.value,
+      );
+    }
+  }
+
+  test_insertCascadeTargetIntoExpression() {
+    void assertSingle({
+      required String input,
+      required String expected,
+    }) {
+      var statement = _parseStringToFindNode('''
+void f() {
+  $input;
+    }
+    ''').expressionStatement(input);
+      var cascadeExpression = statement.expression as CascadeExpression;
+      var result = insertCascadeTargetIntoExpression(
+        expression: cascadeExpression.cascadeSections.single,
+        cascadeTarget: cascadeExpression.target,
+      );
+      expect(result.toSource(), expected);
+    }
+
+    const pairs = {
+      'obj..method()': 'obj.method()',
+      'obj..getter': 'obj.getter',
+      'obj..setter = 3': 'obj.setter = 3',
+      'obj..[subscript] = 3': 'obj[subscript] = 3',
+      'obj?..[subscript] = 3': 'obj?[subscript] = 3',
+      'obj..index[subscript] = 3': 'obj.index[subscript] = 3',
+      'obj..index?[subscript] = 3': 'obj.index?[subscript] = 3',
+      // Nested
+      'obj..foo().bar().method()': 'obj.foo().bar().method()',
+      'obj..foo.bar.getter': 'obj.foo.bar.getter',
+      'obj..foo.bar.setter = 0': 'obj.foo.bar.setter = 0',
+    };
+
+    for (var entry in pairs.entries) {
+      assertSingle(
+        input: entry.key,
+        expected: entry.value,
+      );
+    }
+  }
+
+  FindNode _parseStringToFindNode(String content) {
+    var parseResult = parseString(
+      content: content,
+      featureSet: FeatureSet.latestLanguageVersion(),
+    );
+    return FindNode(parseResult.content, parseResult.unit);
+  }
+}
diff --git a/pkg/analyzer/test/src/clients/dart_style/test_all.dart b/pkg/analyzer/test/src/clients/dart_style/test_all.dart
new file mode 100644
index 0000000..d5179bd
--- /dev/null
+++ b/pkg/analyzer/test/src/clients/dart_style/test_all.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'rewrite_cascade_test.dart' as rewrite_cascade;
+
+main() {
+  defineReflectiveSuite(() {
+    rewrite_cascade.main();
+  }, name: 'dart_style');
+}
diff --git a/pkg/analyzer/test/src/clients/test_all.dart b/pkg/analyzer/test/src/clients/test_all.dart
new file mode 100644
index 0000000..5118a6b
--- /dev/null
+++ b/pkg/analyzer/test/src/clients/test_all.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'dart_style/test_all.dart' as dart_style;
+
+main() {
+  defineReflectiveSuite(() {
+    dart_style.main();
+  }, name: 'clients');
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 7f3d1cb..b6c9542 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -153,13 +153,10 @@
   void tearDown() {}
 }
 
-class _GeneratedUriResolverMock implements UriResolver {
+class _GeneratedUriResolverMock extends UriResolver {
   Source? Function(Uri)? resolveAbsoluteFunction;
 
-  Uri? Function(Source)? restoreAbsoluteFunction;
-
-  @override
-  void clearCache() {}
+  Uri? Function(String)? pathToUriFunction;
 
   @override
   noSuchMethod(Invocation invocation) {
@@ -167,17 +164,14 @@
   }
 
   @override
-  Source? resolveAbsolute(Uri uri) {
-    if (resolveAbsoluteFunction != null) {
-      return resolveAbsoluteFunction!(uri);
-    }
-    return null;
+  Uri? pathToUri(String path) {
+    return pathToUriFunction?.call(path);
   }
 
   @override
-  Uri? restoreAbsolute(Source source) {
-    if (restoreAbsoluteFunction != null) {
-      return restoreAbsoluteFunction!(source);
+  Source? resolveAbsolute(Uri uri) {
+    if (resolveAbsoluteFunction != null) {
+      return resolveAbsoluteFunction!(uri);
     }
     return null;
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
index 58450c4..cabe570 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/error/lint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -25,6 +25,38 @@
     return driver.test.libraryContextTestView.linkedCycles;
   }
 
+  test_analysisOptions_strictCasts() async {
+    useEmptyByteStore();
+
+    // Configure `strict-casts: false`.
+    writeTestPackageAnalysisOptionsFile(
+      AnalysisOptionsFileConfig(
+        strictCasts: false,
+      ),
+    );
+
+    newFile(testFilePath, content: r'''
+dynamic a = 0;
+int b = a;
+''');
+
+    // `strict-cast: false`, so no errors.
+    assertErrorsInList(await _computeTestFileErrors(), []);
+
+    // Configure `strict-casts: true`.
+    disposeAnalysisContextCollection();
+    writeTestPackageAnalysisOptionsFile(
+      AnalysisOptionsFileConfig(
+        strictCasts: true,
+      ),
+    );
+
+    // `strict-cast: true`, so has errors.
+    assertErrorsInList(await _computeTestFileErrors(), [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 23, 1),
+    ]);
+  }
+
   test_change_factoryConstructor_addEqNothing() async {
     await resolveTestCode(r'''
 class A {
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 65e9392..d9bdc60 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -51,7 +51,7 @@
       TypeArgumentList argumentList, List<DartType> expectedTypes) {
     expect(argumentList.arguments, hasLength(expectedTypes.length));
     for (int i = 0; i < expectedTypes.length; i++) {
-      _assertTypeNameSimple(argumentList.arguments[i], expectedTypes[i]);
+      _assertNamedTypeSimple(argumentList.arguments[i], expectedTypes[i]);
     }
   }
 
@@ -1804,11 +1804,11 @@
       expect(type.parameters[0].type, typeProvider.intType);
     }
 
-    _assertTypeNameSimple(p.returnType!, typeProvider.stringType);
+    _assertNamedTypeSimple(p.returnType!, typeProvider.stringType);
 
     {
       var a = p.parameters.parameters[0] as SimpleFormalParameter;
-      _assertTypeNameSimple(a.type!, typeProvider.intType);
+      _assertNamedTypeSimple(a.type!, typeProvider.intType);
       expect(a.identifier!.staticType, isNull);
     }
   }
@@ -1850,11 +1850,11 @@
       expect(type.parameters[0].type, typeProvider.intType);
     }
 
-    _assertTypeNameSimple(p.type!, typeProvider.stringType);
+    _assertNamedTypeSimple(p.type!, typeProvider.stringType);
 
     {
       var a = p.parameters!.parameters[0] as SimpleFormalParameter;
-      _assertTypeNameSimple(a.type!, typeProvider.intType);
+      _assertNamedTypeSimple(a.type!, typeProvider.intType);
       expect(a.identifier!.staticType, isNull);
     }
   }
@@ -1912,7 +1912,7 @@
     expect(parameterElement.field, same(fElement));
 
     var parameterNode = parameters[0] as FieldFormalParameter;
-    _assertTypeNameSimple(parameterNode.type!, typeProvider.intType);
+    _assertNamedTypeSimple(parameterNode.type!, typeProvider.intType);
     expect(parameterNode.declaredElement, same(parameterElement));
 
     expect(parameterNode.identifier.staticElement, same(parameterElement));
@@ -1980,7 +1980,7 @@
 
     List<TypeAnnotation> typeArguments = invocation.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
-    _assertTypeNameSimple(typeArguments[0], typeProvider.stringType);
+    _assertNamedTypeSimple(typeArguments[0], typeProvider.stringType);
   }
 
   test_functionExpressionInvocation_namedArgument() async {
@@ -2307,7 +2307,7 @@
 
       NamedType namedType = constructorName.type2;
       expect(namedType.typeArguments!.arguments, hasLength(1));
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
       var typeIdentifier = namedType.name as PrefixedIdentifier;
@@ -2384,7 +2384,7 @@
 
       NamedType namedType = constructorName.type2;
       expect(namedType.typeArguments!.arguments, hasLength(1));
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
       var typeIdentifier = namedType.name as SimpleIdentifier;
@@ -2432,7 +2432,7 @@
 
       NamedType namedType = constructorName.type2;
       expect(namedType.typeArguments!.arguments, hasLength(1));
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
       var typeIdentifier = namedType.name as SimpleIdentifier;
@@ -4906,10 +4906,10 @@
     LocalVariableElement vElement = vNode.declaredElement!;
     expect(vElement.type, typeProvider.numType);
 
-    var vTypeName = vNode.type as NamedType;
-    expect(vTypeName.type, typeProvider.numType);
+    var vNamedType = vNode.type as NamedType;
+    expect(vNamedType.type, typeProvider.numType);
 
-    var vTypeIdentifier = vTypeName.name as SimpleIdentifier;
+    var vTypeIdentifier = vNamedType.name as SimpleIdentifier;
     expect(vTypeIdentifier.staticElement, typeProvider.numType.element);
     expect(vTypeIdentifier.staticType, isNull);
 
@@ -7439,7 +7439,7 @@
       expect(bElement.type, typeProvider.doubleType);
 
       var namedType = bDeclaration.variables.type as NamedType;
-      _assertTypeNameSimple(namedType, typeProvider.doubleType);
+      _assertNamedTypeSimple(namedType, typeProvider.doubleType);
 
       expect(bNode.name.staticElement, same(bElement));
       expect(bNode.name.staticType, isNull);
@@ -7579,7 +7579,7 @@
     expect(aliasElement, same(findElement.typeAlias('F')));
     expect(function.returnType, typeProvider.intType);
 
-    _assertTypeNameSimple(alias.returnType as NamedType, typeProvider.intType);
+    _assertNamedTypeSimple(alias.returnType as NamedType, typeProvider.intType);
 
     _assertSimpleParameter(
         alias.parameters.parameters[0] as SimpleFormalParameter,
@@ -7645,10 +7645,10 @@
       expect(listIdentifier.staticElement, same(listElement));
       expect(listIdentifier.staticType, isNull);
 
-      var aTypeName = bound.typeArguments!.arguments[0] as NamedType;
-      expect(aTypeName.type, interfaceTypeNone(aElement));
+      var aNamedType = bound.typeArguments!.arguments[0] as NamedType;
+      expect(aNamedType.type, interfaceTypeNone(aElement));
 
-      var aIdentifier = aTypeName.name as SimpleIdentifier;
+      var aIdentifier = aNamedType.name as SimpleIdentifier;
       expect(aIdentifier.staticElement, same(aElement));
       expect(aIdentifier.staticType, isNull);
     }
@@ -7717,7 +7717,7 @@
     {
       var statement = statements[1] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           catchClause.exceptionType as NamedType, typeProvider.intType);
 
       var exceptionNode = catchClause.exceptionParameter as SimpleIdentifier;
@@ -7760,7 +7760,7 @@
     {
       var statement = statements[3] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(catchClause.exceptionType!, typeProvider.intType);
+      _assertNamedTypeSimple(catchClause.exceptionType!, typeProvider.intType);
       expect(catchClause.stackTraceParameter, isNull);
 
       var exceptionNode = catchClause.exceptionParameter as SimpleIdentifier;
@@ -7773,7 +7773,7 @@
     {
       var statement = statements[4] as TryStatement;
       CatchClause catchClause = statement.catchClauses[0];
-      _assertTypeNameSimple(
+      _assertNamedTypeSimple(
           catchClause.exceptionType as NamedType, typeProvider.intType);
       expect(catchClause.exceptionParameter, isNull);
       expect(catchClause.stackTraceParameter, isNull);
@@ -7821,7 +7821,7 @@
 
     List<TypeAnnotation> typeArguments = namedType.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
-    _assertTypeNameSimple(typeArguments[0], typeProvider.intType);
+    _assertNamedTypeSimple(typeArguments[0], typeProvider.intType);
   }
 
   test_type_void() async {
@@ -8657,6 +8657,15 @@
     }
   }
 
+  void _assertNamedTypeSimple(TypeAnnotation namedType, DartType type) {
+    namedType as NamedType;
+    expect(namedType.type, type);
+
+    var identifier = namedType.name as SimpleIdentifier;
+    expect(identifier.staticElement, same(type.element));
+    expect(identifier.staticType, isNull);
+  }
+
   void _assertParameterElement(ParameterElement element,
       {String? name, int? offset, ParameterKind? kind, DartType? type}) {
     expect(element, isNotNull);
@@ -8688,15 +8697,6 @@
     }
   }
 
-  void _assertTypeNameSimple(TypeAnnotation namedType, DartType type) {
-    namedType as NamedType;
-    expect(namedType.type, type);
-
-    var identifier = namedType.name as SimpleIdentifier;
-    expect(identifier.staticElement, same(type.element));
-    expect(identifier.staticType, isNull);
-  }
-
   List<Statement> _getMainStatements(ResolvedUnitResult result) {
     for (var declaration in result.unit.declarations) {
       if (declaration is FunctionDeclaration &&
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index de37c97..cb4869d 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -28,12 +28,14 @@
 
 import '../../../util/element_type_matchers.dart';
 import '../../../utils.dart';
+import '../resolution/context_collection_resolution.dart';
 import 'base.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisDriverSchedulerTest);
     defineReflectiveTests(AnalysisDriverTest);
+    defineReflectiveTests(AnalysisDriver_BazelWorkspaceTest);
   });
 }
 
@@ -50,6 +52,56 @@
 }
 
 @reflectiveTest
+class AnalysisDriver_BazelWorkspaceTest extends BazelWorkspaceResolutionTest {
+  void test_nestedLib_notCanonicalUri() async {
+    var outerLibPath = '$workspaceRootPath/my/outer/lib';
+
+    var innerPath = convertPath('$outerLibPath/inner/lib/b.dart');
+    var innerUri = Uri.parse('package:my.outer.lib.inner/b.dart');
+    newFile(innerPath, content: 'class B {}');
+
+    var analysisSession = contextFor(innerPath).currentSession;
+
+    void assertInnerUri(ResolvedUnitResult result) {
+      var innerLibrary = result.libraryElement.importedLibraries
+          .where((e) => e.source.fullName == innerPath)
+          .single;
+      expect(innerLibrary.source.uri, innerUri);
+    }
+
+    // Reference "inner" using a non-canonical URI.
+    {
+      var a = newFile(convertPath('$outerLibPath/a.dart'), content: r'''
+import 'inner/lib/b.dart';
+''');
+      var result = await analysisSession.getResolvedUnit(a.path);
+      result as ResolvedUnitResult;
+      assertInnerUri(result);
+    }
+
+    // Reference "inner" using the canonical URI, via relative.
+    {
+      var c = newFile('$outerLibPath/inner/lib/c.dart', content: r'''
+import 'b.dart';
+''');
+      var result = await analysisSession.getResolvedUnit(c.path);
+      result as ResolvedUnitResult;
+      assertInnerUri(result);
+    }
+
+    // Reference "inner" using the canonical URI, via absolute.
+    {
+      var d = newFile('$outerLibPath/inner/lib/d.dart', content: '''
+import '$innerUri';
+''');
+      var result = await analysisSession.getResolvedUnit(d.path);
+      result as ResolvedUnitResult;
+      assertInnerUri(result);
+    }
+  }
+}
+
+@reflectiveTest
 class AnalysisDriverSchedulerTest with ResourceProviderMixin {
   final ByteStore byteStore = MemoryByteStore();
 
@@ -1246,8 +1298,7 @@
     Source generatedSource = _SourceMock(generatedPath, uri);
 
     generatedUriResolver.resolveAbsoluteFunction = (uri) => generatedSource;
-    generatedUriResolver.restoreAbsoluteFunction = (Source source) {
-      String path = source.fullName;
+    generatedUriResolver.pathToUriFunction = (path) {
       if (path == templatePath || path == generatedPath) {
         return uri;
       } else {
@@ -1952,16 +2003,13 @@
       expect(result.errors, isEmpty);
     }
 
-    // Analysis of my_pkg/bin/b.dart produces the error "A value of type
-    // 'String' can't be assigned to a variable of type 'int'", because
-    // file:///my_pkg/bin/b.dart imports file:///my_pkg/lib/c.dart, which
-    // successfully imports file:///my_pkg/test/d.dart, causing y to have an
-    // inferred type of String.
+    // Analysis of my_pkg/bin/a.dart produces no error because
+    // the import `../lib/c.dart` is resolved to package:my_pkg/c.dart, and
+    // package:my_pkg/c.dart's import is erroneous, causing y's reference to z
+    // to be unresolved (and therefore have type dynamic).
     {
       ResolvedUnitResult result = await driver.getResultValid(b);
-      List<AnalysisError> errors = result.errors;
-      expect(errors, hasLength(1));
-      expect(errors[0].errorCode, CompileTimeErrorCode.INVALID_ASSIGNMENT);
+      expect(result.errors, isEmpty);
     }
   }
 
@@ -2028,8 +2076,10 @@
 
     {
       ResolvedUnitResult result = await driver.getResultValid(b);
-      expect(_getImportSource(result.unit, 0).uri.toString(),
-          'package:test/a.dart');
+      expect(
+        _getImportSource(result.unit, 0).uri,
+        Uri.parse('package:test/a.dart'),
+      );
       _assertTopLevelVarType(result.unit, 'VB', 'A<int>');
     }
 
@@ -2037,7 +2087,7 @@
       ResolvedUnitResult result = await driver.getResultValid(c);
       expect(
         _getImportSource(result.unit, 0).uri,
-        toUri('/test/lib/a.dart'),
+        Uri.parse('package:test/a.dart'),
       );
       _assertTopLevelVarType(result.unit, 'VC', 'A<double>');
     }
@@ -2924,6 +2974,24 @@
     expect(result.unit, isNotNull);
   }
 
+  test_removeFile_addFile_results() async {
+    var a = convertPath('/test/lib/a.dart');
+    newFile(a, content: 'class A {}');
+
+    driver.addFile(a);
+
+    await waitForIdleWithoutExceptions();
+    expect(allResults.map((e) => e.path).toSet(), {a});
+    allResults.clear();
+
+    driver.removeFile(a);
+    driver.addFile(a);
+
+    // a.dart should be produced again
+    await waitForIdleWithoutExceptions();
+    expect(allResults.map((e) => e.path).toSet(), {a});
+  }
+
   test_removeFile_changeFile_implicitlyAnalyzed() async {
     var a = convertPath('/test/lib/a.dart');
     var b = convertPath('/test/lib/b.dart');
@@ -3357,10 +3425,6 @@
 }
 
 extension on AnalysisDriver {
-  FileResult getFileSyncValid(String path) {
-    return getFileSync(path) as FileResult;
-  }
-
   Set<String> get loadedLibraryUriSet {
     var elementFactory = this.test.libraryContext!.elementFactory;
     var libraryReferences = elementFactory.rootReference.children;
@@ -3382,11 +3446,15 @@
     }
   }
 
-  Future<ResolvedUnitResult> getResultValid(String path) async {
-    return await getResult(path) as ResolvedUnitResult;
+  FileResult getFileSyncValid(String path) {
+    return getFileSync(path) as FileResult;
   }
 
   Future<LibraryElementResult> getLibraryByUriValid(String uriStr) async {
     return await getLibraryByUri(uriStr) as LibraryElementResult;
   }
+
+  Future<ResolvedUnitResult> getResultValid(String path) async {
+    return await getResult(path) as ResolvedUnitResult;
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/experiments_test.dart b/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
index f808c64..5eed0e1 100644
--- a/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
@@ -30,11 +30,6 @@
     expect('${actual.major}.${actual.minor}', expectedStr);
   }
 
-  ExperimentStatus fromStrings(List<String> flags) {
-    return overrideKnownFeatures(
-        knownFeatures, () => ExperimentStatus.fromStrings(flags));
-  }
-
   ExperimentStatus fromStrings2({
     required Version sdkLanguageVersion,
     required List<String> flags,
@@ -473,193 +468,6 @@
     expect(getFlags(status), [false, true]);
   }
 
-  test_fromStrings_conflicting_flags_disable_then_enable() {
-    // Enable takes precedence because it's last
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: false,
-      isExpired: false,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: null,
-    );
-    var status = fromStrings(['no-a', 'a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [true]);
-  }
-
-  test_fromStrings_conflicting_flags_enable_then_disable() {
-    // Disable takes precedence because it's last
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: false,
-      isExpired: false,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: null,
-    );
-    var status = fromStrings(['a', 'no-a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [false]);
-  }
-
-  test_fromStrings_default_values() {
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: false,
-      isExpired: false,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: null,
-    );
-    knownFeatures['b'] = ExperimentalFeature(
-      index: 1,
-      enableString: 'b',
-      isEnabledByDefault: true,
-      isExpired: false,
-      documentation: 'b',
-      experimentalReleaseVersion: null,
-      releaseVersion: Version.parse('1.0.0'),
-    );
-    var status = fromStrings([]);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [false, true]);
-  }
-
-  test_fromStrings_disable_disabled_feature() {
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: false,
-      isExpired: false,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: null,
-    );
-    var status = fromStrings(['no-a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [false]);
-  }
-
-  test_fromStrings_disable_enabled_feature() {
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: true,
-      isExpired: false,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: Version.parse('1.0.0'),
-    );
-    var status = fromStrings(['no-a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [false]);
-  }
-
-  test_fromStrings_enable_disabled_feature() {
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: false,
-      isExpired: false,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: null,
-    );
-    var status = fromStrings(['a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [true]);
-  }
-
-  test_fromStrings_enable_enabled_feature() {
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: true,
-      isExpired: false,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: Version.parse('1.0.0'),
-    );
-    var status = fromStrings(['a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [true]);
-  }
-
-  test_fromStrings_illegal_use_of_expired_flag_disable() {
-    // Expired flags are ignored even if they would fail validation.
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: true,
-      isExpired: true,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: Version.parse('1.0.0'),
-    );
-    var status = fromStrings(['no-a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [true]);
-  }
-
-  test_fromStrings_illegal_use_of_expired_flag_enable() {
-    // Expired flags are ignored even if they would fail validation.
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: false,
-      isExpired: true,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: null,
-    );
-    var status = fromStrings(['a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [false]);
-  }
-
-  test_fromStrings_unnecessary_use_of_expired_flag_disable() {
-    // Expired flags are ignored.
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: false,
-      isExpired: true,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: null,
-    );
-    var status = fromStrings(['no-a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [false]);
-  }
-
-  test_fromStrings_unnecessary_use_of_expired_flag_enable() {
-    // Expired flags are ignored.
-    knownFeatures['a'] = ExperimentalFeature(
-      index: 0,
-      enableString: 'a',
-      isEnabledByDefault: true,
-      isExpired: true,
-      documentation: 'a',
-      experimentalReleaseVersion: null,
-      releaseVersion: Version.parse('1.0.0'),
-    );
-    var status = fromStrings(['a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), [true]);
-  }
-
-  test_fromStrings_unrecognized_flag() {
-    // Unrecognized flags are ignored.
-    var status = fromStrings(['a']);
-    assertCurrentSdkLanguageVersion(status);
-    expect(getFlags(status), <Object>[]);
-  }
-
   test_validateFlagCombination_disable_then_enable() {
     knownFeatures['a'] = ExperimentalFeature(
       index: 0,
diff --git a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
index dfcbe51..0f485b1 100644
--- a/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/feature_set_provider_test.dart
@@ -446,9 +446,7 @@
 
   FeatureSet _getPathFeatureSet(String path) {
     path = convertPath(path);
-    var fileUri = toUri(path);
-    var fileSource = sourceFactory.forUri2(fileUri)!;
-    var uri = sourceFactory.restoreUri(fileSource)!;
+    var uri = sourceFactory.pathToUri(path)!;
     return provider.getFeatureSet(path, uri);
   }
 
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 b298989..539ff59 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -30,13 +30,91 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../resolution/context_collection_resolution.dart';
+
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FileSystemStateTest);
+    defineReflectiveTests(FileSystemState_BazelWorkspaceTest);
   });
 }
 
 @reflectiveTest
+class FileSystemState_BazelWorkspaceTest extends BazelWorkspaceResolutionTest {
+  void test_getFileForUri_hasGenerated_askGeneratedFirst() async {
+    var relPath = 'dart/my/test/a.dart';
+    var writablePath = convertPath('$workspaceRootPath/$relPath');
+    var generatedPath = convertPath('$workspaceRootPath/bazel-bin/$relPath');
+
+    // This generated file should be used instead of the writable.
+    newFile(generatedPath);
+
+    var analysisDriver = driverFor(convertPath(testFilePath));
+
+    var fsState = analysisDriver.fsState;
+
+    // The file is the generated file.
+    var generatedUri = toUri(generatedPath);
+    var generatedFile = fsState.getFileForUri(generatedUri).t1!;
+    expect(generatedFile.uri, generatedUri);
+    expect(generatedFile.path, generatedPath);
+
+    // The file is cached under the requested URI.
+    var writableUri = toUri(writablePath);
+    var writableFile1 = fsState.getFileForUri(writableUri).t1!;
+    var writableFile2 = fsState.getFileForUri(writableUri).t1!;
+    expect(writableFile1, same(generatedFile));
+    expect(writableFile2, same(generatedFile));
+  }
+
+  void test_getFileForUri_hasGenerated_askWritableFirst() async {
+    var relPath = 'dart/my/test/a.dart';
+    var writablePath = convertPath('$workspaceRootPath/$relPath');
+    var generatedPath = convertPath('$workspaceRootPath/bazel-bin/$relPath');
+
+    // This generated file should be used instead of the writable.
+    newFile(generatedPath);
+
+    var analysisDriver = driverFor(convertPath(testFilePath));
+
+    var fsState = analysisDriver.fsState;
+
+    // The file is cached under the requested URI.
+    var writableUri = toUri(writablePath);
+    var writableFile1 = fsState.getFileForUri(writableUri).t1!;
+    var writableFile2 = fsState.getFileForUri(writableUri).t1!;
+    expect(writableFile2, same(writableFile1));
+
+    // The file is the generated file.
+    var generatedUri = toUri(generatedPath);
+    var generatedFile = fsState.getFileForUri(generatedUri).t1!;
+    expect(generatedFile.uri, generatedUri);
+    expect(generatedFile.path, generatedPath);
+    expect(writableFile2, same(generatedFile));
+  }
+
+  void test_getFileForUri_nestedLib_notCanonicalUri() async {
+    var outerPath = convertPath('$workspaceRootPath/my/outer/lib/a.dart');
+    var outerUri = Uri.parse('package:my.outer/a.dart');
+
+    var innerPath = convertPath('/workspace/my/outer/lib/inner/lib/b.dart');
+    var innerUri = Uri.parse('package:my.outer.lib.inner/b.dart');
+
+    var analysisDriver = driverFor(outerPath);
+    var fsState = analysisDriver.fsState;
+
+    // User code might use such relative URI.
+    var innerUri2 = outerUri.resolve('inner/lib/b.dart');
+    expect(innerUri2, Uri.parse('package:my.outer/inner/lib/b.dart'));
+
+    // However the returned file must use the canonical URI.
+    var innerFile = fsState.getFileForUri(innerUri2).t1!;
+    expect(innerFile.path, innerPath);
+    expect(innerFile.uri, innerUri);
+  }
+}
+
+@reflectiveTest
 class FileSystemStateTest with ResourceProviderMixin {
   final ByteStore byteStore = MemoryByteStore();
   final FileContentOverlay contentOverlay = FileContentOverlay();
@@ -268,8 +346,6 @@
     expect(file.libraryFiles, [file, file.partedFiles[0]]);
 
     expect(_excludeSdk(file.directReferencedFiles), hasLength(5));
-
-    expect(fileSystemState.getFilesForPath(a1), [file]);
   }
 
   test_getFileForPath_onlyDartFiles() {
@@ -363,27 +439,6 @@
     );
   }
 
-  test_getFileForUri_packageVsFileUri() {
-    String path = convertPath('/aaa/lib/a.dart');
-    var packageUri = Uri.parse('package:aaa/a.dart');
-    var fileUri = toUri(path);
-
-    // The files with `package:` and `file:` URIs are different.
-    var filePackageUri = fileSystemState.getFileForUri(packageUri).asFileState;
-    var fileFileUri = fileSystemState.getFileForUri(fileUri).asFileState;
-    expect(filePackageUri, isNot(same(fileFileUri)));
-
-    expect(filePackageUri.path, path);
-    expect(filePackageUri.uri, packageUri);
-
-    expect(fileFileUri.path, path);
-    expect(fileFileUri.uri, fileUri);
-
-    // The file with the `package:` style URI is canonical, and is the first.
-    var files = fileSystemState.getFilesForPath(path);
-    expect(files, [filePackageUri, fileFileUri]);
-  }
-
   test_getFilesSubtypingName() {
     String a = convertPath('/a.dart');
     String b = convertPath('/b.dart');
@@ -742,10 +797,10 @@
   }
 }
 
-class _GeneratedUriResolverMock implements UriResolver {
+class _GeneratedUriResolverMock extends UriResolver {
   Source? Function(Uri)? resolveAbsoluteFunction;
 
-  Uri? Function(Source)? restoreAbsoluteFunction;
+  Uri? Function(String)? pathToUriFunction;
 
   @override
   noSuchMethod(Invocation invocation) {
@@ -753,17 +808,14 @@
   }
 
   @override
-  Source? resolveAbsolute(Uri uri) {
-    if (resolveAbsoluteFunction != null) {
-      return resolveAbsoluteFunction!(uri);
-    }
-    return null;
+  Uri? pathToUri(String path) {
+    return pathToUriFunction?.call(path);
   }
 
   @override
-  Uri? restoreAbsolute(Source source) {
-    if (restoreAbsoluteFunction != null) {
-      return restoreAbsoluteFunction!(source);
+  Source? resolveAbsolute(Uri uri) {
+    if (resolveAbsoluteFunction != null) {
+      return resolveAbsoluteFunction!(uri);
     }
     return null;
   }
@@ -784,11 +836,13 @@
   }
 }
 
-extension on Either2<FileState?, ExternalLibrary> {
-  FileState get asFileState {
-    return map(
-      (file) => file!,
-      (_) => fail('Expected a file'),
+extension _Either2Extension<T1, T2> on Either2<T1, T2> {
+  T1 get t1 {
+    late T1 result;
+    map(
+      (t1) => result = t1,
+      (_) => throw 'Expected T1',
     );
+    return result;
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index cecd83d..29798f2 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -1155,6 +1155,18 @@
     assertThat(element)..isReferencedAt('test: 0', true);
   }
 
+  test_isReferencedBy_ParameterElement_optionalNamed_ofTopFunction_anywhere() async {
+    await _indexTestUnit('''
+void foo(int a, int b, {int? test}) {}
+
+void() {
+  foo(1, test: 0, 2);
+}
+''');
+    Element element = findElement.parameter('test');
+    assertThat(element)..isReferencedAt('test: 0', true);
+  }
+
   test_isReferencedBy_ParameterElement_optionalPositional() async {
     await _indexTestUnit('''
 foo([p]) {
diff --git a/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
new file mode 100644
index 0000000..e241371
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
@@ -0,0 +1,546 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/results.dart';
+import 'package:analyzer/src/util/performance/operation_performance.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ResolveForCompletionTest);
+  });
+}
+
+@reflectiveTest
+class ResolveForCompletionTest extends PubPackageResolutionTest {
+  AnalysisDriver get testDriver {
+    return driverFor(testFilePathPlatform);
+  }
+
+  String get testFilePathPlatform => convertPath(testFilePath);
+
+  test_class__fieldDeclaration_type_namedType_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  var f1 = 0;
+  doub^ f2 = null;
+  var f3 = 1;
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class__fieldDeclaration_type_namedType_typeArgument_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  var f1 = 0;
+  List<doub^>? f2 = null;
+  var f3 = 1;
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_extends_name() async {
+    var result = _resolveTestCode(r'''
+class A extends foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_fieldDeclaration_initializer() async {
+    var result = _resolveTestCode(r'''
+class A {
+  var f1 = 0;
+  var f2 = foo^;
+  var f3 = 1;
+}
+''');
+
+    result.assertResolvedNodes([
+      'var f2 = foo;',
+    ]);
+  }
+
+  test_class_implements_name() async {
+    var result = _resolveTestCode(r'''
+class A implements foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_methodDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+class A {}
+
+class B {
+  void foo1() {}
+
+  void foo2() {
+    print(0);
+    bar^;
+    print(1);
+  }
+
+  void foo3() {}
+}
+''');
+
+    result.assertResolvedNodes([
+      'void foo2() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_class_methodDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  void foo^() {
+    print(0);
+  }
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_methodDeclaration_returnType_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  doub^ foo() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_class_with_name() async {
+    var result = _resolveTestCode(r'''
+class A with foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_constructorDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+class A {}
+
+class B {
+  void foo1() {}
+
+  B() {
+    print(0);
+    bar^;
+    print(1);
+  }
+
+  void foo2() {}
+}
+''');
+
+    result.assertResolvedNodes([
+      'B() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_constructorDeclaration_fieldInitializer_name() async {
+    var result = _resolveTestCode(r'''
+class A {}
+
+class B {
+  var f;
+
+  void foo1() {}
+
+  B(int a) : bar^ = 0 {
+    print(0);
+  }
+
+  void foo2() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_constructorDeclaration_fieldInitializer_value() async {
+    var result = _resolveTestCode(r'''
+class A {
+  var f;
+
+  A(int a) : f = a + bar^ {
+    print(0);
+  }
+}
+''');
+
+    // TODO(scheglov) Resolve only the initializer.
+    result.assertResolvedNodes([
+      'A(int a) : f = a + bar {print(0);}',
+    ]);
+  }
+
+  test_constructorDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  A.foo^() {
+    print(0);
+  }
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_doubleLiteral() async {
+    var result = _resolveTestCode(r'''
+var v = 1.2^;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_extension_methodDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+extension E on int {
+  void foo1() {}
+
+  void foo2() {
+    print(0);
+    bar^;
+    print(1);
+  }
+
+  void foo3() {}
+}
+''');
+
+    result.assertResolvedNodes([
+      'void foo2() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_extension_methodDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+extension E on int {
+  void foo^() {
+    print(0);
+  }
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_extension_methodDeclaration_returnType_name() async {
+    var result = _resolveTestCode(r'''
+extension E on int {
+  doub^ foo() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_extension_on_name() async {
+    var result = _resolveTestCode(r'''
+extension E on int^ {
+  void foo() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_functionDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+void foo1() {}
+
+void foo2() {
+  print(0);
+  bar^;
+  print(1);
+}
+
+void foo3() {}
+''');
+
+    result.assertResolvedNodes([
+      'void foo2() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_functionDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+void foo^() {
+  print(0);
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_functionDeclaration_returnType_name() async {
+    var result = _resolveTestCode(r'''
+doub^ f() {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_importDirective_show_name() async {
+    var result = _resolveTestCode(r'''
+import 'dart:async';
+import 'dart:math' show ^;
+import 'dart:io';
+''');
+
+    result.assertResolvedNodes([
+      "import 'dart:math' show ;",
+    ]);
+  }
+
+  test_importDirective_uri() async {
+    var result = _resolveTestCode(r'''
+import 'dart:async';
+import 'dart:ma^'
+import 'dart:io';
+''');
+
+    result.assertResolvedNodes([
+      "import 'dart:ma';",
+    ]);
+  }
+
+  test_integerLiteral() async {
+    var result = _resolveTestCode(r'''
+var v = 0^;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_localVariableDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+void f() {
+  var foo^
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_localVariableDeclaration_type_name() async {
+    var result = _resolveTestCode(r'''
+void f() {
+  doub^ a;
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_mixin_implements_name() async {
+    var result = _resolveTestCode(r'''
+mixin M implements foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_mixin_methodDeclaration_body() async {
+    var result = _resolveTestCode(r'''
+class A {}
+
+mixin M {
+  void foo1() {}
+
+  void foo2() {
+    print(0);
+    bar^;
+    print(1);
+  }
+
+  void foo3() {}
+}
+''');
+
+    result.assertResolvedNodes([
+      'void foo2() {print(0); bar; print(1);}',
+    ]);
+  }
+
+  test_mixin_methodDeclaration_name() async {
+    var result = _resolveTestCode(r'''
+mixin M {
+  void foo^() {
+    print(0);
+  }
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_mixin_methodDeclaration_returnType_name() async {
+    var result = _resolveTestCode(r'''
+mixin M {
+  doub^ foo() {}
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_mixin_on_name() async {
+    var result = _resolveTestCode(r'''
+mixin M on foo^ {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_processPendingChanges() async {
+    newFile(testFilePath, content: 'class A {}');
+
+    // Read the file.
+    testDriver.getFileSync(testFilePathPlatform);
+
+    // Should call `changeFile()`, and the driver must re-read the file.
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+var v2 = v1.^;
+''');
+
+    result.assertResolvedNodes([
+      'var v2 = v1.;',
+    ]);
+  }
+
+  test_simpleFormalParameter_name() async {
+    var result = _resolveTestCode(r'''
+void f(doub^) {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_simpleFormalParameter_type_name() async {
+    var result = _resolveTestCode(r'''
+void f(doub^ a) {}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_topLevelVariable_initializer() async {
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+var v2 = foo^;
+var v3 = 1;
+''');
+
+    result.assertResolvedNodes([
+      'var v2 = foo;',
+    ]);
+  }
+
+  test_topLevelVariable_name() async {
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+var v2^
+var v3 = 0;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_topLevelVariable_type_namedType_name() async {
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+doub^ v2 = null;
+var v3 = 1;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_topLevelVariable_type_namedType_typeArgument_name() async {
+    var result = _resolveTestCode(r'''
+var v1 = 0;
+List<doub^>? v2 = null;
+var v3 = 1;
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  test_typedef_name_nothing() async {
+    var result = _resolveTestCode(r'''
+typedef F^
+''');
+
+    _assertWholeUnitResolved(result);
+  }
+
+  test_typeParameter_name() async {
+    var result = _resolveTestCode(r'''
+void f<T^>() {
+  print(0);
+}
+''');
+
+    result.assertResolvedNodes([]);
+  }
+
+  int _newFileWithOffset(String path, String content) {
+    var offset = content.indexOf('^');
+    expect(offset, isNot(equals(-1)), reason: 'missing ^');
+
+    var nextOffset = content.indexOf('^', offset + 1);
+    expect(nextOffset, equals(-1), reason: 'too many ^');
+
+    var before = content.substring(0, offset);
+    var after = content.substring(offset + 1);
+    newFile(path, content: before + after);
+
+    return offset;
+  }
+
+  ResolvedForCompletionResultImpl _resolveTestCode(String content) {
+    var path = testFilePathPlatform;
+    var offset = _newFileWithOffset(path, content);
+    testDriver.changeFile(path);
+
+    var performance = OperationPerformanceImpl('<root>');
+    var result = testDriver.resolveForCompletion(
+      path: path,
+      offset: offset,
+      performance: performance,
+    );
+    return result!;
+  }
+
+  static void _assertWholeUnitResolved(
+    ResolvedForCompletionResultImpl result,
+  ) {
+    expect(result.resolvedNodes, [result.parsedUnit]);
+  }
+}
+
+extension ResolvedForCompletionResultImplExtension
+    on ResolvedForCompletionResultImpl {
+  void assertResolvedNodes(List<String> expected) {
+    var actual = resolvedNodes.map((e) => '$e').toList();
+    expect(actual, expected);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 700ec3d..91057d0 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -114,6 +114,259 @@
         unorderedEquals([a.methods[0], b.fields[0]]));
   }
 
+  test_declarations_class() async {
+    await resolveTestCode('''
+class C {
+  int f;
+  C();
+  C.named();
+  int get g => 0;
+  void set s(_) {}
+  void m() {}
+}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+    declarations.assertHas('C', DeclarationKind.CLASS,
+        offset: 6, codeOffset: 0, codeLength: 91);
+    declarations.assertHas('f', DeclarationKind.FIELD,
+        offset: 16, codeOffset: 12, codeLength: 5, className: 'C');
+    declarations.assertHas('named', DeclarationKind.CONSTRUCTOR,
+        offset: 30, codeOffset: 28, codeLength: 10, className: 'C');
+    declarations.assertHas('g', DeclarationKind.GETTER,
+        offset: 49, codeOffset: 41, codeLength: 15, className: 'C');
+    declarations.assertHas('s', DeclarationKind.SETTER,
+        offset: 68, codeOffset: 59, codeLength: 16, className: 'C');
+    declarations.assertHas('m', DeclarationKind.METHOD,
+        offset: 83, codeOffset: 78, codeLength: 11, className: 'C');
+  }
+
+  test_declarations_discover() async {
+    var aaaPackageRootPath = '$packagesRootPath/aaa';
+    var bbbPackageRootPath = '$packagesRootPath/bbb';
+    var cccPackageRootPath = '$packagesRootPath/ccc';
+    var aaaFilePath = convertPath('$aaaPackageRootPath/lib/a.dart');
+    var bbbFilePath = convertPath('$bbbPackageRootPath/lib/b.dart');
+    var cccFilePath = convertPath('$cccPackageRootPath/lib/c.dart');
+
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: aaaPackageRootPath)
+        ..add(name: 'bbb', rootPath: bbbPackageRootPath),
+    );
+
+    newFile(aaaFilePath, content: 'class A {}');
+    newFile(bbbFilePath, content: 'class B {}');
+    newFile(cccFilePath, content: 'class C {}');
+
+    await resolveTestCode('class T {}');
+
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    declarations.assertHas('T', DeclarationKind.CLASS);
+    declarations.assertHas('A', DeclarationKind.CLASS);
+    declarations.assertHas('B', DeclarationKind.CLASS);
+    declarations.assertNo('C');
+  }
+
+  test_declarations_enum() async {
+    await resolveTestCode('''
+enum E {
+  a, bb, ccc
+}
+''');
+
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    declarations.assertHas('E', DeclarationKind.ENUM,
+        offset: 5, codeOffset: 0, codeLength: 23);
+    declarations.assertHas('a', DeclarationKind.ENUM_CONSTANT,
+        offset: 11, codeOffset: 11, codeLength: 1);
+    declarations.assertHas('bb', DeclarationKind.ENUM_CONSTANT,
+        offset: 14, codeOffset: 14, codeLength: 2);
+    declarations.assertHas('ccc', DeclarationKind.ENUM_CONSTANT,
+        offset: 18, codeOffset: 18, codeLength: 3);
+  }
+
+  test_declarations_maxResults() async {
+    await resolveTestCode('''
+class A {}
+class B {}
+class C {}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, 2);
+    expect(results.declarations, hasLength(2));
+  }
+
+  test_declarations_mixin() async {
+    await resolveTestCode('''
+mixin M {
+  int f;
+  int get g => 0;
+  void set s(_) {}
+  void m() {}
+}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+    declarations.assertHas('M', DeclarationKind.MIXIN,
+        offset: 6, codeOffset: 0, codeLength: 71);
+    declarations.assertHas('f', DeclarationKind.FIELD,
+        offset: 16, codeOffset: 12, codeLength: 5, mixinName: 'M');
+    declarations.assertHas('g', DeclarationKind.GETTER,
+        offset: 29, codeOffset: 21, codeLength: 15, mixinName: 'M');
+    declarations.assertHas('s', DeclarationKind.SETTER,
+        offset: 48, codeOffset: 39, codeLength: 16, mixinName: 'M');
+    declarations.assertHas('m', DeclarationKind.METHOD,
+        offset: 63, codeOffset: 58, codeLength: 11, mixinName: 'M');
+  }
+
+  test_declarations_onlyForFile() async {
+    newFile('$testPackageLibPath/a.dart', content: 'class A {}');
+    var b = newFile('$testPackageLibPath/b.dart', content: 'class B {}').path;
+
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null, onlyForFile: b);
+    var declarations = results.declarations;
+
+    expect(results.files, [b]);
+
+    declarations.assertNo('A');
+    declarations.assertHas('B', DeclarationKind.CLASS);
+  }
+
+  test_declarations_parameters() async {
+    await resolveTestCode('''
+class C {
+  int get g => 0;
+  void m(int a, double b) {}
+}
+void f(bool a, String b) {}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    var declaration = declarations.assertHas('C', DeclarationKind.CLASS);
+    expect(declaration.parameters, isNull);
+
+    declaration =
+        declarations.assertHas('g', DeclarationKind.GETTER, className: 'C');
+    expect(declaration.parameters, isNull);
+
+    declaration =
+        declarations.assertHas('m', DeclarationKind.METHOD, className: 'C');
+    expect(declaration.parameters, '(int a, double b)');
+
+    declaration = declarations.assertHas('f', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(bool a, String b)');
+  }
+
+  test_declarations_parameters_functionTyped() async {
+    await resolveTestCode('''
+void f1(bool a(int b, String c)) {}
+void f2(a(b, c)) {}
+void f3(bool Function(int a, String b) c) {}
+void f4(bool Function(int, String) a) {}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    var declaration = declarations.assertHas('f1', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(bool Function(int, String) a)');
+
+    declaration = declarations.assertHas('f2', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(dynamic Function(dynamic, dynamic) a)');
+
+    declaration = declarations.assertHas('f3', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(bool Function(int, String) c)');
+
+    declaration = declarations.assertHas('f4', DeclarationKind.FUNCTION);
+    expect(declaration.parameters, '(bool Function(int, String) a)');
+  }
+
+  test_declarations_parameters_typeArguments() async {
+    await resolveTestCode('''
+class A<T, T2> {
+  void m1(Map<int, String> a) {}
+  void m2<U>(Map<T, U> a) {}
+  void m3<U1, U2>(Map<Map<T2, U2>, Map<U1, T>> a) {}
+}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    var declaration =
+        declarations.assertHas('m1', DeclarationKind.METHOD, className: 'A');
+    expect(declaration.parameters, '(Map<int, String> a)');
+
+    declaration =
+        declarations.assertHas('m2', DeclarationKind.METHOD, className: 'A');
+    expect(declaration.parameters, '(Map<T, U> a)');
+
+    declaration =
+        declarations.assertHas('m3', DeclarationKind.METHOD, className: 'A');
+    expect(declaration.parameters, '(Map<Map<T2, U2>, Map<U1, T>> a)');
+  }
+
+  test_declarations_regExp() async {
+    await resolveTestCode('''
+class A {}
+class B {}
+class C {}
+class D {}
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, RegExp(r'[A-C]'), null);
+    var declarations = results.declarations;
+
+    declarations.assertHas('A', DeclarationKind.CLASS);
+    declarations.assertHas('B', DeclarationKind.CLASS);
+    declarations.assertHas('C', DeclarationKind.CLASS);
+    declarations.assertNo('D');
+  }
+
+  test_declarations_top() async {
+    await resolveTestCode('''
+int get g => 0;
+void set s(_) {}
+void f(int p) {}
+int v;
+typedef void tf1();
+typedef tf2<T> = int Function<S>(T tp, S sp);
+''');
+    var results = WorkspaceSymbols();
+    await driver.search.declarations(results, null, null);
+    var declarations = results.declarations;
+
+    declarations.assertHas('g', DeclarationKind.GETTER,
+        offset: 8, codeOffset: 0, codeLength: 15);
+    declarations.assertHas('s', DeclarationKind.SETTER,
+        offset: 25, codeOffset: 16, codeLength: 16);
+    declarations.assertHas(
+      'f',
+      DeclarationKind.FUNCTION,
+      offset: 38,
+      codeOffset: 33,
+      codeLength: 16,
+    );
+    declarations.assertHas('v', DeclarationKind.VARIABLE,
+        offset: 54, codeOffset: 50, codeLength: 5);
+    declarations.assertHas('tf1', DeclarationKind.TYPE_ALIAS,
+        offset: 70, codeOffset: 57, codeLength: 19);
+    declarations.assertHas('tf2', DeclarationKind.TYPE_ALIAS,
+        offset: 85, codeOffset: 77, codeLength: 45);
+  }
+
   test_searchMemberReferences_qualified_resolved() async {
     await resolveTestCode('''
 class C {
@@ -1164,6 +1417,25 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_ParameterElement_optionalNamed_anywhere() async {
+    await resolveTestCode('''
+foo(int a, int b, {p}) {
+  p;
+}
+main() {
+  foo(0, p: 1, 2);
+}
+''');
+    var element = findElement.parameter('p');
+    var foo = findElement.function('foo');
+    var main = findElement.function('main');
+    var expected = [
+      _expectId(foo, SearchResultKind.READ, 'p;'),
+      _expectIdQ(main, SearchResultKind.REFERENCE, 'p: 1')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_ParameterElement_optionalPositional() async {
     await resolveTestCode('''
 foo([p]) {
@@ -2126,3 +2398,38 @@
     expect(matches, unorderedEquals(expectedMatches));
   }
 }
+
+extension on List<Declaration> {
+  Declaration assertHas(String name, DeclarationKind kind,
+      {int? offset,
+      int? codeOffset,
+      int? codeLength,
+      String? className,
+      String? mixinName}) {
+    for (var declaration in this) {
+      if (declaration.name == name &&
+          declaration.kind == kind &&
+          (offset == null || declaration.offset == offset) &&
+          (codeOffset == null || declaration.codeOffset == codeOffset) &&
+          (codeLength == null || declaration.codeLength == codeLength) &&
+          declaration.className == className &&
+          declaration.mixinName == mixinName) {
+        return declaration;
+      }
+    }
+    var actual =
+        map((d) => '(name=${d.name}, kind=${d.kind}, offset=${d.offset}, '
+            'codeOffset=${d.codeOffset}, codeLength=${d.codeLength}, '
+            'className=${d.className}, mixinName=${d.mixinName})').join('\n');
+    fail('Expected to find (name=$name, kind=$kind, offset=$offset, '
+        'codeOffset=$codeOffset, codeLength=$codeLength) in\n$actual');
+  }
+
+  void assertNo(String name) {
+    for (var declaration in this) {
+      if (declaration.name == name) {
+        fail('Unexpected declaration $name');
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 9512475..5a90033 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -641,40 +641,40 @@
 }
 
 extension on AnalysisSession {
-  Future<UnitElementResult> getUnitElementValid(String path) async {
-    return await getUnitElement(path) as UnitElementResult;
-  }
-
-  ParsedLibraryResult getParsedLibraryValid(String path) {
-    return getParsedLibrary(path) as ParsedLibraryResult;
+  Future<ErrorsResult> getErrorsValid(String path) async {
+    return await getErrors(path) as ErrorsResult;
   }
 
   FileResult getFileValid(String path) {
     return getFile(path) as FileResult;
   }
 
-  ParsedUnitResult getParsedUnitValid(String path) {
-    return getParsedUnit(path) as ParsedUnitResult;
-  }
-
-  Future<ResolvedLibraryResult> getResolvedLibraryValid(String path) async {
-    return await getResolvedLibrary(path) as ResolvedLibraryResult;
-  }
-
   Future<LibraryElementResult> getLibraryByUriValid(String path) async {
     return await getLibraryByUri(path) as LibraryElementResult;
   }
 
+  ParsedLibraryResult getParsedLibraryByElementValid(LibraryElement element) {
+    return getParsedLibraryByElement(element) as ParsedLibraryResult;
+  }
+
+  ParsedLibraryResult getParsedLibraryValid(String path) {
+    return getParsedLibrary(path) as ParsedLibraryResult;
+  }
+
+  ParsedUnitResult getParsedUnitValid(String path) {
+    return getParsedUnit(path) as ParsedUnitResult;
+  }
+
   Future<ResolvedLibraryResult> getResolvedLibraryByElementValid(
       LibraryElement element) async {
     return await getResolvedLibraryByElement(element) as ResolvedLibraryResult;
   }
 
-  ParsedLibraryResult getParsedLibraryByElementValid(LibraryElement element) {
-    return getParsedLibraryByElement(element) as ParsedLibraryResult;
+  Future<ResolvedLibraryResult> getResolvedLibraryValid(String path) async {
+    return await getResolvedLibrary(path) as ResolvedLibraryResult;
   }
 
-  Future<ErrorsResult> getErrorsValid(String path) async {
-    return await getErrors(path) as ErrorsResult;
+  Future<UnitElementResult> getUnitElementValid(String path) async {
+    return await getUnitElement(path) as UnitElementResult;
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index fbbd8d5..2c5030d 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -24,6 +24,7 @@
 import 'index_test.dart' as index;
 import 'mutex_test.dart' as mutex;
 import 'referenced_names_test.dart' as referenced_names;
+import 'resolve_for_completion_test.dart' as resolve_for_completion;
 import 'results/test_all.dart' as results;
 import 'search_test.dart' as search;
 import 'session_helper_test.dart' as session_helper;
@@ -53,6 +54,7 @@
     index.main();
     mutex.main();
     referenced_names.main();
+    resolve_for_completion.main();
     results.main();
     search.main();
     session.main();
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index 70b153a..082ba9d 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -2,25 +2,28 @@
 // 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/features.dart';
 import 'package:analyzer/dart/analysis/utilities.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/to_source_visitor.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ToSourceVisitor2Test);
+    defineReflectiveTests(ToSourceVisitorTest);
   });
 }
 
 @reflectiveTest
-class ToSourceVisitor2Test {
+class ToSourceVisitorTest {
   void test_visitAdjacentStrings() {
     _assertSource(
         "'a' 'b'",
@@ -46,7 +49,7 @@
         AstTestFactory.annotation2(AstTestFactory.identifier3("A"),
             AstTestFactory.identifier3("c"), AstTestFactory.argumentList(),
             typeArguments: AstTestFactory.typeArgumentList2(
-                [AstTestFactory.typeName4('T')])));
+                [AstTestFactory.namedType4('T')])));
   }
 
   void test_visitArgumentList() {
@@ -62,7 +65,7 @@
     _assertSource(
         "e as T",
         AstTestFactory.asExpression(
-            AstTestFactory.identifier3("e"), AstTestFactory.typeName4("T")));
+            AstTestFactory.identifier3("e"), AstTestFactory.namedType4("T")));
   }
 
   void test_visitAssertStatement() {
@@ -193,12 +196,12 @@
 
   void test_visitCatchClause_on() {
     _assertSource(
-        "on E {}", AstTestFactory.catchClause3(AstTestFactory.typeName4("E")));
+        "on E {}", AstTestFactory.catchClause3(AstTestFactory.namedType4("E")));
   }
 
   void test_visitCatchClause_on_catch() {
     _assertSource("on E catch (e) {}",
-        AstTestFactory.catchClause4(AstTestFactory.typeName4("E"), "e"));
+        AstTestFactory.catchClause4(AstTestFactory.namedType4("E"), "e"));
   }
 
   void test_visitClassDeclaration_abstract() {
@@ -208,6 +211,13 @@
             Keyword.ABSTRACT, "C", null, null, null, null));
   }
 
+  void test_visitClassDeclaration_abstractMacro() {
+    ClassDeclaration declaration = AstTestFactory.classDeclaration(
+        Keyword.ABSTRACT, "C", null, null, null, null,
+        isMacro: true);
+    _assertSource("abstract macro class C {}", declaration);
+  }
+
   void test_visitClassDeclaration_empty() {
     _assertSource("class C {}",
         AstTestFactory.classDeclaration(null, "C", null, null, null, null));
@@ -220,7 +230,7 @@
             null,
             "C",
             null,
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
             null,
             null));
   }
@@ -232,9 +242,9 @@
             null,
             "C",
             null,
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
             null,
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_extends_with() {
@@ -244,8 +254,8 @@
             null,
             "C",
             null,
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M")]),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M")]),
             null));
   }
 
@@ -256,27 +266,35 @@
             null,
             "C",
             null,
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_implements() {
     _assertSource(
         "class C implements B {}",
         AstTestFactory.classDeclaration(null, "C", null, null, null,
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
+  }
+
+  void test_visitClassDeclaration_macro() {
+    ClassDeclaration declaration = AstTestFactory.classDeclaration(
+        null, "C", null, null, null, null,
+        isMacro: true);
+    _assertSource("macro class C {}", declaration);
   }
 
   void test_visitClassDeclaration_multipleMember() {
     _assertSource(
         "class C {var a; var b;}",
-        AstTestFactory.classDeclaration(null, "C", null, null, null, null, [
-          AstTestFactory.fieldDeclaration2(
-              false, Keyword.VAR, [AstTestFactory.variableDeclaration("a")]),
-          AstTestFactory.fieldDeclaration2(
-              false, Keyword.VAR, [AstTestFactory.variableDeclaration("b")])
-        ]));
+        AstTestFactory.classDeclaration(null, "C", null, null, null, null,
+            members: [
+              AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
+                  [AstTestFactory.variableDeclaration("a")]),
+              AstTestFactory.fieldDeclaration2(
+                  false, Keyword.VAR, [AstTestFactory.variableDeclaration("b")])
+            ]));
   }
 
   void test_visitClassDeclaration_parameters() {
@@ -293,7 +311,7 @@
             null,
             "C",
             AstTestFactory.typeParameterList(["E"]),
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
             null,
             null));
   }
@@ -305,9 +323,9 @@
             null,
             "C",
             AstTestFactory.typeParameterList(["E"]),
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
             null,
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_parameters_extends_with() {
@@ -317,8 +335,8 @@
             null,
             "C",
             AstTestFactory.typeParameterList(["E"]),
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M")]),
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M")]),
             null));
   }
 
@@ -329,9 +347,9 @@
             null,
             "C",
             AstTestFactory.typeParameterList(["E"]),
-            AstTestFactory.extendsClause(AstTestFactory.typeName4("A")),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.extendsClause(AstTestFactory.namedType4("A")),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_parameters_implements() {
@@ -343,16 +361,17 @@
             AstTestFactory.typeParameterList(["E"]),
             null,
             null,
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("B")])));
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("B")])));
   }
 
   void test_visitClassDeclaration_singleMember() {
     _assertSource(
         "class C {var a;}",
-        AstTestFactory.classDeclaration(null, "C", null, null, null, null, [
-          AstTestFactory.fieldDeclaration2(
-              false, Keyword.VAR, [AstTestFactory.variableDeclaration("a")])
-        ]));
+        AstTestFactory.classDeclaration(null, "C", null, null, null, null,
+            members: [
+              AstTestFactory.fieldDeclaration2(
+                  false, Keyword.VAR, [AstTestFactory.variableDeclaration("a")])
+            ]));
   }
 
   void test_visitClassDeclaration_withMetadata() {
@@ -370,8 +389,8 @@
             "C",
             null,
             Keyword.ABSTRACT,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
             null));
   }
 
@@ -382,9 +401,22 @@
             "C",
             null,
             Keyword.ABSTRACT,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("I")])));
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("I")])));
+  }
+
+  void test_visitClassTypeAlias_abstractMacro() {
+    _assertSource(
+        "abstract macro class C = S with M1;",
+        AstTestFactory.classTypeAlias(
+            "C",
+            null,
+            Keyword.ABSTRACT,
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            null,
+            isMacro: true));
   }
 
   void test_visitClassTypeAlias_generic() {
@@ -394,9 +426,9 @@
             "C",
             AstTestFactory.typeParameterList(["E"]),
             null,
-            AstTestFactory.typeName4("S", [AstTestFactory.typeName4("E")]),
+            AstTestFactory.namedType4("S", [AstTestFactory.namedType4("E")]),
             AstTestFactory.withClause([
-              AstTestFactory.typeName4("M1", [AstTestFactory.typeName4("E")])
+              AstTestFactory.namedType4("M1", [AstTestFactory.namedType4("E")])
             ]),
             null));
   }
@@ -408,9 +440,22 @@
             "C",
             null,
             null,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("I")])));
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("I")])));
+  }
+
+  void test_visitClassTypeAlias_macro() {
+    _assertSource(
+        "macro class C = S with M1;",
+        AstTestFactory.classTypeAlias(
+            "C",
+            null,
+            null,
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            null,
+            isMacro: true));
   }
 
   void test_visitClassTypeAlias_minimal() {
@@ -420,8 +465,8 @@
             "C",
             null,
             null,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
             null));
   }
 
@@ -432,8 +477,8 @@
             "C",
             AstTestFactory.typeParameterList(["E"]),
             Keyword.ABSTRACT,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
             null));
   }
 
@@ -444,9 +489,9 @@
             "C",
             AstTestFactory.typeParameterList(["E"]),
             Keyword.ABSTRACT,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("I")])));
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("I")])));
   }
 
   void test_visitClassTypeAlias_parameters_implements() {
@@ -456,9 +501,9 @@
             "C",
             AstTestFactory.typeParameterList(["E"]),
             null,
-            AstTestFactory.typeName4("S"),
-            AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
-            AstTestFactory.implementsClause([AstTestFactory.typeName4("I")])));
+            AstTestFactory.namedType4("S"),
+            AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
+            AstTestFactory.implementsClause([AstTestFactory.namedType4("I")])));
   }
 
   void test_visitClassTypeAlias_withMetadata() {
@@ -466,8 +511,8 @@
         "C",
         null,
         null,
-        AstTestFactory.typeName4("S"),
-        AstTestFactory.withClause([AstTestFactory.typeName4("M1")]),
+        AstTestFactory.namedType4("S"),
+        AstTestFactory.withClause([AstTestFactory.namedType4("M1")]),
         null);
     declaration.metadata.add(
         AstTestFactory.annotation(AstTestFactory.identifier3("deprecated")));
@@ -684,19 +729,19 @@
     _assertSource(
         "p.C.n",
         AstTestFactory.constructorName(
-            AstTestFactory.typeName4("p.C.n"), null));
+            AstTestFactory.namedType4("p.C.n"), null));
   }
 
   void test_visitConstructorName_unnamed_noPrefix() {
     _assertSource("C",
-        AstTestFactory.constructorName(AstTestFactory.typeName4("C"), null));
+        AstTestFactory.constructorName(AstTestFactory.namedType4("C"), null));
   }
 
   void test_visitConstructorName_unnamed_prefix() {
     _assertSource(
         "p.C",
         AstTestFactory.constructorName(
-            AstTestFactory.typeName3(AstTestFactory.identifier5("p", "C")),
+            AstTestFactory.namedType3(AstTestFactory.identifier5("p", "C")),
             null));
   }
 
@@ -765,14 +810,62 @@
     _assertSource(";", AstTestFactory.emptyStatement());
   }
 
-  void test_visitEnumDeclaration_multiple() {
-    _assertSource("enum E {ONE, TWO}",
-        AstTestFactory.enumDeclaration2("E", ["ONE", "TWO"]));
+  void test_visitEnumDeclaration_constants_multiple() {
+    var findNode = _parseStringToFindNode(r'''
+enum E {one, two}
+''');
+    _assertSource(
+      'enum E {one, two}',
+      findNode.enumDeclaration('E'),
+    );
   }
 
-  void test_visitEnumDeclaration_single() {
+  void test_visitEnumDeclaration_constants_single() {
+    var findNode = _parseStringToFindNode(r'''
+enum E {one}
+''');
     _assertSource(
-        "enum E {ONE}", AstTestFactory.enumDeclaration2("E", ["ONE"]));
+      'enum E {one}',
+      findNode.enumDeclaration('E'),
+    );
+  }
+
+  void test_visitEnumDeclaration_field_constructor() {
+    var findNode = _parseStringToFindNode(r'''
+enum E {
+  one, two;
+  final int field;
+  E(this.field);
+}
+''');
+    _assertSource(
+      'enum E {one, two; final int field; E(this.field);}',
+      findNode.enumDeclaration('enum E'),
+    );
+  }
+
+  void test_visitEnumDeclaration_method() {
+    var findNode = _parseStringToFindNode(r'''
+enum E {
+  one, two;
+  void myMethod() {}
+  int get myGetter => 0;
+}
+''');
+    _assertSource(
+      'enum E {one, two; void myMethod() {} int get myGetter => 0;}',
+      findNode.enumDeclaration('enum E'),
+    );
+  }
+
+  void test_visitEnumDeclaration_withoutMembers() {
+    var findNode = _parseStringToFindNode(r'''
+enum E<T> with M1, M2 implements I1, I2 {one, two}
+''');
+    _assertSource(
+      'enum E<T> with M1, M2 implements I1, I2 {one, two}',
+      findNode.enumDeclaration('E'),
+    );
   }
 
   void test_visitExportDirective_combinator() {
@@ -845,7 +938,7 @@
 
   void test_visitExtendsClause() {
     _assertSource("extends C",
-        AstTestFactory.extendsClause(AstTestFactory.typeName4("C")));
+        AstTestFactory.extendsClause(AstTestFactory.namedType4("C")));
   }
 
   void test_visitExtensionDeclaration_empty() {
@@ -853,7 +946,7 @@
         'extension E on C {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             isExtensionTypeDeclaration: false));
   }
 
@@ -862,7 +955,7 @@
         'extension E on C {var a; var b;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
                   [AstTestFactory.variableDeclaration('a')]),
@@ -878,7 +971,7 @@
         AstTestFactory.extensionDeclaration(
             name: 'E',
             typeParameters: AstTestFactory.typeParameterList(['T']),
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             isExtensionTypeDeclaration: false));
   }
 
@@ -887,7 +980,7 @@
         'extension E on C {var a;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
@@ -900,9 +993,9 @@
         'extension type E on C hide B {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             hideClause:
-                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.hideClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -911,7 +1004,7 @@
         'extension type E on C hide B {var a; var b;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
                   [AstTestFactory.variableDeclaration('a')]),
@@ -919,7 +1012,7 @@
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('b')])
             ],
             hideClause:
-                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.hideClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -929,9 +1022,9 @@
         AstTestFactory.extensionDeclaration(
             name: 'E',
             typeParameters: AstTestFactory.typeParameterList(['T']),
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             hideClause:
-                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.hideClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -940,13 +1033,13 @@
         'extension type E on C hide B {var a;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
             ],
             hideClause:
-                AstTestFactory.hideClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.hideClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -955,7 +1048,7 @@
         'extension type E on C show foo {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause(
                 [AstTestFactory.showHideElement("foo")]),
             isExtensionTypeDeclaration: true));
@@ -966,9 +1059,9 @@
         'extension type E on C show B {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -977,7 +1070,7 @@
         'extension type E on C show get foo {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause(
                 [AstTestFactory.showHideElementGetter("foo")]),
             isExtensionTypeDeclaration: true));
@@ -988,7 +1081,7 @@
         'extension type E on C show B {var a; var b;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
                   [AstTestFactory.variableDeclaration('a')]),
@@ -996,7 +1089,7 @@
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('b')])
             ],
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1005,7 +1098,7 @@
         'extension type E on C show operator * {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause(
                 [AstTestFactory.showHideElementOperator("*")]),
             isExtensionTypeDeclaration: true));
@@ -1017,9 +1110,9 @@
         AstTestFactory.extensionDeclaration(
             name: 'E',
             typeParameters: AstTestFactory.typeParameterList(['T']),
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1028,9 +1121,9 @@
         'extension type E on C show prefix.B {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause([
-              AstTestFactory.typeName3(
+              AstTestFactory.namedType3(
                   AstTestFactory.identifier5('prefix', 'B'))
             ]),
             isExtensionTypeDeclaration: true));
@@ -1041,7 +1134,7 @@
         'extension type E on C show set foo {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause(
                 [AstTestFactory.showHideElementSetter("foo")]),
             isExtensionTypeDeclaration: true));
@@ -1052,13 +1145,13 @@
         'extension type E on C show B {var a;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
             ],
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1067,11 +1160,11 @@
         'extension type E on C show B<int, String> {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause: AstTestFactory.showClause([
-              AstTestFactory.typeName3(AstTestFactory.identifier3('B'), [
-                AstTestFactory.typeName4('int'),
-                AstTestFactory.typeName4('String')
+              AstTestFactory.namedType3(AstTestFactory.identifier3('B'), [
+                AstTestFactory.namedType4('int'),
+                AstTestFactory.namedType4('String')
               ])
             ]),
             isExtensionTypeDeclaration: true));
@@ -1082,9 +1175,9 @@
         'extension type E on C show B hide foo {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             showClause:
-                AstTestFactory.showClause([AstTestFactory.typeName4("B")]),
+                AstTestFactory.showClause([AstTestFactory.namedType4("B")]),
             hideClause: AstTestFactory.hideClause(
                 [AstTestFactory.showHideElement("foo")]),
             isExtensionTypeDeclaration: true));
@@ -1105,7 +1198,7 @@
         AstTestFactory.extensionOverride(
             extensionName: AstTestFactory.identifier5('p', 'E'),
             typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('A')]),
+                [AstTestFactory.namedType4('A')]),
             argumentList: AstTestFactory.argumentList(
                 [AstTestFactory.identifier3('o')])));
   }
@@ -1125,7 +1218,7 @@
         AstTestFactory.extensionOverride(
             extensionName: AstTestFactory.identifier3('E'),
             typeArguments: AstTestFactory.typeArgumentList(
-                [AstTestFactory.typeName4('A')]),
+                [AstTestFactory.namedType4('A')]),
             argumentList: AstTestFactory.argumentList(
                 [AstTestFactory.identifier3('o')])));
   }
@@ -1135,7 +1228,7 @@
         'extension type E on C {}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1144,7 +1237,7 @@
         'extension type E on C {var a; var b;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(false, Keyword.VAR,
                   [AstTestFactory.variableDeclaration('a')]),
@@ -1160,7 +1253,7 @@
         AstTestFactory.extensionDeclaration(
             name: 'E',
             typeParameters: AstTestFactory.typeParameterList(['T']),
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             isExtensionTypeDeclaration: true));
   }
 
@@ -1169,7 +1262,7 @@
         'extension type E on C {var a;}',
         AstTestFactory.extensionDeclaration(
             name: 'E',
-            extendedType: AstTestFactory.typeName4('C'),
+            extendedType: AstTestFactory.namedType4('C'),
             members: [
               AstTestFactory.fieldDeclaration2(
                   false, Keyword.VAR, [AstTestFactory.variableDeclaration('a')])
@@ -1227,7 +1320,7 @@
         "A this.a(b)",
         AstTestFactory.fieldFormalParameter(
             null,
-            AstTestFactory.typeName4("A"),
+            AstTestFactory.namedType4("A"),
             "a",
             AstTestFactory.formalParameterList(
                 [AstTestFactory.simpleFormalParameter3("b")])));
@@ -1237,7 +1330,7 @@
     _assertSource(
         "A this.a<E, F>(b)",
         astFactory.fieldFormalParameter2(
-            type: AstTestFactory.typeName4('A'),
+            type: AstTestFactory.namedType4('A'),
             thisKeyword: TokenFactory.tokenFromKeyword(Keyword.THIS),
             period: TokenFactory.tokenFromType(TokenType.PERIOD),
             identifier: AstTestFactory.identifier3('a'),
@@ -1255,19 +1348,19 @@
     _assertSource(
         "final A this.a",
         AstTestFactory.fieldFormalParameter(
-            Keyword.FINAL, AstTestFactory.typeName4("A"), "a"));
+            Keyword.FINAL, AstTestFactory.namedType4("A"), "a"));
   }
 
   void test_visitFieldFormalParameter_type() {
     _assertSource(
         "A this.a",
         AstTestFactory.fieldFormalParameter(
-            null, AstTestFactory.typeName4("A"), "a"));
+            null, AstTestFactory.namedType4("A"), "a"));
   }
 
   void test_visitFieldFormalParameter_type_covariant() {
     var expected = AstTestFactory.fieldFormalParameter(
-        null, AstTestFactory.typeName4("A"), "a");
+        null, AstTestFactory.namedType4("A"), "a");
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant A this.a", expected);
@@ -1370,7 +1463,7 @@
               null),
           AstTestFactory.namedFormalParameter(
               AstTestFactory.simpleFormalParameter2(
-                  null, AstTestFactory.typeName4('A'), "b")
+                  null, AstTestFactory.namedType4('A'), "b")
                 ..requiredKeyword =
                     TokenFactory.tokenFromKeyword(Keyword.REQUIRED),
               null),
@@ -1819,14 +1912,14 @@
         "f<A>()",
         AstTestFactory.functionExpressionInvocation2(
             AstTestFactory.identifier3("f"),
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')])));
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('A')])));
   }
 
   void test_visitFunctionTypeAlias_generic() {
     _assertSource(
         "typedef A F<B>();",
         AstTestFactory.typeAlias(
-            AstTestFactory.typeName4("A"),
+            AstTestFactory.namedType4("A"),
             "F",
             AstTestFactory.typeParameterList(["B"]),
             AstTestFactory.formalParameterList()));
@@ -1835,13 +1928,13 @@
   void test_visitFunctionTypeAlias_nonGeneric() {
     _assertSource(
         "typedef A F();",
-        AstTestFactory.typeAlias(AstTestFactory.typeName4("A"), "F", null,
+        AstTestFactory.typeAlias(AstTestFactory.namedType4("A"), "F", null,
             AstTestFactory.formalParameterList()));
   }
 
   void test_visitFunctionTypeAlias_withMetadata() {
     FunctionTypeAlias declaration = AstTestFactory.typeAlias(
-        AstTestFactory.typeName4("A"),
+        AstTestFactory.namedType4("A"),
         "F",
         null,
         AstTestFactory.formalParameterList());
@@ -1867,7 +1960,7 @@
     _assertSource(
         "T f()?",
         astFactory.functionTypedFormalParameter2(
-            returnType: AstTestFactory.typeName4("T"),
+            returnType: AstTestFactory.namedType4("T"),
             identifier: AstTestFactory.identifier3('f'),
             parameters: AstTestFactory.formalParameterList([]),
             question: TokenFactory.tokenFromType(TokenType.QUESTION)));
@@ -1877,12 +1970,12 @@
     _assertSource(
         "T f()",
         AstTestFactory.functionTypedFormalParameter(
-            AstTestFactory.typeName4("T"), "f"));
+            AstTestFactory.namedType4("T"), "f"));
   }
 
   void test_visitFunctionTypedFormalParameter_type_covariant() {
     var expected = AstTestFactory.functionTypedFormalParameter(
-        AstTestFactory.typeName4("T"), "f");
+        AstTestFactory.namedType4("T"), "f");
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant T f()", expected);
@@ -1892,7 +1985,7 @@
     _assertSource(
         "T f<E>()",
         astFactory.functionTypedFormalParameter2(
-            returnType: AstTestFactory.typeName4("T"),
+            returnType: AstTestFactory.namedType4("T"),
             identifier: AstTestFactory.identifier3('f'),
             typeParameters: AstTestFactory.typeParameterList(['E']),
             parameters: AstTestFactory.formalParameterList([])));
@@ -1902,11 +1995,11 @@
     _assertSource(
         "int Function<T>(T)",
         AstTestFactory.genericFunctionType(
-            AstTestFactory.typeName4("int"),
+            AstTestFactory.namedType4("int"),
             AstTestFactory.typeParameterList2(['T']),
             AstTestFactory.formalParameterList([
               AstTestFactory.simpleFormalParameter4(
-                  AstTestFactory.typeName4("T"), null)
+                  AstTestFactory.namedType4("T"), null)
             ])));
   }
 
@@ -1914,11 +2007,11 @@
     _assertSource(
         "int Function<T>(T)?",
         AstTestFactory.genericFunctionType(
-            AstTestFactory.typeName4("int"),
+            AstTestFactory.namedType4("int"),
             AstTestFactory.typeParameterList2(['T']),
             AstTestFactory.formalParameterList([
               AstTestFactory.simpleFormalParameter4(
-                  AstTestFactory.typeName4("T"), null)
+                  AstTestFactory.namedType4("T"), null)
             ]),
             question: true));
   }
@@ -1930,11 +2023,11 @@
             'X',
             AstTestFactory.typeParameterList2(['S']),
             AstTestFactory.genericFunctionType(
-                AstTestFactory.typeName4("S"),
+                AstTestFactory.namedType4("S"),
                 AstTestFactory.typeParameterList2(['T']),
                 AstTestFactory.formalParameterList([
                   AstTestFactory.simpleFormalParameter4(
-                      AstTestFactory.typeName4("T"), null)
+                      AstTestFactory.namedType4("T"), null)
                 ]))));
   }
 
@@ -1980,12 +2073,12 @@
     _assertSource(
         "implements A, B",
         AstTestFactory.implementsClause(
-            [AstTestFactory.typeName4("A"), AstTestFactory.typeName4("B")]));
+            [AstTestFactory.namedType4("A"), AstTestFactory.namedType4("B")]));
   }
 
   void test_visitImplementsClause_single() {
     _assertSource("implements A",
-        AstTestFactory.implementsClause([AstTestFactory.typeName4("A")]));
+        AstTestFactory.implementsClause([AstTestFactory.namedType4("A")]));
   }
 
   void test_visitImportDirective_combinator() {
@@ -2101,21 +2194,21 @@
     _assertSource(
         "const C()",
         AstTestFactory.instanceCreationExpression2(
-            Keyword.CONST, AstTestFactory.typeName4("C")));
+            Keyword.CONST, AstTestFactory.namedType4("C")));
   }
 
   void test_visitInstanceCreationExpression_named() {
     _assertSource(
         "new C.c()",
         AstTestFactory.instanceCreationExpression3(
-            Keyword.NEW, AstTestFactory.typeName4("C"), "c"));
+            Keyword.NEW, AstTestFactory.namedType4("C"), "c"));
   }
 
   void test_visitInstanceCreationExpression_unnamed() {
     _assertSource(
         "new C()",
         AstTestFactory.instanceCreationExpression2(
-            Keyword.NEW, AstTestFactory.typeName4("C")));
+            Keyword.NEW, AstTestFactory.namedType4("C")));
   }
 
   void test_visitIntegerLiteral() {
@@ -2141,14 +2234,14 @@
     _assertSource(
         "a is! C",
         AstTestFactory.isExpression(AstTestFactory.identifier3("a"), true,
-            AstTestFactory.typeName4("C")));
+            AstTestFactory.namedType4("C")));
   }
 
   void test_visitIsExpression_normal() {
     _assertSource(
         "a is C",
         AstTestFactory.isExpression(AstTestFactory.identifier3("a"), false,
-            AstTestFactory.typeName4("C")));
+            AstTestFactory.namedType4("C")));
   }
 
   void test_visitLabel() {
@@ -2201,7 +2294,7 @@
         '<int>[0, for (e in l) 0, if (b) 1, ...[0]]',
         astFactory.listLiteral(
             null,
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
             Tokens.openSquareBracket(),
             [
               AstTestFactory.integer(0),
@@ -2267,7 +2360,7 @@
         'const <int>[0]',
         astFactory.listLiteral(
             TokenFactory.tokenFromKeyword(Keyword.CONST),
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
             Tokens.openSquareBracket(),
             [AstTestFactory.integer(0)],
             Tokens.closeSquareBracket()));
@@ -2285,7 +2378,7 @@
         '<int>[0]',
         astFactory.listLiteral(
             null,
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
             Tokens.openSquareBracket(),
             [AstTestFactory.integer(0)],
             Tokens.closeSquareBracket()));
@@ -2332,7 +2425,7 @@
         "external T m();",
         AstTestFactory.methodDeclaration(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             null,
             null,
             AstTestFactory.identifier3("m"),
@@ -2357,7 +2450,7 @@
         "T get m {}",
         AstTestFactory.methodDeclaration2(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             Keyword.GET,
             null,
             AstTestFactory.identifier3("m"),
@@ -2370,7 +2463,7 @@
         "T set m(var v) {}",
         AstTestFactory.methodDeclaration2(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             Keyword.SET,
             null,
             AstTestFactory.identifier3("m"),
@@ -2426,7 +2519,7 @@
         "T operator +() {}",
         AstTestFactory.methodDeclaration2(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             null,
             Keyword.OPERATOR,
             AstTestFactory.identifier3("+"),
@@ -2439,7 +2532,7 @@
         "T m() {}",
         AstTestFactory.methodDeclaration2(
             null,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             null,
             null,
             AstTestFactory.identifier3("m"),
@@ -2479,7 +2572,7 @@
         "static T m() {}",
         AstTestFactory.methodDeclaration2(
             Keyword.STATIC,
-            AstTestFactory.typeName4("T"),
+            AstTestFactory.namedType4("T"),
             null,
             null,
             AstTestFactory.identifier3("m"),
@@ -2535,7 +2628,7 @@
     _assertSource(
         "m<A>()",
         AstTestFactory.methodInvocation3(null, "m",
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('A')])));
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('A')])));
   }
 
   void test_visitNamedExpression() {
@@ -2681,8 +2774,8 @@
       astFactory.setOrMapLiteral(
         leftBracket: Tokens.openCurlyBracket(),
         typeArguments: AstTestFactory.typeArgumentList([
-          AstTestFactory.typeName4('String'),
-          AstTestFactory.typeName4('String')
+          AstTestFactory.namedType4('String'),
+          AstTestFactory.namedType4('String')
         ]),
         elements: [
           AstTestFactory.mapLiteralEntry3('a', 'b'),
@@ -2736,8 +2829,8 @@
       astFactory.setOrMapLiteral(
         constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
         typeArguments: AstTestFactory.typeArgumentList([
-          AstTestFactory.typeName4('String'),
-          AstTestFactory.typeName4('String')
+          AstTestFactory.namedType4('String'),
+          AstTestFactory.namedType4('String')
         ]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [AstTestFactory.mapLiteralEntry3('a', 'b')],
@@ -2762,8 +2855,8 @@
       "<String, String>{'a' : 'b'}",
       astFactory.setOrMapLiteral(
         typeArguments: AstTestFactory.typeArgumentList([
-          AstTestFactory.typeName4('String'),
-          AstTestFactory.typeName4('String')
+          AstTestFactory.namedType4('String'),
+          AstTestFactory.namedType4('String')
         ]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [AstTestFactory.mapLiteralEntry3('a', 'b')],
@@ -2777,7 +2870,7 @@
       '<int>{0, for (e in l) 0, if (b) 1, ...[0]}',
       astFactory.setOrMapLiteral(
         typeArguments:
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [
           AstTestFactory.integer(0),
@@ -2833,7 +2926,7 @@
       astFactory.setOrMapLiteral(
         constKeyword: TokenFactory.tokenFromKeyword(Keyword.CONST),
         typeArguments:
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [AstTestFactory.integer(0)],
         rightBracket: Tokens.closeCurlyBracket(),
@@ -2857,7 +2950,7 @@
       '<int>{0}',
       astFactory.setOrMapLiteral(
         typeArguments:
-            AstTestFactory.typeArgumentList([AstTestFactory.typeName4('int')]),
+            AstTestFactory.typeArgumentList([AstTestFactory.namedType4('int')]),
         leftBracket: Tokens.openCurlyBracket(),
         elements: [AstTestFactory.integer(0)],
         rightBracket: Tokens.closeCurlyBracket(),
@@ -2882,19 +2975,19 @@
     _assertSource(
         "final A a",
         AstTestFactory.simpleFormalParameter2(
-            Keyword.FINAL, AstTestFactory.typeName4("A"), "a"));
+            Keyword.FINAL, AstTestFactory.namedType4("A"), "a"));
   }
 
   void test_visitSimpleFormalParameter_type() {
     _assertSource(
         "A a",
         AstTestFactory.simpleFormalParameter4(
-            AstTestFactory.typeName4("A"), "a"));
+            AstTestFactory.namedType4("A"), "a"));
   }
 
   void test_visitSimpleFormalParameter_type_covariant() {
     var expected = AstTestFactory.simpleFormalParameter4(
-        AstTestFactory.typeName4("A"), "a");
+        AstTestFactory.namedType4("A"), "a");
     expected.covariantKeyword =
         TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
     _assertSource("covariant A a", expected);
@@ -2962,6 +3055,64 @@
     _assertSource("super", AstTestFactory.superExpression());
   }
 
+  void test_visitSuperFormalParameter_annotation() {
+    SuperFormalParameter parameter = AstTestFactory.superFormalParameter2('f');
+    parameter.metadata
+        .add(AstTestFactory.annotation(AstTestFactory.identifier3("A")));
+    _assertSource('@A super.f', parameter);
+  }
+
+  void test_visitSuperFormalParameter_functionTyped() {
+    _assertSource(
+        "A super.a(b)",
+        AstTestFactory.superFormalParameter(
+            null,
+            AstTestFactory.namedType4("A"),
+            "a",
+            AstTestFactory.formalParameterList(
+                [AstTestFactory.simpleFormalParameter3("b")])));
+  }
+
+  void test_visitSuperFormalParameter_functionTyped_typeParameters() {
+    _assertSource(
+        "A super.a<E, F>(b)",
+        astFactory.superFormalParameter(
+            type: AstTestFactory.namedType4('A'),
+            superKeyword: TokenFactory.tokenFromKeyword(Keyword.SUPER),
+            period: TokenFactory.tokenFromType(TokenType.PERIOD),
+            identifier: AstTestFactory.identifier3('a'),
+            typeParameters: AstTestFactory.typeParameterList(['E', 'F']),
+            parameters: AstTestFactory.formalParameterList(
+                [AstTestFactory.simpleFormalParameter3("b")])));
+  }
+
+  void test_visitSuperFormalParameter_keyword() {
+    _assertSource("var super.a",
+        AstTestFactory.superFormalParameter(Keyword.VAR, null, "a"));
+  }
+
+  void test_visitSuperFormalParameter_keywordAndType() {
+    _assertSource(
+        "final A super.a",
+        AstTestFactory.superFormalParameter(
+            Keyword.FINAL, AstTestFactory.namedType4("A"), "a"));
+  }
+
+  void test_visitSuperFormalParameter_type() {
+    _assertSource(
+        "A super.a",
+        AstTestFactory.superFormalParameter(
+            null, AstTestFactory.namedType4("A"), "a"));
+  }
+
+  void test_visitSuperFormalParameter_type_covariant() {
+    var expected = AstTestFactory.superFormalParameter(
+        null, AstTestFactory.namedType4("A"), "a");
+    expected.covariantKeyword =
+        TokenFactory.tokenFromKeyword(Keyword.COVARIANT);
+    _assertSource("covariant A super.a", expected);
+  }
+
   void test_visitSwitchCase_multipleLabels() {
     _assertSource(
         "l1: l2: case a: {}",
@@ -3074,15 +3225,15 @@
     _assertSource(
         "try {} on E {}",
         AstTestFactory.tryStatement2(AstTestFactory.block(),
-            [AstTestFactory.catchClause3(AstTestFactory.typeName4("E"))]));
+            [AstTestFactory.catchClause3(AstTestFactory.namedType4("E"))]));
   }
 
   void test_visitTryStatement_catches() {
     _assertSource(
         "try {} on E {} on F {}",
         AstTestFactory.tryStatement2(AstTestFactory.block(), [
-          AstTestFactory.catchClause3(AstTestFactory.typeName4("E")),
-          AstTestFactory.catchClause3(AstTestFactory.typeName4("F"))
+          AstTestFactory.catchClause3(AstTestFactory.namedType4("E")),
+          AstTestFactory.catchClause3(AstTestFactory.namedType4("F"))
         ]));
   }
 
@@ -3091,7 +3242,7 @@
         "try {} on E {} finally {}",
         AstTestFactory.tryStatement3(
             AstTestFactory.block(),
-            [AstTestFactory.catchClause3(AstTestFactory.typeName4("E"))],
+            [AstTestFactory.catchClause3(AstTestFactory.namedType4("E"))],
             AstTestFactory.block()));
   }
 
@@ -3106,45 +3257,45 @@
     _assertSource(
         "<E, F>",
         AstTestFactory.typeArgumentList2(
-            [AstTestFactory.typeName4("E"), AstTestFactory.typeName4("F")]));
+            [AstTestFactory.namedType4("E"), AstTestFactory.namedType4("F")]));
   }
 
   void test_visitTypeArgumentList_single() {
     _assertSource("<E>",
-        AstTestFactory.typeArgumentList2([AstTestFactory.typeName4("E")]));
+        AstTestFactory.typeArgumentList2([AstTestFactory.namedType4("E")]));
   }
 
   void test_visitTypeName_multipleArgs() {
     _assertSource(
         "C<D, E>",
-        AstTestFactory.typeName4("C",
-            [AstTestFactory.typeName4("D"), AstTestFactory.typeName4("E")]));
+        AstTestFactory.namedType4("C",
+            [AstTestFactory.namedType4("D"), AstTestFactory.namedType4("E")]));
   }
 
   void test_visitTypeName_nestedArg() {
     _assertSource(
         "C<D<E>>",
-        AstTestFactory.typeName4("C", [
-          AstTestFactory.typeName4("D", [AstTestFactory.typeName4("E")])
+        AstTestFactory.namedType4("C", [
+          AstTestFactory.namedType4("D", [AstTestFactory.namedType4("E")])
         ]));
   }
 
   void test_visitTypeName_noArgs() {
-    _assertSource("C", AstTestFactory.typeName4("C"));
+    _assertSource("C", AstTestFactory.namedType4("C"));
   }
 
   void test_visitTypeName_noArgs_withQuestion() {
-    _assertSource("C?", AstTestFactory.typeName4("C", null, true));
+    _assertSource("C?", AstTestFactory.namedType4("C", null, true));
   }
 
   void test_visitTypeName_singleArg() {
-    _assertSource(
-        "C<D>", AstTestFactory.typeName4("C", [AstTestFactory.typeName4("D")]));
+    _assertSource("C<D>",
+        AstTestFactory.namedType4("C", [AstTestFactory.namedType4("D")]));
   }
 
   void test_visitTypeName_singleArg_withQuestion() {
     _assertSource("C<D>?",
-        AstTestFactory.typeName4("C", [AstTestFactory.typeName4("D")], true));
+        AstTestFactory.namedType4("C", [AstTestFactory.namedType4("D")], true));
   }
 
   void test_visitTypeParameter_variance_contravariant() {
@@ -3161,7 +3312,7 @@
 
   void test_visitTypeParameter_withExtends() {
     _assertSource("E extends C",
-        AstTestFactory.typeParameter2("E", AstTestFactory.typeName4("C")));
+        AstTestFactory.typeParameter2("E", AstTestFactory.namedType4("C")));
   }
 
   void test_visitTypeParameter_withMetadata() {
@@ -3205,7 +3356,7 @@
     _assertSource(
         "const C a, b",
         AstTestFactory.variableDeclarationList(
-            Keyword.CONST, AstTestFactory.typeName4("C"), [
+            Keyword.CONST, AstTestFactory.namedType4("C"), [
           AstTestFactory.variableDeclaration("a"),
           AstTestFactory.variableDeclaration("b")
         ]));
@@ -3235,7 +3386,7 @@
     _assertSource(
         "C a, b",
         AstTestFactory.variableDeclarationList(
-            null, AstTestFactory.typeName4("C"), [
+            null, AstTestFactory.namedType4("C"), [
           AstTestFactory.variableDeclaration("a"),
           AstTestFactory.variableDeclaration("b")
         ]));
@@ -3255,7 +3406,7 @@
         "C c;",
         AstTestFactory.variableDeclarationStatement(
             null,
-            AstTestFactory.typeName4("C"),
+            AstTestFactory.namedType4("C"),
             [AstTestFactory.variableDeclaration("c")]));
   }
 
@@ -3270,15 +3421,15 @@
     _assertSource(
         "with A, B, C",
         AstTestFactory.withClause([
-          AstTestFactory.typeName4("A"),
-          AstTestFactory.typeName4("B"),
-          AstTestFactory.typeName4("C")
+          AstTestFactory.namedType4("A"),
+          AstTestFactory.namedType4("B"),
+          AstTestFactory.namedType4("C")
         ]));
   }
 
   void test_visitWithClause_single() {
     _assertSource(
-        "with A", AstTestFactory.withClause([AstTestFactory.typeName4("A")]));
+        "with A", AstTestFactory.withClause([AstTestFactory.namedType4("A")]));
   }
 
   void test_visitYieldStatement() {
@@ -3291,11 +3442,25 @@
         AstTestFactory.yieldEachStatement(AstTestFactory.identifier3("e")));
   }
 
-  /// Assert that a `ToSourceVisitor2` will produce the [expectedSource] when
+  /// Assert that a [ToSourceVisitor] will produce the [expectedSource] when
   /// visiting the given [node].
   void _assertSource(String expectedSource, AstNode node) {
     StringBuffer buffer = StringBuffer();
     node.accept(ToSourceVisitor(buffer));
     expect(buffer.toString(), expectedSource);
   }
+
+  FindNode _parseStringToFindNode(String content) {
+    var parseResult = parseString(
+      content: content,
+      featureSet: FeatureSet.fromEnableFlags2(
+        sdkLanguageVersion: ExperimentStatus.currentVersion,
+        flags: [
+          Feature.enhanced_enums.enableString,
+          Feature.super_parameters.enableString,
+        ],
+      ),
+    );
+    return FindNode(parseResult.content, parseResult.unit);
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 26f0785..09360c4 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -64,6 +64,18 @@
     );
   }
 
+  test_identical_constructorReference_aliasIsNotProperRename_differentCount2() async {
+    await resolveTestCode('''
+class C<T, U> {}
+typedef MyC<T> = C;
+const a = identical(MyC.new, C.new);
+''');
+    expect(
+      _evaluateConstant('a'),
+      _boolValue(false),
+    );
+  }
+
   test_identical_constructorReference_aliasIsNotProperRename_differentOrder() async {
     await resolveTestCode('''
 class C<T, U> {}
@@ -124,7 +136,7 @@
     );
   }
 
-  test_identical_constructorReference_aliasIsProperRename_mutualSubtypes() async {
+  test_identical_constructorReference_aliasIsProperRename_mutualSubtypes_dynamic() async {
     await resolveTestCode('''
 class C<T> {}
 typedef MyC<T extends Object?> = C<T>;
@@ -136,6 +148,18 @@
     );
   }
 
+  test_identical_constructorReference_aliasIsProperRename_mutualSubtypes_futureOr() async {
+    await resolveTestCode('''
+class C<T extends num> {}
+typedef MyC<T extends FutureOr<num>> = C<T>;
+const a = identical(MyC<int>.new, MyC<int>.new);
+''');
+    expect(
+      _evaluateConstant('a'),
+      _boolValue(true),
+    );
+  }
+
   test_identical_constructorReference_aliasIsProperRename_uninstantiated() async {
     await resolveTestCode('''
 class C<T> {}
@@ -1500,11 +1524,7 @@
       'c',
       errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
     );
-    if (analysisOptions.experimentStatus.constant_update_2018) {
-      expect(result.toIntValue(), 1);
-    } else {
-      expect(result, isNull);
-    }
+    expect(result.toIntValue(), 1);
   }
 
   test_visitConditionalExpression_eager_true_invalid_int() async {
diff --git a/pkg/analyzer/test/src/dart/element/class_element_test.dart b/pkg/analyzer/test/src/dart/element/class_element_test.dart
index c6ed690..9505982 100644
--- a/pkg/analyzer/test/src/dart/element/class_element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/class_element_test.dart
@@ -1331,10 +1331,6 @@
 }
 
 extension on ClassElement {
-  MethodElement? _lookUpInheritedMethod(String name) {
-    return lookUpInheritedMethod(name, library);
-  }
-
   PropertyAccessorElement? _lookUpInheritedConcreteGetter(String name) {
     return lookUpInheritedConcreteGetter(name, library);
   }
@@ -1346,4 +1342,8 @@
   PropertyAccessorElement? _lookUpInheritedConcreteSetter(String name) {
     return lookUpInheritedConcreteSetter(name, library);
   }
+
+  MethodElement? _lookUpInheritedMethod(String name) {
+    return lookUpInheritedMethod(name, library);
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 0ac00a2..2b46b93 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/generated/testing/element_factory.dart';
-import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -1269,357 +1268,6 @@
     expect(0 == typeA.hashCode, isFalse);
   }
 
-  @deprecated
-  void test_lookUpGetter_implemented() {
-    //
-    // class A { g {} }
-    //
-    var classA = class_(name: 'A');
-    String getterName = "g";
-    PropertyAccessorElement getterG =
-        ElementFactory.getterElement(getterName, false, intNone);
-    classA.accessors = <PropertyAccessorElement>[getterG];
-    InterfaceType typeA = interfaceTypeStar(classA);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[classA];
-    expect(typeA.lookUpGetter(getterName, library), same(getterG));
-  }
-
-  @deprecated
-  void test_lookUpGetter_inherited() {
-    //
-    // class A { g {} }
-    // class B extends A {}
-    //
-    var classA = class_(name: 'A');
-    String getterName = "g";
-    PropertyAccessorElement getterG =
-        ElementFactory.getterElement(getterName, false, intNone);
-    classA.accessors = <PropertyAccessorElement>[getterG];
-    ClassElementImpl classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
-    InterfaceType typeB = interfaceTypeStar(classB);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[
-      classA,
-      classB
-    ];
-    expect(typeB.lookUpGetter(getterName, library), same(getterG));
-  }
-
-  @deprecated
-  void test_lookUpGetter_mixin_shadowing() {
-    //
-    // class B {}
-    // class M1 { get g {} }
-    // class M2 { get g {} }
-    // class C extends B with M1, M2 {}
-    //
-    TestTypeProvider typeProvider = TestTypeProvider();
-    String getterName = 'g';
-    var classB = class_(name: 'B');
-    ClassElementImpl classM1 = ElementFactory.classElement2('M1');
-    PropertyAccessorElementImpl getterM1g = ElementFactory.getterElement(
-        getterName, false, typeProvider.dynamicType);
-    classM1.accessors = <PropertyAccessorElement>[getterM1g];
-    ClassElementImpl classM2 = ElementFactory.classElement2('M2');
-    PropertyAccessorElementImpl getterM2g = ElementFactory.getterElement(
-        getterName, false, typeProvider.dynamicType);
-    classM2.accessors = <PropertyAccessorElement>[getterM2g];
-    ClassElementImpl classC =
-        ElementFactory.classElement('C', interfaceTypeStar(classB));
-    classC.mixins = <InterfaceType>[
-      interfaceTypeStar(classM1),
-      interfaceTypeStar(classM2)
-    ];
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
-    unit.classes = <ClassElement>[classB, classM1, classM2, classC];
-    expect(
-        interfaceTypeStar(classC).lookUpGetter(getterName, library), getterM2g);
-  }
-
-  @deprecated
-  void test_lookUpGetter_recursive() {
-    //
-    // class A extends B {}
-    // class B extends A {}
-    //
-    var classA = class_(name: 'A');
-    InterfaceType typeA = interfaceTypeStar(classA);
-    var classB = ElementFactory.classElement("B", typeA);
-    classA.supertype = interfaceTypeStar(classB);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[
-      classA,
-      classB
-    ];
-    expect(typeA.lookUpGetter("g", library), isNull);
-  }
-
-  @deprecated
-  void test_lookUpGetter_unimplemented() {
-    //
-    // class A {}
-    //
-    var classA = class_(name: 'A');
-    InterfaceType typeA = interfaceTypeStar(classA);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[classA];
-    expect(typeA.lookUpGetter("g", library), isNull);
-  }
-
-  @deprecated
-  void test_lookUpMethod_implemented() {
-    //
-    // class A { m() {} }
-    //
-    var classA = class_(name: 'A');
-    String methodName = "m";
-    MethodElementImpl methodM =
-        ElementFactory.methodElement(methodName, intNone);
-    classA.methods = <MethodElement>[methodM];
-    InterfaceType typeA = interfaceTypeStar(classA);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[classA];
-    expect(typeA.lookUpMethod(methodName, library), same(methodM));
-  }
-
-  @deprecated
-  void test_lookUpMethod_inherited() {
-    //
-    // class A { m() {} }
-    // class B extends A {}
-    //
-    var classA = class_(name: 'A');
-    String methodName = "m";
-    MethodElementImpl methodM =
-        ElementFactory.methodElement(methodName, intNone);
-    classA.methods = <MethodElement>[methodM];
-    ClassElementImpl classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
-    InterfaceType typeB = interfaceTypeStar(classB);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[
-      classA,
-      classB
-    ];
-    expect(typeB.lookUpMethod(methodName, library), same(methodM));
-  }
-
-  @deprecated
-  void test_lookUpMethod_mixin_shadowing() {
-    //
-    // class B {}
-    // class M1 { m() {} }
-    // class M2 { m() {} }
-    // class C extends B with M1, M2 {}
-    //
-    String methodName = 'm';
-    var classB = class_(name: 'B');
-    ClassElementImpl classM1 = ElementFactory.classElement2('M1');
-    MethodElementImpl methodM1m =
-        ElementFactory.methodElement(methodName, intNone);
-    classM1.methods = <MethodElement>[methodM1m];
-    ClassElementImpl classM2 = ElementFactory.classElement2('M2');
-    MethodElementImpl methodM2m =
-        ElementFactory.methodElement(methodName, intNone);
-    classM2.methods = <MethodElement>[methodM2m];
-    ClassElementImpl classC =
-        ElementFactory.classElement('C', interfaceTypeStar(classB));
-    classC.mixins = <InterfaceType>[
-      interfaceTypeStar(classM1),
-      interfaceTypeStar(classM2)
-    ];
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
-    unit.classes = <ClassElement>[classB, classM1, classM2, classC];
-    expect(
-        interfaceTypeStar(classC).lookUpMethod(methodName, library), methodM2m);
-  }
-
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
-  @deprecated
-  void test_lookUpMethod_parameterized() {
-    //
-    // class A<E> { E m(E p) {} }
-    // class B<F> extends A<F> {}
-    //
-    var E = typeParameter('E');
-    var A = class_(name: 'A', typeParameters: [E]);
-    DartType typeE = typeParameterTypeStar(E);
-    String methodName = "m";
-    MethodElementImpl methodM =
-        ElementFactory.methodElement(methodName, typeE, [typeE]);
-    A.methods = <MethodElement>[methodM];
-
-    var F = typeParameter('F');
-    var B = class_(
-      name: 'B',
-      typeParameters: [F],
-      superType: interfaceTypeStar(A, typeArguments: [
-        typeParameterTypeStar(F),
-      ]),
-    );
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[A];
-    //
-    // B<I>
-    //
-    var typeI = interfaceTypeStar(class_(name: 'I'));
-    var typeBI = interfaceTypeStar(B, typeArguments: <DartType>[typeI]);
-    MethodElement method = typeBI.lookUpMethod(methodName, library)!;
-    expect(method, isNotNull);
-    FunctionType methodType = method.type;
-    expect(methodType.returnType, same(typeI));
-    List<DartType> parameterTypes = methodType.normalParameterTypes;
-    expect(parameterTypes, hasLength(1));
-    expect(parameterTypes[0], same(typeI));
-  }
-
-  @deprecated
-  void test_lookUpMethod_recursive() {
-    //
-    // class A extends B {}
-    // class B extends A {}
-    //
-    var classA = class_(name: 'A');
-    InterfaceType typeA = interfaceTypeStar(classA);
-    var classB = ElementFactory.classElement("B", typeA);
-    classA.supertype = interfaceTypeStar(classB);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[
-      classA,
-      classB
-    ];
-    expect(typeA.lookUpMethod("m", library), isNull);
-  }
-
-  @deprecated
-  void test_lookUpMethod_unimplemented() {
-    //
-    // class A {}
-    //
-    var classA = class_(name: 'A');
-    InterfaceType typeA = interfaceTypeStar(classA);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[classA];
-    expect(typeA.lookUpMethod("m", library), isNull);
-  }
-
-  @deprecated
-  void test_lookUpSetter_implemented() {
-    //
-    // class A { s(x) {} }
-    //
-    var classA = class_(name: 'A');
-    String setterName = "s";
-    PropertyAccessorElement setterS =
-        ElementFactory.setterElement(setterName, false, intNone);
-    classA.accessors = <PropertyAccessorElement>[setterS];
-    InterfaceType typeA = interfaceTypeStar(classA);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[classA];
-    expect(typeA.lookUpSetter(setterName, library), same(setterS));
-  }
-
-  @deprecated
-  void test_lookUpSetter_inherited() {
-    //
-    // class A { s(x) {} }
-    // class B extends A {}
-    //
-    var classA = class_(name: 'A');
-    String setterName = "g";
-    PropertyAccessorElement setterS =
-        ElementFactory.setterElement(setterName, false, intNone);
-    classA.accessors = <PropertyAccessorElement>[setterS];
-    ClassElementImpl classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
-    InterfaceType typeB = interfaceTypeStar(classB);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[
-      classA,
-      classB
-    ];
-    expect(typeB.lookUpSetter(setterName, library), same(setterS));
-  }
-
-  @deprecated
-  void test_lookUpSetter_mixin_shadowing() {
-    //
-    // class B {}
-    // class M1 { set s() {} }
-    // class M2 { set s() {} }
-    // class C extends B with M1, M2 {}
-    //
-    TestTypeProvider typeProvider = TestTypeProvider();
-    String setterName = 's';
-    var classB = class_(name: 'B');
-    ClassElementImpl classM1 = ElementFactory.classElement2('M1');
-    PropertyAccessorElementImpl setterM1g = ElementFactory.setterElement(
-        setterName, false, typeProvider.dynamicType);
-    classM1.accessors = <PropertyAccessorElement>[setterM1g];
-    ClassElementImpl classM2 = ElementFactory.classElement2('M2');
-    PropertyAccessorElementImpl setterM2g = ElementFactory.getterElement(
-        setterName, false, typeProvider.dynamicType);
-    classM2.accessors = <PropertyAccessorElement>[setterM2g];
-    ClassElementImpl classC =
-        ElementFactory.classElement('C', interfaceTypeStar(classB));
-    classC.mixins = <InterfaceType>[
-      interfaceTypeStar(classM1),
-      interfaceTypeStar(classM2)
-    ];
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    var unit = library.definingCompilationUnit as CompilationUnitElementImpl;
-    unit.classes = <ClassElement>[classB, classM1, classM2, classC];
-    expect(
-        interfaceTypeStar(classC).lookUpGetter(setterName, library), setterM2g);
-  }
-
-  @deprecated
-  void test_lookUpSetter_recursive() {
-    //
-    // class A extends B {}
-    // class B extends A {}
-    //
-    var classA = class_(name: 'A');
-    InterfaceType typeA = interfaceTypeStar(classA);
-    var classB = ElementFactory.classElement("B", typeA);
-    classA.supertype = interfaceTypeStar(classB);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[
-      classA,
-      classB
-    ];
-    expect(typeA.lookUpSetter("s", library), isNull);
-  }
-
-  @deprecated
-  void test_lookUpSetter_unimplemented() {
-    //
-    // class A {}
-    //
-    var classA = class_(name: 'A');
-    InterfaceType typeA = interfaceTypeStar(classA);
-    LibraryElementImpl library = ElementFactory.library(analysisContext, "lib");
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    (unit as CompilationUnitElementImpl).classes = <ClassElement>[classA];
-    expect(typeA.lookUpSetter("s", library), isNull);
-  }
-
   void test_resolveToBound() {
     var type = interfaceTypeStar(ElementFactory.classElement2('A'));
 
diff --git a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
index 853eb50..82433a76 100644
--- a/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
+++ b/pkg/analyzer/test/src/dart/element/generic_inferrer_test.dart
@@ -642,7 +642,7 @@
 
     var reporter = ErrorReporter(
       listener,
-      NonExistingSource('/test.dart', toUri('/test.dart'), UriKind.FILE_URI),
+      NonExistingSource('/test.dart', toUri('/test.dart')),
       isNonNullableByDefault: false,
     );
 
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 7a04577..4044e88 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -2,10 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/dart/micro/cider_byte_store.dart';
-import 'package:analyzer/src/dart/micro/library_graph.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
+import 'package:analyzer/src/dart/micro/utils.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:test/test.dart';
@@ -390,10 +393,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(6, aPath);
+    var result = fileResolver.findReferences(_findElement(6, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [6]),
-      CiderSearchMatch(bPath, [42])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 11)]),
+      CiderSearchMatch(aPath, [CharacterLocation(1, 7)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -411,9 +414,10 @@
 ''');
 
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(16, aPath);
+    var result = fileResolver.findReferences(_findElement(16, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [16, 53])
+      CiderSearchMatch(
+          aPath, [CharacterLocation(2, 7), CharacterLocation(5, 5)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -429,9 +433,10 @@
 ''');
 
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(11, aPath);
+    var result = fileResolver.findReferences(_findElement(11, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [11, 28])
+      CiderSearchMatch(
+          aPath, [CharacterLocation(2, 3), CharacterLocation(5, 1)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -454,10 +459,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(20, aPath);
+    var result = fileResolver.findReferences(_findElement(20, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [20]),
-      CiderSearchMatch(bPath, [56])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 15)]),
+      CiderSearchMatch(aPath, [CharacterLocation(2, 11)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -473,9 +478,10 @@
 }
 ''');
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(39, aPath);
+    var result = fileResolver.findReferences(_findElement(39, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [39, 62])
+      CiderSearchMatch(
+          aPath, [CharacterLocation(3, 9), CharacterLocation(4, 11)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -505,10 +511,11 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(17, aPath);
+    var result = fileResolver.findReferences(_findElement(17, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [17, 68]),
-      CiderSearchMatch(bPath, [46])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 5)]),
+      CiderSearchMatch(
+          aPath, [CharacterLocation(2, 8), CharacterLocation(7, 4)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -531,10 +538,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(21, aPath);
+    var result = fileResolver.findReferences(_findElement(21, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [21]),
-      CiderSearchMatch(bPath, [46])
+      CiderSearchMatch(bPath, [CharacterLocation(5, 5)]),
+      CiderSearchMatch(aPath, [CharacterLocation(2, 12)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -558,10 +565,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(19, aPath);
+    var result = fileResolver.findReferences(_findElement(19, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [19]),
-      CiderSearchMatch(bPath, [39])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 13)]),
+      CiderSearchMatch(aPath, [CharacterLocation(3, 9)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -585,10 +592,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(20, aPath);
+    var result = fileResolver.findReferences(_findElement(20, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [20]),
-      CiderSearchMatch(bPath, [29])
+      CiderSearchMatch(bPath, [CharacterLocation(4, 3)]),
+      CiderSearchMatch(aPath, [CharacterLocation(3, 10)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -605,9 +612,10 @@
 ''');
 
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(10, aPath);
+    var result = fileResolver.findReferences(_findElement(10, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [10, 43])
+      CiderSearchMatch(
+          aPath, [CharacterLocation(1, 11), CharacterLocation(4, 11)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -622,14 +630,18 @@
 }
 ''');
     await resolveFile(aPath);
-    var result = fileResolver.findReferences(10, aPath);
+    var result = fileResolver.findReferences(_findElement(10, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [10, 22, 40])
+      CiderSearchMatch(aPath, [
+        CharacterLocation(1, 11),
+        CharacterLocation(2, 8),
+        CharacterLocation(4, 12)
+      ])
     ];
     expect(result.map((e) => e.path),
         unorderedEquals(expected.map((e) => e.path)));
-    expect(result.map((e) => e.offsets),
-        unorderedEquals(expected.map((e) => e.offsets)));
+    expect(result.map((e) => e.startPositions),
+        unorderedEquals(expected.map((e) => e.startPositions)));
   }
 
   test_findReferences_typedef() async {
@@ -646,10 +658,10 @@
 ''');
 
     await resolveFile(bPath);
-    var result = fileResolver.findReferences(8, aPath);
+    var result = fileResolver.findReferences(_findElement(8, aPath));
     var expected = <CiderSearchMatch>[
-      CiderSearchMatch(aPath, [8]),
-      CiderSearchMatch(bPath, [25])
+      CiderSearchMatch(bPath, [CharacterLocation(3, 8)]),
+      CiderSearchMatch(aPath, [CharacterLocation(1, 9)])
     ];
     expect(result, unorderedEquals(expected));
   }
@@ -755,8 +767,7 @@
       var files = fileResolver.getFilesWithTopLevelDeclarations('a');
       expect(files, hasLength(1));
       var file = files.single;
-      expect(file.file.path, result.path);
-      expect(file.kind, FileTopLevelDeclarationKind.variable);
+      expect(file.path, result.path);
     }
 
     // Ask to check that it works when parsed.
@@ -1266,4 +1277,11 @@
   void _assertRemovedPaths(Matcher matcher) {
     expect(fileResolver.fsState!.testView.removedPaths, matcher);
   }
+
+  Element _findElement(int offset, String filePath) {
+    var resolvedUnit = fileResolver.resolve(path: filePath);
+    var node = NodeLocator(offset).searchWithin(resolvedUnit.unit);
+    var element = getElementOfNode(node);
+    return element!;
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/comment_test.dart b/pkg/analyzer/test/src/dart/resolution/comment_test.dart
index 3d386b9..16fa635 100644
--- a/pkg/analyzer/test/src/dart/resolution/comment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/comment_test.dart
@@ -9,29 +9,476 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(CommentDriverResolutionTest);
+    defineReflectiveTests(CommentDriverResolution_PrefixedIdentifierTest);
+    defineReflectiveTests(CommentDriverResolution_PropertyAccessTest);
+    defineReflectiveTests(CommentDriverResolution_SimpleIdentifierTest);
   });
 }
 
 @reflectiveTest
-class CommentDriverResolutionTest extends PubPackageResolutionTest {
-  test_error_unqualifiedReferenceToNonLocalStaticMember() async {
-    await assertNoErrorsInCode(r'''
+class CommentDriverResolution_PrefixedIdentifierTest
+    extends PubPackageResolutionTest {
+  test_class_constructor_named() async {
+    // TODO(srawlins): improve coverage regarding constructors, operators, the
+    // 'new' keyword, and members on an extension on a type variable
+    // (`extension <T> on T`).
+    await assertNoErrorsInCode('''
+class A {
+  A.named();
+}
+
+/// [A.named]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.named]'), findElement.class_('A'));
+    assertElement(findNode.simple('named]'), findElement.constructor('named'));
+  }
+
+  test_class_constructor_unnamedViaNew() async {
+    await assertNoErrorsInCode('''
+class A {
+  A();
+}
+
+/// [A.new]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.new'), findElement.class_('A'));
+    assertElement(findNode.simple('new]'), findElement.unnamedConstructor('A'));
+  }
+
+  test_class_instanceGetter() async {
+    await assertNoErrorsInCode('''
+class A {
+  int get foo => 0;
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_class_instanceMethod() async {
+    await assertNoErrorsInCode('''
+class A {
+  void foo() {}
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_class_instanceSetter() async {
+    await assertNoErrorsInCode('''
+class A {
+  set foo(int _) {}
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_class_staticGetter() async {
+    await assertNoErrorsInCode('''
+class A {
+  static int get foo => 0;
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_class_staticMethod() async {
+    await assertNoErrorsInCode('''
 class A {
   static void foo() {}
 }
 
-/// [foo]
-class B extends A {}
+/// [A.foo]
+void f() {}
 ''');
 
-    assertElement(
-      findNode.simple('foo]'),
-      findElement.method('foo', of: 'A'),
-    );
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
   }
 
-  test_identifier_beforeClass() async {
+  test_class_staticSetter() async {
+    await assertNoErrorsInCode('''
+class A {
+  static set foo(int _) {}
+}
+
+/// [A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_extension_instanceGetter() async {
+    await assertNoErrorsInCode('''
+extension E on int {
+  int get foo => 0;
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_extension_instanceMethod() async {
+    await assertNoErrorsInCode('''
+extension E on int {
+  void foo() {}
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_extension_instanceSetter() async {
+    await assertNoErrorsInCode('''
+extension E on int {
+  set foo(int _) {}
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_extension_staticGetter() async {
+    await assertNoErrorsInCode('''
+extension E on int {
+  static int get foo => 0;
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_extension_staticMethod() async {
+    await assertNoErrorsInCode('''
+extension E on int {
+  static void foo() {}
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_extension_staticSetter() async {
+    await assertNoErrorsInCode('''
+extension E on int {
+  static set foo(int _) {}
+}
+
+/// [E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+}
+
+@reflectiveTest
+class CommentDriverResolution_PropertyAccessTest
+    extends PubPackageResolutionTest {
+  test_class_constructor_named() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+class A {
+  A.named();
+}
+
+/// [self.A.named]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.A.named'), findElement.prefix('self'));
+    assertElement(findNode.simple('A.named]'), findElement.class_('A'));
+    // TODO(srawlins): Set the type of named, and test it, here and below.
+    assertElement(findNode.simple('named]'), findElement.constructor('named'));
+  }
+
+  test_class_constructor_unnamedViaNew() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+class A {
+  A();
+}
+
+/// [self.A.new]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.A.new'), findElement.prefix('self'));
+    assertElement(findNode.simple('A.new'), findElement.class_('A'));
+    assertElement(findNode.simple('new]'), findElement.unnamedConstructor('A'));
+  }
+
+  test_class_instanceGetter() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+class A {
+  int get foo => 0;
+}
+
+/// [self.A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.A.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_class_instanceMethod() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+class A {
+  void foo() {}
+}
+
+/// [self.A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.A.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_class_instanceSetter() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+class A {
+  set foo(int value) {}
+}
+
+/// [self.A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.A.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_class_staticGetter() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+class A {
+  static int get foo => 0;
+}
+
+/// [self.A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.A.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_class_staticMethod() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+class A {
+  static void foo() {}
+}
+
+/// [self.A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.A.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_class_staticSetter() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+class A {
+  static set foo(int value) {}
+}
+
+/// [self.A.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.A.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_extension_instanceGetter() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+extension E on int {
+  int get foo => 0;
+}
+
+/// [self.E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.E.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_extension_instanceMethod() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+extension E on int {
+  void foo() {}
+}
+
+/// [self.E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.E.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_extension_instanceSetter() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+extension E on int {
+  set foo(int value) {}
+}
+
+/// [self.E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.E.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_extension_staticGetter() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+extension E on int {
+  static int get foo => 0;
+}
+
+/// [self.E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.E.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
+  }
+
+  test_extension_staticMethod() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+extension E on int {
+  static void foo() {}
+}
+
+/// [self.E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.E.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.method('foo'));
+  }
+
+  test_extension_staticSetter() async {
+    await assertNoErrorsInCode('''
+import '' as self;
+extension E on int {
+  static set foo(int value) {}
+}
+
+/// [self.E.foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('self.E.foo'), findElement.prefix('self'));
+    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+}
+
+@reflectiveTest
+class CommentDriverResolution_SimpleIdentifierTest
+    extends PubPackageResolutionTest {
+  test_associatedSetterAndGetter() async {
+    await assertNoErrorsInCode('''
+int get foo => 0;
+
+set foo(int value) {}
+
+/// [foo]
+void f() {}
+''');
+
+    assertElement(findNode.simple('foo]'), findElement.topGet('foo'));
+  }
+
+  test_associatedSetterAndGetter_setterInScope() async {
+    await assertNoErrorsInCode('''
+extension E1 on int {
+  int get foo => 0;
+}
+
+/// [foo]
+extension E2 on int {
+  set foo(int value) {}
+}
+''');
+
+    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
+  }
+
+  test_beforeClass() async {
     await assertNoErrorsInCode(r'''
 /// [foo]
 class A {
@@ -45,7 +492,7 @@
     );
   }
 
-  test_identifier_beforeConstructor() async {
+  test_beforeConstructor() async {
     await assertNoErrorsInCode(r'''
 class A {
   /// [p]
@@ -58,7 +505,7 @@
     );
   }
 
-  test_identifier_beforeEnum() async {
+  test_beforeEnum() async {
     await assertNoErrorsInCode(r'''
 /// This is the [Samurai] kind.
 enum Samurai {
@@ -82,7 +529,7 @@
     );
   }
 
-  test_identifier_beforeFunction_blockBody() async {
+  test_beforeFunction_blockBody() async {
     await assertNoErrorsInCode(r'''
 /// [p]
 foo(int p) {}
@@ -94,7 +541,7 @@
     );
   }
 
-  test_identifier_beforeFunction_expressionBody() async {
+  test_beforeFunction_expressionBody() async {
     await assertNoErrorsInCode(r'''
 /// [p]
 foo(int p) => null;
@@ -106,7 +553,7 @@
     );
   }
 
-  test_identifier_beforeFunctionTypeAlias() async {
+  test_beforeFunctionTypeAlias() async {
     await assertNoErrorsInCode(r'''
 /// [p]
 typedef Foo(int p);
@@ -118,7 +565,7 @@
     );
   }
 
-  test_identifier_beforeGenericTypeAlias() async {
+  test_beforeGenericTypeAlias() async {
     await assertNoErrorsInCode(r'''
 /// Can resolve [T], [S], and [p].
 typedef Foo<T> = Function<S>(int p);
@@ -135,7 +582,7 @@
     );
   }
 
-  test_identifier_beforeGetter() async {
+  test_beforeGetter() async {
     await assertNoErrorsInCode(r'''
 /// [int]
 get g => null;
@@ -144,7 +591,7 @@
     assertElement(findNode.simple('int]'), intElement);
   }
 
-  test_identifier_beforeMethod() async {
+  test_beforeMethod() async {
     await assertNoErrorsInCode(r'''
 abstract class A {
   /// [p1]
@@ -168,206 +615,7 @@
     assertElement(findNode.simple('p5]'), findElement.parameter('p5'));
   }
 
-  test_identifier_class_instanceGetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  int get foo => 0;
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
-  }
-
-  test_identifier_class_instanceMethod() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  void foo() {}
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.method('foo'));
-  }
-
-  test_identifier_class_instanceSetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  set foo(int _) {}
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
-  }
-
-  test_identifier_class_staticGetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static int get foo => 0;
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
-  }
-
-  test_identifier_class_staticMethod() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static void foo() {}
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.method('foo'));
-  }
-
-  test_identifier_class_staticSetter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  static set foo(int _) {}
-}
-
-/// [A.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('A.foo'), findElement.class_('A'));
-    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
-  }
-
-  test_identifier_extension_instanceGetter() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  int get foo => 0;
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
-  }
-
-  test_identifier_extension_instanceMethod() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  void foo() {}
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.method('foo'));
-  }
-
-  test_identifier_extension_instanceSetter() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  set foo(int _) {}
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
-  }
-
-  test_identifier_extension_staticGetter() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  static int get foo => 0;
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.getter('foo'));
-  }
-
-  test_identifier_extension_staticMethod() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  static void foo() {}
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.method('foo'));
-  }
-
-  test_identifier_extension_staticSetter() async {
-    await assertNoErrorsInCode(r'''
-extension E on int {
-  static set foo(int _) {}
-}
-
-/// [E.foo]
-void f() {}
-''');
-
-    assertElement(findNode.simple('E.foo'), findElement.extension_('E'));
-    assertElement(findNode.simple('foo]'), findElement.setter('foo'));
-  }
-
-  test_identifier_parameter_functionTyped() async {
-    await assertNoErrorsInCode(r'''
-/// [bar]
-foo(int bar()) {}
-''');
-
-    assertElement(
-      findNode.simple('bar]'),
-      findElement.parameter('bar'),
-    );
-  }
-
-  test_identifier_setter() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  /// [x] in A
-  mA() {}
-  set x(value) {}
-}
-
-class B extends A {
-  /// [x] in B
-  mB() {}
-}
-''');
-
-    var x = findElement.setter('x', of: 'A');
-    assertElement(findNode.simple('x] in A'), x);
-    assertElement(findNode.simple('x] in B'), x);
-  }
-
-  test_new() async {
+  test_newKeyword() async {
     await assertErrorsInCode('''
 class A {
   A();
@@ -394,4 +642,51 @@
       findElement.constructor('named', of: 'A'),
     );
   }
+
+  test_parameter_functionTyped() async {
+    await assertNoErrorsInCode(r'''
+/// [bar]
+foo(int bar()) {}
+''');
+
+    assertElement(
+      findNode.simple('bar]'),
+      findElement.parameter('bar'),
+    );
+  }
+
+  test_setter() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  /// [x] in A
+  mA() {}
+  set x(value) {}
+}
+
+class B extends A {
+  /// [x] in B
+  mB() {}
+}
+''');
+
+    var x = findElement.setter('x', of: 'A');
+    assertElement(findNode.simple('x] in A'), x);
+    assertElement(findNode.simple('x] in B'), x);
+  }
+
+  test_unqualifiedReferenceToNonLocalStaticMember() async {
+    await assertNoErrorsInCode('''
+class A {
+  static void foo() {}
+}
+
+/// [foo]
+class B extends A {}
+''');
+
+    assertElement(
+      findNode.simple('foo]'),
+      findElement.method('foo', of: 'A'),
+    );
+  }
 }
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 148433e..7d2c061 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -36,6 +36,7 @@
   final bool implicitCasts;
   final bool implicitDynamic;
   final List<String> lints;
+  final bool strictCasts;
   final bool strictInference;
   final bool strictRawTypes;
   final List<String> unignorableNames;
@@ -45,6 +46,7 @@
     this.implicitCasts = true,
     this.implicitDynamic = true,
     this.lints = const [],
+    this.strictCasts = false,
     this.strictInference = false,
     this.strictRawTypes = false,
     this.unignorableNames = const [],
@@ -59,8 +61,9 @@
       buffer.writeln('    - $experiment');
     }
     buffer.writeln('  language:');
-    buffer.writeln('    strict-raw-types: $strictRawTypes');
+    buffer.writeln('    strict-casts: $strictCasts');
     buffer.writeln('    strict-inference: $strictInference');
+    buffer.writeln('    strict-raw-types: $strictRawTypes');
     buffer.writeln('  strong-mode:');
     buffer.writeln('    implicit-casts: $implicitCasts');
     buffer.writeln('    implicit-dynamic: $implicitDynamic');
@@ -256,6 +259,7 @@
   List<String> get experiments => [
         EnableString.constructor_tearoffs,
         EnableString.named_arguments_anywhere,
+        EnableString.super_parameters,
       ];
 
   /// The path that is not in [workspaceRootPath], contains external packages.
@@ -393,13 +397,14 @@
 }
 
 mixin WithNoImplicitCastsMixin on PubPackageResolutionTest {
+  /// Asserts that no errors are reported in [code] when implicit casts are
+  /// allowed, and that [expectedErrors] are reported for the same [code] when
+  /// implicit casts are not allowed.
   Future<void> assertErrorsWithNoImplicitCasts(
     String code,
-    List<ExpectedError> expectedErrorsWhenImplicitCastsDisabled,
+    List<ExpectedError> expectedErrors,
   ) async {
-    newFile(testFilePath, content: code);
-
-    await resolveTestFile();
+    await resolveTestCode(code);
     assertNoErrorsInResult();
 
     disposeAnalysisContextCollection();
@@ -411,8 +416,13 @@
     );
 
     await resolveTestFile();
-    assertErrorsInResult(expectedErrorsWhenImplicitCastsDisabled);
+    assertErrorsInResult(expectedErrors);
   }
+
+  /// Asserts that no errors are reported in [code], both when implicit casts
+  /// are allowed and when implicit casts are not allowed.
+  Future<void> assertNoErrorsWithNoImplicitCasts(String code) async =>
+      assertErrorsWithNoImplicitCasts(code, []);
 }
 
 mixin WithoutConstructorTearoffsMixin on PubPackageResolutionTest {
@@ -427,3 +437,32 @@
   @override
   bool get typeToStringWithNullability => false;
 }
+
+mixin WithStrictCastsMixin on PubPackageResolutionTest {
+  /// Asserts that no errors are reported in [code] when implicit casts are
+  /// allowed, and that [expectedErrors] are reported for the same [code] when
+  /// implicit casts are not allowed.
+  Future<void> assertErrorsWithStrictCasts(
+    String code,
+    List<ExpectedError> expectedErrors,
+  ) async {
+    await resolveTestCode(code);
+    assertNoErrorsInResult();
+
+    disposeAnalysisContextCollection();
+
+    writeTestPackageAnalysisOptionsFile(
+      AnalysisOptionsFileConfig(
+        strictCasts: true,
+      ),
+    );
+
+    await resolveTestFile();
+    assertErrorsInResult(expectedErrors);
+  }
+
+  /// Asserts that no errors are reported in [code], both when implicit casts
+  /// are allowed and when implicit casts are not allowed.
+  Future<void> assertNoErrorsWithStrictCasts(String code) async =>
+      assertErrorsWithStrictCasts(code, []);
+}
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 fc226d1..a2dab45 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -311,13 +311,33 @@
 var x = A.foo<int>;
 ''', [
       error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR, 42,
-          5),
+          5,
+          messageContains: ["'A.foo'"]),
     ]);
 
     assertFunctionReference(findNode.functionReference('A.foo<int>;'),
         findElement.constructor('foo'), 'dynamic');
   }
 
+  test_constructorReference_prefixed() async {
+    await assertErrorsInCode('''
+import 'dart:async' as a;
+var x = a.Future.delayed<int>;
+''', [
+      error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR, 50,
+          5,
+          messageContains: ["'a.Future.delayed'"]),
+    ]);
+    assertFunctionReference(
+        findNode.functionReference('a.Future.delayed<int>;'),
+        findElement
+            .import('dart:async')
+            .importedLibrary!
+            .getType('Future')!
+            .getNamedConstructor('delayed'),
+        'dynamic');
+  }
+
   test_dynamicTyped() async {
     await assertErrorsInCode('''
 dynamic i = 1;
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 feac804..5175800 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -305,42 +305,48 @@
 
   test_namedArgument_anywhere() async {
     await assertNoErrorsInCode('''
-class A {
-  A(int a, double b, {bool? c, bool? d});
+class A {}
+class B {}
+class C {}
+class D {}
+
+class X {
+  X(A a, B b, {C? c, D? d});
 }
 
+T g1<T>() => throw 0;
+T g2<T>() => throw 0;
+T g3<T>() => throw 0;
+T g4<T>() => throw 0;
+
 void f() {
-  A(0, c: true, 1.2, d: true);
+  X(g1(), c: g3(), g2(), d: g4());
 }
 ''');
 
     assertInstanceCreation(
-      findNode.instanceCreation('A(0'),
-      findElement.class_('A'),
-      'A',
+      findNode.instanceCreation('X(g'),
+      findElement.class_('X'),
+      'X',
     );
 
-    assertParameterElement(
-      findNode.integerLiteral('0'),
-      findElement.parameter('a'),
-    );
+    var g1 = findNode.methodInvocation('g1()');
+    assertType(g1, 'A');
+    assertParameterElement(g1, findElement.parameter('a'));
 
-    assertParameterElement(
-      findNode.doubleLiteral('1.2'),
-      findElement.parameter('b'),
-    );
+    var g2 = findNode.methodInvocation('g2()');
+    assertType(g2, 'B');
+    assertParameterElement(g2, findElement.parameter('b'));
 
-    assertParameterElement(
-      findNode.namedExpression('c: true'),
-      findElement.parameter('c'),
-    );
-    assertNamedParameterRef('c: true', 'c');
+    var named_g3 = findNode.namedExpression('c: g3()');
+    assertType(named_g3.expression, 'C?');
+    assertParameterElement(named_g3, findElement.parameter('c'));
+    assertNamedParameterRef('c:', 'c');
 
-    assertParameterElement(
-      findNode.namedExpression('d: true'),
-      findElement.parameter('d'),
-    );
-    assertNamedParameterRef('d: true', 'd');
+    var named_g4 = findNode.namedExpression('d: g4()');
+    assertType(named_g4.expression, 'D?');
+    assertParameterElement(named_g4, findElement.parameter('d'));
+    assertNamedParameterRef('d:', 'd');
   }
 
   test_typeAlias_generic_class_generic_named_infer_all() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index 7c96192..b17dc6f 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -128,7 +128,7 @@
           rightParenthesis: )
         constructorName: ConstructorName
           staticElement: self::@class::A::@constructor::•
-          type: TypeName
+          type: NamedType
             name: SimpleIdentifier
               staticElement: self::@class::A
               staticType: null
@@ -804,7 +804,7 @@
     token: A
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -855,7 +855,7 @@
     token: A
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1202,7 +1202,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1515,7 +1515,7 @@
     staticType: null
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1580,7 +1580,7 @@
     staticType: null
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1679,7 +1679,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1744,7 +1744,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1911,7 +1911,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
@@ -1965,7 +1965,7 @@
     token: B
   typeArguments: TypeArgumentList
     arguments
-      TypeName
+      NamedType
         name: SimpleIdentifier
           staticElement: dart:core::@class::int
           staticType: null
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 32d8c5d..c564c0c 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -2865,40 +2865,46 @@
 
   test_namedArgument_anywhere() async {
     await assertNoErrorsInCode('''
-void foo(int a, double b, {bool? c, bool? d}) {}
+class A {}
+class B {}
+class C {}
+class D {}
+
+void foo(A a, B b, {C? c, D? d}) {}
+
+T g1<T>() => throw 0;
+T g2<T>() => throw 0;
+T g3<T>() => throw 0;
+T g4<T>() => throw 0;
 
 void f() {
-  foo(0, c: true, 1.2, d: true);
+  foo(g1(), c: g3(), g2(), d: g4());
 }
 ''');
 
     assertMethodInvocation(
-      findNode.methodInvocation('foo(0'),
+      findNode.methodInvocation('foo(g'),
       findElement.topFunction('foo'),
-      'void Function(int, double, {bool? c, bool? d})',
+      'void Function(A, B, {C? c, D? d})',
     );
 
-    assertParameterElement(
-      findNode.integerLiteral('0'),
-      findElement.parameter('a'),
-    );
+    var g1 = findNode.methodInvocation('g1()');
+    assertType(g1, 'A');
+    assertParameterElement(g1, findElement.parameter('a'));
 
-    assertParameterElement(
-      findNode.doubleLiteral('1.2'),
-      findElement.parameter('b'),
-    );
+    var g2 = findNode.methodInvocation('g2()');
+    assertType(g2, 'B');
+    assertParameterElement(g2, findElement.parameter('b'));
 
-    assertParameterElement(
-      findNode.namedExpression('c: true'),
-      findElement.parameter('c'),
-    );
-    assertNamedParameterRef('c: true', 'c');
+    var named_g3 = findNode.namedExpression('c: g3()');
+    assertType(named_g3.expression, 'C?');
+    assertParameterElement(named_g3, findElement.parameter('c'));
+    assertNamedParameterRef('c:', 'c');
 
-    assertParameterElement(
-      findNode.namedExpression('d: true'),
-      findElement.parameter('d'),
-    );
-    assertNamedParameterRef('d: true', 'd');
+    var named_g4 = findNode.namedExpression('d: g4()');
+    assertType(named_g4.expression, 'D?');
+    assertParameterElement(named_g4, findElement.parameter('d'));
+    assertNamedParameterRef('d:', 'd');
   }
 
   test_nullShorting_cascade_firstMethodInvocation() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart b/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart
new file mode 100644
index 0000000..6a24380
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/super_formal_parameter_test.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/test_utilities/find_element.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SuperFormalParameterTest);
+  });
+}
+
+@reflectiveTest
+class SuperFormalParameterTest extends PubPackageResolutionTest {
+  test_functionTyped() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(Object a);
+}
+
+class B extends A {
+  B(super.a<T>(int b));
+}
+''');
+
+    var B = findElement.unnamedConstructor('B');
+    var element = B.superFormalParameter('a');
+
+    assertElement(
+      findNode.superFormalParameter('super.a'),
+      element,
+    );
+
+    assertElement(
+      findNode.typeParameter('T>'),
+      element.typeParameters[0],
+    );
+
+    assertElement(
+      findNode.simpleFormalParameter('b));'),
+      element.parameters[0],
+    );
+  }
+
+  test_invalid_notConstructor() async {
+    await assertNoErrorsInCode(r'''
+void f(super.a) {}
+''');
+
+    var f = findElement.topFunction('f');
+    var element = f.superFormalParameter('a');
+    assertTypeDynamic(element.type);
+
+    assertElement(
+      findNode.superFormalParameter('super.a'),
+      element,
+    );
+  }
+
+  test_optionalNamed() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({int? a});
+}
+
+class B extends A {
+  B({super.a});
+}
+''');
+
+    assertElement(
+      findNode.superFormalParameter('super.a'),
+      findElement.unnamedConstructor('B').superFormalParameter('a'),
+    );
+  }
+
+  test_optionalPositional() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A([int? a]);
+}
+
+class B extends A {
+  B([super.a]);
+}
+''');
+
+    assertElement(
+      findNode.superFormalParameter('super.a'),
+      findElement.unnamedConstructor('B').superFormalParameter('a'),
+    );
+  }
+
+  test_requiredNamed() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A({required int a});
+}
+
+class B extends A {
+  B({required super.a});
+}
+''');
+
+    assertElement(
+      findNode.superFormalParameter('super.a'),
+      findElement.unnamedConstructor('B').superFormalParameter('a'),
+    );
+  }
+
+  test_requiredPositional() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  A(int a);
+}
+
+class B extends A {
+  B(super.a);
+}
+''');
+
+    assertElement(
+      findNode.superFormalParameter('super.a'),
+      findElement.unnamedConstructor('B').superFormalParameter('a'),
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index 0c72655..759b9e5 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -58,6 +58,7 @@
 import 'prefixed_identifier_test.dart' as prefixed_identifier;
 import 'property_access_test.dart' as property_access;
 import 'simple_identifier_test.dart' as simple_identifier;
+import 'super_formal_parameter_test.dart' as super_formal_parameter;
 import 'top_level_variable_test.dart' as top_level_variable;
 import 'top_type_inference_test.dart' as top_type_inference;
 import 'try_statement_test.dart' as try_statement;
@@ -119,6 +120,7 @@
     prefixed_identifier.main();
     property_access.main();
     simple_identifier.main();
+    super_formal_parameter.main();
     top_level_variable.main();
     top_type_inference.main();
     try_statement.main();
diff --git a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
index 6af1989..6e9b9ef 100644
--- a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
@@ -122,17 +122,6 @@
 
 @reflectiveTest
 class FolderBasedDartSdkTest with ResourceProviderMixin {
-  void test_addExtensions() {
-    FolderBasedDartSdk sdk = _createDartSdk();
-    String uri = 'dart:my.internal';
-    sdk.addExtensions({uri: '/Users/user/dart/my.dart'});
-    expect(sdk.mapDartUri(uri), isNotNull);
-    // The `shortName` property must include the `dart:` prefix.
-    expect(sdk.sdkLibraries, contains(predicate((SdkLibrary library) {
-      return library.shortName == uri;
-    })));
-  }
-
   void test_creation() {
     FolderBasedDartSdk sdk = _createDartSdk();
     expect(sdk, isNotNull);
@@ -150,7 +139,6 @@
         .getChildAssumingFile("core.dart")
         .toUri())!;
     expect(source, isNotNull);
-    expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:core");
   }
 
@@ -161,7 +149,6 @@
     File file = dirDartium.getChildAssumingFile("html_dart2js.dart");
     var source = sdk.fromFileUri(file.toUri())!;
     expect(source, isNotNull);
-    expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:html");
   }
 
@@ -172,7 +159,6 @@
     File file = dirCommon.getChildAssumingFile("html_common_dart2js.dart");
     var source = sdk.fromFileUri(file.toUri())!;
     expect(source, isNotNull);
-    expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:html_common");
   }
 
@@ -183,7 +169,6 @@
         .getChildAssumingFile("num.dart")
         .toUri())!;
     expect(source, isNotNull);
-    expect(source.isInSystemLibrary, isTrue);
     expect(source.uri.toString(), "dart:core/num.dart");
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart b/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart
new file mode 100644
index 0000000..746ce71
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/abi_specific_integer_mapping_test.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/ffi_code.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AbiSpecificIntegerMappingTest);
+  });
+}
+
+@reflectiveTest
+class AbiSpecificIntegerMappingTest extends PubPackageResolutionTest {
+  test_doubleMapping() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({})
+@AbiSpecificIntegerMapping({})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''', [
+      error(FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA, 51, 25),
+    ]);
+  }
+
+  test_invalidMapping() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: IntPtr(),
+  Abi.androidIA32: UintPtr(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''', [
+      error(FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED, 20, 25),
+    ]);
+  }
+
+  test_noMapping() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''', [
+      error(FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING, 25, 7),
+    ]);
+  }
+
+  test_singleMapping() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''');
+  }
+
+  test_validMapping() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 60ca6a0..226eafa 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -11,8 +11,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ArgumentTypeNotAssignableTest);
-    defineReflectiveTests(ArgumentTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        ArgumentTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(ArgumentTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(ArgumentTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -656,7 +658,7 @@
 }
 
 @reflectiveTest
-class ArgumentTypeNotAssignableWithNoImplicitCastsTest
+class ArgumentTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_functionCall() async {
@@ -708,3 +710,28 @@
     ]);
   }
 }
+
+@reflectiveTest
+class ArgumentTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_functionCall() async {
+    await assertErrorsWithStrictCasts('''
+void f(int i) {}
+void foo(dynamic a) {
+  f(a);
+}
+''', [
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 43, 1),
+    ]);
+  }
+
+  test_operator() async {
+    await assertErrorsWithStrictCasts('''
+void foo(int i, dynamic a) {
+  i + a;
+}
+''', [
+      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 35, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_nullable_test.dart b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_nullable_test.dart
new file mode 100644
index 0000000..3925f45
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_nullable_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(BodyMightCompleteNormallyNullableTest);
+  });
+}
+
+@reflectiveTest
+class BodyMightCompleteNormallyNullableTest extends PubPackageResolutionTest {
+  test_function_async_block_futureOrIntQuestion() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+FutureOr<int?> f(Future f) async {}
+''', [
+      error(HintCode.BODY_MIGHT_COMPLETE_NORMALLY_NULLABLE, 36, 1),
+    ]);
+  }
+
+  test_function_async_block_futureOrVoid() async {
+    await assertNoErrorsInCode('''
+import 'dart:async';
+FutureOr<void> f(Future f) async {}
+''');
+  }
+
+  test_function_async_block_void() async {
+    await assertNoErrorsInCode('''
+import 'dart:async';
+void f(Future f) async {}
+''');
+  }
+
+  test_function_sync_block_dynamic() async {
+    await assertNoErrorsInCode('''
+dynamic f() {}
+''');
+  }
+
+  test_function_sync_block_intQuestion() async {
+    await assertErrorsInCode('''
+int? f() {}
+''', [
+      error(HintCode.BODY_MIGHT_COMPLETE_NORMALLY_NULLABLE, 5, 1),
+    ]);
+  }
+
+  test_function_sync_block_intQuestion_definiteReturn() async {
+    await assertNoErrorsInCode('''
+int? f() {
+  return null;
+}
+''');
+  }
+
+  test_function_sync_block_Null() async {
+    await assertNoErrorsInCode('''
+Null f() {}
+''');
+  }
+
+  test_function_sync_block_void() async {
+    await assertNoErrorsInCode('''
+void f() {}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
index e223720..973910e 100644
--- a/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/body_might_complete_normally_test.dart
@@ -222,16 +222,6 @@
 ''');
   }
 
-  test_functionExpression_nullable_blockBody() async {
-    await assertNoErrorsInCode(r'''
-main() {
-  int? Function() foo = () {
-  };
-  foo;
-}
-''');
-  }
-
   test_generativeConstructor_blockBody() async {
     await assertNoErrorsInCode(r'''
 class A {
@@ -350,14 +340,6 @@
 ''');
   }
 
-  test_method_nullable_blockBody() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  int? foo() {}
-}
-''');
-  }
-
   test_method_nullable_blockBody_return() async {
     await assertNoErrorsInCode(r'''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
index f9bcac1..cdd3c81 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
@@ -288,6 +288,20 @@
       error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 46, 5),
     ]);
   }
+
+  test_unknown_conditionalExpression_unknownCondition() async {
+    await assertNoErrorsInCode(r'''
+const bool kIsWeb = identical(0, 0.0);
+
+void f() {
+  const A(kIsWeb ? 0 : 1);
+}
+
+class A {
+  const A(int _);
+}
+''');
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart
index 8acf4e9..b4bcb41 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_num_string_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -17,21 +16,14 @@
 @reflectiveTest
 class ConstEvalTypeBoolNumStringTest extends PubPackageResolutionTest {
   test_equal() async {
-    await assertErrorsInCode(
-        r'''
+    await assertNoErrorsInCode(r'''
 class A {
   const A();
 }
 
 const num a = 0;
 const b = a == const A();
-''',
-        IsEnabledByDefault.constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING, 53,
-                    14),
-              ]);
+''');
   }
 
   test_notEqual() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
index ee5737d..90bd671 100644
--- a/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_with_undefined_constructor_test.dart
@@ -24,7 +24,23 @@
   return const A.noSuchConstructor();
 }
 ''', [
-      error(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, 48, 17),
+      error(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, 48, 17,
+          messageContains: ["class 'A'", "constructor 'noSuchConstructor'"]),
+    ]);
+  }
+
+  test_named_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:async' as a;
+f() {
+  return const a.Future.noSuchConstructor();
+}
+''', [
+      error(CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, 56, 17,
+          messageContains: [
+            "class 'a.Future'",
+            "constructor 'noSuchConstructor'"
+          ]),
     ]);
   }
 
@@ -53,7 +69,26 @@
 }
 ''', [
       error(
-          CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 51, 1),
+          CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 51, 1,
+          messageContains: ["'A'"]),
+    ]);
+  }
+
+  test_unnamed_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+class A {
+  const A.name();
+}
+''');
+    await assertErrorsInCode(r'''
+import 'lib1.dart' as lib1;
+f() {
+  return const lib1.A();
+}
+''', [
+      error(
+          CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 49, 6,
+          messageContains: ["'lib1.A'"]),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
index 07abbcd..767bfa9 100644
--- a/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
@@ -10,7 +10,9 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FieldInitializerNotAssignableTest);
-    defineReflectiveTests(FieldInitializerNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        FieldInitializerNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
+    defineReflectiveTests(FieldInitializerNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -53,14 +55,34 @@
 }
 
 @reflectiveTest
-class FieldInitializerNotAssignableWithNoImplicitCastsTest
+class FieldInitializerNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_constructorInitializer() async {
-    await assertErrorsWithNoImplicitCasts(
-      'class A { int i; A(num n) : i = n; }',
+    await assertErrorsWithNoImplicitCasts('''
+class A {
+  int i;
+  A(num n) : i = n;
+}
+''', [
+      error(CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 36, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class FieldInitializerNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_constructorInitializer() async {
+    await assertErrorsWithStrictCasts(
+      '''
+class A {
+  int i;
+  A(dynamic a) : i = a;
+}
+''',
       [
-        error(CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 32, 1),
+        error(CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 40, 1),
       ],
     );
   }
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
index c75dd89..31ecd85 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(ForInOfInvalidTypeTest);
     defineReflectiveTests(ForInOfInvalidTypeWithoutNullSafetyTest);
+    defineReflectiveTests(ForInOfInvalidTypeWithStrictCastsTest);
   });
 }
 
@@ -183,3 +184,19 @@
 ''');
   }
 }
+
+@reflectiveTest
+class ForInOfInvalidTypeWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_forIn() async {
+    await assertErrorsWithStrictCasts('''
+f(dynamic e) {
+  for (var id in e) {
+    id;
+  }
+}
+''', [
+      error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 32, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
index 68e338d..f154d5d 100644
--- a/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/generic_struct_subclass_test.dart
@@ -22,7 +22,7 @@
   external Pointer notEmpty;
 }
 ''', [
-      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1),
+      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1, messageContains: ["'S'"]),
     ]);
   }
 
@@ -33,7 +33,7 @@
   external Pointer notEmpty;
 }
 ''', [
-      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1),
+      error(FfiCode.GENERIC_STRUCT_SUBCLASS, 25, 1, messageContains: ["'S'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
index 01e30f0..1d56d74 100644
--- a/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
@@ -17,7 +17,9 @@
 class IllegalAsyncReturnTypeTest extends PubPackageResolutionTest {
   test_function_nonFuture() async {
     await assertErrorsInCode('''
-int f() async {}
+int f() async {
+  return 1;
+}
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
     ]);
@@ -53,7 +55,9 @@
   test_method_nonFuture() async {
     await assertErrorsInCode('''
 class C {
-  int m() async {}
+  int m() async {
+    return 1;
+  }
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 12, 3),
diff --git a/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart
index fd002a6..1bfd680 100644
--- a/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implicit_dynamic_field_test.dart
@@ -49,7 +49,8 @@
   final f = (<dynamic>[])[0];
 }
 ''', [
-      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 18, 20),
+      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 18, 20,
+          messageContains: ["'f'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/initializer_for_non_existent_field_test.dart b/pkg/analyzer/test/src/diagnostics/initializer_for_non_existent_field_test.dart
index 43361f5..e2b6231 100644
--- a/pkg/analyzer/test/src/diagnostics/initializer_for_non_existent_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/initializer_for_non_existent_field_test.dart
@@ -24,7 +24,20 @@
 }
 A a = const A();
 ''', [
-      error(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 24, 9),
+      error(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 24, 9,
+          messageContains: ["'x'"]),
+    ]);
+  }
+
+  test_getter() async {
+    await assertErrorsInCode('''
+class A {
+  int get x => 0;
+  A() : x = 0;
+}
+''', [
+      error(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 36, 5,
+          messageContains: ["'x'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/initializer_for_static_field_test.dart b/pkg/analyzer/test/src/diagnostics/initializer_for_static_field_test.dart
index 6acd087..d556c0b 100644
--- a/pkg/analyzer/test/src/diagnostics/initializer_for_static_field_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/initializer_for_static_field_test.dart
@@ -33,7 +33,8 @@
   A() : x = 0 {}
 }
 ''', [
-      error(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, 38, 5),
+      error(CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, 38, 5,
+          messageContains: ["'x'"]),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
index a72d21b..00abc76 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_test.dart
@@ -110,6 +110,40 @@
     ]);
   }
 
+  test_localVariable_const() async {
+    await assertNoErrorsInCode(r'''
+void f() {
+  const a = 0;
+  @a
+  var b; // ignore:unused_local_variable
+}
+''');
+  }
+
+  test_localVariable_const_withArguments() async {
+    await assertErrorsInCode(r'''
+void f() {
+  const a = 0;
+  @a(0)
+  var b; // ignore:unused_local_variable
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ANNOTATION, 28, 5),
+    ]);
+  }
+
+  test_localVariable_final() async {
+    await assertErrorsInCode(r'''
+void f() {
+  final a = 0;
+  @a
+  var b; // ignore:unused_local_variable
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ANNOTATION, 28, 2),
+    ]);
+  }
+
   test_notClass_importWithPrefix() async {
     newFile('$testPackageLibPath/annotations.dart', content: r'''
 class Property {
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index a303efd..726f456 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -11,8 +11,10 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(InvalidAssignment_ImplicitCallReferenceTest);
     defineReflectiveTests(InvalidAssignmentTest);
-    defineReflectiveTests(InvalidAssignmentWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        InvalidAssignmentWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(InvalidAssignmentWithoutNullSafetyTest);
+    defineReflectiveTests(InvalidAssignmentWithStrictCastsTest);
   });
 }
 
@@ -962,24 +964,27 @@
 }
 
 @reflectiveTest
-class InvalidAssignmentWithNoImplicitCastsTest extends PubPackageResolutionTest
+class InvalidAssignmentWithoutNullSafetyAndNoImplicitCastsTest
+    extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_assignment() async {
-    await assertErrorsWithNoImplicitCasts(
-      'void f(num n, int i) { i = n;}',
-      [
-        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 27, 1),
-      ],
-    );
+    await assertErrorsWithNoImplicitCasts('''
+void f(num n, int i) {
+  i = n;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 29, 1),
+    ]);
   }
 
   test_compoundAssignment() async {
-    await assertErrorsWithNoImplicitCasts(
-      'void f(num n, int i) { i += n; }',
-      [
-        error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 28, 1),
-      ],
-    );
+    await assertErrorsWithNoImplicitCasts('''
+void f(num n, int i) {
+  i += n;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 30, 1),
+    ]);
   }
 
   @failingTest
@@ -1008,11 +1013,11 @@
 
   test_numericOps() async {
     // Regression test for https://github.com/dart-lang/sdk/issues/26912
-    await assertErrorsWithNoImplicitCasts(r'''
+    await assertNoErrorsWithNoImplicitCasts('''
 void f(int x, int y) {
   x += y;
 }
-''', []);
+''');
   }
 
   @failingTest
@@ -1088,3 +1093,16 @@
     ]);
   }
 }
+
+@reflectiveTest
+class InvalidAssignmentWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_assignment() async {
+    await assertErrorsWithStrictCasts('''
+dynamic a;
+int b = a;
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_of_non_virtual_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_of_non_virtual_member_test.dart
index 10a52f8..7c31b18 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_of_non_virtual_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_of_non_virtual_member_test.dart
@@ -35,7 +35,8 @@
   int g = 0;
 }
 ''', [
-      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 113, 1),
+      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 113, 1,
+          messageContains: ["member 'g'", "in 'C'"]),
     ]);
   }
 
@@ -70,7 +71,8 @@
   int get g => 0;
 }
 ''', [
-      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 117, 1),
+      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 117, 1,
+          messageContains: ["member 'g'", "in 'C'"]),
     ]);
   }
 
@@ -228,7 +230,8 @@
   void f() {}
 }
 ''', [
-      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 111, 1),
+      error(HintCode.INVALID_OVERRIDE_OF_NON_VIRTUAL_MEMBER, 111, 1,
+          messageContains: ["member 'f'", "in 'M'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart
deleted file mode 100644
index 078fecf..0000000
--- a/pkg/analyzer/test/src/diagnostics/invalid_super_invocation_test.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/error/codes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/context_collection_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(InvalidSuperInvocationTest);
-  });
-}
-
-@reflectiveTest
-class InvalidSuperInvocationTest extends PubPackageResolutionTest {
-  test_superBeforeAssert() async {
-    await assertErrorsInCode(r'''
-class A {
-  A(int? x) : super(), assert(x != null);
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 24, 5),
-    ]);
-  }
-
-  test_superBeforeAssignment() async {
-    await assertErrorsInCode(r'''
-class A {
-  final int x;
-  A() : super(), x = 1;
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 33, 5),
-    ]);
-  }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_list_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_list_test.dart
index a47fffd..85db5dc 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_list_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_list_test.dart
@@ -23,7 +23,8 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST, 39, 1),
+      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST, 39, 1,
+          messageContains: ["'E'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_map_test.dart
index 3c75e1d..d12b1e8 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_map_test.dart
@@ -23,7 +23,8 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP, 39, 1),
+      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP, 39, 1,
+          messageContains: ["'E'"]),
     ]);
   }
 
@@ -45,7 +46,8 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP, 47, 1),
+      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP, 47, 1,
+          messageContains: ["'E'"]),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_set_test.dart
index fe0c076..69d6881 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_type_argument_in_const_set_test.dart
@@ -23,7 +23,8 @@
   }
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET, 39, 1),
+      error(CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET, 39, 1,
+          messageContains: ["'E'"]),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_test.dart
new file mode 100644
index 0000000..20b7d5c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_test.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/hint_codes.g.dart';
+import 'package:analyzer/src/error/codes.g.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidUseOfCovariantTest);
+  });
+}
+
+@reflectiveTest
+class InvalidUseOfCovariantTest extends PubPackageResolutionTest {
+  test_functionExpression() async {
+    await assertErrorsInCode('''
+Function f = (covariant int x) {};
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 14, 9),
+    ]);
+  }
+
+  test_functionType_inFunctionTypedParameterOfInstanceMethod() async {
+    await assertErrorsInCode('''
+class C {
+  void m(void p(covariant int)) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 26, 9),
+    ]);
+  }
+
+  test_functionType_inParameterOfInstanceMethod() async {
+    await assertErrorsInCode('''
+class C {
+  void m(void Function(covariant int) p) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 33, 9),
+    ]);
+  }
+
+  test_functionType_inTypeAlias() async {
+    await assertErrorsInCode('''
+typedef F = void Function(covariant int);
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 26, 9),
+    ]);
+  }
+
+  test_functionType_inTypeArgument() async {
+    await assertErrorsInCode('''
+List<void Function(covariant int)> a = [];
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 19, 9),
+      // TODO(srawlins): Recover better from this situation (`covariant` in
+      // parameter in type argument).
+      error(ParserErrorCode.EXPECTED_EXECUTABLE, 43, 1),
+    ]);
+  }
+
+  test_functionType_inTypeParameterBound() async {
+    await assertErrorsInCode('''
+void foo<T extends void Function(covariant int)>() {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 33, 9),
+      // TODO(srawlins): Recover better from this situation (`covariant` in
+      // parameter in bound).
+      error(ParserErrorCode.EXPECTED_EXECUTABLE, 54, 1),
+    ]);
+  }
+
+  test_localFunction() async {
+    await assertErrorsInCode('''
+void foo() {
+  void f(covariant int x) {}
+}
+''', [
+      error(HintCode.UNUSED_ELEMENT, 20, 1),
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, 22, 9),
+    ]);
+  }
+
+  test_staticFunction() async {
+    await assertErrorsInCode('''
+class C {
+  static void m(covariant int x) {}
+}
+''', [
+      // INVALID_USE_OF_COVARIANT is not reported here; it would be redundant.
+      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 26, 9),
+    ]);
+  }
+
+  test_staticFunction_onMixin() async {
+    await assertErrorsInCode('''
+mixin M {
+  static void m(covariant int x) {}
+}
+''', [
+      // INVALID_USE_OF_COVARIANT is not reported here; it would be redundant.
+      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 26, 9),
+    ]);
+  }
+
+  test_topLevelFunction() async {
+    await assertErrorsInCode('''
+void f(covariant int x) {}
+''', [
+      // INVALID_USE_OF_COVARIANT is not reported here; it would be redundant.
+      error(ParserErrorCode.EXTRANEOUS_MODIFIER, 7, 9),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
index 8d45f28..6a85dc3 100644
--- a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListElementTypeNotAssignableTest);
-    defineReflectiveTests(ListElementTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        ListElementTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(ListElementTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(ListElementTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -233,7 +235,7 @@
 }
 
 @reflectiveTest
-class ListElementTypeNotAssignableWithNoImplicitCastsTest
+class ListElementTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_ifElement_falseBranch_dynamic() async {
@@ -291,3 +293,37 @@
 class ListElementTypeNotAssignableWithoutNullSafetyTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, ListElementTypeNotAssignableTestCases {}
+
+@reflectiveTest
+class ListElementTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_ifElement_falseBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int>[if (c) 0 else a];
+}
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 50, 1),
+    ]);
+  }
+
+  test_ifElement_trueBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int>[if (c) a];
+}
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 43, 1),
+    ]);
+  }
+
+  test_spread() async {
+    await assertErrorsWithStrictCasts('''
+void f(Iterable<dynamic> a) {
+  <int>[...a];
+}
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 41, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
index 1216de7..ca3c915 100644
--- a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapKeyTypeNotAssignableTest);
-    defineReflectiveTests(MapKeyTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        MapKeyTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(MapKeyTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(MapKeyTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -238,7 +240,7 @@
 }
 
 @reflectiveTest
-class MapKeyTypeNotAssignableWithNoImplicitCastsTest
+class MapKeyTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_ifElement_falseBranch_key_dynamic() async {
@@ -302,3 +304,37 @@
 ''');
   }
 }
+
+@reflectiveTest
+class MapKeyTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_ifElement_falseBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int, int>{if (c) 0: 0 else a: 0};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 58, 1),
+    ]);
+  }
+
+  test_ifElement_trueBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int, int>{if (c) a: 0 };
+}
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 48, 1),
+    ]);
+  }
+
+  test_spread() async {
+    await assertErrorsWithStrictCasts('''
+void f(Map<dynamic, int> a) {
+  <int, int>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 46, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
index 212b70b..4cebc25 100644
--- a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapValueTypeNotAssignableTest);
-    defineReflectiveTests(MapValueTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        MapValueTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(MapValueTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(MapValueTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -232,7 +234,7 @@
 }
 
 @reflectiveTest
-class MapValueTypeNotAssignableWithNoImplicitCastsTest
+class MapValueTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_ifElement_falseBranch_value_dynamic() async {
@@ -296,3 +298,37 @@
 ''');
   }
 }
+
+@reflectiveTest
+class MapValueTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_ifElement_falseBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int, int>{if (c) 0: 0 else 0: a};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 61, 1),
+    ]);
+  }
+
+  test_ifElement_trueBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int, int>{if (c) 0: a};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 51, 1),
+    ]);
+  }
+
+  test_spread() async {
+    await assertErrorsWithStrictCasts('''
+void f(Map<int, dynamic> a) {
+  <int, int>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 46, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/missing_return_test.dart b/pkg/analyzer/test/src/diagnostics/missing_return_test.dart
index 7fbed0b..9f75275 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_return_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_return_test.dart
@@ -140,7 +140,7 @@
   }
 
   test_functionExpression_sync_dynamic() async {
-    await assertNoErrorsInCode(r'''
+    await assertNoErrorsInCode('''
 Function() f = () {};
 ''');
   }
@@ -153,7 +153,7 @@
 
   test_localFunction_sync_dynamic() async {
     await assertNoErrorsInCode(r'''
-main() {
+void foo() {
   f() {}
   f;
 }
@@ -217,7 +217,26 @@
 
 @reflectiveTest
 class MissingReturnWithNullSafetyTest extends PubPackageResolutionTest {
-  test_returnNever() async {
+  test_function_async_block_futureOrVoid() async {
+    await assertNoErrorsInCode('''
+import 'dart:async';
+FutureOr<void> f() async {}
+''');
+  }
+
+  test_function_async_block_void() async {
+    await assertNoErrorsInCode('''
+void f() async {}
+''');
+  }
+
+  test_function_sync_block_dynamic() async {
+    await assertNoErrorsInCode('''
+dynamic f() {}
+''');
+  }
+
+  test_function_sync_block_Never() async {
     newFile('$testPackageLibPath/a.dart', content: r'''
 Never foo() {
   throw 0;
@@ -232,4 +251,16 @@
 }
 ''');
   }
+
+  test_function_sync_block_Null() async {
+    await assertNoErrorsInCode('''
+Null f() {}
+''');
+  }
+
+  test_function_sync_block_void() async {
+    await assertNoErrorsInCode('''
+void f() {}
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart b/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
index 8147f29..ef8d48e 100644
--- a/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/multiple_super_initializers_test.dart
@@ -15,14 +15,22 @@
 
 @reflectiveTest
 class MultipleSuperInitializersTest extends PubPackageResolutionTest {
+  test_oneSuperInitializer() async {
+    await assertNoErrorsInCode('''
+class A {}
+class B extends A {
+  B() : super() {}
+}
+''');
+  }
+
   test_twoSuperInitializers() async {
-    await assertErrorsInCode(r'''
+    await assertErrorsInCode('''
 class A {}
 class B extends A {
   B() : super(), super() {}
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 39, 5),
       error(CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, 48, 7),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart
index 4ebf06c..4a7c777 100644
--- a/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart
@@ -30,7 +30,8 @@
   new A();
 }
 ''', [
-      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 38, 1),
+      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 38, 1,
+          messageContains: ["'A'"]),
     ]);
   }
 
@@ -47,6 +48,24 @@
     ]);
   }
 
+  test_default_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+class A {
+  A.name() {}
+}
+''');
+    await assertErrorsInCode('''
+import 'lib1.dart' as lib1;
+
+f() {
+  new lib1.A();
+}
+''', [
+      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 41, 6,
+          messageContains: ["'lib1.A'"]),
+    ]);
+  }
+
   test_default_unnamedViaNew() async {
     await assertErrorsInCode('''
 class A {
@@ -102,7 +121,25 @@
   new A.name();
 }
 ''', [
-      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, 35, 4),
+      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, 35, 4,
+          messageContains: ["class 'A'", "named 'name'"]),
+    ]);
+  }
+
+  test_named_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+class A {
+  A() {}
+}
+''');
+    await assertErrorsInCode('''
+import 'lib1.dart' as lib1;
+f() {
+  new lib1.A.name();
+}
+''', [
+      error(CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, 47, 4,
+          messageContains: ["class 'lib1.A'", "named 'name'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
index 0e9e5de..3f99747 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolConditionTest);
-    defineReflectiveTests(NonBoolConditionWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        NonBoolConditionWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(NonBoolConditionWithNullSafetyTest);
+    defineReflectiveTests(NonBoolConditionWithStrictCastsTest);
   });
 }
 
@@ -26,6 +28,21 @@
     ]);
   }
 
+  test_conditional_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() { return [1, 2, 3] ? 2 : 1; }
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 9),
+    ]);
+  }
+
+  test_conditional_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+Object o;
+f() { return o ? 2 : 1; }
+''');
+  }
+
   test_do() async {
     await assertErrorsInCode(r'''
 f() {
@@ -36,6 +53,26 @@
     ]);
   }
 
+  test_do_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+Object o;
+f() {
+  do {} while ([1, 2, 3]);
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 31, 9),
+    ]);
+  }
+
+  test_do_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+Object o;
+f() {
+  do {} while (o);
+}
+''');
+  }
+
   test_for() async {
     // https://github.com/dart-lang/sdk/issues/24713
     await assertErrorsInCode(r'''
@@ -71,6 +108,25 @@
     ]);
   }
 
+  test_for_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() {
+  for (;[1, 2, 3];) {}
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 14, 9),
+    ]);
+  }
+
+  test_for_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+Object o;
+f() {
+  for (;o;) {}
+}
+''');
+  }
+
   test_forElement() async {
     await assertErrorsInCode('''
 var v = [for (; 0;) 1];
@@ -89,6 +145,24 @@
     ]);
   }
 
+  test_if_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() {
+  if ([1, 2, 3]) return 2; else return 1;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 12, 9),
+    ]);
+  }
+
+  test_if_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+f(Object o) {
+  if (o) return 2; else return 1;
+}
+''');
+  }
+
   test_ifElement() async {
     await assertErrorsInCode('''
 var v = [if (3) 1];
@@ -97,6 +171,21 @@
     ]);
   }
 
+  test_ifElement_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+var v = [if ([1, 2, 3]) 'x'];
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 9),
+    ]);
+  }
+
+  test_ifElement_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+Object o;
+var v = [if (o) 'x'];
+''');
+  }
+
   test_while() async {
     await assertErrorsInCode(r'''
 f() {
@@ -106,10 +195,52 @@
       error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 1),
     ]);
   }
+
+  test_while_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() {
+  while ([1, 2, 3]) {}
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 9),
+    ]);
+  }
+
+  test_while_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+f(Object o) {
+  while (o) {}
+}
+''');
+  }
 }
 
 @reflectiveTest
-class NonBoolConditionWithNoImplicitCastsTest extends PubPackageResolutionTest
+class NonBoolConditionWithNullSafetyTest extends PubPackageResolutionTest {
+  test_if_null() async {
+    await assertErrorsInCode(r'''
+void f(Null a) {
+  if (a) {}
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 23, 1),
+    ]);
+  }
+
+  test_ternary_condition_null() async {
+    await assertErrorsInCode(r'''
+void f(Null a) {
+  a ? 0 : 1;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 19, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class NonBoolConditionWithoutNullSafetyAndNoImplicitCastsTest
+    extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_map_ifElement_condition_dynamic() async {
     await assertErrorsWithNoImplicitCasts(r'''
@@ -153,26 +284,25 @@
 }
 
 @reflectiveTest
-class NonBoolConditionWithNullSafetyTest extends PubPackageResolutionTest {
-  test_if_null() async {
-    await assertErrorsInCode(r'''
-m() {
-  Null x;
-  if (x) {}
+class NonBoolConditionWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_map_ifElement_condition() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic c) {
+  <int, int>{if (c) 0: 0};
 }
 ''', [
-      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 22, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 37, 1),
     ]);
   }
 
-  test_ternary_condition_null() async {
-    await assertErrorsInCode(r'''
-m() {
-  Null x;
-  x ? 0 : 1;
+  test_set_ifElement_condition() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic c) {
+  <int>{if (c) 0};
 }
 ''', [
-      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 18, 1),
+      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 32, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
index 0a12cfb..1305b0d 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
@@ -10,6 +10,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolExpressionTest);
+    defineReflectiveTests(NonBoolExpressionWithStrictCastsTest);
   });
 }
 
@@ -47,3 +48,17 @@
     ]);
   }
 }
+
+@reflectiveTest
+class NonBoolExpressionWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_assert() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  assert(a);
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_EXPRESSION, 29, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
index 2d2c516..f0578ad 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolNegationExpressionTest);
     defineReflectiveTests(NonBoolNegationExpressionWithNullSafetyTest);
+    defineReflectiveTests(NonBoolNegationExpressionWithStrictCastsTest);
   });
 }
 
@@ -26,20 +27,50 @@
       error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 9, 2),
     ]);
   }
+
+  test_nonBool_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+f() {
+  ![1, 2, 3];
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 9, 9),
+    ]);
+  }
+
+  test_nonBool_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+f(Object o) {
+  !o;
+}
+''');
+  }
 }
 
 @reflectiveTest
 class NonBoolNegationExpressionWithNullSafetyTest
     extends PubPackageResolutionTest {
   test_null() async {
-    await assertErrorsInCode(r'''
-m() {
-  Null x;
+    await assertErrorsInCode('''
+void m(Null x) {
   !x;
 }
 ''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
-      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 19, 1),
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 20, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class NonBoolNegationExpressionWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_negation() async {
+    await assertErrorsWithStrictCasts(r'''
+void f(dynamic a) {
+  !a;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 23, 1),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
index f3d16b1..1b25120 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolOperandTest);
     defineReflectiveTests(NonBoolOperandWithNullSafetyTest);
+    defineReflectiveTests(NonBoolOperandWithStrictCastsTest);
   });
 }
 
@@ -27,6 +28,34 @@
     ]);
   }
 
+  test_and_left_implicitCast_fromInstanceCreationExpression() async {
+    await assertErrorsInCode('''
+main() {
+  new Object() && true;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 11, 12),
+    ]);
+  }
+
+  test_and_left_implicitCast_fromLiteral() async {
+    await assertErrorsInCode('''
+bool f(List<int> left, bool right) {
+  return left && right;
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 46, 4),
+    ]);
+  }
+
+  test_and_left_implicitCast_fromSupertype() async {
+    await assertNoErrorsInCode('''
+bool f(Object left, bool right) {
+  return left && right;
+}
+''');
+  }
+
   test_and_right() async {
     await assertErrorsInCode(r'''
 bool f(bool left, String right) {
@@ -82,3 +111,17 @@
     ]);
   }
 }
+
+@reflectiveTest
+class NonBoolOperandWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_and() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  if(a && true) {}
+}
+''', [
+      error(CompileTimeErrorCode.NON_BOOL_OPERAND, 25, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
index d81a21a..d968410 100644
--- a/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_iterable_spread_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NotIterableSpreadTest);
     defineReflectiveTests(NotIterableSpreadWithoutNullSafetyTest);
+    defineReflectiveTests(NotIterableSpreadWithStrictCastsTest);
   });
 }
 
@@ -112,3 +113,27 @@
 @reflectiveTest
 class NotIterableSpreadWithoutNullSafetyTest extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, NotIterableSpreadTestCases {}
+
+@reflectiveTest
+class NotIterableSpreadWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_list() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  [...a];
+}
+''', [
+      error(CompileTimeErrorCode.NOT_ITERABLE_SPREAD, 26, 1),
+    ]);
+  }
+
+  test_set() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  <int>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.NOT_ITERABLE_SPREAD, 31, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart b/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
index 3c008f9..aa8cf06 100644
--- a/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_map_spread_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NotMapSpreadTest);
     defineReflectiveTests(NotMapSpreadWithoutNullSafetyTest);
+    defineReflectiveTests(NotMapSpreadWithStrictCastsTest);
   });
 }
 
@@ -102,3 +103,17 @@
 @reflectiveTest
 class NotMapSpreadWithoutNullSafetyTest extends PubPackageResolutionTest
     with NotMapSpreadTestCases, WithoutNullSafetyMixin {}
+
+@reflectiveTest
+class NotMapSpreadWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_map() async {
+    await assertErrorsWithStrictCasts('''
+void f(dynamic a) {
+  <int, String>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.NOT_MAP_SPREAD, 39, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
index 89bab3f..1a11708 100644
--- a/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ReturnOfInvalidTypeTest);
-    defineReflectiveTests(ReturnOfInvalidTypeWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        ReturnOfInvalidTypeWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(ReturnOfInvalidTypeWithoutNullSafetyTest);
+    defineReflectiveTests(ReturnOfInvalidTypeWithStrictCastsTest);
   });
 }
 
@@ -234,6 +236,15 @@
 ''');
   }
 
+  test_function_asyncStar() async {
+    await assertErrorsInCode('''
+Stream<int> f() async* => 3;
+''', [
+      // RETURN_OF_INVALID_TYPE shouldn't be reported in addition to this error.
+      error(CompileTimeErrorCode.RETURN_IN_GENERATOR, 23, 2),
+    ]);
+  }
+
   test_function_sync_block__to_dynamic() async {
     await assertNoErrorsInCode(r'''
 f() {
@@ -430,6 +441,15 @@
     ]);
   }
 
+  test_function_syncStar() async {
+    await assertErrorsInCode('''
+Iterable<int> f() sync* => 3;
+''', [
+      // RETURN_OF_INVALID_TYPE shouldn't be reported in addition to this error.
+      error(CompileTimeErrorCode.RETURN_IN_GENERATOR, 24, 2),
+    ]);
+  }
+
   test_getter_sync_block_String__to_int() async {
     await assertErrorsInCode('''
 int get g {
@@ -529,7 +549,7 @@
 }
 
 @reflectiveTest
-class ReturnOfInvalidTypeWithNoImplicitCastsTest
+class ReturnOfInvalidTypeWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_return() async {
@@ -553,3 +573,25 @@
 @reflectiveTest
 class ReturnOfInvalidTypeWithoutNullSafetyTest extends PubPackageResolutionTest
     with ReturnOfInvalidTypeTestCases, WithoutNullSafetyMixin {}
+
+@reflectiveTest
+class ReturnOfInvalidTypeWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_return() async {
+    await assertErrorsWithStrictCasts('''
+int f(dynamic a) => a;
+''', [
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 20, 1),
+    ]);
+  }
+
+  test_return_async() async {
+    await assertErrorsWithStrictCasts('''
+Future<int> f(dynamic a) async {
+  return a;
+}
+''', [
+      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 42, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
index a74f2cc..d5cb62b 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
@@ -10,8 +10,10 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetElementTypeNotAssignableTest);
-    defineReflectiveTests(SetElementTypeNotAssignableWithNoImplicitCastsTest);
+    defineReflectiveTests(
+        SetElementTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest);
     defineReflectiveTests(SetElementTypeNotAssignableWithoutNullSafetyTest);
+    defineReflectiveTests(SetElementTypeNotAssignableWithStrictCastsTest);
   });
 }
 
@@ -198,7 +200,7 @@
 }
 
 @reflectiveTest
-class SetElementTypeNotAssignableWithNoImplicitCastsTest
+class SetElementTypeNotAssignableWithoutNullSafetyAndNoImplicitCastsTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, WithNoImplicitCastsMixin {
   test_ifElement_falseBranch_dynamic() async {
@@ -256,3 +258,37 @@
 class SetElementTypeNotAssignableWithoutNullSafetyTest
     extends PubPackageResolutionTest
     with WithoutNullSafetyMixin, SetElementTypeNotAssignableTestCases {}
+
+@reflectiveTest
+class SetElementTypeNotAssignableWithStrictCastsTest
+    extends PubPackageResolutionTest with WithStrictCastsMixin {
+  test_ifElement_falseBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int>{if (c) 0 else a};
+}
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 50, 1),
+    ]);
+  }
+
+  test_ifElement_trueBranch() async {
+    await assertErrorsWithStrictCasts('''
+void f(bool c, dynamic a) {
+  <int>{if (c) a};
+}
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 43, 1),
+    ]);
+  }
+
+  test_spread() async {
+    await assertErrorsWithStrictCasts('''
+void f(Iterable<dynamic> a) {
+  <int>{...a};
+}
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 41, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
index 6e19801..63d6735 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart
@@ -154,7 +154,18 @@
 import 'dart:ffi';
 class C implements Double {}
 ''', [
-      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS, 38, 6),
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS, 38, 6,
+          messageContains: ["class 'C'", "implement 'Double'"]),
+    ]);
+  }
+
+  test_Double_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi' as ffi;
+class C implements ffi.Double {}
+''', [
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS, 45, 10,
+          messageContains: ["class 'C'", "implement 'ffi.Double'"]),
     ]);
   }
 
@@ -285,7 +296,20 @@
 ''', [
       error(CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR, 32, 6),
       error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 32, 6),
-      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH, 32, 6),
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH, 32, 6,
+          messageContains: ["class 'C'", "mix in 'Double'"]),
+    ]);
+  }
+
+  test_Double_prefixed() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi' as ffi;
+class C with ffi.Double {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR, 39, 10),
+      error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 39, 10),
+      error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH, 39, 10,
+          messageContains: ["class 'C'", "mix in 'ffi.Double'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
index 026be64..0d24687 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_struct_class_test.dart
@@ -45,6 +45,23 @@
 
 @reflectiveTest
 class SubtypeOfStructClassInImplementsTest extends PubPackageResolutionTest {
+  test_implements_abi_specific_int() async {
+    await assertErrorsInCode(r'''
+import 'dart:ffi';
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+})
+class AbiSpecificInteger1 extends AbiSpecificInteger {
+  const AbiSpecificInteger1();
+}
+class AbiSpecificInteger4 implements AbiSpecificInteger1 {
+  const AbiSpecificInteger4();
+}
+''', [
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 204, 19),
+    ]);
+  }
+
   test_implements_struct() async {
     await assertErrorsInCode(r'''
 import 'dart:ffi';
@@ -52,7 +69,22 @@
 class C implements S {}
 ''', [
       error(FfiCode.EMPTY_STRUCT, 25, 1),
-      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 64, 1),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 64, 1,
+          messageContains: ["class 'C'", "implement 'S'"]),
+    ]);
+  }
+
+  test_implements_struct_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+import 'dart:ffi';
+class S extends Struct {}
+''');
+    await assertErrorsInCode(r'''
+import 'lib1.dart' as lib1;
+class C implements lib1.S {}
+''', [
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS, 47, 6,
+          messageContains: ["class 'C'", "implement 'lib1.S'"]),
     ]);
   }
 
@@ -78,7 +110,24 @@
 ''', [
       error(FfiCode.EMPTY_STRUCT, 25, 1),
       error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 58, 1),
-      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 58, 1),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 58, 1,
+          messageContains: ["class 'C'", "mix in 'S'"]),
+    ]);
+  }
+
+  test_with_struct_prefixed() async {
+    newFile('$testPackageLibPath/lib1.dart', content: '''
+import 'dart:ffi';
+class S extends Struct {}
+''');
+    await assertErrorsInCode(r'''
+import 'lib1.dart' as lib1;
+
+class C with lib1.S {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, 42, 6),
+      error(FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH, 42, 6,
+          messageContains: ["class 'C'", "mix in 'lib1.S'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/super_in_invalid_context_test.dart b/pkg/analyzer/test/src/diagnostics/super_in_invalid_context_test.dart
index 321b5e8..ca2e979 100644
--- a/pkg/analyzer/test/src/diagnostics/super_in_invalid_context_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/super_in_invalid_context_test.dart
@@ -77,7 +77,7 @@
     ]);
   }
 
-  test_constructorFieldInitializer() async {
+  test_constructorInitializer_field() async {
     await assertErrorsInCode(r'''
 class A {
   m() {}
@@ -91,6 +91,37 @@
     ]);
   }
 
+  test_constructorInitializer_super() async {
+    await assertErrorsInCode(r'''
+class S {
+  final int f;
+  S(this.f);
+}
+
+class C extends S {
+  C() : super(super.f);
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, 75, 5),
+    ]);
+  }
+
+  test_constructorInitializer_this() async {
+    await assertErrorsInCode(r'''
+class S {
+  final int f;
+  S(this.f);
+}
+
+class C extends S {
+  C() : this.other(super.f);
+  C.other(int a) : super(a);
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, 80, 5),
+    ]);
+  }
+
   test_extension_field_static() async {
     await assertErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
index 9fafaa1..c58d414 100644
--- a/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/super_in_redirecting_constructor_test.dart
@@ -33,7 +33,6 @@
   A.name() {}
 }
 ''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 18, 5),
       error(CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR, 18, 7),
     ]);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/super_invocation_not_last_test.dart b/pkg/analyzer/test/src/diagnostics/super_invocation_not_last_test.dart
new file mode 100644
index 0000000..6924087
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/super_invocation_not_last_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SuperInvocationNotLastTest);
+  });
+}
+
+@reflectiveTest
+class SuperInvocationNotLastTest extends PubPackageResolutionTest {
+  test_superBeforeAssert() async {
+    await assertErrorsInCode(r'''
+class A {
+  A(int? x) : super(), assert(x != null);
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST, 24, 5),
+    ]);
+  }
+
+  test_superBeforeAssignment() async {
+    await assertErrorsInCode(r'''
+class A {
+  final int x;
+  A() : super(), x = 1;
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST, 33, 5),
+    ]);
+  }
+
+  test_superIsLast() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  final int x;
+  A() : x = 1, super();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 0331a23..485fb55 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'abi_specific_integer_mapping_test.dart' as abi_specific_integer_mapping;
 import 'abstract_class_member_test.dart' as abstract_class_member;
 import 'abstract_field_constructor_initializer_test.dart'
     as abstract_field_constructor_initializer;
@@ -40,6 +41,8 @@
     as await_in_late_local_variable_initializer;
 import 'await_in_wrong_context_test.dart' as await_in_wrong_context;
 import 'binary_operator_written_out_test.dart' as binary_operator_written_out;
+import 'body_might_complete_normally_nullable_test.dart'
+    as body_might_complete_normally_nullable;
 import 'body_might_complete_normally_test.dart' as body_might_complete_normally;
 import 'built_in_identifier_as_extension_name_test.dart'
     as built_in_as_extension_name;
@@ -344,7 +347,6 @@
     as invalid_required_positional_param;
 import 'invalid_sealed_annotation_test.dart' as invalid_sealed_annotation;
 import 'invalid_super_in_initializer_test.dart' as invalid_super_in_initializer;
-import 'invalid_super_invocation_test.dart' as invalid_super_invocation;
 import 'invalid_type_argument_in_const_list_test.dart'
     as invalid_type_argument_in_const_list;
 import 'invalid_type_argument_in_const_map_test.dart'
@@ -354,6 +356,7 @@
 import 'invalid_uri_test.dart' as invalid_uri;
 import 'invalid_use_of_covariant_in_extension_test.dart'
     as invalid_use_of_covariant_in_extension;
+import 'invalid_use_of_covariant_test.dart' as invalid_use_of_covariant;
 import 'invalid_use_of_internal_member_test.dart'
     as invalid_use_of_internal_member;
 import 'invalid_use_of_protected_member_test.dart'
@@ -624,6 +627,7 @@
 import 'super_in_redirecting_constructor_test.dart'
     as super_in_redirecting_constructor;
 import 'super_initializer_in_object_test.dart' as super_initializer_in_object;
+import 'super_invocation_not_last_test.dart' as super_invocation_not_last;
 import 'switch_case_completes_normally_test.dart'
     as switch_case_completes_normally;
 import 'switch_expression_not_assignable_test.dart'
@@ -720,6 +724,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    abi_specific_integer_mapping.main();
     abstract_class_member.main();
     abstract_field_constructor_initializer.main();
     abstract_field_initializer.main();
@@ -748,6 +753,7 @@
     await_in_late_local_variable_initializer.main();
     await_in_wrong_context.main();
     binary_operator_written_out.main();
+    body_might_complete_normally_nullable.main();
     body_might_complete_normally.main();
     built_in_as_extension_name.main();
     built_in_as_prefix_name.main();
@@ -947,11 +953,11 @@
     invalid_required_positional_param.main();
     invalid_sealed_annotation.main();
     invalid_super_in_initializer.main();
-    invalid_super_invocation.main();
     invalid_type_argument_in_const_list.main();
     invalid_type_argument_in_const_map.main();
     invalid_type_argument_in_const_set.main();
     invalid_uri.main();
+    invalid_use_of_covariant.main();
     invalid_use_of_covariant_in_extension.main();
     invalid_use_of_internal_member.main();
     invalid_use_of_protected_member.main();
@@ -1130,6 +1136,7 @@
     super_in_invalid_context.main();
     super_in_redirecting_constructor.main();
     super_initializer_in_object.main();
+    super_invocation_not_last.main();
     switch_case_completes_normally.main();
     switch_expression_not_assignable.main();
     tearoff_of_generative_constructor_of_abstract_class.main();
diff --git a/pkg/analyzer/test/src/diagnostics/type_annotation_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/type_annotation_deferred_class_test.dart
index c622fb0..b432e45 100644
--- a/pkg/analyzer/test/src/diagnostics/type_annotation_deferred_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_annotation_deferred_class_test.dart
@@ -25,7 +25,8 @@
 class C<T> { const C(); }
 @C<a.D>() main () {}
 ''', [
-      error(CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS, 77, 3),
+      error(CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS, 77, 3,
+          messageContains: ["'a.D'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_constructor_in_initializer_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_constructor_in_initializer_test.dart
index b951089..daee2e5 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_constructor_in_initializer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_constructor_in_initializer_test.dart
@@ -22,7 +22,8 @@
   B() : super.named();
 }
 ''', [
-      error(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, 39, 13),
+      error(CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER, 39, 13,
+          messageContains: ["class 'A'", "named 'named'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
index d97a894..a577c7f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
@@ -36,7 +36,8 @@
 class T {}
 f(T e1) { e1.m = 0; }
 ''', [
-      error(CompileTimeErrorCode.UNDEFINED_SETTER, 24, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 24, 1,
+          messageContains: ["the type 'T'"]),
     ]);
   }
 
@@ -99,7 +100,8 @@
 f(var p) {
   f(C.s = 1);
 }''', [
-      error(CompileTimeErrorCode.UNDEFINED_SETTER, 75, 1),
+      error(CompileTimeErrorCode.UNDEFINED_SETTER, 75, 1,
+          messageContains: ["type 'C'"]),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
index b2827a4..c377ca0 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_element_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:test/expect.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -1699,6 +1700,37 @@
 
 @reflectiveTest
 class UnusedElementWithNullSafetyTest extends PubPackageResolutionTest {
+  test_optionalParameter_isUsed_genericConstructor() async {
+    await assertNoErrorsInCode('''
+class C<T> {
+  C._([int? x]);
+}
+void foo() {
+  C._(7);
+}
+''');
+  }
+
+  test_optionalParameter_isUsed_genericFunction() async {
+    await assertNoErrorsInCode('''
+void _f<T>([int? x]) {}
+void foo() {
+  _f(7);
+}
+''');
+  }
+
+  test_optionalParameter_isUsed_genericMethod() async {
+    await assertNoErrorsInCode('''
+class C {
+  void _m<T>([int? x]) {}
+}
+void foo() {
+  C()._m(7);
+}
+''');
+  }
+
   test_optionalParameter_isUsed_overrideRequiredNamed() async {
     await assertNoErrorsInCode(r'''
 class A {
@@ -1711,6 +1743,49 @@
 ''');
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47839')
+  test_optionalParameter_notUsed_genericConstructor() async {
+    // TODO(srawlins): Change to assertErrorsInCode when this is fixed.
+    addTestFile('''
+class C<T> {
+  C._([int? x]);
+}
+void foo() {
+  C._();
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47839')
+  test_optionalParameter_notUsed_genericFunction() async {
+    // TODO(srawlins): Change to assertErrorsInCode when this is fixed.
+    addTestFile('''
+void _f<T>([int? x]) {}
+void foo() {
+  _f();
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47839')
+  test_optionalParameter_notUsed_genericMethod() async {
+    // TODO(srawlins): Change to assertErrorsInCode when this is fixed.
+    addTestFile('''
+class C {
+  void _m<T>([int? x]) {}
+}
+void foo() {
+  C()._m();
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+  }
+
   test_typeAlias_interfaceType_isUsed_typeName_isExpression() async {
     await assertNoErrorsInCode(r'''
 typedef _A = List<int>;
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 8eec4b2..44ea839 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
@@ -1651,7 +1651,7 @@
   yield* x;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 37, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 37, 1),
       error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE_IN_YIELD_EACH,
           37, 1),
     ]);
diff --git a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
index ddb8c9c..e064365 100644
--- a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
@@ -11,6 +11,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(YieldOfInvalidTypeTest);
     defineReflectiveTests(YieldOfInvalidTypeWithoutNullSafetyTest);
+    defineReflectiveTests(YieldOfInvalidTypeWithStrictCastsTest);
   });
 }
 
@@ -39,7 +40,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, 0, 3),
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 25, 1),
     ]);
   }
 
@@ -58,7 +58,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, 0, 13),
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 1),
     ]);
   }
 
@@ -140,7 +139,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, 0, 3),
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 24, 1),
     ]);
   }
 
@@ -198,7 +196,6 @@
 }
 ''', [
       error(CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, 0, 11),
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 32, 1),
     ]);
   }
 
@@ -246,7 +243,7 @@
   yield* 0;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 22, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 22, 1),
     ]);
   }
 
@@ -257,7 +254,7 @@
   yield* a;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 41, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 41, 1),
     ]);
   }
 
@@ -268,7 +265,7 @@
   yield* a;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 53, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 53, 1),
     ]);
   }
 
@@ -279,7 +276,7 @@
   yield* a;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 56, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 56, 1),
     ]);
   }
 
@@ -303,7 +300,7 @@
 Stream g() => throw 0;
 ''',
         expectedErrorsByNullability(nullable: [
-          error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 34, 3),
+          error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 34, 3),
         ], legacy: []));
   }
 
@@ -335,7 +332,7 @@
 
 Stream<String> g() => throw 0;
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 34, 3),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 34, 3),
     ]);
   }
 
@@ -375,7 +372,7 @@
   yield* 0;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 21, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 21, 1),
     ]);
   }
 
@@ -388,7 +385,7 @@
   f;
 }
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 41, 1),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 41, 1),
     ]);
   }
 
@@ -412,7 +409,7 @@
 Iterable g() => throw 0;
 ''',
         expectedErrorsByNullability(nullable: [
-          error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 3),
+          error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 35, 3),
         ], legacy: []));
   }
 
@@ -444,7 +441,7 @@
 
 Iterable<String> g() => throw 0;
 ''', [
-      error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 3),
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 35, 3),
     ]);
   }
 }
@@ -452,3 +449,27 @@
 @reflectiveTest
 class YieldOfInvalidTypeWithoutNullSafetyTest extends PubPackageResolutionTest
     with YieldOfInvalidTypeTestCases, WithoutNullSafetyMixin {}
+
+@reflectiveTest
+class YieldOfInvalidTypeWithStrictCastsTest extends PubPackageResolutionTest
+    with WithStrictCastsMixin {
+  test_yieldEach_asyncStar() async {
+    await assertErrorsWithStrictCasts('''
+f(dynamic a) async* {
+  yield* a;
+}
+''', [
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 31, 1),
+    ]);
+  }
+
+  test_yieldEach_syncStar() async {
+    await assertErrorsWithStrictCasts('''
+f(dynamic a) sync* {
+  yield* a;
+}
+''', [
+      error(CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE, 30, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
index 4212464..5beaead 100644
--- a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -488,6 +488,29 @@
     expect(result.value!.toIntValue(), 3);
   }
 
+  test_hasValue_constantReference() async {
+    await resolve('''
+const a = 42;
+var x = a;
+''');
+    var result = _evaluateX();
+    expect(result.errors, isEmpty);
+    expect(result.value!.toIntValue(), 42);
+  }
+
+  test_hasValue_constantReference_imported() async {
+    newFile('$testPackageLibPath/a.dart', content: r'''
+const a = 42;
+''');
+    await resolve('''
+import 'a.dart';
+var x = a;
+''');
+    var result = _evaluateX();
+    expect(result.errors, isEmpty);
+    expect(result.value!.toIntValue(), 42);
+  }
+
   test_hasValue_intLiteral() async {
     await resolve('''
 var x = 42;
diff --git a/pkg/analyzer/test/src/lint/pub_test.dart b/pkg/analyzer/test/src/lint/pub_test.dart
index 4e71879..b5fbe2a 100644
--- a/pkg/analyzer/test/src/lint/pub_test.dart
+++ b/pkg/analyzer/test/src/lint/pub_test.dart
@@ -27,6 +27,13 @@
       name: transmogrify
       url: http://your-package-server.com
     version: '>=0.4.0 <1.0.0'
+  transmogrify_optional_name:
+    hosted:
+      url: http://your-package-server.com
+    version: '>=0.4.0 <1.0.0'
+  transmogrify_short_form:
+    hosted: http://your-package-server.com
+    version: '>=0.4.0 <1.0.0'
   analyzer: '0.24.0-dev.1'
   cli_util: '>=0.0.1 <0.1.0'
   semver: '>=0.2.0 <0.3.0'
@@ -41,8 +48,12 @@
 dev_dependencies:
   markdown: '>=0.7.1+2 <0.8.0'
   unittest: '>=0.11.0 <0.12.0'
+  kittens2:
+    git: git://github.com/munificent/kittens2.git
 dependency_overrides:
   foo: 1.2.0
+repository: https://github.com/dart-lang/linter
+issue_tracker: https://github.com/dart-lang/linter/issues
 """;
 
   Pubspec ps = Pubspec.parse(src);
@@ -65,6 +76,10 @@
       });
       testValue('homepage', ps.homepage,
           equals('https://github.com/dart-lang/linter'));
+      testValue('repository', ps.repository,
+          equals('https://github.com/dart-lang/linter'));
+      testValue('issue_tracker', ps.issueTracker,
+          equals('https://github.com/dart-lang/linter/issues'));
       testValue(
           'description', ps.description, equals('Style linter for Dart.'));
       testValue('version', ps.version, equals('0.0.1'));
@@ -108,6 +123,26 @@
         testValueSpan('name', host.name, startOffset: 243, endOffset: 255);
       });
 
+      group('hosted (optional name)', () {
+        PSDependency dep =
+            findDependency(ps.dependencies, name: 'transmogrify_optional_name');
+        PSHost host = dep.host!;
+        test('name', () => expect(host.name, isNull));
+        testValue('url', host.url, equals('http://your-package-server.com'));
+        testKeySpan('url', host.url, startOffset: 376, endOffset: 379);
+        testValueSpan('url', host.url, startOffset: 381, endOffset: 411);
+      });
+
+      group('hosted (short-form)', () {
+        PSDependency dep =
+            findDependency(ps.dependencies, name: 'transmogrify_short_form');
+        PSHost host = dep.host!;
+        test('name', () => expect(host.name, isNull));
+        testValue('url', host.url, equals('http://your-package-server.com'));
+        testKeySpan('url', host.url, startOffset: 473, endOffset: 479);
+        testValueSpan('url', host.url, startOffset: 481, endOffset: 511);
+      });
+
       group('git', () {
         PSDependency dep = findDependency(ps.dependencies, name: 'kittens');
         PSGitRepo git = dep.git!;
@@ -115,6 +150,14 @@
         testValue(
             'url', git.url, equals('git://github.com/munificent/kittens.git'));
       });
+
+      group('git (short form)', () {
+        PSDependency dep = findDependency(ps.devDependencies, name: 'kittens2');
+        PSGitRepo git = dep.git!;
+        test('ref', () => expect(git.ref, isNull));
+        testValue(
+            'url', git.url, equals('git://github.com/munificent/kittens2.git'));
+      });
     });
 //    group('visiting', () {
 //      test('smoke', () {
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 17908dd..357ca89 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -914,6 +914,75 @@
     ]);
   }
 
+  /// https://github.com/dart-lang/sdk/issues/47804
+  test_updated_exported2() async {
+    var a = convertPath('/home/test/lib/a.dart');
+    var b = convertPath('/home/test/lib/b.dart');
+    var c = convertPath('/home/test/lib/c.dart');
+
+    newFile(a, content: r'''
+class A {}
+''');
+    newFile(b, content: r'''
+class B {}
+''');
+    newFile(c, content: r'''
+export 'a.dart';
+export 'b.dart';
+class C {}
+''');
+    tracker.addContext(testAnalysisContext);
+
+    await _doAllTrackerWork();
+    _assertHasLibrary('package:test/c.dart', declarations: [
+      _ExpectedDeclaration.class_('A', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+      _ExpectedDeclaration.class_('B', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+      _ExpectedDeclaration.class_('C', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+    ]);
+
+    changes.clear();
+
+    newFile(a, content: r'''
+class A2 {}
+''');
+    newFile(b, content: r'''
+class B2 {}
+''');
+    tracker.changeFile(a);
+    tracker.changeFile(b);
+    await _doAllTrackerWork();
+
+    // In general it is OK to get duplicate libraries.
+    // But here we notified about both `a.dart` and `b.dart` changes before
+    // performing any work. So, there is no reason do handle `c.dart` twice.
+    var uniquePathSet = <String>{};
+    for (var change in changes) {
+      for (var library in change.changed) {
+        if (!uniquePathSet.add(library.path)) {
+          fail('Not unique path: ${library.path}');
+        }
+      }
+    }
+
+    _assertHasLibrary('package:test/c.dart', declarations: [
+      _ExpectedDeclaration.class_('A2', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+      _ExpectedDeclaration.class_('B2', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+      _ExpectedDeclaration.class_('C', [
+        _ExpectedDeclaration.constructor(''),
+      ]),
+    ]);
+  }
+
   test_updated_library() async {
     var a = convertPath('/home/test/lib/a.dart');
     var b = convertPath('/home/test/lib/b.dart');
diff --git a/pkg/analyzer/test/src/source/source_resource_test.dart b/pkg/analyzer/test/src/source/source_resource_test.dart
index fb3b7b8a..901d10f 100644
--- a/pkg/analyzer/test/src/source/source_resource_test.dart
+++ b/pkg/analyzer/test/src/source/source_resource_test.dart
@@ -83,6 +83,7 @@
     expect(source2.hashCode, source1.hashCode);
   }
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   void test_isInSystemLibrary_contagious() {
     DartSdk sdk = _createSdk();
     UriResolver resolver = DartUriResolver(sdk);
@@ -95,6 +96,7 @@
     expect(partSource.isInSystemLibrary, isTrue);
   }
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   void test_isInSystemLibrary_false() {
     File file = getFile("/does/not/exist.dart");
     FileSource source = FileSource(file);
@@ -159,7 +161,7 @@
     FileSource source = FileSource(file, Uri.parse("dart:core"));
     expect(source, isNotNull);
     expect(source.fullName, file.path);
-    expect(source.isInSystemLibrary, isTrue);
+    expect(source.uri.toString(), 'dart:core');
   }
 
   DartSdk _createSdk() {
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 96d9eb1..4fb0b3a 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -355,6 +355,19 @@
   void _writeConstructorElement(ConstructorElement e) {
     e as ConstructorElementImpl;
 
+    // Check that the reference exists, and filled with the element.
+    var reference = e.reference;
+    if (reference == null) {
+      fail('Every constructor must have a reference.');
+    } else {
+      var classReference = reference.parent!.parent!;
+      // We need this `if` for duplicate declarations.
+      // The reference might be filled by another declaration.
+      if (identical(classReference.element, e.enclosingElement)) {
+        expect(reference.element, same(e));
+      }
+    }
+
     _writeIndentedLine(() {
       _writeIf(e.isSynthetic, 'synthetic ');
       _writeIf(e.isExternal, 'external ');
@@ -385,6 +398,13 @@
         _writeNode,
       );
 
+      var superConstructor = e.superConstructor;
+      if (superConstructor != null) {
+        if (!superConstructor.enclosingElement.isDartCoreObject) {
+          _writeElementReference('superConstructor', superConstructor);
+        }
+      }
+
       var redirectedConstructor = e.redirectedConstructor;
       if (redirectedConstructor != null) {
         _writeElementReference('redirectedConstructor', redirectedConstructor);
@@ -625,7 +645,7 @@
       } else if (e.isOptionalPositional) {
         buffer.write('optionalPositional ');
       } else if (e.isRequiredNamed) {
-        buffer.write('requiredName ');
+        buffer.write('requiredNamed ');
       } else if (e.isOptionalNamed) {
         buffer.write('optionalNamed ');
       }
@@ -636,6 +656,8 @@
 
       if (e is FieldFormalParameterElement) {
         buffer.write('this.');
+      } else if (e is SuperFormalParameterElement) {
+        buffer.write('super.');
       }
 
       _writeName(e);
@@ -649,6 +671,7 @@
       _writeParameterElements(e.parameters);
       _writeConstantInitializer(e);
       _writeNonSyntheticElement(e);
+      _writeSuperConstructorParameter(e);
     });
   }
 
@@ -756,6 +779,17 @@
     });
   }
 
+  void _writeSuperConstructorParameter(ParameterElement e) {
+    if (e is SuperFormalParameterElement) {
+      var superParameter = e.superConstructorParameter;
+      if (superParameter != null) {
+        _writeElementReference('superConstructorParameter', superParameter);
+      } else {
+        _writelnWithIndent('superConstructorParameter: <null>');
+      }
+    }
+  }
+
   void _writeType(DartType type, {String? name}) {
     var typeStr = _typeStr(type);
     if (name != null) {
diff --git a/pkg/analyzer/test/src/summary/in_summary_source_test.dart b/pkg/analyzer/test/src/summary/in_summary_source_test.dart
index 570ebce..0587667 100644
--- a/pkg/analyzer/test/src/summary/in_summary_source_test.dart
+++ b/pkg/analyzer/test/src/summary/in_summary_source_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -19,12 +18,12 @@
   test_InSummarySource() {
     var sourceFactory = SourceFactory([
       InSummaryUriResolver(
-          PhysicalResourceProvider.INSTANCE,
-          MockSummaryDataStore.fake({
-            'package:foo/foo.dart': 'foo.sum',
-            'package:foo/src/foo_impl.dart': 'foo.sum',
-            'package:bar/baz.dart': 'bar.sum',
-          }))
+        MockSummaryDataStore.fake({
+          'package:foo/foo.dart': 'foo.sum',
+          'package:foo/src/foo_impl.dart': 'foo.sum',
+          'package:bar/baz.dart': 'bar.sum',
+        }),
+      )
     ]);
 
     var source =
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 11f3116..3f5806f 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -1036,8 +1036,7 @@
   @override
   void visitNamedType(NamedType node) {
     _writeNextCodeLine(node);
-    // TODO(scheglov) Change to NamedType.
-    _writeln('TypeName');
+    _writeln('NamedType');
     _withIndent(() {
       _writeNode('name', node.name);
       _writeType('type', node.type);
@@ -1439,8 +1438,7 @@
     _writeln('TypeLiteral');
     _withIndent(() {
       var properties = _Properties();
-      // TODO(scheglov) Change to 'type'.
-      properties.addNode('typeName', node.type);
+      properties.addNode('type', node.type);
       _addExpression(properties, node);
       _writeProperties(properties);
     });
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index b1f2a75..3c1a267 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -13,11 +13,13 @@
 import 'package:analyzer/src/dart/element/inheritance_manager3.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/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/informative_data.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/util/uri.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'element_text.dart';
@@ -60,7 +62,7 @@
     for (var sdkLibrary in sdk.sdkLibraries) {
       var source = sourceFactory.resolveUri(null, sdkLibrary.shortName)!;
       var text = getFile(source.fullName).readAsStringSync();
-      var unit = parseText(text, featureSet);
+      var unit = parseText(source, text, featureSet);
 
       var inputUnits = <LinkInputUnit>[];
       _addLibraryUnits(source, unit, inputUnits, featureSet);
@@ -143,7 +145,7 @@
       );
     }
 
-    return elementFactory.libraryOfUri('${source.uri}')!;
+    return elementFactory.libraryOfUri2('${source.uri}');
   }
 
   void setUp() {
@@ -178,7 +180,7 @@
 
         if (partSource != null) {
           var text = _readSafely(partSource.fullName);
-          var unit = parseText(text, featureSet);
+          var unit = parseText(partSource, text, featureSet);
           units.add(
             LinkInputUnit(
               partDirectiveIndex: partDirectiveIndex,
@@ -196,16 +198,14 @@
   void _addNonDartLibraries(
     Set<Source> addedLibraries,
     List<LinkInputLibrary> libraries,
-    Source? source,
+    Source source,
   ) {
-    if (source == null ||
-        source.uri.isScheme('dart') ||
-        !addedLibraries.add(source)) {
+    if (source.uri.isScheme('dart') || !addedLibraries.add(source)) {
       return;
     }
 
     var text = _readSafely(source.fullName);
-    var unit = parseText(text, featureSet);
+    var unit = parseText(source, text, featureSet);
 
     var units = <LinkInputUnit>[];
     _addLibraryUnits(source, unit, units, featureSet);
@@ -217,8 +217,29 @@
     );
 
     void addRelativeUriStr(StringLiteral uriNode) {
-      var uriStr = uriNode.stringValue;
-      var uriSource = sourceFactory.resolveUri(source, uriStr);
+      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);
     }
 
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 25f182d..3d50b66 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -72,8 +72,7 @@
 
   Source addSource(String path, String contents) {
     var file = newFile(path, content: contents);
-    var fileSource = file.createSource();
-    var uri = sourceFactory.restoreUri(fileSource)!;
+    var uri = sourceFactory.pathToUri(file.path)!;
     return sourceFactory.forUri2(uri)!;
   }
 
@@ -98,9 +97,10 @@
   );
 
   static final FeatureSet latestWithExperiments = FeatureSet.fromEnableFlags2(
-    sdkLanguageVersion: Version.parse('2.15.0'),
+    sdkLanguageVersion: Version.parse('2.16.0'),
     flags: [
       EnableString.constructor_tearoffs,
+      EnableString.super_parameters,
     ],
   );
 }
@@ -120,764 +120,6 @@
 ''');
   }
 
-  test_class_alias() async {
-    var library = await checkLibrary('''
-class C = D with E, F, G;
-class D {}
-class E {}
-class F {}
-class G {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class alias C @6
-        supertype: D
-        mixins
-          E
-          F
-          G
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @32
-        constructors
-          synthetic @-1
-      class E @43
-        constructors
-          synthetic @-1
-      class F @54
-        constructors
-          synthetic @-1
-      class G @65
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_abstract() async {
-    var library = await checkLibrary('''
-abstract class C = D with E;
-class D {}
-class E {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      abstract class alias C @15
-        supertype: D
-        mixins
-          E
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @35
-        constructors
-          synthetic @-1
-      class E @46
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_documented() async {
-    var library = await checkLibrary('''
-/**
- * Docs
- */
-class C = D with E;
-
-class D {}
-class E {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class alias C @22
-        documentationComment: /**\n * Docs\n */
-        supertype: D
-        mixins
-          E
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @43
-        constructors
-          synthetic @-1
-      class E @54
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_documented_tripleSlash() async {
-    var library = await checkLibrary('''
-/// aaa
-/// b
-/// cc
-class C = D with E;
-
-class D {}
-class E {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class alias C @27
-        documentationComment: /// aaa\n/// b\n/// cc
-        supertype: D
-        mixins
-          E
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @48
-        constructors
-          synthetic @-1
-      class E @59
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_documented_withLeadingNonDocumentation() async {
-    var library = await checkLibrary('''
-// Extra comment so doc comment offset != 0
-/**
- * Docs
- */
-class C = D with E;
-
-class D {}
-class E {}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class alias C @66
-        documentationComment: /**\n * Docs\n */
-        supertype: D
-        mixins
-          E
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @87
-        constructors
-          synthetic @-1
-      class E @98
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_generic() async {
-    var library = await checkLibrary('''
-class Z = A with B<int>, C<double>;
-class A {}
-class B<B1> {}
-class C<C1> {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class alias Z @6
-        supertype: A
-        mixins
-          B<int>
-          C<double>
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::A::@constructor::•
-                superKeyword: super @0
-      class A @42
-        constructors
-          synthetic @-1
-      class B @53
-        typeParameters
-          covariant B1 @55
-            defaultType: dynamic
-        constructors
-          synthetic @-1
-      class C @68
-        typeParameters
-          covariant C1 @70
-            defaultType: dynamic
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_notSimplyBounded_self() async {
-    var library = await checkLibrary('''
-class C<T extends C> = D with E;
-class D {}
-class E {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      notSimplyBounded class alias C @6
-        typeParameters
-          covariant T @8
-            bound: C<dynamic>
-            defaultType: dynamic
-        supertype: D
-        mixins
-          E
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @39
-        constructors
-          synthetic @-1
-      class E @50
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_notSimplyBounded_simple_no_type_parameter_bound() async {
-    // If no bounds are specified, then the class is simply bounded by syntax
-    // alone, so there is no reason to assign it a slot.
-    var library = await checkLibrary('''
-class C<T> = D with E;
-class D {}
-class E {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class alias C @6
-        typeParameters
-          covariant T @8
-            defaultType: dynamic
-        supertype: D
-        mixins
-          E
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @29
-        constructors
-          synthetic @-1
-      class E @40
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_notSimplyBounded_simple_non_generic() async {
-    // If no type parameters are specified, then the class is simply bounded, so
-    // there is no reason to assign it a slot.
-    var library = await checkLibrary('''
-class C = D with E;
-class D {}
-class E {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class alias C @6
-        supertype: D
-        mixins
-          E
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @26
-        constructors
-          synthetic @-1
-      class E @37
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_alias_with_const_constructors() async {
-    testFile = convertPath('/home/test/lib/test.dart');
-    addLibrarySource('/home/test/lib/a.dart', r'''
-class Base {
-  const Base._priv();
-  const Base();
-  const Base.named();
-}
-''');
-    var library = await checkLibrary('''
-import "a.dart";
-class M {}
-class MixinApp = Base with M;
-''');
-    checkElementText(library, r'''
-library
-  imports
-    package:test/a.dart
-  definingUnit
-    classes
-      class M @23
-        constructors
-          synthetic @-1
-      class alias MixinApp @34
-        supertype: Base
-        mixins
-          M
-        constructors
-          synthetic const @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::•
-                superKeyword: super @0
-          synthetic const named @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: package:test/a.dart::@class::Base::@constructor::named
-                  staticType: null
-                  token: named @-1
-                period: . @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::named
-                superKeyword: super @0
-''');
-  }
-
-  test_class_alias_with_forwarding_constructors() async {
-    testFile = convertPath('/home/test/lib/test.dart');
-    addLibrarySource('/home/test/lib/a.dart', r'''
-class Base {
-  bool x = true;
-  Base._priv();
-  Base();
-  Base.noArgs();
-  Base.requiredArg(x);
-  Base.positionalArg([bool x = true]);
-  Base.positionalArg2([this.x = true]);
-  Base.namedArg({int x = 42});
-  Base.namedArg2({this.x = true});
-  factory Base.fact() => Base();
-  factory Base.fact2() = Base.noArgs;
-}
-''');
-    var library = await checkLibrary('''
-import "a.dart";
-class M {}
-class MixinApp = Base with M;
-''');
-    checkElementText(library, r'''
-library
-  imports
-    package:test/a.dart
-  definingUnit
-    classes
-      class M @23
-        constructors
-          synthetic @-1
-      class alias MixinApp @34
-        supertype: Base
-        mixins
-          M
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::•
-                superKeyword: super @0
-          synthetic noArgs @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: package:test/a.dart::@class::Base::@constructor::noArgs
-                  staticType: null
-                  token: noArgs @-1
-                period: . @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::noArgs
-                superKeyword: super @0
-          synthetic requiredArg @-1
-            parameters
-              requiredPositional x @-1
-                type: dynamic
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    SimpleIdentifier
-                      staticElement: x@-1
-                      staticType: dynamic
-                      token: x @-1
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: package:test/a.dart::@class::Base::@constructor::requiredArg
-                  staticType: null
-                  token: requiredArg @-1
-                period: . @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::requiredArg
-                superKeyword: super @0
-          synthetic positionalArg @-1
-            parameters
-              optionalPositional x @-1
-                type: bool
-                constantInitializer
-                  BooleanLiteral
-                    literal: true @127
-                    staticType: bool
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    SimpleIdentifier
-                      staticElement: x@-1
-                      staticType: bool
-                      token: x @-1
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: package:test/a.dart::@class::Base::@constructor::positionalArg
-                  staticType: null
-                  token: positionalArg @-1
-                period: . @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::positionalArg
-                superKeyword: super @0
-          synthetic positionalArg2 @-1
-            parameters
-              optionalPositional final x @-1
-                type: bool
-                constantInitializer
-                  BooleanLiteral
-                    literal: true @167
-                    staticType: bool
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    SimpleIdentifier
-                      staticElement: x@-1
-                      staticType: bool
-                      token: x @-1
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: package:test/a.dart::@class::Base::@constructor::positionalArg2
-                  staticType: null
-                  token: positionalArg2 @-1
-                period: . @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::positionalArg2
-                superKeyword: super @0
-          synthetic namedArg @-1
-            parameters
-              optionalNamed x @-1
-                type: int
-                constantInitializer
-                  IntegerLiteral
-                    literal: 42 @200
-                    staticType: int
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    SimpleIdentifier
-                      staticElement: x@-1
-                      staticType: int
-                      token: x @-1
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: package:test/a.dart::@class::Base::@constructor::namedArg
-                  staticType: null
-                  token: namedArg @-1
-                period: . @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::namedArg
-                superKeyword: super @0
-          synthetic namedArg2 @-1
-            parameters
-              optionalNamed final x @-1
-                type: bool
-                constantInitializer
-                  BooleanLiteral
-                    literal: true @233
-                    staticType: bool
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    SimpleIdentifier
-                      staticElement: x@-1
-                      staticType: bool
-                      token: x @-1
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: package:test/a.dart::@class::Base::@constructor::namedArg2
-                  staticType: null
-                  token: namedArg2 @-1
-                period: . @0
-                staticElement: package:test/a.dart::@class::Base::@constructor::namedArg2
-                superKeyword: super @0
-''');
-  }
-
-  test_class_alias_with_forwarding_constructors_type_substitution() async {
-    var library = await checkLibrary('''
-class Base<T> {
-  Base.ctor(T t, List<T> l);
-}
-class M {}
-class MixinApp = Base with M;
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class Base @6
-        typeParameters
-          covariant T @11
-            defaultType: dynamic
-        constructors
-          ctor @23
-            periodOffset: 22
-            nameEnd: 27
-            parameters
-              requiredPositional t @30
-                type: T
-              requiredPositional l @41
-                type: List<T>
-      class M @53
-        constructors
-          synthetic @-1
-      class alias MixinApp @64
-        supertype: Base<dynamic>
-        mixins
-          M
-        constructors
-          synthetic ctor @-1
-            parameters
-              requiredPositional t @-1
-                type: dynamic
-              requiredPositional l @-1
-                type: List<dynamic>
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    SimpleIdentifier
-                      staticElement: t@-1
-                      staticType: dynamic
-                      token: t @-1
-                    SimpleIdentifier
-                      staticElement: l@-1
-                      staticType: List<dynamic>
-                      token: l @-1
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::Base::@constructor::ctor
-                  staticType: null
-                  token: ctor @-1
-                period: . @0
-                staticElement: self::@class::Base::@constructor::ctor
-                superKeyword: super @0
-''');
-  }
-
-  test_class_alias_with_forwarding_constructors_type_substitution_complex() async {
-    var library = await checkLibrary('''
-class Base<T> {
-  Base.ctor(T t, List<T> l);
-}
-class M {}
-class MixinApp<U> = Base<List<U>> with M;
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class Base @6
-        typeParameters
-          covariant T @11
-            defaultType: dynamic
-        constructors
-          ctor @23
-            periodOffset: 22
-            nameEnd: 27
-            parameters
-              requiredPositional t @30
-                type: T
-              requiredPositional l @41
-                type: List<T>
-      class M @53
-        constructors
-          synthetic @-1
-      class alias MixinApp @64
-        typeParameters
-          covariant U @73
-            defaultType: dynamic
-        supertype: Base<List<U>>
-        mixins
-          M
-        constructors
-          synthetic ctor @-1
-            parameters
-              requiredPositional t @-1
-                type: List<U>
-              requiredPositional l @-1
-                type: List<List<U>>
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    SimpleIdentifier
-                      staticElement: t@-1
-                      staticType: List<U>
-                      token: t @-1
-                    SimpleIdentifier
-                      staticElement: l@-1
-                      staticType: List<List<U>>
-                      token: l @-1
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::Base::@constructor::ctor
-                  staticType: null
-                  token: ctor @-1
-                period: . @0
-                staticElement: self::@class::Base::@constructor::ctor
-                superKeyword: super @0
-''');
-  }
-
-  test_class_alias_with_mixin_members() async {
-    var library = await checkLibrary('''
-class C = D with E;
-class D {}
-class E {
-  int get a => null;
-  void set b(int i) {}
-  void f() {}
-  int x;
-}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class alias C @6
-        supertype: D
-        mixins
-          E
-        constructors
-          synthetic @-1
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @0
-                  rightParenthesis: ) @0
-                staticElement: self::@class::D::@constructor::•
-                superKeyword: super @0
-      class D @26
-        constructors
-          synthetic @-1
-      class E @37
-        fields
-          x @105
-            type: int
-          synthetic a @-1
-            type: int
-          synthetic b @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get x @-1
-            returnType: int
-          synthetic set x @-1
-            parameters
-              requiredPositional _x @-1
-                type: int
-            returnType: void
-          get a @51
-            returnType: int
-          set b @73
-            parameters
-              requiredPositional i @79
-                type: int
-            returnType: void
-        methods
-          f @92
-            returnType: void
-''');
-  }
-
   test_class_constructor_const() async {
     var library = await checkLibrary('class C { const C(); }');
     checkElementText(library, r'''
@@ -902,6 +144,25 @@
 ''');
   }
 
+  test_class_constructor_documented() async {
+    var library = await checkLibrary('''
+class C {
+  /**
+   * Docs
+   */
+  C();
+}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          @34
+            documentationComment: /**\n   * Docs\n   */
+''');
+  }
+
   test_class_constructor_explicit_named() async {
     var library = await checkLibrary('class C { C.foo(); }');
     checkElementText(library, r'''
@@ -1493,6 +754,1022 @@
 ''');
   }
 
+  test_class_constructor_initializers_assertInvocation() async {
+    var library = await checkLibrary('''
+class C {
+  const C(int x) : assert(x >= 42);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          const @18
+            parameters
+              requiredPositional x @24
+                type: int
+            constantInitializers
+              AssertInitializer
+                assertKeyword: assert @29
+                condition: BinaryExpression
+                  leftOperand: SimpleIdentifier
+                    staticElement: x@24
+                    staticType: int
+                    token: x @36
+                  operator: >= @38
+                  rightOperand: IntegerLiteral
+                    literal: 42 @41
+                    staticType: int
+                  staticElement: dart:core::@class::num::@method::>=
+                  staticInvokeType: bool Function(num)
+                  staticType: bool
+                leftParenthesis: ( @35
+                rightParenthesis: ) @43
+''');
+  }
+
+  test_class_constructor_initializers_assertInvocation_message() async {
+    var library = await checkLibrary('''
+class C {
+  const C(int x) : assert(x >= 42, 'foo');
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          const @18
+            parameters
+              requiredPositional x @24
+                type: int
+            constantInitializers
+              AssertInitializer
+                assertKeyword: assert @29
+                condition: BinaryExpression
+                  leftOperand: SimpleIdentifier
+                    staticElement: x@24
+                    staticType: int
+                    token: x @36
+                  operator: >= @38
+                  rightOperand: IntegerLiteral
+                    literal: 42 @41
+                    staticType: int
+                  staticElement: dart:core::@class::num::@method::>=
+                  staticInvokeType: bool Function(num)
+                  staticType: bool
+                leftParenthesis: ( @35
+                message: SimpleStringLiteral
+                  literal: 'foo' @45
+                rightParenthesis: ) @50
+''');
+  }
+
+  test_class_constructor_initializers_field() async {
+    var library = await checkLibrary('''
+class C {
+  final x;
+  const C() : x = 42;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          final x @18
+            type: dynamic
+        constructors
+          const @29
+            constantInitializers
+              ConstructorFieldInitializer
+                equals: = @37
+                expression: IntegerLiteral
+                  literal: 42 @39
+                  staticType: int
+                fieldName: SimpleIdentifier
+                  staticElement: self::@class::C::@field::x
+                  staticType: null
+                  token: x @35
+        accessors
+          synthetic get x @-1
+            returnType: dynamic
+''');
+  }
+
+  test_class_constructor_initializers_field_notConst() async {
+    var library = await checkLibrary('''
+class C {
+  final x;
+  const C() : x = foo();
+}
+int foo() => 42;
+''', allowErrors: true);
+    // It is OK to keep non-constant initializers.
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          final x @18
+            type: dynamic
+        constructors
+          const @29
+            constantInitializers
+              ConstructorFieldInitializer
+                equals: = @37
+                expression: MethodInvocation
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @42
+                    rightParenthesis: ) @43
+                  methodName: SimpleIdentifier
+                    staticElement: self::@function::foo
+                    staticType: int Function()
+                    token: foo @39
+                  staticInvokeType: int Function()
+                  staticType: int
+                fieldName: SimpleIdentifier
+                  staticElement: self::@class::C::@field::x
+                  staticType: null
+                  token: x @35
+        accessors
+          synthetic get x @-1
+            returnType: dynamic
+    functions
+      foo @52
+        returnType: int
+''');
+  }
+
+  test_class_constructor_initializers_field_optionalPositionalParameter() async {
+    var library = await checkLibrary('''
+class A {
+  final int _f;
+  const A([int f = 0]) : _f = f;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        fields
+          final _f @22
+            type: int
+        constructors
+          const @34
+            parameters
+              optionalPositional f @41
+                type: int
+                constantInitializer
+                  IntegerLiteral
+                    literal: 0 @45
+                    staticType: int
+            constantInitializers
+              ConstructorFieldInitializer
+                equals: = @54
+                expression: SimpleIdentifier
+                  staticElement: self::@class::A::@constructor::•::@parameter::f
+                  staticType: int
+                  token: f @56
+                fieldName: SimpleIdentifier
+                  staticElement: self::@class::A::@field::_f
+                  staticType: null
+                  token: _f @51
+        accessors
+          synthetic get _f @-1
+            returnType: int
+''');
+  }
+
+  test_class_constructor_initializers_field_withParameter() async {
+    var library = await checkLibrary('''
+class C {
+  final x;
+  const C(int p) : x = 1 + p;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          final x @18
+            type: dynamic
+        constructors
+          const @29
+            parameters
+              requiredPositional p @35
+                type: int
+            constantInitializers
+              ConstructorFieldInitializer
+                equals: = @42
+                expression: BinaryExpression
+                  leftOperand: IntegerLiteral
+                    literal: 1 @44
+                    staticType: int
+                  operator: + @46
+                  rightOperand: SimpleIdentifier
+                    staticElement: p@35
+                    staticType: int
+                    token: p @48
+                  staticElement: dart:core::@class::num::@method::+
+                  staticInvokeType: num Function(num)
+                  staticType: int
+                fieldName: SimpleIdentifier
+                  staticElement: self::@class::C::@field::x
+                  staticType: null
+                  token: x @40
+        accessors
+          synthetic get x @-1
+            returnType: dynamic
+''');
+  }
+
+  test_class_constructor_initializers_genericFunctionType() async {
+    var library = await checkLibrary('''
+class A<T> {
+  const A();
+}
+class B {
+  const B(dynamic x);
+  const B.f()
+   : this(A<Function()>());
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+        constructors
+          const @21
+      class B @34
+        constructors
+          const @46
+            parameters
+              requiredPositional x @56
+                type: dynamic
+          const f @70
+            periodOffset: 69
+            nameEnd: 71
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    InstanceCreationExpression
+                      argumentList: ArgumentList
+                        leftParenthesis: ( @97
+                        rightParenthesis: ) @98
+                      constructorName: ConstructorName
+                        staticElement: ConstructorMember
+                          base: self::@class::A::@constructor::•
+                          substitution: {T: dynamic Function()}
+                        type: NamedType
+                          name: SimpleIdentifier
+                            staticElement: self::@class::A
+                            staticType: null
+                            token: A @84
+                          type: A<dynamic Function()>
+                          typeArguments: TypeArgumentList
+                            arguments
+                              GenericFunctionType
+                                declaredElement: GenericFunctionTypeElement
+                                  parameters
+                                  returnType: dynamic
+                                  type: dynamic Function()
+                                functionKeyword: Function @86
+                                parameters: FormalParameterList
+                                  leftParenthesis: ( @94
+                                  rightParenthesis: ) @95
+                                type: dynamic Function()
+                            leftBracket: < @85
+                            rightBracket: > @96
+                      staticType: A<dynamic Function()>
+                  leftParenthesis: ( @83
+                  rightParenthesis: ) @99
+                staticElement: self::@class::B::@constructor::•
+                thisKeyword: this @79
+            redirectedConstructor: self::@class::B::@constructor::•
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_argumentContextType() async {
+    var library = await checkLibrary('''
+class A {
+  const A(List<String> values);
+}
+class B extends A {
+  const B() : super(const []);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          const @18
+            parameters
+              requiredPositional values @33
+                type: List<String>
+      class B @50
+        supertype: A
+        constructors
+          const @72
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    ListLiteral
+                      constKeyword: const @84
+                      leftBracket: [ @90
+                      rightBracket: ] @91
+                      staticType: List<String>
+                  leftParenthesis: ( @83
+                  rightParenthesis: ) @92
+                staticElement: self::@class::A::@constructor::•
+                superKeyword: super @78
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_named() async {
+    var library = await checkLibrary('''
+class A {
+  const A.aaa(int p);
+}
+class C extends A {
+  const C() : super.aaa(42);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          const aaa @20
+            periodOffset: 19
+            nameEnd: 23
+            parameters
+              requiredPositional p @28
+                type: int
+      class C @40
+        supertype: A
+        constructors
+          const @62
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 42 @78
+                      staticType: int
+                  leftParenthesis: ( @77
+                  rightParenthesis: ) @80
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::A::@constructor::aaa
+                  staticType: null
+                  token: aaa @74
+                period: . @73
+                staticElement: self::@class::A::@constructor::aaa
+                superKeyword: super @68
+            superConstructor: self::@class::A::@constructor::aaa
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_named_underscore() async {
+    var library = await checkLibrary('''
+class A {
+  const A._();
+}
+class B extends A {
+  const B() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          const _ @20
+            periodOffset: 19
+            nameEnd: 21
+      class B @33
+        supertype: A
+        constructors
+          const @55
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @68
+                  rightParenthesis: ) @69
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::A::@constructor::_
+                  staticType: null
+                  token: _ @67
+                period: . @66
+                staticElement: self::@class::A::@constructor::_
+                superKeyword: super @61
+            superConstructor: self::@class::A::@constructor::_
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_namedExpression() async {
+    var library = await checkLibrary('''
+class A {
+  const A.aaa(a, {int b});
+}
+class C extends A {
+  const C() : super.aaa(1, b: 2);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          const aaa @20
+            periodOffset: 19
+            nameEnd: 23
+            parameters
+              requiredPositional a @24
+                type: dynamic
+              optionalNamed b @32
+                type: int
+      class C @45
+        supertype: A
+        constructors
+          const @67
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 1 @83
+                      staticType: int
+                    NamedExpression
+                      name: Label
+                        label: SimpleIdentifier
+                          staticElement: self::@class::A::@constructor::aaa::@parameter::b
+                          staticType: null
+                          token: b @86
+                      expression: IntegerLiteral
+                        literal: 2 @89
+                        staticType: int
+                  leftParenthesis: ( @82
+                  rightParenthesis: ) @90
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::A::@constructor::aaa
+                  staticType: null
+                  token: aaa @79
+                period: . @78
+                staticElement: self::@class::A::@constructor::aaa
+                superKeyword: super @73
+            superConstructor: self::@class::A::@constructor::aaa
+''');
+  }
+
+  test_class_constructor_initializers_superInvocation_unnamed() async {
+    var library = await checkLibrary('''
+class A {
+  const A(int p);
+}
+class C extends A {
+  const C.ccc() : super(42);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          const @18
+            parameters
+              requiredPositional p @24
+                type: int
+      class C @36
+        supertype: A
+        constructors
+          const ccc @60
+            periodOffset: 59
+            nameEnd: 63
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 42 @74
+                      staticType: int
+                  leftParenthesis: ( @73
+                  rightParenthesis: ) @76
+                staticElement: self::@class::A::@constructor::•
+                superKeyword: super @68
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_initializers_thisInvocation_argumentContextType() async {
+    var library = await checkLibrary('''
+class A {
+  const A(List<String> values);
+  const A.empty() : this(const []);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          const @18
+            parameters
+              requiredPositional values @33
+                type: List<String>
+          const empty @52
+            periodOffset: 51
+            nameEnd: 57
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    ListLiteral
+                      constKeyword: const @67
+                      leftBracket: [ @73
+                      rightBracket: ] @74
+                      staticType: List<String>
+                  leftParenthesis: ( @66
+                  rightParenthesis: ) @75
+                staticElement: self::@class::A::@constructor::•
+                thisKeyword: this @62
+            redirectedConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_initializers_thisInvocation_named() async {
+    var library = await checkLibrary('''
+class C {
+  const C() : this.named(1, 'bbb');
+  const C.named(int a, String b);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          const @18
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 1 @35
+                      staticType: int
+                    SimpleStringLiteral
+                      literal: 'bbb' @38
+                  leftParenthesis: ( @34
+                  rightParenthesis: ) @43
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::C::@constructor::named
+                  staticType: null
+                  token: named @29
+                period: . @28
+                staticElement: self::@class::C::@constructor::named
+                thisKeyword: this @24
+            redirectedConstructor: self::@class::C::@constructor::named
+          const named @56
+            periodOffset: 55
+            nameEnd: 61
+            parameters
+              requiredPositional a @66
+                type: int
+              requiredPositional b @76
+                type: String
+''');
+  }
+
+  test_class_constructor_initializers_thisInvocation_namedExpression() async {
+    var library = await checkLibrary('''
+class C {
+  const C() : this.named(1, b: 2);
+  const C.named(a, {int b});
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          const @18
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 1 @35
+                      staticType: int
+                    NamedExpression
+                      name: Label
+                        label: SimpleIdentifier
+                          staticElement: self::@class::C::@constructor::named::@parameter::b
+                          staticType: null
+                          token: b @38
+                      expression: IntegerLiteral
+                        literal: 2 @41
+                        staticType: int
+                  leftParenthesis: ( @34
+                  rightParenthesis: ) @42
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::C::@constructor::named
+                  staticType: null
+                  token: named @29
+                period: . @28
+                staticElement: self::@class::C::@constructor::named
+                thisKeyword: this @24
+            redirectedConstructor: self::@class::C::@constructor::named
+          const named @55
+            periodOffset: 54
+            nameEnd: 60
+            parameters
+              requiredPositional a @61
+                type: dynamic
+              optionalNamed b @69
+                type: int
+''');
+  }
+
+  test_class_constructor_initializers_thisInvocation_unnamed() async {
+    var library = await checkLibrary('''
+class C {
+  const C.named() : this(1, 'bbb');
+  const C(int a, String b);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          const named @20
+            periodOffset: 19
+            nameEnd: 25
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 1 @35
+                      staticType: int
+                    SimpleStringLiteral
+                      literal: 'bbb' @38
+                  leftParenthesis: ( @34
+                  rightParenthesis: ) @43
+                staticElement: self::@class::C::@constructor::•
+                thisKeyword: this @30
+            redirectedConstructor: self::@class::C::@constructor::•
+          const @54
+            parameters
+              requiredPositional a @60
+                type: int
+              requiredPositional b @70
+                type: String
+''');
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47951')
+  test_class_constructor_parameters_super_explicitType_function() async {
+    var library = await checkLibrary('''
+class A {
+  A(Object? a);
+}
+
+class B extends A {
+  B(int super.a<T extends num>(T d)?);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredPositional a @22
+                type: Object?
+      class B @35
+        supertype: A
+        constructors
+          @51
+            parameters
+              requiredPositional final super.a @63
+                type: int Function<T extends num>(T)?
+                typeParameters
+                  covariant T @65
+                    bound: num
+                parameters
+                  requiredPositional d @82
+                    type: T
+                superConstructorParameter: a@22
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47951')
+  test_class_constructor_parameters_super_explicitType_interface() async {
+    var library = await checkLibrary('''
+class A {
+  A(num a);
+}
+
+class B extends A {
+  B(int super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredPositional a @18
+                type: num
+      class B @31
+        supertype: A
+        constructors
+          @47
+            parameters
+              requiredPositional final super.a @49
+                type: int
+                superConstructorParameter: a@18
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_parameters_super_invalid_topFunction() async {
+    var library = await checkLibrary('''
+void f(super.a) {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    functions
+      f @5
+        parameters
+          requiredPositional final super.a @13
+            type: dynamic
+            superConstructorParameter: <null>
+        returnType: void
+''');
+  }
+
+  test_class_constructor_parameters_super_optionalNamed() async {
+    var library = await checkLibrary('''
+class A {
+  A({required int a, required double b});
+}
+
+class B extends A {
+  B({String o1, super.a, String o2, super.b}) : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredNamed a @28
+                type: int
+              requiredNamed b @47
+                type: double
+      class B @61
+        supertype: A
+        constructors
+          @77
+            parameters
+              optionalNamed o1 @87
+                type: String
+              optionalNamed final super.a @97
+                type: int
+                superConstructorParameter: self::@class::A::@constructor::•::@parameter::a
+              optionalNamed o2 @107
+                type: String
+              optionalNamed final super.b @117
+                type: double
+                superConstructorParameter: self::@class::A::@constructor::•::@parameter::b
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_parameters_super_optionalNamed_unresolved() async {
+    var library = await checkLibrary('''
+class A {
+  A({required int a});
+}
+
+class B extends A {
+  B({super.b});
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredNamed a @28
+                type: int
+      class B @42
+        supertype: A
+        constructors
+          @58
+            parameters
+              optionalNamed final super.b @67
+                type: dynamic
+                superConstructorParameter: <null>
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_parameters_super_optionalPositional() async {
+    var library = await checkLibrary('''
+class A {
+  A(int a, double b);
+}
+
+class B extends A {
+  B([String o1, super.a, String o2, super.b]) : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredPositional a @18
+                type: int
+              requiredPositional b @28
+                type: double
+      class B @41
+        supertype: A
+        constructors
+          @57
+            parameters
+              optionalPositional o1 @67
+                type: String
+              optionalPositional final super.a @77
+                type: int
+                superConstructorParameter: a@18
+              optionalPositional o2 @87
+                type: String
+              optionalPositional final super.b @97
+                type: double
+                superConstructorParameter: b@28
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredNamed() async {
+    var library = await checkLibrary('''
+class A {
+  A({required int a, required double b});
+}
+
+class B extends A {
+  B({
+    required String o1,
+    required super.a,
+    required String o2,
+    required super.b,
+  }) : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredNamed a @28
+                type: int
+              requiredNamed b @47
+                type: double
+      class B @61
+        supertype: A
+        constructors
+          @77
+            parameters
+              requiredNamed o1 @101
+                type: String
+              requiredNamed final super.a @124
+                type: int
+                superConstructorParameter: self::@class::A::@constructor::•::@parameter::a
+              requiredNamed o2 @147
+                type: String
+              requiredNamed final super.b @170
+                type: double
+                superConstructorParameter: self::@class::A::@constructor::•::@parameter::b
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredPositional() async {
+    var library = await checkLibrary('''
+class A {
+  A(int a, double b);
+}
+
+class B extends A {
+  B(String o1, super.a, String o2, super.b) : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          @12
+            parameters
+              requiredPositional a @18
+                type: int
+              requiredPositional b @28
+                type: double
+      class B @41
+        supertype: A
+        constructors
+          @57
+            parameters
+              requiredPositional o1 @66
+                type: String
+              requiredPositional final super.a @76
+                type: int
+                superConstructorParameter: a@18
+              requiredPositional o2 @86
+                type: String
+              requiredPositional final super.b @96
+                type: double
+                superConstructorParameter: b@28
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_parameters_super_requiredPositional_unresolved() async {
+    var library = await checkLibrary('''
+class A {}
+
+class B extends A {
+  B(super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          synthetic @-1
+      class B @18
+        supertype: A
+        constructors
+          @34
+            parameters
+              requiredPositional final super.a @42
+                type: dynamic
+                superConstructorParameter: <null>
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
   test_class_constructor_params() async {
     var library = await checkLibrary('class C { C(x, int y); }');
     checkElementText(library, r'''
@@ -1510,6 +1787,976 @@
 ''');
   }
 
+  test_class_constructor_redirected_factory_named() async {
+    var library = await checkLibrary('''
+class C {
+  factory C() = D.named;
+  C._();
+}
+class D extends C {
+  D.named() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          factory @20
+            redirectedConstructor: self::@class::D::@constructor::named
+          _ @39
+            periodOffset: 38
+            nameEnd: 40
+      class D @52
+        supertype: C
+        constructors
+          named @70
+            periodOffset: 69
+            nameEnd: 75
+            superConstructor: self::@class::C::@constructor::_
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_generic() async {
+    var library = await checkLibrary('''
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+class D<T, U> extends C<U, T> {
+  D.named() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+          covariant U @11
+            defaultType: dynamic
+        constructors
+          factory @26
+            redirectedConstructor: ConstructorMember
+              base: self::@class::D::@constructor::named
+              substitution: {T: U, U: T}
+          _ @51
+            periodOffset: 50
+            nameEnd: 52
+      class D @64
+        typeParameters
+          covariant T @66
+            defaultType: dynamic
+          covariant U @69
+            defaultType: dynamic
+        supertype: C<U, T>
+        constructors
+          named @94
+            periodOffset: 93
+            nameEnd: 99
+            superConstructor: ConstructorMember
+              base: self::@class::C::@constructor::_
+              substitution: {T: U, U: T}
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_generic_viaTypeAlias() async {
+    var library = await checkLibrary('''
+typedef A<T, U> = C<T, U>;
+class B<T, U> {
+  factory B() = A<U, T>.named;
+  B._();
+}
+class C<T, U> extends A<U, T> {
+  C.named() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class B @33
+        typeParameters
+          covariant T @35
+            defaultType: dynamic
+          covariant U @38
+            defaultType: dynamic
+        constructors
+          factory @53
+            redirectedConstructor: ConstructorMember
+              base: self::@class::C::@constructor::named
+              substitution: {T: U, U: T}
+          _ @78
+            periodOffset: 77
+            nameEnd: 79
+      class C @91
+        typeParameters
+          covariant T @93
+            defaultType: dynamic
+          covariant U @96
+            defaultType: dynamic
+        supertype: C<U, T>
+          aliasElement: self::@typeAlias::A
+          aliasArguments
+            U
+            T
+        constructors
+          named @121
+            periodOffset: 120
+            nameEnd: 126
+    typeAliases
+      A @8
+        typeParameters
+          covariant T @10
+            defaultType: dynamic
+          covariant U @13
+            defaultType: dynamic
+        aliasedType: C<T, U>
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_imported() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+class D extends C {
+  D.named() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart';
+class C {
+  factory C() = D.named;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart
+  definingUnit
+    classes
+      class C @25
+        constructors
+          factory @39
+            redirectedConstructor: foo.dart::@class::D::@constructor::named
+          _ @58
+            periodOffset: 57
+            nameEnd: 59
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_imported_generic() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+class D<T, U> extends C<U, T> {
+  D.named() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart';
+class C<T, U> {
+  factory C() = D<U, T>.named;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart
+  definingUnit
+    classes
+      class C @25
+        typeParameters
+          covariant T @27
+            defaultType: dynamic
+          covariant U @30
+            defaultType: dynamic
+        constructors
+          factory @45
+            redirectedConstructor: ConstructorMember
+              base: foo.dart::@class::D::@constructor::named
+              substitution: {T: U, U: T}
+          _ @70
+            periodOffset: 69
+            nameEnd: 71
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_prefixed() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+class D extends C {
+  D.named() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart' as foo;
+class C {
+  factory C() = foo.D.named;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart as foo @21
+  definingUnit
+    classes
+      class C @32
+        constructors
+          factory @46
+            redirectedConstructor: foo.dart::@class::D::@constructor::named
+          _ @69
+            periodOffset: 68
+            nameEnd: 70
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_prefixed_generic() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+class D<T, U> extends C<U, T> {
+  D.named() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart' as foo;
+class C<T, U> {
+  factory C() = foo.D<U, T>.named;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart as foo @21
+  definingUnit
+    classes
+      class C @32
+        typeParameters
+          covariant T @34
+            defaultType: dynamic
+          covariant U @37
+            defaultType: dynamic
+        constructors
+          factory @52
+            redirectedConstructor: ConstructorMember
+              base: foo.dart::@class::D::@constructor::named
+              substitution: {T: U, U: T}
+          _ @81
+            periodOffset: 80
+            nameEnd: 82
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_unresolved_class() async {
+    var library = await checkLibrary('''
+class C<E> {
+  factory C() = D.named<E>;
+}
+''', allowErrors: true);
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        typeParameters
+          covariant E @8
+            defaultType: dynamic
+        constructors
+          factory @23
+''');
+  }
+
+  test_class_constructor_redirected_factory_named_unresolved_constructor() async {
+    var library = await checkLibrary('''
+class D {}
+class C<E> {
+  factory C() = D.named<E>;
+}
+''', allowErrors: true);
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class D @6
+        constructors
+          synthetic @-1
+      class C @17
+        typeParameters
+          covariant E @19
+            defaultType: dynamic
+        constructors
+          factory @34
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed() async {
+    var library = await checkLibrary('''
+class C {
+  factory C() = D;
+  C._();
+}
+class D extends C {
+  D() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          factory @20
+            redirectedConstructor: self::@class::D::@constructor::•
+          _ @33
+            periodOffset: 32
+            nameEnd: 34
+      class D @46
+        supertype: C
+        constructors
+          @62
+            superConstructor: self::@class::C::@constructor::_
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_generic() async {
+    var library = await checkLibrary('''
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+class D<T, U> extends C<U, T> {
+  D() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+          covariant U @11
+            defaultType: dynamic
+        constructors
+          factory @26
+            redirectedConstructor: ConstructorMember
+              base: self::@class::D::@constructor::•
+              substitution: {T: U, U: T}
+          _ @45
+            periodOffset: 44
+            nameEnd: 46
+      class D @58
+        typeParameters
+          covariant T @60
+            defaultType: dynamic
+          covariant U @63
+            defaultType: dynamic
+        supertype: C<U, T>
+        constructors
+          @86
+            superConstructor: ConstructorMember
+              base: self::@class::C::@constructor::_
+              substitution: {T: U, U: T}
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_generic_viaTypeAlias() async {
+    var library = await checkLibrary('''
+typedef A<T, U> = C<T, U>;
+class B<T, U> {
+  factory B() = A<U, T>;
+  B_();
+}
+class C<T, U> extends B<U, T> {
+  C() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class B @33
+        typeParameters
+          covariant T @35
+            defaultType: dynamic
+          covariant U @38
+            defaultType: dynamic
+        constructors
+          factory @53
+            redirectedConstructor: ConstructorMember
+              base: self::@class::C::@constructor::•
+              substitution: {T: U, U: T}
+        methods
+          abstract B_ @70
+            returnType: dynamic
+      class C @84
+        typeParameters
+          covariant T @86
+            defaultType: dynamic
+          covariant U @89
+            defaultType: dynamic
+        supertype: B<U, T>
+        constructors
+          @112
+    typeAliases
+      A @8
+        typeParameters
+          covariant T @10
+            defaultType: dynamic
+          covariant U @13
+            defaultType: dynamic
+        aliasedType: C<T, U>
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_imported() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+class D extends C {
+  D() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart';
+class C {
+  factory C() = D;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart
+  definingUnit
+    classes
+      class C @25
+        constructors
+          factory @39
+            redirectedConstructor: foo.dart::@class::D::@constructor::•
+          _ @52
+            periodOffset: 51
+            nameEnd: 53
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_imported_generic() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+class D<T, U> extends C<U, T> {
+  D() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart';
+class C<T, U> {
+  factory C() = D<U, T>;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart
+  definingUnit
+    classes
+      class C @25
+        typeParameters
+          covariant T @27
+            defaultType: dynamic
+          covariant U @30
+            defaultType: dynamic
+        constructors
+          factory @45
+            redirectedConstructor: ConstructorMember
+              base: foo.dart::@class::D::@constructor::•
+              substitution: {T: U, U: T}
+          _ @64
+            periodOffset: 63
+            nameEnd: 65
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_imported_viaTypeAlias() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+typedef A = B;
+class B extends C {
+  B() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart';
+class C {
+  factory C() = A;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart
+  definingUnit
+    classes
+      class C @25
+        constructors
+          factory @39
+            redirectedConstructor: foo.dart::@class::B::@constructor::•
+          _ @52
+            periodOffset: 51
+            nameEnd: 53
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_prefixed() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+class D extends C {
+  D() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart' as foo;
+class C {
+  factory C() = foo.D;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart as foo @21
+  definingUnit
+    classes
+      class C @32
+        constructors
+          factory @46
+            redirectedConstructor: foo.dart::@class::D::@constructor::•
+          _ @63
+            periodOffset: 62
+            nameEnd: 64
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_prefixed_generic() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+class D<T, U> extends C<U, T> {
+  D() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart' as foo;
+class C<T, U> {
+  factory C() = foo.D<U, T>;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart as foo @21
+  definingUnit
+    classes
+      class C @32
+        typeParameters
+          covariant T @34
+            defaultType: dynamic
+          covariant U @37
+            defaultType: dynamic
+        constructors
+          factory @52
+            redirectedConstructor: ConstructorMember
+              base: foo.dart::@class::D::@constructor::•
+              substitution: {T: U, U: T}
+          _ @75
+            periodOffset: 74
+            nameEnd: 76
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_prefixed_viaTypeAlias() async {
+    addLibrarySource('/foo.dart', '''
+import 'test.dart';
+typedef A = B;
+class B extends C {
+  B() : super._();
+}
+''');
+    var library = await checkLibrary('''
+import 'foo.dart' as foo;
+class C {
+  factory C() = foo.A;
+  C._();
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    foo.dart as foo @21
+  definingUnit
+    classes
+      class C @32
+        constructors
+          factory @46
+            redirectedConstructor: foo.dart::@class::B::@constructor::•
+          _ @63
+            periodOffset: 62
+            nameEnd: 64
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_unresolved() async {
+    var library = await checkLibrary('''
+class C<E> {
+  factory C() = D<E>;
+}
+''', allowErrors: true);
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        typeParameters
+          covariant E @8
+            defaultType: dynamic
+        constructors
+          factory @23
+''');
+  }
+
+  test_class_constructor_redirected_factory_unnamed_viaTypeAlias() async {
+    var library = await checkLibrary('''
+typedef A = C;
+class B {
+  factory B() = A;
+  B._();
+}
+class C extends B {
+  C() : super._();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class B @21
+        constructors
+          factory @35
+            redirectedConstructor: self::@class::C::@constructor::•
+          _ @48
+            periodOffset: 47
+            nameEnd: 49
+      class C @61
+        supertype: B
+        constructors
+          @77
+            superConstructor: self::@class::B::@constructor::_
+    typeAliases
+      A @8
+        aliasedType: C
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_named() async {
+    var library = await checkLibrary('''
+class C {
+  const C.named();
+  const C() : this.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          const named @20
+            periodOffset: 19
+            nameEnd: 25
+          const @37
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @53
+                  rightParenthesis: ) @54
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::C::@constructor::named
+                  staticType: null
+                  token: named @48
+                period: . @47
+                staticElement: self::@class::C::@constructor::named
+                thisKeyword: this @43
+            redirectedConstructor: self::@class::C::@constructor::named
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_named_generic() async {
+    var library = await checkLibrary('''
+class C<T> {
+  const C.named();
+  const C() : this.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+        constructors
+          const named @23
+            periodOffset: 22
+            nameEnd: 28
+          const @40
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @56
+                  rightParenthesis: ) @57
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::C::@constructor::named
+                  staticType: null
+                  token: named @51
+                period: . @50
+                staticElement: self::@class::C::@constructor::named
+                thisKeyword: this @46
+            redirectedConstructor: self::@class::C::@constructor::named
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_named_notConst() async {
+    var library = await checkLibrary('''
+class C {
+  C.named();
+  C() : this.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          named @14
+            periodOffset: 13
+            nameEnd: 19
+          @25
+            redirectedConstructor: self::@class::C::@constructor::named
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_unnamed() async {
+    var library = await checkLibrary('''
+class C {
+  const C();
+  const C.named() : this();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          const @18
+          const named @33
+            periodOffset: 32
+            nameEnd: 38
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @47
+                  rightParenthesis: ) @48
+                staticElement: self::@class::C::@constructor::•
+                thisKeyword: this @43
+            redirectedConstructor: self::@class::C::@constructor::•
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_unnamed_generic() async {
+    var library = await checkLibrary('''
+class C<T> {
+  const C();
+  const C.named() : this();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+        constructors
+          const @21
+          const named @36
+            periodOffset: 35
+            nameEnd: 41
+            constantInitializers
+              RedirectingConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @50
+                  rightParenthesis: ) @51
+                staticElement: self::@class::C::@constructor::•
+                thisKeyword: this @46
+            redirectedConstructor: self::@class::C::@constructor::•
+''');
+  }
+
+  test_class_constructor_redirected_thisInvocation_unnamed_notConst() async {
+    var library = await checkLibrary('''
+class C {
+  C();
+  C.named() : this();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          @12
+          named @21
+            periodOffset: 20
+            nameEnd: 26
+            redirectedConstructor: self::@class::C::@constructor::•
+''');
+  }
+
+  test_class_constructor_superConstructor_generic_named() async {
+    var library = await checkLibrary('''
+class A<T> {
+  A.named(T a);
+}
+class B extends A<int> {
+  B() : super.named(0);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+        constructors
+          named @17
+            periodOffset: 16
+            nameEnd: 22
+            parameters
+              requiredPositional a @25
+                type: T
+      class B @37
+        supertype: A<int>
+        constructors
+          @58
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::named
+              substitution: {T: int}
+''');
+  }
+
+  test_class_constructor_superConstructor_notGeneric_named() async {
+    var library = await checkLibrary('''
+class A {
+  A.named();
+}
+class B extends A {
+  B() : super.named();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          named @14
+            periodOffset: 13
+            nameEnd: 19
+      class B @31
+        supertype: A
+        constructors
+          @47
+            superConstructor: self::@class::A::@constructor::named
+''');
+  }
+
+  test_class_constructor_superConstructor_notGeneric_unnamed_explicit() async {
+    var library = await checkLibrary('''
+class A {}
+class B extends A {
+  B() : super();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          synthetic @-1
+      class B @17
+        supertype: A
+        constructors
+          @33
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_superConstructor_notGeneric_unnamed_implicit() async {
+    var library = await checkLibrary('''
+class A {}
+class B extends A {
+  B();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          synthetic @-1
+      class B @17
+        supertype: A
+        constructors
+          @33
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
+  test_class_constructor_superConstructor_notGeneric_unnamed_implicit2() async {
+    var library = await checkLibrary('''
+class A {}
+class B extends A {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        constructors
+          synthetic @-1
+      class B @17
+        supertype: A
+        constructors
+          synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
   test_class_constructor_unnamed_implicit() async {
     var library = await checkLibrary('class C {}');
     checkElementText(
@@ -1526,6 +2773,120 @@
         withDisplayName: true);
   }
 
+  test_class_constructor_withCycles_const() async {
+    var library = await checkLibrary('''
+class C {
+  final x;
+  const C() : x = const D();
+}
+class D {
+  final x;
+  const D() : x = const C();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          final x @18
+            type: dynamic
+        constructors
+          const @29
+            constantInitializers
+              ConstructorFieldInitializer
+                equals: = @37
+                expression: InstanceCreationExpression
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @46
+                    rightParenthesis: ) @47
+                  constructorName: ConstructorName
+                    staticElement: self::@class::D::@constructor::•
+                    type: NamedType
+                      name: SimpleIdentifier
+                        staticElement: self::@class::D
+                        staticType: null
+                        token: D @45
+                      type: D
+                  keyword: const @39
+                  staticType: D
+                fieldName: SimpleIdentifier
+                  staticElement: self::@class::C::@field::x
+                  staticType: null
+                  token: x @35
+        accessors
+          synthetic get x @-1
+            returnType: dynamic
+      class D @58
+        fields
+          final x @70
+            type: dynamic
+        constructors
+          const @81
+            constantInitializers
+              ConstructorFieldInitializer
+                equals: = @89
+                expression: InstanceCreationExpression
+                  argumentList: ArgumentList
+                    leftParenthesis: ( @98
+                    rightParenthesis: ) @99
+                  constructorName: ConstructorName
+                    staticElement: self::@class::C::@constructor::•
+                    type: NamedType
+                      name: SimpleIdentifier
+                        staticElement: self::@class::C
+                        staticType: null
+                        token: C @97
+                      type: C
+                  keyword: const @91
+                  staticType: C
+                fieldName: SimpleIdentifier
+                  staticElement: self::@class::D::@field::x
+                  staticType: null
+                  token: x @87
+        accessors
+          synthetic get x @-1
+            returnType: dynamic
+''');
+  }
+
+  test_class_constructor_withCycles_nonConst() async {
+    var library = await checkLibrary('''
+class C {
+  final x;
+  C() : x = new D();
+}
+class D {
+  final x;
+  D() : x = new C();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          final x @18
+            type: dynamic
+        constructors
+          @23
+        accessors
+          synthetic get x @-1
+            returnType: dynamic
+      class D @50
+        fields
+          final x @62
+            type: dynamic
+        constructors
+          @67
+        accessors
+          synthetic get x @-1
+            returnType: dynamic
+''');
+  }
+
   test_class_constructors_named() async {
     var library = await checkLibrary('''
 class C {
@@ -1874,6 +3235,33 @@
 ''');
   }
 
+  test_class_field_abstract() async {
+    var library = await checkLibrary('''
+abstract class C {
+  abstract int i;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      abstract class C @15
+        fields
+          abstract i @34
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic abstract get i @-1
+            returnType: int
+          synthetic abstract set i @-1
+            parameters
+              requiredPositional _i @-1
+                type: int
+            returnType: void
+''');
+  }
+
   test_class_field_const() async {
     var library = await checkLibrary('class C { static const int i = 0; }');
     checkElementText(library, r'''
@@ -1919,6 +3307,224 @@
 ''');
   }
 
+  test_class_field_covariant() async {
+    var library = await checkLibrary('''
+class C {
+  covariant int x;
+}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          covariant x @26
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get x @-1
+            returnType: int
+          synthetic set x @-1
+            parameters
+              requiredPositional covariant _x @-1
+                type: int
+            returnType: void
+''');
+  }
+
+  test_class_field_documented() async {
+    var library = await checkLibrary('''
+class C {
+  /**
+   * Docs
+   */
+  var x;
+}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          x @38
+            documentationComment: /**\n   * Docs\n   */
+            type: dynamic
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get x @-1
+            returnType: dynamic
+          synthetic set x @-1
+            parameters
+              requiredPositional _x @-1
+                type: dynamic
+            returnType: void
+''');
+  }
+
+  test_class_field_external() async {
+    var library = await checkLibrary('''
+abstract class C {
+  external int i;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      abstract class C @15
+        fields
+          external i @34
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get i @-1
+            returnType: int
+          synthetic set i @-1
+            parameters
+              requiredPositional _i @-1
+                type: int
+            returnType: void
+''');
+  }
+
+  test_class_field_final_hasInitializer_hasConstConstructor() async {
+    var library = await checkLibrary('''
+class C {
+  final x = 42;
+  const C();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          final x @18
+            type: int
+            constantInitializer
+              IntegerLiteral
+                literal: 42 @22
+                staticType: int
+        constructors
+          const @34
+        accessors
+          synthetic get x @-1
+            returnType: int
+''');
+  }
+
+  test_class_field_final_hasInitializer_hasConstConstructor_genericFunctionType() async {
+    var library = await checkLibrary('''
+class A<T> {
+  const A();
+}
+class B {
+  final f = const A<int Function(double a)>();
+  const B();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+        constructors
+          const @21
+      class B @34
+        fields
+          final f @46
+            type: A<int Function(double)>
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @81
+                  rightParenthesis: ) @82
+                constructorName: ConstructorName
+                  staticElement: ConstructorMember
+                    base: self::@class::A::@constructor::•
+                    substitution: {T: int Function(double)}
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@class::A
+                      staticType: null
+                      token: A @56
+                    type: A<int Function(double)>
+                    typeArguments: TypeArgumentList
+                      arguments
+                        GenericFunctionType
+                          declaredElement: GenericFunctionTypeElement
+                            parameters
+                              a
+                                kind: required positional
+                                type: double
+                            returnType: int
+                            type: int Function(double)
+                          functionKeyword: Function @62
+                          parameters: FormalParameterList
+                            leftParenthesis: ( @70
+                            parameters
+                              SimpleFormalParameter
+                                declaredElement: a@78
+                                declaredElementType: double
+                                identifier: SimpleIdentifier
+                                  staticElement: a@78
+                                  staticType: null
+                                  token: a @78
+                                type: NamedType
+                                  name: SimpleIdentifier
+                                    staticElement: dart:core::@class::double
+                                    staticType: null
+                                    token: double @71
+                                  type: double
+                            rightParenthesis: ) @79
+                          returnType: NamedType
+                            name: SimpleIdentifier
+                              staticElement: dart:core::@class::int
+                              staticType: null
+                              token: int @58
+                            type: int
+                          type: int Function(double)
+                      leftBracket: < @57
+                      rightBracket: > @80
+                keyword: const @50
+                staticType: A<int Function(double)>
+        constructors
+          const @93
+        accessors
+          synthetic get f @-1
+            returnType: A<int Function(double)>
+''');
+  }
+
+  test_class_field_final_hasInitializer_noConstConstructor() async {
+    var library = await checkLibrary('''
+class C {
+  final x = 42;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          final x @18
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get x @-1
+            returnType: int
+''');
+  }
+
   test_class_field_final_withSetter() async {
     var library = await checkLibrary(r'''
 class A {
@@ -1951,6 +3557,44 @@
 ''');
   }
 
+  test_class_field_formal_param_inferred_type_implicit() async {
+    var library = await checkLibrary('class C extends D { var v; C(this.v); }'
+        ' abstract class D { int get v; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        supertype: D
+        fields
+          v @24
+            type: int
+        constructors
+          @27
+            parameters
+              requiredPositional final this.v @34
+                type: int
+            superConstructor: self::@class::D::@constructor::•
+        accessors
+          synthetic get v @-1
+            returnType: int
+          synthetic set v @-1
+            parameters
+              requiredPositional _v @-1
+                type: int
+            returnType: void
+      abstract class D @55
+        fields
+          synthetic v @-1
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          abstract get v @67
+            returnType: int
+''');
+  }
+
   test_class_field_implicit_type() async {
     var library = await checkLibrary('class C { var x; }');
     checkElementText(library, r'''
@@ -1997,6 +3641,169 @@
 ''');
   }
 
+  test_class_field_inferred_type_nonStatic_explicit_initialized() async {
+    var library = await checkLibrary('class C { num v = 0; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          v @14
+            type: num
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get v @-1
+            returnType: num
+          synthetic set v @-1
+            parameters
+              requiredPositional _v @-1
+                type: num
+            returnType: void
+''');
+  }
+
+  test_class_field_inferred_type_nonStatic_implicit_initialized() async {
+    var library = await checkLibrary('class C { var v = 0; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          v @14
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get v @-1
+            returnType: int
+          synthetic set v @-1
+            parameters
+              requiredPositional _v @-1
+                type: int
+            returnType: void
+''');
+  }
+
+  test_class_field_inferred_type_nonStatic_implicit_uninitialized() async {
+    var library = await checkLibrary(
+        'class C extends D { var v; } abstract class D { int get v; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        supertype: D
+        fields
+          v @24
+            type: int
+        constructors
+          synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
+        accessors
+          synthetic get v @-1
+            returnType: int
+          synthetic set v @-1
+            parameters
+              requiredPositional _v @-1
+                type: int
+            returnType: void
+      abstract class D @44
+        fields
+          synthetic v @-1
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          abstract get v @56
+            returnType: int
+''');
+  }
+
+  test_class_field_inferred_type_nonStatic_inherited_resolveInitializer() async {
+    var library = await checkLibrary(r'''
+const a = 0;
+abstract class A {
+  const A();
+  List<int> get f;
+}
+class B extends A {
+  const B();
+  final f = [a];
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      abstract class A @28
+        fields
+          synthetic f @-1
+            type: List<int>
+        constructors
+          const @40
+        accessors
+          abstract get f @61
+            returnType: List<int>
+      class B @72
+        supertype: A
+        fields
+          final f @107
+            type: List<int>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@getter::a
+                    staticType: int
+                    token: a @112
+                leftBracket: [ @111
+                rightBracket: ] @113
+                staticType: List<int>
+        constructors
+          const @94
+            superConstructor: self::@class::A::@constructor::•
+        accessors
+          synthetic get f @-1
+            returnType: List<int>
+    topLevelVariables
+      static const a @6
+        type: int
+        constantInitializer
+          IntegerLiteral
+            literal: 0 @10
+            staticType: int
+    accessors
+      synthetic static get a @-1
+        returnType: int
+''');
+  }
+
+  test_class_field_inferred_type_static_implicit_initialized() async {
+    var library = await checkLibrary('class C { static var v = 0; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          static v @21
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic static get v @-1
+            returnType: int
+          synthetic static set v @-1
+            parameters
+              requiredPositional _v @-1
+                type: int
+            returnType: void
+''');
+  }
+
   test_class_field_inheritedContextType_double() async {
     var library = await checkLibrary('''
 abstract class A {
@@ -2032,12 +3839,139 @@
                 staticType: double
         constructors
           const @80
+            superConstructor: self::@class::A::@constructor::•
         accessors
           synthetic get foo @-1
             returnType: double
 ''');
   }
 
+  test_class_field_propagatedType_const_noDep() async {
+    var library = await checkLibrary('''
+class C {
+  static const x = 0;
+}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          static const x @25
+            type: int
+            constantInitializer
+              IntegerLiteral
+                literal: 0 @29
+                staticType: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic static get x @-1
+            returnType: int
+''');
+  }
+
+  test_class_field_propagatedType_final_dep_inLib() async {
+    addLibrarySource('/a.dart', 'final a = 1;');
+    var library = await checkLibrary('''
+import "a.dart";
+class C {
+  final b = a / 2;
+}''');
+    checkElementText(library, r'''
+library
+  imports
+    a.dart
+  definingUnit
+    classes
+      class C @23
+        fields
+          final b @35
+            type: double
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get b @-1
+            returnType: double
+''');
+  }
+
+  test_class_field_propagatedType_final_dep_inPart() async {
+    addSource('/a.dart', 'part of lib; final a = 1;');
+    var library = await checkLibrary('''
+library lib;
+part "a.dart";
+class C {
+  final b = a / 2;
+}''');
+    checkElementText(library, r'''
+library
+  name: lib
+  nameOffset: 8
+  definingUnit
+    classes
+      class C @34
+        fields
+          final b @46
+            type: double
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get b @-1
+            returnType: double
+  parts
+    a.dart
+      topLevelVariables
+        static final a @19
+          type: int
+      accessors
+        synthetic static get a @-1
+          returnType: int
+''');
+  }
+
+  test_class_field_propagatedType_final_noDep_instance() async {
+    var library = await checkLibrary('''
+class C {
+  final x = 0;
+}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          final x @18
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get x @-1
+            returnType: int
+''');
+  }
+
+  test_class_field_propagatedType_final_noDep_static() async {
+    var library = await checkLibrary('''
+class C {
+  static final x = 0;
+}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          static final x @25
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic static get x @-1
+            returnType: int
+''');
+  }
+
   test_class_field_static() async {
     var library = await checkLibrary('class C { static int i; }');
     checkElementText(library, r'''
@@ -2084,6 +4018,24 @@
 ''');
   }
 
+  test_class_field_static_final_untyped() async {
+    var library = await checkLibrary('class C { static final x = 0; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          static final x @23
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic static get x @-1
+            returnType: int
+''');
+  }
+
   test_class_field_static_late() async {
     var library = await checkLibrary('class C { static late int i; }');
     checkElementText(library, r'''
@@ -2107,6 +4059,116 @@
 ''');
   }
 
+  test_class_field_type_inferred_Never() async {
+    var library = await checkLibrary(r'''
+class C {
+  var a = throw 42;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          a @16
+            type: Never
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get a @-1
+            returnType: Never
+          synthetic set a @-1
+            parameters
+              requiredPositional _a @-1
+                type: Never
+            returnType: void
+''');
+  }
+
+  test_class_field_type_inferred_nonNullify() async {
+    addSource('/a.dart', '''
+// @dart = 2.7
+var a = 0;
+''');
+
+    var library = await checkLibrary(r'''
+import 'a.dart';
+class C {
+  var b = a;
+}
+''');
+
+    checkElementText(library, r'''
+library
+  imports
+    a.dart
+  definingUnit
+    classes
+      class C @23
+        fields
+          b @33
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get b @-1
+            returnType: int
+          synthetic set b @-1
+            parameters
+              requiredPositional _b @-1
+                type: int
+            returnType: void
+''');
+  }
+
+  test_class_field_typed() async {
+    var library = await checkLibrary('class C { int x = 0; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          x @14
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get x @-1
+            returnType: int
+          synthetic set x @-1
+            parameters
+              requiredPositional _x @-1
+                type: int
+            returnType: void
+''');
+  }
+
+  test_class_field_untyped() async {
+    var library = await checkLibrary('class C { var x = 0; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          x @14
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get x @-1
+            returnType: int
+          synthetic set x @-1
+            parameters
+              requiredPositional _x @-1
+                type: int
+            returnType: void
+''');
+  }
+
   test_class_fields() async {
     var library = await checkLibrary('class C { int i; int j; }');
     checkElementText(library, r'''
@@ -2242,6 +4304,7 @@
             type: int
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         accessors
           synthetic get f @-1
             returnType: int
@@ -2283,6 +4346,7 @@
             type: int
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         accessors
           synthetic get f @-1
             returnType: int
@@ -2555,6 +4619,72 @@
 ''');
   }
 
+  test_class_method_async() async {
+    var library = await checkLibrary(r'''
+import 'dart:async';
+class C {
+  Future f() async {}
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    dart:async
+  definingUnit
+    classes
+      class C @27
+        constructors
+          synthetic @-1
+        methods
+          f @40 async
+            returnType: Future<dynamic>
+''');
+  }
+
+  test_class_method_asyncStar() async {
+    var library = await checkLibrary(r'''
+import 'dart:async';
+class C {
+  Stream f() async* {}
+}
+''');
+    checkElementText(library, r'''
+library
+  imports
+    dart:async
+  definingUnit
+    classes
+      class C @27
+        constructors
+          synthetic @-1
+        methods
+          f @40 async*
+            returnType: Stream<dynamic>
+''');
+  }
+
+  test_class_method_documented() async {
+    var library = await checkLibrary('''
+class C {
+  /**
+   * Docs
+   */
+  f() {}
+}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          f @34
+            documentationComment: /**\n   * Docs\n   */
+            returnType: dynamic
+''');
+  }
+
   test_class_method_external() async {
     var library = await checkLibrary('class C { external f(); }');
     checkElementText(library, r'''
@@ -2570,6 +4700,88 @@
 ''');
   }
 
+  test_class_method_hasImplicitReturnType_false() async {
+    var library = await checkLibrary('''
+class C {
+  int m() => 0;
+}
+''');
+    var c = library.definingCompilationUnit.classes.single;
+    var m = c.methods.single;
+    expect(m.hasImplicitReturnType, isFalse);
+  }
+
+  test_class_method_hasImplicitReturnType_true() async {
+    var library = await checkLibrary('''
+class C {
+  m() => 0;
+}
+''');
+    var c = library.definingCompilationUnit.classes.single;
+    var m = c.methods.single;
+    expect(m.hasImplicitReturnType, isTrue);
+  }
+
+  test_class_method_inferred_type_nonStatic_implicit_param() async {
+    var library = await checkLibrary('class C extends D { void f(value) {} }'
+        ' abstract class D { void f(int value); }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        supertype: D
+        constructors
+          synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
+        methods
+          f @25
+            parameters
+              requiredPositional value @27
+                type: int
+            returnType: void
+      abstract class D @54
+        constructors
+          synthetic @-1
+        methods
+          abstract f @63
+            parameters
+              requiredPositional value @69
+                type: int
+            returnType: void
+''');
+  }
+
+  test_class_method_inferred_type_nonStatic_implicit_return() async {
+    var library = await checkLibrary('''
+class C extends D {
+  f() => null;
+}
+abstract class D {
+  int f();
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        supertype: D
+        constructors
+          synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
+        methods
+          f @22
+            returnType: int
+      abstract class D @52
+        constructors
+          synthetic @-1
+        methods
+          abstract f @62
+            returnType: int
+''');
+  }
+
   test_class_method_namedAsSupertype() async {
     var library = await checkLibrary(r'''
 class A {}
@@ -2588,6 +4800,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           A @38
             returnType: void
@@ -2648,6 +4861,106 @@
 ''');
   }
 
+  test_class_method_syncStar() async {
+    var library = await checkLibrary(r'''
+class C {
+  Iterable<int> f() sync* {
+    yield 42;
+  }
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          f @26 sync*
+            returnType: Iterable<int>
+''');
+  }
+
+  test_class_method_type_parameter() async {
+    var library = await checkLibrary('class C { T f<T, U>(U u) => null; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          f @12
+            typeParameters
+              covariant T @14
+              covariant U @17
+            parameters
+              requiredPositional u @22
+                type: U
+            returnType: T
+''');
+  }
+
+  test_class_method_type_parameter_in_generic_class() async {
+    var library = await checkLibrary('''
+class C<T, U> {
+  V f<V, W>(T t, U u, W w) => null;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+          covariant U @11
+            defaultType: dynamic
+        constructors
+          synthetic @-1
+        methods
+          f @20
+            typeParameters
+              covariant V @22
+              covariant W @25
+            parameters
+              requiredPositional t @30
+                type: T
+              requiredPositional u @35
+                type: U
+              requiredPositional w @40
+                type: W
+            returnType: V
+''');
+  }
+
+  test_class_method_type_parameter_with_function_typed_parameter() async {
+    var library = await checkLibrary('class C { void f<T, U>(T x(U u)) {} }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          f @15
+            typeParameters
+              covariant T @17
+              covariant U @20
+            parameters
+              requiredPositional x @25
+                type: T Function(U)
+                parameters
+                  requiredPositional u @29
+                    type: U
+            returnType: void
+''');
+  }
+
   test_class_methods() async {
     var library = await checkLibrary('class C { f() {} g() {} }');
     checkElementText(library, r'''
@@ -2685,6 +4998,7 @@
           G
         constructors
           synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
       class D @40
         constructors
           synthetic @-1
@@ -2718,6 +5032,7 @@
           C<double>
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
       class A @50
         constructors
           synthetic @-1
@@ -3155,6 +5470,153 @@
 ''');
   }
 
+  test_class_operator() async {
+    var library =
+        await checkLibrary('class C { C operator+(C other) => null; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          + @20
+            parameters
+              requiredPositional other @24
+                type: C
+            returnType: C
+''');
+  }
+
+  test_class_operator_equal() async {
+    var library = await checkLibrary('''
+class C {
+  bool operator==(Object other) => false;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          == @25
+            parameters
+              requiredPositional other @35
+                type: Object
+            returnType: bool
+''');
+  }
+
+  test_class_operator_external() async {
+    var library =
+        await checkLibrary('class C { external C operator+(C other); }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          external + @29
+            parameters
+              requiredPositional other @33
+                type: C
+            returnType: C
+''');
+  }
+
+  test_class_operator_greater_equal() async {
+    var library = await checkLibrary('''
+class C {
+  bool operator>=(C other) => false;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          >= @25
+            parameters
+              requiredPositional other @30
+                type: C
+            returnType: bool
+''');
+  }
+
+  test_class_operator_index() async {
+    var library =
+        await checkLibrary('class C { bool operator[](int i) => null; }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          [] @23
+            parameters
+              requiredPositional i @30
+                type: int
+            returnType: bool
+''');
+  }
+
+  test_class_operator_index_set() async {
+    var library = await checkLibrary('''
+class C {
+  void operator[]=(int i, bool v) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          []= @25
+            parameters
+              requiredPositional i @33
+                type: int
+              requiredPositional v @41
+                type: bool
+            returnType: void
+''');
+  }
+
+  test_class_operator_less_equal() async {
+    var library = await checkLibrary('''
+class C {
+  bool operator<=(C other) => false;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        constructors
+          synthetic @-1
+        methods
+          <= @25
+            parameters
+              requiredPositional other @30
+                type: C
+            returnType: bool
+''');
+  }
+
   test_class_ref_nullability_none() async {
     var library = await checkLibrary('''
 class C {}
@@ -3256,6 +5718,28 @@
 ''');
   }
 
+  test_class_setter_covariant() async {
+    var library =
+        await checkLibrary('class C { void set x(covariant int value); }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          synthetic x @-1
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          abstract set x @19
+            parameters
+              requiredPositional covariant value @35
+                type: int
+            returnType: void
+''');
+  }
+
   test_class_setter_external() async {
     var library =
         await checkLibrary('class C { external void set x(int value); }');
@@ -3320,6 +5804,140 @@
 ''');
   }
 
+  test_class_setter_inferred_type_conflictingInheritance() async {
+    var library = await checkLibrary('''
+class A {
+  int t;
+}
+class B extends A {
+  double t;
+}
+class C extends A implements B {
+}
+class D extends C {
+  void set t(p) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @6
+        fields
+          t @16
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get t @-1
+            returnType: int
+          synthetic set t @-1
+            parameters
+              requiredPositional _t @-1
+                type: int
+            returnType: void
+      class B @27
+        supertype: A
+        fields
+          t @50
+            type: double
+        constructors
+          synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
+        accessors
+          synthetic get t @-1
+            returnType: double
+          synthetic set t @-1
+            parameters
+              requiredPositional _t @-1
+                type: double
+            returnType: void
+      class C @61
+        supertype: A
+        interfaces
+          B
+        constructors
+          synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
+      class D @96
+        supertype: C
+        fields
+          synthetic t @-1
+            type: dynamic
+        constructors
+          synthetic @-1
+            superConstructor: self::@class::C::@constructor::•
+        accessors
+          set t @121
+            parameters
+              requiredPositional p @123
+                type: dynamic
+            returnType: void
+''');
+  }
+
+  test_class_setter_inferred_type_nonStatic_implicit_param() async {
+    var library =
+        await checkLibrary('class C extends D { void set f(value) {} }'
+            ' abstract class D { void set f(int value); }');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        supertype: D
+        fields
+          synthetic f @-1
+            type: int
+        constructors
+          synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
+        accessors
+          set f @29
+            parameters
+              requiredPositional value @31
+                type: int
+            returnType: void
+      abstract class D @58
+        fields
+          synthetic f @-1
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          abstract set f @71
+            parameters
+              requiredPositional value @77
+                type: int
+            returnType: void
+''');
+  }
+
+  test_class_setter_inferred_type_static_implicit_return() async {
+    var library = await checkLibrary('''
+class C {
+  static set f(int value) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class C @6
+        fields
+          synthetic static f @-1
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          static set f @23
+            parameters
+              requiredPositional value @29
+                type: int
+            returnType: void
+''');
+  }
+
   test_class_setter_invalid_named_parameter() async {
     var library = await checkLibrary('class C { void set x({a}) {} }');
     checkElementText(library, r'''
@@ -3496,6 +6114,7 @@
         supertype: D
         constructors
           synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
       class D @27
         constructors
           synthetic @-1
@@ -3515,6 +6134,9 @@
         supertype: D<int, double>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::D::@constructor::•
+              substitution: {T1: int, T2: double}
       class D @40
         typeParameters
           covariant T1 @42
@@ -3545,6 +6167,9 @@
         supertype: A<B>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: B}
 ''');
   }
 
@@ -3560,7 +6185,7 @@
 ''');
   }
 
-  test_class_type_parameters() async {
+  test_class_typeParameters() async {
     var library = await checkLibrary('class C<T, U> {}');
     checkElementText(library, r'''
 library
@@ -3577,7 +6202,7 @@
 ''');
   }
 
-  test_class_type_parameters_bound() async {
+  test_class_typeParameters_bound() async {
     var library = await checkLibrary('''
 class C<T extends Object, U extends D> {}
 class D {}
@@ -3602,7 +6227,7 @@
 ''');
   }
 
-  test_class_type_parameters_cycle_1of1() async {
+  test_class_typeParameters_cycle_1of1() async {
     var library = await checkLibrary('class C<T extends T> {}');
     checkElementText(library, r'''
 library
@@ -3618,7 +6243,7 @@
 ''');
   }
 
-  test_class_type_parameters_cycle_2of3() async {
+  test_class_typeParameters_cycle_2of3() async {
     var library = await checkLibrary(r'''
 class C<T extends V, U, V extends T> {}
 ''');
@@ -3641,42 +6266,6 @@
 ''');
   }
 
-  test_class_type_parameters_f_bound_complex() async {
-    var library = await checkLibrary('class C<T extends List<U>, U> {}');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      notSimplyBounded class C @6
-        typeParameters
-          covariant T @8
-            bound: List<U>
-            defaultType: List<dynamic>
-          covariant U @27
-            defaultType: dynamic
-        constructors
-          synthetic @-1
-''');
-  }
-
-  test_class_type_parameters_f_bound_simple() async {
-    var library = await checkLibrary('class C<T extends U, U> {}');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      notSimplyBounded class C @6
-        typeParameters
-          covariant T @8
-            bound: U
-            defaultType: dynamic
-          covariant U @21
-            defaultType: dynamic
-        constructors
-          synthetic @-1
-''');
-  }
-
   test_class_typeParameters_defaultType_cycle_genericFunctionType() async {
     var library = await checkLibrary(r'''
 class A<T extends void Function(A)> {}
@@ -4070,6 +6659,42 @@
 ''');
   }
 
+  test_class_typeParameters_f_bound_complex() async {
+    var library = await checkLibrary('class C<T extends List<U>, U> {}');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      notSimplyBounded class C @6
+        typeParameters
+          covariant T @8
+            bound: List<U>
+            defaultType: List<dynamic>
+          covariant U @27
+            defaultType: dynamic
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_class_typeParameters_f_bound_simple() async {
+    var library = await checkLibrary('class C<T extends U, U> {}');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      notSimplyBounded class C @6
+        typeParameters
+          covariant T @8
+            bound: U
+            defaultType: dynamic
+          covariant U @21
+            defaultType: dynamic
+        constructors
+          synthetic @-1
+''');
+  }
+
   test_class_typeParameters_variance_contravariant() async {
     var library = await checkLibrary('class C<in T> {}');
     checkElementText(library, r'''
@@ -4134,6 +6759,789 @@
 ''');
   }
 
+  test_classAlias() async {
+    var library = await checkLibrary('''
+class C = D with E, F, G;
+class D {}
+class E {}
+class F {}
+class G {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class alias C @6
+        supertype: D
+        mixins
+          E
+          F
+          G
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @32
+        constructors
+          synthetic @-1
+      class E @43
+        constructors
+          synthetic @-1
+      class F @54
+        constructors
+          synthetic @-1
+      class G @65
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_abstract() async {
+    var library = await checkLibrary('''
+abstract class C = D with E;
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      abstract class alias C @15
+        supertype: D
+        mixins
+          E
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @35
+        constructors
+          synthetic @-1
+      class E @46
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_documented() async {
+    var library = await checkLibrary('''
+/**
+ * Docs
+ */
+class C = D with E;
+
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class alias C @22
+        documentationComment: /**\n * Docs\n */
+        supertype: D
+        mixins
+          E
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @43
+        constructors
+          synthetic @-1
+      class E @54
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_documented_tripleSlash() async {
+    var library = await checkLibrary('''
+/// aaa
+/// b
+/// cc
+class C = D with E;
+
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class alias C @27
+        documentationComment: /// aaa\n/// b\n/// cc
+        supertype: D
+        mixins
+          E
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @48
+        constructors
+          synthetic @-1
+      class E @59
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_documented_withLeadingNonDocumentation() async {
+    var library = await checkLibrary('''
+// Extra comment so doc comment offset != 0
+/**
+ * Docs
+ */
+class C = D with E;
+
+class D {}
+class E {}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class alias C @66
+        documentationComment: /**\n * Docs\n */
+        supertype: D
+        mixins
+          E
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @87
+        constructors
+          synthetic @-1
+      class E @98
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_generic() async {
+    var library = await checkLibrary('''
+class Z = A with B<int>, C<double>;
+class A {}
+class B<B1> {}
+class C<C1> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class alias Z @6
+        supertype: A
+        mixins
+          B<int>
+          C<double>
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::A::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::A::@constructor::•
+      class A @42
+        constructors
+          synthetic @-1
+      class B @53
+        typeParameters
+          covariant B1 @55
+            defaultType: dynamic
+        constructors
+          synthetic @-1
+      class C @68
+        typeParameters
+          covariant C1 @70
+            defaultType: dynamic
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_notSimplyBounded_self() async {
+    var library = await checkLibrary('''
+class C<T extends C> = D with E;
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      notSimplyBounded class alias C @6
+        typeParameters
+          covariant T @8
+            bound: C<dynamic>
+            defaultType: dynamic
+        supertype: D
+        mixins
+          E
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @39
+        constructors
+          synthetic @-1
+      class E @50
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_notSimplyBounded_simple_no_type_parameter_bound() async {
+    // If no bounds are specified, then the class is simply bounded by syntax
+    // alone, so there is no reason to assign it a slot.
+    var library = await checkLibrary('''
+class C<T> = D with E;
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class alias C @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+        supertype: D
+        mixins
+          E
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @29
+        constructors
+          synthetic @-1
+      class E @40
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_notSimplyBounded_simple_non_generic() async {
+    // If no type parameters are specified, then the class is simply bounded, so
+    // there is no reason to assign it a slot.
+    var library = await checkLibrary('''
+class C = D with E;
+class D {}
+class E {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class alias C @6
+        supertype: D
+        mixins
+          E
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @26
+        constructors
+          synthetic @-1
+      class E @37
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_classAlias_with_const_constructors() async {
+    testFile = convertPath('/home/test/lib/test.dart');
+    addLibrarySource('/home/test/lib/a.dart', r'''
+class Base {
+  const Base._priv();
+  const Base();
+  const Base.named();
+}
+''');
+    var library = await checkLibrary('''
+import "a.dart";
+class M {}
+class MixinApp = Base with M;
+''');
+    checkElementText(library, r'''
+library
+  imports
+    package:test/a.dart
+  definingUnit
+    classes
+      class M @23
+        constructors
+          synthetic @-1
+      class alias MixinApp @34
+        supertype: Base
+        mixins
+          M
+        constructors
+          synthetic const @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::•
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::•
+          synthetic const named @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: package:test/a.dart::@class::Base::@constructor::named
+                  staticType: null
+                  token: named @-1
+                period: . @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::named
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::named
+''');
+  }
+
+  test_classAlias_with_forwarding_constructors() async {
+    testFile = convertPath('/home/test/lib/test.dart');
+    addLibrarySource('/home/test/lib/a.dart', r'''
+class Base {
+  bool x = true;
+  Base._priv();
+  Base();
+  Base.noArgs();
+  Base.requiredArg(x);
+  Base.positionalArg([bool x = true]);
+  Base.positionalArg2([this.x = true]);
+  Base.namedArg({int x = 42});
+  Base.namedArg2({this.x = true});
+  factory Base.fact() => Base();
+  factory Base.fact2() = Base.noArgs;
+}
+''');
+    var library = await checkLibrary('''
+import "a.dart";
+class M {}
+class MixinApp = Base with M;
+''');
+    checkElementText(library, r'''
+library
+  imports
+    package:test/a.dart
+  definingUnit
+    classes
+      class M @23
+        constructors
+          synthetic @-1
+      class alias MixinApp @34
+        supertype: Base
+        mixins
+          M
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::•
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::•
+          synthetic noArgs @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: package:test/a.dart::@class::Base::@constructor::noArgs
+                  staticType: null
+                  token: noArgs @-1
+                period: . @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::noArgs
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::noArgs
+          synthetic requiredArg @-1
+            parameters
+              requiredPositional x @-1
+                type: dynamic
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    SimpleIdentifier
+                      staticElement: x@-1
+                      staticType: dynamic
+                      token: x @-1
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: package:test/a.dart::@class::Base::@constructor::requiredArg
+                  staticType: null
+                  token: requiredArg @-1
+                period: . @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::requiredArg
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::requiredArg
+          synthetic positionalArg @-1
+            parameters
+              optionalPositional x @-1
+                type: bool
+                constantInitializer
+                  BooleanLiteral
+                    literal: true @127
+                    staticType: bool
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    SimpleIdentifier
+                      staticElement: x@-1
+                      staticType: bool
+                      token: x @-1
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: package:test/a.dart::@class::Base::@constructor::positionalArg
+                  staticType: null
+                  token: positionalArg @-1
+                period: . @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::positionalArg
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::positionalArg
+          synthetic positionalArg2 @-1
+            parameters
+              optionalPositional final x @-1
+                type: bool
+                constantInitializer
+                  BooleanLiteral
+                    literal: true @167
+                    staticType: bool
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    SimpleIdentifier
+                      staticElement: x@-1
+                      staticType: bool
+                      token: x @-1
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: package:test/a.dart::@class::Base::@constructor::positionalArg2
+                  staticType: null
+                  token: positionalArg2 @-1
+                period: . @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::positionalArg2
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::positionalArg2
+          synthetic namedArg @-1
+            parameters
+              optionalNamed x @-1
+                type: int
+                constantInitializer
+                  IntegerLiteral
+                    literal: 42 @200
+                    staticType: int
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    SimpleIdentifier
+                      staticElement: x@-1
+                      staticType: int
+                      token: x @-1
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: package:test/a.dart::@class::Base::@constructor::namedArg
+                  staticType: null
+                  token: namedArg @-1
+                period: . @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::namedArg
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::namedArg
+          synthetic namedArg2 @-1
+            parameters
+              optionalNamed final x @-1
+                type: bool
+                constantInitializer
+                  BooleanLiteral
+                    literal: true @233
+                    staticType: bool
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    SimpleIdentifier
+                      staticElement: x@-1
+                      staticType: bool
+                      token: x @-1
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: package:test/a.dart::@class::Base::@constructor::namedArg2
+                  staticType: null
+                  token: namedArg2 @-1
+                period: . @0
+                staticElement: package:test/a.dart::@class::Base::@constructor::namedArg2
+                superKeyword: super @0
+            superConstructor: package:test/a.dart::@class::Base::@constructor::namedArg2
+''');
+  }
+
+  test_classAlias_with_forwarding_constructors_type_substitution() async {
+    var library = await checkLibrary('''
+class Base<T> {
+  Base.ctor(T t, List<T> l);
+}
+class M {}
+class MixinApp = Base with M;
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class Base @6
+        typeParameters
+          covariant T @11
+            defaultType: dynamic
+        constructors
+          ctor @23
+            periodOffset: 22
+            nameEnd: 27
+            parameters
+              requiredPositional t @30
+                type: T
+              requiredPositional l @41
+                type: List<T>
+      class M @53
+        constructors
+          synthetic @-1
+      class alias MixinApp @64
+        supertype: Base<dynamic>
+        mixins
+          M
+        constructors
+          synthetic ctor @-1
+            parameters
+              requiredPositional t @-1
+                type: dynamic
+              requiredPositional l @-1
+                type: List<dynamic>
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    SimpleIdentifier
+                      staticElement: t@-1
+                      staticType: dynamic
+                      token: t @-1
+                    SimpleIdentifier
+                      staticElement: l@-1
+                      staticType: List<dynamic>
+                      token: l @-1
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::Base::@constructor::ctor
+                  staticType: null
+                  token: ctor @-1
+                period: . @0
+                staticElement: self::@class::Base::@constructor::ctor
+                superKeyword: super @0
+            superConstructor: ConstructorMember
+              base: self::@class::Base::@constructor::ctor
+              substitution: {T: dynamic}
+''');
+  }
+
+  test_classAlias_with_forwarding_constructors_type_substitution_complex() async {
+    var library = await checkLibrary('''
+class Base<T> {
+  Base.ctor(T t, List<T> l);
+}
+class M {}
+class MixinApp<U> = Base<List<U>> with M;
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class Base @6
+        typeParameters
+          covariant T @11
+            defaultType: dynamic
+        constructors
+          ctor @23
+            periodOffset: 22
+            nameEnd: 27
+            parameters
+              requiredPositional t @30
+                type: T
+              requiredPositional l @41
+                type: List<T>
+      class M @53
+        constructors
+          synthetic @-1
+      class alias MixinApp @64
+        typeParameters
+          covariant U @73
+            defaultType: dynamic
+        supertype: Base<List<U>>
+        mixins
+          M
+        constructors
+          synthetic ctor @-1
+            parameters
+              requiredPositional t @-1
+                type: List<U>
+              requiredPositional l @-1
+                type: List<List<U>>
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  arguments
+                    SimpleIdentifier
+                      staticElement: t@-1
+                      staticType: List<U>
+                      token: t @-1
+                    SimpleIdentifier
+                      staticElement: l@-1
+                      staticType: List<List<U>>
+                      token: l @-1
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: SimpleIdentifier
+                  staticElement: self::@class::Base::@constructor::ctor
+                  staticType: null
+                  token: ctor @-1
+                period: . @0
+                staticElement: self::@class::Base::@constructor::ctor
+                superKeyword: super @0
+            superConstructor: ConstructorMember
+              base: self::@class::Base::@constructor::ctor
+              substitution: {T: List<U>}
+''');
+  }
+
+  test_classAlias_with_mixin_members() async {
+    var library = await checkLibrary('''
+class C = D with E;
+class D {}
+class E {
+  int get a => null;
+  void set b(int i) {}
+  void f() {}
+  int x;
+}''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class alias C @6
+        supertype: D
+        mixins
+          E
+        constructors
+          synthetic @-1
+            constantInitializers
+              SuperConstructorInvocation
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                staticElement: self::@class::D::@constructor::•
+                superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
+      class D @26
+        constructors
+          synthetic @-1
+      class E @37
+        fields
+          x @105
+            type: int
+          synthetic a @-1
+            type: int
+          synthetic b @-1
+            type: int
+        constructors
+          synthetic @-1
+        accessors
+          synthetic get x @-1
+            returnType: int
+          synthetic set x @-1
+            parameters
+              requiredPositional _x @-1
+                type: int
+            returnType: void
+          get a @51
+            returnType: int
+          set b @73
+            parameters
+              requiredPositional i @79
+                type: int
+            returnType: void
+        methods
+          f @92
+            returnType: void
+''');
+  }
+
   test_classes() async {
     var library = await checkLibrary('class C {} class D {}');
     checkElementText(library, r'''
@@ -4776,8 +8184,7 @@
       enum E @5
         codeOffset: 0
         codeLength: 26
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -6187,7 +9594,7 @@
               staticType: num
               token: a @27
             staticType: int
-            type: TypeName
+            type: NamedType
               name: SimpleIdentifier
                 staticElement: dart:core::@class::int
                 staticType: null
@@ -6399,7 +9806,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::•
                 substitution: {T: int}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -6429,7 +9836,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::named
                 substitution: {T: int}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -6486,7 +9893,7 @@
                 token: named @37
               period: . @36
               staticElement: self::@class::A::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -6583,7 +9990,7 @@
               int
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -6696,6 +10103,9 @@
         supertype: P<T>
         constructors
           const @64
+            superConstructor: ConstructorMember
+              base: self::@class::P::@constructor::•
+              substitution: {T: T}
       class P2 @79
         typeParameters
           covariant T @82
@@ -6703,6 +10113,9 @@
         supertype: P<T>
         constructors
           const @108
+            superConstructor: ConstructorMember
+              base: self::@class::P::@constructor::•
+              substitution: {T: T}
     topLevelVariables
       static const values @131
         type: List<P<dynamic>>
@@ -6717,7 +10130,7 @@
                   staticElement: ConstructorMember
                     base: self::@class::P1::@constructor::•
                     substitution: {T: dynamic}
-                  type: TypeName
+                  type: NamedType
                     name: SimpleIdentifier
                       staticElement: self::@class::P1
                       staticType: null
@@ -6732,7 +10145,7 @@
                   staticElement: ConstructorMember
                     base: self::@class::P2::@constructor::•
                     substitution: {T: int}
-                  type: TypeName
+                  type: NamedType
                     name: SimpleIdentifier
                       staticElement: self::@class::P2
                       staticType: null
@@ -6740,7 +10153,7 @@
                     type: P2<int>
                     typeArguments: TypeArgumentList
                       arguments
-                        TypeName
+                        NamedType
                           name: SimpleIdentifier
                             staticElement: dart:core::@class::int
                             staticType: null
@@ -7029,7 +10442,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::named
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7037,13 +10450,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @63
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7099,7 +10512,7 @@
               staticElement: ConstructorMember
                 base: a.dart::@class::C::@constructor::named
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: a.dart::@class::C
                   staticType: null
@@ -7107,13 +10520,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @35
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7169,7 +10582,7 @@
               staticElement: ConstructorMember
                 base: a.dart::@class::C::@constructor::named
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -7185,13 +10598,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @42
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7238,7 +10651,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::•
                 substitution: {K: dynamic, V: dynamic}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7283,7 +10696,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::•
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7291,13 +10704,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @49
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7340,7 +10753,7 @@
               staticElement: ConstructorMember
                 base: a.dart::@class::C::@constructor::•
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: a.dart::@class::C
                   staticType: null
@@ -7348,13 +10761,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @35
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7397,7 +10810,7 @@
               staticElement: ConstructorMember
                 base: a.dart::@class::C::@constructor::•
                 substitution: {K: int, V: String}
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -7413,13 +10826,13 @@
                 type: C<int, String>
                 typeArguments: TypeArgumentList
                   arguments
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
                         token: int @42
                       type: int
-                    TypeName
+                    NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::String
                         staticType: null
@@ -7504,7 +10917,7 @@
                 token: named @91
               period: . @90
               staticElement: self::@class::C::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7548,7 +10961,7 @@
                 token: named @35
               period: . @34
               staticElement: a.dart::@class::C::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: a.dart::@class::C
                   staticType: null
@@ -7592,7 +11005,7 @@
                 token: named @42
               period: . @41
               staticElement: a.dart::@class::C::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -7641,7 +11054,7 @@
                 token: named @29
               period: . @28
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7672,7 +11085,7 @@
               rightParenthesis: ) @24
             constructorName: ConstructorName
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -7723,7 +11136,7 @@
                 token: named @42
               period: . @41
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -7771,7 +11184,7 @@
                 token: named @42
               period: . @41
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -7815,7 +11228,7 @@
                 token: named @20
               period: . @19
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -7867,7 +11280,7 @@
                 token: named @32
               period: . @31
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7905,7 +11318,7 @@
               rightParenthesis: ) @43
             constructorName: ConstructorName
               staticElement: self::@class::C::@constructor::•
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -7944,7 +11357,7 @@
               rightParenthesis: ) @35
             constructorName: ConstructorName
               staticElement: a.dart::@class::C::@constructor::•
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: a.dart::@class::C
                   staticType: null
@@ -7983,7 +11396,7 @@
               rightParenthesis: ) @42
             constructorName: ConstructorName
               staticElement: a.dart::@class::C::@constructor::•
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: a.dart::@class::C
@@ -8022,7 +11435,7 @@
               rightParenthesis: ) @18
             constructorName: ConstructorName
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: <null>
                   staticType: null
@@ -8057,7 +11470,7 @@
               rightParenthesis: ) @42
             constructorName: ConstructorName
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -8096,7 +11509,7 @@
               rightParenthesis: ) @20
             constructorName: ConstructorName
               staticElement: <null>
-              type: TypeName
+              type: NamedType
                 name: PrefixedIdentifier
                   identifier: SimpleIdentifier
                     staticElement: <null>
@@ -8143,7 +11556,7 @@
               token: a @23
             isOperator: is @25
             staticType: bool
-            type: TypeName
+            type: NamedType
               name: SimpleIdentifier
                 staticElement: dart:core::@class::int
                 staticType: null
@@ -8509,7 +11922,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8552,7 +11965,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8620,7 +12033,7 @@
                   staticType: List<int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -8634,7 +12047,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8673,7 +12086,7 @@
                   staticType: List<int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -8687,7 +12100,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8732,13 +12145,13 @@
             staticType: Map<int, int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @24
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8828,13 +12241,13 @@
                   staticType: Map<int, int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
                           token: int @38
                         type: int
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -8849,13 +12262,13 @@
             staticType: Map<int, int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @24
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8899,13 +12312,13 @@
                   staticType: Map<int, int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
                           token: int @39
                         type: int
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -8920,13 +12333,13 @@
             staticType: Map<int, int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @24
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -8970,7 +12383,7 @@
               int
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -9941,8 +13354,7 @@
           synthetic @-1
     enums
       enum E @30
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -10345,7 +13757,7 @@
             staticType: Set<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -10426,7 +13838,7 @@
                   staticType: Set<int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -10441,7 +13853,7 @@
             staticType: Set<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -10481,7 +13893,7 @@
                   staticType: Set<int>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
@@ -10496,7 +13908,7 @@
             staticType: Set<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -11495,7 +14907,7 @@
             staticType: List<Null>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::Null
                     staticType: null
@@ -11523,7 +14935,7 @@
             staticType: List<dynamic>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dynamic@-1
                     staticType: null
@@ -11551,7 +14963,7 @@
             staticType: List<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -11569,7 +14981,7 @@
             staticType: List<List<dynamic>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::List
                     staticType: null
@@ -11587,7 +14999,7 @@
             staticType: List<List<String>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::List
                     staticType: null
@@ -11595,7 +15007,7 @@
                   type: List<String>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -11615,7 +15027,7 @@
             staticType: List<Map<int, List<String>>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::Map
                     staticType: null
@@ -11623,13 +15035,13 @@
                   type: Map<int, List<String>>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::int
                           staticType: null
                           token: int @288
                         type: int
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::List
                           staticType: null
@@ -11637,7 +15049,7 @@
                         type: List<String>
                         typeArguments: TypeArgumentList
                           arguments
-                            TypeName
+                            NamedType
                               name: SimpleIdentifier
                                 staticElement: dart:core::@class::String
                                 staticType: null
@@ -11687,7 +15099,7 @@
             staticType: List<C>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: a.dart::@class::C
                     staticType: null
@@ -11723,7 +15135,7 @@
             staticType: List<C>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: PrefixedIdentifier
                     identifier: SimpleIdentifier
                       staticElement: a.dart::@class::C
@@ -11772,7 +15184,7 @@
             staticType: List<int Function(String)>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: self::@typeAlias::F
                     staticType: null
@@ -11808,13 +15220,13 @@
             staticType: Map<dynamic, int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dynamic@-1
                     staticType: null
                     token: dynamic @25
                   type: dynamic
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -11833,13 +15245,13 @@
             staticType: Map<int, dynamic>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @67
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dynamic@-1
                     staticType: null
@@ -11858,13 +15270,13 @@
             staticType: Map<int, String>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @110
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::String
                     staticType: null
@@ -11883,13 +15295,13 @@
             staticType: Map<int, List<String>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
                     token: int @169
                   type: int
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::List
                     staticType: null
@@ -11897,7 +15309,7 @@
                   type: List<String>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -11940,7 +15352,7 @@
             staticType: Set<dynamic>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dynamic@-1
                     staticType: null
@@ -11959,7 +15371,7 @@
             staticType: Set<int>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -11978,7 +15390,7 @@
             staticType: Set<List<String>>
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::List
                     staticType: null
@@ -11986,7 +15398,7 @@
                   type: List<String>
                   typeArguments: TypeArgumentList
                     arguments
-                      TypeName
+                      NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -12126,7 +15538,7 @@
         constantInitializer
           TypeLiteral
             staticType: Type
-            typeName: TypeName
+            type: NamedType
               name: SimpleIdentifier
                 staticElement: dart:core::@class::List
                 staticType: List<int>
@@ -12134,7 +15546,7 @@
               type: List<int>
               typeArguments: TypeArgumentList
                 arguments
-                  TypeName
+                  NamedType
                     name: SimpleIdentifier
                       staticElement: dart:core::@class::int
                       staticType: null
@@ -12160,8 +15572,7 @@
   definingUnit
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -12214,8 +15625,7 @@
   definingUnit
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -12309,1670 +15719,6 @@
 ''');
   }
 
-  test_constructor_documented() async {
-    var library = await checkLibrary('''
-class C {
-  /**
-   * Docs
-   */
-  C();
-}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          @34
-            documentationComment: /**\n   * Docs\n   */
-''');
-  }
-
-  test_constructor_initializers_assertInvocation() async {
-    var library = await checkLibrary('''
-class C {
-  const C(int x) : assert(x >= 42);
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          const @18
-            parameters
-              requiredPositional x @24
-                type: int
-            constantInitializers
-              AssertInitializer
-                assertKeyword: assert @29
-                condition: BinaryExpression
-                  leftOperand: SimpleIdentifier
-                    staticElement: x@24
-                    staticType: int
-                    token: x @36
-                  operator: >= @38
-                  rightOperand: IntegerLiteral
-                    literal: 42 @41
-                    staticType: int
-                  staticElement: dart:core::@class::num::@method::>=
-                  staticInvokeType: bool Function(num)
-                  staticType: bool
-                leftParenthesis: ( @35
-                rightParenthesis: ) @43
-''');
-  }
-
-  test_constructor_initializers_assertInvocation_message() async {
-    var library = await checkLibrary('''
-class C {
-  const C(int x) : assert(x >= 42, 'foo');
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          const @18
-            parameters
-              requiredPositional x @24
-                type: int
-            constantInitializers
-              AssertInitializer
-                assertKeyword: assert @29
-                condition: BinaryExpression
-                  leftOperand: SimpleIdentifier
-                    staticElement: x@24
-                    staticType: int
-                    token: x @36
-                  operator: >= @38
-                  rightOperand: IntegerLiteral
-                    literal: 42 @41
-                    staticType: int
-                  staticElement: dart:core::@class::num::@method::>=
-                  staticInvokeType: bool Function(num)
-                  staticType: bool
-                leftParenthesis: ( @35
-                message: SimpleStringLiteral
-                  literal: 'foo' @45
-                rightParenthesis: ) @50
-''');
-  }
-
-  test_constructor_initializers_field() async {
-    var library = await checkLibrary('''
-class C {
-  final x;
-  const C() : x = 42;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          final x @18
-            type: dynamic
-        constructors
-          const @29
-            constantInitializers
-              ConstructorFieldInitializer
-                equals: = @37
-                expression: IntegerLiteral
-                  literal: 42 @39
-                  staticType: int
-                fieldName: SimpleIdentifier
-                  staticElement: self::@class::C::@field::x
-                  staticType: null
-                  token: x @35
-        accessors
-          synthetic get x @-1
-            returnType: dynamic
-''');
-  }
-
-  test_constructor_initializers_field_notConst() async {
-    var library = await checkLibrary('''
-class C {
-  final x;
-  const C() : x = foo();
-}
-int foo() => 42;
-''', allowErrors: true);
-    // It is OK to keep non-constant initializers.
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          final x @18
-            type: dynamic
-        constructors
-          const @29
-            constantInitializers
-              ConstructorFieldInitializer
-                equals: = @37
-                expression: MethodInvocation
-                  argumentList: ArgumentList
-                    leftParenthesis: ( @42
-                    rightParenthesis: ) @43
-                  methodName: SimpleIdentifier
-                    staticElement: self::@function::foo
-                    staticType: int Function()
-                    token: foo @39
-                  staticInvokeType: int Function()
-                  staticType: int
-                fieldName: SimpleIdentifier
-                  staticElement: self::@class::C::@field::x
-                  staticType: null
-                  token: x @35
-        accessors
-          synthetic get x @-1
-            returnType: dynamic
-    functions
-      foo @52
-        returnType: int
-''');
-  }
-
-  test_constructor_initializers_field_optionalPositionalParameter() async {
-    var library = await checkLibrary('''
-class A {
-  final int _f;
-  const A([int f = 0]) : _f = f;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        fields
-          final _f @22
-            type: int
-        constructors
-          const @34
-            parameters
-              optionalPositional f @41
-                type: int
-                constantInitializer
-                  IntegerLiteral
-                    literal: 0 @45
-                    staticType: int
-            constantInitializers
-              ConstructorFieldInitializer
-                equals: = @54
-                expression: SimpleIdentifier
-                  staticElement: self::@class::A::@constructor::•::@parameter::f
-                  staticType: int
-                  token: f @56
-                fieldName: SimpleIdentifier
-                  staticElement: self::@class::A::@field::_f
-                  staticType: null
-                  token: _f @51
-        accessors
-          synthetic get _f @-1
-            returnType: int
-''');
-  }
-
-  test_constructor_initializers_field_withParameter() async {
-    var library = await checkLibrary('''
-class C {
-  final x;
-  const C(int p) : x = 1 + p;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          final x @18
-            type: dynamic
-        constructors
-          const @29
-            parameters
-              requiredPositional p @35
-                type: int
-            constantInitializers
-              ConstructorFieldInitializer
-                equals: = @42
-                expression: BinaryExpression
-                  leftOperand: IntegerLiteral
-                    literal: 1 @44
-                    staticType: int
-                  operator: + @46
-                  rightOperand: SimpleIdentifier
-                    staticElement: p@35
-                    staticType: int
-                    token: p @48
-                  staticElement: dart:core::@class::num::@method::+
-                  staticInvokeType: num Function(num)
-                  staticType: int
-                fieldName: SimpleIdentifier
-                  staticElement: self::@class::C::@field::x
-                  staticType: null
-                  token: x @40
-        accessors
-          synthetic get x @-1
-            returnType: dynamic
-''');
-  }
-
-  test_constructor_initializers_genericFunctionType() async {
-    var library = await checkLibrary('''
-class A<T> {
-  const A();
-}
-class B {
-  const B(dynamic x);
-  const B.f()
-   : this(A<Function()>());
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        typeParameters
-          covariant T @8
-            defaultType: dynamic
-        constructors
-          const @21
-      class B @34
-        constructors
-          const @46
-            parameters
-              requiredPositional x @56
-                type: dynamic
-          const f @70
-            periodOffset: 69
-            nameEnd: 71
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    InstanceCreationExpression
-                      argumentList: ArgumentList
-                        leftParenthesis: ( @97
-                        rightParenthesis: ) @98
-                      constructorName: ConstructorName
-                        staticElement: ConstructorMember
-                          base: self::@class::A::@constructor::•
-                          substitution: {T: dynamic Function()}
-                        type: TypeName
-                          name: SimpleIdentifier
-                            staticElement: self::@class::A
-                            staticType: null
-                            token: A @84
-                          type: A<dynamic Function()>
-                          typeArguments: TypeArgumentList
-                            arguments
-                              GenericFunctionType
-                                declaredElement: GenericFunctionTypeElement
-                                  parameters
-                                  returnType: dynamic
-                                  type: dynamic Function()
-                                functionKeyword: Function @86
-                                parameters: FormalParameterList
-                                  leftParenthesis: ( @94
-                                  rightParenthesis: ) @95
-                                type: dynamic Function()
-                            leftBracket: < @85
-                            rightBracket: > @96
-                      staticType: A<dynamic Function()>
-                  leftParenthesis: ( @83
-                  rightParenthesis: ) @99
-                staticElement: self::@class::B::@constructor::•
-                thisKeyword: this @79
-            redirectedConstructor: self::@class::B::@constructor::•
-''');
-  }
-
-  test_constructor_initializers_superInvocation_argumentContextType() async {
-    var library = await checkLibrary('''
-class A {
-  const A(List<String> values);
-}
-class B extends A {
-  const B() : super(const []);
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        constructors
-          const @18
-            parameters
-              requiredPositional values @33
-                type: List<String>
-      class B @50
-        supertype: A
-        constructors
-          const @72
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    ListLiteral
-                      constKeyword: const @84
-                      leftBracket: [ @90
-                      rightBracket: ] @91
-                      staticType: List<String>
-                  leftParenthesis: ( @83
-                  rightParenthesis: ) @92
-                staticElement: self::@class::A::@constructor::•
-                superKeyword: super @78
-''');
-  }
-
-  test_constructor_initializers_superInvocation_named() async {
-    var library = await checkLibrary('''
-class A {
-  const A.aaa(int p);
-}
-class C extends A {
-  const C() : super.aaa(42);
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        constructors
-          const aaa @20
-            periodOffset: 19
-            nameEnd: 23
-            parameters
-              requiredPositional p @28
-                type: int
-      class C @40
-        supertype: A
-        constructors
-          const @62
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    IntegerLiteral
-                      literal: 42 @78
-                      staticType: int
-                  leftParenthesis: ( @77
-                  rightParenthesis: ) @80
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::A::@constructor::aaa
-                  staticType: null
-                  token: aaa @74
-                period: . @73
-                staticElement: self::@class::A::@constructor::aaa
-                superKeyword: super @68
-''');
-  }
-
-  test_constructor_initializers_superInvocation_named_underscore() async {
-    var library = await checkLibrary('''
-class A {
-  const A._();
-}
-class B extends A {
-  const B() : super._();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        constructors
-          const _ @20
-            periodOffset: 19
-            nameEnd: 21
-      class B @33
-        supertype: A
-        constructors
-          const @55
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @68
-                  rightParenthesis: ) @69
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::A::@constructor::_
-                  staticType: null
-                  token: _ @67
-                period: . @66
-                staticElement: self::@class::A::@constructor::_
-                superKeyword: super @61
-''');
-  }
-
-  test_constructor_initializers_superInvocation_namedExpression() async {
-    var library = await checkLibrary('''
-class A {
-  const A.aaa(a, {int b});
-}
-class C extends A {
-  const C() : super.aaa(1, b: 2);
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        constructors
-          const aaa @20
-            periodOffset: 19
-            nameEnd: 23
-            parameters
-              requiredPositional a @24
-                type: dynamic
-              optionalNamed b @32
-                type: int
-      class C @45
-        supertype: A
-        constructors
-          const @67
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    IntegerLiteral
-                      literal: 1 @83
-                      staticType: int
-                    NamedExpression
-                      name: Label
-                        label: SimpleIdentifier
-                          staticElement: self::@class::A::@constructor::aaa::@parameter::b
-                          staticType: null
-                          token: b @86
-                      expression: IntegerLiteral
-                        literal: 2 @89
-                        staticType: int
-                  leftParenthesis: ( @82
-                  rightParenthesis: ) @90
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::A::@constructor::aaa
-                  staticType: null
-                  token: aaa @79
-                period: . @78
-                staticElement: self::@class::A::@constructor::aaa
-                superKeyword: super @73
-''');
-  }
-
-  test_constructor_initializers_superInvocation_unnamed() async {
-    var library = await checkLibrary('''
-class A {
-  const A(int p);
-}
-class C extends A {
-  const C.ccc() : super(42);
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        constructors
-          const @18
-            parameters
-              requiredPositional p @24
-                type: int
-      class C @36
-        supertype: A
-        constructors
-          const ccc @60
-            periodOffset: 59
-            nameEnd: 63
-            constantInitializers
-              SuperConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    IntegerLiteral
-                      literal: 42 @74
-                      staticType: int
-                  leftParenthesis: ( @73
-                  rightParenthesis: ) @76
-                staticElement: self::@class::A::@constructor::•
-                superKeyword: super @68
-''');
-  }
-
-  test_constructor_initializers_thisInvocation_argumentContextType() async {
-    var library = await checkLibrary('''
-class A {
-  const A(List<String> values);
-  const A.empty() : this(const []);
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        constructors
-          const @18
-            parameters
-              requiredPositional values @33
-                type: List<String>
-          const empty @52
-            periodOffset: 51
-            nameEnd: 57
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    ListLiteral
-                      constKeyword: const @67
-                      leftBracket: [ @73
-                      rightBracket: ] @74
-                      staticType: List<String>
-                  leftParenthesis: ( @66
-                  rightParenthesis: ) @75
-                staticElement: self::@class::A::@constructor::•
-                thisKeyword: this @62
-            redirectedConstructor: self::@class::A::@constructor::•
-''');
-  }
-
-  test_constructor_initializers_thisInvocation_named() async {
-    var library = await checkLibrary('''
-class C {
-  const C() : this.named(1, 'bbb');
-  const C.named(int a, String b);
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          const @18
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    IntegerLiteral
-                      literal: 1 @35
-                      staticType: int
-                    SimpleStringLiteral
-                      literal: 'bbb' @38
-                  leftParenthesis: ( @34
-                  rightParenthesis: ) @43
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::C::@constructor::named
-                  staticType: null
-                  token: named @29
-                period: . @28
-                staticElement: self::@class::C::@constructor::named
-                thisKeyword: this @24
-            redirectedConstructor: self::@class::C::@constructor::named
-          const named @56
-            periodOffset: 55
-            nameEnd: 61
-            parameters
-              requiredPositional a @66
-                type: int
-              requiredPositional b @76
-                type: String
-''');
-  }
-
-  test_constructor_initializers_thisInvocation_namedExpression() async {
-    var library = await checkLibrary('''
-class C {
-  const C() : this.named(1, b: 2);
-  const C.named(a, {int b});
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          const @18
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    IntegerLiteral
-                      literal: 1 @35
-                      staticType: int
-                    NamedExpression
-                      name: Label
-                        label: SimpleIdentifier
-                          staticElement: self::@class::C::@constructor::named::@parameter::b
-                          staticType: null
-                          token: b @38
-                      expression: IntegerLiteral
-                        literal: 2 @41
-                        staticType: int
-                  leftParenthesis: ( @34
-                  rightParenthesis: ) @42
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::C::@constructor::named
-                  staticType: null
-                  token: named @29
-                period: . @28
-                staticElement: self::@class::C::@constructor::named
-                thisKeyword: this @24
-            redirectedConstructor: self::@class::C::@constructor::named
-          const named @55
-            periodOffset: 54
-            nameEnd: 60
-            parameters
-              requiredPositional a @61
-                type: dynamic
-              optionalNamed b @69
-                type: int
-''');
-  }
-
-  test_constructor_initializers_thisInvocation_unnamed() async {
-    var library = await checkLibrary('''
-class C {
-  const C.named() : this(1, 'bbb');
-  const C(int a, String b);
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          const named @20
-            periodOffset: 19
-            nameEnd: 25
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  arguments
-                    IntegerLiteral
-                      literal: 1 @35
-                      staticType: int
-                    SimpleStringLiteral
-                      literal: 'bbb' @38
-                  leftParenthesis: ( @34
-                  rightParenthesis: ) @43
-                staticElement: self::@class::C::@constructor::•
-                thisKeyword: this @30
-            redirectedConstructor: self::@class::C::@constructor::•
-          const @54
-            parameters
-              requiredPositional a @60
-                type: int
-              requiredPositional b @70
-                type: String
-''');
-  }
-
-  test_constructor_redirected_factory_named() async {
-    var library = await checkLibrary('''
-class C {
-  factory C() = D.named;
-  C._();
-}
-class D extends C {
-  D.named() : super._();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          factory @20
-            redirectedConstructor: self::@class::D::@constructor::named
-          _ @39
-            periodOffset: 38
-            nameEnd: 40
-      class D @52
-        supertype: C
-        constructors
-          named @70
-            periodOffset: 69
-            nameEnd: 75
-''');
-  }
-
-  test_constructor_redirected_factory_named_generic() async {
-    var library = await checkLibrary('''
-class C<T, U> {
-  factory C() = D<U, T>.named;
-  C._();
-}
-class D<T, U> extends C<U, T> {
-  D.named() : super._();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        typeParameters
-          covariant T @8
-            defaultType: dynamic
-          covariant U @11
-            defaultType: dynamic
-        constructors
-          factory @26
-            redirectedConstructor: ConstructorMember
-              base: self::@class::D::@constructor::named
-              substitution: {T: U, U: T}
-          _ @51
-            periodOffset: 50
-            nameEnd: 52
-      class D @64
-        typeParameters
-          covariant T @66
-            defaultType: dynamic
-          covariant U @69
-            defaultType: dynamic
-        supertype: C<U, T>
-        constructors
-          named @94
-            periodOffset: 93
-            nameEnd: 99
-''');
-  }
-
-  test_constructor_redirected_factory_named_generic_viaTypeAlias() async {
-    var library = await checkLibrary('''
-typedef A<T, U> = C<T, U>;
-class B<T, U> {
-  factory B() = A<U, T>.named;
-  B._();
-}
-class C<T, U> extends A<U, T> {
-  C.named() : super._();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class B @33
-        typeParameters
-          covariant T @35
-            defaultType: dynamic
-          covariant U @38
-            defaultType: dynamic
-        constructors
-          factory @53
-            redirectedConstructor: ConstructorMember
-              base: self::@class::C::@constructor::named
-              substitution: {T: U, U: T}
-          _ @78
-            periodOffset: 77
-            nameEnd: 79
-      class C @91
-        typeParameters
-          covariant T @93
-            defaultType: dynamic
-          covariant U @96
-            defaultType: dynamic
-        supertype: C<U, T>
-          aliasElement: self::@typeAlias::A
-          aliasArguments
-            U
-            T
-        constructors
-          named @121
-            periodOffset: 120
-            nameEnd: 126
-    typeAliases
-      A @8
-        typeParameters
-          covariant T @10
-            defaultType: dynamic
-          covariant U @13
-            defaultType: dynamic
-        aliasedType: C<T, U>
-''');
-  }
-
-  test_constructor_redirected_factory_named_imported() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-class D extends C {
-  D.named() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart';
-class C {
-  factory C() = D.named;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart
-  definingUnit
-    classes
-      class C @25
-        constructors
-          factory @39
-            redirectedConstructor: foo.dart::@class::D::@constructor::named
-          _ @58
-            periodOffset: 57
-            nameEnd: 59
-''');
-  }
-
-  test_constructor_redirected_factory_named_imported_generic() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-class D<T, U> extends C<U, T> {
-  D.named() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart';
-class C<T, U> {
-  factory C() = D<U, T>.named;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart
-  definingUnit
-    classes
-      class C @25
-        typeParameters
-          covariant T @27
-            defaultType: dynamic
-          covariant U @30
-            defaultType: dynamic
-        constructors
-          factory @45
-            redirectedConstructor: ConstructorMember
-              base: foo.dart::@class::D::@constructor::named
-              substitution: {T: U, U: T}
-          _ @70
-            periodOffset: 69
-            nameEnd: 71
-''');
-  }
-
-  test_constructor_redirected_factory_named_prefixed() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-class D extends C {
-  D.named() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart' as foo;
-class C {
-  factory C() = foo.D.named;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart as foo @21
-  definingUnit
-    classes
-      class C @32
-        constructors
-          factory @46
-            redirectedConstructor: foo.dart::@class::D::@constructor::named
-          _ @69
-            periodOffset: 68
-            nameEnd: 70
-''');
-  }
-
-  test_constructor_redirected_factory_named_prefixed_generic() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-class D<T, U> extends C<U, T> {
-  D.named() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart' as foo;
-class C<T, U> {
-  factory C() = foo.D<U, T>.named;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart as foo @21
-  definingUnit
-    classes
-      class C @32
-        typeParameters
-          covariant T @34
-            defaultType: dynamic
-          covariant U @37
-            defaultType: dynamic
-        constructors
-          factory @52
-            redirectedConstructor: ConstructorMember
-              base: foo.dart::@class::D::@constructor::named
-              substitution: {T: U, U: T}
-          _ @81
-            periodOffset: 80
-            nameEnd: 82
-''');
-  }
-
-  test_constructor_redirected_factory_named_unresolved_class() async {
-    var library = await checkLibrary('''
-class C<E> {
-  factory C() = D.named<E>;
-}
-''', allowErrors: true);
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        typeParameters
-          covariant E @8
-            defaultType: dynamic
-        constructors
-          factory @23
-''');
-  }
-
-  test_constructor_redirected_factory_named_unresolved_constructor() async {
-    var library = await checkLibrary('''
-class D {}
-class C<E> {
-  factory C() = D.named<E>;
-}
-''', allowErrors: true);
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class D @6
-        constructors
-          synthetic @-1
-      class C @17
-        typeParameters
-          covariant E @19
-            defaultType: dynamic
-        constructors
-          factory @34
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed() async {
-    var library = await checkLibrary('''
-class C {
-  factory C() = D;
-  C._();
-}
-class D extends C {
-  D() : super._();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          factory @20
-            redirectedConstructor: self::@class::D::@constructor::•
-          _ @33
-            periodOffset: 32
-            nameEnd: 34
-      class D @46
-        supertype: C
-        constructors
-          @62
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_generic() async {
-    var library = await checkLibrary('''
-class C<T, U> {
-  factory C() = D<U, T>;
-  C._();
-}
-class D<T, U> extends C<U, T> {
-  D() : super._();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        typeParameters
-          covariant T @8
-            defaultType: dynamic
-          covariant U @11
-            defaultType: dynamic
-        constructors
-          factory @26
-            redirectedConstructor: ConstructorMember
-              base: self::@class::D::@constructor::•
-              substitution: {T: U, U: T}
-          _ @45
-            periodOffset: 44
-            nameEnd: 46
-      class D @58
-        typeParameters
-          covariant T @60
-            defaultType: dynamic
-          covariant U @63
-            defaultType: dynamic
-        supertype: C<U, T>
-        constructors
-          @86
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_generic_viaTypeAlias() async {
-    var library = await checkLibrary('''
-typedef A<T, U> = C<T, U>;
-class B<T, U> {
-  factory B() = A<U, T>;
-  B_();
-}
-class C<T, U> extends B<U, T> {
-  C() : super._();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class B @33
-        typeParameters
-          covariant T @35
-            defaultType: dynamic
-          covariant U @38
-            defaultType: dynamic
-        constructors
-          factory @53
-            redirectedConstructor: ConstructorMember
-              base: self::@class::C::@constructor::•
-              substitution: {T: U, U: T}
-        methods
-          abstract B_ @70
-            returnType: dynamic
-      class C @84
-        typeParameters
-          covariant T @86
-            defaultType: dynamic
-          covariant U @89
-            defaultType: dynamic
-        supertype: B<U, T>
-        constructors
-          @112
-    typeAliases
-      A @8
-        typeParameters
-          covariant T @10
-            defaultType: dynamic
-          covariant U @13
-            defaultType: dynamic
-        aliasedType: C<T, U>
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_imported() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-class D extends C {
-  D() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart';
-class C {
-  factory C() = D;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart
-  definingUnit
-    classes
-      class C @25
-        constructors
-          factory @39
-            redirectedConstructor: foo.dart::@class::D::@constructor::•
-          _ @52
-            periodOffset: 51
-            nameEnd: 53
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_imported_generic() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-class D<T, U> extends C<U, T> {
-  D() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart';
-class C<T, U> {
-  factory C() = D<U, T>;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart
-  definingUnit
-    classes
-      class C @25
-        typeParameters
-          covariant T @27
-            defaultType: dynamic
-          covariant U @30
-            defaultType: dynamic
-        constructors
-          factory @45
-            redirectedConstructor: ConstructorMember
-              base: foo.dart::@class::D::@constructor::•
-              substitution: {T: U, U: T}
-          _ @64
-            periodOffset: 63
-            nameEnd: 65
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_imported_viaTypeAlias() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-typedef A = B;
-class B extends C {
-  B() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart';
-class C {
-  factory C() = A;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart
-  definingUnit
-    classes
-      class C @25
-        constructors
-          factory @39
-            redirectedConstructor: foo.dart::@class::B::@constructor::•
-          _ @52
-            periodOffset: 51
-            nameEnd: 53
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_prefixed() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-class D extends C {
-  D() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart' as foo;
-class C {
-  factory C() = foo.D;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart as foo @21
-  definingUnit
-    classes
-      class C @32
-        constructors
-          factory @46
-            redirectedConstructor: foo.dart::@class::D::@constructor::•
-          _ @63
-            periodOffset: 62
-            nameEnd: 64
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_prefixed_generic() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-class D<T, U> extends C<U, T> {
-  D() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart' as foo;
-class C<T, U> {
-  factory C() = foo.D<U, T>;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart as foo @21
-  definingUnit
-    classes
-      class C @32
-        typeParameters
-          covariant T @34
-            defaultType: dynamic
-          covariant U @37
-            defaultType: dynamic
-        constructors
-          factory @52
-            redirectedConstructor: ConstructorMember
-              base: foo.dart::@class::D::@constructor::•
-              substitution: {T: U, U: T}
-          _ @75
-            periodOffset: 74
-            nameEnd: 76
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_prefixed_viaTypeAlias() async {
-    addLibrarySource('/foo.dart', '''
-import 'test.dart';
-typedef A = B;
-class B extends C {
-  B() : super._();
-}
-''');
-    var library = await checkLibrary('''
-import 'foo.dart' as foo;
-class C {
-  factory C() = foo.A;
-  C._();
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    foo.dart as foo @21
-  definingUnit
-    classes
-      class C @32
-        constructors
-          factory @46
-            redirectedConstructor: foo.dart::@class::B::@constructor::•
-          _ @63
-            periodOffset: 62
-            nameEnd: 64
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_unresolved() async {
-    var library = await checkLibrary('''
-class C<E> {
-  factory C() = D<E>;
-}
-''', allowErrors: true);
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        typeParameters
-          covariant E @8
-            defaultType: dynamic
-        constructors
-          factory @23
-''');
-  }
-
-  test_constructor_redirected_factory_unnamed_viaTypeAlias() async {
-    var library = await checkLibrary('''
-typedef A = C;
-class B {
-  factory B() = A;
-  B._();
-}
-class C extends B {
-  C() : super._();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class B @21
-        constructors
-          factory @35
-            redirectedConstructor: self::@class::C::@constructor::•
-          _ @48
-            periodOffset: 47
-            nameEnd: 49
-      class C @61
-        supertype: B
-        constructors
-          @77
-    typeAliases
-      A @8
-        aliasedType: C
-''');
-  }
-
-  test_constructor_redirected_thisInvocation_named() async {
-    var library = await checkLibrary('''
-class C {
-  const C.named();
-  const C() : this.named();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          const named @20
-            periodOffset: 19
-            nameEnd: 25
-          const @37
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @53
-                  rightParenthesis: ) @54
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::C::@constructor::named
-                  staticType: null
-                  token: named @48
-                period: . @47
-                staticElement: self::@class::C::@constructor::named
-                thisKeyword: this @43
-            redirectedConstructor: self::@class::C::@constructor::named
-''');
-  }
-
-  test_constructor_redirected_thisInvocation_named_generic() async {
-    var library = await checkLibrary('''
-class C<T> {
-  const C.named();
-  const C() : this.named();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        typeParameters
-          covariant T @8
-            defaultType: dynamic
-        constructors
-          const named @23
-            periodOffset: 22
-            nameEnd: 28
-          const @40
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @56
-                  rightParenthesis: ) @57
-                constructorName: SimpleIdentifier
-                  staticElement: self::@class::C::@constructor::named
-                  staticType: null
-                  token: named @51
-                period: . @50
-                staticElement: self::@class::C::@constructor::named
-                thisKeyword: this @46
-            redirectedConstructor: self::@class::C::@constructor::named
-''');
-  }
-
-  test_constructor_redirected_thisInvocation_named_notConst() async {
-    var library = await checkLibrary('''
-class C {
-  C.named();
-  C() : this.named();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          named @14
-            periodOffset: 13
-            nameEnd: 19
-          @25
-            redirectedConstructor: self::@class::C::@constructor::named
-''');
-  }
-
-  test_constructor_redirected_thisInvocation_unnamed() async {
-    var library = await checkLibrary('''
-class C {
-  const C();
-  const C.named() : this();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          const @18
-          const named @33
-            periodOffset: 32
-            nameEnd: 38
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @47
-                  rightParenthesis: ) @48
-                staticElement: self::@class::C::@constructor::•
-                thisKeyword: this @43
-            redirectedConstructor: self::@class::C::@constructor::•
-''');
-  }
-
-  test_constructor_redirected_thisInvocation_unnamed_generic() async {
-    var library = await checkLibrary('''
-class C<T> {
-  const C();
-  const C.named() : this();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        typeParameters
-          covariant T @8
-            defaultType: dynamic
-        constructors
-          const @21
-          const named @36
-            periodOffset: 35
-            nameEnd: 41
-            constantInitializers
-              RedirectingConstructorInvocation
-                argumentList: ArgumentList
-                  leftParenthesis: ( @50
-                  rightParenthesis: ) @51
-                staticElement: self::@class::C::@constructor::•
-                thisKeyword: this @46
-            redirectedConstructor: self::@class::C::@constructor::•
-''');
-  }
-
-  test_constructor_redirected_thisInvocation_unnamed_notConst() async {
-    var library = await checkLibrary('''
-class C {
-  C();
-  C.named() : this();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          @12
-          named @21
-            periodOffset: 20
-            nameEnd: 26
-            redirectedConstructor: self::@class::C::@constructor::•
-''');
-  }
-
-  test_constructor_withCycles_const() async {
-    var library = await checkLibrary('''
-class C {
-  final x;
-  const C() : x = const D();
-}
-class D {
-  final x;
-  const D() : x = const C();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          final x @18
-            type: dynamic
-        constructors
-          const @29
-            constantInitializers
-              ConstructorFieldInitializer
-                equals: = @37
-                expression: InstanceCreationExpression
-                  argumentList: ArgumentList
-                    leftParenthesis: ( @46
-                    rightParenthesis: ) @47
-                  constructorName: ConstructorName
-                    staticElement: self::@class::D::@constructor::•
-                    type: TypeName
-                      name: SimpleIdentifier
-                        staticElement: self::@class::D
-                        staticType: null
-                        token: D @45
-                      type: D
-                  keyword: const @39
-                  staticType: D
-                fieldName: SimpleIdentifier
-                  staticElement: self::@class::C::@field::x
-                  staticType: null
-                  token: x @35
-        accessors
-          synthetic get x @-1
-            returnType: dynamic
-      class D @58
-        fields
-          final x @70
-            type: dynamic
-        constructors
-          const @81
-            constantInitializers
-              ConstructorFieldInitializer
-                equals: = @89
-                expression: InstanceCreationExpression
-                  argumentList: ArgumentList
-                    leftParenthesis: ( @98
-                    rightParenthesis: ) @99
-                  constructorName: ConstructorName
-                    staticElement: self::@class::C::@constructor::•
-                    type: TypeName
-                      name: SimpleIdentifier
-                        staticElement: self::@class::C
-                        staticType: null
-                        token: C @97
-                      type: C
-                  keyword: const @91
-                  staticType: C
-                fieldName: SimpleIdentifier
-                  staticElement: self::@class::D::@field::x
-                  staticType: null
-                  token: x @87
-        accessors
-          synthetic get x @-1
-            returnType: dynamic
-''');
-  }
-
-  test_constructor_withCycles_nonConst() async {
-    var library = await checkLibrary('''
-class C {
-  final x;
-  C() : x = new D();
-}
-class D {
-  final x;
-  D() : x = new C();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          final x @18
-            type: dynamic
-        constructors
-          @23
-        accessors
-          synthetic get x @-1
-            returnType: dynamic
-      class D @50
-        fields
-          final x @62
-            type: dynamic
-        constructors
-          @67
-        accessors
-          synthetic get x @-1
-            returnType: dynamic
-''');
-  }
-
   test_defaultValue_eliminateTypeParameters() async {
     var library = await checkLibrary('''
 class A<T> {
@@ -14139,7 +15885,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::A::@constructor::•
                         substitution: {T: dynamic Function()}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::A
                           staticType: null
@@ -14187,7 +15933,7 @@
                       staticType: int
                     isOperator: is @16
                     staticType: bool
-                    type: TypeName
+                    type: NamedType
                       name: SimpleIdentifier
                         staticElement: dart:core::@class::int
                         staticType: null
@@ -14306,7 +16052,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T1: int, T2: double}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14355,7 +16101,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14414,7 +16160,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14474,7 +16220,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Null*}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14523,7 +16269,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Null*}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14567,7 +16313,7 @@
                   staticElement: ConstructorMember
                     base: self::@class::B::@constructor::•
                     substitution: {T: Never}
-                  type: TypeName
+                  type: NamedType
                     name: SimpleIdentifier
                       staticElement: self::@class::B
                       staticType: null
@@ -14617,7 +16363,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14672,7 +16418,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T1: Never, T2: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14723,7 +16469,7 @@
                       staticElement: ConstructorMember
                         base: self::@class::B::@constructor::•
                         substitution: {T: Never}
-                      type: TypeName
+                      type: NamedType
                         name: SimpleIdentifier
                           staticElement: self::@class::B
                           staticType: null
@@ -14814,6 +16560,7 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::A::@constructor::•
                 superKeyword: super @0
+            superConstructor: self::@class::A::@constructor::•
       class alias X @48
         supertype: B
         mixins
@@ -14827,6 +16574,7 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::B::@constructor::•
                 superKeyword: super @0
+            superConstructor: self::@class::B::@constructor::•
     mixins
       mixin M @68
         superclassConstraints
@@ -14846,8 +16594,7 @@
   definingUnit
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -14870,8 +16617,7 @@
           synthetic toString @-1
             returnType: String
       enum E @19
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -15128,8 +16874,7 @@
     enums
       enum E @65
         documentationComment: /**\n * Docs\n */
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -15165,8 +16910,7 @@
   definingUnit
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -15213,8 +16957,7 @@
   definingUnit
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -15274,8 +17017,7 @@
   definingUnit
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -15307,8 +17049,7 @@
   definingUnit
     enums
       enum E1 @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -15327,8 +17068,7 @@
           synthetic toString @-1
             returnType: String
       enum E2 @20
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -15414,8 +17154,7 @@
                 superKeyword: super @0
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -15814,6 +17553,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: foo.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo.dart');
@@ -15846,6 +17586,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: foo_io.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_io.dart');
@@ -15878,6 +17619,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: foo_html.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_html.dart');
@@ -15965,745 +17707,6 @@
 ''');
   }
 
-  test_field_abstract() async {
-    var library = await checkLibrary('''
-abstract class C {
-  abstract int i;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      abstract class C @15
-        fields
-          abstract i @34
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic abstract get i @-1
-            returnType: int
-          synthetic abstract set i @-1
-            parameters
-              requiredPositional _i @-1
-                type: int
-            returnType: void
-''');
-  }
-
-  test_field_covariant() async {
-    var library = await checkLibrary('''
-class C {
-  covariant int x;
-}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          covariant x @26
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get x @-1
-            returnType: int
-          synthetic set x @-1
-            parameters
-              requiredPositional covariant _x @-1
-                type: int
-            returnType: void
-''');
-  }
-
-  test_field_documented() async {
-    var library = await checkLibrary('''
-class C {
-  /**
-   * Docs
-   */
-  var x;
-}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          x @38
-            documentationComment: /**\n   * Docs\n   */
-            type: dynamic
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get x @-1
-            returnType: dynamic
-          synthetic set x @-1
-            parameters
-              requiredPositional _x @-1
-                type: dynamic
-            returnType: void
-''');
-  }
-
-  test_field_external() async {
-    var library = await checkLibrary('''
-abstract class C {
-  external int i;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      abstract class C @15
-        fields
-          external i @34
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get i @-1
-            returnType: int
-          synthetic set i @-1
-            parameters
-              requiredPositional _i @-1
-                type: int
-            returnType: void
-''');
-  }
-
-  test_field_final_hasInitializer_hasConstConstructor() async {
-    var library = await checkLibrary('''
-class C {
-  final x = 42;
-  const C();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          final x @18
-            type: int
-            constantInitializer
-              IntegerLiteral
-                literal: 42 @22
-                staticType: int
-        constructors
-          const @34
-        accessors
-          synthetic get x @-1
-            returnType: int
-''');
-  }
-
-  test_field_final_hasInitializer_hasConstConstructor_genericFunctionType() async {
-    var library = await checkLibrary('''
-class A<T> {
-  const A();
-}
-class B {
-  final f = const A<int Function(double a)>();
-  const B();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        typeParameters
-          covariant T @8
-            defaultType: dynamic
-        constructors
-          const @21
-      class B @34
-        fields
-          final f @46
-            type: A<int Function(double)>
-            constantInitializer
-              InstanceCreationExpression
-                argumentList: ArgumentList
-                  leftParenthesis: ( @81
-                  rightParenthesis: ) @82
-                constructorName: ConstructorName
-                  staticElement: ConstructorMember
-                    base: self::@class::A::@constructor::•
-                    substitution: {T: int Function(double)}
-                  type: TypeName
-                    name: SimpleIdentifier
-                      staticElement: self::@class::A
-                      staticType: null
-                      token: A @56
-                    type: A<int Function(double)>
-                    typeArguments: TypeArgumentList
-                      arguments
-                        GenericFunctionType
-                          declaredElement: GenericFunctionTypeElement
-                            parameters
-                              a
-                                kind: required positional
-                                type: double
-                            returnType: int
-                            type: int Function(double)
-                          functionKeyword: Function @62
-                          parameters: FormalParameterList
-                            leftParenthesis: ( @70
-                            parameters
-                              SimpleFormalParameter
-                                declaredElement: a@78
-                                declaredElementType: double
-                                identifier: SimpleIdentifier
-                                  staticElement: a@78
-                                  staticType: null
-                                  token: a @78
-                                type: TypeName
-                                  name: SimpleIdentifier
-                                    staticElement: dart:core::@class::double
-                                    staticType: null
-                                    token: double @71
-                                  type: double
-                            rightParenthesis: ) @79
-                          returnType: TypeName
-                            name: SimpleIdentifier
-                              staticElement: dart:core::@class::int
-                              staticType: null
-                              token: int @58
-                            type: int
-                          type: int Function(double)
-                      leftBracket: < @57
-                      rightBracket: > @80
-                keyword: const @50
-                staticType: A<int Function(double)>
-        constructors
-          const @93
-        accessors
-          synthetic get f @-1
-            returnType: A<int Function(double)>
-''');
-  }
-
-  test_field_final_hasInitializer_noConstConstructor() async {
-    var library = await checkLibrary('''
-class C {
-  final x = 42;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          final x @18
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get x @-1
-            returnType: int
-''');
-  }
-
-  test_field_formal_param_inferred_type_implicit() async {
-    var library = await checkLibrary('class C extends D { var v; C(this.v); }'
-        ' abstract class D { int get v; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        supertype: D
-        fields
-          v @24
-            type: int
-        constructors
-          @27
-            parameters
-              requiredPositional final this.v @34
-                type: int
-        accessors
-          synthetic get v @-1
-            returnType: int
-          synthetic set v @-1
-            parameters
-              requiredPositional _v @-1
-                type: int
-            returnType: void
-      abstract class D @55
-        fields
-          synthetic v @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          abstract get v @67
-            returnType: int
-''');
-  }
-
-  test_field_inferred_type_nonStatic_explicit_initialized() async {
-    var library = await checkLibrary('class C { num v = 0; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          v @14
-            type: num
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get v @-1
-            returnType: num
-          synthetic set v @-1
-            parameters
-              requiredPositional _v @-1
-                type: num
-            returnType: void
-''');
-  }
-
-  test_field_inferred_type_nonStatic_implicit_initialized() async {
-    var library = await checkLibrary('class C { var v = 0; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          v @14
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get v @-1
-            returnType: int
-          synthetic set v @-1
-            parameters
-              requiredPositional _v @-1
-                type: int
-            returnType: void
-''');
-  }
-
-  test_field_inferred_type_nonStatic_implicit_uninitialized() async {
-    var library = await checkLibrary(
-        'class C extends D { var v; } abstract class D { int get v; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        supertype: D
-        fields
-          v @24
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get v @-1
-            returnType: int
-          synthetic set v @-1
-            parameters
-              requiredPositional _v @-1
-                type: int
-            returnType: void
-      abstract class D @44
-        fields
-          synthetic v @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          abstract get v @56
-            returnType: int
-''');
-  }
-
-  test_field_inferred_type_nonStatic_inherited_resolveInitializer() async {
-    var library = await checkLibrary(r'''
-const a = 0;
-abstract class A {
-  const A();
-  List<int> get f;
-}
-class B extends A {
-  const B();
-  final f = [a];
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      abstract class A @28
-        fields
-          synthetic f @-1
-            type: List<int>
-        constructors
-          const @40
-        accessors
-          abstract get f @61
-            returnType: List<int>
-      class B @72
-        supertype: A
-        fields
-          final f @107
-            type: List<int>
-            constantInitializer
-              ListLiteral
-                elements
-                  SimpleIdentifier
-                    staticElement: self::@getter::a
-                    staticType: int
-                    token: a @112
-                leftBracket: [ @111
-                rightBracket: ] @113
-                staticType: List<int>
-        constructors
-          const @94
-        accessors
-          synthetic get f @-1
-            returnType: List<int>
-    topLevelVariables
-      static const a @6
-        type: int
-        constantInitializer
-          IntegerLiteral
-            literal: 0 @10
-            staticType: int
-    accessors
-      synthetic static get a @-1
-        returnType: int
-''');
-  }
-
-  test_field_inferred_type_static_implicit_initialized() async {
-    var library = await checkLibrary('class C { static var v = 0; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          static v @21
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic static get v @-1
-            returnType: int
-          synthetic static set v @-1
-            parameters
-              requiredPositional _v @-1
-                type: int
-            returnType: void
-''');
-  }
-
-  test_field_propagatedType_const_noDep() async {
-    var library = await checkLibrary('''
-class C {
-  static const x = 0;
-}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          static const x @25
-            type: int
-            constantInitializer
-              IntegerLiteral
-                literal: 0 @29
-                staticType: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic static get x @-1
-            returnType: int
-''');
-  }
-
-  test_field_propagatedType_final_dep_inLib() async {
-    addLibrarySource('/a.dart', 'final a = 1;');
-    var library = await checkLibrary('''
-import "a.dart";
-class C {
-  final b = a / 2;
-}''');
-    checkElementText(library, r'''
-library
-  imports
-    a.dart
-  definingUnit
-    classes
-      class C @23
-        fields
-          final b @35
-            type: double
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get b @-1
-            returnType: double
-''');
-  }
-
-  test_field_propagatedType_final_dep_inPart() async {
-    addSource('/a.dart', 'part of lib; final a = 1;');
-    var library = await checkLibrary('''
-library lib;
-part "a.dart";
-class C {
-  final b = a / 2;
-}''');
-    checkElementText(library, r'''
-library
-  name: lib
-  nameOffset: 8
-  definingUnit
-    classes
-      class C @34
-        fields
-          final b @46
-            type: double
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get b @-1
-            returnType: double
-  parts
-    a.dart
-      topLevelVariables
-        static final a @19
-          type: int
-      accessors
-        synthetic static get a @-1
-          returnType: int
-''');
-  }
-
-  test_field_propagatedType_final_noDep_instance() async {
-    var library = await checkLibrary('''
-class C {
-  final x = 0;
-}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          final x @18
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get x @-1
-            returnType: int
-''');
-  }
-
-  test_field_propagatedType_final_noDep_static() async {
-    var library = await checkLibrary('''
-class C {
-  static final x = 0;
-}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          static final x @25
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic static get x @-1
-            returnType: int
-''');
-  }
-
-  test_field_static_final_untyped() async {
-    var library = await checkLibrary('class C { static final x = 0; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          static final x @23
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic static get x @-1
-            returnType: int
-''');
-  }
-
-  test_field_type_inferred_Never() async {
-    var library = await checkLibrary(r'''
-class C {
-  var a = throw 42;
-}
-''');
-
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          a @16
-            type: Never
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get a @-1
-            returnType: Never
-          synthetic set a @-1
-            parameters
-              requiredPositional _a @-1
-                type: Never
-            returnType: void
-''');
-  }
-
-  test_field_type_inferred_nonNullify() async {
-    addSource('/a.dart', '''
-// @dart = 2.7
-var a = 0;
-''');
-
-    var library = await checkLibrary(r'''
-import 'a.dart';
-class C {
-  var b = a;
-}
-''');
-
-    checkElementText(library, r'''
-library
-  imports
-    a.dart
-  definingUnit
-    classes
-      class C @23
-        fields
-          b @33
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get b @-1
-            returnType: int
-          synthetic set b @-1
-            parameters
-              requiredPositional _b @-1
-                type: int
-            returnType: void
-''');
-  }
-
-  test_field_typed() async {
-    var library = await checkLibrary('class C { int x = 0; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          x @14
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get x @-1
-            returnType: int
-          synthetic set x @-1
-            parameters
-              requiredPositional _x @-1
-                type: int
-            returnType: void
-''');
-  }
-
-  test_field_untyped() async {
-    var library = await checkLibrary('class C { var x = 0; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          x @14
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get x @-1
-            returnType: int
-          synthetic set x @-1
-            parameters
-              requiredPositional _x @-1
-                type: int
-            returnType: void
-''');
-  }
-
-  test_finalField_hasConstConstructor() async {
-    var library = await checkLibrary(r'''
-class C1  {
-  final List<int> f1 = const [];
-  const C1();
-}
-class C2  {
-  final List<int> f2 = const [];
-  C2();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C1 @6
-        fields
-          final f1 @30
-            type: List<int>
-            constantInitializer
-              ListLiteral
-                constKeyword: const @35
-                leftBracket: [ @41
-                rightBracket: ] @42
-                staticType: List<int>
-        constructors
-          const @53
-        accessors
-          synthetic get f1 @-1
-            returnType: List<int>
-      class C2 @67
-        fields
-          final f2 @91
-            type: List<int>
-        constructors
-          @108
-        accessors
-          synthetic get f2 @-1
-            returnType: List<int>
-''');
-  }
-
   test_function_async() async {
     var library = await checkLibrary(r'''
 import 'dart:async';
@@ -17774,14 +18777,14 @@
                           staticElement: a@52
                           staticType: null
                           token: a @52
-                        type: TypeName
+                        type: NamedType
                           name: SimpleIdentifier
                             staticElement: dart:core::@class::String
                             staticType: null
                             token: String @45
                           type: String
                     rightParenthesis: ) @53
-                  returnType: TypeName
+                  returnType: NamedType
                     name: SimpleIdentifier
                       staticElement: dart:core::@class::int
                       staticType: null
@@ -17850,14 +18853,14 @@
                           staticElement: a@52
                           staticType: null
                           token: a @52
-                        type: TypeName
+                        type: NamedType
                           name: SimpleIdentifier
                             staticElement: dart:core::@class::String
                             staticType: null
                             token: String @45
                           type: String
                     rightParenthesis: ) @53
-                  returnType: TypeName
+                  returnType: NamedType
                     name: SimpleIdentifier
                       staticElement: dart:core::@class::int
                       staticType: null
@@ -17908,7 +18911,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: String Function({int? a})}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -17942,14 +18945,14 @@
                                 staticElement: a@63
                                 staticType: null
                                 token: a @63
-                              type: TypeName
+                              type: NamedType
                                 name: SimpleIdentifier
                                   staticElement: dart:core::@class::int
                                   staticType: null
                                   token: int @58
                                 type: int?
                         rightParenthesis: ) @65
-                      returnType: TypeName
+                      returnType: NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -17995,7 +18998,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: String Function([int?])}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -18029,14 +19032,14 @@
                                 staticElement: a@63
                                 staticType: null
                                 token: a @63
-                              type: TypeName
+                              type: NamedType
                                 name: SimpleIdentifier
                                   staticElement: dart:core::@class::int
                                   staticType: null
                                   token: int @58
                                 type: int?
                         rightParenthesis: ) @65
-                      returnType: TypeName
+                      returnType: NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -18082,7 +19085,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: String Function({required int a})}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -18117,14 +19120,14 @@
                                 staticType: null
                                 token: a @71
                               requiredKeyword: required @58
-                              type: TypeName
+                              type: NamedType
                                 name: SimpleIdentifier
                                   staticElement: dart:core::@class::int
                                   staticType: null
                                   token: int @67
                                 type: int
                         rightParenthesis: ) @73
-                      returnType: TypeName
+                      returnType: NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -18170,7 +19173,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: String Function(int)}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
@@ -18197,14 +19200,14 @@
                               staticElement: a@61
                               staticType: null
                               token: a @61
-                            type: TypeName
+                            type: NamedType
                               name: SimpleIdentifier
                                 staticElement: dart:core::@class::int
                                 staticType: null
                                 token: int @57
                               type: int
                         rightParenthesis: ) @62
-                      returnType: TypeName
+                      returnType: NamedType
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
                           staticType: null
@@ -18269,6 +19272,9 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::A::@constructor::•
                 superKeyword: super @0
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: void Function()}
     mixins
       mixin M @20
         superclassConstraints
@@ -18439,6 +19445,7 @@
             type: int
         constructors
           synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
         accessors
           get f @24
             returnType: int
@@ -18533,7 +19540,7 @@
                 token: named @67
               period: . @66
               staticElement: self::@class::C::@constructor::named
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -18610,6 +19617,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: foo.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo.dart');
@@ -18640,6 +19648,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: foo_io.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_io.dart');
@@ -18670,6 +19679,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: foo_io.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_io.dart');
@@ -18700,6 +19710,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: foo_html.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_html.dart');
@@ -18730,6 +19741,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: foo_html.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
     expect(typeA.element.source.shortName, 'foo_html.dart');
@@ -18930,14 +19942,14 @@
         supertype: C
         constructors
           synthetic @-1
+            superConstructor: self::@class::C::@constructor::•
 ''');
   }
 
   test_import_short_absolute() async {
     testFile = '/my/project/bin/test.dart';
     // Note: "/a.dart" resolves differently on Windows vs. Posix.
-    var destinationPath =
-        resourceProvider.pathContext.fromUri(Uri.parse('/a.dart'));
+    var destinationPath = convertPath('/a.dart');
     addLibrarySource(destinationPath, 'class C {}');
     var library = await checkLibrary('import "/a.dart"; C c;');
     checkElementText(library, r'''
@@ -19108,7 +20120,7 @@
               staticElement: ConstructorMember
                 base: self::@class::C::@constructor::•
                 substitution: {V: int}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -19176,7 +20188,7 @@
               rightParenthesis: ) @114
             constructorName: ConstructorName
               staticElement: self::@class::C::@constructor::•
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::C
                   staticType: null
@@ -19218,6 +20230,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
       class S @40
         typeParameters
           covariant T @42
@@ -19295,6 +20308,7 @@
         supertype: C
         constructors
           synthetic @-1
+            superConstructor: self::@class::C::@constructor::•
     topLevelVariables
       static a @111
         type: A
@@ -19692,6 +20706,7 @@
               aliasElement: self::@typeAlias::F
         constructors
           synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
         accessors
           synthetic get v @-1
             returnType: int Function(String)
@@ -19847,6 +20862,9 @@
             type: Map<T, int>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::D::@constructor::•
+              substitution: {U: int, V: T}
         accessors
           synthetic get v @-1
             returnType: Map<T, int>
@@ -19934,6 +20952,9 @@
         supertype: D<U, int>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::D::@constructor::•
+              substitution: {V: U, W: int}
         methods
           f @41
             parameters
@@ -19990,6 +21011,7 @@
         supertype: D
         constructors
           synthetic @-1
+            superConstructor: a.dart::@class::D::@constructor::•
         methods
           f @44
             parameters
@@ -20012,6 +21034,7 @@
         supertype: D
         constructors
           synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
         methods
           f @25
             parameters
@@ -20117,6 +21140,7 @@
             type: int Function(String)
         constructors
           synthetic @-1
+            superConstructor: self::@class::D::@constructor::•
         accessors
           set f @29
             parameters
@@ -20164,6 +21188,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: a.dart::@class::A::@constructor::•
         methods
           m @39
             parameters
@@ -20351,6 +21376,7 @@
             type: dynamic
         constructors
           synthetic @-1
+            superConstructor: self::@class::C::@constructor::•
         accessors
           synthetic get f @-1
             returnType: dynamic
@@ -20552,6 +21578,7 @@
         supertype: LegacyDefault*
         constructors
           synthetic @-1
+            superConstructor: legacy.dart::@class::LegacyDefault::@constructor::•
         methods
           == @71
             parameters
@@ -20562,6 +21589,7 @@
         supertype: LegacyObject*
         constructors
           synthetic @-1
+            superConstructor: legacy.dart::@class::LegacyObject::@constructor::•
         methods
           == @140
             parameters
@@ -20572,6 +21600,7 @@
         supertype: LegacyInt*
         constructors
           synthetic @-1
+            superConstructor: legacy.dart::@class::LegacyInt::@constructor::•
         methods
           == @206
             parameters
@@ -20632,6 +21661,7 @@
           NullSafeDefault*
         constructors
           synthetic @-1
+            superConstructor: legacy.dart::@class::LegacyDefault::@constructor::•
         methods
           == @136
             parameters
@@ -20644,6 +21674,7 @@
           NullSafeObject*
         constructors
           synthetic @-1
+            superConstructor: legacy.dart::@class::LegacyObject::@constructor::•
         methods
           == @231
             parameters
@@ -20656,6 +21687,7 @@
           NullSafeInt*
         constructors
           synthetic @-1
+            superConstructor: legacy.dart::@class::LegacyInt::@constructor::•
         methods
           == @320
             parameters
@@ -20699,6 +21731,7 @@
         supertype: NullSafeDefault
         constructors
           synthetic @-1
+            superConstructor: nullSafe.dart::@class::NullSafeDefault::@constructor::•
         methods
           == @74
             parameters
@@ -20709,6 +21742,7 @@
         supertype: NullSafeObject
         constructors
           synthetic @-1
+            superConstructor: nullSafe.dart::@class::NullSafeObject::@constructor::•
         methods
           == @145
             parameters
@@ -20719,6 +21753,7 @@
         supertype: NullSafeInt
         constructors
           synthetic @-1
+            superConstructor: nullSafe.dart::@class::NullSafeInt::@constructor::•
         methods
           == @213
             parameters
@@ -21671,6 +22706,7 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::C::@constructor::•
                 superKeyword: super @0
+            superConstructor: self::@class::C::@constructor::•
       class C @29
         constructors
           synthetic @-1
@@ -21781,71 +22817,6 @@
 ''');
   }
 
-  test_member_function_async() async {
-    var library = await checkLibrary(r'''
-import 'dart:async';
-class C {
-  Future f() async {}
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    dart:async
-  definingUnit
-    classes
-      class C @27
-        constructors
-          synthetic @-1
-        methods
-          f @40 async
-            returnType: Future<dynamic>
-''');
-  }
-
-  test_member_function_asyncStar() async {
-    var library = await checkLibrary(r'''
-import 'dart:async';
-class C {
-  Stream f() async* {}
-}
-''');
-    checkElementText(library, r'''
-library
-  imports
-    dart:async
-  definingUnit
-    classes
-      class C @27
-        constructors
-          synthetic @-1
-        methods
-          f @40 async*
-            returnType: Stream<dynamic>
-''');
-  }
-
-  test_member_function_syncStar() async {
-    var library = await checkLibrary(r'''
-class C {
-  Iterable<int> f() sync* {
-    yield 42;
-  }
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          f @26 sync*
-            returnType: Iterable<int>
-''');
-  }
-
   test_metadata_class_field_first() async {
     var library = await checkLibrary(r'''
 const a = 0;
@@ -22047,6 +23018,7 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::D::@constructor::•
                 superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
       class D @45
         constructors
           synthetic @-1
@@ -22218,7 +23190,7 @@
               token: A @36
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22274,7 +23246,7 @@
               token: A @36
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22441,7 +23413,7 @@
               staticType: null
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22497,6 +23469,7 @@
                 period: . @0
                 staticElement: self::@class::A::@constructor::named
                 superKeyword: super @0
+            superConstructor: self::@class::A::@constructor::named
       class D @85
         metadata
           Annotation
@@ -22654,7 +23627,7 @@
               token: A @30
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22798,7 +23771,7 @@
               staticType: null
             typeArguments: TypeArgumentList
               arguments
-                TypeName
+                NamedType
                   name: SimpleIdentifier
                     staticElement: dart:core::@class::int
                     staticType: null
@@ -22847,6 +23820,7 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::A::@constructor::•
                 superKeyword: super @0
+            superConstructor: self::@class::A::@constructor::•
       class D @73
         metadata
           Annotation
@@ -22976,8 +23950,7 @@
   definingUnit
     enums
       enum E @19
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -23047,8 +24020,7 @@
             returnType: dynamic
     enums
       enum E @64
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -23122,8 +24094,7 @@
               staticElement: self::@getter::a
               staticType: null
               token: a @15
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -24576,6 +25547,7 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::A::@constructor::•
                 superKeyword: super @0
+            superConstructor: self::@class::A::@constructor::•
     mixins
       mixin M @33
         superclassConstraints
@@ -24619,8 +25591,7 @@
               staticElement: self::@getter::foo
               staticType: null
               token: foo @17
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -25501,6 +26472,58 @@
 ''');
   }
 
+  test_metadata_superFormalParameter() async {
+    var library = await checkLibrary('''
+const a = null;
+
+class A {
+  A(int x);
+}
+
+class B extends A {
+  B(@a super.x);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class A @23
+        constructors
+          @29
+            parameters
+              requiredPositional x @35
+                type: int
+      class B @48
+        supertype: A
+        constructors
+          @64
+            parameters
+              requiredPositional final super.x @75
+                type: int
+                metadata
+                  Annotation
+                    atSign: @ @66
+                    element: self::@getter::a
+                    name: SimpleIdentifier
+                      staticElement: self::@getter::a
+                      staticType: null
+                      token: a @67
+                superConstructorParameter: x@35
+            superConstructor: self::@class::A::@constructor::•
+    topLevelVariables
+      static const a @6
+        type: dynamic
+        constantInitializer
+          NullLiteral
+            literal: null @10
+            staticType: Null
+    accessors
+      synthetic static get a @-1
+        returnType: dynamic
+''');
+  }
+
   test_metadata_topLevelVariableDeclaration() async {
     var library = await checkLibrary('const a = null; @a int v;');
     checkElementText(library, r'''
@@ -25603,6 +26626,7 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::D::@constructor::•
                 superKeyword: super @0
+            superConstructor: self::@class::D::@constructor::•
       class D @48
         constructors
           synthetic @-1
@@ -25811,8 +26835,7 @@
           synthetic @-1
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -25933,187 +26956,6 @@
 ''');
   }
 
-  test_method_documented() async {
-    var library = await checkLibrary('''
-class C {
-  /**
-   * Docs
-   */
-  f() {}
-}''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          f @34
-            documentationComment: /**\n   * Docs\n   */
-            returnType: dynamic
-''');
-  }
-
-  test_method_hasImplicitReturnType_false() async {
-    var library = await checkLibrary('''
-class C {
-  int m() => 0;
-}
-''');
-    var c = library.definingCompilationUnit.classes.single;
-    var m = c.methods.single;
-    expect(m.hasImplicitReturnType, isFalse);
-  }
-
-  test_method_hasImplicitReturnType_true() async {
-    var library = await checkLibrary('''
-class C {
-  m() => 0;
-}
-''');
-    var c = library.definingCompilationUnit.classes.single;
-    var m = c.methods.single;
-    expect(m.hasImplicitReturnType, isTrue);
-  }
-
-  test_method_inferred_type_nonStatic_implicit_param() async {
-    var library = await checkLibrary('class C extends D { void f(value) {} }'
-        ' abstract class D { void f(int value); }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        supertype: D
-        constructors
-          synthetic @-1
-        methods
-          f @25
-            parameters
-              requiredPositional value @27
-                type: int
-            returnType: void
-      abstract class D @54
-        constructors
-          synthetic @-1
-        methods
-          abstract f @63
-            parameters
-              requiredPositional value @69
-                type: int
-            returnType: void
-''');
-  }
-
-  test_method_inferred_type_nonStatic_implicit_return() async {
-    var library = await checkLibrary('''
-class C extends D {
-  f() => null;
-}
-abstract class D {
-  int f();
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        supertype: D
-        constructors
-          synthetic @-1
-        methods
-          f @22
-            returnType: int
-      abstract class D @52
-        constructors
-          synthetic @-1
-        methods
-          abstract f @62
-            returnType: int
-''');
-  }
-
-  test_method_type_parameter() async {
-    var library = await checkLibrary('class C { T f<T, U>(U u) => null; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          f @12
-            typeParameters
-              covariant T @14
-              covariant U @17
-            parameters
-              requiredPositional u @22
-                type: U
-            returnType: T
-''');
-  }
-
-  test_method_type_parameter_in_generic_class() async {
-    var library = await checkLibrary('''
-class C<T, U> {
-  V f<V, W>(T t, U u, W w) => null;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        typeParameters
-          covariant T @8
-            defaultType: dynamic
-          covariant U @11
-            defaultType: dynamic
-        constructors
-          synthetic @-1
-        methods
-          f @20
-            typeParameters
-              covariant V @22
-              covariant W @25
-            parameters
-              requiredPositional t @30
-                type: T
-              requiredPositional u @35
-                type: U
-              requiredPositional w @40
-                type: W
-            returnType: V
-''');
-  }
-
-  test_method_type_parameter_with_function_typed_parameter() async {
-    var library = await checkLibrary('class C { void f<T, U>(T x(U u)) {} }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          f @15
-            typeParameters
-              covariant T @17
-              covariant U @20
-            parameters
-              requiredPositional x @25
-                type: T Function(U)
-                parameters
-                  requiredPositional u @29
-                    type: U
-            returnType: void
-''');
-  }
-
   test_methodInvocation_implicitCall() async {
     var library = await checkLibrary(r'''
 class A {
@@ -26313,6 +27155,9 @@
           M<int*>*
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: int*}
     mixins
       mixin M @20
         typeParameters
@@ -26347,6 +27192,9 @@
           M<int>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: int}
     mixins
       mixin M @20
         typeParameters
@@ -26385,6 +27233,9 @@
           C<int*>*
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: a.dart::@class::A::@constructor::•
+              substitution: {T: int*}
 ''');
   }
 
@@ -26410,6 +27261,9 @@
           M<int*>*
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: a.dart::@class::A::@constructor::•
+              substitution: {T: int*}
 ''');
   }
 
@@ -26856,7 +27710,7 @@
     functions
       f @5
         parameters
-          requiredName f @22
+          requiredNamed f @22
             type: void Function<U>(int)
             typeParameters
               covariant U @24
@@ -27292,8 +28146,7 @@
   definingUnit
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -27588,203 +28441,6 @@
         withNonSynthetic: true);
   }
 
-  test_old_typedef_notSimplyBounded_self() async {
-    var library = await checkLibrary('''
-typedef void F<T extends F>();
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @13
-        typeParameters
-          unrelated T @15
-            bound: dynamic
-            defaultType: dynamic
-        aliasedType: void Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: void
-''');
-  }
-
-  test_old_typedef_notSimplyBounded_simple_because_non_generic() async {
-    var library = await checkLibrary('''
-typedef void F();
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @13
-        aliasedType: void Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: void
-''');
-  }
-
-  test_old_typedef_notSimplyBounded_simple_no_bounds() async {
-    var library = await checkLibrary('typedef void F<T>();');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @13
-        typeParameters
-          unrelated T @15
-            defaultType: dynamic
-        aliasedType: void Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: void
-''');
-  }
-
-  test_operator() async {
-    var library =
-        await checkLibrary('class C { C operator+(C other) => null; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          + @20
-            parameters
-              requiredPositional other @24
-                type: C
-            returnType: C
-''');
-  }
-
-  test_operator_equal() async {
-    var library = await checkLibrary('''
-class C {
-  bool operator==(Object other) => false;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          == @25
-            parameters
-              requiredPositional other @35
-                type: Object
-            returnType: bool
-''');
-  }
-
-  test_operator_external() async {
-    var library =
-        await checkLibrary('class C { external C operator+(C other); }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          external + @29
-            parameters
-              requiredPositional other @33
-                type: C
-            returnType: C
-''');
-  }
-
-  test_operator_greater_equal() async {
-    var library = await checkLibrary('''
-class C {
-  bool operator>=(C other) => false;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          >= @25
-            parameters
-              requiredPositional other @30
-                type: C
-            returnType: bool
-''');
-  }
-
-  test_operator_index() async {
-    var library =
-        await checkLibrary('class C { bool operator[](int i) => null; }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          [] @23
-            parameters
-              requiredPositional i @30
-                type: int
-            returnType: bool
-''');
-  }
-
-  test_operator_index_set() async {
-    var library = await checkLibrary('''
-class C {
-  void operator[]=(int i, bool v) {}
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          []= @25
-            parameters
-              requiredPositional i @33
-                type: int
-              requiredPositional v @41
-                type: bool
-            returnType: void
-''');
-  }
-
-  test_operator_less_equal() async {
-    var library = await checkLibrary('''
-class C {
-  bool operator<=(C other) => false;
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        constructors
-          synthetic @-1
-        methods
-          <= @25
-            parameters
-              requiredPositional other @30
-                type: C
-            returnType: bool
-''');
-  }
-
   test_parameter() async {
     var library = await checkLibrary('void main(int p) {}');
     checkElementText(library, r'''
@@ -27897,6 +28553,9 @@
         supertype: A<T>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: T}
         methods
           f @75
             parameters
@@ -27932,6 +28591,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @68
             parameters
@@ -28294,28 +28954,6 @@
 ''');
   }
 
-  test_setter_covariant() async {
-    var library =
-        await checkLibrary('class C { void set x(covariant int value); }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          synthetic x @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          abstract set x @19
-            parameters
-              requiredPositional covariant value @35
-                type: int
-            returnType: void
-''');
-  }
-
   test_setter_documented() async {
     var library = await checkLibrary('''
 // Extra comment so doc comment offset != 0
@@ -28356,136 +28994,6 @@
 ''');
   }
 
-  test_setter_inferred_type_conflictingInheritance() async {
-    var library = await checkLibrary('''
-class A {
-  int t;
-}
-class B extends A {
-  double t;
-}
-class C extends A implements B {
-}
-class D extends C {
-  void set t(p) {}
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class A @6
-        fields
-          t @16
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get t @-1
-            returnType: int
-          synthetic set t @-1
-            parameters
-              requiredPositional _t @-1
-                type: int
-            returnType: void
-      class B @27
-        supertype: A
-        fields
-          t @50
-            type: double
-        constructors
-          synthetic @-1
-        accessors
-          synthetic get t @-1
-            returnType: double
-          synthetic set t @-1
-            parameters
-              requiredPositional _t @-1
-                type: double
-            returnType: void
-      class C @61
-        supertype: A
-        interfaces
-          B
-        constructors
-          synthetic @-1
-      class D @96
-        supertype: C
-        fields
-          synthetic t @-1
-            type: dynamic
-        constructors
-          synthetic @-1
-        accessors
-          set t @121
-            parameters
-              requiredPositional p @123
-                type: dynamic
-            returnType: void
-''');
-  }
-
-  test_setter_inferred_type_nonStatic_implicit_param() async {
-    var library =
-        await checkLibrary('class C extends D { void set f(value) {} }'
-            ' abstract class D { void set f(int value); }');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        supertype: D
-        fields
-          synthetic f @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          set f @29
-            parameters
-              requiredPositional value @31
-                type: int
-            returnType: void
-      abstract class D @58
-        fields
-          synthetic f @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          abstract set f @71
-            parameters
-              requiredPositional value @77
-                type: int
-            returnType: void
-''');
-  }
-
-  test_setter_inferred_type_static_implicit_return() async {
-    var library = await checkLibrary('''
-class C {
-  static set f(int value) {}
-}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class C @6
-        fields
-          synthetic static f @-1
-            type: int
-        constructors
-          synthetic @-1
-        accessors
-          static set f @23
-            parameters
-              requiredPositional value @29
-                type: int
-            returnType: void
-''');
-  }
-
   test_setter_inferred_type_top_level_implicit_return() async {
     var library = await checkLibrary('set f(int value) {}');
     checkElementText(library, r'''
@@ -29045,6 +29553,9 @@
                   rightParenthesis: ) @0
                 staticElement: self::@class::A::@constructor::•
                 superKeyword: super @0
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: T}
       class C @78
         fields
           a @88
@@ -29261,6 +29772,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
       class C @40
         typeParameters
           covariant T @42
@@ -29603,8 +30115,7 @@
           synthetic @-1
     enums
       enum E @16
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -29711,8 +30222,7 @@
             synthetic @-1
       enums
         enum E @27
-          interfaces
-            Enum
+          supertype: Enum
           fields
             synthetic final index @-1
               type: int
@@ -29753,8 +30263,7 @@
           synthetic @-1
     enums
       enum E @42
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -29832,8 +30341,7 @@
             synthetic @-1
       enums
         enum E @27
-          interfaces
-            Enum
+          supertype: Enum
           fields
             synthetic final index @-1
               type: int
@@ -29909,8 +30417,7 @@
             synthetic @-1
       enums
         enum E @27
-          interfaces
-            Enum
+          supertype: Enum
           fields
             synthetic final index @-1
               type: int
@@ -30054,8 +30561,7 @@
   definingUnit
     enums
       enum E @5
-        interfaces
-          Enum
+        supertype: Enum
         fields
           synthetic final index @-1
             type: int
@@ -31014,26 +31520,7 @@
 ''');
   }
 
-  test_typedef_documented() async {
-    var library = await checkLibrary('''
-// Extra comment so doc comment offset != 0
-/**
- * Docs
- */
-typedef F();''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @68
-        documentationComment: /**\n * Docs\n */
-        aliasedType: dynamic Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_generic() async {
+  test_typedef_function_generic() async {
     var library = await checkLibrary(
         'typedef F<T> = int Function<S>(List<S> list, num Function<A>(A), T);');
     checkElementText(library, r'''
@@ -31059,7 +31546,7 @@
 ''');
   }
 
-  test_typedef_generic_asFieldType() async {
+  test_typedef_function_generic_asFieldType() async {
     var library = await checkLibrary(r'''
 typedef Foo<S> = S Function<T>(T x);
 class A {
@@ -31109,31 +31596,635 @@
 ''');
   }
 
-  test_typedef_generic_invalid() async {
+  test_typedef_function_notSimplyBounded_dependency_via_param_type_name_included() async {
+    // F is considered "not simply bounded" because it expands to a type that
+    // refers to C, which is not simply bounded.
     var library = await checkLibrary('''
-typedef F = int;
-F f;
+typedef F = void Function(C c);
+class C<T extends C<T>> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      notSimplyBounded class C @38
+        typeParameters
+          covariant T @40
+            bound: C<T>
+            defaultType: C<dynamic>
+        constructors
+          synthetic @-1
+    typeAliases
+      notSimplyBounded F @8
+        aliasedType: void Function(C<C<dynamic>>)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional c @28
+              type: C<C<dynamic>>
+          returnType: void
+''');
+  }
+
+  test_typedef_function_notSimplyBounded_dependency_via_param_type_name_omitted() async {
+    // F is considered "not simply bounded" because it expands to a type that
+    // refers to C, which is not simply bounded.
+    var library = await checkLibrary('''
+typedef F = void Function(C);
+class C<T extends C<T>> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      notSimplyBounded class C @36
+        typeParameters
+          covariant T @38
+            bound: C<T>
+            defaultType: C<dynamic>
+        constructors
+          synthetic @-1
+    typeAliases
+      notSimplyBounded F @8
+        aliasedType: void Function(C<C<dynamic>>)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional @-1
+              type: C<C<dynamic>>
+          returnType: void
+''');
+  }
+
+  test_typedef_function_notSimplyBounded_dependency_via_return_type() async {
+    // F is considered "not simply bounded" because it expands to a type that
+    // refers to C, which is not simply bounded.
+    var library = await checkLibrary('''
+typedef F = C Function();
+class C<T extends C<T>> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      notSimplyBounded class C @32
+        typeParameters
+          covariant T @34
+            bound: C<T>
+            defaultType: C<dynamic>
+        constructors
+          synthetic @-1
+    typeAliases
+      notSimplyBounded F @8
+        aliasedType: C<C<dynamic>> Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: C<C<dynamic>>
+''');
+  }
+
+  test_typedef_function_typeParameters_f_bound_simple() async {
+    var library =
+        await checkLibrary('typedef F<T extends U, U> = U Function(T t);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      notSimplyBounded F @8
+        typeParameters
+          contravariant T @10
+            bound: U
+            defaultType: Never
+          covariant U @23
+            defaultType: dynamic
+        aliasedType: U Function(T)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @41
+              type: T
+          returnType: U
+''');
+  }
+
+  test_typedef_function_typeParameters_f_bound_simple_legacy() async {
+    featureSet = FeatureSets.language_2_9;
+    var library =
+        await checkLibrary('typedef F<T extends U, U> = U Function(T t);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      notSimplyBounded F @8
+        typeParameters
+          contravariant T @10
+            bound: U*
+            defaultType: Null*
+          covariant U @23
+            defaultType: dynamic
+        aliasedType: U* Function(T*)*
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @41
+              type: T*
+          returnType: U*
+''');
+  }
+
+  test_typedef_legacy_documented() async {
+    var library = await checkLibrary('''
+// Extra comment so doc comment offset != 0
+/**
+ * Docs
+ */
+typedef F();''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @68
+        documentationComment: /**\n * Docs\n */
+        aliasedType: dynamic Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_notSimplyBounded_dependency_via_param_type() async {
+    // F is considered "not simply bounded" because it expands to a type that
+    // refers to C, which is not simply bounded.
+    var library = await checkLibrary('''
+typedef void F(C c);
+class C<T extends C<T>> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      notSimplyBounded class C @27
+        typeParameters
+          covariant T @29
+            bound: C<T>
+            defaultType: C<dynamic>
+        constructors
+          synthetic @-1
+    typeAliases
+      functionTypeAliasBased notSimplyBounded F @13
+        aliasedType: void Function(C<C<dynamic>>)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional c @17
+              type: C<C<dynamic>>
+          returnType: void
+''');
+  }
+
+  test_typedef_legacy_notSimplyBounded_dependency_via_return_type() async {
+    // F is considered "not simply bounded" because it expands to a type that
+    // refers to C, which is not simply bounded.
+    var library = await checkLibrary('''
+typedef C F();
+class C<T extends C<T>> {}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      notSimplyBounded class C @21
+        typeParameters
+          covariant T @23
+            bound: C<T>
+            defaultType: C<dynamic>
+        constructors
+          synthetic @-1
+    typeAliases
+      functionTypeAliasBased notSimplyBounded F @10
+        aliasedType: C<C<dynamic>> Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: C<C<dynamic>>
+''');
+  }
+
+  test_typedef_legacy_notSimplyBounded_self() async {
+    var library = await checkLibrary('''
+typedef void F<T extends F>();
 ''');
     checkElementText(library, r'''
 library
   definingUnit
     typeAliases
-      F @8
-        aliasedType: int
-    topLevelVariables
-      static f @19
-        type: int
-          aliasElement: self::@typeAlias::F
-    accessors
-      synthetic static get f @-1
-        returnType: int
-          aliasElement: self::@typeAlias::F
-      synthetic static set f @-1
-        parameters
-          requiredPositional _f @-1
-            type: int
-              aliasElement: self::@typeAlias::F
-        returnType: void
+      functionTypeAliasBased notSimplyBounded F @13
+        typeParameters
+          unrelated T @15
+            bound: dynamic
+            defaultType: dynamic
+        aliasedType: void Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: void
+''');
+  }
+
+  test_typedef_legacy_notSimplyBounded_simple_because_non_generic() async {
+    var library = await checkLibrary('''
+typedef void F();
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @13
+        aliasedType: void Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: void
+''');
+  }
+
+  test_typedef_legacy_notSimplyBounded_simple_no_bounds() async {
+    var library = await checkLibrary('typedef void F<T>();');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @13
+        typeParameters
+          unrelated T @15
+            defaultType: dynamic
+        aliasedType: void Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: void
+''');
+  }
+
+  test_typedef_legacy_parameter_hasImplicitType() async {
+    var library = await checkLibrary(r'''
+typedef void F(int a, b, [int c, d]);
+''');
+    var F = library.definingCompilationUnit.typeAliases.single;
+    var function = F.aliasedElement as GenericFunctionTypeElement;
+    // TODO(scheglov) Use better textual presentation with all information.
+    expect(function.parameters[0].hasImplicitType, false);
+    expect(function.parameters[1].hasImplicitType, true);
+    expect(function.parameters[2].hasImplicitType, false);
+    expect(function.parameters[3].hasImplicitType, true);
+  }
+
+  test_typedef_legacy_parameter_parameters() async {
+    var library = await checkLibrary('typedef F(g(x, y));');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @8
+        aliasedType: dynamic Function(dynamic Function(dynamic, dynamic))
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional g @10
+              type: dynamic Function(dynamic, dynamic)
+              parameters
+                requiredPositional x @12
+                  type: dynamic
+                requiredPositional y @15
+                  type: dynamic
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_parameter_parameters_in_generic_class() async {
+    var library = await checkLibrary('typedef F<A, B>(A g(B x));');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @8
+        typeParameters
+          contravariant A @10
+            defaultType: dynamic
+          covariant B @13
+            defaultType: dynamic
+        aliasedType: dynamic Function(A Function(B))
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional g @18
+              type: A Function(B)
+              parameters
+                requiredPositional x @22
+                  type: B
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_parameter_return_type() async {
+    var library = await checkLibrary('typedef F(int g());');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @8
+        aliasedType: dynamic Function(int Function())
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional g @14
+              type: int Function()
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_parameter_type() async {
+    var library = await checkLibrary('typedef F(int i);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @8
+        aliasedType: dynamic Function(int)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional i @14
+              type: int
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_parameter_type_generic() async {
+    var library = await checkLibrary('typedef F<T>(T t);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @8
+        typeParameters
+          contravariant T @10
+            defaultType: dynamic
+        aliasedType: dynamic Function(T)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @15
+              type: T
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_parameters() async {
+    var library = await checkLibrary('typedef F(x, y);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @8
+        aliasedType: dynamic Function(dynamic, dynamic)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional x @10
+              type: dynamic
+            requiredPositional y @13
+              type: dynamic
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_parameters_named() async {
+    var library = await checkLibrary('typedef F({y, z, x});');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @8
+        aliasedType: dynamic Function({dynamic x, dynamic y, dynamic z})
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            optionalNamed y @11
+              type: dynamic
+            optionalNamed z @14
+              type: dynamic
+            optionalNamed x @17
+              type: dynamic
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_return_type() async {
+    var library = await checkLibrary('typedef int F();');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @12
+        aliasedType: int Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: int
+''');
+  }
+
+  test_typedef_legacy_return_type_generic() async {
+    var library = await checkLibrary('typedef T F<T>();');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @10
+        typeParameters
+          covariant T @12
+            defaultType: dynamic
+        aliasedType: T Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: T
+''');
+  }
+
+  test_typedef_legacy_return_type_implicit() async {
+    var library = await checkLibrary('typedef F();');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @8
+        aliasedType: dynamic Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: dynamic
+''');
+  }
+
+  test_typedef_legacy_return_type_void() async {
+    var library = await checkLibrary('typedef void F();');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @13
+        aliasedType: void Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: void
+''');
+  }
+
+  test_typedef_legacy_typeParameters() async {
+    var library = await checkLibrary('typedef U F<T, U>(T t);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased F @10
+        typeParameters
+          contravariant T @12
+            defaultType: dynamic
+          covariant U @15
+            defaultType: dynamic
+        aliasedType: U Function(T)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @20
+              type: T
+          returnType: U
+''');
+  }
+
+  test_typedef_legacy_typeParameters_bound() async {
+    var library = await checkLibrary(
+        'typedef U F<T extends Object, U extends D>(T t); class D {}');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class D @55
+        constructors
+          synthetic @-1
+    typeAliases
+      functionTypeAliasBased F @10
+        typeParameters
+          contravariant T @12
+            bound: Object
+            defaultType: Object
+          covariant U @30
+            bound: D
+            defaultType: D
+        aliasedType: U Function(T)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @45
+              type: T
+          returnType: U
+''');
+  }
+
+  test_typedef_legacy_typeParameters_bound_recursive() async {
+    var library = await checkLibrary('typedef void F<T extends F>();');
+    // Typedefs cannot reference themselves.
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased notSimplyBounded F @13
+        typeParameters
+          unrelated T @15
+            bound: dynamic
+            defaultType: dynamic
+        aliasedType: void Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: void
+''');
+  }
+
+  test_typedef_legacy_typeParameters_bound_recursive2() async {
+    var library = await checkLibrary('typedef void F<T extends List<F>>();');
+    // Typedefs cannot reference themselves.
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased notSimplyBounded F @13
+        typeParameters
+          unrelated T @15
+            bound: List<dynamic>
+            defaultType: dynamic
+        aliasedType: void Function()
+        aliasedElement: GenericFunctionTypeElement
+          returnType: void
+''');
+  }
+
+  test_typedef_legacy_typeParameters_f_bound_complex() async {
+    var library = await checkLibrary('typedef U F<T extends List<U>, U>(T t);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased notSimplyBounded F @10
+        typeParameters
+          contravariant T @12
+            bound: List<U>
+            defaultType: List<Never>
+          covariant U @31
+            defaultType: dynamic
+        aliasedType: U Function(T)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @36
+              type: T
+          returnType: U
+''');
+  }
+
+  test_typedef_legacy_typeParameters_f_bound_complex_legacy() async {
+    featureSet = FeatureSets.language_2_9;
+    var library = await checkLibrary('typedef U F<T extends List<U>, U>(T t);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased notSimplyBounded F @10
+        typeParameters
+          contravariant T @12
+            bound: List<U*>*
+            defaultType: List<Null*>*
+          covariant U @31
+            defaultType: dynamic
+        aliasedType: U* Function(T*)*
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @36
+              type: T*
+          returnType: U*
+''');
+  }
+
+  test_typedef_legacy_typeParameters_f_bound_simple() async {
+    var library = await checkLibrary('typedef U F<T extends U, U>(T t);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased notSimplyBounded F @10
+        typeParameters
+          contravariant T @12
+            bound: U
+            defaultType: Never
+          covariant U @25
+            defaultType: dynamic
+        aliasedType: U Function(T)
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @30
+              type: T
+          returnType: U
+''');
+  }
+
+  test_typedef_legacy_typeParameters_f_bound_simple_legacy() async {
+    featureSet = FeatureSets.language_2_9;
+    var library = await checkLibrary('typedef U F<T extends U, U>(T t);');
+    checkElementText(library, r'''
+library
+  definingUnit
+    typeAliases
+      functionTypeAliasBased notSimplyBounded F @10
+        typeParameters
+          contravariant T @12
+            bound: U*
+            defaultType: Null*
+          covariant U @25
+            defaultType: dynamic
+        aliasedType: U* Function(T*)*
+        aliasedElement: GenericFunctionTypeElement
+          parameters
+            requiredPositional t @30
+              type: T*
+          returnType: U*
 ''');
   }
 
@@ -31670,6 +32761,9 @@
           aliasElement: self::@typeAlias::X
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: int}
     typeAliases
       X @8
         aliasedType: A<int>
@@ -31699,6 +32793,9 @@
             A<int>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: int}
     typeAliases
       X @8
         typeParameters
@@ -31772,6 +32869,9 @@
           aliasElement: self::@typeAlias::X
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: int?}
     typeAliases
       X @8
         aliasedType: A<int?>
@@ -32076,569 +33176,6 @@
 ''');
   }
 
-  test_typedef_notSimplyBounded_dependency_via_param_type_new_style_name_included() async {
-    // F is considered "not simply bounded" because it expands to a type that
-    // refers to C, which is not simply bounded.
-    var library = await checkLibrary('''
-typedef F = void Function(C c);
-class C<T extends C<T>> {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      notSimplyBounded class C @38
-        typeParameters
-          covariant T @40
-            bound: C<T>
-            defaultType: C<dynamic>
-        constructors
-          synthetic @-1
-    typeAliases
-      notSimplyBounded F @8
-        aliasedType: void Function(C<C<dynamic>>)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional c @28
-              type: C<C<dynamic>>
-          returnType: void
-''');
-  }
-
-  test_typedef_notSimplyBounded_dependency_via_param_type_new_style_name_omitted() async {
-    // F is considered "not simply bounded" because it expands to a type that
-    // refers to C, which is not simply bounded.
-    var library = await checkLibrary('''
-typedef F = void Function(C);
-class C<T extends C<T>> {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      notSimplyBounded class C @36
-        typeParameters
-          covariant T @38
-            bound: C<T>
-            defaultType: C<dynamic>
-        constructors
-          synthetic @-1
-    typeAliases
-      notSimplyBounded F @8
-        aliasedType: void Function(C<C<dynamic>>)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional @-1
-              type: C<C<dynamic>>
-          returnType: void
-''');
-  }
-
-  test_typedef_notSimplyBounded_dependency_via_param_type_old_style() async {
-    // F is considered "not simply bounded" because it expands to a type that
-    // refers to C, which is not simply bounded.
-    var library = await checkLibrary('''
-typedef void F(C c);
-class C<T extends C<T>> {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      notSimplyBounded class C @27
-        typeParameters
-          covariant T @29
-            bound: C<T>
-            defaultType: C<dynamic>
-        constructors
-          synthetic @-1
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @13
-        aliasedType: void Function(C<C<dynamic>>)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional c @17
-              type: C<C<dynamic>>
-          returnType: void
-''');
-  }
-
-  test_typedef_notSimplyBounded_dependency_via_return_type_new_style() async {
-    // F is considered "not simply bounded" because it expands to a type that
-    // refers to C, which is not simply bounded.
-    var library = await checkLibrary('''
-typedef F = C Function();
-class C<T extends C<T>> {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      notSimplyBounded class C @32
-        typeParameters
-          covariant T @34
-            bound: C<T>
-            defaultType: C<dynamic>
-        constructors
-          synthetic @-1
-    typeAliases
-      notSimplyBounded F @8
-        aliasedType: C<C<dynamic>> Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: C<C<dynamic>>
-''');
-  }
-
-  test_typedef_notSimplyBounded_dependency_via_return_type_old_style() async {
-    // F is considered "not simply bounded" because it expands to a type that
-    // refers to C, which is not simply bounded.
-    var library = await checkLibrary('''
-typedef C F();
-class C<T extends C<T>> {}
-''');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      notSimplyBounded class C @21
-        typeParameters
-          covariant T @23
-            bound: C<T>
-            defaultType: C<dynamic>
-        constructors
-          synthetic @-1
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @10
-        aliasedType: C<C<dynamic>> Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: C<C<dynamic>>
-''');
-  }
-
-  test_typedef_parameter_hasImplicitType() async {
-    var library = await checkLibrary(r'''
-typedef void F(int a, b, [int c, d]);
-''');
-    var F = library.definingCompilationUnit.typeAliases.single;
-    var function = F.aliasedElement as GenericFunctionTypeElement;
-    // TODO(scheglov) Use better textual presentation with all information.
-    expect(function.parameters[0].hasImplicitType, false);
-    expect(function.parameters[1].hasImplicitType, true);
-    expect(function.parameters[2].hasImplicitType, false);
-    expect(function.parameters[3].hasImplicitType, true);
-  }
-
-  test_typedef_parameter_parameters() async {
-    var library = await checkLibrary('typedef F(g(x, y));');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @8
-        aliasedType: dynamic Function(dynamic Function(dynamic, dynamic))
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional g @10
-              type: dynamic Function(dynamic, dynamic)
-              parameters
-                requiredPositional x @12
-                  type: dynamic
-                requiredPositional y @15
-                  type: dynamic
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_parameter_parameters_in_generic_class() async {
-    var library = await checkLibrary('typedef F<A, B>(A g(B x));');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @8
-        typeParameters
-          contravariant A @10
-            defaultType: dynamic
-          covariant B @13
-            defaultType: dynamic
-        aliasedType: dynamic Function(A Function(B))
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional g @18
-              type: A Function(B)
-              parameters
-                requiredPositional x @22
-                  type: B
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_parameter_return_type() async {
-    var library = await checkLibrary('typedef F(int g());');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @8
-        aliasedType: dynamic Function(int Function())
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional g @14
-              type: int Function()
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_parameter_type() async {
-    var library = await checkLibrary('typedef F(int i);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @8
-        aliasedType: dynamic Function(int)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional i @14
-              type: int
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_parameter_type_generic() async {
-    var library = await checkLibrary('typedef F<T>(T t);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @8
-        typeParameters
-          contravariant T @10
-            defaultType: dynamic
-        aliasedType: dynamic Function(T)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @15
-              type: T
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_parameters() async {
-    var library = await checkLibrary('typedef F(x, y);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @8
-        aliasedType: dynamic Function(dynamic, dynamic)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional x @10
-              type: dynamic
-            requiredPositional y @13
-              type: dynamic
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_parameters_named() async {
-    var library = await checkLibrary('typedef F({y, z, x});');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @8
-        aliasedType: dynamic Function({dynamic x, dynamic y, dynamic z})
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            optionalNamed y @11
-              type: dynamic
-            optionalNamed z @14
-              type: dynamic
-            optionalNamed x @17
-              type: dynamic
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_return_type() async {
-    var library = await checkLibrary('typedef int F();');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @12
-        aliasedType: int Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: int
-''');
-  }
-
-  test_typedef_return_type_generic() async {
-    var library = await checkLibrary('typedef T F<T>();');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @10
-        typeParameters
-          covariant T @12
-            defaultType: dynamic
-        aliasedType: T Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: T
-''');
-  }
-
-  test_typedef_return_type_implicit() async {
-    var library = await checkLibrary('typedef F();');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @8
-        aliasedType: dynamic Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: dynamic
-''');
-  }
-
-  test_typedef_return_type_void() async {
-    var library = await checkLibrary('typedef void F();');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @13
-        aliasedType: void Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: void
-''');
-  }
-
-  test_typedef_type_parameters() async {
-    var library = await checkLibrary('typedef U F<T, U>(T t);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased F @10
-        typeParameters
-          contravariant T @12
-            defaultType: dynamic
-          covariant U @15
-            defaultType: dynamic
-        aliasedType: U Function(T)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @20
-              type: T
-          returnType: U
-''');
-  }
-
-  test_typedef_type_parameters_bound() async {
-    var library = await checkLibrary(
-        'typedef U F<T extends Object, U extends D>(T t); class D {}');
-    checkElementText(library, r'''
-library
-  definingUnit
-    classes
-      class D @55
-        constructors
-          synthetic @-1
-    typeAliases
-      functionTypeAliasBased F @10
-        typeParameters
-          contravariant T @12
-            bound: Object
-            defaultType: Object
-          covariant U @30
-            bound: D
-            defaultType: D
-        aliasedType: U Function(T)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @45
-              type: T
-          returnType: U
-''');
-  }
-
-  test_typedef_type_parameters_bound_recursive() async {
-    var library = await checkLibrary('typedef void F<T extends F>();');
-    // Typedefs cannot reference themselves.
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @13
-        typeParameters
-          unrelated T @15
-            bound: dynamic
-            defaultType: dynamic
-        aliasedType: void Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: void
-''');
-  }
-
-  test_typedef_type_parameters_bound_recursive2() async {
-    var library = await checkLibrary('typedef void F<T extends List<F>>();');
-    // Typedefs cannot reference themselves.
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @13
-        typeParameters
-          unrelated T @15
-            bound: List<dynamic>
-            defaultType: dynamic
-        aliasedType: void Function()
-        aliasedElement: GenericFunctionTypeElement
-          returnType: void
-''');
-  }
-
-  test_typedef_type_parameters_f_bound_complex() async {
-    var library = await checkLibrary('typedef U F<T extends List<U>, U>(T t);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @10
-        typeParameters
-          contravariant T @12
-            bound: List<U>
-            defaultType: List<Never>
-          covariant U @31
-            defaultType: dynamic
-        aliasedType: U Function(T)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @36
-              type: T
-          returnType: U
-''');
-  }
-
-  test_typedef_type_parameters_f_bound_complex_legacy() async {
-    featureSet = FeatureSets.language_2_9;
-    var library = await checkLibrary('typedef U F<T extends List<U>, U>(T t);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @10
-        typeParameters
-          contravariant T @12
-            bound: List<U*>*
-            defaultType: List<Null*>*
-          covariant U @31
-            defaultType: dynamic
-        aliasedType: U* Function(T*)*
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @36
-              type: T*
-          returnType: U*
-''');
-  }
-
-  test_typedef_type_parameters_f_bound_simple() async {
-    var library = await checkLibrary('typedef U F<T extends U, U>(T t);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @10
-        typeParameters
-          contravariant T @12
-            bound: U
-            defaultType: Never
-          covariant U @25
-            defaultType: dynamic
-        aliasedType: U Function(T)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @30
-              type: T
-          returnType: U
-''');
-  }
-
-  test_typedef_type_parameters_f_bound_simple_legacy() async {
-    featureSet = FeatureSets.language_2_9;
-    var library = await checkLibrary('typedef U F<T extends U, U>(T t);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      functionTypeAliasBased notSimplyBounded F @10
-        typeParameters
-          contravariant T @12
-            bound: U*
-            defaultType: Null*
-          covariant U @25
-            defaultType: dynamic
-        aliasedType: U* Function(T*)*
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @30
-              type: T*
-          returnType: U*
-''');
-  }
-
-  test_typedef_type_parameters_f_bound_simple_new_syntax() async {
-    var library =
-        await checkLibrary('typedef F<T extends U, U> = U Function(T t);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      notSimplyBounded F @8
-        typeParameters
-          contravariant T @10
-            bound: U
-            defaultType: Never
-          covariant U @23
-            defaultType: dynamic
-        aliasedType: U Function(T)
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @41
-              type: T
-          returnType: U
-''');
-  }
-
-  test_typedef_type_parameters_f_bound_simple_new_syntax_legacy() async {
-    featureSet = FeatureSets.language_2_9;
-    var library =
-        await checkLibrary('typedef F<T extends U, U> = U Function(T t);');
-    checkElementText(library, r'''
-library
-  definingUnit
-    typeAliases
-      notSimplyBounded F @8
-        typeParameters
-          contravariant T @10
-            bound: U*
-            defaultType: Null*
-          covariant U @23
-            defaultType: dynamic
-        aliasedType: U* Function(T*)*
-        aliasedElement: GenericFunctionTypeElement
-          parameters
-            requiredPositional t @41
-              type: T*
-          returnType: U*
-''');
-  }
-
   test_typedefs() async {
     var library = await checkLibrary('f() {} g() {}');
     checkElementText(library, r'''
@@ -33883,7 +34420,7 @@
               staticElement: ConstructorMember
                 base: self::@class::A::@constructor::•
                 substitution: {T: int}
-              type: TypeName
+              type: NamedType
                 name: SimpleIdentifier
                   staticElement: self::@class::A
                   staticType: null
diff --git a/pkg/analyzer/test/src/summary/test_strategies.dart b/pkg/analyzer/test/src/summary/test_strategies.dart
index 5632a0a..8d21be1 100644
--- a/pkg/analyzer/test/src/summary/test_strategies.dart
+++ b/pkg/analyzer/test/src/summary/test_strategies.dart
@@ -14,22 +14,22 @@
 import 'package:analyzer/src/generated/source.dart';
 
 CompilationUnit parseText(
+  Source source,
   String text,
   FeatureSet featureSet,
 ) {
   CharSequenceReader reader = CharSequenceReader(text);
-  Scanner scanner =
-      Scanner(_SourceMock.instance, reader, AnalysisErrorListener.NULL_LISTENER)
-        ..configureFeatures(
-          featureSetForOverriding: featureSet,
-          featureSet: featureSet,
-        );
+  Scanner scanner = Scanner(source, reader, AnalysisErrorListener.NULL_LISTENER)
+    ..configureFeatures(
+      featureSetForOverriding: featureSet,
+      featureSet: featureSet,
+    );
   Token token = scanner.tokenize();
   // Pass the feature set from the scanner to the parser
   // because the scanner may have detected a language version comment
   // and downgraded the feature set it holds.
   Parser parser = Parser(
-    NonExistingSource.unknown,
+    source,
     AnalysisErrorListener.NULL_LISTENER,
     featureSet: scanner.featureSet,
   );
@@ -43,10 +43,3 @@
 
   return unit;
 }
-
-class _SourceMock implements Source {
-  static final Source instance = _SourceMock();
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index feb2509..7a9a91c 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -1661,6 +1661,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           foo @52
             returnType: int
@@ -4712,6 +4713,9 @@
             type: List<dynamic Function()>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: int}
         accessors
           get x @114
             returnType: dynamic Function()
@@ -4898,6 +4902,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @58
             parameters
@@ -4949,6 +4954,7 @@
           B
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @100
             typeInferenceError: overrideNoCombinedSuperSignature
@@ -5099,6 +5105,7 @@
           B
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @88
             typeInferenceError: overrideNoCombinedSuperSignature
@@ -5152,6 +5159,9 @@
           B<double>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {T: int}
         methods
           m @112
             typeInferenceError: overrideNoCombinedSuperSignature
@@ -5210,6 +5220,9 @@
           B<double>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {K: int, V: String}
         methods
           m @119
             typeInferenceError: overrideNoCombinedSuperSignature
@@ -5246,6 +5259,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @53
             parameters
@@ -5283,6 +5297,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @53
             parameters
@@ -5320,6 +5335,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @44
             parameters
@@ -5355,6 +5371,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @63
             parameters
@@ -5395,6 +5412,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @48
             parameters
@@ -5439,10 +5457,16 @@
         supertype: A<int, T>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {K: int, V: T}
       class C @70
         supertype: B<String>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::B::@constructor::•
+              substitution: {T: String}
         methods
           m @94
             parameters
@@ -5481,6 +5505,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @55
             parameters
@@ -5491,6 +5516,7 @@
         supertype: B
         constructors
           synthetic @-1
+            superConstructor: self::@class::B::@constructor::•
         methods
           m @87
             parameters
@@ -5540,6 +5566,7 @@
         supertype: B
         constructors
           synthetic @-1
+            superConstructor: self::@class::B::@constructor::•
         methods
           m @90
             parameters
@@ -5590,6 +5617,7 @@
         supertype: B
         constructors
           synthetic @-1
+            superConstructor: self::@class::B::@constructor::•
         methods
           m @99
             parameters
@@ -5632,6 +5660,9 @@
         supertype: A<int, String>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {K: int, V: String}
         methods
           m @77
             parameters
@@ -5669,6 +5700,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @55
             parameters
@@ -5706,6 +5738,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @67
             parameters
@@ -5745,6 +5778,7 @@
         supertype: A
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @67
             parameters
@@ -5791,10 +5825,16 @@
         supertype: A<int, T>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {K: int, V: T}
       class C @70
         supertype: B<String>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::B::@constructor::•
+              substitution: {T: String}
         methods
           m @94
             parameters
@@ -5918,6 +5958,9 @@
         supertype: A<T2, T1>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {K: T2, V: T1}
       class C @91
         interfaces
           B<int, String>
@@ -5962,6 +6005,7 @@
         supertype: A1
         constructors
           synthetic @-1
+            superConstructor: self::@class::A1::@constructor::•
         methods
           _foo @77
             returnType: int
@@ -6053,6 +6097,9 @@
           B<String>
         constructors
           synthetic @-1
+            superConstructor: ConstructorMember
+              base: self::@class::A::@constructor::•
+              substitution: {K: int, V: String}
         methods
           m @119
             parameters
@@ -6102,6 +6149,7 @@
           B
         constructors
           synthetic @-1
+            superConstructor: self::@class::A::@constructor::•
         methods
           m @101
             parameters
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index a25a5ac..5a33bcb 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -1906,13 +1906,18 @@
 var fe0 = (int x) => x as dynamic;
 var fe1 = (int x) => x;
 ''', [
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 12, 2),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 96, 2),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 12, 2,
+          messageContains: ["'f0'"]),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 96, 2,
+          messageContains: ["'g0'"]),
       error(HintCode.UNUSED_ELEMENT, 96, 2),
       error(HintCode.UNUSED_ELEMENT, 126, 2),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 212, 12),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 304, 2),
-      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 373, 1),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 212, 12,
+          messageContains: ["'m0'"]),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 304, 2,
+          messageContains: ["'y0'"]),
+      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 373, 1,
+          messageContains: ["'f'"]),
     ]);
   }
 
@@ -3026,33 +3031,6 @@
     ]);
   }
 
-  test_superCallPlacement() async {
-    await assertErrorsInCode('''
-class Base {
-  var x;
-  Base() : x = 1;
-}
-
-class Derived extends Base {
-  var y, z;
-  Derived() : y = 1, super(), z = 2;
-}
-
-class Valid extends Base {
-  var y, z;
-  Valid(): y = 1, z = 2, super();
-}
-
-class AlsoValid extends Base {
-  AlsoValid() : super();
-}
-
-main() => new Derived();
-''', [
-      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 105, 5),
-    ]);
-  }
-
   test_superclassOverrideOfGrandInterface_interfaceOfAbstractSuperclass() async {
     await assertErrorsInCode('''
 class A {}
@@ -3411,62 +3389,6 @@
     ]);
   }
 
-  test_unaryOperators() async {
-    await assertErrorsInCode('''
-class A {
-  A operator ~() => null;
-  A operator +(int x) => null;
-  A operator -(int x) => null;
-  A operator -() => null;
-}
-class B extends A {}
-class C extends B {}
-
-foo() => new A();
-
-test() {
-  A a = new A();
-  B b = new B();
-  var c = foo();
-  dynamic d;
-
-  ~a;
-  (~d);
-
-  !a;
-  !d;
-
-  -a;
-  (-d);
-
-  ++a;
-  --a;
-  (++d);
-  (--d);
-
-  a++;
-  a--;
-  (d++);
-  (d--);
-
-  ++b;
-  --b;
-  b++;
-  b--;
-
-  takesC(C c) => null;
-  takesC(++b);
-  takesC(--b);
-  takesC(b++);
-  takesC(b--);
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 201, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 237, 1),
-      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 280, 1),
-    ]);
-  }
-
   test_unboundTypeName() async {
     await assertErrorsInCode('''
 void main() {
diff --git a/pkg/analyzer/test/src/test_all.dart b/pkg/analyzer/test/src/test_all.dart
index 9969e39..c6fe9f8 100644
--- a/pkg/analyzer/test/src/test_all.dart
+++ b/pkg/analyzer/test/src/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'clients/test_all.dart' as clients;
 import 'context/test_all.dart' as context;
 import 'dart/test_all.dart' as dart;
 import 'dartdoc/test_all.dart' as dartdoc;
@@ -25,6 +26,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    clients.main();
     context.main();
     dart.main();
     dartdoc.main();
diff --git a/pkg/analyzer/test/src/workspace/bazel_test.dart b/pkg/analyzer/test/src/workspace/bazel_test.dart
index 88e983e..bdfa730 100644
--- a/pkg/analyzer/test/src/workspace/bazel_test.dart
+++ b/pkg/analyzer/test/src/workspace/bazel_test.dart
@@ -38,6 +38,12 @@
     expect(workspace.isBazel, isTrue);
   }
 
+  void test_pathToUri() {
+    Uri uri = toUri('/workspace/test.dart');
+    var source = resolver.resolveAbsolute(uri)!;
+    expect(resolver.pathToUri(source.fullName), uri);
+  }
+
   void test_resolveAbsolute_doesNotExist() {
     var source = _resolvePath('/workspace/foo.dart')!;
     expect(source.exists(), isFalse);
@@ -79,14 +85,15 @@
     expect(source, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute() {
     Uri uri =
         resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
     var source = resolver.resolveAbsolute(uri)!;
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver.restoreAbsolute(NonExistingSource(source.fullName,
-            Uri.parse('package:test/test.dart'), UriKind.PACKAGE_URI)),
+        resolver.restoreAbsolute(NonExistingSource(
+            source.fullName, Uri.parse('package:test/test.dart'))),
         uri);
   }
 
@@ -538,6 +545,15 @@
         'package:third_party.something/foo.dart');
   }
 
+  void test_restoreAbsolute_workspace_nestedLib() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/my/components/lib/src/foo/lib/foo.dart',
+    ]);
+    _assertRestore('/workspace/my/components/lib/src/foo/lib/foo.dart',
+        'package:my.components.lib.src.foo/foo.dart');
+  }
+
   void _addResources(List<String> paths,
       {String workspacePath = '/workspace'}) {
     for (String path in paths) {
@@ -561,21 +577,25 @@
       {bool exists = true, bool restore = true}) {
     Uri uri = Uri.parse(uriStr);
     var source = resolver.resolveAbsolute(uri)!;
-    expect(source.fullName, convertPath(posixPath));
+    var path = source.fullName;
+    expect(path, convertPath(posixPath));
     expect(source.uri, uri);
     expect(source.exists(), exists);
     // If enabled, test also "restoreAbsolute".
     if (restore) {
-      var uri = resolver.restoreAbsolute(source);
-      expect(uri.toString(), uriStr);
+      expect(resolver.pathToUri(path), uri);
+      // ignore: deprecated_member_use_from_same_package
+      expect(resolver.restoreAbsolute(source), uri);
     }
   }
 
-  void _assertRestore(String posixPath, String? expectedUri) {
+  void _assertRestore(String posixPath, String? expectedUriStr) {
+    var expectedUri = expectedUriStr != null ? Uri.parse(expectedUriStr) : null;
     String path = convertPath(posixPath);
     _MockSource source = _MockSource(path);
-    var uri = resolver.restoreAbsolute(source);
-    expect(uri?.toString(), expectedUri);
+    expect(resolver.pathToUri(path), expectedUri);
+    // ignore: deprecated_member_use_from_same_package
+    expect(resolver.restoreAbsolute(source), expectedUri);
   }
 }
 
diff --git a/pkg/analyzer/test/src/workspace/package_build_test.dart b/pkg/analyzer/test/src/workspace/package_build_test.dart
index b7a9650..f262445 100644
--- a/pkg/analyzer/test/src/workspace/package_build_test.dart
+++ b/pkg/analyzer/test/src/workspace/package_build_test.dart
@@ -20,23 +20,25 @@
 
 class MockUriResolver implements UriResolver {
   Map<Uri, File> uriToFile = {};
-  Map<String, Uri> pathToUri = {};
+  Map<String, Uri> pathToUriMap = {};
 
   void add(Uri uri, File file) {
     uriToFile[uri] = file;
-    pathToUri[file.path] = uri;
+    pathToUriMap[file.path] = uri;
   }
 
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 
   @override
-  Source? resolveAbsolute(Uri uri) {
-    return uriToFile[uri]?.createSource(uri);
+  Uri? pathToUri(String path) {
+    return pathToUriMap[path];
   }
 
   @override
-  Uri? restoreAbsolute(Source source) => pathToUri[source.fullName];
+  Source? resolveAbsolute(Uri uri) {
+    return uriToFile[uri]?.createSource(uri);
+  }
 }
 
 @reflectiveTest
@@ -61,6 +63,12 @@
     expect(workspace.isBazel, isFalse);
   }
 
+  void test_pathToUri() {
+    var uri = toUri('/workspace/test.dart');
+    var source = resolver.resolveAbsolute(uri)!;
+    expect(resolver.pathToUri(source.fullName), uri);
+  }
+
   void test_resolveAbsolute_doesNotExist() {
     var source = _resolvePath('/workspace/foo.dart')!;
     expect(source, isNotNull);
@@ -98,6 +106,7 @@
     expect(source, isNull);
   }
 
+  @Deprecated('Use pathToUri() instead')
   void test_restoreAbsolute() {
     Uri uri =
         resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
@@ -105,8 +114,8 @@
     expect(source, isNotNull);
     expect(resolver.restoreAbsolute(source), uri);
     expect(
-        resolver.restoreAbsolute(NonExistingSource(source.fullName,
-            Uri.parse('package:test/test.dart'), UriKind.PACKAGE_URI)),
+        resolver.restoreAbsolute(NonExistingSource(
+            source.fullName, Uri.parse('package:test/test.dart'))),
         uri);
   }
 
@@ -207,13 +216,15 @@
   Source _assertResolveUri(Uri uri, String posixPath,
       {bool exists = true, bool restore = true}) {
     var source = resolver.resolveAbsolute(uri)!;
-    expect(source.fullName, convertPath(posixPath));
+    var path = source.fullName;
+    expect(path, convertPath(posixPath));
     expect(source.uri, uri);
     expect(source.exists(), exists);
     // If enabled, test also "restoreAbsolute".
     if (restore) {
-      var restoredUri = resolver.restoreAbsolute(source);
-      expect(restoredUri.toString(), uri.toString());
+      expect(resolver.pathToUri(path), uri);
+      // ignore: deprecated_member_use_from_same_package
+      expect(resolver.restoreAbsolute(source), uri);
     }
     return source;
   }
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index d00d0d5..8f8c3aa 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -1323,7 +1323,7 @@
 ### body_might_complete_normally
 
 _The body might complete normally, causing 'null' to be returned, but the return
-type is a potentially non-nullable type._
+type, '{0}', is a potentially non-nullable type._
 
 #### Description
 
@@ -1384,13 +1384,15 @@
 }
 {% endprettify %}
 
-If the method intentionally returns `null` at the end, then change the
+If the method intentionally returns `null` at the end, then add an
+explicit return of `null` at the end of the method and change the
 return type so that it's valid to return `null`:
 
 {% prettify dart tag=pre+code %}
 class C<T> {
   T? m(T t) {
     print(t);
+    return null;
   }
 }
 {% endprettify %}
@@ -6518,7 +6520,7 @@
 #### Description
 
 The analyzer produces this diagnostic when a package under either
-`dependencies` or `dev_dependencies` is not a pub, `git`, or `path` based
+`dependencies` or `dev_dependencies` isn't a pub, `git`, or `path` based
 dependency.
 
 See [Package dependencies](https://dart.dev/tools/pub/dependencies) for
@@ -6527,7 +6529,7 @@
 #### Example
 
 The following code produces this diagnostic because the dependency on the
-package `transmogrify` is not a pub, `git`, or `path` based dependency:
+package `transmogrify` isn't a pub, `git`, or `path` based dependency:
 
 ```yaml
 name: example
@@ -6968,7 +6970,7 @@
 `isEven` if `s` is `null`. In other words, if `s` is `null`, then neither
 `length` nor `isEven` will be invoked, and if `s` is non-`null`, then
 `length` can't return a `null` value. Either way, `isEven` can't be invoked
-on a `null` value, so the null-aware operator is not necessary. See
+on a `null` value, so the null-aware operator isn't necessary. See
 [Understanding null safety](/null-safety/understanding-null-safety#smarter-null-aware-methods)
 for more details.
 
@@ -7152,46 +7154,6 @@
 }
 {% endprettify %}
 
-### invalid_super_invocation
-
-_The superclass call must be last in an initializer list: '{0}'._
-
-#### Description
-
-The analyzer produces this diagnostic when the initializer list of a
-constructor contains an invocation of a constructor in the superclass, but
-the invocation isn't the last item in the initializer list.
-
-#### Example
-
-The following code produces this diagnostic because the invocation of the
-superclass' constructor isn't the last item in the initializer list:
-
-{% prettify dart tag=pre+code %}
-class A {
-  A(int x);
-}
-
-class B extends A {
-  B(int x) : [!super!](x), assert(x >= 0);
-}
-{% endprettify %}
-
-#### Common fixes
-
-Move the invocation of the superclass' constructor to the end of the
-initializer list:
-
-{% prettify dart tag=pre+code %}
-class A {
-  A(int x);
-}
-
-class B extends A {
-  B(int x) : assert(x >= 0), super(x);
-}
-{% endprettify %}
-
 ### invalid_type_argument_in_const_literal
 
 _Constant list literals can't include a type parameter as a type argument, such
@@ -12846,6 +12808,48 @@
 class C extends Object {}
 {% endprettify %}
 
+### super_invocation_not_last
+
+<a id="invalid_super_invocation" aria-hidden="true"></a>_(Previously known as `invalid_super_invocation`)_
+
+_The superconstructor call must be last in an initializer list: '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when the initializer list of a
+constructor contains an invocation of a constructor in the superclass, but
+the invocation isn't the last item in the initializer list.
+
+#### Example
+
+The following code produces this diagnostic because the invocation of the
+superclass' constructor isn't the last item in the initializer list:
+
+{% prettify dart tag=pre+code %}
+class A {
+  A(int x);
+}
+
+class B extends A {
+  B(int x) : [!super!](x), assert(x >= 0);
+}
+{% endprettify %}
+
+#### Common fixes
+
+Move the invocation of the superclass' constructor to the end of the
+initializer list:
+
+{% prettify dart tag=pre+code %}
+class A {
+  A(int x);
+}
+
+class B extends A {
+  B(int x) : assert(x >= 0), super(x);
+}
+{% endprettify %}
+
 ### super_in_extension
 
 _The 'super' keyword can't be used in an extension because an extension doesn't
@@ -14405,7 +14409,7 @@
 
 ### undefined_referenced_parameter
 
-_The parameter '{0}' is not defined by '{1}'._
+_The parameter '{0}' isn't defined by '{1}'._
 
 #### Description
 
@@ -14511,6 +14515,8 @@
 
 ### undefined_super_member
 
+<a id="undefined_super_method" aria-hidden="true"></a>_(Previously known as `undefined_super_method`)_
+
 _The getter '{0}' isn't defined in a superclass of '{1}'._
 
 _The method '{0}' isn't defined in a superclass of '{1}'._
@@ -15829,14 +15835,17 @@
 
 ### yield_of_invalid_type
 
-_The type '{0}' implied by the 'yield' expression must be assignable to '{1}'._
+_A yielded value of type '{0}' must be assignable to '{1}'._
+
+_The type '{0}' implied by the 'yield*' expression must be assignable to '{1}'._
 
 #### Description
 
-The analyzer produces this diagnostic when the type of object produced by a
-`yield` expression doesn't match the type of objects that are to be
-returned from the `Iterable` or `Stream` types that are returned from a
-generator (a function or method marked with either `sync*` or `async*`).
+The analyzer produces this diagnostic when the type of object produced by
+a `yield` or `yield*` expression doesn't match the type of objects that
+are to be returned from the `Iterable` or `Stream` types that are returned
+from a generator (a function or method marked with either `sync*` or
+`async*`).
 
 #### Example
 
@@ -15869,7 +15878,3 @@
   yield '0';
 }
 {% endprettify %}
-
-### undefined_super_method
-
-See [undefined_super_member](#undefined_super_member).
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index c726a25..9f58663 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -39,6 +39,9 @@
   /// The messages associated with the diagnostic.
   List<String> messages;
 
+  /// The previous names by which this diagnostic has been known.
+  List<String> previousNames = [];
+
   /// The documentation text associated with the diagnostic.
   String? documentation;
 
@@ -56,10 +59,22 @@
     }
   }
 
+  void addPreviousName(String previousName) {
+    if (!previousNames.contains(previousName)) {
+      previousNames.add(previousName);
+    }
+  }
+
   /// Return the full documentation for this diagnostic.
   void writeOn(StringSink sink) {
     messages.sort();
     sink.writeln('### ${name.toLowerCase()}');
+    for (var previousName in previousNames) {
+      sink.writeln();
+      var previousInLowerCase = previousName.toLowerCase();
+      sink.writeln('<a id="$previousInLowerCase" aria-hidden="true"></a>'
+          '_(Previously known as `$previousInLowerCase`)_');
+    }
     for (String message in messages) {
       sink.writeln();
       for (String line in _split('_${_escape(message)}_')) {
@@ -120,7 +135,6 @@
     _writeHeader(sink);
     _writeGlossary(sink);
     _writeDiagnostics(sink);
-    _writeForwards(sink);
   }
 
   /// Extract documentation from all of the files containing the definitions of
@@ -140,6 +154,10 @@
       } else {
         info.addMessage(message);
       }
+      var previousName = errorCodeInfo.previousName;
+      if (previousName != null) {
+        info.addPreviousName(previousName);
+      }
       var docs = _extractDoc('$className.$errorName', errorCodeInfo);
       if (docs.isNotEmpty) {
         if (info.documentation != null) {
@@ -185,17 +203,6 @@
     }
   }
 
-  /// Write the forwarding documentation for all of the diagnostics that have
-  /// been renamed.
-  void _writeForwards(StringSink sink) {
-    sink.write('''
-
-### undefined_super_method
-
-See [undefined_super_member](#undefined_super_member).
-''');
-  }
-
   /// Write the glossary.
   void _writeGlossary(StringSink sink) {
     sink.write(r'''
diff --git a/pkg/analyzer/tool/messages/error_code_info.dart b/pkg/analyzer/tool/messages/error_code_info.dart
index 907a564..038257d 100644
--- a/pkg/analyzer/tool/messages/error_code_info.dart
+++ b/pkg/analyzer/tool/messages/error_code_info.dart
@@ -76,7 +76,7 @@
 ];
 
 /// Decoded messages from the analyzer's `messages.yaml` file.
-final Map<String, Map<String, ErrorCodeInfo>> analyzerMessages =
+final Map<String, Map<String, AnalyzerErrorCodeInfo>> analyzerMessages =
     _loadAnalyzerMessages();
 
 /// The path to the `analyzer` package.
@@ -88,7 +88,8 @@
     CfeToAnalyzerErrorCodeTables._(frontEndMessages);
 
 /// Decoded messages from the front end's `messages.yaml` file.
-final Map<String, ErrorCodeInfo> frontEndMessages = _loadFrontEndMessages();
+final Map<String, FrontEndErrorCodeInfo> frontEndMessages =
+    _loadFrontEndMessages();
 
 /// The path to the `front_end` package.
 final String frontEndPkgPath =
@@ -110,13 +111,13 @@
 /// Decodes a YAML object (obtained from `pkg/analyzer/messages.yaml`) into a
 /// two-level map of [ErrorCodeInfo], indexed first by class name and then by
 /// error name.
-Map<String, Map<String, ErrorCodeInfo>> decodeAnalyzerMessagesYaml(
+Map<String, Map<String, AnalyzerErrorCodeInfo>> decodeAnalyzerMessagesYaml(
     Object? yaml) {
   Never problem(String message) {
     throw 'Problem in pkg/analyzer/messages.yaml: $message';
   }
 
-  var result = <String, Map<String, ErrorCodeInfo>>{};
+  var result = <String, Map<String, AnalyzerErrorCodeInfo>>{};
   if (yaml is! Map<Object?, Object?>) {
     problem('root node is not a map');
   }
@@ -142,7 +143,7 @@
       }
       try {
         (result[className] ??= {})[errorName] =
-            ErrorCodeInfo.fromYaml(errorValue);
+            AnalyzerErrorCodeInfo.fromYaml(errorValue);
       } catch (e) {
         problem('while processing '
             '$className.$errorName, $e');
@@ -154,12 +155,12 @@
 
 /// Decodes a YAML object (obtained from `pkg/front_end/messages.yaml`) into a
 /// map from error name to [ErrorCodeInfo].
-Map<String, ErrorCodeInfo> decodeCfeMessagesYaml(Object? yaml) {
+Map<String, FrontEndErrorCodeInfo> decodeCfeMessagesYaml(Object? yaml) {
   Never problem(String message) {
     throw 'Problem in pkg/front_end/messages.yaml: $message';
   }
 
-  var result = <String, ErrorCodeInfo>{};
+  var result = <String, FrontEndErrorCodeInfo>{};
   if (yaml is! Map<Object?, Object?>) {
     problem('root node is not a map');
   }
@@ -172,25 +173,89 @@
     if (errorValue is! Map<Object?, Object?>) {
       problem('value associated with error $errorName is not a map');
     }
-    result[errorName] = ErrorCodeInfo.fromYaml(errorValue);
+    result[errorName] = FrontEndErrorCodeInfo.fromYaml(errorValue);
   }
   return result;
 }
 
 /// Loads analyzer messages from the analyzer's `messages.yaml` file.
-Map<String, Map<String, ErrorCodeInfo>> _loadAnalyzerMessages() {
+Map<String, Map<String, AnalyzerErrorCodeInfo>> _loadAnalyzerMessages() {
   Object? messagesYaml =
       loadYaml(File(join(analyzerPkgPath, 'messages.yaml')).readAsStringSync());
   return decodeAnalyzerMessagesYaml(messagesYaml);
 }
 
 /// Loads front end messages from the front end's `messages.yaml` file.
-Map<String, ErrorCodeInfo> _loadFrontEndMessages() {
+Map<String, FrontEndErrorCodeInfo> _loadFrontEndMessages() {
   Object? messagesYaml =
       loadYaml(File(join(frontEndPkgPath, 'messages.yaml')).readAsStringSync());
   return decodeCfeMessagesYaml(messagesYaml);
 }
 
+/// Splits [text] on spaces using the given [maxWidth] (and [firstLineWidth] if
+/// given).
+List<String> _splitText(
+  String text, {
+  required int maxWidth,
+  int? firstLineWidth,
+}) {
+  firstLineWidth ??= maxWidth;
+  var lines = <String>[];
+  // The character width to use as a maximum width. This starts as
+  // [firstLineWidth] but becomes [maxWidth] on every iteration after the first.
+  var width = firstLineWidth;
+  var lineMaxEndIndex = width;
+  var lineStartIndex = 0;
+
+  while (true) {
+    if (lineMaxEndIndex >= text.length) {
+      lines.add(text.substring(lineStartIndex, text.length));
+      break;
+    } else {
+      var lastSpaceIndex = text.lastIndexOf(' ', lineMaxEndIndex);
+      if (lastSpaceIndex == -1 || lastSpaceIndex <= lineStartIndex) {
+        // No space between [lineStartIndex] and [lineMaxEndIndex]. Get the
+        // _next_ space.
+        lastSpaceIndex = text.indexOf(' ', lineMaxEndIndex);
+        if (lastSpaceIndex == -1) {
+          // No space at all after [lineStartIndex].
+          lines.add(text.substring(lineStartIndex));
+          break;
+        }
+      }
+      lines.add(text.substring(lineStartIndex, lastSpaceIndex + 1));
+      lineStartIndex = lastSpaceIndex + 1;
+      width = maxWidth;
+    }
+    lineMaxEndIndex = lineStartIndex + maxWidth;
+  }
+  return lines;
+}
+
+/// In-memory representation of error code information obtained from the
+/// analyzer's `messages.yaml` file.
+class AnalyzerErrorCodeInfo extends ErrorCodeInfo {
+  AnalyzerErrorCodeInfo(
+      {String? comment,
+      String? correctionMessage,
+      String? documentation,
+      bool hasPublishedDocs = false,
+      bool isUnresolvedIdentifier = false,
+      required String problemMessage,
+      String? sharedName})
+      : super(
+            comment: comment,
+            correctionMessage: correctionMessage,
+            documentation: documentation,
+            hasPublishedDocs: hasPublishedDocs,
+            isUnresolvedIdentifier: isUnresolvedIdentifier,
+            problemMessage: problemMessage,
+            sharedName: sharedName);
+
+  AnalyzerErrorCodeInfo.fromYaml(Map<Object?, Object?> yaml)
+      : super.fromYaml(yaml);
+}
+
 /// Data tables mapping between CFE errors and their corresponding automatically
 /// generated analyzer errors.
 class CfeToAnalyzerErrorCodeTables {
@@ -218,7 +283,7 @@
   /// automatically generated, and whose values are the front end error name.
   final Map<ErrorCodeInfo, String> infoToFrontEndCode = {};
 
-  CfeToAnalyzerErrorCodeTables._(Map<String, ErrorCodeInfo> messages) {
+  CfeToAnalyzerErrorCodeTables._(Map<String, FrontEndErrorCodeInfo> messages) {
     for (var entry in messages.entries) {
       var errorCodeInfo = entry.value;
       var index = errorCodeInfo.index;
@@ -322,14 +387,10 @@
   String get typeCode => 'ErrorType.$type';
 }
 
-/// In-memory representation of error code information obtained from either a
-/// `messages.yaml` file.  Supports both the analyzer and front_end message file
-/// formats.
-class ErrorCodeInfo {
-  /// For error code information obtained from the CFE, the set of analyzer
-  /// error codes that corresponds to this error code, if any.
-  final List<String> analyzerCode;
-
+/// In-memory representation of error code information obtained from either the
+/// analyzer or the front end's `messages.yaml` file.  This class contains the
+/// common functionality supported by both formats.
+abstract class ErrorCodeInfo {
   /// If present, a documentation comment that should be associated with the
   /// error in code generated output.
   final String? comment;
@@ -345,10 +406,6 @@
   /// been published.
   final bool hasPublishedDocs;
 
-  /// For error code information obtained from the CFE, the index of the error
-  /// in the analyzer's `fastaAnalyzerErrorCodes` table.
-  final int? index;
-
   /// Indicates whether this error is caused by an unresolved identifier.
   final bool isUnresolvedIdentifier;
 
@@ -360,30 +417,32 @@
   /// codes.
   final String? sharedName;
 
+  /// If present, indicates that this error code has been renamed from
+  /// [previousName] to its current name (or [sharedName]).
+  final String? previousName;
+
   ErrorCodeInfo(
-      {this.analyzerCode = const [],
-      this.comment,
+      {this.comment,
       this.documentation,
       this.hasPublishedDocs = false,
-      this.index,
       this.isUnresolvedIdentifier = false,
       this.sharedName,
       required this.problemMessage,
-      this.correctionMessage});
+      this.correctionMessage,
+      this.previousName});
 
   /// Decodes an [ErrorCodeInfo] object from its YAML representation.
   ErrorCodeInfo.fromYaml(Map<Object?, Object?> yaml)
       : this(
-            analyzerCode: _decodeAnalyzerCode(yaml['analyzerCode']),
             comment: yaml['comment'] as String?,
             correctionMessage: yaml['correctionMessage'] as String?,
             documentation: yaml['documentation'] as String?,
             hasPublishedDocs: yaml['hasPublishedDocs'] as bool? ?? false,
-            index: yaml['index'] as int?,
             isUnresolvedIdentifier:
                 yaml['isUnresolvedIdentifier'] as bool? ?? false,
             problemMessage: yaml['problemMessage'] as String,
-            sharedName: yaml['sharedName'] as String?);
+            sharedName: yaml['sharedName'] as String?,
+            previousName: yaml['previousName'] as String?);
 
   /// Given a messages.yaml entry, come up with a mapping from placeholder
   /// patterns in its message strings to their corresponding indices.
@@ -412,16 +471,21 @@
     var out = StringBuffer();
     out.writeln('$className(');
     out.writeln("'${sharedName ?? errorCode}',");
+    var maxWidth = 80 - 8 /* indentation */ - 2 /* quotes */ - 1 /* comma */;
     final placeholderToIndexMap = computePlaceholderToIndexMap();
-    out.writeln(
-        json.encode(convertTemplate(placeholderToIndexMap, problemMessage)) +
-            ',');
+    var messageAsCode = convertTemplate(placeholderToIndexMap, problemMessage);
+    out.writeln(_splitText(messageAsCode,
+                maxWidth: maxWidth, firstLineWidth: maxWidth + 4)
+            .map(json.encode)
+            .join('\n') +
+        ',');
     final correctionMessage = this.correctionMessage;
     if (correctionMessage is String) {
       out.write('correctionMessage: ');
-      out.writeln(json.encode(
-              convertTemplate(placeholderToIndexMap, correctionMessage)) +
-          ',');
+      var code = convertTemplate(placeholderToIndexMap, correctionMessage);
+      out.writeln(
+          _splitText(code, maxWidth: maxWidth).map(json.encode).join('\n') +
+              ',');
     }
     if (hasPublishedDocs) {
       out.writeln('hasPublishedDocs:true,');
@@ -459,8 +523,6 @@
   /// Encodes this object into a YAML representation.
   Map<Object?, Object?> toYaml() => {
         if (sharedName != null) 'sharedName': sharedName,
-        if (analyzerCode.isNotEmpty)
-          'analyzerCode': _encodeAnalyzerCode(analyzerCode),
         'problemMessage': problemMessage,
         if (correctionMessage != null) 'correctionMessage': correctionMessage,
         if (isUnresolvedIdentifier) 'isUnresolvedIdentifier': true,
@@ -468,6 +530,30 @@
         if (comment != null) 'comment': comment,
         if (documentation != null) 'documentation': documentation,
       };
+}
+
+/// In-memory representation of error code information obtained from the front
+/// end's `messages.yaml` file.
+class FrontEndErrorCodeInfo extends ErrorCodeInfo {
+  /// The set of analyzer error codes that corresponds to this error code, if
+  /// any.
+  final List<String> analyzerCode;
+
+  /// The index of the error in the analyzer's `fastaAnalyzerErrorCodes` table.
+  final int? index;
+
+  FrontEndErrorCodeInfo.fromYaml(Map<Object?, Object?> yaml)
+      : analyzerCode = _decodeAnalyzerCode(yaml['analyzerCode']),
+        index = yaml['index'] as int?,
+        super.fromYaml(yaml);
+
+  @override
+  Map<Object?, Object?> toYaml() => {
+        if (analyzerCode.isNotEmpty)
+          'analyzerCode': _encodeAnalyzerCode(analyzerCode),
+        if (index != null) 'index': index,
+        ...super.toYaml(),
+      };
 
   static List<String> _decodeAnalyzerCode(Object? value) {
     if (value == null) {
diff --git a/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart b/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
index 75b6f60..d26eab1 100644
--- a/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
+++ b/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
@@ -221,7 +221,7 @@
       var commentInfo = _extractCommentInfo(fieldDeclaration);
       var documentationComment = commentInfo.documentationComment;
       var otherComment = commentInfo.otherComment;
-      yamlCodes[uniqueNameSuffix] = ErrorCodeInfo(
+      yamlCodes[uniqueNameSuffix] = AnalyzerErrorCodeInfo(
               sharedName: uniqueNameSuffix == name ? null : name,
               problemMessage: code.problemMessage,
               correctionMessage: code.correctionMessage,
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 928fbf4..2e58862 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -285,16 +285,14 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endConstructorReference(Token start, Token? periodBeforeName,
+      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
+    debugEvent("ConstructorReference");
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     debugEvent("Enum");
-    var constants =
-        List<EnumConstantDeclaration?>.filled(count, null, growable: true);
-    popList(count, constants);
-    var name = pop() as String;
-    var metadata = popTypedList<Annotation>();
-    var comment = pop() as Comment?;
-    compilationUnit.declarations.add(EnumDeclaration(
-        comment, metadata, name, constants.whereNotNull().toList()));
   }
 
   @override
@@ -306,7 +304,8 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
@@ -421,6 +420,37 @@
   }
 
   @override
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElement");
+    pop(); // Arguments.
+    pop(); // Type arguments.
+  }
+
+  @override
+  void handleEnumElements(Token endToken, int count) {
+    debugEvent("EnumElements");
+    var constants =
+        List<EnumConstantDeclaration?>.filled(count, null, growable: true);
+    popList(count, constants);
+    pop(); // Type variables.
+    var name = pop() as String;
+    var metadata = popTypedList<Annotation>();
+    var comment = pop() as Comment?;
+    compilationUnit.declarations.add(EnumDeclaration(
+        comment, metadata, name, constants.whereNotNull().toList()));
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("NoEnumWithClause");
+  }
+
+  @override
   void handleFormalParameterWithoutValue(Token token) {
     debugEvent("FormalParameterWithoutValue");
   }
@@ -539,6 +569,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+  }
+
+  @override
   void handleQualified(Token period) {
     debugEvent("Qualified");
     var suffix = pop() as String;
diff --git a/pkg/analyzer_cli/analysis_options.yaml b/pkg/analyzer_cli/analysis_options.yaml
index 069c2d2..8d202f9 100644
--- a/pkg/analyzer_cli/analysis_options.yaml
+++ b/pkg/analyzer_cli/analysis_options.yaml
@@ -1,9 +1,8 @@
 include: package:lints/recommended.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
   language:
+    strict-casts: true
     strict-inference: true
   exclude:
     - test/data/**
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 4b3846b..19caf6d 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -11,8 +11,6 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer_cli/src/driver.dart';
 import 'package:analyzer_cli/src/error_formatter.dart';
 import 'package:analyzer_cli/src/error_severity.dart';
@@ -46,25 +44,22 @@
   /// specified on the command line as though it is reached via a "package:"
   /// URI, but avoid suppressing its output in the event that the user has not
   /// specified the "--package-warnings" option.
-  String _selfPackageName;
+  String? _selfPackageName;
 
   AnalyzerImpl(this.analysisOptions, this.analysisDriver, this.libraryFile,
       this.options, this.stats, this.startTime);
 
   void addCompilationUnitSource(
       CompilationUnitElement unit, Set<CompilationUnitElement> units) {
-    if (unit == null || !units.add(unit)) {
+    if (!units.add(unit)) {
       return;
     }
-    var source = unit.source;
-    if (source != null) {
-      files.add(source.fullName);
-    }
+    files.add(unit.source.fullName);
   }
 
   void addLibrarySources(LibraryElement library, Set<LibraryElement> libraries,
       Set<CompilationUnitElement> units) {
-    if (library == null || !libraries.add(library)) {
+    if (!libraries.add(library)) {
       return;
     }
     // Maybe skip library.
@@ -104,7 +99,7 @@
         if (_defaultSeverityProcessor(error) == null) {
           continue;
         }
-        status = status.max(computeSeverity(error, options, analysisOptions));
+        status = status.max(computeSeverity(error, options, analysisOptions)!);
       }
     }
     return status;
@@ -162,22 +157,21 @@
     return computeMaxErrorSeverity();
   }
 
-  ErrorSeverity _defaultSeverityProcessor(AnalysisError error) =>
+  ErrorSeverity? _defaultSeverityProcessor(AnalysisError error) =>
       determineProcessedSeverity(error, options, analysisOptions);
 
   /// Returns true if we want to report diagnostics for this library.
   bool _isAnalyzedLibrary(LibraryElement library) {
     var source = library.source;
-    switch (source.uriKind) {
-      case UriKind.DART_URI:
-        return options.showSdkWarnings;
-      case UriKind.PACKAGE_URI:
-        if (_isPathInPubCache(source.fullName)) {
-          return false;
-        }
-        return _isAnalyzedPackage(source.uri);
-      default:
-        return true;
+    if (source.uri.isScheme('dart')) {
+      return options.showSdkWarnings;
+    } else if (source.uri.isScheme('package')) {
+      if (_isPathInPubCache(source.fullName)) {
+        return false;
+      }
+      return _isAnalyzedPackage(source.uri);
+    } else {
+      return true;
     }
   }
 
@@ -194,7 +188,7 @@
     } else if (options.showPackageWarningsPrefix == null) {
       return true;
     } else {
-      return packageName.startsWith(options.showPackageWarningsPrefix);
+      return packageName.startsWith(options.showPackageWarningsPrefix!);
     }
   }
 
@@ -238,14 +232,14 @@
 
   @override
   void logException(dynamic exception,
-      [StackTrace stackTrace,
-      List<InstrumentationServiceAttachment> attachments = const []]) {
+      [StackTrace? stackTrace,
+      List<InstrumentationServiceAttachment>? attachments = const []]) {
     errorSink.writeln(exception);
     errorSink.writeln(stackTrace);
   }
 
   @override
-  void logInfo(String message, [Object exception]) {
+  void logInfo(String message, [Object? exception]) {
     outSink.writeln(message);
     if (exception != null) {
       outSink.writeln(exception);
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 28e3590..de1d3c0 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -17,8 +17,6 @@
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/interner.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/pub.dart';
@@ -41,10 +39,10 @@
 import 'package:yaml/yaml.dart';
 
 /// Shared IO sink for standard error reporting.
-StringSink errorSink = io.stderr;
+late StringSink errorSink = io.stderr;
 
 /// Shared IO sink for standard out reporting.
-StringSink outSink = io.stdout;
+late StringSink outSink = io.stdout;
 
 /// Test this option map to see if it specifies lint rules.
 bool containsLintRuleEntry(YamlMap options) {
@@ -55,13 +53,14 @@
 class Driver implements CommandLineStarter {
   static final ByteStore analysisDriverMemoryByteStore = MemoryByteStore();
 
-  _AnalysisContextProvider _analysisContextProvider;
-  DriverBasedAnalysisContext analysisContext;
+  bool _isStarted = false;
 
-  /// The driver that was most recently created by a call to [_analyzeAll], or
-  /// `null` if [_analyzeAll] hasn't been called yet.
+  late _AnalysisContextProvider _analysisContextProvider;
+  DriverBasedAnalysisContext? analysisContext;
+
+  /// The driver that was most recently created by a call to [_analyzeAll].
   @visibleForTesting
-  AnalysisDriver analysisDriver;
+  AnalysisDriver? analysisDriver;
 
   /// The total number of source files loaded by an AnalysisContext.
   int _analyzedFileCount = 0;
@@ -73,7 +72,7 @@
   final AnalysisStats stats = AnalysisStats();
 
   /// The [PathFilter] for excluded files with wildcards, etc.
-  PathFilter pathFilter;
+  late PathFilter pathFilter;
 
   /// Create a new Driver instance.
   Driver({@Deprecated('This parameter has no effect') bool isTesting = false});
@@ -88,17 +87,16 @@
 
   @override
   Future<void> start(List<String> arguments) async {
-    if (analysisDriver != null) {
+    if (_isStarted) {
       throw StateError('start() can only be called once');
     }
+    _isStarted = true;
     var startTime = DateTime.now().millisecondsSinceEpoch;
 
-    StringUtilities.INTERNER = MappedInterner();
-
     linter.registerLintRules();
 
     // Parse commandline options.
-    var options = CommandLineOptions.parse(resourceProvider, arguments);
+    var options = CommandLineOptions.parse(resourceProvider, arguments)!;
 
     _analysisContextProvider = _AnalysisContextProvider(resourceProvider);
 
@@ -106,7 +104,7 @@
     if (options.batchMode) {
       var batchRunner = BatchRunner(outSink, errorSink);
       batchRunner.runAsBatch(arguments, (List<String> args) async {
-        var options = CommandLineOptions.parse(resourceProvider, args);
+        var options = CommandLineOptions.parse(resourceProvider, args)!;
         return await _analyzeAll(options);
       });
     } else {
@@ -129,7 +127,7 @@
       for (var i = 0; i < 3; i++) {
         buildSdkSummary(
           resourceProvider: PhysicalResourceProvider.INSTANCE,
-          sdkPath: options.dartSdkPath,
+          sdkPath: options.dartSdkPath!,
         );
       }
 
@@ -137,13 +135,13 @@
     }
 
     if (analysisDriver != null) {
-      _analyzedFileCount += analysisDriver.knownFiles.length;
+      _analyzedFileCount += analysisDriver!.knownFiles.length;
     }
 
     if (options.perfReport != null) {
       var json = makePerfReport(
           startTime, currentTimeMillis, options, _analyzedFileCount, stats);
-      io.File(options.perfReport).writeAsStringSync(json);
+      io.File(options.perfReport!).writeAsStringSync(json);
     }
   }
 
@@ -175,7 +173,7 @@
     SeverityProcessor defaultSeverityProcessor;
     defaultSeverityProcessor = (AnalysisError error) {
       return determineProcessedSeverity(
-          error, options, analysisDriver.analysisOptions);
+          error, options, analysisDriver!.analysisOptions);
     };
 
     // We currently print out to stderr to ensure that when in batch mode we
@@ -213,7 +211,8 @@
     for (var sourcePath in pathList) {
       _analysisContextProvider.configureForPath(sourcePath);
       analysisContext = _analysisContextProvider.analysisContext;
-      analysisDriver = _analysisContextProvider.analysisDriver;
+      final analysisDriver =
+          this.analysisDriver = _analysisContextProvider.analysisDriver;
       pathFilter = _analysisContextProvider.pathFilter;
 
       // Add all the files to be analyzed en masse to the context. Skip any
@@ -250,8 +249,8 @@
             analysisDriver.currentSession.analysisContext.contextRoot.root.path,
           );
           formatter.formatErrors([
-            ErrorsResultImpl(analysisDriver.currentSession, path, null,
-                lineInfo, false, errors)
+            ErrorsResultImpl(analysisDriver.currentSession, path,
+                pathContext.toUri(path), lineInfo, false, errors)
           ]);
           for (var error in errors) {
             var severity = determineProcessedSeverity(
@@ -272,7 +271,7 @@
               errors.addAll(validator.validate(node.nodes));
             }
 
-            if (analysisDriver != null && analysisDriver.analysisOptions.lint) {
+            if (analysisDriver.analysisOptions.lint) {
               var visitors = <LintRule, PubspecVisitor>{};
               for (var linter in analysisDriver.analysisOptions.lintRules) {
                 if (linter is LintRule) {
@@ -301,13 +300,13 @@
             if (errors.isNotEmpty) {
               for (var error in errors) {
                 var severity = determineProcessedSeverity(
-                    error, options, analysisDriver.analysisOptions);
+                    error, options, analysisDriver.analysisOptions)!;
                 allResult = allResult.max(severity);
               }
               var lineInfo = LineInfo.fromContent(content);
               formatter.formatErrors([
-                ErrorsResultImpl(analysisDriver.currentSession, path, null,
-                    lineInfo, false, errors)
+                ErrorsResultImpl(analysisDriver.currentSession, path,
+                    pathContext.toUri(path), lineInfo, false, errors)
               ]);
             }
           } catch (exception) {
@@ -322,12 +321,12 @@
             var errors = validator.validate(
                 content, analysisDriver.analysisOptions.chromeOsManifestChecks);
             formatter.formatErrors([
-              ErrorsResultImpl(analysisDriver.currentSession, path, null,
-                  lineInfo, false, errors)
+              ErrorsResultImpl(analysisDriver.currentSession, path,
+                  pathContext.toUri(path), lineInfo, false, errors)
             ]);
             for (var error in errors) {
               var severity = determineProcessedSeverity(
-                  error, options, analysisDriver.analysisOptions);
+                  error, options, analysisDriver.analysisOptions)!;
               allResult = allResult.max(severity);
             }
           } catch (exception) {
@@ -360,7 +359,7 @@
     // The next batch should not be affected by a previous batch.
     // E.g. the same parts in both batches, but with different libraries.
     for (var path in dartFiles) {
-      analysisDriver.removeFile(path);
+      analysisDriver!.removeFile(path);
     }
 
     // Any dangling parts still in this list were definitely dangling.
@@ -412,6 +411,7 @@
   Future<ErrorSeverity> _runAnalyzer(
       FileState file, CommandLineOptions options, ErrorFormatter formatter) {
     var startTime = currentTimeMillis;
+    final analysisDriver = this.analysisDriver!;
     var analyzer = AnalyzerImpl(analysisDriver.analysisOptions, analysisDriver,
         file, options, stats, startTime);
     return analyzer.analyze(formatter);
@@ -446,9 +446,8 @@
 
   /// Return whether the [newOptions] are equal to the [previous].
   static bool _equalCommandLineOptions(
-      CommandLineOptions previous, CommandLineOptions newOptions) {
+      CommandLineOptions? previous, CommandLineOptions newOptions) {
     return previous != null &&
-        newOptions != null &&
         newOptions.defaultPackagesPath == previous.defaultPackagesPath &&
         _equalMaps(newOptions.declaredVariables, previous.declaredVariables) &&
         newOptions.log == previous.log &&
@@ -460,7 +459,8 @@
         newOptions.lints == previous.lints &&
         newOptions.defaultLanguageVersion == previous.defaultLanguageVersion &&
         newOptions.disableCacheFlushing == previous.disableCacheFlushing &&
-        _equalLists(newOptions.enabledExperiments, previous.enabledExperiments);
+        _equalLists(
+            newOptions.enabledExperiments!, previous.enabledExperiments!);
   }
 
   /// Perform a deep comparison of two string lists.
@@ -494,27 +494,27 @@
   final ResourceProvider _resourceProvider;
   final FileContentCache _fileContentCache;
 
-  CommandLineOptions _commandLineOptions;
-  List<String> _pathList;
+  CommandLineOptions? _commandLineOptions;
+  late List<String> _pathList;
 
-  final Map<Folder, DriverBasedAnalysisContext> _folderContexts = {};
-  AnalysisContextCollectionImpl _collection;
-  DriverBasedAnalysisContext _analysisContext;
+  final Map<Folder, DriverBasedAnalysisContext?> _folderContexts = {};
+  AnalysisContextCollectionImpl? _collection;
+  DriverBasedAnalysisContext? _analysisContext;
 
   _AnalysisContextProvider(this._resourceProvider)
       : _fileContentCache = FileContentCache(_resourceProvider);
 
-  DriverBasedAnalysisContext get analysisContext {
+  DriverBasedAnalysisContext? get analysisContext {
     return _analysisContext;
   }
 
   AnalysisDriver get analysisDriver {
-    return _analysisContext.driver;
+    return _analysisContext!.driver;
   }
 
   /// TODO(scheglov) Use analyzedFiles()
   PathFilter get pathFilter {
-    var contextRoot = analysisContext.contextRoot;
+    var contextRoot = analysisContext!.contextRoot;
     var optionsFile = contextRoot.optionsFile;
 
     // If there is no options file, there can be no excludes.
@@ -524,7 +524,7 @@
 
     // Exclude patterns are relative to the directory with the options file.
     return PathFilter(contextRoot.root.path, optionsFile.parent2.path,
-        analysisContext.analysisOptions.excludePatterns);
+        analysisContext!.analysisOptions.excludePatterns);
   }
 
   void configureForPath(String path) {
@@ -554,10 +554,10 @@
     _collection = AnalysisContextCollectionImpl(
       byteStore: Driver.analysisDriverMemoryByteStore,
       includedPaths: _pathList,
-      optionsFile: _commandLineOptions.defaultAnalysisOptionsPath,
-      packagesFile: _commandLineOptions.defaultPackagesPath,
+      optionsFile: _commandLineOptions!.defaultAnalysisOptionsPath,
+      packagesFile: _commandLineOptions!.defaultPackagesPath,
       resourceProvider: _resourceProvider,
-      sdkPath: _commandLineOptions.dartSdkPath,
+      sdkPath: _commandLineOptions!.dartSdkPath,
       updateAnalysisOptions: _updateAnalysisOptions,
       fileContentCache: _fileContentCache,
     );
@@ -580,10 +580,10 @@
   }
 
   void _setContextForPath(String path) {
-    _analysisContext = _collection.contextFor(path);
+    _analysisContext = _collection!.contextFor(path);
   }
 
   void _updateAnalysisOptions(AnalysisOptionsImpl analysisOptions) {
-    _commandLineOptions.updateAnalysisOptions(analysisOptions);
+    _commandLineOptions!.updateAnalysisOptions(analysisOptions);
   }
 }
diff --git a/pkg/analyzer_cli/lib/src/error_formatter.dart b/pkg/analyzer_cli/lib/src/error_formatter.dart
index f496762..51c7002 100644
--- a/pkg/analyzer_cli/lib/src/error_formatter.dart
+++ b/pkg/analyzer_cli/lib/src/error_formatter.dart
@@ -34,7 +34,7 @@
 
 /// Returns desired severity for the given [error] (or `null` if it's to be
 /// suppressed).
-typedef SeverityProcessor = ErrorSeverity Function(AnalysisError error);
+typedef SeverityProcessor = ErrorSeverity? Function(AnalysisError error);
 
 /// Analysis statistics counter.
 class AnalysisStats {
@@ -113,20 +113,20 @@
   final String message;
   final List<ContextMessage> contextMessages;
   final String errorCode;
-  final String correction;
-  final String url;
+  final String? correction;
+  final String? url;
 
   CLIError({
-    this.severity,
-    this.sourcePath,
-    this.offset,
-    this.line,
-    this.column,
-    this.message,
-    this.contextMessages,
-    this.errorCode,
-    this.correction,
-    this.url,
+    required this.severity,
+    required this.sourcePath,
+    required this.offset,
+    required this.line,
+    required this.column,
+    required this.message,
+    required this.contextMessages,
+    required this.errorCode,
+    required this.correction,
+    required this.url,
   });
 
   @override
@@ -150,7 +150,8 @@
   @override
   int compareTo(CLIError other) {
     // severity
-    var compare = _severityCompare[other.severity] - _severityCompare[severity];
+    var compare =
+        _severityCompare[other.severity]! - _severityCompare[severity]!;
     if (compare != 0) return compare;
 
     // path
@@ -179,12 +180,11 @@
   final StringSink out;
   final CommandLineOptions options;
   final AnalysisStats stats;
-  SeverityProcessor _severityProcessor;
+  final SeverityProcessor _severityProcessor;
 
   ErrorFormatter(this.out, this.options, this.stats,
-      {SeverityProcessor severityProcessor}) {
-    _severityProcessor = severityProcessor ?? _severityIdentity;
-  }
+      {SeverityProcessor? severityProcessor})
+      : _severityProcessor = severityProcessor ?? _severityIdentity;
 
   /// Call to write any batched up errors from [formatErrors].
   void flush();
@@ -213,22 +213,20 @@
 
   /// Compute the severity for this [error] or `null` if this error should be
   /// filtered.
-  ErrorSeverity _computeSeverity(AnalysisError error) =>
+  ErrorSeverity? _computeSeverity(AnalysisError error) =>
       _severityProcessor(error);
 }
 
 class HumanErrorFormatter extends ErrorFormatter {
-  AnsiLogger ansi;
+  late final AnsiLogger ansi = AnsiLogger(options.color);
 
   // This is a Set in order to de-dup CLI errors.
   final Set<CLIError> batchedErrors = {};
 
   HumanErrorFormatter(
       StringSink out, CommandLineOptions options, AnalysisStats stats,
-      {SeverityProcessor severityProcessor})
-      : super(out, options, stats, severityProcessor: severityProcessor) {
-    ansi = AnsiLogger(this.options.color);
-  }
+      {SeverityProcessor? severityProcessor})
+      : super(out, options, stats, severityProcessor: severityProcessor);
 
   @override
   void flush() {
@@ -281,10 +279,10 @@
   void formatError(
       Map<AnalysisError, ErrorsResult> errorToLine, AnalysisError error) {
     var source = error.source;
-    var result = errorToLine[error];
+    var result = errorToLine[error]!;
     var location = result.lineInfo.getLocation(error.offset);
 
-    var severity = _severityProcessor(error);
+    var severity = _severityProcessor(error)!;
 
     // Get display name; translate INFOs into LINTS and HINTS.
     var errorType = severity.displayName;
@@ -297,9 +295,9 @@
 
     // warning • 'foo' is not a bar. • lib/foo.dart:1:2 • foo_warning
     String sourcePath;
-    if (source.uriKind == UriKind.DART_URI) {
+    if (source.uri.isScheme('dart')) {
       sourcePath = source.uri.toString();
-    } else if (source.uriKind == UriKind.PACKAGE_URI) {
+    } else if (source.uri.isScheme('package')) {
       sourcePath = _relative(source.fullName);
       if (sourcePath == source.fullName) {
         // If we weren't able to shorten the path name, use the package: version.
@@ -314,7 +312,7 @@
       if (session is DriverBasedAnalysisContext) {
         var fileResult = session.driver.getFileSync(message.filePath);
         if (fileResult is FileResult) {
-          var lineInfo = fileResult?.lineInfo;
+          var lineInfo = fileResult.lineInfo;
           var location = lineInfo.getLocation(message.offset);
           contextMessages.add(ContextMessage(
               message.filePath,
@@ -343,7 +341,7 @@
 class JsonErrorFormatter extends ErrorFormatter {
   JsonErrorFormatter(
       StringSink out, CommandLineOptions options, AnalysisStats stats,
-      {SeverityProcessor severityProcessor})
+      {SeverityProcessor? severityProcessor})
       : super(out, options, stats, severityProcessor: severityProcessor);
 
   @override
@@ -430,7 +428,7 @@
 
   MachineErrorFormatter(
       StringSink out, CommandLineOptions options, AnalysisStats stats,
-      {SeverityProcessor severityProcessor})
+      {SeverityProcessor? severityProcessor})
       : super(out, options, stats, severityProcessor: severityProcessor);
 
   @override
@@ -444,7 +442,7 @@
       return;
     }
     var source = error.source;
-    var location = errorToLine[error].lineInfo.getLocation(error.offset);
+    var location = errorToLine[error]!.lineInfo.getLocation(error.offset);
     var length = error.length;
 
     var severity = _severityProcessor(error);
diff --git a/pkg/analyzer_cli/lib/src/error_severity.dart b/pkg/analyzer_cli/lib/src/error_severity.dart
index dc7e4ec..23bfe3e 100644
--- a/pkg/analyzer_cli/lib/src/error_severity.dart
+++ b/pkg/analyzer_cli/lib/src/error_severity.dart
@@ -12,17 +12,15 @@
 /// - if [options.enableTypeChecks] is false, then de-escalate checked-mode
 ///   compile time errors to a severity of [ErrorSeverity.INFO].
 /// - if [options.lintsAreFatal] is true, escalate lints to errors.
-ErrorSeverity computeSeverity(
+ErrorSeverity? computeSeverity(
   AnalysisError error,
   CommandLineOptions commandLineOptions,
   AnalysisOptions analysisOptions,
 ) {
-  if (analysisOptions != null) {
-    var processor = ErrorProcessor.getProcessor(analysisOptions, error);
-    // If there is a processor for this error, defer to it.
-    if (processor != null) {
-      return processor.severity;
-    }
+  var processor = ErrorProcessor.getProcessor(analysisOptions, error);
+  // If there is a processor for this error, defer to it.
+  if (processor != null) {
+    return processor.severity;
   }
 
   if (commandLineOptions.lintsAreFatal && error.errorCode is LintCode) {
@@ -34,7 +32,7 @@
 
 /// Check various configuration options to get a desired severity for this
 /// [error] (or `null` if it's to be suppressed).
-ErrorSeverity determineProcessedSeverity(AnalysisError error,
+ErrorSeverity? determineProcessedSeverity(AnalysisError error,
     CommandLineOptions commandLineOptions, AnalysisOptions analysisOptions) {
   var severity = computeSeverity(error, commandLineOptions, analysisOptions);
   // Skip TODOs categorically unless escalated to ERROR or HINT (#26215).
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index fa01214..4ad9d00 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -35,6 +35,8 @@
 
 T cast<T>(dynamic value) => value as T;
 
+T? castNullable<T>(dynamic value) => value as T?;
+
 /// Print the given [message] to stderr and exit with the given [exitCode].
 void printAndFail(String message, {int exitCode = 15}) {
   errorSink.writeln(message);
@@ -53,18 +55,18 @@
   /// The file path of the analysis options file that should be used in place of
   /// any file in the root directory or a parent of the root directory,
   /// or `null` if the normal lookup mechanism should be used.
-  String defaultAnalysisOptionsPath;
+  String? defaultAnalysisOptionsPath;
 
   /// The file path of the .packages file that should be used in place of any
   /// file found using the normal (Package Specification DEP) lookup mechanism,
   /// or `null` if the normal lookup mechanism should be used.
-  String defaultPackagesPath;
+  String? defaultPackagesPath;
 
   /// A table mapping variable names to values for the declared variables.
   final Map<String, String> declaredVariables = {};
 
   /// The path to the dart SDK.
-  String dartSdkPath;
+  String? dartSdkPath;
 
   /// Whether to disable cache flushing. This option can improve analysis
   /// speed at the expense of memory usage. It may also be useful for working
@@ -91,7 +93,7 @@
 
   /// The path to a file to write a performance log.
   /// (Or null if not enabled.)
-  final String perfReport;
+  final String? perfReport;
 
   /// Batch mode (for unit testing)
   final bool batchMode;
@@ -100,7 +102,7 @@
   final bool showPackageWarnings;
 
   /// If not null, show package: warnings only for matching packages.
-  final String showPackageWarningsPrefix;
+  final String? showPackageWarningsPrefix;
 
   /// Whether to show SDK warnings
   final bool showSdkWarnings;
@@ -133,7 +135,7 @@
     ResourceProvider resourceProvider,
     ArgResults args,
   )   : _argResults = args,
-        dartSdkPath = cast(args[_sdkPathOption]),
+        dartSdkPath = castNullable(args[_sdkPathOption]),
         disableCacheFlushing = cast(args['disable-cache-flushing']),
         disableHints = cast(args['no-hints']),
         displayVersion = cast(args['version']),
@@ -141,12 +143,13 @@
         log = cast(args['log']),
         jsonFormat = args['format'] == 'json',
         machineFormat = args['format'] == 'machine',
-        perfReport = cast(args['x-perf-report']),
+        perfReport = castNullable(args['x-perf-report']),
         batchMode = cast(args['batch']),
         showPackageWarnings = cast(args['show-package-warnings']) ||
             cast(args['package-warnings']) ||
             args['x-package-warnings-prefix'] != null,
-        showPackageWarningsPrefix = cast(args['x-package-warnings-prefix']),
+        showPackageWarningsPrefix =
+            castNullable(args['x-package-warnings-prefix']),
         showSdkWarnings = cast(args['sdk-warnings']),
         sourceFiles = args.rest,
         infosAreFatal = cast(args['fatal-infos']) || cast(args['fatal-hints']),
@@ -160,11 +163,11 @@
     //
     defaultAnalysisOptionsPath = _absoluteNormalizedPath(
       resourceProvider,
-      cast(args[_analysisOptionsFileOption]),
+      castNullable(args[_analysisOptionsFileOption]),
     );
     defaultPackagesPath = _absoluteNormalizedPath(
       resourceProvider,
-      cast(args[_packagesOption]),
+      castNullable(args[_packagesOption]),
     );
 
     //
@@ -192,20 +195,20 @@
 
   /// The default language version for files that are not in a package.
   /// (Or null if no default language version to force.)
-  String get defaultLanguageVersion {
-    return cast(_argResults[_defaultLanguageVersionOption]);
+  String? get defaultLanguageVersion {
+    return castNullable(_argResults[_defaultLanguageVersionOption]);
   }
 
   /// A list of the names of the experiments that are to be enabled.
-  List<String> get enabledExperiments {
-    return cast(_argResults[_enableExperimentOption]);
+  List<String>? get enabledExperiments {
+    return castNullable(_argResults[_enableExperimentOption]);
   }
 
-  bool get implicitCasts => _argResults[_implicitCastsFlag] as bool;
+  bool? get implicitCasts => _argResults[_implicitCastsFlag] as bool?;
 
-  bool get lints => _argResults[_lintsFlag] as bool;
+  bool? get lints => _argResults[_lintsFlag] as bool?;
 
-  bool get noImplicitDynamic => _argResults[_noImplicitDynamicFlag] as bool;
+  bool? get noImplicitDynamic => _argResults[_noImplicitDynamicFlag] as bool?;
 
   /// Update the [analysisOptions] with flags that the user specified
   /// explicitly. The [analysisOptions] are usually loaded from one of
@@ -222,7 +225,7 @@
           .restrictToVersion(nonPackageLanguageVersion);
     }
 
-    var enabledExperiments = this.enabledExperiments;
+    var enabledExperiments = this.enabledExperiments!;
     if (enabledExperiments.isNotEmpty) {
       analysisOptions.contextFeatures = FeatureSet.fromEnableFlags2(
         sdkLanguageVersion: ExperimentStatus.currentVersion,
@@ -303,7 +306,7 @@
   /// Parse [args] into [CommandLineOptions] describing the specified
   /// analyzer options. In case of a format error, calls [printAndFail], which
   /// by default prints an error message to stderr and exits.
-  static CommandLineOptions parse(
+  static CommandLineOptions? parse(
       ResourceProvider resourceProvider, List<String> args,
       {void Function(String msg) printAndFail = printAndFail}) {
     var options = _parse(resourceProvider, args);
@@ -335,9 +338,9 @@
     return options;
   }
 
-  static String _absoluteNormalizedPath(
+  static String? _absoluteNormalizedPath(
     ResourceProvider resourceProvider,
-    String path,
+    String? path,
   ) {
     if (path == null) {
       return null;
@@ -425,7 +428,7 @@
     }
   }
 
-  static CommandLineOptions _parse(
+  static CommandLineOptions? _parse(
     ResourceProvider resourceProvider,
     List<String> args,
   ) {
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 5297838..0580b81 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -5,7 +5,7 @@
 publish_to: none
 
 environment:
-  sdk: "^2.7.0"
+  sdk: "^2.14.0"
 
 dependencies:
   analyzer: any
diff --git a/pkg/analyzer_cli/test/analysis_options_test.dart b/pkg/analyzer_cli/test/analysis_options_test.dart
index 0c68a22..72e1bb4 100644
--- a/pkg/analyzer_cli/test/analysis_options_test.dart
+++ b/pkg/analyzer_cli/test/analysis_options_test.dart
@@ -18,15 +18,10 @@
 
 @reflectiveTest
 class OptionsTest {
-  _Runner runner;
-
-  void setUp() {
-    runner = _Runner.setUp();
-  }
+  final _Runner runner = _Runner.setUp();
 
   void tearDown() {
     runner.tearDown();
-    runner = null;
   }
 
   Future<void> test_options() async {
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 19d778d..de57da2 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -34,16 +34,16 @@
 class BaseTest {
   static const emptyOptionsFile = 'data/empty_options.yaml';
 
-  StringSink _savedOutSink, _savedErrorSink;
-  int _savedExitCode;
-  ExitHandler _savedExitHandler;
+  late StringSink _savedOutSink, _savedErrorSink;
+  late int _savedExitCode;
+  late ExitHandler _savedExitHandler;
 
-  Driver driver;
+  late Driver driver;
 
-  AnalysisOptions get analysisOptions => driver.analysisDriver.analysisOptions;
+  AnalysisOptions get analysisOptions => driver.analysisDriver!.analysisOptions;
 
   /// Normalize text with bullets.
-  String bulletToDash(StringSink item) => '$item'.replaceAll('•', '-');
+  String bulletToDash(StringSink? item) => '$item'.replaceAll('•', '-');
 
   /// Start a driver for the given [source], optionally providing additional
   /// [args] and an [options] file path. The value of [options] defaults to an
@@ -60,7 +60,7 @@
   /// Like [drive], but takes an array of sources.
   Future<void> driveMany(
     List<String> sources, {
-    String options = emptyOptionsFile,
+    String? options = emptyOptionsFile,
     List<String> args = const <String>[],
   }) async {
     options = _posixToPlatformPath(options);
@@ -112,7 +112,7 @@
   ///
   /// This is a utility method for testing; paths passed in to other methods in
   /// this class are never converted automatically.
-  String _posixToPlatformPath(String filePath) {
+  String? _posixToPlatformPath(String? filePath) {
     if (filePath == null) {
       return null;
     }
@@ -359,7 +359,7 @@
       expect(
           bulletToDash(outSink),
           contains(
-              'warning - The feature android.software.home_screen is not supported on Chrome OS'));
+              "warning - The feature android.software.home_screen isn't supported on Chrome OS"));
       expect(exitCode, 0);
     });
   }
@@ -464,7 +464,7 @@
     ]);
     expect(processorFor(missing_return).severity, ErrorSeverity.ERROR);
     expect(bulletToDash(outSink),
-        contains("error - This function has a return type of 'int'"));
+        contains("error - The body might complete normally"));
     expect(outSink.toString(), contains('1 error and 1 warning found.'));
   }
 
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index 3420843..584f477 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -12,8 +12,8 @@
 
 void main() {
   group('_embedder.yaml', () {
-    StringSink savedOutSink, savedErrorSink;
-    int savedExitCode;
+    late StringSink savedOutSink, savedErrorSink;
+    late int savedExitCode;
 
     setUp(() {
       savedOutSink = outSink;
diff --git a/pkg/analyzer_cli/test/errors_reported_once_test.dart b/pkg/analyzer_cli/test/errors_reported_once_test.dart
index d25a78e..9fdabc2 100644
--- a/pkg/analyzer_cli/test/errors_reported_once_test.dart
+++ b/pkg/analyzer_cli/test/errors_reported_once_test.dart
@@ -18,9 +18,9 @@
 
 @reflectiveTest
 class ErrorsReportedOnceTest {
-  StringSink savedOutSink, savedErrorSink;
-  int savedExitCode;
-  ExitHandler savedExitHandler;
+  late StringSink savedOutSink, savedErrorSink;
+  late int savedExitCode;
+  late ExitHandler savedExitHandler;
 
   void setUp() {
     savedOutSink = outSink;
diff --git a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
index 16d79dd..510a9ad 100644
--- a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
+++ b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
@@ -18,9 +18,9 @@
 
 @reflectiveTest
 class ErrorUpgradeFailsCli {
-  StringSink savedOutSink, savedErrorSink;
-  int savedExitCode;
-  ExitHandler savedExitHandler;
+  late StringSink savedOutSink, savedErrorSink;
+  late int savedExitCode;
+  late ExitHandler savedExitHandler;
 
   void setUp() {
     savedOutSink = outSink;
diff --git a/pkg/analyzer_cli/test/mocks.dart b/pkg/analyzer_cli/test/mocks.dart
index 405448e..a8b487a 100644
--- a/pkg/analyzer_cli/test/mocks.dart
+++ b/pkg/analyzer_cli/test/mocks.dart
@@ -32,10 +32,10 @@
   List<DiagnosticMessage> get contextMessages => const [];
 
   @override
-  String get correction => null;
+  String? get correction => null;
 
   @override
-  String get correctionMessage => null;
+  String? get correctionMessage => null;
 
   @override
   DiagnosticMessage get problemMessage => DiagnosticMessageImpl(
@@ -46,7 +46,7 @@
       url: null);
 
   @override
-  Severity get severity => null;
+  Severity get severity => Severity.error;
 }
 
 class MockAnalysisErrorInfo implements AnalysisErrorInfo {
@@ -87,7 +87,7 @@
   String name;
 
   @override
-  String url;
+  String? url;
 
   MockErrorCode(this.type, this.errorSeverity, this.name);
 
@@ -120,7 +120,7 @@
 }
 
 class MockLineInfo implements LineInfo {
-  CharacterLocation defaultLocation;
+  CharacterLocation? defaultLocation;
 
   MockLineInfo({this.defaultLocation});
 
@@ -137,7 +137,7 @@
   @override
   CharacterLocation getLocation(int offset) {
     if (defaultLocation != null) {
-      return defaultLocation;
+      return defaultLocation!;
     }
     throw StateError('Unexpected invocation of getLocation');
   }
@@ -155,55 +155,13 @@
 
 class MockSource implements Source {
   @override
-  String fullName;
-
-  MockSource(this.fullName);
+  final String fullName;
 
   @override
-  TimestampedData<String> get contents {
-    throw StateError('Unexpected invocation of contents');
-  }
+  final Uri uri;
+
+  MockSource(this.fullName, this.uri);
 
   @override
-  String get encoding {
-    throw StateError('Unexpected invocation of encoding');
-  }
-
-  @override
-  bool get isInSystemLibrary {
-    throw StateError('Unexpected invocation of isInSystemLibrary');
-  }
-
-  @override
-  Source get librarySource {
-    throw StateError('Unexpected invocation of librarySource');
-  }
-
-  @override
-  int get modificationStamp {
-    throw StateError('Unexpected invocation of modificationStamp');
-  }
-
-  @override
-  String get shortName {
-    throw StateError('Unexpected invocation of shortName');
-  }
-
-  @override
-  Source get source {
-    throw StateError('Unexpected invocation of source');
-  }
-
-  @override
-  Uri get uri {
-    throw StateError('Unexpected invocation of uri');
-  }
-
-  @override
-  UriKind get uriKind => null; //UriKind.FILE_URI;
-
-  @override
-  bool exists() {
-    throw StateError('Unexpected invocation of exists');
-  }
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 4b7167b..1c151dd 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -24,11 +24,11 @@
       var outStringBuffer = StringBuffer();
       var errorStringBuffer = StringBuffer();
 
-      StringSink savedOutSink, savedErrorSink;
-      int savedExitCode;
-      ExitHandler savedExitHandler;
+      late StringSink savedOutSink, savedErrorSink;
+      late int savedExitCode;
+      late ExitHandler savedExitHandler;
 
-      CommandLineOptions parse(List<String> args,
+      CommandLineOptions? parse(List<String> args,
           {void Function(String msg) printAndFail = printAndFail}) {
         var resourceProvider = PhysicalResourceProvider.INSTANCE;
         return CommandLineOptions.parse(resourceProvider, args,
@@ -53,7 +53,7 @@
       });
 
       test('defaults', () {
-        var options = parse(['--dart-sdk', '.', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', 'foo.dart'])!;
         expect(options, isNotNull);
         expect(options.dartSdkPath, isNotNull);
         expect(options.disableCacheFlushing, isFalse);
@@ -78,19 +78,19 @@
       });
 
       test('batch', () {
-        var options = parse(['--dart-sdk', '.', '--batch']);
+        var options = parse(['--dart-sdk', '.', '--batch'])!;
         expect(options.batchMode, isTrue);
       });
 
       test('defined variables', () {
-        var options = parse(['--dart-sdk', '.', '-Dfoo=bar', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '-Dfoo=bar', 'foo.dart'])!;
         expect(options.declaredVariables['foo'], equals('bar'));
         expect(options.declaredVariables['bar'], isNull);
       });
 
       test('disable cache flushing', () {
         var options =
-            parse(['--dart-sdk', '.', '--disable-cache-flushing', 'foo.dart']);
+            parse(['--dart-sdk', '.', '--disable-cache-flushing', 'foo.dart'])!;
         expect(options.disableCacheFlushing, isTrue);
       });
 
@@ -126,119 +126,126 @@
         };
 
         test('no values', () {
-          var options =
-              overrideKnownFeatures(knownFeatures, () => parse(['foo.dart']));
+          var options = overrideKnownFeatures(
+              knownFeatures, (() => parse(['foo.dart'])!));
           expect(options.enabledExperiments, isEmpty);
         });
 
         test('single value', () {
           var options = overrideKnownFeatures(knownFeatures,
-              () => parse(['--enable-experiment', 'a', 'foo.dart']));
+              (() => parse(['--enable-experiment', 'a', 'foo.dart'])!));
           expect(options.enabledExperiments, ['a']);
         });
 
         group('multiple values', () {
           test('single flag', () {
             var options = overrideKnownFeatures(knownFeatures,
-                () => parse(['--enable-experiment', 'a,b', 'foo.dart']));
+                (() => parse(['--enable-experiment', 'a,b', 'foo.dart'])!));
             expect(options.enabledExperiments, ['a', 'b']);
           });
 
           test('mixed single and multiple flags', () {
             var options = overrideKnownFeatures(
                 knownFeatures,
-                () => parse([
+                (() => parse([
                       '--enable-experiment',
                       'a,b',
                       '--enable-experiment',
                       'c',
                       'foo.dart'
-                    ]));
+                    ])!));
             expect(options.enabledExperiments, ['a', 'b', 'c']);
           });
 
           test('multiple flags', () {
             var options = overrideKnownFeatures(
                 knownFeatures,
-                () => parse([
+                (() => parse([
                       '--enable-experiment',
                       'a',
                       '--enable-experiment',
                       'b',
                       'foo.dart'
-                    ]));
+                    ])!));
             expect(options.enabledExperiments, ['a', 'b']);
           });
         });
       });
 
       test('hintsAreFatal', () {
-        var options = parse(['--dart-sdk', '.', '--fatal-hints', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--fatal-hints', 'foo.dart'])!;
         expect(options.infosAreFatal, isTrue);
       });
 
       test('infosAreFatal', () {
-        var options = parse(['--dart-sdk', '.', '--fatal-infos', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--fatal-infos', 'foo.dart'])!;
         expect(options.infosAreFatal, isTrue);
       });
 
       test('log', () {
-        var options = parse(['--dart-sdk', '.', '--log', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--log', 'foo.dart'])!;
         expect(options.log, isTrue);
       });
 
       group('format', () {
         test('json', () {
-          var options = parse(['--dart-sdk', '.', '--format=json', 'foo.dart']);
+          var options =
+              parse(['--dart-sdk', '.', '--format=json', 'foo.dart'])!;
           expect(options.jsonFormat, isTrue);
           expect(options.machineFormat, isFalse);
         });
 
         test('machine', () {
           var options =
-              parse(['--dart-sdk', '.', '--format=machine', 'foo.dart']);
+              parse(['--dart-sdk', '.', '--format=machine', 'foo.dart'])!;
           expect(options.jsonFormat, isFalse);
           expect(options.machineFormat, isTrue);
         });
       });
 
       test('no-hints', () {
-        var options = parse(['--dart-sdk', '.', '--no-hints', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--no-hints', 'foo.dart'])!;
         expect(options.disableHints, isTrue);
       });
 
       test('options', () {
-        var options =
-            parse(['--dart-sdk', '.', '--options', 'options.yaml', 'foo.dart']);
+        var options = parse(
+            ['--dart-sdk', '.', '--options', 'options.yaml', 'foo.dart'])!;
         expect(options.defaultAnalysisOptionsPath, endsWith('options.yaml'));
       });
 
       test('lints', () {
-        var options = parse(['--dart-sdk', '.', '--lints', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--lints', 'foo.dart'])!;
         expect(options.lints, isTrue);
       });
 
       test('package warnings', () {
         var options =
-            parse(['--dart-sdk', '.', '--package-warnings', 'foo.dart']);
+            parse(['--dart-sdk', '.', '--package-warnings', 'foo.dart'])!;
         expect(options.showPackageWarnings, isTrue);
       });
 
       test('sdk warnings', () {
-        var options = parse(['--dart-sdk', '.', '--sdk-warnings', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--sdk-warnings', 'foo.dart'])!;
         expect(options.showSdkWarnings, isTrue);
       });
 
       test('sourceFiles', () {
-        var options = parse(
-            ['--dart-sdk', '.', '--log', 'foo.dart', 'foo2.dart', 'foo3.dart']);
+        var options = parse([
+          '--dart-sdk',
+          '.',
+          '--log',
+          'foo.dart',
+          'foo2.dart',
+          'foo3.dart'
+        ])!;
         expect(options.sourceFiles,
             equals(['foo.dart', 'foo2.dart', 'foo3.dart']));
       });
 
       test('warningsAreFatal', () {
         var options =
-            parse(['--dart-sdk', '.', '--fatal-warnings', 'foo.dart']);
+            parse(['--dart-sdk', '.', '--fatal-warnings', 'foo.dart'])!;
         expect(options.warningsAreFatal, isTrue);
       });
 
@@ -250,25 +257,25 @@
           '--dart-sdk',
           '.',
           'foo.dart'
-        ]);
+        ])!;
         expect(options, isNotNull);
         expect(options.sourceFiles, equals(['foo.dart']));
       });
 
       test('hintsAreFatal', () {
-        var options = parse(['--dart-sdk', '.', '--fatal-lints', 'foo.dart']);
+        var options = parse(['--dart-sdk', '.', '--fatal-lints', 'foo.dart'])!;
         expect(options.lintsAreFatal, isTrue);
       });
 
       test('bad SDK dir', () {
-        String failureMessage;
+        String? failureMessage;
         parse(['--dart-sdk', '&&&&&', 'foo.dart'],
             printAndFail: (msg) => failureMessage = msg);
         expect(failureMessage, equals('Invalid Dart SDK path: &&&&&'));
       });
 
       test('--train-snapshot', () {
-        var options = parse(['--train-snapshot', 'foo.dart']);
+        var options = parse(['--train-snapshot', 'foo.dart'])!;
         expect(options.trainSnapshot, isTrue);
       });
     });
@@ -278,13 +285,13 @@
 
 @reflectiveTest
 class ArgumentsTest with ResourceProviderMixin {
-  CommandLineOptions commandLineOptions;
-  String failureMessage;
+  CommandLineOptions? commandLineOptions;
+  String? failureMessage;
 
   void test_declaredVariables() {
     _parse(['-Da=0', '-Db=', 'a.dart']);
 
-    var definedVariables = commandLineOptions.declaredVariables;
+    var definedVariables = commandLineOptions!.declaredVariables;
 
     expect(definedVariables['a'], '0');
     expect(definedVariables['b'], '');
@@ -296,7 +303,7 @@
     _parse(['--options=$expected', 'a.dart']);
 
     expect(
-      commandLineOptions.defaultAnalysisOptionsPath,
+      commandLineOptions!.defaultAnalysisOptionsPath,
       endsWith(expected),
     );
   }
@@ -306,16 +313,16 @@
     _parse(['--packages=$expected', 'a.dart']);
 
     expect(
-      commandLineOptions.defaultPackagesPath,
+      commandLineOptions!.defaultPackagesPath,
       endsWith(expected),
     );
   }
 
   void test_defaults() {
     _parse(['a.dart']);
-    expect(commandLineOptions.declaredVariables, isEmpty);
-    expect(commandLineOptions.defaultAnalysisOptionsPath, isNull);
-    expect(commandLineOptions.defaultPackagesPath, isNull);
+    expect(commandLineOptions!.declaredVariables, isEmpty);
+    expect(commandLineOptions!.defaultAnalysisOptionsPath, isNull);
+    expect(commandLineOptions!.defaultPackagesPath, isNull);
   }
 
   void test_filterUnknownArguments() {
@@ -554,7 +561,7 @@
     var analysisOptions = AnalysisOptionsImpl();
     configureInitial(analysisOptions);
 
-    commandLineOptions.updateAnalysisOptions(analysisOptions);
+    commandLineOptions!.updateAnalysisOptions(analysisOptions);
     checkApplied(analysisOptions);
   }
 
diff --git a/pkg/analyzer_cli/test/package_prefix_test.dart b/pkg/analyzer_cli/test/package_prefix_test.dart
index 157ffe9..9aa0d57 100644
--- a/pkg/analyzer_cli/test/package_prefix_test.dart
+++ b/pkg/analyzer_cli/test/package_prefix_test.dart
@@ -13,7 +13,7 @@
 
 void main() {
   group('--x-package-warnings-prefix', () {
-    _Runner runner;
+    late _Runner runner;
 
     setUp(() {
       runner = _Runner.setUp();
@@ -21,7 +21,6 @@
 
     tearDown(() {
       runner.tearDown();
-      runner = null;
     });
 
     test('shows only the hint whose package matches the prefix', () async {
diff --git a/pkg/analyzer_cli/test/perf_report_test.dart b/pkg/analyzer_cli/test/perf_report_test.dart
index 933b455..321bb89 100644
--- a/pkg/analyzer_cli/test/perf_report_test.dart
+++ b/pkg/analyzer_cli/test/perf_report_test.dart
@@ -15,7 +15,7 @@
     var options = CommandLineOptions.parse(
       PhysicalResourceProvider.INSTANCE,
       ['somefile.dart'],
-    );
+    )!;
     var encoded = makePerfReport(1000, 1234, options, 0, AnalysisStats());
 
     var jsonData = json.decode(encoded);
diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart
index e0edaba..cffb0ff 100644
--- a/pkg/analyzer_cli/test/reporter_test.dart
+++ b/pkg/analyzer_cli/test/reporter_test.dart
@@ -2,21 +2,23 @@
 // 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/session.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
 import 'package:analyzer_cli/src/error_formatter.dart';
+import 'package:path/path.dart' as package_path;
 import 'package:test/test.dart' hide ErrorFormatter;
 
 import 'mocks.dart';
 
 void main() {
   group('reporter', () {
-    StringBuffer out;
-    AnalysisStats stats;
-    MockCommandLineOptions options;
-    ErrorFormatter reporter;
+    late StringBuffer out;
+    late AnalysisStats stats;
+    late MockCommandLineOptions options;
+    late ErrorFormatter reporter;
 
     setUp(() {
       ansi.runningTests = true;
@@ -102,9 +104,15 @@
 
   // Details
   var code = MockErrorCode(type, severity, 'mock_code');
-  var source = MockSource('/foo/bar/baz.dart');
+  var path = '/foo/bar/baz.dart';
+  var source = MockSource(path, package_path.toUri(path));
   var error = MockAnalysisError(source, code, 20, 'MSG');
 
-  return ErrorsResultImpl(
-      null, source.fullName, null, lineInfo, false, [error]);
+  return ErrorsResultImpl(_MockAnslysisSession(), source.fullName,
+      Uri.file('/'), lineInfo, false, [error]);
+}
+
+class _MockAnslysisSession implements AnalysisSession {
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analyzer_cli/test/strong_mode_test.dart b/pkg/analyzer_cli/test/strong_mode_test.dart
index 914a3ef..2f9dc3f 100644
--- a/pkg/analyzer_cli/test/strong_mode_test.dart
+++ b/pkg/analyzer_cli/test/strong_mode_test.dart
@@ -29,7 +29,7 @@
     expect(exitCode, 3);
     var stdout = bulletToDash(outSink);
     expect(stdout, contains("isn't a valid override of"));
-    expect(stdout, contains('error - The list literal type'));
+    expect(stdout, contains('error - A value of type'));
     expect(stdout, contains('2 errors found'));
   }
 }
diff --git a/pkg/analyzer_cli/tool/perf.dart b/pkg/analyzer_cli/tool/perf.dart
index e4e3dcb..2ad2424 100644
--- a/pkg/analyzer_cli/tool/perf.dart
+++ b/pkg/analyzer_cli/tool/perf.dart
@@ -19,7 +19,6 @@
 import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk;
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 
 void main(List<String> args) async {
@@ -64,12 +63,12 @@
 int scanTotalChars = 0;
 
 /// Factory to load and resolve app, packages, and sdk sources.
-SourceFactory sources;
+late SourceFactory sources;
 
 /// Add to [files] all sources reachable from [start].
-void collectSources(Source start, Set<Source> files) {
+void collectSources(Source? start, Set<Source?> files) {
   if (!files.add(start)) return;
-  var unit = parseDirectives(start);
+  var unit = parseDirectives(start!);
   for (var directive in unit.directives) {
     if (directive is UriBasedDirective) {
       var next = sources.resolveUri(start, directive.uri.stringValue);
@@ -90,7 +89,7 @@
 }
 
 /// Parses every file in [files] and reports the time spent doing so.
-void parseFiles(Set<Source> files) {
+void parseFiles(Set<Source?> files) {
   // The code below will record again how many chars are scanned and how long it
   // takes to scan them, even though we already did so in [scanReachableFiles].
   // Recording and reporting this twice is unnecessary, but we do so for now to
@@ -100,7 +99,7 @@
   scanTotalChars = 0;
   var parseTimer = Stopwatch()..start();
   for (var source in files) {
-    parseFull(source);
+    parseFull(source!);
   }
   parseTimer.stop();
 
@@ -133,7 +132,7 @@
 }
 
 /// Scans every file in [files] and reports the time spent doing so.
-void scanFiles(Set<Source> files) {
+void scanFiles(Set<Source?> files) {
   // The code below will record again how many chars are scanned and how long it
   // takes to scan them, even though we already did so in [scanReachableFiles].
   // Recording and reporting this twice is unnecessary, but we do so for now to
@@ -142,7 +141,7 @@
   var old = scanTotalChars;
   scanTotalChars = 0;
   for (var source in files) {
-    tokenize(source);
+    tokenize(source!);
   }
 
   // Report size and scanning time again. See discussion above.
@@ -152,8 +151,8 @@
 
 /// Load and scans all files we need to process: files reachable from the
 /// entrypoint and all core libraries automatically included by the VM.
-Set<Source> scanReachableFiles(Uri entryUri) {
-  var files = <Source>{};
+Set<Source?> scanReachableFiles(Uri entryUri) {
+  var files = <Source?>{};
   var loadTimer = Stopwatch()..start();
   collectSources(sources.forUri2(entryUri), files);
 
diff --git a/pkg/analyzer_plugin/CHANGELOG.md b/pkg/analyzer_plugin/CHANGELOG.md
index 04ab329..ca17b41 100644
--- a/pkg/analyzer_plugin/CHANGELOG.md
+++ b/pkg/analyzer_plugin/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 0.9.0
+- Support version `3.x` of the `analyzer` package
+
 ## 0.8.0
 - Require SDK `2.14` to use `Object.hash()`.
 - Require `yaml 3.1.0` to use `recover`.
diff --git a/pkg/analyzer_plugin/analysis_options.yaml b/pkg/analyzer_plugin/analysis_options.yaml
index c183e26..a8cb96f 100644
--- a/pkg/analyzer_plugin/analysis_options.yaml
+++ b/pkg/analyzer_plugin/analysis_options.yaml
@@ -1,6 +1,6 @@
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
 linter:
   rules:
     - await_only_futures
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 a9597f7..ebb810a 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
@@ -130,6 +130,13 @@
     if (builder == null) {
       builder = await _createDartFileEditBuilder(path);
       if (builder != null) {
+        // It's not currently supported to call this method twice concurrently
+        // for the same file as two builder may be produced because of the above
+        // `await` so detect this and throw to avoid losing edits.
+        if (_dartFileEditBuilders.containsKey(path)) {
+          throw StateError(
+              "Can't add multiple edits concurrently for the same file");
+        }
         _dartFileEditBuilders[path] = builder;
       }
     }
@@ -242,6 +249,13 @@
   }
 
   @override
+  bool hasEditsFor(String path) {
+    return _dartFileEditBuilders.containsKey(path) ||
+        _genericFileEditBuilders.containsKey(path) ||
+        _yamlFileEditBuilders.containsKey(path);
+  }
+
+  @override
   void setSelection(Position position) {
     _selection = position;
   }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 9b0c895..23110a9 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -17,6 +17,7 @@
     hide Element, ElementKind;
 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/src/utilities/charcodes.dart';
+import 'package:analyzer_plugin/src/utilities/library.dart';
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
@@ -1337,11 +1338,6 @@
   /// the names used in generated code, to information about these imports.
   Map<Uri, _LibraryToImport> librariesToImport = {};
 
-  /// A mapping from libraries that need to be imported relatively in order to
-  /// make visible the names used in generated code, to information about these
-  /// imports.
-  Map<String, _LibraryToImport> librariesToRelativelyImport = {};
-
   /// Initialize a newly created builder to build a source file edit within the
   /// change being built by the given [changeBuilder]. The file being edited has
   /// the given [resolvedUnit] and [timeStamp].
@@ -1350,10 +1346,7 @@
       : super(changeBuilder, resolvedUnit.path, timeStamp);
 
   @override
-  bool get hasEdits =>
-      super.hasEdits ||
-      librariesToImport.isNotEmpty ||
-      librariesToRelativelyImport.isNotEmpty;
+  bool get hasEdits => super.hasEdits || librariesToImport.isNotEmpty;
 
   @override
   void addInsertion(
@@ -1402,9 +1395,6 @@
     for (var entry in librariesToImport.entries) {
       copy.librariesToImport[entry.key] = entry.value;
     }
-    for (var entry in librariesToRelativelyImport.entries) {
-      copy.librariesToRelativelyImport[entry.key] = entry.value;
-    }
     return copy;
   }
 
@@ -1418,9 +1408,6 @@
     if (librariesToImport.isNotEmpty) {
       _addLibraryImports(librariesToImport.values);
     }
-    if (librariesToRelativelyImport.isNotEmpty) {
-      _addLibraryImports(librariesToRelativelyImport.values);
-    }
   }
 
   @override
@@ -1480,8 +1467,12 @@
     return ImportLibraryElementResultImpl(null);
   }
 
-  String importLibraryWithRelativeUri(String uriText, [String? prefix]) {
-    return _importLibraryWithRelativeUri(uriText, prefix).uriText;
+  String importLibraryWithAbsoluteUri(Uri uri, [String? prefix]) {
+    return _importLibrary(uri, prefix: prefix, forceAbsolute: true).uriText;
+  }
+
+  String importLibraryWithRelativeUri(Uri uri, [String? prefix]) {
+    return _importLibrary(uri, prefix: prefix, forceRelative: true).uriText;
   }
 
   @override
@@ -1495,9 +1486,9 @@
       return;
     }
 
-    addReplacement(range.node(typeAnnotation!), (EditBuilder builder) {
+    addReplacement(range.node(typeAnnotation!), (builder) {
       var futureType = typeProvider.futureType(type);
-      if (!(builder as DartEditBuilder).writeType(futureType)) {
+      if (!builder.writeType(futureType)) {
         builder.write('void');
       }
     });
@@ -1720,24 +1711,55 @@
   }
 
   /// Computes the best URI to import [uri] into the target library.
-  String _getLibraryUriText(Uri uri) {
-    if (uri.scheme == 'file') {
-      var pathContext = resolvedUnit.session.resourceProvider.pathContext;
-      var whatPath = pathContext.fromUri(uri);
+  ///
+  /// [uri] may be converted from an absolute URI to a relative URI depending on
+  /// user preferences/lints unless [forceAbsolute] or [forceRelative] are `true`.
+  String _getLibraryUriText(
+    Uri uri, {
+    bool forceAbsolute = false,
+    bool forceRelative = false,
+  }) {
+    var pathContext = resolvedUnit.session.resourceProvider.pathContext;
+
+    /// Returns the relative path to import [whatPath] into [resolvedUnit].
+    String getRelativePath(String whatPath) {
       var libraryPath = resolvedUnit.libraryElement.source.fullName;
       var libraryFolder = pathContext.dirname(libraryPath);
       var relativeFile = pathContext.relative(whatPath, from: libraryFolder);
       return pathContext.split(relativeFile).join('/');
     }
+
+    if (uri.isScheme('file')) {
+      var whatPath = pathContext.fromUri(uri);
+      return getRelativePath(whatPath);
+    }
+    var preferRelative = _isLintEnabled('prefer_relative_imports');
+    if (forceRelative || (preferRelative && !forceAbsolute)) {
+      if (canBeRelativeImport(uri, resolvedUnit.uri)) {
+        var whatPath = resolvedUnit.session.uriConverter.uriToPath(uri);
+        if (whatPath != null) {
+          return getRelativePath(whatPath);
+        }
+      }
+    }
     return uri.toString();
   }
 
   /// Arrange to have an import added for the library with the given [uri].
-  _LibraryToImport _importLibrary(Uri uri) {
+  ///
+  /// [uri] may be converted from an absolute URI to a relative URI depending on
+  /// user preferences/lints unless [forceAbsolute] or [forceRelative] are `true`.
+  _LibraryToImport _importLibrary(
+    Uri uri, {
+    String? prefix,
+    bool forceAbsolute = false,
+    bool forceRelative = false,
+  }) {
     var import = (libraryChangeBuilder ?? this).librariesToImport[uri];
     if (import == null) {
-      var uriText = _getLibraryUriText(uri);
-      var prefix =
+      var uriText = _getLibraryUriText(uri,
+          forceAbsolute: forceAbsolute, forceRelative: forceRelative);
+      prefix ??=
           importPrefixGenerator != null ? importPrefixGenerator!(uri) : null;
       import = _LibraryToImport(uriText, prefix);
       (libraryChangeBuilder ?? this).librariesToImport[uri] = import;
@@ -1745,23 +1767,17 @@
     return import;
   }
 
-  /// Arrange to have an import added for the library with the given relative
-  /// [uriText].
-  _LibraryToImport _importLibraryWithRelativeUri(String uriText,
-      [String? prefix]) {
-    var import = librariesToRelativelyImport[uriText];
-    if (import == null) {
-      import = _LibraryToImport(uriText, prefix);
-      librariesToRelativelyImport[uriText] = import;
-    }
-    return import;
-  }
-
   /// Return `true` if the [element] is defined in the target library.
   bool _isDefinedLocally(Element element) {
     return element.library == resolvedUnit.libraryElement;
   }
 
+  bool _isLintEnabled(String lintName) {
+    final analysisOptions =
+        resolvedUnit.session.analysisContext.analysisOptions;
+    return analysisOptions.isLintEnabled(lintName);
+  }
+
   /// Create an edit to replace the return type of the innermost function
   /// containing the given [node] with the type `Future`. The [typeProvider] is
   /// used to check the current return type, because if it is already `Future`
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
index 2fe6603..e235487 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -69,9 +68,6 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 class CompletionTarget {
-  /// The compilation unit in which the completion is occurring.
-  final CompilationUnit unit;
-
   /// The offset within the source at which the completion is being requested.
   final int offset;
 
@@ -122,14 +118,8 @@
   ParameterElement? _parameterElement;
 
   /// Compute the appropriate [CompletionTarget] for the given [offset] within
-  /// the [compilationUnit].
-  ///
-  /// Optionally, start the search from within [entryPoint] instead of using
-  /// the [compilationUnit], which is useful for analyzing ASTs that have no
-  /// [compilationUnit] such as dart expressions within angular templates.
-  factory CompletionTarget.forOffset(
-      CompilationUnit compilationUnit, int offset,
-      {AstNode? entryPoint}) {
+  /// the [entryPoint].
+  factory CompletionTarget.forOffset(AstNode entryPoint, int offset) {
     // The precise algorithm is as follows. We perform a depth-first search of
     // all edges in the parse tree (both those that point to AST nodes and
     // those that point to tokens), visiting parents before children. The
@@ -144,7 +134,6 @@
     // prune the search to the point where no recursion is necessary; at each
     // step in the process we know exactly which child node we need to proceed
     // to.
-    entryPoint ??= compilationUnit;
     var containingNode = entryPoint;
     outerLoop:
     while (true) {
@@ -167,11 +156,10 @@
             var commentToken = _getContainingCommentToken(entity, offset);
             if (commentToken != null) {
               return CompletionTarget._(
-                  compilationUnit, offset, containingNode, commentToken, true);
+                  offset, containingNode, commentToken, true);
             }
             // Target found.
-            return CompletionTarget._(
-                compilationUnit, offset, containingNode, entity, false);
+            return CompletionTarget._(offset, containingNode, entity, false);
           } else {
             // Since entity is a token, we don't need to look inside it; just
             // proceed to the next entity.
@@ -198,14 +186,13 @@
                   _getContainingDocComment(containingNode, commentToken);
               if (docComment != null) {
                 return CompletionTarget._(
-                    compilationUnit, offset, docComment, commentToken, false);
+                    offset, docComment, commentToken, false);
               } else {
-                return CompletionTarget._(compilationUnit, offset,
-                    compilationUnit, commentToken, true);
+                return CompletionTarget._(
+                    offset, entryPoint, commentToken, true);
               }
             }
-            return CompletionTarget._(
-                compilationUnit, offset, containingNode, entity, false);
+            return CompletionTarget._(offset, containingNode, entity, false);
           }
 
           // Otherwise, the completion target is somewhere inside the entity,
@@ -228,23 +215,23 @@
       assert(identical(containingNode, entryPoint));
 
       // Check for comments on the EOF token (trailing comments in a file).
-      var commentToken =
-          _getContainingCommentToken(compilationUnit.endToken, offset);
-      if (commentToken != null) {
-        return CompletionTarget._(
-            compilationUnit, offset, compilationUnit, commentToken, true);
+      if (entryPoint is CompilationUnit) {
+        var commentToken =
+            _getContainingCommentToken(entryPoint.endToken, offset);
+        if (commentToken != null) {
+          return CompletionTarget._(offset, entryPoint, commentToken, true);
+        }
       }
 
       // Since no completion target was found, we set the completion target
       // entity to null and use the entryPoint as the parent.
-      return CompletionTarget._(
-          compilationUnit, offset, entryPoint, null, false);
+      return CompletionTarget._(offset, entryPoint, null, false);
     }
   }
 
   /// Create a [CompletionTarget] holding the given [containingNode] and
   /// [entity].
-  CompletionTarget._(this.unit, this.offset, AstNode containingNode,
+  CompletionTarget._(this.offset, AstNode containingNode,
       SyntacticEntity? entity, this.isCommentText)
       : containingNode = containingNode,
         entity = entity,
@@ -274,6 +261,7 @@
         return node.prefix;
       }
     }
+    return null;
   }
 
   /// If the target is an argument in an argument list, and the invocation is
@@ -297,6 +285,8 @@
         executable = invocation.constructorName.staticElement;
       } else if (invocation is MethodInvocation) {
         executable = invocation.methodName.staticElement;
+      } else if (invocation is RedirectingConstructorInvocation) {
+        executable = invocation.staticElement;
       } else if (invocation is SuperConstructorInvocation) {
         executable = invocation.staticElement;
       }
@@ -352,6 +342,37 @@
     return false;
   }
 
+  /// Return `true` if the [offset] is followed by a comma.
+  bool get isFollowedByComma {
+    // f(^); NO
+    // f(one: 1, ^); NO
+    // f(^ , one: 1); YES
+    // f(^, one: 1); YES
+    // f(^ one: 1); NO
+
+    bool isExistingComma(Token? token) {
+      return token != null &&
+          !token.isSynthetic &&
+          token.type == TokenType.COMMA;
+    }
+
+    var entity = this.entity;
+
+    Token token;
+    if (entity is AstNode) {
+      token = entity.endToken;
+    } else if (entity is Token) {
+      token = entity;
+    } else {
+      return false;
+    }
+
+    if (token.offset <= offset && offset <= token.end) {
+      return isExistingComma(token.next);
+    }
+    return isExistingComma(token);
+  }
+
   /// If the target is an argument in an argument list, and the invocation is
   /// resolved, return the corresponding [ParameterElement].
   ParameterElement? get parameterElement {
@@ -391,15 +412,21 @@
         }
       }
       if (token is StringToken) {
-        var uri = astFactory.simpleStringLiteral(token, token.lexeme);
-        var keyword = containingNode.findPrevious(token)?.keyword;
-        if (keyword == Keyword.IMPORT ||
-            keyword == Keyword.EXPORT ||
-            keyword == Keyword.PART) {
+        final containingNode = this.containingNode;
+        StringLiteral? uri;
+        Directive? directive;
+        if (containingNode is NamespaceDirective) {
+          directive = containingNode;
+          uri = containingNode.uri;
+        } else if (containingNode is SimpleStringLiteral) {
+          uri = containingNode;
+          directive = containingNode.parent.ifTypeOrNull();
+        }
+        // Replacement range for a URI.
+        if (directive != null && uri is SimpleStringLiteral) {
           var start = uri.contentsOffset;
           var end = uri.contentsEnd;
           if (start <= requestOffset && requestOffset <= end) {
-            // Replacement range for import URI
             return SourceRange(start, end - start);
           }
         }
@@ -638,3 +665,11 @@
     }
   }
 }
+
+extension on Object? {
+  /// If the target is [T], return it, otherwise `null`.
+  T? ifTypeOrNull<T>() {
+    final self = this;
+    return self is T ? self : null;
+  }
+}
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index dea31e3..2110c49 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
@@ -20,22 +19,12 @@
 /// suggestions should be made based upon the type of node in which the
 /// suggestions were requested.
 class OpType {
-  /// The [TypeSystem] used during resolution of the current unit.
-  TypeSystem? _typeSystem;
-
   /// Indicates whether constructor suggestions should be included.
   bool includeConstructorSuggestions = false;
 
   /// Indicates whether type names should be suggested.
   bool includeTypeNameSuggestions = false;
 
-  /// If [includeTypeNameSuggestions] is set to true, then this function may
-  /// be set to a non-default function to filter out potential suggestions
-  /// (null) based on their static [DartType], or change the relative relevance
-  /// by returning a higher or lower relevance.
-  SuggestionsFilter typeNameSuggestionsFilter =
-      (DartType _, int relevance) => relevance;
-
   /// Indicates whether setters along with methods and functions that
   /// have a [void] return type should be suggested.
   bool includeVoidReturnSuggestions = false;
@@ -76,10 +65,6 @@
   /// An representation of the location at which completion was requested.
   String? completionLocation;
 
-  /// The type that is required by the context in which the completion was
-  /// activated, or `null` if there is no such type, or it cannot be determined.
-  DartType? _requiredType;
-
   /// Determine the suggestions that should be made based upon the given
   /// [CompletionTarget] and [offset].
   factory OpType.forCompletion(CompletionTarget target, int offset) {
@@ -90,8 +75,6 @@
       return optype;
     }
 
-    optype._typeSystem = target.unit.declaredElement?.library.typeSystem;
-
     var targetNode = target.containingNode;
     targetNode.accept(_OpTypeAstVisitor(optype, target.entity, offset));
 
@@ -111,16 +94,9 @@
 
     // If a value should be suggested, suggest also constructors.
     if (optype.includeReturnValueSuggestions) {
-      // Careful: in angular plugin, `target.unit` may be null!
-      var unitElement = target.unit.declaredElement;
-      if (unitElement != null) {
-        optype.includeConstructorSuggestions = true;
-      }
+      optype.includeConstructorSuggestions = true;
     }
 
-    // Compute the type required by the context and set filters.
-    optype._computeRequiredTypeAndFilters(target);
-
     return optype;
   }
 
@@ -142,59 +118,6 @@
       !includeReturnValueSuggestions &&
       !includeVoidReturnSuggestions;
 
-  /// Try to determine the required context type, and configure filters.
-  void _computeRequiredTypeAndFilters(CompletionTarget target) {
-    var entity = target.entity;
-    AstNode? node = target.containingNode;
-
-    if (node is InstanceCreationExpression &&
-        node.keyword != null &&
-        node.constructorName == entity) {
-      entity = node;
-      node = node.parent;
-    }
-
-    if (node is AssignmentExpression &&
-        node.operator.type == TokenType.EQ &&
-        node.rightHandSide == entity) {
-      _requiredType = node.leftHandSide.staticType;
-    } else if (node is BinaryExpression &&
-        node.operator.type == TokenType.EQ_EQ &&
-        node.rightOperand == entity) {
-      _requiredType = node.leftOperand.staticType;
-    } else if (node is NamedExpression && node.expression == entity) {
-      _requiredType = node.staticParameterElement?.type;
-    } else if (node is SwitchCase && node.expression == entity) {
-      var parent = node.parent;
-      if (parent is SwitchStatement) {
-        _requiredType = parent.expression.staticType;
-      }
-    } else if (node is VariableDeclaration && node.initializer == entity) {
-      _requiredType = node.declaredElement?.type;
-    } else if (entity is Expression && entity.staticParameterElement != null) {
-      _requiredType = entity.staticParameterElement?.type;
-    }
-
-    var requiredType = _requiredType;
-    if (requiredType == null) {
-      return;
-    }
-    if (requiredType.isDynamic || requiredType.isDartCoreObject) {
-      _requiredType = null;
-      return;
-    }
-  }
-
-  /// Return `true` if the [leftType] is a subtype of the [rightType].
-  bool _isSubtypeOf(DartType leftType, DartType rightType) {
-    var typeSystem = _typeSystem;
-    if (typeSystem == null) {
-      return false;
-    }
-
-    return typeSystem.isSubtypeOf(leftType, rightType);
-  }
-
   /// Return the statement before [entity]
   /// where [entity] can be a statement or the `}` closing the given block.
   static Statement? getPreviousStatement(Block node, Object? entity) {
@@ -334,17 +257,6 @@
     if (identical(entity, node.type)) {
       optype.completionLocation = 'AsExpression_type';
       optype.includeTypeNameSuggestions = true;
-      optype.typeNameSuggestionsFilter = (DartType dartType, int relevance) {
-        var staticType = node.expression.staticType;
-        if (staticType != null &&
-            (staticType.isDynamic ||
-                (optype._isSubtypeOf(dartType, staticType) &&
-                    dartType != staticType))) {
-          return relevance;
-        } else {
-          return null;
-        }
-      };
     }
   }
 
@@ -652,7 +564,6 @@
     if (identical(entity, node.superclass2)) {
       optype.completionLocation = 'ExtendsClause_superclass';
       optype.includeTypeNameSuggestions = true;
-      optype.typeNameSuggestionsFilter = _nonMixinClasses;
     }
   }
 
@@ -947,17 +858,6 @@
     if (identical(entity, node.type)) {
       optype.completionLocation = 'IsExpression_type';
       optype.includeTypeNameSuggestions = true;
-      optype.typeNameSuggestionsFilter = (DartType dartType, int relevance) {
-        var staticType = node.expression.staticType;
-        if (staticType != null &&
-            (staticType.isDynamic ||
-                (optype._isSubtypeOf(dartType, staticType) &&
-                    dartType != staticType))) {
-          return relevance;
-        } else {
-          return null;
-        }
-      };
     }
   }
 
@@ -1473,18 +1373,6 @@
     return false;
   }
 
-  /// A filter used to disable everything except classes (such as functions and
-  /// mixins).
-  int? _nonMixinClasses(DartType type, int relevance) {
-    if (type is InterfaceType) {
-      if (type.element.isMixin) {
-        return null;
-      }
-      return relevance;
-    }
-    return null;
-  }
-
   static bool _isParameterOfGenericFunctionType(FormalParameter node) {
     var parameterList = node.parent;
     if (parameterList is DefaultFormalParameter) {
diff --git a/pkg/analyzer_plugin/lib/src/utilities/library.dart b/pkg/analyzer_plugin/lib/src/utilities/library.dart
new file mode 100644
index 0000000..8fa8383
--- /dev/null
+++ b/pkg/analyzer_plugin/lib/src/utilities/library.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Checks whether importing the library with URI [library2] into the
+/// library with URI [library1] could be a relative import.
+///
+/// Both URIs must be package: URIs and belong to the same package for this to
+/// be true.
+bool canBeRelativeImport(Uri library1, Uri library2) {
+  return library1.isScheme('package') &&
+      library2.isScheme('package') &&
+      library1.pathSegments.isNotEmpty &&
+      library2.pathSegments.isNotEmpty &&
+      library1.pathSegments.first == library2.pathSegments.first;
+}
diff --git a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
index c622af3..728782a 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
@@ -3,21 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_ast_factory.dart';
-import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/src/dart/ast/token.dart';
 
 /// A visitor that visits an [AstNode] and its parent recursively along with any
 /// declarations in those nodes. Consumers typically call [visit] which catches
 /// the exception thrown by [finished].
 abstract class LocalDeclarationVisitor extends GeneralizingAstVisitor {
-  static final NamedType STACKTRACE_TYPE = astFactory.namedType(
-    name: astFactory.simpleIdentifier(
-      StringToken(TokenType.IDENTIFIER, 'StackTrace', 0),
-    ),
-  );
-
   final int offset;
 
   LocalDeclarationVisitor(this.offset);
@@ -81,14 +72,16 @@
 
   @override
   void visitCatchClause(CatchClause node) {
-    var param = node.exceptionParameter;
-    if (param != null) {
-      declaredParam(param, node.exceptionType);
+    var exceptionParameter = node.exceptionParameter;
+    if (exceptionParameter != null) {
+      declaredParam(exceptionParameter, node.exceptionType);
     }
-    param = node.stackTraceParameter;
-    if (param != null) {
-      declaredParam(param, STACKTRACE_TYPE);
+
+    var stackTraceParameter = node.stackTraceParameter;
+    if (stackTraceParameter != null) {
+      declaredParam(stackTraceParameter, null);
     }
+
     visitNode(node);
   }
 
diff --git a/pkg/analyzer_plugin/lib/utilities/assist/assist.dart b/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
index 3e6290b..58791ae 100644
--- a/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
+++ b/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
@@ -69,7 +69,8 @@
   /// for example to allow key-binding specific fixes (or groups of).
   final String id;
 
-  /// The priority of this kind of assist for the kind of error being addressed.
+  /// The priority of this kind of assist for the kind of error being addressed
+  /// where a higher integer value indicates a higher priority and relevance.
   final int priority;
 
   /// A human-readable description of the changes that will be applied by this
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
index e407543..804c3c4c 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_core.dart
@@ -63,6 +63,10 @@
   /// that changes to the copy will not effect this change builder.
   ChangeBuilder copy();
 
+  /// Return `true` if this builder already has edits for the file with the
+  /// given [path].
+  bool hasEditsFor(String path);
+
   /// Set the selection for the change being built to the given [position].
   void setSelection(Position position);
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index 6bd6c78..4eababe 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -346,6 +346,9 @@
   ///
   /// Returns the text of the URI that will be used in the import directive.
   /// It can be different than the given [Uri].
+  ///
+  /// [uri] may be converted from an absolute URI to a relative URI depending on
+  /// user preferences/lints.
   String importLibrary(Uri uri);
 
   /// Ensure that the library with the given [uri] is imported.
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
index cf0a57b..77cc825 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
@@ -59,8 +59,8 @@
     CompletionTarget? target,
     OpType? optype,
   }) async {
-    target ??= CompletionTarget.forOffset(request.result.unit, request.offset,
-        entryPoint: entryPoint);
+    entryPoint ??= request.result.unit;
+    target ??= CompletionTarget.forOffset(entryPoint, request.offset);
     optype ??= OpType.forCompletion(target, request.offset);
     if (!optype.includeIdentifiers) {
       return;
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
index a27010c..d88f47a 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -29,7 +29,7 @@
     var containingLibrary = request.result.libraryElement;
 
     // Recompute the target since resolution may have changed it
-    var expression = _computeDotTarget(request, null);
+    var expression = _computeDotTarget(request.result.unit, request.offset);
     if (expression == null || expression.isSynthetic) {
       return;
     }
@@ -42,7 +42,7 @@
     var containingLibrary = request.result.libraryElement;
 
     // Recompute the target since resolution may have changed it
-    var expression = _computeDotTarget(request, entryPoint);
+    var expression = _computeDotTarget(entryPoint, request.offset);
     if (expression == null || expression.isSynthetic) {
       return;
     }
@@ -50,10 +50,8 @@
   }
 
   /// Update the completion [target] and [dotTarget] based on the given [unit].
-  Expression? _computeDotTarget(
-      DartCompletionRequest request, AstNode? entryPoint) {
-    var target = CompletionTarget.forOffset(request.result.unit, request.offset,
-        entryPoint: entryPoint);
+  Expression? _computeDotTarget(AstNode entryPoint, int offset) {
+    var target = CompletionTarget.forOffset(entryPoint, offset);
     return target.dotTarget;
   }
 
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index 8d5106f..5ad2871 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -253,6 +253,52 @@
   }
 
   @override
+  void visitComment(Comment node) {
+    for (var commentReference in node.references) {
+      commentReference.accept(this);
+    }
+
+    var inToolAnnotation = false;
+    for (var token in node.tokens) {
+      if (token.isEof) {
+        break;
+      }
+      var strValue = token.toString();
+      if (strValue.isEmpty) {
+        continue;
+      }
+
+      if (inToolAnnotation) {
+        if (strValue.contains('{@end-tool}')) {
+          inToolAnnotation = false;
+        } else if (strValue.contains('** See code in ')) {
+          var startIndex = strValue.indexOf('** See code in ') + 15;
+          var endIndex = strValue.indexOf('.dart') + 5;
+          var pathSnippet = strValue.substring(startIndex, endIndex);
+          var parentPath =
+              _computeParentWithExamplesAPI(node, resourceProvider);
+          if (parentPath != null) {
+            computer.collector.addRegion(
+                token.offset + startIndex,
+                token.offset + endIndex,
+                protocol.ElementKind.LIBRARY,
+                protocol.Location(
+                    resourceProvider.pathContext.join(parentPath, pathSnippet),
+                    0,
+                    0,
+                    0,
+                    0,
+                    endLine: 0,
+                    endColumn: 0));
+          }
+        }
+      } else if (strValue.contains('{@tool ')) {
+        inToolAnnotation = true;
+      }
+    }
+  }
+
+  @override
   void visitCompilationUnit(CompilationUnit unit) {
     // prepare top-level nodes sorted by their offsets
     var nodes = <AstNode>[];
@@ -476,4 +522,31 @@
       }
     }
   }
+
+  /// Given some [Comment], compute and return the parent directory absolute
+  /// path which contains the directories 'examples/api/'. Null is returned if
+  /// such directories are not found.
+  String? _computeParentWithExamplesAPI(
+      Comment node, ResourceProvider resourceProvider) {
+    var source =
+        node.thisOrAncestorOfType<CompilationUnit>()?.declaredElement?.source;
+    if (source == null) {
+      return null;
+    }
+
+    var file = resourceProvider.getFile(source.fullName);
+    if (!file.exists) {
+      return null;
+    }
+    var parent = file.parent2;
+    while (parent != parent.parent2) {
+      var examplesFolder = parent.getChildAssumingFolder('examples');
+      if (examplesFolder.exists &&
+          examplesFolder.getChildAssumingFolder('api').exists) {
+        return parent.path;
+      }
+      parent = parent.parent2;
+    }
+    return null;
+  }
 }
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index 41b859d..c8b99c8 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -1,15 +1,15 @@
 name: analyzer_plugin
 description: A framework and support code for building plugins for the analysis server.
-version: 0.8.0
+version: 0.9.0
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_plugin
 
 environment:
   sdk: '>=2.14.0 <3.0.0'
 
 dependencies:
-  analyzer: ^2.4.0
+  analyzer: ^3.0.0
   collection: ^1.15.0
-  dart_style: ^2.0.0
+  dart_style: ^2.2.1
   pub_semver: ^2.0.0
   yaml: ^3.1.0
 
diff --git a/pkg/analyzer_plugin/test/plugin/mocks.dart b/pkg/analyzer_plugin/test/plugin/mocks.dart
index 338593b..bf4de1d 100644
--- a/pkg/analyzer_plugin/test/plugin/mocks.dart
+++ b/pkg/analyzer_plugin/test/plugin/mocks.dart
@@ -159,18 +159,18 @@
   @override
   TimestampedData<String> get contents => TimestampedData(0, '');
 
+  @Deprecated('Not used anymore')
   @override
   String get encoding => '';
 
   @override
   String get fullName => '/pkg/lib/test.dart';
 
+  @Deprecated('Use uri.isScheme("dart") instead')
   @override
   bool get isInSystemLibrary => false;
 
-  @override
-  Source get librarySource => this;
-
+  @Deprecated('Not used anymore')
   @override
   int get modificationStamp => 0;
 
@@ -178,11 +178,9 @@
   String get shortName => 'test.dart';
 
   @override
-  Source get source => this;
-
-  @override
   Uri get uri => Uri.parse('package:test/test.dart');
 
+  @Deprecated('Use Source.uri instead')
   @override
   UriKind get uriKind => UriKind.PACKAGE_URI;
 
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 047e7a1..481147a 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -1868,6 +1868,42 @@
 ''');
   }
 
+  Future<void> test_multipleEdits_concurrently() async {
+    var initialCode = '00';
+    var path = convertPath('/home/test/lib/test.dart');
+    newFile(path, content: initialCode);
+
+    var builder = newBuilder();
+    var future = Future.wait([
+      builder.addDartFileEdit(path, (builder) {
+        builder.addSimpleInsertion(0, '11');
+      }),
+      builder.addDartFileEdit(path, (builder) {
+        builder.addSimpleInsertion(2, '22');
+      }),
+    ]);
+
+    expect(future, throwsA(TypeMatcher<StateError>()));
+  }
+
+  Future<void> test_multipleEdits_sequentially() async {
+    var initialCode = '00';
+    var path = convertPath('/home/test/lib/test.dart');
+    newFile(path, content: initialCode);
+
+    var builder = newBuilder();
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addSimpleInsertion(0, '11');
+    });
+    await builder.addDartFileEdit(path, (builder) {
+      builder.addSimpleInsertion(2, '22');
+    });
+
+    var edits = getEdits(builder);
+    var resultCode = SourceEdit.applySequence(initialCode, edits);
+    expect(resultCode, '110022');
+  }
+
   Future<void> test_replaceTypeWithFuture() async {
     var path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index bdd1c69..21e8f64 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -8,7 +8,6 @@
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:analyzer/src/test_utilities/find_node.dart';
 import 'package:test/test.dart';
@@ -39,7 +38,10 @@
         as SimpleIdentifier;
   }
 
-  AstNode? findNodeAtOffset(int offset, [Predicate<AstNode>? predicate]) {
+  AstNode? findNodeAtOffset(
+    int offset, [
+    bool Function(AstNode)? predicate,
+  ]) {
     var result = NodeLocator(offset).searchWithin(testUnit);
     if (result != null && predicate != null) {
       result = result.thisOrAncestorMatching(predicate);
@@ -47,13 +49,18 @@
     return result;
   }
 
-  AstNode? findNodeAtString(String search, [Predicate<AstNode>? predicate]) {
+  AstNode? findNodeAtString(
+    String search, [
+    bool Function(AstNode)? predicate,
+  ]) {
     var offset = findOffset(search);
     return findNodeAtOffset(offset, predicate);
   }
 
-  Element? findNodeElementAtString(String search,
-      [Predicate<AstNode>? predicate]) {
+  Element? findNodeElementAtString(
+    String search, [
+    bool Function(AstNode)? predicate,
+  ]) {
     var node = findNodeAtString(search, predicate);
     if (node == null) {
       return null;
diff --git a/pkg/analyzer_utilities/lib/check/bool.dart b/pkg/analyzer_utilities/lib/check/bool.dart
new file mode 100644
index 0000000..1b13751
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/bool.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+
+extension BoolExtension on CheckTarget<bool> {
+  void get isFalse {
+    if (value) {
+      fail('is not false');
+    }
+  }
+
+  void get isTrue {
+    if (!value) {
+      fail('is not true');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/check.dart b/pkg/analyzer_utilities/lib/check/check.dart
new file mode 100644
index 0000000..54b57c9
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/check.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check_target.dart';
+import 'package:meta/meta.dart';
+
+export 'package:analyzer_utilities/check/bool.dart';
+export 'package:analyzer_utilities/check/check_target.dart';
+export 'package:analyzer_utilities/check/equality.dart';
+export 'package:analyzer_utilities/check/int.dart';
+export 'package:analyzer_utilities/check/iterable.dart';
+export 'package:analyzer_utilities/check/nullability.dart';
+export 'package:analyzer_utilities/check/string.dart';
+export 'package:analyzer_utilities/check/type.dart';
+
+@useResult
+CheckTarget<T> check<T>(T value) {
+  return CheckTarget(value, 0, () => '$value');
+}
diff --git a/pkg/analyzer_utilities/lib/check/check_target.dart b/pkg/analyzer_utilities/lib/check/check_target.dart
new file mode 100644
index 0000000..d22a1ac
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/check_target.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart' as test_package;
+
+class CheckTarget<T> {
+  final T value;
+  final int _depth;
+
+  /// The function that return the description of the value, and of the
+  /// chain how we arrived to this value.
+  final String Function() _describe;
+
+  CheckTarget(this.value, this._depth, this._describe);
+
+  String get _indent => '  ' * (_depth + 1);
+
+  Never fail(String message) {
+    test_package.fail(_describe() + '\n' + _indent + message);
+  }
+
+  /// Chains to the given [value]; if a subsequent check fails, [describe]
+  /// will be invoked to describe the [value].
+  CheckTarget<U> nest<U>(
+    U value,
+    String Function(U value) describe,
+  ) {
+    return CheckTarget(value, _depth + 1, () {
+      return _describe() + '\n' + _indent + describe(value);
+    });
+  }
+
+  String valueStr(value) {
+    if (value is String) {
+      return "'$value'";
+    }
+    return '$value';
+  }
+
+  /// Use this if multiple checks are required on the value.
+  void which(void Function(CheckTarget<T> e) checker) {
+    checker(this);
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/equality.dart b/pkg/analyzer_utilities/lib/check/equality.dart
new file mode 100644
index 0000000..2d265b8
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/equality.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+
+extension EqualityExtension<T> on CheckTarget<T> {
+  void isEqualTo(Object? other) {
+    if (value != other) {
+      fail('is not equal to $other');
+    }
+  }
+
+  void isNotEqualTo(Object? other) {
+    if (value == other) {
+      fail('is equal to $other');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/int.dart b/pkg/analyzer_utilities/lib/check/int.dart
new file mode 100644
index 0000000..59587b2
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/int.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+
+extension IntExtension on CheckTarget<int> {
+  void get isZero {
+    if (value != 0) {
+      fail('is not zero');
+    }
+  }
+
+  void isGreaterThan(int other) {
+    if (!(value > other)) {
+      fail('is not greater than $other');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/iterable.dart b/pkg/analyzer_utilities/lib/check/iterable.dart
new file mode 100644
index 0000000..0e3e0d3
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/iterable.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+import 'package:meta/meta.dart';
+
+extension IterableExtension<T> on CheckTarget<Iterable<T>> {
+  void get isEmpty {
+    if (value.isNotEmpty) {
+      fail('is not empty');
+    }
+  }
+
+  void get isNotEmpty {
+    if (value.isEmpty) {
+      fail('is empty');
+    }
+  }
+
+  @UseResult.unless(parameterDefined: 'expected')
+  CheckTarget<int> hasLength([int? expected]) {
+    var actual = value.length;
+
+    if (expected != null && actual != expected) {
+      fail('does not have length ${valueStr(expected)}');
+    }
+
+    return nest(actual, (length) => 'has length $length');
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/nullability.dart b/pkg/analyzer_utilities/lib/check/nullability.dart
new file mode 100644
index 0000000..ef1860e
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/nullability.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+
+extension NullabilityExtension<T> on CheckTarget<T?> {
+  CheckTarget<T> get isNotNull {
+    final value = this.value;
+    if (value == null) {
+      fail('is null');
+    }
+    return nest(value, (value) => 'is not null');
+  }
+
+  void get isNull {
+    if (value != null) {
+      fail('is not null');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/string.dart b/pkg/analyzer_utilities/lib/check/string.dart
new file mode 100644
index 0000000..75278b8
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/string.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+import 'package:meta/meta.dart';
+
+extension StringExtension on CheckTarget<String> {
+  void contains(Pattern other) {
+    if (!value.contains(other)) {
+      fail('does not contain ${valueStr(other)}');
+    }
+  }
+
+  @UseResult.unless(parameterDefined: 'expected')
+  CheckTarget<int> hasLength([int? expected]) {
+    var actual = value.length;
+
+    if (expected != null && actual != expected) {
+      fail('does not have length ${valueStr(expected)}');
+    }
+
+    return nest(actual, (length) => 'has length $length');
+  }
+
+  void startsWith(Pattern other) {
+    if (!value.startsWith(other)) {
+      fail('does not start with ${valueStr(other)}');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/check/type.dart b/pkg/analyzer_utilities/lib/check/type.dart
new file mode 100644
index 0000000..ea28b9e
--- /dev/null
+++ b/pkg/analyzer_utilities/lib/check/type.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+
+extension IsExtension<T> on CheckTarget<T> {
+  CheckTarget<U> isA<U extends T>() {
+    final value = this.value;
+    if (value is U) {
+      return nest(value, (_) => 'is of type $U');
+    } else {
+      fail('is not of type $U');
+    }
+  }
+}
diff --git a/pkg/analyzer_utilities/lib/tools.dart b/pkg/analyzer_utilities/lib/tools.dart
index a072d85..00724c7 100644
--- a/pkg/analyzer_utilities/lib/tools.dart
+++ b/pkg/analyzer_utilities/lib/tools.dart
@@ -283,14 +283,8 @@
     if (generateNeeded) {
       print('Please regenerate using:');
       var executable = Platform.executable;
-      var packageRoot = '';
-      // ignore: deprecated_member_use
-      if (Platform.packageRoot != null) {
-        // ignore: deprecated_member_use
-        packageRoot = ' --package-root=${Platform.packageRoot}';
-      }
       var generateScript = normalize(joinAll(posix.split(generatorPath)));
-      print('  $executable$packageRoot $generateScript ${args.join(" ")}');
+      print('  $executable $generateScript ${args.join(" ")}');
       fail('Error codes need to be generated');
     } else {
       print('All generated files up to date.');
diff --git a/pkg/analyzer_utilities/pubspec.yaml b/pkg/analyzer_utilities/pubspec.yaml
index a8426e4..d0aac18 100644
--- a/pkg/analyzer_utilities/pubspec.yaml
+++ b/pkg/analyzer_utilities/pubspec.yaml
@@ -9,5 +9,7 @@
   analyzer:
     path: ../analyzer
   html: any
+  meta:
+    path: ../meta
   path: any
   test: any
diff --git a/pkg/analyzer_utilities/test/check/check_test.dart b/pkg/analyzer_utilities/test/check/check_test.dart
new file mode 100644
index 0000000..907438f
--- /dev/null
+++ b/pkg/analyzer_utilities/test/check/check_test.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_utilities/check/check.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('type', () {
+    group('bool', () {
+      test('isEqualTo', () {
+        check(true).isEqualTo(true);
+        check(false).isEqualTo(false);
+        _fails(() => check(true).isEqualTo(false));
+        _fails(() => check(false).isEqualTo(true));
+      });
+      test('isFalse', () {
+        check(false).isFalse;
+        _fails(() => check(true).isFalse);
+      });
+      test('isNotEqualTo', () {
+        check(true).isNotEqualTo(false);
+        check(false).isNotEqualTo(true);
+        _fails(() => check(true).isNotEqualTo(true));
+        _fails(() => check(false).isNotEqualTo(false));
+      });
+      test('isTrue', () {
+        check(true).isTrue;
+        _fails(() => check(false).isTrue);
+      });
+    });
+    group('int', () {
+      test('isEqualTo', () {
+        check(0).isEqualTo(0);
+        check(1).isEqualTo(1);
+        check(2).isEqualTo(2);
+        _fails(() => check(0).isEqualTo(1));
+        _fails(() => check(1).isEqualTo(0));
+      });
+      test('isGreaterThan', () {
+        check(2).isGreaterThan(1);
+        check(1).isGreaterThan(0);
+        check(-1).isGreaterThan(-2);
+        _fails(() => check(0).isGreaterThan(0));
+        _fails(() => check(0).isGreaterThan(1));
+        _fails(() => check(1).isGreaterThan(2));
+        _fails(() => check(-2).isGreaterThan(-1));
+      });
+      test('isNotEqualTo', () {
+        check(0).isNotEqualTo(1);
+        check(1).isNotEqualTo(0);
+        check(1).isNotEqualTo(2);
+        check(2).isNotEqualTo(1);
+        _fails(() => check(0).isNotEqualTo(0));
+        _fails(() => check(1).isNotEqualTo(1));
+        _fails(() => check(2).isNotEqualTo(2));
+      });
+      test('isZero', () {
+        check(0).isZero;
+        _fails(() => check(1).isZero);
+        _fails(() => check(-1).isZero);
+      });
+    });
+    group('Iterable', () {
+      test('hasLength', () {
+        check(<int>[]).hasLength().isZero;
+        check(<int>[0]).hasLength().isEqualTo(1);
+        check(<int>[0]).hasLength(1);
+        check(<int>[0, 1]).hasLength().isEqualTo(2);
+        check(<int>[0, 1]).hasLength(2);
+        check(<int>{}).hasLength().isZero;
+        check(<int>{0}).hasLength().isEqualTo(1);
+        check(<int>{0}).hasLength(1);
+        check(<int>{0, 1}).hasLength().isEqualTo(2);
+        check(<int>{0, 1}).hasLength(2);
+        _fails(() => check(<int>[]).hasLength(1));
+        _fails(() => check(<int>[]).hasLength(2));
+        _fails(() => check(<int>{}).hasLength(1));
+        _fails(() => check(<int>{}).hasLength(2));
+        _fails(() => check(<int>[]).hasLength().isEqualTo(1));
+        _fails(() => check(<int>[0]).hasLength().isEqualTo(0));
+      });
+      test('isEmpty', () {
+        check(<int>[]).isEmpty;
+        check(<int>{}).isEmpty;
+        _fails(() => check([0]).isEmpty);
+        _fails(() => check([0, 1]).isEmpty);
+        _fails(() => check({0}).isEmpty);
+        _fails(() => check({0, 1}).isEmpty);
+      });
+      test('isNotEmpty', () {
+        check([0]).isNotEmpty;
+        check([0, 1]).isNotEmpty;
+        check({0}).isNotEmpty;
+        check({0, 1}).isNotEmpty;
+        _fails(() => check(<int>[]).isNotEmpty);
+        _fails(() => check(<int>{}).isNotEmpty);
+      });
+    });
+    group('nullability', () {
+      const int? notNullable = 0;
+      const int? nullable = null;
+      test('isNotNull', () {
+        check(notNullable).isNotNull;
+        _fails(() => check(nullable).isNotNull.isZero);
+      });
+      test('isNull', () {
+        check(nullable).isNull;
+        _fails(() => check(notNullable).isNull);
+      });
+    });
+    group('String', () {
+      test('contains', () {
+        check('abc').contains('a');
+        check('abc').contains('b');
+        check('abc').contains('c');
+        check('abc').contains('ab');
+        check('abc').contains('bc');
+        check('abc').contains(RegExp('a'));
+        check('abc').contains(RegExp('a.'));
+        check('abc').contains(RegExp('a.c'));
+        check('abc').contains(RegExp('.b.'));
+        _fails(() => check('abc').contains('x'));
+        _fails(() => check('abc').contains('ac'));
+        _fails(() => check('abc').contains(RegExp('ac.')));
+      });
+      test('hasLength', () {
+        check('').hasLength().isZero;
+        check('').hasLength(0);
+        check('a').hasLength().isEqualTo(1);
+        check('a').hasLength(1);
+        check('abc').hasLength().isEqualTo(3);
+        check('abc').hasLength(3);
+        _fails(() => check('abc').hasLength(0));
+        _fails(() => check('abc').hasLength(1));
+        _fails(() => check('abc').hasLength(2));
+      });
+      test('isEqualTo', () {
+        check('').isEqualTo('');
+        check('abc').isEqualTo('abc');
+        check('foobar').isEqualTo('foobar');
+        _fails(() => check('abc').isEqualTo('ab'));
+        _fails(() => check('abc').isEqualTo('xyz'));
+      });
+      test('isNotEqualTo', () {
+        check('abc').isNotEqualTo('ab');
+        check('abc').isNotEqualTo('xyz');
+        _fails(() => check('abc').isNotEqualTo('abc'));
+        _fails(() => check('foobar').isNotEqualTo('foobar'));
+      });
+      test('startsWith', () {
+        check('abc').startsWith('a');
+        check('abc').startsWith('ab');
+        check('abc').startsWith('abc');
+        check('abc').startsWith(RegExp('..c'));
+        check('abc').startsWith(RegExp('.*c'));
+        _fails(() => check('abc').startsWith('b'));
+        _fails(() => check('abc').startsWith('x'));
+        _fails(() => check('abc').startsWith(RegExp('.c')));
+      });
+    });
+    group('type', () {
+      test('isA', () {
+        check(0).isA<int>();
+        _fails(() => check('abc' as dynamic).isA<int>());
+      });
+    });
+    test('which', () {
+      check(0).which((e) => e.isZero);
+      _fails(() => check(1).which((e) => e.isZero));
+    });
+  });
+}
+
+void _fails(void Function() f) {
+  try {
+    f();
+  } on TestFailure {
+    return;
+  }
+  fail('expected to fail');
+}
diff --git a/pkg/compiler/analysis_options.yaml b/pkg/compiler/analysis_options.yaml
index 2ab9f2f..1645941 100644
--- a/pkg/compiler/analysis_options.yaml
+++ b/pkg/compiler/analysis_options.yaml
@@ -5,9 +5,6 @@
 analyzer:
   errors:
     todo: ignore
-    # Allow cross-package deprecated calls
-    # TODO(srawlins): clean these up and remove this "ignore."
-    deprecated_member_use: ignore
     # Allow deprecated calls from within the same package
     deprecated_member_use_from_same_package: ignore
 
diff --git a/pkg/compiler/lib/compiler_new.dart b/pkg/compiler/lib/compiler_new.dart
index 4b1d89f..5a4ccc8 100644
--- a/pkg/compiler/lib/compiler_new.dart
+++ b/pkg/compiler/lib/compiler_new.dart
@@ -82,6 +82,9 @@
   /// Deferred map output.
   deferredMap,
 
+  /// Unused libraries output.
+  dumpUnusedLibraries,
+
   /// Implementation specific output used for debugging the compiler.
   debug,
 }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 8737b26..18fa4cb 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -175,6 +175,9 @@
   // For backward compatibility the option is still accepted, but it is ignored.
   static const String initializingFormalAccess = '--initializing-formal-access';
 
+  // Whether or not to dump a list of unused libraries.
+  static const String dumpUnusedLibraries = '--dump-unused-libraries';
+
   // Experimental flags.
   static const String resolveOnly = '--resolve-only';
 
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index e8b8488..3f766ba 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -23,6 +23,7 @@
 import '../js_backend/string_reference.dart' show StringReference;
 import '../js_backend/type_reference.dart' show TypeReference;
 import '../js_emitter/code_emitter_task.dart' show Emitter;
+import '../js_model/elements.dart' show JGeneratorBody;
 import '../js_model/type_recipe.dart' show TypeRecipe;
 import '../native/behavior.dart';
 import '../serialization/serialization.dart';
@@ -720,32 +721,35 @@
     sink.end(tag);
   }
 
+  @override
+  bool get isFinalized => _value != null;
+
   js.Name get value {
-    assert(_value != null, 'value not set for $this');
+    assert(isFinalized, 'value not set for $this');
     return _value;
   }
 
   void set value(js.Name node) {
-    assert(_value == null);
+    assert(!isFinalized);
     assert(node != null);
     _value = node.withSourceInformation(sourceInformation);
   }
 
   @override
   String get key {
-    assert(_value != null);
+    assert(isFinalized);
     return _value.key;
   }
 
   @override
   String get name {
-    assert(_value != null, 'value not set for $this');
+    assert(isFinalized, 'value not set for $this');
     return _value.name;
   }
 
   @override
   bool get allowRename {
-    assert(_value != null, 'value not set for $this');
+    assert(isFinalized, 'value not set for $this');
     return _value.allowRename;
   }
 
@@ -771,6 +775,98 @@
   @override
   String toString() =>
       'ModularName(kind=$kind, data=$data, value=${_value?.key})';
+
+  @override
+  String nonfinalizedDebugText() {
+    switch (kind) {
+      case ModularNameKind.rtiField:
+        return r'ModularName"$ti"';
+      case ModularNameKind.instanceField:
+        return 'ModularName"field:${(data as Entity).name}"';
+      case ModularNameKind.instanceMethod:
+        return 'ModularName"${_instanceMethodName(data)}"';
+      case ModularNameKind.methodProperty:
+        return 'ModularName"methodProperty:${(data as Entity).name}"';
+      case ModularNameKind.operatorIs:
+        return 'ModularName"is:${_className(data)}"';
+      case ModularNameKind.className:
+        return 'ModularName"class:${_className(data)}"';
+      case ModularNameKind.globalPropertyNameForClass:
+        return 'ModularName"classref:${_className(data)}"';
+      case ModularNameKind.aliasedSuperMember:
+        MemberEntity member = (data as MemberEntity);
+        String className = _className(member.enclosingClass);
+        String invocationName = Namer.operatorNameToIdentifier(member.name);
+        final description = "$className.$invocationName";
+        return 'ModularName"alias:$description"';
+      case ModularNameKind.staticClosure:
+        return 'ModularName"closure:${_qualifiedStaticName(data)}"';
+      case ModularNameKind.lazyInitializer:
+        return 'ModularName"lazy:${(data as MemberEntity).name}"';
+      case ModularNameKind.globalPropertyNameForMember:
+        MemberEntity member = data as MemberEntity;
+        return 'ModularName"ref:${_qualifiedStaticName(member)}"';
+      case ModularNameKind.invocation:
+        return 'ModularName"selector:${_selectorText(data as Selector)}"';
+      case ModularNameKind.nameForOneShotInterceptor:
+        return 'ModularName"oneshot:${_selectorText(data as Selector)}"';
+      case ModularNameKind.globalNameForInterfaceTypeVariable:
+        break;
+      case ModularNameKind.nameForGetInterceptor:
+        return 'ModularName"getInterceptor"';
+      case ModularNameKind.asName:
+        return 'ModularName"asName:$data"';
+    }
+    return super.nonfinalizedDebugText();
+  }
+
+  String _className(ClassEntity cls) {
+    return cls.name.replaceAll('&', '_');
+  }
+
+  String _qualifiedStaticName(MemberEntity member) {
+    if (member.isConstructor || member.isStatic) {
+      return '${_className(member.enclosingClass)}.${member.name}';
+    }
+    return member.name;
+  }
+
+  String _instanceMethodInvocationName(MemberEntity member) {
+    String invocationName = Namer.operatorNameToIdentifier(member.name);
+    if (member.isGetter) invocationName = r'get$' + invocationName;
+    if (member.isSetter) invocationName = r'set$' + invocationName;
+    return invocationName;
+  }
+
+  String _instanceMethodName(MemberEntity member) {
+    if (member is ConstructorBodyEntity) {
+      return 'constructorBody:${_qualifiedStaticName(member.constructor)}';
+    }
+    if (member is JGeneratorBody) {
+      MemberEntity function = member.function;
+      return 'generatorBody:'
+          '${_className(function.enclosingClass)}.'
+          '${_instanceMethodInvocationName(function)}';
+    }
+    return 'instanceMethod:${_instanceMethodInvocationName(member)}';
+  }
+
+  String _selectorText(Selector selector) {
+    // Approximation to unminified selector.
+    if (selector.isGetter) return r'get$' + selector.name;
+    if (selector.isSetter) return r'set$' + selector.name;
+    if (selector.isOperator || selector.isIndex || selector.isIndexSet) {
+      return Namer.operatorNameToIdentifier(selector.name);
+    }
+    List<String> parts = [
+      selector.name,
+      if (selector.callStructure.typeArgumentCount > 0)
+        '${selector.callStructure.typeArgumentCount}',
+      '${selector.callStructure.argumentCount}',
+      ...selector.callStructure.getOrderedNamedArguments()
+    ];
+    return parts.join(r'$');
+  }
 }
 
 enum ModularExpressionKind {
@@ -819,13 +915,16 @@
   }
 
   @override
+  bool get isFinalized => _value != null;
+
+  @override
   js.Expression get value {
-    assert(_value != null);
+    assert(isFinalized);
     return _value;
   }
 
   void set value(js.Expression node) {
-    assert(_value == null);
+    assert(!isFinalized);
     assert(node != null);
     _value = node.withSourceInformation(sourceInformation);
   }
@@ -863,6 +962,17 @@
     sb.write(',value=$_value)');
     return sb.toString();
   }
+
+  @override
+  String nonfinalizedDebugText() {
+    switch (kind) {
+      case ModularExpressionKind.constant:
+        return 'ModularExpression"<constant>"';
+      case ModularExpressionKind.embeddedGlobalAccess:
+        return 'ModularExpression"init.$data"';
+    }
+    return super.nonfinalizedDebugText();
+  }
 }
 
 enum JsNodeKind {
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 84c3c2b..cead301 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -302,6 +302,8 @@
 
   InterfaceType get jsJavaScriptFunctionType;
 
+  ClassEntity get jsLegacyJavaScriptObjectClass;
+
   ClassEntity get jsJavaScriptObjectClass;
 
   ClassEntity get jsIndexableClass;
@@ -1348,6 +1350,12 @@
   InterfaceType get jsJavaScriptFunctionType =>
       _getRawType(jsJavaScriptFunctionClass);
 
+  ClassEntity _jsLegacyJavaScriptObjectClass;
+  @override
+  ClassEntity get jsLegacyJavaScriptObjectClass =>
+      _jsLegacyJavaScriptObjectClass ??=
+          _findInterceptorsClass('LegacyJavaScriptObject');
+
   ClassEntity _jsJavaScriptObjectClass;
   @override
   ClassEntity get jsJavaScriptObjectClass =>
@@ -2166,7 +2174,7 @@
   ClassEntity getDefaultSuperclass(
       ClassEntity cls, NativeBasicData nativeBasicData) {
     if (nativeBasicData.isJsInteropClass(cls)) {
-      return jsJavaScriptObjectClass;
+      return jsLegacyJavaScriptObjectClass;
     }
     // Native classes inherit from Interceptor.
     return nativeBasicData.isNativeClass(cls)
@@ -2228,13 +2236,13 @@
   /// Return `null` if the member is not found in the class or any superclass.
   MemberEntity lookupClassMember(ClassEntity cls, String name,
       {bool setter = false}) {
-    var entity = lookupLocalClassMember(cls, name, setter: setter);
-    if (entity != null) return entity;
+    while (true) {
+      final entity = lookupLocalClassMember(cls, name, setter: setter);
+      if (entity != null) return entity;
 
-    var superclass = getSuperClass(cls);
-    if (superclass == null) return null;
-
-    return lookupClassMember(superclass, name, setter: setter);
+      cls = getSuperClass(cls);
+      if (cls == null) return null;
+    }
   }
 
   /// Lookup the constructor [name] in [cls], fail if the class is missing and
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index b899fbe..dad3d720 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -5,6 +5,7 @@
 library dart2js.compiler_base;
 
 import 'dart:async' show Future;
+import 'dart:convert' show jsonEncode;
 
 import 'package:front_end/src/api_unstable/dart2js.dart'
     show clearStringTokenCanonicalizer;
@@ -178,8 +179,7 @@
     enqueuer = EnqueueTask(this);
 
     tasks = [
-      kernelLoader = KernelLoaderTask(
-          options, provider, _outputProvider, reporter, measurer),
+      kernelLoader = KernelLoaderTask(options, provider, reporter, measurer),
       kernelFrontEndTask,
       globalInference = GlobalTypeInferenceTask(this),
       deferredLoadTask = frontendStrategy.createDeferredLoadTask(this),
@@ -247,6 +247,31 @@
     return options.readClosedWorldUri != null && options.readDataUri != null;
   }
 
+  /// Dumps a list of unused [ir.Library]'s in the [KernelResult]. This *must*
+  /// be called before [setMainAndTrimComponent], because that method will
+  /// discard the unused [ir.Library]s.
+  void dumpUnusedLibraries(KernelResult result) {
+    var usedUris = result.libraries.toSet();
+    bool isUnused(ir.Library l) => !usedUris.contains(l.importUri);
+    String libraryString(ir.Library library) {
+      return '${library.importUri}(${library.fileUri})';
+    }
+
+    var unusedLibraries =
+        result.component.libraries.where(isUnused).map(libraryString).toList();
+    unusedLibraries.sort();
+    var jsonLibraries = jsonEncode(unusedLibraries);
+    outputProvider.createOutputSink(options.outputUri.pathSegments.last,
+        'unused.json', api.OutputType.dumpUnusedLibraries)
+      ..add(jsonLibraries)
+      ..close();
+    reporter.reportInfo(
+        reporter.createMessage(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, {
+      'text': "${unusedLibraries.length} unused libraries out of "
+          "${result.component.libraries.length}. Dumping to JSON."
+    }));
+  }
+
   Future runInternal() async {
     clearState();
     var compilationTarget = options.compilationTarget;
@@ -275,13 +300,8 @@
           performGlobalTypeInference(closedWorldAndIndices.closedWorld);
       var indices = closedWorldAndIndices.indices;
       if (options.writeDataUri != null) {
-        if (options.noClosedWorldInData) {
-          serializationTask.serializeGlobalTypeInference(
-              globalTypeInferenceResults, indices);
-        } else {
-          serializationTask
-              .serializeGlobalTypeInferenceLegacy(globalTypeInferenceResults);
-        }
+        serializationTask.serializeGlobalTypeInference(
+            globalTypeInferenceResults, indices);
         return;
       }
       await generateJavaScriptCode(globalTypeInferenceResults,
@@ -301,12 +321,6 @@
               closedWorldAndIndices);
       await generateJavaScriptCode(globalTypeInferenceResults,
           indices: closedWorldAndIndices.indices);
-    } else if (options.readDataUri != null) {
-      // TODO(joshualitt) delete and clean up after google3 roll
-      var globalTypeInferenceResults =
-          await serializationTask.deserializeGlobalTypeInferenceLegacy(
-              environment, abstractValueStrategy);
-      await generateJavaScriptCode(globalTypeInferenceResults);
     } else {
       KernelResult result = await kernelLoader.load();
       reporter.log("Kernel load complete");
@@ -317,7 +331,6 @@
       if (retainDataForTesting) {
         componentForTesting = result.component;
       }
-      if (options.cfeOnly) return;
 
       frontendStrategy.registerLoadedLibraries(result);
 
@@ -325,12 +338,30 @@
         await runModularAnalysis(result);
       } else {
         List<ModuleData> data;
-        if (options.modularAnalysisInputs != null) {
+        if (options.hasModularAnalysisInputs) {
           data =
               await serializationTask.deserializeModuleData(result.component);
         }
         frontendStrategy.registerModuleData(data);
-        await compileFromKernel(result.rootLibraryUri, result.libraries);
+
+        // After we've deserialized modular data, we trim the component of any
+        // unnecessary dependencies.
+        // Note: It is critical we wait to trim the dill until after we've
+        // deserialized modular data because some of this data may reference
+        // 'trimmed' elements.
+        if (options.fromDill) {
+          if (options.dumpUnusedLibraries) {
+            dumpUnusedLibraries(result);
+          }
+          if (options.entryUri != null) {
+            result.trimComponent();
+          }
+        }
+        if (options.cfeOnly) {
+          await serializationTask.serializeComponent(result.component);
+        } else {
+          await compileFromKernel(result.rootLibraryUri, result.libraries);
+        }
       }
     }
   }
@@ -543,16 +574,6 @@
       if (stopAfterClosedWorld || options.stopAfterProgramSplit) return;
       GlobalTypeInferenceResults globalInferenceResults =
           performGlobalTypeInference(closedWorld);
-      if (options.writeDataUri != null) {
-        // TODO(joshualitt) delete after google3 roll.
-        if (options.noClosedWorldInData) {
-          throw '"no-closed-world-in-data" requires serializing closed world.';
-        } else {
-          serializationTask
-              .serializeGlobalTypeInferenceLegacy(globalInferenceResults);
-        }
-        return;
-      }
       if (options.testMode) {
         globalInferenceResults =
             globalTypeInferenceResultsTestMode(globalInferenceResults);
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 144d936..86abfd0 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -857,10 +857,16 @@
   ConstantValueKind get kind => ConstantValueKind.JS_NAME;
 
   @override
-  String toDartText(DartTypes dartTypes) => 'js_name(${name})';
+  String toDartText(DartTypes dartTypes) {
+    if (name.isFinalized) 'js_name(${name})';
+    return 'js_name(name.nonfinalizedDebugText())';
+  }
 
   @override
-  String toStructuredText(DartTypes dartTypes) => 'JsNameConstant(${name})';
+  String toStructuredText(DartTypes dartTypes) {
+    if (name.isFinalized) return 'JsNameConstant(${name})';
+    return 'JsNameConstant(name.nonfinalizedDebugText())';
+  }
 }
 
 /// A constant used as the dummy receiver value for intercepted calls with
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index bd60c69..8a49df4 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -548,7 +548,7 @@
         setWriteModularAnalysis),
     OptionHandler('${Flags.readData}|${Flags.readData}=.+', setReadData),
     OptionHandler('${Flags.writeData}|${Flags.writeData}=.+', setWriteData),
-    OptionHandler(Flags.noClosedWorldInData, passThrough),
+    OptionHandler(Flags.noClosedWorldInData, ignoreOption),
     OptionHandler('${Flags.readClosedWorld}|${Flags.readClosedWorld}=.+',
         setReadClosedWorld),
     OptionHandler('${Flags.writeClosedWorld}|${Flags.writeClosedWorld}=.+',
@@ -627,6 +627,7 @@
     OptionHandler(Flags.benchmarkingExperiment, passThrough),
     OptionHandler(Flags.soundNullSafety, setNullSafetyMode),
     OptionHandler(Flags.noSoundNullSafety, setNullSafetyMode),
+    OptionHandler(Flags.dumpUnusedLibraries, passThrough),
 
     // TODO(floitsch): remove conditional directives flag.
     // We don't provide the info-message yet, since we haven't publicly
@@ -664,10 +665,17 @@
     // Wire up feature flags.
     OptionHandler(Flags.canary, passThrough),
     OptionHandler(Flags.noShipping, passThrough),
+    // Shipped features.
+    for (var feature in features.shipped)
+      OptionHandler('--${feature.flag}', passThrough),
+    for (var feature in features.shipped)
+      OptionHandler('--no-${feature.flag}', passThrough),
+    // Shipping features.
     for (var feature in features.shipping)
       OptionHandler('--${feature.flag}', passThrough),
     for (var feature in features.shipping)
       OptionHandler('--no-${feature.flag}', passThrough),
+    // Canary features.
     for (var feature in features.canary)
       OptionHandler('--${feature.flag}', passThrough),
     for (var feature in features.canary)
@@ -825,9 +833,7 @@
       if (readStrategy == ReadStrategy.fromCodegen) {
         fail("Cannot read and write serialized codegen simultaneously.");
       }
-      // TODO(joshualitt) cleanup after google3 roll.
-      if (readStrategy != ReadStrategy.fromData &&
-          readStrategy != ReadStrategy.fromDataAndClosedWorld) {
+      if (readStrategy != ReadStrategy.fromDataAndClosedWorld) {
         fail("Can only write serialized codegen from serialized data.");
       }
       if (codegenShards == null) {
@@ -855,10 +861,7 @@
       options.add('${Flags.readClosedWorld}=${readClosedWorldUri}');
       break;
     case ReadStrategy.fromData:
-      // TODO(joshualitt): fail after Google3 roll.
-      // fail("Must read from closed world and data.");
-      readDataUri ??= Uri.base.resolve('$scriptName.data');
-      options.add('${Flags.readData}=${readDataUri}');
+      fail("Must read from closed world and data.");
       break;
     case ReadStrategy.fromDataAndClosedWorld:
       readClosedWorldUri ??= Uri.base.resolve('$scriptName.world');
@@ -868,19 +871,6 @@
       break;
     case ReadStrategy.fromCodegen:
     case ReadStrategy.fromCodegenAndData:
-      // TODO(joshualitt): fall through to fail after google3 roll.
-      readDataUri ??= Uri.base.resolve('$scriptName.data');
-      options.add('${Flags.readData}=${readDataUri}');
-      readCodegenUri ??= Uri.base.resolve('$scriptName.code');
-      options.add('${Flags.readCodegen}=${readCodegenUri}');
-      if (codegenShards == null) {
-        fail("Cannot write serialized codegen without setting "
-            "${Flags.codegenShards}.");
-      } else if (codegenShards <= 0) {
-        fail("${Flags.codegenShards} must be a positive integer.");
-      }
-      options.add('${Flags.codegenShards}=$codegenShards');
-      break;
     case ReadStrategy.fromCodegenAndClosedWorld:
       fail("Must read from closed world, data, and codegen");
       break;
@@ -929,7 +919,7 @@
     String summary;
     switch (readStrategy) {
       case ReadStrategy.fromDart:
-        inputName = 'characters Dart';
+        inputName = inputDillUri != null ? 'kernel bytes' : 'characters Dart';
         inputSize = inputProvider.dartCharactersRead;
         summary = 'Dart file $input ';
         break;
@@ -941,13 +931,7 @@
         summary = 'Data files $input and $dataInput ';
         break;
       case ReadStrategy.fromData:
-        // TODO(joshualitt): fail after google3 roll.
-        //fail("Must read from closed world and data.");
-        inputName = 'bytes data';
-        inputSize = inputProvider.dartCharactersRead;
-        String dataInput =
-            fe.relativizeUri(Uri.base, readDataUri, Platform.isWindows);
-        summary = 'Data files $input and $dataInput ';
+        fail("Must read from closed world and data.");
         break;
       case ReadStrategy.fromDataAndClosedWorld:
         inputName = 'bytes data';
@@ -960,16 +944,6 @@
         break;
       case ReadStrategy.fromCodegen:
       case ReadStrategy.fromCodegenAndData:
-        // TODO(joshualitt): Fall through to fail after google3 roll.
-        inputName = 'bytes data';
-        inputSize = inputProvider.dartCharactersRead;
-        String dataInput =
-            fe.relativizeUri(Uri.base, readDataUri, Platform.isWindows);
-        String codeInput =
-            fe.relativizeUri(Uri.base, readCodegenUri, Platform.isWindows);
-        summary = 'Data files $input, $dataInput and '
-            '${codeInput}[0-${codegenShards - 1}] ';
-        break;
       case ReadStrategy.fromCodegenAndClosedWorld:
         fail("Must read from closed world, data, and codegen");
         break;
@@ -1378,7 +1352,7 @@
   fail(message);
 }
 
-void main(List<String> arguments) {
+Future<void> main(List<String> arguments) async {
   // Expand `@path/to/file`
   // When running from bazel, argument of the form `@path/to/file` might be
   // provided. It needs to be replaced by reading all the contents of the
@@ -1396,7 +1370,7 @@
     batchMain(arguments.sublist(0, arguments.length - 1));
     return;
   }
-  internalMain(arguments);
+  await internalMain(arguments);
 }
 
 /// Return all non-empty lines in a file found at [path].
diff --git a/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart b/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
index 9f10c18..92068f6 100644
--- a/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
+++ b/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
@@ -44,8 +44,7 @@
   Uri get uri => _uriAndPrefix.uri;
   String get prefix => _uriAndPrefix.prefix;
 
-  ReferenceNode(this._uriAndPrefix, {name})
-      : super(name ?? _uriAndPrefix.prefix);
+  ReferenceNode(String name, this._uriAndPrefix) : super(name);
 
   @override
   Map<String, dynamic> toJson() {
@@ -60,8 +59,8 @@
     if (nodeJson['type'] != 'reference') {
       throw 'Unrecognized type for reference node: ${nodeJson['type']}.';
     }
-    return ReferenceNode(UriAndPrefix.fromJson(nodeJson['import']),
-        name: nodeJson['name']);
+    return ReferenceNode(
+        nodeJson['name'], UriAndPrefix.fromJson(nodeJson['import']));
   }
 
   @override
@@ -193,9 +192,10 @@
   final Map<String, NamedNode> namedNodes = {};
   ReferenceNodeNamer _referenceNodeNamer;
 
-  /// The prefix in the 'uri#prefix' string will become a key to reference this
-  /// node in other builder calls.
-  String _prefixNamer(UriAndPrefix uriAndPrefix) => uriAndPrefix.prefix;
+  /// 'uri#prefix' will become a key to reference this node in other builder
+  /// calls.
+  String _uriAndPrefixNamer(UriAndPrefix uriAndPrefix) =>
+      uriAndPrefix.toString();
 
   /// Override the default reference node namer.
   set referenceNodeNamer(ReferenceNodeNamer namer) =>
@@ -203,7 +203,23 @@
 
   /// Returns the [ReferenceNodeNamer] to use for naming.
   ReferenceNodeNamer get referenceNodeNamer =>
-      _referenceNodeNamer ?? _prefixNamer;
+      _referenceNodeNamer ?? _uriAndPrefixNamer;
+
+  NamedNode _addNamedNode(NamedNode node) {
+    if (namedNodes.containsKey(node.name)) {
+      throw 'Node with name ${node.name} already exists: '
+          '${namedNodes[node.name]}';
+    }
+    namedNodes[node.name] = node;
+    return node;
+  }
+
+  NamedNode _lookupNamedNode(String nodeName) {
+    if (!namedNodes.containsKey(nodeName)) {
+      throw 'Missing reference node for $nodeName';
+    }
+    return namedNodes[nodeName];
+  }
 
   /// Returns a [ReferenceNode] referencing [importUriAndPrefix].
   /// [ReferenceNode]s are typically created in bulk, by mapping over a list of
@@ -212,43 +228,47 @@
   /// [referenceNodeNamer] per [ReferenceNode].
   ReferenceNode referenceNode(String importUriAndPrefix) {
     var uriAndPrefix = UriAndPrefix.fromJson(importUriAndPrefix);
-    var referenceNode = ReferenceNode(uriAndPrefix);
     var name = referenceNodeNamer(uriAndPrefix);
-    namedNodes[name] = referenceNode;
-    return referenceNode;
+    return _addNamedNode(ReferenceNode(name, uriAndPrefix));
   }
 
   /// Creates an unnamed [RelativeOrderNode] referencing two [NamedNode]s.
   RelativeOrderNode orderNode(String predecessor, String successor) {
     return RelativeOrderNode(
-        predecessor: namedNodes[predecessor], successor: namedNodes[successor]);
+        predecessor: _lookupNamedNode(predecessor),
+        successor: _lookupNamedNode(successor));
   }
 
   /// Creates a [CombinerNode] which can be referenced by [name] in further
   /// calls to the builder.
-  CombinerNode combinerNode(
-      String name, List<String> nodes, CombinerType type) {
-    var combinerNode = CombinerNode(name, type,
-        nodes.map((name) => namedNodes[name] as ReferenceNode).toSet());
-    namedNodes[name] = combinerNode;
-    return combinerNode;
+  CombinerNode combinerNode(String name, Set<String> nodes, CombinerType type) {
+    ReferenceNode _lookup(String nodeName) {
+      var node = _lookupNamedNode(nodeName);
+      if (node is! ReferenceNode) {
+        // TODO(joshualitt): Implement nested combiners.
+        throw '$name references node $nodeName which is not a ReferenceNode.';
+      }
+      return node as ReferenceNode;
+    }
+
+    return _addNamedNode(CombinerNode(name, type, nodes.map(_lookup).toSet()));
   }
 
   /// Creates an 'and' [CombinerNode] which can be referenced by [name] in
   /// further calls to the builder.
-  CombinerNode andNode(String name, List<String> nodes) {
+  CombinerNode andNode(String name, Set<String> nodes) {
     return combinerNode(name, nodes, CombinerType.and);
   }
 
   /// Creates a 'fuse' [CombinerNode] which can be referenced by [name] in
   /// further calls to the builder.
-  CombinerNode fuseNode(String name, List<String> nodes) {
+  CombinerNode fuseNode(String name, Set<String> nodes) {
     return combinerNode(name, nodes, CombinerType.fuse);
   }
 
   /// Creates an 'or' [CombinerNode] which can be referenced by [name] in
   /// further calls to the builder.
-  CombinerNode orNode(String name, List<String> nodes) {
+  CombinerNode orNode(String name, Set<String> nodes) {
     return combinerNode(name, nodes, CombinerType.or);
   }
 }
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 1fa1dc4..8d2c4b9 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -364,6 +364,9 @@
       reader.getSourceInformation(node);
 
   @override
+  SourceInformation visitComment(js.Comment node) => null;
+
+  @override
   SourceInformation visitExpressionStatement(js.ExpressionStatement node) {
     SourceInformation sourceInformation = reader.getSourceInformation(node);
     if (sourceInformation != null) {
@@ -864,7 +867,7 @@
 
 /// Visitor that computes the [js.Node]s the are part of the JavaScript
 /// steppable execution and thus needs source mapping locations.
-class JavaScriptTracer extends js.BaseVisitor {
+class JavaScriptTracer extends js.BaseVisitorVoid {
   final CodePositionMap codePositions;
   final SourceInformationReader reader;
   final List<TraceListener> listeners;
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index f3d8702..3e7f7fca 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -858,4 +858,11 @@
   void visitNullConstant(ir.NullConstant node) {
     registry.registerNullLiteral();
   }
+
+  @override
+  void visitConstructorTearOffConstant(ir.ConstructorTearOffConstant node) {
+    // The CFE encoding of redirecting factories, which dart2js doesn't use,
+    // uses ConstructorTearOff(Constant) to point to its effective target.
+    // However, these should be safe to ignore.
+  }
 }
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index b122154..9696343 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1556,31 +1556,32 @@
     // for-in [iterableType] is a subtype of `Stream`.
     ir.DartType iterableType = visitNode(node.iterable);
     ir.DartType iteratorType = const ir.DynamicType();
-    if (node.isAsync) {
-      ir.InterfaceType streamInterfaceType = getInterfaceTypeOf(iterableType);
-      ir.InterfaceType streamType = typeEnvironment.getTypeAsInstanceOf(
-          streamInterfaceType,
-          typeEnvironment.coreTypes.streamClass,
-          currentLibrary,
-          typeEnvironment.coreTypes);
-      if (streamType != null) {
-        iteratorType = ir.InterfaceType(
-            typeEnvironment.coreTypes.streamIteratorClass,
-            ir.Nullability.nonNullable,
-            streamType.typeArguments);
-      }
-    } else {
-      ir.InterfaceType iterableInterfaceType = getInterfaceTypeOf(iterableType);
-      ir.Member member = hierarchy.getInterfaceMember(
-          iterableInterfaceType.classNode, ir.Name(Identifiers.iterator));
-      if (member != null) {
-        iteratorType = ir.Substitution.fromInterfaceType(
-                typeEnvironment.getTypeAsInstanceOf(
-                    iterableInterfaceType,
-                    member.enclosingClass,
-                    currentLibrary,
-                    typeEnvironment.coreTypes))
-            .substituteType(member.getterType);
+    ir.InterfaceType iterableInterfaceType = getInterfaceTypeOf(iterableType);
+    if (iterableInterfaceType != null) {
+      if (node.isAsync) {
+        ir.InterfaceType streamType = typeEnvironment.getTypeAsInstanceOf(
+            iterableInterfaceType,
+            typeEnvironment.coreTypes.streamClass,
+            currentLibrary,
+            typeEnvironment.coreTypes);
+        if (streamType != null) {
+          iteratorType = ir.InterfaceType(
+              typeEnvironment.coreTypes.streamIteratorClass,
+              ir.Nullability.nonNullable,
+              streamType.typeArguments);
+        }
+      } else {
+        ir.Member member = hierarchy.getInterfaceMember(
+            iterableInterfaceType.classNode, ir.Name(Identifiers.iterator));
+        if (member != null) {
+          iteratorType = ir.Substitution.fromInterfaceType(
+                  typeEnvironment.getTypeAsInstanceOf(
+                      iterableInterfaceType,
+                      member.enclosingClass,
+                      currentLibrary,
+                      typeEnvironment.coreTypes))
+              .substituteType(member.getterType);
+        }
       }
     }
     _staticTypeCache._forInIteratorTypes[node] = iteratorType;
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart
index 1b1ac8e..6a8fecd 100644
--- a/pkg/compiler/lib/src/js/js.dart
+++ b/pkg/compiler/lib/src/js/js.dart
@@ -83,6 +83,9 @@
     codePositionListener.onPositions(
         node, startPosition, endPosition, closingPosition);
   }
+
+  @override
+  bool get isDebugContext => false;
 }
 
 /// Interface for ast nodes that encapsulate an ast that needs to be
@@ -98,9 +101,9 @@
 }
 
 /// Implements reference counting for instances of [ReferenceCountedAstNode]
-class TokenCounter extends BaseVisitor {
+class TokenCounter extends BaseVisitorVoid {
   @override
-  visitNode(Node node) {
+  void visitNode(Node node) {
     if (node is AstContainer) {
       for (Node element in node.containedNodes) {
         element.accept(this);
diff --git a/pkg/compiler/lib/src/js/js_debug.dart b/pkg/compiler/lib/src/js/js_debug.dart
index 11b3b83..19d6600 100644
--- a/pkg/compiler/lib/src/js/js_debug.dart
+++ b/pkg/compiler/lib/src/js/js_debug.dart
@@ -23,7 +23,7 @@
 
 /// Visitor that creates an XML-like representation of the structure of a
 /// JavaScript [Node].
-class DebugPrinter extends BaseVisitor with Indentation, Tagging<Node> {
+class DebugPrinter extends BaseVisitorVoid with Indentation, Tagging<Node> {
   @override
   StringBuffer sb = StringBuffer();
 
diff --git a/pkg/compiler/lib/src/js/placeholder_safety.dart b/pkg/compiler/lib/src/js/placeholder_safety.dart
index dc5d7a7..9f14b58 100644
--- a/pkg/compiler/lib/src/js/placeholder_safety.dart
+++ b/pkg/compiler/lib/src/js/placeholder_safety.dart
@@ -63,7 +63,12 @@
   @override
   int visitNode(js.Node node) {
     safe = false;
-    super.visitNode(node);
+    node.visitChildren(this);
+    return UNKNOWN_VALUE;
+  }
+
+  @override
+  int visitComment(js.Comment node) {
     return UNKNOWN_VALUE;
   }
 
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index 8a48496..803221c 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -2465,6 +2465,11 @@
   }
 
   @override
+  bool visitNode(js.Node node) {
+    throw StateError('Node type ${node.runtimeType} not handled: $node');
+  }
+
+  @override
   bool visitAccess(js.PropertyAccess node) {
     bool receiver = visit(node.receiver);
     bool selector = visit(node.selector);
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index f82c523..170924c 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -520,6 +520,7 @@
         ],
         instantiatedClasses: [
           _commonElements.jsJavaScriptObjectClass,
+          _commonElements.jsLegacyJavaScriptObjectClass,
           _commonElements.jsPlainJavaScriptObjectClass,
           _commonElements.jsJavaScriptFunctionClass
         ],
@@ -607,6 +608,7 @@
     ], globalClasses: [
       _commonElements.jsInterceptorClass,
       _commonElements.jsJavaScriptObjectClass,
+      _commonElements.jsLegacyJavaScriptObjectClass,
       _commonElements.jsPlainJavaScriptObjectClass,
       _commonElements.jsJavaScriptFunctionClass
     ]);
diff --git a/pkg/compiler/lib/src/js_backend/codegen_listener.dart b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
index fe62f76..4a93bce 100644
--- a/pkg/compiler/lib/src/js_backend/codegen_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
@@ -291,6 +291,8 @@
       registerInstantiation(_commonElements.jsNumberClass);
     } else if (cls == _commonElements.jsJavaScriptObjectClass) {
       registerInstantiation(_commonElements.jsJavaScriptObjectClass);
+    } else if (cls == _commonElements.jsLegacyJavaScriptObjectClass) {
+      registerInstantiation(_commonElements.jsLegacyJavaScriptObjectClass);
     } else if (cls == _commonElements.jsPlainJavaScriptObjectClass) {
       registerInstantiation(_commonElements.jsPlainJavaScriptObjectClass);
     } else if (cls == _commonElements.jsUnknownJavaScriptObjectClass) {
diff --git a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
index 3df93c3..a9aa753 100644
--- a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
+++ b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
@@ -147,6 +147,32 @@
   }
 
   @override
+  String nonfinalizedDebugText() {
+    switch (kind) {
+      case DeferredHolderExpressionKind.globalObjectForClass:
+        return 'Holder"${_className(data)}"';
+      case DeferredHolderExpressionKind.globalObjectForMember:
+        return 'Holder"${_qualifiedStaticName(data)}"';
+      case DeferredHolderExpressionKind.globalObjectForInterceptors:
+        return 'J';
+      case DeferredHolderExpressionKind.globalObjectForConstant:
+        return 'Holder"constants"';
+      case DeferredHolderExpressionKind.globalObjectForStaticState:
+        return r'$';
+    }
+    return super.nonfinalizedDebugText();
+  }
+
+  String _className(ClassEntity cls) => cls.name.replaceAll('&', '_');
+
+  String _qualifiedStaticName(MemberEntity member) {
+    if (member.isConstructor || member.isStatic) {
+      return '${_className(member.enclosingClass)}.${member.name}';
+    }
+    return member.name;
+  }
+
+  @override
   Iterable<js.Node> get containedNodes => isFinalized ? [_value] : const [];
 }
 
@@ -797,7 +823,7 @@
 ///
 /// The state is kept in the finalizer so that this scan could be extended to
 /// look for other deferred expressions in one pass.
-class _DeferredHolderExpressionCollectorVisitor extends js.BaseVisitor<void> {
+class _DeferredHolderExpressionCollectorVisitor extends js.BaseVisitorVoid {
   String resourceName;
   final DeferredHolderExpressionFinalizer _finalizer;
 
@@ -856,307 +882,3 @@
   final js.Statement statement;
   HolderInitCode(this.allHolders, this.activeHolders, this.statement);
 }
-
-/// All of the code below this point is legacy code.
-
-/// [DeferredHolderExpressionFinalizerImpl] finalizes
-/// [DeferredHolderExpression]s, [DeferredHolderParameter]s,
-/// [DeferredHolderResource]s, [DeferredHolderResourceExpression]s.
-class LegacyDeferredHolderExpressionFinalizerImpl
-    implements DeferredHolderExpressionFinalizer {
-  _DeferredHolderExpressionCollectorVisitor _visitor;
-  final List<DeferredHolderExpression> holderReferences = [];
-  final List<DeferredHolderParameter> holderParameters = [];
-  final List<DeferredHolderResource> holderResources = [];
-  final Set<String> _uniqueHolders = {};
-  final List<String> _holders = [];
-  final Map<Entity, String> _entityMap = {};
-  final JCommonElements _commonElements;
-
-  LegacyDeferredHolderExpressionFinalizerImpl(this._commonElements) {
-    _visitor = _DeferredHolderExpressionCollectorVisitor(this);
-  }
-
-  @override
-  void addCode(String resourceName, js.Node code) {
-    _visitor.setResourceNameAndVisit(resourceName, code);
-  }
-
-  final List<String> userGlobalObjects =
-      List.from(Namer.reservedGlobalObjectNames)
-        ..remove('C')
-        ..remove('H')
-        ..remove('J')
-        ..remove('P')
-        ..remove('W');
-
-  /// Returns the [reservedGlobalObjectNames] for [library].
-  String globalObjectForLibrary(LibraryEntity library) {
-    if (library == _commonElements.interceptorsLibrary) return 'J';
-    Uri uri = library.canonicalUri;
-    if (uri.scheme == 'dart') {
-      if (uri.path == 'html') return 'W';
-      if (uri.path.startsWith('_')) return 'H';
-      return 'P';
-    }
-    return userGlobalObjects[library.name.hashCode % userGlobalObjects.length];
-  }
-
-  /// Returns true if [element] is stored in the static state holder
-  /// ([staticStateHolder]).  We intend to store only mutable static state
-  /// there, whereas constants are stored in 'C'. Functions, accessors,
-  /// classes, etc. are stored in one of the other objects in
-  /// [reservedGlobalObjectNames].
-  bool _isPropertyOfStaticStateHolder(MemberEntity element) {
-    // TODO(ahe): Make sure this method's documentation is always true and
-    // remove the word "intend".
-    return element.isField;
-  }
-
-  String globalObjectForMember(MemberEntity entity) {
-    if (_isPropertyOfStaticStateHolder(entity)) {
-      return globalObjectForStaticState();
-    } else {
-      return globalObjectForLibrary(entity.library);
-    }
-  }
-
-  String globalObjectForClass(ClassEntity entity) {
-    return globalObjectForLibrary(entity.library);
-  }
-
-  String globalObjectForInterceptors() => 'J';
-
-  String globalObjectForStaticState() => r'$';
-
-  String globalObjectForConstants() => 'C';
-
-  String globalObjectForEntity(Entity entity) {
-    if (entity is MemberEntity) {
-      return globalObjectForMember(entity);
-    } else if (entity is ClassEntity) {
-      return globalObjectForLibrary(entity.library);
-    } else {
-      assert(entity is LibraryEntity);
-      return globalObjectForLibrary(entity);
-    }
-  }
-
-  /// Registers an [Entity] with a specific [holder].
-  void registerHolderUse(String holder, Object data) {
-    if (_uniqueHolders.add(holder)) _holders.add(holder);
-    if (data != null && data is Entity) {
-      assert(!_entityMap.containsKey(data) || _entityMap[data] == holder);
-      _entityMap[data] = holder;
-    }
-  }
-
-  /// Returns a global object for a given [Object] based on the
-  /// [DeferredHolderExpressionKind].
-  String kindToHolder(DeferredHolderExpressionKind kind, Object data) {
-    switch (kind) {
-      case DeferredHolderExpressionKind.globalObjectForInterceptors:
-        return globalObjectForInterceptors();
-      case DeferredHolderExpressionKind.globalObjectForClass:
-        return globalObjectForClass(data);
-      case DeferredHolderExpressionKind.globalObjectForMember:
-        return globalObjectForMember(data);
-      case DeferredHolderExpressionKind.globalObjectForConstant:
-        return globalObjectForConstants();
-      case DeferredHolderExpressionKind.globalObjectForStaticState:
-        return globalObjectForStaticState();
-    }
-    throw UnsupportedError("Unreachable");
-  }
-
-  /// Finalizes [DeferredHolderExpression]s [DeferredHolderParameter]s.
-  void finalizeReferences() {
-    // Finalize [DeferredHolderExpression]s and registers holder usage.
-    for (var reference in holderReferences) {
-      if (reference.isFinalized) continue;
-      Object data = reference.data;
-      String holder = kindToHolder(reference.kind, data);
-      js.Expression value = js.VariableUse(holder);
-      registerHolderUse(holder, data);
-      reference.value =
-          value.withSourceInformation(reference.sourceInformation);
-    }
-
-    // Finalize [DeferredHolderParameter]s.
-    for (var parameter in holderParameters) {
-      if (parameter.isFinalized) continue;
-      parameter.name = globalObjectForStaticState();
-    }
-  }
-
-  /// Registers all of the holders used by a given [DeferredHolderResource].
-  void registerHolders(DeferredHolderResource resource) {
-    for (var entity in resource.holderCode.keys) {
-      var holder = globalObjectForEntity(entity);
-      registerHolderUse(holder, entity);
-    }
-  }
-
-  /// Returns a [List<String>] containing all of the holders except the static
-  /// state holder.
-  List<String> get nonStaticStateHolders {
-    return _holders
-        .where((holder) => holder != globalObjectForStaticState())
-        .toList(growable: false);
-  }
-
-  /// Generates code to declare holders.
-  LegacyHolderCode declareHolders(DeferredHolderResource resource) {
-    // Collect all holders except the static state holder. Then, create a map of
-    // holder to list of properties which are associated with that holder, but
-    // only with respect to a given [DeferredHolderResource]. Each fragment will
-    // have its own [DeferredHolderResource] and associated code.
-    Map<String, List<js.Property>> codePerHolder = {};
-    final holders = nonStaticStateHolders;
-    for (var holder in holders) {
-      codePerHolder[holder] = [];
-    }
-
-    final holderCode = resource.holderCode;
-    holderCode.forEach((entity, properties) {
-      assert(_entityMap.containsKey(entity));
-      var holder = _entityMap[entity];
-      assert(codePerHolder.containsKey(holder));
-      codePerHolder[holder].addAll(properties);
-    });
-
-    // Create holder initialization code based on the [codePerHolder]. If there
-    // are no properties associated with a given holder in this specific
-    // [DeferredHolderResource] then it will be omitted. However, in some cases,
-    // i.e. the main output unit, we still want to declare the holder with an
-    // empty object literal which will be filled in later by another
-    // [DeferredHolderResource], i.e. in a specific deferred fragment.
-    // The generated code looks like this:
-    //
-    //    {
-    //      var H = {...}, ..., G = {...};
-    //      var holders = [ H, ..., G ]; // Main unit only.
-    //    }
-
-    List<String> activeHolders = [];
-    List<js.VariableInitialization> holderInitializations = [];
-    for (var holder in holders) {
-      List<js.Property> properties = codePerHolder[holder];
-      if (properties.isEmpty) {
-        holderInitializations.add(js.VariableInitialization(
-            js.VariableDeclaration(holder, allowRename: false),
-            resource.isMainFragment ? js.ObjectInitializer(properties) : null));
-      } else {
-        activeHolders.add(holder);
-        holderInitializations.add(js.VariableInitialization(
-            js.VariableDeclaration(holder, allowRename: false),
-            js.ObjectInitializer(properties)));
-      }
-    }
-
-    List<js.Statement> statements = [];
-    statements.add(js.ExpressionStatement(js.VariableDeclarationList(
-        holderInitializations,
-        indentSplits: false)));
-    if (resource.isMainFragment) {
-      statements.add(js.js.statement(
-          'var holders = #',
-          js.ArrayInitializer(holders
-              .map((holder) => js.VariableUse(holder))
-              .toList(growable: false))));
-    }
-    return LegacyHolderCode(activeHolders, statements);
-  }
-
-  /// Finalizes [resource] to code that updates holders. [resource] must be in
-  /// the AST of a deferred fragment.
-  void updateHolders(DeferredHolderResource resource) {
-    // Declare holders.
-    final holderCode = declareHolders(resource);
-
-    // Set names if necessary on deferred holders list.
-    js.Expression deferredHoldersList = js.ArrayInitializer(holderCode
-        .activeHolders
-        .map((holder) => js.js("#", holder))
-        .toList(growable: false));
-    js.Statement setNames = js.js.statement(
-        'hunkHelpers.setFunctionNamesIfNecessary(#deferredHoldersList)',
-        {'deferredHoldersList': deferredHoldersList});
-
-    // Update holder assignments.
-    final holders = nonStaticStateHolders;
-    List<js.Statement> updateHolderAssignments = [setNames];
-    for (int i = 0; i < holders.length; i++) {
-      var holder = holders[i];
-      if (holderCode.activeHolders.contains(holder)) {
-        updateHolderAssignments.add(js.js.statement(
-            '#holder = hunkHelpers.updateHolder(holdersList[#index], #holder)',
-            {'index': js.number(i), 'holder': js.VariableUse(holder)}));
-      } else {
-        // TODO(sra): Change declaration followed by assignments to declarations
-        // with initialization.
-        updateHolderAssignments.add(js.js.statement(
-            '#holder = holdersList[#index]',
-            {'index': js.number(i), 'holder': js.VariableUse(holder)}));
-      }
-    }
-
-    // Create a single block of all statements.
-    List<js.Statement> statements = holderCode.statements
-        .followedBy(updateHolderAssignments)
-        .toList(growable: false);
-    resource.statement = js.Block(statements);
-  }
-
-  /// Allocates all [DeferredHolderResource]s and
-  /// [DeferredHolderResourceExpression]s.
-  void allocateResources() {
-    // First ensure all holders used in all [DeferredHolderResource]s have been
-    // allocated.
-    for (var resource in holderResources) {
-      registerHolders(resource);
-    }
-    _holders.sort();
-
-    // Next finalize all [DeferredHolderResource]s.
-    for (var resource in holderResources) {
-      switch (resource.kind) {
-        case DeferredHolderResourceKind.mainFragment:
-          var holderCode = declareHolders(resource);
-          resource.statement = js.Block(holderCode.statements);
-          break;
-        case DeferredHolderResourceKind.deferredFragment:
-          updateHolders(resource);
-          break;
-      }
-    }
-  }
-
-  @override
-  void finalize() {
-    finalizeReferences();
-    allocateResources();
-  }
-
-  @override
-  void registerDeferredHolderExpression(
-      String resourceName, DeferredHolderExpression node) {
-    holderReferences.add(node);
-  }
-
-  @override
-  void registerDeferredHolderResource(DeferredHolderResource node) {
-    holderResources.add(node);
-  }
-
-  @override
-  void registerDeferredHolderParameter(DeferredHolderParameter node) {
-    holderParameters.add(node);
-  }
-}
-
-class LegacyHolderCode {
-  final List<String> activeHolders;
-  final List<js.Statement> statements;
-  LegacyHolderCode(this.activeHolders, this.statements);
-}
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index 94f28fc..82c7200 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -380,7 +380,7 @@
   jsAst.Name nameForOneShotInterceptor(
       Selector selector, Iterable<ClassEntity> classes) {
     String root = selector.isOperator
-        ? operatorNameToIdentifier(selector.name)
+        ? Namer.operatorNameToIdentifier(selector.name)
         : privateName(selector.memberName);
     String prefix = selector.isGetter
         ? r"$get"
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 11d3b51..83c7797 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -1425,7 +1425,7 @@
     return StringBackedName(name);
   }
 
-  String operatorNameToIdentifier(String name) {
+  static String operatorNameToIdentifier(String name) {
     if (name == null) return null;
     if (name == '==') {
       return r'$eq';
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 02fc83a..0b220af 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -394,6 +394,9 @@
       _addInterceptors(_commonElements.jsNumberClass, impactBuilder);
     } else if (cls == _commonElements.jsJavaScriptObjectClass) {
       _addInterceptors(_commonElements.jsJavaScriptObjectClass, impactBuilder);
+    } else if (cls == _commonElements.jsLegacyJavaScriptObjectClass) {
+      _addInterceptors(
+          _commonElements.jsLegacyJavaScriptObjectClass, impactBuilder);
     } else if (cls == _commonElements.jsPlainJavaScriptObjectClass) {
       _addInterceptors(
           _commonElements.jsPlainJavaScriptObjectClass, impactBuilder);
diff --git a/pkg/compiler/lib/src/js_backend/string_reference.dart b/pkg/compiler/lib/src/js_backend/string_reference.dart
index 62c378b..19aba0e 100644
--- a/pkg/compiler/lib/src/js_backend/string_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/string_reference.dart
@@ -143,6 +143,26 @@
 
   @override
   Iterable<js.Node> get containedNodes => isFinalized ? [_value] : const [];
+
+  @override
+  String nonfinalizedDebugText() {
+    const doubleQuote = 0x22;
+    final buffer = StringBuffer('StringReference');
+    if (constant.stringValue.length <= 1000) {
+      buffer.writeCharCode(doubleQuote);
+      for (int rune in constant.stringValue.runes) {
+        if (rune >= 0x20 && rune < 0x7F && rune != doubleQuote) {
+          buffer.writeCharCode(rune);
+        } else {
+          buffer.write(r'\u{');
+          buffer.write(rune.toRadixString(16));
+          buffer.write(r'}');
+        }
+      }
+      buffer.writeCharCode(doubleQuote);
+    }
+    return '$buffer';
+  }
 }
 
 /// A [StringReferenceResource] is a deferred JavaScript statement determined
@@ -402,7 +422,7 @@
 /// The state is kept in the finalizer so that this scan could be extended to
 /// look for other deferred expressions in one pass.
 // TODO(sra): Merge with TypeReferenceCollectorVisitor.
-class _StringReferenceCollectorVisitor extends js.BaseVisitor<void> {
+class _StringReferenceCollectorVisitor extends js.BaseVisitorVoid {
   final StringReferenceFinalizerImpl _finalizer;
 
   _StringReferenceCollectorVisitor(this._finalizer);
diff --git a/pkg/compiler/lib/src/js_backend/type_reference.dart b/pkg/compiler/lib/src/js_backend/type_reference.dart
index d488b24..e135ab8 100644
--- a/pkg/compiler/lib/src/js_backend/type_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/type_reference.dart
@@ -161,6 +161,15 @@
 
   @override
   Iterable<js.Node> get containedNodes => isFinalized ? [_value] : const [];
+
+  @override
+  String nonfinalizedDebugText() {
+    TypeRecipe typeRecipe = this.typeRecipe;
+    if (typeRecipe is TypeExpressionRecipe) {
+      return 'TypeReference"${typeRecipe.type.toString()}"';
+    }
+    return super.nonfinalizedDebugText();
+  }
 }
 
 /// A [TypeReferenceResource] is a deferred JavaScript statement determined by
@@ -524,7 +533,7 @@
 ///
 /// The state is kept in the finalizer so that this scan could be extended to
 /// look for other deferred expressions in one pass.
-class _TypeReferenceCollectorVisitor extends js.BaseVisitor<void> {
+class _TypeReferenceCollectorVisitor extends js.BaseVisitorVoid {
   final TypeReferenceFinalizerImpl _finalizer;
 
   _TypeReferenceCollectorVisitor(this._finalizer);
diff --git a/pkg/compiler/lib/src/js_emitter/native_emitter.dart b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
index a3137e7..857b67b 100644
--- a/pkg/compiler/lib/src/js_emitter/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
@@ -94,6 +94,7 @@
 
     Class objectClass = null;
     Class jsInterceptorClass = null;
+    Class jsJavaScriptObjectClass = null;
 
     void walk(Class cls) {
       if (cls.element == _commonElements.objectClass) {
@@ -104,6 +105,11 @@
         jsInterceptorClass = cls;
         return;
       }
+      // Native classes may inherit either `Interceptor` e.g. `JSBool` or
+      // `JavaScriptObject` e.g. `dart:html` classes.
+      if (cls.element == _commonElements.jsJavaScriptObjectClass) {
+        jsJavaScriptObjectClass = cls;
+      }
       if (seen.contains(cls)) return;
       seen.add(cls);
       walk(cls.superclass);
@@ -215,6 +221,9 @@
     // by getNativeInterceptor and custom elements.
     if (_nativeCodegenEnqueuer.hasInstantiatedNativeClasses) {
       fillNativeInfo(jsInterceptorClass);
+      if (jsJavaScriptObjectClass != null) {
+        fillNativeInfo(jsJavaScriptObjectClass);
+      }
       for (Class cls in classes) {
         if (!cls.isNative || neededClasses.contains(cls)) {
           fillNativeInfo(cls);
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index c9130bd..69dc9f4 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -164,7 +164,7 @@
   Set<Class> _unneededNativeClasses;
 
   ClassEntity get _jsInteropInterceptor =>
-      _commonElements.jsJavaScriptObjectClass;
+      _commonElements.jsLegacyJavaScriptObjectClass;
   final List<StubMethod> _jsInteropIsChecks = [];
   final Set<TypeCheck> _jsInteropTypeChecks = {};
 
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 91c66d3..e07ef90 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -189,11 +189,12 @@
   };
 }
 
-// Creates a lazy final field that uses non-nullable initialization semantics.
+// Creates a lazy final static field that uses non-nullable initialization
+// semantics.
 //
-// A lazy field has a storage entry, [name], which holds the value, and a
-// getter ([getterName]) to access the field. If the field wasn't set before
-// the first access, it is initialized with the [initializer].
+// A lazy final field has a storage entry, [name], which holds the value, and a
+// getter ([getterName]) to access the field. The field is initialized on first
+// access with the [initializer].
 function lazyFinal(holder, name, getterName, initializer) {
   var uninitializedSentinel = holder;
   holder[name] = uninitializedSentinel;
@@ -201,12 +202,21 @@
     if (holder[name] === uninitializedSentinel) {
       var value = initializer();
       if (holder[name] !== uninitializedSentinel) {
+        // Since there is no setter, the only way to get here is via bounded
+        // recursion, where `initializer` calls the lazy final getter.
         #throwLateFieldADI(name);
       }
       holder[name] = value;
     }
-    holder[getterName] = function() { return this[name]; };
-    return holder[name];
+    // TODO(sra): Does the value need to be stored in the holder at all?
+    // Potentially a call to the getter could be replaced with an access to
+    // holder slot if dominated by a previous call to the getter. Does the
+    // optimizer do this? If so, within a single function, the dominance
+    // relations should allow a local copy via GVN, so it is not that valuable
+    // an optimization for a `final` static variable.
+    var finalValue = holder[name];
+    holder[getterName] = function() { return finalValue; };
+    return finalValue;
   };
 }
 
@@ -630,10 +640,8 @@
       this._nativeEmitter,
       this._closedWorld,
       this._codegenWorld)
-      : _holderFinalizer = _options.features.newHolders.isEnabled
-            ? DeferredHolderExpressionFinalizerImpl(_closedWorld.commonElements)
-            : LegacyDeferredHolderExpressionFinalizerImpl(
-                _closedWorld.commonElements) {
+      : _holderFinalizer =
+            DeferredHolderExpressionFinalizerImpl(_closedWorld.commonElements) {
     _recipeEncoder = RecipeEncoderImpl(
         _closedWorld,
         _options.disableRtiOptimization
@@ -1932,7 +1940,8 @@
   js.Block emitTypeRules(Fragment fragment) {
     List<js.Statement> statements = [];
 
-    ClassEntity jsObjectClass = _commonElements.jsJavaScriptObjectClass;
+    ClassEntity legacyJsObjectClass =
+        _commonElements.jsLegacyJavaScriptObjectClass;
 
     Map<ClassTypeData, List<ClassTypeData>> nativeRedirections =
         _nativeEmitter.typeRedirections;
@@ -1950,10 +1959,11 @@
         erasedTypes[element] = targetType.typeArguments.length;
       }
 
-      bool isInterop = _classHierarchy.isSubclassOf(element, jsObjectClass);
+      bool isInterop =
+          _classHierarchy.isSubclassOf(element, legacyJsObjectClass);
 
-      if (isInterop && element != jsObjectClass) {
-        ruleset.addRedirection(element, jsObjectClass);
+      if (isInterop && element != legacyJsObjectClass) {
+        ruleset.addRedirection(element, legacyJsObjectClass);
       } else {
         Iterable<TypeCheck> checks = typeData.classChecks?.checks ?? const [];
         Iterable<InterfaceType> supertypes = isInterop
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index de9ddca..ea27263 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -64,7 +64,6 @@
         DeferredHolderParameter,
         DeferredHolderResource,
         DeferredHolderResourceKind,
-        LegacyDeferredHolderExpressionFinalizerImpl,
         mainResourceName;
 import '../../js_backend/type_reference.dart'
     show
diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart
index d379248..17fd5d2 100644
--- a/pkg/compiler/lib/src/js_model/js_world.dart
+++ b/pkg/compiler/lib/src/js_model/js_world.dart
@@ -246,7 +246,7 @@
   ClassEntity getLubOfInstantiatedSubclasses(ClassEntity cls) {
     if (nativeData.isJsInteropClass(cls)) {
       return getLubOfInstantiatedSubclasses(
-          commonElements.jsJavaScriptObjectClass);
+          commonElements.jsLegacyJavaScriptObjectClass);
     }
     ClassHierarchyNode hierarchy = classHierarchy.getClassHierarchyNode(cls);
     return hierarchy?.getLubOfInstantiatedSubclasses();
@@ -256,7 +256,7 @@
   ClassEntity getLubOfInstantiatedSubtypes(ClassEntity cls) {
     if (nativeData.isJsInteropClass(cls)) {
       return getLubOfInstantiatedSubtypes(
-          commonElements.jsJavaScriptObjectClass);
+          commonElements.jsLegacyJavaScriptObjectClass);
     }
     ClassSet classSet = classHierarchy.getClassSet(cls);
     return classSet?.getLubOfInstantiatedSubtypes();
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index ae463a8..01f42be 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -12,6 +12,7 @@
     show Message, LocatedMessage;
 import 'package:_js_interop_checks/js_interop_checks.dart';
 import 'package:_js_interop_checks/src/transformations/js_util_optimizer.dart';
+import 'package:_js_interop_checks/src/transformations/static_interop_class_eraser.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
@@ -93,7 +94,7 @@
   int get enabledConstructorTearOffLowerings => ConstructorTearOffLowering.all;
 
   @override
-  List<String> get extraRequiredLibraries => _requiredLibraries[name]!;
+  List<String> get extraRequiredLibraries => requiredLibraries[name]!;
 
   @override
   List<String> get extraIndexedLibraries => const [
@@ -142,6 +143,7 @@
       ChangedStructureNotifier? changedStructureNotifier}) {
     var nativeClasses = JsInteropChecks.getNativeClasses(component);
     var jsUtilOptimizer = JsUtilOptimizer(coreTypes, hierarchy);
+    var staticInteropClassEraser = StaticInteropClassEraser(coreTypes);
     for (var library in libraries) {
       JsInteropChecks(
               coreTypes,
@@ -151,6 +153,7 @@
       // TODO (rileyporter): Merge js_util optimizations with other lowerings
       // in the single pass in `transformations/lowering.dart`.
       jsUtilOptimizer.visitLibrary(library);
+      staticInteropClassEraser.visitLibrary(library);
     }
     lowering.transformLibraries(libraries, coreTypes, hierarchy, options);
     logger?.call("Lowering transformations performed");
@@ -222,49 +225,86 @@
 
 // TODO(sigmund): this "extraRequiredLibraries" needs to be removed...
 // compile-platform should just specify which libraries to compile instead.
-const _requiredLibraries = <String, List<String>>{
+const requiredLibraries = <String, List<String>>{
   'dart2js': [
+    'dart:_async_await_error_codes',
     'dart:_dart2js_runtime_metrics',
     'dart:_foreign_helper',
+    'dart:_http',
     'dart:_interceptors',
     'dart:_internal',
+    'dart:_js',
     'dart:_js_annotations',
     'dart:_js_embedded_names',
     'dart:_js_helper',
     'dart:_js_names',
+    'dart:_js_primitives',
     'dart:_late_helper',
+    'dart:_metadata',
     'dart:_native_typed_data',
+    'dart:_recipe_syntax',
+    'dart:_rti',
     'dart:async',
     'dart:collection',
+    'dart:convert',
+    'dart:developer',
     'dart:html',
     'dart:html_common',
     'dart:indexed_db',
     'dart:io',
+    'dart:isolate',
     'dart:js',
     'dart:js_util',
+    'dart:math',
     'dart:svg',
+    'dart:typed_data',
     'dart:web_audio',
     'dart:web_gl',
   ],
   'dart2js_server': [
+    'dart:_async_await_error_codes',
     'dart:_dart2js_runtime_metrics',
     'dart:_foreign_helper',
+    'dart:_http',
     'dart:_interceptors',
     'dart:_internal',
+    'dart:_js',
     'dart:_js_annotations',
     'dart:_js_embedded_names',
     'dart:_js_helper',
     'dart:_js_names',
+    'dart:_js_primitives',
     'dart:_late_helper',
     'dart:_native_typed_data',
+    'dart:_recipe_syntax',
+    'dart:_rti',
     'dart:async',
     'dart:collection',
+    'dart:convert',
+    'dart:developer',
     'dart:io',
+    'dart:isolate',
     'dart:js',
     'dart:js_util',
+    'dart:math',
+    'dart:typed_data',
   ]
 };
 
+/// Extends the Dart2jsTarget to transform outlines to meet the requirements
+/// of summaries in bazel and package-build.
+class Dart2jsSummaryTarget extends Dart2jsTarget with SummaryMixin {
+  @override
+  final List<Uri> sources;
+
+  @override
+  final bool excludeNonSources;
+
+  Dart2jsSummaryTarget(String name, this.sources, this.excludeNonSources,
+      TargetFlags targetFlags)
+      : super(name, targetFlags);
+}
+
 class Dart2jsConstantsBackend extends ConstantsBackend {
   @override
   final bool supportsUnevaluatedConstants;
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 827bf20..f82c5ef 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -468,7 +468,7 @@
     }
 
     /// This path is needed for synthetically injected superclasses like
-    /// `Interceptor` and `JavaScriptObject`.
+    /// `Interceptor` and `LegacyJavaScriptObject`.
     KClassEnv env = classes.getEnv(superClass);
     ConstructorEntity constructor = env.lookupConstructor(this, target.name);
     if (constructor != null) {
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
index 79e95d4..cdab490 100644
--- a/pkg/compiler/lib/src/kernel/loader.dart
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -9,7 +9,6 @@
 import 'package:front_end/src/fasta/kernel/utils.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
-import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
 
 import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
 import 'package:kernel/kernel.dart' hide LibraryDependency, Combinator;
@@ -20,7 +19,6 @@
 import '../common/tasks.dart' show CompilerTask, Measurer;
 import '../common.dart';
 import '../options.dart';
-import '../util/sink_adapter.dart';
 
 import 'front_end_adapter.dart';
 import 'dart2js_target.dart' show Dart2jsTarget;
@@ -34,7 +32,6 @@
   final DiagnosticReporter _reporter;
 
   final api.CompilerInput _compilerInput;
-  final api.CompilerOutput _compilerOutput;
 
   final CompilerOptions _options;
 
@@ -47,20 +44,24 @@
   /// This is used for testing.
   bool forceSerialization = false;
 
-  KernelLoaderTask(this._options, this._compilerInput, this._compilerOutput,
-      this._reporter, Measurer measurer)
+  KernelLoaderTask(
+      this._options, this._compilerInput, this._reporter, Measurer measurer)
       : initializedCompilerState = _options.kernelInitializedCompilerState,
         super(measurer);
 
   @override
   String get name => 'kernel loader';
 
-  ir.Reference findMainMethod(Component component, Uri entryUri) {
+  static Library _findEntryLibrary(Component component, Uri entryUri) {
     var entryLibrary = component.libraries
         .firstWhere((l) => l.fileUri == entryUri, orElse: () => null);
     if (entryLibrary == null) {
       throw ArgumentError('Entry uri $entryUri not found in dill.');
     }
+    return entryLibrary;
+  }
+
+  static ir.Reference _findMainMethod(Library entryLibrary) {
     var mainMethod = entryLibrary.procedures
         .firstWhere((p) => p.name.text == 'main', orElse: () => null);
 
@@ -76,7 +77,8 @@
       mainMethodReference = mainMethod.reference;
     }
     if (mainMethodReference == null) {
-      throw ArgumentError('Entry uri $entryUri has no main method.');
+      throw ArgumentError(
+          'Entry uri ${entryLibrary.fileUri} has no main method.');
     }
     return mainMethodReference;
   }
@@ -94,12 +96,12 @@
         return "${targetName}_platform$unsoundMarker.dill";
       }
 
+      // If we are passed an [entryUri] and building from dill, then we lookup
+      // the [entryLibrary] in the built component.
+      Library entryLibrary;
       var resolvedUri = _options.compilationTarget;
       ir.Component component;
       List<Uri> moduleLibraries = const [];
-      var isDill = resolvedUri.path.endsWith('.dill') ||
-          resolvedUri.path.endsWith('.gdill') ||
-          resolvedUri.path.endsWith('.mdill');
 
       void inferNullSafetyMode(bool isSound) {
         if (_options.nullSafetyMode == NullSafetyMode.unspecified) {
@@ -112,7 +114,7 @@
         assert(_options.nullSafetyMode != NullSafetyMode.unspecified);
       }
 
-      if (isDill) {
+      if (_options.fromDill) {
         component = ir.Component();
         Future<void> read(Uri uri) async {
           api.Input input = await _compilerInput.readFromUri(uri,
@@ -122,13 +124,6 @@
 
         await read(resolvedUri);
 
-        // If an entryUri is supplied, we use it to manually select the main
-        // method.
-        if (_options.entryUri != null) {
-          var mainMethod = findMainMethod(component, _options.entryUri);
-          component.setMainMethodAndMode(mainMethod, true, component.mode);
-        }
-
         if (_options.modularMode) {
           moduleLibraries =
               component.libraries.map((lib) => lib.importUri).toList();
@@ -161,24 +156,17 @@
           if (platformUri != resolvedUri) await read(platformUri);
         }
 
-        // Concatenate dills and then reset main method.
-        var mainMethod = component.mainMethodName;
-        var mainMode = component.mode;
+        // Concatenate dills.
         if (_options.dillDependencies != null) {
           for (Uri dependency in _options.dillDependencies) {
             await read(dependency);
           }
         }
-        component.setMainMethodAndMode(mainMethod, true, mainMode);
 
-        // This is not expected to be null when creating a whole-program .dill
-        // file, but needs to be checked for modular inputs.
-        if (component.mainMethod == null && !_options.modularMode) {
-          // TODO(sigmund): move this so that we use the same error template
-          // from the CFE.
-          _reporter.reportError(_reporter.createMessage(NO_LOCATION_SPANNABLE,
-              MessageKind.GENERIC, {'text': "No 'main' method found."}));
-          return null;
+        if (_options.entryUri != null) {
+          entryLibrary = _findEntryLibrary(component, _options.entryUri);
+          var mainMethod = _findMainMethod(entryLibrary);
+          component.setMainMethodAndMode(mainMethod, true, component.mode);
         }
       } else {
         bool verbose = false;
@@ -232,33 +220,37 @@
         validateNullSafetyMode();
       }
 
-      if (_options.cfeOnly) {
-        measureSubtask('serialize dill', () {
-          _reporter.log('Writing dill to ${_options.outputUri}');
-          api.BinaryOutputSink dillOutput =
-              _compilerOutput.createBinarySink(_options.outputUri);
-          BinaryOutputSinkAdapter irSink = BinaryOutputSinkAdapter(dillOutput);
-          BinaryPrinter printer = BinaryPrinter(irSink);
-          printer.writeComponentFile(component);
-          irSink.close();
-        });
-      }
-
       if (forceSerialization) {
         // TODO(johnniwinther): Remove this when #34942 is fixed.
         List<int> data = serializeComponent(component);
         component = ir.Component();
         BinaryBuilder(data).readComponent(component);
       }
-      return _toResult(component, moduleLibraries);
+      return _toResult(entryLibrary, component, moduleLibraries);
     });
   }
 
-  KernelResult _toResult(ir.Component component, List<Uri> moduleLibraries) {
+  KernelResult _toResult(
+      Library entryLibrary, ir.Component component, List<Uri> moduleLibraries) {
     Uri rootLibraryUri = null;
     Iterable<ir.Library> libraries = component.libraries;
-    if (!_options.modularMode && component.mainMethod != null) {
-      var root = component.mainMethod.enclosingLibrary;
+    if (!_options.modularMode) {
+      // For non-modular builds we should always have a [mainMethod] at this
+      // point.
+      if (component.mainMethod == null) {
+        // TODO(sigmund): move this so that we use the same error template
+        // from the CFE.
+        _reporter.reportError(_reporter.createMessage(NO_LOCATION_SPANNABLE,
+            MessageKind.GENERIC, {'text': "No 'main' method found."}));
+      }
+
+      // If we are building from dill and are passed an [entryUri], then we use
+      // that to find the appropriate [entryLibrary]. Otherwise, we fallback to
+      // the [enclosingLibrary] of the [mainMethod].
+      // NOTE: Under some circumstances, the [entryLibrary] exports the
+      // [mainMethod] from another library, and thus the [enclosingLibrary] of
+      // the [mainMethod] may not be the same as the [entryLibrary].
+      var root = entryLibrary ?? component.mainMethod.enclosingLibrary;
       rootLibraryUri = root.importUri;
 
       // Filter unreachable libraries: [Component] was built by linking in the
@@ -290,7 +282,7 @@
 
 /// Result of invoking the CFE to produce the kernel IR.
 class KernelResult {
-  final ir.Component component;
+  ir.Component component;
 
   /// The [Uri] of the root library containing main.
   /// Note: rootLibraryUri will be null for some modules, for example in the
@@ -314,6 +306,24 @@
   KernelResult(this.component, this.rootLibraryUri, this.libraries,
       this.moduleLibraries);
 
+  void trimComponent() {
+    var irLibraryMap = <Uri, Library>{};
+    var irLibraries = <Library>[];
+    for (var library in component.libraries) {
+      irLibraryMap[library.importUri] = library;
+    }
+    for (var library in libraries) {
+      irLibraries.add(irLibraryMap[library]);
+    }
+    var mainMethod = component.mainMethodName;
+    var componentMode = component.mode;
+    component = ir.Component(
+        libraries: irLibraries,
+        uriToSource: component.uriToSource,
+        nameRoot: component.root);
+    component.setMainMethodAndMode(mainMethod, true, componentMode);
+  }
+
   @override
   String toString() =>
       'root=$rootLibraryUri,libraries=$libraries,module=$moduleLibraries';
diff --git a/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart b/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
index 18b56dc..bdec099 100644
--- a/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
+++ b/pkg/compiler/lib/src/kernel/transformations/late_lowering.dart
@@ -280,13 +280,17 @@
       Name name = field.name;
       Uri fileUri = field.fileUri;
       DartType type = field.type;
+      // We need to unbind the canonical name since we reuse the reference but
+      // change the name.
+      field.fieldReference.canonicalName?.unbind();
       Field fieldCell = Field.immutable(_mangleFieldCellName(field),
           type: InterfaceType(_coreTypes.cellClass, nonNullable),
           initializer: _callCellConstructor(
               _nameLiteral(name.text, fileOffset), fileOffset),
           isFinal: true,
           isStatic: true,
-          fileUri: fileUri)
+          fileUri: fileUri,
+          fieldReference: field.fieldReference)
         ..fileOffset = fileOffset
         ..isNonNullableByDefault = true;
       StaticGet fieldCellAccess() =>
@@ -364,6 +368,8 @@
     Expression? initializer = field.initializer;
     Class enclosingClass = field.enclosingClass!;
 
+    // We need to unbind the canonical name since we reuse the reference but
+    // change the name.
     field.fieldReference.canonicalName?.unbind();
     Field backingField = Field.mutable(mangledName,
         type: type,
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index e81dda1..f59b9fd 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -820,7 +820,7 @@
         // JS interop API returns dynamic.  This means that to some degree we
         // still use the return type to decide whether to include native types,
         // even though we don't trust the type annotation.
-        ClassEntity cls = commonElements.jsJavaScriptObjectClass;
+        ClassEntity cls = commonElements.jsLegacyJavaScriptObjectClass;
         _behavior.typesInstantiated.add(elementEnvironment.getThisType(cls));
       }
     }
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index 2177dd4..26ff0d0 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -115,7 +115,7 @@
         } else if (_dartTypes.isSubtype(
             type,
             _elementEnvironment
-                .getRawType(_commonElements.jsJavaScriptObjectClass))) {
+                .getRawType(_commonElements.jsLegacyJavaScriptObjectClass))) {
           matchingClasses.add(type.element);
         }
         // TODO(johnniwinther): Improve spec string precision to handle type
diff --git a/pkg/compiler/lib/src/native/js.dart b/pkg/compiler/lib/src/native/js.dart
index 166fc6a..9c21348 100644
--- a/pkg/compiler/lib/src/native/js.dart
+++ b/pkg/compiler/lib/src/native/js.dart
@@ -6,7 +6,7 @@
 import '../universe/side_effects.dart' show SideEffects;
 import 'behavior.dart';
 
-class HasCapturedPlaceholders extends js.BaseVisitor {
+class HasCapturedPlaceholders extends js.BaseVisitorVoid {
   HasCapturedPlaceholders._();
 
   static bool check(js.Node node) {
@@ -19,21 +19,21 @@
   bool found = false;
 
   @override
-  visitFunctionExpression(js.FunctionExpression node) {
+  void visitFunctionExpression(js.FunctionExpression node) {
     ++enclosingFunctions;
     node.visitChildren(this);
     --enclosingFunctions;
   }
 
   @override
-  visitInterpolatedNode(js.InterpolatedNode node) {
+  void visitInterpolatedNode(js.InterpolatedNode node) {
     if (enclosingFunctions > 0) {
       found = true;
     }
   }
 }
 
-class SideEffectsVisitor extends js.BaseVisitor {
+class SideEffectsVisitor extends js.BaseVisitorVoid {
   final SideEffects sideEffects;
   SideEffectsVisitor(this.sideEffects);
 
@@ -167,6 +167,11 @@
   }
 
   @override
+  NativeThrowBehavior visitComment(js.Comment node) {
+    return NativeThrowBehavior.NEVER;
+  }
+
+  @override
   NativeThrowBehavior visitLiteral(js.Literal node) {
     return NativeThrowBehavior.NEVER;
   }
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index d0a06d4..b0be710 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -18,6 +18,7 @@
 }
 
 enum FeatureStatus {
+  shipped,
   shipping,
   canary,
 }
@@ -31,6 +32,10 @@
 /// passed. The [isNegativeFlag] bool flips things around so while in [canary]
 /// the [FeatureOption] is enabled unless explicitly disabled, and while in
 /// [staging] it is disabled unless explicitly enabled.
+///
+/// Finally, mature features can be moved to [shipped], at which point we ignore
+/// the flag, but throw if the value of the flag is unexpected(i.e. if a
+/// positive flag is disabled, or a negative flag is enabled).
 class FeatureOption {
   final String flag;
   final bool isNegativeFlag;
@@ -71,10 +76,14 @@
   /// Whether to generate code compliant with Content Security Policy.
   FeatureOption useContentSecurityPolicy = FeatureOption('csp');
 
+  /// [FeatureOption]s which are shipped and cannot be toggled.
+  late final List<FeatureOption> shipped = [
+    newHolders,
+  ];
+
   /// [FeatureOption]s which default to enabled.
   late final List<FeatureOption> shipping = [
     legacyJavaScript,
-    newHolders,
     useContentSecurityPolicy
   ];
 
@@ -107,6 +116,7 @@
 
   /// Parses a [List<String>] and enables / disables features as necessary.
   void parse(List<String> options) {
+    _verifyShippedFeatures(options, shipped);
     _extractFeatures(options, shipping, FeatureStatus.shipping);
     _extractFeatures(options, canary, FeatureStatus.canary);
   }
@@ -151,9 +161,14 @@
   /// Returns the compilation target specified by these options.
   Uri? get compilationTarget => inputDillUri ?? entryUri;
 
+  bool get fromDill {
+    var targetPath = compilationTarget!.path;
+    return targetPath.endsWith('.dill') ||
+        targetPath.endsWith('.gdill') ||
+        targetPath.endsWith('.mdill');
+  }
+
   /// Location of the package configuration file.
-  ///
-  /// If not null then [packageRoot] should be null.
   Uri? packageConfig;
 
   /// List of kernel files to load.
@@ -176,6 +191,8 @@
 
   List<Uri>? modularAnalysisInputs;
 
+  bool get hasModularAnalysisInputs => modularAnalysisInputs != null;
+
   /// Location from which serialized inference data is read.
   ///
   /// If this is set, the [entryUri] is expected to be a .dill file and the
@@ -546,6 +563,9 @@
   /// Verbosity level used for filtering messages during compilation.
   fe.Verbosity verbosity = fe.Verbosity.all;
 
+  // Whether or not to dump a list of unused libraries.
+  bool dumpUnusedLibraries = false;
+
   late FeatureOptions features;
 
   // -------------------------------------------------
@@ -672,6 +692,7 @@
       .._noSoundNullSafety = _hasOption(options, Flags.noSoundNullSafety)
       .._mergeFragmentsThreshold =
           _extractIntOption(options, '${Flags.mergeFragmentsThreshold}=')
+      ..dumpUnusedLibraries = _hasOption(options, Flags.dumpUnusedLibraries)
       ..cfeInvocationModes = fe.InvocationMode.parseArguments(
           _extractStringOption(options, '${Flags.cfeInvocationModes}=', '')!,
           onError: onError)
@@ -908,4 +929,28 @@
   }
 }
 
+void _verifyShippedFeatures(
+    List<String> options, List<FeatureOption> features) {
+  for (var feature in features) {
+    String featureFlag = feature.flag;
+    String enableFeatureFlag = '--$featureFlag';
+    String disableFeatureFlag = '--no-$featureFlag';
+    bool enableFeature = _hasOption(options, enableFeatureFlag);
+    bool disableFeature = _hasOption(options, disableFeatureFlag);
+    if (enableFeature && disableFeature) {
+      throw ArgumentError("'$enableFeatureFlag' incompatible with "
+          "'$disableFeatureFlag'");
+    }
+    if (enableFeature && feature.isNegativeFlag) {
+      throw ArgumentError(
+          "$disableFeatureFlag has already shipped and cannot be enabled.");
+    }
+    if (disableFeature && !feature.isNegativeFlag) {
+      throw ArgumentError(
+          "$enableFeatureFlag has already shipped and cannot be disabled.");
+    }
+    feature.state = !feature.isNegativeFlag;
+  }
+}
+
 const String _UNDETERMINED_BUILD_ID = "build number could not be determined";
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index 27d75ae..e63f515 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -66,40 +66,6 @@
       closedWorld.elementMap, closedWorld, globalLocalsMap, inferredData);
 }
 
-void serializeGlobalTypeInferenceResultsToSinkLegacy(
-    GlobalTypeInferenceResults results, DataSink sink) {
-  JsClosedWorld closedWorld = results.closedWorld;
-  GlobalLocalsMap globalLocalsMap = results.globalLocalsMap;
-  InferredData inferredData = results.inferredData;
-  closedWorld.writeToDataSink(sink);
-  globalLocalsMap.writeToDataSink(sink);
-  inferredData.writeToDataSink(sink);
-  results.writeToDataSink(sink, closedWorld.elementMap);
-  sink.close();
-}
-
-GlobalTypeInferenceResults
-    deserializeGlobalTypeInferenceResultsFromSourceLegacy(
-        CompilerOptions options,
-        DiagnosticReporter reporter,
-        Environment environment,
-        AbstractValueStrategy abstractValueStrategy,
-        ir.Component component,
-        DataSource source) {
-  JsClosedWorld newClosedWorld = JsClosedWorld.readFromDataSource(
-      options, reporter, environment, abstractValueStrategy, component, source);
-  GlobalLocalsMap newGlobalLocalsMap = GlobalLocalsMap.readFromDataSource(
-      newClosedWorld.closureDataLookup.getEnclosingMember, source);
-  InferredData newInferredData =
-      InferredData.readFromDataSource(source, newClosedWorld);
-  return GlobalTypeInferenceResults.readFromDataSource(
-      source,
-      newClosedWorld.elementMap,
-      newClosedWorld,
-      newGlobalLocalsMap,
-      newInferredData);
-}
-
 void serializeClosedWorldToSink(JsClosedWorld closedWorld, DataSink sink) {
   closedWorld.writeToDataSink(sink);
   sink.close();
@@ -321,39 +287,6 @@
     });
   }
 
-  // TODO(joshualitt) get rid of legacy functions after Google3 roll.
-  void serializeGlobalTypeInferenceLegacy(GlobalTypeInferenceResults results) {
-    JsClosedWorld closedWorld = results.closedWorld;
-    ir.Component component = closedWorld.elementMap.programEnv.mainComponent;
-    serializeComponent(component);
-
-    measureSubtask('serialize data', () {
-      _reporter.log('Writing data to ${_options.writeDataUri}');
-      api.BinaryOutputSink dataOutput =
-          _outputProvider.createBinarySink(_options.writeDataUri);
-      DataSink sink = BinarySink(BinaryOutputSinkAdapter(dataOutput));
-      serializeGlobalTypeInferenceResultsToSinkLegacy(results, sink);
-    });
-  }
-
-  Future<GlobalTypeInferenceResults> deserializeGlobalTypeInferenceLegacy(
-      Environment environment,
-      AbstractValueStrategy abstractValueStrategy) async {
-    ir.Component component = await deserializeComponentAndUpdateOptions();
-
-    return await measureIoSubtask('deserialize data', () async {
-      _reporter.log('Reading data from ${_options.readDataUri}');
-      api.Input<List<int>> dataInput = await _provider
-          .readFromUri(_options.readDataUri, inputKind: api.InputKind.binary);
-      DataSource source =
-          BinarySourceImpl(dataInput.data, stringInterner: _stringInterner);
-      return deserializeGlobalTypeInferenceResultsFromSourceLegacy(_options,
-          _reporter, environment, abstractValueStrategy, component, source);
-    });
-  }
-
-  // TODO(joshualitt): Investigate whether closed world indices can be shared
-  // with codegen.
   void serializeCodegen(BackendStrategy backendStrategy,
       CodegenResults codegenResults, DataSourceIndices indices) {
     GlobalTypeInferenceResults globalTypeInferenceResults =
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index cc5e875..359fead 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -351,6 +351,7 @@
         uri = out.resolve('$name.$extension');
         break;
       case OutputType.dumpInfo:
+      case OutputType.dumpUnusedLibraries:
       case OutputType.deferredMap:
         if (name == '') {
           name = out.pathSegments.last;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 56683e5..56dc39ec 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -1074,35 +1074,18 @@
         arguments.positional[positionalIndex++].accept(this);
         builtArguments.add(pop());
       } else {
-        ConstantValue constantValue = _elementMap.getConstantValue(
-            member, parameter.initializer,
-            implicitNull: true);
-        assert(
-            constantValue != null,
-            failedAt(_elementMap.getMethod(function.parent),
-                'No constant computed for $parameter'));
-        builtArguments.add(graph.addConstant(constantValue, closedWorld));
+        builtArguments.add(_defaultValueForParameter(member, parameter));
       }
     });
+    // Evaluate named arguments in given order.
+    Map<String, HInstruction> namedArguments = _visitNamedArguments(arguments);
+    // And add them to `builtArguments` in calling-convention order.
     function.namedParameters.toList()
       ..sort(namedOrdering)
       ..forEach((ir.VariableDeclaration parameter) {
-        var correspondingNamed = arguments.named.firstWhere(
-            (named) => named.name == parameter.name,
-            orElse: () => null);
-        if (correspondingNamed != null) {
-          correspondingNamed.value.accept(this);
-          builtArguments.add(pop());
-        } else {
-          ConstantValue constantValue = _elementMap.getConstantValue(
-              member, parameter.initializer,
-              implicitNull: true);
-          assert(
-              constantValue != null,
-              failedAt(_elementMap.getMethod(function.parent),
-                  'No constant computed for $parameter'));
-          builtArguments.add(graph.addConstant(constantValue, closedWorld));
-        }
+        var argument = namedArguments[parameter.name];
+        argument ??= _defaultValueForParameter(member, parameter);
+        builtArguments.add(argument);
       });
 
     return builtArguments;
@@ -3586,7 +3569,8 @@
     }
   }
 
-  /// Extracts the list of instructions for the positional subset of arguments.
+  /// Generate instructions to evaluate the positional arguments in source
+  /// order.
   List<HInstruction> _visitPositionalArguments(ir.Arguments arguments) {
     List<HInstruction> result = [];
     for (ir.Expression argument in arguments.positional) {
@@ -3596,6 +3580,17 @@
     return result;
   }
 
+  /// Generate instructions to evaluate the named arguments in source order.
+  /// Returns a fresh map from parameter name to evaluated argument.
+  Map<String, HInstruction> _visitNamedArguments(ir.Arguments arguments) {
+    Map<String, HInstruction> values = {};
+    for (ir.NamedExpression argument in arguments.named) {
+      argument.value.accept(this);
+      values[argument.name] = pop();
+    }
+    return values;
+  }
+
   /// Builds the list of instructions for the expressions in the arguments to a
   /// dynamic target (member function).  Dynamic targets use stubs to add
   /// defaulted arguments, so (unlike static targets) we do not add the default
@@ -3606,11 +3601,7 @@
     List<HInstruction> values = _visitPositionalArguments(arguments);
 
     if (arguments.named.isNotEmpty) {
-      Map<String, HInstruction> namedValues = {};
-      for (ir.NamedExpression argument in arguments.named) {
-        argument.value.accept(this);
-        namedValues[argument.name] = pop();
-      }
+      Map<String, HInstruction> namedValues = _visitNamedArguments(arguments);
       for (String name in selector.callStructure.getOrderedNamedArguments()) {
         values.add(namedValues[name]);
       }
@@ -3638,11 +3629,7 @@
       if (function is ConstructorEntity && function.isFactoryConstructor) {
         // TODO(sra): Have a "CompiledArguments" structure to just update with
         // what values we have rather than creating a map and de-populating it.
-        Map<String, HInstruction> namedValues = {};
-        for (ir.NamedExpression argument in arguments.named) {
-          argument.value.accept(this);
-          namedValues[argument.name] = pop();
-        }
+        Map<String, HInstruction> namedValues = _visitNamedArguments(arguments);
 
         // Visit named arguments in parameter-position order, selecting provided
         // or default value.
@@ -3719,11 +3706,7 @@
     }
 
     if (parameterStructure.namedParameters.isNotEmpty) {
-      Map<String, HInstruction> namedValues = {};
-      for (ir.NamedExpression argument in arguments.named) {
-        argument.value.accept(this);
-        namedValues[argument.name] = pop();
-      }
+      Map<String, HInstruction> namedValues = _visitNamedArguments(arguments);
 
       // Visit named arguments in parameter-position order, selecting provided
       // or default value.
@@ -5083,7 +5066,7 @@
     // resulting code bloat (e.g. from `dart:html`), we unsoundly assume that
     // only JS interop types are returned.
     nativeBehavior.typesInstantiated.add(_elementEnvironment
-        .getThisType(_commonElements.jsJavaScriptObjectClass));
+        .getThisType(_commonElements.jsLegacyJavaScriptObjectClass));
 
     AbstractValue instructionType =
         _typeInferenceMap.typeFromNativeBehavior(nativeBehavior, closedWorld);
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index e7ec92f..5e44fa5 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -95,13 +95,18 @@
       CodegenRegistry registry,
       ModularNamer namer,
       ModularEmitter emitter) {
+    js.Expression code;
     if (member.isField) {
-      return generateLazyInitializer(
+      code = generateLazyInitializer(
           member, graph, codegen, closedWorld, registry, namer, emitter);
     } else {
-      return generateMethod(
+      code = generateMethod(
           member, graph, codegen, closedWorld, registry, namer, emitter);
     }
+    if (code != null) {
+      codegen.tracer.traceJavaScriptText('JavaScript', code.debugPrint);
+    }
+    return code;
   }
 
   js.Expression generateLazyInitializer(
@@ -113,7 +118,6 @@
       ModularNamer namer,
       ModularEmitter emitter) {
     return measure(() {
-      codegen.tracer.traceGraph("codegen", graph);
       SourceInformation sourceInformation = sourceInformationStrategy
           .createBuilderForContext(field)
           .buildDeclaration(field);
@@ -129,6 +133,7 @@
           closedWorld,
           registry);
       codeGenerator.visitGraph(graph);
+      codegen.tracer.traceGraph("codegen", graph);
       return js.Fun(codeGenerator.parameters, codeGenerator.body)
           .withSourceInformation(sourceInformation);
     });
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 2ceac61..ab0b1a6 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -117,9 +117,24 @@
         .isEmitted;
   }
 
-  HBoundsCheck insertBoundsCheck(HInstruction indexerNode, HInstruction array,
-      HInstruction indexArgument, JClosedWorld closedWorld) {
+  HBoundsCheck insertBoundsCheck(
+      HInvokeDynamic indexerNode,
+      HInstruction array,
+      HInstruction indexArgument,
+      JClosedWorld closedWorld,
+      OptimizationTestLog log) {
     final abstractValueDomain = closedWorld.abstractValueDomain;
+
+    if (abstractValueDomain.isNull(array.instructionType).isPotentiallyTrue) {
+      HNullCheck check = HNullCheck(
+          array, abstractValueDomain.excludeNull(array.instructionType))
+        ..selector = indexerNode.selector
+        ..sourceInformation = indexerNode.sourceInformation;
+      log?.registerNullCheck(indexerNode, check);
+      indexerNode.block.addBefore(indexerNode, check);
+      array = check;
+    }
+
     HGetLength length = HGetLength(array, abstractValueDomain.positiveIntType,
         isAssignable: abstractValueDomain
             .isFixedLengthJsIndexable(array.instructionType)
@@ -212,7 +227,7 @@
     HInstruction checkedIndex = index;
     if (requiresBoundsCheck(instruction, closedWorld)) {
       checkedIndex =
-          insertBoundsCheck(instruction, receiver, index, closedWorld);
+          insertBoundsCheck(instruction, receiver, index, closedWorld, log);
     }
     HIndexAssign converted = HIndexAssign(
         closedWorld.abstractValueDomain, receiver, checkedIndex, value);
@@ -291,7 +306,7 @@
     HInstruction checkedIndex = index;
     if (requiresBoundsCheck(instruction, closedWorld)) {
       checkedIndex =
-          insertBoundsCheck(instruction, receiver, index, closedWorld);
+          insertBoundsCheck(instruction, receiver, index, closedWorld, log);
     }
     HIndex converted = HIndex(receiver, checkedIndex, elementType);
     log?.registerIndex(instruction, converted);
@@ -322,7 +337,7 @@
     if (requiresBoundsCheck(instruction, closedWorld)) {
       HConstant zeroIndex = graph.addConstantInt(0, closedWorld);
       HBoundsCheck check =
-          insertBoundsCheck(instruction, receiver, zeroIndex, closedWorld);
+          insertBoundsCheck(instruction, receiver, zeroIndex, closedWorld, log);
       HInstruction minusOne = graph.addConstantInt(-1, closedWorld);
       check.inputs.add(minusOne);
       minusOne.usedBy.add(check);
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index d600d7e..0475798 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -606,8 +606,20 @@
           .isDefinitelyTrue) {
         resultType = _abstractValueDomain.uint32Type;
       }
+      HInstruction checkedReceiver = actualReceiver;
+      if (actualReceiver.isNull(_abstractValueDomain).isPotentiallyTrue) {
+        // The receiver is potentially `null` so we insert a null receiver
+        // check. This will be folded into the length access later.
+        HNullCheck check = HNullCheck(actualReceiver,
+            _abstractValueDomain.excludeNull(actualReceiver.instructionType))
+          ..selector = node.selector
+          ..sourceInformation = node.sourceInformation;
+        _log?.registerNullCheck(node, check);
+        node.block.addBefore(node, check);
+        checkedReceiver = check;
+      }
       HGetLength result =
-          HGetLength(actualReceiver, resultType, isAssignable: !isFixed);
+          HGetLength(checkedReceiver, resultType, isAssignable: !isFixed);
       return result;
     } else if (actualReceiver.isConstantMap()) {
       HConstant constantInput = actualReceiver;
@@ -2607,12 +2619,14 @@
     if (branch is HIf) {
       if (branch.thenBlock.isLive == branch.elseBlock.isLive) return;
       assert(branch.condition.isConstant());
-      HBasicBlock target =
+      HBasicBlock liveSuccessor =
           branch.thenBlock.isLive ? branch.thenBlock : branch.elseBlock;
-      HInstruction instruction = target.first;
-      while (!instruction.isControlFlow()) {
-        HInstruction next = instruction.next;
+      HInstruction instruction = liveSuccessor.first;
+      // Move instructions up until the final control flow instruction or pinned
+      // HTypeKnown.
+      while (instruction.next != null) {
         if (instruction is HTypeKnown && instruction.isPinned) break;
+        HInstruction next = instruction.next;
         // It might be worth re-running GVN optimizations if we hoisted a
         // GVN-able instructions from [target] into [block].
         newGvnCandidates = newGvnCandidates || instruction.useGvn();
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 5b825ce..39c3355 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -101,6 +101,8 @@
           graph.asyncElementType,
           sourceInformationBuilder.buildAsyncBody(),
           sourceInformationBuilder.buildAsyncExit());
+      _codegen.tracer
+          .traceJavaScriptText('JavaScript.rewrite', result.debugPrint);
     }
     if (result.sourceInformation == null) {
       result = result.withSourceInformation(
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 8887610..c8a843f 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -30,6 +30,35 @@
     });
   }
 
+  void traceJavaScriptText(String name, String data) {
+    DEBUG_MODE = true;
+    tag("cfg", () {
+      printProperty("name", name);
+      // Emit a fake basic block, with one 'instruction' per line of text.
+      tag("block", () {
+        printProperty("name", "B1");
+        printProperty("from_bci", -1);
+        printProperty("to_bci", -1);
+        printEmptyProperty("predecessors");
+        printEmptyProperty("successors");
+        printEmptyProperty("xhandlers");
+        printEmptyProperty("flags");
+        tag("states", () {
+          tag("locals", () {
+            printProperty("size", 0);
+            printProperty("method", "None");
+          });
+        });
+        tag("HIR", () {
+          for (final line in data.split('\n')) {
+            addIndent();
+            add("0 0 i0 js | $line<|@\n");
+          }
+        });
+      });
+    });
+  }
+
   void addPredecessors(HBasicBlock block) {
     if (block.predecessors.isEmpty) {
       printEmptyProperty("predecessors");
diff --git a/pkg/compiler/lib/src/tracer.dart b/pkg/compiler/lib/src/tracer.dart
index 3386c81..26f4bb3d 100644
--- a/pkg/compiler/lib/src/tracer.dart
+++ b/pkg/compiler/lib/src/tracer.dart
@@ -55,6 +55,11 @@
     }
   }
 
+  void traceJavaScriptText(String name, String Function() getText) {
+    if (!traceActive) return;
+    HTracer(output, closedWorld).traceJavaScriptText(name, getText());
+  }
+
   void close() {
     if (output != null) {
       output.close();
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index ea42f4a..9352fa8 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -174,7 +174,7 @@
     if (nativeBasicData.isJsInteropClass(cls)) {
       // We can not tell js-interop classes apart, so we just assume the
       // receiver could be any js-interop class.
-      cls = commonElements.jsJavaScriptObjectClass;
+      cls = commonElements.jsLegacyJavaScriptObjectClass;
       relation = ClassRelation.subtype;
     }
     return StrongModeConstraint.internal(cls, relation);
diff --git a/pkg/compiler/test/custom_split/custom_split_test.dart b/pkg/compiler/test/custom_split/custom_split_test.dart
index fb0968a..f1e4fd4 100644
--- a/pkg/compiler/test/custom_split/custom_split_test.dart
+++ b/pkg/compiler/test/custom_split/custom_split_test.dart
@@ -83,17 +83,30 @@
   return json;
 }
 
+Uri getFileInTestFolder(String test, String file) =>
+    Platform.script.resolve('data/$test/$file');
+
+Future<String> compileConstraintsToJson(String test, Compiler compiler) async {
+  var constraints = getFileInTestFolder(test, 'constraints.dart');
+  var component = compiler.componentForTesting;
+  return constraintsToJson(component, constraints);
+}
+
+File getConstraintsJsonFile(String test) {
+  var constraintsJsonUri = getFileInTestFolder(test, 'constraints.json');
+  return File(constraintsJsonUri.toFilePath());
+}
+
 /// Verifies the programmatic API produces the expected JSON.
 Future<void> verifyCompiler(String test, Compiler compiler) async {
-  var constraints = Platform.script.resolve('data/$test/constraints.dart');
-  var constraintsJsonUri =
-      Platform.script.resolve('data/$test/constraints.json');
-  var component = compiler.componentForTesting;
-  var json = await constraintsToJson(component, constraints);
-  var constraintsJson =
-      File(constraintsJsonUri.toFilePath()).readAsStringSync();
-  constraintsJson = constraintsJson.substring(0, constraintsJson.length - 1);
-  Expect.equals(json, constraintsJson);
+  var json = await compileConstraintsToJson(test, compiler);
+  Expect.equals(getConstraintsJsonFile(test).readAsStringSync(), json);
+}
+
+/// Generates constraint JSON.
+Future<void> generateJSON(String test, Compiler compiler) async {
+  var json = await compileConstraintsToJson(test, compiler);
+  getConstraintsJsonFile(test).writeAsStringSync(json);
 }
 
 /// Compute the [OutputUnit]s for all source files involved in the test, and
@@ -102,6 +115,7 @@
 /// or all supporting libraries to be in the `libs` folder, starting with the
 /// same name as the original file in `data`.
 main(List<String> args) {
+  bool generateGoldens = args.contains('-g');
   asyncTest(() async {
     Directory dataDir = Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const OutputUnitDataComputer(),
@@ -109,6 +123,8 @@
         perTestOptions: createPerTestOptions(),
         args: args, setUpFunction: () {
       importPrefixes.clear();
-    }, testedConfigs: allSpecConfigs, verifyCompiler: verifyCompiler);
+    },
+        testedConfigs: allSpecConfigs,
+        verifyCompiler: generateGoldens ? generateJSON : verifyCompiler);
   });
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond/constraints.dart b/pkg/compiler/test/custom_split/data/diamond/constraints.dart
index 92a7665..88ccb84 100644
--- a/pkg/compiler/test/custom_split/data/diamond/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond/constraints.dart
@@ -12,12 +12,16 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.orderNode('step1', 'step2a'),
-    builder.orderNode('step1', 'step2b'),
-    builder.orderNode('step2a', 'step3'),
-    builder.orderNode('step2b', 'step3'),
+    builder.orderNode(step1, step2a),
+    builder.orderNode(step1, step2b),
+    builder.orderNode(step2a, step3),
+    builder.orderNode(step2b, step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond/constraints.json b/pkg/compiler/test/custom_split/data/diamond/constraints.json
index 83dfe0a..21b8afa 100644
--- a/pkg/compiler/test/custom_split/data/diamond/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond/constraints.json
@@ -1,42 +1,42 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2a"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2b"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "order",
-    "predecessor": "step2a",
-    "successor": "step3"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step2a",
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "order",
-    "predecessor": "step2b",
-    "successor": "step3"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step2b",
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
index b3a40ca..a333016 100644
--- a/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
@@ -12,11 +12,15 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.andNode('step2', ['step2a', 'step2b']),
-    builder.orderNode('step1', 'step2'),
-    builder.orderNode('step2', 'step3'),
+    builder.andNode('step2', {step2a, step2b}),
+    builder.orderNode(step1, 'step2'),
+    builder.orderNode('step2', step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond_and/constraints.json b/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
index 931a910..85344e7 100644
--- a/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
@@ -1,40 +1,40 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "and",
     "name": "step2",
     "nodes": [
-      "step2a",
-      "step2b"
+      "memory:sdk/tests/web/native/main.dart#step2a",
+      "memory:sdk/tests/web/native/main.dart#step2b"
     ]
   },
   {
     "type": "order",
-    "predecessor": "step1",
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
     "successor": "step2"
   },
   {
     "type": "order",
     "predecessor": "step2",
-    "successor": "step3"
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
index 6fdf62e..145cbd1 100644
--- a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
@@ -12,11 +12,15 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.fuseNode('step2', ['step2a', 'step2b']),
-    builder.orderNode('step1', 'step2'),
-    builder.orderNode('step2', 'step3'),
+    builder.fuseNode('step2', {step2a, step2b}),
+    builder.orderNode(step1, 'step2'),
+    builder.orderNode('step2', step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
index f170d18..dccfe20 100644
--- a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
@@ -1,40 +1,40 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "fuse",
     "name": "step2",
     "nodes": [
-      "step2a",
-      "step2b"
+      "memory:sdk/tests/web/native/main.dart#step2a",
+      "memory:sdk/tests/web/native/main.dart#step2b"
     ]
   },
   {
     "type": "order",
-    "predecessor": "step1",
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
     "successor": "step2"
   },
   {
     "type": "order",
     "predecessor": "step2",
-    "successor": "step3"
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
index 659bf73..bdc5e1f 100644
--- a/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
@@ -12,11 +12,15 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.orNode('step2', ['step2a', 'step2b']),
-    builder.orderNode('step1', 'step2'),
-    builder.orderNode('step2', 'step3'),
+    builder.orNode('step2', {step2a, step2b}),
+    builder.orderNode(step1, 'step2'),
+    builder.orderNode('step2', step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/diamond_or/constraints.json b/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
index 5fcc300..c4091f4 100644
--- a/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
@@ -1,40 +1,40 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "or",
     "name": "step2",
     "nodes": [
-      "step2a",
-      "step2b"
+      "memory:sdk/tests/web/native/main.dart#step2a",
+      "memory:sdk/tests/web/native/main.dart#step2b"
     ]
   },
   {
     "type": "order",
-    "predecessor": "step1",
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
     "successor": "step2"
   },
   {
     "type": "order",
     "predecessor": "step2",
-    "successor": "step3"
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/two_branch/constraints.dart b/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
index 1e6ad05..27a00ab 100644
--- a/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
@@ -12,10 +12,13 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+  var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.orderNode('step1', 'step2a'),
-    builder.orderNode('step1', 'step2b'),
+    builder.orderNode(step1, step2a),
+    builder.orderNode(step1, step2b),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/two_branch/constraints.json b/pkg/compiler/test/custom_split/data/two_branch/constraints.json
index 8b86071..1a29d7b 100644
--- a/pkg/compiler/test/custom_split/data/two_branch/constraints.json
+++ b/pkg/compiler/test/custom_split/data/two_branch/constraints.json
@@ -1,27 +1,27 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2a",
+    "name": "memory:sdk/tests/web/native/main.dart#step2a",
     "import": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "reference",
-    "name": "step2b",
+    "name": "memory:sdk/tests/web/native/main.dart#step2b",
     "import": "memory:sdk/tests/web/native/main.dart#step2b"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2a"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2a"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2b"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2b"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/two_step/constraints.dart b/pkg/compiler/test/custom_split/data/two_step/constraints.dart
index 9089c5c..fe0d8a5 100644
--- a/pkg/compiler/test/custom_split/data/two_step/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/two_step/constraints.dart
@@ -12,10 +12,13 @@
 }
 
 List<Node> processDeferredImports(List<String> imports) {
+  var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+  var step2 = 'memory:sdk/tests/web/native/main.dart#step2';
+  var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
   var builder = ProgramSplitBuilder();
   return [
     ...imports.map(builder.referenceNode),
-    builder.orderNode('step1', 'step2'),
-    builder.orderNode('step2', 'step3'),
+    builder.orderNode(step1, step2),
+    builder.orderNode(step2, step3),
   ];
 }
diff --git a/pkg/compiler/test/custom_split/data/two_step/constraints.json b/pkg/compiler/test/custom_split/data/two_step/constraints.json
index b72db44..77a02de 100644
--- a/pkg/compiler/test/custom_split/data/two_step/constraints.json
+++ b/pkg/compiler/test/custom_split/data/two_step/constraints.json
@@ -1,27 +1,27 @@
 [
   {
     "type": "reference",
-    "name": "step1",
+    "name": "memory:sdk/tests/web/native/main.dart#step1",
     "import": "memory:sdk/tests/web/native/main.dart#step1"
   },
   {
     "type": "reference",
-    "name": "step2",
+    "name": "memory:sdk/tests/web/native/main.dart#step2",
     "import": "memory:sdk/tests/web/native/main.dart#step2"
   },
   {
     "type": "reference",
-    "name": "step3",
+    "name": "memory:sdk/tests/web/native/main.dart#step3",
     "import": "memory:sdk/tests/web/native/main.dart#step3"
   },
   {
     "type": "order",
-    "predecessor": "step1",
-    "successor": "step2"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+    "successor": "memory:sdk/tests/web/native/main.dart#step2"
   },
   {
     "type": "order",
-    "predecessor": "step2",
-    "successor": "step3"
+    "predecessor": "memory:sdk/tests/web/native/main.dart#step2",
+    "successor": "memory:sdk/tests/web/native/main.dart#step3"
   }
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/end_to_end/command_line_test.dart b/pkg/compiler/test/end_to_end/command_line_test.dart
index ec0a78a..f3ecc57 100644
--- a/pkg/compiler/test/end_to_end/command_line_test.dart
+++ b/pkg/compiler/test/end_to_end/command_line_test.dart
@@ -91,14 +91,27 @@
       '--out=foo.dill'
     ], out: 'foo.dill', readClosedWorld: 'foo.world', writeData: 'foo.data');
 
-    await test([Flags.readData, 'foo.dill'],
-        out: 'out.js', readData: 'foo.dill.data');
-    await test([Flags.readData, 'foo.dill', '--out=foo.js'],
-        out: 'foo.js', readData: 'foo.dill.data');
-    await test(['${Flags.readData}=out.data', 'foo.dill'],
-        out: 'out.js', readData: 'out.data');
-    await test(['${Flags.readData}=out.data', 'foo.dill', '--out=foo.js'],
-        out: 'foo.js', readData: 'out.data');
+    await test([Flags.readData, 'foo.dill'], exitCode: 1);
+    await test([Flags.readClosedWorld, Flags.readData, 'foo.dill'],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data');
+    await test(
+        [Flags.readClosedWorld, Flags.readData, 'foo.dill', '--out=foo.js'],
+        out: 'foo.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data');
+    await test([
+      '${Flags.readClosedWorld}=out.world',
+      '${Flags.readData}=out.data',
+      'foo.dill'
+    ], out: 'out.js', readClosedWorld: 'out.world', readData: 'out.data');
+    await test([
+      '${Flags.readClosedWorld}=out.world',
+      '${Flags.readData}=out.data',
+      'foo.dill',
+      '--out=foo.js'
+    ], out: 'foo.js', readClosedWorld: 'out.world', readData: 'out.data');
 
     await test([
       Flags.writeCodegen,
@@ -107,6 +120,7 @@
       '${Flags.codegenShards}=2'
     ], exitCode: 1);
     await test([
+      Flags.readClosedWorld,
       Flags.readData,
       Flags.writeCodegen,
       'foo.dill',
@@ -114,6 +128,7 @@
       '${Flags.codegenShards}=2'
     ],
         out: 'out',
+        readClosedWorld: 'foo.dill.world',
         readData: 'foo.dill.data',
         writeCodegen: 'out.code',
         codegenShard: 0,
@@ -121,16 +136,19 @@
     await test([
       Flags.writeCodegen,
       Flags.readData,
+      Flags.readClosedWorld,
       'foo.dill',
       '${Flags.codegenShard}=1',
       '${Flags.codegenShards}=2'
     ],
         out: 'out',
+        readClosedWorld: 'foo.dill.world',
         readData: 'foo.dill.data',
         writeCodegen: 'out.code',
         codegenShard: 1,
         codegenShards: 2);
     await test([
+      '${Flags.readClosedWorld}=foo.world',
       '${Flags.readData}=foo.data',
       '${Flags.writeCodegen}=foo.code',
       'foo.dill',
@@ -138,6 +156,7 @@
       '${Flags.codegenShards}=3'
     ],
         out: 'out',
+        readClosedWorld: 'foo.world',
         readData: 'foo.data',
         writeCodegen: 'foo.code',
         codegenShard: 0,
@@ -145,12 +164,14 @@
     await test([
       '${Flags.readData}=foo.data',
       '${Flags.writeCodegen}',
+      '${Flags.readClosedWorld}=foo.world',
       'foo.dill',
       '--out=foo.js',
       '${Flags.codegenShard}=0',
       '${Flags.codegenShards}=2'
     ],
         out: 'foo.js',
+        readClosedWorld: 'foo.world',
         readData: 'foo.data',
         writeCodegen: 'foo.js.code',
         codegenShard: 0,
@@ -203,28 +224,126 @@
       '${Flags.codegenShards}=2'
     ], exitCode: 1);
 
-    await test([Flags.readCodegen, 'foo.dill', '${Flags.codegenShards}=2'],
-        out: 'out.js',
-        readData: 'foo.dill.data',
-        readCodegen: 'foo.dill.code',
-        codegenShards: 2);
+    // These three flags should parse in any order, but all are required.
     await test([
-      '${Flags.readCodegen}=foo.code',
-      'foo.dill',
-      '${Flags.codegenShards}=3'
-    ],
-        out: 'out.js',
-        readData: 'foo.dill.data',
-        readCodegen: 'foo.code',
-        codegenShards: 3);
-
-    await test([
+      Flags.readClosedWorld,
       Flags.readData,
       Flags.readCodegen,
       'foo.dill',
       '${Flags.codegenShards}=2'
     ],
         out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readClosedWorld,
+      Flags.readCodegen,
+      Flags.readData,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readCodegen,
+      Flags.readClosedWorld,
+      Flags.readData,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readCodegen,
+      Flags.readData,
+      Flags.readClosedWorld,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readData,
+      Flags.readCodegen,
+      Flags.readClosedWorld,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readData,
+      Flags.readClosedWorld,
+      Flags.readCodegen,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      Flags.readClosedWorld,
+      Flags.readCodegen,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ], exitCode: 1);
+    await test([
+      Flags.readData,
+      Flags.readCodegen,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ], exitCode: 1);
+
+    await test([
+      Flags.readData,
+      Flags.readClosedWorld,
+      Flags.readCodegen,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
+        readData: 'foo.dill.data',
+        readCodegen: 'foo.dill.code',
+        codegenShards: 2);
+    await test([
+      '${Flags.readCodegen}=foo.code',
+      'foo.dill',
+      '${Flags.codegenShards}=3',
+      Flags.readData,
+      Flags.readClosedWorld,
+    ],
+        out: 'out.js',
+        readData: 'foo.dill.data',
+        readClosedWorld: 'foo.dill.world',
+        readCodegen: 'foo.code',
+        codegenShards: 3);
+
+    await test([
+      Flags.readData,
+      Flags.readCodegen,
+      Flags.readClosedWorld,
+      'foo.dill',
+      '${Flags.codegenShards}=2'
+    ],
+        out: 'out.js',
+        readClosedWorld: 'foo.dill.world',
         readData: 'foo.dill.data',
         readCodegen: 'foo.dill.code',
         codegenShards: 2);
@@ -233,9 +352,11 @@
       '${Flags.readCodegen}=foo.code',
       'foo.dill',
       '${Flags.codegenShards}=3',
+      '${Flags.readClosedWorld}=foo.world',
       '-v'
     ],
         out: 'out.js',
+        readClosedWorld: 'foo.world',
         readData: 'foo.data',
         readCodegen: 'foo.code',
         codegenShards: 3);
diff --git a/pkg/compiler/test/end_to_end/feature_options_test.dart b/pkg/compiler/test/end_to_end/feature_options_test.dart
index d950d19..db2c87e 100644
--- a/pkg/compiler/test/end_to_end/feature_options_test.dart
+++ b/pkg/compiler/test/end_to_end/feature_options_test.dart
@@ -12,6 +12,8 @@
 import 'package:compiler/src/options.dart' show FeatureOptions, FeatureOption;
 
 class TestFeatureOptions extends FeatureOptions {
+  FeatureOption f1 = FeatureOption('f1');
+  FeatureOption noF2 = FeatureOption('f2', isNegativeFlag: true);
   FeatureOption sf1 = FeatureOption('sf1');
   FeatureOption sf2 = FeatureOption('sf2');
   FeatureOption noSf3 = FeatureOption('sf3', isNegativeFlag: true);
@@ -22,6 +24,9 @@
   FeatureOption noCf4 = FeatureOption('cf4', isNegativeFlag: true);
 
   @override
+  List<FeatureOption> shipped;
+
+  @override
   List<FeatureOption> shipping;
 
   @override
@@ -29,6 +34,7 @@
 
   // Initialize feature lists.
   TestFeatureOptions() {
+    shipped = [f1, noF2];
     shipping = [sf1, sf2, noSf3, noSf4];
     canary = [cf1, cf2, noCf3, noCf4];
   }
@@ -40,8 +46,14 @@
   return tfo;
 }
 
+void expectShipped(TestFeatureOptions tfo) {
+  Expect.isTrue(tfo.f1.isEnabled);
+  Expect.isTrue(tfo.noF2.isDisabled);
+}
+
 void testShipping() {
   var tfo = test([]);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isEnabled);
   Expect.isTrue(tfo.noSf3.isDisabled);
@@ -54,6 +66,7 @@
 
 void testNoShipping() {
   var tfo = test([Flags.noShipping]);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isDisabled);
   Expect.isTrue(tfo.sf2.isDisabled);
   Expect.isTrue(tfo.noSf3.isEnabled);
@@ -66,6 +79,7 @@
 
 void testCanary() {
   var tfo = test([Flags.canary]);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isEnabled);
   Expect.isTrue(tfo.noSf3.isDisabled);
@@ -78,6 +92,7 @@
 
 void testShippingDisabled() {
   var tfo = test(['--no-sf2', '--sf3']);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isDisabled);
   Expect.isTrue(tfo.noSf3.isEnabled);
@@ -90,6 +105,7 @@
 
 void testCanaryDisabled() {
   var tfo = test([Flags.canary, '--no-sf2', '--sf3', '--no-cf1', '--cf3']);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isDisabled);
   Expect.isTrue(tfo.noSf3.isEnabled);
@@ -102,6 +118,7 @@
 
 void testNoShippingEnabled() {
   var tfo = test([Flags.noShipping, '--sf1', '--no-sf3', '--cf2', '--no-cf3']);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isDisabled);
   Expect.isTrue(tfo.noSf3.isDisabled);
@@ -114,6 +131,7 @@
 
 void testNoCanaryEnabled() {
   var tfo = test(['--cf1', '--no-cf3']);
+  expectShipped(tfo);
   Expect.isTrue(tfo.sf1.isEnabled);
   Expect.isTrue(tfo.sf2.isEnabled);
   Expect.isTrue(tfo.noSf3.isDisabled);
@@ -128,6 +146,11 @@
   Expect.throwsArgumentError(() => test(['--cf1', '--no-cf1']));
 }
 
+void testNoShippedDisable() {
+  Expect.throwsArgumentError(() => test(['--no-f1']));
+  Expect.throwsArgumentError(() => test(['--f2']));
+}
+
 void flavorStringTest(List<String> options, String expectedFlavorString) {
   var tfo = test(options);
   Expect.equals(expectedFlavorString, tfo.flavorString());
@@ -159,6 +182,7 @@
   testNoCanaryEnabled();
   testNoShippingEnabled();
   testFlagCollision();
+  testNoShippedDisable();
 
   // Supplemental tests.
   flavorStringTests();
diff --git a/pkg/compiler/test/end_to_end/launch_helper.dart b/pkg/compiler/test/end_to_end/launch_helper.dart
index 7d5a2c5..f0eef27 100644
--- a/pkg/compiler/test/end_to_end/launch_helper.dart
+++ b/pkg/compiler/test/end_to_end/launch_helper.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'dart:io';
+
 import 'package:path/path.dart' as path;
 
 List<String> dart2JsCommand(List<String> args) {
@@ -16,9 +17,7 @@
   String dart2jsPath =
       path.normalize(path.join(basePath, 'pkg/compiler/lib/src/dart2js.dart'));
   List command = <String>[];
-  if (Platform.packageRoot != null) {
-    command.add('--package-root=${Platform.packageRoot}');
-  } else if (Platform.packageConfig != null) {
+  if (Platform.packageConfig != null) {
     command.add('--packages=${Platform.packageConfig}');
   }
   command.add(dart2jsPath);
diff --git a/pkg/compiler/test/helpers/program_lookup.dart b/pkg/compiler/test/helpers/program_lookup.dart
index 12511aa..9e985f5 100644
--- a/pkg/compiler/test/helpers/program_lookup.dart
+++ b/pkg/compiler/test/helpers/program_lookup.dart
@@ -234,7 +234,7 @@
   root.accept(visitor);
 }
 
-class CallbackVisitor extends js.BaseVisitor {
+class CallbackVisitor extends js.BaseVisitorVoid {
   final void Function(js.Call) onCall;
   final void Function(js.PropertyAccess) onPropertyAccess;
   final void Function(js.Assignment) onAssignment;
@@ -244,25 +244,25 @@
       {this.onCall, this.onPropertyAccess, this.onAssignment, this.onSwitch});
 
   @override
-  visitCall(js.Call node) {
+  void visitCall(js.Call node) {
     if (onCall != null) onCall(node);
     super.visitCall(node);
   }
 
   @override
-  visitAccess(js.PropertyAccess node) {
+  void visitAccess(js.PropertyAccess node) {
     if (onPropertyAccess != null) onPropertyAccess(node);
     super.visitAccess(node);
   }
 
   @override
-  visitAssignment(js.Assignment node) {
+  void visitAssignment(js.Assignment node) {
     if (onAssignment != null) onAssignment(node);
     return super.visitAssignment(node);
   }
 
   @override
-  visitSwitch(js.Switch node) {
+  void visitSwitch(js.Switch node) {
     if (onSwitch != null) onSwitch(node);
     return super.visitSwitch(node);
   }
diff --git a/pkg/compiler/test/impact/data/jsinterop.dart b/pkg/compiler/test/impact/data/jsinterop.dart
index b39e444..0451381 100644
--- a/pkg/compiler/test/impact/data/jsinterop.dart
+++ b/pkg/compiler/test/impact/data/jsinterop.dart
@@ -27,7 +27,7 @@
 
 @JS()
 class JsInteropClass {
-  /*member: JsInteropClass.:static=[JavaScriptObject.(0)]*/
+  /*member: JsInteropClass.:static=[LegacyJavaScriptObject.(0)]*/
   external JsInteropClass();
 
   /*member: JsInteropClass.method:
@@ -50,14 +50,14 @@
 }
 
 /*member: testJsInteropClass:
- dynamic=[JavaScriptObject.method(0)],
+ dynamic=[LegacyJavaScriptObject.method(0)],
  static=[JsInteropClass.(0)]
 */
 testJsInteropClass() => new JsInteropClass().method();
 
 typedef void Callback<T>(T value);
 
-/*member: GenericClass.:static=[JavaScriptObject.(0)]*/
+/*member: GenericClass.:static=[LegacyJavaScriptObject.(0)]*/
 @JS()
 class GenericClass<T> {
   /*member: GenericClass.method:
@@ -113,7 +113,7 @@
 }
 
 /*member: testOptionalGenericFunctionTypeArgument:
- dynamic=[JavaScriptObject.method(0)],
+ dynamic=[LegacyJavaScriptObject.method(0)],
  static=[GenericClass.(0)]
 */
 testOptionalGenericFunctionTypeArgument() => new GenericClass().method();
diff --git a/pkg/compiler/test/inference/data/js_interop.dart b/pkg/compiler/test/inference/data/js_interop.dart
index 994a675..d436c62 100644
--- a/pkg/compiler/test/inference/data/js_interop.dart
+++ b/pkg/compiler/test/inference/data/js_interop.dart
@@ -23,7 +23,7 @@
       {/*[exact=JSUInt31]*/ a, /*Value([exact=JSString], value: "")*/ b});
 }
 
-/*member: anonymousClass:[null|subclass=JavaScriptObject]*/
+/*member: anonymousClass:[null|subclass=LegacyJavaScriptObject]*/
 anonymousClass() => new Class1(a: 1, b: '');
 
 @JS()
@@ -43,9 +43,9 @@
 /*member: jsInteropClass:[subclass=JSInt]*/
 jsInteropClass() {
   JsInteropClass cls = new JsInteropClass();
-  return cls. /*update: [null|subclass=JavaScriptObject]*/ setter =
-      cls. /*[null|subclass=JavaScriptObject]*/ getter /*invoke: [null|subclass=JSInt]*/ +
-          cls. /*invoke: [subclass=JavaScriptObject]*/ method(
+  return cls. /*update: [null|subclass=LegacyJavaScriptObject]*/ setter =
+      cls. /*[null|subclass=LegacyJavaScriptObject]*/ getter /*invoke: [null|subclass=JSInt]*/ +
+          cls. /*invoke: [subclass=LegacyJavaScriptObject]*/ method(
               0) /*invoke: [subclass=JSInt]*/ +
           10;
 }
diff --git a/pkg/compiler/test/jsinterop/internal_annotations_test.dart b/pkg/compiler/test/jsinterop/internal_annotations_test.dart
index efea232..62deced 100644
--- a/pkg/compiler/test/jsinterop/internal_annotations_test.dart
+++ b/pkg/compiler/test/jsinterop/internal_annotations_test.dart
@@ -106,6 +106,8 @@
         registerClass(world.commonElements.jsInterceptorClass);
     ClassEntity JavaScriptObject =
         registerClass(world.commonElements.jsJavaScriptObjectClass);
+    ClassEntity LegacyJavaScriptObject =
+        registerClass(world.commonElements.jsLegacyJavaScriptObjectClass);
     ClassEntity A = registerClass(findClass(world, 'A'));
     ClassEntity B = registerClass(findClass(world, 'B'));
     ClassEntity C = registerClass(findClass(world, 'C'));
@@ -118,11 +120,13 @@
     Expect.equals(elementEnvironment.getSuperClass(Interceptor), Object_);
     Expect.equals(
         elementEnvironment.getSuperClass(JavaScriptObject), Interceptor);
+    Expect.equals(elementEnvironment.getSuperClass(LegacyJavaScriptObject),
+        JavaScriptObject);
 
-    Expect.equals(elementEnvironment.getSuperClass(A), JavaScriptObject);
-    Expect.equals(elementEnvironment.getSuperClass(B), JavaScriptObject);
-    Expect.equals(elementEnvironment.getSuperClass(C), JavaScriptObject);
-    Expect.equals(elementEnvironment.getSuperClass(D), JavaScriptObject);
+    Expect.equals(elementEnvironment.getSuperClass(A), LegacyJavaScriptObject);
+    Expect.equals(elementEnvironment.getSuperClass(B), LegacyJavaScriptObject);
+    Expect.equals(elementEnvironment.getSuperClass(C), LegacyJavaScriptObject);
+    Expect.equals(elementEnvironment.getSuperClass(D), LegacyJavaScriptObject);
     Expect.equals(elementEnvironment.getSuperClass(E), Object_);
     Expect.equals(elementEnvironment.getSuperClass(F), Object_);
 
@@ -180,7 +184,15 @@
             "Expected $name to be indirectly instantiated in `${mainSource}`:"
             "\n${world.classHierarchy.dump(cls)}");
       }
-      if (!isInstantiated && (name != 'Object' && name != 'Interceptor')) {
+      // Classes that are expected to be instantiated by default. `Object` and
+      // `Interceptor` are base types for non-native and native types, and
+      // `JavaScriptObject` is the base type for `dart:html` types.
+      var insantiatedBaseClasses = [
+        'Object',
+        'Interceptor',
+        'JavaScriptObject'
+      ];
+      if (!isInstantiated && !insantiatedBaseClasses.contains(name)) {
         Expect.isFalse(
             world.classHierarchy.isInstantiated(cls),
             "Expected $name to be uninstantiated in `${mainSource}`:"
@@ -191,28 +203,69 @@
 
   await test('main() {}');
 
-  await test('main() => newA();',
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => newA();', abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 
-  await test('main() => newB();',
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => newB();', abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 
-  await test('main() => newC();',
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => newC();', abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 
-  await test('main() => newD();',
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => newD();', abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 
   await test('main() => newE();', directlyInstantiated: ['E']);
 
   await test('main() => newF();', directlyInstantiated: ['F']);
 
-  await test('main() => [newD(), newE()];',
-      directlyInstantiated: ['E'],
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => [newD(), newE()];', directlyInstantiated: [
+    'E'
+  ], abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 }
diff --git a/pkg/compiler/test/jsinterop/world_test.dart b/pkg/compiler/test/jsinterop/world_test.dart
index bc495ac..230873f 100644
--- a/pkg/compiler/test/jsinterop/world_test.dart
+++ b/pkg/compiler/test/jsinterop/world_test.dart
@@ -100,6 +100,8 @@
         registerClass(world.commonElements.jsInterceptorClass);
     ClassEntity JavaScriptObject =
         registerClass(world.commonElements.jsJavaScriptObjectClass);
+    ClassEntity LegacyJavaScriptObject =
+        registerClass(world.commonElements.jsLegacyJavaScriptObjectClass);
     ClassEntity A = registerClass(findClass(world, 'A'));
     ClassEntity B = registerClass(findClass(world, 'B'));
     ClassEntity C = registerClass(findClass(world, 'C'));
@@ -112,11 +114,13 @@
     Expect.equals(elementEnvironment.getSuperClass(Interceptor), Object_);
     Expect.equals(
         elementEnvironment.getSuperClass(JavaScriptObject), Interceptor);
+    Expect.equals(elementEnvironment.getSuperClass(LegacyJavaScriptObject),
+        JavaScriptObject);
 
-    Expect.equals(elementEnvironment.getSuperClass(A), JavaScriptObject);
-    Expect.equals(elementEnvironment.getSuperClass(B), JavaScriptObject);
-    Expect.equals(elementEnvironment.getSuperClass(C), JavaScriptObject);
-    Expect.equals(elementEnvironment.getSuperClass(D), JavaScriptObject);
+    Expect.equals(elementEnvironment.getSuperClass(A), LegacyJavaScriptObject);
+    Expect.equals(elementEnvironment.getSuperClass(B), LegacyJavaScriptObject);
+    Expect.equals(elementEnvironment.getSuperClass(C), LegacyJavaScriptObject);
+    Expect.equals(elementEnvironment.getSuperClass(D), LegacyJavaScriptObject);
     Expect.equals(elementEnvironment.getSuperClass(E), Object_);
     Expect.equals(elementEnvironment.getSuperClass(F), Object_);
 
@@ -174,7 +178,15 @@
             "Expected $name to be indirectly instantiated in `${mainSource}`:"
             "\n${world.classHierarchy.dump(cls)}");
       }
-      if (!isInstantiated && (name != 'Object' && name != 'Interceptor')) {
+      // Classes that are expected to be instantiated by default. `Object` and
+      // `Interceptor` are base types for non-native and native types, and
+      // `JavaScriptObject` is the base type for `dart:html` types.
+      var insantiatedBaseClasses = [
+        'Object',
+        'Interceptor',
+        'JavaScriptObject'
+      ];
+      if (!isInstantiated && !insantiatedBaseClasses.contains(name)) {
         Expect.isFalse(
             world.classHierarchy.isInstantiated(cls),
             "Expected $name to be uninstantiated in `${mainSource}`:"
@@ -185,28 +197,69 @@
 
   await test('main() {}');
 
-  await test('main() => newA();',
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => newA();', abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 
-  await test('main() => newB();',
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => newB();', abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 
-  await test('main() => newC();',
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => newC();', abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 
-  await test('main() => newD();',
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => newD();', abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 
   await test('main() => newE();', directlyInstantiated: ['E']);
 
   await test('main() => newF();', directlyInstantiated: ['F']);
 
-  await test('main() => [newD(), newE()];',
-      directlyInstantiated: ['E'],
-      abstractlyInstantiated: ['A', 'B', 'C', 'D'],
-      indirectlyInstantiated: ['Object', 'Interceptor', 'JavaScriptObject']);
+  await test('main() => [newD(), newE()];', directlyInstantiated: [
+    'E'
+  ], abstractlyInstantiated: [
+    'A',
+    'B',
+    'C',
+    'D'
+  ], indirectlyInstantiated: [
+    'Object',
+    'Interceptor',
+    'JavaScriptObject',
+    'LegacyJavaScriptObject'
+  ]);
 }
diff --git a/pkg/compiler/test/model/cfe_annotations_test.dart b/pkg/compiler/test/model/cfe_annotations_test.dart
index c9bd48e..9cb3b6e 100644
--- a/pkg/compiler/test/model/cfe_annotations_test.dart
+++ b/pkg/compiler/test/model/cfe_annotations_test.dart
@@ -14,6 +14,7 @@
 import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/element_map_impl.dart';
 import 'package:expect/expect.dart';
+import 'package:front_end/src/api_prototype/lowering_predicates.dart';
 import 'package:kernel/ast.dart' as ir;
 
 import '../helpers/args_helper.dart';
@@ -434,6 +435,7 @@
                     implicitJsInteropMember:
                         nativeData.isJsInteropClass(classEntity),
                     implicitNativeMember: member is! ir.Constructor &&
+                        !isTearOffLowering(member) &&
                         nativeData.isNativeClass(classEntity) &&
                         !nativeData.isJsInteropClass(classEntity));
               }
diff --git a/pkg/compiler/test/rti/emission/jsinterop.dart b/pkg/compiler/test/rti/emission/jsinterop.dart
index f88db92..0e06b73 100644
--- a/pkg/compiler/test/rti/emission/jsinterop.dart
+++ b/pkg/compiler/test/rti/emission/jsinterop.dart
@@ -7,7 +7,7 @@
 @JS()
 library jsinterop;
 
-/*class: global#JavaScriptObject:checks=[$isA,$isC],instance*/
+/*class: global#LegacyJavaScriptObject:checks=[$isA,$isC],instance*/
 
 import 'package:js/js.dart';
 
diff --git a/pkg/compiler/test/rti/emission/jsinterop_generic.dart b/pkg/compiler/test/rti/emission/jsinterop_generic.dart
index d409967..31cade2 100644
--- a/pkg/compiler/test/rti/emission/jsinterop_generic.dart
+++ b/pkg/compiler/test/rti/emission/jsinterop_generic.dart
@@ -11,7 +11,7 @@
 
 // TODO(johnniwinther): Avoid generating duplicate is/as function when multiple
 // jsinterop classes implement the same interface.
-/*class: global#JavaScriptObject:checks=[$isA,$isB,$isB],instance*/
+/*class: global#LegacyJavaScriptObject:checks=[$isA,$isB,$isB],instance*/
 
 import 'package:expect/expect.dart';
 import 'package:js/js.dart';
diff --git a/pkg/compiler/test/rti/emission/jsinterop_generic_factory_args.dart b/pkg/compiler/test/rti/emission/jsinterop_generic_factory_args.dart
index 897ffea..77b181d 100644
--- a/pkg/compiler/test/rti/emission/jsinterop_generic_factory_args.dart
+++ b/pkg/compiler/test/rti/emission/jsinterop_generic_factory_args.dart
@@ -7,7 +7,7 @@
 @JS()
 library foo;
 
-/*class: global#JavaScriptObject:*/
+/*class: global#LegacyJavaScriptObject:*/
 
 import 'package:expect/expect.dart';
 import 'package:js/js.dart';
diff --git a/pkg/compiler/test/sourcemaps/helpers/sourcemap_helper.dart b/pkg/compiler/test/sourcemaps/helpers/sourcemap_helper.dart
index cc8df9a..424345f 100644
--- a/pkg/compiler/test/sourcemaps/helpers/sourcemap_helper.dart
+++ b/pkg/compiler/test/sourcemaps/helpers/sourcemap_helper.dart
@@ -271,7 +271,7 @@
 /// Visitor that collects all nodes that are within a function. Used by the
 /// [RecordingSourceInformationStrategy] to filter what is recorded in a
 /// [RecordedSourceInformationProcess].
-class FindVisitor extends js.BaseVisitor {
+class FindVisitor extends js.BaseVisitorVoid {
   final js.Node soughtNode;
   bool found = false;
   bool add = false;
@@ -280,7 +280,7 @@
   FindVisitor(this.soughtNode);
 
   @override
-  visitNode(js.Node node) {
+  void visitNode(js.Node node) {
     if (node == soughtNode) {
       found = true;
       add = true;
diff --git a/pkg/compiler/test/sourcemaps/nomapping_test.dart b/pkg/compiler/test/sourcemaps/nomapping_test.dart
index 7889b64..06cbf4f 100644
--- a/pkg/compiler/test/sourcemaps/nomapping_test.dart
+++ b/pkg/compiler/test/sourcemaps/nomapping_test.dart
@@ -31,7 +31,7 @@
     } else if (arg == '--write-js') {
       writeJs = true;
     } else {
-      int index = int.parse(arg, onError: (_) => null);
+      int index = int.tryParse(arg);
       if (index != null) {
         indices ??= <int>[];
         if (index < 0 || index >= TESTS.length * 2) {
diff --git a/pkg/compiler/test/sourcemaps/tools/diff_view.dart b/pkg/compiler/test/sourcemaps/tools/diff_view.dart
index 9f68323..9d245c3 100644
--- a/pkg/compiler/test/sourcemaps/tools/diff_view.dart
+++ b/pkg/compiler/test/sourcemaps/tools/diff_view.dart
@@ -866,12 +866,12 @@
 
 /// Visitor that computes a map from [js.Node]s to all attached source
 /// locations.
-class SourceLocationCollector extends js.BaseVisitor {
+class SourceLocationCollector extends js.BaseVisitorVoid {
   Map<js.Node, List<SourceLocation>> sourceLocations =
       <js.Node, List<SourceLocation>>{};
 
   @override
-  visitNode(js.Node node) {
+  void visitNode(js.Node node) {
     SourceInformation sourceInformation = node.sourceInformation;
     if (sourceInformation != null) {
       sourceLocations[node] = sourceInformation.sourceLocations;
diff --git a/pkg/compiler/tool/modular_test_suite.dart b/pkg/compiler/tool/modular_test_suite.dart
index 6195548..7a20a67 100644
--- a/pkg/compiler/tool/modular_test_suite.dart
+++ b/pkg/compiler/tool/modular_test_suite.dart
@@ -5,39 +5,23 @@
 /// Test the modular compilation pipeline of dart2js.
 ///
 /// This is a shell that runs multiple tests, one per folder under `data/`.
-import 'dart:io';
 import 'dart:async';
 
-import 'package:compiler/src/commandline_options.dart';
-import 'package:front_end/src/compute_platform_binaries_location.dart'
-    show computePlatformBinariesLocation;
 import 'package:modular_test/src/io_pipeline.dart';
-import 'package:modular_test/src/pipeline.dart';
-import 'package:modular_test/src/suite.dart';
 import 'package:modular_test/src/runner.dart';
-import 'package:package_config/package_config.dart';
+import 'modular_test_suite_helper.dart';
 
-String packageConfigJsonPath = ".dart_tool/package_config.json";
-Uri sdkRoot = Platform.script.resolve("../../../");
-Uri packageConfigUri = sdkRoot.resolve(packageConfigJsonPath);
-Options _options;
-String _dart2jsScript;
-String _kernelWorkerScript;
-
-// TODO(joshualitt): Figure out a way to support package configs in
-// tests/modular.
-PackageConfig _packageConfig;
 main(List<String> args) async {
-  _options = Options.parse(args);
-  _packageConfig = await loadPackageConfigUri(packageConfigUri);
-  await _resolveScripts();
+  var options = Options.parse(args);
+  await resolveScripts(options);
   await Future.wait([
     runSuite(
         sdkRoot.resolve('tests/modular/'),
         'tests/modular',
-        _options,
+        options,
         IOPipeline([
-          SourceToDillStep(),
+          OutlineDillCompilationStep(),
+          FullDillCompilationStep(),
           ModularAnalysisStep(),
           ComputeClosedWorldStep(useModularAnalysis: true),
           GlobalAnalysisStep(),
@@ -46,740 +30,5 @@
           Dart2jsEmissionStep(),
           RunD8(),
         ], cacheSharedModules: true)),
-    runSuite(
-        sdkRoot.resolve('tests/modular/'),
-        'tests/modular',
-        _options,
-        IOPipeline([
-          SourceToDillStep(),
-          ComputeClosedWorldStep(useModularAnalysis: false),
-          LegacyGlobalAnalysisStep(),
-          LegacyDart2jsCodegenStep(codeId0),
-          LegacyDart2jsCodegenStep(codeId1),
-          LegacyDart2jsEmissionStep(),
-          RunD8(),
-        ], cacheSharedModules: true))
   ]);
 }
-
-const dillId = DataId("dill");
-const modularUpdatedDillId = DataId("mdill");
-const modularDataId = DataId("mdata");
-const closedWorldId = DataId("world");
-const globalUpdatedDillId = DataId("gdill");
-const globalDataId = DataId("gdata");
-const codeId = ShardsDataId("code", 2);
-const codeId0 = ShardDataId(codeId, 0);
-const codeId1 = ShardDataId(codeId, 1);
-const jsId = DataId("js");
-const txtId = DataId("txt");
-const fakeRoot = 'dev-dart-app:/';
-
-String _packageConfigEntry(String name, Uri root,
-    {Uri packageRoot, LanguageVersion version}) {
-  var fields = [
-    '"name": "${name}"',
-    '"rootUri": "$root"',
-    if (packageRoot != null) '"packageUri": "$packageRoot"',
-    if (version != null) '"languageVersion": "$version"'
-  ];
-  return '{${fields.join(',')}}';
-}
-
-// Step that compiles sources in a module to a .dill file.
-class SourceToDillStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [dillId];
-
-  @override
-  bool get needsSources => true;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [dillId];
-
-  @override
-  List<DataId> get moduleDataNeeded => const [];
-
-  @override
-  bool get onlyOnMain => false;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: source-to-dill on $module");
-
-    // We use non file-URI schemes for representeing source locations in a
-    // root-agnostic way. This allows us to refer to file across modules and
-    // across steps without exposing the underlying temporary folders that are
-    // created by the framework. In build systems like bazel this is especially
-    // important because each step may be run on a different machine.
-    //
-    // Files in packages are defined in terms of `package:` URIs, while
-    // non-package URIs are defined using the `dart-dev-app` scheme.
-    String rootScheme = module.isSdk ? 'dart-dev-sdk' : 'dev-dart-app';
-    String sourceToImportUri(Uri relativeUri) {
-      if (module.isPackage) {
-        var basePath = module.packageBase.path;
-        var packageRelativePath = basePath == "./"
-            ? relativeUri.path
-            : relativeUri.path.substring(basePath.length);
-        return 'package:${module.name}/$packageRelativePath';
-      } else {
-        return '$rootScheme:/$relativeUri';
-      }
-    }
-
-    // We create both a .packages and package_config.json file which defines
-    // the location of this module if it is a package.  The CFE requires that
-    // if a `package:` URI of a dependency is used in an import, then we need
-    // that package entry in the associated file. However, after it checks that
-    // the definition exists, the CFE will not actually use the resolved URI if
-    // a library for the import URI is already found in one of the provide
-    // .dill files of the dependencies. For that reason, and to ensure that
-    // a step only has access to the files provided in a module, we generate a
-    // config file with invalid folders for other packages.
-    // TODO(sigmund): follow up with the CFE to see if we can remove the need
-    // for these dummy entries..
-    // TODO(joshualitt): Generate just the json file.
-    var packagesJson = [];
-    var packagesContents = StringBuffer();
-    if (module.isPackage) {
-      packagesContents.write('${module.name}:${module.packageBase}\n');
-      packagesJson.add(_packageConfigEntry(
-          module.name, Uri.parse('../${module.packageBase}')));
-    }
-
-    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
-    int unusedNum = 0;
-    for (Module dependency in transitiveDependencies) {
-      if (dependency.isPackage) {
-        // rootUri should be ignored for dependent modules, so we pass in a
-        // bogus value.
-        var rootUri = Uri.parse('unused$unusedNum');
-        unusedNum++;
-
-        var dependentPackage = _packageConfig[dependency.name];
-        var packageJson = dependentPackage == null
-            ? _packageConfigEntry(dependency.name, rootUri)
-            : _packageConfigEntry(dependentPackage.name, rootUri,
-                version: dependentPackage.languageVersion);
-        packagesJson.add(packageJson);
-        packagesContents.write('${dependency.name}:$rootUri\n');
-      }
-    }
-
-    if (module.isPackage) {
-      await File.fromUri(root.resolve(packageConfigJsonPath))
-          .create(recursive: true);
-      await File.fromUri(root.resolve(packageConfigJsonPath)).writeAsString('{'
-          '  "configVersion": ${_packageConfig.version},'
-          '  "packages": [ ${packagesJson.join(',')} ]'
-          '}');
-    }
-
-    await File.fromUri(root.resolve('.packages'))
-        .writeAsString('$packagesContents');
-
-    List<String> sources;
-    List<String> extraArgs;
-    if (module.isSdk) {
-      // When no flags are passed, we can skip compilation and reuse the
-      // platform.dill created by build.py.
-      if (flags.isEmpty) {
-        var platform = computePlatformBinariesLocation()
-            .resolve("dart2js_platform_unsound.dill");
-        var destination = root.resolveUri(toUri(module, dillId));
-        if (_options.verbose) {
-          print('command:\ncp $platform $destination');
-        }
-        await File.fromUri(platform).copy(destination.toFilePath());
-        return;
-      }
-      sources = ['dart:core'];
-      extraArgs = ['--libraries-file', '$rootScheme:///sdk/lib/libraries.json'];
-      assert(transitiveDependencies.isEmpty);
-    } else {
-      sources = module.sources.map(sourceToImportUri).toList();
-      extraArgs = ['--packages-file', '$rootScheme:/.packages'];
-    }
-
-    // TODO(joshualitt): Ensure the kernel worker has some way to specify
-    // --no-sound-null-safety
-    List<String> args = [
-      _kernelWorkerScript,
-      '--no-summary-only',
-      '--target',
-      'dart2js',
-      '--multi-root',
-      '$root',
-      '--multi-root-scheme',
-      rootScheme,
-      ...extraArgs,
-      '--output',
-      '${toUri(module, dillId)}',
-      ...(transitiveDependencies
-          .expand((m) => ['--input-linked', '${toUri(m, dillId)}'])),
-      ...(sources.expand((String uri) => ['--source', uri])),
-      ...(flags.expand((String flag) => ['--enable-experiment', flag])),
-    ];
-
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("\ncached step: source-to-dill on $module");
-  }
-}
-
-class ModularAnalysisStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [modularDataId, modularUpdatedDillId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [dillId];
-
-  @override
-  List<DataId> get moduleDataNeeded => const [dillId];
-
-  @override
-  bool get onlyOnMain => false;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: modular analysis on $module");
-    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
-    Iterable<String> dillDependencies =
-        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.inputDill}=${toUri(module, dillId)}',
-      if (dillDependencies.isNotEmpty)
-        '--dill-dependencies=${dillDependencies.join(',')}',
-      '--out=${toUri(module, modularUpdatedDillId)}',
-      '${Flags.writeModularAnalysis}=${toUri(module, modularDataId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) {
-      print("cached step: dart2js modular analysis on $module");
-    }
-  }
-}
-
-DataId idForDill({bool useModularAnalysis}) =>
-    useModularAnalysis ? modularUpdatedDillId : dillId;
-
-List<DataId> inputFromAnalysis({bool useModularAnalysis = false}) => [
-      idForDill(useModularAnalysis: useModularAnalysis),
-      if (useModularAnalysis) modularDataId,
-    ];
-
-// Step that invokes the dart2js closed world computation.
-class ComputeClosedWorldStep implements IOModularStep {
-  final bool useModularAnalysis;
-
-  ComputeClosedWorldStep({this.useModularAnalysis});
-
-  @override
-  List<DataId> get resultData => const [closedWorldId, globalUpdatedDillId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded =>
-      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose)
-      print("\nstep: dart2js compute closed world on $module");
-    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
-    DataId dillId = idForDill(useModularAnalysis: useModularAnalysis);
-    Iterable<String> dillDependencies =
-        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
-    List<String> dataDependencies = transitiveDependencies
-        .map((m) => '${toUri(m, modularDataId)}')
-        .toList();
-    dataDependencies.add('${toUri(module, modularDataId)}');
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      // TODO(sigmund): remove this dependency on libraries.json
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${Flags.inputDill}=${toUri(module, dillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.dillDependencies}=${dillDependencies.join(',')}',
-      if (useModularAnalysis)
-        '${Flags.readModularAnalysis}=${dataDependencies.join(',')}',
-      '${Flags.writeClosedWorld}=${toUri(module, closedWorldId)}',
-      Flags.noClosedWorldInData,
-      '--out=${toUri(module, globalUpdatedDillId)}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose)
-      print("\ncached step: dart2js compute closed world on $module");
-  }
-}
-
-// Step that runs the dart2js modular analysis.
-class GlobalAnalysisStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [globalDataId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [globalUpdatedDillId];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [closedWorldId, globalUpdatedDillId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: dart2js global analysis on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      // TODO(sigmund): remove this dependency on libraries.json
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
-      '${Flags.writeData}=${toUri(module, globalDataId)}',
-      // TODO(joshualitt): delete this flag after google3 roll
-      '${Flags.noClosedWorldInData}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose)
-      print("\ncached step: dart2js global analysis on $module");
-  }
-}
-
-// Step that invokes the dart2js code generation on the main module given the
-// results of the global analysis step and produces one shard of the codegen
-// output.
-class Dart2jsCodegenStep implements IOModularStep {
-  final ShardDataId codeId;
-
-  Dart2jsCodegenStep(this.codeId);
-
-  @override
-  List<DataId> get resultData => [codeId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [globalUpdatedDillId, closedWorldId, globalDataId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: dart2js backend on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
-      '${Flags.readData}=${toUri(module, globalDataId)}',
-      '${Flags.writeCodegen}=${toUri(module, codeId.dataId)}',
-      '${Flags.codegenShard}=${codeId.shard}',
-      '${Flags.codegenShards}=${codeId.dataId.shards}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("cached step: dart2js backend on $module");
-  }
-}
-
-// Step that invokes the dart2js codegen enqueuer and emitter on the main module
-// given the results of the global analysis step and codegen shards.
-class Dart2jsEmissionStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [jsId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded => const [
-        globalUpdatedDillId,
-        closedWorldId,
-        globalDataId,
-        codeId0,
-        codeId1
-      ];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("step: dart2js backend on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '${Flags.enableLanguageExperiments}=$flag',
-      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
-      '${Flags.readData}=${toUri(module, globalDataId)}',
-      '${Flags.readCodegen}=${toUri(module, codeId)}',
-      '${Flags.codegenShards}=${codeId.shards}',
-      '--out=${toUri(module, jsId)}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("\ncached step: dart2js backend on $module");
-  }
-}
-
-// TODO(joshualitt): delete after google3 roll.
-class LegacyGlobalAnalysisStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [globalDataId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [globalUpdatedDillId];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [closedWorldId, globalUpdatedDillId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: dart2js global analysis on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      // TODO(sigmund): remove this dependency on libraries.json
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
-      '${Flags.writeData}=${toUri(module, globalDataId)}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose)
-      print("\ncached step: dart2js global analysis on $module");
-  }
-}
-
-// Step that invokes the dart2js code generation on the main module given the
-// results of the global analysis step and produces one shard of the codegen
-// output.
-// Note: Legacy.
-class LegacyDart2jsCodegenStep implements IOModularStep {
-  final ShardDataId codeId;
-
-  LegacyDart2jsCodegenStep(this.codeId);
-
-  @override
-  List<DataId> get resultData => [codeId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [globalUpdatedDillId, globalDataId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: dart2js backend on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '--enable-experiment=$flag',
-      '${Flags.readData}=${toUri(module, globalDataId)}',
-      '${Flags.writeCodegen}=${toUri(module, codeId.dataId)}',
-      '${Flags.codegenShard}=${codeId.shard}',
-      '${Flags.codegenShards}=${codeId.dataId.shards}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("cached step: dart2js backend on $module");
-  }
-}
-
-// Step that invokes the dart2js codegen enqueuer and emitter on the main module
-// given the results of the global analysis step and codegen shards.
-// Note: Legacy.
-class LegacyDart2jsEmissionStep implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [jsId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded =>
-      const [globalUpdatedDillId, globalDataId, codeId0, codeId1];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("step: dart2js backend on $module");
-    List<String> args = [
-      '--packages=${sdkRoot.toFilePath()}/.packages',
-      _dart2jsScript,
-      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
-      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
-      '${toUri(module, globalUpdatedDillId)}',
-      for (String flag in flags) '${Flags.enableLanguageExperiments}=$flag',
-      '${Flags.readData}=${toUri(module, globalDataId)}',
-      '${Flags.readCodegen}=${toUri(module, codeId)}',
-      '${Flags.codegenShards}=${codeId.shards}',
-      '--out=${toUri(module, jsId)}',
-    ];
-    var result =
-        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("\ncached step: dart2js backend on $module");
-  }
-}
-
-/// Step that runs the output of dart2js in d8 and saves the output.
-class RunD8 implements IOModularStep {
-  @override
-  List<DataId> get resultData => const [txtId];
-
-  @override
-  bool get needsSources => false;
-
-  @override
-  List<DataId> get dependencyDataNeeded => const [];
-
-  @override
-  List<DataId> get moduleDataNeeded => const [jsId];
-
-  @override
-  bool get onlyOnMain => true;
-
-  @override
-  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
-      List<String> flags) async {
-    if (_options.verbose) print("\nstep: d8 on $module");
-    List<String> d8Args = [
-      sdkRoot
-          .resolve('sdk/lib/_internal/js_runtime/lib/preambles/d8.js')
-          .toFilePath(),
-      root.resolveUri(toUri(module, jsId)).toFilePath(),
-    ];
-    var result = await _runProcess(
-        sdkRoot.resolve(_d8executable).toFilePath(), d8Args, root.toFilePath());
-
-    _checkExitCode(result, this, module);
-
-    await File.fromUri(root.resolveUri(toUri(module, txtId)))
-        .writeAsString(result.stdout);
-  }
-
-  @override
-  void notifyCached(Module module) {
-    if (_options.verbose) print("\ncached step: d8 on $module");
-  }
-}
-
-void _checkExitCode(ProcessResult result, IOModularStep step, Module module) {
-  if (result.exitCode != 0 || _options.verbose) {
-    stdout.write(result.stdout);
-    stderr.write(result.stderr);
-  }
-  if (result.exitCode != 0) {
-    throw "${step.runtimeType} failed on $module:\n\n"
-        "stdout:\n${result.stdout}\n\n"
-        "stderr:\n${result.stderr}";
-  }
-}
-
-Future<ProcessResult> _runProcess(
-    String command, List<String> arguments, String workingDirectory) {
-  if (_options.verbose) {
-    print('command:\n$command ${arguments.join(' ')} from $workingDirectory');
-  }
-  return Process.run(command, arguments, workingDirectory: workingDirectory);
-}
-
-String get _d8executable {
-  if (Platform.isWindows) {
-    return 'third_party/d8/windows/d8.exe';
-  } else if (Platform.isLinux) {
-    return 'third_party/d8/linux/d8';
-  } else if (Platform.isMacOS) {
-    return 'third_party/d8/macos/d8';
-  }
-  throw UnsupportedError('Unsupported platform.');
-}
-
-class ShardsDataId implements DataId {
-  @override
-  final String name;
-  final int shards;
-
-  const ShardsDataId(this.name, this.shards);
-
-  @override
-  String toString() => name;
-}
-
-class ShardDataId implements DataId {
-  final ShardsDataId dataId;
-  final int _shard;
-
-  const ShardDataId(this.dataId, this._shard);
-
-  int get shard {
-    assert(0 <= _shard && _shard < dataId.shards);
-    return _shard;
-  }
-
-  @override
-  String get name => '${dataId.name}${shard}';
-
-  @override
-  String toString() => name;
-}
-
-Future<void> _resolveScripts() async {
-  Future<String> resolve(
-      String sourceUriOrPath, String relativeSnapshotPath) async {
-    Uri sourceUri = sdkRoot.resolve(sourceUriOrPath);
-    String result =
-        sourceUri.scheme == 'file' ? sourceUri.toFilePath() : sourceUriOrPath;
-    if (_options.useSdk) {
-      String snapshot = Uri.file(Platform.resolvedExecutable)
-          .resolve(relativeSnapshotPath)
-          .toFilePath();
-      if (await File(snapshot).exists()) {
-        return snapshot;
-      }
-    }
-    return result;
-  }
-
-  _dart2jsScript = await resolve(
-      'package:compiler/src/dart2js.dart', 'snapshots/dart2js.dart.snapshot');
-  _kernelWorkerScript = await resolve('utils/bazel/kernel_worker.dart',
-      'snapshots/kernel_worker.dart.snapshot');
-}
-
-String _librarySpecForSnapshot = Uri.file(Platform.resolvedExecutable)
-    .resolve('../lib/libraries.json')
-    .toFilePath();
diff --git a/pkg/compiler/tool/modular_test_suite_helper.dart b/pkg/compiler/tool/modular_test_suite_helper.dart
new file mode 100644
index 0000000..cd583ad
--- /dev/null
+++ b/pkg/compiler/tool/modular_test_suite_helper.dart
@@ -0,0 +1,662 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test the modular compilation pipeline of dart2js.
+///
+/// This is a shell that runs multiple tests, one per folder under `data/`.
+import 'dart:io';
+import 'dart:async';
+
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/kernel/dart2js_target.dart';
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+import 'package:modular_test/src/io_pipeline.dart';
+import 'package:modular_test/src/pipeline.dart';
+import 'package:modular_test/src/suite.dart';
+import 'package:modular_test/src/runner.dart';
+import 'package:package_config/package_config.dart';
+
+String packageConfigJsonPath = ".dart_tool/package_config.json";
+Uri sdkRoot = Platform.script.resolve("../../../");
+Uri packageConfigUri = sdkRoot.resolve(packageConfigJsonPath);
+Options _options;
+String _dart2jsScript;
+String _kernelWorkerScript;
+
+const dillSummaryId = DataId("sdill");
+const dillId = DataId("dill");
+const modularUpdatedDillId = DataId("mdill");
+const modularDataId = DataId("mdata");
+const closedWorldId = DataId("world");
+const globalUpdatedDillId = DataId("gdill");
+const globalDataId = DataId("gdata");
+const codeId = ShardsDataId("code", 2);
+const codeId0 = ShardDataId(codeId, 0);
+const codeId1 = ShardDataId(codeId, 1);
+const jsId = DataId("js");
+const txtId = DataId("txt");
+const fakeRoot = 'dev-dart-app:/';
+
+String _packageConfigEntry(String name, Uri root,
+    {Uri packageRoot, LanguageVersion version}) {
+  var fields = [
+    '"name": "${name}"',
+    '"rootUri": "$root"',
+    if (packageRoot != null) '"packageUri": "$packageRoot"',
+    if (version != null) '"languageVersion": "$version"'
+  ];
+  return '{${fields.join(',')}}';
+}
+
+abstract class CFEStep implements IOModularStep {
+  final String stepName;
+
+  CFEStep(this.stepName);
+
+  @override
+  bool get needsSources => true;
+
+  @override
+  bool get onlyOnMain => false;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: $stepName on $module");
+
+    // TODO(joshualitt): Figure out a way to support package configs in
+    // tests/modular.
+    var packageConfig = await loadPackageConfigUri(packageConfigUri);
+
+    // We use non file-URI schemes for representeing source locations in a
+    // root-agnostic way. This allows us to refer to file across modules and
+    // across steps without exposing the underlying temporary folders that are
+    // created by the framework. In build systems like bazel this is especially
+    // important because each step may be run on a different machine.
+    //
+    // Files in packages are defined in terms of `package:` URIs, while
+    // non-package URIs are defined using the `dart-dev-app` scheme.
+    String rootScheme = module.isSdk ? 'dart-dev-sdk' : 'dev-dart-app';
+    String sourceToImportUri(Uri relativeUri) {
+      if (module.isPackage) {
+        var basePath = module.packageBase.path;
+        var packageRelativePath = basePath == "./"
+            ? relativeUri.path
+            : relativeUri.path.substring(basePath.length);
+        return 'package:${module.name}/$packageRelativePath';
+      } else {
+        return '$rootScheme:/$relativeUri';
+      }
+    }
+
+    // We create both a .packages and package_config.json file which defines
+    // the location of this module if it is a package.  The CFE requires that
+    // if a `package:` URI of a dependency is used in an import, then we need
+    // that package entry in the associated file. However, after it checks that
+    // the definition exists, the CFE will not actually use the resolved URI if
+    // a library for the import URI is already found in one of the provide
+    // .dill files of the dependencies. For that reason, and to ensure that
+    // a step only has access to the files provided in a module, we generate a
+    // config file with invalid folders for other packages.
+    // TODO(sigmund): follow up with the CFE to see if we can remove the need
+    // for these dummy entries..
+    // TODO(joshualitt): Generate just the json file.
+    var packagesJson = [];
+    var packagesContents = StringBuffer();
+    if (module.isPackage) {
+      packagesContents.write('${module.name}:${module.packageBase}\n');
+      packagesJson.add(_packageConfigEntry(
+          module.name, Uri.parse('../${module.packageBase}')));
+    }
+
+    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
+    int unusedNum = 0;
+    for (Module dependency in transitiveDependencies) {
+      if (dependency.isPackage) {
+        // rootUri should be ignored for dependent modules, so we pass in a
+        // bogus value.
+        var rootUri = Uri.parse('unused$unusedNum');
+        unusedNum++;
+
+        var dependentPackage = packageConfig[dependency.name];
+        var packageJson = dependentPackage == null
+            ? _packageConfigEntry(dependency.name, rootUri)
+            : _packageConfigEntry(dependentPackage.name, rootUri,
+                version: dependentPackage.languageVersion);
+        packagesJson.add(packageJson);
+        packagesContents.write('${dependency.name}:$rootUri\n');
+      }
+    }
+
+    if (module.isPackage) {
+      await File.fromUri(root.resolve(packageConfigJsonPath))
+          .create(recursive: true);
+      await File.fromUri(root.resolve(packageConfigJsonPath)).writeAsString('{'
+          '  "configVersion": ${packageConfig.version},'
+          '  "packages": [ ${packagesJson.join(',')} ]'
+          '}');
+    }
+
+    await File.fromUri(root.resolve('.packages'))
+        .writeAsString('$packagesContents');
+
+    List<String> sources;
+    List<String> extraArgs = ['--packages-file', '$rootScheme:/.packages'];
+    if (module.isSdk) {
+      // When no flags are passed, we can skip compilation and reuse the
+      // platform.dill created by build.py.
+      if (flags.isEmpty) {
+        var platform = computePlatformBinariesLocation()
+            .resolve("dart2js_platform_unsound.dill");
+        var destination = root.resolveUri(toUri(module, outputData));
+        if (_options.verbose) {
+          print('command:\ncp $platform $destination');
+        }
+        await File.fromUri(platform).copy(destination.toFilePath());
+        return;
+      }
+      sources = requiredLibraries['dart2js'] + ['dart:core'];
+      extraArgs += [
+        '--libraries-file',
+        '$rootScheme:///sdk/lib/libraries.json'
+      ];
+      assert(transitiveDependencies.isEmpty);
+    } else {
+      sources = module.sources.map(sourceToImportUri).toList();
+    }
+
+    // TODO(joshualitt): Ensure the kernel worker has some way to specify
+    // --no-sound-null-safety
+    List<String> args = [
+      _kernelWorkerScript,
+      ...stepArguments,
+      '--exclude-non-sources',
+      '--multi-root',
+      '$root',
+      '--multi-root-scheme',
+      rootScheme,
+      ...extraArgs,
+      '--output',
+      '${toUri(module, outputData)}',
+      ...(transitiveDependencies
+          .expand((m) => ['--input-summary', '${toUri(m, inputData)}'])),
+      ...(sources.expand((String uri) => ['--source', uri])),
+      ...(flags.expand((String flag) => ['--enable-experiment', flag])),
+    ];
+
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+    _checkExitCode(result, this, module);
+  }
+
+  List<String> get stepArguments;
+
+  DataId get inputData;
+
+  DataId get outputData;
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) print("\ncached step: $stepName on $module");
+  }
+}
+
+// Step that compiles sources in a module to a summary .dill file.
+class OutlineDillCompilationStep extends CFEStep {
+  @override
+  List<DataId> get resultData => const [dillSummaryId];
+
+  @override
+  bool get needsSources => true;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [dillSummaryId];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [];
+
+  @override
+  List<String> get stepArguments =>
+      ['--target', 'dart2js_summary', '--summary-only'];
+
+  @override
+  DataId get inputData => dillSummaryId;
+
+  @override
+  DataId get outputData => dillSummaryId;
+
+  OutlineDillCompilationStep() : super('outline-dill-compilation');
+}
+
+// Step that compiles sources in a module to a .dill file.
+class FullDillCompilationStep extends CFEStep {
+  @override
+  List<DataId> get resultData => const [dillId];
+
+  @override
+  bool get needsSources => true;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [dillSummaryId];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [];
+
+  @override
+  List<String> get stepArguments =>
+      ['--target', 'dart2js', '--no-summary', '--no-summary-only'];
+
+  @override
+  DataId get inputData => dillSummaryId;
+
+  @override
+  DataId get outputData => dillId;
+
+  FullDillCompilationStep() : super('full-dill-compilation');
+}
+
+class ModularAnalysisStep implements IOModularStep {
+  @override
+  List<DataId> get resultData => const [modularDataId, modularUpdatedDillId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [dillId];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [dillId];
+
+  @override
+  bool get onlyOnMain => false;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: modular analysis on $module");
+    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
+    Iterable<String> dillDependencies =
+        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.inputDill}=${toUri(module, dillId)}',
+      if (dillDependencies.isNotEmpty)
+        '--dill-dependencies=${dillDependencies.join(',')}',
+      '--out=${toUri(module, modularUpdatedDillId)}',
+      '${Flags.writeModularAnalysis}=${toUri(module, modularDataId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) {
+      print("cached step: dart2js modular analysis on $module");
+    }
+  }
+}
+
+DataId idForDill({bool useModularAnalysis}) =>
+    useModularAnalysis ? modularUpdatedDillId : dillId;
+
+List<DataId> inputFromAnalysis({bool useModularAnalysis = false}) => [
+      idForDill(useModularAnalysis: useModularAnalysis),
+      if (useModularAnalysis) modularDataId,
+    ];
+
+// Step that invokes the dart2js closed world computation.
+class ComputeClosedWorldStep implements IOModularStep {
+  final bool useModularAnalysis;
+
+  ComputeClosedWorldStep({this.useModularAnalysis});
+
+  @override
+  List<DataId> get resultData => const [closedWorldId, globalUpdatedDillId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded =>
+      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
+
+  @override
+  List<DataId> get moduleDataNeeded =>
+      inputFromAnalysis(useModularAnalysis: useModularAnalysis);
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose)
+      print("\nstep: dart2js compute closed world on $module");
+    Set<Module> transitiveDependencies = computeTransitiveDependencies(module);
+    DataId dillId = idForDill(useModularAnalysis: useModularAnalysis);
+    Iterable<String> dillDependencies =
+        transitiveDependencies.map((m) => '${toUri(m, dillId)}');
+    List<String> dataDependencies = transitiveDependencies
+        .map((m) => '${toUri(m, modularDataId)}')
+        .toList();
+    dataDependencies.add('${toUri(module, modularDataId)}');
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      // TODO(sigmund): remove this dependency on libraries.json
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
+      '${Flags.inputDill}=${toUri(module, dillId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+      '${Flags.dillDependencies}=${dillDependencies.join(',')}',
+      if (useModularAnalysis)
+        '${Flags.readModularAnalysis}=${dataDependencies.join(',')}',
+      '${Flags.writeClosedWorld}=${toUri(module, closedWorldId)}',
+      Flags.noClosedWorldInData,
+      '--out=${toUri(module, globalUpdatedDillId)}',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose)
+      print("\ncached step: dart2js compute closed world on $module");
+  }
+}
+
+// Step that runs the dart2js modular analysis.
+class GlobalAnalysisStep implements IOModularStep {
+  @override
+  List<DataId> get resultData => const [globalDataId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [globalUpdatedDillId];
+
+  @override
+  List<DataId> get moduleDataNeeded =>
+      const [closedWorldId, globalUpdatedDillId];
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: dart2js global analysis on $module");
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      // TODO(sigmund): remove this dependency on libraries.json
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
+      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
+      '${Flags.writeData}=${toUri(module, globalDataId)}',
+      // TODO(joshualitt): delete this flag after google3 roll
+      '${Flags.noClosedWorldInData}',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose)
+      print("\ncached step: dart2js global analysis on $module");
+  }
+}
+
+// Step that invokes the dart2js code generation on the main module given the
+// results of the global analysis step and produces one shard of the codegen
+// output.
+class Dart2jsCodegenStep implements IOModularStep {
+  final ShardDataId codeId;
+
+  Dart2jsCodegenStep(this.codeId);
+
+  @override
+  List<DataId> get resultData => [codeId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [];
+
+  @override
+  List<DataId> get moduleDataNeeded =>
+      const [globalUpdatedDillId, closedWorldId, globalDataId];
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: dart2js backend on $module");
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
+      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
+      for (String flag in flags) '--enable-experiment=$flag',
+      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
+      '${Flags.readData}=${toUri(module, globalDataId)}',
+      '${Flags.writeCodegen}=${toUri(module, codeId.dataId)}',
+      '${Flags.codegenShard}=${codeId.shard}',
+      '${Flags.codegenShards}=${codeId.dataId.shards}',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) print("cached step: dart2js backend on $module");
+  }
+}
+
+// Step that invokes the dart2js codegen enqueuer and emitter on the main module
+// given the results of the global analysis step and codegen shards.
+class Dart2jsEmissionStep implements IOModularStep {
+  @override
+  List<DataId> get resultData => const [jsId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [
+        globalUpdatedDillId,
+        closedWorldId,
+        globalDataId,
+        codeId0,
+        codeId1
+      ];
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("step: dart2js backend on $module");
+    List<String> args = [
+      '--packages=${sdkRoot.toFilePath()}/.packages',
+      _dart2jsScript,
+      if (_options.useSdk) '--libraries-spec=$_librarySpecForSnapshot',
+      '${Flags.entryUri}=$fakeRoot${module.mainSource}',
+      '${Flags.inputDill}=${toUri(module, globalUpdatedDillId)}',
+      for (String flag in flags) '${Flags.enableLanguageExperiments}=$flag',
+      '${Flags.readClosedWorld}=${toUri(module, closedWorldId)}',
+      '${Flags.readData}=${toUri(module, globalDataId)}',
+      '${Flags.readCodegen}=${toUri(module, codeId)}',
+      '${Flags.codegenShards}=${codeId.shards}',
+      '--out=${toUri(module, jsId)}',
+    ];
+    var result =
+        await _runProcess(Platform.resolvedExecutable, args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) print("\ncached step: dart2js backend on $module");
+  }
+}
+
+/// Step that runs the output of dart2js in d8 and saves the output.
+class RunD8 implements IOModularStep {
+  @override
+  List<DataId> get resultData => const [txtId];
+
+  @override
+  bool get needsSources => false;
+
+  @override
+  List<DataId> get dependencyDataNeeded => const [];
+
+  @override
+  List<DataId> get moduleDataNeeded => const [jsId];
+
+  @override
+  bool get onlyOnMain => true;
+
+  @override
+  Future<void> execute(Module module, Uri root, ModuleDataToRelativeUri toUri,
+      List<String> flags) async {
+    if (_options.verbose) print("\nstep: d8 on $module");
+    List<String> d8Args = [
+      sdkRoot
+          .resolve('sdk/lib/_internal/js_runtime/lib/preambles/d8.js')
+          .toFilePath(),
+      root.resolveUri(toUri(module, jsId)).toFilePath(),
+    ];
+    var result = await _runProcess(
+        sdkRoot.resolve(_d8executable).toFilePath(), d8Args, root.toFilePath());
+
+    _checkExitCode(result, this, module);
+
+    await File.fromUri(root.resolveUri(toUri(module, txtId)))
+        .writeAsString(result.stdout);
+  }
+
+  @override
+  void notifyCached(Module module) {
+    if (_options.verbose) print("\ncached step: d8 on $module");
+  }
+}
+
+void _checkExitCode(ProcessResult result, IOModularStep step, Module module) {
+  if (result.exitCode != 0 || _options.verbose) {
+    stdout.write(result.stdout);
+    stderr.write(result.stderr);
+  }
+  if (result.exitCode != 0) {
+    throw "${step.runtimeType} failed on $module:\n\n"
+        "stdout:\n${result.stdout}\n\n"
+        "stderr:\n${result.stderr}";
+  }
+}
+
+Future<ProcessResult> _runProcess(
+    String command, List<String> arguments, String workingDirectory) {
+  if (_options.verbose) {
+    print('command:\n$command ${arguments.join(' ')} from $workingDirectory');
+  }
+  return Process.run(command, arguments, workingDirectory: workingDirectory);
+}
+
+String get _d8executable {
+  if (Platform.isWindows) {
+    return 'third_party/d8/windows/d8.exe';
+  } else if (Platform.isLinux) {
+    return 'third_party/d8/linux/d8';
+  } else if (Platform.isMacOS) {
+    return 'third_party/d8/macos/d8';
+  }
+  throw UnsupportedError('Unsupported platform.');
+}
+
+class ShardsDataId implements DataId {
+  @override
+  final String name;
+  final int shards;
+
+  const ShardsDataId(this.name, this.shards);
+
+  @override
+  String toString() => name;
+}
+
+class ShardDataId implements DataId {
+  final ShardsDataId dataId;
+  final int _shard;
+
+  const ShardDataId(this.dataId, this._shard);
+
+  int get shard {
+    assert(0 <= _shard && _shard < dataId.shards);
+    return _shard;
+  }
+
+  @override
+  String get name => '${dataId.name}${shard}';
+
+  @override
+  String toString() => name;
+}
+
+Future<void> resolveScripts(Options options) async {
+  Future<String> resolve(
+      String sourceUriOrPath, String relativeSnapshotPath) async {
+    Uri sourceUri = sdkRoot.resolve(sourceUriOrPath);
+    String result =
+        sourceUri.scheme == 'file' ? sourceUri.toFilePath() : sourceUriOrPath;
+    if (_options.useSdk) {
+      String snapshot = Uri.file(Platform.resolvedExecutable)
+          .resolve(relativeSnapshotPath)
+          .toFilePath();
+      if (await File(snapshot).exists()) {
+        return snapshot;
+      }
+    }
+    return result;
+  }
+
+  _options = options;
+  _dart2jsScript = await resolve(
+      'package:compiler/src/dart2js.dart', 'snapshots/dart2js.dart.snapshot');
+  _kernelWorkerScript = await resolve('utils/bazel/kernel_worker.dart',
+      'snapshots/kernel_worker.dart.snapshot');
+}
+
+String _librarySpecForSnapshot = Uri.file(Platform.resolvedExecutable)
+    .resolve('../lib/libraries.json')
+    .toFilePath();
diff --git a/pkg/compiler/tool/modular_test_suite_legacy.dart b/pkg/compiler/tool/modular_test_suite_legacy.dart
new file mode 100644
index 0000000..875a64a
--- /dev/null
+++ b/pkg/compiler/tool/modular_test_suite_legacy.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test the modular compilation pipeline of dart2js.
+///
+/// This is a shell that runs multiple tests, one per folder under `data/`.
+import 'dart:async';
+
+import 'package:modular_test/src/io_pipeline.dart';
+import 'package:modular_test/src/runner.dart';
+import 'modular_test_suite_helper.dart';
+
+main(List<String> args) async {
+  var options = Options.parse(args);
+  await resolveScripts(options);
+  await Future.wait([
+    runSuite(
+        sdkRoot.resolve('tests/modular/'),
+        'tests/modular',
+        options,
+        IOPipeline([
+          OutlineDillCompilationStep(),
+          FullDillCompilationStep(),
+          ComputeClosedWorldStep(useModularAnalysis: false),
+          GlobalAnalysisStep(),
+          Dart2jsCodegenStep(codeId0),
+          Dart2jsCodegenStep(codeId1),
+          Dart2jsEmissionStep(),
+          RunD8(),
+        ], cacheSharedModules: true)),
+  ]);
+}
diff --git a/pkg/dart2js_info/CHANGELOG.md b/pkg/dart2js_info/CHANGELOG.md
index ea4fe67b..6a617f6 100644
--- a/pkg/dart2js_info/CHANGELOG.md
+++ b/pkg/dart2js_info/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.6.6
+
+* Added the `comm` tool for finding commonalities between info files.
+
 ## 0.6.5
 
 * Drop unused dependencies.
diff --git a/pkg/dart2js_info/README.md b/pkg/dart2js_info/README.md
index 28ec26f..5f05010 100644
--- a/pkg/dart2js_info/README.md
+++ b/pkg/dart2js_info/README.md
@@ -92,7 +92,11 @@
     dependency between functions and fields in your program. Currently it only
     supports the `some_path` query, which shows a dependency path from one
     function to another.
-    
+
+  * [`common`][common]: a tool that reports the common elements of two info
+    files. Commonality is determined by the element's name, file path, and URI
+    but not code size.
+
   * [`diff`][diff]: a tool that diffs two info files and reports which
     program elements have been added, removed, or changed size. This also
     tells which elements are no longer deferred or have become deferred.
@@ -160,6 +164,44 @@
 If the name of a function your are looking for is unique enough, it might be
 sufficient to just write that name as your regular expression.
 
+### Common tool
+
+This command-line tool shows common elements between two info files. It can be
+run as follows:
+
+```console
+$ pub global activate dart2js_info # only needed once
+$ dart2js_info common old.js.info.data new.js.info.data
+```
+
+The tool gives a breakdown of the common elements between the two info files,
+reporting code size discrepancies if they exist.
+Here's an example output snippet:
+
+```
+COMMON ELEMENTS (455 common elements, 70334 bytes -> 70460 bytes)
+========================================================================
+dart:_foreign_helper::: 141 bytes
+dart:_foreign_helper::JS_CONST: 141 bytes
+dart:_foreign_helper::JS_CONST.code: 0 bytes
+dart:_interceptors::: 4052 -> 7968 bytes
+dart:_interceptors::ArrayIterator: 805 bytes
+dart:_interceptors::ArrayIterator.ArrayIterator: 0 bytes
+dart:_interceptors::ArrayIterator._current: 91 bytes
+dart:_interceptors::ArrayIterator._index: 0 bytes
+dart:_interceptors::ArrayIterator._iterable: 0 bytes
+dart:_interceptors::ArrayIterator._length: 0 bytes
+dart:_interceptors::ArrayIterator.current: 0 bytes
+dart:_interceptors::ArrayIterator.moveNext: 406 bytes
+dart:_interceptors::Interceptor: 198 bytes
+dart:_interceptors::Interceptor.toString: 104 -> 182 bytes
+
+```
+
+Common elements are sorted by name by default but can be sorted by size with
+the `--order-by-size` flag. Additionally, the tool can be restricted to
+just packages with the `--packages-only` flag.
+
 ### Diff tool
 
 This command-line tool shows a diff between two info files. It can be run
@@ -502,17 +544,18 @@
 This package is developed in [github][repo].  Please file feature requests and
 bugs at the [issue tracker][tracker].
 
-[repo]: https://github.com/dart-lang/dart2js_info/
-[tracker]: https://github.com/dart-lang/dart2js_info/issues
-[code_deps]: https://github.com/dart-lang/dart2js_info/blob/master/bin/code_deps.dart
-[diff]: https://github.com/dart-lang/dart2js_info/blob/master/bin/diff.dart
-[library_size]: https://github.com/dart-lang/dart2js_info/blob/master/bin/library_size_split.dart
-[deferred_check]: https://github.com/dart-lang/dart2js_info/blob/master/bin/deferred_library_check.dart
-[deferred_size]: https://github.com/dart-lang/dart2js_info/blob/master/bin/deferred_library_size.dart
-[deferred_layout]: https://github.com/dart-lang/dart2js_info/blob/master/bin/deferred_library_layout.dart
-[coverage_server]: https://github.com/dart-lang/dart2js_info/blob/master/bin/coverage_log_server.dart
-[coverage_analysis]: https://github.com/dart-lang/dart2js_info/blob/master/bin/live_code_size_analysis.dart
-[function_size]: https://github.com/dart-lang/dart2js_info/blob/master/bin/function_size_analysis.dart
-[AllInfo]: http://dart-lang.github.io/dart2js_info/doc/api/dart2js_info.info/AllInfo-class.html
-[convert]: https://github.com/dart-lang/dart2js_info/blob/master/bin/convert.dart
-[show]: https://github.com/dart-lang/dart2js_info/blob/master/bin/text_print.dart
+[AllInfo]: https://pub.dev/documentation/dart2js_info/latest/dart2js_info.info/AllInfo-class.html
+[code_deps]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/code_deps.dart
+[common]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/common_command.dart
+[convert]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/convert.dart
+[coverage_server]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/coverage_log_server.dart
+[coverage_analysis]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/live_code_size_analysis.dart
+[deferred_check]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/deferred_library_check.dart
+[deferred_layout]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/deferred_library_layout.dart
+[deferred_size]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/deferred_library_size.dart
+[diff]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/diff.dart
+[function_size]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/function_size_analysis.dart
+[library_size]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/library_size_split.dart
+[repo]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/
+[show]: https://github.com/dart-lang/sdk/tree/main/pkg/dart2js_info/bin/src/text_print.dart
+[tracker]: https://github.com/dart-lang/sdk/issues
diff --git a/pkg/dart2js_info/bin/src/common_command.dart b/pkg/dart2js_info/bin/src/common_command.dart
new file mode 100644
index 0000000..8719b11
--- /dev/null
+++ b/pkg/dart2js_info/bin/src/common_command.dart
@@ -0,0 +1,152 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:args/command_runner.dart';
+
+import 'package:dart2js_info/info.dart';
+import 'package:dart2js_info/src/common_element.dart';
+import 'package:dart2js_info/src/io.dart';
+import 'package:dart2js_info/src/util.dart';
+
+import 'usage_exception.dart';
+
+/// A command that computes the commonalities between two info files.
+class CommonCommand extends Command<void> with PrintUsageException {
+  @override
+  final String name = "common";
+  @override
+  final String description =
+      "See code element commonalities between two dump-info files.";
+
+  CommonCommand() {
+    argParser.addFlag('packages-only',
+        defaultsTo: false, help: "Show only packages in common");
+    argParser.addFlag('order-by-size',
+        defaultsTo: false,
+        help: "Show output ordered by size in bytes (decreasing). "
+            "If there are size discrepancies, orders by the first "
+            "dump-info file's reported size.");
+  }
+
+  @override
+  void run() async {
+    var args = argResults.rest;
+    if (args.length < 2) {
+      usageException(
+          'Missing arguments, expected two dump-info files to compare');
+      return;
+    }
+
+    var oldInfo = await infoFromFile(args[0]);
+    var newInfo = await infoFromFile(args[1]);
+    var packagesOnly = argResults['packages-only'];
+    var orderBySize = argResults['order-by-size'];
+
+    var commonElements = findCommonalities(oldInfo, newInfo);
+
+    if (packagesOnly) {
+      reportPackages(commonElements, orderBySize: orderBySize);
+    } else {
+      report(commonElements, orderBySize: orderBySize);
+    }
+  }
+}
+
+void report(List<CommonElement> commonElements, {orderBySize = false}) {
+  var oldSizeTotal = 0, newSizeTotal = 0;
+  for (var element in commonElements) {
+    // Only sum sizes from leaf elements so we don't double count.
+    if (element.oldInfo.kind == InfoKind.field ||
+        element.oldInfo.kind == InfoKind.function ||
+        element.oldInfo.kind == InfoKind.closure ||
+        element.oldInfo.kind == InfoKind.typedef) {
+      oldSizeTotal += element.oldInfo.size;
+      newSizeTotal += element.newInfo.size;
+    }
+  }
+
+  _section('COMMON ELEMENTS',
+      elementCount: commonElements.length,
+      oldSizeTotal: oldSizeTotal,
+      newSizeTotal: newSizeTotal);
+
+  if (orderBySize) {
+    commonElements.sort((a, b) => b.oldInfo.size.compareTo(a.oldInfo.size));
+  } else {
+    commonElements.sort((a, b) => a.name.compareTo(b.name));
+  }
+
+  for (var element in commonElements) {
+    var oldSize = element.oldInfo.size;
+    var newSize = element.newInfo.size;
+    if (oldSize == newSize) {
+      print('${element.name}: ${element.oldInfo.size} bytes');
+    } else {
+      print('${element.name}: ${element.oldInfo.size} -> '
+          '${element.newInfo.size} bytes');
+    }
+  }
+}
+
+void reportPackages(List<CommonElement> commonElements, {orderBySize = false}) {
+  // Maps package names to their cumulative size.
+  var oldPackageInfo = <String, int>{};
+  var newPackageInfo = <String, int>{};
+
+  for (int i = 0; i < commonElements.length; i++) {
+    var element = commonElements[i];
+    // Skip non-libraries to avoid double counting elements when accumulating
+    // package-level information.
+    if (element.oldInfo.kind != InfoKind.library) continue;
+
+    var package = packageName(element.oldInfo);
+    if (package == null) continue;
+
+    var oldSize = element.oldInfo.size;
+    var newSize = element.newInfo.size;
+    oldPackageInfo[package] = (oldPackageInfo[package] ?? 0) + oldSize;
+    newPackageInfo[package] = (newPackageInfo[package] ?? 0) + newSize;
+  }
+
+  var oldSizeTotal = 0, newSizeTotal = 0;
+  oldPackageInfo.forEach((oldPackageName, oldPackageSize) {
+    var newPackageSize = newPackageInfo[oldPackageName];
+    oldSizeTotal += oldPackageSize;
+    newSizeTotal += newPackageSize;
+  });
+
+  _section('COMMON ELEMENTS (PACKAGES)',
+      elementCount: oldPackageInfo.keys.length,
+      oldSizeTotal: oldSizeTotal,
+      newSizeTotal: newSizeTotal);
+
+  var packageInfoEntries = oldPackageInfo.entries.toList();
+
+  if (orderBySize) {
+    packageInfoEntries.sort((a, b) => b.value.compareTo(a.value));
+  } else {
+    packageInfoEntries.sort((a, b) => a.key.compareTo(b.key));
+  }
+
+  for (var entry in packageInfoEntries) {
+    var oldSize = entry.value;
+    var newSize = newPackageInfo[entry.key];
+    if (oldSize == newSize) {
+      print('${entry.key}: $oldSize bytes');
+    } else {
+      print('${entry.key}: $oldSize bytes -> $newSize bytes');
+    }
+  }
+}
+
+void _section(String title,
+    {int elementCount, int oldSizeTotal, int newSizeTotal}) {
+  if (oldSizeTotal == newSizeTotal) {
+    print('$title ($elementCount common elements, $oldSizeTotal bytes)');
+  } else {
+    print('$title ($elementCount common elements, '
+        '$oldSizeTotal bytes -> $newSizeTotal bytes)');
+  }
+  print('=' * 72);
+}
diff --git a/pkg/dart2js_info/bin/tools.dart b/pkg/dart2js_info/bin/tools.dart
index 26a188b..9e2cda8 100644
--- a/pkg/dart2js_info/bin/tools.dart
+++ b/pkg/dart2js_info/bin/tools.dart
@@ -5,6 +5,7 @@
 import 'package:args/command_runner.dart';
 
 import 'src/code_deps.dart';
+import 'src/common_command.dart';
 import 'src/coverage_log_server.dart';
 import 'src/debug_info.dart';
 import 'src/diff.dart';
@@ -23,6 +24,7 @@
   var commandRunner = CommandRunner("dart2js_info",
       "collection of tools to digest the output of dart2js's --dump-info")
     ..addCommand(CodeDepsCommand())
+    ..addCommand(CommonCommand())
     ..addCommand(CoverageLogServerCommand())
     ..addCommand(DebugCommand())
     ..addCommand(DiffCommand())
diff --git a/pkg/dart2js_info/lib/src/common_element.dart b/pkg/dart2js_info/lib/src/common_element.dart
new file mode 100644
index 0000000..788d6f2
--- /dev/null
+++ b/pkg/dart2js_info/lib/src/common_element.dart
@@ -0,0 +1,116 @@
+import 'package:dart2js_info/info.dart';
+import 'package:dart2js_info/src/util.dart';
+
+class CommonElement {
+  final BasicInfo oldInfo;
+  final BasicInfo newInfo;
+
+  CommonElement(this.oldInfo, this.newInfo);
+
+  get name => longName(oldInfo, useLibraryUri: true);
+}
+
+List<CommonElement> findCommonalities(AllInfo oldInfo, AllInfo newInfo) {
+  var finder = _InfoCommonElementFinder(oldInfo, newInfo);
+  finder.run();
+  return finder.commonElements;
+}
+
+class _InfoCommonElementFinder extends InfoVisitor<void> {
+  final AllInfo _old;
+  final AllInfo _new;
+
+  BasicInfo _other;
+
+  List<CommonElement> commonElements = <CommonElement>[];
+
+  _InfoCommonElementFinder(this._old, this._new);
+
+  void run() {
+    _commonList(_old.libraries, _new.libraries);
+  }
+
+  @override
+  visitAll(AllInfo info) {
+    throw StateError('should not run common on AllInfo');
+  }
+
+  @override
+  visitProgram(ProgramInfo info) {
+    throw StateError('should not run common on ProgramInfo');
+  }
+
+  @override
+  visitOutput(OutputUnitInfo info) {
+    throw StateError('should not run common on OutputUnitInfo');
+  }
+
+  @override
+  visitConstant(ConstantInfo info) {
+    throw StateError('should not run common on ConstantInfo');
+  }
+
+  @override
+  visitLibrary(LibraryInfo info) {
+    var other = _other as LibraryInfo;
+    commonElements.add(CommonElement(info, other));
+    _commonList(info.topLevelVariables, other.topLevelVariables);
+    _commonList(info.topLevelFunctions, other.topLevelFunctions);
+    _commonList(info.classes, other.classes);
+  }
+
+  @override
+  visitClass(ClassInfo info) {
+    var other = _other as ClassInfo;
+    commonElements.add(CommonElement(info, other));
+    _commonList(info.fields, other.fields);
+    _commonList(info.functions, other.functions);
+  }
+
+  @override
+  visitClassType(ClassTypeInfo info) {
+    var other = _other as ClassInfo;
+    commonElements.add(CommonElement(info, other));
+  }
+
+  @override
+  visitClosure(ClosureInfo info) {
+    var other = _other as ClosureInfo;
+    commonElements.add(CommonElement(info, other));
+    _commonList([info.function], [other.function]);
+  }
+
+  @override
+  visitField(FieldInfo info) {
+    var other = _other as FieldInfo;
+    commonElements.add(CommonElement(info, other));
+    _commonList(info.closures, other.closures);
+  }
+
+  @override
+  visitFunction(FunctionInfo info) {
+    var other = _other as FunctionInfo;
+    commonElements.add(CommonElement(info, other));
+    _commonList(info.closures, other.closures);
+  }
+
+  @override
+  visitTypedef(TypedefInfo info) {
+    var other = _other as ClassInfo;
+    commonElements.add(CommonElement(info, other));
+  }
+
+  void _commonList(List<BasicInfo> oldInfos, List<BasicInfo> newInfos) {
+    var newNames = <String, BasicInfo>{};
+    for (var newInfo in newInfos) {
+      newNames[longName(newInfo, useLibraryUri: true)] = newInfo;
+    }
+    for (var oldInfo in oldInfos) {
+      var oldName = longName(oldInfo, useLibraryUri: true);
+      if (newNames.containsKey(oldName)) {
+        _other = newNames[oldName];
+        oldInfo.accept(this);
+      }
+    }
+  }
+}
diff --git a/pkg/dart2js_info/lib/src/util.dart b/pkg/dart2js_info/lib/src/util.dart
index e435458..eebb1c7 100644
--- a/pkg/dart2js_info/lib/src/util.dart
+++ b/pkg/dart2js_info/lib/src/util.dart
@@ -90,6 +90,19 @@
   return sb.toString();
 }
 
+/// Provides the package name associated with [info] or null otherwise.
+String packageName(Info info) {
+  while (info.parent != null) {
+    info = info.parent;
+  }
+  if (info is LibraryInfo) {
+    if (info.uri.scheme == 'package') {
+      return '${info.uri}'.split('/').first;
+    }
+  }
+  return null;
+}
+
 /// Produce a string containing [value] padded with white space up to [n] chars.
 pad(value, n, {bool right = false}) {
   var s = '$value';
diff --git a/pkg/dart2js_info/test/hello_world_deferred/hello_world_deferred.js.info.json b/pkg/dart2js_info/test/hello_world_deferred/hello_world_deferred.js.info.json
index 490a537..8e31503 100644
--- a/pkg/dart2js_info/test/hello_world_deferred/hello_world_deferred.js.info.json
+++ b/pkg/dart2js_info/test/hello_world_deferred/hello_world_deferred.js.info.json
@@ -2012,7 +2012,7 @@
       "851867060": {
         "id": "class/851867060",
         "kind": "class",
-        "name": "JavaScriptObject",
+        "name": "LegacyJavaScriptObject",
         "size": 225,
         "outputUnit": "outputUnit/669725655",
         "parent": "library/325218131",
diff --git a/pkg/dart2native/lib/dart2native.dart b/pkg/dart2native/lib/dart2native.dart
index f5f0dfe..be47b4c 100644
--- a/pkg/dart2native/lib/dart2native.dart
+++ b/pkg/dart2native/lib/dart2native.dart
@@ -6,8 +6,8 @@
 import 'dart:typed_data';
 
 // Maximum page size across all supported architectures (arm64 macOS has 16K
-// pages, the rest are all 4k pages).
-const elfPageSize = 16384;
+// pages, some arm64 Linux distributions have 64K pages).
+const elfPageSize = 65536;
 const appjitMagicNumber = <int>[0xdc, 0xdc, 0xf6, 0xf6, 0, 0, 0, 0];
 
 enum Kind { aot, exe }
diff --git a/pkg/dart_internal/CHANGELOG.md b/pkg/dart_internal/CHANGELOG.md
index c49fe05..8894fed 100644
--- a/pkg/dart_internal/CHANGELOG.md
+++ b/pkg/dart_internal/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.2.3
+
+- Support the latest Dart SDK.
+
+## 0.2.2
+
+- Support the latest Dart SDK.
+
 ## 0.2.1
 
 - Support the latest Dart SDK.
diff --git a/pkg/dart_internal/analysis_options.yaml b/pkg/dart_internal/analysis_options.yaml
index edcd64e..6f7501d 100644
--- a/pkg/dart_internal/analysis_options.yaml
+++ b/pkg/dart_internal/analysis_options.yaml
@@ -1,5 +1,5 @@
 analyzer:
   errors:
     import_internal_library: ignore
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
diff --git a/pkg/dart_internal/pubspec.yaml b/pkg/dart_internal/pubspec.yaml
index d871d5c..9d5dacc 100644
--- a/pkg/dart_internal/pubspec.yaml
+++ b/pkg/dart_internal/pubspec.yaml
@@ -1,5 +1,5 @@
 name: dart_internal
-version: 0.2.2
+version: 0.2.3
 repository: https://github.com/dart-lang/sdk/tree/master/pkg/dart_internal
 description: >-
   This package is not intended for wide use. It provides a temporary API to
@@ -9,4 +9,4 @@
 environment:
   # Restrict the upper bound so that we can remove support for this in a later
   # version of the SDK without it being a breaking change.
-  sdk: ">=2.12.0 <2.16.0"
+  sdk: ">=2.12.0 <2.17.0"
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index 9367cf6..3e75181 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -21,6 +21,7 @@
 import 'src/commands/compile.dart';
 import 'src/commands/create.dart';
 import 'src/commands/debug_adapter.dart';
+import 'src/commands/doc.dart';
 import 'src/commands/fix.dart';
 import 'src/commands/language_server.dart';
 import 'src/commands/migrate.dart';
@@ -114,6 +115,7 @@
     addCommand(CreateCommand(verbose: verbose));
     addCommand(DebugAdapterCommand(verbose: verbose));
     addCommand(CompileCommand(verbose: verbose));
+    addCommand(DocCommand(verbose: verbose));
     addCommand(DevToolsCommand(
       verbose: verbose,
       customDevToolsPath: sdk.devToolsBinaries,
@@ -213,7 +215,10 @@
     final path = commandNames.join('/');
     // Send the screen view to analytics
     unawaited(
-      analytics.sendScreenView(path),
+      analytics.sendScreenView(path, parameters:
+          // Starts a new analytics session.
+          // https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#sc
+          {'sc': 'start'}),
     );
 
     // The exit code for the dartdev process; null indicates that it has not been
diff --git a/pkg/dartdev/lib/src/analysis_server.dart b/pkg/dartdev/lib/src/analysis_server.dart
index 580619b..1666afc 100644
--- a/pkg/dartdev/lib/src/analysis_server.dart
+++ b/pkg/dartdev/lib/src/analysis_server.dart
@@ -8,7 +8,11 @@
 
 import 'package:analysis_server/src/server/driver.dart' show Driver;
 import 'package:analysis_server_client/protocol.dart'
-    show EditBulkFixesResult, ResponseDecoder;
+    show
+        AddContentOverlay,
+        AnalysisUpdateContentParams,
+        EditBulkFixesResult,
+        ResponseDecoder;
 import 'package:args/args.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
@@ -167,6 +171,12 @@
     });
   }
 
+  /// Send an `analysis.updateContent` request with the given [files].
+  Future<void> updateContent(Map<String, AddContentOverlay> files) async {
+    await _sendCommand('analysis.updateContent',
+        params: AnalysisUpdateContentParams(files).toJson());
+  }
+
   Future<Map<String, dynamic>> _sendCommand(String method,
       {Map<String, dynamic> params}) {
     final String id = (++_id).toString();
diff --git a/pkg/dartdev/lib/src/commands/doc.dart b/pkg/dartdev/lib/src/commands/doc.dart
new file mode 100644
index 0000000..d039183
--- /dev/null
+++ b/pkg/dartdev/lib/src/commands/doc.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io' as io;
+
+import 'package:dartdoc/dartdoc.dart';
+import 'package:dartdoc/options.dart';
+import 'package:path/path.dart' as path;
+
+import '../core.dart';
+import '../sdk.dart';
+
+/// A command to create a new project from a set of templates.
+class DocCommand extends DartdevCommand {
+  static const String cmdName = 'doc';
+
+  DocCommand({bool verbose = false})
+      : super(
+          cmdName,
+          'Generate HTML API documentation from Dart documentation comments.',
+          verbose,
+        ) {
+    argParser.addOption(
+      'output-dir',
+      abbr: 'o',
+      defaultsTo: path.join('.', 'doc', 'api'),
+      help: 'Output directory',
+    );
+    argParser.addFlag(
+      'validate-links',
+      negatable: true,
+      help: 'Display context aware warnings for broken links (slow)',
+    );
+  }
+
+  @override
+  String get invocation => '${super.invocation} <input directory>';
+
+  @override
+  FutureOr<int> run() async {
+    // At least one argument, the input directory, is required.
+    if (argResults.rest.isEmpty) {
+      usageException("Error: Input directory not specified");
+    }
+
+    // Determine input directory.
+    final dir = io.Directory(argResults.rest[0]);
+    if (!dir.existsSync()) {
+      usageException("Error: Input directory doesn't exist: ${dir.path}");
+    }
+
+    // Parse options.
+    final options = [
+      '--input=${dir.path}',
+      '--output=${argResults['output-dir']}',
+    ];
+    if (argResults['validate-links']) {
+      options.add('--validate-links');
+    } else {
+      options.add('--no-validate-links');
+    }
+
+    // Specify where dartdoc resources are located.
+    final resourcesPath =
+        path.absolute(sdk.sdkPath, 'bin', 'resources', 'dartdoc', 'resources');
+    options.add('--resources-dir=$resourcesPath');
+
+    final config = await parseOptions(pubPackageMetaProvider, options);
+    if (config == null) {
+      // There was an error while parsing options.
+      return 2;
+    }
+
+    // Call dartdoc.
+    if (verbose) {
+      log.stdout('Calling dartdoc with the following options: $options');
+    }
+    final packageConfigProvider = PhysicalPackageConfigProvider();
+    final packageBuilder = PubPackageBuilder(
+        config, pubPackageMetaProvider, packageConfigProvider);
+    final dartdoc = config.generateDocs
+        ? await Dartdoc.fromContext(config, packageBuilder)
+        : await Dartdoc.withEmptyGenerator(config, packageBuilder);
+    dartdoc.executeGuarded();
+    return 0;
+  }
+}
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
index c81e467..1bdb252 100644
--- a/pkg/dartdev/lib/src/commands/fix.dart
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -6,7 +6,7 @@
 import 'dart:io' as io;
 
 import 'package:analysis_server_client/protocol.dart' hide AnalysisError;
-import 'package:intl/intl.dart';
+import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
 
 import '../analysis_server.dart';
@@ -17,8 +17,6 @@
 class FixCommand extends DartdevCommand {
   static const String cmdName = 'fix';
 
-  static final NumberFormat _numberFormat = NumberFormat.decimalPattern();
-
   static const String cmdDescription =
       '''Apply automated fixes to Dart source code.
 
@@ -26,6 +24,12 @@
 
 To use the tool, run either ['dart fix --dry-run'] for a preview of the proposed changes for a project, or ['dart fix --apply'] to apply the changes.''';
 
+  /// The maximum number of times that fixes will be requested from the server.
+  static const maxPasses = 4;
+
+  /// A map from the absolute path of a file to the updated content of the file.
+  final Map<String, String> fileContentCache = {};
+
   FixCommand({bool verbose = false}) : super(cmdName, cmdDescription, verbose) {
     argParser.addFlag('dry-run',
         abbr: 'n',
@@ -86,7 +90,7 @@
     var modeText = dryRun ? ' (dry run)' : '';
 
     final projectName = path.basename(dirPath);
-    var progress = log.progress(
+    var computeFixesProgress = log.progress(
         'Computing fixes in ${log.ansi.emphasized(projectName)}$modeText');
 
     var server = AnalysisServer(
@@ -99,75 +103,86 @@
 
     await server.start();
 
-    EditBulkFixesResult fixes;
     server.onExit.then((int exitCode) {
-      if (fixes == null && exitCode != 0) {
-        progress?.cancel();
+      if (computeFixesProgress != null && exitCode != 0) {
+        computeFixesProgress?.cancel();
+        computeFixesProgress = null;
         io.exitCode = exitCode;
       }
     });
 
-    fixes = await server.requestBulkFixes(dirPath, inTestMode);
-    final List<SourceFileEdit> edits = fixes.edits;
+    Future<Map<String, BulkFix>> _applyAllEdits() async {
+      var detailsMap = <String, BulkFix>{};
+      List<SourceFileEdit> edits;
+      var pass = 0;
+      do {
+        var fixes = await server.requestBulkFixes(dirPath, inTestMode);
+        _mergeDetails(detailsMap, fixes.details);
+        edits = fixes.edits;
+        _applyEdits(server, edits);
+        pass++;
+        // TODO(brianwilkerson) Be more intelligent about detecting infinite
+        //  loops so that we can increase [maxPasses].
+      } while (pass < maxPasses && edits.isNotEmpty);
+      return detailsMap;
+    }
 
+    var detailsMap = await _applyAllEdits();
     await server.shutdown();
 
-    progress.finish(showTiming: true);
+    if (computeFixesProgress != null) {
+      computeFixesProgress.finish(showTiming: true);
+      computeFixesProgress = null;
+    }
 
     if (inTestMode) {
-      var result = _compareFixesInDirectory(dir, edits);
+      var result = _compareFixesInDirectory(dir);
       log.stdout('Passed: ${result.passCount}, Failed: ${result.failCount}');
       return result.failCount > 0 ? 1 : 0;
-    } else if (edits.isEmpty) {
+    } else if (detailsMap.isEmpty) {
       log.stdout('Nothing to fix!');
     } else {
-      var details = fixes.details;
-      details.sort((f1, f2) => path
-          .relative(f1.path, from: dirPath)
-          .compareTo(path.relative(f2.path, from: dirPath)));
-
-      var fileCount = 0;
-      var fixCount = 0;
-
-      for (var d in details) {
-        ++fileCount;
-        for (var f in d.fixes) {
-          fixCount += f.occurrences;
-        }
-      }
+      var fileCount = detailsMap.length;
+      var fixCount = detailsMap.values
+          .expand((detail) => detail.fixes)
+          .fold(0, (previousValue, fixes) => previousValue + fixes.occurrences);
 
       if (dryRun) {
         log.stdout('');
-        log.stdout('${_format(fixCount)} proposed ${_pluralFix(fixCount)} '
-            'in ${_format(fileCount)} ${pluralize("file", fileCount)}.');
-        _printDetails(details, dir);
+        log.stdout('$fixCount proposed ${_pluralFix(fixCount)} '
+            'in $fileCount ${pluralize("file", fileCount)}.');
+        _printDetails(detailsMap, dir);
       } else {
-        progress = log.progress('Applying fixes');
-        _applyFixes(edits);
-        progress.finish(showTiming: true);
-        _printDetails(details, dir);
-        log.stdout('${_format(fixCount)} ${_pluralFix(fixCount)} made in '
-            '${_format(fileCount)} ${pluralize("file", fileCount)}.');
+        var applyFixesProgress = log.progress('Applying fixes');
+        _writeFiles();
+        applyFixesProgress.finish(showTiming: true);
+        _printDetails(detailsMap, dir);
+        log.stdout('$fixCount ${_pluralFix(fixCount)} made in '
+            '$fileCount ${pluralize("file", fileCount)}.');
       }
     }
 
     return 0;
   }
 
-  void _applyFixes(List<SourceFileEdit> edits) {
+  void _applyEdits(AnalysisServer server, List<SourceFileEdit> edits) {
+    var overlays = <String, AddContentOverlay>{};
     for (var edit in edits) {
-      var fileName = edit.file;
-      var file = io.File(fileName);
-      var code = file.existsSync() ? file.readAsStringSync() : '';
-      code = SourceEdit.applySequence(code, edit.edits);
-      file.writeAsStringSync(code);
+      var filePath = edit.file;
+      var content = fileContentCache.putIfAbsent(filePath, () {
+        var file = io.File(filePath);
+        return file.existsSync() ? file.readAsStringSync() : '';
+      });
+      var newContent = SourceEdit.applySequence(content, edit.edits);
+      fileContentCache[filePath] = newContent;
+      overlays[filePath] = AddContentOverlay(newContent);
     }
+    server.updateContent(overlays);
   }
 
   /// Return `true` if any of the fixes fail to create the same content as is
   /// found in the golden file.
-  _TestResult _compareFixesInDirectory(
-      io.Directory directory, List<SourceFileEdit> edits) {
+  _TestResult _compareFixesInDirectory(io.Directory directory) {
     var result = _TestResult();
     //
     // Gather the files of interest in this directory and process
@@ -177,7 +192,7 @@
     var expectFileMap = <String, io.File>{};
     for (var child in directory.listSync()) {
       if (child is io.Directory) {
-        var childResult = _compareFixesInDirectory(child, edits);
+        var childResult = _compareFixesInDirectory(child);
         result.passCount += childResult.passCount;
         result.failCount += childResult.failCount;
       } else if (child is io.File) {
@@ -189,10 +204,6 @@
         }
       }
     }
-    var editMap = <String, SourceFileEdit>{};
-    for (var edit in edits) {
-      editMap[edit.file] = edit;
-    }
     for (var originalFile in dartFiles) {
       var filePath = originalFile.path;
       var baseName = path.basename(filePath);
@@ -205,19 +216,24 @@
             'No corresponding expect file for the Dart file at "$filePath".');
         continue;
       }
-      var edit = editMap[filePath];
       try {
-        var originalCode = originalFile.readAsStringSync();
         var expectedCode = expectFile.readAsStringSync();
-        var actualCode = edit == null
-            ? originalCode
-            : SourceEdit.applySequence(originalCode, edit.edits);
+        var actualIsOriginal = !fileContentCache.containsKey(filePath);
+        var actualCode = actualIsOriginal
+            ? originalFile.readAsStringSync()
+            : fileContentCache[filePath];
         // Use a whitespace insensitive comparison.
         if (_compressWhitespace(actualCode) !=
             _compressWhitespace(expectedCode)) {
           result.failCount++;
-          _reportFailure(filePath, actualCode, expectedCode);
-          _printEdits(edits);
+          // TODO(brianwilkerson) Do a better job of displaying the differences.
+          //  It's very hard to see the diff with large files.
+          _reportFailure(
+            filePath,
+            actualCode,
+            expectedCode,
+            actualIsOriginal: actualIsOriginal,
+          );
         } else {
           result.passCount++;
         }
@@ -243,47 +259,87 @@
   String _compressWhitespace(String code) =>
       code.replaceAll(RegExp(r'\s+'), ' ');
 
+  /// Merge the fixes from the current round's [details] into the [detailsMap].
+  void _mergeDetails(Map<String, BulkFix> detailsMap, List<BulkFix> details) {
+    for (var detail in details) {
+      var previousDetail = detailsMap[detail.path];
+      if (previousDetail != null) {
+        _mergeFixCounts(previousDetail.fixes, detail.fixes);
+      } else {
+        detailsMap[detail.path] = detail;
+      }
+    }
+  }
+
+  void _mergeFixCounts(
+      List<BulkFixDetail> oldFixes, List<BulkFixDetail> newFixes) {
+    var originalOldLength = oldFixes.length;
+    newFixLoop:
+    for (var newFix in newFixes) {
+      var newCode = newFix.code;
+      // Iterate over the original content of the list, not any of the newly
+      // added fixes, because the newly added fixes can't be a match.
+      for (var i = 0; i < originalOldLength; i++) {
+        var oldFix = oldFixes[i];
+        if (oldFix.code == newCode) {
+          oldFix.occurrences += newFix.occurrences;
+          continue newFixLoop;
+        }
+      }
+      oldFixes.add(newFix);
+    }
+  }
+
   String _pluralFix(int count) => count == 1 ? 'fix' : 'fixes';
 
-  void _printDetails(List<BulkFix> details, io.Directory workingDir) {
+  void _printDetails(Map<String, BulkFix> detailsMap, io.Directory workingDir) {
+    String relative(String absolutePath) {
+      return path.relative(absolutePath, from: workingDir.path);
+    }
+
     log.stdout('');
 
     final bullet = log.ansi.bullet;
 
-    for (var detail in details) {
-      log.stdout(path.relative(detail.path, from: workingDir.path));
+    var modifiedFilePaths = detailsMap.keys.toList();
+    modifiedFilePaths
+        .sort((first, second) => relative(first).compareTo(relative(second)));
+    for (var filePath in modifiedFilePaths) {
+      var detail = detailsMap[filePath];
+      log.stdout(relative(detail.path));
       final fixes = detail.fixes.toList();
       fixes.sort((a, b) => a.code.compareTo(b.code));
       for (var fix in fixes) {
         log.stdout('  ${fix.code} $bullet '
-            '${_format(fix.occurrences)} ${_pluralFix(fix.occurrences)}');
+            '${fix.occurrences} ${_pluralFix(fix.occurrences)}');
       }
       log.stdout('');
     }
   }
 
-  void _printEdits(List<SourceFileEdit> edits) {
-    log.stdout('Edits returned from server:');
-    for (var fileEdit in edits) {
-      log.stdout('  ${fileEdit.file}');
-      for (var edit in fileEdit.edits) {
-        log.stdout("    ${edit.offset} - ${edit.end}, '${edit.replacement}'");
-      }
-    }
-  }
-
   /// Report that the [actualCode] produced by applying fixes to the content of
   /// [filePath] did not match the [expectedCode].
-  void _reportFailure(String filePath, String actualCode, String expectedCode) {
+  void _reportFailure(String filePath, String actualCode, String expectedCode,
+      {@required bool actualIsOriginal}) {
     log.stdout('Failed when applying fixes to $filePath');
     log.stdout('Expected:');
     log.stdout(expectedCode);
     log.stdout('');
-    log.stdout('Actual:');
+    if (actualIsOriginal) {
+      log.stdout('Actual (original code was unchanged):');
+    } else {
+      log.stdout('Actual:');
+    }
     log.stdout(actualCode);
   }
 
-  static String _format(int value) => _numberFormat.format(value);
+  /// Write the modified contents of files in the [fileContentCache] to disk.
+  void _writeFiles() {
+    for (var entry in fileContentCache.entries) {
+      var file = io.File(entry.key);
+      file.writeAsStringSync(entry.value);
+    }
+  }
 }
 
 /// The result of running tests in a given directory.
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index 69db956..a74fa84 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -318,10 +318,11 @@
         stderrSub.cancel();
         completer.complete();
       } else {
+        final error = result['error'] ?? event;
+        final stacktrace = result['stacktrace'] ?? '';
         stderrSub.cancel();
         completer.completeError(
-          'Could not start Observatory HTTP server',
-        );
+            'Could not start Observatory HTTP server:\n$error\n$stacktrace\n');
       }
     });
     try {
diff --git a/pkg/dartdev/pubspec.yaml b/pkg/dartdev/pubspec.yaml
index 0145fab..9d78178 100644
--- a/pkg/dartdev/pubspec.yaml
+++ b/pkg/dartdev/pubspec.yaml
@@ -17,12 +17,12 @@
   dart2native:
     path: ../dart2native
   dart_style: any
+  dartdoc: any
   dds:
     path: ../dds
   devtools_server: any
   front_end:
     path: ../front_end
-  intl: any
   meta:
     path: ../meta
   nnbd_migration:
diff --git a/pkg/dartdev/test/analysis_server_test.dart b/pkg/dartdev/test/analysis_server_test.dart
index 9902dda..975eb86 100644
--- a/pkg/dartdev/test/analysis_server_test.dart
+++ b/pkg/dartdev/test/analysis_server_test.dart
@@ -21,7 +21,7 @@
       p = project();
     });
 
-    tearDown(() => p?.dispose());
+    tearDown(() async => await p?.dispose());
 
     test('can start', () async {
       AnalysisServer server = AnalysisServer(
diff --git a/pkg/dartdev/test/analytics_test.dart b/pkg/dartdev/test/analytics_test.dart
index 3ae1f16..450db64 100644
--- a/pkg/dartdev/test/analytics_test.dart
+++ b/pkg/dartdev/test/analytics_test.dart
@@ -40,9 +40,9 @@
     });
   });
 
-  test('Analytics control smoke test', () {
+  test('Analytics control smoke test', () async {
     final p = project(logAnalytics: true);
-    var result = p.runSync(['--disable-analytics']);
+    var result = await p.run(['--disable-analytics']);
     expect(result.stdout, contains('''
   ╔════════════════════════════════════════════════════════════════════════════╗
   ║ Analytics reporting disabled. In order to enable it, run:                  ║
@@ -52,7 +52,7 @@
   ╚════════════════════════════════════════════════════════════════════════════╝
 '''));
 
-    result = p.runSync(['--enable-analytics']);
+    result = await p.run(['--enable-analytics']);
     expect(result.stdout, contains('''
   ╔════════════════════════════════════════════════════════════════════════════╗
   ║ The Dart tool uses Google Analytics to report feature usage statistics     ║
@@ -69,13 +69,13 @@
 
   final experiments = await experimentsWithValidation();
   group('Sending analytics', () {
-    test('help', () {
+    test('help', () async {
       final p = project(logAnalytics: true);
-      final result = p.runSync(['help']);
+      final result = await p.run(['help']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'help'}
+          'message': {'viewName': 'help', 'sc': 'start'}
         },
         {
           'hitType': 'event',
@@ -97,14 +97,14 @@
         }
       ]);
     });
-    test('create', () {
+    test('create', () async {
       final p = project(logAnalytics: true);
       final result =
-          p.runSync(['create', '--no-pub', '-tpackage-simple', 'name']);
+          await p.run(['create', '--no-pub', '-tpackage-simple', 'name']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'create'}
+          'message': {'viewName': 'create', 'sc': 'start'}
         },
         {
           'hitType': 'event',
@@ -129,17 +129,17 @@
       ]);
     });
 
-    test('pub get dry run', () {
+    test('pub get dry run', () async {
       final p = project(logAnalytics: true, pubspec: {
         'name': 'foo',
         'environment': {'sdk': '>=2.10.0 <3.0.0'},
         'dependencies': {'_dummy_pkg': '0.0.1'}
       });
-      final result = p.runSync(['pub', 'get', '--dry-run']);
+      final result = await p.run(['pub', 'get', '--dry-run']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'pub/get'}
+          'message': {'viewName': 'pub/get', 'sc': 'start'}
         },
         {
           'hitType': 'event',
@@ -164,17 +164,17 @@
       ]);
     });
 
-    test('pub get', () {
+    test('pub get', () async {
       final p = project(logAnalytics: true, pubspec: {
         'name': 'foo',
         'environment': {'sdk': '>=2.10.0 <3.0.0'},
         'dependencies': {'_dummy_pkg': '0.0.1'}
       });
-      final result = p.runSync(['pub', 'get']);
+      final result = await p.run(['pub', 'get']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'pub/get'}
+          'message': {'viewName': 'pub/get', 'sc': 'start'},
         },
         {
           'hitType': 'event',
@@ -218,13 +218,13 @@
       ]);
     });
 
-    test('format', () {
+    test('format', () async {
       final p = project(logAnalytics: true);
-      final result = p.runSync(['format', '-l80', '.']);
+      final result = await p.run(['format', '-l80', '.']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'format'}
+          'message': {'viewName': 'format', 'sc': 'start'}
         },
         {
           'hitType': 'event',
@@ -249,11 +249,11 @@
       ]);
     });
 
-    test('run', () {
+    test('run', () async {
       final p = project(
           mainSrc: 'void main(List<String> args) => print(args)',
           logAnalytics: true);
-      final result = p.runSync([
+      final result = await p.run([
         'run',
         '--no-pause-isolates-on-exit',
         '--enable-asserts',
@@ -263,7 +263,7 @@
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'run'}
+          'message': {'viewName': 'run', 'sc': 'start'},
         },
         {
           'hitType': 'event',
@@ -289,11 +289,11 @@
     });
     group('run --enable-experiments', () {
       for (final experiment in experiments) {
-        test(experiment.name, () {
+        test(experiment.name, () async {
           final p = project(mainSrc: experiment.validation, logAnalytics: true);
           {
             for (final no in ['', 'no-']) {
-              final result = p.runSync([
+              final result = await p.run([
                 'run',
                 '--enable-experiment=$no${experiment.name}',
                 'lib/main.dart',
@@ -301,7 +301,7 @@
               expect(extractAnalytics(result), [
                 {
                   'hitType': 'screenView',
-                  'message': {'viewName': 'run'}
+                  'message': {'viewName': 'run', 'sc': 'start'},
                 },
                 {
                   'hitType': 'event',
@@ -330,16 +330,16 @@
       }
     });
 
-    test('compile', () {
+    test('compile', () async {
       final p = project(
           mainSrc: 'void main(List<String> args) => print(args);',
           logAnalytics: true);
-      final result = p
-          .runSync(['compile', 'kernel', 'lib/main.dart', '-o', 'main.kernel']);
+      final result = await p
+          .run(['compile', 'kernel', 'lib/main.dart', '-o', 'main.kernel']);
       expect(extractAnalytics(result), [
         {
           'hitType': 'screenView',
-          'message': {'viewName': 'compile/kernel'}
+          'message': {'viewName': 'compile/kernel', 'sc': 'start'},
         },
         {
           'hitType': 'event',
diff --git a/pkg/dartdev/test/commands/analyze_test.dart b/pkg/dartdev/test/commands/analyze_test.dart
index af8984c..60bbb1a 100644
--- a/pkg/dartdev/test/commands/analyze_test.dart
+++ b/pkg/dartdev/test/commands/analyze_test.dart
@@ -176,11 +176,11 @@
 
   setUp(() => p = null);
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['analyze', '--help']);
+    var result = await p.run(['analyze', '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -188,9 +188,9 @@
     expect(result.stdout, contains(_analyzeUsageText));
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['analyze', '--help', '--verbose']);
+    var result = await p.run(['analyze', '--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -201,12 +201,12 @@
   group('multiple items', () {
     TestProject secondProject;
 
-    tearDown(() => secondProject?.dispose());
+    tearDown(() async => await secondProject?.dispose());
 
-    test('folder and file', () {
+    test('folder and file', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
       secondProject = project(mainSrc: "int get foo => 'str';\n");
-      var result = p.runSync(['analyze', p.dirPath, secondProject.mainPath]);
+      var result = await p.run(['analyze', p.dirPath, secondProject.mainPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -216,10 +216,10 @@
       expect(result.stdout, contains('2 issues found.'));
     });
 
-    test('two folders', () {
+    test('two folders', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
       secondProject = project(mainSrc: "int get foo => 'str';\n");
-      var result = p.runSync(['analyze', p.dirPath, secondProject.dirPath]);
+      var result = await p.run(['analyze', p.dirPath, secondProject.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -230,9 +230,9 @@
     });
   });
 
-  test('no such directory', () {
+  test('no such directory', () async {
     p = project();
-    var result = p.runSync(['analyze', '/no/such/dir1/']);
+    var result = await p.run(['analyze', '/no/such/dir1/']);
 
     expect(result.exitCode, 64);
     expect(result.stdout, isEmpty);
@@ -241,10 +241,10 @@
     expect(result.stderr, contains(_analyzeUsageText));
   });
 
-  test('current working directory', () {
+  test('current working directory', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = p.runSync(['analyze'], workingDir: p.dirPath);
+    var result = await p.run(['analyze'], workingDir: p.dirPath);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -252,18 +252,18 @@
   });
 
   group('single directory', () {
-    test('no errors', () {
+    test('no errors', () async {
       p = project(mainSrc: 'int get foo => 1;\n');
-      var result = p.runSync(['analyze', p.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 0);
       expect(result.stderr, isEmpty);
       expect(result.stdout, contains('No issues found!'));
     });
 
-    test('one error', () {
+    test('one error', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
-      var result = p.runSync(['analyze', p.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -273,9 +273,9 @@
       expect(result.stdout, contains('1 issue found.'));
     });
 
-    test('two errors', () {
+    test('two errors', () async {
       p = project(mainSrc: "int get foo => 'str';\nint get bar => 'str';\n");
-      var result = p.runSync(['analyze', p.dirPath]);
+      var result = await p.run(['analyze', p.dirPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -284,18 +284,18 @@
   });
 
   group('single file', () {
-    test('no errors', () {
+    test('no errors', () async {
       p = project(mainSrc: 'int get foo => 1;\n');
-      var result = p.runSync(['analyze', p.mainPath]);
+      var result = await p.run(['analyze', p.mainPath]);
 
       expect(result.exitCode, 0);
       expect(result.stderr, isEmpty);
       expect(result.stdout, contains('No issues found!'));
     });
 
-    test('one error', () {
+    test('one error', () async {
       p = project(mainSrc: "int get foo => 'str';\n");
-      var result = p.runSync(['analyze', p.mainPath]);
+      var result = await p.run(['analyze', p.mainPath]);
 
       expect(result.exitCode, 3);
       expect(result.stderr, isEmpty);
@@ -306,65 +306,65 @@
     });
   });
 
-  test('warning --fatal-warnings', () {
+  test('warning --fatal-warnings', () async {
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = p.runSync(['analyze', '--fatal-warnings', p.dirPath]);
+    var result = await p.run(['analyze', '--fatal-warnings', p.dirPath]);
 
     expect(result.exitCode, equals(2));
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('warning implicit --fatal-warnings', () {
+  test('warning implicit --fatal-warnings', () async {
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = p.runSync(['analyze', p.dirPath]);
+    var result = await p.run(['analyze', p.dirPath]);
 
     expect(result.exitCode, equals(2));
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('warning --no-fatal-warnings', () {
+  test('warning --no-fatal-warnings', () async {
     p = project(
         mainSrc: _unusedImportCodeSnippet,
         analysisOptions: _unusedImportAnalysisOptions);
-    var result = p.runSync(['analyze', '--no-fatal-warnings', p.dirPath]);
+    var result = await p.run(['analyze', '--no-fatal-warnings', p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('info implicit no --fatal-infos', () {
+  test('info implicit no --fatal-infos', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'String foo() {}');
-    var result = p.runSync(['analyze', p.dirPath]);
+    var result = await p.run(['analyze', p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('info --fatal-infos', () {
+  test('info --fatal-infos', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'String foo() {}');
-    var result = p.runSync(['analyze', '--fatal-infos', p.dirPath]);
+    var result = await p.run(['analyze', '--fatal-infos', p.dirPath]);
 
     expect(result.exitCode, 1);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('1 issue found.'));
   });
 
-  test('--verbose', () {
+  test('--verbose', () async {
     p = project(mainSrc: '''
 int f() {
   var result = one + 2;
   var one = 1;
   return result;
 }''');
-    var result = p.runSync(['analyze', '--verbose', p.dirPath]);
+    var result = await p.run(['analyze', '--verbose', p.dirPath]);
 
     expect(result.exitCode, 3);
     expect(result.stderr, isEmpty);
@@ -377,7 +377,7 @@
   });
 
   group('--packages', () {
-    test('existing', () {
+    test('existing', () async {
       final foo = project(name: 'foo');
       foo.file('lib/foo.dart', 'var my_foo = 0;');
 
@@ -399,7 +399,7 @@
   ]
 }
 ''');
-      var result = p.runSync([
+      var result = await p.run([
         'analyze',
         '--packages=${p.findFile('my_packages.json').path}',
         p.dirPath,
@@ -410,9 +410,9 @@
       expect(result.stdout, contains('No issues found!'));
     });
 
-    test('not existing', () {
+    test('not existing', () async {
       p = project();
-      var result = p.runSync([
+      var result = await p.run([
         'analyze',
         '--packages=no.such.file',
         p.dirPath,
@@ -424,11 +424,11 @@
     });
   });
 
-  test('--cache', () {
+  test('--cache', () async {
     var cache = project(name: 'cache');
 
     p = project(mainSrc: 'var v = 0;');
-    var result = p.runSync([
+    var result = await p.run([
       'analyze',
       '--cache=${cache.dirPath}',
       p.mainPath,
diff --git a/pkg/dartdev/test/commands/compile_test.dart b/pkg/dartdev/test/commands/compile_test.dart
index be43ac7..2facc8c 100644
--- a/pkg/dartdev/test/commands/compile_test.dart
+++ b/pkg/dartdev/test/commands/compile_test.dart
@@ -29,9 +29,9 @@
     expect(binDir.path, contains('bin'));
   });
 
-  test('Implicit --help', () {
+  test('Implicit --help', () async {
     final p = project();
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
       ],
@@ -40,9 +40,9 @@
     expect(result.exitCode, compileErrorExitCode);
   });
 
-  test('--help', () {
+  test('--help', () async {
     final p = project();
-    final result = p.runSync(
+    final result = await p.run(
       ['compile', '--help'],
     );
     expect(result.stdout, contains('Compile Dart'));
@@ -61,9 +61,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     final p = project();
-    final result = p.runSync(
+    final result = await p.run(
       ['compile', '--help', '--verbose'],
     );
     expect(result.stdout, contains('Compile Dart'));
@@ -76,10 +76,10 @@
     expect(result.exitCode, 0);
   });
 
-  test('Compile and run jit snapshot', () {
+  test('Compile and run jit snapshot', () async {
     final p = project(mainSrc: 'void main() { print("I love jit"); }');
     final outFile = path.join(p.dirPath, 'main.jit');
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -93,18 +93,18 @@
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
 
-    result = p.runSync(['run', 'main.jit']);
+    result = await p.run(['run', 'main.jit']);
     expect(result.stdout, contains('I love jit'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
   });
 
-  test('Compile and run executable', () {
+  test('Compile and run executable', () async {
     final p = project(mainSrc: 'void main() { print("I love executables"); }');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'lib', 'main.exe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -127,11 +127,11 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile to executable disabled on IA32', () {
+  test('Compile to executable disabled on IA32', () async {
     final p = project(mainSrc: 'void main() { print("I love executables"); }');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -144,11 +144,11 @@
     expect(result.exitCode, 64);
   }, skip: !isRunningOnIA32);
 
-  test('Compile to AOT snapshot disabled on IA32', () {
+  test('Compile to AOT snapshot disabled on IA32', () async {
     final p = project(mainSrc: 'void main() { print("I love executables"); }');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -161,13 +161,13 @@
     expect(result.exitCode, 64);
   }, skip: !isRunningOnIA32);
 
-  test('Compile and run executable with options', () {
+  test('Compile and run executable with options', () async {
     final p = project(
         mainSrc: 'void main() {print(const String.fromEnvironment("life"));}');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -194,12 +194,12 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile and run aot snapshot', () {
+  test('Compile and run aot snapshot', () async {
     final p = project(mainSrc: 'void main() { print("I love AOT"); }');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'main.aot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -225,10 +225,10 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile and run kernel snapshot', () {
+  test('Compile and run kernel snapshot', () async {
     final p = project(mainSrc: 'void main() { print("I love kernel"); }');
     final outFile = path.join(p.dirPath, 'main.dill');
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -242,13 +242,13 @@
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
 
-    result = p.runSync(['run', 'main.dill']);
+    result = await p.run(['run', 'main.dill']);
     expect(result.stdout, contains('I love kernel'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
   });
 
-  test('Compile JS', () {
+  test('Compile JS', () async {
     final p = project(mainSrc: '''
         void main() {
           print('1: ' + const String.fromEnvironment('foo'));
@@ -257,7 +257,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'main.js'));
 
-    final result = p.runSync([
+    final result = await p.run([
       'compile',
       'js',
       '-m',
@@ -279,7 +279,7 @@
     expect(contents.contains('2: foo'), true);
   });
 
-  test('Compile exe with error', () {
+  test('Compile exe with error', () async {
     final p = project(mainSrc: '''
 void main() {
   int? i;
@@ -289,7 +289,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -309,7 +309,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile exe with warnings', () {
+  test('Compile exe with warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -319,7 +319,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -336,12 +336,12 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile exe with sound null safety', () {
+  test('Compile exe with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -358,7 +358,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile exe with unsound null safety', () {
+  test('Compile exe with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -366,7 +366,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -383,14 +383,14 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile and run exe with --sound-null-safety', () {
+  test('Compile and run exe with --sound-null-safety', () async {
     final p = project(mainSrc: '''void main() {
       print((<int?>[] is List<int>) ? 'oh no' : 'sound');
     }''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -417,14 +417,14 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile and run exe with --no-sound-null-safety', () {
+  test('Compile and run exe with --no-sound-null-safety', () async {
     final p = project(mainSrc: '''void main() {
       print((<int?>[] is List<int>) ? 'unsound' : 'oh no');
     }''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -451,12 +451,12 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile exe without info', () {
+  test('Compile exe without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -475,7 +475,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile exe without warnings', () {
+  test('Compile exe without warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -485,7 +485,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myexe'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'exe',
@@ -502,12 +502,12 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile JS with sound null safety', () {
+  test('Compile JS with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjs'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'js',
@@ -524,7 +524,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JS with unsound null safety', () {
+  test('Compile JS with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -532,7 +532,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjs'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'js',
@@ -549,12 +549,12 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JS without info', () {
+  test('Compile JS without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjs'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'js',
@@ -573,7 +573,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JS without warnings', () {
+  test('Compile JS without warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -583,7 +583,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjs'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'js',
@@ -600,12 +600,12 @@
     expect(result.exitCode, 0);
   });
 
-  test('Compile AOT snapshot with sound null safety', () {
+  test('Compile AOT snapshot with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -622,7 +622,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile AOT snapshot with unsound null safety', () {
+  test('Compile AOT snapshot with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -630,7 +630,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -647,12 +647,12 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile AOT snapshot without info', () {
+  test('Compile AOT snapshot without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -671,7 +671,7 @@
         reason: 'File not found: $outFile');
   }, skip: isRunningOnIA32);
 
-  test('Compile AOT snapshot without warnings', () {
+  test('Compile AOT snapshot without warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -681,7 +681,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -698,7 +698,7 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile AOT snapshot with warnings', () {
+  test('Compile AOT snapshot with warnings', () async {
     final p = project(mainSrc: '''
 void main() {
   int i = 0;
@@ -708,7 +708,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myaot'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'aot-snapshot',
@@ -726,12 +726,12 @@
     expect(result.exitCode, 0);
   }, skip: isRunningOnIA32);
 
-  test('Compile kernel with invalid trailing argument', () {
+  test('Compile kernel with invalid trailing argument', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -754,12 +754,12 @@
     expect(File(outFile).existsSync(), false, reason: 'File found: $outFile');
   });
 
-  test('Compile kernel with sound null safety', () {
+  test('Compile kernel with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -776,7 +776,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile kernel with unsound null safety', () {
+  test('Compile kernel with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -784,7 +784,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -801,12 +801,12 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile kernel without info', () {
+  test('Compile kernel without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -825,7 +825,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile kernel without warning', () {
+  test('Compile kernel without warning', () async {
     final p = project(mainSrc: '''
 void main() {
     int i;
@@ -834,7 +834,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -851,7 +851,7 @@
     expect(result.exitCode, 254);
   });
 
-  test('Compile kernel with warnings', () {
+  test('Compile kernel with warnings', () async {
     final p = project(mainSrc: '''
 void main() {
     int i = 0;
@@ -860,7 +860,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'mydill'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'kernel',
@@ -877,12 +877,12 @@
     expect(result.exitCode, 0);
   });
 
-  test('Compile JIT snapshot with sound null safety', () {
+  test('Compile JIT snapshot with sound null safety', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -899,7 +899,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JIT snapshot with unsound null safety', () {
+  test('Compile JIT snapshot with unsound null safety', () async {
     final p = project(mainSrc: '''
 // @dart=2.9
 void main() {}
@@ -907,7 +907,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -924,13 +924,13 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JIT snapshot with training args', () {
+  test('Compile JIT snapshot with training args', () async {
     final p =
         project(mainSrc: '''void main(List<String> args) => print(args);''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -948,12 +948,12 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JIT snapshot without info', () {
+  test('Compile JIT snapshot without info', () async {
     final p = project(mainSrc: '''void main() {}''');
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -972,7 +972,7 @@
         reason: 'File not found: $outFile');
   });
 
-  test('Compile JIT snapshot without warnings', () {
+  test('Compile JIT snapshot without warnings', () async {
     final p = project(mainSrc: '''
 void main() {
     int i;
@@ -981,7 +981,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
@@ -998,7 +998,7 @@
     expect(result.exitCode, 254);
   });
 
-  test('Compile JIT snapshot with warnings', () {
+  test('Compile JIT snapshot with warnings', () async {
     final p = project(mainSrc: '''
 void main() {
     int i = 0;
@@ -1007,7 +1007,7 @@
     final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
     final outFile = path.canonicalize(path.join(p.dirPath, 'myjit'));
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'compile',
         'jit-snapshot',
diff --git a/pkg/dartdev/test/commands/create_integration_test.dart b/pkg/dartdev/test/commands/create_integration_test.dart
index 8bc1066..4856b47 100644
--- a/pkg/dartdev/test/commands/create_integration_test.dart
+++ b/pkg/dartdev/test/commands/create_integration_test.dart
@@ -18,14 +18,14 @@
 
   setUp(() => p = null);
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
   // Create tests for each template.
   for (String templateId in CreateCommand.legalTemplateIds) {
-    test(templateId, () {
+    test(templateId, () async {
       p = project();
 
-      ProcessResult createResult = p.runSync([
+      ProcessResult createResult = await p.run([
         'create',
         '--force',
         '--template',
@@ -37,11 +37,11 @@
       // Validate that the project analyzes cleanly.
       // TODO: Should we use --fatal-infos here?
       ProcessResult analyzeResult =
-          p.runSync(['analyze'], workingDir: p.dir.path);
+          await p.run(['analyze'], workingDir: p.dir.path);
       expect(analyzeResult.exitCode, 0, reason: analyzeResult.stdout);
 
       // Validate that the code is well formatted.
-      ProcessResult formatResult = p.runSync([
+      ProcessResult formatResult = await p.run([
         'format',
         '--output',
         'none',
diff --git a/pkg/dartdev/test/commands/create_test.dart b/pkg/dartdev/test/commands/create_test.dart
index 5af3323..899c7b0 100644
--- a/pkg/dartdev/test/commands/create_test.dart
+++ b/pkg/dartdev/test/commands/create_test.dart
@@ -21,11 +21,11 @@
 
   setUp(() => p = null);
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['create', '--help']);
+    var result = await p.run(['create', '--help']);
 
     expect(result.stdout, contains('Create a new Dart project.'));
     expect(
@@ -38,9 +38,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['create', '--help', '--verbose']);
+    var result = await p.run(['create', '--help', '--verbose']);
 
     expect(result.stdout, contains('Create a new Dart project.'));
     expect(
@@ -53,21 +53,21 @@
     expect(result.exitCode, 0);
   });
 
-  test('default template exists', () {
+  test('default template exists', () async {
     expect(CreateCommand.legalTemplateIds,
         contains(CreateCommand.defaultTemplateId));
   });
 
-  test('all templates exist', () {
+  test('all templates exist', () async {
     for (String templateId in CreateCommand.legalTemplateIds) {
       expect(CreateCommand.legalTemplateIds, contains(templateId));
     }
   });
 
-  test('list templates', () {
+  test('list templates', () async {
     p = project();
 
-    ProcessResult result = p.runSync(['create', '--list-templates']);
+    ProcessResult result = await p.run(['create', '--list-templates']);
     expect(result.exitCode, 0);
 
     String output = result.stdout.toString();
@@ -78,27 +78,27 @@
     expect(parsedResult[0]['description'], isNotNull);
   });
 
-  test('no directory given', () {
+  test('no directory given', () async {
     p = project();
 
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'create',
     ]);
     expect(result.exitCode, 1);
   });
 
-  test('directory already exists', () {
+  test('directory already exists', () async {
     p = project();
 
-    ProcessResult result = p.runSync(
+    ProcessResult result = await p.run(
         ['create', '--template', CreateCommand.defaultTemplateId, p.dir.path]);
     expect(result.exitCode, 73);
   });
 
-  test('project in current directory', () {
+  test('project in current directory', () async {
     p = project();
     final projectDir = Directory('foo')..createSync();
-    final result = p.runSync(
+    final result = await p.run(
       ['create', '--force', '.'],
       workingDir: projectDir.path,
     );
@@ -107,9 +107,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('project with normalized package name', () {
+  test('project with normalized package name', () async {
     p = project();
-    final result = p.runSync(['create', 'requires-normalization']);
+    final result = await p.run(['create', 'requires-normalization']);
     expect(result.stderr, isEmpty);
     expect(
         result.stdout,
@@ -118,9 +118,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('project with an invalid package name', () {
+  test('project with an invalid package name', () async {
     p = project();
-    final result = p.runSync(['create', 'bad-package^name']);
+    final result = await p.run(['create', 'bad-package^name']);
     expect(
       result.stderr,
       contains(
@@ -131,20 +131,20 @@
     expect(result.exitCode, 73);
   });
 
-  test('bad template id', () {
+  test('bad template id', () async {
     p = project();
 
-    ProcessResult result =
-        p.runSync(['create', '--no-pub', '--template', 'foo-bar', p.dir.path]);
+    ProcessResult result = await p
+        .run(['create', '--no-pub', '--template', 'foo-bar', p.dir.path]);
     expect(result.exitCode, isNot(0));
   });
 
   // Create tests for each template.
   for (String templateId in CreateCommand.legalTemplateIds) {
-    test(templateId, () {
+    test(templateId, () async {
       p = project();
       const projectName = 'template_project';
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'create',
         '--force',
         '--no-pub',
diff --git a/pkg/dartdev/test/commands/debug_adapter_test.dart b/pkg/dartdev/test/commands/debug_adapter_test.dart
index c21f476..00a7e8c 100644
--- a/pkg/dartdev/test/commands/debug_adapter_test.dart
+++ b/pkg/dartdev/test/commands/debug_adapter_test.dart
@@ -13,9 +13,9 @@
 void debugAdapter() {
   // Implementation of debug_adapter is tested in the DDS package where the
   // DAP implementation lives.
-  test('--help', () {
+  test('--help', () async {
     final p = project();
-    var result = p.runSync(['debug_adapter', '--help']);
+    var result = await p.run(['debug_adapter', '--help']);
 
     expect(
         result.stdout,
diff --git a/pkg/dartdev/test/commands/devtools_test.dart b/pkg/dartdev/test/commands/devtools_test.dart
index 37bc32e..e14ba0ac 100644
--- a/pkg/dartdev/test/commands/devtools_test.dart
+++ b/pkg/dartdev/test/commands/devtools_test.dart
@@ -16,11 +16,11 @@
 void devtools() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['devtools', '--help']);
+    var result = await p.run(['devtools', '--help']);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Open DevTools'));
@@ -31,9 +31,9 @@
     expect(result.stdout.contains('--try-ports'), isFalse);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['devtools', '--help', '--verbose']);
+    var result = await p.run(['devtools', '--help', '--verbose']);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Open DevTools'));
diff --git a/pkg/dartdev/test/commands/doc_test.dart b/pkg/dartdev/test/commands/doc_test.dart
new file mode 100644
index 0000000..9f57108
--- /dev/null
+++ b/pkg/dartdev/test/commands/doc_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import '../utils.dart';
+
+const int compileErrorExitCode = 64;
+
+void main() {
+  group('doc', defineCompileTests, timeout: longTimeout);
+}
+
+void defineCompileTests() {
+  test('Passing no args fails', () async {
+    final p = project();
+    var result = await p.run(['doc']);
+    expect(result.stderr, contains('Input directory not specified'));
+    expect(result.exitCode, compileErrorExitCode);
+  });
+
+  test('--help', () async {
+    final p = project();
+    final result = await p.run(['doc', '--help']);
+    expect(
+      result.stdout,
+      contains('Usage: dart doc [arguments] <input directory>'),
+    );
+
+    expect(result.exitCode, 0);
+  });
+
+  test('Document a library', () async {
+    final source = '''
+/// This is Foo. It uses [Bar].
+class Foo {
+    Bar bar;
+}
+
+/// Bar is very nice.
+class Bar {
+    _i = 42;
+}
+    ''';
+
+    final p = project(mainSrc: 'void main() { print("Hello, World"); }');
+    p.file('lib/foo.dart', source);
+    final result = await p.run(['doc', '--validate-links', p.dirPath]);
+    print(
+        'exit: ${result.exitCode}, stderr:\n${result.stderr}\nstdout:\n${result.stdout}');
+    expect(result.stdout, contains('Documenting dartdev_temp'));
+  });
+
+  test('Document a library with broken link is flagged', () async {
+    final source = '''
+/// This is Foo. It uses [Baz].
+class Foo {
+  //  Bar bar;
+}
+    ''';
+
+    final p = project(mainSrc: 'void main() { print("Hello, World"); }');
+    p.file('lib/foo.dart', source);
+    final result = await p.run(['doc', '--validate-links', p.dirPath]);
+    print(
+        'exit: ${result.exitCode}, stderr:\n${result.stderr}\nstdout:\n${result.stdout}');
+    expect(result.stdout, contains('Documenting dartdev_temp'));
+  });
+}
diff --git a/pkg/dartdev/test/commands/fix_test.dart b/pkg/dartdev/test/commands/fix_test.dart
index 97cddf9..c6382f4 100644
--- a/pkg/dartdev/test/commands/fix_test.dart
+++ b/pkg/dartdev/test/commands/fix_test.dart
@@ -26,7 +26,7 @@
 
   setUp(() => p = null);
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
   void assertResult({int exitCode = 0}) {
     String message;
@@ -52,18 +52,18 @@
 ''');
   }
 
-  ProcessResult runFix(List<String> args, {String workingDir}) {
+  Future<ProcessResult> runFix(List<String> args, {String workingDir}) async {
     if (runFromSource) {
       var binary = path.join(Directory.current.path, 'bin', 'dartdev.dart');
-      return p.runSync([binary, 'fix', ...?args], workingDir: workingDir);
+      return await p.run([binary, 'fix', ...?args], workingDir: workingDir);
     }
-    return p.runSync(['fix', ...args], workingDir: workingDir);
+    return await p.run(['fix', ...args], workingDir: workingDir);
   }
 
-  test('--help', () {
+  test('--help', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = runFix([p.dirPath, '--help']);
+    var result = await runFix([p.dirPath, '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -76,10 +76,10 @@
     expect(result.stdout, contains('Usage: dart fix [arguments]'));
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = runFix([p.dirPath, '--help', '--verbose']);
+    var result = await runFix([p.dirPath, '--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -95,10 +95,10 @@
     );
   });
 
-  test('none', () {
+  test('none', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = runFix([p.dirPath]);
+    var result = await runFix([p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -106,17 +106,17 @@
         result.stdout, contains('Apply automated fixes to Dart source code.'));
   });
 
-  test('--apply (none)', () {
+  test('--apply (none)', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
 
-    var result = runFix(['--apply', p.dirPath]);
+    var result = await runFix(['--apply', p.dirPath]);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
   });
 
-  test('--apply (no args)', () {
+  test('--apply (no args)', () async {
     p = project(
       mainSrc: '''
 var x = "";
@@ -128,7 +128,7 @@
 ''',
     );
 
-    var result = runFix(['--apply'], workingDir: p.dirPath);
+    var result = await runFix(['--apply'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -140,7 +140,7 @@
         ]));
   });
 
-  test('--dry-run', () {
+  test('--dry-run', () async {
     p = project(
       mainSrc: '''
 class A {
@@ -158,7 +158,7 @@
     - prefer_single_quotes
 ''',
     );
-    var result = runFix(['--dry-run', '.'], workingDir: p.dirPath);
+    var result = await runFix(['--dry-run', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -171,7 +171,7 @@
         ]));
   });
 
-  test('--apply (.)', () {
+  test('--apply (.)', () async {
     p = project(
       mainSrc: '''
 var x = "";
@@ -182,7 +182,7 @@
     - prefer_single_quotes
 ''',
     );
-    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -195,7 +195,33 @@
         ]));
   });
 
-  test('--apply (excludes)', () {
+  test('--apply (contradictory lints do not loop infinitely)', () async {
+    p = project(
+      mainSrc: '''
+var x = "";
+''',
+      analysisOptions: '''
+linter:
+  rules:
+    - prefer_double_quotes
+    - prefer_single_quotes
+''',
+    );
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(
+        result.stdout,
+        stringContainsInOrder([
+          'Applying fixes...',
+          'lib${Platform.pathSeparator}main.dart',
+          '  prefer_double_quotes $bullet 2 fixes',
+          '  prefer_single_quotes $bullet 2 fixes',
+          '4 fixes made in 1 file.',
+        ]));
+  });
+
+  test('--apply (excludes)', () async {
     p = project(
       mainSrc: '''
 var x = "";
@@ -209,13 +235,13 @@
     - prefer_single_quotes
 ''',
     );
-    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
   });
 
-  test('--apply (ignores)', () {
+  test('--apply (ignores)', () async {
     p = project(
       mainSrc: '''
 // ignore: prefer_single_quotes
@@ -227,14 +253,41 @@
     - prefer_single_quotes
 ''',
     );
-    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
   });
 
+  test('--apply (unused imports require a second pass)', () async {
+    p = project(
+      mainSrc: '''
+import 'dart:math';
+
+var x = "";
+''',
+      analysisOptions: '''
+linter:
+  rules:
+    - prefer_single_quotes
+''',
+    );
+    var result = await runFix(['--apply', '.'], workingDir: p.dirPath);
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(
+        result.stdout,
+        stringContainsInOrder([
+          'Applying fixes...',
+          'lib${Platform.pathSeparator}main.dart',
+          '  prefer_single_quotes $bullet 1 fix',
+          '  unused_import $bullet 1 fix',
+          '2 fixes made in 1 file.',
+        ]));
+  });
+
   group('compare-to-golden', () {
-    test('applied fixes do not match expected', () {
+    test('applied fixes do not match expected', () async {
       p = project(
         mainSrc: '''
 class A {
@@ -261,11 +314,12 @@
   String a() => '';
 }
 ''');
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult(exitCode: 1);
     });
 
-    test('applied fixes match expected', () {
+    test('applied fixes match expected', () async {
       p = project(
         mainSrc: '''
 class A {
@@ -293,11 +347,12 @@
   String a() => '';
 }
 ''');
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult();
     });
 
-    test('missing expect', () {
+    test('missing expect', () async {
       p = project(
         mainSrc: '''
 class A {
@@ -315,11 +370,12 @@
     - prefer_single_quotes
 ''',
       );
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult(exitCode: 1);
     });
 
-    test('missing original', () {
+    test('missing original', () async {
       p = project(mainSrc: '''
 class C {}
 ''');
@@ -329,11 +385,12 @@
       p.file('lib/secondary.dart.expect', '''
 class A {}
 ''');
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult(exitCode: 1);
     });
 
-    test('no fixes to apply does not match expected', () {
+    test('no fixes to apply does not match expected', () async {
       p = project(
         mainSrc: '''
 class A {
@@ -351,7 +408,8 @@
   String a() => '';
 }
 ''');
-      result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
+      result =
+          await runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       assertResult(exitCode: 1);
     });
   });
diff --git a/pkg/dartdev/test/commands/flag_test.dart b/pkg/dartdev/test/commands/flag_test.dart
index da055db..3feab2d 100644
--- a/pkg/dartdev/test/commands/flag_test.dart
+++ b/pkg/dartdev/test/commands/flag_test.dart
@@ -57,11 +57,11 @@
 void help() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['--help']);
+    var result = await p.run(['--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -77,9 +77,9 @@
     expect(result.stdout, contains('migrate '));
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['--help', '--verbose']);
+    var result = await p.run(['--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -87,9 +87,9 @@
         contains('The following options are only used for VM development'));
   });
 
-  test('--help -v', () {
+  test('--help -v', () async {
     p = project();
-    var result = p.runSync(['--help', '-v']);
+    var result = await p.run(['--help', '-v']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -97,25 +97,26 @@
         contains('The following options are only used for VM development'));
   });
 
-  test('print Dart CLI help on usage error', () {
+  test('print Dart CLI help on usage error', () async {
     p = project();
-    var result = p.runSync(['---help']);
+    var result = await p.run(['---help']);
     expect(result.exitCode, 255);
     expect(result.stdout, contains(DartdevRunner.dartdevDescription));
     expect(result.stderr, isEmpty);
   });
 
-  test('print VM help on usage error when --disable-dart-dev is provided', () {
+  test('print VM help on usage error when --disable-dart-dev is provided',
+      () async {
     p = project();
-    var result = p.runSync(['---help', '--disable-dart-dev']);
+    var result = await p.run(['---help', '--disable-dart-dev']);
     expect(result.exitCode, 255);
     expect(result.stdout, isNot(contains(DartdevRunner.dartdevDescription)));
     expect(result.stderr, isEmpty);
   });
 
-  test('help', () {
+  test('help', () async {
     p = project();
-    var result = p.runSync(['help']);
+    var result = await p.run(['help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -131,9 +132,9 @@
     expect(result.stdout, contains('migrate '));
   });
 
-  test('help --verbose', () {
+  test('help --verbose', () async {
     p = project();
-    var result = p.runSync(['help', '--verbose']);
+    var result = await p.run(['help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stdout,
@@ -141,9 +142,9 @@
     expect(result.stdout, contains('migrate '));
   });
 
-  test('help -v', () {
+  test('help -v', () async {
     p = project();
-    var result = p.runSync(['help', '-v']);
+    var result = await p.run(['help', '-v']);
 
     expect(result.exitCode, 0);
     expect(result.stdout,
diff --git a/pkg/dartdev/test/commands/format_test.dart b/pkg/dartdev/test/commands/format_test.dart
index 568f3ce..cf82970 100644
--- a/pkg/dartdev/test/commands/format_test.dart
+++ b/pkg/dartdev/test/commands/format_test.dart
@@ -16,11 +16,11 @@
 void format() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['format', '--help']);
+    var result = await p.run(['format', '--help']);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Idiomatically format Dart source code.'));
@@ -31,9 +31,9 @@
     expect(result.stdout.contains('--stdin-name'), isFalse);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['format', '--help', '--verbose']);
+    var result = await p.run(['format', '--help', '--verbose']);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Idiomatically format Dart source code.'));
@@ -44,17 +44,17 @@
     expect(result.stdout, contains('--stdin-name'));
   });
 
-  test('unchanged', () {
+  test('unchanged', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    ProcessResult result = p.runSync(['format', p.relativeFilePath]);
+    ProcessResult result = await p.run(['format', p.relativeFilePath]);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, startsWith('Formatted 1 file (0 changed) in '));
   });
 
-  test('formatted', () {
+  test('formatted', () async {
     p = project(mainSrc: 'int get foo =>       1;\n');
-    ProcessResult result = p.runSync(['format', p.relativeFilePath]);
+    ProcessResult result = await p.run(['format', p.relativeFilePath]);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -63,9 +63,9 @@
             'Formatted lib/main.dart\nFormatted 1 file (1 changed) in '));
   });
 
-  test('formatted with exit code set', () {
+  test('formatted with exit code set', () async {
     p = project(mainSrc: 'int get foo =>       1;\n');
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'format',
       '--set-exit-if-changed',
       p.relativeFilePath,
@@ -78,9 +78,9 @@
             'Formatted lib/main.dart\nFormatted 1 file (1 changed) in '));
   });
 
-  test('not formatted with exit code set', () {
+  test('not formatted with exit code set', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'format',
       '--set-exit-if-changed',
       p.relativeFilePath,
@@ -90,10 +90,10 @@
     expect(result.stdout, startsWith('Formatted 1 file (0 changed) in '));
   });
 
-  test('unknown file', () {
+  test('unknown file', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
     var unknownFilePath = '${p.relativeFilePath}-unknown-file.dart';
-    ProcessResult result = p.runSync(['format', unknownFilePath]);
+    ProcessResult result = await p.run(['format', unknownFilePath]);
     expect(result.exitCode, 0);
     expect(result.stderr,
         startsWith('No file or directory found at "$unknownFilePath".'));
diff --git a/pkg/dartdev/test/commands/help_test.dart b/pkg/dartdev/test/commands/help_test.dart
index 09c3c41..69f1f27 100644
--- a/pkg/dartdev/test/commands/help_test.dart
+++ b/pkg/dartdev/test/commands/help_test.dart
@@ -15,7 +15,7 @@
 void help() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
   /// Commands not tested by the following loop.
   List<String> _commandsNotTested = <String>[
@@ -26,10 +26,10 @@
       .commands
       .forEach((String commandKey, Command command) {
     if (!_commandsNotTested.contains(commandKey)) {
-      test('(help $commandKey == $commandKey --help)', () {
+      test('(help $commandKey == $commandKey --help)', () async {
         p = project();
-        var result = p.runSync(['help', commandKey]);
-        var verbHelpResult = p.runSync([commandKey, '--help']);
+        var result = await p.run(['help', commandKey]);
+        var verbHelpResult = await p.run([commandKey, '--help']);
 
         expect(result.stdout, contains(verbHelpResult.stdout));
         expect(result.stderr, contains(verbHelpResult.stderr));
@@ -37,20 +37,20 @@
     }
   });
 
-  test('(help test ~= test --help) outside project', () {
+  test('(help test ~= test --help) outside project', () async {
     p = project();
     p.deleteFile('pubspec.yaml');
-    var result = p.runSync(['help', 'test']);
-    var testHelpResult = p.runSync(['test', '--help']);
+    var result = await p.run(['help', 'test']);
+    var testHelpResult = await p.run(['test', '--help']);
 
     expect(testHelpResult.stdout, contains(result.stdout));
     expect(testHelpResult.stderr, contains(result.stderr));
   });
 
-  test('(help pub == pub --help)', () {
+  test('(help pub == pub --help)', () async {
     p = project();
-    var result = p.runSync(['help', 'pub']);
-    var pubHelpResult = p.runSync(['pub', '--help']);
+    var result = await p.run(['help', 'pub']);
+    var pubHelpResult = await p.run(['pub', '--help']);
 
     expect(result.stdout, contains(pubHelpResult.stdout));
     expect(result.stderr, contains(pubHelpResult.stderr));
diff --git a/pkg/dartdev/test/commands/language_server_test.dart b/pkg/dartdev/test/commands/language_server_test.dart
index 1e7a46d..543aec9 100644
--- a/pkg/dartdev/test/commands/language_server_test.dart
+++ b/pkg/dartdev/test/commands/language_server_test.dart
@@ -24,10 +24,7 @@
   utils.TestProject project;
   Process process;
 
-  tearDown(() {
-    project?.dispose();
-    process?.kill();
-  });
+  tearDown(() async => await project?.dispose());
 
   Future runWithLsp(List<String> args) async {
     project = utils.project();
diff --git a/pkg/dartdev/test/commands/migrate_test.dart b/pkg/dartdev/test/commands/migrate_test.dart
index 94795be..0b394ad 100644
--- a/pkg/dartdev/test/commands/migrate_test.dart
+++ b/pkg/dartdev/test/commands/migrate_test.dart
@@ -17,11 +17,11 @@
 
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['migrate', '--help']);
+    var result = await p.run(['migrate', '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -35,9 +35,9 @@
     );
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['migrate', '--help', '--verbose']);
+    var result = await p.run(['migrate', '--help', '--verbose']);
 
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
@@ -53,43 +53,43 @@
     );
   });
 
-  test('directory implicit', () {
+  test('directory implicit', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'int get foo => 1;\n');
     var result =
-        p.runSync(['migrate', '--no-web-preview'], workingDir: p.dirPath);
+        await p.run(['migrate', '--no-web-preview'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Generating migration suggestions'));
   });
 
-  test('directory explicit', () {
+  test('directory explicit', () async {
     p = project(mainSrc: dartVersionFilePrefix2_9 + 'int get foo => 1;\n');
-    var result = p.runSync(['migrate', '--no-web-preview', p.dirPath]);
+    var result = await p.run(['migrate', '--no-web-preview', p.dirPath]);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Generating migration suggestions'));
   });
 
-  test('bad directory', () {
+  test('bad directory', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    var result = p.runSync(['migrate', 'foo_bar_dir']);
+    var result = await p.run(['migrate', 'foo_bar_dir']);
     expect(result.exitCode, 1);
     expect(result.stderr, contains('foo_bar_dir does not exist'));
     expect(result.stdout, isEmpty);
   });
 
-  test('pub get needs running', () {
+  test('pub get needs running', () async {
     p = project(mainSrc: 'import "package:foo/foo.dart";\n');
-    var result = p.runSync(['migrate', p.dirPath]);
+    var result = await p.run(['migrate', p.dirPath]);
     expect(result.exitCode, 1);
     expect(result.stderr, isEmpty);
     expect(result.stdout, runPubGet);
     expect(result.stdout, isNot(setLowerSdkConstraint));
   });
 
-  test('non-pub-related error', () {
+  test('non-pub-related error', () async {
     p = project(mainSrc: 'var missing = "semicolon"\n');
-    var result = p.runSync(['migrate', p.dirPath]);
+    var result = await p.run(['migrate', p.dirPath]);
     expect(result.exitCode, 1);
     expect(result.stderr, isEmpty);
     expect(result.stdout, runPubGet);
diff --git a/pkg/dartdev/test/commands/pub_test.dart b/pkg/dartdev/test/commands/pub_test.dart
index ab5b715..f2486dd 100644
--- a/pkg/dartdev/test/commands/pub_test.dart
+++ b/pkg/dartdev/test/commands/pub_test.dart
@@ -15,7 +15,7 @@
 void pub() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
   void _assertPubHelpInvoked(ProcessResult result) {
     expect(result, isNotNull);
@@ -25,8 +25,8 @@
     expect(result.stderr, isEmpty);
   }
 
-  test('implicit --help', () {
-    final result = project().runSync(['pub']);
+  test('implicit --help', () async {
+    final result = await project().run(['pub']);
     expect(result, isNotNull);
     expect(result.exitCode, 64);
     expect(result.stderr, contains('Missing subcommand for "dart pub".'));
@@ -34,18 +34,18 @@
     expect(result.stdout, isEmpty);
   });
 
-  test('--help', () {
-    _assertPubHelpInvoked(project().runSync(['pub', '--help']));
+  test('--help', () async {
+    _assertPubHelpInvoked(await project().run(['pub', '--help']));
   });
 
-  test('-h', () {
-    _assertPubHelpInvoked(project().runSync(['pub', '-h']));
+  test('-h', () async {
+    _assertPubHelpInvoked(await project().run(['pub', '-h']));
   });
 
-  test('help cache', () {
+  test('help cache', () async {
     p = project();
-    var result = p.runSync(['help', 'pub', 'cache']);
-    var result2 = p.runSync(['pub', 'cache', '--help']);
+    var result = await p.run(['help', 'pub', 'cache']);
+    var result2 = await p.run(['pub', 'cache', '--help']);
 
     expect(result.exitCode, 0);
 
@@ -56,10 +56,10 @@
     expect(result.stderr, result2.stderr);
   });
 
-  test('help publish', () {
+  test('help publish', () async {
     p = project();
-    var result = p.runSync(['help', 'pub', 'publish']);
-    var result2 = p.runSync(['pub', 'publish', '--help']);
+    var result = await p.run(['help', 'pub', 'publish']);
+    var result2 = await p.run(['pub', 'publish', '--help']);
 
     expect(result.exitCode, 0);
 
@@ -71,17 +71,17 @@
     expect(result.stderr, result2.stderr);
   });
 
-  test('failure', () {
+  test('failure', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    var result = p.runSync(['pub', 'deps']);
+    var result = await p.run(['pub', 'deps']);
     expect(result.exitCode, 65);
     expect(result.stdout, isEmpty);
     expect(result.stderr, contains('No pubspec.lock file found'));
   });
 
-  test('failure unknown option', () {
+  test('failure unknown option', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
-    var result = p.runSync(['pub', 'deps', '--foo']);
+    var result = await p.run(['pub', 'deps', '--foo']);
     expect(result.exitCode, 64);
     expect(result.stdout, isEmpty);
     expect(result.stderr, startsWith('Could not find an option named "foo".'));
diff --git a/pkg/dartdev/test/commands/run_test.dart b/pkg/dartdev/test/commands/run_test.dart
index 613a508..f3174c7 100644
--- a/pkg/dartdev/test/commands/run_test.dart
+++ b/pkg/dartdev/test/commands/run_test.dart
@@ -23,11 +23,11 @@
 void run() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
-    var result = p.runSync(['run', '--help']);
+    var result = await p.run(['run', '--help']);
 
     expect(result.stdout, contains('Run a Dart program.'));
     expect(result.stdout, contains('Debugging options:'));
@@ -41,9 +41,9 @@
     expect(result.exitCode, 0);
   });
 
-  test('--help --verbose', () {
+  test('--help --verbose', () async {
     p = project();
-    var result = p.runSync(['run', '--help', '--verbose']);
+    var result = await p.run(['run', '--help', '--verbose']);
 
     expect(result.stdout, contains('Run a Dart program.'));
     expect(result.stdout, contains('Debugging options:'));
@@ -57,30 +57,30 @@
     expect(result.exitCode, 0);
   });
 
-  test("'Hello World'", () {
+  test("'Hello World'", () async {
     p = project(mainSrc: "void main() { print('Hello World'); }");
-    ProcessResult result = p.runSync(['run', p.relativeFilePath]);
+    ProcessResult result = await p.run(['run', p.relativeFilePath]);
 
     expect(result.stdout, contains('Hello World'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
   });
 
-  test('no such file', () {
+  test('no such file', () async {
     p = project(mainSrc: "void main() { print('Hello World'); }");
     ProcessResult result =
-        p.runSync(['run', 'no/such/file/${p.relativeFilePath}']);
+        await p.run(['run', 'no/such/file/${p.relativeFilePath}']);
 
     expect(result.stderr, isNotEmpty);
     expect(result.exitCode, isNot(0));
   });
 
-  test('implicit packageName.dart', () {
+  test('implicit packageName.dart', () async {
     // TODO(jwren) circle back to reimplement this test if possible, the file
     // name (package name) will be the name of the temporary directory on disk
     p = project(mainSrc: "void main() { print('Hello World'); }");
     p.file('bin/main.dart', "void main() { print('Hello main.dart'); }");
-    ProcessResult result = p.runSync(['run']);
+    ProcessResult result = await p.run(['run']);
 
     expect(result.stdout, contains('Hello main.dart'));
     expect(result.stderr, isEmpty);
@@ -88,10 +88,10 @@
   }, skip: true);
 
   // Could not find the implicit file to run: bin
-  test('missing implicit packageName.dart', () {
+  test('missing implicit packageName.dart', () async {
     p = project(mainSrc: "void main() { print('Hello World'); }");
     p.file('bin/foo.dart', "void main() { print('Hello main.dart'); }");
-    ProcessResult result = p.runSync(['run']);
+    ProcessResult result = await p.run(['run']);
 
     expect(result.stdout, isEmpty);
     expect(
@@ -101,10 +101,10 @@
     expect(result.exitCode, 255);
   });
 
-  test('arguments are properly passed', () {
+  test('arguments are properly passed', () async {
     p = project();
     p.file('main.dart', 'void main(args) { print(args); }');
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--enable-experiment=test-experiment',
       'main.dart',
@@ -118,7 +118,7 @@
     expect(result.exitCode, 0);
   });
 
-  test('from path-dependency with cyclic dependency', () {
+  test('from path-dependency with cyclic dependency', () async {
     p = project(name: 'foo');
     final bar = TestProject(name: 'bar');
     p.file('pubspec.yaml', '''
@@ -141,13 +141,13 @@
 void main(List<String> args) => print("$b $args");
 ''');
 
-      ProcessResult result = p.runSync(['run', 'bar:main', '--arg1', 'arg2']);
+      ProcessResult result = await p.run(['run', 'bar:main', '--arg1', 'arg2']);
 
       expect(result.stderr, isEmpty);
       expect(result.stdout, contains('FOO BAR [--arg1, arg2]'));
       expect(result.exitCode, 0);
     } finally {
-      bar.dispose();
+      await bar.dispose();
     }
   });
 
@@ -156,7 +156,7 @@
     p.file('main.dart', 'void main(args) { print(args); }');
     // Test with absolute path
     final name = path.join(p.dirPath, 'main.dart');
-    final result = p.runSync([
+    final result = await p.run([
       'run',
       '--enable-experiment=test-experiment',
       name,
@@ -175,7 +175,7 @@
     p.file('main.dart', 'void main(args) { print(args); }');
     // Test with File uri
     final name = path.join(p.dirPath, 'main.dart');
-    final result = p.runSync([
+    final result = await p.run([
       'run',
       Uri.file(name).toString(),
       '--argument1',
@@ -199,7 +199,7 @@
     //
     // This test ensures that allowed arguments for dart run which are valid VM
     // arguments are properly handled by the VM.
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--observe',
       '--pause-isolates-on-start',
@@ -220,7 +220,7 @@
     expect(result.exitCode, 0);
 
     // Again, with --disable-service-auth-codes.
-    result = p.runSync([
+    result = await p.run([
       'run',
       '--observe',
       '--pause-isolates-on-start',
@@ -242,7 +242,7 @@
     expect(result.exitCode, 0);
 
     // Again, with IPv6.
-    result = p.runSync([
+    result = await p.run([
       'run',
       '--observe=8181/::1',
       '--pause-isolates-on-start',
@@ -269,7 +269,7 @@
 
     // Any VM flags not listed under 'dart run help --verbose' should be passed
     // before a dartdev command.
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--vm-name=foo',
       p.relativeFilePath,
@@ -288,7 +288,7 @@
 
     // Any VM flags not listed under 'dart run help --verbose' should be passed
     // before a dartdev command.
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--verbose_gc',
       p.relativeFilePath,
@@ -307,7 +307,7 @@
 
     // Ensure --enable-asserts doesn't cause the dartdev isolate to fail to
     // load. Regression test for: https://github.com/dart-lang/sdk/issues/42831
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       '--enable-asserts',
       p.relativeFilePath,
@@ -322,7 +322,7 @@
     p = project(mainSrc: 'void main() { assert(false); }');
 
     // Any VM flags passed after the script shouldn't be interpreted by the VM.
-    ProcessResult result = p.runSync([
+    ProcessResult result = await p.run([
       'run',
       p.relativeFilePath,
       '--enable-asserts',
@@ -333,10 +333,10 @@
     expect(result.exitCode, 0);
   });
 
-  test('without verbose CFE info', () {
+  test('without verbose CFE info', () async {
     final p = project(mainSrc: '''void main() {}''');
 
-    var result = p.runSync(
+    var result = await p.run(
       [
         'run',
         '--verbosity=warning',
@@ -352,9 +352,9 @@
 
   group('DDS', () {
     group('disable', () {
-      test('dart run simple', () {
+      test('dart run simple', () async {
         p = project(mainSrc: "void main() { print('Hello World'); }");
-        ProcessResult result = p.runSync([
+        ProcessResult result = await p.run([
           'run',
           '--no-dds',
           '--enable-vm-service',
@@ -364,9 +364,9 @@
         expect(result.stdout, contains(observatoryMessagePrefix));
       });
 
-      test('dart simple', () {
+      test('dart simple', () async {
         p = project(mainSrc: "void main() { print('Hello World'); }");
-        ProcessResult result = p.runSync([
+        ProcessResult result = await p.run([
           '--no-dds',
           '--enable-vm-service',
           p.relativeFilePath,
@@ -377,9 +377,9 @@
     });
 
     group('explicit enable', () {
-      test('dart run simple', () {
+      test('dart run simple', () async {
         p = project(mainSrc: "void main() { print('Hello World'); }");
-        ProcessResult result = p.runSync([
+        ProcessResult result = await p.run([
           'run',
           '--dds',
           '--enable-vm-service',
@@ -389,9 +389,9 @@
         expect(result.stdout, contains(observatoryMessagePrefix));
       });
 
-      test('dart simple', () {
+      test('dart simple', () async {
         p = project(mainSrc: "void main() { print('Hello World'); }");
-        ProcessResult result = p.runSync([
+        ProcessResult result = await p.run([
           '--dds',
           '--enable-vm-service',
           p.relativeFilePath,
@@ -405,7 +405,7 @@
   group('DevTools', () {
     test('dart run simple', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'run',
         '--enable-vm-service',
         p.relativeFilePath,
@@ -415,7 +415,7 @@
 
     test('dart simple', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         '--enable-vm-service',
         p.relativeFilePath,
       ]);
@@ -424,7 +424,7 @@
 
     test('dart run explicit', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'run',
         '--serve-devtools',
         '--enable-vm-service',
@@ -435,7 +435,7 @@
 
     test('dart explicit', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         '--serve-devtools',
         '--enable-vm-service',
         p.relativeFilePath,
@@ -445,7 +445,7 @@
 
     test('dart run disabled', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'run',
         '--enable-vm-service',
         '--no-serve-devtools',
@@ -456,7 +456,7 @@
 
     test('dart disabled', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         '--enable-vm-service',
         '--no-serve-devtools',
         p.relativeFilePath,
@@ -466,7 +466,7 @@
 
     test('dart run VM service not enabled', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         'run',
         '--serve-devtools',
         p.relativeFilePath,
@@ -476,7 +476,7 @@
 
     test('dart VM service not enabled', () async {
       p = project(mainSrc: "void main() { print('Hello World'); }");
-      ProcessResult result = p.runSync([
+      ProcessResult result = await p.run([
         '--serve-devtools',
         p.relativeFilePath,
       ]);
diff --git a/pkg/dartdev/test/commands/test_test.dart b/pkg/dartdev/test/commands/test_test.dart
index bda022bb..7f758d3 100644
--- a/pkg/dartdev/test/commands/test_test.dart
+++ b/pkg/dartdev/test/commands/test_test.dart
@@ -19,12 +19,12 @@
 void defineTest(List<Experiment> experiments) {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('--help', () {
+  test('--help', () async {
     p = project();
 
-    final result = p.runSync(['test', '--help']);
+    final result = await p.run(['test', '--help']);
 
     expect(result.exitCode, 0);
     expect(result.stdout, startsWith('''
@@ -35,22 +35,22 @@
     expect(result.stderr, isEmpty);
   });
 
-  test('dart help test', () {
+  test('dart help test', () async {
     p = project();
 
-    final result = p.runSync(['help', 'test']);
+    final result = await p.run(['help', 'test']);
 
     expect(result.exitCode, 0);
     expect(result.stdout, contains(' tests for a project'));
     expect(result.stderr, isEmpty);
   });
 
-  test('no pubspec.yaml', () {
+  test('no pubspec.yaml', () async {
     p = project();
     var pubspec = File(path.join(p.dirPath, 'pubspec.yaml'));
     pubspec.deleteSync();
 
-    var result = p.runSync(['test']);
+    var result = await p.run(['test']);
 
     expect(result.stderr, isEmpty);
     expect(result.stdout, '''
@@ -58,7 +58,7 @@
 ''');
     expect(result.exitCode, 65);
 
-    var resultHelp = p.runSync(['test', '--help']);
+    var resultHelp = await p.run(['test', '--help']);
 
     expect(resultHelp.stderr, isEmpty);
     expect(resultHelp.stdout, '''
@@ -74,7 +74,7 @@
     expect(resultHelp.exitCode, 65);
   });
 
-  test('runs test', () {
+  test('runs test', () async {
     p = project();
     p.file('test/foo_test.dart', '''
 import 'package:test/test.dart';
@@ -87,13 +87,14 @@
 ''');
 
     // An implicit `pub get` will happen.
-    final result = p.runSync(['test', '--no-color', '--reporter', 'expanded']);
+    final result =
+        await p.run(['test', '--no-color', '--reporter', 'expanded']);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('All tests passed!'));
     expect(result.exitCode, 0);
   });
 
-  test('no package:test dependency', () {
+  test('no package:test dependency', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
     p.file('pubspec.yaml', '''
 name: ${p.name}
@@ -110,7 +111,7 @@
 }
 ''');
 
-    final result = p.runSync(['test']);
+    final result = await p.run(['test']);
     expect(result.exitCode, 65);
     expect(
       result.stdout,
@@ -119,16 +120,17 @@
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 65);
 
-    final resultPubAdd = p.runSync(['pub', 'add', 'test']);
+    final resultPubAdd = await p.run(['pub', 'add', 'test']);
 
     expect(resultPubAdd.exitCode, 0);
-    final result2 = p.runSync(['test', '--no-color', '--reporter', 'expanded']);
+    final result2 =
+        await p.run(['test', '--no-color', '--reporter', 'expanded']);
     expect(result2.stderr, isEmpty);
     expect(result2.stdout, contains('All tests passed!'));
     expect(result2.exitCode, 0);
   });
 
-  test('has package:test dependency', () {
+  test('has package:test dependency', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
     p.file('test/foo_test.dart', '''
 $dartVersionFilePrefix2_9
@@ -142,15 +144,16 @@
 }
 ''');
 
-    final result = p.runSync(['test', '--no-color', '--reporter', 'expanded']);
+    final result =
+        await p.run(['test', '--no-color', '--reporter', 'expanded']);
     expect(result.exitCode, 0);
     expect(result.stdout, contains('All tests passed!'));
     expect(result.stderr, isEmpty);
   });
 
   group('--enable-experiment', () {
-    ProcessResult runTestWithExperimentFlag(String flag) {
-      return p.runSync([
+    Future<ProcessResult> runTestWithExperimentFlag(String flag) async {
+      return await p.run([
         if (flag != null) flag,
         'test',
         '--no-color',
@@ -159,21 +162,21 @@
       ]);
     }
 
-    void expectSuccess(String flag) {
-      final result = runTestWithExperimentFlag(flag);
+    Future<void> expectSuccess(String flag) async {
+      final result = await runTestWithExperimentFlag(flag);
       expect(result.stdout, contains('feature enabled'),
           reason: 'stderr: ${result.stderr}');
       expect(result.exitCode, 0,
           reason: 'stdout: ${result.stdout} stderr: ${result.stderr}');
     }
 
-    void expectFailure(String flag) {
-      final result = runTestWithExperimentFlag(flag);
+    Future<void> expectFailure(String flag) async {
+      final result = await runTestWithExperimentFlag(flag);
       expect(result.exitCode, isNot(0));
     }
 
     for (final experiment in experiments) {
-      test(experiment.name, () {
+      test(experiment.name, () async {
         final currentSdk = Version.parse(Platform.version.split(' ').first);
         p = project(
             mainSrc: experiment.validation,
@@ -190,12 +193,12 @@
 ''');
         if (experiment.enabledIn != null) {
           // The experiment has been released - enabling it should have no effect.
-          expectSuccess(null);
-          expectSuccess('--enable-experiment=${experiment.name}');
+          await expectSuccess(null);
+          await expectSuccess('--enable-experiment=${experiment.name}');
         } else {
-          expectFailure(null);
-          expectFailure('--enable-experiment=no-${experiment.name}');
-          expectSuccess('--enable-experiment=${experiment.name}');
+          await expectFailure(null);
+          await expectFailure('--enable-experiment=no-${experiment.name}');
+          await expectSuccess('--enable-experiment=${experiment.name}');
         }
       });
     }
diff --git a/pkg/dartdev/test/core_test.dart b/pkg/dartdev/test/core_test.dart
index 5f49133..f9c8e29 100644
--- a/pkg/dartdev/test/core_test.dart
+++ b/pkg/dartdev/test/core_test.dart
@@ -105,7 +105,7 @@
 void _project() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
   test('hasPubspecFile positive', () {
     p = project();
diff --git a/pkg/dartdev/test/fix_driver_test.dart b/pkg/dartdev/test/fix_driver_test.dart
index 35ec72a..8b71804 100644
--- a/pkg/dartdev/test/fix_driver_test.dart
+++ b/pkg/dartdev/test/fix_driver_test.dart
@@ -19,7 +19,7 @@
 
 void _driver() {
   TestProject p;
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
   test('no fixes', () async {
     p = project(mainSrc: 'int get foo => 1;\n');
diff --git a/pkg/dartdev/test/load_from_dill_test.dart b/pkg/dartdev/test/load_from_dill_test.dart
index 6de6c6c..0412854 100644
--- a/pkg/dartdev/test/load_from_dill_test.dart
+++ b/pkg/dartdev/test/load_from_dill_test.dart
@@ -11,16 +11,16 @@
 void main() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
   test("Fallback to dartdev.dill from dartdev.dart.snapshot for 'Hello World'",
-      () {
+      () async {
     p = project(mainSrc: "void main() { print('Hello World'); }");
-    // The DartDev snapshot includes the --use-bare-instructions flag. If
-    // --no-use-bare-instructions is passed, the VM will fail to load the
+    // The DartDev snapshot includes the --use_field_guards flag. If
+    // --no-use-field-guards is passed, the VM will fail to load the
     // snapshot and should fall back to using the DartDev dill file.
     ProcessResult result =
-        p.runSync(['--no-use-bare-instructions', 'run', p.relativeFilePath]);
+        await p.run(['--no-use-field-guards', 'run', p.relativeFilePath]);
 
     expect(result.stdout, contains('Hello World'));
     expect(result.stderr, isEmpty);
diff --git a/pkg/dartdev/test/no_such_file_test.dart b/pkg/dartdev/test/no_such_file_test.dart
index b5a3452..bf4eaa3 100644
--- a/pkg/dartdev/test/no_such_file_test.dart
+++ b/pkg/dartdev/test/no_such_file_test.dart
@@ -9,27 +9,27 @@
 void main() {
   TestProject p;
 
-  tearDown(() => p?.dispose());
+  tearDown(() async => await p?.dispose());
 
-  test('Ensure parsing fails after encountering invalid file', () {
+  test('Ensure parsing fails after encountering invalid file', () async {
     // Regression test for https://github.com/dart-lang/sdk/issues/43991
     p = project();
-    final noArgsResult = p.runSync(['foo.dart']);
+    final noArgsResult = await p.run(['foo.dart']);
     expect(noArgsResult.stderr, isNotEmpty);
     expect(noArgsResult.stdout, isEmpty);
     expect(noArgsResult.exitCode, 64);
 
-    final argsResult = p.runSync(['foo.dart', '--bar']);
+    final argsResult = await p.run(['foo.dart', '--bar']);
     expect(argsResult.stderr, noArgsResult.stderr);
     expect(argsResult.stdout, isEmpty);
     expect(argsResult.exitCode, 64);
   });
 
   test('Providing --snapshot VM option with invalid script fails gracefully',
-      () {
+      () async {
     // Regression test for https://github.com/dart-lang/sdk/issues/43785
     p = project();
-    final result = p.runSync(['--snapshot=abc', 'foo.dart']);
+    final result = await p.run(['--snapshot=abc', 'foo.dart']);
     expect(result.stderr, isNotEmpty);
     expect(result.stderr, contains("Error when reading 'foo.dart':"));
     expect(result.stdout, isEmpty);
diff --git a/pkg/dartdev/test/utils.dart b/pkg/dartdev/test/utils.dart
index 73f944f..8f8147a 100644
--- a/pkg/dartdev/test/utils.dart
+++ b/pkg/dartdev/test/utils.dart
@@ -51,6 +51,8 @@
 
   final Map<String, dynamic> pubspec;
 
+  Process _process;
+
   TestProject(
       {String mainSrc,
       String analysisOptions,
@@ -91,25 +93,36 @@
     file.deleteSync();
   }
 
-  void dispose() {
+  Future<void> dispose() async {
+    _process?.kill();
+    await _process?.exitCode;
+    _process = null;
     if (dir.existsSync()) {
       dir.deleteSync(recursive: true);
     }
   }
 
-  ProcessResult runSync(
+  Future<ProcessResult> run(
     List<String> arguments, {
     String workingDir,
-  }) {
-    return Process.runSync(
+  }) async {
+    _process = await Process.start(
         Platform.resolvedExecutable,
         [
           '--no-analytics',
           ...arguments,
         ],
         workingDirectory: workingDir ?? dir.path,
-        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'},
-        stdoutEncoding: utf8);
+        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'});
+    final stdoutContents = _process.stdout.transform(utf8.decoder).join();
+    final stderrContents = _process.stderr.transform(utf8.decoder).join();
+    final code = await _process.exitCode;
+    return ProcessResult(
+      _process.pid,
+      code,
+      await stdoutContents,
+      await stderrContents,
+    );
   }
 
   Future<Process> start(
@@ -123,7 +136,8 @@
           ...arguments,
         ],
         workingDirectory: workingDir ?? dir.path,
-        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'});
+        environment: {if (logAnalytics) '_DARTDEV_LOG_ANALYTICS': 'true'})
+      ..then((p) => _process = p);
   }
 
   String _sdkRootPath;
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
index cccc7a8..3b33fd2 100644
--- a/pkg/dds/CHANGELOG.md
+++ b/pkg/dds/CHANGELOG.md
@@ -1,3 +1,12 @@
+# 2.1.6
+- Improve performance of CPU sample caching.
+
+# 2.1.5
+- Update to new CpuSamplesEvent format for CPU sample caching for improved
+  performance.
+- Add additional context in the case of failure to ascii decode headers caused
+  by utf8 content on the stream.
+
 # 2.1.4
 - A new library `package:dds/dap.dart` exposes classes required to build a custom DAP
   debug-adapter on top of the base Dart DAP functionality in DDS.
diff --git a/pkg/dds/lib/src/client.dart b/pkg/dds/lib/src/client.dart
index 771ccee..7aaeafd 100644
--- a/pkg/dds/lib/src/client.dart
+++ b/pkg/dds/lib/src/client.dart
@@ -107,6 +107,16 @@
       return RPCResponses.success;
     });
 
+    _clientPeer.registerMethod('streamCpuSamplesWithUserTag',
+        (parameters) async {
+      final userTags = parameters['userTags'].asList.cast<String>();
+      profilerUserTagFilters.clear();
+      profilerUserTagFilters.addAll(userTags);
+
+      await dds.streamManager.updateUserTagSubscriptions(userTags);
+      return RPCResponses.success;
+    });
+
     _clientPeer.registerMethod('registerService', (parameters) async {
       final serviceId = parameters['service'].asString;
       final alias = parameters['alias'].asString;
@@ -312,6 +322,7 @@
   final DartDevelopmentServiceImpl dds;
   final StreamChannel connection;
   final Map<String, String> services = {};
+  final Set<String> profilerUserTagFilters = {};
   final json_rpc.Peer _vmServicePeer;
   late json_rpc.Peer _clientPeer;
 }
diff --git a/pkg/dds/lib/src/cpu_samples_manager.dart b/pkg/dds/lib/src/cpu_samples_manager.dart
index a0c413a..14b5c22 100644
--- a/pkg/dds/lib/src/cpu_samples_manager.dart
+++ b/pkg/dds/lib/src/cpu_samples_manager.dart
@@ -15,34 +15,15 @@
     }
   }
 
-  void handleUserTagEvent(Event event) {
-    assert(event.kind! == EventKind.kUserTagChanged);
-    _currentTag = event.updatedTag!;
-    final previousTag = event.previousTag!;
-    if (cpuSamplesCaches.containsKey(previousTag)) {
-      _lastCachedTag = previousTag;
-    }
-  }
-
   void handleCpuSamplesEvent(Event event) {
-    assert(event.kind! == EventKind.kCpuSamples);
-    // There might be some samples left in the buffer for the previously set
-    // user tag. We'll check for them here and then close out the cache.
-    if (_lastCachedTag != null) {
-      cpuSamplesCaches[_lastCachedTag]!.cacheSamples(
-        event.cpuSamples!,
-      );
-      _lastCachedTag = null;
+    for (final userTag in dds.cachedUserTags) {
+      cpuSamplesCaches[userTag]!.cacheSamples(event.cpuSamples!);
     }
-    cpuSamplesCaches[_currentTag]?.cacheSamples(event.cpuSamples!);
   }
 
   final DartDevelopmentServiceImpl dds;
   final String isolateId;
   final cpuSamplesCaches = <String, CpuSamplesRepository>{};
-
-  String _currentTag = '';
-  String? _lastCachedTag;
 }
 
 class CpuSamplesRepository extends RingBuffer<CpuSample> {
@@ -52,21 +33,31 @@
     int bufferSize = 1000000,
   ]) : super(bufferSize);
 
-  void cacheSamples(CpuSamples samples) {
-    String getFunctionId(ProfileFunction function) {
-      final functionObject = function.function;
-      if (functionObject is NativeFunction) {
-        return 'native/${functionObject.name}';
-      }
-      return functionObject.id!;
-    }
+  ProfileFunction _buildProfileFunction(dynamic function) {
+    // `kind` and `resolvedUrl` are populated in `populateFunctionDetails()`.
+    return ProfileFunction(
+      kind: '',
+      inclusiveTicks: -1,
+      exclusiveTicks: -1,
+      resolvedUrl: '',
+      function: function,
+    );
+  }
 
+  String _getFunctionId(dynamic function) {
+    if (function is NativeFunction) {
+      return 'native/${function.name}';
+    }
+    return function.id!;
+  }
+
+  void cacheSamples(CpuSamplesEvent samples) {
     // Initialize upon seeing our first samples.
     if (functions.isEmpty) {
       samplePeriod = samples.samplePeriod!;
       maxStackDepth = samples.maxStackDepth!;
       pid = samples.pid!;
-      functions.addAll(samples.functions!);
+      functions.addAll(samples.functions!.map(_buildProfileFunction));
 
       // Build the initial id to function index mapping. This allows for us to
       // lookup a ProfileFunction in the global function list stored in this
@@ -77,7 +68,7 @@
       // TODO(bkonyi): investigate creating some form of stable ID for
       // Functions tied to closures.
       for (int i = 0; i < functions.length; ++i) {
-        idToFunctionIndex[getFunctionId(functions[i])] = i;
+        idToFunctionIndex[_getFunctionId(functions[i].function)] = i;
       }
 
       // Clear tick information as we'll need to recalculate these values later
@@ -94,14 +85,14 @@
 
       // Check to see if we've got a function object we've never seen before.
       for (int i = 0; i < newFunctions.length; ++i) {
-        final key = getFunctionId(newFunctions[i]);
+        final key = _getFunctionId(newFunctions[i]);
         if (!idToFunctionIndex.containsKey(key)) {
           idToFunctionIndex[key] = functions.length;
           // Keep track of the original index and the location of the function
           // in the master function list so we can update the function indicies
           // for each sample in this batch.
           indexMapping[i] = functions.length;
-          functions.add(newFunctions[i]);
+          functions.add(_buildProfileFunction(newFunctions[i]));
 
           // Reset tick state as we'll recalculate later.
           functions.last.inclusiveTicks = 0;
@@ -159,6 +150,28 @@
     return evicted;
   }
 
+  Future<void> populateFunctionDetails(
+      DartDevelopmentServiceImpl dds, String isolateId) async {
+    final cpuSamples = await dds.vmServiceClient.sendRequest('getCpuSamples', {
+      'isolateId': isolateId,
+      'timeOriginMicros': 0,
+      'timeExtentMicros': 0,
+    });
+    final fullFunctions = cpuSamples['functions'];
+    for (final func in fullFunctions) {
+      final profileFunc = ProfileFunction.parse(func)!;
+      final id = _getFunctionId(profileFunc.function!);
+      final index = idToFunctionIndex[id];
+      if (index == null) {
+        continue;
+      }
+      final result = functions[index];
+      result.kind = profileFunc.kind;
+      result.resolvedUrl = profileFunc.resolvedUrl;
+      result.function = profileFunc.function;
+    }
+  }
+
   Map<String, dynamic> toJson() {
     return {
       'type': 'CachedCpuSamples',
diff --git a/pkg/dds/lib/src/dap/adapters/dart.dart b/pkg/dds/lib/src/dap/adapters/dart.dart
index 67be4b5..523cadf 100644
--- a/pkg/dds/lib/src/dap/adapters/dart.dart
+++ b/pkg/dds/lib/src/dap/adapters/dart.dart
@@ -8,11 +8,11 @@
 
 import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
-import 'package:package_config/package_config.dart';
 import 'package:path/path.dart' as path;
 import 'package:vm_service/vm_service.dart' as vm;
 
 import '../../../dds.dart';
+import '../../rpc_error_codes.dart';
 import '../base_debug_adapter.dart';
 import '../exceptions.dart';
 import '../isolate_manager.dart';
@@ -49,6 +49,16 @@
 /// will work.
 const threadExceptionExpression = r'$_threadException';
 
+/// Typedef for handlers of VM Service stream events.
+typedef _StreamEventHandler<T> = FutureOr<void> Function(T data);
+
+/// A null result passed to `sendResponse` functions when there is no result.
+///
+/// Because the signature of `sendResponse` is generic, an argument must be
+/// provided even when the generic type is `void`. This value is used to make
+/// it clearer in calling code that the result is unused.
+const _noResult = null;
+
 /// Pattern for extracting useful error messages from an evaluation exception.
 final _evalErrorMessagePattern = RegExp('Error: (.*)');
 
@@ -139,6 +149,9 @@
   final String? name;
   final String? cwd;
 
+  /// Environment variables to pass to the launched process.
+  final Map<String, String>? env;
+
   /// Paths that should be considered the users local code.
   ///
   /// These paths will generally be all of the open folders in the users editor
@@ -189,6 +202,8 @@
     required this.restart,
     required this.name,
     required this.cwd,
+    // TODO(dantup): This can be made required after Flutter DAP is passing it.
+    this.env,
     required this.additionalProjectPaths,
     required this.debugSdkLibraries,
     required this.debugExternalPackageLibraries,
@@ -201,6 +216,7 @@
       : restart = obj['restart'],
         name = obj['name'] as String?,
         cwd = obj['cwd'] as String?,
+        env = obj['env'] as Map<String, String>?,
         additionalProjectPaths =
             (obj['additionalProjectPaths'] as List?)?.cast<String>(),
         debugSdkLibraries = obj['debugSdkLibraries'] as bool?,
@@ -216,6 +232,7 @@
         if (restart != null) 'restart': restart,
         if (name != null) 'name': name,
         if (cwd != null) 'cwd': cwd,
+        if (env != null) 'env': env,
         if (additionalProjectPaths != null)
           'additionalProjectPaths': additionalProjectPaths,
         if (debugSdkLibraries != null) 'debugSdkLibraries': debugSdkLibraries,
@@ -354,6 +371,17 @@
 
   late final sendLogsToClient = args.sendLogsToClient ?? false;
 
+  /// Whether or not the DAP is terminating.
+  ///
+  /// When set to `true`, some requests that return "Service Disappeared" errors
+  /// will be caught and dropped as these are expected if the process is
+  /// terminating.
+  ///
+  /// This flag may be set by incoming requests from the client
+  /// (terminateRequest/disconnectRequest) or when a process terminates, or the
+  /// VM Service disconnects.
+  bool isTerminating = false;
+
   DartDebugAdapter(
     ByteStreamServerChannel channel, {
     this.ipv6 = false,
@@ -531,16 +559,20 @@
     this.vmService = vmService;
 
     unawaited(vmService.onDone.then((_) => _handleVmServiceClosed()));
+
+    // Handlers must be wrapped to handle Service Disappeared errors if async
+    // code tries to call the VM Service after termination begins.
+    final wrap = _wrapHandlerWithErrorHandling;
     _subscriptions.addAll([
-      vmService.onIsolateEvent.listen(handleIsolateEvent),
-      vmService.onDebugEvent.listen(handleDebugEvent),
-      vmService.onLoggingEvent.listen(handleLoggingEvent),
-      vmService.onExtensionEvent.listen(handleExtensionEvent),
-      vmService.onServiceEvent.listen(handleServiceEvent),
+      vmService.onIsolateEvent.listen(wrap(handleIsolateEvent)),
+      vmService.onDebugEvent.listen(wrap(handleDebugEvent)),
+      vmService.onLoggingEvent.listen(wrap(handleLoggingEvent)),
+      vmService.onExtensionEvent.listen(wrap(handleExtensionEvent)),
+      vmService.onServiceEvent.listen(wrap(handleServiceEvent)),
       if (_subscribeToOutputStreams)
-        vmService.onStdoutEvent.listen(_handleStdoutEvent),
+        vmService.onStdoutEvent.listen(wrap(_handleStdoutEvent)),
       if (_subscribeToOutputStreams)
-        vmService.onStderrEvent.listen(_handleStderrEvent),
+        vmService.onStderrEvent.listen(wrap(_handleStderrEvent)),
     ]);
     await Future.wait([
       vmService.streamListen(vm.EventStreams.kIsolate),
@@ -558,8 +590,20 @@
     // Let the subclass do any existing setup once we have a connection.
     await debuggerConnected(vmInfo);
 
-    // Process any existing isolates that may have been created before the
-    // streams above were set up.
+    await _withErrorHandling(
+      () => _configureExistingIsolates(vmService, vmInfo, resumeIfStarting),
+    );
+
+    _debuggerInitializedCompleter.complete();
+  }
+
+  /// Process any existing isolates that may have been created before the
+  /// streams above were set up.
+  Future<void> _configureExistingIsolates(
+    vm.VmService vmService,
+    vm.VM vmInfo,
+    bool resumeIfStarting,
+  ) async {
     final existingIsolateRefs = vmInfo.isolates;
     final existingIsolates = existingIsolateRefs != null
         ? await Future.wait(existingIsolateRefs
@@ -596,8 +640,6 @@
         }
       }
     }));
-
-    _debuggerInitializedCompleter.complete();
   }
 
   /// Handles the clients "continue" ("resume") request for the thread in
@@ -632,26 +674,26 @@
   ) async {
     switch (request.command) {
 
-      /// Used by tests to validate available protocols (e.g. DDS). There may be
-      /// value in making this available to clients in future, but for now it's
-      /// internal.
+      // Used by tests to validate available protocols (e.g. DDS). There may be
+      // value in making this available to clients in future, but for now it's
+      // internal.
       case '_getSupportedProtocols':
         final protocols = await vmService?.getSupportedProtocols();
         sendResponse(protocols?.toJson());
         break;
 
-      /// Used to toggle debug settings such as whether SDK/Packages are
-      /// debuggable while the session is in progress.
+      // Used to toggle debug settings such as whether SDK/Packages are
+      // debuggable while the session is in progress.
       case 'updateDebugOptions':
         if (args != null) {
           await _updateDebugOptions(args.args);
         }
-        sendResponse(null);
+        sendResponse(_noResult);
         break;
 
-      /// Allows an editor to call a service/service extension that it was told
-      /// about via a custom 'dart.serviceRegistered' or
-      /// 'dart.serviceExtensionAdded' event.
+      // Allows an editor to call a service/service extension that it was told
+      // about via a custom 'dart.serviceRegistered' or
+      // 'dart.serviceExtensionAdded' event.
       case 'callService':
         final method = args?.args['method'] as String?;
         if (method == null) {
@@ -667,6 +709,15 @@
         sendResponse(response?.json);
         break;
 
+      // Used to reload sources for all isolates. This supports Hot Reload for
+      // Dart apps. Flutter's DAP handles this command itself (and sends it
+      // through the run daemon) as it needs to perform additional work to
+      // rebuild widgets afterwards.
+      case 'hotReload':
+        await _isolateManager.reloadSources();
+        sendResponse(_noResult);
+        break;
+
       default:
         await super.customRequest(request, args, sendResponse);
     }
@@ -695,6 +746,8 @@
     DisconnectArguments? args,
     void Function() sendResponse,
   ) async {
+    isTerminating = true;
+
     await disconnectImpl();
     await shutdown();
     sendResponse();
@@ -839,6 +892,7 @@
       return;
     }
 
+    isTerminating = true;
     _hasSentTerminatedEvent = true;
     // Always add a leading newline since the last written text might not have
     // had one.
@@ -901,12 +955,13 @@
   /// 'additionalProjectPaths' in the launch arguments. An editor should include
   /// the paths of all open workspace folders in 'additionalProjectPaths' to
   /// support this feature correctly.
-  bool isExternalPackageLibrary(Uri uri) {
+  Future<bool> isExternalPackageLibrary(ThreadInfo thread, Uri uri) async {
     if (!uri.isScheme('package')) {
       return false;
     }
-    final libraryPath = resolvePackageUri(uri);
-    if (libraryPath == null) {
+
+    final packagePath = await thread.resolveUriToPackageLibPath(uri);
+    if (packagePath == null) {
       return false;
     }
 
@@ -914,9 +969,10 @@
     // may have returned different casing (e.g. Windows drive letters). It's
     // almost certain a user wouldn't have a "local" package and an "external"
     // package with paths differing only be case.
-    final libraryPathLower = libraryPath.toLowerCase();
-    return !projectPaths.any((projectPath) =>
-        path.isWithin(projectPath.toLowerCase(), libraryPathLower));
+    final packagePathLower = packagePath.toLowerCase();
+    return !projectPaths
+        .map((projectPath) => projectPath.toLowerCase())
+        .any((projectPath) => path.isWithin(projectPath, packagePathLower));
   }
 
   /// Checks whether this library is from the SDK.
@@ -954,10 +1010,10 @@
   ///
   /// Initial values are provided in the launch arguments, but may be updated
   /// by the `updateDebugOptions` custom request.
-  bool libaryIsDebuggable(Uri uri) {
+  Future<bool> libraryIsDebuggable(ThreadInfo thread, Uri uri) async {
     if (isSdkLibrary(uri)) {
       return _isolateManager.debugSdkLibraries;
-    } else if (isExternalPackageLibrary(uri)) {
+    } else if (await isExternalPackageLibrary(thread, uri)) {
       return _isolateManager.debugExternalPackageLibraries;
     } else {
       return true;
@@ -976,12 +1032,6 @@
     sendResponse();
   }
 
-  /// Resolves a `package: URI` to the real underlying source path.
-  ///
-  /// Returns `null` if no mapping was possible, for example if the package is
-  /// not in the package mapping file.
-  String? resolvePackageUri(Uri uri) => _converter.resolvePackageUri(uri);
-
   /// restart is called by the client when the user invokes a restart (for
   /// example with the button on the debug toolbar).
   ///
@@ -1248,6 +1298,15 @@
           (frame) => frame.kind == vm.FrameKind.kAsyncSuspensionMarker,
         );
 
+        // Pre-resolve all URIs in batch so the call below does not trigger
+        // many requests to the server.
+        final allUris = frames
+            .map((frame) => frame.location?.script?.uri)
+            .whereNotNull()
+            .map(Uri.parse)
+            .toList();
+        await thread.resolveUrisToPathsBatch(allUris);
+
         Future<StackFrame> convert(int index, vm.Frame frame) async {
           return _converter.convertVmToDapStackFrame(
             thread,
@@ -1318,6 +1377,8 @@
     TerminateArguments? args,
     void Function() sendResponse,
   ) async {
+    isTerminating = true;
+
     await terminateImpl();
     await shutdown();
     sendResponse();
@@ -1346,14 +1407,12 @@
 
   /// Sets the package config file to use for `package: URI` resolution.
   ///
-  /// TODO(dantup): Remove this once
-  ///   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-  ///   necessary.
+  /// It is no longer necessary to call this method as the package config file
+  /// is no longer used. URI lookups are done via the VM Service.
+  @Deprecated('No longer necessary, URI lookups are done via VM Service')
   void usePackageConfigFile(File packageConfig) {
-    _converter.packageConfig = PackageConfig.parseString(
-      packageConfig.readAsStringSync(),
-      Uri.file(packageConfig.path),
-    );
+    // TODO(dantup): Remove this method after Flutter DA is updated not to use
+    // it.
   }
 
   /// [variablesRequest] is called by the client to request child variables for
@@ -1661,6 +1720,7 @@
   }
 
   Future<void> _handleVmServiceClosed() async {
+    isTerminating = true;
     if (terminateOnVmServiceClose) {
       handleSessionTerminate();
     }
@@ -1767,6 +1827,40 @@
       streamClosed: streamClosedCompleter.future,
     );
   }
+
+  /// Wraps a function with an error handler that handles errors that occur when
+  /// the VM Service/DDS shuts down.
+  ///
+  /// When the debug adapter is terminating, it's possible in-flight requests
+  /// triggered by handlers will fail with "Service Disappeared". This is
+  /// normal and such errors can be ignored, rather than allowed to pass
+  /// uncaught.
+  _StreamEventHandler<T> _wrapHandlerWithErrorHandling<T>(
+    _StreamEventHandler<T> handler,
+  ) {
+    return (data) => _withErrorHandling(() => handler(data));
+  }
+
+  /// Calls a function with an error handler that handles errors that occur when
+  /// the VM Service/DDS shuts down.
+  ///
+  /// When the debug adapter is terminating, it's possible in-flight requests
+  /// will fail with "Service Disappeared". This is normal and such errors can
+  /// be ignored, rather than allowed to pass uncaught.
+  FutureOr<T?> _withErrorHandling<T>(FutureOr<T> Function() func) async {
+    try {
+      return await func();
+    } on vm.RPCError catch (e) {
+      // If we're been asked to shut down while this request was occurring,
+      // it's normal to get kServiceDisappeared so we should handle this
+      // silently.
+      if (isTerminating && e.code == RpcErrorCodes.kServiceDisappeared) {
+        return null;
+      }
+
+      rethrow;
+    }
+  }
 }
 
 /// An implementation of [LaunchRequestArguments] that includes all fields used
@@ -1794,6 +1888,15 @@
   /// the VM or Flutter tool).
   final List<String>? toolArgs;
 
+  /// Arguments to be passed directly to the Dart VM that will run [program].
+  ///
+  /// Unlike [toolArgs] which always go after the complete tool, these args
+  /// always go directly after `dart`:
+  ///
+  ///   - dart {vmAdditionalArgs} {toolArgs}
+  ///   - dart {vmAdditionalArgs} run test:test {toolArgs}
+  final List<String>? vmAdditionalArgs;
+
   final int? vmServicePort;
 
   final bool? enableAsserts;
@@ -1810,17 +1913,39 @@
   /// simplest) way, but prevents the user from being able to type into `stdin`.
   final String? console;
 
+  /// An optional tool to run instead of "dart".
+  ///
+  /// In combination with [customToolReplacesArgs] allows invoking a custom
+  /// tool instead of "dart" to launch scripts/tests. The custom tool must be
+  /// completely compatible with the tool/command it is replacing.
+  ///
+  /// This field should be a full absolute path if the tool may not be available
+  /// in `PATH`.
+  final String? customTool;
+
+  /// The number of arguments to delete from the beginning of the argument list
+  /// when invoking [customTool].
+  ///
+  /// For example, setting [customTool] to `dart_test` and
+  /// `customToolReplacesArgs` to `2` for a test run would invoke
+  /// `dart_test foo_test.dart` instead of `dart run test:test foo_test.dart`.
+  final int? customToolReplacesArgs;
+
   DartLaunchRequestArguments({
     this.noDebug,
     required this.program,
     this.args,
     this.vmServicePort,
     this.toolArgs,
+    this.vmAdditionalArgs,
     this.console,
     this.enableAsserts,
+    this.customTool,
+    this.customToolReplacesArgs,
     Object? restart,
     String? name,
     String? cwd,
+    Map<String, String>? env,
     List<String>? additionalProjectPaths,
     bool? debugSdkLibraries,
     bool? debugExternalPackageLibraries,
@@ -1831,6 +1956,7 @@
           restart: restart,
           name: name,
           cwd: cwd,
+          env: env,
           additionalProjectPaths: additionalProjectPaths,
           debugSdkLibraries: debugSdkLibraries,
           debugExternalPackageLibraries: debugExternalPackageLibraries,
@@ -1844,9 +1970,12 @@
         program = obj['program'] as String,
         args = (obj['args'] as List?)?.cast<String>(),
         toolArgs = (obj['toolArgs'] as List?)?.cast<String>(),
+        vmAdditionalArgs = (obj['vmAdditionalArgs'] as List?)?.cast<String>(),
         vmServicePort = obj['vmServicePort'] as int?,
         console = obj['console'] as String?,
         enableAsserts = obj['enableAsserts'] as bool?,
+        customTool = obj['customTool'] as String?,
+        customToolReplacesArgs = obj['customToolReplacesArgs'] as int?,
         super.fromMap(obj);
 
   @override
@@ -1856,9 +1985,13 @@
         'program': program,
         if (args != null) 'args': args,
         if (toolArgs != null) 'toolArgs': toolArgs,
+        if (vmAdditionalArgs != null) 'vmAdditionalArgs': vmAdditionalArgs,
         if (vmServicePort != null) 'vmServicePort': vmServicePort,
         if (console != null) 'console': console,
         if (enableAsserts != null) 'enableAsserts': enableAsserts,
+        if (customTool != null) 'customTool': customTool,
+        if (customToolReplacesArgs != null)
+          'customToolReplacesArgs': customToolReplacesArgs,
       };
 
   static DartLaunchRequestArguments fromJson(Map<String, Object?> obj) =>
diff --git a/pkg/dds/lib/src/dap/adapters/dart_cli_adapter.dart b/pkg/dds/lib/src/dap/adapters/dart_cli_adapter.dart
index 3dca392..46e28e3 100644
--- a/pkg/dds/lib/src/dap/adapters/dart_cli_adapter.dart
+++ b/pkg/dds/lib/src/dap/adapters/dart_cli_adapter.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
+import 'dart:math' as math;
 
 import 'package:path/path.dart' as path;
 import 'package:pedantic/pedantic.dart';
@@ -76,7 +77,6 @@
   /// breakpoints, and resume.
   Future<void> launchImpl() async {
     final args = this.args as DartLaunchRequestArguments;
-    final vmPath = Platform.resolvedExecutable;
     File? vmServiceInfoFile;
 
     final debug = !(args.noDebug ?? false);
@@ -87,6 +87,7 @@
     }
 
     final vmArgs = <String>[
+      ...?args.vmAdditionalArgs,
       if (debug) ...[
         '--enable-vm-service=${args.vmServicePort ?? 0}${ipv6 ? '/::1' : ''}',
         '--pause_isolates_on_start',
@@ -101,6 +102,14 @@
       // editor-spawned debug sessions.
       if (args.enableAsserts ?? true) '--enable-asserts',
     ];
+
+    // Handle customTool and deletion of any arguments for it.
+    final executable = args.customTool ?? Platform.resolvedExecutable;
+    final removeArgs = args.customToolReplacesArgs;
+    if (args.customTool != null && removeArgs != null) {
+      vmArgs.removeRange(0, math.min(removeArgs, vmArgs.length));
+    }
+
     final processArgs = [
       ...vmArgs,
       ...?args.toolArgs,
@@ -108,18 +117,6 @@
       ...?args.args,
     ];
 
-    // Find the package_config file for this script.
-    // TODO(dantup): Remove this once
-    //   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-    //   necessary.
-    var possibleRoot = path.isAbsolute(args.program)
-        ? path.dirname(args.program)
-        : path.dirname(path.normalize(path.join(args.cwd ?? '', args.program)));
-    final packageConfig = findPackageConfigFile(possibleRoot);
-    if (packageConfig != null) {
-      this.usePackageConfigFile(packageConfig);
-    }
-
     // If the client supports runInTerminal and args.console is set to either
     // 'terminal' or 'runInTerminal' we won't run the process ourselves, but
     // instead call the client to run it for us (this allows it to run in a
@@ -136,12 +133,22 @@
                 : null
         : null;
 
-    // TODO(dantup): Support passing env to both of these.
-
     if (terminalKind != null) {
-      await launchInEditorTerminal(debug, terminalKind, vmPath, processArgs);
+      await launchInEditorTerminal(
+        debug,
+        terminalKind,
+        executable,
+        processArgs,
+        workingDirectory: args.cwd,
+        env: args.env,
+      );
     } else {
-      await launchAsProcess(vmPath, processArgs);
+      await launchAsProcess(
+        executable,
+        processArgs,
+        workingDirectory: args.cwd,
+        env: args.env,
+      );
     }
 
     // Delay responding until the debugger is connected.
@@ -166,18 +173,6 @@
       return;
     }
 
-    // Find the package_config file for this script.
-    // TODO(dantup): Remove this once
-    //   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-    //   necessary.
-    final cwd = args.cwd;
-    if (cwd != null) {
-      final packageConfig = findPackageConfigFile(cwd);
-      if (packageConfig != null) {
-        this.usePackageConfigFile(packageConfig);
-      }
-    }
-
     final uri = vmServiceUri != null
         ? Uri.parse(vmServiceUri)
         : await waitForVmServiceInfoFile(logger, File(vmServiceInfoFile!));
@@ -190,11 +185,13 @@
   Future<void> launchInEditorTerminal(
     bool debug,
     String terminalKind,
-    String vmPath,
-    List<String> processArgs,
-  ) async {
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
     final args = this.args as DartLaunchRequestArguments;
-    logger?.call('Spawning $vmPath with $processArgs in ${args.cwd}'
+    logger?.call('Spawning $executable with $processArgs in $workingDirectory'
         ' via client ${terminalKind} terminal');
 
     // runInTerminal is a DAP request that goes from server-to-client that
@@ -203,8 +200,9 @@
     // for debugging will rely on the process writing the service-info file that
     // we can detect with the normal watching code.
     final requestArgs = RunInTerminalRequestArguments(
-      args: [vmPath, ...processArgs],
-      cwd: args.cwd ?? path.dirname(args.program),
+      args: [executable, ...processArgs],
+      cwd: workingDirectory ?? path.dirname(args.program),
+      env: env,
       kind: terminalKind,
       title: args.name ?? 'Dart',
     );
@@ -234,12 +232,18 @@
   ///
   /// Output to `stdout`/`stderr` will be sent to the editor using
   /// [OutputEvent]s.
-  Future<void> launchAsProcess(String vmPath, List<String> processArgs) async {
-    logger?.call('Spawning $vmPath with $processArgs in ${args.cwd}');
+  Future<void> launchAsProcess(
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    logger?.call('Spawning $executable with $processArgs in $workingDirectory');
     final process = await Process.start(
-      vmPath,
+      executable,
       processArgs,
-      workingDirectory: args.cwd,
+      workingDirectory: workingDirectory,
+      environment: env,
     );
     _process = process;
     pidsToTerminate.add(process.pid);
diff --git a/pkg/dds/lib/src/dap/adapters/dart_test_adapter.dart b/pkg/dds/lib/src/dap/adapters/dart_test_adapter.dart
index 9e517da..0f67af4 100644
--- a/pkg/dds/lib/src/dap/adapters/dart_test_adapter.dart
+++ b/pkg/dds/lib/src/dap/adapters/dart_test_adapter.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
+import 'dart:math' as math;
 
-import 'package:path/path.dart' as path;
 import 'package:pedantic/pedantic.dart';
 import 'package:vm_service/vm_service.dart' as vm;
 
@@ -73,7 +73,6 @@
   /// breakpoints, and resume.
   Future<void> launchImpl() async {
     final args = this.args as DartLaunchRequestArguments;
-    final vmPath = Platform.resolvedExecutable;
     File? vmServiceInfoFile;
 
     final debug = !(args.noDebug ?? false);
@@ -84,6 +83,7 @@
     }
 
     final vmArgs = <String>[
+      ...?args.vmAdditionalArgs,
       if (debug) ...[
         '--enable-vm-service=${args.vmServicePort ?? 0}${ipv6 ? '/::1' : ''}',
         '--pause_isolates_on_start',
@@ -111,6 +111,14 @@
       '-r',
       'json',
     ];
+
+    // Handle customTool and deletion of any arguments for it.
+    final executable = args.customTool ?? Platform.resolvedExecutable;
+    final removeArgs = args.customToolReplacesArgs;
+    if (args.customTool != null && removeArgs != null) {
+      vmArgs.removeRange(0, math.min(removeArgs, vmArgs.length));
+    }
+
     final processArgs = [
       ...vmArgs,
       ...?args.toolArgs,
@@ -118,25 +126,27 @@
       ...?args.args,
     ];
 
-    // Find the package_config file for this script.
-    // TODO(dantup): Remove this once
-    //   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-    //   necessary.
-    var possibleRoot = path.isAbsolute(args.program)
-        ? path.dirname(args.program)
-        : path.dirname(path.normalize(path.join(args.cwd ?? '', args.program)));
-    final packageConfig = findPackageConfigFile(possibleRoot);
-    if (packageConfig != null) {
-      this.usePackageConfigFile(packageConfig);
-    }
-
-    // TODO(dantup): Support passing env to both of these.
-
-    logger?.call('Spawning $vmPath with $processArgs in ${args.cwd}');
-    final process = await Process.start(
-      vmPath,
+    await launchAsProcess(
+      executable,
       processArgs,
       workingDirectory: args.cwd,
+      env: args.env,
+    );
+  }
+
+  /// Launches the test script as a process controlled by the debug adapter.
+  Future<void> launchAsProcess(
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    logger?.call('Spawning $executable with $processArgs in $workingDirectory');
+    final process = await Process.start(
+      executable,
+      processArgs,
+      workingDirectory: workingDirectory,
+      environment: env,
     );
     _process = process;
     pidsToTerminate.add(process.pid);
diff --git a/pkg/dds/lib/src/dap/adapters/mixins.dart b/pkg/dds/lib/src/dap/adapters/mixins.dart
index 3b9991a..53de6fc 100644
--- a/pkg/dds/lib/src/dap/adapters/mixins.dart
+++ b/pkg/dds/lib/src/dap/adapters/mixins.dart
@@ -17,32 +17,13 @@
 mixin PackageConfigUtils {
   /// Find the `package_config.json` file for the program being launched.
   ///
-  /// TODO(dantup): Remove this once
-  ///   https://github.com/dart-lang/sdk/issues/45530 is done as it will not be
-  ///   necessary.
+  /// It is no longer necessary to call this method as the package config file
+  /// is no longer used. URI lookups are done via the VM Service.
+  @Deprecated('No longer necessary, URI lookups are done via VM Service')
   File? findPackageConfigFile(String possibleRoot) {
-    File? packageConfig;
-    while (true) {
-      packageConfig =
-          File(path.join(possibleRoot, '.dart_tool', 'package_config.json'));
-
-      // If this packageconfig exists, use it.
-      if (packageConfig.existsSync()) {
-        break;
-      }
-
-      final parent = path.dirname(possibleRoot);
-
-      // If we can't go up anymore, the search failed.
-      if (parent == possibleRoot) {
-        packageConfig = null;
-        break;
-      }
-
-      possibleRoot = parent;
-    }
-
-    return packageConfig;
+    // TODO(dantup): Remove this method after Flutter DA is updated not to use
+    // it.
+    return null;
   }
 }
 
@@ -179,7 +160,7 @@
     final completer = Completer<Uri>();
     late final StreamSubscription<FileSystemEvent> vmServiceInfoFileWatcher;
 
-    Uri? tryParseServiceInfoFile(FileSystemEvent event) {
+    void tryParseServiceInfoFile(FileSystemEvent event) {
       final uri = _readVmServiceInfoFile(logger, vmServiceInfoFile);
       if (uri != null && !completer.isCompleted) {
         vmServiceInfoFileWatcher.cancel();
@@ -219,6 +200,7 @@
       // It's possible we tried to read the file before it was completely
       // written so ignore and try again on the next event.
       logger?.call('Ignoring error parsing vm-service-info file: $e');
+      return null;
     }
   }
 }
diff --git a/pkg/dds/lib/src/dap/base_debug_adapter.dart b/pkg/dds/lib/src/dap/base_debug_adapter.dart
index 2d82bbd..215a975 100644
--- a/pkg/dds/lib/src/dap/base_debug_adapter.dart
+++ b/pkg/dds/lib/src/dap/base_debug_adapter.dart
@@ -376,7 +376,7 @@
   /// passes an unused arg so that `Function()` can be passed to a function
   /// accepting `Function<T>(T x)` where `T` happens to be `void`.
   ///
-  /// This allows handlers to simple call sendResponse() where they have no
+  /// This allows handlers to simply call sendResponse() where they have no
   /// return value but need to send a valid response.
   _VoidArgRequestHandler<TArg> _withVoidResponse<TArg>(
     _VoidNoArgRequestHandler<TArg> handler,
diff --git a/pkg/dds/lib/src/dap/isolate_manager.dart b/pkg/dds/lib/src/dap/isolate_manager.dart
index fd2d342..9fb0adf 100644
--- a/pkg/dds/lib/src/dap/isolate_manager.dart
+++ b/pkg/dds/lib/src/dap/isolate_manager.dart
@@ -4,8 +4,10 @@
 
 import 'dart:async';
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:collection/collection.dart';
+import 'package:path/path.dart' as path;
 import 'package:vm_service/vm_service.dart' as vm;
 
 import 'adapters/dart.dart';
@@ -53,6 +55,9 @@
   /// [debugExternalPackageLibraries] in one step.
   bool debugExternalPackageLibraries = true;
 
+  /// The root of the Dart SDK containing the VM running the debug adapter.
+  late final String sdkRoot;
+
   /// Tracks breakpoints last provided by the client so they can be sent to new
   /// isolates that appear after initial breakpoints were sent.
   final Map<String, List<SourceBreakpoint>> _clientBreakpointsByUri = {};
@@ -93,7 +98,10 @@
   /// Any leading character matched in place of the dollar is in the first capture.
   final _braceNotPrefixedByDollarOrBackslashPattern = RegExp(r'(^|[^\\\$]){');
 
-  IsolateManager(this._adapter);
+  IsolateManager(this._adapter) {
+    final vmPath = Platform.resolvedExecutable;
+    sdkRoot = path.dirname(path.dirname(vmPath));
+  }
 
   /// A list of all current active isolates.
   ///
@@ -110,7 +118,7 @@
     await Future.wait(_threadsByThreadId.values.map(
       // debuggable libraries is the only thing currently affected by these
       // changable options.
-      (isolate) => _sendLibraryDebuggables(isolate.isolate),
+      (thread) => _sendLibraryDebuggables(thread),
     ));
   }
 
@@ -136,10 +144,7 @@
     vm.Event event, {
     bool resumeIfStarting = true,
   }) async {
-    final isolateId = event.isolate?.id;
-    if (isolateId == null) {
-      return;
-    }
+    final isolateId = event.isolate?.id!;
 
     final eventKind = event.kind;
     if (eventKind == vm.EventKind.kIsolateStart ||
@@ -178,7 +183,7 @@
     final registrationCompleter =
         _isolateRegistrations.putIfAbsent(isolate.id!, () => Completer<void>());
 
-    final info = _threadsByIsolateId.putIfAbsent(
+    final thread = _threadsByIsolateId.putIfAbsent(
       isolate.id!,
       () {
         // The first time we see an isolate, start tracking it.
@@ -194,21 +199,25 @@
 
     // If it's just become runnable (IsolateRunnable), configure the isolate
     // by sending breakpoints etc.
-    if (eventKind == vm.EventKind.kIsolateRunnable && !info.runnable) {
-      info.runnable = true;
-      await _configureIsolate(isolate);
+    if (eventKind == vm.EventKind.kIsolateRunnable && !thread.runnable) {
+      thread.runnable = true;
+      await _configureIsolate(thread);
       registrationCompleter.complete();
     }
 
-    return info;
+    return thread;
+  }
+
+  /// Calls reloadSources for all isolates.
+  Future<void> reloadSources() async {
+    await Future.wait(_threadsByThreadId.values.map(
+      (isolate) => _reloadSources(isolate.isolate),
+    ));
   }
 
   Future<void> resumeIsolate(vm.IsolateRef isolateRef,
       [String? resumeType]) async {
-    final isolateId = isolateRef.id;
-    if (isolateId == null) {
-      return;
-    }
+    final isolateId = isolateRef.id!;
 
     final thread = _threadsByIsolateId[isolateId];
     if (thread == null) {
@@ -271,7 +280,7 @@
 
     // Send the breakpoints to all existing threads.
     await Future.wait(_threadsByThreadId.values
-        .map((isolate) => _sendBreakpoints(isolate.isolate, uri: uri)));
+        .map((thread) => _sendBreakpoints(thread, uri: uri)));
   }
 
   /// Records exception pause mode as one of 'None', 'Unhandled' or 'All'. All
@@ -281,7 +290,7 @@
 
     // Send to all existing threads.
     await Future.wait(_threadsByThreadId.values.map(
-      (isolate) => _sendExceptionPauseMode(isolate.isolate),
+      (thread) => _sendExceptionPauseMode(thread),
     ));
   }
 
@@ -319,12 +328,15 @@
 
   /// Configures a new isolate, setting it's exception-pause mode, which
   /// libraries are debuggable, and sending all breakpoints.
-  Future<void> _configureIsolate(vm.IsolateRef isolate) async {
+  Future<void> _configureIsolate(ThreadInfo thread) async {
+    // Libraries must be set as debuggable _before_ sending breakpoints, or
+    // they may fail for SDK sources.
     await Future.wait([
-      _sendLibraryDebuggables(isolate),
-      _sendExceptionPauseMode(isolate),
-      _sendBreakpoints(isolate),
+      _sendLibraryDebuggables(thread),
+      _sendExceptionPauseMode(thread),
     ], eagerError: true);
+
+    await _sendBreakpoints(thread);
   }
 
   /// Evaluates an expression, returning the result if it is a [vm.InstanceRef]
@@ -363,6 +375,7 @@
         'Debugger failed to evaluate breakpoint $type "$expression": $e\n',
       );
     }
+    return null;
   }
 
   void _handleExit(vm.Event event) {
@@ -413,7 +426,7 @@
     // For PausePostRequest we need to re-send all breakpoints; this happens
     // after a hot restart.
     if (eventKind == vm.EventKind.kPausePostRequest) {
-      await _configureIsolate(isolate);
+      await _configureIsolate(thread);
       if (resumeIfStarting) {
         await resumeThread(thread.threadId);
       }
@@ -492,6 +505,26 @@
     }
   }
 
+  /// Attempts to resolve [uris] to file:/// URIs via the VM Service.
+  ///
+  /// This method calls the VM service directly. Most requests to resolve URIs
+  /// should go through [ThreadInfo]'s resolveXxx methods which perform caching
+  /// of results.
+  Future<List<Uri?>?> _lookupResolvedPackageUris<T extends vm.Response>(
+    vm.IsolateRef isolate,
+    List<Uri> uris,
+  ) async {
+    final isolateId = isolate.id!;
+    final uriStrings = uris.map((uri) => uri.toString()).toList();
+    final res = await _adapter.vmService
+        ?.lookupResolvedPackageUris(isolateId, uriStrings);
+
+    return res?.uris
+        ?.cast<String?>()
+        .map((uri) => uri != null ? Uri.parse(uri) : null)
+        .toList();
+  }
+
   /// Interpolates and prints messages for any log points.
   ///
   /// Log Points are breakpoints with string messages attached. When the VM hits
@@ -527,19 +560,31 @@
     }
   }
 
+  /// Calls reloadSources for the given isolate.
+  Future<void> _reloadSources(vm.IsolateRef isolateRef) async {
+    final service = _adapter.vmService;
+    if (!debug || service == null) {
+      return;
+    }
+
+    final isolateId = isolateRef.id!;
+
+    await service.reloadSources(isolateId);
+  }
+
   /// Sets breakpoints for an individual isolate.
   ///
   /// If [uri] is provided, only breakpoints for that URI will be sent (used
   /// when breakpoints are modified for a single file in the editor). Otherwise
   /// breakpoints for all previously set URIs will be sent (used for
   /// newly-created isolates).
-  Future<void> _sendBreakpoints(vm.IsolateRef isolate, {String? uri}) async {
+  Future<void> _sendBreakpoints(ThreadInfo thread, {String? uri}) async {
     final service = _adapter.vmService;
     if (!debug || service == null) {
       return;
     }
 
-    final isolateId = isolate.id!;
+    final isolateId = thread.isolate.id!;
 
     // If we were passed a single URI, we should send breakpoints only for that
     // (this means the request came from the client), otherwise we should send
@@ -559,8 +604,14 @@
       final newBreakpoints = _clientBreakpointsByUri[uri] ?? const [];
       await Future.forEach<SourceBreakpoint>(newBreakpoints, (bp) async {
         try {
+          // Some file URIs (like SDK sources) need to be converted to
+          // appropriate internal URIs to be able to set breakpoints.
+          final vmUri = await thread.resolvePathToUri(
+            Uri.parse(uri).toFilePath(),
+          );
+
           final vmBp = await service.addBreakpointWithScriptUri(
-              isolateId, uri, bp.line,
+              isolateId, vmUri.toString(), bp.line,
               column: bp.column);
           existingBreakpointsForIsolateAndUri.add(vmBp);
           _clientBreakpointsByVmId[vmBp.id!] = bp;
@@ -575,37 +626,47 @@
   }
 
   /// Sets the exception pause mode for an individual isolate.
-  Future<void> _sendExceptionPauseMode(vm.IsolateRef isolate) async {
+  Future<void> _sendExceptionPauseMode(ThreadInfo thread) async {
     final service = _adapter.vmService;
     if (!debug || service == null) {
       return;
     }
 
-    await service.setExceptionPauseMode(isolate.id!, _exceptionPauseMode);
+    await service.setIsolatePauseMode(
+      thread.isolate.id!,
+      exceptionPauseMode: _exceptionPauseMode,
+    );
   }
 
   /// Calls setLibraryDebuggable for all libraries in the given isolate based
   /// on the debug settings.
-  Future<void> _sendLibraryDebuggables(vm.IsolateRef isolateRef) async {
+  Future<void> _sendLibraryDebuggables(ThreadInfo thread) async {
     final service = _adapter.vmService;
     if (!debug || service == null) {
       return;
     }
 
-    final isolateId = isolateRef.id;
-    if (isolateId == null) {
-      return;
-    }
+    final isolateId = thread.isolate.id!;
 
     final isolate = await service.getIsolate(isolateId);
     final libraries = isolate.libraries;
     if (libraries == null) {
       return;
     }
+
+    // Pre-resolve all URIs in batch so the call below does not trigger
+    // many requests to the server.
+    final allUris = libraries
+        .map((library) => library.uri)
+        .whereNotNull()
+        .map(Uri.parse)
+        .toList();
+    await thread.resolveUrisToPackageLibPathsBatch(allUris);
+
     await Future.wait(libraries.map((library) async {
       final libraryUri = library.uri;
       final isDebuggable = libraryUri != null
-          ? _adapter.libaryIsDebuggable(Uri.parse(libraryUri))
+          ? await _adapter.libraryIsDebuggable(thread, Uri.parse(libraryUri))
           : false;
       await service.setLibraryDebuggable(isolateId, library.id!, isDebuggable);
     }));
@@ -660,14 +721,23 @@
   /// breakpoint or exception that occur early on.
   bool hasBeenStarted = false;
 
-  // The most recent pauseEvent for this isolate.
+  /// The most recent pauseEvent for this isolate.
   vm.Event? pauseEvent;
 
-  // A cache of requests (Futures) to fetch scripts, so that multiple requests
-  // that require scripts (for example looking up locations for stack frames from
-  // tokenPos) can share the same response.
+  /// A cache of requests (Futures) to fetch scripts, so that multiple requests
+  /// that require scripts (for example looking up locations for stack frames from
+  /// tokenPos) can share the same response.
   final _scripts = <String, Future<vm.Script>>{};
 
+  /// A cache of requests (Futures) to resolve URIs to their local file paths.
+  ///
+  /// Used so that multiple requests that require them (for example looking up
+  /// locations for stack frames from tokenPos) can share the same response.
+  ///
+  /// Keys are URIs in string form.
+  /// Values are file paths (not file URIs!).
+  final _resolvedPaths = <String, Future<String?>>{};
+
   /// Whether this isolate has an in-flight resume request that has not yet
   /// been responded to.
   var hasPendingResume = false;
@@ -686,9 +756,207 @@
     return _scripts.putIfAbsent(script.id!, () => getObject<vm.Script>(script));
   }
 
+  /// Resolves a source file path into a URI for the VM.
+  ///
+  /// sdk-path/lib/core/print.dart -> dart:core/print.dart
+  ///
+  /// This is required so that when the user sets a breakpoint in an SDK source
+  /// (which they may have nagivated to via the Analysis Server) we generate a
+  /// vaid URI that the VM would create a breakpoint for.
+  Future<Uri?> resolvePathToUri(String filePath) async {
+    // We don't currently need to call lookupPackageUris because the VM can
+    // handle incoming file:/// URIs for packages, and also the org-dartlang-sdk
+    // URIs directly for SDK sources (we do not need to convert to 'dart:'),
+    // however this method is Future-returning in case this changes in future
+    // and we need to include a call to lookupPackageUris here.
+    return _convertPathToOrgDartlangSdk(filePath) ?? Uri.file(filePath);
+  }
+
+  /// Batch resolves source URIs from the VM to a file path for the package lib
+  /// folder.
+  ///
+  /// This method is more performant than repeatedly calling
+  /// [resolveUrisToPackageLibPath] because it resolves multiple URIs in a
+  /// single request to the VM.
+  ///
+  /// Results are cached and shared with [resolveUrisToPackageLibPath] (and
+  /// [resolveUriToPath]) so it's reasonable to call this method up-front and
+  /// then use [resolveUrisToPackageLibPath] (and [resolveUriToPath]) to read
+  /// the results later.
+  Future<List<String?>> resolveUrisToPackageLibPathsBatch(
+    List<Uri> uris,
+  ) async {
+    final results = await resolveUrisToPathsBatch(uris);
+    return results
+        .mapIndexed((i, filePath) => _trimPathToLibFolder(filePath, uris[i]))
+        .toList();
+  }
+
+  /// Batch resolves source URIs from the VM to a file path.
+  ///
+  /// This method is more performant than repeatedly calling [resolveUriToPath]
+  /// because it resolves multiple URIs in a single request to the VM.
+  ///
+  /// Results are cached and shared with [resolveUriToPath] so it's reasonable
+  /// to call this method up-front and then use [resolveUriToPath] to read
+  /// the results later.
+  Future<List<String?>> resolveUrisToPathsBatch(List<Uri> uris) async {
+    // First find the set of URIs we don't already have results for.
+    final requiredUris = uris
+        .where((uri) => !uri.isScheme('file'))
+        .where((uri) => !_resolvedPaths.containsKey(uri.toString()))
+        .toSet() // Take only distinct values.
+        .toList();
+
+    if (requiredUris.isNotEmpty) {
+      // Populate completers for each URI before we start the request so that
+      // concurrent calls to this method will not start their own requests.
+      final completers = Map<String, Completer<String?>>.fromEntries(
+        requiredUris.map((uri) => MapEntry('$uri', Completer<String?>())),
+      );
+      completers.forEach(
+        (uri, completer) => _resolvedPaths[uri] = completer.future,
+      );
+      final results =
+          await _manager._lookupResolvedPackageUris(isolate, requiredUris);
+      if (results == null) {
+        // If no result, all of the results are null.
+        completers.forEach((uri, completer) => completer.complete(null));
+      } else {
+        // Otherwise, complete each one by index with the corresponding value.
+        results.map(_convertUriToFilePath).forEachIndexed((i, result) {
+          final uri = requiredUris[i].toString();
+          completers[uri]!.complete(result);
+        });
+      }
+    }
+
+    // Finally, assemble a list of the values by using the cached futures and
+    // the original list. Any non-file URI is guaranteed to be in [_resolvedPaths]
+    // because they were either filtered out of [requiredUris] because they were
+    // already there, or we then populated completers for them above.
+    final futures = uris.map((uri) async {
+      return uri.isScheme('file')
+          ? uri.toFilePath()
+          : await _resolvedPaths[uri.toString()]!;
+    });
+    return Future.wait(futures);
+  }
+
+  /// Resolves a source URI to a file path for the lib folder of its package.
+  ///
+  /// package:foo/a/b/c/d.dart -> /code/packages/foo/lib
+  ///
+  /// This method is an optimisation over calling [resolveUriToPath] where only
+  /// the package root is required (for example when determining whether a
+  /// package is within the users workspace). This method allows results to be
+  /// cached per-package to avoid hitting the VM Service for each individual
+  /// library within a package.
+  Future<String?> resolveUriToPackageLibPath(Uri uri) async {
+    final result = await resolveUrisToPackageLibPathsBatch([uri]);
+    return result.first;
+  }
+
+  /// Resolves a source URI from the VM to a file path.
+  ///
+  /// dart:core/print.dart -> sdk-path/lib/core/print.dart
+  ///
+  /// This is required so that when the user stops (or navigates via a stack
+  /// frame) we open the same file on their local disk. If we downloaded the
+  /// source from the VM, they would end up seeing two copies of files (and they
+  /// would each have their own breakpoints) which can be confusing.
+  Future<String?> resolveUriToPath(Uri uri) async {
+    final result = await resolveUrisToPathsBatch([uri]);
+    return result.first;
+  }
+
   /// Stores some basic data indexed by an integer for use in "reference" fields
   /// that are round-tripped to the client.
   int storeData(Object data) => _manager.storeData(this, data);
+
+  /// Converts a URI in the form org-dartlang-sdk:///sdk/lib/collection/hash_set.dart
+  /// to a local file path based on the current SDK.
+  String? _convertOrgDartlangSdkToPath(Uri uri) {
+    // org-dartlang-sdk URIs can be in multiple forms:
+    //
+    //   - org-dartlang-sdk:///sdk/lib/collection/hash_set.dart
+    //   - org-dartlang-sdk:///runtime/lib/convert_patch.dart
+    //
+    // We currently only handle the sdk folder, as we don't know which runtime
+    // is being used (this code is shared) and do not want to map to the wrong
+    // sources.
+    if (uri.pathSegments.isNotEmpty && uri.pathSegments.first == 'sdk') {
+      // TODO(dantup): Do we need to worry about this content not matching
+      //   up with what's local (eg. for Flutter the VM running the app is
+      //   on another device to the VM running this DA).
+      final sdkRoot = _manager.sdkRoot;
+      return path.joinAll([sdkRoot, ...uri.pathSegments.skip(1)]);
+    }
+
+    return null;
+  }
+
+  /// Converts a file path inside the current SDK root into a URI in the form
+  /// org-dartlang-sdk:///sdk/lib/collection/hash_set.dart.
+  Uri? _convertPathToOrgDartlangSdk(String input) {
+    final sdkRoot = _manager.sdkRoot;
+    if (path.isWithin(sdkRoot, input)) {
+      final relative = path.relative(input, from: sdkRoot);
+      return Uri(
+        scheme: 'org-dartlang-sdk',
+        host: '',
+        pathSegments: ['sdk', ...path.split(relative)],
+      );
+    }
+
+    return null;
+  }
+
+  /// Converts a URI to a file path.
+  ///
+  /// Supports file:// URIs and org-dartlang-sdk:// URIs.
+  String? _convertUriToFilePath(Uri? input) {
+    if (input == null) {
+      return null;
+    } else if (input.isScheme('file')) {
+      return input.toFilePath();
+    } else if (input.isScheme('org-dartlang-sdk')) {
+      return _convertOrgDartlangSdkToPath(input);
+    } else {
+      return null;
+    }
+  }
+
+  /// Helper to remove a libraries path from the a file path so it points at the
+  /// lib folder.
+  ///
+  /// [uri] should be the equivalent package: URI and is used to know how many
+  /// segments to remove from the file path to get to the lib folder.
+  String? _trimPathToLibFolder(String? filePath, Uri uri) {
+    if (filePath == null) {
+      return null;
+    }
+
+    final fileUri = Uri.file(filePath);
+
+    // Track how many segments from the path are from the lib folder to the
+    // library that will need to be removed later.
+    final libraryPathSegments = uri.pathSegments.length - 1;
+
+    // It should never be the case that the returned value doesn't have at
+    // least as many segments as the path of the URI.
+    assert(fileUri.pathSegments.length > libraryPathSegments);
+    if (fileUri.pathSegments.length <= libraryPathSegments) {
+      return filePath;
+    }
+
+    // Strip off the correct number of segments to the resulting path points
+    // to the root of the package:/ URI.
+    final keepSegments = fileUri.pathSegments.length - libraryPathSegments;
+    return fileUri
+        .replace(pathSegments: fileUri.pathSegments.sublist(0, keepSegments))
+        .toFilePath();
+  }
 }
 
 class _StoredData {
diff --git a/pkg/dds/lib/src/dap/protocol_converter.dart b/pkg/dds/lib/src/dap/protocol_converter.dart
index a3e836e..0bedd50 100644
--- a/pkg/dds/lib/src/dap/protocol_converter.dart
+++ b/pkg/dds/lib/src/dap/protocol_converter.dart
@@ -6,7 +6,6 @@
 import 'dart:io';
 
 import 'package:collection/collection.dart';
-import 'package:package_config/package_config_types.dart';
 import 'package:path/path.dart' as path;
 import 'package:vm_service/vm_service.dart' as vm;
 
@@ -26,11 +25,6 @@
   /// the debug session.
   final DartDebugAdapter _adapter;
 
-  /// Temporary PackageConfig used for resolving package: URIs.
-  /// TODO(dantup): Replace this implementation with one that calls the VM
-  ///   Service once https://github.com/dart-lang/sdk/issues/45530 is done.
-  PackageConfig packageConfig = PackageConfig.empty;
-
   ProtocolConverter(this._adapter);
 
   /// Converts an absolute path to one relative to the cwd used to launch the
@@ -388,13 +382,15 @@
     final tokenPos = location.tokenPos;
     final scriptRefUri = scriptRef?.uri;
     final uri = scriptRefUri != null ? Uri.parse(scriptRefUri) : null;
+    final uriIsDart = uri?.isScheme('dart') ?? false;
     final uriIsPackage = uri?.isScheme('package') ?? false;
-    final sourcePath = uri != null ? await convertVmUriToSourcePath(uri) : null;
+    final sourcePath = uri != null ? await thread.resolveUriToPath(uri) : null;
     var canShowSource = sourcePath != null && File(sourcePath).existsSync();
 
     // Download the source if from a "dart:" uri.
     int? sourceReference;
-    if (uri != null &&
+    if (!canShowSource &&
+        uri != null &&
         (uri.isScheme('dart') || uri.isScheme('org-dartlang-app')) &&
         scriptRef != null) {
       sourceReference = thread.storeData(scriptRef);
@@ -416,17 +412,18 @@
     // SDK and debugSdkLibraries=false) then we should also mark it as
     // deemphasized so that the editor can jump up the stack to the first frame
     // of debuggable code.
-    final isDebuggable = uri != null && _adapter.libaryIsDebuggable(uri);
+    final isDebuggable =
+        uri != null && await _adapter.libraryIsDebuggable(thread, uri);
     final presentationHint = isDebuggable ? null : 'deemphasize';
     final origin = uri != null && _adapter.isSdkLibrary(uri)
         ? 'from the SDK'
-        : uri != null && _adapter.isExternalPackageLibrary(uri)
+        : uri != null && await _adapter.isExternalPackageLibrary(thread, uri)
             ? 'from external packages'
             : null;
 
     final source = canShowSource
         ? dap.Source(
-            name: uriIsPackage
+            name: uriIsPackage || uriIsDart
                 ? uri!.toString()
                 : sourcePath != null
                     ? convertToRelativePath(sourcePath)
@@ -455,22 +452,6 @@
     );
   }
 
-  /// Converts the source URI from the VM to a file path.
-  ///
-  /// This is required so that when the user stops (or navigates via a stack
-  /// frame) we open the same file on their local disk. If we downloaded the
-  /// source from the VM, they would end up seeing two copies of files (and they
-  /// would each have their own breakpoints) which can be confusing.
-  Future<String?> convertVmUriToSourcePath(Uri uri) async {
-    if (uri.isScheme('file')) {
-      return uri.toFilePath();
-    } else if (uri.isScheme('package')) {
-      return resolvePackageUri(uri);
-    } else {
-      return null;
-    }
-  }
-
   /// Whether [kind] is a simple kind, and does not need to be mapped to a variable.
   bool isSimpleKind(String? kind) {
     return kind == 'String' ||
@@ -482,19 +463,6 @@
         kind == 'Closure';
   }
 
-  /// Resolves a `package: URI` to the real underlying source path.
-  ///
-  /// Returns `null` if no mapping was possible, for example if the package is
-  /// not in the package mapping file.
-  String? resolvePackageUri(Uri uri) {
-    // TODO(dantup): Replace this implementation with one that calls the VM
-    //   Service once https://github.com/dart-lang/sdk/issues/45530 is done.
-    // This implementation makes assumptions about the package file being used
-    // that might not be correct (for example if the user uses the --packages
-    // flag).
-    return packageConfig.resolve(uri)?.toFilePath();
-  }
-
   /// Invokes the toString() method on a [vm.InstanceRef] and converts the
   /// response to a user-friendly display string.
   ///
diff --git a/pkg/dds/lib/src/dap/protocol_stream_transformers.dart b/pkg/dds/lib/src/dap/protocol_stream_transformers.dart
index 424fa84..f166e55 100644
--- a/pkg/dds/lib/src/dap/protocol_stream_transformers.dart
+++ b/pkg/dds/lib/src/dap/protocol_stream_transformers.dart
@@ -87,8 +87,14 @@
 
   /// Decodes [buffer] into a String and returns the 'Content-Length' header value.
   static ProtocolHeaders _parseHeaders(List<int> buffer) {
-    // Headers are specified as always ASCII in LSP.
-    final asString = ascii.decode(buffer);
+    final String asString;
+    try {
+      // Headers are specified as always ASCII in LSP.
+      asString = ascii.decode(buffer);
+    } on FormatException {
+      throw FormatException('Unable to decode headers with ascii. '
+          'The stream has utf8 content:\n${utf8.decode(buffer)}');
+    }
     final headers = asString.split('\r\n');
     final lengthHeader =
         headers.firstWhere((h) => h.startsWith('Content-Length'));
diff --git a/pkg/dds/lib/src/isolate_manager.dart b/pkg/dds/lib/src/isolate_manager.dart
index 7522183..93c2af4 100644
--- a/pkg/dds/lib/src/isolate_manager.dart
+++ b/pkg/dds/lib/src/isolate_manager.dart
@@ -110,21 +110,19 @@
   /// Should always be called after an isolate is resumed.
   void clearResumeApprovals() => _resumeApprovalsByName.clear();
 
-  Map<String, dynamic> getCachedCpuSamples(String userTag) {
+  Future<Map<String, dynamic>> getCachedCpuSamples(String userTag) async {
     final repo = cpuSamplesManager.cpuSamplesCaches[userTag];
     if (repo == null) {
       throw json_rpc.RpcException.invalidParams(
         'CPU sample caching is not enabled for tag: "$userTag"',
       );
     }
+    await repo.populateFunctionDetails(isolateManager.dds, id);
     return repo.toJson();
   }
 
   void handleEvent(Event event) {
     switch (event.kind) {
-      case EventKind.kUserTagChanged:
-        cpuSamplesManager.handleUserTagEvent(event);
-        return;
       case EventKind.kCpuSamples:
         cpuSamplesManager.handleCpuSamplesEvent(event);
         return;
@@ -238,6 +236,14 @@
             isolateStarted(id, name);
           }
         }
+        if (dds.cachedUserTags.isNotEmpty) {
+          await dds.vmServiceClient.sendRequest(
+            'streamCpuSamplesWithUserTag',
+            {
+              'userTags': dds.cachedUserTags,
+            },
+          );
+        }
       },
     );
     _initialized = true;
@@ -283,14 +289,15 @@
     );
   }
 
-  Map<String, dynamic> getCachedCpuSamples(json_rpc.Parameters parameters) {
+  Future<Map<String, dynamic>> getCachedCpuSamples(
+      json_rpc.Parameters parameters) async {
     final isolateId = parameters['isolateId'].asString;
     if (!isolates.containsKey(isolateId)) {
       return RPCResponses.collectedSentinel;
     }
     final isolate = isolates[isolateId]!;
     final userTag = parameters['userTag'].asString;
-    return isolate.getCachedCpuSamples(userTag);
+    return await isolate.getCachedCpuSamples(userTag);
   }
 
   /// Forwards a `resume` request to the VM service.
diff --git a/pkg/dds/lib/src/stream_manager.dart b/pkg/dds/lib/src/stream_manager.dart
index 46e22cf..ee0bc49 100644
--- a/pkg/dds/lib/src/stream_manager.dart
+++ b/pkg/dds/lib/src/stream_manager.dart
@@ -39,12 +39,36 @@
         if (isBinaryData) {
           listener.connection.sink.add(data);
         } else {
-          listener.sendNotification('streamNotify', data);
+          Map<String, dynamic> processed = data;
+          if (streamId == kProfilerStream) {
+            processed = _processProfilerEvents(listener, data);
+          }
+          listener.sendNotification('streamNotify', processed);
         }
       }
     }
   }
 
+  static Map<String, dynamic> _processProfilerEvents(
+    DartDevelopmentServiceClient client,
+    Map<String, dynamic> data,
+  ) {
+    final event = Event.parse(data['event'])!;
+    if (event.kind != EventKind.kCpuSamples) {
+      return data;
+    }
+    final cpuSamplesEvent = event.cpuSamples!;
+    cpuSamplesEvent.samples = cpuSamplesEvent.samples!
+        .where(
+          (e) => client.profilerUserTagFilters.contains(e.userTag),
+        )
+        .toList();
+    cpuSamplesEvent.sampleCount = cpuSamplesEvent.samples!.length;
+    final updated = Map<String, dynamic>.from(data);
+    updated['event']['cpuSamples'] = cpuSamplesEvent.toJson();
+    return updated;
+  }
+
   static Map<String, dynamic> _buildStreamRegisteredEvent(
           String namespace, String service, String alias) =>
       {
@@ -148,7 +172,7 @@
     DartDevelopmentServiceClient? client,
     String stream,
   ) async {
-    await _mutex.runGuarded(
+    await _streamSubscriptionMutex.runGuarded(
       () async {
         assert(stream.isNotEmpty);
         if (!streamListeners.containsKey(stream)) {
@@ -218,7 +242,7 @@
     String stream, {
     bool cancelCoreStream = false,
   }) async {
-    await _mutex.runGuarded(
+    await _streamSubscriptionMutex.runGuarded(
       () async {
         assert(stream.isNotEmpty);
         final listeners = streamListeners[stream];
@@ -246,6 +270,28 @@
     );
   }
 
+  Future<void> updateUserTagSubscriptions(
+      [List<String> userTags = const []]) async {
+    await _profilerUserTagSubscriptionsMutex.runGuarded(() async {
+      _profilerUserTagSubscriptions.addAll(userTags);
+      for (final subscribedTag in _profilerUserTagSubscriptions.toList()) {
+        bool hasSubscriber = false;
+        for (final c in dds.clientManager.clients) {
+          if (c.profilerUserTagFilters.contains(subscribedTag)) {
+            hasSubscriber = true;
+            break;
+          }
+        }
+        if (!hasSubscriber) {
+          _profilerUserTagSubscriptions.remove(subscribedTag);
+        }
+      }
+      await dds.vmServiceClient.sendRequest('streamCpuSamplesWithUserTag', {
+        'userTags': _profilerUserTagSubscriptions.toList(),
+      });
+    });
+  }
+
   /// Cleanup stream subscriptions for `client` when it has disconnected.
   void clientDisconnect(DartDevelopmentServiceClient client) {
     for (final streamId in streamListeners.keys.toList()) {
@@ -256,6 +302,11 @@
         test: (e) => (e is json_rpc.RpcException) || (e is StateError),
       );
     }
+    updateUserTagSubscriptions().catchError(
+      (_) => null,
+      test: (e) => (e is json_rpc.RpcException) || (e is StateError),
+    );
+
     // Notify other service clients of service extensions that are being
     // unregistered.
     _sendServiceUnregisteredEvents(client);
@@ -312,5 +363,7 @@
 
   final DartDevelopmentServiceImpl dds;
   final streamListeners = <String, List<DartDevelopmentServiceClient>>{};
-  final _mutex = Mutex();
+  final _profilerUserTagSubscriptions = <String>{};
+  final _streamSubscriptionMutex = Mutex();
+  final _profilerUserTagSubscriptionsMutex = Mutex();
 }
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
index bafc2dc..bc3e130 100644
--- a/pkg/dds/pubspec.yaml
+++ b/pkg/dds/pubspec.yaml
@@ -3,7 +3,7 @@
   A library used to spawn the Dart Developer Service, used to communicate with
   a Dart VM Service instance.
 
-version: 2.1.4
+version: 2.1.6
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
 
@@ -16,7 +16,6 @@
   devtools_shared: ^2.3.0
   json_rpc_2: ^3.0.0
   meta: ^1.1.8
-  package_config: ^2.0.0
   path: ^1.8.0
   pedantic: ^1.7.0
   shelf: ^1.0.0
@@ -25,7 +24,7 @@
   shelf_web_socket: ^1.0.0
   sse: ^4.0.0
   stream_channel: ^2.0.0
-  vm_service: ^7.2.0
+  vm_service: ^7.5.0
   web_socket_channel: ^2.0.0
 
 dev_dependencies:
diff --git a/pkg/dds/test/common/test_helper.dart b/pkg/dds/test/common/test_helper.dart
index 9fc441b..a9473ea 100644
--- a/pkg/dds/test/common/test_helper.dart
+++ b/pkg/dds/test/common/test_helper.dart
@@ -13,6 +13,7 @@
 Future<Process> spawnDartProcess(
   String script, {
   bool pauseOnStart = true,
+  bool disableServiceAuthCodes = false,
 }) async {
   final executable = Platform.executable;
   final tmpDir = await Directory.systemTemp.createTemp('dart_service');
@@ -23,6 +24,7 @@
     '--disable-dart-dev',
     '--observe=0',
     if (pauseOnStart) '--pause-isolates-on-start',
+    if (disableServiceAuthCodes) '--disable-service-auth-codes',
     '--write-service-info=$serviceInfoUri',
     ...Platform.executableArguments,
     Platform.script.resolve(script).toString(),
diff --git a/pkg/dds/test/cpu_sample_streaming_test.dart b/pkg/dds/test/cpu_sample_streaming_test.dart
new file mode 100644
index 0000000..f1f224a
--- /dev/null
+++ b/pkg/dds/test/cpu_sample_streaming_test.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:dds/dds.dart';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+import 'package:vm_service/vm_service_io.dart';
+import 'common/test_helper.dart';
+
+void main() {
+  late Process process;
+  DartDevelopmentService? dds;
+
+  setUp(() async {
+    process = await spawnDartProcess(
+      'get_cached_cpu_samples_script.dart',
+      disableServiceAuthCodes: true,
+    );
+  });
+
+  tearDown(() async {
+    await dds?.shutdown();
+    process.kill();
+  });
+
+  void declareTest(bool withDds) {
+    test(
+      'Stream CPU samples for provided UserTag names with${withDds ? "" : "out"} DDS',
+      () async {
+        Uri serviceUri = remoteVmServiceUri;
+        if (withDds) {
+          dds = await DartDevelopmentService.startDartDevelopmentService(
+            remoteVmServiceUri,
+          );
+          serviceUri = dds!.wsUri!;
+          expect(dds!.isRunning, true);
+        } else {
+          serviceUri = serviceUri.replace(scheme: 'ws', path: 'ws');
+        }
+        final service = await vmServiceConnectUri(serviceUri.toString());
+        final otherService = await vmServiceConnectUri(serviceUri.toString());
+
+        IsolateRef isolate;
+        while (true) {
+          final vm = await service.getVM();
+          if (vm.isolates!.isNotEmpty) {
+            isolate = vm.isolates!.first;
+            try {
+              isolate = await service.getIsolate(isolate.id!);
+              if ((isolate as Isolate).runnable!) {
+                break;
+              }
+            } on SentinelException {
+              // ignore
+            }
+          }
+          await Future.delayed(const Duration(seconds: 1));
+        }
+        expect(isolate, isNotNull);
+
+        final expectedUserTags = <String>{};
+
+        Future<void> listenForSamples() {
+          late StreamSubscription sub;
+          final completer = Completer<void>();
+          int i = 0;
+          sub = service.onProfilerEvent.listen(
+            (event) async {
+              if (event.kind == EventKind.kCpuSamples &&
+                  event.isolate!.id! == isolate.id!) {
+                expect(expectedUserTags.isNotEmpty, true);
+                ++i;
+                if (i > 3) {
+                  if (!completer.isCompleted) {
+                    await sub.cancel();
+                    completer.complete();
+                  }
+                  return;
+                }
+                expect(event.cpuSamples, isNotNull);
+                final sampleCount = event.cpuSamples!.samples!
+                    .where((e) => expectedUserTags.contains(e.userTag))
+                    .length;
+                expect(sampleCount, event.cpuSamples!.samples!.length);
+              }
+            },
+          );
+          if (expectedUserTags.isEmpty) {
+            return Future.delayed(const Duration(seconds: 2)).then(
+              (_) async => await sub.cancel(),
+            );
+          }
+          return completer.future;
+        }
+
+        await service.streamListen(EventStreams.kProfiler);
+        Future<void> subscription = listenForSamples();
+        await service.resume(isolate.id!);
+        await subscription;
+        await service.pause(isolate.id!);
+
+        expectedUserTags.add('Testing');
+        await service.streamCpuSamplesWithUserTag(expectedUserTags.toList());
+        subscription = listenForSamples();
+        await service.resume(isolate.id!);
+        await subscription;
+        await service.pause(isolate.id!);
+
+        expectedUserTags.add('Baz');
+        await service.streamCpuSamplesWithUserTag(expectedUserTags.toList());
+        subscription = listenForSamples();
+        await service.resume(isolate.id!);
+        await subscription;
+        await service.pause(isolate.id!);
+
+        expectedUserTags.clear();
+        await service.streamCpuSamplesWithUserTag(expectedUserTags.toList());
+        subscription = listenForSamples();
+        await service.resume(isolate.id!);
+        await subscription;
+
+        await service.dispose();
+        await otherService.dispose();
+      },
+      timeout: Timeout.none,
+    );
+  }
+
+  declareTest(true);
+  declareTest(false);
+}
diff --git a/pkg/dds/test/dap/dart_cli_test.dart b/pkg/dds/test/dap/dart_cli_test.dart
new file mode 100644
index 0000000..d07dc37
--- /dev/null
+++ b/pkg/dds/test/dap/dart_cli_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:dds/dap.dart';
+import 'package:test/test.dart';
+
+import 'mocks.dart';
+
+main() {
+  group('dart cli adapter', () {
+    test('includes vmAdditionalArgs', () async {
+      final adapter = MockDartCliDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        vmAdditionalArgs: ['vm_arg'],
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(adapter.processArgs, containsAllInOrder(['vm_arg', 'foo.dart']));
+    });
+
+    test('includes toolArgs', () async {
+      final adapter = MockDartCliDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        toolArgs: ['tool_arg'],
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(adapter.processArgs, containsAllInOrder(['tool_arg', 'foo.dart']));
+    });
+
+    test('includes env', () async {
+      final adapter = MockDartCliDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        env: {
+          'ENV1': 'VAL1',
+          'ENV2': 'VAL2',
+        },
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(adapter.env!['ENV1'], 'VAL1');
+      expect(adapter.env!['ENV2'], 'VAL2');
+    });
+
+    group('includes customTool', () {
+      test('with no args replaced', () async {
+        final adapter = MockDartCliDebugAdapter();
+        final responseCompleter = Completer<void>();
+        final request = MockRequest();
+        final args = DartLaunchRequestArguments(
+          program: 'foo.dart',
+          customTool: '/custom/dart',
+          noDebug: true,
+          enableAsserts: true, // to check args are still passed through
+        );
+
+        await adapter.configurationDoneRequest(request, null, () {});
+        await adapter.launchRequest(request, args, responseCompleter.complete);
+        await responseCompleter.future;
+
+        expect(adapter.executable, equals('/custom/dart'));
+        // args should be in-tact
+        expect(adapter.processArgs, contains('--enable-asserts'));
+      });
+
+      test('with all args replaced', () async {
+        final adapter = MockDartCliDebugAdapter();
+        final responseCompleter = Completer<void>();
+        final request = MockRequest();
+        final args = DartLaunchRequestArguments(
+          program: 'foo.dart',
+          customTool: '/custom/dart',
+          customToolReplacesArgs: 9999, // replaces all built-in args
+          noDebug: true,
+          enableAsserts: true, // should not be in args
+          toolArgs: ['tool_args'], // should still be in args
+        );
+
+        await adapter.configurationDoneRequest(request, null, () {});
+        await adapter.launchRequest(request, args, responseCompleter.complete);
+        await responseCompleter.future;
+
+        expect(adapter.executable, equals('/custom/dart'));
+        // normal built-in args are replaced by customToolReplacesArgs, but
+        // user-provided toolArgs are not.
+        expect(adapter.processArgs, isNot(contains('--enable-asserts')));
+        expect(adapter.processArgs, contains('tool_args'));
+      });
+    });
+  });
+}
diff --git a/pkg/dds/test/dap/dart_test_test.dart b/pkg/dds/test/dap/dart_test_test.dart
new file mode 100644
index 0000000..defba7d
--- /dev/null
+++ b/pkg/dds/test/dap/dart_test_test.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:dds/dap.dart';
+import 'package:test/test.dart';
+
+import 'mocks.dart';
+
+main() {
+  group('dart test adapter', () {
+    test('includes vmAdditionalArgs before run test:test', () async {
+      final adapter = MockDartTestDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        vmAdditionalArgs: ['vm_arg'],
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(
+        adapter.processArgs,
+        containsAllInOrder(['vm_arg', 'run', 'test:test', 'foo.dart']),
+      );
+    });
+
+    test('includes toolArgs after run test:test', () async {
+      final adapter = MockDartTestDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        toolArgs: ['tool_arg'],
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(
+        adapter.processArgs,
+        containsAllInOrder(['run', 'test:test', 'tool_arg', 'foo.dart']),
+      );
+    });
+
+    test('includes env', () async {
+      final adapter = MockDartTestDebugAdapter();
+      final responseCompleter = Completer<void>();
+      final request = MockRequest();
+      final args = DartLaunchRequestArguments(
+        program: 'foo.dart',
+        env: {
+          'ENV1': 'VAL1',
+          'ENV2': 'VAL2',
+        },
+        noDebug: true,
+      );
+
+      await adapter.configurationDoneRequest(request, null, () {});
+      await adapter.launchRequest(request, args, responseCompleter.complete);
+      await responseCompleter.future;
+
+      expect(adapter.executable, equals(Platform.resolvedExecutable));
+      expect(adapter.env!['ENV1'], 'VAL1');
+      expect(adapter.env!['ENV2'], 'VAL2');
+    });
+
+    group('includes customTool', () {
+      test('with no args replaced', () async {
+        final adapter = MockDartTestDebugAdapter();
+        final responseCompleter = Completer<void>();
+        final request = MockRequest();
+        final args = DartLaunchRequestArguments(
+          program: 'foo.dart',
+          customTool: '/custom/dart',
+          noDebug: true,
+        );
+
+        await adapter.configurationDoneRequest(request, null, () {});
+        await adapter.launchRequest(request, args, responseCompleter.complete);
+        await responseCompleter.future;
+
+        expect(adapter.executable, equals('/custom/dart'));
+        // args should be in-tact
+        expect(adapter.processArgs, containsAllInOrder(['run', 'test:test']));
+      });
+
+      test('with all args replaced', () async {
+        final adapter = MockDartTestDebugAdapter();
+        final responseCompleter = Completer<void>();
+        final request = MockRequest();
+        final args = DartLaunchRequestArguments(
+          program: 'foo.dart',
+          customTool: '/custom/dart',
+          customToolReplacesArgs: 9999, // replaces all built-in args
+          noDebug: true,
+          toolArgs: ['tool_args'], // should still be in args
+        );
+
+        await adapter.configurationDoneRequest(request, null, () {});
+        await adapter.launchRequest(request, args, responseCompleter.complete);
+        await responseCompleter.future;
+
+        expect(adapter.executable, equals('/custom/dart'));
+        // normal built-in args are replaced by customToolReplacesArgs, but
+        // user-provided toolArgs are not.
+        expect(
+          adapter.processArgs,
+          isNot(containsAllInOrder(['run', 'test:test'])),
+        );
+        expect(adapter.processArgs, contains('tool_args'));
+      });
+    });
+  });
+}
diff --git a/pkg/dds/test/dap/integration/debug_breakpoints_test.dart b/pkg/dds/test/dap/integration/debug_breakpoints_test.dart
index 8aee55c..03475cb 100644
--- a/pkg/dds/test/dap/integration/debug_breakpoints_test.dart
+++ b/pkg/dds/test/dap/integration/debug_breakpoints_test.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 'dart:io';
+
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import 'test_client.dart';
@@ -24,6 +27,18 @@
       await client.hitBreakpoint(testFile, breakpointLine);
     });
 
+    test('stops at a line breakpoint in the SDK set via local sources',
+        () async {
+      final client = dap.client;
+      final testFile = dap.createTestFile(simpleBreakpointProgram);
+
+      // Add the breakpoint to the first line inside the SDK's print function.
+      final sdkFile = File(path.join(sdkRoot, 'lib', 'core', 'print.dart'));
+      final breakpointLine = lineWith(sdkFile, 'print(Object? object) {') + 1;
+
+      await client.hitBreakpoint(sdkFile, breakpointLine, entryFile: testFile);
+    });
+
     test('stops at a line breakpoint and can be resumed', () async {
       final client = dap.client;
       final testFile = dap.createTestFile(simpleBreakpointProgram);
diff --git a/pkg/dds/test/dap/integration/debug_test.dart b/pkg/dds/test/dap/integration/debug_test.dart
index 6e7565b..6655b58 100644
--- a/pkg/dds/test/dap/integration/debug_test.dart
+++ b/pkg/dds/test/dap/integration/debug_test.dart
@@ -2,9 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'dart:io';
 
 import 'package:dds/src/dap/protocol_generated.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import 'test_client.dart';
@@ -158,6 +160,87 @@
       // Source code should contain the implementation/signature of print().
       final source = await client.getValidSource(topFrame.source!);
       expect(source.content, contains('void print(Object? object) {'));
+      // Skipped because this test is not currently valid as source for print
+      // is mapped to local sources.
+    }, skip: true);
+
+    test('can map SDK source code to a local path', () async {
+      final client = dap.client;
+      final testFile = dap.createTestFile(simpleBreakpointProgram);
+      final breakpointLine = lineWith(testFile, breakpointMarker);
+
+      // Hit the initial breakpoint.
+      final stop = await dap.client.hitBreakpoint(
+        testFile,
+        breakpointLine,
+        launch: () => client.launch(
+          testFile.path,
+          debugSdkLibraries: true,
+        ),
+      );
+
+      // Step in to go into print.
+      final responses = await Future.wait([
+        client.expectStop('step', sourceName: 'dart:core/print.dart'),
+        client.stepIn(stop.threadId!),
+      ], eagerError: true);
+      final stopResponse = responses.first as StoppedEventBody;
+
+      // Fetch the top stack frame (which should be inside print).
+      final stack = await client.getValidStack(
+        stopResponse.threadId!,
+        startFrame: 0,
+        numFrames: 1,
+      );
+      final topFrame = stack.stackFrames.first;
+
+      // SDK sources that have been mapped have no sourceReference but a path.
+      expect(
+        topFrame.source!.path,
+        equals(path.join(sdkRoot, 'lib', 'core', 'print.dart')),
+      );
+      expect(topFrame.source!.sourceReference, isNull);
+    });
+
+    test('can shutdown during startup', () async {
+      final testFile = dap.createTestFile(simpleArgPrintingProgram);
+
+      // Terminate the app immediately upon recieving the first Thread event.
+      // The DAP is also responding to this event to configure the isolate (eg.
+      // set breakpoints and exception pause behaviour) and will cause it to
+      // receive "Service has disappeared" responses if these are in-flight as
+      // the process terminates. These should not go unhandled since they are
+      // normal during shutdown.
+      unawaited(dap.client.event('thread').then((_) => dap.client.terminate()));
+      await dap.client.start(file: testFile);
+    });
+
+    test('can hot reload', () async {
+      const originalText = 'ORIGINAL TEXT';
+      const newText = 'NEW TEXT';
+
+      // Create a script that prints 'ORIGINAL TEXT'.
+      final testFile = dap.createTestFile(stringPrintingProgram(originalText));
+
+      // Start the program and wait for 'ORIGINAL TEXT' to be printed.
+      await Future.wait([
+        dap.client.initialize(),
+        dap.client.launch(testFile.path),
+      ], eagerError: true);
+
+      // Expect the original text.
+      await dap.client.outputEvents
+          .firstWhere((event) => event.output.trim() == originalText);
+
+      // Update the file and hot reload.
+      testFile.writeAsStringSync(stringPrintingProgram(newText));
+      await dap.client.hotReload();
+
+      // Expect the new text.
+      await dap.client.outputEvents
+          .firstWhere((event) => event.output.trim() == newText);
+
+      await dap.client.terminate();
     });
     // These tests can be slow due to starting up the external server process.
   }, timeout: Timeout.none);
diff --git a/pkg/dds/test/dap/integration/test_client.dart b/pkg/dds/test/dap/integration/test_client.dart
index 66f44da..d960bec 100644
--- a/pkg/dds/test/dap/integration/test_client.dart
+++ b/pkg/dds/test/dap/integration/test_client.dart
@@ -148,7 +148,7 @@
       sendRequest(ContinueArguments(threadId: threadId));
 
   /// Sends a custom request to the server and waits for a response.
-  Future<Response> custom(String name, Object? args) async {
+  Future<Response> custom(String name, [Object? args]) async {
     return sendRequest(args, overrideCommand: name);
   }
 
@@ -191,6 +191,11 @@
     _serverRequestHandlers[request] = handler;
   }
 
+  /// Send a custom 'hotReload' request to the server.
+  Future<Response> hotReload() async {
+    return custom('hotReload');
+  }
+
   /// Send an initialize request to the server.
   ///
   /// This occurs before the request to start running/debugging a script and is
@@ -399,7 +404,7 @@
       } else {
         completer.completeError(message);
       }
-    } else if (message is Event) {
+    } else if (message is Event && !_eventController.isClosed) {
       _eventController.add(message);
 
       // When we see a terminated event, close the event stream so if any
@@ -483,11 +488,13 @@
   Future<StoppedEventBody> hitBreakpoint(
     File file,
     int line, {
+    File? entryFile,
     String? condition,
     String? cwd,
     List<String>? args,
     Future<Response> Function()? launch,
   }) async {
+    entryFile ??= file;
     final stop = expectStop('breakpoint', file: file, line: line);
 
     await Future.wait([
@@ -498,7 +505,7 @@
           breakpoints: [SourceBreakpoint(line: line, condition: condition)],
         ),
       ),
-      launch?.call() ?? this.launch(file.path, cwd: cwd, args: args),
+      launch?.call() ?? this.launch(entryFile.path, cwd: cwd, args: args),
     ], eagerError: true);
 
     return stop;
diff --git a/pkg/dds/test/dap/integration/test_scripts.dart b/pkg/dds/test/dap/integration/test_scripts.dart
index 2b24727..59bc718 100644
--- a/pkg/dds/test/dap/integration/test_scripts.dart
+++ b/pkg/dds/test/dap/integration/test_scripts.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.
 
+import 'dart:convert';
+
 import 'package:test/test.dart';
 
 /// A marker used in some test scripts/tests for where to set breakpoints.
@@ -53,6 +55,24 @@
   }
 ''';
 
+/// Returns a simple Dart script that prints the provided string repeatedly.
+String stringPrintingProgram(String text) {
+  // jsonEncode the string to get it into a quoted/escaped form that can be
+  // embedded in the string.
+  final encodedTextString = jsonEncode(text);
+  return '''
+  import 'dart:async';
+
+  main() async {
+    Timer.periodic(Duration(milliseconds: 10), (_) => printSomething());
+  }
+
+  void printSomething() {
+    print($encodedTextString);
+  }
+''';
+}
+
 /// A simple async Dart script that when stopped at the line of '// BREAKPOINT'
 /// will contain multiple stack frames across some async boundaries.
 const simpleAsyncProgram = '''
diff --git a/pkg/dds/test/dap/integration/test_support.dart b/pkg/dds/test/dap/integration/test_support.dart
index 9201798..d4c2a8b 100644
--- a/pkg/dds/test/dap/integration/test_support.dart
+++ b/pkg/dds/test/dap/integration/test_support.dart
@@ -43,6 +43,9 @@
 /// by the VM when not using --write-service-info.
 final vmServiceBannerPattern = RegExp(r'Observatory listening on ([^\s]+)\s');
 
+/// The root of the SDK containing the current running VM.
+final sdkRoot = path.dirname(path.dirname(Platform.resolvedExecutable));
+
 /// Expects the lines in [actual] to match the relevant matcher in [expected],
 /// ignoring differences in line endings and trailing whitespace.
 void expectLines(String actual, List<Object> expected) {
diff --git a/pkg/dds/test/dap/mocks.dart b/pkg/dds/test/dap/mocks.dart
new file mode 100644
index 0000000..9afe079
--- /dev/null
+++ b/pkg/dds/test/dap/mocks.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:dds/dap.dart';
+import 'package:dds/src/dap/adapters/dart_cli_adapter.dart';
+import 'package:dds/src/dap/adapters/dart_test_adapter.dart';
+
+/// A [DartCliDebugAdapter] that captures information about the process that
+/// will be launched.
+class MockDartCliDebugAdapter extends DartCliDebugAdapter {
+  final StreamSink<List<int>> stdin;
+  final Stream<List<int>> stdout;
+
+  late bool launchedInTerminal;
+  late String executable;
+  late List<String> processArgs;
+  late String? workingDirectory;
+  late Map<String, String>? env;
+
+  factory MockDartCliDebugAdapter() {
+    final stdinController = StreamController<List<int>>();
+    final stdoutController = StreamController<List<int>>();
+    final channel = ByteStreamServerChannel(
+        stdinController.stream, stdoutController.sink, null);
+
+    return MockDartCliDebugAdapter._(
+        stdinController.sink, stdoutController.stream, channel);
+  }
+
+  MockDartCliDebugAdapter._(
+      this.stdin, this.stdout, ByteStreamServerChannel channel)
+      : super(channel);
+
+  Future<void> launchAsProcess(
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    this.launchedInTerminal = false;
+    this.executable = executable;
+    this.processArgs = processArgs;
+    this.workingDirectory = workingDirectory;
+    this.env = env;
+  }
+
+  Future<void> launchInEditorTerminal(
+    bool debug,
+    String terminalKind,
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    this.launchedInTerminal = true;
+    this.executable = executable;
+    this.processArgs = processArgs;
+    this.workingDirectory = workingDirectory;
+    this.env = env;
+  }
+}
+
+/// A [DartTestDebugAdapter] that captures information about the process that
+/// will be launched.
+class MockDartTestDebugAdapter extends DartTestDebugAdapter {
+  final StreamSink<List<int>> stdin;
+  final Stream<List<int>> stdout;
+
+  late String executable;
+  late List<String> processArgs;
+  late String? workingDirectory;
+  late Map<String, String>? env;
+
+  factory MockDartTestDebugAdapter() {
+    final stdinController = StreamController<List<int>>();
+    final stdoutController = StreamController<List<int>>();
+    final channel = ByteStreamServerChannel(
+        stdinController.stream, stdoutController.sink, null);
+
+    return MockDartTestDebugAdapter._(
+      stdinController.sink,
+      stdoutController.stream,
+      channel,
+    );
+  }
+
+  MockDartTestDebugAdapter._(
+      this.stdin, this.stdout, ByteStreamServerChannel channel)
+      : super(channel);
+
+  Future<void> launchAsProcess(
+    String executable,
+    List<String> processArgs, {
+    required String? workingDirectory,
+    required Map<String, String>? env,
+  }) async {
+    this.executable = executable;
+    this.processArgs = processArgs;
+    this.workingDirectory = workingDirectory;
+    this.env = env;
+  }
+}
+
+class MockRequest extends Request {
+  static var _requestId = 1;
+  MockRequest()
+      : super.fromMap({
+          'command': 'mock_command',
+          'type': 'mock_type',
+          'seq': _requestId++,
+        });
+}
diff --git a/pkg/dds/test/get_cached_cpu_samples_script.dart b/pkg/dds/test/get_cached_cpu_samples_script.dart
index 5949574..78bd9fd 100644
--- a/pkg/dds/test/get_cached_cpu_samples_script.dart
+++ b/pkg/dds/test/get_cached_cpu_samples_script.dart
@@ -12,10 +12,14 @@
 }
 
 void main() {
-  UserTag('Testing').makeCurrent();
+  final tag = UserTag('Testing')..makeCurrent();
+  final tag2 = UserTag('Baz');
   int i = 5;
   while (true) {
+    tag.makeCurrent();
     ++i;
     fib(i);
+    tag2.makeCurrent();
+    fib(i);
   }
 }
diff --git a/pkg/dds/test/get_cached_cpu_samples_test.dart b/pkg/dds/test/get_cached_cpu_samples_test.dart
index 77d2bdb..ae25095 100644
--- a/pkg/dds/test/get_cached_cpu_samples_test.dart
+++ b/pkg/dds/test/get_cached_cpu_samples_test.dart
@@ -42,8 +42,15 @@
       final availableCaches = await service.getAvailableCachedCpuSamples();
       expect(availableCaches.cacheNames.length, 0);
 
-      final isolate = (await service.getVM()).isolates!.first;
-
+      IsolateRef isolate;
+      while (true) {
+        final vm = await service.getVM();
+        if (vm.isolates!.isNotEmpty) {
+          isolate = vm.isolates!.first;
+          break;
+        }
+        await Future.delayed(const Duration(seconds: 1));
+      }
       try {
         await service.getCachedCpuSamples(isolate.id!, 'Fake');
         fail('Invalid userTag did not cause an exception');
@@ -67,13 +74,30 @@
       );
       expect(dds.isRunning, true);
       final service = await vmServiceConnectUri(dds.wsUri.toString());
+      final otherService = await vmServiceConnectUri(dds.wsUri.toString());
 
       // Ensure we're caching results for samples under the 'Testing' UserTag.
       final availableCaches = await service.getAvailableCachedCpuSamples();
       expect(availableCaches.cacheNames.length, 1);
       expect(availableCaches.cacheNames.first, kUserTag);
 
-      final isolate = (await service.getVM()).isolates!.first;
+      IsolateRef isolate;
+      while (true) {
+        final vm = await service.getVM();
+        if (vm.isolates!.isNotEmpty) {
+          isolate = vm.isolates!.first;
+          try {
+            isolate = await service.getIsolate(isolate.id!);
+            if ((isolate as Isolate).runnable!) {
+              break;
+            }
+          } on SentinelException {
+            // ignore
+          }
+        }
+        await Future.delayed(const Duration(seconds: 1));
+      }
+      expect(isolate, isNotNull);
 
       final completer = Completer<void>();
       int i = 0;
@@ -99,9 +123,11 @@
                 // Ensure the number of CPU samples in the CpuSample event is
                 // is consistent with the number of samples in the cache.
                 expect(event.cpuSamples, isNotNull);
-                count += event.cpuSamples!.samples!
+                final sampleCount = event.cpuSamples!.samples!
                     .where((e) => e.userTag == kUserTag)
                     .length;
+                expect(sampleCount, event.cpuSamples!.samples!.length);
+                count += sampleCount;
                 final cache = await service.getCachedCpuSamples(
                   isolate.id!,
                   availableCaches.cacheNames.first,
@@ -116,6 +142,11 @@
         },
       );
       await service.streamListen(EventStreams.kProfiler);
+      await service.streamCpuSamplesWithUserTag(['Testing']);
+      // Have another client register for samples from another UserTag. The
+      // main client should not see any samples with the 'Baz' tag.
+      await otherService.streamListen(EventStreams.kProfiler);
+      await otherService.streamCpuSamplesWithUserTag(['Testing', 'Baz']);
       await service.resume(isolate.id!);
       await completer.future;
     },
diff --git a/pkg/dds/tool/dap/README.md b/pkg/dds/tool/dap/README.md
index 216d648..26bbeb3 100644
--- a/pkg/dds/tool/dap/README.md
+++ b/pkg/dds/tool/dap/README.md
@@ -15,7 +15,7 @@
 
 For details on the standard DAP functionality, see [the Debug Adapter Protocol Overview](https://microsoft.github.io/debug-adapter-protocol/) and [the Debug Adapter Protocol Specification](https://microsoft.github.io/debug-adapter-protocol/specification). Custom extensions are detailed below.
 
-**Flutter**: To run Flutter apps, the equivalent command should be run through the `flutter` tool. This is unavailable at the time of writing, but details will be linked here once available.
+**Flutter**: Flutter apps should be run using the debug adapter in the `flutter` tool - [see this document](https://github.com/flutter/flutter/blob/master/packages/flutter_tools/lib/src/debug_adapters/README.md).
 
 ## Launch/Attach Arguments
 
@@ -29,15 +29,20 @@
 - `int? vmServicePort` - the port to bind the VM Service too
 - `List<String>? additionalProjectPaths` - paths of any projects (outside of `cwd`) that are open in the users workspace
 - `String? cwd` - the working directory for the Dart process to be spawned in
+- `Map<String, String>? env` - environment variables to be passed to any spawned process
 
 Arguments specific to `launchRequest` are:
 
 - `bool? noDebug` - whether to run in debug or noDebug mode (if not supplied, defaults to debug)
 - `String program` - the path of the Dart program to run
-- `List<String>? args` - arguments to be passed to the Dart program
-- `List<String>? toolArgs` - arguments for the Dart VM
+- `List<String>? args` - arguments to be passed to the Dart program (after the `program` on the command line)
+- `List<String>? toolArgs` - arguments passed after the tool that will run `program` (after `dart` for CLI scripts and after `dart run test:test` for test scripts)
+- `List<String>? vmAdditionalArgs` - arguments passed directly to the Dart VM (after `dart` for both CLI scripts and test scripts)
 - `String? console` - if set to `"terminal"` or `"externalTerminal"` will be run using the `runInTerminal` reverse-request; otherwise the debug adapter spawns the Dart process
 - `bool? enableAsserts` - whether to enable asserts (if not supplied, defaults to enabled)
+- `String? customTool` - an optional tool to run instead of `dart` - the custom tool must be completely compatible with the tool/command it is replacing
+- `int? customToolReplacesArgs` - the number of arguments to delete from the beginning of the argument list when invoking `customTool` - e.g. setting `customTool` to `dart_test` and
+  `customToolReplacesArgs` to `2` for a test run would invoke `dart_test foo_test.dart` instead of `dart run test:test foo_test.dart` (if larger than the number of computed arguments all arguments will be removed, if not supplied will default to `0`)
 
 Arguments specific to `attachRequest` are:
 
@@ -74,6 +79,17 @@
 }
 ```
 
+### `hotReload`
+
+`hotReload` calls the VM's `reloadSources` service for each active isolate, reloading all modified source files.
+
+```
+{
+	"method": "hotReload",
+	"params": null
+}
+```
+
 ## Custom Events
 
 The debug adapter may emit several custom events that are useful to clients.
diff --git a/pkg/dev_compiler/analysis_options.yaml b/pkg/dev_compiler/analysis_options.yaml
index c1925c0..f93da08 100644
--- a/pkg/dev_compiler/analysis_options.yaml
+++ b/pkg/dev_compiler/analysis_options.yaml
@@ -1,8 +1,8 @@
 include: package:lints/recommended.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
   errors:
     todo: ignore
     avoid_function_literals_in_foreach_calls: ignore
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
old mode 100755
new mode 100644
index 4d8d197..09d9ca8
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -1,5 +1,5 @@
 #!/usr/bin/env dart
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,106 +8,14 @@
 /// Command line entry point for Dart Development Compiler (dartdevc), used to
 /// compile a collection of dart libraries into a single JS module
 
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
 import 'dart:isolate';
-import 'package:bazel_worker/bazel_worker.dart';
-import 'package:dev_compiler/src/compiler/shared_command.dart';
-import 'package:dev_compiler/src/kernel/expression_compiler_worker.dart';
+
+import 'package:dev_compiler/ddc.dart' as ddc;
 
 /// The entry point for the Dart Dev Compiler.
 ///
 /// [sendPort] may be passed in when started in an isolate. If provided, it is
 /// used for bazel worker communication instead of stdin/stdout.
 Future main(List<String> args, [SendPort sendPort]) async {
-  // Always returns a new modifiable list.
-  var parsedArgs = ParsedArguments.from(args);
-
-  if (parsedArgs.isWorker) {
-    var workerConnection = sendPort == null
-        ? StdAsyncWorkerConnection()
-        : SendPortAsyncWorkerConnection(sendPort);
-    await _CompilerWorker(parsedArgs, workerConnection).run();
-  } else if (parsedArgs.isBatch) {
-    await runBatch(parsedArgs);
-  } else if (parsedArgs.isExpressionCompiler) {
-    await ExpressionCompilerWorker.createAndStart(parsedArgs.rest,
-        sendPort: sendPort);
-  } else {
-    var result = await compile(parsedArgs);
-    exitCode = result.exitCode;
-  }
-}
-
-/// Runs the compiler worker loop.
-class _CompilerWorker extends AsyncWorkerLoop {
-  /// The original args supplied to the executable.
-  final ParsedArguments _startupArgs;
-
-  _CompilerWorker(this._startupArgs, AsyncWorkerConnection workerConnection)
-      : super(connection: workerConnection);
-
-  /// Keeps track of our last compilation result so it can potentially be
-  /// re-used in a worker.
-  CompilerResult lastResult;
-
-  /// Performs each individual work request.
-  @override
-  Future<WorkResponse> performRequest(WorkRequest request) async {
-    var args = _startupArgs.merge(request.arguments);
-    var output = StringBuffer();
-    var context = args.reuseResult ? lastResult : null;
-
-    /// Build a map of uris to digests.
-    final inputDigests = <Uri, List<int>>{};
-    for (var input in request.inputs) {
-      inputDigests[sourcePathToUri(input.path)] = input.digest;
-    }
-
-    lastResult = await runZoned(
-        () =>
-            compile(args, previousResult: context, inputDigests: inputDigests),
-        zoneSpecification:
-            ZoneSpecification(print: (self, parent, zone, message) {
-      output.writeln(message.toString());
-    }));
-    return WorkResponse()
-      ..exitCode = lastResult.success ? 0 : 1
-      ..output = output.toString();
-  }
-}
-
-/// Runs DDC in Kernel batch mode for test.dart.
-Future runBatch(ParsedArguments batchArgs) async {
-  var totalTests = 0;
-  var failedTests = 0;
-  var watch = Stopwatch()..start();
-
-  print('>>> BATCH START');
-
-  String line;
-  CompilerResult result;
-
-  while ((line = stdin.readLineSync(encoding: utf8))?.isNotEmpty == true) {
-    totalTests++;
-    var args = batchArgs.merge(line.split(RegExp(r'\s+')));
-
-    String outcome;
-    try {
-      result = await compile(args, previousResult: result);
-      outcome = result.success ? 'PASS' : (result.crashed ? 'CRASH' : 'FAIL');
-    } catch (e, s) {
-      outcome = 'CRASH';
-      print('Unhandled exception:');
-      print(e);
-      print(s);
-    }
-
-    stderr.writeln('>>> EOF STDERR');
-    print('>>> TEST $outcome ${watch.elapsedMilliseconds}ms');
-  }
-
-  var time = watch.elapsedMilliseconds;
-  print('>>> BATCH END (${totalTests - failedTests})/$totalTests ${time}ms');
+  return ddc.internalMain(args, sendPort);
 }
diff --git a/pkg/dev_compiler/lib/ddc.dart b/pkg/dev_compiler/lib/ddc.dart
new file mode 100755
index 0000000..5911cd9
--- /dev/null
+++ b/pkg/dev_compiler/lib/ddc.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+/// Command line entry point for Dart Development Compiler (dartdevc), used to
+/// compile a collection of dart libraries into a single JS module
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:isolate';
+import 'package:bazel_worker/bazel_worker.dart';
+
+import 'src/compiler/shared_command.dart';
+import 'src/kernel/expression_compiler_worker.dart';
+
+/// The internal entry point for the Dart Dev Compiler.
+///
+/// [sendPort] may be passed in when started in an isolate. If provided, it is
+/// used for bazel worker communication instead of stdin/stdout.
+Future internalMain(List<String> args, [SendPort sendPort]) async {
+  // Always returns a new modifiable list.
+  var parsedArgs = ParsedArguments.from(args);
+
+  if (parsedArgs.isWorker) {
+    var workerConnection = sendPort == null
+        ? StdAsyncWorkerConnection()
+        : SendPortAsyncWorkerConnection(sendPort);
+    await _CompilerWorker(parsedArgs, workerConnection).run();
+  } else if (parsedArgs.isBatch) {
+    await runBatch(parsedArgs);
+  } else if (parsedArgs.isExpressionCompiler) {
+    await ExpressionCompilerWorker.createAndStart(parsedArgs.rest,
+        sendPort: sendPort);
+  } else {
+    var result = await compile(parsedArgs);
+    exitCode = result.exitCode;
+  }
+}
+
+/// Runs the compiler worker loop.
+class _CompilerWorker extends AsyncWorkerLoop {
+  /// The original args supplied to the executable.
+  final ParsedArguments _startupArgs;
+
+  _CompilerWorker(this._startupArgs, AsyncWorkerConnection workerConnection)
+      : super(connection: workerConnection);
+
+  /// Keeps track of our last compilation result so it can potentially be
+  /// re-used in a worker.
+  CompilerResult lastResult;
+
+  /// Performs each individual work request.
+  @override
+  Future<WorkResponse> performRequest(WorkRequest request) async {
+    var args = _startupArgs.merge(request.arguments);
+    var output = StringBuffer();
+    var context = args.reuseResult ? lastResult : null;
+
+    /// Build a map of uris to digests.
+    final inputDigests = <Uri, List<int>>{};
+    for (var input in request.inputs) {
+      inputDigests[sourcePathToUri(input.path)] = input.digest;
+    }
+
+    lastResult = await runZoned(
+        () =>
+            compile(args, previousResult: context, inputDigests: inputDigests),
+        zoneSpecification:
+            ZoneSpecification(print: (self, parent, zone, message) {
+      output.writeln(message.toString());
+    }));
+    return WorkResponse()
+      ..exitCode = lastResult.success ? 0 : 1
+      ..output = output.toString();
+  }
+}
+
+/// Runs DDC in Kernel batch mode for test.dart.
+Future runBatch(ParsedArguments batchArgs) async {
+  var totalTests = 0;
+  var failedTests = 0;
+  var watch = Stopwatch()..start();
+
+  print('>>> BATCH START');
+
+  String line;
+  CompilerResult result;
+
+  while ((line = stdin.readLineSync(encoding: utf8))?.isNotEmpty == true) {
+    totalTests++;
+    var args = batchArgs.merge(line.split(RegExp(r'\s+')));
+
+    String outcome;
+    try {
+      result = await compile(args, previousResult: result);
+      outcome = result.success ? 'PASS' : (result.crashed ? 'CRASH' : 'FAIL');
+    } catch (e, s) {
+      outcome = 'CRASH';
+      print('Unhandled exception:');
+      print(e);
+      print(s);
+    }
+
+    stderr.writeln('>>> EOF STDERR');
+    print('>>> TEST $outcome ${watch.elapsedMilliseconds}ms');
+  }
+
+  var time = watch.elapsedMilliseconds;
+  print('>>> BATCH END (${totalTests - failedTests})/$totalTests ${time}ms');
+}
diff --git a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
index c1291a3..e0d73cb 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_typerep.dart
@@ -1,7 +1,8 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 /// An abstraction of the JS types
-
-// @dart = 2.9
-
 abstract class JSType {
   const JSType();
 
@@ -20,7 +21,7 @@
   bool get isFalsey;
 
   /// The JS `typeof` value, if unambiguous.
-  String get primitiveTypeOf => null;
+  String? get primitiveTypeOf => null;
 
   static const jsBoolean = JSBoolean();
   static const jsNumber = JSNumber();
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index d8435ca..5b514be 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -338,10 +338,16 @@
     result = await fe.compile(compilerState, inputs, diagnosticMessageHandler);
   } else {
     compilerState.options.onDiagnostic = diagnosticMessageHandler;
-    var incrementalComponent = await incrementalCompiler.computeDelta(
-        entryPoints: inputs, fullComponent: true);
-    result = fe.DdcResult(incrementalComponent, cachedSdkInput.component,
-        doneAdditionalDills, incrementalCompiler.userCode.loader.hierarchy);
+    var incrementalCompilerResult = await incrementalCompiler.computeDelta(
+        entryPoints: inputs,
+        fullComponent: true,
+        trackNeededDillLibraries: recordUsedInputs);
+    result = fe.DdcResult(
+        incrementalCompilerResult.component,
+        cachedSdkInput.component,
+        doneAdditionalDills,
+        incrementalCompilerResult.classHierarchy,
+        incrementalCompilerResult.neededDillLibraries);
   }
   compilerState.options.onDiagnostic = null; // See http://dartbug.com/36983.
 
@@ -476,9 +482,10 @@
   if (recordUsedInputs) {
     var usedOutlines = <Uri>{};
     if (useIncrementalCompiler) {
-      compilerState.incrementalCompiler
-          .updateNeededDillLibrariesWithHierarchy(result.classHierarchy, null);
-      for (var lib in compilerState.incrementalCompiler.neededDillLibraries) {
+      var neededDillLibraries = result.neededDillLibraries;
+      compilerState.incrementalCompiler.updateNeededDillLibrariesWithHierarchy(
+          neededDillLibraries, result.classHierarchy);
+      for (var lib in neededDillLibraries) {
         if (lib.importUri.scheme == 'dart') continue;
         var uri = compilerState.libraryToInputDill[lib.importUri];
         if (uri == null) {
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 131d308..e0efac6 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -595,7 +595,7 @@
     var node = export.node;
     if (node is Procedure && node.name.text == 'main') {
       // Don't allow redefining names from this library.
-      var name = _emitTopLevelName(export.node);
+      var name = _emitTopLevelName(node);
       moduleItems.add(js.statement(
           '#.# = #;', [emitLibraryName(library), name.selector, name]));
     }
@@ -1612,14 +1612,12 @@
     var fn = node.function;
     var body = _emitArgumentInitializers(fn, node.name.text);
 
-    // Redirecting constructors: these are not allowed to have initializers,
-    // and the redirecting ctor invocation runs before field initializers.
-    var redirectCall = node.initializers
-            .firstWhere((i) => i is RedirectingInitializer, orElse: () => null)
-        as RedirectingInitializer;
-
-    if (redirectCall != null) {
-      body.add(_emitRedirectingConstructor(redirectCall, className));
+    // Redirecting constructors are not allowed to have conventional
+    // initializers but can have variable declarations in the form of
+    // initializers to support named arguments appearing anywhere in the
+    // arguments list.
+    if (node.initializers.any((i) => i is RedirectingInitializer)) {
+      body.add(_emitRedirectingConstructor(node.initializers, className));
       return body;
     }
 
@@ -1652,15 +1650,23 @@
   }
 
   js_ast.Statement _emitRedirectingConstructor(
-      RedirectingInitializer node, js_ast.Expression className) {
-    var ctor = node.target;
-    // We can't dispatch to the constructor with `this.new` as that might hit a
-    // derived class constructor with the same name.
-    return js.statement('#.#.call(this, #);', [
-      className,
-      _constructorName(ctor.name.text),
-      _emitArgumentList(node.arguments, types: false)
-    ]);
+      List<Initializer> initializers, js_ast.Expression className) {
+    var jsInitializers = <js_ast.Statement>[
+      for (var init in initializers)
+        if (init is LocalInitializer)
+          // Temporary locals are created when named arguments don't appear at
+          // the end of the arguments list.
+          visitVariableDeclaration(init.variable)
+        else if (init is RedirectingInitializer)
+          // We can't dispatch to the constructor with `this.new` as that might
+          // hit a derived class constructor with the same name.
+          js.statement('#.#.call(this, #);', [
+            className,
+            _constructorName(init.target.name.text),
+            _emitArgumentList(init.arguments, types: false)
+          ])
+    ];
+    return js_ast.Block(jsInitializers);
   }
 
   js_ast.Statement _emitSuperConstructorCallIfNeeded(
@@ -2384,10 +2390,11 @@
   /// Unlike call sites, we always have an element available, so we can use it
   /// directly rather than computing the relevant options for [_emitMemberName].
   js_ast.Expression _declareMemberName(Member m, {bool useExtension}) {
+    var c = m.enclosingClass;
     return _emitMemberName(m.name.text,
         isStatic: m is Field ? m.isStatic : (m as Procedure).isStatic,
         useExtension:
-            useExtension ?? _extensionTypes.isNativeClass(m.enclosingClass),
+            useExtension ?? c != null && _extensionTypes.isNativeClass(c),
         member: m);
   }
 
@@ -4691,15 +4698,18 @@
   /// null-checked in sound null-safety.
   ///
   /// This is true for non-nullable native return types.
-  bool _isNullCheckableNative(Member member) =>
-      _options.soundNullSafety &&
-      member != null &&
-      member.isExternal &&
-      _extensionTypes.isNativeClass(member.enclosingClass) &&
-      member is Procedure &&
-      member.function != null &&
-      member.function.returnType.isPotentiallyNonNullable &&
-      _isWebLibrary(member.enclosingLibrary?.importUri);
+  bool _isNullCheckableNative(Member member) {
+    var c = member.enclosingClass;
+    return _options.soundNullSafety &&
+        member != null &&
+        member.isExternal &&
+        c != null &&
+        _extensionTypes.isNativeClass(c) &&
+        member is Procedure &&
+        member.function != null &&
+        member.function.returnType.isPotentiallyNonNullable &&
+        _isWebLibrary(member.enclosingLibrary?.importUri);
+  }
 
   // TODO(jmesserly): can we encapsulate REPL name lookups and remove this?
   // _emitMemberName would be a nice place to handle it, but we don't have
@@ -5373,7 +5383,16 @@
     // setter, or method. For the case of tearing off a `super` method in
     // contexts where `super` isn't allowed, see [_emitSuperTearoff].
     var name = member.name.text;
-    var jsMethod = _superHelpers.putIfAbsent(name, () {
+    var getter = (member is Field && !setter) ||
+        (member is Procedure && member.isGetter);
+    // Prefix applied to the name only used in the compiler for a map key. This
+    // name does not make its way into the compiled program.
+    var lookupPrefix = setter
+        ? r'set$'
+        : getter
+            ? r'get$'
+            : '';
+    var jsMethod = _superHelpers.putIfAbsent('$lookupPrefix$name', () {
       var isAccessor = member is Procedure ? member.isAccessor : true;
       if (isAccessor) {
         assert(member is Procedure
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
index 4e2cd32..a41722c 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
@@ -310,7 +310,7 @@
 
       _log('Compiling expression \n$expression');
 
-      var dartScope = await _findScopeAt(Uri.parse(libraryUri), line, column);
+      var dartScope = _findScopeAt(Uri.parse(libraryUri), line, column);
       if (dartScope == null) {
         _log('Scope not found at $libraryUri:$line:$column');
         return null;
@@ -389,14 +389,14 @@
     }
   }
 
-  Future<DartScope> _findScopeAt(Uri libraryUri, int line, int column) async {
+  DartScope _findScopeAt(Uri libraryUri, int line, int column) {
     if (line < 0) {
       onDiagnostic(_createInternalError(
           libraryUri, line, column, 'Invalid source location'));
       return null;
     }
 
-    var library = await _getLibrary(libraryUri);
+    var library = _getLibrary(libraryUri);
     if (library == null) {
       onDiagnostic(_createInternalError(
           libraryUri, line, column, 'Dart library not found for location'));
@@ -415,19 +415,8 @@
     return scope;
   }
 
-  Future<Library> _getLibrary(Uri libraryUri) async {
-    return await _compiler.context.runInContext((_) async {
-      var builder = _compiler.userCode.loader.lookupLibraryBuilder(libraryUri);
-      if (builder != null) {
-        var library =
-            _compiler.userCode.loader.read(libraryUri, -1, accessor: builder);
-
-        return library.library;
-      }
-
-      _log('Loaded library for expression');
-      return null;
-    });
+  Library _getLibrary(Uri libraryUri) {
+    return _compiler.lookupLibrary(libraryUri);
   }
 
   /// Return a JS function that returns the evaluated results when called.
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
index 1068a8a..6d5c418 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
@@ -357,8 +357,9 @@
     var incrementalCompiler = IncrementalCompiler.forExpressionCompilationOnly(
         CompilerContext(_processedOptions), component, /*resetTicker*/ false);
 
-    var finalComponent = await incrementalCompiler
+    var incrementalCompilerResult = await incrementalCompiler
         .computeDelta(entryPoints: [libraryUri], fullComponent: true);
+    var finalComponent = incrementalCompilerResult.component;
     assert(!duplicateLibrariesReachable(finalComponent.libraries));
     assert(_canSerialize(finalComponent));
 
@@ -374,8 +375,8 @@
       };
     }
 
-    var coreTypes = incrementalCompiler.getCoreTypes();
-    var hierarchy = incrementalCompiler.getClassHierarchy();
+    var coreTypes = incrementalCompilerResult.coreTypes;
+    var hierarchy = incrementalCompilerResult.classHierarchy;
 
     var kernel2jsCompiler = ProgramCompiler(
       finalComponent,
diff --git a/pkg/dev_compiler/lib/src/kernel/js_interop.dart b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
index 65ab098..d865154 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
@@ -2,15 +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.
 
-// @dart = 2.9
-
 import 'package:kernel/kernel.dart';
+
 import 'kernel_helpers.dart';
 
 /// Returns true if [library] is one of the [candidates].
 /// The latter should be a list, e.g.,: ['dart:js', 'package:js'].
 bool _isLibrary(Library library, List<String> candidates) {
-  if (library == null) return false;
   var uri = library.importUri;
   var scheme = uri.scheme;
   var path = uri.pathSegments[0];
@@ -63,7 +61,7 @@
     _annotationIsFromJSLibrary('_Rest', value);
 
 // TODO(jmesserly): Move JsPeerInterface to package:js (see issue #135).
-// TODO(jacobr): The 'JS' annotation is the new, publically accessible one.
+// TODO(jacobr): The 'JS' annotation is the new, publicly accessible one.
 // The 'JsName' annotation is the old one using internally by dart2js and
 // html libraries.  These two concepts will probably merge eventually.
 bool isJSAnnotation(Expression value) =>
@@ -129,7 +127,7 @@
   if (n is Member && n.isExternal) {
     return n.enclosingLibrary.annotations.any(isPublicJSAnnotation) ||
         n.annotations.any(isPublicJSAnnotation) ||
-        (n.enclosingClass?.annotations?.any(isPublicJSAnnotation) ?? false);
+        (n.enclosingClass?.annotations.any(isPublicJSAnnotation) ?? false);
   } else if (n is Class) {
     return n.annotations.any(isPublicJSAnnotation);
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
index 646f17c..58297dc 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
@@ -2,12 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/type_environment.dart';
+
 import '../compiler/js_typerep.dart';
 import 'kernel_helpers.dart';
 
@@ -32,9 +31,8 @@
   @override
   JSType typeFor(DartType type) {
     while (type is TypeParameterType) {
-      type = (type as TypeParameterType).parameter.bound;
+      type = type.parameter.bound;
     }
-    if (type == null) return JSType.jsUnknown;
     assert(isKnownDartTypeImplementor(type));
 
     // Note that this should be changed if Dart gets non-nullable types
@@ -65,11 +63,12 @@
     return JSType.jsObject;
   }
 
-  /// Given a Dart type return the known implementation type, if any.
-  /// Given `bool`, `String`, or `num`/`int`/`double`,
-  /// returns the corresponding class in `dart:_interceptors`:
-  /// `JSBool`, `JSString`, and `JSNumber` respectively, otherwise null.
-  Class getImplementationClass(DartType t) {
+  /// Returns the known implementation type for [t], if any.
+  ///
+  /// Given `bool`, `String`, or `num`/`int`/`double`, returns the corresponding
+  /// class in `dart:_interceptors`: `JSBool`, `JSString`, and `JSNumber`
+  /// respectively, otherwise null.
+  Class? getImplementationClass(DartType t) {
     var rep = typeFor(t);
     // Number, String, and Bool are final
     if (rep == JSType.jsNumber) return _jsNumber;
diff --git a/pkg/dev_compiler/lib/src/kernel/module_symbols.dart b/pkg/dev_compiler/lib/src/kernel/module_symbols.dart
index 73f14cf..8e90b06 100644
--- a/pkg/dev_compiler/lib/src/kernel/module_symbols.dart
+++ b/pkg/dev_compiler/lib/src/kernel/module_symbols.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
-
 // Dart debug symbol information stored by DDC.
 //
 // The data format below stores descriptions of dart code objects and their
@@ -90,94 +88,110 @@
   static const SemanticVersion current = SemanticVersion(0, 0, 1);
 
   /// Semantic version of the format.
-  String version;
+  final String version;
 
   /// Module name as used in the module metadata
-  String moduleName;
+  final String moduleName;
 
   /// All dart libraries included in the module.
   ///
   /// Note here and below that imported elements are not included in
   /// the current module but can be referenced by their ids.
-  List<LibrarySymbol> libraries;
+  final List<LibrarySymbol> libraries;
 
   /// All dart scripts included in the module.
-  List<Script> scripts;
+  final List<Script> scripts;
 
   /// All dart classes included in the module.
-  List<ClassSymbol> classes;
+  final List<ClassSymbol> classes;
 
   /// All dart function types included in the module.
-  List<FunctionTypeSymbol> functionTypes;
+  final List<FunctionTypeSymbol> functionTypes;
 
   /// All dart function types included in the module.
-  List<FunctionSymbol> functions;
+  final List<FunctionSymbol> functions;
 
   /// All dart scopes included in the module.
   ///
   /// Does not include scopes listed in other fields,
   /// such as libraries, classes, and functions.
-  List<ScopeSymbol> scopes;
+  final List<ScopeSymbol> scopes;
 
-  /// All dart variables included in the module.
+  /// All Dart variables included in the module.
   List<VariableSymbol> variables;
+
   ModuleSymbols({
-    this.version,
-    this.moduleName,
-    this.libraries,
-    this.scripts,
-    this.classes,
-    this.functionTypes,
-    this.functions,
-    this.scopes,
-    this.variables,
-  });
-  ModuleSymbols.fromJson(Map<String, dynamic> json) {
-    version = _createValue(json['version'], ifNull: current.version);
+    String? version,
+    required this.moduleName,
+    List<LibrarySymbol>? libraries,
+    List<Script>? scripts,
+    List<ClassSymbol>? classes,
+    List<FunctionTypeSymbol>? functionTypes,
+    List<FunctionSymbol>? functions,
+    List<ScopeSymbol>? scopes,
+    List<VariableSymbol>? variables,
+  })  : version = version ??= current.version,
+        libraries = libraries ?? [],
+        scripts = scripts ?? [],
+        classes = classes ?? [],
+        functionTypes = functionTypes ?? [],
+        functions = functions ?? [],
+        scopes = scopes ?? [],
+        variables = variables ?? [];
+
+  ModuleSymbols.fromJson(Map<String, dynamic> json)
+      : version = _readAndValidateVersionFromJson(json['version']),
+        moduleName = _createValue(json['moduleName']),
+        libraries =
+            _createObjectList(json['libraries'], LibrarySymbol.fromJson),
+        scripts = _createObjectList(json['scripts'], Script.fromJson),
+        classes = _createObjectList(json['classes'], ClassSymbol.fromJson),
+        functionTypes = _createObjectList(
+            json['functionTypes'], FunctionTypeSymbol.fromJson),
+        functions =
+            _createObjectList(json['functions'], FunctionSymbol.fromJson),
+        scopes = _createObjectList(json['scopes'], ScopeSymbol.fromJson),
+        variables =
+            _createObjectList(json['variables'], VariableSymbol.fromJson);
+
+  @override
+  Map<String, dynamic> toJson() {
+    final json = <String, dynamic>{
+      'version': version,
+      'moduleName': moduleName,
+    };
+    _setObjectListIfNotNullOrEmpty(json, 'libraries', libraries);
+    _setObjectListIfNotNullOrEmpty(json, 'scripts', scripts);
+    _setObjectListIfNotNullOrEmpty(json, 'classes', classes);
+    _setObjectListIfNotNullOrEmpty(json, 'functionTypes', functionTypes);
+    _setObjectListIfNotNullOrEmpty(json, 'functions', functions);
+    _setObjectListIfNotNullOrEmpty(json, 'scopes', scopes);
+    _setObjectListIfNotNullOrEmpty(json, 'variables', variables);
+    return json;
+  }
+
+  static String _readAndValidateVersionFromJson(dynamic json) {
+    if (json == null) return current.version;
+    var version = _createValue<String>(json);
     if (!current.isCompatibleWith(version)) {
       throw Exception('Unsupported version $version. '
           'Current version: ${current.version}');
     }
-    moduleName = _createValue(json['moduleName']);
-    libraries = _createObjectList(
-        json['libraries'], (json) => LibrarySymbol.fromJson(json));
-    scripts =
-        _createObjectList(json['scripts'], (json) => Script.fromJson(json));
-    classes = _createObjectList(
-        json['classes'], (json) => ClassSymbol.fromJson(json));
-    functionTypes = _createObjectList(
-        json['functionTypes'], (json) => FunctionTypeSymbol.fromJson(json));
-    functions = _createObjectList(
-        json['functions'], (json) => FunctionSymbol.fromJson(json));
-    scopes =
-        _createObjectList(json['scopes'], (json) => ScopeSymbol.fromJson(json));
-    variables = _createObjectList(
-        json['variables'], (json) => VariableSymbol.fromJson(json));
-  }
-  @override
-  Map<String, dynamic> toJson() {
-    final json = <String, dynamic>{};
-    _setValueIfNotNull(json, 'version', version);
-    _setValueIfNotNull(json, 'moduleName', moduleName);
-    _setObjectListIfNotNull(json, 'libraries', libraries);
-    _setObjectListIfNotNull(json, 'scripts', scripts);
-    _setObjectListIfNotNull(json, 'classes', classes);
-    _setObjectListIfNotNull(json, 'functionTypes', functionTypes);
-    _setObjectListIfNotNull(json, 'functions', functions);
-    _setObjectListIfNotNull(json, 'scopes', scopes);
-    _setObjectListIfNotNull(json, 'variables', variables);
-    return json;
+    return version;
   }
 }
 
 class Symbol implements SymbolTableElement {
   /// Local id (such as JS name) for the symbol.
   ///
-  /// Used to map from dart objects to JS objects inside a scope.
-  String localId;
+  /// Used to map from Dart objects to JS objects inside a scope.
+  final String localId;
 
   /// Enclosing scope of the symbol.
-  String scopeId;
+  final String? scopeId;
+
+  /// Source location of the symbol.
+  final SourceLocation? location;
 
   /// Unique Id, shared with JS representation (if any).
   ///
@@ -186,20 +200,20 @@
   /// Where scope refers to a Library, Class, Function, or Scope.
   String get id => scopeId == null ? localId : '$scopeId|$localId';
 
-  /// Source location of the symbol.
-  SourceLocation location;
-  Symbol({this.localId, this.scopeId, this.location});
-  Symbol.fromJson(Map<String, dynamic> json) {
-    localId = _createValue(json['localId']);
-    scopeId = _createValue(json['scopeId']);
-    location = _createObject(
-        json['location'], (json) => SourceLocation.fromJson(json));
-  }
+  Symbol({required this.localId, this.scopeId, this.location});
+
+  Symbol.fromJson(Map<String, dynamic> json)
+      : localId = _createValue(json['localId']),
+        scopeId = _createValue(json['scopeId']),
+        location =
+            _createNullableObject(json['location'], SourceLocation.fromJson);
+
   @override
   Map<String, dynamic> toJson() {
-    final json = <String, dynamic>{};
-    _setValueIfNotNull(json, 'localId', localId);
-    _setValueIfNotNull(json, 'scopeId', scopeId);
+    final json = <String, dynamic>{
+      'localId': localId,
+      if (scopeId != null) 'scopeId': scopeId,
+    };
     _setObjectIfNotNull(json, 'location', location);
     return json;
   }
@@ -210,6 +224,7 @@
 }
 
 enum VariableSymbolKind { global, local, property, field, formal, none }
+
 VariableSymbolKind parseVariableSymbolKind(String value) {
   return VariableSymbolKind.values.singleWhere((e) => value == '$e',
       orElse: () {
@@ -218,189 +233,210 @@
 }
 
 class VariableSymbol extends Symbol {
-  /// Variable name
-  String name;
+  /// Name of the variable in Dart source code.
+  final String name;
 
   /// Symbol kind.
-  VariableSymbolKind kind;
+  final VariableSymbolKind kind;
 
-  /// The declared type of this symbol.
-  String typeId;
+  /// The declared type of this symbol in Dart source code.
+  // TODO(nshahan) Only nullable until we design how to identify types from
+  // other modules.
+  final String? typeId;
 
-  /// Is this variable const?
-  bool isConst;
+  /// True if this variable const.
+  final bool isConst;
 
-  /// Is this variable final?
-  bool isFinal;
+  /// True if this variable final.
+  final bool isFinal;
 
-  /// Is this variable static?
-  bool isStatic;
+  /// True if this variable static.
+  final bool isStatic;
 
   /// Property getter, if any.
-  String getterId;
+  final String? getterId;
 
   /// Property setter, if any.
-  String setterId;
+  final String? setterId;
+
   VariableSymbol({
-    this.name,
-    this.kind,
-    this.isConst,
-    this.isFinal,
-    this.isStatic,
-    this.typeId,
-    String localId,
-    String scopeId,
-    SourceLocation location,
-  }) : super(localId: localId, scopeId: scopeId, location: location);
-  VariableSymbol.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
-    name = _createValue(json['name']);
-    kind = _createValue(json['kind'],
-        parse: parseVariableSymbolKind, ifNull: VariableSymbolKind.none);
-    isConst = _createValue(json['isConst']);
-    isFinal = _createValue(json['isFinal']);
-    isStatic = _createValue(json['isStatic']);
-    typeId = _createValue(json['typeId']);
-    setterId = _createValue(json['setterId']);
-    getterId = _createValue(json['getterId']);
-  }
+    required this.name,
+    required this.kind,
+    required this.typeId,
+    bool? isConst,
+    bool? isFinal,
+    bool? isStatic,
+    this.getterId,
+    this.setterId,
+    required String localId,
+    required String scopeId,
+    required SourceLocation location,
+  })  : isConst = isConst ?? false,
+        isFinal = isFinal ?? false,
+        isStatic = isStatic ?? false,
+        super(localId: localId, scopeId: scopeId, location: location);
+
+  VariableSymbol.fromJson(Map<String, dynamic> json)
+      : name = _createValue(json['name']),
+        kind = _createValue(json['kind'],
+            parse: parseVariableSymbolKind, ifNull: VariableSymbolKind.none),
+        typeId = _createValue(json['typeId']),
+        isConst = _createValue(json['isConst']),
+        isFinal = _createValue(json['isFinal']),
+        isStatic = _createValue(json['isStatic']),
+        getterId = _createValue(json['getterId']),
+        setterId = _createValue(json['setterId']),
+        super.fromJson(json);
+
   @override
-  Map<String, dynamic> toJson() {
-    final json = super.toJson();
-    _setValueIfNotNull(json, 'name', name);
-    _setValueIfNotNull(json, 'kind', kind.toString());
-    _setValueIfNotNull(json, 'isConst', isConst);
-    _setValueIfNotNull(json, 'isFinal', isFinal);
-    _setValueIfNotNull(json, 'isStatic', isStatic);
-    _setValueIfNotNull(json, 'typeId', typeId);
-    _setValueIfNotNull(json, 'setterId', setterId);
-    _setValueIfNotNull(json, 'getterId', getterId);
-    return json;
-  }
+  Map<String, dynamic> toJson() => {
+        ...super.toJson(),
+        'name': name,
+        'kind': kind.toString(),
+        if (typeId != null) 'typeId': typeId,
+        'isConst': isConst,
+        'isFinal': isFinal,
+        'isStatic': isStatic,
+        if (getterId != null) 'getterId': getterId,
+        if (setterId != null) 'setterId': setterId,
+      };
 }
 
 class ClassSymbol extends ScopeSymbol implements TypeSymbol {
-  /// The name of this class.
-  String name;
+  /// The name of this class in Dart source code.
+  final String name;
 
-  /// Is this an abstract class?
-  bool isAbstract;
+  /// True if this class is abstract.
+  final bool isAbstract;
 
-  /// Is this a const class?
-  bool isConst;
+  /// True if this class is const.
+  final bool isConst;
 
   /// The superclass of this class, if any.
-  String superClassId;
+  final String? superClassId;
 
   /// A list of interface types for this class.
-  List<String> interfaceIds;
+  final List<String> interfaceIds;
 
-  /// Mapping of type parameter dart names to JS names.
-  Map<String, String> typeParameters;
+  /// Mapping of type parameter Dart names to JS names.
+  final Map<String, String> typeParameters;
 
   /// Library that contains this class.
-  String get libraryId => scopeId;
+  String get libraryId => scopeId!;
 
   /// Fields in this class.
   ///
   /// Including static fields, methods, and properties.
   List<String> get fieldIds => variableIds;
 
-  /// A list of functions in this class.
+  /// Functions in this class.
   ///
   /// Includes all static functions, methods, getters,
   /// and setters in the current class.
   ///
   /// Does not include functions from superclasses.
   List<String> get functionIds => scopeIds;
+
   ClassSymbol({
-    this.name,
-    this.isAbstract,
-    this.isConst,
+    required this.name,
+    bool? isAbstract,
+    bool? isConst,
     this.superClassId,
-    this.interfaceIds,
-    this.typeParameters,
-    String localId,
-    String scopeId,
-    SourceLocation location,
-    List<String> variableIds,
-    List<String> scopeIds,
-  }) : super(
+    List<String>? interfaceIds,
+    Map<String, String>? typeParameters,
+    required String localId,
+    required String scopeId,
+    required SourceLocation location,
+    List<String>? variableIds,
+    List<String>? scopeIds,
+  })  : isAbstract = isAbstract ?? false,
+        isConst = isConst ?? false,
+        interfaceIds = interfaceIds ?? [],
+        typeParameters = typeParameters ?? {},
+        super(
             localId: localId,
             scopeId: scopeId,
             variableIds: variableIds,
             scopeIds: scopeIds,
             location: location);
-  ClassSymbol.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
-    name = _createValue(json['name']);
-    isAbstract = _createValue(json['isAbstract']);
-    isConst = _createValue(json['isConst']);
-    superClassId = _createValue(json['superClassId']);
-    interfaceIds = _createValueList(json['interfaceIds']);
-    typeParameters = _createValueMap(json['typeParameters']);
-  }
+
+  ClassSymbol.fromJson(Map<String, dynamic> json)
+      : name = _createValue(json['name']),
+        isAbstract = _createValue(json['isAbstract']),
+        isConst = _createValue(json['isConst']),
+        superClassId = _createValue(json['superClassId']),
+        interfaceIds = _createValueList(json['interfaceIds']),
+        typeParameters = _createValueMap(json['typeParameters']),
+        super.fromJson(json);
+
   @override
-  Map<String, dynamic> toJson() {
-    final json = super.toJson();
-    _setValueIfNotNull(json, 'name', name);
-    _setValueIfNotNull(json, 'isAbstract', isAbstract);
-    _setValueIfNotNull(json, 'isConst', isConst);
-    _setValueIfNotNull(json, 'superClassId', superClassId);
-    _setValueIfNotNull(json, 'interfaceIds', interfaceIds);
-    _setValueIfNotNull(json, 'typeParameters', typeParameters);
-    return json;
-  }
+  Map<String, dynamic> toJson() => {
+        ...super.toJson(),
+        'name': name,
+        'isAbstract': isAbstract,
+        'isConst': isConst,
+        if (superClassId != null) 'superClassId': superClassId,
+        if (interfaceIds.isNotEmpty) 'interfaceIds': interfaceIds,
+        if (typeParameters.isNotEmpty) 'typeParameters': typeParameters,
+      };
 }
 
 class FunctionTypeSymbol extends Symbol implements TypeSymbol {
   /// Mapping of dart type parameter names to JS names.
-  Map<String, String> typeParameters;
+  final Map<String, String> typeParameters;
 
   /// Types for positional parameters for this function.
-  List<String> parameterTypeIds;
+  final List<String> parameterTypeIds;
 
   /// Types for optional positional parameters for this function.
-  List<String> optionalParameterTypeIds;
+  final List<String> optionalParameterTypeIds;
 
   /// Names and types for named parameters for this function.
-  Map<String, String> namedParameterTypeIds;
+  final Map<String, String> namedParameterTypeIds;
 
-  /// A return type for this function.
-  String returnTypeId;
+  /// The return type for this function.
+  final String returnTypeId;
+
   FunctionTypeSymbol({
-    this.typeParameters,
-    this.parameterTypeIds,
-    this.optionalParameterTypeIds,
-    this.namedParameterTypeIds,
-    this.returnTypeId,
-    String localId,
-    String scopeId,
-    SourceLocation location,
-  }) : super(localId: localId, scopeId: scopeId, location: location);
+    Map<String, String>? typeParameters,
+    List<String>? parameterTypeIds,
+    List<String>? optionalParameterTypeIds,
+    Map<String, String>? namedParameterTypeIds,
+    required this.returnTypeId,
+    required String localId,
+    required String scopeId,
+    required SourceLocation location,
+  })  : typeParameters = typeParameters ?? {},
+        parameterTypeIds = parameterTypeIds ?? [],
+        optionalParameterTypeIds = optionalParameterTypeIds ?? [],
+        namedParameterTypeIds = namedParameterTypeIds ?? {},
+        super(localId: localId, scopeId: scopeId, location: location);
+
   FunctionTypeSymbol.fromJson(Map<String, dynamic> json)
-      : super.fromJson(json) {
-    parameterTypeIds = _createValueList(json['parameterTypeIds']);
-    optionalParameterTypeIds =
-        _createValueList(json['optionalParameterTypeIds']);
-    typeParameters = _createValueMap(json['typeParameters']);
-    namedParameterTypeIds = _createValueMap(json['namedParameterTypeIds']);
-    returnTypeId = _createValue(json['returnTypeId']);
-  }
+      : parameterTypeIds = _createValueList(json['parameterTypeIds']),
+        optionalParameterTypeIds =
+            _createValueList(json['optionalParameterTypeIds']),
+        typeParameters = _createValueMap(json['typeParameters']),
+        namedParameterTypeIds = _createValueMap(json['namedParameterTypeIds']),
+        returnTypeId = _createValue(json['returnTypeId']),
+        super.fromJson(json);
+
   @override
-  Map<String, dynamic> toJson() {
-    final json = super.toJson();
-    _setValueIfNotNull(json, 'typeParameters', typeParameters);
-    _setValueIfNotNull(json, 'parameterTypeIds', parameterTypeIds);
-    _setValueIfNotNull(
-        json, 'optionalParameterTypeIds', optionalParameterTypeIds);
-    _setValueIfNotNull(json, 'namedParameterTypeIds', namedParameterTypeIds);
-    _setValueIfNotNull(json, 'returnTypeId', returnTypeId);
-    return json;
-  }
+  Map<String, dynamic> toJson() => {
+        ...super.toJson(),
+        if (typeParameters.isNotEmpty) 'typeParameters': typeParameters,
+        if (parameterTypeIds.isNotEmpty) 'parameterTypeIds': parameterTypeIds,
+        if (optionalParameterTypeIds.isNotEmpty)
+          'optionalParameterTypeIds': optionalParameterTypeIds,
+        if (namedParameterTypeIds.isNotEmpty)
+          'namedParameterTypeIds': namedParameterTypeIds,
+        'returnTypeId': returnTypeId,
+      };
 }
 
 class FunctionSymbol extends ScopeSymbol {
   /// The name of this function.
-  String name;
+  final String name;
 
   /// Unique Id, shared with JS representation (if any).
   ///
@@ -410,232 +446,238 @@
   /// Where scope refers to a Library, Class, Function, or Scope.
   /// String id;
   /// Declared type of this function.
-  String typeId;
+  // TODO(nshahan) Only nullable because unused at this time.
+  final String? typeId;
 
-  /// Is this function static?
-  bool isStatic;
+  /// True if this function is static.
+  final bool isStatic;
 
-  /// Is this function const?
-  bool isConst;
+  /// True if this function is const.
+  final bool isConst;
+
   FunctionSymbol({
-    this.name,
-    this.typeId,
-    this.isStatic,
-    this.isConst,
-    String localId,
-    String scopeId,
-    List<String> variableIds,
-    List<String> scopeIds,
-    SourceLocation location,
-  }) : super(
+    required this.name,
+    required this.typeId,
+    bool? isStatic,
+    bool? isConst,
+    required String localId,
+    required String scopeId,
+    List<String>? variableIds,
+    List<String>? scopeIds,
+    required SourceLocation location,
+  })  : isStatic = isStatic ?? false,
+        isConst = isConst ?? false,
+        super(
           localId: localId,
           scopeId: scopeId,
           variableIds: variableIds,
           scopeIds: scopeIds,
           location: location,
         );
-  FunctionSymbol.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
-    name = _createValue(json['name']);
-    typeId = _createValue(json['typeId']);
-    isStatic = _createValue(json['isStatic']);
-    isConst = _createValue(json['isConst']);
-  }
+
+  FunctionSymbol.fromJson(Map<String, dynamic> json)
+      : name = _createValue(json['name']),
+        typeId = _createValue(json['typeId']),
+        isStatic = _createValue(json['isStatic']),
+        isConst = _createValue(json['isConst']),
+        super.fromJson(json);
+
   @override
-  Map<String, dynamic> toJson() {
-    final json = super.toJson();
-    _setValueIfNotNull(json, 'name', name);
-    _setValueIfNotNull(json, 'typeId', typeId);
-    _setValueIfNotNull(json, 'isStatic', isStatic);
-    _setValueIfNotNull(json, 'isConst', isConst);
-    return json;
-  }
+  Map<String, dynamic> toJson() => {
+        ...super.toJson(),
+        'name': name,
+        if (typeId != null) 'typeId': typeId,
+        'isStatic': isStatic,
+        'isConst': isConst,
+      };
 }
 
 class LibrarySymbol extends ScopeSymbol {
   /// The name of this library.
-  String name;
+  final String name;
 
-  /// Unique Id.
-  ///
-  /// Currently the debugger can find the library uri from JS location
-  /// using source maps and module metadata.
-  ///
-  /// Can be same as library uri.
-  /// String id;
   /// The uri of this library.
-  String uri;
+  final String uri;
 
   /// A list of the imports for this library.
-  List<LibrarySymbolDependency> dependencies;
+  final List<LibrarySymbolDependency> dependencies;
 
   /// A list of the scripts which constitute this library.
-  List<String> scriptIds;
+  final List<String> scriptIds;
+
   LibrarySymbol({
-    this.name,
-    this.uri,
-    this.dependencies,
-    this.scriptIds,
-    List<String> variableIds,
-    List<String> scopeIds,
-  }) : super(
+    String? name,
+    required this.uri,
+    List<LibrarySymbolDependency>? dependencies,
+    required this.scriptIds,
+    List<String>? variableIds,
+    List<String>? scopeIds,
+  })  : name = name ?? '',
+        dependencies = dependencies ?? [],
+        super(
           localId: uri,
           variableIds: variableIds,
           scopeIds: scopeIds,
         );
 
-  LibrarySymbol.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
-    name = _createValue(json['name'], ifNull: '');
-    uri = _createValue(json['uri']);
-    scriptIds = _createValueList(json['scriptIds']);
-    dependencies = _createObjectList(
-        json['dependencies'], (json) => LibrarySymbolDependency.fromJson(json));
-  }
+  LibrarySymbol.fromJson(Map<String, dynamic> json)
+      : name = _createValue(json['name'], ifNull: ''),
+        uri = _createValue(json['uri']),
+        scriptIds = _createValueList(json['scriptIds']),
+        dependencies = _createObjectList(
+            json['dependencies'], LibrarySymbolDependency.fromJson),
+        super.fromJson(json);
+
   @override
   Map<String, dynamic> toJson() {
-    final json = super.toJson();
-    _setValueIfNotNull(json, 'name', name);
-    _setValueIfNotNull(json, 'uri', uri);
-    _setValueIfNotNull(json, 'scriptIds', scriptIds);
-    _setObjectListIfNotNull(json, 'dependencies', dependencies);
+    final json = {
+      ...super.toJson(),
+      if (name.isNotEmpty) 'name': name,
+      'uri': uri,
+      if (scriptIds.isNotEmpty) 'scriptIds': scriptIds,
+    };
+    _setObjectListIfNotNullOrEmpty(json, 'dependencies', dependencies);
     return json;
   }
 }
 
 class LibrarySymbolDependency implements SymbolTableElement {
-  /// Is this dependency an import (rather than an export)?
-  bool isImport;
+  /// True if this dependency an import, false if an an export.
+  final bool isImport;
 
-  /// Is this dependency deferred?
-  bool isDeferred;
+  /// True if this dependency is deferred.
+  final bool isDeferred;
 
   /// The prefix of an 'as' import, or null.
-  String prefix;
+  final String? prefix;
 
   /// The library being imported or exported.
-  String targetId;
+  final String targetId;
+
   LibrarySymbolDependency({
-    this.isImport,
-    this.isDeferred,
+    required this.isImport,
+    bool? isDeferred,
     this.prefix,
-    this.targetId,
-  });
-  LibrarySymbolDependency.fromJson(Map<String, dynamic> json) {
-    isImport = _createValue(json['isImport']);
-    isDeferred = _createValue(json['isDeferred']);
-    prefix = _createValue(json['prefix']);
-    targetId = _createValue(json['targetId']);
-  }
+    required this.targetId,
+  }) : isDeferred = isDeferred ?? false;
+
+  LibrarySymbolDependency.fromJson(Map<String, dynamic> json)
+      : isImport = _createValue(json['isImport']),
+        isDeferred = _createValue(json['isDeferred']),
+        prefix = _createValue(json['prefix']),
+        targetId = _createValue(json['targetId']);
+
   @override
-  Map<String, dynamic> toJson() {
-    final json = <String, dynamic>{};
-    _setValueIfNotNull(json, 'isImport', isImport);
-    _setValueIfNotNull(json, 'isDeferred', isDeferred);
-    _setValueIfNotNull(json, 'prefix', prefix);
-    _setValueIfNotNull(json, 'targetId', targetId);
-    return json;
-  }
+  Map<String, dynamic> toJson() => {
+        'isImport': isImport,
+        'isDeferred': isDeferred,
+        if (prefix != null) 'prefix': prefix,
+        'targetId': targetId,
+      };
 }
 
 class Script implements SymbolTableElement {
   /// The uri from which this script was loaded.
-  String uri;
+  final String uri;
 
   /// Unique Id.
   ///
   /// This can be just an integer. The mapping from JS to dart script
   /// happens using the source map. The id is only used for references
   /// in other elements.
-  String localId;
+  final String localId;
 
-  String libraryId;
+  final String libraryId;
 
   String get id => '$libraryId|$localId';
 
   Script({
-    this.uri,
-    this.localId,
-    this.libraryId,
+    required this.uri,
+    required this.localId,
+    required this.libraryId,
   });
-  Script.fromJson(Map<String, dynamic> json) {
-    uri = _createValue(json['uri']);
-    localId = _createValue(json['localId']);
-    libraryId = _createValue(json['libraryId']);
-  }
-  @override
-  Map<String, dynamic> toJson() {
-    final json = <String, dynamic>{};
-    _setValueIfNotNull(json, 'uri', uri);
-    _setValueIfNotNull(json, 'localId', localId);
-    _setValueIfNotNull(json, 'libraryId', libraryId);
 
-    return json;
-  }
+  Script.fromJson(Map<String, dynamic> json)
+      : uri = _createValue(json['uri']),
+        localId = _createValue(json['localId']),
+        libraryId = _createValue(json['libraryId']);
+
+  @override
+  Map<String, dynamic> toJson() => {
+        'uri': uri,
+        'localId': localId,
+        'libraryId': libraryId,
+      };
 }
 
 class ScopeSymbol extends Symbol {
   /// A list of the top-level variables in this scope.
-  List<String> variableIds;
+  final List<String> variableIds;
 
   /// Enclosed scopes.
   ///
   /// Includes all top classes, functions, inner scopes.
-  List<String> scopeIds;
+  final List<String> scopeIds;
+
   ScopeSymbol({
-    this.variableIds,
-    this.scopeIds,
-    String localId,
-    String scopeId,
-    SourceLocation location,
-  }) : super(
+    List<String>? variableIds,
+    List<String>? scopeIds,
+    required String localId,
+    String? scopeId,
+    SourceLocation? location,
+  })  : variableIds = variableIds ?? [],
+        scopeIds = scopeIds ?? [],
+        super(
           localId: localId,
           scopeId: scopeId,
           location: location,
         );
-  ScopeSymbol.fromJson(Map<String, dynamic> json) : super.fromJson(json) {
-    variableIds = _createValueList(json['variableIds']);
-    scopeIds = _createValueList(json['scopeIds']);
-  }
+
+  ScopeSymbol.fromJson(Map<String, dynamic> json)
+      : variableIds = _createValueList(json['variableIds']),
+        scopeIds = _createValueList(json['scopeIds']),
+        super.fromJson(json);
+
   @override
-  Map<String, dynamic> toJson() {
-    final json = super.toJson();
-    _setValueIfNotNull(json, 'variableIds', variableIds);
-    _setValueIfNotNull(json, 'scopeIds', scopeIds);
-    return json;
-  }
+  Map<String, dynamic> toJson() => {
+        ...super.toJson(),
+        if (variableIds.isNotEmpty) 'variableIds': variableIds,
+        if (scopeIds.isNotEmpty) 'scopeIds': scopeIds,
+      };
 }
 
 class SourceLocation implements SymbolTableElement {
   /// The script containing the source location.
-  String scriptId;
+  final String scriptId;
 
   /// The first token of the location.
-  int tokenPos;
+  final int tokenPos;
 
   /// The last token of the location if this is a range.
-  int endTokenPos;
+  final int? endTokenPos;
+
   SourceLocation({
-    this.scriptId,
-    this.tokenPos,
+    required this.scriptId,
+    required this.tokenPos,
     this.endTokenPos,
   });
-  SourceLocation.fromJson(Map<String, dynamic> json) {
-    scriptId = _createValue(json['scriptId']);
-    tokenPos = _createValue(json['tokenPos']);
-    endTokenPos = _createValue(json['endTokenPos']);
-  }
+
+  SourceLocation.fromJson(Map<String, dynamic> json)
+      : scriptId = _createValue(json['scriptId']),
+        tokenPos = _createValue(json['tokenPos']),
+        endTokenPos = _createValue(json['endTokenPos']);
+
   @override
-  Map<String, dynamic> toJson() {
-    final json = <String, dynamic>{};
-    _setValueIfNotNull(json, 'scriptId', scriptId);
-    _setValueIfNotNull(json, 'tokenPos', tokenPos);
-    _setValueIfNotNull(json, 'endTokenPos', endTokenPos);
-    return json;
-  }
+  Map<String, dynamic> toJson() => {
+        'scriptId': scriptId,
+        'tokenPos': tokenPos,
+        if (endTokenPos != null) 'endTokenPos': endTokenPos,
+      };
 }
 
 List<T> _createObjectList<T>(
     dynamic json, T Function(Map<String, dynamic>) creator) {
-  if (json == null) return null;
+  if (json == null) return <T>[];
   if (json is List) {
     return json.map((e) => _createObject(e, creator)).toList();
   }
@@ -643,16 +685,19 @@
 }
 
 T _createObject<T>(dynamic json, T Function(Map<String, dynamic>) creator) {
-  if (json == null) return null;
   if (json is Map<String, dynamic>) {
     return creator(json);
   }
   throw ArgumentError('Not a map: $json');
 }
 
+T? _createNullableObject<T>(
+        dynamic json, T Function(Map<String, dynamic>) creator) =>
+    json == null ? null : _createObject(json, creator);
+
 List<T> _createValueList<T>(dynamic json,
-    {T ifNull, T Function(String) parse}) {
-  if (json == null) return null;
+    {T? ifNull, T Function(String)? parse}) {
+  if (json == null) return <T>[];
   if (json is List) {
     return json
         .map((e) => _createValue<T>(e, ifNull: ifNull, parse: parse))
@@ -662,12 +707,12 @@
 }
 
 Map<String, T> _createValueMap<T>(dynamic json) {
-  if (json == null) return null;
+  if (json == null) return <String, T>{};
   return Map<String, T>.from(json as Map<String, dynamic>);
 }
 
-T _createValue<T>(dynamic json, {T ifNull, T Function(String) parse}) {
-  if (json == null) return ifNull;
+T _createValue<T>(dynamic json, {T? ifNull, T Function(String)? parse}) {
+  if (json == null && ifNull is T) return ifNull;
   if (json is T) {
     return json;
   }
@@ -677,19 +722,14 @@
   throw ArgumentError('Cannot parse $json as $T');
 }
 
-void _setObjectListIfNotNull<T extends SymbolTableElement>(
-    Map<String, dynamic> json, String key, List<T> values) {
-  if (values == null) return;
-  json[key] = values.map((e) => e?.toJson()).toList();
+void _setObjectListIfNotNullOrEmpty<T extends SymbolTableElement>(
+    Map<String, dynamic> json, String key, List<T>? values) {
+  if (values == null || values.isEmpty) return;
+  json[key] = values.map((e) => e.toJson()).toList();
 }
 
 void _setObjectIfNotNull<T extends SymbolTableElement>(
-    Map<String, dynamic> json, String key, T value) {
+    Map<String, dynamic> json, String key, T? value) {
   if (value == null) return;
-  json[key] = value?.toJson();
-}
-
-void _setValueIfNotNull<T>(Map<String, dynamic> json, String key, T value) {
-  if (value == null) return;
-  json[key] = value;
+  json[key] = value.toJson();
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/module_symbols_collector.dart b/pkg/dev_compiler/lib/src/kernel/module_symbols_collector.dart
index 2b458bb..6eb1acd 100644
--- a/pkg/dev_compiler/lib/src/kernel/module_symbols_collector.dart
+++ b/pkg/dev_compiler/lib/src/kernel/module_symbols_collector.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:front_end/src/fasta/kernel/constructor_tearoff_lowering.dart'
     show isTearOffLowering;
 import 'package:kernel/kernel.dart';
@@ -25,16 +23,7 @@
 
   ModuleSymbolsCollector(String moduleName, this._classJsNames,
       this._memberJsNames, this._procedureJsNames, this._variableJsNames)
-      : _moduleSymbols = ModuleSymbols(
-            version: ModuleSymbols.current.version,
-            moduleName: moduleName,
-            libraries: <LibrarySymbol>[],
-            scripts: <Script>[],
-            classes: <ClassSymbol>[],
-            // TODO(nshahan) functionTypes
-            functions: <FunctionSymbol>[],
-            // TODO(nshahan) scopes
-            variables: <VariableSymbol>[]);
+      : _moduleSymbols = ModuleSymbols(moduleName: moduleName);
 
   ModuleSymbols collectSymbolInfo(Component node) {
     node.accept(this);
@@ -45,7 +34,9 @@
   String _scriptId(Uri fileUri) => fileUri.toString();
 
   /// Returns the id of [type].
-  String _typeId(DartType type) =>
+  // TODO(nshahan) Only nullable until we design how to identify types from
+  // other modules.
+  String? _typeId(DartType type) =>
       // TODO(nshahan) How to handle function types or types from other modules?
       type is InterfaceType ? _classJsNames[type.classNode] : null;
 
@@ -55,15 +46,14 @@
         name: node.name.text,
         // TODO(nshahan) typeId - probably should canonicalize but keep original
         // type argument names.
+        typeId: null,
         // TODO(nshahan) Should we mark all constructors static?
         isStatic: node is Procedure ? node.isStatic : false,
         isConst: node.isConst,
-        localId: _memberJsNames[node] ?? _procedureJsNames[node],
+        localId: _memberJsNames[node] ?? _procedureJsNames[node]!,
         scopeId: _scopes.last.id,
-        variableIds: <String>[],
-        scopeIds: <String>[],
         location: SourceLocation(
-            scriptId: _scriptId(node.location.file),
+            scriptId: _scriptId(node.location!.file),
             tokenPos: node.fileOffset,
             endTokenPos: node.fileEndOffset));
 
@@ -83,22 +73,19 @@
         isConst: node.constructors.any((constructor) => constructor.isConst),
         superClassId: _classJsNames[node.superclass],
         interfaceIds: [
-          for (var type in node.implementedTypes) _classJsNames[type.classNode]
+          for (var type in node.implementedTypes) _classJsNames[type.classNode]!
         ],
         typeParameters: {
           for (var param in node.typeParameters)
             // TODO(nshahan) Value should be the JS name.
-            param.name: param.name
+            param.name!: param.name!
         },
-        localId: _classJsNames[node],
+        localId: _classJsNames[node]!,
         scopeId: _scopes.last.id,
         location: SourceLocation(
-            scriptId: _scriptId(node.location.file),
+            scriptId: _scriptId(node.location!.file),
             tokenPos: node.startFileOffset,
-            endTokenPos: node.fileEndOffset),
-        // Create empty list, they are added in visitField().
-        variableIds: <String>[],
-        scopeIds: <String>[]);
+            endTokenPos: node.fileEndOffset));
 
     _scopes.add(classSymbol);
     node.visitChildren(this);
@@ -122,11 +109,12 @@
         isFinal: node.isFinal,
         isStatic: node.isStatic,
         typeId: _typeId(node.type),
-        localId: _memberJsNames[node],
+        localId: _memberJsNames[node]!,
         scopeId: _scopes.last.id,
         location: SourceLocation(
-            scriptId: _scriptId(node.location.file),
-            tokenPos: node.fileOffset));
+            scriptId: _scriptId(node.location!.file),
+            tokenPos: node.fileOffset,
+            endTokenPos: node.fileEndOffset));
     node.visitChildren(this);
     _scopes.last.variableIds.add(fieldSymbol.id);
     _moduleSymbols.variables.add(fieldSymbol);
@@ -135,18 +123,18 @@
   @override
   void visitLibrary(Library node) {
     var librarySymbol = LibrarySymbol(
-        name: node.name,
-        uri: node.importUri.toString(),
-        dependencies: [
-          for (var dep in node.dependencies)
-            LibrarySymbolDependency(
-                isImport: dep.isImport,
-                isDeferred: dep.isDeferred,
-                // TODO(nshahan) Need to handle prefixes.
-                targetId: dep.targetLibrary.importUri.toString())
-        ],
-        variableIds: <String>[],
-        scopeIds: <String>[]);
+      name: node.name,
+      uri: node.importUri.toString(),
+      dependencies: [
+        for (var dep in node.dependencies)
+          LibrarySymbolDependency(
+              isImport: dep.isImport,
+              isDeferred: dep.isDeferred,
+              // TODO(nshahan) Need to handle prefixes.
+              targetId: dep.targetLibrary.importUri.toString())
+      ],
+      scriptIds: [],
+    );
 
     // TODO(nshahan) Save some space by using integers as local ids?
     var scripts = [
@@ -161,7 +149,7 @@
             libraryId: librarySymbol.id),
     ];
 
-    librarySymbol.scriptIds = [for (var script in scripts) script.id];
+    librarySymbol.scriptIds.addAll(scripts.map((s) => s.id));
     _moduleSymbols.scripts.addAll(scripts);
 
     _scopes.add(librarySymbol);
@@ -195,16 +183,16 @@
   VariableSymbol _createVariableSymbol(
           VariableDeclaration node, VariableSymbolKind kind) =>
       VariableSymbol(
-          name: node.name,
+          name: node.name!,
           kind: kind,
           isConst: node.isConst,
           isFinal: node.isFinal,
           // Static fields are visited in `visitField()`.
           isStatic: false,
           typeId: _typeId(node.type),
-          localId: _variableJsNames[node],
+          localId: _variableJsNames[node]!,
           scopeId: _scopes.last.id,
           location: SourceLocation(
-              scriptId: _scriptId(node.location.file),
+              scriptId: _scriptId(node.location!.file),
               tokenPos: node.fileOffset));
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/native_types.dart b/pkg/dev_compiler/lib/src/kernel/native_types.dart
index ef37392..665f722 100644
--- a/pkg/dev_compiler/lib/src/kernel/native_types.dart
+++ b/pkg/dev_compiler/lib/src/kernel/native_types.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:collection';
+
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
+
 import 'constants.dart';
 import 'kernel_helpers.dart';
 import 'target.dart' show allowedNativeTest;
@@ -154,11 +154,11 @@
     return const [];
   }
 
-  /// If this [annotation] is `@Native` or `@JsPeerInterface`, returns the "name"
-  /// field (which is also the constructor parameter).
-  String _getNativeAnnotationName(Expression annotation) {
+  /// If this [annotation] is `@Native` or `@JsPeerInterface`, returns the
+  /// "name" field (which is also the constructor parameter).
+  String? _getNativeAnnotationName(Expression annotation) {
     if (!_isNativeAnnotation(annotation)) return null;
-    return constants.getFieldValueFromAnnotation(annotation, 'name') as String;
+    return constants.getFieldValueFromAnnotation(annotation, 'name') as String?;
   }
 }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 7985eb6..bb79eb8 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -8,6 +8,7 @@
     show Message, LocatedMessage;
 import 'package:_js_interop_checks/js_interop_checks.dart';
 import 'package:_js_interop_checks/src/transformations/js_util_optimizer.dart';
+import 'package:_js_interop_checks/src/transformations/static_interop_class_eraser.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
@@ -188,6 +189,7 @@
       ChangedStructureNotifier? changedStructureNotifier}) {
     _nativeClasses ??= JsInteropChecks.getNativeClasses(component);
     var jsUtilOptimizer = JsUtilOptimizer(coreTypes, hierarchy);
+    var staticInteropClassEraser = StaticInteropClassEraser(coreTypes);
     for (var library in libraries) {
       _CovarianceTransformer(library).transform();
       JsInteropChecks(
@@ -196,6 +198,7 @@
               _nativeClasses!)
           .visitLibrary(library);
       jsUtilOptimizer.visitLibrary(library);
+      staticInteropClassEraser.visitLibrary(library);
     }
   }
 
diff --git a/pkg/dev_compiler/pubspec.yaml b/pkg/dev_compiler/pubspec.yaml
index f8e49e9..0d15516 100644
--- a/pkg/dev_compiler/pubspec.yaml
+++ b/pkg/dev_compiler/pubspec.yaml
@@ -3,7 +3,7 @@
 publish_to: none
 
 environment:
-  sdk: '>=2.12.0 <3.0.0'
+  sdk: '>=2.15.0 <3.0.0'
 
 dependencies:
   _fe_analyzer_shared: any
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
index bc5786d..90f0eef 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
@@ -117,17 +117,19 @@
     // compilers/components/names per module.
     setup.options.packagesFileUri = packages;
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
-    var component = await compiler.computeDelta();
+    var compilerResult = await compiler.computeDelta();
+    var component = compilerResult.component;
     component.computeCanonicalNames();
     // Initialize DDC.
     var moduleName = p.basenameWithoutExtension(output.toFilePath());
 
-    var classHierarchy = compiler.getClassHierarchy();
+    var classHierarchy = compilerResult.classHierarchy;
     var compilerOptions = SharedCompilerOptions(
         replCompile: true,
         moduleName: moduleName,
-        soundNullSafety: setup.soundNullSafety);
-    var coreTypes = compiler.getCoreTypes();
+        soundNullSafety: setup.soundNullSafety,
+        emitDebugMetadata: true);
+    var coreTypes = compilerResult.coreTypes;
 
     final importToSummary = Map<Library, Component>.identity();
     final summaryToModule = Map<Component, String>.identity();
@@ -145,10 +147,10 @@
     var code = jsProgramToCode(
       module,
       setup.moduleFormat,
-      inlineSourceMap: true,
-      buildSourceMap: true,
-      emitDebugMetadata: true,
-      emitDebugSymbols: true,
+      inlineSourceMap: compilerOptions.inlineSourceMap,
+      buildSourceMap: compilerOptions.sourceMap,
+      emitDebugMetadata: compilerOptions.emitDebugMetadata,
+      emitDebugSymbols: compilerOptions.emitDebugSymbols,
       jsUrl: '$output',
       mapUrl: '$output.map',
       compiler: kernel2jsCompiler,
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
index 66db5dd..8dc187d 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
@@ -76,18 +76,19 @@
     // initialize incremental compiler and create component
     setup.options.packagesFileUri = packages;
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
-    var component = await compiler.computeDelta();
+    var compilerResult = await compiler.computeDelta();
+    var component = compilerResult.component;
     component.computeCanonicalNames();
 
     // initialize ddc
     var moduleName = 'foo.dart';
-    var classHierarchy = compiler.getClassHierarchy();
+    var classHierarchy = compilerResult.classHierarchy;
     var compilerOptions = SharedCompilerOptions(
         replCompile: true,
         moduleName: moduleName,
         soundNullSafety: setup.soundNullSafety,
         moduleFormats: [setup.moduleFormat]);
-    var coreTypes = compiler.getCoreTypes();
+    var coreTypes = compilerResult.coreTypes;
 
     final importToSummary = Map<Library, Component>.identity();
     final summaryToModule = Map<Component, String>.identity();
diff --git a/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart b/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
index e1af8a8..6ebcbba 100644
--- a/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/class_symbols_test.dart
@@ -71,12 +71,10 @@
             expect(classSymbol.location.scriptId, endsWith('/foo.dart'));
           });
           test('has start token', () async {
-            expect(classSymbol.location.tokenPos,
-                22 + options.dartLangComment.length);
+            expect(classSymbol.location.tokenPos, source.indexOf('class A'));
           });
           test('has end token', () async {
-            expect(classSymbol.location.endTokenPos,
-                31 + options.dartLangComment.length);
+            expect(classSymbol.location.endTokenPos, source.lastIndexOf('}'));
           });
         });
         test('no fields', () async {
diff --git a/pkg/dev_compiler/test/module_symbols/function_symbols_test.dart b/pkg/dev_compiler/test/module_symbols/function_symbols_test.dart
index f39f27b..9c58e06 100644
--- a/pkg/dev_compiler/test/module_symbols/function_symbols_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/function_symbols_test.dart
@@ -66,11 +66,11 @@
           });
           test('has start token', () async {
             expect(functionSymbol.location.tokenPos,
-                27 + options.dartLangComment.length);
+                source.indexOf('topLevelFunction'));
           });
           test('has end token', () async {
-            expect(functionSymbol.location.endTokenPos,
-                78 + options.dartLangComment.length);
+            expect(
+                functionSymbol.location.endTokenPos, source.lastIndexOf('}'));
           });
         });
         test('id in LibrarySymbol scopes', () async {
diff --git a/pkg/dev_compiler/test/module_symbols/module_symbols_json_test.dart b/pkg/dev_compiler/test/module_symbols/module_symbols_json_test.dart
index 586f202..ad23ffd 100644
--- a/pkg/dev_compiler/test/module_symbols/module_symbols_json_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/module_symbols_json_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
-
 import 'package:dev_compiler/src/kernel/module_symbols.dart';
 import 'package:test/test.dart';
 
@@ -26,7 +24,12 @@
 ''';
 
 void main() {
-  var intType = ClassSymbol(name: 'int', localId: 'int', scopeId: 'dart:core');
+  var intType = ClassSymbol(
+      name: 'int',
+      localId: 'int',
+      scopeId: 'dart:core',
+      location: SourceLocation(
+          scriptId: 'sdkIdForTest', tokenPos: 42, endTokenPos: 42));
 
   var libraryId = 'lib1';
   var main = Script(
@@ -243,14 +246,16 @@
 
   test('Read supported version', () {
     var version = SemanticVersion(0, 2, 3).version;
-    var json = ModuleSymbols(version: version).toJson();
+    var json = ModuleSymbols(version: version, moduleName: 'moduleNameForTest')
+        .toJson();
 
     expect(ModuleSymbols.fromJson(json).version, equals(version));
   });
 
   test('Read unsupported version', () {
     var version = SemanticVersion(1, 2, 3).version;
-    var json = ModuleSymbols(version: version).toJson();
+    var json = ModuleSymbols(version: version, moduleName: 'moduleNameForTest')
+        .toJson();
 
     expect(() => ModuleSymbols.fromJson(json), throwsException);
   });
@@ -300,7 +305,8 @@
     .having((cls) => cls.libraryId, 'libraryId', other.libraryId)
     .having((cls) => cls.scopeIds, 'scopeIds', other.scopeIds)
     .having((cls) => cls.variableIds, 'variableIds', other.variableIds)
-    .having((cls) => cls.location, 'location', matchesLocation(other.location));
+    .having(
+        (cls) => cls.location, 'location', matchesLocation(other.location!));
 
 TypeMatcher<FunctionTypeSymbol> matchesFunctionType(FunctionTypeSymbol other) =>
     isA<FunctionTypeSymbol>()
@@ -315,8 +321,8 @@
             'optionalParameterTypeIds', other.optionalParameterTypeIds)
         .having((fun) => fun.namedParameterTypeIds, 'namedParameterTypeIds',
             other.namedParameterTypeIds)
-        .having(
-            (fun) => fun.location, 'location', matchesLocation(other.location));
+        .having((fun) => fun.location, 'location',
+            matchesLocation(other.location!));
 
 TypeMatcher<FunctionSymbol> matchesFunction(FunctionSymbol other) =>
     isA<FunctionSymbol>()
@@ -329,8 +335,8 @@
         .having((fun) => fun.typeId, 'typeId', other.typeId)
         .having((fun) => fun.scopeIds, 'scopeIds', other.scopeIds)
         .having((fun) => fun.variableIds, 'variableIds', other.variableIds)
-        .having(
-            (fun) => fun.location, 'location', matchesLocation(other.location));
+        .having((fun) => fun.location, 'location',
+            matchesLocation(other.location!));
 
 TypeMatcher<ScopeSymbol> matchesScope(ScopeSymbol other) => isA<ScopeSymbol>()
     .having((scope) => scope.localId, 'localId', other.localId)
@@ -338,8 +344,8 @@
     .having((scope) => scope.id, 'id', other.id)
     .having((scope) => scope.scopeIds, 'scopeIds', other.scopeIds)
     .having((scope) => scope.variableIds, 'variableIds', other.variableIds)
-    .having(
-        (scope) => scope.location, 'location', matchesLocation(other.location));
+    .having((scope) => scope.location, 'location',
+        matchesLocation(other.location!));
 
 TypeMatcher<VariableSymbol> matchesVariable(VariableSymbol other) =>
     isA<VariableSymbol>()
@@ -351,7 +357,7 @@
         .having((variable) => variable.isStatic, 'isStatic', other.isStatic)
         .having((variable) => variable.isFinal, 'isFinal', other.isFinal)
         .having((variable) => variable.location, 'location',
-            matchesLocation(other.location));
+            matchesLocation(other.location!));
 
 TypeMatcher<Script> matchesScript(Script other) => isA<Script>()
     .having((script) => script.uri, 'uri', other.uri)
diff --git a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
index 4fb6eb6..b607f71 100644
--- a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
+++ b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
@@ -21,7 +21,8 @@
     // Initialize incremental compiler and create component.
     setup.options.packagesFileUri = packages;
     var compiler = DevelopmentIncrementalCompiler(setup.options, input);
-    var component = await compiler.computeDelta();
+    var compilerResult = await compiler.computeDelta();
+    var component = compilerResult.component;
     component.computeCanonicalNames();
     var errors = setup.errors.where((e) => e.contains('Error'));
     if (errors.isNotEmpty) {
@@ -30,14 +31,14 @@
 
     // Initialize DDC.
     var moduleName = 'foo.dart';
-    var classHierarchy = compiler.getClassHierarchy();
+    var classHierarchy = compilerResult.classHierarchy;
     var compilerOptions = SharedCompilerOptions(
         replCompile: true,
         moduleName: moduleName,
         soundNullSafety: setup.soundNullSafety,
         moduleFormats: [setup.moduleFormat],
         emitDebugSymbols: true);
-    var coreTypes = compiler.getCoreTypes();
+    var coreTypes = compilerResult.coreTypes;
 
     final importToSummary = Map<Library, Component>.identity();
     final summaryToModule = Map<Component, String>.identity();
diff --git a/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart b/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
index 64b3e57..b6421d1 100644
--- a/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
+++ b/pkg/dev_compiler/test/module_symbols/variable_symbols_test.dart
@@ -62,10 +62,13 @@
           test('has scriptId', () async {
             expect(variableSymbol.location.scriptId, endsWith('/foo.dart'));
           });
-          test('only start token', () async {
+          test('start token position', () async {
             expect(variableSymbol.location.tokenPos,
-                47 + options.dartLangComment.length);
-            expect(variableSymbol.location.endTokenPos, null);
+                source.indexOf('globalVariable'));
+          });
+          test('end token position', () async {
+            expect(
+                variableSymbol.location.endTokenPos, source.lastIndexOf(';'));
           });
         });
       });
diff --git a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
index 82e0be2..ad18584 100644
--- a/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
+++ b/pkg/dev_compiler/test/sourcemap/testfiles/step_through_async_star_yield.dart
@@ -5,7 +5,7 @@
 // @dart = 2.9
 
 void main() async {
-  await for (var i in foobar()) {
+  await for (var i in foobar() as Stream) {
     print(i);
   }
   print('Done!');
diff --git a/pkg/front_end/analysis_options_no_lints.yaml b/pkg/front_end/analysis_options_no_lints.yaml
index d699e16..cc832b8 100644
--- a/pkg/front_end/analysis_options_no_lints.yaml
+++ b/pkg/front_end/analysis_options_no_lints.yaml
@@ -4,6 +4,7 @@
 
 analyzer:
   exclude:
+    - outline_extraction_testcases/**
     - parser_testcases/**
     - test/analyser_ignored/**
     - test/class_hierarchy/data/**
@@ -11,6 +12,7 @@
     - test/extensions/data/**
     - test/id_testing/data/**
     - test/language_versioning/data/**
+    - test/macros/data/**
     - test/patching/data/**
     - test/predicates/data/**
     - test/static_types/data/**
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 4f3c912..4dd9122 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
@@ -19,6 +19,7 @@
   extensionMethods,
   extensionTypes,
   genericMetadata,
+  macros,
   namedArgumentsAnywhere,
   nonNullable,
   nonfunctionTypeAliases,
@@ -32,25 +33,26 @@
 }
 
 const Version enableAlternativeInvalidationStrategyVersion =
-    const Version(2, 15);
-const Version enableConstFunctionsVersion = const Version(2, 15);
+    const Version(2, 16);
+const Version enableConstFunctionsVersion = const Version(2, 16);
 const Version enableConstantUpdate2018Version = const Version(2, 0);
 const Version enableConstructorTearoffsVersion = const Version(2, 15);
 const Version enableControlFlowCollectionsVersion = const Version(2, 0);
-const Version enableEnhancedEnumsVersion = const Version(2, 15);
+const Version enableEnhancedEnumsVersion = const Version(2, 16);
 const Version enableExtensionMethodsVersion = const Version(2, 6);
-const Version enableExtensionTypesVersion = const Version(2, 15);
+const Version enableExtensionTypesVersion = const Version(2, 16);
 const Version enableGenericMetadataVersion = const Version(2, 14);
-const Version enableNamedArgumentsAnywhereVersion = const Version(2, 15);
+const Version enableMacrosVersion = const Version(2, 16);
+const Version enableNamedArgumentsAnywhereVersion = const Version(2, 16);
 const Version enableNonNullableVersion = const Version(2, 12);
 const Version enableNonfunctionTypeAliasesVersion = const Version(2, 13);
 const Version enableSetLiteralsVersion = const Version(2, 0);
 const Version enableSpreadCollectionsVersion = const Version(2, 0);
-const Version enableSuperParametersVersion = const Version(2, 15);
-const Version enableTestExperimentVersion = const Version(2, 15);
+const Version enableSuperParametersVersion = const Version(2, 16);
+const Version enableTestExperimentVersion = const Version(2, 16);
 const Version enableTripleShiftVersion = const Version(2, 14);
-const Version enableValueClassVersion = const Version(2, 15);
-const Version enableVarianceVersion = const Version(2, 15);
+const Version enableValueClassVersion = const Version(2, 16);
+const Version enableVarianceVersion = const Version(2, 16);
 
 ExperimentalFlag? parseExperimentalFlag(String flag) {
   switch (flag) {
@@ -72,6 +74,8 @@
       return ExperimentalFlag.extensionTypes;
     case "generic-metadata":
       return ExperimentalFlag.genericMetadata;
+    case "macros":
+      return ExperimentalFlag.macros;
     case "named-arguments-anywhere":
       return ExperimentalFlag.namedArgumentsAnywhere;
     case "non-nullable":
@@ -106,6 +110,7 @@
   ExperimentalFlag.extensionMethods: true,
   ExperimentalFlag.extensionTypes: false,
   ExperimentalFlag.genericMetadata: true,
+  ExperimentalFlag.macros: false,
   ExperimentalFlag.namedArgumentsAnywhere: false,
   ExperimentalFlag.nonNullable: true,
   ExperimentalFlag.nonfunctionTypeAliases: true,
@@ -128,6 +133,7 @@
   ExperimentalFlag.extensionMethods: true,
   ExperimentalFlag.extensionTypes: false,
   ExperimentalFlag.genericMetadata: true,
+  ExperimentalFlag.macros: false,
   ExperimentalFlag.namedArgumentsAnywhere: false,
   ExperimentalFlag.nonNullable: true,
   ExperimentalFlag.nonfunctionTypeAliases: true,
@@ -141,47 +147,49 @@
 };
 
 const Map<ExperimentalFlag, Version> experimentEnabledVersion = {
-  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 15),
-  ExperimentalFlag.constFunctions: const Version(2, 15),
+  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 16),
+  ExperimentalFlag.constFunctions: const Version(2, 16),
   ExperimentalFlag.constantUpdate2018: const Version(2, 0),
   ExperimentalFlag.constructorTearoffs: const Version(2, 15),
   ExperimentalFlag.controlFlowCollections: const Version(2, 0),
-  ExperimentalFlag.enhancedEnums: const Version(2, 15),
+  ExperimentalFlag.enhancedEnums: const Version(2, 16),
   ExperimentalFlag.extensionMethods: const Version(2, 6),
-  ExperimentalFlag.extensionTypes: const Version(2, 15),
+  ExperimentalFlag.extensionTypes: const Version(2, 16),
   ExperimentalFlag.genericMetadata: const Version(2, 14),
-  ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 15),
+  ExperimentalFlag.macros: const Version(2, 16),
+  ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 16),
   ExperimentalFlag.nonNullable: const Version(2, 12),
   ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 13),
   ExperimentalFlag.setLiterals: const Version(2, 0),
   ExperimentalFlag.spreadCollections: const Version(2, 0),
-  ExperimentalFlag.superParameters: const Version(2, 15),
-  ExperimentalFlag.testExperiment: const Version(2, 15),
+  ExperimentalFlag.superParameters: const Version(2, 16),
+  ExperimentalFlag.testExperiment: const Version(2, 16),
   ExperimentalFlag.tripleShift: const Version(2, 14),
-  ExperimentalFlag.valueClass: const Version(2, 15),
-  ExperimentalFlag.variance: const Version(2, 15),
+  ExperimentalFlag.valueClass: const Version(2, 16),
+  ExperimentalFlag.variance: const Version(2, 16),
 };
 
 const Map<ExperimentalFlag, Version> experimentReleasedVersion = {
-  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 15),
-  ExperimentalFlag.constFunctions: const Version(2, 15),
+  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 16),
+  ExperimentalFlag.constFunctions: const Version(2, 16),
   ExperimentalFlag.constantUpdate2018: const Version(2, 0),
   ExperimentalFlag.constructorTearoffs: const Version(2, 15),
   ExperimentalFlag.controlFlowCollections: const Version(2, 0),
-  ExperimentalFlag.enhancedEnums: const Version(2, 15),
+  ExperimentalFlag.enhancedEnums: const Version(2, 16),
   ExperimentalFlag.extensionMethods: const Version(2, 6),
-  ExperimentalFlag.extensionTypes: const Version(2, 15),
+  ExperimentalFlag.extensionTypes: const Version(2, 16),
   ExperimentalFlag.genericMetadata: const Version(2, 14),
-  ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 15),
+  ExperimentalFlag.macros: const Version(2, 16),
+  ExperimentalFlag.namedArgumentsAnywhere: const Version(2, 16),
   ExperimentalFlag.nonNullable: const Version(2, 10),
   ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 13),
   ExperimentalFlag.setLiterals: const Version(2, 0),
   ExperimentalFlag.spreadCollections: const Version(2, 0),
-  ExperimentalFlag.superParameters: const Version(2, 15),
-  ExperimentalFlag.testExperiment: const Version(2, 15),
+  ExperimentalFlag.superParameters: const Version(2, 16),
+  ExperimentalFlag.testExperiment: const Version(2, 16),
   ExperimentalFlag.tripleShift: const Version(2, 14),
-  ExperimentalFlag.valueClass: const Version(2, 15),
-  ExperimentalFlag.variance: const Version(2, 15),
+  ExperimentalFlag.valueClass: const Version(2, 16),
+  ExperimentalFlag.variance: const Version(2, 16),
 };
 
 const AllowedExperimentalFlags defaultAllowedExperimentalFlags =
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index d28d71c..ae632ec 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -10,7 +10,7 @@
 import 'package:kernel/core_types.dart' show CoreTypes;
 
 import 'package:kernel/kernel.dart'
-    show Component, Procedure, DartType, TypeParameter;
+    show Component, Library, Procedure, DartType, TypeParameter;
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
@@ -70,17 +70,13 @@
         component);
   }
 
-  /// Returns a component whose libraries are the recompiled libraries,
-  /// or - in the case of [fullComponent] - a full Component.
-  Future<Component> computeDelta({List<Uri>? entryPoints, bool fullComponent});
-
-  /// Returns [CoreTypes] used during compilation.
-  /// Valid after [computeDelta] is called.
-  CoreTypes? getCoreTypes();
-
-  /// Returns [ClassHierarchy] used during compilation.
-  /// Valid after [computeDelta] is called.
-  ClassHierarchy? getClassHierarchy();
+  /// Returns an [IncrementalCompilerResult] with the component whose libraries
+  /// are the recompiled libraries, or - in the case of [fullComponent] - a full
+  /// Component.
+  Future<IncrementalCompilerResult> computeDelta(
+      {List<Uri>? entryPoints,
+      bool fullComponent: false,
+      bool trackNeededDillLibraries: false});
 
   /// Remove the file associated with the given file [uri] from the set of
   /// valid files.  This guarantees that those files will be re-read on the
@@ -149,3 +145,13 @@
 bool isLegalIdentifier(String identifier) {
   return StringScanner.isLegalIdentifier(identifier);
 }
+
+class IncrementalCompilerResult {
+  final Component component;
+  final ClassHierarchy? classHierarchy;
+  final CoreTypes? coreTypes;
+  final Set<Library>? neededDillLibraries;
+
+  IncrementalCompilerResult(this.component,
+      {this.classHierarchy, this.coreTypes, this.neededDillLibraries});
+}
diff --git a/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart b/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
index 1375e06a..85f6052 100644
--- a/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
+++ b/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
@@ -5,6 +5,11 @@
 import 'package:kernel/ast.dart';
 import '../fasta/kernel/late_lowering.dart';
 import '../fasta/source/source_extension_builder.dart' show extensionThisName;
+export '../fasta/kernel/constructor_tearoff_lowering.dart'
+    show
+        isConstructorTearOffLowering,
+        isTearOffLowering,
+        isTypedefTearOffLowering;
 
 /// Returns `true` if [node] is the field holding the value of a lowered late
 /// field.
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 7d167c4..217bb40 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -137,8 +137,9 @@
 
 Future<CompilerResult> _compile(InitializedCompilerState compilerState,
     List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler,
-    {bool? summaryOnly, bool includeOffsets: true}) {
-  summaryOnly ??= true;
+    {bool? buildSummary, bool? buildComponent, bool includeOffsets: true}) {
+  buildSummary ??= true;
+  buildComponent ??= true;
   CompilerOptions options = compilerState.options;
   options..onDiagnostic = diagnosticMessageHandler;
 
@@ -147,8 +148,8 @@
   processedOpts.inputs.addAll(inputs);
 
   return generateKernel(processedOpts,
-      buildSummary: summaryOnly,
-      buildComponent: !summaryOnly,
+      buildSummary: buildSummary,
+      buildComponent: buildComponent,
       includeOffsets: includeOffsets);
 }
 
@@ -157,15 +158,18 @@
     {bool includeOffsets: false}) async {
   CompilerResult result = await _compile(
       compilerState, inputs, diagnosticMessageHandler,
-      summaryOnly: true, includeOffsets: includeOffsets);
+      buildSummary: true,
+      buildComponent: false,
+      includeOffsets: includeOffsets);
   return result.summary;
 }
 
 Future<Component?> compileComponent(InitializedCompilerState compilerState,
-    List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler) async {
+    List<Uri> inputs, DiagnosticMessageHandler diagnosticMessageHandler,
+    {bool buildSummary: true}) async {
   CompilerResult result = await _compile(
       compilerState, inputs, diagnosticMessageHandler,
-      summaryOnly: false);
+      buildSummary: buildSummary, buildComponent: true);
 
   Component? component = result.component;
   if (component != null) {
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 0d7c334..2ebfdf1 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -85,9 +85,10 @@
   final Component? sdkSummary;
   final List<Component> additionalDills;
   final ClassHierarchy classHierarchy;
+  final Set<Library>? neededDillLibraries;
 
   DdcResult(this.component, this.sdkSummary, this.additionalDills,
-      this.classHierarchy)
+      this.classHierarchy, this.neededDillLibraries)
       // ignore: unnecessary_null_comparison
       : assert(classHierarchy != null);
 
@@ -221,5 +222,5 @@
   Component? sdkSummary = await processedOpts.loadSdkSummary(null);
   List<Component> summaries = await processedOpts.loadAdditionalDills(null);
   return new DdcResult(
-      component, sdkSummary, summaries, compilerResult.classHierarchy!);
+      component, sdkSummary, summaries, compilerResult.classHierarchy!, null);
 }
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
index 65eceae..346a4ae 100644
--- a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
@@ -121,7 +121,6 @@
             new CompilerContext(processedOpts),
             cachedSdkInput.component,
             outlineOnly);
-        incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
       } else {
         options = oldState.options;
         processedOpts = oldState.processedOpts;
@@ -144,7 +143,6 @@
         // Reuse the incremental compiler, but reset as needed.
         incrementalCompiler = oldState.incrementalCompiler!;
         incrementalCompiler.invalidateAllSources();
-        incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
         options.packagesFileUri = packagesFile;
         options.fileSystem = fileSystem;
         processedOpts.clearFileSystemCache();
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
index 141014c..b915847 100644
--- a/pkg/front_end/lib/src/api_unstable/vm.dart
+++ b/pkg/front_end/lib/src/api_unstable/vm.dart
@@ -24,7 +24,11 @@
 export '../api_prototype/front_end.dart' show CompilerResult;
 
 export '../api_prototype/incremental_kernel_generator.dart'
-    show IncrementalKernelGenerator, IncrementalSerializer, isLegalIdentifier;
+    show
+        IncrementalCompilerResult,
+        IncrementalKernelGenerator,
+        IncrementalSerializer,
+        isLegalIdentifier;
 
 export '../api_prototype/kernel_generator.dart'
     show kernelForModule, kernelForProgram;
@@ -50,6 +54,8 @@
 export '../fasta/fasta_codes.dart'
     show
         LocatedMessage,
+        messageFfiAbiSpecificIntegerInvalid,
+        messageFfiAbiSpecificIntegerMappingInvalid,
         messageFfiExceptionalReturnNull,
         messageFfiExpectedConstant,
         messageFfiLeafCallMustNotReturnHandle,
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index b1377c6..521d5ab 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -557,6 +557,15 @@
       return _packages = await createPackagesFromFile(_raw.packagesFileUri!);
     }
 
+    if (inputs.isEmpty) {
+      return _packages = PackageConfig.empty;
+    }
+
+    // When compiling the SDK the input files are normally `dart:` URIs.
+    if (inputs.every((uri) => uri.scheme == 'dart')) {
+      return _packages = PackageConfig.empty;
+    }
+
     if (inputs.length > 1) {
       // TODO(sigmund): consider not reporting an error if we would infer
       // the same .packages file from all of the inputs.
@@ -564,15 +573,9 @@
           messageCantInferPackagesFromManyInputs, Severity.error);
       return _packages = PackageConfig.empty;
     }
-    if (inputs.isEmpty) {
-      return _packages = PackageConfig.empty;
-    }
 
     Uri input = inputs.first;
 
-    // When compiling the SDK the input files are normally `dart:` URIs.
-    if (input.scheme == 'dart') return _packages = PackageConfig.empty;
-
     if (input.scheme == 'packages') {
       report(
           messageCantInferPackagesFromPackageUri.withLocation(
@@ -581,7 +584,7 @@
       return _packages = PackageConfig.empty;
     }
 
-    return _packages = await _findPackages(inputs.first);
+    return _packages = await _findPackages(input);
   }
 
   Future<Uint8List?> _readFile(Uri uri, bool reportError) async {
diff --git a/pkg/front_end/lib/src/fasta/builder/builder.dart b/pkg/front_end/lib/src/fasta/builder/builder.dart
index f933d9f..7b208f1 100644
--- a/pkg/front_end/lib/src/fasta/builder/builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builder.dart
@@ -200,10 +200,6 @@
   /// Returns the number of patches that was finished.
   int finishPatch();
 
-  /// Resolve constructors (lookup names in scope) recorded in this builder and
-  /// return the number of constructors resolved.
-  int resolveConstructors(covariant Builder? parent);
-
   /// Return `true` if this builder is a duplicate of another with the same
   /// name. This is `false` for the builder first declared amongst duplicates.
   bool get isDuplicate;
@@ -305,8 +301,5 @@
   }
 
   @override
-  int resolveConstructors(covariant Builder parent) => 0;
-
-  @override
   bool get isDuplicate => next != null;
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index c8ffab5..eb36433 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -23,7 +23,8 @@
         TypeParameter,
         getAsTypeArguments;
 
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/class_hierarchy.dart'
+    show ClassHierarchy, ClassHierarchyMembers;
 
 import 'package:kernel/core_types.dart' show CoreTypes;
 
@@ -36,8 +37,6 @@
 
 import 'package:kernel/src/legacy_erasure.dart';
 
-import 'package:kernel/src/types.dart' show Types;
-
 import '../dill/dill_member_builder.dart';
 
 import '../fasta_codes.dart';
@@ -112,6 +111,8 @@
 
   bool get isAbstract;
 
+  bool get isMacro;
+
   bool get declaresConstConstructor;
 
   bool get isMixin;
@@ -178,7 +179,10 @@
 
   void checkSupertypes(CoreTypes coreTypes);
 
-  void handleSeenCovariant(Types types, Member interfaceMember, bool isSetter,
+  void handleSeenCovariant(
+      ClassHierarchyMembers memberHierarchy,
+      Member interfaceMember,
+      bool isSetter,
       callback(Member interfaceMember, bool isSetter));
 
   bool hasUserDefinedNoSuchMethod(
@@ -767,12 +771,15 @@
   }
 
   @override
-  void handleSeenCovariant(Types types, Member interfaceMember, bool isSetter,
+  void handleSeenCovariant(
+      ClassHierarchyMembers memberHierarchy,
+      Member interfaceMember,
+      bool isSetter,
       callback(Member interfaceMember, bool isSetter)) {
     // When a parameter is covariant we have to check that we also
     // override the same member in all parents.
     for (Supertype supertype in interfaceMember.enclosingClass!.supers) {
-      Member? member = types.hierarchy.getInterfaceMember(
+      Member? member = memberHierarchy.getInterfaceMember(
           supertype.classNode, interfaceMember.name,
           setter: isSetter);
       if (member != null) {
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index 1031699..f53cbfa 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -14,10 +14,10 @@
 import '../dill/dill_member_builder.dart';
 
 import '../kernel/body_builder.dart' show BodyBuilder;
-import '../kernel/class_hierarchy_builder.dart' show ClassMember;
 import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/expression_generator_helper.dart'
     show ExpressionGeneratorHelper;
+import '../kernel/hierarchy/class_member.dart' show ClassMember;
 import '../kernel/utils.dart'
     show isRedirectingGenerativeConstructorImplementation;
 import '../kernel/kernel_helper.dart' show SynthesizedFunctionNode;
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 2a94404..ecc964c 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -120,7 +120,8 @@
       int startCharOffset,
       int charOffset,
       int charEndOffset,
-      IndexedClass? referencesFromIndexed) {
+      IndexedClass? referencesFromIndexed,
+      Scope scope) {
     assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
 
     Uri fileUri = parent.fileUri;
@@ -170,6 +171,7 @@
         reference: referencesFromIndexed?.cls.reference,
         fileUri: fileUri);
     Map<String, MemberBuilder> members = <String, MemberBuilder>{};
+    Map<String, MemberBuilder> setters = <String, MemberBuilder>{};
     Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
     NamedTypeBuilder selfType = new NamedTypeBuilder(
         name,
@@ -357,11 +359,18 @@
     }
     final int startCharOffsetComputed =
         metadata == null ? startCharOffset : metadata.first.charOffset;
+    scope.forEachLocalMember((name, member) {
+      members[name] = member as MemberBuilder;
+    });
+    scope.forEachLocalSetter((name, member) {
+      setters[name] = member;
+    });
     EnumBuilder enumBuilder = new EnumBuilder.internal(
         metadata,
         name,
         new Scope(
             local: members,
+            setters: setters,
             parent: parent.scope,
             debugName: "enum $name",
             isModifiable: false),
diff --git a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
index 5db68f5..86c7b96 100644
--- a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
@@ -8,9 +8,9 @@
 
 import '../dill/dill_member_builder.dart';
 
-import '../kernel/class_hierarchy_builder.dart';
 import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/forest.dart';
+import '../kernel/hierarchy/class_member.dart';
 import '../kernel/internal_ast.dart';
 import '../kernel/kernel_helper.dart';
 import '../kernel/redirecting_factory_body.dart'
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 229ddf9..8acdc68 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -16,7 +16,8 @@
 import '../fasta_codes.dart' show messageInternalProblemAlreadyInitialized;
 
 import '../kernel/body_builder.dart' show BodyBuilder;
-import '../kernel/class_hierarchy_builder.dart';
+import '../kernel/hierarchy/class_member.dart';
+import '../kernel/hierarchy/members_builder.dart';
 import '../kernel/implicit_field_type.dart';
 import '../kernel/kernel_helper.dart';
 import '../kernel/late_lowering.dart' as late_lowering;
@@ -311,10 +312,10 @@
     _overrideDependencies!.addAll(overriddenMembers);
   }
 
-  void _ensureType(ClassHierarchyBuilder hierarchy) {
+  void _ensureType(ClassMembersBuilder membersBuilder) {
     if (_typeEnsured) return;
     if (_overrideDependencies != null) {
-      hierarchy.inferFieldType(this, _overrideDependencies!);
+      membersBuilder.inferFieldType(this, _overrideDependencies!);
       _overrideDependencies = null;
     } else {
       inferType();
@@ -765,8 +766,8 @@
       : assert(forSetter != null);
 
   @override
-  void inferType(ClassHierarchyBuilder hierarchy) {
-    memberBuilder._ensureType(hierarchy);
+  void inferType(ClassMembersBuilder membersBuilder) {
+    memberBuilder._ensureType(membersBuilder);
   }
 
   @override
@@ -775,15 +776,16 @@
   }
 
   @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    memberBuilder._ensureType(hierarchy);
+  Member getMember(ClassMembersBuilder membersBuilder) {
+    memberBuilder._ensureType(membersBuilder);
     return memberBuilder.field;
   }
 
   @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+  Covariance getCovariance(ClassMembersBuilder membersBuilder) {
     return _covariance ??= forSetter
-        ? new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter)
+        ? new Covariance.fromMember(getMember(membersBuilder),
+            forSetter: forSetter)
         : const Covariance.empty();
   }
 
@@ -1433,20 +1435,20 @@
       : assert(isInternalImplementation != null);
 
   @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    fieldBuilder._ensureType(hierarchy);
+  Member getMember(ClassMembersBuilder membersBuilder) {
+    fieldBuilder._ensureType(membersBuilder);
     return _member;
   }
 
   @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
-    return _covariance ??=
-        new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter);
+  Covariance getCovariance(ClassMembersBuilder membersBuilder) {
+    return _covariance ??= new Covariance.fromMember(getMember(membersBuilder),
+        forSetter: forSetter);
   }
 
   @override
-  void inferType(ClassHierarchyBuilder hierarchy) {
-    fieldBuilder._ensureType(hierarchy);
+  void inferType(ClassMembersBuilder membersBuilder) {
+    fieldBuilder._ensureType(membersBuilder);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
index 3e47192..5c954d0 100644
--- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
@@ -117,13 +117,19 @@
 
   bool get isInitializingFormal => (modifiers & initializingFormalMask) != 0;
 
+  bool get isSuperInitializingFormal =>
+      (modifiers & superInitializingFormalMask) != 0;
+
   bool get isCovariantByDeclaration => (modifiers & covariantMask) != 0;
 
   // An initializing formal parameter might be final without its
   // VariableDeclaration being final. See
   // [ProcedureBuilder.computeFormalParameterInitializerScope]..
   @override
-  bool get isAssignable => variable!.isAssignable && !isInitializingFormal;
+  bool get isAssignable =>
+      variable!.isAssignable &&
+      !isInitializingFormal &&
+      !isSuperInitializingFormal;
 
   @override
   String get fullNameForErrors => name;
@@ -171,19 +177,33 @@
   FormalParameterBuilder forFormalParameterInitializerScope() {
     // ignore: unnecessary_null_comparison
     assert(variable != null);
-    return !isInitializingFormal
-        ? this
-        : (new FormalParameterBuilder(
-            metadata,
-            modifiers | finalMask | initializingFormalMask,
-            type,
-            name,
-            null,
-            charOffset,
-            fileUri: fileUri,
-            isExtensionThis: isExtensionThis)
-          ..parent = parent
-          ..variable = variable);
+    if (isInitializingFormal) {
+      return new FormalParameterBuilder(
+          metadata,
+          modifiers | finalMask | initializingFormalMask,
+          type,
+          name,
+          null,
+          charOffset,
+          fileUri: fileUri,
+          isExtensionThis: isExtensionThis)
+        ..parent = parent
+        ..variable = variable;
+    } else if (isSuperInitializingFormal) {
+      return new FormalParameterBuilder(
+          metadata,
+          modifiers | finalMask | superInitializingFormalMask,
+          type,
+          name,
+          null,
+          charOffset,
+          fileUri: fileUri,
+          isExtensionThis: isExtensionThis)
+        ..parent = parent
+        ..variable = variable;
+    } else {
+      return this;
+    }
   }
 
   void finalizeInitializingFormal(ClassBuilder classBuilder) {
@@ -200,18 +220,22 @@
   void buildOutlineExpressions(SourceLibraryBuilder library,
       List<DelayedActionPerformer> delayedActionPerformers) {
     if (initializerToken != null) {
-      // For modular compilation we need to include initializers for optional
-      // and named parameters of const constructors into the outline - to enable
-      // constant evaluation. Similarly we need to include initializers for
-      // optional and named parameters of instance methods because these might
-      // be needed to generated noSuchMethod forwarders.
-      bool isConstConstructorParameter = false;
+      // For modular compilation we need to include default values for optional
+      // and named parameters in several cases:
+      // * for const constructors to enable constant evaluation,
+      // * for instance methods because these might be needed to generated
+      //   noSuchMethod forwarders, and
+      // * for generative constructors to support forwarding constructors
+      //   in mixin applications.
+      bool needsDefaultValues = false;
       if (parent is ConstructorBuilder) {
-        isConstConstructorParameter = parent!.isConst;
+        needsDefaultValues = true;
       } else if (parent is SourceFactoryBuilder) {
-        isConstConstructorParameter = parent!.isFactory && parent!.isConst;
+        needsDefaultValues = parent!.isFactory && parent!.isConst;
+      } else {
+        needsDefaultValues = parent!.isClassInstanceMember;
       }
-      if (isConstConstructorParameter || parent!.isClassInstanceMember) {
+      if (needsDefaultValues) {
         final ClassBuilder classBuilder = parent!.parent as ClassBuilder;
         Scope scope = classBuilder.scope;
         BodyBuilder bodyBuilder = library.loader
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index 0ad02c9..9bd4714 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -219,7 +219,8 @@
     if (formals == null) return parent;
     Map<String, Builder> local = <String, Builder>{};
     for (FormalParameterBuilder formal in formals!) {
-      if (!isConstructor || !formal.isInitializingFormal) {
+      if (!isConstructor ||
+          !formal.isInitializingFormal && !formal.isSuperInitializingFormal) {
         local[formal.name] = formal;
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index 73cabf5..f2c63b8 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -29,7 +29,6 @@
 
 import 'builder.dart';
 import 'class_builder.dart';
-import 'field_builder.dart';
 import 'member_builder.dart';
 import 'modifier_builder.dart';
 import 'name_iterator.dart';
@@ -101,14 +100,6 @@
       String name, Builder declaration, Builder other, int charOffset,
       {bool isExport: false, bool isImport: false});
 
-  int finishDeferredLoadTearoffs();
-
-  int finishForwarders();
-
-  int finishNativeMethods();
-
-  int finishPatchMethods();
-
   /// Looks up [constructorName] in the class named [className].
   ///
   /// The class is looked up in this library's export scope unless
@@ -124,21 +115,6 @@
   MemberBuilder getConstructor(String className,
       {String constructorName, bool bypassLibraryPrivacy: false});
 
-  int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType);
-
-  /// Computes variances of type parameters on typedefs.
-  ///
-  /// The variance property of type parameters on typedefs is computed from the
-  /// use of the parameters in the right-hand side of the typedef definition.
-  int computeVariances() => 0;
-
-  /// This method instantiates type parameters to their bounds in some cases
-  /// where they were omitted by the programmer and not provided by the type
-  /// inference.  The method returns the number of distinct type variables
-  /// that were instantiated in this library.
-  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
-      TypeBuilder bottomType, ClassBuilder objectClass);
-
   void becomeCoreLibrary();
 
   void addSyntheticDeclarationOfDynamic();
@@ -160,10 +136,6 @@
 
   void recordAccess(int charOffset, int length, Uri fileUri);
 
-  void buildOutlineExpressions();
-
-  List<FieldBuilder>? takeImplicitlyTypedFields();
-
   bool get isNonNullableByDefault;
 
   Nullability get nullable;
@@ -220,7 +192,7 @@
   bool get isPart => false;
 
   @override
-  String get debugName => "LibraryBuilder";
+  String get debugName => "$runtimeType";
 
   @override
   Loader get loader;
@@ -286,18 +258,6 @@
   }
 
   @override
-  int finishDeferredLoadTearoffs() => 0;
-
-  @override
-  int finishForwarders() => 0;
-
-  @override
-  int finishNativeMethods() => 0;
-
-  @override
-  int finishPatchMethods() => 0;
-
-  @override
   MemberBuilder getConstructor(String className,
       {String? constructorName, bool bypassLibraryPrivacy: false}) {
     constructorName ??= "";
@@ -340,18 +300,6 @@
   }
 
   @override
-  int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) => 0;
-
-  @override
-  int computeVariances() => 0;
-
-  @override
-  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
-      TypeBuilder bottomType, ClassBuilder objectClass) {
-    return 0;
-  }
-
-  @override
   void becomeCoreLibrary() {
     if (scope.lookupLocalMember("dynamic", setter: false) == null) {
       addSyntheticDeclarationOfDynamic();
@@ -392,12 +340,6 @@
   void recordAccess(int charOffset, int length, Uri fileUri) {}
 
   @override
-  void buildOutlineExpressions() {}
-
-  @override
-  List<FieldBuilder>? takeImplicitlyTypedFields() => null;
-
-  @override
   Nullability get nullable {
     return isNonNullableByDefault ? Nullability.nullable : Nullability.legacy;
   }
@@ -435,6 +377,11 @@
         ? const NullabilityBuilder.nullable()
         : const NullabilityBuilder.omitted();
   }
+
+  @override
+  StringBuffer printOn(StringBuffer buffer) {
+    return buffer..write(name ?? (isPart ? fileUri : importUri));
+  }
 }
 
 class LibraryLocalDeclarationIterator implements Iterator<Builder> {
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 9035466..5fc860b 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -9,7 +9,7 @@
 
 import '../../base/common.dart';
 
-import '../kernel/class_hierarchy_builder.dart';
+import '../kernel/hierarchy/class_member.dart';
 import '../kernel/kernel_helper.dart';
 import '../modifier.dart';
 import '../problems.dart' show unsupported;
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 0bfffd5..306c9aa 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -285,6 +285,10 @@
       Uri fileUri,
       TypeAliasBuilder aliasBuilder,
       DartType type) {
+    // Don't report the error in case of InvalidType. An error has already been
+    // reported in this case.
+    if (type is InvalidType) return null;
+
     Message message;
     if (declaration!.isTypeVariable) {
       message =
@@ -400,7 +404,7 @@
         // from ClassHierarchyBuilder.
         TypeDeclarationBuilder? unaliasedDeclaration = this.declaration;
         // The following code assumes that the declaration is a TypeAliasBuilder
-        // that through a chain of other TypeAliasBuilders (possibly, the chian
+        // that through a chain of other TypeAliasBuilders (possibly, the chain
         // length is 0) references a ClassBuilder of the Null class.  Otherwise,
         // it won't produce the NullType on the output.
         while (unaliasedDeclaration is TypeAliasBuilder) {
@@ -421,7 +425,7 @@
         // class from ClassHierarchyBuilder.
         TypeDeclarationBuilder? unaliasedDeclaration = this.declaration;
         // The following code assumes that the declaration is a TypeAliasBuilder
-        // that through a chain of other TypeAliasBuilders (possibly, the chian
+        // that through a chain of other TypeAliasBuilders (possibly, the chain
         // length is 0) references a ClassBuilder of the FutureOr class.
         // Otherwise, it won't produce the FutureOrType on the output.
         while (unaliasedDeclaration is TypeAliasBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index a1118c6..f09dc0d 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -5,7 +5,8 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_algebra.dart';
 
-import '../kernel/class_hierarchy_builder.dart';
+import '../kernel/hierarchy/class_member.dart';
+import '../kernel/hierarchy/members_builder.dart';
 import '../kernel/member_covariance.dart';
 
 import '../source/name_scheme.dart';
@@ -197,15 +198,15 @@
     _overrideDependencies!.addAll(overriddenMembers);
   }
 
-  void _ensureTypes(ClassHierarchyBuilder hierarchy) {
+  void _ensureTypes(ClassMembersBuilder membersBuilder) {
     if (_typeEnsured) return;
     if (_overrideDependencies != null) {
       if (isGetter) {
-        hierarchy.inferGetterType(this, _overrideDependencies!);
+        membersBuilder.inferGetterType(this, _overrideDependencies!);
       } else if (isSetter) {
-        hierarchy.inferSetterType(this, _overrideDependencies!);
+        membersBuilder.inferSetterType(this, _overrideDependencies!);
       } else {
-        hierarchy.inferMethodType(this, _overrideDependencies!);
+        membersBuilder.inferMethodType(this, _overrideDependencies!);
       }
       _overrideDependencies = null;
     }
@@ -223,6 +224,7 @@
         return procedure;
       case ProcedureKind.Operator:
       case ProcedureKind.Setter:
+        return null;
     }
   }
 
@@ -527,8 +529,8 @@
   bool get isSourceDeclaration => true;
 
   @override
-  void inferType(ClassHierarchyBuilder hierarchy) {
-    memberBuilder._ensureTypes(hierarchy);
+  void inferType(ClassMembersBuilder membersBuilder) {
+    memberBuilder._ensureTypes(membersBuilder);
   }
 
   @override
@@ -537,15 +539,15 @@
   }
 
   @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    memberBuilder._ensureTypes(hierarchy);
+  Member getMember(ClassMembersBuilder membersBuilder) {
+    memberBuilder._ensureTypes(membersBuilder);
     return memberBuilder.member;
   }
 
   @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
-    return _covariance ??=
-        new Covariance.fromMember(getMember(hierarchy), forSetter: forSetter);
+  Covariance getCovariance(ClassMembersBuilder membersBuilder) {
+    return _covariance ??= new Covariance.fromMember(getMember(membersBuilder),
+        forSetter: forSetter);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 0a5f4e1..9ccfd18 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -50,6 +50,9 @@
   DillLibraryBuilder get library => super.library as DillLibraryBuilder;
 
   @override
+  bool get isMacro => cls.isMacro;
+
+  @override
   List<TypeVariableBuilder>? get typeVariables {
     List<TypeVariableBuilder>? typeVariables = super.typeVariables;
     if (typeVariables == null && cls.typeParameters.isNotEmpty) {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 4917953..d800f03 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -11,8 +11,8 @@
 import '../builder/member_builder.dart';
 import '../builder/library_builder.dart';
 
-import '../kernel/class_hierarchy_builder.dart'
-    show ClassHierarchyBuilder, ClassMember;
+import '../kernel/hierarchy/class_member.dart' show ClassMember;
+import '../kernel/hierarchy/members_builder.dart' show ClassMembersBuilder;
 import '../kernel/member_covariance.dart';
 import '../kernel/utils.dart'
     show isRedirectingGenerativeConstructorImplementation;
@@ -282,16 +282,16 @@
   }
 
   @override
-  Member getMember(ClassHierarchyBuilder hierarchy) => memberBuilder.member;
+  Member getMember(ClassMembersBuilder membersBuilder) => memberBuilder.member;
 
   @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
+  Covariance getCovariance(ClassMembersBuilder membersBuilder) {
     return _covariance ??=
         new Covariance.fromMember(memberBuilder.member, forSetter: forSetter);
   }
 
   @override
-  void inferType(ClassHierarchyBuilder hierarchy) {
+  void inferType(ClassMembersBuilder hierarchy) {
     // Do nothing; this is only for source members.
   }
 
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 61bdb2e..31d90c59 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -9,18 +9,6 @@
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
     show ScannerConfiguration;
 
-import 'package:front_end/src/api_prototype/experimental_flags.dart';
-
-import 'package:front_end/src/api_prototype/lowering_predicates.dart'
-    show isExtensionThisName;
-
-import 'package:front_end/src/base/nnbd_mode.dart';
-
-import 'package:front_end/src/fasta/builder/member_builder.dart'
-    show MemberBuilder;
-
-import 'package:front_end/src/fasta/fasta_codes.dart';
-import 'package:front_end/src/fasta/source/source_loader.dart';
 import 'package:kernel/binary/ast_from_binary.dart'
     show
         BinaryBuilderWithMetadata,
@@ -33,8 +21,6 @@
 import 'package:kernel/class_hierarchy.dart'
     show ClassHierarchy, ClosedWorldClassHierarchy;
 
-import 'package:kernel/core_types.dart' show CoreTypes;
-
 import 'package:kernel/kernel.dart'
     show
         Class,
@@ -69,13 +55,22 @@
 
 import 'package:package_config/package_config.dart' show Package, PackageConfig;
 
+import '../api_prototype/experimental_flags.dart';
+
 import '../api_prototype/file_system.dart' show FileSystem, FileSystemEntity;
 
 import '../api_prototype/incremental_kernel_generator.dart'
-    show IncrementalKernelGenerator, isLegalIdentifier;
+    show
+        IncrementalCompilerResult,
+        IncrementalKernelGenerator,
+        isLegalIdentifier;
+
+import '../api_prototype/lowering_predicates.dart' show isExtensionThisName;
 
 import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
 
+import '../base/nnbd_mode.dart';
+
 import 'builder/builder.dart' show Builder;
 
 import 'builder/class_builder.dart' show ClassBuilder;
@@ -86,6 +81,8 @@
 
 import 'builder/library_builder.dart' show LibraryBuilder;
 
+import 'builder/member_builder.dart' show MemberBuilder;
+
 import 'builder/name_iterator.dart' show NameIterator;
 
 import 'builder/type_builder.dart' show TypeBuilder;
@@ -107,6 +104,8 @@
 
 import 'export.dart' show Export;
 
+import 'fasta_codes.dart';
+
 import 'import.dart' show Import;
 
 import 'incremental_serializer.dart' show IncrementalSerializer;
@@ -123,7 +122,7 @@
 
 import 'hybrid_file_system.dart' show HybridFileSystem;
 
-import 'kernel/class_hierarchy_builder.dart' show ClassHierarchyBuilder;
+import 'kernel/hierarchy/hierarchy_builder.dart' show ClassHierarchyBuilder;
 
 import 'kernel/internal_ast.dart' show VariableDeclarationImpl;
 
@@ -134,6 +133,8 @@
 import 'source/source_library_builder.dart'
     show ImplicitLanguageVersion, SourceLibraryBuilder;
 
+import 'source/source_loader.dart';
+
 import 'ticker.dart' show Ticker;
 
 import 'uri_translator.dart' show UriTranslator;
@@ -143,78 +144,99 @@
 class IncrementalCompiler implements IncrementalKernelGenerator {
   final CompilerContext context;
 
-  final Ticker ticker;
-  final bool resetTicker;
+  final Ticker _ticker;
+  final bool _resetTicker;
   final bool outlineOnly;
-  bool trackNeededDillLibraries = false;
-  Set<Library>? neededDillLibraries;
 
-  Set<Uri?> invalidatedUris = new Set<Uri?>();
+  Set<Uri?> _invalidatedUris = new Set<Uri?>();
 
-  DillTarget? dillLoadedData;
-  List<LibraryBuilder>? platformBuilders;
-  Map<Uri, LibraryBuilder>? userBuilders;
-  final Uri? initializeFromDillUri;
-  Component? componentToInitializeFrom;
-  bool initializedFromDill = false;
-  bool initializedIncrementalSerializer = false;
-  Uri? previousPackagesUri;
-  Map<String, Package>? previousPackagesMap;
-  Map<String, Package>? currentPackagesMap;
-  bool hasToCheckPackageUris = false;
-  final bool initializedForExpressionCompilationOnly;
-  bool computeDeltaRunOnce = false;
-  Map<Uri, List<DiagnosticMessageFromJson>> remainingComponentProblems =
-      new Map<Uri, List<DiagnosticMessageFromJson>>();
-  List<Component>? modulesToLoad;
-  IncrementalSerializer? incrementalSerializer;
+  DillTarget? _dillLoadedData;
+  List<LibraryBuilder>? _platformBuilders;
+  Map<Uri, LibraryBuilder>? _userBuilders;
+
+  final _InitializationStrategy _initializationStrategy;
+
+  Uri? _previousPackagesUri;
+  Map<String, Package>? _previousPackagesMap;
+  Map<String, Package>? _currentPackagesMap;
+  bool _hasToCheckPackageUris = false;
+  final bool _initializedForExpressionCompilationOnly;
+  bool _computeDeltaRunOnce = false;
+  List<Component>? _modulesToLoad;
+  final IncrementalSerializer? _incrementalSerializer;
+  final _ComponentProblems _componentProblems = new _ComponentProblems();
+
+  RecorderForTesting? get recorderForTesting => null;
 
   static final Uri debugExprUri =
       new Uri(scheme: "org-dartlang-debug", path: "synthetic_debug_expression");
 
-  IncrementalKernelTarget? userCode;
-  Set<Library>? previousSourceBuilders;
+  IncrementalKernelTarget? _lastGoodKernelTarget;
+  Set<Library>? _previousSourceBuilders;
 
   /// Guard against multiple computeDelta calls at the same time (possibly
   /// caused by lacking awaits etc).
-  Completer<dynamic>? currentlyCompiling;
+  Completer<dynamic>? _currentlyCompiling;
 
   IncrementalCompiler.fromComponent(
-      this.context, this.componentToInitializeFrom,
-      [bool? outlineOnly, this.incrementalSerializer])
-      : ticker = context.options.ticker,
-        resetTicker = true,
-        initializeFromDillUri = null,
+      this.context, Component? _componentToInitializeFrom,
+      [bool? outlineOnly, this._incrementalSerializer])
+      : _ticker = context.options.ticker,
+        _resetTicker = true,
+        _initializationStrategy = new _InitializationStrategy.fromComponent(
+            _componentToInitializeFrom),
         this.outlineOnly = outlineOnly ?? false,
-        this.initializedForExpressionCompilationOnly = false {
-    enableExperimentsBasedOnEnvironment();
+        this._initializedForExpressionCompilationOnly = false {
+    _enableExperimentsBasedOnEnvironment();
   }
 
   IncrementalCompiler(this.context,
-      [this.initializeFromDillUri,
+      [Uri? _initializeFromDillUri,
       bool? outlineOnly,
-      this.incrementalSerializer])
-      : ticker = context.options.ticker,
-        resetTicker = true,
-        componentToInitializeFrom = null,
+      this._incrementalSerializer])
+      : _ticker = context.options.ticker,
+        _resetTicker = true,
+        _initializationStrategy =
+            new _InitializationStrategy.fromUri(_initializeFromDillUri),
         this.outlineOnly = outlineOnly ?? false,
-        this.initializedForExpressionCompilationOnly = false {
-    enableExperimentsBasedOnEnvironment();
+        this._initializedForExpressionCompilationOnly = false {
+    _enableExperimentsBasedOnEnvironment();
   }
 
   IncrementalCompiler.forExpressionCompilationOnly(
-      this.context, this.componentToInitializeFrom,
+      this.context, Component? _componentToInitializeFrom,
       [bool? resetTicker])
-      : ticker = context.options.ticker,
-        this.resetTicker = resetTicker ?? true,
-        initializeFromDillUri = null,
+      : _ticker = context.options.ticker,
+        this._resetTicker = resetTicker ?? true,
+        _initializationStrategy = new _InitializationStrategy.fromComponent(
+            _componentToInitializeFrom),
         this.outlineOnly = false,
-        this.incrementalSerializer = null,
-        this.initializedForExpressionCompilationOnly = true {
-    enableExperimentsBasedOnEnvironment();
+        this._incrementalSerializer = null,
+        this._initializedForExpressionCompilationOnly = true {
+    _enableExperimentsBasedOnEnvironment();
   }
 
-  void enableExperimentsBasedOnEnvironment({Set<String>? enabledExperiments}) {
+  bool get initializedFromDillForTesting =>
+      _initializationStrategy.initializedFromDillForTesting;
+
+  bool get initializedIncrementalSerializerForTesting =>
+      _initializationStrategy.initializedIncrementalSerializerForTesting;
+
+  DillTarget? get dillTargetForTesting => _dillLoadedData;
+
+  IncrementalKernelTarget? get kernelTargetForTesting => _lastGoodKernelTarget;
+
+  /// Returns the [Package] used for the package [packageName] in the most
+  /// recent compilation.
+  Package? getPackageForPackageName(String packageName) =>
+      _currentPackagesMap?[packageName];
+
+  /// Returns the [Library] with the given [importUri] from the most recent
+  /// compilation.
+  Library? lookupLibrary(Uri importUri) =>
+      _lastGoodKernelTarget?.loader.lookupLibraryBuilder(importUri)?.library;
+
+  void _enableExperimentsBasedOnEnvironment({Set<String>? enabledExperiments}) {
     // Note that these are all experimental. Use at your own risk.
     enabledExperiments ??= getExperimentEnvironment();
     // Currently there's no live experiments.
@@ -222,36 +244,45 @@
 
   @override
   void setExperimentalFeaturesForTesting(Set<String> features) {
-    enableExperimentsBasedOnEnvironment(enabledExperiments: features);
+    _enableExperimentsBasedOnEnvironment(enabledExperiments: features);
   }
 
   @override
-  Future<Component> computeDelta(
-      {List<Uri>? entryPoints, bool fullComponent: false}) async {
-    while (currentlyCompiling != null) {
-      await currentlyCompiling!.future;
+  Future<IncrementalCompilerResult> computeDelta(
+      {List<Uri>? entryPoints,
+      bool fullComponent: false,
+      bool trackNeededDillLibraries: false}) async {
+    while (_currentlyCompiling != null) {
+      await _currentlyCompiling!.future;
     }
-    currentlyCompiling = new Completer();
-    if (resetTicker) {
-      ticker.reset();
+    _currentlyCompiling = new Completer();
+    if (_resetTicker) {
+      _ticker.reset();
     }
     entryPoints ??= context.options.inputs;
-    return context.runInContext<Component>((CompilerContext c) async {
-      if (computeDeltaRunOnce && initializedForExpressionCompilationOnly) {
+    return context
+        .runInContext<IncrementalCompilerResult>((CompilerContext c) async {
+      if (_computeDeltaRunOnce && _initializedForExpressionCompilationOnly) {
         throw new StateError("Initialized for expression compilation: "
             "cannot do another general compile.");
       }
-      computeDeltaRunOnce = true;
+      _computeDeltaRunOnce = true;
+      IncrementalKernelTarget? lastGoodKernelTarget = _lastGoodKernelTarget;
+
       // Initial setup: Load platform, initialize from dill or component etc.
-      UriTranslator uriTranslator = await setupPackagesAndUriTranslator(c);
+      UriTranslator uriTranslator = await _setupPackagesAndUriTranslator(c);
       IncrementalCompilerData data =
-          await ensurePlatformAndInitialize(uriTranslator, c);
+          await _ensurePlatformAndInitialize(uriTranslator, c);
 
       // Figure out what to keep and what to throw away.
-      Set<Uri?> invalidatedUris = this.invalidatedUris.toSet();
-      invalidateNotKeptUserBuilders(invalidatedUris);
-      ReusageResult? reusedResult =
-          computeReusedLibraries(invalidatedUris, uriTranslator, entryPoints!);
+      Set<Uri?> invalidatedUris = this._invalidatedUris.toSet();
+      _invalidateNotKeptUserBuilders(invalidatedUris);
+      ReusageResult? reusedResult = _computeReusedLibraries(
+          lastGoodKernelTarget,
+          _userBuilders,
+          invalidatedUris,
+          uriTranslator,
+          entryPoints!);
 
       // Use the reused libraries to re-write entry-points.
       if (reusedResult.arePartsUsedAsEntryPoints()) {
@@ -267,43 +298,49 @@
 
       // Experimental invalidation initialization (e.g. figure out if we can).
       ExperimentalInvalidation? experimentalInvalidation =
-          await initializeExperimentalInvalidation(reusedResult, c);
-      recordRebuildBodiesCountForTesting(
+          await _initializeExperimentalInvalidation(reusedResult, c);
+      recorderForTesting?.recordRebuildBodiesCount(
           experimentalInvalidation?.missingSources.length ?? 0);
 
       // Cleanup: After (potentially) removing builders we have stuff to cleanup
       // to not leak, and we might need to re-create the dill target.
-      cleanupRemovedBuilders(reusedResult, uriTranslator);
-      recreateDillTargetIfPackageWasUpdated(uriTranslator, c);
-      ClassHierarchy? hierarchy = userCode?.loader.hierarchy;
-      cleanupHierarchy(hierarchy, experimentalInvalidation, reusedResult);
+      _cleanupRemovedBuilders(
+          lastGoodKernelTarget, reusedResult, uriTranslator);
+      _recreateDillTargetIfPackageWasUpdated(uriTranslator, c);
+      ClassHierarchy? hierarchy = lastGoodKernelTarget?.loader.hierarchy;
+      _cleanupHierarchy(hierarchy, experimentalInvalidation, reusedResult);
       List<LibraryBuilder> reusedLibraries = reusedResult.reusedLibraries;
       reusedResult = null;
 
-      // TODO(jensj): Given the code below, [userCode] is assumed always to be
-      // non-null.
-      if (userCode != null) {
-        ticker.logMs("Decided to reuse ${reusedLibraries.length}"
-            " of ${userCode!.loader.libraryBuilders.length} libraries");
+      if (lastGoodKernelTarget != null) {
+        _ticker.logMs("Decided to reuse ${reusedLibraries.length}"
+            " of ${lastGoodKernelTarget.loader.libraryBuilders.length}"
+            " libraries");
       }
 
       // For modular compilation we can be asked to load components and track
       // which libraries we actually use for the compilation. Set that up now.
-      loadEnsureLoadedComponents(reusedLibraries);
-      resetTrackingOfUsedLibraries(hierarchy);
+      _loadEnsureLoadedComponents(reusedLibraries);
+      if (trackNeededDillLibraries) {
+        _resetTrackingOfUsedLibraries(hierarchy);
+      }
 
-      // For each computeDelta call we create a new userCode object which needs
+      // For each computeDelta call we create a new kernel target which needs
       // to be setup, and in the case of experimental invalidation some of the
       // builders needs to be patched up.
-      IncrementalKernelTarget? userCodeOld = userCode;
-      setupNewUserCode(c, uriTranslator, hierarchy, reusedLibraries,
-          experimentalInvalidation, entryPoints!.first);
+      IncrementalKernelTarget currentKernelTarget = _setupNewKernelTarget(
+          c,
+          uriTranslator,
+          hierarchy,
+          reusedLibraries,
+          experimentalInvalidation,
+          entryPoints!.first);
       Map<LibraryBuilder, List<LibraryBuilder>>? rebuildBodiesMap =
-          experimentalInvalidationCreateRebuildBodiesBuilders(
-              experimentalInvalidation, uriTranslator);
-      entryPoints = userCode!.setEntryPoints(entryPoints!);
-      await userCode!.loader.buildOutlines();
-      experimentalInvalidationPatchUpScopes(
+          _experimentalInvalidationCreateRebuildBodiesBuilders(
+              currentKernelTarget, experimentalInvalidation, uriTranslator);
+      entryPoints = currentKernelTarget.setEntryPoints(entryPoints!);
+      await currentKernelTarget.loader.buildOutlines();
+      _experimentalInvalidationPatchUpScopes(
           experimentalInvalidation, rebuildBodiesMap);
       rebuildBodiesMap = null;
 
@@ -311,50 +348,55 @@
       // Note that the [Component] is not the "full" component.
       // It is a component consisting of all newly compiled libraries and all
       // libraries loaded from .dill files or directly from components.
-      // Technically, it's the combination of userCode.loader.libraries and
-      // dillLoadedData.loader.libraries.
-      Component? componentWithDill = await userCode!.buildOutlines();
+      // Technically, it's the combination of
+      // `currentKernelTarget.loader.libraries` and
+      // `_dillLoadedData.loader.libraries`.
+      Component? componentWithDill = await currentKernelTarget.buildOutlines();
 
       if (!outlineOnly) {
         // Checkpoint: Build the actual bodies.
         componentWithDill =
-            await userCode!.buildComponent(verify: c.options.verify);
+            await currentKernelTarget.buildComponent(verify: c.options.verify);
       }
-      hierarchy ??= userCode!.loader.hierarchy;
-      // ignore: unnecessary_null_comparison
-      if (hierarchy != null) {
-        if (userCode!.classHierarchyChanges != null) {
-          hierarchy.applyTreeChanges([], [], userCode!.classHierarchyChanges!);
-        }
-        if (userCode!.classMemberChanges != null) {
-          hierarchy.applyMemberChanges(userCode!.classMemberChanges!,
-              findDescendants: true);
-        }
+      hierarchy ??= currentKernelTarget.loader.hierarchy;
+      if (currentKernelTarget.classHierarchyChanges != null) {
+        hierarchy.applyTreeChanges(
+            [], [], currentKernelTarget.classHierarchyChanges!);
       }
-      recordNonFullComponentForTesting(componentWithDill!);
+      if (currentKernelTarget.classMemberChanges != null) {
+        hierarchy.applyMemberChanges(currentKernelTarget.classMemberChanges!,
+            findDescendants: true);
+      }
+      recorderForTesting?.recordNonFullComponent(componentWithDill!);
 
-      // Perform actual dill usage tracking.
-      performDillUsageTracking(hierarchy);
+      Set<Library>? neededDillLibraries;
+      if (trackNeededDillLibraries) {
+        // Perform actual dill usage tracking.
+        neededDillLibraries =
+            _performDillUsageTracking(currentKernelTarget, hierarchy);
+      }
 
-      // If we actually got a result we can throw away the old userCode and the
-      // list of invalidated uris.
-      // ignore: unnecessary_null_comparison
+      // If we actually got a result we can throw away the
+      // [lastGoodKernelTarget] and the list of invalidated uris.
+      // TODO(jensj,johnniwinther): Given the code below, [componentWithDill] is
+      // assumed always to be non-null.
       if (componentWithDill != null) {
-        this.invalidatedUris.clear();
-        hasToCheckPackageUris = false;
-        userCodeOld?.loader.releaseAncillaryResources();
-        userCodeOld = null;
+        this._invalidatedUris.clear();
+        _hasToCheckPackageUris = false;
+        lastGoodKernelTarget?.loader.releaseAncillaryResources();
+        lastGoodKernelTarget = null;
       }
 
       // Compute which libraries to output and which (previous) errors/warnings
       // we have to reissue. In the process do some cleanup too.
       List<Library> compiledLibraries =
-          new List<Library>.from(userCode!.loader.libraries);
-      Map<Uri, Source> uriToSource = componentWithDill.uriToSource;
-      experimentalCompilationPostCompilePatchup(
+          new List<Library>.from(currentKernelTarget.loader.libraries);
+      Map<Uri, Source> uriToSource = componentWithDill!.uriToSource;
+      _experimentalCompilationPostCompilePatchup(
           experimentalInvalidation, compiledLibraries, uriToSource);
       List<Library> outputLibraries =
-          calculateOutputLibrariesAndIssueLibraryProblems(
+          _calculateOutputLibrariesAndIssueLibraryProblems(
+              currentKernelTarget,
               data.component != null || fullComponent,
               compiledLibraries,
               entryPoints!,
@@ -363,18 +405,20 @@
               uriTranslator,
               uriToSource,
               c);
-      List<String> problemsAsJson = reissueComponentProblems(componentWithDill);
+      List<String> problemsAsJson = _componentProblems.reissueProblems(
+          context, currentKernelTarget, componentWithDill);
 
       // If we didn't get a result, go back to the previous one so expression
       // calculation has the potential to work.
       // ignore: unnecessary_null_comparison
       if (componentWithDill == null) {
-        userCode!.loader.clearLibraryBuilders();
-        userCode = userCodeOld;
-        dillLoadedData!.loader.currentSourceLoader = userCode!.loader;
+        currentKernelTarget.loader.clearLibraryBuilders();
+        currentKernelTarget = lastGoodKernelTarget!;
+        _dillLoadedData!.loader.currentSourceLoader =
+            currentKernelTarget.loader;
       } else {
-        previousSourceBuilders =
-            convertSourceLibraryBuildersToDill(experimentalInvalidation);
+        _previousSourceBuilders = _convertSourceLibraryBuildersToDill(
+            currentKernelTarget, experimentalInvalidation);
       }
 
       experimentalInvalidation = null;
@@ -394,11 +438,15 @@
         ..problemsAsJson = problemsAsJson;
 
       // We're now done. Allow any waiting compile to start.
-      Completer<dynamic> currentlyCompilingLocal = currentlyCompiling!;
-      currentlyCompiling = null;
+      Completer<dynamic> currentlyCompilingLocal = _currentlyCompiling!;
+      _currentlyCompiling = null;
       currentlyCompilingLocal.complete();
 
-      return result;
+      _lastGoodKernelTarget = currentKernelTarget;
+      return new IncrementalCompilerResult(result,
+          classHierarchy: currentKernelTarget.loader.hierarchy,
+          coreTypes: currentKernelTarget.loader.coreTypes,
+          neededDillLibraries: neededDillLibraries);
     });
   }
 
@@ -410,39 +458,32 @@
   /// source builders and they will thus be patched up here too.
   ///
   /// Returns the set of Libraries that now has new (dill) builders.
-  Set<Library> convertSourceLibraryBuildersToDill(
+  Set<Library> _convertSourceLibraryBuildersToDill(
+      IncrementalKernelTarget nextGoodKernelTarget,
       ExperimentalInvalidation? experimentalInvalidation) {
     bool changed = false;
     Set<Library> newDillLibraryBuilders = new Set<Library>();
-    userBuilders ??= <Uri, LibraryBuilder>{};
+    _userBuilders ??= <Uri, LibraryBuilder>{};
     Map<LibraryBuilder, List<LibraryBuilder>>? convertedLibraries;
-    for (LibraryBuilder builder in userCode!.loader.libraryBuilders) {
-      if (builder is SourceLibraryBuilder) {
-        DillLibraryBuilder dillBuilder =
-            dillLoadedData!.loader.appendLibrary(builder.library);
-        userCode!.loader.registerLibraryBuilder(
-            // TODO(johnniwinther): Why do we need to create
-            //  [DillLibraryBuilder]s for the patch library file uris?
-            dillBuilder,
-            builder.isPatch ? builder.fileUri : null);
-        userBuilders![builder.importUri] = dillBuilder;
-        newDillLibraryBuilders.add(builder.library);
-        if (userCode!.loader.first == builder) {
-          userCode!.loader.first = dillBuilder;
-        }
-        changed = true;
-        if (experimentalInvalidation != null) {
-          convertedLibraries ??=
-              new Map<LibraryBuilder, List<LibraryBuilder>>();
-          convertedLibraries[builder] = [dillBuilder];
-        }
+    for (SourceLibraryBuilder builder
+        in nextGoodKernelTarget.loader.sourceLibraryBuilders) {
+      DillLibraryBuilder dillBuilder =
+          _dillLoadedData!.loader.appendLibrary(builder.library);
+      nextGoodKernelTarget.loader.registerLibraryBuilder(dillBuilder);
+      _userBuilders![builder.importUri] = dillBuilder;
+      newDillLibraryBuilders.add(builder.library);
+      changed = true;
+      if (experimentalInvalidation != null) {
+        convertedLibraries ??= new Map<LibraryBuilder, List<LibraryBuilder>>();
+        convertedLibraries[builder] = [dillBuilder];
       }
     }
     if (changed) {
       // We suppress finalization errors because they have already been
       // reported.
-      dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
-      assert(_checkEquivalentScopes(userCode!.loader, dillLoadedData!.loader));
+      _dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
+      assert(_checkEquivalentScopes(
+          nextGoodKernelTarget.loader, _dillLoadedData!.loader));
 
       if (experimentalInvalidation != null) {
         /// If doing experimental invalidation that means that some of the old
@@ -455,7 +496,7 @@
         // Maps from old library builder to map of new content.
         Map<LibraryBuilder, Map<String, Builder>>? replacementSettersMap = {};
 
-        experimentalInvalidationFillReplacementMaps(
+        _experimentalInvalidationFillReplacementMaps(
             convertedLibraries!, replacementMap, replacementSettersMap);
 
         for (LibraryBuilder builder
@@ -478,17 +519,19 @@
         replacementSettersMap = null;
       }
     }
-    userCode!.loader.buildersCreatedWithReferences.clear();
-    userCode!.loader.builderHierarchy.clear();
-    userCode!.loader.referenceFromIndex = null;
+    nextGoodKernelTarget.loader.buildersCreatedWithReferences.clear();
+    nextGoodKernelTarget.loader.hierarchyBuilder.clear();
+    nextGoodKernelTarget.loader.referenceFromIndex = null;
     convertedLibraries = null;
     experimentalInvalidation = null;
-    if (userBuilders!.isEmpty) userBuilders = null;
+    if (_userBuilders!.isEmpty) _userBuilders = null;
     return newDillLibraryBuilders;
   }
 
   bool _checkEquivalentScopes(
       SourceLoader sourceLoader, DillLoader dillLoader) {
+    // TODO(johnniwinther): Use [SourceLoader.sourceLibraryBuilders] here.
+    // Currently this causes a failure in incremental_dartino_suite.dart.
     for (LibraryBuilder sourceLibraryBuilder in sourceLoader.libraryBuilders) {
       if (sourceLibraryBuilder is SourceLibraryBuilder) {
         Uri uri = sourceLibraryBuilder.importUri;
@@ -565,7 +608,8 @@
 
   /// Compute which libraries to output and which (previous) errors/warnings we
   /// have to reissue. In the process do some cleanup too.
-  List<Library> calculateOutputLibrariesAndIssueLibraryProblems(
+  List<Library> _calculateOutputLibrariesAndIssueLibraryProblems(
+      IncrementalKernelTarget currentKernelTarget,
       bool fullComponent,
       List<Library> compiledLibraries,
       List<Uri> entryPoints,
@@ -577,18 +621,25 @@
     List<Library> outputLibraries;
     Set<Library> allLibraries;
     if (fullComponent) {
-      outputLibraries = computeTransitiveClosure(compiledLibraries, entryPoints,
-          reusedLibraries, hierarchy, uriTranslator, uriToSource);
+      outputLibraries = _computeTransitiveClosure(
+          currentKernelTarget,
+          compiledLibraries,
+          entryPoints,
+          reusedLibraries,
+          hierarchy,
+          uriTranslator,
+          uriToSource);
       allLibraries = outputLibraries.toSet();
       if (!c.options.omitPlatform) {
-        for (int i = 0; i < platformBuilders!.length; i++) {
-          Library lib = platformBuilders![i].library;
+        for (int i = 0; i < _platformBuilders!.length; i++) {
+          Library lib = _platformBuilders![i].library;
           outputLibraries.add(lib);
         }
       }
     } else {
       outputLibraries = <Library>[];
-      allLibraries = computeTransitiveClosure(
+      allLibraries = _computeTransitiveClosure(
+              currentKernelTarget,
               compiledLibraries,
               entryPoints,
               reusedLibraries,
@@ -599,7 +650,7 @@
           .toSet();
     }
 
-    reissueLibraryProblems(allLibraries, compiledLibraries);
+    _reissueLibraryProblems(allLibraries, compiledLibraries);
     return outputLibraries;
   }
 
@@ -610,7 +661,7 @@
   /// contain all the libraries that would normally have been recompiled.
   /// This might be a temporary thing, but we need to figure out if the VM
   /// can (always) work with only getting the actually rebuild stuff.
-  void experimentalCompilationPostCompilePatchup(
+  void _experimentalCompilationPostCompilePatchup(
       ExperimentalInvalidation? experimentalInvalidation,
       List<Library> compiledLibraries,
       Map<Uri, Source> uriToSource) {
@@ -628,32 +679,33 @@
   /// Perform dill usage tracking if asked. Use the marking on dill builders as
   /// well as the class hierarchy to figure out which dill libraries was
   /// actually used by the compilation.
-  void performDillUsageTracking(ClassHierarchy hierarchy) {
-    if (trackNeededDillLibraries) {
-      // Which dill builders were built?
-      neededDillLibraries = new Set<Library>();
+  Set<Library> _performDillUsageTracking(
+      IncrementalKernelTarget target, ClassHierarchy hierarchy) {
+    // Which dill builders were built?
+    Set<Library> neededDillLibraries = {};
 
-      // Propagate data from constant evaluator: Libraries used in the constant
-      // evaluator - that comes from dill - are marked.
-      Set<Library> librariesUsedByConstantEvaluator = userCode!.librariesUsed;
+    // Propagate data from constant evaluator: Libraries used in the constant
+    // evaluator - that comes from dill - are marked.
+    Set<Library> librariesUsedByConstantEvaluator = target.librariesUsed;
 
-      for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
-        if (builder is DillLibraryBuilder) {
-          if (builder.isBuiltAndMarked ||
-              librariesUsedByConstantEvaluator.contains(builder.library)) {
-            neededDillLibraries!.add(builder.library);
-          }
+    for (LibraryBuilder builder in _dillLoadedData!.loader.libraryBuilders) {
+      if (builder is DillLibraryBuilder) {
+        if (builder.isBuiltAndMarked ||
+            librariesUsedByConstantEvaluator.contains(builder.library)) {
+          neededDillLibraries.add(builder.library);
         }
       }
-
-      updateNeededDillLibrariesWithHierarchy(
-          hierarchy, userCode!.loader.builderHierarchy);
     }
+
+    updateNeededDillLibrariesWithHierarchy(
+        neededDillLibraries, hierarchy, target.loader.hierarchyBuilder);
+
+    return neededDillLibraries;
   }
 
   /// Fill in the replacement maps that describe the replacements that need to
   /// happen because of experimental invalidation.
-  void experimentalInvalidationFillReplacementMaps(
+  void _experimentalInvalidationFillReplacementMaps(
       Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap,
       Map<LibraryBuilder, Map<String, Builder>> replacementMap,
       Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap) {
@@ -687,10 +739,12 @@
   }
 
   /// When doing experimental invalidation, we have some builders that needs to
-  /// be rebuild special, namely they have to be [userCode.loader.read] with
-  /// references from the original [Library] for things to work.
+  /// be rebuild special, namely they have to be
+  /// [currentKernelTarget.loader.read] with references from the original
+  /// [Library] for things to work.
   Map<LibraryBuilder, List<LibraryBuilder>>
-      experimentalInvalidationCreateRebuildBodiesBuilders(
+      _experimentalInvalidationCreateRebuildBodiesBuilders(
+          IncrementalKernelTarget currentKernelTarget,
           ExperimentalInvalidation? experimentalInvalidation,
           UriTranslator uriTranslator) {
     // Any builder(s) in [rebuildBodies] should be semi-reused: Create source
@@ -700,8 +754,8 @@
         new Map<LibraryBuilder, List<LibraryBuilder>>.identity();
     if (experimentalInvalidation != null) {
       for (LibraryBuilder library in experimentalInvalidation.rebuildBodies) {
-        LibraryBuilder newBuilder = userCode!.loader.read(library.importUri, -1,
-            accessor: userCode!.loader.first,
+        LibraryBuilder newBuilder = currentKernelTarget.loader.readAsEntryPoint(
+            library.importUri,
             fileUri: library.fileUri,
             referencesFrom: library.library);
         List<LibraryBuilder> builders = [newBuilder];
@@ -713,8 +767,9 @@
           // libraries.
           Uri partUri = getPartUri(library.importUri, part);
           Uri? fileUri =
-              getPartFileUri(library.library.fileUri, part, uriTranslator);
-          LibraryBuilder newPartBuilder = userCode!.loader.read(partUri, -1,
+              uriTranslator.getPartFileUri(library.library.fileUri, part);
+          LibraryBuilder newPartBuilder = currentKernelTarget.loader.read(
+              partUri, -1,
               accessor: library,
               fileUri: fileUri,
               referencesFrom: library.library,
@@ -729,7 +784,7 @@
   /// When doing experimental invalidation we have to patch up the scopes of the
   /// the libraries we're not recompiling but should have recompiled if we
   /// didn't do anything special.
-  void experimentalInvalidationPatchUpScopes(
+  void _experimentalInvalidationPatchUpScopes(
       ExperimentalInvalidation? experimentalInvalidation,
       Map<LibraryBuilder, List<LibraryBuilder>> rebuildBodiesMap) {
     if (experimentalInvalidation != null) {
@@ -739,7 +794,7 @@
       // Maps from old library builder to map of new content.
       Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap = {};
 
-      experimentalInvalidationFillReplacementMaps(
+      _experimentalInvalidationFillReplacementMaps(
           rebuildBodiesMap, replacementMap, replacementSettersMap);
 
       for (LibraryBuilder builder
@@ -777,20 +832,20 @@
             Builder childBuilder = iterator.current;
             if (childBuilder is SourceClassBuilder) {
               TypeBuilder? typeBuilder = childBuilder.supertypeBuilder;
-              replaceTypeBuilder(
+              _replaceTypeBuilder(
                   replacementMap, replacementSettersMap, typeBuilder);
               typeBuilder = childBuilder.mixedInTypeBuilder;
-              replaceTypeBuilder(
+              _replaceTypeBuilder(
                   replacementMap, replacementSettersMap, typeBuilder);
               if (childBuilder.onTypes != null) {
                 for (typeBuilder in childBuilder.onTypes!) {
-                  replaceTypeBuilder(
+                  _replaceTypeBuilder(
                       replacementMap, replacementSettersMap, typeBuilder);
                 }
               }
               if (childBuilder.interfaceBuilders != null) {
                 for (typeBuilder in childBuilder.interfaceBuilders!) {
-                  replaceTypeBuilder(
+                  _replaceTypeBuilder(
                       replacementMap, replacementSettersMap, typeBuilder);
                 }
               }
@@ -820,30 +875,31 @@
         fileSystem, includeComments, dillTarget, uriTranslator);
   }
 
-  /// Create a new [userCode] object, and add the reused builders to it.
-  void setupNewUserCode(
+  /// Create a new [IncrementalKernelTarget] object, and add the reused builders
+  /// to it.
+  IncrementalKernelTarget _setupNewKernelTarget(
       CompilerContext c,
       UriTranslator uriTranslator,
       ClassHierarchy? hierarchy,
       List<LibraryBuilder> reusedLibraries,
       ExperimentalInvalidation? experimentalInvalidation,
       Uri firstEntryPoint) {
-    userCode = createIncrementalKernelTarget(
+    IncrementalKernelTarget kernelTarget = createIncrementalKernelTarget(
         new HybridFileSystem(
             new MemoryFileSystem(
                 new Uri(scheme: "org-dartlang-debug", path: "/")),
             c.fileSystem),
         false,
-        dillLoadedData!,
+        _dillLoadedData!,
         uriTranslator);
-    userCode!.loader.hierarchy = hierarchy;
-    dillLoadedData!.loader.currentSourceLoader = userCode!.loader;
+    kernelTarget.loader.hierarchy = hierarchy;
+    _dillLoadedData!.loader.currentSourceLoader = kernelTarget.loader;
 
     // Re-use the libraries we've deemed re-usable.
     List<bool> seenModes = [false, false, false, false];
     for (LibraryBuilder library in reusedLibraries) {
       seenModes[library.library.nonNullableByDefaultCompiledMode.index] = true;
-      userCode!.loader.registerLibraryBuilder(library);
+      kernelTarget.loader.registerLibraryBuilder(library);
     }
     // Check compilation mode up against what we've seen here and set
     // `hasInvalidNnbdModeLibrary` accordingly.
@@ -853,14 +909,14 @@
           // Don't expect strong or invalid.
           if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode!.loader.hasInvalidNnbdModeLibrary = true;
+            kernelTarget.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
         case NnbdMode.Strong:
           // Don't expect weak or invalid.
           if (seenModes[NonNullableByDefaultCompiledMode.Weak.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode!.loader.hasInvalidNnbdModeLibrary = true;
+            kernelTarget.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
         case NnbdMode.Agnostic:
@@ -868,7 +924,7 @@
           if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Weak.index] ||
               seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-            userCode!.loader.hasInvalidNnbdModeLibrary = true;
+            kernelTarget.loader.hasInvalidNnbdModeLibrary = true;
           }
           break;
       }
@@ -876,75 +932,46 @@
       // Don't expect strong or invalid.
       if (seenModes[NonNullableByDefaultCompiledMode.Strong.index] ||
           seenModes[NonNullableByDefaultCompiledMode.Invalid.index]) {
-        userCode!.loader.hasInvalidNnbdModeLibrary = true;
+        kernelTarget.loader.hasInvalidNnbdModeLibrary = true;
       }
     }
 
-    // The entry point(s) has to be set first for loader.first to be setup
-    // correctly. If the first one is in the rebuildBodies, we have to add it
-    // from there first.
-    Uri firstEntryPointImportUri =
-        userCode!.getEntryPointUri(firstEntryPoint, issueProblem: false);
-    bool wasFirstSet = false;
-    if (experimentalInvalidation != null) {
-      for (LibraryBuilder library in experimentalInvalidation.rebuildBodies) {
-        if (library.importUri == firstEntryPointImportUri) {
-          userCode!.loader.read(library.importUri, -1,
-              accessor: userCode!.loader.first,
-              fileUri: library.fileUri,
-              referencesFrom: library.library);
-          wasFirstSet = true;
-          break;
-        }
-      }
-    }
-    if (!wasFirstSet) {
-      userCode!.loader.read(firstEntryPointImportUri, -1,
-          accessor: userCode!.loader.first,
-          fileUri: firstEntryPointImportUri != firstEntryPoint
-              ? firstEntryPoint
-              : null);
-    }
-    if (userCode!.loader.first == null) {
-      LibraryBuilder? libraryBuilder =
-          userCode!.loader.lookupLibraryBuilder(firstEntryPointImportUri);
-      if (libraryBuilder != null) {
-        userCode!.loader.first = libraryBuilder;
-      }
-    }
+    // The entry point(s) has to be set first for loader.firstUri to be setup
+    // correctly.
+    kernelTarget.loader.firstUri =
+        kernelTarget.getEntryPointUri(firstEntryPoint, issueProblem: false);
+    return kernelTarget;
   }
 
   /// When tracking used libraries we mark them when we use them. To track
   /// correctly we have to unmark before the next iteration to not have too much
   /// marked and therefore incorrectly marked something as used when it is not.
-  void resetTrackingOfUsedLibraries(ClassHierarchy? hierarchy) {
-    if (trackNeededDillLibraries) {
-      // Reset dill loaders and kernel class hierarchy.
-      for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
-        if (builder is DillLibraryBuilder) {
-          if (builder.isBuiltAndMarked) {
-            // Clear cached calculations in classes which upon calculation can
-            // mark things as needed.
-            for (Builder builder in builder.scope.localMembers) {
-              if (builder is DillClassBuilder) {
-                builder.clearCachedValues();
-              }
+  void _resetTrackingOfUsedLibraries(ClassHierarchy? hierarchy) {
+    // Reset dill loaders and kernel class hierarchy.
+    for (LibraryBuilder builder in _dillLoadedData!.loader.libraryBuilders) {
+      if (builder is DillLibraryBuilder) {
+        if (builder.isBuiltAndMarked) {
+          // Clear cached calculations in classes which upon calculation can
+          // mark things as needed.
+          for (Builder builder in builder.scope.localMembers) {
+            if (builder is DillClassBuilder) {
+              builder.clearCachedValues();
             }
-            builder.isBuiltAndMarked = false;
           }
+          builder.isBuiltAndMarked = false;
         }
       }
+    }
 
-      if (hierarchy is ClosedWorldClassHierarchy) {
-        hierarchy.resetUsed();
-      }
+    if (hierarchy is ClosedWorldClassHierarchy) {
+      hierarchy.resetUsed();
     }
   }
 
   /// Cleanup the hierarchy to no longer reference libraries that we are
   /// invalidating (or would normally have invalidated if we hadn't done any
   /// experimental invalidation).
-  void cleanupHierarchy(
+  void _cleanupHierarchy(
       ClassHierarchy? hierarchy,
       ExperimentalInvalidation? experimentalInvalidation,
       ReusageResult reusedResult) {
@@ -970,19 +997,20 @@
   /// If the package uris needs to be re-checked the uri translator has changed,
   /// and the [DillTarget] needs to get the new uri translator. We do that
   /// by creating a new one.
-  void recreateDillTargetIfPackageWasUpdated(
+  void _recreateDillTargetIfPackageWasUpdated(
       UriTranslator uriTranslator, CompilerContext c) {
-    if (hasToCheckPackageUris) {
+    if (_hasToCheckPackageUris) {
       // The package file was changed.
       // Make sure the dill loader is on the same page.
-      DillTarget oldDillLoadedData = dillLoadedData!;
-      dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
+      DillTarget oldDillLoadedData = _dillLoadedData!;
+      DillTarget newDillLoadedData = _dillLoadedData =
+          new DillTarget(_ticker, uriTranslator, c.options.target);
       for (DillLibraryBuilder library
           in oldDillLoadedData.loader.libraryBuilders) {
-        dillLoadedData!.loader.registerLibraryBuilder(library);
+        newDillLoadedData.loader.registerLibraryBuilder(library);
       }
-      dillLoadedData!.loader.first = oldDillLoadedData.loader.first;
-      dillLoadedData!.loader.libraries
+      newDillLoadedData.loader.first = oldDillLoadedData.loader.first;
+      newDillLoadedData.loader.libraries
           .addAll(oldDillLoadedData.loader.libraries);
     }
   }
@@ -994,37 +1022,34 @@
   /// We also have to remove any component problems beloning to any such
   /// no-longer-used library (to avoid re-issuing errors about no longer
   /// relevant stuff).
-  void cleanupRemovedBuilders(
+  void _cleanupRemovedBuilders(IncrementalKernelTarget? lastGoodKernelTarget,
       ReusageResult reusedResult, UriTranslator uriTranslator) {
     bool removedDillBuilders = false;
     for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
-      cleanupSourcesForBuilder(reusedResult, builder, uriTranslator,
-          CompilerContext.current.uriToSource);
-      incrementalSerializer?.invalidate(builder.fileUri);
+      _cleanupSourcesForBuilder(lastGoodKernelTarget, reusedResult, builder,
+          uriTranslator, CompilerContext.current.uriToSource);
+      _incrementalSerializer?.invalidate(builder.fileUri);
 
       LibraryBuilder? dillBuilder =
-          dillLoadedData!.loader.deregisterLibraryBuilder(builder.importUri);
+          _dillLoadedData!.loader.deregisterLibraryBuilder(builder.importUri);
       if (dillBuilder != null) {
         removedDillBuilders = true;
-        userBuilders?.remove(builder.importUri);
+        _userBuilders?.remove(builder.importUri);
       }
 
       // Remove component problems for libraries we don't reuse.
-      if (remainingComponentProblems.isNotEmpty) {
-        Library lib = builder.library;
-        removeLibraryFromRemainingComponentProblems(lib, uriTranslator);
-      }
+      _componentProblems.removeLibrary(builder.library, uriTranslator);
     }
 
     if (removedDillBuilders) {
-      makeDillLoaderLibrariesUpToDateWithBuildersMap();
+      _makeDillLoaderLibrariesUpToDateWithBuildersMap();
     }
   }
 
   bool _importsFfi() {
-    if (userBuilders == null) return false;
+    if (_userBuilders == null) return false;
     final Uri dartFfiUri = Uri.parse("dart:ffi");
-    for (LibraryBuilder builder in userBuilders!.values) {
+    for (LibraryBuilder builder in _userBuilders!.values) {
       Library lib = builder.library;
       for (LibraryDependency dependency in lib.dependencies) {
         if (dependency.targetLibrary.importUri == dartFfiUri) {
@@ -1038,7 +1063,7 @@
   /// Figure out if we can (and was asked to) do experimental invalidation.
   /// Note that this returns (future or) [null] if we're not doing experimental
   /// invalidation.
-  Future<ExperimentalInvalidation?> initializeExperimentalInvalidation(
+  Future<ExperimentalInvalidation?> _initializeExperimentalInvalidation(
       ReusageResult reusedResult, CompilerContext c) async {
     Set<LibraryBuilder>? rebuildBodies;
     Set<LibraryBuilder> originalNotReusedLibraries;
@@ -1046,7 +1071,7 @@
 
     if (!context.options.isExperimentEnabledGlobally(
         ExperimentalFlag.alternativeInvalidationStrategy)) return null;
-    if (modulesToLoad != null) return null;
+    if (_modulesToLoad != null) return null;
     if (reusedResult.directlyInvalidated.isEmpty) return null;
     if (reusedResult.invalidatedBecauseOfPackageUpdate) return null;
 
@@ -1185,29 +1210,30 @@
 
   /// Get UriTranslator, and figure out if the packages file was (potentially)
   /// changed.
-  Future<UriTranslator> setupPackagesAndUriTranslator(CompilerContext c) async {
+  Future<UriTranslator> _setupPackagesAndUriTranslator(
+      CompilerContext c) async {
     bool bypassCache = false;
-    if (!identical(previousPackagesUri, c.options.packagesUriRaw)) {
-      previousPackagesUri = c.options.packagesUriRaw;
+    if (!identical(_previousPackagesUri, c.options.packagesUriRaw)) {
+      _previousPackagesUri = c.options.packagesUriRaw;
       bypassCache = true;
-    } else if (this.invalidatedUris.contains(c.options.packagesUri)) {
+    } else if (this._invalidatedUris.contains(c.options.packagesUri)) {
       bypassCache = true;
     }
     UriTranslator uriTranslator =
         await c.options.getUriTranslator(bypassCache: bypassCache);
-    previousPackagesMap = currentPackagesMap;
-    currentPackagesMap = createPackagesMap(uriTranslator.packages);
+    _previousPackagesMap = _currentPackagesMap;
+    _currentPackagesMap = _createPackagesMap(uriTranslator.packages);
     // TODO(jensj): We can probably (from the maps above) figure out if anything
     // changed and only set this to true if it did.
-    hasToCheckPackageUris = hasToCheckPackageUris || bypassCache;
-    ticker.logMs("Read packages file");
-    if (initializedForExpressionCompilationOnly) {
-      hasToCheckPackageUris = false;
+    _hasToCheckPackageUris = _hasToCheckPackageUris || bypassCache;
+    _ticker.logMs("Read packages file");
+    if (_initializedForExpressionCompilationOnly) {
+      _hasToCheckPackageUris = false;
     }
     return uriTranslator;
   }
 
-  Map<String, Package> createPackagesMap(PackageConfig packages) {
+  Map<String, Package> _createPackagesMap(PackageConfig packages) {
     Map<String, Package> result = new Map<String, Package>();
     for (Package package in packages.packages) {
       result[package.name] = package;
@@ -1217,88 +1243,42 @@
 
   /// Load platform and (potentially) initialize from dill,
   /// or initialize from component.
-  Future<IncrementalCompilerData> ensurePlatformAndInitialize(
-      UriTranslator uriTranslator, CompilerContext c) async {
+  Future<IncrementalCompilerData> _ensurePlatformAndInitialize(
+      UriTranslator uriTranslator, CompilerContext context) async {
     IncrementalCompilerData data = new IncrementalCompilerData();
-    if (dillLoadedData == null) {
-      int bytesLength = 0;
-      if (componentToInitializeFrom != null) {
-        // If initializing from a component it has to include the sdk,
-        // so we explicitly don't load it here.
-        initializeFromComponent(uriTranslator, c, data);
-        componentToInitializeFrom = null;
-      } else {
-        List<int>? summaryBytes = await c.options.loadSdkSummaryBytes();
-        bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
-        if (initializeFromDillUri != null) {
-          try {
-            bytesLength += await initializeFromDill(uriTranslator, c, data);
-          } catch (e, st) {
-            // We might have loaded x out of y libraries into the component.
-            // To avoid any unforeseen problems start over.
-            bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
-
-            if (e is InvalidKernelVersionError ||
-                e is InvalidKernelSdkVersionError ||
-                e is PackageChangedError ||
-                e is CanonicalNameSdkError ||
-                e is CompilationModeError) {
-              // Don't report any warning.
-            } else {
-              Uri? gzInitializedFrom;
-              if (c.options.writeFileOnCrashReport) {
-                gzInitializedFrom = saveAsGzip(
-                    data.initializationBytes!, "initialize_from.dill");
-                recordTemporaryFileForTesting(gzInitializedFrom);
-              }
-              if (e is CanonicalNameError) {
-                Message message = gzInitializedFrom != null
-                    ? templateInitializeFromDillNotSelfContained.withArguments(
-                        initializeFromDillUri.toString(), gzInitializedFrom)
-                    : templateInitializeFromDillNotSelfContainedNoDump
-                        .withArguments(initializeFromDillUri.toString());
-                dillLoadedData!.loader
-                    .addProblem(message, TreeNode.noOffset, 1, null);
-              } else {
-                // Unknown error: Report problem as such.
-                Message message = gzInitializedFrom != null
-                    ? templateInitializeFromDillUnknownProblem.withArguments(
-                        initializeFromDillUri.toString(),
-                        "$e",
-                        "$st",
-                        gzInitializedFrom)
-                    : templateInitializeFromDillUnknownProblemNoDump
-                        .withArguments(
-                            initializeFromDillUri.toString(), "$e", "$st");
-                dillLoadedData!.loader
-                    .addProblem(message, TreeNode.noOffset, 1, null);
-              }
-            }
-          }
-        }
-      }
-      appendLibraries(data, bytesLength);
+    if (_dillLoadedData == null) {
+      DillTarget dillLoadedData = _dillLoadedData =
+          new DillTarget(_ticker, uriTranslator, context.options.target);
+      int bytesLength = await _initializationStrategy.initialize(
+          dillLoadedData,
+          uriTranslator,
+          context,
+          data,
+          _componentProblems,
+          _incrementalSerializer,
+          recorderForTesting);
+      _appendLibraries(data, bytesLength);
 
       // We suppress finalization errors because they will reported via
       // problemsAsJson fields (with better precision).
-      dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
-      userBuilders = <Uri, LibraryBuilder>{};
-      platformBuilders = <LibraryBuilder>[];
+      dillLoadedData.buildOutlines(suppressFinalizationErrors: true);
+      _userBuilders = <Uri, LibraryBuilder>{};
+      _platformBuilders = <LibraryBuilder>[];
       for (DillLibraryBuilder builder
-          in dillLoadedData!.loader.libraryBuilders) {
+          in dillLoadedData.loader.libraryBuilders) {
         if (builder.importUri.scheme == "dart") {
-          platformBuilders!.add(builder);
+          _platformBuilders!.add(builder);
         } else {
-          userBuilders![builder.importUri] = builder;
+          _userBuilders![builder.importUri] = builder;
         }
       }
-      if (userBuilders!.isEmpty) userBuilders = null;
+      if (_userBuilders!.isEmpty) _userBuilders = null;
     }
     data.initializationBytes = null;
     return data;
   }
 
-  void replaceTypeBuilder(
+  void _replaceTypeBuilder(
       Map<LibraryBuilder, Map<String, Builder>> replacementMap,
       Map<LibraryBuilder, Map<String, Builder>> replacementSettersMap,
       TypeBuilder? typeBuilder) {
@@ -1319,12 +1299,6 @@
     typeBuilder!.bind(replacement as TypeDeclarationBuilder);
   }
 
-  @override
-  CoreTypes? getCoreTypes() => userCode?.loader.coreTypes;
-
-  @override
-  ClassHierarchy? getClassHierarchy() => userCode?.loader.hierarchy;
-
   /// Allows for updating the list of needed libraries.
   ///
   /// Useful if a class hierarchy has been used externally.
@@ -1337,9 +1311,9 @@
   /// (though handling of the case where all bets are off should probably still
   /// live locally).
   void updateNeededDillLibrariesWithHierarchy(
-      ClassHierarchy hierarchy, ClassHierarchyBuilder? builderHierarchy) {
+      Set<Library> neededDillLibraries, ClassHierarchy hierarchy,
+      [ClassHierarchyBuilder? builderHierarchy]) {
     if (hierarchy is ClosedWorldClassHierarchy && !hierarchy.allBetsOff) {
-      neededDillLibraries ??= new Set<Library>();
       Set<Class> classes = new Set<Class>();
       List<Class> worklist = <Class>[];
       // Get all classes touched by kernel class hierarchy.
@@ -1380,35 +1354,35 @@
         Library library = c.enclosingLibrary;
         // Only add if loaded from a dill file (and wasn't a 'dill' that was
         // converted from source builders to dill builders).
-        if (dillLoadedData!.loader.containsLibraryBuilder(library.importUri) &&
-            (previousSourceBuilders == null ||
-                !previousSourceBuilders!.contains(library))) {
-          neededDillLibraries!.add(library);
+        if (_dillLoadedData!.loader.containsLibraryBuilder(library.importUri) &&
+            (_previousSourceBuilders == null ||
+                !_previousSourceBuilders!.contains(library))) {
+          neededDillLibraries.add(library);
         }
       }
     } else {
       // Cannot track in other kernel class hierarchies or
       // if all bets are off: Add everything (except for the libraries we just
       // converted from source builders to dill builders).
-      neededDillLibraries = new Set<Library>();
+      neededDillLibraries.clear();
       for (DillLibraryBuilder builder
-          in dillLoadedData!.loader.libraryBuilders) {
-        if (previousSourceBuilders == null ||
-            !previousSourceBuilders!.contains(builder.library)) {
-          neededDillLibraries!.add(builder.library);
+          in _dillLoadedData!.loader.libraryBuilders) {
+        if (_previousSourceBuilders == null ||
+            !_previousSourceBuilders!.contains(builder.library)) {
+          neededDillLibraries.add(builder.library);
         }
       }
     }
   }
 
   /// Internal method.
-  void invalidateNotKeptUserBuilders(Set<Uri?> invalidatedUris) {
-    if (modulesToLoad != null && userBuilders != null) {
+  void _invalidateNotKeptUserBuilders(Set<Uri?> invalidatedUris) {
+    if (_modulesToLoad != null && _userBuilders != null) {
       Set<Library> loadedNotKept = new Set<Library>();
-      for (LibraryBuilder builder in userBuilders!.values) {
+      for (LibraryBuilder builder in _userBuilders!.values) {
         loadedNotKept.add(builder.library);
       }
-      for (Component module in modulesToLoad!) {
+      for (Component module in _modulesToLoad!) {
         loadedNotKept.removeAll(module.libraries);
       }
       for (Library lib in loadedNotKept) {
@@ -1418,43 +1392,44 @@
   }
 
   /// Internal method.
-  void loadEnsureLoadedComponents(List<LibraryBuilder> reusedLibraries) {
-    if (modulesToLoad != null) {
+  void _loadEnsureLoadedComponents(List<LibraryBuilder> reusedLibraries) {
+    if (_modulesToLoad != null) {
       bool loadedAnything = false;
-      for (Component module in modulesToLoad!) {
+      for (Component module in _modulesToLoad!) {
         bool usedComponent = false;
         for (Library lib in module.libraries) {
-          if (!dillLoadedData!.loader.containsLibraryBuilder(lib.importUri)) {
-            dillLoadedData!.loader.libraries.add(lib);
-            dillLoadedData!.loader.registerKnownLibrary(lib);
-            reusedLibraries.add(dillLoadedData!.loader.read(lib.importUri, -1));
+          if (!_dillLoadedData!.loader.containsLibraryBuilder(lib.importUri)) {
+            _dillLoadedData!.loader.libraries.add(lib);
+            _dillLoadedData!.loader.registerKnownLibrary(lib);
+            reusedLibraries
+                .add(_dillLoadedData!.loader.read(lib.importUri, -1));
             usedComponent = true;
           }
         }
         if (usedComponent) {
-          dillLoadedData!.uriToSource.addAll(module.uriToSource);
+          _dillLoadedData!.uriToSource.addAll(module.uriToSource);
           loadedAnything = true;
         }
       }
       if (loadedAnything) {
         // We suppress finalization errors because they will reported via
         // problemsAsJson fields (with better precision).
-        dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
-        userBuilders = <Uri, LibraryBuilder>{};
-        platformBuilders = <LibraryBuilder>[];
+        _dillLoadedData!.buildOutlines(suppressFinalizationErrors: true);
+        _userBuilders = <Uri, LibraryBuilder>{};
+        _platformBuilders = <LibraryBuilder>[];
         for (DillLibraryBuilder builder
-            in dillLoadedData!.loader.libraryBuilders) {
+            in _dillLoadedData!.loader.libraryBuilders) {
           if (builder.importUri.scheme == "dart") {
-            platformBuilders!.add(builder);
+            _platformBuilders!.add(builder);
           } else {
-            userBuilders![builder.importUri] = builder;
+            _userBuilders![builder.importUri] = builder;
           }
         }
-        if (userBuilders!.isEmpty) {
-          userBuilders = null;
+        if (_userBuilders!.isEmpty) {
+          _userBuilders = null;
         }
       }
-      modulesToLoad = null;
+      _modulesToLoad = null;
     }
   }
 
@@ -1463,7 +1438,7 @@
   }
 
   /// Internal method.
-  void reissueLibraryProblems(
+  void _reissueLibraryProblems(
       Set<Library> allLibraries, List<Library> compiledLibraries) {
     // The newly-compiled libraries have issued problems already. Re-issue
     // problems for the libraries that weren't re-compiled (ignore compile
@@ -1484,75 +1459,12 @@
   }
 
   /// Internal method.
-  /// Re-issue problems on the component and return the filtered list.
-  List<String> reissueComponentProblems(Component componentWithDill) {
-    // These problems have already been reported.
-    Set<String> issuedProblems = new Set<String>();
-    if (componentWithDill.problemsAsJson != null) {
-      issuedProblems.addAll(componentWithDill.problemsAsJson!);
-    }
-
-    // Report old problems that wasn't reported again.
-    Set<Uri>? strongModeNNBDPackageOptOutUris;
-    for (MapEntry<Uri, List<DiagnosticMessageFromJson>> entry
-        in remainingComponentProblems.entries) {
-      List<DiagnosticMessageFromJson> messages = entry.value;
-      for (int i = 0; i < messages.length; i++) {
-        DiagnosticMessageFromJson message = messages[i];
-        if (message.codeName == "StrongModeNNBDPackageOptOut") {
-          // Special case this: Don't issue them here; instead collect them
-          // to get their uris and re-issue a new error.
-          strongModeNNBDPackageOptOutUris ??= {};
-          strongModeNNBDPackageOptOutUris.add(entry.key);
-          continue;
-        }
-        if (issuedProblems.add(message.toJsonString())) {
-          context.options.reportDiagnosticMessage(message);
-        }
-      }
-    }
-    if (strongModeNNBDPackageOptOutUris != null) {
-      // Get the builders for these uris; then call
-      // `SourceLoader.giveCombinedErrorForNonStrongLibraries` on them to issue
-      // a new error.
-      Set<LibraryBuilder> builders = {};
-      SourceLoader loader = userCode!.loader;
-      for (LibraryBuilder builder in loader.libraryBuilders) {
-        if (strongModeNNBDPackageOptOutUris.contains(builder.fileUri)) {
-          builders.add(builder);
-        }
-      }
-      FormattedMessage message = loader.giveCombinedErrorForNonStrongLibraries(
-          builders,
-          emitNonPackageErrors: false)!;
-      issuedProblems.add(message.toJsonString());
-      // The problem was issued by the call so don't re-issue it here.
-    }
-
-    // Save any new component-problems.
-    _addProblemsAsJsonToRemainingProblems(componentWithDill.problemsAsJson);
-    return new List<String>.from(issuedProblems);
-  }
-
-  /// Internal method.
-  Uri? getPartFileUri(
-      Uri parentFileUri, LibraryPart part, UriTranslator uriTranslator) {
-    Uri? fileUri = getPartUri(parentFileUri, part);
-    if (fileUri.scheme == "package") {
-      // Part was specified via package URI and the resolve above thus
-      // did not go as expected. Translate the package URI to get the
-      // actual file URI.
-      fileUri = uriTranslator.translate(fileUri, false);
-    }
-    return fileUri;
-  }
-
-  /// Internal method.
   /// Compute the transitive closure.
   ///
   /// As a side-effect, this also cleans-up now-unreferenced builders as well as
   /// any saved component problems for such builders.
-  List<Library> computeTransitiveClosure(
+  List<Library> _computeTransitiveClosure(
+      IncrementalKernelTarget currentKernelTarget,
       List<Library> inputLibraries,
       List<Uri> entryPoints,
       List<LibraryBuilder> reusedLibraries,
@@ -1622,7 +1534,7 @@
           }
           for (LibraryPart part in library.parts) {
             Uri? partFileUri =
-                getPartFileUri(library.fileUri, part, uriTranslator);
+                uriTranslator.getPartFileUri(library.fileUri, part);
             partsUsed.add(partFileUri);
           }
         }
@@ -1633,26 +1545,32 @@
     bool removedDillBuilders = false;
     for (Uri uri in potentiallyReferencedLibraries.keys) {
       if (uri.scheme == "package") continue;
-      LibraryBuilder? builder = userCode!.loader.deregisterLibraryBuilder(uri);
+      LibraryBuilder? builder =
+          currentKernelTarget.loader.deregisterLibraryBuilder(uri);
       if (builder != null) {
         Library lib = builder.library;
         removedLibraries.add(lib);
-        if (dillLoadedData!.loader.deregisterLibraryBuilder(uri) != null) {
+        if (_dillLoadedData!.loader.deregisterLibraryBuilder(uri) != null) {
           removedDillBuilders = true;
         }
-        cleanupSourcesForBuilder(null, builder, uriTranslator,
-            CompilerContext.current.uriToSource, uriToSource, partsUsed);
-        userBuilders?.remove(uri);
-        removeLibraryFromRemainingComponentProblems(
-            lib, uriTranslator, partsUsed);
+        _cleanupSourcesForBuilder(
+            currentKernelTarget,
+            null,
+            builder,
+            uriTranslator,
+            CompilerContext.current.uriToSource,
+            uriToSource,
+            partsUsed);
+        _userBuilders?.remove(uri);
+        _componentProblems.removeLibrary(lib, uriTranslator, partsUsed);
 
         // Technically this isn't necessary as the uri is not a package-uri.
-        incrementalSerializer?.invalidate(builder.fileUri);
+        _incrementalSerializer?.invalidate(builder.fileUri);
       }
     }
     hierarchy.applyTreeChanges(removedLibraries, const [], const []);
     if (removedDillBuilders) {
-      makeDillLoaderLibrariesUpToDateWithBuildersMap();
+      _makeDillLoaderLibrariesUpToDateWithBuildersMap();
     }
 
     return result;
@@ -1663,10 +1581,10 @@
   /// will still hang around and be linked into the Component created internally
   /// in the compilation process.
   /// This method syncs the [libraries] list with the data in [builders].
-  void makeDillLoaderLibrariesUpToDateWithBuildersMap() {
-    dillLoadedData!.loader.libraries.clear();
-    for (LibraryBuilder builder in dillLoadedData!.loader.libraryBuilders) {
-      dillLoadedData!.loader.libraries.add(builder.library);
+  void _makeDillLoaderLibrariesUpToDateWithBuildersMap() {
+    _dillLoadedData!.loader.libraries.clear();
+    for (LibraryBuilder builder in _dillLoadedData!.loader.libraryBuilders) {
+      _dillLoadedData!.loader.libraries.add(builder.library);
     }
   }
 
@@ -1675,7 +1593,8 @@
   /// [partsUsed] indicates part uris that are used by (other/alive) libraries.
   /// Those parts will not be cleaned up. This is useful when a part has been
   /// "moved" to be part of another library.
-  void cleanupSourcesForBuilder(
+  void _cleanupSourcesForBuilder(
+      IncrementalKernelTarget? lastGoodKernelTarget,
       ReusageResult? reusedResult,
       LibraryBuilder builder,
       UriTranslator uriTranslator,
@@ -1686,20 +1605,21 @@
     uriToSourceExtra?.remove(builder.fileUri);
     Library lib = builder.library;
     for (LibraryPart part in lib.parts) {
-      Uri? partFileUri = getPartFileUri(lib.fileUri, part, uriTranslator);
+      Uri? partFileUri = uriTranslator.getPartFileUri(lib.fileUri, part);
       if (partsUsed != null && partsUsed.contains(partFileUri)) continue;
 
       // If the builders map contain the "parts" import uri, it's a real library
       // (erroneously) used as a part so we don't want to remove that.
-      if (userCode?.loader != null) {
+      if (lastGoodKernelTarget?.loader != null) {
         Uri? partImportUri = uriToSource[partFileUri]?.importUri;
         if (partImportUri != null &&
-            userCode!.loader.containsLibraryBuilder(partImportUri)) {
+            lastGoodKernelTarget!.loader
+                .containsLibraryBuilder(partImportUri)) {
           continue;
         }
       } else if (reusedResult != null) {
-        // We've just launched and don't have userCode yet. Search reusedResult
-        // for a kept library with this uri.
+        // We've just launched and don't have [lastGoodKernelTarget] yet. Search
+        // reusedResult for a kept library with this uri.
         bool found = false;
         for (int i = 0; i < reusedResult.reusedLibraries.length; i++) {
           LibraryBuilder reusedLibrary = reusedResult.reusedLibraries[i];
@@ -1718,195 +1638,12 @@
   }
 
   /// Internal method.
-  ///
-  /// [partsUsed] indicates part uris that are used by (other/alive) libraries.
-  /// Those parts will not be removed from the component problems.
-  /// This is useful when a part has been "moved" to be part of another library.
-  void removeLibraryFromRemainingComponentProblems(
-      Library lib, UriTranslator uriTranslator,
-      [Set<Uri?>? partsUsed]) {
-    remainingComponentProblems.remove(lib.fileUri);
-    // Remove parts too.
-    for (LibraryPart part in lib.parts) {
-      Uri? partFileUri = getPartFileUri(lib.fileUri, part, uriTranslator);
-      remainingComponentProblems.remove(partFileUri);
-    }
-  }
-
-  /// Internal method.
-  int prepareSummary(List<int>? summaryBytes, UriTranslator uriTranslator,
-      CompilerContext c, IncrementalCompilerData data) {
-    dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
-    int bytesLength = 0;
-
-    data.component = c.options.target.configureComponent(new Component());
-    if (summaryBytes != null) {
-      ticker.logMs("Read ${c.options.sdkSummary}");
-      new BinaryBuilderWithMetadata(summaryBytes,
-              disableLazyReading: false, disableLazyClassReading: true)
-          .readComponent(data.component!);
-      ticker.logMs("Deserialized ${c.options.sdkSummary}");
-      bytesLength += summaryBytes.length;
-    }
-
-    return bytesLength;
-  }
-
-  /// Internal method.
-  // This procedure will try to load the dill file and will crash if it cannot.
-  Future<int> initializeFromDill(UriTranslator uriTranslator, CompilerContext c,
-      IncrementalCompilerData data) async {
-    int bytesLength = 0;
-    FileSystemEntity entity =
-        c.options.fileSystem.entityForUri(initializeFromDillUri!);
-    if (await entity.exists()) {
-      List<int> initializationBytes = await entity.readAsBytes();
-      // ignore: unnecessary_null_comparison
-      if (initializationBytes != null && initializationBytes.isNotEmpty) {
-        ticker.logMs("Read $initializeFromDillUri");
-        data.initializationBytes = initializationBytes;
-
-        // We're going to output all we read here so lazy loading it
-        // doesn't make sense.
-        List<SubComponentView> views = new BinaryBuilderWithMetadata(
-                initializationBytes,
-                disableLazyReading: true)
-            .readComponent(data.component!,
-                checkCanonicalNames: true, createView: true)!;
-
-        // Compute "output nnbd mode".
-        NonNullableByDefaultCompiledMode compiledMode;
-        if (c.options
-            .isExperimentEnabledGlobally(ExperimentalFlag.nonNullable)) {
-          switch (c.options.nnbdMode) {
-            case NnbdMode.Weak:
-              compiledMode = NonNullableByDefaultCompiledMode.Weak;
-              break;
-            case NnbdMode.Strong:
-              compiledMode = NonNullableByDefaultCompiledMode.Strong;
-              break;
-            case NnbdMode.Agnostic:
-              compiledMode = NonNullableByDefaultCompiledMode.Agnostic;
-              break;
-          }
-        } else {
-          compiledMode = NonNullableByDefaultCompiledMode.Weak;
-        }
-
-        // Check the any package-urls still point to the same file
-        // (e.g. the package still exists and hasn't been updated).
-        // Also verify NNBD settings.
-        for (Library lib in data.component!.libraries) {
-          if (lib.importUri.scheme == "package" &&
-              uriTranslator.translate(lib.importUri, false) != lib.fileUri) {
-            // Package has been removed or updated.
-            // This library should be thrown away.
-            // Everything that depends on it should be thrown away.
-            // TODO(jensj): Anything that doesn't depend on it can be kept.
-            // For now just don't initialize from this dill.
-            throw const PackageChangedError();
-          }
-          // Note: If a library has a NonNullableByDefaultCompiledMode.invalid
-          // we will throw and we won't initialize from it.
-          // That's wanted behavior.
-          if (compiledMode !=
-              mergeCompilationModeOrThrow(
-                  compiledMode, lib.nonNullableByDefaultCompiledMode)) {
-            throw new CompilationModeError(
-                "Can't compile to $compiledMode with library with mode "
-                "${lib.nonNullableByDefaultCompiledMode}.");
-          }
-        }
-
-        // Only initialize the incremental serializer when we know we'll
-        // actually use the data loaded from dill.
-        initializedIncrementalSerializer =
-            incrementalSerializer?.initialize(initializationBytes, views) ??
-                false;
-
-        initializedFromDill = true;
-        bytesLength += initializationBytes.length;
-        saveComponentProblems(data);
-      }
-    }
-    return bytesLength;
-  }
-
-  /// Internal method.
-  void saveComponentProblems(IncrementalCompilerData data) {
-    List<String>? problemsAsJson = data.component!.problemsAsJson;
-    _addProblemsAsJsonToRemainingProblems(problemsAsJson);
-  }
-
-  void _addProblemsAsJsonToRemainingProblems(List<String>? problemsAsJson) {
-    if (problemsAsJson != null) {
-      for (String jsonString in problemsAsJson) {
-        DiagnosticMessageFromJson message =
-            new DiagnosticMessageFromJson.fromJson(jsonString);
-        assert(message.uri != null ||
-            (message.involvedFiles != null &&
-                message.involvedFiles!.isNotEmpty));
-        if (message.uri != null) {
-          List<DiagnosticMessageFromJson> messages =
-              remainingComponentProblems[message.uri!] ??=
-                  <DiagnosticMessageFromJson>[];
-          messages.add(message);
-        }
-        if (message.involvedFiles != null) {
-          // This indexes the same message under several uris - this way it will
-          // be issued as long as it's a problem. It will because of
-          // deduplication when we re-issue these (in reissueComponentProblems)
-          // only be reported once.
-          for (Uri uri in message.involvedFiles!) {
-            List<DiagnosticMessageFromJson> messages =
-                remainingComponentProblems[uri] ??=
-                    <DiagnosticMessageFromJson>[];
-            messages.add(message);
-          }
-        }
-      }
-    }
-  }
-
-  /// Internal method.
-  // This procedure will set up compiler from [componentToInitializeFrom].
-  void initializeFromComponent(UriTranslator uriTranslator, CompilerContext c,
-      IncrementalCompilerData data) {
-    ticker.logMs("About to initializeFromComponent");
-
-    dillLoadedData = new DillTarget(ticker, uriTranslator, c.options.target);
-    data.component = new Component(
-        libraries: componentToInitializeFrom!.libraries,
-        uriToSource: componentToInitializeFrom!.uriToSource)
-      ..setMainMethodAndMode(componentToInitializeFrom!.mainMethod?.reference,
-          true, componentToInitializeFrom!.mode);
-    saveComponentProblems(data);
-
-    bool foundDartCore = false;
-    for (int i = 0; i < data.component!.libraries.length; i++) {
-      Library library = data.component!.libraries[i];
-      if (library.importUri.scheme == "dart" &&
-          library.importUri.path == "core") {
-        foundDartCore = true;
-        break;
-      }
-    }
-
-    if (!foundDartCore) {
-      throw const InitializeFromComponentError("Did not find dart:core when "
-          "tried to initialize from component.");
-    }
-
-    ticker.logMs("Ran initializeFromComponent");
-  }
-
-  /// Internal method.
-  void appendLibraries(IncrementalCompilerData data, int bytesLength) {
+  void _appendLibraries(IncrementalCompilerData data, int bytesLength) {
     if (data.component != null) {
-      dillLoadedData!.loader
+      _dillLoadedData!.loader
           .appendLibraries(data.component!, byteCount: bytesLength);
     }
-    ticker.logMs("Appended libraries");
+    _ticker.logMs("Appended libraries");
   }
 
   @override
@@ -1919,12 +1656,13 @@
       {String? className,
       String? methodName,
       bool isStatic = false}) async {
-    assert(dillLoadedData != null && userCode != null);
+    IncrementalKernelTarget? lastGoodKernelTarget = this._lastGoodKernelTarget;
+    assert(_dillLoadedData != null && lastGoodKernelTarget != null);
 
     return await context.runInContext((_) async {
-      LibraryBuilder libraryBuilder = userCode!.loader
-          .read(libraryUri, -1, accessor: userCode!.loader.first);
-      ticker.logMs("Loaded library $libraryUri");
+      LibraryBuilder libraryBuilder =
+          lastGoodKernelTarget!.loader.readAsEntryPoint(libraryUri);
+      _ticker.logMs("Loaded library $libraryUri");
 
       Class? cls;
       if (className != null) {
@@ -1954,11 +1692,11 @@
         }
       }
 
-      userCode!.loader.resetSeenMessages();
+      lastGoodKernelTarget.loader.resetSeenMessages();
 
       for (TypeParameter typeParam in typeDefinitions) {
         if (!isLegalIdentifier(typeParam.name!)) {
-          userCode!.loader.addProblem(
+          lastGoodKernelTarget.loader.addProblem(
               templateIncrementalCompilerIllegalTypeParameter
                   .withArguments('$typeParam'),
               typeParam.fileOffset,
@@ -1975,7 +1713,7 @@
                 !isStatic &&
                 index == 1 &&
                 isExtensionThisName(name)))) {
-          userCode!.loader.addProblem(
+          lastGoodKernelTarget.loader.addProblem(
               templateIncrementalCompilerIllegalParameter.withArguments(name),
               // TODO: pass variable declarations instead of
               // parameter names for proper location detection.
@@ -1988,16 +1726,15 @@
       }
 
       SourceLibraryBuilder debugLibrary = new SourceLibraryBuilder(
-        libraryUri,
-        debugExprUri,
-        /*packageUri*/ null,
-        new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
-        userCode!.loader,
-        null,
+        importUri: libraryUri,
+        fileUri: debugExprUri,
+        packageLanguageVersion:
+            new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
+        loader: lastGoodKernelTarget.loader,
         scope: libraryBuilder.scope.createNestedScope("expression"),
         nameOrigin: libraryBuilder,
       );
-      ticker.logMs("Created debug library");
+      _ticker.logMs("Created debug library");
 
       if (libraryBuilder is DillLibraryBuilder) {
         for (LibraryDependency dependency
@@ -2030,10 +1767,11 @@
         }
 
         debugLibrary.addImportsToScope();
-        ticker.logMs("Added imports");
+        _ticker.logMs("Added imports");
       }
 
-      HybridFileSystem hfs = userCode!.fileSystem as HybridFileSystem;
+      HybridFileSystem hfs =
+          lastGoodKernelTarget.fileSystem as HybridFileSystem;
       MemoryFileSystem fs = hfs.memory;
       fs.entityForUri(debugExprUri).writeAsStringSync(expression);
 
@@ -2061,13 +1799,15 @@
         }
       }
 
-      debugLibrary.build(userCode!.loader.coreLibrary, modifyTarget: false);
-      Expression compiledExpression = await userCode!.loader.buildExpression(
-          debugLibrary,
-          className ?? extensionName,
-          (className != null && !isStatic) || extensionThis != null,
-          parameters,
-          extensionThis);
+      debugLibrary.build(lastGoodKernelTarget.loader.coreLibrary,
+          modifyTarget: false);
+      Expression compiledExpression = await lastGoodKernelTarget.loader
+          .buildExpression(
+              debugLibrary,
+              className ?? extensionName,
+              (className != null && !isStatic) || extensionThis != null,
+              parameters,
+              extensionThis);
 
       Procedure procedure = new Procedure(
           new Name(syntheticProcedureName), ProcedureKind.Method, parameters,
@@ -2080,21 +1820,21 @@
       procedure.fileUri = debugLibrary.fileUri;
       procedure.parent = cls ?? libraryBuilder.library;
 
-      userCode!.uriToSource.remove(debugExprUri);
-      userCode!.loader.sourceBytes.remove(debugExprUri);
+      lastGoodKernelTarget.uriToSource.remove(debugExprUri);
+      lastGoodKernelTarget.loader.sourceBytes.remove(debugExprUri);
 
       // Make sure the library has a canonical name.
       Component c = new Component(libraries: [debugLibrary.library]);
       c.computeCanonicalNames();
-      ticker.logMs("Built debug library");
+      _ticker.logMs("Built debug library");
 
-      userCode!.runProcedureTransformations(procedure);
+      lastGoodKernelTarget.runProcedureTransformations(procedure);
 
       return procedure;
     });
   }
 
-  bool packagesEqual(Package? a, Package? b) {
+  bool _packagesEqual(Package? a, Package? b) {
     if (a == null || b == null) return false;
     if (a.name != b.name) return false;
     if (a.root != b.root) return false;
@@ -2105,16 +1845,20 @@
   }
 
   /// Internal method.
-  ReusageResult computeReusedLibraries(Set<Uri?> invalidatedUris,
-      UriTranslator uriTranslator, List<Uri> entryPoints) {
+  ReusageResult _computeReusedLibraries(
+      IncrementalKernelTarget? lastGoodKernelTarget,
+      Map<Uri, LibraryBuilder>? _userBuilders,
+      Set<Uri?> invalidatedUris,
+      UriTranslator uriTranslator,
+      List<Uri> entryPoints) {
     Set<Uri> seenUris = new Set<Uri>();
     List<LibraryBuilder> reusedLibraries = <LibraryBuilder>[];
-    for (int i = 0; i < platformBuilders!.length; i++) {
-      LibraryBuilder builder = platformBuilders![i];
+    for (int i = 0; i < _platformBuilders!.length; i++) {
+      LibraryBuilder builder = _platformBuilders![i];
       if (!seenUris.add(builder.importUri)) continue;
       reusedLibraries.add(builder);
     }
-    if (userCode == null && userBuilders == null) {
+    if (lastGoodKernelTarget == null && _userBuilders == null) {
       return new ReusageResult.reusedLibrariesOnly(reusedLibraries);
     }
     bool invalidatedBecauseOfPackageUpdate = false;
@@ -2134,16 +1878,16 @@
       if (importUri != fileUri && invalidatedUris.contains(fileUri)) {
         return true;
       }
-      if (hasToCheckPackageUris && importUri.scheme == "package") {
+      if (_hasToCheckPackageUris && importUri.scheme == "package") {
         // Get package name, check if the base URI has changed for the package,
         // if it has, translate the URI again,
         // otherwise the URI cannot have changed.
         String path = importUri.path;
         int firstSlash = path.indexOf('/');
         String packageName = path.substring(0, firstSlash);
-        if (previousPackagesMap == null ||
-            !packagesEqual(previousPackagesMap![packageName],
-                currentPackagesMap![packageName])) {
+        if (_previousPackagesMap == null ||
+            !_packagesEqual(_previousPackagesMap![packageName],
+                _currentPackagesMap![packageName])) {
           Uri? newFileUri = uriTranslator.translate(importUri, false);
           if (newFileUri != fileUri) {
             invalidatedBecauseOfPackageUpdate = true;
@@ -2179,8 +1923,8 @@
       } else if (libraryBuilder is DillLibraryBuilder) {
         for (LibraryPart part in libraryBuilder.library.parts) {
           Uri partUri = getPartUri(libraryBuilder.importUri, part);
-          Uri? fileUri = getPartFileUri(
-              libraryBuilder.library.fileUri, part, uriTranslator);
+          Uri? fileUri = uriTranslator.getPartFileUri(
+              libraryBuilder.library.fileUri, part);
           partUriToParent[partUri] = libraryBuilder;
           partUriToParent[fileUri] = libraryBuilder;
 
@@ -2198,19 +1942,21 @@
       }
     }
 
-    if (userCode != null) {
-      // userCode already contains the builders from userBuilders.
-      for (LibraryBuilder libraryBuilder in userCode!.loader.libraryBuilders) {
+    if (lastGoodKernelTarget != null) {
+      // [lastGoodKernelTarget] already contains the builders from
+      // [userBuilders].
+      for (LibraryBuilder libraryBuilder
+          in lastGoodKernelTarget.loader.libraryBuilders) {
         addBuilderAndInvalidateUris(libraryBuilder.importUri, libraryBuilder);
       }
     } else {
-      // userCode was null so we explicitly have to add the builders from
-      // userBuilders (which cannot be null as we checked initially that one of
-      // them was non-null).
-      userBuilders!.forEach(addBuilderAndInvalidateUris);
+      // [lastGoodKernelTarget] was null so we explicitly have to add the
+      // builders from [userBuilders] (which cannot be null as we checked
+      // initially that one of them was non-null).
+      _userBuilders!.forEach(addBuilderAndInvalidateUris);
     }
 
-    recordInvalidatedImportUrisForTesting(invalidatedImportUris);
+    recorderForTesting?.recordInvalidatedImportUris(invalidatedImportUris);
     for (Uri uri in invalidatedImportUris) {
       directlyInvalidated.add(builders[uri]!);
     }
@@ -2286,39 +2032,29 @@
 
   @override
   void invalidate(Uri? uri) {
-    invalidatedUris.add(uri);
+    _invalidatedUris.add(uri);
   }
 
   @override
   void invalidateAllSources() {
-    if (userCode != null) {
-      Set<Uri> uris = new Set<Uri>.from(userCode!.loader.libraryImportUris);
-      uris.removeAll(dillLoadedData!.loader.libraryImportUris);
-      if (previousSourceBuilders != null) {
-        for (Library library in previousSourceBuilders!) {
+    IncrementalKernelTarget? lastGoodKernelTarget = this._lastGoodKernelTarget;
+    if (lastGoodKernelTarget != null) {
+      Set<Uri> uris =
+          new Set<Uri>.from(lastGoodKernelTarget.loader.libraryImportUris);
+      uris.removeAll(_dillLoadedData!.loader.libraryImportUris);
+      if (_previousSourceBuilders != null) {
+        for (Library library in _previousSourceBuilders!) {
           uris.add(library.importUri);
         }
       }
-      invalidatedUris.addAll(uris);
+      _invalidatedUris.addAll(uris);
     }
   }
 
   @override
   void setModulesToLoadOnNextComputeDelta(List<Component> components) {
-    modulesToLoad = components.toList();
+    _modulesToLoad = components.toList();
   }
-
-  /// Internal method.
-  void recordNonFullComponentForTesting(Component component) {}
-
-  /// Internal method.
-  void recordInvalidatedImportUrisForTesting(List<Uri> uris) {}
-
-  /// Internal method.
-  void recordRebuildBodiesCountForTesting(int count) {}
-
-  /// Internal method.
-  void recordTemporaryFileForTesting(Uri uri) {}
 }
 
 /// Translate a parts "partUri" to an actual uri with handling of invalid uris.
@@ -2482,3 +2218,414 @@
     librariesUsed.addAll(visitedLibraries);
   }
 }
+
+abstract class _InitializationStrategy {
+  const _InitializationStrategy();
+
+  factory _InitializationStrategy.fromComponent(Component? component) {
+    return component != null
+        ? new _InitializationFromComponent(component)
+        : const _InitializationFromSdkSummary();
+  }
+
+  factory _InitializationStrategy.fromUri(Uri? uri) {
+    return uri != null
+        ? new _InitializationFromUri(uri)
+        : const _InitializationFromSdkSummary();
+  }
+
+  bool get initializedFromDillForTesting => false;
+
+  bool get initializedIncrementalSerializerForTesting => false;
+
+  Future<int> initialize(
+      DillTarget dillLoadedData,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems componentProblems,
+      IncrementalSerializer? incrementalSerializer,
+      RecorderForTesting? recorderForTesting);
+}
+
+class _InitializationFromSdkSummary extends _InitializationStrategy {
+  const _InitializationFromSdkSummary();
+
+  @override
+  Future<int> initialize(
+      DillTarget dillLoadedData,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems componentProblems,
+      IncrementalSerializer? incrementalSerializer,
+      RecorderForTesting? recorderForTesting) async {
+    List<int>? summaryBytes = await context.options.loadSdkSummaryBytes();
+    return _prepareSummary(
+        dillLoadedData, summaryBytes, uriTranslator, context, data);
+  }
+
+  int _prepareSummary(
+      DillTarget dillLoadedTarget,
+      List<int>? summaryBytes,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data) {
+    int bytesLength = 0;
+
+    data.component = context.options.target.configureComponent(new Component());
+    if (summaryBytes != null) {
+      dillLoadedTarget.ticker.logMs("Read ${context.options.sdkSummary}");
+      new BinaryBuilderWithMetadata(summaryBytes,
+              disableLazyReading: false, disableLazyClassReading: true)
+          .readComponent(data.component!);
+      dillLoadedTarget.ticker
+          .logMs("Deserialized ${context.options.sdkSummary}");
+      bytesLength += summaryBytes.length;
+    }
+
+    return bytesLength;
+  }
+}
+
+class _InitializationFromComponent extends _InitializationStrategy {
+  Component componentToInitializeFrom;
+
+  _InitializationFromComponent(this.componentToInitializeFrom);
+
+  @override
+  Future<int> initialize(
+      DillTarget dillLoadedData,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems componentProblems,
+      IncrementalSerializer? incrementalSerializer,
+      RecorderForTesting? recorderForTesting) {
+    dillLoadedData.ticker.logMs("About to initializeFromComponent");
+
+    Component component = data.component = new Component(
+        libraries: componentToInitializeFrom.libraries,
+        uriToSource: componentToInitializeFrom.uriToSource)
+      ..setMainMethodAndMode(componentToInitializeFrom.mainMethod?.reference,
+          true, componentToInitializeFrom.mode);
+    componentProblems.saveComponentProblems(component);
+
+    bool foundDartCore = false;
+    for (int i = 0; i < component.libraries.length; i++) {
+      Library library = component.libraries[i];
+      if (library.importUri.scheme == "dart" &&
+          library.importUri.path == "core") {
+        foundDartCore = true;
+        break;
+      }
+    }
+
+    if (!foundDartCore) {
+      throw const InitializeFromComponentError("Did not find dart:core when "
+          "tried to initialize from component.");
+    }
+
+    dillLoadedData.ticker.logMs("Ran initializeFromComponent");
+    return new Future<int>.value(0);
+  }
+}
+
+class _InitializationFromUri extends _InitializationFromSdkSummary {
+  Uri initializeFromDillUri;
+
+  _InitializationFromUri(this.initializeFromDillUri);
+
+  @override
+  Future<int> initialize(
+      DillTarget dillLoadedData,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems componentProblems,
+      IncrementalSerializer? incrementalSerializer,
+      RecorderForTesting? recorderForTesting) async {
+    List<int>? summaryBytes = await context.options.loadSdkSummaryBytes();
+    int bytesLength = _prepareSummary(
+        dillLoadedData, summaryBytes, uriTranslator, context, data);
+    try {
+      bytesLength += await _initializeFromDill(
+          dillLoadedData,
+          initializeFromDillUri,
+          uriTranslator,
+          context,
+          data,
+          componentProblems,
+          incrementalSerializer);
+    } catch (e, st) {
+      // We might have loaded x out of y libraries into the component.
+      // To avoid any unforeseen problems start over.
+      bytesLength = _prepareSummary(
+          dillLoadedData, summaryBytes, uriTranslator, context, data);
+
+      if (e is InvalidKernelVersionError ||
+          e is InvalidKernelSdkVersionError ||
+          e is PackageChangedError ||
+          e is CanonicalNameSdkError ||
+          e is CompilationModeError) {
+        // Don't report any warning.
+      } else {
+        Uri? gzInitializedFrom;
+        if (context.options.writeFileOnCrashReport) {
+          gzInitializedFrom =
+              saveAsGzip(data.initializationBytes!, "initialize_from.dill");
+          recorderForTesting?.recordTemporaryFile(gzInitializedFrom);
+        }
+        if (e is CanonicalNameError) {
+          Message message = gzInitializedFrom != null
+              ? templateInitializeFromDillNotSelfContained.withArguments(
+                  initializeFromDillUri.toString(), gzInitializedFrom)
+              : templateInitializeFromDillNotSelfContainedNoDump
+                  .withArguments(initializeFromDillUri.toString());
+          dillLoadedData.loader.addProblem(message, TreeNode.noOffset, 1, null);
+        } else {
+          // Unknown error: Report problem as such.
+          Message message = gzInitializedFrom != null
+              ? templateInitializeFromDillUnknownProblem.withArguments(
+                  initializeFromDillUri.toString(),
+                  "$e",
+                  "$st",
+                  gzInitializedFrom)
+              : templateInitializeFromDillUnknownProblemNoDump.withArguments(
+                  initializeFromDillUri.toString(), "$e", "$st");
+          dillLoadedData.loader.addProblem(message, TreeNode.noOffset, 1, null);
+        }
+      }
+    }
+    return bytesLength;
+  }
+
+  bool _initializedFromDill = false;
+  bool _initializedIncrementalSerializer = false;
+
+  @override
+  bool get initializedFromDillForTesting => _initializedFromDill;
+
+  @override
+  bool get initializedIncrementalSerializerForTesting =>
+      _initializedIncrementalSerializer;
+
+  // This procedure will try to load the dill file and will crash if it cannot.
+  Future<int> _initializeFromDill(
+      DillTarget dillLoadedData,
+      Uri initializeFromDillUri,
+      UriTranslator uriTranslator,
+      CompilerContext context,
+      IncrementalCompilerData data,
+      _ComponentProblems _componentProblems,
+      IncrementalSerializer? incrementalSerializer) async {
+    int bytesLength = 0;
+    FileSystemEntity entity =
+        context.options.fileSystem.entityForUri(initializeFromDillUri);
+    if (await entity.exists()) {
+      List<int> initializationBytes = await entity.readAsBytes();
+      // ignore: unnecessary_null_comparison
+      if (initializationBytes != null && initializationBytes.isNotEmpty) {
+        dillLoadedData.ticker.logMs("Read $initializeFromDillUri");
+        data.initializationBytes = initializationBytes;
+
+        // We're going to output all we read here so lazy loading it
+        // doesn't make sense.
+        List<SubComponentView> views = new BinaryBuilderWithMetadata(
+                initializationBytes,
+                disableLazyReading: true)
+            .readComponent(data.component!,
+                checkCanonicalNames: true, createView: true)!;
+
+        // Compute "output nnbd mode".
+        NonNullableByDefaultCompiledMode compiledMode;
+        if (context.options
+            .isExperimentEnabledGlobally(ExperimentalFlag.nonNullable)) {
+          switch (context.options.nnbdMode) {
+            case NnbdMode.Weak:
+              compiledMode = NonNullableByDefaultCompiledMode.Weak;
+              break;
+            case NnbdMode.Strong:
+              compiledMode = NonNullableByDefaultCompiledMode.Strong;
+              break;
+            case NnbdMode.Agnostic:
+              compiledMode = NonNullableByDefaultCompiledMode.Agnostic;
+              break;
+          }
+        } else {
+          compiledMode = NonNullableByDefaultCompiledMode.Weak;
+        }
+
+        // Check the any package-urls still point to the same file
+        // (e.g. the package still exists and hasn't been updated).
+        // Also verify NNBD settings.
+        for (Library lib in data.component!.libraries) {
+          if (lib.importUri.scheme == "package" &&
+              uriTranslator.translate(lib.importUri, false) != lib.fileUri) {
+            // Package has been removed or updated.
+            // This library should be thrown away.
+            // Everything that depends on it should be thrown away.
+            // TODO(jensj): Anything that doesn't depend on it can be kept.
+            // For now just don't initialize from this dill.
+            throw const PackageChangedError();
+          }
+          // Note: If a library has a NonNullableByDefaultCompiledMode.invalid
+          // we will throw and we won't initialize from it.
+          // That's wanted behavior.
+          if (compiledMode !=
+              mergeCompilationModeOrThrow(
+                  compiledMode, lib.nonNullableByDefaultCompiledMode)) {
+            throw new CompilationModeError(
+                "Can't compile to $compiledMode with library with mode "
+                "${lib.nonNullableByDefaultCompiledMode}.");
+          }
+        }
+
+        // Only initialize the incremental serializer when we know we'll
+        // actually use the data loaded from dill.
+        _initializedIncrementalSerializer =
+            incrementalSerializer?.initialize(initializationBytes, views) ??
+                false;
+
+        _initializedFromDill = true;
+        bytesLength += initializationBytes.length;
+        _componentProblems.saveComponentProblems(data.component!);
+      }
+    }
+    return bytesLength;
+  }
+}
+
+class _ComponentProblems {
+  Map<Uri, List<DiagnosticMessageFromJson>> _remainingComponentProblems =
+      new Map<Uri, List<DiagnosticMessageFromJson>>();
+
+  /// [partsUsed] indicates part uris that are used by (other/alive) libraries.
+  /// Those parts will not be removed from the component problems.
+  /// This is useful when a part has been "moved" to be part of another library.
+  void removeLibrary(Library lib, UriTranslator uriTranslator,
+      [Set<Uri?>? partsUsed]) {
+    if (_remainingComponentProblems.isNotEmpty) {
+      _remainingComponentProblems.remove(lib.fileUri);
+      // Remove parts too.
+      for (LibraryPart part in lib.parts) {
+        Uri? partFileUri = uriTranslator.getPartFileUri(lib.fileUri, part);
+        _remainingComponentProblems.remove(partFileUri);
+      }
+    }
+  }
+
+  /// Re-issue problems on the component and return the filtered list.
+  List<String> reissueProblems(
+      CompilerContext context,
+      IncrementalKernelTarget currentKernelTarget,
+      Component componentWithDill) {
+    // These problems have already been reported.
+    Set<String> issuedProblems = new Set<String>();
+    if (componentWithDill.problemsAsJson != null) {
+      issuedProblems.addAll(componentWithDill.problemsAsJson!);
+    }
+
+    // Report old problems that wasn't reported again.
+    Set<Uri>? strongModeNNBDPackageOptOutUris;
+    for (MapEntry<Uri, List<DiagnosticMessageFromJson>> entry
+        in _remainingComponentProblems.entries) {
+      List<DiagnosticMessageFromJson> messages = entry.value;
+      for (int i = 0; i < messages.length; i++) {
+        DiagnosticMessageFromJson message = messages[i];
+        if (message.codeName == "StrongModeNNBDPackageOptOut") {
+          // Special case this: Don't issue them here; instead collect them
+          // to get their uris and re-issue a new error.
+          strongModeNNBDPackageOptOutUris ??= {};
+          strongModeNNBDPackageOptOutUris.add(entry.key);
+          continue;
+        }
+        if (issuedProblems.add(message.toJsonString())) {
+          context.options.reportDiagnosticMessage(message);
+        }
+      }
+    }
+    if (strongModeNNBDPackageOptOutUris != null) {
+      // Get the builders for these uris; then call
+      // `SourceLoader.giveCombinedErrorForNonStrongLibraries` on them to issue
+      // a new error.
+      Set<LibraryBuilder> builders = {};
+      SourceLoader loader = currentKernelTarget.loader;
+      for (LibraryBuilder builder in loader.libraryBuilders) {
+        if (strongModeNNBDPackageOptOutUris.contains(builder.fileUri)) {
+          builders.add(builder);
+        }
+      }
+      FormattedMessage message = loader.giveCombinedErrorForNonStrongLibraries(
+          builders,
+          emitNonPackageErrors: false)!;
+      issuedProblems.add(message.toJsonString());
+      // The problem was issued by the call so don't re-issue it here.
+    }
+
+    // Save any new component-problems.
+    _addProblemsAsJson(componentWithDill.problemsAsJson);
+    return new List<String>.from(issuedProblems);
+  }
+
+  void saveComponentProblems(Component component) {
+    _addProblemsAsJson(component.problemsAsJson);
+  }
+
+  void _addProblemsAsJson(List<String>? problemsAsJson) {
+    if (problemsAsJson != null) {
+      for (String jsonString in problemsAsJson) {
+        DiagnosticMessageFromJson message =
+            new DiagnosticMessageFromJson.fromJson(jsonString);
+        assert(
+            message.uri != null ||
+                (message.involvedFiles != null &&
+                    message.involvedFiles!.isNotEmpty),
+            jsonString);
+        if (message.uri != null) {
+          List<DiagnosticMessageFromJson> messages =
+              _remainingComponentProblems[message.uri!] ??=
+                  <DiagnosticMessageFromJson>[];
+          messages.add(message);
+        }
+        if (message.involvedFiles != null) {
+          // This indexes the same message under several uris - this way it will
+          // be issued as long as it's a problem. It will because of
+          // deduplication when we re-issue these (in reissueComponentProblems)
+          // only be reported once.
+          for (Uri uri in message.involvedFiles!) {
+            List<DiagnosticMessageFromJson> messages =
+                _remainingComponentProblems[uri] ??=
+                    <DiagnosticMessageFromJson>[];
+            messages.add(message);
+          }
+        }
+      }
+    }
+  }
+}
+
+extension on UriTranslator {
+  Uri? getPartFileUri(Uri parentFileUri, LibraryPart part) {
+    Uri? fileUri = getPartUri(parentFileUri, part);
+    if (fileUri.scheme == "package") {
+      // Part was specified via package URI and the resolve above thus
+      // did not go as expected. Translate the package URI to get the
+      // actual file URI.
+      fileUri = translate(fileUri, false);
+    }
+    return fileUri;
+  }
+}
+
+class RecorderForTesting {
+  const RecorderForTesting();
+
+  void recordNonFullComponent(Component component) {}
+
+  void recordInvalidatedImportUris(List<Uri> uris) {}
+
+  void recordRebuildBodiesCount(int count) {}
+
+  void recordTemporaryFile(Uri uri) {}
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index c19ef88..44ee19e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -306,8 +306,7 @@
 
   /// List of built redirecting factory invocations.  The targets of the
   /// invocations are to be resolved in a separate step.
-  final List<FactoryConstructorInvocation> redirectingFactoryInvocations =
-      <FactoryConstructorInvocation>[];
+  final List<FactoryConstructorInvocation> redirectingFactoryInvocations = [];
 
   /// List of redirecting factory invocations delayed for resolution.
   ///
@@ -315,7 +314,7 @@
   /// the inference in the declaration of the redirecting factory isn't done
   /// yet.
   final List<FactoryConstructorInvocation>
-      delayedRedirectingFactoryInvocations = <FactoryConstructorInvocation>[];
+      delayedRedirectingFactoryInvocations = [];
 
   /// List of built type aliased generative constructor invocations that
   /// require unaliasing.
@@ -326,6 +325,13 @@
   /// unaliasing.
   final List<TypeAliasedFactoryInvocation> typeAliasedFactoryInvocations = [];
 
+  /// List of type aliased factory invocations delayed for resolution.
+  ///
+  /// A resolution of a type aliased factory invocation can be delayed because
+  /// the inference in the declaration of the target isn't done yet.
+  final List<TypeAliasedFactoryInvocation>
+      delayedTypeAliasedFactoryInvocations = [];
+
   /// Variables with metadata.  Their types need to be inferred late, for
   /// example, in [finishFunction].
   List<VariableDeclaration>? variablesWithMetadata;
@@ -897,9 +903,8 @@
       [List<DelayedActionPerformer>? delayedActionPerformers]) {
     _finishVariableMetadata();
     _unaliasTypeAliasedConstructorInvocations();
-    _unaliasTypeAliasedFactoryInvocations();
-    _resolveRedirectingFactoryTargets(
-        redirectingFactoryInvocations, delayedRedirectingFactoryInvocations);
+    _unaliasTypeAliasedFactoryInvocations(typeAliasedFactoryInvocations);
+    _resolveRedirectingFactoryTargets(redirectingFactoryInvocations);
     libraryBuilder.checkUncheckedTypedefTypes(typeEnvironment);
     if (hasDelayedActions) {
       assert(
@@ -1043,6 +1048,7 @@
         buildInvalidInitializer(node as Expression, token.charOffset)
       ];
     }
+
     _initializers ??= <Initializer>[];
     _initializers!.addAll(initializers);
   }
@@ -1349,9 +1355,7 @@
   }
 
   void _resolveRedirectingFactoryTargets(
-      List<FactoryConstructorInvocation> redirectingFactoryInvocations,
-      List<FactoryConstructorInvocation>?
-          delayedRedirectingFactoryInvocations) {
+      List<FactoryConstructorInvocation> redirectingFactoryInvocations) {
     List<FactoryConstructorInvocation> invocations =
         redirectingFactoryInvocations.toList();
     redirectingFactoryInvocations.clear();
@@ -1381,7 +1385,7 @@
           invocation.fileOffset,
           invocation.isConst);
       if (replacement == null) {
-        delayedRedirectingFactoryInvocations?.add(invocation);
+        delayedRedirectingFactoryInvocations.add(invocation);
       } else {
         invocation.replaceWith(replacement);
       }
@@ -1414,9 +1418,12 @@
     typeAliasedConstructorInvocations.clear();
   }
 
-  void _unaliasTypeAliasedFactoryInvocations() {
-    for (TypeAliasedFactoryInvocation invocation
-        in typeAliasedFactoryInvocations) {
+  void _unaliasTypeAliasedFactoryInvocations(
+      List<TypeAliasedFactoryInvocation> typeAliasedFactoryInvocations) {
+    List<TypeAliasedFactoryInvocation> invocations =
+        typeAliasedFactoryInvocations.toList();
+    typeAliasedFactoryInvocations.clear();
+    for (TypeAliasedFactoryInvocation invocation in invocations) {
       bool inferred = !hasExplicitTypeArguments(invocation.arguments);
       DartType aliasedType = new TypedefType(
           invocation.typeAliasBuilder.typedef,
@@ -1436,8 +1443,16 @@
           named: invocation.arguments.named,
           hasExplicitTypeArguments:
               hasExplicitTypeArguments(invocation.arguments));
-      invocation.replaceWith(_resolveRedirectingFactoryTarget(invocation.target,
-          invocationArguments, invocation.fileOffset, invocation.isConst)!);
+      Expression? replacement = _resolveRedirectingFactoryTarget(
+          invocation.target,
+          invocationArguments,
+          invocation.fileOffset,
+          invocation.isConst);
+      if (replacement == null) {
+        delayedTypeAliasedFactoryInvocations.add(invocation);
+      } else {
+        invocation.replaceWith(replacement);
+      }
     }
     typeAliasedFactoryInvocations.clear();
   }
@@ -1451,8 +1466,7 @@
   @override
   void performDelayedActions() {
     if (delayedRedirectingFactoryInvocations.isNotEmpty) {
-      _resolveRedirectingFactoryTargets(
-          delayedRedirectingFactoryInvocations, null);
+      _resolveRedirectingFactoryTargets(delayedRedirectingFactoryInvocations);
       if (delayedRedirectingFactoryInvocations.isNotEmpty) {
         for (StaticInvocation invocation
             in delayedRedirectingFactoryInvocations) {
@@ -1464,11 +1478,26 @@
         }
       }
     }
+    if (delayedTypeAliasedFactoryInvocations.isNotEmpty) {
+      _unaliasTypeAliasedFactoryInvocations(
+          delayedTypeAliasedFactoryInvocations);
+      if (delayedTypeAliasedFactoryInvocations.isNotEmpty) {
+        for (StaticInvocation invocation
+            in delayedTypeAliasedFactoryInvocations) {
+          internalProblem(
+              fasta.templateInternalProblemUnhandled.withArguments(
+                  invocation.target.name.text, 'performDelayedActions'),
+              invocation.fileOffset,
+              uri);
+        }
+      }
+    }
   }
 
   @override
   bool get hasDelayedActions {
-    return delayedRedirectingFactoryInvocations.isNotEmpty;
+    return delayedRedirectingFactoryInvocations.isNotEmpty ||
+        delayedTypeAliasedFactoryInvocations.isNotEmpty;
   }
 
   void _finishVariableMetadata() {
@@ -1647,15 +1676,87 @@
         typeInferrer.flowAnalysis.declare(parameter.variable!, true);
       }
     }
-    if (_initializers != null) {
+
+    List<Expression>? positionalSuperParametersAsArguments;
+    List<NamedExpression>? namedSuperParametersAsArguments;
+    if (formals != null) {
+      for (FormalParameterBuilder formal in formals) {
+        if (formal.isSuperInitializingFormal) {
+          if (formal.isNamed) {
+            (namedSuperParametersAsArguments ??= <NamedExpression>[]).add(
+                new NamedExpression(
+                    formal.name,
+                    new VariableGetImpl(formal.variable!,
+                        forNullGuardedAccess: false)
+                      ..fileOffset = formal.charOffset)
+                  ..fileOffset = formal.charOffset);
+          } else {
+            (positionalSuperParametersAsArguments ??= <Expression>[]).add(
+                new VariableGetImpl(formal.variable!,
+                    forNullGuardedAccess: false)
+                  ..fileOffset = formal.charOffset);
+          }
+        }
+      }
+    }
+
+    List<Initializer>? initializers = _initializers;
+    if (initializers != null) {
+      if (libraryBuilder.enableSuperParametersInLibrary) {
+        if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
+          SuperInitializer superInitializer =
+              initializers.last as SuperInitializer;
+          Arguments arguments = superInitializer.arguments;
+
+          if (positionalSuperParametersAsArguments != null) {
+            if (arguments.positional.isNotEmpty) {
+              addProblem(fasta.messagePositionalSuperParametersAndArguments,
+                  arguments.fileOffset, noLength,
+                  context: <LocatedMessage>[
+                    fasta.messageSuperInitializerParameter.withLocation(
+                        uri,
+                        (positionalSuperParametersAsArguments.first
+                                as VariableGet)
+                            .variable
+                            .fileOffset,
+                        noLength)
+                  ]);
+            } else {
+              arguments.positional.addAll(positionalSuperParametersAsArguments);
+            }
+          }
+          if (namedSuperParametersAsArguments != null) {
+            // TODO(cstefantsova): Report name conflicts.
+            arguments.named.addAll(namedSuperParametersAsArguments);
+          }
+
+          LocatedMessage? message = checkArgumentsForFunction(
+              superInitializer.target.function,
+              arguments,
+              arguments.fileOffset, <TypeParameter>[]);
+          if (message != null) {
+            initializers[initializers.length - 1] = buildInvalidInitializer(
+                buildUnresolvedError(
+                    forest.createNullLiteral(superInitializer.fileOffset),
+                    constructorNameForDiagnostics(
+                        superInitializer.target.name.text),
+                    arguments,
+                    superInitializer.fileOffset,
+                    isSuper: true,
+                    message: message,
+                    kind: UnresolvedKind.Constructor));
+          }
+        }
+      }
+
       Map<Initializer, InitializerInferenceResult> inferenceResults =
           <Initializer, InitializerInferenceResult>{};
-      for (Initializer initializer in _initializers!) {
+      for (Initializer initializer in initializers) {
         inferenceResults[initializer] =
             typeInferrer.inferInitializer(this, initializer);
       }
       if (!builder.isExternal) {
-        for (Initializer initializer in _initializers!) {
+        for (Initializer initializer in initializers) {
           builder.addInitializer(initializer, this,
               inferenceResult: inferenceResults[initializer]!);
         }
@@ -1671,7 +1772,14 @@
       /// >unless the enclosing class is class Object.
       Constructor? superTarget = lookupConstructor(emptyName, isSuper: true);
       Initializer initializer;
-      Arguments arguments = forest.createArgumentsEmpty(noLocation);
+      Arguments arguments;
+      if (libraryBuilder.enableSuperParametersInLibrary) {
+        arguments = forest.createArguments(
+            noLocation, positionalSuperParametersAsArguments ?? <Expression>[],
+            named: namedSuperParametersAsArguments);
+      } else {
+        arguments = forest.createArgumentsEmpty(noLocation);
+      }
       if (superTarget == null ||
           checkArgumentsForFunction(superTarget.function, arguments,
                   builder.charOffset, const <TypeParameter>[]) !=
@@ -4013,7 +4121,8 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
deleted file mode 100644
index 8508470..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ /dev/null
@@ -1,4416 +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.
-
-library fasta.class_hierarchy_builder;
-
-import 'package:kernel/ast.dart';
-
-import 'package:kernel/class_hierarchy.dart'
-    show ClassHierarchy, ClassHierarchyBase;
-
-import 'package:kernel/core_types.dart' show CoreTypes;
-
-import 'package:kernel/type_algebra.dart' show Substitution, uniteNullabilities;
-import 'package:kernel/type_environment.dart';
-
-import 'package:kernel/src/legacy_erasure.dart';
-import 'package:kernel/src/nnbd_top_merge.dart';
-import 'package:kernel/src/norm.dart';
-import 'package:kernel/src/standard_bounds.dart';
-import 'package:kernel/src/types.dart' show Types;
-
-import '../../base/common.dart';
-import '../../testing/id_testing_utils.dart' show typeToText;
-
-import '../builder/builder.dart';
-import '../builder/class_builder.dart';
-import '../builder/field_builder.dart';
-import '../builder/formal_parameter_builder.dart';
-import '../builder/library_builder.dart';
-import '../builder/member_builder.dart';
-import '../builder/named_type_builder.dart';
-import '../builder/procedure_builder.dart';
-import '../builder/type_alias_builder.dart';
-import '../builder/type_builder.dart';
-import '../builder/type_declaration_builder.dart';
-
-import '../loader.dart' show Loader;
-
-import '../messages.dart'
-    show
-        LocatedMessage,
-        Message,
-        messageDeclaredMemberConflictsWithInheritedMember,
-        messageDeclaredMemberConflictsWithInheritedMemberCause,
-        messageDeclaredMemberConflictsWithOverriddenMembersCause,
-        messageInheritedMembersConflict,
-        messageInheritedMembersConflictCause1,
-        messageInheritedMembersConflictCause2,
-        messageStaticAndInstanceConflict,
-        messageStaticAndInstanceConflictCause,
-        templateCantInferTypesDueToNoCombinedSignature,
-        templateCantInferReturnTypeDueToNoCombinedSignature,
-        templateCantInferTypeDueToNoCombinedSignature,
-        templateCombinedMemberSignatureFailed,
-        templateDuplicatedDeclaration,
-        templateDuplicatedDeclarationCause,
-        templateMissingImplementationCause,
-        templateMissingImplementationNotAbstract;
-
-import '../names.dart' show noSuchMethodName;
-
-import '../scope.dart' show Scope;
-
-import '../source/source_class_builder.dart';
-import '../source/source_library_builder.dart' show SourceLibraryBuilder;
-
-import '../source/source_loader.dart' show SourceLoader;
-
-import '../type_inference/standard_bounds.dart' show TypeSchemaStandardBounds;
-
-import '../type_inference/type_constraint_gatherer.dart'
-    show TypeConstraintGatherer;
-
-import '../type_inference/type_inferrer.dart' show MixinInferrer;
-
-import '../type_inference/type_schema.dart' show UnknownType;
-
-import '../type_inference/type_schema_environment.dart' show TypeConstraint;
-
-import 'combined_member_signature.dart';
-
-import 'member_covariance.dart';
-
-import 'forwarding_node.dart' show ForwardingNode;
-
-const DebugLogger? debug =
-    const bool.fromEnvironment("debug.hierarchy") ? const DebugLogger() : null;
-
-class DebugLogger {
-  const DebugLogger();
-  void log(Object message) => print(message);
-}
-
-int compareDeclarations(ClassMember a, ClassMember b) {
-  if (a == b) return 0;
-  return ClassHierarchy.compareNames(a.name, b.name);
-}
-
-int compareClassMembers(ClassMember a, ClassMember b) {
-  if (a.forSetter == b.forSetter) {
-    return compareDeclarations(a, b);
-  } else if (a.forSetter) {
-    return 1;
-  } else {
-    return -1;
-  }
-}
-
-bool isNameVisibleIn(Name name, LibraryBuilder libraryBuilder) {
-  return !name.isPrivate || name.library == libraryBuilder.library;
-}
-
-class Tuple {
-  final Name name;
-  ClassMember? _declaredMember;
-  ClassMember? _declaredSetter;
-  ClassMember? _mixedInMember;
-  ClassMember? _mixedInSetter;
-  ClassMember? _extendedMember;
-  ClassMember? _extendedSetter;
-  List<ClassMember>? _implementedMembers;
-  List<ClassMember>? _implementedSetters;
-
-  Tuple.declareMember(ClassMember declaredMember)
-      : assert(!declaredMember.forSetter),
-        this._declaredMember = declaredMember,
-        this.name = declaredMember.name;
-
-  Tuple.mixInMember(ClassMember mixedInMember)
-      : assert(!mixedInMember.forSetter),
-        this._mixedInMember = mixedInMember,
-        this.name = mixedInMember.name;
-
-  Tuple.extendMember(ClassMember extendedMember)
-      : assert(!extendedMember.forSetter),
-        this._extendedMember = extendedMember,
-        this.name = extendedMember.name;
-
-  Tuple.implementMember(ClassMember implementedMember)
-      : assert(!implementedMember.forSetter),
-        this.name = implementedMember.name,
-        _implementedMembers = <ClassMember>[implementedMember];
-
-  Tuple.declareSetter(ClassMember declaredSetter)
-      : assert(declaredSetter.forSetter),
-        this._declaredSetter = declaredSetter,
-        this.name = declaredSetter.name;
-
-  Tuple.mixInSetter(ClassMember mixedInSetter)
-      : assert(mixedInSetter.forSetter),
-        this._mixedInSetter = mixedInSetter,
-        this.name = mixedInSetter.name;
-
-  Tuple.extendSetter(ClassMember extendedSetter)
-      : assert(extendedSetter.forSetter),
-        this._extendedSetter = extendedSetter,
-        this.name = extendedSetter.name;
-
-  Tuple.implementSetter(ClassMember implementedSetter)
-      : assert(implementedSetter.forSetter),
-        this.name = implementedSetter.name,
-        _implementedSetters = <ClassMember>[implementedSetter];
-
-  ClassMember? get declaredMember => _declaredMember;
-
-  void set declaredMember(ClassMember? value) {
-    assert(!value!.forSetter);
-    assert(
-        _declaredMember == null,
-        "Declared member already set to $_declaredMember, "
-        "trying to set it to $value.");
-    _declaredMember = value;
-  }
-
-  ClassMember? get declaredSetter => _declaredSetter;
-
-  void set declaredSetter(ClassMember? value) {
-    assert(value!.forSetter);
-    assert(
-        _declaredSetter == null,
-        "Declared setter already set to $_declaredSetter, "
-        "trying to set it to $value.");
-    _declaredSetter = value;
-  }
-
-  ClassMember? get extendedMember => _extendedMember;
-
-  void set extendedMember(ClassMember? value) {
-    assert(!value!.forSetter);
-    assert(
-        _extendedMember == null,
-        "Extended member already set to $_extendedMember, "
-        "trying to set it to $value.");
-    _extendedMember = value;
-  }
-
-  ClassMember? get extendedSetter => _extendedSetter;
-
-  void set extendedSetter(ClassMember? value) {
-    assert(value!.forSetter);
-    assert(
-        _extendedSetter == null,
-        "Extended setter already set to $_extendedSetter, "
-        "trying to set it to $value.");
-    _extendedSetter = value;
-  }
-
-  ClassMember? get mixedInMember => _mixedInMember;
-
-  void set mixedInMember(ClassMember? value) {
-    assert(!value!.forSetter);
-    assert(
-        _mixedInMember == null,
-        "Mixed in member already set to $_mixedInMember, "
-        "trying to set it to $value.");
-    _mixedInMember = value;
-  }
-
-  ClassMember? get mixedInSetter => _mixedInSetter;
-
-  void set mixedInSetter(ClassMember? value) {
-    assert(value!.forSetter);
-    assert(
-        _mixedInSetter == null,
-        "Mixed in setter already set to $_mixedInSetter, "
-        "trying to set it to $value.");
-    _mixedInSetter = value;
-  }
-
-  List<ClassMember>? get implementedMembers => _implementedMembers;
-
-  void addImplementedMember(ClassMember value) {
-    assert(!value.forSetter);
-    _implementedMembers ??= <ClassMember>[];
-    _implementedMembers!.add(value);
-  }
-
-  List<ClassMember>? get implementedSetters => _implementedSetters;
-
-  void addImplementedSetter(ClassMember value) {
-    assert(value.forSetter);
-    _implementedSetters ??= <ClassMember>[];
-    _implementedSetters!.add(value);
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    String comma = '';
-    sb.write('Tuple(');
-    if (_declaredMember != null) {
-      sb.write(comma);
-      sb.write('declaredMember=');
-      sb.write(_declaredMember);
-      comma = ',';
-    }
-    if (_declaredSetter != null) {
-      sb.write(comma);
-      sb.write('declaredSetter=');
-      sb.write(_declaredSetter);
-      comma = ',';
-    }
-    if (_mixedInMember != null) {
-      sb.write(comma);
-      sb.write('mixedInMember=');
-      sb.write(_mixedInMember);
-      comma = ',';
-    }
-    if (_mixedInSetter != null) {
-      sb.write(comma);
-      sb.write('mixedInSetter=');
-      sb.write(_mixedInSetter);
-      comma = ',';
-    }
-    if (_extendedMember != null) {
-      sb.write(comma);
-      sb.write('extendedMember=');
-      sb.write(_extendedMember);
-      comma = ',';
-    }
-    if (_extendedSetter != null) {
-      sb.write(comma);
-      sb.write('extendedSetter=');
-      sb.write(_extendedSetter);
-      comma = ',';
-    }
-    if (_implementedMembers != null) {
-      sb.write(comma);
-      sb.write('implementedMembers=');
-      sb.write(_implementedMembers);
-      comma = ',';
-    }
-    if (_implementedSetters != null) {
-      sb.write(comma);
-      sb.write('implementedSetters=');
-      sb.write(_implementedSetters);
-      comma = ',';
-    }
-    sb.write(')');
-    return sb.toString();
-  }
-}
-
-abstract class ClassMember {
-  Name get name;
-  bool get isStatic;
-  bool get isField;
-  bool get isAssignable;
-  bool get isSetter;
-  bool get isGetter;
-  bool get isFinal;
-  bool get isConst;
-  bool get forSetter;
-
-  /// Returns `true` if this member corresponds to a declaration in the source
-  /// code.
-  bool get isSourceDeclaration;
-
-  /// Returns `true` if this member is a field, getter or setter.
-  bool get isProperty;
-
-  /// Computes the [Member] node resulting from this class member.
-  Member getMember(ClassHierarchyBuilder hierarchy);
-
-  /// Returns the member [Covariance] for this class member.
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy);
-
-  bool get isDuplicate;
-  String get fullName;
-  String get fullNameForErrors;
-  ClassBuilder get classBuilder;
-
-  /// Returns `true` if this class member is declared in Object from dart:core.
-  bool isObjectMember(ClassBuilder objectClass);
-  Uri get fileUri;
-  int get charOffset;
-
-  /// Returns `true` if this class member is an interface member.
-  bool get isAbstract;
-
-  /// Returns `true` if this member doesn't corresponds to a declaration in the
-  /// source code.
-  bool get isSynthesized;
-
-  // If `true` this member is not part of the interface but only part of the
-  // class members.
-  //
-  // This is `true` for instance for synthesized fields added for the late
-  // lowering.
-  bool get isInternalImplementation;
-
-  /// Returns `true` if this member is composed from a list of class members
-  /// accessible through [declarations].
-  bool get hasDeclarations;
-
-  /// If [hasDeclaration] is `true`, this returns the list of class members
-  /// from which this class member is composed.
-  ///
-  /// This is used in [unfoldDeclarations] to retrieve all underlying member
-  /// source declarations, and in [toSet] to retrieve all members used for
-  /// this class member wrt. certain level of the hierarchy.
-  /// TODO(johnniwinther): Can the use of [toSet] be replaced with a direct
-  /// use of [declarations]?
-  List<ClassMember> get declarations;
-
-  /// The interface member corresponding to this member.
-  ///
-  /// If this member is declared on the source, the interface member is
-  /// the member itself. For instance
-  ///
-  ///     abstract class Class {
-  ///        void concreteMethod() {}
-  ///        void abstractMethod();
-  ///     }
-  ///
-  /// the interface members for `concreteMethod` and `abstractMethod` are the
-  /// members themselves.
-  ///
-  /// If this member is a synthesized interface member, the
-  /// interface member is the member itself. For instance
-  ///
-  ///     abstract class Interface1 {
-  ///        void method() {}
-  ///     }
-  ///     abstract class Interface2 {
-  ///        void method() {}
-  ///     }
-  ///     abstract class Class implements Interface1, Interface2 {}
-  ///
-  /// the interface member for `method` in `Class` is the synthesized interface
-  /// member created for the implemented members `Interface1.method` and
-  /// `Interface2.method`.
-  ///
-  /// If this member is a concrete member that implements an interface member,
-  /// the interface member is the implemented interface member. For instance
-  ///
-  ///     class Super {
-  ///        void method() {}
-  ///     }
-  ///     class Interface {
-  ///        void method() {}
-  ///     }
-  ///     class Class extends Super implements Interface {}
-  ///
-  /// the interface member for `Super.method` implementing `method` in `Class`
-  /// is the synthesized interface member created for the implemented members
-  /// `Super.method` and `Interface.method`.
-  ClassMember get interfaceMember;
-
-  void inferType(ClassHierarchyBuilder hierarchy);
-  void registerOverrideDependency(Set<ClassMember> overriddenMembers);
-
-  /// Returns `true` if this has the same underlying declaration as [other].
-  ///
-  /// This is used for avoiding unnecessary checks and can this trivially
-  /// return `false`.
-  bool isSameDeclaration(ClassMember other);
-}
-
-bool hasSameSignature(FunctionNode a, FunctionNode b) {
-  List<TypeParameter> aTypeParameters = a.typeParameters;
-  List<TypeParameter> bTypeParameters = b.typeParameters;
-  int typeParameterCount = aTypeParameters.length;
-  if (typeParameterCount != bTypeParameters.length) {
-    return false;
-  }
-  Substitution? substitution;
-  if (typeParameterCount != 0) {
-    List<DartType> types = new List<DartType>.generate(
-        typeParameterCount,
-        (int i) => new TypeParameterType.forAlphaRenaming(
-            bTypeParameters[i], aTypeParameters[i]),
-        growable: false);
-    substitution = Substitution.fromPairs(bTypeParameters, types);
-    for (int i = 0; i < typeParameterCount; i++) {
-      DartType aBound = aTypeParameters[i].bound;
-      DartType bBound = substitution.substituteType(bTypeParameters[i].bound);
-      if (aBound != bBound) {
-        return false;
-      }
-    }
-  }
-
-  if (a.requiredParameterCount != b.requiredParameterCount) {
-    return false;
-  }
-  List<VariableDeclaration> aPositionalParameters = a.positionalParameters;
-  List<VariableDeclaration> bPositionalParameters = b.positionalParameters;
-  if (aPositionalParameters.length != bPositionalParameters.length) {
-    return false;
-  }
-  for (int i = 0; i < aPositionalParameters.length; i++) {
-    VariableDeclaration aParameter = aPositionalParameters[i];
-    VariableDeclaration bParameter = bPositionalParameters[i];
-    if (aParameter.isCovariantByDeclaration !=
-        bParameter.isCovariantByDeclaration) {
-      return false;
-    }
-    DartType aType = aParameter.type;
-    DartType bType = bParameter.type;
-    if (substitution != null) {
-      bType = substitution.substituteType(bType);
-    }
-    if (aType != bType) return false;
-  }
-
-  List<VariableDeclaration> aNamedParameters = a.namedParameters;
-  List<VariableDeclaration> bNamedParameters = b.namedParameters;
-  if (aNamedParameters.length != bNamedParameters.length) {
-    return false;
-  }
-  for (int i = 0; i < aNamedParameters.length; i++) {
-    VariableDeclaration aParameter = aNamedParameters[i];
-    VariableDeclaration bParameter = bNamedParameters[i];
-    if (aParameter.isCovariantByDeclaration !=
-        bParameter.isCovariantByDeclaration) {
-      return false;
-    }
-    if (aParameter.name != bParameter.name) {
-      return false;
-    }
-    DartType aType = aParameter.type;
-    DartType bType = bParameter.type;
-    if (substitution != null) {
-      bType = substitution.substituteType(bType);
-    }
-    if (aType != bType) {
-      return false;
-    }
-  }
-
-  DartType aReturnType = a.returnType;
-  DartType bReturnType = b.returnType;
-  if (substitution != null) {
-    bReturnType = substitution.substituteType(bReturnType);
-  }
-
-  return aReturnType == bReturnType;
-}
-
-class ClassHierarchyBuilder implements ClassHierarchyBase {
-  final Map<Class, ClassHierarchyNode> nodes = <Class, ClassHierarchyNode>{};
-
-  final Map<ClassBuilder, Map<Class, Substitution>> substitutions =
-      <ClassBuilder, Map<Class, Substitution>>{};
-
-  final ClassBuilder objectClassBuilder;
-
-  final Loader loader;
-
-  final Class objectClass;
-
-  final Class futureClass;
-
-  final Class functionClass;
-
-  final List<DelayedTypeComputation> _delayedTypeComputations =
-      <DelayedTypeComputation>[];
-
-  final List<DelayedCheck> _delayedChecks = <DelayedCheck>[];
-
-  final List<ClassMember> _delayedMemberComputations = <ClassMember>[];
-
-  @override
-  final CoreTypes coreTypes;
-
-  late Types types;
-
-  ClassHierarchyBuilder(this.objectClassBuilder, this.loader, this.coreTypes)
-      : objectClass = objectClassBuilder.cls,
-        futureClass = coreTypes.futureClass,
-        functionClass = coreTypes.functionClass {
-    types = new Types(this);
-  }
-
-  void clear() {
-    nodes.clear();
-    substitutions.clear();
-    _delayedChecks.clear();
-    _delayedTypeComputations.clear();
-    _delayedMemberComputations.clear();
-  }
-
-  void registerDelayedTypeComputation(DelayedTypeComputation computation) {
-    _delayedTypeComputations.add(computation);
-  }
-
-  void registerOverrideCheck(SourceClassBuilder classBuilder,
-      ClassMember declaredMember, Set<ClassMember> overriddenMembers) {
-    _delayedChecks.add(new DelayedOverrideCheck(
-        classBuilder, declaredMember, overriddenMembers));
-  }
-
-  void registerGetterSetterCheck(
-      SourceClassBuilder classBuilder, ClassMember getter, ClassMember setter) {
-    _delayedChecks
-        .add(new DelayedGetterSetterCheck(classBuilder, getter, setter));
-  }
-
-  void registerMemberComputation(ClassMember member) {
-    _delayedMemberComputations.add(member);
-  }
-
-  List<DelayedTypeComputation> takeDelayedTypeComputations() {
-    List<DelayedTypeComputation> list = _delayedTypeComputations.toList();
-    _delayedTypeComputations.clear();
-    return list;
-  }
-
-  List<DelayedCheck> takeDelayedChecks() {
-    List<DelayedCheck> list = _delayedChecks.toList();
-    _delayedChecks.clear();
-    return list;
-  }
-
-  List<ClassMember> takeDelayedMemberComputations() {
-    List<ClassMember> list = _delayedMemberComputations.toList();
-    _delayedMemberComputations.clear();
-    return list;
-  }
-
-  void inferFieldType(SourceFieldBuilder declaredMember,
-      Iterable<ClassMember> overriddenMembers) {
-    ClassHierarchyNodeBuilder.inferFieldType(
-        this,
-        declaredMember.classBuilder as SourceClassBuilder,
-        declaredMember,
-        overriddenMembers);
-  }
-
-  void inferGetterType(SourceProcedureBuilder declaredMember,
-      Iterable<ClassMember> overriddenMembers) {
-    ClassHierarchyNodeBuilder.inferGetterType(
-        this,
-        declaredMember.classBuilder as SourceClassBuilder,
-        declaredMember,
-        overriddenMembers);
-  }
-
-  void inferSetterType(SourceProcedureBuilder declaredMember,
-      Iterable<ClassMember> overriddenMembers) {
-    ClassHierarchyNodeBuilder.inferSetterType(
-        this,
-        declaredMember.classBuilder as SourceClassBuilder,
-        declaredMember,
-        overriddenMembers);
-  }
-
-  void inferMethodType(SourceProcedureBuilder declaredMember,
-      Iterable<ClassMember> overriddenMembers) {
-    ClassHierarchyNodeBuilder.inferMethodType(
-        this,
-        declaredMember.classBuilder as SourceClassBuilder,
-        declaredMember,
-        overriddenMembers);
-  }
-
-  ClassHierarchyNode getNodeFromClassBuilder(ClassBuilder classBuilder) {
-    return nodes[classBuilder.cls] ??= new ClassHierarchyNodeBuilder(
-            this, classBuilder, substitutions[classBuilder] ??= {})
-        .build();
-  }
-
-  ClassHierarchyNode? getNodeFromTypeBuilder(TypeBuilder type) {
-    ClassBuilder? cls = getClass(type);
-    return cls == null ? null : getNodeFromClassBuilder(cls);
-  }
-
-  ClassHierarchyNode getNodeFromClass(Class cls) {
-    return nodes[cls] ??
-        getNodeFromClassBuilder(loader.computeClassBuilderFromTargetClass(cls));
-  }
-
-  Supertype? asSupertypeOf(InterfaceType subtype, Class supertype) {
-    if (subtype.classNode == supertype) {
-      return new Supertype(supertype, subtype.typeArguments);
-    }
-    ClassHierarchyNode clsNode = getNodeFromClass(subtype.classNode);
-    ClassHierarchyNode supertypeNode = getNodeFromClass(supertype);
-    List<Supertype> superclasses = clsNode.superclasses;
-    int depth = supertypeNode.depth;
-    if (depth < superclasses.length) {
-      Supertype superclass = superclasses[depth];
-      if (superclass.classNode == supertype) {
-        return Substitution.fromInterfaceType(subtype)
-            .substituteSupertype(superclass);
-      }
-    }
-    List<Supertype> superinterfaces = clsNode.interfaces;
-    for (int i = 0; i < superinterfaces.length; i++) {
-      Supertype superinterface = superinterfaces[i];
-      if (superinterface.classNode == supertype) {
-        return Substitution.fromInterfaceType(subtype)
-            .substituteSupertype(superinterface);
-      }
-    }
-    return null;
-  }
-
-  @override
-  InterfaceType getTypeAsInstanceOf(
-      InterfaceType type, Class superclass, Library clientLibrary) {
-    if (type.classNode == superclass) return type;
-    return asSupertypeOf(type, superclass)!
-        .asInterfaceType
-        .withDeclaredNullability(type.nullability);
-  }
-
-  @override
-  List<DartType>? getTypeArgumentsAsInstanceOf(
-      InterfaceType type, Class superclass) {
-    if (type.classNode == superclass) return type.typeArguments;
-    return asSupertypeOf(type, superclass)?.typeArguments;
-  }
-
-  @override
-  InterfaceType getLegacyLeastUpperBound(
-      InterfaceType type1, InterfaceType type2, Library clientLibrary) {
-    if (type1 == type2) return type1;
-
-    // LLUB(Null, List<dynamic>*) works differently for opt-in and opt-out
-    // libraries.  In opt-out libraries the legacy behavior is preserved, so
-    // LLUB(Null, List<dynamic>*) = List<dynamic>*.  In opt-out libraries the
-    // rules imply that LLUB(Null, List<dynamic>*) = List<dynamic>?.
-    if (!clientLibrary.isNonNullableByDefault) {
-      if (type1 is NullType) {
-        return type2;
-      }
-      if (type2 is NullType) {
-        return type1;
-      }
-    }
-
-    ClassHierarchyNode node1 = getNodeFromClass(type1.classNode);
-    ClassHierarchyNode node2 = getNodeFromClass(type2.classNode);
-    Set<ClassHierarchyNode> nodes1 = node1.computeAllSuperNodes(this).toSet();
-    List<ClassHierarchyNode> nodes2 = node2.computeAllSuperNodes(this);
-    List<ClassHierarchyNode> common = <ClassHierarchyNode>[];
-
-    for (int i = 0; i < nodes2.length; i++) {
-      ClassHierarchyNode node = nodes2[i];
-      // ignore: unnecessary_null_comparison
-      if (node == null) continue;
-      if (node.classBuilder.cls.isAnonymousMixin) {
-        // Never find unnamed mixin application in least upper bound.
-        continue;
-      }
-      if (nodes1.contains(node)) {
-        DartType candidate1 =
-            getTypeAsInstanceOf(type1, node.classBuilder.cls, clientLibrary);
-        DartType candidate2 =
-            getTypeAsInstanceOf(type2, node.classBuilder.cls, clientLibrary);
-        if (candidate1 == candidate2) {
-          common.add(node);
-        }
-      }
-    }
-
-    if (common.length == 1) {
-      return coreTypes.objectRawType(
-          uniteNullabilities(type1.nullability, type2.nullability));
-    }
-    common.sort(ClassHierarchyNode.compareMaxInheritancePath);
-
-    for (int i = 0; i < common.length - 1; i++) {
-      ClassHierarchyNode node = common[i];
-      if (node.maxInheritancePath != common[i + 1].maxInheritancePath) {
-        return getTypeAsInstanceOf(type1, node.classBuilder.cls, clientLibrary)
-            .withDeclaredNullability(
-                uniteNullabilities(type1.nullability, type2.nullability));
-      } else {
-        do {
-          i++;
-        } while (node.maxInheritancePath == common[i + 1].maxInheritancePath);
-      }
-    }
-    return coreTypes.objectRawType(
-        uniteNullabilities(type1.nullability, type2.nullability));
-  }
-
-  @override
-  Member? getInterfaceMember(Class cls, Name name, {bool setter: false}) {
-    return getNodeFromClass(cls)
-        .getInterfaceMember(name, setter)
-        ?.getMember(this);
-  }
-
-  ClassMember? getInterfaceClassMember(Class cls, Name name,
-      {bool setter: false}) {
-    return getNodeFromClass(cls).getInterfaceMember(name, setter);
-  }
-
-  static ClassHierarchyBuilder build(ClassBuilder objectClass,
-      List<ClassBuilder> classes, SourceLoader loader, CoreTypes coreTypes) {
-    ClassHierarchyBuilder hierarchy =
-        new ClassHierarchyBuilder(objectClass, loader, coreTypes);
-    for (int i = 0; i < classes.length; i++) {
-      ClassBuilder classBuilder = classes[i];
-      if (!classBuilder.isPatch) {
-        hierarchy.nodes[classBuilder.cls] = new ClassHierarchyNodeBuilder(
-                hierarchy,
-                classBuilder,
-                hierarchy.substitutions[classBuilder] ??= {})
-            .build();
-      } else {
-        // TODO(ahe): Merge the injected members of patch into the hierarchy
-        // node of `cls.origin`.
-      }
-    }
-    return hierarchy;
-  }
-
-  void computeTypes() {
-    List<DelayedTypeComputation> typeComputations =
-        takeDelayedTypeComputations();
-    for (int i = 0; i < typeComputations.length; i++) {
-      typeComputations[i].compute(this);
-    }
-  }
-}
-
-class ClassHierarchyNodeBuilder {
-  final ClassHierarchyBuilder hierarchy;
-
-  final ClassBuilder classBuilder;
-
-  bool hasNoSuchMethod = false;
-
-  final Map<Class, Substitution> substitutions;
-
-  ClassHierarchyNodeBuilder(
-      this.hierarchy, this.classBuilder, this.substitutions);
-
-  ClassBuilder get objectClass => hierarchy.objectClassBuilder;
-
-  bool get shouldModifyKernel =>
-      classBuilder.library.loader == hierarchy.loader;
-
-  ClassMember? checkInheritanceConflict(ClassMember a, ClassMember b) {
-    if (a.isStatic || a.isProperty != b.isProperty) {
-      reportInheritanceConflict(a, b);
-      return a;
-    }
-    return null;
-  }
-
-  static void inferMethodType(
-      ClassHierarchyBuilder hierarchy,
-      SourceClassBuilder classBuilder,
-      SourceProcedureBuilder declaredMember,
-      Iterable<ClassMember> overriddenMembers) {
-    assert(!declaredMember.isGetter && !declaredMember.isSetter);
-    if (declaredMember.classBuilder == classBuilder &&
-        (declaredMember.returnType == null ||
-            declaredMember.formals != null &&
-                declaredMember.formals!
-                    .any((parameter) => parameter.type == null))) {
-      Procedure declaredProcedure = declaredMember.member as Procedure;
-      FunctionNode declaredFunction = declaredProcedure.function;
-      List<TypeParameter> declaredTypeParameters =
-          declaredFunction.typeParameters;
-      List<VariableDeclaration> declaredPositional =
-          declaredFunction.positionalParameters;
-      List<VariableDeclaration> declaredNamed =
-          declaredFunction.namedParameters;
-      declaredNamed = declaredNamed.toList()..sort(compareNamedParameters);
-
-      DartType? inferredReturnType;
-      Map<FormalParameterBuilder, DartType?> inferredParameterTypes = {};
-
-      Set<ClassMember> overriddenMemberSet =
-          toSet(classBuilder, overriddenMembers);
-      CombinedClassMemberSignature combinedMemberSignature =
-          new CombinedClassMemberSignature(
-              hierarchy, classBuilder, overriddenMemberSet.toList(),
-              forSetter: false);
-      FunctionType? combinedMemberSignatureType = combinedMemberSignature
-              .getCombinedSignatureTypeInContext(declaredTypeParameters)
-          as FunctionType?;
-
-      bool cantInferReturnType = false;
-      List<FormalParameterBuilder>? cantInferParameterTypes;
-
-      if (declaredMember.returnType == null) {
-        if (combinedMemberSignatureType == null) {
-          inferredReturnType = const InvalidType();
-          cantInferReturnType = true;
-        } else {
-          inferredReturnType = combinedMemberSignatureType.returnType;
-        }
-      }
-      if (declaredMember.formals != null) {
-        for (int i = 0; i < declaredPositional.length; i++) {
-          FormalParameterBuilder declaredParameter = declaredMember.formals![i];
-          if (declaredParameter.type != null) {
-            continue;
-          }
-
-          DartType? inferredParameterType;
-          if (combinedMemberSignatureType == null) {
-            inferredParameterType = const InvalidType();
-            cantInferParameterTypes ??= [];
-            cantInferParameterTypes.add(declaredParameter);
-          } else if (i <
-              combinedMemberSignatureType.positionalParameters.length) {
-            inferredParameterType =
-                combinedMemberSignatureType.positionalParameters[i];
-          }
-          inferredParameterTypes[declaredParameter] = inferredParameterType;
-        }
-
-        Map<String, DartType>? namedParameterTypes;
-        for (int i = declaredPositional.length;
-            i < declaredMember.formals!.length;
-            i++) {
-          FormalParameterBuilder declaredParameter = declaredMember.formals![i];
-          if (declaredParameter.type != null) {
-            continue;
-          }
-
-          DartType? inferredParameterType;
-          if (combinedMemberSignatureType == null) {
-            inferredParameterType = const InvalidType();
-            cantInferParameterTypes ??= [];
-            cantInferParameterTypes.add(declaredParameter);
-          } else {
-            if (namedParameterTypes == null) {
-              namedParameterTypes = {};
-              for (NamedType namedType
-                  in combinedMemberSignatureType.namedParameters) {
-                namedParameterTypes[namedType.name] = namedType.type;
-              }
-            }
-            inferredParameterType = namedParameterTypes[declaredParameter.name];
-          }
-          inferredParameterTypes[declaredParameter] = inferredParameterType;
-        }
-      }
-
-      if ((cantInferReturnType && cantInferParameterTypes != null) ||
-          (cantInferParameterTypes != null &&
-              cantInferParameterTypes.length > 1)) {
-        reportCantInferTypes(
-            classBuilder, declaredMember, hierarchy, overriddenMembers);
-      } else if (cantInferReturnType) {
-        reportCantInferReturnType(
-            classBuilder, declaredMember, hierarchy, overriddenMembers);
-      } else if (cantInferParameterTypes != null) {
-        reportCantInferParameterType(classBuilder,
-            cantInferParameterTypes.single, hierarchy, overriddenMembers);
-      }
-
-      if (declaredMember.returnType == null) {
-        inferredReturnType ??= const DynamicType();
-        declaredFunction.returnType = inferredReturnType;
-      }
-      if (declaredMember.formals != null) {
-        for (FormalParameterBuilder declaredParameter
-            in declaredMember.formals!) {
-          if (declaredParameter.type == null) {
-            DartType inferredParameterType =
-                inferredParameterTypes[declaredParameter] ??
-                    const DynamicType();
-            declaredParameter.variable!.type = inferredParameterType;
-          }
-        }
-      }
-    }
-  }
-
-  void inferMethodSignature(ClassHierarchyBuilder hierarchy,
-      ClassMember declaredMember, Iterable<ClassMember> overriddenMembers) {
-    assert(!declaredMember.isGetter && !declaredMember.isSetter);
-    // Trigger computation of method type.
-    Procedure declaredProcedure =
-        declaredMember.getMember(hierarchy) as Procedure;
-    for (ClassMember overriddenMember
-        in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Covariance covariance = overriddenMember.getCovariance(hierarchy);
-      covariance.applyCovariance(declaredProcedure);
-    }
-  }
-
-  void inferGetterSignature(ClassHierarchyBuilder hierarchy,
-      ClassMember declaredMember, Iterable<ClassMember> overriddenMembers) {
-    assert(declaredMember.isGetter);
-    // Trigger computation of the getter type.
-    declaredMember.getMember(hierarchy);
-    // Otherwise nothing to do. Getters have no variance.
-  }
-
-  void inferSetterSignature(ClassHierarchyBuilder hierarchy,
-      ClassMember declaredMember, Iterable<ClassMember> overriddenMembers) {
-    assert(declaredMember.isSetter);
-    // Trigger computation of the getter type.
-    Procedure declaredSetter = declaredMember.getMember(hierarchy) as Procedure;
-    for (ClassMember overriddenMember
-        in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Covariance covariance = overriddenMember.getCovariance(hierarchy);
-      covariance.applyCovariance(declaredSetter);
-    }
-  }
-
-  static void inferGetterType(
-      ClassHierarchyBuilder hierarchy,
-      SourceClassBuilder classBuilder,
-      SourceProcedureBuilder declaredMember,
-      Iterable<ClassMember> overriddenMembers) {
-    assert(declaredMember.isGetter);
-    if (declaredMember.classBuilder == classBuilder &&
-        declaredMember.returnType == null) {
-      DartType? inferredType;
-      overriddenMembers = toSet(classBuilder, overriddenMembers);
-
-      List<ClassMember> overriddenGetters = [];
-      List<ClassMember> overriddenSetters = [];
-      for (ClassMember overriddenMember in overriddenMembers) {
-        if (overriddenMember.forSetter) {
-          overriddenSetters.add(overriddenMember);
-        } else {
-          overriddenGetters.add(overriddenMember);
-        }
-      }
-
-      void inferFrom(List<ClassMember> members, {required bool forSetter}) {
-        // ignore: unnecessary_null_comparison
-        assert(forSetter != null);
-        CombinedClassMemberSignature combinedMemberSignature =
-            new CombinedClassMemberSignature(hierarchy, classBuilder, members,
-                forSetter: forSetter);
-        DartType? combinedMemberSignatureType =
-            combinedMemberSignature.combinedMemberSignatureType;
-        if (combinedMemberSignatureType == null) {
-          inferredType = const InvalidType();
-          reportCantInferReturnType(
-              classBuilder, declaredMember, hierarchy, members);
-        } else {
-          inferredType = combinedMemberSignatureType;
-        }
-      }
-
-      if (overriddenGetters.isNotEmpty) {
-        // 1) The return type of a getter, parameter type of a setter or type
-        // of a field which overrides/implements only one or more getters is
-        // inferred to be the return type of the combined member signature of
-        // said getter in the direct superinterfaces.
-
-        // 2) The return type of a getter which overrides/implements both a
-        // setter and a getter is inferred to be the return type of the
-        // combined member signature of said getter in the direct
-        // superinterfaces.
-        inferFrom(overriddenGetters, forSetter: false);
-      } else {
-        // The return type of a getter, parameter type of a setter or type of
-        // a field which overrides/implements only one or more setters is
-        // inferred to be the parameter type of the combined member signature
-        // of said setter in the direct superinterfaces.
-        inferFrom(overriddenSetters, forSetter: true);
-      }
-
-      declaredMember.procedure.function.returnType =
-          inferredType ?? const DynamicType();
-    }
-  }
-
-  static void inferSetterType(
-      ClassHierarchyBuilder hierarchy,
-      SourceClassBuilder classBuilder,
-      SourceProcedureBuilder declaredMember,
-      Iterable<ClassMember> overriddenMembers) {
-    assert(declaredMember.isSetter);
-    FormalParameterBuilder parameter = declaredMember.formals!.first;
-    if (declaredMember.classBuilder == classBuilder && parameter.type == null) {
-      DartType? inferredType;
-
-      overriddenMembers = toSet(classBuilder, overriddenMembers);
-
-      List<ClassMember> overriddenGetters = [];
-      List<ClassMember> overriddenSetters = [];
-      for (ClassMember overriddenMember in overriddenMembers) {
-        if (overriddenMember.forSetter) {
-          overriddenSetters.add(overriddenMember);
-        } else {
-          overriddenGetters.add(overriddenMember);
-        }
-      }
-
-      void inferFrom(List<ClassMember> members, {required bool forSetter}) {
-        // ignore: unnecessary_null_comparison
-        assert(forSetter != null);
-        CombinedClassMemberSignature combinedMemberSignature =
-            new CombinedClassMemberSignature(hierarchy, classBuilder, members,
-                forSetter: forSetter);
-        DartType? combinedMemberSignatureType =
-            combinedMemberSignature.combinedMemberSignatureType;
-        if (combinedMemberSignatureType == null) {
-          inferredType = const InvalidType();
-          reportCantInferReturnType(
-              classBuilder, declaredMember, hierarchy, members);
-        } else {
-          inferredType = combinedMemberSignatureType;
-        }
-      }
-
-      if (overriddenSetters.isNotEmpty) {
-        // 1) The return type of a getter, parameter type of a setter or type
-        // of a field which overrides/implements only one or more setters is
-        // inferred to be the parameter type of the combined member signature
-        // of said setter in the direct superinterfaces.
-        //
-        // 2) The parameter type of a setter which overrides/implements both a
-        // setter and a getter is inferred to be the parameter type of the
-        // combined member signature of said setter in the direct
-        // superinterfaces.
-        inferFrom(overriddenSetters, forSetter: true);
-      } else {
-        // The return type of a getter, parameter type of a setter or type of
-        // a field which overrides/implements only one or more getters is
-        // inferred to be the return type of the combined member signature of
-        // said getter in the direct superinterfaces.
-        inferFrom(overriddenGetters, forSetter: false);
-      }
-
-      parameter.variable!.type = inferredType ?? const DynamicType();
-    }
-  }
-
-  /// Merge the [inheritedType] with the currently [inferredType] using
-  /// nnbd-top-merge or legacy-top-merge depending on whether [classBuilder] is
-  /// defined in an opt-in or opt-out library. If the types could not be merged
-  /// `null` is returned and an error should be reported by the caller.
-  static DartType? mergeTypeInLibrary(
-      ClassHierarchyBuilder hierarchy,
-      ClassBuilder classBuilder,
-      DartType? inferredType,
-      DartType inheritedType) {
-    if (classBuilder.library.isNonNullableByDefault) {
-      if (inferredType == null) {
-        return inheritedType;
-      } else {
-        return nnbdTopMerge(
-            hierarchy.coreTypes,
-            norm(hierarchy.coreTypes, inferredType),
-            norm(hierarchy.coreTypes, inheritedType));
-      }
-    } else {
-      inheritedType = legacyErasure(inheritedType);
-      if (inferredType == null) {
-        return inheritedType;
-      } else {
-        if (inferredType is DynamicType &&
-            inheritedType == hierarchy.coreTypes.objectLegacyRawType) {
-          return inferredType;
-        } else if (inheritedType is DynamicType &&
-            inferredType == hierarchy.coreTypes.objectLegacyRawType) {
-          return inheritedType;
-        }
-        if (inferredType != inheritedType) {
-          return null;
-        }
-        return inferredType;
-      }
-    }
-  }
-
-  /// Infers the field type of [fieldBuilder] based on [overriddenMembers].
-  static void inferFieldType(
-      ClassHierarchyBuilder hierarchy,
-      SourceClassBuilder classBuilder,
-      SourceFieldBuilder fieldBuilder,
-      Iterable<ClassMember> overriddenMembers) {
-    if (fieldBuilder.classBuilder == classBuilder &&
-        fieldBuilder.type == null) {
-      DartType? inferredType;
-
-      overriddenMembers = toSet(classBuilder, overriddenMembers);
-      List<ClassMember> overriddenGetters = [];
-      List<ClassMember> overriddenSetters = [];
-      for (ClassMember overriddenMember in overriddenMembers) {
-        if (overriddenMember.forSetter) {
-          overriddenSetters.add(overriddenMember);
-        } else {
-          overriddenGetters.add(overriddenMember);
-        }
-      }
-
-      DartType? inferFrom(List<ClassMember> members,
-          {required bool forSetter}) {
-        // ignore: unnecessary_null_comparison
-        assert(forSetter != null);
-        CombinedClassMemberSignature combinedMemberSignature =
-            new CombinedClassMemberSignature(hierarchy, classBuilder, members,
-                forSetter: forSetter);
-        return combinedMemberSignature.combinedMemberSignatureType;
-      }
-
-      DartType? combinedMemberSignatureType;
-      if (fieldBuilder.isAssignable &&
-          overriddenGetters.isNotEmpty &&
-          overriddenSetters.isNotEmpty) {
-        // The type of a non-final field which overrides/implements both a
-        // setter and a getter is inferred to be the parameter type of the
-        // combined member signature of said setter in the direct
-        // superinterfaces, if this type is the same as the return type of the
-        // combined member signature of said getter in the direct
-        // superinterfaces. If the types are not the same then inference fails
-        // with an error.
-        DartType? getterType = inferFrom(overriddenGetters, forSetter: false);
-        DartType? setterType = inferFrom(overriddenSetters, forSetter: true);
-        if (getterType == setterType) {
-          combinedMemberSignatureType = getterType;
-        }
-      } else if (overriddenGetters.isNotEmpty) {
-        // 1) The return type of a getter, parameter type of a setter or type
-        // of a field which overrides/implements only one or more getters is
-        // inferred to be the return type of the combined member signature of
-        // said getter in the direct superinterfaces.
-        //
-        // 2) The type of a final field which overrides/implements both a
-        // setter and a getter is inferred to be the return type of the
-        // combined member signature of said getter in the direct
-        // superinterfaces.
-        combinedMemberSignatureType =
-            inferFrom(overriddenGetters, forSetter: false);
-      } else {
-        // The return type of a getter, parameter type of a setter or type of
-        // a field which overrides/implements only one or more setters is
-        // inferred to be the parameter type of the combined member signature
-        // of said setter in the direct superinterfaces.
-        combinedMemberSignatureType =
-            inferFrom(overriddenSetters, forSetter: true);
-      }
-
-      if (combinedMemberSignatureType == null) {
-        inferredType = const InvalidType();
-        reportCantInferFieldType(classBuilder, fieldBuilder, overriddenMembers);
-      } else {
-        inferredType = combinedMemberSignatureType;
-      }
-
-      fieldBuilder.fieldType = inferredType;
-    }
-  }
-
-  /// Infers the field signature of [declaredMember] based on
-  /// [overriddenMembers].
-  void inferFieldSignature(ClassHierarchyBuilder hierarchy,
-      ClassMember declaredMember, Iterable<ClassMember> overriddenMembers) {
-    Field declaredField = declaredMember.getMember(hierarchy) as Field;
-    for (ClassMember overriddenMember
-        in toSet(declaredMember.classBuilder, overriddenMembers)) {
-      Covariance covariance = overriddenMember.getCovariance(hierarchy);
-      covariance.applyCovariance(declaredField);
-    }
-  }
-
-  void reportInheritanceConflict(ClassMember a, ClassMember b) {
-    String name = a.fullNameForErrors;
-    if (a.classBuilder != b.classBuilder) {
-      if (a.classBuilder == classBuilder) {
-        classBuilder.addProblem(
-            messageDeclaredMemberConflictsWithInheritedMember,
-            a.charOffset,
-            name.length,
-            context: <LocatedMessage>[
-              messageDeclaredMemberConflictsWithInheritedMemberCause
-                  .withLocation(b.fileUri, b.charOffset, name.length)
-            ]);
-      } else if (b.classBuilder == classBuilder) {
-        classBuilder.addProblem(
-            messageDeclaredMemberConflictsWithInheritedMember,
-            b.charOffset,
-            name.length,
-            context: <LocatedMessage>[
-              messageDeclaredMemberConflictsWithInheritedMemberCause
-                  .withLocation(a.fileUri, a.charOffset, name.length)
-            ]);
-      } else {
-        classBuilder.addProblem(messageInheritedMembersConflict,
-            classBuilder.charOffset, classBuilder.fullNameForErrors.length,
-            context: _inheritedConflictContext(a, b));
-      }
-    } else if (a.isStatic != b.isStatic) {
-      ClassMember staticMember;
-      ClassMember instanceMember;
-      if (a.isStatic) {
-        staticMember = a;
-        instanceMember = b;
-      } else {
-        staticMember = b;
-        instanceMember = a;
-      }
-      classBuilder.library.addProblem(messageStaticAndInstanceConflict,
-          staticMember.charOffset, name.length, staticMember.fileUri,
-          context: <LocatedMessage>[
-            messageStaticAndInstanceConflictCause.withLocation(
-                instanceMember.fileUri, instanceMember.charOffset, name.length)
-          ]);
-    } else {
-      // This message can be reported twice (when merging localMembers with
-      // classSetters, or localSetters with classMembers). By ensuring that
-      // we always report the one with higher charOffset as the duplicate,
-      // the message duplication logic ensures that we only report this
-      // problem once.
-      ClassMember existing;
-      ClassMember duplicate;
-      assert(a.fileUri == b.fileUri);
-      if (a.charOffset < b.charOffset) {
-        existing = a;
-        duplicate = b;
-      } else {
-        existing = b;
-        duplicate = a;
-      }
-      classBuilder.library.addProblem(
-          templateDuplicatedDeclaration.withArguments(name),
-          duplicate.charOffset,
-          name.length,
-          duplicate.fileUri,
-          context: <LocatedMessage>[
-            templateDuplicatedDeclarationCause.withArguments(name).withLocation(
-                existing.fileUri, existing.charOffset, name.length)
-          ]);
-    }
-  }
-
-  ClassHierarchyNode build() {
-    assert(!classBuilder.isPatch);
-    ClassHierarchyNode? supernode;
-    if (objectClass != classBuilder.origin) {
-      supernode =
-          hierarchy.getNodeFromTypeBuilder(classBuilder.supertypeBuilder!);
-      if (supernode == null) {
-        supernode = hierarchy.getNodeFromClassBuilder(objectClass);
-      }
-      // ignore: unnecessary_null_comparison
-      assert(supernode != null);
-    }
-
-    /// Set to `true` if the class needs interfaces, that is, if it has any
-    /// members where the interface member is different from its corresponding
-    /// class members.
-    ///
-    /// This is an optimization to avoid unnecessary computation of interface
-    /// members.
-    bool hasInterfaces = false;
-
-    Map<Name, Tuple> memberMap = {};
-
-    Scope scope = classBuilder.scope;
-
-    for (Builder builder in scope.localMembers) {
-      MemberBuilder memberBuilder = builder as MemberBuilder;
-      for (ClassMember classMember in memberBuilder.localMembers) {
-        if (classMember.isAbstract) {
-          hasInterfaces = true;
-        }
-        Tuple? tuple = memberMap[classMember.name];
-        if (tuple == null) {
-          memberMap[classMember.name] = new Tuple.declareMember(classMember);
-        } else {
-          tuple.declaredMember = classMember;
-        }
-      }
-      for (ClassMember classMember in memberBuilder.localSetters) {
-        if (classMember.isAbstract) {
-          hasInterfaces = true;
-        }
-        Tuple? tuple = memberMap[classMember.name];
-        if (tuple == null) {
-          memberMap[classMember.name] = new Tuple.declareSetter(classMember);
-        } else {
-          tuple.declaredSetter = classMember;
-        }
-      }
-    }
-
-    for (MemberBuilder memberBuilder in scope.localSetters) {
-      for (ClassMember classMember in memberBuilder.localMembers) {
-        if (classMember.isAbstract) {
-          hasInterfaces = true;
-        }
-        Tuple? tuple = memberMap[classMember.name];
-        if (tuple == null) {
-          memberMap[classMember.name] = new Tuple.declareMember(classMember);
-        } else {
-          tuple.declaredMember = classMember;
-        }
-      }
-      for (ClassMember classMember in memberBuilder.localSetters) {
-        if (classMember.isAbstract) {
-          hasInterfaces = true;
-        }
-        Tuple? tuple = memberMap[classMember.name];
-        if (tuple == null) {
-          memberMap[classMember.name] = new Tuple.declareSetter(classMember);
-        } else {
-          tuple.declaredSetter = classMember;
-        }
-      }
-    }
-
-    if (classBuilder.isMixinApplication) {
-      TypeBuilder mixedInTypeBuilder = classBuilder.mixedInTypeBuilder!;
-      TypeDeclarationBuilder mixin = mixedInTypeBuilder.declaration!;
-      inferMixinApplication();
-      while (mixin.isNamedMixinApplication) {
-        ClassBuilder named = mixin as ClassBuilder;
-        mixedInTypeBuilder = named.mixedInTypeBuilder!;
-        mixin = mixedInTypeBuilder.declaration!;
-      }
-      if (mixin is TypeAliasBuilder) {
-        TypeAliasBuilder aliasBuilder = mixin;
-        NamedTypeBuilder namedBuilder = mixedInTypeBuilder as NamedTypeBuilder;
-        mixin = aliasBuilder.unaliasDeclaration(namedBuilder.arguments,
-            isUsedAsClass: true,
-            usedAsClassCharOffset: namedBuilder.charOffset,
-            usedAsClassFileUri: namedBuilder.fileUri)!;
-      }
-      if (mixin is ClassBuilder) {
-        scope = mixin.scope.computeMixinScope();
-
-        for (Builder builder in scope.localMembers) {
-          MemberBuilder memberBuilder = builder as MemberBuilder;
-          for (ClassMember classMember in memberBuilder.localMembers) {
-            if (classMember.isAbstract) {
-              hasInterfaces = true;
-            }
-            Tuple? tuple = memberMap[classMember.name];
-            if (tuple == null) {
-              memberMap[classMember.name] = new Tuple.mixInMember(classMember);
-            } else {
-              tuple.mixedInMember = classMember;
-            }
-          }
-          for (ClassMember classMember in memberBuilder.localSetters) {
-            if (classMember.isAbstract) {
-              hasInterfaces = true;
-            }
-            Tuple? tuple = memberMap[classMember.name];
-            if (tuple == null) {
-              memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
-            } else {
-              tuple.mixedInSetter = classMember;
-            }
-          }
-        }
-
-        for (MemberBuilder memberBuilder in scope.localSetters) {
-          for (ClassMember classMember in memberBuilder.localMembers) {
-            if (classMember.isAbstract) {
-              hasInterfaces = true;
-            }
-            Tuple? tuple = memberMap[classMember.name];
-            if (tuple == null) {
-              memberMap[classMember.name] = new Tuple.mixInMember(classMember);
-            } else {
-              tuple.mixedInMember = classMember;
-            }
-          }
-          for (ClassMember classMember in memberBuilder.localSetters) {
-            if (classMember.isAbstract) {
-              hasInterfaces = true;
-            }
-            Tuple? tuple = memberMap[classMember.name];
-            if (tuple == null) {
-              memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
-            } else {
-              tuple.mixedInSetter = classMember;
-            }
-          }
-        }
-      }
-    }
-
-    List<Supertype> superclasses;
-
-    List<Supertype> interfaces;
-
-    int maxInheritancePath;
-
-    void extend(Map<Name, ClassMember>? superClassMembers) {
-      if (superClassMembers == null) return;
-      for (MapEntry<Name, ClassMember> entry in superClassMembers.entries) {
-        Name name = entry.key;
-        ClassMember superClassMember = entry.value;
-        Tuple? tuple = memberMap[name];
-        if (tuple != null) {
-          if (superClassMember.forSetter) {
-            tuple.extendedSetter = superClassMember;
-          } else {
-            tuple.extendedMember = superClassMember;
-          }
-        } else {
-          if (superClassMember.forSetter) {
-            memberMap[name] = new Tuple.extendSetter(superClassMember);
-          } else {
-            memberMap[name] = new Tuple.extendMember(superClassMember);
-          }
-        }
-      }
-    }
-
-    void implement(Map<Name, ClassMember>? superInterfaceMembers) {
-      if (superInterfaceMembers == null) return;
-      for (MapEntry<Name, ClassMember> entry in superInterfaceMembers.entries) {
-        Name name = entry.key;
-        ClassMember superInterfaceMember = entry.value;
-        Tuple? tuple = memberMap[name];
-        if (tuple != null) {
-          if (superInterfaceMember.forSetter) {
-            tuple.addImplementedSetter(superInterfaceMember);
-          } else {
-            tuple.addImplementedMember(superInterfaceMember);
-          }
-        } else {
-          if (superInterfaceMember.forSetter) {
-            memberMap[superInterfaceMember.name] =
-                new Tuple.implementSetter(superInterfaceMember);
-          } else {
-            memberMap[superInterfaceMember.name] =
-                new Tuple.implementMember(superInterfaceMember);
-          }
-        }
-      }
-    }
-
-    if (supernode == null) {
-      // This should be Object.
-      superclasses = new List<Supertype>.filled(0, dummySupertype);
-      interfaces = new List<Supertype>.filled(0, dummySupertype);
-      maxInheritancePath = 0;
-    } else {
-      maxInheritancePath = supernode.maxInheritancePath + 1;
-
-      superclasses = new List<Supertype>.filled(
-          supernode.superclasses.length + 1, dummySupertype);
-      Supertype? supertype = classBuilder.supertypeBuilder!.buildSupertype(
-          classBuilder.library, classBuilder.charOffset, classBuilder.fileUri);
-      if (supertype == null) {
-        // If the superclass is not an interface type we use Object instead.
-        // A similar normalization is performed on [supernode] above.
-        supertype =
-            new Supertype(hierarchy.coreTypes.objectClass, const <DartType>[]);
-      }
-      superclasses.setRange(0, superclasses.length - 1,
-          substSupertypes(supertype, supernode.superclasses));
-      superclasses[superclasses.length - 1] = supertype;
-      if (!classBuilder.library.isNonNullableByDefault &&
-          supernode.classBuilder.library.isNonNullableByDefault) {
-        for (int i = 0; i < superclasses.length; i++) {
-          superclasses[i] = legacyErasureSupertype(superclasses[i]);
-        }
-      }
-
-      List<TypeBuilder>? directInterfaceBuilders =
-          ignoreFunction(classBuilder.interfaceBuilders);
-      if (classBuilder.isMixinApplication) {
-        if (directInterfaceBuilders == null) {
-          directInterfaceBuilders = <TypeBuilder>[
-            classBuilder.mixedInTypeBuilder!
-          ];
-        } else {
-          directInterfaceBuilders = <TypeBuilder>[
-            classBuilder.mixedInTypeBuilder!
-          ]..addAll(directInterfaceBuilders);
-        }
-      }
-
-      List<Supertype> superclassInterfaces = supernode.interfaces;
-      // ignore: unnecessary_null_comparison
-      if (superclassInterfaces != null) {
-        superclassInterfaces = substSupertypes(supertype, superclassInterfaces);
-      }
-
-      extend(supernode.classMemberMap);
-      extend(supernode.classSetterMap);
-
-      if (supernode.interfaceMemberMap != null ||
-          supernode.interfaceSetterMap != null) {
-        hasInterfaces = true;
-      }
-
-      if (hasInterfaces) {
-        implement(supernode.interfaceMemberMap ?? supernode.classMemberMap);
-        implement(supernode.interfaceSetterMap ?? supernode.classSetterMap);
-      }
-
-      if (directInterfaceBuilders != null) {
-        for (int i = 0; i < directInterfaceBuilders.length; i++) {
-          ClassHierarchyNode? interfaceNode =
-              hierarchy.getNodeFromTypeBuilder(directInterfaceBuilders[i]);
-          if (interfaceNode != null) {
-            hasInterfaces = true;
-
-            implement(interfaceNode.interfaceMemberMap ??
-                interfaceNode.classMemberMap);
-            implement(interfaceNode.interfaceSetterMap ??
-                interfaceNode.classSetterMap);
-          }
-        }
-
-        interfaces = <Supertype>[];
-        // ignore: unnecessary_null_comparison
-        if (superclassInterfaces != null) {
-          for (int i = 0; i < superclassInterfaces.length; i++) {
-            addInterface(interfaces, superclasses, superclassInterfaces[i]);
-          }
-        }
-
-        for (int i = 0; i < directInterfaceBuilders.length; i++) {
-          Supertype? directInterface = directInterfaceBuilders[i]
-              .buildSupertype(classBuilder.library, classBuilder.charOffset,
-                  classBuilder.fileUri);
-          if (directInterface != null) {
-            addInterface(interfaces, superclasses, directInterface);
-            ClassHierarchyNode interfaceNode =
-                hierarchy.getNodeFromClass(directInterface.classNode);
-            // ignore: unnecessary_null_comparison
-            if (interfaceNode != null) {
-              if (maxInheritancePath < interfaceNode.maxInheritancePath + 1) {
-                maxInheritancePath = interfaceNode.maxInheritancePath + 1;
-              }
-
-              List<Supertype> types =
-                  substSupertypes(directInterface, interfaceNode.superclasses);
-              for (int i = 0; i < types.length; i++) {
-                addInterface(interfaces, superclasses, types[i]);
-              }
-              // ignore: unnecessary_null_comparison
-              if (interfaceNode.interfaces != null) {
-                List<Supertype> types =
-                    substSupertypes(directInterface, interfaceNode.interfaces);
-                for (int i = 0; i < types.length; i++) {
-                  addInterface(interfaces, superclasses, types[i]);
-                }
-              }
-            }
-          }
-        }
-        // ignore: unnecessary_null_comparison
-      } else if (superclassInterfaces != null &&
-          !classBuilder.library.isNonNullableByDefault &&
-          supernode.classBuilder.library.isNonNullableByDefault) {
-        interfaces = <Supertype>[];
-        for (int i = 0; i < superclassInterfaces.length; i++) {
-          addInterface(interfaces, superclasses, superclassInterfaces[i]);
-        }
-      } else {
-        interfaces = superclassInterfaces;
-      }
-    }
-
-    for (Supertype superclass in superclasses) {
-      recordSupertype(superclass);
-    }
-    // ignore: unnecessary_null_comparison
-    if (interfaces != null) {
-      for (Supertype superinterface in interfaces) {
-        recordSupertype(superinterface);
-      }
-    }
-
-    /// Members (excluding setters) declared in [cls] or its superclasses. This
-    /// includes static methods of [cls], but not its superclasses.
-    Map<Name, ClassMember> classMemberMap = {};
-
-    /// Setters declared in [cls] or its superclasses. This includes static
-    /// setters of [cls], but not its superclasses.
-    Map<Name, ClassMember> classSetterMap = {};
-
-    /// Members (excluding setters) inherited from interfaces. This contains no
-    /// static members. If no interfaces are implemented by this class or its
-    /// superclasses this is identical to [classMemberMap] and we do not store
-    /// it in the [ClassHierarchyNode].
-    Map<Name, ClassMember>? interfaceMemberMap = {};
-
-    /// Setters inherited from interfaces. This contains no static setters. If
-    /// no interfaces are implemented by this class or its superclasses this is
-    /// identical to [classSetterMap] and we do not store it in the
-    /// [ClassHierarchyNode].
-    Map<Name, ClassMember>? interfaceSetterMap = {};
-
-    /// Map for members declared in this class to the members that they
-    /// override. This is used for checking valid overrides and to ensure that
-    /// override inference correctly propagates inferred types through the
-    /// class hierarchy.
-    Map<ClassMember, Set<ClassMember>> declaredOverridesMap = {};
-
-    /// In case this class is a mixin application, this maps members declared in
-    /// the mixin to the members that they override. This is used for checking
-    /// valid overrides but _not_ as for [declaredOverridesMap] for override
-    /// inference.
-    Map<ClassMember, Set<ClassMember>> mixinApplicationOverridesMap = {};
-
-    /// In case this class is concrete, this maps concrete members that are
-    /// inherited into this class to the members they should override to validly
-    /// implement the interface of this class.
-    Map<ClassMember, Set<ClassMember>> inheritedImplementsMap = {};
-
-    /// In case this class is concrete, this holds the interface members
-    /// without a corresponding class member. These are either reported as
-    /// missing implementations or trigger insertion of noSuchMethod forwarders.
-    List<ClassMember>? abstractMembers = [];
-
-    ClassHierarchyNodeDataForTesting? dataForTesting;
-    if (retainDataForTesting) {
-      dataForTesting = new ClassHierarchyNodeDataForTesting(
-          abstractMembers,
-          declaredOverridesMap,
-          mixinApplicationOverridesMap,
-          inheritedImplementsMap);
-    }
-
-    /// Registers that the current class has an interface member without a
-    /// corresponding class member.
-    ///
-    /// This is used to report missing implementation or, in the case the class
-    /// has a user defined concrete noSuchMethod, to insert noSuchMethod
-    /// forwarders. (Currently, insertion of forwarders is handled elsewhere.)
-    ///
-    /// For instance:
-    ///
-    ///    abstract class Interface {
-    ///      method();
-    ///    }
-    ///    class Class1 implements Interface {
-    ///      // Missing implementation for `Interface.method`.
-    ///    }
-    ///    class Class2 implements Interface {
-    ///      noSuchMethod(_) {}
-    ///      // A noSuchMethod forwarder is added for `Interface.method`.
-    ///    }
-    ///
-    void registerAbstractMember(ClassMember abstractMember) {
-      if (!abstractMember.isInternalImplementation) {
-        /// If `isInternalImplementation` is `true`, the member is synthesized
-        /// implementation that does not require implementation in other
-        /// classes.
-        ///
-        /// This is for instance used for late lowering where
-        ///
-        ///    class Interface {
-        ///      late int? field;
-        ///    }
-        ///    class Class implements Interface {
-        ///      int? field;
-        ///    }
-        ///
-        /// is encoded as
-        ///
-        ///    class Interface {
-        ///      bool _#field#isSet = false;
-        ///      int? _#field = null;
-        ///      int? get field => _#field#isSet ? _#field : throw ...;
-        ///      void set field(int? value) { ... }
-        ///    }
-        ///    class Class implements Interface {
-        ///      int? field;
-        ///    }
-        ///
-        /// and `Class` should not be required to implement
-        /// `Interface._#field#isSet` and `Interface._#field`.
-        abstractMembers.add(abstractMember);
-      }
-    }
-
-    /// Registers that [inheritedMember] should be checked to validly override
-    /// [overrides].
-    ///
-    /// This is needed in the case where a concrete member is inherited into
-    /// a concrete subclass. For instance:
-    ///
-    ///    class Super {
-    ///      void method() {}
-    ///    }
-    ///    abstract class Interface {
-    ///      void method();
-    ///    }
-    ///    class Class extends Super implements Interface {}
-    ///
-    /// Here `Super.method` must be checked to be a valid implementation for
-    /// `Interface.method` by being a valid override of it.
-    void registerInheritedImplements(
-        ClassMember inheritedMember, Set<ClassMember> overrides,
-        {required ClassMember aliasForTesting}) {
-      if (classBuilder is SourceClassBuilder) {
-        assert(
-            inheritedMember.classBuilder != classBuilder,
-            "Only inherited members can implement by inheritance: "
-            "${inheritedMember}");
-        inheritedImplementsMap[inheritedMember] = overrides;
-        // ignore: unnecessary_null_comparison
-        if (dataForTesting != null && aliasForTesting != null) {
-          dataForTesting.aliasMap[aliasForTesting] = inheritedMember;
-        }
-      }
-    }
-
-    /// Returns `true` if the current class is from an opt-out library and
-    /// [classMember] is from an opt-in library.
-    ///
-    /// In this case a member signature needs to be inserted to show the
-    /// legacy erased type of the interface member. For instance:
-    ///
-    ///    // Opt-in library:
-    ///    class Super {
-    ///      int? method(int i) {}
-    ///    }
-    ///    // Opt-out library:
-    ///    class Class extends Super {
-    ///      // A member signature is inserted:
-    ///      // int* method(int* i);
-    ///    }
-    ///
-    bool needsMemberSignatureFor(ClassMember classMember) {
-      return !classBuilder.library.isNonNullableByDefault &&
-          classMember.classBuilder.library.isNonNullableByDefault;
-    }
-
-    memberMap.forEach((Name name, Tuple tuple) {
-      /// The computation starts by sanitizing the members. Conflicts between
-      /// methods and properties (getters/setters) or between static and
-      /// instance members are reported. Conflicting members and members
-      /// overridden by duplicates are removed.
-      ///
-      /// For this [definingGetable] and [definingSetable] hold the first member
-      /// of its kind found among declared, mixed in, extended and implemented
-      /// members.
-      ///
-      /// Conflicts between [definingGetable] and [definingSetable] are reported
-      /// afterwards.
-
-      ClassMember? definingGetable;
-      ClassMember? definingSetable;
-
-      ClassMember? declaredGetable = tuple.declaredMember;
-      if (declaredGetable != null) {
-        /// class Class {
-        ///   method() {}
-        /// }
-        definingGetable = declaredGetable;
-      }
-      ClassMember? declaredSetable = tuple.declaredSetter;
-      if (declaredSetable != null) {
-        /// class Class {
-        ///   set setter(value) {}
-        /// }
-        definingSetable = declaredSetable;
-      }
-
-      ClassMember? mixedInGetable;
-      ClassMember? tupleMixedInMember = tuple.mixedInMember;
-      if (tupleMixedInMember != null &&
-          !tupleMixedInMember.isStatic &&
-          !tupleMixedInMember.isDuplicate &&
-          !tupleMixedInMember.isSynthesized) {
-        /// We treat
-        ///
-        ///   opt-in:
-        ///   class Interface {
-        ///     method3() {}
-        ///   }
-        ///   opt-out:
-        ///   class Mixin implements Interface {
-        ///     static method1() {}
-        ///     method2() {}
-        ///     method2() {}
-        ///     /*member-signature*/ method3() {}
-        ///   }
-        ///   class Class with Mixin {}
-        ///
-        /// as
-        ///
-        ///   class Mixin {}
-        ///   class Class with Mixin {}
-        ///
-        /// Note that skipped synthetic getable 'method3' is still included
-        /// in the implemented getables, but its type will not define the type
-        /// when mixed in. For instance
-        ///
-        ///   opt-in:
-        ///   abstract class Interface {
-        ///     num get getter;
-        ///   }
-        ///   opt-out:
-        ///   abstract class Super {
-        ///     int get getter;
-        ///   }
-        ///   abstract class Mixin implements Interface {
-        ///     /*member-signature*/ num get getter;
-        ///   }
-        ///   abstract class Class extends Super with Mixin {}
-        ///
-        /// Here the type of `Class.getter` should not be defined from the
-        /// synthetic member signature `Mixin.getter` but as a combined member
-        /// signature of `Super.getter` and `Mixin.getter`, resulting in type
-        /// `int` instead of `num`.
-        if (definingGetable == null) {
-          /// class Mixin {
-          ///   method() {}
-          /// }
-          /// class Class with Mixin {}
-          definingGetable = mixedInGetable = tupleMixedInMember;
-        } else if (!definingGetable.isDuplicate) {
-          // This case is currently unreachable from source code since classes
-          // cannot both declare and mix in members. From dill, this can occur
-          // but should not conflicting members.
-          //
-          // The case is handled for consistency.
-          if (definingGetable.isStatic ||
-              definingGetable.isProperty != tupleMixedInMember.isProperty) {
-            reportInheritanceConflict(definingGetable, tupleMixedInMember);
-          } else {
-            mixedInGetable = tupleMixedInMember;
-          }
-        }
-      }
-      ClassMember? mixedInSetable;
-      ClassMember? tupleMixedInSetter = tuple.mixedInSetter;
-      if (tupleMixedInSetter != null &&
-          !tupleMixedInSetter.isStatic &&
-          !tupleMixedInSetter.isDuplicate &&
-          !tupleMixedInSetter.isSynthesized) {
-        /// We treat
-        ///
-        ///   class Mixin {
-        ///     static set setter1(value) {}
-        ///     set setter2(value) {}
-        ///     set setter2(value) {}
-        ///     /*member-signature*/ setter3() {}
-        ///   }
-        ///   class Class with Mixin {}
-        ///
-        /// as
-        ///
-        ///   class Mixin {}
-        ///   class Class with Mixin {}
-        ///
-        /// Note that skipped synthetic setable 'setter3' is still included
-        /// in the implemented setables, but its type will not define the type
-        /// when mixed in. For instance
-        ///
-        ///   opt-in:
-        ///   abstract class Interface {
-        ///     void set setter(int value);
-        ///   }
-        ///   opt-out:
-        ///   abstract class Super {
-        ///     void set setter(num value);
-        ///   }
-        ///   abstract class Mixin implements Interface {
-        ///     /*member-signature*/ num get getter;
-        ///   }
-        ///   abstract class Class extends Super with Mixin {}
-        ///
-        /// Here the type of `Class.setter` should not be defined from the
-        /// synthetic member signature `Mixin.setter` but as a combined member
-        /// signature of `Super.setter` and `Mixin.setter`, resulting in type
-        /// `num` instead of `int`.
-        if (definingSetable == null) {
-          /// class Mixin {
-          ///   set setter(value) {}
-          /// }
-          /// class Class with Mixin {}
-          definingSetable = mixedInSetable = tupleMixedInSetter;
-        } else if (!definingSetable.isDuplicate) {
-          if (definingSetable.isStatic ||
-              definingSetable.isProperty != tupleMixedInSetter.isProperty) {
-            reportInheritanceConflict(definingSetable, tupleMixedInSetter);
-          } else {
-            mixedInSetable = tupleMixedInSetter;
-          }
-        }
-      }
-
-      ClassMember? extendedGetable;
-      ClassMember? tupleExtendedMember = tuple.extendedMember;
-      if (tupleExtendedMember != null &&
-          !tupleExtendedMember.isStatic &&
-          !tupleExtendedMember.isDuplicate) {
-        /// We treat
-        ///
-        ///   class Super {
-        ///     static method1() {}
-        ///     method2() {}
-        ///     method2() {}
-        ///   }
-        ///   class Class extends Super {}
-        ///
-        /// as
-        ///
-        ///   class Super {}
-        ///   class Class extends Super {}
-        ///
-        if (definingGetable == null) {
-          /// class Super {
-          ///   method() {}
-          /// }
-          /// class Class extends Super {}
-          definingGetable = extendedGetable = tupleExtendedMember;
-        } else if (!definingGetable.isDuplicate) {
-          if (definingGetable.isStatic ||
-              definingGetable.isProperty != tupleExtendedMember.isProperty) {
-            ///   class Super {
-            ///     method() {}
-            ///   }
-            ///   class Class extends Super {
-            ///     static method() {}
-            ///   }
-            ///
-            /// or
-            ///
-            ///   class Super {
-            ///     method() {}
-            ///   }
-            ///   class Class extends Super {
-            ///     get getter => 0;
-            ///   }
-            reportInheritanceConflict(definingGetable, tupleExtendedMember);
-          } else {
-            extendedGetable = tupleExtendedMember;
-          }
-        }
-      }
-      ClassMember? extendedSetable;
-      ClassMember? tupleExtendedSetter = tuple.extendedSetter;
-      if (tupleExtendedSetter != null &&
-          !tupleExtendedSetter.isStatic &&
-          !tupleExtendedSetter.isDuplicate) {
-        /// We treat
-        ///
-        ///   class Super {
-        ///     static set setter1(value) {}
-        ///     set setter2(value) {}
-        ///     set setter2(value) {}
-        ///   }
-        ///   class Class extends Super {}
-        ///
-        /// as
-        ///
-        ///   class Super {}
-        ///   class Class extends Super {}
-        ///
-        if (definingSetable == null) {
-          /// class Super {
-          ///   set setter(value) {}
-          /// }
-          /// class Class extends Super {}
-          definingSetable = extendedSetable = tupleExtendedSetter;
-        } else if (!definingSetable.isDuplicate) {
-          if (definingSetable.isStatic ||
-              definingSetable.isProperty != tupleExtendedSetter.isProperty) {
-            reportInheritanceConflict(definingSetable, tupleExtendedSetter);
-          } else {
-            extendedSetable = tupleExtendedSetter;
-          }
-        }
-      }
-
-      // TODO(johnniwinther): Remove extended and mixed in members/setters
-      // from implemented members/setters. Mixin applications always implement
-      // the mixin class leading to unnecessary interface members.
-      List<ClassMember>? implementedGetables;
-      List<ClassMember>? tupleImplementedMembers = tuple.implementedMembers;
-      if (tupleImplementedMembers != null &&
-          // Skip implemented members if we already have a duplicate.
-          !(definingGetable != null && definingGetable.isDuplicate)) {
-        for (int i = 0; i < tupleImplementedMembers.length; i++) {
-          ClassMember? implementedGetable = tupleImplementedMembers[i];
-          if (implementedGetable.isStatic || implementedGetable.isDuplicate) {
-            /// We treat
-            ///
-            ///   class Interface {
-            ///     static method1() {}
-            ///     method2() {}
-            ///     method2() {}
-            ///   }
-            ///   class Class implements Interface {}
-            ///
-            /// as
-            ///
-            ///   class Interface {}
-            ///   class Class implements Interface {}
-            ///
-            implementedGetable = null;
-          } else {
-            if (definingGetable == null) {
-              /// class Interface {
-              ///   method() {}
-              /// }
-              /// class Class implements Interface {}
-              definingGetable = implementedGetable;
-            } else if (definingGetable.isStatic ||
-                definingGetable.isProperty != implementedGetable.isProperty) {
-              ///   class Interface {
-              ///     method() {}
-              ///   }
-              ///   class Class implements Interface {
-              ///     static method() {}
-              ///   }
-              ///
-              /// or
-              ///
-              ///   class Interface {
-              ///     method() {}
-              ///   }
-              ///   class Class implements Interface {
-              ///     get getter => 0;
-              ///   }
-              reportInheritanceConflict(definingGetable, implementedGetable);
-              implementedGetable = null;
-            }
-          }
-          if (implementedGetable == null) {
-            // On the first skipped member we add all previous.
-            implementedGetables ??= tupleImplementedMembers.take(i).toList();
-          } else if (implementedGetables != null) {
-            // If already skipping members we add [implementedGetable]
-            // explicitly.
-            implementedGetables.add(implementedGetable);
-          }
-        }
-        if (implementedGetables == null) {
-          // No members were skipped so we use the full list.
-          implementedGetables = tupleImplementedMembers;
-        } else if (implementedGetables.isEmpty) {
-          // No members were included.
-          implementedGetables = null;
-        }
-      }
-
-      List<ClassMember>? implementedSetables;
-      List<ClassMember>? tupleImplementedSetters = tuple.implementedSetters;
-      if (tupleImplementedSetters != null &&
-          // Skip implemented setters if we already have a duplicate.
-          !(definingSetable != null && definingSetable.isDuplicate)) {
-        for (int i = 0; i < tupleImplementedSetters.length; i++) {
-          ClassMember? implementedSetable = tupleImplementedSetters[i];
-          if (implementedSetable.isStatic || implementedSetable.isDuplicate) {
-            /// We treat
-            ///
-            ///   class Interface {
-            ///     static set setter1(value) {}
-            ///     set setter2(value) {}
-            ///     set setter2(value) {}
-            ///   }
-            ///   class Class implements Interface {}
-            ///
-            /// as
-            ///
-            ///   class Interface {}
-            ///   class Class implements Interface {}
-            ///
-            implementedSetable = null;
-          } else {
-            if (definingSetable == null) {
-              /// class Interface {
-              ///   set setter(value) {}
-              /// }
-              /// class Class implements Interface {}
-              definingSetable = implementedSetable;
-            } else if (definingSetable.isStatic ||
-                definingSetable.isProperty != implementedSetable.isProperty) {
-              /// class Interface {
-              ///   set setter(value) {}
-              /// }
-              /// class Class implements Interface {
-              ///   static set setter(value) {}
-              /// }
-              reportInheritanceConflict(definingSetable, implementedSetable);
-              implementedSetable = null;
-            }
-          }
-          if (implementedSetable == null) {
-            // On the first skipped setter we add all previous.
-            implementedSetables ??= tupleImplementedSetters.take(i).toList();
-          } else if (implementedSetables != null) {
-            // If already skipping setters we add [implementedSetable]
-            // explicitly.
-            implementedSetables.add(implementedSetable);
-          }
-        }
-        if (implementedSetables == null) {
-          // No setters were skipped so we use the full list.
-          implementedSetables = tupleImplementedSetters;
-        } else if (implementedSetables.isEmpty) {
-          // No setters were included.
-          implementedSetables = null;
-        }
-      }
-
-      if (definingGetable != null && definingSetable != null) {
-        if (definingGetable.isStatic != definingSetable.isStatic ||
-            definingGetable.isProperty != definingSetable.isProperty) {
-          reportInheritanceConflict(definingGetable, definingSetable);
-          // TODO(johnniwinther): Should we remove [definingSetable]? If we
-          // leave it in this conflict will also be reported in subclasses. If
-          // we remove it, any write to the setable will be unresolved.
-        }
-      }
-
-      // TODO(johnniwinther): Handle declared members together with mixed in
-      // members. This should only occur from .dill, though.
-      if (mixedInGetable != null) {
-        declaredGetable = null;
-      }
-      if (mixedInSetable != null) {
-        declaredSetable = null;
-      }
-
-      /// Set to `true` if declared members have been registered in
-      /// [registerDeclaredOverride] or [registerMixedInOverride].
-      bool hasDeclaredMembers = false;
-
-      /// Declared methods, getters and setters registered in
-      /// [registerDeclaredOverride].
-      ClassMember? declaredMethod;
-      List<ClassMember>? declaredProperties;
-
-      /// Declared methods, getters and setters registered in
-      /// [registerDeclaredOverride].
-      ClassMember? mixedInMethod;
-      List<ClassMember>? mixedInProperties;
-
-      /// Registers that [declaredMember] overrides extended and implemented
-      /// members.
-      ///
-      /// Getters and setters share overridden members so the registration
-      /// of override relations is performed after the interface members have
-      /// been computed.
-      ///
-      /// Declared members must be checked for valid override of the overridden
-      /// members _and_ must register an override dependency with the overridden
-      /// members so that override inference can propagate inferred types
-      /// correctly. For instance:
-      ///
-      ///    class Super {
-      ///      int get property => 42;
-      ///    }
-      ///    class Class extends Super {
-      ///      void set property(value) {}
-      ///    }
-      ///
-      /// Here the parameter type of the setter `Class.property` must be
-      /// inferred from the type of the getter `Super.property`.
-      void registerDeclaredOverride(ClassMember declaredMember,
-          {ClassMember? aliasForTesting}) {
-        if (classBuilder is SourceClassBuilder && !declaredMember.isStatic) {
-          assert(
-              declaredMember.isSourceDeclaration &&
-                  declaredMember.classBuilder == classBuilder,
-              "Only declared members can override: ${declaredMember}");
-          hasDeclaredMembers = true;
-          if (declaredMember.isProperty) {
-            declaredProperties ??= [];
-            declaredProperties!.add(declaredMember);
-          } else {
-            assert(
-                declaredMethod == null,
-                "Multiple methods unexpectedly declared: "
-                "${declaredMethod} and ${declaredMember}.");
-            declaredMethod = declaredMember;
-          }
-          if (dataForTesting != null && aliasForTesting != null) {
-            dataForTesting.aliasMap[aliasForTesting] = declaredMember;
-          }
-        }
-      }
-
-      /// Registers that [mixedMember] overrides extended and implemented
-      /// members through application.
-      ///
-      /// Getters and setters share overridden members so the registration
-      /// of override relations in performed after the interface members have
-      /// been computed.
-      ///
-      /// Declared mixed in members must be checked for valid override of the
-      /// overridden members but _not_ register an override dependency with the
-      /// overridden members. This is in contrast to declared members. For
-      /// instance:
-      ///
-      ///    class Super {
-      ///      int get property => 42;
-      ///    }
-      ///    class Mixin {
-      ///      void set property(value) {}
-      ///    }
-      ///    class Class = Super with Mixin;
-      ///
-      /// Here the parameter type of the setter `Mixin.property` must _not_ be
-      /// inferred from the type of the getter `Super.property`, but should
-      /// instead default to `dynamic`.
-      void registerMixedInOverride(ClassMember mixedInMember,
-          {ClassMember? aliasForTesting}) {
-        assert(mixedInMember.classBuilder != classBuilder,
-            "Only mixin members can override by application: ${mixedInMember}");
-        if (classBuilder is SourceClassBuilder) {
-          hasDeclaredMembers = true;
-          if (mixedInMember.isProperty) {
-            mixedInProperties ??= [];
-            mixedInProperties!.add(mixedInMember);
-          } else {
-            assert(
-                mixedInMethod == null,
-                "Multiple methods unexpectedly declared in mixin: "
-                "${mixedInMethod} and ${mixedInMember}.");
-            mixedInMethod = mixedInMember;
-          }
-          if (dataForTesting != null && aliasForTesting != null) {
-            dataForTesting.aliasMap[aliasForTesting] = mixedInMember;
-          }
-        }
-      }
-
-      /// Computes the class and interface members for a method, getter, or
-      /// setter in the current [tuple].
-      ///
-      /// [definingMember] is the member which defines whether the computation
-      /// is for a method, a getter or a setter.
-      /// [declaredMember] is the member declared in the current class, if any.
-      /// [mixedInMember] is the member declared in a mixin that is mixed into
-      /// the current current class, if any.
-      /// [extendedMember] is the member inherited from the super class.
-      /// [implementedMembers] are the members inherited from the super
-      /// interfaces, if none this is `null`.
-      ///
-      /// The computed class and interface members are added to [classMemberMap]
-      /// and [interfaceMemberMap], respectively.
-      ClassMember? computeMembers(
-          {required ClassMember definingMember,
-          required ClassMember? declaredMember,
-          required ClassMember? mixedInMember,
-          required ClassMember? extendedMember,
-          required List<ClassMember>? implementedMembers,
-          required Map<Name, ClassMember> classMemberMap,
-          required Map<Name, ClassMember>? interfaceMemberMap}) {
-        ClassMember? classMember;
-        ClassMember? interfaceMember;
-
-        if (mixedInMember != null) {
-          if (mixedInMember.isAbstract) {
-            ///    class Mixin {
-            ///      method();
-            ///    }
-            ///    class Class = Object with Mixin;
-
-            /// Interface members from the extended, mixed in, and implemented
-            /// members define the combined member signature.
-            Set<ClassMember> interfaceMembers = {};
-
-            if (extendedMember != null) {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Mixin {
-              ///      method();
-              ///    }
-              ///    class Class = Super with Mixin;
-              interfaceMembers.add(extendedMember.interfaceMember);
-            }
-
-            interfaceMembers.add(mixedInMember);
-
-            if (implementedMembers != null) {
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Mixin {
-              ///      method();
-              ///    }
-              ///    class Class = Object with Mixin implements Interface;
-              interfaceMembers.addAll(implementedMembers);
-            }
-
-            /// We always create a synthesized interface member, even in the
-            /// case of [interfaceMembers] being a singleton, to insert the
-            /// abstract mixin stub.
-            interfaceMember = new SynthesizedInterfaceMember(
-                classBuilder, name, interfaceMembers.toList(),
-                superClassMember: extendedMember,
-                // [definingMember] and [mixedInMember] are always the same
-                // here. Use the latter here and the former below to show the
-                // the member is canonical _because_ its the mixed in member and
-                // it defines the isProperty/forSetter properties _because_ it
-                // is the defining member.
-                canonicalMember: mixedInMember,
-                mixedInMember: mixedInMember,
-                isProperty: definingMember.isProperty,
-                forSetter: definingMember.forSetter,
-                shouldModifyKernel: shouldModifyKernel);
-            hierarchy.registerMemberComputation(interfaceMember);
-
-            if (extendedMember != null) {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Mixin {
-              ///      method();
-              ///    }
-              ///    class Class = Super with Mixin;
-              ///
-              /// The concrete extended member is the class member but might
-              /// be overwritten by a concrete forwarding stub:
-              ///
-              ///    class Super {
-              ///      method(int i) {}
-              ///    }
-              ///    class Interface {
-              ///      method(covariant int i) {}
-              ///    }
-              ///    class Mixin {
-              ///      method(int i);
-              ///    }
-              ///    // A concrete forwarding stub
-              ///    //   method(covariant int i) => super.method(i);
-              ///    // will be inserted.
-              ///    class Class = Super with Mixin implements Interface;
-              ///
-              classMember = new InheritedClassMemberImplementsInterface(
-                  classBuilder, name,
-                  inheritedClassMember: extendedMember,
-                  implementedInterfaceMember: interfaceMember,
-                  forSetter: definingMember.forSetter,
-                  isProperty: definingMember.isProperty);
-              hierarchy.registerMemberComputation(classMember);
-              if (!classBuilder.isAbstract) {
-                registerInheritedImplements(extendedMember, {interfaceMember},
-                    aliasForTesting: classMember);
-              }
-            } else if (!classBuilder.isAbstract) {
-              ///    class Mixin {
-              ///      method(); // Missing implementation.
-              ///    }
-              ///    class Class = Object with Mixin;
-              registerAbstractMember(interfaceMember);
-            }
-
-            assert(!mixedInMember.isSynthesized);
-            if (!mixedInMember.isSynthesized) {
-              /// Members declared in the mixin must override extended and
-              /// implemented members.
-              ///
-              /// When loading from .dill the mixed in member might be
-              /// synthesized, for instance a member signature or forwarding
-              /// stub, and this should not be checked to override the extended
-              /// and implemented members:
-              ///
-              ///    // Opt-out library, from source:
-              ///    class Mixin {}
-              ///    // Opt-out library, from .dill:
-              ///    class Mixin {
-              ///      ...
-              ///      String* toString(); // member signature
-              ///    }
-              ///    // Opt-out library, from source:
-              ///    class Class = Object with Mixin;
-              ///    // Mixin.toString should not be checked to override
-              ///    // Object.toString.
-              ///
-              registerMixedInOverride(mixedInMember,
-                  aliasForTesting: interfaceMember);
-            }
-          } else {
-            assert(!mixedInMember.isAbstract);
-
-            ///    class Mixin {
-            ///      method() {}
-            ///    }
-            ///    class Class = Object with Mixin;
-            ///
-
-            /// Interface members from the extended, mixed in, and implemented
-            /// members define the combined member signature.
-            Set<ClassMember> interfaceMembers = {};
-
-            if (extendedMember != null) {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Mixin {
-              ///      method() {}
-              ///    }
-              ///    class Class = Super with Mixin;
-              interfaceMembers.add(extendedMember.interfaceMember);
-            }
-
-            interfaceMembers.add(mixedInMember);
-
-            if (implementedMembers != null) {
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Mixin {
-              ///      method() {}
-              ///    }
-              ///    class Class = Object with Mixin implements Interface;
-              interfaceMembers.addAll(implementedMembers);
-            }
-
-            /// We always create a synthesized interface member, even in the
-            /// case of [interfaceMembers] being a singleton, to insert the
-            /// concrete mixin stub.
-            interfaceMember = new SynthesizedInterfaceMember(
-                classBuilder, name, interfaceMembers.toList(),
-                superClassMember: mixedInMember,
-                // [definingMember] and [mixedInMember] are always the same
-                // here. Use the latter here and the former below to show the
-                // the member is canonical _because_ its the mixed in member and
-                // it defines the isProperty/forSetter properties _because_ it
-                // is the defining member.
-                canonicalMember: mixedInMember,
-                mixedInMember: mixedInMember,
-                isProperty: definingMember.isProperty,
-                forSetter: definingMember.forSetter,
-                shouldModifyKernel: shouldModifyKernel);
-            hierarchy.registerMemberComputation(interfaceMember);
-
-            /// The concrete mixed in member is the class member but will
-            /// be overwritten by a concrete mixin stub:
-            ///
-            ///    class Mixin {
-            ///       method() {}
-            ///    }
-            ///    // A concrete mixin stub
-            ///    //   method() => super.method();
-            ///    // will be inserted.
-            ///    class Class = Object with Mixin;
-            ///
-            classMember = new InheritedClassMemberImplementsInterface(
-                classBuilder, name,
-                inheritedClassMember: mixedInMember,
-                implementedInterfaceMember: interfaceMember,
-                forSetter: definingMember.forSetter,
-                isProperty: definingMember.isProperty);
-            hierarchy.registerMemberComputation(classMember);
-
-            if (!classBuilder.isAbstract) {
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Mixin {
-              ///      method() {}
-              ///    }
-              ///    class Class = Object with Mixin;
-              ///
-              /// [mixinMember] must implemented interface member.
-              registerInheritedImplements(mixedInMember, {interfaceMember},
-                  aliasForTesting: classMember);
-            }
-            assert(!mixedInMember.isSynthesized);
-            if (!mixedInMember.isSynthesized) {
-              /// Members declared in the mixin must override extended and
-              /// implemented members.
-              ///
-              /// When loading from .dill the mixed in member might be
-              /// synthesized, for instance a member signature or forwarding
-              /// stub, and this should not be checked to override the extended
-              /// and implemented members.
-              ///
-              /// These synthesized mixed in members should always be abstract
-              /// and therefore not be handled here, but we handled them here
-              /// for consistency.
-              registerMixedInOverride(mixedInMember);
-            }
-          }
-        } else if (declaredMember != null) {
-          if (declaredMember.isAbstract) {
-            ///    class Class {
-            ///      method();
-            ///    }
-            interfaceMember = declaredMember;
-
-            /// Interface members from the declared, extended, and implemented
-            /// members define the combined member signature.
-            Set<ClassMember> interfaceMembers = {};
-
-            if (extendedMember != null) {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Class extends Super {
-              ///      method();
-              ///    }
-              interfaceMembers.add(extendedMember);
-            }
-
-            interfaceMembers.add(declaredMember);
-
-            if (implementedMembers != null) {
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Class implements Interface {
-              ///      method();
-              ///    }
-              interfaceMembers.addAll(implementedMembers);
-            }
-
-            /// If only one member defines the interface member there is no
-            /// need for a synthesized interface member, since its result will
-            /// simply be that one member.
-            if (interfaceMembers.length > 1) {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Class extends Super implements Interface {
-              ///      method();
-              ///    }
-              interfaceMember = new SynthesizedInterfaceMember(
-                  classBuilder, name, interfaceMembers.toList(),
-                  superClassMember: extendedMember,
-                  // [definingMember] and [declaredMember] are always the same
-                  // here. Use the latter here and the former below to show the
-                  // the member is canonical _because_ its the declared member
-                  // and it defines the isProperty/forSetter properties
-                  // _because_ it is the defining member.
-                  canonicalMember: declaredMember,
-                  isProperty: definingMember.isProperty,
-                  forSetter: definingMember.forSetter,
-                  shouldModifyKernel: shouldModifyKernel);
-              hierarchy.registerMemberComputation(interfaceMember);
-            }
-
-            if (extendedMember != null) {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Class extends Super {
-              ///      method();
-              ///    }
-              ///
-              /// The concrete extended member is the class member but might
-              /// be overwritten by a concrete forwarding stub:
-              ///
-              ///    class Super {
-              ///      method(int i) {}
-              ///    }
-              ///    class Interface {
-              ///      method(covariant int i) {}
-              ///    }
-              ///    class Class extends Super implements Interface {
-              ///      // This will be turned into the concrete forwarding stub
-              ///      //    method(covariant int i) => super.method(i);
-              ///      method(int i);
-              ///    }
-              ///
-              classMember = new InheritedClassMemberImplementsInterface(
-                  classBuilder, name,
-                  inheritedClassMember: extendedMember,
-                  implementedInterfaceMember: interfaceMember,
-                  forSetter: definingMember.forSetter,
-                  isProperty: definingMember.isProperty);
-              hierarchy.registerMemberComputation(classMember);
-
-              if (!classBuilder.isAbstract) {
-                ///    class Super {
-                ///      method() {}
-                ///    }
-                ///    class Class extends Super {
-                ///      method();
-                ///    }
-                ///
-                /// [extendedMember] must implemented interface member.
-                registerInheritedImplements(extendedMember, {interfaceMember},
-                    aliasForTesting: classMember);
-              }
-            } else if (!classBuilder.isAbstract) {
-              ///    class Class {
-              ///      method(); // Missing implementation.
-              ///    }
-              registerAbstractMember(declaredMember);
-            }
-
-            /// The declared member must override extended and implemented
-            /// members.
-            registerDeclaredOverride(declaredMember,
-                aliasForTesting: interfaceMember);
-          } else {
-            assert(!declaredMember.isAbstract);
-
-            ///    class Class {
-            ///      method() {}
-            ///    }
-            classMember = declaredMember;
-
-            /// The declared member must override extended and implemented
-            /// members.
-            registerDeclaredOverride(declaredMember);
-          }
-        } else if (extendedMember != null) {
-          ///    class Super {
-          ///      method() {}
-          ///    }
-          ///    class Class extends Super {}
-          assert(!extendedMember.isAbstract,
-              "Abstract extended member: ${extendedMember}");
-
-          classMember = extendedMember;
-
-          if (implementedMembers != null) {
-            ///    class Super {
-            ///      method() {}
-            ///    }
-            ///    class Interface {
-            ///      method() {}
-            ///    }
-            ///    class Class extends Super implements Interface {}
-            ClassMember extendedInterfaceMember =
-                extendedMember.interfaceMember;
-
-            /// Interface members from the extended and implemented
-            /// members define the combined member signature.
-            Set<ClassMember> interfaceMembers = {extendedInterfaceMember};
-
-            // TODO(johnniwinther): The extended member might be included in
-            // a synthesized implemented member. For instance:
-            //
-            //    class Super {
-            //      void method() {}
-            //    }
-            //    class Interface {
-            //      void method() {}
-            //    }
-            //    abstract class Class extends Super implements Interface {
-            //      // Synthesized interface member of
-            //      //   {Super.method, Interface.method}
-            //    }
-            //    class Sub extends Class {
-            //      // Super.method implements Class.method =
-            //      //   {Super.method, Interface.method}
-            //      // Synthesized interface member of
-            //      //   {Super.method, Class.method}
-            //    }
-            //
-            // Maybe we should recognize this.
-            interfaceMembers.addAll(implementedMembers);
-
-            /// Normally, if only one member defines the interface member there
-            /// is no need for a synthesized interface member, since its result
-            /// will simply be that one member, but if the extended member is
-            /// from an opt-in library and the current class is from an opt-out
-            /// library we need to create a member signature:
-            ///
-            ///    // Opt-in:
-            ///    class Super {
-            ///      int? method() => null;
-            ///    }
-            ///    class Interface implements Super {}
-            ///    // Opt-out:
-            ///    class Class extends Super implements Interface {
-            ///      // Member signature added:
-            ///      int* method();
-            ///    }
-            ///
-            if (interfaceMembers.length == 1 &&
-                !needsMemberSignatureFor(extendedInterfaceMember)) {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Interface implements Super {}
-              ///    class Class extends Super implements Interface {}
-              interfaceMember = interfaceMembers.first;
-            } else {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Class extends Super implements Interface {}
-              interfaceMember = new SynthesizedInterfaceMember(
-                  classBuilder, name, interfaceMembers.toList(),
-                  superClassMember: extendedMember,
-                  isProperty: definingMember.isProperty,
-                  forSetter: definingMember.forSetter,
-                  shouldModifyKernel: shouldModifyKernel);
-              hierarchy.registerMemberComputation(interfaceMember);
-            }
-            if (interfaceMember == classMember) {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Interface implements Super {}
-              ///    class Class extends Super implements Interface {}
-              ///
-              /// We keep track of whether a class needs interfaces, that is,
-              /// whether is has any members that have an interface member
-              /// different from its corresponding class member, so we set
-              /// [interfaceMember] to `null` so show that the interface member
-              /// is not needed.
-              interfaceMember = null;
-            } else {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Class extends Super implements Interface {}
-              ///
-              /// The concrete extended member is the class member but might
-              /// be overwritten by a concrete forwarding stub:
-              ///
-              ///    class Super {
-              ///      method(int i) {}
-              ///    }
-              ///    class Interface {
-              ///      method(covariant int i) {}
-              ///    }
-              ///    class Class extends Super implements Interface {
-              ///      // A concrete forwarding stub will be created:
-              ///      //    method(covariant int i) => super.method(i);
-              ///    }
-              ///
-              classMember = new InheritedClassMemberImplementsInterface(
-                  classBuilder, name,
-                  inheritedClassMember: extendedMember,
-                  implementedInterfaceMember: interfaceMember,
-                  isProperty: definingMember.isProperty,
-                  forSetter: definingMember.forSetter);
-              hierarchy.registerMemberComputation(classMember);
-              if (!classBuilder.isAbstract) {
-                ///    class Super {
-                ///      method() {}
-                ///    }
-                ///    class Interface {
-                ///      method() {}
-                ///    }
-                ///    class Class extends Super implements Interface {}
-                registerInheritedImplements(extendedMember, {interfaceMember},
-                    aliasForTesting: classMember);
-              }
-            }
-          } else if (needsMemberSignatureFor(extendedMember)) {
-            ///    // Opt-in library:
-            ///    class Super {
-            ///      method() {}
-            ///    }
-            ///    // opt-out library:
-            ///    class Class extends Super {}
-            interfaceMember = new SynthesizedInterfaceMember(
-                classBuilder, name, [extendedMember],
-                superClassMember: extendedMember,
-                isProperty: definingMember.isProperty,
-                forSetter: definingMember.forSetter,
-                shouldModifyKernel: shouldModifyKernel);
-            hierarchy.registerMemberComputation(interfaceMember);
-
-            /// The concrete extended member is the class member and should
-            /// be able to be overwritten by a synthesized concrete member here,
-            /// but we handle the case for consistency.
-            classMember = new InheritedClassMemberImplementsInterface(
-                classBuilder, name,
-                inheritedClassMember: extendedMember,
-                implementedInterfaceMember: interfaceMember,
-                isProperty: definingMember.isProperty,
-                forSetter: definingMember.forSetter);
-            hierarchy.registerMemberComputation(classMember);
-          }
-        } else if (implementedMembers != null) {
-          ///    class Interface {
-          ///      method() {}
-          ///    }
-          ///    class Class implements Interface {}
-          Set<ClassMember> interfaceMembers = implementedMembers.toSet();
-          if (interfaceMembers.isNotEmpty) {
-            /// Normally, if only one member defines the interface member there
-            /// is no need for a synthesized interface member, since its result
-            /// will simply be that one member, but if the implemented member is
-            /// from an opt-in library and the current class is from an opt-out
-            /// library we need to create a member signature:
-            ///
-            ///    // Opt-in:
-            ///    class Interface {
-            ///      int? method() => null;
-            ///    }
-            ///    // Opt-out:
-            ///    class Class implements Interface {
-            ///      // Member signature added:
-            ///      int* method();
-            ///    }
-            ///
-            if (interfaceMembers.length == 1 &&
-                !needsMemberSignatureFor(interfaceMembers.first)) {
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Class implements Interface {}
-              interfaceMember = interfaceMembers.first;
-            } else {
-              ///    class Interface1 {
-              ///      method() {}
-              ///    }
-              ///    class Interface2 {
-              ///      method() {}
-              ///    }
-              ///    class Class implements Interface1, Interface2 {}
-              interfaceMember = new SynthesizedInterfaceMember(
-                  classBuilder, name, interfaceMembers.toList(),
-                  isProperty: definingMember.isProperty,
-                  forSetter: definingMember.forSetter,
-                  shouldModifyKernel: shouldModifyKernel);
-              hierarchy.registerMemberComputation(interfaceMember);
-            }
-            if (!classBuilder.isAbstract) {
-              ///    class Interface {
-              ///      method() {}
-              ///    }
-              ///    class Class implements Interface {}
-              for (ClassMember abstractMember in interfaceMembers) {
-                registerAbstractMember(abstractMember);
-              }
-            }
-          }
-        }
-
-        if (interfaceMember != null) {
-          // We have an explicit interface.
-          hasInterfaces = true;
-        }
-        if (classMember != null) {
-          if (name == noSuchMethodName &&
-              !classMember.isObjectMember(objectClass)) {
-            hasNoSuchMethod = true;
-          }
-          classMemberMap[name] = classMember;
-          interfaceMember ??= classMember.interfaceMember;
-        }
-        if (interfaceMember != null) {
-          interfaceMemberMap![name] = interfaceMember;
-        }
-        return interfaceMember;
-      }
-
-      ClassMember? interfaceGetable;
-      if (definingGetable != null) {
-        interfaceGetable = computeMembers(
-            definingMember: definingGetable,
-            declaredMember: declaredGetable,
-            mixedInMember: mixedInGetable,
-            extendedMember: extendedGetable,
-            implementedMembers: implementedGetables,
-            classMemberMap: classMemberMap,
-            interfaceMemberMap: interfaceMemberMap);
-      }
-      ClassMember? interfaceSetable;
-      if (definingSetable != null) {
-        interfaceSetable = computeMembers(
-            definingMember: definingSetable,
-            declaredMember: declaredSetable,
-            mixedInMember: mixedInSetable,
-            extendedMember: extendedSetable,
-            implementedMembers: implementedSetables,
-            classMemberMap: classSetterMap,
-            interfaceMemberMap: interfaceSetterMap);
-      }
-      if (classBuilder is SourceClassBuilder) {
-        if (interfaceGetable != null &&
-            interfaceSetable != null &&
-            interfaceGetable.isProperty &&
-            interfaceSetable.isProperty &&
-            interfaceGetable.isStatic == interfaceSetable.isStatic &&
-            !interfaceGetable.isSameDeclaration(interfaceSetable)) {
-          /// We need to check that the getter type is a subtype of the setter
-          /// type. For instance
-          ///
-          ///    class Super {
-          ///       int get property1 => null;
-          ///       num get property2 => null;
-          ///    }
-          ///    class Mixin {
-          ///       void set property1(num value) {}
-          ///       void set property2(int value) {}
-          ///    }
-          ///    class Class = Super with Mixin;
-          ///
-          /// Here `Super.property1` and `Mixin.property1` form a valid getter/
-          /// setter pair in `Class` because the type of the getter
-          /// `Super.property1` is a subtype of the setter `Mixin.property1`.
-          ///
-          /// In contrast the pair `Super.property2` and `Mixin.property2` is
-          /// not a valid getter/setter in `Class` because the type of the getter
-          /// `Super.property2` is _not_ a subtype of the setter
-          /// `Mixin.property1`.
-          hierarchy.registerGetterSetterCheck(
-              classBuilder as SourceClassBuilder,
-              interfaceGetable,
-              interfaceSetable);
-        }
-      }
-      if (hasDeclaredMembers) {
-        Set<ClassMember> getableOverrides = {};
-        Set<ClassMember> setableOverrides = {};
-        if (extendedGetable != null) {
-          ///    (abstract) class Super {
-          ///      method() {}
-          ///      int get property => 0;
-          ///    }
-          ///    (abstract) class Class extends Super {
-          ///      method() {}
-          ///      set property(int value) {}
-          ///    }
-          getableOverrides.add(extendedGetable.interfaceMember);
-        }
-        if (extendedSetable != null) {
-          ///    (abstract) class Super {
-          ///      set setter(int value) {}
-          ///      set property(int value) {}
-          ///    }
-          ///    (abstract) class Class extends Super {
-          ///      set setter(int value) {}
-          ///      int get property => 0;
-          ///    }
-          setableOverrides.add(extendedSetable.interfaceMember);
-        }
-        if (implementedGetables != null) {
-          ///    (abstract) class Interface {
-          ///      method() {}
-          ///      int get property => 0;
-          ///    }
-          ///    (abstract) class Class implements Interface {
-          ///      method() {}
-          ///      set property(int value) {}
-          ///    }
-          getableOverrides.addAll(implementedGetables);
-        }
-        if (implementedSetables != null) {
-          ///    (abstract) class Interface {
-          ///      set setter(int value) {}
-          ///      set property(int value) {}
-          ///    }
-          ///    (abstract) class Class implements Interface {
-          ///      set setter(int value) {}
-          ///      int get property => 0;
-          ///    }
-          setableOverrides.addAll(implementedSetables);
-        }
-        if (getableOverrides.isNotEmpty || setableOverrides.isNotEmpty) {
-          if (declaredMethod != null && getableOverrides.isNotEmpty) {
-            ///    class Super {
-            ///      method() {}
-            ///    }
-            ///    class Class extends Super {
-            ///      method() {}
-            ///    }
-            declaredOverridesMap[declaredMethod!] = getableOverrides;
-          }
-          if (declaredProperties != null) {
-            Set<ClassMember> overrides;
-            if (declaredMethod != null) {
-              ///    class Super {
-              ///      set setter() {}
-              ///    }
-              ///    class Class extends Super {
-              ///      method() {}
-              ///    }
-              overrides = setableOverrides;
-            } else {
-              ///    class Super {
-              ///      get property => null
-              ///      void set property(value) {}
-              ///    }
-              ///    class Class extends Super {
-              ///      get property => null
-              ///      void set property(value) {}
-              ///    }
-              overrides = {...getableOverrides, ...setableOverrides};
-            }
-            if (overrides.isNotEmpty) {
-              for (ClassMember declaredMember in declaredProperties!) {
-                declaredOverridesMap[declaredMember] = overrides;
-              }
-            }
-          }
-          if (mixedInMethod != null && getableOverrides.isNotEmpty) {
-            ///    class Super {
-            ///      method() {}
-            ///    }
-            ///    class Mixin {
-            ///      method() {}
-            ///    }
-            ///    class Class = Super with Mixin;
-            mixinApplicationOverridesMap[mixedInMethod!] = getableOverrides;
-          }
-          if (mixedInProperties != null) {
-            Set<ClassMember> overrides;
-            if (mixedInMethod != null) {
-              ///    class Super {
-              ///      set setter() {}
-              ///    }
-              ///    class Mixin {
-              ///      method() {}
-              ///    }
-              ///    class Class = Super with Mixin;
-              overrides = setableOverrides;
-            } else {
-              ///    class Super {
-              ///      method() {}
-              ///    }
-              ///    class Mixin extends Super {
-              ///      method() {}
-              ///    }
-              overrides = {...getableOverrides, ...setableOverrides};
-            }
-            if (overrides.isNotEmpty) {
-              for (ClassMember mixedInMember in mixedInProperties!) {
-                mixinApplicationOverridesMap[mixedInMember] = overrides;
-              }
-            }
-          }
-        }
-      }
-    });
-
-    if (classBuilder is SourceClassBuilder) {
-      // TODO(johnniwinther): Avoid duplicate override check computations
-      //  between [declaredOverridesMap], [mixinApplicationOverridesMap] and
-      //  [inheritedImplementsMap].
-
-      // TODO(johnniwinther): Ensure that a class member is only checked to
-      // validly override another member once. Currently it can happen multiple
-      // times as an inherited implementation.
-
-      declaredOverridesMap.forEach(
-          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
-        /// A declared member can inherit its type from the overridden members.
-        ///
-        /// We register this with the class member itself so the it can force
-        /// computation of type on the overridden members before determining its
-        /// own type.
-        ///
-        /// Member types can be queried at arbitrary points during top level
-        /// inference so we need to ensure that types are computed in dependency
-        /// order.
-        classMember.registerOverrideDependency(overriddenMembers);
-
-        /// Not all member type are queried during top level inference so we
-        /// register delayed computation to ensure that all types have been
-        /// computed before override checks are performed.
-        DelayedTypeComputation computation =
-            new DelayedTypeComputation(this, classMember, overriddenMembers);
-        hierarchy.registerDelayedTypeComputation(computation);
-
-        /// Declared members must be checked to validly override the
-        /// overridden members.
-        hierarchy.registerOverrideCheck(
-            classBuilder as SourceClassBuilder, classMember, overriddenMembers);
-      });
-
-      mixinApplicationOverridesMap.forEach(
-          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
-        /// Declared mixed in members must be checked to validly override the
-        /// overridden members.
-        hierarchy.registerOverrideCheck(
-            classBuilder as SourceClassBuilder, classMember, overriddenMembers);
-      });
-
-      inheritedImplementsMap.forEach(
-          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
-        /// Concrete members must be checked to validly override the overridden
-        /// members in concrete classes.
-        hierarchy.registerOverrideCheck(
-            classBuilder as SourceClassBuilder, classMember, overriddenMembers);
-      });
-    }
-
-    if (!hasInterfaces) {
-      /// All interface members also class members to we don't need to store
-      /// the interface members separately.
-      assert(
-          classMemberMap.length == interfaceMemberMap.length,
-          "Class/interface member mismatch. Class members: "
-          "$classMemberMap, interface members: $interfaceMemberMap.");
-      assert(
-          classSetterMap.length == interfaceSetterMap.length,
-          "Class/interface setter mismatch. Class setters: "
-          "$classSetterMap, interface setters: $interfaceSetterMap.");
-      assert(
-          classMemberMap.keys.every((Name name) =>
-              identical(classMemberMap[name], interfaceMemberMap?[name])),
-          "Class/interface member mismatch. Class members: "
-          "$classMemberMap, interface members: $interfaceMemberMap.");
-      assert(
-          classSetterMap.keys.every((Name name) =>
-              identical(classSetterMap[name], interfaceSetterMap?[name])),
-          "Class/interface setter mismatch. Class setters: "
-          "$classSetterMap, interface setters: $interfaceSetterMap.");
-      interfaceMemberMap = null;
-      interfaceSetterMap = null;
-    }
-
-    // ignore: unnecessary_null_comparison
-    if (abstractMembers != null && !classBuilder.isAbstract) {
-      if (!hasNoSuchMethod) {
-        reportMissingMembers(abstractMembers);
-      } else {
-        installNsmHandlers();
-      }
-    }
-
-    return new ClassHierarchyNode(
-        classBuilder,
-        classMemberMap,
-        classSetterMap,
-        interfaceMemberMap,
-        interfaceSetterMap,
-        superclasses,
-        interfaces,
-        maxInheritancePath,
-        hasNoSuchMethod,
-        dataForTesting);
-  }
-
-  Supertype recordSupertype(Supertype supertype) {
-    debug?.log("In ${this.classBuilder.fullNameForErrors} "
-        "recordSupertype(${supertype})");
-    Class cls = supertype.classNode;
-    List<TypeParameter> supertypeTypeParameters = cls.typeParameters;
-    if (supertypeTypeParameters.isEmpty) {
-      substitutions[cls] = Substitution.empty;
-    } else {
-      List<DartType> arguments = supertype.typeArguments;
-      List<DartType> typeArguments =
-          new List<DartType>.filled(arguments.length, dummyDartType);
-      List<TypeParameter> typeParameters =
-          new List<TypeParameter>.filled(arguments.length, dummyTypeParameter);
-      for (int i = 0; i < arguments.length; i++) {
-        typeParameters[i] = supertypeTypeParameters[i];
-        typeArguments[i] = arguments[i];
-      }
-      substitutions[cls] =
-          Substitution.fromPairs(typeParameters, typeArguments);
-    }
-    return supertype;
-  }
-
-  List<Supertype> substSupertypes(
-      Supertype supertype, List<Supertype> supertypes) {
-    List<TypeParameter> typeVariables = supertype.classNode.typeParameters;
-    if (typeVariables.isEmpty) {
-      debug?.log("In ${this.classBuilder.fullNameForErrors} "
-          "$supertypes aren't substed");
-      return supertypes;
-    }
-    Map<TypeParameter, DartType> map = <TypeParameter, DartType>{};
-    List<DartType> arguments = supertype.typeArguments;
-    for (int i = 0; i < typeVariables.length; i++) {
-      map[typeVariables[i]] = arguments[i];
-    }
-    Substitution substitution = Substitution.fromMap(map);
-    List<Supertype>? result;
-    for (int i = 0; i < supertypes.length; i++) {
-      Supertype supertype = supertypes[i];
-      Supertype substituted = substitution.substituteSupertype(supertype);
-      if (supertype != substituted) {
-        debug?.log("In ${this.classBuilder.fullNameForErrors} $supertype"
-            " -> $substituted");
-        result ??= supertypes.toList();
-        result[i] = substituted;
-      } else {
-        debug?.log("In ${this.classBuilder.fullNameForErrors} "
-            "$supertype isn't substed");
-      }
-    }
-    return result ?? supertypes;
-  }
-
-  void addInterface(List<Supertype> interfaces, List<Supertype> superclasses,
-      Supertype type) {
-    // ignore: unnecessary_null_comparison
-    if (type == null) return null;
-    if (!classBuilder.library.isNonNullableByDefault) {
-      type = legacyErasureSupertype(type);
-    }
-    ClassHierarchyNode node = hierarchy.getNodeFromClass(type.classNode);
-    // ignore: unnecessary_null_comparison
-    if (node == null) return null;
-    int depth = node.depth;
-    int myDepth = superclasses.length;
-    Supertype? superclass = depth < myDepth ? superclasses[depth] : null;
-    if (superclass != null && superclass.classNode == type.classNode) {
-      // This is a potential conflict.
-      if (classBuilder.library.isNonNullableByDefault) {
-        superclass = nnbdTopMergeSupertype(
-            hierarchy.coreTypes,
-            normSupertype(hierarchy.coreTypes, superclass),
-            normSupertype(hierarchy.coreTypes, type));
-        if (superclass == null) {
-          // This is a conflict.
-          // TODO(johnniwinther): Report errors here instead of through
-          // the computation of the [ClassHierarchy].
-          superclass = superclasses[depth];
-        } else {
-          superclasses[depth] = superclass;
-        }
-      }
-      return;
-    } else {
-      for (int i = 0; i < interfaces.length; i++) {
-        // This is a quadratic algorithm, but normally, the number of
-        // interfaces is really small.
-        Supertype? interface = interfaces[i];
-        if (interface.classNode == type.classNode) {
-          // This is a potential conflict.
-          if (classBuilder.library.isNonNullableByDefault) {
-            interface = nnbdTopMergeSupertype(
-                hierarchy.coreTypes,
-                normSupertype(hierarchy.coreTypes, interface),
-                normSupertype(hierarchy.coreTypes, type));
-            if (interface == null) {
-              // This is a conflict.
-              // TODO(johnniwinther): Report errors here instead of through
-              // the computation of the [ClassHierarchy].
-              interface = interfaces[i];
-            } else {
-              interfaces[i] = interface;
-            }
-          }
-          return;
-        }
-      }
-    }
-    interfaces.add(type);
-  }
-
-  void reportMissingMembers(List<ClassMember> abstractMembers) {
-    Map<String, LocatedMessage> contextMap = <String, LocatedMessage>{};
-    for (ClassMember declaration in unfoldDeclarations(abstractMembers)) {
-      if (isNameVisibleIn(declaration.name, classBuilder.library)) {
-        String name = declaration.fullNameForErrors;
-        String className = declaration.classBuilder.fullNameForErrors;
-        String displayName =
-            declaration.isSetter ? "$className.$name=" : "$className.$name";
-        contextMap[displayName] = templateMissingImplementationCause
-            .withArguments(displayName)
-            .withLocation(
-                declaration.fileUri, declaration.charOffset, name.length);
-      }
-    }
-    if (contextMap.isEmpty) return;
-    List<String> names = new List<String>.from(contextMap.keys)..sort();
-    List<LocatedMessage> context = <LocatedMessage>[];
-    for (int i = 0; i < names.length; i++) {
-      context.add(contextMap[names[i]]!);
-    }
-    classBuilder.addProblem(
-        templateMissingImplementationNotAbstract.withArguments(
-            classBuilder.fullNameForErrors, names),
-        classBuilder.charOffset,
-        classBuilder.fullNameForErrors.length,
-        context: context);
-  }
-
-  void installNsmHandlers() {
-    // TODO(ahe): Implement this.
-  }
-
-  void inferMixinApplication() {
-    Class cls = classBuilder.cls;
-    Supertype? mixedInType = cls.mixedInType;
-    if (mixedInType == null) return;
-    List<DartType> typeArguments = mixedInType.typeArguments;
-    if (typeArguments.isEmpty || typeArguments.first is! UnknownType) return;
-    new BuilderMixinInferrer(
-            classBuilder,
-            hierarchy.coreTypes,
-            new TypeBuilderConstraintGatherer(hierarchy,
-                mixedInType.classNode.typeParameters, cls.enclosingLibrary))
-        .infer(cls);
-    List<TypeBuilder> inferredArguments = new List<TypeBuilder>.generate(
-        typeArguments.length,
-        (int i) => hierarchy.loader.computeTypeBuilder(typeArguments[i]),
-        growable: false);
-    NamedTypeBuilder mixedInTypeBuilder =
-        classBuilder.mixedInTypeBuilder as NamedTypeBuilder;
-    mixedInTypeBuilder.arguments = inferredArguments;
-  }
-
-  /// The class Function from dart:core is supposed to be ignored when used as
-  /// an interface.
-  List<TypeBuilder>? ignoreFunction(List<TypeBuilder>? interfaces) {
-    if (interfaces == null) return null;
-    for (int i = 0; i < interfaces!.length; i++) {
-      ClassBuilder? classBuilder = getClass(interfaces[i]);
-      if (classBuilder != null && classBuilder.cls == hierarchy.functionClass) {
-        if (interfaces.length == 1) {
-          return null;
-        } else {
-          interfaces = interfaces.toList();
-          interfaces.removeAt(i);
-          return ignoreFunction(interfaces);
-        }
-      }
-    }
-    return interfaces;
-  }
-}
-
-class ClassHierarchyNode {
-  /// The class corresponding to this hierarchy node.
-  final ClassBuilder classBuilder;
-
-  /// All the members of this class including [classMembers] of its
-  /// superclasses. The members are sorted by [compareDeclarations].
-  final Map<Name, ClassMember> classMemberMap;
-
-  /// Similar to [classMembers] but for setters.
-  final Map<Name, ClassMember> classSetterMap;
-
-  /// All the interface members of this class including [interfaceMembers] of
-  /// its supertypes. The members are sorted by [compareDeclarations].
-  ///
-  /// In addition to the members of [classMembers] this also contains members
-  /// from interfaces.
-  ///
-  /// This may be null, in which case [classMembers] is the interface members.
-  final Map<Name, ClassMember>? interfaceMemberMap;
-
-  /// Similar to [interfaceMembers] but for setters.
-  ///
-  /// This may be null, in which case [classSetters] is the interface setters.
-  final Map<Name, ClassMember>? interfaceSetterMap;
-
-  /// All superclasses of [classBuilder] excluding itself. The classes are
-  /// sorted by depth from the root (Object) in ascending order.
-  final List<Supertype> superclasses;
-
-  /// The list of all classes implemented by [classBuilder] and its supertypes
-  /// excluding any classes from [superclasses].
-  final List<Supertype> interfaces;
-
-  /// The longest inheritance path from [classBuilder] to `Object`.
-  final int maxInheritancePath;
-
-  int get depth => superclasses.length;
-
-  final bool hasNoSuchMethod;
-
-  final ClassHierarchyNodeDataForTesting? dataForTesting;
-
-  ClassHierarchyNode(
-      this.classBuilder,
-      this.classMemberMap,
-      this.classSetterMap,
-      this.interfaceMemberMap,
-      this.interfaceSetterMap,
-      this.superclasses,
-      this.interfaces,
-      this.maxInheritancePath,
-      this.hasNoSuchMethod,
-      this.dataForTesting);
-
-  /// Returns a list of all supertypes of [classBuilder], including this node.
-  List<ClassHierarchyNode> computeAllSuperNodes(
-      ClassHierarchyBuilder hierarchy) {
-    List<ClassHierarchyNode> result = [];
-    for (int i = 0; i < superclasses.length; i++) {
-      Supertype type = superclasses[i];
-      result.add(hierarchy.getNodeFromClass(type.classNode));
-    }
-    for (int i = 0; i < interfaces.length; i++) {
-      Supertype type = interfaces[i];
-      result.add(hierarchy.getNodeFromClass(type.classNode));
-    }
-    result.add(this);
-    return result;
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb
-      ..write(classBuilder.fullNameForErrors)
-      ..writeln(":");
-    if (maxInheritancePath != this.depth) {
-      sb
-        ..write("  Longest path to Object: ")
-        ..writeln(maxInheritancePath);
-    }
-    sb..writeln("  superclasses:");
-    int depth = 0;
-    for (Supertype superclass in superclasses) {
-      sb.write("  " * (depth + 2));
-      if (depth != 0) sb.write("-> ");
-      sb.write(typeToText(superclass.asInterfaceType));
-      sb.writeln();
-      depth++;
-    }
-    // ignore: unnecessary_null_comparison
-    if (interfaces != null) {
-      sb.write("  interfaces:");
-      bool first = true;
-      for (Supertype i in interfaces) {
-        if (!first) sb.write(",");
-        sb.write(" ");
-        sb.write(typeToText(i.asInterfaceType));
-        first = false;
-      }
-      sb.writeln();
-    }
-    printMemberMap(classMemberMap, sb, "classMembers");
-    printMemberMap(classSetterMap, sb, "classSetters");
-    if (interfaceMemberMap != null) {
-      printMemberMap(interfaceMemberMap!, sb, "interfaceMembers");
-    }
-    if (interfaceSetterMap != null) {
-      printMemberMap(interfaceSetterMap!, sb, "interfaceSetters");
-    }
-    return "$sb";
-  }
-
-  void printMembers(
-      List<ClassMember> members, StringBuffer sb, String heading) {
-    sb.write("  ");
-    sb.write(heading);
-    sb.writeln(":");
-    for (ClassMember member in members) {
-      sb
-        ..write("    ")
-        ..write(member.classBuilder.fullNameForErrors)
-        ..write(".")
-        ..write(member.fullNameForErrors)
-        ..writeln();
-    }
-  }
-
-  void printMemberMap(
-      Map<Name, ClassMember> memberMap, StringBuffer sb, String heading) {
-    List<ClassMember> members = memberMap.values.toList();
-    members.sort(compareDeclarations);
-    printMembers(members, sb, heading);
-  }
-
-  ClassMember? getInterfaceMember(Name name, bool isSetter) {
-    return isSetter
-        ? (interfaceSetterMap ?? classSetterMap)[name]
-        : (interfaceMemberMap ?? classMemberMap)[name];
-  }
-
-  ClassMember? findMember(Name name, List<ClassMember> declarations) {
-    // TODO(ahe): Consider creating a map or scope. The obvious choice would be
-    // to use scopes, but they don't handle private names correctly.
-
-    // This is a copy of `ClassHierarchy.findMemberByName`.
-    int low = 0, high = declarations.length - 1;
-    while (low <= high) {
-      int mid = low + ((high - low) >> 1);
-      ClassMember pivot = declarations[mid];
-      int comparison = ClassHierarchy.compareNames(name, pivot.name);
-      if (comparison < 0) {
-        high = mid - 1;
-      } else if (comparison > 0) {
-        low = mid + 1;
-      } else if (high != mid) {
-        // Ensure we find the first element of the given name.
-        high = mid;
-      } else {
-        return pivot;
-      }
-    }
-    return null;
-  }
-
-  ClassMember? getDispatchTarget(Name name, bool isSetter) {
-    return isSetter ? classSetterMap[name] : classMemberMap[name];
-  }
-
-  static int compareMaxInheritancePath(
-      ClassHierarchyNode a, ClassHierarchyNode b) {
-    return b.maxInheritancePath.compareTo(a.maxInheritancePath);
-  }
-}
-
-class ClassHierarchyNodeDataForTesting {
-  final List<ClassMember> abstractMembers;
-  final Map<ClassMember, Set<ClassMember>> declaredOverrides;
-  final Map<ClassMember, Set<ClassMember>> mixinApplicationOverrides;
-  final Map<ClassMember, Set<ClassMember>> inheritedImplements;
-  final Map<ClassMember, ClassMember> aliasMap = {};
-
-  ClassHierarchyNodeDataForTesting(this.abstractMembers, this.declaredOverrides,
-      this.mixinApplicationOverrides, this.inheritedImplements);
-}
-
-List<LocatedMessage> _inheritedConflictContext(ClassMember a, ClassMember b) {
-  int length = a.fullNameForErrors.length;
-  // TODO(ahe): Delete this method when it isn't used by [InterfaceResolver].
-  int compare = "${a.fileUri}".compareTo("${b.fileUri}");
-  if (compare == 0) {
-    compare = a.charOffset.compareTo(b.charOffset);
-  }
-  ClassMember first;
-  ClassMember second;
-  if (compare < 0) {
-    first = a;
-    second = b;
-  } else {
-    first = b;
-    second = a;
-  }
-  return <LocatedMessage>[
-    messageInheritedMembersConflictCause1.withLocation(
-        first.fileUri, first.charOffset, length),
-    messageInheritedMembersConflictCause2.withLocation(
-        second.fileUri, second.charOffset, length),
-  ];
-}
-
-class BuilderMixinInferrer extends MixinInferrer {
-  final ClassBuilder cls;
-
-  BuilderMixinInferrer(
-      this.cls, CoreTypes coreTypes, TypeBuilderConstraintGatherer gatherer)
-      : super(coreTypes, gatherer);
-
-  @override
-  Supertype? asInstantiationOf(Supertype type, Class superclass) {
-    List<DartType>? arguments =
-        gatherer.getTypeArgumentsAsInstanceOf(type.asInterfaceType, superclass);
-    if (arguments == null) return null;
-    return new Supertype(superclass, arguments);
-  }
-
-  @override
-  void reportProblem(Message message, Class kernelClass) {
-    int length = cls.isMixinApplication ? 1 : cls.fullNameForErrors.length;
-    cls.addProblem(message, cls.charOffset, length);
-  }
-}
-
-class TypeBuilderConstraintGatherer extends TypeConstraintGatherer
-    with StandardBounds, TypeSchemaStandardBounds {
-  @override
-  final ClassHierarchyBuilder hierarchy;
-
-  TypeBuilderConstraintGatherer(this.hierarchy,
-      Iterable<TypeParameter> typeParameters, Library currentLibrary)
-      : super.subclassing(typeParameters, currentLibrary);
-
-  @override
-  CoreTypes get coreTypes => hierarchy.coreTypes;
-
-  @override
-  void addLowerBound(
-      TypeConstraint constraint, DartType lower, Library clientLibrary) {
-    constraint.lower =
-        getStandardUpperBound(constraint.lower, lower, clientLibrary);
-  }
-
-  @override
-  void addUpperBound(
-      TypeConstraint constraint, DartType upper, Library clientLibrary) {
-    constraint.upper =
-        getStandardLowerBound(constraint.upper, upper, clientLibrary);
-  }
-
-  @override
-  Member? getInterfaceMember(Class class_, Name name, {bool setter: false}) {
-    return null;
-  }
-
-  @override
-  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
-      Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getTypeAsInstanceOf(type, superclass, clientLibrary);
-  }
-
-  @override
-  List<DartType>? getTypeArgumentsAsInstanceOf(
-      InterfaceType type, Class superclass) {
-    return hierarchy.getTypeArgumentsAsInstanceOf(type, superclass);
-  }
-
-  @override
-  InterfaceType futureType(DartType type, Nullability nullability) {
-    return new InterfaceType(
-        hierarchy.futureClass, nullability, <DartType>[type]);
-  }
-
-  @override
-  bool isSubtypeOf(
-      DartType subtype, DartType supertype, SubtypeCheckMode mode) {
-    return hierarchy.types.isSubtypeOf(subtype, supertype, mode);
-  }
-
-  @override
-  bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
-    return isSubtypeOf(s, t, mode) && isSubtypeOf(t, s, mode);
-  }
-}
-
-abstract class DelayedCheck {
-  void check(ClassHierarchyBuilder hierarchy);
-}
-
-class DelayedOverrideCheck implements DelayedCheck {
-  final SourceClassBuilder _classBuilder;
-  final ClassMember _declaredMember;
-  final Set<ClassMember> _overriddenMembers;
-
-  DelayedOverrideCheck(
-      this._classBuilder, this._declaredMember, this._overriddenMembers);
-
-  @override
-  void check(ClassHierarchyBuilder hierarchy) {
-    Member declaredMember = _declaredMember.getMember(hierarchy);
-
-    /// If [_declaredMember] is a class member that is declared in an opt-in
-    /// library but inherited to [_classBuilder] through an opt-out class then
-    /// we need to apply legacy erasure to the declared type to get the
-    /// inherited type.
-    ///
-    /// For interface members this is handled by member signatures but since
-    /// these are abstract they will never be the inherited class member.
-    ///
-    /// For instance:
-    ///
-    ///    // Opt in:
-    ///    class Super {
-    ///      int extendedMethod(int i, {required int j}) => i;
-    ///    }
-    ///    class Mixin {
-    ///      int mixedInMethod(int i, {required int j}) => i;
-    ///    }
-    ///    // Opt out:
-    ///    class Legacy extends Super with Mixin {}
-    ///    // Opt in:
-    ///    class Class extends Legacy {
-    ///      // Valid overrides since the type of `Legacy.extendedMethod` is
-    ///      // `int* Function(int*, {int* j})`.
-    ///      int? extendedMethod(int? i, {int? j}) => i;
-    ///      // Valid overrides since the type of `Legacy.mixedInMethod` is
-    ///      // `int* Function(int*, {int* j})`.
-    ///      int? mixedInMethod(int? i, {int? j}) => i;
-    ///    }
-    ///
-    bool declaredNeedsLegacyErasure =
-        needsLegacyErasure(_classBuilder.cls, declaredMember.enclosingClass!);
-    void callback(Member interfaceMember, bool isSetter) {
-      _classBuilder.checkOverride(
-          hierarchy.types, declaredMember, interfaceMember, isSetter, callback,
-          isInterfaceCheck: !_classBuilder.isMixinApplication,
-          declaredNeedsLegacyErasure: declaredNeedsLegacyErasure);
-    }
-
-    for (ClassMember overriddenMember in _overriddenMembers) {
-      callback(overriddenMember.getMember(hierarchy), _declaredMember.isSetter);
-    }
-  }
-}
-
-class DelayedGetterSetterCheck implements DelayedCheck {
-  final SourceClassBuilder classBuilder;
-  final ClassMember getter;
-  final ClassMember setter;
-
-  const DelayedGetterSetterCheck(this.classBuilder, this.getter, this.setter);
-
-  @override
-  void check(ClassHierarchyBuilder hierarchy) {
-    classBuilder.checkGetterSetter(hierarchy.types, getter.getMember(hierarchy),
-        setter.getMember(hierarchy));
-  }
-}
-
-class DelayedTypeComputation {
-  final ClassHierarchyNodeBuilder builder;
-  final ClassMember declaredMember;
-  final Set<ClassMember> overriddenMembers;
-  bool _computed = false;
-
-  DelayedTypeComputation(
-      this.builder, this.declaredMember, this.overriddenMembers)
-      : assert(declaredMember.isSourceDeclaration);
-
-  void compute(ClassHierarchyBuilder hierarchy) {
-    if (_computed) return;
-    declaredMember.inferType(hierarchy);
-    _computed = true;
-    if (declaredMember.isField) {
-      builder.inferFieldSignature(hierarchy, declaredMember, overriddenMembers);
-    } else if (declaredMember.isGetter) {
-      builder.inferGetterSignature(
-          hierarchy, declaredMember, overriddenMembers);
-    } else if (declaredMember.isSetter) {
-      builder.inferSetterSignature(
-          hierarchy, declaredMember, overriddenMembers);
-    } else {
-      builder.inferMethodSignature(
-          hierarchy, declaredMember, overriddenMembers);
-    }
-  }
-
-  @override
-  String toString() => 'DelayedTypeComputation('
-      '${builder.classBuilder.name},$declaredMember,$overriddenMembers)';
-}
-
-int compareNamedParameters(VariableDeclaration a, VariableDeclaration b) {
-  return a.name!.compareTo(b.name!);
-}
-
-void reportCantInferParameterType(
-    ClassBuilder cls,
-    FormalParameterBuilder parameter,
-    ClassHierarchyBuilder hierarchy,
-    Iterable<ClassMember> overriddenMembers) {
-  String name = parameter.name;
-  List<LocatedMessage> context = overriddenMembers
-      .map((ClassMember overriddenMember) {
-        return messageDeclaredMemberConflictsWithOverriddenMembersCause
-            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
-                overriddenMember.fullNameForErrors.length);
-      })
-      // Call toSet to avoid duplicate context for instance of fields that are
-      // overridden both as getters and setters.
-      .toSet()
-      .toList();
-  cls.addProblem(
-      templateCantInferTypeDueToNoCombinedSignature.withArguments(name),
-      parameter.charOffset,
-      name.length,
-      wasHandled: true,
-      context: context);
-}
-
-void reportCantInferTypes(ClassBuilder cls, SourceProcedureBuilder member,
-    ClassHierarchyBuilder hierarchy, Iterable<ClassMember> overriddenMembers) {
-  String name = member.fullNameForErrors;
-  List<LocatedMessage> context = overriddenMembers
-      .map((ClassMember overriddenMember) {
-        return messageDeclaredMemberConflictsWithOverriddenMembersCause
-            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
-                overriddenMember.fullNameForErrors.length);
-      })
-      // Call toSet to avoid duplicate context for instance of fields that are
-      // overridden both as getters and setters.
-      .toSet()
-      .toList();
-  cls.addProblem(
-      templateCantInferTypesDueToNoCombinedSignature.withArguments(name),
-      member.charOffset,
-      name.length,
-      wasHandled: true,
-      context: context);
-}
-
-void reportCantInferReturnType(ClassBuilder cls, SourceProcedureBuilder member,
-    ClassHierarchyBuilder hierarchy, Iterable<ClassMember> overriddenMembers) {
-  String name = member.fullNameForErrors;
-  List<LocatedMessage> context = overriddenMembers
-      .map((ClassMember overriddenMember) {
-        return messageDeclaredMemberConflictsWithOverriddenMembersCause
-            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
-                overriddenMember.fullNameForErrors.length);
-      })
-      // Call toSet to avoid duplicate context for instance of fields that are
-      // overridden both as getters and setters.
-      .toSet()
-      .toList();
-  // // TODO(ahe): The following is for debugging, but could be cleaned up and
-  // // used to improve this error message in general.
-  //
-  // context = <LocatedMessage>[];
-  // ClassHierarchyNode supernode = hierarchy.getNodeFromType(cls.supertype);
-  // // TODO(ahe): Wrong template.
-  // Template<Message Function(String)> template =
-  //     templateMissingImplementationCause;
-  // if (supernode != null) {
-  //   Declaration superMember =
-  //       supernode.getInterfaceMember(new Name(name), false);
-  //   if (superMember != null) {
-  //     context.add(template
-  //         .withArguments(name)
-  //         .withLocation(
-  //             superMember.fileUri, superMember.charOffset, name.length));
-  //   }
-  //   superMember = supernode.getInterfaceMember(new Name(name), true);
-  //   if (superMember != null) {
-  //     context.add(template
-  //         .withArguments(name)
-  //         .withLocation(
-  //             superMember.fileUri, superMember.charOffset, name.length));
-  //   }
-  // }
-  // List<TypeBuilder> directInterfaces = cls.interfaces;
-  // for (int i = 0; i < directInterfaces.length; i++) {
-  //   ClassHierarchyNode supernode =
-  //       hierarchy.getNodeFromType(directInterfaces[i]);
-  //   if (supernode != null) {
-  //     Declaration superMember =
-  //         supernode.getInterfaceMember(new Name(name), false);
-  //     if (superMember != null) {
-  //       context.add(template
-  //           .withArguments(name)
-  //           .withLocation(
-  //               superMember.fileUri, superMember.charOffset, name.length));
-  //     }
-  //     superMember = supernode.getInterfaceMember(new Name(name), true);
-  //     if (superMember != null) {
-  //       context.add(template
-  //           .withArguments(name)
-  //           .withLocation(
-  //               superMember.fileUri, superMember.charOffset, name.length));
-  //     }
-  //   }
-  // }
-  cls.addProblem(
-      templateCantInferReturnTypeDueToNoCombinedSignature.withArguments(name),
-      member.charOffset,
-      name.length,
-      wasHandled: true,
-      context: context);
-}
-
-void reportCantInferFieldType(ClassBuilder cls, SourceFieldBuilder member,
-    Iterable<ClassMember> overriddenMembers) {
-  List<LocatedMessage> context = overriddenMembers
-      .map((ClassMember overriddenMember) {
-        return messageDeclaredMemberConflictsWithOverriddenMembersCause
-            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
-                overriddenMember.fullNameForErrors.length);
-      })
-      // Call toSet to avoid duplicate context for instance of fields that are
-      // overridden both as getters and setters.
-      .toSet()
-      .toList();
-  String name = member.fullNameForErrors;
-  cls.addProblem(
-      templateCantInferTypeDueToNoCombinedSignature.withArguments(name),
-      member.charOffset,
-      name.length,
-      wasHandled: true,
-      context: context);
-}
-
-ClassBuilder? getClass(TypeBuilder type) {
-  Builder? declaration = type.declaration;
-  if (declaration is TypeAliasBuilder) {
-    TypeAliasBuilder aliasBuilder = declaration;
-    NamedTypeBuilder namedBuilder = type as NamedTypeBuilder;
-    declaration = aliasBuilder.unaliasDeclaration(namedBuilder.arguments);
-  }
-  return declaration is ClassBuilder ? declaration : null;
-}
-
-Set<ClassMember> toSet(
-    ClassBuilder classBuilder, Iterable<ClassMember> members) {
-  Set<ClassMember> result = <ClassMember>{};
-  _toSet(classBuilder, members, result);
-  return result;
-}
-
-void _toSet(ClassBuilder classBuilder, Iterable<ClassMember> members,
-    Set<ClassMember> result) {
-  for (ClassMember member in members) {
-    if (member.hasDeclarations && classBuilder == member.classBuilder) {
-      _toSet(classBuilder, member.declarations, result);
-    } else {
-      result.add(member);
-    }
-  }
-}
-
-Set<ClassMember> unfoldDeclarations(Iterable<ClassMember> members) {
-  Set<ClassMember> result = <ClassMember>{};
-  _unfoldDeclarations(members, result);
-  return result;
-}
-
-void _unfoldDeclarations(
-    Iterable<ClassMember> members, Set<ClassMember> result) {
-  for (ClassMember member in members) {
-    if (member.hasDeclarations) {
-      _unfoldDeclarations(member.declarations, result);
-    } else {
-      result.add(member);
-    }
-  }
-}
-
-abstract class SynthesizedMember extends ClassMember {
-  @override
-  final ClassBuilder classBuilder;
-
-  @override
-  final Name name;
-
-  @override
-  final bool forSetter;
-
-  @override
-  final bool isProperty;
-
-  SynthesizedMember(this.classBuilder, this.name,
-      {required this.forSetter, required this.isProperty})
-      // ignore: unnecessary_null_comparison
-      : assert(forSetter != null),
-        // ignore: unnecessary_null_comparison
-        assert(isProperty != null);
-
-  @override
-  List<ClassMember> get declarations => throw new UnimplementedError();
-
-  @override
-  void inferType(ClassHierarchyBuilder hierarchy) {}
-
-  @override
-  bool get isAssignable => throw new UnimplementedError();
-
-  @override
-  bool get isConst => throw new UnimplementedError();
-
-  @override
-  bool get isDuplicate => false;
-
-  @override
-  bool get isField => throw new UnimplementedError();
-
-  @override
-  bool get isFinal => throw new UnimplementedError();
-
-  @override
-  bool get isGetter => throw new UnimplementedError();
-
-  @override
-  bool get isInternalImplementation => false;
-
-  @override
-  bool get isSetter => forSetter;
-
-  @override
-  bool get isSourceDeclaration => false;
-
-  @override
-  bool get isStatic => false;
-
-  @override
-  bool get isSynthesized => true;
-
-  @override
-  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {}
-}
-
-/// Class member for a set of interface members.
-///
-/// This is used to compute combined member signature of a set of interface
-/// members inherited into the same class, and to insert forwarding stubs,
-/// mixin stubs, and member signatures where needed.
-class SynthesizedInterfaceMember extends SynthesizedMember {
-  @override
-  final List<ClassMember> declarations;
-
-  /// The concrete member in the super class overridden by [declarations], if
-  /// any.
-  ///
-  /// This is used to as the target when creating concrete forwarding and mixin
-  /// stub. For instance:
-  ///
-  ///    class Super {
-  ///      method(int i) {}
-  ///    }
-  ///    class Interface {
-  ///      method(covariant int i) {}
-  ///    }
-  ///    class Class extends Super implements Interface {
-  ///      // Concrete forwarding stub calling [_superClassMember]:
-  ///      method(covariant int i) => super.method(i);
-  ///
-  final ClassMember? _superClassMember;
-
-  /// The canonical member of the combined member signature if it is known by
-  /// construction. The canonical member defines the type of combined member
-  /// signature.
-  ///
-  /// This is used when a declared member is part of a set of implemented
-  /// members. For instance
-  ///
-  ///     class Super {
-  ///       method(int i) {}
-  ///     }
-  ///     class Interface {
-  ///       method(covariant num i) {}
-  ///     }
-  ///     class Class implements Interface {
-  ///       // This member is updated to be a concrete forwarding stub with an
-  ///       // covariant parameter but with its declared parameter type:
-  ///       //    method(covariant int i) => super.method(i);
-  ///       method(int i);
-  ///     }
-  final ClassMember? _canonicalMember;
-
-  /// The member in [declarations] that is mixed in, if any.
-  ///
-  /// This is used to create mixin stubs. If the mixed in member is abstract,
-  /// an abstract mixin stub is created:
-  ///
-  ///    class Super {
-  ///      void method() {}
-  ///    }
-  ///    class Mixin {
-  ///      void method();
-  ///    }
-  ///    // Abstract mixin stub with `Mixin.method` as target inserted:
-  ///    //   void method();
-  ///    class Class = Super with Mixin;
-  ///
-  /// If the mixed in member is concrete, a concrete mixin member is created:
-  ///
-  ///    class Super {
-  ///      void method() {}
-  ///    }
-  ///    class Mixin {
-  ///      void method() {}
-  ///    }
-  ///    // Concrete mixin stub with `Mixin.method` as target inserted:
-  ///    //   void method() => super.method();
-  ///    class Class = Super with Mixin;
-  ///
-  /// If a forwarding stub is needed, the created stub will be a possibly
-  /// concrete forwarding stub:
-  ///
-  ///    class Super {
-  ///      void method(int i) {}
-  ///    }
-  ///    class Interface {
-  ///      void method(covariant num i) {}
-  ///    }
-  ///    class Mixin {
-  ///      void method(int i);
-  ///    }
-  ///    // Concrete forwarding stub with `Super.method` as target inserted:
-  ///    //   void method(covariant int i) => super.method(i);
-  ///    class Class = Super with Mixin implements Interface;
-  ///
-  final ClassMember? _mixedInMember;
-
-  /// If `true`, a stub should be inserted, if needed.
-  final bool _shouldModifyKernel;
-
-  Member? _member;
-  Covariance? _covariance;
-
-  SynthesizedInterfaceMember(
-      ClassBuilder classBuilder, Name name, this.declarations,
-      {ClassMember? superClassMember,
-      ClassMember? canonicalMember,
-      ClassMember? mixedInMember,
-      required bool isProperty,
-      required bool forSetter,
-      required bool shouldModifyKernel})
-      : this._superClassMember = superClassMember,
-        this._canonicalMember = canonicalMember,
-        this._mixedInMember = mixedInMember,
-        this._shouldModifyKernel = shouldModifyKernel,
-        super(classBuilder, name, isProperty: isProperty, forSetter: forSetter);
-
-  @override
-  bool get hasDeclarations => true;
-
-  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
-    if (_member != null) {
-      return;
-    }
-    if (classBuilder.library is! SourceLibraryBuilder) {
-      if (_canonicalMember != null) {
-        _member = _canonicalMember!.getMember(hierarchy);
-        _covariance = _canonicalMember!.getCovariance(hierarchy);
-      } else {
-        _member = declarations.first.getMember(hierarchy);
-        _covariance = declarations.first.getCovariance(hierarchy);
-      }
-      return;
-    }
-    CombinedClassMemberSignature combinedMemberSignature;
-    if (_canonicalMember != null) {
-      combinedMemberSignature = new CombinedClassMemberSignature.internal(
-          hierarchy,
-          classBuilder as SourceClassBuilder,
-          declarations.indexOf(_canonicalMember!),
-          declarations,
-          forSetter: isSetter);
-    } else {
-      combinedMemberSignature = new CombinedClassMemberSignature(
-          hierarchy, classBuilder as SourceClassBuilder, declarations,
-          forSetter: isSetter);
-
-      if (combinedMemberSignature.canonicalMember == null) {
-        String name = classBuilder.fullNameForErrors;
-        int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
-        List<LocatedMessage> context = declarations.map((ClassMember d) {
-          return messageDeclaredMemberConflictsWithOverriddenMembersCause
-              .withLocation(
-                  d.fileUri, d.charOffset, d.fullNameForErrors.length);
-        }).toList();
-
-        classBuilder.addProblem(
-            templateCombinedMemberSignatureFailed.withArguments(
-                classBuilder.fullNameForErrors,
-                declarations.first.fullNameForErrors),
-            classBuilder.charOffset,
-            length,
-            context: context);
-        // TODO(johnniwinther): Maybe we should have an invalid marker to avoid
-        // cascading errors.
-        _member = declarations.first.getMember(hierarchy);
-        _covariance = declarations.first.getCovariance(hierarchy);
-        return;
-      }
-    }
-
-    if (_shouldModifyKernel) {
-      ProcedureKind kind = ProcedureKind.Method;
-      Member canonicalMember =
-          combinedMemberSignature.canonicalMember!.getMember(hierarchy);
-      if (combinedMemberSignature.canonicalMember!.isProperty) {
-        kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
-      } else if (canonicalMember is Procedure &&
-          canonicalMember.kind == ProcedureKind.Operator) {
-        kind = ProcedureKind.Operator;
-      }
-
-      Procedure? stub = new ForwardingNode(
-              combinedMemberSignature, kind, _superClassMember, _mixedInMember)
-          .finalize();
-      if (stub != null) {
-        assert(classBuilder.cls == stub.enclosingClass);
-        assert(stub != canonicalMember);
-        classBuilder.cls.addProcedure(stub);
-        SourceLibraryBuilder library =
-            classBuilder.library as SourceLibraryBuilder;
-        if (canonicalMember is Procedure) {
-          library.forwardersOrigins
-            ..add(stub)
-            ..add(canonicalMember);
-        }
-        _member = stub;
-        _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
-        assert(
-            _covariance ==
-                new Covariance.fromMember(_member!, forSetter: forSetter),
-            "Unexpected covariance for combined members signature "
-            "$_member. Found $_covariance, expected "
-            "${new Covariance.fromMember(_member!, forSetter: forSetter)}.");
-        return;
-      }
-    }
-
-    _member = combinedMemberSignature.canonicalMember!.getMember(hierarchy);
-    _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
-  }
-
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return _member!;
-  }
-
-  @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return _covariance!;
-  }
-
-  @override
-  ClassMember get interfaceMember => this;
-
-  @override
-  bool isObjectMember(ClassBuilder objectClass) {
-    return false;
-  }
-
-  @override
-  bool isSameDeclaration(ClassMember other) {
-    // TODO(johnniwinther): Optimize this.
-    return false;
-  }
-
-  @override
-  int get charOffset => declarations.first.charOffset;
-
-  @override
-  Uri get fileUri => declarations.first.fileUri;
-
-  @override
-  bool get isAbstract => true;
-
-  @override
-  String get fullNameForErrors =>
-      declarations.map((ClassMember m) => m.fullName).join("%");
-
-  @override
-  String get fullName {
-    String suffix = isSetter ? "=" : "";
-    return "${fullNameForErrors}$suffix";
-  }
-
-  @override
-  String toString() => 'SynthesizedInterfaceMember($classBuilder,$name,'
-      '$declarations,forSetter=$forSetter)';
-}
-
-/// Class member for an inherited concrete member that implements an interface
-/// member.
-///
-/// This is used to ensure that both the inherited concrete member and the
-/// interface member is taken into account when computing the resulting [Member]
-/// node.
-///
-/// This is needed because an interface member, though initially abstract, can
-/// result in a concrete stub that overrides the concrete member. For instance
-///
-///    class Super {
-///      method(int i) {}
-///    }
-///    class Interface {
-///      method(covariant int i) {}
-///    }
-///    class Class extends Super implements Interface {
-///      // A concrete forwarding stub is inserted:
-///      method(covariant int i) => super.method(i);
-///    }
-///    class Sub extends Class implements Interface {
-///      // No forwarding stub should be inserted since `Class.method` is
-///      // adequate.
-///    }
-///
-///
-///  Here the create stub `Class.method` overrides `Super.method` and should
-///  be used to determine whether to insert a forwarding stub in subclasses.
-class InheritedClassMemberImplementsInterface extends SynthesizedMember {
-  final ClassMember inheritedClassMember;
-  final ClassMember implementedInterfaceMember;
-
-  Member? _member;
-  Covariance? _covariance;
-
-  InheritedClassMemberImplementsInterface(ClassBuilder classBuilder, Name name,
-      {required this.inheritedClassMember,
-      required this.implementedInterfaceMember,
-      required bool isProperty,
-      required bool forSetter})
-      // ignore: unnecessary_null_comparison
-      : assert(inheritedClassMember != null),
-        // ignore: unnecessary_null_comparison
-        assert(implementedInterfaceMember != null),
-        super(classBuilder, name, isProperty: isProperty, forSetter: forSetter);
-
-  void _ensureMemberAndCovariance(ClassHierarchyBuilder hierarchy) {
-    if (_member == null) {
-      Member classMember = inheritedClassMember.getMember(hierarchy);
-      Member interfaceMember = implementedInterfaceMember.getMember(hierarchy);
-      if (!interfaceMember.isAbstract &&
-          interfaceMember.enclosingClass == classBuilder.cls) {
-        /// The interface member resulted in a concrete stub being inserted.
-        /// For instance for `method1` but _not_ for `method2` here:
-        ///
-        ///    class Super {
-        ///      method1(int i) {}
-        ///      method2(covariant int i) {}
-        ///    }
-        ///    class Interface {
-        ///      method1(covariant int i) {}
-        ///      method2(int i) {}
-        ///    }
-        ///    class Class extends Super implements Interface {
-        ///      // A concrete forwarding stub is inserted for `method1` since
-        ///      // the parameter on `Super.method1` is _not_ marked as
-        ///      // covariant:
-        ///      method1(covariant int i) => super.method(i);
-        ///      // No concrete forwarding stub is inserted for `method2` since
-        ///      // the parameter on `Super.method2` is already marked as
-        ///      // covariant.
-        ///    }
-        ///
-        /// The inserted stub should be used as the resulting member.
-        _member = interfaceMember;
-        _covariance = implementedInterfaceMember.getCovariance(hierarchy);
-      } else {
-        /// The interface member did not result in an inserted stub or the
-        /// inserted stub was abstract. For instance:
-        ///
-        ///    // Opt-in:
-        ///    class Super {
-        ///      method(int? i) {}
-        ///    }
-        ///    // Opt-out:
-        ///    class Class extends Super {
-        ///      // An abstract member signature stub is inserted:
-        ///      method(int* i);
-        ///    }
-        ///
-        /// The inserted stub should _not_ be used as the resulting member
-        /// since it is abstract and therefore not a class member.
-        _member = classMember;
-        _covariance = inheritedClassMember.getCovariance(hierarchy);
-      }
-    }
-  }
-
-  @override
-  Member getMember(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return _member!;
-  }
-
-  @override
-  Covariance getCovariance(ClassHierarchyBuilder hierarchy) {
-    _ensureMemberAndCovariance(hierarchy);
-    return _covariance!;
-  }
-
-  @override
-  ClassMember get interfaceMember => implementedInterfaceMember;
-
-  @override
-  bool isObjectMember(ClassBuilder objectClass) {
-    return inheritedClassMember.isObjectMember(objectClass);
-  }
-
-  @override
-  bool isSameDeclaration(ClassMember other) {
-    // TODO(johnniwinther): Optimize this.
-    return false;
-  }
-
-  @override
-  int get charOffset => inheritedClassMember.charOffset;
-
-  @override
-  Uri get fileUri => inheritedClassMember.fileUri;
-
-  @override
-  bool get hasDeclarations => false;
-
-  @override
-  bool get isAbstract => false;
-
-  @override
-  String get fullNameForErrors => inheritedClassMember.fullNameForErrors;
-
-  @override
-  String get fullName => inheritedClassMember.fullName;
-
-  @override
-  String toString() =>
-      'InheritedClassMemberImplementsInterface($classBuilder,$name,'
-      'inheritedClassMember=$inheritedClassMember,'
-      'implementedInterfaceMember=$implementedInterfaceMember,'
-      'forSetter=$forSetter)';
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index abff877..ae2efed 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -20,7 +20,9 @@
 
 import '../source/source_class_builder.dart';
 
-import 'class_hierarchy_builder.dart';
+import 'hierarchy/class_member.dart';
+import 'hierarchy/hierarchy_builder.dart';
+import 'hierarchy/members_builder.dart';
 import 'member_covariance.dart';
 
 /// Class used for computing and inspecting the combined member signature for
@@ -736,9 +738,11 @@
 /// a set of overridden/inherited [ClassMember]s.
 class CombinedClassMemberSignature
     extends CombinedMemberSignatureBase<ClassMember> {
-  /// The class hierarchy builder used for building this class.
+  /// The class members builder used for building this class.
+  final ClassMembersBuilder membersBuilder;
+
   @override
-  final ClassHierarchyBuilder hierarchy;
+  ClassHierarchyBuilder get hierarchy => membersBuilder.hierarchyBuilder;
 
   /// The list of the members inherited into or overridden in [classBuilder].
   @override
@@ -746,7 +750,7 @@
 
   /// Creates a [CombinedClassMemberSignature] whose canonical member is already
   /// defined.
-  CombinedClassMemberSignature.internal(this.hierarchy,
+  CombinedClassMemberSignature.internal(this.membersBuilder,
       SourceClassBuilder classBuilder, int canonicalMemberIndex, this.members,
       {required bool forSetter})
       : super.internal(classBuilder, canonicalMemberIndex, forSetter);
@@ -758,7 +762,7 @@
   /// compute the most specific member type. Otherwise covariance of the getter
   /// types or function types is used.
   CombinedClassMemberSignature(
-      this.hierarchy, SourceClassBuilder classBuilder, this.members,
+      this.membersBuilder, SourceClassBuilder classBuilder, this.members,
       {required bool forSetter})
       : super(classBuilder, forSetter: forSetter);
 
@@ -771,7 +775,7 @@
   @override
   Member _getMember(int index) {
     ClassMember candidate = members[index];
-    Member target = candidate.getMember(hierarchy);
+    Member target = candidate.getMember(membersBuilder);
     // ignore: unnecessary_null_comparison
     assert(target != null,
         "No member computed for ${candidate} (${candidate.runtimeType})");
@@ -781,7 +785,7 @@
   @override
   Covariance _getMemberCovariance(int index) {
     ClassMember candidate = members[index];
-    Covariance covariance = candidate.getCovariance(hierarchy);
+    Covariance covariance = candidate.getCovariance(membersBuilder);
     // ignore: unnecessary_null_comparison
     assert(covariance != null,
         "No covariance computed for ${candidate} (${candidate.runtimeType})");
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index bc2af8b..cf785bd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -2464,9 +2464,8 @@
             functionEnvironment: receiver.environment);
       } else if (receiver is InstanceConstant) {
         final Class instanceClass = receiver.classNode;
-        assert(typeEnvironment.hierarchy is ClassHierarchy);
-        final Member member = (typeEnvironment.hierarchy as ClassHierarchy)
-            .getDispatchTarget(instanceClass, name)!;
+        final Member member =
+            typeEnvironment.hierarchy.getDispatchTarget(instanceClass, name)!;
         final FunctionNode? function = member.function;
 
         // TODO(kallentu): Implement [Object] class methods which have backend
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index ff0fb53..ce46969 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -4573,8 +4573,13 @@
         _helper.lookupConstructor(name, isSuper: isSuper);
     LocatedMessage? message;
     if (constructor != null) {
-      message = _helper.checkArgumentsForFunction(
-          constructor.function, arguments, offset, <TypeParameter>[]);
+      // The check of the arguments is done later for super initializers if the
+      // 'super-parameters' language feature is enabled. In that case the
+      // additional parameters can be added at a later stage.
+      if (!(isSuper && _helper.libraryBuilder.enableSuperParametersInLibrary)) {
+        message = _helper.checkArgumentsForFunction(
+            constructor.function, arguments, offset, <TypeParameter>[]);
+      }
     } else {
       String fullName =
           _helper.constructorNameForDiagnostics(name.text, isSuper: isSuper);
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index f05f378..b5b8b97 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -12,7 +12,7 @@
 
 import "../problems.dart" show unhandled;
 
-import 'class_hierarchy_builder.dart';
+import 'hierarchy/class_member.dart';
 import 'combined_member_signature.dart';
 
 class ForwardingNode {
@@ -49,7 +49,7 @@
     SourceClassBuilder classBuilder = _combinedMemberSignature.classBuilder;
     ClassMember canonicalMember = _combinedMemberSignature.canonicalMember!;
     Member interfaceMember =
-        canonicalMember.getMember(_combinedMemberSignature.hierarchy);
+        canonicalMember.getMember(_combinedMemberSignature.membersBuilder);
 
     bool needMixinStub =
         classBuilder.isMixinApplication && _mixedInMember != null;
@@ -83,7 +83,8 @@
             needsTypeOrCovarianceUpdate) ||
         needMixinStub;
     bool needsSuperImpl = _superClassMember != null &&
-        _superClassMember!.getCovariance(_combinedMemberSignature.hierarchy) !=
+        _superClassMember!
+                .getCovariance(_combinedMemberSignature.membersBuilder) !=
             _combinedMemberSignature.combinedMemberSignatureCovariance;
     if (stubNeeded) {
       Procedure stub = _combinedMemberSignature.createMemberFromSignature(
@@ -114,8 +115,8 @@
           }
         } else {
           stubKind = ProcedureStubKind.AbstractMixinStub;
-          finalTarget =
-              _mixedInMember!.getMember(_combinedMemberSignature.hierarchy);
+          finalTarget = _mixedInMember!
+              .getMember(_combinedMemberSignature.membersBuilder);
         }
 
         stub.stubKind = stubKind;
@@ -159,7 +160,7 @@
     }
     Procedure procedure = function.parent as Procedure;
     Member superTarget =
-        _superClassMember!.getMember(_combinedMemberSignature.hierarchy);
+        _superClassMember!.getMember(_combinedMemberSignature.membersBuilder);
     if (superTarget is Procedure && superTarget.isForwardingStub) {
       Procedure superProcedure = superTarget;
       superTarget = superProcedure.concreteForwardingStubTarget!;
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/class_member.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/class_member.dart
new file mode 100644
index 0000000..f45ba32
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/class_member.dart
@@ -0,0 +1,609 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.class_hierarchy_builder;
+
+import 'package:kernel/ast.dart';
+
+import '../../builder/class_builder.dart';
+import '../../messages.dart'
+    show
+        LocatedMessage,
+        messageDeclaredMemberConflictsWithOverriddenMembersCause,
+        templateCombinedMemberSignatureFailed;
+import '../../source/source_class_builder.dart';
+import '../../source/source_library_builder.dart' show SourceLibraryBuilder;
+import '../combined_member_signature.dart';
+import '../forwarding_node.dart' show ForwardingNode;
+import '../member_covariance.dart';
+import 'members_builder.dart';
+
+abstract class ClassMember {
+  Name get name;
+  bool get isStatic;
+  bool get isField;
+  bool get isAssignable;
+  bool get isSetter;
+  bool get isGetter;
+  bool get isFinal;
+  bool get isConst;
+  bool get forSetter;
+
+  /// Returns `true` if this member corresponds to a declaration in the source
+  /// code.
+  bool get isSourceDeclaration;
+
+  /// Returns `true` if this member is a field, getter or setter.
+  bool get isProperty;
+
+  /// Computes the [Member] node resulting from this class member.
+  Member getMember(ClassMembersBuilder membersBuilder);
+
+  /// Returns the member [Covariance] for this class member.
+  Covariance getCovariance(ClassMembersBuilder membersBuilder);
+
+  bool get isDuplicate;
+  String get fullName;
+  String get fullNameForErrors;
+  ClassBuilder get classBuilder;
+
+  /// Returns `true` if this class member is declared in Object from dart:core.
+  bool isObjectMember(ClassBuilder objectClass);
+  Uri get fileUri;
+  int get charOffset;
+
+  /// Returns `true` if this class member is an interface member.
+  bool get isAbstract;
+
+  /// Returns `true` if this member doesn't corresponds to a declaration in the
+  /// source code.
+  bool get isSynthesized;
+
+  // If `true` this member is not part of the interface but only part of the
+  // class members.
+  //
+  // This is `true` for instance for synthesized fields added for the late
+  // lowering.
+  bool get isInternalImplementation;
+
+  /// Returns `true` if this member is composed from a list of class members
+  /// accessible through [declarations].
+  bool get hasDeclarations;
+
+  /// If [hasDeclaration] is `true`, this returns the list of class members
+  /// from which this class member is composed.
+  ///
+  /// This is used in [unfoldDeclarations] to retrieve all underlying member
+  /// source declarations, and in [toSet] to retrieve all members used for
+  /// this class member wrt. certain level of the hierarchy.
+  /// TODO(johnniwinther): Can the use of [toSet] be replaced with a direct
+  /// use of [declarations]?
+  List<ClassMember> get declarations;
+
+  /// The interface member corresponding to this member.
+  ///
+  /// If this member is declared on the source, the interface member is
+  /// the member itself. For instance
+  ///
+  ///     abstract class Class {
+  ///        void concreteMethod() {}
+  ///        void abstractMethod();
+  ///     }
+  ///
+  /// the interface members for `concreteMethod` and `abstractMethod` are the
+  /// members themselves.
+  ///
+  /// If this member is a synthesized interface member, the
+  /// interface member is the member itself. For instance
+  ///
+  ///     abstract class Interface1 {
+  ///        void method() {}
+  ///     }
+  ///     abstract class Interface2 {
+  ///        void method() {}
+  ///     }
+  ///     abstract class Class implements Interface1, Interface2 {}
+  ///
+  /// the interface member for `method` in `Class` is the synthesized interface
+  /// member created for the implemented members `Interface1.method` and
+  /// `Interface2.method`.
+  ///
+  /// If this member is a concrete member that implements an interface member,
+  /// the interface member is the implemented interface member. For instance
+  ///
+  ///     class Super {
+  ///        void method() {}
+  ///     }
+  ///     class Interface {
+  ///        void method() {}
+  ///     }
+  ///     class Class extends Super implements Interface {}
+  ///
+  /// the interface member for `Super.method` implementing `method` in `Class`
+  /// is the synthesized interface member created for the implemented members
+  /// `Super.method` and `Interface.method`.
+  ClassMember get interfaceMember;
+
+  void inferType(ClassMembersBuilder membersBuilder);
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers);
+
+  /// Returns `true` if this has the same underlying declaration as [other].
+  ///
+  /// This is used for avoiding unnecessary checks and can this trivially
+  /// return `false`.
+  bool isSameDeclaration(ClassMember other);
+}
+
+abstract class SynthesizedMember extends ClassMember {
+  @override
+  final ClassBuilder classBuilder;
+
+  @override
+  final Name name;
+
+  @override
+  final bool forSetter;
+
+  @override
+  final bool isProperty;
+
+  SynthesizedMember(this.classBuilder, this.name,
+      {required this.forSetter, required this.isProperty})
+      // ignore: unnecessary_null_comparison
+      : assert(forSetter != null),
+        // ignore: unnecessary_null_comparison
+        assert(isProperty != null);
+
+  @override
+  List<ClassMember> get declarations => throw new UnimplementedError();
+
+  @override
+  void inferType(ClassMembersBuilder membersBuilder) {}
+
+  @override
+  bool get isAssignable => throw new UnimplementedError();
+
+  @override
+  bool get isConst => throw new UnimplementedError();
+
+  @override
+  bool get isDuplicate => false;
+
+  @override
+  bool get isField => throw new UnimplementedError();
+
+  @override
+  bool get isFinal => throw new UnimplementedError();
+
+  @override
+  bool get isGetter => throw new UnimplementedError();
+
+  @override
+  bool get isInternalImplementation => false;
+
+  @override
+  bool get isSetter => forSetter;
+
+  @override
+  bool get isSourceDeclaration => false;
+
+  @override
+  bool get isStatic => false;
+
+  @override
+  bool get isSynthesized => true;
+
+  @override
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {}
+}
+
+/// Class member for a set of interface members.
+///
+/// This is used to compute combined member signature of a set of interface
+/// members inherited into the same class, and to insert forwarding stubs,
+/// mixin stubs, and member signatures where needed.
+class SynthesizedInterfaceMember extends SynthesizedMember {
+  @override
+  final List<ClassMember> declarations;
+
+  /// The concrete member in the super class overridden by [declarations], if
+  /// any.
+  ///
+  /// This is used to as the target when creating concrete forwarding and mixin
+  /// stub. For instance:
+  ///
+  ///    class Super {
+  ///      method(int i) {}
+  ///    }
+  ///    class Interface {
+  ///      method(covariant int i) {}
+  ///    }
+  ///    class Class extends Super implements Interface {
+  ///      // Concrete forwarding stub calling [_superClassMember]:
+  ///      method(covariant int i) => super.method(i);
+  ///
+  final ClassMember? _superClassMember;
+
+  /// The canonical member of the combined member signature if it is known by
+  /// construction. The canonical member defines the type of combined member
+  /// signature.
+  ///
+  /// This is used when a declared member is part of a set of implemented
+  /// members. For instance
+  ///
+  ///     class Super {
+  ///       method(int i) {}
+  ///     }
+  ///     class Interface {
+  ///       method(covariant num i) {}
+  ///     }
+  ///     class Class implements Interface {
+  ///       // This member is updated to be a concrete forwarding stub with an
+  ///       // covariant parameter but with its declared parameter type:
+  ///       //    method(covariant int i) => super.method(i);
+  ///       method(int i);
+  ///     }
+  final ClassMember? _canonicalMember;
+
+  /// The member in [declarations] that is mixed in, if any.
+  ///
+  /// This is used to create mixin stubs. If the mixed in member is abstract,
+  /// an abstract mixin stub is created:
+  ///
+  ///    class Super {
+  ///      void method() {}
+  ///    }
+  ///    class Mixin {
+  ///      void method();
+  ///    }
+  ///    // Abstract mixin stub with `Mixin.method` as target inserted:
+  ///    //   void method();
+  ///    class Class = Super with Mixin;
+  ///
+  /// If the mixed in member is concrete, a concrete mixin member is created:
+  ///
+  ///    class Super {
+  ///      void method() {}
+  ///    }
+  ///    class Mixin {
+  ///      void method() {}
+  ///    }
+  ///    // Concrete mixin stub with `Mixin.method` as target inserted:
+  ///    //   void method() => super.method();
+  ///    class Class = Super with Mixin;
+  ///
+  /// If a forwarding stub is needed, the created stub will be a possibly
+  /// concrete forwarding stub:
+  ///
+  ///    class Super {
+  ///      void method(int i) {}
+  ///    }
+  ///    class Interface {
+  ///      void method(covariant num i) {}
+  ///    }
+  ///    class Mixin {
+  ///      void method(int i);
+  ///    }
+  ///    // Concrete forwarding stub with `Super.method` as target inserted:
+  ///    //   void method(covariant int i) => super.method(i);
+  ///    class Class = Super with Mixin implements Interface;
+  ///
+  final ClassMember? _mixedInMember;
+
+  /// If `true`, a stub should be inserted, if needed.
+  final bool _shouldModifyKernel;
+
+  Member? _member;
+  Covariance? _covariance;
+
+  SynthesizedInterfaceMember(
+      ClassBuilder classBuilder, Name name, this.declarations,
+      {ClassMember? superClassMember,
+      ClassMember? canonicalMember,
+      ClassMember? mixedInMember,
+      required bool isProperty,
+      required bool forSetter,
+      required bool shouldModifyKernel})
+      : this._superClassMember = superClassMember,
+        this._canonicalMember = canonicalMember,
+        this._mixedInMember = mixedInMember,
+        this._shouldModifyKernel = shouldModifyKernel,
+        super(classBuilder, name, isProperty: isProperty, forSetter: forSetter);
+
+  @override
+  bool get hasDeclarations => true;
+
+  void _ensureMemberAndCovariance(ClassMembersBuilder membersBuilder) {
+    if (_member != null) {
+      return;
+    }
+    if (classBuilder.library is! SourceLibraryBuilder) {
+      if (_canonicalMember != null) {
+        _member = _canonicalMember!.getMember(membersBuilder);
+        _covariance = _canonicalMember!.getCovariance(membersBuilder);
+      } else {
+        _member = declarations.first.getMember(membersBuilder);
+        _covariance = declarations.first.getCovariance(membersBuilder);
+      }
+      return;
+    }
+    CombinedClassMemberSignature combinedMemberSignature;
+    if (_canonicalMember != null) {
+      combinedMemberSignature = new CombinedClassMemberSignature.internal(
+          membersBuilder,
+          classBuilder as SourceClassBuilder,
+          declarations.indexOf(_canonicalMember!),
+          declarations,
+          forSetter: isSetter);
+    } else {
+      combinedMemberSignature = new CombinedClassMemberSignature(
+          membersBuilder, classBuilder as SourceClassBuilder, declarations,
+          forSetter: isSetter);
+
+      if (combinedMemberSignature.canonicalMember == null) {
+        String name = classBuilder.fullNameForErrors;
+        int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
+        List<LocatedMessage> context = declarations.map((ClassMember d) {
+          return messageDeclaredMemberConflictsWithOverriddenMembersCause
+              .withLocation(
+                  d.fileUri, d.charOffset, d.fullNameForErrors.length);
+        }).toList();
+
+        classBuilder.addProblem(
+            templateCombinedMemberSignatureFailed.withArguments(
+                classBuilder.fullNameForErrors,
+                declarations.first.fullNameForErrors),
+            classBuilder.charOffset,
+            length,
+            context: context);
+        // TODO(johnniwinther): Maybe we should have an invalid marker to avoid
+        // cascading errors.
+        _member = declarations.first.getMember(membersBuilder);
+        _covariance = declarations.first.getCovariance(membersBuilder);
+        return;
+      }
+    }
+
+    if (_shouldModifyKernel) {
+      ProcedureKind kind = ProcedureKind.Method;
+      Member canonicalMember =
+          combinedMemberSignature.canonicalMember!.getMember(membersBuilder);
+      if (combinedMemberSignature.canonicalMember!.isProperty) {
+        kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
+      } else if (canonicalMember is Procedure &&
+          canonicalMember.kind == ProcedureKind.Operator) {
+        kind = ProcedureKind.Operator;
+      }
+
+      Procedure? stub = new ForwardingNode(
+              combinedMemberSignature, kind, _superClassMember, _mixedInMember)
+          .finalize();
+      if (stub != null) {
+        assert(classBuilder.cls == stub.enclosingClass);
+        assert(stub != canonicalMember);
+        classBuilder.cls.addProcedure(stub);
+        SourceLibraryBuilder library =
+            classBuilder.library as SourceLibraryBuilder;
+        if (canonicalMember is Procedure) {
+          library.forwardersOrigins
+            ..add(stub)
+            ..add(canonicalMember);
+        }
+        _member = stub;
+        _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+        assert(
+            _covariance ==
+                new Covariance.fromMember(_member!, forSetter: forSetter),
+            "Unexpected covariance for combined members signature "
+            "$_member. Found $_covariance, expected "
+            "${new Covariance.fromMember(_member!, forSetter: forSetter)}.");
+        return;
+      }
+    }
+
+    _member =
+        combinedMemberSignature.canonicalMember!.getMember(membersBuilder);
+    _covariance = combinedMemberSignature.combinedMemberSignatureCovariance;
+  }
+
+  @override
+  Member getMember(ClassMembersBuilder membersBuilder) {
+    _ensureMemberAndCovariance(membersBuilder);
+    return _member!;
+  }
+
+  @override
+  Covariance getCovariance(ClassMembersBuilder membersBuilder) {
+    _ensureMemberAndCovariance(membersBuilder);
+    return _covariance!;
+  }
+
+  @override
+  ClassMember get interfaceMember => this;
+
+  @override
+  bool isObjectMember(ClassBuilder objectClass) {
+    return false;
+  }
+
+  @override
+  bool isSameDeclaration(ClassMember other) {
+    // TODO(johnniwinther): Optimize this.
+    return false;
+  }
+
+  @override
+  int get charOffset => declarations.first.charOffset;
+
+  @override
+  Uri get fileUri => declarations.first.fileUri;
+
+  @override
+  bool get isAbstract => true;
+
+  @override
+  String get fullNameForErrors =>
+      declarations.map((ClassMember m) => m.fullName).join("%");
+
+  @override
+  String get fullName {
+    String suffix = isSetter ? "=" : "";
+    return "${fullNameForErrors}$suffix";
+  }
+
+  @override
+  String toString() => 'SynthesizedInterfaceMember($classBuilder,$name,'
+      '$declarations,forSetter=$forSetter)';
+}
+
+/// Class member for an inherited concrete member that implements an interface
+/// member.
+///
+/// This is used to ensure that both the inherited concrete member and the
+/// interface member is taken into account when computing the resulting [Member]
+/// node.
+///
+/// This is needed because an interface member, though initially abstract, can
+/// result in a concrete stub that overrides the concrete member. For instance
+///
+///    class Super {
+///      method(int i) {}
+///    }
+///    class Interface {
+///      method(covariant int i) {}
+///    }
+///    class Class extends Super implements Interface {
+///      // A concrete forwarding stub is inserted:
+///      method(covariant int i) => super.method(i);
+///    }
+///    class Sub extends Class implements Interface {
+///      // No forwarding stub should be inserted since `Class.method` is
+///      // adequate.
+///    }
+///
+///
+///  Here the create stub `Class.method` overrides `Super.method` and should
+///  be used to determine whether to insert a forwarding stub in subclasses.
+class InheritedClassMemberImplementsInterface extends SynthesizedMember {
+  final ClassMember inheritedClassMember;
+  final ClassMember implementedInterfaceMember;
+
+  Member? _member;
+  Covariance? _covariance;
+
+  InheritedClassMemberImplementsInterface(ClassBuilder classBuilder, Name name,
+      {required this.inheritedClassMember,
+      required this.implementedInterfaceMember,
+      required bool isProperty,
+      required bool forSetter})
+      // ignore: unnecessary_null_comparison
+      : assert(inheritedClassMember != null),
+        // ignore: unnecessary_null_comparison
+        assert(implementedInterfaceMember != null),
+        super(classBuilder, name, isProperty: isProperty, forSetter: forSetter);
+
+  void _ensureMemberAndCovariance(ClassMembersBuilder membersBuilder) {
+    if (_member == null) {
+      Member classMember = inheritedClassMember.getMember(membersBuilder);
+      Member interfaceMember =
+          implementedInterfaceMember.getMember(membersBuilder);
+      if (!interfaceMember.isAbstract &&
+          interfaceMember.enclosingClass == classBuilder.cls) {
+        /// The interface member resulted in a concrete stub being inserted.
+        /// For instance for `method1` but _not_ for `method2` here:
+        ///
+        ///    class Super {
+        ///      method1(int i) {}
+        ///      method2(covariant int i) {}
+        ///    }
+        ///    class Interface {
+        ///      method1(covariant int i) {}
+        ///      method2(int i) {}
+        ///    }
+        ///    class Class extends Super implements Interface {
+        ///      // A concrete forwarding stub is inserted for `method1` since
+        ///      // the parameter on `Super.method1` is _not_ marked as
+        ///      // covariant:
+        ///      method1(covariant int i) => super.method(i);
+        ///      // No concrete forwarding stub is inserted for `method2` since
+        ///      // the parameter on `Super.method2` is already marked as
+        ///      // covariant.
+        ///    }
+        ///
+        /// The inserted stub should be used as the resulting member.
+        _member = interfaceMember;
+        _covariance = implementedInterfaceMember.getCovariance(membersBuilder);
+      } else {
+        /// The interface member did not result in an inserted stub or the
+        /// inserted stub was abstract. For instance:
+        ///
+        ///    // Opt-in:
+        ///    class Super {
+        ///      method(int? i) {}
+        ///    }
+        ///    // Opt-out:
+        ///    class Class extends Super {
+        ///      // An abstract member signature stub is inserted:
+        ///      method(int* i);
+        ///    }
+        ///
+        /// The inserted stub should _not_ be used as the resulting member
+        /// since it is abstract and therefore not a class member.
+        _member = classMember;
+        _covariance = inheritedClassMember.getCovariance(membersBuilder);
+      }
+    }
+  }
+
+  @override
+  Member getMember(ClassMembersBuilder membersBuilder) {
+    _ensureMemberAndCovariance(membersBuilder);
+    return _member!;
+  }
+
+  @override
+  Covariance getCovariance(ClassMembersBuilder membersBuilder) {
+    _ensureMemberAndCovariance(membersBuilder);
+    return _covariance!;
+  }
+
+  @override
+  ClassMember get interfaceMember => implementedInterfaceMember;
+
+  @override
+  bool isObjectMember(ClassBuilder objectClass) {
+    return inheritedClassMember.isObjectMember(objectClass);
+  }
+
+  @override
+  bool isSameDeclaration(ClassMember other) {
+    // TODO(johnniwinther): Optimize this.
+    return false;
+  }
+
+  @override
+  int get charOffset => inheritedClassMember.charOffset;
+
+  @override
+  Uri get fileUri => inheritedClassMember.fileUri;
+
+  @override
+  bool get hasDeclarations => false;
+
+  @override
+  bool get isAbstract => false;
+
+  @override
+  String get fullNameForErrors => inheritedClassMember.fullNameForErrors;
+
+  @override
+  String get fullName => inheritedClassMember.fullName;
+
+  @override
+  String toString() =>
+      'InheritedClassMemberImplementsInterface($classBuilder,$name,'
+      'inheritedClassMember=$inheritedClassMember,'
+      'implementedInterfaceMember=$implementedInterfaceMember,'
+      'forSetter=$forSetter)';
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/delayed.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/delayed.dart
new file mode 100644
index 0000000..61cd149
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/delayed.dart
@@ -0,0 +1,122 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.class_hierarchy_builder;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/src/legacy_erasure.dart';
+
+import '../../source/source_class_builder.dart';
+import 'class_member.dart';
+import 'members_builder.dart';
+import 'members_node.dart';
+
+abstract class DelayedCheck {
+  void check(ClassMembersBuilder membersBuilder);
+}
+
+class DelayedOverrideCheck implements DelayedCheck {
+  final SourceClassBuilder _classBuilder;
+  final ClassMember _declaredMember;
+  final Set<ClassMember> _overriddenMembers;
+
+  DelayedOverrideCheck(
+      this._classBuilder, this._declaredMember, this._overriddenMembers);
+
+  @override
+  void check(ClassMembersBuilder membersBuilder) {
+    Member declaredMember = _declaredMember.getMember(membersBuilder);
+
+    /// If [_declaredMember] is a class member that is declared in an opt-in
+    /// library but inherited to [_classBuilder] through an opt-out class then
+    /// we need to apply legacy erasure to the declared type to get the
+    /// inherited type.
+    ///
+    /// For interface members this is handled by member signatures but since
+    /// these are abstract they will never be the inherited class member.
+    ///
+    /// For instance:
+    ///
+    ///    // Opt in:
+    ///    class Super {
+    ///      int extendedMethod(int i, {required int j}) => i;
+    ///    }
+    ///    class Mixin {
+    ///      int mixedInMethod(int i, {required int j}) => i;
+    ///    }
+    ///    // Opt out:
+    ///    class Legacy extends Super with Mixin {}
+    ///    // Opt in:
+    ///    class Class extends Legacy {
+    ///      // Valid overrides since the type of `Legacy.extendedMethod` is
+    ///      // `int* Function(int*, {int* j})`.
+    ///      int? extendedMethod(int? i, {int? j}) => i;
+    ///      // Valid overrides since the type of `Legacy.mixedInMethod` is
+    ///      // `int* Function(int*, {int* j})`.
+    ///      int? mixedInMethod(int? i, {int? j}) => i;
+    ///    }
+    ///
+    bool declaredNeedsLegacyErasure =
+        needsLegacyErasure(_classBuilder.cls, declaredMember.enclosingClass!);
+    void callback(Member interfaceMember, bool isSetter) {
+      _classBuilder.checkOverride(membersBuilder.hierarchyBuilder.types,
+          membersBuilder, declaredMember, interfaceMember, isSetter, callback,
+          isInterfaceCheck: !_classBuilder.isMixinApplication,
+          declaredNeedsLegacyErasure: declaredNeedsLegacyErasure);
+    }
+
+    for (ClassMember overriddenMember in _overriddenMembers) {
+      callback(
+          overriddenMember.getMember(membersBuilder), _declaredMember.isSetter);
+    }
+  }
+}
+
+class DelayedGetterSetterCheck implements DelayedCheck {
+  final SourceClassBuilder classBuilder;
+  final ClassMember getter;
+  final ClassMember setter;
+
+  const DelayedGetterSetterCheck(this.classBuilder, this.getter, this.setter);
+
+  @override
+  void check(ClassMembersBuilder membersBuilder) {
+    classBuilder.checkGetterSetter(membersBuilder.hierarchyBuilder.types,
+        getter.getMember(membersBuilder), setter.getMember(membersBuilder));
+  }
+}
+
+class DelayedTypeComputation {
+  final ClassMembersNodeBuilder builder;
+  final ClassMember declaredMember;
+  final Set<ClassMember> overriddenMembers;
+  bool _computed = false;
+
+  DelayedTypeComputation(
+      this.builder, this.declaredMember, this.overriddenMembers)
+      : assert(declaredMember.isSourceDeclaration);
+
+  void compute(ClassMembersBuilder membersBuilder) {
+    if (_computed) return;
+    declaredMember.inferType(membersBuilder);
+    _computed = true;
+    if (declaredMember.isField) {
+      builder.inferFieldSignature(
+          membersBuilder, declaredMember, overriddenMembers);
+    } else if (declaredMember.isGetter) {
+      builder.inferGetterSignature(
+          membersBuilder, declaredMember, overriddenMembers);
+    } else if (declaredMember.isSetter) {
+      builder.inferSetterSignature(
+          membersBuilder, declaredMember, overriddenMembers);
+    } else {
+      builder.inferMethodSignature(
+          membersBuilder, declaredMember, overriddenMembers);
+    }
+  }
+
+  @override
+  String toString() => 'DelayedTypeComputation('
+      '${builder.classBuilder.name},$declaredMember,$overriddenMembers)';
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_builder.dart
new file mode 100644
index 0000000..b40523a
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_builder.dart
@@ -0,0 +1,194 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.class_hierarchy_builder;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchyBase;
+import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:kernel/src/types.dart' show Types;
+import 'package:kernel/type_algebra.dart' show Substitution, uniteNullabilities;
+
+import '../../builder/class_builder.dart';
+import '../../builder/type_builder.dart';
+import '../../loader.dart' show Loader;
+import '../../source/source_loader.dart' show SourceLoader;
+import 'hierarchy_node.dart';
+
+class ClassHierarchyBuilder implements ClassHierarchyBase {
+  final Map<Class, ClassHierarchyNode> nodes = <Class, ClassHierarchyNode>{};
+
+  final Map<ClassBuilder, Map<Class, Substitution>> substitutions =
+      <ClassBuilder, Map<Class, Substitution>>{};
+
+  final ClassBuilder objectClassBuilder;
+
+  final Loader loader;
+
+  final Class objectClass;
+
+  final Class futureClass;
+
+  final Class functionClass;
+
+  @override
+  final CoreTypes coreTypes;
+
+  late Types types;
+
+  ClassHierarchyBuilder(this.objectClassBuilder, this.loader, this.coreTypes)
+      : objectClass = objectClassBuilder.cls,
+        futureClass = coreTypes.futureClass,
+        functionClass = coreTypes.functionClass {
+    types = new Types(this);
+  }
+
+  void clear() {
+    nodes.clear();
+    substitutions.clear();
+  }
+
+  ClassHierarchyNode getNodeFromClassBuilder(ClassBuilder classBuilder) {
+    return nodes[classBuilder.cls] ??= new ClassHierarchyNodeBuilder(
+            this, classBuilder, substitutions[classBuilder] ??= {})
+        .build();
+  }
+
+  ClassHierarchyNode? getNodeFromTypeBuilder(TypeBuilder type) {
+    ClassBuilder? cls = getClass(type);
+    return cls == null ? null : getNodeFromClassBuilder(cls);
+  }
+
+  ClassHierarchyNode getNodeFromClass(Class cls) {
+    return nodes[cls] ??
+        getNodeFromClassBuilder(loader.computeClassBuilderFromTargetClass(cls));
+  }
+
+  Supertype? asSupertypeOf(InterfaceType subtype, Class supertype) {
+    if (subtype.classNode == supertype) {
+      return new Supertype(supertype, subtype.typeArguments);
+    }
+    ClassHierarchyNode clsNode = getNodeFromClass(subtype.classNode);
+    ClassHierarchyNode supertypeNode = getNodeFromClass(supertype);
+    List<Supertype> superclasses = clsNode.superclasses;
+    int depth = supertypeNode.depth;
+    if (depth < superclasses.length) {
+      Supertype superclass = superclasses[depth];
+      if (superclass.classNode == supertype) {
+        return Substitution.fromInterfaceType(subtype)
+            .substituteSupertype(superclass);
+      }
+    }
+    List<Supertype> superinterfaces = clsNode.interfaces;
+    for (int i = 0; i < superinterfaces.length; i++) {
+      Supertype superinterface = superinterfaces[i];
+      if (superinterface.classNode == supertype) {
+        return Substitution.fromInterfaceType(subtype)
+            .substituteSupertype(superinterface);
+      }
+    }
+    return null;
+  }
+
+  @override
+  InterfaceType getTypeAsInstanceOf(
+      InterfaceType type, Class superclass, Library clientLibrary) {
+    if (type.classNode == superclass) return type;
+    return asSupertypeOf(type, superclass)!
+        .asInterfaceType
+        .withDeclaredNullability(type.nullability);
+  }
+
+  @override
+  List<DartType>? getTypeArgumentsAsInstanceOf(
+      InterfaceType type, Class superclass) {
+    if (type.classNode == superclass) return type.typeArguments;
+    return asSupertypeOf(type, superclass)?.typeArguments;
+  }
+
+  @override
+  InterfaceType getLegacyLeastUpperBound(
+      InterfaceType type1, InterfaceType type2, Library clientLibrary) {
+    if (type1 == type2) return type1;
+
+    // LLUB(Null, List<dynamic>*) works differently for opt-in and opt-out
+    // libraries.  In opt-out libraries the legacy behavior is preserved, so
+    // LLUB(Null, List<dynamic>*) = List<dynamic>*.  In opt-out libraries the
+    // rules imply that LLUB(Null, List<dynamic>*) = List<dynamic>?.
+    if (!clientLibrary.isNonNullableByDefault) {
+      if (type1 is NullType) {
+        return type2;
+      }
+      if (type2 is NullType) {
+        return type1;
+      }
+    }
+
+    ClassHierarchyNode node1 = getNodeFromClass(type1.classNode);
+    ClassHierarchyNode node2 = getNodeFromClass(type2.classNode);
+    Set<ClassHierarchyNode> nodes1 = node1.computeAllSuperNodes(this).toSet();
+    List<ClassHierarchyNode> nodes2 = node2.computeAllSuperNodes(this);
+    List<ClassHierarchyNode> common = <ClassHierarchyNode>[];
+
+    for (int i = 0; i < nodes2.length; i++) {
+      ClassHierarchyNode node = nodes2[i];
+      // ignore: unnecessary_null_comparison
+      if (node == null) continue;
+      if (node.classBuilder.cls.isAnonymousMixin) {
+        // Never find unnamed mixin application in least upper bound.
+        continue;
+      }
+      if (nodes1.contains(node)) {
+        DartType candidate1 =
+            getTypeAsInstanceOf(type1, node.classBuilder.cls, clientLibrary);
+        DartType candidate2 =
+            getTypeAsInstanceOf(type2, node.classBuilder.cls, clientLibrary);
+        if (candidate1 == candidate2) {
+          common.add(node);
+        }
+      }
+    }
+
+    if (common.length == 1) {
+      return coreTypes.objectRawType(
+          uniteNullabilities(type1.nullability, type2.nullability));
+    }
+    common.sort(ClassHierarchyNode.compareMaxInheritancePath);
+
+    for (int i = 0; i < common.length - 1; i++) {
+      ClassHierarchyNode node = common[i];
+      if (node.maxInheritancePath != common[i + 1].maxInheritancePath) {
+        return getTypeAsInstanceOf(type1, node.classBuilder.cls, clientLibrary)
+            .withDeclaredNullability(
+                uniteNullabilities(type1.nullability, type2.nullability));
+      } else {
+        do {
+          i++;
+        } while (node.maxInheritancePath == common[i + 1].maxInheritancePath);
+      }
+    }
+    return coreTypes.objectRawType(
+        uniteNullabilities(type1.nullability, type2.nullability));
+  }
+
+  static ClassHierarchyBuilder build(ClassBuilder objectClass,
+      List<ClassBuilder> classes, SourceLoader loader, CoreTypes coreTypes) {
+    ClassHierarchyBuilder hierarchy =
+        new ClassHierarchyBuilder(objectClass, loader, coreTypes);
+    for (int i = 0; i < classes.length; i++) {
+      ClassBuilder classBuilder = classes[i];
+      if (!classBuilder.isPatch) {
+        hierarchy.nodes[classBuilder.cls] = new ClassHierarchyNodeBuilder(
+                hierarchy,
+                classBuilder,
+                hierarchy.substitutions[classBuilder] ??= {})
+            .build();
+      } else {
+        // TODO(ahe): Merge the injected members of patch into the hierarchy
+        // node of `cls.origin`.
+      }
+    }
+    return hierarchy;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart
new file mode 100644
index 0000000..a5e89b9
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart
@@ -0,0 +1,481 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.class_hierarchy_builder;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/nnbd_top_merge.dart';
+import 'package:kernel/src/norm.dart';
+import 'package:kernel/type_algebra.dart' show Substitution;
+
+import '../../../testing/id_testing_utils.dart' show typeToText;
+import '../../builder/builder.dart';
+import '../../builder/class_builder.dart';
+import '../../builder/named_type_builder.dart';
+import '../../builder/type_alias_builder.dart';
+import '../../builder/type_builder.dart';
+import '../../type_inference/type_schema.dart' show UnknownType;
+import 'hierarchy_builder.dart';
+import 'mixin_inferrer.dart';
+
+class ClassHierarchyNodeBuilder {
+  final ClassHierarchyBuilder hierarchy;
+
+  final ClassBuilder classBuilder;
+
+  bool hasNoSuchMethod = false;
+
+  final Map<Class, Substitution> substitutions;
+
+  ClassHierarchyNodeBuilder(
+      this.hierarchy, this.classBuilder, this.substitutions);
+
+  ClassBuilder get objectClass => hierarchy.objectClassBuilder;
+
+  ClassHierarchyNode build() {
+    assert(!classBuilder.isPatch);
+    ClassHierarchyNode? supernode;
+    if (objectClass != classBuilder.origin) {
+      supernode =
+          hierarchy.getNodeFromTypeBuilder(classBuilder.supertypeBuilder!);
+      if (supernode == null) {
+        supernode = hierarchy.getNodeFromClassBuilder(objectClass);
+      }
+      // ignore: unnecessary_null_comparison
+      assert(supernode != null);
+    }
+
+    List<Supertype> superclasses;
+
+    List<Supertype> interfaces;
+
+    int maxInheritancePath;
+
+    List<TypeBuilder>? directInterfaceBuilders;
+
+    if (classBuilder.isMixinApplication) {
+      inferMixinApplication();
+    }
+
+    if (supernode == null) {
+      // This should be Object.
+      superclasses = new List<Supertype>.filled(0, dummySupertype);
+      interfaces = new List<Supertype>.filled(0, dummySupertype);
+      maxInheritancePath = 0;
+    } else {
+      maxInheritancePath = supernode.maxInheritancePath + 1;
+
+      superclasses = new List<Supertype>.filled(
+          supernode.superclasses.length + 1, dummySupertype);
+      Supertype? supertype = classBuilder.supertypeBuilder!.buildSupertype(
+          classBuilder.library, classBuilder.charOffset, classBuilder.fileUri);
+      if (supertype == null) {
+        // If the superclass is not an interface type we use Object instead.
+        // A similar normalization is performed on [supernode] above.
+        supertype =
+            new Supertype(hierarchy.coreTypes.objectClass, const <DartType>[]);
+      }
+      superclasses.setRange(0, superclasses.length - 1,
+          substSupertypes(supertype, supernode.superclasses));
+      superclasses[superclasses.length - 1] = supertype;
+      if (!classBuilder.library.isNonNullableByDefault &&
+          supernode.classBuilder.library.isNonNullableByDefault) {
+        for (int i = 0; i < superclasses.length; i++) {
+          superclasses[i] = legacyErasureSupertype(superclasses[i]);
+        }
+      }
+
+      directInterfaceBuilders = ignoreFunction(classBuilder.interfaceBuilders);
+      if (classBuilder.isMixinApplication) {
+        if (directInterfaceBuilders == null) {
+          directInterfaceBuilders = <TypeBuilder>[
+            classBuilder.mixedInTypeBuilder!
+          ];
+        } else {
+          directInterfaceBuilders = <TypeBuilder>[
+            classBuilder.mixedInTypeBuilder!
+          ]..addAll(directInterfaceBuilders);
+        }
+      }
+
+      List<Supertype> superclassInterfaces = supernode.interfaces;
+      // ignore: unnecessary_null_comparison
+      if (superclassInterfaces != null) {
+        superclassInterfaces = substSupertypes(supertype, superclassInterfaces);
+      }
+
+      if (directInterfaceBuilders != null) {
+        interfaces = <Supertype>[];
+        // ignore: unnecessary_null_comparison
+        if (superclassInterfaces != null) {
+          for (int i = 0; i < superclassInterfaces.length; i++) {
+            addInterface(interfaces, superclasses, superclassInterfaces[i]);
+          }
+        }
+
+        for (int i = 0; i < directInterfaceBuilders.length; i++) {
+          Supertype? directInterface = directInterfaceBuilders[i]
+              .buildSupertype(classBuilder.library, classBuilder.charOffset,
+                  classBuilder.fileUri);
+          if (directInterface != null) {
+            addInterface(interfaces, superclasses, directInterface);
+            ClassHierarchyNode interfaceNode =
+                hierarchy.getNodeFromClass(directInterface.classNode);
+            // ignore: unnecessary_null_comparison
+            if (interfaceNode != null) {
+              if (maxInheritancePath < interfaceNode.maxInheritancePath + 1) {
+                maxInheritancePath = interfaceNode.maxInheritancePath + 1;
+              }
+
+              List<Supertype> types =
+                  substSupertypes(directInterface, interfaceNode.superclasses);
+              for (int i = 0; i < types.length; i++) {
+                addInterface(interfaces, superclasses, types[i]);
+              }
+              // ignore: unnecessary_null_comparison
+              if (interfaceNode.interfaces != null) {
+                List<Supertype> types =
+                    substSupertypes(directInterface, interfaceNode.interfaces);
+                for (int i = 0; i < types.length; i++) {
+                  addInterface(interfaces, superclasses, types[i]);
+                }
+              }
+            }
+          }
+        }
+        // ignore: unnecessary_null_comparison
+      } else if (superclassInterfaces != null &&
+          !classBuilder.library.isNonNullableByDefault &&
+          supernode.classBuilder.library.isNonNullableByDefault) {
+        interfaces = <Supertype>[];
+        for (int i = 0; i < superclassInterfaces.length; i++) {
+          addInterface(interfaces, superclasses, superclassInterfaces[i]);
+        }
+      } else {
+        interfaces = superclassInterfaces;
+      }
+    }
+
+    for (Supertype superclass in superclasses) {
+      recordSupertype(superclass);
+    }
+    // ignore: unnecessary_null_comparison
+    if (interfaces != null) {
+      for (Supertype superinterface in interfaces) {
+        recordSupertype(superinterface);
+      }
+    }
+
+    /*ClassHierarchyMemberNode memberNode =
+    buildMemberNode(supernode, directInterfaceBuilders);*/
+
+    return new ClassHierarchyNode(
+      classBuilder,
+      supernode,
+      directInterfaceBuilders,
+      /*classMemberMap,
+        classSetterMap,
+        interfaceMemberMap,
+        interfaceSetterMap,*/
+      superclasses,
+      interfaces,
+      maxInheritancePath,
+      /*hasNoSuchMethod,
+        dataForTesting,*/
+      /*memberNode*/
+    );
+  }
+
+  Supertype recordSupertype(Supertype supertype) {
+    debug?.log("In ${this.classBuilder.fullNameForErrors} "
+        "recordSupertype(${supertype})");
+    Class cls = supertype.classNode;
+    List<TypeParameter> supertypeTypeParameters = cls.typeParameters;
+    if (supertypeTypeParameters.isEmpty) {
+      substitutions[cls] = Substitution.empty;
+    } else {
+      List<DartType> arguments = supertype.typeArguments;
+      List<DartType> typeArguments =
+          new List<DartType>.filled(arguments.length, dummyDartType);
+      List<TypeParameter> typeParameters =
+          new List<TypeParameter>.filled(arguments.length, dummyTypeParameter);
+      for (int i = 0; i < arguments.length; i++) {
+        typeParameters[i] = supertypeTypeParameters[i];
+        typeArguments[i] = arguments[i];
+      }
+      substitutions[cls] =
+          Substitution.fromPairs(typeParameters, typeArguments);
+    }
+    return supertype;
+  }
+
+  List<Supertype> substSupertypes(
+      Supertype supertype, List<Supertype> supertypes) {
+    List<TypeParameter> typeVariables = supertype.classNode.typeParameters;
+    if (typeVariables.isEmpty) {
+      debug?.log("In ${this.classBuilder.fullNameForErrors} "
+          "$supertypes aren't substed");
+      return supertypes;
+    }
+    Map<TypeParameter, DartType> map = <TypeParameter, DartType>{};
+    List<DartType> arguments = supertype.typeArguments;
+    for (int i = 0; i < typeVariables.length; i++) {
+      map[typeVariables[i]] = arguments[i];
+    }
+    Substitution substitution = Substitution.fromMap(map);
+    List<Supertype>? result;
+    for (int i = 0; i < supertypes.length; i++) {
+      Supertype supertype = supertypes[i];
+      Supertype substituted = substitution.substituteSupertype(supertype);
+      if (supertype != substituted) {
+        debug?.log("In ${this.classBuilder.fullNameForErrors} $supertype"
+            " -> $substituted");
+        result ??= supertypes.toList();
+        result[i] = substituted;
+      } else {
+        debug?.log("In ${this.classBuilder.fullNameForErrors} "
+            "$supertype isn't substed");
+      }
+    }
+    return result ?? supertypes;
+  }
+
+  void addInterface(List<Supertype> interfaces, List<Supertype> superclasses,
+      Supertype type) {
+    // ignore: unnecessary_null_comparison
+    if (type == null) return null;
+    if (!classBuilder.library.isNonNullableByDefault) {
+      type = legacyErasureSupertype(type);
+    }
+    ClassHierarchyNode node = hierarchy.getNodeFromClass(type.classNode);
+    // ignore: unnecessary_null_comparison
+    if (node == null) return null;
+    int depth = node.depth;
+    int myDepth = superclasses.length;
+    Supertype? superclass = depth < myDepth ? superclasses[depth] : null;
+    if (superclass != null && superclass.classNode == type.classNode) {
+      // This is a potential conflict.
+      if (classBuilder.library.isNonNullableByDefault) {
+        superclass = nnbdTopMergeSupertype(
+            hierarchy.coreTypes,
+            normSupertype(hierarchy.coreTypes, superclass),
+            normSupertype(hierarchy.coreTypes, type));
+        if (superclass == null) {
+          // This is a conflict.
+          // TODO(johnniwinther): Report errors here instead of through
+          // the computation of the [ClassHierarchy].
+          superclass = superclasses[depth];
+        } else {
+          superclasses[depth] = superclass;
+        }
+      }
+      return;
+    } else {
+      for (int i = 0; i < interfaces.length; i++) {
+        // This is a quadratic algorithm, but normally, the number of
+        // interfaces is really small.
+        Supertype? interface = interfaces[i];
+        if (interface.classNode == type.classNode) {
+          // This is a potential conflict.
+          if (classBuilder.library.isNonNullableByDefault) {
+            interface = nnbdTopMergeSupertype(
+                hierarchy.coreTypes,
+                normSupertype(hierarchy.coreTypes, interface),
+                normSupertype(hierarchy.coreTypes, type));
+            if (interface == null) {
+              // This is a conflict.
+              // TODO(johnniwinther): Report errors here instead of through
+              // the computation of the [ClassHierarchy].
+              interface = interfaces[i];
+            } else {
+              interfaces[i] = interface;
+            }
+          }
+          return;
+        }
+      }
+    }
+    interfaces.add(type);
+  }
+
+  void inferMixinApplication() {
+    Class cls = classBuilder.cls;
+    Supertype? mixedInType = cls.mixedInType;
+    if (mixedInType == null) return;
+    List<DartType> typeArguments = mixedInType.typeArguments;
+    if (typeArguments.isEmpty || typeArguments.first is! UnknownType) return;
+    new BuilderMixinInferrer(
+            classBuilder,
+            hierarchy.coreTypes,
+            new TypeBuilderConstraintGatherer(hierarchy,
+                mixedInType.classNode.typeParameters, cls.enclosingLibrary))
+        .infer(cls);
+    List<TypeBuilder> inferredArguments = new List<TypeBuilder>.generate(
+        typeArguments.length,
+        (int i) => hierarchy.loader.computeTypeBuilder(typeArguments[i]),
+        growable: false);
+    NamedTypeBuilder mixedInTypeBuilder =
+        classBuilder.mixedInTypeBuilder as NamedTypeBuilder;
+    mixedInTypeBuilder.arguments = inferredArguments;
+  }
+
+  /// The class Function from dart:core is supposed to be ignored when used as
+  /// an interface.
+  List<TypeBuilder>? ignoreFunction(List<TypeBuilder>? interfaces) {
+    if (interfaces == null) return null;
+    for (int i = 0; i < interfaces!.length; i++) {
+      ClassBuilder? classBuilder = getClass(interfaces[i]);
+      if (classBuilder != null && classBuilder.cls == hierarchy.functionClass) {
+        if (interfaces.length == 1) {
+          return null;
+        } else {
+          interfaces = interfaces.toList();
+          interfaces.removeAt(i);
+          return ignoreFunction(interfaces);
+        }
+      }
+    }
+    return interfaces;
+  }
+}
+
+class ClassHierarchyNode {
+  /// The class corresponding to this hierarchy node.
+  final ClassBuilder classBuilder;
+
+  final ClassHierarchyNode? supernode;
+
+  final List<TypeBuilder>? directInterfaceBuilders;
+
+  /*/// All the members of this class including [classMembers] of its
+  /// superclasses. The members are sorted by [compareDeclarations].
+  final Map<Name, ClassMember> classMemberMap;
+
+  /// Similar to [classMembers] but for setters.
+  final Map<Name, ClassMember> classSetterMap;
+
+  /// All the interface members of this class including [interfaceMembers] of
+  /// its supertypes. The members are sorted by [compareDeclarations].
+  ///
+  /// In addition to the members of [classMembers] this also contains members
+  /// from interfaces.
+  ///
+  /// This may be null, in which case [classMembers] is the interface members.
+  final Map<Name, ClassMember>? interfaceMemberMap;
+
+  /// Similar to [interfaceMembers] but for setters.
+  ///
+  /// This may be null, in which case [classSetters] is the interface setters.
+  final Map<Name, ClassMember>? interfaceSetterMap;*/
+
+  /// All superclasses of [classBuilder] excluding itself. The classes are
+  /// sorted by depth from the root (Object) in ascending order.
+  final List<Supertype> superclasses;
+
+  /// The list of all classes implemented by [classBuilder] and its supertypes
+  /// excluding any classes from [superclasses].
+  final List<Supertype> interfaces;
+
+  /// The longest inheritance path from [classBuilder] to `Object`.
+  final int maxInheritancePath;
+
+  int get depth => superclasses.length;
+
+  /*final bool hasNoSuchMethod;
+
+  final ClassHierarchyNodeDataForTesting? dataForTesting;*/
+
+  //final ClassHierarchyMemberNode memberNode;
+
+  ClassHierarchyNode(
+    this.classBuilder,
+    this.supernode,
+    this.directInterfaceBuilders,
+    /*this.classMemberMap,
+      this.classSetterMap,
+      this.interfaceMemberMap,
+      this.interfaceSetterMap,*/
+    this.superclasses,
+    this.interfaces,
+    this.maxInheritancePath,
+    /*this.hasNoSuchMethod,
+      this.dataForTesting,*/
+    /*this.memberNode*/
+  );
+
+  /// Returns a list of all supertypes of [classBuilder], including this node.
+  List<ClassHierarchyNode> computeAllSuperNodes(
+      ClassHierarchyBuilder hierarchy) {
+    List<ClassHierarchyNode> result = [];
+    for (int i = 0; i < superclasses.length; i++) {
+      Supertype type = superclasses[i];
+      result.add(hierarchy.getNodeFromClass(type.classNode));
+    }
+    for (int i = 0; i < interfaces.length; i++) {
+      Supertype type = interfaces[i];
+      result.add(hierarchy.getNodeFromClass(type.classNode));
+    }
+    result.add(this);
+    return result;
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb
+      ..write(classBuilder.fullNameForErrors)
+      ..writeln(":");
+    if (maxInheritancePath != this.depth) {
+      sb
+        ..write("  Longest path to Object: ")
+        ..writeln(maxInheritancePath);
+    }
+    sb..writeln("  superclasses:");
+    int depth = 0;
+    for (Supertype superclass in superclasses) {
+      sb.write("  " * (depth + 2));
+      if (depth != 0) sb.write("-> ");
+      sb.write(typeToText(superclass.asInterfaceType));
+      sb.writeln();
+      depth++;
+    }
+    // ignore: unnecessary_null_comparison
+    if (interfaces != null) {
+      sb.write("  interfaces:");
+      bool first = true;
+      for (Supertype i in interfaces) {
+        if (!first) sb.write(",");
+        sb.write(" ");
+        sb.write(typeToText(i.asInterfaceType));
+        first = false;
+      }
+      sb.writeln();
+    }
+    return "$sb";
+  }
+
+  static int compareMaxInheritancePath(
+      ClassHierarchyNode a, ClassHierarchyNode b) {
+    return b.maxInheritancePath.compareTo(a.maxInheritancePath);
+  }
+}
+
+ClassBuilder? getClass(TypeBuilder type) {
+  Builder? declaration = type.declaration;
+  if (declaration is TypeAliasBuilder) {
+    TypeAliasBuilder aliasBuilder = declaration;
+    NamedTypeBuilder namedBuilder = type as NamedTypeBuilder;
+    declaration = aliasBuilder.unaliasDeclaration(namedBuilder.arguments);
+  }
+  return declaration is ClassBuilder ? declaration : null;
+}
+
+const DebugLogger? debug =
+    const bool.fromEnvironment("debug.hierarchy") ? const DebugLogger() : null;
+
+class DebugLogger {
+  const DebugLogger();
+  void log(Object message) => print(message);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_builder.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_builder.dart
new file mode 100644
index 0000000..f50343a
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_builder.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.class_hierarchy_builder;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchyMembers;
+
+import '../../builder/class_builder.dart';
+import '../../builder/field_builder.dart';
+import '../../builder/procedure_builder.dart';
+import '../../builder/type_builder.dart';
+import '../../source/source_class_builder.dart';
+import 'class_member.dart';
+import 'delayed.dart';
+import 'hierarchy_builder.dart';
+import 'hierarchy_node.dart';
+import 'members_node.dart';
+
+class ClassMembersBuilder implements ClassHierarchyMembers {
+  final ClassHierarchyBuilder hierarchyBuilder;
+
+  final Map<Class, ClassMembersNode> nodes = <Class, ClassMembersNode>{};
+
+  final List<DelayedTypeComputation> _delayedTypeComputations =
+      <DelayedTypeComputation>[];
+
+  final List<DelayedCheck> _delayedChecks = <DelayedCheck>[];
+
+  final List<ClassMember> _delayedMemberComputations = <ClassMember>[];
+
+  ClassMembersBuilder(this.hierarchyBuilder);
+
+  void clear() {
+    nodes.clear();
+    _delayedChecks.clear();
+    _delayedTypeComputations.clear();
+    _delayedMemberComputations.clear();
+  }
+
+  void registerDelayedTypeComputation(DelayedTypeComputation computation) {
+    _delayedTypeComputations.add(computation);
+  }
+
+  void registerOverrideCheck(SourceClassBuilder classBuilder,
+      ClassMember declaredMember, Set<ClassMember> overriddenMembers) {
+    _delayedChecks.add(new DelayedOverrideCheck(
+        classBuilder, declaredMember, overriddenMembers));
+  }
+
+  void registerGetterSetterCheck(
+      SourceClassBuilder classBuilder, ClassMember getter, ClassMember setter) {
+    _delayedChecks
+        .add(new DelayedGetterSetterCheck(classBuilder, getter, setter));
+  }
+
+  void registerMemberComputation(ClassMember member) {
+    _delayedMemberComputations.add(member);
+  }
+
+  List<DelayedTypeComputation> takeDelayedTypeComputations() {
+    List<DelayedTypeComputation> list = _delayedTypeComputations.toList();
+    _delayedTypeComputations.clear();
+    return list;
+  }
+
+  List<DelayedCheck> takeDelayedChecks() {
+    List<DelayedCheck> list = _delayedChecks.toList();
+    _delayedChecks.clear();
+    return list;
+  }
+
+  List<ClassMember> takeDelayedMemberComputations() {
+    List<ClassMember> list = _delayedMemberComputations.toList();
+    _delayedMemberComputations.clear();
+    return list;
+  }
+
+  void inferFieldType(SourceFieldBuilder declaredMember,
+      Iterable<ClassMember> overriddenMembers) {
+    ClassMembersNodeBuilder.inferFieldType(
+        hierarchyBuilder,
+        this,
+        declaredMember.classBuilder as SourceClassBuilder,
+        declaredMember,
+        overriddenMembers);
+  }
+
+  void inferGetterType(SourceProcedureBuilder declaredMember,
+      Iterable<ClassMember> overriddenMembers) {
+    ClassMembersNodeBuilder.inferGetterType(
+        hierarchyBuilder,
+        this,
+        declaredMember.classBuilder as SourceClassBuilder,
+        declaredMember,
+        overriddenMembers);
+  }
+
+  void inferSetterType(SourceProcedureBuilder declaredMember,
+      Iterable<ClassMember> overriddenMembers) {
+    ClassMembersNodeBuilder.inferSetterType(
+        hierarchyBuilder,
+        this,
+        declaredMember.classBuilder as SourceClassBuilder,
+        declaredMember,
+        overriddenMembers);
+  }
+
+  void inferMethodType(SourceProcedureBuilder declaredMember,
+      Iterable<ClassMember> overriddenMembers) {
+    ClassMembersNodeBuilder.inferMethodType(
+        hierarchyBuilder,
+        this,
+        declaredMember.classBuilder as SourceClassBuilder,
+        declaredMember,
+        overriddenMembers);
+  }
+
+  ClassMembersNode getNodeFromClassBuilder(ClassBuilder classBuilder) {
+    return nodes[classBuilder.cls] ??= new ClassMembersNodeBuilder(
+            this,
+            hierarchyBuilder.getNodeFromClassBuilder(classBuilder),
+            hierarchyBuilder.substitutions[classBuilder] ??= {})
+        .build();
+  }
+
+  ClassMembersNode? getNodeFromTypeBuilder(TypeBuilder type) {
+    ClassBuilder? cls = getClass(type);
+    return cls == null ? null : getNodeFromClassBuilder(cls);
+  }
+
+  ClassMembersNode getNodeFromClass(Class cls) {
+    return nodes[cls] ??
+        getNodeFromClassBuilder(
+            hierarchyBuilder.loader.computeClassBuilderFromTargetClass(cls));
+  }
+
+  @override
+  Member? getInterfaceMember(Class cls, Name name, {bool setter: false}) {
+    return getNodeFromClass(cls)
+        .getInterfaceMember(name, setter)
+        ?.getMember(this);
+  }
+
+  ClassMember? getInterfaceClassMember(Class cls, Name name,
+      {bool setter: false}) {
+    return getNodeFromClass(cls).getInterfaceMember(name, setter);
+  }
+
+  static ClassMembersBuilder build(
+      ClassHierarchyBuilder hierarchyBuilder, List<ClassBuilder> classes) {
+    ClassMembersBuilder membersBuilder =
+        new ClassMembersBuilder(hierarchyBuilder);
+    for (int i = 0; i < classes.length; i++) {
+      ClassBuilder classBuilder = classes[i];
+      if (!classBuilder.isPatch) {
+        membersBuilder.nodes[classBuilder.cls] = new ClassMembersNodeBuilder(
+                membersBuilder,
+                hierarchyBuilder.getNodeFromClassBuilder(classBuilder),
+                hierarchyBuilder.substitutions[classBuilder] ??= {})
+            .build();
+      } else {
+        // TODO(ahe): Merge the injected members of patch into the hierarchy
+        // node of `cls.origin`.
+      }
+    }
+    return membersBuilder;
+  }
+
+  void computeTypes() {
+    List<DelayedTypeComputation> typeComputations =
+        takeDelayedTypeComputations();
+    for (int i = 0; i < typeComputations.length; i++) {
+      typeComputations[i].compute(this);
+    }
+  }
+}
+
+int compareNamedParameters(VariableDeclaration a, VariableDeclaration b) {
+  return a.name!.compareTo(b.name!);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
new file mode 100644
index 0000000..b2fc124
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
@@ -0,0 +1,2883 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.class_hierarchy_builder;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/nnbd_top_merge.dart';
+import 'package:kernel/src/norm.dart';
+import 'package:kernel/type_algebra.dart' show Substitution;
+
+import '../../../base/common.dart';
+import '../../builder/builder.dart';
+import '../../builder/class_builder.dart';
+import '../../builder/field_builder.dart';
+import '../../builder/formal_parameter_builder.dart';
+import '../../builder/library_builder.dart';
+import '../../builder/member_builder.dart';
+import '../../builder/named_type_builder.dart';
+import '../../builder/procedure_builder.dart';
+import '../../builder/type_alias_builder.dart';
+import '../../builder/type_builder.dart';
+import '../../builder/type_declaration_builder.dart';
+import '../../messages.dart'
+    show
+        LocatedMessage,
+        messageDeclaredMemberConflictsWithInheritedMember,
+        messageDeclaredMemberConflictsWithInheritedMemberCause,
+        messageDeclaredMemberConflictsWithOverriddenMembersCause,
+        messageInheritedMembersConflict,
+        messageInheritedMembersConflictCause1,
+        messageInheritedMembersConflictCause2,
+        messageStaticAndInstanceConflict,
+        messageStaticAndInstanceConflictCause,
+        templateCantInferTypesDueToNoCombinedSignature,
+        templateCantInferReturnTypeDueToNoCombinedSignature,
+        templateCantInferTypeDueToNoCombinedSignature,
+        templateDuplicatedDeclaration,
+        templateDuplicatedDeclarationCause,
+        templateMissingImplementationCause,
+        templateMissingImplementationNotAbstract;
+import '../../names.dart' show noSuchMethodName;
+import '../../scope.dart' show Scope;
+import '../../source/source_class_builder.dart';
+import '../combined_member_signature.dart';
+import '../member_covariance.dart';
+import 'class_member.dart';
+import 'delayed.dart';
+import 'hierarchy_builder.dart';
+import 'hierarchy_node.dart';
+import 'members_builder.dart';
+
+class ClassMembersNodeBuilder {
+  final ClassHierarchyNode _hierarchyNode;
+  final ClassMembersBuilder _membersBuilder;
+
+  bool hasNoSuchMethod = false;
+
+  final Map<Class, Substitution> substitutions;
+
+  ClassMembersNodeBuilder(
+      this._membersBuilder, this._hierarchyNode, this.substitutions);
+
+  ClassHierarchyBuilder get hierarchy => _membersBuilder.hierarchyBuilder;
+
+  ClassBuilder get objectClass => hierarchy.objectClassBuilder;
+
+  ClassBuilder get classBuilder => _hierarchyNode.classBuilder;
+
+  bool get shouldModifyKernel =>
+      classBuilder.library.loader == hierarchy.loader;
+
+  ClassMember? checkInheritanceConflict(ClassMember a, ClassMember b) {
+    if (a.isStatic || a.isProperty != b.isProperty) {
+      reportInheritanceConflict(a, b);
+      return a;
+    }
+    return null;
+  }
+
+  static void inferMethodType(
+      ClassHierarchyBuilder hierarchyBuilder,
+      ClassMembersBuilder membersBuilder,
+      SourceClassBuilder classBuilder,
+      SourceProcedureBuilder declaredMember,
+      Iterable<ClassMember> overriddenMembers) {
+    assert(!declaredMember.isGetter && !declaredMember.isSetter);
+    if (declaredMember.classBuilder == classBuilder &&
+        (declaredMember.returnType == null ||
+            declaredMember.formals != null &&
+                declaredMember.formals!
+                    .any((parameter) => parameter.type == null))) {
+      Procedure declaredProcedure = declaredMember.member as Procedure;
+      FunctionNode declaredFunction = declaredProcedure.function;
+      List<TypeParameter> declaredTypeParameters =
+          declaredFunction.typeParameters;
+      List<VariableDeclaration> declaredPositional =
+          declaredFunction.positionalParameters;
+      List<VariableDeclaration> declaredNamed =
+          declaredFunction.namedParameters;
+      declaredNamed = declaredNamed.toList()..sort(compareNamedParameters);
+
+      DartType? inferredReturnType;
+      Map<FormalParameterBuilder, DartType?> inferredParameterTypes = {};
+
+      Set<ClassMember> overriddenMemberSet =
+          toSet(classBuilder, overriddenMembers);
+      CombinedClassMemberSignature combinedMemberSignature =
+          new CombinedClassMemberSignature(
+              membersBuilder, classBuilder, overriddenMemberSet.toList(),
+              forSetter: false);
+      FunctionType? combinedMemberSignatureType = combinedMemberSignature
+              .getCombinedSignatureTypeInContext(declaredTypeParameters)
+          as FunctionType?;
+
+      bool cantInferReturnType = false;
+      List<FormalParameterBuilder>? cantInferParameterTypes;
+
+      if (declaredMember.returnType == null) {
+        if (combinedMemberSignatureType == null) {
+          inferredReturnType = const InvalidType();
+          cantInferReturnType = true;
+        } else {
+          inferredReturnType = combinedMemberSignatureType.returnType;
+        }
+      }
+      if (declaredMember.formals != null) {
+        for (int i = 0; i < declaredPositional.length; i++) {
+          FormalParameterBuilder declaredParameter = declaredMember.formals![i];
+          if (declaredParameter.type != null) {
+            continue;
+          }
+
+          DartType? inferredParameterType;
+          if (combinedMemberSignatureType == null) {
+            inferredParameterType = const InvalidType();
+            cantInferParameterTypes ??= [];
+            cantInferParameterTypes.add(declaredParameter);
+          } else if (i <
+              combinedMemberSignatureType.positionalParameters.length) {
+            inferredParameterType =
+                combinedMemberSignatureType.positionalParameters[i];
+          }
+          inferredParameterTypes[declaredParameter] = inferredParameterType;
+        }
+
+        Map<String, DartType>? namedParameterTypes;
+        for (int i = declaredPositional.length;
+            i < declaredMember.formals!.length;
+            i++) {
+          FormalParameterBuilder declaredParameter = declaredMember.formals![i];
+          if (declaredParameter.type != null) {
+            continue;
+          }
+
+          DartType? inferredParameterType;
+          if (combinedMemberSignatureType == null) {
+            inferredParameterType = const InvalidType();
+            cantInferParameterTypes ??= [];
+            cantInferParameterTypes.add(declaredParameter);
+          } else {
+            if (namedParameterTypes == null) {
+              namedParameterTypes = {};
+              for (NamedType namedType
+                  in combinedMemberSignatureType.namedParameters) {
+                namedParameterTypes[namedType.name] = namedType.type;
+              }
+            }
+            inferredParameterType = namedParameterTypes[declaredParameter.name];
+          }
+          inferredParameterTypes[declaredParameter] = inferredParameterType;
+        }
+      }
+
+      if ((cantInferReturnType && cantInferParameterTypes != null) ||
+          (cantInferParameterTypes != null &&
+              cantInferParameterTypes.length > 1)) {
+        reportCantInferTypes(classBuilder, declaredMember, overriddenMembers);
+      } else if (cantInferReturnType) {
+        reportCantInferReturnType(
+            classBuilder, declaredMember, overriddenMembers);
+      } else if (cantInferParameterTypes != null) {
+        reportCantInferParameterType(
+            classBuilder, cantInferParameterTypes.single, overriddenMembers);
+      }
+
+      if (declaredMember.returnType == null) {
+        inferredReturnType ??= const DynamicType();
+        declaredFunction.returnType = inferredReturnType;
+      }
+      if (declaredMember.formals != null) {
+        for (FormalParameterBuilder declaredParameter
+            in declaredMember.formals!) {
+          if (declaredParameter.type == null) {
+            DartType inferredParameterType =
+                inferredParameterTypes[declaredParameter] ??
+                    const DynamicType();
+            declaredParameter.variable!.type = inferredParameterType;
+          }
+        }
+      }
+    }
+  }
+
+  void inferMethodSignature(ClassMembersBuilder membersBuilder,
+      ClassMember declaredMember, Iterable<ClassMember> overriddenMembers) {
+    assert(!declaredMember.isGetter && !declaredMember.isSetter);
+    // Trigger computation of method type.
+    Procedure declaredProcedure =
+        declaredMember.getMember(membersBuilder) as Procedure;
+    for (ClassMember overriddenMember
+        in toSet(declaredMember.classBuilder, overriddenMembers)) {
+      Covariance covariance = overriddenMember.getCovariance(membersBuilder);
+      covariance.applyCovariance(declaredProcedure);
+    }
+  }
+
+  void inferGetterSignature(ClassMembersBuilder membersBuilder,
+      ClassMember declaredMember, Iterable<ClassMember> overriddenMembers) {
+    assert(declaredMember.isGetter);
+    // Trigger computation of the getter type.
+    declaredMember.getMember(membersBuilder);
+    // Otherwise nothing to do. Getters have no variance.
+  }
+
+  void inferSetterSignature(ClassMembersBuilder membersBuilder,
+      ClassMember declaredMember, Iterable<ClassMember> overriddenMembers) {
+    assert(declaredMember.isSetter);
+    // Trigger computation of the getter type.
+    Procedure declaredSetter =
+        declaredMember.getMember(membersBuilder) as Procedure;
+    for (ClassMember overriddenMember
+        in toSet(declaredMember.classBuilder, overriddenMembers)) {
+      Covariance covariance = overriddenMember.getCovariance(membersBuilder);
+      covariance.applyCovariance(declaredSetter);
+    }
+  }
+
+  static void inferGetterType(
+      ClassHierarchyBuilder hierarchyBuilder,
+      ClassMembersBuilder membersBuilder,
+      SourceClassBuilder classBuilder,
+      SourceProcedureBuilder declaredMember,
+      Iterable<ClassMember> overriddenMembers) {
+    assert(declaredMember.isGetter);
+    if (declaredMember.classBuilder == classBuilder &&
+        declaredMember.returnType == null) {
+      DartType? inferredType;
+      overriddenMembers = toSet(classBuilder, overriddenMembers);
+
+      List<ClassMember> overriddenGetters = [];
+      List<ClassMember> overriddenSetters = [];
+      for (ClassMember overriddenMember in overriddenMembers) {
+        if (overriddenMember.forSetter) {
+          overriddenSetters.add(overriddenMember);
+        } else {
+          overriddenGetters.add(overriddenMember);
+        }
+      }
+
+      void inferFrom(List<ClassMember> members, {required bool forSetter}) {
+        // ignore: unnecessary_null_comparison
+        assert(forSetter != null);
+        CombinedClassMemberSignature combinedMemberSignature =
+            new CombinedClassMemberSignature(
+                membersBuilder, classBuilder, members,
+                forSetter: forSetter);
+        DartType? combinedMemberSignatureType =
+            combinedMemberSignature.combinedMemberSignatureType;
+        if (combinedMemberSignatureType == null) {
+          inferredType = const InvalidType();
+          reportCantInferReturnType(classBuilder, declaredMember, members);
+        } else {
+          inferredType = combinedMemberSignatureType;
+        }
+      }
+
+      if (overriddenGetters.isNotEmpty) {
+        // 1) The return type of a getter, parameter type of a setter or type
+        // of a field which overrides/implements only one or more getters is
+        // inferred to be the return type of the combined member signature of
+        // said getter in the direct superinterfaces.
+
+        // 2) The return type of a getter which overrides/implements both a
+        // setter and a getter is inferred to be the return type of the
+        // combined member signature of said getter in the direct
+        // superinterfaces.
+        inferFrom(overriddenGetters, forSetter: false);
+      } else {
+        // The return type of a getter, parameter type of a setter or type of
+        // a field which overrides/implements only one or more setters is
+        // inferred to be the parameter type of the combined member signature
+        // of said setter in the direct superinterfaces.
+        inferFrom(overriddenSetters, forSetter: true);
+      }
+
+      declaredMember.procedure.function.returnType =
+          inferredType ?? const DynamicType();
+    }
+  }
+
+  static void inferSetterType(
+      ClassHierarchyBuilder hierarchyBuilder,
+      ClassMembersBuilder membersBuilder,
+      SourceClassBuilder classBuilder,
+      SourceProcedureBuilder declaredMember,
+      Iterable<ClassMember> overriddenMembers) {
+    assert(declaredMember.isSetter);
+    FormalParameterBuilder parameter = declaredMember.formals!.first;
+    if (declaredMember.classBuilder == classBuilder && parameter.type == null) {
+      DartType? inferredType;
+
+      overriddenMembers = toSet(classBuilder, overriddenMembers);
+
+      List<ClassMember> overriddenGetters = [];
+      List<ClassMember> overriddenSetters = [];
+      for (ClassMember overriddenMember in overriddenMembers) {
+        if (overriddenMember.forSetter) {
+          overriddenSetters.add(overriddenMember);
+        } else {
+          overriddenGetters.add(overriddenMember);
+        }
+      }
+
+      void inferFrom(List<ClassMember> members, {required bool forSetter}) {
+        // ignore: unnecessary_null_comparison
+        assert(forSetter != null);
+        CombinedClassMemberSignature combinedMemberSignature =
+            new CombinedClassMemberSignature(
+                membersBuilder, classBuilder, members,
+                forSetter: forSetter);
+        DartType? combinedMemberSignatureType =
+            combinedMemberSignature.combinedMemberSignatureType;
+        if (combinedMemberSignatureType == null) {
+          inferredType = const InvalidType();
+          reportCantInferReturnType(classBuilder, declaredMember, members);
+        } else {
+          inferredType = combinedMemberSignatureType;
+        }
+      }
+
+      if (overriddenSetters.isNotEmpty) {
+        // 1) The return type of a getter, parameter type of a setter or type
+        // of a field which overrides/implements only one or more setters is
+        // inferred to be the parameter type of the combined member signature
+        // of said setter in the direct superinterfaces.
+        //
+        // 2) The parameter type of a setter which overrides/implements both a
+        // setter and a getter is inferred to be the parameter type of the
+        // combined member signature of said setter in the direct
+        // superinterfaces.
+        inferFrom(overriddenSetters, forSetter: true);
+      } else {
+        // The return type of a getter, parameter type of a setter or type of
+        // a field which overrides/implements only one or more getters is
+        // inferred to be the return type of the combined member signature of
+        // said getter in the direct superinterfaces.
+        inferFrom(overriddenGetters, forSetter: false);
+      }
+
+      parameter.variable!.type = inferredType ?? const DynamicType();
+    }
+  }
+
+  /// Merge the [inheritedType] with the currently [inferredType] using
+  /// nnbd-top-merge or legacy-top-merge depending on whether [classBuilder] is
+  /// defined in an opt-in or opt-out library. If the types could not be merged
+  /// `null` is returned and an error should be reported by the caller.
+  static DartType? mergeTypeInLibrary(
+      ClassHierarchyBuilder hierarchy,
+      ClassBuilder classBuilder,
+      DartType? inferredType,
+      DartType inheritedType) {
+    if (classBuilder.library.isNonNullableByDefault) {
+      if (inferredType == null) {
+        return inheritedType;
+      } else {
+        return nnbdTopMerge(
+            hierarchy.coreTypes,
+            norm(hierarchy.coreTypes, inferredType),
+            norm(hierarchy.coreTypes, inheritedType));
+      }
+    } else {
+      inheritedType = legacyErasure(inheritedType);
+      if (inferredType == null) {
+        return inheritedType;
+      } else {
+        if (inferredType is DynamicType &&
+            inheritedType == hierarchy.coreTypes.objectLegacyRawType) {
+          return inferredType;
+        } else if (inheritedType is DynamicType &&
+            inferredType == hierarchy.coreTypes.objectLegacyRawType) {
+          return inheritedType;
+        }
+        if (inferredType != inheritedType) {
+          return null;
+        }
+        return inferredType;
+      }
+    }
+  }
+
+  /// Infers the field type of [fieldBuilder] based on [overriddenMembers].
+  static void inferFieldType(
+      ClassHierarchyBuilder hierarchyBuilder,
+      ClassMembersBuilder membersBuilder,
+      SourceClassBuilder classBuilder,
+      SourceFieldBuilder fieldBuilder,
+      Iterable<ClassMember> overriddenMembers) {
+    if (fieldBuilder.classBuilder == classBuilder &&
+        fieldBuilder.type == null) {
+      DartType? inferredType;
+
+      overriddenMembers = toSet(classBuilder, overriddenMembers);
+      List<ClassMember> overriddenGetters = [];
+      List<ClassMember> overriddenSetters = [];
+      for (ClassMember overriddenMember in overriddenMembers) {
+        if (overriddenMember.forSetter) {
+          overriddenSetters.add(overriddenMember);
+        } else {
+          overriddenGetters.add(overriddenMember);
+        }
+      }
+
+      DartType? inferFrom(List<ClassMember> members,
+          {required bool forSetter}) {
+        // ignore: unnecessary_null_comparison
+        assert(forSetter != null);
+        CombinedClassMemberSignature combinedMemberSignature =
+            new CombinedClassMemberSignature(
+                membersBuilder, classBuilder, members,
+                forSetter: forSetter);
+        return combinedMemberSignature.combinedMemberSignatureType;
+      }
+
+      DartType? combinedMemberSignatureType;
+      if (fieldBuilder.isAssignable &&
+          overriddenGetters.isNotEmpty &&
+          overriddenSetters.isNotEmpty) {
+        // The type of a non-final field which overrides/implements both a
+        // setter and a getter is inferred to be the parameter type of the
+        // combined member signature of said setter in the direct
+        // superinterfaces, if this type is the same as the return type of the
+        // combined member signature of said getter in the direct
+        // superinterfaces. If the types are not the same then inference fails
+        // with an error.
+        DartType? getterType = inferFrom(overriddenGetters, forSetter: false);
+        DartType? setterType = inferFrom(overriddenSetters, forSetter: true);
+        if (getterType == setterType) {
+          combinedMemberSignatureType = getterType;
+        }
+      } else if (overriddenGetters.isNotEmpty) {
+        // 1) The return type of a getter, parameter type of a setter or type
+        // of a field which overrides/implements only one or more getters is
+        // inferred to be the return type of the combined member signature of
+        // said getter in the direct superinterfaces.
+        //
+        // 2) The type of a final field which overrides/implements both a
+        // setter and a getter is inferred to be the return type of the
+        // combined member signature of said getter in the direct
+        // superinterfaces.
+        combinedMemberSignatureType =
+            inferFrom(overriddenGetters, forSetter: false);
+      } else {
+        // The return type of a getter, parameter type of a setter or type of
+        // a field which overrides/implements only one or more setters is
+        // inferred to be the parameter type of the combined member signature
+        // of said setter in the direct superinterfaces.
+        combinedMemberSignatureType =
+            inferFrom(overriddenSetters, forSetter: true);
+      }
+
+      if (combinedMemberSignatureType == null) {
+        inferredType = const InvalidType();
+        reportCantInferFieldType(classBuilder, fieldBuilder, overriddenMembers);
+      } else {
+        inferredType = combinedMemberSignatureType;
+      }
+
+      fieldBuilder.fieldType = inferredType;
+    }
+  }
+
+  /// Infers the field signature of [declaredMember] based on
+  /// [overriddenMembers].
+  void inferFieldSignature(ClassMembersBuilder membersBuilder,
+      ClassMember declaredMember, Iterable<ClassMember> overriddenMembers) {
+    Field declaredField = declaredMember.getMember(membersBuilder) as Field;
+    for (ClassMember overriddenMember
+        in toSet(declaredMember.classBuilder, overriddenMembers)) {
+      Covariance covariance = overriddenMember.getCovariance(membersBuilder);
+      covariance.applyCovariance(declaredField);
+    }
+  }
+
+  void reportInheritanceConflict(ClassMember a, ClassMember b) {
+    String name = a.fullNameForErrors;
+    if (a.classBuilder != b.classBuilder) {
+      if (a.classBuilder == classBuilder) {
+        classBuilder.addProblem(
+            messageDeclaredMemberConflictsWithInheritedMember,
+            a.charOffset,
+            name.length,
+            context: <LocatedMessage>[
+              messageDeclaredMemberConflictsWithInheritedMemberCause
+                  .withLocation(b.fileUri, b.charOffset, name.length)
+            ]);
+      } else if (b.classBuilder == classBuilder) {
+        classBuilder.addProblem(
+            messageDeclaredMemberConflictsWithInheritedMember,
+            b.charOffset,
+            name.length,
+            context: <LocatedMessage>[
+              messageDeclaredMemberConflictsWithInheritedMemberCause
+                  .withLocation(a.fileUri, a.charOffset, name.length)
+            ]);
+      } else {
+        classBuilder.addProblem(messageInheritedMembersConflict,
+            classBuilder.charOffset, classBuilder.fullNameForErrors.length,
+            context: _inheritedConflictContext(a, b));
+      }
+    } else if (a.isStatic != b.isStatic) {
+      ClassMember staticMember;
+      ClassMember instanceMember;
+      if (a.isStatic) {
+        staticMember = a;
+        instanceMember = b;
+      } else {
+        staticMember = b;
+        instanceMember = a;
+      }
+      classBuilder.library.addProblem(messageStaticAndInstanceConflict,
+          staticMember.charOffset, name.length, staticMember.fileUri,
+          context: <LocatedMessage>[
+            messageStaticAndInstanceConflictCause.withLocation(
+                instanceMember.fileUri, instanceMember.charOffset, name.length)
+          ]);
+    } else {
+      // This message can be reported twice (when merging localMembers with
+      // classSetters, or localSetters with classMembers). By ensuring that
+      // we always report the one with higher charOffset as the duplicate,
+      // the message duplication logic ensures that we only report this
+      // problem once.
+      ClassMember existing;
+      ClassMember duplicate;
+      assert(a.fileUri == b.fileUri);
+      if (a.charOffset < b.charOffset) {
+        existing = a;
+        duplicate = b;
+      } else {
+        existing = b;
+        duplicate = a;
+      }
+      classBuilder.library.addProblem(
+          templateDuplicatedDeclaration.withArguments(name),
+          duplicate.charOffset,
+          name.length,
+          duplicate.fileUri,
+          context: <LocatedMessage>[
+            templateDuplicatedDeclarationCause.withArguments(name).withLocation(
+                existing.fileUri, existing.charOffset, name.length)
+          ]);
+    }
+  }
+
+  ClassMembersNode build() {
+    ClassMembersNode? supernode = _hierarchyNode.supernode != null
+        ? _membersBuilder
+            .getNodeFromClassBuilder(_hierarchyNode.supernode!.classBuilder)
+        : null;
+    List<TypeBuilder>? directInterfaceBuilders =
+        _hierarchyNode.directInterfaceBuilders;
+
+    /// Set to `true` if the class needs interfaces, that is, if it has any
+    /// members where the interface member is different from its corresponding
+    /// class members.
+    ///
+    /// This is an optimization to avoid unnecessary computation of interface
+    /// members.
+    bool hasInterfaces = false;
+
+    Map<Name, Tuple> memberMap = {};
+
+    Scope scope = classBuilder.scope;
+
+    for (Builder builder in scope.localMembers) {
+      MemberBuilder memberBuilder = builder as MemberBuilder;
+      for (ClassMember classMember in memberBuilder.localMembers) {
+        if (classMember.isAbstract) {
+          hasInterfaces = true;
+        }
+        Tuple? tuple = memberMap[classMember.name];
+        if (tuple == null) {
+          memberMap[classMember.name] = new Tuple.declareMember(classMember);
+        } else {
+          tuple.declaredMember = classMember;
+        }
+      }
+      for (ClassMember classMember in memberBuilder.localSetters) {
+        if (classMember.isAbstract) {
+          hasInterfaces = true;
+        }
+        Tuple? tuple = memberMap[classMember.name];
+        if (tuple == null) {
+          memberMap[classMember.name] = new Tuple.declareSetter(classMember);
+        } else {
+          tuple.declaredSetter = classMember;
+        }
+      }
+    }
+
+    for (MemberBuilder memberBuilder in scope.localSetters) {
+      for (ClassMember classMember in memberBuilder.localMembers) {
+        if (classMember.isAbstract) {
+          hasInterfaces = true;
+        }
+        Tuple? tuple = memberMap[classMember.name];
+        if (tuple == null) {
+          memberMap[classMember.name] = new Tuple.declareMember(classMember);
+        } else {
+          tuple.declaredMember = classMember;
+        }
+      }
+      for (ClassMember classMember in memberBuilder.localSetters) {
+        if (classMember.isAbstract) {
+          hasInterfaces = true;
+        }
+        Tuple? tuple = memberMap[classMember.name];
+        if (tuple == null) {
+          memberMap[classMember.name] = new Tuple.declareSetter(classMember);
+        } else {
+          tuple.declaredSetter = classMember;
+        }
+      }
+    }
+
+    if (classBuilder.isMixinApplication) {
+      TypeBuilder mixedInTypeBuilder = classBuilder.mixedInTypeBuilder!;
+      TypeDeclarationBuilder mixin = mixedInTypeBuilder.declaration!;
+      while (mixin.isNamedMixinApplication) {
+        ClassBuilder named = mixin as ClassBuilder;
+        mixedInTypeBuilder = named.mixedInTypeBuilder!;
+        mixin = mixedInTypeBuilder.declaration!;
+      }
+      if (mixin is TypeAliasBuilder) {
+        TypeAliasBuilder aliasBuilder = mixin;
+        NamedTypeBuilder namedBuilder = mixedInTypeBuilder as NamedTypeBuilder;
+        mixin = aliasBuilder.unaliasDeclaration(namedBuilder.arguments,
+            isUsedAsClass: true,
+            usedAsClassCharOffset: namedBuilder.charOffset,
+            usedAsClassFileUri: namedBuilder.fileUri)!;
+      }
+      if (mixin is ClassBuilder) {
+        scope = mixin.scope.computeMixinScope();
+
+        for (Builder builder in scope.localMembers) {
+          MemberBuilder memberBuilder = builder as MemberBuilder;
+          for (ClassMember classMember in memberBuilder.localMembers) {
+            if (classMember.isAbstract) {
+              hasInterfaces = true;
+            }
+            Tuple? tuple = memberMap[classMember.name];
+            if (tuple == null) {
+              memberMap[classMember.name] = new Tuple.mixInMember(classMember);
+            } else {
+              tuple.mixedInMember = classMember;
+            }
+          }
+          for (ClassMember classMember in memberBuilder.localSetters) {
+            if (classMember.isAbstract) {
+              hasInterfaces = true;
+            }
+            Tuple? tuple = memberMap[classMember.name];
+            if (tuple == null) {
+              memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
+            } else {
+              tuple.mixedInSetter = classMember;
+            }
+          }
+        }
+
+        for (MemberBuilder memberBuilder in scope.localSetters) {
+          for (ClassMember classMember in memberBuilder.localMembers) {
+            if (classMember.isAbstract) {
+              hasInterfaces = true;
+            }
+            Tuple? tuple = memberMap[classMember.name];
+            if (tuple == null) {
+              memberMap[classMember.name] = new Tuple.mixInMember(classMember);
+            } else {
+              tuple.mixedInMember = classMember;
+            }
+          }
+          for (ClassMember classMember in memberBuilder.localSetters) {
+            if (classMember.isAbstract) {
+              hasInterfaces = true;
+            }
+            Tuple? tuple = memberMap[classMember.name];
+            if (tuple == null) {
+              memberMap[classMember.name] = new Tuple.mixInSetter(classMember);
+            } else {
+              tuple.mixedInSetter = classMember;
+            }
+          }
+        }
+      }
+    }
+
+    void extend(Map<Name, ClassMember>? superClassMembers) {
+      if (superClassMembers == null) return;
+      for (MapEntry<Name, ClassMember> entry in superClassMembers.entries) {
+        Name name = entry.key;
+        ClassMember superClassMember = entry.value;
+        Tuple? tuple = memberMap[name];
+        if (tuple != null) {
+          if (superClassMember.forSetter) {
+            tuple.extendedSetter = superClassMember;
+          } else {
+            tuple.extendedMember = superClassMember;
+          }
+        } else {
+          if (superClassMember.forSetter) {
+            memberMap[name] = new Tuple.extendSetter(superClassMember);
+          } else {
+            memberMap[name] = new Tuple.extendMember(superClassMember);
+          }
+        }
+      }
+    }
+
+    void implement(Map<Name, ClassMember>? superInterfaceMembers) {
+      if (superInterfaceMembers == null) return;
+      for (MapEntry<Name, ClassMember> entry in superInterfaceMembers.entries) {
+        Name name = entry.key;
+        ClassMember superInterfaceMember = entry.value;
+        Tuple? tuple = memberMap[name];
+        if (tuple != null) {
+          if (superInterfaceMember.forSetter) {
+            tuple.addImplementedSetter(superInterfaceMember);
+          } else {
+            tuple.addImplementedMember(superInterfaceMember);
+          }
+        } else {
+          if (superInterfaceMember.forSetter) {
+            memberMap[superInterfaceMember.name] =
+                new Tuple.implementSetter(superInterfaceMember);
+          } else {
+            memberMap[superInterfaceMember.name] =
+                new Tuple.implementMember(superInterfaceMember);
+          }
+        }
+      }
+    }
+
+    if (supernode == null) {
+      // This should be Object.
+    } else {
+      extend(supernode.classMemberMap);
+      extend(supernode.classSetterMap);
+
+      if (supernode.interfaceMemberMap != null ||
+          supernode.interfaceSetterMap != null) {
+        hasInterfaces = true;
+      }
+
+      if (hasInterfaces) {
+        implement(supernode.interfaceMemberMap ?? supernode.classMemberMap);
+        implement(supernode.interfaceSetterMap ?? supernode.classSetterMap);
+      }
+
+      if (directInterfaceBuilders != null) {
+        for (int i = 0; i < directInterfaceBuilders.length; i++) {
+          ClassMembersNode? interfaceNode = _membersBuilder
+              .getNodeFromTypeBuilder(directInterfaceBuilders[i]);
+          if (interfaceNode != null) {
+            hasInterfaces = true;
+
+            implement(interfaceNode.interfaceMemberMap ??
+                interfaceNode.classMemberMap);
+            implement(interfaceNode.interfaceSetterMap ??
+                interfaceNode.classSetterMap);
+          }
+        }
+      }
+    }
+
+    /// Members (excluding setters) declared in [cls] or its superclasses. This
+    /// includes static methods of [cls], but not its superclasses.
+    Map<Name, ClassMember> classMemberMap = {};
+
+    /// Setters declared in [cls] or its superclasses. This includes static
+    /// setters of [cls], but not its superclasses.
+    Map<Name, ClassMember> classSetterMap = {};
+
+    /// Members (excluding setters) inherited from interfaces. This contains no
+    /// static members. If no interfaces are implemented by this class or its
+    /// superclasses this is identical to [classMemberMap] and we do not store
+    /// it in the [ClassHierarchyNode].
+    Map<Name, ClassMember>? interfaceMemberMap = {};
+
+    /// Setters inherited from interfaces. This contains no static setters. If
+    /// no interfaces are implemented by this class or its superclasses this is
+    /// identical to [classSetterMap] and we do not store it in the
+    /// [ClassHierarchyNode].
+    Map<Name, ClassMember>? interfaceSetterMap = {};
+
+    /// Map for members declared in this class to the members that they
+    /// override. This is used for checking valid overrides and to ensure that
+    /// override inference correctly propagates inferred types through the
+    /// class hierarchy.
+    Map<ClassMember, Set<ClassMember>> declaredOverridesMap = {};
+
+    /// In case this class is a mixin application, this maps members declared in
+    /// the mixin to the members that they override. This is used for checking
+    /// valid overrides but _not_ as for [declaredOverridesMap] for override
+    /// inference.
+    Map<ClassMember, Set<ClassMember>> mixinApplicationOverridesMap = {};
+
+    /// In case this class is concrete, this maps concrete members that are
+    /// inherited into this class to the members they should override to validly
+    /// implement the interface of this class.
+    Map<ClassMember, Set<ClassMember>> inheritedImplementsMap = {};
+
+    /// In case this class is concrete, this holds the interface members
+    /// without a corresponding class member. These are either reported as
+    /// missing implementations or trigger insertion of noSuchMethod forwarders.
+    List<ClassMember>? abstractMembers = [];
+
+    ClassHierarchyNodeDataForTesting? dataForTesting;
+    if (retainDataForTesting) {
+      dataForTesting = new ClassHierarchyNodeDataForTesting(
+          abstractMembers,
+          declaredOverridesMap,
+          mixinApplicationOverridesMap,
+          inheritedImplementsMap);
+    }
+
+    /// Registers that the current class has an interface member without a
+    /// corresponding class member.
+    ///
+    /// This is used to report missing implementation or, in the case the class
+    /// has a user defined concrete noSuchMethod, to insert noSuchMethod
+    /// forwarders. (Currently, insertion of forwarders is handled elsewhere.)
+    ///
+    /// For instance:
+    ///
+    ///    abstract class Interface {
+    ///      method();
+    ///    }
+    ///    class Class1 implements Interface {
+    ///      // Missing implementation for `Interface.method`.
+    ///    }
+    ///    class Class2 implements Interface {
+    ///      noSuchMethod(_) {}
+    ///      // A noSuchMethod forwarder is added for `Interface.method`.
+    ///    }
+    ///
+    void registerAbstractMember(ClassMember abstractMember) {
+      if (!abstractMember.isInternalImplementation) {
+        /// If `isInternalImplementation` is `true`, the member is synthesized
+        /// implementation that does not require implementation in other
+        /// classes.
+        ///
+        /// This is for instance used for late lowering where
+        ///
+        ///    class Interface {
+        ///      late int? field;
+        ///    }
+        ///    class Class implements Interface {
+        ///      int? field;
+        ///    }
+        ///
+        /// is encoded as
+        ///
+        ///    class Interface {
+        ///      bool _#field#isSet = false;
+        ///      int? _#field = null;
+        ///      int? get field => _#field#isSet ? _#field : throw ...;
+        ///      void set field(int? value) { ... }
+        ///    }
+        ///    class Class implements Interface {
+        ///      int? field;
+        ///    }
+        ///
+        /// and `Class` should not be required to implement
+        /// `Interface._#field#isSet` and `Interface._#field`.
+        abstractMembers.add(abstractMember);
+      }
+    }
+
+    /// Registers that [inheritedMember] should be checked to validly override
+    /// [overrides].
+    ///
+    /// This is needed in the case where a concrete member is inherited into
+    /// a concrete subclass. For instance:
+    ///
+    ///    class Super {
+    ///      void method() {}
+    ///    }
+    ///    abstract class Interface {
+    ///      void method();
+    ///    }
+    ///    class Class extends Super implements Interface {}
+    ///
+    /// Here `Super.method` must be checked to be a valid implementation for
+    /// `Interface.method` by being a valid override of it.
+    void registerInheritedImplements(
+        ClassMember inheritedMember, Set<ClassMember> overrides,
+        {required ClassMember aliasForTesting}) {
+      if (classBuilder is SourceClassBuilder) {
+        assert(
+            inheritedMember.classBuilder != classBuilder,
+            "Only inherited members can implement by inheritance: "
+            "${inheritedMember}");
+        inheritedImplementsMap[inheritedMember] = overrides;
+        // ignore: unnecessary_null_comparison
+        if (dataForTesting != null && aliasForTesting != null) {
+          dataForTesting.aliasMap[aliasForTesting] = inheritedMember;
+        }
+      }
+    }
+
+    /// Returns `true` if the current class is from an opt-out library and
+    /// [classMember] is from an opt-in library.
+    ///
+    /// In this case a member signature needs to be inserted to show the
+    /// legacy erased type of the interface member. For instance:
+    ///
+    ///    // Opt-in library:
+    ///    class Super {
+    ///      int? method(int i) {}
+    ///    }
+    ///    // Opt-out library:
+    ///    class Class extends Super {
+    ///      // A member signature is inserted:
+    ///      // int* method(int* i);
+    ///    }
+    ///
+    bool needsMemberSignatureFor(ClassMember classMember) {
+      return !classBuilder.library.isNonNullableByDefault &&
+          classMember.classBuilder.library.isNonNullableByDefault;
+    }
+
+    memberMap.forEach((Name name, Tuple tuple) {
+      /// The computation starts by sanitizing the members. Conflicts between
+      /// methods and properties (getters/setters) or between static and
+      /// instance members are reported. Conflicting members and members
+      /// overridden by duplicates are removed.
+      ///
+      /// For this [definingGetable] and [definingSetable] hold the first member
+      /// of its kind found among declared, mixed in, extended and implemented
+      /// members.
+      ///
+      /// Conflicts between [definingGetable] and [definingSetable] are reported
+      /// afterwards.
+
+      ClassMember? definingGetable;
+      ClassMember? definingSetable;
+
+      ClassMember? declaredGetable = tuple.declaredMember;
+      if (declaredGetable != null) {
+        /// class Class {
+        ///   method() {}
+        /// }
+        definingGetable = declaredGetable;
+      }
+      ClassMember? declaredSetable = tuple.declaredSetter;
+      if (declaredSetable != null) {
+        /// class Class {
+        ///   set setter(value) {}
+        /// }
+        definingSetable = declaredSetable;
+      }
+
+      ClassMember? mixedInGetable;
+      ClassMember? tupleMixedInMember = tuple.mixedInMember;
+      if (tupleMixedInMember != null &&
+          !tupleMixedInMember.isStatic &&
+          !tupleMixedInMember.isDuplicate &&
+          !tupleMixedInMember.isSynthesized) {
+        /// We treat
+        ///
+        ///   opt-in:
+        ///   class Interface {
+        ///     method3() {}
+        ///   }
+        ///   opt-out:
+        ///   class Mixin implements Interface {
+        ///     static method1() {}
+        ///     method2() {}
+        ///     method2() {}
+        ///     /*member-signature*/ method3() {}
+        ///   }
+        ///   class Class with Mixin {}
+        ///
+        /// as
+        ///
+        ///   class Mixin {}
+        ///   class Class with Mixin {}
+        ///
+        /// Note that skipped synthetic getable 'method3' is still included
+        /// in the implemented getables, but its type will not define the type
+        /// when mixed in. For instance
+        ///
+        ///   opt-in:
+        ///   abstract class Interface {
+        ///     num get getter;
+        ///   }
+        ///   opt-out:
+        ///   abstract class Super {
+        ///     int get getter;
+        ///   }
+        ///   abstract class Mixin implements Interface {
+        ///     /*member-signature*/ num get getter;
+        ///   }
+        ///   abstract class Class extends Super with Mixin {}
+        ///
+        /// Here the type of `Class.getter` should not be defined from the
+        /// synthetic member signature `Mixin.getter` but as a combined member
+        /// signature of `Super.getter` and `Mixin.getter`, resulting in type
+        /// `int` instead of `num`.
+        if (definingGetable == null) {
+          /// class Mixin {
+          ///   method() {}
+          /// }
+          /// class Class with Mixin {}
+          definingGetable = mixedInGetable = tupleMixedInMember;
+        } else if (!definingGetable.isDuplicate) {
+          // This case is currently unreachable from source code since classes
+          // cannot both declare and mix in members. From dill, this can occur
+          // but should not conflicting members.
+          //
+          // The case is handled for consistency.
+          if (definingGetable.isStatic ||
+              definingGetable.isProperty != tupleMixedInMember.isProperty) {
+            reportInheritanceConflict(definingGetable, tupleMixedInMember);
+          } else {
+            mixedInGetable = tupleMixedInMember;
+          }
+        }
+      }
+      ClassMember? mixedInSetable;
+      ClassMember? tupleMixedInSetter = tuple.mixedInSetter;
+      if (tupleMixedInSetter != null &&
+          !tupleMixedInSetter.isStatic &&
+          !tupleMixedInSetter.isDuplicate &&
+          !tupleMixedInSetter.isSynthesized) {
+        /// We treat
+        ///
+        ///   class Mixin {
+        ///     static set setter1(value) {}
+        ///     set setter2(value) {}
+        ///     set setter2(value) {}
+        ///     /*member-signature*/ setter3() {}
+        ///   }
+        ///   class Class with Mixin {}
+        ///
+        /// as
+        ///
+        ///   class Mixin {}
+        ///   class Class with Mixin {}
+        ///
+        /// Note that skipped synthetic setable 'setter3' is still included
+        /// in the implemented setables, but its type will not define the type
+        /// when mixed in. For instance
+        ///
+        ///   opt-in:
+        ///   abstract class Interface {
+        ///     void set setter(int value);
+        ///   }
+        ///   opt-out:
+        ///   abstract class Super {
+        ///     void set setter(num value);
+        ///   }
+        ///   abstract class Mixin implements Interface {
+        ///     /*member-signature*/ num get getter;
+        ///   }
+        ///   abstract class Class extends Super with Mixin {}
+        ///
+        /// Here the type of `Class.setter` should not be defined from the
+        /// synthetic member signature `Mixin.setter` but as a combined member
+        /// signature of `Super.setter` and `Mixin.setter`, resulting in type
+        /// `num` instead of `int`.
+        if (definingSetable == null) {
+          /// class Mixin {
+          ///   set setter(value) {}
+          /// }
+          /// class Class with Mixin {}
+          definingSetable = mixedInSetable = tupleMixedInSetter;
+        } else if (!definingSetable.isDuplicate) {
+          if (definingSetable.isStatic ||
+              definingSetable.isProperty != tupleMixedInSetter.isProperty) {
+            reportInheritanceConflict(definingSetable, tupleMixedInSetter);
+          } else {
+            mixedInSetable = tupleMixedInSetter;
+          }
+        }
+      }
+
+      ClassMember? extendedGetable;
+      ClassMember? tupleExtendedMember = tuple.extendedMember;
+      if (tupleExtendedMember != null &&
+          !tupleExtendedMember.isStatic &&
+          !tupleExtendedMember.isDuplicate) {
+        /// We treat
+        ///
+        ///   class Super {
+        ///     static method1() {}
+        ///     method2() {}
+        ///     method2() {}
+        ///   }
+        ///   class Class extends Super {}
+        ///
+        /// as
+        ///
+        ///   class Super {}
+        ///   class Class extends Super {}
+        ///
+        if (definingGetable == null) {
+          /// class Super {
+          ///   method() {}
+          /// }
+          /// class Class extends Super {}
+          definingGetable = extendedGetable = tupleExtendedMember;
+        } else if (!definingGetable.isDuplicate) {
+          if (definingGetable.isStatic ||
+              definingGetable.isProperty != tupleExtendedMember.isProperty) {
+            ///   class Super {
+            ///     method() {}
+            ///   }
+            ///   class Class extends Super {
+            ///     static method() {}
+            ///   }
+            ///
+            /// or
+            ///
+            ///   class Super {
+            ///     method() {}
+            ///   }
+            ///   class Class extends Super {
+            ///     get getter => 0;
+            ///   }
+            reportInheritanceConflict(definingGetable, tupleExtendedMember);
+          } else {
+            extendedGetable = tupleExtendedMember;
+          }
+        }
+      }
+      ClassMember? extendedSetable;
+      ClassMember? tupleExtendedSetter = tuple.extendedSetter;
+      if (tupleExtendedSetter != null &&
+          !tupleExtendedSetter.isStatic &&
+          !tupleExtendedSetter.isDuplicate) {
+        /// We treat
+        ///
+        ///   class Super {
+        ///     static set setter1(value) {}
+        ///     set setter2(value) {}
+        ///     set setter2(value) {}
+        ///   }
+        ///   class Class extends Super {}
+        ///
+        /// as
+        ///
+        ///   class Super {}
+        ///   class Class extends Super {}
+        ///
+        if (definingSetable == null) {
+          /// class Super {
+          ///   set setter(value) {}
+          /// }
+          /// class Class extends Super {}
+          definingSetable = extendedSetable = tupleExtendedSetter;
+        } else if (!definingSetable.isDuplicate) {
+          if (definingSetable.isStatic ||
+              definingSetable.isProperty != tupleExtendedSetter.isProperty) {
+            reportInheritanceConflict(definingSetable, tupleExtendedSetter);
+          } else {
+            extendedSetable = tupleExtendedSetter;
+          }
+        }
+      }
+
+      // TODO(johnniwinther): Remove extended and mixed in members/setters
+      // from implemented members/setters. Mixin applications always implement
+      // the mixin class leading to unnecessary interface members.
+      List<ClassMember>? implementedGetables;
+      List<ClassMember>? tupleImplementedMembers = tuple.implementedMembers;
+      if (tupleImplementedMembers != null &&
+          // Skip implemented members if we already have a duplicate.
+          !(definingGetable != null && definingGetable.isDuplicate)) {
+        for (int i = 0; i < tupleImplementedMembers.length; i++) {
+          ClassMember? implementedGetable = tupleImplementedMembers[i];
+          if (implementedGetable.isStatic || implementedGetable.isDuplicate) {
+            /// We treat
+            ///
+            ///   class Interface {
+            ///     static method1() {}
+            ///     method2() {}
+            ///     method2() {}
+            ///   }
+            ///   class Class implements Interface {}
+            ///
+            /// as
+            ///
+            ///   class Interface {}
+            ///   class Class implements Interface {}
+            ///
+            implementedGetable = null;
+          } else {
+            if (definingGetable == null) {
+              /// class Interface {
+              ///   method() {}
+              /// }
+              /// class Class implements Interface {}
+              definingGetable = implementedGetable;
+            } else if (definingGetable.isStatic ||
+                definingGetable.isProperty != implementedGetable.isProperty) {
+              ///   class Interface {
+              ///     method() {}
+              ///   }
+              ///   class Class implements Interface {
+              ///     static method() {}
+              ///   }
+              ///
+              /// or
+              ///
+              ///   class Interface {
+              ///     method() {}
+              ///   }
+              ///   class Class implements Interface {
+              ///     get getter => 0;
+              ///   }
+              reportInheritanceConflict(definingGetable, implementedGetable);
+              implementedGetable = null;
+            }
+          }
+          if (implementedGetable == null) {
+            // On the first skipped member we add all previous.
+            implementedGetables ??= tupleImplementedMembers.take(i).toList();
+          } else if (implementedGetables != null) {
+            // If already skipping members we add [implementedGetable]
+            // explicitly.
+            implementedGetables.add(implementedGetable);
+          }
+        }
+        if (implementedGetables == null) {
+          // No members were skipped so we use the full list.
+          implementedGetables = tupleImplementedMembers;
+        } else if (implementedGetables.isEmpty) {
+          // No members were included.
+          implementedGetables = null;
+        }
+      }
+
+      List<ClassMember>? implementedSetables;
+      List<ClassMember>? tupleImplementedSetters = tuple.implementedSetters;
+      if (tupleImplementedSetters != null &&
+          // Skip implemented setters if we already have a duplicate.
+          !(definingSetable != null && definingSetable.isDuplicate)) {
+        for (int i = 0; i < tupleImplementedSetters.length; i++) {
+          ClassMember? implementedSetable = tupleImplementedSetters[i];
+          if (implementedSetable.isStatic || implementedSetable.isDuplicate) {
+            /// We treat
+            ///
+            ///   class Interface {
+            ///     static set setter1(value) {}
+            ///     set setter2(value) {}
+            ///     set setter2(value) {}
+            ///   }
+            ///   class Class implements Interface {}
+            ///
+            /// as
+            ///
+            ///   class Interface {}
+            ///   class Class implements Interface {}
+            ///
+            implementedSetable = null;
+          } else {
+            if (definingSetable == null) {
+              /// class Interface {
+              ///   set setter(value) {}
+              /// }
+              /// class Class implements Interface {}
+              definingSetable = implementedSetable;
+            } else if (definingSetable.isStatic ||
+                definingSetable.isProperty != implementedSetable.isProperty) {
+              /// class Interface {
+              ///   set setter(value) {}
+              /// }
+              /// class Class implements Interface {
+              ///   static set setter(value) {}
+              /// }
+              reportInheritanceConflict(definingSetable, implementedSetable);
+              implementedSetable = null;
+            }
+          }
+          if (implementedSetable == null) {
+            // On the first skipped setter we add all previous.
+            implementedSetables ??= tupleImplementedSetters.take(i).toList();
+          } else if (implementedSetables != null) {
+            // If already skipping setters we add [implementedSetable]
+            // explicitly.
+            implementedSetables.add(implementedSetable);
+          }
+        }
+        if (implementedSetables == null) {
+          // No setters were skipped so we use the full list.
+          implementedSetables = tupleImplementedSetters;
+        } else if (implementedSetables.isEmpty) {
+          // No setters were included.
+          implementedSetables = null;
+        }
+      }
+
+      if (definingGetable != null && definingSetable != null) {
+        if (definingGetable.isStatic != definingSetable.isStatic ||
+            definingGetable.isProperty != definingSetable.isProperty) {
+          reportInheritanceConflict(definingGetable, definingSetable);
+          // TODO(johnniwinther): Should we remove [definingSetable]? If we
+          // leave it in this conflict will also be reported in subclasses. If
+          // we remove it, any write to the setable will be unresolved.
+        }
+      }
+
+      // TODO(johnniwinther): Handle declared members together with mixed in
+      // members. This should only occur from .dill, though.
+      if (mixedInGetable != null) {
+        declaredGetable = null;
+      }
+      if (mixedInSetable != null) {
+        declaredSetable = null;
+      }
+
+      /// Set to `true` if declared members have been registered in
+      /// [registerDeclaredOverride] or [registerMixedInOverride].
+      bool hasDeclaredMembers = false;
+
+      /// Declared methods, getters and setters registered in
+      /// [registerDeclaredOverride].
+      ClassMember? declaredMethod;
+      List<ClassMember>? declaredProperties;
+
+      /// Declared methods, getters and setters registered in
+      /// [registerDeclaredOverride].
+      ClassMember? mixedInMethod;
+      List<ClassMember>? mixedInProperties;
+
+      /// Registers that [declaredMember] overrides extended and implemented
+      /// members.
+      ///
+      /// Getters and setters share overridden members so the registration
+      /// of override relations is performed after the interface members have
+      /// been computed.
+      ///
+      /// Declared members must be checked for valid override of the overridden
+      /// members _and_ must register an override dependency with the overridden
+      /// members so that override inference can propagate inferred types
+      /// correctly. For instance:
+      ///
+      ///    class Super {
+      ///      int get property => 42;
+      ///    }
+      ///    class Class extends Super {
+      ///      void set property(value) {}
+      ///    }
+      ///
+      /// Here the parameter type of the setter `Class.property` must be
+      /// inferred from the type of the getter `Super.property`.
+      void registerDeclaredOverride(ClassMember declaredMember,
+          {ClassMember? aliasForTesting}) {
+        if (classBuilder is SourceClassBuilder && !declaredMember.isStatic) {
+          assert(
+              declaredMember.isSourceDeclaration &&
+                  declaredMember.classBuilder == classBuilder,
+              "Only declared members can override: ${declaredMember}");
+          hasDeclaredMembers = true;
+          if (declaredMember.isProperty) {
+            declaredProperties ??= [];
+            declaredProperties!.add(declaredMember);
+          } else {
+            assert(
+                declaredMethod == null,
+                "Multiple methods unexpectedly declared: "
+                "${declaredMethod} and ${declaredMember}.");
+            declaredMethod = declaredMember;
+          }
+          if (dataForTesting != null && aliasForTesting != null) {
+            dataForTesting.aliasMap[aliasForTesting] = declaredMember;
+          }
+        }
+      }
+
+      /// Registers that [mixedMember] overrides extended and implemented
+      /// members through application.
+      ///
+      /// Getters and setters share overridden members so the registration
+      /// of override relations in performed after the interface members have
+      /// been computed.
+      ///
+      /// Declared mixed in members must be checked for valid override of the
+      /// overridden members but _not_ register an override dependency with the
+      /// overridden members. This is in contrast to declared members. For
+      /// instance:
+      ///
+      ///    class Super {
+      ///      int get property => 42;
+      ///    }
+      ///    class Mixin {
+      ///      void set property(value) {}
+      ///    }
+      ///    class Class = Super with Mixin;
+      ///
+      /// Here the parameter type of the setter `Mixin.property` must _not_ be
+      /// inferred from the type of the getter `Super.property`, but should
+      /// instead default to `dynamic`.
+      void registerMixedInOverride(ClassMember mixedInMember,
+          {ClassMember? aliasForTesting}) {
+        assert(mixedInMember.classBuilder != classBuilder,
+            "Only mixin members can override by application: ${mixedInMember}");
+        if (classBuilder is SourceClassBuilder) {
+          hasDeclaredMembers = true;
+          if (mixedInMember.isProperty) {
+            mixedInProperties ??= [];
+            mixedInProperties!.add(mixedInMember);
+          } else {
+            assert(
+                mixedInMethod == null,
+                "Multiple methods unexpectedly declared in mixin: "
+                "${mixedInMethod} and ${mixedInMember}.");
+            mixedInMethod = mixedInMember;
+          }
+          if (dataForTesting != null && aliasForTesting != null) {
+            dataForTesting.aliasMap[aliasForTesting] = mixedInMember;
+          }
+        }
+      }
+
+      /// Computes the class and interface members for a method, getter, or
+      /// setter in the current [tuple].
+      ///
+      /// [definingMember] is the member which defines whether the computation
+      /// is for a method, a getter or a setter.
+      /// [declaredMember] is the member declared in the current class, if any.
+      /// [mixedInMember] is the member declared in a mixin that is mixed into
+      /// the current current class, if any.
+      /// [extendedMember] is the member inherited from the super class.
+      /// [implementedMembers] are the members inherited from the super
+      /// interfaces, if none this is `null`.
+      ///
+      /// The computed class and interface members are added to [classMemberMap]
+      /// and [interfaceMemberMap], respectively.
+      ClassMember? computeMembers(
+          {required ClassMember definingMember,
+          required ClassMember? declaredMember,
+          required ClassMember? mixedInMember,
+          required ClassMember? extendedMember,
+          required List<ClassMember>? implementedMembers,
+          required Map<Name, ClassMember> classMemberMap,
+          required Map<Name, ClassMember>? interfaceMemberMap}) {
+        ClassMember? classMember;
+        ClassMember? interfaceMember;
+
+        if (mixedInMember != null) {
+          if (mixedInMember.isAbstract) {
+            ///    class Mixin {
+            ///      method();
+            ///    }
+            ///    class Class = Object with Mixin;
+
+            /// Interface members from the extended, mixed in, and implemented
+            /// members define the combined member signature.
+            Set<ClassMember> interfaceMembers = {};
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method();
+              ///    }
+              ///    class Class = Super with Mixin;
+              interfaceMembers.add(extendedMember.interfaceMember);
+            }
+
+            interfaceMembers.add(mixedInMember);
+
+            if (implementedMembers != null) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method();
+              ///    }
+              ///    class Class = Object with Mixin implements Interface;
+              interfaceMembers.addAll(implementedMembers);
+            }
+
+            /// We always create a synthesized interface member, even in the
+            /// case of [interfaceMembers] being a singleton, to insert the
+            /// abstract mixin stub.
+            interfaceMember = new SynthesizedInterfaceMember(
+                classBuilder, name, interfaceMembers.toList(),
+                superClassMember: extendedMember,
+                // [definingMember] and [mixedInMember] are always the same
+                // here. Use the latter here and the former below to show the
+                // the member is canonical _because_ its the mixed in member and
+                // it defines the isProperty/forSetter properties _because_ it
+                // is the defining member.
+                canonicalMember: mixedInMember,
+                mixedInMember: mixedInMember,
+                isProperty: definingMember.isProperty,
+                forSetter: definingMember.forSetter,
+                shouldModifyKernel: shouldModifyKernel);
+            _membersBuilder.registerMemberComputation(interfaceMember);
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method();
+              ///    }
+              ///    class Class = Super with Mixin;
+              ///
+              /// The concrete extended member is the class member but might
+              /// be overwritten by a concrete forwarding stub:
+              ///
+              ///    class Super {
+              ///      method(int i) {}
+              ///    }
+              ///    class Interface {
+              ///      method(covariant int i) {}
+              ///    }
+              ///    class Mixin {
+              ///      method(int i);
+              ///    }
+              ///    // A concrete forwarding stub
+              ///    //   method(covariant int i) => super.method(i);
+              ///    // will be inserted.
+              ///    class Class = Super with Mixin implements Interface;
+              ///
+              classMember = new InheritedClassMemberImplementsInterface(
+                  classBuilder, name,
+                  inheritedClassMember: extendedMember,
+                  implementedInterfaceMember: interfaceMember,
+                  forSetter: definingMember.forSetter,
+                  isProperty: definingMember.isProperty);
+              _membersBuilder.registerMemberComputation(classMember);
+              if (!classBuilder.isAbstract) {
+                registerInheritedImplements(extendedMember, {interfaceMember},
+                    aliasForTesting: classMember);
+              }
+            } else if (!classBuilder.isAbstract) {
+              ///    class Mixin {
+              ///      method(); // Missing implementation.
+              ///    }
+              ///    class Class = Object with Mixin;
+              registerAbstractMember(interfaceMember);
+            }
+
+            assert(!mixedInMember.isSynthesized);
+            if (!mixedInMember.isSynthesized) {
+              /// Members declared in the mixin must override extended and
+              /// implemented members.
+              ///
+              /// When loading from .dill the mixed in member might be
+              /// synthesized, for instance a member signature or forwarding
+              /// stub, and this should not be checked to override the extended
+              /// and implemented members:
+              ///
+              ///    // Opt-out library, from source:
+              ///    class Mixin {}
+              ///    // Opt-out library, from .dill:
+              ///    class Mixin {
+              ///      ...
+              ///      String* toString(); // member signature
+              ///    }
+              ///    // Opt-out library, from source:
+              ///    class Class = Object with Mixin;
+              ///    // Mixin.toString should not be checked to override
+              ///    // Object.toString.
+              ///
+              registerMixedInOverride(mixedInMember,
+                  aliasForTesting: interfaceMember);
+            }
+          } else {
+            assert(!mixedInMember.isAbstract);
+
+            ///    class Mixin {
+            ///      method() {}
+            ///    }
+            ///    class Class = Object with Mixin;
+            ///
+
+            /// Interface members from the extended, mixed in, and implemented
+            /// members define the combined member signature.
+            Set<ClassMember> interfaceMembers = {};
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method() {}
+              ///    }
+              ///    class Class = Super with Mixin;
+              interfaceMembers.add(extendedMember.interfaceMember);
+            }
+
+            interfaceMembers.add(mixedInMember);
+
+            if (implementedMembers != null) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method() {}
+              ///    }
+              ///    class Class = Object with Mixin implements Interface;
+              interfaceMembers.addAll(implementedMembers);
+            }
+
+            /// We always create a synthesized interface member, even in the
+            /// case of [interfaceMembers] being a singleton, to insert the
+            /// concrete mixin stub.
+            interfaceMember = new SynthesizedInterfaceMember(
+                classBuilder, name, interfaceMembers.toList(),
+                superClassMember: mixedInMember,
+                // [definingMember] and [mixedInMember] are always the same
+                // here. Use the latter here and the former below to show the
+                // the member is canonical _because_ its the mixed in member and
+                // it defines the isProperty/forSetter properties _because_ it
+                // is the defining member.
+                canonicalMember: mixedInMember,
+                mixedInMember: mixedInMember,
+                isProperty: definingMember.isProperty,
+                forSetter: definingMember.forSetter,
+                shouldModifyKernel: shouldModifyKernel);
+            _membersBuilder.registerMemberComputation(interfaceMember);
+
+            /// The concrete mixed in member is the class member but will
+            /// be overwritten by a concrete mixin stub:
+            ///
+            ///    class Mixin {
+            ///       method() {}
+            ///    }
+            ///    // A concrete mixin stub
+            ///    //   method() => super.method();
+            ///    // will be inserted.
+            ///    class Class = Object with Mixin;
+            ///
+            classMember = new InheritedClassMemberImplementsInterface(
+                classBuilder, name,
+                inheritedClassMember: mixedInMember,
+                implementedInterfaceMember: interfaceMember,
+                forSetter: definingMember.forSetter,
+                isProperty: definingMember.isProperty);
+            _membersBuilder.registerMemberComputation(classMember);
+
+            if (!classBuilder.isAbstract) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Mixin {
+              ///      method() {}
+              ///    }
+              ///    class Class = Object with Mixin;
+              ///
+              /// [mixinMember] must implemented interface member.
+              registerInheritedImplements(mixedInMember, {interfaceMember},
+                  aliasForTesting: classMember);
+            }
+            assert(!mixedInMember.isSynthesized);
+            if (!mixedInMember.isSynthesized) {
+              /// Members declared in the mixin must override extended and
+              /// implemented members.
+              ///
+              /// When loading from .dill the mixed in member might be
+              /// synthesized, for instance a member signature or forwarding
+              /// stub, and this should not be checked to override the extended
+              /// and implemented members.
+              ///
+              /// These synthesized mixed in members should always be abstract
+              /// and therefore not be handled here, but we handled them here
+              /// for consistency.
+              registerMixedInOverride(mixedInMember);
+            }
+          }
+        } else if (declaredMember != null) {
+          if (declaredMember.isAbstract) {
+            ///    class Class {
+            ///      method();
+            ///    }
+            interfaceMember = declaredMember;
+
+            /// Interface members from the declared, extended, and implemented
+            /// members define the combined member signature.
+            Set<ClassMember> interfaceMembers = {};
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super {
+              ///      method();
+              ///    }
+              interfaceMembers.add(extendedMember);
+            }
+
+            interfaceMembers.add(declaredMember);
+
+            if (implementedMembers != null) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class implements Interface {
+              ///      method();
+              ///    }
+              interfaceMembers.addAll(implementedMembers);
+            }
+
+            /// If only one member defines the interface member there is no
+            /// need for a synthesized interface member, since its result will
+            /// simply be that one member.
+            if (interfaceMembers.length > 1) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super implements Interface {
+              ///      method();
+              ///    }
+              interfaceMember = new SynthesizedInterfaceMember(
+                  classBuilder, name, interfaceMembers.toList(),
+                  superClassMember: extendedMember,
+                  // [definingMember] and [declaredMember] are always the same
+                  // here. Use the latter here and the former below to show the
+                  // the member is canonical _because_ its the declared member
+                  // and it defines the isProperty/forSetter properties
+                  // _because_ it is the defining member.
+                  canonicalMember: declaredMember,
+                  isProperty: definingMember.isProperty,
+                  forSetter: definingMember.forSetter,
+                  shouldModifyKernel: shouldModifyKernel);
+              _membersBuilder.registerMemberComputation(interfaceMember);
+            }
+
+            if (extendedMember != null) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super {
+              ///      method();
+              ///    }
+              ///
+              /// The concrete extended member is the class member but might
+              /// be overwritten by a concrete forwarding stub:
+              ///
+              ///    class Super {
+              ///      method(int i) {}
+              ///    }
+              ///    class Interface {
+              ///      method(covariant int i) {}
+              ///    }
+              ///    class Class extends Super implements Interface {
+              ///      // This will be turned into the concrete forwarding stub
+              ///      //    method(covariant int i) => super.method(i);
+              ///      method(int i);
+              ///    }
+              ///
+              classMember = new InheritedClassMemberImplementsInterface(
+                  classBuilder, name,
+                  inheritedClassMember: extendedMember,
+                  implementedInterfaceMember: interfaceMember,
+                  forSetter: definingMember.forSetter,
+                  isProperty: definingMember.isProperty);
+              _membersBuilder.registerMemberComputation(classMember);
+
+              if (!classBuilder.isAbstract) {
+                ///    class Super {
+                ///      method() {}
+                ///    }
+                ///    class Class extends Super {
+                ///      method();
+                ///    }
+                ///
+                /// [extendedMember] must implemented interface member.
+                registerInheritedImplements(extendedMember, {interfaceMember},
+                    aliasForTesting: classMember);
+              }
+            } else if (!classBuilder.isAbstract) {
+              ///    class Class {
+              ///      method(); // Missing implementation.
+              ///    }
+              registerAbstractMember(declaredMember);
+            }
+
+            /// The declared member must override extended and implemented
+            /// members.
+            registerDeclaredOverride(declaredMember,
+                aliasForTesting: interfaceMember);
+          } else {
+            assert(!declaredMember.isAbstract);
+
+            ///    class Class {
+            ///      method() {}
+            ///    }
+            classMember = declaredMember;
+
+            /// The declared member must override extended and implemented
+            /// members.
+            registerDeclaredOverride(declaredMember);
+          }
+        } else if (extendedMember != null) {
+          ///    class Super {
+          ///      method() {}
+          ///    }
+          ///    class Class extends Super {}
+          assert(!extendedMember.isAbstract,
+              "Abstract extended member: ${extendedMember}");
+
+          classMember = extendedMember;
+
+          if (implementedMembers != null) {
+            ///    class Super {
+            ///      method() {}
+            ///    }
+            ///    class Interface {
+            ///      method() {}
+            ///    }
+            ///    class Class extends Super implements Interface {}
+            ClassMember extendedInterfaceMember =
+                extendedMember.interfaceMember;
+
+            /// Interface members from the extended and implemented
+            /// members define the combined member signature.
+            Set<ClassMember> interfaceMembers = {extendedInterfaceMember};
+
+            // TODO(johnniwinther): The extended member might be included in
+            // a synthesized implemented member. For instance:
+            //
+            //    class Super {
+            //      void method() {}
+            //    }
+            //    class Interface {
+            //      void method() {}
+            //    }
+            //    abstract class Class extends Super implements Interface {
+            //      // Synthesized interface member of
+            //      //   {Super.method, Interface.method}
+            //    }
+            //    class Sub extends Class {
+            //      // Super.method implements Class.method =
+            //      //   {Super.method, Interface.method}
+            //      // Synthesized interface member of
+            //      //   {Super.method, Class.method}
+            //    }
+            //
+            // Maybe we should recognize this.
+            interfaceMembers.addAll(implementedMembers);
+
+            /// Normally, if only one member defines the interface member there
+            /// is no need for a synthesized interface member, since its result
+            /// will simply be that one member, but if the extended member is
+            /// from an opt-in library and the current class is from an opt-out
+            /// library we need to create a member signature:
+            ///
+            ///    // Opt-in:
+            ///    class Super {
+            ///      int? method() => null;
+            ///    }
+            ///    class Interface implements Super {}
+            ///    // Opt-out:
+            ///    class Class extends Super implements Interface {
+            ///      // Member signature added:
+            ///      int* method();
+            ///    }
+            ///
+            if (interfaceMembers.length == 1 &&
+                !needsMemberSignatureFor(extendedInterfaceMember)) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface implements Super {}
+              ///    class Class extends Super implements Interface {}
+              interfaceMember = interfaceMembers.first;
+            } else {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super implements Interface {}
+              interfaceMember = new SynthesizedInterfaceMember(
+                  classBuilder, name, interfaceMembers.toList(),
+                  superClassMember: extendedMember,
+                  isProperty: definingMember.isProperty,
+                  forSetter: definingMember.forSetter,
+                  shouldModifyKernel: shouldModifyKernel);
+              _membersBuilder.registerMemberComputation(interfaceMember);
+            }
+            if (interfaceMember == classMember) {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface implements Super {}
+              ///    class Class extends Super implements Interface {}
+              ///
+              /// We keep track of whether a class needs interfaces, that is,
+              /// whether is has any members that have an interface member
+              /// different from its corresponding class member, so we set
+              /// [interfaceMember] to `null` so show that the interface member
+              /// is not needed.
+              interfaceMember = null;
+            } else {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class extends Super implements Interface {}
+              ///
+              /// The concrete extended member is the class member but might
+              /// be overwritten by a concrete forwarding stub:
+              ///
+              ///    class Super {
+              ///      method(int i) {}
+              ///    }
+              ///    class Interface {
+              ///      method(covariant int i) {}
+              ///    }
+              ///    class Class extends Super implements Interface {
+              ///      // A concrete forwarding stub will be created:
+              ///      //    method(covariant int i) => super.method(i);
+              ///    }
+              ///
+              classMember = new InheritedClassMemberImplementsInterface(
+                  classBuilder, name,
+                  inheritedClassMember: extendedMember,
+                  implementedInterfaceMember: interfaceMember,
+                  isProperty: definingMember.isProperty,
+                  forSetter: definingMember.forSetter);
+              _membersBuilder.registerMemberComputation(classMember);
+              if (!classBuilder.isAbstract) {
+                ///    class Super {
+                ///      method() {}
+                ///    }
+                ///    class Interface {
+                ///      method() {}
+                ///    }
+                ///    class Class extends Super implements Interface {}
+                registerInheritedImplements(extendedMember, {interfaceMember},
+                    aliasForTesting: classMember);
+              }
+            }
+          } else if (needsMemberSignatureFor(extendedMember)) {
+            ///    // Opt-in library:
+            ///    class Super {
+            ///      method() {}
+            ///    }
+            ///    // opt-out library:
+            ///    class Class extends Super {}
+            interfaceMember = new SynthesizedInterfaceMember(
+                classBuilder, name, [extendedMember],
+                superClassMember: extendedMember,
+                isProperty: definingMember.isProperty,
+                forSetter: definingMember.forSetter,
+                shouldModifyKernel: shouldModifyKernel);
+            _membersBuilder.registerMemberComputation(interfaceMember);
+
+            /// The concrete extended member is the class member and should
+            /// be able to be overwritten by a synthesized concrete member here,
+            /// but we handle the case for consistency.
+            classMember = new InheritedClassMemberImplementsInterface(
+                classBuilder, name,
+                inheritedClassMember: extendedMember,
+                implementedInterfaceMember: interfaceMember,
+                isProperty: definingMember.isProperty,
+                forSetter: definingMember.forSetter);
+            _membersBuilder.registerMemberComputation(classMember);
+          }
+        } else if (implementedMembers != null) {
+          ///    class Interface {
+          ///      method() {}
+          ///    }
+          ///    class Class implements Interface {}
+          Set<ClassMember> interfaceMembers = implementedMembers.toSet();
+          if (interfaceMembers.isNotEmpty) {
+            /// Normally, if only one member defines the interface member there
+            /// is no need for a synthesized interface member, since its result
+            /// will simply be that one member, but if the implemented member is
+            /// from an opt-in library and the current class is from an opt-out
+            /// library we need to create a member signature:
+            ///
+            ///    // Opt-in:
+            ///    class Interface {
+            ///      int? method() => null;
+            ///    }
+            ///    // Opt-out:
+            ///    class Class implements Interface {
+            ///      // Member signature added:
+            ///      int* method();
+            ///    }
+            ///
+            if (interfaceMembers.length == 1 &&
+                !needsMemberSignatureFor(interfaceMembers.first)) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class implements Interface {}
+              interfaceMember = interfaceMembers.first;
+            } else {
+              ///    class Interface1 {
+              ///      method() {}
+              ///    }
+              ///    class Interface2 {
+              ///      method() {}
+              ///    }
+              ///    class Class implements Interface1, Interface2 {}
+              interfaceMember = new SynthesizedInterfaceMember(
+                  classBuilder, name, interfaceMembers.toList(),
+                  isProperty: definingMember.isProperty,
+                  forSetter: definingMember.forSetter,
+                  shouldModifyKernel: shouldModifyKernel);
+              _membersBuilder.registerMemberComputation(interfaceMember);
+            }
+            if (!classBuilder.isAbstract) {
+              ///    class Interface {
+              ///      method() {}
+              ///    }
+              ///    class Class implements Interface {}
+              for (ClassMember abstractMember in interfaceMembers) {
+                registerAbstractMember(abstractMember);
+              }
+            }
+          }
+        }
+
+        if (interfaceMember != null) {
+          // We have an explicit interface.
+          hasInterfaces = true;
+        }
+        if (classMember != null) {
+          if (name == noSuchMethodName &&
+              !classMember.isObjectMember(objectClass)) {
+            hasNoSuchMethod = true;
+          }
+          classMemberMap[name] = classMember;
+          interfaceMember ??= classMember.interfaceMember;
+        }
+        if (interfaceMember != null) {
+          interfaceMemberMap![name] = interfaceMember;
+        }
+        return interfaceMember;
+      }
+
+      ClassMember? interfaceGetable;
+      if (definingGetable != null) {
+        interfaceGetable = computeMembers(
+            definingMember: definingGetable,
+            declaredMember: declaredGetable,
+            mixedInMember: mixedInGetable,
+            extendedMember: extendedGetable,
+            implementedMembers: implementedGetables,
+            classMemberMap: classMemberMap,
+            interfaceMemberMap: interfaceMemberMap);
+      }
+      ClassMember? interfaceSetable;
+      if (definingSetable != null) {
+        interfaceSetable = computeMembers(
+            definingMember: definingSetable,
+            declaredMember: declaredSetable,
+            mixedInMember: mixedInSetable,
+            extendedMember: extendedSetable,
+            implementedMembers: implementedSetables,
+            classMemberMap: classSetterMap,
+            interfaceMemberMap: interfaceSetterMap);
+      }
+      if (classBuilder is SourceClassBuilder) {
+        if (interfaceGetable != null &&
+            interfaceSetable != null &&
+            interfaceGetable.isProperty &&
+            interfaceSetable.isProperty &&
+            interfaceGetable.isStatic == interfaceSetable.isStatic &&
+            !interfaceGetable.isSameDeclaration(interfaceSetable)) {
+          /// We need to check that the getter type is a subtype of the setter
+          /// type. For instance
+          ///
+          ///    class Super {
+          ///       int get property1 => null;
+          ///       num get property2 => null;
+          ///    }
+          ///    class Mixin {
+          ///       void set property1(num value) {}
+          ///       void set property2(int value) {}
+          ///    }
+          ///    class Class = Super with Mixin;
+          ///
+          /// Here `Super.property1` and `Mixin.property1` form a valid getter/
+          /// setter pair in `Class` because the type of the getter
+          /// `Super.property1` is a subtype of the setter `Mixin.property1`.
+          ///
+          /// In contrast the pair `Super.property2` and `Mixin.property2` is
+          /// not a valid getter/setter in `Class` because the type of the getter
+          /// `Super.property2` is _not_ a subtype of the setter
+          /// `Mixin.property1`.
+          _membersBuilder.registerGetterSetterCheck(
+              classBuilder as SourceClassBuilder,
+              interfaceGetable,
+              interfaceSetable);
+        }
+      }
+      if (hasDeclaredMembers) {
+        Set<ClassMember> getableOverrides = {};
+        Set<ClassMember> setableOverrides = {};
+        if (extendedGetable != null) {
+          ///    (abstract) class Super {
+          ///      method() {}
+          ///      int get property => 0;
+          ///    }
+          ///    (abstract) class Class extends Super {
+          ///      method() {}
+          ///      set property(int value) {}
+          ///    }
+          getableOverrides.add(extendedGetable.interfaceMember);
+        }
+        if (extendedSetable != null) {
+          ///    (abstract) class Super {
+          ///      set setter(int value) {}
+          ///      set property(int value) {}
+          ///    }
+          ///    (abstract) class Class extends Super {
+          ///      set setter(int value) {}
+          ///      int get property => 0;
+          ///    }
+          setableOverrides.add(extendedSetable.interfaceMember);
+        }
+        if (implementedGetables != null) {
+          ///    (abstract) class Interface {
+          ///      method() {}
+          ///      int get property => 0;
+          ///    }
+          ///    (abstract) class Class implements Interface {
+          ///      method() {}
+          ///      set property(int value) {}
+          ///    }
+          getableOverrides.addAll(implementedGetables);
+        }
+        if (implementedSetables != null) {
+          ///    (abstract) class Interface {
+          ///      set setter(int value) {}
+          ///      set property(int value) {}
+          ///    }
+          ///    (abstract) class Class implements Interface {
+          ///      set setter(int value) {}
+          ///      int get property => 0;
+          ///    }
+          setableOverrides.addAll(implementedSetables);
+        }
+        if (getableOverrides.isNotEmpty || setableOverrides.isNotEmpty) {
+          if (declaredMethod != null && getableOverrides.isNotEmpty) {
+            ///    class Super {
+            ///      method() {}
+            ///    }
+            ///    class Class extends Super {
+            ///      method() {}
+            ///    }
+            declaredOverridesMap[declaredMethod!] = getableOverrides;
+          }
+          if (declaredProperties != null) {
+            Set<ClassMember> overrides;
+            if (declaredMethod != null) {
+              ///    class Super {
+              ///      set setter() {}
+              ///    }
+              ///    class Class extends Super {
+              ///      method() {}
+              ///    }
+              overrides = setableOverrides;
+            } else {
+              ///    class Super {
+              ///      get property => null
+              ///      void set property(value) {}
+              ///    }
+              ///    class Class extends Super {
+              ///      get property => null
+              ///      void set property(value) {}
+              ///    }
+              overrides = {...getableOverrides, ...setableOverrides};
+            }
+            if (overrides.isNotEmpty) {
+              for (ClassMember declaredMember in declaredProperties!) {
+                declaredOverridesMap[declaredMember] = overrides;
+              }
+            }
+          }
+          if (mixedInMethod != null && getableOverrides.isNotEmpty) {
+            ///    class Super {
+            ///      method() {}
+            ///    }
+            ///    class Mixin {
+            ///      method() {}
+            ///    }
+            ///    class Class = Super with Mixin;
+            mixinApplicationOverridesMap[mixedInMethod!] = getableOverrides;
+          }
+          if (mixedInProperties != null) {
+            Set<ClassMember> overrides;
+            if (mixedInMethod != null) {
+              ///    class Super {
+              ///      set setter() {}
+              ///    }
+              ///    class Mixin {
+              ///      method() {}
+              ///    }
+              ///    class Class = Super with Mixin;
+              overrides = setableOverrides;
+            } else {
+              ///    class Super {
+              ///      method() {}
+              ///    }
+              ///    class Mixin extends Super {
+              ///      method() {}
+              ///    }
+              overrides = {...getableOverrides, ...setableOverrides};
+            }
+            if (overrides.isNotEmpty) {
+              for (ClassMember mixedInMember in mixedInProperties!) {
+                mixinApplicationOverridesMap[mixedInMember] = overrides;
+              }
+            }
+          }
+        }
+      }
+    });
+
+    if (classBuilder is SourceClassBuilder) {
+      // TODO(johnniwinther): Avoid duplicate override check computations
+      //  between [declaredOverridesMap], [mixinApplicationOverridesMap] and
+      //  [inheritedImplementsMap].
+
+      // TODO(johnniwinther): Ensure that a class member is only checked to
+      // validly override another member once. Currently it can happen multiple
+      // times as an inherited implementation.
+
+      declaredOverridesMap.forEach(
+          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+        /// A declared member can inherit its type from the overridden members.
+        ///
+        /// We register this with the class member itself so the it can force
+        /// computation of type on the overridden members before determining its
+        /// own type.
+        ///
+        /// Member types can be queried at arbitrary points during top level
+        /// inference so we need to ensure that types are computed in dependency
+        /// order.
+        classMember.registerOverrideDependency(overriddenMembers);
+
+        /// Not all member type are queried during top level inference so we
+        /// register delayed computation to ensure that all types have been
+        /// computed before override checks are performed.
+        DelayedTypeComputation computation =
+            new DelayedTypeComputation(this, classMember, overriddenMembers);
+        _membersBuilder.registerDelayedTypeComputation(computation);
+
+        /// Declared members must be checked to validly override the
+        /// overridden members.
+        _membersBuilder.registerOverrideCheck(
+            classBuilder as SourceClassBuilder, classMember, overriddenMembers);
+      });
+
+      mixinApplicationOverridesMap.forEach(
+          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+        /// Declared mixed in members must be checked to validly override the
+        /// overridden members.
+        _membersBuilder.registerOverrideCheck(
+            classBuilder as SourceClassBuilder, classMember, overriddenMembers);
+      });
+
+      inheritedImplementsMap.forEach(
+          (ClassMember classMember, Set<ClassMember> overriddenMembers) {
+        /// Concrete members must be checked to validly override the overridden
+        /// members in concrete classes.
+        _membersBuilder.registerOverrideCheck(
+            classBuilder as SourceClassBuilder, classMember, overriddenMembers);
+      });
+    }
+
+    if (!hasInterfaces) {
+      /// All interface members also class members to we don't need to store
+      /// the interface members separately.
+      assert(
+          classMemberMap.length == interfaceMemberMap.length,
+          "Class/interface member mismatch. Class members: "
+          "$classMemberMap, interface members: $interfaceMemberMap.");
+      assert(
+          classSetterMap.length == interfaceSetterMap.length,
+          "Class/interface setter mismatch. Class setters: "
+          "$classSetterMap, interface setters: $interfaceSetterMap.");
+      assert(
+          classMemberMap.keys.every((Name name) =>
+              identical(classMemberMap[name], interfaceMemberMap?[name])),
+          "Class/interface member mismatch. Class members: "
+          "$classMemberMap, interface members: $interfaceMemberMap.");
+      assert(
+          classSetterMap.keys.every((Name name) =>
+              identical(classSetterMap[name], interfaceSetterMap?[name])),
+          "Class/interface setter mismatch. Class setters: "
+          "$classSetterMap, interface setters: $interfaceSetterMap.");
+      interfaceMemberMap = null;
+      interfaceSetterMap = null;
+    }
+
+    // ignore: unnecessary_null_comparison
+    if (abstractMembers != null && !classBuilder.isAbstract) {
+      if (!hasNoSuchMethod) {
+        reportMissingMembers(abstractMembers);
+      } else {
+        installNsmHandlers();
+      }
+    }
+
+    return new ClassMembersNode(
+        classBuilder,
+        classMemberMap,
+        classSetterMap,
+        interfaceMemberMap,
+        interfaceSetterMap,
+        hasNoSuchMethod,
+        dataForTesting);
+  }
+
+  void reportMissingMembers(List<ClassMember> abstractMembers) {
+    Map<String, LocatedMessage> contextMap = <String, LocatedMessage>{};
+    for (ClassMember declaration in unfoldDeclarations(abstractMembers)) {
+      if (isNameVisibleIn(declaration.name, classBuilder.library)) {
+        String name = declaration.fullNameForErrors;
+        String className = declaration.classBuilder.fullNameForErrors;
+        String displayName =
+            declaration.isSetter ? "$className.$name=" : "$className.$name";
+        contextMap[displayName] = templateMissingImplementationCause
+            .withArguments(displayName)
+            .withLocation(
+                declaration.fileUri, declaration.charOffset, name.length);
+      }
+    }
+    if (contextMap.isEmpty) return;
+    List<String> names = new List<String>.from(contextMap.keys)..sort();
+    List<LocatedMessage> context = <LocatedMessage>[];
+    for (int i = 0; i < names.length; i++) {
+      context.add(contextMap[names[i]]!);
+    }
+    classBuilder.addProblem(
+        templateMissingImplementationNotAbstract.withArguments(
+            classBuilder.fullNameForErrors, names),
+        classBuilder.charOffset,
+        classBuilder.fullNameForErrors.length,
+        context: context);
+  }
+
+  void installNsmHandlers() {
+    // TODO(ahe): Implement this.
+  }
+}
+
+class ClassMembersNode {
+  final ClassBuilder classBuilder;
+
+  /// All the members of this class including [classMembers] of its
+  /// superclasses. The members are sorted by [compareDeclarations].
+  final Map<Name, ClassMember> classMemberMap;
+
+  /// Similar to [classMembers] but for setters.
+  final Map<Name, ClassMember> classSetterMap;
+
+  /// All the interface members of this class including [interfaceMembers] of
+  /// its supertypes. The members are sorted by [compareDeclarations].
+  ///
+  /// In addition to the members of [classMembers] this also contains members
+  /// from interfaces.
+  ///
+  /// This may be null, in which case [classMembers] is the interface members.
+  final Map<Name, ClassMember>? interfaceMemberMap;
+
+  /// Similar to [interfaceMembers] but for setters.
+  ///
+  /// This may be null, in which case [classSetters] is the interface setters.
+  final Map<Name, ClassMember>? interfaceSetterMap;
+
+  final bool hasNoSuchMethod;
+
+  final ClassHierarchyNodeDataForTesting? dataForTesting;
+
+  ClassMembersNode(
+      this.classBuilder,
+      this.classMemberMap,
+      this.classSetterMap,
+      this.interfaceMemberMap,
+      this.interfaceSetterMap,
+      this.hasNoSuchMethod,
+      this.dataForTesting);
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb
+      ..write(classBuilder.fullNameForErrors)
+      ..writeln(":");
+    printMemberMap(classMemberMap, sb, "classMembers");
+    printMemberMap(classSetterMap, sb, "classSetters");
+    if (interfaceMemberMap != null) {
+      printMemberMap(interfaceMemberMap!, sb, "interfaceMembers");
+    }
+    if (interfaceSetterMap != null) {
+      printMemberMap(interfaceSetterMap!, sb, "interfaceSetters");
+    }
+    return "$sb";
+  }
+
+  void printMembers(
+      List<ClassMember> members, StringBuffer sb, String heading) {
+    sb.write("  ");
+    sb.write(heading);
+    sb.writeln(":");
+    for (ClassMember member in members) {
+      sb
+        ..write("    ")
+        ..write(member.classBuilder.fullNameForErrors)
+        ..write(".")
+        ..write(member.fullNameForErrors)
+        ..writeln();
+    }
+  }
+
+  void printMemberMap(
+      Map<Name, ClassMember> memberMap, StringBuffer sb, String heading) {
+    List<ClassMember> members = memberMap.values.toList();
+    members.sort(compareDeclarations);
+    printMembers(members, sb, heading);
+  }
+
+  ClassMember? getInterfaceMember(Name name, bool isSetter) {
+    return isSetter
+        ? (interfaceSetterMap ?? classSetterMap)[name]
+        : (interfaceMemberMap ?? classMemberMap)[name];
+  }
+
+  ClassMember? findMember(Name name, List<ClassMember> declarations) {
+    // TODO(ahe): Consider creating a map or scope. The obvious choice would be
+    // to use scopes, but they don't handle private names correctly.
+
+    // This is a copy of `ClassHierarchy.findMemberByName`.
+    int low = 0, high = declarations.length - 1;
+    while (low <= high) {
+      int mid = low + ((high - low) >> 1);
+      ClassMember pivot = declarations[mid];
+      int comparison = ClassHierarchy.compareNames(name, pivot.name);
+      if (comparison < 0) {
+        high = mid - 1;
+      } else if (comparison > 0) {
+        low = mid + 1;
+      } else if (high != mid) {
+        // Ensure we find the first element of the given name.
+        high = mid;
+      } else {
+        return pivot;
+      }
+    }
+    return null;
+  }
+
+  ClassMember? getDispatchTarget(Name name, bool isSetter) {
+    return isSetter ? classSetterMap[name] : classMemberMap[name];
+  }
+}
+
+class ClassHierarchyNodeDataForTesting {
+  final List<ClassMember> abstractMembers;
+  final Map<ClassMember, Set<ClassMember>> declaredOverrides;
+  final Map<ClassMember, Set<ClassMember>> mixinApplicationOverrides;
+  final Map<ClassMember, Set<ClassMember>> inheritedImplements;
+  final Map<ClassMember, ClassMember> aliasMap = {};
+
+  ClassHierarchyNodeDataForTesting(this.abstractMembers, this.declaredOverrides,
+      this.mixinApplicationOverrides, this.inheritedImplements);
+}
+
+class Tuple {
+  final Name name;
+  ClassMember? _declaredMember;
+  ClassMember? _declaredSetter;
+  ClassMember? _mixedInMember;
+  ClassMember? _mixedInSetter;
+  ClassMember? _extendedMember;
+  ClassMember? _extendedSetter;
+  List<ClassMember>? _implementedMembers;
+  List<ClassMember>? _implementedSetters;
+
+  Tuple.declareMember(ClassMember declaredMember)
+      : assert(!declaredMember.forSetter),
+        this._declaredMember = declaredMember,
+        this.name = declaredMember.name;
+
+  Tuple.mixInMember(ClassMember mixedInMember)
+      : assert(!mixedInMember.forSetter),
+        this._mixedInMember = mixedInMember,
+        this.name = mixedInMember.name;
+
+  Tuple.extendMember(ClassMember extendedMember)
+      : assert(!extendedMember.forSetter),
+        this._extendedMember = extendedMember,
+        this.name = extendedMember.name;
+
+  Tuple.implementMember(ClassMember implementedMember)
+      : assert(!implementedMember.forSetter),
+        this.name = implementedMember.name,
+        _implementedMembers = <ClassMember>[implementedMember];
+
+  Tuple.declareSetter(ClassMember declaredSetter)
+      : assert(declaredSetter.forSetter),
+        this._declaredSetter = declaredSetter,
+        this.name = declaredSetter.name;
+
+  Tuple.mixInSetter(ClassMember mixedInSetter)
+      : assert(mixedInSetter.forSetter),
+        this._mixedInSetter = mixedInSetter,
+        this.name = mixedInSetter.name;
+
+  Tuple.extendSetter(ClassMember extendedSetter)
+      : assert(extendedSetter.forSetter),
+        this._extendedSetter = extendedSetter,
+        this.name = extendedSetter.name;
+
+  Tuple.implementSetter(ClassMember implementedSetter)
+      : assert(implementedSetter.forSetter),
+        this.name = implementedSetter.name,
+        _implementedSetters = <ClassMember>[implementedSetter];
+
+  ClassMember? get declaredMember => _declaredMember;
+
+  void set declaredMember(ClassMember? value) {
+    assert(!value!.forSetter);
+    assert(
+        _declaredMember == null,
+        "Declared member already set to $_declaredMember, "
+        "trying to set it to $value.");
+    _declaredMember = value;
+  }
+
+  ClassMember? get declaredSetter => _declaredSetter;
+
+  void set declaredSetter(ClassMember? value) {
+    assert(value!.forSetter);
+    assert(
+        _declaredSetter == null,
+        "Declared setter already set to $_declaredSetter, "
+        "trying to set it to $value.");
+    _declaredSetter = value;
+  }
+
+  ClassMember? get extendedMember => _extendedMember;
+
+  void set extendedMember(ClassMember? value) {
+    assert(!value!.forSetter);
+    assert(
+        _extendedMember == null,
+        "Extended member already set to $_extendedMember, "
+        "trying to set it to $value.");
+    _extendedMember = value;
+  }
+
+  ClassMember? get extendedSetter => _extendedSetter;
+
+  void set extendedSetter(ClassMember? value) {
+    assert(value!.forSetter);
+    assert(
+        _extendedSetter == null,
+        "Extended setter already set to $_extendedSetter, "
+        "trying to set it to $value.");
+    _extendedSetter = value;
+  }
+
+  ClassMember? get mixedInMember => _mixedInMember;
+
+  void set mixedInMember(ClassMember? value) {
+    assert(!value!.forSetter);
+    assert(
+        _mixedInMember == null,
+        "Mixed in member already set to $_mixedInMember, "
+        "trying to set it to $value.");
+    _mixedInMember = value;
+  }
+
+  ClassMember? get mixedInSetter => _mixedInSetter;
+
+  void set mixedInSetter(ClassMember? value) {
+    assert(value!.forSetter);
+    assert(
+        _mixedInSetter == null,
+        "Mixed in setter already set to $_mixedInSetter, "
+        "trying to set it to $value.");
+    _mixedInSetter = value;
+  }
+
+  List<ClassMember>? get implementedMembers => _implementedMembers;
+
+  void addImplementedMember(ClassMember value) {
+    assert(!value.forSetter);
+    _implementedMembers ??= <ClassMember>[];
+    _implementedMembers!.add(value);
+  }
+
+  List<ClassMember>? get implementedSetters => _implementedSetters;
+
+  void addImplementedSetter(ClassMember value) {
+    assert(value.forSetter);
+    _implementedSetters ??= <ClassMember>[];
+    _implementedSetters!.add(value);
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    String comma = '';
+    sb.write('Tuple(');
+    if (_declaredMember != null) {
+      sb.write(comma);
+      sb.write('declaredMember=');
+      sb.write(_declaredMember);
+      comma = ',';
+    }
+    if (_declaredSetter != null) {
+      sb.write(comma);
+      sb.write('declaredSetter=');
+      sb.write(_declaredSetter);
+      comma = ',';
+    }
+    if (_mixedInMember != null) {
+      sb.write(comma);
+      sb.write('mixedInMember=');
+      sb.write(_mixedInMember);
+      comma = ',';
+    }
+    if (_mixedInSetter != null) {
+      sb.write(comma);
+      sb.write('mixedInSetter=');
+      sb.write(_mixedInSetter);
+      comma = ',';
+    }
+    if (_extendedMember != null) {
+      sb.write(comma);
+      sb.write('extendedMember=');
+      sb.write(_extendedMember);
+      comma = ',';
+    }
+    if (_extendedSetter != null) {
+      sb.write(comma);
+      sb.write('extendedSetter=');
+      sb.write(_extendedSetter);
+      comma = ',';
+    }
+    if (_implementedMembers != null) {
+      sb.write(comma);
+      sb.write('implementedMembers=');
+      sb.write(_implementedMembers);
+      comma = ',';
+    }
+    if (_implementedSetters != null) {
+      sb.write(comma);
+      sb.write('implementedSetters=');
+      sb.write(_implementedSetters);
+      comma = ',';
+    }
+    sb.write(')');
+    return sb.toString();
+  }
+}
+
+Set<ClassMember> toSet(
+    ClassBuilder classBuilder, Iterable<ClassMember> members) {
+  Set<ClassMember> result = <ClassMember>{};
+  _toSet(classBuilder, members, result);
+  return result;
+}
+
+void _toSet(ClassBuilder classBuilder, Iterable<ClassMember> members,
+    Set<ClassMember> result) {
+  for (ClassMember member in members) {
+    if (member.hasDeclarations && classBuilder == member.classBuilder) {
+      _toSet(classBuilder, member.declarations, result);
+    } else {
+      result.add(member);
+    }
+  }
+}
+
+void reportCantInferParameterType(ClassBuilder cls,
+    FormalParameterBuilder parameter, Iterable<ClassMember> overriddenMembers) {
+  String name = parameter.name;
+  List<LocatedMessage> context = overriddenMembers
+      .map((ClassMember overriddenMember) {
+        return messageDeclaredMemberConflictsWithOverriddenMembersCause
+            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+                overriddenMember.fullNameForErrors.length);
+      })
+      // Call toSet to avoid duplicate context for instance of fields that are
+      // overridden both as getters and setters.
+      .toSet()
+      .toList();
+  cls.addProblem(
+      templateCantInferTypeDueToNoCombinedSignature.withArguments(name),
+      parameter.charOffset,
+      name.length,
+      wasHandled: true,
+      context: context);
+}
+
+void reportCantInferTypes(ClassBuilder cls, SourceProcedureBuilder member,
+    Iterable<ClassMember> overriddenMembers) {
+  String name = member.fullNameForErrors;
+  List<LocatedMessage> context = overriddenMembers
+      .map((ClassMember overriddenMember) {
+        return messageDeclaredMemberConflictsWithOverriddenMembersCause
+            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+                overriddenMember.fullNameForErrors.length);
+      })
+      // Call toSet to avoid duplicate context for instance of fields that are
+      // overridden both as getters and setters.
+      .toSet()
+      .toList();
+  cls.addProblem(
+      templateCantInferTypesDueToNoCombinedSignature.withArguments(name),
+      member.charOffset,
+      name.length,
+      wasHandled: true,
+      context: context);
+}
+
+void reportCantInferReturnType(ClassBuilder cls, SourceProcedureBuilder member,
+    Iterable<ClassMember> overriddenMembers) {
+  String name = member.fullNameForErrors;
+  List<LocatedMessage> context = overriddenMembers
+      .map((ClassMember overriddenMember) {
+        return messageDeclaredMemberConflictsWithOverriddenMembersCause
+            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+                overriddenMember.fullNameForErrors.length);
+      })
+      // Call toSet to avoid duplicate context for instance of fields that are
+      // overridden both as getters and setters.
+      .toSet()
+      .toList();
+  // // TODO(ahe): The following is for debugging, but could be cleaned up and
+  // // used to improve this error message in general.
+  //
+  // context = <LocatedMessage>[];
+  // ClassHierarchyNode supernode = hierarchy.getNodeFromType(cls.supertype);
+  // // TODO(ahe): Wrong template.
+  // Template<Message Function(String)> template =
+  //     templateMissingImplementationCause;
+  // if (supernode != null) {
+  //   Declaration superMember =
+  //       supernode.getInterfaceMember(new Name(name), false);
+  //   if (superMember != null) {
+  //     context.add(template
+  //         .withArguments(name)
+  //         .withLocation(
+  //             superMember.fileUri, superMember.charOffset, name.length));
+  //   }
+  //   superMember = supernode.getInterfaceMember(new Name(name), true);
+  //   if (superMember != null) {
+  //     context.add(template
+  //         .withArguments(name)
+  //         .withLocation(
+  //             superMember.fileUri, superMember.charOffset, name.length));
+  //   }
+  // }
+  // List<TypeBuilder> directInterfaces = cls.interfaces;
+  // for (int i = 0; i < directInterfaces.length; i++) {
+  //   ClassHierarchyNode supernode =
+  //       hierarchy.getNodeFromType(directInterfaces[i]);
+  //   if (supernode != null) {
+  //     Declaration superMember =
+  //         supernode.getInterfaceMember(new Name(name), false);
+  //     if (superMember != null) {
+  //       context.add(template
+  //           .withArguments(name)
+  //           .withLocation(
+  //               superMember.fileUri, superMember.charOffset, name.length));
+  //     }
+  //     superMember = supernode.getInterfaceMember(new Name(name), true);
+  //     if (superMember != null) {
+  //       context.add(template
+  //           .withArguments(name)
+  //           .withLocation(
+  //               superMember.fileUri, superMember.charOffset, name.length));
+  //     }
+  //   }
+  // }
+  cls.addProblem(
+      templateCantInferReturnTypeDueToNoCombinedSignature.withArguments(name),
+      member.charOffset,
+      name.length,
+      wasHandled: true,
+      context: context);
+}
+
+void reportCantInferFieldType(ClassBuilder cls, SourceFieldBuilder member,
+    Iterable<ClassMember> overriddenMembers) {
+  List<LocatedMessage> context = overriddenMembers
+      .map((ClassMember overriddenMember) {
+        return messageDeclaredMemberConflictsWithOverriddenMembersCause
+            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+                overriddenMember.fullNameForErrors.length);
+      })
+      // Call toSet to avoid duplicate context for instance of fields that are
+      // overridden both as getters and setters.
+      .toSet()
+      .toList();
+  String name = member.fullNameForErrors;
+  cls.addProblem(
+      templateCantInferTypeDueToNoCombinedSignature.withArguments(name),
+      member.charOffset,
+      name.length,
+      wasHandled: true,
+      context: context);
+}
+
+List<LocatedMessage> _inheritedConflictContext(ClassMember a, ClassMember b) {
+  int length = a.fullNameForErrors.length;
+  // TODO(ahe): Delete this method when it isn't used by [InterfaceResolver].
+  int compare = "${a.fileUri}".compareTo("${b.fileUri}");
+  if (compare == 0) {
+    compare = a.charOffset.compareTo(b.charOffset);
+  }
+  ClassMember first;
+  ClassMember second;
+  if (compare < 0) {
+    first = a;
+    second = b;
+  } else {
+    first = b;
+    second = a;
+  }
+  return <LocatedMessage>[
+    messageInheritedMembersConflictCause1.withLocation(
+        first.fileUri, first.charOffset, length),
+    messageInheritedMembersConflictCause2.withLocation(
+        second.fileUri, second.charOffset, length),
+  ];
+}
+
+bool isNameVisibleIn(Name name, LibraryBuilder libraryBuilder) {
+  return !name.isPrivate || name.library == libraryBuilder.library;
+}
+
+int compareDeclarations(ClassMember a, ClassMember b) {
+  if (a == b) return 0;
+  return ClassHierarchy.compareNames(a.name, b.name);
+}
+
+Set<ClassMember> unfoldDeclarations(Iterable<ClassMember> members) {
+  Set<ClassMember> result = <ClassMember>{};
+  _unfoldDeclarations(members, result);
+  return result;
+}
+
+void _unfoldDeclarations(
+    Iterable<ClassMember> members, Set<ClassMember> result) {
+  for (ClassMember member in members) {
+    if (member.hasDeclarations) {
+      _unfoldDeclarations(member.declarations, result);
+    } else {
+      result.add(member);
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/mixin_inferrer.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/mixin_inferrer.dart
new file mode 100644
index 0000000..f8974cc
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/mixin_inferrer.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.class_hierarchy_builder;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:kernel/src/standard_bounds.dart';
+import 'package:kernel/type_environment.dart';
+
+import '../../builder/class_builder.dart';
+import '../../messages.dart' show Message;
+import '../../type_inference/standard_bounds.dart'
+    show TypeSchemaStandardBounds;
+import '../../type_inference/type_constraint_gatherer.dart'
+    show TypeConstraintGatherer;
+import '../../type_inference/type_inferrer.dart' show MixinInferrer;
+import '../../type_inference/type_schema_environment.dart' show TypeConstraint;
+import 'hierarchy_builder.dart';
+
+class BuilderMixinInferrer extends MixinInferrer {
+  final ClassBuilder cls;
+
+  BuilderMixinInferrer(
+      this.cls, CoreTypes coreTypes, TypeBuilderConstraintGatherer gatherer)
+      : super(coreTypes, gatherer);
+
+  @override
+  Supertype? asInstantiationOf(Supertype type, Class superclass) {
+    List<DartType>? arguments =
+        gatherer.getTypeArgumentsAsInstanceOf(type.asInterfaceType, superclass);
+    if (arguments == null) return null;
+    return new Supertype(superclass, arguments);
+  }
+
+  @override
+  void reportProblem(Message message, Class kernelClass) {
+    int length = cls.isMixinApplication ? 1 : cls.fullNameForErrors.length;
+    cls.addProblem(message, cls.charOffset, length);
+  }
+}
+
+class TypeBuilderConstraintGatherer extends TypeConstraintGatherer
+    with StandardBounds, TypeSchemaStandardBounds {
+  @override
+  final ClassHierarchyBuilder hierarchy;
+
+  TypeBuilderConstraintGatherer(this.hierarchy,
+      Iterable<TypeParameter> typeParameters, Library currentLibrary)
+      : super.subclassing(typeParameters, currentLibrary);
+
+  @override
+  CoreTypes get coreTypes => hierarchy.coreTypes;
+
+  @override
+  void addLowerBound(
+      TypeConstraint constraint, DartType lower, Library clientLibrary) {
+    constraint.lower =
+        getStandardUpperBound(constraint.lower, lower, clientLibrary);
+  }
+
+  @override
+  void addUpperBound(
+      TypeConstraint constraint, DartType upper, Library clientLibrary) {
+    constraint.upper =
+        getStandardLowerBound(constraint.upper, upper, clientLibrary);
+  }
+
+  @override
+  Member? getInterfaceMember(Class class_, Name name, {bool setter: false}) {
+    return null;
+  }
+
+  @override
+  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
+      Library clientLibrary, CoreTypes coreTypes) {
+    return hierarchy.getTypeAsInstanceOf(type, superclass, clientLibrary);
+  }
+
+  @override
+  List<DartType>? getTypeArgumentsAsInstanceOf(
+      InterfaceType type, Class superclass) {
+    return hierarchy.getTypeArgumentsAsInstanceOf(type, superclass);
+  }
+
+  @override
+  InterfaceType futureType(DartType type, Nullability nullability) {
+    return new InterfaceType(
+        hierarchy.futureClass, nullability, <DartType>[type]);
+  }
+
+  @override
+  bool isSubtypeOf(
+      DartType subtype, DartType supertype, SubtypeCheckMode mode) {
+    return hierarchy.types.isSubtypeOf(subtype, supertype, mode);
+  }
+
+  @override
+  bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
+    return isSubtypeOf(s, t, mode) && isSubtypeOf(t, s, mode);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 9e0e011..27f8d35 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -315,8 +315,7 @@
       Uri translatedEntryPoint =
           getEntryPointUri(entryPoint, issueProblem: true);
       result.add(translatedEntryPoint);
-      loader.read(translatedEntryPoint, -1,
-          accessor: loader.first,
+      loader.readAsEntryPoint(translatedEntryPoint,
           fileUri: translatedEntryPoint != entryPoint ? entryPoint : null);
     }
     return result;
@@ -361,23 +360,6 @@
     return entryPoint;
   }
 
-  /// Returns classes defined in libraries in [loader].
-  List<SourceClassBuilder> collectMyClasses() {
-    List<SourceClassBuilder> result = <SourceClassBuilder>[];
-    for (LibraryBuilder library in loader.libraryBuilders) {
-      if (library.loader == loader) {
-        Iterator<Builder> iterator = library.iterator;
-        while (iterator.moveNext()) {
-          Builder member = iterator.current;
-          if (member is SourceClassBuilder && !member.isPatch) {
-            result.add(member);
-          }
-        }
-      }
-    }
-    return result;
-  }
-
   /// The class [cls] is involved in a cyclic definition. This method should
   /// ensure that the cycle is broken, for example, by removing superclass and
   /// implemented interfaces.
@@ -402,7 +384,6 @@
     if (loader.first == null) return null;
     return withCrashReporting<Component?>(() async {
       await loader.buildOutlines();
-      loader.createTypeInferenceEngine();
       loader.coreLibrary.becomeCoreLibrary();
       loader.resolveParts();
       loader.computeLibraryScopes();
@@ -411,30 +392,33 @@
       loader.computeVariances();
       loader.computeDefaultTypes(
           dynamicType, nullType, bottomType, objectClassBuilder);
-      List<SourceClassBuilder> myClasses =
+      List<SourceClassBuilder> sourceClassBuilders =
           loader.checkSemantics(objectClassBuilder);
+      loader.computeMacroDeclarations(sourceClassBuilders);
       loader.finishTypeVariables(objectClassBuilder, dynamicType);
+      loader.createTypeInferenceEngine();
       loader.buildComponent();
       installDefaultSupertypes();
-      installSyntheticConstructors(myClasses);
+      installSyntheticConstructors(sourceClassBuilders);
       loader.resolveConstructors();
       component =
           link(new List<Library>.from(loader.libraries), nameRoot: nameRoot);
       computeCoreTypes();
-      loader.buildClassHierarchy(myClasses, objectClassBuilder);
+      loader.buildClassHierarchy(sourceClassBuilders, objectClassBuilder);
       loader.computeHierarchy();
       loader.computeShowHideElements();
       loader.installTypedefTearOffs();
-      loader.performTopLevelInference(myClasses);
-      loader.checkSupertypes(myClasses);
-      loader.checkOverrides(myClasses);
-      loader.checkAbstractMembers(myClasses);
-      loader.addNoSuchMethodForwarders(myClasses);
-      loader.checkMixins(myClasses);
+      loader.performTopLevelInference(sourceClassBuilders);
+      loader.checkSupertypes(sourceClassBuilders);
+      loader.checkOverrides(sourceClassBuilders);
+      loader.checkAbstractMembers(sourceClassBuilders);
+      loader.addNoSuchMethodForwarders(sourceClassBuilders);
+      loader.checkMixins(sourceClassBuilders);
       loader.buildOutlineExpressions(
           loader.coreTypes, synthesizedFunctionNodes);
+      loader.computeMacroApplications();
       loader.checkTypes();
-      loader.checkRedirectingFactories(myClasses);
+      loader.checkRedirectingFactories(sourceClassBuilders);
       loader.checkMainMethods();
       installAllComponentProblems(loader.allComponentProblems);
       loader.allComponentProblems.clear();
@@ -458,10 +442,10 @@
       finishSynthesizedParameters();
       loader.finishDeferredLoadTearoffs();
       loader.finishNoSuchMethodForwarders();
-      List<SourceClassBuilder> myClasses = collectMyClasses();
+      List<SourceClassBuilder> sourceClasses = loader.collectSourceClasses();
       loader.finishNativeMethods();
       loader.finishPatchMethods();
-      finishAllConstructors(myClasses);
+      finishAllConstructors(sourceClasses);
       runBuildTransformations();
 
       if (verify) this.verify();
@@ -623,33 +607,8 @@
 
   void installDefaultSupertypes() {
     Class objectClass = this.objectClass;
-    for (LibraryBuilder library in loader.libraryBuilders) {
-      if (library.loader == loader) {
-        Iterator<Builder> iterator = library.iterator;
-        while (iterator.moveNext()) {
-          Builder declaration = iterator.current;
-          if (declaration is SourceClassBuilder) {
-            Class cls = declaration.cls;
-            if (cls != objectClass) {
-              cls.supertype ??= objectClass.asRawSupertype;
-              declaration.supertypeBuilder ??= new NamedTypeBuilder(
-                  "Object",
-                  const NullabilityBuilder.omitted(),
-                  /* arguments = */ null,
-                  /* fileUri = */ null,
-                  /* charOffset = */ null,
-                  instanceTypeVariableAccess:
-                      InstanceTypeVariableAccessState.Unexpected)
-                ..bind(objectClassBuilder);
-            }
-            if (declaration.isMixinApplication) {
-              cls.mixedInType = declaration.mixedInTypeBuilder!
-                  .buildMixedInType(
-                      library, declaration.charOffset, declaration.fileUri);
-            }
-          }
-        }
-      }
+    for (SourceLibraryBuilder library in loader.sourceLibraryBuilders) {
+      library.installDefaultSupertypes(objectClassBuilder, objectClass);
     }
     ticker.logMs("Installed Object as implicit superclass");
   }
@@ -809,7 +768,8 @@
         supertype is TypeVariableBuilder ||
         supertype is DynamicTypeDeclarationBuilder ||
         supertype is VoidTypeDeclarationBuilder ||
-        supertype is NeverTypeDeclarationBuilder) {
+        supertype is NeverTypeDeclarationBuilder ||
+        supertype is TypeAliasBuilder) {
       builder.addSyntheticConstructor(_makeDefaultConstructor(
           builder, constructorReference, tearOffReference));
     } else {
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro.dart
new file mode 100644
index 0000000..afa9dca
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/macro.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart';
+
+bool enableMacros = false;
+
+final Uri macroLibraryUri = Uri.parse('package:macro_builder/src/macro.dart');
+const String macroClassName = 'Macro';
+
+class MacroDeclarationData {
+  bool macrosAreAvailable = false;
+  Map<Uri, List<String>> macroDeclarations = {};
+  List<List<Uri>>? compilationSequence;
+}
+
+class MacroApplicationData {
+  Map<Library, LibraryMacroApplicationData> libraryData = {};
+}
+
+class MacroApplications {
+  final List<Class> macros;
+
+  MacroApplications(this.macros);
+}
+
+class LibraryMacroApplicationData {
+  MacroApplications? libraryApplications;
+  Map<Class, ClassMacroApplicationData> classData = {};
+  Map<Typedef, MacroApplications> typedefApplications = {};
+  Map<Member, MacroApplications> memberApplications = {};
+}
+
+class ClassMacroApplicationData {
+  MacroApplications? classApplications;
+  Map<Member, MacroApplications> memberApplications = {};
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 7543cd9..ae560e2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -29,7 +29,10 @@
 import '../type_inference/type_schema.dart' show UnknownType;
 
 import 'redirecting_factory_body.dart'
-    show RedirectingFactoryBody, isRedirectingFactory;
+    show
+        RedirectingFactoryBody,
+        isRedirectingFactory,
+        isRedirectingFactoryField;
 
 List<LocatedMessage> verifyComponent(Component component, Target target,
     {bool? isOutline, bool? afterConst, bool skipPlatform: false}) {
@@ -431,6 +434,89 @@
     exitTreeNode(node);
   }
 
+  void _checkConstructorTearOff(Node node, Member tearOffTarget) {
+    if (tearOffTarget.enclosingLibrary.importUri.scheme == 'dart') {
+      // Platform libraries are not compilation with test flags and might
+      // contain tear-offs not expected when testing lowerings.
+      return;
+    }
+    if (currentMember != null && isRedirectingFactoryField(currentMember!)) {
+      // The encoding of the redirecting factory field uses
+      // [ConstructorTearOffConstant] nodes also when lowerings are enabled.
+      return;
+    }
+    if (tearOffTarget is Constructor &&
+        target.isConstructorTearOffLoweringEnabled) {
+      problem(
+          node is TreeNode ? node : getLastSeenTreeNode(),
+          '${node.runtimeType} nodes for generative constructors should be '
+          'lowered for target "${target.name}".');
+    }
+    if (tearOffTarget is Procedure &&
+        tearOffTarget.isFactory &&
+        target.isFactoryTearOffLoweringEnabled) {
+      problem(
+          node is TreeNode ? node : getLastSeenTreeNode(),
+          '${node.runtimeType} nodes for factory constructors should be '
+          'lowered for target "${target.name}".');
+    }
+  }
+
+  @override
+  void visitConstructorTearOff(ConstructorTearOff node) {
+    _checkConstructorTearOff(node, node.target);
+    super.visitConstructorTearOff(node);
+  }
+
+  @override
+  void visitConstructorTearOffConstant(ConstructorTearOffConstant node) {
+    _checkConstructorTearOff(node, node.target);
+    super.visitConstructorTearOffConstant(node);
+  }
+
+  void _checkTypedefTearOff(Node node) {
+    if (target.isTypedefTearOffLoweringEnabled) {
+      problem(
+          node is TreeNode ? node : getLastSeenTreeNode(),
+          '${node.runtimeType} nodes for typedefs should be '
+          'lowered for target "${target.name}".');
+    }
+  }
+
+  @override
+  void visitTypedefTearOff(TypedefTearOff node) {
+    _checkTypedefTearOff(node);
+    super.visitTypedefTearOff(node);
+  }
+
+  @override
+  void visitTypedefTearOffConstant(TypedefTearOffConstant node) {
+    _checkTypedefTearOff(node);
+    super.visitTypedefTearOffConstant(node);
+  }
+
+  void _checkRedirectingFactoryTearOff(Node node) {
+    if (target.isRedirectingFactoryTearOffLoweringEnabled) {
+      problem(
+          node is TreeNode ? node : getLastSeenTreeNode(),
+          'ConstructorTearOff nodes for redirecting factories should be '
+          'lowered for target "${target.name}".');
+    }
+  }
+
+  @override
+  void visitRedirectingFactoryTearOff(RedirectingFactoryTearOff node) {
+    _checkRedirectingFactoryTearOff(node);
+    super.visitRedirectingFactoryTearOff(node);
+  }
+
+  @override
+  void visitRedirectingFactoryTearOffConstant(
+      RedirectingFactoryTearOffConstant node) {
+    _checkRedirectingFactoryTearOff(node);
+    super.visitRedirectingFactoryTearOffConstant(node);
+  }
+
   @override
   void defaultTreeNode(TreeNode node) {
     enterTreeNode(node);
diff --git a/pkg/front_end/lib/src/fasta/modifier.dart b/pkg/front_end/lib/src/fasta/modifier.dart
index 127ce5c..1d0b3f7 100644
--- a/pkg/front_end/lib/src/fasta/modifier.dart
+++ b/pkg/front_end/lib/src/fasta/modifier.dart
@@ -50,6 +50,10 @@
 /// constructor.
 const int declaresConstConstructorMask = initializingFormalMask << 1;
 
+/// Not a modifier, used by formal parameters to track if they are
+/// super-parameter initializers.
+const int superInitializingFormalMask = declaresConstConstructorMask << 1;
+
 /// Not a real modifier, and by setting it to zero, it is automatically ignored
 /// by [Modifier.toMask] below.
 const int varMask = 0;
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index db65cb2..f69cc83 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -14,7 +14,7 @@
 import 'builder/name_iterator.dart';
 import 'builder/type_variable_builder.dart';
 import 'kernel/body_builder.dart' show JumpTarget;
-import 'kernel/class_hierarchy_builder.dart' show ClassMember;
+import 'kernel/hierarchy/class_member.dart' show ClassMember;
 import 'kernel/kernel_helper.dart';
 import 'util/helpers.dart' show DelayedActionPerformer;
 
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index a1e2b88..ae3196c 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -176,6 +176,11 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+  }
+
+  @override
   void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
     debugEvent("NoConstructorReferenceContinuationAfterTypeArguments");
   }
@@ -212,11 +217,26 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    debugEvent("EnumWithClause");
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("EnumNoWithClause");
+  }
+
+  @override
   void endTypeArguments(int count, Token beginToken, Token endToken) {
     debugEvent("TypeArguments");
   }
 
   @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    debugEvent("Arguments");
+  }
+
+  @override
   void handleInvalidTypeArguments(Token token) {
     debugEvent("InvalidTypeArguments");
   }
@@ -898,7 +918,8 @@
   }
 
   @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     debugEvent("beginClassDeclaration");
     push(begin);
   }
@@ -939,12 +960,103 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void beginEnum(Token enumKeyword) {
+    assert(checkState(enumKeyword, [ValueKinds.NameOrParserRecovery]));
     debugEvent("Enum");
-    const FixedNullableList<Object>().pop(stack, count * 2);
-    pop(); // Name.
-    pop(); // Annotations begin token.
+    Object? name = pop();
+
+    assert(currentDeclaration == null);
+    assert(memberScope == libraryBuilder.scope);
+
+    if (name is ParserRecovery) {
+      currentClassIsParserRecovery = true;
+      return;
+    }
+
+    currentDeclaration =
+        lookupBuilder(enumKeyword, null, name as String) as DeclarationBuilder;
+    memberScope = currentDeclaration!.scope;
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    debugEvent("Enum");
     checkEmpty(enumKeyword.charOffset);
+    currentDeclaration = null;
+    memberScope = libraryBuilder.scope;
+  }
+
+  @override
+  void handleEnumElement(Token beginKeyword) {
+    debugEvent("EnumElement");
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
+    const FixedNullableList<Object>().pop(stack, elementsCount * 2);
+    pop(); // Annotations begin token.
+    checkEmpty(elementsEndToken.charOffset);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(chloestefantsova): Call endClassConstructor instead.
+    debugEvent("EnumConstructor");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    // TODO(chloestefantsova): Call endClassFactoryMethod instead.
+    debugEvent("EnumFactoryMethod");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(chloestefantsova): Call endClassMethod instead.
+    debugEvent("EnumMethod");
+    pop(); // bodyToken
+    pop(); // name
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    // TODO(chloestefantsova): Call endClassFields instead.
+    debugEvent("EnumFields");
+    const FixedNullableList<String>().pop(stack, count); // names
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    // Skip the declaration. An error as already been produced by the parser.
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 63f5779..82bbe12 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -309,6 +309,33 @@
   /// This includes type of the declaration but excludes annotations on the
   /// field declaration itself, which are seen in the [ExtensionBody] context.
   ExtensionStaticField,
+
+  /// In a generative constructor declaration inside an enum declaration.
+  EnumConstructor,
+
+  /// In a static method declaration inside an enum declaration.
+  EnumStaticMethod,
+
+  /// In a static field declaration inside an enum declaration.
+  EnumStaticField,
+
+  /// In an instance method declaration inside an enum declaration.
+  EnumInstanceMethod,
+
+  /// In an instance field declaration inside an enum declaration.
+  EnumInstanceField,
+
+  /// In a factory constructor declaration inside an enum declaration. This
+  /// is an error case.
+  ///
+  /// This excludes annotations on the constructor declaration itself, which
+  /// are seen in the [EnumBody] context.
+  EnumFactory,
+
+  /// In an enum declaration body.
+  ///
+  /// This includes annotations on extension member declarations.
+  EnumBody,
 }
 
 extension on DeclarationContext {
@@ -318,7 +345,6 @@
       case DeclarationContext.Typedef:
       case DeclarationContext.TopLevelMethod:
       case DeclarationContext.TopLevelField:
-      case DeclarationContext.Enum:
         return InstanceTypeVariableAccessState.Unexpected;
       case DeclarationContext.ClassOrMixinOrNamedMixinApplication:
       case DeclarationContext.NamedMixinApplication:
@@ -327,6 +353,10 @@
       case DeclarationContext.ClassFactory:
       case DeclarationContext.ClassInstanceMethod:
       case DeclarationContext.ClassInstanceField:
+      case DeclarationContext.Enum:
+      case DeclarationContext.EnumConstructor:
+      case DeclarationContext.EnumInstanceField:
+      case DeclarationContext.EnumInstanceMethod:
       case DeclarationContext.Mixin:
       case DeclarationContext.MixinInstanceMethod:
       case DeclarationContext.MixinInstanceField:
@@ -337,6 +367,9 @@
       case DeclarationContext.ClassBody:
       case DeclarationContext.ClassStaticMethod:
       case DeclarationContext.ClassStaticField:
+      case DeclarationContext.EnumStaticField:
+      case DeclarationContext.EnumStaticMethod:
+      case DeclarationContext.EnumBody:
       case DeclarationContext.MixinBody:
       case DeclarationContext.MixinStaticMethod:
       case DeclarationContext.MixinStaticField:
@@ -349,6 +382,7 @@
       case DeclarationContext.ExtensionConstructor:
       case DeclarationContext.ExtensionFactory:
       case DeclarationContext.ExtensionInstanceField:
+      case DeclarationContext.EnumFactory:
         return InstanceTypeVariableAccessState.Invalid;
     }
   }
@@ -780,7 +814,8 @@
   }
 
   @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     debugEvent("beginClassDeclaration");
     popDeclarationContext(
         DeclarationContext.ClassOrMixinOrNamedMixinApplication);
@@ -793,6 +828,18 @@
     libraryBuilder.setCurrentClassName(name.lexeme);
     inAbstractClass = abstractToken != null;
     push(abstractToken != null ? abstractMask : 0);
+    if (macroToken != null && !libraryBuilder.enableMacrosInLibrary) {
+      // TODO(johnniwinther): We should emit a different message when the
+      // experiment is not released yet. The current message indicates that
+      // changing the sdk version can solve the problem.
+      addProblem(
+          templateExperimentNotEnabled.withArguments(
+              'macros', libraryBuilder.enableMacrosVersionInLibrary.toText()),
+          macroToken.next!.charOffset,
+          macroToken.next!.length);
+      macroToken = null;
+    }
+    push(macroToken ?? NullValue.Token);
   }
 
   @override
@@ -824,6 +871,9 @@
       case DeclarationKind.Extension:
         declarationContext = DeclarationContext.ExtensionBody;
         break;
+      case DeclarationKind.Enum:
+        declarationContext = DeclarationContext.Enum;
+        break;
     }
     pushDeclarationContext(declarationContext);
     if (kind == DeclarationKind.Extension) {
@@ -862,7 +912,7 @@
 
   @override
   void beginNamedMixinApplication(
-      Token begin, Token? abstractToken, Token name) {
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     debugEvent("beginNamedMixinApplication");
     popDeclarationContext(
         DeclarationContext.ClassOrMixinOrNamedMixinApplication);
@@ -873,15 +923,33 @@
     libraryBuilder.currentTypeParameterScopeBuilder.markAsNamedMixinApplication(
         name.lexeme, name.charOffset, typeVariables);
     push(abstractToken != null ? abstractMask : 0);
+    if (macroToken != null && !libraryBuilder.enableMacrosInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments(
+              'macros', libraryBuilder.enableMacrosVersionInLibrary.toText()),
+          macroToken.next!.charOffset,
+          macroToken.next!.length);
+      macroToken = null;
+    }
+    push(macroToken ?? NullValue.Token);
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    debugEvent("ClassOrMixinImplements");
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    debugEvent("Implements");
     push(const FixedNullableList<TypeBuilder>()
             .popNonNullable(stack, interfacesCount, dummyTypeBuilder) ??
         NullValue.TypeBuilderList);
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary &&
+        implementsKeyword != null &&
+        declarationContext == DeclarationContext.Enum) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          implementsKeyword.charOffset,
+          -1);
+    }
   }
 
   @override
@@ -996,10 +1064,26 @@
   @override
   void endClassDeclaration(Token beginToken, Token endToken) {
     debugEvent("endClassDeclaration");
+    assert(checkState(beginToken, [
+      /* interfaces */ ValueKinds.TypeBuilderListOrNull,
+      /* supertype offset */ ValueKinds.Integer,
+      /* supertype */ unionOfKinds([
+        ValueKinds.TypeBuilderOrNull,
+        ValueKinds.ParserRecovery,
+      ]),
+      /* macro token */ ValueKinds.TokenOrNull,
+      /* modifiers */ ValueKinds.Integer,
+      /* type variables */ ValueKinds.TypeVariableListOrNull,
+      /* name offset */ ValueKinds.Integer,
+      /* name */ ValueKinds.NameOrParserRecovery,
+      /* metadata */ ValueKinds.MetadataListOrNull,
+    ]));
+
     List<TypeBuilder>? interfaces =
         pop(NullValue.TypeBuilderList) as List<TypeBuilder>?;
     int supertypeOffset = popCharOffset();
     TypeBuilder? supertype = nullIfParserRecovery(pop()) as TypeBuilder?;
+    Token? macroToken = pop(NullValue.Token) as Token?;
     int modifiers = pop() as int;
     List<TypeVariableBuilder>? typeVariables =
         pop() as List<TypeVariableBuilder>?;
@@ -1076,7 +1160,8 @@
           startCharOffset,
           nameOffset,
           endToken.charOffset,
-          supertypeOffset);
+          supertypeOffset,
+          isMacro: macroToken != null);
     }
     libraryBuilder.setCurrentClassName(null);
     popDeclarationContext(DeclarationContext.Class);
@@ -1457,6 +1542,14 @@
           declarationContext = DeclarationContext.ExtensionInstanceMethod;
         }
         break;
+      case DeclarationKind.Enum:
+        if (inConstructor) {
+          declarationContext = DeclarationContext.EnumConstructor;
+        } else if (staticToken != null) {
+          declarationContext = DeclarationContext.EnumStaticMethod;
+        } else {
+          declarationContext = DeclarationContext.EnumInstanceMethod;
+        }
     }
     pushDeclarationContext(declarationContext);
 
@@ -1826,9 +1919,25 @@
   void endNamedMixinApplication(Token beginToken, Token classKeyword,
       Token equals, Token? implementsKeyword, Token endToken) {
     debugEvent("endNamedMixinApplication");
+    assert(checkState(beginToken, [
+      if (implementsKeyword != null)
+        /* interfaces */ ValueKinds.TypeBuilderListOrNull,
+      /* mixin application */ unionOfKinds([
+        ValueKinds.ParserRecovery,
+        ValueKinds.TypeBuilder,
+      ]),
+      /* macro token */ ValueKinds.TokenOrNull,
+      /* modifiers */ ValueKinds.Integer,
+      /* type variables */ ValueKinds.TypeVariableListOrNull,
+      /* name offset */ ValueKinds.Integer,
+      /* name */ ValueKinds.NameOrParserRecovery,
+      /* metadata */ ValueKinds.MetadataListOrNull,
+    ]));
+
     List<TypeBuilder>? interfaces =
         popIfNotNull(implementsKeyword) as List<TypeBuilder>?;
     Object? mixinApplication = pop();
+    Token? macroToken = pop(NullValue.Token) as Token?;
     int modifiers = pop() as int;
     List<TypeVariableBuilder>? typeVariables =
         pop() as List<TypeVariableBuilder>?;
@@ -1896,7 +2005,8 @@
           interfaces,
           startCharOffset,
           charOffset,
-          charEndOffset);
+          charEndOffset,
+          isMacro: macroToken != null);
     }
     popDeclarationContext(DeclarationContext.NamedMixinApplication);
   }
@@ -1910,6 +2020,12 @@
   }
 
   @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    debugEvent("Arguments");
+    push(NullValue.Arguments);
+  }
+
+  @override
   void handleInvalidTypeArguments(Token token) {
     debugEvent("InvalidTypeArguments");
     pop(NullValue.TypeArguments);
@@ -1959,12 +2075,31 @@
   }
 
   @override
+  void handleNoArguments(Token token) {
+    debugEvent("NoArguments");
+    push(NullValue.Arguments);
+  }
+
+  @override
   void handleNoTypeVariables(Token token) {
     super.handleNoTypeVariables(token);
     inConstructorName = false;
   }
 
   @override
+  void handleNoTypeArguments(Token token) {
+    debugEvent("NoTypeArguments");
+    push(NullValue.TypeArguments);
+  }
+
+  @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    debugEvent("NoTypeNameInConstructorReference");
+    push(NullValue.Name);
+    push(token.charOffset);
+  }
+
+  @override
   void handleVoidKeyword(Token token) {
     debugEvent("VoidKeyword");
     push(libraryBuilder.addVoidType(token.charOffset));
@@ -1991,13 +2126,26 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     debugEvent("FormalParameter");
+
+    if (superKeyword != null &&
+        !libraryBuilder.enableSuperParametersInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments(
+              'super-parameters',
+              libraryBuilder.enableConstructorTearOffsVersionInLibrary
+                  .toText()),
+          superKeyword.charOffset,
+          superKeyword.length);
+    }
+
     int charOffset = popCharOffset();
     Object? name = pop();
     TypeBuilder? type = nullIfParserRecovery(pop()) as TypeBuilder?;
@@ -2012,6 +2160,7 @@
           type,
           name == null ? FormalParameterBuilder.noNameSentinel : name as String,
           thisKeyword != null,
+          superKeyword != null,
           charOffset,
           initializerStart));
     }
@@ -2155,23 +2304,70 @@
 
   @override
   void beginEnum(Token enumKeyword) {
+    assert(checkState(
+        enumKeyword, [ValueKinds.Integer, ValueKinds.NameOrParserRecovery]));
+    int offset = pop() as int;
+    Object? name = pop();
+    push(name);
+    push(offset);
+
+    String declarationName;
+    if (name is String) {
+      declarationName = name;
+    } else {
+      declarationName = '#enum';
+    }
     pushDeclarationContext(DeclarationContext.Enum);
+    libraryBuilder.beginNestedDeclaration(
+        TypeParameterScopeKind.enumDeclaration, declarationName);
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    debugEvent("Enum");
+  void handleEnumElement(Token beginToken) {
+    debugEvent("EnumElements");
+    pop(); // arguments.
+    pop(); // constructor reference.
+    // Keep on the stack the EnumConstantInfo created in handleIdentifier.
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    debugEvent("EnumHeader");
+    push(enumKeyword.charOffset); // start char offset.
+    push(leftBrace.endGroup!.charOffset); // end char offset.
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    debugEvent("EnumElements");
     List<EnumConstantInfo?>? enumConstantInfos =
-        const FixedNullableList<EnumConstantInfo>().pop(stack, count);
+        const FixedNullableList<EnumConstantInfo>().pop(stack, elementsCount);
+    int endCharOffset = popCharOffset();
+    int startCharOffset = popCharOffset();
+    pop() as List<TypeBuilder>?; // interfaces.
+    pop() as List<TypeBuilder>?; // mixins.
+    List<TypeVariableBuilder>? typeVariables =
+        pop() as List<TypeVariableBuilder>?;
     int charOffset = popCharOffset(); // identifier char offset.
-    int startCharOffset = enumKeyword.charOffset;
     Object? name = pop();
     List<MetadataBuilder>? metadata = pop() as List<MetadataBuilder>?;
-    checkEmpty(enumKeyword.charOffset);
+    checkEmpty(startCharOffset);
+
     if (name is! ParserRecovery) {
       libraryBuilder.addEnum(metadata, name as String, enumConstantInfos,
-          startCharOffset, charOffset, leftBrace.endGroup!.charOffset);
+          startCharOffset, charOffset, endCharOffset);
+    } else {
+      libraryBuilder
+          .endNestedDeclaration(
+              TypeParameterScopeKind.enumDeclaration, "<syntax-error>")
+          .resolveNamedTypes(typeVariables, libraryBuilder);
     }
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    debugEvent("Enum");
+    checkEmpty(enumKeyword.charOffset);
     popDeclarationContext(DeclarationContext.Enum);
   }
 
@@ -2247,7 +2443,7 @@
     List<TypeVariableBuilder>? typeVariables;
     Object? name;
     int charOffset;
-    TypeBuilder? aliasedType;
+    TypeBuilder aliasedType;
     if (equals == null) {
       List<FormalParameterBuilder>? formals =
           pop() as List<FormalParameterBuilder>?;
@@ -2297,6 +2493,14 @@
           // elsewhere.
           addProblem(
               messageTypedefNullableType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNullableType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
         } else {
           // TODO(ahe): We need to start a nested declaration when parsing the
           // formals and return type so we can correctly bind
@@ -2310,18 +2514,40 @@
           aliasedType = type;
         } else {
           addProblem(messageTypedefNotType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
         }
       } else {
+        assert(type is! FunctionTypeBuilder);
         // TODO(ahe): Improve this error message.
-        addProblem(messageTypedefNotFunction, equals.charOffset, equals.length);
-        aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
-            new InvalidTypeDeclarationBuilder(
-                "${name}",
-                messageTypedefNotType.withLocation(
-                    uri, equals.charOffset, equals.length)),
-            const NullabilityBuilder.omitted(),
-            instanceTypeVariableAccess:
-                InstanceTypeVariableAccessState.Allowed);
+        if (type is TypeBuilder) {
+          addProblem(
+              messageTypedefNotFunction, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotFunction.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
+        } else {
+          addProblem(messageTypedefNotType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
+        }
       }
     }
     List<MetadataBuilder>? metadata = pop() as List<MetadataBuilder>?;
@@ -2370,6 +2596,12 @@
           declarationContext = DeclarationContext.ExtensionInstanceField;
         }
         break;
+      case DeclarationKind.Enum:
+        if (staticToken != null) {
+          declarationContext = DeclarationContext.EnumStaticMethod;
+        } else {
+          declarationContext = DeclarationContext.EnumInstanceMethod;
+        }
     }
     pushDeclarationContext(declarationContext);
   }
@@ -2545,6 +2777,15 @@
   void endTypeVariables(Token beginToken, Token endToken) {
     debugEvent("endTypeVariables");
 
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary &&
+        declarationContext == DeclarationContext.Enum) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+
     // Peek to leave type parameters on top of stack.
     List<TypeVariableBuilder>? typeParameters =
         peek() as List<TypeVariableBuilder>?;
@@ -2638,12 +2879,44 @@
     String? suffix = popIfNotNull(periodBeforeName) as String?;
     List<TypeBuilder>? typeArguments = pop() as List<TypeBuilder>?;
     int charOffset = popCharOffset();
-    Object name = pop()!;
+    Object? name = pop();
     if (name is ParserRecovery) {
       push(name);
-    } else {
+    } else if (name != null) {
       push(libraryBuilder.addConstructorReference(
           name, typeArguments, suffix, charOffset));
+    } else {
+      assert(name == null);
+      // At the moment, the name of the type in a constructor reference can be
+      // omitted only within an enum element declaration.
+      if (libraryBuilder.currentTypeParameterScopeBuilder.kind ==
+          TypeParameterScopeKind.enumDeclaration) {
+        if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+          push(libraryBuilder.addConstructorReference(
+              libraryBuilder.currentTypeParameterScopeBuilder.name,
+              typeArguments,
+              suffix,
+              charOffset));
+        } else {
+          // For entries that consist of their name only, all of the elements
+          // of the constructor reference should be null.
+          if (typeArguments != null || suffix != null) {
+            addProblem(
+                templateExperimentNotEnabled.withArguments(
+                    'enhanced-enums',
+                    libraryBuilder.enableEnhancedEnumsVersionInLibrary
+                        .toText()),
+                charOffset,
+                -1);
+          }
+          push(NullValue.ConstructorReference);
+        }
+      } else {
+        internalProblem(
+            messageInternalProblemOmittedTypeNameInConstructorReference,
+            charOffset,
+            uri);
+      }
     }
   }
 
@@ -2663,6 +2936,9 @@
       case DeclarationKind.Extension:
         declarationContext = DeclarationContext.ExtensionFactory;
         break;
+      case DeclarationKind.Enum:
+        declarationContext = DeclarationContext.EnumFactory;
+        break;
     }
 
     pushDeclarationContext(declarationContext);
@@ -2737,6 +3013,150 @@
   }
 
   @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    // TODO(cstefantsova): Call endClassFactoryMethod instead.
+    debugEvent("EnumFactoryMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // modifiers
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(
+            TypeParameterScopeKind.factoryMethod, "#factory_method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(messageEnumDeclaresFactory, beginToken.charOffset, -1);
+    } else {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(cstefantsova): Call endClassMethod instead.
+    debugEvent("EnumMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // return type
+    int modifiers = Modifier.toMask(pop() as List<Modifier>?);
+    popCharOffset(); // final or const offset
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    TypeParameterScopeKind scopeKind;
+    if ((modifiers & staticMask) != 0) {
+      scopeKind = TypeParameterScopeKind.staticMethod;
+    } else {
+      scopeKind = TypeParameterScopeKind.instanceMethod;
+    }
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(scopeKind, "#method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    // TODO(cstefantsova): Call endClassFields instead.
+    debugEvent("EnumFields");
+    popFieldInfos(count); // field infos
+    pop(); // type
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    // TODO(cstefantsova): Call endClassConstructor instead.
+    debugEvent("EnumMethod");
+    MethodBody bodyKind = pop() as MethodBody;
+    if (bodyKind == MethodBody.RedirectingFactoryBody) {
+      pop(); // reference
+    }
+    pop(); // async marker
+    pop(); // formals
+    popCharOffset(); // formals char offset
+    pop(); // type variables
+    popCharOffset(); // char offset
+    pop(); // name
+    pop(); // return type
+    pop(); // modifiers
+    popCharOffset(); // final or const offset
+    pop(); // metadata
+    checkEmpty(beginToken.charOffset);
+    popDeclarationContext();
+    // TODO(cstefantsova): Use actual type parameters.
+    libraryBuilder
+        .endNestedDeclaration(TypeParameterScopeKind.instanceMethod, "#method")
+        .resolveNamedTypes([], libraryBuilder);
+    // Skip the declaration. An error as already been produced by the parser.
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          beginToken.charOffset,
+          -1);
+    }
+  }
+
+  @override
   void endRedirectingFactoryBody(Token beginToken, Token endToken) {
     debugEvent("RedirectingFactoryBody");
     push(MethodBody.RedirectingFactoryBody);
@@ -2826,6 +3246,33 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    debugEvent("EnumWithClause");
+
+    if (!libraryBuilder.enableEnhancedEnumsInLibrary) {
+      addProblem(
+          templateExperimentNotEnabled.withArguments('enhanced-enums',
+              libraryBuilder.enableEnhancedEnumsVersionInLibrary.toText()),
+          withKeyword.charOffset,
+          -1);
+    }
+
+    Object? mixins = pop();
+    if (mixins is ParserRecovery) {
+      push(new ParserRecovery(withKeyword.charOffset));
+    } else {
+      // TODO(cstefantsova): Handle enum mixins here.
+      push(mixins);
+    }
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    debugEvent("EnumNoWithClause");
+    push(NullValue.TypeBuilderList);
+  }
+
+  @override
   void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
     debugEvent("ClassHeader");
     nativeMethodName = null;
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index a7d6ce8..6c5157d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -5,7 +5,8 @@
 library fasta.source_class_builder;
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/class_hierarchy.dart'
+    show ClassHierarchy, ClassHierarchyMembers;
 import 'package:kernel/reference_from_index.dart' show IndexedClass;
 import 'package:kernel/src/bounds_checks.dart';
 import 'package:kernel/src/legacy_erasure.dart';
@@ -99,26 +100,30 @@
 
   final IndexedClass? referencesFromIndexed;
 
+  @override
+  final bool isMacro;
+
   SourceClassBuilder(
-    List<MetadataBuilder>? metadata,
-    int modifiers,
-    String name,
-    List<TypeVariableBuilder>? typeVariables,
-    TypeBuilder? supertype,
-    List<TypeBuilder>? interfaces,
-    List<TypeBuilder>? onTypes,
-    Scope scope,
-    ConstructorScope constructors,
-    SourceLibraryBuilder parent,
-    this.constructorReferences,
-    int startCharOffset,
-    int nameOffset,
-    int charEndOffset,
-    this.referencesFromIndexed, {
-    Class? cls,
-    this.mixedInTypeBuilder,
-    this.isMixinDeclaration = false,
-  })  : actualCls = initializeClass(cls, typeVariables, name, parent,
+      List<MetadataBuilder>? metadata,
+      int modifiers,
+      String name,
+      List<TypeVariableBuilder>? typeVariables,
+      TypeBuilder? supertype,
+      List<TypeBuilder>? interfaces,
+      List<TypeBuilder>? onTypes,
+      Scope scope,
+      ConstructorScope constructors,
+      SourceLibraryBuilder parent,
+      this.constructorReferences,
+      int startCharOffset,
+      int nameOffset,
+      int charEndOffset,
+      this.referencesFromIndexed,
+      {Class? cls,
+      this.mixedInTypeBuilder,
+      this.isMixinDeclaration = false,
+      this.isMacro: false})
+      : actualCls = initializeClass(cls, typeVariables, name, parent,
             startCharOffset, nameOffset, charEndOffset, referencesFromIndexed),
         super(metadata, modifiers, name, typeVariables, supertype, interfaces,
             onTypes, scope, constructors, parent, nameOffset) {
@@ -238,6 +243,7 @@
     // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
     // compile-time error.
     cls.isAbstract = isAbstract;
+    cls.isMacro = isMacro;
     if (interfaceBuilders != null) {
       for (int i = 0; i < interfaceBuilders!.length; ++i) {
         interfaceBuilders![i] = checkSupertype(interfaceBuilders![i]);
@@ -912,7 +918,6 @@
         new ConstructorTearOff(constructorBuilder.member)..parent = literal);
   }
 
-  @override
   int resolveConstructors(SourceLibraryBuilder library) {
     if (constructorReferences == null) return 0;
     for (ConstructorReferenceBuilder ref in constructorReferences!) {
@@ -1002,8 +1007,13 @@
     return count;
   }
 
-  void checkOverride(Types types, Member declaredMember, Member interfaceMember,
-      bool isSetter, callback(Member interfaceMember, bool isSetter),
+  void checkOverride(
+      Types types,
+      ClassHierarchyMembers memberHierarchy,
+      Member declaredMember,
+      Member interfaceMember,
+      bool isSetter,
+      callback(Member interfaceMember, bool isSetter),
       {required bool isInterfaceCheck,
       required bool declaredNeedsLegacyErasure}) {
     // ignore: unnecessary_null_comparison
@@ -1031,7 +1041,8 @@
               isInterfaceCheck,
               declaredNeedsLegacyErasure);
           if (seenCovariant) {
-            handleSeenCovariant(types, interfaceMember, isSetter, callback);
+            handleSeenCovariant(
+                memberHierarchy, interfaceMember, isSetter, callback);
           }
         } else if (declaredMember.kind == ProcedureKind.Getter) {
           checkGetterOverride(
@@ -1050,7 +1061,8 @@
               isInterfaceCheck,
               declaredNeedsLegacyErasure);
           if (seenCovariant) {
-            handleSeenCovariant(types, interfaceMember, isSetter, callback);
+            handleSeenCovariant(
+                memberHierarchy, interfaceMember, isSetter, callback);
           }
         } else {
           assert(
@@ -1090,7 +1102,8 @@
             isInterfaceCheck,
             declaredNeedsLegacyErasure);
         if (seenCovariant) {
-          handleSeenCovariant(types, interfaceMember, isSetter, callback);
+          handleSeenCovariant(
+              memberHierarchy, interfaceMember, isSetter, callback);
         }
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index da6208a..3c68b27 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -17,6 +17,7 @@
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
 import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
+import 'package:kernel/core_types.dart';
 
 import 'package:kernel/reference_from_index.dart'
     show IndexedClass, IndexedContainer, IndexedLibrary;
@@ -80,10 +81,11 @@
 
 import '../import.dart' show Import;
 
-import '../kernel/class_hierarchy_builder.dart';
+import '../kernel/hierarchy/members_builder.dart';
 import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/implicit_field_type.dart';
 import '../kernel/internal_ast.dart';
+import '../kernel/kernel_helper.dart';
 import '../kernel/load_library_builder.dart';
 import '../kernel/type_algorithms.dart'
     show
@@ -106,6 +108,7 @@
         declaresConstConstructorMask,
         hasInitializerMask,
         initializingFormalMask,
+        superInitializingFormalMask,
         lateMask,
         mixinDeclarationMask,
         namedMixinApplicationMask,
@@ -121,6 +124,7 @@
 
 import '../type_inference/type_inferrer.dart' show TypeInferrerImpl;
 
+import '../util/helpers.dart';
 import 'name_scheme.dart';
 import 'source_class_builder.dart' show SourceClassBuilder;
 import 'source_extension_builder.dart';
@@ -180,7 +184,7 @@
   @override
   final Library library;
 
-  final SourceLibraryBuilder? actualOrigin;
+  final SourceLibraryBuilder? _origin;
 
   final List<FunctionBuilder> nativeMethods = <FunctionBuilder>[];
 
@@ -255,13 +259,15 @@
   /// [forEachExtensionInScope].
   Set<ExtensionBuilder>? _extensionsInScope;
 
+  List<SourceLibraryBuilder>? _patchLibraries;
+
   SourceLibraryBuilder.internal(
       SourceLoader loader,
       Uri fileUri,
       Uri? packageUri,
       LanguageVersion packageLanguageVersion,
       Scope? scope,
-      SourceLibraryBuilder? actualOrigin,
+      SourceLibraryBuilder? origin,
       Library library,
       LibraryBuilder? nameOrigin,
       Library? referencesFrom,
@@ -273,7 +279,7 @@
             packageLanguageVersion,
             new TypeParameterScopeBuilder.library(),
             scope ?? new Scope.top(),
-            actualOrigin,
+            origin,
             library,
             nameOrigin,
             referencesFrom);
@@ -285,7 +291,7 @@
       this.packageLanguageVersion,
       this._libraryTypeParameterScopeBuilder,
       this.importScope,
-      this.actualOrigin,
+      SourceLibraryBuilder? origin,
       this.library,
       this._nameOrigin,
       this.referencesFrom)
@@ -293,6 +299,7 @@
         currentTypeParameterScopeBuilder = _libraryTypeParameterScopeBuilder,
         referencesFromIndexed =
             referencesFrom == null ? null : new IndexedLibrary(referencesFrom),
+        _origin = origin,
         super(fileUri, _libraryTypeParameterScopeBuilder.toScope(importScope),
             new Scope.top()) {
     assert(
@@ -318,12 +325,18 @@
   Version? _enableConstructorTearoffsVersionInLibrary;
   Version? _enableExtensionTypesVersionInLibrary;
   Version? _enableNamedArgumentsAnywhereVersionInLibrary;
+  Version? _enableSuperParametersVersionInLibrary;
+  Version? _enableEnhancedEnumsVersionInLibrary;
+  Version? _enableMacrosVersionInLibrary;
   bool? _enableTripleShiftInLibrary;
   bool? _enableExtensionMethodsInLibrary;
   bool? _enableGenericMetadataInLibrary;
   bool? _enableExtensionTypesInLibrary;
+  bool? _enableEnhancedEnumsInLibrary;
   bool? _enableConstructorTearOffsInLibrary;
   bool? _enableNamedArgumentsAnywhereInLibrary;
+  bool? _enableSuperParametersInLibrary;
+  bool? _enableMacrosInLibrary;
 
   bool get enableConstFunctionsInLibrary => _enableConstFunctionsInLibrary ??=
       loader.target.isExperimentEnabledInLibraryByVersion(
@@ -411,6 +424,36 @@
               ExperimentalFlag.namedArgumentsAnywhere,
               _packageUri ?? importUri);
 
+  bool get enableSuperParametersInLibrary => _enableSuperParametersInLibrary ??=
+      loader.target.isExperimentEnabledInLibraryByVersion(
+          ExperimentalFlag.superParameters,
+          _packageUri ?? importUri,
+          languageVersion.version);
+
+  Version get enableSuperParametersVersionInLibrary =>
+      _enableSuperParametersVersionInLibrary ??= loader.target
+          .getExperimentEnabledVersionInLibrary(
+              ExperimentalFlag.superParameters, _packageUri ?? importUri);
+
+  bool get enableEnhancedEnumsInLibrary => _enableEnhancedEnumsInLibrary ??=
+      loader.target.isExperimentEnabledInLibraryByVersion(
+          ExperimentalFlag.enhancedEnums,
+          _packageUri ?? importUri,
+          languageVersion.version);
+
+  Version get enableEnhancedEnumsVersionInLibrary =>
+      _enableEnhancedEnumsVersionInLibrary ??= loader.target
+          .getExperimentEnabledVersionInLibrary(
+              ExperimentalFlag.enhancedEnums, _packageUri ?? importUri);
+
+  bool get enableMacrosInLibrary => _enableMacrosInLibrary ??= loader.target
+      .isExperimentEnabledInLibraryByVersion(ExperimentalFlag.macros,
+          _packageUri ?? importUri, languageVersion.version);
+
+  Version get enableMacrosVersionInLibrary => _enableMacrosVersionInLibrary ??=
+      loader.target.getExperimentEnabledVersionInLibrary(
+          ExperimentalFlag.macros, _packageUri ?? importUri);
+
   void _updateLibraryNNBDSettings() {
     library.isNonNullableByDefault = isNonNullableByDefault;
     switch (loader.nnbdMode) {
@@ -430,13 +473,13 @@
   }
 
   SourceLibraryBuilder(
-      Uri uri,
-      Uri fileUri,
+      {required Uri importUri,
+      required Uri fileUri,
       Uri? packageUri,
-      LanguageVersion packageLanguageVersion,
-      SourceLoader loader,
-      SourceLibraryBuilder? actualOrigin,
-      {Scope? scope,
+      required LanguageVersion packageLanguageVersion,
+      required SourceLoader loader,
+      SourceLibraryBuilder? origin,
+      Scope? scope,
       Library? target,
       LibraryBuilder? nameOrigin,
       Library? referencesFrom,
@@ -447,10 +490,10 @@
             packageUri,
             packageLanguageVersion,
             scope,
-            actualOrigin,
+            origin,
             target ??
-                (actualOrigin?.library ??
-                    new Library(uri,
+                (origin?.library ??
+                    new Library(importUri,
                         fileUri: fileUri,
                         reference: referenceIsPartOwner == true
                             ? null
@@ -463,6 +506,17 @@
   @override
   bool get isPart => partOfName != null || partOfUri != null;
 
+  // TODO(johnniwinther): Can avoid using this from outside this class?
+  Iterable<SourceLibraryBuilder>? get patchLibraries => _patchLibraries;
+
+  void addPatchLibrary(SourceLibraryBuilder patchLibrary) {
+    assert(patchLibrary.isPatch,
+        "Library ${patchLibrary} must be a patch library.");
+    assert(!patchLibrary.isPart,
+        "Patch library ${patchLibrary} cannot be a part .");
+    (_patchLibraries ??= []).add(patchLibrary);
+  }
+
   List<NamedTypeBuilder> get unresolvedNamedTypes =>
       _libraryTypeParameterScopeBuilder.unresolvedNamedTypes;
 
@@ -694,11 +748,10 @@
         loader.lookupLibraryBuilder(new Uri(scheme: "dart", path: dottedName));
 
     if (imported == null) {
-      LibraryBuilder coreLibrary = loader.read(
-          resolve(this.importUri,
-              new Uri(scheme: "dart", path: "core").toString(), -1),
-          -1,
-          accessor: loader.first);
+      LibraryBuilder coreLibrary = loader.readAsEntryPoint(resolve(
+          this.importUri,
+          new Uri(scheme: "dart", path: "core").toString(),
+          -1));
       imported = coreLibrary.loader
           .lookupLibraryBuilder(new Uri(scheme: 'dart', path: dottedName));
     }
@@ -774,13 +827,7 @@
     if (uri != null) {
       partOfUri = resolve(this.importUri, uri, uriOffset);
       Uri newFileUri = resolve(fileUri, uri, uriOffset);
-      LibraryBuilder library = loader.read(partOfUri!, uriOffset,
-          fileUri: newFileUri, accessor: this);
-      if (loader.first == this) {
-        // This is a part, and it was the first input. Let the loader know
-        // about that.
-        loader.first = library;
-      }
+      loader.read(partOfUri!, uriOffset, fileUri: newFileUri, accessor: this);
     }
   }
 
@@ -1024,6 +1071,19 @@
 
   /// Builds the core AST structure of this library as needed for the outline.
   Library build(LibraryBuilder coreLibrary, {bool modifyTarget: true}) {
+    // TODO(johnniwinther): Avoid the need to process patch libraries before
+    // the origin. Currently, settings performed by the patch are overridden
+    // by the origin. For instance, the `Map` class is abstract in the origin
+    // but (unintentionally) concrete in the patch. By processing the origin
+    // last the `isAbstract` property set by the patch is corrected by the
+    // origin.
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.build(coreLibrary, modifyTarget: modifyTarget);
+      }
+    }
+
     checkMemberConflicts(this, scope,
         checkForInstanceVsStaticConflict: false,
         checkForMethodVsSetterConflict: true);
@@ -1270,9 +1330,9 @@
         (library.problemsAsJson ??= <String>[])
             .addAll(part.library.problemsAsJson!);
       }
-      List<FieldBuilder>? partImplicitlyTypedFields =
-          part.takeImplicitlyTypedFields();
-      if (partImplicitlyTypedFields != null) {
+      List<FieldBuilder> partImplicitlyTypedFields = [];
+      part.collectImplicitlyTypedFields(partImplicitlyTypedFields);
+      if (partImplicitlyTypedFields.isNotEmpty) {
         if (_implicitlyTypedFields == null) {
           _implicitlyTypedFields = partImplicitlyTypedFields;
         } else {
@@ -1303,6 +1363,13 @@
   }
 
   void buildInitialScopes() {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.buildInitialScopes();
+      }
+    }
+
     NameIterator iterator = nameIterator;
     while (iterator.moveNext()) {
       addToExportScope(iterator.name, iterator.current);
@@ -1310,6 +1377,13 @@
   }
 
   void addImportsToScope() {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.addImportsToScope();
+      }
+    }
+
     bool explicitCoreImport = this == loader.coreLibrary;
     for (Import import in imports) {
       if (import.imported?.isPart ?? false) {
@@ -1412,7 +1486,16 @@
   /// Resolves all unresolved types in [unresolvedNamedTypes]. The list of types
   /// is cleared when done.
   int resolveTypes() {
-    int typeCount = unresolvedNamedTypes.length;
+    int typeCount = 0;
+
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        typeCount += patchLibrary.resolveTypes();
+      }
+    }
+
+    typeCount += unresolvedNamedTypes.length;
     for (NamedTypeBuilder namedType in unresolvedNamedTypes) {
       namedType.resolveIn(
           scope, namedType.charOffset!, namedType.fileUri!, this);
@@ -1422,12 +1505,75 @@
     return typeCount;
   }
 
-  @override
-  int resolveConstructors(_) {
-    int count = 0;
+  void installDefaultSupertypes(
+      ClassBuilder objectClassBuilder, Class objectClass) {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.installDefaultSupertypes(objectClassBuilder, objectClass);
+      }
+    }
+
     Iterator<Builder> iterator = this.iterator;
     while (iterator.moveNext()) {
-      count += iterator.current.resolveConstructors(this);
+      Builder declaration = iterator.current;
+      if (declaration is SourceClassBuilder) {
+        Class cls = declaration.cls;
+        if (cls != objectClass) {
+          cls.supertype ??= objectClass.asRawSupertype;
+          declaration.supertypeBuilder ??= new NamedTypeBuilder(
+              "Object",
+              const NullabilityBuilder.omitted(),
+              /* arguments = */ null,
+              /* fileUri = */ null,
+              /* charOffset = */ null,
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Unexpected)
+            ..bind(objectClassBuilder);
+        }
+        if (declaration.isMixinApplication) {
+          cls.mixedInType = declaration.mixedInTypeBuilder!.buildMixedInType(
+              this, declaration.charOffset, declaration.fileUri);
+        }
+      }
+    }
+  }
+
+  void collectSourceClasses(List<SourceClassBuilder> sourceClasses) {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.collectSourceClasses(sourceClasses);
+      }
+    }
+
+    Iterator<Builder> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      Builder member = iterator.current;
+      if (member is SourceClassBuilder && !member.isPatch) {
+        sourceClasses.add(member);
+      }
+    }
+  }
+
+  /// Resolve constructors (lookup names in scope) recorded in this builder and
+  /// return the number of constructors resolved.
+  int resolveConstructors() {
+    int count = 0;
+
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        count += patchLibrary.resolveConstructors();
+      }
+    }
+
+    Iterator<Builder> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      Builder builder = iterator.current;
+      if (builder is SourceClassBuilder) {
+        count += builder.resolveConstructors(this);
+      }
     }
     return count;
   }
@@ -1470,7 +1616,7 @@
   }
 
   @override
-  SourceLibraryBuilder get origin => actualOrigin ?? this;
+  SourceLibraryBuilder get origin => _origin ?? this;
 
   @override
   Uri get importUri => library.importUri;
@@ -1618,7 +1764,8 @@
       int startOffset,
       int nameOffset,
       int endOffset,
-      int supertypeOffset) {
+      int supertypeOffset,
+      {required bool isMacro}) {
     _addClass(
         TypeParameterScopeKind.classDeclaration,
         metadata,
@@ -1630,7 +1777,8 @@
         startOffset,
         nameOffset,
         endOffset,
-        supertypeOffset);
+        supertypeOffset,
+        isMacro: isMacro);
   }
 
   void addMixinDeclaration(
@@ -1655,7 +1803,8 @@
         startOffset,
         nameOffset,
         endOffset,
-        supertypeOffset);
+        supertypeOffset,
+        isMacro: false);
   }
 
   void _addClass(
@@ -1669,7 +1818,8 @@
       int startOffset,
       int nameOffset,
       int endOffset,
-      int supertypeOffset) {
+      int supertypeOffset,
+      {required bool isMacro}) {
     _checkBadFunctionDeclUse(className, kind, nameOffset);
     _checkBadFunctionParameter(typeVariables);
     // Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
@@ -1707,7 +1857,7 @@
         typeVariables,
         applyMixins(supertype, startOffset, nameOffset, endOffset, className,
             isMixinDeclaration,
-            typeVariables: typeVariables),
+            typeVariables: typeVariables, isMacro: false),
         interfaces,
         // TODO(johnniwinther): Add the `on` clause types of a mixin declaration
         // here.
@@ -1720,7 +1870,8 @@
         nameOffset,
         endOffset,
         _currentClassReferencesFromIndexed,
-        isMixinDeclaration: isMixinDeclaration);
+        isMixinDeclaration: isMixinDeclaration,
+        isMacro: isMacro);
 
     constructorReferences.clear();
     Map<String, TypeVariableBuilder>? typeVariablesByName =
@@ -1980,7 +2131,8 @@
       String? name,
       List<TypeVariableBuilder>? typeVariables,
       int modifiers: 0,
-      List<TypeBuilder>? interfaces}) {
+      List<TypeBuilder>? interfaces,
+      required bool isMacro}) {
     if (name == null) {
       // The following parameters should only be used when building a named
       // mixin application.
@@ -2172,34 +2324,34 @@
         }
 
         SourceClassBuilder application = new SourceClassBuilder(
-          isNamedMixinApplication ? metadata : null,
-          isNamedMixinApplication
-              ? modifiers | namedMixinApplicationMask
-              : abstractMask,
-          fullname,
-          applicationTypeVariables,
-          isMixinDeclaration ? null : supertype,
-          isNamedMixinApplication
-              ? interfaces
-              : isMixinDeclaration
-                  ? [supertype, mixin]
-                  : null,
-          null, // No `on` clause types.
-          new Scope(
-              local: <String, MemberBuilder>{},
-              setters: <String, MemberBuilder>{},
-              parent: scope.withTypeVariables(typeVariables),
-              debugName: "mixin $fullname ",
-              isModifiable: false),
-          new ConstructorScope(fullname, <String, MemberBuilder>{}),
-          this,
-          <ConstructorReferenceBuilder>[],
-          computedStartCharOffset,
-          charOffset,
-          charEndOffset,
-          referencesFromIndexedClass,
-          mixedInTypeBuilder: isMixinDeclaration ? null : mixin,
-        );
+            isNamedMixinApplication ? metadata : null,
+            isNamedMixinApplication
+                ? modifiers | namedMixinApplicationMask
+                : abstractMask,
+            fullname,
+            applicationTypeVariables,
+            isMixinDeclaration ? null : supertype,
+            isNamedMixinApplication
+                ? interfaces
+                : isMixinDeclaration
+                    ? [supertype, mixin]
+                    : null,
+            null, // No `on` clause types.
+            new Scope(
+                local: <String, MemberBuilder>{},
+                setters: <String, MemberBuilder>{},
+                parent: scope.withTypeVariables(typeVariables),
+                debugName: "mixin $fullname ",
+                isModifiable: false),
+            new ConstructorScope(fullname, <String, MemberBuilder>{}),
+            this,
+            <ConstructorReferenceBuilder>[],
+            computedStartCharOffset,
+            charOffset,
+            charEndOffset,
+            referencesFromIndexedClass,
+            mixedInTypeBuilder: isMixinDeclaration ? null : mixin,
+            isMacro: isNamedMixinApplication && isMacro);
         // TODO(ahe, kmillikin): Should always be true?
         // pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart can't
         // handle that :(
@@ -2226,7 +2378,8 @@
       List<TypeBuilder>? interfaces,
       int startCharOffset,
       int charOffset,
-      int charEndOffset) {
+      int charEndOffset,
+      {required bool isMacro}) {
     // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
     endNestedDeclaration(TypeParameterScopeKind.namedMixinApplication, name)
         .resolveNamedTypes(typeVariables, this);
@@ -2236,7 +2389,8 @@
         name: name,
         typeVariables: typeVariables,
         modifiers: modifiers,
-        interfaces: interfaces)!;
+        interfaces: interfaces,
+        isMacro: isMacro)!;
     checkTypeVariables(typeVariables, supertype.declaration);
   }
 
@@ -2670,6 +2824,11 @@
       referencesFromIndexedClass =
           referencesFromIndexed!.lookupIndexedClass(name);
     }
+    // Nested declaration began in `OutlineBuilder.beginEnum`.
+    // TODO(cstefantsova): Use actual type variables here.
+    TypeParameterScopeBuilder declaration =
+        endNestedDeclaration(TypeParameterScopeKind.enumDeclaration, name)
+          ..resolveNamedTypes([], this);
     EnumBuilder builder = new EnumBuilder(
         metadata,
         name,
@@ -2678,7 +2837,13 @@
         startCharOffset,
         charOffset,
         charEndOffset,
-        referencesFromIndexedClass);
+        referencesFromIndexedClass,
+        new Scope(
+            local: declaration.members!,
+            setters: declaration.setters!,
+            parent: scope.withTypeVariables(<TypeVariableBuilder>[]),
+            debugName: "enum $name",
+            isModifiable: false));
     addBuilder(name, builder, charOffset,
         getterReference: referencesFromIndexedClass?.cls.reference);
   }
@@ -2739,11 +2904,17 @@
       TypeBuilder? type,
       String name,
       bool hasThis,
+      bool hasSuper,
       int charOffset,
       Token? initializerToken) {
+    assert(!hasThis || !hasSuper,
+        "Formal parameter '${name}' has both 'this' and 'super' prefixes.");
     if (hasThis) {
       modifiers |= initializingFormalMask;
     }
+    if (hasSuper) {
+      modifiers |= superInitializingFormalMask;
+    }
     FormalParameterBuilder formal = new FormalParameterBuilder(
         metadata, modifiers, type, name, this, charOffset,
         fileUri: fileUri)
@@ -2762,10 +2933,45 @@
     return builder;
   }
 
-  @override
-  void buildOutlineExpressions() {
+  void buildOutlineExpressions(
+      CoreTypes coreTypes,
+      List<SynthesizedFunctionNode> synthesizedFunctionNodes,
+      List<DelayedActionPerformer> delayedActionPerformers) {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.buildOutlineExpressions(
+            coreTypes, synthesizedFunctionNodes, delayedActionPerformers);
+      }
+    }
+
     MetadataBuilder.buildAnnotations(
         library, metadata, this, null, null, fileUri, scope);
+
+    Iterator<Builder> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      Builder declaration = iterator.current;
+      if (declaration is ClassBuilder) {
+        declaration.buildOutlineExpressions(
+            this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+      } else if (declaration is ExtensionBuilder) {
+        declaration.buildOutlineExpressions(
+            this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+      } else if (declaration is MemberBuilder) {
+        declaration.buildOutlineExpressions(
+            this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+      } else if (declaration is SourceTypeAliasBuilder) {
+        declaration.buildOutlineExpressions(
+            this, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+      } else {
+        assert(
+            declaration is PrefixBuilder ||
+                declaration is DynamicTypeDeclarationBuilder ||
+                declaration is NeverTypeDeclarationBuilder,
+            "Unexpected builder in library: ${declaration} "
+            "(${declaration.runtimeType}");
+      }
+    }
   }
 
   /// Builds the core AST structures for [declaration] needed for the outline.
@@ -2978,9 +3184,16 @@
         suppressMessage: false);
   }
 
-  @override
   int finishDeferredLoadTearoffs() {
     int total = 0;
+
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        total += patchLibrary.finishDeferredLoadTearoffs();
+      }
+    }
+
     for (Import import in imports) {
       if (import.deferred) {
         Procedure? tearoff = import.prefixBuilder!.loadLibraryBuilder!.tearoff;
@@ -2990,12 +3203,20 @@
         total++;
       }
     }
+
     return total;
   }
 
-  @override
   int finishForwarders() {
     int count = 0;
+
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        count += patchLibrary.finishForwarders();
+      }
+    }
+
     CloneVisitorNotMembers cloner = new CloneVisitorNotMembers();
     for (int i = 0; i < forwardersOrigins.length; i += 2) {
       Procedure forwarder = forwardersOrigins[i];
@@ -3048,12 +3269,22 @@
     nativeMethods.add(method);
   }
 
-  @override
   int finishNativeMethods() {
+    int count = 0;
+
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        count += patchLibrary.finishNativeMethods();
+      }
+    }
+
     for (FunctionBuilder method in nativeMethods) {
       method.becomeNative(loader);
     }
-    return nativeMethods.length;
+    count += nativeMethods.length;
+
+    return count;
   }
 
   /// Creates a copy of [original] into the scope of [declaration].
@@ -3085,9 +3316,18 @@
     return copy;
   }
 
-  @override
   int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
-    int count = unboundTypeVariables.length;
+    int count = 0;
+
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        count += patchLibrary.finishTypeVariables(object, dynamicType);
+      }
+    }
+
+    count += unboundTypeVariables.length;
+
     // Ensure that type parameters are built after their dependencies by sorting
     // them topologically using references in bounds.
     for (TypeVariableBuilder builder
@@ -3192,9 +3432,20 @@
     _pendingNullabilities.clear();
   }
 
-  @override
+  /// Computes variances of type parameters on typedefs.
+  ///
+  /// The variance property of type parameters on typedefs is computed from the
+  /// use of the parameters in the right-hand side of the typedef definition.
   int computeVariances() {
     int count = 0;
+
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        count += patchLibrary.computeVariances();
+      }
+    }
+
     for (Builder? declaration
         in _libraryTypeParameterScopeBuilder.members!.values) {
       while (declaration != null) {
@@ -3298,11 +3549,22 @@
     return false;
   }
 
-  @override
+  /// This method instantiates type parameters to their bounds in some cases
+  /// where they were omitted by the programmer and not provided by the type
+  /// inference.  The method returns the number of distinct type variables
+  /// that were instantiated in this library.
   int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
       TypeBuilder bottomType, ClassBuilder objectClass) {
     int count = 0;
 
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        count += patchLibrary.computeDefaultTypes(
+            dynamicType, nullType, bottomType, objectClass);
+      }
+    }
+
     int computeDefaultTypesForVariables(List<TypeVariableBuilder>? variables,
         {required bool inErrorRecovery}) {
       if (variables == null) return 0;
@@ -3522,7 +3784,6 @@
         }
       }
     }
-
     return count;
   }
 
@@ -3590,13 +3851,21 @@
     }
   }
 
-  @override
   int finishPatchMethods() {
-    if (!isPatch) return 0;
     int count = 0;
-    Iterator<Builder> iterator = this.iterator;
-    while (iterator.moveNext()) {
-      count += iterator.current.finishPatch();
+
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        count += patchLibrary.finishPatchMethods();
+      }
+    }
+
+    if (isPatch) {
+      Iterator<Builder> iterator = this.iterator;
+      while (iterator.moveNext()) {
+        count += iterator.current.finishPatch();
+      }
     }
     return count;
   }
@@ -4231,6 +4500,13 @@
   }
 
   void checkTypesInOutline(TypeEnvironment typeEnvironment) {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.checkTypesInOutline(typeEnvironment);
+      }
+    }
+
     Iterator<Builder> iterator = this.iterator;
     while (iterator.moveNext()) {
       Builder declaration = iterator.current;
@@ -4263,7 +4539,14 @@
     checkUncheckedTypedefTypes(typeEnvironment);
   }
 
-  void computeShowHideElements(ClassHierarchyBuilder hierarchy) {
+  void computeShowHideElements(ClassMembersBuilder membersBuilder) {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.computeShowHideElements(membersBuilder);
+      }
+    }
+
     assert(currentTypeParameterScopeBuilder.kind ==
         TypeParameterScopeKind.library);
     for (SourceExtensionBuilder extensionBuilder
@@ -4275,8 +4558,9 @@
                 new ExtensionTypeShowHideClause();
 
         // TODO(dmitryas): Handle private names.
-        List<Supertype> supertypes =
-            hierarchy.getNodeFromClass(onType.classNode).superclasses;
+        List<Supertype> supertypes = membersBuilder.hierarchyBuilder
+            .getNodeFromClass(onType.classNode)
+            .superclasses;
         Map<String, Supertype> supertypesByName = <String, Supertype>{};
         for (Supertype supertype in supertypes) {
           // TODO(dmitryas): Should only non-generic supertypes be allowed?
@@ -4286,7 +4570,7 @@
         // Handling elements of the 'show' clause.
         for (String memberOrTypeName in extensionBuilder
             .extensionTypeShowHideClauseBuilder.shownMembersOrTypes) {
-          Member? getableMember = hierarchy.getInterfaceMember(
+          Member? getableMember = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(memberOrTypeName));
           if (getableMember != null) {
             if (getableMember is Field) {
@@ -4299,7 +4583,7 @@
               getableMember.kind == ProcedureKind.Method) {
             showHideClause.shownMethods.add(getableMember.reference);
           }
-          Member? setableMember = hierarchy.getInterfaceMember(
+          Member? setableMember = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(memberOrTypeName),
               setter: true);
           if (setableMember != null) {
@@ -4326,7 +4610,7 @@
         }
         for (String getterName in extensionBuilder
             .extensionTypeShowHideClauseBuilder.shownGetters) {
-          Member? member = hierarchy.getInterfaceMember(
+          Member? member = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(getterName));
           if (member != null) {
             if (member is Field) {
@@ -4342,7 +4626,7 @@
         }
         for (String setterName in extensionBuilder
             .extensionTypeShowHideClauseBuilder.shownSetters) {
-          Member? member = hierarchy.getInterfaceMember(
+          Member? member = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(setterName),
               setter: true);
           if (member != null) {
@@ -4363,7 +4647,7 @@
         }
         for (Operator operator in extensionBuilder
             .extensionTypeShowHideClauseBuilder.shownOperators) {
-          Member? member = hierarchy.getInterfaceMember(
+          Member? member = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(operatorToString(operator)));
           if (member != null) {
             showHideClause.shownOperators.add(member.reference);
@@ -4378,7 +4662,7 @@
         // Handling elements of the 'hide' clause.
         for (String memberOrTypeName in extensionBuilder
             .extensionTypeShowHideClauseBuilder.hiddenMembersOrTypes) {
-          Member? getableMember = hierarchy.getInterfaceMember(
+          Member? getableMember = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(memberOrTypeName));
           if (getableMember != null) {
             if (getableMember is Field) {
@@ -4391,7 +4675,7 @@
               getableMember.kind == ProcedureKind.Method) {
             showHideClause.hiddenMethods.add(getableMember.reference);
           }
-          Member? setableMember = hierarchy.getInterfaceMember(
+          Member? setableMember = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(memberOrTypeName),
               setter: true);
           if (setableMember != null) {
@@ -4419,7 +4703,7 @@
         }
         for (String getterName in extensionBuilder
             .extensionTypeShowHideClauseBuilder.hiddenGetters) {
-          Member? member = hierarchy.getInterfaceMember(
+          Member? member = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(getterName));
           if (member != null) {
             if (member is Field) {
@@ -4435,7 +4719,7 @@
         }
         for (String setterName in extensionBuilder
             .extensionTypeShowHideClauseBuilder.hiddenSetters) {
-          Member? member = hierarchy.getInterfaceMember(
+          Member? member = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(setterName),
               setter: true);
           if (member != null) {
@@ -4456,7 +4740,7 @@
         }
         for (Operator operator in extensionBuilder
             .extensionTypeShowHideClauseBuilder.hiddenOperators) {
-          Member? member = hierarchy.getInterfaceMember(
+          Member? member = membersBuilder.getInterfaceMember(
               onType.classNode, new Name(operatorToString(operator)));
           if (member != null) {
             showHideClause.hiddenOperators.add(member.reference);
@@ -4474,11 +4758,19 @@
     (_implicitlyTypedFields ??= <FieldBuilder>[]).add(fieldBuilder);
   }
 
-  @override
-  List<FieldBuilder>? takeImplicitlyTypedFields() {
-    List<FieldBuilder>? result = _implicitlyTypedFields;
-    _implicitlyTypedFields = null;
-    return result;
+  void collectImplicitlyTypedFields(
+      List<FieldBuilder> implicitlyTypedFieldBuilders) {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.collectImplicitlyTypedFields(implicitlyTypedFieldBuilders);
+      }
+    }
+
+    if (_implicitlyTypedFields != null) {
+      implicitlyTypedFieldBuilders.addAll(_implicitlyTypedFields!);
+      _implicitlyTypedFields = null;
+    }
   }
 
   void forEachExtensionInScope(void Function(ExtensionBuilder) f) {
@@ -4544,6 +4836,13 @@
   }
 
   void installTypedefTearOffs() {
+    Iterable<SourceLibraryBuilder>? patches = this.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        patchLibrary.installTypedefTearOffs();
+      }
+    }
+
     Iterator<Builder> iterator = this.iterator;
     while (iterator.moveNext()) {
       Builder? declaration = iterator.current;
@@ -4579,6 +4878,7 @@
   topLevelMethod,
   factoryMethod,
   functionType,
+  enumDeclaration,
 }
 
 /// A builder object preparing for building declarations that can introduce type
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 29c7861..2f6b52c 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -27,6 +27,7 @@
 import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/reference_from_index.dart' show ReferenceFromIndex;
 import 'package:kernel/type_environment.dart';
+import 'package:kernel/util/graph.dart';
 import 'package:package_config/package_config.dart' as package_config;
 
 import '../../api_prototype/experimental_flags.dart';
@@ -35,11 +36,11 @@
 import '../../base/instrumentation.dart' show Instrumentation;
 import '../../base/nnbd_mode.dart';
 import '../dill/dill_library_builder.dart';
+import '../builder_graph.dart';
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/constructor_builder.dart';
 import '../builder/declaration_builder.dart';
-import '../builder/dynamic_type_declaration_builder.dart';
 import '../builder/enum_builder.dart';
 import '../builder/extension_builder.dart';
 import '../builder/field_builder.dart';
@@ -48,8 +49,6 @@
 import '../builder/member_builder.dart';
 import '../builder/modifier_builder.dart';
 import '../builder/named_type_builder.dart';
-import '../builder/never_type_declaration_builder.dart';
-import '../builder/prefix_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
@@ -60,15 +59,19 @@
 import '../export.dart' show Export;
 import '../fasta_codes.dart';
 import '../kernel/body_builder.dart' show BodyBuilder;
-import '../kernel/class_hierarchy_builder.dart';
+import '../kernel/hierarchy/class_member.dart';
+import '../kernel/hierarchy/delayed.dart';
+import '../kernel/hierarchy/hierarchy_builder.dart';
+import '../kernel/hierarchy/members_builder.dart';
 import '../kernel/kernel_helper.dart'
     show SynthesizedFunctionNode, TypeDependency;
 import '../kernel/kernel_target.dart' show KernelTarget;
+import '../kernel/macro.dart';
 import '../kernel/transform_collections.dart' show CollectionTransformer;
 import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
 import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
 import '../loader.dart' show Loader, untranslatableUriScheme;
-import '../problems.dart' show internalProblem, unhandled;
+import '../problems.dart' show internalProblem;
 import '../scope.dart';
 import '../ticker.dart' show Ticker;
 import '../type_inference/type_inference_engine.dart';
@@ -81,11 +84,10 @@
 import 'source_class_builder.dart' show SourceClassBuilder;
 import 'source_library_builder.dart'
     show
-        LanguageVersion,
-        InvalidLanguageVersion,
         ImplicitLanguageVersion,
+        InvalidLanguageVersion,
+        LanguageVersion,
         SourceLibraryBuilder;
-import 'source_type_alias_builder.dart';
 import 'stack_listener_impl.dart' show offsetForToken;
 
 class SourceLoader extends Loader {
@@ -97,7 +99,9 @@
 
   final Map<Uri, List<int>> sourceBytes = <Uri, List<int>>{};
 
-  ClassHierarchyBuilder? _builderHierarchy;
+  ClassHierarchyBuilder? _hierarchyBuilder;
+
+  ClassMembersBuilder? _membersBuilder;
 
   ReferenceFromIndex? referenceFromIndex;
 
@@ -144,6 +148,8 @@
 
   final Map<Uri, LibraryBuilder> _builders = <Uri, LibraryBuilder>{};
 
+  List<SourceLibraryBuilder>? _sourceLibraryBuilders;
+
   final Queue<LibraryBuilder> _unparsedLibraries = new Queue<LibraryBuilder>();
 
   final List<Library> libraries = <Library>[];
@@ -193,12 +199,22 @@
 
   /// The first library that we've been asked to compile. When compiling a
   /// program (aka script), this is the library that should have a main method.
-  LibraryBuilder? first;
+  Uri? _firstUri;
+
+  LibraryBuilder? get first => _builders[_firstUri];
+
+  Uri? get firstUri => _firstUri;
+
+  void set firstUri(Uri? value) {
+    _firstUri = value;
+  }
 
   int byteCount = 0;
 
   Uri? currentUriForCrashReporting;
 
+  ClassBuilder? _macroClassBuilder;
+
   SourceLoader(this.fileSystem, this.includeComments, this.target)
       : dataForTesting =
             retainDataForTesting ? new SourceLoaderDataForTesting() : null;
@@ -209,12 +225,28 @@
   @override
   LibraryBuilder? lookupLibraryBuilder(Uri importUri) => _builders[importUri];
 
+  /// The [LibraryBuilder]s for libraries built from source or loaded from dill.
+  ///
+  /// Before [resolveParts] have been called, this includes parts and patches.
   Iterable<LibraryBuilder> get libraryBuilders => _builders.values;
 
+  /// The [SourceLibraryBuilder]s for the libraries built from source by this
+  /// source loader.
+  ///
+  /// This is available after [resolveParts] have been called and doesn't
+  /// include parts or patches. Orphaned parts _are_ included.
+  List<SourceLibraryBuilder> get sourceLibraryBuilders {
+    assert(
+        _sourceLibraryBuilders != null,
+        "Source library builder hasn't been computed yet. "
+        "The source libraries are in SourceLoader.resolveParts.");
+    return _sourceLibraryBuilders!;
+  }
+
   Iterable<Uri> get libraryImportUris => _builders.keys;
 
-  void registerLibraryBuilder(LibraryBuilder libraryBuilder, [Uri? uri]) {
-    uri ??= libraryBuilder.importUri;
+  void registerLibraryBuilder(LibraryBuilder libraryBuilder) {
+    Uri uri = libraryBuilder.importUri;
     if (uri.scheme == "dart" && uri.path == "core") {
       _coreLibrary = libraryBuilder;
     }
@@ -234,8 +266,8 @@
 
   Ticker get ticker => target.ticker;
 
-  /// Creates a [SourceLibraryBuilder] corresponding to [uri], if one doesn't
-  /// exist already.
+  /// Creates a [SourceLibraryBuilder] corresponding to [importUri], if one
+  /// doesn't exist already.
   ///
   /// [fileUri] must not be null and is a URI that can be passed to FileSystem
   /// to locate the corresponding file.
@@ -259,15 +291,20 @@
   /// which the library belongs to, or the current sdk version if the library
   /// doesn't belong to a package.
   SourceLibraryBuilder createLibraryBuilder(
-      Uri uri,
-      Uri fileUri,
+      {required Uri importUri,
+      required Uri fileUri,
       Uri? packageUri,
-      LanguageVersion packageLanguageVersion,
+      required LanguageVersion packageLanguageVersion,
       SourceLibraryBuilder? origin,
       Library? referencesFrom,
-      bool? referenceIsPartOwner) {
+      bool? referenceIsPartOwner}) {
     return new SourceLibraryBuilder(
-        uri, fileUri, packageUri, packageLanguageVersion, this, origin,
+        importUri: importUri,
+        fileUri: fileUri,
+        packageUri: packageUri,
+        packageLanguageVersion: packageLanguageVersion,
+        loader: this,
+        origin: origin,
         referencesFrom: referencesFrom,
         referenceIsPartOwner: referenceIsPartOwner);
   }
@@ -351,13 +388,13 @@
         new ImplicitLanguageVersion(target.currentSdkVersion);
 
     SourceLibraryBuilder libraryBuilder = createLibraryBuilder(
-        uri,
-        fileUri,
-        packageUri,
-        packageLanguageVersion,
-        origin,
-        referencesFrom,
-        referenceIsPartOwner);
+        importUri: uri,
+        fileUri: fileUri,
+        packageUri: packageUri,
+        packageLanguageVersion: packageLanguageVersion,
+        origin: origin,
+        referencesFrom: referencesFrom,
+        referenceIsPartOwner: referenceIsPartOwner);
     if (packageLanguageVersionProblem != null) {
       libraryBuilder.addPostponedProblem(
           packageLanguageVersionProblem, 0, noLength, libraryBuilder.fileUri);
@@ -367,7 +404,7 @@
     // firstSourceUri and first library should be done as early as
     // possible.
     firstSourceUri ??= uri;
-    first ??= libraryBuilder;
+    firstUri ??= libraryBuilder.importUri;
 
     _checkForDartCore(uri, libraryBuilder);
 
@@ -466,7 +503,68 @@
   /// compile-time error.
   LibraryBuilder read(Uri uri, int charOffset,
       {Uri? fileUri,
-      LibraryBuilder? accessor,
+      required LibraryBuilder accessor,
+      LibraryBuilder? origin,
+      Library? referencesFrom,
+      bool? referenceIsPartOwner}) {
+    LibraryBuilder libraryBuilder = _read(uri,
+        fileUri: fileUri,
+        origin: origin,
+        referencesFrom: referencesFrom,
+        referenceIsPartOwner: referenceIsPartOwner);
+    libraryBuilder.recordAccess(charOffset, noLength, accessor.fileUri);
+    if (!_hasLibraryAccess(imported: uri, importer: accessor.importUri) &&
+        !accessor.isPatch) {
+      accessor.addProblem(messagePlatformPrivateLibraryAccess, charOffset,
+          noLength, accessor.fileUri);
+    }
+    return libraryBuilder;
+  }
+
+  /// Reads the library [uri] as an entry point. This is used for reading the
+  /// entry point library of a script or the explicitly mention libraries of
+  /// a modular or incremental compilation.
+  ///
+  /// This differs from [read] in that there is no accessor library, meaning
+  /// that access to platform private libraries cannot be granted.
+  LibraryBuilder readAsEntryPoint(Uri uri,
+      {Uri? fileUri, Library? referencesFrom}) {
+    LibraryBuilder libraryBuilder =
+        _read(uri, fileUri: fileUri, referencesFrom: referencesFrom);
+    // TODO(johnniwinther): Avoid using the first library, if present, as the
+    // accessor of [libraryBuilder]. Currently the incremental compiler doesn't
+    // handle errors reported without an accessor, since the messages are not
+    // associated with a library. This currently has the side effect that
+    // the first library is the accessor of itself.
+    LibraryBuilder? firstLibrary = first;
+    if (firstLibrary != null) {
+      libraryBuilder.recordAccess(-1, noLength, firstLibrary.fileUri);
+    }
+    if (!_hasLibraryAccess(imported: uri, importer: firstLibrary?.importUri)) {
+      if (firstLibrary != null) {
+        firstLibrary.addProblem(
+            messagePlatformPrivateLibraryAccess, -1, noLength, firstUri);
+      } else {
+        addProblem(messagePlatformPrivateLibraryAccess, -1, noLength, null);
+      }
+    }
+    return libraryBuilder;
+  }
+
+  bool _hasLibraryAccess({required Uri imported, required Uri? importer}) {
+    if (imported.scheme == "dart" && imported.path.startsWith("_")) {
+      if (importer == null) {
+        return false;
+      } else {
+        return target.backendTarget
+            .allowPlatformPrivateLibraryAccess(importer, imported);
+      }
+    }
+    return true;
+  }
+
+  LibraryBuilder _read(Uri uri,
+      {Uri? fileUri,
       LibraryBuilder? origin,
       Library? referencesFrom,
       bool? referenceIsPartOwner}) {
@@ -483,44 +581,27 @@
             referencesFrom,
             referenceIsPartOwner);
       }
-
       _builders[uri] = libraryBuilder;
     }
-    if (accessor == null) {
-      if (libraryBuilder.loader == this && first != libraryBuilder) {
-        unhandled("null", "accessor", charOffset, uri);
-      }
-    } else {
-      libraryBuilder.recordAccess(charOffset, noLength, accessor.fileUri);
-      if (!accessor.isPatch &&
-          !accessor.isPart &&
-          !target.backendTarget
-              .allowPlatformPrivateLibraryAccess(accessor.importUri, uri)) {
-        accessor.addProblem(messagePlatformPrivateLibraryAccess, charOffset,
-            noLength, accessor.fileUri);
-      }
-    }
     return libraryBuilder;
   }
 
   void _ensureCoreLibrary() {
     if (_coreLibrary == null) {
-      read(Uri.parse("dart:core"), 0, accessor: first);
+      readAsEntryPoint(Uri.parse("dart:core"));
       // TODO(askesc): When all backends support set literals, we no longer
       // need to index dart:collection, as it is only needed for desugaring of
       // const sets. We can remove it from this list at that time.
-      read(Uri.parse("dart:collection"), 0, accessor: first);
+      readAsEntryPoint(Uri.parse("dart:collection"));
       assert(_coreLibrary != null);
     }
   }
 
   Future<Null> buildBodies() async {
     assert(_coreLibrary != null);
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        currentUriForCrashReporting = library.importUri;
-        await buildBody(library);
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      currentUriForCrashReporting = library.importUri;
+      await buildBody(library);
     }
     currentUriForCrashReporting = null;
     logSummary(templateSourceBodySummary);
@@ -530,7 +611,12 @@
     ticker.log((Duration elapsed, Duration sinceStart) {
       int libraryCount = 0;
       for (LibraryBuilder library in libraryBuilders) {
-        if (library.loader == this) libraryCount++;
+        if (library.loader == this) {
+          libraryCount++;
+          if (library is SourceLibraryBuilder) {
+            libraryCount += library.patchLibraries?.length ?? 0;
+          }
+        }
       }
       double ms = elapsed.inMicroseconds / Duration.microsecondsPerMillisecond;
       Message message = template.withArguments(
@@ -660,7 +746,9 @@
 
   TypeInferenceEngineImpl get typeInferenceEngine => _typeInferenceEngine!;
 
-  ClassHierarchyBuilder get builderHierarchy => _builderHierarchy!;
+  ClassHierarchyBuilder get hierarchyBuilder => _hierarchyBuilder!;
+
+  ClassMembersBuilder get membersBuilder => _membersBuilder!;
 
   Template<SummaryTemplate> get outlineSummaryTemplate =>
       templateSourceOutlineSummary;
@@ -828,7 +916,7 @@
     _typeInferenceEngine!.typeDependencies[member] = typeDependency;
   }
 
-  Future<Null> buildOutlines() async {
+  Future<void> buildOutlines() async {
     _ensureCoreLibrary();
     while (_unparsedLibraries.isNotEmpty) {
       LibraryBuilder library = _unparsedLibraries.removeFirst();
@@ -947,29 +1035,34 @@
   }
 
   /// Builds all the method bodies found in the given [library].
-  Future<Null> buildBody(LibraryBuilder library) async {
-    if (library is SourceLibraryBuilder) {
-      // We tokenize source files twice to keep memory usage low. This is the
-      // second time, and the first time was in [buildOutline] above. So this
-      // time we suppress lexical errors.
-      Token tokens = await tokenize(library, suppressLexicalErrors: true);
+  Future<Null> buildBody(SourceLibraryBuilder library) async {
+    Iterable<SourceLibraryBuilder>? patches = library.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        await buildBody(patchLibrary);
+      }
+    }
+
+    // We tokenize source files twice to keep memory usage low. This is the
+    // second time, and the first time was in [buildOutline] above. So this
+    // time we suppress lexical errors.
+    Token tokens = await tokenize(library, suppressLexicalErrors: true);
+    // ignore: unnecessary_null_comparison
+    if (tokens == null) return;
+    DietListener listener = createDietListener(library);
+    DietParser parser = new DietParser(listener);
+    parser.parseUnit(tokens);
+    for (LibraryBuilder part in library.parts) {
+      if (part.partOfLibrary != library) {
+        // Part was included in multiple libraries. Skip it here.
+        continue;
+      }
+      Token tokens = await tokenize(part as SourceLibraryBuilder,
+          suppressLexicalErrors: true);
       // ignore: unnecessary_null_comparison
-      if (tokens == null) return;
-      DietListener listener = createDietListener(library);
-      DietParser parser = new DietParser(listener);
-      parser.parseUnit(tokens);
-      for (LibraryBuilder part in library.parts) {
-        if (part.partOfLibrary != library) {
-          // Part was included in multiple libraries. Skip it here.
-          continue;
-        }
-        Token tokens = await tokenize(part as SourceLibraryBuilder,
-            suppressLexicalErrors: true);
-        // ignore: unnecessary_null_comparison
-        if (tokens != null) {
-          listener.uri = part.fileUri;
-          parser.parseUnit(tokens);
-        }
+      if (tokens != null) {
+        listener.uri = part.fileUri;
+        parser.parseUnit(tokens);
       }
     }
   }
@@ -1045,13 +1138,20 @@
 
   void resolveParts() {
     List<Uri> parts = <Uri>[];
-    List<SourceLibraryBuilder> libraries = <SourceLibraryBuilder>[];
+    List<SourceLibraryBuilder> libraries = [];
+    List<SourceLibraryBuilder> sourceLibraries = [];
+    List<SourceLibraryBuilder> patchLibraries = [];
     _builders.forEach((Uri uri, LibraryBuilder library) {
-      if (library.loader == this) {
+      if (library.loader == this && library is SourceLibraryBuilder) {
         if (library.isPart) {
           parts.add(uri);
         } else {
-          libraries.add(library as SourceLibraryBuilder);
+          if (library.isPatch) {
+            patchLibraries.add(library);
+          } else {
+            sourceLibraries.add(library);
+          }
+          libraries.add(library);
         }
       }
     });
@@ -1061,12 +1161,16 @@
     }
     for (Uri uri in parts) {
       if (usedParts.contains(uri)) {
-        _builders.remove(uri);
+        LibraryBuilder? part = _builders.remove(uri);
+        if (_firstUri == uri) {
+          firstUri = part!.partOfLibrary!.importUri;
+        }
       } else {
         SourceLibraryBuilder part =
             lookupLibraryBuilder(uri) as SourceLibraryBuilder;
         part.addProblem(messagePartOrphan, 0, 1, part.fileUri);
         part.validatePart(null, null);
+        sourceLibraries.add(part);
       }
     }
     ticker.logMs("Resolved parts");
@@ -1076,6 +1180,25 @@
         library.applyPatches();
       }
     }
+    for (SourceLibraryBuilder patchLibrary in patchLibraries) {
+      _builders.remove(patchLibrary.fileUri);
+      patchLibrary.origin.addPatchLibrary(patchLibrary);
+    }
+    _sourceLibraryBuilders = sourceLibraries;
+    assert(
+        libraryBuilders.every((library) => !library.isPatch),
+        "Patch library found in libraryBuilders: "
+        "${libraryBuilders.where((library) => library.isPatch)}.");
+    assert(
+        sourceLibraries.every((library) => !library.isPatch),
+        "Patch library found in sourceLibraryBuilders: "
+        "${sourceLibraries.where((library) => library.isPatch)}.");
+    assert(
+        libraryBuilders.every((library) =>
+            library.loader != this || sourceLibraries.contains(library)),
+        "Source library not found in sourceLibraryBuilders:"
+        "${libraryBuilders.where((library) => // force line break
+            library.loader == this && !sourceLibraries.contains(library))}");
     ticker.logMs("Applied patches");
   }
 
@@ -1093,6 +1216,19 @@
           exporters.add(exporter.exporter);
         }
       }
+
+      Iterable<SourceLibraryBuilder>? patches =
+          library is SourceLibraryBuilder ? library.patchLibraries : null;
+      if (patches != null) {
+        for (SourceLibraryBuilder patchLibrary in patches) {
+          if (patchLibrary.exporters.isNotEmpty) {
+            exportees.add(patchLibrary);
+            for (Export exporter in patchLibrary.exporters) {
+              exporters.add(exporter.exporter);
+            }
+          }
+        }
+      }
     }
     Set<SourceLibraryBuilder> both = new Set<SourceLibraryBuilder>();
     for (LibraryBuilder exported in exportees) {
@@ -1159,71 +1295,213 @@
 
   void resolveTypes() {
     int typeCount = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        SourceLibraryBuilder sourceLibrary = library as SourceLibraryBuilder;
-        typeCount += sourceLibrary.resolveTypes();
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      typeCount += library.resolveTypes();
     }
     ticker.logMs("Resolved $typeCount types");
   }
 
+  void computeMacroDeclarations(List<SourceClassBuilder> sourceClassBuilders) {
+    if (!enableMacros) return;
+
+    LibraryBuilder? macroLibraryBuilder = lookupLibraryBuilder(macroLibraryUri);
+    if (macroLibraryBuilder == null) return;
+
+    Builder? macroClassBuilder =
+        macroLibraryBuilder.lookupLocalMember(macroClassName);
+    if (macroClassBuilder is! ClassBuilder) {
+      // TODO(johnniwinther): Report this when the actual macro builder package
+      // exists. It should at least be a warning.
+      return;
+    }
+
+    _macroClassBuilder = macroClassBuilder;
+    if (retainDataForTesting) {
+      dataForTesting!.macroDeclarationData.macrosAreAvailable = true;
+    }
+
+    Set<ClassBuilder> macroClasses = {macroClassBuilder};
+    Set<Uri> macroLibraries = {macroLibraryBuilder.importUri};
+
+    for (SourceClassBuilder sourceClassBuilder in sourceClassBuilders) {
+      if (sourceClassBuilder.isMacro) {
+        macroClasses.add(sourceClassBuilder);
+        macroLibraries.add(sourceClassBuilder.library.importUri);
+        if (retainDataForTesting) {
+          (dataForTesting!.macroDeclarationData.macroDeclarations[
+                  sourceClassBuilder.library.importUri] ??= [])
+              .add(sourceClassBuilder.name);
+        }
+      }
+    }
+
+    bool isDillLibrary(Uri uri) => _builders[uri]?.loader != this;
+
+    List<List<Uri>> computeCompilationSequence(Graph<Uri> libraryGraph,
+        {required bool Function(Uri) filter}) {
+      List<List<Uri>> stronglyConnectedComponents =
+          computeStrongComponents(libraryGraph);
+
+      Graph<List<Uri>> strongGraph =
+          new StrongComponentGraph(libraryGraph, stronglyConnectedComponents);
+      List<List<List<Uri>>> componentLayers =
+          topologicalSort(strongGraph).layers;
+      List<List<Uri>> layeredComponents = [];
+      List<Uri> currentLayer = [];
+      for (List<List<Uri>> layer in componentLayers) {
+        bool declaresMacro = false;
+        for (List<Uri> component in layer) {
+          for (Uri uri in component) {
+            if (filter(uri)) continue;
+            if (macroLibraries.contains(uri)) {
+              declaresMacro = true;
+            }
+            currentLayer.add(uri);
+          }
+        }
+        if (declaresMacro) {
+          layeredComponents.add(currentLayer);
+          currentLayer = [];
+        }
+      }
+      if (currentLayer.isNotEmpty) {
+        layeredComponents.add(currentLayer);
+      }
+      return layeredComponents;
+    }
+
+    List<List<Uri>> compilationSteps = computeCompilationSequence(
+        new BuilderGraph(_builders),
+        filter: isDillLibrary);
+    if (retainDataForTesting) {
+      dataForTesting!.macroDeclarationData.compilationSequence =
+          compilationSteps;
+    }
+  }
+
+  void computeMacroApplications() {
+    if (!enableMacros || _macroClassBuilder == null) return;
+    Class macroClass = _macroClassBuilder!.cls;
+
+    Class? computeApplication(Expression expression) {
+      if (expression is ConstructorInvocation) {
+        Class cls = expression.target.enclosingClass;
+        if (hierarchy.isSubtypeOf(cls, macroClass)) {
+          return cls;
+        }
+      }
+      return null;
+    }
+
+    MacroApplications? computeApplications(List<Expression> annotations) {
+      List<Class> macros = [];
+      for (Expression annotation in annotations) {
+        Class? cls = computeApplication(annotation);
+        if (cls != null) {
+          macros.add(cls);
+        }
+      }
+      return macros.isNotEmpty ? new MacroApplications(macros) : null;
+    }
+
+    for (SourceLibraryBuilder libraryBuilder in sourceLibraryBuilders) {
+      // TODO(johnniwinther): Handle patch libraries.
+      LibraryMacroApplicationData libraryMacroApplicationData =
+          new LibraryMacroApplicationData();
+      Library library = libraryBuilder.library;
+      libraryMacroApplicationData.libraryApplications =
+          computeApplications(library.annotations);
+      for (Class cls in library.classes) {
+        ClassMacroApplicationData classMacroApplicationData =
+            new ClassMacroApplicationData();
+        classMacroApplicationData.classApplications =
+            computeApplications(cls.annotations);
+        for (Member member in cls.members) {
+          MacroApplications? macroApplications =
+              computeApplications(member.annotations);
+          if (macroApplications != null) {
+            classMacroApplicationData.memberApplications[member] =
+                macroApplications;
+          }
+        }
+        if (classMacroApplicationData.classApplications != null ||
+            classMacroApplicationData.memberApplications.isNotEmpty) {
+          libraryMacroApplicationData.classData[cls] =
+              classMacroApplicationData;
+        }
+      }
+      for (Member member in library.members) {
+        MacroApplications? macroApplications =
+            computeApplications(member.annotations);
+        if (macroApplications != null) {
+          libraryMacroApplicationData.memberApplications[member] =
+              macroApplications;
+        }
+      }
+      for (Typedef typedef in library.typedefs) {
+        MacroApplications? macroApplications =
+            computeApplications(typedef.annotations);
+        if (macroApplications != null) {
+          libraryMacroApplicationData.typedefApplications[typedef] =
+              macroApplications;
+        }
+      }
+      if (libraryMacroApplicationData.libraryApplications != null ||
+          libraryMacroApplicationData.classData.isNotEmpty ||
+          libraryMacroApplicationData.typedefApplications.isNotEmpty ||
+          libraryMacroApplicationData.memberApplications.isNotEmpty) {
+        if (retainDataForTesting) {
+          dataForTesting!.macroApplicationData.libraryData[library] =
+              libraryMacroApplicationData;
+        }
+      }
+    }
+  }
+
   void finishDeferredLoadTearoffs() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        count += library.finishDeferredLoadTearoffs();
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      count += library.finishDeferredLoadTearoffs();
     }
     ticker.logMs("Finished deferred load tearoffs $count");
   }
 
   void finishNoSuchMethodForwarders() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        count += library.finishForwarders();
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      count += library.finishForwarders();
     }
     ticker.logMs("Finished forwarders for $count procedures");
   }
 
   void resolveConstructors() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        count += library.resolveConstructors(null);
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      count += library.resolveConstructors();
     }
     ticker.logMs("Resolved $count constructors");
   }
 
   void installTypedefTearOffs() {
     if (target.backendTarget.isTypedefTearOffLoweringEnabled) {
-      for (LibraryBuilder library in libraryBuilders) {
-        if (library.loader == this && library is SourceLibraryBuilder) {
-          library.installTypedefTearOffs();
-        }
+      for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+        library.installTypedefTearOffs();
       }
     }
   }
 
   void finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        count += library.finishTypeVariables(object, dynamicType);
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      count += library.finishTypeVariables(object, dynamicType);
     }
     ticker.logMs("Resolved $count type-variable bounds");
   }
 
   void computeVariances() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        count += library.computeVariances();
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      count += library.computeVariances();
     }
     ticker.logMs("Computed variances of $count type variables");
   }
@@ -1231,31 +1509,25 @@
   void computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
       TypeBuilder bottomType, ClassBuilder objectClass) {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        count += library.computeDefaultTypes(
-            dynamicType, nullType, bottomType, objectClass);
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      count += library.computeDefaultTypes(
+          dynamicType, nullType, bottomType, objectClass);
     }
     ticker.logMs("Computed default types for $count type variables");
   }
 
   void finishNativeMethods() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        count += library.finishNativeMethods();
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      count += library.finishNativeMethods();
     }
     ticker.logMs("Finished $count native methods");
   }
 
   void finishPatchMethods() {
     int count = 0;
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        count += library.finishPatchMethods();
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      count += library.finishPatchMethods();
     }
     ticker.logMs("Finished $count patch methods");
   }
@@ -1283,26 +1555,21 @@
     }
   }
 
+  /// Returns classes defined in libraries in this [SourceLoader].
+  List<SourceClassBuilder> collectSourceClasses() {
+    List<SourceClassBuilder> sourceClasses = <SourceClassBuilder>[];
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      library.collectSourceClasses(sourceClasses);
+    }
+    return sourceClasses;
+  }
+
   /// Returns a list of all class builders declared in this loader.  As the
   /// classes are sorted, any cycles in the hierarchy are reported as
   /// errors. Recover by breaking the cycles. This means that the rest of the
   /// pipeline (including backends) can assume that there are no hierarchy
   /// cycles.
   List<SourceClassBuilder> handleHierarchyCycles(ClassBuilder objectClass) {
-    // Compute the initial work list of all classes declared in this loader.
-    List<SourceClassBuilder> workList = <SourceClassBuilder>[];
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        Iterator<Builder> members = library.iterator;
-        while (members.moveNext()) {
-          Builder member = members.current;
-          if (member is SourceClassBuilder) {
-            workList.add(member);
-          }
-        }
-      }
-    }
-
     Set<ClassBuilder> denyListedClasses = new Set<ClassBuilder>();
     for (int i = 0; i < denylistedCoreClasses.length; i++) {
       denyListedClasses.add(coreLibrary.lookupLocalMember(
@@ -1319,42 +1586,17 @@
     }
 
     // Sort the classes topologically.
-    Set<SourceClassBuilder> topologicallySortedClasses =
-        new Set<SourceClassBuilder>();
-    List<SourceClassBuilder> previousWorkList;
-    do {
-      previousWorkList = workList;
-      workList = <SourceClassBuilder>[];
-      for (int i = 0; i < previousWorkList.length; i++) {
-        SourceClassBuilder cls = previousWorkList[i];
-        Map<TypeDeclarationBuilder?, TypeAliasBuilder?> directSupertypeMap =
-            cls.computeDirectSupertypes(objectClass);
-        List<TypeDeclarationBuilder?> directSupertypes =
-            directSupertypeMap.keys.toList();
-        bool allSupertypesProcessed = true;
-        for (int i = 0; i < directSupertypes.length; i++) {
-          Builder? supertype = directSupertypes[i];
-          if (supertype is SourceClassBuilder &&
-              supertype.library.loader == this &&
-              !topologicallySortedClasses.contains(supertype)) {
-            allSupertypesProcessed = false;
-            break;
-          }
-        }
-        if (allSupertypesProcessed && cls.isPatch) {
-          allSupertypesProcessed =
-              topologicallySortedClasses.contains(cls.origin);
-        }
-        if (allSupertypesProcessed) {
-          topologicallySortedClasses.add(cls);
-          checkClassSupertypes(cls, directSupertypeMap, denyListedClasses);
-        } else {
-          workList.add(cls);
-        }
-      }
-    } while (previousWorkList.length != workList.length);
-    List<SourceClassBuilder> classes = topologicallySortedClasses.toList();
-    List<SourceClassBuilder> classesWithCycles = previousWorkList;
+    _SourceClassGraph classGraph =
+        new _SourceClassGraph(collectSourceClasses(), objectClass);
+    TopologicalSortResult<SourceClassBuilder> result =
+        topologicalSort(classGraph);
+    List<SourceClassBuilder> classes = result.sortedVertices;
+    for (SourceClassBuilder cls in classes) {
+      checkClassSupertypes(
+          cls, classGraph.directSupertypeMap[cls]!, denyListedClasses);
+    }
+
+    List<SourceClassBuilder> classesWithCycles = result.cyclicVertices;
 
     // Once the work list doesn't change in size, it's either empty, or
     // contains all classes with cycles.
@@ -1490,19 +1732,14 @@
 
   /// Builds the core AST structure needed for the outline of the component.
   void buildComponent() {
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        SourceLibraryBuilder sourceLibrary = library as SourceLibraryBuilder;
-        Library target = sourceLibrary.build(coreLibrary);
-        if (!library.isPatch) {
-          if (sourceLibrary.referencesFrom != null) {
-            referenceFromIndex ??= new ReferenceFromIndex();
-            referenceFromIndex!.addIndexedLibrary(
-                target, sourceLibrary.referencesFromIndexed!);
-          }
-          libraries.add(target);
-        }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      Library target = library.build(coreLibrary);
+      if (library.referencesFrom != null) {
+        referenceFromIndex ??= new ReferenceFromIndex();
+        referenceFromIndex!
+            .addIndexedLibrary(target, library.referencesFromIndexed!);
       }
+      libraries.add(target);
     }
     ticker.logMs("Built component");
   }
@@ -1557,11 +1794,8 @@
   }
 
   void computeShowHideElements() {
-    for (LibraryBuilder libraryBuilder in libraryBuilders) {
-      if (libraryBuilder.loader == this &&
-          libraryBuilder is SourceLibraryBuilder) {
-        libraryBuilder.computeShowHideElements(_builderHierarchy!);
-      }
+    for (SourceLibraryBuilder libraryBuilder in sourceLibraryBuilders) {
+      libraryBuilder.computeShowHideElements(membersBuilder);
     }
     ticker.logMs("Computed show and hide elements");
   }
@@ -1605,21 +1839,16 @@
   }
 
   void checkTypes() {
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library is SourceLibraryBuilder) {
-        if (library.loader == this) {
-          library
-              .checkTypesInOutline(typeInferenceEngine.typeSchemaEnvironment);
-        }
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      library.checkTypesInOutline(typeInferenceEngine.typeSchemaEnvironment);
     }
     ticker.logMs("Checked type arguments of supers against the bounds");
   }
 
   void checkOverrides(List<SourceClassBuilder> sourceClasses) {
-    List<DelayedCheck> overrideChecks = builderHierarchy.takeDelayedChecks();
+    List<DelayedCheck> overrideChecks = membersBuilder.takeDelayedChecks();
     for (int i = 0; i < overrideChecks.length; i++) {
-      overrideChecks[i].check(builderHierarchy);
+      overrideChecks[i].check(membersBuilder);
     }
     ticker.logMs("Checked ${overrideChecks.length} overrides");
 
@@ -1629,10 +1858,10 @@
 
   void checkAbstractMembers(List<SourceClassBuilder> sourceClasses) {
     List<ClassMember> delayedMemberChecks =
-        builderHierarchy.takeDelayedMemberComputations();
+        membersBuilder.takeDelayedMemberComputations();
     Set<Class> changedClasses = new Set<Class>();
     for (int i = 0; i < delayedMemberChecks.length; i++) {
-      delayedMemberChecks[i].getMember(builderHierarchy);
+      delayedMemberChecks[i].getMember(membersBuilder);
       changedClasses.add(delayedMemberChecks[i].classBuilder.cls);
     }
     ticker.logMs(
@@ -1686,34 +1915,9 @@
       List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
     List<DelayedActionPerformer> delayedActionPerformers =
         <DelayedActionPerformer>[];
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        (library as SourceLibraryBuilder).buildOutlineExpressions();
-        Iterator<Builder> iterator = library.iterator;
-        while (iterator.moveNext()) {
-          Builder declaration = iterator.current;
-          if (declaration is ClassBuilder) {
-            declaration.buildOutlineExpressions(library, coreTypes,
-                delayedActionPerformers, synthesizedFunctionNodes);
-          } else if (declaration is ExtensionBuilder) {
-            declaration.buildOutlineExpressions(library, coreTypes,
-                delayedActionPerformers, synthesizedFunctionNodes);
-          } else if (declaration is MemberBuilder) {
-            declaration.buildOutlineExpressions(library, coreTypes,
-                delayedActionPerformers, synthesizedFunctionNodes);
-          } else if (declaration is SourceTypeAliasBuilder) {
-            declaration.buildOutlineExpressions(library, coreTypes,
-                delayedActionPerformers, synthesizedFunctionNodes);
-          } else {
-            assert(
-                declaration is PrefixBuilder ||
-                    declaration is DynamicTypeDeclarationBuilder ||
-                    declaration is NeverTypeDeclarationBuilder,
-                "Unexpected builder in library: ${declaration} "
-                "(${declaration.runtimeType}");
-          }
-        }
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      library.buildOutlineExpressions(
+          coreTypes, synthesizedFunctionNodes, delayedActionPerformers);
     }
     for (DelayedActionPerformer delayedActionPerformer
         in delayedActionPerformers) {
@@ -1724,9 +1928,13 @@
 
   void buildClassHierarchy(
       List<SourceClassBuilder> sourceClasses, ClassBuilder objectClass) {
-    _builderHierarchy = ClassHierarchyBuilder.build(
-        objectClass, sourceClasses, this, coreTypes);
-    typeInferenceEngine.hierarchyBuilder = builderHierarchy;
+    ClassHierarchyBuilder hierarchyBuilder = _hierarchyBuilder =
+        ClassHierarchyBuilder.build(
+            objectClass, sourceClasses, this, coreTypes);
+    ClassMembersBuilder membersBuilder = _membersBuilder =
+        ClassMembersBuilder.build(hierarchyBuilder, sourceClasses);
+    typeInferenceEngine.hierarchyBuilder = hierarchyBuilder;
+    typeInferenceEngine.membersBuilder = membersBuilder;
     ticker.logMs("Built class hierarchy");
   }
 
@@ -1740,17 +1948,11 @@
     /// might be subject to type inference, and records dependencies between
     /// them.
     typeInferenceEngine.prepareTopLevel(coreTypes, hierarchy);
-    builderHierarchy.computeTypes();
+    membersBuilder.computeTypes();
 
     List<FieldBuilder> allImplicitlyTypedFields = <FieldBuilder>[];
-    for (LibraryBuilder library in libraryBuilders) {
-      if (library.loader == this) {
-        List<FieldBuilder>? implicitlyTypedFields =
-            library.takeImplicitlyTypedFields();
-        if (implicitlyTypedFields != null) {
-          allImplicitlyTypedFields.addAll(implicitlyTypedFields);
-        }
-      }
+    for (SourceLibraryBuilder library in sourceLibraryBuilders) {
+      library.collectImplicitlyTypedFields(allImplicitlyTypedFields);
     }
 
     for (int i = 0; i < allImplicitlyTypedFields.length; i++) {
@@ -1836,27 +2038,48 @@
         isTopLevel: isTopLevel);
   }
 
-  void checkMainMethods() {
-    DartType? listOfString;
+  void _checkMainMethods(
+      SourceLibraryBuilder libraryBuilder, DartType listOfString) {
+    Iterable<SourceLibraryBuilder>? patches = libraryBuilder.patchLibraries;
+    if (patches != null) {
+      for (SourceLibraryBuilder patchLibrary in patches) {
+        _checkMainMethods(patchLibrary, listOfString);
+      }
+    }
 
-    for (LibraryBuilder libraryBuilder in libraryBuilders) {
-      if (libraryBuilder.loader == this &&
-          libraryBuilder.isNonNullableByDefault) {
-        Builder? mainBuilder =
-            libraryBuilder.exportScope.lookupLocalMember('main', setter: false);
-        mainBuilder ??=
-            libraryBuilder.exportScope.lookupLocalMember('main', setter: true);
-        if (mainBuilder is MemberBuilder) {
-          if (mainBuilder is InvalidTypeDeclarationBuilder) {
-            // This is an ambiguous export, skip the check.
-            return;
+    if (libraryBuilder.isNonNullableByDefault) {
+      Builder? mainBuilder =
+          libraryBuilder.exportScope.lookupLocalMember('main', setter: false);
+      mainBuilder ??=
+          libraryBuilder.exportScope.lookupLocalMember('main', setter: true);
+      if (mainBuilder is MemberBuilder) {
+        if (mainBuilder is InvalidTypeDeclarationBuilder) {
+          // This is an ambiguous export, skip the check.
+          return;
+        }
+        if (mainBuilder.isField ||
+            mainBuilder.isGetter ||
+            mainBuilder.isSetter) {
+          if (mainBuilder.parent != libraryBuilder) {
+            libraryBuilder.addProblem(messageMainNotFunctionDeclarationExported,
+                libraryBuilder.charOffset, noLength, libraryBuilder.fileUri,
+                context: [
+                  messageExportedMain.withLocation(mainBuilder.fileUri!,
+                      mainBuilder.charOffset, mainBuilder.name.length)
+                ]);
+          } else {
+            libraryBuilder.addProblem(
+                messageMainNotFunctionDeclaration,
+                mainBuilder.charOffset,
+                mainBuilder.name.length,
+                mainBuilder.fileUri);
           }
-          if (mainBuilder.isField ||
-              mainBuilder.isGetter ||
-              mainBuilder.isSetter) {
+        } else {
+          Procedure procedure = mainBuilder.member as Procedure;
+          if (procedure.function.requiredParameterCount > 2) {
             if (mainBuilder.parent != libraryBuilder) {
               libraryBuilder.addProblem(
-                  messageMainNotFunctionDeclarationExported,
+                  messageMainTooManyRequiredParametersExported,
                   libraryBuilder.charOffset,
                   noLength,
                   libraryBuilder.fileUri,
@@ -1866,17 +2089,42 @@
                   ]);
             } else {
               libraryBuilder.addProblem(
-                  messageMainNotFunctionDeclaration,
+                  messageMainTooManyRequiredParameters,
                   mainBuilder.charOffset,
                   mainBuilder.name.length,
                   mainBuilder.fileUri);
             }
-          } else {
-            Procedure procedure = mainBuilder.member as Procedure;
-            if (procedure.function.requiredParameterCount > 2) {
+          } else if (procedure.function.namedParameters
+              .any((parameter) => parameter.isRequired)) {
+            if (mainBuilder.parent != libraryBuilder) {
+              libraryBuilder.addProblem(
+                  messageMainRequiredNamedParametersExported,
+                  libraryBuilder.charOffset,
+                  noLength,
+                  libraryBuilder.fileUri,
+                  context: [
+                    messageExportedMain.withLocation(mainBuilder.fileUri!,
+                        mainBuilder.charOffset, mainBuilder.name.length)
+                  ]);
+            } else {
+              libraryBuilder.addProblem(
+                  messageMainRequiredNamedParameters,
+                  mainBuilder.charOffset,
+                  mainBuilder.name.length,
+                  mainBuilder.fileUri);
+            }
+          } else if (procedure.function.positionalParameters.length > 0) {
+            DartType parameterType =
+                procedure.function.positionalParameters.first.type;
+
+            if (!typeEnvironment.isSubtypeOf(listOfString, parameterType,
+                SubtypeCheckMode.withNullabilities)) {
               if (mainBuilder.parent != libraryBuilder) {
                 libraryBuilder.addProblem(
-                    messageMainTooManyRequiredParametersExported,
+                    templateMainWrongParameterTypeExported.withArguments(
+                        parameterType,
+                        listOfString,
+                        libraryBuilder.isNonNullableByDefault),
                     libraryBuilder.charOffset,
                     noLength,
                     libraryBuilder.fileUri,
@@ -1886,91 +2134,48 @@
                     ]);
               } else {
                 libraryBuilder.addProblem(
-                    messageMainTooManyRequiredParameters,
+                    templateMainWrongParameterType.withArguments(parameterType,
+                        listOfString, libraryBuilder.isNonNullableByDefault),
                     mainBuilder.charOffset,
                     mainBuilder.name.length,
                     mainBuilder.fileUri);
               }
-            } else if (procedure.function.namedParameters
-                .any((parameter) => parameter.isRequired)) {
-              if (mainBuilder.parent != libraryBuilder) {
-                libraryBuilder.addProblem(
-                    messageMainRequiredNamedParametersExported,
-                    libraryBuilder.charOffset,
-                    noLength,
-                    libraryBuilder.fileUri,
-                    context: [
-                      messageExportedMain.withLocation(mainBuilder.fileUri!,
-                          mainBuilder.charOffset, mainBuilder.name.length)
-                    ]);
-              } else {
-                libraryBuilder.addProblem(
-                    messageMainRequiredNamedParameters,
-                    mainBuilder.charOffset,
-                    mainBuilder.name.length,
-                    mainBuilder.fileUri);
-              }
-            } else if (procedure.function.positionalParameters.length > 0) {
-              DartType parameterType =
-                  procedure.function.positionalParameters.first.type;
-
-              listOfString ??= new InterfaceType(
-                  coreTypes.listClass,
-                  Nullability.nonNullable,
-                  [coreTypes.stringNonNullableRawType]);
-
-              if (!typeEnvironment.isSubtypeOf(listOfString, parameterType,
-                  SubtypeCheckMode.withNullabilities)) {
-                if (mainBuilder.parent != libraryBuilder) {
-                  libraryBuilder.addProblem(
-                      templateMainWrongParameterTypeExported.withArguments(
-                          parameterType,
-                          listOfString,
-                          libraryBuilder.isNonNullableByDefault),
-                      libraryBuilder.charOffset,
-                      noLength,
-                      libraryBuilder.fileUri,
-                      context: [
-                        messageExportedMain.withLocation(mainBuilder.fileUri!,
-                            mainBuilder.charOffset, mainBuilder.name.length)
-                      ]);
-                } else {
-                  libraryBuilder.addProblem(
-                      templateMainWrongParameterType.withArguments(
-                          parameterType,
-                          listOfString,
-                          libraryBuilder.isNonNullableByDefault),
-                      mainBuilder.charOffset,
-                      mainBuilder.name.length,
-                      mainBuilder.fileUri);
-                }
-              }
             }
           }
-        } else if (mainBuilder != null) {
-          if (mainBuilder.parent != libraryBuilder) {
-            libraryBuilder.addProblem(messageMainNotFunctionDeclarationExported,
-                libraryBuilder.charOffset, noLength, libraryBuilder.fileUri,
-                context: [
-                  messageExportedMain.withLocation(
-                      mainBuilder.fileUri!, mainBuilder.charOffset, noLength)
-                ]);
-          } else {
-            libraryBuilder.addProblem(messageMainNotFunctionDeclaration,
-                mainBuilder.charOffset, noLength, mainBuilder.fileUri);
-          }
+        }
+      } else if (mainBuilder != null) {
+        if (mainBuilder.parent != libraryBuilder) {
+          libraryBuilder.addProblem(messageMainNotFunctionDeclarationExported,
+              libraryBuilder.charOffset, noLength, libraryBuilder.fileUri,
+              context: [
+                messageExportedMain.withLocation(
+                    mainBuilder.fileUri!, mainBuilder.charOffset, noLength)
+              ]);
+        } else {
+          libraryBuilder.addProblem(messageMainNotFunctionDeclaration,
+              mainBuilder.charOffset, noLength, mainBuilder.fileUri);
         }
       }
     }
   }
 
+  void checkMainMethods() {
+    DartType listOfString = new InterfaceType(coreTypes.listClass,
+        Nullability.nonNullable, [coreTypes.stringNonNullableRawType]);
+
+    for (SourceLibraryBuilder libraryBuilder in sourceLibraryBuilders) {
+      _checkMainMethods(libraryBuilder, listOfString);
+    }
+  }
+
   void releaseAncillaryResources() {
     hierarchy = null;
-    _builderHierarchy = null;
+    _hierarchyBuilder = null;
+    _membersBuilder = null;
     _typeInferenceEngine = null;
     _builders.clear();
     libraries.clear();
-    first = null;
+    firstUri = null;
     sourceBytes.clear();
     target.releaseAncillaryResources();
     _coreTypes = null;
@@ -2269,4 +2474,36 @@
   TreeNode toOriginal(TreeNode alias) {
     return _aliasMap[alias] ?? alias;
   }
+
+  final MacroDeclarationData macroDeclarationData = new MacroDeclarationData();
+
+  final MacroApplicationData macroApplicationData = new MacroApplicationData();
+}
+
+class _SourceClassGraph implements Graph<SourceClassBuilder> {
+  @override
+  final List<SourceClassBuilder> vertices;
+  final ClassBuilder _objectClass;
+  final Map<SourceClassBuilder, Map<TypeDeclarationBuilder?, TypeAliasBuilder?>>
+      directSupertypeMap = {};
+  final Map<SourceClassBuilder, List<SourceClassBuilder>> _supertypeMap = {};
+
+  _SourceClassGraph(this.vertices, this._objectClass);
+
+  List<SourceClassBuilder> computeSuperClasses(SourceClassBuilder cls) {
+    Map<TypeDeclarationBuilder?, TypeAliasBuilder?> directSupertypes =
+        directSupertypeMap[cls] = cls.computeDirectSupertypes(_objectClass);
+    List<SourceClassBuilder> superClasses = [];
+    for (TypeDeclarationBuilder? directSupertype in directSupertypes.keys) {
+      if (directSupertype is SourceClassBuilder) {
+        superClasses.add(directSupertype);
+      }
+    }
+    return superClasses;
+  }
+
+  @override
+  Iterable<SourceClassBuilder> neighborsOf(SourceClassBuilder vertex) {
+    return _supertypeMap[vertex] ??= computeSuperClasses(vertex);
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 2194bf5..b14927c 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -19,7 +19,8 @@
 import '../kernel/forest.dart';
 import '../kernel/implicit_field_type.dart';
 import '../kernel/internal_ast.dart';
-import '../kernel/class_hierarchy_builder.dart' show ClassHierarchyBuilder;
+import '../kernel/hierarchy/hierarchy_builder.dart' show ClassHierarchyBuilder;
+import '../kernel/hierarchy/members_builder.dart' show ClassMembersBuilder;
 import '../kernel/kernel_helper.dart';
 
 import '../source/source_library_builder.dart' show SourceLibraryBuilder;
@@ -103,6 +104,8 @@
 
   late ClassHierarchyBuilder hierarchyBuilder;
 
+  late ClassMembersBuilder membersBuilder;
+
   late CoreTypes coreTypes;
 
   // TODO(johnniwinther): Shared this with the BodyBuilder.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 93e1544..5dc515a 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -35,7 +35,7 @@
 
 import '../fasta_codes.dart';
 
-import '../kernel/class_hierarchy_builder.dart' show ClassMember;
+import '../kernel/hierarchy/class_member.dart' show ClassMember;
 import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/kernel_helper.dart';
 import '../kernel/inference_visitor.dart';
@@ -4250,7 +4250,7 @@
 
   Member? _getInterfaceMember(
       Class class_, Name name, bool setter, int charOffset) {
-    ClassMember? classMember = engine.hierarchyBuilder
+    ClassMember? classMember = engine.membersBuilder
         .getInterfaceClassMember(class_, name, setter: setter);
     if (classMember != null) {
       if (classMember.isStatic) {
@@ -4266,7 +4266,7 @@
         classMember = null;
       }
     }
-    Member? member = classMember?.getMember(engine.hierarchyBuilder);
+    Member? member = classMember?.getMember(engine.membersBuilder);
     if (member == null && library.isPatch) {
       // TODO(johnniwinther): Injected members are currently not included
       // in the class hierarchy builder.
diff --git a/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart b/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart
new file mode 100644
index 0000000..e731acd
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart
@@ -0,0 +1,864 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
+
+enum Coloring { Untouched, Marked }
+
+abstract class AstNode {
+  Map<String, List<AstNode>> scope = {};
+  Container? parent;
+  ParserAstNode get node;
+  Token get startInclusive;
+  Token get endInclusive;
+
+  Coloring marked = Coloring.Untouched;
+
+  StringBuffer toStringInternal(StringBuffer sb, int indent);
+
+  void buildScope();
+  Map<String, AstNode> selfScope();
+
+  List<AstNode>? findInScope(String name) {
+    return scope[name] ?? parent?.findInScope(name);
+  }
+}
+
+abstract class Container extends AstNode {
+  List<AstNode> _children = [];
+  Iterable<AstNode> get children => _children;
+
+  void addChild(AstNode child, Map<ParserAstNode, AstNode> map) {
+    child.parent = this;
+    _children.add(child);
+    map[child.node] = child;
+  }
+}
+
+class TopLevel extends Container {
+  final String sourceText;
+  final Uri uri;
+
+  @override
+  final ParserAstNode node;
+
+  final Map<ParserAstNode, AstNode> map;
+
+  TopLevel(this.sourceText, this.uri, this.node, this.map);
+
+  @override
+  String toString() => toStringInternal(new StringBuffer(), 0).toString();
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    if (_children.isEmpty) {
+      String stringIndent = " " * ((indent + 1) * 2);
+      sb.write(stringIndent);
+      sb.writeln("(empty)");
+    } else {
+      for (AstNode node in _children) {
+        sb.write(stringIndent);
+        node.toStringInternal(sb, indent + 1);
+      }
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (AstNode child in _children) {
+      child.buildScope();
+      for (MapEntry<String, AstNode> entry in child.selfScope().entries) {
+        (scope[entry.key] ??= []).add(entry.value);
+      }
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+
+  @override
+  Token get endInclusive => throw new UnimplementedError();
+
+  @override
+  Token get startInclusive => throw new UnimplementedError();
+}
+
+class Class extends Container {
+  @override
+  final TopLevelDeclarationEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Class(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class $name");
+    if (_children.isEmpty) {
+      String stringIndent = " " * ((indent + 1) * 2);
+      sb.write(stringIndent);
+      sb.writeln("(empty)");
+    } else {
+      for (AstNode node in _children) {
+        node.toStringInternal(sb, indent + 1);
+      }
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (AstNode child in _children) {
+      child.buildScope();
+      for (MapEntry<String, AstNode> entry in child.selfScope().entries) {
+        (scope[entry.key] ??= []).add(entry.value);
+      }
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Mixin extends Container {
+  @override
+  final TopLevelDeclarationEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Mixin(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Mixin $name");
+    if (_children.isEmpty) {
+      String stringIndent = " " * ((indent + 1) * 2);
+      sb.write(stringIndent);
+      sb.writeln("(empty)");
+    } else {
+      for (AstNode node in _children) {
+        node.toStringInternal(sb, indent + 1);
+      }
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (AstNode child in _children) {
+      child.buildScope();
+      for (MapEntry<String, AstNode> entry in child.selfScope().entries) {
+        (scope[entry.key] ??= []).add(entry.value);
+      }
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Extension extends Container {
+  @override
+  final TopLevelDeclarationEnd node;
+  final String? name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Extension(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Extension $name");
+    if (_children.isEmpty) {
+      String stringIndent = " " * ((indent + 1) * 2);
+      sb.write(stringIndent);
+      sb.writeln("(empty)");
+    } else {
+      for (AstNode node in _children) {
+        node.toStringInternal(sb, indent + 1);
+      }
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (AstNode child in _children) {
+      child.buildScope();
+      for (MapEntry<String, AstNode> entry in child.selfScope().entries) {
+        (scope[entry.key] ??= []).add(entry.value);
+      }
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    if (name != null) {
+      return {name!: this};
+    } else {
+      return const {};
+    }
+  }
+}
+
+class ClassConstructor extends AstNode {
+  @override
+  final ClassConstructorEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ClassConstructor(
+      this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class constructor $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    // TODO: Possibly this should be different...
+    return {name: this};
+  }
+}
+
+class ClassFactoryMethod extends AstNode {
+  @override
+  final ClassFactoryMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ClassFactoryMethod(
+      this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class factory constructor $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    // TODO: Possibly this should be different...
+    return {name: this};
+  }
+}
+
+class ClassMethod extends AstNode {
+  @override
+  final ClassMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ClassMethod(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class ExtensionMethod extends AstNode {
+  @override
+  final ExtensionMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ExtensionMethod(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Extension method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class MixinMethod extends AstNode {
+  @override
+  final MixinMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  MixinMethod(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Mixin method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Enum extends AstNode {
+  @override
+  final EnumEnd node;
+  final String name;
+  final List<String> members;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Enum(this.node, this.name, this.members, this.startInclusive,
+      this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Enum $name with members $members");
+    return sb;
+  }
+
+  @override
+  void buildScope() {
+    for (String child in members) {
+      scope[child] = [this];
+    }
+  }
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Import extends AstNode {
+  @override
+  final ImportEnd node;
+  final Uri firstUri;
+  final List<Uri>? conditionalUris;
+  final String? asName;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Import(this.node, this.firstUri, this.conditionalUris, this.asName,
+      this.startInclusive, this.endInclusive);
+
+  List<Uri> get uris => [firstUri, ...?conditionalUris];
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    if (asName == null) {
+      sb.writeln("Import of $uris");
+    } else {
+      sb.writeln("Import of $uris as '$asName'");
+    }
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    if (asName != null) {
+      return {asName!: this};
+    }
+    return const {};
+  }
+}
+
+class Export extends AstNode {
+  @override
+  final ExportEnd node;
+  final Uri firstUri;
+  final List<Uri>? conditionalUris;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Export(this.node, this.firstUri, this.conditionalUris, this.startInclusive,
+      this.endInclusive);
+
+  List<Uri> get uris => [firstUri, ...?conditionalUris];
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Export of $uris");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class Part extends AstNode {
+  @override
+  final PartEnd node;
+  final Uri uri;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Part(this.node, this.uri, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Part $uri");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class TopLevelFields extends AstNode {
+  @override
+  final TopLevelFieldsEnd node;
+  final List<String> names;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  TopLevelFields(this.node, this.names, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Top level field(s) ${names.join(", ")}");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    Map<String, AstNode> scope = {};
+    for (String name in names) {
+      scope[name] = this;
+    }
+    return scope;
+  }
+}
+
+class TopLevelMethod extends AstNode {
+  @override
+  final TopLevelMethodEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  TopLevelMethod(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Top level method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class Typedef extends AstNode {
+  @override
+  final TypedefEnd node;
+  final String name;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Typedef(this.node, this.name, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Top level method $name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return {name: this};
+  }
+}
+
+class ClassFields extends AstNode {
+  @override
+  final ClassFieldsEnd node;
+  final List<String> names;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ClassFields(this.node, this.names, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Class field(s) ${names.join(", ")}");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    Map<String, AstNode> scope = {};
+    for (String name in names) {
+      scope[name] = this;
+    }
+    return scope;
+  }
+}
+
+class MixinFields extends AstNode {
+  @override
+  final MixinFieldsEnd node;
+  final List<String> names;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  MixinFields(this.node, this.names, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Mixin field(s) ${names.join(", ")}");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    Map<String, AstNode> scope = {};
+    for (String name in names) {
+      scope[name] = this;
+    }
+    return scope;
+  }
+}
+
+class ExtensionFields extends AstNode {
+  @override
+  final ExtensionFieldsEnd node;
+  final List<String> names;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  ExtensionFields(
+      this.node, this.names, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("Extension field(s) ${names.join(", ")}");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    Map<String, AstNode> scope = {};
+    for (String name in names) {
+      scope[name] = this;
+    }
+    return scope;
+  }
+}
+
+class Metadata extends AstNode {
+  @override
+  final MetadataEnd node;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  Metadata(this.node, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("metadata");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class LibraryName extends AstNode {
+  @override
+  final LibraryNameEnd node;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  LibraryName(this.node, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("library name");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class PartOf extends AstNode {
+  @override
+  final PartOfEnd node;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+  final Uri partOfUri;
+
+  PartOf(this.node, this.partOfUri, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("part of");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
+
+class LanguageVersion extends AstNode {
+  @override
+  final ParserAstNode node;
+  @override
+  final Token startInclusive;
+  @override
+  final Token endInclusive;
+
+  LanguageVersion(this.node, this.startInclusive, this.endInclusive);
+
+  @override
+  StringBuffer toStringInternal(StringBuffer sb, int indent) {
+    String stringIndent = " " * (indent * 2);
+    sb.write(stringIndent);
+    if (marked != Coloring.Untouched) {
+      sb.write("(marked) ");
+    }
+    sb.writeln("$startInclusive");
+    return sb;
+  }
+
+  @override
+  void buildScope() {}
+
+  @override
+  Map<String, AstNode> selfScope() {
+    return const {};
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
deleted file mode 100644
index 94a1865..0000000
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
+++ /dev/null
@@ -1,1292 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:typed_data' show Uint8List;
-
-import 'dart:io' show File;
-
-import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
-    show ScannerConfiguration;
-
-import 'package:_fe_analyzer_shared/src/parser/parser.dart'
-    show ClassMemberParser, Parser;
-
-import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
-    show Utf8BytesScanner;
-
-import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
-
-import '../source/diet_parser.dart';
-
-import 'direct_parser_ast_helper.dart';
-
-DirectParserASTContentCompilationUnitEnd getAST(List<int> rawBytes,
-    {bool includeBody: true,
-    bool includeComments: false,
-    bool enableExtensionMethods: false,
-    bool enableNonNullable: false,
-    bool enableTripleShift: false}) {
-  Uint8List bytes = new Uint8List(rawBytes.length + 1);
-  bytes.setRange(0, rawBytes.length, rawBytes);
-
-  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-      enableExtensionMethods: enableExtensionMethods,
-      enableNonNullable: enableNonNullable,
-      enableTripleShift: enableTripleShift);
-
-  Utf8BytesScanner scanner = new Utf8BytesScanner(
-    bytes,
-    includeComments: includeComments,
-    configuration: scannerConfiguration,
-    languageVersionChanged: (scanner, languageVersion) {
-      // For now don't do anything, but having it (making it non-null) means the
-      // configuration won't be reset.
-    },
-  );
-  Token firstToken = scanner.tokenize();
-  // ignore: unnecessary_null_comparison
-  if (firstToken == null) {
-    throw "firstToken is null";
-  }
-
-  DirectParserASTListener listener = new DirectParserASTListener();
-  Parser parser;
-  if (includeBody) {
-    parser = new Parser(listener,
-        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
-  } else {
-    parser = new ClassMemberParser(listener,
-        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
-  }
-  parser.parseUnit(firstToken);
-  return listener.data.single as DirectParserASTContentCompilationUnitEnd;
-}
-
-/// Best-effort visitor for DirectParserASTContent that visits top-level entries
-/// and class members only (i.e. no bodies, no field initializer content, no
-/// names etc).
-class DirectParserASTContentVisitor {
-  void accept(DirectParserASTContent node) {
-    if (node is DirectParserASTContentCompilationUnitEnd ||
-        node is DirectParserASTContentTopLevelDeclarationEnd ||
-        node is DirectParserASTContentClassOrMixinOrExtensionBodyEnd ||
-        node is DirectParserASTContentMemberEnd) {
-      visitChildren(node);
-      return;
-    }
-
-    if (node.type == DirectParserASTType.BEGIN) {
-      // Ignored. These are basically just dummy nodes anyway.
-      assert(node.children == null);
-      return;
-    }
-    if (node.type == DirectParserASTType.HANDLE) {
-      // Ignored at least for know.
-      assert(node.children == null);
-      return;
-    }
-    if (node is DirectParserASTContentTypeVariablesEnd ||
-        node is DirectParserASTContentTypeArgumentsEnd ||
-        node is DirectParserASTContentTypeListEnd ||
-        node is DirectParserASTContentFunctionTypeEnd ||
-        node is DirectParserASTContentBlockEnd) {
-      // Ignored at least for know.
-      return;
-    }
-    if (node is DirectParserASTContentMetadataStarEnd) {
-      DirectParserASTContentMetadataStarEnd metadata = node;
-      visitMetadataStar(metadata);
-      return;
-    }
-    if (node is DirectParserASTContentTypedefEnd) {
-      DirectParserASTContentTypedefEnd typedefDecl = node;
-      visitTypedef(
-          typedefDecl, typedefDecl.typedefKeyword, typedefDecl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassDeclarationEnd) {
-      DirectParserASTContentClassDeclarationEnd cls = node;
-      visitClass(cls, cls.beginToken, cls.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentTopLevelMethodEnd) {
-      DirectParserASTContentTopLevelMethodEnd method = node;
-      visitTopLevelMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassMethodEnd) {
-      DirectParserASTContentClassMethodEnd method = node;
-      visitClassMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionMethodEnd) {
-      DirectParserASTContentExtensionMethodEnd method = node;
-      visitExtensionMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinMethodEnd) {
-      DirectParserASTContentMixinMethodEnd method = node;
-      visitMixinMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentImportEnd) {
-      DirectParserASTContentImportEnd import = node;
-      visitImport(import, import.importKeyword, import.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentExportEnd) {
-      DirectParserASTContentExportEnd export = node;
-      visitExport(export, export.exportKeyword, export.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentTopLevelFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentTopLevelFieldsEnd fields = node;
-      visitTopLevelFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentClassFieldsEnd fields = node;
-      visitClassFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentExtensionFieldsEnd fields = node;
-      visitExtensionFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentMixinFieldsEnd fields = node;
-      visitMixinFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentNamedMixinApplicationEnd) {
-      DirectParserASTContentNamedMixinApplicationEnd namedMixin = node;
-      visitNamedMixin(namedMixin, namedMixin.begin, namedMixin.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinDeclarationEnd) {
-      DirectParserASTContentMixinDeclarationEnd declaration = node;
-      visitMixin(declaration, declaration.mixinKeyword, declaration.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentEnumEnd) {
-      DirectParserASTContentEnumEnd declaration = node;
-      visitEnum(declaration, declaration.enumKeyword,
-          declaration.leftBrace.endGroup!);
-      return;
-    }
-    if (node is DirectParserASTContentLibraryNameEnd) {
-      DirectParserASTContentLibraryNameEnd name = node;
-      visitLibraryName(name, name.libraryKeyword, name.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentPartEnd) {
-      DirectParserASTContentPartEnd part = node;
-      visitPart(part, part.partKeyword, part.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentPartOfEnd) {
-      DirectParserASTContentPartOfEnd partOf = node;
-      visitPartOf(partOf, partOf.partKeyword, partOf.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionDeclarationEnd) {
-      DirectParserASTContentExtensionDeclarationEnd ext = node;
-      visitExtension(ext, ext.extensionKeyword, ext.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassConstructorEnd) {
-      DirectParserASTContentClassConstructorEnd decl = node;
-      visitClassConstructor(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionConstructorEnd) {
-      DirectParserASTContentExtensionConstructorEnd decl = node;
-      visitExtensionConstructor(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassFactoryMethodEnd) {
-      DirectParserASTContentClassFactoryMethodEnd decl = node;
-      visitClassFactoryMethod(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionFactoryMethodEnd) {
-      DirectParserASTContentExtensionFactoryMethodEnd decl = node;
-      visitExtensionFactoryMethod(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMetadataEnd) {
-      DirectParserASTContentMetadataEnd decl = node;
-      // TODO(jensj): endToken is not part of the metadata! It's the first token
-      // of the next thing.
-      visitMetadata(decl, decl.beginToken, decl.endToken.previous!);
-      return;
-    }
-
-    throw "Unknown: $node (${node.runtimeType} @ ${node.what})";
-  }
-
-  void visitChildren(DirectParserASTContent node) {
-    if (node.children == null) return;
-    final int numChildren = node.children!.length;
-    for (int i = 0; i < numChildren; i++) {
-      DirectParserASTContent child = node.children![i];
-      accept(child);
-    }
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitImport(DirectParserASTContentImportEnd node, Token startInclusive,
-      Token? endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExport(DirectParserASTContentExportEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTypedef(DirectParserASTContentTypedefEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitMetadataStar(DirectParserASTContentMetadataStarEnd node) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitClass(DirectParserASTContentClassDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTopLevelMethod(DirectParserASTContentTopLevelMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassMethod(DirectParserASTContentClassMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionMethod(DirectParserASTContentExtensionMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMixinMethod(DirectParserASTContentMixinMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTopLevelFields(DirectParserASTContentTopLevelFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassFields(DirectParserASTContentClassFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionFields(DirectParserASTContentExtensionFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMixinFields(DirectParserASTContentMixinFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitNamedMixin(DirectParserASTContentNamedMixinApplicationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitMixin(DirectParserASTContentMixinDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitEnum(DirectParserASTContentEnumEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitLibraryName(DirectParserASTContentLibraryNameEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitPart(DirectParserASTContentPartEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitPartOf(DirectParserASTContentPartOfEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitExtension(DirectParserASTContentExtensionDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassConstructor(DirectParserASTContentClassConstructorEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionConstructor(
-      DirectParserASTContentExtensionConstructorEnd node,
-      Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassFactoryMethod(DirectParserASTContentClassFactoryMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionFactoryMethod(
-      DirectParserASTContentExtensionFactoryMethodEnd node,
-      Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMetadata(DirectParserASTContentMetadataEnd node,
-      Token startInclusive, Token endInclusive) {}
-}
-
-extension GeneralASTContentExtension on DirectParserASTContent {
-  bool isClass() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentClassDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentClassDeclarationEnd asClass() {
-    if (!isClass()) throw "Not class";
-    return children!.last as DirectParserASTContentClassDeclarationEnd;
-  }
-
-  bool isImport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentImportEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentImportEnd asImport() {
-    if (!isImport()) throw "Not import";
-    return children!.last as DirectParserASTContentImportEnd;
-  }
-
-  bool isExport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentExportEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentExportEnd asExport() {
-    if (!isExport()) throw "Not export";
-    return children!.last as DirectParserASTContentExportEnd;
-  }
-
-  bool isEnum() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentEnumEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentEnumEnd asEnum() {
-    if (!isEnum()) throw "Not enum";
-    return children!.last as DirectParserASTContentEnumEnd;
-  }
-
-  bool isTypedef() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTypedefEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTypedefEnd asTypedef() {
-    if (!isTypedef()) throw "Not typedef";
-    return children!.last as DirectParserASTContentTypedefEnd;
-  }
-
-  bool isScript() {
-    if (this is! DirectParserASTContentScriptHandle) {
-      return false;
-    }
-    return true;
-  }
-
-  DirectParserASTContentScriptHandle asScript() {
-    if (!isScript()) throw "Not script";
-    return this as DirectParserASTContentScriptHandle;
-  }
-
-  bool isExtension() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentExtensionDeclarationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentExtensionDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentExtensionDeclarationEnd asExtension() {
-    if (!isExtension()) throw "Not extension";
-    return children!.last as DirectParserASTContentExtensionDeclarationEnd;
-  }
-
-  bool isInvalidTopLevelDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last
-        is! DirectParserASTContentInvalidTopLevelDeclarationHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isRecoverableError() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentRecoverableErrorHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isRecoverImport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentRecoverImportHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isMixinDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentMixinDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentMixinDeclarationEnd asMixinDeclaration() {
-    if (!isMixinDeclaration()) throw "Not mixin declaration";
-    return children!.last as DirectParserASTContentMixinDeclarationEnd;
-  }
-
-  bool isNamedMixinDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentNamedMixinApplicationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentNamedMixinApplicationEnd asNamedMixinDeclaration() {
-    if (!isNamedMixinDeclaration()) throw "Not named mixin declaration";
-    return children!.last as DirectParserASTContentNamedMixinApplicationEnd;
-  }
-
-  bool isTopLevelMethod() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTopLevelMethodEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTopLevelMethodEnd asTopLevelMethod() {
-    if (!isTopLevelMethod()) throw "Not top level method";
-    return children!.last as DirectParserASTContentTopLevelMethodEnd;
-  }
-
-  bool isTopLevelFields() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTopLevelFieldsEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTopLevelFieldsEnd asTopLevelFields() {
-    if (!isTopLevelFields()) throw "Not top level fields";
-    return children!.last as DirectParserASTContentTopLevelFieldsEnd;
-  }
-
-  bool isLibraryName() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentLibraryNameEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentLibraryNameEnd asLibraryName() {
-    if (!isLibraryName()) throw "Not library name";
-    return children!.last as DirectParserASTContentLibraryNameEnd;
-  }
-
-  bool isPart() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentPartEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentPartEnd asPart() {
-    if (!isPart()) throw "Not part";
-    return children!.last as DirectParserASTContentPartEnd;
-  }
-
-  bool isPartOf() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentPartOfEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentPartOfEnd asPartOf() {
-    if (!isPartOf()) throw "Not part of";
-    return children!.last as DirectParserASTContentPartOfEnd;
-  }
-
-  bool isMetadata() {
-    if (this is! DirectParserASTContentMetadataStarEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentMetadataStarBegin) {
-      return false;
-    }
-    return true;
-  }
-
-  DirectParserASTContentMetadataStarEnd asMetadata() {
-    if (!isMetadata()) throw "Not metadata";
-    return this as DirectParserASTContentMetadataStarEnd;
-  }
-
-  bool isFunctionBody() {
-    if (this is DirectParserASTContentBlockFunctionBodyEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentBlockFunctionBodyEnd asFunctionBody() {
-    if (!isFunctionBody()) throw "Not function body";
-    return this as DirectParserASTContentBlockFunctionBodyEnd;
-  }
-
-  List<E> recursivelyFind<E extends DirectParserASTContent>() {
-    Set<E> result = {};
-    _recursivelyFindInternal(this, result);
-    return result.toList();
-  }
-
-  static void _recursivelyFindInternal<E extends DirectParserASTContent>(
-      DirectParserASTContent node, Set<E> result) {
-    if (node is E) {
-      result.add(node);
-      return;
-    }
-    if (node.children == null) return;
-    for (DirectParserASTContent child in node.children!) {
-      _recursivelyFindInternal(child, result);
-    }
-  }
-
-  void debugDumpNodeRecursively({String indent = ""}) {
-    print("$indent${runtimeType} (${what}) "
-        "(${deprecatedArguments})");
-    if (children == null) return;
-    for (DirectParserASTContent child in children!) {
-      child.debugDumpNodeRecursively(indent: "  $indent");
-    }
-  }
-}
-
-extension MetadataStarExtension on DirectParserASTContentMetadataStarEnd {
-  List<DirectParserASTContentMetadataEnd> getMetadataEntries() {
-    List<DirectParserASTContentMetadataEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (topLevel is! DirectParserASTContentMetadataEnd) continue;
-      result.add(topLevel);
-    }
-    return result;
-  }
-}
-
-extension CompilationUnitExtension on DirectParserASTContentCompilationUnitEnd {
-  List<DirectParserASTContentTopLevelDeclarationEnd> getClasses() {
-    List<DirectParserASTContentTopLevelDeclarationEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isClass()) continue;
-      result.add(topLevel as DirectParserASTContentTopLevelDeclarationEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentTopLevelDeclarationEnd> getMixinDeclarations() {
-    List<DirectParserASTContentTopLevelDeclarationEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isMixinDeclaration()) continue;
-      result.add(topLevel as DirectParserASTContentTopLevelDeclarationEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentImportEnd> getImports() {
-    List<DirectParserASTContentImportEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isImport()) continue;
-      result.add(topLevel.children!.last as DirectParserASTContentImportEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentExportEnd> getExports() {
-    List<DirectParserASTContentExportEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isExport()) continue;
-      result.add(topLevel.children!.last as DirectParserASTContentExportEnd);
-    }
-    return result;
-  }
-
-  // List<DirectParserASTContentMetadataStarEnd> getMetadata() {
-  //   List<DirectParserASTContentMetadataStarEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isMetadata()) continue;
-  //     result.add(topLevel);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentEnumEnd> getEnums() {
-  //   List<DirectParserASTContentEnumEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isEnum()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentFunctionTypeAliasEnd> getTypedefs() {
-  //   List<DirectParserASTContentFunctionTypeAliasEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isTypedef()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentMixinDeclarationEnd> getMixinDeclarations() {
-  //   List<DirectParserASTContentMixinDeclarationEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isMixinDeclaration()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentTopLevelMethodEnd> getTopLevelMethods() {
-  //   List<DirectParserASTContentTopLevelMethodEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isTopLevelMethod()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  DirectParserASTContentCompilationUnitBegin getBegin() {
-    return children!.first as DirectParserASTContentCompilationUnitBegin;
-  }
-}
-
-extension TopLevelDeclarationExtension
-    on DirectParserASTContentTopLevelDeclarationEnd {
-  DirectParserASTContentIdentifierHandle getIdentifier() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) return child;
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassDeclarationEnd getClassDeclaration() {
-    if (!isClass()) {
-      throw "Not a class";
-    }
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassDeclarationEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-}
-
-extension MixinDeclarationExtension
-    on DirectParserASTContentMixinDeclarationEnd {
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-      getClassOrMixinOrExtensionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinOrExtensionBodyEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-}
-
-extension ClassDeclarationExtension
-    on DirectParserASTContentClassDeclarationEnd {
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-      getClassOrMixinOrExtensionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinOrExtensionBodyEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassExtendsHandle getClassExtends() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassExtendsHandle) return child;
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassOrMixinImplementsHandle getClassImplements() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinImplementsHandle) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassWithClauseHandle? getClassWithClause() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassWithClauseHandle) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension ClassOrMixinBodyExtension
-    on DirectParserASTContentClassOrMixinOrExtensionBodyEnd {
-  List<DirectParserASTContentMemberEnd> getMembers() {
-    List<DirectParserASTContentMemberEnd> members = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentMemberEnd) {
-        members.add(child);
-      }
-    }
-    return members;
-  }
-}
-
-extension MemberExtension on DirectParserASTContentMemberEnd {
-  bool isClassConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassConstructorEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassConstructorEnd getClassConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassConstructorEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFactoryMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassFactoryMethodEnd getClassFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFactoryMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFieldsEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassFieldsEnd getClassFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFieldsEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFieldsEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinFieldsEnd getMixinFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFieldsEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinMethodEnd getMixinMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFactoryMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinFactoryMethodEnd getMixinFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFactoryMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinConstructorEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinConstructorEnd getMixinConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinConstructorEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassMethodEnd getClassMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassRecoverableError() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentRecoverableErrorHandle) return true;
-    return false;
-  }
-}
-
-extension ClassFieldsExtension on DirectParserASTContentClassFieldsEnd {
-  List<DirectParserASTContentIdentifierHandle?> getFieldIdentifiers() {
-    // For now blindly assume that the last count identifiers are the names
-    // of the fields.
-    int countLeft = count;
-    List<DirectParserASTContentIdentifierHandle>? identifiers;
-    for (int i = children!.length - 1; i >= 0; i--) {
-      DirectParserASTContent child = children![i];
-      if (child is DirectParserASTContentIdentifierHandle) {
-        countLeft--;
-        if (identifiers == null) {
-          identifiers = new List<DirectParserASTContentIdentifierHandle>.filled(
-              count, child);
-        } else {
-          identifiers[countLeft] = child;
-        }
-        if (countLeft == 0) break;
-      }
-    }
-    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
-    return identifiers ?? [];
-  }
-
-  DirectParserASTContentTypeHandle? getFirstType() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentTypeHandle) return child;
-    }
-    return null;
-  }
-
-  DirectParserASTContentFieldInitializerEnd? getFieldInitializer() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFieldInitializerEnd) return child;
-    }
-    return null;
-  }
-}
-
-extension ClassMethodExtension on DirectParserASTContentClassMethodEnd {
-  DirectParserASTContentBlockFunctionBodyEnd? getBlockFunctionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentBlockFunctionBodyEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension ClassConstructorExtension
-    on DirectParserASTContentClassConstructorEnd {
-  DirectParserASTContentFormalParametersEnd getFormalParameters() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParametersEnd) {
-        return child;
-      }
-    }
-    throw "Not found";
-  }
-
-  DirectParserASTContentInitializersEnd? getInitializers() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentInitializersEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-
-  DirectParserASTContentBlockFunctionBodyEnd? getBlockFunctionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentBlockFunctionBodyEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension FormalParametersExtension
-    on DirectParserASTContentFormalParametersEnd {
-  List<DirectParserASTContentFormalParameterEnd> getFormalParameters() {
-    List<DirectParserASTContentFormalParameterEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParameterEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-
-  DirectParserASTContentOptionalFormalParametersEnd?
-      getOptionalFormalParameters() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentOptionalFormalParametersEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension FormalParameterExtension on DirectParserASTContentFormalParameterEnd {
-  DirectParserASTContentFormalParameterBegin getBegin() {
-    return children!.first as DirectParserASTContentFormalParameterBegin;
-  }
-}
-
-extension OptionalFormalParametersExtension
-    on DirectParserASTContentOptionalFormalParametersEnd {
-  List<DirectParserASTContentFormalParameterEnd> getFormalParameters() {
-    List<DirectParserASTContentFormalParameterEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParameterEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-}
-
-extension InitializersExtension on DirectParserASTContentInitializersEnd {
-  List<DirectParserASTContentInitializerEnd> getInitializers() {
-    List<DirectParserASTContentInitializerEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentInitializerEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-
-  DirectParserASTContentInitializersBegin getBegin() {
-    return children!.first as DirectParserASTContentInitializersBegin;
-  }
-}
-
-extension InitializerExtension on DirectParserASTContentInitializerEnd {
-  DirectParserASTContentInitializerBegin getBegin() {
-    return children!.first as DirectParserASTContentInitializerBegin;
-  }
-}
-
-void main(List<String> args) {
-  File f = new File(args[0]);
-  Uint8List data = f.readAsBytesSync();
-  DirectParserASTContent ast = getAST(data);
-  if (args.length > 1 && args[1] == "--benchmark") {
-    Stopwatch stopwatch = new Stopwatch()..start();
-    int numRuns = 100;
-    for (int i = 0; i < numRuns; i++) {
-      DirectParserASTContent ast2 = getAST(data);
-      if (ast.what != ast2.what) {
-        throw "Not the same result every time";
-      }
-    }
-    stopwatch.stop();
-    print("First $numRuns took ${stopwatch.elapsedMilliseconds} ms "
-        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
-    stopwatch = new Stopwatch()..start();
-    numRuns = 2500;
-    for (int i = 0; i < numRuns; i++) {
-      DirectParserASTContent ast2 = getAST(data);
-      if (ast.what != ast2.what) {
-        throw "Not the same result every time";
-      }
-    }
-    stopwatch.stop();
-    print("Next $numRuns took ${stopwatch.elapsedMilliseconds} ms "
-        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
-  } else {
-    print(ast);
-  }
-}
-
-class DirectParserASTListener extends AbstractDirectParserASTListener {
-  @override
-  void seen(DirectParserASTContent entry) {
-    switch (entry.type) {
-      case DirectParserASTType.BEGIN:
-      case DirectParserASTType.HANDLE:
-        // This just adds stuff.
-        data.add(entry);
-        break;
-      case DirectParserASTType.END:
-        // End should gobble up everything until the corresponding begin (which
-        // should be the latest begin).
-        int? beginIndex;
-        for (int i = data.length - 1; i >= 0; i--) {
-          if (data[i].type == DirectParserASTType.BEGIN) {
-            beginIndex = i;
-            break;
-          }
-        }
-        if (beginIndex == null) {
-          throw "Couldn't find a begin for ${entry.what}. Has:\n"
-              "${data.map((e) => "${e.what}: ${e.type}").join("\n")}";
-        }
-        String begin = data[beginIndex].what;
-        String end = entry.what;
-        if (begin == end) {
-          // Exact match.
-        } else if (end == "TopLevelDeclaration" &&
-            (begin == "ExtensionDeclarationPrelude" ||
-                begin == "ClassOrMixinOrNamedMixinApplicationPrelude" ||
-                begin == "TopLevelMember" ||
-                begin == "UncategorizedTopLevelDeclaration")) {
-          // endTopLevelDeclaration is started by one of
-          // beginExtensionDeclarationPrelude,
-          // beginClassOrNamedMixinApplicationPrelude
-          // beginTopLevelMember or beginUncategorizedTopLevelDeclaration.
-        } else if (begin == "Method" &&
-            (end == "ClassConstructor" ||
-                end == "ClassMethod" ||
-                end == "ExtensionConstructor" ||
-                end == "ExtensionMethod" ||
-                end == "MixinConstructor" ||
-                end == "MixinMethod")) {
-          // beginMethod is ended by one of endClassConstructor, endClassMethod,
-          // endExtensionMethod, endMixinConstructor or endMixinMethod.
-        } else if (begin == "Fields" &&
-            (end == "TopLevelFields" ||
-                end == "ClassFields" ||
-                end == "MixinFields" ||
-                end == "ExtensionFields")) {
-          // beginFields is ended by one of endTopLevelFields, endMixinFields or
-          // endExtensionFields.
-        } else if (begin == "ForStatement" && end == "ForIn") {
-          // beginForStatement is ended by either endForStatement or endForIn.
-        } else if (begin == "FactoryMethod" &&
-            (end == "ClassFactoryMethod" ||
-                end == "MixinFactoryMethod" ||
-                end == "ExtensionFactoryMethod")) {
-          // beginFactoryMethod is ended by either endClassFactoryMethod,
-          // endMixinFactoryMethod or endExtensionFactoryMethod.
-        } else if (begin == "ForControlFlow" && (end == "ForInControlFlow")) {
-          // beginForControlFlow is ended by either endForControlFlow or
-          // endForInControlFlow.
-        } else if (begin == "IfControlFlow" && (end == "IfElseControlFlow")) {
-          // beginIfControlFlow is ended by either endIfControlFlow or
-          // endIfElseControlFlow.
-        } else if (begin == "AwaitExpression" &&
-            (end == "InvalidAwaitExpression")) {
-          // beginAwaitExpression is ended by either endAwaitExpression or
-          // endInvalidAwaitExpression.
-        } else if (begin == "YieldStatement" &&
-            (end == "InvalidYieldStatement")) {
-          // beginYieldStatement is ended by either endYieldStatement or
-          // endInvalidYieldStatement.
-        } else {
-          throw "Unknown combination: begin$begin and end$end";
-        }
-        List<DirectParserASTContent> children = data.sublist(beginIndex);
-        data.length = beginIndex;
-        data.add(entry..children = children);
-        break;
-    }
-  }
-
-  @override
-  void reportVarianceModifierNotEnabled(Token? variance) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Uri get uri => throw new UnimplementedError();
-
-  @override
-  void logEvent(String name) {
-    throw new UnimplementedError();
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
deleted file mode 100644
index 4fedb0b..0000000
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
+++ /dev/null
@@ -1,7636 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:_fe_analyzer_shared/src/parser/assert.dart';
-import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/constructor_reference_context.dart';
-import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
-import 'package:_fe_analyzer_shared/src/parser/listener.dart';
-import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
-import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
-import 'package:_fe_analyzer_shared/src/scanner/token.dart';
-import 'package:front_end/src/fasta/messages.dart';
-
-// ignore_for_file: lines_longer_than_80_chars
-
-// THIS FILE IS AUTO GENERATED BY
-// 'tool/_fasta/direct_parser_ast_helper_creator.dart'
-// Run this command to update it:
-// 'dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart'
-
-abstract class DirectParserASTContent {
-  final String what;
-  final DirectParserASTType type;
-  Map<String, Object?> get deprecatedArguments;
-  List<DirectParserASTContent>? children;
-
-  DirectParserASTContent(this.what, this.type);
-
-  // TODO(jensj): Compare two ASTs.
-}
-
-enum DirectParserASTType { BEGIN, END, HANDLE }
-
-abstract class AbstractDirectParserASTListener implements Listener {
-  List<DirectParserASTContent> data = [];
-
-  void seen(DirectParserASTContent entry);
-
-  @override
-  void beginArguments(Token token) {
-    DirectParserASTContentArgumentsBegin data =
-        new DirectParserASTContentArgumentsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endArguments(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentArgumentsEnd data =
-        new DirectParserASTContentArgumentsEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
-    DirectParserASTContentAsyncModifierHandle data =
-        new DirectParserASTContentAsyncModifierHandle(
-            DirectParserASTType.HANDLE,
-            asyncToken: asyncToken,
-            starToken: starToken);
-    seen(data);
-  }
-
-  @override
-  void beginAwaitExpression(Token token) {
-    DirectParserASTContentAwaitExpressionBegin data =
-        new DirectParserASTContentAwaitExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endAwaitExpression(Token beginToken, Token endToken) {
-    DirectParserASTContentAwaitExpressionEnd data =
-        new DirectParserASTContentAwaitExpressionEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endInvalidAwaitExpression(
-      Token beginToken, Token endToken, MessageCode errorCode) {
-    DirectParserASTContentInvalidAwaitExpressionEnd data =
-        new DirectParserASTContentInvalidAwaitExpressionEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            endToken: endToken,
-            errorCode: errorCode);
-    seen(data);
-  }
-
-  @override
-  void beginBlock(Token token, BlockKind blockKind) {
-    DirectParserASTContentBlockBegin data =
-        new DirectParserASTContentBlockBegin(DirectParserASTType.BEGIN,
-            token: token, blockKind: blockKind);
-    seen(data);
-  }
-
-  @override
-  void endBlock(
-      int count, Token beginToken, Token endToken, BlockKind blockKind) {
-    DirectParserASTContentBlockEnd data = new DirectParserASTContentBlockEnd(
-        DirectParserASTType.END,
-        count: count,
-        beginToken: beginToken,
-        endToken: endToken,
-        blockKind: blockKind);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTopLevelBlock(Token token) {
-    DirectParserASTContentInvalidTopLevelBlockHandle data =
-        new DirectParserASTContentInvalidTopLevelBlockHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginCascade(Token token) {
-    DirectParserASTContentCascadeBegin data =
-        new DirectParserASTContentCascadeBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCascade() {
-    DirectParserASTContentCascadeEnd data =
-        new DirectParserASTContentCascadeEnd(DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void beginCaseExpression(Token caseKeyword) {
-    DirectParserASTContentCaseExpressionBegin data =
-        new DirectParserASTContentCaseExpressionBegin(DirectParserASTType.BEGIN,
-            caseKeyword: caseKeyword);
-    seen(data);
-  }
-
-  @override
-  void endCaseExpression(Token colon) {
-    DirectParserASTContentCaseExpressionEnd data =
-        new DirectParserASTContentCaseExpressionEnd(DirectParserASTType.END,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginClassOrMixinOrExtensionBody(DeclarationKind kind, Token token) {
-    DirectParserASTContentClassOrMixinOrExtensionBodyBegin data =
-        new DirectParserASTContentClassOrMixinOrExtensionBodyBegin(
-            DirectParserASTType.BEGIN,
-            kind: kind,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endClassOrMixinOrExtensionBody(
-      DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
-    DirectParserASTContentClassOrMixinOrExtensionBodyEnd data =
-        new DirectParserASTContentClassOrMixinOrExtensionBodyEnd(
-            DirectParserASTType.END,
-            kind: kind,
-            memberCount: memberCount,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginClassOrMixinOrNamedMixinApplicationPrelude(Token token) {
-    DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin data =
-        new DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
-    DirectParserASTContentClassDeclarationBegin data =
-        new DirectParserASTContentClassDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            begin: begin,
-            abstractToken: abstractToken,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleClassExtends(Token? extendsKeyword, int typeCount) {
-    DirectParserASTContentClassExtendsHandle data =
-        new DirectParserASTContentClassExtendsHandle(DirectParserASTType.HANDLE,
-            extendsKeyword: extendsKeyword, typeCount: typeCount);
-    seen(data);
-  }
-
-  @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    DirectParserASTContentClassOrMixinImplementsHandle data =
-        new DirectParserASTContentClassOrMixinImplementsHandle(
-            DirectParserASTType.HANDLE,
-            implementsKeyword: implementsKeyword,
-            interfacesCount: interfacesCount);
-    seen(data);
-  }
-
-  @override
-  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
-      Token? hideKeyword, int hideElementCount) {
-    DirectParserASTContentExtensionShowHideHandle data =
-        new DirectParserASTContentExtensionShowHideHandle(
-            DirectParserASTType.HANDLE,
-            showKeyword: showKeyword,
-            showElementCount: showElementCount,
-            hideKeyword: hideKeyword,
-            hideElementCount: hideElementCount);
-    seen(data);
-  }
-
-  @override
-  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
-    DirectParserASTContentClassHeaderHandle data =
-        new DirectParserASTContentClassHeaderHandle(DirectParserASTType.HANDLE,
-            begin: begin, classKeyword: classKeyword, nativeToken: nativeToken);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverClassHeader() {
-    DirectParserASTContentRecoverClassHeaderHandle data =
-        new DirectParserASTContentRecoverClassHeaderHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endClassDeclaration(Token beginToken, Token endToken) {
-    DirectParserASTContentClassDeclarationEnd data =
-        new DirectParserASTContentClassDeclarationEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginMixinDeclaration(Token mixinKeyword, Token name) {
-    DirectParserASTContentMixinDeclarationBegin data =
-        new DirectParserASTContentMixinDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            mixinKeyword: mixinKeyword,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleMixinOn(Token? onKeyword, int typeCount) {
-    DirectParserASTContentMixinOnHandle data =
-        new DirectParserASTContentMixinOnHandle(DirectParserASTType.HANDLE,
-            onKeyword: onKeyword, typeCount: typeCount);
-    seen(data);
-  }
-
-  @override
-  void handleMixinHeader(Token mixinKeyword) {
-    DirectParserASTContentMixinHeaderHandle data =
-        new DirectParserASTContentMixinHeaderHandle(DirectParserASTType.HANDLE,
-            mixinKeyword: mixinKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverMixinHeader() {
-    DirectParserASTContentRecoverMixinHeaderHandle data =
-        new DirectParserASTContentRecoverMixinHeaderHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
-    DirectParserASTContentMixinDeclarationEnd data =
-        new DirectParserASTContentMixinDeclarationEnd(DirectParserASTType.END,
-            mixinKeyword: mixinKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginUncategorizedTopLevelDeclaration(Token token) {
-    DirectParserASTContentUncategorizedTopLevelDeclarationBegin data =
-        new DirectParserASTContentUncategorizedTopLevelDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginExtensionDeclarationPrelude(Token extensionKeyword) {
-    DirectParserASTContentExtensionDeclarationPreludeBegin data =
-        new DirectParserASTContentExtensionDeclarationPreludeBegin(
-            DirectParserASTType.BEGIN,
-            extensionKeyword: extensionKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
-    DirectParserASTContentExtensionDeclarationBegin data =
-        new DirectParserASTContentExtensionDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            extensionKeyword: extensionKeyword,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
-    DirectParserASTContentExtensionDeclarationEnd data =
-        new DirectParserASTContentExtensionDeclarationEnd(
-            DirectParserASTType.END,
-            extensionKeyword: extensionKeyword,
-            typeKeyword: typeKeyword,
-            onKeyword: onKeyword,
-            showKeyword: showKeyword,
-            hideKeyword: hideKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginCombinators(Token token) {
-    DirectParserASTContentCombinatorsBegin data =
-        new DirectParserASTContentCombinatorsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCombinators(int count) {
-    DirectParserASTContentCombinatorsEnd data =
-        new DirectParserASTContentCombinatorsEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginCompilationUnit(Token token) {
-    DirectParserASTContentCompilationUnitBegin data =
-        new DirectParserASTContentCompilationUnitBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleDirectivesOnly() {
-    DirectParserASTContentDirectivesOnlyHandle data =
-        new DirectParserASTContentDirectivesOnlyHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endCompilationUnit(int count, Token token) {
-    DirectParserASTContentCompilationUnitEnd data =
-        new DirectParserASTContentCompilationUnitEnd(DirectParserASTType.END,
-            count: count, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConstLiteral(Token token) {
-    DirectParserASTContentConstLiteralBegin data =
-        new DirectParserASTContentConstLiteralBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endConstLiteral(Token token) {
-    DirectParserASTContentConstLiteralEnd data =
-        new DirectParserASTContentConstLiteralEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConstructorReference(Token start) {
-    DirectParserASTContentConstructorReferenceBegin data =
-        new DirectParserASTContentConstructorReferenceBegin(
-            DirectParserASTType.BEGIN,
-            start: start);
-    seen(data);
-  }
-
-  @override
-  void endConstructorReference(Token start, Token? periodBeforeName,
-      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
-    DirectParserASTContentConstructorReferenceEnd data =
-        new DirectParserASTContentConstructorReferenceEnd(
-            DirectParserASTType.END,
-            start: start,
-            periodBeforeName: periodBeforeName,
-            endToken: endToken,
-            constructorReferenceContext: constructorReferenceContext);
-    seen(data);
-  }
-
-  @override
-  void beginDoWhileStatement(Token token) {
-    DirectParserASTContentDoWhileStatementBegin data =
-        new DirectParserASTContentDoWhileStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endDoWhileStatement(
-      Token doKeyword, Token whileKeyword, Token endToken) {
-    DirectParserASTContentDoWhileStatementEnd data =
-        new DirectParserASTContentDoWhileStatementEnd(DirectParserASTType.END,
-            doKeyword: doKeyword,
-            whileKeyword: whileKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginDoWhileStatementBody(Token token) {
-    DirectParserASTContentDoWhileStatementBodyBegin data =
-        new DirectParserASTContentDoWhileStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endDoWhileStatementBody(Token token) {
-    DirectParserASTContentDoWhileStatementBodyEnd data =
-        new DirectParserASTContentDoWhileStatementBodyEnd(
-            DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginWhileStatementBody(Token token) {
-    DirectParserASTContentWhileStatementBodyBegin data =
-        new DirectParserASTContentWhileStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endWhileStatementBody(Token token) {
-    DirectParserASTContentWhileStatementBodyEnd data =
-        new DirectParserASTContentWhileStatementBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginEnum(Token enumKeyword) {
-    DirectParserASTContentEnumBegin data = new DirectParserASTContentEnumBegin(
-        DirectParserASTType.BEGIN,
-        enumKeyword: enumKeyword);
-    seen(data);
-  }
-
-  @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    DirectParserASTContentEnumEnd data = new DirectParserASTContentEnumEnd(
-        DirectParserASTType.END,
-        enumKeyword: enumKeyword,
-        leftBrace: leftBrace,
-        count: count);
-    seen(data);
-  }
-
-  @override
-  void beginExport(Token token) {
-    DirectParserASTContentExportBegin data =
-        new DirectParserASTContentExportBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endExport(Token exportKeyword, Token semicolon) {
-    DirectParserASTContentExportEnd data = new DirectParserASTContentExportEnd(
-        DirectParserASTType.END,
-        exportKeyword: exportKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleExtraneousExpression(Token token, Message message) {
-    DirectParserASTContentExtraneousExpressionHandle data =
-        new DirectParserASTContentExtraneousExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            message: message);
-    seen(data);
-  }
-
-  @override
-  void handleExpressionStatement(Token token) {
-    DirectParserASTContentExpressionStatementHandle data =
-        new DirectParserASTContentExpressionStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFactoryMethod(DeclarationKind declarationKind, Token lastConsumed,
-      Token? externalToken, Token? constToken) {
-    DirectParserASTContentFactoryMethodBegin data =
-        new DirectParserASTContentFactoryMethodBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            lastConsumed: lastConsumed,
-            externalToken: externalToken,
-            constToken: constToken);
-    seen(data);
-  }
-
-  @override
-  void endClassFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentClassFactoryMethodEnd data =
-        new DirectParserASTContentClassFactoryMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentMixinFactoryMethodEnd data =
-        new DirectParserASTContentMixinFactoryMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentExtensionFactoryMethodEnd data =
-        new DirectParserASTContentExtensionFactoryMethodEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
-      Token? covariantToken, Token? varFinalOrConst) {
-    DirectParserASTContentFormalParameterBegin data =
-        new DirectParserASTContentFormalParameterBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            kind: kind,
-            requiredToken: requiredToken,
-            covariantToken: covariantToken,
-            varFinalOrConst: varFinalOrConst);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameter(
-      Token? thisKeyword,
-      Token? periodAfterThis,
-      Token nameToken,
-      Token? initializerStart,
-      Token? initializerEnd,
-      FormalParameterKind kind,
-      MemberKind memberKind) {
-    DirectParserASTContentFormalParameterEnd data =
-        new DirectParserASTContentFormalParameterEnd(DirectParserASTType.END,
-            thisKeyword: thisKeyword,
-            periodAfterThis: periodAfterThis,
-            nameToken: nameToken,
-            initializerStart: initializerStart,
-            initializerEnd: initializerEnd,
-            kind: kind,
-            memberKind: memberKind);
-    seen(data);
-  }
-
-  @override
-  void handleNoFormalParameters(Token token, MemberKind kind) {
-    DirectParserASTContentNoFormalParametersHandle data =
-        new DirectParserASTContentNoFormalParametersHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameters(Token token, MemberKind kind) {
-    DirectParserASTContentFormalParametersBegin data =
-        new DirectParserASTContentFormalParametersBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameters(
-      int count, Token beginToken, Token endToken, MemberKind kind) {
-    DirectParserASTContentFormalParametersEnd data =
-        new DirectParserASTContentFormalParametersEnd(DirectParserASTType.END,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endClassFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentClassFieldsEnd data =
-        new DirectParserASTContentClassFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentMixinFieldsEnd data =
-        new DirectParserASTContentMixinFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentExtensionFieldsEnd data =
-        new DirectParserASTContentExtensionFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerEmptyStatement(Token token) {
-    DirectParserASTContentForInitializerEmptyStatementHandle data =
-        new DirectParserASTContentForInitializerEmptyStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerExpressionStatement(Token token, bool forIn) {
-    DirectParserASTContentForInitializerExpressionStatementHandle data =
-        new DirectParserASTContentForInitializerExpressionStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            forIn: forIn);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerLocalVariableDeclaration(Token token, bool forIn) {
-    DirectParserASTContentForInitializerLocalVariableDeclarationHandle data =
-        new DirectParserASTContentForInitializerLocalVariableDeclarationHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            forIn: forIn);
-    seen(data);
-  }
-
-  @override
-  void beginForStatement(Token token) {
-    DirectParserASTContentForStatementBegin data =
-        new DirectParserASTContentForStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForLoopParts(Token forKeyword, Token leftParen,
-      Token leftSeparator, int updateExpressionCount) {
-    DirectParserASTContentForLoopPartsHandle data =
-        new DirectParserASTContentForLoopPartsHandle(DirectParserASTType.HANDLE,
-            forKeyword: forKeyword,
-            leftParen: leftParen,
-            leftSeparator: leftSeparator,
-            updateExpressionCount: updateExpressionCount);
-    seen(data);
-  }
-
-  @override
-  void endForStatement(Token endToken) {
-    DirectParserASTContentForStatementEnd data =
-        new DirectParserASTContentForStatementEnd(DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginForStatementBody(Token token) {
-    DirectParserASTContentForStatementBodyBegin data =
-        new DirectParserASTContentForStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForStatementBody(Token token) {
-    DirectParserASTContentForStatementBodyEnd data =
-        new DirectParserASTContentForStatementBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForInLoopParts(Token? awaitToken, Token forToken,
-      Token leftParenthesis, Token inKeyword) {
-    DirectParserASTContentForInLoopPartsHandle data =
-        new DirectParserASTContentForInLoopPartsHandle(
-            DirectParserASTType.HANDLE,
-            awaitToken: awaitToken,
-            forToken: forToken,
-            leftParenthesis: leftParenthesis,
-            inKeyword: inKeyword);
-    seen(data);
-  }
-
-  @override
-  void endForIn(Token endToken) {
-    DirectParserASTContentForInEnd data = new DirectParserASTContentForInEnd(
-        DirectParserASTType.END,
-        endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginForInExpression(Token token) {
-    DirectParserASTContentForInExpressionBegin data =
-        new DirectParserASTContentForInExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInExpression(Token token) {
-    DirectParserASTContentForInExpressionEnd data =
-        new DirectParserASTContentForInExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginForInBody(Token token) {
-    DirectParserASTContentForInBodyBegin data =
-        new DirectParserASTContentForInBodyBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInBody(Token token) {
-    DirectParserASTContentForInBodyEnd data =
-        new DirectParserASTContentForInBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginNamedFunctionExpression(Token token) {
-    DirectParserASTContentNamedFunctionExpressionBegin data =
-        new DirectParserASTContentNamedFunctionExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endNamedFunctionExpression(Token endToken) {
-    DirectParserASTContentNamedFunctionExpressionEnd data =
-        new DirectParserASTContentNamedFunctionExpressionEnd(
-            DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLocalFunctionDeclaration(Token token) {
-    DirectParserASTContentLocalFunctionDeclarationBegin data =
-        new DirectParserASTContentLocalFunctionDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLocalFunctionDeclaration(Token endToken) {
-    DirectParserASTContentLocalFunctionDeclarationEnd data =
-        new DirectParserASTContentLocalFunctionDeclarationEnd(
-            DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginBlockFunctionBody(Token token) {
-    DirectParserASTContentBlockFunctionBodyBegin data =
-        new DirectParserASTContentBlockFunctionBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentBlockFunctionBodyEnd data =
-        new DirectParserASTContentBlockFunctionBodyEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleNoFunctionBody(Token token) {
-    DirectParserASTContentNoFunctionBodyHandle data =
-        new DirectParserASTContentNoFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
-    DirectParserASTContentFunctionBodySkippedHandle data =
-        new DirectParserASTContentFunctionBodySkippedHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            isExpressionBody: isExpressionBody);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionName(Token token) {
-    DirectParserASTContentFunctionNameBegin data =
-        new DirectParserASTContentFunctionNameBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionName(Token beginToken, Token token) {
-    DirectParserASTContentFunctionNameEnd data =
-        new DirectParserASTContentFunctionNameEnd(DirectParserASTType.END,
-            beginToken: beginToken, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginTypedef(Token token) {
-    DirectParserASTContentTypedefBegin data =
-        new DirectParserASTContentTypedefBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypedef(Token typedefKeyword, Token? equals, Token endToken) {
-    DirectParserASTContentTypedefEnd data =
-        new DirectParserASTContentTypedefEnd(DirectParserASTType.END,
-            typedefKeyword: typedefKeyword, equals: equals, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleClassWithClause(Token withKeyword) {
-    DirectParserASTContentClassWithClauseHandle data =
-        new DirectParserASTContentClassWithClauseHandle(
-            DirectParserASTType.HANDLE,
-            withKeyword: withKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleClassNoWithClause() {
-    DirectParserASTContentClassNoWithClauseHandle data =
-        new DirectParserASTContentClassNoWithClauseHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void beginNamedMixinApplication(
-      Token begin, Token? abstractToken, Token name) {
-    DirectParserASTContentNamedMixinApplicationBegin data =
-        new DirectParserASTContentNamedMixinApplicationBegin(
-            DirectParserASTType.BEGIN,
-            begin: begin,
-            abstractToken: abstractToken,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleNamedMixinApplicationWithClause(Token withKeyword) {
-    DirectParserASTContentNamedMixinApplicationWithClauseHandle data =
-        new DirectParserASTContentNamedMixinApplicationWithClauseHandle(
-            DirectParserASTType.HANDLE,
-            withKeyword: withKeyword);
-    seen(data);
-  }
-
-  @override
-  void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
-      Token? implementsKeyword, Token endToken) {
-    DirectParserASTContentNamedMixinApplicationEnd data =
-        new DirectParserASTContentNamedMixinApplicationEnd(
-            DirectParserASTType.END,
-            begin: begin,
-            classKeyword: classKeyword,
-            equals: equals,
-            implementsKeyword: implementsKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginHide(Token hideKeyword) {
-    DirectParserASTContentHideBegin data = new DirectParserASTContentHideBegin(
-        DirectParserASTType.BEGIN,
-        hideKeyword: hideKeyword);
-    seen(data);
-  }
-
-  @override
-  void endHide(Token hideKeyword) {
-    DirectParserASTContentHideEnd data = new DirectParserASTContentHideEnd(
-        DirectParserASTType.END,
-        hideKeyword: hideKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleIdentifierList(int count) {
-    DirectParserASTContentIdentifierListHandle data =
-        new DirectParserASTContentIdentifierListHandle(
-            DirectParserASTType.HANDLE,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginTypeList(Token token) {
-    DirectParserASTContentTypeListBegin data =
-        new DirectParserASTContentTypeListBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeList(int count) {
-    DirectParserASTContentTypeListEnd data =
-        new DirectParserASTContentTypeListEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginIfStatement(Token token) {
-    DirectParserASTContentIfStatementBegin data =
-        new DirectParserASTContentIfStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endIfStatement(Token ifToken, Token? elseToken) {
-    DirectParserASTContentIfStatementEnd data =
-        new DirectParserASTContentIfStatementEnd(DirectParserASTType.END,
-            ifToken: ifToken, elseToken: elseToken);
-    seen(data);
-  }
-
-  @override
-  void beginThenStatement(Token token) {
-    DirectParserASTContentThenStatementBegin data =
-        new DirectParserASTContentThenStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endThenStatement(Token token) {
-    DirectParserASTContentThenStatementEnd data =
-        new DirectParserASTContentThenStatementEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginElseStatement(Token token) {
-    DirectParserASTContentElseStatementBegin data =
-        new DirectParserASTContentElseStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endElseStatement(Token token) {
-    DirectParserASTContentElseStatementEnd data =
-        new DirectParserASTContentElseStatementEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginImport(Token importKeyword) {
-    DirectParserASTContentImportBegin data =
-        new DirectParserASTContentImportBegin(DirectParserASTType.BEGIN,
-            importKeyword: importKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
-    DirectParserASTContentImportPrefixHandle data =
-        new DirectParserASTContentImportPrefixHandle(DirectParserASTType.HANDLE,
-            deferredKeyword: deferredKeyword, asKeyword: asKeyword);
-    seen(data);
-  }
-
-  @override
-  void endImport(Token importKeyword, Token? semicolon) {
-    DirectParserASTContentImportEnd data = new DirectParserASTContentImportEnd(
-        DirectParserASTType.END,
-        importKeyword: importKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverImport(Token? semicolon) {
-    DirectParserASTContentRecoverImportHandle data =
-        new DirectParserASTContentRecoverImportHandle(
-            DirectParserASTType.HANDLE,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalUris(Token token) {
-    DirectParserASTContentConditionalUrisBegin data =
-        new DirectParserASTContentConditionalUrisBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endConditionalUris(int count) {
-    DirectParserASTContentConditionalUrisEnd data =
-        new DirectParserASTContentConditionalUrisEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalUri(Token ifKeyword) {
-    DirectParserASTContentConditionalUriBegin data =
-        new DirectParserASTContentConditionalUriBegin(DirectParserASTType.BEGIN,
-            ifKeyword: ifKeyword);
-    seen(data);
-  }
-
-  @override
-  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
-    DirectParserASTContentConditionalUriEnd data =
-        new DirectParserASTContentConditionalUriEnd(DirectParserASTType.END,
-            ifKeyword: ifKeyword, leftParen: leftParen, equalSign: equalSign);
-    seen(data);
-  }
-
-  @override
-  void handleDottedName(int count, Token firstIdentifier) {
-    DirectParserASTContentDottedNameHandle data =
-        new DirectParserASTContentDottedNameHandle(DirectParserASTType.HANDLE,
-            count: count, firstIdentifier: firstIdentifier);
-    seen(data);
-  }
-
-  @override
-  void beginImplicitCreationExpression(Token token) {
-    DirectParserASTContentImplicitCreationExpressionBegin data =
-        new DirectParserASTContentImplicitCreationExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endImplicitCreationExpression(Token token, Token openAngleBracket) {
-    DirectParserASTContentImplicitCreationExpressionEnd data =
-        new DirectParserASTContentImplicitCreationExpressionEnd(
-            DirectParserASTType.END,
-            token: token,
-            openAngleBracket: openAngleBracket);
-    seen(data);
-  }
-
-  @override
-  void beginInitializedIdentifier(Token token) {
-    DirectParserASTContentInitializedIdentifierBegin data =
-        new DirectParserASTContentInitializedIdentifierBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializedIdentifier(Token nameToken) {
-    DirectParserASTContentInitializedIdentifierEnd data =
-        new DirectParserASTContentInitializedIdentifierEnd(
-            DirectParserASTType.END,
-            nameToken: nameToken);
-    seen(data);
-  }
-
-  @override
-  void beginFieldInitializer(Token token) {
-    DirectParserASTContentFieldInitializerBegin data =
-        new DirectParserASTContentFieldInitializerBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFieldInitializer(Token assignment, Token token) {
-    DirectParserASTContentFieldInitializerEnd data =
-        new DirectParserASTContentFieldInitializerEnd(DirectParserASTType.END,
-            assignment: assignment, token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoFieldInitializer(Token token) {
-    DirectParserASTContentNoFieldInitializerHandle data =
-        new DirectParserASTContentNoFieldInitializerHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginVariableInitializer(Token token) {
-    DirectParserASTContentVariableInitializerBegin data =
-        new DirectParserASTContentVariableInitializerBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endVariableInitializer(Token assignmentOperator) {
-    DirectParserASTContentVariableInitializerEnd data =
-        new DirectParserASTContentVariableInitializerEnd(
-            DirectParserASTType.END,
-            assignmentOperator: assignmentOperator);
-    seen(data);
-  }
-
-  @override
-  void handleNoVariableInitializer(Token token) {
-    DirectParserASTContentNoVariableInitializerHandle data =
-        new DirectParserASTContentNoVariableInitializerHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginInitializer(Token token) {
-    DirectParserASTContentInitializerBegin data =
-        new DirectParserASTContentInitializerBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializer(Token token) {
-    DirectParserASTContentInitializerEnd data =
-        new DirectParserASTContentInitializerEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginInitializers(Token token) {
-    DirectParserASTContentInitializersBegin data =
-        new DirectParserASTContentInitializersBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializers(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentInitializersEnd data =
-        new DirectParserASTContentInitializersEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleNoInitializers() {
-    DirectParserASTContentNoInitializersHandle data =
-        new DirectParserASTContentNoInitializersHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidExpression(Token token) {
-    DirectParserASTContentInvalidExpressionHandle data =
-        new DirectParserASTContentInvalidExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidFunctionBody(Token token) {
-    DirectParserASTContentInvalidFunctionBodyHandle data =
-        new DirectParserASTContentInvalidFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTypeReference(Token token) {
-    DirectParserASTContentInvalidTypeReferenceHandle data =
-        new DirectParserASTContentInvalidTypeReferenceHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLabel(Token token) {
-    DirectParserASTContentLabelHandle data =
-        new DirectParserASTContentLabelHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginLabeledStatement(Token token, int labelCount) {
-    DirectParserASTContentLabeledStatementBegin data =
-        new DirectParserASTContentLabeledStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            labelCount: labelCount);
-    seen(data);
-  }
-
-  @override
-  void endLabeledStatement(int labelCount) {
-    DirectParserASTContentLabeledStatementEnd data =
-        new DirectParserASTContentLabeledStatementEnd(DirectParserASTType.END,
-            labelCount: labelCount);
-    seen(data);
-  }
-
-  @override
-  void beginLibraryName(Token token) {
-    DirectParserASTContentLibraryNameBegin data =
-        new DirectParserASTContentLibraryNameBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLibraryName(Token libraryKeyword, Token semicolon) {
-    DirectParserASTContentLibraryNameEnd data =
-        new DirectParserASTContentLibraryNameEnd(DirectParserASTType.END,
-            libraryKeyword: libraryKeyword, semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralMapEntry(Token colon, Token endToken) {
-    DirectParserASTContentLiteralMapEntryHandle data =
-        new DirectParserASTContentLiteralMapEntryHandle(
-            DirectParserASTType.HANDLE,
-            colon: colon,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLiteralString(Token token) {
-    DirectParserASTContentLiteralStringBegin data =
-        new DirectParserASTContentLiteralStringBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
-    DirectParserASTContentInterpolationExpressionHandle data =
-        new DirectParserASTContentInterpolationExpressionHandle(
-            DirectParserASTType.HANDLE,
-            leftBracket: leftBracket,
-            rightBracket: rightBracket);
-    seen(data);
-  }
-
-  @override
-  void endLiteralString(int interpolationCount, Token endToken) {
-    DirectParserASTContentLiteralStringEnd data =
-        new DirectParserASTContentLiteralStringEnd(DirectParserASTType.END,
-            interpolationCount: interpolationCount, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleStringJuxtaposition(Token startToken, int literalCount) {
-    DirectParserASTContentStringJuxtapositionHandle data =
-        new DirectParserASTContentStringJuxtapositionHandle(
-            DirectParserASTType.HANDLE,
-            startToken: startToken,
-            literalCount: literalCount);
-    seen(data);
-  }
-
-  @override
-  void beginMember() {
-    DirectParserASTContentMemberBegin data =
-        new DirectParserASTContentMemberBegin(DirectParserASTType.BEGIN);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidMember(Token endToken) {
-    DirectParserASTContentInvalidMemberHandle data =
-        new DirectParserASTContentInvalidMemberHandle(
-            DirectParserASTType.HANDLE,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMember() {
-    DirectParserASTContentMemberEnd data =
-        new DirectParserASTContentMemberEnd(DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void beginMethod(
-      DeclarationKind declarationKind,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? varFinalOrConst,
-      Token? getOrSet,
-      Token name) {
-    DirectParserASTContentMethodBegin data =
-        new DirectParserASTContentMethodBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            varFinalOrConst: varFinalOrConst,
-            getOrSet: getOrSet,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentClassMethodEnd data =
-        new DirectParserASTContentClassMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentMixinMethodEnd data =
-        new DirectParserASTContentMixinMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentExtensionMethodEnd data =
-        new DirectParserASTContentExtensionMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentClassConstructorEnd data =
-        new DirectParserASTContentClassConstructorEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentMixinConstructorEnd data =
-        new DirectParserASTContentMixinConstructorEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionConstructor(Token? getOrSet, Token beginToken,
-      Token beginParam, Token? beginInitializers, Token endToken) {
-    DirectParserASTContentExtensionConstructorEnd data =
-        new DirectParserASTContentExtensionConstructorEnd(
-            DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginMetadataStar(Token token) {
-    DirectParserASTContentMetadataStarBegin data =
-        new DirectParserASTContentMetadataStarBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endMetadataStar(int count) {
-    DirectParserASTContentMetadataStarEnd data =
-        new DirectParserASTContentMetadataStarEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginMetadata(Token token) {
-    DirectParserASTContentMetadataBegin data =
-        new DirectParserASTContentMetadataBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
-    DirectParserASTContentMetadataEnd data =
-        new DirectParserASTContentMetadataEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            periodBeforeName: periodBeforeName,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginOptionalFormalParameters(Token token) {
-    DirectParserASTContentOptionalFormalParametersBegin data =
-        new DirectParserASTContentOptionalFormalParametersBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endOptionalFormalParameters(
-      int count, Token beginToken, Token endToken) {
-    DirectParserASTContentOptionalFormalParametersEnd data =
-        new DirectParserASTContentOptionalFormalParametersEnd(
-            DirectParserASTType.END,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginPart(Token token) {
-    DirectParserASTContentPartBegin data = new DirectParserASTContentPartBegin(
-        DirectParserASTType.BEGIN,
-        token: token);
-    seen(data);
-  }
-
-  @override
-  void endPart(Token partKeyword, Token semicolon) {
-    DirectParserASTContentPartEnd data = new DirectParserASTContentPartEnd(
-        DirectParserASTType.END,
-        partKeyword: partKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void beginPartOf(Token token) {
-    DirectParserASTContentPartOfBegin data =
-        new DirectParserASTContentPartOfBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endPartOf(
-      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
-    DirectParserASTContentPartOfEnd data = new DirectParserASTContentPartOfEnd(
-        DirectParserASTType.END,
-        partKeyword: partKeyword,
-        ofKeyword: ofKeyword,
-        semicolon: semicolon,
-        hasName: hasName);
-    seen(data);
-  }
-
-  @override
-  void beginRedirectingFactoryBody(Token token) {
-    DirectParserASTContentRedirectingFactoryBodyBegin data =
-        new DirectParserASTContentRedirectingFactoryBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endRedirectingFactoryBody(Token beginToken, Token endToken) {
-    DirectParserASTContentRedirectingFactoryBodyEnd data =
-        new DirectParserASTContentRedirectingFactoryBodyEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginReturnStatement(Token token) {
-    DirectParserASTContentReturnStatementBegin data =
-        new DirectParserASTContentReturnStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodyHandle data =
-        new DirectParserASTContentNativeFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodyIgnoredHandle data =
-        new DirectParserASTContentNativeFunctionBodyIgnoredHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodySkippedHandle data =
-        new DirectParserASTContentNativeFunctionBodySkippedHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleEmptyFunctionBody(Token semicolon) {
-    DirectParserASTContentEmptyFunctionBodyHandle data =
-        new DirectParserASTContentEmptyFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleExpressionFunctionBody(Token arrowToken, Token? endToken) {
-    DirectParserASTContentExpressionFunctionBodyHandle data =
-        new DirectParserASTContentExpressionFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            arrowToken: arrowToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endReturnStatement(
-      bool hasExpression, Token beginToken, Token endToken) {
-    DirectParserASTContentReturnStatementEnd data =
-        new DirectParserASTContentReturnStatementEnd(DirectParserASTType.END,
-            hasExpression: hasExpression,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleSend(Token beginToken, Token endToken) {
-    DirectParserASTContentSendHandle data =
-        new DirectParserASTContentSendHandle(DirectParserASTType.HANDLE,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginShow(Token showKeyword) {
-    DirectParserASTContentShowBegin data = new DirectParserASTContentShowBegin(
-        DirectParserASTType.BEGIN,
-        showKeyword: showKeyword);
-    seen(data);
-  }
-
-  @override
-  void endShow(Token showKeyword) {
-    DirectParserASTContentShowEnd data = new DirectParserASTContentShowEnd(
-        DirectParserASTType.END,
-        showKeyword: showKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchStatement(Token token) {
-    DirectParserASTContentSwitchStatementBegin data =
-        new DirectParserASTContentSwitchStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endSwitchStatement(Token switchKeyword, Token endToken) {
-    DirectParserASTContentSwitchStatementEnd data =
-        new DirectParserASTContentSwitchStatementEnd(DirectParserASTType.END,
-            switchKeyword: switchKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchBlock(Token token) {
-    DirectParserASTContentSwitchBlockBegin data =
-        new DirectParserASTContentSwitchBlockBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
-    DirectParserASTContentSwitchBlockEnd data =
-        new DirectParserASTContentSwitchBlockEnd(DirectParserASTType.END,
-            caseCount: caseCount, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLiteralSymbol(Token token) {
-    DirectParserASTContentLiteralSymbolBegin data =
-        new DirectParserASTContentLiteralSymbolBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLiteralSymbol(Token hashToken, int identifierCount) {
-    DirectParserASTContentLiteralSymbolEnd data =
-        new DirectParserASTContentLiteralSymbolEnd(DirectParserASTType.END,
-            hashToken: hashToken, identifierCount: identifierCount);
-    seen(data);
-  }
-
-  @override
-  void handleThrowExpression(Token throwToken, Token endToken) {
-    DirectParserASTContentThrowExpressionHandle data =
-        new DirectParserASTContentThrowExpressionHandle(
-            DirectParserASTType.HANDLE,
-            throwToken: throwToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginRethrowStatement(Token token) {
-    DirectParserASTContentRethrowStatementBegin data =
-        new DirectParserASTContentRethrowStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endRethrowStatement(Token rethrowToken, Token endToken) {
-    DirectParserASTContentRethrowStatementEnd data =
-        new DirectParserASTContentRethrowStatementEnd(DirectParserASTType.END,
-            rethrowToken: rethrowToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelDeclaration(Token nextToken) {
-    DirectParserASTContentTopLevelDeclarationEnd data =
-        new DirectParserASTContentTopLevelDeclarationEnd(
-            DirectParserASTType.END,
-            nextToken: nextToken);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTopLevelDeclaration(Token endToken) {
-    DirectParserASTContentInvalidTopLevelDeclarationHandle data =
-        new DirectParserASTContentInvalidTopLevelDeclarationHandle(
-            DirectParserASTType.HANDLE,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTopLevelMember(Token token) {
-    DirectParserASTContentTopLevelMemberBegin data =
-        new DirectParserASTContentTopLevelMemberBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFields(
-      DeclarationKind declarationKind,
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      Token lastConsumed) {
-    DirectParserASTContentFieldsBegin data =
-        new DirectParserASTContentFieldsBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            lastConsumed: lastConsumed);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelFields(
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentTopLevelFieldsEnd data =
-        new DirectParserASTContentTopLevelFieldsEnd(DirectParserASTType.END,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
-    DirectParserASTContentTopLevelMethodBegin data =
-        new DirectParserASTContentTopLevelMethodBegin(DirectParserASTType.BEGIN,
-            lastConsumed: lastConsumed, externalToken: externalToken);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
-    DirectParserASTContentTopLevelMethodEnd data =
-        new DirectParserASTContentTopLevelMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken, getOrSet: getOrSet, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTryStatement(Token token) {
-    DirectParserASTContentTryStatementBegin data =
-        new DirectParserASTContentTryStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCaseMatch(Token caseKeyword, Token colon) {
-    DirectParserASTContentCaseMatchHandle data =
-        new DirectParserASTContentCaseMatchHandle(DirectParserASTType.HANDLE,
-            caseKeyword: caseKeyword, colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginCatchClause(Token token) {
-    DirectParserASTContentCatchClauseBegin data =
-        new DirectParserASTContentCatchClauseBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCatchClause(Token token) {
-    DirectParserASTContentCatchClauseEnd data =
-        new DirectParserASTContentCatchClauseEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
-    DirectParserASTContentCatchBlockHandle data =
-        new DirectParserASTContentCatchBlockHandle(DirectParserASTType.HANDLE,
-            onKeyword: onKeyword, catchKeyword: catchKeyword, comma: comma);
-    seen(data);
-  }
-
-  @override
-  void handleFinallyBlock(Token finallyKeyword) {
-    DirectParserASTContentFinallyBlockHandle data =
-        new DirectParserASTContentFinallyBlockHandle(DirectParserASTType.HANDLE,
-            finallyKeyword: finallyKeyword);
-    seen(data);
-  }
-
-  @override
-  void endTryStatement(
-      int catchCount, Token tryKeyword, Token? finallyKeyword) {
-    DirectParserASTContentTryStatementEnd data =
-        new DirectParserASTContentTryStatementEnd(DirectParserASTType.END,
-            catchCount: catchCount,
-            tryKeyword: tryKeyword,
-            finallyKeyword: finallyKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleType(Token beginToken, Token? questionMark) {
-    DirectParserASTContentTypeHandle data =
-        new DirectParserASTContentTypeHandle(DirectParserASTType.HANDLE,
-            beginToken: beginToken, questionMark: questionMark);
-    seen(data);
-  }
-
-  @override
-  void handleNonNullAssertExpression(Token bang) {
-    DirectParserASTContentNonNullAssertExpressionHandle data =
-        new DirectParserASTContentNonNullAssertExpressionHandle(
-            DirectParserASTType.HANDLE,
-            bang: bang);
-    seen(data);
-  }
-
-  @override
-  void handleNoName(Token token) {
-    DirectParserASTContentNoNameHandle data =
-        new DirectParserASTContentNoNameHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionType(Token beginToken) {
-    DirectParserASTContentFunctionTypeBegin data =
-        new DirectParserASTContentFunctionTypeBegin(DirectParserASTType.BEGIN,
-            beginToken: beginToken);
-    seen(data);
-  }
-
-  @override
-  void endFunctionType(Token functionToken, Token? questionMark) {
-    DirectParserASTContentFunctionTypeEnd data =
-        new DirectParserASTContentFunctionTypeEnd(DirectParserASTType.END,
-            functionToken: functionToken, questionMark: questionMark);
-    seen(data);
-  }
-
-  @override
-  void beginTypeArguments(Token token) {
-    DirectParserASTContentTypeArgumentsBegin data =
-        new DirectParserASTContentTypeArgumentsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeArguments(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentTypeArgumentsEnd data =
-        new DirectParserASTContentTypeArgumentsEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTypeArguments(Token token) {
-    DirectParserASTContentInvalidTypeArgumentsHandle data =
-        new DirectParserASTContentInvalidTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoTypeArguments(Token token) {
-    DirectParserASTContentNoTypeArgumentsHandle data =
-        new DirectParserASTContentNoTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginTypeVariable(Token token) {
-    DirectParserASTContentTypeVariableBegin data =
-        new DirectParserASTContentTypeVariableBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleTypeVariablesDefined(Token token, int count) {
-    DirectParserASTContentTypeVariablesDefinedHandle data =
-        new DirectParserASTContentTypeVariablesDefinedHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void endTypeVariable(
-      Token token, int index, Token? extendsOrSuper, Token? variance) {
-    DirectParserASTContentTypeVariableEnd data =
-        new DirectParserASTContentTypeVariableEnd(DirectParserASTType.END,
-            token: token,
-            index: index,
-            extendsOrSuper: extendsOrSuper,
-            variance: variance);
-    seen(data);
-  }
-
-  @override
-  void beginTypeVariables(Token token) {
-    DirectParserASTContentTypeVariablesBegin data =
-        new DirectParserASTContentTypeVariablesBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeVariables(Token beginToken, Token endToken) {
-    DirectParserASTContentTypeVariablesEnd data =
-        new DirectParserASTContentTypeVariablesEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionExpression(Token token) {
-    DirectParserASTContentFunctionExpressionBegin data =
-        new DirectParserASTContentFunctionExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionExpression(Token beginToken, Token token) {
-    DirectParserASTContentFunctionExpressionEnd data =
-        new DirectParserASTContentFunctionExpressionEnd(DirectParserASTType.END,
-            beginToken: beginToken, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginVariablesDeclaration(
-      Token token, Token? lateToken, Token? varFinalOrConst) {
-    DirectParserASTContentVariablesDeclarationBegin data =
-        new DirectParserASTContentVariablesDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst);
-    seen(data);
-  }
-
-  @override
-  void endVariablesDeclaration(int count, Token? endToken) {
-    DirectParserASTContentVariablesDeclarationEnd data =
-        new DirectParserASTContentVariablesDeclarationEnd(
-            DirectParserASTType.END,
-            count: count,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginWhileStatement(Token token) {
-    DirectParserASTContentWhileStatementBegin data =
-        new DirectParserASTContentWhileStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endWhileStatement(Token whileKeyword, Token endToken) {
-    DirectParserASTContentWhileStatementEnd data =
-        new DirectParserASTContentWhileStatementEnd(DirectParserASTType.END,
-            whileKeyword: whileKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginAsOperatorType(Token operator) {
-    DirectParserASTContentAsOperatorTypeBegin data =
-        new DirectParserASTContentAsOperatorTypeBegin(DirectParserASTType.BEGIN,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void endAsOperatorType(Token operator) {
-    DirectParserASTContentAsOperatorTypeEnd data =
-        new DirectParserASTContentAsOperatorTypeEnd(DirectParserASTType.END,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleAsOperator(Token operator) {
-    DirectParserASTContentAsOperatorHandle data =
-        new DirectParserASTContentAsOperatorHandle(DirectParserASTType.HANDLE,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleAssignmentExpression(Token token) {
-    DirectParserASTContentAssignmentExpressionHandle data =
-        new DirectParserASTContentAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginBinaryExpression(Token token) {
-    DirectParserASTContentBinaryExpressionBegin data =
-        new DirectParserASTContentBinaryExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endBinaryExpression(Token token) {
-    DirectParserASTContentBinaryExpressionEnd data =
-        new DirectParserASTContentBinaryExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleEndingBinaryExpression(Token token) {
-    DirectParserASTContentEndingBinaryExpressionHandle data =
-        new DirectParserASTContentEndingBinaryExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalExpression(Token question) {
-    DirectParserASTContentConditionalExpressionBegin data =
-        new DirectParserASTContentConditionalExpressionBegin(
-            DirectParserASTType.BEGIN,
-            question: question);
-    seen(data);
-  }
-
-  @override
-  void handleConditionalExpressionColon() {
-    DirectParserASTContentConditionalExpressionColonHandle data =
-        new DirectParserASTContentConditionalExpressionColonHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endConditionalExpression(Token question, Token colon) {
-    DirectParserASTContentConditionalExpressionEnd data =
-        new DirectParserASTContentConditionalExpressionEnd(
-            DirectParserASTType.END,
-            question: question,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginConstExpression(Token constKeyword) {
-    DirectParserASTContentConstExpressionBegin data =
-        new DirectParserASTContentConstExpressionBegin(
-            DirectParserASTType.BEGIN,
-            constKeyword: constKeyword);
-    seen(data);
-  }
-
-  @override
-  void endConstExpression(Token token) {
-    DirectParserASTContentConstExpressionEnd data =
-        new DirectParserASTContentConstExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleConstFactory(Token constKeyword) {
-    DirectParserASTContentConstFactoryHandle data =
-        new DirectParserASTContentConstFactoryHandle(DirectParserASTType.HANDLE,
-            constKeyword: constKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginForControlFlow(Token? awaitToken, Token forToken) {
-    DirectParserASTContentForControlFlowBegin data =
-        new DirectParserASTContentForControlFlowBegin(DirectParserASTType.BEGIN,
-            awaitToken: awaitToken, forToken: forToken);
-    seen(data);
-  }
-
-  @override
-  void endForControlFlow(Token token) {
-    DirectParserASTContentForControlFlowEnd data =
-        new DirectParserASTContentForControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInControlFlow(Token token) {
-    DirectParserASTContentForInControlFlowEnd data =
-        new DirectParserASTContentForInControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginIfControlFlow(Token ifToken) {
-    DirectParserASTContentIfControlFlowBegin data =
-        new DirectParserASTContentIfControlFlowBegin(DirectParserASTType.BEGIN,
-            ifToken: ifToken);
-    seen(data);
-  }
-
-  @override
-  void handleThenControlFlow(Token token) {
-    DirectParserASTContentThenControlFlowHandle data =
-        new DirectParserASTContentThenControlFlowHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleElseControlFlow(Token elseToken) {
-    DirectParserASTContentElseControlFlowHandle data =
-        new DirectParserASTContentElseControlFlowHandle(
-            DirectParserASTType.HANDLE,
-            elseToken: elseToken);
-    seen(data);
-  }
-
-  @override
-  void endIfControlFlow(Token token) {
-    DirectParserASTContentIfControlFlowEnd data =
-        new DirectParserASTContentIfControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endIfElseControlFlow(Token token) {
-    DirectParserASTContentIfElseControlFlowEnd data =
-        new DirectParserASTContentIfElseControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSpreadExpression(Token spreadToken) {
-    DirectParserASTContentSpreadExpressionHandle data =
-        new DirectParserASTContentSpreadExpressionHandle(
-            DirectParserASTType.HANDLE,
-            spreadToken: spreadToken);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionTypedFormalParameter(Token token) {
-    DirectParserASTContentFunctionTypedFormalParameterBegin data =
-        new DirectParserASTContentFunctionTypedFormalParameterBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
-    DirectParserASTContentFunctionTypedFormalParameterEnd data =
-        new DirectParserASTContentFunctionTypedFormalParameterEnd(
-            DirectParserASTType.END,
-            nameToken: nameToken,
-            question: question);
-    seen(data);
-  }
-
-  @override
-  void handleIdentifier(Token token, IdentifierContext context) {
-    DirectParserASTContentIdentifierHandle data =
-        new DirectParserASTContentIdentifierHandle(DirectParserASTType.HANDLE,
-            token: token, context: context);
-    seen(data);
-  }
-
-  @override
-  void handleShowHideIdentifier(Token? modifier, Token identifier) {
-    DirectParserASTContentShowHideIdentifierHandle data =
-        new DirectParserASTContentShowHideIdentifierHandle(
-            DirectParserASTType.HANDLE,
-            modifier: modifier,
-            identifier: identifier);
-    seen(data);
-  }
-
-  @override
-  void handleIndexedExpression(
-      Token? question, Token openSquareBracket, Token closeSquareBracket) {
-    DirectParserASTContentIndexedExpressionHandle data =
-        new DirectParserASTContentIndexedExpressionHandle(
-            DirectParserASTType.HANDLE,
-            question: question,
-            openSquareBracket: openSquareBracket,
-            closeSquareBracket: closeSquareBracket);
-    seen(data);
-  }
-
-  @override
-  void beginIsOperatorType(Token operator) {
-    DirectParserASTContentIsOperatorTypeBegin data =
-        new DirectParserASTContentIsOperatorTypeBegin(DirectParserASTType.BEGIN,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void endIsOperatorType(Token operator) {
-    DirectParserASTContentIsOperatorTypeEnd data =
-        new DirectParserASTContentIsOperatorTypeEnd(DirectParserASTType.END,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleIsOperator(Token isOperator, Token? not) {
-    DirectParserASTContentIsOperatorHandle data =
-        new DirectParserASTContentIsOperatorHandle(DirectParserASTType.HANDLE,
-            isOperator: isOperator, not: not);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralBool(Token token) {
-    DirectParserASTContentLiteralBoolHandle data =
-        new DirectParserASTContentLiteralBoolHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleBreakStatement(
-      bool hasTarget, Token breakKeyword, Token endToken) {
-    DirectParserASTContentBreakStatementHandle data =
-        new DirectParserASTContentBreakStatementHandle(
-            DirectParserASTType.HANDLE,
-            hasTarget: hasTarget,
-            breakKeyword: breakKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleContinueStatement(
-      bool hasTarget, Token continueKeyword, Token endToken) {
-    DirectParserASTContentContinueStatementHandle data =
-        new DirectParserASTContentContinueStatementHandle(
-            DirectParserASTType.HANDLE,
-            hasTarget: hasTarget,
-            continueKeyword: continueKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleEmptyStatement(Token token) {
-    DirectParserASTContentEmptyStatementHandle data =
-        new DirectParserASTContentEmptyStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginAssert(Token assertKeyword, Assert kind) {
-    DirectParserASTContentAssertBegin data =
-        new DirectParserASTContentAssertBegin(DirectParserASTType.BEGIN,
-            assertKeyword: assertKeyword, kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
-      Token? commaToken, Token semicolonToken) {
-    DirectParserASTContentAssertEnd data = new DirectParserASTContentAssertEnd(
-        DirectParserASTType.END,
-        assertKeyword: assertKeyword,
-        kind: kind,
-        leftParenthesis: leftParenthesis,
-        commaToken: commaToken,
-        semicolonToken: semicolonToken);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralDouble(Token token) {
-    DirectParserASTContentLiteralDoubleHandle data =
-        new DirectParserASTContentLiteralDoubleHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralInt(Token token) {
-    DirectParserASTContentLiteralIntHandle data =
-        new DirectParserASTContentLiteralIntHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralList(
-      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
-    DirectParserASTContentLiteralListHandle data =
-        new DirectParserASTContentLiteralListHandle(DirectParserASTType.HANDLE,
-            count: count,
-            leftBracket: leftBracket,
-            constKeyword: constKeyword,
-            rightBracket: rightBracket);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralSetOrMap(
-    int count,
-    Token leftBrace,
-    Token? constKeyword,
-    Token rightBrace,
-    bool hasSetEntry,
-  ) {
-    DirectParserASTContentLiteralSetOrMapHandle data =
-        new DirectParserASTContentLiteralSetOrMapHandle(
-            DirectParserASTType.HANDLE,
-            count: count,
-            leftBrace: leftBrace,
-            constKeyword: constKeyword,
-            rightBrace: rightBrace,
-            hasSetEntry: hasSetEntry);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralNull(Token token) {
-    DirectParserASTContentLiteralNullHandle data =
-        new DirectParserASTContentLiteralNullHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNativeClause(Token nativeToken, bool hasName) {
-    DirectParserASTContentNativeClauseHandle data =
-        new DirectParserASTContentNativeClauseHandle(DirectParserASTType.HANDLE,
-            nativeToken: nativeToken, hasName: hasName);
-    seen(data);
-  }
-
-  @override
-  void handleNamedArgument(Token colon) {
-    DirectParserASTContentNamedArgumentHandle data =
-        new DirectParserASTContentNamedArgumentHandle(
-            DirectParserASTType.HANDLE,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginNewExpression(Token token) {
-    DirectParserASTContentNewExpressionBegin data =
-        new DirectParserASTContentNewExpressionBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endNewExpression(Token token) {
-    DirectParserASTContentNewExpressionEnd data =
-        new DirectParserASTContentNewExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoArguments(Token token) {
-    DirectParserASTContentNoArgumentsHandle data =
-        new DirectParserASTContentNoArgumentsHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
-    DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle
-        data =
-        new DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoType(Token lastConsumed) {
-    DirectParserASTContentNoTypeHandle data =
-        new DirectParserASTContentNoTypeHandle(DirectParserASTType.HANDLE,
-            lastConsumed: lastConsumed);
-    seen(data);
-  }
-
-  @override
-  void handleNoTypeVariables(Token token) {
-    DirectParserASTContentNoTypeVariablesHandle data =
-        new DirectParserASTContentNoTypeVariablesHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleOperator(Token token) {
-    DirectParserASTContentOperatorHandle data =
-        new DirectParserASTContentOperatorHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSymbolVoid(Token token) {
-    DirectParserASTContentSymbolVoidHandle data =
-        new DirectParserASTContentSymbolVoidHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleOperatorName(Token operatorKeyword, Token token) {
-    DirectParserASTContentOperatorNameHandle data =
-        new DirectParserASTContentOperatorNameHandle(DirectParserASTType.HANDLE,
-            operatorKeyword: operatorKeyword, token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
-    DirectParserASTContentInvalidOperatorNameHandle data =
-        new DirectParserASTContentInvalidOperatorNameHandle(
-            DirectParserASTType.HANDLE,
-            operatorKeyword: operatorKeyword,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleParenthesizedCondition(Token token) {
-    DirectParserASTContentParenthesizedConditionHandle data =
-        new DirectParserASTContentParenthesizedConditionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleParenthesizedExpression(Token token) {
-    DirectParserASTContentParenthesizedExpressionHandle data =
-        new DirectParserASTContentParenthesizedExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleQualified(Token period) {
-    DirectParserASTContentQualifiedHandle data =
-        new DirectParserASTContentQualifiedHandle(DirectParserASTType.HANDLE,
-            period: period);
-    seen(data);
-  }
-
-  @override
-  void handleStringPart(Token token) {
-    DirectParserASTContentStringPartHandle data =
-        new DirectParserASTContentStringPartHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSuperExpression(Token token, IdentifierContext context) {
-    DirectParserASTContentSuperExpressionHandle data =
-        new DirectParserASTContentSuperExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            context: context);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
-    DirectParserASTContentSwitchCaseBegin data =
-        new DirectParserASTContentSwitchCaseBegin(DirectParserASTType.BEGIN,
-            labelCount: labelCount,
-            expressionCount: expressionCount,
-            firstToken: firstToken);
-    seen(data);
-  }
-
-  @override
-  void endSwitchCase(
-      int labelCount,
-      int expressionCount,
-      Token? defaultKeyword,
-      Token? colonAfterDefault,
-      int statementCount,
-      Token firstToken,
-      Token endToken) {
-    DirectParserASTContentSwitchCaseEnd data =
-        new DirectParserASTContentSwitchCaseEnd(DirectParserASTType.END,
-            labelCount: labelCount,
-            expressionCount: expressionCount,
-            defaultKeyword: defaultKeyword,
-            colonAfterDefault: colonAfterDefault,
-            statementCount: statementCount,
-            firstToken: firstToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleThisExpression(Token token, IdentifierContext context) {
-    DirectParserASTContentThisExpressionHandle data =
-        new DirectParserASTContentThisExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            context: context);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPostfixAssignmentExpression(Token token) {
-    DirectParserASTContentUnaryPostfixAssignmentExpressionHandle data =
-        new DirectParserASTContentUnaryPostfixAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPrefixExpression(Token token) {
-    DirectParserASTContentUnaryPrefixExpressionHandle data =
-        new DirectParserASTContentUnaryPrefixExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPrefixAssignmentExpression(Token token) {
-    DirectParserASTContentUnaryPrefixAssignmentExpressionHandle data =
-        new DirectParserASTContentUnaryPrefixAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameterDefaultValueExpression() {
-    DirectParserASTContentFormalParameterDefaultValueExpressionBegin data =
-        new DirectParserASTContentFormalParameterDefaultValueExpressionBegin(
-            DirectParserASTType.BEGIN);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameterDefaultValueExpression() {
-    DirectParserASTContentFormalParameterDefaultValueExpressionEnd data =
-        new DirectParserASTContentFormalParameterDefaultValueExpressionEnd(
-            DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void handleValuedFormalParameter(Token equals, Token token) {
-    DirectParserASTContentValuedFormalParameterHandle data =
-        new DirectParserASTContentValuedFormalParameterHandle(
-            DirectParserASTType.HANDLE,
-            equals: equals,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleFormalParameterWithoutValue(Token token) {
-    DirectParserASTContentFormalParameterWithoutValueHandle data =
-        new DirectParserASTContentFormalParameterWithoutValueHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleVoidKeyword(Token token) {
-    DirectParserASTContentVoidKeywordHandle data =
-        new DirectParserASTContentVoidKeywordHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleVoidKeywordWithTypeArguments(Token token) {
-    DirectParserASTContentVoidKeywordWithTypeArgumentsHandle data =
-        new DirectParserASTContentVoidKeywordWithTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginYieldStatement(Token token) {
-    DirectParserASTContentYieldStatementBegin data =
-        new DirectParserASTContentYieldStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
-    DirectParserASTContentYieldStatementEnd data =
-        new DirectParserASTContentYieldStatementEnd(DirectParserASTType.END,
-            yieldToken: yieldToken, starToken: starToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endInvalidYieldStatement(Token beginToken, Token? starToken,
-      Token endToken, MessageCode errorCode) {
-    DirectParserASTContentInvalidYieldStatementEnd data =
-        new DirectParserASTContentInvalidYieldStatementEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            starToken: starToken,
-            endToken: endToken,
-            errorCode: errorCode);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverableError(
-      Message message, Token startToken, Token endToken) {
-    DirectParserASTContentRecoverableErrorHandle data =
-        new DirectParserASTContentRecoverableErrorHandle(
-            DirectParserASTType.HANDLE,
-            message: message,
-            startToken: startToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleErrorToken(ErrorToken token) {
-    DirectParserASTContentErrorTokenHandle data =
-        new DirectParserASTContentErrorTokenHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnescapeError(
-      Message message, Token location, int stringOffset, int length) {
-    DirectParserASTContentUnescapeErrorHandle data =
-        new DirectParserASTContentUnescapeErrorHandle(
-            DirectParserASTType.HANDLE,
-            message: message,
-            location: location,
-            stringOffset: stringOffset,
-            length: length);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidStatement(Token token, Message message) {
-    DirectParserASTContentInvalidStatementHandle data =
-        new DirectParserASTContentInvalidStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            message: message);
-    seen(data);
-  }
-
-  @override
-  void handleScript(Token token) {
-    DirectParserASTContentScriptHandle data =
-        new DirectParserASTContentScriptHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
-    DirectParserASTContentCommentReferenceTextHandle data =
-        new DirectParserASTContentCommentReferenceTextHandle(
-            DirectParserASTType.HANDLE,
-            referenceSource: referenceSource,
-            referenceOffset: referenceOffset);
-    seen(data);
-  }
-
-  @override
-  void handleCommentReference(
-      Token? newKeyword, Token? prefix, Token? period, Token token) {
-    DirectParserASTContentCommentReferenceHandle data =
-        new DirectParserASTContentCommentReferenceHandle(
-            DirectParserASTType.HANDLE,
-            newKeyword: newKeyword,
-            prefix: prefix,
-            period: period,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoCommentReference() {
-    DirectParserASTContentNoCommentReferenceHandle data =
-        new DirectParserASTContentNoCommentReferenceHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void handleTypeArgumentApplication(Token openAngleBracket) {
-    DirectParserASTContentTypeArgumentApplicationHandle data =
-        new DirectParserASTContentTypeArgumentApplicationHandle(
-            DirectParserASTType.HANDLE,
-            openAngleBracket: openAngleBracket);
-    seen(data);
-  }
-
-  @override
-  void handleNewAsIdentifier(Token token) {
-    DirectParserASTContentNewAsIdentifierHandle data =
-        new DirectParserASTContentNewAsIdentifierHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-}
-
-class DirectParserASTContentArgumentsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentArgumentsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Arguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentArgumentsEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentArgumentsEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("Arguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentAsyncModifierHandle extends DirectParserASTContent {
-  final Token? asyncToken;
-  final Token? starToken;
-
-  DirectParserASTContentAsyncModifierHandle(DirectParserASTType type,
-      {this.asyncToken, this.starToken})
-      : super("AsyncModifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "asyncToken": asyncToken,
-        "starToken": starToken,
-      };
-}
-
-class DirectParserASTContentAwaitExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentAwaitExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("AwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentAwaitExpressionEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentAwaitExpressionEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("AwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidAwaitExpressionEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-  final MessageCode errorCode;
-
-  DirectParserASTContentInvalidAwaitExpressionEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.endToken,
-      required this.errorCode})
-      : super("InvalidAwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "errorCode": errorCode,
-      };
-}
-
-class DirectParserASTContentBlockBegin extends DirectParserASTContent {
-  final Token token;
-  final BlockKind blockKind;
-
-  DirectParserASTContentBlockBegin(DirectParserASTType type,
-      {required this.token, required this.blockKind})
-      : super("Block", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "blockKind": blockKind,
-      };
-}
-
-class DirectParserASTContentBlockEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-  final BlockKind blockKind;
-
-  DirectParserASTContentBlockEnd(DirectParserASTType type,
-      {required this.count,
-      required this.beginToken,
-      required this.endToken,
-      required this.blockKind})
-      : super("Block", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "blockKind": blockKind,
-      };
-}
-
-class DirectParserASTContentInvalidTopLevelBlockHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTopLevelBlockHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTopLevelBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCascadeBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCascadeBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Cascade", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCascadeEnd extends DirectParserASTContent {
-  DirectParserASTContentCascadeEnd(DirectParserASTType type)
-      : super("Cascade", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentCaseExpressionBegin extends DirectParserASTContent {
-  final Token caseKeyword;
-
-  DirectParserASTContentCaseExpressionBegin(DirectParserASTType type,
-      {required this.caseKeyword})
-      : super("CaseExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseKeyword": caseKeyword,
-      };
-}
-
-class DirectParserASTContentCaseExpressionEnd extends DirectParserASTContent {
-  final Token colon;
-
-  DirectParserASTContentCaseExpressionEnd(DirectParserASTType type,
-      {required this.colon})
-      : super("CaseExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrExtensionBodyBegin
-    extends DirectParserASTContent {
-  final DeclarationKind kind;
-  final Token token;
-
-  DirectParserASTContentClassOrMixinOrExtensionBodyBegin(
-      DirectParserASTType type,
-      {required this.kind,
-      required this.token})
-      : super("ClassOrMixinOrExtensionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "kind": kind,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-    extends DirectParserASTContent {
-  final DeclarationKind kind;
-  final int memberCount;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd(DirectParserASTType type,
-      {required this.kind,
-      required this.memberCount,
-      required this.beginToken,
-      required this.endToken})
-      : super("ClassOrMixinOrExtensionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "kind": kind,
-        "memberCount": memberCount,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ClassOrMixinOrNamedMixinApplicationPrelude", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentClassDeclarationBegin
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token? abstractToken;
-  final Token name;
-
-  DirectParserASTContentClassDeclarationBegin(DirectParserASTType type,
-      {required this.begin, this.abstractToken, required this.name})
-      : super("ClassDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "abstractToken": abstractToken,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentClassExtendsHandle extends DirectParserASTContent {
-  final Token? extendsKeyword;
-  final int typeCount;
-
-  DirectParserASTContentClassExtendsHandle(DirectParserASTType type,
-      {this.extendsKeyword, required this.typeCount})
-      : super("ClassExtends", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extendsKeyword": extendsKeyword,
-        "typeCount": typeCount,
-      };
-}
-
-class DirectParserASTContentClassOrMixinImplementsHandle
-    extends DirectParserASTContent {
-  final Token? implementsKeyword;
-  final int interfacesCount;
-
-  DirectParserASTContentClassOrMixinImplementsHandle(DirectParserASTType type,
-      {this.implementsKeyword, required this.interfacesCount})
-      : super("ClassOrMixinImplements", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "implementsKeyword": implementsKeyword,
-        "interfacesCount": interfacesCount,
-      };
-}
-
-class DirectParserASTContentExtensionShowHideHandle
-    extends DirectParserASTContent {
-  final Token? showKeyword;
-  final int showElementCount;
-  final Token? hideKeyword;
-  final int hideElementCount;
-
-  DirectParserASTContentExtensionShowHideHandle(DirectParserASTType type,
-      {this.showKeyword,
-      required this.showElementCount,
-      this.hideKeyword,
-      required this.hideElementCount})
-      : super("ExtensionShowHide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-        "showElementCount": showElementCount,
-        "hideKeyword": hideKeyword,
-        "hideElementCount": hideElementCount,
-      };
-}
-
-class DirectParserASTContentClassHeaderHandle extends DirectParserASTContent {
-  final Token begin;
-  final Token classKeyword;
-  final Token? nativeToken;
-
-  DirectParserASTContentClassHeaderHandle(DirectParserASTType type,
-      {required this.begin, required this.classKeyword, this.nativeToken})
-      : super("ClassHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "classKeyword": classKeyword,
-        "nativeToken": nativeToken,
-      };
-}
-
-class DirectParserASTContentRecoverClassHeaderHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentRecoverClassHeaderHandle(DirectParserASTType type)
-      : super("RecoverClassHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentClassDeclarationEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassDeclarationEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("ClassDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinDeclarationBegin
-    extends DirectParserASTContent {
-  final Token mixinKeyword;
-  final Token name;
-
-  DirectParserASTContentMixinDeclarationBegin(DirectParserASTType type,
-      {required this.mixinKeyword, required this.name})
-      : super("MixinDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentMixinOnHandle extends DirectParserASTContent {
-  final Token? onKeyword;
-  final int typeCount;
-
-  DirectParserASTContentMixinOnHandle(DirectParserASTType type,
-      {this.onKeyword, required this.typeCount})
-      : super("MixinOn", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "onKeyword": onKeyword,
-        "typeCount": typeCount,
-      };
-}
-
-class DirectParserASTContentMixinHeaderHandle extends DirectParserASTContent {
-  final Token mixinKeyword;
-
-  DirectParserASTContentMixinHeaderHandle(DirectParserASTType type,
-      {required this.mixinKeyword})
-      : super("MixinHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-      };
-}
-
-class DirectParserASTContentRecoverMixinHeaderHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentRecoverMixinHeaderHandle(DirectParserASTType type)
-      : super("RecoverMixinHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentMixinDeclarationEnd extends DirectParserASTContent {
-  final Token mixinKeyword;
-  final Token endToken;
-
-  DirectParserASTContentMixinDeclarationEnd(DirectParserASTType type,
-      {required this.mixinKeyword, required this.endToken})
-      : super("MixinDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentUncategorizedTopLevelDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUncategorizedTopLevelDeclarationBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UncategorizedTopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationPreludeBegin
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-
-  DirectParserASTContentExtensionDeclarationPreludeBegin(
-      DirectParserASTType type,
-      {required this.extensionKeyword})
-      : super("ExtensionDeclarationPrelude", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationBegin
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-  final Token? name;
-
-  DirectParserASTContentExtensionDeclarationBegin(DirectParserASTType type,
-      {required this.extensionKeyword, this.name})
-      : super("ExtensionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationEnd
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-  final Token? typeKeyword;
-  final Token onKeyword;
-  final Token? showKeyword;
-  final Token? hideKeyword;
-  final Token endToken;
-
-  DirectParserASTContentExtensionDeclarationEnd(DirectParserASTType type,
-      {required this.extensionKeyword,
-      this.typeKeyword,
-      required this.onKeyword,
-      this.showKeyword,
-      this.hideKeyword,
-      required this.endToken})
-      : super("ExtensionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-        "typeKeyword": typeKeyword,
-        "onKeyword": onKeyword,
-        "showKeyword": showKeyword,
-        "hideKeyword": hideKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentCombinatorsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCombinatorsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Combinators", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCombinatorsEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentCombinatorsEnd(DirectParserASTType type,
-      {required this.count})
-      : super("Combinators", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentCompilationUnitBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCompilationUnitBegin(DirectParserASTType type,
-      {required this.token})
-      : super("CompilationUnit", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDirectivesOnlyHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentDirectivesOnlyHandle(DirectParserASTType type)
-      : super("DirectivesOnly", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentCompilationUnitEnd extends DirectParserASTContent {
-  final int count;
-  final Token token;
-
-  DirectParserASTContentCompilationUnitEnd(DirectParserASTType type,
-      {required this.count, required this.token})
-      : super("CompilationUnit", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstLiteralBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstLiteralBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ConstLiteral", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstLiteralEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstLiteralEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ConstLiteral", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstructorReferenceBegin
-    extends DirectParserASTContent {
-  final Token start;
-
-  DirectParserASTContentConstructorReferenceBegin(DirectParserASTType type,
-      {required this.start})
-      : super("ConstructorReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "start": start,
-      };
-}
-
-class DirectParserASTContentConstructorReferenceEnd
-    extends DirectParserASTContent {
-  final Token start;
-  final Token? periodBeforeName;
-  final Token endToken;
-  final ConstructorReferenceContext constructorReferenceContext;
-
-  DirectParserASTContentConstructorReferenceEnd(DirectParserASTType type,
-      {required this.start,
-      this.periodBeforeName,
-      required this.endToken,
-      required this.constructorReferenceContext})
-      : super("ConstructorReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "start": start,
-        "periodBeforeName": periodBeforeName,
-        "endToken": endToken,
-        "constructorReferenceContext": constructorReferenceContext,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementEnd extends DirectParserASTContent {
-  final Token doKeyword;
-  final Token whileKeyword;
-  final Token endToken;
-
-  DirectParserASTContentDoWhileStatementEnd(DirectParserASTType type,
-      {required this.doKeyword,
-      required this.whileKeyword,
-      required this.endToken})
-      : super("DoWhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "doKeyword": doKeyword,
-        "whileKeyword": whileKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBodyEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementBodyEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentEnumBegin extends DirectParserASTContent {
-  final Token enumKeyword;
-
-  DirectParserASTContentEnumBegin(DirectParserASTType type,
-      {required this.enumKeyword})
-      : super("Enum", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "enumKeyword": enumKeyword,
-      };
-}
-
-class DirectParserASTContentEnumEnd extends DirectParserASTContent {
-  final Token enumKeyword;
-  final Token leftBrace;
-  final int count;
-
-  DirectParserASTContentEnumEnd(DirectParserASTType type,
-      {required this.enumKeyword, required this.leftBrace, required this.count})
-      : super("Enum", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "enumKeyword": enumKeyword,
-        "leftBrace": leftBrace,
-        "count": count,
-      };
-}
-
-class DirectParserASTContentExportBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentExportBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Export", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentExportEnd extends DirectParserASTContent {
-  final Token exportKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentExportEnd(DirectParserASTType type,
-      {required this.exportKeyword, required this.semicolon})
-      : super("Export", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "exportKeyword": exportKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentExtraneousExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final Message message;
-
-  DirectParserASTContentExtraneousExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.message})
-      : super("ExtraneousExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "message": message,
-      };
-}
-
-class DirectParserASTContentExpressionStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentExpressionStatementHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ExpressionStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFactoryMethodBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token lastConsumed;
-  final Token? externalToken;
-  final Token? constToken;
-
-  DirectParserASTContentFactoryMethodBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      required this.lastConsumed,
-      this.externalToken,
-      this.constToken})
-      : super("FactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "lastConsumed": lastConsumed,
-        "externalToken": externalToken,
-        "constToken": constToken,
-      };
-}
-
-class DirectParserASTContentClassFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentClassFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("ClassFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentMixinFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("MixinFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentExtensionFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("ExtensionFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentFormalParameterBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-  final Token? requiredToken;
-  final Token? covariantToken;
-  final Token? varFinalOrConst;
-
-  DirectParserASTContentFormalParameterBegin(DirectParserASTType type,
-      {required this.token,
-      required this.kind,
-      this.requiredToken,
-      this.covariantToken,
-      this.varFinalOrConst})
-      : super("FormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-        "requiredToken": requiredToken,
-        "covariantToken": covariantToken,
-        "varFinalOrConst": varFinalOrConst,
-      };
-}
-
-class DirectParserASTContentFormalParameterEnd extends DirectParserASTContent {
-  final Token? thisKeyword;
-  final Token? periodAfterThis;
-  final Token nameToken;
-  final Token? initializerStart;
-  final Token? initializerEnd;
-  final FormalParameterKind kind;
-  final MemberKind memberKind;
-
-  DirectParserASTContentFormalParameterEnd(DirectParserASTType type,
-      {this.thisKeyword,
-      this.periodAfterThis,
-      required this.nameToken,
-      this.initializerStart,
-      this.initializerEnd,
-      required this.kind,
-      required this.memberKind})
-      : super("FormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "thisKeyword": thisKeyword,
-        "periodAfterThis": periodAfterThis,
-        "nameToken": nameToken,
-        "initializerStart": initializerStart,
-        "initializerEnd": initializerEnd,
-        "kind": kind,
-        "memberKind": memberKind,
-      };
-}
-
-class DirectParserASTContentNoFormalParametersHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-
-  DirectParserASTContentNoFormalParametersHandle(DirectParserASTType type,
-      {required this.token, required this.kind})
-      : super("NoFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentFormalParametersBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-
-  DirectParserASTContentFormalParametersBegin(DirectParserASTType type,
-      {required this.token, required this.kind})
-      : super("FormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentFormalParametersEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-  final MemberKind kind;
-
-  DirectParserASTContentFormalParametersEnd(DirectParserASTType type,
-      {required this.count,
-      required this.beginToken,
-      required this.endToken,
-      required this.kind})
-      : super("FormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentClassFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("ClassFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentMixinFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("MixinFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentExtensionFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("ExtensionFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForInitializerEmptyStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInitializerEmptyStatementHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ForInitializerEmptyStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInitializerExpressionStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool forIn;
-
-  DirectParserASTContentForInitializerExpressionStatementHandle(
-      DirectParserASTType type,
-      {required this.token,
-      required this.forIn})
-      : super("ForInitializerExpressionStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "forIn": forIn,
-      };
-}
-
-class DirectParserASTContentForInitializerLocalVariableDeclarationHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool forIn;
-
-  DirectParserASTContentForInitializerLocalVariableDeclarationHandle(
-      DirectParserASTType type,
-      {required this.token,
-      required this.forIn})
-      : super("ForInitializerLocalVariableDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "forIn": forIn,
-      };
-}
-
-class DirectParserASTContentForStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForLoopPartsHandle extends DirectParserASTContent {
-  final Token forKeyword;
-  final Token leftParen;
-  final Token leftSeparator;
-  final int updateExpressionCount;
-
-  DirectParserASTContentForLoopPartsHandle(DirectParserASTType type,
-      {required this.forKeyword,
-      required this.leftParen,
-      required this.leftSeparator,
-      required this.updateExpressionCount})
-      : super("ForLoopParts", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "forKeyword": forKeyword,
-        "leftParen": leftParen,
-        "leftSeparator": leftSeparator,
-        "updateExpressionCount": updateExpressionCount,
-      };
-}
-
-class DirectParserASTContentForStatementEnd extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentForStatementEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("ForStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForStatementBodyEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInLoopPartsHandle
-    extends DirectParserASTContent {
-  final Token? awaitToken;
-  final Token forToken;
-  final Token leftParenthesis;
-  final Token inKeyword;
-
-  DirectParserASTContentForInLoopPartsHandle(DirectParserASTType type,
-      {this.awaitToken,
-      required this.forToken,
-      required this.leftParenthesis,
-      required this.inKeyword})
-      : super("ForInLoopParts", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "awaitToken": awaitToken,
-        "forToken": forToken,
-        "leftParenthesis": leftParenthesis,
-        "inKeyword": inKeyword,
-      };
-}
-
-class DirectParserASTContentForInEnd extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentForInEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("ForIn", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForInExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForInExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInBodyBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForInBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInBodyEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNamedFunctionExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNamedFunctionExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("NamedFunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNamedFunctionExpressionEnd
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentNamedFunctionExpressionEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("NamedFunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLocalFunctionDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLocalFunctionDeclarationBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LocalFunctionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLocalFunctionDeclarationEnd
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentLocalFunctionDeclarationEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("LocalFunctionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentBlockFunctionBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBlockFunctionBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("BlockFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBlockFunctionBodyEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentBlockFunctionBodyEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("BlockFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentNoFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoFunctionBodyHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionBodySkippedHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool isExpressionBody;
-
-  DirectParserASTContentFunctionBodySkippedHandle(DirectParserASTType type,
-      {required this.token, required this.isExpressionBody})
-      : super("FunctionBodySkipped", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "isExpressionBody": isExpressionBody,
-      };
-}
-
-class DirectParserASTContentFunctionNameBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionNameBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FunctionName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionNameEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token token;
-
-  DirectParserASTContentFunctionNameEnd(DirectParserASTType type,
-      {required this.beginToken, required this.token})
-      : super("FunctionName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypedefBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypedefBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Typedef", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypedefEnd extends DirectParserASTContent {
-  final Token typedefKeyword;
-  final Token? equals;
-  final Token endToken;
-
-  DirectParserASTContentTypedefEnd(DirectParserASTType type,
-      {required this.typedefKeyword, this.equals, required this.endToken})
-      : super("Typedef", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "typedefKeyword": typedefKeyword,
-        "equals": equals,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassWithClauseHandle
-    extends DirectParserASTContent {
-  final Token withKeyword;
-
-  DirectParserASTContentClassWithClauseHandle(DirectParserASTType type,
-      {required this.withKeyword})
-      : super("ClassWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "withKeyword": withKeyword,
-      };
-}
-
-class DirectParserASTContentClassNoWithClauseHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentClassNoWithClauseHandle(DirectParserASTType type)
-      : super("ClassNoWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentNamedMixinApplicationBegin
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token? abstractToken;
-  final Token name;
-
-  DirectParserASTContentNamedMixinApplicationBegin(DirectParserASTType type,
-      {required this.begin, this.abstractToken, required this.name})
-      : super("NamedMixinApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "abstractToken": abstractToken,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentNamedMixinApplicationWithClauseHandle
-    extends DirectParserASTContent {
-  final Token withKeyword;
-
-  DirectParserASTContentNamedMixinApplicationWithClauseHandle(
-      DirectParserASTType type,
-      {required this.withKeyword})
-      : super("NamedMixinApplicationWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "withKeyword": withKeyword,
-      };
-}
-
-class DirectParserASTContentNamedMixinApplicationEnd
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token classKeyword;
-  final Token equals;
-  final Token? implementsKeyword;
-  final Token endToken;
-
-  DirectParserASTContentNamedMixinApplicationEnd(DirectParserASTType type,
-      {required this.begin,
-      required this.classKeyword,
-      required this.equals,
-      this.implementsKeyword,
-      required this.endToken})
-      : super("NamedMixinApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "classKeyword": classKeyword,
-        "equals": equals,
-        "implementsKeyword": implementsKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentHideBegin extends DirectParserASTContent {
-  final Token hideKeyword;
-
-  DirectParserASTContentHideBegin(DirectParserASTType type,
-      {required this.hideKeyword})
-      : super("Hide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hideKeyword": hideKeyword,
-      };
-}
-
-class DirectParserASTContentHideEnd extends DirectParserASTContent {
-  final Token hideKeyword;
-
-  DirectParserASTContentHideEnd(DirectParserASTType type,
-      {required this.hideKeyword})
-      : super("Hide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hideKeyword": hideKeyword,
-      };
-}
-
-class DirectParserASTContentIdentifierListHandle
-    extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentIdentifierListHandle(DirectParserASTType type,
-      {required this.count})
-      : super("IdentifierList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentTypeListBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeListBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeListEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentTypeListEnd(DirectParserASTType type,
-      {required this.count})
-      : super("TypeList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentIfStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("IfStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfStatementEnd extends DirectParserASTContent {
-  final Token ifToken;
-  final Token? elseToken;
-
-  DirectParserASTContentIfStatementEnd(DirectParserASTType type,
-      {required this.ifToken, this.elseToken})
-      : super("IfStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifToken": ifToken,
-        "elseToken": elseToken,
-      };
-}
-
-class DirectParserASTContentThenStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ThenStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentThenStatementEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenStatementEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ThenStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentElseStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ElseStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseStatementEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentElseStatementEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ElseStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentImportBegin extends DirectParserASTContent {
-  final Token importKeyword;
-
-  DirectParserASTContentImportBegin(DirectParserASTType type,
-      {required this.importKeyword})
-      : super("Import", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "importKeyword": importKeyword,
-      };
-}
-
-class DirectParserASTContentImportPrefixHandle extends DirectParserASTContent {
-  final Token? deferredKeyword;
-  final Token? asKeyword;
-
-  DirectParserASTContentImportPrefixHandle(DirectParserASTType type,
-      {this.deferredKeyword, this.asKeyword})
-      : super("ImportPrefix", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "deferredKeyword": deferredKeyword,
-        "asKeyword": asKeyword,
-      };
-}
-
-class DirectParserASTContentImportEnd extends DirectParserASTContent {
-  final Token importKeyword;
-  final Token? semicolon;
-
-  DirectParserASTContentImportEnd(DirectParserASTType type,
-      {required this.importKeyword, this.semicolon})
-      : super("Import", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "importKeyword": importKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentRecoverImportHandle extends DirectParserASTContent {
-  final Token? semicolon;
-
-  DirectParserASTContentRecoverImportHandle(DirectParserASTType type,
-      {this.semicolon})
-      : super("RecoverImport", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentConditionalUrisBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConditionalUrisBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ConditionalUris", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConditionalUrisEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentConditionalUrisEnd(DirectParserASTType type,
-      {required this.count})
-      : super("ConditionalUris", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentConditionalUriBegin extends DirectParserASTContent {
-  final Token ifKeyword;
-
-  DirectParserASTContentConditionalUriBegin(DirectParserASTType type,
-      {required this.ifKeyword})
-      : super("ConditionalUri", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifKeyword": ifKeyword,
-      };
-}
-
-class DirectParserASTContentConditionalUriEnd extends DirectParserASTContent {
-  final Token ifKeyword;
-  final Token leftParen;
-  final Token? equalSign;
-
-  DirectParserASTContentConditionalUriEnd(DirectParserASTType type,
-      {required this.ifKeyword, required this.leftParen, this.equalSign})
-      : super("ConditionalUri", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifKeyword": ifKeyword,
-        "leftParen": leftParen,
-        "equalSign": equalSign,
-      };
-}
-
-class DirectParserASTContentDottedNameHandle extends DirectParserASTContent {
-  final int count;
-  final Token firstIdentifier;
-
-  DirectParserASTContentDottedNameHandle(DirectParserASTType type,
-      {required this.count, required this.firstIdentifier})
-      : super("DottedName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "firstIdentifier": firstIdentifier,
-      };
-}
-
-class DirectParserASTContentImplicitCreationExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentImplicitCreationExpressionBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ImplicitCreationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentImplicitCreationExpressionEnd
-    extends DirectParserASTContent {
-  final Token token;
-  final Token openAngleBracket;
-
-  DirectParserASTContentImplicitCreationExpressionEnd(DirectParserASTType type,
-      {required this.token, required this.openAngleBracket})
-      : super("ImplicitCreationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "openAngleBracket": openAngleBracket,
-      };
-}
-
-class DirectParserASTContentInitializedIdentifierBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializedIdentifierBegin(DirectParserASTType type,
-      {required this.token})
-      : super("InitializedIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializedIdentifierEnd
-    extends DirectParserASTContent {
-  final Token nameToken;
-
-  DirectParserASTContentInitializedIdentifierEnd(DirectParserASTType type,
-      {required this.nameToken})
-      : super("InitializedIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nameToken": nameToken,
-      };
-}
-
-class DirectParserASTContentFieldInitializerBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFieldInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFieldInitializerEnd extends DirectParserASTContent {
-  final Token assignment;
-  final Token token;
-
-  DirectParserASTContentFieldInitializerEnd(DirectParserASTType type,
-      {required this.assignment, required this.token})
-      : super("FieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assignment": assignment,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoFieldInitializerHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoFieldInitializerHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoFieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariableInitializerBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVariableInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("VariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariableInitializerEnd
-    extends DirectParserASTContent {
-  final Token assignmentOperator;
-
-  DirectParserASTContentVariableInitializerEnd(DirectParserASTType type,
-      {required this.assignmentOperator})
-      : super("VariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assignmentOperator": assignmentOperator,
-      };
-}
-
-class DirectParserASTContentNoVariableInitializerHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoVariableInitializerHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoVariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializerBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Initializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializerEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializerEnd(DirectParserASTType type,
-      {required this.token})
-      : super("Initializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializersBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializersBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Initializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializersEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentInitializersEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("Initializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentNoInitializersHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentNoInitializersHandle(DirectParserASTType type)
-      : super("NoInitializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentInvalidExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidFunctionBodyHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidTypeReferenceHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTypeReferenceHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTypeReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLabelHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLabelHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Label", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLabeledStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final int labelCount;
-
-  DirectParserASTContentLabeledStatementBegin(DirectParserASTType type,
-      {required this.token, required this.labelCount})
-      : super("LabeledStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "labelCount": labelCount,
-      };
-}
-
-class DirectParserASTContentLabeledStatementEnd extends DirectParserASTContent {
-  final int labelCount;
-
-  DirectParserASTContentLabeledStatementEnd(DirectParserASTType type,
-      {required this.labelCount})
-      : super("LabeledStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-      };
-}
-
-class DirectParserASTContentLibraryNameBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLibraryNameBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LibraryName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLibraryNameEnd extends DirectParserASTContent {
-  final Token libraryKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentLibraryNameEnd(DirectParserASTType type,
-      {required this.libraryKeyword, required this.semicolon})
-      : super("LibraryName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "libraryKeyword": libraryKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentLiteralMapEntryHandle
-    extends DirectParserASTContent {
-  final Token colon;
-  final Token endToken;
-
-  DirectParserASTContentLiteralMapEntryHandle(DirectParserASTType type,
-      {required this.colon, required this.endToken})
-      : super("LiteralMapEntry", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLiteralStringBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralStringBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralString", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInterpolationExpressionHandle
-    extends DirectParserASTContent {
-  final Token leftBracket;
-  final Token? rightBracket;
-
-  DirectParserASTContentInterpolationExpressionHandle(DirectParserASTType type,
-      {required this.leftBracket, this.rightBracket})
-      : super("InterpolationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "leftBracket": leftBracket,
-        "rightBracket": rightBracket,
-      };
-}
-
-class DirectParserASTContentLiteralStringEnd extends DirectParserASTContent {
-  final int interpolationCount;
-  final Token endToken;
-
-  DirectParserASTContentLiteralStringEnd(DirectParserASTType type,
-      {required this.interpolationCount, required this.endToken})
-      : super("LiteralString", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "interpolationCount": interpolationCount,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentStringJuxtapositionHandle
-    extends DirectParserASTContent {
-  final Token startToken;
-  final int literalCount;
-
-  DirectParserASTContentStringJuxtapositionHandle(DirectParserASTType type,
-      {required this.startToken, required this.literalCount})
-      : super("StringJuxtaposition", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "startToken": startToken,
-        "literalCount": literalCount,
-      };
-}
-
-class DirectParserASTContentMemberBegin extends DirectParserASTContent {
-  DirectParserASTContentMemberBegin(DirectParserASTType type)
-      : super("Member", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentInvalidMemberHandle extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentInvalidMemberHandle(DirectParserASTType type,
-      {required this.endToken})
-      : super("InvalidMember", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMemberEnd extends DirectParserASTContent {
-  DirectParserASTContentMemberEnd(DirectParserASTType type)
-      : super("Member", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentMethodBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? varFinalOrConst;
-  final Token? getOrSet;
-  final Token name;
-
-  DirectParserASTContentMethodBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.varFinalOrConst,
-      this.getOrSet,
-      required this.name})
-      : super("Method", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "varFinalOrConst": varFinalOrConst,
-        "getOrSet": getOrSet,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentClassMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentClassMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ClassMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentMixinMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("MixinMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentExtensionMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ExtensionMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassConstructorEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentClassConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ClassConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinConstructorEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentMixinConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("MixinConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionConstructorEnd
-    extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentExtensionConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ExtensionConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMetadataStarBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentMetadataStarBegin(DirectParserASTType type,
-      {required this.token})
-      : super("MetadataStar", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentMetadataStarEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentMetadataStarEnd(DirectParserASTType type,
-      {required this.count})
-      : super("MetadataStar", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentMetadataBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentMetadataBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Metadata", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentMetadataEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? periodBeforeName;
-  final Token endToken;
-
-  DirectParserASTContentMetadataEnd(DirectParserASTType type,
-      {required this.beginToken, this.periodBeforeName, required this.endToken})
-      : super("Metadata", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "periodBeforeName": periodBeforeName,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentOptionalFormalParametersBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentOptionalFormalParametersBegin(DirectParserASTType type,
-      {required this.token})
-      : super("OptionalFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOptionalFormalParametersEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentOptionalFormalParametersEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("OptionalFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentPartBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentPartBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Part", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentPartEnd extends DirectParserASTContent {
-  final Token partKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentPartEnd(DirectParserASTType type,
-      {required this.partKeyword, required this.semicolon})
-      : super("Part", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "partKeyword": partKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentPartOfBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentPartOfBegin(DirectParserASTType type,
-      {required this.token})
-      : super("PartOf", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentPartOfEnd extends DirectParserASTContent {
-  final Token partKeyword;
-  final Token ofKeyword;
-  final Token semicolon;
-  final bool hasName;
-
-  DirectParserASTContentPartOfEnd(DirectParserASTType type,
-      {required this.partKeyword,
-      required this.ofKeyword,
-      required this.semicolon,
-      required this.hasName})
-      : super("PartOf", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "partKeyword": partKeyword,
-        "ofKeyword": ofKeyword,
-        "semicolon": semicolon,
-        "hasName": hasName,
-      };
-}
-
-class DirectParserASTContentRedirectingFactoryBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentRedirectingFactoryBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("RedirectingFactoryBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentRedirectingFactoryBodyEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentRedirectingFactoryBodyEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("RedirectingFactoryBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentReturnStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentReturnStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ReturnStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodyHandle(DirectParserASTType type,
-      {required this.nativeToken, required this.semicolon})
-      : super("NativeFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodyIgnoredHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodyIgnoredHandle(
-      DirectParserASTType type,
-      {required this.nativeToken,
-      required this.semicolon})
-      : super("NativeFunctionBodyIgnored", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodySkippedHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodySkippedHandle(
-      DirectParserASTType type,
-      {required this.nativeToken,
-      required this.semicolon})
-      : super("NativeFunctionBodySkipped", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentEmptyFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token semicolon;
-
-  DirectParserASTContentEmptyFunctionBodyHandle(DirectParserASTType type,
-      {required this.semicolon})
-      : super("EmptyFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentExpressionFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token arrowToken;
-  final Token? endToken;
-
-  DirectParserASTContentExpressionFunctionBodyHandle(DirectParserASTType type,
-      {required this.arrowToken, this.endToken})
-      : super("ExpressionFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "arrowToken": arrowToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentReturnStatementEnd extends DirectParserASTContent {
-  final bool hasExpression;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentReturnStatementEnd(DirectParserASTType type,
-      {required this.hasExpression,
-      required this.beginToken,
-      required this.endToken})
-      : super("ReturnStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasExpression": hasExpression,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentSendHandle extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentSendHandle(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("Send", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentShowBegin extends DirectParserASTContent {
-  final Token showKeyword;
-
-  DirectParserASTContentShowBegin(DirectParserASTType type,
-      {required this.showKeyword})
-      : super("Show", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-      };
-}
-
-class DirectParserASTContentShowEnd extends DirectParserASTContent {
-  final Token showKeyword;
-
-  DirectParserASTContentShowEnd(DirectParserASTType type,
-      {required this.showKeyword})
-      : super("Show", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-      };
-}
-
-class DirectParserASTContentSwitchStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSwitchStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("SwitchStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSwitchStatementEnd extends DirectParserASTContent {
-  final Token switchKeyword;
-  final Token endToken;
-
-  DirectParserASTContentSwitchStatementEnd(DirectParserASTType type,
-      {required this.switchKeyword, required this.endToken})
-      : super("SwitchStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "switchKeyword": switchKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentSwitchBlockBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSwitchBlockBegin(DirectParserASTType type,
-      {required this.token})
-      : super("SwitchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSwitchBlockEnd extends DirectParserASTContent {
-  final int caseCount;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentSwitchBlockEnd(DirectParserASTType type,
-      {required this.caseCount,
-      required this.beginToken,
-      required this.endToken})
-      : super("SwitchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseCount": caseCount,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLiteralSymbolBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralSymbolBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralSymbol", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralSymbolEnd extends DirectParserASTContent {
-  final Token hashToken;
-  final int identifierCount;
-
-  DirectParserASTContentLiteralSymbolEnd(DirectParserASTType type,
-      {required this.hashToken, required this.identifierCount})
-      : super("LiteralSymbol", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hashToken": hashToken,
-        "identifierCount": identifierCount,
-      };
-}
-
-class DirectParserASTContentThrowExpressionHandle
-    extends DirectParserASTContent {
-  final Token throwToken;
-  final Token endToken;
-
-  DirectParserASTContentThrowExpressionHandle(DirectParserASTType type,
-      {required this.throwToken, required this.endToken})
-      : super("ThrowExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "throwToken": throwToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentRethrowStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentRethrowStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("RethrowStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentRethrowStatementEnd extends DirectParserASTContent {
-  final Token rethrowToken;
-  final Token endToken;
-
-  DirectParserASTContentRethrowStatementEnd(DirectParserASTType type,
-      {required this.rethrowToken, required this.endToken})
-      : super("RethrowStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "rethrowToken": rethrowToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelDeclarationEnd
-    extends DirectParserASTContent {
-  final Token nextToken;
-
-  DirectParserASTContentTopLevelDeclarationEnd(DirectParserASTType type,
-      {required this.nextToken})
-      : super("TopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nextToken": nextToken,
-      };
-}
-
-class DirectParserASTContentInvalidTopLevelDeclarationHandle
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentInvalidTopLevelDeclarationHandle(
-      DirectParserASTType type,
-      {required this.endToken})
-      : super("InvalidTopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMemberBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTopLevelMemberBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TopLevelMember", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFieldsBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final Token lastConsumed;
-
-  DirectParserASTContentFieldsBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.lastConsumed})
-      : super("Fields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "lastConsumed": lastConsumed,
-      };
-}
-
-class DirectParserASTContentTopLevelFieldsEnd extends DirectParserASTContent {
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTopLevelFieldsEnd(DirectParserASTType type,
-      {this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("TopLevelFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMethodBegin extends DirectParserASTContent {
-  final Token lastConsumed;
-  final Token? externalToken;
-
-  DirectParserASTContentTopLevelMethodBegin(DirectParserASTType type,
-      {required this.lastConsumed, this.externalToken})
-      : super("TopLevelMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "lastConsumed": lastConsumed,
-        "externalToken": externalToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMethodEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? getOrSet;
-  final Token endToken;
-
-  DirectParserASTContentTopLevelMethodEnd(DirectParserASTType type,
-      {required this.beginToken, this.getOrSet, required this.endToken})
-      : super("TopLevelMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "getOrSet": getOrSet,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTryStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTryStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TryStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCaseMatchHandle extends DirectParserASTContent {
-  final Token caseKeyword;
-  final Token colon;
-
-  DirectParserASTContentCaseMatchHandle(DirectParserASTType type,
-      {required this.caseKeyword, required this.colon})
-      : super("CaseMatch", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseKeyword": caseKeyword,
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentCatchClauseBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCatchClauseBegin(DirectParserASTType type,
-      {required this.token})
-      : super("CatchClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCatchClauseEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCatchClauseEnd(DirectParserASTType type,
-      {required this.token})
-      : super("CatchClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCatchBlockHandle extends DirectParserASTContent {
-  final Token? onKeyword;
-  final Token? catchKeyword;
-  final Token? comma;
-
-  DirectParserASTContentCatchBlockHandle(DirectParserASTType type,
-      {this.onKeyword, this.catchKeyword, this.comma})
-      : super("CatchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "onKeyword": onKeyword,
-        "catchKeyword": catchKeyword,
-        "comma": comma,
-      };
-}
-
-class DirectParserASTContentFinallyBlockHandle extends DirectParserASTContent {
-  final Token finallyKeyword;
-
-  DirectParserASTContentFinallyBlockHandle(DirectParserASTType type,
-      {required this.finallyKeyword})
-      : super("FinallyBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "finallyKeyword": finallyKeyword,
-      };
-}
-
-class DirectParserASTContentTryStatementEnd extends DirectParserASTContent {
-  final int catchCount;
-  final Token tryKeyword;
-  final Token? finallyKeyword;
-
-  DirectParserASTContentTryStatementEnd(DirectParserASTType type,
-      {required this.catchCount, required this.tryKeyword, this.finallyKeyword})
-      : super("TryStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "catchCount": catchCount,
-        "tryKeyword": tryKeyword,
-        "finallyKeyword": finallyKeyword,
-      };
-}
-
-class DirectParserASTContentTypeHandle extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? questionMark;
-
-  DirectParserASTContentTypeHandle(DirectParserASTType type,
-      {required this.beginToken, this.questionMark})
-      : super("Type", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "questionMark": questionMark,
-      };
-}
-
-class DirectParserASTContentNonNullAssertExpressionHandle
-    extends DirectParserASTContent {
-  final Token bang;
-
-  DirectParserASTContentNonNullAssertExpressionHandle(DirectParserASTType type,
-      {required this.bang})
-      : super("NonNullAssertExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "bang": bang,
-      };
-}
-
-class DirectParserASTContentNoNameHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoNameHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionTypeBegin extends DirectParserASTContent {
-  final Token beginToken;
-
-  DirectParserASTContentFunctionTypeBegin(DirectParserASTType type,
-      {required this.beginToken})
-      : super("FunctionType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-      };
-}
-
-class DirectParserASTContentFunctionTypeEnd extends DirectParserASTContent {
-  final Token functionToken;
-  final Token? questionMark;
-
-  DirectParserASTContentFunctionTypeEnd(DirectParserASTType type,
-      {required this.functionToken, this.questionMark})
-      : super("FunctionType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "functionToken": functionToken,
-        "questionMark": questionMark,
-      };
-}
-
-class DirectParserASTContentTypeArgumentsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeArgumentsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeArgumentsEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTypeArgumentsEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("TypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTypeArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoTypeArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariableBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeVariableBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeVariable", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariablesDefinedHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final int count;
-
-  DirectParserASTContentTypeVariablesDefinedHandle(DirectParserASTType type,
-      {required this.token, required this.count})
-      : super("TypeVariablesDefined", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "count": count,
-      };
-}
-
-class DirectParserASTContentTypeVariableEnd extends DirectParserASTContent {
-  final Token token;
-  final int index;
-  final Token? extendsOrSuper;
-  final Token? variance;
-
-  DirectParserASTContentTypeVariableEnd(DirectParserASTType type,
-      {required this.token,
-      required this.index,
-      this.extendsOrSuper,
-      this.variance})
-      : super("TypeVariable", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "index": index,
-        "extendsOrSuper": extendsOrSuper,
-        "variance": variance,
-      };
-}
-
-class DirectParserASTContentTypeVariablesBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeVariablesBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariablesEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTypeVariablesEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("TypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentFunctionExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionExpressionEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token token;
-
-  DirectParserASTContentFunctionExpressionEnd(DirectParserASTType type,
-      {required this.beginToken, required this.token})
-      : super("FunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariablesDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-
-  DirectParserASTContentVariablesDeclarationBegin(DirectParserASTType type,
-      {required this.token, this.lateToken, this.varFinalOrConst})
-      : super("VariablesDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-      };
-}
-
-class DirectParserASTContentVariablesDeclarationEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token? endToken;
-
-  DirectParserASTContentVariablesDeclarationEnd(DirectParserASTType type,
-      {required this.count, this.endToken})
-      : super("VariablesDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentWhileStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementEnd extends DirectParserASTContent {
-  final Token whileKeyword;
-  final Token endToken;
-
-  DirectParserASTContentWhileStatementEnd(DirectParserASTType type,
-      {required this.whileKeyword, required this.endToken})
-      : super("WhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "whileKeyword": whileKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentAsOperatorTypeBegin extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorTypeBegin(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAsOperatorTypeEnd extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorTypeEnd(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAsOperatorHandle extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorHandle(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentAssignmentExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("AssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBinaryExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBinaryExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("BinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBinaryExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBinaryExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("BinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentEndingBinaryExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentEndingBinaryExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("EndingBinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConditionalExpressionBegin
-    extends DirectParserASTContent {
-  final Token question;
-
-  DirectParserASTContentConditionalExpressionBegin(DirectParserASTType type,
-      {required this.question})
-      : super("ConditionalExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-      };
-}
-
-class DirectParserASTContentConditionalExpressionColonHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentConditionalExpressionColonHandle(
-      DirectParserASTType type)
-      : super("ConditionalExpressionColon", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentConditionalExpressionEnd
-    extends DirectParserASTContent {
-  final Token question;
-  final Token colon;
-
-  DirectParserASTContentConditionalExpressionEnd(DirectParserASTType type,
-      {required this.question, required this.colon})
-      : super("ConditionalExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentConstExpressionBegin
-    extends DirectParserASTContent {
-  final Token constKeyword;
-
-  DirectParserASTContentConstExpressionBegin(DirectParserASTType type,
-      {required this.constKeyword})
-      : super("ConstExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "constKeyword": constKeyword,
-      };
-}
-
-class DirectParserASTContentConstExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ConstExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstFactoryHandle extends DirectParserASTContent {
-  final Token constKeyword;
-
-  DirectParserASTContentConstFactoryHandle(DirectParserASTType type,
-      {required this.constKeyword})
-      : super("ConstFactory", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "constKeyword": constKeyword,
-      };
-}
-
-class DirectParserASTContentForControlFlowBegin extends DirectParserASTContent {
-  final Token? awaitToken;
-  final Token forToken;
-
-  DirectParserASTContentForControlFlowBegin(DirectParserASTType type,
-      {this.awaitToken, required this.forToken})
-      : super("ForControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "awaitToken": awaitToken,
-        "forToken": forToken,
-      };
-}
-
-class DirectParserASTContentForControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfControlFlowBegin extends DirectParserASTContent {
-  final Token ifToken;
-
-  DirectParserASTContentIfControlFlowBegin(DirectParserASTType type,
-      {required this.ifToken})
-      : super("IfControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifToken": ifToken,
-      };
-}
-
-class DirectParserASTContentThenControlFlowHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenControlFlowHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ThenControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseControlFlowHandle
-    extends DirectParserASTContent {
-  final Token elseToken;
-
-  DirectParserASTContentElseControlFlowHandle(DirectParserASTType type,
-      {required this.elseToken})
-      : super("ElseControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "elseToken": elseToken,
-      };
-}
-
-class DirectParserASTContentIfControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("IfControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfElseControlFlowEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfElseControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("IfElseControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSpreadExpressionHandle
-    extends DirectParserASTContent {
-  final Token spreadToken;
-
-  DirectParserASTContentSpreadExpressionHandle(DirectParserASTType type,
-      {required this.spreadToken})
-      : super("SpreadExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "spreadToken": spreadToken,
-      };
-}
-
-class DirectParserASTContentFunctionTypedFormalParameterBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionTypedFormalParameterBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("FunctionTypedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionTypedFormalParameterEnd
-    extends DirectParserASTContent {
-  final Token nameToken;
-  final Token? question;
-
-  DirectParserASTContentFunctionTypedFormalParameterEnd(
-      DirectParserASTType type,
-      {required this.nameToken,
-      this.question})
-      : super("FunctionTypedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nameToken": nameToken,
-        "question": question,
-      };
-}
-
-class DirectParserASTContentIdentifierHandle extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentIdentifierHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("Identifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentShowHideIdentifierHandle
-    extends DirectParserASTContent {
-  final Token? modifier;
-  final Token identifier;
-
-  DirectParserASTContentShowHideIdentifierHandle(DirectParserASTType type,
-      {this.modifier, required this.identifier})
-      : super("ShowHideIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "modifier": modifier,
-        "identifier": identifier,
-      };
-}
-
-class DirectParserASTContentIndexedExpressionHandle
-    extends DirectParserASTContent {
-  final Token? question;
-  final Token openSquareBracket;
-  final Token closeSquareBracket;
-
-  DirectParserASTContentIndexedExpressionHandle(DirectParserASTType type,
-      {this.question,
-      required this.openSquareBracket,
-      required this.closeSquareBracket})
-      : super("IndexedExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-        "openSquareBracket": openSquareBracket,
-        "closeSquareBracket": closeSquareBracket,
-      };
-}
-
-class DirectParserASTContentIsOperatorTypeBegin extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentIsOperatorTypeBegin(DirectParserASTType type,
-      {required this.operator})
-      : super("IsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentIsOperatorTypeEnd extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentIsOperatorTypeEnd(DirectParserASTType type,
-      {required this.operator})
-      : super("IsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentIsOperatorHandle extends DirectParserASTContent {
-  final Token isOperator;
-  final Token? not;
-
-  DirectParserASTContentIsOperatorHandle(DirectParserASTType type,
-      {required this.isOperator, this.not})
-      : super("IsOperator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "isOperator": isOperator,
-        "not": not,
-      };
-}
-
-class DirectParserASTContentLiteralBoolHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralBoolHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralBool", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBreakStatementHandle
-    extends DirectParserASTContent {
-  final bool hasTarget;
-  final Token breakKeyword;
-  final Token endToken;
-
-  DirectParserASTContentBreakStatementHandle(DirectParserASTType type,
-      {required this.hasTarget,
-      required this.breakKeyword,
-      required this.endToken})
-      : super("BreakStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasTarget": hasTarget,
-        "breakKeyword": breakKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentContinueStatementHandle
-    extends DirectParserASTContent {
-  final bool hasTarget;
-  final Token continueKeyword;
-  final Token endToken;
-
-  DirectParserASTContentContinueStatementHandle(DirectParserASTType type,
-      {required this.hasTarget,
-      required this.continueKeyword,
-      required this.endToken})
-      : super("ContinueStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasTarget": hasTarget,
-        "continueKeyword": continueKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentEmptyStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentEmptyStatementHandle(DirectParserASTType type,
-      {required this.token})
-      : super("EmptyStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentAssertBegin extends DirectParserASTContent {
-  final Token assertKeyword;
-  final Assert kind;
-
-  DirectParserASTContentAssertBegin(DirectParserASTType type,
-      {required this.assertKeyword, required this.kind})
-      : super("Assert", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assertKeyword": assertKeyword,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentAssertEnd extends DirectParserASTContent {
-  final Token assertKeyword;
-  final Assert kind;
-  final Token leftParenthesis;
-  final Token? commaToken;
-  final Token semicolonToken;
-
-  DirectParserASTContentAssertEnd(DirectParserASTType type,
-      {required this.assertKeyword,
-      required this.kind,
-      required this.leftParenthesis,
-      this.commaToken,
-      required this.semicolonToken})
-      : super("Assert", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assertKeyword": assertKeyword,
-        "kind": kind,
-        "leftParenthesis": leftParenthesis,
-        "commaToken": commaToken,
-        "semicolonToken": semicolonToken,
-      };
-}
-
-class DirectParserASTContentLiteralDoubleHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralDoubleHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralDouble", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralIntHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralIntHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralInt", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralListHandle extends DirectParserASTContent {
-  final int count;
-  final Token leftBracket;
-  final Token? constKeyword;
-  final Token rightBracket;
-
-  DirectParserASTContentLiteralListHandle(DirectParserASTType type,
-      {required this.count,
-      required this.leftBracket,
-      this.constKeyword,
-      required this.rightBracket})
-      : super("LiteralList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "leftBracket": leftBracket,
-        "constKeyword": constKeyword,
-        "rightBracket": rightBracket,
-      };
-}
-
-class DirectParserASTContentLiteralSetOrMapHandle
-    extends DirectParserASTContent {
-  final int count;
-  final Token leftBrace;
-  final Token? constKeyword;
-  final Token rightBrace;
-  final bool hasSetEntry;
-
-  DirectParserASTContentLiteralSetOrMapHandle(DirectParserASTType type,
-      {required this.count,
-      required this.leftBrace,
-      this.constKeyword,
-      required this.rightBrace,
-      required this.hasSetEntry})
-      : super("LiteralSetOrMap", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "leftBrace": leftBrace,
-        "constKeyword": constKeyword,
-        "rightBrace": rightBrace,
-        "hasSetEntry": hasSetEntry,
-      };
-}
-
-class DirectParserASTContentLiteralNullHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralNullHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralNull", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNativeClauseHandle extends DirectParserASTContent {
-  final Token nativeToken;
-  final bool hasName;
-
-  DirectParserASTContentNativeClauseHandle(DirectParserASTType type,
-      {required this.nativeToken, required this.hasName})
-      : super("NativeClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "hasName": hasName,
-      };
-}
-
-class DirectParserASTContentNamedArgumentHandle extends DirectParserASTContent {
-  final Token colon;
-
-  DirectParserASTContentNamedArgumentHandle(DirectParserASTType type,
-      {required this.colon})
-      : super("NamedArgument", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentNewExpressionBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("NewExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNewExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("NewExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoArgumentsHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("NoConstructorReferenceContinuationAfterTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoTypeHandle extends DirectParserASTContent {
-  final Token lastConsumed;
-
-  DirectParserASTContentNoTypeHandle(DirectParserASTType type,
-      {required this.lastConsumed})
-      : super("NoType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "lastConsumed": lastConsumed,
-      };
-}
-
-class DirectParserASTContentNoTypeVariablesHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoTypeVariablesHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoTypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOperatorHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentOperatorHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Operator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSymbolVoidHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSymbolVoidHandle(DirectParserASTType type,
-      {required this.token})
-      : super("SymbolVoid", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOperatorNameHandle extends DirectParserASTContent {
-  final Token operatorKeyword;
-  final Token token;
-
-  DirectParserASTContentOperatorNameHandle(DirectParserASTType type,
-      {required this.operatorKeyword, required this.token})
-      : super("OperatorName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operatorKeyword": operatorKeyword,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidOperatorNameHandle
-    extends DirectParserASTContent {
-  final Token operatorKeyword;
-  final Token token;
-
-  DirectParserASTContentInvalidOperatorNameHandle(DirectParserASTType type,
-      {required this.operatorKeyword, required this.token})
-      : super("InvalidOperatorName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operatorKeyword": operatorKeyword,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentParenthesizedConditionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentParenthesizedConditionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ParenthesizedCondition", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentParenthesizedExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentParenthesizedExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ParenthesizedExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentQualifiedHandle extends DirectParserASTContent {
-  final Token period;
-
-  DirectParserASTContentQualifiedHandle(DirectParserASTType type,
-      {required this.period})
-      : super("Qualified", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "period": period,
-      };
-}
-
-class DirectParserASTContentStringPartHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentStringPartHandle(DirectParserASTType type,
-      {required this.token})
-      : super("StringPart", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSuperExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentSuperExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("SuperExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentSwitchCaseBegin extends DirectParserASTContent {
-  final int labelCount;
-  final int expressionCount;
-  final Token firstToken;
-
-  DirectParserASTContentSwitchCaseBegin(DirectParserASTType type,
-      {required this.labelCount,
-      required this.expressionCount,
-      required this.firstToken})
-      : super("SwitchCase", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-        "expressionCount": expressionCount,
-        "firstToken": firstToken,
-      };
-}
-
-class DirectParserASTContentSwitchCaseEnd extends DirectParserASTContent {
-  final int labelCount;
-  final int expressionCount;
-  final Token? defaultKeyword;
-  final Token? colonAfterDefault;
-  final int statementCount;
-  final Token firstToken;
-  final Token endToken;
-
-  DirectParserASTContentSwitchCaseEnd(DirectParserASTType type,
-      {required this.labelCount,
-      required this.expressionCount,
-      this.defaultKeyword,
-      this.colonAfterDefault,
-      required this.statementCount,
-      required this.firstToken,
-      required this.endToken})
-      : super("SwitchCase", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-        "expressionCount": expressionCount,
-        "defaultKeyword": defaultKeyword,
-        "colonAfterDefault": colonAfterDefault,
-        "statementCount": statementCount,
-        "firstToken": firstToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentThisExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentThisExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("ThisExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentUnaryPostfixAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPostfixAssignmentExpressionHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPostfixAssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnaryPrefixExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPrefixExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPrefixExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnaryPrefixAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPrefixAssignmentExpressionHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPrefixAssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFormalParameterDefaultValueExpressionBegin
-    extends DirectParserASTContent {
-  DirectParserASTContentFormalParameterDefaultValueExpressionBegin(
-      DirectParserASTType type)
-      : super("FormalParameterDefaultValueExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentFormalParameterDefaultValueExpressionEnd
-    extends DirectParserASTContent {
-  DirectParserASTContentFormalParameterDefaultValueExpressionEnd(
-      DirectParserASTType type)
-      : super("FormalParameterDefaultValueExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentValuedFormalParameterHandle
-    extends DirectParserASTContent {
-  final Token equals;
-  final Token token;
-
-  DirectParserASTContentValuedFormalParameterHandle(DirectParserASTType type,
-      {required this.equals, required this.token})
-      : super("ValuedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "equals": equals,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFormalParameterWithoutValueHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFormalParameterWithoutValueHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("FormalParameterWithoutValue", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVoidKeywordHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVoidKeywordHandle(DirectParserASTType type,
-      {required this.token})
-      : super("VoidKeyword", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVoidKeywordWithTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVoidKeywordWithTypeArgumentsHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("VoidKeywordWithTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentYieldStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentYieldStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("YieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentYieldStatementEnd extends DirectParserASTContent {
-  final Token yieldToken;
-  final Token? starToken;
-  final Token endToken;
-
-  DirectParserASTContentYieldStatementEnd(DirectParserASTType type,
-      {required this.yieldToken, this.starToken, required this.endToken})
-      : super("YieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "yieldToken": yieldToken,
-        "starToken": starToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidYieldStatementEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? starToken;
-  final Token endToken;
-  final MessageCode errorCode;
-
-  DirectParserASTContentInvalidYieldStatementEnd(DirectParserASTType type,
-      {required this.beginToken,
-      this.starToken,
-      required this.endToken,
-      required this.errorCode})
-      : super("InvalidYieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "starToken": starToken,
-        "endToken": endToken,
-        "errorCode": errorCode,
-      };
-}
-
-class DirectParserASTContentRecoverableErrorHandle
-    extends DirectParserASTContent {
-  final Message message;
-  final Token startToken;
-  final Token endToken;
-
-  DirectParserASTContentRecoverableErrorHandle(DirectParserASTType type,
-      {required this.message, required this.startToken, required this.endToken})
-      : super("RecoverableError", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "message": message,
-        "startToken": startToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentErrorTokenHandle extends DirectParserASTContent {
-  final ErrorToken token;
-
-  DirectParserASTContentErrorTokenHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ErrorToken", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnescapeErrorHandle extends DirectParserASTContent {
-  final Message message;
-  final Token location;
-  final int stringOffset;
-  final int length;
-
-  DirectParserASTContentUnescapeErrorHandle(DirectParserASTType type,
-      {required this.message,
-      required this.location,
-      required this.stringOffset,
-      required this.length})
-      : super("UnescapeError", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "message": message,
-        "location": location,
-        "stringOffset": stringOffset,
-        "length": length,
-      };
-}
-
-class DirectParserASTContentInvalidStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final Message message;
-
-  DirectParserASTContentInvalidStatementHandle(DirectParserASTType type,
-      {required this.token, required this.message})
-      : super("InvalidStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "message": message,
-      };
-}
-
-class DirectParserASTContentScriptHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentScriptHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Script", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCommentReferenceTextHandle
-    extends DirectParserASTContent {
-  final String referenceSource;
-  final int referenceOffset;
-
-  DirectParserASTContentCommentReferenceTextHandle(DirectParserASTType type,
-      {required this.referenceSource, required this.referenceOffset})
-      : super("CommentReferenceText", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "referenceSource": referenceSource,
-        "referenceOffset": referenceOffset,
-      };
-}
-
-class DirectParserASTContentCommentReferenceHandle
-    extends DirectParserASTContent {
-  final Token? newKeyword;
-  final Token? prefix;
-  final Token? period;
-  final Token token;
-
-  DirectParserASTContentCommentReferenceHandle(DirectParserASTType type,
-      {this.newKeyword, this.prefix, this.period, required this.token})
-      : super("CommentReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "newKeyword": newKeyword,
-        "prefix": prefix,
-        "period": period,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoCommentReferenceHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentNoCommentReferenceHandle(DirectParserASTType type)
-      : super("NoCommentReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentTypeArgumentApplicationHandle
-    extends DirectParserASTContent {
-  final Token openAngleBracket;
-
-  DirectParserASTContentTypeArgumentApplicationHandle(DirectParserASTType type,
-      {required this.openAngleBracket})
-      : super("TypeArgumentApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "openAngleBracket": openAngleBracket,
-      };
-}
-
-class DirectParserASTContentNewAsIdentifierHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewAsIdentifierHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NewAsIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
diff --git a/pkg/front_end/lib/src/fasta/util/outline_extractor.dart b/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
new file mode 100644
index 0000000..ff65e37
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
@@ -0,0 +1,942 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
+    show ScannerConfiguration;
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/file_system.dart';
+import 'package:front_end/src/base/processed_options.dart';
+import 'package:front_end/src/fasta/compiler_context.dart';
+import 'package:front_end/src/fasta/uri_translator.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/textual_outline.dart';
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+import 'package:kernel/target/targets.dart';
+
+import "parser_ast.dart";
+import "abstracted_ast_nodes.dart";
+
+// Overall TODO(s):
+// * If entry is given as fileuri but exists as different import uri...
+//   Does that matter?
+// * Setters vs non-setters with naming conflicts.
+// * -> also these might be found on "different levels", e.g. the setter might
+//      be in the class and the getter might be in an import.
+// * show/hide on imports and exports.
+// * Handle importing/exporting non-existing files.
+// * Tests.
+// * Maybe bypass the direct-from-parser-ast stuff for speed?
+// * Probably some of the special classes can be combined if we want to
+//   (e.g. Class and Mixin).
+// * Extensions --- we currently basically mark all we see.
+//    => Could be perhaps only include them if the class they're talking about
+//       is included? (or we don't know).
+// * E.g. "factory Abc.b() => Abc3();" is the same as
+//   "factory Abc.b() { return Abc3(); }" and Abc3 shouldn't be marked by it.
+//    -> This is basically a rough edge on the textual outline though.
+//    -> Also, the same applies to other instances of "=>".
+// * It shouldn't lookup private stuff in other libraries.
+// * Could there be made a distinction between for instance
+//   `IdentifierContext.typeReference` and `IdentifierContext.expression`?
+//   => one might not have to include content of classes that only talk about
+//      typeReference I think.
+
+Future<void> main(List<String> args) async {
+  if (args.length != 2) {
+    throw "Needs 2 arguments: packages file/dir and file to process.";
+  }
+  Uri packages = Uri.base.resolve(args[0]);
+  Uri file = Uri.base.resolve(args[1]);
+  for (int i = 0; i < 1; i++) {
+    Stopwatch stopwatch = new Stopwatch()..start();
+    await extractOutline([file], packages: packages, verbosityLevel: 40);
+    print("Finished in ${stopwatch.elapsedMilliseconds} ms "
+        "(textual outline was "
+        "${latestProcessor!.textualOutlineStopwatch.elapsedMilliseconds} ms)"
+        "(get ast was "
+        "${latestProcessor!.getAstStopwatch.elapsedMilliseconds} ms)"
+        "(extract identifier was "
+        "${latestProcessor!.extractIdentifierStopwatch.elapsedMilliseconds} ms)"
+        "");
+  }
+}
+
+_Processor? latestProcessor;
+
+Future<Map<Uri, String>> extractOutline(List<Uri> entryPointUris,
+    {Uri? sdk,
+    required Uri? packages,
+    Uri? platform,
+    Target? target,
+    int verbosityLevel: 0}) {
+  CompilerOptions options = new CompilerOptions()
+    ..target = target
+    ..packagesFileUri = packages
+    ..sdkSummary = platform
+    ..sdkRoot = sdk;
+  ProcessedOptions pOptions =
+      new ProcessedOptions(options: options, inputs: entryPointUris);
+  return CompilerContext.runWithOptions(pOptions, (CompilerContext c) async {
+    FileSystem fileSystem = c.options.fileSystem;
+    UriTranslator uriTranslator = await c.options.getUriTranslator();
+    _Processor processor =
+        new _Processor(verbosityLevel, fileSystem, uriTranslator);
+    latestProcessor = processor;
+    List<TopLevel> entryPoints = [];
+    for (Uri entryPointUri in entryPointUris) {
+      TopLevel entryPoint = await processor.preprocessUri(entryPointUri);
+      entryPoints.add(entryPoint);
+    }
+    return await processor.calculate(entryPoints);
+  });
+}
+
+class _Processor {
+  final FileSystem fileSystem;
+  final UriTranslator uriTranslator;
+  final int verbosityLevel;
+
+  final Stopwatch textualOutlineStopwatch = new Stopwatch();
+  final Stopwatch getAstStopwatch = new Stopwatch();
+  final Stopwatch extractIdentifierStopwatch = new Stopwatch();
+
+  Map<Uri, TopLevel> parsed = {};
+
+  _Processor(this.verbosityLevel, this.fileSystem, this.uriTranslator);
+
+  void log(String s) {
+    if (verbosityLevel <= 0) return;
+    print(s);
+  }
+
+  Future<TopLevel> preprocessUri(Uri importUri, {Uri? partOf}) async {
+    if (verbosityLevel >= 20) log("$importUri =>");
+    Uri fileUri = importUri;
+    if (importUri.scheme == "package") {
+      fileUri = uriTranslator.translate(importUri)!;
+    }
+    if (verbosityLevel >= 20) log("$fileUri");
+    final List<int> bytes =
+        await fileSystem.entityForUri(fileUri).readAsBytes();
+    // TODO: Support updating the configuration; also default it to match
+    // the package version.
+    final ScannerConfiguration configuration = new ScannerConfiguration(
+        enableExtensionMethods: true,
+        enableNonNullable: true,
+        enableTripleShift: true);
+    textualOutlineStopwatch.start();
+    final String? outlined = textualOutline(bytes, configuration);
+    textualOutlineStopwatch.stop();
+    if (outlined == null) throw "Textual outline returned null";
+    final List<int> bytes2 = utf8.encode(outlined);
+    getAstStopwatch.start();
+    List<Token> languageVersionsSeen = [];
+    final ParserAstNode ast = getAST(bytes2,
+        enableExtensionMethods: configuration.enableExtensionMethods,
+        enableNonNullable: configuration.enableNonNullable,
+        enableTripleShift: configuration.enableTripleShift,
+        languageVersionsSeen: languageVersionsSeen);
+    getAstStopwatch.stop();
+
+    _ParserAstVisitor visitor = new _ParserAstVisitor(
+        verbosityLevel, outlined, importUri, partOf, ast, languageVersionsSeen);
+    TopLevel topLevel = visitor.currentContainer as TopLevel;
+    if (parsed[importUri] != null) throw "$importUri already set?!?";
+    parsed[importUri] = topLevel;
+    visitor.accept(ast);
+    topLevel.buildScope();
+
+    _IdentifierExtractor identifierExtractor = new _IdentifierExtractor();
+    extractIdentifierStopwatch.start();
+    identifierExtractor.extract(ast);
+    extractIdentifierStopwatch.stop();
+    for (IdentifierHandle identifier in identifierExtractor.identifiers) {
+      if (identifier.context == IdentifierContext.typeVariableDeclaration) {
+        // Hack: Put type variable declarations into scope so any overlap in
+        // name doesn't mark usages (e.g. a class E shouldn't be marked if we're
+        // talking about the type variable E).
+        ParserAstNode content = identifier;
+        AstNode? nearestAstNode = visitor.map[content];
+        while (nearestAstNode == null && content.parent != null) {
+          content = content.parent!;
+          nearestAstNode = visitor.map[content];
+        }
+        if (nearestAstNode == null) {
+          content = identifier;
+          nearestAstNode = visitor.map[content];
+          while (nearestAstNode == null && content.parent != null) {
+            content = content.parent!;
+            nearestAstNode = visitor.map[content];
+          }
+
+          StringBuffer sb = new StringBuffer();
+          Token t = identifier.token;
+          // for(int i = 0; i < 10; i++) {
+          //   t = t.previous!;
+          // }
+          for (int i = 0; i < 20; i++) {
+            sb.write("$t ");
+            t = t.next!;
+          }
+          throw "$fileUri --- couldn't even find nearest ast node for "
+              "${identifier.token} :( -- context $sb";
+        }
+        (nearestAstNode.scope[identifier.token.lexeme] ??= [])
+            .add(nearestAstNode);
+      }
+    }
+
+    return topLevel;
+  }
+
+  Future<void> _premarkTopLevel(List<_TopLevelAndAstNode> worklist,
+      Set<TopLevel> closed, TopLevel entrypointish) async {
+    if (!closed.add(entrypointish)) return;
+
+    for (AstNode child in entrypointish.children) {
+      child.marked = Coloring.Marked;
+      worklist.add(new _TopLevelAndAstNode(entrypointish, child));
+
+      if (child is Part) {
+        if (child.uri.scheme != "dart") {
+          TopLevel partTopLevel = parsed[child.uri] ??
+              await preprocessUri(child.uri, partOf: entrypointish.uri);
+          await _premarkTopLevel(worklist, closed, partTopLevel);
+        }
+      } else if (child is Export) {
+        for (Uri importedUri in child.uris) {
+          if (importedUri.scheme != "dart") {
+            TopLevel exportTopLevel =
+                parsed[importedUri] ?? await preprocessUri(importedUri);
+            await _premarkTopLevel(worklist, closed, exportTopLevel);
+          }
+        }
+      }
+    }
+  }
+
+  Future<List<TopLevel>> _preprocessImportsAsNeeded(
+      Map<TopLevel, List<TopLevel>> imports, TopLevel topLevel) async {
+    List<TopLevel>? imported = imports[topLevel];
+    if (imported == null) {
+      // Process all imports.
+      imported = [];
+      imports[topLevel] = imported;
+      for (AstNode child in topLevel.children) {
+        if (child is Import) {
+          child.marked = Coloring.Marked;
+          for (Uri importedUri in child.uris) {
+            if (importedUri.scheme != "dart") {
+              TopLevel importedTopLevel =
+                  parsed[importedUri] ?? await preprocessUri(importedUri);
+              imported.add(importedTopLevel);
+            }
+          }
+        } else if (child is PartOf) {
+          child.marked = Coloring.Marked;
+          if (child.partOfUri.scheme != "dart") {
+            TopLevel part = parsed[child.partOfUri]!;
+            List<TopLevel> importsFromPart =
+                await _preprocessImportsAsNeeded(imports, part);
+            imported.addAll(importsFromPart);
+          }
+        }
+      }
+    }
+    return imported;
+  }
+
+  Future<Map<Uri, String>> calculate(List<TopLevel> entryPoints) async {
+    List<_TopLevelAndAstNode> worklist = [];
+    Map<TopLevel, List<TopLevel>> imports = {};
+
+    // Mark all top-level in entry point. Also include parts and exports (and
+    // exports exports etc) of the entry point.
+    Set<TopLevel> closed = {};
+    for (TopLevel entryPoint in entryPoints) {
+      await _premarkTopLevel(worklist, closed, entryPoint);
+    }
+
+    Map<TopLevel, Set<String>> lookupsAll = {};
+    Map<TopLevel, List<String>> lookupsWorklist = {};
+    while (worklist.isNotEmpty || lookupsWorklist.isNotEmpty) {
+      while (worklist.isNotEmpty) {
+        _TopLevelAndAstNode entry = worklist.removeLast();
+        if (verbosityLevel >= 20) {
+          log("\n-----\nProcessing ${entry.entry.node.toString()}");
+        }
+        _IdentifierExtractor identifierExtractor = new _IdentifierExtractor();
+        identifierExtractor.extract(entry.entry.node);
+        if (verbosityLevel >= 20) {
+          log("Found ${identifierExtractor.identifiers}");
+        }
+        List<AstNode>? prevLookupResult;
+        nextIdentifier:
+        for (IdentifierHandle identifier in identifierExtractor.identifiers) {
+          ParserAstNode content = identifier;
+          AstNode? nearestAstNode = entry.topLevel.map[content];
+          while (nearestAstNode == null && content.parent != null) {
+            content = content.parent!;
+            nearestAstNode = entry.topLevel.map[content];
+          }
+          if (nearestAstNode == null) {
+            throw "couldn't even find nearest ast node for "
+                "${identifier.token} :(";
+          }
+
+          if (identifier.context == IdentifierContext.typeReference ||
+              identifier.context == IdentifierContext.prefixedTypeReference ||
+              identifier.context ==
+                  IdentifierContext.typeReferenceContinuation ||
+              identifier.context == IdentifierContext.constructorReference ||
+              identifier.context ==
+                  IdentifierContext.constructorReferenceContinuation ||
+              identifier.context == IdentifierContext.expression ||
+              identifier.context == IdentifierContext.expressionContinuation ||
+              identifier.context == IdentifierContext.metadataReference ||
+              identifier.context == IdentifierContext.metadataContinuation) {
+            bool lookupInThisScope = true;
+            if (!identifier.context.isContinuation) {
+              prevLookupResult = null;
+            } else if (prevLookupResult != null) {
+              // In continuation.
+              // either 0 or all should be imports.
+              for (AstNode prevResult in prevLookupResult) {
+                if (prevResult is Import) {
+                  lookupInThisScope = false;
+                } else {
+                  continue nextIdentifier;
+                }
+              }
+            } else {
+              // Still in continuation --- but prev lookup didn't yield
+              // anything. We shouldn't search for the continuation part in this
+              // scope (and thus skip looking in imports).
+              lookupInThisScope = false;
+            }
+            if (verbosityLevel >= 20) {
+              log("${identifier.token} (${identifier.context})");
+            }
+
+            // Now we need parts at this point. Either we're in the entry point
+            // in which case parts was read by [_premarkTopLevel], or we're here
+            // via lookups on an import, where parts were read too.
+            List<AstNode>? lookedUp;
+            if (lookupInThisScope) {
+              lookedUp = findInScope(
+                  identifier.token.lexeme, nearestAstNode, entry.topLevel);
+              prevLookupResult = lookedUp;
+            }
+            if (lookedUp != null) {
+              for (AstNode found in lookedUp) {
+                if (verbosityLevel >= 20) log(" => found $found");
+                if (found.marked == Coloring.Untouched) {
+                  found.marked = Coloring.Marked;
+                  TopLevel foundTopLevel = entry.topLevel;
+                  if (found.parent is TopLevel) {
+                    foundTopLevel = found.parent as TopLevel;
+                  }
+                  worklist.add(new _TopLevelAndAstNode(foundTopLevel, found));
+                }
+              }
+            } else {
+              if (verbosityLevel >= 20) {
+                log("=> Should find this via an import probably?");
+              }
+
+              List<TopLevel> imported =
+                  await _preprocessImportsAsNeeded(imports, entry.topLevel);
+
+              Set<Uri>? wantedImportUrls;
+              if (!lookupInThisScope && prevLookupResult != null) {
+                for (AstNode castMeAsImport in prevLookupResult) {
+                  Import import = castMeAsImport as Import;
+                  assert(import.asName != null);
+                  (wantedImportUrls ??= {}).addAll(import.uris);
+                }
+              }
+
+              for (TopLevel other in imported) {
+                if (!lookupInThisScope && prevLookupResult != null) {
+                  assert(wantedImportUrls != null);
+                  if (!wantedImportUrls!.contains(other.uri)) continue;
+                }
+
+                Set<String> lookupStrings = lookupsAll[other] ??= {};
+                if (lookupStrings.add(identifier.token.lexeme)) {
+                  List<String> lookupStringsWorklist =
+                      lookupsWorklist[other] ??= [];
+                  lookupStringsWorklist.add(identifier.token.lexeme);
+                }
+              }
+            }
+          } else {
+            if (verbosityLevel >= 30) {
+              log("Ignoring ${identifier.token} as it's a "
+                  "${identifier.context}");
+            }
+          }
+        }
+      }
+      Map<TopLevel, List<String>> lookupsWorklistTmp = {};
+      for (MapEntry<TopLevel, List<String>> lookups
+          in lookupsWorklist.entries) {
+        TopLevel topLevel = lookups.key;
+        // We have to make the same lookups in parts and exports too.
+        for (AstNode child in topLevel.children) {
+          TopLevel? other;
+          if (child is Part) {
+            child.marked = Coloring.Marked;
+            // do stuff to part.
+            if (child.uri.scheme != "dart") {
+              other = parsed[child.uri] ??
+                  await preprocessUri(child.uri, partOf: topLevel.uri);
+            }
+          } else if (child is Export) {
+            child.marked = Coloring.Marked;
+            // do stuff to export.
+            for (Uri importedUri in child.uris) {
+              if (importedUri.scheme != "dart") {
+                other = parsed[importedUri] ?? await preprocessUri(importedUri);
+              }
+            }
+          } else if (child is Extension) {
+            // TODO: Maybe put on a list to process later and only include if
+            // the on-class is included?
+            if (child.marked == Coloring.Untouched) {
+              child.marked = Coloring.Marked;
+              worklist.add(new _TopLevelAndAstNode(topLevel, child));
+            }
+          }
+          if (other != null) {
+            Set<String> lookupStrings = lookupsAll[other] ??= {};
+            for (String identifier in lookups.value) {
+              if (lookupStrings.add(identifier)) {
+                List<String> lookupStringsWorklist =
+                    lookupsWorklistTmp[other] ??= [];
+                lookupStringsWorklist.add(identifier);
+              }
+            }
+          }
+        }
+
+        for (String identifier in lookups.value) {
+          List<AstNode>? foundInScope = topLevel.findInScope(identifier);
+          if (foundInScope != null) {
+            for (AstNode found in foundInScope) {
+              if (found.marked == Coloring.Untouched) {
+                found.marked = Coloring.Marked;
+                worklist.add(new _TopLevelAndAstNode(topLevel, found));
+              }
+              if (verbosityLevel >= 20) {
+                log(" => found $found via import (${found.marked})");
+              }
+            }
+          }
+        }
+      }
+      lookupsWorklist = lookupsWorklistTmp;
+    }
+
+    if (verbosityLevel >= 40) {
+      log("\n\n---------\n\n");
+      log(parsed.toString());
+      log("\n\n---------\n\n");
+    }
+
+    // Extract.
+    int count = 0;
+    Map<Uri, String> result = {};
+    // We only read imports if we need to lookup in them, but if a import
+    // statement is included in the output the file has to exist if it actually
+    // exists to not get a compilation error.
+    Set<Uri> imported = {};
+    for (MapEntry<Uri, TopLevel> entry in parsed.entries) {
+      if (verbosityLevel >= 40) log("${entry.key}:");
+      StringBuffer sb = new StringBuffer();
+      for (AstNode child in entry.value.children) {
+        if (child.marked == Coloring.Marked) {
+          String substring = entry.value.sourceText.substring(
+              child.startInclusive.charOffset, child.endInclusive.charEnd);
+          sb.writeln(substring);
+          if (verbosityLevel >= 40) {
+            log(substring);
+          }
+          if (child is Import) {
+            for (Uri importedUri in child.uris) {
+              if (importedUri.scheme != "dart") {
+                imported.add(importedUri);
+              }
+            }
+          }
+        }
+      }
+      if (sb.isNotEmpty) count++;
+      Uri uri = entry.key;
+      Uri fileUri = uri;
+      if (uri.scheme == "package") {
+        fileUri = uriTranslator.translate(uri)!;
+      }
+      result[fileUri] = sb.toString();
+    }
+    for (Uri uri in imported) {
+      TopLevel? topLevel = parsed[uri];
+      if (topLevel != null) continue;
+      // uri imports a file we haven't read. Check if it exists and include it
+      // as an empty file if it does.
+      Uri fileUri = uri;
+      if (uri.scheme == "package") {
+        fileUri = uriTranslator.translate(uri)!;
+      }
+      if (await fileSystem.entityForUri(fileUri).exists()) {
+        result[fileUri] = "";
+      }
+    }
+
+    print("=> Long story short got it to $count non-empty files...");
+
+    return result;
+  }
+
+  List<AstNode>? findInScope(
+      String name, AstNode nearestAstNode, TopLevel topLevel,
+      {Set<TopLevel>? visited}) {
+    List<AstNode>? result;
+    result = nearestAstNode.findInScope(name);
+    if (result != null) return result;
+    for (AstNode child in topLevel.children) {
+      if (child is Part) {
+        visited ??= {topLevel};
+        TopLevel partTopLevel = parsed[child.uri]!;
+        if (visited.add(partTopLevel)) {
+          result =
+              findInScope(name, partTopLevel, partTopLevel, visited: visited);
+          if (result != null) return result;
+        }
+      } else if (child is PartOf) {
+        visited ??= {topLevel};
+        TopLevel partOwnerTopLevel = parsed[child.partOfUri]!;
+        if (visited.add(partOwnerTopLevel)) {
+          result = findInScope(name, partOwnerTopLevel, partOwnerTopLevel,
+              visited: visited);
+          if (result != null) return result;
+        }
+      }
+    }
+    return null;
+  }
+}
+
+class _TopLevelAndAstNode {
+  final TopLevel topLevel;
+  final AstNode entry;
+
+  _TopLevelAndAstNode(this.topLevel, this.entry);
+}
+
+class _IdentifierExtractor {
+  List<IdentifierHandle> identifiers = [];
+
+  void extract(ParserAstNode ast) {
+    if (ast is IdentifierHandle) {
+      identifiers.add(ast);
+    }
+    List<ParserAstNode>? children = ast.children;
+    if (children != null) {
+      for (ParserAstNode child in children) {
+        extract(child);
+      }
+    }
+  }
+}
+
+class _ParserAstVisitor extends ParserAstVisitor {
+  final Uri uri;
+  final Uri? partOfUri;
+  late Container currentContainer;
+  final Map<ParserAstNode, AstNode> map = {};
+  final int verbosityLevel;
+  final List<Token> languageVersionsSeen;
+
+  _ParserAstVisitor(this.verbosityLevel, String sourceText, this.uri,
+      this.partOfUri, ParserAstNode rootAst, this.languageVersionsSeen) {
+    currentContainer = new TopLevel(sourceText, uri, rootAst, map);
+    if (languageVersionsSeen.isNotEmpty) {
+      // Use first one.
+      Token languageVersion = languageVersionsSeen.first;
+      ParserAstNode dummyNode = new NoInitializersHandle(ParserAstType.HANDLE);
+      LanguageVersion version =
+          new LanguageVersion(dummyNode, languageVersion, languageVersion);
+      version.marked = Coloring.Marked;
+      currentContainer.addChild(version, map);
+    }
+  }
+
+  void log(String s) {
+    if (verbosityLevel <= 0) return;
+    Container? x = currentContainer.parent;
+    int level = 0;
+    while (x != null) {
+      level++;
+      x = x.parent;
+    }
+    print(" " * level + s);
+  }
+
+  @override
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
+
+    log("Hello from class ${identifier.token}");
+
+    Class cls = new Class(
+        parent, identifier.token.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(cls, map);
+
+    Container previousContainer = currentContainer;
+    currentContainer = cls;
+    super.visitClass(node, startInclusive, endInclusive);
+    currentContainer = previousContainer;
+  }
+
+  @override
+  void visitClassConstructor(
+      ClassConstructorEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Class);
+    List<IdentifierHandle> ids = node.getIdentifiers();
+    if (ids.length == 1) {
+      ClassConstructor classConstructor = new ClassConstructor(
+          node, ids.single.token.lexeme, startInclusive, endInclusive);
+      currentContainer.addChild(classConstructor, map);
+      log("Hello from constructor ${ids.single.token}");
+    } else if (ids.length == 2) {
+      ClassConstructor classConstructor = new ClassConstructor(node,
+          "${ids.first.token}.${ids.last.token}", startInclusive, endInclusive);
+      map[node] = classConstructor;
+      currentContainer.addChild(classConstructor, map);
+      log("Hello from constructor ${ids.first.token}.${ids.last.token}");
+    } else {
+      throw "Unexpected identifiers in class constructor";
+    }
+
+    super.visitClassConstructor(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitClassFactoryMethod(
+      ClassFactoryMethodEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Class);
+    List<IdentifierHandle> ids = node.getIdentifiers();
+    if (ids.length == 1) {
+      ClassFactoryMethod classFactoryMethod = new ClassFactoryMethod(
+          node, ids.single.token.lexeme, startInclusive, endInclusive);
+      currentContainer.addChild(classFactoryMethod, map);
+      log("Hello from factory method ${ids.single.token}");
+    } else if (ids.length == 2) {
+      ClassFactoryMethod classFactoryMethod = new ClassFactoryMethod(node,
+          "${ids.first.token}.${ids.last.token}", startInclusive, endInclusive);
+      map[node] = classFactoryMethod;
+      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}";
+    }
+
+    super.visitClassFactoryMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitClassFields(
+      ClassFieldsEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Class);
+    List<String> fields =
+        node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
+    ClassFields classFields =
+        new ClassFields(node, fields, startInclusive, endInclusive);
+    currentContainer.addChild(classFields, map);
+    log("Hello from class fields ${fields.join(", ")}");
+    super.visitClassFields(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitClassMethod(
+      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}";
+    }
+    ClassMethod classMethod =
+        new ClassMethod(node, identifier, startInclusive, endInclusive);
+    currentContainer.addChild(classMethod, map);
+    log("Hello from class method $identifier");
+    super.visitClassMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {
+    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);
+    currentContainer.addChild(e, map);
+
+    log("Hello from enum ${ids.first.token} with content "
+        "${ids.skip(1).map((e) => e.token).join(", ")}");
+    super.visitEnum(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {
+    String uriString = node.getExportUriString();
+    Uri exportUri = uri.resolve(uriString);
+    List<String>? conditionalUriStrings = node.getConditionalExportUriStrings();
+    List<Uri>? conditionalUris;
+    if (conditionalUriStrings != null) {
+      conditionalUris = [];
+      for (String conditionalUri in conditionalUriStrings) {
+        conditionalUris.add(uri.resolve(conditionalUri));
+      }
+    }
+    // TODO: Use 'show' and 'hide' stuff.
+    Export e = new Export(
+        node, exportUri, conditionalUris, startInclusive, endInclusive);
+    currentContainer.addChild(e, map);
+    log("Hello export");
+  }
+
+  @override
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    ExtensionDeclarationBegin begin =
+        node.children!.first as ExtensionDeclarationBegin;
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    log("Hello from extension ${begin.name}");
+    Extension extension =
+        new Extension(parent, begin.name?.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(extension, map);
+
+    Container previousContainer = currentContainer;
+    currentContainer = extension;
+    super.visitExtension(node, startInclusive, endInclusive);
+    currentContainer = previousContainer;
+  }
+
+  @override
+  void visitExtensionConstructor(
+      ExtensionConstructorEnd node, Token startInclusive, Token endInclusive) {
+    // TODO: implement visitExtensionConstructor
+    throw node;
+  }
+
+  @override
+  void visitExtensionFactoryMethod(ExtensionFactoryMethodEnd node,
+      Token startInclusive, Token endInclusive) {
+    // TODO: implement visitExtensionFactoryMethod
+    throw node;
+  }
+
+  @override
+  void visitExtensionFields(
+      ExtensionFieldsEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Extension);
+    List<String> fields =
+        node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
+    ExtensionFields classFields =
+        new ExtensionFields(node, fields, startInclusive, endInclusive);
+    currentContainer.addChild(classFields, map);
+    log("Hello from extension fields ${fields.join(", ")}");
+    super.visitExtensionFields(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitExtensionMethod(
+      ExtensionMethodEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Extension);
+    ExtensionMethod extensionMethod = new ExtensionMethod(
+        node, node.getNameIdentifier(), startInclusive, endInclusive);
+    currentContainer.addChild(extensionMethod, map);
+    log("Hello from extension method ${node.getNameIdentifier()}");
+    super.visitExtensionMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {
+    IdentifierHandle? prefix = node.getImportPrefix();
+    String uriString = node.getImportUriString();
+    Uri importUri = uri.resolve(uriString);
+    List<String>? conditionalUriStrings = node.getConditionalImportUriStrings();
+    List<Uri>? conditionalUris;
+    if (conditionalUriStrings != null) {
+      conditionalUris = [];
+      for (String conditionalUri in conditionalUriStrings) {
+        conditionalUris.add(uri.resolve(conditionalUri));
+      }
+    }
+    // TODO: Use 'show' and 'hide' stuff.
+
+    // endInclusive can be null on syntax errors and there's recovery of the
+    // import. For now we'll ignore this.
+    Import i = new Import(node, importUri, conditionalUris,
+        prefix?.token.lexeme, startInclusive, endInclusive!);
+    currentContainer.addChild(i, map);
+    if (prefix == null) {
+      log("Hello import");
+    } else {
+      log("Hello import as '${prefix.token}'");
+    }
+  }
+
+  @override
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {
+    LibraryName name = new LibraryName(node, startInclusive, endInclusive);
+    name.marked = Coloring.Marked;
+    currentContainer.addChild(name, map);
+  }
+
+  @override
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {
+    Metadata m = new Metadata(node, startInclusive, endInclusive);
+    currentContainer.addChild(m, map);
+  }
+
+  @override
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
+    log("Hello from mixin ${identifier.token}");
+
+    Mixin mixin = new Mixin(
+        parent, identifier.token.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(mixin, map);
+
+    Container previousContainer = currentContainer;
+    currentContainer = mixin;
+    super.visitMixin(node, startInclusive, endInclusive);
+    currentContainer = previousContainer;
+  }
+
+  @override
+  void visitMixinFields(
+      MixinFieldsEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Mixin);
+    List<String> fields =
+        node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
+    MixinFields mixinFields =
+        new MixinFields(node, fields, startInclusive, endInclusive);
+    currentContainer.addChild(mixinFields, map);
+    log("Hello from mixin fields ${fields.join(", ")}");
+    super.visitMixinFields(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitMixinMethod(
+      MixinMethodEnd node, Token startInclusive, Token endInclusive) {
+    assert(currentContainer is Mixin);
+    MixinMethod classMethod = new MixinMethod(
+        node, node.getNameIdentifier(), startInclusive, endInclusive);
+    currentContainer.addChild(classMethod, map);
+    log("Hello from mixin method ${node.getNameIdentifier()}");
+    super.visitMixinMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
+    log("Hello from named mixin ${identifier.token}");
+
+    Mixin mixin = new Mixin(
+        parent, identifier.token.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(mixin, map);
+
+    Container previousContainer = currentContainer;
+    currentContainer = mixin;
+    super.visitNamedMixin(node, startInclusive, endInclusive);
+    currentContainer = previousContainer;
+  }
+
+  @override
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {
+    String uriString = node.getPartUriString();
+    Uri partUri = uri.resolve(uriString);
+
+    Part i = new Part(node, partUri, startInclusive, endInclusive);
+    currentContainer.addChild(i, map);
+    log("Hello part");
+  }
+
+  @override
+  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.
+    PartOf partof = new PartOf(node, partOfUri!, startInclusive, endInclusive);
+    partof.marked = Coloring.Marked;
+    currentContainer.addChild(partof, map);
+  }
+
+  @override
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {
+    List<String> fields =
+        node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
+    TopLevelFields f =
+        new TopLevelFields(node, fields, startInclusive, endInclusive);
+    currentContainer.addChild(f, map);
+    log("Hello from top level fields ${fields.join(", ")}");
+    super.visitTopLevelFields(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelMethod m = new TopLevelMethod(node,
+        node.getNameIdentifier().token.lexeme, startInclusive, endInclusive);
+    currentContainer.addChild(m, map);
+    log("Hello from top level method ${node.getNameIdentifier().token}");
+    super.visitTopLevelMethod(node, startInclusive, endInclusive);
+  }
+
+  @override
+  void visitTypedef(TypedefEnd node, Token startInclusive, Token endInclusive) {
+    Typedef t = new Typedef(node, node.getNameIdentifier().token.lexeme,
+        startInclusive, endInclusive);
+    currentContainer.addChild(t, map);
+    log("Hello from typedef ${node.getNameIdentifier().token}");
+    super.visitTypedef(node, startInclusive, endInclusive);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast.dart b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
new file mode 100644
index 0000000..3b131cf
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
@@ -0,0 +1,1579 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:typed_data' show Uint8List;
+
+import 'dart:io' show File;
+
+import 'package:_fe_analyzer_shared/src/messages/codes.dart';
+import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
+    show ScannerConfiguration;
+
+import 'package:_fe_analyzer_shared/src/parser/parser.dart'
+    show ClassMemberParser, Parser;
+
+import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
+    show Utf8BytesScanner;
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
+
+import 'package:_fe_analyzer_shared/src/parser/listener.dart'
+    show UnescapeErrorListener;
+
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+
+import 'package:_fe_analyzer_shared/src/parser/quote.dart' show unescapeString;
+
+import '../source/diet_parser.dart';
+
+import 'parser_ast_helper.dart';
+
+CompilationUnitEnd getAST(List<int> rawBytes,
+    {bool includeBody: true,
+    bool includeComments: false,
+    bool enableExtensionMethods: false,
+    bool enableNonNullable: false,
+    bool enableTripleShift: false,
+    List<Token>? languageVersionsSeen}) {
+  Uint8List bytes = new Uint8List(rawBytes.length + 1);
+  bytes.setRange(0, rawBytes.length, rawBytes);
+
+  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
+      enableExtensionMethods: enableExtensionMethods,
+      enableNonNullable: enableNonNullable,
+      enableTripleShift: enableTripleShift);
+
+  Utf8BytesScanner scanner = new Utf8BytesScanner(
+    bytes,
+    includeComments: includeComments,
+    configuration: scannerConfiguration,
+    languageVersionChanged: (scanner, languageVersion) {
+      // For now don't do anything, but having it (making it non-null) means the
+      // configuration won't be reset.
+      languageVersionsSeen?.add(languageVersion);
+    },
+  );
+  Token firstToken = scanner.tokenize();
+  // ignore: unnecessary_null_comparison
+  if (firstToken == null) {
+    throw "firstToken is null";
+  }
+
+  ParserASTListener listener = new ParserASTListener();
+  Parser parser;
+  if (includeBody) {
+    parser = new Parser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+  } else {
+    parser = new ClassMemberParser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+  }
+  parser.parseUnit(firstToken);
+  return listener.data.single as CompilationUnitEnd;
+}
+
+/// Best-effort visitor for ParserAstNode that visits top-level entries
+/// and class members only (i.e. no bodies, no field initializer content, no
+/// names etc).
+class ParserAstVisitor {
+  void accept(ParserAstNode node) {
+    if (node is CompilationUnitEnd ||
+        node is TopLevelDeclarationEnd ||
+        node is ClassOrMixinOrExtensionBodyEnd ||
+        node is MemberEnd) {
+      visitChildren(node);
+      return;
+    }
+
+    if (node.type == ParserAstType.BEGIN) {
+      // Ignored. These are basically just dummy nodes anyway.
+      assert(node.children == null);
+      return;
+    }
+    if (node.type == ParserAstType.HANDLE) {
+      // Ignored at least for know.
+      assert(node.children == null);
+      return;
+    }
+    if (node is TypeVariablesEnd ||
+        node is TypeArgumentsEnd ||
+        node is TypeListEnd ||
+        node is FunctionTypeEnd ||
+        node is BlockEnd) {
+      // Ignored at least for know.
+      return;
+    }
+    if (node is MetadataStarEnd) {
+      MetadataStarEnd metadata = node;
+      visitMetadataStar(metadata);
+      return;
+    }
+    if (node is TypedefEnd) {
+      TypedefEnd typedefDecl = node;
+      visitTypedef(
+          typedefDecl, typedefDecl.typedefKeyword, typedefDecl.endToken);
+      return;
+    }
+    if (node is ClassDeclarationEnd) {
+      ClassDeclarationEnd cls = node;
+      visitClass(cls, cls.beginToken, cls.endToken);
+      return;
+    }
+    if (node is TopLevelMethodEnd) {
+      TopLevelMethodEnd method = node;
+      visitTopLevelMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ClassMethodEnd) {
+      ClassMethodEnd method = node;
+      visitClassMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ExtensionMethodEnd) {
+      ExtensionMethodEnd method = node;
+      visitExtensionMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is MixinMethodEnd) {
+      MixinMethodEnd method = node;
+      visitMixinMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ImportEnd) {
+      ImportEnd import = node;
+      visitImport(import, import.importKeyword, import.semicolon);
+      return;
+    }
+    if (node is ExportEnd) {
+      ExportEnd export = node;
+      visitExport(export, export.exportKeyword, export.semicolon);
+      return;
+    }
+    if (node is TopLevelFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      TopLevelFieldsEnd fields = node;
+      visitTopLevelFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is ClassFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      ClassFieldsEnd fields = node;
+      visitClassFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is ExtensionFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      ExtensionFieldsEnd fields = node;
+      visitExtensionFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is MixinFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      MixinFieldsEnd fields = node;
+      visitMixinFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is NamedMixinApplicationEnd) {
+      NamedMixinApplicationEnd namedMixin = node;
+      visitNamedMixin(namedMixin, namedMixin.begin, namedMixin.endToken);
+      return;
+    }
+    if (node is MixinDeclarationEnd) {
+      MixinDeclarationEnd declaration = node;
+      visitMixin(declaration, declaration.mixinKeyword, declaration.endToken);
+      return;
+    }
+    if (node is EnumEnd) {
+      EnumEnd declaration = node;
+      visitEnum(declaration, declaration.enumKeyword,
+          declaration.leftBrace.endGroup!);
+      return;
+    }
+    if (node is LibraryNameEnd) {
+      LibraryNameEnd name = node;
+      visitLibraryName(name, name.libraryKeyword, name.semicolon);
+      return;
+    }
+    if (node is PartEnd) {
+      PartEnd part = node;
+      visitPart(part, part.partKeyword, part.semicolon);
+      return;
+    }
+    if (node is PartOfEnd) {
+      PartOfEnd partOf = node;
+      visitPartOf(partOf, partOf.partKeyword, partOf.semicolon);
+      return;
+    }
+    if (node is ExtensionDeclarationEnd) {
+      ExtensionDeclarationEnd ext = node;
+      visitExtension(ext, ext.extensionKeyword, ext.endToken);
+      return;
+    }
+    if (node is ClassConstructorEnd) {
+      ClassConstructorEnd decl = node;
+      visitClassConstructor(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ExtensionConstructorEnd) {
+      ExtensionConstructorEnd decl = node;
+      visitExtensionConstructor(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ClassFactoryMethodEnd) {
+      ClassFactoryMethodEnd decl = node;
+      visitClassFactoryMethod(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ExtensionFactoryMethodEnd) {
+      ExtensionFactoryMethodEnd decl = node;
+      visitExtensionFactoryMethod(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is MetadataEnd) {
+      MetadataEnd decl = node;
+      // TODO(jensj): endToken is not part of the metadata! It's the first token
+      // of the next thing.
+      visitMetadata(decl, decl.beginToken, decl.endToken.previous!);
+      return;
+    }
+
+    throw "Unknown: $node (${node.runtimeType} @ ${node.what})";
+  }
+
+  void visitChildren(ParserAstNode node) {
+    if (node.children == null) return;
+    final int numChildren = node.children!.length;
+    for (int i = 0; i < numChildren; i++) {
+      ParserAstNode child = node.children![i];
+      accept(child);
+    }
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTypedef(
+      TypedefEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitMetadataStar(MetadataStarEnd node) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassMethod(
+      ClassMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionMethod(
+      ExtensionMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMixinMethod(
+      MixinMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassFields(
+      ClassFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionFields(
+      ExtensionFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMixinFields(
+      MixinFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassConstructor(
+      ClassConstructorEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionConstructor(
+      ExtensionConstructorEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassFactoryMethod(
+      ClassFactoryMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionFactoryMethod(ExtensionFactoryMethodEnd node,
+      Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {}
+}
+
+extension GeneralASTContentExtension on ParserAstNode {
+  bool isClass() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! ClassDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ClassDeclarationEnd asClass() {
+    if (!isClass()) throw "Not class";
+    return children!.last as ClassDeclarationEnd;
+  }
+
+  bool isImport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! ImportEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ImportEnd asImport() {
+    if (!isImport()) throw "Not import";
+    return children!.last as ImportEnd;
+  }
+
+  bool isExport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! ExportEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ExportEnd asExport() {
+    if (!isExport()) throw "Not export";
+    return children!.last as ExportEnd;
+  }
+
+  bool isEnum() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! EnumEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  EnumEnd asEnum() {
+    if (!isEnum()) throw "Not enum";
+    return children!.last as EnumEnd;
+  }
+
+  bool isTypedef() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! TypedefEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TypedefEnd asTypedef() {
+    if (!isTypedef()) throw "Not typedef";
+    return children!.last as TypedefEnd;
+  }
+
+  bool isScript() {
+    if (this is! ScriptHandle) {
+      return false;
+    }
+    return true;
+  }
+
+  ScriptHandle asScript() {
+    if (!isScript()) throw "Not script";
+    return this as ScriptHandle;
+  }
+
+  bool isExtension() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! ExtensionDeclarationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! ExtensionDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ExtensionDeclarationEnd asExtension() {
+    if (!isExtension()) throw "Not extension";
+    return children!.last as ExtensionDeclarationEnd;
+  }
+
+  bool isInvalidTopLevelDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! InvalidTopLevelDeclarationHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isRecoverableError() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! RecoverableErrorHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isRecoverImport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! RecoverImportHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isMixinDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! MixinDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  MixinDeclarationEnd asMixinDeclaration() {
+    if (!isMixinDeclaration()) throw "Not mixin declaration";
+    return children!.last as MixinDeclarationEnd;
+  }
+
+  bool isNamedMixinDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! NamedMixinApplicationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  NamedMixinApplicationEnd asNamedMixinDeclaration() {
+    if (!isNamedMixinDeclaration()) throw "Not named mixin declaration";
+    return children!.last as NamedMixinApplicationEnd;
+  }
+
+  bool isTopLevelMethod() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! TopLevelMethodEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TopLevelMethodEnd asTopLevelMethod() {
+    if (!isTopLevelMethod()) throw "Not top level method";
+    return children!.last as TopLevelMethodEnd;
+  }
+
+  bool isTopLevelFields() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! TopLevelFieldsEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TopLevelFieldsEnd asTopLevelFields() {
+    if (!isTopLevelFields()) throw "Not top level fields";
+    return children!.last as TopLevelFieldsEnd;
+  }
+
+  bool isLibraryName() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! LibraryNameEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  LibraryNameEnd asLibraryName() {
+    if (!isLibraryName()) throw "Not library name";
+    return children!.last as LibraryNameEnd;
+  }
+
+  bool isPart() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! PartEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  PartEnd asPart() {
+    if (!isPart()) throw "Not part";
+    return children!.last as PartEnd;
+  }
+
+  bool isPartOf() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! PartOfEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  PartOfEnd asPartOf() {
+    if (!isPartOf()) throw "Not part of";
+    return children!.last as PartOfEnd;
+  }
+
+  bool isMetadata() {
+    if (this is! MetadataStarEnd) {
+      return false;
+    }
+    if (children!.first is! MetadataStarBegin) {
+      return false;
+    }
+    return true;
+  }
+
+  MetadataStarEnd asMetadata() {
+    if (!isMetadata()) throw "Not metadata";
+    return this as MetadataStarEnd;
+  }
+
+  bool isFunctionBody() {
+    if (this is BlockFunctionBodyEnd) return true;
+    return false;
+  }
+
+  BlockFunctionBodyEnd asFunctionBody() {
+    if (!isFunctionBody()) throw "Not function body";
+    return this as BlockFunctionBodyEnd;
+  }
+
+  List<E> recursivelyFind<E extends ParserAstNode>() {
+    Set<E> result = {};
+    _recursivelyFindInternal(this, result);
+    return result.toList();
+  }
+
+  static void _recursivelyFindInternal<E extends ParserAstNode>(
+      ParserAstNode node, Set<E> result) {
+    if (node is E) {
+      result.add(node);
+      return;
+    }
+    if (node.children == null) return;
+    for (ParserAstNode child in node.children!) {
+      _recursivelyFindInternal(child, result);
+    }
+  }
+
+  void debugDumpNodeRecursively({String indent = ""}) {
+    print("$indent${runtimeType} (${what}) "
+        "(${deprecatedArguments})");
+    if (children == null) return;
+    for (ParserAstNode child in children!) {
+      child.debugDumpNodeRecursively(indent: "  $indent");
+    }
+  }
+}
+
+extension MetadataStarExtension on MetadataStarEnd {
+  List<MetadataEnd> getMetadataEntries() {
+    List<MetadataEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (topLevel is! MetadataEnd) continue;
+      result.add(topLevel);
+    }
+    return result;
+  }
+}
+
+extension CompilationUnitExtension on CompilationUnitEnd {
+  List<TopLevelDeclarationEnd> getClasses() {
+    List<TopLevelDeclarationEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isClass()) continue;
+      result.add(topLevel as TopLevelDeclarationEnd);
+    }
+    return result;
+  }
+
+  List<TopLevelDeclarationEnd> getMixinDeclarations() {
+    List<TopLevelDeclarationEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isMixinDeclaration()) continue;
+      result.add(topLevel as TopLevelDeclarationEnd);
+    }
+    return result;
+  }
+
+  List<ImportEnd> getImports() {
+    List<ImportEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isImport()) continue;
+      result.add(topLevel.children!.last as ImportEnd);
+    }
+    return result;
+  }
+
+  List<ExportEnd> getExports() {
+    List<ExportEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isExport()) continue;
+      result.add(topLevel.children!.last as ExportEnd);
+    }
+    return result;
+  }
+
+  // List<MetadataStarEnd> getMetadata() {
+  //   List<MetadataStarEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isMetadata()) continue;
+  //     result.add(topLevel);
+  //   }
+  //   return result;
+  // }
+
+  // List<EnumEnd> getEnums() {
+  //   List<EnumEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isEnum()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<FunctionTypeAliasEnd> getTypedefs() {
+  //   List<FunctionTypeAliasEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isTypedef()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<MixinDeclarationEnd> getMixinDeclarations() {
+  //   List<MixinDeclarationEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isMixinDeclaration()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<TopLevelMethodEnd> getTopLevelMethods() {
+  //   List<TopLevelMethodEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isTopLevelMethod()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  CompilationUnitBegin getBegin() {
+    return children!.first as CompilationUnitBegin;
+  }
+}
+
+extension TopLevelDeclarationExtension on TopLevelDeclarationEnd {
+  IdentifierHandle getIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) return child;
+    }
+    throw "Not found.";
+  }
+
+  ClassDeclarationEnd getClassDeclaration() {
+    if (!isClass()) {
+      throw "Not a class";
+    }
+    for (ParserAstNode child in children!) {
+      if (child is ClassDeclarationEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+}
+
+extension MixinDeclarationExtension on MixinDeclarationEnd {
+  ClassOrMixinOrExtensionBodyEnd getClassOrMixinOrExtensionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassOrMixinOrExtensionBodyEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+}
+
+extension ClassDeclarationExtension on ClassDeclarationEnd {
+  ClassOrMixinOrExtensionBodyEnd getClassOrMixinOrExtensionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassOrMixinOrExtensionBodyEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+
+  ClassExtendsHandle getClassExtends() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassExtendsHandle) return child;
+    }
+    throw "Not found.";
+  }
+
+  ImplementsHandle getClassImplements() {
+    for (ParserAstNode child in children!) {
+      if (child is ImplementsHandle) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+
+  ClassWithClauseHandle? getClassWithClause() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassWithClauseHandle) {
+        return child;
+      }
+    }
+    return null;
+  }
+}
+
+extension ClassOrMixinBodyExtension on ClassOrMixinOrExtensionBodyEnd {
+  List<MemberEnd> getMembers() {
+    List<MemberEnd> members = [];
+    for (ParserAstNode child in children!) {
+      if (child is MemberEnd) {
+        members.add(child);
+      }
+    }
+    return members;
+  }
+}
+
+extension MemberExtension on MemberEnd {
+  bool isClassConstructor() {
+    ParserAstNode child = children![1];
+    if (child is ClassConstructorEnd) return true;
+    return false;
+  }
+
+  ClassConstructorEnd getClassConstructor() {
+    ParserAstNode child = children![1];
+    if (child is ClassConstructorEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassFactoryMethodEnd) return true;
+    return false;
+  }
+
+  ClassFactoryMethodEnd getClassFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassFactoryMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassFields() {
+    ParserAstNode child = children![1];
+    if (child is ClassFieldsEnd) return true;
+    return false;
+  }
+
+  ClassFieldsEnd getClassFields() {
+    ParserAstNode child = children![1];
+    if (child is ClassFieldsEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinFields() {
+    ParserAstNode child = children![1];
+    if (child is MixinFieldsEnd) return true;
+    return false;
+  }
+
+  MixinFieldsEnd getMixinFields() {
+    ParserAstNode child = children![1];
+    if (child is MixinFieldsEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinMethodEnd) return true;
+    return false;
+  }
+
+  MixinMethodEnd getMixinMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinFactoryMethodEnd) return true;
+    return false;
+  }
+
+  MixinFactoryMethodEnd getMixinFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinFactoryMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinConstructor() {
+    ParserAstNode child = children![1];
+    if (child is MixinConstructorEnd) return true;
+    return false;
+  }
+
+  MixinConstructorEnd getMixinConstructor() {
+    ParserAstNode child = children![1];
+    if (child is MixinConstructorEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassMethodEnd) return true;
+    return false;
+  }
+
+  ClassMethodEnd getClassMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassRecoverableError() {
+    ParserAstNode child = children![1];
+    if (child is RecoverableErrorHandle) return true;
+    return false;
+  }
+}
+
+extension MixinFieldsExtension on MixinFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ExtensionFieldsExtension on ExtensionFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ClassFieldsExtension on ClassFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+
+  TypeHandle? getFirstType() {
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle) return child;
+    }
+    return null;
+  }
+
+  FieldInitializerEnd? getFieldInitializer() {
+    for (ParserAstNode child in children!) {
+      if (child is FieldInitializerEnd) return child;
+    }
+    return null;
+  }
+}
+
+extension EnumExtension on EnumEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> ids = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) ids.add(child);
+    }
+    return ids;
+  }
+}
+
+extension ExtensionDeclarationExtension on ExtensionDeclarationEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> ids = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) ids.add(child);
+    }
+    return ids;
+  }
+}
+
+extension TopLevelMethodExtension on TopLevelMethodEnd {
+  IdentifierHandle getNameIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.topLevelFunctionDeclaration) {
+          return child;
+        }
+      }
+    }
+    throw "Didn't find the name identifier!";
+  }
+}
+
+extension TypedefExtension on TypedefEnd {
+  IdentifierHandle getNameIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.typedefDeclaration) {
+          return child;
+        }
+      }
+    }
+    throw "Didn't find the name identifier!";
+  }
+}
+
+extension ImportExtension on ImportEnd {
+  IdentifierHandle? getImportPrefix() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.importPrefixDeclaration) {
+          return child;
+        }
+      }
+    }
+    return null;
+  }
+
+  String getImportUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+
+  List<String>? getConditionalImportUriStrings() {
+    List<String>? result;
+    for (ParserAstNode child in children!) {
+      if (child is ConditionalUrisEnd) {
+        for (ParserAstNode child2 in child.children!) {
+          if (child2 is ConditionalUriEnd) {
+            LiteralStringEnd end = child2.children!.last as LiteralStringEnd;
+            LiteralStringBegin uri = end.children!.single as LiteralStringBegin;
+            (result ??= []).add(unescapeString(uri.token.lexeme, uri.token,
+                const UnescapeErrorListenerDummy()));
+          }
+        }
+        return result;
+      }
+    }
+    return result;
+  }
+}
+
+extension ExportExtension on ExportEnd {
+  String getExportUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+
+  List<String>? getConditionalExportUriStrings() {
+    List<String>? result;
+    for (ParserAstNode child in children!) {
+      if (child is ConditionalUrisEnd) {
+        for (ParserAstNode child2 in child.children!) {
+          if (child2 is ConditionalUriEnd) {
+            LiteralStringEnd end = child2.children!.last as LiteralStringEnd;
+            LiteralStringBegin uri = end.children!.single as LiteralStringBegin;
+            (result ??= []).add(unescapeString(uri.token.lexeme, uri.token,
+                const UnescapeErrorListenerDummy()));
+          }
+        }
+        return result;
+      }
+    }
+    return result;
+  }
+}
+
+extension PartExtension on PartEnd {
+  String getPartUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+}
+
+class UnescapeErrorListenerDummy implements UnescapeErrorListener {
+  const UnescapeErrorListenerDummy();
+
+  @override
+  void handleUnescapeError(
+      Message message, covariant location, int offset, int length) {
+    // Purposely doesn't do anything.
+  }
+}
+
+extension TopLevelFieldsExtension on TopLevelFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.topLevelVariableDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ClassMethodExtension on ClassMethodEnd {
+  BlockFunctionBodyEnd? getBlockFunctionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is BlockFunctionBodyEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle ||
+          child is FunctionTypeEnd) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension MixinMethodExtension on MixinMethodEnd {
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension ExtensionMethodExtension on ExtensionMethodEnd {
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension ClassFactoryMethodExtension on ClassFactoryMethodEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        result.add(child);
+      } else if (child is FormalParametersEnd) {
+        break;
+      }
+    }
+    return result;
+  }
+}
+
+extension ClassConstructorExtension on ClassConstructorEnd {
+  FormalParametersEnd getFormalParameters() {
+    for (ParserAstNode child in children!) {
+      if (child is FormalParametersEnd) {
+        return child;
+      }
+    }
+    throw "Not found";
+  }
+
+  InitializersEnd? getInitializers() {
+    for (ParserAstNode child in children!) {
+      if (child is InitializersEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  BlockFunctionBodyEnd? getBlockFunctionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is BlockFunctionBodyEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+}
+
+extension FormalParametersExtension on FormalParametersEnd {
+  List<FormalParameterEnd> getFormalParameters() {
+    List<FormalParameterEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is FormalParameterEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+
+  OptionalFormalParametersEnd? getOptionalFormalParameters() {
+    for (ParserAstNode child in children!) {
+      if (child is OptionalFormalParametersEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+}
+
+extension FormalParameterExtension on FormalParameterEnd {
+  FormalParameterBegin getBegin() {
+    return children!.first as FormalParameterBegin;
+  }
+}
+
+extension OptionalFormalParametersExtension on OptionalFormalParametersEnd {
+  List<FormalParameterEnd> getFormalParameters() {
+    List<FormalParameterEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is FormalParameterEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+}
+
+extension InitializersExtension on InitializersEnd {
+  List<InitializerEnd> getInitializers() {
+    List<InitializerEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is InitializerEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+
+  InitializersBegin getBegin() {
+    return children!.first as InitializersBegin;
+  }
+}
+
+extension InitializerExtension on InitializerEnd {
+  InitializerBegin getBegin() {
+    return children!.first as InitializerBegin;
+  }
+}
+
+void main(List<String> args) {
+  File f = new File(args[0]);
+  Uint8List data = f.readAsBytesSync();
+  ParserAstNode ast = getAST(data);
+  if (args.length > 1 && args[1] == "--benchmark") {
+    Stopwatch stopwatch = new Stopwatch()..start();
+    int numRuns = 100;
+    for (int i = 0; i < numRuns; i++) {
+      ParserAstNode ast2 = getAST(data);
+      if (ast.what != ast2.what) {
+        throw "Not the same result every time";
+      }
+    }
+    stopwatch.stop();
+    print("First $numRuns took ${stopwatch.elapsedMilliseconds} ms "
+        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
+    stopwatch = new Stopwatch()..start();
+    numRuns = 2500;
+    for (int i = 0; i < numRuns; i++) {
+      ParserAstNode ast2 = getAST(data);
+      if (ast.what != ast2.what) {
+        throw "Not the same result every time";
+      }
+    }
+    stopwatch.stop();
+    print("Next $numRuns took ${stopwatch.elapsedMilliseconds} ms "
+        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
+  } else {
+    print(ast);
+  }
+}
+
+class ParserASTListener extends AbstractParserAstListener {
+  @override
+  void seen(ParserAstNode entry) {
+    switch (entry.type) {
+      case ParserAstType.BEGIN:
+      case ParserAstType.HANDLE:
+        // This just adds stuff.
+        data.add(entry);
+        break;
+      case ParserAstType.END:
+        // End should gobble up everything until the corresponding begin (which
+        // should be the latest begin).
+        int? beginIndex;
+        for (int i = data.length - 1; i >= 0; i--) {
+          if (data[i].type == ParserAstType.BEGIN) {
+            beginIndex = i;
+            break;
+          }
+        }
+        if (beginIndex == null) {
+          throw "Couldn't find a begin for ${entry.what}. Has:\n"
+              "${data.map((e) => "${e.what}: ${e.type}").join("\n")}";
+        }
+        String begin = data[beginIndex].what;
+        String end = entry.what;
+        if (begin == end) {
+          // Exact match.
+        } else if (end == "TopLevelDeclaration" &&
+            (begin == "ExtensionDeclarationPrelude" ||
+                begin == "ClassOrMixinOrNamedMixinApplicationPrelude" ||
+                begin == "TopLevelMember" ||
+                begin == "UncategorizedTopLevelDeclaration")) {
+          // endTopLevelDeclaration is started by one of
+          // beginExtensionDeclarationPrelude,
+          // beginClassOrNamedMixinApplicationPrelude
+          // beginTopLevelMember or beginUncategorizedTopLevelDeclaration.
+        } else if (begin == "Method" &&
+            (end == "ClassConstructor" ||
+                end == "ClassMethod" ||
+                end == "ExtensionConstructor" ||
+                end == "ExtensionMethod" ||
+                end == "MixinConstructor" ||
+                end == "MixinMethod" ||
+                end == "EnumConstructor" ||
+                end == "EnumMethod")) {
+          // beginMethod is ended by one of endClassConstructor,
+          // endClassMethod, endExtensionMethod, endMixinConstructor,
+          // endMixinMethod, endEnumMethod or endEnumConstructor.
+        } else if (begin == "Fields" &&
+            (end == "TopLevelFields" ||
+                end == "ClassFields" ||
+                end == "MixinFields" ||
+                end == "ExtensionFields" ||
+                end == "EnumFields")) {
+          // beginFields is ended by one of endTopLevelFields, endMixinFields,
+          // endEnumFields or endExtensionFields.
+        } else if (begin == "ForStatement" && end == "ForIn") {
+          // beginForStatement is ended by either endForStatement or endForIn.
+        } else if (begin == "FactoryMethod" &&
+            (end == "ClassFactoryMethod" ||
+                end == "MixinFactoryMethod" ||
+                end == "ExtensionFactoryMethod" ||
+                end == "EnumFactoryMethod")) {
+          // beginFactoryMethod is ended by either endClassFactoryMethod,
+          // endMixinFactoryMethod, endExtensionFactoryMethod, or
+          // endEnumFactoryMethod.
+        } else if (begin == "ForControlFlow" && (end == "ForInControlFlow")) {
+          // beginForControlFlow is ended by either endForControlFlow or
+          // endForInControlFlow.
+        } else if (begin == "IfControlFlow" && (end == "IfElseControlFlow")) {
+          // beginIfControlFlow is ended by either endIfControlFlow or
+          // endIfElseControlFlow.
+        } else if (begin == "AwaitExpression" &&
+            (end == "InvalidAwaitExpression")) {
+          // beginAwaitExpression is ended by either endAwaitExpression or
+          // endInvalidAwaitExpression.
+        } else if (begin == "YieldStatement" &&
+            (end == "InvalidYieldStatement")) {
+          // beginYieldStatement is ended by either endYieldStatement or
+          // endInvalidYieldStatement.
+        } else {
+          throw "Unknown combination: begin$begin and end$end";
+        }
+        List<ParserAstNode> children = data.sublist(beginIndex);
+        for (ParserAstNode child in children) {
+          child.parent = entry;
+        }
+        data.length = beginIndex;
+        data.add(entry..children = children);
+        break;
+    }
+  }
+
+  @override
+  void reportVarianceModifierNotEnabled(Token? variance) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Uri get uri => throw new UnimplementedError();
+
+  @override
+  void logEvent(String name) {
+    throw new UnimplementedError();
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
new file mode 100644
index 0000000..d7140cd
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
@@ -0,0 +1,7198 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/parser/assert.dart';
+import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/constructor_reference_context.dart';
+import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+import 'package:_fe_analyzer_shared/src/parser/listener.dart';
+import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
+import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:front_end/src/fasta/messages.dart';
+
+// ignore_for_file: lines_longer_than_80_chars
+
+// THIS FILE IS AUTO GENERATED BY
+// 'tool/_fasta/parser_ast_helper_creator.dart'
+// Run this command to update it:
+// 'dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart'
+
+abstract class ParserAstNode {
+  final String what;
+  final ParserAstType type;
+  Map<String, Object?> get deprecatedArguments;
+  List<ParserAstNode>? children;
+  ParserAstNode? parent;
+
+  ParserAstNode(this.what, this.type);
+
+  // TODO(jensj): Compare two ASTs.
+}
+
+enum ParserAstType { BEGIN, END, HANDLE }
+
+abstract class AbstractParserAstListener implements Listener {
+  List<ParserAstNode> data = [];
+
+  void seen(ParserAstNode entry);
+
+  @override
+  void beginArguments(Token token) {
+    ArgumentsBegin data = new ArgumentsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    ArgumentsEnd data = new ArgumentsEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
+    AsyncModifierHandle data = new AsyncModifierHandle(ParserAstType.HANDLE,
+        asyncToken: asyncToken, starToken: starToken);
+    seen(data);
+  }
+
+  @override
+  void beginAwaitExpression(Token token) {
+    AwaitExpressionBegin data =
+        new AwaitExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endAwaitExpression(Token beginToken, Token endToken) {
+    AwaitExpressionEnd data = new AwaitExpressionEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endInvalidAwaitExpression(
+      Token beginToken, Token endToken, MessageCode errorCode) {
+    InvalidAwaitExpressionEnd data = new InvalidAwaitExpressionEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        endToken: endToken,
+        errorCode: errorCode);
+    seen(data);
+  }
+
+  @override
+  void beginBlock(Token token, BlockKind blockKind) {
+    BlockBegin data =
+        new BlockBegin(ParserAstType.BEGIN, token: token, blockKind: blockKind);
+    seen(data);
+  }
+
+  @override
+  void endBlock(
+      int count, Token beginToken, Token endToken, BlockKind blockKind) {
+    BlockEnd data = new BlockEnd(ParserAstType.END,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken,
+        blockKind: blockKind);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTopLevelBlock(Token token) {
+    InvalidTopLevelBlockHandle data =
+        new InvalidTopLevelBlockHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginCascade(Token token) {
+    CascadeBegin data = new CascadeBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCascade() {
+    CascadeEnd data = new CascadeEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void beginCaseExpression(Token caseKeyword) {
+    CaseExpressionBegin data =
+        new CaseExpressionBegin(ParserAstType.BEGIN, caseKeyword: caseKeyword);
+    seen(data);
+  }
+
+  @override
+  void endCaseExpression(Token colon) {
+    CaseExpressionEnd data =
+        new CaseExpressionEnd(ParserAstType.END, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginClassOrMixinOrExtensionBody(DeclarationKind kind, Token token) {
+    ClassOrMixinOrExtensionBodyBegin data =
+        new ClassOrMixinOrExtensionBodyBegin(ParserAstType.BEGIN,
+            kind: kind, token: token);
+    seen(data);
+  }
+
+  @override
+  void endClassOrMixinOrExtensionBody(
+      DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
+    ClassOrMixinOrExtensionBodyEnd data = new ClassOrMixinOrExtensionBodyEnd(
+        ParserAstType.END,
+        kind: kind,
+        memberCount: memberCount,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginClassOrMixinOrNamedMixinApplicationPrelude(Token token) {
+    ClassOrMixinOrNamedMixinApplicationPreludeBegin data =
+        new ClassOrMixinOrNamedMixinApplicationPreludeBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
+    ClassDeclarationBegin data = new ClassDeclarationBegin(ParserAstType.BEGIN,
+        begin: begin,
+        abstractToken: abstractToken,
+        macroToken: macroToken,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void handleClassExtends(Token? extendsKeyword, int typeCount) {
+    ClassExtendsHandle data = new ClassExtendsHandle(ParserAstType.HANDLE,
+        extendsKeyword: extendsKeyword, typeCount: typeCount);
+    seen(data);
+  }
+
+  @override
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
+    ImplementsHandle data = new ImplementsHandle(ParserAstType.HANDLE,
+        implementsKeyword: implementsKeyword, interfacesCount: interfacesCount);
+    seen(data);
+  }
+
+  @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    ExtensionShowHideHandle data = new ExtensionShowHideHandle(
+        ParserAstType.HANDLE,
+        showKeyword: showKeyword,
+        showElementCount: showElementCount,
+        hideKeyword: hideKeyword,
+        hideElementCount: hideElementCount);
+    seen(data);
+  }
+
+  @override
+  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
+    ClassHeaderHandle data = new ClassHeaderHandle(ParserAstType.HANDLE,
+        begin: begin, classKeyword: classKeyword, nativeToken: nativeToken);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverClassHeader() {
+    RecoverClassHeaderHandle data =
+        new RecoverClassHeaderHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endClassDeclaration(Token beginToken, Token endToken) {
+    ClassDeclarationEnd data = new ClassDeclarationEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginMixinDeclaration(Token mixinKeyword, Token name) {
+    MixinDeclarationBegin data = new MixinDeclarationBegin(ParserAstType.BEGIN,
+        mixinKeyword: mixinKeyword, name: name);
+    seen(data);
+  }
+
+  @override
+  void handleMixinOn(Token? onKeyword, int typeCount) {
+    MixinOnHandle data = new MixinOnHandle(ParserAstType.HANDLE,
+        onKeyword: onKeyword, typeCount: typeCount);
+    seen(data);
+  }
+
+  @override
+  void handleMixinHeader(Token mixinKeyword) {
+    MixinHeaderHandle data =
+        new MixinHeaderHandle(ParserAstType.HANDLE, mixinKeyword: mixinKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverMixinHeader() {
+    RecoverMixinHeaderHandle data =
+        new RecoverMixinHeaderHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
+    MixinDeclarationEnd data = new MixinDeclarationEnd(ParserAstType.END,
+        mixinKeyword: mixinKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginUncategorizedTopLevelDeclaration(Token token) {
+    UncategorizedTopLevelDeclarationBegin data =
+        new UncategorizedTopLevelDeclarationBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginExtensionDeclarationPrelude(Token extensionKeyword) {
+    ExtensionDeclarationPreludeBegin data =
+        new ExtensionDeclarationPreludeBegin(ParserAstType.BEGIN,
+            extensionKeyword: extensionKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
+    ExtensionDeclarationBegin data = new ExtensionDeclarationBegin(
+        ParserAstType.BEGIN,
+        extensionKeyword: extensionKeyword,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
+    ExtensionDeclarationEnd data = new ExtensionDeclarationEnd(
+        ParserAstType.END,
+        extensionKeyword: extensionKeyword,
+        typeKeyword: typeKeyword,
+        onKeyword: onKeyword,
+        showKeyword: showKeyword,
+        hideKeyword: hideKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginCombinators(Token token) {
+    CombinatorsBegin data =
+        new CombinatorsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCombinators(int count) {
+    CombinatorsEnd data = new CombinatorsEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginCompilationUnit(Token token) {
+    CompilationUnitBegin data =
+        new CompilationUnitBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleDirectivesOnly() {
+    DirectivesOnlyHandle data = new DirectivesOnlyHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endCompilationUnit(int count, Token token) {
+    CompilationUnitEnd data =
+        new CompilationUnitEnd(ParserAstType.END, count: count, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConstLiteral(Token token) {
+    ConstLiteralBegin data =
+        new ConstLiteralBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endConstLiteral(Token token) {
+    ConstLiteralEnd data = new ConstLiteralEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConstructorReference(Token start) {
+    ConstructorReferenceBegin data =
+        new ConstructorReferenceBegin(ParserAstType.BEGIN, start: start);
+    seen(data);
+  }
+
+  @override
+  void endConstructorReference(Token start, Token? periodBeforeName,
+      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
+    ConstructorReferenceEnd data = new ConstructorReferenceEnd(
+        ParserAstType.END,
+        start: start,
+        periodBeforeName: periodBeforeName,
+        endToken: endToken,
+        constructorReferenceContext: constructorReferenceContext);
+    seen(data);
+  }
+
+  @override
+  void beginDoWhileStatement(Token token) {
+    DoWhileStatementBegin data =
+        new DoWhileStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endDoWhileStatement(
+      Token doKeyword, Token whileKeyword, Token endToken) {
+    DoWhileStatementEnd data = new DoWhileStatementEnd(ParserAstType.END,
+        doKeyword: doKeyword, whileKeyword: whileKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginDoWhileStatementBody(Token token) {
+    DoWhileStatementBodyBegin data =
+        new DoWhileStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endDoWhileStatementBody(Token token) {
+    DoWhileStatementBodyEnd data =
+        new DoWhileStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginWhileStatementBody(Token token) {
+    WhileStatementBodyBegin data =
+        new WhileStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endWhileStatementBody(Token token) {
+    WhileStatementBodyEnd data =
+        new WhileStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginEnum(Token enumKeyword) {
+    EnumBegin data =
+        new EnumBegin(ParserAstType.BEGIN, enumKeyword: enumKeyword);
+    seen(data);
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+    EnumEnd data = new EnumEnd(ParserAstType.END,
+        enumKeyword: enumKeyword,
+        leftBrace: leftBrace,
+        memberCount: memberCount);
+    seen(data);
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    EnumConstructorEnd data = new EnumConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    EnumElementsHandle data = new EnumElementsHandle(ParserAstType.HANDLE,
+        elementsEndToken: elementsEndToken, elementsCount: elementsCount);
+    seen(data);
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    EnumHeaderHandle data = new EnumHeaderHandle(ParserAstType.HANDLE,
+        enumKeyword: enumKeyword, leftBrace: leftBrace);
+    seen(data);
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    EnumElementHandle data =
+        new EnumElementHandle(ParserAstType.HANDLE, beginToken: beginToken);
+    seen(data);
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    EnumFactoryMethodEnd data = new EnumFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginExport(Token token) {
+    ExportBegin data = new ExportBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endExport(Token exportKeyword, Token semicolon) {
+    ExportEnd data = new ExportEnd(ParserAstType.END,
+        exportKeyword: exportKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleExtraneousExpression(Token token, Message message) {
+    ExtraneousExpressionHandle data = new ExtraneousExpressionHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        message: message);
+    seen(data);
+  }
+
+  @override
+  void handleExpressionStatement(Token token) {
+    ExpressionStatementHandle data =
+        new ExpressionStatementHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFactoryMethod(DeclarationKind declarationKind, Token lastConsumed,
+      Token? externalToken, Token? constToken) {
+    FactoryMethodBegin data = new FactoryMethodBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        lastConsumed: lastConsumed,
+        externalToken: externalToken,
+        constToken: constToken);
+    seen(data);
+  }
+
+  @override
+  void endClassFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    ClassFactoryMethodEnd data = new ClassFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    MixinFactoryMethodEnd data = new MixinFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    ExtensionFactoryMethodEnd data = new ExtensionFactoryMethodEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
+    FormalParameterBegin data = new FormalParameterBegin(ParserAstType.BEGIN,
+        token: token,
+        kind: kind,
+        requiredToken: requiredToken,
+        covariantToken: covariantToken,
+        varFinalOrConst: varFinalOrConst);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameter(
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
+      Token nameToken,
+      Token? initializerStart,
+      Token? initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
+    FormalParameterEnd data = new FormalParameterEnd(ParserAstType.END,
+        thisKeyword: thisKeyword,
+        superKeyword: superKeyword,
+        periodAfterThisOrSuper: periodAfterThisOrSuper,
+        nameToken: nameToken,
+        initializerStart: initializerStart,
+        initializerEnd: initializerEnd,
+        kind: kind,
+        memberKind: memberKind);
+    seen(data);
+  }
+
+  @override
+  void handleNoFormalParameters(Token token, MemberKind kind) {
+    NoFormalParametersHandle data = new NoFormalParametersHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        kind: kind);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameters(Token token, MemberKind kind) {
+    FormalParametersBegin data = new FormalParametersBegin(ParserAstType.BEGIN,
+        token: token, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameters(
+      int count, Token beginToken, Token endToken, MemberKind kind) {
+    FormalParametersEnd data = new FormalParametersEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endClassFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    ClassFieldsEnd data = new ClassFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    MixinFieldsEnd data = new MixinFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    ExtensionFieldsEnd data = new ExtensionFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    EnumFieldsEnd data = new EnumFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    EnumMethodEnd data = new EnumMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerEmptyStatement(Token token) {
+    ForInitializerEmptyStatementHandle data =
+        new ForInitializerEmptyStatementHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerExpressionStatement(Token token, bool forIn) {
+    ForInitializerExpressionStatementHandle data =
+        new ForInitializerExpressionStatementHandle(ParserAstType.HANDLE,
+            token: token, forIn: forIn);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerLocalVariableDeclaration(Token token, bool forIn) {
+    ForInitializerLocalVariableDeclarationHandle data =
+        new ForInitializerLocalVariableDeclarationHandle(ParserAstType.HANDLE,
+            token: token, forIn: forIn);
+    seen(data);
+  }
+
+  @override
+  void beginForStatement(Token token) {
+    ForStatementBegin data =
+        new ForStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForLoopParts(Token forKeyword, Token leftParen,
+      Token leftSeparator, int updateExpressionCount) {
+    ForLoopPartsHandle data = new ForLoopPartsHandle(ParserAstType.HANDLE,
+        forKeyword: forKeyword,
+        leftParen: leftParen,
+        leftSeparator: leftSeparator,
+        updateExpressionCount: updateExpressionCount);
+    seen(data);
+  }
+
+  @override
+  void endForStatement(Token endToken) {
+    ForStatementEnd data =
+        new ForStatementEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginForStatementBody(Token token) {
+    ForStatementBodyBegin data =
+        new ForStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForStatementBody(Token token) {
+    ForStatementBodyEnd data =
+        new ForStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForInLoopParts(Token? awaitToken, Token forToken,
+      Token leftParenthesis, Token inKeyword) {
+    ForInLoopPartsHandle data = new ForInLoopPartsHandle(ParserAstType.HANDLE,
+        awaitToken: awaitToken,
+        forToken: forToken,
+        leftParenthesis: leftParenthesis,
+        inKeyword: inKeyword);
+    seen(data);
+  }
+
+  @override
+  void endForIn(Token endToken) {
+    ForInEnd data = new ForInEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginForInExpression(Token token) {
+    ForInExpressionBegin data =
+        new ForInExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInExpression(Token token) {
+    ForInExpressionEnd data =
+        new ForInExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginForInBody(Token token) {
+    ForInBodyBegin data = new ForInBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInBody(Token token) {
+    ForInBodyEnd data = new ForInBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginNamedFunctionExpression(Token token) {
+    NamedFunctionExpressionBegin data =
+        new NamedFunctionExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endNamedFunctionExpression(Token endToken) {
+    NamedFunctionExpressionEnd data =
+        new NamedFunctionExpressionEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLocalFunctionDeclaration(Token token) {
+    LocalFunctionDeclarationBegin data =
+        new LocalFunctionDeclarationBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLocalFunctionDeclaration(Token endToken) {
+    LocalFunctionDeclarationEnd data =
+        new LocalFunctionDeclarationEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginBlockFunctionBody(Token token) {
+    BlockFunctionBodyBegin data =
+        new BlockFunctionBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
+    BlockFunctionBodyEnd data = new BlockFunctionBodyEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleNoFunctionBody(Token token) {
+    NoFunctionBodyHandle data =
+        new NoFunctionBodyHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
+    FunctionBodySkippedHandle data = new FunctionBodySkippedHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        isExpressionBody: isExpressionBody);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionName(Token token) {
+    FunctionNameBegin data =
+        new FunctionNameBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionName(Token beginToken, Token token) {
+    FunctionNameEnd data = new FunctionNameEnd(ParserAstType.END,
+        beginToken: beginToken, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginTypedef(Token token) {
+    TypedefBegin data = new TypedefBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypedef(Token typedefKeyword, Token? equals, Token endToken) {
+    TypedefEnd data = new TypedefEnd(ParserAstType.END,
+        typedefKeyword: typedefKeyword, equals: equals, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleClassWithClause(Token withKeyword) {
+    ClassWithClauseHandle data = new ClassWithClauseHandle(ParserAstType.HANDLE,
+        withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleClassNoWithClause() {
+    ClassNoWithClauseHandle data =
+        new ClassNoWithClauseHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void handleEnumWithClause(Token withKeyword) {
+    EnumWithClauseHandle data = new EnumWithClauseHandle(ParserAstType.HANDLE,
+        withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    EnumNoWithClauseHandle data =
+        new EnumNoWithClauseHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void beginNamedMixinApplication(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
+    NamedMixinApplicationBegin data = new NamedMixinApplicationBegin(
+        ParserAstType.BEGIN,
+        begin: begin,
+        abstractToken: abstractToken,
+        macroToken: macroToken,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void handleNamedMixinApplicationWithClause(Token withKeyword) {
+    NamedMixinApplicationWithClauseHandle data =
+        new NamedMixinApplicationWithClauseHandle(ParserAstType.HANDLE,
+            withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
+      Token? implementsKeyword, Token endToken) {
+    NamedMixinApplicationEnd data = new NamedMixinApplicationEnd(
+        ParserAstType.END,
+        begin: begin,
+        classKeyword: classKeyword,
+        equals: equals,
+        implementsKeyword: implementsKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginHide(Token hideKeyword) {
+    HideBegin data =
+        new HideBegin(ParserAstType.BEGIN, hideKeyword: hideKeyword);
+    seen(data);
+  }
+
+  @override
+  void endHide(Token hideKeyword) {
+    HideEnd data = new HideEnd(ParserAstType.END, hideKeyword: hideKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleIdentifierList(int count) {
+    IdentifierListHandle data =
+        new IdentifierListHandle(ParserAstType.HANDLE, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginTypeList(Token token) {
+    TypeListBegin data = new TypeListBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeList(int count) {
+    TypeListEnd data = new TypeListEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginIfStatement(Token token) {
+    IfStatementBegin data =
+        new IfStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endIfStatement(Token ifToken, Token? elseToken) {
+    IfStatementEnd data = new IfStatementEnd(ParserAstType.END,
+        ifToken: ifToken, elseToken: elseToken);
+    seen(data);
+  }
+
+  @override
+  void beginThenStatement(Token token) {
+    ThenStatementBegin data =
+        new ThenStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endThenStatement(Token token) {
+    ThenStatementEnd data =
+        new ThenStatementEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginElseStatement(Token token) {
+    ElseStatementBegin data =
+        new ElseStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endElseStatement(Token token) {
+    ElseStatementEnd data =
+        new ElseStatementEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginImport(Token importKeyword) {
+    ImportBegin data =
+        new ImportBegin(ParserAstType.BEGIN, importKeyword: importKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
+    ImportPrefixHandle data = new ImportPrefixHandle(ParserAstType.HANDLE,
+        deferredKeyword: deferredKeyword, asKeyword: asKeyword);
+    seen(data);
+  }
+
+  @override
+  void endImport(Token importKeyword, Token? semicolon) {
+    ImportEnd data = new ImportEnd(ParserAstType.END,
+        importKeyword: importKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverImport(Token? semicolon) {
+    RecoverImportHandle data =
+        new RecoverImportHandle(ParserAstType.HANDLE, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalUris(Token token) {
+    ConditionalUrisBegin data =
+        new ConditionalUrisBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endConditionalUris(int count) {
+    ConditionalUrisEnd data =
+        new ConditionalUrisEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalUri(Token ifKeyword) {
+    ConditionalUriBegin data =
+        new ConditionalUriBegin(ParserAstType.BEGIN, ifKeyword: ifKeyword);
+    seen(data);
+  }
+
+  @override
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
+    ConditionalUriEnd data = new ConditionalUriEnd(ParserAstType.END,
+        ifKeyword: ifKeyword, leftParen: leftParen, equalSign: equalSign);
+    seen(data);
+  }
+
+  @override
+  void handleDottedName(int count, Token firstIdentifier) {
+    DottedNameHandle data = new DottedNameHandle(ParserAstType.HANDLE,
+        count: count, firstIdentifier: firstIdentifier);
+    seen(data);
+  }
+
+  @override
+  void beginImplicitCreationExpression(Token token) {
+    ImplicitCreationExpressionBegin data =
+        new ImplicitCreationExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endImplicitCreationExpression(Token token, Token openAngleBracket) {
+    ImplicitCreationExpressionEnd data = new ImplicitCreationExpressionEnd(
+        ParserAstType.END,
+        token: token,
+        openAngleBracket: openAngleBracket);
+    seen(data);
+  }
+
+  @override
+  void beginInitializedIdentifier(Token token) {
+    InitializedIdentifierBegin data =
+        new InitializedIdentifierBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializedIdentifier(Token nameToken) {
+    InitializedIdentifierEnd data =
+        new InitializedIdentifierEnd(ParserAstType.END, nameToken: nameToken);
+    seen(data);
+  }
+
+  @override
+  void beginFieldInitializer(Token token) {
+    FieldInitializerBegin data =
+        new FieldInitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFieldInitializer(Token assignment, Token token) {
+    FieldInitializerEnd data = new FieldInitializerEnd(ParserAstType.END,
+        assignment: assignment, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoFieldInitializer(Token token) {
+    NoFieldInitializerHandle data =
+        new NoFieldInitializerHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginVariableInitializer(Token token) {
+    VariableInitializerBegin data =
+        new VariableInitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endVariableInitializer(Token assignmentOperator) {
+    VariableInitializerEnd data = new VariableInitializerEnd(ParserAstType.END,
+        assignmentOperator: assignmentOperator);
+    seen(data);
+  }
+
+  @override
+  void handleNoVariableInitializer(Token token) {
+    NoVariableInitializerHandle data =
+        new NoVariableInitializerHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginInitializer(Token token) {
+    InitializerBegin data =
+        new InitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializer(Token token) {
+    InitializerEnd data = new InitializerEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginInitializers(Token token) {
+    InitializersBegin data =
+        new InitializersBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializers(int count, Token beginToken, Token endToken) {
+    InitializersEnd data = new InitializersEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleNoInitializers() {
+    NoInitializersHandle data = new NoInitializersHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidExpression(Token token) {
+    InvalidExpressionHandle data =
+        new InvalidExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidFunctionBody(Token token) {
+    InvalidFunctionBodyHandle data =
+        new InvalidFunctionBodyHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTypeReference(Token token) {
+    InvalidTypeReferenceHandle data =
+        new InvalidTypeReferenceHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLabel(Token token) {
+    LabelHandle data = new LabelHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginLabeledStatement(Token token, int labelCount) {
+    LabeledStatementBegin data = new LabeledStatementBegin(ParserAstType.BEGIN,
+        token: token, labelCount: labelCount);
+    seen(data);
+  }
+
+  @override
+  void endLabeledStatement(int labelCount) {
+    LabeledStatementEnd data =
+        new LabeledStatementEnd(ParserAstType.END, labelCount: labelCount);
+    seen(data);
+  }
+
+  @override
+  void beginLibraryName(Token token) {
+    LibraryNameBegin data =
+        new LibraryNameBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLibraryName(Token libraryKeyword, Token semicolon) {
+    LibraryNameEnd data = new LibraryNameEnd(ParserAstType.END,
+        libraryKeyword: libraryKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralMapEntry(Token colon, Token endToken) {
+    LiteralMapEntryHandle data = new LiteralMapEntryHandle(ParserAstType.HANDLE,
+        colon: colon, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLiteralString(Token token) {
+    LiteralStringBegin data =
+        new LiteralStringBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
+    InterpolationExpressionHandle data = new InterpolationExpressionHandle(
+        ParserAstType.HANDLE,
+        leftBracket: leftBracket,
+        rightBracket: rightBracket);
+    seen(data);
+  }
+
+  @override
+  void endLiteralString(int interpolationCount, Token endToken) {
+    LiteralStringEnd data = new LiteralStringEnd(ParserAstType.END,
+        interpolationCount: interpolationCount, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleStringJuxtaposition(Token startToken, int literalCount) {
+    StringJuxtapositionHandle data = new StringJuxtapositionHandle(
+        ParserAstType.HANDLE,
+        startToken: startToken,
+        literalCount: literalCount);
+    seen(data);
+  }
+
+  @override
+  void beginMember() {
+    MemberBegin data = new MemberBegin(ParserAstType.BEGIN);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidMember(Token endToken) {
+    InvalidMemberHandle data =
+        new InvalidMemberHandle(ParserAstType.HANDLE, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMember() {
+    MemberEnd data = new MemberEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void beginMethod(
+      DeclarationKind declarationKind,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
+      Token name) {
+    MethodBegin data = new MethodBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        varFinalOrConst: varFinalOrConst,
+        getOrSet: getOrSet,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ClassMethodEnd data = new ClassMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    MixinMethodEnd data = new MixinMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ExtensionMethodEnd data = new ExtensionMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ClassConstructorEnd data = new ClassConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    MixinConstructorEnd data = new MixinConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionConstructor(Token? getOrSet, Token beginToken,
+      Token beginParam, Token? beginInitializers, Token endToken) {
+    ExtensionConstructorEnd data = new ExtensionConstructorEnd(
+        ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginMetadataStar(Token token) {
+    MetadataStarBegin data =
+        new MetadataStarBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endMetadataStar(int count) {
+    MetadataStarEnd data = new MetadataStarEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginMetadata(Token token) {
+    MetadataBegin data = new MetadataBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
+    MetadataEnd data = new MetadataEnd(ParserAstType.END,
+        beginToken: beginToken,
+        periodBeforeName: periodBeforeName,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginOptionalFormalParameters(Token token) {
+    OptionalFormalParametersBegin data =
+        new OptionalFormalParametersBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endOptionalFormalParameters(
+      int count, Token beginToken, Token endToken) {
+    OptionalFormalParametersEnd data = new OptionalFormalParametersEnd(
+        ParserAstType.END,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginPart(Token token) {
+    PartBegin data = new PartBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endPart(Token partKeyword, Token semicolon) {
+    PartEnd data = new PartEnd(ParserAstType.END,
+        partKeyword: partKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void beginPartOf(Token token) {
+    PartOfBegin data = new PartOfBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endPartOf(
+      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
+    PartOfEnd data = new PartOfEnd(ParserAstType.END,
+        partKeyword: partKeyword,
+        ofKeyword: ofKeyword,
+        semicolon: semicolon,
+        hasName: hasName);
+    seen(data);
+  }
+
+  @override
+  void beginRedirectingFactoryBody(Token token) {
+    RedirectingFactoryBodyBegin data =
+        new RedirectingFactoryBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endRedirectingFactoryBody(Token beginToken, Token endToken) {
+    RedirectingFactoryBodyEnd data = new RedirectingFactoryBodyEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginReturnStatement(Token token) {
+    ReturnStatementBegin data =
+        new ReturnStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
+    NativeFunctionBodyHandle data = new NativeFunctionBodyHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
+    NativeFunctionBodyIgnoredHandle data = new NativeFunctionBodyIgnoredHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
+    NativeFunctionBodySkippedHandle data = new NativeFunctionBodySkippedHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleEmptyFunctionBody(Token semicolon) {
+    EmptyFunctionBodyHandle data =
+        new EmptyFunctionBodyHandle(ParserAstType.HANDLE, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleExpressionFunctionBody(Token arrowToken, Token? endToken) {
+    ExpressionFunctionBodyHandle data = new ExpressionFunctionBodyHandle(
+        ParserAstType.HANDLE,
+        arrowToken: arrowToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endReturnStatement(
+      bool hasExpression, Token beginToken, Token endToken) {
+    ReturnStatementEnd data = new ReturnStatementEnd(ParserAstType.END,
+        hasExpression: hasExpression,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleSend(Token beginToken, Token endToken) {
+    SendHandle data = new SendHandle(ParserAstType.HANDLE,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginShow(Token showKeyword) {
+    ShowBegin data =
+        new ShowBegin(ParserAstType.BEGIN, showKeyword: showKeyword);
+    seen(data);
+  }
+
+  @override
+  void endShow(Token showKeyword) {
+    ShowEnd data = new ShowEnd(ParserAstType.END, showKeyword: showKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchStatement(Token token) {
+    SwitchStatementBegin data =
+        new SwitchStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endSwitchStatement(Token switchKeyword, Token endToken) {
+    SwitchStatementEnd data = new SwitchStatementEnd(ParserAstType.END,
+        switchKeyword: switchKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchBlock(Token token) {
+    SwitchBlockBegin data =
+        new SwitchBlockBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
+    SwitchBlockEnd data = new SwitchBlockEnd(ParserAstType.END,
+        caseCount: caseCount, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLiteralSymbol(Token token) {
+    LiteralSymbolBegin data =
+        new LiteralSymbolBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLiteralSymbol(Token hashToken, int identifierCount) {
+    LiteralSymbolEnd data = new LiteralSymbolEnd(ParserAstType.END,
+        hashToken: hashToken, identifierCount: identifierCount);
+    seen(data);
+  }
+
+  @override
+  void handleThrowExpression(Token throwToken, Token endToken) {
+    ThrowExpressionHandle data = new ThrowExpressionHandle(ParserAstType.HANDLE,
+        throwToken: throwToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginRethrowStatement(Token token) {
+    RethrowStatementBegin data =
+        new RethrowStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endRethrowStatement(Token rethrowToken, Token endToken) {
+    RethrowStatementEnd data = new RethrowStatementEnd(ParserAstType.END,
+        rethrowToken: rethrowToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelDeclaration(Token nextToken) {
+    TopLevelDeclarationEnd data =
+        new TopLevelDeclarationEnd(ParserAstType.END, nextToken: nextToken);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTopLevelDeclaration(Token endToken) {
+    InvalidTopLevelDeclarationHandle data =
+        new InvalidTopLevelDeclarationHandle(ParserAstType.HANDLE,
+            endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTopLevelMember(Token token) {
+    TopLevelMemberBegin data =
+        new TopLevelMemberBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFields(
+      DeclarationKind declarationKind,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      Token lastConsumed) {
+    FieldsBegin data = new FieldsBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        lastConsumed: lastConsumed);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelFields(
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    TopLevelFieldsEnd data = new TopLevelFieldsEnd(ParserAstType.END,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
+    TopLevelMethodBegin data = new TopLevelMethodBegin(ParserAstType.BEGIN,
+        lastConsumed: lastConsumed, externalToken: externalToken);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
+    TopLevelMethodEnd data = new TopLevelMethodEnd(ParserAstType.END,
+        beginToken: beginToken, getOrSet: getOrSet, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTryStatement(Token token) {
+    TryStatementBegin data =
+        new TryStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCaseMatch(Token caseKeyword, Token colon) {
+    CaseMatchHandle data = new CaseMatchHandle(ParserAstType.HANDLE,
+        caseKeyword: caseKeyword, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginCatchClause(Token token) {
+    CatchClauseBegin data =
+        new CatchClauseBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCatchClause(Token token) {
+    CatchClauseEnd data = new CatchClauseEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
+    CatchBlockHandle data = new CatchBlockHandle(ParserAstType.HANDLE,
+        onKeyword: onKeyword, catchKeyword: catchKeyword, comma: comma);
+    seen(data);
+  }
+
+  @override
+  void handleFinallyBlock(Token finallyKeyword) {
+    FinallyBlockHandle data = new FinallyBlockHandle(ParserAstType.HANDLE,
+        finallyKeyword: finallyKeyword);
+    seen(data);
+  }
+
+  @override
+  void endTryStatement(
+      int catchCount, Token tryKeyword, Token? finallyKeyword) {
+    TryStatementEnd data = new TryStatementEnd(ParserAstType.END,
+        catchCount: catchCount,
+        tryKeyword: tryKeyword,
+        finallyKeyword: finallyKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleType(Token beginToken, Token? questionMark) {
+    TypeHandle data = new TypeHandle(ParserAstType.HANDLE,
+        beginToken: beginToken, questionMark: questionMark);
+    seen(data);
+  }
+
+  @override
+  void handleNonNullAssertExpression(Token bang) {
+    NonNullAssertExpressionHandle data =
+        new NonNullAssertExpressionHandle(ParserAstType.HANDLE, bang: bang);
+    seen(data);
+  }
+
+  @override
+  void handleNoName(Token token) {
+    NoNameHandle data = new NoNameHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionType(Token beginToken) {
+    FunctionTypeBegin data =
+        new FunctionTypeBegin(ParserAstType.BEGIN, beginToken: beginToken);
+    seen(data);
+  }
+
+  @override
+  void endFunctionType(Token functionToken, Token? questionMark) {
+    FunctionTypeEnd data = new FunctionTypeEnd(ParserAstType.END,
+        functionToken: functionToken, questionMark: questionMark);
+    seen(data);
+  }
+
+  @override
+  void beginTypeArguments(Token token) {
+    TypeArgumentsBegin data =
+        new TypeArgumentsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeArguments(int count, Token beginToken, Token endToken) {
+    TypeArgumentsEnd data = new TypeArgumentsEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTypeArguments(Token token) {
+    InvalidTypeArgumentsHandle data =
+        new InvalidTypeArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoTypeArguments(Token token) {
+    NoTypeArgumentsHandle data =
+        new NoTypeArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginTypeVariable(Token token) {
+    TypeVariableBegin data =
+        new TypeVariableBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleTypeVariablesDefined(Token token, int count) {
+    TypeVariablesDefinedHandle data = new TypeVariablesDefinedHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        count: count);
+    seen(data);
+  }
+
+  @override
+  void endTypeVariable(
+      Token token, int index, Token? extendsOrSuper, Token? variance) {
+    TypeVariableEnd data = new TypeVariableEnd(ParserAstType.END,
+        token: token,
+        index: index,
+        extendsOrSuper: extendsOrSuper,
+        variance: variance);
+    seen(data);
+  }
+
+  @override
+  void beginTypeVariables(Token token) {
+    TypeVariablesBegin data =
+        new TypeVariablesBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeVariables(Token beginToken, Token endToken) {
+    TypeVariablesEnd data = new TypeVariablesEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionExpression(Token token) {
+    FunctionExpressionBegin data =
+        new FunctionExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionExpression(Token beginToken, Token token) {
+    FunctionExpressionEnd data = new FunctionExpressionEnd(ParserAstType.END,
+        beginToken: beginToken, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginVariablesDeclaration(
+      Token token, Token? lateToken, Token? varFinalOrConst) {
+    VariablesDeclarationBegin data = new VariablesDeclarationBegin(
+        ParserAstType.BEGIN,
+        token: token,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst);
+    seen(data);
+  }
+
+  @override
+  void endVariablesDeclaration(int count, Token? endToken) {
+    VariablesDeclarationEnd data = new VariablesDeclarationEnd(
+        ParserAstType.END,
+        count: count,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginWhileStatement(Token token) {
+    WhileStatementBegin data =
+        new WhileStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endWhileStatement(Token whileKeyword, Token endToken) {
+    WhileStatementEnd data = new WhileStatementEnd(ParserAstType.END,
+        whileKeyword: whileKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginAsOperatorType(Token operator) {
+    AsOperatorTypeBegin data =
+        new AsOperatorTypeBegin(ParserAstType.BEGIN, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void endAsOperatorType(Token operator) {
+    AsOperatorTypeEnd data =
+        new AsOperatorTypeEnd(ParserAstType.END, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleAsOperator(Token operator) {
+    AsOperatorHandle data =
+        new AsOperatorHandle(ParserAstType.HANDLE, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleAssignmentExpression(Token token) {
+    AssignmentExpressionHandle data =
+        new AssignmentExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginBinaryExpression(Token token) {
+    BinaryExpressionBegin data =
+        new BinaryExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endBinaryExpression(Token token) {
+    BinaryExpressionEnd data =
+        new BinaryExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleEndingBinaryExpression(Token token) {
+    EndingBinaryExpressionHandle data =
+        new EndingBinaryExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalExpression(Token question) {
+    ConditionalExpressionBegin data =
+        new ConditionalExpressionBegin(ParserAstType.BEGIN, question: question);
+    seen(data);
+  }
+
+  @override
+  void handleConditionalExpressionColon() {
+    ConditionalExpressionColonHandle data =
+        new ConditionalExpressionColonHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endConditionalExpression(Token question, Token colon) {
+    ConditionalExpressionEnd data = new ConditionalExpressionEnd(
+        ParserAstType.END,
+        question: question,
+        colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginConstExpression(Token constKeyword) {
+    ConstExpressionBegin data = new ConstExpressionBegin(ParserAstType.BEGIN,
+        constKeyword: constKeyword);
+    seen(data);
+  }
+
+  @override
+  void endConstExpression(Token token) {
+    ConstExpressionEnd data =
+        new ConstExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleConstFactory(Token constKeyword) {
+    ConstFactoryHandle data = new ConstFactoryHandle(ParserAstType.HANDLE,
+        constKeyword: constKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginForControlFlow(Token? awaitToken, Token forToken) {
+    ForControlFlowBegin data = new ForControlFlowBegin(ParserAstType.BEGIN,
+        awaitToken: awaitToken, forToken: forToken);
+    seen(data);
+  }
+
+  @override
+  void endForControlFlow(Token token) {
+    ForControlFlowEnd data =
+        new ForControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInControlFlow(Token token) {
+    ForInControlFlowEnd data =
+        new ForInControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginIfControlFlow(Token ifToken) {
+    IfControlFlowBegin data =
+        new IfControlFlowBegin(ParserAstType.BEGIN, ifToken: ifToken);
+    seen(data);
+  }
+
+  @override
+  void handleThenControlFlow(Token token) {
+    ThenControlFlowHandle data =
+        new ThenControlFlowHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleElseControlFlow(Token elseToken) {
+    ElseControlFlowHandle data =
+        new ElseControlFlowHandle(ParserAstType.HANDLE, elseToken: elseToken);
+    seen(data);
+  }
+
+  @override
+  void endIfControlFlow(Token token) {
+    IfControlFlowEnd data =
+        new IfControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void endIfElseControlFlow(Token token) {
+    IfElseControlFlowEnd data =
+        new IfElseControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSpreadExpression(Token spreadToken) {
+    SpreadExpressionHandle data = new SpreadExpressionHandle(
+        ParserAstType.HANDLE,
+        spreadToken: spreadToken);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionTypedFormalParameter(Token token) {
+    FunctionTypedFormalParameterBegin data =
+        new FunctionTypedFormalParameterBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
+    FunctionTypedFormalParameterEnd data = new FunctionTypedFormalParameterEnd(
+        ParserAstType.END,
+        nameToken: nameToken,
+        question: question);
+    seen(data);
+  }
+
+  @override
+  void handleIdentifier(Token token, IdentifierContext context) {
+    IdentifierHandle data = new IdentifierHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    ShowHideIdentifierHandle data = new ShowHideIdentifierHandle(
+        ParserAstType.HANDLE,
+        modifier: modifier,
+        identifier: identifier);
+    seen(data);
+  }
+
+  @override
+  void handleIndexedExpression(
+      Token? question, Token openSquareBracket, Token closeSquareBracket) {
+    IndexedExpressionHandle data = new IndexedExpressionHandle(
+        ParserAstType.HANDLE,
+        question: question,
+        openSquareBracket: openSquareBracket,
+        closeSquareBracket: closeSquareBracket);
+    seen(data);
+  }
+
+  @override
+  void beginIsOperatorType(Token operator) {
+    IsOperatorTypeBegin data =
+        new IsOperatorTypeBegin(ParserAstType.BEGIN, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void endIsOperatorType(Token operator) {
+    IsOperatorTypeEnd data =
+        new IsOperatorTypeEnd(ParserAstType.END, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleIsOperator(Token isOperator, Token? not) {
+    IsOperatorHandle data = new IsOperatorHandle(ParserAstType.HANDLE,
+        isOperator: isOperator, not: not);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralBool(Token token) {
+    LiteralBoolHandle data =
+        new LiteralBoolHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleBreakStatement(
+      bool hasTarget, Token breakKeyword, Token endToken) {
+    BreakStatementHandle data = new BreakStatementHandle(ParserAstType.HANDLE,
+        hasTarget: hasTarget, breakKeyword: breakKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleContinueStatement(
+      bool hasTarget, Token continueKeyword, Token endToken) {
+    ContinueStatementHandle data = new ContinueStatementHandle(
+        ParserAstType.HANDLE,
+        hasTarget: hasTarget,
+        continueKeyword: continueKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleEmptyStatement(Token token) {
+    EmptyStatementHandle data =
+        new EmptyStatementHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginAssert(Token assertKeyword, Assert kind) {
+    AssertBegin data = new AssertBegin(ParserAstType.BEGIN,
+        assertKeyword: assertKeyword, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+      Token? commaToken, Token semicolonToken) {
+    AssertEnd data = new AssertEnd(ParserAstType.END,
+        assertKeyword: assertKeyword,
+        kind: kind,
+        leftParenthesis: leftParenthesis,
+        commaToken: commaToken,
+        semicolonToken: semicolonToken);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralDouble(Token token) {
+    LiteralDoubleHandle data =
+        new LiteralDoubleHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralInt(Token token) {
+    LiteralIntHandle data =
+        new LiteralIntHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralList(
+      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
+    LiteralListHandle data = new LiteralListHandle(ParserAstType.HANDLE,
+        count: count,
+        leftBracket: leftBracket,
+        constKeyword: constKeyword,
+        rightBracket: rightBracket);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralSetOrMap(
+    int count,
+    Token leftBrace,
+    Token? constKeyword,
+    Token rightBrace,
+    bool hasSetEntry,
+  ) {
+    LiteralSetOrMapHandle data = new LiteralSetOrMapHandle(ParserAstType.HANDLE,
+        count: count,
+        leftBrace: leftBrace,
+        constKeyword: constKeyword,
+        rightBrace: rightBrace,
+        hasSetEntry: hasSetEntry);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralNull(Token token) {
+    LiteralNullHandle data =
+        new LiteralNullHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNativeClause(Token nativeToken, bool hasName) {
+    NativeClauseHandle data = new NativeClauseHandle(ParserAstType.HANDLE,
+        nativeToken: nativeToken, hasName: hasName);
+    seen(data);
+  }
+
+  @override
+  void handleNamedArgument(Token colon) {
+    NamedArgumentHandle data =
+        new NamedArgumentHandle(ParserAstType.HANDLE, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginNewExpression(Token token) {
+    NewExpressionBegin data =
+        new NewExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endNewExpression(Token token) {
+    NewExpressionEnd data =
+        new NewExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoArguments(Token token) {
+    NoArgumentsHandle data =
+        new NoArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    NoConstructorReferenceContinuationAfterTypeArgumentsHandle data =
+        new NoConstructorReferenceContinuationAfterTypeArgumentsHandle(
+            ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    NoTypeNameInConstructorReferenceHandle data =
+        new NoTypeNameInConstructorReferenceHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoType(Token lastConsumed) {
+    NoTypeHandle data =
+        new NoTypeHandle(ParserAstType.HANDLE, lastConsumed: lastConsumed);
+    seen(data);
+  }
+
+  @override
+  void handleNoTypeVariables(Token token) {
+    NoTypeVariablesHandle data =
+        new NoTypeVariablesHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleOperator(Token token) {
+    OperatorHandle data =
+        new OperatorHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSymbolVoid(Token token) {
+    SymbolVoidHandle data =
+        new SymbolVoidHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleOperatorName(Token operatorKeyword, Token token) {
+    OperatorNameHandle data = new OperatorNameHandle(ParserAstType.HANDLE,
+        operatorKeyword: operatorKeyword, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
+    InvalidOperatorNameHandle data = new InvalidOperatorNameHandle(
+        ParserAstType.HANDLE,
+        operatorKeyword: operatorKeyword,
+        token: token);
+    seen(data);
+  }
+
+  @override
+  void handleParenthesizedCondition(Token token) {
+    ParenthesizedConditionHandle data =
+        new ParenthesizedConditionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleParenthesizedExpression(Token token) {
+    ParenthesizedExpressionHandle data =
+        new ParenthesizedExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleQualified(Token period) {
+    QualifiedHandle data =
+        new QualifiedHandle(ParserAstType.HANDLE, period: period);
+    seen(data);
+  }
+
+  @override
+  void handleStringPart(Token token) {
+    StringPartHandle data =
+        new StringPartHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSuperExpression(Token token, IdentifierContext context) {
+    SuperExpressionHandle data = new SuperExpressionHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
+    SwitchCaseBegin data = new SwitchCaseBegin(ParserAstType.BEGIN,
+        labelCount: labelCount,
+        expressionCount: expressionCount,
+        firstToken: firstToken);
+    seen(data);
+  }
+
+  @override
+  void endSwitchCase(
+      int labelCount,
+      int expressionCount,
+      Token? defaultKeyword,
+      Token? colonAfterDefault,
+      int statementCount,
+      Token firstToken,
+      Token endToken) {
+    SwitchCaseEnd data = new SwitchCaseEnd(ParserAstType.END,
+        labelCount: labelCount,
+        expressionCount: expressionCount,
+        defaultKeyword: defaultKeyword,
+        colonAfterDefault: colonAfterDefault,
+        statementCount: statementCount,
+        firstToken: firstToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleThisExpression(Token token, IdentifierContext context) {
+    ThisExpressionHandle data = new ThisExpressionHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPostfixAssignmentExpression(Token token) {
+    UnaryPostfixAssignmentExpressionHandle data =
+        new UnaryPostfixAssignmentExpressionHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPrefixExpression(Token token) {
+    UnaryPrefixExpressionHandle data =
+        new UnaryPrefixExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPrefixAssignmentExpression(Token token) {
+    UnaryPrefixAssignmentExpressionHandle data =
+        new UnaryPrefixAssignmentExpressionHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameterDefaultValueExpression() {
+    FormalParameterDefaultValueExpressionBegin data =
+        new FormalParameterDefaultValueExpressionBegin(ParserAstType.BEGIN);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameterDefaultValueExpression() {
+    FormalParameterDefaultValueExpressionEnd data =
+        new FormalParameterDefaultValueExpressionEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void handleValuedFormalParameter(Token equals, Token token) {
+    ValuedFormalParameterHandle data = new ValuedFormalParameterHandle(
+        ParserAstType.HANDLE,
+        equals: equals,
+        token: token);
+    seen(data);
+  }
+
+  @override
+  void handleFormalParameterWithoutValue(Token token) {
+    FormalParameterWithoutValueHandle data =
+        new FormalParameterWithoutValueHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleVoidKeyword(Token token) {
+    VoidKeywordHandle data =
+        new VoidKeywordHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    VoidKeywordWithTypeArgumentsHandle data =
+        new VoidKeywordWithTypeArgumentsHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginYieldStatement(Token token) {
+    YieldStatementBegin data =
+        new YieldStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
+    YieldStatementEnd data = new YieldStatementEnd(ParserAstType.END,
+        yieldToken: yieldToken, starToken: starToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endInvalidYieldStatement(Token beginToken, Token? starToken,
+      Token endToken, MessageCode errorCode) {
+    InvalidYieldStatementEnd data = new InvalidYieldStatementEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        starToken: starToken,
+        endToken: endToken,
+        errorCode: errorCode);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverableError(
+      Message message, Token startToken, Token endToken) {
+    RecoverableErrorHandle data = new RecoverableErrorHandle(
+        ParserAstType.HANDLE,
+        message: message,
+        startToken: startToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleErrorToken(ErrorToken token) {
+    ErrorTokenHandle data =
+        new ErrorTokenHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnescapeError(
+      Message message, Token location, int stringOffset, int length) {
+    UnescapeErrorHandle data = new UnescapeErrorHandle(ParserAstType.HANDLE,
+        message: message,
+        location: location,
+        stringOffset: stringOffset,
+        length: length);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidStatement(Token token, Message message) {
+    InvalidStatementHandle data = new InvalidStatementHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        message: message);
+    seen(data);
+  }
+
+  @override
+  void handleScript(Token token) {
+    ScriptHandle data = new ScriptHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
+    CommentReferenceTextHandle data = new CommentReferenceTextHandle(
+        ParserAstType.HANDLE,
+        referenceSource: referenceSource,
+        referenceOffset: referenceOffset);
+    seen(data);
+  }
+
+  @override
+  void handleCommentReference(
+      Token? newKeyword,
+      Token? firstToken,
+      Token? firstPeriod,
+      Token? secondToken,
+      Token? secondPeriod,
+      Token thirdToken) {
+    CommentReferenceHandle data = new CommentReferenceHandle(
+        ParserAstType.HANDLE,
+        newKeyword: newKeyword,
+        firstToken: firstToken,
+        firstPeriod: firstPeriod,
+        secondToken: secondToken,
+        secondPeriod: secondPeriod,
+        thirdToken: thirdToken);
+    seen(data);
+  }
+
+  @override
+  void handleNoCommentReference() {
+    NoCommentReferenceHandle data =
+        new NoCommentReferenceHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void handleTypeArgumentApplication(Token openAngleBracket) {
+    TypeArgumentApplicationHandle data = new TypeArgumentApplicationHandle(
+        ParserAstType.HANDLE,
+        openAngleBracket: openAngleBracket);
+    seen(data);
+  }
+
+  @override
+  void handleNewAsIdentifier(Token token) {
+    NewAsIdentifierHandle data =
+        new NewAsIdentifierHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+}
+
+class ArgumentsBegin extends ParserAstNode {
+  final Token token;
+
+  ArgumentsBegin(ParserAstType type, {required this.token})
+      : super("Arguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ArgumentsEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ArgumentsEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("Arguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class AsyncModifierHandle extends ParserAstNode {
+  final Token? asyncToken;
+  final Token? starToken;
+
+  AsyncModifierHandle(ParserAstType type, {this.asyncToken, this.starToken})
+      : super("AsyncModifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "asyncToken": asyncToken,
+        "starToken": starToken,
+      };
+}
+
+class AwaitExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  AwaitExpressionBegin(ParserAstType type, {required this.token})
+      : super("AwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class AwaitExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  AwaitExpressionEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("AwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidAwaitExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+  final MessageCode errorCode;
+
+  InvalidAwaitExpressionEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.endToken,
+      required this.errorCode})
+      : super("InvalidAwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "errorCode": errorCode,
+      };
+}
+
+class BlockBegin extends ParserAstNode {
+  final Token token;
+  final BlockKind blockKind;
+
+  BlockBegin(ParserAstType type, {required this.token, required this.blockKind})
+      : super("Block", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "blockKind": blockKind,
+      };
+}
+
+class BlockEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+  final BlockKind blockKind;
+
+  BlockEnd(ParserAstType type,
+      {required this.count,
+      required this.beginToken,
+      required this.endToken,
+      required this.blockKind})
+      : super("Block", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "blockKind": blockKind,
+      };
+}
+
+class InvalidTopLevelBlockHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTopLevelBlockHandle(ParserAstType type, {required this.token})
+      : super("InvalidTopLevelBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CascadeBegin extends ParserAstNode {
+  final Token token;
+
+  CascadeBegin(ParserAstType type, {required this.token})
+      : super("Cascade", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CascadeEnd extends ParserAstNode {
+  CascadeEnd(ParserAstType type) : super("Cascade", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class CaseExpressionBegin extends ParserAstNode {
+  final Token caseKeyword;
+
+  CaseExpressionBegin(ParserAstType type, {required this.caseKeyword})
+      : super("CaseExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseKeyword": caseKeyword,
+      };
+}
+
+class CaseExpressionEnd extends ParserAstNode {
+  final Token colon;
+
+  CaseExpressionEnd(ParserAstType type, {required this.colon})
+      : super("CaseExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+      };
+}
+
+class ClassOrMixinOrExtensionBodyBegin extends ParserAstNode {
+  final DeclarationKind kind;
+  final Token token;
+
+  ClassOrMixinOrExtensionBodyBegin(ParserAstType type,
+      {required this.kind, required this.token})
+      : super("ClassOrMixinOrExtensionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "kind": kind,
+        "token": token,
+      };
+}
+
+class ClassOrMixinOrExtensionBodyEnd extends ParserAstNode {
+  final DeclarationKind kind;
+  final int memberCount;
+  final Token beginToken;
+  final Token endToken;
+
+  ClassOrMixinOrExtensionBodyEnd(ParserAstType type,
+      {required this.kind,
+      required this.memberCount,
+      required this.beginToken,
+      required this.endToken})
+      : super("ClassOrMixinOrExtensionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "kind": kind,
+        "memberCount": memberCount,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ClassOrMixinOrNamedMixinApplicationPreludeBegin extends ParserAstNode {
+  final Token token;
+
+  ClassOrMixinOrNamedMixinApplicationPreludeBegin(ParserAstType type,
+      {required this.token})
+      : super("ClassOrMixinOrNamedMixinApplicationPrelude", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ClassDeclarationBegin extends ParserAstNode {
+  final Token begin;
+  final Token? abstractToken;
+  final Token? macroToken;
+  final Token name;
+
+  ClassDeclarationBegin(ParserAstType type,
+      {required this.begin,
+      this.abstractToken,
+      this.macroToken,
+      required this.name})
+      : super("ClassDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "abstractToken": abstractToken,
+        "macroToken": macroToken,
+        "name": name,
+      };
+}
+
+class ClassExtendsHandle extends ParserAstNode {
+  final Token? extendsKeyword;
+  final int typeCount;
+
+  ClassExtendsHandle(ParserAstType type,
+      {this.extendsKeyword, required this.typeCount})
+      : super("ClassExtends", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extendsKeyword": extendsKeyword,
+        "typeCount": typeCount,
+      };
+}
+
+class ImplementsHandle extends ParserAstNode {
+  final Token? implementsKeyword;
+  final int interfacesCount;
+
+  ImplementsHandle(ParserAstType type,
+      {this.implementsKeyword, required this.interfacesCount})
+      : super("Implements", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "implementsKeyword": implementsKeyword,
+        "interfacesCount": interfacesCount,
+      };
+}
+
+class ExtensionShowHideHandle extends ParserAstNode {
+  final Token? showKeyword;
+  final int showElementCount;
+  final Token? hideKeyword;
+  final int hideElementCount;
+
+  ExtensionShowHideHandle(ParserAstType type,
+      {this.showKeyword,
+      required this.showElementCount,
+      this.hideKeyword,
+      required this.hideElementCount})
+      : super("ExtensionShowHide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+        "showElementCount": showElementCount,
+        "hideKeyword": hideKeyword,
+        "hideElementCount": hideElementCount,
+      };
+}
+
+class ClassHeaderHandle extends ParserAstNode {
+  final Token begin;
+  final Token classKeyword;
+  final Token? nativeToken;
+
+  ClassHeaderHandle(ParserAstType type,
+      {required this.begin, required this.classKeyword, this.nativeToken})
+      : super("ClassHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "classKeyword": classKeyword,
+        "nativeToken": nativeToken,
+      };
+}
+
+class RecoverClassHeaderHandle extends ParserAstNode {
+  RecoverClassHeaderHandle(ParserAstType type)
+      : super("RecoverClassHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ClassDeclarationEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  ClassDeclarationEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("ClassDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class MixinDeclarationBegin extends ParserAstNode {
+  final Token mixinKeyword;
+  final Token name;
+
+  MixinDeclarationBegin(ParserAstType type,
+      {required this.mixinKeyword, required this.name})
+      : super("MixinDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+        "name": name,
+      };
+}
+
+class MixinOnHandle extends ParserAstNode {
+  final Token? onKeyword;
+  final int typeCount;
+
+  MixinOnHandle(ParserAstType type, {this.onKeyword, required this.typeCount})
+      : super("MixinOn", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "onKeyword": onKeyword,
+        "typeCount": typeCount,
+      };
+}
+
+class MixinHeaderHandle extends ParserAstNode {
+  final Token mixinKeyword;
+
+  MixinHeaderHandle(ParserAstType type, {required this.mixinKeyword})
+      : super("MixinHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+      };
+}
+
+class RecoverMixinHeaderHandle extends ParserAstNode {
+  RecoverMixinHeaderHandle(ParserAstType type)
+      : super("RecoverMixinHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class MixinDeclarationEnd extends ParserAstNode {
+  final Token mixinKeyword;
+  final Token endToken;
+
+  MixinDeclarationEnd(ParserAstType type,
+      {required this.mixinKeyword, required this.endToken})
+      : super("MixinDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+        "endToken": endToken,
+      };
+}
+
+class UncategorizedTopLevelDeclarationBegin extends ParserAstNode {
+  final Token token;
+
+  UncategorizedTopLevelDeclarationBegin(ParserAstType type,
+      {required this.token})
+      : super("UncategorizedTopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ExtensionDeclarationPreludeBegin extends ParserAstNode {
+  final Token extensionKeyword;
+
+  ExtensionDeclarationPreludeBegin(ParserAstType type,
+      {required this.extensionKeyword})
+      : super("ExtensionDeclarationPrelude", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+      };
+}
+
+class ExtensionDeclarationBegin extends ParserAstNode {
+  final Token extensionKeyword;
+  final Token? name;
+
+  ExtensionDeclarationBegin(ParserAstType type,
+      {required this.extensionKeyword, this.name})
+      : super("ExtensionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+        "name": name,
+      };
+}
+
+class ExtensionDeclarationEnd extends ParserAstNode {
+  final Token extensionKeyword;
+  final Token? typeKeyword;
+  final Token onKeyword;
+  final Token? showKeyword;
+  final Token? hideKeyword;
+  final Token endToken;
+
+  ExtensionDeclarationEnd(ParserAstType type,
+      {required this.extensionKeyword,
+      this.typeKeyword,
+      required this.onKeyword,
+      this.showKeyword,
+      this.hideKeyword,
+      required this.endToken})
+      : super("ExtensionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+        "typeKeyword": typeKeyword,
+        "onKeyword": onKeyword,
+        "showKeyword": showKeyword,
+        "hideKeyword": hideKeyword,
+        "endToken": endToken,
+      };
+}
+
+class CombinatorsBegin extends ParserAstNode {
+  final Token token;
+
+  CombinatorsBegin(ParserAstType type, {required this.token})
+      : super("Combinators", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CombinatorsEnd extends ParserAstNode {
+  final int count;
+
+  CombinatorsEnd(ParserAstType type, {required this.count})
+      : super("Combinators", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class CompilationUnitBegin extends ParserAstNode {
+  final Token token;
+
+  CompilationUnitBegin(ParserAstType type, {required this.token})
+      : super("CompilationUnit", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DirectivesOnlyHandle extends ParserAstNode {
+  DirectivesOnlyHandle(ParserAstType type) : super("DirectivesOnly", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class CompilationUnitEnd extends ParserAstNode {
+  final int count;
+  final Token token;
+
+  CompilationUnitEnd(ParserAstType type,
+      {required this.count, required this.token})
+      : super("CompilationUnit", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "token": token,
+      };
+}
+
+class ConstLiteralBegin extends ParserAstNode {
+  final Token token;
+
+  ConstLiteralBegin(ParserAstType type, {required this.token})
+      : super("ConstLiteral", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstLiteralEnd extends ParserAstNode {
+  final Token token;
+
+  ConstLiteralEnd(ParserAstType type, {required this.token})
+      : super("ConstLiteral", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstructorReferenceBegin extends ParserAstNode {
+  final Token start;
+
+  ConstructorReferenceBegin(ParserAstType type, {required this.start})
+      : super("ConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "start": start,
+      };
+}
+
+class ConstructorReferenceEnd extends ParserAstNode {
+  final Token start;
+  final Token? periodBeforeName;
+  final Token endToken;
+  final ConstructorReferenceContext constructorReferenceContext;
+
+  ConstructorReferenceEnd(ParserAstType type,
+      {required this.start,
+      this.periodBeforeName,
+      required this.endToken,
+      required this.constructorReferenceContext})
+      : super("ConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "start": start,
+        "periodBeforeName": periodBeforeName,
+        "endToken": endToken,
+        "constructorReferenceContext": constructorReferenceContext,
+      };
+}
+
+class DoWhileStatementBegin extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBegin(ParserAstType type, {required this.token})
+      : super("DoWhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DoWhileStatementEnd extends ParserAstNode {
+  final Token doKeyword;
+  final Token whileKeyword;
+  final Token endToken;
+
+  DoWhileStatementEnd(ParserAstType type,
+      {required this.doKeyword,
+      required this.whileKeyword,
+      required this.endToken})
+      : super("DoWhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "doKeyword": doKeyword,
+        "whileKeyword": whileKeyword,
+        "endToken": endToken,
+      };
+}
+
+class DoWhileStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("DoWhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DoWhileStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("DoWhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("WhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("WhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class EnumBegin extends ParserAstNode {
+  final Token enumKeyword;
+
+  EnumBegin(ParserAstType type, {required this.enumKeyword})
+      : super("Enum", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+      };
+}
+
+class EnumEnd extends ParserAstNode {
+  final Token enumKeyword;
+  final Token leftBrace;
+  final int memberCount;
+
+  EnumEnd(ParserAstType type,
+      {required this.enumKeyword,
+      required this.leftBrace,
+      required this.memberCount})
+      : super("Enum", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+        "leftBrace": leftBrace,
+        "memberCount": memberCount,
+      };
+}
+
+class EnumConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  EnumConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("EnumConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class EnumElementsHandle extends ParserAstNode {
+  final Token elementsEndToken;
+  final int elementsCount;
+
+  EnumElementsHandle(ParserAstType type,
+      {required this.elementsEndToken, required this.elementsCount})
+      : super("EnumElements", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "elementsEndToken": elementsEndToken,
+        "elementsCount": elementsCount,
+      };
+}
+
+class EnumHeaderHandle extends ParserAstNode {
+  final Token enumKeyword;
+  final Token leftBrace;
+
+  EnumHeaderHandle(ParserAstType type,
+      {required this.enumKeyword, required this.leftBrace})
+      : super("EnumHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+        "leftBrace": leftBrace,
+      };
+}
+
+class EnumElementHandle extends ParserAstNode {
+  final Token beginToken;
+
+  EnumElementHandle(ParserAstType type, {required this.beginToken})
+      : super("EnumElement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+      };
+}
+
+class EnumFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  EnumFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("EnumFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class ExportBegin extends ParserAstNode {
+  final Token token;
+
+  ExportBegin(ParserAstType type, {required this.token})
+      : super("Export", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ExportEnd extends ParserAstNode {
+  final Token exportKeyword;
+  final Token semicolon;
+
+  ExportEnd(ParserAstType type,
+      {required this.exportKeyword, required this.semicolon})
+      : super("Export", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "exportKeyword": exportKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class ExtraneousExpressionHandle extends ParserAstNode {
+  final Token token;
+  final Message message;
+
+  ExtraneousExpressionHandle(ParserAstType type,
+      {required this.token, required this.message})
+      : super("ExtraneousExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "message": message,
+      };
+}
+
+class ExpressionStatementHandle extends ParserAstNode {
+  final Token token;
+
+  ExpressionStatementHandle(ParserAstType type, {required this.token})
+      : super("ExpressionStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FactoryMethodBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token lastConsumed;
+  final Token? externalToken;
+  final Token? constToken;
+
+  FactoryMethodBegin(ParserAstType type,
+      {required this.declarationKind,
+      required this.lastConsumed,
+      this.externalToken,
+      this.constToken})
+      : super("FactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "lastConsumed": lastConsumed,
+        "externalToken": externalToken,
+        "constToken": constToken,
+      };
+}
+
+class ClassFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  ClassFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("ClassFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class MixinFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  MixinFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("MixinFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  ExtensionFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("ExtensionFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class FormalParameterBegin extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+  final Token? requiredToken;
+  final Token? covariantToken;
+  final Token? varFinalOrConst;
+
+  FormalParameterBegin(ParserAstType type,
+      {required this.token,
+      required this.kind,
+      this.requiredToken,
+      this.covariantToken,
+      this.varFinalOrConst})
+      : super("FormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+        "requiredToken": requiredToken,
+        "covariantToken": covariantToken,
+        "varFinalOrConst": varFinalOrConst,
+      };
+}
+
+class FormalParameterEnd extends ParserAstNode {
+  final Token? thisKeyword;
+  final Token? superKeyword;
+  final Token? periodAfterThisOrSuper;
+  final Token nameToken;
+  final Token? initializerStart;
+  final Token? initializerEnd;
+  final FormalParameterKind kind;
+  final MemberKind memberKind;
+
+  FormalParameterEnd(ParserAstType type,
+      {this.thisKeyword,
+      this.superKeyword,
+      this.periodAfterThisOrSuper,
+      required this.nameToken,
+      this.initializerStart,
+      this.initializerEnd,
+      required this.kind,
+      required this.memberKind})
+      : super("FormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "thisKeyword": thisKeyword,
+        "superKeyword": superKeyword,
+        "periodAfterThisOrSuper": periodAfterThisOrSuper,
+        "nameToken": nameToken,
+        "initializerStart": initializerStart,
+        "initializerEnd": initializerEnd,
+        "kind": kind,
+        "memberKind": memberKind,
+      };
+}
+
+class NoFormalParametersHandle extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+
+  NoFormalParametersHandle(ParserAstType type,
+      {required this.token, required this.kind})
+      : super("NoFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+      };
+}
+
+class FormalParametersBegin extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+
+  FormalParametersBegin(ParserAstType type,
+      {required this.token, required this.kind})
+      : super("FormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+      };
+}
+
+class FormalParametersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+  final MemberKind kind;
+
+  FormalParametersEnd(ParserAstType type,
+      {required this.count,
+      required this.beginToken,
+      required this.endToken,
+      required this.kind})
+      : super("FormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "kind": kind,
+      };
+}
+
+class ClassFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ClassFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("ClassFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class MixinFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  MixinFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("MixinFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ExtensionFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("ExtensionFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class EnumFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  EnumFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("EnumFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class EnumMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  EnumMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("EnumMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ForInitializerEmptyStatementHandle extends ParserAstNode {
+  final Token token;
+
+  ForInitializerEmptyStatementHandle(ParserAstType type, {required this.token})
+      : super("ForInitializerEmptyStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInitializerExpressionStatementHandle extends ParserAstNode {
+  final Token token;
+  final bool forIn;
+
+  ForInitializerExpressionStatementHandle(ParserAstType type,
+      {required this.token, required this.forIn})
+      : super("ForInitializerExpressionStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "forIn": forIn,
+      };
+}
+
+class ForInitializerLocalVariableDeclarationHandle extends ParserAstNode {
+  final Token token;
+  final bool forIn;
+
+  ForInitializerLocalVariableDeclarationHandle(ParserAstType type,
+      {required this.token, required this.forIn})
+      : super("ForInitializerLocalVariableDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "forIn": forIn,
+      };
+}
+
+class ForStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ForStatementBegin(ParserAstType type, {required this.token})
+      : super("ForStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForLoopPartsHandle extends ParserAstNode {
+  final Token forKeyword;
+  final Token leftParen;
+  final Token leftSeparator;
+  final int updateExpressionCount;
+
+  ForLoopPartsHandle(ParserAstType type,
+      {required this.forKeyword,
+      required this.leftParen,
+      required this.leftSeparator,
+      required this.updateExpressionCount})
+      : super("ForLoopParts", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "forKeyword": forKeyword,
+        "leftParen": leftParen,
+        "leftSeparator": leftSeparator,
+        "updateExpressionCount": updateExpressionCount,
+      };
+}
+
+class ForStatementEnd extends ParserAstNode {
+  final Token endToken;
+
+  ForStatementEnd(ParserAstType type, {required this.endToken})
+      : super("ForStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class ForStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  ForStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("ForStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  ForStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("ForStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInLoopPartsHandle extends ParserAstNode {
+  final Token? awaitToken;
+  final Token forToken;
+  final Token leftParenthesis;
+  final Token inKeyword;
+
+  ForInLoopPartsHandle(ParserAstType type,
+      {this.awaitToken,
+      required this.forToken,
+      required this.leftParenthesis,
+      required this.inKeyword})
+      : super("ForInLoopParts", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "awaitToken": awaitToken,
+        "forToken": forToken,
+        "leftParenthesis": leftParenthesis,
+        "inKeyword": inKeyword,
+      };
+}
+
+class ForInEnd extends ParserAstNode {
+  final Token endToken;
+
+  ForInEnd(ParserAstType type, {required this.endToken}) : super("ForIn", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class ForInExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  ForInExpressionBegin(ParserAstType type, {required this.token})
+      : super("ForInExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  ForInExpressionEnd(ParserAstType type, {required this.token})
+      : super("ForInExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInBodyBegin extends ParserAstNode {
+  final Token token;
+
+  ForInBodyBegin(ParserAstType type, {required this.token})
+      : super("ForInBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInBodyEnd extends ParserAstNode {
+  final Token token;
+
+  ForInBodyEnd(ParserAstType type, {required this.token})
+      : super("ForInBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NamedFunctionExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  NamedFunctionExpressionBegin(ParserAstType type, {required this.token})
+      : super("NamedFunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NamedFunctionExpressionEnd extends ParserAstNode {
+  final Token endToken;
+
+  NamedFunctionExpressionEnd(ParserAstType type, {required this.endToken})
+      : super("NamedFunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class LocalFunctionDeclarationBegin extends ParserAstNode {
+  final Token token;
+
+  LocalFunctionDeclarationBegin(ParserAstType type, {required this.token})
+      : super("LocalFunctionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LocalFunctionDeclarationEnd extends ParserAstNode {
+  final Token endToken;
+
+  LocalFunctionDeclarationEnd(ParserAstType type, {required this.endToken})
+      : super("LocalFunctionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class BlockFunctionBodyBegin extends ParserAstNode {
+  final Token token;
+
+  BlockFunctionBodyBegin(ParserAstType type, {required this.token})
+      : super("BlockFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BlockFunctionBodyEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  BlockFunctionBodyEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("BlockFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class NoFunctionBodyHandle extends ParserAstNode {
+  final Token token;
+
+  NoFunctionBodyHandle(ParserAstType type, {required this.token})
+      : super("NoFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionBodySkippedHandle extends ParserAstNode {
+  final Token token;
+  final bool isExpressionBody;
+
+  FunctionBodySkippedHandle(ParserAstType type,
+      {required this.token, required this.isExpressionBody})
+      : super("FunctionBodySkipped", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "isExpressionBody": isExpressionBody,
+      };
+}
+
+class FunctionNameBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionNameBegin(ParserAstType type, {required this.token})
+      : super("FunctionName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionNameEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token token;
+
+  FunctionNameEnd(ParserAstType type,
+      {required this.beginToken, required this.token})
+      : super("FunctionName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "token": token,
+      };
+}
+
+class TypedefBegin extends ParserAstNode {
+  final Token token;
+
+  TypedefBegin(ParserAstType type, {required this.token})
+      : super("Typedef", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypedefEnd extends ParserAstNode {
+  final Token typedefKeyword;
+  final Token? equals;
+  final Token endToken;
+
+  TypedefEnd(ParserAstType type,
+      {required this.typedefKeyword, this.equals, required this.endToken})
+      : super("Typedef", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "typedefKeyword": typedefKeyword,
+        "equals": equals,
+        "endToken": endToken,
+      };
+}
+
+class ClassWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  ClassWithClauseHandle(ParserAstType type, {required this.withKeyword})
+      : super("ClassWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class ClassNoWithClauseHandle extends ParserAstNode {
+  ClassNoWithClauseHandle(ParserAstType type)
+      : super("ClassNoWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class EnumWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  EnumWithClauseHandle(ParserAstType type, {required this.withKeyword})
+      : super("EnumWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class EnumNoWithClauseHandle extends ParserAstNode {
+  EnumNoWithClauseHandle(ParserAstType type) : super("EnumNoWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class NamedMixinApplicationBegin extends ParserAstNode {
+  final Token begin;
+  final Token? abstractToken;
+  final Token? macroToken;
+  final Token name;
+
+  NamedMixinApplicationBegin(ParserAstType type,
+      {required this.begin,
+      this.abstractToken,
+      this.macroToken,
+      required this.name})
+      : super("NamedMixinApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "abstractToken": abstractToken,
+        "macroToken": macroToken,
+        "name": name,
+      };
+}
+
+class NamedMixinApplicationWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  NamedMixinApplicationWithClauseHandle(ParserAstType type,
+      {required this.withKeyword})
+      : super("NamedMixinApplicationWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class NamedMixinApplicationEnd extends ParserAstNode {
+  final Token begin;
+  final Token classKeyword;
+  final Token equals;
+  final Token? implementsKeyword;
+  final Token endToken;
+
+  NamedMixinApplicationEnd(ParserAstType type,
+      {required this.begin,
+      required this.classKeyword,
+      required this.equals,
+      this.implementsKeyword,
+      required this.endToken})
+      : super("NamedMixinApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "classKeyword": classKeyword,
+        "equals": equals,
+        "implementsKeyword": implementsKeyword,
+        "endToken": endToken,
+      };
+}
+
+class HideBegin extends ParserAstNode {
+  final Token hideKeyword;
+
+  HideBegin(ParserAstType type, {required this.hideKeyword})
+      : super("Hide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hideKeyword": hideKeyword,
+      };
+}
+
+class HideEnd extends ParserAstNode {
+  final Token hideKeyword;
+
+  HideEnd(ParserAstType type, {required this.hideKeyword})
+      : super("Hide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hideKeyword": hideKeyword,
+      };
+}
+
+class IdentifierListHandle extends ParserAstNode {
+  final int count;
+
+  IdentifierListHandle(ParserAstType type, {required this.count})
+      : super("IdentifierList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class TypeListBegin extends ParserAstNode {
+  final Token token;
+
+  TypeListBegin(ParserAstType type, {required this.token})
+      : super("TypeList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeListEnd extends ParserAstNode {
+  final int count;
+
+  TypeListEnd(ParserAstType type, {required this.count})
+      : super("TypeList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class IfStatementBegin extends ParserAstNode {
+  final Token token;
+
+  IfStatementBegin(ParserAstType type, {required this.token})
+      : super("IfStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfStatementEnd extends ParserAstNode {
+  final Token ifToken;
+  final Token? elseToken;
+
+  IfStatementEnd(ParserAstType type, {required this.ifToken, this.elseToken})
+      : super("IfStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifToken": ifToken,
+        "elseToken": elseToken,
+      };
+}
+
+class ThenStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ThenStatementBegin(ParserAstType type, {required this.token})
+      : super("ThenStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ThenStatementEnd extends ParserAstNode {
+  final Token token;
+
+  ThenStatementEnd(ParserAstType type, {required this.token})
+      : super("ThenStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ElseStatementBegin(ParserAstType type, {required this.token})
+      : super("ElseStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseStatementEnd extends ParserAstNode {
+  final Token token;
+
+  ElseStatementEnd(ParserAstType type, {required this.token})
+      : super("ElseStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ImportBegin extends ParserAstNode {
+  final Token importKeyword;
+
+  ImportBegin(ParserAstType type, {required this.importKeyword})
+      : super("Import", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "importKeyword": importKeyword,
+      };
+}
+
+class ImportPrefixHandle extends ParserAstNode {
+  final Token? deferredKeyword;
+  final Token? asKeyword;
+
+  ImportPrefixHandle(ParserAstType type, {this.deferredKeyword, this.asKeyword})
+      : super("ImportPrefix", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "deferredKeyword": deferredKeyword,
+        "asKeyword": asKeyword,
+      };
+}
+
+class ImportEnd extends ParserAstNode {
+  final Token importKeyword;
+  final Token? semicolon;
+
+  ImportEnd(ParserAstType type, {required this.importKeyword, this.semicolon})
+      : super("Import", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "importKeyword": importKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class RecoverImportHandle extends ParserAstNode {
+  final Token? semicolon;
+
+  RecoverImportHandle(ParserAstType type, {this.semicolon})
+      : super("RecoverImport", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "semicolon": semicolon,
+      };
+}
+
+class ConditionalUrisBegin extends ParserAstNode {
+  final Token token;
+
+  ConditionalUrisBegin(ParserAstType type, {required this.token})
+      : super("ConditionalUris", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConditionalUrisEnd extends ParserAstNode {
+  final int count;
+
+  ConditionalUrisEnd(ParserAstType type, {required this.count})
+      : super("ConditionalUris", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class ConditionalUriBegin extends ParserAstNode {
+  final Token ifKeyword;
+
+  ConditionalUriBegin(ParserAstType type, {required this.ifKeyword})
+      : super("ConditionalUri", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifKeyword": ifKeyword,
+      };
+}
+
+class ConditionalUriEnd extends ParserAstNode {
+  final Token ifKeyword;
+  final Token leftParen;
+  final Token? equalSign;
+
+  ConditionalUriEnd(ParserAstType type,
+      {required this.ifKeyword, required this.leftParen, this.equalSign})
+      : super("ConditionalUri", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifKeyword": ifKeyword,
+        "leftParen": leftParen,
+        "equalSign": equalSign,
+      };
+}
+
+class DottedNameHandle extends ParserAstNode {
+  final int count;
+  final Token firstIdentifier;
+
+  DottedNameHandle(ParserAstType type,
+      {required this.count, required this.firstIdentifier})
+      : super("DottedName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "firstIdentifier": firstIdentifier,
+      };
+}
+
+class ImplicitCreationExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  ImplicitCreationExpressionBegin(ParserAstType type, {required this.token})
+      : super("ImplicitCreationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ImplicitCreationExpressionEnd extends ParserAstNode {
+  final Token token;
+  final Token openAngleBracket;
+
+  ImplicitCreationExpressionEnd(ParserAstType type,
+      {required this.token, required this.openAngleBracket})
+      : super("ImplicitCreationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "openAngleBracket": openAngleBracket,
+      };
+}
+
+class InitializedIdentifierBegin extends ParserAstNode {
+  final Token token;
+
+  InitializedIdentifierBegin(ParserAstType type, {required this.token})
+      : super("InitializedIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializedIdentifierEnd extends ParserAstNode {
+  final Token nameToken;
+
+  InitializedIdentifierEnd(ParserAstType type, {required this.nameToken})
+      : super("InitializedIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nameToken": nameToken,
+      };
+}
+
+class FieldInitializerBegin extends ParserAstNode {
+  final Token token;
+
+  FieldInitializerBegin(ParserAstType type, {required this.token})
+      : super("FieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FieldInitializerEnd extends ParserAstNode {
+  final Token assignment;
+  final Token token;
+
+  FieldInitializerEnd(ParserAstType type,
+      {required this.assignment, required this.token})
+      : super("FieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assignment": assignment,
+        "token": token,
+      };
+}
+
+class NoFieldInitializerHandle extends ParserAstNode {
+  final Token token;
+
+  NoFieldInitializerHandle(ParserAstType type, {required this.token})
+      : super("NoFieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VariableInitializerBegin extends ParserAstNode {
+  final Token token;
+
+  VariableInitializerBegin(ParserAstType type, {required this.token})
+      : super("VariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VariableInitializerEnd extends ParserAstNode {
+  final Token assignmentOperator;
+
+  VariableInitializerEnd(ParserAstType type, {required this.assignmentOperator})
+      : super("VariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assignmentOperator": assignmentOperator,
+      };
+}
+
+class NoVariableInitializerHandle extends ParserAstNode {
+  final Token token;
+
+  NoVariableInitializerHandle(ParserAstType type, {required this.token})
+      : super("NoVariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializerBegin extends ParserAstNode {
+  final Token token;
+
+  InitializerBegin(ParserAstType type, {required this.token})
+      : super("Initializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializerEnd extends ParserAstNode {
+  final Token token;
+
+  InitializerEnd(ParserAstType type, {required this.token})
+      : super("Initializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializersBegin extends ParserAstNode {
+  final Token token;
+
+  InitializersBegin(ParserAstType type, {required this.token})
+      : super("Initializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  InitializersEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("Initializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class NoInitializersHandle extends ParserAstNode {
+  NoInitializersHandle(ParserAstType type) : super("NoInitializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class InvalidExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidExpressionHandle(ParserAstType type, {required this.token})
+      : super("InvalidExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InvalidFunctionBodyHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidFunctionBodyHandle(ParserAstType type, {required this.token})
+      : super("InvalidFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InvalidTypeReferenceHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTypeReferenceHandle(ParserAstType type, {required this.token})
+      : super("InvalidTypeReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LabelHandle extends ParserAstNode {
+  final Token token;
+
+  LabelHandle(ParserAstType type, {required this.token}) : super("Label", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LabeledStatementBegin extends ParserAstNode {
+  final Token token;
+  final int labelCount;
+
+  LabeledStatementBegin(ParserAstType type,
+      {required this.token, required this.labelCount})
+      : super("LabeledStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "labelCount": labelCount,
+      };
+}
+
+class LabeledStatementEnd extends ParserAstNode {
+  final int labelCount;
+
+  LabeledStatementEnd(ParserAstType type, {required this.labelCount})
+      : super("LabeledStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+      };
+}
+
+class LibraryNameBegin extends ParserAstNode {
+  final Token token;
+
+  LibraryNameBegin(ParserAstType type, {required this.token})
+      : super("LibraryName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LibraryNameEnd extends ParserAstNode {
+  final Token libraryKeyword;
+  final Token semicolon;
+
+  LibraryNameEnd(ParserAstType type,
+      {required this.libraryKeyword, required this.semicolon})
+      : super("LibraryName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "libraryKeyword": libraryKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class LiteralMapEntryHandle extends ParserAstNode {
+  final Token colon;
+  final Token endToken;
+
+  LiteralMapEntryHandle(ParserAstType type,
+      {required this.colon, required this.endToken})
+      : super("LiteralMapEntry", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+        "endToken": endToken,
+      };
+}
+
+class LiteralStringBegin extends ParserAstNode {
+  final Token token;
+
+  LiteralStringBegin(ParserAstType type, {required this.token})
+      : super("LiteralString", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InterpolationExpressionHandle extends ParserAstNode {
+  final Token leftBracket;
+  final Token? rightBracket;
+
+  InterpolationExpressionHandle(ParserAstType type,
+      {required this.leftBracket, this.rightBracket})
+      : super("InterpolationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "leftBracket": leftBracket,
+        "rightBracket": rightBracket,
+      };
+}
+
+class LiteralStringEnd extends ParserAstNode {
+  final int interpolationCount;
+  final Token endToken;
+
+  LiteralStringEnd(ParserAstType type,
+      {required this.interpolationCount, required this.endToken})
+      : super("LiteralString", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "interpolationCount": interpolationCount,
+        "endToken": endToken,
+      };
+}
+
+class StringJuxtapositionHandle extends ParserAstNode {
+  final Token startToken;
+  final int literalCount;
+
+  StringJuxtapositionHandle(ParserAstType type,
+      {required this.startToken, required this.literalCount})
+      : super("StringJuxtaposition", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "startToken": startToken,
+        "literalCount": literalCount,
+      };
+}
+
+class MemberBegin extends ParserAstNode {
+  MemberBegin(ParserAstType type) : super("Member", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class InvalidMemberHandle extends ParserAstNode {
+  final Token endToken;
+
+  InvalidMemberHandle(ParserAstType type, {required this.endToken})
+      : super("InvalidMember", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class MemberEnd extends ParserAstNode {
+  MemberEnd(ParserAstType type) : super("Member", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class MethodBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? varFinalOrConst;
+  final Token? getOrSet;
+  final Token name;
+
+  MethodBegin(ParserAstType type,
+      {required this.declarationKind,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.varFinalOrConst,
+      this.getOrSet,
+      required this.name})
+      : super("Method", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "varFinalOrConst": varFinalOrConst,
+        "getOrSet": getOrSet,
+        "name": name,
+      };
+}
+
+class ClassMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ClassMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ClassMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MixinMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  MixinMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("MixinMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ExtensionMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ExtensionMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ClassConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ClassConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ClassConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MixinConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  MixinConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("MixinConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ExtensionConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ExtensionConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MetadataStarBegin extends ParserAstNode {
+  final Token token;
+
+  MetadataStarBegin(ParserAstType type, {required this.token})
+      : super("MetadataStar", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class MetadataStarEnd extends ParserAstNode {
+  final int count;
+
+  MetadataStarEnd(ParserAstType type, {required this.count})
+      : super("MetadataStar", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class MetadataBegin extends ParserAstNode {
+  final Token token;
+
+  MetadataBegin(ParserAstType type, {required this.token})
+      : super("Metadata", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class MetadataEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? periodBeforeName;
+  final Token endToken;
+
+  MetadataEnd(ParserAstType type,
+      {required this.beginToken, this.periodBeforeName, required this.endToken})
+      : super("Metadata", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "periodBeforeName": periodBeforeName,
+        "endToken": endToken,
+      };
+}
+
+class OptionalFormalParametersBegin extends ParserAstNode {
+  final Token token;
+
+  OptionalFormalParametersBegin(ParserAstType type, {required this.token})
+      : super("OptionalFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OptionalFormalParametersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  OptionalFormalParametersEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("OptionalFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class PartBegin extends ParserAstNode {
+  final Token token;
+
+  PartBegin(ParserAstType type, {required this.token}) : super("Part", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class PartEnd extends ParserAstNode {
+  final Token partKeyword;
+  final Token semicolon;
+
+  PartEnd(ParserAstType type,
+      {required this.partKeyword, required this.semicolon})
+      : super("Part", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "partKeyword": partKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class PartOfBegin extends ParserAstNode {
+  final Token token;
+
+  PartOfBegin(ParserAstType type, {required this.token})
+      : super("PartOf", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class PartOfEnd extends ParserAstNode {
+  final Token partKeyword;
+  final Token ofKeyword;
+  final Token semicolon;
+  final bool hasName;
+
+  PartOfEnd(ParserAstType type,
+      {required this.partKeyword,
+      required this.ofKeyword,
+      required this.semicolon,
+      required this.hasName})
+      : super("PartOf", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "partKeyword": partKeyword,
+        "ofKeyword": ofKeyword,
+        "semicolon": semicolon,
+        "hasName": hasName,
+      };
+}
+
+class RedirectingFactoryBodyBegin extends ParserAstNode {
+  final Token token;
+
+  RedirectingFactoryBodyBegin(ParserAstType type, {required this.token})
+      : super("RedirectingFactoryBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class RedirectingFactoryBodyEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  RedirectingFactoryBodyEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("RedirectingFactoryBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ReturnStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ReturnStatementBegin(ParserAstType type, {required this.token})
+      : super("ReturnStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NativeFunctionBodyHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodyHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class NativeFunctionBodyIgnoredHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodyIgnoredHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBodyIgnored", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class NativeFunctionBodySkippedHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodySkippedHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBodySkipped", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class EmptyFunctionBodyHandle extends ParserAstNode {
+  final Token semicolon;
+
+  EmptyFunctionBodyHandle(ParserAstType type, {required this.semicolon})
+      : super("EmptyFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "semicolon": semicolon,
+      };
+}
+
+class ExpressionFunctionBodyHandle extends ParserAstNode {
+  final Token arrowToken;
+  final Token? endToken;
+
+  ExpressionFunctionBodyHandle(ParserAstType type,
+      {required this.arrowToken, this.endToken})
+      : super("ExpressionFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "arrowToken": arrowToken,
+        "endToken": endToken,
+      };
+}
+
+class ReturnStatementEnd extends ParserAstNode {
+  final bool hasExpression;
+  final Token beginToken;
+  final Token endToken;
+
+  ReturnStatementEnd(ParserAstType type,
+      {required this.hasExpression,
+      required this.beginToken,
+      required this.endToken})
+      : super("ReturnStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasExpression": hasExpression,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class SendHandle extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  SendHandle(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("Send", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ShowBegin extends ParserAstNode {
+  final Token showKeyword;
+
+  ShowBegin(ParserAstType type, {required this.showKeyword})
+      : super("Show", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+      };
+}
+
+class ShowEnd extends ParserAstNode {
+  final Token showKeyword;
+
+  ShowEnd(ParserAstType type, {required this.showKeyword})
+      : super("Show", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+      };
+}
+
+class SwitchStatementBegin extends ParserAstNode {
+  final Token token;
+
+  SwitchStatementBegin(ParserAstType type, {required this.token})
+      : super("SwitchStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SwitchStatementEnd extends ParserAstNode {
+  final Token switchKeyword;
+  final Token endToken;
+
+  SwitchStatementEnd(ParserAstType type,
+      {required this.switchKeyword, required this.endToken})
+      : super("SwitchStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "switchKeyword": switchKeyword,
+        "endToken": endToken,
+      };
+}
+
+class SwitchBlockBegin extends ParserAstNode {
+  final Token token;
+
+  SwitchBlockBegin(ParserAstType type, {required this.token})
+      : super("SwitchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SwitchBlockEnd extends ParserAstNode {
+  final int caseCount;
+  final Token beginToken;
+  final Token endToken;
+
+  SwitchBlockEnd(ParserAstType type,
+      {required this.caseCount,
+      required this.beginToken,
+      required this.endToken})
+      : super("SwitchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseCount": caseCount,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class LiteralSymbolBegin extends ParserAstNode {
+  final Token token;
+
+  LiteralSymbolBegin(ParserAstType type, {required this.token})
+      : super("LiteralSymbol", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralSymbolEnd extends ParserAstNode {
+  final Token hashToken;
+  final int identifierCount;
+
+  LiteralSymbolEnd(ParserAstType type,
+      {required this.hashToken, required this.identifierCount})
+      : super("LiteralSymbol", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hashToken": hashToken,
+        "identifierCount": identifierCount,
+      };
+}
+
+class ThrowExpressionHandle extends ParserAstNode {
+  final Token throwToken;
+  final Token endToken;
+
+  ThrowExpressionHandle(ParserAstType type,
+      {required this.throwToken, required this.endToken})
+      : super("ThrowExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "throwToken": throwToken,
+        "endToken": endToken,
+      };
+}
+
+class RethrowStatementBegin extends ParserAstNode {
+  final Token token;
+
+  RethrowStatementBegin(ParserAstType type, {required this.token})
+      : super("RethrowStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class RethrowStatementEnd extends ParserAstNode {
+  final Token rethrowToken;
+  final Token endToken;
+
+  RethrowStatementEnd(ParserAstType type,
+      {required this.rethrowToken, required this.endToken})
+      : super("RethrowStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "rethrowToken": rethrowToken,
+        "endToken": endToken,
+      };
+}
+
+class TopLevelDeclarationEnd extends ParserAstNode {
+  final Token nextToken;
+
+  TopLevelDeclarationEnd(ParserAstType type, {required this.nextToken})
+      : super("TopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nextToken": nextToken,
+      };
+}
+
+class InvalidTopLevelDeclarationHandle extends ParserAstNode {
+  final Token endToken;
+
+  InvalidTopLevelDeclarationHandle(ParserAstType type, {required this.endToken})
+      : super("InvalidTopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class TopLevelMemberBegin extends ParserAstNode {
+  final Token token;
+
+  TopLevelMemberBegin(ParserAstType type, {required this.token})
+      : super("TopLevelMember", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FieldsBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final Token lastConsumed;
+
+  FieldsBegin(ParserAstType type,
+      {required this.declarationKind,
+      this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.lastConsumed})
+      : super("Fields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "lastConsumed": lastConsumed,
+      };
+}
+
+class TopLevelFieldsEnd extends ParserAstNode {
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  TopLevelFieldsEnd(ParserAstType type,
+      {this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("TopLevelFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class TopLevelMethodBegin extends ParserAstNode {
+  final Token lastConsumed;
+  final Token? externalToken;
+
+  TopLevelMethodBegin(ParserAstType type,
+      {required this.lastConsumed, this.externalToken})
+      : super("TopLevelMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "lastConsumed": lastConsumed,
+        "externalToken": externalToken,
+      };
+}
+
+class TopLevelMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? getOrSet;
+  final Token endToken;
+
+  TopLevelMethodEnd(ParserAstType type,
+      {required this.beginToken, this.getOrSet, required this.endToken})
+      : super("TopLevelMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "getOrSet": getOrSet,
+        "endToken": endToken,
+      };
+}
+
+class TryStatementBegin extends ParserAstNode {
+  final Token token;
+
+  TryStatementBegin(ParserAstType type, {required this.token})
+      : super("TryStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CaseMatchHandle extends ParserAstNode {
+  final Token caseKeyword;
+  final Token colon;
+
+  CaseMatchHandle(ParserAstType type,
+      {required this.caseKeyword, required this.colon})
+      : super("CaseMatch", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseKeyword": caseKeyword,
+        "colon": colon,
+      };
+}
+
+class CatchClauseBegin extends ParserAstNode {
+  final Token token;
+
+  CatchClauseBegin(ParserAstType type, {required this.token})
+      : super("CatchClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CatchClauseEnd extends ParserAstNode {
+  final Token token;
+
+  CatchClauseEnd(ParserAstType type, {required this.token})
+      : super("CatchClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CatchBlockHandle extends ParserAstNode {
+  final Token? onKeyword;
+  final Token? catchKeyword;
+  final Token? comma;
+
+  CatchBlockHandle(ParserAstType type,
+      {this.onKeyword, this.catchKeyword, this.comma})
+      : super("CatchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "onKeyword": onKeyword,
+        "catchKeyword": catchKeyword,
+        "comma": comma,
+      };
+}
+
+class FinallyBlockHandle extends ParserAstNode {
+  final Token finallyKeyword;
+
+  FinallyBlockHandle(ParserAstType type, {required this.finallyKeyword})
+      : super("FinallyBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "finallyKeyword": finallyKeyword,
+      };
+}
+
+class TryStatementEnd extends ParserAstNode {
+  final int catchCount;
+  final Token tryKeyword;
+  final Token? finallyKeyword;
+
+  TryStatementEnd(ParserAstType type,
+      {required this.catchCount, required this.tryKeyword, this.finallyKeyword})
+      : super("TryStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "catchCount": catchCount,
+        "tryKeyword": tryKeyword,
+        "finallyKeyword": finallyKeyword,
+      };
+}
+
+class TypeHandle extends ParserAstNode {
+  final Token beginToken;
+  final Token? questionMark;
+
+  TypeHandle(ParserAstType type, {required this.beginToken, this.questionMark})
+      : super("Type", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "questionMark": questionMark,
+      };
+}
+
+class NonNullAssertExpressionHandle extends ParserAstNode {
+  final Token bang;
+
+  NonNullAssertExpressionHandle(ParserAstType type, {required this.bang})
+      : super("NonNullAssertExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "bang": bang,
+      };
+}
+
+class NoNameHandle extends ParserAstNode {
+  final Token token;
+
+  NoNameHandle(ParserAstType type, {required this.token})
+      : super("NoName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionTypeBegin extends ParserAstNode {
+  final Token beginToken;
+
+  FunctionTypeBegin(ParserAstType type, {required this.beginToken})
+      : super("FunctionType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+      };
+}
+
+class FunctionTypeEnd extends ParserAstNode {
+  final Token functionToken;
+  final Token? questionMark;
+
+  FunctionTypeEnd(ParserAstType type,
+      {required this.functionToken, this.questionMark})
+      : super("FunctionType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "functionToken": functionToken,
+        "questionMark": questionMark,
+      };
+}
+
+class TypeArgumentsBegin extends ParserAstNode {
+  final Token token;
+
+  TypeArgumentsBegin(ParserAstType type, {required this.token})
+      : super("TypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeArgumentsEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  TypeArgumentsEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("TypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("InvalidTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("NoTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariableBegin extends ParserAstNode {
+  final Token token;
+
+  TypeVariableBegin(ParserAstType type, {required this.token})
+      : super("TypeVariable", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariablesDefinedHandle extends ParserAstNode {
+  final Token token;
+  final int count;
+
+  TypeVariablesDefinedHandle(ParserAstType type,
+      {required this.token, required this.count})
+      : super("TypeVariablesDefined", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "count": count,
+      };
+}
+
+class TypeVariableEnd extends ParserAstNode {
+  final Token token;
+  final int index;
+  final Token? extendsOrSuper;
+  final Token? variance;
+
+  TypeVariableEnd(ParserAstType type,
+      {required this.token,
+      required this.index,
+      this.extendsOrSuper,
+      this.variance})
+      : super("TypeVariable", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "index": index,
+        "extendsOrSuper": extendsOrSuper,
+        "variance": variance,
+      };
+}
+
+class TypeVariablesBegin extends ParserAstNode {
+  final Token token;
+
+  TypeVariablesBegin(ParserAstType type, {required this.token})
+      : super("TypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariablesEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  TypeVariablesEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("TypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class FunctionExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionExpressionBegin(ParserAstType type, {required this.token})
+      : super("FunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token token;
+
+  FunctionExpressionEnd(ParserAstType type,
+      {required this.beginToken, required this.token})
+      : super("FunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "token": token,
+      };
+}
+
+class VariablesDeclarationBegin extends ParserAstNode {
+  final Token token;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+
+  VariablesDeclarationBegin(ParserAstType type,
+      {required this.token, this.lateToken, this.varFinalOrConst})
+      : super("VariablesDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+      };
+}
+
+class VariablesDeclarationEnd extends ParserAstNode {
+  final int count;
+  final Token? endToken;
+
+  VariablesDeclarationEnd(ParserAstType type,
+      {required this.count, this.endToken})
+      : super("VariablesDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "endToken": endToken,
+      };
+}
+
+class WhileStatementBegin extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBegin(ParserAstType type, {required this.token})
+      : super("WhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementEnd extends ParserAstNode {
+  final Token whileKeyword;
+  final Token endToken;
+
+  WhileStatementEnd(ParserAstType type,
+      {required this.whileKeyword, required this.endToken})
+      : super("WhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "whileKeyword": whileKeyword,
+        "endToken": endToken,
+      };
+}
+
+class AsOperatorTypeBegin extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorTypeBegin(ParserAstType type, {required this.operator})
+      : super("AsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AsOperatorTypeEnd extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorTypeEnd(ParserAstType type, {required this.operator})
+      : super("AsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AsOperatorHandle extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorHandle(ParserAstType type, {required this.operator})
+      : super("AsOperator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  AssignmentExpressionHandle(ParserAstType type, {required this.token})
+      : super("AssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BinaryExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  BinaryExpressionBegin(ParserAstType type, {required this.token})
+      : super("BinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BinaryExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  BinaryExpressionEnd(ParserAstType type, {required this.token})
+      : super("BinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class EndingBinaryExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  EndingBinaryExpressionHandle(ParserAstType type, {required this.token})
+      : super("EndingBinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConditionalExpressionBegin extends ParserAstNode {
+  final Token question;
+
+  ConditionalExpressionBegin(ParserAstType type, {required this.question})
+      : super("ConditionalExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+      };
+}
+
+class ConditionalExpressionColonHandle extends ParserAstNode {
+  ConditionalExpressionColonHandle(ParserAstType type)
+      : super("ConditionalExpressionColon", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ConditionalExpressionEnd extends ParserAstNode {
+  final Token question;
+  final Token colon;
+
+  ConditionalExpressionEnd(ParserAstType type,
+      {required this.question, required this.colon})
+      : super("ConditionalExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+        "colon": colon,
+      };
+}
+
+class ConstExpressionBegin extends ParserAstNode {
+  final Token constKeyword;
+
+  ConstExpressionBegin(ParserAstType type, {required this.constKeyword})
+      : super("ConstExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "constKeyword": constKeyword,
+      };
+}
+
+class ConstExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  ConstExpressionEnd(ParserAstType type, {required this.token})
+      : super("ConstExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstFactoryHandle extends ParserAstNode {
+  final Token constKeyword;
+
+  ConstFactoryHandle(ParserAstType type, {required this.constKeyword})
+      : super("ConstFactory", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "constKeyword": constKeyword,
+      };
+}
+
+class ForControlFlowBegin extends ParserAstNode {
+  final Token? awaitToken;
+  final Token forToken;
+
+  ForControlFlowBegin(ParserAstType type,
+      {this.awaitToken, required this.forToken})
+      : super("ForControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "awaitToken": awaitToken,
+        "forToken": forToken,
+      };
+}
+
+class ForControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  ForControlFlowEnd(ParserAstType type, {required this.token})
+      : super("ForControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  ForInControlFlowEnd(ParserAstType type, {required this.token})
+      : super("ForInControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfControlFlowBegin extends ParserAstNode {
+  final Token ifToken;
+
+  IfControlFlowBegin(ParserAstType type, {required this.ifToken})
+      : super("IfControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifToken": ifToken,
+      };
+}
+
+class ThenControlFlowHandle extends ParserAstNode {
+  final Token token;
+
+  ThenControlFlowHandle(ParserAstType type, {required this.token})
+      : super("ThenControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseControlFlowHandle extends ParserAstNode {
+  final Token elseToken;
+
+  ElseControlFlowHandle(ParserAstType type, {required this.elseToken})
+      : super("ElseControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "elseToken": elseToken,
+      };
+}
+
+class IfControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  IfControlFlowEnd(ParserAstType type, {required this.token})
+      : super("IfControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfElseControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  IfElseControlFlowEnd(ParserAstType type, {required this.token})
+      : super("IfElseControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SpreadExpressionHandle extends ParserAstNode {
+  final Token spreadToken;
+
+  SpreadExpressionHandle(ParserAstType type, {required this.spreadToken})
+      : super("SpreadExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "spreadToken": spreadToken,
+      };
+}
+
+class FunctionTypedFormalParameterBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionTypedFormalParameterBegin(ParserAstType type, {required this.token})
+      : super("FunctionTypedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionTypedFormalParameterEnd extends ParserAstNode {
+  final Token nameToken;
+  final Token? question;
+
+  FunctionTypedFormalParameterEnd(ParserAstType type,
+      {required this.nameToken, this.question})
+      : super("FunctionTypedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nameToken": nameToken,
+        "question": question,
+      };
+}
+
+class IdentifierHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  IdentifierHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("Identifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class ShowHideIdentifierHandle extends ParserAstNode {
+  final Token? modifier;
+  final Token identifier;
+
+  ShowHideIdentifierHandle(ParserAstType type,
+      {this.modifier, required this.identifier})
+      : super("ShowHideIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "modifier": modifier,
+        "identifier": identifier,
+      };
+}
+
+class IndexedExpressionHandle extends ParserAstNode {
+  final Token? question;
+  final Token openSquareBracket;
+  final Token closeSquareBracket;
+
+  IndexedExpressionHandle(ParserAstType type,
+      {this.question,
+      required this.openSquareBracket,
+      required this.closeSquareBracket})
+      : super("IndexedExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+        "openSquareBracket": openSquareBracket,
+        "closeSquareBracket": closeSquareBracket,
+      };
+}
+
+class IsOperatorTypeBegin extends ParserAstNode {
+  final Token operator;
+
+  IsOperatorTypeBegin(ParserAstType type, {required this.operator})
+      : super("IsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class IsOperatorTypeEnd extends ParserAstNode {
+  final Token operator;
+
+  IsOperatorTypeEnd(ParserAstType type, {required this.operator})
+      : super("IsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class IsOperatorHandle extends ParserAstNode {
+  final Token isOperator;
+  final Token? not;
+
+  IsOperatorHandle(ParserAstType type, {required this.isOperator, this.not})
+      : super("IsOperator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "isOperator": isOperator,
+        "not": not,
+      };
+}
+
+class LiteralBoolHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralBoolHandle(ParserAstType type, {required this.token})
+      : super("LiteralBool", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BreakStatementHandle extends ParserAstNode {
+  final bool hasTarget;
+  final Token breakKeyword;
+  final Token endToken;
+
+  BreakStatementHandle(ParserAstType type,
+      {required this.hasTarget,
+      required this.breakKeyword,
+      required this.endToken})
+      : super("BreakStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasTarget": hasTarget,
+        "breakKeyword": breakKeyword,
+        "endToken": endToken,
+      };
+}
+
+class ContinueStatementHandle extends ParserAstNode {
+  final bool hasTarget;
+  final Token continueKeyword;
+  final Token endToken;
+
+  ContinueStatementHandle(ParserAstType type,
+      {required this.hasTarget,
+      required this.continueKeyword,
+      required this.endToken})
+      : super("ContinueStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasTarget": hasTarget,
+        "continueKeyword": continueKeyword,
+        "endToken": endToken,
+      };
+}
+
+class EmptyStatementHandle extends ParserAstNode {
+  final Token token;
+
+  EmptyStatementHandle(ParserAstType type, {required this.token})
+      : super("EmptyStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class AssertBegin extends ParserAstNode {
+  final Token assertKeyword;
+  final Assert kind;
+
+  AssertBegin(ParserAstType type,
+      {required this.assertKeyword, required this.kind})
+      : super("Assert", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assertKeyword": assertKeyword,
+        "kind": kind,
+      };
+}
+
+class AssertEnd extends ParserAstNode {
+  final Token assertKeyword;
+  final Assert kind;
+  final Token leftParenthesis;
+  final Token? commaToken;
+  final Token semicolonToken;
+
+  AssertEnd(ParserAstType type,
+      {required this.assertKeyword,
+      required this.kind,
+      required this.leftParenthesis,
+      this.commaToken,
+      required this.semicolonToken})
+      : super("Assert", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assertKeyword": assertKeyword,
+        "kind": kind,
+        "leftParenthesis": leftParenthesis,
+        "commaToken": commaToken,
+        "semicolonToken": semicolonToken,
+      };
+}
+
+class LiteralDoubleHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralDoubleHandle(ParserAstType type, {required this.token})
+      : super("LiteralDouble", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralIntHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralIntHandle(ParserAstType type, {required this.token})
+      : super("LiteralInt", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralListHandle extends ParserAstNode {
+  final int count;
+  final Token leftBracket;
+  final Token? constKeyword;
+  final Token rightBracket;
+
+  LiteralListHandle(ParserAstType type,
+      {required this.count,
+      required this.leftBracket,
+      this.constKeyword,
+      required this.rightBracket})
+      : super("LiteralList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "leftBracket": leftBracket,
+        "constKeyword": constKeyword,
+        "rightBracket": rightBracket,
+      };
+}
+
+class LiteralSetOrMapHandle extends ParserAstNode {
+  final int count;
+  final Token leftBrace;
+  final Token? constKeyword;
+  final Token rightBrace;
+  final bool hasSetEntry;
+
+  LiteralSetOrMapHandle(ParserAstType type,
+      {required this.count,
+      required this.leftBrace,
+      this.constKeyword,
+      required this.rightBrace,
+      required this.hasSetEntry})
+      : super("LiteralSetOrMap", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "leftBrace": leftBrace,
+        "constKeyword": constKeyword,
+        "rightBrace": rightBrace,
+        "hasSetEntry": hasSetEntry,
+      };
+}
+
+class LiteralNullHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralNullHandle(ParserAstType type, {required this.token})
+      : super("LiteralNull", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NativeClauseHandle extends ParserAstNode {
+  final Token nativeToken;
+  final bool hasName;
+
+  NativeClauseHandle(ParserAstType type,
+      {required this.nativeToken, required this.hasName})
+      : super("NativeClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "hasName": hasName,
+      };
+}
+
+class NamedArgumentHandle extends ParserAstNode {
+  final Token colon;
+
+  NamedArgumentHandle(ParserAstType type, {required this.colon})
+      : super("NamedArgument", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+      };
+}
+
+class NewExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  NewExpressionBegin(ParserAstType type, {required this.token})
+      : super("NewExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NewExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  NewExpressionEnd(ParserAstType type, {required this.token})
+      : super("NewExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  NoArgumentsHandle(ParserAstType type, {required this.token})
+      : super("NoArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoConstructorReferenceContinuationAfterTypeArgumentsHandle
+    extends ParserAstNode {
+  final Token token;
+
+  NoConstructorReferenceContinuationAfterTypeArgumentsHandle(ParserAstType type,
+      {required this.token})
+      : super("NoConstructorReferenceContinuationAfterTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoTypeNameInConstructorReferenceHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeNameInConstructorReferenceHandle(ParserAstType type,
+      {required this.token})
+      : super("NoTypeNameInConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoTypeHandle extends ParserAstNode {
+  final Token lastConsumed;
+
+  NoTypeHandle(ParserAstType type, {required this.lastConsumed})
+      : super("NoType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "lastConsumed": lastConsumed,
+      };
+}
+
+class NoTypeVariablesHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeVariablesHandle(ParserAstType type, {required this.token})
+      : super("NoTypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OperatorHandle extends ParserAstNode {
+  final Token token;
+
+  OperatorHandle(ParserAstType type, {required this.token})
+      : super("Operator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SymbolVoidHandle extends ParserAstNode {
+  final Token token;
+
+  SymbolVoidHandle(ParserAstType type, {required this.token})
+      : super("SymbolVoid", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OperatorNameHandle extends ParserAstNode {
+  final Token operatorKeyword;
+  final Token token;
+
+  OperatorNameHandle(ParserAstType type,
+      {required this.operatorKeyword, required this.token})
+      : super("OperatorName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operatorKeyword": operatorKeyword,
+        "token": token,
+      };
+}
+
+class InvalidOperatorNameHandle extends ParserAstNode {
+  final Token operatorKeyword;
+  final Token token;
+
+  InvalidOperatorNameHandle(ParserAstType type,
+      {required this.operatorKeyword, required this.token})
+      : super("InvalidOperatorName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operatorKeyword": operatorKeyword,
+        "token": token,
+      };
+}
+
+class ParenthesizedConditionHandle extends ParserAstNode {
+  final Token token;
+
+  ParenthesizedConditionHandle(ParserAstType type, {required this.token})
+      : super("ParenthesizedCondition", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ParenthesizedExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  ParenthesizedExpressionHandle(ParserAstType type, {required this.token})
+      : super("ParenthesizedExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class QualifiedHandle extends ParserAstNode {
+  final Token period;
+
+  QualifiedHandle(ParserAstType type, {required this.period})
+      : super("Qualified", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "period": period,
+      };
+}
+
+class StringPartHandle extends ParserAstNode {
+  final Token token;
+
+  StringPartHandle(ParserAstType type, {required this.token})
+      : super("StringPart", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SuperExpressionHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  SuperExpressionHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("SuperExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class SwitchCaseBegin extends ParserAstNode {
+  final int labelCount;
+  final int expressionCount;
+  final Token firstToken;
+
+  SwitchCaseBegin(ParserAstType type,
+      {required this.labelCount,
+      required this.expressionCount,
+      required this.firstToken})
+      : super("SwitchCase", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+        "expressionCount": expressionCount,
+        "firstToken": firstToken,
+      };
+}
+
+class SwitchCaseEnd extends ParserAstNode {
+  final int labelCount;
+  final int expressionCount;
+  final Token? defaultKeyword;
+  final Token? colonAfterDefault;
+  final int statementCount;
+  final Token firstToken;
+  final Token endToken;
+
+  SwitchCaseEnd(ParserAstType type,
+      {required this.labelCount,
+      required this.expressionCount,
+      this.defaultKeyword,
+      this.colonAfterDefault,
+      required this.statementCount,
+      required this.firstToken,
+      required this.endToken})
+      : super("SwitchCase", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+        "expressionCount": expressionCount,
+        "defaultKeyword": defaultKeyword,
+        "colonAfterDefault": colonAfterDefault,
+        "statementCount": statementCount,
+        "firstToken": firstToken,
+        "endToken": endToken,
+      };
+}
+
+class ThisExpressionHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  ThisExpressionHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("ThisExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class UnaryPostfixAssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPostfixAssignmentExpressionHandle(ParserAstType type,
+      {required this.token})
+      : super("UnaryPostfixAssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnaryPrefixExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPrefixExpressionHandle(ParserAstType type, {required this.token})
+      : super("UnaryPrefixExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnaryPrefixAssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPrefixAssignmentExpressionHandle(ParserAstType type,
+      {required this.token})
+      : super("UnaryPrefixAssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FormalParameterDefaultValueExpressionBegin extends ParserAstNode {
+  FormalParameterDefaultValueExpressionBegin(ParserAstType type)
+      : super("FormalParameterDefaultValueExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class FormalParameterDefaultValueExpressionEnd extends ParserAstNode {
+  FormalParameterDefaultValueExpressionEnd(ParserAstType type)
+      : super("FormalParameterDefaultValueExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ValuedFormalParameterHandle extends ParserAstNode {
+  final Token equals;
+  final Token token;
+
+  ValuedFormalParameterHandle(ParserAstType type,
+      {required this.equals, required this.token})
+      : super("ValuedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "equals": equals,
+        "token": token,
+      };
+}
+
+class FormalParameterWithoutValueHandle extends ParserAstNode {
+  final Token token;
+
+  FormalParameterWithoutValueHandle(ParserAstType type, {required this.token})
+      : super("FormalParameterWithoutValue", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VoidKeywordHandle extends ParserAstNode {
+  final Token token;
+
+  VoidKeywordHandle(ParserAstType type, {required this.token})
+      : super("VoidKeyword", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VoidKeywordWithTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  VoidKeywordWithTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("VoidKeywordWithTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class YieldStatementBegin extends ParserAstNode {
+  final Token token;
+
+  YieldStatementBegin(ParserAstType type, {required this.token})
+      : super("YieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class YieldStatementEnd extends ParserAstNode {
+  final Token yieldToken;
+  final Token? starToken;
+  final Token endToken;
+
+  YieldStatementEnd(ParserAstType type,
+      {required this.yieldToken, this.starToken, required this.endToken})
+      : super("YieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "yieldToken": yieldToken,
+        "starToken": starToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidYieldStatementEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? starToken;
+  final Token endToken;
+  final MessageCode errorCode;
+
+  InvalidYieldStatementEnd(ParserAstType type,
+      {required this.beginToken,
+      this.starToken,
+      required this.endToken,
+      required this.errorCode})
+      : super("InvalidYieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "starToken": starToken,
+        "endToken": endToken,
+        "errorCode": errorCode,
+      };
+}
+
+class RecoverableErrorHandle extends ParserAstNode {
+  final Message message;
+  final Token startToken;
+  final Token endToken;
+
+  RecoverableErrorHandle(ParserAstType type,
+      {required this.message, required this.startToken, required this.endToken})
+      : super("RecoverableError", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "message": message,
+        "startToken": startToken,
+        "endToken": endToken,
+      };
+}
+
+class ErrorTokenHandle extends ParserAstNode {
+  final ErrorToken token;
+
+  ErrorTokenHandle(ParserAstType type, {required this.token})
+      : super("ErrorToken", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnescapeErrorHandle extends ParserAstNode {
+  final Message message;
+  final Token location;
+  final int stringOffset;
+  final int length;
+
+  UnescapeErrorHandle(ParserAstType type,
+      {required this.message,
+      required this.location,
+      required this.stringOffset,
+      required this.length})
+      : super("UnescapeError", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "message": message,
+        "location": location,
+        "stringOffset": stringOffset,
+        "length": length,
+      };
+}
+
+class InvalidStatementHandle extends ParserAstNode {
+  final Token token;
+  final Message message;
+
+  InvalidStatementHandle(ParserAstType type,
+      {required this.token, required this.message})
+      : super("InvalidStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "message": message,
+      };
+}
+
+class ScriptHandle extends ParserAstNode {
+  final Token token;
+
+  ScriptHandle(ParserAstType type, {required this.token})
+      : super("Script", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CommentReferenceTextHandle extends ParserAstNode {
+  final String referenceSource;
+  final int referenceOffset;
+
+  CommentReferenceTextHandle(ParserAstType type,
+      {required this.referenceSource, required this.referenceOffset})
+      : super("CommentReferenceText", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "referenceSource": referenceSource,
+        "referenceOffset": referenceOffset,
+      };
+}
+
+class CommentReferenceHandle extends ParserAstNode {
+  final Token? newKeyword;
+  final Token? firstToken;
+  final Token? firstPeriod;
+  final Token? secondToken;
+  final Token? secondPeriod;
+  final Token thirdToken;
+
+  CommentReferenceHandle(ParserAstType type,
+      {this.newKeyword,
+      this.firstToken,
+      this.firstPeriod,
+      this.secondToken,
+      this.secondPeriod,
+      required this.thirdToken})
+      : super("CommentReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "newKeyword": newKeyword,
+        "firstToken": firstToken,
+        "firstPeriod": firstPeriod,
+        "secondToken": secondToken,
+        "secondPeriod": secondPeriod,
+        "thirdToken": thirdToken,
+      };
+}
+
+class NoCommentReferenceHandle extends ParserAstNode {
+  NoCommentReferenceHandle(ParserAstType type)
+      : super("NoCommentReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class TypeArgumentApplicationHandle extends ParserAstNode {
+  final Token openAngleBracket;
+
+  TypeArgumentApplicationHandle(ParserAstType type,
+      {required this.openAngleBracket})
+      : super("TypeArgumentApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "openAngleBracket": openAngleBracket,
+      };
+}
+
+class NewAsIdentifierHandle extends ParserAstNode {
+  final Token token;
+
+  NewAsIdentifierHandle(ParserAstType type, {required this.token})
+      : super("NewAsIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
diff --git a/pkg/front_end/lib/src/fasta/util/textual_outline.dart b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
index b72d8b6..e902eab 100644
--- a/pkg/front_end/lib/src/fasta/util/textual_outline.dart
+++ b/pkg/front_end/lib/src/fasta/util/textual_outline.dart
@@ -759,7 +759,7 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
     elementStartToChunk[enumKeyword] =
         new _EnumChunk(enumKeyword, leftBrace.endGroup!);
   }
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index 2a8c8c8..77a6a44 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -52,6 +52,7 @@
   final Map<ExperimentalFlag, bool> explicitExperimentalFlags;
   final AllowedExperimentalFlags? allowedExperimentalFlags;
   final Uri? librariesSpecificationUri;
+  final Uri? packageConfigUri;
   // TODO(johnniwinther): Tailor support to redefine selected platform
   // classes/members only.
   final bool compileSdk;
@@ -62,6 +63,7 @@
       {this.explicitExperimentalFlags = const {},
       this.allowedExperimentalFlags,
       this.librariesSpecificationUri,
+      this.packageConfigUri,
       this.compileSdk: false,
       this.targetFlags: const TestTargetFlags(),
       this.nnbdMode: NnbdMode.Weak});
@@ -322,6 +324,7 @@
       options.compileSdk = config.compileSdk;
     }
   }
+  options.packagesFileUri = config.packageConfigUri;
   config.customizeCompilerOptions(options, testData);
   InternalCompilerResult compilerResult = await compileScript(
       testData.memorySourceFiles,
diff --git a/pkg/front_end/lib/widget_cache.dart b/pkg/front_end/lib/widget_cache.dart
index f80f493..752b969 100644
--- a/pkg/front_end/lib/widget_cache.dart
+++ b/pkg/front_end/lib/widget_cache.dart
@@ -59,7 +59,7 @@
   String? checkSingleWidgetTypeModified(
     Component? lastGoodComponent,
     Component partialComponent,
-    ClassHierarchy classHierarchy,
+    ClassHierarchy? classHierarchy,
   ) {
     if (!_frameworkTypesLocated ||
         lastGoodComponent == null ||
@@ -124,7 +124,7 @@
     }
 
     // Update the class references to stateless, stateful, and state classes.
-    for (Library library in classHierarchy.knownLibraries) {
+    for (Library library in classHierarchy!.knownLibraries) {
       if (library.importUri == _frameworkLibrary) {
         _locatedClassDeclarations(library);
       }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index b217478..10ad152 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -212,6 +212,8 @@
 DuplicatedParameterName/example: Fail
 Encoding/analyzerCode: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
+EnumDeclaresFactory/analyzerCode: Fail
+EnumDeclaresFactory/example: Fail
 EnumInstantiation/example: Fail
 EqualityCannotBeEqualityOperand/part_wrapped_script1: Fail
 EqualityCannotBeEqualityOperand/part_wrapped_script2: Fail
@@ -332,6 +334,8 @@
 FastaUsageLong/example: Fail
 FastaUsageShort/analyzerCode: Fail
 FastaUsageShort/example: Fail
+FfiAbiSpecificIntegerInvalid/analyzerCode: Fail
+FfiAbiSpecificIntegerMappingInvalid/analyzerCode: Fail
 FfiDartTypeMismatch/analyzerCode: Fail
 FfiEmptyStruct/analyzerCode: Fail
 FfiExceptionalReturnNull/analyzerCode: Fail
@@ -525,10 +529,6 @@
 JsInteropExternalMemberNotJSAnnotated/example: Fail # Web compiler specific
 JsInteropIndexNotSupported/analyzerCode: Fail # Web compiler specific
 JsInteropIndexNotSupported/example: Fail # Web compiler specific
-JsInteropStaticInteropWithInstanceMembers/analyzerCode: Fail # Web compiler specific
-JsInteropStaticInteropWithInstanceMembers/example: Fail # Web compiler specific
-JsInteropStaticInteropWithNonStaticSupertype/analyzerCode: Fail # Web compiler specific
-JsInteropStaticInteropWithNonStaticSupertype/example: Fail # Web compiler specific
 JsInteropJSClassExtendsDartClass/analyzerCode: Fail # Web compiler specific
 JsInteropJSClassExtendsDartClass/example: Fail # Web compiler specific
 JsInteropNamedParameters/analyzerCode: Fail # Web compiler specific
@@ -539,6 +539,10 @@
 JsInteropNonExternalConstructor/example: Fail # Web compiler specific
 JsInteropNonExternalMember/analyzerCode: Fail # Web compiler specific
 JsInteropNonExternalMember/example: Fail # Web compiler specific
+JsInteropStaticInteropWithInstanceMembers/analyzerCode: Fail # Web compiler specific
+JsInteropStaticInteropWithInstanceMembers/example: Fail # Web compiler specific
+JsInteropStaticInteropWithNonStaticSupertype/analyzerCode: Fail # Web compiler specific
+JsInteropStaticInteropWithNonStaticSupertype/example: Fail # Web compiler specific
 LanguageVersionInvalidInDotPackages/analyzerCode: Fail
 LanguageVersionMismatchInPart/analyzerCode: Fail
 LanguageVersionMismatchInPart/part_wrapped_script: Fail # Part in (now) part.
@@ -723,6 +727,8 @@
 PatchNonExternal/example: Fail
 PlatformPrivateLibraryAccess/example: Fail
 PositionalAfterNamedArgument/example: Fail
+PositionalSuperParametersAndArguments/analyzerCode: Fail
+PositionalSuperParametersAndArguments/example: Fail
 PrefixAfterCombinator/example: Fail
 PreviousUseOfName/analyzerCode: Fail
 PreviousUseOfName/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 5eac795..6632763 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -929,7 +929,7 @@
 
 SuperInitializerNotLast:
   problemMessage: "Can't have initializers after 'super'."
-  analyzerCode: INVALID_SUPER_INVOCATION
+  analyzerCode: SUPER_INVOCATION_NOT_LAST
   script:
     - "class C { int x; C.bad() : super(), x = 5; }"
 
@@ -2069,6 +2069,10 @@
   problemMessage: "Unsupported nullability value '#string' on type '#type'."
   severity: INTERNAL_PROBLEM
 
+InternalProblemOmittedTypeNameInConstructorReference:
+  problemMessage: "Unsupported omission of the type name in a constructor reference outside of an enum element declaration."
+  severity: INTERNAL_PROBLEM
+
 IncrementalCompilerIllegalParameter:
   problemMessage: "Illegal parameter name '#string' found during expression compilation."
 
@@ -4550,6 +4554,16 @@
   problemMessage: "This is the instance member."
   severity: CONTEXT
 
+FfiAbiSpecificIntegerInvalid:
+  # Used by dart:ffi
+  problemMessage: "Classes extending 'AbiSpecificInteger' must have exactly one const constructor, no other members, and no type arguments."
+  external: test/ffi_test.dart
+
+FfiAbiSpecificIntegerMappingInvalid:
+  # Used by dart:ffi
+  problemMessage: "Classes extending 'AbiSpecificInteger' must have exactly one 'AbiSpecificIntegerMapping' annotation specifying the mapping from ABI to a NativeType integer with a fixed size."
+  external: test/ffi_test.dart
+
 FfiTypeMismatch:
   # Used by dart:ffi
   problemMessage: "Expected type '#type' to be '#type2', which is the Dart type corresponding to '#type3'."
@@ -5436,3 +5450,14 @@
   experiments: constructor-tearoffs
   script: |
     method(dynamic d) => d.new;
+
+EnumDeclaresFactory:
+  problemMessage: "Enums can't declare factory constructors."
+  correctionMessage: "Try removing the factory constructor declaration."
+
+PositionalSuperParametersAndArguments:
+  problemMessage: "Positional super-initializer parameters cannot be used when the super initializer has positional arguments."
+
+SuperInitializerParameter:
+  problemMessage: "This is the super-initializer parameter."
+  severity: CONTEXT
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a2.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a2.dart
new file mode 100644
index 0000000..8c26988
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/a2.dart
@@ -0,0 +1 @@
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b2.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b2.dart
new file mode 100644
index 0000000..8c26988
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/b2.dart
@@ -0,0 +1 @@
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c2.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c2.dart
new file mode 100644
index 0000000..8c26988
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/c2.dart
@@ -0,0 +1 @@
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart
new file mode 100644
index 0000000..bc74a47
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart
@@ -0,0 +1,8 @@
+import 'a.dart' if (dart.library.html) 'b.dart' if (dart.library.io) 'c.dart';
+export 'a2.dart'
+    if (dart.library.html) 'b2.dart'
+    if (dart.library.io) 'c2.dart';
+
+Foo x() {
+  return new Foo();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart.outline_extracted
new file mode 100644
index 0000000..a516b91
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/conditional_imports_exports/main.dart.outline_extracted
@@ -0,0 +1,40 @@
+org-dartlang-testcase:///main.dart:
+import 'a.dart' if (dart.library.html) 'b.dart' if (dart.library.io) 'c.dart';
+export 'a2.dart' if (dart.library.html) 'b2.dart' if (dart.library.io) 'c2.dart';
+Foo x() {}
+
+
+
+
+org-dartlang-testcase:///a2.dart:
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///b2.dart:
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///c2.dart:
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///a.dart:
+class Foo {}
+
+
+
+
+org-dartlang-testcase:///b.dart:
+class Foo {}
+
+
+
+
+org-dartlang-testcase:///c.dart:
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart b/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart
new file mode 100644
index 0000000..997da89
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart
@@ -0,0 +1,3 @@
+import "test8.dart";
+
+ClassFromImportsExportsExport? zyx____xyz;
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart.outline_extracted
new file mode 100644
index 0000000..1f5cc58
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/main.dart.outline_extracted
@@ -0,0 +1,22 @@
+org-dartlang-testcase:///main.dart:
+import "test8.dart";
+ClassFromImportsExportsExport? zyx____xyz;
+
+
+
+
+org-dartlang-testcase:///test8.dart:
+export "test9.dart";
+
+
+
+
+org-dartlang-testcase:///test9.dart:
+export "test10.dart";
+
+
+
+
+org-dartlang-testcase:///test10.dart:
+export "dart:async";
+class ClassFromImportsExportsExport {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/test10.dart b/pkg/front_end/outline_extraction_testcases/exports_export_01/test10.dart
new file mode 100644
index 0000000..8513138
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/test10.dart
@@ -0,0 +1,5 @@
+export "dart:async";
+
+void test10Method() {}
+
+class ClassFromImportsExportsExport {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/test8.dart b/pkg/front_end/outline_extraction_testcases/exports_export_01/test8.dart
new file mode 100644
index 0000000..c83a90a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/test8.dart
@@ -0,0 +1,3 @@
+export "test9.dart";
+
+void test8Method() {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_export_01/test9.dart b/pkg/front_end/outline_extraction_testcases/exports_export_01/test9.dart
new file mode 100644
index 0000000..d0fcb31
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_export_01/test9.dart
@@ -0,0 +1,3 @@
+export "test10.dart";
+
+void test9Method() {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_included/main.dart b/pkg/front_end/outline_extraction_testcases/exports_included/main.dart
new file mode 100644
index 0000000..52091d7
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_included/main.dart
@@ -0,0 +1 @@
+export "test6.dart";
diff --git a/pkg/front_end/outline_extraction_testcases/exports_included/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/exports_included/main.dart.outline_extracted
new file mode 100644
index 0000000..c2b824d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_included/main.dart.outline_extracted
@@ -0,0 +1,15 @@
+org-dartlang-testcase:///main.dart:
+export "test6.dart";
+
+
+
+
+org-dartlang-testcase:///test6.dart:
+export "test7.dart";
+void test6() {}
+
+
+
+
+org-dartlang-testcase:///test7.dart:
+void test7() {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_included/test6.dart b/pkg/front_end/outline_extraction_testcases/exports_included/test6.dart
new file mode 100644
index 0000000..c130634
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_included/test6.dart
@@ -0,0 +1,3 @@
+export "test7.dart";
+
+void test6() {}
diff --git a/pkg/front_end/outline_extraction_testcases/exports_included/test7.dart b/pkg/front_end/outline_extraction_testcases/exports_included/test7.dart
new file mode 100644
index 0000000..5b3e78d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/exports_included/test7.dart
@@ -0,0 +1 @@
+void test7() {}
diff --git a/pkg/front_end/outline_extraction_testcases/extends/foo.dart b/pkg/front_end/outline_extraction_testcases/extends/foo.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/extends/foo.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/extends/main.dart b/pkg/front_end/outline_extraction_testcases/extends/main.dart
new file mode 100644
index 0000000..a126b2a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/extends/main.dart
@@ -0,0 +1,3 @@
+import "foo.dart";
+
+class X extends Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/extends/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/extends/main.dart.outline_extracted
new file mode 100644
index 0000000..09b7413
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/extends/main.dart.outline_extracted
@@ -0,0 +1,9 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+class X extends Foo {}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/factories/main.dart b/pkg/front_end/outline_extraction_testcases/factories/main.dart
new file mode 100644
index 0000000..316b9c5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/factories/main.dart
@@ -0,0 +1,12 @@
+import 'package:foo/test11.dart';
+
+class Abc {
+  Abc() {}
+  factory Abc.a() {
+    return Abc2();
+  }
+  // Abc3 currently gets in --- it doesn't have to.
+  factory Abc.b() => Abc3();
+  var v1 = Abc4();
+  var v2 = new Abc5();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/factories/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/factories/main.dart.outline_extracted
new file mode 100644
index 0000000..4127b46
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/factories/main.dart.outline_extracted
@@ -0,0 +1,24 @@
+org-dartlang-testcase:///main.dart:
+import 'package:foo/test11.dart';
+class Abc {
+  Abc() {}
+  factory Abc.a() {}
+  factory Abc.b() => Abc3();
+  var v1 = Abc4();
+  var v2 = new Abc5();
+}
+
+
+
+
+org-dartlang-testcase:///test11.dart:
+import 'package:foo/main.dart';
+class Abc3 extends Abc {
+  Abc3() {}
+}
+class Abc4 extends Abc {
+  Abc4() {}
+}
+class Abc5 extends Abc {
+  Abc5() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/factories/test11.dart b/pkg/front_end/outline_extraction_testcases/factories/test11.dart
new file mode 100644
index 0000000..105387c
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/factories/test11.dart
@@ -0,0 +1,21 @@
+import 'package:foo/main.dart';
+
+class Abc2 extends Abc {
+  Abc2() {}
+}
+
+class Abc3 extends Abc {
+  Abc3() {}
+}
+
+class Abc4 extends Abc {
+  Abc4() {}
+}
+
+class Abc5 extends Abc {
+  Abc5() {}
+}
+
+class Abc6 extends Abc {
+  Abc6() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/b.dart b/pkg/front_end/outline_extraction_testcases/field_dotting_in/b.dart
new file mode 100644
index 0000000..112fdbc
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/b.dart
@@ -0,0 +1,9 @@
+import "c.dart";
+
+class B {
+  C c() {
+    return new C();
+  }
+}
+
+class BPrime {}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/c.dart b/pkg/front_end/outline_extraction_testcases/field_dotting_in/c.dart
new file mode 100644
index 0000000..356bd56
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/c.dart
@@ -0,0 +1,9 @@
+import "d.dart";
+
+class C {
+  D d() {
+    return new D();
+  }
+}
+
+class CPrime {}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/d.dart b/pkg/front_end/outline_extraction_testcases/field_dotting_in/d.dart
new file mode 100644
index 0000000..8655cd4
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/d.dart
@@ -0,0 +1,7 @@
+class D {
+  String d() {
+    return "hello";
+  }
+}
+
+class DPrime {}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart b/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart
new file mode 100644
index 0000000..3d53be6
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart
@@ -0,0 +1,9 @@
+import "b.dart";
+
+var x = A.b().c().d;
+
+class A {
+  static B b() {
+    return new B();
+  }
+}
diff --git a/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart.outline_extracted
new file mode 100644
index 0000000..e9a8f51
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/field_dotting_in/main.dart.outline_extracted
@@ -0,0 +1,32 @@
+org-dartlang-testcase:///main.dart:
+import "b.dart";
+var x = A.b().c().d;
+class A {
+  static B b() {}
+}
+
+
+
+
+org-dartlang-testcase:///b.dart:
+import "c.dart";
+class B {
+  C c() {}
+}
+
+
+
+
+org-dartlang-testcase:///c.dart:
+import "d.dart";
+class C {
+  D d() {}
+}
+
+
+
+
+org-dartlang-testcase:///d.dart:
+class D {
+  String d() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/fields/bar.dart b/pkg/front_end/outline_extraction_testcases/fields/bar.dart
new file mode 100644
index 0000000..79f980a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/fields/bar.dart
@@ -0,0 +1,11 @@
+class Bar {}
+
+class Bar2 {}
+
+class Bar3 {}
+
+class Bar4 {}
+
+class Foo3 {}
+
+class Foo4 {}
diff --git a/pkg/front_end/outline_extraction_testcases/fields/foo.dart b/pkg/front_end/outline_extraction_testcases/fields/foo.dart
new file mode 100644
index 0000000..43434c3
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/fields/foo.dart
@@ -0,0 +1,13 @@
+export "bar.dart";
+
+class Baz {}
+
+class Baz2 {}
+
+class Baz3 {}
+
+class Baz4 {}
+
+class Foo {}
+
+class Foo2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/fields/main.dart b/pkg/front_end/outline_extraction_testcases/fields/main.dart
new file mode 100644
index 0000000..bf52fd9
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/fields/main.dart
@@ -0,0 +1,19 @@
+import "foo.dart";
+
+class A {
+  Bar field = new Bar();
+  Bar2 field2 = new Bar2();
+  var field3 = new Bar3(), field4 = new Bar4();
+}
+
+mixin A2 {
+  Baz field = new Baz();
+  Baz2 field2 = new Baz2();
+  var field3 = new Baz3(), field4 = new Baz4();
+}
+
+extension A3 on Object {
+  static Foo field = new Foo();
+  static Foo2 field2 = new Foo2();
+  static var field3 = new Foo3(), field4 = new Foo4();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/fields/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/fields/main.dart.outline_extracted
new file mode 100644
index 0000000..13e239a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/fields/main.dart.outline_extracted
@@ -0,0 +1,40 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+class A {
+  Bar field = new Bar();
+  Bar2 field2 = new Bar2();
+  var field3 = new Bar3(), field4 = new Bar4();
+}
+mixin A2 {
+  Baz field = new Baz();
+  Baz2 field2 = new Baz2();
+  var field3 = new Baz3(), field4 = new Baz4();
+}
+extension A3 on Object {
+  static Foo field = new Foo();
+  static Foo2 field2 = new Foo2();
+  static var field3 = new Foo3(), field4 = new Foo4();
+}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+export "bar.dart";
+class Baz {}
+class Baz2 {}
+class Baz3 {}
+class Baz4 {}
+class Foo {}
+class Foo2 {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+class Bar {}
+class Bar2 {}
+class Bar3 {}
+class Bar4 {}
+class Foo3 {}
+class Foo4 {}
diff --git a/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart
new file mode 100644
index 0000000..3cfbb90
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart
@@ -0,0 +1,6 @@
+import "test16.dart" as test16;
+
+class Test16ClassHelper {
+  // the naming matching is what makes it annoying!
+  final test16toplevel = test16.test16toplevel("hello");
+}
diff --git a/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart.outline_extracted
new file mode 100644
index 0000000..e0a42eb
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/main.dart.outline_extracted
@@ -0,0 +1,11 @@
+org-dartlang-testcase:///main.dart:
+import "test16.dart" as test16;
+class Test16ClassHelper {
+  final test16toplevel = test16.test16toplevel("hello");
+}
+
+
+
+
+org-dartlang-testcase:///test16.dart:
+String test16toplevel(String s) {}
diff --git a/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/test16.dart b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/test16.dart
new file mode 100644
index 0000000..41d882e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_prefix_overlap_with_field/test16.dart
@@ -0,0 +1,3 @@
+String test16toplevel(String s) {
+  return s * 2;
+}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix/bar.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix/bar.dart
new file mode 100644
index 0000000..91b2144
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix/bar.dart
@@ -0,0 +1,5 @@
+int bar() {
+  return 42;
+}
+
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix/foo.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix/foo.dart
new file mode 100644
index 0000000..0ec48dd
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix/foo.dart
@@ -0,0 +1,5 @@
+String bar() {
+  return "hello";
+}
+
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart
new file mode 100644
index 0000000..aef942d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart
@@ -0,0 +1,7 @@
+import 'foo.dart' as foo;
+// This import isn't used --- foo.bar below explicitly wants bar from foo.
+import 'bar.dart';
+
+var x = foo.bar();
+
+foo.Baz? baz;
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart.outline_extracted
new file mode 100644
index 0000000..1c804cb
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import 'foo.dart' as foo;
+import 'bar.dart';
+var x = foo.bar();
+foo.Baz? baz;
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+String bar() {}
+class Baz {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/a.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/a.dart
new file mode 100644
index 0000000..ff840ec
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/a.dart
@@ -0,0 +1,3 @@
+String foo() {
+  return "foo";
+}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/b.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/b.dart
new file mode 100644
index 0000000..07f55de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/b.dart
@@ -0,0 +1,3 @@
+String bar() {
+  return "bar";
+}
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart
new file mode 100644
index 0000000..73d125a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart
@@ -0,0 +1,5 @@
+import 'a.dart' as x;
+import 'b.dart' as x;
+
+var foo = x.foo();
+var bar = x.bar();
diff --git a/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart.outline_extracted
new file mode 100644
index 0000000..166189c
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/import_with_prefix_02/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import 'a.dart' as x;
+import 'b.dart' as x;
+var foo = x.foo();
+var bar = x.bar();
+
+
+
+
+org-dartlang-testcase:///a.dart:
+String foo() {}
+
+
+
+
+org-dartlang-testcase:///b.dart:
+String bar() {}
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/main.dart b/pkg/front_end/outline_extraction_testcases/initial_various/main.dart
new file mode 100644
index 0000000..2ff0638
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/main.dart
@@ -0,0 +1,28 @@
+import "main.dart" as self;
+import "test3.dart";
+
+class Foo<E> extends Bar<int> with Qux1<int> implements Baz<Bar<int>> {
+  Foo<E>? parent;
+
+  Foo() {}
+  Foo.bar() {}
+  F? fooMethod1<F>() {
+    print(foo);
+    print(F);
+    print(x.A);
+  }
+
+  E? fooMethod2() {
+    print(E);
+    print(x.A);
+  }
+
+  self.Foo? fooMethod3() {
+    print(E);
+    print(x.A);
+  }
+
+  x fooMethod4() {
+    return x.A;
+  }
+}
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/initial_various/main.dart.outline_extracted
new file mode 100644
index 0000000..3426756
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/main.dart.outline_extracted
@@ -0,0 +1,24 @@
+org-dartlang-testcase:///main.dart:
+import "main.dart" as self;
+import "test3.dart";
+class Foo<E> extends Bar<int> with Qux1<int> implements Baz<Bar<int>> {
+  Foo<E>? parent;
+  Foo() {}
+  Foo.bar() {}
+  F? fooMethod1<F>() {}
+  E? fooMethod2() {}
+  self.Foo? fooMethod3() {}
+  x fooMethod4() {}
+}
+
+
+
+
+org-dartlang-testcase:///test3.dart:
+class Bar<E> {}
+class Baz<E> {}
+class Qux1<E> {
+  Qux1AndAHalf? qux1AndAHalf() {}
+}
+class Qux1AndAHalf<E> {}
+enum x { A, B, C }
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/test3.dart b/pkg/front_end/outline_extraction_testcases/initial_various/test3.dart
new file mode 100644
index 0000000..530644b
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/test3.dart
@@ -0,0 +1,25 @@
+import "test4.dart";
+
+class Bar<E> {}
+
+class Baz<E> {}
+
+class Qux1<E> {
+  Qux1AndAHalf? qux1AndAHalf() {
+    // nothing...
+  }
+}
+
+class Qux1AndAHalf<E> {}
+
+class Qux2<E> {
+  Qux3? foo() {}
+}
+
+enum x { A, B, C }
+
+int foo() {
+  return 42;
+}
+
+int foo2 = foo() * 2, foo3 = foo() * 3;
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/test4.dart b/pkg/front_end/outline_extraction_testcases/initial_various/test4.dart
new file mode 100644
index 0000000..3215ebf
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/test4.dart
@@ -0,0 +1,8 @@
+import "test5.dart";
+export "test5.dart";
+
+class Qux3<E> {
+  Qux4? foo() {}
+}
+
+class Qux4<E> {}
diff --git a/pkg/front_end/outline_extraction_testcases/initial_various/test5.dart b/pkg/front_end/outline_extraction_testcases/initial_various/test5.dart
new file mode 100644
index 0000000..0315739
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/initial_various/test5.dart
@@ -0,0 +1,5 @@
+class Qux3x<E> {
+  Qux4x? foo() {}
+}
+
+class Qux4x<E> {}
diff --git a/pkg/front_end/outline_extraction_testcases/keeps_dart_version/bar.dart b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/bar.dart
new file mode 100644
index 0000000..62e4db2
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/bar.dart
@@ -0,0 +1,5 @@
+// @dart = 2.12
+
+class Bar {}
+
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart
new file mode 100644
index 0000000..f20e3af
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart
@@ -0,0 +1,3 @@
+import "bar.dart";
+
+void foo(Bar bar) {}
diff --git a/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart.outline_extracted
new file mode 100644
index 0000000..9a0da03
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/keeps_dart_version/main.dart.outline_extracted
@@ -0,0 +1,10 @@
+org-dartlang-testcase:///main.dart:
+import "bar.dart";
+void foo(Bar bar) {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+// @dart = 2.12
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_01/a.dart b/pkg/front_end/outline_extraction_testcases/metadata_01/a.dart
new file mode 100644
index 0000000..e7267c5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_01/a.dart
@@ -0,0 +1 @@
+class AUnused {}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_01/b.dart b/pkg/front_end/outline_extraction_testcases/metadata_01/b.dart
new file mode 100644
index 0000000..8b42bda
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_01/b.dart
@@ -0,0 +1,9 @@
+const AbcX = const _AbcX();
+
+class _AbcX {
+  const _AbcX();
+}
+
+class AbcX2 {
+  const AbcX2();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart b/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart
new file mode 100644
index 0000000..a55d3df
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart
@@ -0,0 +1,5 @@
+import "a.dart";
+import "b.dart";
+
+@AbcX
+void foo() {}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart.outline_extracted
new file mode 100644
index 0000000..6d8ae63
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_01/main.dart.outline_extracted
@@ -0,0 +1,19 @@
+org-dartlang-testcase:///main.dart:
+import "a.dart";
+import "b.dart";
+@AbcX
+void foo() {}
+
+
+
+
+org-dartlang-testcase:///a.dart:
+
+
+
+
+org-dartlang-testcase:///b.dart:
+const AbcX = const _AbcX();
+class _AbcX {
+  const _AbcX();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart b/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart
new file mode 100644
index 0000000..851e231
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart
@@ -0,0 +1,5 @@
+import "test15.dart" as $test15;
+import "nottest15.dart";
+
+@$test15.Test15()
+void test15thing() {}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart.outline_extracted
new file mode 100644
index 0000000..123667f
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_02/main.dart.outline_extracted
@@ -0,0 +1,18 @@
+org-dartlang-testcase:///main.dart:
+import "test15.dart" as $test15;
+import "nottest15.dart";
+@$test15.Test15()
+void test15thing() {}
+
+
+
+
+org-dartlang-testcase:///test15.dart:
+class Test15 {
+  const Test15();
+}
+
+
+
+
+org-dartlang-testcase:///nottest15.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_02/nottest15.dart b/pkg/front_end/outline_extraction_testcases/metadata_02/nottest15.dart
new file mode 100644
index 0000000..41594d9
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_02/nottest15.dart
@@ -0,0 +1,7 @@
+class Test15 {
+  const Test15();
+}
+
+class Test16 {
+  const Test16();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/metadata_02/test15.dart b/pkg/front_end/outline_extraction_testcases/metadata_02/test15.dart
new file mode 100644
index 0000000..41594d9
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/metadata_02/test15.dart
@@ -0,0 +1,7 @@
+class Test15 {
+  const Test15();
+}
+
+class Test16 {
+  const Test16();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/a.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/a.dart
new file mode 100644
index 0000000..bde7250
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/a.dart
@@ -0,0 +1,5 @@
+library foo.a;
+
+export 'b.dart';
+export 'c.dart';
+export 'd.dart';
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/b.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/b.dart
new file mode 100644
index 0000000..3a43d09
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/b.dart
@@ -0,0 +1 @@
+class B {}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/c.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/c.dart
new file mode 100644
index 0000000..ed37d13
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/c.dart
@@ -0,0 +1,7 @@
+class C<T> {
+  const C.b();
+}
+
+class C2<T> {
+  const C2.b();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/d.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/d.dart
new file mode 100644
index 0000000..40416ad
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/d.dart
@@ -0,0 +1 @@
+class D {}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart
new file mode 100644
index 0000000..afbc02d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart
@@ -0,0 +1,6 @@
+import 'package:foo/a.dart' as foo;
+
+class A {
+  var c1 = foo.C<A>.b();
+  var c2 = new foo.C2<A>.b();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart.outline_extracted
new file mode 100644
index 0000000..c1a663e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_import_with_export_and_named_constructor_and_class_type_parameter/main.dart.outline_extracted
@@ -0,0 +1,36 @@
+org-dartlang-testcase:///main.dart:
+import 'package:foo/a.dart' as foo;
+class A {
+  var c1 = foo.C<A>.b();
+  var c2 = new foo.C2<A>.b();
+}
+
+
+
+
+org-dartlang-testcase:///a.dart:
+library foo.a;
+export 'b.dart';
+export 'c.dart';
+export 'd.dart';
+
+
+
+
+org-dartlang-testcase:///b.dart:
+
+
+
+
+org-dartlang-testcase:///c.dart:
+class C<T> {
+  const C.b();
+}
+class C2<T> {
+  const C2.b();
+}
+
+
+
+
+org-dartlang-testcase:///d.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/named_mixin/bar.dart b/pkg/front_end/outline_extraction_testcases/named_mixin/bar.dart
new file mode 100644
index 0000000..512eabb
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_mixin/bar.dart
@@ -0,0 +1,3 @@
+export "baz.dart";
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/named_mixin/baz.dart b/pkg/front_end/outline_extraction_testcases/named_mixin/baz.dart
new file mode 100644
index 0000000..f1e00d1
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_mixin/baz.dart
@@ -0,0 +1 @@
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart b/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart
new file mode 100644
index 0000000..4e0e374
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart
@@ -0,0 +1,3 @@
+import "bar.dart";
+
+class Foo = Object with Bar implements Baz;
diff --git a/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart.outline_extracted
new file mode 100644
index 0000000..5ff64b3
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/named_mixin/main.dart.outline_extracted
@@ -0,0 +1,16 @@
+org-dartlang-testcase:///main.dart:
+import "bar.dart";
+class Foo = Object with Bar implements Baz;
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+export "baz.dart";
+class Bar {}
+
+
+
+
+org-dartlang-testcase:///baz.dart:
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/outline_extractor.status b/pkg/front_end/outline_extraction_testcases/outline_extractor.status
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/outline_extractor.status
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/main.dart b/pkg/front_end/outline_extraction_testcases/part_01/main.dart
new file mode 100644
index 0000000..1d7ff4e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/main.dart
@@ -0,0 +1,4 @@
+import "test12.dart";
+
+void test12part1usage(Test12Part1 x) {}
+void secondtest12part1usage(SecondTest12 x) {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/part_01/main.dart.outline_extracted
new file mode 100644
index 0000000..ee384f7
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/main.dart.outline_extracted
@@ -0,0 +1,47 @@
+org-dartlang-testcase:///main.dart:
+import "test12.dart";
+void test12part1usage(Test12Part1 x) {}
+void secondtest12part1usage(SecondTest12 x) {}
+
+
+
+
+org-dartlang-testcase:///test12.dart:
+import "test13.dart";
+import "test14.dart";
+part 'test12_part1.dart';
+part 'test12_part2.dart';
+class Test12 {}
+class SecondTest12 {
+  void foo(SecondTest12Part1 x) {}
+}
+
+
+
+
+org-dartlang-testcase:///test12_part1.dart:
+part of "test12.dart";
+class Test12Part1 {
+  void foo(Test12 x) {}
+  void bar(Test12Part2 x) {}
+  void baz(Test13 x) {}
+}
+class SecondTest12Part1 {}
+
+
+
+
+org-dartlang-testcase:///test12_part2.dart:
+part of "test12.dart";
+class Test12Part2 {}
+
+
+
+
+org-dartlang-testcase:///test13.dart:
+class Test13 {}
+
+
+
+
+org-dartlang-testcase:///test14.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test12.dart b/pkg/front_end/outline_extraction_testcases/part_01/test12.dart
new file mode 100644
index 0000000..07c621e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test12.dart
@@ -0,0 +1,11 @@
+import "test13.dart";
+import "test14.dart";
+
+part 'test12_part1.dart';
+part 'test12_part2.dart';
+
+class Test12 {}
+
+class SecondTest12 {
+  void foo(SecondTest12Part1 x) {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test12_part1.dart b/pkg/front_end/outline_extraction_testcases/part_01/test12_part1.dart
new file mode 100644
index 0000000..44473ff
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test12_part1.dart
@@ -0,0 +1,9 @@
+part of "test12.dart";
+
+class Test12Part1 {
+  void foo(Test12 x) {}
+  void bar(Test12Part2 x) {}
+  void baz(Test13 x) {}
+}
+
+class SecondTest12Part1 {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test12_part2.dart b/pkg/front_end/outline_extraction_testcases/part_01/test12_part2.dart
new file mode 100644
index 0000000..413d50d
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test12_part2.dart
@@ -0,0 +1,3 @@
+part of "test12.dart";
+
+class Test12Part2 {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test13.dart b/pkg/front_end/outline_extraction_testcases/part_01/test13.dart
new file mode 100644
index 0000000..caa3ed4
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test13.dart
@@ -0,0 +1,3 @@
+import "test13andahalf.dart";
+
+class Test13 {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test13andahalf.dart b/pkg/front_end/outline_extraction_testcases/part_01/test13andahalf.dart
new file mode 100644
index 0000000..16bc96b
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test13andahalf.dart
@@ -0,0 +1 @@
+class Test13AndAHalf {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_01/test14.dart b/pkg/front_end/outline_extraction_testcases/part_01/test14.dart
new file mode 100644
index 0000000..023fefd
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_01/test14.dart
@@ -0,0 +1 @@
+class Test14 {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart b/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart
new file mode 100644
index 0000000..d9163f5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart
@@ -0,0 +1,3 @@
+import 'test3.dart';
+
+var x = test3partfoo();
diff --git a/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart.outline_extracted
new file mode 100644
index 0000000..2d108c7
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_and_library_name/main.dart.outline_extracted
@@ -0,0 +1,17 @@
+org-dartlang-testcase:///main.dart:
+import 'test3.dart';
+var x = test3partfoo();
+
+
+
+
+org-dartlang-testcase:///test3.dart:
+library test3;
+part "test3_part.dart";
+
+
+
+
+org-dartlang-testcase:///test3_part.dart:
+part of test3;
+void test3partfoo() {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3.dart b/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3.dart
new file mode 100644
index 0000000..8fdefdd
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3.dart
@@ -0,0 +1,5 @@
+library test3;
+
+part "test3_part.dart";
+
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3_part.dart b/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3_part.dart
new file mode 100644
index 0000000..e6e3fc4
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/part_and_library_name/test3_part.dart
@@ -0,0 +1,5 @@
+part of test3;
+
+void test3partfoo() {}
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/foo.dart b/pkg/front_end/outline_extraction_testcases/split_import_export_part/foo.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/foo.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart b/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart
new file mode 100644
index 0000000..85d6722
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart
@@ -0,0 +1,25 @@
+import "package:f"
+    "oobar"
+    "/"
+    "foo"
+    ".dart";
+
+export "package:f"
+    "oobar"
+    "/"
+    "foo"
+    ".dart";
+
+part "package:f"
+    "oobar"
+    "/"
+    "part"
+    ".dart";
+
+Foo giveFoo() {
+  return new Foo();
+}
+
+Bar giveBar() {
+  return new Bar();
+}
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart.outline_extracted
new file mode 100644
index 0000000..ed23c5a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/main.dart.outline_extracted
@@ -0,0 +1,19 @@
+org-dartlang-testcase:///main.dart:
+import "package:f" "oobar" "/" "foo" ".dart";
+export "package:f" "oobar" "/" "foo" ".dart";
+part "package:f" "oobar" "/" "part" ".dart";
+Foo giveFoo() {}
+Bar giveBar() {}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+class Foo {}
+
+
+
+
+org-dartlang-testcase:///part.dart:
+part of "package:f" "oobar" "/" "main" ".dart";
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/split_import_export_part/part.dart b/pkg/front_end/outline_extraction_testcases/split_import_export_part/part.dart
new file mode 100644
index 0000000..009eb8e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/split_import_export_part/part.dart
@@ -0,0 +1,7 @@
+part of "package:f"
+    "oobar"
+    "/"
+    "main"
+    ".dart";
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_extends/bar.dart b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/bar.dart
new file mode 100644
index 0000000..3507a7f
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/bar.dart
@@ -0,0 +1,5 @@
+class Bar {}
+
+class Bar2 {}
+
+class Bar3 {}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_extends/foo.dart b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/foo.dart
new file mode 100644
index 0000000..820b17e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/foo.dart
@@ -0,0 +1,7 @@
+export "bar.dart";
+
+class Baz {}
+
+class Baz2 {}
+
+class Baz3 {}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart
new file mode 100644
index 0000000..73b5565
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart
@@ -0,0 +1,16 @@
+import "foo.dart";
+
+class A<T extends Bar, U extends Baz> {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+
+mixin A2<T extends Bar2, U extends Baz2> {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+
+extension A3<T extends Bar3, U extends Baz3> on Object {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart.outline_extracted
new file mode 100644
index 0000000..8b4f0c5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_extends/main.dart.outline_extracted
@@ -0,0 +1,31 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+class A<T extends Bar, U extends Baz> {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+mixin A2<T extends Bar2, U extends Baz2> {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+extension A3<T extends Bar3, U extends Baz3> on Object {
+  T? aMethod1() {}
+  U? aMethod2() {}
+}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+export "bar.dart";
+class Baz {}
+class Baz2 {}
+class Baz3 {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+class Bar {}
+class Bar2 {}
+class Bar3 {}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart b/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart
new file mode 100644
index 0000000..5093237
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart
@@ -0,0 +1,5 @@
+class Foo<E> {}
+
+extension HiExtension<T extends Foo> on T {
+  void sayHi() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart.outline_extracted
new file mode 100644
index 0000000..c561270
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/type_parameter_on_extension/main.dart.outline_extracted
@@ -0,0 +1,5 @@
+org-dartlang-testcase:///main.dart:
+class Foo<E> {}
+extension HiExtension<T extends Foo> on T {
+  void sayHi() {}
+}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import/foo.dart b/pkg/front_end/outline_extraction_testcases/unused_import/foo.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import/foo.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import/main.dart b/pkg/front_end/outline_extraction_testcases/unused_import/main.dart
new file mode 100644
index 0000000..8713cd2
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import/main.dart
@@ -0,0 +1,6 @@
+import "foo.dart";
+
+void main() {
+  Foo foo = new Foo();
+  print(foo);
+}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/unused_import/main.dart.outline_extracted
new file mode 100644
index 0000000..aea942e
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import/main.dart.outline_extracted
@@ -0,0 +1,8 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+void main() {}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/bar.dart b/pkg/front_end/outline_extraction_testcases/unused_import_02/bar.dart
new file mode 100644
index 0000000..5db1c42
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/bar.dart
@@ -0,0 +1,8 @@
+import "baz.dart";
+
+class Bar {
+  void bar() {
+    Baz baz = new Baz();
+    print(baz);
+  }
+}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/baz.dart b/pkg/front_end/outline_extraction_testcases/unused_import_02/baz.dart
new file mode 100644
index 0000000..f1e00d1
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/baz.dart
@@ -0,0 +1 @@
+class Baz {}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/foo.dart b/pkg/front_end/outline_extraction_testcases/unused_import_02/foo.dart
new file mode 100644
index 0000000..4e6a6de
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/foo.dart
@@ -0,0 +1 @@
+class Foo {}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart b/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart
new file mode 100644
index 0000000..732d2c4
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart
@@ -0,0 +1,8 @@
+import "dart:core";
+import "foo.dart";
+export "bar.dart";
+
+void main() {
+  Foo foo = new Foo();
+  print(foo);
+}
diff --git a/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart.outline_extracted
new file mode 100644
index 0000000..5e0cec5
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/unused_import_02/main.dart.outline_extracted
@@ -0,0 +1,24 @@
+org-dartlang-testcase:///main.dart:
+import "dart:core";
+import "foo.dart";
+export "bar.dart";
+void main() {}
+
+
+
+
+org-dartlang-testcase:///bar.dart:
+import "baz.dart";
+class Bar {
+  void bar() {}
+}
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+
+
+
+
+org-dartlang-testcase:///baz.dart:
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/foo.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/foo.dart
new file mode 100644
index 0000000..9a99089
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/foo.dart
@@ -0,0 +1,11 @@
+extension Foo on String {
+  int get giveInt => 42;
+}
+
+// The below doesn't have to be included.
+
+extension BarExtension on Bar {
+  int get giveInt => 42;
+}
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart
new file mode 100644
index 0000000..1b39ff1
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart
@@ -0,0 +1,5 @@
+import "foo.dart";
+
+int get giveInt => 43;
+
+var x = "hello".giveInt;
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart.outline_extracted
new file mode 100644
index 0000000..cb49619
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension/main.dart.outline_extracted
@@ -0,0 +1,16 @@
+org-dartlang-testcase:///main.dart:
+import "foo.dart";
+int get giveInt => 43;
+var x = "hello".giveInt;
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+extension Foo on String {
+  int get giveInt => 42;
+}
+extension BarExtension on Bar {
+  int get giveInt => 42;
+}
+class Bar {}
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
new file mode 100644
index 0000000..bd036e7
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/foo.dart
@@ -0,0 +1,17 @@
+enum Foo {
+  a,
+  b,
+  c,
+  d,
+  e,
+}
+
+extension FooExtension on Foo {
+  int get giveInt => 42;
+}
+
+extension BarExtension on Bar {
+  int get giveInt => 42;
+}
+
+class Bar {}
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart
new file mode 100644
index 0000000..5deb533
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart
@@ -0,0 +1,5 @@
+import "foo.dart";
+
+final foo = [Foo.d, Foo.b];
+
+final foo2 = foo.map((f) => f.giveInt).toList();
diff --git a/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart.outline_extracted b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/main.dart.outline_extracted
new file mode 100644
index 0000000..1b7506a
--- /dev/null
+++ b/pkg/front_end/outline_extraction_testcases/use_of_imported_extension_2/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.giveInt).toList();
+
+
+
+
+org-dartlang-testcase:///foo.dart:
+enum Foo { a, b, c, d, e, }
+extension FooExtension on Foo {
+  int get giveInt => 42;
+}
+extension BarExtension on Bar {
+  int get giveInt => 42;
+}
+class Bar {}
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart
new file mode 100644
index 0000000..145b799
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart
@@ -0,0 +1,8 @@
+enum E<X, Y> {
+  one<int, String>(),
+  two<double, num>(),
+  three<int, int>.named(42);
+
+  const E();
+  const E.named(int value);
+}
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect
new file mode 100644
index 0000000..69b148f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.expect
@@ -0,0 +1,122 @@
+beginCompilationUnit(enum)
+  beginMetadataStar(enum)
+  endMetadataStar(0)
+  beginUncategorizedTopLevelDeclaration(enum)
+    handleIdentifier(E, enumDeclaration)
+    beginEnum(enum)
+      beginTypeVariables(<)
+        beginMetadataStar(X)
+        endMetadataStar(0)
+        handleIdentifier(X, typeVariableDeclaration)
+        beginTypeVariable(X)
+          beginMetadataStar(Y)
+          endMetadataStar(0)
+          handleIdentifier(Y, typeVariableDeclaration)
+          beginTypeVariable(Y)
+            handleTypeVariablesDefined(Y, 2)
+            handleNoType(Y)
+          endTypeVariable(>, 1, null, null)
+          handleNoType(X)
+        endTypeVariable(,, 0, null, null)
+      endTypeVariables(<, >)
+      handleEnumNoWithClause()
+      handleImplements(null, 0)
+      handleEnumHeader(enum, {)
+      beginMetadataStar(one)
+      endMetadataStar(0)
+      handleIdentifier(one, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(one)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(,)
+          handleType(int, null)
+          handleIdentifier(String, typeReference)
+          handleNoTypeArguments(>)
+          handleType(String, null)
+        endTypeArguments(2, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(()
+      endConstructorReference(one, null, (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement({)
+      beginMetadataStar(two)
+      endMetadataStar(0)
+      handleIdentifier(two, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(two)
+        beginTypeArguments(<)
+          handleIdentifier(double, typeReference)
+          handleNoTypeArguments(,)
+          handleType(double, null)
+          handleIdentifier(num, typeReference)
+          handleNoTypeArguments(>)
+          handleType(num, null)
+        endTypeArguments(2, <, >)
+        handleNoConstructorReferenceContinuationAfterTypeArguments(()
+      endConstructorReference(two, null, (, ConstructorReferenceContext.Const)
+      beginArguments(()
+      endArguments(0, (, ))
+      handleEnumElement(,)
+      beginMetadataStar(three)
+      endMetadataStar(0)
+      handleIdentifier(three, enumValueDeclaration)
+      handleNoTypeNameInConstructorReference(<)
+      beginConstructorReference(three)
+        beginTypeArguments(<)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(,)
+          handleType(int, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(>)
+          handleType(int, null)
+        endTypeArguments(2, <, >)
+        handleIdentifier(named, constructorReferenceContinuationAfterTypeArguments)
+      endConstructorReference(three, ., (, ConstructorReferenceContext.Const)
+      beginArguments(()
+        handleLiteralInt(42)
+      endArguments(1, (, ))
+      handleEnumElement(,)
+      handleEnumElements(;, 3)
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+          endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+      beginMetadataStar(const)
+      endMetadataStar(0)
+      beginMember()
+        beginMethod(DeclarationKind.Enum, null, null, null, const, null, E)
+          handleNoType(const)
+          handleIdentifier(E, methodDeclaration)
+          handleIdentifier(named, methodDeclarationContinuation)
+          handleQualified(.)
+          handleNoTypeVariables(()
+          beginFormalParameters((, MemberKind.NonStaticMethod)
+            beginMetadataStar(int)
+            endMetadataStar(0)
+            beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
+              handleIdentifier(int, typeReference)
+              handleNoTypeArguments(value)
+              handleType(int, null)
+              handleIdentifier(value, formalParameterDeclaration)
+              handleFormalParameterWithoutValue())
+            endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+          endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          handleEmptyFunctionBody(;)
+        endEnumConstructor(null, const, (, null, ;)
+      endMember()
+    endEnum(enum, {, 2)
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
new file mode 100644
index 0000000..2403c22
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.intertwined.expect
@@ -0,0 +1,199 @@
+parseUnit(enum)
+  skipErrorTokens(enum)
+  listener: beginCompilationUnit(enum)
+  syntheticPreviousToken(enum)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(enum)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, enum, null, Instance of 'DirectiveContext')
+      parseTopLevelKeywordModifiers(, enum)
+      parseEnum(enum)
+        listener: beginUncategorizedTopLevelDeclaration(enum)
+        ensureIdentifier(enum, enumDeclaration)
+          listener: handleIdentifier(E, enumDeclaration)
+        listener: beginEnum(enum)
+        parseEnumHeaderOpt(E, enum)
+          listener: beginTypeVariables(<)
+          parseMetadataStar(<)
+            listener: beginMetadataStar(X)
+            listener: endMetadataStar(0)
+          ensureIdentifier(<, typeVariableDeclaration)
+            listener: handleIdentifier(X, typeVariableDeclaration)
+          listener: beginTypeVariable(X)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(Y)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, typeVariableDeclaration)
+            listener: handleIdentifier(Y, typeVariableDeclaration)
+          listener: beginTypeVariable(Y)
+          listener: handleTypeVariablesDefined(Y, 2)
+          listener: handleNoType(Y)
+          listener: endTypeVariable(>, 1, null, null)
+          listener: handleNoType(X)
+          listener: endTypeVariable(,, 0, null, null)
+          listener: endTypeVariables(<, >)
+          parseEnumWithClauseOpt(>)
+            listener: handleEnumNoWithClause()
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
+        listener: handleEnumHeader(enum, {)
+        parseEnumElement({)
+          parseMetadataStar({)
+            listener: beginMetadataStar(one)
+            listener: endMetadataStar(0)
+          ensureIdentifier({, enumValueDeclaration)
+            listener: handleIdentifier(one, enumValueDeclaration)
+          parseConstructorReference(one, ConstructorReferenceContext.Const, null, true)
+            listener: handleNoTypeNameInConstructorReference(<)
+            listener: beginConstructorReference(one)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(,)
+            listener: handleType(int, null)
+            listener: handleIdentifier(String, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(String, null)
+            listener: endTypeArguments(2, <, >)
+            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
+            listener: endConstructorReference(one, null, (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement({)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(two)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(two, enumValueDeclaration)
+          parseConstructorReference(two, ConstructorReferenceContext.Const, null, true)
+            listener: handleNoTypeNameInConstructorReference(<)
+            listener: beginConstructorReference(two)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(double, typeReference)
+            listener: handleNoTypeArguments(,)
+            listener: handleType(double, null)
+            listener: handleIdentifier(num, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(num, null)
+            listener: endTypeArguments(2, <, >)
+            listener: handleNoConstructorReferenceContinuationAfterTypeArguments(()
+            listener: endConstructorReference(two, null, (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(>)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              listener: endArguments(0, (, ))
+          listener: handleEnumElement(,)
+        parseEnumElement(,)
+          parseMetadataStar(,)
+            listener: beginMetadataStar(three)
+            listener: endMetadataStar(0)
+          ensureIdentifier(,, enumValueDeclaration)
+            listener: handleIdentifier(three, enumValueDeclaration)
+          parseConstructorReference(three, ConstructorReferenceContext.Const, null, true)
+            listener: handleNoTypeNameInConstructorReference(<)
+            listener: beginConstructorReference(three)
+            listener: beginTypeArguments(<)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(,)
+            listener: handleType(int, null)
+            listener: handleIdentifier(int, typeReference)
+            listener: handleNoTypeArguments(>)
+            listener: handleType(int, null)
+            listener: endTypeArguments(2, <, >)
+            ensureIdentifier(., constructorReferenceContinuationAfterTypeArguments)
+              listener: handleIdentifier(named, constructorReferenceContinuationAfterTypeArguments)
+            listener: endConstructorReference(three, ., (, ConstructorReferenceContext.Const)
+          parseConstructorInvocationArguments(named)
+            parseArgumentsRest(()
+              listener: beginArguments(()
+              parseExpression(()
+                parsePrecedenceExpression((, 1, true)
+                  parseUnaryExpression((, true)
+                    parsePrimary((, expression)
+                      parseLiteralInt(()
+                        listener: handleLiteralInt(42)
+              listener: endArguments(1, (, ))
+          listener: handleEnumElement(,)
+        listener: handleEnumElements(;, 3)
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+            parseMethodTypeVar(E)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(E, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(E, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, const)
+        parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Enum, E)
+          parseMetadataStar(;)
+            listener: beginMetadataStar(const)
+            listener: endMetadataStar(0)
+          listener: beginMember()
+          parseMethod(;, null, null, null, null, null, const, const, Instance of 'NoType', null, E, DeclarationKind.Enum, E, false)
+            listener: beginMethod(DeclarationKind.Enum, null, null, null, const, null, E)
+            listener: handleNoType(const)
+            ensureIdentifierPotentiallyRecovered(const, methodDeclaration, false)
+              listener: handleIdentifier(E, methodDeclaration)
+            parseQualifiedRestOpt(E, methodDeclarationContinuation)
+              parseQualifiedRest(E, methodDeclarationContinuation)
+                ensureIdentifier(., methodDeclarationContinuation)
+                  listener: handleIdentifier(named, methodDeclarationContinuation)
+                listener: handleQualified(.)
+            parseMethodTypeVar(named)
+              listener: handleNoTypeVariables(()
+            parseGetterOrFormalParameters(named, E, false, MemberKind.NonStaticMethod)
+              parseFormalParameters(named, MemberKind.NonStaticMethod)
+                parseFormalParametersRest((, MemberKind.NonStaticMethod)
+                  listener: beginFormalParameters((, MemberKind.NonStaticMethod)
+                  parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                    parseMetadataStar(()
+                      listener: beginMetadataStar(int)
+                      listener: endMetadataStar(0)
+                    listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
+                    listener: handleIdentifier(int, typeReference)
+                    listener: handleNoTypeArguments(value)
+                    listener: handleType(int, null)
+                    ensureIdentifier(int, formalParameterDeclaration)
+                      listener: handleIdentifier(value, formalParameterDeclaration)
+                    listener: handleFormalParameterWithoutValue())
+                    listener: endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                  listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
+            parseInitializersOpt())
+              listener: handleNoInitializers()
+            parseAsyncModifierOpt())
+              listener: handleAsyncModifier(null, null)
+              inPlainSync()
+            inPlainSync()
+            parseFunctionBody(), false, true)
+              listener: handleEmptyFunctionBody(;)
+            listener: endEnumConstructor(null, const, (, null, ;)
+          listener: endMember()
+        notEofOrValue(}, })
+        listener: endEnum(enum, {, 2)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(enum)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.parser.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.parser.expect
new file mode 100644
index 0000000..9f86055
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.parser.expect
@@ -0,0 +1,19 @@
+enum E<X, Y> {
+one<int, String>(),
+two<double, num>(),
+three<int, int>.named(42);
+
+const E();
+const E.named(int value);
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] {[BeginToken]
+one[StringToken]<[BeginToken]int[StringToken],[SimpleToken] String[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+two[StringToken]<[BeginToken]double[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+three[StringToken]<[BeginToken]int[StringToken],[SimpleToken] int[StringToken]>[SimpleToken].[SimpleToken]named[StringToken]([BeginToken]42[StringToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]named[StringToken]([BeginToken]int[StringToken] value[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect
new file mode 100644
index 0000000..9f86055
--- /dev/null
+++ b/pkg/front_end/parser_testcases/enhanced_enums/entries_with_type_arguments.dart.scanner.expect
@@ -0,0 +1,19 @@
+enum E<X, Y> {
+one<int, String>(),
+two<double, num>(),
+three<int, int>.named(42);
+
+const E();
+const E.named(int value);
+}
+
+
+enum[KeywordToken] E[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] {[BeginToken]
+one[StringToken]<[BeginToken]int[StringToken],[SimpleToken] String[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+two[StringToken]<[BeginToken]double[StringToken],[SimpleToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken],[SimpleToken]
+three[StringToken]<[BeginToken]int[StringToken],[SimpleToken] int[StringToken]>[SimpleToken].[SimpleToken]named[StringToken]([BeginToken]42[StringToken])[SimpleToken];[SimpleToken]
+
+const[KeywordToken] E[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+const[KeywordToken] E[StringToken].[SimpleToken]named[StringToken]([BeginToken]int[StringToken] value[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
index fbbb63a..315d899 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.expect
@@ -14,11 +14,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
@@ -36,7 +36,7 @@
                   handleNoType({)
                   handleIdentifier(c, formalParameterDeclaration)
                   handleFormalParameterWithoutValue(})
-                endFormalParameter(null, null, c, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                endFormalParameter(null, null, null, c, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
               endOptionalFormalParameters(1, {, })
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
@@ -114,11 +114,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(D, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, D)
+    beginClassDeclaration(class, null, null, D)
       handleNoType(D)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(D)
@@ -136,7 +136,7 @@
                   handleNoType({)
                   handleIdentifier(d, formalParameterDeclaration)
                   handleFormalParameterWithoutValue(})
-                endFormalParameter(null, null, d, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                endFormalParameter(null, null, null, d, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
               endOptionalFormalParameters(1, {, })
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
index 594b6db..f075fef 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_01.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -56,7 +56,7 @@
                           ensureIdentifier({, formalParameterDeclaration)
                             listener: handleIdentifier(c, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue(})
-                          listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
                         listener: endOptionalFormalParameters(1, {, })
                       ensureCloseParen(}, ()
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
@@ -71,7 +71,7 @@
                 listener: endClassConstructor(null, C, (, null, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -258,28 +258,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(D, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, D)
+        listener: beginClassDeclaration(class, null, null, D)
         parseClass(D, class, class, D)
           parseClassHeaderOpt(D, class, class)
             parseClassExtendsOpt(D)
               listener: handleNoType(D)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(D)
+            parseClassWithClauseOpt(D)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(D)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(D)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(D, DeclarationKind.Class, D)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, D)
               parseMetadataStar({)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -308,7 +308,7 @@
                           ensureIdentifier({, formalParameterDeclaration)
                             listener: handleIdentifier(d, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue(})
-                          listener: endFormalParameter(null, null, d, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, d, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
                         listener: endOptionalFormalParameters(1, {, })
                       ensureCloseParen(}, ()
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
@@ -323,7 +323,7 @@
                 listener: endClassConstructor(null, D, (, null, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
index e2d55ca..e861c72 100644
--- a/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/bracket_mismatch_06.dart.intertwined.expect
@@ -40,7 +40,7 @@
                             parseNewExpression({)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(C, constructorReference)
                                 listener: beginConstructorReference(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
index 5ee9cdb..df50087 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.expect
@@ -126,11 +126,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
index 7e46b8b..06d293d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_general.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -65,7 +65,7 @@
                 listener: endClassConstructor(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -128,7 +128,7 @@
                 listener: endClassConstructor(null, foo, (, :, })
               listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -187,7 +187,7 @@
                 listener: endClassConstructor(null, foo, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -224,7 +224,7 @@
                 listener: endClassMethod(get, get, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -268,7 +268,7 @@
                 listener: endClassMethod(get, get, {, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -315,7 +315,7 @@
                 listener: endClassConstructor(get, get, (, null, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -369,7 +369,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassConstructor(get, get, (, :, ;)
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -516,7 +516,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -559,7 +559,7 @@
                 listener: endClassMethod(set, set, (, null, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -609,7 +609,7 @@
                 listener: endClassMethod(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -656,7 +656,7 @@
                 listener: endClassConstructor(set, set, (, null, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -710,7 +710,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -778,7 +778,7 @@
                 listener: endClassConstructor(set, set, (, :, ;)
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -857,7 +857,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, external)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
@@ -914,7 +914,7 @@
                 listener: endClassConstructor(null, external, (, :, ;)
               listener: endMember()
             notEofOrValue(}, external)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(external)
                 listener: endMetadataStar(0)
@@ -993,7 +993,7 @@
                 listener: endClassConstructor(null, external, (, :, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1012,7 +1012,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
index 06805796..ddc254b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.expect
@@ -34,11 +34,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(get)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
index c1bf8ebf..3f0d02a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_get.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
index 7629bd3..c5b9ca5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.expect
@@ -30,11 +30,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
index 1502968..510034d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
index 26bb64b..49cb540 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.expect
@@ -30,11 +30,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(set)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
index ca57772..fdc9ae0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_bad_name_set.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -130,7 +130,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
index daaa1b0..affdbb5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.expect
@@ -30,11 +30,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(get)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
index 75d8a2f0..3e8ea041 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_get.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -62,7 +62,7 @@
                 listener: endClassMethod(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -122,7 +122,7 @@
                 listener: endClassConstructor(get, get, (, :, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
@@ -159,7 +159,7 @@
                 listener: endClassConstructor(get, get, (, null, })
               listener: endMember()
             notEofOrValue(}, get)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(get)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
index 750f16f..3353b3f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
index 9286fc8..fbd18be 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_ok.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -59,7 +59,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -116,7 +116,7 @@
                 listener: endClassConstructor(null, Foo, (, :, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -152,7 +152,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
index 5e8a7be..9ecbeda 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.expect
@@ -78,11 +78,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
index 968b712..06cf3f0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_operator.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -122,7 +122,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -158,7 +158,7 @@
                 listener: endClassConstructor(null, Foo, (, null, })
               listener: endMember()
             notEofOrValue(}, .)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(.)
                 listener: endMetadataStar(0)
@@ -169,7 +169,7 @@
                 listener: handleInvalidMember(.)
                 listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(., DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(., DeclarationKind.Class, Foo)
               parseMetadataStar(.)
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -228,7 +228,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -264,7 +264,7 @@
                 listener: endClassMethod(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
@@ -323,7 +323,7 @@
                     listener: endClassConstructor(null, operator, (, :, })
                   listener: endMember()
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -359,7 +359,7 @@
                 listener: endClassMethod(null, foo, (, null, })
               listener: endMember()
             notEofOrValue(}, .)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(.)
                 listener: endMetadataStar(0)
@@ -370,7 +370,7 @@
                 listener: handleInvalidMember(.)
                 listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(., DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(., DeclarationKind.Class, Foo)
               parseMetadataStar(.)
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
index 9e97581..a93fe07 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.expect
@@ -22,11 +22,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
index 37469fb..148639d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_return_type.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -60,7 +60,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassConstructor(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
index 927d34c..e78880d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.expect
@@ -22,11 +22,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(set)
diff --git a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
index 716dcfc..d1bd6a8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/constructor_recovery_set.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -60,7 +60,7 @@
                 listener: endClassMethod(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassConstructor(set, set, (, :, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassConstructor(set, set, (, null, })
               listener: endMember()
             notEofOrValue(}, set)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(set)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
index faffbc1..2741a0e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.expect
@@ -51,7 +51,7 @@
                 handleType(int, null)
                 handleIdentifier(b, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.ExtensionNonStaticMethod, null, null, null)
@@ -60,7 +60,7 @@
                 handleType(int, null)
                 handleIdentifier(c, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -100,7 +100,7 @@
                 handleType(int, null)
                 handleIdentifier(d, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, d, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, d, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -131,7 +131,7 @@
           handleType(List, null)
           handleIdentifier(l, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -169,7 +169,7 @@
           handleType(List, null)
           handleIdentifier(l, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
index c4a5cfd..c951cb0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/extension_member_contributor_test_completion.dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(extension)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, extension, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, extension, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, extension)
       parseExtension(extension)
         listener: beginExtensionDeclarationPrelude(extension)
@@ -35,7 +35,7 @@
         parseClassOrMixinOrExtensionBody(>, DeclarationKind.Extension, E)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, bool)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, E)
             parseMetadataStar({)
               listener: beginMetadataStar(bool)
               listener: endMetadataStar(0)
@@ -65,7 +65,7 @@
                       ensureIdentifier(int, formalParameterDeclaration)
                         listener: handleIdentifier(b, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue(,)
-                      listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                       parseMetadataStar(,)
                         listener: beginMetadataStar(int)
@@ -77,7 +77,7 @@
                       ensureIdentifier(int, formalParameterDeclaration)
                         listener: handleIdentifier(c, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(2, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
@@ -92,7 +92,7 @@
               listener: endExtensionMethod(null, bool, (, null, })
             listener: endMember()
           notEofOrValue(}, int)
-          parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Extension, E)
             parseMetadataStar(})
               listener: beginMetadataStar(int)
               listener: endMetadataStar(0)
@@ -129,7 +129,7 @@
               listener: endExtensionMethod(get, int, =>, null, ;)
             listener: endMember()
           notEofOrValue(}, set)
-          parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Extension, E)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Extension, E)
             parseMetadataStar(;)
               listener: beginMetadataStar(set)
               listener: endMetadataStar(0)
@@ -156,7 +156,7 @@
                       ensureIdentifier(int, formalParameterDeclaration)
                         listener: handleIdentifier(d, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, d, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, d, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
@@ -207,7 +207,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(l, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -285,7 +285,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(l, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, l, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
index daa2562..3caae1e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.expect
@@ -26,11 +26,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
index 7fce480..32d89ec 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_000032.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
index 40cd176..cfcdd2e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.expect
@@ -26,11 +26,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -41,11 +41,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(B, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, B)
+    beginClassDeclaration(class, null, null, B)
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -56,7 +56,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables(extends)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(,)
       handleType(A, null)
@@ -66,7 +66,7 @@
       handleType(B, null)
       handleClassExtends(extends, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
@@ -92,11 +92,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Bar, classOrMixinDeclaration)
     handleNoTypeVariables(extend)
-    beginClassDeclaration(class, null, Bar)
+    beginClassDeclaration(class, null, null, Bar)
       handleNoType(Bar)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], extend, extend)
       handleIdentifier(A, typeReference)
@@ -108,7 +108,7 @@
       handleType(B, null)
       handleClassExtends(extend, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Bar)
@@ -134,11 +134,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Baz, classOrMixinDeclaration)
     handleNoTypeVariables(on)
-    beginClassDeclaration(class, null, Baz)
+    beginClassDeclaration(class, null, null, Baz)
       handleNoType(Baz)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], on, on)
       handleIdentifier(A, typeReference)
@@ -150,7 +150,7 @@
       handleType(B, null)
       handleClassExtends(on, 2)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Baz)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
index e4749d3..0c27622 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22313.dart.intertwined.expect
@@ -6,23 +6,23 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -34,23 +34,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(B, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, B)
+        listener: beginClassDeclaration(class, null, null, B)
         parseClass(B, class, class, B)
           parseClassHeaderOpt(B, class, class)
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -62,14 +62,14 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables(extends)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
@@ -83,15 +83,15 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(B, null)
                 listener: handleClassExtends(extends, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -130,29 +130,29 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Bar, classOrMixinDeclaration)
         listener: handleNoTypeVariables(extend)
-        listener: beginClassDeclaration(class, null, Bar)
+        listener: beginClassDeclaration(class, null, null, Bar)
         parseClass(Bar, class, class, Bar)
           parseClassHeaderOpt(Bar, class, class)
             parseClassExtendsOpt(Bar)
               listener: handleNoType(Bar)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Bar)
+            parseClassWithClauseOpt(Bar)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Bar)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Bar)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(Bar, class, class)
             parseClassHeaderOpt(Bar, class, class)
               parseClassExtendsOpt(Bar)
-              parseWithClauseOpt(Bar)
-              parseClassOrMixinImplementsOpt(Bar)
+              parseClassWithClauseOpt(Bar)
+              parseClassOrMixinOrEnumImplementsOpt(Bar)
             skipUnexpectedTokenOpt(Bar, [extends, with, implements, {])
             reportRecoverableError(extend, Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}])
               listener: handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], extend, extend)
@@ -166,16 +166,16 @@
               listener: handleNoTypeArguments({)
               listener: handleType(B, null)
               listener: handleClassExtends(extend, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(B, null, class declaration)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Bar)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Bar)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Bar)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Bar)
               parseMetadataStar({)
                 listener: beginMetadataStar(Bar)
                 listener: endMetadataStar(0)
@@ -214,29 +214,29 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Baz, classOrMixinDeclaration)
         listener: handleNoTypeVariables(on)
-        listener: beginClassDeclaration(class, null, Baz)
+        listener: beginClassDeclaration(class, null, null, Baz)
         parseClass(Baz, class, class, Baz)
           parseClassHeaderOpt(Baz, class, class)
             parseClassExtendsOpt(Baz)
               listener: handleNoType(Baz)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Baz)
+            parseClassWithClauseOpt(Baz)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Baz)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Baz)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(Baz, class, class)
             parseClassHeaderOpt(Baz, class, class)
               parseClassExtendsOpt(Baz)
-              parseWithClauseOpt(Baz)
-              parseClassOrMixinImplementsOpt(Baz)
+              parseClassWithClauseOpt(Baz)
+              parseClassOrMixinOrEnumImplementsOpt(Baz)
             skipUnexpectedTokenOpt(Baz, [extends, with, implements, {])
             reportRecoverableError(on, Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}])
               listener: handleRecoverableError(Message[ExpectedInstead, Expected 'extends' instead of this., null, {string: extends}], on, on)
@@ -250,16 +250,16 @@
               listener: handleNoTypeArguments({)
               listener: handleType(B, null)
               listener: handleClassExtends(on, 2)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(B, null, class declaration)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, Baz)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Baz)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Baz)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Baz)
               parseMetadataStar({)
                 listener: beginMetadataStar(Baz)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
index 43b85dd..50def6f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.expect
@@ -25,11 +25,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Annotation, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Annotation)
+    beginClassDeclaration(class, null, null, Annotation)
       handleNoType(Annotation)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
@@ -57,7 +57,7 @@
                 handleNoType(()
                 handleIdentifier(message, fieldInitializer)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(this, ., message, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(this, null, ., message, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -80,11 +80,11 @@
         handleNoType(E)
       endTypeVariable(>, 0, null, null)
     endTypeVariables(<, >)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -95,11 +95,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(m)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
index 392f65b..8d39ca9 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_22314.dart.intertwined.expect
@@ -28,28 +28,28 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Annotation, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Annotation)
+        listener: beginClassDeclaration(class, null, null, Annotation)
         parseClass(Annotation, class, class, Annotation)
           parseClassHeaderOpt(Annotation, class, class)
             parseClassExtendsOpt(Annotation)
               listener: handleNoType(Annotation)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Annotation)
+            parseClassWithClauseOpt(Annotation)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Annotation)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Annotation)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Annotation, DeclarationKind.Class, Annotation)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Annotation)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Annotation)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -66,7 +66,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, const)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Annotation)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Annotation)
               parseMetadataStar(;)
                 listener: beginMetadataStar(const)
                 listener: endMetadataStar(0)
@@ -92,7 +92,7 @@
                         ensureIdentifier(., fieldInitializer)
                           listener: handleIdentifier(message, fieldInitializer)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(this, ., message, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(this, null, ., message, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -112,9 +112,9 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
@@ -127,16 +127,16 @@
         listener: handleNoType(E)
         listener: endTypeVariable(>, 0, null, null)
         listener: endTypeVariables(<, >)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(>, class, class, A)
           parseClassHeaderOpt(>, class, class)
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -148,28 +148,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, m)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(m)
                 listener: endMetadataStar(0)
@@ -203,7 +203,7 @@
                             parseNewExpression(=>)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(A, constructorReference)
                                 listener: beginConstructorReference(A)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect
index 810e998..942e5ce 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.expect
@@ -53,7 +53,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -76,7 +76,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -102,7 +102,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -126,7 +126,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -156,7 +156,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -188,7 +188,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -230,7 +230,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -286,7 +286,7 @@
             handleType(int, null)
             handleIdentifier(x, formalParameterDeclaration)
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect
index 317743c..d081a84 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26073.dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -34,7 +34,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -44,7 +44,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -69,7 +69,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -79,7 +79,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -110,7 +110,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -120,7 +120,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -148,7 +148,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -158,7 +158,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -193,7 +193,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -203,7 +203,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -239,7 +239,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -249,7 +249,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -296,7 +296,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -306,7 +306,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -376,7 +376,7 @@
               ensureIdentifier(int, formalParameterDeclaration)
                 listener: handleIdentifier(x, formalParameterDeclaration)
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -386,7 +386,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -458,7 +458,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -476,7 +476,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
index 464bf21..2ac0d92 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.expect
@@ -66,11 +66,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
     handleIdentifier(Key, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(abstract, abstract, Key)
+    beginClassDeclaration(abstract, abstract, null, Key)
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -387,7 +387,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -396,7 +396,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -432,7 +432,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -441,7 +441,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -476,7 +476,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -485,7 +485,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -524,7 +524,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -533,7 +533,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -571,7 +571,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -580,7 +580,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -635,7 +635,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -644,7 +644,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -698,7 +698,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -707,7 +707,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -749,7 +749,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -758,7 +758,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -799,7 +799,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -808,7 +808,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -853,7 +853,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -862,7 +862,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -904,7 +904,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -913,7 +913,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -991,7 +991,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1000,7 +1000,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1082,7 +1082,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1091,7 +1091,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1170,7 +1170,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1179,7 +1179,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
index 95350ea..b1c109a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810.dart.intertwined.expect
@@ -6,29 +6,29 @@
     parseMetadataStar()
       listener: beginMetadataStar(abstract)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
         parseTopLevelKeywordModifiers(abstract, class)
-      parseClassOrNamedMixinApplication(abstract, class)
+      parseClassOrNamedMixinApplication(abstract, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Key, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(abstract, abstract, Key)
+        listener: beginClassDeclaration(abstract, abstract, null, Key)
         parseClass(Key, abstract, class, Key)
           parseClassHeaderOpt(Key, abstract, class)
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -468,7 +468,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -668,7 +668,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -762,7 +762,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -792,7 +792,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -804,7 +804,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -859,7 +859,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -889,7 +889,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -901,7 +901,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -944,7 +944,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -974,7 +974,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -986,7 +986,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1048,7 +1048,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1078,7 +1078,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1090,7 +1090,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1140,7 +1140,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1170,7 +1170,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1182,7 +1182,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1279,7 +1279,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1309,7 +1309,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1321,7 +1321,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1406,7 +1406,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1436,7 +1436,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1448,7 +1448,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1522,7 +1522,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1552,7 +1552,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1564,7 +1564,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1621,7 +1621,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1651,7 +1651,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1663,7 +1663,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1744,7 +1744,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1774,7 +1774,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1786,7 +1786,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1850,7 +1850,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -1879,7 +1879,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1891,7 +1891,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2088,7 +2088,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2117,7 +2117,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2129,7 +2129,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2333,7 +2333,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2362,7 +2362,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2374,7 +2374,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2542,7 +2542,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
@@ -2571,7 +2571,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2583,7 +2583,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
index 0859270..0316b5f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.expect
@@ -66,11 +66,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
     handleIdentifier(Key, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(abstract, abstract, Key)
+    beginClassDeclaration(abstract, abstract, null, Key)
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -387,7 +387,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -396,7 +396,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -432,7 +432,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -441,7 +441,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -476,7 +476,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -485,7 +485,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -524,7 +524,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -533,7 +533,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -571,7 +571,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -580,7 +580,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -635,7 +635,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -644,7 +644,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -698,7 +698,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -707,7 +707,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -749,7 +749,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -758,7 +758,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -799,7 +799,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -808,7 +808,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -853,7 +853,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -862,7 +862,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -904,7 +904,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -913,7 +913,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -991,7 +991,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1000,7 +1000,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1082,7 +1082,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1091,7 +1091,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1170,7 +1170,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1179,7 +1179,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
index 3f6b15d..91ece53 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_and.dart.intertwined.expect
@@ -6,29 +6,29 @@
     parseMetadataStar()
       listener: beginMetadataStar(abstract)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
         parseTopLevelKeywordModifiers(abstract, class)
-      parseClassOrNamedMixinApplication(abstract, class)
+      parseClassOrNamedMixinApplication(abstract, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Key, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(abstract, abstract, Key)
+        listener: beginClassDeclaration(abstract, abstract, null, Key)
         parseClass(Key, abstract, class, Key)
           parseClassHeaderOpt(Key, abstract, class)
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -469,7 +469,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -556,7 +556,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -670,7 +670,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -764,7 +764,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -794,7 +794,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -806,7 +806,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -861,7 +861,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -891,7 +891,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -903,7 +903,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -946,7 +946,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -976,7 +976,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -988,7 +988,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1050,7 +1050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1080,7 +1080,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1092,7 +1092,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1142,7 +1142,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1172,7 +1172,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1184,7 +1184,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1281,7 +1281,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1311,7 +1311,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1323,7 +1323,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1408,7 +1408,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1438,7 +1438,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1450,7 +1450,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1525,7 +1525,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1555,7 +1555,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1567,7 +1567,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1624,7 +1624,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1654,7 +1654,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1666,7 +1666,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1748,7 +1748,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1778,7 +1778,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1790,7 +1790,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1854,7 +1854,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -1883,7 +1883,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1895,7 +1895,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2092,7 +2092,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2121,7 +2121,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2133,7 +2133,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2337,7 +2337,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2366,7 +2366,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2378,7 +2378,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2546,7 +2546,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
@@ -2575,7 +2575,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2587,7 +2587,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
index fae98c4..c5a4273 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.expect
@@ -66,11 +66,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
     handleIdentifier(Key, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(abstract, abstract, Key)
+    beginClassDeclaration(abstract, abstract, null, Key)
       handleNoType(Key)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -387,7 +387,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -396,7 +396,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -432,7 +432,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -441,7 +441,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -476,7 +476,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -485,7 +485,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -524,7 +524,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -533,7 +533,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -571,7 +571,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -580,7 +580,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -635,7 +635,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -644,7 +644,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -698,7 +698,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -707,7 +707,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -749,7 +749,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -758,7 +758,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -799,7 +799,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -808,7 +808,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -853,7 +853,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -862,7 +862,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -904,7 +904,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -913,7 +913,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -991,7 +991,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1000,7 +1000,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1082,7 +1082,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1091,7 +1091,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(foo)
@@ -1170,7 +1170,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -1179,7 +1179,7 @@
                 handleType(int, null)
                 handleIdentifier(y, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
index 5923c78..f8f7500 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_26810_or.dart.intertwined.expect
@@ -6,29 +6,29 @@
     parseMetadataStar()
       listener: beginMetadataStar(abstract)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
         parseTopLevelKeywordModifiers(abstract, class)
-      parseClassOrNamedMixinApplication(abstract, class)
+      parseClassOrNamedMixinApplication(abstract, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Key, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(abstract, abstract, Key)
+        listener: beginClassDeclaration(abstract, abstract, null, Key)
         parseClass(Key, abstract, class, Key)
           parseClassHeaderOpt(Key, abstract, class)
             parseClassExtendsOpt(Key)
               listener: handleNoType(Key)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Key)
+            parseClassWithClauseOpt(Key)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Key)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Key)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Key, DeclarationKind.Class, Key)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Key)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -282,7 +282,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -362,7 +362,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -469,7 +469,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -556,7 +556,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -670,7 +670,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -764,7 +764,7 @@
                 listener: endClassMethod(get, int, {, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -794,7 +794,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -806,7 +806,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -861,7 +861,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -891,7 +891,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -903,7 +903,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -946,7 +946,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -976,7 +976,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -988,7 +988,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1050,7 +1050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1080,7 +1080,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1092,7 +1092,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1142,7 +1142,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1172,7 +1172,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1184,7 +1184,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1281,7 +1281,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1311,7 +1311,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1323,7 +1323,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1408,7 +1408,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1438,7 +1438,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1450,7 +1450,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1525,7 +1525,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1555,7 +1555,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1567,7 +1567,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1624,7 +1624,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Key)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1654,7 +1654,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1666,7 +1666,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1748,7 +1748,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1778,7 +1778,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1790,7 +1790,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1854,7 +1854,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, s)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(s)
                 listener: endMetadataStar(0)
@@ -1883,7 +1883,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -1895,7 +1895,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2092,7 +2092,7 @@
                 listener: endClassMethod(null, s, (, null, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2121,7 +2121,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2133,7 +2133,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2337,7 +2337,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, Key)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(Key)
                 listener: endMetadataStar(0)
@@ -2366,7 +2366,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2378,7 +2378,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -2546,7 +2546,7 @@
                 listener: endClassConstructor(null, Key, (, :, })
               listener: endMember()
             notEofOrValue(}, not_currently_working)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Key)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Key)
               parseMetadataStar(})
                 listener: beginMetadataStar(not_currently_working)
                 listener: endMetadataStar(0)
@@ -2575,7 +2575,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -2587,7 +2587,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
index 550de5d..abe79a6 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.expect
@@ -14,11 +14,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(co)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
index 20a6ec6..19f4ce1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, co)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(co)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
index 2c563eb..ecd1166 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.expect
@@ -10,11 +10,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(co)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
index 0029b54..6329811 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39026_prime.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, co)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(co)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39033.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39033.crash_dart.intertwined.expect
index 8064bef..8b108c7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39033.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39033.crash_dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
index 71be906..e533d5c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.expect
@@ -22,11 +22,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
index f465d58..87cebd9 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_39230.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, C, (, null, })
               listener: endMember()
             notEofOrValue(}, /)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(/)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
index fed361e..c9eff1a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
@@ -18,11 +18,11 @@
         handleNoType(T)
       endTypeVariable(>, 0, null, null)
     endTypeVariables(<, >)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -43,7 +43,7 @@
     endTypeVariables(<, >)
     beginMixinDeclaration(mixin, M)
       handleMixinOn(null, 0)
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleMixinHeader(mixin)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Mixin, 0, {, })
@@ -54,7 +54,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(DND1, classOrMixinDeclaration)
     handleNoTypeVariables(extends)
-    beginClassDeclaration(class, null, DND1)
+    beginClassDeclaration(class, null, null, DND1)
       handleIdentifier(Object, typeReference)
       handleNoTypeArguments(with)
       handleType(Object, null)
@@ -74,13 +74,13 @@
         endFunctionType(Function, null)
       endTypeList(1)
       handleClassWithClause(with)
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleRecoverableError(Message[UnexpectedToken, Unexpected token '>'., null, {lexeme: >}], >, >)
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
index 6017b1c..32477fe 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
@@ -6,9 +6,9 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
@@ -21,16 +21,16 @@
         listener: handleNoType(T)
         listener: endTypeVariable(>, 0, null, null)
         listener: endTypeVariables(<, >)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(>, class, class, A)
           parseClassHeaderOpt(>, class, class)
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -42,7 +42,7 @@
     parseMetadataStar(})
       listener: beginMetadataStar(mixin)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, mixin, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, mixin, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(}, mixin)
       parseMixin(mixin)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(mixin)
@@ -61,8 +61,8 @@
         parseMixinHeaderOpt(>, mixin)
           parseMixinOnOpt(>)
             listener: handleMixinOn(null, 0)
-          parseClassOrMixinImplementsOpt(>)
-            listener: handleClassOrMixinImplements(null, 0)
+          parseClassOrMixinOrEnumImplementsOpt(>)
+            listener: handleImplements(null, 0)
           listener: handleMixinHeader(mixin)
         parseClassOrMixinOrExtensionBody(>, DeclarationKind.Mixin, M)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Mixin, {)
@@ -74,14 +74,14 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(DND1, classOrMixinDeclaration)
         listener: handleNoTypeVariables(extends)
-        listener: beginClassDeclaration(class, null, DND1)
+        listener: beginClassDeclaration(class, null, null, DND1)
         parseClass(DND1, class, class, DND1)
           parseClassHeaderOpt(DND1, class, class)
             parseClassExtendsOpt(DND1)
@@ -90,7 +90,7 @@
                 listener: handleNoTypeArguments(with)
                 listener: handleType(Object, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(Object)
+            parseClassWithClauseOpt(Object)
               parseTypeList(with)
                 listener: beginTypeList(M)
                 listener: beginFunctionType(M)
@@ -110,29 +110,29 @@
                 listener: endFunctionType(Function, null)
                 listener: endTypeList(1)
               listener: handleClassWithClause(with)
-            parseClassOrMixinImplementsOpt())
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt())
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(DND1, class, class)
             parseClassHeaderOpt(DND1, class, class)
               parseClassExtendsOpt(DND1)
                 parseClassExtendsSeenExtendsClause(extends, DND1)
-              parseWithClauseOpt(Object)
+              parseClassWithClauseOpt(Object)
                 parseTypeList(with)
                   ensureIdentifier(with, typeReference)
                   parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
                     parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
-              parseClassOrMixinImplementsOpt())
+              parseClassOrMixinOrEnumImplementsOpt())
             skipUnexpectedTokenOpt(), [extends, with, implements, {])
               reportRecoverableErrorWithToken(>, Instance of 'Template<(Token) => Message>')
                 listener: handleRecoverableError(Message[UnexpectedToken, Unexpected token '>'., null, {lexeme: >}], >, >)
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(>, null, class declaration)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, DND1)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.expect
index 26b7c41..60b08d7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.expect
@@ -57,7 +57,7 @@
                 handleNoType(()
                 handleIdentifier(builder, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+              endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
             endFormalParameters(1, (, ), MemberKind.Local)
             handleAsyncModifier(null, null)
             handleIdentifier(builder, expression)
@@ -111,7 +111,7 @@
                 handleNoType(()
                 handleIdentifier(builder, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+              endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
             endFormalParameters(1, (, ), MemberKind.Local)
             handleAsyncModifier(null, null)
             handleIdentifier(builder, expression)
@@ -166,7 +166,7 @@
                 handleNoType(()
                 handleIdentifier(builder, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+              endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
             endFormalParameters(1, (, ), MemberKind.Local)
             handleAsyncModifier(null, null)
             handleIdentifier(builder, expression)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
index ad14111..172bb90 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_42267.dart.intertwined.expect
@@ -115,7 +115,7 @@
                                                       ensureIdentifier((, formalParameterDeclaration)
                                                         listener: handleIdentifier(builder, formalParameterDeclaration)
                                                       listener: handleFormalParameterWithoutValue())
-                                                      listener: endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                                                      listener: endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
                                                     listener: endFormalParameters(1, (, ), MemberKind.Local)
                                                 parseAsyncOptBody(), true, false)
                                                   parseAsyncModifierOpt())
@@ -266,7 +266,7 @@
                                                       ensureIdentifier((, formalParameterDeclaration)
                                                         listener: handleIdentifier(builder, formalParameterDeclaration)
                                                       listener: handleFormalParameterWithoutValue())
-                                                      listener: endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                                                      listener: endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
                                                     listener: endFormalParameters(1, (, ), MemberKind.Local)
                                                 parseAsyncOptBody(), true, false)
                                                   parseAsyncModifierOpt())
@@ -419,7 +419,7 @@
                                                       ensureIdentifier((, formalParameterDeclaration)
                                                         listener: handleIdentifier(builder, formalParameterDeclaration)
                                                       listener: handleFormalParameterWithoutValue())
-                                                      listener: endFormalParameter(null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                                                      listener: endFormalParameter(null, null, null, builder, null, null, FormalParameterKind.mandatory, MemberKind.Local)
                                                     listener: endFormalParameters(1, (, ), MemberKind.Local)
                                                 parseAsyncOptBody(), true, false)
                                                   parseAsyncModifierOpt())
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_43090.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_43090.crash_dart.intertwined.expect
index 1fc743a..fdef824 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_43090.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_43090.crash_dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_43090_prime_01.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_43090_prime_01.crash_dart.intertwined.expect
index 2c656d6..4c19f5b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_43090_prime_01.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_43090_prime_01.crash_dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_43090_prime_02.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_43090_prime_02.crash_dart.intertwined.expect
index 2845e0b..b8f453d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_43090_prime_02.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_43090_prime_02.crash_dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect
index 10ad30c..6e0c9728 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.expect
@@ -33,7 +33,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -42,7 +42,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -93,7 +93,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -102,7 +102,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect
index 1ed1153..5369ad7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785.crash_dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -43,7 +43,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -186,7 +186,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -198,7 +198,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect
index 52d75b5..624aaa6 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.expect
@@ -41,7 +41,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -50,7 +50,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -100,7 +100,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -109,7 +109,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -118,7 +118,7 @@
           handleType(int, null)
           handleIdentifier(c, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -178,7 +178,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -187,7 +187,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -237,7 +237,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -246,7 +246,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -255,7 +255,7 @@
           handleType(int, null)
           handleIdentifier(c, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect
index 96b2596..8aeda7b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_1.crash_dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -43,7 +43,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -183,7 +183,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -195,7 +195,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -207,7 +207,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -395,7 +395,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -407,7 +407,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -547,7 +547,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -559,7 +559,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -571,7 +571,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect
index cd1beba..cc590c5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.expect
@@ -15,7 +15,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -73,7 +73,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -82,7 +82,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -91,7 +91,7 @@
           handleType(int, null)
           handleIdentifier(c, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -149,7 +149,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -158,7 +158,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -207,7 +207,7 @@
           handleType(int, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -216,7 +216,7 @@
           handleType(int, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -225,7 +225,7 @@
           handleType(int, null)
           handleIdentifier(c, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect
index c5680b3..9d01254 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_44785_prime_2.crash_dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -43,7 +43,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -157,7 +157,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -169,7 +169,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -181,7 +181,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -316,7 +316,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -328,7 +328,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -442,7 +442,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -454,7 +454,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -466,7 +466,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
index 90f0494..9a36032 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.expect
@@ -22,11 +22,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
index a1f507a..46c74ad 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -78,7 +78,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -123,7 +123,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -162,7 +162,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -216,7 +216,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -259,7 +259,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -325,7 +325,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -379,7 +379,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -439,7 +439,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
index f85d2a9..548af9c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.expect
@@ -22,11 +22,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
index 3fdbced..04648ed 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_const.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -77,7 +77,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -125,7 +125,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -163,7 +163,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -191,7 +191,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -219,7 +219,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -247,7 +247,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -264,7 +264,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -329,7 +329,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -382,7 +382,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -445,7 +445,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
index dbfa889..fc0194c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.expect
@@ -18,11 +18,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
index fe10043..78a0d51 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -74,7 +74,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -115,7 +115,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -153,7 +153,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -200,7 +200,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -239,7 +239,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -289,7 +289,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -332,7 +332,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -376,7 +376,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
index ee30059..143a90d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.expect
@@ -22,11 +22,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
index 2a9f996..5602483 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_const.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -73,7 +73,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -117,7 +117,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -154,7 +154,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -178,7 +178,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -203,7 +203,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -227,7 +227,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -244,7 +244,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -293,7 +293,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -333,7 +333,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -380,7 +380,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
index 53c04d2..9792fa7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.expect
@@ -34,11 +34,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
index 0133f20..eba032d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_list_new.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -73,7 +73,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -119,7 +119,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -156,7 +156,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -181,7 +181,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -206,7 +206,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -231,7 +231,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(List, constructorReference)
                               listener: beginConstructorReference(List)
@@ -248,7 +248,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -297,7 +297,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -337,7 +337,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -386,7 +386,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
index 173eeae..88ac7ed 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.expect
@@ -34,11 +34,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
index 0b1733b..ccc11a0 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_new.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -77,7 +77,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -127,7 +127,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -165,7 +165,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -194,7 +194,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -222,7 +222,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -251,7 +251,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Map, constructorReference)
                               listener: beginConstructorReference(Map)
@@ -268,7 +268,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -333,7 +333,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -386,7 +386,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -451,7 +451,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
index 7a1bda5..9138896 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.expect
@@ -22,11 +22,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
index 6419253..498b48a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -71,7 +71,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -109,7 +109,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -144,7 +144,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -191,7 +191,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -230,7 +230,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -280,7 +280,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -321,7 +321,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -365,7 +365,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
index be8115b..a2bf1e5 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.expect
@@ -22,11 +22,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
index fe81a69..b2e7f3e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_const.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -70,7 +70,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -111,7 +111,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -145,7 +145,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -169,7 +169,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -194,7 +194,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -218,7 +218,7 @@
                         parsePrimary(=, expression)
                           parseConstExpression(=)
                             listener: beginConstExpression(const)
-                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(const, ConstructorReferenceContext.Const, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(const, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -235,7 +235,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -284,7 +284,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -324,7 +324,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -371,7 +371,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
index 47c67e8..a62bd2c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.expect
@@ -34,11 +34,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(F, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, F)
+    beginClassDeclaration(class, null, null, F)
       handleNoType(F)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
index 02cf05c..dabdaef 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45251_set_new.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(F, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, F)
+        listener: beginClassDeclaration(class, null, null, F)
         parseClass(F, class, class, F)
           parseClassHeaderOpt(F, class, class)
             parseClassExtendsOpt(F)
               listener: handleNoType(F)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(F)
+            parseClassWithClauseOpt(F)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(F)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(F)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(F, DeclarationKind.Class, F)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, F)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -70,7 +70,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -113,7 +113,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -147,7 +147,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -172,7 +172,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'ComplexTypeParamOrArgInfo', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -197,7 +197,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -222,7 +222,7 @@
                           parseNewExpression(=)
                             isNextIdentifier(new)
                             listener: beginNewExpression(new)
-                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg')
+                            parseConstructorReference(new, ConstructorReferenceContext.New, Instance of 'NoTypeParamOrArg', false)
                               ensureIdentifier(new, constructorReference)
                                 listener: handleIdentifier(Set, constructorReference)
                               listener: beginConstructorReference(Set)
@@ -239,7 +239,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -288,7 +288,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -328,7 +328,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -377,7 +377,7 @@
                 listener: endClassFields(null, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, F)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, F)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
index 3879cab..aaf3524 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.expect
@@ -22,11 +22,11 @@
         handleNoType(T)
       endTypeVariable(>, 0, null, null)
     endTypeVariables(<, >)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
@@ -45,7 +45,7 @@
                 handleType(Object, ?)
                 handleIdentifier(key, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, key, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, key, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
index a9e5ff3..4cba827 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_45327_prime_1.crash_dart.intertwined.expect
@@ -6,9 +6,9 @@
     parseMetadataStar(UnmatchedToken(())
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(UnmatchedToken((), class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(UnmatchedToken((), class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(UnmatchedToken((), class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
@@ -21,21 +21,21 @@
         listener: handleNoType(T)
         listener: endTypeVariable(>, 0, null, null)
         listener: endTypeVariables(<, >)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(>, class, class, Foo)
           parseClassHeaderOpt(>, class, class)
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -64,7 +64,7 @@
                         ensureIdentifier(?, formalParameterDeclaration)
                           listener: handleIdentifier(key, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, key, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, key, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
index 5c15762..3bc1986 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
@@ -227,11 +227,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'abstract' as a name here., null, {lexeme: abstract}], abstract, abstract)
     handleIdentifier(abstract, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, abstract)
+    beginClassDeclaration(class, null, null, abstract)
       handleNoType(abstract)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -243,11 +243,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'as' as a name here., null, {lexeme: as}], as, as)
     handleIdentifier(as, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, as)
+    beginClassDeclaration(class, null, null, as)
       handleNoType(as)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -259,11 +259,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
     handleIdentifier(assert, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, assert)
+    beginClassDeclaration(class, null, null, assert)
       handleNoType(assert)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -274,11 +274,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(async, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, async)
+    beginClassDeclaration(class, null, null, async)
       handleNoType(async)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -289,11 +289,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(await, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, await)
+    beginClassDeclaration(class, null, null, await)
       handleNoType(await)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -305,11 +305,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
     handleIdentifier(break, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, break)
+    beginClassDeclaration(class, null, null, break)
       handleNoType(break)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -321,11 +321,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
     handleIdentifier(case, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, case)
+    beginClassDeclaration(class, null, null, case)
       handleNoType(case)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -337,11 +337,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
     handleIdentifier(catch, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, catch)
+    beginClassDeclaration(class, null, null, catch)
       handleNoType(catch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -353,11 +353,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
     handleIdentifier(class, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, class)
+    beginClassDeclaration(class, null, null, class)
       handleNoType(class)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -369,11 +369,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
     handleIdentifier(const, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, const)
+    beginClassDeclaration(class, null, null, const)
       handleNoType(const)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -385,11 +385,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
     handleIdentifier(continue, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, continue)
+    beginClassDeclaration(class, null, null, continue)
       handleNoType(continue)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -401,11 +401,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'covariant' as a name here., null, {lexeme: covariant}], covariant, covariant)
     handleIdentifier(covariant, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, covariant)
+    beginClassDeclaration(class, null, null, covariant)
       handleNoType(covariant)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -417,11 +417,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
     handleIdentifier(default, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, default)
+    beginClassDeclaration(class, null, null, default)
       handleNoType(default)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -433,11 +433,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'deferred' as a name here., null, {lexeme: deferred}], deferred, deferred)
     handleIdentifier(deferred, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, deferred)
+    beginClassDeclaration(class, null, null, deferred)
       handleNoType(deferred)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -449,11 +449,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
     handleIdentifier(do, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, do)
+    beginClassDeclaration(class, null, null, do)
       handleNoType(do)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -465,11 +465,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'dynamic' as a name here., null, {lexeme: dynamic}], dynamic, dynamic)
     handleIdentifier(dynamic, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, dynamic)
+    beginClassDeclaration(class, null, null, dynamic)
       handleNoType(dynamic)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -481,11 +481,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
     handleIdentifier(else, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, else)
+    beginClassDeclaration(class, null, null, else)
       handleNoType(else)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -497,11 +497,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
     handleIdentifier(enum, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, enum)
+    beginClassDeclaration(class, null, null, enum)
       handleNoType(enum)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -513,11 +513,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'export' as a name here., null, {lexeme: export}], export, export)
     handleIdentifier(export, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, export)
+    beginClassDeclaration(class, null, null, export)
       handleNoType(export)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -529,11 +529,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
     handleIdentifier(extends, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, extends)
+    beginClassDeclaration(class, null, null, extends)
       handleNoType(extends)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -545,11 +545,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'extension' as a name here., null, {lexeme: extension}], extension, extension)
     handleIdentifier(extension, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, extension)
+    beginClassDeclaration(class, null, null, extension)
       handleNoType(extension)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -561,11 +561,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'external' as a name here., null, {lexeme: external}], external, external)
     handleIdentifier(external, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, external)
+    beginClassDeclaration(class, null, null, external)
       handleNoType(external)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -577,11 +577,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'factory' as a name here., null, {lexeme: factory}], factory, factory)
     handleIdentifier(factory, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, factory)
+    beginClassDeclaration(class, null, null, factory)
       handleNoType(factory)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -593,11 +593,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
     handleIdentifier(false, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, false)
+    beginClassDeclaration(class, null, null, false)
       handleNoType(false)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -609,11 +609,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
     handleIdentifier(final, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, final)
+    beginClassDeclaration(class, null, null, final)
       handleNoType(final)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -625,11 +625,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
     handleIdentifier(finally, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, finally)
+    beginClassDeclaration(class, null, null, finally)
       handleNoType(finally)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -641,11 +641,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
     handleIdentifier(for, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, for)
+    beginClassDeclaration(class, null, null, for)
       handleNoType(for)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -656,11 +656,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Function, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Function)
+    beginClassDeclaration(class, null, null, Function)
       handleNoType(Function)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -672,11 +672,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'get' as a name here., null, {lexeme: get}], get, get)
     handleIdentifier(get, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, get)
+    beginClassDeclaration(class, null, null, get)
       handleNoType(get)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -687,11 +687,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(hide, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, hide)
+    beginClassDeclaration(class, null, null, hide)
       handleNoType(hide)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -703,11 +703,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
     handleIdentifier(if, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, if)
+    beginClassDeclaration(class, null, null, if)
       handleNoType(if)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -719,11 +719,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'implements' as a name here., null, {lexeme: implements}], implements, implements)
     handleIdentifier(implements, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, implements)
+    beginClassDeclaration(class, null, null, implements)
       handleNoType(implements)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -735,11 +735,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'import' as a name here., null, {lexeme: import}], import, import)
     handleIdentifier(import, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, import)
+    beginClassDeclaration(class, null, null, import)
       handleNoType(import)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -751,11 +751,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
     handleIdentifier(in, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, in)
+    beginClassDeclaration(class, null, null, in)
       handleNoType(in)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -766,11 +766,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(inout, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, inout)
+    beginClassDeclaration(class, null, null, inout)
       handleNoType(inout)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -782,11 +782,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'interface' as a name here., null, {lexeme: interface}], interface, interface)
     handleIdentifier(interface, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, interface)
+    beginClassDeclaration(class, null, null, interface)
       handleNoType(interface)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -798,11 +798,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
     handleIdentifier(is, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, is)
+    beginClassDeclaration(class, null, null, is)
       handleNoType(is)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -814,11 +814,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
     handleIdentifier(late, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, late)
+    beginClassDeclaration(class, null, null, late)
       handleNoType(late)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -830,11 +830,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'library' as a name here., null, {lexeme: library}], library, library)
     handleIdentifier(library, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, library)
+    beginClassDeclaration(class, null, null, library)
       handleNoType(library)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -846,11 +846,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'mixin' as a name here., null, {lexeme: mixin}], mixin, mixin)
     handleIdentifier(mixin, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, mixin)
+    beginClassDeclaration(class, null, null, mixin)
       handleNoType(mixin)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -861,11 +861,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(native, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, native)
+    beginClassDeclaration(class, null, null, native)
       handleNoType(native)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -877,11 +877,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
     handleIdentifier(new, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, new)
+    beginClassDeclaration(class, null, null, new)
       handleNoType(new)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -893,11 +893,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
     handleIdentifier(null, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, null)
+    beginClassDeclaration(class, null, null, null)
       handleNoType(null)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -908,11 +908,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(of, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, of)
+    beginClassDeclaration(class, null, null, of)
       handleNoType(of)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -923,11 +923,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(on, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, on)
+    beginClassDeclaration(class, null, null, on)
       handleNoType(on)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -939,11 +939,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
     handleIdentifier(operator, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, operator)
+    beginClassDeclaration(class, null, null, operator)
       handleNoType(operator)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -954,11 +954,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(out, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, out)
+    beginClassDeclaration(class, null, null, out)
       handleNoType(out)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -970,11 +970,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'part' as a name here., null, {lexeme: part}], part, part)
     handleIdentifier(part, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, part)
+    beginClassDeclaration(class, null, null, part)
       handleNoType(part)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -985,11 +985,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(patch, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, patch)
+    beginClassDeclaration(class, null, null, patch)
       handleNoType(patch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1001,11 +1001,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
     handleIdentifier(required, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, required)
+    beginClassDeclaration(class, null, null, required)
       handleNoType(required)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1017,11 +1017,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
     handleIdentifier(rethrow, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, rethrow)
+    beginClassDeclaration(class, null, null, rethrow)
       handleNoType(rethrow)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1033,11 +1033,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
     handleIdentifier(return, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, return)
+    beginClassDeclaration(class, null, null, return)
       handleNoType(return)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1049,11 +1049,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'set' as a name here., null, {lexeme: set}], set, set)
     handleIdentifier(set, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, set)
+    beginClassDeclaration(class, null, null, set)
       handleNoType(set)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1064,11 +1064,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(show, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, show)
+    beginClassDeclaration(class, null, null, show)
       handleNoType(show)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1079,11 +1079,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(source, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, source)
+    beginClassDeclaration(class, null, null, source)
       handleNoType(source)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1095,11 +1095,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'static' as a name here., null, {lexeme: static}], static, static)
     handleIdentifier(static, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, static)
+    beginClassDeclaration(class, null, null, static)
       handleNoType(static)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1111,11 +1111,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
     handleIdentifier(super, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, super)
+    beginClassDeclaration(class, null, null, super)
       handleNoType(super)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1127,11 +1127,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
     handleIdentifier(switch, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, switch)
+    beginClassDeclaration(class, null, null, switch)
       handleNoType(switch)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1142,11 +1142,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(sync, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, sync)
+    beginClassDeclaration(class, null, null, sync)
       handleNoType(sync)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1158,11 +1158,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
     handleIdentifier(this, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, this)
+    beginClassDeclaration(class, null, null, this)
       handleNoType(this)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1174,11 +1174,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
     handleIdentifier(throw, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, throw)
+    beginClassDeclaration(class, null, null, throw)
       handleNoType(throw)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1190,11 +1190,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
     handleIdentifier(true, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, true)
+    beginClassDeclaration(class, null, null, true)
       handleNoType(true)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1206,11 +1206,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
     handleIdentifier(try, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, try)
+    beginClassDeclaration(class, null, null, try)
       handleNoType(try)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1222,11 +1222,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'typedef' as a name here., null, {lexeme: typedef}], typedef, typedef)
     handleIdentifier(typedef, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, typedef)
+    beginClassDeclaration(class, null, null, typedef)
       handleNoType(typedef)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1238,11 +1238,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
     handleIdentifier(var, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, var)
+    beginClassDeclaration(class, null, null, var)
       handleNoType(var)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1254,11 +1254,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
     handleIdentifier(void, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, void)
+    beginClassDeclaration(class, null, null, void)
       handleNoType(void)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1270,11 +1270,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
     handleIdentifier(while, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, while)
+    beginClassDeclaration(class, null, null, while)
       handleNoType(while)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1286,11 +1286,11 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
     handleIdentifier(with, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, with)
+    beginClassDeclaration(class, null, null, with)
       handleNoType(with)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -1301,11 +1301,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(yield, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, yield)
+    beginClassDeclaration(class, null, null, yield)
       handleNoType(yield)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
index 395b3c1..6c9c866 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
@@ -6,25 +6,25 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(abstract, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'abstract' as a name here., null, {lexeme: abstract}], abstract, abstract)
           listener: handleIdentifier(abstract, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, abstract)
+        listener: beginClassDeclaration(class, null, null, abstract)
         parseClass(abstract, class, class, abstract)
           parseClassHeaderOpt(abstract, class, class)
             parseClassExtendsOpt(abstract)
               listener: handleNoType(abstract)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(abstract)
+            parseClassWithClauseOpt(abstract)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(abstract)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(abstract)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(abstract, DeclarationKind.Class, abstract)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -36,25 +36,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(as, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'as' as a name here., null, {lexeme: as}], as, as)
           listener: handleIdentifier(as, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, as)
+        listener: beginClassDeclaration(class, null, null, as)
         parseClass(as, class, class, as)
           parseClassHeaderOpt(as, class, class)
             parseClassExtendsOpt(as)
               listener: handleNoType(as)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(as)
+            parseClassWithClauseOpt(as)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(as)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(as)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(as, DeclarationKind.Class, as)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -66,25 +66,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(assert, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
           listener: handleIdentifier(assert, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, assert)
+        listener: beginClassDeclaration(class, null, null, assert)
         parseClass(assert, class, class, assert)
           parseClassHeaderOpt(assert, class, class)
             parseClassExtendsOpt(assert)
               listener: handleNoType(assert)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(assert)
+            parseClassWithClauseOpt(assert)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(assert)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(assert)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(assert, DeclarationKind.Class, assert)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -96,23 +96,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(async, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, async)
+        listener: beginClassDeclaration(class, null, null, async)
         parseClass(async, class, class, async)
           parseClassHeaderOpt(async, class, class)
             parseClassExtendsOpt(async)
               listener: handleNoType(async)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(async)
+            parseClassWithClauseOpt(async)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(async)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(async)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(async, DeclarationKind.Class, async)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -124,23 +124,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(await, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, await)
+        listener: beginClassDeclaration(class, null, null, await)
         parseClass(await, class, class, await)
           parseClassHeaderOpt(await, class, class)
             parseClassExtendsOpt(await)
               listener: handleNoType(await)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(await)
+            parseClassWithClauseOpt(await)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(await)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(await)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(await, DeclarationKind.Class, await)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -152,25 +152,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(break, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
           listener: handleIdentifier(break, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, break)
+        listener: beginClassDeclaration(class, null, null, break)
         parseClass(break, class, class, break)
           parseClassHeaderOpt(break, class, class)
             parseClassExtendsOpt(break)
               listener: handleNoType(break)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(break)
+            parseClassWithClauseOpt(break)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(break)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(break)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(break, DeclarationKind.Class, break)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -182,25 +182,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(case, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
           listener: handleIdentifier(case, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, case)
+        listener: beginClassDeclaration(class, null, null, case)
         parseClass(case, class, class, case)
           parseClassHeaderOpt(case, class, class)
             parseClassExtendsOpt(case)
               listener: handleNoType(case)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(case)
+            parseClassWithClauseOpt(case)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(case)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(case)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(case, DeclarationKind.Class, case)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -212,25 +212,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(catch, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
           listener: handleIdentifier(catch, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, catch)
+        listener: beginClassDeclaration(class, null, null, catch)
         parseClass(catch, class, class, catch)
           parseClassHeaderOpt(catch, class, class)
             parseClassExtendsOpt(catch)
               listener: handleNoType(catch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(catch)
+            parseClassWithClauseOpt(catch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(catch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(catch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(catch, DeclarationKind.Class, catch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -242,25 +242,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(class, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
           listener: handleIdentifier(class, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, class)
+        listener: beginClassDeclaration(class, null, null, class)
         parseClass(class, class, class, class)
           parseClassHeaderOpt(class, class, class)
             parseClassExtendsOpt(class)
               listener: handleNoType(class)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(class)
+            parseClassWithClauseOpt(class)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(class)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(class)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(class, DeclarationKind.Class, class)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -272,25 +272,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(const, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
           listener: handleIdentifier(const, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, const)
+        listener: beginClassDeclaration(class, null, null, const)
         parseClass(const, class, class, const)
           parseClassHeaderOpt(const, class, class)
             parseClassExtendsOpt(const)
               listener: handleNoType(const)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(const)
+            parseClassWithClauseOpt(const)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(const)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(const)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(const, DeclarationKind.Class, const)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -302,25 +302,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(continue, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
           listener: handleIdentifier(continue, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, continue)
+        listener: beginClassDeclaration(class, null, null, continue)
         parseClass(continue, class, class, continue)
           parseClassHeaderOpt(continue, class, class)
             parseClassExtendsOpt(continue)
               listener: handleNoType(continue)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(continue)
+            parseClassWithClauseOpt(continue)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(continue)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(continue)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(continue, DeclarationKind.Class, continue)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -332,25 +332,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(covariant, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'covariant' as a name here., null, {lexeme: covariant}], covariant, covariant)
           listener: handleIdentifier(covariant, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, covariant)
+        listener: beginClassDeclaration(class, null, null, covariant)
         parseClass(covariant, class, class, covariant)
           parseClassHeaderOpt(covariant, class, class)
             parseClassExtendsOpt(covariant)
               listener: handleNoType(covariant)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(covariant)
+            parseClassWithClauseOpt(covariant)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(covariant)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(covariant)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(covariant, DeclarationKind.Class, covariant)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -362,25 +362,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(default, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
           listener: handleIdentifier(default, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, default)
+        listener: beginClassDeclaration(class, null, null, default)
         parseClass(default, class, class, default)
           parseClassHeaderOpt(default, class, class)
             parseClassExtendsOpt(default)
               listener: handleNoType(default)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(default)
+            parseClassWithClauseOpt(default)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(default)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(default)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(default, DeclarationKind.Class, default)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -392,25 +392,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(deferred, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'deferred' as a name here., null, {lexeme: deferred}], deferred, deferred)
           listener: handleIdentifier(deferred, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, deferred)
+        listener: beginClassDeclaration(class, null, null, deferred)
         parseClass(deferred, class, class, deferred)
           parseClassHeaderOpt(deferred, class, class)
             parseClassExtendsOpt(deferred)
               listener: handleNoType(deferred)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(deferred)
+            parseClassWithClauseOpt(deferred)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(deferred)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(deferred)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(deferred, DeclarationKind.Class, deferred)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -422,25 +422,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(do, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
           listener: handleIdentifier(do, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, do)
+        listener: beginClassDeclaration(class, null, null, do)
         parseClass(do, class, class, do)
           parseClassHeaderOpt(do, class, class)
             parseClassExtendsOpt(do)
               listener: handleNoType(do)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(do)
+            parseClassWithClauseOpt(do)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(do)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(do)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(do, DeclarationKind.Class, do)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -452,25 +452,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(dynamic, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'dynamic' as a name here., null, {lexeme: dynamic}], dynamic, dynamic)
           listener: handleIdentifier(dynamic, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, dynamic)
+        listener: beginClassDeclaration(class, null, null, dynamic)
         parseClass(dynamic, class, class, dynamic)
           parseClassHeaderOpt(dynamic, class, class)
             parseClassExtendsOpt(dynamic)
               listener: handleNoType(dynamic)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(dynamic)
+            parseClassWithClauseOpt(dynamic)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(dynamic)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(dynamic)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(dynamic, DeclarationKind.Class, dynamic)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -482,25 +482,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(else, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
           listener: handleIdentifier(else, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, else)
+        listener: beginClassDeclaration(class, null, null, else)
         parseClass(else, class, class, else)
           parseClassHeaderOpt(else, class, class)
             parseClassExtendsOpt(else)
               listener: handleNoType(else)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(else)
+            parseClassWithClauseOpt(else)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(else)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(else)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(else, DeclarationKind.Class, else)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -512,25 +512,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(enum, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
           listener: handleIdentifier(enum, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, enum)
+        listener: beginClassDeclaration(class, null, null, enum)
         parseClass(enum, class, class, enum)
           parseClassHeaderOpt(enum, class, class)
             parseClassExtendsOpt(enum)
               listener: handleNoType(enum)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(enum)
+            parseClassWithClauseOpt(enum)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(enum)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(enum)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(enum, DeclarationKind.Class, enum)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -542,25 +542,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(export, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'export' as a name here., null, {lexeme: export}], export, export)
           listener: handleIdentifier(export, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, export)
+        listener: beginClassDeclaration(class, null, null, export)
         parseClass(export, class, class, export)
           parseClassHeaderOpt(export, class, class)
             parseClassExtendsOpt(export)
               listener: handleNoType(export)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(export)
+            parseClassWithClauseOpt(export)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(export)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(export)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(export, DeclarationKind.Class, export)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -572,25 +572,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(extends, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
           listener: handleIdentifier(extends, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, extends)
+        listener: beginClassDeclaration(class, null, null, extends)
         parseClass(extends, class, class, extends)
           parseClassHeaderOpt(extends, class, class)
             parseClassExtendsOpt(extends)
               listener: handleNoType(extends)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(extends)
+            parseClassWithClauseOpt(extends)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(extends)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(extends)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(extends, DeclarationKind.Class, extends)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -602,25 +602,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(extension, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'extension' as a name here., null, {lexeme: extension}], extension, extension)
           listener: handleIdentifier(extension, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, extension)
+        listener: beginClassDeclaration(class, null, null, extension)
         parseClass(extension, class, class, extension)
           parseClassHeaderOpt(extension, class, class)
             parseClassExtendsOpt(extension)
               listener: handleNoType(extension)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(extension)
+            parseClassWithClauseOpt(extension)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(extension)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(extension)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(extension, DeclarationKind.Class, extension)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -632,25 +632,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(external, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'external' as a name here., null, {lexeme: external}], external, external)
           listener: handleIdentifier(external, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, external)
+        listener: beginClassDeclaration(class, null, null, external)
         parseClass(external, class, class, external)
           parseClassHeaderOpt(external, class, class)
             parseClassExtendsOpt(external)
               listener: handleNoType(external)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(external)
+            parseClassWithClauseOpt(external)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(external)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(external)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(external, DeclarationKind.Class, external)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -662,25 +662,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(factory, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'factory' as a name here., null, {lexeme: factory}], factory, factory)
           listener: handleIdentifier(factory, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, factory)
+        listener: beginClassDeclaration(class, null, null, factory)
         parseClass(factory, class, class, factory)
           parseClassHeaderOpt(factory, class, class)
             parseClassExtendsOpt(factory)
               listener: handleNoType(factory)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(factory)
+            parseClassWithClauseOpt(factory)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(factory)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(factory)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(factory, DeclarationKind.Class, factory)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -692,25 +692,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(false, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
           listener: handleIdentifier(false, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, false)
+        listener: beginClassDeclaration(class, null, null, false)
         parseClass(false, class, class, false)
           parseClassHeaderOpt(false, class, class)
             parseClassExtendsOpt(false)
               listener: handleNoType(false)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(false)
+            parseClassWithClauseOpt(false)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(false)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(false)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(false, DeclarationKind.Class, false)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -722,25 +722,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(final, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
           listener: handleIdentifier(final, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, final)
+        listener: beginClassDeclaration(class, null, null, final)
         parseClass(final, class, class, final)
           parseClassHeaderOpt(final, class, class)
             parseClassExtendsOpt(final)
               listener: handleNoType(final)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(final)
+            parseClassWithClauseOpt(final)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(final)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(final)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(final, DeclarationKind.Class, final)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -752,25 +752,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(finally, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
           listener: handleIdentifier(finally, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, finally)
+        listener: beginClassDeclaration(class, null, null, finally)
         parseClass(finally, class, class, finally)
           parseClassHeaderOpt(finally, class, class)
             parseClassExtendsOpt(finally)
               listener: handleNoType(finally)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(finally)
+            parseClassWithClauseOpt(finally)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(finally)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(finally)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(finally, DeclarationKind.Class, finally)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -782,25 +782,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(for, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
           listener: handleIdentifier(for, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, for)
+        listener: beginClassDeclaration(class, null, null, for)
         parseClass(for, class, class, for)
           parseClassHeaderOpt(for, class, class)
             parseClassExtendsOpt(for)
               listener: handleNoType(for)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(for)
+            parseClassWithClauseOpt(for)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(for)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(for)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(for, DeclarationKind.Class, for)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -812,23 +812,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Function, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Function)
+        listener: beginClassDeclaration(class, null, null, Function)
         parseClass(Function, class, class, Function)
           parseClassHeaderOpt(Function, class, class)
             parseClassExtendsOpt(Function)
               listener: handleNoType(Function)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Function)
+            parseClassWithClauseOpt(Function)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Function)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Function)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Function, DeclarationKind.Class, Function)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -840,25 +840,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(get, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'get' as a name here., null, {lexeme: get}], get, get)
           listener: handleIdentifier(get, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, get)
+        listener: beginClassDeclaration(class, null, null, get)
         parseClass(get, class, class, get)
           parseClassHeaderOpt(get, class, class)
             parseClassExtendsOpt(get)
               listener: handleNoType(get)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(get)
+            parseClassWithClauseOpt(get)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(get)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(get)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(get, DeclarationKind.Class, get)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -870,23 +870,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(hide, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, hide)
+        listener: beginClassDeclaration(class, null, null, hide)
         parseClass(hide, class, class, hide)
           parseClassHeaderOpt(hide, class, class)
             parseClassExtendsOpt(hide)
               listener: handleNoType(hide)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(hide)
+            parseClassWithClauseOpt(hide)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(hide)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(hide)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(hide, DeclarationKind.Class, hide)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -898,25 +898,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(if, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
           listener: handleIdentifier(if, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, if)
+        listener: beginClassDeclaration(class, null, null, if)
         parseClass(if, class, class, if)
           parseClassHeaderOpt(if, class, class)
             parseClassExtendsOpt(if)
               listener: handleNoType(if)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(if)
+            parseClassWithClauseOpt(if)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(if)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(if)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(if, DeclarationKind.Class, if)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -928,25 +928,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(implements, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'implements' as a name here., null, {lexeme: implements}], implements, implements)
           listener: handleIdentifier(implements, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, implements)
+        listener: beginClassDeclaration(class, null, null, implements)
         parseClass(implements, class, class, implements)
           parseClassHeaderOpt(implements, class, class)
             parseClassExtendsOpt(implements)
               listener: handleNoType(implements)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(implements)
+            parseClassWithClauseOpt(implements)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(implements)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(implements)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(implements, DeclarationKind.Class, implements)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -958,25 +958,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(import, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'import' as a name here., null, {lexeme: import}], import, import)
           listener: handleIdentifier(import, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, import)
+        listener: beginClassDeclaration(class, null, null, import)
         parseClass(import, class, class, import)
           parseClassHeaderOpt(import, class, class)
             parseClassExtendsOpt(import)
               listener: handleNoType(import)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(import)
+            parseClassWithClauseOpt(import)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(import)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(import)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(import, DeclarationKind.Class, import)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -988,25 +988,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(in, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
           listener: handleIdentifier(in, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, in)
+        listener: beginClassDeclaration(class, null, null, in)
         parseClass(in, class, class, in)
           parseClassHeaderOpt(in, class, class)
             parseClassExtendsOpt(in)
               listener: handleNoType(in)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(in)
+            parseClassWithClauseOpt(in)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(in)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(in)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(in, DeclarationKind.Class, in)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1018,23 +1018,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(inout, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, inout)
+        listener: beginClassDeclaration(class, null, null, inout)
         parseClass(inout, class, class, inout)
           parseClassHeaderOpt(inout, class, class)
             parseClassExtendsOpt(inout)
               listener: handleNoType(inout)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(inout)
+            parseClassWithClauseOpt(inout)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(inout)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(inout)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(inout, DeclarationKind.Class, inout)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1046,25 +1046,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(interface, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'interface' as a name here., null, {lexeme: interface}], interface, interface)
           listener: handleIdentifier(interface, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, interface)
+        listener: beginClassDeclaration(class, null, null, interface)
         parseClass(interface, class, class, interface)
           parseClassHeaderOpt(interface, class, class)
             parseClassExtendsOpt(interface)
               listener: handleNoType(interface)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(interface)
+            parseClassWithClauseOpt(interface)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(interface)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(interface)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(interface, DeclarationKind.Class, interface)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1076,25 +1076,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(is, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
           listener: handleIdentifier(is, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, is)
+        listener: beginClassDeclaration(class, null, null, is)
         parseClass(is, class, class, is)
           parseClassHeaderOpt(is, class, class)
             parseClassExtendsOpt(is)
               listener: handleNoType(is)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(is)
+            parseClassWithClauseOpt(is)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(is)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(is)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(is, DeclarationKind.Class, is)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1106,25 +1106,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(late, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
           listener: handleIdentifier(late, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, late)
+        listener: beginClassDeclaration(class, null, null, late)
         parseClass(late, class, class, late)
           parseClassHeaderOpt(late, class, class)
             parseClassExtendsOpt(late)
               listener: handleNoType(late)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(late)
+            parseClassWithClauseOpt(late)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(late)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(late)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(late, DeclarationKind.Class, late)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1136,25 +1136,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(library, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'library' as a name here., null, {lexeme: library}], library, library)
           listener: handleIdentifier(library, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, library)
+        listener: beginClassDeclaration(class, null, null, library)
         parseClass(library, class, class, library)
           parseClassHeaderOpt(library, class, class)
             parseClassExtendsOpt(library)
               listener: handleNoType(library)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(library)
+            parseClassWithClauseOpt(library)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(library)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(library)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(library, DeclarationKind.Class, library)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1166,25 +1166,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(mixin, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'mixin' as a name here., null, {lexeme: mixin}], mixin, mixin)
           listener: handleIdentifier(mixin, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, mixin)
+        listener: beginClassDeclaration(class, null, null, mixin)
         parseClass(mixin, class, class, mixin)
           parseClassHeaderOpt(mixin, class, class)
             parseClassExtendsOpt(mixin)
               listener: handleNoType(mixin)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(mixin)
+            parseClassWithClauseOpt(mixin)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(mixin)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(mixin)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(mixin, DeclarationKind.Class, mixin)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1196,23 +1196,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(native, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, native)
+        listener: beginClassDeclaration(class, null, null, native)
         parseClass(native, class, class, native)
           parseClassHeaderOpt(native, class, class)
             parseClassExtendsOpt(native)
               listener: handleNoType(native)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(native)
+            parseClassWithClauseOpt(native)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(native)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(native)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(native, DeclarationKind.Class, native)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1224,25 +1224,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(new, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
           listener: handleIdentifier(new, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, new)
+        listener: beginClassDeclaration(class, null, null, new)
         parseClass(new, class, class, new)
           parseClassHeaderOpt(new, class, class)
             parseClassExtendsOpt(new)
               listener: handleNoType(new)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(new)
+            parseClassWithClauseOpt(new)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(new)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(new)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(new, DeclarationKind.Class, new)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1254,25 +1254,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(null, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
           listener: handleIdentifier(null, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, null)
+        listener: beginClassDeclaration(class, null, null, null)
         parseClass(null, class, class, null)
           parseClassHeaderOpt(null, class, class)
             parseClassExtendsOpt(null)
               listener: handleNoType(null)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(null)
+            parseClassWithClauseOpt(null)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(null)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(null)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(null, DeclarationKind.Class, null)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1284,23 +1284,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(of, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, of)
+        listener: beginClassDeclaration(class, null, null, of)
         parseClass(of, class, class, of)
           parseClassHeaderOpt(of, class, class)
             parseClassExtendsOpt(of)
               listener: handleNoType(of)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(of)
+            parseClassWithClauseOpt(of)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(of)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(of)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(of, DeclarationKind.Class, of)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1312,23 +1312,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(on, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, on)
+        listener: beginClassDeclaration(class, null, null, on)
         parseClass(on, class, class, on)
           parseClassHeaderOpt(on, class, class)
             parseClassExtendsOpt(on)
               listener: handleNoType(on)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(on)
+            parseClassWithClauseOpt(on)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(on)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(on)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(on, DeclarationKind.Class, on)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1340,25 +1340,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(operator, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
           listener: handleIdentifier(operator, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, operator)
+        listener: beginClassDeclaration(class, null, null, operator)
         parseClass(operator, class, class, operator)
           parseClassHeaderOpt(operator, class, class)
             parseClassExtendsOpt(operator)
               listener: handleNoType(operator)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(operator)
+            parseClassWithClauseOpt(operator)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(operator)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(operator)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(operator, DeclarationKind.Class, operator)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1370,23 +1370,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(out, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, out)
+        listener: beginClassDeclaration(class, null, null, out)
         parseClass(out, class, class, out)
           parseClassHeaderOpt(out, class, class)
             parseClassExtendsOpt(out)
               listener: handleNoType(out)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(out)
+            parseClassWithClauseOpt(out)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(out)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(out)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(out, DeclarationKind.Class, out)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1398,25 +1398,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(part, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'part' as a name here., null, {lexeme: part}], part, part)
           listener: handleIdentifier(part, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, part)
+        listener: beginClassDeclaration(class, null, null, part)
         parseClass(part, class, class, part)
           parseClassHeaderOpt(part, class, class)
             parseClassExtendsOpt(part)
               listener: handleNoType(part)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(part)
+            parseClassWithClauseOpt(part)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(part)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(part)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(part, DeclarationKind.Class, part)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1428,23 +1428,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(patch, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, patch)
+        listener: beginClassDeclaration(class, null, null, patch)
         parseClass(patch, class, class, patch)
           parseClassHeaderOpt(patch, class, class)
             parseClassExtendsOpt(patch)
               listener: handleNoType(patch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(patch)
+            parseClassWithClauseOpt(patch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(patch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(patch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(patch, DeclarationKind.Class, patch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1456,25 +1456,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(required, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
           listener: handleIdentifier(required, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, required)
+        listener: beginClassDeclaration(class, null, null, required)
         parseClass(required, class, class, required)
           parseClassHeaderOpt(required, class, class)
             parseClassExtendsOpt(required)
               listener: handleNoType(required)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(required)
+            parseClassWithClauseOpt(required)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(required)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(required)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(required, DeclarationKind.Class, required)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1486,25 +1486,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(rethrow, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
           listener: handleIdentifier(rethrow, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, rethrow)
+        listener: beginClassDeclaration(class, null, null, rethrow)
         parseClass(rethrow, class, class, rethrow)
           parseClassHeaderOpt(rethrow, class, class)
             parseClassExtendsOpt(rethrow)
               listener: handleNoType(rethrow)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(rethrow)
+            parseClassWithClauseOpt(rethrow)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(rethrow)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(rethrow)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(rethrow, DeclarationKind.Class, rethrow)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1516,25 +1516,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
           listener: handleIdentifier(return, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, return)
+        listener: beginClassDeclaration(class, null, null, return)
         parseClass(return, class, class, return)
           parseClassHeaderOpt(return, class, class)
             parseClassExtendsOpt(return)
               listener: handleNoType(return)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(return)
+            parseClassWithClauseOpt(return)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(return)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(return)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(return, DeclarationKind.Class, return)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1546,25 +1546,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(set, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'set' as a name here., null, {lexeme: set}], set, set)
           listener: handleIdentifier(set, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, set)
+        listener: beginClassDeclaration(class, null, null, set)
         parseClass(set, class, class, set)
           parseClassHeaderOpt(set, class, class)
             parseClassExtendsOpt(set)
               listener: handleNoType(set)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(set)
+            parseClassWithClauseOpt(set)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(set)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(set)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(set, DeclarationKind.Class, set)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1576,23 +1576,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(show, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, show)
+        listener: beginClassDeclaration(class, null, null, show)
         parseClass(show, class, class, show)
           parseClassHeaderOpt(show, class, class)
             parseClassExtendsOpt(show)
               listener: handleNoType(show)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(show)
+            parseClassWithClauseOpt(show)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(show)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(show)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(show, DeclarationKind.Class, show)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1604,23 +1604,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(source, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, source)
+        listener: beginClassDeclaration(class, null, null, source)
         parseClass(source, class, class, source)
           parseClassHeaderOpt(source, class, class)
             parseClassExtendsOpt(source)
               listener: handleNoType(source)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(source)
+            parseClassWithClauseOpt(source)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(source)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(source)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(source, DeclarationKind.Class, source)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1632,25 +1632,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(static, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'static' as a name here., null, {lexeme: static}], static, static)
           listener: handleIdentifier(static, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, static)
+        listener: beginClassDeclaration(class, null, null, static)
         parseClass(static, class, class, static)
           parseClassHeaderOpt(static, class, class)
             parseClassExtendsOpt(static)
               listener: handleNoType(static)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(static)
+            parseClassWithClauseOpt(static)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(static)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(static)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(static, DeclarationKind.Class, static)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1662,25 +1662,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(super, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
           listener: handleIdentifier(super, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, super)
+        listener: beginClassDeclaration(class, null, null, super)
         parseClass(super, class, class, super)
           parseClassHeaderOpt(super, class, class)
             parseClassExtendsOpt(super)
               listener: handleNoType(super)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(super)
+            parseClassWithClauseOpt(super)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(super)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(super)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(super, DeclarationKind.Class, super)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1692,25 +1692,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(switch, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
           listener: handleIdentifier(switch, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, switch)
+        listener: beginClassDeclaration(class, null, null, switch)
         parseClass(switch, class, class, switch)
           parseClassHeaderOpt(switch, class, class)
             parseClassExtendsOpt(switch)
               listener: handleNoType(switch)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(switch)
+            parseClassWithClauseOpt(switch)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(switch)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(switch)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(switch, DeclarationKind.Class, switch)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1722,23 +1722,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(sync, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, sync)
+        listener: beginClassDeclaration(class, null, null, sync)
         parseClass(sync, class, class, sync)
           parseClassHeaderOpt(sync, class, class)
             parseClassExtendsOpt(sync)
               listener: handleNoType(sync)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(sync)
+            parseClassWithClauseOpt(sync)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(sync)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(sync)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(sync, DeclarationKind.Class, sync)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1750,25 +1750,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(this, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
           listener: handleIdentifier(this, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, this)
+        listener: beginClassDeclaration(class, null, null, this)
         parseClass(this, class, class, this)
           parseClassHeaderOpt(this, class, class)
             parseClassExtendsOpt(this)
               listener: handleNoType(this)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(this)
+            parseClassWithClauseOpt(this)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(this)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(this)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(this, DeclarationKind.Class, this)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1780,25 +1780,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(throw, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
           listener: handleIdentifier(throw, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, throw)
+        listener: beginClassDeclaration(class, null, null, throw)
         parseClass(throw, class, class, throw)
           parseClassHeaderOpt(throw, class, class)
             parseClassExtendsOpt(throw)
               listener: handleNoType(throw)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(throw)
+            parseClassWithClauseOpt(throw)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(throw)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(throw)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(throw, DeclarationKind.Class, throw)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1810,25 +1810,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(true, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
           listener: handleIdentifier(true, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, true)
+        listener: beginClassDeclaration(class, null, null, true)
         parseClass(true, class, class, true)
           parseClassHeaderOpt(true, class, class)
             parseClassExtendsOpt(true)
               listener: handleNoType(true)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(true)
+            parseClassWithClauseOpt(true)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(true)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(true)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(true, DeclarationKind.Class, true)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1840,25 +1840,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(try, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
           listener: handleIdentifier(try, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, try)
+        listener: beginClassDeclaration(class, null, null, try)
         parseClass(try, class, class, try)
           parseClassHeaderOpt(try, class, class)
             parseClassExtendsOpt(try)
               listener: handleNoType(try)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(try)
+            parseClassWithClauseOpt(try)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(try)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(try)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(try, DeclarationKind.Class, try)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1870,25 +1870,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(typedef, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'typedef' as a name here., null, {lexeme: typedef}], typedef, typedef)
           listener: handleIdentifier(typedef, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, typedef)
+        listener: beginClassDeclaration(class, null, null, typedef)
         parseClass(typedef, class, class, typedef)
           parseClassHeaderOpt(typedef, class, class)
             parseClassExtendsOpt(typedef)
               listener: handleNoType(typedef)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(typedef)
+            parseClassWithClauseOpt(typedef)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(typedef)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(typedef)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(typedef, DeclarationKind.Class, typedef)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1900,25 +1900,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(var, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
           listener: handleIdentifier(var, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, var)
+        listener: beginClassDeclaration(class, null, null, var)
         parseClass(var, class, class, var)
           parseClassHeaderOpt(var, class, class)
             parseClassExtendsOpt(var)
               listener: handleNoType(var)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(var)
+            parseClassWithClauseOpt(var)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(var)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(var)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(var, DeclarationKind.Class, var)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1930,25 +1930,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(void, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
           listener: handleIdentifier(void, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, void)
+        listener: beginClassDeclaration(class, null, null, void)
         parseClass(void, class, class, void)
           parseClassHeaderOpt(void, class, class)
             parseClassExtendsOpt(void)
               listener: handleNoType(void)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(void)
+            parseClassWithClauseOpt(void)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(void)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(void)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(void, DeclarationKind.Class, void)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1960,25 +1960,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(while, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
           listener: handleIdentifier(while, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, while)
+        listener: beginClassDeclaration(class, null, null, while)
         parseClass(while, class, class, while)
           parseClassHeaderOpt(while, class, class)
             parseClassExtendsOpt(while)
               listener: handleNoType(while)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(while)
+            parseClassWithClauseOpt(while)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(while)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(while)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(while, DeclarationKind.Class, while)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -1990,25 +1990,25 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
           listener: handleIdentifier(with, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, with)
+        listener: beginClassDeclaration(class, null, null, with)
         parseClass(with, class, class, with)
           parseClassHeaderOpt(with, class, class)
             parseClassExtendsOpt(with)
               listener: handleNoType(with)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(with)
+            parseClassWithClauseOpt(with)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(with)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(with)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(with, DeclarationKind.Class, with)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -2020,23 +2020,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(yield, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, yield)
+        listener: beginClassDeclaration(class, null, null, yield)
         parseClass(yield, class, class, yield)
           parseClassHeaderOpt(yield, class, class)
             parseClassExtendsOpt(yield)
               listener: handleNoType(yield)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(yield)
+            parseClassWithClauseOpt(yield)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(yield)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(yield)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(yield, DeclarationKind.Class, yield)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.expect
index ddf5505..b29582c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.expect
@@ -227,7 +227,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'abstract' as a name here., null, {lexeme: abstract}], abstract, abstract)
     handleIdentifier(abstract, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, abstract)
+    beginNamedMixinApplication(class, null, null, abstract)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -245,7 +245,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'as' as a name here., null, {lexeme: as}], as, as)
     handleIdentifier(as, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, as)
+    beginNamedMixinApplication(class, null, null, as)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -263,7 +263,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
     handleIdentifier(assert, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, assert)
+    beginNamedMixinApplication(class, null, null, assert)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -280,7 +280,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(async, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, async)
+    beginNamedMixinApplication(class, null, null, async)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -297,7 +297,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(await, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, await)
+    beginNamedMixinApplication(class, null, null, await)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -315,7 +315,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
     handleIdentifier(break, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, break)
+    beginNamedMixinApplication(class, null, null, break)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -333,7 +333,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
     handleIdentifier(case, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, case)
+    beginNamedMixinApplication(class, null, null, case)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -351,7 +351,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
     handleIdentifier(catch, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, catch)
+    beginNamedMixinApplication(class, null, null, catch)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -369,7 +369,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
     handleIdentifier(class, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, class)
+    beginNamedMixinApplication(class, null, null, class)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -387,7 +387,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
     handleIdentifier(const, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, const)
+    beginNamedMixinApplication(class, null, null, const)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -405,7 +405,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
     handleIdentifier(continue, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, continue)
+    beginNamedMixinApplication(class, null, null, continue)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -423,7 +423,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'covariant' as a name here., null, {lexeme: covariant}], covariant, covariant)
     handleIdentifier(covariant, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, covariant)
+    beginNamedMixinApplication(class, null, null, covariant)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -441,7 +441,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
     handleIdentifier(default, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, default)
+    beginNamedMixinApplication(class, null, null, default)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -459,7 +459,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'deferred' as a name here., null, {lexeme: deferred}], deferred, deferred)
     handleIdentifier(deferred, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, deferred)
+    beginNamedMixinApplication(class, null, null, deferred)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -477,7 +477,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
     handleIdentifier(do, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, do)
+    beginNamedMixinApplication(class, null, null, do)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -495,7 +495,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'dynamic' as a name here., null, {lexeme: dynamic}], dynamic, dynamic)
     handleIdentifier(dynamic, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, dynamic)
+    beginNamedMixinApplication(class, null, null, dynamic)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -513,7 +513,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
     handleIdentifier(else, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, else)
+    beginNamedMixinApplication(class, null, null, else)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -531,7 +531,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
     handleIdentifier(enum, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, enum)
+    beginNamedMixinApplication(class, null, null, enum)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -549,7 +549,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'export' as a name here., null, {lexeme: export}], export, export)
     handleIdentifier(export, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, export)
+    beginNamedMixinApplication(class, null, null, export)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -567,7 +567,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
     handleIdentifier(extends, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, extends)
+    beginNamedMixinApplication(class, null, null, extends)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -585,7 +585,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'extension' as a name here., null, {lexeme: extension}], extension, extension)
     handleIdentifier(extension, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, extension)
+    beginNamedMixinApplication(class, null, null, extension)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -603,7 +603,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'external' as a name here., null, {lexeme: external}], external, external)
     handleIdentifier(external, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, external)
+    beginNamedMixinApplication(class, null, null, external)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -621,7 +621,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'factory' as a name here., null, {lexeme: factory}], factory, factory)
     handleIdentifier(factory, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, factory)
+    beginNamedMixinApplication(class, null, null, factory)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -639,7 +639,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
     handleIdentifier(false, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, false)
+    beginNamedMixinApplication(class, null, null, false)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -657,7 +657,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
     handleIdentifier(final, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, final)
+    beginNamedMixinApplication(class, null, null, final)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -675,7 +675,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
     handleIdentifier(finally, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, finally)
+    beginNamedMixinApplication(class, null, null, finally)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -693,7 +693,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
     handleIdentifier(for, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, for)
+    beginNamedMixinApplication(class, null, null, for)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -710,7 +710,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Function, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, Function)
+    beginNamedMixinApplication(class, null, null, Function)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -728,7 +728,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'get' as a name here., null, {lexeme: get}], get, get)
     handleIdentifier(get, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, get)
+    beginNamedMixinApplication(class, null, null, get)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -745,7 +745,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(hide, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, hide)
+    beginNamedMixinApplication(class, null, null, hide)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -763,7 +763,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
     handleIdentifier(if, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, if)
+    beginNamedMixinApplication(class, null, null, if)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -781,7 +781,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'implements' as a name here., null, {lexeme: implements}], implements, implements)
     handleIdentifier(implements, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, implements)
+    beginNamedMixinApplication(class, null, null, implements)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -799,7 +799,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'import' as a name here., null, {lexeme: import}], import, import)
     handleIdentifier(import, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, import)
+    beginNamedMixinApplication(class, null, null, import)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -817,7 +817,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
     handleIdentifier(in, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, in)
+    beginNamedMixinApplication(class, null, null, in)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -834,7 +834,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(inout, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, inout)
+    beginNamedMixinApplication(class, null, null, inout)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -852,7 +852,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'interface' as a name here., null, {lexeme: interface}], interface, interface)
     handleIdentifier(interface, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, interface)
+    beginNamedMixinApplication(class, null, null, interface)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -870,7 +870,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
     handleIdentifier(is, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, is)
+    beginNamedMixinApplication(class, null, null, is)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -888,7 +888,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
     handleIdentifier(late, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, late)
+    beginNamedMixinApplication(class, null, null, late)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -906,7 +906,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'library' as a name here., null, {lexeme: library}], library, library)
     handleIdentifier(library, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, library)
+    beginNamedMixinApplication(class, null, null, library)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -924,7 +924,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'mixin' as a name here., null, {lexeme: mixin}], mixin, mixin)
     handleIdentifier(mixin, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, mixin)
+    beginNamedMixinApplication(class, null, null, mixin)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -941,7 +941,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(native, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, native)
+    beginNamedMixinApplication(class, null, null, native)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -959,7 +959,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
     handleIdentifier(new, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, new)
+    beginNamedMixinApplication(class, null, null, new)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -977,7 +977,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
     handleIdentifier(null, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, null)
+    beginNamedMixinApplication(class, null, null, null)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -994,7 +994,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(of, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, of)
+    beginNamedMixinApplication(class, null, null, of)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1011,7 +1011,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(on, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, on)
+    beginNamedMixinApplication(class, null, null, on)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1029,7 +1029,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
     handleIdentifier(operator, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, operator)
+    beginNamedMixinApplication(class, null, null, operator)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1046,7 +1046,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(out, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, out)
+    beginNamedMixinApplication(class, null, null, out)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1064,7 +1064,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'part' as a name here., null, {lexeme: part}], part, part)
     handleIdentifier(part, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, part)
+    beginNamedMixinApplication(class, null, null, part)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1081,7 +1081,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(patch, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, patch)
+    beginNamedMixinApplication(class, null, null, patch)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1099,7 +1099,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
     handleIdentifier(required, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, required)
+    beginNamedMixinApplication(class, null, null, required)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1117,7 +1117,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
     handleIdentifier(rethrow, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, rethrow)
+    beginNamedMixinApplication(class, null, null, rethrow)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1135,7 +1135,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
     handleIdentifier(return, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, return)
+    beginNamedMixinApplication(class, null, null, return)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1153,7 +1153,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'set' as a name here., null, {lexeme: set}], set, set)
     handleIdentifier(set, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, set)
+    beginNamedMixinApplication(class, null, null, set)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1170,7 +1170,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(show, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, show)
+    beginNamedMixinApplication(class, null, null, show)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1187,7 +1187,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(source, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, source)
+    beginNamedMixinApplication(class, null, null, source)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1205,7 +1205,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'static' as a name here., null, {lexeme: static}], static, static)
     handleIdentifier(static, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, static)
+    beginNamedMixinApplication(class, null, null, static)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1223,7 +1223,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
     handleIdentifier(super, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, super)
+    beginNamedMixinApplication(class, null, null, super)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1241,7 +1241,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
     handleIdentifier(switch, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, switch)
+    beginNamedMixinApplication(class, null, null, switch)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1258,7 +1258,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(sync, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, sync)
+    beginNamedMixinApplication(class, null, null, sync)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1276,7 +1276,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
     handleIdentifier(this, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, this)
+    beginNamedMixinApplication(class, null, null, this)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1294,7 +1294,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
     handleIdentifier(throw, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, throw)
+    beginNamedMixinApplication(class, null, null, throw)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1312,7 +1312,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
     handleIdentifier(true, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, true)
+    beginNamedMixinApplication(class, null, null, true)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1330,7 +1330,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
     handleIdentifier(try, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, try)
+    beginNamedMixinApplication(class, null, null, try)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1348,7 +1348,7 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'typedef' as a name here., null, {lexeme: typedef}], typedef, typedef)
     handleIdentifier(typedef, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, typedef)
+    beginNamedMixinApplication(class, null, null, typedef)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1366,7 +1366,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
     handleIdentifier(var, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, var)
+    beginNamedMixinApplication(class, null, null, var)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1384,7 +1384,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
     handleIdentifier(void, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, void)
+    beginNamedMixinApplication(class, null, null, void)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1402,7 +1402,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
     handleIdentifier(while, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, while)
+    beginNamedMixinApplication(class, null, null, while)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1420,7 +1420,7 @@
     handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
     handleIdentifier(with, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, with)
+    beginNamedMixinApplication(class, null, null, with)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
@@ -1437,7 +1437,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(yield, classOrMixinDeclaration)
     handleNoTypeVariables(=)
-    beginNamedMixinApplication(class, null, yield)
+    beginNamedMixinApplication(class, null, null, yield)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments(with)
       handleType(A, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.intertwined.expect
index 5e0bb61..732268f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.intertwined.expect
@@ -6,16 +6,16 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(abstract, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'abstract' as a name here., null, {lexeme: abstract}], abstract, abstract)
           listener: handleIdentifier(abstract, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, abstract)
+        listener: beginNamedMixinApplication(class, null, null, abstract)
         parseNamedMixinApplication(abstract, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -35,16 +35,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(as, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'as' as a name here., null, {lexeme: as}], as, as)
           listener: handleIdentifier(as, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, as)
+        listener: beginNamedMixinApplication(class, null, null, as)
         parseNamedMixinApplication(as, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -64,16 +64,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(assert, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
           listener: handleIdentifier(assert, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, assert)
+        listener: beginNamedMixinApplication(class, null, null, assert)
         parseNamedMixinApplication(assert, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -93,14 +93,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(async, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, async)
+        listener: beginNamedMixinApplication(class, null, null, async)
         parseNamedMixinApplication(async, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -120,14 +120,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(await, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, await)
+        listener: beginNamedMixinApplication(class, null, null, await)
         parseNamedMixinApplication(await, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -147,16 +147,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(break, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
           listener: handleIdentifier(break, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, break)
+        listener: beginNamedMixinApplication(class, null, null, break)
         parseNamedMixinApplication(break, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -176,16 +176,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(case, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
           listener: handleIdentifier(case, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, case)
+        listener: beginNamedMixinApplication(class, null, null, case)
         parseNamedMixinApplication(case, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -205,16 +205,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(catch, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
           listener: handleIdentifier(catch, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, catch)
+        listener: beginNamedMixinApplication(class, null, null, catch)
         parseNamedMixinApplication(catch, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -234,16 +234,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(class, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
           listener: handleIdentifier(class, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, class)
+        listener: beginNamedMixinApplication(class, null, null, class)
         parseNamedMixinApplication(class, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -263,16 +263,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(const, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
           listener: handleIdentifier(const, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, const)
+        listener: beginNamedMixinApplication(class, null, null, const)
         parseNamedMixinApplication(const, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -292,16 +292,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(continue, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
           listener: handleIdentifier(continue, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, continue)
+        listener: beginNamedMixinApplication(class, null, null, continue)
         parseNamedMixinApplication(continue, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -321,16 +321,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(covariant, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'covariant' as a name here., null, {lexeme: covariant}], covariant, covariant)
           listener: handleIdentifier(covariant, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, covariant)
+        listener: beginNamedMixinApplication(class, null, null, covariant)
         parseNamedMixinApplication(covariant, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -350,16 +350,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(default, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
           listener: handleIdentifier(default, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, default)
+        listener: beginNamedMixinApplication(class, null, null, default)
         parseNamedMixinApplication(default, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -379,16 +379,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(deferred, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'deferred' as a name here., null, {lexeme: deferred}], deferred, deferred)
           listener: handleIdentifier(deferred, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, deferred)
+        listener: beginNamedMixinApplication(class, null, null, deferred)
         parseNamedMixinApplication(deferred, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -408,16 +408,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(do, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
           listener: handleIdentifier(do, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, do)
+        listener: beginNamedMixinApplication(class, null, null, do)
         parseNamedMixinApplication(do, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -437,16 +437,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(dynamic, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'dynamic' as a name here., null, {lexeme: dynamic}], dynamic, dynamic)
           listener: handleIdentifier(dynamic, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, dynamic)
+        listener: beginNamedMixinApplication(class, null, null, dynamic)
         parseNamedMixinApplication(dynamic, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -466,16 +466,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(else, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
           listener: handleIdentifier(else, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, else)
+        listener: beginNamedMixinApplication(class, null, null, else)
         parseNamedMixinApplication(else, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -495,16 +495,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(enum, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
           listener: handleIdentifier(enum, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, enum)
+        listener: beginNamedMixinApplication(class, null, null, enum)
         parseNamedMixinApplication(enum, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -524,16 +524,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(export, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'export' as a name here., null, {lexeme: export}], export, export)
           listener: handleIdentifier(export, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, export)
+        listener: beginNamedMixinApplication(class, null, null, export)
         parseNamedMixinApplication(export, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -553,16 +553,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(extends, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
           listener: handleIdentifier(extends, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, extends)
+        listener: beginNamedMixinApplication(class, null, null, extends)
         parseNamedMixinApplication(extends, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -582,16 +582,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(extension, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'extension' as a name here., null, {lexeme: extension}], extension, extension)
           listener: handleIdentifier(extension, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, extension)
+        listener: beginNamedMixinApplication(class, null, null, extension)
         parseNamedMixinApplication(extension, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -611,16 +611,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(external, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'external' as a name here., null, {lexeme: external}], external, external)
           listener: handleIdentifier(external, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, external)
+        listener: beginNamedMixinApplication(class, null, null, external)
         parseNamedMixinApplication(external, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -640,16 +640,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(factory, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'factory' as a name here., null, {lexeme: factory}], factory, factory)
           listener: handleIdentifier(factory, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, factory)
+        listener: beginNamedMixinApplication(class, null, null, factory)
         parseNamedMixinApplication(factory, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -669,16 +669,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(false, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
           listener: handleIdentifier(false, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, false)
+        listener: beginNamedMixinApplication(class, null, null, false)
         parseNamedMixinApplication(false, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -698,16 +698,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(final, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
           listener: handleIdentifier(final, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, final)
+        listener: beginNamedMixinApplication(class, null, null, final)
         parseNamedMixinApplication(final, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -727,16 +727,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(finally, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
           listener: handleIdentifier(finally, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, finally)
+        listener: beginNamedMixinApplication(class, null, null, finally)
         parseNamedMixinApplication(finally, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -756,16 +756,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(for, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
           listener: handleIdentifier(for, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, for)
+        listener: beginNamedMixinApplication(class, null, null, for)
         parseNamedMixinApplication(for, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -785,14 +785,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Function, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, Function)
+        listener: beginNamedMixinApplication(class, null, null, Function)
         parseNamedMixinApplication(Function, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -812,16 +812,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(get, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'get' as a name here., null, {lexeme: get}], get, get)
           listener: handleIdentifier(get, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, get)
+        listener: beginNamedMixinApplication(class, null, null, get)
         parseNamedMixinApplication(get, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -841,14 +841,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(hide, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, hide)
+        listener: beginNamedMixinApplication(class, null, null, hide)
         parseNamedMixinApplication(hide, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -868,16 +868,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(if, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
           listener: handleIdentifier(if, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, if)
+        listener: beginNamedMixinApplication(class, null, null, if)
         parseNamedMixinApplication(if, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -897,16 +897,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(implements, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'implements' as a name here., null, {lexeme: implements}], implements, implements)
           listener: handleIdentifier(implements, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, implements)
+        listener: beginNamedMixinApplication(class, null, null, implements)
         parseNamedMixinApplication(implements, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -926,16 +926,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(import, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'import' as a name here., null, {lexeme: import}], import, import)
           listener: handleIdentifier(import, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, import)
+        listener: beginNamedMixinApplication(class, null, null, import)
         parseNamedMixinApplication(import, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -955,16 +955,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(in, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
           listener: handleIdentifier(in, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, in)
+        listener: beginNamedMixinApplication(class, null, null, in)
         parseNamedMixinApplication(in, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -984,14 +984,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(inout, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, inout)
+        listener: beginNamedMixinApplication(class, null, null, inout)
         parseNamedMixinApplication(inout, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1011,16 +1011,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(interface, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'interface' as a name here., null, {lexeme: interface}], interface, interface)
           listener: handleIdentifier(interface, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, interface)
+        listener: beginNamedMixinApplication(class, null, null, interface)
         parseNamedMixinApplication(interface, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1040,16 +1040,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(is, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
           listener: handleIdentifier(is, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, is)
+        listener: beginNamedMixinApplication(class, null, null, is)
         parseNamedMixinApplication(is, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1069,16 +1069,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(late, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
           listener: handleIdentifier(late, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, late)
+        listener: beginNamedMixinApplication(class, null, null, late)
         parseNamedMixinApplication(late, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1098,16 +1098,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(library, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'library' as a name here., null, {lexeme: library}], library, library)
           listener: handleIdentifier(library, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, library)
+        listener: beginNamedMixinApplication(class, null, null, library)
         parseNamedMixinApplication(library, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1127,16 +1127,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(mixin, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'mixin' as a name here., null, {lexeme: mixin}], mixin, mixin)
           listener: handleIdentifier(mixin, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, mixin)
+        listener: beginNamedMixinApplication(class, null, null, mixin)
         parseNamedMixinApplication(mixin, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1156,14 +1156,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(native, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, native)
+        listener: beginNamedMixinApplication(class, null, null, native)
         parseNamedMixinApplication(native, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1183,16 +1183,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(new, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
           listener: handleIdentifier(new, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, new)
+        listener: beginNamedMixinApplication(class, null, null, new)
         parseNamedMixinApplication(new, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1212,16 +1212,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(null, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
           listener: handleIdentifier(null, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, null)
+        listener: beginNamedMixinApplication(class, null, null, null)
         parseNamedMixinApplication(null, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1241,14 +1241,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(of, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, of)
+        listener: beginNamedMixinApplication(class, null, null, of)
         parseNamedMixinApplication(of, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1268,14 +1268,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(on, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, on)
+        listener: beginNamedMixinApplication(class, null, null, on)
         parseNamedMixinApplication(on, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1295,16 +1295,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(operator, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
           listener: handleIdentifier(operator, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, operator)
+        listener: beginNamedMixinApplication(class, null, null, operator)
         parseNamedMixinApplication(operator, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1324,14 +1324,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(out, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, out)
+        listener: beginNamedMixinApplication(class, null, null, out)
         parseNamedMixinApplication(out, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1351,16 +1351,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(part, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'part' as a name here., null, {lexeme: part}], part, part)
           listener: handleIdentifier(part, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, part)
+        listener: beginNamedMixinApplication(class, null, null, part)
         parseNamedMixinApplication(part, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1380,14 +1380,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(patch, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, patch)
+        listener: beginNamedMixinApplication(class, null, null, patch)
         parseNamedMixinApplication(patch, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1407,16 +1407,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(required, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
           listener: handleIdentifier(required, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, required)
+        listener: beginNamedMixinApplication(class, null, null, required)
         parseNamedMixinApplication(required, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1436,16 +1436,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(rethrow, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
           listener: handleIdentifier(rethrow, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, rethrow)
+        listener: beginNamedMixinApplication(class, null, null, rethrow)
         parseNamedMixinApplication(rethrow, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1465,16 +1465,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
           listener: handleIdentifier(return, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, return)
+        listener: beginNamedMixinApplication(class, null, null, return)
         parseNamedMixinApplication(return, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1494,16 +1494,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(set, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'set' as a name here., null, {lexeme: set}], set, set)
           listener: handleIdentifier(set, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, set)
+        listener: beginNamedMixinApplication(class, null, null, set)
         parseNamedMixinApplication(set, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1523,14 +1523,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(show, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, show)
+        listener: beginNamedMixinApplication(class, null, null, show)
         parseNamedMixinApplication(show, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1550,14 +1550,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(source, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, source)
+        listener: beginNamedMixinApplication(class, null, null, source)
         parseNamedMixinApplication(source, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1577,16 +1577,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(static, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'static' as a name here., null, {lexeme: static}], static, static)
           listener: handleIdentifier(static, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, static)
+        listener: beginNamedMixinApplication(class, null, null, static)
         parseNamedMixinApplication(static, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1606,16 +1606,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(super, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
           listener: handleIdentifier(super, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, super)
+        listener: beginNamedMixinApplication(class, null, null, super)
         parseNamedMixinApplication(super, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1635,16 +1635,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(switch, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
           listener: handleIdentifier(switch, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, switch)
+        listener: beginNamedMixinApplication(class, null, null, switch)
         parseNamedMixinApplication(switch, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1664,14 +1664,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(sync, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, sync)
+        listener: beginNamedMixinApplication(class, null, null, sync)
         parseNamedMixinApplication(sync, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1691,16 +1691,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(this, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
           listener: handleIdentifier(this, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, this)
+        listener: beginNamedMixinApplication(class, null, null, this)
         parseNamedMixinApplication(this, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1720,16 +1720,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(throw, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
           listener: handleIdentifier(throw, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, throw)
+        listener: beginNamedMixinApplication(class, null, null, throw)
         parseNamedMixinApplication(throw, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1749,16 +1749,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(true, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
           listener: handleIdentifier(true, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, true)
+        listener: beginNamedMixinApplication(class, null, null, true)
         parseNamedMixinApplication(true, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1778,16 +1778,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(try, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
           listener: handleIdentifier(try, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, try)
+        listener: beginNamedMixinApplication(class, null, null, try)
         parseNamedMixinApplication(try, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1807,16 +1807,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(typedef, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'typedef' as a name here., null, {lexeme: typedef}], typedef, typedef)
           listener: handleIdentifier(typedef, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, typedef)
+        listener: beginNamedMixinApplication(class, null, null, typedef)
         parseNamedMixinApplication(typedef, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1836,16 +1836,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(var, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
           listener: handleIdentifier(var, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, var)
+        listener: beginNamedMixinApplication(class, null, null, var)
         parseNamedMixinApplication(var, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1865,16 +1865,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(void, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
           listener: handleIdentifier(void, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, void)
+        listener: beginNamedMixinApplication(class, null, null, void)
         parseNamedMixinApplication(void, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1894,16 +1894,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(while, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
           listener: handleIdentifier(while, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, while)
+        listener: beginNamedMixinApplication(class, null, null, while)
         parseNamedMixinApplication(while, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1923,16 +1923,16 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
           listener: handleIdentifier(with, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, with)
+        listener: beginNamedMixinApplication(class, null, null, with)
         parseNamedMixinApplication(with, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
@@ -1952,14 +1952,14 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(yield, classOrMixinDeclaration)
         listener: handleNoTypeVariables(=)
-        listener: beginNamedMixinApplication(class, null, yield)
+        listener: beginNamedMixinApplication(class, null, null, yield)
         parseNamedMixinApplication(yield, class, class)
           listener: handleIdentifier(A, typeReference)
           listener: handleNoTypeArguments(with)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
index de863a7..4d447d1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
@@ -20,16 +20,16 @@
     // WARNING: Reporting at eof for .
     handleIdentifier(, classOrMixinDeclaration)
     handleNoTypeVariables()
-    beginClassDeclaration(class, null, )
+    beginClassDeclaration(class, null, null, )
       handleNoType()
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       handleNoType()
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleRecoverClassHeader()
       handleRecoverableError(Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}], , )
       // WARNING: Reporting at eof for .
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
index 6dbf406..64a2d2b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
@@ -6,9 +6,9 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           insertSyntheticIdentifier(class, classOrMixinDeclaration, message: Message[ExpectedIdentifier, Expected an identifier, but got ''., Try inserting an identifier before ''., {lexeme: }], messageOnToken: null)
@@ -18,30 +18,30 @@
             rewriter()
           listener: handleIdentifier(, classOrMixinDeclaration)
         listener: handleNoTypeVariables()
-        listener: beginClassDeclaration(class, null, )
+        listener: beginClassDeclaration(class, null, null, )
         parseClass(, class, class, )
           parseClassHeaderOpt(, class, class)
             parseClassExtendsOpt()
               listener: handleNoType()
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt()
+            parseClassWithClauseOpt()
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt()
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt()
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassHeaderRecovery(, class, class)
             parseClassHeaderOpt(, class, class)
               parseClassExtendsOpt()
-              parseWithClauseOpt()
-              parseClassOrMixinImplementsOpt()
+              parseClassWithClauseOpt()
+              parseClassOrMixinOrEnumImplementsOpt()
             skipUnexpectedTokenOpt(, [extends, with, implements, {])
             parseClassExtendsOpt()
               listener: handleNoType()
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt()
+            parseClassWithClauseOpt()
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt()
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt()
+              listener: handleImplements(null, 0)
             listener: handleRecoverClassHeader()
           ensureBlock(, null, class declaration)
             reportRecoverableError(, Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}])
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
index 2735118..63e8b06 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.expect
@@ -30,11 +30,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -67,11 +67,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(B, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, B)
+    beginClassDeclaration(class, null, null, B)
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(List)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
index fec64a0..08cfe6a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -73,28 +73,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(B, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, B)
+        listener: beginClassDeclaration(class, null, null, B)
         parseClass(B, class, class, B)
           parseClassHeaderOpt(B, class, class)
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, List)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, B)
               parseMetadataStar({)
                 listener: beginMetadataStar(List)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
index 5f9ce60..a9ee40d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.expect
@@ -10,11 +10,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
index e9142c6..4ee602f 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_1.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
index bdef6b4..78cd4a8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
index 9b6493f..f5178bd 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_2.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
index 6e7b413..dad6879 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.expect
@@ -18,11 +18,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
index aa7d85c..058793d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_3.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
index 1e76544..fc06fb1 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.expect
@@ -18,11 +18,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
index 9e3219e..0f37588 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_4.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
index 385f68c..e10973c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.expect
@@ -82,11 +82,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -127,11 +127,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(B, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, B)
+    beginClassDeclaration(class, null, null, B)
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
@@ -199,11 +199,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Stream)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
index de9f8f5..fc2c4c6 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_5.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -83,28 +83,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(B, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, B)
+        listener: beginClassDeclaration(class, null, null, B)
         parseClass(B, class, class, B)
           parseClassHeaderOpt(B, class, class)
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, B)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -141,7 +141,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Stream, ;)
               listener: endMember()
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, B)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, B)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -197,28 +197,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -255,7 +255,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Stream, ;)
               listener: endMember()
             notEofOrValue(}, Stream)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Stream)
                 listener: endMetadataStar(0)
@@ -338,7 +338,7 @@
                 listener: endClassMethod(null, Stream, (, null, })
               listener: endMember()
             notEofOrValue(}, baz)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(baz)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
index eccab19..151c812 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.expect
@@ -10,11 +10,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(stream)
@@ -47,7 +47,7 @@
                 handleType(T, null)
                 handleIdentifier(foo, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -86,7 +86,7 @@
                 handleType(T, null)
                 handleIdentifier(foo, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -118,7 +118,7 @@
                 handleType(T, null)
                 handleIdentifier(foo, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
index d9371ae..4c286fe 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46505_prime_6.crash_dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, stream)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(stream)
                 listener: endMetadataStar(0)
@@ -72,7 +72,7 @@
                         ensureIdentifier(T, formalParameterDeclaration)
                           listener: handleIdentifier(foo, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -87,7 +87,7 @@
                 listener: endClassMethod(null, stream, (, null, })
               listener: endMember()
             notEofOrValue(}, stream2)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, A)
               parseMetadataStar(})
                 listener: beginMetadataStar(stream2)
                 listener: endMetadataStar(0)
@@ -136,7 +136,7 @@
                         ensureIdentifier(T, formalParameterDeclaration)
                           listener: handleIdentifier(foo, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -151,7 +151,7 @@
                 listener: endClassMethod(null, stream2, (, null, })
               listener: endMember()
             notEofOrValue(}, stream3)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, A)
               parseMetadataStar(})
                 listener: beginMetadataStar(stream3)
                 listener: endMetadataStar(0)
@@ -188,7 +188,7 @@
                         ensureIdentifier(T, formalParameterDeclaration)
                           listener: handleIdentifier(foo, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, foo, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.expect
index afce261..7653208 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.expect
@@ -22,7 +22,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
           handleIdentifier(default, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.intertwined.expect
index e91c81f..6c25f67 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46736.dart.intertwined.expect
@@ -32,7 +32,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
                   listener: handleIdentifier(default, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.expect
index ca8781c..6d47444 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(String, null)
           handleIdentifier(defaultX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.intertwined.expect
index 567a8fa..6ee505e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46736_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(String, formalParameterDeclaration)
                   listener: handleIdentifier(defaultX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
index 40b2bb9..673d794 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.expect
@@ -138,11 +138,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(WrapperClass, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, WrapperClass)
+    beginClassDeclaration(class, null, null, WrapperClass)
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
index ccc4f23..c6060ad 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_fields.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(WrapperClass, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, WrapperClass)
+        listener: beginClassDeclaration(class, null, null, WrapperClass)
         parseClass(WrapperClass, class, class, WrapperClass)
           parseClassHeaderOpt(WrapperClass, class, class)
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -51,7 +51,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -75,7 +75,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -103,7 +103,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -127,7 +127,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -151,7 +151,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -179,7 +179,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -207,7 +207,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -235,7 +235,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -263,7 +263,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -291,7 +291,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -319,7 +319,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -343,7 +343,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -371,7 +371,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -395,7 +395,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -423,7 +423,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -447,7 +447,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -475,7 +475,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -503,7 +503,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -527,7 +527,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -579,7 +579,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -603,7 +603,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -627,7 +627,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -655,7 +655,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -683,7 +683,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -711,7 +711,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -739,7 +739,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -763,7 +763,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -788,7 +788,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -812,7 +812,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -840,7 +840,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -864,7 +864,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -888,7 +888,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -916,7 +916,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -940,7 +940,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -964,7 +964,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -992,7 +992,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1016,7 +1016,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1040,7 +1040,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1064,7 +1064,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1088,7 +1088,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1116,7 +1116,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1144,7 +1144,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1168,7 +1168,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1192,7 +1192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1217,7 +1217,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1241,7 +1241,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1265,7 +1265,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1289,7 +1289,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1313,7 +1313,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1341,7 +1341,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1369,7 +1369,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1394,7 +1394,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1418,7 +1418,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1442,7 +1442,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1466,7 +1466,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1494,7 +1494,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1522,7 +1522,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1546,7 +1546,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1573,7 +1573,7 @@
                   listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
                 listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1601,7 +1601,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1629,7 +1629,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1657,7 +1657,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1681,7 +1681,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1709,7 +1709,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1737,7 +1737,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1765,7 +1765,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1793,7 +1793,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
index d7a04ad..a281a5c 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.expect
@@ -478,11 +478,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(WrapperClass, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, WrapperClass)
+    beginClassDeclaration(class, null, null, WrapperClass)
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -503,7 +503,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -561,7 +561,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -620,7 +620,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -676,7 +676,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -734,7 +734,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -793,7 +793,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -858,7 +858,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -918,7 +918,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -978,7 +978,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1038,7 +1038,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1102,7 +1102,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1166,7 +1166,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1225,7 +1225,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1284,7 +1284,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1343,7 +1343,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1417,7 +1417,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1476,7 +1476,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1546,7 +1546,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1605,7 +1605,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1664,7 +1664,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1723,7 +1723,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1781,7 +1781,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1839,7 +1839,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1898,7 +1898,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1957,7 +1957,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2044,7 +2044,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2104,7 +2104,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2183,7 +2183,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2241,7 +2241,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2299,7 +2299,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2358,7 +2358,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2428,7 +2428,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2486,7 +2486,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2545,7 +2545,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2604,7 +2604,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2662,7 +2662,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2721,7 +2721,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2789,7 +2789,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2847,7 +2847,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2905,7 +2905,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -2963,7 +2963,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3022,7 +3022,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3086,7 +3086,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3144,7 +3144,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3202,7 +3202,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3260,7 +3260,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3318,7 +3318,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3376,7 +3376,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3434,7 +3434,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3492,7 +3492,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3551,7 +3551,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3611,7 +3611,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3666,7 +3666,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3724,7 +3724,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3782,7 +3782,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3840,7 +3840,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3899,7 +3899,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -3958,7 +3958,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4029,7 +4029,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4099,7 +4099,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4158,7 +4158,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4214,7 +4214,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4273,7 +4273,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4340,7 +4340,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4399,7 +4399,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4486,7 +4486,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4573,7 +4573,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4644,7 +4644,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -4703,7 +4703,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
index 8276661..75b6cd7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_class_methods.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(WrapperClass, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, WrapperClass)
+        listener: beginClassDeclaration(class, null, null, WrapperClass)
         parseClass(WrapperClass, class, class, WrapperClass)
           parseClassHeaderOpt(WrapperClass, class, class)
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -171,7 +171,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -201,7 +201,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -315,7 +315,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -349,7 +349,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -454,7 +454,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -484,7 +484,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -598,7 +598,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -628,7 +628,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -745,7 +745,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -779,7 +779,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -924,7 +924,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -958,7 +958,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1071,7 +1071,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1105,7 +1105,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1218,7 +1218,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1252,7 +1252,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1365,7 +1365,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1399,7 +1399,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1465,7 +1465,7 @@
                               parsePrimary(return, expression)
                                 parseConstExpression(return)
                                   listener: beginConstExpression(const)
-                                  parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                                  parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                                     ensureIdentifier(const, constructorReference)
                                       insertSyntheticIdentifier(const, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                         reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -1517,7 +1517,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1551,7 +1551,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1696,7 +1696,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1726,7 +1726,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1840,7 +1840,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1874,7 +1874,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1987,7 +1987,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2017,7 +2017,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2131,7 +2131,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2165,7 +2165,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2334,7 +2334,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2364,7 +2364,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2478,7 +2478,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2512,7 +2512,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2675,7 +2675,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2709,7 +2709,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2822,7 +2822,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2852,7 +2852,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2966,7 +2966,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3000,7 +3000,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3113,7 +3113,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3143,7 +3143,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3257,7 +3257,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3287,7 +3287,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3401,7 +3401,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3431,7 +3431,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3545,7 +3545,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3579,7 +3579,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3687,7 +3687,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3721,7 +3721,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -3926,7 +3926,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -3960,7 +3960,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4073,7 +4073,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4107,7 +4107,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4287,7 +4287,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4317,7 +4317,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4431,7 +4431,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4462,7 +4462,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4576,7 +4576,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4606,7 +4606,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4720,7 +4720,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4754,7 +4754,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -4905,7 +4905,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -4935,7 +4935,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5049,7 +5049,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5079,7 +5079,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5193,7 +5193,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5227,7 +5227,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5340,7 +5340,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5370,7 +5370,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5484,7 +5484,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5514,7 +5514,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5628,7 +5628,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5662,7 +5662,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5807,7 +5807,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5837,7 +5837,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -5951,7 +5951,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -5981,7 +5981,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6095,7 +6095,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6125,7 +6125,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6239,7 +6239,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6269,7 +6269,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6383,7 +6383,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6417,7 +6417,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6484,7 +6484,7 @@
                                 parseNewExpression(return)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       insertSyntheticIdentifier(new, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                         reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -6536,7 +6536,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6570,7 +6570,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6678,7 +6678,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6708,7 +6708,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6822,7 +6822,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6852,7 +6852,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -6966,7 +6966,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -6998,7 +6998,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7112,7 +7112,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7142,7 +7142,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7256,7 +7256,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7286,7 +7286,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7400,7 +7400,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7430,7 +7430,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7544,7 +7544,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7574,7 +7574,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7688,7 +7688,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7722,7 +7722,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7835,7 +7835,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -7869,7 +7869,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -7978,7 +7978,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8009,7 +8009,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8123,7 +8123,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8153,7 +8153,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8267,7 +8267,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8297,7 +8297,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8411,7 +8411,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8441,7 +8441,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8555,7 +8555,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8589,7 +8589,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8696,7 +8696,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8730,7 +8730,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -8890,7 +8890,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -8920,7 +8920,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9034,7 +9034,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9058,7 +9058,7 @@
                   listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
                 listener: endMember()
             notEofOrValue(}, ()
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(()
                 listener: endMetadataStar(0)
@@ -9091,7 +9091,7 @@
                           ensureIdentifier(int, formalParameterDeclaration)
                             listener: handleIdentifier(x, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue())
-                          listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                   parseInitializersOpt())
                     listener: handleNoInitializers()
@@ -9198,7 +9198,7 @@
                   listener: endClassMethod(null, , (, null, })
                 listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9232,7 +9232,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9340,7 +9340,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9374,7 +9374,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9482,7 +9482,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9516,7 +9516,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9667,7 +9667,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9697,7 +9697,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -9811,7 +9811,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -9845,7 +9845,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -10050,7 +10050,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10084,7 +10084,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -10290,7 +10290,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10324,7 +10324,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -10475,7 +10475,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10509,7 +10509,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -10622,7 +10622,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -10652,7 +10652,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.expect
index 422ea99..89ea476 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.expect
@@ -809,7 +809,7 @@
           handleType(int, null)
           handleIdentifier(abstract, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, abstract, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -833,7 +833,7 @@
             handleType(int, null)
             handleIdentifier(abstract, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, abstract, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -861,7 +861,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -886,7 +886,7 @@
             handleType(int, null)
             handleIdentifier(abstract, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, abstract, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -914,7 +914,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -942,7 +942,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -966,7 +966,7 @@
           handleType(int, null)
           handleIdentifier(as, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, as, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, as, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -990,7 +990,7 @@
             handleType(int, null)
             handleIdentifier(as, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, as, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1018,7 +1018,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1043,7 +1043,7 @@
             handleType(int, null)
             handleIdentifier(as, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, as, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1071,7 +1071,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1099,7 +1099,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1124,7 +1124,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
           handleIdentifier(assert, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, assert, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1149,7 +1149,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
             handleIdentifier(assert, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, assert, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1178,7 +1178,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1204,7 +1204,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
             handleIdentifier(assert, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, assert, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1233,7 +1233,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1262,7 +1262,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1286,7 +1286,7 @@
           handleType(int, null)
           handleIdentifier(async, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, async, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, async, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1310,7 +1310,7 @@
             handleType(int, null)
             handleIdentifier(async, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, async, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1338,7 +1338,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1363,7 +1363,7 @@
             handleType(int, null)
             handleIdentifier(async, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, async, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1391,7 +1391,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1419,7 +1419,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1443,7 +1443,7 @@
           handleType(int, null)
           handleIdentifier(await, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, await, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, await, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1467,7 +1467,7 @@
             handleType(int, null)
             handleIdentifier(await, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, await, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1495,7 +1495,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1520,7 +1520,7 @@
             handleType(int, null)
             handleIdentifier(await, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, await, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1548,7 +1548,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1576,7 +1576,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1601,7 +1601,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
           handleIdentifier(break, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, break, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, break, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1626,7 +1626,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
             handleIdentifier(break, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, break, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1655,7 +1655,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1681,7 +1681,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
             handleIdentifier(break, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, break, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1710,7 +1710,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1739,7 +1739,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1764,7 +1764,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
           handleIdentifier(case, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, case, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, case, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1789,7 +1789,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
             handleIdentifier(case, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, case, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1818,7 +1818,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1844,7 +1844,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
             handleIdentifier(case, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, case, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1873,7 +1873,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1902,7 +1902,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1927,7 +1927,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
           handleIdentifier(catch, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, catch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1952,7 +1952,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
             handleIdentifier(catch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, catch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1981,7 +1981,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2007,7 +2007,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
             handleIdentifier(catch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, catch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2036,7 +2036,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2065,7 +2065,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2090,7 +2090,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
           handleIdentifier(class, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, class, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, class, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2115,7 +2115,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
             handleIdentifier(class, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, class, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2144,7 +2144,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2170,7 +2170,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
             handleIdentifier(class, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, class, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2199,7 +2199,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2228,7 +2228,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2253,7 +2253,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
           handleIdentifier(const, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, const, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, const, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2278,7 +2278,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
             handleIdentifier(const, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, const, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2307,7 +2307,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2333,7 +2333,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
             handleIdentifier(const, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, const, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2362,7 +2362,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2391,7 +2391,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2416,7 +2416,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
           handleIdentifier(continue, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, continue, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2441,7 +2441,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
             handleIdentifier(continue, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, continue, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2470,7 +2470,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2496,7 +2496,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
             handleIdentifier(continue, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, continue, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2525,7 +2525,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2554,7 +2554,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2578,7 +2578,7 @@
           handleType(int, null)
           handleIdentifier(covariant, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, covariant, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2602,7 +2602,7 @@
             handleType(int, null)
             handleIdentifier(covariant, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, covariant, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2630,7 +2630,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2655,7 +2655,7 @@
             handleType(int, null)
             handleIdentifier(covariant, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, covariant, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2683,7 +2683,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2711,7 +2711,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2736,7 +2736,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
           handleIdentifier(default, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2761,7 +2761,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
             handleIdentifier(default, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, default, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2790,7 +2790,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2816,7 +2816,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
             handleIdentifier(default, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, default, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2845,7 +2845,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2874,7 +2874,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2898,7 +2898,7 @@
           handleType(int, null)
           handleIdentifier(deferred, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, deferred, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2922,7 +2922,7 @@
             handleType(int, null)
             handleIdentifier(deferred, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, deferred, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2950,7 +2950,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2975,7 +2975,7 @@
             handleType(int, null)
             handleIdentifier(deferred, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, deferred, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3003,7 +3003,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3031,7 +3031,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3056,7 +3056,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
           handleIdentifier(do, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, do, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, do, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3081,7 +3081,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
             handleIdentifier(do, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, do, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3110,7 +3110,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3136,7 +3136,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
             handleIdentifier(do, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, do, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3165,7 +3165,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3194,7 +3194,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3218,7 +3218,7 @@
           handleType(int, null)
           handleIdentifier(dynamic, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3242,7 +3242,7 @@
             handleType(int, null)
             handleIdentifier(dynamic, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3270,7 +3270,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3295,7 +3295,7 @@
             handleType(int, null)
             handleIdentifier(dynamic, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3323,7 +3323,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3351,7 +3351,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3376,7 +3376,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
           handleIdentifier(else, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, else, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, else, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3401,7 +3401,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
             handleIdentifier(else, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, else, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3430,7 +3430,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3456,7 +3456,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
             handleIdentifier(else, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, else, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3485,7 +3485,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3514,7 +3514,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3539,7 +3539,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
           handleIdentifier(enum, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, enum, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3564,7 +3564,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
             handleIdentifier(enum, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, enum, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3593,7 +3593,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3619,7 +3619,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
             handleIdentifier(enum, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, enum, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3648,7 +3648,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3677,7 +3677,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3701,7 +3701,7 @@
           handleType(int, null)
           handleIdentifier(export, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, export, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, export, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3725,7 +3725,7 @@
             handleType(int, null)
             handleIdentifier(export, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, export, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3753,7 +3753,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3778,7 +3778,7 @@
             handleType(int, null)
             handleIdentifier(export, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, export, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3806,7 +3806,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3834,7 +3834,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3859,7 +3859,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
           handleIdentifier(extends, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, extends, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3884,7 +3884,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
             handleIdentifier(extends, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, extends, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3913,7 +3913,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3939,7 +3939,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
             handleIdentifier(extends, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, extends, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3968,7 +3968,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3997,7 +3997,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4021,7 +4021,7 @@
           handleType(int, null)
           handleIdentifier(extension, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, extension, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4045,7 +4045,7 @@
             handleType(int, null)
             handleIdentifier(extension, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, extension, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4073,7 +4073,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4098,7 +4098,7 @@
             handleType(int, null)
             handleIdentifier(extension, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, extension, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4126,7 +4126,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4154,7 +4154,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4178,7 +4178,7 @@
           handleType(int, null)
           handleIdentifier(external, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, external, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, external, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4202,7 +4202,7 @@
             handleType(int, null)
             handleIdentifier(external, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, external, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4230,7 +4230,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4255,7 +4255,7 @@
             handleType(int, null)
             handleIdentifier(external, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, external, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4283,7 +4283,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4311,7 +4311,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4335,7 +4335,7 @@
           handleType(int, null)
           handleIdentifier(factory, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, factory, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4359,7 +4359,7 @@
             handleType(int, null)
             handleIdentifier(factory, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, factory, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4387,7 +4387,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4412,7 +4412,7 @@
             handleType(int, null)
             handleIdentifier(factory, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, factory, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4440,7 +4440,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4468,7 +4468,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4493,7 +4493,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
           handleIdentifier(false, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, false, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, false, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4518,7 +4518,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
             handleIdentifier(false, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, false, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4547,7 +4547,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4573,7 +4573,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
             handleIdentifier(false, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, false, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4602,7 +4602,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4631,7 +4631,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4656,7 +4656,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
           handleIdentifier(final, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, final, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, final, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4681,7 +4681,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
             handleIdentifier(final, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, final, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4710,7 +4710,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4736,7 +4736,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
             handleIdentifier(final, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, final, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4765,7 +4765,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4794,7 +4794,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4819,7 +4819,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
           handleIdentifier(finally, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, finally, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4844,7 +4844,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
             handleIdentifier(finally, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, finally, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4873,7 +4873,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4899,7 +4899,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
             handleIdentifier(finally, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, finally, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4928,7 +4928,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4957,7 +4957,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4982,7 +4982,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
           handleIdentifier(for, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, for, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, for, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5007,7 +5007,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
             handleIdentifier(for, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, for, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5036,7 +5036,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5062,7 +5062,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
             handleIdentifier(for, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, for, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5091,7 +5091,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5120,7 +5120,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5144,7 +5144,7 @@
           handleType(int, null)
           handleIdentifier(Function, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, Function, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5168,7 +5168,7 @@
             handleType(int, null)
             handleIdentifier(Function, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, Function, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5196,7 +5196,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5221,7 +5221,7 @@
             handleType(int, null)
             handleIdentifier(Function, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, Function, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5249,7 +5249,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5277,7 +5277,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5301,7 +5301,7 @@
           handleType(int, null)
           handleIdentifier(get, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, get, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, get, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5325,7 +5325,7 @@
             handleType(int, null)
             handleIdentifier(get, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, get, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5353,7 +5353,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5378,7 +5378,7 @@
             handleType(int, null)
             handleIdentifier(get, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, get, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5406,7 +5406,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5434,7 +5434,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5458,7 +5458,7 @@
           handleType(int, null)
           handleIdentifier(hide, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, hide, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5482,7 +5482,7 @@
             handleType(int, null)
             handleIdentifier(hide, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, hide, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5510,7 +5510,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5535,7 +5535,7 @@
             handleType(int, null)
             handleIdentifier(hide, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, hide, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5563,7 +5563,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5591,7 +5591,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5616,7 +5616,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
           handleIdentifier(if, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, if, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, if, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5641,7 +5641,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
             handleIdentifier(if, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, if, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5670,7 +5670,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5696,7 +5696,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
             handleIdentifier(if, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, if, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5725,7 +5725,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5754,7 +5754,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5778,7 +5778,7 @@
           handleType(int, null)
           handleIdentifier(implements, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, implements, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5802,7 +5802,7 @@
             handleType(int, null)
             handleIdentifier(implements, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, implements, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5830,7 +5830,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5855,7 +5855,7 @@
             handleType(int, null)
             handleIdentifier(implements, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, implements, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5883,7 +5883,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5911,7 +5911,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5935,7 +5935,7 @@
           handleType(int, null)
           handleIdentifier(import, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, import, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, import, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5959,7 +5959,7 @@
             handleType(int, null)
             handleIdentifier(import, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, import, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5987,7 +5987,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6012,7 +6012,7 @@
             handleType(int, null)
             handleIdentifier(import, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, import, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6040,7 +6040,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6068,7 +6068,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6093,7 +6093,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
           handleIdentifier(in, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, in, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, in, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6118,7 +6118,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
             handleIdentifier(in, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, in, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6147,7 +6147,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6173,7 +6173,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
             handleIdentifier(in, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, in, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6202,7 +6202,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6231,7 +6231,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6255,7 +6255,7 @@
           handleType(int, null)
           handleIdentifier(inout, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, inout, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6279,7 +6279,7 @@
             handleType(int, null)
             handleIdentifier(inout, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, inout, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6307,7 +6307,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6332,7 +6332,7 @@
             handleType(int, null)
             handleIdentifier(inout, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, inout, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6360,7 +6360,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6388,7 +6388,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6412,7 +6412,7 @@
           handleType(int, null)
           handleIdentifier(interface, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, interface, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6436,7 +6436,7 @@
             handleType(int, null)
             handleIdentifier(interface, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, interface, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6464,7 +6464,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6489,7 +6489,7 @@
             handleType(int, null)
             handleIdentifier(interface, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, interface, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6517,7 +6517,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6545,7 +6545,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6570,7 +6570,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
           handleIdentifier(is, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, is, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, is, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6595,7 +6595,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
             handleIdentifier(is, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, is, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6624,7 +6624,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6650,7 +6650,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
             handleIdentifier(is, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, is, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6679,7 +6679,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6708,7 +6708,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6732,7 +6732,7 @@
           handleType(int, null)
           handleIdentifier(late, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, late, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, late, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6756,7 +6756,7 @@
             handleType(int, null)
             handleIdentifier(late, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, late, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6784,7 +6784,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6809,7 +6809,7 @@
             handleType(int, null)
             handleIdentifier(late, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, late, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6837,7 +6837,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6865,7 +6865,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6889,7 +6889,7 @@
           handleType(int, null)
           handleIdentifier(library, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, library, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, library, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6913,7 +6913,7 @@
             handleType(int, null)
             handleIdentifier(library, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, library, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6941,7 +6941,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6966,7 +6966,7 @@
             handleType(int, null)
             handleIdentifier(library, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, library, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6994,7 +6994,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7022,7 +7022,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7046,7 +7046,7 @@
           handleType(int, null)
           handleIdentifier(mixin, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, mixin, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7070,7 +7070,7 @@
             handleType(int, null)
             handleIdentifier(mixin, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, mixin, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7098,7 +7098,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7123,7 +7123,7 @@
             handleType(int, null)
             handleIdentifier(mixin, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, mixin, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7151,7 +7151,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7179,7 +7179,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7203,7 +7203,7 @@
           handleType(int, null)
           handleIdentifier(native, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, native, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, native, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7227,7 +7227,7 @@
             handleType(int, null)
             handleIdentifier(native, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, native, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7255,7 +7255,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7280,7 +7280,7 @@
             handleType(int, null)
             handleIdentifier(native, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, native, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7308,7 +7308,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7336,7 +7336,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7361,7 +7361,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
           handleIdentifier(new, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, new, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, new, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7386,7 +7386,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, new, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7415,7 +7415,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7441,7 +7441,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
             handleIdentifier(new, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, new, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7470,7 +7470,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7499,7 +7499,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7524,7 +7524,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
           handleIdentifier(null, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, null, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, null, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7549,7 +7549,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
             handleIdentifier(null, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, null, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7578,7 +7578,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7604,7 +7604,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
             handleIdentifier(null, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, null, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7633,7 +7633,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7662,7 +7662,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7686,7 +7686,7 @@
           handleType(int, null)
           handleIdentifier(of, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, of, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, of, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7710,7 +7710,7 @@
             handleType(int, null)
             handleIdentifier(of, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, of, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7738,7 +7738,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7763,7 +7763,7 @@
             handleType(int, null)
             handleIdentifier(of, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, of, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7791,7 +7791,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7819,7 +7819,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7843,7 +7843,7 @@
           handleType(int, null)
           handleIdentifier(on, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7867,7 +7867,7 @@
             handleType(int, null)
             handleIdentifier(on, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, on, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7895,7 +7895,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7920,7 +7920,7 @@
             handleType(int, null)
             handleIdentifier(on, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, on, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7948,7 +7948,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7976,7 +7976,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8000,7 +8000,7 @@
           handleType(int, null)
           handleIdentifier(operator, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, operator, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8024,7 +8024,7 @@
             handleType(int, null)
             handleIdentifier(operator, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, operator, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8052,7 +8052,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8077,7 +8077,7 @@
             handleType(int, null)
             handleIdentifier(operator, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, operator, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8105,7 +8105,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8133,7 +8133,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8157,7 +8157,7 @@
           handleType(int, null)
           handleIdentifier(out, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, out, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, out, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8181,7 +8181,7 @@
             handleType(int, null)
             handleIdentifier(out, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, out, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8209,7 +8209,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8234,7 +8234,7 @@
             handleType(int, null)
             handleIdentifier(out, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, out, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8262,7 +8262,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8290,7 +8290,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8314,7 +8314,7 @@
           handleType(int, null)
           handleIdentifier(part, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, part, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, part, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8338,7 +8338,7 @@
             handleType(int, null)
             handleIdentifier(part, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, part, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8366,7 +8366,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8391,7 +8391,7 @@
             handleType(int, null)
             handleIdentifier(part, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, part, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8419,7 +8419,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8447,7 +8447,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8471,7 +8471,7 @@
           handleType(int, null)
           handleIdentifier(patch, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, patch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8495,7 +8495,7 @@
             handleType(int, null)
             handleIdentifier(patch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, patch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8523,7 +8523,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8548,7 +8548,7 @@
             handleType(int, null)
             handleIdentifier(patch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, patch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8576,7 +8576,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8604,7 +8604,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8628,7 +8628,7 @@
           handleType(int, null)
           handleIdentifier(required, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, required, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, required, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8652,7 +8652,7 @@
             handleType(int, null)
             handleIdentifier(required, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, required, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8680,7 +8680,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8705,7 +8705,7 @@
             handleType(int, null)
             handleIdentifier(required, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, required, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8733,7 +8733,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8761,7 +8761,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8786,7 +8786,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
           handleIdentifier(rethrow, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8811,7 +8811,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
             handleIdentifier(rethrow, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8840,7 +8840,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8866,7 +8866,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
             handleIdentifier(rethrow, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8895,7 +8895,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8924,7 +8924,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8949,7 +8949,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
           handleIdentifier(return, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, return, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, return, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8974,7 +8974,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
             handleIdentifier(return, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, return, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9003,7 +9003,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9029,7 +9029,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
             handleIdentifier(return, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, return, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9058,7 +9058,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9087,7 +9087,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9111,7 +9111,7 @@
           handleType(int, null)
           handleIdentifier(set, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, set, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, set, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9135,7 +9135,7 @@
             handleType(int, null)
             handleIdentifier(set, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, set, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9163,7 +9163,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9188,7 +9188,7 @@
             handleType(int, null)
             handleIdentifier(set, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, set, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9216,7 +9216,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9244,7 +9244,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9268,7 +9268,7 @@
           handleType(int, null)
           handleIdentifier(show, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, show, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, show, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9292,7 +9292,7 @@
             handleType(int, null)
             handleIdentifier(show, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, show, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9320,7 +9320,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9345,7 +9345,7 @@
             handleType(int, null)
             handleIdentifier(show, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, show, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9373,7 +9373,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9401,7 +9401,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9425,7 +9425,7 @@
           handleType(int, null)
           handleIdentifier(source, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, source, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, source, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9449,7 +9449,7 @@
             handleType(int, null)
             handleIdentifier(source, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, source, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9477,7 +9477,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9502,7 +9502,7 @@
             handleType(int, null)
             handleIdentifier(source, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, source, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9530,7 +9530,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9558,7 +9558,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9582,7 +9582,7 @@
           handleType(int, null)
           handleIdentifier(static, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, static, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, static, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9606,7 +9606,7 @@
             handleType(int, null)
             handleIdentifier(static, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, static, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9634,7 +9634,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9659,7 +9659,7 @@
             handleType(int, null)
             handleIdentifier(static, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, static, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9687,7 +9687,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9715,7 +9715,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9740,7 +9740,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
           handleIdentifier(super, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, super, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, super, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9765,7 +9765,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
             handleIdentifier(super, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, super, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9794,7 +9794,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9820,7 +9820,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
             handleIdentifier(super, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, super, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9849,7 +9849,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9878,7 +9878,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9903,7 +9903,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
           handleIdentifier(switch, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, switch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9928,7 +9928,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
             handleIdentifier(switch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, switch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9957,7 +9957,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9983,7 +9983,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
             handleIdentifier(switch, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, switch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10012,7 +10012,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10041,7 +10041,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10065,7 +10065,7 @@
           handleType(int, null)
           handleIdentifier(sync, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sync, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10089,7 +10089,7 @@
             handleType(int, null)
             handleIdentifier(sync, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, sync, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10117,7 +10117,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10142,7 +10142,7 @@
             handleType(int, null)
             handleIdentifier(sync, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, sync, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10170,7 +10170,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10198,7 +10198,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10223,7 +10223,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
           handleIdentifier(this, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, this, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, this, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10248,7 +10248,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
             handleIdentifier(this, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, this, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10277,7 +10277,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10303,7 +10303,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
             handleIdentifier(this, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, this, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10332,7 +10332,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10361,7 +10361,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10386,7 +10386,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
           handleIdentifier(throw, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, throw, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10411,7 +10411,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
             handleIdentifier(throw, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, throw, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10440,7 +10440,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10466,7 +10466,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
             handleIdentifier(throw, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, throw, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10495,7 +10495,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10524,7 +10524,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10549,7 +10549,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
           handleIdentifier(true, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, true, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, true, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10574,7 +10574,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
             handleIdentifier(true, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, true, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10603,7 +10603,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10629,7 +10629,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
             handleIdentifier(true, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, true, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10658,7 +10658,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10687,7 +10687,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10712,7 +10712,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
           handleIdentifier(try, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, try, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, try, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10737,7 +10737,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
             handleIdentifier(try, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, try, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10766,7 +10766,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10792,7 +10792,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
             handleIdentifier(try, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, try, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10821,7 +10821,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10850,7 +10850,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10874,7 +10874,7 @@
           handleType(int, null)
           handleIdentifier(typedef, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, typedef, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10898,7 +10898,7 @@
             handleType(int, null)
             handleIdentifier(typedef, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, typedef, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10926,7 +10926,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10951,7 +10951,7 @@
             handleType(int, null)
             handleIdentifier(typedef, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, typedef, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10979,7 +10979,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11007,7 +11007,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11032,7 +11032,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
           handleIdentifier(var, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, var, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, var, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11057,7 +11057,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
             handleIdentifier(var, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, var, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11086,7 +11086,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11112,7 +11112,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
             handleIdentifier(var, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, var, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11141,7 +11141,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11170,7 +11170,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11195,7 +11195,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
           handleIdentifier(void, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, void, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, void, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11220,7 +11220,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
             handleIdentifier(void, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, void, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11249,7 +11249,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11275,7 +11275,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
             handleIdentifier(void, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, void, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11304,7 +11304,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11333,7 +11333,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11358,7 +11358,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
           handleIdentifier(while, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, while, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, while, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11383,7 +11383,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
             handleIdentifier(while, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, while, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11412,7 +11412,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11438,7 +11438,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
             handleIdentifier(while, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, while, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11467,7 +11467,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11496,7 +11496,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11521,7 +11521,7 @@
           handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
           handleIdentifier(with, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, with, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, with, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11546,7 +11546,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
             handleIdentifier(with, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, with, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11575,7 +11575,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11601,7 +11601,7 @@
             handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
             handleIdentifier(with, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, with, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11630,7 +11630,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11659,7 +11659,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11683,7 +11683,7 @@
           handleType(int, null)
           handleIdentifier(yield, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, yield, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -11707,7 +11707,7 @@
             handleType(int, null)
             handleIdentifier(yield, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, yield, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11735,7 +11735,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11760,7 +11760,7 @@
             handleType(int, null)
             handleIdentifier(yield, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, yield, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11788,7 +11788,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -11816,7 +11816,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.intertwined.expect
index 1412298..251738d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter.dart.intertwined.expect
@@ -31,7 +31,7 @@
                   inPlainSync()
                   listener: handleIdentifier(abstract, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, abstract, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -73,7 +73,7 @@
                     inPlainSync()
                     listener: handleIdentifier(abstract, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, abstract, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -125,7 +125,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -169,7 +169,7 @@
                     inPlainSync()
                     listener: handleIdentifier(abstract, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, abstract, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -221,7 +221,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -273,7 +273,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstract, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -315,7 +315,7 @@
                   inPlainSync()
                   listener: handleIdentifier(as, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, as, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, as, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -357,7 +357,7 @@
                     inPlainSync()
                     listener: handleIdentifier(as, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, as, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -409,7 +409,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -453,7 +453,7 @@
                     inPlainSync()
                     listener: handleIdentifier(as, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, as, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -505,7 +505,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -557,7 +557,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, as, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -600,7 +600,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
                   listener: handleIdentifier(assert, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, assert, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -643,7 +643,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
                     listener: handleIdentifier(assert, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, assert, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -696,7 +696,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -741,7 +741,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
                     listener: handleIdentifier(assert, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, assert, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -794,7 +794,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -847,7 +847,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assert, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -889,7 +889,7 @@
                   inPlainSync()
                   listener: handleIdentifier(async, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, async, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, async, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -931,7 +931,7 @@
                     inPlainSync()
                     listener: handleIdentifier(async, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, async, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -983,7 +983,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1027,7 +1027,7 @@
                     inPlainSync()
                     listener: handleIdentifier(async, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, async, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1079,7 +1079,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1131,7 +1131,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, async, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1173,7 +1173,7 @@
                   inPlainSync()
                   listener: handleIdentifier(await, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, await, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, await, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1215,7 +1215,7 @@
                     inPlainSync()
                     listener: handleIdentifier(await, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, await, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1267,7 +1267,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1311,7 +1311,7 @@
                     inPlainSync()
                     listener: handleIdentifier(await, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, await, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1363,7 +1363,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1415,7 +1415,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, await, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1458,7 +1458,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
                   listener: handleIdentifier(break, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, break, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, break, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1501,7 +1501,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
                     listener: handleIdentifier(break, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, break, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1554,7 +1554,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1599,7 +1599,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
                     listener: handleIdentifier(break, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, break, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1652,7 +1652,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1705,7 +1705,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, break, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1748,7 +1748,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
                   listener: handleIdentifier(case, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, case, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, case, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1791,7 +1791,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
                     listener: handleIdentifier(case, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, case, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1844,7 +1844,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1889,7 +1889,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
                     listener: handleIdentifier(case, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, case, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1942,7 +1942,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1995,7 +1995,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, case, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2038,7 +2038,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
                   listener: handleIdentifier(catch, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, catch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2081,7 +2081,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
                     listener: handleIdentifier(catch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, catch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2134,7 +2134,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2179,7 +2179,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
                     listener: handleIdentifier(catch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, catch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2232,7 +2232,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2285,7 +2285,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2328,7 +2328,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
                   listener: handleIdentifier(class, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, class, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, class, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2371,7 +2371,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
                     listener: handleIdentifier(class, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, class, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2424,7 +2424,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2469,7 +2469,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
                     listener: handleIdentifier(class, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, class, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2522,7 +2522,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2575,7 +2575,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, class, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2618,7 +2618,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
                   listener: handleIdentifier(const, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, const, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, const, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2661,7 +2661,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
                     listener: handleIdentifier(const, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, const, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2714,7 +2714,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2759,7 +2759,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
                     listener: handleIdentifier(const, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, const, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2812,7 +2812,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2865,7 +2865,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, const, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2908,7 +2908,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
                   listener: handleIdentifier(continue, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, continue, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2951,7 +2951,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
                     listener: handleIdentifier(continue, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, continue, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3004,7 +3004,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3049,7 +3049,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
                     listener: handleIdentifier(continue, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, continue, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3102,7 +3102,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3155,7 +3155,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continue, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3197,7 +3197,7 @@
                   inPlainSync()
                   listener: handleIdentifier(covariant, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, covariant, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3239,7 +3239,7 @@
                     inPlainSync()
                     listener: handleIdentifier(covariant, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, covariant, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3291,7 +3291,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3335,7 +3335,7 @@
                     inPlainSync()
                     listener: handleIdentifier(covariant, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, covariant, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3387,7 +3387,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3439,7 +3439,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariant, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3482,7 +3482,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
                   listener: handleIdentifier(default, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, default, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3525,7 +3525,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
                     listener: handleIdentifier(default, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, default, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3578,7 +3578,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3623,7 +3623,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
                     listener: handleIdentifier(default, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, default, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3676,7 +3676,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3729,7 +3729,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, default, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3771,7 +3771,7 @@
                   inPlainSync()
                   listener: handleIdentifier(deferred, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, deferred, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3813,7 +3813,7 @@
                     inPlainSync()
                     listener: handleIdentifier(deferred, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, deferred, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3865,7 +3865,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3909,7 +3909,7 @@
                     inPlainSync()
                     listener: handleIdentifier(deferred, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, deferred, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3961,7 +3961,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4013,7 +4013,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferred, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4056,7 +4056,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
                   listener: handleIdentifier(do, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, do, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, do, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4099,7 +4099,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
                     listener: handleIdentifier(do, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, do, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4152,7 +4152,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4197,7 +4197,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
                     listener: handleIdentifier(do, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, do, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4250,7 +4250,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4303,7 +4303,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, do, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4345,7 +4345,7 @@
                   inPlainSync()
                   listener: handleIdentifier(dynamic, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4387,7 +4387,7 @@
                     inPlainSync()
                     listener: handleIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4439,7 +4439,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4483,7 +4483,7 @@
                     inPlainSync()
                     listener: handleIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, dynamic, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4535,7 +4535,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4587,7 +4587,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamic, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4630,7 +4630,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
                   listener: handleIdentifier(else, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, else, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, else, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4673,7 +4673,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
                     listener: handleIdentifier(else, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, else, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4726,7 +4726,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4771,7 +4771,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
                     listener: handleIdentifier(else, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, else, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4824,7 +4824,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4877,7 +4877,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, else, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4920,7 +4920,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
                   listener: handleIdentifier(enum, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, enum, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4963,7 +4963,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
                     listener: handleIdentifier(enum, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, enum, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5016,7 +5016,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5061,7 +5061,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
                     listener: handleIdentifier(enum, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, enum, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5114,7 +5114,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5167,7 +5167,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enum, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5209,7 +5209,7 @@
                   inPlainSync()
                   listener: handleIdentifier(export, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, export, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, export, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5251,7 +5251,7 @@
                     inPlainSync()
                     listener: handleIdentifier(export, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, export, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5303,7 +5303,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5347,7 +5347,7 @@
                     inPlainSync()
                     listener: handleIdentifier(export, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, export, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5399,7 +5399,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5451,7 +5451,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, export, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5494,7 +5494,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
                   listener: handleIdentifier(extends, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, extends, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5537,7 +5537,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
                     listener: handleIdentifier(extends, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, extends, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5590,7 +5590,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5635,7 +5635,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
                     listener: handleIdentifier(extends, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, extends, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5688,7 +5688,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5741,7 +5741,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extends, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5783,7 +5783,7 @@
                   inPlainSync()
                   listener: handleIdentifier(extension, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, extension, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5825,7 +5825,7 @@
                     inPlainSync()
                     listener: handleIdentifier(extension, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, extension, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5877,7 +5877,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5921,7 +5921,7 @@
                     inPlainSync()
                     listener: handleIdentifier(extension, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, extension, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5973,7 +5973,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6025,7 +6025,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extension, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6067,7 +6067,7 @@
                   inPlainSync()
                   listener: handleIdentifier(external, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, external, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, external, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6109,7 +6109,7 @@
                     inPlainSync()
                     listener: handleIdentifier(external, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, external, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6161,7 +6161,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6205,7 +6205,7 @@
                     inPlainSync()
                     listener: handleIdentifier(external, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, external, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6257,7 +6257,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6309,7 +6309,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, external, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6351,7 +6351,7 @@
                   inPlainSync()
                   listener: handleIdentifier(factory, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, factory, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6393,7 +6393,7 @@
                     inPlainSync()
                     listener: handleIdentifier(factory, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, factory, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6445,7 +6445,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6489,7 +6489,7 @@
                     inPlainSync()
                     listener: handleIdentifier(factory, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, factory, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6541,7 +6541,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6593,7 +6593,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factory, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6636,7 +6636,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
                   listener: handleIdentifier(false, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, false, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, false, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6679,7 +6679,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
                     listener: handleIdentifier(false, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, false, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6732,7 +6732,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6777,7 +6777,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
                     listener: handleIdentifier(false, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, false, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6830,7 +6830,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6883,7 +6883,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, false, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6926,7 +6926,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
                   listener: handleIdentifier(final, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, final, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, final, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6969,7 +6969,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
                     listener: handleIdentifier(final, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, final, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7022,7 +7022,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7067,7 +7067,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
                     listener: handleIdentifier(final, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, final, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7120,7 +7120,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7173,7 +7173,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, final, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7216,7 +7216,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
                   listener: handleIdentifier(finally, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, finally, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7259,7 +7259,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
                     listener: handleIdentifier(finally, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, finally, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7312,7 +7312,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7357,7 +7357,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
                     listener: handleIdentifier(finally, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, finally, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7410,7 +7410,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7463,7 +7463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finally, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7506,7 +7506,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
                   listener: handleIdentifier(for, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, for, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, for, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7549,7 +7549,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
                     listener: handleIdentifier(for, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, for, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7602,7 +7602,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7647,7 +7647,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
                     listener: handleIdentifier(for, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, for, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7700,7 +7700,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7753,7 +7753,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, for, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7795,7 +7795,7 @@
                   inPlainSync()
                   listener: handleIdentifier(Function, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, Function, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7837,7 +7837,7 @@
                     inPlainSync()
                     listener: handleIdentifier(Function, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, Function, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7889,7 +7889,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7933,7 +7933,7 @@
                     inPlainSync()
                     listener: handleIdentifier(Function, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, Function, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7985,7 +7985,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8037,7 +8037,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, Function, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8079,7 +8079,7 @@
                   inPlainSync()
                   listener: handleIdentifier(get, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, get, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, get, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8121,7 +8121,7 @@
                     inPlainSync()
                     listener: handleIdentifier(get, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, get, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8173,7 +8173,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8217,7 +8217,7 @@
                     inPlainSync()
                     listener: handleIdentifier(get, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, get, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8269,7 +8269,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8321,7 +8321,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, get, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8363,7 +8363,7 @@
                   inPlainSync()
                   listener: handleIdentifier(hide, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, hide, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8405,7 +8405,7 @@
                     inPlainSync()
                     listener: handleIdentifier(hide, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, hide, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8457,7 +8457,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8501,7 +8501,7 @@
                     inPlainSync()
                     listener: handleIdentifier(hide, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, hide, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8553,7 +8553,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8605,7 +8605,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hide, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8648,7 +8648,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
                   listener: handleIdentifier(if, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, if, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, if, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8691,7 +8691,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
                     listener: handleIdentifier(if, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, if, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8744,7 +8744,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8789,7 +8789,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
                     listener: handleIdentifier(if, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, if, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8842,7 +8842,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8895,7 +8895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, if, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8937,7 +8937,7 @@
                   inPlainSync()
                   listener: handleIdentifier(implements, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, implements, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8979,7 +8979,7 @@
                     inPlainSync()
                     listener: handleIdentifier(implements, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, implements, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9031,7 +9031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9075,7 +9075,7 @@
                     inPlainSync()
                     listener: handleIdentifier(implements, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, implements, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9127,7 +9127,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9179,7 +9179,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implements, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9221,7 +9221,7 @@
                   inPlainSync()
                   listener: handleIdentifier(import, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, import, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, import, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9263,7 +9263,7 @@
                     inPlainSync()
                     listener: handleIdentifier(import, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, import, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9315,7 +9315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9359,7 +9359,7 @@
                     inPlainSync()
                     listener: handleIdentifier(import, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, import, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9411,7 +9411,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9463,7 +9463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, import, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9506,7 +9506,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
                   listener: handleIdentifier(in, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, in, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, in, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9549,7 +9549,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
                     listener: handleIdentifier(in, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, in, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9602,7 +9602,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9647,7 +9647,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
                     listener: handleIdentifier(in, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, in, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9700,7 +9700,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9753,7 +9753,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, in, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9795,7 +9795,7 @@
                   inPlainSync()
                   listener: handleIdentifier(inout, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, inout, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9837,7 +9837,7 @@
                     inPlainSync()
                     listener: handleIdentifier(inout, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, inout, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9889,7 +9889,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9933,7 +9933,7 @@
                     inPlainSync()
                     listener: handleIdentifier(inout, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, inout, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9985,7 +9985,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10037,7 +10037,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inout, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10079,7 +10079,7 @@
                   inPlainSync()
                   listener: handleIdentifier(interface, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, interface, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10121,7 +10121,7 @@
                     inPlainSync()
                     listener: handleIdentifier(interface, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, interface, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10173,7 +10173,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10217,7 +10217,7 @@
                     inPlainSync()
                     listener: handleIdentifier(interface, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, interface, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10269,7 +10269,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10321,7 +10321,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interface, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10364,7 +10364,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
                   listener: handleIdentifier(is, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, is, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, is, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10407,7 +10407,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
                     listener: handleIdentifier(is, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, is, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10460,7 +10460,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10505,7 +10505,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
                     listener: handleIdentifier(is, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, is, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10558,7 +10558,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10611,7 +10611,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, is, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10653,7 +10653,7 @@
                   inPlainSync()
                   listener: handleIdentifier(late, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, late, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, late, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10695,7 +10695,7 @@
                     inPlainSync()
                     listener: handleIdentifier(late, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, late, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10747,7 +10747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10791,7 +10791,7 @@
                     inPlainSync()
                     listener: handleIdentifier(late, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, late, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10843,7 +10843,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10895,7 +10895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, late, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10937,7 +10937,7 @@
                   inPlainSync()
                   listener: handleIdentifier(library, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, library, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, library, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10979,7 +10979,7 @@
                     inPlainSync()
                     listener: handleIdentifier(library, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, library, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11031,7 +11031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11075,7 +11075,7 @@
                     inPlainSync()
                     listener: handleIdentifier(library, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, library, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11127,7 +11127,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11179,7 +11179,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, library, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11221,7 +11221,7 @@
                   inPlainSync()
                   listener: handleIdentifier(mixin, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, mixin, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11263,7 +11263,7 @@
                     inPlainSync()
                     listener: handleIdentifier(mixin, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, mixin, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11315,7 +11315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11359,7 +11359,7 @@
                     inPlainSync()
                     listener: handleIdentifier(mixin, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, mixin, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11411,7 +11411,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11463,7 +11463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixin, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11505,7 +11505,7 @@
                   inPlainSync()
                   listener: handleIdentifier(native, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, native, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, native, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11547,7 +11547,7 @@
                     inPlainSync()
                     listener: handleIdentifier(native, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, native, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11599,7 +11599,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11643,7 +11643,7 @@
                     inPlainSync()
                     listener: handleIdentifier(native, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, native, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11695,7 +11695,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11747,7 +11747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, native, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11790,7 +11790,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
                   listener: handleIdentifier(new, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, new, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, new, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11833,7 +11833,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
                     listener: handleIdentifier(new, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, new, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11886,7 +11886,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11931,7 +11931,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
                     listener: handleIdentifier(new, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, new, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11984,7 +11984,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12037,7 +12037,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, new, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12080,7 +12080,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
                   listener: handleIdentifier(null, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, null, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, null, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12123,7 +12123,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
                     listener: handleIdentifier(null, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, null, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12176,7 +12176,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12221,7 +12221,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
                     listener: handleIdentifier(null, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, null, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12274,7 +12274,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12327,7 +12327,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, null, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12369,7 +12369,7 @@
                   inPlainSync()
                   listener: handleIdentifier(of, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, of, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, of, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12411,7 +12411,7 @@
                     inPlainSync()
                     listener: handleIdentifier(of, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, of, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12463,7 +12463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12507,7 +12507,7 @@
                     inPlainSync()
                     listener: handleIdentifier(of, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, of, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12559,7 +12559,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12611,7 +12611,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, of, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12653,7 +12653,7 @@
                   inPlainSync()
                   listener: handleIdentifier(on, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12695,7 +12695,7 @@
                     inPlainSync()
                     listener: handleIdentifier(on, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, on, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12747,7 +12747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12791,7 +12791,7 @@
                     inPlainSync()
                     listener: handleIdentifier(on, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, on, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12843,7 +12843,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12895,7 +12895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, on, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12937,7 +12937,7 @@
                   inPlainSync()
                   listener: handleIdentifier(operator, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, operator, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12979,7 +12979,7 @@
                     inPlainSync()
                     listener: handleIdentifier(operator, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, operator, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13031,7 +13031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13075,7 +13075,7 @@
                     inPlainSync()
                     listener: handleIdentifier(operator, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, operator, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13127,7 +13127,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13179,7 +13179,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operator, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13221,7 +13221,7 @@
                   inPlainSync()
                   listener: handleIdentifier(out, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, out, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, out, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13263,7 +13263,7 @@
                     inPlainSync()
                     listener: handleIdentifier(out, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, out, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13315,7 +13315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13359,7 +13359,7 @@
                     inPlainSync()
                     listener: handleIdentifier(out, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, out, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13411,7 +13411,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13463,7 +13463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, out, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13505,7 +13505,7 @@
                   inPlainSync()
                   listener: handleIdentifier(part, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, part, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, part, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13547,7 +13547,7 @@
                     inPlainSync()
                     listener: handleIdentifier(part, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, part, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13599,7 +13599,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13643,7 +13643,7 @@
                     inPlainSync()
                     listener: handleIdentifier(part, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, part, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13695,7 +13695,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13747,7 +13747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, part, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13789,7 +13789,7 @@
                   inPlainSync()
                   listener: handleIdentifier(patch, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, patch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13831,7 +13831,7 @@
                     inPlainSync()
                     listener: handleIdentifier(patch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, patch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13883,7 +13883,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13927,7 +13927,7 @@
                     inPlainSync()
                     listener: handleIdentifier(patch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, patch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13979,7 +13979,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14031,7 +14031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14073,7 +14073,7 @@
                   inPlainSync()
                   listener: handleIdentifier(required, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, required, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, required, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14115,7 +14115,7 @@
                     inPlainSync()
                     listener: handleIdentifier(required, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, required, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14167,7 +14167,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14211,7 +14211,7 @@
                     inPlainSync()
                     listener: handleIdentifier(required, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, required, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14263,7 +14263,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14315,7 +14315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, required, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14358,7 +14358,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
                   listener: handleIdentifier(rethrow, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14401,7 +14401,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
                     listener: handleIdentifier(rethrow, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14454,7 +14454,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14499,7 +14499,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
                     listener: handleIdentifier(rethrow, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, rethrow, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14552,7 +14552,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14605,7 +14605,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrow, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14648,7 +14648,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
                   listener: handleIdentifier(return, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, return, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, return, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14691,7 +14691,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
                     listener: handleIdentifier(return, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, return, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14744,7 +14744,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14789,7 +14789,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
                     listener: handleIdentifier(return, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, return, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14842,7 +14842,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14895,7 +14895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, return, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14937,7 +14937,7 @@
                   inPlainSync()
                   listener: handleIdentifier(set, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, set, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, set, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14979,7 +14979,7 @@
                     inPlainSync()
                     listener: handleIdentifier(set, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, set, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15031,7 +15031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15075,7 +15075,7 @@
                     inPlainSync()
                     listener: handleIdentifier(set, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, set, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15127,7 +15127,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15179,7 +15179,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, set, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15221,7 +15221,7 @@
                   inPlainSync()
                   listener: handleIdentifier(show, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, show, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, show, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15263,7 +15263,7 @@
                     inPlainSync()
                     listener: handleIdentifier(show, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, show, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15315,7 +15315,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15359,7 +15359,7 @@
                     inPlainSync()
                     listener: handleIdentifier(show, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, show, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15411,7 +15411,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15463,7 +15463,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, show, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15505,7 +15505,7 @@
                   inPlainSync()
                   listener: handleIdentifier(source, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, source, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, source, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15547,7 +15547,7 @@
                     inPlainSync()
                     listener: handleIdentifier(source, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, source, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15599,7 +15599,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15643,7 +15643,7 @@
                     inPlainSync()
                     listener: handleIdentifier(source, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, source, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15695,7 +15695,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15747,7 +15747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, source, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15789,7 +15789,7 @@
                   inPlainSync()
                   listener: handleIdentifier(static, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, static, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, static, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15831,7 +15831,7 @@
                     inPlainSync()
                     listener: handleIdentifier(static, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, static, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15883,7 +15883,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15927,7 +15927,7 @@
                     inPlainSync()
                     listener: handleIdentifier(static, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, static, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15979,7 +15979,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16031,7 +16031,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, static, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16074,7 +16074,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
                   listener: handleIdentifier(super, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, super, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, super, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16117,7 +16117,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
                     listener: handleIdentifier(super, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, super, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16170,7 +16170,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16215,7 +16215,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
                     listener: handleIdentifier(super, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, super, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16268,7 +16268,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16321,7 +16321,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, super, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16364,7 +16364,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
                   listener: handleIdentifier(switch, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, switch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16407,7 +16407,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
                     listener: handleIdentifier(switch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, switch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16460,7 +16460,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16505,7 +16505,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
                     listener: handleIdentifier(switch, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, switch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16558,7 +16558,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16611,7 +16611,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switch, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16653,7 +16653,7 @@
                   inPlainSync()
                   listener: handleIdentifier(sync, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sync, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16695,7 +16695,7 @@
                     inPlainSync()
                     listener: handleIdentifier(sync, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, sync, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16747,7 +16747,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16791,7 +16791,7 @@
                     inPlainSync()
                     listener: handleIdentifier(sync, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, sync, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16843,7 +16843,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16895,7 +16895,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sync, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16938,7 +16938,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
                   listener: handleIdentifier(this, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, this, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, this, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16981,7 +16981,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
                     listener: handleIdentifier(this, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, this, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17034,7 +17034,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17079,7 +17079,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
                     listener: handleIdentifier(this, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, this, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17132,7 +17132,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17185,7 +17185,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, this, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17228,7 +17228,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
                   listener: handleIdentifier(throw, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, throw, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17271,7 +17271,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
                     listener: handleIdentifier(throw, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, throw, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17324,7 +17324,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17369,7 +17369,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
                     listener: handleIdentifier(throw, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, throw, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17422,7 +17422,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17475,7 +17475,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throw, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17518,7 +17518,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
                   listener: handleIdentifier(true, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, true, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, true, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17561,7 +17561,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
                     listener: handleIdentifier(true, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, true, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17614,7 +17614,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17659,7 +17659,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
                     listener: handleIdentifier(true, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, true, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17712,7 +17712,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17765,7 +17765,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, true, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17808,7 +17808,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
                   listener: handleIdentifier(try, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, try, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, try, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17851,7 +17851,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
                     listener: handleIdentifier(try, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, try, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17904,7 +17904,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17949,7 +17949,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
                     listener: handleIdentifier(try, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, try, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18002,7 +18002,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18055,7 +18055,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, try, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18097,7 +18097,7 @@
                   inPlainSync()
                   listener: handleIdentifier(typedef, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, typedef, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18139,7 +18139,7 @@
                     inPlainSync()
                     listener: handleIdentifier(typedef, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, typedef, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18191,7 +18191,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18235,7 +18235,7 @@
                     inPlainSync()
                     listener: handleIdentifier(typedef, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, typedef, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18287,7 +18287,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18339,7 +18339,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedef, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18382,7 +18382,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
                   listener: handleIdentifier(var, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, var, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, var, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18425,7 +18425,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
                     listener: handleIdentifier(var, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, var, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18478,7 +18478,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18523,7 +18523,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
                     listener: handleIdentifier(var, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, var, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18576,7 +18576,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18629,7 +18629,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, var, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18672,7 +18672,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
                   listener: handleIdentifier(void, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, void, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, void, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18715,7 +18715,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
                     listener: handleIdentifier(void, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, void, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18768,7 +18768,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18813,7 +18813,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
                     listener: handleIdentifier(void, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, void, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18866,7 +18866,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18919,7 +18919,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, void, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18962,7 +18962,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
                   listener: handleIdentifier(while, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, while, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, while, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -19005,7 +19005,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
                     listener: handleIdentifier(while, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, while, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19058,7 +19058,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19103,7 +19103,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
                     listener: handleIdentifier(while, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, while, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19156,7 +19156,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19209,7 +19209,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, while, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19252,7 +19252,7 @@
                     listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                   listener: handleIdentifier(with, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, with, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, with, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -19295,7 +19295,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                     listener: handleIdentifier(with, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, with, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19348,7 +19348,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19393,7 +19393,7 @@
                       listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                     listener: handleIdentifier(with, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, with, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19446,7 +19446,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19499,7 +19499,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, with, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19541,7 +19541,7 @@
                   inPlainSync()
                   listener: handleIdentifier(yield, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, yield, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -19583,7 +19583,7 @@
                     inPlainSync()
                     listener: handleIdentifier(yield, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, yield, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19635,7 +19635,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19679,7 +19679,7 @@
                     inPlainSync()
                     listener: handleIdentifier(yield, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, yield, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19731,7 +19731,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19783,7 +19783,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yield, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.expect
index 4f09074..402c2ea 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(int, null)
           handleIdentifier(abstractX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -39,7 +39,7 @@
             handleType(int, null)
             handleIdentifier(abstractX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -67,7 +67,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -92,7 +92,7 @@
             handleType(int, null)
             handleIdentifier(abstractX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -120,7 +120,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -148,7 +148,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -172,7 +172,7 @@
           handleType(int, null)
           handleIdentifier(asX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, asX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -196,7 +196,7 @@
             handleType(int, null)
             handleIdentifier(asX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, asX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -224,7 +224,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -249,7 +249,7 @@
             handleType(int, null)
             handleIdentifier(asX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, asX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -277,7 +277,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -305,7 +305,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -329,7 +329,7 @@
           handleType(int, null)
           handleIdentifier(assertX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, assertX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -353,7 +353,7 @@
             handleType(int, null)
             handleIdentifier(assertX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, assertX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -381,7 +381,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -406,7 +406,7 @@
             handleType(int, null)
             handleIdentifier(assertX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, assertX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -434,7 +434,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -462,7 +462,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -486,7 +486,7 @@
           handleType(int, null)
           handleIdentifier(asyncX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -510,7 +510,7 @@
             handleType(int, null)
             handleIdentifier(asyncX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -538,7 +538,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -563,7 +563,7 @@
             handleType(int, null)
             handleIdentifier(asyncX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -591,7 +591,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -619,7 +619,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -643,7 +643,7 @@
           handleType(int, null)
           handleIdentifier(awaitX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -667,7 +667,7 @@
             handleType(int, null)
             handleIdentifier(awaitX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -695,7 +695,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -720,7 +720,7 @@
             handleType(int, null)
             handleIdentifier(awaitX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -748,7 +748,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -776,7 +776,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -800,7 +800,7 @@
           handleType(int, null)
           handleIdentifier(breakX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, breakX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -824,7 +824,7 @@
             handleType(int, null)
             handleIdentifier(breakX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, breakX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -852,7 +852,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -877,7 +877,7 @@
             handleType(int, null)
             handleIdentifier(breakX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, breakX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -905,7 +905,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -933,7 +933,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -957,7 +957,7 @@
           handleType(int, null)
           handleIdentifier(caseX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, caseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -981,7 +981,7 @@
             handleType(int, null)
             handleIdentifier(caseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, caseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1009,7 +1009,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1034,7 +1034,7 @@
             handleType(int, null)
             handleIdentifier(caseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, caseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1062,7 +1062,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1090,7 +1090,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1114,7 +1114,7 @@
           handleType(int, null)
           handleIdentifier(catchX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, catchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1138,7 +1138,7 @@
             handleType(int, null)
             handleIdentifier(catchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, catchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1166,7 +1166,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1191,7 +1191,7 @@
             handleType(int, null)
             handleIdentifier(catchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, catchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1219,7 +1219,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1247,7 +1247,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1271,7 +1271,7 @@
           handleType(int, null)
           handleIdentifier(classX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, classX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1295,7 +1295,7 @@
             handleType(int, null)
             handleIdentifier(classX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, classX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1323,7 +1323,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1348,7 +1348,7 @@
             handleType(int, null)
             handleIdentifier(classX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, classX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1376,7 +1376,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1404,7 +1404,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1428,7 +1428,7 @@
           handleType(int, null)
           handleIdentifier(constX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, constX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1452,7 +1452,7 @@
             handleType(int, null)
             handleIdentifier(constX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, constX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1480,7 +1480,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1505,7 +1505,7 @@
             handleType(int, null)
             handleIdentifier(constX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, constX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1533,7 +1533,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1561,7 +1561,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1585,7 +1585,7 @@
           handleType(int, null)
           handleIdentifier(continueX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, continueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1609,7 +1609,7 @@
             handleType(int, null)
             handleIdentifier(continueX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, continueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1637,7 +1637,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1662,7 +1662,7 @@
             handleType(int, null)
             handleIdentifier(continueX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, continueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1690,7 +1690,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1718,7 +1718,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1742,7 +1742,7 @@
           handleType(int, null)
           handleIdentifier(covariantX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1766,7 +1766,7 @@
             handleType(int, null)
             handleIdentifier(covariantX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1794,7 +1794,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1819,7 +1819,7 @@
             handleType(int, null)
             handleIdentifier(covariantX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1847,7 +1847,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1875,7 +1875,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1899,7 +1899,7 @@
           handleType(int, null)
           handleIdentifier(defaultX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1923,7 +1923,7 @@
             handleType(int, null)
             handleIdentifier(defaultX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1951,7 +1951,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -1976,7 +1976,7 @@
             handleType(int, null)
             handleIdentifier(defaultX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2004,7 +2004,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2032,7 +2032,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2056,7 +2056,7 @@
           handleType(int, null)
           handleIdentifier(deferredX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2080,7 +2080,7 @@
             handleType(int, null)
             handleIdentifier(deferredX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2108,7 +2108,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2133,7 +2133,7 @@
             handleType(int, null)
             handleIdentifier(deferredX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2161,7 +2161,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2189,7 +2189,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2213,7 +2213,7 @@
           handleType(int, null)
           handleIdentifier(doX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, doX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2237,7 +2237,7 @@
             handleType(int, null)
             handleIdentifier(doX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, doX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2265,7 +2265,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2290,7 +2290,7 @@
             handleType(int, null)
             handleIdentifier(doX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, doX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2318,7 +2318,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2346,7 +2346,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2370,7 +2370,7 @@
           handleType(int, null)
           handleIdentifier(dynamicX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2394,7 +2394,7 @@
             handleType(int, null)
             handleIdentifier(dynamicX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2422,7 +2422,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2447,7 +2447,7 @@
             handleType(int, null)
             handleIdentifier(dynamicX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2475,7 +2475,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2503,7 +2503,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2527,7 +2527,7 @@
           handleType(int, null)
           handleIdentifier(elseX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, elseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2551,7 +2551,7 @@
             handleType(int, null)
             handleIdentifier(elseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, elseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2579,7 +2579,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2604,7 +2604,7 @@
             handleType(int, null)
             handleIdentifier(elseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, elseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2632,7 +2632,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2660,7 +2660,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2684,7 +2684,7 @@
           handleType(int, null)
           handleIdentifier(enumX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, enumX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2708,7 +2708,7 @@
             handleType(int, null)
             handleIdentifier(enumX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, enumX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2736,7 +2736,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2761,7 +2761,7 @@
             handleType(int, null)
             handleIdentifier(enumX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, enumX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2789,7 +2789,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2817,7 +2817,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2841,7 +2841,7 @@
           handleType(int, null)
           handleIdentifier(exportX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, exportX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2865,7 +2865,7 @@
             handleType(int, null)
             handleIdentifier(exportX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, exportX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2893,7 +2893,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2918,7 +2918,7 @@
             handleType(int, null)
             handleIdentifier(exportX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, exportX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2946,7 +2946,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2974,7 +2974,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -2998,7 +2998,7 @@
           handleType(int, null)
           handleIdentifier(extendsX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3022,7 +3022,7 @@
             handleType(int, null)
             handleIdentifier(extendsX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3050,7 +3050,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3075,7 +3075,7 @@
             handleType(int, null)
             handleIdentifier(extendsX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3103,7 +3103,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3131,7 +3131,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3155,7 +3155,7 @@
           handleType(int, null)
           handleIdentifier(extensionX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3179,7 +3179,7 @@
             handleType(int, null)
             handleIdentifier(extensionX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3207,7 +3207,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3232,7 +3232,7 @@
             handleType(int, null)
             handleIdentifier(extensionX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3260,7 +3260,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3288,7 +3288,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3312,7 +3312,7 @@
           handleType(int, null)
           handleIdentifier(externalX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, externalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3336,7 +3336,7 @@
             handleType(int, null)
             handleIdentifier(externalX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, externalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3364,7 +3364,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3389,7 +3389,7 @@
             handleType(int, null)
             handleIdentifier(externalX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, externalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3417,7 +3417,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3445,7 +3445,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3469,7 +3469,7 @@
           handleType(int, null)
           handleIdentifier(factoryX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3493,7 +3493,7 @@
             handleType(int, null)
             handleIdentifier(factoryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3521,7 +3521,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3546,7 +3546,7 @@
             handleType(int, null)
             handleIdentifier(factoryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3574,7 +3574,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3602,7 +3602,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3626,7 +3626,7 @@
           handleType(int, null)
           handleIdentifier(falseX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, falseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3650,7 +3650,7 @@
             handleType(int, null)
             handleIdentifier(falseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, falseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3678,7 +3678,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3703,7 +3703,7 @@
             handleType(int, null)
             handleIdentifier(falseX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, falseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3731,7 +3731,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3759,7 +3759,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3783,7 +3783,7 @@
           handleType(int, null)
           handleIdentifier(finalX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, finalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3807,7 +3807,7 @@
             handleType(int, null)
             handleIdentifier(finalX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, finalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3835,7 +3835,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3860,7 +3860,7 @@
             handleType(int, null)
             handleIdentifier(finalX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, finalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3888,7 +3888,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3916,7 +3916,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3940,7 +3940,7 @@
           handleType(int, null)
           handleIdentifier(finallyX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3964,7 +3964,7 @@
             handleType(int, null)
             handleIdentifier(finallyX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -3992,7 +3992,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4017,7 +4017,7 @@
             handleType(int, null)
             handleIdentifier(finallyX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4045,7 +4045,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4073,7 +4073,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4097,7 +4097,7 @@
           handleType(int, null)
           handleIdentifier(forX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, forX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4121,7 +4121,7 @@
             handleType(int, null)
             handleIdentifier(forX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, forX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4149,7 +4149,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4174,7 +4174,7 @@
             handleType(int, null)
             handleIdentifier(forX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, forX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4202,7 +4202,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4230,7 +4230,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4254,7 +4254,7 @@
           handleType(int, null)
           handleIdentifier(FunctionX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4278,7 +4278,7 @@
             handleType(int, null)
             handleIdentifier(FunctionX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4306,7 +4306,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4331,7 +4331,7 @@
             handleType(int, null)
             handleIdentifier(FunctionX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4359,7 +4359,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4387,7 +4387,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4411,7 +4411,7 @@
           handleType(int, null)
           handleIdentifier(getX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, getX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4435,7 +4435,7 @@
             handleType(int, null)
             handleIdentifier(getX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, getX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4463,7 +4463,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4488,7 +4488,7 @@
             handleType(int, null)
             handleIdentifier(getX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, getX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4516,7 +4516,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4544,7 +4544,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4568,7 +4568,7 @@
           handleType(int, null)
           handleIdentifier(hideX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, hideX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4592,7 +4592,7 @@
             handleType(int, null)
             handleIdentifier(hideX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, hideX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4620,7 +4620,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4645,7 +4645,7 @@
             handleType(int, null)
             handleIdentifier(hideX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, hideX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4673,7 +4673,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4701,7 +4701,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4725,7 +4725,7 @@
           handleType(int, null)
           handleIdentifier(ifX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, ifX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4749,7 +4749,7 @@
             handleType(int, null)
             handleIdentifier(ifX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, ifX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4777,7 +4777,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4802,7 +4802,7 @@
             handleType(int, null)
             handleIdentifier(ifX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, ifX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4830,7 +4830,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4858,7 +4858,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4882,7 +4882,7 @@
           handleType(int, null)
           handleIdentifier(implementsX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4906,7 +4906,7 @@
             handleType(int, null)
             handleIdentifier(implementsX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4934,7 +4934,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4959,7 +4959,7 @@
             handleType(int, null)
             handleIdentifier(implementsX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -4987,7 +4987,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5015,7 +5015,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5039,7 +5039,7 @@
           handleType(int, null)
           handleIdentifier(importX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, importX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5063,7 +5063,7 @@
             handleType(int, null)
             handleIdentifier(importX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, importX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5091,7 +5091,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5116,7 +5116,7 @@
             handleType(int, null)
             handleIdentifier(importX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, importX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5144,7 +5144,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5172,7 +5172,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5196,7 +5196,7 @@
           handleType(int, null)
           handleIdentifier(inX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, inX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5220,7 +5220,7 @@
             handleType(int, null)
             handleIdentifier(inX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, inX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5248,7 +5248,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5273,7 +5273,7 @@
             handleType(int, null)
             handleIdentifier(inX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, inX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5301,7 +5301,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5329,7 +5329,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5353,7 +5353,7 @@
           handleType(int, null)
           handleIdentifier(inoutX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5377,7 +5377,7 @@
             handleType(int, null)
             handleIdentifier(inoutX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5405,7 +5405,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5430,7 +5430,7 @@
             handleType(int, null)
             handleIdentifier(inoutX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5458,7 +5458,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5486,7 +5486,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5510,7 +5510,7 @@
           handleType(int, null)
           handleIdentifier(interfaceX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5534,7 +5534,7 @@
             handleType(int, null)
             handleIdentifier(interfaceX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5562,7 +5562,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5587,7 +5587,7 @@
             handleType(int, null)
             handleIdentifier(interfaceX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5615,7 +5615,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5643,7 +5643,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5667,7 +5667,7 @@
           handleType(int, null)
           handleIdentifier(isX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, isX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5691,7 +5691,7 @@
             handleType(int, null)
             handleIdentifier(isX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, isX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5719,7 +5719,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5744,7 +5744,7 @@
             handleType(int, null)
             handleIdentifier(isX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, isX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5772,7 +5772,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5800,7 +5800,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5824,7 +5824,7 @@
           handleType(int, null)
           handleIdentifier(lateX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, lateX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -5848,7 +5848,7 @@
             handleType(int, null)
             handleIdentifier(lateX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, lateX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5876,7 +5876,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5901,7 +5901,7 @@
             handleType(int, null)
             handleIdentifier(lateX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, lateX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5929,7 +5929,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5957,7 +5957,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -5981,7 +5981,7 @@
           handleType(int, null)
           handleIdentifier(libraryX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6005,7 +6005,7 @@
             handleType(int, null)
             handleIdentifier(libraryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6033,7 +6033,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6058,7 +6058,7 @@
             handleType(int, null)
             handleIdentifier(libraryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6086,7 +6086,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6114,7 +6114,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6138,7 +6138,7 @@
           handleType(int, null)
           handleIdentifier(mixinX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6162,7 +6162,7 @@
             handleType(int, null)
             handleIdentifier(mixinX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6190,7 +6190,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6215,7 +6215,7 @@
             handleType(int, null)
             handleIdentifier(mixinX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6243,7 +6243,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6271,7 +6271,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6295,7 +6295,7 @@
           handleType(int, null)
           handleIdentifier(nativeX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6319,7 +6319,7 @@
             handleType(int, null)
             handleIdentifier(nativeX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6347,7 +6347,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6372,7 +6372,7 @@
             handleType(int, null)
             handleIdentifier(nativeX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6400,7 +6400,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6428,7 +6428,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6452,7 +6452,7 @@
           handleType(int, null)
           handleIdentifier(newX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, newX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6476,7 +6476,7 @@
             handleType(int, null)
             handleIdentifier(newX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, newX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6504,7 +6504,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6529,7 +6529,7 @@
             handleType(int, null)
             handleIdentifier(newX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, newX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6557,7 +6557,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6585,7 +6585,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6609,7 +6609,7 @@
           handleType(int, null)
           handleIdentifier(nullX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, nullX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6633,7 +6633,7 @@
             handleType(int, null)
             handleIdentifier(nullX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, nullX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6661,7 +6661,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6686,7 +6686,7 @@
             handleType(int, null)
             handleIdentifier(nullX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, nullX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6714,7 +6714,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6742,7 +6742,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6766,7 +6766,7 @@
           handleType(int, null)
           handleIdentifier(ofX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, ofX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6790,7 +6790,7 @@
             handleType(int, null)
             handleIdentifier(ofX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, ofX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6818,7 +6818,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6843,7 +6843,7 @@
             handleType(int, null)
             handleIdentifier(ofX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, ofX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6871,7 +6871,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6899,7 +6899,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6923,7 +6923,7 @@
           handleType(int, null)
           handleIdentifier(onX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -6947,7 +6947,7 @@
             handleType(int, null)
             handleIdentifier(onX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, onX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -6975,7 +6975,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7000,7 +7000,7 @@
             handleType(int, null)
             handleIdentifier(onX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, onX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7028,7 +7028,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7056,7 +7056,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7080,7 +7080,7 @@
           handleType(int, null)
           handleIdentifier(operatorX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7104,7 +7104,7 @@
             handleType(int, null)
             handleIdentifier(operatorX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7132,7 +7132,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7157,7 +7157,7 @@
             handleType(int, null)
             handleIdentifier(operatorX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7185,7 +7185,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7213,7 +7213,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7237,7 +7237,7 @@
           handleType(int, null)
           handleIdentifier(outX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, outX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7261,7 +7261,7 @@
             handleType(int, null)
             handleIdentifier(outX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, outX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7289,7 +7289,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7314,7 +7314,7 @@
             handleType(int, null)
             handleIdentifier(outX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, outX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7342,7 +7342,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7370,7 +7370,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7394,7 +7394,7 @@
           handleType(int, null)
           handleIdentifier(partX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, partX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7418,7 +7418,7 @@
             handleType(int, null)
             handleIdentifier(partX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, partX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7446,7 +7446,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7471,7 +7471,7 @@
             handleType(int, null)
             handleIdentifier(partX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, partX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7499,7 +7499,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7527,7 +7527,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7551,7 +7551,7 @@
           handleType(int, null)
           handleIdentifier(patchX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, patchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7575,7 +7575,7 @@
             handleType(int, null)
             handleIdentifier(patchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, patchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7603,7 +7603,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7628,7 +7628,7 @@
             handleType(int, null)
             handleIdentifier(patchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, patchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7656,7 +7656,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7684,7 +7684,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7708,7 +7708,7 @@
           handleType(int, null)
           handleIdentifier(requiredX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7732,7 +7732,7 @@
             handleType(int, null)
             handleIdentifier(requiredX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7760,7 +7760,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7785,7 +7785,7 @@
             handleType(int, null)
             handleIdentifier(requiredX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7813,7 +7813,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7841,7 +7841,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7865,7 +7865,7 @@
           handleType(int, null)
           handleIdentifier(rethrowX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -7889,7 +7889,7 @@
             handleType(int, null)
             handleIdentifier(rethrowX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7917,7 +7917,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7942,7 +7942,7 @@
             handleType(int, null)
             handleIdentifier(rethrowX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7970,7 +7970,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -7998,7 +7998,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8022,7 +8022,7 @@
           handleType(int, null)
           handleIdentifier(returnX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, returnX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8046,7 +8046,7 @@
             handleType(int, null)
             handleIdentifier(returnX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, returnX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8074,7 +8074,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8099,7 +8099,7 @@
             handleType(int, null)
             handleIdentifier(returnX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, returnX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8127,7 +8127,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8155,7 +8155,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8179,7 +8179,7 @@
           handleType(int, null)
           handleIdentifier(setX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, setX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8203,7 +8203,7 @@
             handleType(int, null)
             handleIdentifier(setX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, setX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8231,7 +8231,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8256,7 +8256,7 @@
             handleType(int, null)
             handleIdentifier(setX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, setX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8284,7 +8284,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8312,7 +8312,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8336,7 +8336,7 @@
           handleType(int, null)
           handleIdentifier(showX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, showX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8360,7 +8360,7 @@
             handleType(int, null)
             handleIdentifier(showX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, showX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8388,7 +8388,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8413,7 +8413,7 @@
             handleType(int, null)
             handleIdentifier(showX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, showX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8441,7 +8441,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8469,7 +8469,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8493,7 +8493,7 @@
           handleType(int, null)
           handleIdentifier(sourceX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8517,7 +8517,7 @@
             handleType(int, null)
             handleIdentifier(sourceX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8545,7 +8545,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8570,7 +8570,7 @@
             handleType(int, null)
             handleIdentifier(sourceX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8598,7 +8598,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8626,7 +8626,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8650,7 +8650,7 @@
           handleType(int, null)
           handleIdentifier(staticX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, staticX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8674,7 +8674,7 @@
             handleType(int, null)
             handleIdentifier(staticX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, staticX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8702,7 +8702,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8727,7 +8727,7 @@
             handleType(int, null)
             handleIdentifier(staticX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, staticX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8755,7 +8755,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8783,7 +8783,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8807,7 +8807,7 @@
           handleType(int, null)
           handleIdentifier(superX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, superX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8831,7 +8831,7 @@
             handleType(int, null)
             handleIdentifier(superX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, superX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8859,7 +8859,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8884,7 +8884,7 @@
             handleType(int, null)
             handleIdentifier(superX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, superX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8912,7 +8912,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8940,7 +8940,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -8964,7 +8964,7 @@
           handleType(int, null)
           handleIdentifier(switchX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, switchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -8988,7 +8988,7 @@
             handleType(int, null)
             handleIdentifier(switchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, switchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9016,7 +9016,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9041,7 +9041,7 @@
             handleType(int, null)
             handleIdentifier(switchX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, switchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9069,7 +9069,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9097,7 +9097,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9121,7 +9121,7 @@
           handleType(int, null)
           handleIdentifier(syncX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, syncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9145,7 +9145,7 @@
             handleType(int, null)
             handleIdentifier(syncX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, syncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9173,7 +9173,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9198,7 +9198,7 @@
             handleType(int, null)
             handleIdentifier(syncX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, syncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9226,7 +9226,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9254,7 +9254,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9278,7 +9278,7 @@
           handleType(int, null)
           handleIdentifier(thisX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, thisX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9302,7 +9302,7 @@
             handleType(int, null)
             handleIdentifier(thisX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, thisX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9330,7 +9330,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9355,7 +9355,7 @@
             handleType(int, null)
             handleIdentifier(thisX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, thisX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9383,7 +9383,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9411,7 +9411,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9435,7 +9435,7 @@
           handleType(int, null)
           handleIdentifier(throwX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, throwX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9459,7 +9459,7 @@
             handleType(int, null)
             handleIdentifier(throwX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, throwX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9487,7 +9487,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9512,7 +9512,7 @@
             handleType(int, null)
             handleIdentifier(throwX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, throwX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9540,7 +9540,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9568,7 +9568,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9592,7 +9592,7 @@
           handleType(int, null)
           handleIdentifier(trueX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, trueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9616,7 +9616,7 @@
             handleType(int, null)
             handleIdentifier(trueX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, trueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9644,7 +9644,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9669,7 +9669,7 @@
             handleType(int, null)
             handleIdentifier(trueX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, trueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9697,7 +9697,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9725,7 +9725,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9749,7 +9749,7 @@
           handleType(int, null)
           handleIdentifier(tryX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, tryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9773,7 +9773,7 @@
             handleType(int, null)
             handleIdentifier(tryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, tryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9801,7 +9801,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9826,7 +9826,7 @@
             handleType(int, null)
             handleIdentifier(tryX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, tryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9854,7 +9854,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9882,7 +9882,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9906,7 +9906,7 @@
           handleType(int, null)
           handleIdentifier(typedefX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -9930,7 +9930,7 @@
             handleType(int, null)
             handleIdentifier(typedefX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9958,7 +9958,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -9983,7 +9983,7 @@
             handleType(int, null)
             handleIdentifier(typedefX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10011,7 +10011,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10039,7 +10039,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10063,7 +10063,7 @@
           handleType(int, null)
           handleIdentifier(varX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, varX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10087,7 +10087,7 @@
             handleType(int, null)
             handleIdentifier(varX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, varX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10115,7 +10115,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10140,7 +10140,7 @@
             handleType(int, null)
             handleIdentifier(varX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, varX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10168,7 +10168,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10196,7 +10196,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10220,7 +10220,7 @@
           handleType(int, null)
           handleIdentifier(voidX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, voidX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10244,7 +10244,7 @@
             handleType(int, null)
             handleIdentifier(voidX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, voidX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10272,7 +10272,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10297,7 +10297,7 @@
             handleType(int, null)
             handleIdentifier(voidX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, voidX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10325,7 +10325,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10353,7 +10353,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10377,7 +10377,7 @@
           handleType(int, null)
           handleIdentifier(whileX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, whileX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10401,7 +10401,7 @@
             handleType(int, null)
             handleIdentifier(whileX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, whileX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10429,7 +10429,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10454,7 +10454,7 @@
             handleType(int, null)
             handleIdentifier(whileX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, whileX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10482,7 +10482,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10510,7 +10510,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10534,7 +10534,7 @@
           handleType(int, null)
           handleIdentifier(withX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, withX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10558,7 +10558,7 @@
             handleType(int, null)
             handleIdentifier(withX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, withX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10586,7 +10586,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10611,7 +10611,7 @@
             handleType(int, null)
             handleIdentifier(withX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, withX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10639,7 +10639,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10667,7 +10667,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10691,7 +10691,7 @@
           handleType(int, null)
           handleIdentifier(yieldX, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -10715,7 +10715,7 @@
             handleType(int, null)
             handleIdentifier(yieldX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(])
-          endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10743,7 +10743,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, ])
-          endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, [, ])
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10768,7 +10768,7 @@
             handleType(int, null)
             handleIdentifier(yieldX, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10796,7 +10796,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(:, })
-          endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -10824,7 +10824,7 @@
               handleLiteralInt(42)
             endFormalParameterDefaultValueExpression()
             handleValuedFormalParameter(=, })
-          endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.intertwined.expect
index b1fa29a..639e26d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(abstractX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -71,7 +71,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(abstractX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -122,7 +122,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -165,7 +165,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(abstractX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, abstractX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -216,7 +216,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -267,7 +267,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, abstractX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -308,7 +308,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(asX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, asX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -349,7 +349,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(asX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, asX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -400,7 +400,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -443,7 +443,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(asX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, asX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -494,7 +494,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -545,7 +545,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -586,7 +586,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(assertX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, assertX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -627,7 +627,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(assertX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, assertX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -678,7 +678,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -721,7 +721,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(assertX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, assertX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -772,7 +772,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -823,7 +823,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, assertX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -864,7 +864,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(asyncX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -905,7 +905,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(asyncX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -956,7 +956,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -999,7 +999,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(asyncX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, asyncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1050,7 +1050,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1101,7 +1101,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, asyncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1142,7 +1142,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(awaitX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1183,7 +1183,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(awaitX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1234,7 +1234,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1277,7 +1277,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(awaitX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, awaitX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1328,7 +1328,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1379,7 +1379,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, awaitX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1420,7 +1420,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(breakX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, breakX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1461,7 +1461,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(breakX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, breakX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1512,7 +1512,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1555,7 +1555,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(breakX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, breakX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1606,7 +1606,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1657,7 +1657,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, breakX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1698,7 +1698,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(caseX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, caseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1739,7 +1739,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(caseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, caseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1790,7 +1790,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1833,7 +1833,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(caseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, caseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1884,7 +1884,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1935,7 +1935,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, caseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -1976,7 +1976,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(catchX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, catchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2017,7 +2017,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(catchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, catchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2068,7 +2068,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2111,7 +2111,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(catchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, catchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2162,7 +2162,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2213,7 +2213,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, catchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2254,7 +2254,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(classX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, classX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2295,7 +2295,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(classX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, classX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2346,7 +2346,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2389,7 +2389,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(classX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, classX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2440,7 +2440,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2491,7 +2491,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, classX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2532,7 +2532,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(constX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, constX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2573,7 +2573,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(constX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, constX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2624,7 +2624,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2667,7 +2667,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(constX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, constX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2718,7 +2718,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2769,7 +2769,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, constX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2810,7 +2810,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(continueX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, continueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2851,7 +2851,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(continueX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, continueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2902,7 +2902,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2945,7 +2945,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(continueX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, continueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -2996,7 +2996,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3047,7 +3047,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, continueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3088,7 +3088,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(covariantX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3129,7 +3129,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(covariantX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3180,7 +3180,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3223,7 +3223,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(covariantX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, covariantX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3274,7 +3274,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3325,7 +3325,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, covariantX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3366,7 +3366,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(defaultX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3407,7 +3407,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(defaultX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3458,7 +3458,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3501,7 +3501,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(defaultX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, defaultX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3552,7 +3552,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3603,7 +3603,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, defaultX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3644,7 +3644,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(deferredX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3685,7 +3685,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(deferredX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3736,7 +3736,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3779,7 +3779,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(deferredX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, deferredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3830,7 +3830,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3881,7 +3881,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, deferredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -3922,7 +3922,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(doX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, doX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3963,7 +3963,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(doX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, doX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4014,7 +4014,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4057,7 +4057,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(doX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, doX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4108,7 +4108,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4159,7 +4159,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, doX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4200,7 +4200,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(dynamicX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4241,7 +4241,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(dynamicX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4292,7 +4292,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4335,7 +4335,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(dynamicX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, dynamicX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4386,7 +4386,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4437,7 +4437,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, dynamicX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4478,7 +4478,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(elseX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, elseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4519,7 +4519,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(elseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, elseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4570,7 +4570,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4613,7 +4613,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(elseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, elseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4664,7 +4664,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4715,7 +4715,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, elseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4756,7 +4756,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(enumX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, enumX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4797,7 +4797,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(enumX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, enumX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4848,7 +4848,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4891,7 +4891,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(enumX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, enumX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4942,7 +4942,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -4993,7 +4993,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, enumX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5034,7 +5034,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(exportX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, exportX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5075,7 +5075,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(exportX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, exportX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5126,7 +5126,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5169,7 +5169,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(exportX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, exportX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5220,7 +5220,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5271,7 +5271,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, exportX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5312,7 +5312,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(extendsX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5353,7 +5353,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(extendsX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5404,7 +5404,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5447,7 +5447,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(extendsX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, extendsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5498,7 +5498,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5549,7 +5549,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extendsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5590,7 +5590,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(extensionX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5631,7 +5631,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(extensionX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5682,7 +5682,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5725,7 +5725,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(extensionX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, extensionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5776,7 +5776,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5827,7 +5827,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, extensionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5868,7 +5868,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(externalX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, externalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5909,7 +5909,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(externalX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, externalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -5960,7 +5960,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6003,7 +6003,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(externalX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, externalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6054,7 +6054,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6105,7 +6105,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, externalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6146,7 +6146,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(factoryX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6187,7 +6187,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(factoryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6238,7 +6238,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6281,7 +6281,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(factoryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, factoryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6332,7 +6332,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6383,7 +6383,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, factoryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6424,7 +6424,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(falseX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, falseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6465,7 +6465,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(falseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, falseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6516,7 +6516,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6559,7 +6559,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(falseX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, falseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6610,7 +6610,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6661,7 +6661,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, falseX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6702,7 +6702,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(finalX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, finalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6743,7 +6743,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(finalX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, finalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6794,7 +6794,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6837,7 +6837,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(finalX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, finalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6888,7 +6888,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6939,7 +6939,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finalX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -6980,7 +6980,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(finallyX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7021,7 +7021,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(finallyX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7072,7 +7072,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7115,7 +7115,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(finallyX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, finallyX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7166,7 +7166,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7217,7 +7217,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, finallyX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7258,7 +7258,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(forX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, forX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7299,7 +7299,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(forX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, forX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7350,7 +7350,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7393,7 +7393,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(forX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, forX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7444,7 +7444,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7495,7 +7495,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, forX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7536,7 +7536,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(FunctionX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7577,7 +7577,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(FunctionX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7628,7 +7628,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7671,7 +7671,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(FunctionX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, FunctionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7722,7 +7722,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7773,7 +7773,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, FunctionX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7814,7 +7814,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(getX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, getX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7855,7 +7855,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(getX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, getX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7906,7 +7906,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -7949,7 +7949,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(getX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, getX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8000,7 +8000,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8051,7 +8051,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, getX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8092,7 +8092,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(hideX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, hideX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8133,7 +8133,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(hideX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, hideX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8184,7 +8184,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8227,7 +8227,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(hideX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, hideX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8278,7 +8278,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8329,7 +8329,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, hideX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8370,7 +8370,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(ifX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, ifX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8411,7 +8411,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(ifX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, ifX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8462,7 +8462,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8505,7 +8505,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(ifX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, ifX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8556,7 +8556,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8607,7 +8607,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ifX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8648,7 +8648,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(implementsX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8689,7 +8689,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(implementsX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8740,7 +8740,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8783,7 +8783,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(implementsX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, implementsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8834,7 +8834,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8885,7 +8885,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, implementsX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -8926,7 +8926,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(importX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, importX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8967,7 +8967,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(importX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, importX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9018,7 +9018,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9061,7 +9061,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(importX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, importX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9112,7 +9112,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9163,7 +9163,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, importX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9204,7 +9204,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(inX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, inX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9245,7 +9245,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(inX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, inX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9296,7 +9296,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9339,7 +9339,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(inX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, inX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9390,7 +9390,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9441,7 +9441,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9482,7 +9482,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(inoutX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9523,7 +9523,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(inoutX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9574,7 +9574,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9617,7 +9617,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(inoutX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, inoutX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9668,7 +9668,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9719,7 +9719,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, inoutX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9760,7 +9760,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(interfaceX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9801,7 +9801,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(interfaceX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9852,7 +9852,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9895,7 +9895,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(interfaceX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, interfaceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9946,7 +9946,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -9997,7 +9997,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, interfaceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10038,7 +10038,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(isX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, isX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10079,7 +10079,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(isX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, isX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10130,7 +10130,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10173,7 +10173,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(isX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, isX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10224,7 +10224,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10275,7 +10275,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, isX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10316,7 +10316,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(lateX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, lateX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10357,7 +10357,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(lateX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, lateX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10408,7 +10408,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10451,7 +10451,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(lateX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, lateX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10502,7 +10502,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10553,7 +10553,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, lateX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10594,7 +10594,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(libraryX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10635,7 +10635,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(libraryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10686,7 +10686,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10729,7 +10729,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(libraryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, libraryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10780,7 +10780,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10831,7 +10831,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, libraryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10872,7 +10872,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(mixinX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10913,7 +10913,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(mixinX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -10964,7 +10964,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11007,7 +11007,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(mixinX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, mixinX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11058,7 +11058,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11109,7 +11109,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, mixinX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11150,7 +11150,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(nativeX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11191,7 +11191,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(nativeX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11242,7 +11242,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11285,7 +11285,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(nativeX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, nativeX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11336,7 +11336,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11387,7 +11387,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nativeX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11428,7 +11428,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(newX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, newX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11469,7 +11469,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(newX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, newX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11520,7 +11520,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11563,7 +11563,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(newX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, newX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11614,7 +11614,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11665,7 +11665,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, newX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11706,7 +11706,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(nullX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, nullX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -11747,7 +11747,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(nullX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, nullX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11798,7 +11798,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11841,7 +11841,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(nullX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, nullX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11892,7 +11892,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11943,7 +11943,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, nullX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -11984,7 +11984,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(ofX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, ofX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12025,7 +12025,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(ofX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, ofX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12076,7 +12076,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12119,7 +12119,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(ofX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, ofX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12170,7 +12170,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12221,7 +12221,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, ofX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12262,7 +12262,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(onX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12303,7 +12303,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(onX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, onX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12354,7 +12354,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12397,7 +12397,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(onX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, onX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12448,7 +12448,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12499,7 +12499,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, onX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12540,7 +12540,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(operatorX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12581,7 +12581,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(operatorX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12632,7 +12632,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12675,7 +12675,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(operatorX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, operatorX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12726,7 +12726,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12777,7 +12777,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, operatorX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12818,7 +12818,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(outX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, outX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -12859,7 +12859,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(outX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, outX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12910,7 +12910,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -12953,7 +12953,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(outX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, outX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13004,7 +13004,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13055,7 +13055,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, outX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13096,7 +13096,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(partX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, partX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13137,7 +13137,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(partX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, partX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13188,7 +13188,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13231,7 +13231,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(partX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, partX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13282,7 +13282,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13333,7 +13333,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, partX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13374,7 +13374,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(patchX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, patchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13415,7 +13415,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(patchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, patchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13466,7 +13466,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13509,7 +13509,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(patchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, patchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13560,7 +13560,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13611,7 +13611,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, patchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13652,7 +13652,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(requiredX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13693,7 +13693,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(requiredX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13744,7 +13744,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13787,7 +13787,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(requiredX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, requiredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13838,7 +13838,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13889,7 +13889,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, requiredX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -13930,7 +13930,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(rethrowX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -13971,7 +13971,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(rethrowX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14022,7 +14022,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14065,7 +14065,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(rethrowX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, rethrowX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14116,7 +14116,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14167,7 +14167,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, rethrowX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14208,7 +14208,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(returnX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, returnX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14249,7 +14249,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(returnX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, returnX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14300,7 +14300,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14343,7 +14343,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(returnX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, returnX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14394,7 +14394,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14445,7 +14445,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, returnX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14486,7 +14486,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(setX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, setX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14527,7 +14527,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(setX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, setX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14578,7 +14578,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14621,7 +14621,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(setX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, setX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14672,7 +14672,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14723,7 +14723,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, setX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14764,7 +14764,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(showX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, showX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -14805,7 +14805,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(showX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, showX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14856,7 +14856,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14899,7 +14899,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(showX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, showX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -14950,7 +14950,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15001,7 +15001,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, showX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15042,7 +15042,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(sourceX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15083,7 +15083,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(sourceX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15134,7 +15134,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15177,7 +15177,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(sourceX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, sourceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15228,7 +15228,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15279,7 +15279,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, sourceX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15320,7 +15320,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(staticX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, staticX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15361,7 +15361,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(staticX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, staticX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15412,7 +15412,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15455,7 +15455,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(staticX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, staticX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15506,7 +15506,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15557,7 +15557,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, staticX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15598,7 +15598,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(superX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, superX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15639,7 +15639,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(superX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, superX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15690,7 +15690,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15733,7 +15733,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(superX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, superX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15784,7 +15784,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15835,7 +15835,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, superX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15876,7 +15876,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(switchX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, switchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -15917,7 +15917,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(switchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, switchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -15968,7 +15968,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16011,7 +16011,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(switchX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, switchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16062,7 +16062,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16113,7 +16113,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, switchX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16154,7 +16154,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(syncX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, syncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16195,7 +16195,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(syncX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, syncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16246,7 +16246,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16289,7 +16289,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(syncX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, syncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16340,7 +16340,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16391,7 +16391,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, syncX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16432,7 +16432,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(thisX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, thisX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16473,7 +16473,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(thisX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, thisX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16524,7 +16524,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16567,7 +16567,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(thisX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, thisX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16618,7 +16618,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16669,7 +16669,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, thisX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16710,7 +16710,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(throwX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, throwX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -16751,7 +16751,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(throwX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, throwX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16802,7 +16802,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16845,7 +16845,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(throwX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, throwX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16896,7 +16896,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16947,7 +16947,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, throwX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -16988,7 +16988,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(trueX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, trueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17029,7 +17029,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(trueX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, trueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17080,7 +17080,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17123,7 +17123,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(trueX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, trueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17174,7 +17174,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17225,7 +17225,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, trueX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17266,7 +17266,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(tryX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, tryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17307,7 +17307,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(tryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, tryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17358,7 +17358,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17401,7 +17401,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(tryX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, tryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17452,7 +17452,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17503,7 +17503,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, tryX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17544,7 +17544,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(typedefX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17585,7 +17585,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(typedefX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17636,7 +17636,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17679,7 +17679,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(typedefX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, typedefX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17730,7 +17730,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17781,7 +17781,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, typedefX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17822,7 +17822,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(varX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, varX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -17863,7 +17863,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(varX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, varX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17914,7 +17914,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -17957,7 +17957,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(varX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, varX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18008,7 +18008,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18059,7 +18059,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, varX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18100,7 +18100,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(voidX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, voidX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18141,7 +18141,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(voidX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, voidX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18192,7 +18192,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18235,7 +18235,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(voidX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, voidX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18286,7 +18286,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18337,7 +18337,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, voidX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18378,7 +18378,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(whileX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, whileX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18419,7 +18419,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(whileX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, whileX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18470,7 +18470,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18513,7 +18513,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(whileX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, whileX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18564,7 +18564,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18615,7 +18615,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, whileX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18656,7 +18656,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(withX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, withX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18697,7 +18697,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(withX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, withX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18748,7 +18748,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18791,7 +18791,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(withX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, withX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18842,7 +18842,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18893,7 +18893,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, withX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -18934,7 +18934,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(yieldX, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -18975,7 +18975,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(yieldX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(])
-                  listener: endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19026,7 +19026,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, ])
-                  listener: endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalPositional, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, [, ])
               ensureCloseParen(], ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19069,7 +19069,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(yieldX, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, yieldX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19120,7 +19120,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(:, })
-                  listener: endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -19171,7 +19171,7 @@
                             listener: handleLiteralInt(42)
                   listener: endFormalParameterDefaultValueExpression()
                   listener: handleValuedFormalParameter(=, })
-                  listener: endFormalParameter(null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, yieldX, 42, 42, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
index 05ab92b..5b96bf3 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.expect
@@ -23,7 +23,7 @@
           handleNoType(()
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(class)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got 'class'., null, {lexeme: class}], class, class)
@@ -35,11 +35,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
index 69db077..0b284d4 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_formal_parameter_start_of_next_top_level.dart.intertwined.expect
@@ -29,7 +29,7 @@
                 ensureIdentifier((, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(class)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               rewriter()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
@@ -49,23 +49,23 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
index 076896b..85b9f18 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.expect
@@ -483,7 +483,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -540,7 +540,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -598,7 +598,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -653,7 +653,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -710,7 +710,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -768,7 +768,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -832,7 +832,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -891,7 +891,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -950,7 +950,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1009,7 +1009,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1072,7 +1072,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1135,7 +1135,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1193,7 +1193,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1251,7 +1251,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1309,7 +1309,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1382,7 +1382,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1440,7 +1440,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1509,7 +1509,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1567,7 +1567,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1625,7 +1625,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1683,7 +1683,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1740,7 +1740,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1797,7 +1797,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1855,7 +1855,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1913,7 +1913,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1999,7 +1999,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2058,7 +2058,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2136,7 +2136,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2193,7 +2193,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2250,7 +2250,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2308,7 +2308,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2377,7 +2377,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2434,7 +2434,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2492,7 +2492,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2550,7 +2550,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2607,7 +2607,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2665,7 +2665,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2732,7 +2732,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2789,7 +2789,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2846,7 +2846,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2903,7 +2903,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -2961,7 +2961,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3024,7 +3024,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3081,7 +3081,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3138,7 +3138,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3195,7 +3195,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3252,7 +3252,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3309,7 +3309,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3366,7 +3366,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3423,7 +3423,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3481,7 +3481,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3540,7 +3540,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3594,7 +3594,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3651,7 +3651,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3708,7 +3708,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3765,7 +3765,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3823,7 +3823,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3881,7 +3881,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -3951,7 +3951,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4009,7 +4009,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4067,7 +4067,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4122,7 +4122,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4180,7 +4180,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4246,7 +4246,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4304,7 +4304,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4390,7 +4390,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4476,7 +4476,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4546,7 +4546,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -4604,7 +4604,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
index 9c70513..bad4dea 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_top_level_methods.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -172,7 +172,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -316,7 +316,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -447,7 +447,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -587,7 +587,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -734,7 +734,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -909,7 +909,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1052,7 +1052,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1195,7 +1195,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1338,7 +1338,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1401,7 +1401,7 @@
                       parsePrimary(return, expression)
                         parseConstExpression(return)
                           listener: beginConstExpression(const)
-                          parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                          parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                             ensureIdentifier(const, constructorReference)
                               insertSyntheticIdentifier(const, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                 reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -1486,7 +1486,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1657,7 +1657,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1801,7 +1801,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1940,7 +1940,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2084,7 +2084,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2279,7 +2279,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2423,7 +2423,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2616,7 +2616,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2755,7 +2755,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2899,7 +2899,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3038,7 +3038,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3178,7 +3178,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3318,7 +3318,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3462,7 +3462,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3600,7 +3600,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3835,7 +3835,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -3978,7 +3978,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4184,7 +4184,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4324,7 +4324,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4464,7 +4464,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4608,7 +4608,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4785,7 +4785,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -4925,7 +4925,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5069,7 +5069,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5208,7 +5208,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5348,7 +5348,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5492,7 +5492,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5663,7 +5663,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5803,7 +5803,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -5943,7 +5943,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6083,7 +6083,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6227,7 +6227,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6291,7 +6291,7 @@
                         parseNewExpression(return)
                           isNextIdentifier(new)
                           listener: beginNewExpression(new)
-                          parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                          parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                             ensureIdentifier(new, constructorReference)
                               insertSyntheticIdentifier(new, constructorReference, message: Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}], messageOnToken: null)
                                 reportRecoverableError((, Message[ExpectedIdentifier, Expected an identifier, but got '('., Try inserting an identifier before '('., {lexeme: (}])
@@ -6376,7 +6376,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6510,7 +6510,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6650,7 +6650,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6790,7 +6790,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -6930,7 +6930,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7070,7 +7070,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7210,7 +7210,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7350,7 +7350,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7494,7 +7494,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7637,7 +7637,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7772,7 +7772,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -7912,7 +7912,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8052,7 +8052,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8192,7 +8192,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8336,7 +8336,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8473,7 +8473,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8659,7 +8659,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8801,7 +8801,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -8938,7 +8938,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9076,7 +9076,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9214,7 +9214,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9391,7 +9391,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9535,7 +9535,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -9770,7 +9770,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10006,7 +10006,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10187,7 +10187,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -10326,7 +10326,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
index 77d7a90..93da896 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -28,7 +28,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -53,7 +53,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -75,7 +75,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -100,7 +100,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -122,7 +122,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -147,7 +147,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -167,7 +167,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -190,7 +190,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -210,7 +210,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -233,7 +233,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -255,7 +255,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -280,7 +280,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -302,7 +302,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -327,7 +327,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -349,7 +349,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -374,7 +374,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -396,7 +396,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -421,7 +421,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -443,7 +443,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -468,7 +468,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -490,7 +490,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -515,7 +515,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -537,7 +537,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -562,7 +562,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -584,7 +584,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -609,7 +609,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -631,7 +631,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -656,7 +656,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -678,7 +678,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -703,7 +703,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -725,7 +725,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -750,7 +750,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -772,7 +772,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -797,7 +797,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -819,7 +819,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -844,7 +844,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -866,7 +866,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -891,7 +891,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -913,7 +913,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -938,7 +938,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -960,7 +960,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -985,7 +985,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1007,7 +1007,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1032,7 +1032,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1054,7 +1054,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1079,7 +1079,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1101,7 +1101,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1126,7 +1126,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1148,7 +1148,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1173,7 +1173,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1195,7 +1195,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1220,7 +1220,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1242,7 +1242,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1267,7 +1267,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1289,7 +1289,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1314,7 +1314,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1336,7 +1336,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1361,7 +1361,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1381,7 +1381,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1404,7 +1404,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1426,7 +1426,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1451,7 +1451,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1473,7 +1473,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1498,7 +1498,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1520,7 +1520,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1545,7 +1545,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1567,7 +1567,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1592,7 +1592,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1612,7 +1612,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1635,7 +1635,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1657,7 +1657,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1682,7 +1682,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1704,7 +1704,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1729,7 +1729,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1751,7 +1751,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1776,7 +1776,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1798,7 +1798,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1823,7 +1823,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1845,7 +1845,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1870,7 +1870,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1890,7 +1890,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1913,7 +1913,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1935,7 +1935,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1960,7 +1960,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1982,7 +1982,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2007,7 +2007,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2027,7 +2027,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2050,7 +2050,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2070,7 +2070,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2093,7 +2093,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2115,7 +2115,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2140,7 +2140,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2160,7 +2160,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2183,7 +2183,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2205,7 +2205,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2230,7 +2230,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2250,7 +2250,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2273,7 +2273,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2295,7 +2295,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2320,7 +2320,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2342,7 +2342,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2367,7 +2367,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2389,7 +2389,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2414,7 +2414,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2436,7 +2436,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2461,7 +2461,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2481,7 +2481,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2504,7 +2504,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2524,7 +2524,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2547,7 +2547,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2569,7 +2569,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2594,7 +2594,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2616,7 +2616,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2641,7 +2641,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2663,7 +2663,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2688,7 +2688,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2708,7 +2708,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2731,7 +2731,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2753,7 +2753,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2778,7 +2778,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2800,7 +2800,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2825,7 +2825,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2847,7 +2847,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2872,7 +2872,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2894,7 +2894,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2919,7 +2919,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2941,7 +2941,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2966,7 +2966,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -2988,7 +2988,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -3013,7 +3013,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -3035,7 +3035,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -3103,7 +3103,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -3125,7 +3125,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -3150,7 +3150,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -3172,7 +3172,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -3197,7 +3197,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -3217,7 +3217,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
index b1c728f..38ec0b6 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.expect
@@ -30,11 +30,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -103,7 +103,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
index f836250..eaf2a2d 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -71,7 +71,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -99,7 +99,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -140,7 +140,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -171,7 +171,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
index db4e1b4..ce905c8 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -73,7 +73,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
index e702d5a..74b3c11 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -67,7 +67,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -91,7 +91,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -128,7 +128,7 @@
                 listener: endClassMethod(get, int, =>, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
index b16f9b0..fe1e36e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.expect
@@ -26,11 +26,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(B, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, B)
+    beginClassDeclaration(class, null, null, B)
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -52,11 +52,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(M1, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, M1)
+    beginClassDeclaration(class, null, null, M1)
       handleNoType(M1)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(foo)
diff --git a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
index 56c4e3a..86fc4d7 100644
--- a/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/method_called_with_prime2.dart.intertwined.expect
@@ -6,23 +6,23 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(B, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, B)
+        listener: beginClassDeclaration(class, null, null, B)
         parseClass(B, class, class, B)
           parseClassHeaderOpt(B, class, class)
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(B)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(B, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -57,28 +57,28 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(M1, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, M1)
+        listener: beginClassDeclaration(class, null, null, M1)
         parseClass(M1, class, class, M1)
           parseClassHeaderOpt(M1, class, class)
             parseClassExtendsOpt(M1)
               listener: handleNoType(M1)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(M1)
+            parseClassWithClauseOpt(M1)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(M1)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(M1)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(M1, DeclarationKind.Class, M1)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, M1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, M1)
               parseMetadataStar({)
                 listener: beginMetadataStar(foo)
                 listener: endMetadataStar(0)
@@ -101,7 +101,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, foo, ;)
               listener: endMember()
             notEofOrValue(}, class)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, M1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, M1)
               parseMetadataStar(;)
                 listener: beginMetadataStar(class)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.expect
index 3f3e286..7790834 100644
--- a/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.expect
Binary files differ
diff --git a/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect
index c6b78bca..d506c5a 100644
--- a/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/utf_16_le_content.crash_dart.intertwined.expect
@@ -133,7 +133,7 @@
                 ensureIdentifier((, formalParameterDeclaration)
                   listener: handleIdentifier(c, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, c, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extension_named_type.dart.expect b/pkg/front_end/parser_testcases/extension_named_type.dart.expect
index f259fc6..3f37bf0 100644
--- a/pkg/front_end/parser_testcases/extension_named_type.dart.expect
+++ b/pkg/front_end/parser_testcases/extension_named_type.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -58,7 +58,7 @@
           handleType(A, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleIdentifier(type, expression)
diff --git a/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
index b13d6fc..39d1b6c 100644
--- a/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extension_named_type.dart.intertwined.expect
@@ -6,23 +6,23 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -34,7 +34,7 @@
     parseMetadataStar(})
       listener: beginMetadataStar(extension)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, extension, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, extension, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(}, extension)
       parseExtension(extension)
         listener: beginExtensionDeclarationPrelude(extension)
@@ -47,7 +47,7 @@
         parseClassOrMixinOrExtensionBody(A, DeclarationKind.Extension, type)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, method)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, type)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, type)
             parseMetadataStar({)
               listener: beginMetadataStar(method)
               listener: endMetadataStar(0)
@@ -111,7 +111,7 @@
                 ensureIdentifier(A, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -140,7 +140,7 @@
                                       parseNewExpression(()
                                         isNextIdentifier(new)
                                         listener: beginNewExpression(new)
-                                        parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                        parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                           ensureIdentifier(new, constructorReference)
                                             listener: handleIdentifier(A, constructorReference)
                                           listener: beginConstructorReference(A)
diff --git a/pkg/front_end/parser_testcases/extension_type.dart.expect b/pkg/front_end/parser_testcases/extension_type.dart.expect
index 34b0e66..2eb3be8 100644
--- a/pkg/front_end/parser_testcases/extension_type.dart.expect
+++ b/pkg/front_end/parser_testcases/extension_type.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect b/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
index eb48c9c..e59e494 100644
--- a/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extension_type.dart.intertwined.expect
@@ -6,23 +6,23 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -34,7 +34,7 @@
     parseMetadataStar(})
       listener: beginMetadataStar(extension)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, extension, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, extension, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(}, extension)
       parseExtension(extension)
         listener: beginExtensionDeclarationPrelude(extension)
diff --git a/pkg/front_end/parser_testcases/extensions/covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
index 8f6d478..01e24a9 100644
--- a/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/covariant.dart.expect
@@ -10,11 +10,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -25,13 +25,13 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables(extends)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments({)
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -64,7 +64,7 @@
                 handleType(A, null)
                 handleIdentifier(child, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
index af843af..1394b80 100644
--- a/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/covariant.dart.intertwined.expect
@@ -6,23 +6,23 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -34,14 +34,14 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables(extends)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -65,7 +65,7 @@
     parseMetadataStar(})
       listener: beginMetadataStar(extension)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, extension, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, extension, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(}, extension)
       parseExtension(extension)
         listener: beginExtensionDeclarationPrelude(extension)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, addChild)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(addChild)
               listener: endMetadataStar(0)
@@ -109,7 +109,7 @@
                       ensureIdentifier(A, formalParameterDeclaration)
                         listener: handleIdentifier(child, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
index e551ab3..9f907a0 100644
--- a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -19,13 +19,13 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables(extends)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments({)
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -57,7 +57,7 @@
                 handleType(A, null)
                 handleIdentifier(child, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
index fbe25b2..fa98447 100644
--- a/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/not_covariant.dart.intertwined.expect
@@ -6,23 +6,23 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -34,14 +34,14 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables(extends)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -65,7 +65,7 @@
     parseMetadataStar(})
       listener: beginMetadataStar(extension)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, extension, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, extension, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(}, extension)
       parseExtension(extension)
         listener: beginExtensionDeclarationPrelude(extension)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, addChild)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(addChild)
               listener: endMetadataStar(0)
@@ -107,7 +107,7 @@
                       ensureIdentifier(A, formalParameterDeclaration)
                         listener: handleIdentifier(child, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/extensions/static.dart.expect b/pkg/front_end/parser_testcases/extensions/static.dart.expect
index 10fc0d8..cb69c93 100644
--- a/pkg/front_end/parser_testcases/extensions/static.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/static.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -19,13 +19,13 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables(extends)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments({)
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -57,7 +57,7 @@
                 handleType(A, null)
                 handleIdentifier(child, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
+              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
index 815a5a1..ac55bc5 100644
--- a/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/static.dart.intertwined.expect
@@ -6,23 +6,23 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -34,14 +34,14 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables(extends)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -65,7 +65,7 @@
     parseMetadataStar(})
       listener: beginMetadataStar(extension)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, extension, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, extension, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(}, extension)
       parseExtension(extension)
         listener: beginExtensionDeclarationPrelude(extension)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, static)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(static)
               listener: endMetadataStar(0)
@@ -107,7 +107,7 @@
                       ensureIdentifier(A, formalParameterDeclaration)
                         listener: handleIdentifier(child, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
+                      listener: endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
index b0745de..8efa048 100644
--- a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
+++ b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.expect
@@ -10,11 +10,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -25,13 +25,13 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables(extends)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleIdentifier(A, typeReference)
       handleNoTypeArguments({)
       handleType(A, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -64,7 +64,7 @@
                 handleType(A, null)
                 handleIdentifier(child, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
+              endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
index a0f640c..ef95892 100644
--- a/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/extensions/static_covariant.dart.intertwined.expect
@@ -6,23 +6,23 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -34,14 +34,14 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables(extends)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
@@ -50,10 +50,10 @@
                 listener: handleNoTypeArguments({)
                 listener: handleType(A, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -65,7 +65,7 @@
     parseMetadataStar(})
       listener: beginMetadataStar(extension)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, extension, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, extension, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(}, extension)
       parseExtension(extension)
         listener: beginExtensionDeclarationPrelude(extension)
@@ -78,7 +78,7 @@
         parseClassOrMixinOrExtensionBody(C, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, static)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(static)
               listener: endMetadataStar(0)
@@ -109,7 +109,7 @@
                       ensureIdentifier(A, formalParameterDeclaration)
                         listener: handleIdentifier(child, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
+                      listener: endFormalParameter(null, null, null, child, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
index eb5a5c5..c8d6b3b 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(WrapperClass, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, WrapperClass)
+    beginClassDeclaration(class, null, null, WrapperClass)
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
index 1b1c156..1ec01c0 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_fields.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(WrapperClass, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, WrapperClass)
+        listener: beginClassDeclaration(class, null, null, WrapperClass)
         parseClass(WrapperClass, class, class, WrapperClass)
           parseClassHeaderOpt(WrapperClass, class, class)
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -51,7 +51,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -75,7 +75,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -99,7 +99,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -123,7 +123,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -147,7 +147,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -171,7 +171,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -195,7 +195,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -219,7 +219,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -243,7 +243,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -268,7 +268,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -292,7 +292,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -316,7 +316,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -340,7 +340,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -364,7 +364,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -389,7 +389,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -413,7 +413,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -462,7 +462,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -486,7 +486,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
index d1604a9..b89c4ab 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(WrapperClass, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, WrapperClass)
+    beginClassDeclaration(class, null, null, WrapperClass)
       handleNoType(WrapperClass)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -29,7 +29,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -84,7 +84,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -194,7 +194,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -249,7 +249,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -304,7 +304,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -359,7 +359,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -414,7 +414,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -469,7 +469,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -524,7 +524,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -579,7 +579,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -634,7 +634,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -689,7 +689,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -744,7 +744,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -799,7 +799,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -854,7 +854,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -909,7 +909,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -964,7 +964,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1019,7 +1019,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -1074,7 +1074,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
index 04a06f3..375106c 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_class_methods.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(WrapperClass, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, WrapperClass)
+        listener: beginClassDeclaration(class, null, null, WrapperClass)
         parseClass(WrapperClass, class, class, WrapperClass)
           parseClassHeaderOpt(WrapperClass, class, class)
             parseClassExtendsOpt(WrapperClass)
               listener: handleNoType(WrapperClass)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(WrapperClass)
+            parseClassWithClauseOpt(WrapperClass)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(WrapperClass)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(WrapperClass)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(WrapperClass, DeclarationKind.Class, WrapperClass)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, WrapperClass)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -164,7 +164,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -194,7 +194,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -301,7 +301,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -331,7 +331,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -438,7 +438,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -468,7 +468,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -575,7 +575,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -605,7 +605,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -712,7 +712,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -742,7 +742,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -849,7 +849,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -879,7 +879,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -986,7 +986,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1016,7 +1016,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1123,7 +1123,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1153,7 +1153,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1260,7 +1260,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1291,7 +1291,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1398,7 +1398,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1428,7 +1428,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1535,7 +1535,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1565,7 +1565,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1672,7 +1672,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1702,7 +1702,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1809,7 +1809,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1839,7 +1839,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -1946,7 +1946,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -1978,7 +1978,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2085,7 +2085,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2115,7 +2115,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2222,7 +2222,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2252,7 +2252,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2359,7 +2359,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2390,7 +2390,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2497,7 +2497,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2527,7 +2527,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -2634,7 +2634,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, WrapperClass)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, WrapperClass)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -2664,7 +2664,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.expect
index 024c844..0304d29 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.expect
@@ -17,7 +17,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -71,7 +71,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -125,7 +125,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -179,7 +179,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -233,7 +233,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -287,7 +287,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -341,7 +341,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -395,7 +395,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -449,7 +449,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -503,7 +503,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -557,7 +557,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -611,7 +611,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -665,7 +665,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -719,7 +719,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -773,7 +773,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -827,7 +827,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -881,7 +881,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -935,7 +935,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -989,7 +989,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -1043,7 +1043,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.intertwined.expect
index cdb944d..61e3d1b 100644
--- a/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/built_in_identifier_top_level_methods.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -165,7 +165,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -298,7 +298,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -431,7 +431,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -564,7 +564,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -697,7 +697,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -830,7 +830,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -963,7 +963,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1096,7 +1096,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1229,7 +1229,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1362,7 +1362,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1495,7 +1495,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1628,7 +1628,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1761,7 +1761,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -1894,7 +1894,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2027,7 +2027,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2160,7 +2160,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2293,7 +2293,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2426,7 +2426,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -2559,7 +2559,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_01.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_01.dart.expect
index fed7e21..339b30f 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_01.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_01.dart.intertwined.expect
index 10d1bd2..4db3219 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_01.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_02.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_02.dart.expect
index f68f942..920de7d 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_02.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_02.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_02.dart.intertwined.expect
index 5e65f72..07a9f87 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_02.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_03.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_03.dart.expect
index 8486437..f18f5e1 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_03.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_03.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_03.dart.intertwined.expect
index a3e6477..e4ee639 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_03.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_04.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_04.dart.expect
index d970ac1..a92ef45 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_04.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_04.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_04.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_04.dart.intertwined.expect
index a2161dd..ca056bd 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_04.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_04.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
index d74b313..b80b01b 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_05.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
index 0dff100..6b51be2 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_05.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
index 1155593..2738857 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_06.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
index 2c3bccc..e2e0d1a 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_06.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_07.dart.expect b/pkg/front_end/parser_testcases/general/chained_call_07.dart.expect
index 35f2f36..487dc8f 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_07.dart.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_07.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/chained_call_07.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/chained_call_07.dart.intertwined.expect
index f30bf4b..a4b6952 100644
--- a/pkg/front_end/parser_testcases/general/chained_call_07.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/chained_call_07.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
index 11e6ef5..b8955d7 100644
--- a/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/function_reference_following_token.dart.intertwined.expect
@@ -398,7 +398,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'ComplexTypeParamOrArgInfo')
                   listener: beginImplicitCreationExpression(f)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'ComplexTypeParamOrArgInfo')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'ComplexTypeParamOrArgInfo', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(f, constructorReference)
                     listener: beginConstructorReference(f)
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
index 3b9714d..ec7a398 100644
--- a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
@@ -614,7 +614,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -650,7 +650,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -690,7 +690,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -734,7 +734,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -778,7 +778,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -822,7 +822,7 @@
             endFunctionType(Function, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
index 1f25d5e..1615902 100644
--- a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -37,7 +37,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -72,7 +72,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -113,7 +113,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -158,7 +158,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -203,7 +203,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -248,7 +248,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -279,7 +279,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -314,7 +314,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -355,7 +355,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -400,7 +400,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -445,7 +445,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -490,7 +490,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -533,7 +533,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -580,7 +580,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -643,7 +643,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -710,7 +710,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -767,7 +767,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -824,7 +824,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -861,7 +861,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -871,7 +871,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -912,7 +912,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -922,7 +922,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -969,7 +969,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -979,7 +979,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1030,7 +1030,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1040,7 +1040,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1091,7 +1091,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1101,7 +1101,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1152,7 +1152,7 @@
               listener: endFunctionType(Function, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
diff --git a/pkg/front_end/parser_testcases/general/issue_41121.dart.expect b/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
index 494fec3..9132fd3 100644
--- a/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_41121.dart.expect
@@ -46,11 +46,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(ConfigurationService, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, ConfigurationService)
+    beginClassDeclaration(class, null, null, ConfigurationService)
       handleNoType(ConfigurationService)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Configuration)
@@ -80,7 +80,7 @@
                 handleType(Configuration, null)
                 handleIdentifier(configuration, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(assert)
@@ -127,7 +127,7 @@
                 handleType(Configuration, null)
                 handleIdentifier(configuration, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(assert)
@@ -275,11 +275,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Configuration, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Configuration)
+    beginClassDeclaration(class, null, null, Configuration)
       handleNoType(Configuration)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Configuration)
diff --git a/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
index cbffc96..d392486 100644
--- a/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_41121.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(ConfigurationService, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, ConfigurationService)
+        listener: beginClassDeclaration(class, null, null, ConfigurationService)
         parseClass(ConfigurationService, class, class, ConfigurationService)
           parseClassHeaderOpt(ConfigurationService, class, class)
             parseClassExtendsOpt(ConfigurationService)
               listener: handleNoType(ConfigurationService)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(ConfigurationService)
+            parseClassWithClauseOpt(ConfigurationService)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(ConfigurationService)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(ConfigurationService)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(ConfigurationService, DeclarationKind.Class, ConfigurationService)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar({)
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Configuration, ;)
               listener: endMember()
             notEofOrValue(}, ConfigurationService)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(;)
                 listener: beginMetadataStar(ConfigurationService)
                 listener: endMetadataStar(0)
@@ -73,7 +73,7 @@
                         ensureIdentifier(Configuration, formalParameterDeclaration)
                           listener: handleIdentifier(configuration, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -146,7 +146,7 @@
                 listener: endClassConstructor(null, ConfigurationService, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -173,7 +173,7 @@
                         ensureIdentifier(Configuration, formalParameterDeclaration)
                           listener: handleIdentifier(configuration, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -253,7 +253,7 @@
                 listener: endClassConstructor(set, void, (, :, })
               listener: endMember()
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
@@ -385,7 +385,7 @@
                 listener: endClassConstructor(get, Configuration, (, :, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -445,7 +445,7 @@
                 listener: endClassConstructor(null, void, (, :, })
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, ConfigurationService)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, ConfigurationService)
               parseMetadataStar(})
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -511,28 +511,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Configuration, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Configuration)
+        listener: beginClassDeclaration(class, null, null, Configuration)
         parseClass(Configuration, class, class, Configuration)
           parseClassHeaderOpt(Configuration, class, class)
             parseClassExtendsOpt(Configuration)
               listener: handleNoType(Configuration)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Configuration)
+            parseClassWithClauseOpt(Configuration)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Configuration)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Configuration)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Configuration, DeclarationKind.Class, Configuration)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Configuration)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Configuration)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Configuration)
               parseMetadataStar({)
                 listener: beginMetadataStar(Configuration)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart.expect b/pkg/front_end/parser_testcases/general/issue_45120.dart.expect
index dda69fa..be61163 100644
--- a/pkg/front_end/parser_testcases/general/issue_45120.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart.expect
@@ -79,7 +79,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -150,7 +150,7 @@
               handleType(int, null)
               handleIdentifier(y, formalParameterDeclaration)
               handleFormalParameterWithoutValue())
-            endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+            endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
           endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         endFunctionType(Function, ?)
         beginVariablesDeclaration(f, null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect
index 412b5a6..94b8325 100644
--- a/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45120.dart.intertwined.expect
@@ -28,7 +28,7 @@
               listener: endArguments(1, (, ))
         listener: endMetadata(@, null, typedef)
       listener: endMetadataStar(1)
-    parseTopLevelKeywordDeclaration(), typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(), typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(), typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -141,7 +141,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -272,7 +272,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(y, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+                        listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
                       listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
                   listener: endFunctionType(Function, ?)
                   listener: beginVariablesDeclaration(f, null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
index 9020ccd..56fea87 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
index 966c170..e11f90e 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -42,7 +42,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
index 53f02db..783ba33 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
index f5f9fc0..b3285c7 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_01_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -42,7 +42,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
index bbefeb2..bb09df4 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(bool, null)
           handleIdentifier(b2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
index 5d234d5..5267088 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -42,7 +42,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
index 71b505f..ee5784b 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(bool, null)
           handleIdentifier(b2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
index 0c2dc47..6809693 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_02_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -42,7 +42,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(3, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
index 6058857..2af7731 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(bool, null)
           handleIdentifier(b2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -94,7 +94,7 @@
           handleType(Object, null)
           handleIdentifier(p, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
index abf7863..2ceba23 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -42,7 +42,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -175,7 +175,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(p, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
index d5df020..ec48ff4 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(bool, null)
           handleIdentifier(b1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(bool, null)
           handleIdentifier(b2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -67,7 +67,7 @@
           handleType(int, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(int)
         endMetadataStar(0)
         beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
@@ -76,7 +76,7 @@
           handleType(int, null)
           handleIdentifier(y, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -85,7 +85,7 @@
           handleType(Object, null)
           handleIdentifier(o, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(Object)
         endMetadataStar(0)
         beginFormalParameter(Object, MemberKind.TopLevelMethod, null, null, null)
@@ -94,7 +94,7 @@
           handleType(Object, null)
           handleIdentifier(p, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
index 2f77140..48f9c8b 100644
--- a/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/issue_45848_03_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -42,7 +42,7 @@
                 ensureIdentifier(bool, formalParameterDeclaration)
                   listener: handleIdentifier(b2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -139,7 +139,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(int)
@@ -151,7 +151,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(y, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, y, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -163,7 +163,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(o, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(Object)
@@ -175,7 +175,7 @@
                 ensureIdentifier(Object, formalParameterDeclaration)
                   listener: handleIdentifier(p, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, p, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(4, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.expect b/pkg/front_end/parser_testcases/general/metadata.dart.expect
index eddf5e6..b86186a 100644
--- a/pkg/front_end/parser_testcases/general/metadata.dart.expect
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.expect
@@ -107,11 +107,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(X, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, X)
+    beginClassDeclaration(class, null, null, X)
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -168,7 +168,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -230,7 +230,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -295,7 +295,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -360,7 +360,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -431,7 +431,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -505,7 +505,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -582,7 +582,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -662,7 +662,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -745,7 +745,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -831,7 +831,7 @@
             handleType(int, null)
             handleNoName())
             handleFormalParameterWithoutValue())
-          endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+          endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
         endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
       endFunctionType(Function, null)
     endTypedef(typedef, =, ;)
@@ -939,11 +939,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Y, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Y)
+    beginClassDeclaration(class, null, null, Y)
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
index 905a217..3432673 100644
--- a/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/metadata.dart.intertwined.expect
@@ -228,23 +228,23 @@
               listener: endArguments(1, (, ))
         listener: endMetadata(@, ., class)
       listener: endMetadataStar(10)
-    parseTopLevelKeywordDeclaration(), class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(), class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(), class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(X, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, X)
+        listener: beginClassDeclaration(class, null, null, X)
         parseClass(X, class, class, X)
           parseClassHeaderOpt(X, class, class)
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -256,7 +256,7 @@
     parseMetadataStar(})
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(}, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -333,7 +333,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -343,7 +343,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -432,7 +432,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -442,7 +442,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -537,7 +537,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -547,7 +547,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -654,7 +654,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -664,7 +664,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -786,7 +786,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -796,7 +796,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -924,7 +924,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -934,7 +934,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1053,7 +1053,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1063,7 +1063,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1191,7 +1191,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1201,7 +1201,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1332,7 +1332,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1342,7 +1342,7 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(typedef)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, typedef, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(;, typedef)
       parseTypedef(typedef)
         listener: beginUncategorizedTopLevelDeclaration(typedef)
@@ -1482,7 +1482,7 @@
               listener: handleType(int, null)
               listener: handleNoName())
               listener: handleFormalParameterWithoutValue())
-              listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+              listener: endFormalParameter(null, null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
             listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
         listener: endFunctionType(Function, null)
         ensureSemicolon())
@@ -1713,23 +1713,23 @@
               listener: endArguments(1, (, ))
         listener: endMetadata(@, ., class)
       listener: endMetadataStar(9)
-    parseTopLevelKeywordDeclaration(), class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(), class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(), class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Y, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Y)
+        listener: beginClassDeclaration(class, null, null, Y)
         parseClass(Y, class, class, Y)
           parseClassHeaderOpt(Y, class, class)
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
index 97bcac4..419693a 100644
--- a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
+++ b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.expect
@@ -46,11 +46,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
@@ -147,11 +147,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(D, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, D)
+    beginClassDeclaration(class, null, null, D)
       handleNoType(D)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(factory)
diff --git a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
index 7af61b0..5976ef9 100644
--- a/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/new_as_identifier.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassConstructor(null, C, (, null, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -148,7 +148,7 @@
                 listener: endClassConstructor(null, C, (, :, })
               listener: endMember()
             notEofOrValue(}, new)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(new)
                 listener: endMetadataStar(0)
@@ -159,7 +159,7 @@
                 listener: handleInvalidMember(new)
                 listener: endMember()
             notEofOrValue(}, =)
-            parseClassOrMixinOrExtensionMemberImpl(new, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(new, DeclarationKind.Class, C)
               parseMetadataStar(new)
                 listener: beginMetadataStar(=)
                 listener: endMetadataStar(0)
@@ -204,7 +204,7 @@
                     listener: endClassMethod(null, operator, (, null, })
                   listener: endMember()
             notEofOrValue(}, null)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, C)
               parseMetadataStar(})
                 listener: beginMetadataStar(null)
                 listener: endMetadataStar(0)
@@ -215,7 +215,7 @@
                 listener: handleInvalidMember(null)
                 listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(null, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(null, DeclarationKind.Class, C)
               parseMetadataStar(null)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
@@ -233,28 +233,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(D, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, D)
+        listener: beginClassDeclaration(class, null, null, D)
         parseClass(D, class, class, D)
           parseClassHeaderOpt(D, class, class)
             parseClassExtendsOpt(D)
               listener: handleNoType(D)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(D)
+            parseClassWithClauseOpt(D)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(D)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(D)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(D, DeclarationKind.Class, D)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, D)
               parseMetadataStar({)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -305,7 +305,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -331,7 +331,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -350,7 +350,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -376,7 +376,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -396,7 +396,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -422,7 +422,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
@@ -442,7 +442,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, factory)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(factory)
                 listener: endMetadataStar(0)
@@ -468,7 +468,7 @@
                 inPlainSync()
                 parseRedirectingFactoryBody())
                   listener: beginRedirectingFactoryBody(=)
-                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null)
+                  parseConstructorReference(=, ConstructorReferenceContext.RedirectingFactory, null, false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
@@ -492,7 +492,7 @@
                 listener: endClassFactoryMethod(factory, factory, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -555,7 +555,7 @@
                 listener: endClassConstructor(null, D, (, :, ;)
               listener: endMember()
             notEofOrValue(}, D)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, D)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, D)
               parseMetadataStar(;)
                 listener: beginMetadataStar(D)
                 listener: endMetadataStar(0)
@@ -639,7 +639,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -680,7 +680,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -722,7 +722,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -764,7 +764,7 @@
                 parsePrimary(=, expression)
                   parseConstExpression(=)
                     listener: beginConstExpression(const)
-                    parseConstructorReference(const, ConstructorReferenceContext.Const, null)
+                    parseConstructorReference(const, ConstructorReferenceContext.Const, null, false)
                       ensureIdentifier(const, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -811,7 +811,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -853,7 +853,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(C, constructorReference)
                       listener: beginConstructorReference(C)
@@ -896,7 +896,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -939,7 +939,7 @@
                   parseNewExpression(=)
                     isNextIdentifier(new)
                     listener: beginNewExpression(new)
-                    parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                    parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                       ensureIdentifier(new, constructorReference)
                         listener: handleIdentifier(prefix, constructorReference)
                       listener: beginConstructorReference(prefix)
@@ -1030,7 +1030,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'SimpleTypeArgument1')
                   listener: beginImplicitCreationExpression(C)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(C, constructorReference)
                     listener: beginConstructorReference(C)
@@ -1128,7 +1128,7 @@
               parseUnaryExpression(=, true)
                 parseImplicitCreationExpression(=, <, Instance of 'SimpleTypeArgument1')
                   listener: beginImplicitCreationExpression(prefix)
-                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1')
+                  parseConstructorReference(=, ConstructorReferenceContext.Implicit, Instance of 'SimpleTypeArgument1', false)
                     ensureIdentifier(=, constructorReference)
                       listener: handleIdentifier(prefix, constructorReference)
                     listener: beginConstructorReference(prefix)
diff --git a/pkg/front_end/parser_testcases/general/operator_01.dart.expect b/pkg/front_end/parser_testcases/general/operator_01.dart.expect
index ff9df52..5c996b6 100644
--- a/pkg/front_end/parser_testcases/general/operator_01.dart.expect
+++ b/pkg/front_end/parser_testcases/general/operator_01.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(bool)
@@ -29,7 +29,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -58,7 +58,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -87,7 +87,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -116,7 +116,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -145,7 +145,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
index 1fe4197..21ad05a 100644
--- a/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/operator_01.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, bool)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(bool)
                 listener: endMetadataStar(0)
@@ -56,7 +56,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -85,7 +85,7 @@
                 listener: endClassMethod(null, bool, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -114,7 +114,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -143,7 +143,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, bool)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(bool)
                 listener: endMetadataStar(0)
@@ -172,7 +172,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -201,7 +201,7 @@
                 listener: endClassMethod(null, bool, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -230,7 +230,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -259,7 +259,7 @@
                 listener: endClassMethod(null, int, (, null, })
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -288,7 +288,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
index 90dae7d..52352ee 100644
--- a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.expect
@@ -11,11 +11,11 @@
     handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
     handleIdentifier(operator, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, operator)
+    beginClassDeclaration(class, null, null, operator)
       handleNoType(operator)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
@@ -34,7 +34,7 @@
                 handleType(int, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
index 48dee75..710f8db 100644
--- a/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/operator_hat_class.crash_dart.intertwined.expect
@@ -6,30 +6,30 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           reportRecoverableErrorWithToken(operator, Instance of 'Template<(Token) => Message>')
             listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
           listener: handleIdentifier(operator, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, operator)
+        listener: beginClassDeclaration(class, null, null, operator)
         parseClass(operator, class, class, operator)
           parseClassHeaderOpt(operator, class, class)
             parseClassExtendsOpt(operator)
               listener: handleNoType(operator)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(operator)
+            parseClassWithClauseOpt(operator)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(operator)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(operator)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(operator, DeclarationKind.Class, operator)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, operator)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, operator)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
@@ -56,7 +56,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/general/try_catch.dart.expect b/pkg/front_end/parser_testcases/general/try_catch.dart.expect
index ce7a345..72dfdce 100644
--- a/pkg/front_end/parser_testcases/general/try_catch.dart.expect
+++ b/pkg/front_end/parser_testcases/general/try_catch.dart.expect
@@ -21,14 +21,14 @@
                 handleNoType(()
                 handleIdentifier(e, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
               beginMetadataStar(s)
               endMetadataStar(0)
               beginFormalParameter(s, MemberKind.Catch, null, null, null)
                 handleNoType(,)
                 handleIdentifier(s, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+              endFormalParameter(null, null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
             endFormalParameters(2, (, ), MemberKind.Catch)
           endCatchClause({)
           beginBlock({, BlockKind(catch clause))
diff --git a/pkg/front_end/parser_testcases/general/try_catch.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/try_catch.dart.intertwined.expect
index 10d5b1e..ec37294 100644
--- a/pkg/front_end/parser_testcases/general/try_catch.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/general/try_catch.dart.intertwined.expect
@@ -49,7 +49,7 @@
                       ensureIdentifier((, formalParameterDeclaration)
                         listener: handleIdentifier(e, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue(,)
-                      listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
                     parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.Catch)
                       parseMetadataStar(,)
                         listener: beginMetadataStar(s)
@@ -59,7 +59,7 @@
                       ensureIdentifier(,, formalParameterDeclaration)
                         listener: handleIdentifier(s, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                      listener: endFormalParameter(null, null, null, s, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
                     listener: endFormalParameters(2, (, ), MemberKind.Catch)
                 listener: endCatchClause({)
                 parseBlock(), BlockKind(catch clause))
diff --git a/pkg/front_end/parser_testcases/macros/macro_class.dart b/pkg/front_end/parser_testcases/macros/macro_class.dart
new file mode 100644
index 0000000..02bfe1f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/macros/macro_class.dart
@@ -0,0 +1,4 @@
+macro class Class {}
+abstract macro class Class {}
+macro class Class = Object with Mixin;
+abstract macro class Class = Object with Mixin;
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/macros/macro_class.dart.expect b/pkg/front_end/parser_testcases/macros/macro_class.dart.expect
new file mode 100644
index 0000000..3198253
--- /dev/null
+++ b/pkg/front_end/parser_testcases/macros/macro_class.dart.expect
@@ -0,0 +1,66 @@
+beginCompilationUnit(macro)
+  beginMetadataStar(macro)
+  endMetadataStar(0)
+  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(Class, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, macro, Class)
+      handleNoType(Class)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(abstract)
+  beginMetadataStar(abstract)
+  endMetadataStar(0)
+  beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
+    handleIdentifier(Class, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(abstract, abstract, macro, Class)
+      handleNoType(Class)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleImplements(null, 0)
+      handleClassHeader(abstract, class, null)
+      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(abstract, })
+  endTopLevelDeclaration(macro)
+  beginMetadataStar(macro)
+  endMetadataStar(0)
+  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(Class, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, macro, Class)
+      handleIdentifier(Object, typeReference)
+      handleNoTypeArguments(with)
+      handleType(Object, null)
+      beginTypeList(Mixin)
+        handleIdentifier(Mixin, typeReference)
+        handleNoTypeArguments(;)
+        handleType(Mixin, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(abstract)
+  beginMetadataStar(abstract)
+  endMetadataStar(0)
+  beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
+    handleIdentifier(Class, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(abstract, abstract, macro, Class)
+      handleIdentifier(Object, typeReference)
+      handleNoTypeArguments(with)
+      handleType(Object, null)
+      beginTypeList(Mixin)
+        handleIdentifier(Mixin, typeReference)
+        handleNoTypeArguments(;)
+        handleType(Mixin, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(abstract, class, =, null, ;)
+  endTopLevelDeclaration()
+endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/macros/macro_class.dart.intertwined.expect b/pkg/front_end/parser_testcases/macros/macro_class.dart.intertwined.expect
new file mode 100644
index 0000000..08e38d8
--- /dev/null
+++ b/pkg/front_end/parser_testcases/macros/macro_class.dart.intertwined.expect
@@ -0,0 +1,118 @@
+parseUnit(macro)
+  skipErrorTokens(macro)
+  listener: beginCompilationUnit(macro)
+  syntheticPreviousToken(macro)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(macro)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, macro, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, macro)
+      parseClassOrNamedMixinApplication(null, macro, class)
+        listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Class, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, macro, Class)
+        parseClass(Class, class, class, Class)
+          parseClassHeaderOpt(Class, class, class)
+            parseClassExtendsOpt(Class)
+              listener: handleNoType(Class)
+              listener: handleClassExtends(null, 1)
+            parseClassWithClauseOpt(Class)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinOrEnumImplementsOpt(Class)
+              listener: handleImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(Class, DeclarationKind.Class, Class)
+            listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(abstract)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(abstract)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, macro, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, macro)
+        parseTopLevelKeywordModifiers(abstract, macro)
+      parseClassOrNamedMixinApplication(abstract, macro, class)
+        listener: beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Class, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(abstract, abstract, macro, Class)
+        parseClass(Class, abstract, class, Class)
+          parseClassHeaderOpt(Class, abstract, class)
+            parseClassExtendsOpt(Class)
+              listener: handleNoType(Class)
+              listener: handleClassExtends(null, 1)
+            parseClassWithClauseOpt(Class)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinOrEnumImplementsOpt(Class)
+              listener: handleImplements(null, 0)
+            listener: handleClassHeader(abstract, class, null)
+          parseClassOrMixinOrExtensionBody(Class, DeclarationKind.Class, Class)
+            listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(abstract, })
+  listener: endTopLevelDeclaration(macro)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(macro)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, macro, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, macro)
+      parseClassOrNamedMixinApplication(null, macro, class)
+        listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Class, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, macro, Class)
+        parseNamedMixinApplication(Class, class, class)
+          listener: handleIdentifier(Object, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(Object, null)
+          parseMixinApplicationRest(Object)
+            parseTypeList(with)
+              listener: beginTypeList(Mixin)
+              listener: handleIdentifier(Mixin, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(Mixin, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(Mixin)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(abstract)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(abstract)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, macro, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, macro)
+        parseTopLevelKeywordModifiers(abstract, macro)
+      parseClassOrNamedMixinApplication(abstract, macro, class)
+        listener: beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Class, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(abstract, abstract, macro, Class)
+        parseNamedMixinApplication(Class, abstract, class)
+          listener: handleIdentifier(Object, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(Object, null)
+          parseMixinApplicationRest(Object)
+            parseTypeList(with)
+              listener: beginTypeList(Mixin)
+              listener: handleIdentifier(Mixin, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(Mixin, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(Mixin)
+          listener: endNamedMixinApplication(abstract, class, =, null, ;)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(macro)
+  listener: endCompilationUnit(4, )
diff --git a/pkg/front_end/parser_testcases/macros/macro_class.dart.parser.expect b/pkg/front_end/parser_testcases/macros/macro_class.dart.parser.expect
new file mode 100644
index 0000000..cdcf2eb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/macros/macro_class.dart.parser.expect
@@ -0,0 +1,9 @@
+macro class Class {}
+abstract macro class Class {}
+macro class Class = Object with Mixin;
+abstract macro class Class = Object with Mixin;
+
+macro[StringToken] class[KeywordToken] Class[StringToken] {[BeginToken]}[SimpleToken]
+abstract[KeywordToken] macro[StringToken] class[KeywordToken] Class[StringToken] {[BeginToken]}[SimpleToken]
+macro[StringToken] class[KeywordToken] Class[StringToken] =[SimpleToken] Object[StringToken] with[KeywordToken] Mixin[StringToken];[SimpleToken]
+abstract[KeywordToken] macro[StringToken] class[KeywordToken] Class[StringToken] =[SimpleToken] Object[StringToken] with[KeywordToken] Mixin[StringToken];[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/macros/macro_class.dart.scanner.expect b/pkg/front_end/parser_testcases/macros/macro_class.dart.scanner.expect
new file mode 100644
index 0000000..cdcf2eb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/macros/macro_class.dart.scanner.expect
@@ -0,0 +1,9 @@
+macro class Class {}
+abstract macro class Class {}
+macro class Class = Object with Mixin;
+abstract macro class Class = Object with Mixin;
+
+macro[StringToken] class[KeywordToken] Class[StringToken] {[BeginToken]}[SimpleToken]
+abstract[KeywordToken] macro[StringToken] class[KeywordToken] Class[StringToken] {[BeginToken]}[SimpleToken]
+macro[StringToken] class[KeywordToken] Class[StringToken] =[SimpleToken] Object[StringToken] with[KeywordToken] Mixin[StringToken];[SimpleToken]
+abstract[KeywordToken] macro[StringToken] class[KeywordToken] Class[StringToken] =[SimpleToken] Object[StringToken] with[KeywordToken] Mixin[StringToken];[SimpleToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.expect
index fc921e4..559ccec 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.intertwined.expect
index 5479a37..d9048a1 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_01.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.expect
index c6d048e..eca0386 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.intertwined.expect
index 8b7f964..ccd3a17 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_02.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.expect
index 91800c7..8464fb7 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.intertwined.expect
index 511dc3e..c9e91b4 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_03.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.expect
index 65cb64b..9255ce3 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.intertwined.expect
index 16f5ea3..7dd363a 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_04.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
index f15fac9..1529f35 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
index d52d122..629cc0a 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_05.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
index 06fd0eb..37ab35f 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
index 0fa66b6..58371cc 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_06.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.expect
index ff032b1..bcb0253 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.intertwined.expect
index 83eb30d..1d0e15f8 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_07.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.expect
index 07545c6..1540cdb 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.intertwined.expect
index 0c830ed..6f56fde 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_08.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.expect
index 5e2286f..12c7433 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.intertwined.expect
index 3f62960..3cfb54ca 100644
--- a/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/chained_call_with_index_01.dart.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
index b9eb4f6..048ba71 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.expect
@@ -58,11 +58,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(abstract, abstract, C)
+    beginClassDeclaration(abstract, abstract, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(final)
@@ -170,11 +170,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
     handleIdentifier(Bar, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(abstract, abstract, Bar)
+    beginClassDeclaration(abstract, abstract, null, Bar)
       handleNoType(Bar)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
index 93bf99d..525c27c 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/abstract_placement.dart.intertwined.expect
@@ -6,29 +6,29 @@
     parseMetadataStar()
       listener: beginMetadataStar(abstract)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
         parseTopLevelKeywordModifiers(abstract, class)
-      parseClassOrNamedMixinApplication(abstract, class)
+      parseClassOrNamedMixinApplication(abstract, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(abstract, abstract, C)
+        listener: beginClassDeclaration(abstract, abstract, null, C)
         parseClass(C, abstract, class, C)
           parseClassHeaderOpt(C, abstract, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -47,7 +47,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -64,7 +64,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -83,7 +83,7 @@
                 listener: endClassFields(abstract, null, null, covariant, null, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -100,7 +100,7 @@
                 listener: endClassFields(abstract, null, null, covariant, null, var, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -117,7 +117,7 @@
                 listener: endClassFields(abstract, null, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -134,7 +134,7 @@
                 listener: endClassFields(abstract, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -155,7 +155,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, C, ;)
               listener: endMember()
             notEofOrValue(}, i7)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(i7)
                 listener: endMetadataStar(0)
@@ -199,29 +199,29 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(abstract)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
         parseTopLevelKeywordModifiers(abstract, class)
-      parseClassOrNamedMixinApplication(abstract, class)
+      parseClassOrNamedMixinApplication(abstract, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Bar, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(abstract, abstract, Bar)
+        listener: beginClassDeclaration(abstract, abstract, null, Bar)
         parseClass(Bar, abstract, class, Bar)
           parseClassHeaderOpt(Bar, abstract, class)
             parseClassExtendsOpt(Bar)
               listener: handleNoType(Bar)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Bar)
+            parseClassWithClauseOpt(Bar)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Bar)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Bar)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(Bar, DeclarationKind.Class, Bar)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Bar)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Bar)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
index 140bdbf..1542fd5 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.expect
@@ -64,11 +64,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
index 6c9e4f0..23beab2 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/external_placement.dart.intertwined.expect
@@ -42,28 +42,28 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -82,7 +82,7 @@
                 listener: endClassFields(null, external, null, covariant, null, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -101,7 +101,7 @@
                 listener: endClassFields(null, external, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
@@ -118,7 +118,7 @@
                 listener: endClassFields(null, external, null, null, null, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -135,7 +135,7 @@
                 listener: endClassFields(null, external, static, null, null, final, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -152,7 +152,7 @@
                 listener: endClassFields(null, external, static, null, null, final, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, final)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(final)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
index 946637f..d9f84e6 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.expect
@@ -60,11 +60,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
index 2f526a0..c5b6907 100644
--- a/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/error_recovery/late_without_var_etc.dart.intertwined.expect
@@ -73,28 +73,28 @@
     parseMetadataStar(;)
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(;, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(;, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -112,7 +112,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -165,7 +165,7 @@
                 listener: endClassMethod(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect
index 9d5b29e..9eb39b0 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.expect
@@ -15,7 +15,7 @@
           handleType(C, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect
index dc0e5f3..f7c4821 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(C, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect
index ce48ee0..f839c84 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.expect
@@ -15,7 +15,7 @@
           handleType(C, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect
index 293d9b0..08c5d05 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(C, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect
index 0664454..8a970e4 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(C, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect
index d743308..28c57f8 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_2_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(C, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect
index bd6398b..ed21533 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(C, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect
index 79c63d9..67b9a92 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39286_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(C, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
index 42d16be..9d5ae52 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
@@ -27,7 +27,7 @@
                 handleType(int, null)
                 handleIdentifier(index, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
index 8c6aed4..4271b3d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
@@ -54,7 +54,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(index, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
index 2f4c2f7..c583b3c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(A, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(A)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(operator)
@@ -27,7 +27,7 @@
                 handleType(int, null)
                 handleIdentifier(index, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
index e6caa09..4124e8f 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39723_prime.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(A, class, class, A)
           parseClassHeaderOpt(A, class, class)
             parseClassExtendsOpt(A)
               listener: handleNoType(A)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(A)
+            parseClassWithClauseOpt(A)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(A)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(A)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, operator)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, A)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
               parseMetadataStar({)
                 listener: beginMetadataStar(operator)
                 listener: endMetadataStar(0)
@@ -54,7 +54,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(index, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.expect
index f1892a2..24db2d4 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.expect
@@ -17,7 +17,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginLiteralString("42")
@@ -51,7 +51,7 @@
           handleType(T, null)
           handleIdentifier(t, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.intertwined.expect
index 6be91d6..58c95fc 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -90,7 +90,7 @@
                 ensureIdentifier(T, formalParameterDeclaration)
                   listener: handleIdentifier(t, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.expect
index 721e3a4..2e03885 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.expect
@@ -17,7 +17,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginLiteralString("42")
@@ -51,7 +51,7 @@
           handleType(T, null)
           handleIdentifier(t, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.intertwined.expect
index 4309320..50ee388 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime1.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -90,7 +90,7 @@
                 ensureIdentifier(T, formalParameterDeclaration)
                   listener: handleIdentifier(t, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
index 76b42cb..784d7f5 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.expect
@@ -17,7 +17,7 @@
           handleType(int, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginLiteralString("42")
@@ -51,7 +51,7 @@
           handleType(T, null)
           handleIdentifier(t, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
index f44705f..1ce0ec5 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime2.dart.intertwined.expect
@@ -32,7 +32,7 @@
                 ensureIdentifier(int, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -90,7 +90,7 @@
                 ensureIdentifier(T, formalParameterDeclaration)
                   listener: handleIdentifier(t, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.expect
index 165124d..8045c84 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.expect
@@ -31,7 +31,7 @@
           handleType(T1, null)
           handleIdentifier(t1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(T2)
         endMetadataStar(0)
         beginFormalParameter(T2, MemberKind.TopLevelMethod, null, null, null)
@@ -40,7 +40,7 @@
           handleType(T2, null)
           handleIdentifier(t2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.intertwined.expect
index 5b8824f..7d4f5c2 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime3.dart.intertwined.expect
@@ -50,7 +50,7 @@
                 ensureIdentifier(T1, formalParameterDeclaration)
                   listener: handleIdentifier(t1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(T2)
@@ -62,7 +62,7 @@
                 ensureIdentifier(T2, formalParameterDeclaration)
                   listener: handleIdentifier(t2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.expect
index d0773b0..deeede9 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.expect
@@ -31,7 +31,7 @@
           handleType(T1, null)
           handleIdentifier(t1, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(T2)
         endMetadataStar(0)
         beginFormalParameter(T2, MemberKind.TopLevelMethod, null, null, null)
@@ -40,7 +40,7 @@
           handleType(T2, null)
           handleIdentifier(t2, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       handleLiteralInt(42)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.intertwined.expect
index 5e4d944..8db1a2c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39776_prime4.dart.intertwined.expect
@@ -50,7 +50,7 @@
                 ensureIdentifier(T1, formalParameterDeclaration)
                   listener: handleIdentifier(t1, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t1, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(T2)
@@ -62,7 +62,7 @@
                 ensureIdentifier(T2, formalParameterDeclaration)
                   listener: handleIdentifier(t2, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, t2, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
index 1328dc8..174b591 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.expect
@@ -30,11 +30,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(X, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, X)
+    beginClassDeclaration(class, null, null, X)
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
index 26b7bad..281f0c0 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(X, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, X)
+        listener: beginClassDeclaration(class, null, null, X)
         parseClass(X, class, class, X)
           parseClassHeaderOpt(X, class, class)
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -45,7 +45,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -63,7 +63,7 @@
                 listener: endClassFields(null, null, static, null, late, null, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -81,7 +81,7 @@
                 listener: endClassFields(null, null, null, covariant, late, null, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -106,7 +106,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -131,7 +131,7 @@
                 listener: endClassFields(null, null, static, null, late, null, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
index 7ebeff9..33dcf4a 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(X, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, X)
+    beginClassDeclaration(class, null, null, X)
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(var)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
index 1d8ef6f..167db06 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_39858_prime1.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(X, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, X)
+        listener: beginClassDeclaration(class, null, null, X)
         parseClass(X, class, class, X)
           parseClassHeaderOpt(X, class, class)
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -42,7 +42,7 @@
                 listener: endClassFields(null, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                 listener: endClassFields(null, null, static, null, null, var, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
@@ -72,7 +72,7 @@
                 listener: endClassFields(null, null, null, covariant, null, var, 1, covariant, ;)
               listener: endMember()
             notEofOrValue(}, var)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(var)
                 listener: endMetadataStar(0)
@@ -94,7 +94,7 @@
                 listener: endClassFields(null, null, null, null, null, var, 1, var, ;)
               listener: endMember()
             notEofOrValue(}, static)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(static)
                 listener: endMetadataStar(0)
@@ -116,7 +116,7 @@
                 listener: endClassFields(null, null, static, null, null, var, 1, static, ;)
               listener: endMember()
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, X)
               parseMetadataStar(;)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.expect
index 60b2d3b..6ab48a8 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.intertwined.expect
index b921880..b381072 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus.dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.expect
index 90d68a0..a0af8fd 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(dynamic)
         endMetadataStar(0)
         beginFormalParameter(dynamic, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(dynamic, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.intertwined.expect
index 98bb429..79d8e62 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_lookup_plus_plus.dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(dynamic)
@@ -43,7 +43,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.expect
index c89447b..5bf1444 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.expect
@@ -87,7 +87,7 @@
                 handleNoType(()
                 handleIdentifier(b, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+              endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.Local)
             endFormalParameters(1, (, ), MemberKind.Local)
             handleAsyncModifier(null, null)
             handleRecoverableError(ExpectedBody, ;, ;)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.intertwined.expect
index e2d78b9..bd14c6d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_method_call_with_type_arguments.dart.intertwined.expect
@@ -157,7 +157,7 @@
                                             ensureIdentifier((, formalParameterDeclaration)
                                               listener: handleIdentifier(b, formalParameterDeclaration)
                                             listener: handleFormalParameterWithoutValue())
-                                            listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                                            listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.Local)
                                           listener: endFormalParameters(1, (, ), MemberKind.Local)
                                       parseAsyncOptBody(), true, false)
                                         parseAsyncModifierOpt())
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.expect
index 6d91dd6..c200dba 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(x, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(dynamic)
         endMetadataStar(0)
         beginFormalParameter(dynamic, MemberKind.TopLevelMethod, null, null, null)
@@ -24,7 +24,7 @@
           handleType(dynamic, null)
           handleIdentifier(i, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.intertwined.expect
index 9b33b16..abbe1a2 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40267_plus_plus_lookup.dart.intertwined.expect
@@ -31,7 +31,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(x, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(dynamic)
@@ -43,7 +43,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(i, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, i, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.expect
index a7ed1d5..68029a8 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(sample, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.intertwined.expect
index 5d6d6b4..b152414 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(sample, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
index 384f089..1e4e813 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(sample, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
index fc4e1e4..aa7d301 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(sample, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
index 2e30ef7..39bbef9 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(sample, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
index 8a9e55b..fe14ada 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime2.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(sample, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.expect
index fee2dc9..10abc1f 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(sample, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.intertwined.expect
index be692e6..49c026b 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime3.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(sample, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, sample, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.expect
index fb4318c..40fbd06 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.intertwined.expect
index 32789fa..e9f2347 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime4.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.expect
index 68b4a22..1a737fe 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.expect
@@ -15,7 +15,7 @@
           handleType(dynamic, null)
           handleIdentifier(e, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.intertwined.expect
index ac8630f..0ba3f9c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40793_prime5.dart.intertwined.expect
@@ -30,7 +30,7 @@
                 ensureIdentifier(dynamic, formalParameterDeclaration)
                   listener: handleIdentifier(e, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
index 890579d..507ba0a 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
index a42a169..2c7dd9e 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_01.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
index 8125755..dc9c09c 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.expect
@@ -10,11 +10,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
index 777b6f6..b8addec 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_02.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
index 0c383ad..b3f7815 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.expect
@@ -10,11 +10,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(covariant)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
index 40f8c8c5..884d7c4 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40805_03.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, covariant)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(covariant)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
index 8bd1608..483e3af 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
@@ -49,7 +49,7 @@
                 handleType(Object, ?)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(x)
@@ -100,7 +100,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(y)
@@ -164,7 +164,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(y)
@@ -228,7 +228,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(y)
@@ -292,7 +292,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(y)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
index 377a621..1b44701 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_01.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -90,7 +90,7 @@
                         ensureIdentifier(?, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -167,7 +167,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -200,7 +200,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -312,7 +312,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -345,7 +345,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -457,7 +457,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -490,7 +490,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -602,7 +602,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -635,7 +635,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
index a6d80f5..a5a1d9f 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
@@ -49,7 +49,7 @@
                 handleType(Object, ?)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(x)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
index 7bae571..a2fe16d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_02.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -90,7 +90,7 @@
                         ensureIdentifier(?, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
index 4b60813..151beb8 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(String)
@@ -49,7 +49,7 @@
                 handleType(Object, ?)
                 handleIdentifier(o, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             beginInitializers(:)
               beginInitializer(x)
@@ -109,7 +109,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -166,7 +166,7 @@
                 handleType(dynamic, null)
                 handleIdentifier(x, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
index bcb265d..ea077fe 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_40834_03.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, String)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(String)
                 listener: endMetadataStar(0)
@@ -44,7 +44,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, String, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -61,7 +61,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -90,7 +90,7 @@
                         ensureIdentifier(?, formalParameterDeclaration)
                           listener: handleIdentifier(o, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   parseInitializers(:)
@@ -198,7 +198,7 @@
                 listener: endClassConstructor(null, Foo, (, :, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -226,7 +226,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -339,7 +339,7 @@
                 listener: endClassMethod(null, void, (, null, })
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(}, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(}, DeclarationKind.Class, Foo)
               parseMetadataStar(})
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -367,7 +367,7 @@
                         ensureIdentifier(dynamic, formalParameterDeclaration)
                           listener: handleIdentifier(x, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
index a5578c5..e768c12 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.expect
@@ -19,7 +19,7 @@
           handleType(List, ?)
           handleIdentifier(a, formalParameterDeclaration)
           handleFormalParameterWithoutValue(,)
-        endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
         beginMetadataStar(bool)
         endMetadataStar(0)
         beginFormalParameter(bool, MemberKind.TopLevelMethod, null, null, null)
@@ -28,7 +28,7 @@
           handleType(bool, ?)
           handleIdentifier(b, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
index 281cf5f..9961d09 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41177.dart.intertwined.expect
@@ -35,7 +35,7 @@
                 ensureIdentifier(?, formalParameterDeclaration)
                   listener: handleIdentifier(a, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue(,)
-                listener: endFormalParameter(null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, a, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
                 parseMetadataStar(,)
                   listener: beginMetadataStar(bool)
@@ -47,7 +47,7 @@
                 ensureIdentifier(?, formalParameterDeclaration)
                   listener: handleIdentifier(b, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, b, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(2, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
index 4bb704e..3a0663e 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.expect
@@ -72,11 +72,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(C)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
index 1b2b88b..6ade11d 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_41597.dart.intertwined.expect
@@ -186,28 +186,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
@@ -260,7 +260,7 @@
                 listener: endClassConstructor(null, C, (, :, ;)
               listener: endMember()
             notEofOrValue(}, C)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(C)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
index 1cc1518..c107cbf 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.expect
@@ -24,7 +24,7 @@
           handleType(Map, null)
           handleIdentifier(json, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -105,7 +105,7 @@
           handleType(Map, null)
           handleIdentifier(json, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -186,7 +186,7 @@
           handleType(Map, null)
           handleIdentifier(json, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -268,7 +268,7 @@
           handleType(Map, null)
           handleIdentifier(json, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -308,11 +308,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Order, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Order)
+    beginClassDeclaration(class, null, null, Order)
       handleNoType(Order)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(List)
diff --git a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
index a2e28bd..263bcd9 100644
--- a/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/issue_42621.dart.intertwined.expect
@@ -40,7 +40,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(json, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -206,7 +206,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(json, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -372,7 +372,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(json, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -548,7 +548,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(json, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, json, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -634,28 +634,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Order, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Order)
+        listener: beginClassDeclaration(class, null, null, Order)
         parseClass(Order, class, class, Order)
           parseClassHeaderOpt(Order, class, class)
             parseClassExtendsOpt(Order)
               listener: handleNoType(Order)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Order)
+            parseClassWithClauseOpt(Order)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Order)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Order)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Order, DeclarationKind.Class, Order)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, List)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Order)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Order)
               parseMetadataStar({)
                 listener: beginMetadataStar(List)
                 listener: endMetadataStar(0)
@@ -672,7 +672,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, List, ;)
               listener: endMember()
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Order)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Order)
               parseMetadataStar(;)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect b/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
index 1bf1597..ec45784 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_member.dart.expect
@@ -123,11 +123,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(X, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, X)
+    beginClassDeclaration(class, null, null, X)
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
@@ -161,11 +161,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Y, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Y)
+    beginClassDeclaration(class, null, null, Y)
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
index 23a7bb2..8fb9358 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_member.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -325,28 +325,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(X, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, X)
+        listener: beginClassDeclaration(class, null, null, X)
         parseClass(X, class, class, X)
           parseClassHeaderOpt(X, class, class)
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -417,28 +417,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Y, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Y)
+        listener: beginClassDeclaration(class, null, null, Y)
         parseClass(Y, class, class, Y)
           parseClassHeaderOpt(Y, class, class)
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
index 52d88f1..7d1c8bd 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.expect
@@ -141,11 +141,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(X, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, X)
+    beginClassDeclaration(class, null, null, X)
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
@@ -179,11 +179,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Y, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Y)
+    beginClassDeclaration(class, null, null, Y)
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
index cbd34da..7c01aa3 100644
--- a/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/late_modifier.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -374,28 +374,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(X, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, X)
+        listener: beginClassDeclaration(class, null, null, X)
         parseClass(X, class, class, X)
           parseClassHeaderOpt(X, class, class)
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -466,28 +466,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Y, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Y)
+        listener: beginClassDeclaration(class, null, null, Y)
         parseClass(Y, class, class, Y)
           parseClassHeaderOpt(Y, class, class)
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
index 4854f02..92ef663 100644
--- a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Class1, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Class1)
+    beginClassDeclaration(class, null, null, Class1)
       handleNoType(Class1)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -29,7 +29,7 @@
                 handleType(int, null)
                 handleIdentifier(index, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -56,7 +56,7 @@
                 handleType(int, null)
                 handleIdentifier(index, formalParameterDeclaration)
                 handleFormalParameterWithoutValue(,)
-              endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
               beginMetadataStar(int)
               endMetadataStar(0)
               beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
@@ -65,7 +65,7 @@
                 handleType(int, null)
                 handleIdentifier(value, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
index bd48abf..d9b1e75 100644
--- a/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/null_shorting_index.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Class1, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Class1)
+        listener: beginClassDeclaration(class, null, null, Class1)
         parseClass(Class1, class, class, Class1)
           parseClassHeaderOpt(Class1, class, class)
             parseClassExtendsOpt(Class1)
               listener: handleNoType(Class1)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Class1)
+            parseClassWithClauseOpt(Class1)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Class1)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Class1)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Class1, DeclarationKind.Class, Class1)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Class1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Class1)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -56,7 +56,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(index, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -85,7 +85,7 @@
                 listener: endClassMethod(null, int, (, null, ;)
               listener: endMember()
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Class1)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Class1)
               parseMetadataStar(;)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -112,7 +112,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(index, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue(,)
-                        listener: endFormalParameter(null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       parseFormalParameter(,, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                         parseMetadataStar(,)
                           listener: beginMetadataStar(int)
@@ -124,7 +124,7 @@
                         ensureIdentifier(int, formalParameterDeclaration)
                           listener: handleIdentifier(value, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, value, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(2, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect b/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
index f4825f1..8f3bab8 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_member.dart.expect
@@ -123,11 +123,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(X, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, X)
+    beginClassDeclaration(class, null, null, X)
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(required)
@@ -161,11 +161,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Y, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Y)
+    beginClassDeclaration(class, null, null, Y)
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
index ef231a3..8506b7e 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_member.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -325,28 +325,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(X, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, X)
+        listener: beginClassDeclaration(class, null, null, X)
         parseClass(X, class, class, X)
           parseClassHeaderOpt(X, class, class)
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
@@ -417,28 +417,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Y, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Y)
+        listener: beginClassDeclaration(class, null, null, Y)
         parseClass(Y, class, class, Y)
           parseClassHeaderOpt(Y, class, class)
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
index 8d19c73..9bd3e32 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.expect
@@ -113,7 +113,7 @@
             handleType(int, null)
             handleIdentifier(named, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, named, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, named, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -134,11 +134,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(X, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, X)
+    beginClassDeclaration(class, null, null, X)
       handleNoType(X)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(required)
@@ -172,11 +172,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Y, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Y)
+    beginClassDeclaration(class, null, null, Y)
       handleNoType(Y)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
index 42f35f4..7523c1c 100644
--- a/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/nnbd/required_modifier.dart.intertwined.expect
@@ -52,7 +52,7 @@
                                 parseNewExpression(=)
                                   isNextIdentifier(new)
                                   listener: beginNewExpression(new)
-                                  parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                  parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                     ensureIdentifier(new, constructorReference)
                                       listener: handleIdentifier(X, constructorReference)
                                     listener: beginConstructorReference(X)
@@ -182,7 +182,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(X, constructorReference)
                                 listener: beginConstructorReference(X)
@@ -228,7 +228,7 @@
                             parseNewExpression(;)
                               isNextIdentifier(new)
                               listener: beginNewExpression(new)
-                              parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                              parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                 ensureIdentifier(new, constructorReference)
                                   listener: handleIdentifier(Y, constructorReference)
                                 listener: beginConstructorReference(Y)
@@ -291,7 +291,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(named, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, named, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, named, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -341,28 +341,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(X, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, X)
+        listener: beginClassDeclaration(class, null, null, X)
         parseClass(X, class, class, X)
           parseClassHeaderOpt(X, class, class)
             parseClassExtendsOpt(X)
               listener: handleNoType(X)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(X)
+            parseClassWithClauseOpt(X)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(X)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(X)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(X, DeclarationKind.Class, X)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, X)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, X)
               parseMetadataStar({)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
@@ -433,28 +433,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Y, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Y)
+        listener: beginClassDeclaration(class, null, null, Y)
         parseClass(Y, class, class, Y)
           parseClassHeaderOpt(Y, class, class)
             parseClassExtendsOpt(Y)
               listener: handleNoType(Y)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Y)
+            parseClassWithClauseOpt(Y)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Y)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Y)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Y, DeclarationKind.Class, Y)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Y)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Y)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
index 8bdfa8b..ded8c58 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.expect
@@ -26,11 +26,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
@@ -50,7 +50,7 @@
                 handleNoType(()
                 handleIdentifier(_, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
index af61377..e396b6a 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -57,7 +57,7 @@
                         ensureIdentifier((, formalParameterDeclaration)
                           listener: handleIdentifier(_, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -131,7 +131,7 @@
                               parseNewExpression(=)
                                 isNextIdentifier(new)
                                 listener: beginNewExpression(new)
-                                parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                   ensureIdentifier(new, constructorReference)
                                     listener: handleIdentifier(Foo, constructorReference)
                                   listener: beginConstructorReference(Foo)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
index 3e1635e..5f001f3 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Foo)
@@ -27,7 +27,7 @@
                 handleNoType(()
                 handleIdentifier(_, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+              endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
index e429730..6f0f152 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/define_triple_shift_method_prime.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Foo)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(Foo)
                 listener: endMetadataStar(0)
@@ -54,7 +54,7 @@
                         ensureIdentifier((, formalParameterDeclaration)
                           listener: handleIdentifier(_, formalParameterDeclaration)
                         listener: handleFormalParameterWithoutValue())
-                        listener: endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
+                        listener: endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                 parseInitializersOpt())
                   listener: handleNoInitializers()
@@ -128,7 +128,7 @@
                               parseNewExpression(=)
                                 isNextIdentifier(new)
                                 listener: beginNewExpression(new)
-                                parseConstructorReference(new, ConstructorReferenceContext.New, null)
+                                parseConstructorReference(new, ConstructorReferenceContext.New, null, false)
                                   ensureIdentifier(new, constructorReference)
                                     listener: handleIdentifier(Foo, constructorReference)
                                   listener: beginConstructorReference(Foo)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.expect
index c88d460..9e5e0d5 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.expect
@@ -25,7 +25,7 @@
           handleType(List, null)
           handleIdentifier(arguments, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, arguments, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, arguments, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.intertwined.expect
index 6db3700..ac687d6 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/simple_attempted_usage_of_triple_shift.dart.intertwined.expect
@@ -34,7 +34,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(arguments, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, arguments, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, arguments, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
index 67bd589..80b04fe 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.expect
@@ -25,7 +25,7 @@
                 handleNoType(()
                 handleIdentifier(_, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -50,7 +50,7 @@
                 handleNoType(()
                 handleIdentifier(_, formalParameterDeclaration)
                 handleFormalParameterWithoutValue())
-              endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+              endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
             endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
             handleNoInitializers()
             handleAsyncModifier(null, null)
@@ -94,7 +94,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables(extends)
-    beginClassDeclaration(abstract, abstract, Foo)
+    beginClassDeclaration(abstract, abstract, null, Foo)
       handleIdentifier(List, typeReference)
       beginTypeArguments(<)
         handleIdentifier(List, typeReference)
@@ -112,7 +112,7 @@
       handleType(List, null)
       handleClassExtends(extends, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(abstract, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
index 81d4778..3a379e4 100644
--- a/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/no-triple-shift/triple_shift_not_triple_shift.dart.intertwined.expect
@@ -6,7 +6,7 @@
     parseMetadataStar()
       listener: beginMetadataStar(extension)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, extension, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, extension, null, Instance of 'DirectiveContext')
       parseTopLevelKeywordModifiers(, extension)
       parseExtension(extension)
         listener: beginExtensionDeclarationPrelude(extension)
@@ -19,7 +19,7 @@
         parseClassOrMixinOrExtensionBody(Symbol, DeclarationKind.Extension, null)
           listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Extension, {)
           notEofOrValue(}, String)
-          parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Extension, null)
             parseMetadataStar({)
               listener: beginMetadataStar(String)
               listener: endMetadataStar(0)
@@ -46,7 +46,7 @@
                       ensureIdentifier((, formalParameterDeclaration)
                         listener: handleIdentifier(_, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
@@ -70,7 +70,7 @@
               listener: endExtensionMethod(null, String, (, null, ;)
             listener: endMember()
           notEofOrValue(}, String)
-          parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Extension, null)
+          parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Extension, null)
             parseMetadataStar(;)
               listener: beginMetadataStar(String)
               listener: endMetadataStar(0)
@@ -98,7 +98,7 @@
                       ensureIdentifier((, formalParameterDeclaration)
                         listener: handleIdentifier(_, formalParameterDeclaration)
                       listener: handleFormalParameterWithoutValue())
-                      listener: endFormalParameter(null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
+                      listener: endFormalParameter(null, null, null, _, null, null, FormalParameterKind.mandatory, MemberKind.ExtensionNonStaticMethod)
                     listener: endFormalParameters(1, (, ), MemberKind.ExtensionNonStaticMethod)
               parseInitializersOpt())
                 listener: handleNoInitializers()
@@ -206,15 +206,15 @@
     parseMetadataStar(})
       listener: beginMetadataStar(abstract)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
         parseTopLevelKeywordModifiers(abstract, class)
-      parseClassOrNamedMixinApplication(abstract, class)
+      parseClassOrNamedMixinApplication(abstract, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(abstract)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables(extends)
-        listener: beginClassDeclaration(abstract, abstract, Foo)
+        listener: beginClassDeclaration(abstract, abstract, null, Foo)
         parseClass(Foo, abstract, class, Foo)
           parseClassHeaderOpt(Foo, abstract, class)
             parseClassExtendsOpt(Foo)
@@ -237,10 +237,10 @@
                 listener: endTypeArguments(1, <, >)
                 listener: handleType(List, null)
                 listener: handleClassExtends(extends, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(abstract, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
index ccf89b4..667962a 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(late, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, late)
+    beginClassDeclaration(class, null, null, late)
       handleNoType(late)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -35,11 +35,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(required, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, required)
+    beginClassDeclaration(class, null, null, required)
       handleNoType(required)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -66,11 +66,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(late)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
index 8a856d0..c89a6b0 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(late, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, late)
+        listener: beginClassDeclaration(class, null, null, late)
         parseClass(late, class, class, late)
           parseClassHeaderOpt(late, class, class)
             parseClassExtendsOpt(late)
               listener: handleNoType(late)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(late)
+            parseClassWithClauseOpt(late)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(late)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(late)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(late, DeclarationKind.Class, late)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, late)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, late)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -71,28 +71,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(required, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, required)
+        listener: beginClassDeclaration(class, null, null, required)
         parseClass(required, class, class, required)
           parseClassHeaderOpt(required, class, class)
             parseClassExtendsOpt(required)
               listener: handleNoType(required)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(required)
+            parseClassWithClauseOpt(required)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(required)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(required)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(required, DeclarationKind.Class, required)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, required)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, required)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -136,28 +136,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -192,7 +192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, required)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(required)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
index f7cda4b..d54d704 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.expect
@@ -4,11 +4,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Xlate, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Xlate)
+    beginClassDeclaration(class, null, null, Xlate)
       handleNoType(Xlate)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -35,11 +35,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Xrequired, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Xrequired)
+    beginClassDeclaration(class, null, null, Xrequired)
       handleNoType(Xrequired)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
@@ -66,11 +66,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(C, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, C)
+    beginClassDeclaration(class, null, null, C)
       handleNoType(C)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(Xlate)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
index 20506bd..b03a234 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/issue_40288_prime.dart.intertwined.expect
@@ -6,28 +6,28 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Xlate, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Xlate)
+        listener: beginClassDeclaration(class, null, null, Xlate)
         parseClass(Xlate, class, class, Xlate)
           parseClassHeaderOpt(Xlate, class, class)
             parseClassExtendsOpt(Xlate)
               listener: handleNoType(Xlate)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Xlate)
+            parseClassWithClauseOpt(Xlate)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Xlate)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Xlate)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Xlate, DeclarationKind.Class, Xlate)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Xlate)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Xlate)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -71,28 +71,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Xrequired, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Xrequired)
+        listener: beginClassDeclaration(class, null, null, Xrequired)
         parseClass(Xrequired, class, class, Xrequired)
           parseClassHeaderOpt(Xrequired, class, class)
             parseClassExtendsOpt(Xrequired)
               listener: handleNoType(Xrequired)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Xrequired)
+            parseClassWithClauseOpt(Xrequired)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Xrequired)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Xrequired)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Xrequired, DeclarationKind.Class, Xrequired)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Xrequired)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Xrequired)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -136,28 +136,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(C, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, C)
+        listener: beginClassDeclaration(class, null, null, C)
         parseClass(C, class, class, C)
           parseClassHeaderOpt(C, class, class)
             parseClassExtendsOpt(C)
               listener: handleNoType(C)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(C)
+            parseClassWithClauseOpt(C)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(C)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(C)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, Xlate)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
               parseMetadataStar({)
                 listener: beginMetadataStar(Xlate)
                 listener: endMetadataStar(0)
@@ -192,7 +192,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, Xlate, ;)
               listener: endMember()
             notEofOrValue(}, Xrequired)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, C)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
               parseMetadataStar(;)
                 listener: beginMetadataStar(Xrequired)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
index 42d27b1..5c1d956 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.expect
@@ -12,11 +12,11 @@
         handleNoType(T)
       endTypeVariable(>, 0, null, null)
     endTypeVariables(<, >)
-    beginClassDeclaration(class, null, A)
+    beginClassDeclaration(class, null, null, A)
       handleNoType(>)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
@@ -27,7 +27,7 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(B, classOrMixinDeclaration)
     handleNoTypeVariables(implements)
-    beginClassDeclaration(class, null, B)
+    beginClassDeclaration(class, null, null, B)
       handleNoType(B)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
@@ -38,7 +38,7 @@
         handleType(num, ?)
       endTypeArguments(1, <, >)
       handleType(A, null)
-      handleClassOrMixinImplements(implements, 1)
+      handleImplements(implements, 1)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
       endClassOrMixinOrExtensionBody(DeclarationKind.Class, 0, {, })
diff --git a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
index 5d322f3..16f17a7 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/nullable_type_argument.dart.intertwined.expect
@@ -6,9 +6,9 @@
     parseMetadataStar()
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(A, classOrMixinDeclaration)
@@ -21,16 +21,16 @@
         listener: handleNoType(T)
         listener: endTypeVariable(>, 0, null, null)
         listener: endTypeVariables(<, >)
-        listener: beginClassDeclaration(class, null, A)
+        listener: beginClassDeclaration(class, null, null, A)
         parseClass(>, class, class, A)
           parseClassHeaderOpt(>, class, class)
             parseClassExtendsOpt(>)
               listener: handleNoType(>)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(>)
+            parseClassWithClauseOpt(>)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(>)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(>)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, A)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
@@ -42,22 +42,22 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(B, classOrMixinDeclaration)
         listener: handleNoTypeVariables(implements)
-        listener: beginClassDeclaration(class, null, B)
+        listener: beginClassDeclaration(class, null, null, B)
         parseClass(B, class, class, B)
           parseClassHeaderOpt(B, class, class)
             parseClassExtendsOpt(B)
               listener: handleNoType(B)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(B)
+            parseClassWithClauseOpt(B)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(B)
+            parseClassOrMixinOrEnumImplementsOpt(B)
               ensureIdentifier(implements, typeReference)
                 listener: handleIdentifier(A, typeReference)
               listener: beginTypeArguments(<)
@@ -66,7 +66,7 @@
               listener: handleType(num, ?)
               listener: endTypeArguments(1, <, >)
               listener: handleType(A, null)
-              listener: handleClassOrMixinImplements(implements, 1)
+              listener: handleImplements(implements, 1)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(>, DeclarationKind.Class, B)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
index 37497b6..285a104 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.expect
@@ -165,7 +165,7 @@
           handleType(List, null)
           handleIdentifier(args, formalParameterDeclaration)
           handleFormalParameterWithoutValue())
-        endFormalParameter(null, null, args, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+        endFormalParameter(null, null, null, args, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
       beginBlockFunctionBody({)
@@ -246,11 +246,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(int)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
index 8d5501d9..3841fa7 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_late_in_non_nnbd.dart.intertwined.expect
@@ -171,7 +171,7 @@
                 ensureIdentifier(>, formalParameterDeclaration)
                   listener: handleIdentifier(args, formalParameterDeclaration)
                 listener: handleFormalParameterWithoutValue())
-                listener: endFormalParameter(null, null, args, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                listener: endFormalParameter(null, null, null, args, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
         parseAsyncModifierOpt())
           listener: handleAsyncModifier(null, null)
@@ -335,28 +335,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, int)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(int)
                 listener: endMetadataStar(0)
@@ -373,7 +373,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -393,7 +393,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, int, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -417,7 +417,7 @@
                 listener: endClassFields(null, null, null, null, late, null, 1, List, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -437,7 +437,7 @@
                 listener: endClassFields(null, null, null, null, late, final, 1, final, ;)
               listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -454,7 +454,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
@@ -465,7 +465,7 @@
                 listener: handleInvalidMember(;)
                 listener: endMember()
             notEofOrValue(}, late)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(late)
                 listener: endMetadataStar(0)
@@ -483,7 +483,7 @@
                 listener: endClassFields(null, null, null, null, null, null, 1, late, ;)
               listener: endMember()
             notEofOrValue(}, ;)
-            parseClassOrMixinOrExtensionMemberImpl(;, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, Foo)
               parseMetadataStar(;)
                 listener: beginMetadataStar(;)
                 listener: endMetadataStar(0)
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
index 6e58879..fb681d6 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.expect
@@ -31,7 +31,7 @@
             handleType(int, null)
             handleIdentifier(x1, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -66,7 +66,7 @@
             handleType(required, null)
             handleIdentifier(x2, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -102,7 +102,7 @@
             handleType(required, null)
             handleIdentifier(x3, formalParameterDeclaration)
             handleFormalParameterWithoutValue(})
-          endFormalParameter(null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+          endFormalParameter(null, null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
         endOptionalFormalParameters(1, {, })
       endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
       handleAsyncModifier(null, null)
@@ -125,11 +125,11 @@
   beginClassOrMixinOrNamedMixinApplicationPrelude(class)
     handleIdentifier(Foo, classOrMixinDeclaration)
     handleNoTypeVariables({)
-    beginClassDeclaration(class, null, Foo)
+    beginClassDeclaration(class, null, null, Foo)
       handleNoType(Foo)
       handleClassExtends(null, 1)
       handleClassNoWithClause()
-      handleClassOrMixinImplements(null, 0)
+      handleImplements(null, 0)
       handleClassHeader(class, class, null)
       beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
         beginMetadataStar(void)
@@ -150,7 +150,7 @@
                   handleType(int, null)
                   handleIdentifier(x4, formalParameterDeclaration)
                   handleFormalParameterWithoutValue(})
-                endFormalParameter(null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                endFormalParameter(null, null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
               endOptionalFormalParameters(1, {, })
             endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
             handleNoInitializers()
diff --git a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
index 476dd57..f214652 100644
--- a/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/non-nnbd/use_required_in_non_nnbd.dart.intertwined.expect
@@ -34,7 +34,7 @@
                   ensureIdentifier(int, formalParameterDeclaration)
                     listener: handleIdentifier(x1, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x1, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -115,7 +115,7 @@
                   ensureIdentifier(required, formalParameterDeclaration)
                     listener: handleIdentifier(x2, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x2, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -198,7 +198,7 @@
                   ensureIdentifier(required, formalParameterDeclaration)
                     listener: handleIdentifier(x3, formalParameterDeclaration)
                   listener: handleFormalParameterWithoutValue(})
-                  listener: endFormalParameter(null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
+                  listener: endFormalParameter(null, null, null, x3, null, null, FormalParameterKind.optionalNamed, MemberKind.TopLevelMethod)
                 listener: endOptionalFormalParameters(1, {, })
               ensureCloseParen(}, ()
               listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
@@ -253,28 +253,28 @@
     parseMetadataStar(})
       listener: beginMetadataStar(class)
       listener: endMetadataStar(0)
-    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+    parseTopLevelKeywordDeclaration(}, class, null, Instance of 'DirectiveContext')
       parseClassDeclarationModifiers(}, class)
-      parseClassOrNamedMixinApplication(null, class)
+      parseClassOrNamedMixinApplication(null, null, class)
         listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
         ensureIdentifier(class, classOrMixinDeclaration)
           listener: handleIdentifier(Foo, classOrMixinDeclaration)
         listener: handleNoTypeVariables({)
-        listener: beginClassDeclaration(class, null, Foo)
+        listener: beginClassDeclaration(class, null, null, Foo)
         parseClass(Foo, class, class, Foo)
           parseClassHeaderOpt(Foo, class, class)
             parseClassExtendsOpt(Foo)
               listener: handleNoType(Foo)
               listener: handleClassExtends(null, 1)
-            parseWithClauseOpt(Foo)
+            parseClassWithClauseOpt(Foo)
               listener: handleClassNoWithClause()
-            parseClassOrMixinImplementsOpt(Foo)
-              listener: handleClassOrMixinImplements(null, 0)
+            parseClassOrMixinOrEnumImplementsOpt(Foo)
+              listener: handleImplements(null, 0)
             listener: handleClassHeader(class, class, null)
           parseClassOrMixinOrExtensionBody(Foo, DeclarationKind.Class, Foo)
             listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
             notEofOrValue(}, void)
-            parseClassOrMixinOrExtensionMemberImpl({, DeclarationKind.Class, Foo)
+            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, Foo)
               parseMetadataStar({)
                 listener: beginMetadataStar(void)
                 listener: endMetadataStar(0)
@@ -306,7 +306,7 @@
                           ensureIdentifier(int, formalParameterDeclaration)
                             listener: handleIdentifier(x4, formalParameterDeclaration)
                           listener: handleFormalParameterWithoutValue(})
-                          listener: endFormalParameter(null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
+                          listener: endFormalParameter(null, null, null, x4, null, null, FormalParameterKind.optionalNamed, MemberKind.NonStaticMethod)
                         listener: endOptionalFormalParameters(1, {, })
                       ensureCloseParen(}, ()
                       listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
diff --git a/pkg/front_end/test/analyser_ignored/load_dill_twice_test.dart b/pkg/front_end/test/analyser_ignored/load_dill_twice_test.dart
index 803f98f..2b03e4d 100644
--- a/pkg/front_end/test/analyser_ignored/load_dill_twice_test.dart
+++ b/pkg/front_end/test/analyser_ignored/load_dill_twice_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
-
 import 'dart:io' show Platform, exit;
 
 import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
diff --git a/pkg/front_end/test/ast_nodes_has_to_string_test.dart b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
index d9ddaba..0c27d6f 100644
--- a/pkg/front_end/test/ast_nodes_has_to_string_test.dart
+++ b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
@@ -5,6 +5,7 @@
 import 'dart:io' show File, Platform, stdin, exitCode;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 
@@ -26,8 +27,9 @@
     helper.TestIncrementalCompiler compiler =
         new helper.TestIncrementalCompiler(options, input,
             /*Uri initializeFrom*/ null, /*bool outlineOnly*/ true);
-    c = await compiler.computeDelta();
-    classHierarchy = compiler.getClassHierarchy()!;
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+    c = compilerResult.component;
+    classHierarchy = compilerResult.classHierarchy!;
     List<Library> libraries = c.libraries
         .where((Library lib) =>
             (lib.importUri.toString() == "package:kernel/ast.dart"))
diff --git a/pkg/front_end/test/async_but_no_await_git_test.dart b/pkg/front_end/test/async_but_no_await_git_test.dart
index d83191f..6721ee1 100644
--- a/pkg/front_end/test/async_but_no_await_git_test.dart
+++ b/pkg/front_end/test/async_but_no_await_git_test.dart
@@ -6,6 +6,8 @@
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart';
 import 'package:front_end/src/api_prototype/compiler_options.dart' as api;
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 import 'package:front_end/src/base/processed_options.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
@@ -58,8 +60,8 @@
 
   IncrementalCompiler compiler =
       new IncrementalCompiler(new CompilerContext(options));
-  Component component = await compiler.computeDelta();
-
+  IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+  Component component = compilerResult.component;
   component.accept(new AsyncNoAwaitVisitor());
 
   print("Done in ${stopwatch.elapsedMilliseconds} ms. "
diff --git a/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart b/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
index 4acaf78..76f3281 100644
--- a/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
+++ b/pkg/front_end/test/class_hierarchy/class_hierarchy_test.dart
@@ -8,7 +8,11 @@
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
-import 'package:front_end/src/fasta/kernel/class_hierarchy_builder.dart';
+import 'package:front_end/src/fasta/kernel/hierarchy/class_member.dart';
+import 'package:front_end/src/fasta/kernel/hierarchy/hierarchy_builder.dart';
+import 'package:front_end/src/fasta/kernel/hierarchy/hierarchy_node.dart';
+import 'package:front_end/src/fasta/kernel/hierarchy/members_builder.dart';
+import 'package:front_end/src/fasta/kernel/hierarchy/members_node.dart';
 import 'package:front_end/src/testing/id_extractor.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
@@ -99,17 +103,20 @@
   CoreTypes get _coreTypes => _compilerResult.coreTypes!;
 
   ClassHierarchyBuilder get _classHierarchyBuilder =>
-      _compilerResult.kernelTargetForTesting!.loader.builderHierarchy;
+      _compilerResult.kernelTargetForTesting!.loader.hierarchyBuilder;
+
+  ClassMembersBuilder get _classMembersBuilder =>
+      _compilerResult.kernelTargetForTesting!.loader.membersBuilder;
 
   @override
   void computeForClass(Class node) {
     super.computeForClass(node);
-    ClassHierarchyNode classHierarchyNode =
-        _classHierarchyBuilder.getNodeFromClass(node);
-    ClassHierarchyNodeDataForTesting data = classHierarchyNode.dataForTesting!;
+    ClassMembersNode classMembersNode =
+        _classMembersBuilder.getNodeFromClass(node);
+    ClassHierarchyNodeDataForTesting data = classMembersNode.dataForTesting!;
     void addMember(ClassMember classMember,
         {required bool isSetter, required bool isClassMember}) {
-      Member member = classMember.getMember(_classHierarchyBuilder);
+      Member member = classMember.getMember(_classMembersBuilder);
       Member memberOrigin = member.memberSignatureOrigin ?? member;
       if (memberOrigin.enclosingClass == _coreTypes.objectClass) {
         return;
@@ -179,13 +186,13 @@
             features.add(Tag.abstractForwardingStub);
             features[Tag.type] = procedureType(member);
             features[Tag.covariance] =
-                classMember.getCovariance(_classHierarchyBuilder).toString();
+                classMember.getCovariance(_classMembersBuilder).toString();
             break;
           case ProcedureStubKind.ConcreteForwardingStub:
             features.add(Tag.concreteForwardingStub);
             features[Tag.type] = procedureType(member);
             features[Tag.covariance] =
-                classMember.getCovariance(_classHierarchyBuilder).toString();
+                classMember.getCovariance(_classMembersBuilder).toString();
             features[Tag.stubTarget] = memberQualifiedName(member.stubTarget!);
             break;
           case ProcedureStubKind.NoSuchMethodForwarder:
@@ -195,7 +202,7 @@
             features.add(Tag.memberSignature);
             features[Tag.type] = procedureType(member);
             features[Tag.covariance] =
-                classMember.getCovariance(_classHierarchyBuilder).toString();
+                classMember.getCovariance(_classMembersBuilder).toString();
             break;
           case ProcedureStubKind.AbstractMixinStub:
             features.add(Tag.abstractMixinStub);
@@ -211,23 +218,23 @@
           id, features, member);
     }
 
-    classHierarchyNode.classMemberMap
+    classMembersNode.classMemberMap
         .forEach((Name name, ClassMember classMember) {
       addMember(classMember, isSetter: false, isClassMember: true);
     });
-    classHierarchyNode.classSetterMap
+    classMembersNode.classSetterMap
         .forEach((Name name, ClassMember classMember) {
       addMember(classMember, isSetter: true, isClassMember: true);
     });
-    classHierarchyNode.interfaceMemberMap
+    classMembersNode.interfaceMemberMap
         ?.forEach((Name name, ClassMember classMember) {
-      if (!identical(classMember, classHierarchyNode.classMemberMap[name])) {
+      if (!identical(classMember, classMembersNode.classMemberMap[name])) {
         addMember(classMember, isSetter: false, isClassMember: false);
       }
     });
-    classHierarchyNode.interfaceSetterMap
+    classMembersNode.interfaceSetterMap
         ?.forEach((Name name, ClassMember classMember) {
-      if (!identical(classMember, classHierarchyNode.classSetterMap[name])) {
+      if (!identical(classMember, classMembersNode.classSetterMap[name])) {
         addMember(classMember, isSetter: true, isClassMember: false);
       }
     });
@@ -238,7 +245,9 @@
     Features features = new Features();
     ClassHierarchyNode classHierarchyNode =
         _classHierarchyBuilder.getNodeFromClass(node);
-    ClassHierarchyNodeDataForTesting data = classHierarchyNode.dataForTesting!;
+    ClassMembersNode classMembersNode =
+        _classMembersBuilder.getNodeFromClass(node);
+    ClassHierarchyNodeDataForTesting data = classMembersNode.dataForTesting!;
     classHierarchyNode.superclasses.forEach((Supertype supertype) {
       features.addElement(Tag.superclasses, supertypeToText(supertype));
     });
@@ -253,7 +262,7 @@
     }
     features[Tag.maxInheritancePath] =
         '${classHierarchyNode.maxInheritancePath}';
-    if (classHierarchyNode.hasNoSuchMethod) {
+    if (classMembersNode.hasNoSuchMethod) {
       features.add(Tag.hasNoSuchMethod);
     }
     return features;
diff --git a/pkg/front_end/test/comments_on_certain_arguments_tool.dart b/pkg/front_end/test/comments_on_certain_arguments_tool.dart
index ce02610..254ff7d 100644
--- a/pkg/front_end/test/comments_on_certain_arguments_tool.dart
+++ b/pkg/front_end/test/comments_on_certain_arguments_tool.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 'dart:convert' show utf8;
 
 import 'dart:io'
@@ -19,6 +17,8 @@
 
 import 'package:front_end/src/api_prototype/file_system.dart' as api
     show FileSystem;
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
@@ -56,7 +56,7 @@
 
 Set<Uri> libUris = {};
 
-Component component;
+late Component component;
 
 Future<void> main(List<String> args) async {
   api.CompilerOptions compilerOptions = getOptions();
@@ -83,7 +83,9 @@
   CompilerContext context = new CompilerContext(options);
   IncrementalCompiler incrementalCompiler =
       new TestIncrementalCompiler(context);
-  component = await incrementalCompiler.computeDelta();
+  IncrementalCompilerResult incrementalCompilerResult =
+      await incrementalCompiler.computeDelta();
+  component = incrementalCompilerResult.component;
 
   for (Library library in component.libraries) {
     if (library.importUri.scheme == "dart") continue;
@@ -100,8 +102,9 @@
     List<Uri> editsPerformed = [];
     for (Uri uri in edits.keys) {
       print("\n\n\n");
-      if (edits[uri] != null && edits[uri].isNotEmpty) {
-        String update;
+      List<Edit>? theseEdits = edits[uri];
+      if (theseEdits != null && theseEdits.isNotEmpty) {
+        String? update;
         while (update != "y" &&
             update != "yes" &&
             update != "n" &&
@@ -111,9 +114,8 @@
         }
         if (update != "y" && update != "yes") continue;
 
-        List<Edit> theseEdits = edits[uri];
         theseEdits.sort();
-        String content = utf8.decode(component.uriToSource[uri].source,
+        String content = utf8.decode(component.uriToSource[uri]!.source,
             allowMalformed: true);
         StringBuffer sb = new StringBuffer();
         int latest = 0;
@@ -128,7 +130,7 @@
             case EditType.Delete:
               print(edit);
               // We "delete" by skipping...
-              latest = edit.offset + edit.length;
+              latest = edit.offset + edit.length!;
               break;
           }
         }
@@ -195,19 +197,19 @@
   @override
   void visitSuperMethodInvocation(SuperMethodInvocation node) {
     super.visitSuperMethodInvocation(node);
-    note(node.interfaceTargetReference.node, node.arguments, node);
+    note(node.interfaceTargetReference!.node!, node.arguments, node);
   }
 
   @override
   void visitStaticInvocation(StaticInvocation node) {
     super.visitStaticInvocation(node);
-    note(node.targetReference.node, node.arguments, node);
+    note(node.targetReference.node!, node.arguments, node);
   }
 
   @override
   void visitConstructorInvocation(ConstructorInvocation node) {
     super.visitConstructorInvocation(node);
-    note(node.targetReference.node, node.arguments, node);
+    note(node.targetReference.node!, node.arguments, node);
   }
 
   void note(
@@ -223,28 +225,25 @@
 
     for (int i = 0; i < arguments.positional.length; i++) {
       bool wantComment = false;
-      if (arguments.positional[i] is NullLiteral ||
-          arguments.positional[i] is BoolLiteral ||
-          arguments.positional[i] is IntLiteral) {
+      Expression argument = arguments.positional[i];
+      if (argument is NullLiteral ||
+          argument is BoolLiteral ||
+          argument is IntLiteral) {
         wantComment = true;
-      } else if (arguments.positional[i] is MapLiteral) {
-        MapLiteral literal = arguments.positional[i];
-        if (literal.entries.isEmpty) wantComment = true;
-      } else if (arguments.positional[i] is ListLiteral) {
-        ListLiteral literal = arguments.positional[i];
-        if (literal.expressions.isEmpty) wantComment = true;
-      } else if (arguments.positional[i] is InstanceInvocation) {
-        InstanceInvocation methodInvocation = arguments.positional[i];
-        if (methodInvocation.receiver is NullLiteral ||
-            methodInvocation.receiver is IntLiteral ||
-            methodInvocation.receiver is BoolLiteral) {
+      } else if (argument is MapLiteral) {
+        if (argument.entries.isEmpty) wantComment = true;
+      } else if (argument is ListLiteral) {
+        if (argument.expressions.isEmpty) wantComment = true;
+      } else if (argument is InstanceInvocation) {
+        if (argument.receiver is NullLiteral ||
+            argument.receiver is IntLiteral ||
+            argument.receiver is BoolLiteral) {
           wantComment = true;
         }
-      } else if (arguments.positional[i] is DynamicInvocation) {
-        DynamicInvocation methodInvocation = arguments.positional[i];
-        if (methodInvocation.receiver is NullLiteral ||
-            methodInvocation.receiver is IntLiteral ||
-            methodInvocation.receiver is BoolLiteral) {
+      } else if (argument is DynamicInvocation) {
+        if (argument.receiver is NullLiteral ||
+            argument.receiver is IntLiteral ||
+            argument.receiver is BoolLiteral) {
           wantComment = true;
         }
       }
@@ -269,10 +268,10 @@
     return;
   }
   if (argumentExpression.fileOffset == -1) return;
-  Location location = argumentExpression.location;
-  Token token = cache[location.file];
+  Location location = argumentExpression.location!;
+  Token token = cache[location.file]!;
   while (token.offset != argumentExpression.fileOffset) {
-    token = token.next;
+    token = token.next!;
     if (token.isEof) {
       throw "Couldn't find token for $argumentExpression "
           "(${argumentExpression.fileOffset}).";
@@ -280,7 +279,7 @@
   }
   bool foundComment = false;
   List<CommentToken> badComments = [];
-  CommentToken commentToken = token.precedingComments;
+  CommentToken? commentToken = token.precedingComments;
   while (commentToken != null) {
     if (commentToken.lexeme == expectedComment) {
       // Exact match.
@@ -291,17 +290,16 @@
         commentToken.lexeme.endsWith("= */")) {
       badComments.add(commentToken);
     }
-    commentToken = commentToken.next;
+    commentToken = commentToken.next as CommentToken?;
   }
   if (badComments.isNotEmpty) {
     for (CommentToken comment in badComments) {
       Location calculatedLocation =
-          component.getLocation(location.file, comment.offset);
+          component.getLocation(location.file, comment.offset)!;
       print("Please remove comment of length ${comment.lexeme.length} at "
           "${comment.offset} => "
           "${calculatedLocation}");
-      edits[location.file] ??= [];
-      edits[location.file]
+      (edits[location.file] ??= [])
           .add(new Edit.delete(comment.offset, comment.lexeme.length));
     }
   }
@@ -309,12 +307,12 @@
     return;
   }
   Location calculatedLocation =
-      component.getLocation(location.file, token.offset);
+      component.getLocation(location.file, token.offset)!;
   print("Please add comment $expectedComment at "
       "${token.offset} => "
       "${calculatedLocation}");
-  edits[location.file] ??= [];
-  edits[location.file].add(new Edit.insert(token.offset, expectedComment));
+  (edits[location.file] ??= [])
+      .add(new Edit.insert(token.offset, expectedComment));
 }
 
 Map<Uri, List<Edit>> edits = {};
@@ -323,8 +321,8 @@
 
 class Edit implements Comparable<Edit> {
   final int offset;
-  final int length;
-  final String insertData;
+  final int? length;
+  final String? insertData;
   final EditType editType;
   Edit.insert(this.offset, this.insertData)
       : editType = EditType.Insert,
diff --git a/pkg/front_end/test/compile_benchmark.dart b/pkg/front_end/test/compile_benchmark.dart
index 2ad309a..c244da3 100644
--- a/pkg/front_end/test/compile_benchmark.dart
+++ b/pkg/front_end/test/compile_benchmark.dart
@@ -1,5 +1,3 @@
-// @dart = 2.9
-
 import 'dart:convert';
 import 'dart:io';
 import 'dart:typed_data';
@@ -23,7 +21,7 @@
     Platform.script.resolve("compile_benchmark_helper.dart");
 
 void main(List<String> args) {
-  List<String> arguments;
+  List<String>? arguments;
   bool tryToAnnotate = false;
   bool tryToSlowDown = false;
   bool timeInsteadOfCount = false;
@@ -135,7 +133,7 @@
   if (tryToSlowDown) {
     didSomething = true;
     for (Procedure p in sortedProcedures) {
-      Uri busyWaiting = busyWaitProcedure(
+      Uri? busyWaiting = busyWaitProcedure(
           dillData,
           tmp.uri,
           (lib) => lib.importUri == p.enclosingLibrary.importUri,
@@ -245,13 +243,14 @@
 ///
 /// The annotation is copied from the [preferInlineMe] method in the helper.
 Uri preferInlineProcedure(List<int> dillData, Uri tmp,
-    bool libraryMatcher(Library lib), String className, String procedureName) {
+    bool libraryMatcher(Library lib), String? className, String procedureName) {
   Component component = new Component();
   new BinaryBuilder(dillData, disableLazyReading: true)
       .readComponent(component);
   Procedure preferInlineMeProcedure = getProcedure(component,
       (lib) => lib.fileUri == benchmarkHelper, null, "preferInlineMe");
-  ConstantExpression annotation = preferInlineMeProcedure.annotations.single;
+  ConstantExpression annotation =
+      preferInlineMeProcedure.annotations.single as ConstantExpression;
   Procedure markProcedure =
       getProcedure(component, libraryMatcher, className, procedureName);
   markProcedure.addAnnotation(
@@ -268,8 +267,8 @@
 ///
 /// This will make the procedure busy-wait approximately 0.002 ms for each
 /// invocation (+ whatever overhead and imprecision).
-Uri busyWaitProcedure(List<int> dillData, Uri tmp,
-    bool libraryMatcher(Library lib), String className, String procedureName) {
+Uri? busyWaitProcedure(List<int> dillData, Uri tmp,
+    bool libraryMatcher(Library lib), String? className, String procedureName) {
   Component component = new Component();
   new BinaryBuilder(dillData, disableLazyReading: true)
       .readComponent(component);
@@ -280,7 +279,7 @@
       getProcedure(component, libraryMatcher, className, procedureName);
   if (markProcedure.function.body == null) return null;
 
-  Statement orgBody = markProcedure.function.body;
+  Statement orgBody = markProcedure.function.body as Statement;
   markProcedure.function.body = new Block([
     new ExpressionStatement(new StaticInvocation(
         busyWaitProcedure, new Arguments([new IntLiteral(2 /* 0.002 ms */)]))),
@@ -375,13 +374,13 @@
     if (node.function.body == null) return;
     int procedureNum = procedures.length;
     procedures.add(node);
-    Statement orgBody = node.function.body;
+    Statement orgBody = node.function.body as Statement;
     node.function.body = new Block([
       new ExpressionStatement(new StaticInvocation(registerCallProcedure,
           new Arguments([new IntLiteral(procedureNum)]))),
       orgBody
     ]);
-    node.function.body.parent = node.function;
+    node.function.body!.parent = node.function;
   }
 }
 
@@ -408,7 +407,7 @@
     if (node.function.dartAsyncMarker != AsyncMarker.Sync) return;
     int procedureNum = procedures.length;
     procedures.add(node);
-    Statement orgBody = node.function.body;
+    Statement orgBody = node.function.body as Statement;
     // Rewrite as
     // {
     //    registerCallStartProcedure(x);
@@ -428,12 +427,12 @@
       )
     ]);
     node.function.body = block;
-    node.function.body.parent = node.function;
+    node.function.body!.parent = node.function;
   }
 }
 
 Procedure getProcedure(Component component, bool libraryMatcher(Library lib),
-    String className, String procedureName) {
+    String? className, String procedureName) {
   Library lib = component.libraries.where(libraryMatcher).single;
   List<Procedure> procedures = lib.procedures;
   if (className != null) {
@@ -444,7 +443,7 @@
   return procedures.where((p) => p.name.text == procedureName).single;
 }
 
-List<int> runXTimes(int x, List<String> arguments, [List<dynamic> stdout]) {
+List<int> runXTimes(int x, List<String> arguments, [List<dynamic>? stdout]) {
   List<int> result = [];
   Stopwatch stopwatch = new Stopwatch()..start();
   for (int i = 0; i < x; i++) {
diff --git a/pkg/front_end/test/constant_evaluator_benchmark.dart b/pkg/front_end/test/constant_evaluator_benchmark.dart
index 5a817a6..35f5faa 100644
--- a/pkg/front_end/test/constant_evaluator_benchmark.dart
+++ b/pkg/front_end/test/constant_evaluator_benchmark.dart
@@ -51,7 +51,7 @@
 
 void benchmark(Component component, List<Library> libraries) {
   if (tryWithNoEnvironment == null) throw "tryWithNoEnvironment not set";
-  KernelTarget target = incrementalCompiler.userCode as KernelTarget;
+  KernelTarget target = incrementalCompiler.kernelTargetForTesting!;
   constants.EvaluationMode evaluationMode =
       target.getConstantEvaluationModeForTesting();
 
diff --git a/pkg/front_end/test/covariance_check/covariance_check_test.dart b/pkg/front_end/test/covariance_check/covariance_check_test.dart
index 4f59ddc..c91c012 100644
--- a/pkg/front_end/test/covariance_check/covariance_check_test.dart
+++ b/pkg/front_end/test/covariance_check/covariance_check_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -33,7 +31,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new CovarianceCheckDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -44,7 +42,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new CovarianceCheckDataExtractor(compilerResult, actualMap));
   }
 
@@ -58,7 +56,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is AsExpression && node.isCovarianceCheck) {
       return typeToText(node.type);
     }
diff --git a/pkg/front_end/test/crashing_test_case_minimizer.dart b/pkg/front_end/test/crashing_test_case_minimizer.dart
index c5e60d5..55c2b69 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer.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 'dart:convert' show jsonDecode;
 
 import 'dart:io' show File;
@@ -20,8 +18,8 @@
 // parser on it and verifies that no syntax errors have been introduced.
 
 Future<void> main(List<String> arguments) async {
-  String filename;
-  Uri loadJson;
+  String? filename;
+  Uri? loadJson;
   for (String arg in arguments) {
     if (arg.startsWith("--json=")) {
       String json = arg.substring("--json=".length);
@@ -92,7 +90,7 @@
     if (settings.noPlatform) {
       int i = 0;
       while (settings.platformUri == null ||
-          new File.fromUri(settings.platformUri).existsSync()) {
+          new File.fromUri(settings.platformUri!).existsSync()) {
         settings.platformUri = Uri.base.resolve("nonexisting_$i");
         i++;
       }
@@ -100,7 +98,7 @@
       if (settings.platformUri == null) {
         throw "No platform given. Use --platform=/path/to/platform.dill";
       }
-      if (!new File.fromUri(settings.platformUri).existsSync()) {
+      if (!new File.fromUri(settings.platformUri!).existsSync()) {
         throw "The platform file '${settings.platformUri}' doesn't exist";
       }
     }
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index dfd6efa..437c010 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -34,6 +34,9 @@
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
 import 'package:front_end/src/fasta/builder/library_builder.dart';
@@ -47,8 +50,8 @@
 import 'package:front_end/src/fasta/messages.dart' show Message;
 import 'package:front_end/src/fasta/source/diet_parser.dart'
     show useImplicitCreationExpressionInCfe;
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart';
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 import 'package:front_end/src/fasta/util/textual_outline.dart'
     show textualOutline;
@@ -536,7 +539,7 @@
       if (inlinableUri == uri) continue;
       final Uint8List? originalBytes = _fs.data[uri];
       if (originalBytes == null || originalBytes.isEmpty) continue;
-      DirectParserASTContentCompilationUnitEnd ast = getAST(originalBytes,
+      CompilationUnitEnd ast = getAST(originalBytes,
           includeBody: false,
           includeComments: false,
           enableExtensionMethods: true,
@@ -549,7 +552,7 @@
       // * if that *doesn't* work and we've inserted an export,
       //   try converting that to an import instead.
       List<_Replacement> replacements = [];
-      for (DirectParserASTContentImportEnd import in ast.getImports()) {
+      for (ImportEnd import in ast.getImports()) {
         Token importUriToken = import.importKeyword.next!;
         Uri importUri = _getUri(importUriToken, uri);
         if (inlinableUri == importUri) {
@@ -557,7 +560,7 @@
               import.importKeyword.offset - 1, import.semicolon!.offset + 1));
         }
       }
-      for (DirectParserASTContentExportEnd export in ast.getExports()) {
+      for (ExportEnd export in ast.getExports()) {
         Token exportUriToken = export.exportKeyword.next!;
         Uri exportUri = _getUri(exportUriToken, uri);
         if (inlinableUri == exportUri) {
@@ -582,10 +585,10 @@
           includeComments: false,
           enableExtensionMethods: true,
           enableNonNullable: _isUriNnbd(uri));
-      for (DirectParserASTContentImportEnd import in ast.getImports()) {
+      for (ImportEnd import in ast.getImports()) {
         offsetOfLast = max(offsetOfLast, import.semicolon!.offset + 1);
       }
-      for (DirectParserASTContentExportEnd export in ast.getExports()) {
+      for (ExportEnd export in ast.getExports()) {
         offsetOfLast = max(offsetOfLast, export.semicolon.offset + 1);
       }
 
@@ -683,17 +686,17 @@
   Uint8List _rewriteImportsExportsToUri(
       Uint8List oldData, Uri newUri, Uri oldUri, bool nnbd,
       {bool convertExportToImport: false}) {
-    DirectParserASTContentCompilationUnitEnd ast = getAST(oldData,
+    CompilationUnitEnd ast = getAST(oldData,
         includeBody: false,
         includeComments: false,
         enableExtensionMethods: true,
         enableNonNullable: nnbd);
     List<_Replacement> replacements = [];
-    for (DirectParserASTContentImportEnd import in ast.getImports()) {
+    for (ImportEnd import in ast.getImports()) {
       _rewriteImportsExportsToUriInternal(
           import.importKeyword.next!, oldUri, replacements, newUri);
     }
-    for (DirectParserASTContentExportEnd export in ast.getExports()) {
+    for (ExportEnd export in ast.getExports()) {
       if (convertExportToImport) {
         replacements.add(new _Replacement(
           export.exportKeyword.offset - 1,
@@ -802,7 +805,7 @@
     Uri uriTokenUri = uri.resolve(uriString);
     if (resolvePackage && uriTokenUri.scheme == "package") {
       Package package = _latestCrashingIncrementalCompiler!
-          .currentPackagesMap![uriTokenUri.pathSegments.first]!;
+          .getPackageForPackageName(uriTokenUri.pathSegments.first)!;
       uriTokenUri = package.packageUriRoot
           .resolve(uriTokenUri.pathSegments.skip(1).join("/"));
     }
@@ -810,7 +813,7 @@
   }
 
   Uri _getImportUri(Uri uri) {
-    return _latestCrashingIncrementalCompiler!.userCode!
+    return _latestCrashingIncrementalCompiler!.kernelTargetForTesting!
         .getEntryPointUri(uri, issueProblem: false);
   }
 
@@ -1251,7 +1254,7 @@
     if (!uri.toString().endsWith(".dart")) return;
 
     Uint8List data = _fs.data[uri]!;
-    DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+    CompilationUnitEnd ast = getAST(data,
         includeBody: true,
         includeComments: false,
         enableExtensionMethods: true,
@@ -1260,64 +1263,60 @@
     _CompilationHelperClass helper = new _CompilationHelperClass(data);
 
     // Try to remove top level things one at a time.
-    for (DirectParserASTContent child in ast.children!) {
+    for (ParserAstNode child in ast.children!) {
       bool shouldCompile = false;
       String what = "";
       if (child.isClass()) {
-        DirectParserASTContentClassDeclarationEnd cls = child.asClass();
+        ClassDeclarationEnd cls = child.asClass();
         helper.replacements.add(new _Replacement(
             cls.beginToken.offset - 1, cls.endToken.offset + 1));
         shouldCompile = true;
         what = "class";
       } else if (child.isMixinDeclaration()) {
-        DirectParserASTContentMixinDeclarationEnd decl =
-            child.asMixinDeclaration();
+        MixinDeclarationEnd decl = child.asMixinDeclaration();
         helper.replacements.add(new _Replacement(
             decl.mixinKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "mixin";
       } else if (child.isNamedMixinDeclaration()) {
-        DirectParserASTContentNamedMixinApplicationEnd decl =
-            child.asNamedMixinDeclaration();
+        NamedMixinApplicationEnd decl = child.asNamedMixinDeclaration();
         helper.replacements.add(
             new _Replacement(decl.begin.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "named mixin";
       } else if (child.isExtension()) {
-        DirectParserASTContentExtensionDeclarationEnd decl =
-            child.asExtension();
+        ExtensionDeclarationEnd decl = child.asExtension();
         helper.replacements.add(new _Replacement(
             decl.extensionKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "extension";
       } else if (child.isTopLevelFields()) {
-        DirectParserASTContentTopLevelFieldsEnd decl = child.asTopLevelFields();
+        TopLevelFieldsEnd decl = child.asTopLevelFields();
         helper.replacements.add(new _Replacement(
             decl.beginToken.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "toplevel fields";
       } else if (child.isTopLevelMethod()) {
-        DirectParserASTContentTopLevelMethodEnd decl = child.asTopLevelMethod();
+        TopLevelMethodEnd decl = child.asTopLevelMethod();
         helper.replacements.add(new _Replacement(
             decl.beginToken.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "toplevel method";
       } else if (child.isEnum()) {
-        DirectParserASTContentEnumEnd decl = child.asEnum();
+        EnumEnd decl = child.asEnum();
         helper.replacements.add(new _Replacement(
             decl.enumKeyword.offset - 1, decl.leftBrace.endGroup!.offset + 1));
         shouldCompile = true;
         what = "enum";
       } else if (child.isTypedef()) {
-        DirectParserASTContentTypedefEnd decl = child.asTypedef();
+        TypedefEnd decl = child.asTypedef();
         helper.replacements.add(new _Replacement(
             decl.typedefKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "typedef";
       } else if (child.isMetadata()) {
-        DirectParserASTContentMetadataStarEnd decl = child.asMetadata();
-        List<DirectParserASTContentMetadataEnd> metadata =
-            decl.getMetadataEntries();
+        MetadataStarEnd decl = child.asMetadata();
+        List<MetadataEnd> metadata = decl.getMetadataEntries();
         if (metadata.isNotEmpty) {
           helper.replacements.add(new _Replacement(
               metadata.first.beginToken.offset - 1,
@@ -1326,31 +1325,31 @@
         }
         what = "metadata";
       } else if (child.isImport()) {
-        DirectParserASTContentImportEnd decl = child.asImport();
+        ImportEnd decl = child.asImport();
         helper.replacements.add(new _Replacement(
             decl.importKeyword.offset - 1, decl.semicolon!.offset + 1));
         shouldCompile = true;
         what = "import";
       } else if (child.isExport()) {
-        DirectParserASTContentExportEnd decl = child.asExport();
+        ExportEnd decl = child.asExport();
         helper.replacements.add(new _Replacement(
             decl.exportKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "export";
       } else if (child.isLibraryName()) {
-        DirectParserASTContentLibraryNameEnd decl = child.asLibraryName();
+        LibraryNameEnd decl = child.asLibraryName();
         helper.replacements.add(new _Replacement(
             decl.libraryKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "library name";
       } else if (child.isPart()) {
-        DirectParserASTContentPartEnd decl = child.asPart();
+        PartEnd decl = child.asPart();
         helper.replacements.add(new _Replacement(
             decl.partKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "part";
       } else if (child.isPartOf()) {
-        DirectParserASTContentPartOfEnd decl = child.asPartOf();
+        PartOfEnd decl = child.asPartOf();
         helper.replacements.add(new _Replacement(
             decl.partKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
@@ -1370,8 +1369,8 @@
         if (!success) {
           if (child.isClass()) {
             // Also try to remove all content of the class.
-            DirectParserASTContentClassDeclarationEnd decl = child.asClass();
-            DirectParserASTContentClassOrMixinOrExtensionBodyEnd body =
+            ClassDeclarationEnd decl = child.asClass();
+            ClassOrMixinOrExtensionBodyEnd body =
                 decl.getClassOrMixinOrExtensionBody();
             if (body.beginToken.offset + 2 < body.endToken.offset) {
               helper.replacements.add(new _Replacement(
@@ -1384,11 +1383,11 @@
 
             if (!success) {
               // Also try to remove members one at a time.
-              for (DirectParserASTContent child in body.children!) {
+              for (ParserAstNode child in body.children!) {
                 shouldCompile = false;
-                if (child is DirectParserASTContentMemberEnd) {
+                if (child is MemberEnd) {
                   if (child.isClassConstructor()) {
-                    DirectParserASTContentClassConstructorEnd memberDecl =
+                    ClassConstructorEnd memberDecl =
                         child.getClassConstructor();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1396,23 +1395,21 @@
                     what = "class constructor";
                     shouldCompile = true;
                   } else if (child.isClassFields()) {
-                    DirectParserASTContentClassFieldsEnd memberDecl =
-                        child.getClassFields();
+                    ClassFieldsEnd memberDecl = child.getClassFields();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "class fields";
                     shouldCompile = true;
                   } else if (child.isClassMethod()) {
-                    DirectParserASTContentClassMethodEnd memberDecl =
-                        child.getClassMethod();
+                    ClassMethodEnd memberDecl = child.getClassMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "class method";
                     shouldCompile = true;
                   } else if (child.isClassFactoryMethod()) {
-                    DirectParserASTContentClassFactoryMethodEnd memberDecl =
+                    ClassFactoryMethodEnd memberDecl =
                         child.getClassFactoryMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1424,10 +1421,8 @@
                     continue;
                   }
                 } else if (child.isMetadata()) {
-                  DirectParserASTContentMetadataStarEnd decl =
-                      child.asMetadata();
-                  List<DirectParserASTContentMetadataEnd> metadata =
-                      decl.getMetadataEntries();
+                  MetadataStarEnd decl = child.asMetadata();
+                  List<MetadataEnd> metadata = decl.getMetadataEntries();
                   if (metadata.isNotEmpty) {
                     helper.replacements.add(new _Replacement(
                         metadata.first.beginToken.offset - 1,
@@ -1441,8 +1436,8 @@
                       helper, uri, initialComponent, what);
                   if (helper.shouldQuit) return;
                   if (!success) {
-                    DirectParserASTContentBlockFunctionBodyEnd? decl;
-                    if (child is DirectParserASTContentMemberEnd) {
+                    BlockFunctionBodyEnd? decl;
+                    if (child is MemberEnd) {
                       if (child.isClassMethod()) {
                         decl = child.getClassMethod().getBlockFunctionBody();
                       } else if (child.isClassConstructor()) {
@@ -1498,9 +1493,8 @@
             }
           } else if (child.isMixinDeclaration()) {
             // Also try to remove all content of the mixin.
-            DirectParserASTContentMixinDeclarationEnd decl =
-                child.asMixinDeclaration();
-            DirectParserASTContentClassOrMixinOrExtensionBodyEnd body =
+            MixinDeclarationEnd decl = child.asMixinDeclaration();
+            ClassOrMixinOrExtensionBodyEnd body =
                 decl.getClassOrMixinOrExtensionBody();
             if (body.beginToken.offset + 2 < body.endToken.offset) {
               helper.replacements.add(new _Replacement(
@@ -1513,11 +1507,11 @@
 
             if (!success) {
               // Also try to remove members one at a time.
-              for (DirectParserASTContent child in body.children!) {
+              for (ParserAstNode child in body.children!) {
                 shouldCompile = false;
-                if (child is DirectParserASTContentMemberEnd) {
+                if (child is MemberEnd) {
                   if (child.isMixinConstructor()) {
-                    DirectParserASTContentMixinConstructorEnd memberDecl =
+                    MixinConstructorEnd memberDecl =
                         child.getMixinConstructor();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1525,23 +1519,21 @@
                     what = "mixin constructor";
                     shouldCompile = true;
                   } else if (child.isMixinFields()) {
-                    DirectParserASTContentMixinFieldsEnd memberDecl =
-                        child.getMixinFields();
+                    MixinFieldsEnd memberDecl = child.getMixinFields();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "mixin fields";
                     shouldCompile = true;
                   } else if (child.isMixinMethod()) {
-                    DirectParserASTContentMixinMethodEnd memberDecl =
-                        child.getMixinMethod();
+                    MixinMethodEnd memberDecl = child.getMixinMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "mixin method";
                     shouldCompile = true;
                   } else if (child.isMixinFactoryMethod()) {
-                    DirectParserASTContentMixinFactoryMethodEnd memberDecl =
+                    MixinFactoryMethodEnd memberDecl =
                         child.getMixinFactoryMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1553,10 +1545,8 @@
                     continue;
                   }
                 } else if (child.isMetadata()) {
-                  DirectParserASTContentMetadataStarEnd decl =
-                      child.asMetadata();
-                  List<DirectParserASTContentMetadataEnd> metadata =
-                      decl.getMetadataEntries();
+                  MetadataStarEnd decl = child.asMetadata();
+                  List<MetadataEnd> metadata = decl.getMetadataEntries();
                   if (metadata.isNotEmpty) {
                     helper.replacements.add(new _Replacement(
                         metadata.first.beginToken.offset - 1,
@@ -1570,8 +1560,8 @@
                       helper, uri, initialComponent, what);
                   if (helper.shouldQuit) return;
                   if (!success) {
-                    DirectParserASTContentBlockFunctionBodyEnd? decl;
-                    if (child is DirectParserASTContentMemberEnd) {
+                    BlockFunctionBodyEnd? decl;
+                    if (child is MemberEnd) {
                       if (child.isClassMethod()) {
                         decl = child.getClassMethod().getBlockFunctionBody();
                       } else if (child.isClassConstructor()) {
@@ -1767,7 +1757,7 @@
 
   bool _knownByCompiler(Uri uri) {
     LibraryBuilder? libraryBuilder = _latestCrashingIncrementalCompiler!
-        .userCode!.loader
+        .kernelTargetForTesting!.loader
         .lookupLibraryBuilder(_getImportUri(uri));
     if (libraryBuilder != null) {
       return true;
@@ -1786,14 +1776,14 @@
   bool _isUriNnbd(Uri uri, {bool crashOnFail: true}) {
     Uri asImportUri = _getImportUri(uri);
     LibraryBuilder? libraryBuilder = _latestCrashingIncrementalCompiler!
-        .userCode!.loader
+        .kernelTargetForTesting!.loader
         .lookupLibraryBuilder(asImportUri);
     if (libraryBuilder != null) {
       return libraryBuilder.isNonNullableByDefault;
     }
     print("Couldn't lookup $uri");
     for (LibraryBuilder libraryBuilder in _latestCrashingIncrementalCompiler!
-        .userCode!.loader.libraryBuilders) {
+        .kernelTargetForTesting!.loader.libraryBuilders) {
       if (libraryBuilder.importUri == uri) {
         print("Found $uri as ${libraryBuilder.importUri} (!= ${asImportUri})");
         return libraryBuilder.isNonNullableByDefault;
@@ -1826,7 +1816,9 @@
     }
     incrementalCompiler.invalidate(_mainUri);
     try {
-      _latestComponent = await incrementalCompiler.computeDelta();
+      IncrementalCompilerResult incrementalCompilerResult =
+          await incrementalCompiler.computeDelta();
+      _latestComponent = incrementalCompilerResult.component;
       if (_settings.serialize) {
         // We're asked to serialize, probably because it crashes in
         // serialization.
@@ -1839,7 +1831,9 @@
 
       for (Uri uri in _settings.invalidate) {
         incrementalCompiler.invalidate(uri);
-        Component delta = await incrementalCompiler.computeDelta();
+        IncrementalCompilerResult deltaResult =
+            await incrementalCompiler.computeDelta();
+        Component delta = deltaResult.component;
         if (_settings.serialize) {
           // We're asked to serialize, probably because it crashes in
           // serialization.
@@ -1926,7 +1920,9 @@
   Future<Component> _getInitialComponent() async {
     IncrementalCompiler incrementalCompiler =
         new IncrementalCompiler(_setupCompilerContext());
-    Component originalComponent = await incrementalCompiler.computeDelta();
+    IncrementalCompilerResult incrementalCompilerResult =
+        await incrementalCompiler.computeDelta();
+    Component originalComponent = incrementalCompilerResult.component;
     return originalComponent;
   }
 
diff --git a/pkg/front_end/test/dartdoc_test_test.dart b/pkg/front_end/test/dartdoc_test_test.dart
index 455a8cf..35de337 100644
--- a/pkg/front_end/test/dartdoc_test_test.dart
+++ b/pkg/front_end/test/dartdoc_test_test.dart
@@ -1,5 +1,3 @@
-// @dart = 2.9
-
 import 'dart:convert';
 import 'dart:typed_data';
 
@@ -393,7 +391,7 @@
 }
 
 int expectCalls = 0;
-String expectCategory;
+String? expectCategory;
 
 void expect(dynamic actual, dynamic expected) {
   expectCalls++;
@@ -461,23 +459,23 @@
   return false;
 }
 
-impl.CommentString extractFirstComment(String test) {
+impl.CommentString? extractFirstComment(String test) {
   Token firstToken = impl.scanRawBytes(utf8.encode(test) as Uint8List);
   Token token = firstToken;
   while (true) {
-    CommentToken comment = token.precedingComments;
+    CommentToken? comment = token.precedingComments;
     if (comment != null) {
       return impl.extractComments(comment, test);
     }
     if (token.isEof) break;
-    Token next = token.next;
+    Token? next = token.next;
     if (next == null) break;
     token = next;
   }
   return null;
 }
 
-List<impl.Test> extractTests(String test, [Uri uri]) {
+List<impl.Test> extractTests(String test, [Uri? uri]) {
   return impl.extractTests(utf8.encode(test) as Uint8List,
       uri ?? new Uri(scheme: "darttest", path: "/foo.dart"));
 }
diff --git a/pkg/front_end/test/dartdoctest_suite.dart b/pkg/front_end/test/dartdoctest_suite.dart
index 447ab20..d71cd57 100644
--- a/pkg/front_end/test/dartdoctest_suite.dart
+++ b/pkg/front_end/test/dartdoctest_suite.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:testing/testing.dart'
     show Chain, ChainContext, Result, Step, TestDescription, runMe;
 
diff --git a/pkg/front_end/test/deps_git_test.dart b/pkg/front_end/test/deps_git_test.dart
index c542bc5..2017352 100644
--- a/pkg/front_end/test/deps_git_test.dart
+++ b/pkg/front_end/test/deps_git_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.md file.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart';
@@ -75,7 +73,7 @@
         new DillTarget(ticker, uriTranslator, c.options.target);
     KernelTarget kernelTarget =
         new KernelTarget(c.fileSystem, false, dillTarget, uriTranslator);
-    Uri platform = c.options.sdkSummary;
+    Uri? platform = c.options.sdkSummary;
     if (platform != null) {
       var bytes = new File.fromUri(platform).readAsBytesSync();
       var platformComponent = loadComponentFromBytes(bytes);
@@ -84,7 +82,7 @@
     }
 
     kernelTarget.setEntryPoints(c.options.inputs);
-    await dillTarget.buildOutlines();
+    dillTarget.buildOutlines();
     await kernelTarget.loader.buildOutlines();
     return new List<Uri>.from(c.dependencies);
   });
diff --git a/pkg/front_end/test/desugar_test.dart b/pkg/front_end/test/desugar_test.dart
index 82fdd4a..18342bb 100644
--- a/pkg/front_end/test/desugar_test.dart
+++ b/pkg/front_end/test/desugar_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 ensure that desugaring APIs used by clients like dart2js are
 /// always up to date.
 ///
@@ -33,13 +31,13 @@
 
 Future<void> testRedirectingFactoryDirect() async {
   var component = await compileUnit(['a.dart'], {'a.dart': aSource});
-  checkIsRedirectingFactory(component, 'a.dart', 'A', 'foo');
+  checkIsRedirectingFactory(component!, 'a.dart', 'A', 'foo');
   checkIsRedirectingFactory(component, 'core', 'Uri', 'file');
 }
 
 Future<void> testRedirectingFactorySerialized() async {
   var component = await compileUnit(['a.dart'], {'a.dart': aSource});
-  var bytes = serializeComponent(component);
+  var bytes = serializeComponent(component!);
   component = new ir.Component();
   new BinaryBuilder(bytes).readComponent(component);
   checkIsRedirectingFactory(component, 'a.dart', 'A', 'foo');
@@ -62,8 +60,8 @@
   var lib =
       component.libraries.firstWhere((l) => l.importUri.path.endsWith(uriPath));
   var cls = lib.classes.firstWhere((c) => c.name == className);
-  ir.Procedure member =
-      cls.members.firstWhere((m) => m.name.text == constructorName);
+  ir.Procedure member = cls.members
+      .firstWhere((m) => m.name.text == constructorName) as ir.Procedure;
   Expect.isTrue(
       member.kind == ir.ProcedureKind.Factory, "$member is not a factory");
   Expect.isTrue(api.isRedirectingFactory(member));
diff --git a/pkg/front_end/test/dijkstras_sssp_algorithm.dart b/pkg/front_end/test/dijkstras_sssp_algorithm.dart
index 1c0a623..398ea2c 100644
--- a/pkg/front_end/test/dijkstras_sssp_algorithm.dart
+++ b/pkg/front_end/test/dijkstras_sssp_algorithm.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 'dart:collection';
 
 /// Dijkstra's algorithm for single source shortest path.
@@ -21,8 +19,8 @@
   DijkstrasAlgorithm(Iterable<GraphNode<E>> graphNodes, GraphNode<E> source,
       int Function(E, E) comparator, int Function(E, E) distance) {
     SplayTreeSet<GraphNode<E>> q = new SplayTreeSet<GraphNode<E>>((a, b) {
-      int distA = dist[a];
-      int distB = dist[b];
+      int? distA = dist[a];
+      int? distB = dist[b];
 
       int when0() {
         if (identical(a, b)) return 0;
@@ -39,7 +37,7 @@
       if (distA == null && distB == null) {
         return when0();
       }
-      if (distA < distB) return -1;
+      if (distA! < distB!) return -1;
       if (distA > distB) return 1;
       return when0();
     });
@@ -56,7 +54,7 @@
 
     while (q.isNotEmpty) {
       GraphNode<E> u = q.first;
-      int distToU = dist[u];
+      int? distToU = dist[u];
       if (distToU == null) {
         // No path to any of the remaining ${q.length} nodes.
         break;
@@ -68,7 +66,7 @@
         int distanceUToV = distance(u.node, v.node);
         if (distanceUToV < 0) throw "Got negative distance. That's not allowed";
         int alt = distToU + distanceUToV;
-        int distToV = dist[v];
+        int? distToV = dist[v];
         if (distToV == null || alt < distToV) {
           // Decrease length (decrease priority in priority queue).
           q.remove(v);
@@ -85,7 +83,7 @@
     GraphNode<E> u = target;
     while (u == source || prev[u] != null) {
       path.add(u.node);
-      u = prev[u];
+      u = prev[u]!;
     }
     return path.reversed.toList();
   }
diff --git a/pkg/front_end/test/dill_round_trip_test.dart b/pkg/front_end/test/dill_round_trip_test.dart
index 32d5759..716b186 100644
--- a/pkg/front_end/test/dill_round_trip_test.dart
+++ b/pkg/front_end/test/dill_round_trip_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
-
 import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
 import 'package:kernel/ast.dart' show Component;
diff --git a/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart b/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart
index f5fb221..a5f766e 100644
--- a/pkg/front_end/test/enable_non_nullable/enable_non_nullable_test.dart
+++ b/pkg/front_end/test/enable_non_nullable/enable_non_nullable_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.md file.
 
-// @dart = 2.9
-
 import 'dart:io';
 
 import 'package:expect/expect.dart';
@@ -59,10 +57,10 @@
 }
 
 Future<void> test(
-    {bool enableNonNullableByDefault,
-    bool enableNonNullableExplicitly,
-    Version versionImpliesOptIn,
-    Version versionOptsInAllowed}) async {
+    {required bool enableNonNullableByDefault,
+    required bool enableNonNullableExplicitly,
+    required Version versionImpliesOptIn,
+    required Version versionOptsInAllowed}) async {
   CompilerOptions options = new CompilerOptions();
   if (enableNonNullableByDefault) {
     // Pretend non-nullable is on by default.
@@ -112,12 +110,12 @@
 
   Directory directory = new Directory.fromUri(
       Uri.base.resolve('pkg/front_end/test/enable_non_nullable/data/'));
-  CompilerResult result = await kernelForProgramInternal(
+  CompilerResult result = (await kernelForProgramInternal(
       directory.uri.resolve('main.dart'), options,
-      retainDataForTesting: true);
+      retainDataForTesting: true))!;
   Expect.isFalse(
       hadDiagnostic, "Compilation had diagnostics (errors, warnings)!");
-  for (Library library in result.component.libraries) {
+  for (Library library in result.component!.libraries) {
     if (library.importUri.scheme != 'dart') {
       bool usesLegacy =
           await uriUsesLegacyLanguageVersion(library.fileUri, options);
diff --git a/pkg/front_end/test/explicit_creation_git_test.dart b/pkg/front_end/test/explicit_creation_git_test.dart
index 5028925..dc8e3a1 100644
--- a/pkg/front_end/test/explicit_creation_git_test.dart
+++ b/pkg/front_end/test/explicit_creation_git_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
-
 import 'dart:io';
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart';
@@ -86,15 +84,14 @@
 
   Stopwatch stopwatch = new Stopwatch()..start();
 
-  await CompilerContext.runWithOptions<List<Uri>>(options,
-      (CompilerContext c) async {
+  await CompilerContext.runWithOptions(options, (CompilerContext c) async {
     UriTranslator uriTranslator = await c.options.getUriTranslator();
     DillTarget dillTarget =
         new DillTarget(ticker, uriTranslator, c.options.target);
     KernelTarget kernelTarget =
         new KernelTargetTest(c.fileSystem, false, dillTarget, uriTranslator);
 
-    Uri platform = c.options.sdkSummary;
+    Uri? platform = c.options.sdkSummary;
     if (platform != null) {
       var bytes = new File.fromUri(platform).readAsBytesSync();
       var platformComponent = loadComponentFromBytes(bytes);
@@ -103,10 +100,9 @@
     }
 
     kernelTarget.setEntryPoints(c.options.inputs);
-    await dillTarget.buildOutlines();
+    dillTarget.buildOutlines();
     await kernelTarget.buildOutlines();
     await kernelTarget.buildComponent();
-    return null;
   });
 
   print("Done in ${stopwatch.elapsedMilliseconds} ms. "
@@ -138,7 +134,7 @@
   @override
   BodyBuilder createBodyBuilderForOutlineExpression(
       SourceLibraryBuilder library,
-      DeclarationBuilder declarationBuilder,
+      DeclarationBuilder? declarationBuilder,
       ModifierBuilder member,
       Scope scope,
       Uri fileUri) {
@@ -162,10 +158,10 @@
   BodyBuilder createListenerInternal(
       ModifierBuilder builder,
       Scope memberScope,
-      Scope formalParameterScope,
+      Scope? formalParameterScope,
       bool isDeclarationInstanceMember,
-      VariableDeclaration extensionThis,
-      List<TypeParameter> extensionTypeParameters,
+      VariableDeclaration? extensionThis,
+      List<TypeParameter>? extensionTypeParameters,
       TypeInferrer typeInferrer,
       ConstantContext constantContext) {
     return new BodyBuilderTest(
@@ -221,7 +217,7 @@
   @override
   BodyBuilderTest.forOutlineExpression(
       SourceLibraryBuilder library,
-      DeclarationBuilder declarationBuilder,
+      DeclarationBuilder? declarationBuilder,
       ModifierBuilder member,
       Scope scope,
       Uri fileUri)
@@ -230,18 +226,18 @@
 
   @override
   Expression buildConstructorInvocation(
-      TypeDeclarationBuilder type,
+      TypeDeclarationBuilder? type,
       Token nameToken,
       Token nameLastToken,
-      Arguments arguments,
+      Arguments? arguments,
       String name,
-      List<TypeBuilder> typeArguments,
+      List<TypeBuilder>? typeArguments,
       int charOffset,
       Constness constness,
       {bool isTypeArgumentsInForest = false,
-      TypeDeclarationBuilder typeAliasBuilder,
-      UnresolvedKind unresolvedKind}) {
-    Token maybeNewOrConst = nameToken.previous;
+      TypeDeclarationBuilder? typeAliasBuilder,
+      required UnresolvedKind unresolvedKind}) {
+    Token maybeNewOrConst = nameToken.previous!;
     bool doReport = true;
     if (maybeNewOrConst is KeywordToken) {
       if (maybeNewOrConst.lexeme == "new" ||
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 5765b21..2bb86f3 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -45,7 +43,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new ExtensionsDataExtractor(compilerResult, actualMap));
   }
 
@@ -55,7 +53,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
@@ -65,7 +63,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -76,7 +74,7 @@
       InternalCompilerResult compilerResult,
       Extension extension,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new ExtensionsDataExtractor(compilerResult, actualMap)
         .computeForExtension(extension);
   }
@@ -146,9 +144,9 @@
   Features computeLibraryValue(Id id, Library library) {
     Features features = new Features();
     SourceLibraryBuilder libraryBuilder =
-        lookupLibraryBuilder(compilerResult, library);
+        lookupLibraryBuilder(compilerResult, library) as SourceLibraryBuilder;
     libraryBuilder.forEachExtensionInScope((ExtensionBuilder extension) {
-      LibraryBuilder library = extension.parent;
+      LibraryBuilder library = extension.parent as LibraryBuilder;
       String libraryPrefix = '';
       if (library != libraryBuilder) {
         libraryPrefix = '${library.fileUri.pathSegments.last}.';
@@ -159,28 +157,32 @@
   }
 
   @override
-  Features computeClassValue(Id id, Class cls) {
-    ClassBuilder clsBuilder = lookupClassBuilder(compilerResult, cls);
+  Features? computeClassValue(Id id, Class cls) {
+    ClassBuilder clsBuilder =
+        lookupClassBuilder(compilerResult, cls) as ClassBuilder;
     if (!clsBuilder.isExtension) {
       return null;
     }
     Features features = new Features();
     features[Tags.builderName] = clsBuilder.name;
     if (clsBuilder.typeVariables != null) {
-      for (TypeVariableBuilder typeVariable in clsBuilder.typeVariables) {
+      for (TypeVariableBuilder typeVariable in clsBuilder.typeVariables!) {
         features.addElement(Tags.builderTypeParameters,
             typeVariableBuilderToText(typeVariable));
       }
     }
 
-    features[Tags.builderSupertype] = clsBuilder.supertypeBuilder?.name;
+    if (clsBuilder.supertypeBuilder != null) {
+      features[Tags.builderSupertype] =
+          clsBuilder.supertypeBuilder!.name as String;
+    }
     if (clsBuilder.interfaceBuilders != null) {
-      for (TypeBuilder superinterface in clsBuilder.interfaceBuilders) {
+      for (TypeBuilder superinterface in clsBuilder.interfaceBuilders!) {
         features.addElement(Tags.builderInterfaces, superinterface.name);
       }
     }
     if (clsBuilder.onTypes != null) {
-      for (TypeBuilder onType in clsBuilder.onTypes) {
+      for (TypeBuilder onType in clsBuilder.onTypes!) {
         features.addElement(Tags.builderOnTypes, typeBuilderToText(onType));
       }
     }
@@ -190,7 +192,9 @@
       features.addElement(
           Tags.clsTypeParameters, typeParameterToText(typeParameter));
     }
-    features[Tags.clsSupertype] = cls.supertype?.classNode?.name;
+    if (cls.supertype != null) {
+      features[Tags.clsSupertype] = cls.supertype!.classNode.name;
+    }
     for (Supertype superinterface in cls.implementedTypes) {
       features.addElement(Tags.clsInterfaces, superinterface.classNode.name);
     }
@@ -198,9 +202,9 @@
   }
 
   @override
-  Features computeExtensionValue(Id id, Extension extension) {
+  Features? computeExtensionValue(Id id, Extension extension) {
     ExtensionBuilder extensionBuilder =
-        lookupExtensionBuilder(compilerResult, extension);
+        lookupExtensionBuilder(compilerResult, extension)!;
     if (!extensionBuilder.isExtension) {
       return null;
     }
@@ -208,19 +212,14 @@
     features[Tags.builderName] = extensionBuilder.name;
     if (extensionBuilder.typeParameters != null) {
       for (TypeVariableBuilder typeVariable
-          in extensionBuilder.typeParameters) {
+          in extensionBuilder.typeParameters!) {
         features.addElement(Tags.builderTypeParameters,
             typeVariableBuilderToText(typeVariable));
       }
     }
-    if (extensionBuilder.onType != null) {
-      features[Tags.builderOnType] = typeBuilderToText(extensionBuilder.onType);
-    }
-
+    features[Tags.builderOnType] = typeBuilderToText(extensionBuilder.onType);
     features[Tags.extensionName] = extension.name;
-    if (extension.onType != null) {
-      features[Tags.extensionOnType] = typeToText(extension.onType);
-    }
+    features[Tags.extensionOnType] = typeToText(extension.onType);
     for (TypeParameter typeParameter in extension.typeParameters) {
       features.addElement(
           Tags.extensionTypeParameters, typeParameterToText(typeParameter));
@@ -233,17 +232,17 @@
   }
 
   @override
-  Features computeMemberValue(Id id, Member member) {
+  Features? computeMemberValue(Id id, Member member) {
     if (!member.isExtensionMember) {
       return null;
     }
 
-    MemberBuilder memberBuilder = lookupMemberBuilder(compilerResult, member);
+    MemberBuilder memberBuilder = lookupMemberBuilder(compilerResult, member)!;
     Features features = new Features();
     features[Tags.builderName] = memberBuilder.name;
     if (memberBuilder is FunctionBuilder) {
       if (memberBuilder.formals != null) {
-        for (FormalParameterBuilder parameter in memberBuilder.formals) {
+        for (FormalParameterBuilder parameter in memberBuilder.formals!) {
           if (parameter.isRequired) {
             features.addElement(Tags.builderRequiredParameters, parameter.name);
           } else if (parameter.isPositional) {
@@ -259,7 +258,7 @@
         features.markAsUnsorted(Tags.builderNamedParameters);
       }
       if (memberBuilder.typeVariables != null) {
-        for (TypeVariableBuilder typeVariable in memberBuilder.typeVariables) {
+        for (TypeVariableBuilder typeVariable in memberBuilder.typeVariables!) {
           features.addElement(Tags.builderTypeParameters,
               typeVariableBuilderToText(typeVariable));
         }
@@ -269,23 +268,23 @@
     features[Tags.memberName] = getMemberName(member);
     if (member.function != null) {
       for (int index = 0;
-          index < member.function.positionalParameters.length;
+          index < member.function!.positionalParameters.length;
           index++) {
         VariableDeclaration parameter =
-            member.function.positionalParameters[index];
-        if (index < member.function.requiredParameterCount) {
+            member.function!.positionalParameters[index];
+        if (index < member.function!.requiredParameterCount) {
           features.addElement(Tags.memberRequiredParameters, parameter.name);
         } else {
           features.addElement(Tags.memberPositionalParameters, parameter.name);
         }
       }
-      for (VariableDeclaration parameter in member.function.namedParameters) {
+      for (VariableDeclaration parameter in member.function!.namedParameters) {
         features.addElement(Tags.memberNamedParameters, parameter.name);
       }
       features.markAsUnsorted(Tags.memberRequiredParameters);
       features.markAsUnsorted(Tags.memberPositionalParameters);
       features.markAsUnsorted(Tags.memberNamedParameters);
-      for (TypeParameter typeParameter in member.function.typeParameters) {
+      for (TypeParameter typeParameter in member.function!.typeParameters) {
         features.addElement(
             Tags.memberTypeParameters, typeParameterToText(typeParameter));
       }
@@ -295,7 +294,7 @@
   }
 
   @override
-  Features computeNodeValue(Id id, TreeNode node) {
+  Features? computeNodeValue(Id id, TreeNode node) {
     if (node is ThisExpression) {
       Features features = new Features();
       features.add(Tags.hasThis);
diff --git a/pkg/front_end/test/fasta/ambiguous_export_test.dart b/pkg/front_end/test/fasta/ambiguous_export_test.dart
index fa0ef8f..2b9dc15 100644
--- a/pkg/front_end/test/fasta/ambiguous_export_test.dart
+++ b/pkg/front_end/test/fasta/ambiguous_export_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.md file.
 
-// @dart = 2.9
-
 import 'package:async_helper/async_helper.dart' show asyncTest;
 
 import 'package:expect/expect.dart' show Expect;
@@ -34,7 +32,7 @@
           await c.options.getUriTranslator(), c.options.target);
       target.loader.appendLibraries(component);
       DillLibraryBuilder builder = target.loader.read(library.importUri, -1);
-      await target.loader.buildOutline(builder);
+      target.loader.buildOutline(builder);
       builder.markAsReadyToFinalizeExports();
       var mainExport =
           builder.exportScope.lookupLocalMember("main", setter: false);
diff --git a/pkg/front_end/test/fasta/analyze_git_test.dart b/pkg/front_end/test/fasta/analyze_git_test.dart
index c649729..30d0ba3 100644
--- a/pkg/front_end/test/fasta/analyze_git_test.dart
+++ b/pkg/front_end/test/fasta/analyze_git_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
-
 import 'dart:io' show exitCode;
 
 import "package:testing/src/run_tests.dart" as testing show main;
diff --git a/pkg/front_end/test/fasta/analyze_src_with_lints_git_test.dart b/pkg/front_end/test/fasta/analyze_src_with_lints_git_test.dart
index b4b0e5f..664e888 100644
--- a/pkg/front_end/test/fasta/analyze_src_with_lints_git_test.dart
+++ b/pkg/front_end/test/fasta/analyze_src_with_lints_git_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
-
 import 'dart:io' show exitCode;
 
 import "package:testing/src/run_tests.dart" as testing show main;
diff --git a/pkg/front_end/test/fasta/assert_locations_test.dart b/pkg/front_end/test/fasta/assert_locations_test.dart
index 029196a..4f4787e 100644
--- a/pkg/front_end/test/fasta/assert_locations_test.dart
+++ b/pkg/front_end/test/fasta/assert_locations_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.md file.
 
-// @dart = 2.9
-
 library fasta.test.assert_locations_test;
 
 import 'package:async_helper/async_helper.dart' show asyncTest;
@@ -47,7 +45,7 @@
   // parenthesis of the assert statement to the first character of the
   // condition.
   void makeAssertWithMessage(String condition,
-      {String message, bool trailingComma: false, int additionalOffset: 0}) {
+      {String? message, bool trailingComma: false, int additionalOffset: 0}) {
     final name = 'testCase${spans.length}';
     sb.writeln('void $name(x) {');
     sb.write('assert(');
@@ -110,7 +108,7 @@
 
   /// When [AssertStatement] is reached it is checked against this
   /// span.
-  ConditionSpan expectedSpan;
+  ConditionSpan? expectedSpan;
 
   VerifyingVisitor(this.test);
 
@@ -126,8 +124,8 @@
 
   @override
   void visitAssertStatement(AssertStatement node) {
-    Expect.equals(expectedSpan.startOffset, node.conditionStartOffset);
-    Expect.equals(expectedSpan.endOffset, node.conditionEndOffset);
+    Expect.equals(expectedSpan!.startOffset, node.conditionStartOffset);
+    Expect.equals(expectedSpan!.endOffset, node.conditionEndOffset);
   }
 }
 
@@ -139,12 +137,12 @@
         Expect.fail(
             "Unexpected message: ${message.plainTextFormatted.join('\n')}");
       };
-    Component p = (await compileScript(test.source,
+    Component? p = (await compileScript(test.source,
             options: options, fileName: 'synthetic-test.dart'))
         ?.component;
     Expect.isNotNull(p);
     VerifyingVisitor visitor = new VerifyingVisitor(test);
-    p.mainMethod.enclosingLibrary.accept(visitor);
+    p!.mainMethod!.enclosingLibrary.accept(visitor);
     Expect.setEquals(test.spans.keys, visitor.verified);
   });
 }
diff --git a/pkg/front_end/test/fasta/bootstrap_test.dart b/pkg/front_end/test/fasta/bootstrap_test.dart
index fd49f77..750c685 100644
--- a/pkg/front_end/test/fasta/bootstrap_test.dart
+++ b/pkg/front_end/test/fasta/bootstrap_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
-
 import 'dart:io' show Directory, File, Platform;
 
 import 'package:async_helper/async_helper.dart' show asyncEnd, asyncStart;
diff --git a/pkg/front_end/test/fasta/expression_suite.dart b/pkg/front_end/test/fasta/expression_suite.dart
index d6159f9..371e8ef 100644
--- a/pkg/front_end/test/fasta/expression_suite.dart
+++ b/pkg/front_end/test/fasta/expression_suite.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.md file.
 
-// @dart = 2.9
-
 library fasta.test.expression_test;
 
 import "dart:convert" show JsonEncoder;
@@ -73,7 +71,7 @@
 
   ProcessedOptions get options => compilerContext.options;
 
-  MemoryFileSystem get fileSystem => options.fileSystem;
+  MemoryFileSystem get fileSystem => options.fileSystem as MemoryFileSystem;
 
   Future<T> runInContext<T>(Future<T> action(CompilerContext c)) {
     return compilerContext.runInContext<T>(action);
@@ -91,7 +89,7 @@
 }
 
 class CompilationResult {
-  Procedure compiledProcedure;
+  Procedure? compiledProcedure;
   List<DiagnosticMessage> errors;
   CompilationResult(this.compiledProcedure, this.errors);
 
@@ -115,7 +113,7 @@
       buffer.write("<no procedure>");
     } else {
       Printer printer = new Printer(buffer);
-      printer.visitProcedure(compiledProcedure);
+      printer.visitProcedure(compiledProcedure!);
       printer.writeConstantTable(new Component());
     }
     Uri base = entryPoint.resolve(".");
@@ -126,9 +124,9 @@
 class TestCase {
   final TestDescription description;
 
-  final Uri entryPoint;
+  final Uri? entryPoint;
 
-  final Uri import;
+  final Uri? import;
 
   final List<String> definitions;
 
@@ -136,13 +134,13 @@
 
   final bool isStaticMethod;
 
-  final Uri library;
+  final Uri? library;
 
-  final String className;
+  final String? className;
 
-  final String methodName;
+  final String? methodName;
 
-  String expression;
+  String? expression;
 
   List<CompilationResult> results = [];
 
@@ -170,12 +168,12 @@
         "static = $isStaticMethod)";
   }
 
-  String validate() {
+  String? validate() {
     print(this);
     if (entryPoint == null) {
       return "No entryPoint.";
     }
-    if (!(new File.fromUri(entryPoint)).existsSync()) {
+    if (!(new File.fromUri(entryPoint!)).existsSync()) {
       return "Entry point $entryPoint doesn't exist.";
     }
     if (library == null) {
@@ -202,10 +200,10 @@
   Future<Result<Null>> run(List<TestCase> tests, Context context) async {
     String actual = "";
     for (var test in tests) {
-      var primary = test.results.first.printResult(test.entryPoint, context);
+      var primary = test.results.first.printResult(test.entryPoint!, context);
       actual += primary;
       for (int i = 1; i < test.results.length; ++i) {
-        var secondary = test.results[i].printResult(test.entryPoint, context);
+        var secondary = test.results[i].printResult(test.entryPoint!, context);
         if (primary != secondary) {
           return fail(
               null,
@@ -256,15 +254,15 @@
     Uri uri = description.uri;
     String contents = await new File.fromUri(uri).readAsString();
 
-    Uri entryPoint;
-    Uri import;
+    Uri? entryPoint;
+    Uri? import;
     List<String> definitions = <String>[];
     List<String> typeDefinitions = <String>[];
     bool isStaticMethod = false;
-    Uri library;
-    String className;
-    String methodName;
-    String expression;
+    Uri? library;
+    String? className;
+    String? methodName;
+    String? expression;
 
     dynamic maps = loadYamlNode(contents, sourceUrl: uri);
     if (maps is YamlMap) maps = [maps];
@@ -282,7 +280,7 @@
         } else if (key == "position") {
           Uri uri = description.uri.resolveUri(Uri.parse(value as String));
           library = uri.removeFragment();
-          if (uri.fragment != null && uri.fragment != '') {
+          if (uri.fragment != '') {
             className = uri.fragment;
           }
         } else if (key == "method") {
@@ -339,12 +337,12 @@
           .add(new TypeParameter(name, new DynamicType(), new DynamicType()));
     }
 
-    Procedure compiledProcedure = await compiler.compileExpression(
-      test.expression,
+    Procedure? compiledProcedure = await compiler.compileExpression(
+      test.expression!,
       definitions,
       typeParams,
       "debugExpr",
-      test.library,
+      test.library!,
       className: test.className,
       methodName: test.methodName,
       isStatic: test.isStaticMethod,
@@ -363,23 +361,25 @@
   Future<Result<List<TestCase>>> run(
       List<TestCase> tests, Context context) async {
     for (var test in tests) {
-      context.fileSystem.entityForUri(test.entryPoint).writeAsBytesSync(
-          await new File.fromUri(test.entryPoint).readAsBytes());
+      context.fileSystem.entityForUri(test.entryPoint!).writeAsBytesSync(
+          await new File.fromUri(test.entryPoint!).readAsBytes());
 
       if (test.import != null) {
-        context.fileSystem.entityForUri(test.import).writeAsBytesSync(
-            await new File.fromUri(test.import).readAsBytes());
+        context.fileSystem.entityForUri(test.import!).writeAsBytesSync(
+            await new File.fromUri(test.import!).readAsBytes());
       }
 
       var sourceCompiler = new IncrementalCompiler(context.compilerContext);
-      Component component =
-          await sourceCompiler.computeDelta(entryPoints: [test.entryPoint]);
+      var sourceCompilerResult =
+          await sourceCompiler.computeDelta(entryPoints: [test.entryPoint!]);
+      Component component = sourceCompilerResult.component;
       var errors = context.takeErrors();
       if (!errors.isEmpty) {
         return fail(tests, "Couldn't compile entry-point: $errors");
       }
       Uri dillFileUri = new Uri(
-          scheme: test.entryPoint.scheme, path: test.entryPoint.path + ".dill");
+          scheme: test.entryPoint!.scheme,
+          path: test.entryPoint!.path + ".dill");
       File dillFile = new File.fromUri(dillFileUri);
       if (!await dillFile.exists()) {
         await writeComponentToFile(component, dillFileUri);
@@ -390,8 +390,9 @@
 
       var dillCompiler =
           new IncrementalCompiler(context.compilerContext, dillFileUri);
-      component =
-          await dillCompiler.computeDelta(entryPoints: [test.entryPoint]);
+      var dillCompilerResult =
+          await dillCompiler.computeDelta(entryPoints: [test.entryPoint!]);
+      component = dillCompilerResult.component;
       component.computeCanonicalNames();
       await dillFile.delete();
 
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index b2c4f52..f4790b9 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_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 of toString on generators.
 
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
@@ -32,7 +30,8 @@
         VariableDeclaration,
         VariableGet,
         VoidType,
-        defaultLanguageVersion;
+        defaultLanguageVersion,
+        dummyLibraryDependency;
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 
@@ -61,6 +60,8 @@
 import 'package:front_end/src/fasta/source/source_library_builder.dart'
     show ImplicitLanguageVersion, SourceLibraryBuilder;
 
+import '../mock_file_system.dart';
+
 void check(String expected, Object generator) {
   Expect.stringEquals(expected, "$generator");
 }
@@ -83,21 +84,20 @@
     Expression index = new VariableGet(new VariableDeclaration("index"));
     UriTranslator uriTranslator = await c.options.getUriTranslator();
     SourceLibraryBuilder libraryBuilder = new SourceLibraryBuilder(
-        uri,
-        uri,
-        /*packageUri*/ null,
-        new ImplicitLanguageVersion(defaultLanguageVersion),
-        new KernelTarget(
-                null,
+        importUri: uri,
+        fileUri: uri,
+        packageLanguageVersion:
+            new ImplicitLanguageVersion(defaultLanguageVersion),
+        loader: new KernelTarget(
+                const MockFileSystem(),
                 false,
                 new DillTarget(c.options.ticker, uriTranslator,
                     new NoneTarget(new TargetFlags())),
                 uriTranslator)
-            .loader,
-        null);
+            .loader);
     libraryBuilder.markLanguageVersionFinal();
     LoadLibraryBuilder loadLibraryBuilder =
-        new LoadLibraryBuilder(libraryBuilder, null, -1);
+        new LoadLibraryBuilder(libraryBuilder, dummyLibraryDependency, -1);
     Procedure getter = new Procedure(
         new Name("myGetter"), ProcedureKind.Getter, new FunctionNode(null),
         fileUri: uri);
diff --git a/pkg/front_end/test/fasta/incremental_dartino_suite.dart b/pkg/front_end/test/fasta/incremental_dartino_suite.dart
index f3b354e..d6483bb 100644
--- a/pkg/front_end/test/fasta/incremental_dartino_suite.dart
+++ b/pkg/front_end/test/fasta/incremental_dartino_suite.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.md file.
 
-// @dart = 2.9
-
 library fasta.test.incremental_test;
 
 import "dart:convert" show JsonEncoder;
@@ -73,7 +71,7 @@
 
   ProcessedOptions get options => compilerContext.options;
 
-  MemoryFileSystem get fileSystem => options.fileSystem;
+  MemoryFileSystem get fileSystem => options.fileSystem as MemoryFileSystem;
 
   Future<T> runInContext<T>(Future<T> action(CompilerContext c)) {
     return compilerContext.runInContext<T>(action);
@@ -103,9 +101,9 @@
     Uri uri = description.uri;
     String contents = await new File.fromUri(uri).readAsString();
     Map<String, List<String>> sources = <String, List<String>>{};
-    List<IncrementalExpectation> expectations;
+    List<IncrementalExpectation>? expectations;
     bool firstPatch = true;
-    YamlMap map = loadYamlNode(contents, sourceUrl: uri);
+    YamlMap map = loadYamlNode(contents, sourceUrl: uri) as YamlMap;
     map.forEach((_fileName, _contents) {
       String fileName = _fileName; // Strong mode hurray!
       String contents = _contents; // Strong mode hurray!
@@ -135,7 +133,7 @@
   Future<Result<TestCase>> run(TestCase test, Context context) async {
     for (int edits = 0;; edits++) {
       bool foundSources = false;
-      test.sources.forEach((String name, List<String> sources) {
+      test.sources!.forEach((String name, List<String> sources) {
         if (edits < sources.length) {
           String source = sources[edits];
           Uri uri = base.resolve(name);
@@ -154,10 +152,11 @@
         return edits == 0 ? fail(test, "No sources found") : pass(test);
       }
       var compiler = context.compiler;
-      Component component =
+      var compilerResult =
           await compiler.computeDelta(entryPoints: [entryPoint]);
+      Component component = compilerResult.component;
       List<DiagnosticMessage> errors = context.takeErrors();
-      if (test.expectations[edits].hasCompileTimeError) {
+      if (test.expectations![edits].hasCompileTimeError) {
         if (errors.isEmpty) {
           return fail(test, "Compile-time error expected, but none reported");
         }
@@ -176,9 +175,9 @@
 class TestCase {
   final TestDescription description;
 
-  final Map<String, List<String>> sources;
+  final Map<String, List<String>>? sources;
 
-  final List<IncrementalExpectation> expectations;
+  final List<IncrementalExpectation>? expectations;
 
   TestCase(this.description, this.sources, this.expectations);
 
@@ -192,16 +191,16 @@
     if (sources == null) {
       return step.fail(this, "No sources.");
     }
-    if (expectations == null || expectations.isEmpty) {
+    if (expectations == null || expectations!.isEmpty) {
       return step.fail(this, "No expectations.");
     }
-    for (String name in sources.keys) {
-      List<String> versions = sources[name];
-      if (versions.length != 1 && versions.length != expectations.length) {
+    for (String name in sources!.keys) {
+      List<String> versions = sources![name]!;
+      if (versions.length != 1 && versions.length != expectations!.length) {
         return step.fail(
             this,
             "Found ${versions.length} versions of $name,"
-            " but expected 1 or ${expectations.length}.");
+            " but expected 1 or ${expectations!.length}.");
       }
     }
     return step.pass(this);
diff --git a/pkg/front_end/test/fasta/incremental_expectations.dart b/pkg/front_end/test/fasta/incremental_expectations.dart
index 7e9a45c..1bf173d 100644
--- a/pkg/front_end/test/fasta/incremental_expectations.dart
+++ b/pkg/front_end/test/fasta/incremental_expectations.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
-
 library fasta.test.incremental_expectations;
 
 import "dart:convert" show JsonDecoder, JsonEncoder;
diff --git a/pkg/front_end/test/fasta/incremental_hello_test.dart b/pkg/front_end/test/fasta/incremental_hello_test.dart
index 33d7d3a..125ef12 100644
--- a/pkg/front_end/test/fasta/incremental_hello_test.dart
+++ b/pkg/front_end/test/fasta/incremental_hello_test.dart
@@ -2,14 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// @dart = 2.9
-
 library fasta.test.incremental_dynamic_test;
 
 import 'package:async_helper/async_helper.dart' show asyncTest;
 
 import 'package:expect/expect.dart' show Expect;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import 'package:kernel/ast.dart' show Component;
 
 import 'package:kernel/target/targets.dart' show TargetFlags;
@@ -34,7 +35,7 @@
   throw "Unexpected message: ${message.plainTextFormatted.join('\n')}";
 }
 
-Future<void> test({bool sdkFromSource}) async {
+Future<void> test({required bool sdkFromSource}) async {
   final CompilerOptions optionBuilder = new CompilerOptions()
     ..packagesFileUri = Uri.base.resolve(".packages")
     ..target = new VmTarget(new TargetFlags())
@@ -60,7 +61,8 @@
   IncrementalCompiler compiler =
       new IncrementalCompiler(new CompilerContext(options));
 
-  Component component = await compiler.computeDelta();
+  IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+  Component component = compilerResult.component;
 
   if (sdkFromSource) {
     // Expect that the new component contains at least the following libraries:
@@ -75,12 +77,14 @@
 
   compiler.invalidate(helloDart);
 
-  component = await compiler.computeDelta(entryPoints: [helloDart]);
+  compilerResult = await compiler.computeDelta(entryPoints: [helloDart]);
+  component = compilerResult.component;
   // Expect that the new component contains exactly hello.dart
   Expect.isTrue(
       component.libraries.length == 1, "${component.libraries.length} != 1");
 
-  component = await compiler.computeDelta(entryPoints: [helloDart]);
+  compilerResult = await compiler.computeDelta(entryPoints: [helloDart]);
+  component = compilerResult.component;
   Expect.isTrue(component.libraries.isEmpty);
 }
 
diff --git a/pkg/front_end/test/fasta/incremental_source_files.dart b/pkg/front_end/test/fasta/incremental_source_files.dart
index 4108b62..274e65b 100644
--- a/pkg/front_end/test/fasta/incremental_source_files.dart
+++ b/pkg/front_end/test/fasta/incremental_source_files.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.md file.
 
-// @dart = 2.9
-
 library fasta.test.incremental_source_files;
 
 /// Expand a file with diffs in common merge conflict format into a [List] that
@@ -57,10 +55,9 @@
 ///   ["head v1 tail", "head v2 tail"]
 List<String> expandUpdates(List updates) {
   int outputCount = updates.firstWhere((e) => e is Iterable).length;
-  List<StringBuffer> result = new List<StringBuffer>.filled(outputCount, null);
-  for (int i = 0; i < outputCount; i++) {
-    result[i] = new StringBuffer();
-  }
+  List<StringBuffer> result = new List<StringBuffer>.generate(
+      outputCount, (_) => new StringBuffer(),
+      growable: false);
   for (var chunk in updates) {
     if (chunk is Iterable) {
       int segmentCount = 0;
diff --git a/pkg/front_end/test/fasta/link_test.dart b/pkg/front_end/test/fasta/link_test.dart
index d1029eb..7918446 100644
--- a/pkg/front_end/test/fasta/link_test.dart
+++ b/pkg/front_end/test/fasta/link_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
-
 import 'package:_fe_analyzer_shared/src/util/link.dart' show Link, LinkBuilder;
 
 import 'package:expect/expect.dart' show Expect;
@@ -45,6 +43,6 @@
   Expect.stringEquals("[ B, A ]", "${strings.reverse(const Link<String>())}");
 
   Link<int> ints =
-      const Link<int>().prepend(1).reverse(const Link<int>()).tail.prepend(1);
+      const Link<int>().prepend(1).reverse(const Link<int>()).tail!.prepend(1);
   Expect.stringEquals("[ 1 ]", "${ints}");
 }
diff --git a/pkg/front_end/test/fasta/messages_suite.dart b/pkg/front_end/test/fasta/messages_suite.dart
index 99579c9..df8fbb5 100644
--- a/pkg/front_end/test/fasta/messages_suite.dart
+++ b/pkg/front_end/test/fasta/messages_suite.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 "dart:convert" show utf8;
 
 import 'dart:io' show File, Platform;
@@ -66,23 +64,23 @@
 
   final YamlMap data;
 
-  final Example example;
+  final Example? example;
 
-  final String problem;
+  final String? problem;
 
   MessageTestDescription(this.uri, this.shortName, this.name, this.data,
       this.example, this.problem);
 }
 
 class Configuration {
-  final NnbdMode nnbdMode;
+  final NnbdMode? nnbdMode;
   final Set<InvocationMode> invocationModes;
 
   const Configuration(this.nnbdMode, this.invocationModes);
 
   CompilerOptions apply(CompilerOptions options) {
     if (nnbdMode != null) {
-      options.nnbdMode = nnbdMode;
+      options.nnbdMode = nnbdMode!;
     }
     options.invocationModes = invocationModes;
     return options;
@@ -125,7 +123,7 @@
         [spell.Dictionaries.cfeMessages],
         interactive,
         '"$dartPath" "$suitePath" -DfastOnly=true -Dinteractive=true');
-    return null;
+    return new Future.value();
   }
 
   MessageTestSuite(this.fastOnly, this.interactive)
@@ -151,30 +149,30 @@
     Uri uri = suite.uri.resolve("messages.yaml");
     File file = new File.fromUri(uri);
     String fileContent = file.readAsStringSync();
-    YamlMap messages = loadYamlNode(fileContent, sourceUrl: uri);
+    YamlMap messages = loadYamlNode(fileContent, sourceUrl: uri) as YamlMap;
     for (String name in messages.keys) {
-      YamlNode messageNode = messages.nodes[name];
-      var message = messageNode.value;
+      YamlMap messageNode = messages.nodes[name] as YamlMap;
+      dynamic message = messageNode.value;
       if (message is String) continue;
 
       List<String> unknownKeys = <String>[];
       bool exampleAllowMoreCodes = false;
       List<Example> examples = <Example>[];
-      String externalTest;
+      String? externalTest;
       bool frontendInternal = false;
-      List<String> analyzerCodes;
-      Severity severity;
-      YamlNode badSeverity;
-      YamlNode unnecessarySeverity;
+      List<String>? analyzerCodes;
+      Severity? severity;
+      YamlNode? badSeverity;
+      YamlNode? unnecessarySeverity;
       List<String> badHasPublishedDocsValue = <String>[];
-      List<String> spellingMessages;
+      List<String>? spellingMessages;
       const String spellingPostMessage = "\nIf the word(s) look okay, update "
           "'spell_checking_list_messages.txt' or "
           "'spell_checking_list_common.txt'.";
-      Configuration configuration;
-      Map<ExperimentalFlag, bool> experimentalFlags;
+      Configuration? configuration;
+      Map<ExperimentalFlag, bool>? experimentalFlags;
 
-      Source source;
+      Source? source;
       List<String> formatSpellingMistakes(spell.SpellingResult spellResult,
           int offset, String message, String messageForDenyListed) {
         if (source == null) {
@@ -189,23 +187,23 @@
           source = new Source(lineStarts, bytes, uri, uri);
         }
         List<String> result = <String>[];
-        for (int i = 0; i < spellResult.misspelledWords.length; i++) {
-          Location location = source.getLocation(
-              uri, offset + spellResult.misspelledWordsOffset[i]);
-          bool denylisted = spellResult.misspelledWordsDenylisted[i];
+        for (int i = 0; i < spellResult.misspelledWords!.length; i++) {
+          Location location = source!
+              .getLocation(uri, offset + spellResult.misspelledWordsOffset![i]);
+          bool denylisted = spellResult.misspelledWordsDenylisted![i];
           String messageToUse = message;
           if (denylisted) {
             messageToUse = messageForDenyListed;
-            reportedWordsDenylisted.add(spellResult.misspelledWords[i]);
+            reportedWordsDenylisted.add(spellResult.misspelledWords![i]);
           } else {
-            reportedWords.add(spellResult.misspelledWords[i]);
+            reportedWords.add(spellResult.misspelledWords![i]);
           }
           result.add(command_line_reporting.formatErrorMessage(
-              source.getTextLine(location.line),
+              source!.getTextLine(location.line),
               location,
-              spellResult.misspelledWords[i].length,
+              spellResult.misspelledWords![i].length,
               relativize(uri),
-              "$messageToUse: '${spellResult.misspelledWords[i]}'."));
+              "$messageToUse: '${spellResult.misspelledWords![i]}'."));
         }
         return result;
       }
@@ -280,11 +278,12 @@
             break;
 
           case "bytes":
-            YamlList list = node;
+            YamlList list = node as YamlList;
             if (list.first is List) {
-              for (YamlList bytes in list.nodes) {
+              for (YamlNode bytes in list.nodes) {
                 int i = 0;
-                examples.add(new BytesExample("bytes${++i}", name, bytes));
+                examples.add(
+                    new BytesExample("bytes${++i}", name, bytes as YamlList));
               }
             } else {
               examples.add(new BytesExample("bytes", name, list));
@@ -355,7 +354,7 @@
 
           case "configuration":
             if (value is String) {
-              NnbdMode nnbdMode;
+              NnbdMode? nnbdMode;
               Set<InvocationMode> invocationModes = {};
               for (String part in value.split(',')) {
                 if (part.isEmpty) continue;
@@ -364,7 +363,8 @@
                 } else if (part == "nnbd-strong") {
                   nnbdMode = NnbdMode.Strong;
                 } else {
-                  InvocationMode invocationMode = InvocationMode.fromName(part);
+                  InvocationMode? invocationMode =
+                      InvocationMode.fromName(part);
                   if (invocationMode != null) {
                     invocationModes.add(invocationMode);
                   } else {
@@ -418,7 +418,7 @@
       }
 
       MessageTestDescription createDescription(
-          String subName, Example example, String problem,
+          String subName, Example? example, String? problem,
           {location}) {
         String shortName = "$name/$subName";
         if (problem != null) {
@@ -467,7 +467,7 @@
           badSeverity != null
               ? "Unknown severity: '${badSeverity.value}'."
               : null,
-          location: badSeverity?.span?.start);
+          location: badSeverity?.span.start);
 
       yield createDescription(
           "unnecessarySeverity",
@@ -475,7 +475,7 @@
           unnecessarySeverity != null
               ? "The 'ERROR' severity is the default and not necessary."
               : null,
-          location: unnecessarySeverity?.span?.start);
+          location: unnecessarySeverity?.span.start);
 
       yield createDescription(
           "spelling",
@@ -528,7 +528,7 @@
     var span = example.node.span;
     StringBuffer buffer = new StringBuffer();
     buffer
-      ..write(relativize(span.sourceUrl))
+      ..write(relativize(span.sourceUrl!))
       ..write(":")
       ..write(span.start.line + 1)
       ..write(":")
@@ -537,7 +537,7 @@
       ..write(message);
     buffer.write("\n${span.text}");
     for (DiagnosticMessage message in messages) {
-      buffer.write("\nCode: ${getMessageCodeObject(message).name}");
+      buffer.write("\nCode: ${getMessageCodeObject(message)!.name}");
       buffer.write("\n  > ");
       buffer.write(
           message.plainTextFormatted.join("\n").replaceAll("\n", "\n  > "));
@@ -554,9 +554,9 @@
 
   bool allowMoreCodes = false;
 
-  Configuration configuration;
+  late Configuration configuration;
 
-  Map<ExperimentalFlag, bool> experimentalFlags;
+  Map<ExperimentalFlag, bool>? experimentalFlags;
 
   Example(this.name, this.expectedCode);
 
@@ -677,7 +677,7 @@
       });
       return scriptFiles;
     } else {
-      return {mainFilename: new Script.fromSource(script)};
+      return {mainFilename: new Script.fromSource(script as String)};
     }
   }
 }
@@ -709,7 +709,7 @@
       throw "Framework failure: "
           "Wanted to create wrapper file, but the file already exists!";
     }
-    Script originalMainScript = scriptFiles[example.mainFilename];
+    Script originalMainScript = scriptFiles[example.mainFilename]!;
     String preamble = originalMainScript.preamble;
     scriptFiles[mainFilename] = new Script.fromSource("""
 ${preamble}part "${example.mainFilename}";
@@ -718,7 +718,7 @@
     // Modify the original main file to be part of the wrapper and add lots of
     // gunk so every actual position in the file is not a valid position in the
     // wrapper.
-    String originalMainSource = originalMainScript.sourceWithoutPreamble;
+    String? originalMainSource = originalMainScript.sourceWithoutPreamble;
     String partPrefix = """
 ${preamble}part of "${mainFilename}";
 // La la la la la la la la la la la la la.
@@ -746,14 +746,15 @@
   YamlNode get node => example.node;
 }
 
-class Validate extends Step<MessageTestDescription, Example, MessageTestSuite> {
+class Validate
+    extends Step<MessageTestDescription, Example?, MessageTestSuite> {
   const Validate();
 
   @override
   String get name => "validate";
 
   @override
-  Future<Result<Example>> run(
+  Future<Result<Example?>> run(
       MessageTestDescription description, MessageTestSuite suite) {
     if (description.problem != null) {
       return new Future.value(fail(null, description.problem));
@@ -763,14 +764,14 @@
   }
 }
 
-class Compile extends Step<Example, Null, MessageTestSuite> {
+class Compile extends Step<Example?, Null, MessageTestSuite> {
   const Compile();
 
   @override
   String get name => "compile";
 
   @override
-  Future<Result<Null>> run(Example example, MessageTestSuite suite) async {
+  Future<Result<Null>> run(Example? example, MessageTestSuite suite) async {
     if (example == null) return pass(null);
     String dir = "${example.expectedCode}/${example.name}";
     example.scripts.forEach((String fileName, Script script) {
@@ -812,14 +813,14 @@
     if (example.allowMoreCodes) {
       List<DiagnosticMessage> messagesFiltered = <DiagnosticMessage>[];
       for (DiagnosticMessage message in messages) {
-        if (getMessageCodeObject(message).name == example.expectedCode) {
+        if (getMessageCodeObject(message)!.name == example.expectedCode) {
           messagesFiltered.add(message);
         }
       }
       messages = messagesFiltered;
     }
     for (DiagnosticMessage message in messages) {
-      if (getMessageCodeObject(message).name != example.expectedCode) {
+      if (getMessageCodeObject(message)!.name != example.expectedCode) {
         unexpectedMessages.add(message);
       }
     }
@@ -868,7 +869,7 @@
 class Script {
   final Uint8List bytes;
   final String preamble;
-  final String sourceWithoutPreamble;
+  final String? sourceWithoutPreamble;
 
   Script(this.bytes, this.preamble, this.sourceWithoutPreamble);
 
diff --git a/pkg/front_end/test/fasta/modular_suite.dart b/pkg/front_end/test/fasta/modular_suite.dart
new file mode 100644
index 0000000..8d7441e
--- /dev/null
+++ b/pkg/front_end/test/fasta/modular_suite.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library fasta.test.weak_test;
+
+import 'testing/suite.dart';
+
+Future<FastaContext> createContext(
+    Chain suite, Map<String, String> environment) {
+  environment[COMPILATION_MODE] = CompileMode.modular.name;
+  return FastaContext.create(suite, environment);
+}
+
+void main(List<String> arguments) {
+  internalMain(arguments: arguments);
+}
+
+void internalMain(
+        {List<String> arguments = const [], int shards = 1, int shard = 0}) =>
+    runMe(arguments, createContext,
+        configurationPath: "../../testing.json", shard: shard, shards: shards);
diff --git a/pkg/front_end/test/fasta/object_supertype_test.dart b/pkg/front_end/test/fasta/object_supertype_test.dart
index b588191..819a3a3 100644
--- a/pkg/front_end/test/fasta/object_supertype_test.dart
+++ b/pkg/front_end/test/fasta/object_supertype_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
-
 import "dart:convert" show json;
 
 import "package:_fe_analyzer_shared/src/messages/diagnostic_message.dart"
@@ -77,13 +75,13 @@
 
 Future<void> test() async {
   Set<String> normalErrors = (await outline("class Object {"))
-      .map((DiagnosticMessage message) => getMessageCodeObject(message).name)
+      .map((DiagnosticMessage message) => getMessageCodeObject(message)!.name)
       .toSet();
 
   Future<void> check(String objectHeader, List<Code> expectedCodes) async {
     List<DiagnosticMessage> messages = (await outline(objectHeader))
         .where((DiagnosticMessage message) =>
-            !normalErrors.contains(getMessageCodeObject(message).name))
+            !normalErrors.contains(getMessageCodeObject(message)!.name))
         .toList();
     Expect.setEquals(
         expectedCodes,
diff --git a/pkg/front_end/test/fasta/outline_suite.dart b/pkg/front_end/test/fasta/outline_suite.dart
index cb5f5a9..b8cf207 100644
--- a/pkg/front_end/test/fasta/outline_suite.dart
+++ b/pkg/front_end/test/fasta/outline_suite.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.md file.
 
-// @dart = 2.9
-
 library fasta.test.outline_test;
 
 import 'testing/suite.dart';
diff --git a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart b/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
index c282670..7e5d448 100644
--- a/pkg/front_end/test/fasta/parser/literal_entry_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/literal_entry_info_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
-
 import 'package:_fe_analyzer_shared/src/parser/parser.dart';
 import 'package:_fe_analyzer_shared/src/parser/async_modifier.dart';
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
@@ -540,7 +538,7 @@
   }
 
   void parseEntry(String source, List<String> expectedCalls,
-      {bool inAsync, List<ExpectedError> errors, String expectAfter}) {
+      {bool? inAsync, List<ExpectedError>? errors, String? expectAfter}) {
     final start = scanString(source).tokens;
     final listener = new TestInfoListener();
     final parser = new Parser(listener,
@@ -556,9 +554,9 @@
       throw e;
     }
     if (expectAfter != null) {
-      expect(lastConsumed.next.lexeme, expectAfter);
+      expect(lastConsumed.next!.lexeme, expectAfter);
     } else {
-      expect(lastConsumed.next.isEof, isTrue, reason: lastConsumed.lexeme);
+      expect(lastConsumed.next!.isEof, isTrue, reason: lastConsumed.lexeme);
     }
   }
 }
@@ -838,7 +836,7 @@
   }
 
   void parseEntry(String source, List<String> expectedCalls,
-      {bool inAsync, List<ExpectedError> errors, String expectAfter}) {
+      {bool? inAsync, List<ExpectedError>? errors, String? expectAfter}) {
     final start = scanString(source).tokens;
     final listener = new TestInfoListener();
     final parser = new Parser(listener,
@@ -854,16 +852,16 @@
       throw e;
     }
     if (expectAfter != null) {
-      expect(lastConsumed.next.lexeme, expectAfter);
+      expect(lastConsumed.next!.lexeme, expectAfter);
     } else {
-      expect(lastConsumed.next.isEof, isTrue, reason: lastConsumed.lexeme);
+      expect(lastConsumed.next!.isEof, isTrue, reason: lastConsumed.lexeme);
     }
   }
 }
 
 class TestInfoListener implements Listener {
   List<String> calls = <String>[];
-  List<ExpectedError> errors;
+  List<ExpectedError>? errors;
 
   @override
   void beginBinaryExpression(Token token) {
@@ -876,7 +874,7 @@
   }
 
   @override
-  void beginForControlFlow(Token awaitToken, Token forToken) {
+  void beginForControlFlow(Token? awaitToken, Token forToken) {
     calls.add('beginForControlFlow $awaitToken $forToken');
   }
 
@@ -907,7 +905,7 @@
 
   @override
   void beginVariablesDeclaration(
-      Token token, Token lateToken, Token varFinalOrConst) {
+      Token token, Token? lateToken, Token? varFinalOrConst) {
     // TODO(danrubel): update to include lateToken
     calls.add('beginVariablesDeclaration $token $varFinalOrConst');
   }
@@ -963,7 +961,7 @@
   }
 
   @override
-  void endVariablesDeclaration(int count, Token endToken) {
+  void endVariablesDeclaration(int count, Token? endToken) {
     calls.add('endVariablesDeclaration $count $endToken');
   }
 
@@ -998,7 +996,7 @@
   }
 
   @override
-  void handleForInLoopParts(Token awaitToken, Token forToken,
+  void handleForInLoopParts(Token? awaitToken, Token forToken,
       Token leftParenthesis, Token inKeyword) {
     calls.add('handleForInLoopParts '
         '$awaitToken $forToken $leftParenthesis $inKeyword');
@@ -1028,7 +1026,7 @@
 
   @override
   void handleLiteralList(
-      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
     calls.add(
         'handleLiteralList $count, $leftBracket, $constKeyword, $rightBracket');
   }
@@ -1037,7 +1035,7 @@
   void handleLiteralSetOrMap(
     int count,
     Token leftBrace,
-    Token constKeyword,
+    Token? constKeyword,
     Token rightBrace,
     // TODO(danrubel): hasSetEntry parameter exists for replicating existing
     // behavior and will be removed once unified collection has been enabled
@@ -1080,9 +1078,9 @@
   @override
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {
-    errors ??= <ExpectedError>[];
     int offset = startToken.charOffset;
-    errors.add(error(message.code, offset, endToken.charEnd - offset));
+    (errors ??= <ExpectedError>[])
+        .add(error(message.code, offset, endToken.charEnd - offset));
   }
 
   @override
diff --git a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
index 24d01ca..6828c746 100644
--- a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
+++ b/pkg/front_end/test/fasta/parser/token_stream_rewriter_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
-
 import 'package:_fe_analyzer_shared/src/parser/token_stream_rewriter.dart';
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
     show ScannerResult, scanString;
@@ -39,7 +37,7 @@
 
     TokenStreamRewriter rewriter = getTokenStreamRewriter();
     Token openParen = rewriter.insertParens(a, false);
-    Token closeParen = openParen.next;
+    Token closeParen = openParen.next!;
 
     expect(openParen.lexeme, '(');
     expect(closeParen.lexeme, ')');
@@ -64,8 +62,8 @@
 
     TokenStreamRewriter rewriter = getTokenStreamRewriter();
     Token openParen = rewriter.insertParens(a, true);
-    Token identifier = openParen.next;
-    Token closeParen = identifier.next;
+    Token identifier = openParen.next!;
+    Token closeParen = identifier.next!;
 
     expect(openParen.lexeme, '(');
     expect(identifier.lexeme, '');
@@ -180,7 +178,7 @@
 
     expect(a.next, same(replacement));
     expect(replacement.next, same(c));
-    expect(c.next.isEof, true);
+    expect(c.next!.isEof, true);
 
     normalTestDone(rewriter, a);
   }
@@ -202,7 +200,7 @@
     expect(replacement.replacedToken, same(b));
 
     expect(a.next, same(replacement));
-    expect(replacement.next.isEof, true);
+    expect(replacement.next!.isEof, true);
 
     normalTestDone(rewriter, a);
   }
@@ -226,11 +224,11 @@
     expect(b.precedingComments, same(replacement.precedingComments));
     expect(replacement.replacedToken, same(b));
     expect(replacement.replacedToken.next, same(c));
-    expect(replacement.replacedToken.next.next, same(d));
+    expect(replacement.replacedToken.next!.next, same(d));
 
     expect(a.next, same(replacement));
     expect(replacement.next, same(e));
-    expect(e.next.isEof, true);
+    expect(e.next!.isEof, true);
 
     normalTestDone(rewriter, a);
   }
@@ -254,7 +252,7 @@
     expect(replacement.replacedToken.next, same(c));
 
     expect(a.next, same(replacement));
-    expect(replacement.next.isEof, true);
+    expect(replacement.next!.isEof, true);
 
     normalTestDone(rewriter, a);
   }
@@ -265,18 +263,18 @@
     Token firstToken = scanResult.tokens;
     setupDone(firstToken);
 
-    Token open = scanResult.tokens.next.next;
+    Token open = scanResult.tokens.next!.next!;
     expect(open.lexeme, '(');
-    Token close = open.endGroup;
+    Token close = open.endGroup!;
     expect(close.isSynthetic, isTrue);
-    expect(close.next.isEof, isTrue);
+    expect(close.next!.isEof, isTrue);
     TokenStreamRewriter rewriter = getTokenStreamRewriter();
 
-    Token result = rewriter.moveSynthetic(open.next, close);
+    Token result = rewriter.moveSynthetic(open.next!, close);
     expect(result, close);
     expect(open.endGroup, close);
-    expect(open.next.next, close);
-    expect(close.next.isEof, isFalse);
+    expect(open.next!.next, close);
+    expect(close.next!.isEof, isFalse);
 
     normalTestDone(rewriter, firstToken);
   }
@@ -340,7 +338,7 @@
   }
 
   StringToken _makeToken(int charOffset, String text) {
-    return new StringToken.fromString(null, text, charOffset);
+    return new StringToken.fromString(TokenType.IDENTIFIER, text, charOffset);
   }
 }
 
@@ -384,34 +382,35 @@
   TokenStreamRewriter getTokenStreamRewriter() =>
       new UndoableTokenStreamRewriter();
 
-  List<CachedTokenSetup> setup;
+  List<CachedTokenSetup>? setup;
 
   @override
   void setupDone(Token first) {
     setup = [];
-    Token token = first;
+    Token? token = first;
     while (token != null && !token.isEof) {
-      setup.add(new CachedTokenSetup(token));
+      setup!.add(new CachedTokenSetup(token));
       token = token.next;
     }
   }
 
   @override
   void normalTestDone(TokenStreamRewriter rewriter, Token first) {
-    UndoableTokenStreamRewriter undoableTokenStreamRewriter = rewriter;
+    UndoableTokenStreamRewriter undoableTokenStreamRewriter =
+        rewriter as UndoableTokenStreamRewriter;
     undoableTokenStreamRewriter.undo();
     List<CachedTokenSetup> now = [];
-    Token token = first;
+    Token? token = first;
     while (token != null && !token.isEof) {
       now.add(new CachedTokenSetup(token));
       token = token.next;
     }
-    if (setup.length != now.length) {
-      throw "Different length: ${setup.length} vs ${now.length}";
+    if (setup!.length != now.length) {
+      throw "Different length: ${setup!.length} vs ${now.length}";
     }
-    for (int i = 0; i < setup.length; i++) {
-      if (setup[i] != now[i]) {
-        throw "Different at $i: ${setup[i]} vs ${now[i]}";
+    for (int i = 0; i < setup!.length; i++) {
+      if (setup![i] != now[i]) {
+        throw "Different at $i: ${setup![i]} vs ${now[i]}";
       }
     }
     setup = null;
@@ -420,9 +419,9 @@
 
 class CachedTokenSetup {
   final Token token;
-  final Token prev;
-  final Token next;
-  final Token precedingComments;
+  final Token? prev;
+  final Token? next;
+  final Token? precedingComments;
 
   CachedTokenSetup(this.token)
       : prev = token.previous,
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index 29f59e7..8402482 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_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
-
 import 'package:_fe_analyzer_shared/src/parser/parser.dart';
 import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
 import 'package:_fe_analyzer_shared/src/parser/type_info_impl.dart';
@@ -298,12 +296,12 @@
 
   void test_prefixedTypeInfo() {
     final Token start = scanString('before C.a ;').tokens;
-    final Token expectedEnd = start.next.next.next;
+    final Token expectedEnd = start.next!.next!.next!;
 
     expect(prefixedType.skipType(start), expectedEnd);
     expect(prefixedType.couldBeExpression, isTrue);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -374,12 +372,12 @@
 
   void test_simpleNullableType() {
     final Token start = scanString('before C? ;').tokens;
-    final Token expectedEnd = start.next.next;
+    final Token expectedEnd = start.next!.next!;
 
     expect(simpleNullableType.skipType(start), expectedEnd);
     expect(simpleNullableType.couldBeExpression, isTrue);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -424,13 +422,13 @@
 
   void test_gt_questionMark() {
     final Token start = scanString('before C<T>? ;').tokens;
-    final Token expectedEnd = start.next.next.next.next.next;
+    final Token expectedEnd = start.next!.next!.next!.next!.next!;
     expect(expectedEnd.lexeme, '?');
 
     expect(simpleNullableTypeWith1Argument.skipType(start), expectedEnd);
     expect(simpleNullableTypeWith1Argument.couldBeExpression, isFalse);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -495,12 +493,12 @@
 
   void test_simpleType() {
     final Token start = scanString('before C ;').tokens;
-    final Token expectedEnd = start.next;
+    final Token expectedEnd = start.next!;
 
     expect(simpleType.skipType(start), expectedEnd);
     expect(simpleType.couldBeExpression, isTrue);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -568,13 +566,13 @@
 
   void test_gt() {
     final Token start = scanString('before C<T> ;').tokens;
-    final Token expectedEnd = start.next.next.next.next;
+    final Token expectedEnd = start.next!.next!.next!.next!;
     expect(expectedEnd.lexeme, '>');
 
     expect(simpleTypeWith1Argument.skipType(start), expectedEnd);
     expect(simpleTypeWith1Argument.couldBeExpression, isFalse);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd, expectedEnd);
       expect(listener.calls, [
@@ -608,21 +606,21 @@
 
   void test_gt_eq() {
     final Token start = scanString('before C<T>= ;').tokens;
-    final Token t = start.next.next.next;
-    final Token semicolon = t.next.next;
+    final Token t = start.next!.next!.next!;
+    final Token semicolon = t.next!.next!;
     expect(semicolon.lexeme, ';');
 
     Token skip = simpleTypeWith1ArgumentGtEq.skipType(start);
     expect(skip.lexeme, '>');
-    expect(skip.next.lexeme, '=');
-    expect(skip.next.next, semicolon);
+    expect(skip.next!.lexeme, '=');
+    expect(skip.next!.next, semicolon);
     expect(simpleTypeWith1ArgumentGtEq.couldBeExpression, isFalse);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd.lexeme, '>');
-      expect(actualEnd.next.lexeme, '=');
-      expect(actualEnd.next.next, semicolon);
+      expect(actualEnd.next!.lexeme, '=');
+      expect(actualEnd.next!.next, semicolon);
       expect(listener.calls, [
         'handleIdentifier C typeReference',
         'beginTypeArguments <',
@@ -654,20 +652,20 @@
 
   void test_gt_gt() {
     final Token start = scanString('before C<T>> ;').tokens;
-    final Token semicolon = start.next.next.next.next.next;
+    final Token semicolon = start.next!.next!.next!.next!.next!;
     expect(semicolon.lexeme, ';');
 
     Token skip = simpleTypeWith1ArgumentGtGt.skipType(start);
     expect(skip.lexeme, '>');
-    expect(skip.next.lexeme, '>');
-    expect(skip.next.next, semicolon);
+    expect(skip.next!.lexeme, '>');
+    expect(skip.next!.next, semicolon);
     expect(simpleTypeWith1ArgumentGtGt.couldBeExpression, isFalse);
 
-    TypeInfoListener listener;
+    late TypeInfoListener listener;
     void assertResult(Token actualEnd) {
       expect(actualEnd.lexeme, '>');
-      expect(actualEnd.next.lexeme, '>');
-      expect(actualEnd.next.next, semicolon);
+      expect(actualEnd.next!.lexeme, '>');
+      expect(actualEnd.next!.next, semicolon);
       expect(listener.calls, [
         'handleIdentifier C typeReference',
         'beginTypeArguments <',
@@ -1592,7 +1590,7 @@
     expect(simpleTypeArgument1.typeInfo, simpleTypeWith1Argument);
 
     final Token start = scanString('before <T> after').tokens;
-    final Token gt = start.next.next.next;
+    final Token gt = start.next!.next!.next!;
     expect(gt.lexeme, '>');
 
     Token skip = simpleTypeArgument1.skip(start);
@@ -1606,14 +1604,14 @@
     expect(simpleTypeArgument1GtEq.typeInfo, simpleTypeWith1ArgumentGtEq);
 
     final Token start = scanString('before <T>= after').tokens;
-    Token t = start.next.next;
-    expect(t.next.lexeme, '>=');
+    Token t = start.next!.next!;
+    expect(t.next!.lexeme, '>=');
 
     Token skip = simpleTypeArgument1GtEq.skip(start);
     validateTokens(start);
     expect(skip.lexeme, '>');
-    expect(skip.next.lexeme, '=');
-    expect(skip.next.next, t.next.next);
+    expect(skip.next!.lexeme, '=');
+    expect(skip.next!.next, t.next!.next);
   }
 
   void test_basic_gt_gt() {
@@ -1621,17 +1619,17 @@
     expect(simpleTypeArgument1GtGt.typeArgumentCount, 1);
     expect(simpleTypeArgument1GtGt.typeInfo, simpleTypeWith1ArgumentGtGt);
 
-    final Token start = scanString('before <S<T>> after').tokens.next.next;
-    var gtgt = start.next.next.next;
+    final Token start = scanString('before <S<T>> after').tokens.next!.next!;
+    var gtgt = start.next!.next!.next!;
     expect(gtgt.lexeme, '>>');
-    Token after = gtgt.next;
+    Token after = gtgt.next!;
     expect(after.lexeme, 'after');
 
     Token skip = simpleTypeArgument1GtGt.skip(start);
     validateTokens(start);
     expect(skip.lexeme, '>');
-    expect(skip.next.lexeme, '>');
-    expect(skip.next.next, after);
+    expect(skip.next!.lexeme, '>');
+    expect(skip.next!.next, after);
   }
 
   void test_compute_gt() {
@@ -1644,9 +1642,9 @@
 
   void test_compute_gt_gt() {
     String source = '<C<T>>';
-    Token start = scan(source).next.next;
+    Token start = scan(source).next!.next!;
     expect(start.lexeme, 'C');
-    Token gtgt = start.next.next.next;
+    Token gtgt = start.next!.next!.next!;
     expect(gtgt.lexeme, '>>');
 
     expect(computeTypeParamOrArg(start, false), simpleTypeArgument1GtGt);
@@ -1654,9 +1652,9 @@
   }
 
   void testParseArguments(TypeParamOrArgInfo typeArg, String source,
-      [String next]) {
+      [String? next]) {
     final Token start = scanString('before $source after').tokens;
-    final Token after = start.next.next.next.next;
+    final Token after = start.next!.next!.next!.next!;
     expect(after.lexeme, 'after');
     final TypeInfoListener listener = new TypeInfoListener();
 
@@ -1666,10 +1664,10 @@
             useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
     validateTokens(start);
     expect(token.lexeme, '>');
-    token = token.next;
+    token = token.next!;
     if (next != null) {
       expect(token.lexeme, next);
-      token = token.next;
+      token = token.next!;
     }
     expect(token, after);
     expect(listener.calls, [
@@ -1695,9 +1693,9 @@
   }
 
   void testParseVariables(TypeParamOrArgInfo typeParam, String source,
-      [String next]) {
+      [String? next]) {
     final Token start = scanString('before $source after').tokens;
-    final Token after = start.next.next.next.next;
+    final Token after = start.next!.next!.next!.next!;
     expect(after.lexeme, 'after');
     final TypeInfoListener listener = new TypeInfoListener();
 
@@ -1707,10 +1705,10 @@
             useImplicitCreationExpression: useImplicitCreationExpressionInCfe));
     validateTokens(start);
     expect(token.lexeme, '>');
-    token = token.next;
+    token = token.next!;
     if (next != null) {
       expect(token.lexeme, next);
-      token = token.next;
+      token = token.next!;
     }
     expect(token, after);
     expect(listener.calls, [
@@ -2588,7 +2586,7 @@
   }
 }
 
-void expectInfo(expectedInfo, String source, {bool required}) {
+void expectInfo(expectedInfo, String source, {bool? required}) {
   if (required == null) {
     compute(expectedInfo, source, scan(source), true);
     compute(expectedInfo, source, scan(source), false);
@@ -2600,12 +2598,12 @@
 /// Note that if [required] is null it is run both with required [true] and
 /// [false] and expect the same in both situations.
 void expectComplexInfo(String source,
-    {bool required,
+    {bool? required,
     bool inDeclaration = false,
     bool couldBeExpression = false,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors}) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors}) {
   if (required == null) {
     computeComplex(source, scan(source), true, inDeclaration, couldBeExpression,
         expectedAfter, expectedCalls, expectedErrors);
@@ -2619,7 +2617,7 @@
 
 void expectNestedInfo(expectedInfo, String source) {
   expect(source.startsWith('<'), isTrue);
-  Token start = scan(source).next;
+  Token start = scan(source).next!;
   compute(expectedInfo, source, start, true);
 }
 
@@ -2643,13 +2641,13 @@
     bool required,
     bool inDeclaration,
     bool couldBeExpression,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors) {
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
   ComplexTypeInfo typeInfo = compute(
       const TypeMatcher<ComplexTypeInfo>(), source, start, required,
-      inDeclaration: inDeclaration);
+      inDeclaration: inDeclaration) as ComplexTypeInfo;
   expect(typeInfo.start, start.next, reason: source);
   expect(typeInfo.couldBeExpression, couldBeExpression);
   expectEnd(expectedAfter, typeInfo.skipType(start));
@@ -2673,16 +2671,16 @@
 void expectComplexTypeArg(String source,
     {bool inDeclaration = false,
     int typeArgumentCount = -1,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors}) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors}) {
   Token start = scan(source);
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
   ComplexTypeParamOrArgInfo typeVarInfo = computeVar(
       const TypeMatcher<ComplexTypeParamOrArgInfo>(),
       source,
       start,
-      inDeclaration);
+      inDeclaration) as ComplexTypeParamOrArgInfo;
 
   expect(typeVarInfo.start, start.next, reason: source);
   expectEnd(expectedAfter, typeVarInfo.skip(start));
@@ -2708,16 +2706,16 @@
 void expectComplexTypeParam(String source,
     {bool inDeclaration = false,
     int typeArgumentCount = -1,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors}) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors}) {
   Token start = scan(source);
   int expectedGtGtAndNullEndCount = countGtGtAndNullEnd(start);
   ComplexTypeParamOrArgInfo typeVarInfo = computeVar(
       const TypeMatcher<ComplexTypeParamOrArgInfo>(),
       source,
       start,
-      inDeclaration);
+      inDeclaration) as ComplexTypeParamOrArgInfo;
 
   expect(typeVarInfo.start, start.next, reason: source);
   expectEnd(expectedAfter, typeVarInfo.skip(start));
@@ -2743,9 +2741,9 @@
 
 void expectTypeParamOrArg(expectedInfo, String source,
     {bool inDeclaration = false,
-    String expectedAfter,
-    List<String> expectedCalls,
-    List<ExpectedError> expectedErrors}) {
+    String? expectedAfter,
+    List<String>? expectedCalls,
+    List<ExpectedError>? expectedErrors}) {
   Token start = scan(source);
   computeVar(expectedInfo, source, start, inDeclaration);
 }
@@ -2761,21 +2759,21 @@
   return typeVarInfo;
 }
 
-void expectEnd(String tokenAfter, Token end) {
+void expectEnd(String? tokenAfter, Token end) {
   if (tokenAfter == null) {
     expect(end.isEof, isFalse);
-    if (!end.next.isEof) {
+    if (!end.next!.isEof) {
       fail('Expected EOF after $end but found ${end.next}');
     }
   } else {
-    expect(end.next.lexeme, tokenAfter);
+    expect(end.next!.lexeme, tokenAfter);
   }
 }
 
 Token scan(String source) {
   Token start = scanString(source).tokens;
   while (start is ErrorToken) {
-    start = start.next;
+    start = start.next!;
   }
   return new SyntheticToken(TokenType.EOF, -1)..setNext(start);
 }
@@ -2787,18 +2785,18 @@
         optional('>>', token)) {
       ++count;
     }
-    token = token.next;
+    token = token.next!;
   }
   return count;
 }
 
 void validateTokens(Token token) {
   int count = 0;
-  if (token.isEof && !token.next.isEof) {
-    token = token.next;
+  if (token.isEof && !token.next!.isEof) {
+    token = token.next!;
   }
   while (!token.isEof) {
-    Token next = token.next;
+    Token next = token.next!;
     expect(token.charOffset, lessThanOrEqualTo(next.charOffset));
     expect(next.previous, token, reason: next.type.toString());
     if (next is SyntheticToken) {
@@ -2813,12 +2811,12 @@
 class TypeInfoListener implements Listener {
   final bool metadataAllowed;
   List<String> calls = <String>[];
-  List<ExpectedError> errors;
-  Token firstToken;
+  List<ExpectedError>? errors;
+  Token? firstToken;
 
   TypeInfoListener({this.firstToken, this.metadataAllowed: false}) {
-    if (firstToken != null && firstToken.isEof) {
-      firstToken = firstToken.next;
+    if (firstToken != null && firstToken!.isEof) {
+      firstToken = firstToken!.next;
     }
   }
 
@@ -2832,8 +2830,8 @@
   }
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
-      Token covariantToken, Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
     // TODO(danrubel): Update tests to include required and covariant
     calls.add('beginFormalParameter $token $kind');
   }
@@ -2894,24 +2892,25 @@
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
-    calls.add('endFormalParameter $thisKeyword $periodAfterThis '
+    calls.add('endFormalParameter $thisKeyword $periodAfterThisOrSuper '
         '$nameToken $kind $memberKind');
   }
 
   @override
-  void endFunctionType(Token functionToken, Token questionMark) {
+  void endFunctionType(Token functionToken, Token? questionMark) {
     calls.add('endFunctionType $functionToken $questionMark');
   }
 
   @override
-  void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
     if (metadataAllowed) {
       calls.add('endMetadata $beginToken $periodBeforeName $endToken');
     } else {
@@ -2933,7 +2932,7 @@
 
   @override
   void endTypeVariable(
-      Token token, int index, Token extendsOrSuper, Token variance) {
+      Token token, int index, Token? extendsOrSuper, Token? variance) {
     calls.add('endTypeVariable $token $index $extendsOrSuper $variance');
     assertTokenInStream(token);
     assertTokenInStream(extendsOrSuper);
@@ -2988,9 +2987,9 @@
   @override
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {
-    errors ??= <ExpectedError>[];
     int offset = startToken.charOffset;
-    errors.add(error(message.code, offset, endToken.charEnd - offset));
+    (errors ??= <ExpectedError>[])
+        .add(error(message.code, offset, endToken.charEnd - offset));
   }
 
   @override
@@ -2999,7 +2998,7 @@
   }
 
   @override
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     calls.add('handleType $beginToken $questionMark');
   }
 
@@ -3023,20 +3022,20 @@
     throw '${invocation.memberName} should not be called.';
   }
 
-  void assertTokenInStream(Token match) {
+  void assertTokenInStream(Token? match) {
     if (firstToken != null && match != null && !match.isEof) {
-      Token token = firstToken;
+      Token token = firstToken!;
       while (!token.isEof) {
         if (identical(token, match)) {
           return;
         }
-        token = token.next;
+        token = token.next!;
       }
       final msg = new StringBuffer();
       msg.writeln('Expected $match in token stream, but found');
       while (!token.isEof) {
         msg.write(' $token');
-        token = token.next;
+        token = token.next!;
       }
       fail(msg.toString());
     }
diff --git a/pkg/front_end/test/fasta/reexport_test.dart b/pkg/front_end/test/fasta/reexport_test.dart
index 5972e6a..0e46523 100644
--- a/pkg/front_end/test/fasta/reexport_test.dart
+++ b/pkg/front_end/test/fasta/reexport_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
-
 import "package:async_helper/async_helper.dart" show asyncTest;
 
 import "package:front_end/src/testing/compiler_common.dart" show compileUnit;
diff --git a/pkg/front_end/test/fasta/scanner/scanner_suite.dart b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
index f9822e8..69ea079 100644
--- a/pkg/front_end/test/fasta/scanner/scanner_suite.dart
+++ b/pkg/front_end/test/fasta/scanner/scanner_suite.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.md file.
 
-// @dart = 2.9
-
 import 'package:testing/testing.dart' show Chain, ChainContext, Step, runMe;
 
 import '../../utils/scanner_chain.dart' show Read, Scan;
diff --git a/pkg/front_end/test/fasta/sdk_test.dart b/pkg/front_end/test/fasta/sdk_test.dart
index 54caf22..400df69 100644
--- a/pkg/front_end/test/fasta/sdk_test.dart
+++ b/pkg/front_end/test/fasta/sdk_test.dart
@@ -2,15 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.sdk_test;
 
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
-  environment[ENABLE_FULL_COMPILE] = "";
+  environment[COMPILATION_MODE] = CompileMode.full.name;
   environment["skipVm"] ??= "true";
   environment["onlyCrashes"] ??= "true";
   environment["ignoreExpectations"] ??= "true";
diff --git a/pkg/front_end/test/fasta/strong_suite.dart b/pkg/front_end/test/fasta/strong_suite.dart
index 468ed23..8bb8640 100644
--- a/pkg/front_end/test/fasta/strong_suite.dart
+++ b/pkg/front_end/test/fasta/strong_suite.dart
@@ -2,15 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.strong_test;
 
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
-  environment[ENABLE_FULL_COMPILE] = "";
+  environment[COMPILATION_MODE] = CompileMode.full.name;
   environment['soundNullSafety'] = "true";
   return FastaContext.create(suite, environment);
 }
diff --git a/pkg/front_end/test/fasta/super_mixins_test.dart b/pkg/front_end/test/fasta/super_mixins_test.dart
index 8f97ec7..2ef4893 100644
--- a/pkg/front_end/test/fasta/super_mixins_test.dart
+++ b/pkg/front_end/test/fasta/super_mixins_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.md file.
 
-// @dart = 2.9
-
 library fasta.test.incremental_dynamic_test;
 
 import "package:_fe_analyzer_shared/src/messages/diagnostic_message.dart"
@@ -83,7 +81,7 @@
     Expect.equals(Severity.error, message.severity);
     Expect.identical(codeSuperclassHasNoMethod, getMessageCodeObject(message));
     Expect.isTrue(message.plainTextFormatted.length == 1);
-    names.add(getMessageArguments(message)['name']);
+    names.add(getMessageArguments(message)!['name']);
   };
 }
 
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 0c88143..f7221fd 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -40,6 +40,9 @@
 import 'package:front_end/src/api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import 'package:front_end/src/api_prototype/standard_file_system.dart'
     show StandardFileSystem;
 
@@ -63,12 +66,12 @@
 import 'package:front_end/src/fasta/incremental_compiler.dart'
     show IncrementalCompiler;
 
-import 'package:front_end/src/fasta/kernel/class_hierarchy_builder.dart'
-    show ClassHierarchyNode;
-
-import 'package:front_end/src/fasta/kernel/class_hierarchy_builder.dart'
+import 'package:front_end/src/fasta/kernel/hierarchy/hierarchy_builder.dart'
     show ClassHierarchyBuilder;
 
+import 'package:front_end/src/fasta/kernel/hierarchy/hierarchy_node.dart'
+    show ClassHierarchyNode;
+
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
     show KernelTarget;
 
@@ -82,10 +85,10 @@
 
 import 'package:front_end/src/fasta/kernel/verifier.dart' show verifyComponent;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart'
-    show DirectParserASTContentVisitor, getAST;
+import 'package:front_end/src/fasta/util/parser_ast.dart'
+    show ParserAstVisitor, getAST;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 import 'package:kernel/ast.dart'
     show
@@ -168,7 +171,7 @@
 
 export 'package:testing/testing.dart' show Chain, runMe;
 
-const String ENABLE_FULL_COMPILE = " full compile ";
+const String COMPILATION_MODE = " compilation mode ";
 
 const String UPDATE_EXPECTATIONS = "updateExpectations";
 const String UPDATE_COMMENTS = "updateComments";
@@ -223,7 +226,7 @@
 final Expectation runtimeError = ExpectationSet.Default["RuntimeError"];
 
 const String experimentalFlagOptions = '--enable-experiment=';
-const Option<String> overwriteCurrentSdkVersion =
+const Option<String?> overwriteCurrentSdkVersion =
     const Option('--overwrite-current-sdk-version', const StringValue());
 const Option<bool> noVerifyCmd =
     const Option('--no-verify', const BoolValue(false));
@@ -375,55 +378,61 @@
       this.skipVm,
       this.semiFuzz,
       bool kernelTextSerialization,
-      bool fullCompile,
+      CompileMode compileMode,
       this.verify,
       this.soundNullSafety)
       : steps = <Step>[
-          new Outline(fullCompile, updateComments: updateComments),
+          new Outline(compileMode, updateComments: updateComments),
           const Print(),
-          new Verify(fullCompile)
+          new Verify(compileMode)
         ] {
-    String fullPrefix;
-    String outlinePrefix;
+    String prefix;
+    String infix;
     if (soundNullSafety) {
-      fullPrefix = '.strong';
-      outlinePrefix = '.strong.outline';
+      prefix = '.strong';
     } else {
-      fullPrefix = '.weak';
-      outlinePrefix = '.weak.outline';
+      prefix = '.weak';
+    }
+    switch (compileMode) {
+      case CompileMode.outline:
+        infix = '.outline';
+        break;
+      case CompileMode.modular:
+        infix = '.modular';
+        break;
+      case CompileMode.full:
+        infix = '';
+        break;
     }
 
-    if (!fullCompile) {
-      // If not doing a full compile this is the only expect file so we run the
-      // extra constant evaluation now. If we do a full compilation, we'll do
-      // if after the transformation. That also ensures we don't get the same
-      // 'extra constant evaluation' output twice (in .transformed and not).
+    if (compileMode == CompileMode.outline) {
+      // If doing an outline compile, this is the only expect file so we run the
+      // extra constant evaluation now. If we do a full or modular compilation,
+      // we'll do if after the transformation. That also ensures we don't get
+      // the same 'extra constant evaluation' output twice (in .transformed and
+      // not).
       steps.add(const StressConstantEvaluatorStep());
     }
     if (!ignoreExpectations) {
-      steps.add(new MatchExpectation(
-          fullCompile ? "$fullPrefix.expect" : "$outlinePrefix.expect",
-          serializeFirst: false,
-          isLastMatchStep: false));
-      steps.add(new MatchExpectation(
-          fullCompile ? "$fullPrefix.expect" : "$outlinePrefix.expect",
-          serializeFirst: true,
-          isLastMatchStep: true));
+      steps.add(new MatchExpectation("$prefix$infix.expect",
+          serializeFirst: false, isLastMatchStep: false));
+      steps.add(new MatchExpectation("$prefix$infix.expect",
+          serializeFirst: true, isLastMatchStep: true));
     }
     steps.add(const TypeCheck());
     steps.add(const EnsureNoErrors());
     if (kernelTextSerialization) {
       steps.add(const KernelTextSerialization());
     }
-    if (fullCompile) {
+    if (compileMode == CompileMode.full) {
       steps.add(const Transform());
-      steps.add(const Verify(true));
+      steps.add(const Verify(CompileMode.full));
       steps.add(const StressConstantEvaluatorStep());
       if (!ignoreExpectations) {
-        steps.add(new MatchExpectation("$fullPrefix.transformed.expect",
+        steps.add(new MatchExpectation("$prefix$infix.transformed.expect",
             serializeFirst: false, isLastMatchStep: updateExpectations));
         if (!updateExpectations) {
-          steps.add(new MatchExpectation("$fullPrefix.transformed.expect",
+          steps.add(new MatchExpectation("$prefix$infix.transformed.expect",
               serializeFirst: true, isLastMatchStep: true));
         }
       }
@@ -479,7 +488,7 @@
               ParsedOptions.parse(arguments, folderOptionsSpecification);
           List<String> experimentalFlagsArguments =
               Options.enableExperiment.read(parsedOptions) ?? <String>[];
-          String overwriteCurrentSdkVersionArgument =
+          String? overwriteCurrentSdkVersionArgument =
               overwriteCurrentSdkVersion.read(parsedOptions);
           enableUnscheduledExperiments =
               Options.enableUnscheduledExperiments.read(parsedOptions);
@@ -764,7 +773,7 @@
       "verify",
       KERNEL_TEXT_SERIALIZATION,
       "platformBinaries",
-      ENABLE_FULL_COMPILE,
+      COMPILATION_MODE,
     };
     checkEnvironment(environment, knownEnvironmentKeys);
 
@@ -812,7 +821,7 @@
         skipVm,
         semiFuzz,
         kernelTextSerialization,
-        environment.containsKey(ENABLE_FULL_COMPILE),
+        compileModeFromName(environment[COMPILATION_MODE]),
         verify,
         soundNullSafety));
   }
@@ -1207,7 +1216,9 @@
     IncrementalCompiler incrementalCompiler =
         new IncrementalCompiler.fromComponent(
             new CompilerContext(compilationSetup.options), platform);
-    final Component component = await incrementalCompiler.computeDelta();
+    IncrementalCompilerResult incrementalCompilerResult =
+        await incrementalCompiler.computeDelta();
+    final Component component = incrementalCompilerResult.component;
     if (!canSerialize(component)) {
       return new Result<ComponentResult>(result, semiFuzzFailure,
           "Couldn't serialize initial component for fuzzing");
@@ -1237,8 +1248,9 @@
     compilationSetup.errors.clear();
     for (Uri importUri in userLibraries) {
       incrementalCompiler.invalidate(importUri);
-      final Component newComponent =
+      final IncrementalCompilerResult newResult =
           await incrementalCompiler.computeDelta(fullComponent: true);
+      final Component newComponent = newResult.component;
       if (!canSerialize(newComponent)) {
         return new Result<ComponentResult>(
             result, semiFuzzFailure, "Couldn't serialize fuzzed component");
@@ -1329,7 +1341,9 @@
     IncrementalCompiler incrementalCompiler =
         new IncrementalCompiler.fromComponent(
             new CompilerContext(compilationSetup.options), platform);
-    Component initialComponent = await incrementalCompiler.computeDelta();
+    IncrementalCompilerResult initialResult =
+        await incrementalCompiler.computeDelta();
+    Component initialComponent = initialResult.component;
     if (!canSerialize(initialComponent)) {
       return new Result<ComponentResult>(result, semiFuzzFailure,
           "Couldn't serialize initial component for fuzzing");
@@ -1343,13 +1357,14 @@
     // Create lookup-table from file uri to whatever.
     Map<Uri, LibraryBuilder> builders = {};
     for (LibraryBuilder builder
-        in incrementalCompiler.userCode!.loader.libraryBuilders) {
+        in incrementalCompiler.kernelTargetForTesting!.loader.libraryBuilders) {
       if (builder.importUri.scheme == "dart" && !builder.isSynthetic) continue;
       builders[builder.fileUri] = builder;
       for (LibraryPart part in builder.library.parts) {
         Uri thisPartUri = builder.importUri.resolve(part.partUri);
         if (thisPartUri.scheme == "package") {
-          thisPartUri = incrementalCompiler.userCode!.uriTranslator
+          thisPartUri = incrementalCompiler
+              .kernelTargetForTesting!.uriTranslator
               .translate(thisPartUri)!;
         }
         builders[thisPartUri] = builder;
@@ -1392,7 +1407,9 @@
         incrementalCompiler = new IncrementalCompiler.fromComponent(
             new CompilerContext(compilationSetup.options), platform);
         try {
-          Component component = await incrementalCompiler.computeDelta();
+          IncrementalCompilerResult incrementalCompilerResult =
+              await incrementalCompiler.computeDelta();
+          Component component = incrementalCompilerResult.component;
           if (!canSerialize(component)) {
             return new Result<ComponentResult>(
                 result, semiFuzzFailure, "Couldn't serialize fuzzed component");
@@ -1465,13 +1482,13 @@
 
 enum FuzzSorterState { nonSortable, importExportSortable, sortableRest }
 
-class FuzzAstVisitorSorter extends DirectParserASTContentVisitor {
+class FuzzAstVisitorSorter extends ParserAstVisitor {
   final Uint8List bytes;
   final String asString;
   final bool nnbd;
 
   FuzzAstVisitorSorter(this.bytes, this.nnbd) : asString = utf8.decode(bytes) {
-    DirectParserASTContentCompilationUnitEnd ast = getAST(bytes,
+    CompilationUnitEnd ast = getAST(bytes,
         includeBody: false,
         includeComments: true,
         enableExtensionMethods: true,
@@ -1580,48 +1597,45 @@
   }
 
   @override
-  void visitExport(DirectParserASTContentExportEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {
     handleData(
         FuzzSorterState.importExportSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitImport(DirectParserASTContentImportEnd node, Token startInclusive,
-      Token? endInclusive) {
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {
     handleData(
         FuzzSorterState.importExportSortable, startInclusive, endInclusive!);
   }
 
   @override
-  void visitClass(DirectParserASTContentClassDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitEnum(DirectParserASTContentEnumEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitExtension(DirectParserASTContentExtensionDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitLibraryName(DirectParserASTContentLibraryNameEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitMetadata(DirectParserASTContentMetadataEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {
     if (metadataStart == null) {
       metadataStart = startInclusive;
       metadataEndInclusive = endInclusive;
@@ -1631,46 +1645,43 @@
   }
 
   @override
-  void visitMixin(DirectParserASTContentMixinDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitNamedMixin(DirectParserASTContentNamedMixinApplicationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitPart(DirectParserASTContentPartEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitPartOf(DirectParserASTContentPartOfEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitTopLevelFields(DirectParserASTContentTopLevelFieldsEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitTopLevelMethod(DirectParserASTContentTopLevelMethodEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitTypedef(DirectParserASTContentTypedefEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitTypedef(TypedefEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 }
@@ -1772,13 +1783,15 @@
 }
 
 Set<Uri> createUserLibrariesImportUriSet(
-    Component component, UriTranslator uriTranslator) {
+    Component component, UriTranslator uriTranslator,
+    {Set<Library> excludedLibraries: const {}}) {
   Set<Uri> knownUris =
       component.libraries.map((Library library) => library.importUri).toSet();
   Set<Uri> userLibraries = component.libraries
       .where((Library library) =>
           library.importUri.scheme != 'dart' &&
-          library.importUri.scheme != 'package')
+          library.importUri.scheme != 'package' &&
+          !excludedLibraries.contains(library))
       .map((Library library) => library.importUri)
       .toSet();
   // Mark custom "dart:" libraries defined in the test-specific libraries.json
@@ -1792,20 +1805,48 @@
   return userLibraries.intersection(knownUris);
 }
 
-class Outline extends Step<TestDescription, ComponentResult, FastaContext> {
-  final bool fullCompile;
+enum CompileMode {
+  /// Compiles only the outline of the test and its linked dependencies.
+  outline,
 
-  const Outline(this.fullCompile, {this.updateComments: false});
+  /// Fully compiles the test but compiles only the outline of its linked
+  /// dependencies.
+  ///
+  /// This mimics how modular compilation is performed with dartdevc.
+  modular,
+
+  /// Fully compiles the test and its linked dependencies.
+  full,
+}
+
+CompileMode compileModeFromName(String? name) {
+  for (CompileMode mode in CompileMode.values) {
+    if (name == mode.name) {
+      return mode;
+    }
+  }
+  return CompileMode.outline;
+}
+
+class Outline extends Step<TestDescription, ComponentResult, FastaContext> {
+  final CompileMode compileMode;
+
+  const Outline(this.compileMode, {this.updateComments: false});
 
   final bool updateComments;
 
   @override
   String get name {
-    return fullCompile ? "compile" : "outline";
+    switch (compileMode) {
+      case CompileMode.outline:
+        return "outline";
+      case CompileMode.modular:
+        return "modular";
+      case CompileMode.full:
+        return "compile";
+    }
   }
 
-  bool get isCompiler => fullCompile;
-
   @override
   Future<Result<ComponentResult>> run(
       TestDescription description, FastaContext context) async {
@@ -1834,7 +1875,7 @@
           compilationSetup.errors.addAll(compilationSetup.testOptions.errors!);
         }
         Component p = (await sourceTarget.buildOutlines())!;
-        if (fullCompile) {
+        if (compileMode == CompileMode.full) {
           p = (await sourceTarget.buildComponent(
               verify: compilationSetup.folderOptions.noVerify
                   ? false
@@ -1880,6 +1921,13 @@
       if (description.uri.pathSegments.last.endsWith(".no_link.dart")) {
         alsoAppend = null;
       }
+
+      Set<Library>? excludedLibraries;
+      if (compileMode == CompileMode.modular) {
+        excludedLibraries = alsoAppend?.libraries.toSet();
+      }
+      excludedLibraries ??= const {};
+
       KernelTarget sourceTarget = await outlineInitialization(context,
           description, compilationSetup.options, <Uri>[description.uri],
           alsoAppend: alsoAppend);
@@ -1888,9 +1936,10 @@
       await instrumentation.loadExpectations(description.uri);
       sourceTarget.loader.instrumentation = instrumentation;
       Component p = (await sourceTarget.buildOutlines())!;
-      Set<Uri> userLibraries =
-          createUserLibrariesImportUriSet(p, sourceTarget.uriTranslator);
-      if (fullCompile) {
+      Set<Uri> userLibraries = createUserLibrariesImportUriSet(
+          p, sourceTarget.uriTranslator,
+          excludedLibraries: excludedLibraries);
+      if (compileMode != CompileMode.outline) {
         p = (await sourceTarget.buildComponent(
             verify: compilationSetup.folderOptions.noVerify
                 ? false
@@ -1993,9 +2042,9 @@
 }
 
 class Verify extends Step<ComponentResult, ComponentResult, FastaContext> {
-  final bool fullCompile;
+  final CompileMode compileMode;
 
-  const Verify(this.fullCompile);
+  const Verify(this.compileMode);
 
   @override
   String get name => "verify";
@@ -2026,7 +2075,7 @@
       compilerContext.uriToSource.addAll(component.uriToSource);
       List<LocatedMessage> verificationErrors = verifyComponent(
           component, result.options.target,
-          isOutline: !fullCompile, skipPlatform: true);
+          isOutline: compileMode == CompileMode.outline, skipPlatform: true);
       assert(verificationErrors.isEmpty || messages.isNotEmpty);
       if (messages.isEmpty) {
         return pass(result);
@@ -2143,7 +2192,7 @@
     Uri uri =
         component.uriToSource.keys.firstWhere((uri) => uri.scheme == "file");
     KernelTarget target = result.sourceTarget;
-    ClassHierarchyBuilder hierarchy = target.loader.builderHierarchy;
+    ClassHierarchyBuilder hierarchy = target.loader.hierarchyBuilder;
     StringBuffer sb = new StringBuffer();
     for (ClassHierarchyNode node in hierarchy.nodes.values) {
       sb.writeln(node);
diff --git a/pkg/front_end/test/fasta/text_serialization_suite.dart b/pkg/front_end/test/fasta/text_serialization_suite.dart
index eaeb88a..eda34ee 100644
--- a/pkg/front_end/test/fasta/text_serialization_suite.dart
+++ b/pkg/front_end/test/fasta/text_serialization_suite.dart
@@ -2,15 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.text_serialization_test;
 
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
-  environment[ENABLE_FULL_COMPILE] = "";
+  environment[COMPILATION_MODE] = CompileMode.full.name;
   environment[KERNEL_TEXT_SERIALIZATION] = "";
   return FastaContext.create(suite, environment);
 }
diff --git a/pkg/front_end/test/fasta/textual_outline_suite.dart b/pkg/front_end/test/fasta/textual_outline_suite.dart
index 3d2c902..7309219 100644
--- a/pkg/front_end/test/fasta/textual_outline_suite.dart
+++ b/pkg/front_end/test/fasta/textual_outline_suite.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.md file.
 
-// @dart = 2.9
-
 library fasta.test.textual_outline_test;
 
 import 'dart:io';
@@ -89,7 +87,7 @@
     List<int> bytes = new File.fromUri(description.uri).readAsBytesSync();
     for (bool modelled in [false, true]) {
       // TODO(jensj): NNBD should be configured correctly.
-      String result = textualOutline(
+      String? result = textualOutline(
         bytes,
         const ScannerConfiguration(enableExtensionMethods: true),
         throwOnUnexpected: true,
@@ -118,7 +116,7 @@
       result = sb.toString().trim();
 
       dynamic formatterException;
-      StackTrace formatterExceptionSt;
+      StackTrace? formatterExceptionSt;
       if (!containsUnknownChunk) {
         // Try to format only if it doesn't contain the unknown chunk marker.
         try {
@@ -134,8 +132,9 @@
         filename = ".textual_outline_modelled.expect";
       }
 
-      Result expectMatch = await context.match<TestDescription>(
-          filename, result, description.uri, description);
+      Result<TestDescription> expectMatch =
+          await context.match<TestDescription>(
+              filename, result!, description.uri, description);
       if (expectMatch.outcome != Expectation.Pass) return expectMatch;
 
       if (formatterException != null) {
diff --git a/pkg/front_end/test/fasta/tool_git_test.dart b/pkg/front_end/test/fasta/tool_git_test.dart
index 3755f18..6e4b231 100644
--- a/pkg/front_end/test/fasta/tool_git_test.dart
+++ b/pkg/front_end/test/fasta/tool_git_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
-
 /// Tests the tool `pkg/front_end/tool/fasta`.
 
 import "dart:io";
diff --git a/pkg/front_end/test/fasta/type_inference/factor_type_test.dart b/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
index a365e93..a743918 100644
--- a/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/factor_type_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
-
 import 'package:_fe_analyzer_shared/src/flow_analysis/factory_type_test_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:front_end/src/api_prototype/compiler_options.dart';
@@ -106,8 +104,10 @@
   CompilerOptions options = new CompilerOptions()
     ..explicitExperimentalFlags[ExperimentalFlag.nonNullable] = true;
   InternalCompilerResult result = await compileScript('',
-      options: options, requireMain: false, retainDataForTesting: true);
+      options: options,
+      requireMain: false,
+      retainDataForTesting: true) as InternalCompilerResult;
   new FactorTypeTest(
-          new TypeEnvironment(result.coreTypes, result.classHierarchy))
+          new TypeEnvironment(result.coreTypes!, result.classHierarchy!))
       .run();
 }
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
index 7bf3df7..f037ae5 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_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
-
 import 'package:front_end/src/fasta/type_inference/type_constraint_gatherer.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
@@ -22,15 +20,15 @@
 
 @reflectiveTest
 class TypeConstraintGathererTest {
-  Env env;
+  late Env env;
 
   final Map<String, DartType Function()> additionalTypes = {
     'UNKNOWN': () => new UnknownType()
   };
 
-  Library _coreLibrary;
+  late Library _coreLibrary;
 
-  Library _testLibrary;
+  late Library _testLibrary;
 
   TypeConstraintGathererTest();
 
@@ -308,7 +306,7 @@
   }
 
   void checkConstraintsLower(String type, String bound, List<String> expected,
-      {String typeParameters, String typeParametersToConstrain}) {
+      {String? typeParameters, String? typeParametersToConstrain}) {
     env.withTypeParameters(typeParameters ?? '',
         (List<TypeParameter> typeParameterNodes) {
       List<TypeParameter> typeParameterNodesToConstrain;
@@ -345,8 +343,8 @@
         typeParameterNodesToConstrain);
   }
 
-  void checkConstraintsUpper(String type, String bound, List<String> expected,
-      {String typeParameters, String typeParametersToConstrain}) {
+  void checkConstraintsUpper(String type, String bound, List<String>? expected,
+      {String? typeParameters, String? typeParametersToConstrain}) {
     env.withTypeParameters(typeParameters ?? '',
         (List<TypeParameter> typeParameterNodes) {
       List<TypeParameter> typeParameterNodesToConstrain;
@@ -372,7 +370,7 @@
       DartType type,
       DartType bound,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       List<TypeParameter> typeParameterNodesToConstrain) {
     _checkConstraintsHelper(
         type,
@@ -387,7 +385,7 @@
       DartType a,
       DartType b,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       bool Function(TypeConstraintGatherer, DartType, DartType) tryConstrain,
       List<TypeParameter> typeParameterNodesToConstrain) {
     var typeSchemaEnvironment = new TypeSchemaEnvironment(
@@ -403,7 +401,7 @@
     }
     expect(constraints, isNotNull);
     var constraintStrings = <String>[];
-    constraints.forEach((t, constraint) {
+    constraints!.forEach((t, constraint) {
       if (constraint.lower is! UnknownType ||
           constraint.upper is! UnknownType) {
         var s = t.name;
@@ -413,7 +411,7 @@
         if (constraint.upper is! UnknownType) {
           s = '$s <: ${typeSchemaToString(constraint.upper)}';
         }
-        constraintStrings.add(s);
+        constraintStrings.add(s as String);
       }
     });
     expect(constraintStrings, unorderedEquals(expectedConstraints));
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
index 16df20d..e42fc10 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_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
-
 import 'package:front_end/src/fasta/type_inference/type_constraint_gatherer.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
@@ -22,15 +20,15 @@
 
 @reflectiveTest
 class TypeConstraintGathererTest {
-  Env env;
+  late Env env;
 
   final Map<String, DartType Function()> additionalTypes = {
     'UNKNOWN': () => UnknownType()
   };
 
-  Library _coreLibrary;
+  late Library _coreLibrary;
 
-  Library _testLibrary;
+  late Library _testLibrary;
 
   TypeConstraintGathererTest();
 
@@ -215,8 +213,8 @@
         typeParameters: 'T1 extends Object*');
   }
 
-  void checkConstraintsLower(String type, String bound, List<String> expected,
-      {String typeParameters, String typeParametersToConstrain}) {
+  void checkConstraintsLower(String type, String bound, List<String>? expected,
+      {String? typeParameters, String? typeParametersToConstrain}) {
     env.withTypeParameters(typeParameters ?? '',
         (List<TypeParameter> typeParameterNodes) {
       List<TypeParameter> typeParameterNodesToConstrain;
@@ -242,7 +240,7 @@
       DartType type,
       DartType bound,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       List<TypeParameter> typeParameterNodesToConstrain) {
     _checkConstraintsHelper(
         type,
@@ -253,8 +251,8 @@
         typeParameterNodesToConstrain);
   }
 
-  void checkConstraintsUpper(String type, String bound, List<String> expected,
-      {String typeParameters, String typeParametersToConstrain}) {
+  void checkConstraintsUpper(String type, String bound, List<String>? expected,
+      {String? typeParameters, String? typeParametersToConstrain}) {
     env.withTypeParameters(typeParameters ?? '',
         (List<TypeParameter> typeParameterNodes) {
       List<TypeParameter> typeParameterNodesToConstrain;
@@ -280,7 +278,7 @@
       DartType type,
       DartType bound,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       List<TypeParameter> typeParameterNodesToConstrain) {
     _checkConstraintsHelper(
         type,
@@ -295,7 +293,7 @@
       DartType a,
       DartType b,
       Library clientLibrary,
-      List<String> expectedConstraints,
+      List<String>? expectedConstraints,
       bool Function(TypeConstraintGatherer, DartType, DartType) tryConstrain,
       List<TypeParameter> typeParameterNodesToConstrain) {
     var typeSchemaEnvironment = new TypeSchemaEnvironment(
@@ -311,7 +309,7 @@
     }
     expect(constraints, isNotNull);
     var constraintStrings = <String>[];
-    constraints.forEach((t, constraint) {
+    constraints!.forEach((t, constraint) {
       if (constraint.lower is! UnknownType ||
           constraint.upper is! UnknownType) {
         var s = t.name;
@@ -321,7 +319,7 @@
         if (constraint.upper is! UnknownType) {
           s = '$s <: ${typeSchemaToString(constraint.upper)}';
         }
-        constraintStrings.add(s);
+        constraintStrings.add(s as String);
       }
     });
     expect(constraintStrings, unorderedEquals(expectedConstraints));
diff --git a/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart b/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
index 0588e94..0221278 100644
--- a/pkg/front_end/test/fasta/type_inference/type_inference_engine_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_inference_engine_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
-
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
 import 'package:kernel/ast.dart';
 import 'package:test/test.dart';
@@ -226,7 +224,7 @@
         isFalse);
   }
 
-  TypeParameterType tpt(TypeParameter param, {int variance = null}) {
+  TypeParameterType tpt(TypeParameter param, {int? variance = null}) {
     return new TypeParameterType(param, Nullability.legacy)
       ..parameter.variance = variance;
   }
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
index dc5b7cb..7abe586 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_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
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart'
     as typeSchemaElimination;
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
index 36f0c1a..49f3b77 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_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
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_elimination.dart'
     as typeSchemaElimination;
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
index 20d575a..182d44b 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_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
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
 import 'package:kernel/ast.dart';
@@ -21,15 +19,15 @@
 
 @reflectiveTest
 class TypeSchemaEnvironmentTest {
-  Env typeParserEnvironment;
-  TypeSchemaEnvironment typeSchemaEnvironment;
+  late Env typeParserEnvironment;
+  late TypeSchemaEnvironment typeSchemaEnvironment;
 
   final Map<String, DartType Function()> additionalTypes = {
     "UNKNOWN": () => new UnknownType(),
   };
 
-  Library _coreLibrary;
-  Library _testLibrary;
+  late Library _coreLibrary;
+  late Library _testLibrary;
 
   Library get coreLibrary => _coreLibrary;
   Library get testLibrary => _testLibrary;
@@ -111,7 +109,7 @@
   /// There's an infinite amount of such types, and the list contains some
   /// practical base cases.  For the definition of TOP see the following:
   /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
-  static const Map<String, String> topPredicateEnumeration = <String, String>{
+  static const Map<String, String?> topPredicateEnumeration = {
     // dynamic and void.
     "dynamic": null,
     "void": null,
@@ -210,7 +208,7 @@
   /// There's an infinite amount of such types, and the list contains some
   /// practical base cases.  For the definition of OBJECT see the following:
   /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
-  static const Map<String, String> objectPredicateEnumeration = {
+  static const Map<String, String?> objectPredicateEnumeration = {
     "Object": null,
     "FutureOr<Object>": null,
     "FutureOr<FutureOr<Object>>": null,
@@ -224,7 +222,7 @@
   ///
   /// The names of the variables here and in [nullPredicateEnumeration] should
   /// be distinct to avoid collisions.
-  static const Map<String, String> bottomPredicateEnumeration = {
+  static const Map<String, String?> bottomPredicateEnumeration = {
     "Never": null,
     "Xb & Never": "Xb extends Object?",
     "Yb & Zb & Never": "Yb extends Object?, Zb extends Object?",
@@ -241,7 +239,7 @@
   ///
   /// The names of the variables here and in [bottomPredicateEnumeration] should
   /// be distinct to avoid collisions.
-  static const Map<String, String> nullPredicateEnumeration = {
+  static const Map<String, String?> nullPredicateEnumeration = {
     // T? where BOTTOM(T).
     "Never?": null,
     "Xn?": "Xn extends Never",
@@ -256,8 +254,8 @@
     "Null": null,
   };
 
-  static String joinTypeParameters(
-      String typeParameters1, String typeParameters2) {
+  static String? joinTypeParameters(
+      String? typeParameters1, String? typeParameters2) {
     if (typeParameters1 == null) return typeParameters2;
     if (typeParameters2 == null) return typeParameters1;
     if (typeParameters1 == typeParameters2) return typeParameters1;
@@ -277,7 +275,7 @@
     //   T2 otherwise
     for (String t1 in bottomPredicateEnumeration.keys) {
       for (String t2 in bottomPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             bottomPredicateEnumeration[t1], bottomPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -320,7 +318,7 @@
     //   T2 otherwise
     for (String t1 in nullPredicateEnumeration.keys) {
       for (String t2 in nullPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             nullPredicateEnumeration[t1], nullPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -600,7 +598,7 @@
     //   T2 otherwise
     for (String t1 in topPredicateEnumeration.keys) {
       for (String t2 in topPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             topPredicateEnumeration[t1], topPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1100,7 +1098,7 @@
     //   T2 otherwise
     for (String t1 in topPredicateEnumeration.keys) {
       for (String t2 in topPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             topPredicateEnumeration[t1], topPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1143,7 +1141,7 @@
     //   T2 otherwise
     for (String t1 in objectPredicateEnumeration.keys) {
       for (String t2 in objectPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             objectPredicateEnumeration[t1], objectPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1194,7 +1192,7 @@
     //   T1 otherwise
     for (String t1 in bottomPredicateEnumeration.keys) {
       for (String t2 in bottomPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             bottomPredicateEnumeration[t1], bottomPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1237,7 +1235,7 @@
     //   T1 otherwise
     for (String t1 in nullPredicateEnumeration.keys) {
       for (String t2 in nullPredicateEnumeration.keys) {
-        String typeParameters = joinTypeParameters(
+        String? typeParameters = joinTypeParameters(
             nullPredicateEnumeration[t1], nullPredicateEnumeration[t2]);
         typeParserEnvironment.withTypeParameters(typeParameters, (_) {
           String expected =
@@ -1505,8 +1503,7 @@
   }
 
   void checkConstraintSolving(String constraint, String expected,
-      {bool grounded}) {
-    assert(grounded != null);
+      {required bool grounded}) {
     expect(
         typeSchemaEnvironment.solveTypeConstraint(
             parseConstraint(constraint),
@@ -1516,17 +1513,13 @@
         parseType(expected));
   }
 
-  void checkConstraintUpperBound({String constraint, String bound}) {
-    assert(constraint != null);
-    assert(bound != null);
-
+  void checkConstraintUpperBound(
+      {required String constraint, required String bound}) {
     expect(parseConstraint(constraint).upper, parseType(bound));
   }
 
-  void checkConstraintLowerBound({String constraint, String bound}) {
-    assert(constraint != null);
-    assert(bound != null);
-
+  void checkConstraintLowerBound(
+      {required String constraint, required String bound}) {
     expect(parseConstraint(constraint).lower, parseType(bound));
   }
 
@@ -1572,16 +1565,12 @@
   }
 
   void checkUpperBound(
-      {String type1,
-      String type2,
-      String upperBound,
-      String typeParameters,
+      {required String type1,
+      required String type2,
+      required String upperBound,
+      String? typeParameters,
       bool nonNull1: false,
       bool nonNull2: false}) {
-    assert(type1 != null);
-    assert(type2 != null);
-    assert(upperBound != null);
-
     typeParserEnvironment.withTypeParameters(typeParameters,
         (List<TypeParameter> typeParameterNodes) {
       DartType dartType1 = parseType(type1);
@@ -1600,11 +1589,10 @@
   }
 
   void checkLowerBound(
-      {String type1, String type2, String lowerBound, String typeParameters}) {
-    assert(type1 != null);
-    assert(type2 != null);
-    assert(lowerBound != null);
-
+      {required String type1,
+      required String type2,
+      required String lowerBound,
+      String? typeParameters}) {
     typeParserEnvironment.withTypeParameters(typeParameters,
         (List<TypeParameter> typeParameterNodes) {
       expect(
@@ -1615,28 +1603,23 @@
   }
 
   void checkInference(
-      {String typeParametersToInfer,
-      String functionType,
-      String actualParameterTypes,
-      String returnContextType,
-      String inferredTypesFromDownwardPhase,
-      String expectedTypes}) {
-    assert(typeParametersToInfer != null);
-    assert(functionType != null);
-    assert(expectedTypes != null);
-
+      {required String typeParametersToInfer,
+      required String functionType,
+      String? actualParameterTypes,
+      String? returnContextType,
+      String? inferredTypesFromDownwardPhase,
+      required String expectedTypes}) {
     typeParserEnvironment.withTypeParameters(typeParametersToInfer,
         (List<TypeParameter> typeParameterNodesToInfer) {
-      FunctionType functionTypeNode = parseType(functionType);
-      DartType returnContextTypeNode =
+      FunctionType functionTypeNode = parseType(functionType) as FunctionType;
+      DartType? returnContextTypeNode =
           returnContextType == null ? null : parseType(returnContextType);
-      List<DartType> actualTypeNodes = actualParameterTypes == null
+      List<DartType>? actualTypeNodes = actualParameterTypes == null
           ? null
           : parseTypes(actualParameterTypes);
-      List<DartType> expectedTypeNodes =
-          expectedTypes == null ? null : parseTypes(expectedTypes);
+      List<DartType> expectedTypeNodes = parseTypes(expectedTypes);
       DartType declaredReturnTypeNode = functionTypeNode.returnType;
-      List<DartType> formalTypeNodes = actualParameterTypes == null
+      List<DartType>? formalTypeNodes = actualParameterTypes == null
           ? null
           : functionTypeNode.positionalParameters;
 
@@ -1668,14 +1651,11 @@
   }
 
   void checkInferenceFromConstraints(
-      {String typeParameter,
-      String constraints,
-      String inferredTypeFromDownwardPhase,
-      bool downwardsInferPhase,
-      String expected}) {
-    assert(typeParameter != null);
-    assert(expected != null);
-    assert(downwardsInferPhase != null);
+      {required String typeParameter,
+      required String constraints,
+      String? inferredTypeFromDownwardPhase,
+      required bool downwardsInferPhase,
+      required String expected}) {
     assert(inferredTypeFromDownwardPhase == null || !downwardsInferPhase);
 
     typeParserEnvironment.withTypeParameters(typeParameter,
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
index 6945778..526e061 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_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
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
 import 'package:kernel/ast.dart';
@@ -21,15 +19,15 @@
 
 @reflectiveTest
 class TypeSchemaEnvironmentTest {
-  Env typeParserEnvironment;
-  TypeSchemaEnvironment typeSchemaEnvironment;
+  late Env typeParserEnvironment;
+  late TypeSchemaEnvironment typeSchemaEnvironment;
 
   final Map<String, DartType Function()> additionalTypes = {
     "UNKNOWN": () => new UnknownType(),
   };
 
-  Library _coreLibrary;
-  Library _testLibrary;
+  late Library _coreLibrary;
+  late Library _testLibrary;
 
   Library get coreLibrary => _coreLibrary;
   Library get testLibrary => _testLibrary;
@@ -587,8 +585,7 @@
   }
 
   void checkConstraintSolving(String constraint, String expected,
-      {bool grounded}) {
-    assert(grounded != null);
+      {required bool grounded}) {
     expect(
         typeSchemaEnvironment.solveTypeConstraint(
             parseConstraint(constraint), new DynamicType(), new NullType(),
@@ -596,17 +593,13 @@
         parseType(expected));
   }
 
-  void checkConstraintUpperBound({String constraint, String bound}) {
-    assert(constraint != null);
-    assert(bound != null);
-
+  void checkConstraintUpperBound(
+      {required String constraint, required String bound}) {
     expect(parseConstraint(constraint).upper, parseType(bound));
   }
 
-  void checkConstraintLowerBound({String constraint, String bound}) {
-    assert(constraint != null);
-    assert(bound != null);
-
+  void checkConstraintLowerBound(
+      {required String constraint, required String bound}) {
     expect(parseConstraint(constraint).lower, parseType(bound));
   }
 
@@ -652,11 +645,10 @@
   }
 
   void checkUpperBound(
-      {String type1, String type2, String upperBound, String typeParameters}) {
-    assert(type1 != null);
-    assert(type2 != null);
-    assert(upperBound != null);
-
+      {required String type1,
+      required String type2,
+      required String upperBound,
+      String? typeParameters}) {
     typeParserEnvironment.withTypeParameters(typeParameters,
         (List<TypeParameter> typeParameterNodes) {
       expect(
@@ -667,11 +659,10 @@
   }
 
   void checkLowerBound(
-      {String type1, String type2, String lowerBound, String typeParameters}) {
-    assert(type1 != null);
-    assert(type2 != null);
-    assert(lowerBound != null);
-
+      {required String type1,
+      required String type2,
+      required String lowerBound,
+      String? typeParameters}) {
     typeParserEnvironment.withTypeParameters(typeParameters,
         (List<TypeParameter> typeParameterNodes) {
       expect(
@@ -682,28 +673,23 @@
   }
 
   void checkInference(
-      {String typeParametersToInfer,
-      String functionType,
-      String actualParameterTypes,
-      String returnContextType,
-      String inferredTypesFromDownwardPhase,
-      String expectedTypes}) {
-    assert(typeParametersToInfer != null);
-    assert(functionType != null);
-    assert(expectedTypes != null);
-
+      {required String typeParametersToInfer,
+      required String functionType,
+      String? actualParameterTypes,
+      String? returnContextType,
+      String? inferredTypesFromDownwardPhase,
+      required String expectedTypes}) {
     typeParserEnvironment.withTypeParameters(typeParametersToInfer,
         (List<TypeParameter> typeParameterNodesToInfer) {
-      FunctionType functionTypeNode = parseType(functionType);
-      DartType returnContextTypeNode =
+      FunctionType functionTypeNode = parseType(functionType) as FunctionType;
+      DartType? returnContextTypeNode =
           returnContextType == null ? null : parseType(returnContextType);
-      List<DartType> actualTypeNodes = actualParameterTypes == null
+      List<DartType>? actualTypeNodes = actualParameterTypes == null
           ? null
           : parseTypes(actualParameterTypes);
-      List<DartType> expectedTypeNodes =
-          expectedTypes == null ? null : parseTypes(expectedTypes);
+      List<DartType> expectedTypeNodes = parseTypes(expectedTypes);
       DartType declaredReturnTypeNode = functionTypeNode.returnType;
-      List<DartType> formalTypeNodes = actualParameterTypes == null
+      List<DartType>? formalTypeNodes = actualParameterTypes == null
           ? null
           : functionTypeNode.positionalParameters;
 
@@ -735,14 +721,11 @@
   }
 
   void checkInferenceFromConstraints(
-      {String typeParameter,
-      String constraints,
-      String inferredTypeFromDownwardPhase,
-      bool downwardsInferPhase,
-      String expected}) {
-    assert(typeParameter != null);
-    assert(expected != null);
-    assert(downwardsInferPhase != null);
+      {required String typeParameter,
+      required String constraints,
+      String? inferredTypeFromDownwardPhase,
+      required bool downwardsInferPhase,
+      required String expected}) {
     assert(inferredTypeFromDownwardPhase == null || !downwardsInferPhase);
 
     typeParserEnvironment.withTypeParameters(typeParameter,
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
index eff2502..eb34789 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_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
-
 import 'package:front_end/src/fasta/type_inference/type_schema.dart';
 import 'package:kernel/ast.dart';
 import 'package:test/test.dart';
@@ -112,38 +110,38 @@
   }
 }
 
-class _OrdinaryVisitor<R> extends Visitor<R> with VisitorNullMixin<R> {
-  final _UnaryFunction<DartType, R> _defaultDartType;
+class _OrdinaryVisitor<R> extends Visitor<R?> with VisitorNullMixin<R> {
+  final _UnaryFunction<DartType, R>? _defaultDartType;
 
-  _OrdinaryVisitor({_UnaryFunction<DartType, R> defaultDartType})
+  _OrdinaryVisitor({_UnaryFunction<DartType, R>? defaultDartType})
       : _defaultDartType = defaultDartType;
 
   @override
-  R defaultDartType(DartType node) {
+  R? defaultDartType(DartType node) {
     if (_defaultDartType != null) {
-      return _defaultDartType(node);
+      return _defaultDartType!(node);
     } else {
       return super.defaultDartType(node);
     }
   }
 }
 
-class _TypeSchemaVisitor<R> extends Visitor<R> with VisitorNullMixin<R> {
-  final _UnaryFunction<DartType, R> _defaultDartType;
-  final _UnaryFunction<UnknownType, R> _visitUnknownType;
+class _TypeSchemaVisitor<R> extends Visitor<R?> with VisitorNullMixin<R> {
+  final _UnaryFunction<DartType, R>? _defaultDartType;
+  final _UnaryFunction<UnknownType, R>? _visitUnknownType;
 
   _TypeSchemaVisitor(
-      {_UnaryFunction<DartType, R> defaultDartType,
-      _UnaryFunction<UnknownType, R> visitUnknownType})
+      {_UnaryFunction<DartType, R>? defaultDartType,
+      _UnaryFunction<UnknownType, R>? visitUnknownType})
       : _defaultDartType = defaultDartType,
         _visitUnknownType = visitUnknownType;
 
   @override
-  R defaultDartType(DartType node) {
+  R? defaultDartType(DartType node) {
     if (node is UnknownType && _visitUnknownType != null) {
-      return _visitUnknownType(node);
+      return _visitUnknownType!(node);
     } else if (_defaultDartType != null) {
-      return _defaultDartType(node);
+      return _defaultDartType!(node);
     } else {
       return super.defaultDartType(node);
     }
diff --git a/pkg/front_end/test/fasta/types/dart2js_benchmark.dart b/pkg/front_end/test/fasta/types/dart2js_benchmark.dart
index b302938..c55dc33 100644
--- a/pkg/front_end/test/fasta/types/dart2js_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/dart2js_benchmark.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 "dart:io" show Platform;
 
 import "subtypes_benchmark.dart" show run;
diff --git a/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart b/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart
index 590937d..340ae12 100644
--- a/pkg/front_end/test/fasta/types/dart2js_benchmark_test.dart
+++ b/pkg/front_end/test/fasta/types/dart2js_benchmark_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
-
 import "dart2js_benchmark.dart" as bench show main;
 
 void main() => bench.main();
diff --git a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
deleted file mode 100644
index e37a8c3..0000000
--- a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-import "package:async_helper/async_helper.dart" show asyncTest;
-
-import "package:expect/expect.dart" show Expect;
-
-import "package:kernel/ast.dart" show Class, Component, Library;
-
-import "package:kernel/core_types.dart" show CoreTypes;
-
-import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
-
-import 'package:kernel/testing/type_parser_environment.dart'
-    show parseComponent;
-
-import "package:front_end/src/api_prototype/compiler_options.dart"
-    show CompilerOptions;
-
-import "package:front_end/src/base/processed_options.dart"
-    show ProcessedOptions;
-
-import "package:front_end/src/fasta/builder/class_builder.dart";
-
-import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext;
-
-import "package:front_end/src/fasta/dill/dill_loader.dart" show DillLoader;
-
-import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
-
-import "package:front_end/src/fasta/kernel/class_hierarchy_builder.dart"
-    show ClassHierarchyBuilder;
-
-import "package:front_end/src/fasta/ticker.dart" show Ticker;
-
-const String expectedHierarchy = """
-Object:
-  superclasses:
-  interfaces:
-  classMembers:
-  classSetters:
-
-A:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-  classSetters:
-
-B:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: A
-  classMembers:
-  classSetters:
-  interfaceMembers:
-  interfaceSetters:
-
-C:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: A
-  classMembers:
-  classSetters:
-  interfaceMembers:
-  interfaceSetters:
-
-D:
-  Longest path to Object: 3
-  superclasses:
-    Object
-  interfaces: B<T>, A, C<U>
-  classMembers:
-  classSetters:
-  interfaceMembers:
-  interfaceSetters:
-
-E:
-  Longest path to Object: 4
-  superclasses:
-    Object
-  interfaces: D<int,double>, B<int>, A, C<double>
-  classMembers:
-  classSetters:
-  interfaceMembers:
-  interfaceSetters:
-
-F:
-  Longest path to Object: 4
-  superclasses:
-    Object
-  interfaces: D<int,bool>, B<int>, A, C<bool>
-  classMembers:
-  classSetters:
-  interfaceMembers:
-  interfaceSetters:
-""";
-
-void main() {
-  final Ticker ticker = new Ticker(isVerbose: false);
-  final Component component = parseComponent("""
-class A;
-class B<T> implements A;
-class C<U> implements A;
-class D<T, U> implements B<T>, C<U>;
-class E implements D<int, double>;
-class F implements D<int, bool>;""",
-      Uri.parse("org-dartlang-test:///library.dart"));
-
-  final CompilerContext context = new CompilerContext(new ProcessedOptions(
-      options: new CompilerOptions()
-        ..packagesFileUri = Uri.base.resolve(".packages")));
-
-  asyncTest(() => context.runInContext<void>((_) async {
-        DillTarget target = new DillTarget(
-            ticker,
-            await context.options.getUriTranslator(),
-            new NoneTarget(new TargetFlags()));
-        final DillLoader loader = target.loader;
-        loader.appendLibraries(component);
-        await target.buildOutlines();
-        ClassBuilder objectClass =
-            loader.coreLibrary.lookupLocalMember("Object", required: true);
-        ClassHierarchyBuilder hierarchy = new ClassHierarchyBuilder(
-            objectClass, loader, new CoreTypes(component));
-        Library library = component.libraries.last;
-        for (Class cls in library.classes) {
-          hierarchy.getNodeFromClass(cls);
-        }
-        Expect.stringEquals(
-            expectedHierarchy, hierarchy.nodes.values.join("\n"));
-      }));
-}
diff --git a/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart b/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart
new file mode 100644
index 0000000..55076d6
--- /dev/null
+++ b/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:async_helper/async_helper.dart" show asyncTest;
+
+import "package:expect/expect.dart" show Expect;
+
+import "package:kernel/ast.dart" show Class, Component, Library;
+
+import "package:kernel/core_types.dart" show CoreTypes;
+
+import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
+
+import 'package:kernel/testing/type_parser_environment.dart'
+    show parseComponent;
+
+import "package:front_end/src/api_prototype/compiler_options.dart"
+    show CompilerOptions;
+
+import "package:front_end/src/base/processed_options.dart"
+    show ProcessedOptions;
+
+import "package:front_end/src/fasta/builder/class_builder.dart";
+
+import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext;
+
+import "package:front_end/src/fasta/dill/dill_loader.dart" show DillLoader;
+
+import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
+
+import "package:front_end/src/fasta/kernel/hierarchy/hierarchy_builder.dart"
+    show ClassHierarchyBuilder;
+
+import "package:front_end/src/fasta/ticker.dart" show Ticker;
+
+const String expectedHierarchy = """
+Object:
+  superclasses:
+  interfaces:
+
+A:
+  superclasses:
+    Object
+  interfaces:
+
+B:
+  Longest path to Object: 2
+  superclasses:
+    Object
+  interfaces: A
+
+C:
+  Longest path to Object: 2
+  superclasses:
+    Object
+  interfaces: A
+
+D:
+  Longest path to Object: 3
+  superclasses:
+    Object
+  interfaces: B<T>, A, C<U>
+
+E:
+  Longest path to Object: 4
+  superclasses:
+    Object
+  interfaces: D<int,double>, B<int>, A, C<double>
+
+F:
+  Longest path to Object: 4
+  superclasses:
+    Object
+  interfaces: D<int,bool>, B<int>, A, C<bool>
+""";
+
+void main() {
+  final Ticker ticker = new Ticker(isVerbose: false);
+  final Component component = parseComponent("""
+class A;
+class B<T> implements A;
+class C<U> implements A;
+class D<T, U> implements B<T>, C<U>;
+class E implements D<int, double>;
+class F implements D<int, bool>;""",
+      Uri.parse("org-dartlang-test:///library.dart"));
+
+  final CompilerContext context = new CompilerContext(new ProcessedOptions(
+      options: new CompilerOptions()
+        ..packagesFileUri = Uri.base.resolve(".packages")));
+
+  asyncTest(() => context.runInContext<void>((_) async {
+        DillTarget target = new DillTarget(
+            ticker,
+            await context.options.getUriTranslator(),
+            new NoneTarget(new TargetFlags()));
+        final DillLoader loader = target.loader;
+        loader.appendLibraries(component);
+        target.buildOutlines();
+        ClassBuilder objectClass = loader.coreLibrary
+            .lookupLocalMember("Object", required: true) as ClassBuilder;
+        ClassHierarchyBuilder hierarchy = new ClassHierarchyBuilder(
+            objectClass, loader, new CoreTypes(component));
+        Library library = component.libraries.last;
+        for (Class cls in library.classes) {
+          hierarchy.getNodeFromClass(cls);
+        }
+        Expect.stringEquals(
+            expectedHierarchy, hierarchy.nodes.values.join("\n"));
+      }));
+}
diff --git a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
index 33af5ac..618c014 100644
--- a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
-import "package:kernel/ast.dart" show DartType, Library;
+import "package:kernel/ast.dart" show DartType, InterfaceType, Library;
 
 import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
 
@@ -22,7 +20,7 @@
 
 import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
 
-import "package:front_end/src/fasta/kernel/class_hierarchy_builder.dart"
+import "package:front_end/src/fasta/kernel/hierarchy/hierarchy_builder.dart"
     show ClassHierarchyBuilder;
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
@@ -33,7 +31,7 @@
   final Ticker ticker;
   final CompilerContext context;
 
-  ClassHierarchyBuilder hierarchy;
+  late ClassHierarchyBuilder hierarchy;
 
   FastaLegacyUpperBoundTest(this.ticker, this.context);
 
@@ -50,16 +48,17 @@
         new NoneTarget(new TargetFlags()));
     final DillLoader loader = target.loader;
     loader.appendLibraries(env.component);
-    await target.buildOutlines();
-    ClassBuilder objectClass =
-        loader.coreLibrary.lookupLocalMember("Object", required: true);
+    target.buildOutlines();
+    ClassBuilder objectClass = loader.coreLibrary
+        .lookupLocalMember("Object", required: true) as ClassBuilder;
     hierarchy = new ClassHierarchyBuilder(objectClass, loader, env.coreTypes);
   }
 
   @override
   DartType getLegacyLeastUpperBound(
       DartType a, DartType b, Library clientLibrary) {
-    return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary);
+    return hierarchy.getLegacyLeastUpperBound(
+        a as InterfaceType, b as InterfaceType, clientLibrary);
   }
 }
 
diff --git a/pkg/front_end/test/fasta/types/fasta_types_test.dart b/pkg/front_end/test/fasta/types/fasta_types_test.dart
index 83135453..55095c7 100644
--- a/pkg/front_end/test/fasta/types/fasta_types_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_types_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
-
 import "package:async_helper/async_helper.dart" show asyncTest;
 
 import "package:kernel/ast.dart" show Component, DartType;
@@ -31,7 +29,7 @@
 
 import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
 
-import "package:front_end/src/fasta/kernel/class_hierarchy_builder.dart"
+import "package:front_end/src/fasta/kernel/hierarchy/hierarchy_builder.dart"
     show ClassHierarchyBuilder;
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
@@ -55,9 +53,9 @@
         new NoneTarget(new TargetFlags()));
     final DillLoader loader = target.loader;
     loader.appendLibraries(sdk);
-    await target.buildOutlines();
-    ClassBuilder objectClass =
-        loader.coreLibrary.lookupLocalMember("Object", required: true);
+    target.buildOutlines();
+    ClassBuilder objectClass = loader.coreLibrary
+        .lookupLocalMember("Object", required: true) as ClassBuilder;
     ClassHierarchyBuilder hierarchy =
         new ClassHierarchyBuilder(objectClass, loader, new CoreTypes(sdk));
     new FastaTypesTest(hierarchy, environment).run();
@@ -85,7 +83,7 @@
   }
 
   @override
-  TypeParserEnvironment extend(String typeParameters) {
+  TypeParserEnvironment extend(String? typeParameters) {
     return environment.extendWithTypeParameters(typeParameters);
   }
 }
diff --git a/pkg/front_end/test/fasta/types/hashcode_test.dart b/pkg/front_end/test/fasta/types/hashcode_test.dart
index 0c1fbfe..a7542c1 100644
--- a/pkg/front_end/test/fasta/types/hashcode_test.dart
+++ b/pkg/front_end/test/fasta/types/hashcode_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.md file.
 
-// @dart = 2.9
-
 import 'package:expect/expect.dart';
 import 'package:kernel/kernel.dart';
 
diff --git a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
index aeffa98..9ce7b25 100644
--- a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
@@ -2,31 +2,29 @@
 // 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 "legacy_upper_bound_helper.dart" show LegacyUpperBoundTest;
 
-import "package:kernel/ast.dart" show DartType, Library;
+import "package:kernel/ast.dart" show DartType, InterfaceType, Library;
 
 import "package:kernel/class_hierarchy.dart" show ClassHierarchy;
 
 class KernelLegacyUpperBoundTest extends LegacyUpperBoundTest {
-  ClassHierarchy hierarchy;
+  late ClassHierarchy hierarchy;
 
   @override
   bool get isNonNullableByDefault => true;
 
   @override
-  Future<void> parseComponent(String source) {
-    super.parseComponent(source);
+  Future<void> parseComponent(String source) async {
+    await super.parseComponent(source);
     hierarchy = new ClassHierarchy(env.component, env.coreTypes);
-    return null;
   }
 
   @override
   DartType getLegacyLeastUpperBound(
       DartType a, DartType b, Library clientLibrary) {
-    return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary);
+    return hierarchy.getLegacyLeastUpperBound(
+        a as InterfaceType, b as InterfaceType, clientLibrary);
   }
 }
 
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index edae38a..f6c6728 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_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
-
 import "package:expect/expect.dart" show Expect;
 
 import "package:kernel/ast.dart" show Component, DartType, Library;
@@ -147,7 +145,7 @@
   }
 
   @override
-  TypeParserEnvironment extend(String typeParameters) {
+  TypeParserEnvironment extend(String? typeParameters) {
     return environment.extendWithTypeParameters(typeParameters);
   }
 }
diff --git a/pkg/front_end/test/fasta/types/large_app_benchmark.dart b/pkg/front_end/test/fasta/types/large_app_benchmark.dart
index 28c653f..2403d67 100644
--- a/pkg/front_end/test/fasta/types/large_app_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/large_app_benchmark.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 "dart:io" show Platform;
 
 import "subtypes_benchmark.dart" show run;
diff --git a/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart b/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart
index 3037003..24cefc6 100644
--- a/pkg/front_end/test/fasta/types/large_app_benchmark_test.dart
+++ b/pkg/front_end/test/fasta/types/large_app_benchmark_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
-
 import "large_app_benchmark.dart" as bench show main;
 
 void main() => bench.main();
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
index 3d4c7d6..a47c4ee 100644
--- a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
+++ b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.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:async_helper/async_helper.dart" show asyncTest;
 
 import "package:expect/expect.dart" show Expect;
@@ -15,13 +13,13 @@
 final Uri libraryUri = Uri.parse("org-dartlang-test:///library.dart");
 
 abstract class LegacyUpperBoundTest {
-  parser.Env env;
-  Library coreLibrary;
-  Library testLibrary;
+  late parser.Env env;
+  late Library coreLibrary;
+  late Library testLibrary;
 
   bool get isNonNullableByDefault;
 
-  void parseComponent(String source) {
+  Future<void> parseComponent(String source) {
     env =
         new parser.Env(source, isNonNullableByDefault: isNonNullableByDefault);
     assert(
@@ -42,6 +40,7 @@
       coreLibrary = secondLibrary;
       testLibrary = firstLibrary;
     }
+    return new Future<void>.value();
   }
 
   DartType getLegacyLeastUpperBound(
diff --git a/pkg/front_end/test/fasta/types/shared_type_tests.dart b/pkg/front_end/test/fasta/types/shared_type_tests.dart
index f219fb6..224378f 100644
--- a/pkg/front_end/test/fasta/types/shared_type_tests.dart
+++ b/pkg/front_end/test/fasta/types/shared_type_tests.dart
@@ -2,15 +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.
 
-// @dart = 2.9
-
 import "package:expect/expect.dart" show Expect;
 
 import "package:kernel/type_environment.dart";
 
 abstract class SubtypeTest<T, E> {
   void isSubtype(String subtypeString, String supertypeString,
-      {String typeParameters}) {
+      {String? typeParameters}) {
     E environment = extend(typeParameters);
     T subtype = toType(subtypeString, environment);
     T supertype = toType(supertypeString, environment);
@@ -21,7 +19,7 @@
   }
 
   void isNotSubtype(String subtypeString, String supertypeString,
-      {String typeParameters}) {
+      {String? typeParameters}) {
     E environment = extend(typeParameters);
     T subtype = toType(subtypeString, environment);
     T supertype = toType(supertypeString, environment);
@@ -33,7 +31,7 @@
 
   /// Checks if a type is a subtype of the other ignoring nullability modifiers.
   void isObliviousSubtype(String subtypeString, String supertypeString,
-      {String typeParameters}) {
+      {String? typeParameters}) {
     E environment = extend(typeParameters);
     T subtype = toType(subtypeString, environment);
     T supertype = toType(supertypeString, environment);
@@ -54,7 +52,7 @@
 
   IsSubtypeOf isSubtypeImpl(T subtype, T supertype);
 
-  E extend(String typeParameters);
+  E extend(String? typeParameters);
 
   void run() {
     // Tests for subtypes and supertypes of num.
diff --git a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
index 6ab0236..165313e 100644
--- a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/subtypes_benchmark.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 "dart:convert" show json, utf8;
 
 import "dart:io" show File, gzip;
@@ -36,7 +34,7 @@
 
 import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
 
-import "package:front_end/src/fasta/kernel/class_hierarchy_builder.dart"
+import "package:front_end/src/fasta/kernel/hierarchy/hierarchy_builder.dart"
     show ClassHierarchyBuilder;
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
@@ -66,17 +64,17 @@
 }
 
 SubtypesBenchmark parseBenchMark(String source) {
-  Map<Object, Object> data = json.decode(source);
-  List<Object> classes = data["classes"];
+  Map<dynamic, dynamic> data = json.decode(source);
+  List<dynamic> classes = data["classes"];
   Uri uri = Uri.parse("dart:core");
   TypeParserEnvironment environment = new TypeParserEnvironment(uri, uri);
   Library library =
       parseLibrary(uri, classes.join("\n"), environment: environment);
-  List<Object> checks = data["checks"];
+  List<dynamic> checks = data["checks"];
   List<SubtypeCheck> subtypeChecks = <SubtypeCheck>[];
-  for (Map<Object, Object> check in checks) {
+  for (Map<dynamic, dynamic> check in checks) {
     String kind = check["kind"];
-    List<Object> arguments = check["arguments"];
+    List<dynamic> arguments = check["arguments"];
     String sSource = arguments[0];
     String tSource = arguments[1];
     if (sSource.contains("?")) continue;
@@ -85,7 +83,7 @@
     if (tSource.contains("⊥")) continue;
     TypeParserEnvironment localEnvironment = environment;
     if (arguments.length > 2) {
-      List<Object> typeParametersSource = arguments[2];
+      List<dynamic> typeParametersSource = arguments[2];
       localEnvironment = environment
           .extendWithTypeParameters("${typeParametersSource.join(', ')}");
     }
@@ -124,7 +122,7 @@
   final Ticker ticker = new Ticker(isVerbose: false);
   Stopwatch kernelWatch = new Stopwatch();
   Stopwatch fastaWatch = new Stopwatch();
-  List<int> bytes = await new File.fromUri(benchmarkInput).readAsBytes();
+  List<int>? bytes = await new File.fromUri(benchmarkInput).readAsBytes();
   if (bytes.length > 3) {
     if (bytes[0] == 0x1f && bytes[1] == 0x8b && bytes[2] == 0x08) {
       bytes = gzip.decode(bytes);
@@ -148,9 +146,9 @@
         new NoneTarget(new TargetFlags()));
     final DillLoader loader = target.loader;
     loader.appendLibraries(c);
-    await target.buildOutlines();
-    ClassBuilder objectClass =
-        loader.coreLibrary.lookupLocalMember("Object", required: true);
+    target.buildOutlines();
+    ClassBuilder objectClass = loader.coreLibrary
+        .lookupLocalMember("Object", required: true) as ClassBuilder;
     ClassHierarchyBuilder hierarchy =
         new ClassHierarchyBuilder(objectClass, loader, coreTypes);
 
diff --git a/pkg/front_end/test/fasta/uri_translator_test.dart b/pkg/front_end/test/fasta/uri_translator_test.dart
index 37e3564..806a053 100644
--- a/pkg/front_end/test/fasta/uri_translator_test.dart
+++ b/pkg/front_end/test/fasta/uri_translator_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
-
 import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
 import 'package:package_config/package_config.dart';
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test.dart b/pkg/front_end/test/fasta/util/direct_parser_ast_test.dart
deleted file mode 100644
index 4e4a34d..0000000
--- a/pkg/front_end/test/fasta/util/direct_parser_ast_test.dart
+++ /dev/null
@@ -1,485 +0,0 @@
-// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE.md file.
-
-// @dart = 2.9
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart';
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
-
-Uri base;
-
-void main(List<String> args) {
-  File script = new File.fromUri(Platform.script);
-  base = script.parent.uri;
-
-  testTopLevelStuff();
-  testClassStuff();
-  testMixinStuff();
-
-  if (!args.contains("--fast")) {
-    canParseTopLevelIshOfAllFrontendFiles();
-  }
-}
-
-void canParseTopLevelIshOfAllFrontendFiles() {
-  Directory directory = new Directory.fromUri(base.resolve("../../../"));
-  int processed = 0;
-  int errors = 0;
-  for (FileSystemEntity entry in directory.listSync(recursive: true)) {
-    if (entry is File) {
-      if (!entry.path.endsWith(".dart")) continue;
-      try {
-        processed++;
-        List<int> data = entry.readAsBytesSync();
-        DirectParserASTContentCompilationUnitEnd ast = getAST(data,
-            includeBody: true,
-            includeComments: true,
-            enableExtensionMethods: true,
-            enableNonNullable: false);
-        splitIntoChunks(ast, data);
-        for (DirectParserASTContent child in ast.children) {
-          if (child.isClass()) {
-            splitIntoChunks(
-                child.asClass().getClassOrMixinOrExtensionBody(), data);
-          } else if (child.isMixinDeclaration()) {
-            splitIntoChunks(
-                child.asMixinDeclaration().getClassOrMixinOrExtensionBody(),
-                data);
-          }
-        }
-      } catch (e, st) {
-        print("Failure on $entry:\n$e\n\n$st\n\n--------------\n\n");
-        errors++;
-      }
-    }
-  }
-  print("Processed $processed files in $directory. "
-      "Encountered $errors errors.");
-}
-
-void testTopLevelStuff() {
-  File file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/top_level_stuff.txt"));
-  List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
-      includeBody: true,
-      includeComments: true,
-      enableExtensionMethods: true,
-      enableNonNullable: false);
-  expect(2, ast.getImports().length);
-  expect(2, ast.getExports().length);
-
-  List<String> foundChunks = splitIntoChunks(ast, data);
-  expect(22, foundChunks.length);
-  expect("library top_level_stuff;", foundChunks[0]);
-  expect('import "top_level_stuff_helper.dart";', foundChunks[1]);
-  expect('export "top_level_stuff_helper.dart";', foundChunks[2]);
-  expect(
-      'import "top_level_stuff_helper.dart" show a, b, '
-      'c hide d, e, f show foo;',
-      foundChunks[3]);
-  expect(
-      'export "top_level_stuff_helper.dart" show a, b, '
-      'c hide d, e, f show foo;',
-      foundChunks[4]);
-  expect("part 'top_level_stuff_helper.dart';", foundChunks[5]);
-  expect('@metadataOneOnThisOne("bla")\n', foundChunks[6]);
-  expect("@metadataTwoOnThisOne\n", foundChunks[7]);
-  expect("""void toplevelMethod() {
-  // no content
-}""", foundChunks[8]);
-  expect("""List<E> anotherTopLevelMethod<E>() {
-  return null;
-}""", foundChunks[9]);
-  expect("enum FooEnum { A, B, Bla }", foundChunks[10]);
-  expect("""class FooClass {
-  // no content.
-}""", foundChunks[11]);
-  expect("""mixin FooMixin {
-  // no content.
-}""", foundChunks[12]);
-  expect("""class A<T> {
-  // no content.
-}""", foundChunks[13]);
-  expect("typedef B = Function();", foundChunks[14]);
-  expect("""mixin C<T> on A<T> {
-  // no content.
-}""", foundChunks[15]);
-  expect("""extension D<T> on A<T> {
-  // no content.
-}""", foundChunks[16]);
-  expect("class E = A with FooClass;", foundChunks[17]);
-  expect("int field1;", foundChunks[18]);
-  expect("int field2, field3;", foundChunks[19]);
-  expect("int field4 = 42;", foundChunks[20]);
-  expect("@AnnotationAtEOF", foundChunks[21]);
-
-  file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/top_level_stuff_helper.txt"));
-  data = file.readAsBytesSync();
-  ast = getAST(data,
-      includeBody: true,
-      includeComments: true,
-      enableExtensionMethods: true,
-      enableNonNullable: false);
-  foundChunks = splitIntoChunks(ast, data);
-  expect(1, foundChunks.length);
-  expect("part of 'top_level_stuff.txt';", foundChunks[0]);
-
-  file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/script_handle.txt"));
-  data = file.readAsBytesSync();
-  ast = getAST(data,
-      includeBody: true,
-      includeComments: true,
-      enableExtensionMethods: true,
-      enableNonNullable: false);
-  foundChunks = splitIntoChunks(ast, data);
-  expect(1, foundChunks.length);
-  expect("#!/usr/bin/env dart -c", foundChunks[0]);
-}
-
-void testClassStuff() {
-  File file =
-      new File.fromUri(base.resolve("direct_parser_ast_test_data/class.txt"));
-  List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
-      includeBody: true,
-      includeComments: true,
-      enableExtensionMethods: true,
-      enableNonNullable: false);
-  List<DirectParserASTContentTopLevelDeclarationEnd> classes = ast.getClasses();
-  expect(2, classes.length);
-
-  DirectParserASTContentTopLevelDeclarationEnd decl = classes[0];
-  DirectParserASTContentClassDeclarationEnd cls = decl.asClass();
-  expect("Foo", decl.getIdentifier().token.lexeme);
-  DirectParserASTContentClassExtendsHandle extendsDecl = cls.getClassExtends();
-  expect("extends", extendsDecl.extendsKeyword?.lexeme);
-  DirectParserASTContentClassOrMixinImplementsHandle implementsDecl =
-      cls.getClassImplements();
-  expect("implements", implementsDecl.implementsKeyword?.lexeme);
-  DirectParserASTContentClassWithClauseHandle withClauseDecl =
-      cls.getClassWithClause();
-  expect(null, withClauseDecl);
-  List<DirectParserASTContentMemberEnd> members =
-      cls.getClassOrMixinOrExtensionBody().getMembers();
-  expect(5, members.length);
-  expect(members[0].isClassConstructor(), true);
-  expect(members[1].isClassFactoryMethod(), true);
-  expect(members[2].isClassMethod(), true);
-  expect(members[3].isClassMethod(), true);
-  expect(members[4].isClassFields(), true);
-
-  List<String> chunks =
-      splitIntoChunks(cls.getClassOrMixinOrExtensionBody(), data);
-  expect(5, chunks.length);
-  expect("""Foo() {
-    // Constructor
-  }""", chunks[0]);
-  expect("factory Foo.factory() => Foo();", chunks[1]);
-  expect("""void method() {
-    // instance method.
-  }""", chunks[2]);
-  expect("""static void staticMethod() {
-    // static method.
-  }""", chunks[3]);
-  expect("int field1, field2 = 42;", chunks[4]);
-
-  chunks = processItem(
-      members[0].getClassConstructor().getBlockFunctionBody(), data);
-  expect(1, chunks.length);
-  expect("""{
-    // Constructor
-  }""", chunks[0]);
-  chunks =
-      processItem(members[2].getClassMethod().getBlockFunctionBody(), data);
-  expect(1, chunks.length);
-  expect("""{
-    // instance method.
-  }""", chunks[0]);
-  chunks =
-      processItem(members[3].getClassMethod().getBlockFunctionBody(), data);
-  expect(1, chunks.length);
-  expect("""{
-    // static method.
-  }""", chunks[0]);
-
-  // TODO: Move (something like) this into the check-all-files-thing.
-  for (DirectParserASTContentMemberEnd member
-      in cls.getClassOrMixinOrExtensionBody().getMembers()) {
-    if (member.isClassConstructor()) continue;
-    if (member.isClassFactoryMethod()) continue;
-    if (member.isClassFields()) continue;
-    if (member.isClassMethod()) continue;
-    throw "$member --- ${member.children}";
-  }
-
-  decl = classes[1];
-  cls = decl.asClass();
-  expect("Foo2", decl.getIdentifier().token.lexeme);
-  extendsDecl = cls.getClassExtends();
-  expect(null, extendsDecl.extendsKeyword?.lexeme);
-  implementsDecl = cls.getClassImplements();
-  expect(null, implementsDecl.implementsKeyword?.lexeme);
-  withClauseDecl = cls.getClassWithClause();
-  expect("with", withClauseDecl.withKeyword.lexeme);
-  members = cls.getClassOrMixinOrExtensionBody().getMembers();
-  expect(0, members.length);
-}
-
-void testMixinStuff() {
-  File file =
-      new File.fromUri(base.resolve("direct_parser_ast_test_data/mixin.txt"));
-  List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
-      includeBody: true,
-      includeComments: true,
-      enableExtensionMethods: true,
-      enableNonNullable: false);
-  List<DirectParserASTContentTopLevelDeclarationEnd> mixins =
-      ast.getMixinDeclarations();
-  expect(mixins.length, 1);
-
-  DirectParserASTContentTopLevelDeclarationEnd decl = mixins[0];
-  DirectParserASTContentMixinDeclarationEnd mxn = decl.asMixinDeclaration();
-  expect("B", decl.getIdentifier().token.lexeme);
-
-  List<DirectParserASTContentMemberEnd> members =
-      mxn.getClassOrMixinOrExtensionBody().getMembers();
-  expect(4, members.length);
-  expect(members[0].isMixinFields(), true);
-  expect(members[1].isMixinMethod(), true);
-  expect(members[2].isMixinFactoryMethod(), true);
-  expect(members[3].isMixinConstructor(), true);
-
-  List<String> chunks =
-      splitIntoChunks(mxn.getClassOrMixinOrExtensionBody(), data);
-  expect(4, chunks.length);
-  expect("static int staticField = 0;", chunks[0]);
-  expect("""void foo() {
-    // empty
-  }""", chunks[1]);
-  expect("""factory B() {
-    // empty
-  }""", chunks[2]);
-  expect("""B.foo() {
-    // empty
-  }""", chunks[3]);
-}
-
-void expect<E>(E expect, E actual) {
-  if (expect != actual) throw "Expected '$expect' but got '$actual'";
-}
-
-List<String> splitIntoChunks(DirectParserASTContent ast, List<int> data) {
-  List<String> foundChunks = [];
-  for (DirectParserASTContent child in ast.children) {
-    foundChunks.addAll(processItem(child, data));
-  }
-  return foundChunks;
-}
-
-List<String> processItem(DirectParserASTContent item, List<int> data) {
-  if (item.isClass()) {
-    DirectParserASTContentClassDeclarationEnd cls = item.asClass();
-    return [
-      getCutContent(data, cls.beginToken.offset,
-          cls.endToken.offset + cls.endToken.length)
-    ];
-  } else if (item.isMetadata()) {
-    DirectParserASTContentMetadataStarEnd metadataStar = item.asMetadata();
-    List<DirectParserASTContentMetadataEnd> entries =
-        metadataStar.getMetadataEntries();
-    if (entries.isNotEmpty) {
-      List<String> chunks = [];
-      for (DirectParserASTContentMetadataEnd metadata in entries) {
-        chunks.add(getCutContent(
-            data, metadata.beginToken.offset, metadata.endToken.offset));
-      }
-      return chunks;
-    }
-    return const [];
-  } else if (item.isImport()) {
-    DirectParserASTContentImportEnd import = item.asImport();
-    return [
-      getCutContent(data, import.importKeyword.offset,
-          import.semicolon.offset + import.semicolon.length)
-    ];
-  } else if (item.isExport()) {
-    DirectParserASTContentExportEnd export = item.asExport();
-    return [
-      getCutContent(data, export.exportKeyword.offset,
-          export.semicolon.offset + export.semicolon.length)
-    ];
-  } else if (item.isLibraryName()) {
-    DirectParserASTContentLibraryNameEnd name = item.asLibraryName();
-    return [
-      getCutContent(data, name.libraryKeyword.offset,
-          name.semicolon.offset + name.semicolon.length)
-    ];
-  } else if (item.isPart()) {
-    DirectParserASTContentPartEnd part = item.asPart();
-    return [
-      getCutContent(data, part.partKeyword.offset,
-          part.semicolon.offset + part.semicolon.length)
-    ];
-  } else if (item.isPartOf()) {
-    DirectParserASTContentPartOfEnd partOf = item.asPartOf();
-    return [
-      getCutContent(data, partOf.partKeyword.offset,
-          partOf.semicolon.offset + partOf.semicolon.length)
-    ];
-  } else if (item.isTopLevelMethod()) {
-    DirectParserASTContentTopLevelMethodEnd method = item.asTopLevelMethod();
-    return [
-      getCutContent(data, method.beginToken.offset,
-          method.endToken.offset + method.endToken.length)
-    ];
-  } else if (item.isTopLevelFields()) {
-    DirectParserASTContentTopLevelFieldsEnd fields = item.asTopLevelFields();
-    return [
-      getCutContent(data, fields.beginToken.offset,
-          fields.endToken.offset + fields.endToken.length)
-    ];
-  } else if (item.isEnum()) {
-    DirectParserASTContentEnumEnd declaration = item.asEnum();
-    return [
-      getCutContent(
-          data,
-          declaration.enumKeyword.offset,
-          declaration.leftBrace.endGroup.offset +
-              declaration.leftBrace.endGroup.length)
-    ];
-  } else if (item.isMixinDeclaration()) {
-    DirectParserASTContentMixinDeclarationEnd mixinDecl =
-        item.asMixinDeclaration();
-    return [
-      getCutContent(data, mixinDecl.mixinKeyword.offset,
-          mixinDecl.endToken.offset + mixinDecl.endToken.length)
-    ];
-  } else if (item.isNamedMixinDeclaration()) {
-    DirectParserASTContentNamedMixinApplicationEnd namedMixinDecl =
-        item.asNamedMixinDeclaration();
-    return [
-      getCutContent(data, namedMixinDecl.begin.offset,
-          namedMixinDecl.endToken.offset + namedMixinDecl.endToken.length)
-    ];
-  } else if (item.isTypedef()) {
-    DirectParserASTContentTypedefEnd typedefDecl = item.asTypedef();
-    return [
-      getCutContent(data, typedefDecl.typedefKeyword.offset,
-          typedefDecl.endToken.offset + typedefDecl.endToken.length)
-    ];
-  } else if (item.isExtension()) {
-    DirectParserASTContentExtensionDeclarationEnd extensionDecl =
-        item.asExtension();
-    return [
-      getCutContent(data, extensionDecl.extensionKeyword.offset,
-          extensionDecl.endToken.offset + extensionDecl.endToken.length)
-    ];
-  } else if (item.isScript()) {
-    DirectParserASTContentScriptHandle script = item.asScript();
-    return [
-      getCutContent(
-          data, script.token.offset, script.token.offset + script.token.length)
-    ];
-  } else if (item is DirectParserASTContentMemberEnd) {
-    if (item.isClassConstructor()) {
-      DirectParserASTContentClassConstructorEnd decl =
-          item.getClassConstructor();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else if (item.isClassFactoryMethod()) {
-      DirectParserASTContentClassFactoryMethodEnd decl =
-          item.getClassFactoryMethod();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else if (item.isClassMethod()) {
-      DirectParserASTContentClassMethodEnd decl = item.getClassMethod();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else if (item.isClassFields()) {
-      DirectParserASTContentClassFieldsEnd decl = item.getClassFields();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else if (item.isClassFields()) {
-      DirectParserASTContentClassFieldsEnd decl = item.getClassFields();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else if (item.isMixinFields()) {
-      DirectParserASTContentMixinFieldsEnd decl = item.getMixinFields();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else if (item.isMixinMethod()) {
-      DirectParserASTContentMixinMethodEnd decl = item.getMixinMethod();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else if (item.isMixinFactoryMethod()) {
-      DirectParserASTContentMixinFactoryMethodEnd decl =
-          item.getMixinFactoryMethod();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else if (item.isMixinConstructor()) {
-      DirectParserASTContentMixinConstructorEnd decl =
-          item.getMixinConstructor();
-      return [
-        getCutContent(data, decl.beginToken.offset,
-            decl.endToken.offset + decl.endToken.length)
-      ];
-    } else {
-      if (item.type == DirectParserASTType.BEGIN) return const [];
-      if (item.type == DirectParserASTType.HANDLE) return const [];
-      if (item.isClassRecoverableError()) return const [];
-      if (item.isRecoverableError()) return const [];
-      if (item.isRecoverImport()) return const [];
-      throw "Unknown: $item --- ${item.children}";
-    }
-  } else if (item.isFunctionBody()) {
-    DirectParserASTContentBlockFunctionBodyEnd decl = item.asFunctionBody();
-    return [
-      getCutContent(data, decl.beginToken.offset,
-          decl.endToken.offset + decl.endToken.length)
-    ];
-  } else {
-    if (item.type == DirectParserASTType.BEGIN) return const [];
-    if (item.type == DirectParserASTType.HANDLE) return const [];
-    if (item.isInvalidTopLevelDeclaration()) return const [];
-    if (item.isRecoverableError()) return const [];
-    if (item.isRecoverImport()) return const [];
-
-    throw "Unknown: $item --- ${item.children}";
-  }
-}
-
-List<int> _contentCache;
-String _contentCacheString;
-String getCutContent(List<int> content, int from, int to) {
-  if (identical(content, _contentCache)) {
-    // cache up to date.
-  } else {
-    _contentCache = content;
-    _contentCacheString = utf8.decode(content);
-  }
-  return _contentCacheString.substring(from, to);
-}
diff --git a/pkg/front_end/test/fasta/util/parser_ast_test.dart b/pkg/front_end/test/fasta/util/parser_ast_test.dart
new file mode 100644
index 0000000..e002d6d
--- /dev/null
+++ b/pkg/front_end/test/fasta/util/parser_ast_test.dart
@@ -0,0 +1,467 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:front_end/src/fasta/util/parser_ast.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
+
+late Uri base;
+
+void main(List<String> args) {
+  File script = new File.fromUri(Platform.script);
+  base = script.parent.uri;
+
+  testTopLevelStuff();
+  testClassStuff();
+  testMixinStuff();
+
+  if (!args.contains("--fast")) {
+    canParseTopLevelIshOfAllFrontendFiles();
+  }
+}
+
+void canParseTopLevelIshOfAllFrontendFiles() {
+  Directory directory = new Directory.fromUri(base.resolve("../../../"));
+  int processed = 0;
+  int errors = 0;
+  for (FileSystemEntity entry in directory.listSync(recursive: true)) {
+    if (entry is File) {
+      if (!entry.path.endsWith(".dart")) continue;
+      try {
+        processed++;
+        List<int> data = entry.readAsBytesSync();
+        CompilationUnitEnd ast = getAST(data,
+            includeBody: true,
+            includeComments: true,
+            enableExtensionMethods: true,
+            enableNonNullable: false);
+        splitIntoChunks(ast, data);
+        for (ParserAstNode child in ast.children!) {
+          if (child.isClass()) {
+            splitIntoChunks(
+                child.asClass().getClassOrMixinOrExtensionBody(), data);
+          } else if (child.isMixinDeclaration()) {
+            splitIntoChunks(
+                child.asMixinDeclaration().getClassOrMixinOrExtensionBody(),
+                data);
+          }
+        }
+      } catch (e, st) {
+        print("Failure on $entry:\n$e\n\n$st\n\n--------------\n\n");
+        errors++;
+      }
+    }
+  }
+  print("Processed $processed files in $directory. "
+      "Encountered $errors errors.");
+}
+
+void testTopLevelStuff() {
+  File file = new File.fromUri(
+      base.resolve("parser_ast_test_data/top_level_stuff.txt"));
+  List<int> data = file.readAsBytesSync();
+  CompilationUnitEnd ast = getAST(data,
+      includeBody: true,
+      includeComments: true,
+      enableExtensionMethods: true,
+      enableNonNullable: false);
+  expect(2, ast.getImports().length);
+  expect(2, ast.getExports().length);
+
+  List<String> foundChunks = splitIntoChunks(ast, data);
+  expect(22, foundChunks.length);
+  expect("library top_level_stuff;", foundChunks[0]);
+  expect('import "top_level_stuff_helper.dart";', foundChunks[1]);
+  expect('export "top_level_stuff_helper.dart";', foundChunks[2]);
+  expect(
+      'import "top_level_stuff_helper.dart" show a, b, '
+      'c hide d, e, f show foo;',
+      foundChunks[3]);
+  expect(
+      'export "top_level_stuff_helper.dart" show a, b, '
+      'c hide d, e, f show foo;',
+      foundChunks[4]);
+  expect("part 'top_level_stuff_helper.dart';", foundChunks[5]);
+  expect('@metadataOneOnThisOne("bla")\n', foundChunks[6]);
+  expect("@metadataTwoOnThisOne\n", foundChunks[7]);
+  expect("""void toplevelMethod() {
+  // no content
+}""", foundChunks[8]);
+  expect("""List<E> anotherTopLevelMethod<E>() {
+  return null;
+}""", foundChunks[9]);
+  expect("enum FooEnum { A, B, Bla }", foundChunks[10]);
+  expect("""class FooClass {
+  // no content.
+}""", foundChunks[11]);
+  expect("""mixin FooMixin {
+  // no content.
+}""", foundChunks[12]);
+  expect("""class A<T> {
+  // no content.
+}""", foundChunks[13]);
+  expect("typedef B = Function();", foundChunks[14]);
+  expect("""mixin C<T> on A<T> {
+  // no content.
+}""", foundChunks[15]);
+  expect("""extension D<T> on A<T> {
+  // no content.
+}""", foundChunks[16]);
+  expect("class E = A with FooClass;", foundChunks[17]);
+  expect("int field1;", foundChunks[18]);
+  expect("int field2, field3;", foundChunks[19]);
+  expect("int field4 = 42;", foundChunks[20]);
+  expect("@AnnotationAtEOF", foundChunks[21]);
+
+  file = new File.fromUri(
+      base.resolve("parser_ast_test_data/top_level_stuff_helper.txt"));
+  data = file.readAsBytesSync();
+  ast = getAST(data,
+      includeBody: true,
+      includeComments: true,
+      enableExtensionMethods: true,
+      enableNonNullable: false);
+  foundChunks = splitIntoChunks(ast, data);
+  expect(1, foundChunks.length);
+  expect("part of 'top_level_stuff.txt';", foundChunks[0]);
+
+  file =
+      new File.fromUri(base.resolve("parser_ast_test_data/script_handle.txt"));
+  data = file.readAsBytesSync();
+  ast = getAST(data,
+      includeBody: true,
+      includeComments: true,
+      enableExtensionMethods: true,
+      enableNonNullable: false);
+  foundChunks = splitIntoChunks(ast, data);
+  expect(1, foundChunks.length);
+  expect("#!/usr/bin/env dart -c", foundChunks[0]);
+}
+
+void testClassStuff() {
+  File file = new File.fromUri(base.resolve("parser_ast_test_data/class.txt"));
+  List<int> data = file.readAsBytesSync();
+  CompilationUnitEnd ast = getAST(data,
+      includeBody: true,
+      includeComments: true,
+      enableExtensionMethods: true,
+      enableNonNullable: false);
+  List<TopLevelDeclarationEnd> classes = ast.getClasses();
+  expect(2, classes.length);
+
+  TopLevelDeclarationEnd decl = classes[0];
+  ClassDeclarationEnd cls = decl.asClass();
+  expect("Foo", decl.getIdentifier().token.lexeme);
+  ClassExtendsHandle extendsDecl = cls.getClassExtends();
+  expect("extends", extendsDecl.extendsKeyword?.lexeme);
+  ImplementsHandle implementsDecl = cls.getClassImplements();
+  expect("implements", implementsDecl.implementsKeyword?.lexeme);
+  ClassWithClauseHandle? withClauseDecl = cls.getClassWithClause();
+  expect(null, withClauseDecl);
+  List<MemberEnd> members = cls.getClassOrMixinOrExtensionBody().getMembers();
+  expect(5, members.length);
+  expect(members[0].isClassConstructor(), true);
+  expect(members[1].isClassFactoryMethod(), true);
+  expect(members[2].isClassMethod(), true);
+  expect(members[3].isClassMethod(), true);
+  expect(members[4].isClassFields(), true);
+
+  List<String> chunks =
+      splitIntoChunks(cls.getClassOrMixinOrExtensionBody(), data);
+  expect(5, chunks.length);
+  expect("""Foo() {
+    // Constructor
+  }""", chunks[0]);
+  expect("factory Foo.factory() => Foo();", chunks[1]);
+  expect("""void method() {
+    // instance method.
+  }""", chunks[2]);
+  expect("""static void staticMethod() {
+    // static method.
+  }""", chunks[3]);
+  expect("int field1, field2 = 42;", chunks[4]);
+
+  chunks = processItem(
+      members[0].getClassConstructor().getBlockFunctionBody()!, data);
+  expect(1, chunks.length);
+  expect("""{
+    // Constructor
+  }""", chunks[0]);
+  chunks =
+      processItem(members[2].getClassMethod().getBlockFunctionBody()!, data);
+  expect(1, chunks.length);
+  expect("""{
+    // instance method.
+  }""", chunks[0]);
+  chunks =
+      processItem(members[3].getClassMethod().getBlockFunctionBody()!, data);
+  expect(1, chunks.length);
+  expect("""{
+    // static method.
+  }""", chunks[0]);
+
+  // TODO: Move (something like) this into the check-all-files-thing.
+  for (MemberEnd member in cls.getClassOrMixinOrExtensionBody().getMembers()) {
+    if (member.isClassConstructor()) continue;
+    if (member.isClassFactoryMethod()) continue;
+    if (member.isClassFields()) continue;
+    if (member.isClassMethod()) continue;
+    throw "$member --- ${member.children}";
+  }
+
+  decl = classes[1];
+  cls = decl.asClass();
+  expect("Foo2", decl.getIdentifier().token.lexeme);
+  extendsDecl = cls.getClassExtends();
+  expect(null, extendsDecl.extendsKeyword?.lexeme);
+  implementsDecl = cls.getClassImplements();
+  expect(null, implementsDecl.implementsKeyword?.lexeme);
+  withClauseDecl = cls.getClassWithClause();
+  expect("with", withClauseDecl!.withKeyword.lexeme);
+  members = cls.getClassOrMixinOrExtensionBody().getMembers();
+  expect(0, members.length);
+}
+
+void testMixinStuff() {
+  File file = new File.fromUri(base.resolve("parser_ast_test_data/mixin.txt"));
+  List<int> data = file.readAsBytesSync();
+  CompilationUnitEnd ast = getAST(data,
+      includeBody: true,
+      includeComments: true,
+      enableExtensionMethods: true,
+      enableNonNullable: false);
+  List<TopLevelDeclarationEnd> mixins = ast.getMixinDeclarations();
+  expect(mixins.length, 1);
+
+  TopLevelDeclarationEnd decl = mixins[0];
+  MixinDeclarationEnd mxn = decl.asMixinDeclaration();
+  expect("B", decl.getIdentifier().token.lexeme);
+
+  List<MemberEnd> members = mxn.getClassOrMixinOrExtensionBody().getMembers();
+  expect(4, members.length);
+  expect(members[0].isMixinFields(), true);
+  expect(members[1].isMixinMethod(), true);
+  expect(members[2].isMixinFactoryMethod(), true);
+  expect(members[3].isMixinConstructor(), true);
+
+  List<String> chunks =
+      splitIntoChunks(mxn.getClassOrMixinOrExtensionBody(), data);
+  expect(4, chunks.length);
+  expect("static int staticField = 0;", chunks[0]);
+  expect("""void foo() {
+    // empty
+  }""", chunks[1]);
+  expect("""factory B() {
+    // empty
+  }""", chunks[2]);
+  expect("""B.foo() {
+    // empty
+  }""", chunks[3]);
+}
+
+void expect<E>(E expect, E actual) {
+  if (expect != actual) throw "Expected '$expect' but got '$actual'";
+}
+
+List<String> splitIntoChunks(ParserAstNode ast, List<int> data) {
+  List<String> foundChunks = [];
+  for (ParserAstNode child in ast.children!) {
+    foundChunks.addAll(processItem(child, data));
+  }
+  return foundChunks;
+}
+
+List<String> processItem(ParserAstNode item, List<int> data) {
+  if (item.isClass()) {
+    ClassDeclarationEnd cls = item.asClass();
+    return [
+      getCutContent(data, cls.beginToken.offset,
+          cls.endToken.offset + cls.endToken.length)
+    ];
+  } else if (item.isMetadata()) {
+    MetadataStarEnd metadataStar = item.asMetadata();
+    List<MetadataEnd> entries = metadataStar.getMetadataEntries();
+    if (entries.isNotEmpty) {
+      List<String> chunks = [];
+      for (MetadataEnd metadata in entries) {
+        chunks.add(getCutContent(
+            data, metadata.beginToken.offset, metadata.endToken.offset));
+      }
+      return chunks;
+    }
+    return const [];
+  } else if (item.isImport()) {
+    ImportEnd import = item.asImport();
+    return [
+      getCutContent(data, import.importKeyword.offset,
+          import.semicolon!.offset + import.semicolon!.length)
+    ];
+  } else if (item.isExport()) {
+    ExportEnd export = item.asExport();
+    return [
+      getCutContent(data, export.exportKeyword.offset,
+          export.semicolon.offset + export.semicolon.length)
+    ];
+  } else if (item.isLibraryName()) {
+    LibraryNameEnd name = item.asLibraryName();
+    return [
+      getCutContent(data, name.libraryKeyword.offset,
+          name.semicolon.offset + name.semicolon.length)
+    ];
+  } else if (item.isPart()) {
+    PartEnd part = item.asPart();
+    return [
+      getCutContent(data, part.partKeyword.offset,
+          part.semicolon.offset + part.semicolon.length)
+    ];
+  } else if (item.isPartOf()) {
+    PartOfEnd partOf = item.asPartOf();
+    return [
+      getCutContent(data, partOf.partKeyword.offset,
+          partOf.semicolon.offset + partOf.semicolon.length)
+    ];
+  } else if (item.isTopLevelMethod()) {
+    TopLevelMethodEnd method = item.asTopLevelMethod();
+    return [
+      getCutContent(data, method.beginToken.offset,
+          method.endToken.offset + method.endToken.length)
+    ];
+  } else if (item.isTopLevelFields()) {
+    TopLevelFieldsEnd fields = item.asTopLevelFields();
+    return [
+      getCutContent(data, fields.beginToken.offset,
+          fields.endToken.offset + fields.endToken.length)
+    ];
+  } else if (item.isEnum()) {
+    EnumEnd declaration = item.asEnum();
+    return [
+      getCutContent(
+          data,
+          declaration.enumKeyword.offset,
+          declaration.leftBrace.endGroup!.offset +
+              declaration.leftBrace.endGroup!.length)
+    ];
+  } else if (item.isMixinDeclaration()) {
+    MixinDeclarationEnd mixinDecl = item.asMixinDeclaration();
+    return [
+      getCutContent(data, mixinDecl.mixinKeyword.offset,
+          mixinDecl.endToken.offset + mixinDecl.endToken.length)
+    ];
+  } else if (item.isNamedMixinDeclaration()) {
+    NamedMixinApplicationEnd namedMixinDecl = item.asNamedMixinDeclaration();
+    return [
+      getCutContent(data, namedMixinDecl.begin.offset,
+          namedMixinDecl.endToken.offset + namedMixinDecl.endToken.length)
+    ];
+  } else if (item.isTypedef()) {
+    TypedefEnd typedefDecl = item.asTypedef();
+    return [
+      getCutContent(data, typedefDecl.typedefKeyword.offset,
+          typedefDecl.endToken.offset + typedefDecl.endToken.length)
+    ];
+  } else if (item.isExtension()) {
+    ExtensionDeclarationEnd extensionDecl = item.asExtension();
+    return [
+      getCutContent(data, extensionDecl.extensionKeyword.offset,
+          extensionDecl.endToken.offset + extensionDecl.endToken.length)
+    ];
+  } else if (item.isScript()) {
+    ScriptHandle script = item.asScript();
+    return [
+      getCutContent(
+          data, script.token.offset, script.token.offset + script.token.length)
+    ];
+  } else if (item is MemberEnd) {
+    if (item.isClassConstructor()) {
+      ClassConstructorEnd decl = item.getClassConstructor();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else if (item.isClassFactoryMethod()) {
+      ClassFactoryMethodEnd decl = item.getClassFactoryMethod();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else if (item.isClassMethod()) {
+      ClassMethodEnd decl = item.getClassMethod();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else if (item.isClassFields()) {
+      ClassFieldsEnd decl = item.getClassFields();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else if (item.isClassFields()) {
+      ClassFieldsEnd decl = item.getClassFields();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else if (item.isMixinFields()) {
+      MixinFieldsEnd decl = item.getMixinFields();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else if (item.isMixinMethod()) {
+      MixinMethodEnd decl = item.getMixinMethod();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else if (item.isMixinFactoryMethod()) {
+      MixinFactoryMethodEnd decl = item.getMixinFactoryMethod();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else if (item.isMixinConstructor()) {
+      MixinConstructorEnd decl = item.getMixinConstructor();
+      return [
+        getCutContent(data, decl.beginToken.offset,
+            decl.endToken.offset + decl.endToken.length)
+      ];
+    } else {
+      if (item.type == ParserAstType.BEGIN) return const [];
+      if (item.type == ParserAstType.HANDLE) return const [];
+      if (item.isClassRecoverableError()) return const [];
+      if (item.isRecoverableError()) return const [];
+      if (item.isRecoverImport()) return const [];
+      throw "Unknown: $item --- ${item.children}";
+    }
+  } else if (item.isFunctionBody()) {
+    BlockFunctionBodyEnd decl = item.asFunctionBody();
+    return [
+      getCutContent(data, decl.beginToken.offset,
+          decl.endToken.offset + decl.endToken.length)
+    ];
+  } else {
+    if (item.type == ParserAstType.BEGIN) return const [];
+    if (item.type == ParserAstType.HANDLE) return const [];
+    if (item.isInvalidTopLevelDeclaration()) return const [];
+    if (item.isRecoverableError()) return const [];
+    if (item.isRecoverImport()) return const [];
+
+    throw "Unknown: $item --- ${item.children}";
+  }
+}
+
+List<int>? _contentCache;
+String? _contentCacheString;
+String getCutContent(List<int> content, int from, int to) {
+  if (identical(content, _contentCache)) {
+    // cache up to date.
+  } else {
+    _contentCache = content;
+    _contentCacheString = utf8.decode(content);
+  }
+  return _contentCacheString!.substring(from, to);
+}
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/class.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/class.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/class.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/class.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/mixin.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/mixin.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/mixin.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/mixin.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/script_handle.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/script_handle.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/script_handle.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/script_handle.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff_helper.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff_helper.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff_helper.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff_helper.txt
diff --git a/pkg/front_end/test/fasta/weak_suite.dart b/pkg/front_end/test/fasta/weak_suite.dart
index 384baab..52fd4d8 100644
--- a/pkg/front_end/test/fasta/weak_suite.dart
+++ b/pkg/front_end/test/fasta/weak_suite.dart
@@ -2,15 +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.md file.
 
-// @dart = 2.9
-
 library fasta.test.weak_test;
 
 import 'testing/suite.dart';
 
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
-  environment[ENABLE_FULL_COMPILE] = "";
+  environment[COMPILATION_MODE] = CompileMode.full.name;
   return FastaContext.create(suite, environment);
 }
 
diff --git a/pkg/front_end/test/ffi_test.dart b/pkg/front_end/test/ffi_test.dart
index 02cc7fbf..79f7ba7 100644
--- a/pkg/front_end/test/ffi_test.dart
+++ b/pkg/front_end/test/ffi_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
-
 import 'package:expect/expect.dart';
 
 void main() {
diff --git a/pkg/front_end/test/flutter_gallery_leak_tester.dart b/pkg/front_end/test/flutter_gallery_leak_tester.dart
index 973961d..84fe990 100644
--- a/pkg/front_end/test/flutter_gallery_leak_tester.dart
+++ b/pkg/front_end/test/flutter_gallery_leak_tester.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 'dart:async';
 import 'dart:convert';
 import 'dart:io';
@@ -11,7 +9,7 @@
 
 import "vm_service_heap_helper.dart" as helper;
 
-Completer completer;
+late Completer completer;
 
 Set<String> files = {};
 
@@ -36,7 +34,7 @@
 
   bool quicker = false;
   bool alternativeInvalidation = false;
-  String rootPath;
+  String? rootPath;
 
   for (String arg in args) {
     if (arg == "--quicker") {
diff --git a/pkg/front_end/test/generated_files_up_to_date_git_test.dart b/pkg/front_end/test/generated_files_up_to_date_git_test.dart
index 5161eef..89665f6 100644
--- a/pkg/front_end/test/generated_files_up_to_date_git_test.dart
+++ b/pkg/front_end/test/generated_files_up_to_date_git_test.dart
@@ -2,15 +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.md file.
 
-// @dart = 2.9
-
 import "dart:io" show File, exitCode;
 
 import "../tool/_fasta/generate_messages.dart" as generateMessages;
 import "../tool/_fasta/generate_experimental_flags.dart"
     as generateExperimentalFlags;
-import "../tool/_fasta/direct_parser_ast_helper_creator.dart"
-    as generateDirectParserAstHelper;
+import "../tool/_fasta/parser_ast_helper_creator.dart"
+    as generateParserAstHelper;
 import "parser_test_listener_creator.dart" as generateParserTestListener;
 import "parser_test_parser_creator.dart" as generateParserTestParser;
 import '../tool/ast_model.dart';
@@ -47,11 +45,10 @@
 }
 
 void directParserAstHelper() {
-  Uri generatedFile =
-      generateDirectParserAstHelper.computeAstHelperUri(repoDir);
-  String generated = generateDirectParserAstHelper.generateAstHelper(repoDir);
+  Uri generatedFile = generateParserAstHelper.computeAstHelperUri(repoDir);
+  String generated = generateParserAstHelper.generateAstHelper(repoDir);
   check(generated, generatedFile,
-      "dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart");
+      "dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart");
 }
 
 Future<void> astEquivalence(AstModel astModel) async {
diff --git a/pkg/front_end/test/hot_reload_e2e_test.dart b/pkg/front_end/test/hot_reload_e2e_test.dart
index 9a2a0b9..69069c9 100644
--- a/pkg/front_end/test/hot_reload_e2e_test.dart
+++ b/pkg/front_end/test/hot_reload_e2e_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
-
 /// Integration test that runs the incremental compiler, runs the compiled
 /// program, incrementally rebuild portions of the app, and triggers a hot
 /// reload on the running program.
@@ -45,12 +43,12 @@
 import 'tool/reload.dart' show RemoteVm;
 
 abstract class TestCase {
-  IncrementalKernelGenerator compiler;
-  MemoryFileSystem fs;
-  Directory outDir;
-  Uri outputUri;
-  List<Future<String>> lines;
-  Future programIsDone;
+  late IncrementalKernelGenerator compiler;
+  late MemoryFileSystem fs;
+  late Directory outDir;
+  late Uri outputUri;
+  List<Future<String>> lines = const [];
+  late Future programIsDone;
 
   String get name;
 
@@ -83,14 +81,14 @@
 
   Future<void> tearDown() async {
     outDir.deleteSync(recursive: true);
-    lines = null;
+    lines = const [];
   }
 
   Future<int> computeVmPort() async {
     var portLine = await lines[0];
     Expect.isTrue(observatoryPortRegExp.hasMatch(portLine));
     var match = observatoryPortRegExp.firstMatch(portLine);
-    return int.parse(match.group(1));
+    return int.parse(match!.group(1)!);
   }
 
   /// Request vm to resume execution
@@ -318,8 +316,9 @@
   compiler.invalidate(Uri.parse("org-dartlang-test:///a.dart"));
   compiler.invalidate(Uri.parse("org-dartlang-test:///b.dart"));
   compiler.invalidate(Uri.parse("org-dartlang-test:///c.dart"));
-  var component = await compiler.computeDelta();
-  if (component != null && !component.libraries.isEmpty) {
+  var compilerResult = await compiler.computeDelta();
+  var component = compilerResult.component;
+  if (!component.libraries.isEmpty) {
     await writeProgram(component, outputUri);
     return true;
   }
diff --git a/pkg/front_end/test/id_testing/id_testing_test.dart b/pkg/front_end/test/id_testing/id_testing_test.dart
index 873dc8e..e8f9f5f 100644
--- a/pkg/front_end/test/id_testing/id_testing_test.dart
+++ b/pkg/front_end/test/id_testing/id_testing_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
-
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
     show DataInterpreter, StringDataInterpreter, runTests;
@@ -47,7 +45,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new IdTestingDataExtractor(compilerResult, actualMap));
   }
 
@@ -57,7 +55,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new IdTestingDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
@@ -67,7 +65,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new IdTestingDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -106,7 +104,7 @@
 
   String computeMemberName(Member member) {
     if (member.enclosingClass != null) {
-      return '${computeClassName(member.enclosingClass)}.'
+      return '${computeClassName(member.enclosingClass!)}.'
           '${getMemberName(member)}';
     }
     return getMemberName(member);
@@ -118,7 +116,7 @@
   }
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is FunctionDeclaration) {
       return '${computeMemberName(getEnclosingMember(node))}.'
           '${node.variable.name}';
diff --git a/pkg/front_end/test/id_tests/assigned_variables_test.dart b/pkg/front_end/test/id_tests/assigned_variables_test.dart
index 1b325de..0f833c1 100644
--- a/pkg/front_end/test/id_tests/assigned_variables_test.dart
+++ b/pkg/front_end/test/id_tests/assigned_variables_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
-
 import 'dart:io' show Directory, Platform;
 
 import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
@@ -46,12 +44,12 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<_Data>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
-    AssignedVariablesForTesting<TreeNode, VariableDeclaration>
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
+    AssignedVariablesForTesting<TreeNode, VariableDeclaration>?
         assignedVariables = memberBuilder
-            .dataForTesting.inferenceData.flowAnalysisResult.assignedVariables;
+            .dataForTesting!.inferenceData.flowAnalysisResult.assignedVariables;
     if (assignedVariables == null) return;
     member.accept(new AssignedVariablesDataExtractor(
         compilerResult, actualMap, assignedVariables));
@@ -66,7 +64,7 @@
   AssignedVariablesDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<_Data>> actualMap, this._assignedVariables)
       : _sourceLoaderDataForTesting =
-            compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
         super(compilerResult, actualMap);
 
   @override
@@ -80,10 +78,10 @@
   }
 
   Set<String> _convertVars(Iterable<VariableDeclaration> x) =>
-      x.map((e) => e.name).toSet();
+      x.map((e) => e.name!).toSet();
 
   @override
-  _Data computeNodeValue(Id id, TreeNode node) {
+  _Data? computeNodeValue(Id id, TreeNode node) {
     switch (id.kind) {
       case IdKind.iterator:
       case IdKind.current:
@@ -106,7 +104,7 @@
   const _AssignedVariablesDataInterpreter();
 
   @override
-  String getText(_Data actualData, [String indentation]) {
+  String getText(_Data actualData, [String? indentation]) {
     var parts = <String>[];
     if (actualData.declared.isNotEmpty) {
       parts.add('declared=${_setToString(actualData.declared)}');
@@ -128,7 +126,7 @@
   }
 
   @override
-  String isAsExpected(_Data actualData, String expectedData) {
+  String? isAsExpected(_Data actualData, String? expectedData) {
     var actualDataText = getText(actualData);
     if (actualDataText == expectedData) {
       return null;
diff --git a/pkg/front_end/test/id_tests/constant_test.dart b/pkg/front_end/test/id_tests/constant_test.dart
index 54eccdb..bcee3af 100644
--- a/pkg/front_end/test/id_tests/constant_test.dart
+++ b/pkg/front_end/test/id_tests/constant_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -41,7 +39,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new ConstantsDataExtractor(compilerResult, actualMap));
   }
 
@@ -51,7 +49,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new ConstantsDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
@@ -75,7 +73,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is ConstantExpression) {
       return constantToText(node.constant);
     }
diff --git a/pkg/front_end/test/id_tests/definite_assignment_test.dart b/pkg/front_end/test/id_tests/definite_assignment_test.dart
index 74afe1e..536f1e1 100644
--- a/pkg/front_end/test/id_tests/definite_assignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_assignment_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -41,11 +39,11 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new DefiniteAssignmentDataExtractor(compilerResult, actualMap,
-        memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
+        memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 
   /// Errors are supported for testing erroneous code. The reported errors are
@@ -61,11 +59,11 @@
   DefiniteAssignmentDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<String>> actualMap, this._flowResult)
       : _sourceLoaderDataForTesting =
-            compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
         super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
       TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node);
       if (_flowResult.potentiallyUnassignedNodes.contains(alias)) {
diff --git a/pkg/front_end/test/id_tests/definite_unassignment_test.dart b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
index 30d0fb5..67ce244 100644
--- a/pkg/front_end/test/id_tests/definite_unassignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_unassignment_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -41,13 +39,13 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new DefiniteUnassignmentDataExtractor(
         compilerResult,
         actualMap,
-        memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
+        memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 
   /// Errors are supported for testing erroneous code. The reported errors are
@@ -63,11 +61,11 @@
   DefiniteUnassignmentDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<String>> actualMap, this._flowResult)
       : _sourceLoaderDataForTesting =
-            compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
         super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
       TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node);
       if (_flowResult.definitelyUnassignedNodes.contains(alias)) {
diff --git a/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart b/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart
index 6c5aedc..b4d3787 100644
--- a/pkg/front_end/test/id_tests/inferred_type_arguments_test.dart
+++ b/pkg/front_end/test/id_tests/inferred_type_arguments_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -45,12 +43,12 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<List<DartType>>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new InferredTypeArgumentDataExtractor(
         compilerResult,
-        memberBuilder.dataForTesting.inferenceData.typeInferenceResult,
+        memberBuilder.dataForTesting!.inferenceData.typeInferenceResult,
         actualMap));
   }
 }
@@ -64,7 +62,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  List<DartType> computeNodeValue(Id id, TreeNode node) {
+  List<DartType>? computeNodeValue(Id id, TreeNode node) {
     if (node is Arguments ||
         node is ListLiteral ||
         node is SetLiteral ||
@@ -80,7 +78,7 @@
   const _InferredTypeArgumentsDataInterpreter();
 
   @override
-  String getText(List<DartType> actualData, [String indentation]) {
+  String getText(List<DartType> actualData, [String? indentation]) {
     StringBuffer sb = new StringBuffer();
     if (actualData.isNotEmpty) {
       sb.write('<');
@@ -97,7 +95,7 @@
   }
 
   @override
-  String isAsExpected(List<DartType> actualData, String expectedData) {
+  String? isAsExpected(List<DartType> actualData, String? expectedData) {
     if (getText(actualData) == expectedData) {
       return null;
     } else {
@@ -106,6 +104,6 @@
   }
 
   @override
-  bool isEmpty(List<DartType> actualData) =>
+  bool isEmpty(List<DartType>? actualData) =>
       actualData == null || actualData.isEmpty;
 }
diff --git a/pkg/front_end/test/id_tests/inferred_variable_types_test.dart b/pkg/front_end/test/id_tests/inferred_variable_types_test.dart
index 91c4800..7205920 100644
--- a/pkg/front_end/test/id_tests/inferred_variable_types_test.dart
+++ b/pkg/front_end/test/id_tests/inferred_variable_types_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -45,12 +43,12 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<DartType>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new InferredTypeArgumentDataExtractor(
         compilerResult,
-        memberBuilder.dataForTesting.inferenceData.typeInferenceResult,
+        memberBuilder.dataForTesting!.inferenceData.typeInferenceResult,
         actualMap));
   }
 }
@@ -63,7 +61,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  DartType computeNodeValue(Id id, TreeNode node) {
+  DartType? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableDeclaration || node is LocalFunction) {
       return typeInferenceResult.inferredVariableTypes[node];
     }
@@ -76,13 +74,13 @@
   const _InferredVariableTypesDataInterpreter();
 
   @override
-  String getText(DartType actualData, [String indentation]) {
+  String getText(DartType actualData, [String? indentation]) {
     return typeToText(
         actualData, TypeRepresentation.analyzerNonNullableByDefault);
   }
 
   @override
-  String isAsExpected(DartType actualData, String expectedData) {
+  String? isAsExpected(DartType actualData, String? expectedData) {
     if (getText(actualData) == expectedData) {
       return null;
     } else {
@@ -91,5 +89,5 @@
   }
 
   @override
-  bool isEmpty(DartType actualData) => actualData == null;
+  bool isEmpty(DartType? actualData) => actualData == null;
 }
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
index 3d6aba4..78f9bf5 100644
--- a/pkg/front_end/test/id_tests/inheritance_test.dart
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -2,14 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, Platform;
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
-import 'package:front_end/src/fasta/kernel/class_hierarchy_builder.dart';
+import 'package:front_end/src/fasta/kernel/hierarchy/hierarchy_builder.dart';
+import 'package:front_end/src/fasta/kernel/hierarchy/hierarchy_node.dart';
 import 'package:front_end/src/testing/id_extractor.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
@@ -55,7 +54,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new InheritanceDataExtractor(config, compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -66,7 +65,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new InheritanceDataExtractor(config, compilerResult, actualMap)
         .computeForClass(cls);
   }
@@ -92,12 +91,12 @@
       this._config, this._compilerResult, Map<Id, ActualData<String>> actualMap)
       : super(_compilerResult, actualMap);
 
-  ClassHierarchy get _hierarchy => _compilerResult.classHierarchy;
+  ClassHierarchy get _hierarchy => _compilerResult.classHierarchy!;
 
-  CoreTypes get _coreTypes => _compilerResult.coreTypes;
+  CoreTypes get _coreTypes => _compilerResult.coreTypes!;
 
   ClassHierarchyBuilder get _classHierarchyBuilder =>
-      _compilerResult.kernelTargetForTesting.loader.builderHierarchy;
+      _compilerResult.kernelTargetForTesting!.loader.hierarchyBuilder;
 
   @override
   String computeLibraryValue(Id id, Library node) {
@@ -121,18 +120,18 @@
         .map((Member member) => member.name)
         .toSet();
 
-    void addMember(Name name, {bool isSetter}) {
+    void addMember(Name name, {required bool isSetter}) {
       Member member =
-          _hierarchy.getInterfaceMember(node, name, setter: isSetter);
+          _hierarchy.getInterfaceMember(node, name, setter: isSetter)!;
       if (member.enclosingClass == _coreTypes.objectClass) {
         return;
       }
       InterfaceType supertype = _hierarchy.getTypeAsInstanceOf(
           _coreTypes.thisInterfaceType(node, node.enclosingLibrary.nonNullable),
-          member.enclosingClass,
-          node.enclosingLibrary);
+          member.enclosingClass!,
+          node.enclosingLibrary)!;
       Substitution substitution = Substitution.fromInterfaceType(supertype);
-      DartType type;
+      DartType? type;
       if (member is Procedure) {
         if (member.kind == ProcedureKind.Getter) {
           type = substitution.substituteType(member.function.returnType);
@@ -167,14 +166,14 @@
 
       TreeNode nodeWithOffset;
       if (member.enclosingClass == node) {
-        nodeWithOffset = computeTreeNodeWithOffset(member);
+        nodeWithOffset = computeTreeNodeWithOffset(member)!;
       } else {
-        nodeWithOffset = computeTreeNodeWithOffset(node);
+        nodeWithOffset = computeTreeNodeWithOffset(node)!;
       }
 
       registerValue(
-          nodeWithOffset?.location?.file,
-          nodeWithOffset?.fileOffset,
+          nodeWithOffset.location!.file,
+          nodeWithOffset.fileOffset,
           id,
           typeToText(type, TypeRepresentation.analyzerNonNullableByDefault),
           member);
@@ -190,15 +189,14 @@
   }
 
   @override
-  String computeClassValue(Id id, Class node) {
+  String? computeClassValue(Id id, Class node) {
     if (node.isAnonymousMixin) return null;
     if (_config.marker == cfeMarker) {
       List<String> supertypes = <String>[];
       for (Class superclass in computeAllSuperclasses(node)) {
-        Supertype supertype = _hierarchy.getClassAsInstanceOf(node, superclass);
+        Supertype supertype =
+            _hierarchy.getClassAsInstanceOf(node, superclass)!;
         if (supertype.classNode.isAnonymousMixin) continue;
-        assert(
-            supertype != null, "No instance of $superclass found for $node.");
         supertypes.add(supertypeToText(
             supertype, TypeRepresentation.analyzerNonNullableByDefault));
       }
diff --git a/pkg/front_end/test/id_tests/nullability_test.dart b/pkg/front_end/test/id_tests/nullability_test.dart
index d77f169..0ffa7f2 100644
--- a/pkg/front_end/test/id_tests/nullability_test.dart
+++ b/pkg/front_end/test/id_tests/nullability_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -36,7 +34,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new NullabilityDataExtractor(compilerResult, actualMap));
   }
 }
@@ -47,10 +45,10 @@
       : super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet && node.promotedType != null) {
       if (node.variable.type.nullability != Nullability.nonNullable &&
-          node.promotedType.nullability == Nullability.nonNullable) {
+          node.promotedType!.nullability == Nullability.nonNullable) {
         return 'nonNullable';
       }
     }
diff --git a/pkg/front_end/test/id_tests/reachability_test.dart b/pkg/front_end/test/id_tests/reachability_test.dart
index d486fde..1362a08 100644
--- a/pkg/front_end/test/id_tests/reachability_test.dart
+++ b/pkg/front_end/test/id_tests/reachability_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -43,11 +41,11 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new ReachabilityDataExtractor(compilerResult, actualMap,
-        memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
+        memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 
   /// Errors are supported for testing erroneous code. The reported errors are
@@ -66,15 +64,15 @@
       Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap,
       this._flowResult)
       : _sourceLoaderDataForTesting =
-            compilerResult.kernelTargetForTesting.loader.dataForTesting,
+            compilerResult.kernelTargetForTesting!.loader.dataForTesting!,
         super(compilerResult, actualMap);
 
   @override
-  Set<_ReachabilityAssertion> computeMemberValue(Id id, Member member) {
+  Set<_ReachabilityAssertion>? computeMemberValue(Id id, Member member) {
     Set<_ReachabilityAssertion> result = {};
     if (member.function != null) {
       TreeNode alias =
-          _sourceLoaderDataForTesting.toOriginal(member.function.body);
+          _sourceLoaderDataForTesting.toOriginal(member.function!.body!);
       if (_flowResult.functionBodiesThatDontComplete.contains(alias)) {
         result.add(_ReachabilityAssertion.doesNotComplete);
       }
@@ -83,7 +81,7 @@
   }
 
   @override
-  Set<_ReachabilityAssertion> computeNodeValue(Id id, TreeNode node) {
+  Set<_ReachabilityAssertion>? computeNodeValue(Id id, TreeNode node) {
     Set<_ReachabilityAssertion> result = {};
     TreeNode alias = _sourceLoaderDataForTesting.toOriginal(node);
     if (node is Expression && node.parent is ExpressionStatement) {
@@ -93,12 +91,12 @@
       // amount of redundancy in the test files.
       assert(_flowResult.unreachableNodes.contains(alias) ==
           _flowResult.unreachableNodes
-              .contains(_sourceLoaderDataForTesting.toOriginal(node.parent)));
+              .contains(_sourceLoaderDataForTesting.toOriginal(node.parent!)));
     } else if (_flowResult.unreachableNodes.contains(alias)) {
       result.add(_ReachabilityAssertion.unreachable);
     }
     if (node is FunctionDeclaration) {
-      Statement body = node.function.body;
+      Statement? body = node.function.body;
       if (body != null &&
           _flowResult.functionBodiesThatDontComplete
               .contains(_sourceLoaderDataForTesting.toOriginal(body))) {
@@ -120,12 +118,12 @@
 
   @override
   String getText(Set<_ReachabilityAssertion> actualData,
-          [String indentation]) =>
+          [String? indentation]) =>
       _sortedRepresentation(_toStrings(actualData));
 
   @override
-  String isAsExpected(
-      Set<_ReachabilityAssertion> actualData, String expectedData) {
+  String? isAsExpected(
+      Set<_ReachabilityAssertion> actualData, String? expectedData) {
     var actualStrings = _toStrings(actualData);
     var actualSorted = _sortedRepresentation(actualStrings);
     var expectedSorted = _sortedRepresentation(expectedData?.split(','));
@@ -139,7 +137,7 @@
   @override
   bool isEmpty(Set<_ReachabilityAssertion> actualData) => actualData.isEmpty;
 
-  String _sortedRepresentation(Iterable<String> values) {
+  String _sortedRepresentation(Iterable<String>? values) {
     var list = values == null || values.isEmpty ? ['none'] : values.toList();
     list.sort();
     return list.join(',');
diff --git a/pkg/front_end/test/id_tests/type_promotion_test.dart b/pkg/front_end/test/id_tests/type_promotion_test.dart
index fed4245..6aae1e8 100644
--- a/pkg/front_end/test/id_tests/type_promotion_test.dart
+++ b/pkg/front_end/test/id_tests/type_promotion_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -40,7 +38,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<DartType>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new TypePromotionDataExtractor(compilerResult, actualMap));
   }
 }
@@ -51,7 +49,7 @@
       : super(compilerResult, actualMap);
 
   @override
-  DartType computeNodeValue(Id id, TreeNode node) {
+  DartType? computeNodeValue(Id id, TreeNode node) {
     if (node is VariableGet) {
       return node.promotedType;
     }
@@ -63,11 +61,11 @@
   const _TypePromotionDataInterpreter();
 
   @override
-  String getText(DartType actualData, [String indentation]) =>
+  String getText(DartType actualData, [String? indentation]) =>
       typeToText(actualData, TypeRepresentation.analyzerNonNullableByDefault);
 
   @override
-  String isAsExpected(DartType actualData, String expectedData) {
+  String? isAsExpected(DartType actualData, String? expectedData) {
     if (getText(actualData) == expectedData) {
       return null;
     } else {
@@ -76,5 +74,5 @@
   }
 
   @override
-  bool isEmpty(DartType actualData) => actualData == null;
+  bool isEmpty(DartType? actualData) => actualData == null;
 }
diff --git a/pkg/front_end/test/id_tests/why_not_promoted_test.dart b/pkg/front_end/test/id_tests/why_not_promoted_test.dart
index ed82ac1..ca26b01 100644
--- a/pkg/front_end/test/id_tests/why_not_promoted_test.dart
+++ b/pkg/front_end/test/id_tests/why_not_promoted_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
-
 import 'dart:io' show Directory, Platform;
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
@@ -48,11 +46,11 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member);
+        lookupMemberBuilder(compilerResult, member) as MemberBuilderImpl;
     member.accept(new WhyNotPromotedDataExtractor(compilerResult, actualMap,
-        memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
+        memberBuilder.dataForTesting!.inferenceData.flowAnalysisResult));
   }
 }
 
@@ -64,8 +62,8 @@
       : super(compilerResult, actualMap);
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
-    String nonPromotionReason = _flowResult.nonPromotionReasons[node];
+  String? computeNodeValue(Id id, TreeNode node) {
+    String? nonPromotionReason = _flowResult.nonPromotionReasons[node];
     if (nonPromotionReason != null) {
       return 'notPromoted($nonPromotionReason)';
     }
@@ -77,10 +75,10 @@
   const _WhyNotPromotedDataInterpreter();
 
   @override
-  String getText(String actualData, [String indentation]) => actualData;
+  String getText(String actualData, [String? indentation]) => actualData;
 
   @override
-  String isAsExpected(String actualData, String expectedData) {
+  String? isAsExpected(String actualData, String? expectedData) {
     if (actualData == expectedData) {
       return null;
     } else {
@@ -89,5 +87,5 @@
   }
 
   @override
-  bool isEmpty(String actualData) => actualData == null;
+  bool isEmpty(String? actualData) => actualData == null;
 }
diff --git a/pkg/front_end/test/incremental_bulk_compiler_full.dart b/pkg/front_end/test/incremental_bulk_compiler_full.dart
index 61b3899..9edfd97 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_full.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_full.dart
@@ -2,22 +2,17 @@
 // 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:expect/expect.dart' show Expect;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 
 import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
-    show IncrementalKernelGenerator;
+    show IncrementalCompilerResult, IncrementalKernelGenerator;
 
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
 
-import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler;
-
 import 'package:kernel/kernel.dart' show Component;
 
 import 'package:kernel/text/ast_to_text.dart'
@@ -49,7 +44,7 @@
     return result;
   }
 
-  IncrementalCompiler compiler;
+  IncrementalKernelGenerator? compiler;
 }
 
 CompilerOptions getOptions() {
@@ -78,25 +73,27 @@
 
     // "One shot compile"
     bool oneShotFailed = false;
-    List<int> oneShotSerialized;
+    late List<int> oneShotSerialized;
     try {
-      IncrementalCompiler compiler =
+      IncrementalKernelGenerator compiler =
           new IncrementalKernelGenerator(getOptions(), uri);
-      oneShotSerialized = util.postProcess(await compiler.computeDelta());
+      oneShotSerialized =
+          util.postProcess((await compiler.computeDelta()).component);
     } catch (e) {
       oneShotFailed = true;
     }
 
     // Bulk
     bool bulkFailed = false;
-    List<int> bulkSerialized;
+    late List<int> bulkSerialized;
     try {
       globalDebuggingNames = new NameSystem();
       if (context.compiler == null) {
         context.compiler = new IncrementalKernelGenerator(getOptions(), uri);
       }
-      Component bulkCompiledComponent = await context.compiler
+      IncrementalCompilerResult compilerResult = await context.compiler!
           .computeDelta(entryPoints: [uri], fullComponent: true);
+      Component bulkCompiledComponent = compilerResult.component;
       bulkSerialized = util.postProcess(bulkCompiledComponent);
     } catch (e) {
       bulkFailed = true;
@@ -105,14 +102,15 @@
 
     // Compile again - the serialized output should be the same.
     bool bulk2Failed = false;
-    List<int> bulkSerialized2;
+    late List<int> bulkSerialized2;
     try {
       globalDebuggingNames = new NameSystem();
       if (context.compiler == null) {
         context.compiler = new IncrementalKernelGenerator(getOptions(), uri);
       }
-      Component bulkCompiledComponent = await context.compiler
+      IncrementalCompilerResult compilerResult = await context.compiler!
           .computeDelta(entryPoints: [uri], fullComponent: true);
+      Component bulkCompiledComponent = compilerResult.component;
       bulkSerialized2 = util.postProcess(bulkCompiledComponent);
     } catch (e) {
       bulk2Failed = true;
diff --git a/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart b/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
index 03993a7..b60f41c 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_smoke_suite.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:testing/testing.dart' show Chain, runMe;
 
 import 'incremental_bulk_compiler_full.dart' show Context;
diff --git a/pkg/front_end/test/incremental_compiler_leak_tester.dart b/pkg/front_end/test/incremental_compiler_leak_tester.dart
index a9f3b81..d05460b 100644
--- a/pkg/front_end/test/incremental_compiler_leak_tester.dart
+++ b/pkg/front_end/test/incremental_compiler_leak_tester.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.md file.
 
-// @dart = 2.9
-
 import 'dart:async';
 import 'dart:io';
 
@@ -29,12 +27,12 @@
   @override
   Future<void> run() async {
     vmService.VM vm = await serviceClient.getVM();
-    if (vm.isolates.length != 1) {
-      throw "Expected 1 isolate, got ${vm.isolates.length}";
+    if (vm.isolates!.length != 1) {
+      throw "Expected 1 isolate, got ${vm.isolates!.length}";
     }
-    vmService.IsolateRef isolateRef = vm.isolates.single;
-    await waitUntilIsolateIsRunnable(isolateRef.id);
-    await serviceClient.resume(isolateRef.id);
+    vmService.IsolateRef isolateRef = vm.isolates!.single;
+    await waitUntilIsolateIsRunnable(isolateRef.id!);
+    await serviceClient.resume(isolateRef.id!);
 
     Map<vmService.ClassRef, List<int>> instanceCounts =
         new Map<vmService.ClassRef, List<int>>();
@@ -76,12 +74,12 @@
       Map<vmService.ClassRef, vmService.Class> classInfo) {
     bool foundLeak = false;
     for (vmService.ClassRef c in instanceCounts.keys) {
-      List<int> listOfInstanceCounts = instanceCounts[c];
+      List<int> listOfInstanceCounts = instanceCounts[c]!;
 
       // Ignore VM internal stuff like "PatchClass", "PcDescriptors" etc.
       // (they don't have a url).
-      vmService.Class classDetails = classInfo[c];
-      String uriString = classDetails.location?.script?.uri;
+      vmService.Class classDetails = classInfo[c]!;
+      String? uriString = classDetails.location?.script?.uri;
       if (uriString == null) continue;
 
       // For now ignore anything not in package:kernel or package:front_end.
@@ -136,30 +134,30 @@
     try {
       while (true) {
         if (shouldBail(iterationNumber)) break;
-        if (!await waitUntilPaused(isolateRef.id)) break;
+        if (!await waitUntilPaused(isolateRef.id!)) break;
         print("\n\n====================\n\nIteration #$iterationNumber");
         iterationNumber++;
         vmService.AllocationProfile allocationProfile =
-            await forceGC(isolateRef.id);
-        for (vmService.ClassHeapStats member in allocationProfile.members) {
+            await forceGC(isolateRef.id!);
+        for (vmService.ClassHeapStats member in allocationProfile.members!) {
           if (!classInfo.containsKey(member.classRef)) {
-            vmService.Class c = await serviceClient.getObject(
-                isolateRef.id, member.classRef.id);
-            classInfo[member.classRef] = c;
+            vmService.Class c = (await serviceClient.getObject(
+                isolateRef.id!, member.classRef!.id!)) as vmService.Class;
+            classInfo[member.classRef!] = c;
           }
-          List<int> listOfInstanceCounts = instanceCounts[member.classRef];
+          List<int>? listOfInstanceCounts = instanceCounts[member.classRef];
           if (listOfInstanceCounts == null) {
-            listOfInstanceCounts = instanceCounts[member.classRef] = <int>[];
+            listOfInstanceCounts = instanceCounts[member.classRef!] = <int>[];
           }
           while (listOfInstanceCounts.length < iterationNumber - 2) {
             listOfInstanceCounts.add(0);
           }
-          listOfInstanceCounts.add(member.instancesCurrent);
+          listOfInstanceCounts.add(member.instancesCurrent!);
           if (listOfInstanceCounts.length != iterationNumber - 1) {
             throw "Unexpected length";
           }
         }
-        await serviceClient.resume(isolateRef.id);
+        await serviceClient.resume(isolateRef.id!);
       }
     } catch (e) {
       print("Got error: $e");
@@ -173,7 +171,7 @@
   }
 
   bool ignoredClass(vmService.Class classDetails) {
-    String uriString = classDetails.location?.script?.uri;
+    String? uriString = classDetails.location?.script?.uri;
     if (uriString == null) return true;
     if (uriString.startsWith("package:front_end/")) {
       // Classes used for lazy initialization will naturally fluctuate.
@@ -210,7 +208,7 @@
       // naturally increase, e.g. we can get 2 more booleans every time (up to
       // a maximum of 2 per library or however many would have been there if we
       // didn't canonicalize at all).
-      if (classDetails.name.endsWith("Constant")) return true;
+      if (classDetails.name!.endsWith("Constant")) return true;
 
       // These classes have proved to fluctuate, although the reason is less
       // clear.
diff --git a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
index f4b0342..9c67a7c 100644
--- a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_dart2js_load_from_dill_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
-
 import 'dart:io' show Directory, File;
 
 import 'package:expect/expect.dart' show Expect;
@@ -20,7 +18,7 @@
 import 'incremental_suite.dart'
     show checkIsEqual, getOptions, initializedCompile, normalCompile;
 
-Directory outDir;
+late Directory outDir;
 
 Future<void> main() async {
   outDir =
@@ -64,10 +62,10 @@
         .readComponent(c);
     for (Uri uri in c.uriToSource.keys) {
       if (cSdk.uriToSource.containsKey(uri)) {
-        if ((c.uriToSource[uri].source?.length ?? 0) != 0) {
+        if (c.uriToSource[uri]!.source.length != 0) {
           throw "Compile contained sources for the sdk $uri";
         }
-        if ((c.uriToSource[uri].lineStarts?.length ?? 0) != 0) {
+        if ((c.uriToSource[uri]!.lineStarts?.length ?? 0) != 0) {
           throw "Compile contained line starts for the sdk $uri";
         }
       }
@@ -80,8 +78,8 @@
     [normalDill, true],
     [nonexisting, false],
   ]) {
-    Uri initializeWith = initializationData[0];
-    bool initializeExpect = initializationData[1];
+    Uri initializeWith = initializationData[0] as Uri;
+    bool initializeExpect = initializationData[1] as bool;
     stopwatch.reset();
     bool initializeResult = await initializedCompile(
         dart2jsUrl, fullDillFromInitialized, initializeWith, [invalidateUri],
@@ -135,16 +133,16 @@
         visitor.matchNamedNodes, visitor.checkNodes, 'procedures');
   }
 
-  bool _isMixinOrCloneReference(EquivalenceVisitor visitor, Reference a,
-      Reference b, String propertyName) {
+  bool _isMixinOrCloneReference(EquivalenceVisitor visitor, Reference? a,
+      Reference? b, String propertyName) {
     if (a != null && b != null) {
-      ReferenceName thisName = ReferenceName.fromReference(a);
-      ReferenceName otherName = ReferenceName.fromReference(b);
-      if (thisName.kind == ReferenceNameKind.Member &&
-          otherName.kind == ReferenceNameKind.Member &&
+      ReferenceName thisName = ReferenceName.fromReference(a)!;
+      ReferenceName otherName = ReferenceName.fromReference(b)!;
+      if (thisName.isMember &&
+          otherName.isMember &&
           thisName.memberName == otherName.memberName) {
-        String thisClassName = thisName.declarationName;
-        String otherClassName = otherName.declarationName;
+        String? thisClassName = thisName.declarationName;
+        String? otherClassName = otherName.declarationName;
         if (thisClassName != null &&
             otherClassName != null &&
             thisClassName.contains('&${otherClassName}')) {
diff --git a/pkg/front_end/test/incremental_dart2js_test.dart b/pkg/front_end/test/incremental_dart2js_test.dart
index 3a36586..d133437 100644
--- a/pkg/front_end/test/incremental_dart2js_test.dart
+++ b/pkg/front_end/test/incremental_dart2js_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
-
 import "incremental_dart2js_tester.dart";
 
 Future<void> main(List<String> args) async {
diff --git a/pkg/front_end/test/incremental_dart2js_tester.dart b/pkg/front_end/test/incremental_dart2js_tester.dart
index 3428af3..59add48 100644
--- a/pkg/front_end/test/incremental_dart2js_tester.dart
+++ b/pkg/front_end/test/incremental_dart2js_tester.dart
@@ -2,13 +2,14 @@
 // 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:developer";
 import 'dart:io' show Platform;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import 'package:front_end/src/fasta/kernel/utils.dart';
 
 import 'package:kernel/kernel.dart'
@@ -49,9 +50,9 @@
   final int limit;
 
   Stopwatch stopwatch = new Stopwatch();
-  List<int> firstCompileData;
-  Map<Uri, List<int>> libToData;
-  List<Uri> uris;
+  late List<int> firstCompileData;
+  late Map<Uri, List<int>> libToData;
+  late List<Uri> uris;
 
   List<Uri> diffs = <Uri>[];
   Set<Uri> componentUris = new Set<Uri>();
@@ -91,11 +92,14 @@
     print("Invalidating $uri ($i)");
     compiler.invalidate(uri);
     localStopwatch.reset();
-    Component c2 = await compiler.computeDelta(fullComponent: true);
+    IncrementalCompilerResult compilerResult =
+        await compiler.computeDelta(fullComponent: true);
+    Component c2 = compilerResult.component;
     print("Recompiled in ${localStopwatch.elapsedMilliseconds} ms");
     print("invalidatedImportUrisForTesting: "
-        "${compiler.invalidatedImportUrisForTesting}");
-    print("rebuildBodiesCount: ${compiler.rebuildBodiesCount}");
+        "${compiler.recorderForTesting.invalidatedImportUrisForTesting}");
+    print("rebuildBodiesCount: "
+        "${compiler.recorderForTesting.rebuildBodiesCount}");
     localStopwatch.reset();
     Set<Uri> thisUris = new Set<Uri>.from(c2.libraries.map((l) => l.importUri));
     if (componentUris.isNotEmpty) {
@@ -136,7 +140,7 @@
 
         List<int> libSerialized =
             serializeComponent(c2, filter: (l) => l == library);
-        if (!isEqual(libToData[library.importUri], libSerialized)) {
+        if (!isEqual(libToData[library.importUri]!, libSerialized)) {
           print("=====");
           print("=====");
           print("=====");
@@ -182,7 +186,8 @@
         .alternativeInvalidationStrategy] = useExperimentalInvalidation;
     helper.TestIncrementalCompiler compiler =
         new helper.TestIncrementalCompiler(options, input);
-    Component c = await compiler.computeDelta();
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+    Component? c = compilerResult.component;
     print("Compiled dart2js to Component with ${c.libraries.length} libraries "
         "in ${stopwatch.elapsedMilliseconds} ms.");
     stopwatch.reset();
@@ -213,8 +218,9 @@
     stopwatch.reset();
 
     uris = c.uriToSource.values
-        .map((s) => s != null ? s.importUri : null)
-        .where((u) => u != null && u.scheme != "dart")
+        .map((s) => s.importUri)
+        .whereType<Uri>()
+        .where((u) => u.scheme != "dart")
         .toSet()
         .toList();
 
diff --git a/pkg/front_end/test/incremental_flutter_tester.dart b/pkg/front_end/test/incremental_flutter_tester.dart
index 3663d30..4a745aa 100644
--- a/pkg/front_end/test/incremental_flutter_tester.dart
+++ b/pkg/front_end/test/incremental_flutter_tester.dart
@@ -2,13 +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.
 
-// @dart = 2.9
-
 import 'dart:io' show Directory, File, exit;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 
 import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
@@ -32,7 +32,7 @@
 
 import "incremental_utils.dart" as util;
 
-void usage(String extraMessage) {
+Never usage(String extraMessage) {
   print("""Usage as something like:
     out/ReleaseX64/dart pkg/front_end/test/incremental_flutter_tester.dart \
       --fast --experimental \
@@ -49,8 +49,8 @@
 Future<void> main(List<String> args) async {
   bool fast = false;
   bool useExperimentalInvalidation = false;
-  File inputFile;
-  Directory flutterPatchedSdk;
+  File? inputFile;
+  Directory? flutterPatchedSdk;
   for (String arg in args) {
     if (arg == "--fast") {
       fast = true;
@@ -84,12 +84,13 @@
       .alternativeInvalidationStrategy] = useExperimentalInvalidation;
   helper.TestIncrementalCompiler compiler =
       new helper.TestIncrementalCompiler(options, inputFile.uri);
-  Component c = await compiler.computeDelta();
+  IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+  Component? c = compilerResult.component;
   print("Compiled to Component with ${c.libraries.length} "
       "libraries in ${stopwatch.elapsedMilliseconds} ms.");
   stopwatch.reset();
-  List<int> firstCompileData;
-  Map<Uri, List<int>> libToData;
+  late List<int> firstCompileData;
+  late Map<Uri, List<int>> libToData;
   if (fast) {
     libToData = {};
     c.libraries.sort((l1, l2) {
@@ -117,8 +118,9 @@
   stopwatch.reset();
 
   List<Uri> uris = c.uriToSource.values
-      .map((s) => s != null ? s.importUri : null)
-      .where((u) => u != null && u.scheme != "dart")
+      .map((s) => s.importUri)
+      .whereType<Uri>()
+      .where((u) => u.scheme != "dart")
       .toSet()
       .toList();
 
@@ -133,11 +135,14 @@
     print("Invalidating $uri ($i)");
     compiler.invalidate(uri);
     localStopwatch.reset();
-    Component c2 = await compiler.computeDelta(fullComponent: true);
+    IncrementalCompilerResult compilerResult =
+        await compiler.computeDelta(fullComponent: true);
+    Component c2 = compilerResult.component;
     print("Recompiled in ${localStopwatch.elapsedMilliseconds} ms");
     print("invalidatedImportUrisForTesting: "
-        "${compiler.invalidatedImportUrisForTesting}");
-    print("rebuildBodiesCount: ${compiler.rebuildBodiesCount}");
+        "${compiler.recorderForTesting.invalidatedImportUrisForTesting}");
+    print("rebuildBodiesCount: "
+        "${compiler.recorderForTesting.rebuildBodiesCount}");
     localStopwatch.reset();
     Set<Uri> thisUris = new Set<Uri>.from(c2.libraries.map((l) => l.importUri));
     if (componentUris.isNotEmpty) {
@@ -179,7 +184,7 @@
 
         List<int> libSerialized =
             serializeComponent(c2, filter: (l) => l == library);
-        if (!isEqual(libToData[library.importUri], libSerialized)) {
+        if (!isEqual(libToData[library.importUri]!, libSerialized)) {
           print("=====");
           print("=====");
           print("=====");
@@ -285,12 +290,12 @@
 
 class PrinterPrime extends Printer {
   PrinterPrime(StringSink sink,
-      {NameSystem syntheticNames,
+      {NameSystem? syntheticNames,
       bool showOffsets: false,
       bool showMetadata: false,
-      ImportTable importTable,
-      Annotator annotator,
-      Map<String, MetadataRepository<Object>> metadata})
+      ImportTable? importTable,
+      Annotator? annotator,
+      Map<String, MetadataRepository<dynamic>>? metadata})
       : super(sink,
             showOffsets: showOffsets,
             showMetadata: showMetadata,
@@ -300,7 +305,7 @@
 
   @override
   PrinterPrime createInner(ImportTable importTable,
-      Map<String, MetadataRepository<Object>> metadata) {
+      Map<String, MetadataRepository<dynamic>>? metadata) {
     return new PrinterPrime(sink,
         importTable: importTable,
         metadata: metadata,
@@ -311,7 +316,7 @@
   }
 
   @override
-  void writeInterfaceTarget(Name name, Reference target) {
+  void writeInterfaceTarget(Name name, Reference? target) {
     // Skipped!
   }
 }
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
index ac40f6e..8280c8d 100644
--- a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_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
-
 import 'dart:io' show File;
 
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
@@ -19,6 +17,9 @@
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
     show ExperimentalFlag;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
+
 import "package:front_end/src/api_prototype/memory_file_system.dart"
     show MemoryFileSystem;
 
@@ -41,7 +42,7 @@
         codeInitializeFromDillUnknownProblemNoDump;
 
 import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler;
+    show IncrementalCompiler, RecorderForTesting;
 
 import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
@@ -57,21 +58,21 @@
 }
 
 class Tester {
-  Uri sdkRoot;
-  Uri base;
-  Uri sdkSummary;
-  Uri initializeFrom;
-  Uri helperFile;
-  Uri helper2File;
-  Uri entryPoint;
-  Uri entryPointImportDartFoo;
-  Uri platformUri;
-  List<int> sdkSummaryData;
-  List<DiagnosticMessage> errorMessages;
-  List<DiagnosticMessage> warningMessages;
-  MemoryFileSystem fs;
-  CompilerOptions options;
-  IncrementalCompiler compiler;
+  late Uri sdkRoot;
+  late Uri base;
+  late Uri sdkSummary;
+  late Uri initializeFrom;
+  late Uri helperFile;
+  late Uri helper2File;
+  late Uri entryPoint;
+  late Uri entryPointImportDartFoo;
+  late Uri platformUri;
+  late List<int> sdkSummaryData;
+  late List<DiagnosticMessage> errorMessages;
+  late List<DiagnosticMessage> warningMessages;
+  late MemoryFileSystem fs;
+  late CompilerOptions options;
+  late IncrementalCompiler compiler;
 
   Future<void> compileExpectInitializeFailAndSpecificWarning(
       Code expectedWarningCode, bool writeFileOnCrashReport) async {
@@ -83,7 +84,7 @@
             new ProcessedOptions(options: options, inputs: [entryPoint])),
         initializeFrom);
     await compiler.computeDelta();
-    if (compiler.initializedFromDill) {
+    if (compiler.initializedFromDillForTesting) {
       Expect.fail("Expected to not be able to initialized from dill, but did.");
     }
     if (errorMessages.isNotEmpty) {
@@ -108,11 +109,12 @@
         new CompilerContext(
             new ProcessedOptions(options: options, inputs: [compileThis])),
         initializeFrom);
-    Component component = await compiler.computeDelta();
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+    Component component = compilerResult.component;
 
-    if (compiler.initializedFromDill != initializedFromDill) {
+    if (compiler.initializedFromDillForTesting != initializedFromDill) {
       Expect.fail("Expected initializedFromDill to be $initializedFromDill "
-          "but was ${compiler.initializedFromDill}");
+          "but was ${compiler.initializedFromDillForTesting}");
     }
     if (errorMessages.isNotEmpty) {
       Expect.fail("Got unexpected errors: " + joinMessages(errorMessages));
@@ -183,7 +185,9 @@
             new ProcessedOptions(options: options, inputs: [entryPoint])),
         initializeFrom);
 
-    Component componentGood = await compiler.computeDelta();
+    IncrementalCompilerResult compilerGoodResult =
+        await compiler.computeDelta();
+    Component componentGood = compilerGoodResult.component;
     List<int> dataGood = serializeComponent(componentGood);
     fs.entityForUri(initializeFrom).writeAsBytesSync(dataGood);
 
@@ -193,7 +197,9 @@
         new CompilerContext(
             new ProcessedOptions(options: options, inputs: [helper2File])),
         initializeFrom);
-    Component componentHelper = await compiler.computeDelta();
+    IncrementalCompilerResult compilerHelperResult =
+        await compiler.computeDelta();
+    Component componentHelper = compilerHelperResult.component;
     Library helper2Lib = componentHelper.libraries
         .firstWhere((lib) => lib.importUri == helper2File);
     helper2Lib.importUri = new Uri(scheme: "dart", path: "foo");
@@ -216,7 +222,8 @@
 
     // Create a partial dill file.
     compiler.invalidate(entryPoint);
-    component = await compiler.computeDelta();
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+    component = compilerResult.component;
     if (component.libraries.length != 1) {
       Expect.fail("Expected 1 library, got ${component.libraries.length}: "
           "${component.libraries}");
@@ -248,7 +255,7 @@
     List<int> mixedPart1;
     {
       // Create a component that is compiled without NNBD.
-      Map<ExperimentalFlag, bool> prevTesting =
+      Map<ExperimentalFlag, bool>? prevTesting =
           options.defaultExperimentFlagsForTesting;
       options.defaultExperimentFlagsForTesting = {
         ExperimentalFlag.nonNullable: false
@@ -259,7 +266,9 @@
           new CompilerContext(
               new ProcessedOptions(options: options, inputs: [helper2File])),
           null);
-      Component c = await compiler.computeDelta();
+
+      IncrementalCompilerResult result = await compiler.computeDelta();
+      Component c = result.component;
       c.setMainMethodAndMode(
           null, false, NonNullableByDefaultCompiledMode.Weak);
       mixedPart1 = serializeComponent(c);
@@ -270,7 +279,7 @@
     List<int> mixedPart2;
     {
       // Create a component that is compiled with strong NNBD.
-      Map<ExperimentalFlag, bool> prevTesting =
+      Map<ExperimentalFlag, bool>? prevTesting =
           options.defaultExperimentFlagsForTesting;
       options.defaultExperimentFlagsForTesting = {
         ExperimentalFlag.nonNullable: true
@@ -281,7 +290,8 @@
           new CompilerContext(
               new ProcessedOptions(options: options, inputs: [helperFile])),
           null);
-      Component c = await compiler.computeDelta();
+      IncrementalCompilerResult result = await compiler.computeDelta();
+      Component c = result.component;
       c.setMainMethodAndMode(
           null, false, NonNullableByDefaultCompiledMode.Strong);
       mixedPart2 = serializeComponent(c);
@@ -302,11 +312,19 @@
 
 class DeleteTempFilesIncrementalCompiler extends IncrementalCompiler {
   DeleteTempFilesIncrementalCompiler(CompilerContext context,
-      [Uri initializeFromDillUri])
+      [Uri? initializeFromDillUri])
       : super(context, initializeFromDillUri);
 
   @override
-  void recordTemporaryFileForTesting(Uri uri) {
+  final RecorderForTesting recorderForTesting =
+      const DeleteTempFilesRecorderForTesting();
+}
+
+class DeleteTempFilesRecorderForTesting extends RecorderForTesting {
+  const DeleteTempFilesRecorderForTesting();
+
+  @override
+  void recordTemporaryFile(Uri uri) {
     File f = new File.fromUri(uri);
     if (f.existsSync()) f.deleteSync();
   }
diff --git a/pkg/front_end/test/incremental_suite.dart b/pkg/front_end/test/incremental_suite.dart
index 2ce5c81..7c07a6a 100644
--- a/pkg/front_end/test/incremental_suite.dart
+++ b/pkg/front_end/test/incremental_suite.dart
@@ -24,7 +24,8 @@
 
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
     show ExperimentalFlag, experimentEnabledVersion;
-
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 import "package:front_end/src/api_prototype/memory_file_system.dart"
     show MemoryFileSystem, MemoryFileSystemEntity;
 
@@ -42,7 +43,7 @@
     show DiagnosticMessageFromJson, FormattedMessage;
 
 import 'package:front_end/src/fasta/incremental_compiler.dart'
-    show IncrementalCompiler;
+    show IncrementalCompiler, RecorderForTesting;
 
 import 'package:front_end/src/fasta/incremental_serializer.dart'
     show IncrementalSerializer;
@@ -304,7 +305,8 @@
     final List<int> sdkSummaryData,
     Target target,
     Target originalTarget,
-    String sdkSummary) async {
+    String sdkSummary,
+    {required bool trackNeededDillLibraries}) async {
   final Uri base = Uri.parse("org-dartlang-test:///");
   final Uri sdkSummaryUri = base.resolve(sdkSummary);
 
@@ -355,7 +357,10 @@
     }
     TestIncrementalCompiler compiler = new TestIncrementalCompiler(
         options, moduleSources.first, /* initializeFrom = */ null, outlineOnly);
-    Component c = await compiler.computeDelta(entryPoints: moduleSources);
+    IncrementalCompilerResult compilerResult = await compiler.computeDelta(
+        entryPoints: moduleSources,
+        trackNeededDillLibraries: trackNeededDillLibraries);
+    Component c = compilerResult.component;
     c.computeCanonicalNames();
     List<Library> wantedLibs = <Library>[];
     for (Library lib in c.libraries) {
@@ -452,7 +457,8 @@
 
     if (modules != null) {
       moduleData = await createModules(
-          modules, sdkSummaryData, target, originalTarget, sdkSummary);
+          modules, sdkSummaryData, target, originalTarget, sdkSummary,
+          trackNeededDillLibraries: false);
       sdk = newestWholeComponent = new Component();
       new BinaryBuilder(sdkSummaryData,
               filename: null, disableLazyReading: false)
@@ -660,15 +666,16 @@
       if (modulesToUse != null) {
         compiler!.setModulesToLoadOnNextComputeDelta(modulesToUse);
         compiler.invalidateAllSources();
-        compiler.trackNeededDillLibraries = true;
       }
 
       Stopwatch stopwatch = new Stopwatch()..start();
-      component = await compiler!.computeDelta(
+      IncrementalCompilerResult compilerResult = await compiler!.computeDelta(
           entryPoints: entries,
           fullComponent:
               brandNewWorld ? false : (noFullComponent ? false : true),
+          trackNeededDillLibraries: modulesToUse != null,
           simulateTransformer: world["simulateTransformer"]);
+      component = compilerResult.component;
       if (outlineOnly && !skipOutlineBodyCheck) {
         for (Library lib in component!.libraries) {
           for (Class c in lib.classes) {
@@ -722,7 +729,7 @@
       Result? contentResult = checkExpectedContent(world, component!);
       if (contentResult != null) return contentResult.copyWithOutput(data);
       result = checkNeededDillLibraries(
-          world, data, compiler.neededDillLibraries, base);
+          world, data, compilerResult.neededDillLibraries, base);
       if (result != null) return result;
 
       Result? nnbdCheck = checkNNBDSettings(component!);
@@ -794,8 +801,7 @@
       result = checkExpectFile(data, worldNum, "", context, actualSerialized);
       if (result != null) return result;
       if (world["skipClassHierarchyTest"] != true) {
-        result =
-            checkClassHierarchy(compiler, component!, data, worldNum, context);
+        result = checkClassHierarchy(compilerResult, data, worldNum, context);
         if (result != null) return result;
       }
 
@@ -844,7 +850,8 @@
       }
 
       if (world["expectsRebuildBodiesOnly"] != null) {
-        bool didRebuildBodiesOnly = compiler.rebuildBodiesCount! > 0;
+        bool didRebuildBodiesOnly =
+            compiler.recorderForTesting.rebuildBodiesCount! > 0;
         if (world["expectsRebuildBodiesOnly"] != didRebuildBodiesOnly) {
           return new Result<TestData>(
               data,
@@ -872,19 +879,20 @@
           }
         }
       }
-      if (compiler.initializedFromDill != expectInitializeFromDill) {
+      if (compiler.initializedFromDillForTesting != expectInitializeFromDill) {
         return new Result<TestData>(
             data,
             InitializedFromDillMismatch,
             "Expected that initializedFromDill would be "
             "$expectInitializeFromDill but was "
-            "${compiler.initializedFromDill}");
+            "${compiler.initializedFromDillForTesting}");
       }
 
-      if (incrementalSerialization == true && compiler.initializedFromDill) {
-        Expect.isTrue(compiler.initializedIncrementalSerializer);
+      if (incrementalSerialization == true &&
+          compiler.initializedFromDillForTesting) {
+        Expect.isTrue(compiler.initializedIncrementalSerializerForTesting);
       } else {
-        Expect.isFalse(compiler.initializedIncrementalSerializer);
+        Expect.isFalse(compiler.initializedIncrementalSerializerForTesting);
       }
 
       if (world["checkInvalidatedFiles"] != false) {
@@ -934,10 +942,11 @@
 
       if (!noFullComponent) {
         clearPrevErrorsEtc();
-        component2 = await compiler.computeDelta(
+        IncrementalCompilerResult compilerResult2 = await compiler.computeDelta(
             entryPoints: entries,
             fullComponent: true,
             simulateTransformer: world["simulateTransformer"]);
+        component2 = compilerResult2.component;
         Result<TestData>? result = performErrorAndWarningCheck(world, data,
             gotError, formattedErrors, gotWarning, formattedWarnings);
         if (result != null) return result;
@@ -1043,13 +1052,15 @@
         if (modulesToUse != null) {
           compilerFromScratch.setModulesToLoadOnNextComputeDelta(modulesToUse);
           compilerFromScratch.invalidateAllSources();
-          compilerFromScratch.trackNeededDillLibraries = true;
         }
 
         Stopwatch stopwatch = new Stopwatch()..start();
-        component3 = await compilerFromScratch.computeDelta(
-            entryPoints: entries,
-            simulateTransformer: world["simulateTransformer"]);
+        IncrementalCompilerResult compilerResult3 =
+            await compilerFromScratch.computeDelta(
+                entryPoints: entries,
+                trackNeededDillLibraries: modulesToUse != null,
+                simulateTransformer: world["simulateTransformer"]);
+        component3 = compilerResult3.component;
         compilerFromScratch = null;
         Result<TestData>? result = performErrorAndWarningCheck(world, data,
             gotError, formattedErrors, gotWarning, formattedWarnings);
@@ -1183,10 +1194,10 @@
 ///
 /// This has the option to do expect files, but it's disabled by default
 /// while we're trying to figure out if it's useful or not.
-Result<TestData>? checkClassHierarchy(TestIncrementalCompiler compiler,
-    Component component, TestData data, int worldNum, Context context,
+Result<TestData>? checkClassHierarchy(IncrementalCompilerResult compilerResult,
+    TestData data, int worldNum, Context context,
     {bool checkExpectFile: false}) {
-  ClassHierarchy? classHierarchy = compiler.getClassHierarchy();
+  ClassHierarchy? classHierarchy = compilerResult.classHierarchy;
   if (classHierarchy is! ClosedWorldClassHierarchy) {
     return new Result<TestData>(
         data,
@@ -1206,6 +1217,7 @@
     classHierarchyMap[info.classNode] = info;
   }
 
+  Component component = compilerResult.component;
   StringBuffer sb = new StringBuffer();
   for (Library library in component.libraries) {
     if (library.importUri.scheme == "dart") continue;
@@ -1764,7 +1776,7 @@
   List<int> bytes =
       await normalCompileToBytes(input, options: options, compiler: compiler);
   new File.fromUri(output).writeAsBytesSync(bytes);
-  return compiler.initializedFromDill;
+  return compiler.initializedFromDillForTesting;
 }
 
 Future<List<int>> normalCompileToBytes(Uri input,
@@ -1787,7 +1799,7 @@
     {CompilerOptions? options, IncrementalCompiler? compiler}) async {
   options ??= getOptions();
   compiler ??= new TestIncrementalCompiler(options, input);
-  return await compiler.computeDelta();
+  return (await compiler.computeDelta()).component;
 }
 
 Future<bool> initializedCompile(
@@ -1799,10 +1811,12 @@
   for (Uri invalidateUri in invalidateUris) {
     compiler.invalidate(invalidateUri);
   }
-  Component initializedComponent = await compiler.computeDelta();
+  IncrementalCompilerResult initializedCompilerResult =
+      await compiler.computeDelta();
+  Component initializedComponent = initializedCompilerResult.component;
   util.throwOnEmptyMixinBodies(initializedComponent);
   await util.throwOnInsufficientUriToSource(initializedComponent);
-  bool result = compiler.initializedFromDill;
+  bool result = compiler.initializedFromDillForTesting;
   new File.fromUri(output)
       .writeAsBytesSync(util.postProcess(initializedComponent));
   int actuallyInvalidatedCount = compiler
@@ -1814,8 +1828,9 @@
         "got $actuallyInvalidatedCount");
   }
 
-  Component initializedFullComponent =
+  IncrementalCompilerResult initializedFullCompilerResult =
       await compiler.computeDelta(fullComponent: true);
+  Component initializedFullComponent = initializedFullCompilerResult.component;
   util.throwOnEmptyMixinBodies(initializedFullComponent);
   await util.throwOnInsufficientUriToSource(initializedFullComponent);
   Expect.equals(initializedComponent.libraries.length,
@@ -1827,7 +1842,8 @@
     compiler.invalidate(invalidateUri);
   }
 
-  Component partialComponent = await compiler.computeDelta();
+  IncrementalCompilerResult partialResult = await compiler.computeDelta();
+  Component partialComponent = partialResult.component;
   util.throwOnEmptyMixinBodies(partialComponent);
   await util.throwOnInsufficientUriToSource(partialComponent);
   actuallyInvalidatedCount = (compiler
@@ -1839,7 +1855,8 @@
         "got $actuallyInvalidatedCount");
   }
 
-  Component emptyComponent = await compiler.computeDelta();
+  IncrementalCompilerResult emptyResult = await compiler.computeDelta();
+  Component emptyComponent = emptyResult.component;
   util.throwOnEmptyMixinBodies(emptyComponent);
   await util.throwOnInsufficientUriToSource(emptyComponent);
 
@@ -1860,8 +1877,9 @@
 }
 
 class TestIncrementalCompiler extends IncrementalCompiler {
-  Set<Uri>? invalidatedImportUrisForTesting;
-  int? rebuildBodiesCount;
+  @override
+  final TestRecorderForTesting recorderForTesting =
+      new TestRecorderForTesting();
   final Uri entryPoint;
 
   /// Filter out the automatically added entryPoint, unless it's explicitly
@@ -1871,12 +1889,12 @@
   /// This is not perfect, but works for what it's currently used for.
   Set<Uri>? getFilteredInvalidatedImportUrisForTesting(
       List<Uri> invalidatedUris) {
-    if (invalidatedImportUrisForTesting == null) return null;
+    if (recorderForTesting.invalidatedImportUrisForTesting == null) return null;
 
     Set<String> invalidatedFilenames =
         invalidatedUris.map((uri) => uri.pathSegments.last).toSet();
     Set<Uri> result = new Set<Uri>();
-    for (Uri uri in invalidatedImportUrisForTesting!) {
+    for (Uri uri in recorderForTesting.invalidatedImportUrisForTesting!) {
       if (uri.pathSegments.isNotEmpty &&
           uri.pathSegments.last == "nonexisting.dart") {
         continue;
@@ -1912,12 +1930,42 @@
             incrementalSerializer);
 
   @override
-  void recordInvalidatedImportUrisForTesting(List<Uri> uris) {
+  Future<IncrementalCompilerResult> computeDelta(
+      {List<Uri>? entryPoints,
+      bool fullComponent = false,
+      bool trackNeededDillLibraries: false,
+      bool? simulateTransformer}) async {
+    IncrementalCompilerResult result = await super.computeDelta(
+        entryPoints: entryPoints,
+        fullComponent: fullComponent,
+        trackNeededDillLibraries: trackNeededDillLibraries);
+
+    // We should at least have the SDK builders available. Slight smoke test.
+    if (!dillTargetForTesting!.loader.libraryImportUris
+        .map((uri) => uri.toString())
+        .contains("dart:core")) {
+      throw "Loaders builder should contain the sdk, "
+          "but didn't even contain dart:core.";
+    }
+
+    if (simulateTransformer == true) {
+      doSimulateTransformer(result.component);
+    }
+    return result;
+  }
+}
+
+class TestRecorderForTesting extends RecorderForTesting {
+  Set<Uri>? invalidatedImportUrisForTesting;
+  int? rebuildBodiesCount;
+
+  @override
+  void recordInvalidatedImportUris(List<Uri> uris) {
     invalidatedImportUrisForTesting = uris.isEmpty ? null : uris.toSet();
   }
 
   @override
-  void recordNonFullComponentForTesting(Component component) {
+  void recordNonFullComponent(Component component) {
     // It should at least contain the sdk. Slight smoke test.
     if (!component.libraries
         .map((lib) => lib.importUri.toString())
@@ -1928,34 +1976,12 @@
   }
 
   @override
-  void recordRebuildBodiesCountForTesting(int count) {
+  void recordRebuildBodiesCount(int count) {
     rebuildBodiesCount = count;
   }
 
   @override
-  Future<Component> computeDelta(
-      {List<Uri>? entryPoints,
-      bool fullComponent = false,
-      bool? simulateTransformer}) async {
-    Component result = await super
-        .computeDelta(entryPoints: entryPoints, fullComponent: fullComponent);
-
-    // We should at least have the SDK builders available. Slight smoke test.
-    if (!dillLoadedData!.loader.libraryImportUris
-        .map((uri) => uri.toString())
-        .contains("dart:core")) {
-      throw "Loaders builder should contain the sdk, "
-          "but didn't even contain dart:core.";
-    }
-
-    if (simulateTransformer == true) {
-      doSimulateTransformer(result);
-    }
-    return result;
-  }
-
-  @override
-  void recordTemporaryFileForTesting(Uri uri) {
+  void recordTemporaryFile(Uri uri) {
     File f = new File.fromUri(uri);
     if (f.existsSync()) f.deleteSync();
   }
diff --git a/pkg/front_end/test/issue_34856_test.dart b/pkg/front_end/test/issue_34856_test.dart
index a82d5c5..a0b5fc1 100644
--- a/pkg/front_end/test/issue_34856_test.dart
+++ b/pkg/front_end/test/issue_34856_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
-
 import 'dart:io' show File;
 
 import 'package:async_helper/async_helper.dart' show asyncTest;
@@ -68,14 +66,14 @@
   fs.entityForUri(platformDill).writeAsBytesSync(platformDillBytes);
   fs
       .entityForUri(base.resolve("lib.dart"))
-      .writeAsStringSync(files["lib.dart"]);
+      .writeAsStringSync(files["lib.dart"]!);
   CompilerOptions options = new CompilerOptions()
     ..fileSystem = fs
     ..sdkSummary = platformDill;
 
   Component component =
       (await kernelForModule(<Uri>[base.resolve("lib.dart")], options))
-          .component;
+          .component!;
 
   fs = new MemoryFileSystem(base);
   fs.entityForUri(platformDill).writeAsBytesSync(platformDillBytes);
@@ -84,7 +82,7 @@
       .writeAsBytesSync(serializeComponent(component));
   fs
       .entityForUri(base.resolve("repro.dart"))
-      .writeAsStringSync(files["repro.dart"]);
+      .writeAsStringSync(files["repro.dart"]!);
 
   options = new CompilerOptions()
     ..fileSystem = fs
@@ -94,12 +92,12 @@
 
   List<Uri> inputs = <Uri>[base.resolve("repro.dart")];
 
-  component = (await kernelForModule(inputs, options)).component;
+  component = (await kernelForModule(inputs, options)).component!;
 
   List<Object> errors = await CompilerContext.runWithOptions(
       new ProcessedOptions(options: options, inputs: inputs),
       (_) => new Future<List<Object>>.value(
-          verifyComponent(component, options.target, skipPlatform: true)));
+          verifyComponent(component, options.target!, skipPlatform: true)));
 
   serializeComponent(component);
 
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index 275df00..4c0bb6d 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_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
-
 import 'package:kernel/ast.dart'
     show EmptyStatement, Component, ReturnStatement, StaticInvocation;
 
@@ -45,7 +43,7 @@
         ..compileSdk = true // To prevent FE from loading an sdk-summary.
         ..onDiagnostic = errors.add;
 
-      Component component =
+      Component? component =
           (await compileScript('main() => print("hi");', options: options))
               ?.component;
       expect(component, isNotNull);
@@ -59,7 +57,7 @@
             Uri.parse('org-dartlang-test:///not_existing_summary_file')
         ..onDiagnostic = errors.add;
 
-      Component component =
+      Component? component =
           (await compileScript('main() => print("hi");', options: options))
               ?.component;
       expect(component, isNotNull);
@@ -74,14 +72,14 @@
         // sources of the sdk directly.
         ..librariesSpecificationUri = invalidCoreLibsSpecUri;
       Component component =
-          (await compileScript('main() => print("hi");', options: options))
-              ?.component;
+          (await compileScript('main() => print("hi");', options: options))!
+              .component!;
       var core = component.libraries.firstWhere(isDartCoreLibrary);
       var printMember = core.members.firstWhere((m) => m.name.text == 'print');
 
       // Note: summaries created by the SDK today contain empty statements as
       // method bodies.
-      expect(printMember.function.body is! EmptyStatement, isTrue);
+      expect(printMember.function!.body is! EmptyStatement, isTrue);
     });
 
     test('compiler requires a main method', () async {
@@ -95,8 +93,8 @@
     test('generated program contains source-info', () async {
       Component component = (await compileScript(
               'a() => print("hi"); main() {}',
-              fileName: 'a.dart'))
-          ?.component;
+              fileName: 'a.dart'))!
+          .component!;
       // Kernel always store an empty '' key in the map, so there is always at
       // least one. Having more means that source-info is added.
       expect(component.uriToSource.keys.length, greaterThan(1));
@@ -139,13 +137,13 @@
 
       var unitA = await compileUnit(['a.dart'], sources);
       // Pretend that the compiled code is a summary
-      sources['a.dill'] = serializeComponent(unitA);
+      sources['a.dill'] = serializeComponent(unitA!);
 
       var unitBC = await compileUnit(['b.dart', 'c.dart'], sources,
           additionalDills: ['a.dill']);
 
       // Pretend that the compiled code is a summary
-      sources['bc.dill'] = serializeComponent(unitBC);
+      sources['bc.dill'] = serializeComponent(unitBC!);
 
       void checkDCallsC(Component component) {
         var dLib = findLibrary(component, 'd.dart');
@@ -160,11 +158,11 @@
 
       var unitD1 = await compileUnit(['d.dart'], sources,
           additionalDills: ['a.dill', 'bc.dill']);
-      checkDCallsC(unitD1);
+      checkDCallsC(unitD1!);
 
       var unitD2 = await compileUnit(['d.dart'], sources,
           additionalDills: ['bc.dill', 'a.dill']);
-      checkDCallsC(unitD2);
+      checkDCallsC(unitD2!);
     });
 
     // TODO(sigmund): add tests with trimming dependencies
diff --git a/pkg/front_end/test/language_versioning/language_versioning_test.dart b/pkg/front_end/test/language_versioning/language_versioning_test.dart
index 359c265..221ce79 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_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
-
 import 'dart:io' show Directory, File, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
@@ -45,7 +43,7 @@
 }
 
 // Ugly hack.
-CompilerOptions stashedOptions;
+late CompilerOptions stashedOptions;
 
 class TestConfigWithLanguageVersion extends TestConfig {
   TestConfigWithLanguageVersion(String marker, String name)
@@ -110,7 +108,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new LanguageVersioningDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -141,7 +139,7 @@
     Features features = new Features();
     features[Tags.languageVersion] =
         "${library.languageVersion.major}.${library.languageVersion.minor}";
-    LibraryBuilder libraryBuilder =
+    LibraryBuilder? libraryBuilder =
         lookupLibraryBuilder(compilerResult, library);
     if (libraryBuilder is SourceLibraryBuilder &&
         libraryBuilder.packageUriForTesting != null) {
diff --git a/pkg/front_end/test/language_versioning/language_versioning_up_to_date_git_test.dart b/pkg/front_end/test/language_versioning/language_versioning_up_to_date_git_test.dart
index 89c3833..88e84ac 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_up_to_date_git_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_up_to_date_git_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
-
 import 'dart:io' show Platform, Process, ProcessResult;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
@@ -35,8 +33,8 @@
   // E.g. "2.6.0-edge" (without the quotes).
   String versionString = stdout.split("\n")[0];
   List<String> dotSeparatedParts = versionString.split(".");
-  int major = int.tryParse(dotSeparatedParts[0]);
-  int minor = int.tryParse(dotSeparatedParts[1]);
+  int major = int.parse(dotSeparatedParts[0]);
+  int minor = int.parse(dotSeparatedParts[1]);
   kernel.Version version = new kernel.Version(major, minor);
 
   if (kernel.defaultLanguageVersion != version) {
@@ -51,8 +49,8 @@
 
   List<String> dotSeparatedPartsFromOptions =
       compilerOptions.currentSdkVersion.split(".");
-  int majorFromOptions = int.tryParse(dotSeparatedPartsFromOptions[0]);
-  int minorFromOptions = int.tryParse(dotSeparatedPartsFromOptions[1]);
+  int majorFromOptions = int.parse(dotSeparatedPartsFromOptions[0]);
+  int minorFromOptions = int.parse(dotSeparatedPartsFromOptions[1]);
   if (majorFromOptions != major || minorFromOptions != minor) {
     throw "CompilerOptions defaults "
         "${majorFromOptions}.${minorFromOptions}"
diff --git a/pkg/front_end/test/lint_suite.dart b/pkg/front_end/test/lint_suite.dart
index 130a452..cd16042 100644
--- a/pkg/front_end/test/lint_suite.dart
+++ b/pkg/front_end/test/lint_suite.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 'dart:io' show Directory, File, FileSystemEntity;
 
 import 'dart:typed_data' show Uint8List;
@@ -58,10 +56,10 @@
   }
 
   String getErrorMessage(int offset, int squigglyLength, String message) {
-    cache.source ??= new Source(cache.lineStarts, cache.rawBytes, uri, uri);
-    Location location = cache.source.getLocation(uri, offset);
+    cache.source ??= new Source(cache.lineStarts, cache.rawBytes!, uri, uri);
+    Location location = cache.source!.getLocation(uri, offset);
     return command_line_reporting.formatErrorMessage(
-        cache.source.getTextLine(location.line),
+        cache.source!.getTextLine(location.line),
         location,
         squigglyLength,
         uri.toString(),
@@ -70,16 +68,16 @@
 }
 
 class LintTestCache {
-  List<int> rawBytes;
-  List<int> lineStarts;
-  Source source;
-  Token firstToken;
-  PackageConfig packages;
+  List<int>? rawBytes;
+  late List<int> lineStarts;
+  Source? source;
+  Token? firstToken;
+  PackageConfig? packages;
 }
 
 class Context extends ChainContext {
   final bool onlyInGit;
-  Context({this.onlyInGit});
+  Context({required this.onlyInGit});
 
   @override
   final List<Step> steps = const <Step>[
@@ -95,7 +93,7 @@
 
   @override
   Stream<LintTestDescription> list(Chain suite) async* {
-    Set<Uri> gitFiles;
+    late Set<Uri> gitFiles;
     if (onlyInGit) {
       gitFiles = await getGitFiles(suite.uri);
     }
@@ -160,9 +158,9 @@
       File f = new File.fromUri(description.uri);
       description.cache.rawBytes = f.readAsBytesSync();
 
-      Uint8List bytes = new Uint8List(description.cache.rawBytes.length + 1);
+      Uint8List bytes = new Uint8List(description.cache.rawBytes!.length + 1);
       bytes.setRange(
-          0, description.cache.rawBytes.length, description.cache.rawBytes);
+          0, description.cache.rawBytes!.length, description.cache.rawBytes!);
 
       Utf8BytesScanner scanner =
           new Utf8BytesScanner(bytes, includeComments: true);
@@ -195,7 +193,7 @@
 
     Parser parser = new Parser(description.listener,
         useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
-    parser.parseUnit(description.cache.firstToken);
+    parser.parseUnit(description.cache.firstToken!);
 
     if (description.listener.problems.isEmpty) {
       return pass(description);
@@ -206,9 +204,9 @@
 
 class LintListener extends Listener {
   List<String> problems = <String>[];
-  LintTestDescription description;
+  late final LintTestDescription description;
   @override
-  Uri uri;
+  late final Uri uri;
 
   void onProblem(int offset, int squigglyLength, String message) {
     problems.add(description.getErrorMessage(offset, squigglyLength, message));
@@ -220,15 +218,15 @@
 
   @override
   void beginVariablesDeclaration(
-      Token token, Token lateToken, Token varFinalOrConst) {
+      Token token, Token? lateToken, Token? varFinalOrConst) {
     if (!_latestTypes.last.type) {
       onProblem(
-          varFinalOrConst.offset, varFinalOrConst.length, "No explicit type.");
+          varFinalOrConst!.offset, varFinalOrConst.length, "No explicit type.");
     }
   }
 
   @override
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     _latestTypes.add(new LatestType(beginToken, true));
   }
 
@@ -238,17 +236,17 @@
   }
 
   @override
-  void endFunctionType(Token functionToken, Token questionMark) {
+  void endFunctionType(Token functionToken, Token? questionMark) {
     _latestTypes.add(new LatestType(functionToken, true));
   }
 
   @override
   void endTopLevelFields(
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
@@ -260,29 +258,30 @@
 
   @override
   void endClassFields(
-      Token abstractToken,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token lateToken,
-      Token varFinalOrConst,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
       int count,
       Token beginToken,
       Token endToken) {
     if (!_latestTypes.last.type) {
       onProblem(
-          varFinalOrConst.offset, varFinalOrConst.length, "No explicit type.");
+          varFinalOrConst!.offset, varFinalOrConst.length, "No explicit type.");
     }
     _latestTypes.removeLast();
   }
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     _latestTypes.removeLast();
@@ -300,8 +299,8 @@
   Set<Uri> seenImports = new Set<Uri>();
 
   @override
-  void endImport(Token importKeyword, Token semicolon) {
-    Token importUriToken = importKeyword.next;
+  void endImport(Token importKeyword, Token? semicolon) {
+    Token importUriToken = importKeyword.next!;
     String importUri = importUriToken.lexeme;
     if (importUri.startsWith("r")) {
       importUri = importUri.substring(2, importUri.length - 1);
@@ -311,7 +310,7 @@
     Uri resolved = uri.resolve(importUri);
     if (resolved.scheme == "package") {
       if (description.cache.packages != null) {
-        resolved = description.cache.packages.resolve(resolved);
+        resolved = description.cache.packages!.resolve(resolved)!;
       }
     }
     if (!seenImports.add(resolved)) {
@@ -324,7 +323,7 @@
 class ExportsLintListener extends LintListener {
   @override
   void endExport(Token exportKeyword, Token semicolon) {
-    Token exportUriToken = exportKeyword.next;
+    Token exportUriToken = exportKeyword.next!;
     String exportUri = exportUriToken.lexeme;
     if (exportUri.startsWith("r")) {
       exportUri = exportUri.substring(2, exportUri.length - 1);
@@ -334,7 +333,7 @@
     Uri resolved = uri.resolve(exportUri);
     if (resolved.scheme == "package") {
       if (description.cache.packages != null) {
-        resolved = description.cache.packages.resolve(resolved);
+        resolved = description.cache.packages!.resolve(resolved)!;
       }
     }
     onProblem(exportUriToken.offset, exportUriToken.lexeme.length,
diff --git a/pkg/front_end/test/lint_test.status b/pkg/front_end/test/lint_test.status
index e7d04be..9f581ba 100644
--- a/pkg/front_end/test/lint_test.status
+++ b/pkg/front_end/test/lint_test.status
@@ -14,6 +14,7 @@
 front_end/lib/src/api_prototype/front_end/Exports: Fail
 front_end/lib/src/api_prototype/incremental_kernel_generator/Exports: Fail
 front_end/lib/src/api_prototype/language_version/Exports: Fail
+front_end/lib/src/api_prototype/lowering_predicates/Exports: Fail
 front_end/lib/src/api_prototype/terminal_color_support/Exports: Fail
 front_end/lib/src/fasta/fasta_codes/Exports: Fail
 front_end/lib/src/fasta/incremental_compiler/ImportsTwice: Fail
diff --git a/pkg/front_end/test/macros/data/package_config.json b/pkg/front_end/test/macros/data/package_config.json
new file mode 100644
index 0000000..97031ce
--- /dev/null
+++ b/pkg/front_end/test/macros/data/package_config.json
@@ -0,0 +1,13 @@
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "macro",
+      "rootUri": "pkgs/macro/lib/"
+    },
+    {
+      "name": "macro_builder",
+      "rootUri": "pkgs/macro_builder/lib/"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart b/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart
new file mode 100644
index 0000000..f79b175
--- /dev/null
+++ b/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:macro_builder/macro_builder.dart';
+
+macro class Macro1 implements Macro {
+  const Macro1();
+}
+
+macro class Macro2 implements Macro {
+  const Macro2();
+}
+
+macro class Macro3 implements Macro {
+  const Macro3();
+}
+
+class NonMacro {
+  const NonMacro();
+}
diff --git a/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/macro_builder.dart b/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/macro_builder.dart
new file mode 100644
index 0000000..14354da
--- /dev/null
+++ b/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/macro_builder.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'src/macro.dart';
diff --git a/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/src/macro.dart b/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/src/macro.dart
new file mode 100644
index 0000000..434331b
--- /dev/null
+++ b/pkg/front_end/test/macros/data/pkgs/macro_builder/lib/src/macro.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Macro {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_macro.dart b/pkg/front_end/test/macros/data/tests/declare_macro.dart
new file mode 100644
index 0000000..e6d329e
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_macro.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  main.dart|package:macro_builder/macro_builder.dart],
+ declaredMacros=[MyMacro],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+macro class MyMacro implements Macro {}
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart
new file mode 100644
index 0000000..f4e6484
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'macro_lib.dart';
+import 'apply_lib_dep.dart';
+
+@Macro1()
+/*class: Class:
+ appliedMacros=[Macro1],
+ macrosAreApplied
+*/
+class Class extends Super {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib_dep.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib_dep.dart
new file mode 100644
index 0000000..018b909
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib_dep.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: macrosAreAvailable*/
+
+class Super {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib.dart
new file mode 100644
index 0000000..f1aac83
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ declaredMacros=[Macro1],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+import 'macro_lib_dep.dart';
+
+macro class Macro1 extends MacroBase implements Macro {
+  const Macro1();
+}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib_dep.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib_dep.dart
new file mode 100644
index 0000000..13c27f8
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/macro_lib_dep.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: macrosAreAvailable*/
+
+class MacroBase {
+  const MacroBase();
+}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/main.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/main.dart
new file mode 100644
index 0000000..868f08d
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/main.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  apply_lib_dep.dart|macro_lib_dep.dart|main_lib_dep.dart|package:macro_builder/src/macro.dart,
+  macro_lib.dart|package:macro_builder/macro_builder.dart,
+  apply_lib.dart|main.dart],
+ macrosAreAvailable
+*/
+
+import 'apply_lib.dart';
+import 'main_lib_dep.dart';
+
+void main() {
+  new Class();
+  method();
+}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/main_lib_dep.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/main_lib_dep.dart
new file mode 100644
index 0000000..684c9d7
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/main_lib_dep.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: macrosAreAvailable*/
+
+void method() {}
diff --git a/pkg/front_end/test/macros/data/tests/direct_import.dart b/pkg/front_end/test/macros/data/tests/direct_import.dart
new file mode 100644
index 0000000..f3484cd
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/direct_import.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  main.dart],
+ macrosAreAvailable
+*/
+
+// ignore: unused_import
+import 'package:macro_builder/src/macro.dart';
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/import_macro_builder.dart b/pkg/front_end/test/macros/data/tests/import_macro_builder.dart
new file mode 100644
index 0000000..dca3012
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/import_macro_builder.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  main.dart|package:macro_builder/macro_builder.dart],
+ macrosAreAvailable
+*/
+
+// ignore: unused_import
+import 'package:macro_builder/macro_builder.dart';
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/import_macro_package.dart b/pkg/front_end/test/macros/data/tests/import_macro_package.dart
new file mode 100644
index 0000000..1fabb48
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/import_macro_package.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  package:macro/macro.dart|package:macro_builder/macro_builder.dart,
+  main.dart],
+ macrosAreAvailable
+*/
+
+// ignore: unused_import
+import 'package:macro/macro.dart';
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/import_macro_source/macro_lib.dart b/pkg/front_end/test/macros/data/tests/import_macro_source/macro_lib.dart
new file mode 100644
index 0000000..c08cbcd
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/import_macro_source/macro_lib.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ declaredMacros=[Macro1],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+macro class Macro1 implements Macro {
+  const Macro1();
+}
diff --git a/pkg/front_end/test/macros/data/tests/import_macro_source/main.dart b/pkg/front_end/test/macros/data/tests/import_macro_source/main.dart
new file mode 100644
index 0000000..5b109f4
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/import_macro_source/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  macro_lib.dart|package:macro_builder/macro_builder.dart,
+  main.dart],
+ macrosAreAvailable
+*/
+
+// ignore: unused_import
+import 'macro_lib.dart';
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/macro_declarations.dart b/pkg/front_end/test/macros/data/tests/macro_declarations.dart
new file mode 100644
index 0000000..f5f5a5f
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/macro_declarations.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  main.dart|package:macro_builder/macro_builder.dart],
+ declaredMacros=[
+  Extends,
+  ExtendsAlias,
+  Implements,
+  ImplementsAlias,
+  Mixin,
+  MixinAlias,
+  NamedMixin1,
+  NamedMixin2],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+macro class Extends extends Macro {}
+
+macro class Implements implements Macro {}
+
+macro class Mixin with Macro {}
+
+mixin _Mixin {}
+
+macro class NamedMixin1 = Macro with _Mixin;
+
+macro class NamedMixin2 = Object with Macro;
+
+typedef Alias = Macro;
+
+macro class ExtendsAlias extends Alias {}
+
+macro class ImplementsAlias implements Alias {}
+
+macro class MixinAlias with Alias {}
+
+class ExtendsNoKeyword extends Macro {}
+
+class ImplementsNoKeyword implements Macro {}
+
+class MixinNoKeyword with Macro {}
+
+class ExtendsAliasNoKeyword extends Alias {}
+
+class ImplementsAliasNoKeyword implements Alias {}
+
+class MixinAliasNoKeyword with Alias {}
+
+class NamedMixin1NoKeyword = Macro with _Mixin;
+
+class NamedMixin2NoKeyword = Object with Macro;
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/marker.options b/pkg/front_end/test/macros/data/tests/marker.options
new file mode 100644
index 0000000..8416ef5
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/marker.options
@@ -0,0 +1 @@
+cfe=pkg/front_end/test/macros/macro_test.dart
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib1.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib1.dart
new file mode 100644
index 0000000..c08cbcd
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib1.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ declaredMacros=[Macro1],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+macro class Macro1 implements Macro {
+  const Macro1();
+}
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2a.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2a.dart
new file mode 100644
index 0000000..729e7f1
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2a.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ declaredMacros=[Macro2a],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+macro class Macro2a implements Macro {
+  const Macro2a();
+}
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart
new file mode 100644
index 0000000..df143f5
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ declaredMacros=[Macro2b],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+import 'macro_lib2a.dart';
+
+@Macro2a()
+/*class: Macro2b:
+ appliedMacros=[Macro2a],
+ macrosAreApplied
+*/
+macro class Macro2b implements Macro {
+  const Macro2b();
+}
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart
new file mode 100644
index 0000000..9dee592
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  macro_lib1.dart|macro_lib2a.dart|package:macro_builder/macro_builder.dart,
+  macro_lib2b.dart,
+  main.dart],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'macro_lib1.dart';
+import 'macro_lib2a.dart';
+import 'macro_lib2b.dart';
+
+@Macro1()
+@Macro2a()
+@Macro2b()
+/*member: main:appliedMacros=[
+  Macro1,
+  Macro2a,
+  Macro2b]*/
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/no_import.dart b/pkg/front_end/test/macros/data/tests/no_import.dart
new file mode 100644
index 0000000..80fd055
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/no_import.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: */
+
+void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/use_macro_package.dart b/pkg/front_end/test/macros/data/tests/use_macro_package.dart
new file mode 100644
index 0000000..74f18ff
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/use_macro_package.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ appliedMacros=[Macro3],
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  package:macro/macro.dart|package:macro_builder/macro_builder.dart,
+  main.dart],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+@Macro3()
+library use_macro_package;
+
+import 'package:macro/macro.dart';
+
+@Macro1()
+/*member: main:appliedMacros=[Macro1]*/
+void main() {}
+
+@Macro2()
+/*class: Class1:
+ appliedMacros=[Macro2],
+ macrosAreApplied
+*/
+class Class1 {
+  @Macro1()
+  @Macro2()
+  /*member: Class1.method:appliedMacros=[
+    Macro1,
+    Macro2]*/
+  void method() {}
+}
+
+@NonMacro()
+class Class2 {}
+
+/*class: Class3:macrosAreApplied*/
+class Class3 {
+  @Macro3()
+  /*member: Class3.field:appliedMacros=[Macro3]*/
+  var field;
+}
+
+class Class4 {
+  @NonMacro()
+  var field;
+}
diff --git a/pkg/front_end/test/macros/data/tests/use_macro_source/macro_lib.dart b/pkg/front_end/test/macros/data/tests/use_macro_source/macro_lib.dart
new file mode 100644
index 0000000..f3767a5
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/use_macro_source/macro_lib.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ declaredMacros=[
+  Macro1,
+  Macro2],
+ macrosAreAvailable
+*/
+
+import 'package:macro_builder/macro_builder.dart';
+
+macro class Macro1 implements Macro {
+  const Macro1();
+}
+
+macro class Macro2 implements Macro {
+  const Macro2();
+}
+
+class NonMacro {
+  const NonMacro();
+}
diff --git a/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart b/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart
new file mode 100644
index 0000000..930eb5c
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: 
+ compilationSequence=[
+  package:macro_builder/src/macro.dart,
+  macro_lib.dart|package:macro_builder/macro_builder.dart,
+  main.dart],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'macro_lib.dart';
+
+@Macro1()
+/*member: main:appliedMacros=[Macro1]*/
+void main() {}
+
+@Macro2()
+/*class: Class1:
+ appliedMacros=[Macro2],
+ macrosAreApplied
+*/
+class Class1 {
+  @Macro1()
+  @Macro2()
+  /*member: Class1.method:appliedMacros=[
+    Macro1,
+    Macro2]*/
+  void method() {}
+}
+
+@NonMacro()
+class Class2 {}
+
+/*class: Class3:macrosAreApplied*/
+class Class3 {
+  @Macro1()
+  /*member: Class3.field:appliedMacros=[Macro1]*/
+  var field;
+}
+
+class Class4 {
+  @NonMacro()
+  var field;
+}
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
new file mode 100644
index 0000000..c1aa33e
--- /dev/null
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -0,0 +1,197 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' show Directory, Platform;
+
+import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
+import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
+
+import 'package:_fe_analyzer_shared/src/testing/features.dart';
+import 'package:front_end/src/api_prototype/experimental_flags.dart';
+import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/testing/id_testing_helper.dart';
+import 'package:kernel/ast.dart';
+
+Future<void> main(List<String> args) async {
+  enableMacros = true;
+
+  Directory dataDir =
+      new Directory.fromUri(Platform.script.resolve('data/tests'));
+  await runTests<Features>(dataDir,
+      args: args,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(const MacroDataComputer(), [
+        new TestConfig(cfeMarker, 'cfe',
+            explicitExperimentalFlags: {ExperimentalFlag.macros: true},
+            packageConfigUri:
+                Platform.script.resolve('data/package_config.json'))
+      ]));
+}
+
+class MacroDataComputer extends DataComputer<Features> {
+  const MacroDataComputer();
+
+  @override
+  void computeMemberData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Member member,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool? verbose}) {
+    member.accept(new MacroDataExtractor(compilerResult, actualMap));
+  }
+
+  @override
+  void computeClassData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Class cls,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool? verbose}) {
+    new MacroDataExtractor(compilerResult, actualMap).computeForClass(cls);
+  }
+
+  @override
+  void computeLibraryData(
+      TestConfig config,
+      InternalCompilerResult compilerResult,
+      Library library,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool? verbose}) {
+    new MacroDataExtractor(compilerResult, actualMap)
+        .computeForLibrary(library);
+  }
+
+  @override
+  DataInterpreter<Features> get dataValidator =>
+      const FeaturesDataInterpreter();
+}
+
+class Tags {
+  static const String macrosAreAvailable = 'macrosAreAvailable';
+  static const String macrosAreApplied = 'macrosAreApplied';
+  static const String compilationSequence = 'compilationSequence';
+  static const String declaredMacros = 'declaredMacros';
+  static const String appliedMacros = 'appliedMacros';
+}
+
+String importUriToString(Uri importUri) {
+  if (importUri.scheme == 'package') {
+    return importUri.toString();
+  } else if (importUri.scheme == 'dart') {
+    return importUri.toString();
+  } else {
+    return importUri.pathSegments.last;
+  }
+}
+
+String libraryToString(Library library) => importUriToString(library.importUri);
+
+String strongComponentToString(Iterable<Uri> uris) {
+  List<String> list = uris.map(importUriToString).toList();
+  list.sort();
+  return list.join('|');
+}
+
+class MacroDataExtractor extends CfeDataExtractor<Features> {
+  late final MacroDeclarationData macroDeclarationData;
+  late final MacroApplicationData macroApplicationData;
+
+  MacroDataExtractor(InternalCompilerResult compilerResult,
+      Map<Id, ActualData<Features>> actualMap)
+      : super(compilerResult, actualMap) {
+    macroDeclarationData = compilerResult
+        .kernelTargetForTesting!.loader.dataForTesting!.macroDeclarationData;
+    macroApplicationData = compilerResult
+        .kernelTargetForTesting!.loader.dataForTesting!.macroApplicationData;
+  }
+
+  LibraryMacroApplicationData? getLibraryMacroApplicationData(Library library) {
+    return macroApplicationData.libraryData[library];
+  }
+
+  MacroApplications? getLibraryMacroApplications(Library library) {
+    return getLibraryMacroApplicationData(library)?.libraryApplications;
+  }
+
+  ClassMacroApplicationData? getClassMacroApplicationData(Class cls) {
+    LibraryMacroApplicationData? applicationData =
+        getLibraryMacroApplicationData(cls.enclosingLibrary);
+    if (applicationData != null) {
+      return applicationData.classData[cls];
+    }
+    return null;
+  }
+
+  MacroApplications? getClassMacroApplications(Class cls) {
+    return getClassMacroApplicationData(cls)?.classApplications;
+  }
+
+  MacroApplications? getMemberMacroApplications(Member member) {
+    Class? enclosingClass = member.enclosingClass;
+    if (enclosingClass != null) {
+      return getClassMacroApplicationData(enclosingClass)
+          ?.memberApplications[member];
+    } else {
+      return getLibraryMacroApplicationData(member.enclosingLibrary)
+          ?.memberApplications[member];
+    }
+  }
+
+  void registerMacroApplications(
+      Features features, MacroApplications? macroApplications) {
+    if (macroApplications != null) {
+      for (Class cls in macroApplications.macros) {
+        features.addElement(Tags.appliedMacros, cls.name);
+      }
+    }
+  }
+
+  @override
+  Features computeClassValue(Id id, Class node) {
+    Features features = new Features();
+    if (getClassMacroApplicationData(node) != null) {
+      features.add(Tags.macrosAreApplied);
+    }
+    registerMacroApplications(features, getClassMacroApplications(node));
+    return features;
+  }
+
+  @override
+  Features computeLibraryValue(Id id, Library node) {
+    Features features = new Features();
+    if (macroDeclarationData.macrosAreAvailable) {
+      features.add(Tags.macrosAreAvailable);
+    }
+    if (node == compilerResult.component!.mainMethod!.enclosingLibrary) {
+      if (macroDeclarationData.compilationSequence != null) {
+        features.markAsUnsorted(Tags.compilationSequence);
+        for (List<Uri> component in macroDeclarationData.compilationSequence!) {
+          features.addElement(
+              Tags.compilationSequence, strongComponentToString(component));
+        }
+      }
+    }
+    List<String>? macroClasses =
+        macroDeclarationData.macroDeclarations[node.importUri];
+    if (macroClasses != null) {
+      for (String clsName in macroClasses) {
+        features.addElement(Tags.declaredMacros, clsName);
+      }
+    }
+    if (getLibraryMacroApplicationData(node) != null) {
+      features.add(Tags.macrosAreApplied);
+    }
+    registerMacroApplications(features, getLibraryMacroApplications(node));
+    return features;
+  }
+
+  @override
+  Features computeMemberValue(Id id, Member node) {
+    Features features = new Features();
+    registerMacroApplications(features, getMemberMacroApplications(node));
+    return features;
+  }
+}
diff --git a/pkg/front_end/test/member_covariance_test.dart b/pkg/front_end/test/member_covariance_test.dart
index 93ff6e4..a9af238 100644
--- a/pkg/front_end/test/member_covariance_test.dart
+++ b/pkg/front_end/test/member_covariance_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
-
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart';
 import 'package:front_end/src/fasta/kernel/member_covariance.dart';
diff --git a/pkg/front_end/test/memory_file_system_test.dart b/pkg/front_end/test/memory_file_system_test.dart
index 5c20d45..eb635c7 100644
--- a/pkg/front_end/test/memory_file_system_test.dart
+++ b/pkg/front_end/test/memory_file_system_test.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 // SharedOptions=--supermixin
 
-// @dart = 2.9
-
 library front_end.test.memory_file_system_test;
 
 import 'dart:convert';
@@ -32,8 +30,8 @@
 
 @reflectiveTest
 class FileTest extends _BaseTestNative {
-  String path;
-  MemoryFileSystemEntity file;
+  late String path;
+  late MemoryFileSystemEntity file;
 
   void setUp() {
     _baseSetUp();
@@ -180,7 +178,7 @@
 }
 
 abstract class MemoryFileSystemTestMixin implements _BaseTest {
-  Uri tempUri;
+  late Uri tempUri;
 
   void setUp() {
     _baseSetUp();
@@ -287,13 +285,15 @@
 class _BaseTestNative extends _BaseTest {
   @override
   final pathos.Context context = pathos.context;
-  @override
-  MemoryFileSystem fileSystem;
-  @override
-  String tempPath;
 
   @override
-  String join(String path1, String path2, [String path3, String path4]) =>
+  late MemoryFileSystem fileSystem;
+
+  @override
+  late String tempPath;
+
+  @override
+  String join(String path1, String path2, [String? path3, String? path4]) =>
       pathos.join(path1, path2, path3, path4);
 
   @override
@@ -306,13 +306,15 @@
 class _BaseTestPosix extends _BaseTest {
   @override
   final pathos.Context context = pathos.posix;
-  @override
-  MemoryFileSystem fileSystem;
-  @override
-  String tempPath;
 
   @override
-  String join(String path1, String path2, [String path3, String path4]) =>
+  late MemoryFileSystem fileSystem;
+
+  @override
+  late String tempPath;
+
+  @override
+  String join(String path1, String path2, [String? path3, String? path4]) =>
       pathos.posix.join(path1, path2, path3, path4);
 
   @override
@@ -325,13 +327,15 @@
 class _BaseTestWindows extends _BaseTest {
   @override
   final pathos.Context context = pathos.windows;
-  @override
-  MemoryFileSystem fileSystem;
-  @override
-  String tempPath;
 
   @override
-  String join(String path1, String path2, [String path3, String path4]) =>
+  late MemoryFileSystem fileSystem;
+
+  @override
+  late String tempPath;
+
+  @override
+  String join(String path1, String path2, [String? path3, String? path4]) =>
       pathos.windows.join(path1, path2, path3, path4);
 
   @override
diff --git a/pkg/front_end/test/messages_json_test.dart b/pkg/front_end/test/messages_json_test.dart
index 8df7698..b86e4b9 100644
--- a/pkg/front_end/test/messages_json_test.dart
+++ b/pkg/front_end/test/messages_json_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
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessage, getMessageUri;
 
@@ -24,17 +22,17 @@
     Severity severity = Severity.values[i];
     Code code = new Code("MyCodeName");
     Message message = new Message(code, problemMessage: '');
-    LocatedMessage locatedMessage1 =
+    LocatedMessage locatedMessage =
         new LocatedMessage(Uri.parse("what:ever/fun_1.dart"), 117, 2, message);
     FormattedMessage formattedMessage2 = new FormattedMessage(
-        null,
+        locatedMessage,
         "Formatted string Plain #2",
         "Formatted string Colorized #2",
         13,
         2,
         Severity.error, []);
     FormattedMessage formattedMessage3 = new FormattedMessage(
-        null,
+        locatedMessage,
         "Formatted string Plain #3",
         "Formatted string Colorized #3",
         313,
@@ -42,7 +40,7 @@
         Severity.error, []);
 
     FormattedMessage formattedMessage1 = new FormattedMessage(
-        locatedMessage1,
+        locatedMessage,
         "Formatted string Plain",
         "Formatted string Colorized",
         42,
@@ -90,20 +88,20 @@
   expect(a.severity, b.severity);
   expect(getMessageUri(a), getMessageUri(b));
 
-  List<Uri> uriList1 = a.involvedFiles?.toList();
-  List<Uri> uriList2 = b.involvedFiles?.toList();
+  List<Uri>? uriList1 = a.involvedFiles?.toList();
+  List<Uri>? uriList2 = b.involvedFiles?.toList();
   expect(uriList1?.length, uriList2?.length);
   if (uriList1 != null) {
     for (int i = 0; i < uriList1.length; i++) {
-      expect(uriList1[i], uriList2[i]);
+      expect(uriList1[i], uriList2![i]);
     }
   }
 
-  String string1 = a.codeName;
-  String string2 = b.codeName;
+  String? string1 = a.codeName;
+  String? string2 = b.codeName;
   expect(string1, string2);
 }
 
-void expect(Object actual, Object expect) {
+void expect(Object? actual, Object? expect) {
   if (expect != actual) throw "Expected $expect got $actual";
 }
diff --git a/pkg/front_end/test/mixin_export_test.dart b/pkg/front_end/test/mixin_export_test.dart
index ff1f579..5fafac7 100644
--- a/pkg/front_end/test/mixin_export_test.dart
+++ b/pkg/front_end/test/mixin_export_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
-
 import 'package:async_helper/async_helper.dart' show asyncTest;
 
 import 'package:front_end/src/testing/compiler_common.dart';
diff --git a/pkg/front_end/test/mock_file_system.dart b/pkg/front_end/test/mock_file_system.dart
new file mode 100644
index 0000000..60e45be
--- /dev/null
+++ b/pkg/front_end/test/mock_file_system.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:front_end/src/api_prototype/file_system.dart';
+
+class MockFileSystem implements FileSystem {
+  final String? scheme;
+
+  const MockFileSystem({this.scheme});
+
+  @override
+  FileSystemEntity entityForUri(Uri uri) {
+    if (scheme != null && uri.scheme != scheme) throw "unsupported";
+    return new MockFileSystemEntity(uri, this);
+  }
+}
+
+class MockFileSystemEntity implements FileSystemEntity {
+  @override
+  final Uri uri;
+  final FileSystem fileSystem;
+  MockFileSystemEntity(this.uri, this.fileSystem);
+
+  @override
+  dynamic noSuchMethod(m) => super.noSuchMethod(m);
+}
diff --git a/pkg/front_end/test/multiple_simultaneous_compiles_test.dart b/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
index df42515..85d1d8c 100644
--- a/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
+++ b/pkg/front_end/test/multiple_simultaneous_compiles_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:io' show File, Platform;
 
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart'
+    show IncrementalCompilerResult;
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
 
@@ -27,7 +27,7 @@
   List<Future> futures = [];
   List<int> compilesLeft = new List<int>.filled(5, 8);
   for (int i = 0; i < compilesLeft.length; i++) {
-    Future<Component> compileAgain() async {
+    Future<Component?> compileAgain() async {
       print("$i has ${compilesLeft[i]} left.");
       if (compilesLeft[i] > 0) {
         compilesLeft[i]--;
@@ -56,13 +56,13 @@
       "(with the same compiler) (without crashing)");
 }
 
-List<IncrementalCompiler> compilers = [];
+List<IncrementalCompiler?> compilers = [];
 
 Future<Component> compile(int compilerNum, Uri uri) async {
   if (compilers.length <= compilerNum) {
     compilers.length = compilerNum + 1;
   }
-  IncrementalCompiler compiler = compilers[compilerNum];
+  IncrementalCompiler? compiler = compilers[compilerNum];
   if (compiler == null) {
     var options = getOptions();
     compiler = new IncrementalCompiler(new CompilerContext(
@@ -71,7 +71,8 @@
   } else {
     compiler.invalidateAllSources();
   }
-  Component result = await compiler.computeDelta();
+  IncrementalCompilerResult compilerResult = await compiler.computeDelta();
+  Component result = compilerResult.component;
   print("Now compile is done!");
   return result;
 }
diff --git a/pkg/front_end/test/outline_extractor_suite.dart b/pkg/front_end/test/outline_extractor_suite.dart
new file mode 100644
index 0000000..f022e0c
--- /dev/null
+++ b/pkg/front_end/test/outline_extractor_suite.dart
@@ -0,0 +1,315 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert' show jsonDecode;
+
+import 'dart:io' show File;
+
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
+import 'package:front_end/src/fasta/util/outline_extractor.dart';
+import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
+import 'package:testing/testing.dart'
+    show
+        Chain,
+        ChainContext,
+        ExpectationSet,
+        Result,
+        Step,
+        TestDescription,
+        runMe;
+import 'package:kernel/src/equivalence.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/memory_file_system.dart';
+import 'package:kernel/ast.dart';
+
+import 'fasta/testing/suite.dart' show UPDATE_EXPECTATIONS;
+import 'utils/kernel_chain.dart' show MatchContext;
+
+import 'testing_utils.dart' show checkEnvironment;
+
+import 'incremental_suite.dart' as helper;
+
+const String EXPECTATIONS = '''
+[
+  {
+    "name": "ExpectationFileMismatch",
+    "group": "Fail"
+  },
+  {
+    "name": "ExpectationFileMissing",
+    "group": "Fail"
+  }
+]
+''';
+
+void main([List<String> arguments = const []]) =>
+    runMe(arguments, createContext, configurationPath: "../testing.json");
+
+Future<Context> createContext(
+    Chain suite, Map<String, String> environment) async {
+  const Set<String> knownEnvironmentKeys = {
+    "updateExpectations",
+  };
+  checkEnvironment(environment, knownEnvironmentKeys);
+
+  bool updateExpectations = environment["updateExpectations"] == "true";
+
+  return new Context(suite.name, updateExpectations);
+}
+
+class Context extends ChainContext with MatchContext {
+  @override
+  final bool updateExpectations;
+
+  @override
+  String get updateExpectationsOption => '${UPDATE_EXPECTATIONS}=true';
+
+  @override
+  bool get canBeFixWithUpdateExpectations => true;
+
+  final String suiteName;
+
+  Context(this.suiteName, this.updateExpectations);
+
+  @override
+  final List<Step> steps = const <Step>[
+    const OutlineExtractorStep(),
+    const CompileAndCompareStep(),
+  ];
+
+  @override
+  final ExpectationSet expectationSet =
+      new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
+
+  // Override special handling of negative tests.
+  @override
+  Result processTestResult(
+      TestDescription description, Result result, bool last) {
+    return result;
+  }
+}
+
+class OutlineExtractorStep
+    extends Step<TestDescription, TestDescription, Context> {
+  const OutlineExtractorStep();
+
+  @override
+  String get name => "OutlineExtractorStep";
+
+  @override
+  Future<Result<TestDescription>> run(
+      TestDescription description, Context context) async {
+    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(".");
+    Uri dartBase = Uri.base;
+
+    for (MapEntry<Uri, String> entry in result.entries) {
+      sb.writeln("${entry.key}:");
+      sb.writeln(entry.value);
+      sb.writeln("\n\n");
+    }
+
+    String actual = sb.toString();
+    actual = actual.replaceAll("$base", "org-dartlang-testcase:///");
+    actual = actual.replaceAll("$dartBase", "org-dartlang-testcase-sdk:///");
+    actual = actual.replaceAll("\\n", "\n");
+
+    return context.match<TestDescription>(
+      ".outline_extracted",
+      actual,
+      description.uri,
+      description,
+    );
+  }
+}
+
+class CompileAndCompareStep
+    extends Step<TestDescription, TestDescription, Context> {
+  const CompileAndCompareStep();
+
+  @override
+  String get name => "CompileAndCompare";
+
+  @override
+  Future<Result<TestDescription>> run(
+      TestDescription description, Context context) async {
+    Uri? packages = description.uri.resolve(".packages");
+    if (!new File.fromUri(packages).existsSync()) {
+      packages = null;
+    }
+    Map<Uri, String> processedFiles =
+        await extractOutline([description.uri], packages: packages);
+
+    void onDiagnostic(DiagnosticMessage message) {
+      if (message.codeName == "InferredPackageUri") return;
+      if (message.severity == Severity.error ||
+          message.severity == Severity.warning) {
+        throw ("Unexpected error: ${message.plainTextFormatted.join('\n')}");
+      }
+    }
+
+    Library lib1;
+    {
+      CompilerOptions options = helper.getOptions();
+      options.onDiagnostic = onDiagnostic;
+      options.packagesFileUri = packages;
+      helper.TestIncrementalCompiler compiler =
+          new helper.TestIncrementalCompiler(options, description.uri,
+              /* initializeFrom = */ null, /* outlineOnly = */ true);
+      IncrementalCompilerResult c = await compiler.computeDelta();
+      lib1 = c.component.libraries
+          .firstWhere((element) => element.fileUri == description.uri);
+    }
+    Library lib2;
+    {
+      CompilerOptions options = helper.getOptions();
+      options.onDiagnostic = onDiagnostic;
+      options.packagesFileUri = packages;
+      MemoryFileSystem mfs = new MemoryFileSystem(Uri.base);
+      if (packages != null) {
+        mfs.entityForUri(packages).writeAsBytesSync(
+            await options.fileSystem.entityForUri(packages).readAsBytes());
+      }
+      if (options.sdkSummary != null) {
+        mfs.entityForUri(options.sdkSummary!).writeAsBytesSync(await options
+            .fileSystem
+            .entityForUri(options.sdkSummary!)
+            .readAsBytes());
+      }
+      if (options.librariesSpecificationUri != null) {
+        mfs.entityForUri(options.librariesSpecificationUri!).writeAsBytesSync(
+            await options.fileSystem
+                .entityForUri(options.librariesSpecificationUri!)
+                .readAsBytes());
+      }
+      for (MapEntry<Uri, String> entry in processedFiles.entries) {
+        mfs.entityForUri(entry.key).writeAsStringSync(entry.value);
+      }
+      options.fileSystem = mfs;
+      helper.TestIncrementalCompiler compiler =
+          new helper.TestIncrementalCompiler(options, description.uri,
+              /* initializeFrom = */ null, /* outlineOnly = */ true);
+      IncrementalCompilerResult c = await compiler.computeDelta();
+      lib2 = c.component.libraries
+          .firstWhere((element) => element.fileUri == description.uri);
+    }
+    EquivalenceResult result =
+        checkEquivalence(lib1, lib2, strategy: const Strategy());
+
+    if (result.isEquivalent) {
+      return new Result<TestDescription>.pass(description);
+    } else {
+      print("Bad:");
+      print(result);
+      return new Result<TestDescription>.fail(
+          description, /* error = */ result);
+    }
+  }
+}
+
+class Strategy extends EquivalenceStrategy {
+  const Strategy();
+
+  @override
+  bool checkTreeNode_fileOffset(
+      EquivalenceVisitor visitor, TreeNode node, TreeNode other) {
+    return true;
+  }
+
+  @override
+  bool checkAssertStatement_conditionStartOffset(
+      EquivalenceVisitor visitor, AssertStatement node, AssertStatement other) {
+    return true;
+  }
+
+  @override
+  bool checkAssertStatement_conditionEndOffset(
+      EquivalenceVisitor visitor, AssertStatement node, AssertStatement other) {
+    return true;
+  }
+
+  @override
+  bool checkClass_startFileOffset(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    return true;
+  }
+
+  @override
+  bool checkClass_fileEndOffset(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    return true;
+  }
+
+  @override
+  bool checkProcedure_startFileOffset(
+      EquivalenceVisitor visitor, Procedure node, Procedure other) {
+    return true;
+  }
+
+  @override
+  bool checkConstructor_startFileOffset(
+      EquivalenceVisitor visitor, Constructor node, Constructor other) {
+    return true;
+  }
+
+  @override
+  bool checkMember_fileEndOffset(
+      EquivalenceVisitor visitor, Member node, Member other) {
+    return true;
+  }
+
+  @override
+  bool checkFunctionNode_fileEndOffset(
+      EquivalenceVisitor visitor, FunctionNode node, FunctionNode other) {
+    return true;
+  }
+
+  @override
+  bool checkBlock_fileEndOffset(
+      EquivalenceVisitor visitor, Block node, Block other) {
+    return true;
+  }
+
+  @override
+  bool checkLibrary_additionalExports(
+      EquivalenceVisitor visitor, Library node, Library other) {
+    return visitor.checkSets(
+        node.additionalExports.toSet(),
+        other.additionalExports.toSet(),
+        visitor.matchReferences,
+        visitor.checkReferences,
+        'additionalExports');
+  }
+
+  @override
+  bool checkClass_procedures(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    // Check procedures as a set instead of a list to allow for reordering.
+    List<Procedure> a = node.procedures.toList();
+    int sorter(Procedure x, Procedure y) {
+      int result = x.name.text.compareTo(y.name.text);
+      if (result != 0) return result;
+      result = x.kind.index - y.kind.index;
+      if (result != 0) return result;
+      // other stuff?
+      return 0;
+    }
+
+    a.sort(sorter);
+    List<Procedure> b = other.procedures.toList();
+    b.sort(sorter);
+    // return visitor.checkSets(a.toSet(), b.toSet(),
+    //     visitor.matchNamedNodes, visitor.checkNodes, 'procedures');
+
+    return visitor.checkLists(a, b, visitor.checkNodes, 'procedures');
+  }
+}
diff --git a/pkg/front_end/test/outline_extractor_tester.dart b/pkg/front_end/test/outline_extractor_tester.dart
new file mode 100644
index 0000000..941b5c0
--- /dev/null
+++ b/pkg/front_end/test/outline_extractor_tester.dart
@@ -0,0 +1,301 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
+import 'package:front_end/src/api_prototype/memory_file_system.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/src/equivalence.dart';
+import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
+import 'package:kernel/target/targets.dart';
+import 'incremental_suite.dart' as helper;
+import 'package:front_end/src/fasta/util/outline_extractor.dart';
+import 'package:package_config/package_config.dart';
+
+Future<void> main(List<String> args) async {
+  if (args.length != 1) throw "Wants 1 argument.";
+  Uri input = Uri.base.resolve(args.single);
+  Uri packageUri = input.resolve(".packages");
+  Stopwatch stopwatch = new Stopwatch()..start();
+  PackageConfig packageFile = await loadPackageConfigUri(packageUri);
+  print("Read packages file in ${stopwatch.elapsedMilliseconds} ms");
+  List<Package> packages = packageFile.packages.toList();
+  int packageNum = 0;
+  for (Package package in packages) {
+    packageNum++;
+    print("\n\nProcessing package #$packageNum (${package.name}) "
+        "of ${packages.length}");
+    Directory dir = new Directory.fromUri(package.packageUriRoot);
+    List<Uri> uris = [];
+    for (FileSystemEntity entry in dir.listSync(recursive: true)) {
+      if (entry is File && entry.path.endsWith(".dart")) {
+        // Hack.
+        String content = entry.readAsStringSync();
+        if (content.contains("part of")) continue;
+        String asString = "${entry.uri}";
+        String packageName = package.name;
+        Uri packageUri = package.packageUriRoot;
+        String prefix = "${packageUri}";
+        if (asString.startsWith(prefix)) {
+          Uri reversed = Uri.parse(
+              "package:$packageName/${asString.substring(prefix.length)}");
+          uris.add(reversed);
+        } else {
+          throw "Unexpected!";
+        }
+      }
+    }
+    print("(found ${uris.length} files)");
+    if (uris.isEmpty) continue;
+    await processUri(uris, null, packageUri);
+  }
+  print(" => That's ${packages.length} packages!");
+
+  if (1 + 1 == 2) return;
+
+  Component fullComponent = await processUri([input], null, packageUri);
+  List<Uri> uris = fullComponent.libraries.map((l) => l.importUri).toList();
+  int i = 0;
+  for (Uri uri in uris) {
+    i++;
+    print("\n\nProcessing $uri (${i} of ${uris.length})");
+    try {
+      await processUri([uri], fullComponent, packageUri);
+    } catch (e, st) {
+      print("\n\n-------------\n\n");
+      print("Crashed on uri $uri");
+      print("Exception: '$e'");
+      print(st);
+      print("\n\n-------------\n\n");
+    }
+  }
+}
+
+Future<Component> processUri(final List<Uri> inputs, Component? fullComponent,
+    final Uri packageUri) async {
+  TargetFlags targetFlags =
+      new TargetFlags(enableNullSafety: true, trackWidgetCreation: false);
+  Target? target = new Dart2jsTarget("dart2js", targetFlags);
+  Uri sdkSummary = Uri.base.resolve("out/ReleaseX64/dart2js_outline.dill");
+  Stopwatch stopwatch = new Stopwatch()..start();
+  Stopwatch extractCompile = new Stopwatch()..start();
+  Map<Uri, String> processedFiles = await extractOutline(inputs,
+      packages: packageUri, target: target, platform: sdkSummary);
+  extractCompile.stop();
+  print("Got ${processedFiles.keys.length} files "
+      "in ${stopwatch.elapsedMilliseconds} ms");
+
+  Set<Uri> inputsSet = inputs.toSet();
+
+  Stopwatch plainCompile = new Stopwatch()..start();
+  List<Library> libs1;
+  {
+    stopwatch.reset();
+    CompilerOptions options = helper.getOptions();
+    options.target = target;
+    options.sdkSummary = sdkSummary;
+    options.packagesFileUri = packageUri;
+    helper.TestIncrementalCompiler compiler =
+        new helper.TestIncrementalCompiler(options, inputs.first,
+            /* initializeFrom = */ null, /* outlineOnly = */ true);
+    fullComponent = fullComponent ??
+        (await compiler.computeDelta(entryPoints: inputs)).component;
+    print("Compiled full in ${stopwatch.elapsedMilliseconds} ms "
+        "to ${fullComponent.libraries.length} libraries");
+    plainCompile.stop();
+
+    libs1 = fullComponent.libraries
+        .where((element) => inputsSet.contains(element.importUri))
+        .toList();
+  }
+  List<Library> libs2;
+  {
+    stopwatch.reset();
+    extractCompile.start();
+    CompilerOptions options = helper.getOptions();
+    options.target = target;
+    options.sdkSummary = sdkSummary;
+    options.packagesFileUri = packageUri;
+    MemoryFileSystem mfs = new MemoryFileSystem(Uri.base);
+    mfs.entityForUri(packageUri).writeAsBytesSync(
+        await options.fileSystem.entityForUri(packageUri).readAsBytes());
+    if (options.sdkSummary != null) {
+      mfs.entityForUri(options.sdkSummary!).writeAsBytesSync(await options
+          .fileSystem
+          .entityForUri(options.sdkSummary!)
+          .readAsBytes());
+    }
+    if (options.librariesSpecificationUri != null) {
+      mfs.entityForUri(options.librariesSpecificationUri!).writeAsBytesSync(
+          await options.fileSystem
+              .entityForUri(options.librariesSpecificationUri!)
+              .readAsBytes());
+    }
+    for (MapEntry<Uri, String> entry in processedFiles.entries) {
+      mfs.entityForUri(entry.key).writeAsStringSync(entry.value);
+    }
+    options.fileSystem = mfs;
+    helper.TestIncrementalCompiler compiler =
+        new helper.TestIncrementalCompiler(options, inputs.first,
+            /* initializeFrom = */ null, /* outlineOnly = */ true);
+    IncrementalCompilerResult c =
+        await compiler.computeDelta(entryPoints: inputs);
+    print("Compiled outlined in ${stopwatch.elapsedMilliseconds} ms "
+        "to ${c.component.libraries.length} libraries");
+    extractCompile.stop();
+
+    libs2 = c.component.libraries
+        .where((element) => inputsSet.contains(element.importUri))
+        .toList();
+  }
+
+  int libSorter(Library a, Library b) {
+    return a.importUri.toString().compareTo(b.importUri.toString());
+  }
+
+  libs1.sort(libSorter);
+  libs2.sort(libSorter);
+  if (libs1.length != libs2.length) {
+    print("Bad:");
+    print(
+        "Not the same amount of libraries: ${libs1.length} vs ${libs2.length}");
+    throw "bad result for $inputs";
+  }
+  List<EquivalenceResult> badResults = [];
+  for (int i = 0; i < libs1.length; i++) {
+    EquivalenceResult result =
+        checkEquivalence(libs1[i], libs2[i], strategy: const Strategy());
+    if (!result.isEquivalent) {
+      badResults.add(result);
+    }
+  }
+
+  if (badResults.isEmpty) {
+    print("OK");
+  } else {
+    print("Bad:");
+    for (EquivalenceResult badResult in badResults) {
+      print(badResult);
+      print("---");
+    }
+    // globalDebuggingNames = new NameSystem();
+    // print(lib1.leakingDebugToString());
+    // print("\n---\nvs\n----\n");
+    // globalDebuggingNames = new NameSystem();
+    // print(lib2.leakingDebugToString());
+    throw "bad result for $inputs";
+  }
+
+  if (plainCompile.elapsedMilliseconds > extractCompile.elapsedMilliseconds) {
+    print("=> Plain compile slower! "
+        "(${plainCompile.elapsedMilliseconds} vs "
+        "${extractCompile.elapsedMilliseconds})");
+  } else {
+    print("=> Plain compile faster! "
+        "(${plainCompile.elapsedMilliseconds} vs "
+        "${extractCompile.elapsedMilliseconds})");
+  }
+
+  return fullComponent;
+}
+
+class Strategy extends EquivalenceStrategy {
+  const Strategy();
+
+  @override
+  bool checkTreeNode_fileOffset(
+      EquivalenceVisitor visitor, TreeNode node, TreeNode other) {
+    return true;
+  }
+
+  @override
+  bool checkAssertStatement_conditionStartOffset(
+      EquivalenceVisitor visitor, AssertStatement node, AssertStatement other) {
+    return true;
+  }
+
+  @override
+  bool checkAssertStatement_conditionEndOffset(
+      EquivalenceVisitor visitor, AssertStatement node, AssertStatement other) {
+    return true;
+  }
+
+  @override
+  bool checkClass_startFileOffset(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    return true;
+  }
+
+  @override
+  bool checkClass_fileEndOffset(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    return true;
+  }
+
+  @override
+  bool checkProcedure_startFileOffset(
+      EquivalenceVisitor visitor, Procedure node, Procedure other) {
+    return true;
+  }
+
+  @override
+  bool checkConstructor_startFileOffset(
+      EquivalenceVisitor visitor, Constructor node, Constructor other) {
+    return true;
+  }
+
+  @override
+  bool checkMember_fileEndOffset(
+      EquivalenceVisitor visitor, Member node, Member other) {
+    return true;
+  }
+
+  @override
+  bool checkFunctionNode_fileEndOffset(
+      EquivalenceVisitor visitor, FunctionNode node, FunctionNode other) {
+    return true;
+  }
+
+  @override
+  bool checkBlock_fileEndOffset(
+      EquivalenceVisitor visitor, Block node, Block other) {
+    return true;
+  }
+
+  @override
+  bool checkLibrary_additionalExports(
+      EquivalenceVisitor visitor, Library node, Library other) {
+    return visitor.checkSets(
+        node.additionalExports.toSet(),
+        other.additionalExports.toSet(),
+        visitor.matchReferences,
+        visitor.checkReferences,
+        'additionalExports');
+  }
+
+  @override
+  bool checkClass_procedures(
+      EquivalenceVisitor visitor, Class node, Class other) {
+    // Check procedures as a set instead of a list to allow for reordering.
+    List<Procedure> a = node.procedures.toList();
+    int sorter(Procedure x, Procedure y) {
+      int result = x.name.text.compareTo(y.name.text);
+      if (result != 0) return result;
+      result = x.kind.index - y.kind.index;
+      if (result != 0) return result;
+      // other stuff?
+      return 0;
+    }
+
+    a.sort(sorter);
+    List<Procedure> b = other.procedures.toList();
+    b.sort(sorter);
+    // return visitor.checkSets(a.toSet(), b.toSet(),
+    //     visitor.matchNamedNodes, visitor.checkNodes, 'procedures');
+
+    return visitor.checkLists(a, b, visitor.checkNodes, 'procedures');
+  }
+}
diff --git a/pkg/front_end/test/packages_format_error_test.dart b/pkg/front_end/test/packages_format_error_test.dart
index a9fa5f3..a19551f 100644
--- a/pkg/front_end/test/packages_format_error_test.dart
+++ b/pkg/front_end/test/packages_format_error_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
-
 import 'package:_fe_analyzer_shared/src/messages/diagnostic_message.dart'
     show DiagnosticMessage, getMessageCodeObject;
 
diff --git a/pkg/front_end/test/parser_all_suite.dart b/pkg/front_end/test/parser_all_suite.dart
index 9aab3a5..bef7873 100644
--- a/pkg/front_end/test/parser_all_suite.dart
+++ b/pkg/front_end/test/parser_all_suite.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:testing/testing.dart' show Chain, ChainContext, runMe;
 
 import 'parser_suite.dart';
diff --git a/pkg/front_end/test/parser_equivalence_suite.dart b/pkg/front_end/test/parser_equivalence_suite.dart
index 5e4d772..b35a7b3 100644
--- a/pkg/front_end/test/parser_equivalence_suite.dart
+++ b/pkg/front_end/test/parser_equivalence_suite.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 'dart:io';
 
 import "package:yaml/yaml.dart" show YamlMap, loadYamlNode;
@@ -53,13 +51,13 @@
       TestDescription description, Context context) {
     Uri uri = description.uri;
     String contents = new File.fromUri(uri).readAsStringSync();
-    YamlMap yaml = loadYamlNode(contents, sourceUrl: uri);
+    YamlMap yaml = loadYamlNode(contents, sourceUrl: uri) as YamlMap;
     List<Uri> files =
         (yaml["files"] as List).map((s) => uri.resolve(s)).toList();
     Set<String> filters = new Set<String>.from(yaml["filters"] ?? []);
     Set<String> ignored = new Set<String>.from(yaml["ignored"] ?? []);
 
-    ParserTestListenerWithMessageFormatting parserTestListenerFirst =
+    ParserTestListenerWithMessageFormatting? parserTestListenerFirst =
         ListenerStep.doListenerParsing(
       files[0],
       context.suiteName,
@@ -70,7 +68,7 @@
     }
 
     for (int i = 1; i < files.length; i++) {
-      ParserTestListenerWithMessageFormatting parserTestListener =
+      ParserTestListenerWithMessageFormatting? parserTestListener =
           ListenerStep.doListenerParsing(
         files[i],
         context.suiteName,
@@ -79,7 +77,7 @@
       if (parserTestListener == null) {
         return Future.value(crash(description, StackTrace.current));
       }
-      String compareResult = compare(
+      String? compareResult = compare(
           parserTestListenerFirst, parserTestListener, filters, ignored);
       if (compareResult != null) {
         return Future.value(
@@ -90,7 +88,7 @@
     return new Future.value(new Result<TestDescription>.pass(description));
   }
 
-  String compare(
+  String? compare(
       ParserTestListenerWithMessageFormatting a,
       ParserTestListenerWithMessageFormatting b,
       Set<String> filters,
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index cb24755..5910e30 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -15,7 +15,7 @@
 import 'package:front_end/src/fasta/source/diet_parser.dart'
     show useImplicitCreationExpressionInCfe;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart' show getAST;
+import 'package:front_end/src/fasta/util/parser_ast.dart' show getAST;
 
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show Parser, lengthOfSpan;
@@ -29,8 +29,8 @@
 import 'package:front_end/src/fasta/source/stack_listener_impl.dart'
     show offsetForToken;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart'
-    show DirectParserASTContent;
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart'
+    show ParserAstNode;
 
 import 'package:kernel/ast.dart';
 
@@ -144,7 +144,7 @@
   @override
   final List<Step> steps = const <Step>[
     const ListenerStep(false),
-    const DirectParserASTStep(),
+    const ParserAstStep(),
   ];
 
   @override
@@ -159,18 +159,17 @@
   }
 }
 
-class DirectParserASTStep
-    extends Step<TestDescription, TestDescription, Context> {
-  const DirectParserASTStep();
+class ParserAstStep extends Step<TestDescription, TestDescription, Context> {
+  const ParserAstStep();
   @override
-  String get name => "DirectParserAST";
+  String get name => "ParserAst";
   @override
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) {
     Uri uri = description.uri;
     File f = new File.fromUri(uri);
     List<int> rawBytes = f.readAsBytesSync();
-    DirectParserASTContent ast = getAST(rawBytes);
+    ParserAstNode ast = getAST(rawBytes);
     if (ast.what != "CompilationUnit") {
       throw "Expected a single element for 'CompilationUnit' "
           "but got ${ast.what}";
diff --git a/pkg/front_end/test/parser_test_listener.dart b/pkg/front_end/test/parser_test_listener.dart
index f82cd95..65979d9 100644
--- a/pkg/front_end/test/parser_test_listener.dart
+++ b/pkg/front_end/test/parser_test_listener.dart
@@ -199,11 +199,17 @@
   }
 
   @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     seen(begin);
     seen(abstractToken);
+    seen(macroToken);
     seen(name);
-    doPrint('beginClassDeclaration(' '$begin, ' '$abstractToken, ' '$name)');
+    doPrint('beginClassDeclaration('
+        '$begin, '
+        '$abstractToken, '
+        '$macroToken, '
+        '$name)');
     indent++;
   }
 
@@ -214,12 +220,9 @@
   }
 
   @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
+  void handleImplements(Token? implementsKeyword, int interfacesCount) {
     seen(implementsKeyword);
-    doPrint('handleClassOrMixinImplements('
-        '$implementsKeyword, '
-        '$interfacesCount)');
+    doPrint('handleImplements(' '$implementsKeyword, ' '$interfacesCount)');
   }
 
   @override
@@ -450,11 +453,60 @@
   }
 
   @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+  void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
     indent--;
     seen(enumKeyword);
     seen(leftBrace);
-    doPrint('endEnum(' '$enumKeyword, ' '$leftBrace, ' '$count)');
+    doPrint('endEnum(' '$enumKeyword, ' '$leftBrace, ' '$memberCount)');
+  }
+
+  @override
+  void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    indent--;
+    seen(getOrSet);
+    seen(beginToken);
+    seen(beginParam);
+    seen(beginInitializers);
+    seen(endToken);
+    doPrint('endEnumConstructor('
+        '$getOrSet, '
+        '$beginToken, '
+        '$beginParam, '
+        '$beginInitializers, '
+        '$endToken)');
+  }
+
+  @override
+  void handleEnumElements(Token elementsEndToken, int elementsCount) {
+    seen(elementsEndToken);
+    doPrint('handleEnumElements(' '$elementsEndToken, ' '$elementsCount)');
+  }
+
+  @override
+  void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+    seen(enumKeyword);
+    seen(leftBrace);
+    doPrint('handleEnumHeader(' '$enumKeyword, ' '$leftBrace)');
+  }
+
+  @override
+  void handleEnumElement(Token beginToken) {
+    seen(beginToken);
+    doPrint('handleEnumElement(' '$beginToken)');
+  }
+
+  @override
+  void endEnumFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    indent--;
+    seen(beginToken);
+    seen(factoryKeyword);
+    seen(endToken);
+    doPrint('endEnumFactoryMethod('
+        '$beginToken, '
+        '$factoryKeyword, '
+        '$endToken)');
   }
 
   @override
@@ -556,7 +608,8 @@
   @override
   void endFormalParameter(
       Token? thisKeyword,
-      Token? periodAfterThis,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
       Token? initializerStart,
       Token? initializerEnd,
@@ -564,13 +617,15 @@
       MemberKind memberKind) {
     indent--;
     seen(thisKeyword);
-    seen(periodAfterThis);
+    seen(superKeyword);
+    seen(periodAfterThisOrSuper);
     seen(nameToken);
     seen(initializerStart);
     seen(initializerEnd);
     doPrint('endFormalParameter('
         '$thisKeyword, '
-        '$periodAfterThis, '
+        '$superKeyword, '
+        '$periodAfterThisOrSuper, '
         '$nameToken, '
         '$initializerStart, '
         '$initializerEnd, '
@@ -701,6 +756,55 @@
   }
 
   @override
+  void endEnumFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    indent--;
+    seen(abstractToken);
+    seen(externalToken);
+    seen(staticToken);
+    seen(covariantToken);
+    seen(lateToken);
+    seen(varFinalOrConst);
+    seen(beginToken);
+    seen(endToken);
+    doPrint('endEnumFields('
+        '$abstractToken, '
+        '$externalToken, '
+        '$staticToken, '
+        '$covariantToken, '
+        '$lateToken, '
+        '$varFinalOrConst, '
+        '$count, '
+        '$beginToken, '
+        '$endToken)');
+  }
+
+  @override
+  void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    indent--;
+    seen(getOrSet);
+    seen(beginToken);
+    seen(beginParam);
+    seen(beginInitializers);
+    seen(endToken);
+    doPrint('endEnumMethod('
+        '$getOrSet, '
+        '$beginToken, '
+        '$beginParam, '
+        '$beginInitializers, '
+        '$endToken)');
+  }
+
+  @override
   void handleForInitializerEmptyStatement(Token token) {
     seen(token);
     doPrint('handleForInitializerEmptyStatement(' '$token)');
@@ -907,13 +1011,28 @@
   }
 
   @override
+  void handleEnumWithClause(Token withKeyword) {
+    seen(withKeyword);
+    doPrint('handleEnumWithClause(' '$withKeyword)');
+  }
+
+  @override
+  void handleEnumNoWithClause() {
+    doPrint('handleEnumNoWithClause()');
+  }
+
+  @override
   void beginNamedMixinApplication(
-      Token begin, Token? abstractToken, Token name) {
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     seen(begin);
     seen(abstractToken);
+    seen(macroToken);
     seen(name);
-    doPrint(
-        'beginNamedMixinApplication(' '$begin, ' '$abstractToken, ' '$name)');
+    doPrint('beginNamedMixinApplication('
+        '$begin, '
+        '$abstractToken, '
+        '$macroToken, '
+        '$name)');
     indent++;
   }
 
@@ -2308,6 +2427,12 @@
   }
 
   @override
+  void handleNoTypeNameInConstructorReference(Token token) {
+    seen(token);
+    doPrint('handleNoTypeNameInConstructorReference(' '$token)');
+  }
+
+  @override
   void handleNoType(Token lastConsumed) {
     seen(lastConsumed);
     doPrint('handleNoType(' '$lastConsumed)');
@@ -2545,16 +2670,25 @@
 
   @override
   void handleCommentReference(
-      Token? newKeyword, Token? prefix, Token? period, Token token) {
+      Token? newKeyword,
+      Token? firstToken,
+      Token? firstPeriod,
+      Token? secondToken,
+      Token? secondPeriod,
+      Token thirdToken) {
     seen(newKeyword);
-    seen(prefix);
-    seen(period);
-    seen(token);
+    seen(firstToken);
+    seen(firstPeriod);
+    seen(secondToken);
+    seen(secondPeriod);
+    seen(thirdToken);
     doPrint('handleCommentReference('
         '$newKeyword, '
-        '$prefix, '
-        '$period, '
-        '$token)');
+        '$firstToken, '
+        '$firstPeriod, '
+        '$secondToken, '
+        '$secondPeriod, '
+        '$thirdToken)');
   }
 
   @override
diff --git a/pkg/front_end/test/parser_test_listener_creator.dart b/pkg/front_end/test/parser_test_listener_creator.dart
index c2c6df4..61ba320 100644
--- a/pkg/front_end/test/parser_test_listener_creator.dart
+++ b/pkg/front_end/test/parser_test_listener_creator.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 'dart:io' show File;
 import 'dart:typed_data' show Uint8List;
 
@@ -120,15 +118,16 @@
 class ParserCreatorListener extends Listener {
   final StringSink out;
   bool insideListenerClass = false;
-  String currentMethodName;
-  String latestSeenParameterTypeToken;
-  List<String> parameters = <String>[];
-  List<String> parameterTypes = <String>[];
+  String? currentMethodName;
+  String? latestSeenParameterTypeToken;
+  List<String> parameters = [];
+  List<String?> parameterTypes = [];
 
   ParserCreatorListener(this.out);
 
   @override
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     if (name.lexeme == "Listener") insideListenerClass = true;
   }
 
@@ -140,23 +139,23 @@
   @override
   void beginMethod(
       DeclarationKind declarationKind,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token varFinalOrConst,
-      Token getOrSet,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
       Token name) {
     currentMethodName = name.lexeme;
   }
 
   @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     if (insideListenerClass) {
       out.writeln("  @override");
       out.write("  ");
       Token token = beginToken;
-      Token latestToken;
+      Token? latestToken;
       while (true) {
         if (latestToken != null && latestToken.charEnd < token.charOffset) {
           out.write(" ");
@@ -171,14 +170,14 @@
           throw token.runtimeType;
         }
         latestToken = token;
-        token = token.next;
+        token = token.next!;
       }
 
       if (token is SimpleToken && token.type == TokenType.FUNCTION) {
         out.write(" null;");
       } else {
         out.write("\n    ");
-        if (currentMethodName.startsWith("end")) {
+        if (currentMethodName!.startsWith("end")) {
           out.write("indent--;\n    ");
         }
         for (int i = 0; i < parameterTypes.length; i++) {
@@ -196,7 +195,7 @@
         }
         out.write(")');\n  ");
 
-        if (currentMethodName.startsWith("begin")) {
+        if (currentMethodName!.startsWith("begin")) {
           out.write("  indent++;\n  ");
         }
 
@@ -224,17 +223,18 @@
   }
 
   @override
-  void handleType(Token beginToken, Token questionMark) {
+  void handleType(Token beginToken, Token? questionMark) {
     latestSeenParameterTypeToken = beginToken.lexeme;
   }
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     parameters.add(nameToken.lexeme);
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
index a6ba2ca..9a545e4 100644
--- a/pkg/front_end/test/parser_test_parser.dart
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -189,15 +189,16 @@
   }
 
   @override
-  Token parseTopLevelKeywordDeclaration(
-      Token start, Token keyword, DirectiveContext? directiveState) {
+  Token parseTopLevelKeywordDeclaration(Token start, Token keyword,
+      Token? macroToken, DirectiveContext? directiveState) {
     doPrint('parseTopLevelKeywordDeclaration('
         '$start, '
         '$keyword, '
+        '$macroToken, '
         '$directiveState)');
     indent++;
-    var result =
-        super.parseTopLevelKeywordDeclaration(start, keyword, directiveState);
+    var result = super.parseTopLevelKeywordDeclaration(
+        start, keyword, macroToken, directiveState);
     indent--;
     return result;
   }
@@ -392,10 +393,19 @@
   }
 
   @override
-  Token parseWithClauseOpt(Token token) {
-    doPrint('parseWithClauseOpt(' '$token)');
+  Token parseClassWithClauseOpt(Token token) {
+    doPrint('parseClassWithClauseOpt(' '$token)');
     indent++;
-    var result = super.parseWithClauseOpt(token);
+    var result = super.parseClassWithClauseOpt(token);
+    indent--;
+    return result;
+  }
+
+  @override
+  Token parseEnumWithClauseOpt(Token token) {
+    doPrint('parseEnumWithClauseOpt(' '$token)');
+    indent++;
+    var result = super.parseEnumWithClauseOpt(token);
     indent--;
     return result;
   }
@@ -555,14 +565,33 @@
   }
 
   @override
+  Token parseEnumHeaderOpt(Token token, Token enumKeyword) {
+    doPrint('parseEnumHeaderOpt(' '$token, ' '$enumKeyword)');
+    indent++;
+    var result = super.parseEnumHeaderOpt(token, enumKeyword);
+    indent--;
+    return result;
+  }
+
+  @override
+  Token parseEnumElement(Token token) {
+    doPrint('parseEnumElement(' '$token)');
+    indent++;
+    var result = super.parseEnumElement(token);
+    indent--;
+    return result;
+  }
+
+  @override
   Token parseClassOrNamedMixinApplication(
-      Token? abstractToken, Token classKeyword) {
+      Token? abstractToken, Token? macroToken, Token classKeyword) {
     doPrint('parseClassOrNamedMixinApplication('
         '$abstractToken, '
+        '$macroToken, '
         '$classKeyword)');
     indent++;
-    var result =
-        super.parseClassOrNamedMixinApplication(abstractToken, classKeyword);
+    var result = super.parseClassOrNamedMixinApplication(
+        abstractToken, macroToken, classKeyword);
     indent--;
     return result;
   }
@@ -628,10 +657,10 @@
   }
 
   @override
-  Token parseClassOrMixinImplementsOpt(Token token) {
-    doPrint('parseClassOrMixinImplementsOpt(' '$token)');
+  Token parseClassOrMixinOrEnumImplementsOpt(Token token) {
+    doPrint('parseClassOrMixinOrEnumImplementsOpt(' '$token)');
     indent++;
-    var result = super.parseClassOrMixinImplementsOpt(token);
+    var result = super.parseClassOrMixinOrEnumImplementsOpt(token);
     indent--;
     return result;
   }
@@ -1126,14 +1155,14 @@
   }
 
   @override
-  Token parseClassOrMixinOrExtensionMemberImpl(
+  Token parseClassOrMixinOrExtensionOrEnumMemberImpl(
       Token token, DeclarationKind kind, String? enclosingDeclarationName) {
-    doPrint('parseClassOrMixinOrExtensionMemberImpl('
+    doPrint('parseClassOrMixinOrExtensionOrEnumMemberImpl('
         '$token, '
         '$kind, '
         '$enclosingDeclarationName)');
     indent++;
-    var result = super.parseClassOrMixinOrExtensionMemberImpl(
+    var result = super.parseClassOrMixinOrExtensionOrEnumMemberImpl(
         token, kind, enclosingDeclarationName);
     indent--;
     return result;
@@ -1279,14 +1308,15 @@
   @override
   Token parseConstructorReference(
       Token token, ConstructorReferenceContext constructorReferenceContext,
-      [TypeParamOrArgInfo? typeArg]) {
+      [TypeParamOrArgInfo? typeArg, bool isImplicitTypeName = false]) {
     doPrint('parseConstructorReference('
         '$token, '
         '$constructorReferenceContext, '
-        '$typeArg)');
+        '$typeArg, '
+        '$isImplicitTypeName)');
     indent++;
-    var result = super
-        .parseConstructorReference(token, constructorReferenceContext, typeArg);
+    var result = super.parseConstructorReference(
+        token, constructorReferenceContext, typeArg, isImplicitTypeName);
     indent--;
     return result;
   }
@@ -2466,19 +2496,30 @@
       Token begin,
       int referenceOffset,
       Token? newKeyword,
-      Token? prefix,
-      Token? period,
+      Token? firstToken,
+      Token? firstPeriod,
+      Token? secondToken,
+      Token? secondPeriod,
       Token identifierOrOperator) {
     doPrint('parseOneCommentReferenceRest('
         '$begin, '
         '$referenceOffset, '
         '$newKeyword, '
-        '$prefix, '
-        '$period, '
+        '$firstToken, '
+        '$firstPeriod, '
+        '$secondToken, '
+        '$secondPeriod, '
         '$identifierOrOperator)');
     indent++;
-    var result = super.parseOneCommentReferenceRest(begin, referenceOffset,
-        newKeyword, prefix, period, identifierOrOperator);
+    var result = super.parseOneCommentReferenceRest(
+        begin,
+        referenceOffset,
+        newKeyword,
+        firstToken,
+        firstPeriod,
+        secondToken,
+        secondPeriod,
+        identifierOrOperator);
     indent--;
     return result;
   }
diff --git a/pkg/front_end/test/parser_test_parser_creator.dart b/pkg/front_end/test/parser_test_parser_creator.dart
index 136e903..37c6c0c 100644
--- a/pkg/front_end/test/parser_test_parser_creator.dart
+++ b/pkg/front_end/test/parser_test_parser_creator.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 'dart:io';
 import 'dart:typed_data';
 
@@ -106,14 +104,15 @@
 class ParserCreatorListener extends Listener {
   final StringSink out;
   bool insideParserClass = false;
-  String currentMethodName;
-  List<String> parameters = <String>[];
-  List<String> parametersNamed = <String>[];
+  String? currentMethodName;
+  List<String> parameters = [];
+  List<String?> parametersNamed = [];
 
   ParserCreatorListener(this.out);
 
   @override
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
     if (name.lexeme == "Parser") insideParserClass = true;
   }
 
@@ -125,29 +124,29 @@
   @override
   void beginMethod(
       DeclarationKind declarationKind,
-      Token externalToken,
-      Token staticToken,
-      Token covariantToken,
-      Token varFinalOrConst,
-      Token getOrSet,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
       Token name) {
     currentMethodName = name.lexeme;
   }
 
   @override
-  void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
+  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
     parameters.clear();
     parametersNamed.clear();
     currentMethodName = null;
   }
 
   @override
-  void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
-      Token beginInitializers, Token endToken) {
-    if (insideParserClass && !currentMethodName.startsWith("_")) {
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    if (insideParserClass && !currentMethodName!.startsWith("_")) {
       Token token = beginToken;
-      Token latestToken;
+      Token? latestToken;
       out.writeln("  @override");
       out.write("  ");
       while (true) {
@@ -156,7 +155,7 @@
             out.write(" ");
           }
           out.write("dynamic");
-          token = troubleParameterTokens[token];
+          token = troubleParameterTokens[token]!;
         }
         if (latestToken != null && latestToken.charEnd < token.charOffset) {
           out.write(" ");
@@ -169,16 +168,15 @@
         out.write(token.lexeme);
         if (token is BeginToken &&
             token.type == TokenType.OPEN_CURLY_BRACKET &&
-            (beginParam == null ||
-                beginParam.endGroup == endToken ||
-                token.charOffset > beginParam.endGroup.charOffset)) {
+            (beginParam.endGroup == endToken ||
+                token.charOffset > beginParam.endGroup!.charOffset)) {
           break;
         }
         if (token == endToken) {
           throw token.runtimeType;
         }
         latestToken = token;
-        token = token.next;
+        token = token.next!;
       }
 
       out.write("\n    ");
@@ -244,17 +242,17 @@
     formalParametersNestLevel--;
   }
 
-  Token currentFormalParameterToken;
+  Token? currentFormalParameterToken;
 
   @override
-  void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
-      Token covariantToken, Token varFinalOrConst) {
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
     if (formalParametersNestLevel == 1) {
       currentFormalParameterToken = token;
     }
   }
 
-  Map<Token, Token> troubleParameterTokens = {};
+  Map<Token?, Token?> troubleParameterTokens = {};
 
   @override
   void handleIdentifier(Token token, IdentifierContext context) {
@@ -265,11 +263,12 @@
 
   @override
   void endFormalParameter(
-      Token thisKeyword,
-      Token periodAfterThis,
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
       Token nameToken,
-      Token initializerStart,
-      Token initializerEnd,
+      Token? initializerStart,
+      Token? initializerEnd,
       FormalParameterKind kind,
       MemberKind memberKind) {
     if (formalParametersNestLevel != 1) {
diff --git a/pkg/front_end/test/parts/data/main_part_by_file/a.dart b/pkg/front_end/test/parts/data/main_part_by_file/a.dart
new file mode 100644
index 0000000..baa0fc8
--- /dev/null
+++ b/pkg/front_end/test/parts/data/main_part_by_file/a.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part 'b.dart';
+
+void main() {
+  method();
+}
diff --git a/pkg/front_end/test/parts/data/main_part_by_file/b.dart b/pkg/front_end/test/parts/data/main_part_by_file/b.dart
new file mode 100644
index 0000000..b87eb7a3
--- /dev/null
+++ b/pkg/front_end/test/parts/data/main_part_by_file/b.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of 'a.dart';
+
+void method() {}
diff --git a/pkg/front_end/test/parts/data/main_part_by_name/a.dart b/pkg/front_end/test/parts/data/main_part_by_name/a.dart
new file mode 100644
index 0000000..b78bc7e
--- /dev/null
+++ b/pkg/front_end/test/parts/data/main_part_by_name/a.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library a;
+
+part 'b.dart';
+
+void main() {
+  method();
+}
diff --git a/pkg/front_end/test/parts/data/main_part_by_name/b.dart b/pkg/front_end/test/parts/data/main_part_by_name/b.dart
new file mode 100644
index 0000000..69d3956
--- /dev/null
+++ b/pkg/front_end/test/parts/data/main_part_by_name/b.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of a;
+
+void method() {}
diff --git a/pkg/front_end/test/parts/data/part_main_by_file/a.dart b/pkg/front_end/test/parts/data/part_main_by_file/a.dart
new file mode 100644
index 0000000..28dfcd3
--- /dev/null
+++ b/pkg/front_end/test/parts/data/part_main_by_file/a.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of 'b.dart';
+
+void method() {}
diff --git a/pkg/front_end/test/parts/data/part_main_by_file/b.dart b/pkg/front_end/test/parts/data/part_main_by_file/b.dart
new file mode 100644
index 0000000..0ec6788
--- /dev/null
+++ b/pkg/front_end/test/parts/data/part_main_by_file/b.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part 'a.dart';
+
+void main() {
+  method();
+}
diff --git a/pkg/front_end/test/parts/data/part_main_by_name/a.dart b/pkg/front_end/test/parts/data/part_main_by_name/a.dart
new file mode 100644
index 0000000..c618591
--- /dev/null
+++ b/pkg/front_end/test/parts/data/part_main_by_name/a.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of b;
+
+void method() {}
diff --git a/pkg/front_end/test/parts/data/part_main_by_name/b.dart b/pkg/front_end/test/parts/data/part_main_by_name/b.dart
new file mode 100644
index 0000000..b0519ed
--- /dev/null
+++ b/pkg/front_end/test/parts/data/part_main_by_name/b.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library b;
+
+part 'a.dart';
+
+void main() {
+  method();
+}
diff --git a/pkg/front_end/test/parts/parts_test.dart b/pkg/front_end/test/parts/parts_test.dart
new file mode 100644
index 0000000..9bfe8ff
--- /dev/null
+++ b/pkg/front_end/test/parts/parts_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:expect/expect.dart';
+import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/kernel_generator.dart';
+import 'package:front_end/src/compute_platform_binaries_location.dart';
+import 'package:front_end/src/fasta/messages.dart';
+
+Future<void> main() async {
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+  CompilerOptions options = new CompilerOptions()
+    ..sdkRoot = computePlatformBinariesLocation()
+    ..packagesFileUri = Uri.base.resolve('.packages');
+  for (FileSystemEntity dir in dataDir.listSync()) {
+    if (dir is Directory) {
+      print('Compiling ${dir.path}');
+      List<Uri> input = [];
+      for (FileSystemEntity file in dir.listSync()) {
+        input.add(file.absolute.uri);
+      }
+      input.sort((a, b) => a.path.compareTo(b.path));
+      bool hasError = false;
+      options.onDiagnostic = (message) {
+        if (message.severity == Severity.error) {
+          hasError = true;
+        }
+        message.plainTextFormatted.forEach(print);
+      };
+      await kernelForModule(input, options);
+      Expect.isFalse(hasError, "Unexpected errors");
+    }
+  }
+}
diff --git a/pkg/front_end/test/patching/data/abstract_class/libraries.json b/pkg/front_end/test/patching/data/abstract_class/libraries.json
new file mode 100644
index 0000000..a697508
--- /dev/null
+++ b/pkg/front_end/test/patching/data/abstract_class/libraries.json
@@ -0,0 +1,12 @@
+{
+  "none": {
+    "libraries": {
+      "test": {
+        "patches": [
+          "patch.dart"
+        ],
+        "uri": "origin.dart"
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/test/patching/data/abstract_class/main.dart b/pkg/front_end/test/patching/data/abstract_class/main.dart
new file mode 100644
index 0000000..faf7854
--- /dev/null
+++ b/pkg/front_end/test/patching/data/abstract_class/main.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*cfe.library: nnbd=false*/
+
+/*cfe:nnbd.library: nnbd=true*/
+
+// ignore: uri_does_not_exist
+import 'dart:test';
+
+void test(Class cls) {}
+
+main() {}
diff --git a/pkg/front_end/test/patching/data/abstract_class/origin.dart b/pkg/front_end/test/patching/data/abstract_class/origin.dart
new file mode 100644
index 0000000..c8359e2
--- /dev/null
+++ b/pkg/front_end/test/patching/data/abstract_class/origin.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*cfe.library: nnbd=false*/
+
+/*cfe:nnbd.library: nnbd=true*/
+
+/*class: Interface:
+ isAbstract,
+ kernel-members=[
+  Interface.,
+  interfaceMethod],
+ scope=[interfaceMethod]
+*/
+/*member: Interface.:initializers=[SuperInitializer]*/
+abstract class Interface {
+  void interfaceMethod();
+}
+
+/*class: Class:
+ isAbstract,
+ kernel-members=[
+  Class.,
+  classMethod],
+ scope=[classMethod]
+*/
+/*member: Class.:initializers=[SuperInitializer]*/
+abstract class Class implements Interface {
+  external void classMethod();
+}
diff --git a/pkg/front_end/test/patching/data/abstract_class/patch.dart b/pkg/front_end/test/patching/data/abstract_class/patch.dart
new file mode 100644
index 0000000..9d11f24
--- /dev/null
+++ b/pkg/front_end/test/patching/data/abstract_class/patch.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// ignore: import_internal_library
+import 'dart:_internal';
+
+@patch
+class Class {
+  @patch
+  /*member: Class.classMethod:patch*/
+  void classMethod() {}
+}
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index 9b7d6d9..60129e5 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_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
-
 import 'dart:io' show Directory, Platform;
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id;
@@ -49,9 +47,9 @@
 
 class TestConfigWithLanguageVersion extends TestConfig {
   TestConfigWithLanguageVersion(String marker, String name,
-      {Uri librariesSpecificationUri,
+      {Uri? librariesSpecificationUri,
       Map<ExperimentalFlag, bool> experimentalFlags = const {},
-      AllowedExperimentalFlags allowedExperimentalFlags})
+      AllowedExperimentalFlags? allowedExperimentalFlags})
       : super(marker, name,
             librariesSpecificationUri: librariesSpecificationUri,
             explicitExperimentalFlags: experimentalFlags,
@@ -72,7 +70,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new PatchingDataExtractor(compilerResult, actualMap));
   }
 
@@ -82,7 +80,7 @@
       InternalCompilerResult compilerResult,
       Class cls,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new PatchingDataExtractor(compilerResult, actualMap).computeForClass(cls);
   }
 
@@ -92,7 +90,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new PatchingDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -120,6 +118,7 @@
   static const String error = 'message';
   static const String isNonNullableByDefault = 'nnbd';
   static const String patch = 'patch';
+  static const String isAbstract = 'isAbstract';
 }
 
 class PatchingDataExtractor extends CfeDataExtractor<Features> {
@@ -136,9 +135,12 @@
 
   @override
   Features computeClassValue(Id id, Class cls) {
-    ClassBuilder clsBuilder = lookupClassBuilder(compilerResult, cls);
+    ClassBuilder clsBuilder = lookupClassBuilder(compilerResult, cls)!;
 
     Features features = new Features();
+    if (cls.isAbstract) {
+      features.add(Tags.isAbstract);
+    }
     clsBuilder.scope.forEach((String name, Builder builder) {
       features.addElement(Tags.scope, name);
     });
@@ -172,9 +174,10 @@
         features.addElement(Tags.initializers, desc);
       }
     }
-    MemberBuilderImpl memberBuilder =
-        lookupMemberBuilder(compilerResult, member, required: false);
-    MemberBuilder patchMember = memberBuilder?.dataForTesting?.patchForTesting;
+    MemberBuilderImpl? memberBuilder =
+        lookupMemberBuilder(compilerResult, member, required: false)
+            as MemberBuilderImpl?;
+    MemberBuilder? patchMember = memberBuilder?.dataForTesting?.patchForTesting;
     if (patchMember != null) {
       features.add(Tags.patch);
     }
diff --git a/pkg/front_end/test/precedence_info_test.dart b/pkg/front_end/test/precedence_info_test.dart
index cce5241..0508cc8 100644
--- a/pkg/front_end/test/precedence_info_test.dart
+++ b/pkg/front_end/test/precedence_info_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
-
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
     show AbstractScanner;
@@ -22,11 +20,11 @@
 @reflectiveTest
 class PrecedenceInfoTest {
   void assertInfo(check(String source, Token token)) {
-    void assertLexeme(String source) {
+    void assertLexeme(String? source) {
       if (source == null || source.isEmpty) return;
       var token = scanString(source, includeComments: true).tokens;
       while (token is ErrorToken) {
-        token = token.next;
+        token = token.next!;
       }
       check(source, token);
     }
@@ -290,11 +288,11 @@
   }
 
   void test_name() {
-    void assertName(String source, String name, {int offset: 0}) {
+    void assertName(String? source, String name, {int offset: 0}) {
       if (source == null || source.isEmpty) return;
       var token = scanString(source, includeComments: true).tokens;
       while (token is ErrorToken || token.offset < offset) {
-        token = token.next;
+        token = token.next!;
       }
       expect(token.type.name, name,
           reason: 'source: $source\ntoken: ${token.lexeme}');
@@ -393,7 +391,7 @@
       for (String source in lexemes) {
         var token = scanString(source, includeComments: true).tokens;
         while (token is ErrorToken) {
-          token = token.next;
+          token = token.next!;
         }
         expect(token.type.precedence, precedence, reason: source);
       }
diff --git a/pkg/front_end/test/predicates/data/late.dart b/pkg/front_end/test/predicates/data/late.dart
index ebf4162..1889a70 100644
--- a/pkg/front_end/test/predicates/data/late.dart
+++ b/pkg/front_end/test/predicates/data/late.dart
@@ -153,6 +153,10 @@
 */
 late final int? finalTopLevelNullableWithInitializer = 4;
 
+/*member: Class._#new#tearOff:
+ tearoffConstructor,
+ tearoffLowering
+*/
 class Class {
   /*member: Class._#Class#instanceNonNullableWithoutInitializer:
    lateField,
diff --git a/pkg/front_end/test/predicates/data/late_names.dart b/pkg/front_end/test/predicates/data/late_names.dart
index a67c9e9..c8de49a 100644
--- a/pkg/front_end/test/predicates/data/late_names.dart
+++ b/pkg/front_end/test/predicates/data/late_names.dart
@@ -68,6 +68,10 @@
 */
 late int? _a;
 
+/*member: Class._#new#tearOff:
+ tearoffConstructor,
+ tearoffLowering
+*/
 class Class {
   /*member: Class._#Class#a:
    lateField,
@@ -198,6 +202,10 @@
   static late int? _b;
 }
 
+/*member: _Class._#new#tearOff:
+ tearoffConstructor,
+ tearoffLowering
+*/
 class _Class {
   /*member: _Class._#_Class#a:
    lateField,
diff --git a/pkg/front_end/test/predicates/data/tear_off.dart b/pkg/front_end/test/predicates/data/tear_off.dart
new file mode 100644
index 0000000..9bd0a48
--- /dev/null
+++ b/pkg/front_end/test/predicates/data/tear_off.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class<T> {
+  /*member: Class._#new#tearOff:
+   tearoffConstructor,
+   tearoffLowering
+  */
+  Class();
+
+  /*member: Class._#fact#tearOff:
+   tearoffConstructor,
+   tearoffLowering
+  */
+  factory Class.fact() => new Class();
+
+  /*member: Class._#redirect#tearOff:
+   tearoffConstructor,
+   tearoffLowering
+  */
+  factory Class.redirect() = Class;
+}
+
+/*member: _#Typedef#new#tearOff:
+ tearoffLowering,
+ tearoffTypedef
+*/
+/*member: _#Typedef#fact#tearOff:
+tearoffLowering,
+tearoffTypedef
+*/
+/*member: _#Typedef#redirect#tearOff:
+ tearoffLowering,
+ tearoffTypedef
+*/
+typedef Typedef<T extends num> = Class<T>;
+
+main() {}
diff --git a/pkg/front_end/test/predicates/predicate_test.dart b/pkg/front_end/test/predicates/predicate_test.dart
index ec7b50d..5866119 100644
--- a/pkg/front_end/test/predicates/predicate_test.dart
+++ b/pkg/front_end/test/predicates/predicate_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'
@@ -34,6 +32,8 @@
               ExperimentalFlag.nonNullable: true
             },
             targetFlags: const TestTargetFlags(
+                forceConstructorTearOffLoweringForTesting:
+                    ConstructorTearOffLowering.all,
                 forceLateLoweringsForTesting: LateLowering.all,
                 forceLateLoweringSentinelForTesting: false),
             nnbdMode: NnbdMode.Strong),
@@ -42,6 +42,8 @@
               ExperimentalFlag.nonNullable: true
             },
             targetFlags: const TestTargetFlags(
+                forceConstructorTearOffLoweringForTesting:
+                    ConstructorTearOffLowering.all,
                 forceLateLoweringsForTesting: LateLowering.all,
                 forceLateLoweringSentinelForTesting: true),
             nnbdMode: NnbdMode.Strong)
@@ -63,6 +65,10 @@
   static const String lateLocalSetter = 'lateLocalSetter';
 
   static const String extensionThis = 'extensionThis';
+
+  static const String tearoffLowering = 'tearoffLowering';
+  static const String tearoffConstructor = 'tearoffConstructor';
+  static const String tearoffTypedef = 'tearoffTypedef';
 }
 
 class PredicateDataComputer extends DataComputer<Features> {
@@ -77,7 +83,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new PredicateDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -88,7 +94,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<Features>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new PredicateDataExtractor(compilerResult, actualMap));
   }
 
@@ -106,14 +112,14 @@
       : super(compilerResult, actualMap);
 
   @override
-  Features computeLibraryValue(Id id, Library node) {
+  Features? computeLibraryValue(Id id, Library node) {
     return null;
   }
 
   @override
-  Features computeMemberValue(Id id, Member node) {
+  Features? computeMemberValue(Id id, Member node) {
+    Features features = new Features();
     if (node is Field) {
-      Features features = new Features();
       if (isLateLoweredField(node)) {
         features.add(Tags.lateField);
         features[Tags.lateFieldName] =
@@ -124,18 +130,16 @@
         features[Tags.lateFieldName] =
             extractFieldNameFromLateLoweredIsSetField(node).text;
       }
-      Field target = getLateFieldTarget(node);
+      Field? target = getLateFieldTarget(node);
       if (target != null) {
         features[Tags.lateFieldTarget] = getQualifiedMemberName(target);
       }
-      Expression initializer = getLateFieldInitializer(node);
+      Expression? initializer = getLateFieldInitializer(node);
       if (initializer != null) {
         features[Tags.lateFieldInitializer] =
             initializer.toText(astTextStrategyForTesting);
       }
-      return features;
     } else if (node is Procedure) {
-      Features features = new Features();
       if (isLateLoweredFieldGetter(node)) {
         features.add(Tags.lateFieldGetter);
         features[Tags.lateFieldName] =
@@ -146,29 +150,37 @@
         features[Tags.lateFieldName] =
             extractFieldNameFromLateLoweredFieldSetter(node).text;
       }
-      Field target = getLateFieldTarget(node);
+      Field? target = getLateFieldTarget(node);
       if (target != null) {
         features[Tags.lateFieldTarget] = getQualifiedMemberName(target);
       }
-      Expression initializer = getLateFieldInitializer(node);
+      Expression? initializer = getLateFieldInitializer(node);
       if (initializer != null) {
         features[Tags.lateFieldInitializer] =
             initializer.toText(astTextStrategyForTesting);
       }
-      return features;
+      if (isConstructorTearOffLowering(node)) {
+        features.add(Tags.tearoffConstructor);
+      }
+      if (isTypedefTearOffLowering(node)) {
+        features.add(Tags.tearoffTypedef);
+      }
     }
-    return null;
+    if (isTearOffLowering(node)) {
+      features.add(Tags.tearoffLowering);
+    }
+    return features;
   }
 
   @override
   void visitProcedure(Procedure node) {
     super.visitProcedure(node);
     nodeIdMap.forEach((String name, NodeId id) {
-      Features features = featureMap[name];
+      Features? features = featureMap[name];
       if (features != null) {
-        TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
+        TreeNode nodeWithOffset = computeTreeNodeWithOffset(node)!;
         registerValue(
-            nodeWithOffset.location.file, id.value, id, features, name);
+            nodeWithOffset.location!.file, id.value, id, features, name);
       }
     });
     nodeIdMap.clear();
@@ -177,22 +189,22 @@
 
   @override
   void visitVariableDeclaration(VariableDeclaration node) {
-    String name;
-    String tag;
+    String? name;
+    String? tag;
     if (isLateLoweredLocal(node)) {
-      name = extractLocalNameFromLateLoweredLocal(node.name);
+      name = extractLocalNameFromLateLoweredLocal(node.name!);
       tag = Tags.lateLocal;
     } else if (isLateLoweredIsSetLocal(node)) {
-      name = extractLocalNameFromLateLoweredIsSet(node.name);
+      name = extractLocalNameFromLateLoweredIsSet(node.name!);
       tag = Tags.lateIsSetLocal;
     } else if (isLateLoweredLocalGetter(node)) {
-      name = extractLocalNameFromLateLoweredGetter(node.name);
+      name = extractLocalNameFromLateLoweredGetter(node.name!);
       tag = Tags.lateLocalGetter;
     } else if (isLateLoweredLocalSetter(node)) {
-      name = extractLocalNameFromLateLoweredSetter(node.name);
+      name = extractLocalNameFromLateLoweredSetter(node.name!);
       tag = Tags.lateLocalSetter;
     } else if (isExtensionThis(node)) {
-      name = extractLocalNameForExtensionThis(node.name);
+      name = extractLocalNameForExtensionThis(node.name!);
       tag = Tags.extensionThis;
     } else if (node.name != null) {
       name = node.name;
@@ -210,7 +222,7 @@
   }
 
   @override
-  ActualData<Features> mergeData(
+  ActualData<Features>? mergeData(
       ActualData<Features> value1, ActualData<Features> value2) {
     if ('${value1.value}' == '${value2.value}') {
       // The extension this parameter is seen twice in the extension method
diff --git a/pkg/front_end/test/read_dill_from_binary_md_git_test.dart b/pkg/front_end/test/read_dill_from_binary_md_git_test.dart
index ec6277b..30a5ebd 100644
--- a/pkg/front_end/test/read_dill_from_binary_md_git_test.dart
+++ b/pkg/front_end/test/read_dill_from_binary_md_git_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
-
 import 'dart:io' show File, Platform;
 
 import 'package:kernel/target/targets.dart' show NoneTarget, TargetFlags;
diff --git a/pkg/front_end/test/relativize_test.dart b/pkg/front_end/test/relativize_test.dart
index c42fac6..ce5e36b 100644
--- a/pkg/front_end/test/relativize_test.dart
+++ b/pkg/front_end/test/relativize_test.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:_fe_analyzer_shared/src/util/relativize.dart';
 import 'package:test/test.dart';
 
 void main() {
   test('test relativeUri', () {
-    void c(String expected, String base, String path, bool isWindows) {
+    void c(String expected, String base, String path, bool? isWindows) {
       if (isWindows == null) {
         c(expected, base, path, true);
         c(expected, base, path, false);
diff --git a/pkg/front_end/test/scanner_fasta_test.dart b/pkg/front_end/test/scanner_fasta_test.dart
index b5c55b5..215423e 100644
--- a/pkg/front_end/test/scanner_fasta_test.dart
+++ b/pkg/front_end/test/scanner_fasta_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
-
 import 'dart:convert';
 
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart' as fasta;
@@ -38,16 +36,16 @@
 
     usedForFuzzTesting.ScannerResult result =
         usedForFuzzTesting.scanString(source);
-    expect(result?.hasErrors, isFalse);
-    expect(result.tokens?.type, same(Keyword.CLASS));
+    expect(result.hasErrors, isFalse);
+    expect(result.tokens.type, same(Keyword.CLASS));
 
     // UTF8 encode source with trailing zero
     List<int> bytes = utf8.encode(source).toList();
     bytes.add(0);
 
     result = usedForFuzzTesting.scan(bytes);
-    expect(result?.hasErrors, isFalse);
-    expect(result.tokens?.type, same(Keyword.CLASS));
+    expect(result.hasErrors, isFalse);
+    expect(result.tokens.type, same(Keyword.CLASS));
   }
 }
 
@@ -55,7 +53,7 @@
 class ScannerTest_Fasta_UTF8 extends ScannerTest_Fasta {
   @override
   Token scanWithListener(String source, ErrorListener listener,
-      {ScannerConfiguration configuration}) {
+      {ScannerConfiguration? configuration}) {
     var bytes = utf8.encode(source).toList()..add(0);
     var result =
         scan(bytes, configuration: configuration, includeComments: true);
@@ -65,10 +63,10 @@
     if (result.hasErrors) {
       while (token is ErrorToken) {
         translateErrorToken(token,
-            (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+            (ScannerErrorCode errorCode, int offset, List<Object>? arguments) {
           listener.errors.add(new TestError(offset, errorCode, arguments));
         });
-        token = token.next;
+        token = token.next!;
       }
     }
 
@@ -113,7 +111,7 @@
 class ScannerTest_Fasta extends ScannerTestBase {
   @override
   Token scanWithListener(String source, ErrorListener listener,
-      {ScannerConfiguration configuration}) {
+      {ScannerConfiguration? configuration}) {
     var result =
         scanString(source, configuration: configuration, includeComments: true);
     var token = result.tokens;
@@ -122,10 +120,10 @@
     if (result.hasErrors) {
       while (token is ErrorToken) {
         translateErrorToken(token,
-            (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+            (ScannerErrorCode errorCode, int offset, List<Object>? arguments) {
           listener.errors.add(new TestError(offset, errorCode, arguments));
         });
-        token = token.next;
+        token = token.next!;
       }
     }
 
@@ -151,7 +149,7 @@
        } // EOF comment
     ''';
 
-    Token scanSource({bool includeComments}) {
+    Token scanSource({required bool includeComments}) {
       return scanString(source, includeComments: includeComments).tokens;
     }
 
@@ -162,7 +160,7 @@
       // Assert no comments
       expect(token.precedingComments, isNull);
       expect(token.type.kind, isNot(fasta.COMMENT_TOKEN));
-      token = token.next;
+      token = token.next!;
     }
     expect(token.precedingComments, isNull);
     expect(tokenCount, 26);
@@ -175,13 +173,13 @@
     while (!token.isEof) {
       ++tokenCount;
       // Assert valid comments
-      fasta.CommentToken comment = token.precedingComments;
+      fasta.CommentToken? comment = token.precedingComments;
       while (comment != null) {
         ++commentTokenCount;
         expect(comment.type.kind, fasta.COMMENT_TOKEN);
         expect(comment.charOffset, greaterThanOrEqualTo(previousEnd));
         previousEnd = comment.charOffset + comment.charCount;
-        comment = comment.next;
+        comment = comment.next as fasta.CommentToken?;
       }
       expect(token.type.kind, isNot(fasta.COMMENT_TOKEN));
       expect(token.charOffset, greaterThanOrEqualTo(previousEnd));
@@ -206,7 +204,7 @@
         }
       }
 
-      token = token.next;
+      token = token.next!;
     }
     expect(tokenCount, 26);
     expect(spotCheckCount, 3);
@@ -222,19 +220,19 @@
 main() {}
 ''';
 
-    Token token;
-    fasta.CommentToken c1;
-    fasta.CommentToken c2;
-    fasta.CommentToken c3;
+    late Token token;
+    late fasta.CommentToken c1;
+    late fasta.CommentToken c2;
+    late fasta.CommentToken c3;
 
     void prepareTokens() {
       token = scanString(code, includeComments: true).tokens;
 
       expect(token.type.kind, fasta.IDENTIFIER_TOKEN);
 
-      c1 = token.precedingComments;
-      c2 = c1.next;
-      c3 = c2.next;
+      c1 = token.precedingComments!;
+      c2 = c1.next as fasta.CommentToken;
+      c3 = c2.next as fasta.CommentToken;
       expect(c3.next, isNull);
 
       expect(c1.parent, token);
@@ -287,7 +285,7 @@
     // ... but the length does *not* include the additional character
     // so as to be true to the original source.
     expect(token.length, source.length);
-    expect(token.next.isEof, isTrue);
+    expect(token.next!.isEof, isTrue);
     expect(listener.errors, hasLength(1));
     TestError error = listener.errors[0];
     expect(error.errorCode, ScannerErrorCode.MISSING_DIGIT);
@@ -303,16 +301,16 @@
     // where both ')' are synthetic
     ErrorListener listener = new ErrorListener();
     BeginToken interpolationStart =
-        scanWithListener(r'"${({(}}"', listener).next;
-    BeginToken openParen1 = interpolationStart.next;
-    BeginToken openBrace = openParen1.next;
-    BeginToken openParen2 = openBrace.next;
-    var closeParen2 = openParen2.next;
-    var closeBrace = closeParen2.next;
-    var closeParen1 = closeBrace.next;
-    var interpolationEnd = closeParen1.next;
-    var stringEnd = interpolationEnd.next;
-    expect(stringEnd.next.type, TokenType.EOF);
+        scanWithListener(r'"${({(}}"', listener).next as BeginToken;
+    BeginToken openParen1 = interpolationStart.next as BeginToken;
+    BeginToken openBrace = openParen1.next as BeginToken;
+    BeginToken openParen2 = openBrace.next as BeginToken;
+    var closeParen2 = openParen2.next!;
+    var closeBrace = closeParen2.next!;
+    var closeParen1 = closeBrace.next!;
+    var interpolationEnd = closeParen1.next!;
+    var stringEnd = interpolationEnd.next!;
+    expect(stringEnd.next!.type, TokenType.EOF);
     expect(interpolationStart.endToken, same(interpolationEnd));
     expect(openParen1.endToken, same(closeParen1));
     expect(openBrace.endToken, same(closeBrace));
@@ -327,37 +325,37 @@
     const source = 'int a; /*1*/ /*2*/ /*3*/ B f(){if (a < 2) {}}';
     Token token = scanString(source, includeComments: true).tokens;
     while (!token.isEof) {
-      expect(token.next.previous, token);
-      fasta.CommentToken commentToken = token.precedingComments;
+      expect(token.next!.previous, token);
+      fasta.CommentToken? commentToken = token.precedingComments;
       while (commentToken != null) {
         if (commentToken.next != null) {
-          expect(commentToken.next.previous, commentToken);
+          expect(commentToken.next!.previous, commentToken);
         }
-        commentToken = commentToken.next;
+        commentToken = commentToken.next as fasta.CommentToken?;
       }
-      token = token.next;
+      token = token.next!;
     }
   }
 
   void test_spread_operators() {
     ErrorListener listener = new ErrorListener();
     Token openBracket = scanWithListener('[ 1, ...[2], ...?[3], ]', listener);
-    Token spreadToken = openBracket.next.next.next;
+    Token spreadToken = openBracket.next!.next!.next!;
     expect(spreadToken.lexeme, '...');
-    Token spreadQToken = spreadToken.next.next.next.next.next;
+    Token spreadQToken = spreadToken.next!.next!.next!.next!.next!;
     expect(spreadQToken.lexeme, '...?');
   }
 
   @override
   void test_unmatched_openers() {
     ErrorListener listener = new ErrorListener();
-    BeginToken openBrace = scanWithListener('{[(', listener);
-    BeginToken openBracket = openBrace.next;
-    BeginToken openParen = openBracket.next;
-    var closeParen = openParen.next;
-    var closeBracket = closeParen.next;
-    var closeBrace = closeBracket.next;
-    expect(closeBrace.next.type, TokenType.EOF);
+    BeginToken openBrace = scanWithListener('{[(', listener) as BeginToken;
+    BeginToken openBracket = openBrace.next as BeginToken;
+    BeginToken openParen = openBracket.next as BeginToken;
+    var closeParen = openParen.next!;
+    var closeBracket = closeParen.next!;
+    var closeBrace = closeBracket.next!;
+    expect(closeBrace.next!.type, TokenType.EOF);
     expect(openBrace.endToken, same(closeBrace));
     expect(openBracket.endToken, same(closeBracket));
     expect(openParen.endToken, same(closeParen));
@@ -374,7 +372,7 @@
   Token scan(String source);
 
   void expectToken(Token token, TokenType type, int offset, int length,
-      {bool isSynthetic: false, String lexeme}) {
+      {bool isSynthetic: false, String? lexeme}) {
     String description = '${token.type} $token';
     expect(token.type, type, reason: description);
     expect(token.offset, offset, reason: description);
@@ -390,26 +388,26 @@
     expect((token as fasta.ErrorToken).errorCode,
         same(codeUnexpectedDollarInString));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 1, lexeme: "'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_IDENTIFIER, 1, 1);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 2, 1, lexeme: 'x');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 3, 0, lexeme: '', isSynthetic: true);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_IDENTIFIER, 3, 1);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 4, 0,
         lexeme: '', isSynthetic: true);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 4, 1, lexeme: "'");
   }
 
@@ -418,28 +416,28 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
     var interpolationStartErrorToken = token as fasta.UnmatchedToken;
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, '"');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 5, lexeme: '"foo ');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_EXPRESSION, 5, 2);
-    BeginToken interpolationStart = token;
+    BeginToken interpolationStart = token as BeginToken;
     expect(interpolationStartErrorToken.begin, same(interpolationStart));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 7, 3, lexeme: 'bar');
 
     // Expect interpolation to be terminated before string is closed
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.CLOSE_CURLY_BRACKET, 10, 0,
         isSynthetic: true, lexeme: '}');
     expect(interpolationStart.endToken, same(token));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 10, 0, isSynthetic: true, lexeme: '"');
   }
 
@@ -448,58 +446,58 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
     var openSquareBracketErrorToken = token as fasta.UnmatchedToken;
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
     var openParenErrorToken = token as fasta.UnmatchedToken;
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
     var interpolationStartErrorToken = token as fasta.UnmatchedToken;
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, '"');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 5, lexeme: '"foo ');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_EXPRESSION, 5, 2);
-    BeginToken interpolationStart = token;
+    BeginToken interpolationStart = token as BeginToken;
     expect(interpolationStartErrorToken.begin, same(interpolationStart));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 7, 3, lexeme: 'bar');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.OPEN_PAREN, 10, 1);
-    BeginToken openParen = token;
+    BeginToken openParen = token as BeginToken;
     expect(openParenErrorToken.begin, same(openParen));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 11, 3, lexeme: 'baz');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.OPEN_SQUARE_BRACKET, 14, 1);
-    BeginToken openSquareBracket = token;
+    BeginToken openSquareBracket = token as BeginToken;
     expect(openSquareBracketErrorToken.begin, same(openSquareBracket));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.CLOSE_SQUARE_BRACKET, 15, 0,
         isSynthetic: true, lexeme: ']');
     expect(openSquareBracket.endToken, same(token));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.CLOSE_PAREN, 15, 0,
         isSynthetic: true, lexeme: ')');
     expect(openParen.endToken, same(token));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.CLOSE_CURLY_BRACKET, 15, 0,
         isSynthetic: true, lexeme: '}');
     expect(interpolationStart.endToken, same(token));
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 15, 0, isSynthetic: true, lexeme: '"');
   }
 
@@ -508,21 +506,21 @@
     expect((token as fasta.ErrorToken).errorCode,
         same(codeUnexpectedDollarInString));
 
-    token = token.next;
+    token = token.next!;
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, '"');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 5, lexeme: '"foo ');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING_INTERPOLATION_IDENTIFIER, 5, 1);
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.IDENTIFIER, 6, 0,
         isSynthetic: true, lexeme: '');
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 6, 0, isSynthetic: true, lexeme: '"');
   }
 
@@ -531,7 +529,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "'''");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 9,
         lexeme: "'''string'''", isSynthetic: true);
   }
@@ -541,7 +539,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "r'''");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 10,
         lexeme: "r'''string'''", isSynthetic: true);
   }
@@ -551,7 +549,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "r'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 8,
         lexeme: "r'string'", isSynthetic: true);
   }
@@ -561,7 +559,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "r'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 8,
         lexeme: "r'string'", isSynthetic: true);
   }
@@ -571,7 +569,7 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 7,
         lexeme: "'string'", isSynthetic: true);
   }
@@ -581,17 +579,17 @@
     expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
     expect((token as fasta.UnterminatedString).start, "'");
 
-    token = token.next;
+    token = token.next!;
     expectToken(token, TokenType.STRING, 0, 7,
         lexeme: "'string'", isSynthetic: true);
   }
 
   void test_match_angle_brackets() {
     var x = scan('x<y>');
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var greaterThan = y.next;
-    expect(greaterThan.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var greaterThan = y.next!;
+    expect(greaterThan.next!.isEof, isTrue);
     expect(lessThan.endGroup, same(greaterThan));
   }
 
@@ -599,54 +597,54 @@
     // When a ">>" appears in the token stream, Fasta's scanner matches it to
     // the outer "<".  The inner "<" is left unmatched.
     var x = scan('x<y<z>>');
-    BeginToken lessThan1 = x.next;
-    var y = lessThan1.next;
-    BeginToken lessThan2 = y.next;
-    var z = lessThan2.next;
-    var greaterThans = z.next;
-    expect(greaterThans.next.isEof, isTrue);
+    BeginToken lessThan1 = x.next as BeginToken;
+    var y = lessThan1.next!;
+    BeginToken lessThan2 = y.next as BeginToken;
+    var z = lessThan2.next!;
+    var greaterThans = z.next!;
+    expect(greaterThans.next!.isEof, isTrue);
     expect(lessThan1.endGroup, same(greaterThans));
     expect(lessThan2.endGroup, isNull);
   }
 
   void test_match_angle_brackets_interrupted_by_close_brace() {
     // A "}" appearing in the token stream interrupts matching of "<" and ">".
-    BeginToken openBrace = scan('{x<y}>z');
-    var x = openBrace.next;
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var closeBrace = y.next;
-    var greaterThan = closeBrace.next;
-    var z = greaterThan.next;
-    expect(z.next.isEof, isTrue);
+    BeginToken openBrace = scan('{x<y}>z') as BeginToken;
+    var x = openBrace.next!;
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var closeBrace = y.next!;
+    var greaterThan = closeBrace.next!;
+    var z = greaterThan.next!;
+    expect(z.next!.isEof, isTrue);
     expect(openBrace.endGroup, same(closeBrace));
     expect(lessThan.endGroup, isNull);
   }
 
   void test_match_angle_brackets_interrupted_by_close_bracket() {
     // A "]" appearing in the token stream interrupts matching of "<" and ">".
-    BeginToken openBracket = scan('[x<y]>z');
-    var x = openBracket.next;
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var closeBracket = y.next;
-    var greaterThan = closeBracket.next;
-    var z = greaterThan.next;
-    expect(z.next.isEof, isTrue);
+    BeginToken openBracket = scan('[x<y]>z') as BeginToken;
+    var x = openBracket.next!;
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var closeBracket = y.next!;
+    var greaterThan = closeBracket.next!;
+    var z = greaterThan.next!;
+    expect(z.next!.isEof, isTrue);
     expect(openBracket.endGroup, same(closeBracket));
     expect(lessThan.endGroup, isNull);
   }
 
   void test_match_angle_brackets_interrupted_by_close_paren() {
     // A ")" appearing in the token stream interrupts matching of "<" and ">".
-    BeginToken openParen = scan('(x<y)>z');
-    var x = openParen.next;
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var closeParen = y.next;
-    var greaterThan = closeParen.next;
-    var z = greaterThan.next;
-    expect(z.next.isEof, isTrue);
+    BeginToken openParen = scan('(x<y)>z') as BeginToken;
+    var x = openParen.next!;
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var closeParen = y.next!;
+    var greaterThan = closeParen.next!;
+    var z = greaterThan.next!;
+    expect(z.next!.isEof, isTrue);
     expect(openParen.endGroup, same(closeParen));
     expect(lessThan.endGroup, isNull);
   }
@@ -654,15 +652,15 @@
   void test_match_angle_brackets_interrupted_by_interpolation_expr() {
     // A "${" appearing in the token stream interrupts matching of "<" and ">".
     var x = scan(r'x<"${y>z}"');
-    BeginToken lessThan = x.next;
-    var beginString = lessThan.next;
-    BeginToken beginInterpolation = beginString.next;
-    var y = beginInterpolation.next;
-    var greaterThan = y.next;
-    var z = greaterThan.next;
-    var endInterpolation = z.next;
-    var endString = endInterpolation.next;
-    expect(endString.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var beginString = lessThan.next!;
+    BeginToken beginInterpolation = beginString.next as BeginToken;
+    var y = beginInterpolation.next!;
+    var greaterThan = y.next!;
+    var z = greaterThan.next!;
+    var endInterpolation = z.next!;
+    var endString = endInterpolation.next!;
+    expect(endString.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
     expect(beginInterpolation.endGroup, same(endInterpolation));
   }
@@ -670,13 +668,13 @@
   void test_match_angle_brackets_interrupted_by_open_brace() {
     // A "{" appearing in the token stream interrupts matching of "<" and ">".
     var x = scan('x<{y>z}');
-    BeginToken lessThan = x.next;
-    BeginToken openBrace = lessThan.next;
-    var y = openBrace.next;
-    var greaterThan = y.next;
-    var z = greaterThan.next;
-    var closeBrace = z.next;
-    expect(closeBrace.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    BeginToken openBrace = lessThan.next as BeginToken;
+    var y = openBrace.next!;
+    var greaterThan = y.next!;
+    var z = greaterThan.next!;
+    var closeBrace = z.next!;
+    expect(closeBrace.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
     expect(openBrace.endGroup, same(closeBrace));
   }
@@ -684,14 +682,14 @@
   void test_match_angle_brackets_interrupted_by_open_bracket() {
     // A "[" appearing in the token stream interrupts matching of "<" and ">".
     var x = scan('x<y[z>a]');
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    BeginToken openBracket = y.next;
-    var z = openBracket.next;
-    var greaterThan = z.next;
-    var a = greaterThan.next;
-    var closeBracket = a.next;
-    expect(closeBracket.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    BeginToken openBracket = y.next as BeginToken;
+    var z = openBracket.next!;
+    var greaterThan = z.next!;
+    var a = greaterThan.next!;
+    var closeBracket = a.next!;
+    expect(closeBracket.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
     expect(openBracket.endGroup, same(closeBracket));
   }
@@ -699,29 +697,29 @@
   void test_match_angle_brackets_interrupted_by_open_paren() {
     // A "(" appearing in the token stream interrupts matching of "<" and ">".
     var x = scan('x<y(z>a)');
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    BeginToken openParen = y.next;
-    var z = openParen.next;
-    var greaterThan = z.next;
-    var a = greaterThan.next;
-    var closeParen = a.next;
-    expect(closeParen.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    BeginToken openParen = y.next as BeginToken;
+    var z = openParen.next!;
+    var greaterThan = z.next!;
+    var a = greaterThan.next!;
+    var closeParen = a.next!;
+    expect(closeParen.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
     expect(openParen.endGroup, same(closeParen));
   }
 
   void test_match_angle_brackets_nested() {
     var x = scan('x<y<z>,a>');
-    BeginToken lessThan1 = x.next;
-    var y = lessThan1.next;
-    BeginToken lessThan2 = y.next;
-    var z = lessThan2.next;
-    var greaterThan1 = z.next;
-    var comma = greaterThan1.next;
-    var a = comma.next;
-    var greaterThan2 = a.next;
-    expect(greaterThan2.next.isEof, isTrue);
+    BeginToken lessThan1 = x.next as BeginToken;
+    var y = lessThan1.next!;
+    BeginToken lessThan2 = y.next as BeginToken;
+    var z = lessThan2.next!;
+    var greaterThan1 = z.next!;
+    var comma = greaterThan1.next!;
+    var a = comma.next!;
+    var greaterThan2 = a.next!;
+    expect(greaterThan2.next!.isEof, isTrue);
     expect(lessThan1.endGroup, same(greaterThan2));
     expect(lessThan2.endGroup, same(greaterThan1));
   }
@@ -730,11 +728,11 @@
     // When a ">>" appears in the token stream and there is no outer "<",
     // Fasta's scanner leaves the inner "<" unmatched.
     var x = scan('x<y>>z');
-    BeginToken lessThan = x.next;
-    var y = lessThan.next;
-    var greaterThans = y.next;
-    var z = greaterThans.next;
-    expect(z.next.isEof, isTrue);
+    BeginToken lessThan = x.next as BeginToken;
+    var y = lessThan.next!;
+    var greaterThans = y.next!;
+    var z = greaterThans.next!;
+    expect(z.next!.isEof, isTrue);
     expect(lessThan.endGroup, isNull);
   }
 }
@@ -755,7 +753,7 @@
 /// Scanner tests that exercise the Fasta scanner directly.
 @reflectiveTest
 class ScannerTest_Fasta_Direct extends ScannerTest_Fasta_Base {
-  fasta.LanguageVersionToken languageVersion;
+  fasta.LanguageVersionToken? languageVersion;
 
   void languageVersionChanged(
       Scanner scanner, fasta.LanguageVersionToken languageVersion) {
@@ -773,7 +771,7 @@
     final Token first = result.tokens;
     Token token = first;
     while (!token.isEof) {
-      Token next = token.next;
+      Token next = token.next!;
       expect(token.next, next);
       expect(next.previous, token);
       if (next.isSynthetic && [')', ']', '}'].contains(next.lexeme)) {
@@ -802,8 +800,8 @@
 import 'foo.dart';
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(
         result.tokens,
         [
@@ -819,8 +817,8 @@
 // @dart = 2.3
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, ['// @dart = 2.3'], 0);
   }
 
@@ -838,8 +836,8 @@
 // @dart = 2.3
 main() {}
 ''', includeComments: false);
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, [], -1);
   }
 
@@ -849,8 +847,8 @@
 import 'foo.dart';
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, ['// @dart = 2.3'], 0);
   }
 
@@ -861,9 +859,9 @@
 import 'foo.dart';
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
-    expectComments(result.tokens.next, ['// @dart = 2.3'], 0);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
+    expectComments(result.tokens.next!, ['// @dart = 2.3'], 0);
   }
 
   void test_languageVersion_beforeLibrary() {
@@ -872,8 +870,8 @@
 library foo;
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, ['// @dart = 2.3'], 0);
   }
 
@@ -883,8 +881,8 @@
 library foo;
 main() {}
 ''');
-    expect(languageVersion.major, 2);
-    expect(languageVersion.minor, 3);
+    expect(languageVersion!.major, 2);
+    expect(languageVersion!.minor, 3);
     expectComments(result.tokens, ['// @dart=2.3'], 0);
   }
 
@@ -935,14 +933,14 @@
     expect(token.charOffset, 14, reason: 'error token : $token, ${token.type}');
     expect(token.charCount, 3, reason: 'error token : $token, ${token.type}');
 
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, 'var');
     int index = 0;
     while (!token.isEof) {
       expect(token.charOffset, lineStarts[index],
           reason: 'token # $index : $token, ${token.type}');
       ++index;
-      token = token.next;
+      token = token.next!;
     }
   }
 
@@ -955,21 +953,21 @@
     expect(token, const TypeMatcher<ErrorToken>());
     expect(token.charOffset, 14, reason: 'token # 0 : $token, ${token.type}');
 
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, 'var');
     int index = 0;
     while (!token.isEof) {
       expect(token.charOffset, lineStarts[index],
           reason: 'token # $index : $token, ${token.type}');
       ++index;
-      token = token.next;
+      token = token.next!;
     }
   }
 
   void expectComments(
-      Token token, List<String> expectedComments, int versionIndex) {
+      Token? token, List<String> expectedComments, int versionIndex) {
     int index = 0;
-    token = token.precedingComments;
+    token = token!.precedingComments;
     while (token != null) {
       if (index == versionIndex) {
         if (token is! fasta.LanguageVersionToken) {
diff --git a/pkg/front_end/test/scanner_replacement_test.dart b/pkg/front_end/test/scanner_replacement_test.dart
index dff9d26..f936db9 100644
--- a/pkg/front_end/test/scanner_replacement_test.dart
+++ b/pkg/front_end/test/scanner_replacement_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
-
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as fasta;
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart' as fasta;
 import 'package:_fe_analyzer_shared/src/scanner/token.dart' as analyzer;
@@ -30,7 +28,7 @@
 class ScannerTest_Replacement extends ScannerTestBase {
   @override
   analyzer.Token scanWithListener(String source, ErrorListener listener,
-      {fasta.ScannerConfiguration configuration}) {
+      {fasta.ScannerConfiguration? configuration}) {
     // Process the source similar to
     // pkg/analyzer/lib/src/dart/scanner/scanner.dart
     // to simulate replacing the analyzer scanner
@@ -49,9 +47,9 @@
   }
 
   void _assertOpenClosePair(String source) {
-    analyzer.BeginToken open = _scan(source);
-    fasta.Token close = open.next;
-    expect(close.next.isEof, isTrue);
+    analyzer.BeginToken open = _scan(source) as analyzer.BeginToken;
+    fasta.Token close = open.next!;
+    expect(close.next!.isEof, isTrue);
     expect(open.endGroup, close);
     expect(open.isSynthetic, isFalse);
     expect(close.isSynthetic, isFalse);
@@ -59,9 +57,10 @@
 
   void _assertOpenOnly(String source, String expectedCloser) {
     ErrorListener listener = new ErrorListener();
-    analyzer.BeginToken open = scanWithListener(source, listener);
-    fasta.Token close = open.next;
-    expect(close.next.isEof, isTrue);
+    analyzer.BeginToken open =
+        scanWithListener(source, listener) as analyzer.BeginToken;
+    fasta.Token close = open.next!;
+    expect(close.next!.isEof, isTrue);
     expect(open.endGroup, close);
     expect(open.isSynthetic, isFalse);
     expect(close.isSynthetic, isTrue);
@@ -82,7 +81,7 @@
     // ... but the length does *not* include the additional character
     // so as to be true to the original source.
     expect(token.length, source.length);
-    expect(token.next.isEof, isTrue);
+    expect(token.next!.isEof, isTrue);
     expect(listener.errors, hasLength(1));
     TestError error = listener.errors[0];
     expect(error.errorCode, ScannerErrorCode.MISSING_DIGIT);
@@ -93,8 +92,8 @@
   void test_lt() {
     // fasta does not automatically insert a closer for '<'
     // because it could be part of an expression rather than an opener
-    analyzer.BeginToken lt = _scan('<');
-    expect(lt.next.isEof, isTrue);
+    analyzer.BeginToken lt = _scan('<') as analyzer.BeginToken;
+    expect(lt.next!.isEof, isTrue);
     expect(lt.isSynthetic, isFalse);
   }
 
@@ -138,16 +137,18 @@
     // where both ')' are synthetic
     ErrorListener listener = new ErrorListener();
     var stringStart = scanWithListener(r'"${({(}}"', listener);
-    analyzer.BeginToken interpolationStart = stringStart.next;
-    analyzer.BeginToken openParen1 = interpolationStart.next;
-    analyzer.BeginToken openBrace = openParen1.next;
-    analyzer.BeginToken openParen2 = openBrace.next;
-    var closeParen2 = openParen2.next;
-    var closeBrace = closeParen2.next;
-    var closeParen1 = closeBrace.next;
-    var interpolationEnd = closeParen1.next;
-    var stringEnd = interpolationEnd.next;
-    var eof = stringEnd.next;
+    analyzer.BeginToken interpolationStart =
+        stringStart.next as analyzer.BeginToken;
+    analyzer.BeginToken openParen1 =
+        interpolationStart.next as analyzer.BeginToken;
+    analyzer.BeginToken openBrace = openParen1.next as analyzer.BeginToken;
+    analyzer.BeginToken openParen2 = openBrace.next as analyzer.BeginToken;
+    var closeParen2 = openParen2.next!;
+    var closeBrace = closeParen2.next!;
+    var closeParen1 = closeBrace.next!;
+    var interpolationEnd = closeParen1.next!;
+    var stringEnd = interpolationEnd.next!;
+    var eof = stringEnd.next!;
 
     expect(interpolationStart.endToken, same(interpolationEnd));
     expect(interpolationEnd.isSynthetic, isFalse);
@@ -168,14 +169,15 @@
   void test_unmatched_openers() {
     ErrorListener listener = new ErrorListener();
     // fasta inserts missing closers except for '<'
-    analyzer.BeginToken openBrace = scanWithListener('{[(<', listener);
-    analyzer.BeginToken openBracket = openBrace.next;
-    analyzer.BeginToken openParen = openBracket.next;
-    analyzer.BeginToken openLT = openParen.next;
-    var closeParen = openLT.next;
-    var closeBracket = closeParen.next;
-    var closeBrace = closeBracket.next;
-    var eof = closeBrace.next;
+    analyzer.BeginToken openBrace =
+        scanWithListener('{[(<', listener) as analyzer.BeginToken;
+    analyzer.BeginToken openBracket = openBrace.next as analyzer.BeginToken;
+    analyzer.BeginToken openParen = openBracket.next as analyzer.BeginToken;
+    analyzer.BeginToken openLT = openParen.next as analyzer.BeginToken;
+    var closeParen = openLT.next!;
+    var closeBracket = closeParen.next!;
+    var closeBrace = closeBracket.next!;
+    var eof = closeBrace.next!;
 
     expect(openBrace.endGroup, same(closeBrace));
     expect(openBracket.endGroup, same(closeBracket));
@@ -201,13 +203,13 @@
     // The default recovery strategy used by scanString
     // places all error tokens at the head of the stream.
     while (token.type == analyzer.TokenType.BAD_INPUT) {
-      translateErrorToken(token,
-          (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+      translateErrorToken(token as fasta.ErrorToken,
+          (ScannerErrorCode errorCode, int offset, List<Object>? arguments) {
         listener.errors.add(new TestError(offset, errorCode, arguments));
       });
-      token = token.next;
+      token = token.next!;
     }
-    if (!token.previous.isEof) {
+    if (!token.previous!.isEof) {
       new analyzer.Token.eof(-1).setNext(token);
     }
     return token;
@@ -217,20 +219,20 @@
   void assertValidTokenStream(fasta.Token firstToken,
       {bool errorsFirst: false}) {
     fasta.Token token = firstToken;
-    fasta.Token previous = token.previous;
+    fasta.Token previous = token.previous!;
     expect(previous.isEof, isTrue, reason: 'Missing leading EOF');
     expect(previous.next, token, reason: 'Invalid leading EOF');
     expect(previous.previous, previous, reason: 'Invalid leading EOF');
     if (errorsFirst) {
       while (!token.isEof && token is fasta.ErrorToken) {
-        token = token.next;
+        token = token.next!;
       }
     }
     var isNotErrorToken = isNot(const TypeMatcher<fasta.ErrorToken>());
     while (!token.isEof) {
       if (errorsFirst) expect(token, isNotErrorToken);
       previous = token;
-      token = token.next;
+      token = token.next!;
       expect(token, isNotNull, reason: previous.toString());
       expect(token.previous, previous, reason: token.toString());
     }
@@ -258,7 +260,7 @@
       } else if (token is fasta.UnmatchedToken) {
         errorStack.add(token);
       }
-      token = token.next;
+      token = token.next!;
     }
     expect(openerStack, isEmpty, reason: 'Missing closers');
     expect(errorStack, isEmpty, reason: 'Extra error tokens');
diff --git a/pkg/front_end/test/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
index cbf28bc..08c21e7 100644
--- a/pkg/front_end/test/scanner_test.dart
+++ b/pkg/front_end/test/scanner_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
-
 import 'package:_fe_analyzer_shared/src/base/errors.dart';
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
     show AbstractScanner, ScannerConfiguration;
@@ -82,7 +80,7 @@
 
 abstract class ScannerTestBase {
   Token scanWithListener(String source, ErrorListener listener,
-      {ScannerConfiguration configuration});
+      {ScannerConfiguration? configuration});
 
   void test_ampersand() {
     _assertToken(TokenType.AMPERSAND, "&");
@@ -104,9 +102,9 @@
 
   void test_angle_brackets() {
     var lessThan = _scan('<String>');
-    var identifier = lessThan.next;
-    var greaterThan = identifier.next;
-    expect(greaterThan.next.type, TokenType.EOF);
+    var identifier = lessThan.next!;
+    var greaterThan = identifier.next!;
+    expect(greaterThan.next!.type, TokenType.EOF);
     // Analyzer's token streams don't consider "<" to be an opener
     // but fasta does.
     if (lessThan is BeginToken) {
@@ -119,8 +117,8 @@
     Token token = _scan("async*");
     expect(token.type.isKeyword, true);
     expect(token.lexeme, 'async');
-    expect(token.next.type, TokenType.STAR);
-    expect(token.next.next.type, TokenType.EOF);
+    expect(token.next!.type, TokenType.STAR);
+    expect(token.next!.next!.type, TokenType.EOF);
   }
 
   void test_at() {
@@ -197,30 +195,30 @@
     Token token = _scan("/* x */ /* y */ z");
     expect(token.type, TokenType.IDENTIFIER);
     expect(token.precedingComments, isNotNull);
-    expect(token.precedingComments.value(), "/* x */");
-    expect(token.precedingComments.previous, isNull);
-    expect(token.precedingComments.next, isNotNull);
-    expect(token.precedingComments.next.value(), "/* y */");
+    expect(token.precedingComments!.value(), "/* x */");
+    expect(token.precedingComments!.previous, isNull);
+    expect(token.precedingComments!.next, isNotNull);
+    expect(token.precedingComments!.next!.value(), "/* y */");
     expect(
-        token.precedingComments.next.previous, same(token.precedingComments));
-    expect(token.precedingComments.next.next, isNull);
+        token.precedingComments!.next!.previous, same(token.precedingComments));
+    expect(token.precedingComments!.next!.next, isNull);
   }
 
   void test_comment_multi_consecutive_3() {
     Token token = _scan("/* x */ /* y */ /* z */ a");
     expect(token.type, TokenType.IDENTIFIER);
     expect(token.precedingComments, isNotNull);
-    expect(token.precedingComments.value(), "/* x */");
-    expect(token.precedingComments.previous, isNull);
-    expect(token.precedingComments.next, isNotNull);
-    expect(token.precedingComments.next.value(), "/* y */");
+    expect(token.precedingComments!.value(), "/* x */");
+    expect(token.precedingComments!.previous, isNull);
+    expect(token.precedingComments!.next, isNotNull);
+    expect(token.precedingComments!.next!.value(), "/* y */");
     expect(
-        token.precedingComments.next.previous, same(token.precedingComments));
-    expect(token.precedingComments.next.next, isNotNull);
-    expect(token.precedingComments.next.next.value(), "/* z */");
-    expect(token.precedingComments.next.next.previous,
-        same(token.precedingComments.next));
-    expect(token.precedingComments.next.next.next, isNull);
+        token.precedingComments!.next!.previous, same(token.precedingComments));
+    expect(token.precedingComments!.next!.next, isNotNull);
+    expect(token.precedingComments!.next!.next!.value(), "/* z */");
+    expect(token.precedingComments!.next!.next!.previous,
+        same(token.precedingComments!.next));
+    expect(token.precedingComments!.next!.next!.next, isNull);
   }
 
   void test_comment_multi_unterminated() {
@@ -307,9 +305,9 @@
   void test_hexadecimal_missingDigit() {
     var token = _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 5, "a = 0x");
     expect(token.lexeme, 'a');
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '=');
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '0x0');
   }
 
@@ -334,12 +332,12 @@
     ]);
     var token = tokens;
     expect(token.lexeme, 'a');
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '=');
-    token = token.next;
+    token = token.next!;
     expect(token.type, TokenType.IDENTIFIER);
     expect(token.lexeme, "Shche\u0433lov\u0429x");
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, ';');
   }
 
@@ -355,12 +353,12 @@
     var token = _assertError(
         ScannerErrorCode.ILLEGAL_CHARACTER, 4, 'a = \u0429;', [0x429]);
     expect(token.lexeme, 'a');
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '=');
-    token = token.next;
+    token = token.next!;
     expect(token.type, TokenType.IDENTIFIER);
     expect(token.lexeme, "\u0429");
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, ';');
   }
 
@@ -711,41 +709,41 @@
   }
 
   void test_matching_braces() {
-    BeginToken openBrace1 = _scan('{1: {2: 3}}');
-    var one = openBrace1.next;
-    var colon1 = one.next;
-    BeginToken openBrace2 = colon1.next;
-    var two = openBrace2.next;
-    var colon2 = two.next;
-    var three = colon2.next;
-    var closeBrace1 = three.next;
-    var closeBrace2 = closeBrace1.next;
-    expect(closeBrace2.next.type, TokenType.EOF);
+    BeginToken openBrace1 = _scan('{1: {2: 3}}') as BeginToken;
+    var one = openBrace1.next!;
+    var colon1 = one.next!;
+    BeginToken openBrace2 = colon1.next as BeginToken;
+    var two = openBrace2.next!;
+    var colon2 = two.next!;
+    var three = colon2.next!;
+    var closeBrace1 = three.next!;
+    var closeBrace2 = closeBrace1.next!;
+    expect(closeBrace2.next!.type, TokenType.EOF);
     expect(openBrace1.endToken, same(closeBrace2));
     expect(openBrace2.endToken, same(closeBrace1));
   }
 
   void test_matching_brackets() {
-    BeginToken openBracket1 = _scan('[1, [2]]');
-    var one = openBracket1.next;
-    var comma = one.next;
-    BeginToken openBracket2 = comma.next;
-    var two = openBracket2.next;
-    var closeBracket1 = two.next;
-    var closeBracket2 = closeBracket1.next;
-    expect(closeBracket2.next.type, TokenType.EOF);
+    BeginToken openBracket1 = _scan('[1, [2]]') as BeginToken;
+    var one = openBracket1.next!;
+    var comma = one.next!;
+    BeginToken openBracket2 = comma.next as BeginToken;
+    var two = openBracket2.next!;
+    var closeBracket1 = two.next!;
+    var closeBracket2 = closeBracket1.next!;
+    expect(closeBracket2.next!.type, TokenType.EOF);
     expect(openBracket1.endToken, same(closeBracket2));
     expect(openBracket2.endToken, same(closeBracket1));
   }
 
   void test_matching_parens() {
-    BeginToken openParen1 = _scan('(f(x))');
-    var f = openParen1.next;
-    BeginToken openParen2 = f.next;
-    var x = openParen2.next;
-    var closeParen1 = x.next;
-    var closeParen2 = closeParen1.next;
-    expect(closeParen2.next.type, TokenType.EOF);
+    BeginToken openParen1 = _scan('(f(x))') as BeginToken;
+    var f = openParen1.next!;
+    BeginToken openParen2 = f.next as BeginToken;
+    var x = openParen2.next!;
+    var closeParen1 = x.next!;
+    var closeParen2 = closeParen1.next!;
+    expect(closeParen2.next!.type, TokenType.EOF);
     expect(openParen1.endToken, same(closeParen2));
     expect(openParen2.endToken, same(closeParen1));
   }
@@ -769,10 +767,10 @@
     // In this particular case, fasta cannot find an opener for ']'
     // and thus marks ']' as an error and moves on.
     ErrorListener listener = new ErrorListener();
-    BeginToken openParen = scanWithListener('(])', listener);
-    var closeBracket = openParen.next;
-    var closeParen = closeBracket.next;
-    expect(closeParen.next.type, TokenType.EOF);
+    BeginToken openParen = scanWithListener('(])', listener) as BeginToken;
+    var closeBracket = openParen.next!;
+    var closeParen = closeBracket.next!;
+    expect(closeParen.next!.type, TokenType.EOF);
     expect(openParen.endToken, same(closeParen));
     listener.assertNoErrors();
   }
@@ -792,15 +790,15 @@
     //    2 recoveries).
     // Both options are "equally bad" and the first choise is made.
     ErrorListener listener = new ErrorListener();
-    BeginToken openBracket = scanWithListener('[(])', listener);
-    BeginToken openParen = openBracket.next;
-    var closeParen = openParen.next;
+    BeginToken openBracket = scanWithListener('[(])', listener) as BeginToken;
+    BeginToken openParen = openBracket.next as BeginToken;
+    var closeParen = openParen.next!;
     expect(closeParen.isSynthetic, isTrue);
-    var closeBracket = closeParen.next;
+    var closeBracket = closeParen.next!;
     expect(closeBracket.isSynthetic, isFalse);
-    var closeParen2 = closeBracket.next;
+    var closeParen2 = closeBracket.next!;
     expect(closeParen2.isSynthetic, isFalse);
-    expect(closeParen2.next.type, TokenType.EOF);
+    expect(closeParen2.next!.type, TokenType.EOF);
     expect(openBracket.endToken, same(closeBracket));
     expect(openParen.endToken, same(closeParen));
     listener.assertErrors([
@@ -813,17 +811,17 @@
     // closer to be mismatched, which means that `([)` parses as three unmatched
     // tokens.
     ErrorListener listener = new ErrorListener();
-    BeginToken openParen = scanWithListener('([)', listener);
-    BeginToken openBracket = openParen.next;
+    BeginToken openParen = scanWithListener('([)', listener) as BeginToken;
+    BeginToken openBracket = openParen.next as BeginToken;
     // When openers and closers are mismatched,
     // fasta favors considering the opener to be mismatched
     // and inserts synthetic closers as needed.
     // `([)` is scanned as `([])` where `]` is synthetic.
-    var closeBracket = openBracket.next;
+    var closeBracket = openBracket.next!;
     expect(closeBracket.isSynthetic, isTrue);
-    var closeParen = closeBracket.next;
+    var closeParen = closeBracket.next!;
     expect(closeParen.isSynthetic, isFalse);
-    expect(closeParen.next.type, TokenType.EOF);
+    expect(closeParen.next!.type, TokenType.EOF);
     expect(openBracket.endToken, closeBracket);
     expect(openParen.endToken, closeParen);
     listener.assertErrors([
@@ -837,14 +835,14 @@
     // unmatched tokens, which means that `"${({(}}"` parses as though the open
     // parens are unmatched but everything else is matched.
     var stringStart = _scan(r'"${({(}}"');
-    BeginToken interpolationStart = stringStart.next;
-    BeginToken openParen1 = interpolationStart.next;
-    BeginToken openBrace = openParen1.next;
-    BeginToken openParen2 = openBrace.next;
-    var closeBrace = openParen2.next;
-    var interpolationEnd = closeBrace.next;
-    var stringEnd = interpolationEnd.next;
-    expect(stringEnd.next.type, TokenType.EOF);
+    BeginToken interpolationStart = stringStart.next as BeginToken;
+    BeginToken openParen1 = interpolationStart.next as BeginToken;
+    BeginToken openBrace = openParen1.next as BeginToken;
+    BeginToken openParen2 = openBrace.next as BeginToken;
+    var closeBrace = openParen2.next!;
+    var interpolationEnd = closeBrace.next!;
+    var stringEnd = interpolationEnd.next!;
+    expect(stringEnd.next!.type, TokenType.EOF);
     expect(interpolationStart.endToken, same(interpolationEnd));
     expect(openParen1.endToken, isNull);
     expect(openBrace.endToken, same(closeBrace));
@@ -966,12 +964,12 @@
   void test_startAndEnd() {
     Token token = _scan("a");
     expect(token.offset, 0);
-    Token previous = token.previous;
+    Token previous = token.previous!;
     expect(previous.next, token);
     expect(previous.previous, previous);
     expect(previous.type, TokenType.EOF);
     expect(previous.offset, -1);
-    Token next = token.next;
+    Token next = token.next!;
     expect(next.next, next);
     expect(next.previous, token);
     expect(next.type, TokenType.EOF);
@@ -1290,8 +1288,8 @@
     Token token = _scan("sync*");
     expect(token.type.isKeyword, true);
     expect(token.lexeme, 'sync');
-    expect(token.next.type, TokenType.STAR);
-    expect(token.next.next.type, TokenType.EOF);
+    expect(token.next!.type, TokenType.STAR);
+    expect(token.next!.next!.type, TokenType.EOF);
   }
 
   void test_tilde() {
@@ -1312,10 +1310,10 @@
   }
 
   void test_unmatched_openers() {
-    BeginToken openBrace = _scan('{[(');
-    BeginToken openBracket = openBrace.next;
-    BeginToken openParen = openBracket.next;
-    expect(openParen.next.type, TokenType.EOF);
+    BeginToken openBrace = _scan('{[(') as BeginToken;
+    BeginToken openBracket = openBrace.next as BeginToken;
+    BeginToken openParen = openBracket.next as BeginToken;
+    expect(openParen.next!.type, TokenType.EOF);
     expect(openBrace.endToken, isNull);
     expect(openBracket.endToken, isNull);
     expect(openParen.endToken, isNull);
@@ -1328,9 +1326,9 @@
     Token token = _scan(source);
     expect(token, isNotNull);
     expect(token.type, TokenType.EOF);
-    Token comment = token.precedingComments;
+    Token? comment = token.precedingComments;
     expect(comment, isNotNull);
-    expect(comment.type, commentType);
+    expect(comment!.type, commentType);
     expect(comment.offset, 0);
     expect(comment.length, source.length);
     expect(comment.lexeme, source);
@@ -1342,7 +1340,7 @@
     expect(token.type, TokenType.EOF);
     comment = token.precedingComments;
     expect(comment, isNotNull);
-    expect(comment.type, commentType);
+    expect(comment!.type, commentType);
     expect(comment.offset, 0);
     expect(comment.length, source.length);
     expect(comment.lexeme, source);
@@ -1358,7 +1356,7 @@
    */
   Token _assertError(
       ScannerErrorCode expectedError, int expectedOffset, String source,
-      [List<Object> arguments]) {
+      [List<Object>? arguments]) {
     ErrorListener listener = new ErrorListener();
     var tokens = scanWithListener(source, listener);
     listener.assertErrors(
@@ -1388,7 +1386,7 @@
    * with the same lexeme as the original source.
    */
   void _assertKeywordToken(String source,
-      {ScannerConfiguration configuration}) {
+      {ScannerConfiguration? configuration}) {
     Token token = _scan(source, configuration: configuration);
     expect(token, isNotNull);
     expect(token.type.isKeyword, true);
@@ -1407,7 +1405,7 @@
     value = token.value();
     expect(value is Keyword, isTrue);
     expect((value as Keyword).lexeme, source);
-    expect(token.next.type, TokenType.EOF);
+    expect(token.next!.type, TokenType.EOF);
   }
 
   /**
@@ -1415,7 +1413,7 @@
    * token with the same lexeme as the original source.
    */
   void _assertNotKeywordToken(String source,
-      {ScannerConfiguration configuration}) {
+      {ScannerConfiguration? configuration}) {
     Token token = _scan(source, configuration: configuration);
     expect(token, isNotNull);
     expect(token.type.isKeyword, false);
@@ -1428,7 +1426,7 @@
     expect(token.offset, 1);
     expect(token.length, source.length);
     expect(token.lexeme, source);
-    expect(token.next.type, TokenType.EOF);
+    expect(token.next!.type, TokenType.EOF);
   }
 
   /**
@@ -1494,10 +1492,11 @@
 
   void _checkTokens(Token firstToken, List<Token> expectedTokens) {
     expect(firstToken, isNotNull);
-    Token token = firstToken;
+    Token? token = firstToken;
     for (int i = 0; i < expectedTokens.length; i++) {
       Token expectedToken = expectedTokens[i];
-      expect(token.type, expectedToken.type, reason: "Wrong type for token $i");
+      expect(token!.type, expectedToken.type,
+          reason: "Wrong type for token $i");
       expect(token.offset, expectedToken.offset,
           reason: "Wrong offset for token $i");
       expect(token.length, expectedToken.length,
@@ -1507,11 +1506,11 @@
       token = token.next;
       expect(token, isNotNull);
     }
-    expect(token.type, TokenType.EOF);
+    expect(token!.type, TokenType.EOF);
   }
 
   Token _scan(String source,
-      {ScannerConfiguration configuration, bool ignoreErrors: false}) {
+      {ScannerConfiguration? configuration, bool ignoreErrors: false}) {
     ErrorListener listener = new ErrorListener();
     Token token =
         scanWithListener(source, listener, configuration: configuration);
@@ -1539,7 +1538,7 @@
 class TestError {
   final int offset;
   final ErrorCode errorCode;
-  final List<Object> arguments;
+  final List<Object>? arguments;
 
   TestError(this.offset, this.errorCode, this.arguments);
 
@@ -1547,7 +1546,7 @@
   int get hashCode {
     int h = combineHash(combineHash(0, offset), errorCode.hashCode);
     if (arguments != null) {
-      for (Object argument in arguments) {
+      for (Object argument in arguments!) {
         h = combineHash(h, argument.hashCode);
       }
     }
@@ -1561,9 +1560,9 @@
         errorCode == other.errorCode) {
       if (arguments == null) return other.arguments == null;
       if (other.arguments == null) return false;
-      if (arguments.length != other.arguments.length) return false;
-      for (int i = 0; i < arguments.length; i++) {
-        if (arguments[i] != other.arguments[i]) return false;
+      if (arguments!.length != other.arguments!.length) return false;
+      for (int i = 0; i < arguments!.length; i++) {
+        if (arguments![i] != other.arguments![i]) return false;
       }
       return true;
     }
@@ -1572,7 +1571,7 @@
 
   @override
   String toString() {
-    var argString = arguments == null ? '' : '(${arguments.join(', ')})';
+    var argString = arguments == null ? '' : '(${arguments!.join(', ')})';
     return 'Error($offset, $errorCode$argString)';
   }
 }
diff --git a/pkg/front_end/test/scheme_based_file_system_test.dart b/pkg/front_end/test/scheme_based_file_system_test.dart
index 2cbe46e..4332fca 100644
--- a/pkg/front_end/test/scheme_based_file_system_test.dart
+++ b/pkg/front_end/test/scheme_based_file_system_test.dart
@@ -2,53 +2,32 @@
 // 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:front_end/src/api_prototype/file_system.dart';
 import 'package:front_end/src/scheme_based_file_system.dart';
 
 import 'package:test/test.dart';
 
+import 'mock_file_system.dart';
+
 void main() {
   test('lookup of registered schemes is handled', () {
-    var fs1 = new MockFileSystem('scheme1');
-    var fs2 = new MockFileSystem('scheme2');
+    var fs1 = new MockFileSystem(scheme: 'scheme1');
+    var fs2 = new MockFileSystem(scheme: 'scheme2');
     var fileSystem =
         new SchemeBasedFileSystem({'scheme1': fs1, 'scheme2': fs2});
 
-    MockFileSystemEntity e1 =
-        fileSystem.entityForUri(Uri.parse('scheme1:a.dart'));
-    MockFileSystemEntity e2 =
-        fileSystem.entityForUri(Uri.parse('scheme2:a.dart'));
+    MockFileSystemEntity e1 = fileSystem
+        .entityForUri(Uri.parse('scheme1:a.dart')) as MockFileSystemEntity;
+    MockFileSystemEntity e2 = fileSystem
+        .entityForUri(Uri.parse('scheme2:a.dart')) as MockFileSystemEntity;
     expect(e1.fileSystem, fs1);
     expect(e2.fileSystem, fs2);
   });
 
   test('lookup of an unregistered scheme will throw', () {
-    var fileSystem =
-        new SchemeBasedFileSystem({'scheme1': new MockFileSystem('scheme1')});
+    var fileSystem = new SchemeBasedFileSystem(
+        {'scheme1': new MockFileSystem(scheme: 'scheme1')});
     expect(() => fileSystem.entityForUri(Uri.parse('scheme2:a.dart')),
         throwsA((e) => e is FileSystemException));
   });
 }
-
-class MockFileSystem implements FileSystem {
-  String scheme;
-  MockFileSystem(this.scheme);
-
-  @override
-  FileSystemEntity entityForUri(Uri uri) {
-    if (uri.scheme != scheme) throw "unsupported";
-    return new MockFileSystemEntity(uri, this);
-  }
-}
-
-class MockFileSystemEntity implements FileSystemEntity {
-  @override
-  final Uri uri;
-  final FileSystem fileSystem;
-  MockFileSystemEntity(this.uri, this.fileSystem);
-
-  @override
-  dynamic noSuchMethod(m) => super.noSuchMethod(m);
-}
diff --git a/pkg/front_end/test/severity_index_test.dart b/pkg/front_end/test/severity_index_test.dart
index 105e46b..e404f6a 100644
--- a/pkg/front_end/test/severity_index_test.dart
+++ b/pkg/front_end/test/severity_index_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
-
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
 /// Test that Severity has the expected indexes. Note that this is important
diff --git a/pkg/front_end/test/spell_checking_cleanup_lists.dart b/pkg/front_end/test/spell_checking_cleanup_lists.dart
index ea44732..f2b9684 100644
--- a/pkg/front_end/test/spell_checking_cleanup_lists.dart
+++ b/pkg/front_end/test/spell_checking_cleanup_lists.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 'dart:io';
 
 import 'spell_checking_utils.dart' as spell;
@@ -12,7 +10,7 @@
   {
     spell.ensureDictionariesLoaded([spell.Dictionaries.common]);
     Set<String> commonWords =
-        spell.loadedDictionaries[spell.Dictionaries.common];
+        spell.loadedDictionaries![spell.Dictionaries.common]!;
     for (spell.Dictionaries dictionary in spell.Dictionaries.values) {
       if (dictionary == spell.Dictionaries.common) continue;
       Uri uri = spell.dictionaryToUri(dictionary);
@@ -30,7 +28,7 @@
   {
     spell.ensureDictionariesLoaded([spell.Dictionaries.cfeCode]);
     Set<String> codeWords =
-        spell.loadedDictionaries[spell.Dictionaries.cfeCode];
+        spell.loadedDictionaries![spell.Dictionaries.cfeCode]!;
     Uri uri = spell.dictionaryToUri(spell.Dictionaries.cfeTests);
     List<String> keep = <String>[];
     for (String line in new File.fromUri(uri).readAsLinesSync()) {
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 5746a68..81e6368 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -11,6 +11,7 @@
 
 a+b
 abbreviate
+abc
 abcdef
 abs
 accounting
@@ -46,6 +47,7 @@
 anyone
 ap
 api
+apis
 app
 apparently
 applicable
@@ -72,6 +74,11 @@
 atom
 atoms
 attributes
+augment
+augmentation
+augmentations
+augmenting
+augments
 auto
 automagically
 auxiliary
@@ -139,6 +146,7 @@
 breadcrumbs
 brevity
 brianwilkerson
+bridge
 bs
 bsd
 bslash
@@ -178,6 +186,7 @@
 charcode
 chars
 checkpoint
+chloestefantsova
 chunks
 ci
 circuited
@@ -216,21 +225,25 @@
 codec
 codes
 collision
+coloring
 colorized
 com
 combinations
 combinator
 combine2
 combiner
+communication
 compared
 compares
 compilations
+completers
 completes
 complicating
 component's
 comprehensive
 compressed
 compression
+comprise
 concat
 concatenate
 concerned
@@ -249,6 +262,7 @@
 containers
 continuations
 contra
+contribute
 convention
 coordinated
 coordinating
@@ -271,6 +285,7 @@
 cryptic
 crypto
 csslib
+cstefantsova
 ctx
 customized
 cut
@@ -288,6 +303,7 @@
 dartbug
 dartdoc
 dartfix
+dartino
 dartlang
 dashes
 dc
@@ -305,6 +321,7 @@
 deeply
 def
 defaulting
+definitions
 degrades
 degree
 del
@@ -329,10 +346,12 @@
 destination
 destinations
 destroy
+destructive
 deterministic
 dev
 device
 diff
+differs
 diffs
 digest
 digests
@@ -346,6 +365,7 @@
 disallow
 disambiguating
 disambiguator
+discovers
 disjoint
 dispatched
 distribute
@@ -398,6 +418,7 @@
 engineered
 enhanced
 enters
+entrypointish
 enumerates
 env
 eof
@@ -412,6 +433,7 @@
 estimate
 eval
 execute
+executor
 exhausted
 existence
 existentially
@@ -457,6 +479,7 @@
 fieldformal
 file's
 filenames
+fileuri
 finally's
 finv
 firsts
@@ -523,6 +546,7 @@
 goto
 gotos
 gradually
+granted
 graphs
 growability
 gt
@@ -620,6 +644,7 @@
 int64
 int8
 integrate
+intends
 intentionally
 interested
 interim
@@ -632,10 +657,14 @@
 interval
 intervals
 intl
+introspect
+introspection
+introspector
 ints
 invariants
 io
 is64
+isolate
 isolated
 issuecomment
 issuing
@@ -650,6 +679,7 @@
 java
 jenkins
 jensj
+job
 johnniwinther
 js
 json
@@ -661,6 +691,7 @@
 kallentu
 kernel's
 kernel2kernel
+kill
 klass
 kmillikin
 kotlin
@@ -677,6 +708,8 @@
 launched
 launcher
 layer
+layered
+layers
 layout
 lc
 ld
@@ -685,6 +718,7 @@
 len
 lets
 letting
+levels
 lex
 lexemes
 lf
@@ -693,6 +727,7 @@
 libs
 lifted
 lifter
+limiting
 linearized
 linebreak
 linter
@@ -721,6 +756,8 @@
 lz
 m
 macos
+macro
+macros
 maintaining
 mangled
 manipulation
@@ -857,6 +894,7 @@
 orphans
 ors
 os
+outlined
 outputs
 outputting
 overlap
@@ -888,6 +926,7 @@
 parens
 parenteses
 particularly
+partof
 patchup
 path
 patterns
@@ -928,7 +967,10 @@
 prebuilt
 preexisted
 preexisting
+premark
 preorder
+prepares
+preprocess
 presented
 presubmit
 presumably
@@ -939,16 +981,19 @@
 println
 prioritization
 proc
+processor
 producers
 product
 progresses
 promo
 proof
 prop
+proposal
 propose
 proposed
 proto
 protobuf
+protocol
 ps
 pulled
 pure
@@ -1014,6 +1059,7 @@
 recompiling
 recompute
 recomputed
+recorder
 recoveries
 recreate
 recursion
@@ -1026,6 +1072,7 @@
 reexports
 ref
 reflect
+reflectee
 reflective
 reg
 regis
@@ -1041,6 +1088,8 @@
 relaxes
 released
 relink
+reload
+reloading
 remapped
 remedy
 removal
@@ -1057,11 +1106,14 @@
 repo
 repositories
 repurposed
+requests
 requirement
 res
 residue
 resource
 respond
+response
+responses
 restoring
 restriction
 resumed
@@ -1081,6 +1133,7 @@
 role
 room
 rooted
+rough
 roughly
 rounding
 roundtrip
@@ -1108,11 +1161,13 @@
 separators
 sequencing
 sequential
+serializable
 serializables
 serializer
 serializers
 serve
 server
+serves
 service
 session
 setable
@@ -1131,6 +1186,8 @@
 shr
 shrinking
 shru
+shut
+shutting
 si
 sibling
 siblings
@@ -1163,6 +1220,8 @@
 sourcemap
 spaced
 sparse
+spawn
+spawns
 spec
 spec'ed
 specialization
@@ -1195,6 +1254,7 @@
 stopgap
 stopped
 storage
+story
 str
 strategies
 streak
@@ -1211,6 +1271,7 @@
 subexpression
 subexpression's
 subexpressions
+subgraph
 subnode
 subnodes
 subscription
@@ -1221,6 +1282,7 @@
 substitutes
 substitutor
 suggests
+suite
 sum
 summarizing
 superclasses
@@ -1358,9 +1420,11 @@
 unifiable
 unification
 unifier
+unifies
 unify
 uninstantiable
 uninstantiated
+unintentionally
 unions
 uniqueness
 unittest
@@ -1381,6 +1445,7 @@
 unsortable
 unsound
 unsoundness
+untouched
 unwrapper
 unwraps
 unwritten
@@ -1391,6 +1456,7 @@
 uri's
 url
 urls
+usages
 usr
 usual
 usually
@@ -1427,6 +1493,7 @@
 w
 waiting
 wanting
+wants
 waste
 wasted
 watch
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index cad9efd..39c9d6c 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -11,6 +11,7 @@
 
 a
 abbreviations
+abi
 ability
 able
 abort
@@ -436,7 +437,6 @@
 checking
 checkpoints
 checks
-chian
 child
 children
 choice
@@ -598,6 +598,7 @@
 consider
 considered
 considers
+consist
 consistency
 consistent
 consistently
@@ -2045,6 +2046,7 @@
 ok
 old
 older
+omission
 omit
 omitted
 on
diff --git a/pkg/front_end/test/spell_checking_list_messages.txt b/pkg/front_end/test/spell_checking_list_messages.txt
index ffc3264..30bf90d 100644
--- a/pkg/front_end/test/spell_checking_list_messages.txt
+++ b/pkg/front_end/test/spell_checking_list_messages.txt
@@ -10,6 +10,8 @@
 # automatic tools might move it to the top of the file.
 
 JS
+abispecificinteger
+abispecificintegermapping
 adjusting
 api
 argument(s)
@@ -65,6 +67,7 @@
 pubspec.yaml
 re
 sdksummary
+size
 solutions
 stacktrace
 staticinterop
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index e6c4cf0..ea9623a 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -158,6 +158,7 @@
 cc
 ccc
 cell
+certificate
 cf
 characteristics
 charset
@@ -598,10 +599,13 @@
 la
 launch
 launching
+layered
 layers
 le
 legs
 lengths
+lib2a
+lib2b
 lightly
 likewise
 lily
@@ -643,6 +647,10 @@
 lookahead
 loopback
 mac
+macro
+macro2a
+macro2b
+macros
 maker
 matters
 mds
@@ -652,6 +660,7 @@
 metric
 metrics
 mf
+mfs
 micro
 minimize
 minimizer
@@ -666,6 +675,8 @@
 misspelled
 mistake
 mistakes
+mixin1
+mixin2
 mmethod
 mod
 modelled
@@ -692,6 +703,7 @@
 nonexisting
 noo
 noted
+nottest
 numerator
 ob
 obool
@@ -702,6 +714,7 @@
 ol
 onull
 oo
+oobar
 oocf
 ooo
 oovf
@@ -776,6 +789,9 @@
 quux
 quuz
 qux
+qux1
+qux3x
+qux4x
 r"
 r"\s
 r"k
@@ -785,6 +801,7 @@
 reality
 recompile
 recompiles
+recorder
 redir
 redirections
 rediscover
@@ -836,6 +853,7 @@
 sdkroot
 sdks
 secondary
+secondtest12part1usage
 segment
 selection
 semifuzz
@@ -887,6 +905,7 @@
 std
 stress
 string2
+stringy
 strip
 strongest
 stub's
@@ -918,8 +937,19 @@
 tails
 talk
 templates
+test10
+test12
+test12part1usage
+test13
+test13andahalf
+test15thing
+test16
+test16toplevel
 test3a
 test3b
+test3partfoo
+test8
+test9
 theoretically
 thereof
 thread
@@ -989,6 +1019,7 @@
 waiting
 waits
 walt
+wants
 warmup
 week
 weekly
@@ -1007,8 +1038,10 @@
 xxx
 xxxxxxxx
 xxxxxxxxxxxx
+xyz
 y's
 year
 yxxx
 yy
+zyx
 zz
diff --git a/pkg/front_end/test/spell_checking_utils.dart b/pkg/front_end/test/spell_checking_utils.dart
index c08fb4c..19347ef 100644
--- a/pkg/front_end/test/spell_checking_utils.dart
+++ b/pkg/front_end/test/spell_checking_utils.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 'dart:io' show File, stdin, stdout;
 
 import "utils/io_utils.dart";
@@ -19,17 +17,17 @@
   denylist,
 }
 
-Map<Dictionaries, Set<String>> loadedDictionaries;
+Map<Dictionaries, Set<String>>? loadedDictionaries;
 
 SpellingResult spellcheckString(String s,
-    {List<Dictionaries> dictionaries, bool splitAsCode: false}) {
+    {List<Dictionaries>? dictionaries, bool splitAsCode: false}) {
   dictionaries ??= const [Dictionaries.common];
   ensureDictionariesLoaded(dictionaries);
 
-  List<String> wrongWords;
-  List<List<String>> wrongWordsAlternatives;
-  List<int> wrongWordsOffset;
-  List<bool> wrongWordDenylisted;
+  List<String>? wrongWords;
+  List<List<String>?>? wrongWordsAlternatives;
+  List<int>? wrongWordsOffset;
+  List<bool>? wrongWordDenylisted;
   List<int> wordOffsets = <int>[];
   List<String> words =
       splitStringIntoWords(s, wordOffsets, splitAsCode: splitAsCode);
@@ -37,7 +35,7 @@
   for (int j = 0; j < dictionaries.length; j++) {
     Dictionaries dictionaryType = dictionaries[j];
     if (dictionaryType == Dictionaries.denylist) continue;
-    Set<String> dictionary = loadedDictionaries[dictionaryType];
+    Set<String> dictionary = loadedDictionaries![dictionaryType]!;
     dictionariesUnpacked.add(dictionary);
   }
   for (int i = 0; i < words.length; i++) {
@@ -53,15 +51,15 @@
       }
     }
     if (!found) {
-      wrongWords ??= <String>[];
+      wrongWords ??= [];
       wrongWords.add(word);
-      wrongWordsAlternatives ??= <List<String>>[];
+      wrongWordsAlternatives ??= [];
       wrongWordsAlternatives.add(findAlternatives(word, dictionariesUnpacked));
-      wrongWordsOffset ??= <int>[];
+      wrongWordsOffset ??= [];
       wrongWordsOffset.add(offset);
-      wrongWordDenylisted ??= <bool>[];
+      wrongWordDenylisted ??= [];
       wrongWordDenylisted
-          .add(loadedDictionaries[Dictionaries.denylist].contains(word));
+          .add(loadedDictionaries![Dictionaries.denylist]!.contains(word));
     }
   }
 
@@ -69,8 +67,8 @@
       wrongWordsAlternatives);
 }
 
-List<String> findAlternatives(String word, List<Set<String>> dictionaries) {
-  List<String> result;
+List<String>? findAlternatives(String word, List<Set<String>> dictionaries) {
+  List<String>? result;
 
   bool check(String w) {
     for (int j = 0; j < dictionaries.length; j++) {
@@ -81,8 +79,7 @@
   }
 
   void ok(String w) {
-    result ??= <String>[];
-    result.add(w);
+    (result ??= <String>[]).add(w);
   }
 
   // Delete a letter, insert a letter or change a letter and lookup.
@@ -111,10 +108,10 @@
 }
 
 class SpellingResult {
-  final List<String> misspelledWords;
-  final List<int> misspelledWordsOffset;
-  final List<bool> misspelledWordsDenylisted;
-  final List<List<String>> misspelledWordsAlternatives;
+  final List<String>? misspelledWords;
+  final List<int>? misspelledWordsOffset;
+  final List<bool>? misspelledWordsDenylisted;
+  final List<List<String>?>? misspelledWordsAlternatives;
 
   SpellingResult(this.misspelledWords, this.misspelledWordsOffset,
       this.misspelledWordsDenylisted, this.misspelledWordsAlternatives);
@@ -140,19 +137,19 @@
 
   loadedDictionaries ??= new Map<Dictionaries, Set<String>>();
   // Ensure the denylist is loaded.
-  Set<String> denylistDictionary = loadedDictionaries[Dictionaries.denylist];
+  Set<String>? denylistDictionary = loadedDictionaries![Dictionaries.denylist];
   if (denylistDictionary == null) {
     denylistDictionary = new Set<String>();
-    loadedDictionaries[Dictionaries.denylist] = denylistDictionary;
+    loadedDictionaries![Dictionaries.denylist] = denylistDictionary;
     addWords(dictionaryToUri(Dictionaries.denylist), denylistDictionary);
   }
 
   for (int j = 0; j < dictionaries.length; j++) {
     Dictionaries dictionaryType = dictionaries[j];
-    Set<String> dictionary = loadedDictionaries[dictionaryType];
+    Set<String>? dictionary = loadedDictionaries![dictionaryType];
     if (dictionary == null) {
       dictionary = new Set<String>();
-      loadedDictionaries[dictionaryType] = dictionary;
+      loadedDictionaries![dictionaryType] = dictionary;
       addWords(dictionaryToUri(dictionaryType), dictionary);
       // Check that no good words occur in the denylist.
       for (String s in dictionary) {
@@ -182,7 +179,6 @@
       return repoDir
           .resolve("pkg/front_end/test/spell_checking_list_denylist.txt");
   }
-  throw "Unknown Dictionary";
 }
 
 List<String> splitStringIntoWords(String s, List<int> splitOffsets,
@@ -370,7 +366,7 @@
     print("The following word(s) were reported as unknown:");
     print("----------------");
 
-    Dictionaries dictionaryToUse;
+    Dictionaries? dictionaryToUse;
     if (dictionaries.contains(Dictionaries.cfeTests)) {
       dictionaryToUse = Dictionaries.cfeTests;
     } else if (dictionaries.contains(Dictionaries.cfeMessages)) {
@@ -391,11 +387,11 @@
       for (String s in reportedWords) {
         print("- $s");
         String answer;
-        bool add;
+        bool? add;
         while (true) {
           stdout.write("Do you want to add the word to the dictionary "
               "$dictionaryToUse (y/n)? ");
-          answer = stdin.readLineSync().trim().toLowerCase();
+          answer = stdin.readLineSync()!.trim().toLowerCase();
           switch (answer) {
             case "y":
             case "yes":
diff --git a/pkg/front_end/test/spell_checking_utils_test.dart b/pkg/front_end/test/spell_checking_utils_test.dart
index 07c8904..b91ed891 100644
--- a/pkg/front_end/test/spell_checking_utils_test.dart
+++ b/pkg/front_end/test/spell_checking_utils_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
-
 import 'spell_checking_utils.dart';
 
 void main() {
@@ -98,7 +96,7 @@
   compareLists(actualOffsets, expectedOffsets);
 }
 
-void compareLists(List<dynamic> actual, List<dynamic> expected) {
+void compareLists(List<dynamic>? actual, List<dynamic>? expected) {
   if (actual == null && expected == null) return;
   if (actual == null) throw "Got null, expected $expected";
   if (expected == null) throw "Expected null, got $actual";
@@ -113,7 +111,7 @@
 }
 
 void expectAlternative(
-    String word, List<String> expected, Set<String> dictionary) {
-  List<String> alternatives = findAlternatives(word, [dictionary]);
+    String word, List<String>? expected, Set<String> dictionary) {
+  List<String>? alternatives = findAlternatives(word, [dictionary]);
   compareLists(alternatives, expected);
 }
diff --git a/pkg/front_end/test/spelling_test_base.dart b/pkg/front_end/test/spelling_test_base.dart
index fd1c94a..e6d43dc 100644
--- a/pkg/front_end/test/spelling_test_base.dart
+++ b/pkg/front_end/test/spelling_test_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.9
-
 import 'dart:io' show File, Platform;
 
 import 'dart:typed_data' show Uint8List;
@@ -37,7 +35,7 @@
   final bool interactive;
   final bool onlyInGit;
 
-  SpellContext({this.interactive, this.onlyInGit});
+  SpellContext({required this.interactive, required this.onlyInGit});
 
   // Override special handling of negative tests.
   @override
@@ -75,7 +73,7 @@
         dictionaries,
         interactive,
         '"$dartPath" "$suitePath" -DonlyInGit=$onlyInGit -Dinteractive=true');
-    return null;
+    return new Future.value();
   }
 }
 
@@ -97,14 +95,13 @@
     Utf8BytesScanner scanner =
         new Utf8BytesScanner(bytes, includeComments: true);
     Token firstToken = scanner.tokenize();
-    if (firstToken == null) return null;
-    Token token = firstToken;
+    Token? token = firstToken;
 
-    List<String> errors;
+    List<String>? errors;
     Source source = new Source(
         scanner.lineStarts, rawBytes, description.uri, description.uri);
     void addErrorMessage(
-        int offset, String word, bool denylisted, List<String> alternatives) {
+        int offset, String word, bool denylisted, List<String>? alternatives) {
       errors ??= <String>[];
       String message;
       if (denylisted) {
@@ -128,7 +125,7 @@
             "- $dictionaryPathString\n";
       }
       Location location = source.getLocation(description.uri, offset);
-      errors.add(command_line_reporting.formatErrorMessage(
+      errors!.add(command_line_reporting.formatErrorMessage(
           source.getTextLine(location.line),
           location,
           word.length,
@@ -142,20 +139,20 @@
         return pass(description);
       }
       if (token.precedingComments != null) {
-        Token comment = token.precedingComments;
+        Token? comment = token.precedingComments;
         while (comment != null) {
           spell.SpellingResult spellingResult = spell.spellcheckString(
               comment.lexeme,
               splitAsCode: true,
               dictionaries: context.dictionaries);
           if (spellingResult.misspelledWords != null) {
-            for (int i = 0; i < spellingResult.misspelledWords.length; i++) {
-              bool denylisted = spellingResult.misspelledWordsDenylisted[i];
+            for (int i = 0; i < spellingResult.misspelledWords!.length; i++) {
+              bool denylisted = spellingResult.misspelledWordsDenylisted![i];
               if (context.onlyDenylisted && !denylisted) continue;
               int offset =
-                  comment.offset + spellingResult.misspelledWordsOffset[i];
-              addErrorMessage(offset, spellingResult.misspelledWords[i],
-                  denylisted, spellingResult.misspelledWordsAlternatives[i]);
+                  comment.offset + spellingResult.misspelledWordsOffset![i];
+              addErrorMessage(offset, spellingResult.misspelledWords![i],
+                  denylisted, spellingResult.misspelledWordsAlternatives![i]);
             }
           }
           comment = comment.next;
@@ -167,12 +164,13 @@
             splitAsCode: true,
             dictionaries: context.dictionaries);
         if (spellingResult.misspelledWords != null) {
-          for (int i = 0; i < spellingResult.misspelledWords.length; i++) {
-            bool denylisted = spellingResult.misspelledWordsDenylisted[i];
+          for (int i = 0; i < spellingResult.misspelledWords!.length; i++) {
+            bool denylisted = spellingResult.misspelledWordsDenylisted![i];
             if (context.onlyDenylisted && !denylisted) continue;
-            int offset = token.offset + spellingResult.misspelledWordsOffset[i];
-            addErrorMessage(offset, spellingResult.misspelledWords[i],
-                denylisted, spellingResult.misspelledWordsAlternatives[i]);
+            int offset =
+                token.offset + spellingResult.misspelledWordsOffset![i];
+            addErrorMessage(offset, spellingResult.misspelledWords![i],
+                denylisted, spellingResult.misspelledWordsAlternatives![i]);
           }
         }
       } else if (token is KeywordToken || token is BeginToken) {
@@ -191,7 +189,7 @@
     if (errors == null) {
       return pass(description);
     } else {
-      return fail(description, errors.join("\n\n"));
+      return fail(description, errors!.join("\n\n"));
     }
   }
 }
diff --git a/pkg/front_end/test/spelling_test_external_targets.dart b/pkg/front_end/test/spelling_test_external_targets.dart
index 952f4b3..c2eef74 100644
--- a/pkg/front_end/test/spelling_test_external_targets.dart
+++ b/pkg/front_end/test/spelling_test_external_targets.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 'dart:io' show Directory, File, FileSystemEntity;
 
 import 'package:testing/testing.dart'
@@ -30,7 +28,7 @@
 }
 
 class SpellContextExternal extends SpellContext {
-  SpellContextExternal({bool interactive, bool onlyInGit})
+  SpellContextExternal({required bool interactive, required bool onlyInGit})
       : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
diff --git a/pkg/front_end/test/spelling_test_not_src_suite.dart b/pkg/front_end/test/spelling_test_not_src_suite.dart
index 9eb9921e..285e8fc 100644
--- a/pkg/front_end/test/spelling_test_not_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_not_src_suite.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:testing/testing.dart' show Chain, runMe;
 
 import 'spelling_test_base.dart';
@@ -26,7 +24,7 @@
 }
 
 class SpellContextTest extends SpellContext {
-  SpellContextTest({bool interactive, bool onlyInGit})
+  SpellContextTest({required bool interactive, required bool onlyInGit})
       : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
diff --git a/pkg/front_end/test/spelling_test_src_suite.dart b/pkg/front_end/test/spelling_test_src_suite.dart
index f77e918..066475a 100644
--- a/pkg/front_end/test/spelling_test_src_suite.dart
+++ b/pkg/front_end/test/spelling_test_src_suite.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:testing/testing.dart' show Chain, runMe;
 
 import 'spelling_test_base.dart';
@@ -26,7 +24,7 @@
 }
 
 class SpellContextSource extends SpellContext {
-  SpellContextSource({bool interactive, bool onlyInGit})
+  SpellContextSource({required bool interactive, required bool onlyInGit})
       : super(interactive: interactive, onlyInGit: onlyInGit);
 
   @override
diff --git a/pkg/front_end/test/split_dill_test.dart b/pkg/front_end/test/split_dill_test.dart
index 16484f2..9ff415d 100644
--- a/pkg/front_end/test/split_dill_test.dart
+++ b/pkg/front_end/test/split_dill_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
-
 import 'dart:io' show Directory, File, Platform, Process, ProcessResult;
 
 import 'dart:typed_data' show Uint8List;
diff --git a/pkg/front_end/test/src/base/processed_options_test.dart b/pkg/front_end/test/src/base/processed_options_test.dart
index 00c3a75..a0282ba 100644
--- a/pkg/front_end/test/src/base/processed_options_test.dart
+++ b/pkg/front_end/test/src/base/processed_options_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
-
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
@@ -36,7 +34,7 @@
   MemoryFileSystem fileSystem =
       new MemoryFileSystem(Uri.parse('org-dartlang-test:///'));
 
-  Component _mockOutline;
+  Component? _mockOutline;
 
   Component get mockSummary => _mockOutline ??= new Component(libraries: [
         new Library(Uri.parse('org-dartlang-test:///a/b.dart'),
@@ -87,7 +85,7 @@
       ..sdkSummary = uri;
     var processed = new ProcessedOptions(options: raw);
 
-    var bytes = await processed.loadSdkSummaryBytes();
+    var bytes = (await processed.loadSdkSummaryBytes())!;
     expect(bytes, isNotEmpty);
 
     var sdkSummary = loadComponentFromBytes(bytes);
@@ -111,7 +109,8 @@
 
   Future<Null> checkMockSummary(CompilerOptions raw) async {
     var processed = new ProcessedOptions(options: raw);
-    var sdkSummary = await processed.loadSdkSummary(new CanonicalName.root());
+    var sdkSummary =
+        (await processed.loadSdkSummary(new CanonicalName.root()))!;
     expect(sdkSummary.libraries.single.importUri,
         mockSummary.libraries.single.importUri);
   }
@@ -130,7 +129,7 @@
           Uri.parse('org-dartlang-test:///libraries.json');
     var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
-    expect(uriTranslator.dartLibraries.libraryInfoFor('foo').uri.path,
+    expect(uriTranslator.dartLibraries.libraryInfoFor('foo')!.uri.path,
         '/bar.dart');
   }
 
@@ -149,7 +148,7 @@
       ..sdkRoot = Uri.parse('org-dartlang-test:///mysdk/');
     var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
-    expect(uriTranslator.dartLibraries.libraryInfoFor('foo').uri.path,
+    expect(uriTranslator.dartLibraries.libraryInfoFor('foo')!.uri.path,
         '/mysdk/lib/bar.dart');
   }
 
diff --git a/pkg/front_end/test/standard_file_system_test.dart b/pkg/front_end/test/standard_file_system_test.dart
index c22913c..5092342 100644
--- a/pkg/front_end/test/standard_file_system_test.dart
+++ b/pkg/front_end/test/standard_file_system_test.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 // SharedOptions=--supermixin
 
-// @dart = 2.9
-
 library front_end.test.standard_file_system_test;
 
 import 'dart:convert';
@@ -31,8 +29,8 @@
 
 @reflectiveTest
 class DirectoryTest extends _BaseTest {
-  String path;
-  FileSystemEntity dir;
+  late String path;
+  late FileSystemEntity dir;
 
   @override
   void setUp() {
@@ -70,8 +68,8 @@
 
 @reflectiveTest
 class FileTest extends _BaseTest {
-  String path;
-  FileSystemEntity file;
+  late String path;
+  late FileSystemEntity file;
 
   @override
   void setUp() {
@@ -146,7 +144,7 @@
 
 @reflectiveTest
 class StandardFileSystemTest extends _BaseTest {
-  Uri tempUri;
+  late Uri tempUri;
 
   @override
   void setUp() {
@@ -231,8 +229,8 @@
 }
 
 class _BaseTest {
-  io.Directory tempDirectory;
-  String tempPath;
+  late io.Directory tempDirectory;
+  late String tempPath;
 
   FileSystemEntity entityForPath(String path) =>
       StandardFileSystem.instance.entityForUri(p.toUri(path));
diff --git a/pkg/front_end/test/static_types/analysis_helper.dart b/pkg/front_end/test/static_types/analysis_helper.dart
index 2e57c0e..6564bd1 100644
--- a/pkg/front_end/test/static_types/analysis_helper.dart
+++ b/pkg/front_end/test/static_types/analysis_helper.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 'dart:convert' as json;
 import 'dart:io';
 
@@ -25,7 +23,7 @@
 Future<void> run(Uri entryPoint, String allowedListPath,
     {bool verbose = false,
     bool generate = false,
-    bool analyzedUrisFilter(Uri uri)}) async {
+    bool Function(Uri uri)? analyzedUrisFilter}) async {
   CompilerOptions options = new CompilerOptions();
   options.sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
 
@@ -33,10 +31,10 @@
     printDiagnosticMessage(message, print);
   };
   InternalCompilerResult compilerResult = await kernelForProgramInternal(
-      entryPoint, options,
-      retainDataForTesting: true, requireMain: false);
+          entryPoint, options, retainDataForTesting: true, requireMain: false)
+      as InternalCompilerResult;
 
-  new DynamicVisitor(options.onDiagnostic, compilerResult.component,
+  new DynamicVisitor(options.onDiagnostic!, compilerResult.component!,
           allowedListPath, analyzedUrisFilter)
       .run(verbose: verbose, generate: generate);
 }
@@ -44,7 +42,7 @@
 class StaticTypeVisitorBase extends RecursiveVisitor {
   final TypeEnvironment typeEnvironment;
 
-  StaticTypeContext staticTypeContext;
+  StaticTypeContext? staticTypeContext;
 
   StaticTypeVisitorBase(Component component, ClassHierarchy classHierarchy)
       : typeEnvironment =
@@ -86,8 +84,8 @@
 
   final DiagnosticMessageHandler onDiagnostic;
   final Component component;
-  final String _allowedListPath;
-  final bool Function(Uri uri) analyzedUrisFilter;
+  final String? _allowedListPath;
+  final bool Function(Uri uri)? analyzedUrisFilter;
 
   Map _expectedJson = {};
   Map<String, Map<String, List<FormattedMessage>>> _actualMessages = {};
@@ -99,7 +97,7 @@
 
   void run({bool verbose = false, bool generate = false}) {
     if (!generate && _allowedListPath != null) {
-      File file = new File(_allowedListPath);
+      File file = new File(_allowedListPath!);
       if (file.existsSync()) {
         try {
           _expectedJson = json.jsonDecode(file.readAsStringSync());
@@ -121,14 +119,14 @@
         actualJson[uri] = map;
       });
 
-      new File(_allowedListPath).writeAsStringSync(
+      new File(_allowedListPath!).writeAsStringSync(
           new json.JsonEncoder.withIndent('  ').convert(actualJson));
       return;
     }
 
     int errorCount = 0;
     _expectedJson.forEach((uri, expectedMessages) {
-      Map<String, List<FormattedMessage>> actualMessagesMap =
+      Map<String, List<FormattedMessage>>? actualMessagesMap =
           _actualMessages[uri];
       if (actualMessagesMap == null) {
         print("Error: Allowed-listing of uri '$uri' isn't used. "
@@ -136,7 +134,7 @@
         errorCount++;
       } else {
         expectedMessages.forEach((expectedMessage, expectedCount) {
-          List<FormattedMessage> actualMessages =
+          List<FormattedMessage>? actualMessages =
               actualMessagesMap[expectedMessage];
           if (actualMessages == null) {
             print("Error: Allowed-listing of message '$expectedMessage' "
@@ -223,8 +221,8 @@
                                 locatedMessage.messageObject.correctionMessage,
                             arguments: locatedMessage.messageObject.arguments)),
                     Severity.warning,
-                    location:
-                        new Location(message.uri, message.line, message.column),
+                    location: new Location(
+                        message.uri!, message.line, message.column),
                     uriToSource: component.uriToSource),
                 message.line,
                 message.column,
@@ -256,7 +254,7 @@
   @override
   void visitLibrary(Library node) {
     if (analyzedUrisFilter != null) {
-      if (analyzedUrisFilter(node.importUri)) {
+      if (analyzedUrisFilter!(node.importUri)) {
         super.visitLibrary(node);
       }
     } else {
@@ -309,9 +307,9 @@
   }
 
   void registerError(TreeNode node, String message) {
-    Location location = node.location;
+    Location location = node.location!;
     Uri uri = location.file;
-    String uriString = relativizeUri(uri);
+    String uriString = relativizeUri(uri)!;
     Map<String, List<FormattedMessage>> actualMap = _actualMessages.putIfAbsent(
         uriString, () => <String, List<FormattedMessage>>{});
     if (uri.scheme == 'org-dartlang-sdk') {
diff --git a/pkg/front_end/test/static_types/cfe_dynamic_test.dart b/pkg/front_end/test/static_types/cfe_dynamic_test.dart
index ff5e01c..06d08c1 100644
--- a/pkg/front_end/test/static_types/cfe_dynamic_test.dart
+++ b/pkg/front_end/test/static_types/cfe_dynamic_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
-
 import 'analysis_helper.dart';
 
 /// Filter function used to only analysis cfe source code.
diff --git a/pkg/front_end/test/static_types/static_type_test.dart b/pkg/front_end/test/static_types/static_type_test.dart
index 0f168be..cf4d5c3 100644
--- a/pkg/front_end/test/static_types/static_type_test.dart
+++ b/pkg/front_end/test/static_types/static_type_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -46,7 +44,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new StaticTypeDataExtractor(compilerResult, actualMap)
         .computeForLibrary(library);
   }
@@ -57,7 +55,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new StaticTypeDataExtractor(compilerResult, actualMap));
   }
 
@@ -67,12 +65,12 @@
 
 class StaticTypeDataExtractor extends CfeDataExtractor<String> {
   final TypeEnvironment _environment;
-  StaticTypeContext _staticTypeContext;
+  StaticTypeContext? _staticTypeContext;
 
   StaticTypeDataExtractor(InternalCompilerResult compilerResult,
       Map<Id, ActualData<String>> actualMap)
       : _environment = new TypeEnvironment(
-            compilerResult.coreTypes, compilerResult.classHierarchy),
+            compilerResult.coreTypes!, compilerResult.classHierarchy!),
         super(compilerResult, actualMap);
 
   @override
@@ -102,23 +100,23 @@
   }
 
   @override
-  String computeMemberValue(Id id, Member node) {
+  String? computeMemberValue(Id id, Member node) {
     if (node is Procedure && node.function.futureValueType != null) {
-      return 'futureValueType=${typeToText(node.function.futureValueType)}';
+      return 'futureValueType=${typeToText(node.function.futureValueType!)}';
     }
     return null;
   }
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (isSkippedExpression(node)) {
       return null;
     }
     if (node is Expression) {
-      DartType type = node.getStaticType(_staticTypeContext);
+      DartType type = node.getStaticType(_staticTypeContext!);
       if (node is FunctionExpression && node.function.futureValueType != null) {
         return '${typeToText(type)},'
-            'futureValueType=${typeToText(node.function.futureValueType)}';
+            'futureValueType=${typeToText(node.function.futureValueType!)}';
       }
       return typeToText(type);
     } else if (node is Arguments) {
@@ -127,13 +125,13 @@
       }
     } else if (node is ForInStatement) {
       if (id.kind == IdKind.current) {
-        DartType type = _staticTypeContext.typeEnvironment.forInElementType(
-            node, node.iterable.getStaticType(_staticTypeContext));
+        DartType type = _staticTypeContext!.typeEnvironment.forInElementType(
+            node, node.iterable.getStaticType(_staticTypeContext!));
         return typeToText(type);
       }
     } else if (node is FunctionDeclaration) {
       if (node.function.futureValueType != null) {
-        return 'futureValueType=${typeToText(node.function.futureValueType)}';
+        return 'futureValueType=${typeToText(node.function.futureValueType!)}';
       }
     }
     return null;
@@ -151,7 +149,7 @@
 
   bool isNewReachabilityErrorArgument(object) {
     return object is StringLiteral &&
-        isNewReachabilityError(object.parent.parent);
+        isNewReachabilityError(object.parent!.parent);
   }
 
   bool isThrowReachabilityError(object) {
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index f3178d6..636cc41 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_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
-
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/testing/compiler_common.dart';
 import 'package:kernel/kernel.dart';
@@ -13,19 +11,19 @@
 void main() {
   test('summary has no source-info by default', () async {
     var summary = await summarize(['a.dart'], allSources);
-    var component = loadComponentFromBytes(summary);
+    var component = loadComponentFromBytes(summary!);
 
     // Note: the kernel representation always includes the Uri entries, but
     // doesn't include the actual source here.
     for (Source source in component.uriToSource.values) {
       expect(source.source.length, 0);
-      expect(source.lineStarts.length, 0);
+      expect(source.lineStarts!.length, 0);
     }
   });
 
   test('summary includes declarations, but no method bodies', () async {
     var summary = await summarize(['a.dart'], allSources);
-    var component = loadComponentFromBytes(summary);
+    var component = loadComponentFromBytes(summary!);
     var aLib = findLibrary(component, 'a.dart');
     expect(aLib.importUri.path, '/a/b/c/a.dart');
     var classA = aLib.classes.first;
@@ -51,7 +49,7 @@
     var summaryD = await summarize(['d.dart'], sourcesWithABC,
         additionalDills: ['a.dill', 'bc.dill']);
 
-    checkDSummary(summaryD);
+    checkDSummary(summaryD!);
   });
 
   test('dependencies can be combined in any order', () async {
@@ -71,13 +69,13 @@
     // dill files and because of how the kernel loader merges definitions.
     var summaryD = await summarize(['d.dart'], sourcesWithABC,
         additionalDills: ['bc.dill', 'a.dill']);
-    checkDSummary(summaryD);
+    checkDSummary(summaryD!);
   });
 
   test('dependencies not included in truncated summaries', () async {
     // Note: by default this test is loading the SDK from summaries.
     var summaryA = await summarize(['a.dart'], allSources, truncate: true);
-    var component = loadComponentFromBytes(summaryA);
+    var component = loadComponentFromBytes(summaryA!);
     expect(component.libraries.length, 1);
     expect(
         component.libraries.single.importUri.path.endsWith('a.dart'), isTrue);
@@ -86,7 +84,7 @@
     sourcesWithA['a.dill'] = summaryA;
     var summaryB = await summarize(['b.dart'], sourcesWithA,
         additionalDills: ['a.dill'], truncate: true);
-    component = loadComponentFromBytes(summaryB);
+    component = loadComponentFromBytes(summaryB!);
     expect(component.libraries.length, 1);
     expect(
         component.libraries.single.importUri.path.endsWith('b.dart'), isTrue);
@@ -126,7 +124,7 @@
   expect(bClass.superclass, same(aClass));
 
   var dClass = dLib.classes.firstWhere((c) => c.name == 'D');
-  expect(dClass.superclass.superclass, same(bClass));
+  expect(dClass.superclass!.superclass, same(bClass));
 
   var dInterface = dClass.implementedTypes.first.classNode;
   expect(dInterface, same(aClass));
diff --git a/pkg/front_end/test/test_generator_test.dart b/pkg/front_end/test/test_generator_test.dart
index 2f009ea..569620a 100644
--- a/pkg/front_end/test/test_generator_test.dart
+++ b/pkg/front_end/test/test_generator_test.dart
@@ -2,11 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'dart:io' show exitCode, File, stdout;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart';
 import 'package:front_end/src/fasta/kernel/utils.dart';
@@ -92,7 +91,9 @@
     StringBuffer sb = new StringBuffer();
     fs.entityForUri(testUri).writeAsStringSync(src);
     compiler.invalidate(testUri);
-    Component result = await compiler.computeDelta(entryPoints: [testUri]);
+    IncrementalCompilerResult compilerResult =
+        await compiler.computeDelta(entryPoints: [testUri]);
+    Component result = compilerResult.component;
     Iterator<Code> codeIterator = formattedWarningsCodes.iterator;
     for (String warning in formattedWarnings) {
       codeIterator.moveNext();
diff --git a/pkg/front_end/test/text_representation/empty_reference_test.dart b/pkg/front_end/test/text_representation/empty_reference_test.dart
index bd30c00..dd15aff 100644
--- a/pkg/front_end/test/text_representation/empty_reference_test.dart
+++ b/pkg/front_end/test/text_representation/empty_reference_test.dart
@@ -2,14 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart';
 import 'text_representation_test.dart';
 
 void testExpression(Expression node, String normal,
-    {String verbose, String limited}) {
+    {String? verbose, String? limited}) {
   Expect.stringEquals(normal, node.toText(normalStrategy),
       "Unexpected normal strategy text for ${node.runtimeType}");
   Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
@@ -18,7 +16,8 @@
       "Unexpected limited strategy text for ${node.runtimeType}");
 }
 
-void testType(DartType node, String normal, {String verbose, String limited}) {
+void testType(DartType node, String normal,
+    {String? verbose, String? limited}) {
   Expect.stringEquals(normal, node.toText(normalStrategy),
       "Unexpected normal strategy text for ${node.runtimeType}");
   Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
@@ -33,11 +32,6 @@
 }
 
 void testTypes() {
-  testType(new InterfaceType.byReference(null, Nullability.nonNullable, []),
-      '<missing-class-reference>');
-  testType(new TypedefType.byReference(null, Nullability.nonNullable, []),
-      '<missing-typedef-reference>');
-
   Reference unlinkedClassName = new Reference();
   testType(
       new InterfaceType.byReference(
@@ -83,9 +77,6 @@
 }
 
 void testMembers() {
-  testExpression(new StaticGet.byReference(null), '''
-<missing-member-reference>''');
-
   Reference unlinkedMemberName = new Reference();
   testExpression(
       new InstanceGet.byReference(
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index 3355ebf..4fd6fa1 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_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
-
 import 'package:expect/expect.dart';
 import 'package:front_end/src/fasta/kernel/collections.dart';
 import 'package:front_end/src/fasta/kernel/forest.dart';
@@ -12,7 +10,7 @@
 import 'text_representation_test.dart';
 
 void testStatement(Statement node, String normal,
-    {String verbose, String limited}) {
+    {String? verbose, String? limited}) {
   Expect.stringEquals(normal, node.toText(normalStrategy),
       "Unexpected normal strategy text for ${node.runtimeType}");
   Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
@@ -22,7 +20,7 @@
 }
 
 void testExpression(Expression node, String normal,
-    {String verbose, String limited}) {
+    {String? verbose, String? limited}) {
   Expect.stringEquals(normal, node.toText(normalStrategy),
       "Unexpected normal strategy text for ${node.runtimeType}");
   Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
@@ -592,10 +590,6 @@
   Library library = new Library(dummyUri, fileUri: dummyUri);
   LibraryDependency dependency =
       LibraryDependency.deferredImport(library, 'pre');
-
-  testExpression(new LoadLibraryTearOff(dependency, null), ''' 
-pre.loadLibrary''');
-
   Procedure procedure = new Procedure(new Name('get#loadLibrary'),
       ProcedureKind.Getter, new FunctionNode(new Block([])),
       fileUri: dummyUri);
diff --git a/pkg/front_end/test/text_representation/text_representation_test.dart b/pkg/front_end/test/text_representation/text_representation_test.dart
index 883ac09..b29f7ac 100644
--- a/pkg/front_end/test/text_representation/text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/text_representation_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
-
 import 'dart:io' show Directory, Platform;
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
@@ -103,7 +101,7 @@
       InternalCompilerResult compilerResult,
       Library library,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     new TextRepresentationDataExtractor(
             compilerResult, actualMap, getStrategy(config.marker))
         .computeForLibrary(library);
@@ -115,7 +113,7 @@
       InternalCompilerResult compilerResult,
       Member member,
       Map<Id, ActualData<String>> actualMap,
-      {bool verbose}) {
+      {bool? verbose}) {
     member.accept(new TextRepresentationDataExtractor(
         compilerResult, actualMap, getStrategy(config.marker)));
   }
@@ -155,22 +153,22 @@
   }
 
   @override
-  String computeMemberValue(Id id, Member node) {
+  String? computeMemberValue(Id id, Member node) {
     if (node.name.text == 'stmtVariableDeclarationMulti') {
       print(node);
     }
     if (node.name.text.startsWith(expressionMarker)) {
       if (node is Procedure) {
-        Statement body = node.function.body;
+        Statement? body = node.function.body;
         if (body is ReturnStatement) {
-          return body.expression.toText(strategy);
+          return body.expression!.toText(strategy);
         }
       } else if (node is Field && node.initializer != null) {
-        return node.initializer.toText(strategy);
+        return node.initializer!.toText(strategy);
       }
     } else if (node.name.text.startsWith(statementMarker)) {
       if (node is Procedure) {
-        Statement body = node.function.body;
+        Statement? body = node.function.body;
         if (body is Block && body.statements.length == 1) {
           // Prefix with newline to make multiline text representations more
           // readable.
@@ -182,13 +180,13 @@
   }
 
   @override
-  String computeNodeValue(Id id, TreeNode node) {
+  String? computeNodeValue(Id id, TreeNode node) {
     if (node is ConstantExpression) {
       return node.constant.toText(strategy);
     } else if (node is VariableDeclaration) {
       DartType type = node.type;
       if (type is FunctionType && type.typedefType != null) {
-        return type.typedefType.toText(strategy);
+        return type.typedefType!.toText(strategy);
       } else {
         return type.toText(strategy);
       }
diff --git a/pkg/front_end/test/textual_outline_test.dart b/pkg/front_end/test/textual_outline_test.dart
index 4a2af05..fd50c3f 100644
--- a/pkg/front_end/test/textual_outline_test.dart
+++ b/pkg/front_end/test/textual_outline_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.md file.
 
-// @dart = 2.9
-
 import "dart:convert";
 
 import 'package:_fe_analyzer_shared/src/scanner/abstract_scanner.dart'
@@ -17,7 +15,7 @@
 
 void main() {
   // Doesn't sort if not asked to perform modelling.
-  String result = textualOutline(utf8.encode("""
+  String? result = textualOutline(utf8.encode("""
 b() { print("hello"); }
 a() { print("hello"); }
 """), scannerConfiguration, throwOnUnexpected: true, performModelling: false);
diff --git a/pkg/front_end/test/token_test.dart b/pkg/front_end/test/token_test.dart
index 9cf8377..301e6ec 100644
--- a/pkg/front_end/test/token_test.dart
+++ b/pkg/front_end/test/token_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
-
 import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
     show ScannerConfiguration, scanString;
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
@@ -38,11 +36,11 @@
 
     Token nextComment() {
       while (!token.isEof) {
-        Token comment = token.precedingComments;
-        token = token.next;
+        Token? comment = token.precedingComments;
+        token = token.next!;
         if (comment != null) return comment;
       }
-      return null;
+      throw new StateError("No comment found.");
     }
 
     Token comment = nextComment();
@@ -69,10 +67,10 @@
   void test_isSynthetic() {
     var token = scanString('/* 1 */ foo', includeComments: true).tokens;
     expect(token.isSynthetic, false);
-    expect(token.precedingComments.isSynthetic, false);
-    expect(token.previous.isSynthetic, true);
-    expect(token.next.isEof, true);
-    expect(token.next.isSynthetic, true);
+    expect(token.precedingComments!.isSynthetic, false);
+    expect(token.previous!.isSynthetic, true);
+    expect(token.next!.isEof, true);
+    expect(token.next!.isSynthetic, true);
   }
 
   void test_matchesAny() {
@@ -197,11 +195,11 @@
     expect(token.lexeme, 'true');
     expect(token.value(), Keyword.TRUE);
     // General tokens
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '&');
     expect(token.value(), '&');
     // String tokens
-    token = token.next;
+    token = token.next!;
     expect(token.lexeme, '"home"');
     expect(token.value(), '"home"');
   }
diff --git a/pkg/front_end/test/tool/reload.dart b/pkg/front_end/test/tool/reload.dart
index 40a94a5..887ed3b 100644
--- a/pkg/front_end/test/tool/reload.dart
+++ b/pkg/front_end/test/tool/reload.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
-
 /// A helper library to connect to an existing VM and trigger a hot-reload via
 /// its service protocol.
 ///
@@ -32,12 +30,12 @@
   /// An peer point used to send service protocol messages. The service
   /// protocol uses JSON rpc on top of web-sockets.
   json_rpc.Peer get rpc => _rpc ??= _createPeer();
-  json_rpc.Peer _rpc;
+  json_rpc.Peer? _rpc;
 
   /// The main isolate ID of the running VM. Needed to indicate to the VM which
   /// isolate to reload.
   FutureOr<String> get mainId async => _mainId ??= await _computeMainId();
-  String _mainId;
+  String? _mainId;
 
   RemoteVm([this.port = 8181]);
 
@@ -91,8 +89,8 @@
   Future disconnect() async {
     if (_rpc == null) return null;
     this._mainId = null;
-    if (!_rpc.isClosed) {
-      var future = _rpc.close();
+    if (!_rpc!.isClosed) {
+      var future = _rpc!.close();
       _rpc = null;
       return future;
     }
diff --git a/pkg/front_end/test/type_labeler_test.dart b/pkg/front_end/test/type_labeler_test.dart
index ec09139..af83e29 100644
--- a/pkg/front_end/test/type_labeler_test.dart
+++ b/pkg/front_end/test/type_labeler_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
-
 import 'package:kernel/ast.dart';
 
 import 'package:front_end/src/fasta/kernel/type_labeler.dart';
@@ -24,7 +22,7 @@
       }
     });
     expectations.forEach((Node node, String expected) {
-      Expect.stringEquals(expected, conversions[node].join());
+      Expect.stringEquals(expected, conversions[node]!.join());
     });
     int newlines = "\n".allMatches(labeler.originMessages).length;
     Expect.equals(bulletCount, newlines);
diff --git a/pkg/front_end/test/unit_test_suites.dart b/pkg/front_end/test/unit_test_suites.dart
index 4ccc389..c9acb09 100644
--- a/pkg/front_end/test/unit_test_suites.dart
+++ b/pkg/front_end/test/unit_test_suites.dart
@@ -1,20 +1,668 @@
-// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-// @dart = 2.9
+import 'dart:async' show Timer;
+import 'dart:convert' show jsonEncode;
+import 'dart:io' show File, Platform, exitCode;
+import 'dart:isolate' show Isolate, ReceivePort, SendPort;
 
-// This is a work-around for the automagically selecting weak/strong mode.
-// By marking this file (the entry) as non-nnbd, it becomes weak mode which
-// is required because many of the imports are not (yet) nnbd.
+import 'package:args/args.dart' show ArgParser;
+import 'package:testing/src/chain.dart' show CreateContext, Result, Step;
+import 'package:testing/src/expectation.dart' show Expectation;
+import 'package:testing/src/log.dart' show Logger;
+import 'package:testing/src/run.dart' show runMe;
+import 'package:testing/src/suite.dart' as testing show Suite;
+import 'package:testing/src/test_description.dart' show TestDescription;
 
-import 'unit_test_suites_impl.dart' as impl;
+import 'dartdoctest_suite.dart' as dartdoctest show createContext;
+import 'fasta/expression_suite.dart' as expression show createContext;
+import 'fasta/incremental_dartino_suite.dart' as incremental_dartino
+    show createContext;
+import 'fasta/messages_suite.dart' as messages show createContext;
+import 'fasta/modular_suite.dart' as modular show createContext;
+import 'fasta/outline_suite.dart' as outline show createContext;
+import 'fasta/strong_suite.dart' as strong show createContext;
+import 'fasta/text_serialization_suite.dart' as text_serialization
+    show createContext;
+import 'fasta/textual_outline_suite.dart' as textual_outline show createContext;
+import 'fasta/weak_suite.dart' as weak show createContext;
+import 'incremental_bulk_compiler_smoke_suite.dart' as incremental_bulk_compiler
+    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 'parser_all_suite.dart' as parserAll 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;
 
-/// Work around https://github.com/dart-lang/sdk/issues/45192.
-///
-/// TODO(paulberry): once #45192 is fixed, we can switch the `import` directive
-/// above to an `export` and remove this method, and this file will still be
-/// considered by the analysis server to be runnable.
-void main(List<String> args) {
-  impl.main(args);
+const suiteNamePrefix = "pkg/front_end/test";
+
+int getDefaultThreads() {
+  int numberOfWorkers = 1;
+  if (Platform.numberOfProcessors > 2) {
+    numberOfWorkers = Platform.numberOfProcessors - 1;
+  }
+  return numberOfWorkers;
+}
+
+class Options {
+  final String? configurationName;
+  final bool verbose;
+  final bool printFailureLog;
+  final Uri outputDirectory;
+  final String? testFilter;
+  final List<String> environmentOptions;
+  final int shardCount;
+  final int shard;
+  final bool skipTestsThatRequireGit;
+  final bool onlyTestsThatRequireGit;
+  final int numberOfWorkers;
+
+  Options(
+    this.configurationName,
+    this.verbose,
+    this.printFailureLog,
+    this.outputDirectory,
+    this.testFilter,
+    this.environmentOptions, {
+    required this.shardCount,
+    required this.shard,
+    required this.skipTestsThatRequireGit,
+    required this.onlyTestsThatRequireGit,
+    required this.numberOfWorkers,
+  });
+
+  static Options parse(List<String> args) {
+    var parser = new ArgParser()
+      ..addOption("named-configuration",
+          abbr: "n",
+          help: "configuration name to use for emitting json result files")
+      ..addOption("output-directory",
+          help: "directory to which results.json and logs.json are written")
+      ..addFlag("verbose",
+          abbr: "v", help: "print additional information", defaultsTo: false)
+      ..addFlag("print",
+          abbr: "p", help: "print failure logs", defaultsTo: false)
+      ..addMultiOption('environment',
+          abbr: 'D', help: "environment options for the test suite")
+      ..addOption("tasks",
+          abbr: "j",
+          help: "The number of parallel tasks to run.",
+          defaultsTo: "${getDefaultThreads()}")
+      ..addOption("shards", help: "Number of shards", defaultsTo: "1")
+      ..addOption("shard", help: "Which shard to run", defaultsTo: "1")
+      ..addFlag("skipTestsThatRequireGit",
+          help: "Whether to skip tests that require git to run",
+          defaultsTo: false)
+      ..addFlag("onlyTestsThatRequireGit",
+          help: "Whether to only run tests that require git",
+          defaultsTo: false);
+    var parsedOptions = parser.parse(args);
+    String outputPath = parsedOptions["output-directory"] ?? ".";
+    Uri outputDirectory = Uri.base.resolveUri(Uri.directory(outputPath));
+
+    bool verbose = parsedOptions["verbose"];
+
+    String? filter;
+    if (parsedOptions.rest.length == 1) {
+      filter = parsedOptions.rest.single;
+      if (filter.startsWith("$suiteNamePrefix/")) {
+        filter = filter.substring(suiteNamePrefix.length + 1);
+      }
+    }
+    String tasksString = parsedOptions["tasks"];
+    int? tasks = int.tryParse(tasksString);
+    if (tasks == null || tasks < 1) {
+      throw "--tasks (-j) has to be an integer >= 1";
+    }
+
+    String shardsString = parsedOptions["shards"];
+    int? shardCount = int.tryParse(shardsString);
+    if (shardCount == null || shardCount < 1) {
+      throw "--shards has to be an integer >= 1";
+    }
+    String shardString = parsedOptions["shard"];
+    int? shard = int.tryParse(shardString);
+    if (shard == null || shard < 1 || shard > shardCount) {
+      throw "--shard has to be an integer >= 1 (and <= --shards)";
+    }
+    bool skipTestsThatRequireGit = parsedOptions["skipTestsThatRequireGit"];
+    bool onlyTestsThatRequireGit = parsedOptions["onlyTestsThatRequireGit"];
+    if (skipTestsThatRequireGit && onlyTestsThatRequireGit) {
+      throw "Only one of --skipTestsThatRequireGit and "
+          "--onlyTestsThatRequireGit can be provided.";
+    }
+
+    if (verbose) {
+      print("NOTE: Created with options\n  "
+          "${parsedOptions["named-configuration"]},\n  "
+          "${verbose},\n  "
+          "${parsedOptions["print"]},\n  "
+          "${outputDirectory},\n  "
+          "${filter},\n  "
+          "${parsedOptions['environment']},\n  "
+          "shardCount: ${shardCount},\n  "
+          "shard: ${shard - 1 /* make it 0-indexed */},\n  "
+          "onlyTestsThatRequireGit: ${onlyTestsThatRequireGit},\n  "
+          "skipTestsThatRequireGit: ${skipTestsThatRequireGit},\n  "
+          "numberOfWorkers: ${tasks}");
+    }
+
+    return Options(
+      parsedOptions["named-configuration"],
+      verbose,
+      parsedOptions["print"],
+      outputDirectory,
+      filter,
+      parsedOptions['environment'],
+      shardCount: shardCount,
+      shard: shard - 1 /* make it 0-indexed */,
+      onlyTestsThatRequireGit: onlyTestsThatRequireGit,
+      skipTestsThatRequireGit: skipTestsThatRequireGit,
+      numberOfWorkers: tasks,
+    );
+  }
+}
+
+class ResultLogger implements Logger {
+  final String prefix;
+  final bool verbose;
+  final bool printFailureLog;
+  final SendPort resultsPort;
+  final SendPort logsPort;
+  final Map<String, Stopwatch> stopwatches = {};
+  final String? configurationName;
+  final Set<String> seenTests = {};
+  bool gotFrameworkError = false;
+
+  ResultLogger(this.prefix, this.resultsPort, this.logsPort, this.verbose,
+      this.printFailureLog, this.configurationName);
+
+  String getTestName(TestDescription description) {
+    return "$prefix/${description.shortName}";
+  }
+
+  @override
+  void logMessage(Object message) {}
+
+  @override
+  void logNumberedLines(String text) {}
+
+  @override
+  void logProgress(String message) {}
+
+  @override
+  void logStepComplete(int completed, int failed, int total,
+      testing.Suite suite, TestDescription description, Step step) {}
+
+  @override
+  void logStepStart(int completed, int failed, int total, testing.Suite suite,
+      TestDescription description, Step step) {}
+
+  @override
+  void logSuiteStarted(testing.Suite suite) {}
+
+  @override
+  void logSuiteComplete(testing.Suite suite) {}
+
+  void handleTestResult(
+      testing.Suite suite,
+      TestDescription testDescription,
+      Result result,
+      String fullSuiteName,
+      bool matchedExpectations,
+      Set<Expectation> expectedOutcomes) {
+    String testName = getTestName(testDescription);
+    String suiteName = "pkg";
+    String shortTestName = testName.substring(suiteName.length + 1);
+    resultsPort.send(jsonEncode({
+      "name": testName,
+      "configuration": configurationName,
+      "suite": suiteName,
+      "test_name": shortTestName,
+      "time_ms": stopwatches[testName]!.elapsedMilliseconds,
+      "expected": "Pass",
+      "result": matchedExpectations ? "Pass" : "Fail",
+      "matches": matchedExpectations,
+    }));
+    if (!matchedExpectations) {
+      StringBuffer sb = new StringBuffer();
+      if (printFailureLog) {
+        String outcome = "${result.outcome}";
+        sb.write("FAILED: $testName: $outcome");
+      }
+      sb.write(result.log);
+      if (result.error != null) {
+        sb.write("\n\n${result.error}");
+      }
+      if (result.trace != null) {
+        sb.write("\n\n${result.trace}");
+      }
+      sb.write("\n\nTo re-run this test, run:");
+      sb.write("\n\n   dart pkg/front_end/test/unit_test_suites.dart -p "
+          "$testName");
+      if (result.autoFixCommand != null) {
+        sb.write("\n\nTo automatically update the test expectations, run:");
+        sb.write("\n\n   dart pkg/front_end/test/unit_test_suites.dart -p "
+            "$testName -D${result.autoFixCommand}");
+        if (result.canBeFixWithUpdateExpectations) {
+          sb.write('\n\nTo update test expectations for all tests at once, '
+              'run:');
+          sb.write('\n\n  dart pkg/front_end/tool/update_expectations.dart');
+          sb.write('\n\nNote that this takes a long time and should only be '
+              'used when many tests need updating.\n');
+        }
+      }
+      if (result.outcome == Expectation.Pass) {
+        String expectedString =
+            expectedOutcomes.map((e) => e.toString()).join(", ");
+        sb.write("\n\nThe test passed, but wasn't expected to. "
+            "You should update the status file for this test."
+            "\nThere's a status entry looking something like"
+            "\n\n  ${testDescription.shortName}: ${expectedString}"
+            "\n\nwhich should be removed."
+            "\n\nThe status file is ${suite.statusFile}.");
+      } else if (result.autoFixCommand == null) {
+        String expectedString =
+            expectedOutcomes.map((e) => e.toString()).join(", ");
+        sb.write("\n\nThe test has outcome ${result.outcome}, "
+            "but was expected to have outcome(s) ${expectedOutcomes}. "
+            "You might have to update the status file to the new outcome"
+            "\nThere's a status entry looking something like"
+            "\n\n  ${testDescription.shortName}: ${expectedString}"
+            "\n\nwhich should be updated."
+            "\n\nThe status file is ${suite.statusFile}.");
+      }
+      String failureLog = sb.toString();
+      String outcome = "${result.outcome}";
+      logsPort.send(jsonEncode({
+        "name": testName,
+        "configuration": configurationName,
+        "result": outcome,
+        "log": failureLog,
+      }));
+      if (printFailureLog) {
+        print(failureLog);
+      }
+    }
+    if (verbose) {
+      String result = matchedExpectations ? "PASS" : "FAIL";
+      print("${testName}: ${result}");
+    }
+  }
+
+  @override
+  void logTestStart(int completed, int failed, int total, testing.Suite suite,
+      TestDescription description) {
+    String name = getTestName(description);
+    stopwatches[name] = Stopwatch()..start();
+  }
+
+  @override
+  void logTestComplete(int completed, int failed, int total,
+      testing.Suite suite, TestDescription description) {}
+
+  @override
+  void logUncaughtError(error, StackTrace stackTrace) {}
+
+  @override
+  void logExpectedResult(testing.Suite suite, TestDescription description,
+      Result result, Set<Expectation> expectedOutcomes) {
+    handleTestResult(
+        suite, description, result, prefix, true, expectedOutcomes);
+  }
+
+  @override
+  void logUnexpectedResult(testing.Suite suite, TestDescription description,
+      Result result, Set<Expectation> expectedOutcomes) {
+    // The test framework (pkg/testing) calls the logger with an unexpected
+    // results a second time to create a summary. We ignore the second call
+    // here.
+    String testName = getTestName(description);
+    if (seenTests.contains(testName)) return;
+    seenTests.add(testName);
+    handleTestResult(
+        suite, description, result, prefix, false, expectedOutcomes);
+  }
+
+  @override
+  void noticeFrameworkCatchError(error, StackTrace stackTrace) {
+    gotFrameworkError = true;
+  }
+}
+
+class Suite {
+  final CreateContext createContext;
+  final String testingRootPath;
+  final String? path;
+  final int shardCount;
+  final String prefix;
+  final bool requiresGit;
+
+  const Suite(
+    this.prefix,
+    this.createContext,
+    this.testingRootPath, {
+    required this.shardCount,
+    this.path,
+    this.requiresGit: false,
+  });
+}
+
+const List<Suite> suites = [
+  const Suite(
+    "dartdoctest",
+    dartdoctest.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "fasta/expression",
+    expression.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "fasta/outline",
+    outline.createContext,
+    "../../testing.json",
+    shardCount: 2,
+  ),
+  const Suite(
+    "fasta/incremental_dartino",
+    incremental_dartino.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "fasta/messages",
+    messages.createContext,
+    "../../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "fasta/text_serialization",
+    text_serialization.createContext,
+    "../../testing.json",
+    path: "fasta/text_serialization_suite.dart",
+    shardCount: 10,
+  ),
+  const Suite(
+    "fasta/strong",
+    strong.createContext,
+    "../../testing.json",
+    path: "fasta/strong_suite.dart",
+    shardCount: 2,
+  ),
+  const Suite(
+    "incremental_bulk_compiler_smoke",
+    incremental_bulk_compiler.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "incremental",
+    incremental.createContext,
+    "../testing.json",
+    shardCount: 2,
+  ),
+  const Suite(
+    "lint",
+    lint.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "parser",
+    parser.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "parser_equivalence",
+    parserEquivalence.createContext,
+    "../testing.json",
+    shardCount: 1,
+  ),
+  const Suite(
+    "parser_all",
+    parserAll.createContext,
+    "../testing.json",
+    shardCount: 4,
+    requiresGit:
+        true /* technically not true, but tests *many* more files
+         than in test_matrix.json file set */
+    ,
+  ),
+  const Suite(
+    "spelling_test_not_src",
+    spelling_not_src.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "spelling_test_src",
+    spelling_src.createContext,
+    "../testing.json",
+    shardCount: 1,
+    requiresGit: true,
+  ),
+  const Suite(
+    "fasta/modular",
+    modular.createContext,
+    "../../testing.json",
+    path: "fasta/modular_suite.dart",
+    shardCount: 4,
+  ),
+  const Suite(
+    "fasta/weak",
+    weak.createContext,
+    "../../testing.json",
+    path: "fasta/weak_suite.dart",
+    shardCount: 10,
+  ),
+  const Suite(
+    "fasta/textual_outline",
+    textual_outline.createContext,
+    "../../testing.json",
+    shardCount: 1,
+  ),
+];
+
+const Duration timeoutDuration = Duration(minutes: 30);
+
+class SuiteConfiguration {
+  final Suite suite;
+  final SendPort resultsPort;
+  final SendPort logsPort;
+  final bool verbose;
+  final bool printFailureLog;
+  final String? configurationName;
+  final String? testFilter;
+  final List<String> environmentOptions;
+  final int shard;
+
+  const SuiteConfiguration(
+    this.suite,
+    this.resultsPort,
+    this.logsPort,
+    this.verbose,
+    this.printFailureLog,
+    this.configurationName,
+    this.testFilter,
+    this.environmentOptions,
+    this.shard,
+  );
+}
+
+Future<void> runSuite(SuiteConfiguration configuration) async {
+  Suite suite = configuration.suite;
+  String name = suite.prefix;
+  String fullSuiteName = "$suiteNamePrefix/$name";
+  Uri suiteUri = Platform.script.resolve(suite.path ?? "${name}_suite.dart");
+  if (!new File.fromUri(suiteUri).existsSync()) {
+    throw "File doesn't exist: $suiteUri";
+  }
+  ResultLogger logger = ResultLogger(
+      fullSuiteName,
+      configuration.resultsPort,
+      configuration.logsPort,
+      configuration.verbose,
+      configuration.printFailureLog,
+      configuration.configurationName);
+  await runMe(
+    <String>[
+      if (configuration.testFilter != null) configuration.testFilter!,
+      for (String option in configuration.environmentOptions) '-D${option}',
+    ],
+    suite.createContext,
+    me: suiteUri,
+    configurationPath: suite.testingRootPath,
+    logger: logger,
+    shards: suite.shardCount,
+    shard: configuration.shard,
+  );
+  if (logger.gotFrameworkError) {
+    throw "Got framework error!";
+  }
+}
+
+Future<void> writeLinesToFile(Uri uri, List<String> lines) async {
+  await File.fromUri(uri).writeAsString(lines.map((line) => "$line\n").join());
+}
+
+Future<void> main([List<String> arguments = const <String>[]]) async {
+  Stopwatch totalRuntime = new Stopwatch()..start();
+
+  List<String> results = [];
+  List<String> logs = [];
+  Options options = Options.parse(arguments);
+  ReceivePort resultsPort = new ReceivePort()
+    ..listen((resultEntry) => results.add(resultEntry));
+  ReceivePort logsPort = new ReceivePort()
+    ..listen((logEntry) => logs.add(logEntry));
+  List<Future<bool>> futures = [];
+
+  if (options.verbose) {
+    print("NOTE: Willing to run with ${options.numberOfWorkers} 'workers'");
+    print("");
+  }
+
+  int numberOfFreeWorkers = options.numberOfWorkers;
+  // Run test suites and record the results and possible failure logs.
+  int chunkNum = 0;
+  for (Suite suite in suites) {
+    if (options.onlyTestsThatRequireGit && !suite.requiresGit) continue;
+    if (options.skipTestsThatRequireGit && suite.requiresGit) continue;
+    String prefix = suite.prefix;
+    String? filter = options.testFilter;
+    if (filter != null) {
+      // Skip suites that are not hit by the test filter, is there is one.
+      if (!filter.startsWith(prefix)) {
+        continue;
+      }
+      // Remove the 'fasta/' from filters, if there, because it is not used
+      // in the name defined in testing.json.
+      if (filter.startsWith("fasta/")) {
+        filter = filter.substring("fasta/".length);
+      }
+    }
+    for (int shard = 0; shard < suite.shardCount; shard++) {
+      if (chunkNum++ % options.shardCount != options.shard) continue;
+
+      while (numberOfFreeWorkers <= 0) {
+        // This might not be great design, but it'll work fine.
+        await Future.delayed(const Duration(milliseconds: 50));
+      }
+      numberOfFreeWorkers--;
+      // Start the test suite in a new isolate.
+      ReceivePort exitPort = new ReceivePort();
+      ReceivePort errorPort = new ReceivePort();
+      SuiteConfiguration configuration = new SuiteConfiguration(
+          suite,
+          resultsPort.sendPort,
+          logsPort.sendPort,
+          options.verbose,
+          options.printFailureLog,
+          options.configurationName,
+          filter,
+          options.environmentOptions,
+          shard);
+      Future<bool> future = new Future<bool>(() async {
+        try {
+          Stopwatch stopwatch = new Stopwatch()..start();
+          String naming = "$prefix";
+          if (suite.shardCount > 1) {
+            naming += " (${shard + 1} of ${suite.shardCount})";
+          }
+          print("Running suite $naming");
+          Isolate isolate = await Isolate.spawn<SuiteConfiguration>(
+              runSuite, configuration,
+              onExit: exitPort.sendPort, onError: errorPort.sendPort);
+          bool timedOutOrCrash = false;
+          Timer timer = new Timer(timeoutDuration, () {
+            timedOutOrCrash = true;
+            print("Suite $naming timed out after "
+                "${timeoutDuration.inMilliseconds}ms");
+            isolate.kill(priority: Isolate.immediate);
+          });
+          await exitPort.first;
+          errorPort.close();
+          List<dynamic> allErrors = await errorPort.toList();
+          bool gotError = allErrors.isNotEmpty;
+          if (gotError) {
+            print("Suite $naming encountered ${allErrors.length} error(s).");
+            print("Errors:");
+            for (int i = 0; i < allErrors.length; i++) {
+              print("-----------");
+              print("Error #$i:");
+              print(allErrors[i]);
+            }
+            print("-----------");
+            timedOutOrCrash = true;
+          }
+          timer.cancel();
+          int seconds = stopwatch.elapsedMilliseconds ~/ 1000;
+          if (!timedOutOrCrash) {
+            print("Suite $naming finished (took ${seconds} seconds)");
+          } else {
+            print("Suite $naming finished badly (see above) "
+                "(took ${seconds} seconds)");
+          }
+          return timedOutOrCrash;
+        } finally {
+          numberOfFreeWorkers++;
+        }
+      });
+      futures.add(future);
+    }
+  }
+  // Wait for isolates to terminate and clean up.
+  Iterable<bool> timeoutsOrCrashes = await Future.wait(futures);
+  resultsPort.close();
+  logsPort.close();
+  // Write results.json and logs.json.
+  Uri resultJsonUri = options.outputDirectory.resolve("results.json");
+  Uri logsJsonUri = options.outputDirectory.resolve("logs.json");
+  await writeLinesToFile(resultJsonUri, results);
+  await writeLinesToFile(logsJsonUri, logs);
+  print("Log files written to ${resultJsonUri.toFilePath()} and"
+      " ${logsJsonUri.toFilePath()}");
+  print("Entire run took ${totalRuntime.elapsed}.");
+  // Return with exit code 1 if at least one suite timed out.
+  bool timedOutOrCrashed = timeoutsOrCrashes.any((timeout) => timeout);
+  if (timedOutOrCrashed) {
+    throw "Crashed or timed out. Check stdout for more details.";
+  } else {
+    // The testing framework (package:testing) sets the exitCode to `1` if any
+    // test failed, so we reset it here to indicate that the test runner was
+    // successful.
+    exitCode = 0;
+  }
 }
diff --git a/pkg/front_end/test/unit_test_suites_impl.dart b/pkg/front_end/test/unit_test_suites_impl.dart
deleted file mode 100644
index 997a51f..0000000
--- a/pkg/front_end/test/unit_test_suites_impl.dart
+++ /dev/null
@@ -1,662 +0,0 @@
-// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE.md file.
-
-// ignore_for_file: import_of_legacy_library_into_null_safe
-
-import 'dart:async' show Timer;
-import 'dart:convert' show jsonEncode;
-import 'dart:io' show File, Platform, exitCode;
-import 'dart:isolate' show Isolate, ReceivePort, SendPort;
-
-import 'package:args/args.dart' show ArgParser;
-import 'package:testing/src/chain.dart' show CreateContext, Result, Step;
-import 'package:testing/src/expectation.dart' show Expectation;
-import 'package:testing/src/log.dart' show Logger;
-import 'package:testing/src/run.dart' show runMe;
-import 'package:testing/src/suite.dart' as testing show Suite;
-import 'package:testing/src/test_description.dart' show TestDescription;
-
-import 'dartdoctest_suite.dart' as dartdoctest show createContext;
-import 'fasta/expression_suite.dart' as expression show createContext;
-import 'fasta/incremental_dartino_suite.dart' as incremental_dartino
-    show createContext;
-import 'fasta/messages_suite.dart' as messages show createContext;
-import 'fasta/outline_suite.dart' as outline show createContext;
-import 'fasta/strong_suite.dart' as strong show createContext;
-import 'fasta/text_serialization_suite.dart' as text_serialization
-    show createContext;
-import 'fasta/textual_outline_suite.dart' as textual_outline show createContext;
-import 'fasta/weak_suite.dart' as weak show createContext;
-import 'incremental_bulk_compiler_smoke_suite.dart' as incremental_bulk_compiler
-    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 'parser_all_suite.dart' as parserAll 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;
-
-const suiteNamePrefix = "pkg/front_end/test";
-
-int getDefaultThreads() {
-  int numberOfWorkers = 1;
-  if (Platform.numberOfProcessors > 2) {
-    numberOfWorkers = Platform.numberOfProcessors - 1;
-  }
-  return numberOfWorkers;
-}
-
-class Options {
-  final String configurationName;
-  final bool verbose;
-  final bool printFailureLog;
-  final Uri outputDirectory;
-  final String? testFilter;
-  final List<String> environmentOptions;
-  final int shardCount;
-  final int shard;
-  final bool skipTestsThatRequireGit;
-  final bool onlyTestsThatRequireGit;
-  final int numberOfWorkers;
-
-  Options(
-    this.configurationName,
-    this.verbose,
-    this.printFailureLog,
-    this.outputDirectory,
-    this.testFilter,
-    this.environmentOptions, {
-    required this.shardCount,
-    required this.shard,
-    required this.skipTestsThatRequireGit,
-    required this.onlyTestsThatRequireGit,
-    required this.numberOfWorkers,
-  });
-
-  static Options parse(List<String> args) {
-    var parser = new ArgParser()
-      ..addOption("named-configuration",
-          abbr: "n",
-          help: "configuration name to use for emitting json result files")
-      ..addOption("output-directory",
-          help: "directory to which results.json and logs.json are written")
-      ..addFlag("verbose",
-          abbr: "v", help: "print additional information", defaultsTo: false)
-      ..addFlag("print",
-          abbr: "p", help: "print failure logs", defaultsTo: false)
-      ..addMultiOption('environment',
-          abbr: 'D', help: "environment options for the test suite")
-      ..addOption("tasks",
-          abbr: "j",
-          help: "The number of parallel tasks to run.",
-          defaultsTo: "${getDefaultThreads()}")
-      ..addOption("shards", help: "Number of shards", defaultsTo: "1")
-      ..addOption("shard", help: "Which shard to run", defaultsTo: "1")
-      ..addFlag("skipTestsThatRequireGit",
-          help: "Whether to skip tests that require git to run",
-          defaultsTo: false)
-      ..addFlag("onlyTestsThatRequireGit",
-          help: "Whether to only run tests that require git",
-          defaultsTo: false);
-    var parsedOptions = parser.parse(args);
-    String outputPath = parsedOptions["output-directory"] ?? ".";
-    Uri outputDirectory = Uri.base.resolveUri(Uri.directory(outputPath));
-
-    bool verbose = parsedOptions["verbose"];
-
-    String? filter;
-    if (parsedOptions.rest.length == 1) {
-      filter = parsedOptions.rest.single;
-      if (filter.startsWith("$suiteNamePrefix/")) {
-        filter = filter.substring(suiteNamePrefix.length + 1);
-      }
-    }
-    String tasksString = parsedOptions["tasks"];
-    int? tasks = int.tryParse(tasksString);
-    if (tasks == null || tasks < 1) {
-      throw "--tasks (-j) has to be an integer >= 1";
-    }
-
-    String shardsString = parsedOptions["shards"];
-    int? shardCount = int.tryParse(shardsString);
-    if (shardCount == null || shardCount < 1) {
-      throw "--shards has to be an integer >= 1";
-    }
-    String shardString = parsedOptions["shard"];
-    int? shard = int.tryParse(shardString);
-    if (shard == null || shard < 1 || shard > shardCount) {
-      throw "--shard has to be an integer >= 1 (and <= --shards)";
-    }
-    bool skipTestsThatRequireGit = parsedOptions["skipTestsThatRequireGit"];
-    bool onlyTestsThatRequireGit = parsedOptions["onlyTestsThatRequireGit"];
-    if (skipTestsThatRequireGit && onlyTestsThatRequireGit) {
-      throw "Only one of --skipTestsThatRequireGit and "
-          "--onlyTestsThatRequireGit can be provided.";
-    }
-
-    if (verbose) {
-      print("NOTE: Created with options\n  "
-          "${parsedOptions["named-configuration"]},\n  "
-          "${verbose},\n  "
-          "${parsedOptions["print"]},\n  "
-          "${outputDirectory},\n  "
-          "${filter},\n  "
-          "${parsedOptions['environment']},\n  "
-          "shardCount: ${shardCount},\n  "
-          "shard: ${shard - 1 /* make it 0-indexed */},\n  "
-          "onlyTestsThatRequireGit: ${onlyTestsThatRequireGit},\n  "
-          "skipTestsThatRequireGit: ${skipTestsThatRequireGit},\n  "
-          "numberOfWorkers: ${tasks}");
-    }
-
-    return Options(
-      parsedOptions["named-configuration"],
-      verbose,
-      parsedOptions["print"],
-      outputDirectory,
-      filter,
-      parsedOptions['environment'],
-      shardCount: shardCount,
-      shard: shard - 1 /* make it 0-indexed */,
-      onlyTestsThatRequireGit: onlyTestsThatRequireGit,
-      skipTestsThatRequireGit: skipTestsThatRequireGit,
-      numberOfWorkers: tasks,
-    );
-  }
-}
-
-class ResultLogger implements Logger {
-  final String prefix;
-  final bool verbose;
-  final bool printFailureLog;
-  final SendPort resultsPort;
-  final SendPort logsPort;
-  final Map<String, Stopwatch> stopwatches = {};
-  final String configurationName;
-  final Set<String> seenTests = {};
-  bool gotFrameworkError = false;
-
-  ResultLogger(this.prefix, this.resultsPort, this.logsPort, this.verbose,
-      this.printFailureLog, this.configurationName);
-
-  String getTestName(TestDescription description) {
-    return "$prefix/${description.shortName}";
-  }
-
-  @override
-  void logMessage(Object message) {}
-
-  @override
-  void logNumberedLines(String text) {}
-
-  @override
-  void logProgress(String message) {}
-
-  @override
-  void logStepComplete(int completed, int failed, int total,
-      testing.Suite suite, TestDescription description, Step step) {}
-
-  @override
-  void logStepStart(int completed, int failed, int total, testing.Suite suite,
-      TestDescription description, Step step) {}
-
-  @override
-  void logSuiteStarted(testing.Suite suite) {}
-
-  @override
-  void logSuiteComplete(testing.Suite suite) {}
-
-  void handleTestResult(
-      testing.Suite suite,
-      TestDescription testDescription,
-      Result result,
-      String fullSuiteName,
-      bool matchedExpectations,
-      Set<Expectation> expectedOutcomes) {
-    String testName = getTestName(testDescription);
-    String suiteName = "pkg";
-    String shortTestName = testName.substring(suiteName.length + 1);
-    resultsPort.send(jsonEncode({
-      "name": testName,
-      "configuration": configurationName,
-      "suite": suiteName,
-      "test_name": shortTestName,
-      "time_ms": stopwatches[testName]!.elapsedMilliseconds,
-      "expected": "Pass",
-      "result": matchedExpectations ? "Pass" : "Fail",
-      "matches": matchedExpectations,
-    }));
-    if (!matchedExpectations) {
-      StringBuffer sb = new StringBuffer();
-      if (printFailureLog) {
-        String outcome = "${result.outcome}";
-        sb.write("FAILED: $testName: $outcome");
-      }
-      sb.write(result.log);
-      if (result.error != null) {
-        sb.write("\n\n${result.error}");
-      }
-      if (result.trace != null) {
-        sb.write("\n\n${result.trace}");
-      }
-      sb.write("\n\nTo re-run this test, run:");
-      sb.write("\n\n   dart pkg/front_end/test/unit_test_suites.dart -p "
-          "$testName");
-      if (result.autoFixCommand != null) {
-        sb.write("\n\nTo automatically update the test expectations, run:");
-        sb.write("\n\n   dart pkg/front_end/test/unit_test_suites.dart -p "
-            "$testName -D${result.autoFixCommand}");
-        if (result.canBeFixWithUpdateExpectations) {
-          sb.write('\n\nTo update test expectations for all tests at once, '
-              'run:');
-          sb.write('\n\n  dart pkg/front_end/tool/update_expectations.dart');
-          sb.write('\n\nNote that this takes a long time and should only be '
-              'used when many tests need updating.\n');
-        }
-      }
-      if (result.outcome == Expectation.Pass) {
-        String expectedString =
-            expectedOutcomes.map((e) => e.toString()).join(", ");
-        sb.write("\n\nThe test passed, but wasn't expected to. "
-            "You should update the status file for this test."
-            "\nThere's a status entry looking something like"
-            "\n\n  ${testDescription.shortName}: ${expectedString}"
-            "\n\nwhich should be removed."
-            "\n\nThe status file is ${suite.statusFile}.");
-      } else if (result.autoFixCommand == null) {
-        String expectedString =
-            expectedOutcomes.map((e) => e.toString()).join(", ");
-        sb.write("\n\nThe test has outcome ${result.outcome}, "
-            "but was expected to have outcome(s) ${expectedOutcomes}. "
-            "You might have to update the status file to the new outcome"
-            "\nThere's a status entry looking something like"
-            "\n\n  ${testDescription.shortName}: ${expectedString}"
-            "\n\nwhich should be updated."
-            "\n\nThe status file is ${suite.statusFile}.");
-      }
-      String failureLog = sb.toString();
-      String outcome = "${result.outcome}";
-      logsPort.send(jsonEncode({
-        "name": testName,
-        "configuration": configurationName,
-        "result": outcome,
-        "log": failureLog,
-      }));
-      if (printFailureLog) {
-        print(failureLog);
-      }
-    }
-    if (verbose) {
-      String result = matchedExpectations ? "PASS" : "FAIL";
-      print("${testName}: ${result}");
-    }
-  }
-
-  @override
-  void logTestStart(int completed, int failed, int total, testing.Suite suite,
-      TestDescription description) {
-    String name = getTestName(description);
-    stopwatches[name] = Stopwatch()..start();
-  }
-
-  @override
-  void logTestComplete(int completed, int failed, int total,
-      testing.Suite suite, TestDescription description) {}
-
-  @override
-  void logUncaughtError(error, StackTrace stackTrace) {}
-
-  @override
-  void logExpectedResult(testing.Suite suite, TestDescription description,
-      Result result, Set<Expectation> expectedOutcomes) {
-    handleTestResult(
-        suite, description, result, prefix, true, expectedOutcomes);
-  }
-
-  @override
-  void logUnexpectedResult(testing.Suite suite, TestDescription description,
-      Result result, Set<Expectation> expectedOutcomes) {
-    // The test framework (pkg/testing) calls the logger with an unexpected
-    // results a second time to create a summary. We ignore the second call
-    // here.
-    String testName = getTestName(description);
-    if (seenTests.contains(testName)) return;
-    seenTests.add(testName);
-    handleTestResult(
-        suite, description, result, prefix, false, expectedOutcomes);
-  }
-
-  @override
-  void noticeFrameworkCatchError(error, StackTrace stackTrace) {
-    gotFrameworkError = true;
-  }
-}
-
-class Suite {
-  final CreateContext createContext;
-  final String testingRootPath;
-  final String? path;
-  final int shardCount;
-  final String prefix;
-  final bool requiresGit;
-
-  const Suite(
-    this.prefix,
-    this.createContext,
-    this.testingRootPath, {
-    required this.shardCount,
-    this.path,
-    this.requiresGit: false,
-  });
-}
-
-const List<Suite> suites = [
-  const Suite(
-    "dartdoctest",
-    dartdoctest.createContext,
-    "../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "fasta/expression",
-    expression.createContext,
-    "../../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "fasta/outline",
-    outline.createContext,
-    "../../testing.json",
-    shardCount: 2,
-  ),
-  const Suite(
-    "fasta/incremental_dartino",
-    incremental_dartino.createContext,
-    "../../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "fasta/messages",
-    messages.createContext,
-    "../../testing.json",
-    shardCount: 1,
-    requiresGit: true,
-  ),
-  const Suite(
-    "fasta/text_serialization",
-    text_serialization.createContext,
-    "../../testing.json",
-    path: "fasta/text_serialization_suite.dart",
-    shardCount: 10,
-  ),
-  const Suite(
-    "fasta/strong",
-    strong.createContext,
-    "../../testing.json",
-    path: "fasta/strong_suite.dart",
-    shardCount: 2,
-  ),
-  const Suite(
-    "incremental_bulk_compiler_smoke",
-    incremental_bulk_compiler.createContext,
-    "../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "incremental",
-    incremental.createContext,
-    "../testing.json",
-    shardCount: 2,
-  ),
-  const Suite(
-    "lint",
-    lint.createContext,
-    "../testing.json",
-    shardCount: 1,
-    requiresGit: true,
-  ),
-  const Suite(
-    "parser",
-    parser.createContext,
-    "../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "parser_equivalence",
-    parserEquivalence.createContext,
-    "../testing.json",
-    shardCount: 1,
-  ),
-  const Suite(
-    "parser_all",
-    parserAll.createContext,
-    "../testing.json",
-    shardCount: 4,
-    requiresGit:
-        true /* technically not true, but tests *many* more files
-         than in test_matrix.json file set */
-    ,
-  ),
-  const Suite(
-    "spelling_test_not_src",
-    spelling_not_src.createContext,
-    "../testing.json",
-    shardCount: 1,
-    requiresGit: true,
-  ),
-  const Suite(
-    "spelling_test_src",
-    spelling_src.createContext,
-    "../testing.json",
-    shardCount: 1,
-    requiresGit: true,
-  ),
-  const Suite(
-    "fasta/weak",
-    weak.createContext,
-    "../../testing.json",
-    path: "fasta/weak_suite.dart",
-    shardCount: 10,
-  ),
-  const Suite(
-    "fasta/textual_outline",
-    textual_outline.createContext,
-    "../../testing.json",
-    shardCount: 1,
-  ),
-];
-
-const Duration timeoutDuration = Duration(minutes: 30);
-
-class SuiteConfiguration {
-  final Suite suite;
-  final SendPort resultsPort;
-  final SendPort logsPort;
-  final bool verbose;
-  final bool printFailureLog;
-  final String configurationName;
-  final String? testFilter;
-  final List<String> environmentOptions;
-  final int shard;
-
-  const SuiteConfiguration(
-    this.suite,
-    this.resultsPort,
-    this.logsPort,
-    this.verbose,
-    this.printFailureLog,
-    this.configurationName,
-    this.testFilter,
-    this.environmentOptions,
-    this.shard,
-  );
-}
-
-Future<void> runSuite(SuiteConfiguration configuration) async {
-  Suite suite = configuration.suite;
-  String name = suite.prefix;
-  String fullSuiteName = "$suiteNamePrefix/$name";
-  Uri suiteUri = Platform.script.resolve(suite.path ?? "${name}_suite.dart");
-  if (!new File.fromUri(suiteUri).existsSync()) {
-    throw "File doesn't exist: $suiteUri";
-  }
-  ResultLogger logger = ResultLogger(
-      fullSuiteName,
-      configuration.resultsPort,
-      configuration.logsPort,
-      configuration.verbose,
-      configuration.printFailureLog,
-      configuration.configurationName);
-  await runMe(
-    <String>[
-      if (configuration.testFilter != null) configuration.testFilter!,
-      for (String option in configuration.environmentOptions) '-D${option}',
-    ],
-    suite.createContext,
-    me: suiteUri,
-    configurationPath: suite.testingRootPath,
-    logger: logger,
-    shards: suite.shardCount,
-    shard: configuration.shard,
-  );
-  if (logger.gotFrameworkError) {
-    throw "Got framework error!";
-  }
-}
-
-Future<void> writeLinesToFile(Uri uri, List<String> lines) async {
-  await File.fromUri(uri).writeAsString(lines.map((line) => "$line\n").join());
-}
-
-Future<void> main([List<String> arguments = const <String>[]]) async {
-  Stopwatch totalRuntime = new Stopwatch()..start();
-
-  List<String> results = [];
-  List<String> logs = [];
-  Options options = Options.parse(arguments);
-  ReceivePort resultsPort = new ReceivePort()
-    ..listen((resultEntry) => results.add(resultEntry));
-  ReceivePort logsPort = new ReceivePort()
-    ..listen((logEntry) => logs.add(logEntry));
-  List<Future<bool>> futures = [];
-
-  if (options.verbose) {
-    print("NOTE: Willing to run with ${options.numberOfWorkers} 'workers'");
-    print("");
-  }
-
-  int numberOfFreeWorkers = options.numberOfWorkers;
-  // Run test suites and record the results and possible failure logs.
-  int chunkNum = 0;
-  for (Suite suite in suites) {
-    if (options.onlyTestsThatRequireGit && !suite.requiresGit) continue;
-    if (options.skipTestsThatRequireGit && suite.requiresGit) continue;
-    String prefix = suite.prefix;
-    String? filter = options.testFilter;
-    if (filter != null) {
-      // Skip suites that are not hit by the test filter, is there is one.
-      if (!filter.startsWith(prefix)) {
-        continue;
-      }
-      // Remove the 'fasta/' from filters, if there, because it is not used
-      // in the name defined in testing.json.
-      if (filter.startsWith("fasta/")) {
-        filter = filter.substring("fasta/".length);
-      }
-    }
-    for (int shard = 0; shard < suite.shardCount; shard++) {
-      if (chunkNum++ % options.shardCount != options.shard) continue;
-
-      while (numberOfFreeWorkers <= 0) {
-        // This might not be great design, but it'll work fine.
-        await Future.delayed(const Duration(milliseconds: 50));
-      }
-      numberOfFreeWorkers--;
-      // Start the test suite in a new isolate.
-      ReceivePort exitPort = new ReceivePort();
-      ReceivePort errorPort = new ReceivePort();
-      SuiteConfiguration configuration = new SuiteConfiguration(
-          suite,
-          resultsPort.sendPort,
-          logsPort.sendPort,
-          options.verbose,
-          options.printFailureLog,
-          options.configurationName,
-          filter,
-          options.environmentOptions,
-          shard);
-      Future<bool> future = new Future<bool>(() async {
-        try {
-          Stopwatch stopwatch = new Stopwatch()..start();
-          String naming = "$prefix";
-          if (suite.shardCount > 1) {
-            naming += " (${shard + 1} of ${suite.shardCount})";
-          }
-          print("Running suite $naming");
-          Isolate isolate = await Isolate.spawn<SuiteConfiguration>(
-              runSuite, configuration,
-              onExit: exitPort.sendPort, onError: errorPort.sendPort);
-          bool timedOutOrCrash = false;
-          Timer timer = new Timer(timeoutDuration, () {
-            timedOutOrCrash = true;
-            print("Suite $naming timed out after "
-                "${timeoutDuration.inMilliseconds}ms");
-            isolate.kill(priority: Isolate.immediate);
-          });
-          await exitPort.first;
-          errorPort.close();
-          List<dynamic> allErrors = await errorPort.toList();
-          bool gotError = allErrors.isNotEmpty;
-          if (gotError) {
-            print("Suite $naming encountered ${allErrors.length} error(s).");
-            print("Errors:");
-            for (int i = 0; i < allErrors.length; i++) {
-              print("-----------");
-              print("Error #$i:");
-              print(allErrors[i]);
-            }
-            print("-----------");
-            timedOutOrCrash = true;
-          }
-          timer.cancel();
-          int seconds = stopwatch.elapsedMilliseconds ~/ 1000;
-          if (!timedOutOrCrash) {
-            print("Suite $naming finished (took ${seconds} seconds)");
-          } else {
-            print("Suite $naming finished badly (see above) "
-                "(took ${seconds} seconds)");
-          }
-          return timedOutOrCrash;
-        } finally {
-          numberOfFreeWorkers++;
-        }
-      });
-      futures.add(future);
-    }
-  }
-  // Wait for isolates to terminate and clean up.
-  Iterable<bool> timeoutsOrCrashes = await Future.wait(futures);
-  resultsPort.close();
-  logsPort.close();
-  // Write results.json and logs.json.
-  Uri resultJsonUri = options.outputDirectory.resolve("results.json");
-  Uri logsJsonUri = options.outputDirectory.resolve("logs.json");
-  await writeLinesToFile(resultJsonUri, results);
-  await writeLinesToFile(logsJsonUri, logs);
-  print("Log files written to ${resultJsonUri.toFilePath()} and"
-      " ${logsJsonUri.toFilePath()}");
-  print("Entire run took ${totalRuntime.elapsed}.");
-  // Return with exit code 1 if at least one suite timed out.
-  bool timedOutOrCrashed = timeoutsOrCrashes.any((timeout) => timeout);
-  if (timedOutOrCrashed) {
-    throw "Crashed or timed out. Check stdout for more details.";
-  } else {
-    // The testing framework (package:testing) sets the exitCode to `1` if any
-    // test failed, so we reset it here to indicate that the test runner was
-    // successful.
-    exitCode = 0;
-  }
-}
diff --git a/pkg/front_end/test/utils/kernel_chain.dart b/pkg/front_end/test/utils/kernel_chain.dart
index a8412e8..2c96443 100644
--- a/pkg/front_end/test/utils/kernel_chain.dart
+++ b/pkg/front_end/test/utils/kernel_chain.dart
@@ -30,7 +30,7 @@
 import 'package:front_end/src/fasta/kernel/utils.dart' show ByteSink;
 
 import 'package:front_end/src/fasta/messages.dart'
-    show DiagnosticMessageFromJson, LocatedMessage;
+    show DiagnosticMessageFromJson, LocatedMessage, Message;
 
 import 'package:kernel/ast.dart' show Component, Library, Reference, Source;
 
@@ -392,10 +392,11 @@
 
       List<RoundTripStatus> failures = verifier.failures;
       for (RoundTripStatus failure in failures) {
-        LocatedMessage message = templateUnspecified
-            .withArguments("\n${failure}")
-            .withLocation(failure.uri!, failure.offset, 1);
-        options.report(message, message.code.severity);
+        Message message = templateUnspecified.withArguments("\n${failure}");
+        LocatedMessage locatedMessage = failure.uri != null
+            ? message.withLocation(failure.uri!, failure.offset, 1)
+            : message.withoutLocation();
+        options.report(locatedMessage, locatedMessage.code.severity);
       }
 
       if (writeRoundTripStatus) {
diff --git a/pkg/front_end/test/vm_service_coverage.dart b/pkg/front_end/test/vm_service_coverage.dart
index 0d4768a..2112bd0 100644
--- a/pkg/front_end/test/vm_service_coverage.dart
+++ b/pkg/front_end/test/vm_service_coverage.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.md file.
 
-// @dart = 2.9
-
 import 'dart:async';
 
 import 'vm_service_helper.dart' as vmService;
@@ -31,12 +29,12 @@
   @override
   Future<void> run() async {
     vmService.VM vm = await serviceClient.getVM();
-    if (vm.isolates.length != 1) {
-      throw "Expected 1 isolate, got ${vm.isolates.length}";
+    if (vm.isolates!.length != 1) {
+      throw "Expected 1 isolate, got ${vm.isolates!.length}";
     }
-    vmService.IsolateRef isolateRef = vm.isolates.single;
-    await waitUntilIsolateIsRunnable(isolateRef.id);
-    await serviceClient.resume(isolateRef.id);
+    vmService.IsolateRef isolateRef = vm.isolates!.single;
+    await waitUntilIsolateIsRunnable(isolateRef.id!);
+    await serviceClient.resume(isolateRef.id!);
     Completer<String> cTimeout = new Completer();
     Timer timer = new Timer(new Duration(minutes: 20), () {
       cTimeout.complete("Timeout");
@@ -45,13 +43,13 @@
 
     Completer<String> cRunDone = new Completer();
     // ignore: unawaited_futures
-    waitUntilPaused(isolateRef.id).then((value) => cRunDone.complete("Done"));
+    waitUntilPaused(isolateRef.id!).then((value) => cRunDone.complete("Done"));
 
     await Future.any([cRunDone.future, cTimeout.future, cProcessExited.future]);
 
     timer.cancel();
 
-    if (!await isPausedAtExit(isolateRef.id)) {
+    if (!await isPausedAtExit(isolateRef.id!)) {
       killProcess();
       throw "Expected to be paused at exit, but is just paused!";
     }
@@ -59,36 +57,36 @@
     // Get and process coverage information.
     Stopwatch stopwatch = new Stopwatch()..start();
     vmService.SourceReport sourceReport = await serviceClient.getSourceReport(
-        isolateRef.id, [vmService.SourceReportKind.kCoverage],
+        isolateRef.id!, [vmService.SourceReportKind.kCoverage],
         forceCompile: forceCompilation);
     print("Got source report from VM in ${stopwatch.elapsedMilliseconds} ms");
     stopwatch.reset();
     Map<Uri, Coverage> coverages = {};
-    for (vmService.SourceReportRange range in sourceReport.ranges) {
-      vmService.ScriptRef script = sourceReport.scripts[range.scriptIndex];
-      Uri scriptUri = Uri.parse(script.uri);
+    for (vmService.SourceReportRange range in sourceReport.ranges!) {
+      vmService.ScriptRef script = sourceReport.scripts![range.scriptIndex!];
+      Uri scriptUri = Uri.parse(script.uri!);
       if (!includeCoverageFor(scriptUri)) continue;
       Coverage coverage = coverages[scriptUri] ??= new Coverage();
 
-      vmService.SourceReportCoverage sourceReportCoverage = range.coverage;
+      vmService.SourceReportCoverage? sourceReportCoverage = range.coverage;
       if (sourceReportCoverage == null) {
         // Range not compiled. Record the range if provided.
-        assert(!range.compiled);
-        if (range.startPos >= 0 || range.endPos >= 0) {
+        assert(!range.compiled!);
+        if (range.startPos! >= 0 || range.endPos! >= 0) {
           coverage.notCompiled
-              .add(new StartEndPair(range.startPos, range.endPos));
+              .add(new StartEndPair(range.startPos!, range.endPos!));
         }
         continue;
       }
-      coverage.hits.addAll(sourceReportCoverage.hits);
-      coverage.misses.addAll(sourceReportCoverage.misses);
+      coverage.hits.addAll(sourceReportCoverage.hits!);
+      coverage.misses.addAll(sourceReportCoverage.misses!);
     }
     print("Processed source report from VM in "
         "${stopwatch.elapsedMilliseconds} ms");
     stopwatch.reset();
 
     // It's paused at exit, so resuming should allow us to exit.
-    await serviceClient.resume(isolateRef.id);
+    await serviceClient.resume(isolateRef.id!);
 
     for (MapEntry<Uri, Coverage> entry in coverages.entries) {
       assert(entry.value.hits.intersection(entry.value.misses).isEmpty);
@@ -142,7 +140,7 @@
   String toString() => "[$startPos - $endPos]";
 
   @override
-  int compareTo(Object other) {
+  int compareTo(dynamic other) {
     if (other is! StartEndPair) return -1;
     StartEndPair o = other;
     return startPos - o.startPos;
diff --git a/pkg/front_end/test/vm_service_coverage_constant_evaluator.dart b/pkg/front_end/test/vm_service_coverage_constant_evaluator.dart
index 56b167b..3128758 100644
--- a/pkg/front_end/test/vm_service_coverage_constant_evaluator.dart
+++ b/pkg/front_end/test/vm_service_coverage_constant_evaluator.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.md file.
 
-// @dart = 2.9
-
 import 'vm_service_coverage.dart' as helper;
 
 Future<void> main(List<String> args) async {
diff --git a/pkg/front_end/test/vm_service_for_leak_detection.dart b/pkg/front_end/test/vm_service_for_leak_detection.dart
index e5782a8..44b38c4 100644
--- a/pkg/front_end/test/vm_service_for_leak_detection.dart
+++ b/pkg/front_end/test/vm_service_for_leak_detection.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 'dart:io';
 
 import "vm_service_heap_helper.dart" as helper;
diff --git a/pkg/front_end/test/vm_service_heap_finder.dart b/pkg/front_end/test/vm_service_heap_finder.dart
index a098317..a5aa11f 100644
--- a/pkg/front_end/test/vm_service_heap_finder.dart
+++ b/pkg/front_end/test/vm_service_heap_finder.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 "dart:io";
 
 import "vm_service_helper.dart" as vmService;
@@ -16,9 +14,9 @@
 }
 
 Future<void> main(List<String> args) async {
-  String connectTo;
-  String classToFind;
-  String whatToDo;
+  String? connectTo;
+  String? classToFind;
+  String? whatToDo;
   for (String arg in args) {
     if (arg.startsWith("--url=")) {
       connectTo = arg.substring("--url=".length);
@@ -62,25 +60,26 @@
 
 String ask(String question) {
   stdout.write("$question: ");
-  return stdin.readLineSync();
+  return stdin.readLineSync()!;
 }
 
 class VMServiceHeapHelperPrinter extends vmService.VMServiceHelper {
-  Future<void> printAllocationProfile(String isolateId, {String filter}) async {
+  Future<void> printAllocationProfile(String isolateId,
+      {String? filter}) async {
     await waitUntilIsolateIsRunnable(isolateId);
     vmService.AllocationProfile allocationProfile =
         await serviceClient.getAllocationProfile(isolateId);
-    for (vmService.ClassHeapStats member in allocationProfile.members) {
+    for (vmService.ClassHeapStats member in allocationProfile.members!) {
       if (filter != null) {
-        if (member.classRef.name != filter) continue;
+        if (member.classRef!.name != filter) continue;
       } else {
-        if (member.classRef.name == "") continue;
+        if (member.classRef!.name == "") continue;
         if (member.instancesCurrent == 0) continue;
       }
-      vmService.Class c =
-          await serviceClient.getObject(isolateId, member.classRef.id);
+      vmService.Class c = await serviceClient.getObject(
+          isolateId, member.classRef!.id!) as vmService.Class;
       if (c.location?.script?.uri == null) continue;
-      print("${member.classRef.name}: ${member.instancesCurrent}");
+      print("${member.classRef!.name}: ${member.instancesCurrent}");
     }
   }
 
@@ -89,32 +88,32 @@
     await waitUntilIsolateIsRunnable(isolateId);
     vmService.AllocationProfile allocationProfile =
         await serviceClient.getAllocationProfile(isolateId);
-    for (vmService.ClassHeapStats member in allocationProfile.members) {
-      if (member.classRef.name != filter) continue;
-      vmService.Class c =
-          await serviceClient.getObject(isolateId, member.classRef.id);
+    for (vmService.ClassHeapStats member in allocationProfile.members!) {
+      if (member.classRef!.name != filter) continue;
+      vmService.Class c = await serviceClient.getObject(
+          isolateId, member.classRef!.id!) as vmService.Class;
       if (c.location?.script?.uri == null) continue;
-      print("${member.classRef.name}: ${member.instancesCurrent}");
-      print(c.location.script.uri);
+      print("${member.classRef!.name}: ${member.instancesCurrent}");
+      print(c.location!.script!.uri);
 
       vmService.InstanceSet instances = await serviceClient.getInstances(
-          isolateId, member.classRef.id, 10000);
+          isolateId, member.classRef!.id!, 10000);
       int instanceNum = 0;
-      for (vmService.ObjRef instance in instances.instances) {
+      for (vmService.ObjRef instance in instances.instances!) {
         instanceNum++;
         vmService.Obj receivedObject =
-            await serviceClient.getObject(isolateId, instance.id);
+            await serviceClient.getObject(isolateId, instance.id!);
         if (receivedObject is! vmService.Instance) continue;
         vmService.Instance object = receivedObject;
-        for (vmService.BoundField field in object.fields) {
-          if (field.decl.name == fieldName) {
+        for (vmService.BoundField field in object.fields!) {
+          if (field.decl!.name == fieldName) {
             if (field.value is vmService.Sentinel) continue;
             vmService.Obj receivedValue =
                 await serviceClient.getObject(isolateId, field.value.id);
             if (receivedValue is! vmService.Instance) continue;
-            String value = (receivedValue as vmService.Instance).valueAsString;
+            String value = receivedValue.valueAsString!;
             if (!fieldValues.contains(value)) continue;
-            print("${instanceNum}: ${field.decl.name}: "
+            print("${instanceNum}: ${field.decl!.name}: "
                 "${value} --- ${instance.id}");
           }
         }
@@ -127,29 +126,29 @@
     await waitUntilIsolateIsRunnable(isolateId);
     vmService.AllocationProfile allocationProfile =
         await serviceClient.getAllocationProfile(isolateId);
-    for (vmService.ClassHeapStats member in allocationProfile.members) {
-      if (member.classRef.name != filter) continue;
-      vmService.Class c =
-          await serviceClient.getObject(isolateId, member.classRef.id);
+    for (vmService.ClassHeapStats member in allocationProfile.members!) {
+      if (member.classRef!.name != filter) continue;
+      vmService.Class c = await serviceClient.getObject(
+          isolateId, member.classRef!.id!) as vmService.Class;
       print("Found ${c.name} (location: ${c.location})");
-      print("${member.classRef.name}: "
+      print("${member.classRef!.name}: "
           "(instancesCurrent: ${member.instancesCurrent})");
       print("");
 
       vmService.InstanceSet instances = await serviceClient.getInstances(
-          isolateId, member.classRef.id, 10000);
-      print(" => Got ${instances.instances.length} instances");
+          isolateId, member.classRef!.id!, 10000);
+      print(" => Got ${instances.instances!.length} instances");
       print("");
 
-      for (vmService.ObjRef instance in instances.instances) {
+      for (vmService.ObjRef instance in instances.instances!) {
         vmService.Obj receivedObject =
-            await serviceClient.getObject(isolateId, instance.id);
+            await serviceClient.getObject(isolateId, instance.id!);
         print("Instance: $receivedObject");
         vmService.RetainingPath retainingPath =
-            await serviceClient.getRetainingPath(isolateId, instance.id, 1000);
+            await serviceClient.getRetainingPath(isolateId, instance.id!, 1000);
         print("Retaining path: (length ${retainingPath.length}");
-        for (int i = 0; i < retainingPath.elements.length; i++) {
-          print("  [$i] = ${retainingPath.elements[i]}");
+        for (int i = 0; i < retainingPath.elements!.length; i++) {
+          print("  [$i] = ${retainingPath.elements![i]}");
         }
 
         print("");
diff --git a/pkg/front_end/test/vm_service_heap_helper.dart b/pkg/front_end/test/vm_service_heap_helper.dart
index ac5e8d9..1511a51 100644
--- a/pkg/front_end/test/vm_service_heap_helper.dart
+++ b/pkg/front_end/test/vm_service_heap_helper.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 "vm_service_helper.dart" as vmService;
 
 class VMServiceHeapHelperSpecificExactLeakFinder
@@ -22,13 +20,13 @@
   }) {
     if (interests.isEmpty) throw "Empty list of interests given";
     for (Interest interest in interests) {
-      Map<String, List<String>> classToFields = _interests[interest.uri];
+      Map<String, List<String>>? classToFields = _interests[interest.uri];
       if (classToFields == null) {
         classToFields = Map<String, List<String>>();
         _interests[interest.uri] = classToFields;
       }
       _interestsClassNames.add(interest.className);
-      List<String> fields = classToFields[interest.className];
+      List<String>? fields = classToFields[interest.className];
       if (fields == null) {
         fields = <String>[];
         classToFields[interest.className] = fields;
@@ -36,12 +34,12 @@
       fields.addAll(interest.fieldNames);
     }
     for (Interest interest in prettyPrints) {
-      Map<String, List<String>> classToFields = _prettyPrints[interest.uri];
+      Map<String, List<String>>? classToFields = _prettyPrints[interest.uri];
       if (classToFields == null) {
         classToFields = Map<String, List<String>>();
         _prettyPrints[interest.uri] = classToFields;
       }
-      List<String> fields = classToFields[interest.className];
+      List<String>? fields = classToFields[interest.className];
       if (fields == null) {
         fields = <String>[];
         classToFields[interest.className] = fields;
@@ -51,20 +49,20 @@
   }
 
   Future<void> pause() async {
-    await serviceClient.pause(_isolateRef.id);
+    await serviceClient.pause(_isolateRef.id!);
   }
 
-  vmService.VM _vm;
-  vmService.IsolateRef _isolateRef;
-  int _iterationNumber;
+  late vmService.VM _vm;
+  late vmService.IsolateRef _isolateRef;
+  late int _iterationNumber;
   int get iterationNumber => _iterationNumber;
 
   /// Best effort check if the isolate is idle.
   Future<bool> isIdle() async {
-    dynamic tmp = await serviceClient.getIsolate(_isolateRef.id);
+    dynamic tmp = await serviceClient.getIsolate(_isolateRef.id!);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
-      return isolate.pauseEvent.topFrame == null;
+      return isolate.pauseEvent!.topFrame == null;
     }
     return false;
   }
@@ -72,44 +70,44 @@
   @override
   Future<void> run() async {
     _vm = await serviceClient.getVM();
-    if (_vm.isolates.length == 0) {
+    if (_vm.isolates!.length == 0) {
       print("Didn't get any isolates. Will wait 1 second and retry.");
       await Future.delayed(new Duration(seconds: 1));
       _vm = await serviceClient.getVM();
     }
-    if (_vm.isolates.length != 1) {
-      throw "Expected 1 isolate, got ${_vm.isolates.length}";
+    if (_vm.isolates!.length != 1) {
+      throw "Expected 1 isolate, got ${_vm.isolates!.length}";
     }
-    _isolateRef = _vm.isolates.single;
-    await forceGC(_isolateRef.id);
+    _isolateRef = _vm.isolates!.single;
+    await forceGC(_isolateRef.id!);
 
-    assert(await isPausedAtStart(_isolateRef.id));
-    await serviceClient.resume(_isolateRef.id);
+    assert(await isPausedAtStart(_isolateRef.id!));
+    await serviceClient.resume(_isolateRef.id!);
 
     _iterationNumber = 1;
     while (true) {
       if (!shouldDoAnotherIteration(_iterationNumber)) break;
-      await waitUntilPaused(_isolateRef.id);
+      await waitUntilPaused(_isolateRef.id!);
       print("Iteration: #$_iterationNumber");
 
       Stopwatch stopwatch = new Stopwatch()..start();
 
       vmService.AllocationProfile allocationProfile =
-          await forceGC(_isolateRef.id);
+          await forceGC(_isolateRef.id!);
       print("Forced GC in ${stopwatch.elapsedMilliseconds} ms");
 
       stopwatch.reset();
       List<Leak> leaks = [];
-      for (vmService.ClassHeapStats member in allocationProfile.members) {
-        if (_interestsClassNames.contains(member.classRef.name)) {
-          vmService.Class c =
-              await serviceClient.getObject(_isolateRef.id, member.classRef.id);
-          String uriString = c.location?.script?.uri;
+      for (vmService.ClassHeapStats member in allocationProfile.members!) {
+        if (_interestsClassNames.contains(member.classRef!.name)) {
+          vmService.Class c = (await serviceClient.getObject(
+              _isolateRef.id!, member.classRef!.id!)) as vmService.Class;
+          String? uriString = c.location?.script?.uri;
           if (uriString == null) continue;
           Uri uri = Uri.parse(uriString);
-          Map<String, List<String>> uriInterest = _interests[uri];
+          Map<String, List<String>>? uriInterest = _interests[uri];
           if (uriInterest == null) continue;
-          List<String> fieldsForClass = uriInterest[c.name];
+          List<String>? fieldsForClass = uriInterest[c.name];
           if (fieldsForClass == null) continue;
 
           List<String> fieldsForClassPrettyPrint = fieldsForClass;
@@ -117,11 +115,11 @@
           uriInterest = _prettyPrints[uri];
           if (uriInterest != null) {
             if (uriInterest[c.name] != null) {
-              fieldsForClassPrettyPrint = uriInterest[c.name];
+              fieldsForClassPrettyPrint = uriInterest[c.name]!;
             }
           }
 
-          leaks.addAll(await _findLeaks(_isolateRef, member.classRef,
+          leaks.addAll(await _findLeaks(_isolateRef, member.classRef!,
               fieldsForClass, fieldsForClassPrettyPrint));
         }
       }
@@ -138,7 +136,7 @@
 
       print("Looked for leaks in ${stopwatch.elapsedMilliseconds} ms");
 
-      await serviceClient.resume(_isolateRef.id);
+      await serviceClient.resume(_isolateRef.id!);
       _iterationNumber++;
     }
   }
@@ -149,7 +147,7 @@
       List<String> fieldsForClass,
       List<String> fieldsForClassPrettyPrint) async {
     // Use undocumented (/ private?) method to get all instances of this class.
-    vmService.InstanceRef instancesAsList = await serviceClient.callMethod(
+    vmService.InstanceRef instancesAsList = (await serviceClient.callMethod(
       "_getInstancesAsArray",
       isolateId: isolateRef.id,
       args: {
@@ -157,7 +155,7 @@
         "includeSubclasses": false,
         "includeImplementors": false,
       },
-    );
+    )) as vmService.InstanceRef;
 
     // Create dart code that `toString`s a class instance according to
     // the fields given as wanting printed. Both for finding duplicates (1) and
@@ -165,14 +163,14 @@
     // them) (2).
 
     // 1:
-    String fieldsToStringCode = classRef.name +
+    String fieldsToStringCode = classRef.name! +
         "[" +
         fieldsForClass
             .map((value) => "$value: \"\${element.$value}\"")
             .join(", ") +
         "]";
     // 2:
-    String fieldsToStringPrettyPrintCode = classRef.name +
+    String fieldsToStringPrettyPrintCode = classRef.name! +
         "[" +
         fieldsForClassPrettyPrint
             .map((value) => "$value: \"\${element.$value}\"")
@@ -182,9 +180,9 @@
     // Expression evaluation to find duplicates: Put all entries into a map
     // indexed by the `toString` code created above, mapping to list of that
     // data.
-    vmService.InstanceRef mappedData = await serviceClient.evaluate(
-      isolateRef.id,
-      instancesAsList.id,
+    vmService.InstanceRef mappedData = (await serviceClient.evaluate(
+      isolateRef.id!,
+      instancesAsList.id!,
       """
           this
               .fold({}, (dynamic index, dynamic element) {
@@ -194,22 +192,22 @@
                 return index;
               })
         """,
-    );
+    )) as vmService.InstanceRef;
     // Expression calculation to find if any of the lists created as values
     // above contains more than one entry (i.e. there's a duplicate).
-    vmService.InstanceRef duplicatesLengthRef = await serviceClient.evaluate(
-      isolateRef.id,
-      mappedData.id,
+    vmService.InstanceRef duplicatesLengthRef = (await serviceClient.evaluate(
+      isolateRef.id!,
+      mappedData.id!,
       """
           this
               .values
               .where((dynamic element) => (element.length > 1) as bool)
               .length
         """,
-    );
-    vmService.Instance duplicatesLength =
-        await serviceClient.getObject(isolateRef.id, duplicatesLengthRef.id);
-    int duplicates = int.tryParse(duplicatesLength.valueAsString);
+    )) as vmService.InstanceRef;
+    vmService.Instance duplicatesLength = (await serviceClient.getObject(
+        isolateRef.id!, duplicatesLengthRef.id!)) as vmService.Instance;
+    int? duplicates = int.tryParse(duplicatesLength.valueAsString!);
     if (duplicates != 0) {
       // There are duplicates. Expression calculation to encode the duplication
       // data (both the string that caused it to be a duplicate and the pretty
@@ -219,9 +217,9 @@
       // e.g. encode the string "string" as "6:string" (length 6, string),
       // and the list ["foo", "bar"] as "2:3:foo:3:bar" (2 entries, length 3,
       // foo, length 3, bar).
-      vmService.ObjRef duplicatesDataRef = await serviceClient.evaluate(
-        isolateRef.id,
-        mappedData.id,
+      vmService.ObjRef duplicatesDataRef = (await serviceClient.evaluate(
+        isolateRef.id!,
+        mappedData.id!,
         """
           this
               .entries
@@ -237,11 +235,11 @@
             return "\${keyPart}:\${valuePart1}:\${valuePart2}";
           }).join(":")
           """,
-      );
+      )) as vmService.ObjRef;
       if (duplicatesDataRef is! vmService.InstanceRef) {
         if (duplicatesDataRef is vmService.ErrorRef) {
-          vmService.Error error = await serviceClient.getObject(
-              isolateRef.id, duplicatesDataRef.id);
+          vmService.Error error = (await serviceClient.getObject(
+              isolateRef.id!, duplicatesDataRef.id!)) as vmService.Error;
           throw "Leak found, but trying to evaluate pretty printing "
               "didn't go as planned.\n"
               "Got error with message "
@@ -254,9 +252,9 @@
         }
       }
 
-      vmService.Instance duplicatesData =
-          await serviceClient.getObject(isolateRef.id, duplicatesDataRef.id);
-      String encodedData = duplicatesData.valueAsString;
+      vmService.Instance duplicatesData = (await serviceClient.getObject(
+          isolateRef.id!, duplicatesDataRef.id!)) as vmService.Instance;
+      String encodedData = duplicatesData.valueAsString!;
       try {
         return parseEncodedLeakString(encodedData);
       } catch (e) {
diff --git a/pkg/front_end/test/vm_service_heap_helper_test.dart b/pkg/front_end/test/vm_service_heap_helper_test.dart
index 8a7df50..3879d88 100644
--- a/pkg/front_end/test/vm_service_heap_helper_test.dart
+++ b/pkg/front_end/test/vm_service_heap_helper_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
-
 import 'dart:async';
 import 'dart:developer';
 import 'dart:io';
@@ -144,9 +142,9 @@
   Completer<List<String>> completer = new Completer<List<String>>();
 
   LeakFinderTest({
-    List<helper.Interest> interests,
-    List<helper.Interest> prettyPrints,
-    bool throwOnPossibleLeak,
+    required List<helper.Interest> interests,
+    required List<helper.Interest> prettyPrints,
+    required bool throwOnPossibleLeak,
   }) : super(
             interests: interests,
             prettyPrints: prettyPrints,
diff --git a/pkg/front_end/test/vm_service_helper.dart b/pkg/front_end/test/vm_service_helper.dart
index c796b41..f2d3cb6 100644
--- a/pkg/front_end/test/vm_service_helper.dart
+++ b/pkg/front_end/test/vm_service_helper.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 "dart:convert";
 import "dart:io";
 
@@ -14,7 +12,7 @@
 export "package:vm_service/vm_service_io.dart";
 
 class VMServiceHelper {
-  vmService.VmService _serviceClient;
+  late vmService.VmService _serviceClient;
   vmService.VmService get serviceClient => _serviceClient;
 
   VMServiceHelper();
@@ -34,7 +32,7 @@
   Future<bool> waitUntilPaused(String isolateId) async {
     int nulls = 0;
     while (true) {
-      bool result = await isPaused(isolateId);
+      bool? result = await isPaused(isolateId);
       if (result == null) {
         nulls++;
         if (nulls > 5) {
@@ -50,11 +48,11 @@
     }
   }
 
-  Future<bool> isPaused(String isolateId) async {
+  Future<bool?> isPaused(String isolateId) async {
     dynamic tmp = await _serviceClient.getIsolate(isolateId);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
-      if (isolate.pauseEvent.kind != "Resume") return true;
+      if (isolate.pauseEvent!.kind != "Resume") return true;
       return false;
     }
     return null;
@@ -64,7 +62,7 @@
     dynamic tmp = await _serviceClient.getIsolate(isolateId);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
-      return isolate.pauseEvent.kind == "PauseStart";
+      return isolate.pauseEvent!.kind == "PauseStart";
     }
     return false;
   }
@@ -73,7 +71,7 @@
     dynamic tmp = await _serviceClient.getIsolate(isolateId);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
-      return isolate.pauseEvent.kind == "PauseExit";
+      return isolate.pauseEvent!.kind == "PauseExit";
     }
     return false;
   }
@@ -91,13 +89,13 @@
         rethrow;
       }
       if (allocationProfile.dateLastServiceGC != null &&
-          allocationProfile.dateLastServiceGC >= expectGcAfter) {
+          allocationProfile.dateLastServiceGC! >= expectGcAfter) {
         return allocationProfile;
       }
     }
   }
 
-  Future<bool> isIsolateRunnable(String isolateId) async {
+  Future<bool?> isIsolateRunnable(String isolateId) async {
     dynamic tmp = await _serviceClient.getIsolate(isolateId);
     if (tmp is vmService.Isolate) {
       vmService.Isolate isolate = tmp;
@@ -109,7 +107,7 @@
   Future<void> waitUntilIsolateIsRunnable(String isolateId) async {
     int nulls = 0;
     while (true) {
-      bool result = await isIsolateRunnable(isolateId);
+      bool? result = await isIsolateRunnable(isolateId);
       if (result == null) {
         nulls++;
         if (nulls > 5) {
@@ -127,11 +125,11 @@
 
   Future<String> getIsolateId() async {
     vmService.VM vm = await _serviceClient.getVM();
-    if (vm.isolates.length != 1) {
-      throw "Expected 1 isolate, got ${vm.isolates.length}";
+    if (vm.isolates!.length != 1) {
+      throw "Expected 1 isolate, got ${vm.isolates!.length}";
     }
-    vmService.IsolateRef isolateRef = vm.isolates.single;
-    return isolateRef.id;
+    vmService.IsolateRef isolateRef = vm.isolates!.single;
+    return isolateRef.id!;
   }
 }
 
@@ -150,14 +148,14 @@
 }
 
 abstract class LaunchingVMServiceHelper extends VMServiceHelper {
-  Process _process;
+  late Process _process;
   Process get process => _process;
 
   bool _started = false;
 
   Future<void> start(List<String> scriptAndArgs,
-      {void stdoutReceiver(String line),
-      void stderrReceiver(String line)}) async {
+      {void Function(String line)? stdoutReceiver,
+      void Function(String line)? stderrReceiver}) async {
     if (_started) throw "Already started";
     _started = true;
     _process = await Process.start(
diff --git a/pkg/front_end/testcases/agnostic/as.dart.weak.modular.expect b/pkg/front_end/testcases/agnostic/as.dart.weak.modular.expect
new file mode 100644
index 0000000..40e7073
--- /dev/null
+++ b/pkg/front_end/testcases/agnostic/as.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::int> a = #C1;
+static const field core::List<core::int> b = #C2;
+static method main() → void {}
+
+constants  {
+  #C1 = <Null>[]
+  #C2 = <core::int?>[]
+}
diff --git a/pkg/front_end/testcases/agnostic/identical.dart.weak.modular.expect b/pkg/front_end/testcases/agnostic/identical.dart.weak.modular.expect
new file mode 100644
index 0000000..f5a7aaa
--- /dev/null
+++ b/pkg/front_end/testcases/agnostic/identical.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::int> a = #C1;
+static const field core::List<core::int?> b = #C2;
+static const field core::bool c = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = <core::int*>[]
+  #C2 = <core::int?>[]
+  #C3 = false
+}
diff --git a/pkg/front_end/testcases/agnostic/is.dart.weak.modular.expect b/pkg/front_end/testcases/agnostic/is.dart.weak.modular.expect
new file mode 100644
index 0000000..b52395a
--- /dev/null
+++ b/pkg/front_end/testcases/agnostic/is.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::bool a = #C1;
+static const field core::bool b = #C1;
+static method main() → void {}
+
+constants  {
+  #C1 = true
+}
diff --git a/pkg/front_end/testcases/agnostic/map.dart.weak.modular.expect b/pkg/front_end/testcases/agnostic/map.dart.weak.modular.expect
new file mode 100644
index 0000000..70e1f24
--- /dev/null
+++ b/pkg/front_end/testcases/agnostic/map.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::int> a = #C1;
+static const field core::List<core::int?> b = #C2;
+static const field core::Map<core::List<core::int?>, core::int> c = #C5;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = <core::int*>[]
+  #C2 = <core::int?>[]
+  #C3 = 0
+  #C4 = 1
+  #C5 = <core::List<core::int?>*, core::int*>{#C1:#C3, #C2:#C4)
+}
diff --git a/pkg/front_end/testcases/agnostic/set.dart.weak.modular.expect b/pkg/front_end/testcases/agnostic/set.dart.weak.modular.expect
new file mode 100644
index 0000000..add03f5
--- /dev/null
+++ b/pkg/front_end/testcases/agnostic/set.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::int> a = #C1;
+static const field core::List<core::int?> b = #C2;
+static const field core::Set<core::List<core::int?>> c = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = <core::int*>[]
+  #C2 = <core::int?>[]
+  #C3 = <core::List<core::int?>*>{#C1, #C2}
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_assert_statements.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_assert_statements.dart.weak.modular.expect
new file mode 100644
index 0000000..89d51078
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_assert_statements.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C1;
+static method fn() → core::int {
+  core::int x = 0;
+  assert(x =={core::num::==}{(core::Object) → core::bool} 0, "fail");
+  return x;
+}
+static method fn2() → core::int {
+  core::int x = 0;
+  assert((() → core::bool {
+    core::int y = x.{core::num::+}(1){(core::num) → core::int};
+    return y =={core::num::==}{(core::Object) → core::bool} 1;
+  })(){() → core::bool});
+  return x;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 0);
+  exp::Expect::equals(#C1, 0);
+}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_block.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_block.dart.weak.modular.expect
new file mode 100644
index 0000000..ee6a074
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_block.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static method blockTest() → void {
+  function x() → core::int
+    return 1;
+  exp::Expect::equals(#C1, 1);
+  {
+    function x() → core::int
+      return 2;
+    exp::Expect::equals(#C2, 2);
+    {
+      function x() → core::int
+        return 3;
+      exp::Expect::equals(#C3, 3);
+    }
+  }
+  exp::Expect::equals(#C1, 1);
+}
+static method blockTest1() → void {
+  function x() → core::int {
+    core::int z = 3;
+    {
+      core::int z = 4;
+    }
+    return z;
+  }
+  exp::Expect::equals(#C3, 3);
+}
+static method main() → void {
+  self::blockTest();
+  self::blockTest1();
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 3
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_closures.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_closures.dart.weak.modular.expect
new file mode 100644
index 0000000..a1bc565
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_closures.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C1;
+static const field core::int y = #C2;
+static const field core::int var3 = #C3;
+static const field core::int var4 = #C1;
+static const field core::int var5 = #C4;
+static const field core::int var6 = #C4;
+static method foo() → core::int {
+  () → () → core::int f = () → () → core::int {
+    core::int count = 0;
+    function baz() → core::int {
+      count = count.{core::num::+}(1){(core::num) → core::int};
+      return count;
+    }
+    return baz;
+  };
+  () → core::int c1 = f(){() → () → core::int};
+  () → core::int c2 = f(){() → () → core::int};
+  core::int c1_val1 = c1(){() → core::int};
+  assert(c1_val1 =={core::num::==}{(core::Object) → core::bool} 1);
+  core::int c1_val2 = c1(){() → core::int};
+  assert(c1_val2 =={core::num::==}{(core::Object) → core::bool} 2);
+  core::int c1_val3 = c1(){() → core::int};
+  assert(c1_val3 =={core::num::==}{(core::Object) → core::bool} 3);
+  core::int c2_val1 = c2(){() → core::int};
+  assert(c1_val1 =={core::num::==}{(core::Object) → core::bool} 1);
+  core::int c2_val2 = c2(){() → core::int};
+  assert(c1_val2 =={core::num::==}{(core::Object) → core::bool} 2);
+  core::int c2_val3 = c2(){() → core::int};
+  assert(c1_val3 =={core::num::==}{(core::Object) → core::bool} 3);
+  return 0;
+}
+static method fn() → core::int {
+  return (() → core::int => 0)(){() → core::int};
+}
+static method fn3() → core::int {
+  core::int y = 2;
+  return y;
+}
+static method fn4() → core::int {
+  core::int x = 0;
+  function innerFn() → core::int {
+    return x;
+  }
+  return innerFn(){() → core::int};
+}
+static method fn5(core::int a) → core::int {
+  function recurse(core::int b) → core::int {
+    if(b =={core::num::==}{(core::Object) → core::bool} 1)
+      return 1;
+    core::int result = recurse(b.{core::num::-}(1){(core::num) → core::int}){(core::int) → core::int};
+    return b.{core::num::*}(result){(core::num) → core::int};
+  }
+  return recurse(a){(core::int) → core::int};
+}
+static method fn6(core::int a) → core::int {
+  function recurse() → core::int {
+    a = a.{core::num::-}(1){(core::num) → core::int};
+    if(a =={core::num::==}{(core::Object) → core::bool} 1)
+      return 1;
+    return a.{core::num::*}(recurse(){() → core::int}){(core::num) → core::int};
+  }
+  return recurse(){() → core::int};
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 0);
+  exp::Expect::equals(#C1, 0);
+  exp::Expect::equals(#C3, 2);
+  exp::Expect::equals(#C1, 0);
+  exp::Expect::equals(#C4, 6);
+  exp::Expect::equals(#C4, 6);
+}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+  #C3 = 2
+  #C4 = 6
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.modular.expect
new file mode 100644
index 0000000..819097c
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(this.{self::Simple::name}{core::String} =={core::String::==}{(core::Object) → core::bool} #C1);
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    return;
+  }
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = #C2;
+static const field self::A var2 = #C3;
+static const field self::A var3 = #C3;
+static method fn() → self::A
+  return new self::A::•();
+static method main() → void {
+  exp::Expect::equals(#C2.{self::Simple::name}{core::String}, #C1);
+}
+
+constants  {
+  #C1 = "print"
+  #C2 = self::Simple {name:#C1}
+  #C3 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor.dart:21:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.modular.expect
new file mode 100644
index 0000000..b972e0f
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart.weak.modular.expect
@@ -0,0 +1,98 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:41:14: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const var4 = C();
+//              ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return Simple2(this.name);
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:14: Error: Constant evaluation error:
+// const var1 = Simple(printString);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:17:22: Context: This assertion failed.
+//     assert(this.name != printString);
+//                      ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:12:7: Context: While analyzing:
+// const var1 = Simple(printString);
+//       ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:14: Error: Constant evaluation error:
+// const var3 = B();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:33:14: Context: This assertion failed.
+//     assert(1 == 2);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:30:7: Context: While analyzing:
+// const var3 = B();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class Simple extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple
+    : self::Simple::name = name, super core::Object::•() {
+    assert(!(this.{self::Simple::name}{core::String} =={core::String::==}{(core::Object) → core::bool} #C1));
+  }
+}
+class Simple2 extends core::Object /*hasConstConstructor*/  {
+  final field core::String name;
+  const constructor •(core::String name) → self::Simple2
+    : self::Simple2::name = name, super core::Object::•() {
+    invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+  }
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•() {
+    assert(1 =={core::num::==}{(core::Object) → core::bool} 2);
+  }
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  field core::int? x = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static const field core::String printString = #C1;
+static const field self::Simple var1 = invalid-expression "This assertion failed.";
+static const field self::Simple2 var2 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:26:5: Error: Constructors can't have a return type.
+Try removing the return type.
+    return Simple2(this.name);
+    ^";
+static const field self::B var3 = invalid-expression "This assertion failed.";
+static const field invalid-type var4 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_const_ctor_error.dart:41:14: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+const var4 = C();
+             ^";
+static method main() → void {}
+
+constants  {
+  #C1 = "print"
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_ctor_error.dart:
+- Simple. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Simple2. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:38:9)
+- A. (from org-dartlang-testcase:///const_functions_const_ctor_error.dart:32:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_const_factory.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_const_factory.dart.weak.modular.expect
new file mode 100644
index 0000000..b9d7932
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_const_factory.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class MessageType extends core::Object /*hasConstConstructor*/  {
+  static const field self::MessageType print = #C2;
+  static const field self::MessageType skip = #C4;
+  final field core::String name;
+  const constructor _(core::String name) → self::MessageType
+    : self::MessageType::name = name, super core::Object::•()
+    ;
+  static factory parse(core::String name) → self::MessageType {
+    if(name =={core::String::==}{(core::Object) → core::bool} "print") {
+      return #C2;
+    }
+    return #C4;
+  }
+}
+static const field self::MessageType printConst = #C2;
+static method main() → void {
+  exp::Expect::equals(#C2, #C2);
+}
+
+constants  {
+  #C1 = "print"
+  #C2 = self::MessageType {name:#C1}
+  #C3 = "skip"
+  #C4 = self::MessageType {name:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_const_factory.dart:
+- MessageType._ (from org-dartlang-testcase:///const_functions_const_factory.dart:25:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_do_statements.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_do_statements.dart.weak.modular.expect
new file mode 100644
index 0000000..4442626
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_do_statements.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C3;
+static const field core::int var4 = #C4;
+static method fn() → core::int {
+  core::int x = 0;
+  do {
+    x = x.{core::num::+}(1){(core::num) → core::int};
+  }
+  while (x.{core::num::<}(2){(core::num) → core::bool})
+  return x;
+}
+static method fn2(core::int a) → core::int {
+  core::int x = 0;
+  core::int b = 0;
+  #L1:
+  do {
+    if(x.{core::num::>}(5){(core::num) → core::bool})
+      break #L1;
+    x = x.{core::num::+}(a){(core::num) → core::int};
+    b = b.{core::num::+}(1){(core::num) → core::int};
+  }
+  while (b.{core::num::<}(2){(core::num) → core::bool})
+  return x;
+}
+static method fn3() → core::int {
+  core::int x = 0;
+  core::int b = 0;
+  do
+    #L2:
+    {
+      x = x.{core::num::+}(1){(core::num) → core::int};
+      if(x.{core::num::%}(2){(core::num) → core::int} =={core::num::==}{(core::Object) → core::bool} 1)
+        break #L2;
+      b = b.{core::num::+}(x){(core::num) → core::int};
+    }
+  while (x.{core::num::<}(5){(core::num) → core::bool})
+  return b;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 2);
+  exp::Expect::equals(#C2, 4);
+  exp::Expect::equals(#C3, 10);
+  exp::Expect::equals(#C4, 6);
+}
+
+constants  {
+  #C1 = 2
+  #C2 = 4
+  #C3 = 10
+  #C4 = 6
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_for_statements.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_for_statements.dart.weak.modular.expect
new file mode 100644
index 0000000..f4906f3
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_for_statements.dart.weak.modular.expect
@@ -0,0 +1,102 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C3;
+static const field core::int var4 = #C4;
+static const field core::int var5 = #C5;
+static const field core::int var6 = #C1;
+static const field core::int var7 = #C6;
+static const field core::int var8 = #C2;
+static const field core::int var9 = #C7;
+static const field core::int var10 = #C8;
+static method fn(core::int a) → core::int {
+  core::int b = a;
+  for (core::int i = 0; i.{core::num::<}(2){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    b = b.{core::num::+}(a){(core::num) → core::int};
+  }
+  return b;
+}
+static method fn1(core::int a) → core::int {
+  core::int b = a;
+  for (core::int i = 0; ; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    b = b.{core::num::*}(3){(core::num) → core::int};
+    if(b.{core::num::>}(10){(core::num) → core::bool})
+      return b;
+  }
+}
+static method fn2() → core::int {
+  for (core::int i = 0, core::int j = 2; ; i = i.{core::num::+}(2){(core::num) → core::int}, j = j.{core::num::+}(1){(core::num) → core::int}) {
+    if(i.{core::num::+}(j){(core::num) → core::int}.{core::num::>}(10){(core::num) → core::bool}) {
+      return i.{core::num::+}(j){(core::num) → core::int};
+    }
+  }
+}
+static method fnContinue() → core::int {
+  core::int a = 0;
+  for (core::int i = 0; i.{core::num::<}(5){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+    #L1:
+    {
+      if(i.{core::num::%}(2){(core::num) → core::int} =={core::num::==}{(core::Object) → core::bool} 1)
+        break #L1;
+      a = a.{core::num::+}(i){(core::num) → core::int};
+    }
+  return a;
+}
+static method fnBreak(core::int a) → core::int {
+  core::int b = a;
+  #L2:
+  for (core::int i = 0; i.{core::num::<}(2){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    if(b =={core::num::==}{(core::Object) → core::bool} 2)
+      break #L2;
+    b = b.{core::num::+}(a){(core::num) → core::int};
+  }
+  return b;
+}
+static method fnNestedFor() → core::int {
+  core::int a = 0;
+  for (; ; ) {
+    #L3:
+    for (; ; ) {
+      break #L3;
+    }
+    return 1;
+  }
+}
+static method fnBreakLabel() → core::int {
+  #L4:
+  for (; ; ) {
+    for (; ; ) {
+      break #L4;
+    }
+  }
+  return 3;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 6);
+  exp::Expect::equals(#C2, 9);
+  exp::Expect::equals(#C3, 18);
+  exp::Expect::equals(#C4, 27);
+  exp::Expect::equals(#C5, 11);
+  exp::Expect::equals(#C1, 6);
+  exp::Expect::equals(#C6, 2);
+  exp::Expect::equals(#C2, 9);
+  exp::Expect::equals(#C7, 1);
+  exp::Expect::equals(#C8, 3);
+}
+
+constants  {
+  #C1 = 6
+  #C2 = 9
+  #C3 = 18
+  #C4 = 27
+  #C5 = 11
+  #C6 = 2
+  #C7 = 1
+  #C8 = 3
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_if_statements.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_if_statements.dart.weak.modular.expect
new file mode 100644
index 0000000..525bcb7
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_if_statements.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C3;
+static const field core::int one = #C4;
+static const field core::int var4 = #C1;
+static const field core::int var5 = #C2;
+static const field core::int var6 = #C1;
+static const field core::int var6_1 = #C2;
+static const field core::int var6_2 = #C3;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C6;
+static method ifTest(core::int a) → core::int {
+  if(a =={core::num::==}{(core::Object) → core::bool} 1) {
+    return 100;
+  }
+  else
+    if(a =={core::num::==}{(core::Object) → core::bool} 2) {
+      return 200;
+    }
+    else {
+      return 300;
+    }
+}
+static method ifTest2(core::int a) → core::int {
+  if(a =={core::num::==}{(core::Object) → core::bool} #C4) {
+    return 100;
+  }
+  else {
+    return 200;
+  }
+}
+static method ifTest3(core::int a) → core::int {
+  if(a.{core::num::>}(0){(core::num) → core::bool}) {
+    if(a =={core::num::==}{(core::Object) → core::bool} 1)
+      return 100;
+    return 200;
+  }
+  return 300;
+}
+static method ifTest4(core::int a) → core::int {
+  core::int b = a;
+  if(a =={core::num::==}{(core::Object) → core::bool} 1) {
+    b = b.{core::num::+}(a){(core::num) → core::int};
+    if(a.{core::num::%}(2){(core::num) → core::int} =={core::num::==}{(core::Object) → core::bool} 1) {
+      b = b.{core::num::+}(a){(core::num) → core::int};
+    }
+  }
+  else
+    if(a =={core::num::==}{(core::Object) → core::bool} 2) {
+      b = b.{core::num::-}(a){(core::num) → core::int};
+    }
+  return b;
+}
+static method ifTest5() → core::int {
+  core::int x = 10;
+  if(true) {
+    core::int x = 20;
+  }
+  return x;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C2, 200);
+  exp::Expect::equals(#C3, 300);
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C2, 200);
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C5, 3);
+  exp::Expect::equals(#C6, 10);
+}
+
+constants  {
+  #C1 = 100
+  #C2 = 200
+  #C3 = 300
+  #C4 = 1
+  #C5 = 3
+  #C6 = 10
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_instance_fields.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_instance_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..889f2d5
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_instance_fields.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field core::int y;
+  const constructor •(core::int y) → self::A
+    : self::A::y = y, super core::Object::•()
+    ;
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •(core::int x) → self::B
+    : super self::A::•(x)
+    ;
+}
+class C extends self::A /*hasConstConstructor*/  {
+  @#C1
+  final field core::int y = 2;
+  const constructor •() → self::C
+    : super self::A::•(100)
+    ;
+}
+static const field core::int var1 = #C2;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C2;
+static const field core::int var4 = #C2;
+static const field core::int var5 = #C3;
+static method fn() → core::int
+  return #C4.{self::A::y}{core::int};
+static method fn2() → core::int {
+  self::A x = #C4;
+  return x.{self::A::y}{core::int};
+}
+static method fn4() → core::int
+  return #C5.{self::A::y}{core::int};
+static method fn5() → core::int
+  return #C7.{self::C::y}{core::int};
+static method main() → void {
+  exp::Expect::equals(#C2, 1);
+  exp::Expect::equals(#C2, 1);
+  exp::Expect::equals(#C2, 1);
+  exp::Expect::equals(#C2, 1);
+  exp::Expect::equals(#C3, 2);
+}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = 1
+  #C3 = 2
+  #C4 = self::A {y:#C2}
+  #C5 = self::B {y:#C2}
+  #C6 = 100
+  #C7 = self::C {y:#C3, y:#C6}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_instance_fields.dart:
+- A. (from org-dartlang-testcase:///const_functions_instance_fields.dart:12:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_instance_fields.dart:27:9)
+- C. (from org-dartlang-testcase:///const_functions_instance_fields.dart:37:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_instance_methods.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_instance_methods.dart.weak.modular.expect
new file mode 100644
index 0000000..d74febc
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_instance_methods.dart.weak.modular.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+  @#C1
+  method toString() → core::String
+    return "B";
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  final field core::int y;
+  const constructor •(core::int y) → self::C
+    : self::C::y = y, super core::Object::•()
+    ;
+  method fn() → core::int {
+    if(this.{self::C::y}{core::int} =={core::num::==}{(core::Object) → core::bool} 1)
+      return 100;
+    return 200;
+  }
+}
+class D extends self::C /*hasConstConstructor*/  {
+  const constructor •(core::int y) → self::D
+    : super self::C::•(y)
+    ;
+  @#C1
+  method fn() → core::int
+    return 300;
+}
+class E extends self::C /*hasConstConstructor*/  {
+  const constructor •(core::int y) → self::E
+    : super self::C::•(y)
+    ;
+}
+class F<T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::F<self::F::T%, self::F::U%, self::F::V%>
+    : super core::Object::•()
+    ;
+  method fn(covariant-by-class self::F::U% x) → self::F::U%
+    return x;
+}
+class G<T extends core::Object? = dynamic> extends self::F<self::G::T%, core::String, core::num> /*hasConstConstructor*/  {
+  const constructor •() → self::G<self::G::T%>
+    : super self::F::•()
+    ;
+}
+static const field core::String var1 = #C2;
+static const field core::String toString1 = #C2;
+static const field core::String var2 = #C3;
+static const field core::String toString2 = #C3;
+static const field core::int var3 = #C4;
+static const field core::int var4 = #C5;
+static const field core::int fnVal1 = #C4;
+static const field core::int fnVal2 = #C5;
+static const field core::int var5 = #C6;
+static const field core::int fnVal3 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int fnVal4 = #C4;
+static const field core::String var7 = #C7;
+static const field core::String fnVal5 = #C7;
+static const field core::String var8 = #C7;
+static const field core::String fnVal6 = #C7;
+static method fn() → core::String
+  return #C8.{core::Object::toString}(){() → core::String};
+static method fn2() → core::String
+  return #C9.{self::B::toString}(){() → core::String};
+static method fn3() → core::int
+  return #C11.{self::C::fn}(){() → core::int};
+static method fn4() → core::int
+  return #C13.{self::C::fn}(){() → core::int};
+static method fn5() → core::int
+  return #C14.{self::D::fn}(){() → core::int};
+static method fn6() → core::int
+  return #C15.{self::C::fn}(){() → core::int};
+static method fn7() → core::String
+  return #C16.{self::F::fn}("string"){(core::String) → core::String};
+static method fn8() → core::String
+  return #C17.{self::F::fn}("string"){(core::String) → core::String};
+static method main() → void {
+  exp::Expect::equals(#C2, #C8.{core::Object::toString}(){() → core::String});
+  exp::Expect::equals(#C2, #C8.{core::Object::toString}(){() → core::String});
+  exp::Expect::equals(#C3, #C9.{self::B::toString}(){() → core::String});
+  exp::Expect::equals(#C3, #C9.{self::B::toString}(){() → core::String});
+  exp::Expect::equals(#C4, 200);
+  exp::Expect::equals(#C5, 100);
+  exp::Expect::equals(#C4, 200);
+  exp::Expect::equals(#C5, 100);
+  exp::Expect::equals(#C6, 300);
+  exp::Expect::equals(#C6, 300);
+  exp::Expect::equals(#C5, 100);
+  exp::Expect::equals(#C4, 200);
+  exp::Expect::equals(#C7, "string");
+  exp::Expect::equals(#C7, "string");
+  exp::Expect::equals(#C7, "string");
+  exp::Expect::equals(#C7, "string");
+}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = "Instance of 'A'"
+  #C3 = "B"
+  #C4 = 200
+  #C5 = 100
+  #C6 = 300
+  #C7 = "string"
+  #C8 = self::A {}
+  #C9 = self::B {}
+  #C10 = 0
+  #C11 = self::C {y:#C10}
+  #C12 = 1
+  #C13 = self::C {y:#C12}
+  #C14 = self::D {y:#C12}
+  #C15 = self::E {y:#C12}
+  #C16 = self::F<core::int*, core::String*, core::num*> {}
+  #C17 = self::G<core::int*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_functions_instance_methods.dart:
+- A. (from org-dartlang-testcase:///const_functions_instance_methods.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- B. (from org-dartlang-testcase:///const_functions_instance_methods.dart:14:9)
+- C. (from org-dartlang-testcase:///const_functions_instance_methods.dart:23:9)
+- D. (from org-dartlang-testcase:///const_functions_instance_methods.dart:32:9)
+- E. (from org-dartlang-testcase:///const_functions_instance_methods.dart:39:9)
+- F. (from org-dartlang-testcase:///const_functions_instance_methods.dart:43:9)
+- G. (from org-dartlang-testcase:///const_functions_instance_methods.dart:48:9)
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.modular.expect
new file mode 100644
index 0000000..bc35178
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list.dart.weak.modular.expect
@@ -0,0 +1,125 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstVar = #C1;
+static const field core::int firstCatchVar = #C2;
+static const field core::bool isEmptyVar = #C3;
+static const field core::bool isNotEmptyVar = #C4;
+static const field core::int lastVar = #C5;
+static const field core::int lastCatchVar = #C2;
+static const field core::int lengthVar = #C5;
+static const field core::int singleVar = #C1;
+static const field core::int singleCatchVar = #C2;
+static const field core::int singleCatchVar2 = #C2;
+static const field core::int getWithIndexVar = #C1;
+static const field core::int rangeErrorCatchVar = #C2;
+static const field core::List<core::int> mutableListVar = #C6;
+static const field core::List<core::int> mutableListAddVar = #C8;
+static method firstFn() → core::int {
+  return #C6.{core::Iterable::first}{core::int};
+}
+static method firstCatchFn() → core::int {
+  try {
+    core::int v = #C9.{core::Iterable::first}{core::int};
+  }
+  on core::StateError catch(no-exception-var) {
+    return 0;
+  }
+  return 1;
+}
+static method isEmptyFn() → core::bool {
+  return #C6.{core::Iterable::isEmpty}{core::bool};
+}
+static method isNotEmptyFn() → core::bool {
+  return #C6.{core::Iterable::isNotEmpty}{core::bool};
+}
+static method lastFn() → core::int {
+  return #C6.{core::Iterable::last}{core::int};
+}
+static method lastCatchFn() → core::int {
+  try {
+    core::int v = #C9.{core::Iterable::last}{core::int};
+  }
+  on core::StateError catch(no-exception-var) {
+    return 0;
+  }
+  return 1;
+}
+static method lengthFn() → core::int {
+  return #C6.{core::List::length}{core::int};
+}
+static method singleFn() → core::int {
+  return #C10.{core::Iterable::single}{core::int};
+}
+static method singleCatchFn() → core::int {
+  try {
+    core::int v = #C9.{core::Iterable::single}{core::int};
+  }
+  on core::StateError catch(no-exception-var) {
+    return 0;
+  }
+  return 1;
+}
+static method singleCatchFn2() → core::int {
+  try {
+    core::int v = #C6.{core::Iterable::single}{core::int};
+  }
+  on core::StateError catch(no-exception-var) {
+    return 0;
+  }
+  return 1;
+}
+static method getWithIndexFn() → core::int {
+  return #C10.{core::List::[]}(0){(core::int) → core::int};
+}
+static method rangeErrorCatchFn() → core::int {
+  try {
+    core::int v = #C10.{core::List::[]}(1){(core::int) → core::int};
+  }
+  on core::RangeError catch(no-exception-var) {
+    return 0;
+  }
+  return 1;
+}
+static method mutableList() → core::List<core::int> {
+  core::List<core::int> x = <core::int>[1, 2];
+  return x;
+}
+static method mutableListAdd() → core::List<core::int> {
+  core::List<core::int> x = <core::int>[1, 2];
+  x.{core::List::add}(3){(core::int) → void};
+  return x;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 1);
+  exp::Expect::equals(#C2, 0);
+  exp::Expect::equals(#C3, false);
+  exp::Expect::equals(#C4, true);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C2, 0);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C1, 1);
+  exp::Expect::equals(#C2, 0);
+  exp::Expect::equals(#C2, 0);
+  exp::Expect::equals(#C1, 1);
+  exp::Expect::equals(#C2, 0);
+  exp::Expect::equals(#C6, #C6);
+  exp::Expect::equals(#C8, #C8);
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 0
+  #C3 = false
+  #C4 = true
+  #C5 = 2
+  #C6 = <core::int*>[#C1, #C5]
+  #C7 = 3
+  #C8 = <core::int*>[#C1, #C5, #C7]
+  #C9 = <core::int*>[]
+  #C10 = <core::int*>[#C1]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.modular.expect
new file mode 100644
index 0000000..a7c5460
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_list_error.dart.weak.modular.expect
@@ -0,0 +1,126 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+//   return x.invalidProperty;
+//            ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:54:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   return x[0.1];
+//            ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:9:24: Error: Constant evaluation error:
+// const firstException = firstExceptionFn();
+//                        ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:12:12: Context: Unhandled core exception: Bad state: No element
+//   return x.first;
+//            ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:15:23: Error: Constant evaluation error:
+// const lastException = lastExceptionFn();
+//                       ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:18:12: Context: Unhandled core exception: Bad state: No element
+//   return x.last;
+//            ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:21:25: Error: Constant evaluation error:
+// const singleException = singleExceptionFn();
+//                         ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:24:12: Context: Unhandled core exception: Bad state: No element
+//   return x.single;
+//            ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:27:30: Error: Constant evaluation error:
+// const singleExceptionMulti = singleExceptionMultiFn();
+//                              ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:30:12: Context: Unhandled core exception: Bad state: Too many elements
+//   return x.single;
+//            ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:39:31: Error: Constant evaluation error:
+// const getWithIndexException = getWithIndexExceptionFn();
+//                               ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:42:11: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 1: 1
+//   return x[1];
+//           ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:45:32: Error: Constant evaluation error:
+// const getWithIndexException2 = getWithIndexExceptionFn2();
+//                                ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:48:11: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+//   return x[-1];
+//           ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:57:31: Error: Constant evaluation error:
+// const constListAddException = constListAddExceptionFn();
+//                               ^
+// pkg/front_end/testcases/const_functions/const_functions_list_error.dart:60:5: Context: Unhandled core exception: Unsupported operation: add
+//   x.add(3);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int firstException = invalid-expression "Unhandled core exception: Bad state: No element";
+static const field core::int lastException = invalid-expression "Unhandled core exception: Bad state: No element";
+static const field core::int singleException = invalid-expression "Unhandled core exception: Bad state: No element";
+static const field core::int singleExceptionMulti = invalid-expression "Unhandled core exception: Bad state: Too many elements";
+static const field core::int invalidProperty = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+  return x.invalidProperty;
+           ^^^^^^^^^^^^^^^";
+static const field core::int getWithIndexException = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 1: 1";
+static const field core::int getWithIndexException2 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field core::int getWithIndexException3 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:54:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  return x[0.1];
+           ^";
+static const field core::List<core::int> constListAddException = invalid-expression "Unhandled core exception: Unsupported operation: add";
+static method firstExceptionFn() → core::int {
+  return #C1.{core::Iterable::first}{core::int};
+}
+static method lastExceptionFn() → core::int {
+  return #C1.{core::Iterable::last}{core::int};
+}
+static method singleExceptionFn() → core::int {
+  return #C1.{core::Iterable::single}{core::int};
+}
+static method singleExceptionMultiFn() → core::int {
+  return #C4.{core::Iterable::single}{core::int};
+}
+static method invalidPropertyFn() → core::int {
+  return invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:36:12: Error: The getter 'invalidProperty' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'invalidProperty'.
+  return x.invalidProperty;
+           ^^^^^^^^^^^^^^^" in #C4{<unresolved>}.invalidProperty as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method getWithIndexExceptionFn() → core::int {
+  return #C5.{core::List::[]}(1){(core::int) → core::int};
+}
+static method getWithIndexExceptionFn2() → core::int {
+  return #C5.{core::List::[]}(1.{core::int::unary-}(){() → core::int}){(core::int) → core::int};
+}
+static method getWithIndexExceptionFn3() → core::int {
+  return #C5.{core::List::[]}(invalid-expression "pkg/front_end/testcases/const_functions/const_functions_list_error.dart:54:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  return x[0.1];
+           ^" in 0.1 as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::int};
+}
+static method constListAddExceptionFn() → core::List<core::int> {
+  #C4.{core::List::add}(3){(core::int) → void};
+  return #C4;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = <core::int*>[]
+  #C2 = 1
+  #C3 = 2
+  #C4 = <core::int*>[#C2, #C3]
+  #C5 = <core::int*>[#C2]
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_local_functions.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_local_functions.dart.weak.modular.expect
new file mode 100644
index 0000000..4c5f0e1
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_local_functions.dart.weak.modular.expect
@@ -0,0 +1,71 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int constTwo = #C1;
+static method function1() → core::int {
+  function add(core::int a, core::int b) → core::int
+    return a.{core::num::+}(b){(core::num) → core::int};
+  return #C2;
+}
+static method function2() → core::int {
+  function addTwo(core::int a) → core::int {
+    core::int b = a.{core::num::+}(#C1){(core::num) → core::int};
+    return b;
+  }
+  return #C3;
+}
+static method function3() → core::int {
+  function addTwoReturn(core::int a) → core::int
+    return a.{core::num::+}(#C1){(core::num) → core::int};
+  return #C4;
+}
+static method function4() → core::int {
+  function addTwo(core::int a) → core::int
+    return a.{core::num::+}(#C1){(core::num) → core::int};
+  return #C5;
+}
+static method function5() → core::int {
+  function typeFn<T extends core::Object? = dynamic>(T% a) → T%
+    return a;
+  return #C6;
+}
+static method function6() → core::int {
+  function optionalFn([core::int a = #C7]) → core::int
+    return a;
+  return #C8;
+}
+static method function7() → core::int {
+  function namedFn({core::int a = #C7}) → core::int
+    return a;
+  return #C1;
+}
+static method function8() → core::int {
+  function add(core::int a, core::int b) → core::int
+    return a.{core::num::+}(b){(core::num) → core::int};
+  return #C1.{core::num::+}(#C4){(core::num) → core::int};
+}
+static method main() → void {
+  exp::Expect::equals(self::function1(), 12);
+  exp::Expect::equals(self::function2(), 4);
+  exp::Expect::equals(self::function3(), 5);
+  exp::Expect::equals(self::function4(), 22);
+  exp::Expect::equals(self::function5(), 3);
+  exp::Expect::equals(self::function6(), 1);
+  exp::Expect::equals(self::function7(), 2);
+  exp::Expect::equals(self::function8(), 7);
+}
+
+constants  {
+  #C1 = 2
+  #C2 = 12
+  #C3 = 4
+  #C4 = 5
+  #C5 = 22
+  #C6 = 3
+  #C7 = 0
+  #C8 = 1
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.modular.expect
new file mode 100644
index 0000000..7f69cd7
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_map.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::Object? var1 = #C1;
+static const field core::Object? var2 = #C2;
+static const field core::Object? var3 = #C3;
+static const field core::Map<core::String, core::int> map = #C9;
+static const field core::Object? var4 = #C2;
+static const field core::Object? var5 = #C6;
+static const field core::Object? var6 = #C8;
+static const field core::int? var7 = #C2;
+static method fn(core::Map<core::Object, core::Object> map, core::Object key) → core::Object? {
+  return map.{core::Map::[]}(key){(core::Object?) → core::Object?};
+}
+static method fn2() → core::int? {
+  return #C11.{core::Map::[]}("key"){(core::Object?) → core::int?};
+}
+static method main() → void {
+  exp::Expect::equals(#C1, "val");
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C3, null);
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C6, 3);
+  exp::Expect::equals(#C8, 4);
+  exp::Expect::equals(#C2, 2);
+}
+
+constants  {
+  #C1 = "val"
+  #C2 = 2
+  #C3 = null
+  #C4 = "key1"
+  #C5 = "key2"
+  #C6 = 3
+  #C7 = "key3"
+  #C8 = 4
+  #C9 = <core::String*, core::int*>{#C4:#C2, #C5:#C6, #C7:#C8)
+  #C10 = "key"
+  #C11 = <core::String*, core::int*>{#C10:#C2)
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_recursion.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_recursion.dart.weak.modular.expect
new file mode 100644
index 0000000..1ee9329
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_recursion.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int b = #C1;
+static method fn(core::int a) → core::int {
+  if(a =={core::num::==}{(core::Object) → core::bool} 1)
+    return 1;
+  return a.{core::num::*}(self::fn(a.{core::num::-}(1){(core::num) → core::int})){(core::num) → core::int};
+}
+static method localTest() → core::int {
+  function fnLocal(core::int a) → core::int {
+    if(a =={core::num::==}{(core::Object) → core::bool} 1)
+      return 1;
+    return a.{core::num::*}(fnLocal(a.{core::num::-}(1){(core::num) → core::int}){(core::int) → core::int}){(core::num) → core::int};
+  }
+  return #C1;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 24);
+  exp::Expect::equals(self::localTest(), 24);
+}
+
+constants  {
+  #C1 = 24
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_return.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_return.dart.weak.modular.expect
new file mode 100644
index 0000000..de04a6c
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_return.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field void var1 = #C1;
+static const field void var2 = #C1;
+static const field core::int? var3 = #C1;
+static const field core::int? var4 = #C1;
+static const field core::int var5 = #C2;
+static method fn() → void {}
+static method fn2() → void {
+  return;
+}
+static method fn3() → core::int?
+  return null;
+static method fn4() → core::int? {
+  return null;
+}
+static method fn5() → core::int {
+  try {
+    return throw 1;
+  }
+  on core::int catch(no-exception-var) {
+    return 2;
+  }
+}
+static method main() → void {
+  exp::Expect::equals(#C1 as{ForNonNullableByDefault} dynamic, null);
+  exp::Expect::equals(#C1 as{ForNonNullableByDefault} dynamic, null);
+  exp::Expect::equals(#C1, null);
+  exp::Expect::equals(#C1, null);
+  exp::Expect::equals(#C2, 2);
+}
+
+constants  {
+  #C1 = null
+  #C2 = 2
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_simple_invocations.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_simple_invocations.dart.weak.modular.expect
new file mode 100644
index 0000000..04bf4ef
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_simple_invocations.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int binary = #C1;
+static const field core::int optional = #C2;
+static const field core::int optional1 = #C3;
+static const field core::int named = #C4;
+static const field core::int named1 = #C5;
+static const field core::int type = #C6;
+static const field core::String str = #C7;
+static const field core::bool eq = #C8;
+static const field core::int negative = #C9;
+static const field core::bool boolean = #C8;
+static const field core::double doubleResult = #C10;
+static const field core::int multi = #C2;
+static const field core::int multi2 = #C3;
+static method binaryFn(core::int a, core::int b) → core::int
+  return a.{core::num::-}(b){(core::num) → core::int};
+static method optionalFn(core::int c, [core::int d = #C11]) → core::int
+  return c.{core::num::+}(d){(core::num) → core::int};
+static method namedFn(core::int e, {core::int f = #C3}) → core::int
+  return e.{core::num::+}(f){(core::num) → core::int};
+static method typeFn<T extends core::Object? = dynamic>(self::typeFn::T% x) → self::typeFn::T%
+  return x;
+static method stringFn(core::String s) → core::String
+  return s.{core::String::+}("ing"){(core::String) → core::String};
+static method equalFn(core::int a, core::int b) → core::bool
+  return a =={core::num::==}{(core::Object) → core::bool} b;
+static method unary(core::int a) → core::int
+  return a.{core::int::unary-}(){() → core::int};
+static method boolFn(core::bool a, core::bool b) → core::bool
+  return a || b;
+static method doubleFn(core::double a, core::double b) → core::double
+  return a.{core::double::*}(b){(core::num) → core::double};
+static method multiFn(core::int a) → core::int
+  return a.{core::num::+}(1){(core::num) → core::int};
+static method main() → void {
+  exp::Expect::equals(#C1, 1);
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C3, 3);
+  exp::Expect::equals(#C4, 4);
+  exp::Expect::equals(#C5, 5);
+  exp::Expect::equals(#C6, 6);
+  exp::Expect::equals(#C7, "string");
+  exp::Expect::equals(#C8, true);
+  exp::Expect::equals(#C9, 2.{core::int::unary-}(){() → core::int});
+  exp::Expect::equals(#C8, true);
+  exp::Expect::equals(#C10, 4.4);
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C3, 3);
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 3
+  #C4 = 4
+  #C5 = 5
+  #C6 = 6
+  #C7 = "string"
+  #C8 = true
+  #C9 = -2
+  #C10 = 4.4
+  #C11 = 0
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.modular.expect
new file mode 100644
index 0000000..21293b7
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = #C2;
+static const field dynamic var2 = #C3;
+static const field core::String var3 = #C3;
+static const field dynamic var4 = #C4;
+static method fn() → dynamic {
+  core::String local = "str";
+  return local.{core::String::[]}(0){(core::int) → core::String};
+}
+static method fn2() → dynamic {
+  try {
+    core::String x = #C1.{core::String::[]}(1.{core::int::unary-}(){() → core::int}){(core::int) → core::String};
+  }
+  on core::RangeError catch(no-exception-var) {
+    return 2;
+  }
+}
+static method main() → void {
+  exp::Expect::equals(#C2, "r");
+  exp::Expect::equals(#C3, "s");
+  exp::Expect::equals(#C3, "s");
+  exp::Expect::equals(#C4, 2);
+}
+
+constants  {
+  #C1 = "str"
+  #C2 = "r"
+  #C3 = "s"
+  #C4 = 2
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.modular.expect
new file mode 100644
index 0000000..eeab2cc
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_string_error.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   return str[1.1];
+//              ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Error: Constant evaluation error:
+// const var1 = str[-1];
+//                 ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:10:17: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+// const var1 = str[-1];
+//                 ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Error: Constant evaluation error:
+// const var2 = str[3];
+//                 ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:11:17: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+// const var2 = str[3];
+//                 ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:13:14: Error: Constant evaluation error:
+// const var3 = fn();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:16:13: Context: Unhandled core exception: RangeError: Index out of range: index must not be negative: -1
+//   return str[-1];
+//             ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:19:14: Error: Constant evaluation error:
+// const var4 = fn2();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_string_error.dart:22:13: Context: Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3
+//   return str[3];
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::String str = #C1;
+static const field core::String var1 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field core::String var2 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var3 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index must not be negative: -1";
+static const field dynamic var4 = invalid-expression "Unhandled core exception: RangeError: Index out of range: index should be less than 3: 3";
+static const field dynamic var5 = invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  return str[1.1];
+             ^";
+static method fn() → dynamic {
+  core::String s = "str";
+  return #C1.{core::String::[]}(1.{core::int::unary-}(){() → core::int}){(core::int) → core::String};
+}
+static method fn2() → dynamic {
+  core::String s = "str";
+  return #C1.{core::String::[]}(3){(core::int) → core::String};
+}
+static method fn3() → dynamic {
+  core::String s = "str";
+  return #C1.{core::String::[]}(invalid-expression "pkg/front_end/testcases/const_functions/const_functions_string_error.dart:28:14: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  return str[1.1];
+             ^" in 1.1 as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::String};
+}
+static method main() → void {}
+
+constants  {
+  #C1 = "str"
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.weak.modular.expect
new file mode 100644
index 0000000..b3f761c
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_switch_statements.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C1;
+static const field core::int var4 = #C1;
+static const field core::int var5 = #C3;
+static const field core::int var6 = #C4;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C6;
+static const field core::int var9 = #C3;
+static method basicSwitch(core::int x) → core::int {
+  #L1:
+  switch(x) {
+    #L2:
+    case #C7:
+      {
+        return 100;
+      }
+    #L3:
+    default:
+      {
+        x = x.{core::num::+}(1){(core::num) → core::int};
+        break #L1;
+      }
+  }
+  return x;
+}
+static method multipleCaseSwitch(core::int x) → core::int {
+  #L4:
+  switch(x) {
+    #L5:
+    case #C7:
+    case #C8:
+      {
+        return 100;
+      }
+    #L6:
+    default:
+      {
+        break #L4;
+      }
+  }
+  return 0;
+}
+static method continueLabelSwitch(core::int x) → core::int {
+  switch(x) {
+    #L7:
+    case #C7:
+      {
+        x = x.{core::num::+}(100){(core::num) → core::int};
+        continue #L8;
+      }
+    #L9:
+    case #C8:
+      {
+        continue #L7;
+      }
+    #L8:
+    case #C2:
+      {
+        return x.{core::num::+}(3){(core::num) → core::int};
+      }
+  }
+  return 0;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C2, 3);
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C1, 100);
+  exp::Expect::equals(#C3, 0);
+  exp::Expect::equals(#C4, 104);
+  exp::Expect::equals(#C5, 105);
+  exp::Expect::equals(#C6, 6);
+  exp::Expect::equals(#C3, 0);
+}
+
+constants  {
+  #C1 = 100
+  #C2 = 3
+  #C3 = 0
+  #C4 = 104
+  #C5 = 105
+  #C6 = 6
+  #C7 = 1
+  #C8 = 2
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_try_catch_finally.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_try_catch_finally.dart.weak.modular.expect
new file mode 100644
index 0000000..f816401
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_try_catch_finally.dart.weak.modular.expect
@@ -0,0 +1,137 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C3;
+static const field core::int var4 = #C2;
+static const field core::int var5 = #C4;
+static const field core::int var6 = #C4;
+static const field core::int var7 = #C4;
+static const field core::int var8 = #C4;
+static const field core::int var9 = #C4;
+static const field core::int var10 = #C1;
+static const field core::int var11 = #C1;
+static const field core::String var12 = #C5;
+static const field core::int var13 = #C2;
+static method fn(dynamic error) → core::int {
+  try {
+    throw error;
+  }
+  on core::String catch(no-exception-var) {
+    return 0;
+  }
+  on core::Object catch(final core::Object e) {
+    return 1;
+  }
+}
+static method fn1(dynamic error) → core::int {
+  try {
+    throw error;
+  }
+  on core::int catch(final core::int e) {
+    return e;
+  }
+  on core::Object catch(final core::Object e) {
+    return 1;
+  }
+}
+static method finallyReturn(dynamic error) → core::int {
+  try
+    try {
+      if(!(error =={core::Object::==}{(core::Object) → core::bool} 1))
+        throw error;
+    }
+    on core::int catch(final core::int e) {
+      return e;
+    }
+    on core::Object catch(final core::Object e) {
+      return 1;
+    }
+  finally {
+    return 100;
+  }
+}
+static method finallyReturn1(core::int x) → core::int {
+  try {
+    if(x =={core::num::==}{(core::Object) → core::bool} 1) {
+      throw x;
+    }
+    else {
+      return 0;
+    }
+  }
+  finally {
+    return 100;
+  }
+}
+static method finallyMutate() → core::int {
+  core::int x = 0;
+  try {
+    return x;
+  }
+  finally {
+    x = x.{core::num::+}(1){(core::num) → core::int};
+  }
+}
+static method subtypeFn() → core::int {
+  try {
+    throw 2.5;
+  }
+  on core::num catch(final core::num e) {
+    return 0;
+  }
+}
+static method orderFn() → core::String {
+  core::String x = "st";
+  try
+    try {
+      x = x.{core::String::+}("ri"){(core::String) → core::String};
+      throw 2;
+    }
+    on core::Object catch(final core::Object e) {
+      x = x.{core::String::+}("n"){(core::String) → core::String};
+    }
+  finally {
+    return x.{core::String::+}("g"){(core::String) → core::String};
+  }
+}
+static method notThrowStatement() → core::int {
+  core::int count = 0;
+  try {
+    for (core::int i = 0; i.{core::num::<}(1){(core::num) → core::bool}; throw "a") {
+      count = count.{core::num::+}(i){(core::num) → core::int};
+    }
+  }
+  on core::Object catch(final core::Object e) {
+    return 1;
+  }
+  return 0;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 0);
+  exp::Expect::equals(#C2, 1);
+  exp::Expect::equals(#C3, 10);
+  exp::Expect::equals(#C2, 1);
+  exp::Expect::equals(#C4, 100);
+  exp::Expect::equals(#C4, 100);
+  exp::Expect::equals(#C4, 100);
+  exp::Expect::equals(#C4, 100);
+  exp::Expect::equals(#C4, 100);
+  exp::Expect::equals(#C1, 0);
+  exp::Expect::equals(#C1, 0);
+  exp::Expect::equals(#C5, "string");
+  exp::Expect::equals(#C2, 1);
+}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+  #C3 = 10
+  #C4 = 100
+  #C5 = "string"
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart.weak.modular.expect
new file mode 100644
index 0000000..233c4ee
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart.weak.modular.expect
@@ -0,0 +1,78 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:9:14: Error: Constant evaluation error:
+// const var1 = finallyThrow(0);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:19:5: Context: Unhandled exception: 2
+//     throw 2;
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:10:14: Error: Constant evaluation error:
+// const var2 = finallyThrow(1);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:19:5: Context: Unhandled exception: 2
+//     throw 2;
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:23:14: Error: Constant evaluation error:
+// const var3 = unhandledThrow(0);
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:27:5: Context: Unhandled exception: 0
+//     throw x;
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:24:14: Error: Constant evaluation error:
+// const var4 = unhandledThrow("string");
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:29:5: Context: Unhandled exception: "string"
+//     throw e;
+//     ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:33:14: Error: Constant evaluation error:
+// const var5 = unhandledThrow2();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_try_catch_finally_error.dart:36:26: Context: Unhandled exception: "a"
+//   for (int i = 0; i < 1; throw 'a') {
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = invalid-expression "Unhandled exception: 2";
+static const field core::int var2 = invalid-expression "Unhandled exception: 2";
+static const field core::int var3 = invalid-expression "Unhandled exception: 0";
+static const field core::int var4 = invalid-expression "Unhandled exception: \"string\"";
+static const field core::int var5 = invalid-expression "Unhandled exception: \"a\"";
+static method finallyThrow(core::int x) → core::int {
+  try {
+    if(x =={core::num::==}{(core::Object) → core::bool} 1) {
+      throw x;
+    }
+    else {
+      return 0;
+    }
+  }
+  finally {
+    throw 2;
+  }
+}
+static method unhandledThrow(dynamic x) → core::int {
+  try {
+    throw x;
+  }
+  on core::String catch(final core::String e) {
+    throw e;
+  }
+}
+static method unhandledThrow2() → core::int {
+  core::int count = 0;
+  for (core::int i = 0; i.{core::num::<}(1){(core::num) → core::bool}; throw "a") {
+    count = count.{core::num::+}(i){(core::num) → core::int};
+  }
+  return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_assignments.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_assignments.dart.weak.modular.expect
new file mode 100644
index 0000000..704d914
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_assignments.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var3 = #C2;
+static const field core::int var4 = #C1;
+static method varAssignmentTest(core::int a) → core::int {
+  core::int x = 4;
+  {
+    x = 3;
+  }
+  return x;
+}
+static method function() → core::int {
+  function varAssignmentTest2() → core::int {
+    core::int x = 2;
+    x = x.{core::num::+}(1){(core::num) → core::int};
+    return x;
+  }
+  return #C1;
+}
+static method varAssignmentTest3(core::int a) → core::int {
+  core::int x = 4;
+  x = a.{core::num::+}(1){(core::num) → core::int};
+  return x;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 3);
+  exp::Expect::equals(self::function(), 3);
+  exp::Expect::equals(#C2, 2);
+  exp::Expect::equals(#C1, 3);
+}
+
+constants  {
+  #C1 = 3
+  #C2 = 2
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.modular.expect
new file mode 100644
index 0000000..c8a68f5
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations.dart.weak.modular.expect
@@ -0,0 +1,81 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var1_1 = #C2;
+static const field core::String var2 = #C3;
+static const field core::int var3 = #C4;
+static const field core::int var4 = #C5;
+static const field core::int var5 = #C6;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C5;
+static const field core::int var8 = #C5;
+static const field core::int? var9 = #C7;
+static method function1(core::int a, core::int b) → core::int {
+  core::int x = 1.{core::num::+}(a){(core::num) → core::int}.{core::num::+}(b){(core::num) → core::int};
+  return x;
+}
+static method function2() → core::String {
+  dynamic x = "string";
+  return x as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+static method function3() → core::int {
+  core::int first = 2;
+  core::int second = 2.{core::num::+}(first){(core::num) → core::int};
+  return 2.{core::num::+}(second){(core::num) → core::int};
+}
+static method function4() → core::int {
+  core::int first = 2;
+  core::int second = 0;
+  return first.{core::num::+}(second){(core::num) → core::int};
+}
+static method function5() → core::int {
+  return #C6;
+}
+static method function6() → core::int {
+  dynamic a;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function7() → core::int {
+  dynamic a;
+  dynamic b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function8() → core::int {
+  dynamic a;
+  core::int? b;
+  a = 2;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method function9() → core::int? {
+  core::int? x;
+  return x;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 4);
+  exp::Expect::equals(#C2, 5);
+  exp::Expect::equals(#C3, "string");
+  exp::Expect::equals(#C4, 6);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C6, 2.{core::int::unary-}(){() → core::int});
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C7, null);
+}
+
+constants  {
+  #C1 = 4
+  #C2 = 5
+  #C3 = "string"
+  #C4 = 6
+  #C5 = 2
+  #C6 = -2
+  #C7 = null
+}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart.weak.modular.expect
new file mode 100644
index 0000000..9d6fa65
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart:9:14: Error: Constant evaluation error:
+// const var1 = fn1();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart:10:8: Context: Expected constant 'null' to be of type 'int', but was of type 'Null'.
+// int fn1() {
+//        ^
+// pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart:9:7: Context: While analyzing:
+// const var1 = fn1();
+//       ^
+//
+// pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart:15:14: Error: Constant evaluation error:
+// const var2 = fn2();
+//              ^
+// pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart:19:10: Context: Expected constant '"string"' to be of type 'int', but was of type 'String'.
+//   return x;
+//          ^
+// pkg/front_end/testcases/const_functions/const_functions_variable_declarations_error.dart:15:7: Context: While analyzing:
+// const var2 = fn2();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = invalid-expression "Expected constant 'null' to be of type 'int', but was of type 'Null'.";
+static const field core::int var2 = invalid-expression "Expected constant '\"string\"' to be of type 'int', but was of type 'String'.";
+static method fn1() → core::int {
+  dynamic a;
+  return a as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method fn2() → core::int {
+  dynamic x;
+  x = "string";
+  return x as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/const_functions/const_functions_while_statements.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/const_functions_while_statements.dart.weak.modular.expect
new file mode 100644
index 0000000..b96eb2b
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/const_functions_while_statements.dart.weak.modular.expect
@@ -0,0 +1,100 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static const field core::int var1 = #C1;
+static const field core::int var2 = #C2;
+static const field core::int var3 = #C3;
+static const field core::int var4 = #C4;
+static const field core::int var5 = #C1;
+static const field core::int var6 = #C5;
+static const field core::int var7 = #C2;
+static const field core::int var8 = #C6;
+static const field core::int var9 = #C7;
+static method fn(core::int a) → core::int {
+  core::int b = a;
+  core::int i = 0;
+  while (i.{core::num::<}(2){(core::num) → core::bool}) {
+    b = b.{core::num::+}(a){(core::num) → core::int};
+    i = i.{core::num::+}(1){(core::num) → core::int};
+  }
+  return b;
+}
+static method fn1(core::int a) → core::int {
+  core::int b = a;
+  while (true) {
+    b = b.{core::num::*}(3){(core::num) → core::int};
+    if(b.{core::num::>}(10){(core::num) → core::bool})
+      return b;
+  }
+}
+static method fnContinue() → core::int {
+  core::int a = 0;
+  core::int i = 0;
+  while (i.{core::num::<}(5){(core::num) → core::bool})
+    #L1:
+    {
+      if(i.{core::num::%}(2){(core::num) → core::int} =={core::num::==}{(core::Object) → core::bool} 1) {
+        i = i.{core::num::+}(1){(core::num) → core::int};
+        break #L1;
+      }
+      a = a.{core::num::+}(i){(core::num) → core::int};
+      i = i.{core::num::+}(1){(core::num) → core::int};
+    }
+  return a;
+}
+static method fnBreak(core::int a) → core::int {
+  core::int b = a;
+  core::int i = 0;
+  #L2:
+  while (i.{core::num::<}(2){(core::num) → core::bool}) {
+    if(b =={core::num::==}{(core::Object) → core::bool} 2)
+      break #L2;
+    b = b.{core::num::+}(a){(core::num) → core::int};
+    i = i.{core::num::+}(1){(core::num) → core::int};
+  }
+  return b;
+}
+static method fnNestedWhile() → core::int {
+  core::int a = 0;
+  while (true) {
+    #L3:
+    while (true) {
+      break #L3;
+    }
+    return 1;
+  }
+}
+static method fnBreakLabel() → core::int {
+  #L4:
+  while (true) {
+    while (true) {
+      break #L4;
+    }
+  }
+  return 3;
+}
+static method main() → void {
+  exp::Expect::equals(#C1, 6);
+  exp::Expect::equals(#C2, 9);
+  exp::Expect::equals(#C3, 18);
+  exp::Expect::equals(#C4, 27);
+  exp::Expect::equals(#C1, 6);
+  exp::Expect::equals(#C5, 2);
+  exp::Expect::equals(#C2, 9);
+  exp::Expect::equals(#C6, 1);
+  exp::Expect::equals(#C7, 3);
+}
+
+constants  {
+  #C1 = 6
+  #C2 = 9
+  #C3 = 18
+  #C4 = 27
+  #C5 = 2
+  #C6 = 1
+  #C7 = 3
+}
diff --git a/pkg/front_end/testcases/const_functions/non_function_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/const_functions/non_function_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..a98efbd
--- /dev/null
+++ b/pkg/front_end/testcases/const_functions/non_function_invocation.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/const_functions/non_function_invocation.dart:6:20: Error: Constant evaluation error:
+// const dynamic b = a();
+//                    ^
+// pkg/front_end/testcases/const_functions/non_function_invocation.dart:6:20: Context: Null value during constant evaluation.
+// const dynamic b = a();
+//                    ^
+// pkg/front_end/testcases/const_functions/non_function_invocation.dart:6:15: Context: While analyzing:
+// const dynamic b = a();
+//               ^
+//
+import self as self;
+
+static const field dynamic a = #C1;
+static const field dynamic b = invalid-expression "Null value during constant evaluation.";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..98579c4
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart:14:17: Error: Constructors on abstract classes can't be torn off.
+//   AbstractClass.new; // error
+//                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart:15:9: Error: Member not found: 'new'.
+//   Mixin.new; // error
+//         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart:17:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new; // error
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart:18:13: Error: Member not found: 'new'.
+//   Extension.new; // error
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class ConcreteClass extends core::Object {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractClass extends core::Object {
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication = core::Object with self::Mixin /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::NamedMixinApplication
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractNamedMixinApplication = core::Object with self::Mixin /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::AbstractNamedMixinApplication
+    : super core::Object::•()
+    ;
+}
+extension Extension on core::int {
+}
+static method test() → dynamic {
+  #C1;
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart:14:17: Error: Constructors on abstract classes can't be torn off.
+  AbstractClass.new; // error
+                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart:15:9: Error: Member not found: 'new'.
+  Mixin.new; // error
+        ^^^";
+  #C2;
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart:17:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new; // error
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/abstract_class_constructor_tear_off.dart:18:13: Error: Member not found: 'new'.
+  Extension.new; // error
+            ^^^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::ConcreteClass::•
+  #C2 = constructor-tearoff self::NamedMixinApplication::•
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..0494323
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart:11:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'C'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// var test3 = (() => C<Object>)();
+//                    ^
+// pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class C<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart:7:11: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'C'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// test() => C<Object>;
+//           ^
+// pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class C<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart:9:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'C'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// test2([Type t = C<Object>]) {}
+//                 ^
+// pkg/front_end/testcases/constructor_tearoffs/bound_checks_in_type_literals.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class C<T extends num> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+}
+static field core::Type test3 = (() → core::Type => #C1)(){() → core::Type};
+static method test() → dynamic
+  return #C1;
+static method test2([core::Type t = #C1]) → dynamic {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::C<core::Object*>*)
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/call_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/call_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..6e425f6
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/call_instantiation.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/call_instantiation.dart:11:31: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+//  - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+//   int Function(int) g = f.call<int>;
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field <T extends core::Object? = dynamic>(T%) → T% funcValue = #C1;
+static field (core::int) → core::int f = self::funcValue.call<core::int>;
+static field (core::int) → core::int g = self::funcValue.call<core::int>;
+static method func<T extends core::Object? = dynamic>(self::func::T% value) → self::func::T%
+  return value;
+static method test(core::Function f) → dynamic {
+  (core::int) → core::int g = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/call_instantiation.dart:11:31: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+  int Function(int) g = f.call<int>;
+                              ^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::func
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..bb11cff
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.modular.expect
@@ -0,0 +1,319 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+//  - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   c2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+//   i<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+//   t1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+//   t2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+//   s<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
+// Try changing the operand or remove the type arguments.
+//   f1<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+//   n<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+//   d<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+//   a<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+//   b<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+//   c<int>; // error
+//    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   f2<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+//  - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+//   f3<int>; // error
+//     ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// var topLevel3 = c2<int>; // error
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+//  - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// var topLevel4 = c3<int>; // error
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+// var topLevel5 = i2<int>; // error
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
+// Try changing the operand or remove the type arguments.
+// var topLevel6 = f1<int>; // error
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+// var topLevel7 = n<int>; // error
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+// var topLevel8 = d<int>; // error
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+// var topLevel9 = a<int>; // error
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+// var topLevel10 = b<int>; // error
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+// var topLevel11 = c<int>; // error
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// var topLevel12 = f2<int>; // error
+//                    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+//  - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+// var topLevel13 = f3<int>; // error
+//                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+  synthetic constructor •() → self::GetterCall
+    : super core::Object::•()
+    ;
+  get call() → <T extends core::Object? = dynamic>() → void
+    return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+  get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+  set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+  method call = self::Ambiguous1|call;
+  tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+  method call = self::Ambiguous2|call;
+  tearoff call = self::Ambiguous2|get#call;
+}
+static field self::Class c1 = new self::Class::•();
+static field self::Class? c2;
+static field self::GetterCall c3 = new self::GetterCall::•();
+static field core::int i1 = 0;
+static field core::int? i2 = null;
+static field <T extends core::Object? = dynamic>() →? void f1 = null;
+static field Never n = throw "";
+static field dynamic d = null;
+static field core::String a = "";
+static field core::double b = 0.5;
+static field core::bool c = true;
+static field FutureOr<self::Class>f2 = new self::Class::•();
+static field core::Function f3 = () → Null {};
+static field () → dynamic topLevel1 = self::c1.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+static field () → dynamic topLevel2 = self::Extension|get#call(self::i1)<core::int>;
+static field invalid-type topLevel3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:61:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+var topLevel3 = c2<int>; // error
+                  ^";
+static field invalid-type topLevel4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:62:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+var topLevel4 = c3<int>; // error
+                  ^";
+static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:63:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+var topLevel5 = i2<int>; // error
+                  ^";
+static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:64:19: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
+Try changing the operand or remove the type arguments.
+var topLevel6 = f1<int>; // error
+                  ^";
+static field invalid-type topLevel7 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:65:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+var topLevel7 = n<int>; // error
+                 ^";
+static field invalid-type topLevel8 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:66:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+var topLevel8 = d<int>; // error
+                 ^";
+static field invalid-type topLevel9 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:67:18: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+var topLevel9 = a<int>; // error
+                 ^";
+static field invalid-type topLevel10 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:68:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+var topLevel10 = b<int>; // error
+                  ^";
+static field invalid-type topLevel11 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:69:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+var topLevel11 = c<int>; // error
+                  ^";
+static field invalid-type topLevel12 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:70:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+var topLevel12 = f2<int>; // error
+                   ^";
+static field invalid-type topLevel13 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:71:20: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+var topLevel13 = f3<int>; // error
+                   ^";
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+  c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(i)<core::int>;
+  t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+  self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  c2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+  i<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+  t1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+  t2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+  s<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:35:5: Error: The static type of the explicit instantiation operand must be a non-null generic function type but is 'void Function<T>()?'.
+Try changing the operand or remove the type arguments.
+  f1<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+  n<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+  d<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+  a<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+  b<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+  c<int>; // error
+   ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  f2<int>; // error
+    ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+  f3<int>; // error
+    ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+  self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..fc95e6e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/const_tear_off.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef B<T extends core::Object? = dynamic> = self::A<T%>;
+typedef C<unrelated T extends core::Object? = dynamic> = self::A<core::int>;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
+    return new self::A::•<self::A::fact::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
+    return new self::A::•<self::A::redirect::T%>();
+}
+static const field <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+static const field () → self::A<core::int> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+static const field () → self::A<core::int> d = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+static const field () → self::A<core::int> f = #C7;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+static const field () → self::A<core::int> h = #C3;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+static const field () → self::A<core::int> j = #C5;
+static const field <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+static const field () → self::A<core::int> l = #C7;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+static const field () → self::A<core::int> n = #C3;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+static const field () → self::A<core::int> p = #C5;
+static const field <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+static const field () → self::A<core::int> r = #C7;
+static method test() → dynamic {
+  <T extends core::Object? = dynamic>() → self::A<T%> a = #C2;
+  () → self::A<core::int> b = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> c = #C4;
+  () → self::A<core::int> d = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> e = #C6;
+  () → self::A<core::int> f = #C7;
+  <T extends core::Object? = dynamic>() → self::A<T%> g = #C2;
+  () → self::A<core::int> h = #C3;
+  <T extends core::Object? = dynamic>() → self::A<T%> i = #C4;
+  () → self::A<core::int> j = #C5;
+  <T extends core::Object? = dynamic>() → self::A<T%> k = #C6;
+  () → self::A<core::int> l = #C7;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> m = #C8;
+  () → self::A<core::int> n = #C3;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> o = #C9;
+  () → self::A<core::int> p = #C5;
+  <unrelated T extends core::Object? = dynamic>() → self::A<core::int> q = #C10;
+  () → self::A<core::int> r = #C7;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = constructor-tearoff self::A::•
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = constructor-tearoff self::A::fact
+  #C5 = instantiation #C4 <core::int*>
+  #C6 = redirecting-factory-tearoff self::A::redirect
+  #C7 = instantiation #C6 <core::int*>
+  #C8 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C2<core::int>)
+  #C9 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C4<core::int>)
+  #C10 = typedef-tearoff <unrelated T extends core::Object? = dynamic>.(#C6<core::int>)
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..25718f4
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart.weak.modular.expect
@@ -0,0 +1,321 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:13:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>;
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:13:18: Error: Expected '[' before this.
+//   Class<int><int>;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:14:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>();
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:14:20: Error: Unexpected token ';'.
+//   Class<int><int>();
+//                    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:14:20: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   Class<int><int>();
+//                    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:14:20: Error: Expected ';' after this.
+//   Class<int><int>();
+//                    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:18:14: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   Class<int>.named<int>();
+//              ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:19:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named;
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:19:18: Error: Expected '[' before this.
+//   Class<int><int>.named;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:20:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named();
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:20:18: Error: Expected '[' before this.
+//   Class<int><int>.named();
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:21:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int>;
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:21:18: Error: Expected '[' before this.
+//   Class<int><int>.named<int>;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:22:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int>();
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:22:18: Error: Expected '[' before this.
+//   Class<int><int>.named<int>();
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>;
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:18: Error: Expected '[' before this.
+//   Class<int><int>.named<int><int>;
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:24: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>;
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:28: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>;
+//                            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:34: Error: Expected '[' before this.
+//   Class<int><int>.named<int><int>;
+//                                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>();
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:18: Error: Expected '[' before this.
+//   Class<int><int>.named<int><int>();
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:24: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>();
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:28: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>();
+//                            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:36: Error: Unexpected token ';'.
+//   Class<int><int>.named<int><int>();
+//                                    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:36: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   Class<int><int>.named<int><int>();
+//                                    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:36: Error: Expected ';' after this.
+//   Class<int><int>.named<int><int>();
+//                                    ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:13:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>;
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:14:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>();
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:17:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class<int> Function()'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+//   Class<int>.named<int>;
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:19:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named;
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:19:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+//   Class<int><int>.named;
+//                   ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:20:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named();
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:20:19: Error: The method 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'named'.
+//   Class<int><int>.named();
+//                   ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:21:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named<int>;
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:21:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+//   Class<int><int>.named<int>;
+//                   ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:21:24: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+//   Class<int><int>.named<int>;
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:22:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named<int>();
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:22:19: Error: The method 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'named'.
+//   Class<int><int>.named<int>();
+//                   ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named<int><int>;
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+//   Class<int><int>.named<int><int>;
+//                   ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named<int><int>();
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+//   Class<int><int>.named<int><int>();
+//                   ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  constructor named() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  #C1;
+  new self::Class::•<core::int>();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:13:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>;
+       ^" in #C2{<unresolved>}.<(#C3){dynamic}.>(<core::int>[]);
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:14:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>();
+       ^" in #C2{<unresolved>}.<(#C3){dynamic}.>(<int extends core::Object? = dynamic>() → Null
+    ;
+);
+  #C5;
+  new self::Class::named<core::int>();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:17:19: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class<int> Function()'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+  Class<int>.named<int>;
+                  ^";
+  new self::Class::named<core::int>();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:19:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named;
+       ^" in #C2{<unresolved>}.<(#C3){dynamic}.>(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:19:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+  Class<int><int>.named;
+                  ^^^^^" in <core::int>[]{<unresolved>}.named);
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:20:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named();
+       ^" in #C2{<unresolved>}.<(#C3){dynamic}.>(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:20:19: Error: The method 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'named'.
+  Class<int><int>.named();
+                  ^^^^^" in <core::int>[]{<unresolved>}.named());
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:21:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named<int>;
+       ^" in #C2{<unresolved>}.<(#C3){dynamic}.>(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:21:24: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+  Class<int><int>.named<int>;
+                       ^");
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:22:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named<int>();
+       ^" in #C2{<unresolved>}.<(#C3){dynamic}.>(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:22:19: Error: The method 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'named'.
+  Class<int><int>.named<int>();
+                  ^^^^^" in <core::int>[]{<unresolved>}.named<core::int>());
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named<int><int>;
+       ^" in #C2{<unresolved>}.<(#C3){dynamic}.>(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:23:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+  Class<int><int>.named<int><int>;
+                  ^^^^^" in <core::int>[]{<unresolved>}.named){dynamic}.<(#C3){dynamic}.>(<core::int>[]);
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named<int><int>();
+       ^" in #C2{<unresolved>}.<(#C3){dynamic}.>(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/duplicate_instantiation.dart:24:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+  Class<int><int>.named<int><int>();
+                  ^^^^^" in <core::int>[]{<unresolved>}.named){dynamic}.<(#C3){dynamic}.>(<int extends core::Object? = dynamic>() → Null
+    ;
+);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::Class<core::int*>*)
+  #C2 = TypeLiteralConstant(self::Class<dynamic>*)
+  #C3 = TypeLiteralConstant(core::int*)
+  #C4 = constructor-tearoff self::Class::named
+  #C5 = instantiation #C4 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..ee9aed5
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart:5:26: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+// test1(dynamic x) => x.foo<int>; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart:6:24: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+// test2(Never x) => x.foo<int>; // Error.
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart:7:31: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String Function()'.
+// Try changing the operand or remove the type arguments.
+// test3(dynamic x) => x.toString<int>; // Error.
+//                               ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart:8:29: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+// test4(Never x) => x.toString<int>; // Error.
+//                             ^
+//
+import self as self;
+
+static method test1(dynamic x) → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart:5:26: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+test1(dynamic x) => x.foo<int>; // Error.
+                         ^";
+static method test2(Never x) → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart:6:24: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+test2(Never x) => x.foo<int>; // Error.
+                       ^";
+static method test3(dynamic x) → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart:7:31: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String Function()'.
+Try changing the operand or remove the type arguments.
+test3(dynamic x) => x.toString<int>; // Error.
+                              ^";
+static method test4(Never x) → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/dynamic_explicit_instantiation.dart:8:29: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+test4(Never x) => x.toString<int>; // Error.
+                            ^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..63427ae
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation.dart.weak.modular.expect
@@ -0,0 +1,103 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef ListList<T extends core::Object? = dynamic> = core::List<core::List<T%>>;
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method stat<T extends core::Object? = dynamic>(self::C::stat::T% value) → self::C::stat::T%
+    return value;
+  method inst<T extends core::Object? = dynamic>(self::C::inst::T% value) → self::C::inst::T%
+    return value;
+  method method() → void {
+    (core::int) → core::int f1 = #C2;
+    core::String f1TypeName = #C2.{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+    (core::int) → core::int f2 = this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
+    core::String f2TypeName = (this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+    (core::int) → core::int f3 = this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
+    core::String f3TypeName = (this.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+  }
+}
+abstract class M extends self::C /*isMixinDeclaration*/  {
+  static method mstat<T extends core::Object? = dynamic>(self::M::mstat::T% value) → self::M::mstat::T%
+    return value;
+  method minst<T extends core::Object? = dynamic>(self::M::minst::T% value) → self::M::minst::T%
+    return value;
+  method mmethod() → void {
+    (core::int) → core::int f1 = #C4;
+    core::String f1TypeName = #C4.{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+    (core::int) → core::int f2 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
+    core::String f2TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+    (core::int) → core::int f3 = this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
+    core::String f3TypeName = (this.{self::M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+  }
+}
+abstract class _D&C&M = self::C with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&C&M
+    : super self::C::•()
+    ;
+  mixin-super-stub method minst<T extends core::Object? = dynamic>(self::_D&C&M::minst::T% value) → self::_D&C&M::minst::T%
+    return super.{self::M::minst}<self::_D&C&M::minst::T%>(value);
+  mixin-super-stub method mmethod() → void
+    return super.{self::M::mmethod}();
+}
+class D extends self::_D&C&M {
+  synthetic constructor •() → self::D
+    : super self::_D&C&M::•()
+    ;
+  method method() → void {
+    (core::int) → core::int f4 = super.{self::C::inst}<core::int>;
+    core::String f4TypeName = (super.{self::C::inst}<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+  }
+}
+extension Ext on self::C {
+  static method estat = self::Ext|estat;
+  method einst = self::Ext|einst;
+  tearoff einst = self::Ext|get#einst;
+  method emethod = self::Ext|emethod;
+  tearoff emethod = self::Ext|get#emethod;
+}
+static method top<T extends core::Object? = dynamic>(self::top::T% value) → self::top::T%
+  return value;
+static method Ext|estat<T extends core::Object? = dynamic>(self::Ext|estat::T% value) → self::Ext|estat::T%
+  return value;
+static method Ext|einst<T extends core::Object? = dynamic>(lowered final self::C #this, self::Ext|einst::T% value) → self::Ext|einst::T%
+  return value;
+static method Ext|get#einst(lowered final self::C #this) → <T extends core::Object? = dynamic>(T%) → T%
+  return <T extends core::Object? = dynamic>(T% value) → T% => self::Ext|einst<T%>(#this, value);
+static method Ext|emethod(lowered final self::C #this) → void {
+  (core::int) → core::int f1 = #C6;
+  core::String f1TypeName = #C6.{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+  (core::int) → core::int f2 = self::Ext|get#einst(#this)<core::int>;
+  core::String f2TypeName = (self::Ext|get#einst(#this)<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+  (core::int) → core::int f3 = self::Ext|get#einst(#this)<core::int>;
+  core::String f3TypeName = (self::Ext|get#einst(#this)<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+}
+static method Ext|get#emethod(lowered final self::C #this) → () → void
+  return () → void => self::Ext|emethod(#this);
+static method main() → void {
+  core::Type t1 = #C7;
+  core::Type t2 = #C8;
+  function local<T extends core::Object? = dynamic>(T% value) → T%
+    return value;
+  (core::int) → core::int f3 = local<core::int>;
+  self::D d = new self::D::•();
+  (core::int) → core::int f4 = d.{self::C::inst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
+  (core::int) → core::int f5 = d.{self::_D&C&M::minst}{<T extends core::Object? = dynamic>(T%) → T%}<core::int>;
+  (core::int) → core::int f6 = self::Ext|get#einst(d)<core::int>;
+  core::String typeName = #C7.{core::Type::toString}(){() → core::String};
+  core::String functionTypeName = (local<core::int>).{core::Object::runtimeType}{core::Type}.{core::Type::toString}(){() → core::String};
+}
+
+constants  {
+  #C1 = static-tearoff self::C::stat
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = static-tearoff self::M::mstat
+  #C4 = instantiation #C3 <core::int*>
+  #C5 = static-tearoff self::Ext|estat
+  #C6 = instantiation #C5 <core::int*>
+  #C7 = TypeLiteralConstant(core::List<core::int*>*)
+  #C8 = TypeLiteralConstant(core::List<core::List<core::int*>*>*)
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.modular.expect
new file mode 100644
index 0000000..8ed55ac
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart.weak.modular.expect
@@ -0,0 +1,112 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:15:13: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+//   var d = id<int, String>; // error - too many args
+//             ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:16:17: Error: Too few type arguments: 2 required, 1 given.
+// Try adding the missing type arguments.
+//   var e = method<int>; // error - too few args
+//                 ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:17:12: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
+// Try changing the operand or remove the type arguments.
+//   var f = 0<int>; // error - non-function type operand
+//            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:18:15: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic Function()'.
+// Try changing the operand or remove the type arguments.
+//   var g = main<int>; // error - non-generic function type operand
+//               ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:19:24: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'X Function<X extends num>(X)'.
+// Try changing type arguments so that they conform to the bounds.
+//   var h = boundedMethod<String>; // error - invalid bound
+//                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:25:11: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+// var d = id<int, String>; // error - too many args
+//           ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:26:15: Error: Too few type arguments: 2 required, 1 given.
+// Try adding the missing type arguments.
+// var e = method<int>; // error - too few args
+//               ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:27:10: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
+// Try changing the operand or remove the type arguments.
+// var f = 0<int>; // error - non-function type operand
+//          ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:28:13: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic Function()'.
+// Try changing the operand or remove the type arguments.
+// var g = main<int>; // error - non-generic function type operand
+//             ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:29:22: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'X Function<X extends num>(X)'.
+// Try changing type arguments so that they conform to the bounds.
+// var h = boundedMethod<String>; // error - invalid bound
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field <X extends core::Object? = dynamic>(X%) → X% a = #C1;
+static field (core::int) → core::int b = self::a<core::int>;
+static field (core::int) → core::int c = #C2;
+static field invalid-type d = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:25:11: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+var d = id<int, String>; // error - too many args
+          ^";
+static field invalid-type e = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:26:15: Error: Too few type arguments: 2 required, 1 given.
+Try adding the missing type arguments.
+var e = method<int>; // error - too few args
+              ^";
+static field invalid-type f = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:27:10: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
+Try changing the operand or remove the type arguments.
+var f = 0<int>; // error - non-function type operand
+         ^";
+static field invalid-type g = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:28:13: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic Function()'.
+Try changing the operand or remove the type arguments.
+var g = main<int>; // error - non-generic function type operand
+            ^";
+static field (core::String) → core::String h = #C4;
+static method id<X extends core::Object? = dynamic>(self::id::X% x) → self::id::X%
+  return x;
+static method method<X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → void {}
+static method boundedMethod<X extends core::num>(self::boundedMethod::X x) → self::boundedMethod::X
+  return x;
+static method test() → dynamic {
+  <X extends core::Object? = dynamic>(X%) → X% a = #C1;
+  (core::int) → core::int b = a<core::int>;
+  (core::int) → core::int c = #C2;
+  invalid-type d = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:15:13: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+  var d = id<int, String>; // error - too many args
+            ^";
+  invalid-type e = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:16:17: Error: Too few type arguments: 2 required, 1 given.
+Try adding the missing type arguments.
+  var e = method<int>; // error - too few args
+                ^";
+  invalid-type f = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:17:12: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int'.
+Try changing the operand or remove the type arguments.
+  var f = 0<int>; // error - non-function type operand
+           ^";
+  invalid-type g = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/explicit_instantiation_errors.dart:18:15: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic Function()'.
+Try changing the operand or remove the type arguments.
+  var g = main<int>; // error - non-generic function type operand
+              ^";
+  (core::String) → core::String h = #C4;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::id
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = static-tearoff self::boundedMethod
+  #C4 = instantiation #C3 <core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.modular.expect
new file mode 100644
index 0000000..13d3f0b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart.weak.modular.expect
@@ -0,0 +1,105 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:15:3: Error: 'C' is already declared in this scope.
+//   C.new(); // Error.
+//   ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:14:3: Context: Previous declaration of 'C'.
+//   C();
+//   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:20:3: Error: 'D' is already declared in this scope.
+//   D(); // Error.
+//   ^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:19:3: Context: Previous declaration of 'D'.
+//   D.new();
+//   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:26:11: Error: 'E1' is already declared in this scope.
+//   factory E1.new() => E1._(); // Error.
+//           ^^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:25:3: Context: Previous declaration of 'E1'.
+//   E1();
+//   ^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:32:3: Error: 'E2' is already declared in this scope.
+//   E2();
+//   ^^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:31:11: Context: Previous declaration of 'E2'.
+//   factory E2.new() => E2._(); // Error.
+//           ^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:38:11: Error: 'E3' is already declared in this scope.
+//   factory E3.new() = E3._; // Error.
+//           ^^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:37:3: Context: Previous declaration of 'E3'.
+//   E3();
+//   ^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:44:3: Error: 'E4' is already declared in this scope.
+//   E4(); // Error.
+//   ^^
+// pkg/front_end/testcases/constructor_tearoffs/explicit_new_as_unnamed.dart:43:11: Context: Previous declaration of 'E4'.
+//   factory E4.new() = E4._;
+//           ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+class E1 extends core::Object {
+  constructor _() → self::E1
+    : super core::Object::•()
+    ;
+  constructor •() → self::E1
+    : super core::Object::•()
+    ;
+}
+class E2 extends core::Object {
+  constructor _() → self::E2
+    : super core::Object::•()
+    ;
+  static factory •() → self::E2
+    return new self::E2::_();
+}
+class E3 extends core::Object {
+  constructor _() → self::E3
+    : super core::Object::•()
+    ;
+  constructor •() → self::E3
+    : super core::Object::•()
+    ;
+}
+class E4 extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _() → self::E4
+    : super core::Object::•()
+    ;
+  static factory •() → self::E4
+    return new self::E4::_();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::E4::•
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.modular.expect
new file mode 100644
index 0000000..d91a515
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart.weak.modular.expect
@@ -0,0 +1,140 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:32: Error: A value of type 'A<X/*1*/> Function<X>(X/*1*/, int)' can't be returned from a function with return type 'A<X/*2*/> Function<X>(X/*2*/)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+//  - 'X/*1*/' is from 'unknown'.
+//  - 'X/*2*/' is from 'unknown'.
+// A<X> Function<X>(X) test2() => A.foo2; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:32: Error: A value of type 'A<X/*1*/> Function<X>()' can't be returned from a function with return type 'A<X/*2*/> Function<X>(X/*2*/)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+//  - 'X/*1*/' is from 'unknown'.
+//  - 'X/*2*/' is from 'unknown'.
+// A<X> Function<X>(X) test3() => A.new; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:32: Error: A value of type 'A<int> Function()' can't be returned from a function with return type 'A<X> Function<X>(X)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+// A<X> Function<X>(X) test4() => A<int>.new; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:32: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+// A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:32: Error: A value of type 'A<int> Function(int)' can't be returned from a function with return type 'A<X> Function<X>(X)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+// A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:32: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+// A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:32: Error: A value of type 'A<int> Function(int, int)' can't be returned from a function with return type 'A<X> Function<X>(X)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+// A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:20:32: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+// A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:22:33: Error: A value of type 'A<X/*1*/> Function<X>()' can't be returned from a function with return type 'A<X/*2*/> Function<X>(X/*2*/)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+//  - 'X/*1*/' is from 'unknown'.
+//  - 'X/*2*/' is from 'unknown'.
+// A<X> Function<X>(X) test11() => A.bar1; // Error.
+//                                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  constructor foo1(self::A::X% x) → self::A<self::A::X%>
+    : super core::Object::•() {}
+  constructor foo2(self::A::X% x, core::int y) → self::A<self::A::X%>
+    : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  static factory bar1<X extends core::Object? = dynamic>() → self::A<self::A::bar1::X%>
+    return new self::A::•<self::A::bar1::X%>();
+}
+static method test1() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return #C1;
+static method test2() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:13:32: Error: A value of type 'A<X/*1*/> Function<X>(X/*1*/, int)' can't be returned from a function with return type 'A<X/*2*/> Function<X>(X/*2*/)'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+ - 'X/*1*/' is from 'unknown'.
+ - 'X/*2*/' is from 'unknown'.
+A<X> Function<X>(X) test2() => A.foo2; // Error.
+                               ^" in #C2 as{TypeError,ForNonNullableByDefault} Never;
+static method test3() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:14:32: Error: A value of type 'A<X/*1*/> Function<X>()' can't be returned from a function with return type 'A<X/*2*/> Function<X>(X/*2*/)'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+ - 'X/*1*/' is from 'unknown'.
+ - 'X/*2*/' is from 'unknown'.
+A<X> Function<X>(X) test3() => A.new; // Error.
+                               ^" in #C3 as{TypeError,ForNonNullableByDefault} Never;
+static method test4() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:15:32: Error: A value of type 'A<int> Function()' can't be returned from a function with return type 'A<X> Function<X>(X)'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+A<X> Function<X>(X) test4() => A<int>.new; // Error.
+                               ^" in #C4 as{TypeError,ForNonNullableByDefault} Never;
+static method test5() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:16:32: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+A<X> Function<X>(X) test5() => A<int, String>.new; // Error.
+                               ^";
+static method test6() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:17:32: Error: A value of type 'A<int> Function(int)' can't be returned from a function with return type 'A<X> Function<X>(X)'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+A<X> Function<X>(X) test6() => A<int>.foo1; // Error.
+                               ^" in #C5 as{TypeError,ForNonNullableByDefault} Never;
+static method test7() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:18:32: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+A<X> Function<X>(X) test7() => A<int, String>.foo1; // Error.
+                               ^";
+static method test8() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:19:32: Error: A value of type 'A<int> Function(int, int)' can't be returned from a function with return type 'A<X> Function<X>(X)'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+A<X> Function<X>(X) test8() => A<int>.foo2; // Error.
+                               ^" in #C6 as{TypeError,ForNonNullableByDefault} Never;
+static method test9() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:20:32: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+A<X> Function<X>(X) test9() => A<int, String>.foo2; // Error.
+                               ^";
+static method test10() → <X extends core::Object? = dynamic>() → self::A<X%>
+  return #C7;
+static method test11() → <X extends core::Object? = dynamic>(X%) → self::A<X%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart:22:33: Error: A value of type 'A<X/*1*/> Function<X>()' can't be returned from a function with return type 'A<X/*2*/> Function<X>(X/*2*/)'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_with_context.dart'.
+ - 'X/*1*/' is from 'unknown'.
+ - 'X/*2*/' is from 'unknown'.
+A<X> Function<X>(X) test11() => A.bar1; // Error.
+                                ^" in #C7 as{TypeError,ForNonNullableByDefault} Never;
+static method test12() → () → self::A<core::int>
+  return #C8;
+static method test13() → () → self::A<core::int>
+  return #C8;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::foo1
+  #C2 = constructor-tearoff self::A::foo2
+  #C3 = constructor-tearoff self::A::•
+  #C4 = instantiation #C3 <core::int*>
+  #C5 = instantiation #C1 <core::int*>
+  #C6 = instantiation #C2 <core::int*>
+  #C7 = constructor-tearoff self::A::bar1
+  #C8 = instantiation #C7 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.modular.expect
new file mode 100644
index 0000000..a5cdb82
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart.weak.modular.expect
@@ -0,0 +1,102 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:18:23: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+// testFooExtraArgs() => A<int, String>.foo; // Error.
+//                       ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:19:23: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+// testNewExtraArgs() => A<int, String>.new; // Error.
+//                       ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:20:23: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+// testBarExtraArgs() => A<int, String>.bar; // Error.
+//                       ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:30:22: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+//   var fooExtraArgs = A<int, String>.foo; // Error.
+//                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:31:22: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+//   var newExtraArgs = A<int, String>.new; // Error.
+//                      ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:32:22: Error: Too many type arguments: 1 allowed, but 2 found.
+// Try removing the extra type arguments.
+//   var barExtraArgs = A<int, String>.bar; // Error.
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  constructor foo() → self::A<self::A::X%>
+    : super core::Object::•() {}
+  constructor •() → self::A<self::A::X%>
+    : super core::Object::•() {}
+  static factory bar<X extends core::Object? = dynamic>() → self::A<self::A::bar::X%>
+    return new self::A::•<self::A::bar::X%>();
+}
+static method testFoo() → dynamic
+  return #C1;
+static method testFooArgs() → dynamic
+  return #C2;
+static method testNew() → dynamic
+  return #C3;
+static method testNewArgs() → dynamic
+  return #C4;
+static method testBar() → dynamic
+  return #C5;
+static method testBarArgs() → dynamic
+  return #C6;
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:18:23: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+testFooExtraArgs() => A<int, String>.foo; // Error.
+                      ^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:19:23: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+testNewExtraArgs() => A<int, String>.new; // Error.
+                      ^";
+static method testBarExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:20:23: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+testBarExtraArgs() => A<int, String>.bar; // Error.
+                      ^";
+static method method() → dynamic {
+  <X extends core::Object? = dynamic>() → self::A<X%> foo = #C1;
+  () → self::A<core::int> fooArgs = #C2;
+  <X extends core::Object? = dynamic>() → self::A<X%> _new = #C3;
+  () → self::A<core::int> newArgs = #C4;
+  <X extends core::Object? = dynamic>() → self::A<X%> bar = #C5;
+  () → self::A<core::int> barArgs = #C6;
+  invalid-type fooExtraArgs = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:30:22: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+  var fooExtraArgs = A<int, String>.foo; // Error.
+                     ^";
+  invalid-type newExtraArgs = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:31:22: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+  var newExtraArgs = A<int, String>.new; // Error.
+                     ^";
+  invalid-type barExtraArgs = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/generic_tearoff_without_context.dart:32:22: Error: Too many type arguments: 1 allowed, but 2 found.
+Try removing the extra type arguments.
+  var barExtraArgs = A<int, String>.bar; // Error.
+                     ^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::foo
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = constructor-tearoff self::A::•
+  #C4 = instantiation #C3 <core::int*>
+  #C5 = constructor-tearoff self::A::bar
+  #C6 = instantiation #C5 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.modular.expect
new file mode 100644
index 0000000..5abed3e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/identical_instantiated_function_tearoffs.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static field (core::int) → core::int implicitInstantiation = #C2;
+static field (core::int) → core::int explicitInstantiation = #C2;
+static const field (core::int) → core::int implicitConstInstantiation = #C2;
+static const field (core::int) → core::int explicitConstInstantiation = #C2;
+static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
+  return t;
+static method create<T extends core::Object? = dynamic>() → (self::create::T%) → self::create::T%
+  return #C1<self::create::T%>;
+static method main() → dynamic {
+  self::expect(true, core::identical(self::implicitInstantiation, self::implicitInstantiation));
+  self::expect(true, core::identical(self::implicitInstantiation, self::explicitInstantiation));
+  self::expect(true, core::identical(self::implicitInstantiation, #C2));
+  self::expect(true, core::identical(self::implicitInstantiation, #C2));
+  self::expect(true, core::identical(self::implicitInstantiation, #C2));
+  self::expect(false, core::identical(self::implicitInstantiation, #C3));
+  self::expect(false, core::identical(self::implicitInstantiation, self::create<core::int>()));
+  self::expect(true, core::identical(self::explicitInstantiation, self::implicitInstantiation));
+  self::expect(true, core::identical(self::explicitInstantiation, self::explicitInstantiation));
+  self::expect(true, core::identical(self::explicitInstantiation, #C2));
+  self::expect(true, core::identical(self::explicitInstantiation, #C2));
+  self::expect(true, core::identical(self::explicitInstantiation, #C2));
+  self::expect(false, core::identical(self::explicitInstantiation, #C3));
+  self::expect(false, core::identical(self::explicitInstantiation, self::create<core::int>()));
+  self::expect(true, core::identical(#C2, self::implicitInstantiation));
+  self::expect(true, core::identical(#C2, self::explicitInstantiation));
+  self::expect(true, core::identical(#C2, #C2));
+  self::expect(true, core::identical(#C2, #C2));
+  self::expect(true, core::identical(#C2, #C2));
+  self::expect(false, core::identical(#C2, #C3));
+  self::expect(false, core::identical(#C2, self::create<core::int>()));
+  self::expect(true, core::identical(#C2, self::implicitInstantiation));
+  self::expect(true, core::identical(#C2, self::explicitInstantiation));
+  self::expect(true, core::identical(#C2, #C2));
+  self::expect(true, core::identical(#C2, #C2));
+  self::expect(true, core::identical(#C2, #C2));
+  self::expect(false, core::identical(#C2, #C3));
+  self::expect(false, core::identical(#C2, self::create<core::int>()));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = static-tearoff self::id
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..a39c27d
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>(self::Class::call::T% t) → self::Class::call::T%
+    return t;
+}
+static field <T extends core::Object? = dynamic>(T%) → T% alias = #C1;
+static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
+  return t;
+static method method((core::int) → core::int f) → dynamic {}
+static method test() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::int) → core::int f = self::alias<core::int>;
+  (core::int) → core::int g;
+  g = self::alias<core::int>;
+  (core::int) → core::int h = (let final self::Class #t1 = c in #t1 == null ?{<T extends core::Object? = dynamic>(T%) → T%} null : #t1.{self::Class::call}{<T extends core::Object? = dynamic>(T%) → T%})<core::int>;
+  g = (let final self::Class #t2 = c in #t2 == null ?{<T extends core::Object? = dynamic>(T%) → T%} null : #t2.{self::Class::call}{<T extends core::Object? = dynamic>(T%) → T%})<core::int>;
+  self::method(self::alias<core::int>);
+}
+static method main() → dynamic {
+  self::test();
+}
+
+constants  {
+  #C1 = static-tearoff self::id
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart.weak.modular.expect
new file mode 100644
index 0000000..473f61e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:16:30: Error: A value of type 'int Function(int, int)?' can't be assigned to a variable of type 'int Function(int, int)' because 'int Function(int, int)?' is nullable and 'int Function(int, int)' isn't.
+//   int Function(int, int) f = alias;
+//                              ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:18:7: Error: A value of type 'int Function(int, int)?' can't be assigned to a variable of type 'int Function(int, int?)?' because 'int?' is nullable and 'int' isn't.
+//   g = alias;
+//       ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:19:27: Error: A value of type 'int Function(int, int)' can't be assigned to a variable of type 'int Function(int, int?)' because 'int?' is nullable and 'int' isn't.
+//   int Function(int, int?) h = c;
+//                           ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:20:3: Error: A value of type 'int Function(int, int)' can't be assigned to a variable of type 'int Function(int, int?)?' because 'int?' is nullable and 'int' isn't.
+//   g = c;
+//   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:21:10: Error: The argument type 'int Function(int, int)?' can't be assigned to the parameter type 'int Function(int, int?)' because 'int?' is nullable and 'int' isn't.
+//   method(alias);
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>(self::Class::call::T% t, core::int i) → self::Class::call::T%
+    return t;
+}
+static field <T extends core::Object? = dynamic>(T%, core::int) →? T% alias = #C1;
+static method id<T extends core::Object? = dynamic>(self::id::T% t, core::int i) → self::id::T%
+  return t;
+static method method((core::int, core::int?) → core::int f) → dynamic {}
+static method test() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::int, core::int) → core::int f = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:16:30: Error: A value of type 'int Function(int, int)?' can't be assigned to a variable of type 'int Function(int, int)' because 'int Function(int, int)?' is nullable and 'int Function(int, int)' isn't.
+  int Function(int, int) f = alias;
+                             ^" in (self::alias<core::int>) as{TypeError,ForNonNullableByDefault} (core::int, core::int) → core::int;
+  (core::int, core::int?) →? core::int g;
+  g = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:18:7: Error: A value of type 'int Function(int, int)?' can't be assigned to a variable of type 'int Function(int, int?)?' because 'int?' is nullable and 'int' isn't.
+  g = alias;
+      ^" in (self::alias<core::int>) as{TypeError,ForNonNullableByDefault} (core::int, core::int?) →? core::int;
+  (core::int, core::int?) → core::int h = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:19:27: Error: A value of type 'int Function(int, int)' can't be assigned to a variable of type 'int Function(int, int?)' because 'int?' is nullable and 'int' isn't.
+  int Function(int, int?) h = c;
+                          ^" in ((let final self::Class #t1 = c in #t1 == null ?{<T extends core::Object? = dynamic>(T%, core::int) → T%} null : #t1.{self::Class::call}{<T extends core::Object? = dynamic>(T%, core::int) → T%})<core::int>) as{TypeError,ForNonNullableByDefault} (core::int, core::int?) → core::int;
+  g = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:20:3: Error: A value of type 'int Function(int, int)' can't be assigned to a variable of type 'int Function(int, int?)?' because 'int?' is nullable and 'int' isn't.
+  g = c;
+  ^" in ((let final self::Class #t2 = c in #t2 == null ?{<T extends core::Object? = dynamic>(T%, core::int) → T%} null : #t2.{self::Class::call}{<T extends core::Object? = dynamic>(T%, core::int) → T%})<core::int>) as{TypeError,ForNonNullableByDefault} (core::int, core::int?) →? core::int;
+  self::method(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/implicit_instantiation_errors.dart:21:10: Error: The argument type 'int Function(int, int)?' can't be assigned to the parameter type 'int Function(int, int?)' because 'int?' is nullable and 'int' isn't.
+  method(alias);
+         ^" in (self::alias<core::int>) as{TypeError,ForNonNullableByDefault} (core::int, core::int?) → core::int);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::id
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..5857e8c
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f1a(''); // error
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f2a(''); // error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class2 extends core::Object implements self::Interface2 {
+  final field core::int field;
+  constructor •(core::int field) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static field (core::int) → self::Class1 Class1_new = #C1;
+static field (core::int) → self::Class2 Class2_new = #C2;
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testInferred();
+}
+static method testInferred() → dynamic {
+  (core::int) → self::Class1 f1a = #C1;
+  self::expect(true, f1a is{ForNonNullableByDefault} (core::int) → self::Class1);
+  self::expect(false, f1a is{ForNonNullableByDefault} (core::String) → self::Class1);
+  self::Class1 c1a = f1a(0){(core::int) → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  () → Null {
+    f1a(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
+  };
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call(0);
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::throws(() → dynamic => f1b{dynamic}.call(""));
+  (core::int) → self::Class2 f2a = #C2;
+  self::expect(true, f2a is{ForNonNullableByDefault} (core::int) → self::Class2);
+  self::expect(false, f2a is{ForNonNullableByDefault} (core::String) → self::Class2);
+  self::Class2 c2a = f2a(0){(core::int) → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  () → Null {
+    f2a(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
+  };
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call(0);
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::throws(() → dynamic => f2b{dynamic}.call(""));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C3}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.modular.expect
new file mode 100644
index 0000000..5827e2a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/inferred_non_proper_rename.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends core::num> = self::A<X>;
+typedef G<unrelated Y extends core::Object? = dynamic> = self::A<core::int>;
+typedef H<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self::A<X%>;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static const field () → self::A<core::int> f1a = #C2;
+static const field () → self::A<core::int> f1b = #C2;
+static const field () → self::A<core::int> f1c = #C2;
+static const field () → self::A<core::int> g1a = #C2;
+static const field () → self::A<core::int> g1b = #C2;
+static const field () → self::A<core::int> g1c = #C2;
+static const field () → self::A<core::int> h1a = #C2;
+static const field () → self::A<core::int> h1b = #C2;
+static const field () → self::A<core::int> h1c = #C2;
+static method main() → dynamic {
+  self::test<core::int>();
+  core::identical(#C2, #C2);
+  core::identical(#C2, #C2);
+  core::identical(#C2, #C2);
+  core::identical(#C2, #C2);
+  core::identical(#C2, #C2);
+  core::identical(#C2, #C2);
+}
+static method test<T extends core::num>() → dynamic {
+  () → self::A<self::test::T> f2a = #C1<self::test::T>;
+  () → self::A<self::test::T> f2b = #C1<self::test::T>;
+  () → self::A<self::test::T> f2c = #C1<self::test::T>;
+  () → self::A<core::int> g2a = #C2;
+  () → self::A<core::int> g2b = #C2;
+  () → self::A<core::int> g2c = #C2;
+  () → self::A<self::test::T> h2a = #C1<self::test::T>;
+  () → self::A<self::test::T> h2b = #C1<self::test::T>;
+  () → self::A<self::test::T> h2c = #C1<self::test::T>;
+  self::expect(#C2, g2a);
+  self::expect(g2a, g2b);
+  if(self::inSoundMode) {
+    self::expect(g2a, g2c);
+  }
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = instantiation #C1 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..ba34a7a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/instantiation.dart.weak.modular.expect
@@ -0,0 +1,73 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:16:40: Error: Inferred type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'A<X> Function<X extends num>(X)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/instantiation.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// A<dynamic> Function(String) test5() => A.foo; // Error.
+//                                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:17:40: Error: Inferred type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'A<X> Function<X extends num>(X)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/instantiation.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// A<dynamic> Function(String) test6() => A.new; // Error.
+//                                        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/instantiation.dart:23:41: Error: Inferred type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'A<X> Function<X extends num>(X)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/instantiation.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// A<dynamic> Function(String) test11() => A.bar; // Error.
+//                                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::num> extends core::Object {
+  constructor foo(self::A::X x) → self::A<self::A::X>
+    : super core::Object::•() {}
+  constructor •(self::A::X x) → self::A<self::A::X>
+    : super core::Object::•() {}
+  static factory bar<X extends core::num>(self::A::bar::X x) → self::A<self::A::bar::X>
+    return new self::A::•<self::A::bar::X>(x);
+}
+static method test1() → (core::num) → self::A<core::num>
+  return #C2;
+static method test2() → (core::int) → self::A<core::int>
+  return #C3;
+static method test3() → (core::num) → self::A<core::num>
+  return #C5;
+static method test4() → (core::int) → self::A<core::int>
+  return #C6;
+static method test5() → (core::String) → self::A<dynamic>
+  return #C7;
+static method test6() → (core::String) → self::A<dynamic>
+  return #C8;
+static method test7() → (core::num) → self::A<dynamic>
+  return #C2;
+static method test8() → (core::num) → self::A<dynamic>
+  return #C5;
+static method test9() → (core::num) → self::A<core::num>
+  return #C10;
+static method test10() → (core::int) → self::A<core::int>
+  return #C11;
+static method test11() → (core::String) → self::A<dynamic>
+  return #C12;
+static method test12() → (core::num) → self::A<dynamic>
+  return #C10;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::foo
+  #C2 = instantiation #C1 <core::num*>
+  #C3 = instantiation #C1 <core::int*>
+  #C4 = constructor-tearoff self::A::•
+  #C5 = instantiation #C4 <core::num*>
+  #C6 = instantiation #C4 <core::int*>
+  #C7 = instantiation #C1 <core::String*>
+  #C8 = instantiation #C4 <core::String*>
+  #C9 = constructor-tearoff self::A::bar
+  #C10 = instantiation #C9 <core::num*>
+  #C11 = instantiation #C9 <core::int*>
+  #C12 = instantiation #C9 <core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.modular.expect
new file mode 100644
index 0000000..912d264
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46133.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:18: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+// test() => A.const.toString();
+//                  ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+// Try inserting an identifier before 'const'.
+// test() => A.const.toString();
+//             ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46133.dart:7:13: Error: Expected an identifier, but got 'const'.
+Try inserting an identifier before 'const'.
+test() => A.const.toString();
+            ^^^^^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.modular.expect
new file mode 100644
index 0000000..6add537
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46719.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:24:10: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   A.named<int>.toString(); // error
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue46719.dart" as self;
+
+class A<T extends core::Object? = dynamic> extends core::Object {
+  constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  constructor named() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  method m<X extends core::Object? = dynamic>(self::A::m::X% x) → core::List<self::A::m::X%>
+    return <self::A::m::X%>[x];
+  static method n<X extends core::Object? = dynamic>(self::A::n::X% x) → core::List<self::A::n::X%>
+    return <self::A::n::X%>[x];
+}
+extension FunctionApplier on core::Function {
+  method applyAndPrint = self::FunctionApplier|applyAndPrint;
+  tearoff applyAndPrint = self::FunctionApplier|get#applyAndPrint;
+}
+static method m<X extends core::Object? = dynamic>(self::m::X% x) → core::List<self::m::X%>
+  return <self::m::X%>[x];
+static method FunctionApplier|applyAndPrint(lowered final core::Function #this, core::List<core::Object?> positionalArguments) → void
+  return core::print(core::Function::apply(#this, positionalArguments, #C1));
+static method FunctionApplier|get#applyAndPrint(lowered final core::Function #this) → (core::List<core::Object?>) → void
+  return (core::List<core::Object?> positionalArguments) → void => self::FunctionApplier|applyAndPrint(#this, positionalArguments);
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46719.dart:24:10: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  A.named<int>.toString(); // error
+         ^";
+}
+static method main() → void {
+  self::A<dynamic> a = new self::A::•<dynamic>();
+  self::FunctionApplier|applyAndPrint(a.{self::A::m}{<X extends core::Object? = dynamic>(X%) → core::List<X%>}<core::int>, <core::Object?>[2]);
+  self::FunctionApplier|applyAndPrint(a.{self::A::m}{<X extends core::Object? = dynamic>(X%) → core::List<X%>}<core::String>, <core::Object?>["three"]);
+  self::FunctionApplier|applyAndPrint(#C3, <core::Object?>[2]);
+  self::FunctionApplier|applyAndPrint(#C4, <core::Object?>["three"]);
+  self::FunctionApplier|applyAndPrint(#C6, <core::Object?>[2]);
+  self::FunctionApplier|applyAndPrint(#C7, <core::Object?>["three"]);
+  self::FunctionApplier|applyAndPrint(#C3, <core::Object?>[2]);
+  self::FunctionApplier|applyAndPrint(#C4, <core::Object?>["three"]);
+  #C8.{core::Object::toString}(){() → core::String};
+  #C9.{core::Object::toString}(){() → core::String};
+}
+
+constants  {
+  #C1 = <core::Symbol*, dynamic>{)
+  #C2 = static-tearoff self::A::n
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = instantiation #C2 <core::String*>
+  #C5 = static-tearoff self::m
+  #C6 = instantiation #C5 <core::int*>
+  #C7 = instantiation #C5 <core::String*>
+  #C8 = constructor-tearoff self::A::named
+  #C9 = instantiation #C8 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.modular.expect
new file mode 100644
index 0000000..b032165
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46887.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef b = core::int;
+typedef c = core::String;
+static method f(dynamic a, [dynamic b = #C1]) → core::String
+  return "${a}, ${b}";
+static method a<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic>(core::int x) → core::String {
+  return "a<${self::a::T1%}, ${self::a::T2%}>(${x})";
+}
+static method main() → dynamic {
+  self::expect("${#C3}, null", self::f(#C3.{core::Object::toString}(){() → core::String}));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = null
+  #C2 = static-tearoff self::a
+  #C3 = instantiation #C2 <core::int*, core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.modular.expect
new file mode 100644
index 0000000..9459fcb
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46890.dart.weak.modular.expect
@@ -0,0 +1,75 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:22:14: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   List.filled<int>; // Error.
+//              ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:23:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   A.foo<int>; // Error.
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:24:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   A.bar<int>; // Error.
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:25:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   A.baz<int>; // Error.
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor foo() → self::A<self::A::X%>
+    : super core::Object::•() {}
+  static factory bar<X extends core::Object? = dynamic>() → self::A<self::A::bar::X%>
+    return new self::A::foo<self::A::bar::X%>();
+  static factory baz<X extends core::Object? = dynamic>() → self::A<self::A::baz::X%>
+    return self::A::bar<self::A::baz::X%>();
+}
+static method test() → dynamic {
+  #C2;
+  #C3;
+  #C4;
+  #C5;
+  #C6;
+  #C7;
+  #C8;
+  #C9;
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:22:14: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  List.filled<int>; // Error.
+             ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:23:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  A.foo<int>; // Error.
+       ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:24:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  A.bar<int>; // Error.
+       ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue46890.dart:25:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  A.baz<int>; // Error.
+       ^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::baz
+  #C2 = constructor-tearoff core::List::filled
+  #C3 = constructor-tearoff self::A::foo
+  #C4 = constructor-tearoff self::A::bar
+  #C5 = redirecting-factory-tearoff self::A::baz
+  #C6 = instantiation #C2 <core::int*>
+  #C7 = instantiation #C3 <core::int*>
+  #C8 = instantiation #C4 <core::int*>
+  #C9 = instantiation #C5 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue46925.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue46925.dart.weak.modular.expect
new file mode 100644
index 0000000..9c76f69
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue46925.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46925.dart:18:16: Error: Function invocation is not a constant expression.
+//   const c1 = v1(3, 14);
+//                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46925.dart:19:16: Error: Function invocation is not a constant expression.
+//   const c2 = v1(3, 14);
+//                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46925.dart:20:16: Error: Function invocation is not a constant expression.
+//   const c3 = v2();
+//                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46925.dart:21:16: Error: Function invocation is not a constant expression.
+//   const c4 = v2();
+//                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46925.dart:22:16: Error: Function invocation is not a constant expression.
+//   const c5 = v3(3, 14);
+//                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue46925.dart:23:16: Error: Function invocation is not a constant expression.
+//   const c6 = v4();
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class MyClass<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field dynamic a;
+  const constructor •(core::int i, core::int j) → self::MyClass<self::MyClass::T%>
+    : self::MyClass::a = i.{core::num::+}(j){(core::num) → core::int}, super core::Object::•()
+    ;
+  const constructor constr() → self::MyClass<self::MyClass::T%>
+    : self::MyClass::a = 0, super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  const self::MyClass<core::String> c1 = invalid-expression "Function invocation is not a constant expression.";
+  const self::MyClass<core::String> c2 = invalid-expression "Function invocation is not a constant expression.";
+  const self::MyClass<core::int> c3 = invalid-expression "Function invocation is not a constant expression.";
+  const self::MyClass<core::int> c4 = invalid-expression "Function invocation is not a constant expression.";
+  const self::MyClass<core::int> c5 = invalid-expression "Function invocation is not a constant expression.";
+  const self::MyClass<core::String> c6 = invalid-expression "Function invocation is not a constant expression.";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47069.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47069.dart.weak.modular.expect
new file mode 100644
index 0000000..9f3e10b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47069.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue47069.dart:7:2: Error: Couldn't find constructor 'func'.
+// @func()
+//  ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue47069.dart:9:9: Error: Couldn't find constructor 'func'.
+//   const func();
+//         ^^^^
+//
+import self as self;
+
+static method func() → dynamic {}
+@invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue47069.dart:7:2: Error: Couldn't find constructor 'func'.
+@func()
+ ^^^^"
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue47069.dart:9:9: Error: Couldn't find constructor 'func'.
+  const func();
+        ^^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47071.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47071.dart.weak.modular.expect
new file mode 100644
index 0000000..a4ce712
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47071.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue47071.dart:8:7: Error: Couldn't find constructor 'a'.
+//   new a();
+//       ^
+//
+import self as self;
+
+static field dynamic a;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue47071.dart:8:7: Error: Couldn't find constructor 'a'.
+  new a();
+      ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47075.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47075.dart.weak.modular.expect
new file mode 100644
index 0000000..1d24b72
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47075.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue47075.dart:6:7: Error: 'new' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   int new = 42;
+//       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue47075.dart:10:11: Error: 'new' can only be used as a constructor reference.
+//   new C().new is int;
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue47075.dart:12:7: Error: 'new' can only be used as a constructor reference.
+//   foo.new;
+//       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue47075.dart:13:7: Error: 'new' can only be used as a constructor reference.
+//   foo.new();
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int new = 42;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  new self::C::•().{self::C::new}{core::int} is{ForNonNullableByDefault} core::int;
+  dynamic foo;
+  foo{dynamic}.new;
+  foo{dynamic}.new();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47079.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47079.dart.weak.modular.expect
new file mode 100644
index 0000000..17917a9
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47079.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/issue47079.dart:6:7: Error: Couldn't find constructor 'A'.
+//   new A();
+//       ^
+//
+import self as self;
+
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/issue47079.dart:6:7: Error: Couldn't find constructor 'A'.
+  new A();
+      ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.modular.expect
new file mode 100644
index 0000000..9af80b0
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154a.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field (core::int) → core::int x;
+  const constructor •(core::bool b) → self::A
+    : self::A::x = (b ?{<X extends core::Object? = dynamic>(X%) → X%} #C1 : #C2)<core::int>, super core::Object::•()
+    ;
+}
+static method id<X extends core::Object? = dynamic>(self::id::X% x) → self::id::X%
+  return x;
+static method other<X extends core::Object? = dynamic>(self::other::X% x) → self::other::X%
+  return throw "${x}";
+static method main() → void {
+  core::print("${#C3}, ${#C1}, ${#C3}, ${#C4}");
+}
+
+constants  {
+  #C1 = static-tearoff self::id
+  #C2 = static-tearoff self::other
+  #C3 = instantiation #C1 <core::int*>
+  #C4 = self::A {x:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47154a.dart:
+- A. (from org-dartlang-testcase:///issue47154a.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.modular.expect
new file mode 100644
index 0000000..a593732
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154b.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field (core::int) → core::int x;
+  const constructor •(core::bool b) → self::A
+    : self::A::x = b ?{(core::int) → core::int} #C2 : #C4, super core::Object::•()
+    ;
+}
+static method id<X extends core::Object? = dynamic>(self::id::X% x) → self::id::X%
+  return x;
+static method other<X extends core::Object? = dynamic>(self::other::X% x) → self::other::X%
+  return throw "${x}";
+static method main() → void {
+  core::print("${#C2}, ${#C1}, ${#C2}, ${#C5}");
+}
+
+constants  {
+  #C1 = static-tearoff self::id
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = static-tearoff self::other
+  #C4 = instantiation #C3 <core::int*>
+  #C5 = self::A {x:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47154b.dart:
+- A. (from org-dartlang-testcase:///issue47154b.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.modular.expect
new file mode 100644
index 0000000..691f3a6
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47154c.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::List<self::A::X%> x;
+  const constructor •(dynamic x) → self::A<self::A::X%>
+    : self::A::x = x is{ForNonNullableByDefault} core::List<self::A::X%> ?{core::List<self::A::X%>} x{core::List<self::A::X%>} : x as{ForNonNullableByDefault} core::List<self::A::X%>, super core::Object::•()
+    ;
+}
+class B<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field (self::B::X%) → void f;
+  const constructor •() → self::B<self::B::X%>
+    : self::B::f = #C1<self::B::X%>, super core::Object::•()
+    ;
+}
+class C<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field dynamic f;
+  const constructor •() → self::C<self::C::X%>
+    : self::C::f = #C1<self::C::X%>, super core::Object::•()
+    ;
+}
+static method m<X extends core::Object? = dynamic>(self::m::X% x) → void {}
+static method main() → void {
+  #C4;
+  core::print((#C6.{self::B::f}{(core::String) → void} as{TypeError,CovarianceCheck,ForNonNullableByDefault} (core::String) → void).{core::Object::runtimeType}{core::Type});
+  core::print(#C7.{self::C::f}{dynamic}.{core::Object::runtimeType}{core::Type});
+}
+
+constants  {
+  #C1 = static-tearoff self::m
+  #C2 = 1
+  #C3 = <core::int*>[#C2]
+  #C4 = self::A<core::int*> {x:#C3}
+  #C5 = instantiation #C1 <core::String*>
+  #C6 = self::B<core::String*> {f:#C5}
+  #C7 = self::C<core::String*> {f:#C5}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47154c.dart:
+- A. (from org-dartlang-testcase:///issue47154c.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- B. (from org-dartlang-testcase:///issue47154c.dart:16:9)
+- C. (from org-dartlang-testcase:///issue47154c.dart:22:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.modular.expect
new file mode 100644
index 0000000..ff4b5b0
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/issue47462.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {}
+static method test() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = typedef-tearoff <T extends core::num>.(#C3<T>)
+  #C6 = instantiation #C5 <core::num*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart
index 19d9464..a192018 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart
@@ -14,6 +14,13 @@
         Alias.impl(),
         ImplAlias<String>()
       ]});
+
+  const Class.named(
+      {this.constants = const [
+        Const.impl(),
+        Alias.impl(),
+        ImplAlias<String>()
+      ]});
 }
 
 typedef Alias = Const;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.expect
index df41444..0e8c87e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.expect
@@ -6,7 +6,15 @@
 // Try changing type arguments so that they conform to the bounds.
 //         ImplAlias<String>()
 //         ^
-// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:25:19: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef ImplAlias<T extends num> = _ConstImpl<T>;
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:22:9: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'ImplAlias'.
+// Try changing type arguments so that they conform to the bounds.
+//         ImplAlias<String>()
+//         ^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef ImplAlias<T extends num> = _ConstImpl<T>;
 //                   ^
 //
@@ -15,13 +23,18 @@
 
 typedef Alias = self::Const;
 typedef ImplAlias<T extends core::num> = self::_ConstImpl<T>;
-class Class extends core::Object {
+class Class extends core::Object /*hasConstConstructor*/  {
   final field core::List<self::Const> constants;
   constructor •({core::List<self::Const> constants = #C3}) → self::Class
     : self::Class::constants = constants, super core::Object::•()
     ;
+  const constructor named({core::List<self::Const> constants = #C3}) → self::Class
+    : self::Class::constants = constants, super core::Object::•()
+    ;
   static method _#new#tearOff({core::List<self::Const> constants = #C3}) → self::Class
     return new self::Class::•(constants: constants);
+  static method _#named#tearOff({core::List<self::Const> constants = #C3}) → self::Class
+    return new self::Class::named(constants: constants);
 }
 abstract class Const extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
@@ -51,5 +64,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///const_redirect.dart:
-- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:28:9)
+- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:35:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.transformed.expect
index df41444..0e8c87e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.transformed.expect
@@ -6,7 +6,15 @@
 // Try changing type arguments so that they conform to the bounds.
 //         ImplAlias<String>()
 //         ^
-// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:25:19: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef ImplAlias<T extends num> = _ConstImpl<T>;
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:22:9: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'ImplAlias'.
+// Try changing type arguments so that they conform to the bounds.
+//         ImplAlias<String>()
+//         ^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef ImplAlias<T extends num> = _ConstImpl<T>;
 //                   ^
 //
@@ -15,13 +23,18 @@
 
 typedef Alias = self::Const;
 typedef ImplAlias<T extends core::num> = self::_ConstImpl<T>;
-class Class extends core::Object {
+class Class extends core::Object /*hasConstConstructor*/  {
   final field core::List<self::Const> constants;
   constructor •({core::List<self::Const> constants = #C3}) → self::Class
     : self::Class::constants = constants, super core::Object::•()
     ;
+  const constructor named({core::List<self::Const> constants = #C3}) → self::Class
+    : self::Class::constants = constants, super core::Object::•()
+    ;
   static method _#new#tearOff({core::List<self::Const> constants = #C3}) → self::Class
     return new self::Class::•(constants: constants);
+  static method _#named#tearOff({core::List<self::Const> constants = #C3}) → self::Class
+    return new self::Class::named(constants: constants);
 }
 abstract class Const extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
@@ -51,5 +64,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///const_redirect.dart:
-- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:28:9)
+- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:35:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.textual_outline.expect
index 2453b30..4601a8e 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.textual_outline.expect
@@ -6,6 +6,12 @@
         Alias.impl(),
         ImplAlias<String>()
       ]});
+  const Class.named(
+      {this.constants = const [
+        Const.impl(),
+        Alias.impl(),
+        ImplAlias<String>()
+      ]});
 }
 
 typedef Alias = Const;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.textual_outline_modelled.expect
index 615c4c2..3c229e1 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.textual_outline_modelled.expect
@@ -9,6 +9,12 @@
         Alias.impl(),
         ImplAlias<String>()
       ]});
+  const Class.named(
+      {this.constants = const [
+        Const.impl(),
+        Alias.impl(),
+        ImplAlias<String>()
+      ]});
   final List<Const> constants;
 }
 
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.expect
index 38c6a94..f957d96 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.expect
@@ -6,7 +6,15 @@
 // Try changing type arguments so that they conform to the bounds.
 //         ImplAlias<String>()
 //         ^
-// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:25:19: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef ImplAlias<T extends num> = _ConstImpl<T>;
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:22:9: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'ImplAlias'.
+// Try changing type arguments so that they conform to the bounds.
+//         ImplAlias<String>()
+//         ^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef ImplAlias<T extends num> = _ConstImpl<T>;
 //                   ^
 //
@@ -15,13 +23,18 @@
 
 typedef Alias = self::Const;
 typedef ImplAlias<T extends core::num> = self::_ConstImpl<T>;
-class Class extends core::Object {
+class Class extends core::Object /*hasConstConstructor*/  {
   final field core::List<self::Const> constants;
   constructor •({core::List<self::Const> constants = #C3}) → self::Class
     : self::Class::constants = constants, super core::Object::•()
     ;
+  const constructor named({core::List<self::Const> constants = #C3}) → self::Class
+    : self::Class::constants = constants, super core::Object::•()
+    ;
   static method _#new#tearOff({core::List<self::Const> constants = #C3}) → self::Class
     return new self::Class::•(constants: constants);
+  static method _#named#tearOff({core::List<self::Const> constants = #C3}) → self::Class
+    return new self::Class::named(constants: constants);
 }
 abstract class Const extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
@@ -51,5 +64,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///const_redirect.dart:
-- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:28:9)
+- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:35:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.modular.expect
new file mode 100644
index 0000000..f957d96
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:15:9: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'ImplAlias'.
+// Try changing type arguments so that they conform to the bounds.
+//         ImplAlias<String>()
+//         ^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef ImplAlias<T extends num> = _ConstImpl<T>;
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:22:9: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'ImplAlias'.
+// Try changing type arguments so that they conform to the bounds.
+//         ImplAlias<String>()
+//         ^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef ImplAlias<T extends num> = _ConstImpl<T>;
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Alias = self::Const;
+typedef ImplAlias<T extends core::num> = self::_ConstImpl<T>;
+class Class extends core::Object /*hasConstConstructor*/  {
+  final field core::List<self::Const> constants;
+  constructor •({core::List<self::Const> constants = #C3}) → self::Class
+    : self::Class::constants = constants, super core::Object::•()
+    ;
+  const constructor named({core::List<self::Const> constants = #C3}) → self::Class
+    : self::Class::constants = constants, super core::Object::•()
+    ;
+  static method _#new#tearOff({core::List<self::Const> constants = #C3}) → self::Class
+    return new self::Class::•(constants: constants);
+  static method _#named#tearOff({core::List<self::Const> constants = #C3}) → self::Class
+    return new self::Class::named(constants: constants);
+}
+abstract class Const extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  static factory impl() → self::Const
+    return new self::_ConstImpl::•<dynamic>();
+  static method _#impl#tearOff() → self::Const
+    return new self::_ConstImpl::•<dynamic>();
+}
+class _ConstImpl<T extends core::Object? = dynamic> extends core::Object implements self::Const /*hasConstConstructor*/  {
+  const constructor •() → self::_ConstImpl<self::_ConstImpl::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::_ConstImpl<self::_ConstImpl::_#new#tearOff::T%>
+    return new self::_ConstImpl::•<self::_ConstImpl::_#new#tearOff::T%>();
+}
+static method main() → dynamic {}
+static method _#ImplAlias#new#tearOff<T extends core::num>() → self::_ConstImpl<self::_#ImplAlias#new#tearOff::T>
+  return new self::_ConstImpl::•<self::_#ImplAlias#new#tearOff::T>();
+
+constants  {
+  #C1 = self::_ConstImpl<dynamic> {}
+  #C2 = self::_ConstImpl<core::String*> {}
+  #C3 = <self::Const*>[#C1, #C1, #C2]
+  #C4 = constructor-tearoff self::Const::impl
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_redirect.dart:
+- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:35:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.outline.expect
index 7fffaa8..b497969 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.outline.expect
@@ -1,15 +1,39 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:15:9: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'ImplAlias'.
+// Try changing type arguments so that they conform to the bounds.
+//         ImplAlias<String>()
+//         ^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef ImplAlias<T extends num> = _ConstImpl<T>;
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:22:9: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'ImplAlias'.
+// Try changing type arguments so that they conform to the bounds.
+//         ImplAlias<String>()
+//         ^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef ImplAlias<T extends num> = _ConstImpl<T>;
+//                   ^
+//
 import self as self;
 import "dart:core" as core;
 
 typedef Alias = self::Const;
 typedef ImplAlias<T extends core::num> = self::_ConstImpl<T>;
-class Class extends core::Object {
+class Class extends core::Object /*hasConstConstructor*/  {
   final field core::List<self::Const> constants;
-  constructor •({core::List<self::Const> constants}) → self::Class
+  constructor •({core::List<self::Const> constants = const <self::Const>[const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<core::String>()]}) → self::Class
+    ;
+  const constructor named({core::List<self::Const> constants = const <self::Const>[const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<core::String>()]}) → self::Class
+    : self::Class::constants = constants, super core::Object::•()
     ;
   static method _#new#tearOff({core::List<self::Const> constants}) → self::Class
     return new self::Class::•(constants: constants);
+  static method _#named#tearOff({core::List<self::Const> constants}) → self::Class
+    return new self::Class::named(constants: constants);
 }
 abstract class Const extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[self::Const::impl]/*isLegacy*/;
@@ -32,5 +56,7 @@
 
 
 Extra constant evaluation status:
-Evaluated: ConstructorTearOff @ org-dartlang-testcase:///const_redirect.dart:21:16 -> ConstructorTearOffConstant(Const.impl)
-Extra constant evaluation: evaluated: 8, effectively constant: 1
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_redirect.dart:12:25 -> ListConstant(const <Const*>[const _ConstImpl<dynamic>{}, const _ConstImpl<dynamic>{}, const _ConstImpl<String*>{}])
+Evaluated: ListLiteral @ org-dartlang-testcase:///const_redirect.dart:19:25 -> ListConstant(const <Const*>[const _ConstImpl<dynamic>{}, const _ConstImpl<dynamic>{}, const _ConstImpl<String*>{}])
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///const_redirect.dart:28:16 -> ConstructorTearOffConstant(Const.impl)
+Extra constant evaluation: evaluated: 13, effectively constant: 3
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.transformed.expect
index 38c6a94..f957d96 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.weak.transformed.expect
@@ -6,7 +6,15 @@
 // Try changing type arguments so that they conform to the bounds.
 //         ImplAlias<String>()
 //         ^
-// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:25:19: Context: This is the type variable whose bound isn't conformed to.
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef ImplAlias<T extends num> = _ConstImpl<T>;
+//                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:22:9: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'ImplAlias'.
+// Try changing type arguments so that they conform to the bounds.
+//         ImplAlias<String>()
+//         ^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart:32:19: Context: This is the type variable whose bound isn't conformed to.
 // typedef ImplAlias<T extends num> = _ConstImpl<T>;
 //                   ^
 //
@@ -15,13 +23,18 @@
 
 typedef Alias = self::Const;
 typedef ImplAlias<T extends core::num> = self::_ConstImpl<T>;
-class Class extends core::Object {
+class Class extends core::Object /*hasConstConstructor*/  {
   final field core::List<self::Const> constants;
   constructor •({core::List<self::Const> constants = #C3}) → self::Class
     : self::Class::constants = constants, super core::Object::•()
     ;
+  const constructor named({core::List<self::Const> constants = #C3}) → self::Class
+    : self::Class::constants = constants, super core::Object::•()
+    ;
   static method _#new#tearOff({core::List<self::Const> constants = #C3}) → self::Class
     return new self::Class::•(constants: constants);
+  static method _#named#tearOff({core::List<self::Const> constants = #C3}) → self::Class
+    return new self::Class::named(constants: constants);
 }
 abstract class Const extends core::Object {
   static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
@@ -51,5 +64,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///const_redirect.dart:
-- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:28:9)
+- _ConstImpl. (from org-dartlang-testcase:///const_redirect.dart:35:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..678c59b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart.weak.modular.expect
@@ -0,0 +1,230 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:73:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:74:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:89:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f4a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:103:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f5a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:104:8: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//     f5a(42, 87, 123); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:116:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f6a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:117:8: Error: Required named parameter 'field3' must be provided.
+//     f6a(42); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:118:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f6a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:119:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f6a(field1: 87, field2: 87); // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::Class1
+    return new self::Class1::•();
+}
+class Class2 extends core::Object {
+  constructor named() → self::Class2
+    : super core::Object::•()
+    ;
+  static method _#named#tearOff() → self::Class2
+    return new self::Class2::named();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  constructor •(core::int field) → self::Class3
+    : self::Class3::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field) → self::Class3
+    return new self::Class3::•(field);
+}
+class Class4 extends core::Object {
+  final field core::int? field;
+  constructor •([core::int? field = #C1]) → self::Class4
+    : self::Class4::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff([core::int? field = #C1]) → self::Class4
+    return new self::Class4::•(field);
+}
+class Class5 extends core::Object {
+  final field core::int field1;
+  final field core::int? field2;
+  constructor •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+    : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+    return new self::Class5::•(field1, field2);
+}
+class Class6 extends core::Object {
+  final field core::int field1;
+  final field core::int? field2;
+  final field core::int field3;
+  constructor •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+    : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+    return new self::Class6::•(field1, field2: field2, field3: field3);
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testNoArgs();
+  self::testArgs();
+}
+static method testNoArgs() → dynamic {
+  () → self::Class1 f1a = #C2;
+  self::Class1 c1a = f1a(){() → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  dynamic f1b = #C2;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → self::Class2 f2a = #C3;
+  self::Class2 c2a = f2a(){() → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  dynamic f2b = #C3;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+}
+static method testArgs() → dynamic {
+  (core::int) → self::Class3 f3a = #C4;
+  self::Class3 c3a = f3a(42){(core::int) → self::Class3};
+  self::expect(42, c3a.{self::Class3::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:73:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:74:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C4;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  ([core::int?]) → self::Class4 f4a = #C5;
+  self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
+  self::expect(null, c4a.{self::Class4::field}{core::int?});
+  self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
+  self::expect(42, c4b.{self::Class4::field}{core::int?});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:89:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f4a(42, 87); // error
+       ^" in f4a{<inapplicable>}.(42, 87);
+  };
+  dynamic f4b = #C5;
+  self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
+  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
+  self::expect(42, c5a.{self::Class5::field1}{core::int});
+  self::expect(null, c5a.{self::Class5::field2}{core::int?});
+  self::Class5 c5b = f5a(87, 42){(core::int, [core::int?]) → self::Class5};
+  self::expect(87, c5b.{self::Class5::field1}{core::int});
+  self::expect(42, c5b.{self::Class5::field2}{core::int?});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:103:8: Error: Too few positional arguments: 1 required, 0 given.
+    f5a(); // error
+       ^" in f5a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:104:8: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+    f5a(42, 87, 123); // error
+       ^" in f5a{<inapplicable>}.(42, 87, 123);
+  };
+  dynamic f5b = #C6;
+  self::throws(() → dynamic => f5b{dynamic}.call());
+  self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(42, c6a.{self::Class6::field1}{core::int});
+  self::expect(null, c6a.{self::Class6::field2}{core::int?});
+  self::expect(87, c6a.{self::Class6::field3}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:116:8: Error: Too few positional arguments: 1 required, 0 given.
+    f6a(); // error
+       ^" in f6a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:117:8: Error: Required named parameter 'field3' must be provided.
+    f6a(42); // error
+       ^" in f6a{<inapplicable>}.(42);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:118:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f6a(42, 87); // error
+       ^" in f6a{<inapplicable>}.(42, 87);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off.dart:119:8: Error: Too few positional arguments: 1 required, 0 given.
+    f6a(field1: 87, field2: 87); // error
+       ^" in f6a{<inapplicable>}.(field1: 87, field2: 87);
+  };
+  self::Class6 c6b = f6a(42, field2: 123, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(42, c6b.{self::Class6::field1}{core::int});
+  self::expect(123, c6b.{self::Class6::field2}{core::int?});
+  self::expect(87, c6b.{self::Class6::field3}{core::int});
+  self::Class6 c6c = f6a(87, field3: 42, field2: 123){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(87, c6c.{self::Class6::field1}{core::int});
+  self::expect(123, c6c.{self::Class6::field2}{core::int?});
+  self::expect(42, c6c.{self::Class6::field3}{core::int});
+  dynamic f6b = #C7;
+  self::throws(() → dynamic => f6b{dynamic}.call());
+  self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
+  self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
+  self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C8}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = null
+  #C2 = static-tearoff self::Class1::_#new#tearOff
+  #C3 = static-tearoff self::Class2::_#named#tearOff
+  #C4 = static-tearoff self::Class3::_#new#tearOff
+  #C5 = static-tearoff self::Class4::_#new#tearOff
+  #C6 = static-tearoff self::Class5::_#new#tearOff
+  #C7 = static-tearoff self::Class6::_#new#tearOff
+  #C8 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..9db8c5f
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart.weak.modular.expect
@@ -0,0 +1,98 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart:31:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f1a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart:47:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f2a(87); // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  final field core::int field;
+  constructor •([core::int field = #C1]) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff([core::int field = #C1]) → self::Class1
+    return new self::Class1::•(field);
+}
+class Class2 extends core::Object {
+  final field core::int field;
+  constructor •({core::int field = #C1}) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff({core::int field = #C1}) → self::Class2
+    return new self::Class2::•(field: field);
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testDefaultValues();
+}
+static method testDefaultValues() → void {
+  ([core::int]) → self::Class1 f1a = #C2;
+  self::Class1 c1a = f1a(){([core::int]) → self::Class1};
+  self::expect(42, c1a.{self::Class1::field}{core::int});
+  self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
+  self::expect(87, c1b.{self::Class1::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart:31:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f1a(42, 87); // error
+       ^" in f1a{<inapplicable>}.(42, 87);
+  };
+  dynamic f1b = #C2;
+  dynamic c1c = f1b{dynamic}.call();
+  self::expect(42, c1c{dynamic}.field);
+  dynamic c1d = f1b{dynamic}.call(87);
+  self::expect(87, c1d{dynamic}.field);
+  self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
+  ({field: core::int}) → self::Class2 f2a = #C3;
+  self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
+  self::expect(42, c2a.{self::Class2::field}{core::int});
+  self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
+  self::expect(87, c2b.{self::Class2::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart:47:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f2a(87); // error
+       ^" in f2a{<inapplicable>}.(87);
+  };
+  dynamic f2b = #C3;
+  dynamic c2c = f2b{dynamic}.call();
+  self::expect(42, c2c{dynamic}.field);
+  dynamic c2d = f2b{dynamic}.call(field: 87);
+  self::expect(87, c2d{dynamic}.field);
+  self::throws(() → dynamic => f2b{dynamic}.call(87));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C4}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = static-tearoff self::Class1::_#new#tearOff
+  #C3 = static-tearoff self::Class2::_#new#tearOff
+  #C4 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart.weak.outline.expect
index 128018d..c630d70 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_default_values.dart.weak.outline.expect
@@ -4,14 +4,14 @@
 
 class Class1 extends core::Object {
   final field core::int field;
-  constructor •([core::int field]) → self::Class1
+  constructor •([core::int field = 42]) → self::Class1
     ;
   static method _#new#tearOff([core::int field]) → self::Class1
     return new self::Class1::•(field);
 }
 class Class2 extends core::Object {
   final field core::int field;
-  constructor •({core::int field}) → self::Class2
+  constructor •({core::int field = 42}) → self::Class2
     ;
   static method _#new#tearOff({core::int field}) → self::Class2
     return new self::Class2::•(field: field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_uri.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_uri.dart.weak.modular.expect
new file mode 100644
index 0000000..8666359
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_uri.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_uri_part.dart:8:27: Error: A value of type 'Class Function()' can't be assigned to a variable of type 'Class Function(int)'.
+//  - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_uri.dart'.
+//   Class Function(int) f = Class.new;
+//                           ^
+//
+import self as self;
+import "dart:core" as core;
+
+part constructor_tear_off_uri_part.dart;
+class Class extends core::Object { // from org-dartlang-testcase:///constructor_tear_off_uri_part.dart
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
+}
+static method main() → dynamic {}
+static method /* from org-dartlang-testcase:///constructor_tear_off_uri_part.dart */ test() → dynamic {
+  (core::int) → self::Class f = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_uri_part.dart:8:27: Error: A value of type 'Class Function()' can't be assigned to a variable of type 'Class Function(int)'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/constructor_tear_off_uri.dart'.
+  Class Function(int) f = Class.new;
+                          ^" in #C1 as{TypeError,ForNonNullableByDefault} (core::int) → self::Class;
+}
+
+constants  {
+  #C1 = static-tearoff self::Class::_#new#tearOff
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart.weak.modular.expect
new file mode 100644
index 0000000..a612cdc
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:14:9: Error: 'AAlias' is already declared in this scope.
+// typedef AAlias = A; //  error
+//         ^^^^^^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:11:9: Context: Previous declaration of 'AAlias'.
+// typedef AAlias = A;
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:15:9: Error: 'AAlias' is already declared in this scope.
+// typedef AAlias = C<String>; // error
+//         ^^^^^^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:14:9: Context: Previous declaration of 'AAlias'.
+// typedef AAlias = A; //  error
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:16:9: Error: 'CAlias' is already declared in this scope.
+// typedef CAlias<T> = C<T>; //  error
+//         ^^^^^^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:12:9: Context: Previous declaration of 'CAlias'.
+// typedef CAlias<T> = C<T>;
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:17:9: Error: 'CAlias' is already declared in this scope.
+// typedef CAlias = C<String>; //  error
+//         ^^^^^^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:16:9: Context: Previous declaration of 'CAlias'.
+// typedef CAlias<T> = C<T>; //  error
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:18:9: Error: 'CAlias' is already declared in this scope.
+// typedef CAlias<T1, T2> = C<T1>; //  error
+//         ^^^^^^
+// pkg/front_end/testcases/constructor_tearoffs/lowering/duplicate_typedefs.dart:17:9: Context: Previous declaration of 'CAlias'.
+// typedef CAlias = C<String>; //  error
+//         ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias = self::A;
+typedef CAlias<T extends core::Object? = dynamic> = self::C<T%>;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::A
+    return new self::A::•();
+}
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::T%>
+    return new self::C::•<self::C::_#new#tearOff::T%>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..68c70e1
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart.weak.modular.expect
@@ -0,0 +1,254 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:82:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:83:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:98:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f4a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:112:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f5a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:113:8: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//     f5a(42, 87, 123); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:125:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f6a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:126:8: Error: Required named parameter 'field3' must be provided.
+//     f6a(42); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:127:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f6a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:128:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f6a(field1: 87, field2: 87); // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  constructor _() → self::Class1
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff() → self::Class1
+    return new self::Class1::_();
+  static factory •() → self::Class1
+    return new self::Class1::_();
+  static method _#new#tearOff() → self::Class1
+    return self::Class1::•();
+}
+class Class2 extends core::Object {
+  constructor _() → self::Class2
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff() → self::Class2
+    return new self::Class2::_();
+  static factory named() → self::Class2
+    return new self::Class2::_();
+  static method _#named#tearOff() → self::Class2
+    return self::Class2::named();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  constructor _(core::int field) → self::Class3
+    : self::Class3::field = field, super core::Object::•()
+    ;
+  static method _#_#tearOff(core::int field) → self::Class3
+    return new self::Class3::_(field);
+  static factory •(core::int field) → self::Class3
+    return new self::Class3::_(field);
+  static method _#new#tearOff(core::int field) → self::Class3
+    return self::Class3::•(field);
+}
+class Class4 extends core::Object {
+  final field core::int? field;
+  constructor _([core::int? field = #C1]) → self::Class4
+    : self::Class4::field = field, super core::Object::•()
+    ;
+  static method _#_#tearOff([core::int? field = #C1]) → self::Class4
+    return new self::Class4::_(field);
+  static factory •([core::int? field = #C1]) → self::Class4
+    return new self::Class4::_(field);
+  static method _#new#tearOff([core::int? field = #C1]) → self::Class4
+    return self::Class4::•(field);
+}
+class Class5 extends core::Object {
+  final field core::int field1;
+  final field core::int? field2;
+  constructor _(core::int field1, [core::int? field2 = #C1]) → self::Class5
+    : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
+    ;
+  static method _#_#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+    return new self::Class5::_(field1, field2);
+  static factory •(core::int field1, [core::int? field2 = #C1]) → self::Class5
+    return new self::Class5::_(field1, field2);
+  static method _#new#tearOff(core::int field1, [core::int? field2 = #C1]) → self::Class5
+    return self::Class5::•(field1, field2);
+}
+class Class6 extends core::Object {
+  final field core::int field1;
+  final field core::int? field2;
+  final field core::int field3;
+  constructor _(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+    : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
+    ;
+  static method _#_#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+    return new self::Class6::_(field1, field2: field2, field3: field3);
+  static factory •(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+    return new self::Class6::_(field1, field2: field2, field3: field3);
+  static method _#new#tearOff(core::int field1, {core::int? field2 = #C1, required core::int field3 = #C1}) → self::Class6
+    return self::Class6::•(field1, field2: field2, field3: field3);
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testNoArgs();
+  self::testArgs();
+}
+static method testNoArgs() → dynamic {
+  () → self::Class1 f1a = #C2;
+  self::Class1 c1a = f1a(){() → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  dynamic f1b = #C2;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → self::Class2 f2a = #C3;
+  self::Class2 c2a = f2a(){() → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  dynamic f2b = #C3;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+}
+static method testArgs() → dynamic {
+  (core::int) → self::Class3 f3a = #C4;
+  self::Class3 c3a = f3a(42){(core::int) → self::Class3};
+  self::expect(42, c3a.{self::Class3::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:82:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:83:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C4;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  ([core::int?]) → self::Class4 f4a = #C5;
+  self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
+  self::expect(null, c4a.{self::Class4::field}{core::int?});
+  self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
+  self::expect(42, c4b.{self::Class4::field}{core::int?});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:98:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f4a(42, 87); // error
+       ^" in f4a{<inapplicable>}.(42, 87);
+  };
+  dynamic f4b = #C5;
+  self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
+  (core::int, [core::int?]) → self::Class5 f5a = #C6;
+  self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
+  self::expect(42, c5a.{self::Class5::field1}{core::int});
+  self::expect(null, c5a.{self::Class5::field2}{core::int?});
+  self::Class5 c5b = f5a(87, 42){(core::int, [core::int?]) → self::Class5};
+  self::expect(87, c5b.{self::Class5::field1}{core::int});
+  self::expect(42, c5b.{self::Class5::field2}{core::int?});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:112:8: Error: Too few positional arguments: 1 required, 0 given.
+    f5a(); // error
+       ^" in f5a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:113:8: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+    f5a(42, 87, 123); // error
+       ^" in f5a{<inapplicable>}.(42, 87, 123);
+  };
+  dynamic f5b = #C6;
+  self::throws(() → dynamic => f5b{dynamic}.call());
+  self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C7;
+  self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(42, c6a.{self::Class6::field1}{core::int});
+  self::expect(null, c6a.{self::Class6::field2}{core::int?});
+  self::expect(87, c6a.{self::Class6::field3}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:125:8: Error: Too few positional arguments: 1 required, 0 given.
+    f6a(); // error
+       ^" in f6a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:126:8: Error: Required named parameter 'field3' must be provided.
+    f6a(42); // error
+       ^" in f6a{<inapplicable>}.(42);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:127:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f6a(42, 87); // error
+       ^" in f6a{<inapplicable>}.(42, 87);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off.dart:128:8: Error: Too few positional arguments: 1 required, 0 given.
+    f6a(field1: 87, field2: 87); // error
+       ^" in f6a{<inapplicable>}.(field1: 87, field2: 87);
+  };
+  self::Class6 c6b = f6a(42, field2: 123, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(42, c6b.{self::Class6::field1}{core::int});
+  self::expect(123, c6b.{self::Class6::field2}{core::int?});
+  self::expect(87, c6b.{self::Class6::field3}{core::int});
+  self::Class6 c6c = f6a(87, field3: 42, field2: 123){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(87, c6c.{self::Class6::field1}{core::int});
+  self::expect(123, c6c.{self::Class6::field2}{core::int?});
+  self::expect(42, c6c.{self::Class6::field3}{core::int});
+  dynamic f6b = #C7;
+  self::throws(() → dynamic => f6b{dynamic}.call());
+  self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
+  self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
+  self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C8}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = null
+  #C2 = static-tearoff self::Class1::_#new#tearOff
+  #C3 = static-tearoff self::Class2::_#named#tearOff
+  #C4 = static-tearoff self::Class3::_#new#tearOff
+  #C5 = static-tearoff self::Class4::_#new#tearOff
+  #C6 = static-tearoff self::Class5::_#new#tearOff
+  #C7 = static-tearoff self::Class6::_#new#tearOff
+  #C8 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..6ef9f15
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart.weak.modular.expect
@@ -0,0 +1,106 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart:33:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f1a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart:49:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f2a(87); // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  final field core::int field;
+  constructor _(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  static method _#_#tearOff(core::int field) → self::Class1
+    return new self::Class1::_(field);
+  static factory •([core::int field = #C1]) → self::Class1
+    return new self::Class1::_(field);
+  static method _#new#tearOff([core::int field = #C1]) → self::Class1
+    return self::Class1::•(field);
+}
+class Class2 extends core::Object {
+  final field core::int field;
+  constructor _(core::int field) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  static method _#_#tearOff(core::int field) → self::Class2
+    return new self::Class2::_(field);
+  static factory •({core::int field = #C1}) → self::Class2
+    return new self::Class2::_(field);
+  static method _#new#tearOff({core::int field = #C1}) → self::Class2
+    return self::Class2::•(field: field);
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testDefaultValues();
+}
+static method testDefaultValues() → void {
+  ([core::int]) → self::Class1 f1a = #C2;
+  self::Class1 c1a = f1a(){([core::int]) → self::Class1};
+  self::expect(42, c1a.{self::Class1::field}{core::int});
+  self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
+  self::expect(87, c1b.{self::Class1::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart:33:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f1a(42, 87); // error
+       ^" in f1a{<inapplicable>}.(42, 87);
+  };
+  dynamic f1b = #C2;
+  dynamic c1c = f1b{dynamic}.call();
+  self::expect(42, c1c{dynamic}.field);
+  dynamic c1d = f1b{dynamic}.call(87);
+  self::expect(87, c1d{dynamic}.field);
+  self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
+  ({field: core::int}) → self::Class2 f2a = #C3;
+  self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
+  self::expect(42, c2a.{self::Class2::field}{core::int});
+  self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
+  self::expect(87, c2b.{self::Class2::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/factory_tear_off_default_values.dart:49:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f2a(87); // error
+       ^" in f2a{<inapplicable>}.(87);
+  };
+  dynamic f2b = #C3;
+  dynamic c2c = f2b{dynamic}.call();
+  self::expect(42, c2c{dynamic}.field);
+  dynamic c2d = f2b{dynamic}.call(field: 87);
+  self::expect(87, c2d{dynamic}.field);
+  self::throws(() → dynamic => f2b{dynamic}.call(87));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C4}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = static-tearoff self::Class1::_#new#tearOff
+  #C3 = static-tearoff self::Class2::_#new#tearOff
+  #C4 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.modular.expect
new file mode 100644
index 0000000..c83f268
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart.weak.modular.expect
@@ -0,0 +1,187 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:44:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:45:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:62:8: Error: Expected 1 type arguments.
+//     f4a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:70:8: Error: Expected 0 type arguments.
+//     f4b<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:87:8: Error: Expected 1 type arguments.
+//     f4d<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:95:8: Error: Expected 0 type arguments.
+//     f4e<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:112:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f5a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:113:8: Error: Expected 1 type arguments.
+//     f5a<int, String>(); // error
+//        ^
+//
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  () → mai::Class1 f1a = #C1;
+  mai::Class1 c1a = f1a(){() → mai::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} mai::Class1);
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} mai::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → mai::Class2 f2a = #C2;
+  mai::Class2 c2a = f2a(){() → mai::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} mai::Class2);
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} mai::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+  () → mai::Class2 f2c = #C3;
+  mai::Class2 c2c = f2c(){() → mai::Class2};
+  self::expect(true, c2c is{ForNonNullableByDefault} mai::Class2);
+  dynamic f2d = #C3;
+  dynamic c2d = f2d{dynamic}.call();
+  self::expect(true, c2d is{ForNonNullableByDefault} mai::Class2);
+  self::expect(true, core::identical(f2c, f2d));
+  (core::int) → mai::Class3 f3a = #C4;
+  mai::Class3 c3a = f3a(42){(core::int) → mai::Class3};
+  self::expect(42, c3a.{mai::Class3::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:44:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:45:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C4;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  <T extends core::Object? = dynamic>() → mai::Class4<T%> f4a = #C5;
+  mai::Class4<dynamic> c4a = f4a<dynamic>(){() → mai::Class4<dynamic>};
+  self::expect(true, c4a is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4a is{ForNonNullableByDefault} mai::Class4<core::int>);
+  mai::Class4<core::int> c4b = f4a<core::int>(){() → mai::Class4<core::int>};
+  self::expect(true, c4b is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4b is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:62:8: Error: Expected 1 type arguments.
+    f4a<int, String>(); // error
+       ^" in f4a{<inapplicable>}.<core::int, core::String>();
+  };
+  () → mai::Class4<core::int> f4b = f4a<core::int>;
+  mai::Class4<core::int> c4c = f4b(){() → mai::Class4<core::int>};
+  self::expect(true, c4c is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4c is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:70:8: Error: Expected 0 type arguments.
+    f4b<int>(); // error
+       ^" in f4b{<inapplicable>}.<core::int>();
+  };
+  dynamic f4c = #C5;
+  dynamic c4d = f4c{dynamic}.call();
+  self::expect(true, c4d is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4d is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::throws(() → dynamic => f4c{dynamic}.call<core::int, core::String>());
+  <T extends core::Object? = dynamic>() → mai::Class4<T%> f4d = #C6;
+  mai::Class4<dynamic> c4e = f4d<dynamic>(){() → mai::Class4<dynamic>};
+  self::expect(true, c4e is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4e is{ForNonNullableByDefault} mai::Class4<core::int>);
+  mai::Class4<core::int> c4f = f4d<core::int>(){() → mai::Class4<core::int>};
+  self::expect(true, c4f is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4f is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:87:8: Error: Expected 1 type arguments.
+    f4d<int, String>(); // error
+       ^" in f4d{<inapplicable>}.<core::int, core::String>();
+  };
+  () → mai::Class4<core::int> f4e = f4d<core::int>;
+  mai::Class4<core::int> c4g = f4e(){() → mai::Class4<core::int>};
+  self::expect(true, c4g is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::expect(false, c4g is{ForNonNullableByDefault} mai::Class4<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:95:8: Error: Expected 0 type arguments.
+    f4e<int>(); // error
+       ^" in f4e{<inapplicable>}.<core::int>();
+  };
+  dynamic f4f = #C6;
+  dynamic c4h = f4f{dynamic}.call();
+  self::expect(true, c4h is{ForNonNullableByDefault} mai::Class4<dynamic>);
+  self::expect(false, c4h is{ForNonNullableByDefault} mai::Class4<core::int>);
+  self::throws(() → dynamic => f4f{dynamic}.call<core::int, core::String>());
+  <T extends core::num>() → mai::Class5<T> f5a = #C7;
+  mai::Class5<core::num> c5a = f5a<core::num>(){() → mai::Class5<core::num>};
+  self::expect(true, c5a is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5a is{ForNonNullableByDefault} mai::Class5<core::int>);
+  mai::Class5<core::int> c5b = f5a<core::int>(){() → mai::Class5<core::int>};
+  self::expect(true, c5b is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5b is{ForNonNullableByDefault} mai::Class5<core::double>);
+  () → Null {
+    f5a<core::String>(){() → mai::Class5<core::String>};
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/from_dill/main.dart:113:8: Error: Expected 1 type arguments.
+    f5a<int, String>(); // error
+       ^" in f5a{<inapplicable>}.<core::int, core::String>();
+  };
+  dynamic f5b = #C7;
+  dynamic c5c = f5b{dynamic}.call();
+  self::expect(true, c5c is{ForNonNullableByDefault} mai::Class5<core::num>);
+  self::expect(false, c5c is{ForNonNullableByDefault} mai::Class5<core::int>);
+  dynamic c5d = f5b{dynamic}.call<core::int>();
+  self::expect(true, c5d is{ForNonNullableByDefault} mai::Class5<core::int>);
+  self::expect(false, c5d is{ForNonNullableByDefault} mai::Class5<core::double>);
+  self::throws(() → dynamic => f5b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f5b{dynamic}.call<core::int, core::String>());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C8}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = static-tearoff mai::Class1::_#new#tearOff
+  #C2 = static-tearoff mai::Class2::_#named#tearOff
+  #C3 = static-tearoff mai::Class2::_#redirect#tearOff
+  #C4 = static-tearoff mai::Class3::_#new#tearOff
+  #C5 = static-tearoff mai::Class4::_#new#tearOff
+  #C6 = static-tearoff mai::Class4::_#redirect#tearOff
+  #C7 = static-tearoff mai::Class5::_#new#tearOff
+  #C8 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..7cca76e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart.weak.modular.expect
@@ -0,0 +1,180 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:24:8: Error: Expected 1 type arguments.
+//     f1a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:32:8: Error: Expected 0 type arguments.
+//     f1b<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:59:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f2a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:60:8: Error: Expected 1 type arguments.
+//     f2a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:81:8: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f3a<num, int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:95:18: Error: Inferred type argument 'Class4<Object?>' doesn't conform to the bound 'Class4<T>' of the type variable 'T' on 'call'.
+//  - 'Class4' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     var c4a = f4a(); // error
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class1<self::Class1::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
+    return new self::Class1::•<self::Class1::_#new#tearOff::T%>();
+}
+class Class2<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::Class2<self::Class2::T>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
+    return new self::Class2::•<self::Class2::_#new#tearOff::T>();
+}
+class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class3<self::Class3::T%, self::Class3::S%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
+    return new self::Class3::•<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
+}
+class Class4<T extends self::Class4<self::Class4::T> = self::Class4<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Class4<self::Class4::T>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
+    return new self::Class4::•<self::Class4::_#new#tearOff::T>();
+}
+class Class4int extends self::Class4<self::Class4int> {
+  synthetic constructor •() → self::Class4int
+    : super self::Class4::•()
+    ;
+  static method _#new#tearOff() → self::Class4int
+    return new self::Class4int::•();
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testGeneric();
+  self::testBounded();
+}
+static method testGeneric() → dynamic {
+  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C1;
+  self::Class1<dynamic> c1a = f1a<dynamic>(){() → self::Class1<dynamic>};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
+  self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::Class1<core::int> c1b = f1a<core::int>(){() → self::Class1<core::int>};
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::expect(false, c1b is{ForNonNullableByDefault} self::Class1<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:24:8: Error: Expected 1 type arguments.
+    f1a<int, String>(); // error
+       ^" in f1a{<inapplicable>}.<core::int, core::String>();
+  };
+  () → self::Class1<core::int> f1b = f1a<core::int>;
+  self::Class1<core::int> c1c = f1b(){() → self::Class1<core::int>};
+  self::expect(true, c1c is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::expect(false, c1c is{ForNonNullableByDefault} self::Class1<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:32:8: Error: Expected 0 type arguments.
+    f1b<int>(); // error
+       ^" in f1b{<inapplicable>}.<core::int>();
+  };
+  dynamic f1c = #C1;
+  dynamic c1d = f1c{dynamic}.call();
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
+  self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::throws(() → dynamic => f1c{dynamic}.call<core::int, core::String>());
+}
+static method testBounded() → dynamic {
+  <T extends core::num>() → self::Class2<T> f2a = #C2;
+  self::Class2<core::num> c2a = f2a<core::num>(){() → self::Class2<core::num>};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2<core::num>);
+  self::expect(false, c2a is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::Class2<core::int> c2b = f2a<core::int>(){() → self::Class2<core::int>};
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::expect(false, c2b is{ForNonNullableByDefault} self::Class2<core::double>);
+  () → Null {
+    f2a<core::String>(){() → self::Class2<core::String>};
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_constructor_tear_off.dart:60:8: Error: Expected 1 type arguments.
+    f2a<int, String>(); // error
+       ^" in f2a{<inapplicable>}.<core::int, core::String>();
+  };
+  dynamic f2b = #C2;
+  dynamic c2c = f2b{dynamic}.call();
+  self::expect(true, c2c is{ForNonNullableByDefault} self::Class2<core::num>);
+  self::expect(false, c2c is{ForNonNullableByDefault} self::Class2<core::int>);
+  dynamic c2d = f2b{dynamic}.call<core::int>();
+  self::expect(true, c2d is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::expect(false, c2d is{ForNonNullableByDefault} self::Class2<core::double>);
+  self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f2b{dynamic}.call<core::int, core::String>());
+  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C3;
+  self::Class3<dynamic, dynamic> c3a = f3a<dynamic, dynamic>(){() → self::Class3<dynamic, dynamic>};
+  self::expect(true, c3a is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
+  self::expect(false, c3a is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::Class3<core::int, core::num> c3b = f3a<core::int, core::num>(){() → self::Class3<core::int, core::num>};
+  self::expect(true, c3b is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::expect(false, c3b is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
+  () → Null {
+    f3a<core::num, core::int>(){() → self::Class3<core::num, core::int>};
+  };
+  dynamic f3b = #C3;
+  dynamic c3c = f3b{dynamic}.call();
+  self::expect(true, c3c is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
+  self::expect(false, c3c is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  dynamic c3d = f3b{dynamic}.call<core::int, core::num>();
+  self::expect(true, c3d is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::expect(false, c3d is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
+  self::throws(() → dynamic => f3b{dynamic}.call<core::num, core::int>());
+  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C4;
+  () → Null {
+    self::Class4<self::Class4<core::Object?>> c4a = f4a<self::Class4<core::Object?>>(){() → self::Class4<self::Class4<core::Object?>>};
+  };
+  dynamic f4b = #C4;
+  self::throws(() → dynamic => f4b{dynamic}.call());
+  dynamic c4b = f4b{dynamic}.call<self::Class4int>();
+  self::expect(true, c4b is{ForNonNullableByDefault} self::Class4<self::Class4int>);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C5}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = static-tearoff self::Class1::_#new#tearOff
+  #C2 = static-tearoff self::Class2::_#new#tearOff
+  #C3 = static-tearoff self::Class3::_#new#tearOff
+  #C4 = static-tearoff self::Class4::_#new#tearOff
+  #C5 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..2addbc7
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart.weak.modular.expect
@@ -0,0 +1,200 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:27:8: Error: Expected 1 type arguments.
+//     f1a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:35:8: Error: Expected 0 type arguments.
+//     f1b<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:74:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f2a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:75:8: Error: Expected 1 type arguments.
+//     f2a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:96:8: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f3a<num, int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:110:18: Error: Inferred type argument 'Class4<Object?>' doesn't conform to the bound 'Class4<T>' of the type variable 'T' on 'call'.
+//  - 'Class4' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     var c4a = f4a(); // error
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1<T extends core::Object? = dynamic> extends core::Object {
+  constructor _() → self::Class1<self::Class1::T%>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#_#tearOff::T%>
+    return new self::Class1::_<self::Class1::_#_#tearOff::T%>();
+  static factory •<T extends core::Object? = dynamic>() → self::Class1<self::Class1::•::T%>
+    return new self::Class1::_<self::Class1::•::T%>();
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
+    return self::Class1::•<self::Class1::_#new#tearOff::T%>();
+}
+class Class2<T extends core::num> extends core::Object {
+  constructor _() → self::Class2<self::Class2::T>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::num>() → self::Class2<self::Class2::_#_#tearOff::T>
+    return new self::Class2::_<self::Class2::_#_#tearOff::T>();
+  static factory •<T extends core::num>() → self::Class2<self::Class2::•::T>
+    return new self::Class2::_<self::Class2::•::T>();
+  static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
+    return self::Class2::•<self::Class2::_#new#tearOff::T>();
+}
+class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
+  constructor _() → self::Class3<self::Class3::T%, self::Class3::S%>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends self::Class3::_#_#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>
+    return new self::Class3::_<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>();
+  static factory •<T extends self::Class3::•::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::•::T%, self::Class3::•::S%>
+    return new self::Class3::_<self::Class3::•::T%, self::Class3::•::S%>();
+  static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
+    return self::Class3::•<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
+}
+class Class4<T extends self::Class4<self::Class4::T> = self::Class4<dynamic>> extends core::Object {
+  constructor _() → self::Class4<self::Class4::T>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends self::Class4<self::Class4::_#_#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#_#tearOff::T>
+    return new self::Class4::_<self::Class4::_#_#tearOff::T>();
+  static factory •<T extends self::Class4<self::Class4::•::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::•::T>
+    return new self::Class4::_<self::Class4::•::T>();
+  static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
+    return self::Class4::•<self::Class4::_#new#tearOff::T>();
+}
+class Class4int extends self::Class4<self::Class4int> {
+  constructor _() → self::Class4int
+    : super self::Class4::_()
+    ;
+  static method _#_#tearOff() → self::Class4int
+    return new self::Class4int::_();
+  static factory •() → self::Class4int
+    return new self::Class4int::_();
+  static method _#new#tearOff() → self::Class4int
+    return self::Class4int::•();
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testGeneric();
+  self::testBounded();
+}
+static method testGeneric() → dynamic {
+  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C1;
+  self::Class1<dynamic> c1a = f1a<dynamic>(){() → self::Class1<dynamic>};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
+  self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::Class1<core::int> c1b = f1a<core::int>(){() → self::Class1<core::int>};
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::expect(false, c1b is{ForNonNullableByDefault} self::Class1<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:27:8: Error: Expected 1 type arguments.
+    f1a<int, String>(); // error
+       ^" in f1a{<inapplicable>}.<core::int, core::String>();
+  };
+  () → self::Class1<core::int> f1b = f1a<core::int>;
+  self::Class1<core::int> c1c = f1b(){() → self::Class1<core::int>};
+  self::expect(true, c1c is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::expect(false, c1c is{ForNonNullableByDefault} self::Class1<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:35:8: Error: Expected 0 type arguments.
+    f1b<int>(); // error
+       ^" in f1b{<inapplicable>}.<core::int>();
+  };
+  dynamic f1c = #C1;
+  dynamic c1d = f1c{dynamic}.call();
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
+  self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::throws(() → dynamic => f1c{dynamic}.call<core::int, core::String>());
+}
+static method testBounded() → dynamic {
+  <T extends core::num>() → self::Class2<T> f2a = #C2;
+  self::Class2<core::num> c2a = f2a<core::num>(){() → self::Class2<core::num>};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2<core::num>);
+  self::expect(false, c2a is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::Class2<core::int> c2b = f2a<core::int>(){() → self::Class2<core::int>};
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::expect(false, c2b is{ForNonNullableByDefault} self::Class2<core::double>);
+  () → Null {
+    f2a<core::String>(){() → self::Class2<core::String>};
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_factory_tear_off.dart:75:8: Error: Expected 1 type arguments.
+    f2a<int, String>(); // error
+       ^" in f2a{<inapplicable>}.<core::int, core::String>();
+  };
+  dynamic f2b = #C2;
+  dynamic c2c = f2b{dynamic}.call();
+  self::expect(true, c2c is{ForNonNullableByDefault} self::Class2<core::num>);
+  self::expect(false, c2c is{ForNonNullableByDefault} self::Class2<core::int>);
+  dynamic c2d = f2b{dynamic}.call<core::int>();
+  self::expect(true, c2d is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::expect(false, c2d is{ForNonNullableByDefault} self::Class2<core::double>);
+  self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f2b{dynamic}.call<core::int, core::String>());
+  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C3;
+  self::Class3<dynamic, dynamic> c3a = f3a<dynamic, dynamic>(){() → self::Class3<dynamic, dynamic>};
+  self::expect(true, c3a is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
+  self::expect(false, c3a is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::Class3<core::int, core::num> c3b = f3a<core::int, core::num>(){() → self::Class3<core::int, core::num>};
+  self::expect(true, c3b is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::expect(false, c3b is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
+  () → Null {
+    f3a<core::num, core::int>(){() → self::Class3<core::num, core::int>};
+  };
+  dynamic f3b = #C3;
+  dynamic c3c = f3b{dynamic}.call();
+  self::expect(true, c3c is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
+  self::expect(false, c3c is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  dynamic c3d = f3b{dynamic}.call<core::int, core::num>();
+  self::expect(true, c3d is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::expect(false, c3d is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
+  self::throws(() → dynamic => f3b{dynamic}.call<core::num, core::int>());
+  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C4;
+  () → Null {
+    self::Class4<self::Class4<core::Object?>> c4a = f4a<self::Class4<core::Object?>>(){() → self::Class4<self::Class4<core::Object?>>};
+  };
+  dynamic f4b = #C4;
+  self::throws(() → dynamic => f4b{dynamic}.call());
+  dynamic c4b = f4b{dynamic}.call<self::Class4int>();
+  self::expect(true, c4b is{ForNonNullableByDefault} self::Class4<self::Class4int>);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C5}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = static-tearoff self::Class1::_#new#tearOff
+  #C2 = static-tearoff self::Class2::_#new#tearOff
+  #C3 = static-tearoff self::Class3::_#new#tearOff
+  #C4 = static-tearoff self::Class4::_#new#tearOff
+  #C5 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..81c7cd2
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart.weak.modular.expect
@@ -0,0 +1,210 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:27:8: Error: Expected 1 type arguments.
+//     f1a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:35:8: Error: Expected 0 type arguments.
+//     f1b<int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:74:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f2a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:75:8: Error: Expected 1 type arguments.
+//     f2a<int, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:96:8: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f3a<num, int>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:110:18: Error: Inferred type argument 'Class4<Object?>' doesn't conform to the bound 'Class4<T>' of the type variable 'T' on 'call'.
+//  - 'Class4' is from 'pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     var c4a = f4a(); // error
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _() → self::Class1<self::Class1::T%>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#_#tearOff::T%>
+    return new self::Class1::_<self::Class1::_#_#tearOff::T%>();
+  static factory •<T extends core::Object? = dynamic>() → self::Class1<self::Class1::•::T%>
+    return new self::Class1::_<self::Class1::•::T%>();
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class1<self::Class1::_#new#tearOff::T%>
+    return new self::Class1::_<self::Class1::_#new#tearOff::T%>();
+}
+class Class2<T extends core::num> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor _() → self::Class2<self::Class2::T>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends core::num>() → self::Class2<self::Class2::_#_#tearOff::T>
+    return new self::Class2::_<self::Class2::_#_#tearOff::T>();
+  static factory •<T extends core::num>() → self::Class2<self::Class2::•::T>
+    return new self::Class2::_<self::Class2::•::T>();
+  static method _#new#tearOff<T extends core::num>() → self::Class2<self::Class2::_#new#tearOff::T>
+    return new self::Class2::_<self::Class2::_#new#tearOff::T>();
+}
+class Class3<T extends self::Class3::S% = dynamic, S extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
+  constructor _() → self::Class3<self::Class3::T%, self::Class3::S%>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends self::Class3::_#_#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>
+    return new self::Class3::_<self::Class3::_#_#tearOff::T%, self::Class3::_#_#tearOff::S%>();
+  static factory •<T extends self::Class3::•::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::•::T%, self::Class3::•::S%>
+    return new self::Class3::_<self::Class3::•::T%, self::Class3::•::S%>();
+  static method _#new#tearOff<T extends self::Class3::_#new#tearOff::S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>
+    return new self::Class3::_<self::Class3::_#new#tearOff::T%, self::Class3::_#new#tearOff::S%>();
+}
+class Class4<T extends self::Class4<self::Class4::T> = self::Class4<dynamic>> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _() → self::Class4<self::Class4::T>
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff<T extends self::Class4<self::Class4::_#_#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#_#tearOff::T>
+    return new self::Class4::_<self::Class4::_#_#tearOff::T>();
+  static factory •<T extends self::Class4<self::Class4::•::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::•::T>
+    return new self::Class4::_<self::Class4::•::T>();
+  static method _#new#tearOff<T extends self::Class4<self::Class4::_#new#tearOff::T> = self::Class4<dynamic>>() → self::Class4<self::Class4::_#new#tearOff::T>
+    return new self::Class4::_<self::Class4::_#new#tearOff::T>();
+}
+class Class4int extends self::Class4<self::Class4int> {
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  constructor _() → self::Class4int
+    : super self::Class4::_()
+    ;
+  static method _#_#tearOff() → self::Class4int
+    return new self::Class4int::_();
+  static factory •() → self::Class4int
+    return new self::Class4int::_();
+  static method _#new#tearOff() → self::Class4int
+    return new self::Class4int::_();
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testGeneric();
+  self::testBounded();
+}
+static method testGeneric() → dynamic {
+  <T extends core::Object? = dynamic>() → self::Class1<T%> f1a = #C6;
+  self::Class1<dynamic> c1a = f1a<dynamic>(){() → self::Class1<dynamic>};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
+  self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::Class1<core::int> c1b = f1a<core::int>(){() → self::Class1<core::int>};
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::expect(false, c1b is{ForNonNullableByDefault} self::Class1<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:27:8: Error: Expected 1 type arguments.
+    f1a<int, String>(); // error
+       ^" in f1a{<inapplicable>}.<core::int, core::String>();
+  };
+  () → self::Class1<core::int> f1b = f1a<core::int>;
+  self::Class1<core::int> c1c = f1b(){() → self::Class1<core::int>};
+  self::expect(true, c1c is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::expect(false, c1c is{ForNonNullableByDefault} self::Class1<core::String>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:35:8: Error: Expected 0 type arguments.
+    f1b<int>(); // error
+       ^" in f1b{<inapplicable>}.<core::int>();
+  };
+  dynamic f1c = #C6;
+  dynamic c1d = f1c{dynamic}.call();
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1<dynamic>);
+  self::expect(false, c1a is{ForNonNullableByDefault} self::Class1<core::int>);
+  self::throws(() → dynamic => f1c{dynamic}.call<core::int, core::String>());
+}
+static method testBounded() → dynamic {
+  <T extends core::num>() → self::Class2<T> f2a = #C7;
+  self::Class2<core::num> c2a = f2a<core::num>(){() → self::Class2<core::num>};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2<core::num>);
+  self::expect(false, c2a is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::Class2<core::int> c2b = f2a<core::int>(){() → self::Class2<core::int>};
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::expect(false, c2b is{ForNonNullableByDefault} self::Class2<core::double>);
+  () → Null {
+    f2a<core::String>(){() → self::Class2<core::String>};
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/generic_redirecting_factory_tear_off.dart:75:8: Error: Expected 1 type arguments.
+    f2a<int, String>(); // error
+       ^" in f2a{<inapplicable>}.<core::int, core::String>();
+  };
+  dynamic f2b = #C7;
+  dynamic c2c = f2b{dynamic}.call();
+  self::expect(true, c2c is{ForNonNullableByDefault} self::Class2<core::num>);
+  self::expect(false, c2c is{ForNonNullableByDefault} self::Class2<core::int>);
+  dynamic c2d = f2b{dynamic}.call<core::int>();
+  self::expect(true, c2d is{ForNonNullableByDefault} self::Class2<core::int>);
+  self::expect(false, c2d is{ForNonNullableByDefault} self::Class2<core::double>);
+  self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f2b{dynamic}.call<core::int, core::String>());
+  <T extends S% = dynamic, S extends core::Object? = dynamic>() → self::Class3<T%, S%> f3a = #C8;
+  self::Class3<dynamic, dynamic> c3a = f3a<dynamic, dynamic>(){() → self::Class3<dynamic, dynamic>};
+  self::expect(true, c3a is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
+  self::expect(false, c3a is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::Class3<core::int, core::num> c3b = f3a<core::int, core::num>(){() → self::Class3<core::int, core::num>};
+  self::expect(true, c3b is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::expect(false, c3b is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
+  () → Null {
+    f3a<core::num, core::int>(){() → self::Class3<core::num, core::int>};
+  };
+  dynamic f3b = #C8;
+  dynamic c3c = f3b{dynamic}.call();
+  self::expect(true, c3c is{ForNonNullableByDefault} self::Class3<dynamic, dynamic>);
+  self::expect(false, c3c is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  dynamic c3d = f3b{dynamic}.call<core::int, core::num>();
+  self::expect(true, c3d is{ForNonNullableByDefault} self::Class3<core::int, core::num>);
+  self::expect(false, c3d is{ForNonNullableByDefault} self::Class3<core::double, core::num>);
+  self::throws(() → dynamic => f3b{dynamic}.call<core::num, core::int>());
+  <T extends self::Class4<T> = self::Class4<dynamic>>() → self::Class4<T> f4a = #C9;
+  () → Null {
+    self::Class4<self::Class4<core::Object?>> c4a = f4a<self::Class4<core::Object?>>(){() → self::Class4<self::Class4<core::Object?>>};
+  };
+  dynamic f4b = #C9;
+  self::throws(() → dynamic => f4b{dynamic}.call());
+  dynamic c4b = f4b{dynamic}.call<self::Class4int>();
+  self::expect(true, c4b is{ForNonNullableByDefault} self::Class4<self::Class4int>);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C10}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::•
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = constructor-tearoff self::Class4int::•
+  #C6 = static-tearoff self::Class1::_#new#tearOff
+  #C7 = static-tearoff self::Class2::_#new#tearOff
+  #C8 = static-tearoff self::Class3::_#new#tearOff
+  #C9 = static-tearoff self::Class4::_#new#tearOff
+  #C10 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..da67936
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart.weak.modular.expect
@@ -0,0 +1,97 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f1a(''); // error
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//     f2a(''); // error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field) → self::Class1
+    return new self::Class1::•(field);
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class2 extends core::Object implements self::Interface2 {
+  final field core::int field;
+  constructor •(core::int field) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field) → self::Class2
+    return new self::Class2::•(field);
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static field (core::int) → self::Class1 Class1_new = #C1;
+static field (core::int) → self::Class2 Class2_new = #C2;
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testInferred();
+}
+static method testInferred() → dynamic {
+  (core::int) → self::Class1 f1a = #C1;
+  self::expect(true, f1a is{ForNonNullableByDefault} (core::int) → self::Class1);
+  self::expect(false, f1a is{ForNonNullableByDefault} (core::String) → self::Class1);
+  self::Class1 c1a = f1a(0){(core::int) → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  () → Null {
+    f1a(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:38:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f1a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class1};
+  };
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call(0);
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::throws(() → dynamic => f1b{dynamic}.call(""));
+  (core::int) → self::Class2 f2a = #C2;
+  self::expect(true, f2a is{ForNonNullableByDefault} (core::int) → self::Class2);
+  self::expect(false, f2a is{ForNonNullableByDefault} (core::String) → self::Class2);
+  self::Class2 c2a = f2a(0){(core::int) → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  () → Null {
+    f2a(invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_constructor_tear_off.dart:52:9: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+    f2a(''); // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} core::int){(core::int) → self::Class2};
+  };
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call(0);
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::throws(() → dynamic => f2b{dynamic}.call(""));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C3}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = static-tearoff self::Class1::_#new#tearOff
+  #C2 = static-tearoff self::Class2::_#new#tearOff
+  #C3 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.modular.expect
new file mode 100644
index 0000000..6075c15
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.weak.modular.expect
@@ -0,0 +1,106 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends core::num> = self::A<X>;
+typedef G<unrelated Y extends core::Object? = dynamic> = self::A<core::int>;
+typedef H<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self::A<X%>;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
+    return new self::A::•<self::A::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
+    return new self::A::•<self::A::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#fact#tearOff::T%>
+    return self::A::fact<self::A::_#fact#tearOff::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
+    return new self::A::•<self::A::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#redirect#tearOff::T%>
+    return new self::A::•<self::A::_#redirect#tearOff::T%>();
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static const field () → self::A<core::int> f1a = #C3;
+static const field () → self::A<core::int> f1b = #C3;
+static const field () → self::A<core::int> f1c = #C3;
+static const field () → self::A<core::int> f1d = #C5;
+static const field () → self::A<core::int> f1e = #C5;
+static const field () → self::A<core::int> f1f = #C5;
+static const field () → self::A<core::int> f1g = #C7;
+static const field () → self::A<core::int> f1h = #C7;
+static const field () → self::A<core::int> f1i = #C7;
+static const field () → self::A<core::int> g1a = #C3;
+static const field () → self::A<core::int> g1b = #C3;
+static const field () → self::A<core::int> g1c = #C3;
+static const field () → self::A<core::int> h1a = #C3;
+static const field () → self::A<core::int> h1b = #C3;
+static const field () → self::A<core::int> h1c = #C3;
+static method main() → dynamic {
+  self::test<core::int>();
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C5, #C5);
+  core::identical(#C5, #C5);
+  core::identical(#C7, #C7);
+  core::identical(#C7, #C7);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+  core::identical(#C3, #C3);
+}
+static method test<T extends core::num>() → dynamic {
+  () → self::A<self::test::T> f2a = #C2<self::test::T>;
+  () → self::A<self::test::T> f2b = #C2<self::test::T>;
+  () → self::A<self::test::T> f2c = #C2<self::test::T>;
+  () → self::A<self::test::T> f2d = #C4<self::test::T>;
+  () → self::A<self::test::T> f2e = #C4<self::test::T>;
+  () → self::A<self::test::T> f2f = #C4<self::test::T>;
+  () → self::A<self::test::T> f2g = #C6<self::test::T>;
+  () → self::A<self::test::T> f2h = #C6<self::test::T>;
+  () → self::A<self::test::T> f2i = #C6<self::test::T>;
+  () → self::A<core::int> g2a = #C3;
+  () → self::A<core::int> g2b = #C3;
+  () → self::A<core::int> g2c = #C3;
+  () → self::A<self::test::T> h2a = #C2<self::test::T>;
+  () → self::A<self::test::T> h2b = #C2<self::test::T>;
+  () → self::A<self::test::T> h2c = #C2<self::test::T>;
+  self::expect(#C3, g2a);
+  self::expect(g2a, g2b);
+  if(self::inSoundMode) {
+    self::expect(g2a, g2c);
+  }
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method _#F#new#tearOff<X extends core::num>() → self::A<self::_#F#new#tearOff::X>
+  return new self::A::•<self::_#F#new#tearOff::X>();
+static method _#F#fact#tearOff<X extends core::num>() → self::A<self::_#F#fact#tearOff::X>
+  return self::A::fact<self::_#F#fact#tearOff::X>();
+static method _#F#redirect#tearOff<X extends core::num>() → self::A<self::_#F#redirect#tearOff::X>
+  return self::A::_#redirect#tearOff<self::_#F#redirect#tearOff::X>();
+static method _#G#new#tearOff<unrelated Y extends core::Object? = dynamic>() → self::A<core::int>
+  return new self::A::•<core::int>();
+static method _#G#fact#tearOff<unrelated Y extends core::Object? = dynamic>() → self::A<core::int>
+  return self::A::fact<core::int>();
+static method _#G#redirect#tearOff<unrelated Y extends core::Object? = dynamic>() → self::A<core::int>
+  return self::A::_#redirect#tearOff<core::int>();
+static method _#H#new#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>() → self::A<self::_#H#new#tearOff::X%>
+  return new self::A::•<self::_#H#new#tearOff::X%>();
+static method _#H#fact#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>() → self::A<self::_#H#fact#tearOff::X%>
+  return self::A::fact<self::_#H#fact#tearOff::X%>();
+static method _#H#redirect#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>() → self::A<self::_#H#redirect#tearOff::X%>
+  return self::A::_#redirect#tearOff<self::_#H#redirect#tearOff::X%>();
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = static-tearoff self::A::_#new#tearOff
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = static-tearoff self::A::_#fact#tearOff
+  #C5 = instantiation #C4 <core::int*>
+  #C6 = static-tearoff self::A::_#redirect#tearOff
+  #C7 = instantiation #C6 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..3414686
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_tear_off.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<unrelated T extends core::Object? = dynamic> = self::A;
+typedef G<unrelated T extends core::num> = self::B<dynamic>;
+class A extends core::Object {
+  field core::int field1 = 0;
+  constructor •(core::int field1) → self::A
+    : self::A::field1 = field1, super core::Object::•()
+    ;
+  constructor named(core::int field1) → self::A
+    : self::A::field1 = field1, super core::Object::•()
+    ;
+  static method _#new#tearOff(core::int field1) → self::A
+    return new self::A::•(field1);
+  static method _#named#tearOff(core::int field1) → self::A
+    return new self::A::named(field1);
+}
+class B<T extends core::Object? = dynamic> extends core::Object implements self::A {
+  field core::int field1;
+  covariant-by-class field self::B::T% field2;
+  constructor •(core::int field1, self::B::T% field2) → self::B<self::B::T%>
+    : self::B::field1 = field1, self::B::field2 = field2, super core::Object::•()
+    ;
+  constructor named(core::int field1, self::B::T% field2) → self::B<self::B::T%>
+    : self::B::field1 = field1, self::B::field2 = field2, super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>(core::int field1, self::B::_#new#tearOff::T% field2) → self::B<self::B::_#new#tearOff::T%>
+    return new self::B::•<self::B::_#new#tearOff::T%>(field1, field2);
+  static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field1, self::B::_#named#tearOff::T% field2) → self::B<self::B::_#named#tearOff::T%>
+    return new self::B::named<self::B::_#named#tearOff::T%>(field1, field2);
+}
+static field (core::int) → self::A A_new = #C1;
+static field <T extends core::Object? = dynamic>(core::int, T%) → self::B<T%> B_new = #C2;
+static field <unrelated T extends core::Object? = dynamic>(core::int) → self::A F_new = #C3;
+static field <unrelated T extends core::num>(core::int, dynamic) → self::B<dynamic> G_new = #C4;
+static field (core::int) → self::A A_named = #C5;
+static field (core::int, core::int) → self::B<core::int> B_named = #C7;
+static field <unrelated T extends core::Object? = dynamic>(core::int) → self::A F_named = #C8;
+static field (core::int, dynamic) → self::B<dynamic> G_named = #C9;
+static method main() → dynamic {}
+static method _#F#new#tearOff<unrelated T extends core::Object? = dynamic>(core::int field1) → self::A
+  return new self::A::•(field1);
+static method _#F#named#tearOff<unrelated T extends core::Object? = dynamic>(core::int field1) → self::A
+  return new self::A::named(field1);
+static method _#G#new#tearOff<unrelated T extends core::num>(core::int field1, dynamic field2) → self::B<dynamic>
+  return new self::B::•<dynamic>(field1, field2);
+static method _#G#named#tearOff<unrelated T extends core::num>(core::int field1, dynamic field2) → self::B<dynamic>
+  return new self::B::named<dynamic>(field1, field2);
+
+constants  {
+  #C1 = static-tearoff self::A::_#new#tearOff
+  #C2 = static-tearoff self::B::_#new#tearOff
+  #C3 = static-tearoff self::_#F#new#tearOff
+  #C4 = static-tearoff self::_#G#new#tearOff
+  #C5 = static-tearoff self::A::_#named#tearOff
+  #C6 = static-tearoff self::B::_#named#tearOff
+  #C7 = instantiation #C6 <core::int*>
+  #C8 = static-tearoff self::_#F#named#tearOff
+  #C9 = instantiation #C6 <dynamic>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.modular.expect
new file mode 100644
index 0000000..2a6bd0b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/issue47462.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = static-tearoff self::_#MyList#filled#tearOff
+  #C6 = instantiation #C5 <core::num*>
+  #C7 = null
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..309b5f6
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart.weak.modular.expect
@@ -0,0 +1,116 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:15:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   A.new<int>;
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:16:10: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   A.named<int>;
+//          ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:17:9: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   A.fact<int>;
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:18:13: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   A.redirect<int>;
+//             ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:19:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   B.new<int>;
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:20:10: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   B.named<int>;
+//          ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:21:9: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   B.fact<int>;
+//         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:22:13: Error: A constructor tear-off can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   B.redirect<int>;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef B<T extends core::num> = self::A<T>;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  constructor named() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
+    return new self::A::•<self::A::_#new#tearOff::T%>();
+  static method _#named#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#named#tearOff::T%>
+    return new self::A::named<self::A::_#named#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
+    return new self::A::•<self::A::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#fact#tearOff::T%>
+    return self::A::fact<self::A::_#fact#tearOff::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
+    return new self::A::•<self::A::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#redirect#tearOff::T%>
+    return new self::A::•<self::A::_#redirect#tearOff::T%>();
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:15:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  A.new<int>;
+       ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:16:10: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  A.named<int>;
+         ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:17:9: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  A.fact<int>;
+        ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:18:13: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  A.redirect<int>;
+            ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:19:8: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  B.new<int>;
+       ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:20:10: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  B.named<int>;
+         ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:21:9: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  B.fact<int>;
+        ^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/misplaced_type_arguments.dart:22:13: Error: A constructor tear-off can't have type arguments after the constructor name.
+Try removing the type arguments or placing them after the class name.
+  B.redirect<int>;
+            ^";
+}
+static method main() → dynamic {}
+static method _#B#new#tearOff<T extends core::num>() → self::A<self::_#B#new#tearOff::T>
+  return new self::A::•<self::_#B#new#tearOff::T>();
+static method _#B#named#tearOff<T extends core::num>() → self::A<self::_#B#named#tearOff::T>
+  return new self::A::named<self::_#B#named#tearOff::T>();
+static method _#B#fact#tearOff<T extends core::num>() → self::A<self::_#B#fact#tearOff::T>
+  return self::A::fact<self::_#B#fact#tearOff::T>();
+static method _#B#redirect#tearOff<T extends core::num>() → self::A<self::_#B#redirect#tearOff::T>
+  return self::A::_#redirect#tearOff<self::_#B#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirect
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.modular.expect
new file mode 100644
index 0000000..f19d273
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:10:23: Error: Redirection constructor target not found: 'Class.nonexisting'
+//   factory Class.a() = Class.nonexisting;
+//                       ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:11:23: Error: Redirection constructor target not found: 'Class.constructor'
+//   factory Class.b() = Class.constructor;
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static field () → self::Class field = () → self::Class => new self::Class::_();
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
+  constructor _() → self::Class
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff() → self::Class
+    return new self::Class::_();
+  static method constructor() → self::Class
+    return new self::Class::_();
+  static factory a() → self::Class
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:10:23: Error: Redirection constructor target not found: 'Class.nonexisting'
+  factory Class.a() = Class.nonexisting;
+                      ^";
+  static method _#a#tearOff() → self::Class;
+  static factory b() → self::Class
+    return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/missing_redirecting_target.dart:11:23: Error: Redirection constructor target not found: 'Class.constructor'
+  factory Class.b() = Class.constructor;
+                      ^";
+  static method _#b#tearOff() → self::Class;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::a
+  #C2 = constructor-tearoff self::Class::b
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect
new file mode 100644
index 0000000..841838c
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.modular.expect
@@ -0,0 +1,146 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C2]) → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
+    return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingGenerative#tearOff::T%>
+    return new self::Class::redirectingGenerative<self::Class::_#redirectingGenerative#tearOff::T%>(field);
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C2) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+    return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
+    return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>
+    return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
+  #C6;
+  #C7;
+  #C8;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C5 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C6 = instantiation #C3 <core::int*, core::String*>
+  #C7 = instantiation #C4 <core::int*, core::String*>
+  #C8 = instantiation #C5 <core::int*, core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
index 6aab2c5..37b4b1f 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
@@ -10,7 +10,7 @@
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
   static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field]) → self::Class<self::Class::T%>
+  constructor •([core::int field = 0]) → self::Class<self::Class::T%>
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
     ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/non_class_typedefs.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/non_class_typedefs.dart.weak.modular.expect
new file mode 100644
index 0000000..715328b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/non_class_typedefs.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef S1<unrelated T extends core::Object? = dynamic> = dynamic;
+typedef S2<unrelated T extends core::Object? = dynamic> = Null;
+typedef S3<unrelated T extends core::Object? = dynamic> = void;
+typedef S4<unrelated T extends core::Object? = dynamic> = FutureOr<dynamic>;
+typedef S5<T extends core::Object? = dynamic> = FutureOr<T%>;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.modular.expect
new file mode 100644
index 0000000..b2e567f
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/proper_rename.dart.weak.modular.expect
@@ -0,0 +1,108 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = self::A;
+typedef G0 = self::B<dynamic>;
+typedef G1 = self::B<core::int>;
+typedef G2<T extends core::Object? = dynamic> = self::B<T%>;
+typedef G3<T extends core::num> = self::B<T>;
+typedef H0 = self::C<dynamic, dynamic>;
+typedef H1 = self::C<core::int, core::String>;
+typedef H2<T extends core::Object? = dynamic> = self::C<core::int, T%>;
+typedef H3<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::C<T%, S%>;
+typedef H4<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::C<S%, T%>;
+typedef H5<T extends core::num, S extends core::Object? = dynamic> = self::C<T, S%>;
+typedef H6<T extends core::Object? = dynamic, S extends core::num> = self::C<T%, S>;
+typedef I0 = self::D<core::num>;
+typedef I1 = self::D<core::num>;
+typedef I2<T extends core::num> = self::D<T>;
+typedef I3<T extends core::int> = self::D<T>;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::A
+    return new self::A::•();
+}
+class B<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::B<self::B::_#new#tearOff::T%>
+    return new self::B::•<self::B::_#new#tearOff::T%>();
+}
+class C<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X%, self::C::Y%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::X%, self::C::_#new#tearOff::Y%>
+    return new self::C::•<self::C::_#new#tearOff::X%, self::C::_#new#tearOff::Y%>();
+}
+class D<X extends core::num> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<X extends core::num>() → self::D<self::D::_#new#tearOff::X>
+    return new self::D::•<self::D::_#new#tearOff::X>();
+}
+static method main() → dynamic {
+  () → self::A f = #C1;
+  () → self::B<dynamic> g0 = #C3;
+  () → self::B<core::int> g1 = #C4;
+  <T extends core::Object? = dynamic>() → self::B<T%> g2a = #C2;
+  () → self::B<core::int> g2b = #C4;
+  <T extends core::num>() → self::B<T> g3a = #C5;
+  () → self::B<core::int> g3b = #C4;
+  () → self::C<dynamic, dynamic> h0 = #C7;
+  () → self::C<core::int, core::String> h1 = #C8;
+  <T extends core::Object? = dynamic>() → self::C<core::int, T%> h2a = #C9;
+  () → self::C<core::int, core::int> h2b = #C10;
+  <X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → self::C<X%, Y%> h3a = #C6;
+  () → self::C<core::int, core::String> h3b = #C8;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>() → self::C<S%, T%> h4a = #C11;
+  () → self::C<core::String, core::int> h4b = #C12;
+  <T extends core::num, S extends core::Object? = dynamic>() → self::C<T, S%> h5a = #C13;
+  () → self::C<core::int, core::String> h5b = #C8;
+  <T extends core::Object? = dynamic, S extends core::num>() → self::C<T%, S> h6a = #C14;
+  () → self::C<core::String, core::int> h6b = #C12;
+  () → self::D<core::num> i0 = #C16;
+  () → self::D<core::num> i1 = #C16;
+  <X extends core::num>() → self::D<X> i2a = #C15;
+  () → self::D<core::int> i2b = #C17;
+  <T extends core::int>() → self::D<T> i3a = #C18;
+  () → self::D<core::int> i3b = #C17;
+}
+static method _#G3#new#tearOff<T extends core::num>() → self::B<self::_#G3#new#tearOff::T>
+  return new self::B::•<self::_#G3#new#tearOff::T>();
+static method _#H2#new#tearOff<T extends core::Object? = dynamic>() → self::C<core::int, self::_#H2#new#tearOff::T%>
+  return new self::C::•<core::int, self::_#H2#new#tearOff::T%>();
+static method _#H4#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>() → self::C<self::_#H4#new#tearOff::S%, self::_#H4#new#tearOff::T%>
+  return new self::C::•<self::_#H4#new#tearOff::S%, self::_#H4#new#tearOff::T%>();
+static method _#H5#new#tearOff<T extends core::num, S extends core::Object? = dynamic>() → self::C<self::_#H5#new#tearOff::T, self::_#H5#new#tearOff::S%>
+  return new self::C::•<self::_#H5#new#tearOff::T, self::_#H5#new#tearOff::S%>();
+static method _#H6#new#tearOff<T extends core::Object? = dynamic, S extends core::num>() → self::C<self::_#H6#new#tearOff::T%, self::_#H6#new#tearOff::S>
+  return new self::C::•<self::_#H6#new#tearOff::T%, self::_#H6#new#tearOff::S>();
+static method _#I3#new#tearOff<T extends core::int>() → self::D<self::_#I3#new#tearOff::T>
+  return new self::D::•<self::_#I3#new#tearOff::T>();
+
+constants  {
+  #C1 = static-tearoff self::A::_#new#tearOff
+  #C2 = static-tearoff self::B::_#new#tearOff
+  #C3 = instantiation #C2 <dynamic>
+  #C4 = instantiation #C2 <core::int*>
+  #C5 = static-tearoff self::_#G3#new#tearOff
+  #C6 = static-tearoff self::C::_#new#tearOff
+  #C7 = instantiation #C6 <dynamic, dynamic>
+  #C8 = instantiation #C6 <core::int*, core::String*>
+  #C9 = static-tearoff self::_#H2#new#tearOff
+  #C10 = instantiation #C6 <core::int*, core::int*>
+  #C11 = static-tearoff self::_#H4#new#tearOff
+  #C12 = instantiation #C6 <core::String*, core::int*>
+  #C13 = static-tearoff self::_#H5#new#tearOff
+  #C14 = static-tearoff self::_#H6#new#tearOff
+  #C15 = static-tearoff self::D::_#new#tearOff
+  #C16 = instantiation #C15 <core::num*>
+  #C17 = instantiation #C15 <core::int*>
+  #C18 = static-tearoff self::_#I3#new#tearOff
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..214d583
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart.weak.modular.expect
@@ -0,0 +1,332 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:101:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:102:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:117:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f4a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:131:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f5a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:132:8: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//     f5a(42, 87, 123); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:144:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f6a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:145:8: Error: Required named parameter 'field3' must be provided.
+//     f6a(42); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:146:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f6a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:147:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f6a(field1: 87, field2: 87); // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _() → self::Class1
+    : super core::Object::•()
+    ;
+  static method _#_#tearOff() → self::Class1
+    return new self::Class1::_();
+  static factory •() → self::Class1
+    return new self::Class1::_();
+  static method _#new#tearOff() → self::Class1
+    return new self::Class1::_();
+}
+class Class2 extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor __() → self::Class2
+    : super core::Object::•()
+    ;
+  static method _#__#tearOff() → self::Class2
+    return new self::Class2::__();
+  static factory _() → self::Class2
+    return new self::Class2::__();
+  static method _#_#tearOff() → self::Class2
+    return self::Class2::_();
+  static factory named() → self::Class2
+    return self::Class2::_();
+  static method _#named#tearOff() → self::Class2
+    return self::Class2::_();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
+  constructor _(core::int field) → self::Class3
+    : self::Class3::field = field, super core::Object::•()
+    ;
+  static method _#_#tearOff(core::int field) → self::Class3
+    return new self::Class3::_(field);
+  static factory •(core::int field) → self::Class3
+    return new self::Class3::_(field);
+  static method _#new#tearOff(core::int field) → self::Class3
+    return new self::Class3::_(field);
+}
+class Class4 extends core::Object {
+  final field core::int? field;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
+    : self::Class4::field = field, super core::Object::•()
+    ;
+  static method _#_#tearOff([core::int? field = #C5]) → self::Class4
+    return new self::Class4::_(field);
+  static factory •([core::int? field = #C5]) → self::Class4
+    return new self::Class4::_(field);
+  static method _#new#tearOff([core::int? field = #C5]) → self::Class4
+    return new self::Class4::_(field);
+}
+class Class5 extends core::Object {
+  final field core::int field1;
+  final field core::int? field2;
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
+    : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
+    ;
+  static method _#_#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
+    return new self::Class5::_(field1, field2);
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
+    return new self::Class5::_(field1, field2);
+  static method _#new#tearOff(core::int field1, [core::int? field2 = #C5]) → self::Class5
+    return new self::Class5::_(field1, field2);
+}
+class Class6 extends core::Object {
+  final field core::int field1;
+  final field core::int? field2;
+  final field core::int field3;
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
+    : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
+    ;
+  static method _#_#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
+    return new self::Class6::_(field1, field2: field2, field3: field3);
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
+    return new self::Class6::_(field1, field2: field2, field3: field3);
+  static method _#new#tearOff(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
+    return new self::Class6::_(field1, field2: field2, field3: field3);
+}
+class Class7a extends core::Object implements self::Class7b {
+  constructor •() → self::Class7a
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::Class7a
+    return new self::Class7a::•();
+}
+class Class7b extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
+  static factory •() → self::Class7b
+    return new self::Class7a::•();
+  static method _#new#tearOff() → self::Class7b
+    return new self::Class7a::•();
+}
+class Class8a<T extends core::Object? = dynamic> extends core::Object implements self::Class8b<self::Class8a::T%> {
+  constructor •() → self::Class8a<self::Class8a::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8a<self::Class8a::_#new#tearOff::T%>
+    return new self::Class8a::•<self::Class8a::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::Class8a<self::Class8a::fact::T%>
+    return new self::Class8a::•<self::Class8a::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::Class8a<self::Class8a::_#fact#tearOff::T%>
+    return self::Class8a::fact<self::Class8a::_#fact#tearOff::T%>();
+}
+class Class8b<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C9, #C10]/*isLegacy*/;
+  static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
+    return new self::Class8a::•<self::Class8b::•::T%>();
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#new#tearOff::T%>
+    return new self::Class8a::•<self::Class8b::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::fact::T%>
+    return self::Class8a::fact<self::Class8b::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::_#fact#tearOff::T%>
+    return self::Class8a::fact<self::Class8b::_#fact#tearOff::T%>();
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testNoArgs();
+  self::testArgs();
+}
+static method testNoArgs() → dynamic {
+  () → self::Class1 f1a = #C11;
+  self::Class1 c1a = f1a(){() → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  dynamic f1b = #C11;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → self::Class2 f2a = #C12;
+  self::Class2 c2a = f2a(){() → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  dynamic f2b = #C12;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+}
+static method testArgs() → dynamic {
+  (core::int) → self::Class3 f3a = #C13;
+  self::Class3 c3a = f3a(42){(core::int) → self::Class3};
+  self::expect(42, c3a.{self::Class3::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:101:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:102:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C13;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  ([core::int?]) → self::Class4 f4a = #C14;
+  self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
+  self::expect(null, c4a.{self::Class4::field}{core::int?});
+  self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
+  self::expect(42, c4b.{self::Class4::field}{core::int?});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:117:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f4a(42, 87); // error
+       ^" in f4a{<inapplicable>}.(42, 87);
+  };
+  dynamic f4b = #C14;
+  self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
+  (core::int, [core::int?]) → self::Class5 f5a = #C15;
+  self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
+  self::expect(42, c5a.{self::Class5::field1}{core::int});
+  self::expect(null, c5a.{self::Class5::field2}{core::int?});
+  self::Class5 c5b = f5a(87, 42){(core::int, [core::int?]) → self::Class5};
+  self::expect(87, c5b.{self::Class5::field1}{core::int});
+  self::expect(42, c5b.{self::Class5::field2}{core::int?});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:131:8: Error: Too few positional arguments: 1 required, 0 given.
+    f5a(); // error
+       ^" in f5a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:132:8: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+    f5a(42, 87, 123); // error
+       ^" in f5a{<inapplicable>}.(42, 87, 123);
+  };
+  dynamic f5b = #C15;
+  self::throws(() → dynamic => f5b{dynamic}.call());
+  self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C16;
+  self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(42, c6a.{self::Class6::field1}{core::int});
+  self::expect(null, c6a.{self::Class6::field2}{core::int?});
+  self::expect(87, c6a.{self::Class6::field3}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:144:8: Error: Too few positional arguments: 1 required, 0 given.
+    f6a(); // error
+       ^" in f6a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:145:8: Error: Required named parameter 'field3' must be provided.
+    f6a(42); // error
+       ^" in f6a{<inapplicable>}.(42);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:146:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f6a(42, 87); // error
+       ^" in f6a{<inapplicable>}.(42, 87);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off.dart:147:8: Error: Too few positional arguments: 1 required, 0 given.
+    f6a(field1: 87, field2: 87); // error
+       ^" in f6a{<inapplicable>}.(field1: 87, field2: 87);
+  };
+  self::Class6 c6b = f6a(42, field2: 123, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(42, c6b.{self::Class6::field1}{core::int});
+  self::expect(123, c6b.{self::Class6::field2}{core::int?});
+  self::expect(87, c6b.{self::Class6::field3}{core::int});
+  self::Class6 c6c = f6a(87, field3: 42, field2: 123){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(87, c6c.{self::Class6::field1}{core::int});
+  self::expect(123, c6c.{self::Class6::field2}{core::int?});
+  self::expect(42, c6c.{self::Class6::field3}{core::int});
+  dynamic f6b = #C16;
+  self::throws(() → dynamic => f6b{dynamic}.call());
+  self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
+  self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
+  self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
+  () → self::Class7b f7a = #C17;
+  self::Class7b c7a = f7a(){() → self::Class7b};
+  self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
+  self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C18;
+  self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
+  self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
+  self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
+  self::Class8b<core::int> c8b = f8a<core::int>(){() → self::Class8b<core::int>};
+  self::expect(true, c8b is{ForNonNullableByDefault} self::Class8a<core::int>);
+  self::expect(true, c8b is{ForNonNullableByDefault} self::Class8b<core::int>);
+  self::expect(false, c8b is{ForNonNullableByDefault} self::Class8b<core::String>);
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8b = #C19;
+  self::Class8b<dynamic> c8c = f8b<dynamic>(){() → self::Class8b<dynamic>};
+  self::expect(true, c8c is{ForNonNullableByDefault} self::Class8a<dynamic>);
+  self::expect(true, c8c is{ForNonNullableByDefault} self::Class8b<dynamic>);
+  self::Class8b<core::int> c8d = f8b<core::int>(){() → self::Class8b<core::int>};
+  self::expect(true, c8d is{ForNonNullableByDefault} self::Class8a<core::int>);
+  self::expect(true, c8d is{ForNonNullableByDefault} self::Class8b<core::int>);
+  self::expect(false, c8d is{ForNonNullableByDefault} self::Class8b<core::String>);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = constructor-tearoff self::Class8b::fact
+  #C11 = static-tearoff self::Class1::_#new#tearOff
+  #C12 = static-tearoff self::Class2::_#named#tearOff
+  #C13 = static-tearoff self::Class3::_#new#tearOff
+  #C14 = static-tearoff self::Class4::_#new#tearOff
+  #C15 = static-tearoff self::Class5::_#new#tearOff
+  #C16 = static-tearoff self::Class6::_#new#tearOff
+  #C17 = static-tearoff self::Class7b::_#new#tearOff
+  #C18 = static-tearoff self::Class8b::_#new#tearOff
+  #C19 = static-tearoff self::Class8b::_#fact#tearOff
+  #C20 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..8c398fe
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.modular.expect
@@ -0,0 +1,111 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart:33:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f1a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart:49:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f2a(87); // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  final field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _([core::int field = #C2]) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  static method _#_#tearOff([core::int field = #C2]) → self::Class1
+    return new self::Class1::_(field);
+  static factory •([core::int field = #C3]) → self::Class1
+    return new self::Class1::_(field);
+  static method _#new#tearOff([core::int field = #C2]) → self::Class1
+    return new self::Class1::_(field);
+}
+class Class2 extends core::Object {
+  final field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _({core::int field = #C2}) → self::Class2
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  static method _#_#tearOff({core::int field = #C2}) → self::Class2
+    return new self::Class2::_(field: field);
+  static factory •({core::int field = #C3}) → self::Class2
+    return new self::Class2::_(field: field);
+  static method _#new#tearOff({core::int field = #C2}) → self::Class2
+    return new self::Class2::_(field: field);
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testDefaultValues();
+}
+static method testDefaultValues() → void {
+  ([core::int]) → self::Class1 f1a = #C5;
+  self::Class1 c1a = f1a(){([core::int]) → self::Class1};
+  self::expect(42, c1a.{self::Class1::field}{core::int});
+  self::Class1 c1b = f1a(87){([core::int]) → self::Class1};
+  self::expect(87, c1b.{self::Class1::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart:33:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f1a(42, 87); // error
+       ^" in f1a{<inapplicable>}.(42, 87);
+  };
+  dynamic f1b = #C5;
+  dynamic c1c = f1b{dynamic}.call();
+  self::expect(42, c1c{dynamic}.field);
+  dynamic c1d = f1b{dynamic}.call(87);
+  self::expect(87, c1d{dynamic}.field);
+  self::throws(() → dynamic => f1b{dynamic}.call(42, 87));
+  ({field: core::int}) → self::Class2 f2a = #C6;
+  self::Class2 c2a = f2a(){({field: core::int}) → self::Class2};
+  self::expect(42, c2a.{self::Class2::field}{core::int});
+  self::Class2 c2b = f2a(field: 87){({field: core::int}) → self::Class2};
+  self::expect(87, c2b.{self::Class2::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart:49:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f2a(87); // error
+       ^" in f2a{<inapplicable>}.(87);
+  };
+  dynamic f2b = #C6;
+  dynamic c2c = f2b{dynamic}.call();
+  self::expect(42, c2c{dynamic}.field);
+  dynamic c2d = f2b{dynamic}.call(field: 87);
+  self::expect(87, c2d{dynamic}.field);
+  self::throws(() → dynamic => f2b{dynamic}.call(87));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C7}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = 42
+  #C3 = null
+  #C4 = constructor-tearoff self::Class2::•
+  #C5 = static-tearoff self::Class1::_#new#tearOff
+  #C6 = static-tearoff self::Class2::_#new#tearOff
+  #C7 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
index 20f744e..a220416 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 class Class1 extends core::Object {
   final field core::int field;
   static final field dynamic _redirecting# = <dynamic>[self::Class1::•]/*isLegacy*/;
-  constructor _([core::int field]) → self::Class1
+  constructor _([core::int field = 42]) → self::Class1
     ;
   static method _#_#tearOff([core::int field]) → self::Class1
     return new self::Class1::_(field);
@@ -17,7 +17,7 @@
 class Class2 extends core::Object {
   final field core::int field;
   static final field dynamic _redirecting# = <dynamic>[self::Class2::•]/*isLegacy*/;
-  constructor _({core::int field}) → self::Class2
+  constructor _({core::int field = 42}) → self::Class2
     ;
   static method _#_#tearOff({core::int field}) → self::Class2
     return new self::Class2::_(field: field);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect
new file mode 100644
index 0000000..aa8c2df
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.modular.expect
@@ -0,0 +1,244 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:58:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f1b(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:66:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f1c(42); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:67:8: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f1c(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:112:21: Error: No named parameter with the name 'field2'.
+//     f2c(field1: 42, field2: 87); // error
+//                     ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:123:9: Error: No named parameter with the name 'field1'.
+//     f2d(field1: 42, field2: 87); // error
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:131:9: Error: No named parameter with the name 'field1'.
+//     f2e(field1: 42); // error
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:132:9: Error: No named parameter with the name 'field2'.
+//     f2e(field2: 87); // error
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:133:9: Error: No named parameter with the name 'field1'.
+//     f2e(field1: 42, field2: 87); // error
+//         ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  final field core::int field1;
+  final field core::int field2;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5, #C6, #C7, #C8]/*isLegacy*/;
+  constructor positional([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
+    : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
+    ;
+  constructor named({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
+    : self::Class1::field1 = field1, self::Class1::field2 = field2, super core::Object::•()
+    ;
+  static method _#positional#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
+    return new self::Class1::positional(field1, field2);
+  static factory redirectPositionalSame([core::int field1 = #C11, core::int field2 = #C11]) → self::Class1
+    return new self::Class1::positional(field1, field2);
+  static method _#redirectPositionalSame#tearOff([core::int field1 = #C9, core::int field2 = #C10]) → self::Class1
+    return new self::Class1::positional(field1, field2);
+  static factory redirectPositionalFewer1([core::int field1 = #C11]) → self::Class1
+    return new self::Class1::positional(field1);
+  static method _#redirectPositionalFewer1#tearOff([core::int field1 = #C9]) → self::Class1
+    return new self::Class1::positional(field1);
+  static factory redirectPositionalFewer2() → self::Class1
+    return new self::Class1::positional();
+  static method _#redirectPositionalFewer2#tearOff() → self::Class1
+    return new self::Class1::positional();
+  static method _#named#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
+    return new self::Class1::named(field1: field1, field2: field2);
+  static factory redirectNamedSame({core::int field1 = #C11, core::int field2 = #C11}) → self::Class1
+    return new self::Class1::named(field1: field1, field2: field2);
+  static method _#redirectNamedSame#tearOff({core::int field1 = #C9, core::int field2 = #C10}) → self::Class1
+    return new self::Class1::named(field1: field1, field2: field2);
+  static factory redirectNamedReorder({core::int field2 = #C11, core::int field1 = #C11}) → self::Class1
+    return new self::Class1::named(field2: field2, field1: field1);
+  static method _#redirectNamedReorder#tearOff({core::int field2 = #C10, core::int field1 = #C9}) → self::Class1
+    return new self::Class1::named(field2: field2, field1: field1);
+  static factory redirectNamedFewer1({core::int field1 = #C11}) → self::Class1
+    return new self::Class1::named(field1: field1);
+  static method _#redirectNamedFewer1#tearOff({core::int field1 = #C9}) → self::Class1
+    return new self::Class1::named(field1: field1);
+  static factory redirectNamedFewer2({core::int field2 = #C11}) → self::Class1
+    return new self::Class1::named(field2: field2);
+  static method _#redirectNamedFewer2#tearOff({core::int field2 = #C10}) → self::Class1
+    return new self::Class1::named(field2: field2);
+  static factory redirectNamedFewer3() → self::Class1
+    return new self::Class1::named();
+  static method _#redirectNamedFewer3#tearOff() → self::Class1
+    return new self::Class1::named();
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testDefaultValues();
+}
+static method testDefaultValues() → dynamic {
+  ([core::int, core::int]) → self::Class1 f1a = #C12;
+  self::Class1 c1a = f1a(){([core::int, core::int]) → self::Class1};
+  self::expect(1, c1a.{self::Class1::field1}{core::int});
+  self::expect(2, c1a.{self::Class1::field2}{core::int});
+  self::Class1 c1b = f1a(42){([core::int, core::int]) → self::Class1};
+  self::expect(42, c1b.{self::Class1::field1}{core::int});
+  self::expect(2, c1b.{self::Class1::field2}{core::int});
+  self::Class1 c1c = f1a(42, 87){([core::int, core::int]) → self::Class1};
+  self::expect(42, c1c.{self::Class1::field1}{core::int});
+  self::expect(87, c1c.{self::Class1::field2}{core::int});
+  ([core::int]) → self::Class1 f1b = #C13;
+  self::Class1 c1d = f1b(){([core::int]) → self::Class1};
+  self::expect(1, c1d.{self::Class1::field1}{core::int});
+  self::expect(2, c1d.{self::Class1::field2}{core::int});
+  self::Class1 c1e = f1b(42){([core::int]) → self::Class1};
+  self::expect(42, c1e.{self::Class1::field1}{core::int});
+  self::expect(2, c1e.{self::Class1::field2}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:58:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f1b(42, 87); // error
+       ^" in f1b{<inapplicable>}.(42, 87);
+  };
+  () → self::Class1 f1c = #C14;
+  self::Class1 c1f = f1c(){() → self::Class1};
+  self::expect(1, c1f.{self::Class1::field1}{core::int});
+  self::expect(2, c1f.{self::Class1::field2}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:66:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f1c(42); // error
+       ^" in f1c{<inapplicable>}.(42);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:67:8: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f1c(42, 87); // error
+       ^" in f1c{<inapplicable>}.(42, 87);
+  };
+  ({field1: core::int, field2: core::int}) → self::Class1 f2a = #C15;
+  self::Class1 c2a = f2a(){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(1, c2a.{self::Class1::field1}{core::int});
+  self::expect(2, c2a.{self::Class1::field2}{core::int});
+  self::Class1 c2b = f2a(field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(42, c2b.{self::Class1::field1}{core::int});
+  self::expect(2, c2b.{self::Class1::field2}{core::int});
+  self::Class1 c2c = f2a(field1: 42, field2: 87){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(42, c2c.{self::Class1::field1}{core::int});
+  self::expect(87, c2c.{self::Class1::field2}{core::int});
+  self::Class1 c2d = f2a(field2: 87){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(1, c2d.{self::Class1::field1}{core::int});
+  self::expect(87, c2d.{self::Class1::field2}{core::int});
+  self::Class1 c2e = f2a(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(42, c2e.{self::Class1::field1}{core::int});
+  self::expect(87, c2e.{self::Class1::field2}{core::int});
+  ({field1: core::int, field2: core::int}) → self::Class1 f2b = #C16;
+  self::Class1 c3a = f2b(){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(1, c3a.{self::Class1::field1}{core::int});
+  self::expect(2, c3a.{self::Class1::field2}{core::int});
+  self::Class1 c3b = f2b(field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(42, c3b.{self::Class1::field1}{core::int});
+  self::expect(2, c3b.{self::Class1::field2}{core::int});
+  self::Class1 c3c = f2b(field1: 42, field2: 87){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(42, c3c.{self::Class1::field1}{core::int});
+  self::expect(87, c3c.{self::Class1::field2}{core::int});
+  self::Class1 c3d = f2b(field2: 87){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(1, c3d.{self::Class1::field1}{core::int});
+  self::expect(87, c3d.{self::Class1::field2}{core::int});
+  self::Class1 c3e = f2b(field2: 87, field1: 42){({field1: core::int, field2: core::int}) → self::Class1};
+  self::expect(42, c3e.{self::Class1::field1}{core::int});
+  self::expect(87, c3e.{self::Class1::field2}{core::int});
+  ({field1: core::int}) → self::Class1 f2c = #C17;
+  self::Class1 c4a = f2c(){({field1: core::int}) → self::Class1};
+  self::expect(1, c4a.{self::Class1::field1}{core::int});
+  self::expect(2, c4a.{self::Class1::field2}{core::int});
+  self::Class1 c4b = f2c(field1: 42){({field1: core::int}) → self::Class1};
+  self::expect(42, c4b.{self::Class1::field1}{core::int});
+  self::expect(2, c4b.{self::Class1::field2}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:112:21: Error: No named parameter with the name 'field2'.
+    f2c(field1: 42, field2: 87); // error
+                    ^^^^^^" in f2c{<inapplicable>}.(field1: 42, field2: 87);
+  };
+  ({field2: core::int}) → self::Class1 f2d = #C18;
+  self::Class1 c5a = f2d(){({field2: core::int}) → self::Class1};
+  self::expect(1, c5a.{self::Class1::field1}{core::int});
+  self::expect(2, c5a.{self::Class1::field2}{core::int});
+  self::Class1 c5b = f2d(field2: 87){({field2: core::int}) → self::Class1};
+  self::expect(1, c5b.{self::Class1::field1}{core::int});
+  self::expect(87, c5b.{self::Class1::field2}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:123:9: Error: No named parameter with the name 'field1'.
+    f2d(field1: 42, field2: 87); // error
+        ^^^^^^" in f2d{<inapplicable>}.(field1: 42, field2: 87);
+  };
+  () → self::Class1 f2e = #C19;
+  self::Class1 c6a = f2e(){() → self::Class1};
+  self::expect(1, c6a.{self::Class1::field1}{core::int});
+  self::expect(2, c6a.{self::Class1::field2}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:131:9: Error: No named parameter with the name 'field1'.
+    f2e(field1: 42); // error
+        ^^^^^^" in f2e{<inapplicable>}.(field1: 42);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:132:9: Error: No named parameter with the name 'field2'.
+    f2e(field2: 87); // error
+        ^^^^^^" in f2e{<inapplicable>}.(field2: 87);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart:133:9: Error: No named parameter with the name 'field1'.
+    f2e(field1: 42, field2: 87); // error
+        ^^^^^^" in f2e{<inapplicable>}.(field1: 42, field2: 87);
+  };
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C20}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::redirectPositionalSame
+  #C2 = constructor-tearoff self::Class1::redirectPositionalFewer1
+  #C3 = constructor-tearoff self::Class1::redirectPositionalFewer2
+  #C4 = constructor-tearoff self::Class1::redirectNamedSame
+  #C5 = constructor-tearoff self::Class1::redirectNamedReorder
+  #C6 = constructor-tearoff self::Class1::redirectNamedFewer1
+  #C7 = constructor-tearoff self::Class1::redirectNamedFewer2
+  #C8 = constructor-tearoff self::Class1::redirectNamedFewer3
+  #C9 = 1
+  #C10 = 2
+  #C11 = null
+  #C12 = static-tearoff self::Class1::_#redirectPositionalSame#tearOff
+  #C13 = static-tearoff self::Class1::_#redirectPositionalFewer1#tearOff
+  #C14 = static-tearoff self::Class1::_#redirectPositionalFewer2#tearOff
+  #C15 = static-tearoff self::Class1::_#redirectNamedSame#tearOff
+  #C16 = static-tearoff self::Class1::_#redirectNamedReorder#tearOff
+  #C17 = static-tearoff self::Class1::_#redirectNamedFewer1#tearOff
+  #C18 = static-tearoff self::Class1::_#redirectNamedFewer2#tearOff
+  #C19 = static-tearoff self::Class1::_#redirectNamedFewer3#tearOff
+  #C20 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
index 7cf24c4..d465217 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/redirecting_factory_tear_off_default_values_complex.dart.weak.outline.expect
@@ -6,9 +6,9 @@
   final field core::int field1;
   final field core::int field2;
   static final field dynamic _redirecting# = <dynamic>[self::Class1::redirectPositionalSame, self::Class1::redirectPositionalFewer1, self::Class1::redirectPositionalFewer2, self::Class1::redirectNamedSame, self::Class1::redirectNamedReorder, self::Class1::redirectNamedFewer1, self::Class1::redirectNamedFewer2, self::Class1::redirectNamedFewer3]/*isLegacy*/;
-  constructor positional([core::int field1, core::int field2]) → self::Class1
+  constructor positional([core::int field1 = 1, core::int field2 = 2]) → self::Class1
     ;
-  constructor named({core::int field1, core::int field2}) → self::Class1
+  constructor named({core::int field1 = 1, core::int field2 = 2}) → self::Class1
     ;
   static method _#positional#tearOff([core::int field1, core::int field2]) → self::Class1
     return new self::Class1::positional(field1, field2);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.modular.expect
new file mode 100644
index 0000000..01b742d
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.modular.expect
@@ -0,0 +1,126 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///typedef_from_lib.dart";
+
+part typedef_from_part.dart;
+typedef B<S extends core::Object? = dynamic> = self::Class<S%, core::int>;
+class Class<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •(self::Class::S% a, self::Class::T% b) → self::Class<self::Class::S%, self::Class::T%>
+    : super core::Object::•()
+    ;
+  constructor named(self::Class::S% a, [self::Class::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::S%, self::Class::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#new#tearOff::S% a, self::Class::_#new#tearOff::T% b) → self::Class<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>(a, b);
+  static method _#named#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#named#tearOff::S% a, [self::Class::_#named#tearOff::T? b = #C2, core::int c = #C3]) → self::Class<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>
+    return new self::Class::named<self::Class::_#named#tearOff::S%, self::Class::_#named#tearOff::T%>(a, b, c);
+  static factory fact<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::fact::S% a, {self::Class::fact::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::fact::S%, self::Class::fact::T%>
+    return new self::Class::named<self::Class::fact::S%, self::Class::fact::T%>(a, b, c);
+  static method _#fact#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#fact#tearOff::S% a, {self::Class::_#fact#tearOff::T? b = #C2, core::int c = #C3}) → self::Class<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::S%, self::Class::_#fact#tearOff::T%>(a, b: b, c: c);
+  static factory redirect<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::redirect::S% a) → self::Class<self::Class::redirect::S%, self::Class::redirect::T%>
+    return new self::Class::named<self::Class::redirect::S%, self::Class::redirect::T%>(a);
+  static method _#redirect#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#redirect#tearOff::S% a) → self::Class<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>
+    return new self::Class::named<self::Class::_#redirect#tearOff::S%, self::Class::_#redirect#tearOff::T%>(a);
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic>(T%, core::String) → self::Class<T%, core::String> aNew = #C4;
+  <T extends core::Object? = dynamic>(T%, [core::String?, core::int]) → self::Class<T%, core::String> aNamed = #C5;
+  <T extends core::Object? = dynamic>(T%, {b: core::String?, c: core::int}) → self::Class<T%, core::String> aFact = #C6;
+  <T extends core::Object? = dynamic>(T%) → self::Class<T%, core::String> aRedirect = #C7;
+  aNew<core::String>("", ""){(core::String, core::String) → self::Class<core::String, core::String>};
+  aNew<core::int>(0, ""){(core::int, core::String) → self::Class<core::int, core::String>};
+  aNamed<core::String>(""){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
+  aNamed<core::int>(0, ""){(core::int, [core::String?, core::int]) → self::Class<core::int, core::String>};
+  aNamed<core::String>("", "", 87){(core::String, [core::String?, core::int]) → self::Class<core::String, core::String>};
+  aFact<core::int>(0){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aFact<core::int>(0, c: 87){(core::int, {b: core::String?, c: core::int}) → self::Class<core::int, core::String>};
+  aFact<core::String>("", c: 87, b: ""){(core::String, {b: core::String?, c: core::int}) → self::Class<core::String, core::String>};
+  aRedirect<core::String>(""){(core::String) → self::Class<core::String, core::String>};
+  aRedirect<core::int>(0){(core::int) → self::Class<core::int, core::String>};
+  (core::bool, core::String) → self::Class<core::bool, core::String> aNewInst = aNew<core::bool>;
+  (core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String> aNamedInst = aNamed<core::bool>;
+  (core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String> aFactInst = aFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::String> aRedirectInst = aRedirect<core::bool>;
+  aNewInst(true, ""){(core::bool, core::String) → self::Class<core::bool, core::String>};
+  aNamedInst(false){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(true, ""){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aNamedInst(false, "", 87){(core::bool, [core::String?, core::int]) → self::Class<core::bool, core::String>};
+  aFactInst(true){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  aFactInst(false, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  aFactInst(true, c: 87){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  aFactInst(false, c: 87, b: ""){(core::bool, {b: core::String?, c: core::int}) → self::Class<core::bool, core::String>};
+  aRedirectInst(true){(core::bool) → self::Class<core::bool, core::String>};
+  <S extends core::Object? = dynamic>(S%, core::int) → self::Class<S%, core::int> bNew = #C8;
+  <S extends core::Object? = dynamic>(S%, [core::int?, core::int]) → self::Class<S%, core::int> bNamed = #C9;
+  <S extends core::Object? = dynamic>(S%, {b: core::int?, c: core::int}) → self::Class<S%, core::int> bFact = #C10;
+  <S extends core::Object? = dynamic>(S%) → self::Class<S%, core::int> bRedirect = #C11;
+  bNew<core::String>("", 0){(core::String, core::int) → self::Class<core::String, core::int>};
+  bNew<core::int>(0, 0){(core::int, core::int) → self::Class<core::int, core::int>};
+  bNamed<core::String>(""){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
+  bNamed<core::int>(0, 0){(core::int, [core::int?, core::int]) → self::Class<core::int, core::int>};
+  bNamed<core::String>("", 0, 87){(core::String, [core::int?, core::int]) → self::Class<core::String, core::int>};
+  bFact<core::int>(0){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bFact<core::int>(0, c: 87){(core::int, {b: core::int?, c: core::int}) → self::Class<core::int, core::int>};
+  bFact<core::String>("", c: 87, b: 0){(core::String, {b: core::int?, c: core::int}) → self::Class<core::String, core::int>};
+  bRedirect<core::String>(""){(core::String) → self::Class<core::String, core::int>};
+  bRedirect<core::int>(0){(core::int) → self::Class<core::int, core::int>};
+  (core::bool, core::int) → self::Class<core::bool, core::int> bNewInst = bNew<core::bool>;
+  (core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int> bNamedInst = bNamed<core::bool>;
+  (core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int> bFactInst = bFact<core::bool>;
+  (core::bool) → self::Class<core::bool, core::int> bRedirectInst = bRedirect<core::bool>;
+  bNewInst(true, 0){(core::bool, core::int) → self::Class<core::bool, core::int>};
+  bNamedInst(false){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(true, 0){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bNamedInst(false, 0, 87){(core::bool, [core::int?, core::int]) → self::Class<core::bool, core::int>};
+  bFactInst(true){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(true, c: 87){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bFactInst(false, c: 87, b: 0){(core::bool, {b: core::int?, c: core::int}) → self::Class<core::bool, core::int>};
+  bRedirectInst(true){(core::bool) → self::Class<core::bool, core::int>};
+}
+static method _#B#new#tearOff<S extends core::Object? = dynamic>(self::_#B#new#tearOff::S% a, core::int b) → self::Class<self::_#B#new#tearOff::S%, core::int>
+  return new self::Class::•<self::_#B#new#tearOff::S%, core::int>(a, b);
+static method _#B#named#tearOff<S extends core::Object? = dynamic>(self::_#B#named#tearOff::S% a, [core::int? b = #C2, core::int c = #C3]) → self::Class<self::_#B#named#tearOff::S%, core::int>
+  return new self::Class::named<self::_#B#named#tearOff::S%, core::int>(a, b, c);
+static method _#B#fact#tearOff<S extends core::Object? = dynamic>(self::_#B#fact#tearOff::S% a, {core::int? b = #C2, core::int c = #C3}) → self::Class<self::_#B#fact#tearOff::S%, core::int>
+  return self::Class::fact<self::_#B#fact#tearOff::S%, core::int>(a, b: b, c: c);
+static method _#B#redirect#tearOff<S extends core::Object? = dynamic>(self::_#B#redirect#tearOff::S% a) → self::Class<self::_#B#redirect#tearOff::S%, core::int>
+  return self::Class::_#redirect#tearOff<self::_#B#redirect#tearOff::S%, core::int>(a);
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+import "typedef_from.dart" as self;
+
+import "org-dartlang-testcase:///typedef_from.dart";
+
+typedef A<T extends core::Object? = dynamic> = self::Class<T%, core::String>;
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#new#tearOff<T extends core::Object? = dynamic>(self2::_#A#new#tearOff::T% a, core::String b) → self::Class<self2::_#A#new#tearOff::T%, core::String>
+  return new self::Class::•<self2::_#A#new#tearOff::T%, core::String>(a, b);
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#named#tearOff<T extends core::Object? = dynamic>(self2::_#A#named#tearOff::T% a, [core::String? b = #C2, core::int c = #C3]) → self::Class<self2::_#A#named#tearOff::T%, core::String>
+  return new self::Class::named<self2::_#A#named#tearOff::T%, core::String>(a, b, c);
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#fact#tearOff<T extends core::Object? = dynamic>(self2::_#A#fact#tearOff::T% a, {core::String? b = #C2, core::int c = #C3}) → self::Class<self2::_#A#fact#tearOff::T%, core::String>
+  return self::Class::fact<self2::_#A#fact#tearOff::T%, core::String>(a, b: b, c: c);
+static method /* from org-dartlang-testcase:///typedef_from.dart */ _#A#redirect#tearOff<T extends core::Object? = dynamic>(self2::_#A#redirect#tearOff::T% a) → self::Class<self2::_#A#redirect#tearOff::T%, core::String>
+  return self::Class::_#redirect#tearOff<self2::_#A#redirect#tearOff::T%, core::String>(a);
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = null
+  #C3 = 42
+  #C4 = static-tearoff self2::_#A#new#tearOff
+  #C5 = static-tearoff self2::_#A#named#tearOff
+  #C6 = static-tearoff self2::_#A#fact#tearOff
+  #C7 = static-tearoff self2::_#A#redirect#tearOff
+  #C8 = static-tearoff self::_#B#new#tearOff
+  #C9 = static-tearoff self::_#B#named#tearOff
+  #C10 = static-tearoff self::_#B#fact#tearOff
+  #C11 = static-tearoff self::_#B#redirect#tearOff
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
index 9f1b30a..757a1e2 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from.dart.weak.outline.expect
@@ -10,7 +10,7 @@
   static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
   constructor •(self::Class::S% a, self::Class::T% b) → self::Class<self::Class::S%, self::Class::T%>
     ;
-  constructor named(self::Class::S% a, [self::Class::T? b, core::int c]) → self::Class<self::Class::S%, self::Class::T%>
+  constructor named(self::Class::S% a, [self::Class::T? b, core::int c = 42]) → self::Class<self::Class::S%, self::Class::T%>
     ;
   static method _#new#tearOff<S extends core::Object? = dynamic, T extends core::Object? = dynamic>(self::Class::_#new#tearOff::S% a, self::Class::_#new#tearOff::T% b) → self::Class<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>
     return new self::Class::•<self::Class::_#new#tearOff::S%, self::Class::_#new#tearOff::T%>(a, b);
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.modular.expect
new file mode 100644
index 0000000..fa9d121
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_from_dill/main.dart.weak.modular.expect
@@ -0,0 +1,89 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+typedef H<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = mai::A<Y%>;
+static field dynamic H_new = #C1;
+static field dynamic H_named = #C2;
+static field dynamic H_fact = #C3;
+static field dynamic H_redirect = #C4;
+static field dynamic F_new = #C5;
+static field dynamic F_named = #C6;
+static field dynamic F_fact = #C7;
+static field dynamic F_redirect = #C8;
+static method main() → dynamic {
+  self::expect(true, core::identical(self::F_new, mai::F_new_lib));
+  self::expect(false, core::identical(self::F_new, mai::F_named_lib));
+  self::expect(false, core::identical(self::F_new, mai::F_fact_lib));
+  self::expect(false, core::identical(self::F_new, mai::F_redirect_lib));
+  self::expect(false, core::identical(self::F_new, mai::G_new_lib));
+  self::expect(false, core::identical(self::F_new, mai::G_named_lib));
+  self::expect(false, core::identical(self::F_new, mai::G_fact_lib));
+  self::expect(false, core::identical(self::F_new, mai::G_redirect_lib));
+  self::expect(false, core::identical(self::F_new, self::H_new));
+  self::expect(false, core::identical(self::F_new, self::H_named));
+  self::expect(false, core::identical(self::F_new, self::H_fact));
+  self::expect(false, core::identical(self::F_new, self::H_redirect));
+  self::expect(false, core::identical(self::F_named, mai::F_new_lib));
+  self::expect(true, core::identical(self::F_named, mai::F_named_lib));
+  self::expect(false, core::identical(self::F_named, mai::F_fact_lib));
+  self::expect(false, core::identical(self::F_named, mai::F_redirect_lib));
+  self::expect(false, core::identical(self::F_named, mai::G_new_lib));
+  self::expect(false, core::identical(self::F_named, mai::G_named_lib));
+  self::expect(false, core::identical(self::F_named, mai::G_fact_lib));
+  self::expect(false, core::identical(self::F_named, mai::G_redirect_lib));
+  self::expect(false, core::identical(self::F_named, self::H_new));
+  self::expect(false, core::identical(self::F_named, self::H_named));
+  self::expect(false, core::identical(self::F_named, self::H_fact));
+  self::expect(false, core::identical(self::F_named, self::H_redirect));
+  self::expect(false, core::identical(self::F_fact, mai::F_new_lib));
+  self::expect(false, core::identical(self::F_fact, mai::F_named_lib));
+  self::expect(true, core::identical(self::F_fact, mai::F_fact_lib));
+  self::expect(false, core::identical(self::F_fact, mai::F_redirect_lib));
+  self::expect(false, core::identical(self::F_fact, mai::G_new_lib));
+  self::expect(false, core::identical(self::F_fact, mai::G_named_lib));
+  self::expect(false, core::identical(self::F_fact, mai::G_fact_lib));
+  self::expect(false, core::identical(self::F_fact, mai::G_redirect_lib));
+  self::expect(false, core::identical(self::F_fact, self::H_new));
+  self::expect(false, core::identical(self::F_fact, self::H_named));
+  self::expect(false, core::identical(self::F_fact, self::H_fact));
+  self::expect(false, core::identical(self::F_fact, self::H_redirect));
+  self::expect(false, core::identical(self::F_redirect, mai::F_new_lib));
+  self::expect(false, core::identical(self::F_redirect, mai::F_named_lib));
+  self::expect(false, core::identical(self::F_redirect, mai::F_fact_lib));
+  self::expect(true, core::identical(self::F_redirect, mai::F_redirect_lib));
+  self::expect(false, core::identical(self::F_redirect, mai::G_new_lib));
+  self::expect(false, core::identical(self::F_redirect, mai::G_named_lib));
+  self::expect(false, core::identical(self::F_redirect, mai::G_fact_lib));
+  self::expect(false, core::identical(self::F_redirect, mai::G_redirect_lib));
+  self::expect(false, core::identical(self::F_redirect, self::H_new));
+  self::expect(false, core::identical(self::F_redirect, self::H_named));
+  self::expect(false, core::identical(self::F_redirect, self::H_fact));
+  self::expect(false, core::identical(self::F_redirect, self::H_redirect));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b, core::int c}) → mai::A<self::_#H#fact#tearOff::Y%>
+  return mai::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#redirect#tearOff::Y%>
+  return mai::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → mai::A<self::_#H#new#tearOff::Y%>
+  return new mai::A::•<self::_#H#new#tearOff::Y%>();
+static method /* from org-dartlang-testcase:///main_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b]) → mai::A<self::_#H#named#tearOff::Y%>
+  return new mai::A::named<self::_#H#named#tearOff::Y%>(a, b);
+
+constants  {
+  #C1 = static-tearoff self::_#H#new#tearOff
+  #C2 = static-tearoff self::_#H#named#tearOff
+  #C3 = static-tearoff self::_#H#fact#tearOff
+  #C4 = static-tearoff self::_#H#redirect#tearOff
+  #C5 = static-tearoff mai::_#F#new#tearOff
+  #C6 = static-tearoff mai::_#F#named#tearOff
+  #C7 = static-tearoff mai::_#F#fact#tearOff
+  #C8 = static-tearoff mai::_#F#redirect#tearOff
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.modular.expect
new file mode 100644
index 0000000..6da94c4
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_identical.dart.weak.modular.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "typedef_identical_lib.dart" as typ;
+
+import "org-dartlang-testcase:///typedef_identical_lib.dart";
+
+typedef H<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> H_new = #C1;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> H_named = #C2;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> H_fact = #C3;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> H_redirect = #C4;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> F_new = #C5;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> F_named = #C6;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> F_fact = #C7;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> F_redirect = #C8;
+static method main() → dynamic {
+  self::expect(true, core::identical(self::F_new, typ::F_new_lib));
+  self::expect(false, core::identical(self::F_new, typ::F_named_lib));
+  self::expect(false, core::identical(self::F_new, typ::F_fact_lib));
+  self::expect(false, core::identical(self::F_new, typ::F_redirect_lib));
+  self::expect(false, core::identical(self::F_new, typ::G_new_lib));
+  self::expect(false, core::identical(self::F_new, typ::G_named_lib));
+  self::expect(false, core::identical(self::F_new, typ::G_fact_lib));
+  self::expect(false, core::identical(self::F_new, typ::G_redirect_lib));
+  self::expect(false, core::identical(self::F_new, self::H_new));
+  self::expect(false, core::identical(self::F_new, self::H_named));
+  self::expect(false, core::identical(self::F_new, self::H_fact));
+  self::expect(false, core::identical(self::F_new, self::H_redirect));
+  self::expect(false, core::identical(self::F_named, typ::F_new_lib));
+  self::expect(true, core::identical(self::F_named, typ::F_named_lib));
+  self::expect(false, core::identical(self::F_named, typ::F_fact_lib));
+  self::expect(false, core::identical(self::F_named, typ::F_redirect_lib));
+  self::expect(false, core::identical(self::F_named, typ::G_new_lib));
+  self::expect(false, core::identical(self::F_named, typ::G_named_lib));
+  self::expect(false, core::identical(self::F_named, typ::G_fact_lib));
+  self::expect(false, core::identical(self::F_named, typ::G_redirect_lib));
+  self::expect(false, core::identical(self::F_named, self::H_new));
+  self::expect(false, core::identical(self::F_named, self::H_named));
+  self::expect(false, core::identical(self::F_named, self::H_fact));
+  self::expect(false, core::identical(self::F_named, self::H_redirect));
+  self::expect(false, core::identical(self::F_fact, typ::F_new_lib));
+  self::expect(false, core::identical(self::F_fact, typ::F_named_lib));
+  self::expect(true, core::identical(self::F_fact, typ::F_fact_lib));
+  self::expect(false, core::identical(self::F_fact, typ::F_redirect_lib));
+  self::expect(false, core::identical(self::F_fact, typ::G_new_lib));
+  self::expect(false, core::identical(self::F_fact, typ::G_named_lib));
+  self::expect(false, core::identical(self::F_fact, typ::G_fact_lib));
+  self::expect(false, core::identical(self::F_fact, typ::G_redirect_lib));
+  self::expect(false, core::identical(self::F_fact, self::H_new));
+  self::expect(false, core::identical(self::F_fact, self::H_named));
+  self::expect(false, core::identical(self::F_fact, self::H_fact));
+  self::expect(false, core::identical(self::F_fact, self::H_redirect));
+  self::expect(false, core::identical(self::F_redirect, typ::F_new_lib));
+  self::expect(false, core::identical(self::F_redirect, typ::F_named_lib));
+  self::expect(false, core::identical(self::F_redirect, typ::F_fact_lib));
+  self::expect(true, core::identical(self::F_redirect, typ::F_redirect_lib));
+  self::expect(false, core::identical(self::F_redirect, typ::G_new_lib));
+  self::expect(false, core::identical(self::F_redirect, typ::G_named_lib));
+  self::expect(false, core::identical(self::F_redirect, typ::G_fact_lib));
+  self::expect(false, core::identical(self::F_redirect, typ::G_redirect_lib));
+  self::expect(false, core::identical(self::F_redirect, self::H_new));
+  self::expect(false, core::identical(self::F_redirect, self::H_named));
+  self::expect(false, core::identical(self::F_redirect, self::H_fact));
+  self::expect(false, core::identical(self::F_redirect, self::H_redirect));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#new#tearOff::Y%>
+  return new typ::A::•<self::_#H#new#tearOff::Y%>();
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<self::_#H#named#tearOff::Y%>
+  return new typ::A::named<self::_#H#named#tearOff::Y%>(a, b);
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(self::_#H#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<self::_#H#fact#tearOff::Y%>
+  return typ::A::fact<self::_#H#fact#tearOff::Y%>(a, b: b, c: c);
+static method /* from org-dartlang-testcase:///typedef_identical_lib.dart */ _#H#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<self::_#H#redirect#tearOff::Y%>
+  return typ::A::_#redirect#tearOff<self::_#H#redirect#tearOff::Y%>();
+
+library /*isNonNullableByDefault*/;
+import self as typ;
+import "dart:core" as core;
+
+typedef F<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
+typedef G<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic> = typ::A<Y%>;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C11]/*isLegacy*/;
+  constructor •() → typ::A<typ::A::T%>
+    : super core::Object::•()
+    ;
+  constructor named(typ::A::T% a, [core::int? b = #C9]) → typ::A<typ::A::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → typ::A<typ::A::_#new#tearOff::T%>
+    return new typ::A::•<typ::A::_#new#tearOff::T%>();
+  static method _#named#tearOff<T extends core::Object? = dynamic>(typ::A::_#named#tearOff::T% a, [core::int? b = #C9]) → typ::A<typ::A::_#named#tearOff::T%>
+    return new typ::A::named<typ::A::_#named#tearOff::T%>(a, b);
+  static factory fact<T extends core::Object? = dynamic>(typ::A::fact::T% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<typ::A::fact::T%>
+    return new typ::A::•<typ::A::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>(typ::A::_#fact#tearOff::T% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<typ::A::_#fact#tearOff::T%>
+    return typ::A::fact<typ::A::_#fact#tearOff::T%>(a, b: b, c: c);
+  static factory redirect<T extends core::Object? = dynamic>() → typ::A<typ::A::redirect::T%>
+    return new typ::A::•<typ::A::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → typ::A<typ::A::_#redirect#tearOff::T%>
+    return new typ::A::•<typ::A::_#redirect#tearOff::T%>();
+}
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> F_new_lib = #C5;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> F_named_lib = #C6;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> F_fact_lib = #C7;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> F_redirect_lib = #C8;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_new_lib = #C12;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, [core::int?]) → typ::A<Y%> G_named_lib = #C13;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(Y%, {b: core::int?, c: core::int}) → typ::A<Y%> G_fact_lib = #C14;
+static field <unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<Y%> G_redirect_lib = #C15;
+static method _#F#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#F#new#tearOff::Y%>
+  return new typ::A::•<typ::_#F#new#tearOff::Y%>();
+static method _#F#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(typ::_#F#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<typ::_#F#named#tearOff::Y%>
+  return new typ::A::named<typ::_#F#named#tearOff::Y%>(a, b);
+static method _#F#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(typ::_#F#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<typ::_#F#fact#tearOff::Y%>
+  return typ::A::fact<typ::_#F#fact#tearOff::Y%>(a, b: b, c: c);
+static method _#F#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#F#redirect#tearOff::Y%>
+  return typ::A::_#redirect#tearOff<typ::_#F#redirect#tearOff::Y%>();
+static method _#G#new#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#G#new#tearOff::Y%>
+  return new typ::A::•<typ::_#G#new#tearOff::Y%>();
+static method _#G#named#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(typ::_#G#named#tearOff::Y% a, [core::int? b = #C9]) → typ::A<typ::_#G#named#tearOff::Y%>
+  return new typ::A::named<typ::_#G#named#tearOff::Y%>(a, b);
+static method _#G#fact#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(typ::_#G#fact#tearOff::Y% a, {core::int? b = #C9, core::int c = #C10}) → typ::A<typ::_#G#fact#tearOff::Y%>
+  return typ::A::fact<typ::_#G#fact#tearOff::Y%>(a, b: b, c: c);
+static method _#G#redirect#tearOff<unrelated X extends core::Object? = dynamic, Y extends core::Object? = dynamic>() → typ::A<typ::_#G#redirect#tearOff::Y%>
+  return typ::A::_#redirect#tearOff<typ::_#G#redirect#tearOff::Y%>();
+
+constants  {
+  #C1 = static-tearoff self::_#H#new#tearOff
+  #C2 = static-tearoff self::_#H#named#tearOff
+  #C3 = static-tearoff self::_#H#fact#tearOff
+  #C4 = static-tearoff self::_#H#redirect#tearOff
+  #C5 = static-tearoff typ::_#F#new#tearOff
+  #C6 = static-tearoff typ::_#F#named#tearOff
+  #C7 = static-tearoff typ::_#F#fact#tearOff
+  #C8 = static-tearoff typ::_#F#redirect#tearOff
+  #C9 = null
+  #C10 = 42
+  #C11 = constructor-tearoff typ::A::redirect
+  #C12 = static-tearoff typ::_#G#new#tearOff
+  #C13 = static-tearoff typ::_#G#named#tearOff
+  #C14 = static-tearoff typ::_#G#fact#tearOff
+  #C15 = static-tearoff typ::_#G#redirect#tearOff
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..9e50e01
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart.weak.modular.expect
@@ -0,0 +1,330 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:34:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f1a(0); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:46:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f2a(0); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:47:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f2a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:65:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f3a(0); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:66:8: Error: Expected 0 type arguments.
+//     f3a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:85:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3c(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:86:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3c(0, 0); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:87:8: Error: Expected 0 type arguments.
+//     f3c<String>(0); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:107:8: Error: Too few positional arguments: 2 required, 0 given.
+//     f3e(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:108:8: Error: Too few positional arguments: 2 required, 1 given.
+//     f3e(0); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:109:8: Error: Expected 0 type arguments.
+//     f3e<String>(0, ''); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:130:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f4a(0); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:131:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f4a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:152:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     f5a(0); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:153:8: Error: Expected 2 type arguments.
+//     f5a<String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:154:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f5a<String, String>(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:155:8: Error: Type argument 'num' doesn't conform to the bound 'String' of the type variable 'Y' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//     f5a<num, num>(); // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef DA1 = self::A;
+typedef DA2<unrelated X extends core::num> = self::A;
+typedef DB1 = self::B<core::String>;
+typedef DB2<X extends core::num> = self::B<X>;
+typedef DB3<X extends core::num, unrelated Y extends core::String> = self::B<X>;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::A
+    return new self::A::•();
+}
+class B<X extends core::Object? = dynamic> extends core::Object {
+  field core::int field1;
+  field core::String field2;
+  constructor _(core::int field1, core::String field2) → self::B<self::B::X%>
+    : self::B::field1 = field1, self::B::field2 = field2, super core::Object::•()
+    ;
+  constructor •() → self::B<self::B::X%>
+    : this self::B::_(0, "")
+    ;
+  constructor foo(core::int field1) → self::B<self::B::X%>
+    : self::B::field1 = field1, self::B::field2 = "", super core::Object::•()
+    ;
+  static method _#_#tearOff<X extends core::Object? = dynamic>(core::int field1, core::String field2) → self::B<self::B::_#_#tearOff::X%>
+    return new self::B::_<self::B::_#_#tearOff::X%>(field1, field2);
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::B<self::B::_#new#tearOff::X%>
+    return new self::B::•<self::B::_#new#tearOff::X%>();
+  static method _#foo#tearOff<X extends core::Object? = dynamic>(core::int field1) → self::B<self::B::_#foo#tearOff::X%>
+    return new self::B::foo<self::B::_#foo#tearOff::X%>(field1);
+  static factory bar<X extends core::Object? = dynamic>(core::int i, core::String j) → self::B<self::B::bar::X%>
+    return new self::B::_<self::B::bar::X%>(i, j);
+  static method _#bar#tearOff<X extends core::Object? = dynamic>(core::int i, core::String j) → self::B<self::B::_#bar#tearOff::X%>
+    return self::B::bar<self::B::_#bar#tearOff::X%>(i, j);
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  () → self::A f1a = #C1;
+  self::A c1a = f1a(){() → self::A};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::A);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:34:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f1a(0); // error
+       ^" in f1a{<inapplicable>}.(0);
+  };
+  dynamic f1b = #C1;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} self::A);
+  self::throws(() → dynamic => f1b{dynamic}.call(0));
+  <unrelated X extends core::num>() → self::A f2a = #C2;
+  self::A c2a = f2a<core::num>(){() → self::A};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::A);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:46:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f2a(0); // error
+       ^" in f2a{<inapplicable>}.<core::num>(0);
+    f2a<core::String>(){() → self::A};
+  };
+  dynamic f2b = #C2;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} self::A);
+  dynamic c2c = f2b{dynamic}.call<core::int>();
+  self::expect(true, c2c is{ForNonNullableByDefault} self::A);
+  self::throws(() → dynamic => f2b{dynamic}.call(0));
+  self::throws(() → dynamic => f2b{dynamic}.call<core::String>());
+  () → self::B<core::String> f3a = #C4;
+  self::B<core::String> c3a = f3a(){() → self::B<core::String>};
+  self::expect(true, c3a is{ForNonNullableByDefault} self::B<core::String>);
+  self::expect(false, c3a is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(0, c3a.{self::B::field1}{core::int});
+  self::expect("", c3a.{self::B::field2}{core::String});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:65:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f3a(0); // error
+       ^" in f3a{<inapplicable>}.(0);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:66:8: Error: Expected 0 type arguments.
+    f3a<String>(); // error
+       ^" in f3a{<inapplicable>}.<core::String>();
+  };
+  dynamic f3b = #C4;
+  dynamic c3b = f3b{dynamic}.call();
+  self::expect(true, c3b is{ForNonNullableByDefault} self::B<core::String>);
+  self::expect(false, c3b is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(0, c3a.{self::B::field1}{core::int});
+  self::expect("", c3a.{self::B::field2}{core::String});
+  self::throws(() → dynamic => f3b{dynamic}.call(0));
+  self::throws(() → dynamic => f3b{dynamic}.call<core::String>());
+  (core::int) → self::B<core::String> f3c = #C6;
+  self::B<core::String> c3c = f3c(42){(core::int) → self::B<core::String>};
+  self::expect(true, c3c is{ForNonNullableByDefault} self::B<core::String>);
+  self::expect(false, c3c is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(42, c3c.{self::B::field1}{core::int});
+  self::expect("", c3c.{self::B::field2}{core::String});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:85:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3c(); // error
+       ^" in f3c{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:86:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3c(0, 0); // error
+       ^" in f3c{<inapplicable>}.(0, 0);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:87:8: Error: Expected 0 type arguments.
+    f3c<String>(0); // error
+       ^" in f3c{<inapplicable>}.<core::String>(0);
+  };
+  dynamic f3d = #C6;
+  dynamic c3d = f3d{dynamic}.call(42);
+  self::expect(true, c3d is{ForNonNullableByDefault} self::B<core::String>);
+  self::expect(false, c3d is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(42, c3d{dynamic}.field1);
+  self::expect("", c3d{dynamic}.field2);
+  self::throws(() → dynamic => f3d{dynamic}.call());
+  self::throws(() → dynamic => f3d{dynamic}.call(0, 0));
+  self::throws(() → dynamic => f3d{dynamic}.call<core::String>(0));
+  (core::int, core::String) → self::B<core::String> f3e = #C8;
+  self::B<core::String> c3e = f3e(42, "foo"){(core::int, core::String) → self::B<core::String>};
+  self::expect(true, c3e is{ForNonNullableByDefault} self::B<core::String>);
+  self::expect(false, c3e is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(42, c3e.{self::B::field1}{core::int});
+  self::expect("foo", c3e.{self::B::field2}{core::String});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:107:8: Error: Too few positional arguments: 2 required, 0 given.
+    f3e(); // error
+       ^" in f3e{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:108:8: Error: Too few positional arguments: 2 required, 1 given.
+    f3e(0); // error
+       ^" in f3e{<inapplicable>}.(0);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:109:8: Error: Expected 0 type arguments.
+    f3e<String>(0, ''); // error
+       ^" in f3e{<inapplicable>}.<core::String>(0, "");
+  };
+  dynamic f3f = #C8;
+  dynamic c3f = f3f{dynamic}.call(42, "foo");
+  self::expect(true, c3f is{ForNonNullableByDefault} self::B<core::String>);
+  self::expect(false, c3f is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(42, c3f{dynamic}.field1);
+  self::expect("foo", c3f{dynamic}.field2);
+  self::throws(() → dynamic => c3f{dynamic}.call());
+  self::throws(() → dynamic => c3f{dynamic}.call(0));
+  self::throws(() → dynamic => c3f{dynamic}.call<core::String>(0));
+  <X extends core::num>() → self::B<X> f4a = #C9;
+  self::B<core::num> c4a = f4a<core::num>(){() → self::B<core::num>};
+  self::expect(true, c4a is{ForNonNullableByDefault} self::B<core::num>);
+  self::expect(false, c4a is{ForNonNullableByDefault} self::B<core::int>);
+  self::B<core::int> c4b = f4a<core::int>(){() → self::B<core::int>};
+  self::expect(true, c4b is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(false, c4b is{ForNonNullableByDefault} self::B<core::double>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:130:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f4a(0); // error
+       ^" in f4a{<inapplicable>}.<core::num>(0);
+    f4a<core::String>(){() → self::B<core::String>};
+  };
+  dynamic f4b = #C9;
+  dynamic c4c = f4b{dynamic}.call();
+  self::expect(true, c4c is{ForNonNullableByDefault} self::B<core::num>);
+  self::expect(false, c4c is{ForNonNullableByDefault} self::B<core::int>);
+  dynamic c4d = f4b{dynamic}.call<core::int>();
+  self::expect(true, c4d is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(false, c4d is{ForNonNullableByDefault} self::B<core::double>);
+  self::throws(() → dynamic => f4b{dynamic}.call(0));
+  self::throws(() → dynamic => f4b{dynamic}.call<core::String>());
+  <X extends core::num, unrelated Y extends core::String>() → self::B<X> f5a = #C10;
+  self::B<core::num> c5a = f5a<core::num, core::String>(){() → self::B<core::num>};
+  self::expect(true, c5a is{ForNonNullableByDefault} self::B<core::num>);
+  self::expect(false, c5a is{ForNonNullableByDefault} self::B<core::int>);
+  self::B<core::int> c5b = f5a<core::int, core::String>(){() → self::B<core::int>};
+  self::expect(true, c5b is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(false, c5b is{ForNonNullableByDefault} self::B<core::double>);
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:152:8: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    f5a(0); // error
+       ^" in f5a{<inapplicable>}.<core::num, core::String>(0);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/typedef_tear_off.dart:153:8: Error: Expected 2 type arguments.
+    f5a<String>(); // error
+       ^" in f5a{<inapplicable>}.<core::String>();
+    f5a<core::String, core::String>(){() → self::B<core::String>};
+    f5a<core::num, core::num>(){() → self::B<core::num>};
+  };
+  dynamic f5b = #C10;
+  dynamic c5c = f5b{dynamic}.call();
+  self::expect(true, c5c is{ForNonNullableByDefault} self::B<core::num>);
+  self::expect(false, c5c is{ForNonNullableByDefault} self::B<core::int>);
+  dynamic c5d = f5b{dynamic}.call<core::int, core::String>();
+  self::expect(true, c5d is{ForNonNullableByDefault} self::B<core::int>);
+  self::expect(false, c5d is{ForNonNullableByDefault} self::B<core::double>);
+  self::throws(() → dynamic => f5b{dynamic}.call(0));
+  self::throws(() → dynamic => f5b{dynamic}.call<core::String>());
+  self::throws(() → dynamic => f5b{dynamic}.call<core::String, core::String>());
+  self::throws(() → dynamic => f5b{dynamic}.call<core::num, core::num>());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C11}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+static method _#DA2#new#tearOff<unrelated X extends core::num>() → self::A
+  return new self::A::•();
+static method _#DB2#_#tearOff<X extends core::num>(core::int field1, core::String field2) → self::B<self::_#DB2#_#tearOff::X>
+  return new self::B::_<self::_#DB2#_#tearOff::X>(field1, field2);
+static method _#DB2#new#tearOff<X extends core::num>() → self::B<self::_#DB2#new#tearOff::X>
+  return new self::B::•<self::_#DB2#new#tearOff::X>();
+static method _#DB2#foo#tearOff<X extends core::num>(core::int field1) → self::B<self::_#DB2#foo#tearOff::X>
+  return new self::B::foo<self::_#DB2#foo#tearOff::X>(field1);
+static method _#DB2#bar#tearOff<X extends core::num>(core::int i, core::String j) → self::B<self::_#DB2#bar#tearOff::X>
+  return self::B::bar<self::_#DB2#bar#tearOff::X>(i, j);
+static method _#DB3#_#tearOff<X extends core::num, unrelated Y extends core::String>(core::int field1, core::String field2) → self::B<self::_#DB3#_#tearOff::X>
+  return new self::B::_<self::_#DB3#_#tearOff::X>(field1, field2);
+static method _#DB3#new#tearOff<X extends core::num, unrelated Y extends core::String>() → self::B<self::_#DB3#new#tearOff::X>
+  return new self::B::•<self::_#DB3#new#tearOff::X>();
+static method _#DB3#foo#tearOff<X extends core::num, unrelated Y extends core::String>(core::int field1) → self::B<self::_#DB3#foo#tearOff::X>
+  return new self::B::foo<self::_#DB3#foo#tearOff::X>(field1);
+static method _#DB3#bar#tearOff<X extends core::num, unrelated Y extends core::String>(core::int i, core::String j) → self::B<self::_#DB3#bar#tearOff::X>
+  return self::B::bar<self::_#DB3#bar#tearOff::X>(i, j);
+
+constants  {
+  #C1 = static-tearoff self::A::_#new#tearOff
+  #C2 = static-tearoff self::_#DA2#new#tearOff
+  #C3 = static-tearoff self::B::_#new#tearOff
+  #C4 = instantiation #C3 <core::String*>
+  #C5 = static-tearoff self::B::_#foo#tearOff
+  #C6 = instantiation #C5 <core::String*>
+  #C7 = static-tearoff self::B::_#bar#tearOff
+  #C8 = instantiation #C7 <core::String*>
+  #C9 = static-tearoff self::_#DB2#new#tearOff
+  #C10 = static-tearoff self::_#DB3#new#tearOff
+  #C11 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect
new file mode 100644
index 0000000..911cbda
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.modular.expect
@@ -0,0 +1,130 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C2]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C2]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C4;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C5;
+  #C6;
+  #C7;
+  #C8;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirectingFactory
+  #C2 = 0
+  #C3 = constructor-tearoff self::NamedMixinApplication::•
+  #C4 = constructor-tearoff self::NamedMixinApplication::named
+  #C5 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C6 = instantiation #C3 <core::int*, core::String*>
+  #C7 = instantiation #C4 <core::int*, core::String*>
+  #C8 = instantiation #C5 <core::int*, core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
index 99e5f30..c282d10 100644
--- a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
@@ -10,7 +10,7 @@
 class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
   field core::int field;
   static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
-  constructor •([core::int field]) → self::Class<self::Class::T%>
+  constructor •([core::int field = 0]) → self::Class<self::Class::T%>
     ;
   constructor named(core::int field) → self::Class<self::Class::T%>
     ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.weak.modular.expect
new file mode 100644
index 0000000..75ac16e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart.weak.modular.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:8:5: Error: 'new' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+// int new = 87; // error
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:15:7: Error: 'new' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   int new = 42; // error
+//       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:29:16: Error: 'new' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   external int new; // error
+//                ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:21:10: Error: 'new' can only be used as a constructor reference.
+//     this.new; // error
+//          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:22:10: Error: 'new' can only be used as a constructor reference.
+//     this.new(); // error
+//          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:23:10: Error: 'new' can only be used as a constructor reference.
+//     this.new<int>(); // error
+//          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:24:10: Error: 'new' can only be used as a constructor reference.
+//     this.new = 87; // error
+//          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:34:24: Error: 'new' can only be used as a constructor reference.
+// method(dynamic d) => d.new; // error
+//                        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:37:11: Error: 'new' can only be used as a constructor reference.
+//   new C().new; // error
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:38:11: Error: 'new' can only be used as a constructor reference.
+//   new C().new(); // error
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:39:11: Error: 'new' can only be used as a constructor reference.
+//   new C().new = 87; // error
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:41:5: Error: 'new' can only be used as a constructor reference.
+//   c.new; // error
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:42:5: Error: 'new' can only be used as a constructor reference.
+//   c.new = 87; // error
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:44:7: Error: 'new' can only be used as a constructor reference.
+//   foo.new; // error
+//       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:45:7: Error: 'new' can only be used as a constructor reference.
+//   foo.new(); // error
+//       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:46:7: Error: 'new' can only be used as a constructor reference.
+//   foo.new<int>(); // error
+//       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:47:8: Error: 'new' can only be used as a constructor reference.
+//   foo?.new; // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:48:8: Error: 'new' can only be used as a constructor reference.
+//   foo?.new(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:49:8: Error: 'new' can only be used as a constructor reference.
+//   foo?.new<int>(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:50:8: Error: 'new' can only be used as a constructor reference.
+//   foo..new; // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:51:8: Error: 'new' can only be used as a constructor reference.
+//   foo..new(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:52:8: Error: 'new' can only be used as a constructor reference.
+//   foo..new<int>(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:53:9: Error: 'new' can only be used as a constructor reference.
+//   (foo).new; // error
+//         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:54:9: Error: 'new' can only be used as a constructor reference.
+//   (foo).new(); // error
+//         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:55:9: Error: 'new' can only be used as a constructor reference.
+//   (foo).new<int>(); // error
+//         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:56:11: Error: 'new' can only be used as a constructor reference.
+//   prefix1.new; // error
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:57:11: Error: 'new' can only be used as a constructor reference.
+//   prefix1.new(); // error
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:58:11: Error: 'new' can only be used as a constructor reference.
+//   prefix1.new<int>(); // error
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:59:13: Error: 'new' can only be used as a constructor reference.
+//   prefix2.c.new; // error
+//             ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:60:13: Error: 'new' can only be used as a constructor reference.
+//   prefix2.c.new(); // error
+//             ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:61:13: Error: 'new' can only be used as a constructor reference.
+//   prefix2.c.new<int>(); // error
+//             ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:62:8: Error: 'new' can only be used as a constructor reference.
+//   E(0).new; // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:63:8: Error: 'new' can only be used as a constructor reference.
+//   E(0).new(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:64:8: Error: 'new' can only be used as a constructor reference.
+//   E(0).new<int>(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:65:3: Error: Undefined name 'unresolved'.
+//   unresolved.new; // error
+//   ^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:65:14: Error: 'new' can only be used as a constructor reference.
+//   unresolved.new; // error
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:66:3: Error: Undefined name 'unresolved'.
+//   unresolved.new(); // error
+//   ^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:66:14: Error: 'new' can only be used as a constructor reference.
+//   unresolved.new(); // error
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:67:3: Error: Undefined name 'unresolved'.
+//   unresolved.new<int>(); // error
+//   ^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:67:14: Error: 'new' can only be used as a constructor reference.
+//   unresolved.new<int>(); // error
+//              ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///new_as_selector.dart" as prefix1;
+import "org-dartlang-testcase:///new_as_selector.dart" deferred as prefix2 hide E;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+class C extends self::Super {
+  field core::int new = 42;
+  constructor •() → self::C
+    : super self::Super::•()
+    ;
+  constructor named() → self::C
+    : this self::C::•()
+    ;
+  method method() → dynamic {
+    this.{self::C::new}{core::int};
+    self::E|call<dynamic>(this.{self::C::new}{core::int});
+    self::E|call<core::int>(this.{self::C::new}{core::int});
+    this.{self::C::new} = 87;
+  }
+}
+extension E on core::int {
+  get new = self::E|get#new;
+  set new = self::E|set#new;
+  method call = self::E|call;
+  tearoff call = self::E|get#call;
+}
+static field core::int new = 87;
+static field self::C c = new self::C::•();
+external static method E|get#new(core::int #this) → core::int;
+external static method E|set#new(core::int #this, core::int #externalFieldValue) → void;
+static method E|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method E|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::E|call<T%>(#this);
+static method method(dynamic d) → dynamic
+  return d{dynamic}.new;
+static method test() → dynamic {
+  new self::C::•().{self::C::new}{core::int};
+  self::E|call<dynamic>(new self::C::•().{self::C::new}{core::int});
+  new self::C::•().{self::C::new} = 87;
+  self::C c = new self::C::•();
+  c.{self::C::new}{core::int};
+  c.{self::C::new} = 87;
+  dynamic foo;
+  foo{dynamic}.new;
+  foo{dynamic}.new();
+  foo{dynamic}.new<core::int>();
+  let final dynamic #t1 = foo in #t1 == null ?{dynamic} null : #t1{dynamic}.new;
+  let final dynamic #t2 = foo in #t2 == null ?{dynamic} null : #t2{dynamic}.new();
+  let final dynamic #t3 = foo in #t3 == null ?{dynamic} null : #t3{dynamic}.new<core::int>();
+  let final dynamic #t4 = foo in block {
+    #t4{dynamic}.new;
+  } =>#t4;
+  let final dynamic #t5 = foo in block {
+    #t5{dynamic}.new();
+  } =>#t5;
+  let final dynamic #t6 = foo in block {
+    #t6{dynamic}.new<core::int>();
+  } =>#t6;
+  foo{dynamic}.new;
+  foo{dynamic}.new();
+  foo{dynamic}.new<core::int>();
+  self::new;
+  self::E|call<dynamic>(self::new);
+  self::E|call<core::int>(self::new);
+  let final dynamic #t7 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
+  let final dynamic #t8 = CheckLibraryIsLoaded(prefix2) in self::E|call<dynamic>(self::c.{self::C::new}{core::int});
+  let final dynamic #t9 = CheckLibraryIsLoaded(prefix2) in self::E|call<core::int>(self::c.{self::C::new}{core::int});
+  self::E|get#new(0);
+  self::E|call<dynamic>(self::E|get#new(0));
+  self::E|call<core::int>(self::E|get#new(0));
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:65:3: Error: Undefined name 'unresolved'.
+  unresolved.new; // error
+  ^^^^^^^^^^"{<invalid>}.new;
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:66:3: Error: Undefined name 'unresolved'.
+  unresolved.new(); // error
+  ^^^^^^^^^^"{dynamic}.new();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/new_as_selector.dart:67:3: Error: Undefined name 'unresolved'.
+  unresolved.new<int>(); // error
+  ^^^^^^^^^^"{dynamic}.new<core::int>();
+}
+static method main() → dynamic {
+  #C1;
+  new self::C::•();
+}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.modular.expect
new file mode 100644
index 0000000..9f6be91
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:25: Error: A value of type 'A Function(int)' can't be returned from a function with return type 'A Function()'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart'.
+// A Function() test2() => A.foo2; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:15:28: Error: A value of type 'A Function()' can't be returned from a function with return type 'A Function(int)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart'.
+// A Function(int) test4() => A.new; // Error.
+//                            ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:17:28: Error: A value of type 'A Function()' can't be returned from a function with return type 'A Function(int)'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart'.
+// A Function(int) test6() => A.bar1; // Error.
+//                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor foo1() → self::A
+    : super core::Object::•() {}
+  constructor foo2(core::int x) → self::A
+    : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
+  static factory bar1() → self::A
+    return new self::A::•();
+}
+static method test1() → () → self::A
+  return #C1;
+static method test2() → () → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:13:25: Error: A value of type 'A Function(int)' can't be returned from a function with return type 'A Function()'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart'.
+A Function() test2() => A.foo2; // Error.
+                        ^" in #C2 as{TypeError,ForNonNullableByDefault} () → self::A;
+static method test3() → () → self::A
+  return #C3;
+static method test4() → (core::int) → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:15:28: Error: A value of type 'A Function()' can't be returned from a function with return type 'A Function(int)'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart'.
+A Function(int) test4() => A.new; // Error.
+                           ^" in #C3 as{TypeError,ForNonNullableByDefault} (core::int) → self::A;
+static method test5() → () → self::A
+  return #C4;
+static method test6() → (core::int) → self::A
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart:17:28: Error: A value of type 'A Function()' can't be returned from a function with return type 'A Function(int)'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_with_context.dart'.
+A Function(int) test6() => A.bar1; // Error.
+                           ^" in #C4 as{TypeError,ForNonNullableByDefault} (core::int) → self::A;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::foo1
+  #C2 = constructor-tearoff self::A::foo2
+  #C3 = constructor-tearoff self::A::•
+  #C4 = constructor-tearoff self::A::bar1
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.modular.expect
new file mode 100644
index 0000000..22aef61
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart.weak.modular.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:15:23: Error: The static type of the explicit instantiation operand must be a generic function type but is 'A Function()'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart'.
+// Try changing the operand or remove the type arguments.
+// testFooExtraArgs() => A<int>.foo; // Error.
+//                       ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:16:23: Error: The static type of the explicit instantiation operand must be a generic function type but is 'A Function()'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart'.
+// Try changing the operand or remove the type arguments.
+// testNewExtraArgs() => A<int>.new; // Error.
+//                       ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:17:23: Error: The static type of the explicit instantiation operand must be a generic function type but is 'A Function()'.
+//  - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart'.
+// Try changing the operand or remove the type arguments.
+// testBarExtraArgs() => A<int>.bar; // Error.
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor foo() → self::A
+    : super core::Object::•() {}
+  constructor •() → self::A
+    : super core::Object::•() {}
+  static factory bar() → self::A
+    return new self::A::•();
+}
+static method testFoo() → dynamic
+  return #C1;
+static method testNew() → dynamic
+  return #C2;
+static method testBar() → dynamic
+  return #C3;
+static method testFooExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:15:23: Error: The static type of the explicit instantiation operand must be a generic function type but is 'A Function()'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart'.
+Try changing the operand or remove the type arguments.
+testFooExtraArgs() => A<int>.foo; // Error.
+                      ^";
+static method testNewExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:16:23: Error: The static type of the explicit instantiation operand must be a generic function type but is 'A Function()'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart'.
+Try changing the operand or remove the type arguments.
+testNewExtraArgs() => A<int>.new; // Error.
+                      ^";
+static method testBarExtraArgs() → dynamic
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart:17:23: Error: The static type of the explicit instantiation operand must be a generic function type but is 'A Function()'.
+ - 'A' is from 'pkg/front_end/testcases/constructor_tearoffs/nongeneric_tearoff_without_context.dart'.
+Try changing the operand or remove the type arguments.
+testBarExtraArgs() => A<int>.bar; // Error.
+                      ^";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::foo
+  #C2 = constructor-tearoff self::A::•
+  #C3 = constructor-tearoff self::A::bar
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..b3fb9eb
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/not_unresolved_constructor_invocation.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class ResolvedClass<T extends core::Object? = dynamic> extends core::Object {
+  constructor named() → self::ResolvedClass<self::ResolvedClass::T%>
+    : super core::Object::•()
+    ;
+  static method unresolvedConstructor() → dynamic {}
+}
+class unresolved_prefix extends core::Object {
+  synthetic constructor •() → self::unresolved_prefix
+    : super core::Object::•()
+    ;
+  static method UnresolvedClass<T extends core::Object? = dynamic>() → dynamic {}
+}
+class resolved_prefix extends core::Object {
+  synthetic constructor •() → self::resolved_prefix
+    : super core::Object::•()
+    ;
+  static method UnresolvedClass<T extends core::Object? = dynamic>() → dynamic {}
+}
+extension Extension on core::Function {
+  method unresolvedConstructor = self::Extension|unresolvedConstructor;
+  tearoff unresolvedConstructor = self::Extension|get#unresolvedConstructor;
+}
+static method UnresolvedClass<T extends core::Object? = dynamic>() → dynamic {}
+static method Extension|unresolvedConstructor(lowered final core::Function #this) → dynamic {}
+static method Extension|get#unresolvedConstructor(lowered final core::Function #this) → () → dynamic
+  return () → dynamic => self::Extension|unresolvedConstructor(#this);
+static method main() → dynamic {
+  self::UnresolvedClass<dynamic>();
+  self::Extension|unresolvedConstructor(#C1);
+  self::Extension|unresolvedConstructor(#C1);
+  self::unresolved_prefix::UnresolvedClass<dynamic>();
+  self::unresolved_prefix::UnresolvedClass<dynamic>();
+  self::Extension|unresolvedConstructor(#C2);
+  self::Extension|unresolvedConstructor(#C2);
+  self::UnresolvedClass<core::int>();
+  self::UnresolvedClass<core::int>();
+  self::Extension|unresolvedConstructor(#C3);
+  self::Extension|unresolvedConstructor(#C3);
+  self::unresolved_prefix::UnresolvedClass<core::int>();
+  self::unresolved_prefix::UnresolvedClass<core::int>();
+  self::Extension|unresolvedConstructor(#C4);
+  self::Extension|unresolvedConstructor(#C4);
+  self::ResolvedClass::unresolvedConstructor();
+  self::ResolvedClass::unresolvedConstructor();
+  self::resolved_prefix::UnresolvedClass<dynamic>();
+  self::resolved_prefix::UnresolvedClass<dynamic>();
+  self::Extension|unresolvedConstructor(#C5);
+  self::Extension|unresolvedConstructor(#C5);
+  self::resolved_prefix::UnresolvedClass<core::int>();
+  self::resolved_prefix::UnresolvedClass<core::int>();
+  self::Extension|unresolvedConstructor(#C6);
+  self::Extension|unresolvedConstructor(#C6);
+}
+
+constants  {
+  #C1 = static-tearoff self::UnresolvedClass
+  #C2 = static-tearoff self::unresolved_prefix::UnresolvedClass
+  #C3 = instantiation #C1 <core::int*>
+  #C4 = instantiation #C2 <core::int*>
+  #C5 = static-tearoff self::resolved_prefix::UnresolvedClass
+  #C6 = instantiation #C5 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.modular.expect
new file mode 100644
index 0000000..4e40f0b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
+//   A x3 f3();
+//     ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3]/*isLegacy*/;
+  constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static factory redirectingFactory() → self::A
+    return new self::A::•();
+  static factory redirectingFactoryChild() → self::A
+    return new self::B::•();
+  static factory redirectingTwice() → self::A
+    return self::A::redirectingFactory();
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method test() → dynamic {
+  () → self::A f1 = #C4;
+  () → self::A f2 = #C5;
+  () → self::A f3 = #C6;
+  self::A x1 = f1(){() → self::A};
+  self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
+  self::A x3;
+  f3(){() → self::A};
+}
+static method main() → dynamic
+  return self::test();
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = constructor-tearoff self::A::redirectingTwice
+  #C4 = redirecting-factory-tearoff self::A::redirectingFactory
+  #C5 = redirecting-factory-tearoff self::A::redirectingFactoryChild
+  #C6 = redirecting-factory-tearoff self::A::redirectingTwice
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..05e5e9d
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart.weak.modular.expect
@@ -0,0 +1,280 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:99:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f3a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:100:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f3a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:115:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f4a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:129:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f5a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:130:8: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//     f5a(42, 87, 123); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:142:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f6a(); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:143:8: Error: Required named parameter 'field3' must be provided.
+//     f6a(42); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:144:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     f6a(42, 87); // error
+//        ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:145:8: Error: Too few positional arguments: 1 required, 0 given.
+//     f6a(field1: 87, field2: 87); // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _() → self::Class1
+    : super core::Object::•()
+    ;
+  static factory •() → self::Class1
+    return new self::Class1::_();
+}
+class Class2 extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor __() → self::Class2
+    : super core::Object::•()
+    ;
+  static factory _() → self::Class2
+    return new self::Class2::__();
+  static factory named() → self::Class2
+    return self::Class2::_();
+}
+class Class3 extends core::Object {
+  final field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
+  constructor _(core::int field) → self::Class3
+    : self::Class3::field = field, super core::Object::•()
+    ;
+  static factory •(core::int field) → self::Class3
+    return new self::Class3::_(field);
+}
+class Class4 extends core::Object {
+  final field core::int? field;
+  static final field dynamic _redirecting# = <dynamic>[#C4]/*isLegacy*/;
+  constructor _([core::int? field = #C5]) → self::Class4
+    : self::Class4::field = field, super core::Object::•()
+    ;
+  static factory •([core::int? field = #C5]) → self::Class4
+    return new self::Class4::_(field);
+}
+class Class5 extends core::Object {
+  final field core::int field1;
+  final field core::int? field2;
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  constructor _(core::int field1, [core::int? field2 = #C5]) → self::Class5
+    : self::Class5::field1 = field1, self::Class5::field2 = field2, super core::Object::•()
+    ;
+  static factory •(core::int field1, [core::int? field2 = #C5]) → self::Class5
+    return new self::Class5::_(field1, field2);
+}
+class Class6 extends core::Object {
+  final field core::int field1;
+  final field core::int? field2;
+  final field core::int field3;
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  constructor _(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
+    : self::Class6::field1 = field1, self::Class6::field2 = field2, self::Class6::field3 = field3, super core::Object::•()
+    ;
+  static factory •(core::int field1, {core::int? field2 = #C5, required core::int field3 = #C5}) → self::Class6
+    return new self::Class6::_(field1, field2: field2, field3: field3);
+}
+class Class7a extends core::Object implements self::Class7b {
+  constructor •() → self::Class7a
+    : super core::Object::•()
+    ;
+}
+class Class7b extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
+  static factory •() → self::Class7b
+    return new self::Class7a::•();
+}
+class Class8a<T extends core::Object? = dynamic> extends core::Object implements self::Class8b<self::Class8a::T%> {
+  constructor •() → self::Class8a<self::Class8a::T%>
+    : super core::Object::•()
+    ;
+}
+class Class8b<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C9]/*isLegacy*/;
+  static factory •<T extends core::Object? = dynamic>() → self::Class8b<self::Class8b::•::T%>
+    return new self::Class8a::•<self::Class8b::•::T%>();
+}
+static final field core::bool inSoundMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static method main() → dynamic {
+  core::print("inSoundMode: ${self::inSoundMode}");
+  self::testNoArgs();
+  self::testArgs();
+}
+static method testNoArgs() → dynamic {
+  () → self::Class1 f1a = #C10;
+  self::Class1 c1a = f1a(){() → self::Class1};
+  self::expect(true, c1a is{ForNonNullableByDefault} self::Class1);
+  dynamic f1b = #C10;
+  dynamic c1b = f1b{dynamic}.call();
+  self::expect(true, c1b is{ForNonNullableByDefault} self::Class1);
+  self::expect(true, core::identical(f1a, f1b));
+  () → self::Class2 f2a = #C11;
+  self::Class2 c2a = f2a(){() → self::Class2};
+  self::expect(true, c2a is{ForNonNullableByDefault} self::Class2);
+  dynamic f2b = #C11;
+  dynamic c2b = f2b{dynamic}.call();
+  self::expect(true, c2b is{ForNonNullableByDefault} self::Class2);
+  self::expect(true, core::identical(f2a, f2b));
+}
+static method testArgs() → dynamic {
+  (core::int) → self::Class3 f3a = #C12;
+  self::Class3 c3a = f3a(42){(core::int) → self::Class3};
+  self::expect(42, c3a.{self::Class3::field}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:99:8: Error: Too few positional arguments: 1 required, 0 given.
+    f3a(); // error
+       ^" in f3a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:100:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f3a(42, 87); // error
+       ^" in f3a{<inapplicable>}.(42, 87);
+  };
+  dynamic f3b = #C12;
+  dynamic c3b = f3b{dynamic}.call(87);
+  self::expect(87, c3b{dynamic}.field);
+  self::throws(() → dynamic => f3b{dynamic}.call());
+  self::throws(() → dynamic => f3b{dynamic}.call(42, 87));
+  ([core::int?]) → self::Class4 f4a = #C13;
+  self::Class4 c4a = f4a(){([core::int?]) → self::Class4};
+  self::expect(null, c4a.{self::Class4::field}{core::int?});
+  self::Class4 c4b = f4a(42){([core::int?]) → self::Class4};
+  self::expect(42, c4b.{self::Class4::field}{core::int?});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:115:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f4a(42, 87); // error
+       ^" in f4a{<inapplicable>}.(42, 87);
+  };
+  dynamic f4b = #C13;
+  self::throws(() → dynamic => f4b{dynamic}.call(42, 87));
+  (core::int, [core::int?]) → self::Class5 f5a = #C14;
+  self::Class5 c5a = f5a(42){(core::int, [core::int?]) → self::Class5};
+  self::expect(42, c5a.{self::Class5::field1}{core::int});
+  self::expect(null, c5a.{self::Class5::field2}{core::int?});
+  self::Class5 c5b = f5a(87, 42){(core::int, [core::int?]) → self::Class5};
+  self::expect(87, c5b.{self::Class5::field1}{core::int});
+  self::expect(42, c5b.{self::Class5::field2}{core::int?});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:129:8: Error: Too few positional arguments: 1 required, 0 given.
+    f5a(); // error
+       ^" in f5a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:130:8: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+    f5a(42, 87, 123); // error
+       ^" in f5a{<inapplicable>}.(42, 87, 123);
+  };
+  dynamic f5b = #C14;
+  self::throws(() → dynamic => f5b{dynamic}.call());
+  self::throws(() → dynamic => f5b{dynamic}.call(42, 87, 123));
+  (core::int, {field2: core::int?, required field3: core::int}) → self::Class6 f6a = #C15;
+  self::Class6 c6a = f6a(42, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(42, c6a.{self::Class6::field1}{core::int});
+  self::expect(null, c6a.{self::Class6::field2}{core::int?});
+  self::expect(87, c6a.{self::Class6::field3}{core::int});
+  () → Null {
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:142:8: Error: Too few positional arguments: 1 required, 0 given.
+    f6a(); // error
+       ^" in f6a{<inapplicable>}.();
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:143:8: Error: Required named parameter 'field3' must be provided.
+    f6a(42); // error
+       ^" in f6a{<inapplicable>}.(42);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:144:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    f6a(42, 87); // error
+       ^" in f6a{<inapplicable>}.(42, 87);
+    invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_factory_tear_off.dart:145:8: Error: Too few positional arguments: 1 required, 0 given.
+    f6a(field1: 87, field2: 87); // error
+       ^" in f6a{<inapplicable>}.(field1: 87, field2: 87);
+  };
+  self::Class6 c6b = f6a(42, field2: 123, field3: 87){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(42, c6b.{self::Class6::field1}{core::int});
+  self::expect(123, c6b.{self::Class6::field2}{core::int?});
+  self::expect(87, c6b.{self::Class6::field3}{core::int});
+  self::Class6 c6c = f6a(87, field3: 42, field2: 123){(core::int, {field2: core::int?, required field3: core::int}) → self::Class6};
+  self::expect(87, c6c.{self::Class6::field1}{core::int});
+  self::expect(123, c6c.{self::Class6::field2}{core::int?});
+  self::expect(42, c6c.{self::Class6::field3}{core::int});
+  dynamic f6b = #C15;
+  self::throws(() → dynamic => f6b{dynamic}.call());
+  self::throws(() → dynamic => f6b{dynamic}.call(42), inSoundModeOnly: true);
+  self::throws(() → dynamic => f6b{dynamic}.call(42, 87), inSoundModeOnly: true);
+  self::throws(() → dynamic => f6b{dynamic}.call(field1: 87, field2: 87));
+  () → self::Class7b f7a = #C16;
+  self::Class7b c7a = f7a(){() → self::Class7b};
+  self::expect(true, c7a is{ForNonNullableByDefault} self::Class7a);
+  self::expect(true, c7a is{ForNonNullableByDefault} self::Class7b);
+  <T extends core::Object? = dynamic>() → self::Class8b<T%> f8a = #C17;
+  self::Class8b<dynamic> c8a = f8a<dynamic>(){() → self::Class8b<dynamic>};
+  self::expect(true, c8a is{ForNonNullableByDefault} self::Class8a<dynamic>);
+  self::expect(true, c8a is{ForNonNullableByDefault} self::Class8b<dynamic>);
+  self::Class8b<core::int> c8b = f8a<core::int>(){() → self::Class8b<core::int>};
+  self::expect(true, c8b is{ForNonNullableByDefault} self::Class8a<core::int>);
+  self::expect(true, c8b is{ForNonNullableByDefault} self::Class8b<core::int>);
+  self::expect(false, c8b is{ForNonNullableByDefault} self::Class8b<core::String>);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, {core::bool inSoundModeOnly = #C18}) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print("Thrown: ${e}");
+    return;
+  }
+  if(!self::inSoundMode && inSoundModeOnly) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = constructor-tearoff self::Class2::named
+  #C3 = constructor-tearoff self::Class3::•
+  #C4 = constructor-tearoff self::Class4::•
+  #C5 = null
+  #C6 = constructor-tearoff self::Class5::•
+  #C7 = constructor-tearoff self::Class6::•
+  #C8 = constructor-tearoff self::Class7b::•
+  #C9 = constructor-tearoff self::Class8b::•
+  #C10 = redirecting-factory-tearoff self::Class1::•
+  #C11 = redirecting-factory-tearoff self::Class2::named
+  #C12 = redirecting-factory-tearoff self::Class3::•
+  #C13 = redirecting-factory-tearoff self::Class4::•
+  #C14 = redirecting-factory-tearoff self::Class5::•
+  #C15 = redirecting-factory-tearoff self::Class6::•
+  #C16 = redirecting-factory-tearoff self::Class7b::•
+  #C17 = redirecting-factory-tearoff self::Class8b::•
+  #C18 = false
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..1e0382a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_instantiated_type_literals.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic
+  return #C1;
+static method bar() → dynamic {
+  core::Type listString = #C2;
+  return listString;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::List<core::int*>*)
+  #C2 = TypeLiteralConstant(core::List<core::String*>*)
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.modular.expect
new file mode 100644
index 0000000..2949323
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart:32:18: Error: Constant evaluation error:
+// test4() => const StaticIdentityTest(A4.new, B4.new); // Error.
+//                  ^
+// pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart:26:43: Context: This assertion failed.
+//   const StaticIdentityTest(a, b) : assert(identical(a, b));
+//                                           ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart:33:18: Error: Constant evaluation error:
+// test5() => const StaticIdentityTest(A5.new, B5.new); // Error.
+//                  ^
+// pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart:26:43: Context: This assertion failed.
+//   const StaticIdentityTest(a, b) : assert(identical(a, b));
+//                                           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef B1<T extends core::Object? = dynamic> = self::A1<T%>;
+typedef B2<T extends core::num> = self::A2<T>;
+typedef B3<T extends core::List<core::Object?>, S extends Null> = self::A3<T, S%>;
+typedef B4<T extends core::int> = self::A4<T>;
+typedef B5<unrelated T extends core::List<core::Object?>, unrelated S extends Null> = self::A5<core::List<dynamic>, Never?>;
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
+    : super core::Object::•()
+    ;
+}
+class A2<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::T>
+    : super core::Object::•()
+    ;
+}
+class A3<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A3<self::A3::T, self::A3::S%>
+    : super core::Object::•()
+    ;
+}
+class A4<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A4<self::A4::T>
+    : super core::Object::•()
+    ;
+}
+class A5<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A5<self::A5::T, self::A5::S%>
+    : super core::Object::•()
+    ;
+}
+class StaticIdentityTest extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic a, dynamic b) → self::StaticIdentityTest
+    : assert(core::identical(a, b)), super core::Object::•()
+    ;
+}
+static method test1() → dynamic
+  return #C1;
+static method test2() → dynamic
+  return #C1;
+static method test3() → dynamic
+  return #C1;
+static method test4() → dynamic
+  return invalid-expression "This assertion failed.";
+static method test5() → dynamic
+  return invalid-expression "This assertion failed.";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::StaticIdentityTest {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_proper_rename_identity.dart:
+- StaticIdentityTest. (from org-dartlang-testcase:///simple_proper_rename_identity.dart:26:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.modular.expect
new file mode 100644
index 0000000..6f79e9e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart.weak.modular.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:16:33: Error: Cannot access static member on an instantiated generic class.
+// Try removing the type arguments or placing them after the member name.
+//   int Function(int) f4 = A<int>.foo; // Error.
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:17:19: Error: Cannot access static member on an instantiated generic class.
+// Try removing the type arguments or placing them after the member name.
+//   var f5 = A<int>.foo; // Error.
+//                   ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:22:34: Error: Cannot access static member on an instantiated generic class.
+// Try removing the type arguments or placing them after the member name.
+//   int Function(int) g4 = D1<int>.foo; // Error.
+//                                  ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:23:20: Error: Cannot access static member on an instantiated generic class.
+// Try removing the type arguments or placing them after the member name.
+//   var g5 = D1<int>.foo; // Error.
+//                    ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:28:34: Error: Cannot access static member on an instantiated generic class.
+// Try removing the type arguments or placing them after the member name.
+//   int Function(int) h4 = D2<int>.foo; // Error.
+//                                  ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:29:20: Error: Cannot access static member on an instantiated generic class.
+// Try removing the type arguments or placing them after the member name.
+//   var h5 = D2<int>.foo; // Error.
+//                    ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef D1<X extends core::Object? = dynamic> = self::A<X%>;
+typedef D2<X extends core::num> = self::A<X>;
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  static method foo<X extends core::Object? = dynamic>(self::A::foo::X% x) → self::A::foo::X%
+    return x;
+}
+static method test() → dynamic {
+  <Y extends core::Object? = dynamic>(Y%) → Y% f1 = #C1;
+  (core::int) → core::int f2 = #C2;
+  (core::int) → core::int f3 = #C2;
+  (core::int) → core::int f4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:16:33: Error: Cannot access static member on an instantiated generic class.
+Try removing the type arguments or placing them after the member name.
+  int Function(int) f4 = A<int>.foo; // Error.
+                                ^^^";
+  invalid-type f5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:17:19: Error: Cannot access static member on an instantiated generic class.
+Try removing the type arguments or placing them after the member name.
+  var f5 = A<int>.foo; // Error.
+                  ^^^";
+  <Y extends core::Object? = dynamic>(Y%) → Y% g1 = #C1;
+  (core::int) → core::int g2 = #C2;
+  (core::int) → core::int g3 = #C2;
+  (core::int) → core::int g4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:22:34: Error: Cannot access static member on an instantiated generic class.
+Try removing the type arguments or placing them after the member name.
+  int Function(int) g4 = D1<int>.foo; // Error.
+                                 ^^^";
+  invalid-type g5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:23:20: Error: Cannot access static member on an instantiated generic class.
+Try removing the type arguments or placing them after the member name.
+  var g5 = D1<int>.foo; // Error.
+                   ^^^";
+  <Y extends core::Object? = dynamic>(Y%) → Y% h1 = #C1;
+  (core::int) → core::int h2 = #C2;
+  (core::int) → core::int h3 = #C2;
+  (core::int) → core::int h4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:28:34: Error: Cannot access static member on an instantiated generic class.
+Try removing the type arguments or placing them after the member name.
+  int Function(int) h4 = D2<int>.foo; // Error.
+                                 ^^^";
+  invalid-type h5 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/static_tearoff_from_instantiated_class.dart:29:20: Error: Cannot access static member on an instantiated generic class.
+Try removing the type arguments or placing them after the member name.
+  var h5 = D2<int>.foo; // Error.
+                   ^^^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::A::foo
+  #C2 = instantiation #C1 <core::int*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.modular.expect
new file mode 100644
index 0000000..f075526
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart.weak.modular.expect
@@ -0,0 +1,141 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:28:25: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'DA2'.
+// Try changing type arguments so that they conform to the bounds.
+// A Function() test5() => DA2<String>.new; // Error.
+//                         ^
+// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:15:13: Context: This is the type variable whose bound isn't conformed to.
+// typedef DA2<X extends num> = A;
+//             ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:33:30: Error: A value of type 'B<String> Function()' can't be returned from a function with return type 'B<num> Function()'.
+//  - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+// B<num> Function() test9() => DB1.new; // Error.
+//                              ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:42:32: Error: A value of type 'B<X> Function<X extends num>()' can't be assigned to a variable of type 'B<Y> Function<Y>()'.
+//  - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+// B<Y> Function<Y>() test17() => DB2.new; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:42:32: Error: A value of type 'B<X> Function<X extends num>()' can't be returned from a function with return type 'B<Y> Function<Y>()'.
+//  - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+// B<Y> Function<Y>() test17() => DB2.new; // Error.
+//                                ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:49:35: Error: A value of type 'B<X> Function<X extends num, Y extends String>()' can't be assigned to a variable of type 'B<Y> Function<Y, Z>()'.
+//  - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+// B<Y> Function<Y, Z>() test23() => DB3.new; // Error.
+//                                   ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:49:35: Error: A value of type 'B<X> Function<X extends num, Y extends String>()' can't be returned from a function with return type 'B<Y> Function<Y, Z>()'.
+//  - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+// B<Y> Function<Y, Z>() test23() => DB3.new; // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef DA1 = self::A;
+typedef DA2<unrelated X extends core::num> = self::A;
+typedef DB1 = self::B<core::String>;
+typedef DB2<X extends core::num> = self::B<X>;
+typedef DB3<X extends core::num, unrelated Y extends core::String> = self::B<X>;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B<X extends core::Object? = dynamic> extends core::Object {
+  constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  constructor foo() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  static factory bar<X extends core::Object? = dynamic>() → self::B<self::B::bar::X%>
+    return new self::B::•<self::B::bar::X%>();
+}
+static method test1() → () → self::A
+  return #C1;
+static method test2() → () → self::A
+  return #C1;
+static method test3() → () → self::A
+  return #C2;
+static method test4() → () → self::A
+  return #C2;
+static method test5() → () → self::A
+  return #C1;
+static method test6() → () → self::A
+  return #C1;
+static method test7() → () → self::B<core::String>
+  return #C4;
+static method test8() → () → self::B<core::String>
+  return #C4;
+static method test9() → () → self::B<core::num>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:33:30: Error: A value of type 'B<String> Function()' can't be returned from a function with return type 'B<num> Function()'.
+ - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+B<num> Function() test9() => DB1.new; // Error.
+                             ^" in #C4 as{TypeError,ForNonNullableByDefault} () → self::B<core::num>;
+static method test10() → () → self::B<core::String>
+  return #C6;
+static method test11() → () → self::B<core::String>
+  return #C8;
+static method test12() → () → self::B<core::num>
+  return #C9;
+static method test13() → () → self::B<core::num>
+  return #C10;
+static method test14() → () → self::B<core::num>
+  return #C11;
+static method test15() → () → self::B<core::num>
+  return #C9;
+static method test16() → <Y extends core::num = dynamic>() → self::B<Y>
+  return #C12;
+static method test17() → <Y extends core::Object? = dynamic>() → self::B<Y%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:42:32: Error: A value of type 'B<X> Function<X extends num>()' can't be returned from a function with return type 'B<Y> Function<Y>()'.
+ - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+B<Y> Function<Y>() test17() => DB2.new; // Error.
+                               ^" in invalid-expression "pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:42:32: Error: A value of type 'B<X> Function<X extends num>()' can't be assigned to a variable of type 'B<Y> Function<Y>()'.
+ - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+B<Y> Function<Y>() test17() => DB2.new; // Error.
+                               ^" in #C12 as{TypeError,ForNonNullableByDefault} <Y extends core::Object? = dynamic>() → self::B<Y%> as{TypeError,ForNonNullableByDefault} <Y extends core::Object? = dynamic>() → self::B<Y%>;
+static method test18() → () → self::B<core::num>
+  return #C9;
+static method test19() → () → self::B<core::num>
+  return #C10;
+static method test20() → () → self::B<core::num>
+  return #C11;
+static method test21() → () → self::B<core::num>
+  return #C9;
+static method test22() → <Y extends core::num = dynamic, Z extends core::String = dynamic>() → self::B<Y>
+  return #C13;
+static method test23() → <Y extends core::Object? = dynamic, Z extends core::Object? = dynamic>() → self::B<Y%>
+  return invalid-expression "pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:49:35: Error: A value of type 'B<X> Function<X extends num, Y extends String>()' can't be returned from a function with return type 'B<Y> Function<Y, Z>()'.
+ - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+B<Y> Function<Y, Z>() test23() => DB3.new; // Error.
+                                  ^" in invalid-expression "pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart:49:35: Error: A value of type 'B<X> Function<X extends num, Y extends String>()' can't be assigned to a variable of type 'B<Y> Function<Y, Z>()'.
+ - 'B' is from 'pkg/front_end/testcases/constructor_tearoffs/typedef_tearoffs.dart'.
+B<Y> Function<Y, Z>() test23() => DB3.new; // Error.
+                                  ^" in #C13 as{TypeError,ForNonNullableByDefault} <Y extends core::Object? = dynamic, Z extends core::Object? = dynamic>() → self::B<Y%> as{TypeError,ForNonNullableByDefault} <Y extends core::Object? = dynamic, Z extends core::Object? = dynamic>() → self::B<Y%>;
+static method test24() → () → self::B<core::String>
+  return #C14;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = instantiation #C1 <>
+  #C3 = constructor-tearoff self::B::•
+  #C4 = instantiation #C3 <core::String*>
+  #C5 = constructor-tearoff self::B::foo
+  #C6 = instantiation #C5 <core::String*>
+  #C7 = constructor-tearoff self::B::bar
+  #C8 = instantiation #C7 <core::String*>
+  #C9 = instantiation #C3 <core::num*>
+  #C10 = instantiation #C5 <core::num*>
+  #C11 = instantiation #C7 <core::num*>
+  #C12 = typedef-tearoff <X extends core::num>.(#C3<X>)
+  #C13 = typedef-tearoff <X extends core::num, unrelated Y extends core::String>.(#C3<X>)
+  #C14 = instantiation #C3 <Never*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..34009a6
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
+  constructor •() → self::A
+    : super core::Object::•()
+    ;
+  constructor redirecting() → self::A
+    : this self::A::•()
+    ;
+  static factory redirectingFactory() → self::A
+    return new self::A::•();
+  static factory redirectingFactoryChild() → self::A
+    return new self::B::•();
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor •(core::int x) → self::C
+    : self::C::x = x, super core::Object::•()
+    ;
+}
+class D extends self::C {
+  constructor •(core::int x) → self::D
+    : super self::C::•(x.{core::num::*}(2){(core::num) → core::int})
+    ;
+}
+static method test() → dynamic {
+  new self::D::•(1);
+  #C4;
+  new self::C::•(1);
+  () → self::A f1 = #C5;
+  () → self::B f2 = #C6;
+  (core::int) → self::C f3 = #C7;
+  (core::int) → self::D f4 = #C8;
+  f1(){() → self::A};
+  f2(){() → self::B};
+  f3(1){(core::int) → self::C};
+  f4(1){(core::int) → self::D};
+  () → self::A g1 = #C5;
+  () → self::B g2 = #C6;
+  (core::int) → self::C g3 = #C7;
+  (core::int) → self::D g4 = #C8;
+  g1(){() → self::A};
+  g2(){() → self::B};
+  g3(1){(core::int) → self::C};
+  g4(1){(core::int) → self::D};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirectingFactory
+  #C2 = constructor-tearoff self::A::redirectingFactoryChild
+  #C3 = 1
+  #C4 = self::C {x:#C3}
+  #C5 = constructor-tearoff self::A::•
+  #C6 = constructor-tearoff self::B::•
+  #C7 = constructor-tearoff self::C::•
+  #C8 = constructor-tearoff self::D::•
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C. (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..920c962
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart.weak.modular.expect
@@ -0,0 +1,858 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:12:26: Error: Superclass has no constructor named 'Super'.
+//   Class.constructor1() : super();
+//                          ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:13:26: Error: Superclass has no constructor named 'Super.unresolved'.
+//   Class.constructor2() : super.unresolved();
+//                          ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:14:26: Error: Couldn't find constructor 'Class'.
+//   Class.constructor3() : this();
+//                          ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:15:26: Error: Couldn't find constructor 'Class.unresolved'.
+//   Class.constructor4() : this.unresolved();
+//                          ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:23:3: Error: Method not found: 'UnresolvedClass'.
+//   UnresolvedClass();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:24:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:25:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:27:3: Error: Undefined name 'UnresolvedClass'.
+//   UnresolvedClass.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:28:7: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   new UnresolvedClass.unresolvedConstructor();
+//       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:29:9: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   const UnresolvedClass.unresolvedConstructor();
+//         ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:30:3: Error: Undefined name 'UnresolvedClass'.
+//   UnresolvedClass /**/ .unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:31:7: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   new UnresolvedClass. /**/ unresolvedConstructor();
+//       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:32:9: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   const UnresolvedClass /**/ .unresolvedConstructor();
+//         ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:34:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix.UnresolvedClass();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:35:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   new unresolved_prefix.UnresolvedClass();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:36:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   const unresolved_prefix.UnresolvedClass();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:37:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix. /**/ UnresolvedClass();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:38:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   new unresolved_prefix /**/ .UnresolvedClass();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:39:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   const unresolved_prefix. /**/ UnresolvedClass();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:41:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:42:41: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   new unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                                         ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:43:43: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   const unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                                           ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:44:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix /**/ .UnresolvedClass.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:45:47: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   new unresolved_prefix.UnresolvedClass /**/ .unresolvedConstructor();
+//                                               ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:46:55: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   const unresolved_prefix. /**/ UnresolvedClass. /**/ unresolvedConstructor();
+//                                                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:48:3: Error: Method not found: 'UnresolvedClass'.
+//   UnresolvedClass<int>();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:49:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass<int>();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:50:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass<int>();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:51:3: Error: Method not found: 'UnresolvedClass'.
+//   UnresolvedClass /**/ <int>();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:52:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass<int> /**/ ();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:53:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass /**/ <int>();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:55:3: Error: Couldn't find constructor 'UnresolvedClass'.
+//   UnresolvedClass<int>.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:56:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass<int>.unresolvedConstructor();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:57:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass<int>.unresolvedConstructor();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:58:3: Error: Couldn't find constructor 'UnresolvedClass'.
+//   UnresolvedClass /**/ <int>.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:59:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass<int> /**/ .unresolvedConstructor();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:60:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass<int>. /**/ unresolvedConstructor();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:62:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix.UnresolvedClass<int>();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:63:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   new unresolved_prefix.UnresolvedClass<int>();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:64:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   const unresolved_prefix.UnresolvedClass<int>();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:65:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix /**/ .UnresolvedClass<int>();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:66:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   new unresolved_prefix.UnresolvedClass /**/ <int>();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:67:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   const unresolved_prefix.UnresolvedClass<int> /**/ ();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:69:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:70:46: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   new unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                                              ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:71:48: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   const unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                                                ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:72:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:73:52: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   new unresolved_prefix.UnresolvedClass /**/ <int>.unresolvedConstructor();
+//                                                    ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:74:54: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   const unresolved_prefix.UnresolvedClass<int>. /**/ unresolvedConstructor();
+//                                                      ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:76:3: Error: Couldn't find constructor 'ResolvedClass'.
+//   ResolvedClass();
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:77:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new ResolvedClass();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:78:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const ResolvedClass();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:80:17: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+//   ResolvedClass.unresolvedConstructor();
+//                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:81:21: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new ResolvedClass.unresolvedConstructor();
+//                     ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:82:23: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const ResolvedClass.unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:83:23: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+//   ResolvedClass /**/ .unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:84:27: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new ResolvedClass. /**/ unresolvedConstructor();
+//                           ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:85:29: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const ResolvedClass /**/ .unresolvedConstructor();
+//                             ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:87:19: Error: Method not found: 'UnresolvedClass'.
+//   resolved_prefix.UnresolvedClass();
+//                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:88:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:89:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:90:25: Error: Method not found: 'UnresolvedClass'.
+//   resolved_prefix. /**/ UnresolvedClass();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:91:29: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix /**/ .UnresolvedClass();
+//                             ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:92:31: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix. /**/ UnresolvedClass();
+//                               ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:94:19: Error: Couldn't find constructor 'ResolvedClass'.
+//   resolved_prefix.ResolvedClass();
+//                   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:95:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new resolved_prefix.ResolvedClass();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:96:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const resolved_prefix.ResolvedClass();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:97:25: Error: Couldn't find constructor 'ResolvedClass'.
+//   resolved_prefix. /**/ ResolvedClass();
+//                         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:98:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new resolved_prefix /**/ .ResolvedClass();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:99:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const resolved_prefix. /**/ ResolvedClass();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:101:19: Error: Undefined name 'UnresolvedClass'.
+//   resolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:102:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:103:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:104:25: Error: Undefined name 'UnresolvedClass'.
+//   resolved_prefix /**/ .UnresolvedClass.unresolvedConstructor();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:105:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass /**/ .unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:106:31: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix. /**/ UnresolvedClass. /**/ unresolvedConstructor();
+//                               ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:108:33: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+//   resolved_prefix.ResolvedClass.unresolvedConstructor();
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:109:37: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new resolved_prefix.ResolvedClass.unresolvedConstructor();
+//                                     ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:110:39: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const resolved_prefix.ResolvedClass.unresolvedConstructor();
+//                                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:111:39: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+//   resolved_prefix /**/ .ResolvedClass.unresolvedConstructor();
+//                                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:112:43: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new resolved_prefix.ResolvedClass /**/ .unresolvedConstructor();
+//                                           ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:113:51: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const resolved_prefix. /**/ ResolvedClass. /**/ unresolvedConstructor();
+//                                                   ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:115:3: Error: Couldn't find constructor 'ResolvedClass'.
+//   ResolvedClass<int>();
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:116:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new ResolvedClass<int>();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:117:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const ResolvedClass<int>();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:118:3: Error: Couldn't find constructor 'ResolvedClass'.
+//   ResolvedClass /**/ <int>();
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:119:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new ResolvedClass /**/ <int>();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:120:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const ResolvedClass /**/ <int>();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:122:22: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   ResolvedClass<int>.unresolvedConstructor();
+//                      ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:123:26: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new ResolvedClass<int>.unresolvedConstructor();
+//                          ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:124:28: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const ResolvedClass<int>.unresolvedConstructor();
+//                            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:125:28: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   ResolvedClass<int> /**/ .unresolvedConstructor();
+//                            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:126:32: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new ResolvedClass<int>. /**/ unresolvedConstructor();
+//                                ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:127:34: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const ResolvedClass /**/ <int>.unresolvedConstructor();
+//                                  ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:129:19: Error: Method not found: 'UnresolvedClass'.
+//   resolved_prefix.UnresolvedClass<int>();
+//                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:130:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass<int>();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:131:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass<int>();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:132:25: Error: Method not found: 'UnresolvedClass'.
+//   resolved_prefix. /**/ UnresolvedClass<int>();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:133:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass /**/ <int>();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:134:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass<int> /**/ ();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:136:19: Error: Couldn't find constructor 'ResolvedClass'.
+//   resolved_prefix.ResolvedClass<int>();
+//                   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:137:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new resolved_prefix.ResolvedClass<int>();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:138:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const resolved_prefix.ResolvedClass<int>();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:139:25: Error: Couldn't find constructor 'ResolvedClass'.
+//   resolved_prefix. /**/ ResolvedClass<int>();
+//                         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:140:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new resolved_prefix.ResolvedClass /**/ <int>();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:141:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const resolved_prefix.ResolvedClass<int> /**/ ();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:143:19: Error: Couldn't find constructor 'UnresolvedClass'.
+//   resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:144:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:145:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:146:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   resolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:147:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass<int> /**/ .unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:149:14: Error: Couldn't find constructor 'UnresolvedClass'.
+//       . /**/ UnresolvedClass<int>. /**/ unresolvedConstructor();
+//              ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:151:38: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+//                                      ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:152:42: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+//                                          ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:153:44: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+//                                            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:154:44: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   resolved_prefix /**/ .ResolvedClass<int>.unresolvedConstructor();
+//                                            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:155:48: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new resolved_prefix.ResolvedClass<int> /**/ .unresolvedConstructor();
+//                                                ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:156:56: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const resolved_prefix. /**/ ResolvedClass<int>. /**/ unresolvedConstructor();
+//                                                        ^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///unresolved_constructor_invocation.dart" as resolved_prefix;
+
+class Super extends core::Object {
+  constructor named() → self::Super
+    : super core::Object::•()
+    ;
+}
+class Class extends self::Super {
+  constructor constructor1() → self::Class
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:12:26: Error: Superclass has no constructor named 'Super'.
+  Class.constructor1() : super();
+                         ^^^^^"
+    ;
+  constructor constructor2() → self::Class
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:13:26: Error: Superclass has no constructor named 'Super.unresolved'.
+  Class.constructor2() : super.unresolved();
+                         ^^^^^"
+    ;
+  constructor constructor3() → self::Class
+    : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:14:26: Error: Couldn't find constructor 'Class'.
+  Class.constructor3() : this();
+                         ^^^^"
+    ;
+  constructor constructor4() → self::Class
+    : final dynamic #t4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:15:26: Error: Couldn't find constructor 'Class.unresolved'.
+  Class.constructor4() : this.unresolved();
+                         ^^^^"
+    ;
+}
+class ResolvedClass<T extends core::Object? = dynamic> extends core::Object {
+  constructor named() → self::ResolvedClass<self::ResolvedClass::T%>
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:23:3: Error: Method not found: 'UnresolvedClass'.
+  UnresolvedClass();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:24:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:25:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:27:3: Error: Undefined name 'UnresolvedClass'.
+  UnresolvedClass.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^"{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:28:7: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  new UnresolvedClass.unresolvedConstructor();
+      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:29:9: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  const UnresolvedClass.unresolvedConstructor();
+        ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:30:3: Error: Undefined name 'UnresolvedClass'.
+  UnresolvedClass /**/ .unresolvedConstructor();
+  ^^^^^^^^^^^^^^^"{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:31:7: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  new UnresolvedClass. /**/ unresolvedConstructor();
+      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:32:9: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  const UnresolvedClass /**/ .unresolvedConstructor();
+        ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:34:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix.UnresolvedClass();
+  ^^^^^^^^^^^^^^^^^"{dynamic}.UnresolvedClass();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:35:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  new unresolved_prefix.UnresolvedClass();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:36:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  const unresolved_prefix.UnresolvedClass();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:37:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix. /**/ UnresolvedClass();
+  ^^^^^^^^^^^^^^^^^"{dynamic}.UnresolvedClass();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:38:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  new unresolved_prefix /**/ .UnresolvedClass();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:39:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  const unresolved_prefix. /**/ UnresolvedClass();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:41:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^^^"{<invalid>}.UnresolvedClass{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:42:41: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  new unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+                                        ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:43:43: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  const unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+                                          ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:44:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix /**/ .UnresolvedClass.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^^^"{<invalid>}.UnresolvedClass{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:45:47: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  new unresolved_prefix.UnresolvedClass /**/ .unresolvedConstructor();
+                                              ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:46:55: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  const unresolved_prefix. /**/ UnresolvedClass. /**/ unresolvedConstructor();
+                                                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:48:3: Error: Method not found: 'UnresolvedClass'.
+  UnresolvedClass<int>();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:49:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass<int>();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:50:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass<int>();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:51:3: Error: Method not found: 'UnresolvedClass'.
+  UnresolvedClass /**/ <int>();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:52:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass<int> /**/ ();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:53:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass /**/ <int>();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:55:3: Error: Couldn't find constructor 'UnresolvedClass'.
+  UnresolvedClass<int>.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:56:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass<int>.unresolvedConstructor();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:57:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass<int>.unresolvedConstructor();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:58:3: Error: Couldn't find constructor 'UnresolvedClass'.
+  UnresolvedClass /**/ <int>.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:59:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass<int> /**/ .unresolvedConstructor();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:60:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass<int>. /**/ unresolvedConstructor();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:62:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix.UnresolvedClass<int>();
+  ^^^^^^^^^^^^^^^^^"{dynamic}.UnresolvedClass<core::int>();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:63:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  new unresolved_prefix.UnresolvedClass<int>();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:64:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  const unresolved_prefix.UnresolvedClass<int>();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:65:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix /**/ .UnresolvedClass<int>();
+  ^^^^^^^^^^^^^^^^^"{dynamic}.UnresolvedClass<core::int>();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:66:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  new unresolved_prefix.UnresolvedClass /**/ <int>();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:67:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  const unresolved_prefix.UnresolvedClass<int> /**/ ();
+        ^^^^^^^^^^^^^^^";
+  (invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:69:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^^^"{<invalid>}.UnresolvedClass<core::int>){dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:70:46: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  new unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                                             ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:71:48: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  const unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                                               ^^^^^^^^^^^^^^^^^^^^^";
+  (invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:72:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^^^"{<invalid>}.UnresolvedClass<core::int>){dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:73:52: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  new unresolved_prefix.UnresolvedClass /**/ <int>.unresolvedConstructor();
+                                                   ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:74:54: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  const unresolved_prefix.UnresolvedClass<int>. /**/ unresolvedConstructor();
+                                                     ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:76:3: Error: Couldn't find constructor 'ResolvedClass'.
+  ResolvedClass();
+  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:77:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new ResolvedClass();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:78:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const ResolvedClass();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:80:17: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+  ResolvedClass.unresolvedConstructor();
+                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:81:21: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new ResolvedClass.unresolvedConstructor();
+                    ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:82:23: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const ResolvedClass.unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:83:23: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+  ResolvedClass /**/ .unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:84:27: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new ResolvedClass. /**/ unresolvedConstructor();
+                          ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:85:29: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const ResolvedClass /**/ .unresolvedConstructor();
+                            ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:87:19: Error: Method not found: 'UnresolvedClass'.
+  resolved_prefix.UnresolvedClass();
+                  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:88:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:89:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:90:25: Error: Method not found: 'UnresolvedClass'.
+  resolved_prefix. /**/ UnresolvedClass();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:91:29: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix /**/ .UnresolvedClass();
+                            ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:92:31: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix. /**/ UnresolvedClass();
+                              ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:94:19: Error: Couldn't find constructor 'ResolvedClass'.
+  resolved_prefix.ResolvedClass();
+                  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:95:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new resolved_prefix.ResolvedClass();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:96:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const resolved_prefix.ResolvedClass();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:97:25: Error: Couldn't find constructor 'ResolvedClass'.
+  resolved_prefix. /**/ ResolvedClass();
+                        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:98:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new resolved_prefix /**/ .ResolvedClass();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:99:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const resolved_prefix. /**/ ResolvedClass();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:101:19: Error: Undefined name 'UnresolvedClass'.
+  resolved_prefix.UnresolvedClass.unresolvedConstructor();
+                  ^^^^^^^^^^^^^^^"{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:102:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass.unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:103:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass.unresolvedConstructor();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:104:25: Error: Undefined name 'UnresolvedClass'.
+  resolved_prefix /**/ .UnresolvedClass.unresolvedConstructor();
+                        ^^^^^^^^^^^^^^^"{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:105:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass /**/ .unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:106:31: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix. /**/ UnresolvedClass. /**/ unresolvedConstructor();
+                              ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:108:33: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+  resolved_prefix.ResolvedClass.unresolvedConstructor();
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:109:37: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new resolved_prefix.ResolvedClass.unresolvedConstructor();
+                                    ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:110:39: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const resolved_prefix.ResolvedClass.unresolvedConstructor();
+                                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:111:39: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+  resolved_prefix /**/ .ResolvedClass.unresolvedConstructor();
+                                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:112:43: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new resolved_prefix.ResolvedClass /**/ .unresolvedConstructor();
+                                          ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:113:51: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const resolved_prefix. /**/ ResolvedClass. /**/ unresolvedConstructor();
+                                                  ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:115:3: Error: Couldn't find constructor 'ResolvedClass'.
+  ResolvedClass<int>();
+  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:116:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new ResolvedClass<int>();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:117:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const ResolvedClass<int>();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:118:3: Error: Couldn't find constructor 'ResolvedClass'.
+  ResolvedClass /**/ <int>();
+  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:119:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new ResolvedClass /**/ <int>();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:120:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const ResolvedClass /**/ <int>();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:122:22: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  ResolvedClass<int>.unresolvedConstructor();
+                     ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:123:26: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new ResolvedClass<int>.unresolvedConstructor();
+                         ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:124:28: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const ResolvedClass<int>.unresolvedConstructor();
+                           ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:125:28: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  ResolvedClass<int> /**/ .unresolvedConstructor();
+                           ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:126:32: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new ResolvedClass<int>. /**/ unresolvedConstructor();
+                               ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:127:34: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const ResolvedClass /**/ <int>.unresolvedConstructor();
+                                 ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:129:19: Error: Method not found: 'UnresolvedClass'.
+  resolved_prefix.UnresolvedClass<int>();
+                  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:130:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass<int>();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:131:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass<int>();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:132:25: Error: Method not found: 'UnresolvedClass'.
+  resolved_prefix. /**/ UnresolvedClass<int>();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:133:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass /**/ <int>();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:134:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass<int> /**/ ();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:136:19: Error: Couldn't find constructor 'ResolvedClass'.
+  resolved_prefix.ResolvedClass<int>();
+                  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:137:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new resolved_prefix.ResolvedClass<int>();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:138:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const resolved_prefix.ResolvedClass<int>();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:139:25: Error: Couldn't find constructor 'ResolvedClass'.
+  resolved_prefix. /**/ ResolvedClass<int>();
+                        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:140:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new resolved_prefix.ResolvedClass /**/ <int>();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:141:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const resolved_prefix.ResolvedClass<int> /**/ ();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:143:19: Error: Couldn't find constructor 'UnresolvedClass'.
+  resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:144:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:145:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:146:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  resolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:147:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass<int> /**/ .unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:149:14: Error: Couldn't find constructor 'UnresolvedClass'.
+      . /**/ UnresolvedClass<int>. /**/ unresolvedConstructor();
+             ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:151:38: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+                                     ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:152:42: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+                                         ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:153:44: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+                                           ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:154:44: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  resolved_prefix /**/ .ResolvedClass<int>.unresolvedConstructor();
+                                           ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:155:48: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new resolved_prefix.ResolvedClass<int> /**/ .unresolvedConstructor();
+                                               ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unresolved_constructor_invocation.dart:156:56: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const resolved_prefix. /**/ ResolvedClass<int>. /**/ unresolvedConstructor();
+                                                       ^^^^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart b/pkg/front_end/testcases/dart2js/conditional_import.dart
new file mode 100644
index 0000000..6122451
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {
+  request.certificate; // error (from dart:io)
+  request.response; // ok (from dart:io and dart:html)
+  request.readyState; // ok (from dart:html)
+  request.hashCode; // ok
+}
+
+testB(b.HttpRequest request) {
+  request.certificate; // error
+  request.response; // error
+  request.readyState; // error
+  request.hashCode; // ok
+}
+
+void main() {
+  expect(false, const bool.fromEnvironment("dart.library.io"));
+  expect(true, const bool.fromEnvironment("dart.library.html"));
+  expect(false, const bool.fromEnvironment("dart.library.foo"));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.transformed.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.strong.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline.expect
new file mode 100644
index 0000000..dc10727
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..6e90f3d
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+class HttpRequest {}
+
+expect(expected, actual) {}
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.modular.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.outline.expect
new file mode 100644
index 0000000..8e7ea0f
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic
+  ;
+static method testB(self::HttpRequest request) → dynamic
+  ;
+static method main() → void
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.transformed.expect
new file mode 100644
index 0000000..5f33ec1
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/conditional_import.dart.weak.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dart2js/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dart2js/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart
new file mode 100644
index 0000000..b7234a7
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef Alias<T extends num> = Class<T>;
+
+class Class<T> {
+  Class();
+  factory Class.fact() => Class<T>();
+  factory Class.redirect() = Class<T>;
+}
+
+const a = Class.new;
+const b = Class.fact;
+const c = Class.redirect;
+const d = Alias.new;
+const e = Alias.fact;
+const f = Alias.redirect;
+
+main() {
+  print('$a$b$c$d$e$f');
+}
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.strong.expect b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.strong.expect
new file mode 100644
index 0000000..46e4364
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.strong.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Alias<T extends core::num> = self::Class<T>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::Class<self::Class::redirect::T%>
+    return new self::Class::•<self::Class::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#redirect#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirect#tearOff::T%>();
+}
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> a = #C2;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> c = #C4;
+static const field <T extends core::num>() → self::Class<T> d = #C5;
+static const field <T extends core::num>() → self::Class<T> e = #C6;
+static const field <T extends core::num>() → self::Class<T> f = #C7;
+static method main() → dynamic {
+  core::print("${#C2}${#C3}${#C4}${#C5}${#C6}${#C7}");
+}
+static method _#Alias#new#tearOff<T extends core::num>() → self::Class<self::_#Alias#new#tearOff::T>
+  return new self::Class::•<self::_#Alias#new#tearOff::T>();
+static method _#Alias#fact#tearOff<T extends core::num>() → self::Class<self::_#Alias#fact#tearOff::T>
+  return self::Class::fact<self::_#Alias#fact#tearOff::T>();
+static method _#Alias#redirect#tearOff<T extends core::num>() → self::Class<self::_#Alias#redirect#tearOff::T>
+  return self::Class::_#redirect#tearOff<self::_#Alias#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = static-tearoff self::Class::_#new#tearOff
+  #C3 = static-tearoff self::Class::_#fact#tearOff
+  #C4 = static-tearoff self::Class::_#redirect#tearOff
+  #C5 = static-tearoff self::_#Alias#new#tearOff
+  #C6 = static-tearoff self::_#Alias#fact#tearOff
+  #C7 = static-tearoff self::_#Alias#redirect#tearOff
+}
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.strong.transformed.expect
new file mode 100644
index 0000000..46e4364
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Alias<T extends core::num> = self::Class<T>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::Class<self::Class::redirect::T%>
+    return new self::Class::•<self::Class::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#redirect#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirect#tearOff::T%>();
+}
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> a = #C2;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> c = #C4;
+static const field <T extends core::num>() → self::Class<T> d = #C5;
+static const field <T extends core::num>() → self::Class<T> e = #C6;
+static const field <T extends core::num>() → self::Class<T> f = #C7;
+static method main() → dynamic {
+  core::print("${#C2}${#C3}${#C4}${#C5}${#C6}${#C7}");
+}
+static method _#Alias#new#tearOff<T extends core::num>() → self::Class<self::_#Alias#new#tearOff::T>
+  return new self::Class::•<self::_#Alias#new#tearOff::T>();
+static method _#Alias#fact#tearOff<T extends core::num>() → self::Class<self::_#Alias#fact#tearOff::T>
+  return self::Class::fact<self::_#Alias#fact#tearOff::T>();
+static method _#Alias#redirect#tearOff<T extends core::num>() → self::Class<self::_#Alias#redirect#tearOff::T>
+  return self::Class::_#redirect#tearOff<self::_#Alias#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = static-tearoff self::Class::_#new#tearOff
+  #C3 = static-tearoff self::Class::_#fact#tearOff
+  #C4 = static-tearoff self::Class::_#redirect#tearOff
+  #C5 = static-tearoff self::_#Alias#new#tearOff
+  #C6 = static-tearoff self::_#Alias#fact#tearOff
+  #C7 = static-tearoff self::_#Alias#redirect#tearOff
+}
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.textual_outline.expect
new file mode 100644
index 0000000..89d865d
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+typedef Alias<T extends num> = Class<T>;
+
+class Class<T> {
+  Class();
+  factory Class.fact() => Class<T>();
+  factory Class.redirect() = Class<T>;
+}
+
+const a = Class.new;
+const b = Class.fact;
+const c = Class.redirect;
+const d = Alias.new;
+const e = Alias.fact;
+const f = Alias.redirect;
+main() {}
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3f714c9
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+class Class<T> {
+  Class();
+  factory Class.fact() => Class<T>();
+  factory Class.redirect() = Class<T>;
+}
+
+const a = Class.new;
+const b = Class.fact;
+const c = Class.redirect;
+const d = Alias.new;
+const e = Alias.fact;
+const f = Alias.redirect;
+main() {}
+typedef Alias<T extends num> = Class<T>;
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.expect b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.expect
new file mode 100644
index 0000000..46e4364
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Alias<T extends core::num> = self::Class<T>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::Class<self::Class::redirect::T%>
+    return new self::Class::•<self::Class::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#redirect#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirect#tearOff::T%>();
+}
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> a = #C2;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> c = #C4;
+static const field <T extends core::num>() → self::Class<T> d = #C5;
+static const field <T extends core::num>() → self::Class<T> e = #C6;
+static const field <T extends core::num>() → self::Class<T> f = #C7;
+static method main() → dynamic {
+  core::print("${#C2}${#C3}${#C4}${#C5}${#C6}${#C7}");
+}
+static method _#Alias#new#tearOff<T extends core::num>() → self::Class<self::_#Alias#new#tearOff::T>
+  return new self::Class::•<self::_#Alias#new#tearOff::T>();
+static method _#Alias#fact#tearOff<T extends core::num>() → self::Class<self::_#Alias#fact#tearOff::T>
+  return self::Class::fact<self::_#Alias#fact#tearOff::T>();
+static method _#Alias#redirect#tearOff<T extends core::num>() → self::Class<self::_#Alias#redirect#tearOff::T>
+  return self::Class::_#redirect#tearOff<self::_#Alias#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = static-tearoff self::Class::_#new#tearOff
+  #C3 = static-tearoff self::Class::_#fact#tearOff
+  #C4 = static-tearoff self::Class::_#redirect#tearOff
+  #C5 = static-tearoff self::_#Alias#new#tearOff
+  #C6 = static-tearoff self::_#Alias#fact#tearOff
+  #C7 = static-tearoff self::_#Alias#redirect#tearOff
+}
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.modular.expect
new file mode 100644
index 0000000..46e4364
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Alias<T extends core::num> = self::Class<T>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::Class<self::Class::redirect::T%>
+    return new self::Class::•<self::Class::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#redirect#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirect#tearOff::T%>();
+}
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> a = #C2;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> c = #C4;
+static const field <T extends core::num>() → self::Class<T> d = #C5;
+static const field <T extends core::num>() → self::Class<T> e = #C6;
+static const field <T extends core::num>() → self::Class<T> f = #C7;
+static method main() → dynamic {
+  core::print("${#C2}${#C3}${#C4}${#C5}${#C6}${#C7}");
+}
+static method _#Alias#new#tearOff<T extends core::num>() → self::Class<self::_#Alias#new#tearOff::T>
+  return new self::Class::•<self::_#Alias#new#tearOff::T>();
+static method _#Alias#fact#tearOff<T extends core::num>() → self::Class<self::_#Alias#fact#tearOff::T>
+  return self::Class::fact<self::_#Alias#fact#tearOff::T>();
+static method _#Alias#redirect#tearOff<T extends core::num>() → self::Class<self::_#Alias#redirect#tearOff::T>
+  return self::Class::_#redirect#tearOff<self::_#Alias#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = static-tearoff self::Class::_#new#tearOff
+  #C3 = static-tearoff self::Class::_#fact#tearOff
+  #C4 = static-tearoff self::Class::_#redirect#tearOff
+  #C5 = static-tearoff self::_#Alias#new#tearOff
+  #C6 = static-tearoff self::_#Alias#fact#tearOff
+  #C7 = static-tearoff self::_#Alias#redirect#tearOff
+}
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.outline.expect
new file mode 100644
index 0000000..48c9e36
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.outline.expect
@@ -0,0 +1,45 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Alias<T extends core::num> = self::Class<T>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirect]/*isLegacy*/;
+  constructor •() → self::Class<self::Class::T%>
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::Class<self::Class::fact::T%>
+    ;
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::Class<self::Class::redirect::T%>
+    return new self::Class::•<self::Class::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#redirect#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirect#tearOff::T%>();
+}
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> a = self::Class::_#new#tearOff;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> b = self::Class::_#fact#tearOff;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> c = self::Class::_#redirect#tearOff;
+static const field <T extends core::num>() → self::Class<T> d = self::_#Alias#new#tearOff;
+static const field <T extends core::num>() → self::Class<T> e = self::_#Alias#fact#tearOff;
+static const field <T extends core::num>() → self::Class<T> f = self::_#Alias#redirect#tearOff;
+static method main() → dynamic
+  ;
+static method _#Alias#new#tearOff<T extends core::num>() → self::Class<self::_#Alias#new#tearOff::T>
+  return new self::Class::•<self::_#Alias#new#tearOff::T>();
+static method _#Alias#fact#tearOff<T extends core::num>() → self::Class<self::_#Alias#fact#tearOff::T>
+  return self::Class::fact<self::_#Alias#fact#tearOff::T>();
+static method _#Alias#redirect#tearOff<T extends core::num>() → self::Class<self::_#Alias#redirect#tearOff::T>
+  return self::Class::_#redirect#tearOff<self::_#Alias#redirect#tearOff::T>();
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_tearoff.dart:7:7 -> ConstructorTearOffConstant(Class.redirect)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///constructor_tearoff.dart:13:11 -> StaticTearOffConstant(Class._#new#tearOff)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///constructor_tearoff.dart:14:11 -> StaticTearOffConstant(Class._#fact#tearOff)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///constructor_tearoff.dart:15:11 -> StaticTearOffConstant(Class._#redirect#tearOff)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///constructor_tearoff.dart:16:11 -> StaticTearOffConstant(_#Alias#new#tearOff)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///constructor_tearoff.dart:17:11 -> StaticTearOffConstant(_#Alias#fact#tearOff)
+Evaluated: StaticTearOff @ org-dartlang-testcase:///constructor_tearoff.dart:18:11 -> StaticTearOffConstant(_#Alias#redirect#tearOff)
+Extra constant evaluation: evaluated: 15, effectively constant: 7
diff --git a/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.transformed.expect
new file mode 100644
index 0000000..46e4364
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/constructor_tearoff.dart.weak.transformed.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Alias<T extends core::num> = self::Class<T>;
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>();
+  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>();
+  static factory redirect<T extends core::Object? = dynamic>() → self::Class<self::Class::redirect::T%>
+    return new self::Class::•<self::Class::redirect::T%>();
+  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::Class<self::Class::_#redirect#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirect#tearOff::T%>();
+}
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> a = #C2;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> b = #C3;
+static const field <T extends core::Object? = dynamic>() → self::Class<T%> c = #C4;
+static const field <T extends core::num>() → self::Class<T> d = #C5;
+static const field <T extends core::num>() → self::Class<T> e = #C6;
+static const field <T extends core::num>() → self::Class<T> f = #C7;
+static method main() → dynamic {
+  core::print("${#C2}${#C3}${#C4}${#C5}${#C6}${#C7}");
+}
+static method _#Alias#new#tearOff<T extends core::num>() → self::Class<self::_#Alias#new#tearOff::T>
+  return new self::Class::•<self::_#Alias#new#tearOff::T>();
+static method _#Alias#fact#tearOff<T extends core::num>() → self::Class<self::_#Alias#fact#tearOff::T>
+  return self::Class::fact<self::_#Alias#fact#tearOff::T>();
+static method _#Alias#redirect#tearOff<T extends core::num>() → self::Class<self::_#Alias#redirect#tearOff::T>
+  return self::Class::_#redirect#tearOff<self::_#Alias#redirect#tearOff::T>();
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+  #C2 = static-tearoff self::Class::_#new#tearOff
+  #C3 = static-tearoff self::Class::_#fact#tearOff
+  #C4 = static-tearoff self::Class::_#redirect#tearOff
+  #C5 = static-tearoff self::_#Alias#new#tearOff
+  #C6 = static-tearoff self::_#Alias#fact#tearOff
+  #C7 = static-tearoff self::_#Alias#redirect#tearOff
+}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart
new file mode 100644
index 0000000..eba0279
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'main_lib.dart';
+
+main() {
+  MyInt.a = 42;
+  print(MyInt.a);
+  MyInt.b = 87;
+  print(MyInt.b);
+}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.strong.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.strong.expect
new file mode 100644
index 0000000..22796ec
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.strong.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+//   MyInt.a = 42;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+  MyInt.a = 42;
+        ^";
+  core::print(mai::_#MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_late_helper" as _la;
+
+extension MyInt on core::int {
+  static field a = mai::_#MyInt|a;
+  static field b = mai::MyInt|b;
+}
+static final field _la::_Cell _#MyInt|a = new _la::_Cell::named("MyInt|a");
+late static field core::int MyInt|b = 42;
+static get MyInt|a() → core::int
+  return mai::_#MyInt|a.{_la::_Cell::readField}<core::int>(){() → core::int};
+static set MyInt|a(core::int value) → void
+  return mai::_#MyInt|a.{_la::_Cell::value} = value;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..22796ec
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.strong.transformed.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+//   MyInt.a = 42;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+  MyInt.a = 42;
+        ^";
+  core::print(mai::_#MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_late_helper" as _la;
+
+extension MyInt on core::int {
+  static field a = mai::_#MyInt|a;
+  static field b = mai::MyInt|b;
+}
+static final field _la::_Cell _#MyInt|a = new _la::_Cell::named("MyInt|a");
+late static field core::int MyInt|b = 42;
+static get MyInt|a() → core::int
+  return mai::_#MyInt|a.{_la::_Cell::readField}<core::int>(){() → core::int};
+static set MyInt|a(core::int value) → void
+  return mai::_#MyInt|a.{_la::_Cell::value} = value;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.textual_outline.expect
new file mode 100644
index 0000000..82be6bb
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+import 'main_lib.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..82be6bb
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+import 'main_lib.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.expect
new file mode 100644
index 0000000..22796ec
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+//   MyInt.a = 42;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+  MyInt.a = 42;
+        ^";
+  core::print(mai::_#MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_late_helper" as _la;
+
+extension MyInt on core::int {
+  static field a = mai::_#MyInt|a;
+  static field b = mai::MyInt|b;
+}
+static final field _la::_Cell _#MyInt|a = new _la::_Cell::named("MyInt|a");
+late static field core::int MyInt|b = 42;
+static get MyInt|a() → core::int
+  return mai::_#MyInt|a.{_la::_Cell::readField}<core::int>(){() → core::int};
+static set MyInt|a(core::int value) → void
+  return mai::_#MyInt|a.{_la::_Cell::value} = value;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.modular.expect
new file mode 100644
index 0000000..e99296f
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+//   MyInt.a = 42;
+//         ^
+//
+// pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:10:9: Error: Setter not found: 'b'.
+//   MyInt.b = 87;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+  MyInt.a = 42;
+        ^";
+  core::print(mai::_#MyInt|a);
+  invalid-expression "pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:10:9: Error: Setter not found: 'b'.
+  MyInt.b = 87;
+        ^";
+  core::print(mai::_#MyInt|b);
+}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.outline.expect
new file mode 100644
index 0000000..0d8e400
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.outline.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+import "dart:_late_helper" as _la;
+
+extension MyInt on core::int {
+  static field a = self2::_#MyInt|a;
+  static field b = self2::_#MyInt|b;
+}
+static final field _la::_Cell _#MyInt|a = new _la::_Cell::named("MyInt|a");
+static final field _la::_Cell _#MyInt|b = new _la::_Cell::named("MyInt|b");
+static get MyInt|a() → core::int
+  return self2::_#MyInt|a.{_la::_Cell::readField}<core::int>(){() → core::int};
+static set MyInt|a(core::int value) → void
+  return self2::_#MyInt|a.{_la::_Cell::value} = value;
+static get MyInt|b() → core::int
+  return self2::_#MyInt|b.{_la::_Cell::readField}<core::int>(){() → core::int};
+static set MyInt|b(core::int value) → void
+  return self2::_#MyInt|b.{_la::_Cell::value} = value;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..22796ec
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart.weak.transformed.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+//   MyInt.a = 42;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/dart2js/flutter_issue94561/main.dart:8:9: Error: Setter not found: 'a'.
+  MyInt.a = 42;
+        ^";
+  core::print(mai::_#MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_late_helper" as _la;
+
+extension MyInt on core::int {
+  static field a = mai::_#MyInt|a;
+  static field b = mai::MyInt|b;
+}
+static final field _la::_Cell _#MyInt|a = new _la::_Cell::named("MyInt|a");
+late static field core::int MyInt|b = 42;
+static get MyInt|a() → core::int
+  return mai::_#MyInt|a.{_la::_Cell::readField}<core::int>(){() → core::int};
+static set MyInt|a(core::int value) → void
+  return mai::_#MyInt|a.{_la::_Cell::value} = value;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart
new file mode 100644
index 0000000..eba0279
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'main_lib.dart';
+
+main() {
+  MyInt.a = 42;
+  print(MyInt.a);
+  MyInt.b = 87;
+  print(MyInt.b);
+}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.strong.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.strong.expect
new file mode 100644
index 0000000..212c4ea
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.strong.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  mai::MyInt|a = 42;
+  core::print(mai::MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+extension MyInt on core::int {
+  static field a = mai::MyInt|a;
+  static field b = mai::MyInt|b;
+}
+late static field core::int MyInt|a;
+late static field core::int MyInt|b = 42;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.strong.transformed.expect
new file mode 100644
index 0000000..c8646b7
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  mai::MyInt|a = 42;
+  core::print(mai::MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_late_helper" as _la;
+
+extension MyInt on core::int {
+  static field a = mai::_#MyInt|a;
+  static field b = mai::MyInt|b;
+}
+static final field _la::_Cell _#MyInt|a = new _la::_Cell::named("MyInt|a");
+late static field core::int MyInt|b = 42;
+static get MyInt|a() → core::int
+  return mai::_#MyInt|a.{_la::_Cell::readField}<core::int>(){() → core::int};
+static set MyInt|a(core::int value) → void
+  return mai::_#MyInt|a.{_la::_Cell::value} = value;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.textual_outline.expect
new file mode 100644
index 0000000..82be6bb
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+import 'main_lib.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..82be6bb
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+import 'main_lib.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.expect
new file mode 100644
index 0000000..212c4ea
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  mai::MyInt|a = 42;
+  core::print(mai::MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+extension MyInt on core::int {
+  static field a = mai::MyInt|a;
+  static field b = mai::MyInt|b;
+}
+late static field core::int MyInt|a;
+late static field core::int MyInt|b = 42;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..212c4ea
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  mai::MyInt|a = 42;
+  core::print(mai::MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+extension MyInt on core::int {
+  static field a = mai::MyInt|a;
+  static field b = mai::MyInt|b;
+}
+late static field core::int MyInt|a;
+late static field core::int MyInt|b = 42;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.outline.expect
new file mode 100644
index 0000000..5451823
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+extension MyInt on core::int {
+  static field a = self2::MyInt|a;
+  static field b = self2::MyInt|b;
+}
+late static field core::int MyInt|a;
+late static field core::int MyInt|b;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.transformed.expect
new file mode 100644
index 0000000..c8646b7
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main.no_link.dart.weak.transformed.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  mai::MyInt|a = 42;
+  core::print(mai::MyInt|a);
+  mai::MyInt|b = 87;
+  core::print(mai::MyInt|b);
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+import "dart:_late_helper" as _la;
+
+extension MyInt on core::int {
+  static field a = mai::_#MyInt|a;
+  static field b = mai::MyInt|b;
+}
+static final field _la::_Cell _#MyInt|a = new _la::_Cell::named("MyInt|a");
+late static field core::int MyInt|b = 42;
+static get MyInt|a() → core::int
+  return mai::_#MyInt|a.{_la::_Cell::readField}<core::int>(){() → core::int};
+static set MyInt|a(core::int value) → void
+  return mai::_#MyInt|a.{_la::_Cell::value} = value;
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/main_lib.dart b/pkg/front_end/testcases/dart2js/flutter_issue94561/main_lib.dart
new file mode 100644
index 0000000..7fcb8f2
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/main_lib.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+extension MyInt on int {
+  static late int a;
+  static late int b = 42;
+}
diff --git a/pkg/front_end/testcases/dart2js/flutter_issue94561/test.options b/pkg/front_end/testcases/dart2js/flutter_issue94561/test.options
new file mode 100644
index 0000000..61731a9
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/flutter_issue94561/test.options
@@ -0,0 +1 @@
+main_lib.dart
diff --git a/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..d249938
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/instance_getter_invocation.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get idFunction() → <S extends core::Object? = dynamic>(S%) → S%
+    return #C1;
+  get dynFunction() → dynamic
+    return #C1;
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
+}
+static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
+  return t;
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  let final self::Class #t1 = c in let final core::int #t2 = 0 in #t1.{self::Class::idFunction}<core::int>(#t2){(core::int) → core::int};
+  let final self::Class #t3 = c in let final core::int #t4 = 0 in #t3.{self::Class::idFunction}<core::int>(#t4){(core::int) → core::int};
+  let final self::Class #t5 = c in let final core::int #t6 = 0 in #t5.{self::Class::dynFunction}(#t6);
+}
+
+constants  {
+  #C1 = static-tearoff self::id
+}
diff --git a/pkg/front_end/testcases/dart2js/late_fields.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/late_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..a546427
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/late_fields.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  late field core::int a;
+  late final [setter] field core::int b;
+  late field core::int c = 1.{core::int::unary-}(){() → core::int};
+  late final field core::int d = 1.{core::int::unary-}(){() → core::int};
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::C
+    return new self::C::•();
+}
+static field self::C c = new self::C::•();
+static method main() → void {
+  self::testUninitializedNonFinalInstanceField();
+  self::testUninitializedFinalInstanceField();
+  self::testInitializedNonFinalInstanceField();
+  self::testInitializedFinalInstanceField();
+}
+static method testUninitializedNonFinalInstanceField() → void {
+  core::print(self::c.{self::C::a}{core::int});
+  self::c.{self::C::a} = 42;
+  core::print(self::c.{self::C::a}{core::int});
+}
+static method testUninitializedFinalInstanceField() → void {
+  core::print(self::c.{self::C::b}{core::int});
+  self::c.{self::C::b} = 42;
+  core::print(self::c.{self::C::b}{core::int});
+}
+static method testInitializedNonFinalInstanceField() → void {
+  core::print(self::c.{self::C::c}{core::int});
+  self::c.{self::C::c} = 42;
+  core::print(self::c.{self::C::c}{core::int});
+}
+static method testInitializedFinalInstanceField() → void {
+  core::print(self::c.{self::C::d}{core::int});
+}
diff --git a/pkg/front_end/testcases/dart2js/late_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/late_from_dill/main.dart.weak.modular.expect
new file mode 100644
index 0000000..ece489e
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/late_from_dill/main.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart" as lib;
+
+static field mai::C c = new mai::C::•();
+static method main() → void {
+  self::testUninitializedNonFinalInstanceField();
+  self::testUninitializedFinalInstanceField();
+  self::testInitializedNonFinalInstanceField();
+  self::testInitializedFinalInstanceField();
+  mai::testNullableUninitializedNonFinalLocal();
+  mai::testNonNullableUninitializedNonFinalLocal();
+  mai::testNullableUninitializedFinalLocal();
+  mai::testNonNullableUninitializedFinalLocal();
+  mai::testNullableInitializedNonFinalLocal();
+  mai::testNonNullableInitializedNonFinalLocal();
+  mai::testNullableInitializedFinalLocal();
+  mai::testNonNullableInitializedFinalLocal();
+  self::testUninitializedNonFinalStaticField();
+  self::testUninitializedFinalStaticField();
+  self::testInitializedNonFinalStaticField();
+  self::testInitializedFinalStaticField();
+  self::testUninitializedNonFinalTopLevelField();
+  self::testUninitializedFinalTopLevelField();
+  self::testInitializedNonFinalTopLevelField();
+  self::testInitializedFinalTopLevelField();
+}
+static method testUninitializedNonFinalInstanceField() → void {
+  core::print(self::c.{mai::C::a}{core::int});
+  self::c.{mai::C::a} = 42;
+  core::print(self::c.{mai::C::a}{core::int});
+}
+static method testUninitializedFinalInstanceField() → void {
+  core::print(self::c.{mai::C::b}{core::int});
+  self::c.{mai::C::b} = 42;
+  core::print(self::c.{mai::C::b}{core::int});
+}
+static method testInitializedNonFinalInstanceField() → void {
+  core::print(self::c.{mai::C::c}{core::int});
+  self::c.{mai::C::c} = 42;
+  core::print(self::c.{mai::C::c}{core::int});
+}
+static method testInitializedFinalInstanceField() → void {
+  core::print(self::c.{mai::C::d}{core::int});
+}
+static method testUninitializedNonFinalStaticField() → void {
+  core::print(mai::Statics::a);
+  mai::Statics::a = 42;
+  core::print(mai::Statics::a);
+}
+static method testUninitializedFinalStaticField() → void {
+  core::print(mai::Statics::b);
+  mai::Statics::b = 42;
+  core::print(mai::Statics::b);
+}
+static method testInitializedNonFinalStaticField() → void {
+  core::print(mai::Statics::c);
+  mai::Statics::c = 42;
+  core::print(mai::Statics::c);
+}
+static method testInitializedFinalStaticField() → void {
+  core::print(mai::Statics::d);
+}
+static method testUninitializedNonFinalTopLevelField() → void {
+  core::print(mai2::a);
+  mai2::a = 42;
+  core::print(mai2::a);
+}
+static method testUninitializedFinalTopLevelField() → void {
+  core::print(mai2::b);
+  mai2::b = 42;
+  core::print(mai2::b);
+}
+static method testInitializedNonFinalTopLevelField() → void {
+  core::print(mai2::c);
+  mai2::c = 42;
+  core::print(mai2::c);
+}
+static method testInitializedFinalTopLevelField() → void {
+  core::print(mai2::d);
+}
diff --git a/pkg/front_end/testcases/dart2js/late_locals.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/late_locals.dart.weak.modular.expect
new file mode 100644
index 0000000..0ecd84b
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/late_locals.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → void {
+  self::testNullableUninitializedNonFinalLocal();
+  self::testNonNullableUninitializedNonFinalLocal();
+  self::testNullableUninitializedFinalLocal();
+  self::testNonNullableUninitializedFinalLocal();
+  self::testNullableInitializedNonFinalLocal();
+  self::testNonNullableInitializedNonFinalLocal();
+  self::testNullableInitializedFinalLocal();
+  self::testNonNullableInitializedFinalLocal();
+}
+static method testNullableUninitializedNonFinalLocal() → void {
+  late core::int? x;
+  x = 42;
+  core::print(x{core::int});
+}
+static method testNonNullableUninitializedNonFinalLocal() → void {
+  late core::int x;
+  x = 42;
+  core::print(x);
+}
+static method testNullableUninitializedFinalLocal() → void {
+  late final core::int? x;
+  x = 42;
+  core::print(x{core::int});
+}
+static method testNonNullableUninitializedFinalLocal() → void {
+  late final core::int x;
+  x = 42;
+  core::print(x);
+}
+static method testNullableInitializedNonFinalLocal() → void {
+  late core::int? x = 1.{core::int::unary-}(){() → core::int};
+  core::print(x{core::int});
+  x = 42;
+  core::print(x{core::int});
+  late core::int? y = null;
+  core::print(y);
+  y = 42;
+  core::print(y{core::int});
+}
+static method testNonNullableInitializedNonFinalLocal() → void {
+  late core::int x = 1.{core::int::unary-}(){() → core::int};
+  core::print(x);
+  x = 42;
+  core::print(x);
+}
+static method testNullableInitializedFinalLocal() → void {
+  late final core::int? x = 1.{core::int::unary-}(){() → core::int};
+  core::print(x);
+  late final core::int? y = null;
+  core::print(y);
+}
+static method testNonNullableInitializedFinalLocal() → void {
+  late final core::int x = 1.{core::int::unary-}(){() → core::int};
+  core::print(x);
+}
diff --git a/pkg/front_end/testcases/dart2js/late_statics.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.modular.expect
new file mode 100644
index 0000000..c2128f7
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/late_statics.dart.weak.modular.expect
@@ -0,0 +1,81 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "late_statics_lib.dart" as lat;
+additionalExports = (lat::a,
+  lat::a,
+  lat::b,
+  lat::b,
+  lat::c,
+  lat::c,
+  lat::d)
+
+import "org-dartlang-testcase:///late_statics_lib.dart" as lib;
+export "org-dartlang-testcase:///late_statics_lib.dart";
+
+class Statics extends core::Object {
+  late static field core::int a;
+  late static final [setter] field core::int b;
+  late static field core::int c = 1.{core::int::unary-}(){() → core::int};
+  late static final field core::int d = 1.{core::int::unary-}(){() → core::int};
+  synthetic constructor •() → self::Statics
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::Statics
+    return new self::Statics::•();
+}
+static method main() → void {
+  self::testUninitializedNonFinalStaticField();
+  self::testUninitializedFinalStaticField();
+  self::testInitializedNonFinalStaticField();
+  self::testInitializedFinalStaticField();
+  self::testUninitializedNonFinalTopLevelField();
+  self::testUninitializedFinalTopLevelField();
+  self::testInitializedNonFinalTopLevelField();
+  self::testInitializedFinalTopLevelField();
+}
+static method testUninitializedNonFinalStaticField() → void {
+  core::print(self::Statics::a);
+  self::Statics::a = 42;
+  core::print(self::Statics::a);
+}
+static method testUninitializedFinalStaticField() → void {
+  core::print(self::Statics::b);
+  self::Statics::b = 42;
+  core::print(self::Statics::b);
+}
+static method testInitializedNonFinalStaticField() → void {
+  core::print(self::Statics::c);
+  self::Statics::c = 42;
+  core::print(self::Statics::c);
+}
+static method testInitializedFinalStaticField() → void {
+  core::print(self::Statics::d);
+}
+static method testUninitializedNonFinalTopLevelField() → void {
+  core::print(lat::a);
+  lat::a = 42;
+  core::print(lat::a);
+}
+static method testUninitializedFinalTopLevelField() → void {
+  core::print(lat::b);
+  lat::b = 42;
+  core::print(lat::b);
+}
+static method testInitializedNonFinalTopLevelField() → void {
+  core::print(lat::c);
+  lat::c = 42;
+  core::print(lat::c);
+}
+static method testInitializedFinalTopLevelField() → void {
+  core::print(lat::d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as lat;
+import "dart:core" as core;
+
+late static field core::int a;
+late static final [setter] field core::int b;
+late static field core::int c = 1.{core::int::unary-}(){() → core::int};
+late static final field core::int d = 1.{core::int::unary-}(){() → core::int};
diff --git a/pkg/front_end/testcases/dart2js/list_generate.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/list_generate.dart.weak.modular.expect
new file mode 100644
index 0000000..1d7d6ef
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/list_generate.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List::generate<core::int>(10, (core::int i) → core::int => i.{core::num::*}(2){(core::num) → core::int});
+}
diff --git a/pkg/front_end/testcases/dart2js/list_generate_1.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/list_generate_1.dart.weak.modular.expect
new file mode 100644
index 0000000..ae26523
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/list_generate_1.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int> list1 = core::List::generate<core::int>(10, (core::int i) → core::int => i);
+static field core::List<core::int> list2 = core::List::generate<core::int>(10, (core::int i) → core::int => i, growable: true);
+static field core::List<core::int> list3 = core::List::generate<core::int>(10, (core::int i) → core::int => i, growable: false);
+static field core::List<core::int> list4 = core::List::generate<core::int>(10, (core::int i) → core::int => i, growable: self::someGrowable);
+static field core::bool someGrowable = true;
+static method main() → void {
+  self::someGrowable = !self::someGrowable;
+  core::print(<core::List<core::int>>[self::list1, self::list2, self::list3, self::list4]);
+}
diff --git a/pkg/front_end/testcases/dart2js/list_generate_2.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/list_generate_2.dart.weak.modular.expect
new file mode 100644
index 0000000..d3c85ea
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/list_generate_2.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → void {
+  core::print(core::List::generate<core::List<core::int>>(10, (core::int i) → core::List<core::int> => core::List::generate<core::int>(i, (core::int i) → core::int => i.{core::num::+}(1){(core::num) → core::int})));
+}
diff --git a/pkg/front_end/testcases/dart2js/list_generate_3.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/list_generate_3.dart.weak.modular.expect
new file mode 100644
index 0000000..4f4c5d2
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/list_generate_3.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int> list1 = core::List::generate<core::int>(10, (core::int i) → core::int {
+  return i;
+});
+static field core::List<core::int> list2 = core::List::generate<core::int>(10, (core::int i) → core::int {
+  return i;
+}, growable: true);
+static field core::List<core::int> list3 = core::List::generate<core::int>(10, (core::int i) → core::int {
+  return i;
+}, growable: false);
+static field core::List<core::int> list4 = core::List::generate<core::int>(10, (core::int i) → core::int {
+  return i;
+}, growable: self::someGrowable);
+static field core::List<core::int> list5 = core::List::generate<core::int>(10, (core::int i) → core::int {
+  if(i.{core::int::isEven}{core::bool})
+    return i.{core::num::+}(1){(core::num) → core::int};
+  return i.{core::num::-}(1){(core::num) → core::int};
+});
+static field core::List<core::int> list6 = core::List::generate<core::int>(10, #C1);
+static field core::List<core::int> list7 = core::List::generate<core::int>(10, self::bar);
+static field core::bool someGrowable = true;
+static method foo(core::int i) → core::int
+  return i;
+static get bar() → (core::int) → core::int
+  return #C1;
+static method main() → void {
+  self::someGrowable = !self::someGrowable;
+  core::print(<core::List<core::int>>[self::list1, self::list2, self::list3, self::list4, self::list5, self::list6, self::list7]);
+}
+
+constants  {
+  #C1 = static-tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..fa4652c
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/list_generate_local_function_invocation.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function localFunction(core::int i) → core::int
+    return i.{core::num::*}(2){(core::num) → core::int};
+  core::List::generate<core::int>(10, (core::int i) → core::int => localFunction(i){(core::int) → core::int});
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/a_lib.dart b/pkg/front_end/testcases/dart2js/mixin_default_values/a_lib.dart
new file mode 100644
index 0000000..75c5e41
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/a_lib.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+import 't_lib.dart';
+
+String _defaultStringy(String t) => t.toLowerCase();
+
+class A {
+  A({
+    double d = 3.14,
+    StringyFunction<String> s = _defaultStringy,
+  }) : this.factoryConstructor(d: d, s: s);
+  A.factoryConstructor({
+    double d = 3.14,
+    StringyFunction<String> s = _defaultStringy,
+  })  : d = d,
+        _s = s;
+  String doStringy(String i) => _s(i);
+  final double d;
+  final StringyFunction<String> _s;
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/b_lib.dart b/pkg/front_end/testcases/dart2js/mixin_default_values/b_lib.dart
new file mode 100644
index 0000000..2e956fb
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/b_lib.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'a_lib.dart';
+import 'm_lib.dart';
+
+class B extends A with M {
+  B({double d = 2.71}) : super(d: d);
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/m_lib.dart b/pkg/front_end/testcases/dart2js/mixin_default_values/m_lib.dart
new file mode 100644
index 0000000..8ade71f
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/m_lib.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'a_lib.dart';
+
+mixin M on A {
+  m1() {}
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart
new file mode 100644
index 0000000..5f99d3e
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'b_lib.dart';
+
+main() {
+  var bInst = B();
+  expect(2.71, bInst.d);
+  expect('default', bInst.doStringy('DEFAULT'));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual.';
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.strong.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.strong.expect
new file mode 100644
index 0000000..e58f841
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.strong.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "b_lib.dart" as b_l;
+import "a_lib.dart" as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///b_lib.dart";
+
+static method main() → dynamic {
+  b_l::B bInst = new b_l::B::•();
+  self::expect(2.71, bInst.{a_l::A::d}{core::double});
+  self::expect("default", bInst.{a_l::A::doStringy}("DEFAULT"){(core::String) → core::String});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}.";
+}
+
+library /*isNonNullableByDefault*/;
+import self as b_l;
+import "a_lib.dart" as a_l;
+import "m_lib.dart" as m_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///a_lib.dart";
+import "org-dartlang-testcase:///m_lib.dart";
+
+abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/  {
+  synthetic constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::•(d: d, s: s)
+    ;
+  synthetic constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  mixin-super-stub method m1() → dynamic
+    return super.{m_l::M::m1}();
+}
+class B extends b_l::_B&A&M {
+  constructor •({core::double d = #C3}) → b_l::B
+    : super b_l::_B&A&M::•(d: d)
+    ;
+  static method _#new#tearOff({core::double d = #C3}) → b_l::B
+    return new b_l::B::•(d: d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as m_l;
+import "a_lib.dart" as a_l;
+
+import "org-dartlang-testcase:///a_lib.dart";
+
+abstract class M extends a_l::A /*isMixinDeclaration*/  {
+  method m1() → dynamic {}
+}
+
+library /*isNonNullableByDefault*/;
+import self as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///t_lib.dart";
+
+class A extends core::Object {
+  final field core::double d;
+  final field (core::String) → core::String _s;
+  constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    : this a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    : a_l::A::d = d, a_l::A::_s = s, super core::Object::•()
+    ;
+  static method _#new#tearOff({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    return new a_l::A::•(d: d, s: s);
+  static method _#factoryConstructor#tearOff({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    return new a_l::A::factoryConstructor(d: d, s: s);
+  method doStringy(core::String i) → core::String
+    return let final core::String #t1 = i in this.{a_l::A::_s}(#t1){(core::String) → core::String};
+}
+static method _defaultStringy(core::String t) → core::String
+  return t.{core::String::toLowerCase}(){() → core::String};
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+typedef StringyFunction<contravariant T extends core::Object? = dynamic> = (T%) → core::String;
+
+constants  {
+  #C1 = 3.14
+  #C2 = static-tearoff a_l::_defaultStringy
+  #C3 = 2.71
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.strong.transformed.expect
new file mode 100644
index 0000000..e58f841
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.strong.transformed.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "b_lib.dart" as b_l;
+import "a_lib.dart" as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///b_lib.dart";
+
+static method main() → dynamic {
+  b_l::B bInst = new b_l::B::•();
+  self::expect(2.71, bInst.{a_l::A::d}{core::double});
+  self::expect("default", bInst.{a_l::A::doStringy}("DEFAULT"){(core::String) → core::String});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}.";
+}
+
+library /*isNonNullableByDefault*/;
+import self as b_l;
+import "a_lib.dart" as a_l;
+import "m_lib.dart" as m_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///a_lib.dart";
+import "org-dartlang-testcase:///m_lib.dart";
+
+abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/  {
+  synthetic constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::•(d: d, s: s)
+    ;
+  synthetic constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  mixin-super-stub method m1() → dynamic
+    return super.{m_l::M::m1}();
+}
+class B extends b_l::_B&A&M {
+  constructor •({core::double d = #C3}) → b_l::B
+    : super b_l::_B&A&M::•(d: d)
+    ;
+  static method _#new#tearOff({core::double d = #C3}) → b_l::B
+    return new b_l::B::•(d: d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as m_l;
+import "a_lib.dart" as a_l;
+
+import "org-dartlang-testcase:///a_lib.dart";
+
+abstract class M extends a_l::A /*isMixinDeclaration*/  {
+  method m1() → dynamic {}
+}
+
+library /*isNonNullableByDefault*/;
+import self as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///t_lib.dart";
+
+class A extends core::Object {
+  final field core::double d;
+  final field (core::String) → core::String _s;
+  constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    : this a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    : a_l::A::d = d, a_l::A::_s = s, super core::Object::•()
+    ;
+  static method _#new#tearOff({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    return new a_l::A::•(d: d, s: s);
+  static method _#factoryConstructor#tearOff({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    return new a_l::A::factoryConstructor(d: d, s: s);
+  method doStringy(core::String i) → core::String
+    return let final core::String #t1 = i in this.{a_l::A::_s}(#t1){(core::String) → core::String};
+}
+static method _defaultStringy(core::String t) → core::String
+  return t.{core::String::toLowerCase}(){() → core::String};
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+typedef StringyFunction<contravariant T extends core::Object? = dynamic> = (T%) → core::String;
+
+constants  {
+  #C1 = 3.14
+  #C2 = static-tearoff a_l::_defaultStringy
+  #C3 = 2.71
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.textual_outline.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.textual_outline.expect
new file mode 100644
index 0000000..0833ebd
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+import 'b_lib.dart';
+
+main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..029cb69
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+import 'b_lib.dart';
+
+expect(expected, actual) {}
+main() {}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.expect
new file mode 100644
index 0000000..e58f841
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "b_lib.dart" as b_l;
+import "a_lib.dart" as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///b_lib.dart";
+
+static method main() → dynamic {
+  b_l::B bInst = new b_l::B::•();
+  self::expect(2.71, bInst.{a_l::A::d}{core::double});
+  self::expect("default", bInst.{a_l::A::doStringy}("DEFAULT"){(core::String) → core::String});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}.";
+}
+
+library /*isNonNullableByDefault*/;
+import self as b_l;
+import "a_lib.dart" as a_l;
+import "m_lib.dart" as m_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///a_lib.dart";
+import "org-dartlang-testcase:///m_lib.dart";
+
+abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/  {
+  synthetic constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::•(d: d, s: s)
+    ;
+  synthetic constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  mixin-super-stub method m1() → dynamic
+    return super.{m_l::M::m1}();
+}
+class B extends b_l::_B&A&M {
+  constructor •({core::double d = #C3}) → b_l::B
+    : super b_l::_B&A&M::•(d: d)
+    ;
+  static method _#new#tearOff({core::double d = #C3}) → b_l::B
+    return new b_l::B::•(d: d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as m_l;
+import "a_lib.dart" as a_l;
+
+import "org-dartlang-testcase:///a_lib.dart";
+
+abstract class M extends a_l::A /*isMixinDeclaration*/  {
+  method m1() → dynamic {}
+}
+
+library /*isNonNullableByDefault*/;
+import self as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///t_lib.dart";
+
+class A extends core::Object {
+  final field core::double d;
+  final field (core::String) → core::String _s;
+  constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    : this a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    : a_l::A::d = d, a_l::A::_s = s, super core::Object::•()
+    ;
+  static method _#new#tearOff({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    return new a_l::A::•(d: d, s: s);
+  static method _#factoryConstructor#tearOff({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    return new a_l::A::factoryConstructor(d: d, s: s);
+  method doStringy(core::String i) → core::String
+    return let final core::String #t1 = i in this.{a_l::A::_s}(#t1){(core::String) → core::String};
+}
+static method _defaultStringy(core::String t) → core::String
+  return t.{core::String::toLowerCase}(){() → core::String};
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+typedef StringyFunction<contravariant T extends core::Object? = dynamic> = (T%) → core::String;
+
+constants  {
+  #C1 = 3.14
+  #C2 = static-tearoff a_l::_defaultStringy
+  #C3 = 2.71
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.modular.expect
new file mode 100644
index 0000000..573e273
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "b_lib.dart" as b_l;
+import "a_lib.dart" as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///b_lib.dart";
+
+static method main() → dynamic {
+  b_l::B bInst = new b_l::B::•();
+  self::expect(2.71, bInst.{a_l::A::d}{core::double});
+  self::expect("default", bInst.{a_l::A::doStringy}("DEFAULT"){(core::String) → core::String});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}.";
+}
+
+library /*isNonNullableByDefault*/;
+import self as b_l;
+import "a_lib.dart" as a_l;
+import "m_lib.dart" as m_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///a_lib.dart";
+import "org-dartlang-testcase:///m_lib.dart";
+
+abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/  {
+  synthetic constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::•(d: d, s: s)
+    ;
+  synthetic constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  mixin-super-stub method m1() → dynamic
+    return super.{m_l::M::m1}();
+}
+class B extends b_l::_B&A&M {
+  constructor •({core::double d = #C3}) → b_l::B
+    : super b_l::_B&A&M::•(d: d)
+    ;
+  static method _#new#tearOff({core::double d = #C3}) → b_l::B
+    return new b_l::B::•(d: d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as m_l;
+import "a_lib.dart" as a_l;
+
+import "org-dartlang-testcase:///a_lib.dart";
+
+abstract class M extends a_l::A /*isMixinDeclaration*/  {
+  method m1() → dynamic {}
+}
+
+constants  {
+  #C1 = 3.14
+  #C2 = static-tearoff a_l::_defaultStringy
+  #C3 = 2.71
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect
new file mode 100644
index 0000000..2950126
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.outline.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///b_lib.dart";
+
+static method main() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "a_lib.dart" as a_l;
+import "m_lib.dart" as m_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///a_lib.dart";
+import "org-dartlang-testcase:///m_lib.dart";
+
+abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/  {
+  synthetic constructor •({core::double d, (core::String) → core::String s}) → self2::_B&A&M
+    : super a_l::A::•(d: d, s: s)
+    ;
+  synthetic constructor factoryConstructor({core::double d, (core::String) → core::String s}) → self2::_B&A&M
+    : super a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  mixin-super-stub method m1() → dynamic
+    return super.{m_l::M::m1}();
+}
+class B extends self2::_B&A&M {
+  constructor •({core::double d = 2.71}) → self2::B
+    ;
+  static method _#new#tearOff({core::double d}) → self2::B
+    return new self2::B::•(d: d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as m_l;
+import "a_lib.dart" as a_l;
+
+import "org-dartlang-testcase:///a_lib.dart";
+
+abstract class M extends a_l::A /*isMixinDeclaration*/  {
+  method m1() → dynamic
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///t_lib.dart";
+
+class A extends core::Object {
+  final field core::double d;
+  final field (core::String) → core::String _s;
+  constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    ;
+  constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    ;
+  static method _#new#tearOff({core::double d, (core::String) → core::String s}) → a_l::A
+    return new a_l::A::•(d: d, s: s);
+  static method _#factoryConstructor#tearOff({core::double d, (core::String) → core::String s}) → a_l::A
+    return new a_l::A::factoryConstructor(d: d, s: s);
+  method doStringy(core::String i) → core::String
+    ;
+}
+static method _defaultStringy(core::String t) → core::String
+  ;
+
+library /*isNonNullableByDefault*/;
+import self as self3;
+import "dart:core" as core;
+
+typedef StringyFunction<contravariant T extends core::Object? = dynamic> = (T%) → core::String;
+
+constants  {
+  #C1 = 3.14
+  #C2 = static-tearoff a_l::_defaultStringy
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.transformed.expect b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..e58f841
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/main.dart.weak.transformed.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "b_lib.dart" as b_l;
+import "a_lib.dart" as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///b_lib.dart";
+
+static method main() → dynamic {
+  b_l::B bInst = new b_l::B::•();
+  self::expect(2.71, bInst.{a_l::A::d}{core::double});
+  self::expect("default", bInst.{a_l::A::doStringy}("DEFAULT"){(core::String) → core::String});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}.";
+}
+
+library /*isNonNullableByDefault*/;
+import self as b_l;
+import "a_lib.dart" as a_l;
+import "m_lib.dart" as m_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///a_lib.dart";
+import "org-dartlang-testcase:///m_lib.dart";
+
+abstract class _B&A&M = a_l::A with m_l::M /*isAnonymousMixin*/  {
+  synthetic constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::•(d: d, s: s)
+    ;
+  synthetic constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → b_l::_B&A&M
+    : super a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  mixin-super-stub method m1() → dynamic
+    return super.{m_l::M::m1}();
+}
+class B extends b_l::_B&A&M {
+  constructor •({core::double d = #C3}) → b_l::B
+    : super b_l::_B&A&M::•(d: d)
+    ;
+  static method _#new#tearOff({core::double d = #C3}) → b_l::B
+    return new b_l::B::•(d: d);
+}
+
+library /*isNonNullableByDefault*/;
+import self as m_l;
+import "a_lib.dart" as a_l;
+
+import "org-dartlang-testcase:///a_lib.dart";
+
+abstract class M extends a_l::A /*isMixinDeclaration*/  {
+  method m1() → dynamic {}
+}
+
+library /*isNonNullableByDefault*/;
+import self as a_l;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///t_lib.dart";
+
+class A extends core::Object {
+  final field core::double d;
+  final field (core::String) → core::String _s;
+  constructor •({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    : this a_l::A::factoryConstructor(d: d, s: s)
+    ;
+  constructor factoryConstructor({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    : a_l::A::d = d, a_l::A::_s = s, super core::Object::•()
+    ;
+  static method _#new#tearOff({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    return new a_l::A::•(d: d, s: s);
+  static method _#factoryConstructor#tearOff({core::double d = #C1, (core::String) → core::String s = #C2}) → a_l::A
+    return new a_l::A::factoryConstructor(d: d, s: s);
+  method doStringy(core::String i) → core::String
+    return let final core::String #t1 = i in this.{a_l::A::_s}(#t1){(core::String) → core::String};
+}
+static method _defaultStringy(core::String t) → core::String
+  return t.{core::String::toLowerCase}(){() → core::String};
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+typedef StringyFunction<contravariant T extends core::Object? = dynamic> = (T%) → core::String;
+
+constants  {
+  #C1 = 3.14
+  #C2 = static-tearoff a_l::_defaultStringy
+  #C3 = 2.71
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/t_lib.dart b/pkg/front_end/testcases/dart2js/mixin_default_values/t_lib.dart
new file mode 100644
index 0000000..ab0db0e
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/t_lib.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef StringyFunction<T> = String Function(T item);
diff --git a/pkg/front_end/testcases/dart2js/mixin_default_values/test.options b/pkg/front_end/testcases/dart2js/mixin_default_values/test.options
new file mode 100644
index 0000000..d8aba59
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_default_values/test.options
@@ -0,0 +1,2 @@
+a_lib.dart
+t_lib.dart
diff --git a/pkg/front_end/testcases/dart2js/mixin_from_opt_in/main.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/mixin_from_opt_in/main.dart.weak.modular.expect
new file mode 100644
index 0000000..ccdd90a
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_from_opt_in/main.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "test_lib.dart" as tes;
+
+import "org-dartlang-testcase:///test_lib.dart";
+
+static method main() → dynamic {
+  tes::test();
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dart2js/mixin_from_opt_in/test_lib.dart:10:27: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+//   int j = sub.mixinMethod(null);
+//                           ^
+//
+// pkg/front_end/testcases/dart2js/mixin_from_opt_in/test_lib.dart:10:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//   int j = sub.mixinMethod(null);
+//               ^
+//
+// pkg/front_end/testcases/dart2js/mixin_from_opt_in/test_lib.dart:12:25: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//   sub.mixinField2 = sub.mixinField1;
+//                         ^
+//
+import self as tes;
+import "opt_out_lib.dart" as opt;
+import "dart:core" as core;
+import "opt_in_lib.dart" as opt2;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method test() → dynamic {
+  opt::SubClass sub = new opt::SubClass::•();
+  core::int i = sub.{opt::_SubClass&Class&Mixin::classMethod}(null){(core::int*) →* core::int*};
+  core::int j = invalid-expression "pkg/front_end/testcases/dart2js/mixin_from_opt_in/test_lib.dart:10:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  int j = sub.mixinMethod(null);
+              ^" in sub.{opt2::Mixin::mixinMethod}(invalid-expression "pkg/front_end/testcases/dart2js/mixin_from_opt_in/test_lib.dart:10:27: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+  int j = sub.mixinMethod(null);
+                          ^" in null as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::int?} as{TypeError,ForNonNullableByDefault} core::int;
+  sub.{opt::_SubClass&Class&Mixin::classField2} = sub.{opt::_SubClass&Class&Mixin::classField1}{core::int*};
+  sub.{opt2::Mixin::mixinField2} = invalid-expression "pkg/front_end/testcases/dart2js/mixin_from_opt_in/test_lib.dart:12:25: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  sub.mixinField2 = sub.mixinField1;
+                        ^" in sub.{opt2::Mixin::mixinField1}{core::int?} as{TypeError,ForNonNullableByDefault} core::int;
+}
diff --git a/pkg/front_end/testcases/dart2js/mixin_from_opt_in/main.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/dart2js/mixin_from_opt_in/main.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..4f8699d
--- /dev/null
+++ b/pkg/front_end/testcases/dart2js/mixin_from_opt_in/main.no_link.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "test_lib.dart" as tes;
+
+import "org-dartlang-testcase:///test_lib.dart";
+
+static method main() → dynamic {
+  tes::test();
+}
+
+library /*isNonNullableByDefault*/;
+import self as tes;
+import "opt_out_lib.dart" as opt;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method test() → dynamic {
+  opt::SubClass sub = new opt::SubClass::•();
+  core::int i = sub.{opt::_SubClass&Class&Mixin::classMethod}(null){(core::int*) →* core::int*};
+  core::int j = sub.{opt::_SubClass&Class&Mixin::mixinMethod}(null){(core::int*) →* core::int*};
+  sub.{opt::_SubClass&Class&Mixin::classField2} = sub.{opt::_SubClass&Class&Mixin::classField1}{core::int*};
+  sub.{opt::_SubClass&Class&Mixin::mixinField2} = sub.{opt::_SubClass&Class&Mixin::mixinField1}{core::int*};
+}
+
+library;
+import self as opt;
+import "opt_in_lib.dart" as opt2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_in_lib.dart";
+
+abstract class _SubClass&Class&Mixin = opt2::Class with opt2::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → opt::_SubClass&Class&Mixin*
+    : super opt2::Class::•()
+    ;
+  mixin-super-stub get mixinField1() → core::int*
+    return super.{opt2::Mixin::mixinField1};
+  mixin-super-stub set mixinField1(core::int* value) → void
+    return super.{opt2::Mixin::mixinField1} = value;
+  mixin-super-stub get mixinField2() → core::int*
+    return super.{opt2::Mixin::mixinField2};
+  mixin-super-stub set mixinField2(core::int* value) → void
+    return super.{opt2::Mixin::mixinField2} = value;
+  abstract member-signature get classField1() → core::int*; -> opt2::Class::classField1
+  abstract member-signature set classField1(core::int* value) → void; -> opt2::Class::classField1
+  abstract member-signature get classField2() → core::int*; -> opt2::Class::classField2
+  abstract member-signature set classField2(core::int* value) → void; -> opt2::Class::classField2
+  mixin-super-stub method mixinMethod(core::int* i) → core::int*
+    return super.{opt2::Mixin::mixinMethod}(i);
+  abstract member-signature method classMethod(core::int* i) → core::int*; -> opt2::Class::classMethod
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubClass extends opt::_SubClass&Class&Mixin {
+  synthetic constructor •() → opt::SubClass*
+    : super opt::_SubClass&Class&Mixin::•()
+    ;
+  static method _#new#tearOff() → opt::SubClass*
+    return new opt::SubClass::•();
+}
+
+library /*isNonNullableByDefault*/;
+import self as opt2;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? classField1 = null;
+  field core::int classField2 = 0;
+  synthetic constructor •() → opt2::Class
+    : super core::Object::•()
+    ;
+  method classMethod(core::int i) → core::int? {}
+  static method _#new#tearOff() → opt2::Class
+    return new opt2::Class::•();
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+  field core::int? mixinField1 = null;
+  field core::int mixinField2 = 0;
+  method mixinMethod(core::int i) → core::int? {
+    super.{core::Object::toString}();
+  }
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart b/pkg/front_end/testcases/dartdevc/conditional_import.dart
new file mode 100644
index 0000000..6122451
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {
+  request.certificate; // error (from dart:io)
+  request.response; // ok (from dart:io and dart:html)
+  request.readyState; // ok (from dart:html)
+  request.hashCode; // ok
+}
+
+testB(b.HttpRequest request) {
+  request.certificate; // error
+  request.response; // error
+  request.readyState; // error
+  request.hashCode; // ok
+}
+
+void main() {
+  expect(false, const bool.fromEnvironment("dart.library.io"));
+  expect(true, const bool.fromEnvironment("dart.library.html"));
+  expect(false, const bool.fromEnvironment("dart.library.foo"));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.transformed.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.strong.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline.expect
new file mode 100644
index 0000000..dc10727
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..6e90f3d
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+class HttpRequest {}
+
+expect(expected, actual) {}
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.modular.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.modular.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.outline.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.outline.expect
new file mode 100644
index 0000000..8e7ea0f
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic
+  ;
+static method testB(self::HttpRequest request) → dynamic
+  ;
+static method main() → void
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.transformed.expect b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.transformed.expect
new file mode 100644
index 0000000..3b668f7
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/conditional_import.dart.weak.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // ok (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::HttpRequest
+    return new self::HttpRequest::•();
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // ok (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/dartdevc/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/dartdevc/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(false, #C1);
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.weak.modular.expect b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.weak.modular.expect
new file mode 100644
index 0000000..3eaf932
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/factory_patch/main.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+  test::Class::fact();
+}
+
+library /*isNonNullableByDefault*/;
+import self as test;
+import "dart:_js_helper" as _js;
+import "dart:core" as core;
+
+import "dart:_js_helper";
+
+@#C1
+class Class extends core::Object {
+  final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+  const constructor _internal({core::bool defaultValue = #C2}) → test::Class
+    : test::Class::defaultValue = defaultValue, super core::Object::•()
+    ;
+  @#C1
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C3}) → test::Class
+    return new test::Class::_internal(defaultValue: defaultValue);
+  static method _#fact#tearOff({core::bool defaultValue = #C3}) → test::Class
+    return test::Class::fact(defaultValue: defaultValue);
+  @#C1
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C3}) → test::Class
+    return throw "unsupported";
+  static method _#constFact#tearOff({core::bool defaultValue = #C3}) → test::Class
+    return test::Class::constFact(defaultValue: defaultValue);
+  static method /* from org-dartlang-testcase:///patch_lib.dart */ _#_internal#tearOff({core::bool defaultValue = #C2}) → test::Class
+    return new test::Class::_internal(defaultValue: defaultValue);
+}
+
+constants  {
+  #C1 = _js::_Patch {}
+  #C2 = false
+  #C3 = true
+}
diff --git a/pkg/front_end/testcases/dartdevc/instance_getter_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/dartdevc/instance_getter_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..d249938
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/instance_getter_invocation.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get idFunction() → <S extends core::Object? = dynamic>(S%) → S%
+    return #C1;
+  get dynFunction() → dynamic
+    return #C1;
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
+}
+static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
+  return t;
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  let final self::Class #t1 = c in let final core::int #t2 = 0 in #t1.{self::Class::idFunction}<core::int>(#t2){(core::int) → core::int};
+  let final self::Class #t3 = c in let final core::int #t4 = 0 in #t3.{self::Class::idFunction}<core::int>(#t4){(core::int) → core::int};
+  let final self::Class #t5 = c in let final core::int #t6 = 0 in #t5.{self::Class::dynFunction}(#t6);
+}
+
+constants  {
+  #C1 = static-tearoff self::id
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.modular.expect b/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.modular.expect
new file mode 100644
index 0000000..39841ce
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47108.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::T%>
+    return new self::C::•<self::C::_#new#tearOff::T%>();
+}
+static const field <T extends core::Object? = dynamic>() → self::C<T%> constructorTearOff = #C1;
+static method main() → dynamic {
+  const () → self::C<core::int> instantiatedTearOff = #C2;
+  const () → self::C<core::int> instantiatedTearOff2 = #C2;
+  core::print(core::identical(instantiatedTearOff, instantiatedTearOff2));
+  core::print(core::identical(#C3, #C3));
+}
+
+constants  {
+  #C1 = static-tearoff self::C::_#new#tearOff
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::String*>
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.modular.expect b/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.modular.expect
new file mode 100644
index 0000000..26cc49c
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::X%>
+    return new self::A::•<self::A::_#new#tearOff::X%>();
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class C<X extends core::Object? = dynamic> = self::A<self::C::X%> with self::M {
+  synthetic constructor •() → self::C<self::C::X%>
+    : super self::A::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::X%>
+    return new self::C::•<self::C::_#new#tearOff::X%>();
+}
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = static-tearoff self::C::_#new#tearOff
+}
diff --git a/pkg/front_end/testcases/dartdevc/private_covariant.dart.weak.modular.expect b/pkg/front_end/testcases/dartdevc/private_covariant.dart.weak.modular.expect
new file mode 100644
index 0000000..aaaca01
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/private_covariant.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method _privateMethod(covariant-by-declaration core::int i) → dynamic {}
+  static method _#new#tearOff() → self::Class
+    return new self::Class::•();
+}
+static method main() → dynamic {
+  new self::Class::•().{self::Class::_privateMethod}(0){(core::int) → dynamic};
+}
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart.weak.modular.expect b/pkg/front_end/testcases/dartdevc/symbol.dart.weak.modular.expect
new file mode 100644
index 0000000..d827f5b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+
+static method main() → dynamic
+  return #C1;
+
+constants  {
+  #C1 = #a
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart
new file mode 100644
index 0000000..a645a364
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum E<X, Y> {
+  one<int, String>(),
+  two<double, num>(),
+  three<int, int>.named(42);
+
+  const E();
+  const E.named(int value);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
new file mode 100644
index 0000000..b4016d7
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
new file mode 100644
index 0000000..b4016d7
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect
new file mode 100644
index 0000000..4fa6f4d
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+enum E<X, Y> { one<int, String>(), two<double, num>(), three<int, int>.named(42); const E(); const E.named(int value); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
new file mode 100644
index 0000000..a7d67d3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E*>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..a7d67d3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E*>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
new file mode 100644
index 0000000..61d174a
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = const <self::E>[self::E::one, self::E::two, self::E::three];
+  static const field self::E one = const self::E::•(0, "one");
+  static const field self::E two = const self::E::•(1, "two");
+  static const field self::E three = const self::E::•(2, "three");
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "one"}, const E{_Enum.index: 1, _Enum._name: "two"}, const E{_Enum.index: 2, _Enum._name: "three"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "three"})
+Extra constant evaluation: evaluated: 9, effectively constant: 4
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
new file mode 100644
index 0000000..a7d67d3
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C10;
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = #C9;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "three"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = <self::E*>[#C3, #C6, #C9]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///entries_with_type_arguments.dart:
+- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/folder.options b/pkg/front_end/testcases/enhanced_enums/folder.options
new file mode 100644
index 0000000..ecd97db
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/folder.options
@@ -0,0 +1 @@
+--enable-experiment=enhanced-enums
\ No newline at end of file
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart
new file mode 100644
index 0000000..b1dcf70
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum E {
+  a.b() // Qualified name with no type arguments.
+  ;
+  const E.b();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
new file mode 100644
index 0000000..b209df1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
new file mode 100644
index 0000000..b209df1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect
new file mode 100644
index 0000000..bc9f7ff
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+enum E { a.b() ; const E.b(); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
new file mode 100644
index 0000000..5cc89c4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..5cc89c4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
new file mode 100644
index 0000000..2732493
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = const <self::E>[self::E::a];
+  static const field self::E a = const self::E::•(0, "a");
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "a"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "a"})
+Extra constant evaluation: evaluated: 7, effectively constant: 2
diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
new file mode 100644
index 0000000..5cc89c4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.weak.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C4;
+  static const field self::E a = #C3;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:
+- E. (from org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/extension_types/access_setter_as_getter.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/access_setter_as_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..cd89df1
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/access_setter_as_getter.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/access_setter_as_getter.dart:16:5: Error: The getter 'foo' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'foo'.
+//   e.foo; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/access_setter_as_getter.dart:17:5: Error: The setter 'bar' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'bar'.
+//   e.bar = 42; // Error.
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+extension E on self::A {
+  get bar = self::E|get#bar;
+  set foo = self::E|set#foo;
+}
+static method E|set#foo(lowered final self::A #this, core::int value) → void {}
+static method E|get#bar(lowered final self::A #this) → core::int
+  return 42;
+static method test(self::E e) → dynamic {
+  self::E|set#foo(e, 42);
+  self::E|get#bar(e);
+  invalid-expression "pkg/front_end/testcases/extension_types/access_setter_as_getter.dart:16:5: Error: The getter 'foo' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'foo'.
+  e.foo; // Error.
+    ^^^" in e{<unresolved>}.foo;
+  invalid-expression "pkg/front_end/testcases/extension_types/access_setter_as_getter.dart:17:5: Error: The setter 'bar' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'bar'.
+  e.bar = 42; // Error.
+    ^^^" in e{<unresolved>}.bar = 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/basic_show.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.modular.expect
new file mode 100644
index 0000000..35387e0
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/basic_show.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:9:26: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E3 on int show {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:13:31: Error: Expected an identifier, but got '{'.
+// Try inserting an identifier before '{'.
+// extension E5 on int show num, {} // Error.
+//                               ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:26: Error: Expected an identifier, but got ','.
+// Try inserting an identifier before ','.
+// extension E6 on int show , num {} // Error.
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A extension declaration must have a body, even if it is empty.
+// Try adding an empty body.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+// pkg/front_end/testcases/extension_types/basic_show.dart:15:28: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E6 on int show , num {} // Error.
+//                            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E1 on core::int show-types core::num {
+}
+extension E2 on core::int {
+}
+extension E3 on core::int {
+}
+extension E4 on core::int show-types core::num {
+}
+extension E5 on core::int show-types core::num {
+}
+extension E6 on core::int {
+}
+static method num() → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.modular.expect
new file mode 100644
index 0000000..a787e50
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/call_not_get.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:9:5: Error: The method 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
+//   e.ceil(); // Error.
+//     ^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:10:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+//   e.ceil = 42; // Error.
+//     ^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:12:5: Error: The getter 'floor' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'floor'.
+//   e.floor; // Error.
+//     ^^^^^
+//
+// pkg/front_end/testcases/extension_types/call_not_get.dart:14:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+//   e.ceil = 42; // Error.
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type E on core::int show-methods core::int::floor show-getters core::int::floor, core::int::ceil hide-getters core::int::floor {
+}
+static method test(self::E e) → dynamic {
+  e.{core::int::ceil}{() → core::int};
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:9:5: Error: The method 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
+  e.ceil(); // Error.
+    ^^^^" in e{<unresolved>}.ceil();
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:10:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+  e.ceil = 42; // Error.
+    ^^^^" in e{<unresolved>}.ceil = 42;
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:12:5: Error: The getter 'floor' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'floor'.
+  e.floor; // Error.
+    ^^^^^" in e{<unresolved>}.floor;
+  e.{core::int::floor}(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/extension_types/call_not_get.dart:14:5: Error: The setter 'ceil' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'ceil'.
+  e.ceil = 42; // Error.
+    ^^^^" in e{<unresolved>}.ceil = 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.modular.expect
new file mode 100644
index 0000000..3074033
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/extension_on_nullable.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+extension E on self::A? {
+  method foo = self::E|foo;
+  tearoff foo = self::E|get#foo;
+}
+static method E|foo(lowered final self::A? #this) → void {}
+static method E|get#foo(lowered final self::A? #this) → () → void
+  return () → void => self::E|foo(#this);
+static method bar(self::E e) → dynamic
+  return self::E|foo(e);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/extension_with_name_type.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/extension_with_name_type.dart.weak.modular.expect
new file mode 100644
index 0000000..626118a
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/extension_with_name_type.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+extension type on self::A {
+  method method = self::type|method;
+  tearoff method = self::type|get#method;
+}
+static method type|method(lowered final self::A #this) → dynamic {}
+static method type|get#method(lowered final self::A #this) → () → dynamic
+  return () → dynamic => self::type|method(#this);
+static method test() → dynamic {
+  self::type|method(new self::A::•());
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/issue45775.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/issue45775.dart.weak.modular.expect
new file mode 100644
index 0000000..4e10ba8
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/issue45775.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+extension Bar on self::Foo {
+}
+static method main() → void {
+  self::Bar bar = new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.modular.expect
new file mode 100644
index 0000000..6111f5a
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/keyword_in_show_hide_element.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method mixin() → void {}
+  method as() → void {}
+}
+extension type E1 on self::A show-methods self::A::as, self::A::mixin show-getters self::A::as, self::A::mixin {
+}
+extension type E2 on self::A hide-methods self::A::as, self::A::mixin hide-getters self::A::as, self::A::mixin {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/show_and_run_ceil.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/show_and_run_ceil.dart.weak.modular.expect
new file mode 100644
index 0000000..61492c2
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_and_run_ceil.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::double show-types core::num {
+}
+static method expectIdentical(dynamic a, dynamic b) → dynamic {
+  if(!core::identical(a, b)) {
+    throw "Expected '${a}' and '${b}' to be identical.";
+  }
+}
+static method test(self::E e, core::int value) → dynamic {
+  self::expectIdentical(e.{core::num::ceil}(){() → core::int}, value);
+}
+static method main() → dynamic {
+  self::test(3.14, 4);
+}
diff --git a/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.modular.expect
new file mode 100644
index 0000000..ba0e4db
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/show_hide_all_kinds.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B<X extends core::Object? = dynamic> extends self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super self::A::•()
+    ;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  synthetic constructor •() → self::B2
+    : super self::A2::•()
+    ;
+}
+class C2 extends self::B2 {
+  synthetic constructor •() → self::C2
+    : super self::B2::•()
+    ;
+}
+class A3 extends core::Object {
+  field core::int? field = null;
+  field core::String? field2 = null;
+  synthetic constructor •() → self::A3
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+  get getter() → core::int
+    return 42;
+  set setter(core::int value) → void {}
+  set setter2(core::int value) → void {}
+  set setter3(core::int value) → void {}
+  operator +(self::A3 other) → self::A3
+    return other;
+  operator *(self::A3 other) → self::A3
+    return this;
+}
+class B3 extends self::A3 {
+  synthetic constructor •() → self::B3
+    : super self::A3::•()
+    ;
+  method bar() → void {}
+}
+class C3 extends self::B3 {
+  synthetic constructor •() → self::C3
+    : super self::B3::•()
+    ;
+  method baz() → void {}
+}
+extension type E on self::C show-types self::B<core::int> hide-types self::A<core::int> {
+}
+extension type E2 on self::C2 show-types self::B2 hide-types self::A2 {
+}
+extension type E3 on self::C3 show-types self::B3 show-methods self::C3::baz show-getters self::A3::field, self::C3::baz show-setters self::A3::setter, self::A3::field, self::A3::field2 show-operators self::A3::+ hide-methods self::A3::foo hide-getters self::A3::getter, self::A3::foo, self::A3::field hide-setters self::A3::setter2, self::A3::setter3 hide-operators self::A3::* {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/simple.dart.weak.modular.expect
new file mode 100644
index 0000000..8f038ec
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::X%>
+    : super core::Object::•()
+    ;
+}
+class Bar<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::X%, self::Bar::Y%>
+    : super core::Object::•()
+    ;
+}
+extension A1 on dynamic {
+}
+extension A2<X extends core::Object? = dynamic> on self::Foo<X%> {
+}
+extension A3<X extends core::Object? = dynamic, Y extends (X%) → dynamic = (Never) → dynamic> on self::Bar<X%, Y> {
+}
+extension A4<X extends core::Object? = dynamic, Y extends (X%) → dynamic = (Never) → dynamic> on self::Foo<Y> {
+}
+static method foo1(self::A1 a) → self::A1
+  return throw 42;
+static method foo2(self::A2<core::int> a, self::A2<dynamic> ai) → self::A2<dynamic>
+  return throw 42;
+static method foo3(self::A3<core::int, (core::num) → dynamic> a, self::A3<dynamic, (Never) → dynamic> ai) → self::A3<dynamic, (Never) → dynamic>
+  return throw 42;
+static method foo4(self::A4<core::int, (core::num) → dynamic> a, self::A4<dynamic, (Never) → dynamic> ai) → self::A4<dynamic, (Never) → dynamic>
+  return throw 42;
+static method bar() → dynamic {
+  self::A1 a1;
+  self::A2<core::int> a2;
+  self::A2<dynamic> a2i;
+  self::A3<core::int, (core::num) → dynamic> a3;
+  self::A3<dynamic, (Never) → dynamic> a3i;
+  self::A4<core::int, (core::num) → dynamic> a4;
+  self::A4<dynamic, (Never) → dynamic> a4i;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_getter_resolution.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/simple_getter_resolution.dart.weak.modular.expect
new file mode 100644
index 0000000..b762cd5
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_getter_resolution.dart.weak.modular.expect
@@ -0,0 +1,78 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:20:5: Error: The getter 'baz' isn't defined for the class 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/extension_types/simple_getter_resolution.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'baz'.
+//   a.baz; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:22:5: Error: The getter 'foo' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'foo'.
+//   e.foo; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:24:5: Error: The getter 'baz' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'baz'.
+//   e.baz; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:26:6: Error: The getter 'foo' isn't defined for the extension 'ET'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'foo'.
+//   et.foo; // Error.
+//      ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:27:6: Error: The getter 'bar' isn't defined for the extension 'ET'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
+//   et.bar; // Error.
+//      ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return 42;
+}
+extension E on self::A {
+  get bar = self::E|get#bar;
+}
+extension type ET on self::A {
+  get baz = self::ET|get#baz;
+}
+static method E|get#bar(lowered final self::A #this) → core::double
+  return 3.14;
+static method ET|get#baz(lowered final self::A #this) → core::String
+  return "baz";
+static method test(self::A a, self::E e, self::ET et) → dynamic {
+  a.{self::A::foo}{core::int};
+  self::E|get#bar(a);
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:20:5: Error: The getter 'baz' isn't defined for the class 'A'.
+ - 'A' is from 'pkg/front_end/testcases/extension_types/simple_getter_resolution.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'baz'.
+  a.baz; // Error.
+    ^^^" in a{<unresolved>}.baz;
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:22:5: Error: The getter 'foo' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'foo'.
+  e.foo; // Error.
+    ^^^" in e{<unresolved>}.foo;
+  self::E|get#bar(e);
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:24:5: Error: The getter 'baz' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'baz'.
+  e.baz; // Error.
+    ^^^" in e{<unresolved>}.baz;
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:26:6: Error: The getter 'foo' isn't defined for the extension 'ET'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'foo'.
+  et.foo; // Error.
+     ^^^" in et{<unresolved>}.foo;
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_getter_resolution.dart:27:6: Error: The getter 'bar' isn't defined for the extension 'ET'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
+  et.bar; // Error.
+     ^^^" in et{<unresolved>}.bar;
+  self::ET|get#baz(et);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_method_resolution.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/simple_method_resolution.dart.weak.modular.expect
new file mode 100644
index 0000000..ae7cf69
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_method_resolution.dart.weak.modular.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/simple_method_resolution.dart:20:5: Error: The method 'baz' isn't defined for the class 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/extension_types/simple_method_resolution.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'baz'.
+//   a.baz(); // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_method_resolution.dart:22:5: Error: The method 'foo' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing method, or defining a method name 'foo'.
+//   e.foo(); // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_method_resolution.dart:24:5: Error: The method 'baz' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing method, or defining a method name 'baz'.
+//   e.baz(); // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_method_resolution.dart:26:6: Error: The method 'foo' isn't defined for the extension 'ET'.
+// Try correcting the name to the name of an existing method, or defining a method name 'foo'.
+//   et.foo(); // Error.
+//      ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_method_resolution.dart:27:6: Error: The method 'bar' isn't defined for the extension 'ET'.
+// Try correcting the name to the name of an existing method, or defining a method name 'bar'.
+//   et.bar(); // Error.
+//      ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+}
+extension E on self::A {
+  method bar = self::E|bar;
+  tearoff bar = self::E|get#bar;
+}
+extension type ET on self::A {
+  method baz = self::ET|baz;
+  tearoff baz = self::ET|get#baz;
+}
+static method E|bar(lowered final self::A #this) → void
+  return #this.{self::A::foo}(){() → void};
+static method E|get#bar(lowered final self::A #this) → () → void
+  return () → void => self::E|bar(#this);
+static method ET|baz(lowered final self::A #this) → void
+  return #this.{self::A::foo}(){() → void};
+static method ET|get#baz(lowered final self::A #this) → () → void
+  return () → void => self::ET|baz(#this);
+static method test(self::A a, self::E e, self::ET et) → dynamic {
+  a.{self::A::foo}(){() → void};
+  self::E|bar(a);
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_method_resolution.dart:20:5: Error: The method 'baz' isn't defined for the class 'A'.
+ - 'A' is from 'pkg/front_end/testcases/extension_types/simple_method_resolution.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'baz'.
+  a.baz(); // Error.
+    ^^^" in a{<unresolved>}.baz();
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_method_resolution.dart:22:5: Error: The method 'foo' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing method, or defining a method name 'foo'.
+  e.foo(); // Error.
+    ^^^" in e{<unresolved>}.foo();
+  self::E|bar(e);
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_method_resolution.dart:24:5: Error: The method 'baz' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing method, or defining a method name 'baz'.
+  e.baz(); // Error.
+    ^^^" in e{<unresolved>}.baz();
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_method_resolution.dart:26:6: Error: The method 'foo' isn't defined for the extension 'ET'.
+Try correcting the name to the name of an existing method, or defining a method name 'foo'.
+  et.foo(); // Error.
+     ^^^" in et{<unresolved>}.foo();
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_method_resolution.dart:27:6: Error: The method 'bar' isn't defined for the extension 'ET'.
+Try correcting the name to the name of an existing method, or defining a method name 'bar'.
+  et.bar(); // Error.
+     ^^^" in et{<unresolved>}.bar();
+  self::ET|baz(et);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_operator_resolution.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/simple_operator_resolution.dart.weak.modular.expect
new file mode 100644
index 0000000..8a58ea2
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_operator_resolution.dart.weak.modular.expect
@@ -0,0 +1,140 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:26:5: Error: The operator '~/' isn't defined for the class 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/extension_types/simple_operator_resolution.dart'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
+//   a ~/ "foobar"; // Error.
+//     ^^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:28:5: Error: The operator '*' isn't defined for the extension 'E'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
+//   e * "foobar"; // Error.
+//     ^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:29:4: Error: The operator '[]' isn't defined for the extension 'E'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//   e[0]; // Error.
+//    ^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:30:4: Error: The operator '[]=' isn't defined for the extension 'E'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//   e[0] = "foobar"; // Error.
+//    ^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:31:3: Error: The operator 'unary-' isn't defined for the extension 'E'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+//   -e; // Error.
+//   ^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:33:5: Error: The operator '~/' isn't defined for the extension 'E'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
+//   e ~/ "foobar"; // Error.
+//     ^^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:35:6: Error: The operator '*' isn't defined for the extension 'ET'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
+//   et * "foobar"; // Error.
+//      ^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:36:5: Error: The operator '[]' isn't defined for the extension 'ET'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//   et[0]; // Error.
+//     ^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:37:5: Error: The operator '[]=' isn't defined for the extension 'ET'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//   et[0] = "foobar"; // Error.
+//     ^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:38:3: Error: The operator 'unary-' isn't defined for the extension 'ET'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+//   -et; // Error.
+//   ^
+//
+// pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:39:6: Error: The operator '+' isn't defined for the extension 'ET'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//   et + "foobar"; // Error.
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator *(dynamic other) → dynamic
+    return 42;
+  operator [](core::int index) → dynamic
+    return 42;
+  operator []=(core::int index, dynamic value) → void {}
+  operator unary-() → dynamic
+    return 42;
+}
+extension E on self::A {
+  operator + = self::E|+;
+}
+extension type ET on self::A {
+  operator ~/ = self::ET|~/;
+}
+static method E|+(lowered final self::A #this, dynamic other) → dynamic
+  return 42;
+static method ET|~/(lowered final self::A #this, dynamic other) → dynamic
+  return 42;
+static method test(self::A a, self::E e, self::ET et) → dynamic {
+  a.{self::A::*}("foobar"){(dynamic) → dynamic};
+  a.{self::A::[]}(0){(core::int) → dynamic};
+  a.{self::A::[]=}(0, "foobar"){(core::int, dynamic) → void};
+  a.{self::A::unary-}(){() → dynamic};
+  self::E|+(a, "foobar");
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:26:5: Error: The operator '~/' isn't defined for the class 'A'.
+ - 'A' is from 'pkg/front_end/testcases/extension_types/simple_operator_resolution.dart'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
+  a ~/ \"foobar\"; // Error.
+    ^^" in a{<unresolved>}.~/("foobar");
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:28:5: Error: The operator '*' isn't defined for the extension 'E'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
+  e * \"foobar\"; // Error.
+    ^" in e{<unresolved>}.*("foobar");
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:29:4: Error: The operator '[]' isn't defined for the extension 'E'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+  e[0]; // Error.
+   ^" in e{<unresolved>}.[](0);
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:30:4: Error: The operator '[]=' isn't defined for the extension 'E'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+  e[0] = \"foobar\"; // Error.
+   ^" in e{<unresolved>}.[]=(0, "foobar");
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:31:3: Error: The operator 'unary-' isn't defined for the extension 'E'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+  -e; // Error.
+  ^" in e{<unresolved>}.unary-();
+  self::E|+(e, "foobar");
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:33:5: Error: The operator '~/' isn't defined for the extension 'E'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
+  e ~/ \"foobar\"; // Error.
+    ^^" in e{<unresolved>}.~/("foobar");
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:35:6: Error: The operator '*' isn't defined for the extension 'ET'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
+  et * \"foobar\"; // Error.
+     ^" in et{<unresolved>}.*("foobar");
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:36:5: Error: The operator '[]' isn't defined for the extension 'ET'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+  et[0]; // Error.
+    ^" in et{<unresolved>}.[](0);
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:37:5: Error: The operator '[]=' isn't defined for the extension 'ET'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+  et[0] = \"foobar\"; // Error.
+    ^" in et{<unresolved>}.[]=(0, "foobar");
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:38:3: Error: The operator 'unary-' isn't defined for the extension 'ET'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+  -et; // Error.
+  ^" in et{<unresolved>}.unary-();
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_operator_resolution.dart:39:6: Error: The operator '+' isn't defined for the extension 'ET'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+  et + \"foobar\"; // Error.
+     ^" in et{<unresolved>}.+("foobar");
+  self::ET|~/(et, "foobar");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_setter_resolution.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/simple_setter_resolution.dart.weak.modular.expect
new file mode 100644
index 0000000..c9c618e
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_setter_resolution.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:26:3: Error: Undefined name 'et'.
+//   et.foo = 42; // Error.
+//   ^^
+//
+// pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:27:3: Error: Undefined name 'et'.
+//   et.bar = 42; // Error.
+//   ^^
+//
+// pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:28:3: Error: Undefined name 'et'.
+//   et.baz = 42; // Ok.
+//   ^^
+//
+// pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:20:5: Error: The setter 'baz' isn't defined for the class 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/extension_types/simple_setter_resolution.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
+//   a.baz = 42; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:22:5: Error: The setter 'foo' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
+//   e.foo = 42; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:24:5: Error: The setter 'baz' isn't defined for the extension 'E'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
+//   e.baz = 42; // Error.
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  set foo(core::int value) → void {}
+}
+extension E on self::A {
+  set bar = self::E|set#bar;
+}
+extension type ET on self::A {
+  set baz = self::ET|set#baz;
+}
+static method E|set#bar(lowered final self::A #this, core::int value) → void {}
+static method ET|set#baz(lowered final self::A #this, core::int value) → void {}
+static method test(self::A a, self::E e) → dynamic {
+  a.{self::A::foo} = 42;
+  self::E|set#bar(a, 42);
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:20:5: Error: The setter 'baz' isn't defined for the class 'A'.
+ - 'A' is from 'pkg/front_end/testcases/extension_types/simple_setter_resolution.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
+  a.baz = 42; // Error.
+    ^^^" in a{<unresolved>}.baz = 42;
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:22:5: Error: The setter 'foo' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
+  e.foo = 42; // Error.
+    ^^^" in e{<unresolved>}.foo = 42;
+  self::E|set#bar(e, 42);
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:24:5: Error: The setter 'baz' isn't defined for the extension 'E'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
+  e.baz = 42; // Error.
+    ^^^" in e{<unresolved>}.baz = 42;
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:26:3: Error: Undefined name 'et'.
+  et.foo = 42; // Error.
+  ^^"{<invalid>}.foo = 42;
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:27:3: Error: Undefined name 'et'.
+  et.bar = 42; // Error.
+  ^^"{<invalid>}.bar = 42;
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_setter_resolution.dart:28:3: Error: Undefined name 'et'.
+  et.baz = 42; // Ok.
+  ^^"{<invalid>}.baz = 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.modular.expect
new file mode 100644
index 0000000..a785e78
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_and_hide.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class I1<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I1<self::I1::X%, self::I1::Y%>
+    : super core::Object::•()
+    ;
+}
+class I2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::I2<self::I2::X%, self::I2::Y%, self::I2::Z%>
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A implements self::I1<core::int, core::int> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method methodB() → void {}
+  method methodB2() → void {}
+  get getterB() → core::int
+    return throw 42;
+  set setterB(core::int value) → void {}
+  operator *(self::B other) → self::B
+    return throw 42;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class D extends self::C implements self::I2<core::int, core::int, core::int> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method methodD() → void {}
+  get getterD() → core::int
+    return throw 42;
+  set setterD(core::int value) → void {}
+  operator +(self::D other) → self::D
+    return throw 42;
+}
+extension type E on self::D show-types self::I2<core::int, core::int, core::int>, self::C show-methods self::D::methodD show-getters self::D::methodD, self::D::getterD show-setters self::D::setterD show-operators self::D::+ hide-types self::I1<core::int, core::int>, self::A hide-methods self::B::methodB2, self::B::methodB hide-getters self::B::methodB2, self::B::methodB, self::B::getterB hide-setters self::B::setterB hide-operators self::B::* {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.modular.expect
new file mode 100644
index 0000000..a7bbb4c
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide.dart.weak.modular.expect
@@ -0,0 +1,95 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide.dart:9:3: Error: Undefined name 'e2'.
+//   e2.floor(); // Ok.
+//   ^^
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide.dart:10:6: Error: The getter 'isEven' isn't defined for the extension 'E1'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
+//   e1.isEven; // Error.
+//      ^^^^^^
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide.dart:16:6: Error: The method 'ceil' isn't defined for the extension 'E2'.
+// Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
+//   e2.ceil(); // Error.
+//      ^^^^
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide.dart:18:6: Error: The getter 'isEven' isn't defined for the extension 'E2'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
+//   e2.isEven; // Error.
+//      ^^^^^^
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide.dart:24:6: Error: The getter 'isOdd' isn't defined for the extension 'E3'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'isOdd'.
+//   e3.isOdd; // Ok.
+//      ^^^^^
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide.dart:25:6: Error: The getter 'isEven' isn't defined for the extension 'E3'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
+//   e3.isEven; // Error.
+//      ^^^^^^
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide.dart:38:5: Error: The method 'floor' isn't defined for the extension 'MyInt'.
+// Try correcting the name to the name of an existing method, or defining a method name 'floor'.
+//   m.floor(); // Error, hidden.
+//     ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E1 on core::int show-types core::num {
+}
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
+}
+extension E3 on core::int hide-getters core::int::isEven {
+}
+extension type MyInt on core::int show-types core::num show-getters core::int::isEven hide-methods core::int::floor hide-getters core::int::floor {
+  get twice = self::MyInt|get#twice;
+}
+static method test1(self::E1 e1) → dynamic {
+  e1.{core::num::ceil}(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:9:3: Error: Undefined name 'e2'.
+  e2.floor(); // Ok.
+  ^^"{dynamic}.floor();
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:10:6: Error: The getter 'isEven' isn't defined for the extension 'E1'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
+  e1.isEven; // Error.
+     ^^^^^^" in e1{<unresolved>}.isEven;
+}
+static method test2(self::E2 e2) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:16:6: Error: The method 'ceil' isn't defined for the extension 'E2'.
+Try correcting the name to the name of an existing method, or defining a method name 'ceil'.
+  e2.ceil(); // Error.
+     ^^^^" in e2{<unresolved>}.ceil();
+  e2.{core::num::floor}(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:18:6: Error: The getter 'isEven' isn't defined for the extension 'E2'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
+  e2.isEven; // Error.
+     ^^^^^^" in e2{<unresolved>}.isEven;
+}
+static method test3(self::E3 e3) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:24:6: Error: The getter 'isOdd' isn't defined for the extension 'E3'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'isOdd'.
+  e3.isOdd; // Ok.
+     ^^^^^" in e3{<unresolved>}.isOdd;
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:25:6: Error: The getter 'isEven' isn't defined for the extension 'E3'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'isEven'.
+  e3.isEven; // Error.
+     ^^^^^^" in e3{<unresolved>}.isEven;
+}
+static method MyInt|get#twice(lowered final core::int #this) → core::int
+  return 2.{core::num::*}(#this){(core::num) → core::int};
+static method test() → dynamic {
+  self::MyInt m = 42;
+  self::MyInt|get#twice(m);
+  m.{core::int::isEven}{core::bool};
+  m.{core::num::ceil}(){() → core::int};
+  m.{core::Object::toString}(){() → core::String};
+  invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide.dart:38:5: Error: The method 'floor' isn't defined for the extension 'MyInt'.
+Try correcting the name to the name of an existing method, or defining a method name 'floor'.
+  m.floor(); // Error, hidden.
+    ^^^^^" in m{<unresolved>}.floor();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.modular.expect
new file mode 100644
index 0000000..70175c9
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   int ceil() {} // Error.
+//       ^
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   int ceil() {} // Ok.
+//       ^
+//
+// pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   int floor() {} // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E1 on core::int show-types core::num {
+  method ceil = self::E1|ceil;
+  tearoff ceil = self::E1|get#ceil;
+}
+extension E2 on core::int show-types core::num hide-methods core::int::ceil hide-getters core::int::ceil {
+  method ceil = self::E2|ceil;
+  tearoff ceil = self::E2|get#ceil;
+  method floor = self::E2|floor;
+  tearoff floor = self::E2|get#floor;
+}
+extension E3 on core::int hide-getters core::int::isEven {
+  get isOdd = self::E3|get#isOdd;
+  get isEven = self::E3|get#isEven;
+}
+static method E1|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:6:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  int ceil() {} // Error.
+      ^" in null;
+}
+static method E1|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E1|ceil(#this);
+static method E2|ceil(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:10:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  int ceil() {} // Ok.
+      ^" in null;
+}
+static method E2|get#ceil(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|ceil(#this);
+static method E2|floor(lowered final core::int #this) → core::int {
+  return invalid-expression "pkg/front_end/testcases/extension_types/simple_show_hide_conflicts.dart:11:7: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  int floor() {} // Error.
+      ^" in null;
+}
+static method E2|get#floor(lowered final core::int #this) → () → core::int
+  return () → core::int => self::E2|floor(#this);
+static method E3|get#isOdd(lowered final core::int #this) → core::bool
+  return throw 42;
+static method E3|get#isEven(lowered final core::int #this) → core::bool
+  return throw 42;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart.weak.modular.expect
new file mode 100644
index 0000000..7f95ca4
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart:8:26: Error: Type variables can't be used in static members.
+//   static A<T>? method1(A<T> arg) {
+//                          ^
+//
+// pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart:8:12: Error: Type variables can't be used in static members.
+//   static A<T>? method1(A<T> arg) {
+//            ^
+//
+// pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart:11:31: Error: Type variables can't be used in static members.
+//   static A<A<T>>? method2(A<A<T>> arg) {
+//                               ^
+//
+// pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart:11:14: Error: Type variables can't be used in static members.
+//   static A<A<T>>? method2(A<A<T>> arg) {
+//              ^
+//
+// pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart:9:7: Error: Type variables can't be used in static members.
+//     A<T>? local;
+//       ^
+//
+// pkg/front_end/testcases/extension_types/type_variable_in_static_context.dart:12:9: Error: Type variables can't be used in static members.
+//     A<A<T>>? local;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static method method1(self::A<invalid-type> arg) → self::A<invalid-type>? {
+    self::A<invalid-type>? local;
+  }
+  static method method2(self::A<self::A<invalid-type>> arg) → self::A<self::A<invalid-type>>? {
+    self::A<self::A<invalid-type>>? local;
+  }
+}
+extension type A<T extends core::Object? = dynamic> on self::Class<T%> {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.modular.expect
new file mode 100644
index 0000000..65db982
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_hide_elements.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int hide-operators core::num::* {
+}
+extension type E1 on core::int hide-getters core::int::isEven {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> hide-setters core::List::length {
+}
+extension type E3 on core::int hide-types core::num {
+}
+extension type E4 on core::List<core::int> hide-types core::Iterable<core::int> {
+}
+extension type E5 on core::List<dynamic> hide-types core::Iterable<dynamic> {
+}
+extension type E6 on core::List<core::int> hide-types core::Iterable<core::int> {
+}
+extension type E on self::C hide-types self::B<core::int> hide-methods self::C::baz hide-getters self::C::baz, self::B::foo hide-setters self::C::bar hide-operators self::B::* {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.modular.expect b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.modular.expect
new file mode 100644
index 0000000..0aae661
--- /dev/null
+++ b/pkg/front_end/testcases/extension_types/various_show_elements.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as prefixedCore;
+import "dart:core";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator *(self::A other) → self::A;
+}
+class B<X extends core::Object? = dynamic> extends core::Object implements self::A {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  get foo() → core::bool
+    return throw 42;
+  operator *(self::A other) → self::A
+    return throw 42;
+}
+class C extends self::B<core::int> {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  set bar(core::int value) → void {}
+  method baz() → void {}
+}
+extension type E0 on core::int show-operators core::num::* {
+}
+extension type E1 on core::int show-getters core::int::isEven {
+}
+extension type E2<T extends core::Object? = dynamic> on core::List<T%> show-setters core::List::length {
+}
+extension type E3 on core::int show-types core::num {
+}
+extension type E4 on core::List<core::int> show-types core::Iterable<core::int> {
+}
+extension type E5 on core::List<dynamic> show-types core::Iterable<dynamic> {
+}
+extension type E6 on core::List<core::int> show-types core::Iterable<core::int> {
+}
+extension type E on self::C show-types self::B<core::int> show-methods self::C::baz show-getters self::C::baz, self::B::foo show-setters self::C::bar show-operators self::B::* {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.modular.expect
new file mode 100644
index 0000000..1dca435
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.weak.modular.expect
@@ -0,0 +1,275 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.method();
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.method;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.getter;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.setter;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.getter = 42;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.setter = 42;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.property;
+//     ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+//   int get property => 42;
+//           ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+//   void set property(int value) {}
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.property = 42;
+//     ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+//   int get property => 42;
+//           ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+//   void set property(int value) {}
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c + 0;
+//     ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:10:16: Context: This is one of the extension members.
+//   int operator +(int i) => i;
+//                ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:20:16: Context: This is one of the extension members.
+//   int operator +(int i) => i;
+//                ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   -c;
+//   ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:11:16: Context: This is one of the extension members.
+//   int operator -() => 0;
+//                ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:21:16: Context: This is one of the extension members.
+//   int operator -() => 0;
+//                ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c[42];
+//    ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+//   int operator [](int i) => i;
+//                ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+//   void operator []=(int i, int j) {}
+//                 ^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c[42] = 0;
+//    ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+//   int operator [](int i) => i;
+//                ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+//   void operator []=(int i, int j) {}
+//                 ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension A on self::C* {
+  method method = self::A|method;
+  tearoff method = self::A|get#method;
+  get getter = self::A|get#getter;
+  get property = self::A|get#property;
+  operator + = self::A|+;
+  operator unary- = self::A|unary-;
+  operator [] = self::A|[];
+  set setter = self::A|set#setter;
+}
+extension B on self::C* {
+  method method = self::B|method;
+  tearoff method = self::B|get#method;
+  get getter = self::B|get#getter;
+  operator + = self::B|+;
+  operator unary- = self::B|unary-;
+  operator []= = self::B|[]=;
+  set setter = self::B|set#setter;
+  set property = self::B|set#property;
+}
+static method A|method(lowered final self::C* #this) → void {}
+static method A|get#method(lowered final self::C* #this) → () →* void
+  return () → void => self::A|method(#this);
+static method A|get#getter(lowered final self::C* #this) → core::int*
+  return 42;
+static method A|set#setter(lowered final self::C* #this, core::int* value) → void {}
+static method A|get#property(lowered final self::C* #this) → core::int*
+  return 42;
+static method A|+(lowered final self::C* #this, core::int* i) → core::int*
+  return i;
+static method A|unary-(lowered final self::C* #this) → core::int*
+  return 0;
+static method A|[](lowered final self::C* #this, core::int* i) → core::int*
+  return i;
+static method B|method(lowered final self::C* #this) → void {}
+static method B|get#method(lowered final self::C* #this) → () →* void
+  return () → void => self::B|method(#this);
+static method B|get#getter(lowered final self::C* #this) → core::int*
+  return 42;
+static method B|set#setter(lowered final self::C* #this, core::int* value) → void {}
+static method B|set#property(lowered final self::C* #this, core::int* value) → void {}
+static method B|+(lowered final self::C* #this, core::int* i) → core::int*
+  return i;
+static method B|unary-(lowered final self::C* #this) → core::int*
+  return 0;
+static method B|[]=(lowered final self::C* #this, core::int* i, core::int* j) → void {}
+static method errors(self::C* c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.method();
+    ^^^^^^" in c{<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.method;
+    ^^^^^^" in c{<unresolved>}.method;
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.getter;
+    ^^^^^^" in c{<unresolved>}.getter;
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.setter;
+    ^^^^^^" in c{<unresolved>}.setter;
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.getter = 42;
+    ^^^^^^" in c{<unresolved>}.getter = 42;
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.setter = 42;
+    ^^^^^^" in c{<unresolved>}.setter = 42;
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.property;
+    ^^^^^^^^" in c{<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.property = 42;
+    ^^^^^^^^" in c{<unresolved>}.property = 42;
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c + 0;
+    ^" in c{<unresolved>}.+(0);
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  -c;
+  ^" in c{<unresolved>}.unary-();
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c[42];
+   ^" in c{<unresolved>}.[](42);
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c[42] = 0;
+   ^" in c{<unresolved>}.[]=(42, 0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/annotations.dart.weak.modular.expect
new file mode 100644
index 0000000..61a26a4
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/annotations.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  @#C3
+  method instanceMethod() → dynamic {}
+  @#C3
+  static method staticMethod() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  method extensionInstanceMethod = self::Extension|extensionInstanceMethod;
+  tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
+  static method extensionStaticMethod = self::Extension|extensionStaticMethod;
+}
+@#C3
+static method Extension|extensionInstanceMethod(lowered final self::Class* #this) → dynamic {}
+static method Extension|get#extensionInstanceMethod(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|extensionInstanceMethod(#this);
+@#C3
+static method Extension|extensionStaticMethod() → dynamic {}
+@#C3
+static method topLevelMethod() → dynamic {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "dart2js:noInline"
+  #C2 = null
+  #C3 = core::pragma {name:#C1, options:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///annotations.dart:
+- pragma._ (from org-dartlang-sdk:///sdk/lib/core/annotations.dart:188:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.modular.expect
new file mode 100644
index 0000000..1fc63c7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  static field constField = self::E|constField;
+  static field constField1 = self::E|constField1;
+  static field constField2 = self::E|constField2;
+  static method staticMethod = self::E|staticMethod;
+  method instanceMethod = self::E|instanceMethod;
+  tearoff instanceMethod = self::E|get#instanceMethod;
+}
+@#C1
+static const field core::int E|constField = #C1;
+@#C2
+static const field core::int E|constField1 = #C3;
+@#C3
+static const field core::int E|constField2 = #C2;
+@#C1
+static method E|staticMethod() → void {}
+@#C1
+static method E|instanceMethod(lowered final core::int #this) → void {}
+static method E|get#instanceMethod(lowered final core::int #this) → () → void
+  return () → void => self::E|instanceMethod(#this);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 3
+  #C3 = 2
+}
diff --git a/pkg/front_end/testcases/extensions/async_extensions.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.modular.expect
new file mode 100644
index 0000000..f053e58
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/async_extensions.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  method syncStarMethod = self::Extension|syncStarMethod;
+  tearoff syncStarMethod = self::Extension|get#syncStarMethod;
+  method asyncMethod = self::Extension|asyncMethod;
+  tearoff asyncMethod = self::Extension|get#asyncMethod;
+  method asyncStarMethod = self::Extension|asyncStarMethod;
+  tearoff asyncStarMethod = self::Extension|get#asyncStarMethod;
+}
+static method Extension|syncStarMethod(lowered final core::int* #this) → dynamic sync* {}
+static method Extension|get#syncStarMethod(lowered final core::int* #this) → () →* dynamic
+  return () → dynamic => self::Extension|syncStarMethod(#this);
+static method Extension|asyncMethod(lowered final core::int* #this) → dynamic async {}
+static method Extension|get#asyncMethod(lowered final core::int* #this) → () →* dynamic
+  return () → dynamic => self::Extension|asyncMethod(#this);
+static method Extension|asyncStarMethod(lowered final core::int* #this) → dynamic async* {}
+static method Extension|get#asyncStarMethod(lowered final core::int* #this) → () →* dynamic
+  return () → dynamic => self::Extension|asyncStarMethod(#this);
+static method main() → dynamic {
+  self::Extension|syncStarMethod(0);
+  self::Extension|get#syncStarMethod(0);
+  self::Extension|asyncMethod(0);
+  self::Extension|get#asyncMethod(0);
+  self::Extension|asyncStarMethod(0);
+  self::Extension|get#asyncStarMethod(0);
+}
diff --git a/pkg/front_end/testcases/extensions/bounds.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..8c13b5c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/bounds.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension Extension1<T extends core::Object*> on T* {
+  method method1 = self::Extension1|method1;
+  tearoff method1 = self::Extension1|get#method1;
+  method method2 = self::Extension1|method2;
+  tearoff method2 = self::Extension1|get#method2;
+  method method3 = self::Extension1|method3;
+  tearoff method3 = self::Extension1|get#method3;
+  method method4 = self::Extension1|method4;
+  tearoff method4 = self::Extension1|get#method4;
+}
+extension Extension2<T extends core::String*> on T* {
+  method method1 = self::Extension2|method1;
+  tearoff method1 = self::Extension2|get#method1;
+  method method2 = self::Extension2|method2;
+  tearoff method2 = self::Extension2|get#method2;
+  method method3 = self::Extension2|method3;
+  tearoff method3 = self::Extension2|get#method3;
+  method method4 = self::Extension2|method4;
+  tearoff method4 = self::Extension2|get#method4;
+}
+extension Extension3<T extends dynamic> on T* {
+  method method1 = self::Extension3|method1;
+  tearoff method1 = self::Extension3|get#method1;
+  method method2 = self::Extension3|method2;
+  tearoff method2 = self::Extension3|get#method2;
+  method method3 = self::Extension3|method3;
+  tearoff method3 = self::Extension3|get#method3;
+  method method4 = self::Extension3|method4;
+  tearoff method4 = self::Extension3|get#method4;
+}
+extension Extension4<T extends core::Object* = dynamic> on T* {
+  method method1 = self::Extension4|method1;
+  tearoff method1 = self::Extension4|get#method1;
+  method method2 = self::Extension4|method2;
+  tearoff method2 = self::Extension4|get#method2;
+  method method3 = self::Extension4|method3;
+  tearoff method3 = self::Extension4|get#method3;
+  method method4 = self::Extension4|method4;
+  tearoff method4 = self::Extension4|get#method4;
+}
+static method Extension1|method1<T extends core::Object*, S extends core::Object*>(lowered final self::Extension1|method1::T* #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object*>(lowered final self::Extension1|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T*, S*>(#this);
+static method Extension1|method2<T extends core::Object*, S extends core::String*>(lowered final self::Extension1|method2::T* #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object*>(lowered final self::Extension1|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T*, S*>(#this);
+static method Extension1|method3<T extends core::Object*, S extends dynamic>(lowered final self::Extension1|method3::T* #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object*>(lowered final self::Extension1|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T*, S%>(#this);
+static method Extension1|method4<T extends core::Object*, S extends core::Object* = dynamic>(lowered final self::Extension1|method4::T* #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object*>(lowered final self::Extension1|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+  return <S extends core::Object* = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T*, S*>(#this);
+static method Extension2|method1<T extends core::String*, S extends core::Object*>(lowered final self::Extension2|method1::T* #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String*>(lowered final self::Extension2|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T*, S*>(#this);
+static method Extension2|method2<T extends core::String*, S extends core::String*>(lowered final self::Extension2|method2::T* #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String*>(lowered final self::Extension2|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T*, S*>(#this);
+static method Extension2|method3<T extends core::String*, S extends dynamic>(lowered final self::Extension2|method3::T* #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String*>(lowered final self::Extension2|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T*, S%>(#this);
+static method Extension2|method4<T extends core::String*, S extends core::Object* = dynamic>(lowered final self::Extension2|method4::T* #this) → dynamic {}
+static method Extension2|get#method4<T extends core::String*>(lowered final self::Extension2|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+  return <S extends core::Object* = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T*, S*>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object*>(lowered final self::Extension3|method1::T* #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S*>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String*>(lowered final self::Extension3|method2::T* #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S*>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T* #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object* = dynamic>(lowered final self::Extension3|method4::T* #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+  return <S extends core::Object* = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S*>(#this);
+static method Extension4|method1<T extends core::Object* = dynamic, S extends core::Object*>(lowered final self::Extension4|method1::T* #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method1::T* #this) → <S extends core::Object*>() →* dynamic
+  return <S extends core::Object*>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T*, S*>(#this);
+static method Extension4|method2<T extends core::Object* = dynamic, S extends core::String*>(lowered final self::Extension4|method2::T* #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method2::T* #this) → <S extends core::String*>() →* dynamic
+  return <S extends core::String*>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T*, S*>(#this);
+static method Extension4|method3<T extends core::Object* = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T* #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method3::T* #this) → <S extends dynamic>() →* dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T*, S%>(#this);
+static method Extension4|method4<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::Extension4|method4::T* #this) → dynamic {}
+static method Extension4|get#method4<T extends core::Object* = dynamic>(lowered final self::Extension4|get#method4::T* #this) → <S extends core::Object* = dynamic>() →* dynamic
+  return <S extends core::Object* = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T*, S*>(#this);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.modular.expect
new file mode 100644
index 0000000..dba880e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/builtin_identifiers.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/builtin_identifiers.dart:5:11: Error: Can't use 'mixin' as a name here.
+// extension mixin on int {}
+//           ^^^^^
+//
+// pkg/front_end/testcases/extensions/builtin_identifiers.dart:7:11: Error: Can't use 'extension' as a name here.
+// extension extension on int {}
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/builtin_identifiers.dart:9:11: Error: Can't use 'as' as a name here.
+// extension as on int {}
+//           ^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension mixin on core::int* {
+}
+extension extension on core::int* {
+}
+extension as on core::int* {
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/call_methods.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/call_methods.dart.weak.modular.expect
new file mode 100644
index 0000000..d38841f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/call_methods.dart.weak.modular.expect
@@ -0,0 +1,192 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel1 = 1(10);
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel2 = 1("10");
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel3 = 1.0(10);
+//                    ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// var topLevel4 = 1.0("10");
+//                    ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var topLevel5 = a(2);
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var topLevel6 = a(2, "3");
+//                  ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:39:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   1(10);
+//    ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:40:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   1("10");
+//    ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:41:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   1.0(10);
+//      ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:42:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   1.0("10");
+//      ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   a(2);
+//    ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   a(2, "3");
+//    ^
+//
+// pkg/front_end/testcases/extensions/call_methods.dart:47:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   b();
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  get call() → core::String*
+    return "My name is A";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get call() → () →* core::String*
+    return () → core::String* => "My name is B";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension _extension#0 on core::int* {
+  get call = self::_extension#0|get#call;
+}
+extension _extension#1 on core::num* {
+  get call = self::_extension#1|get#call;
+}
+extension _extension#2 on core::String* {
+  get call = self::_extension#2|get#call;
+}
+static field core::String* topLevel1 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:29:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+var topLevel1 = 1(10);
+                 ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.(10);
+static field core::String* topLevel2 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:30:18: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+var topLevel2 = 1(\"10\");
+                 ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.("10");
+static field core::String* topLevel3 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:31:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+var topLevel3 = 1.0(10);
+                   ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.(10);
+static field core::String* topLevel4 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:32:20: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+var topLevel4 = 1.0(\"10\");
+                   ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
+static field self::A* a = new self::A::•();
+static field invalid-type topLevel5 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:34:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+ - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var topLevel5 = a(2);
+                 ^";
+static field self::B* b = new self::B::•();
+static field invalid-type topLevel6 = invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:36:18: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+ - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var topLevel6 = a(2, \"3\");
+                 ^";
+static method _extension#0|get#call(lowered final core::int* #this) → core::String*
+  return "My name is int";
+static method _extension#1|get#call(lowered final core::num* #this) → core::String*
+  return "My name is num";
+static method _extension#2|get#call(lowered final core::String* #this) → () →* core::String*
+  return () → core::String* => "My name is String";
+static method main() → dynamic {
+  self::_extension#2|get#call("")(){() →* core::String*};
+}
+static method errors() → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:39:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  1(10);
+   ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.(10);
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:40:4: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  1(\"10\");
+   ^" in self::_extension#2|get#call(self::_extension#0|get#call(1)){<inapplicable>}.("10");
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:41:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  1.0(10);
+     ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.(10);
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:42:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  1.0(\"10\");
+     ^" in self::_extension#2|get#call(self::_extension#1|get#call(1.0)){<inapplicable>}.("10");
+  self::A* a = new self::A::•();
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:44:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+ - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  a(2);
+   ^";
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:45:4: Error: Cannot invoke an instance of 'A' because it declares 'call' to be something other than a method.
+ - 'A' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  a(2, \"3\");
+   ^";
+  self::B* b = new self::B::•();
+  invalid-expression "pkg/front_end/testcases/extensions/call_methods.dart:47:4: Error: Cannot invoke an instance of 'B' because it declares 'call' to be something other than a method.
+ - 'B' is from 'pkg/front_end/testcases/extensions/call_methods.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  b();
+   ^";
+}
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..0e8aa01
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.weak.modular.expect
@@ -0,0 +1,972 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   classA.method(); // Expect method not found.
+//          ^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:25:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).method(); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:26:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).method(); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:28:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:28:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:29:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:29:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:30:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:31:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:31:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:32:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:32:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:33:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:34:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:35:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:41:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).method(); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:44:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   classB.genericMethod(a); // Expect bounds mismatch.
+//          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:45:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   classB.genericMethod<A>(a); // Expect bounds mismatch.
+//          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:47:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classB).genericMethod(a); // Expect bounds mismatch.
+//                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:48:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:50:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:51:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:52:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:53:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:54:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:60:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+// final field1 = classA.method(); // Expect method not found.
+//                       ^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:61:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field2 = Extension(classA).method(); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:62:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// final field3 = Extension<A>(classA).method(); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:64:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:64:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field5 = Extension(classA).genericMethod(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:65:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// final field6 = Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:66:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field7 = Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// final field8 = Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:67:16: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field8 = Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
+//                ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:69:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:69:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:71:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:73:26: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:75:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:81:17: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// final field16 = Extension<A>(classB).method(); // Expect bounds mismatch.
+//                 ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:84:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field18 = classB.genericMethod(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:85:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// final field19 = classB.genericMethod<A>(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:87:35: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// final field21 = Extension(classB).genericMethod(a); // Expect bounds mismatch.
+//                                   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:89:23: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//                       ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
+//     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:92:5: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
+//     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:94:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:96:5: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:98:26: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds.dart:100:26: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//                          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   classA.method();
+//          ^^^^^^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:12:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).method(); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:13:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).method(); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:15:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:16:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:17:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:18:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:18:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:19:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:20:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classA).genericMethod<B>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:21:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension<B>(classA).genericMethod(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:22:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classA).genericMethod<A>(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:28:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).method(); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:31:10: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   classB.genericMethod(a); // Expect bounds mismatch.
+//          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:32:10: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   classB.genericMethod<A>(a); // Expect bounds mismatch.
+//          ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:34:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension(classB).genericMethod(a); // Expect bounds mismatch.
+//                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:35:21: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//                     ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:37:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:38:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:39:3: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<A>(classB).genericMethod<B>(a); // Expect bounds mismatch.
+//   ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:13:21: Context: This is the type variable whose bound isn't conformed to.
+// extension Extension<T extends B> on Class<T> {
+//                     ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:40:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+// pkg/front_end/testcases/extensions/check_bounds_lib.dart:41:24: Error: Type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+//  - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   Extension<B>(classB).genericMethod<A>(a); // Expect bounds mismatch.
+//                        ^
+// pkg/front_end/testcases/extensions/check_bounds.dart:15:17: Context: This is the type variable whose bound isn't conformed to.
+//   genericMethod<S extends B>(S s) {}
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+part check_bounds_lib.dart;
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class Class<T extends self::A*> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension<T extends self::B*> on self::Class<T*>* {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method genericMethod = self::Extension|genericMethod;
+  tearoff genericMethod = self::Extension|get#genericMethod;
+}
+static final field self::A* a = new self::A::•();
+static final field self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+static final field dynamic field1 = invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:60:23: Error: The method 'method' isn't defined for the class 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+final field1 = classA.method(); // Expect method not found.
+                      ^^^^^^" in self::classA{<unresolved>}.method();
+static final field dynamic field2 = self::Extension|method<self::A*>(self::classA);
+static final field dynamic field3 = self::Extension|method<self::A*>(self::classA);
+static final field dynamic field4 = self::Extension|method<self::B*>(self::classA as{TypeError} self::Class<self::B*>*);
+static final field dynamic field5 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
+static final field dynamic field6 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
+static final field dynamic field7 = self::Extension|genericMethod<self::A*, self::B*>(self::classA, self::a as{TypeError} self::B*);
+static final field dynamic field8 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
+static final field dynamic field9 = self::Extension|genericMethod<self::A*, self::A*>(self::classA, self::a);
+static final field dynamic field10 = self::Extension|genericMethod<self::A*, self::B*>(self::classA, self::a as{TypeError} self::B*);
+static final field dynamic field11 = self::Extension|genericMethod<self::B*, self::A*>(self::classA as{TypeError} self::Class<self::B*>*, self::a);
+static final field dynamic field12 = self::Extension|genericMethod<self::B*, self::A*>(self::classA as{TypeError} self::Class<self::B*>*, self::a);
+static final field dynamic field13 = self::Extension|genericMethod<self::B*, self::B*>(self::classA as{TypeError} self::Class<self::B*>*, self::a as{TypeError} self::B*);
+static final field self::Class<self::B*>* classB = new self::Class::•<self::B*>();
+static final field dynamic field14 = self::Extension|method<self::B*>(self::classB);
+static final field dynamic field15 = self::Extension|method<self::B*>(self::classB);
+static final field dynamic field16 = self::Extension|method<self::A*>(self::classB);
+static final field dynamic field17 = self::Extension|method<self::B*>(self::classB);
+static final field dynamic field18 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
+static final field dynamic field19 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
+static final field dynamic field20 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
+static final field dynamic field21 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
+static final field dynamic field22 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
+static final field dynamic field23 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
+static final field dynamic field24 = self::Extension|genericMethod<self::A*, self::A*>(self::classB, self::a);
+static final field dynamic field25 = self::Extension|genericMethod<self::A*, self::A*>(self::classB, self::a);
+static final field dynamic field26 = self::Extension|genericMethod<self::A*, self::B*>(self::classB, self::a as{TypeError} self::B*);
+static final field dynamic field27 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
+static final field dynamic field28 = self::Extension|genericMethod<self::B*, self::A*>(self::classB, self::a);
+static final field dynamic field29 = self::Extension|genericMethod<self::B*, self::B*>(self::classB, self::a as{TypeError} self::B*);
+static method Extension|method<T extends self::B*>(lowered final self::Class<self::Extension|method::T*>* #this) → dynamic {}
+static method Extension|get#method<T extends self::B*>(lowered final self::Class<self::Extension|get#method::T*>* #this) → () →* dynamic
+  return () → dynamic => self::Extension|method<self::Extension|get#method::T*>(#this);
+static method Extension|genericMethod<T extends self::B*, S extends self::B*>(lowered final self::Class<self::Extension|genericMethod::T*>* #this, self::Extension|genericMethod::S* s) → dynamic {}
+static method Extension|get#genericMethod<T extends self::B*>(lowered final self::Class<self::Extension|get#genericMethod::T*>* #this) → <S extends self::B*>(S*) →* dynamic
+  return <S extends self::B*>(S* s) → dynamic => self::Extension|genericMethod<self::Extension|get#genericMethod::T*, S*>(#this, s);
+static method main() → dynamic {}
+static method test() → dynamic {
+  self::A* a;
+  self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds.dart:24:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  classA.method(); // Expect method not found.
+         ^^^^^^" in classA{<unresolved>}.method();
+  self::Extension|method<self::A*>(classA);
+  self::Extension|method<self::A*>(classA);
+  self::Extension|method<self::B*>(classA as{TypeError} self::Class<self::B*>*);
+  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
+  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
+  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
+  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
+  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
+  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
+  self::Extension|genericMethod<self::B*, self::B*>(classA as{TypeError} self::Class<self::B*>*, a as{TypeError} self::B*);
+  self::Class<self::B*>* classB = new self::Class::•<self::B*>();
+  self::Extension|method<self::B*>(classB);
+  self::Extension|method<self::B*>(classB);
+  self::Extension|method<self::A*>(classB);
+  self::Extension|method<self::B*>(classB);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::A*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+}
+static method /* from org-dartlang-testcase:///check_bounds_lib.dart */ testInPart() → dynamic {
+  self::A* a;
+  self::Class<self::A*>* classA = new self::Class::•<self::A*>();
+  invalid-expression "pkg/front_end/testcases/extensions/check_bounds_lib.dart:11:10: Error: The method 'method' isn't defined for the class 'Class<A>'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+ - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  classA.method();
+         ^^^^^^" in classA{<unresolved>}.method();
+  self::Extension|method<self::A*>(classA);
+  self::Extension|method<self::A*>(classA);
+  self::Extension|method<self::B*>(classA as{TypeError} self::Class<self::B*>*);
+  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
+  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
+  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
+  self::Extension|genericMethod<self::A*, self::A*>(classA, a);
+  self::Extension|genericMethod<self::A*, self::B*>(classA, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
+  self::Extension|genericMethod<self::B*, self::A*>(classA as{TypeError} self::Class<self::B*>*, a);
+  self::Extension|genericMethod<self::B*, self::B*>(classA as{TypeError} self::Class<self::B*>*, a as{TypeError} self::B*);
+  self::Class<self::B*>* classB = new self::Class::•<self::B*>();
+  self::Extension|method<self::B*>(classB);
+  self::Extension|method<self::B*>(classB);
+  self::Extension|method<self::A*>(classB);
+  self::Extension|method<self::B*>(classB);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::A*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::A*, self::B*>(classB, a as{TypeError} self::B*);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::A*>(classB, a);
+  self::Extension|genericMethod<self::B*, self::B*>(classB, a as{TypeError} self::B*);
+}
diff --git a/pkg/front_end/testcases/extensions/compounds.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/compounds.dart.weak.modular.expect
new file mode 100644
index 0000000..ccd5bd4
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/compounds.dart.weak.modular.expect
@@ -0,0 +1,514 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Number extends core::Object {
+  final field core::int* value;
+  constructor •(core::int* value) → self::Number*
+    : self::Number::value = value, super core::Object::•()
+    ;
+  get hashCode() → core::int*
+    return this.{self::Number::value}{core::int*}.{core::num::hashCode}{core::int*};
+  operator ==(core::Object* other) → core::bool*
+    return other is self::Number* && this.{self::Number::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Number*}.{self::Number::value}{core::int*};
+  method toString() → core::String*
+    return "Number(${this.{self::Number::value}{core::int*}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends core::Object {
+  field self::Number* field;
+  constructor •(self::Number* field) → self::Class*
+    : self::Class::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class IntClass extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::IntClass*
+    : self::IntClass::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension NumberExtension on self::Number* {
+  operator + = self::NumberExtension|+;
+  operator - = self::NumberExtension|-;
+}
+extension ClassExtension on self::Class* {
+  get property = self::ClassExtension|get#property;
+  method testImplicitProperties = self::ClassExtension|testImplicitProperties;
+  tearoff testImplicitProperties = self::ClassExtension|get#testImplicitProperties;
+  set property = self::ClassExtension|set#property;
+}
+extension IntClassExtension on self::IntClass* {
+  get property = self::IntClassExtension|get#property;
+  method testImplicitProperties = self::IntClassExtension|testImplicitProperties;
+  tearoff testImplicitProperties = self::IntClassExtension|get#testImplicitProperties;
+  set property = self::IntClassExtension|set#property;
+}
+static method NumberExtension|+(lowered final self::Number* #this, core::Object* other) → self::Number* {
+  if(other is core::int*) {
+    return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::+}(other{core::int*}){(core::num*) →* core::int*});
+  }
+  else
+    if(other is self::Number*) {
+      return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::+}(other{self::Number*}.{self::Number::value}{core::int*}){(core::num*) →* core::int*});
+    }
+    else {
+      throw new core::ArgumentError::•("${other}");
+    }
+}
+static method NumberExtension|-(lowered final self::Number* #this, core::Object* other) → self::Number* {
+  if(other is core::int*) {
+    return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::-}(other{core::int*}){(core::num*) →* core::int*});
+  }
+  else
+    if(other is self::Number*) {
+      return new self::Number::•(#this.{self::Number::value}{core::int*}.{core::num::-}(other{self::Number*}.{self::Number::value}{core::int*}){(core::num*) →* core::int*});
+    }
+    else {
+      throw new core::ArgumentError::•("${other}");
+    }
+}
+static method ClassExtension|get#property(lowered final self::Class* #this) → self::Number*
+  return #this.{self::Class::field}{self::Number*};
+static method ClassExtension|set#property(lowered final self::Class* #this, self::Number* value) → void {
+  #this.{self::Class::field} = value;
+}
+static method ClassExtension|testImplicitProperties(lowered final self::Class* #this) → dynamic {
+  self::Number* n0 = new self::Number::•(0);
+  self::Number* n1 = new self::Number::•(1);
+  self::Number* n2 = new self::Number::•(2);
+  self::expect(n0, self::ClassExtension|get#property(#this));
+  self::expect(n1, let final self::Number* #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
+  self::expect(n2, let final self::Number* #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
+  self::expect(n0, let final self::Number* #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
+  self::expect(n1, let final self::Number* #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
+  self::expect(n0, let final self::Number* #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
+  self::expect(n1, let final self::Number* #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
+  self::expect(n0, let final self::Number* #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
+  self::expect(n0, let final self::Number* #t15 = self::ClassExtension|get#property(#this) in let final self::Number* #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
+  self::expect(n1, let final self::Number* #t17 = self::ClassExtension|get#property(#this) in let final self::Number* #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
+  self::expect(n0, self::ClassExtension|get#property(#this));
+  self::expect(n0, self::ClassExtension|get#property(#this));
+  self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
+  self::expect(n1, self::ClassExtension|get#property(#this));
+  self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
+  self::expect(n2, self::ClassExtension|get#property(#this));
+  self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n2));
+  self::expect(n0, self::ClassExtension|get#property(#this));
+  self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
+  self::expect(n1, self::ClassExtension|get#property(#this));
+  self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n1));
+  self::expect(n0, self::ClassExtension|get#property(#this));
+  let final self::Number* #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
+  self::expect(n1, self::ClassExtension|get#property(#this));
+  let final self::Number* #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
+  self::expect(n0, self::ClassExtension|get#property(#this));
+  self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1));
+  self::expect(n1, self::ClassExtension|get#property(#this));
+  self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), 1));
+  self::expect(n0, self::ClassExtension|get#property(#this));
+}
+static method ClassExtension|get#testImplicitProperties(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::ClassExtension|testImplicitProperties(#this);
+static method IntClassExtension|get#property(lowered final self::IntClass* #this) → core::int*
+  return #this.{self::IntClass::field}{core::int*};
+static method IntClassExtension|set#property(lowered final self::IntClass* #this, core::int* value) → void {
+  #this.{self::IntClass::field} = value;
+}
+static method IntClassExtension|testImplicitProperties(lowered final self::IntClass* #this) → dynamic {
+  core::int* n0 = 0;
+  core::int* n1 = 1;
+  core::int* n2 = 2;
+  self::expect(n0, self::IntClassExtension|get#property(#this));
+  self::expect(n1, let final core::int* #t23 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t24 = self::IntClassExtension|set#property(#this, #t23) in #t23);
+  self::expect(n2, let final core::int* #t25 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t26 = self::IntClassExtension|set#property(#this, #t25) in #t25);
+  self::expect(n0, let final core::int* #t27 = self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t28 = self::IntClassExtension|set#property(#this, #t27) in #t27);
+  self::expect(n1, let final core::int* #t29 = self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t30 = self::IntClassExtension|set#property(#this, #t29) in #t29);
+  self::expect(n0, let final core::int* #t31 = self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t32 = self::IntClassExtension|set#property(#this, #t31) in #t31);
+  self::expect(n1, let final core::int* #t33 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t34 = self::IntClassExtension|set#property(#this, #t33) in #t33);
+  self::expect(n0, let final core::int* #t35 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t36 = self::IntClassExtension|set#property(#this, #t35) in #t35);
+  self::expect(n0, let final core::int* #t37 = self::IntClassExtension|get#property(#this) in let final core::int* #t38 = self::IntClassExtension|set#property(#this, #t37.{core::num::+}(1){(core::num*) →* core::int*}) in #t37);
+  self::expect(n1, let final core::int* #t39 = self::IntClassExtension|get#property(#this) in let final core::int* #t40 = self::IntClassExtension|set#property(#this, #t39.{core::num::-}(1){(core::num*) →* core::int*}) in #t39);
+  self::expect(n0, self::IntClassExtension|get#property(#this));
+  self::expect(n0, self::IntClassExtension|get#property(#this));
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(#this));
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n2, self::IntClassExtension|get#property(#this));
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n2){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(#this));
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(#this));
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(n1){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(#this));
+  let final core::int* #t41 = self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t42 = self::IntClassExtension|set#property(#this, #t41) in #t41;
+  self::expect(n1, self::IntClassExtension|get#property(#this));
+  let final core::int* #t43 = self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t44 = self::IntClassExtension|set#property(#this, #t43) in #t43;
+  self::expect(n0, self::IntClassExtension|get#property(#this));
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::+}(1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(#this));
+  self::IntClassExtension|set#property(#this, self::IntClassExtension|get#property(#this).{core::num::-}(1){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(#this));
+}
+static method IntClassExtension|get#testImplicitProperties(lowered final self::IntClass* #this) → () →* dynamic
+  return () → dynamic => self::IntClassExtension|testImplicitProperties(#this);
+static method main() → dynamic {
+  self::testLocals();
+  self::testProperties();
+  self::testIntProperties();
+  self::testExplicitProperties();
+  self::testExplicitIntProperties();
+  self::testExplicitNullAwareProperties(null);
+  self::testExplicitNullAwareProperties(new self::Class::•(new self::Number::•(0)));
+  self::testExplicitNullAwareIntProperties(null);
+  self::testExplicitNullAwareIntProperties(new self::IntClass::•(0));
+  self::ClassExtension|testImplicitProperties(new self::Class::•(new self::Number::•(0)));
+  self::IntClassExtension|testImplicitProperties(new self::IntClass::•(0));
+}
+static method testLocals() → dynamic {
+  self::Number* n0 = new self::Number::•(0);
+  self::Number* n1 = new self::Number::•(1);
+  self::Number* n2 = new self::Number::•(2);
+  self::Number* v = n0;
+  self::expect(n0, v);
+  self::expect(n1, v = self::NumberExtension|+(v, n1));
+  self::expect(n2, v = self::NumberExtension|+(v, n1));
+  self::expect(n0, v = self::NumberExtension|-(v, n2));
+  self::expect(n1, v = self::NumberExtension|+(v, n1));
+  self::expect(n0, v = self::NumberExtension|-(v, n1));
+  self::expect(n1, v = self::NumberExtension|+(v, 1));
+  self::expect(n0, v = self::NumberExtension|-(v, 1));
+  self::expect(n0, let final self::Number* #t45 = v in let final self::Number* #t46 = v = self::NumberExtension|+(#t45, 1) in #t45);
+  self::expect(n1, let final self::Number* #t47 = v in let final self::Number* #t48 = v = self::NumberExtension|-(#t47, 1) in #t47);
+  self::expect(n0, v);
+  self::expect(n0, v);
+  v = self::NumberExtension|+(v, n1);
+  self::expect(n1, v);
+  v = self::NumberExtension|+(v, n1);
+  self::expect(n2, v);
+  v = self::NumberExtension|-(v, n2);
+  self::expect(n0, v);
+  v = self::NumberExtension|+(v, n1);
+  self::expect(n1, v);
+  v = self::NumberExtension|-(v, n1);
+  self::expect(n0, v);
+  v = self::NumberExtension|+(v, 1);
+  self::expect(n1, v);
+  v = self::NumberExtension|-(v, 1);
+  self::expect(n0, v);
+  v = self::NumberExtension|+(v, 1);
+  self::expect(n1, v);
+  v = self::NumberExtension|-(v, 1);
+  self::expect(n0, v);
+}
+static method testProperties() → dynamic {
+  self::Number* n0 = new self::Number::•(0);
+  self::Number* n1 = new self::Number::•(1);
+  self::Number* n2 = new self::Number::•(2);
+  self::Class* v = new self::Class::•(n0);
+  self::expect(n0, v.{self::Class::field}{self::Number*});
+  self::expect(n1, let final self::Class* #t49 = v in #t49.{self::Class::field} = self::NumberExtension|+(#t49.{self::Class::field}{self::Number*}, n1));
+  self::expect(n2, let final self::Class* #t50 = v in #t50.{self::Class::field} = self::NumberExtension|+(#t50.{self::Class::field}{self::Number*}, n1));
+  self::expect(n0, let final self::Class* #t51 = v in #t51.{self::Class::field} = self::NumberExtension|-(#t51.{self::Class::field}{self::Number*}, n2));
+  self::expect(n1, let final self::Class* #t52 = v in #t52.{self::Class::field} = self::NumberExtension|+(#t52.{self::Class::field}{self::Number*}, n1));
+  self::expect(n0, let final self::Class* #t53 = v in #t53.{self::Class::field} = self::NumberExtension|-(#t53.{self::Class::field}{self::Number*}, n1));
+  self::expect(n1, let final self::Class* #t54 = v in #t54.{self::Class::field} = self::NumberExtension|+(#t54.{self::Class::field}{self::Number*}, 1));
+  self::expect(n0, let final self::Class* #t55 = v in #t55.{self::Class::field} = self::NumberExtension|-(#t55.{self::Class::field}{self::Number*}, 1));
+  self::expect(n0, let final self::Class* #t56 = v in let final self::Number* #t57 = #t56.{self::Class::field}{self::Number*} in let final self::Number* #t58 = #t56.{self::Class::field} = self::NumberExtension|+(#t57, 1) in #t57);
+  self::expect(n1, let final self::Class* #t59 = v in let final self::Number* #t60 = #t59.{self::Class::field}{self::Number*} in let final self::Number* #t61 = #t59.{self::Class::field} = self::NumberExtension|-(#t60, 1) in #t60);
+  self::expect(n0, v.{self::Class::field}{self::Number*});
+  self::expect(n0, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t62 = v in #t62.{self::Class::field} = self::NumberExtension|+(#t62.{self::Class::field}{self::Number*}, n1);
+  self::expect(n1, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t63 = v in #t63.{self::Class::field} = self::NumberExtension|+(#t63.{self::Class::field}{self::Number*}, n1);
+  self::expect(n2, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t64 = v in #t64.{self::Class::field} = self::NumberExtension|-(#t64.{self::Class::field}{self::Number*}, n2);
+  self::expect(n0, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t65 = v in #t65.{self::Class::field} = self::NumberExtension|+(#t65.{self::Class::field}{self::Number*}, n1);
+  self::expect(n1, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t66 = v in #t66.{self::Class::field} = self::NumberExtension|-(#t66.{self::Class::field}{self::Number*}, n1);
+  self::expect(n0, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t67 = v in #t67.{self::Class::field} = self::NumberExtension|+(#t67.{self::Class::field}{self::Number*}, 1);
+  self::expect(n1, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t68 = v in #t68.{self::Class::field} = self::NumberExtension|-(#t68.{self::Class::field}{self::Number*}, 1);
+  self::expect(n0, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t69 = v in #t69.{self::Class::field} = self::NumberExtension|+(#t69.{self::Class::field}{self::Number*}, 1);
+  self::expect(n1, v.{self::Class::field}{self::Number*});
+  let final self::Class* #t70 = v in #t70.{self::Class::field} = self::NumberExtension|-(#t70.{self::Class::field}{self::Number*}, 1);
+  self::expect(n0, v.{self::Class::field}{self::Number*});
+  self::expect(n0, self::ClassExtension|get#property(v));
+  self::expect(n1, let final self::Class* #t71 = v in let final self::Number* #t72 = self::NumberExtension|+(self::ClassExtension|get#property(#t71), n1) in let final void #t73 = self::ClassExtension|set#property(#t71, #t72) in #t72);
+  self::expect(n2, let final self::Class* #t74 = v in let final self::Number* #t75 = self::NumberExtension|+(self::ClassExtension|get#property(#t74), n1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
+  self::expect(n0, let final self::Class* #t77 = v in let final self::Number* #t78 = self::NumberExtension|-(self::ClassExtension|get#property(#t77), n2) in let final void #t79 = self::ClassExtension|set#property(#t77, #t78) in #t78);
+  self::expect(n1, let final self::Class* #t80 = v in let final self::Number* #t81 = self::NumberExtension|+(self::ClassExtension|get#property(#t80), n1) in let final void #t82 = self::ClassExtension|set#property(#t80, #t81) in #t81);
+  self::expect(n0, let final self::Class* #t83 = v in let final self::Number* #t84 = self::NumberExtension|-(self::ClassExtension|get#property(#t83), n1) in let final void #t85 = self::ClassExtension|set#property(#t83, #t84) in #t84);
+  self::expect(n1, let final self::Class* #t86 = v in let final self::Number* #t87 = self::NumberExtension|+(self::ClassExtension|get#property(#t86), 1) in let final void #t88 = self::ClassExtension|set#property(#t86, #t87) in #t87);
+  self::expect(n0, let final self::Class* #t89 = v in let final self::Number* #t90 = self::NumberExtension|-(self::ClassExtension|get#property(#t89), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90);
+  self::expect(n0, let final self::Class* #t92 = v in let final self::Number* #t93 = self::ClassExtension|get#property(#t92) in let final self::Number* #t94 = self::ClassExtension|set#property(#t92, self::NumberExtension|+(#t93, 1)) in #t93);
+  self::expect(n1, let final self::Class* #t95 = v in let final self::Number* #t96 = self::ClassExtension|get#property(#t95) in let final self::Number* #t97 = self::ClassExtension|set#property(#t95, self::NumberExtension|-(#t96, 1)) in #t96);
+  self::expect(n0, self::ClassExtension|get#property(v));
+  self::expect(n0, self::ClassExtension|get#property(v));
+  let final self::Class* #t98 = v in self::ClassExtension|set#property(#t98, self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1));
+  self::expect(n1, self::ClassExtension|get#property(v));
+  let final self::Class* #t99 = v in self::ClassExtension|set#property(#t99, self::NumberExtension|+(self::ClassExtension|get#property(#t99), n1));
+  self::expect(n2, self::ClassExtension|get#property(v));
+  let final self::Class* #t100 = v in self::ClassExtension|set#property(#t100, self::NumberExtension|-(self::ClassExtension|get#property(#t100), n2));
+  self::expect(n0, self::ClassExtension|get#property(v));
+  let final self::Class* #t101 = v in self::ClassExtension|set#property(#t101, self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1));
+  self::expect(n1, self::ClassExtension|get#property(v));
+  let final self::Class* #t102 = v in self::ClassExtension|set#property(#t102, self::NumberExtension|-(self::ClassExtension|get#property(#t102), n1));
+  self::expect(n0, self::ClassExtension|get#property(v));
+  let final self::Class* #t103 = v in let final self::Number* #t104 = self::NumberExtension|+(self::ClassExtension|get#property(#t103), 1) in let final void #t105 = self::ClassExtension|set#property(#t103, #t104) in #t104;
+  self::expect(n1, self::ClassExtension|get#property(v));
+  let final self::Class* #t106 = v in let final self::Number* #t107 = self::NumberExtension|-(self::ClassExtension|get#property(#t106), 1) in let final void #t108 = self::ClassExtension|set#property(#t106, #t107) in #t107;
+  self::expect(n0, self::ClassExtension|get#property(v));
+  let final self::Class* #t109 = v in self::ClassExtension|set#property(#t109, self::NumberExtension|+(self::ClassExtension|get#property(#t109), 1));
+  self::expect(n1, self::ClassExtension|get#property(v));
+  let final self::Class* #t110 = v in self::ClassExtension|set#property(#t110, self::NumberExtension|-(self::ClassExtension|get#property(#t110), 1));
+  self::expect(n0, self::ClassExtension|get#property(v));
+}
+static method testIntProperties() → dynamic {
+  core::int* n0 = 0;
+  core::int* n1 = 1;
+  core::int* n2 = 2;
+  self::IntClass* v = new self::IntClass::•(n0);
+  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  self::expect(n1, let final self::IntClass* #t111 = v in #t111.{self::IntClass::field} = #t111.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n2, let final self::IntClass* #t112 = v in #t112.{self::IntClass::field} = #t112.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n0, let final self::IntClass* #t113 = v in #t113.{self::IntClass::field} = #t113.{self::IntClass::field}{core::int*}.{core::num::-}(n2){(core::num*) →* core::int*});
+  self::expect(n1, let final self::IntClass* #t114 = v in #t114.{self::IntClass::field} = #t114.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n0, let final self::IntClass* #t115 = v in #t115.{self::IntClass::field} = #t115.{self::IntClass::field}{core::int*}.{core::num::-}(n1){(core::num*) →* core::int*});
+  self::expect(n1, let final self::IntClass* #t116 = v in #t116.{self::IntClass::field} = #t116.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*});
+  self::expect(n0, let final self::IntClass* #t117 = v in #t117.{self::IntClass::field} = #t117.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*});
+  self::expect(n0, let final self::IntClass* #t118 = v in let final core::int* #t119 = #t118.{self::IntClass::field}{core::int*} in let final core::int* #t120 = #t118.{self::IntClass::field} = #t119.{core::num::+}(1){(core::num*) →* core::int*} in #t119);
+  self::expect(n1, let final self::IntClass* #t121 = v in let final core::int* #t122 = #t121.{self::IntClass::field}{core::int*} in let final core::int* #t123 = #t121.{self::IntClass::field} = #t122.{core::num::-}(1){(core::num*) →* core::int*} in #t122);
+  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t124 = v in #t124.{self::IntClass::field} = #t124.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
+  self::expect(n1, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t125 = v in #t125.{self::IntClass::field} = #t125.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
+  self::expect(n2, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t126 = v in #t126.{self::IntClass::field} = #t126.{self::IntClass::field}{core::int*}.{core::num::-}(n2){(core::num*) →* core::int*};
+  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t127 = v in #t127.{self::IntClass::field} = #t127.{self::IntClass::field}{core::int*}.{core::num::+}(n1){(core::num*) →* core::int*};
+  self::expect(n1, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t128 = v in #t128.{self::IntClass::field} = #t128.{self::IntClass::field}{core::int*}.{core::num::-}(n1){(core::num*) →* core::int*};
+  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t129 = v in #t129.{self::IntClass::field} = #t129.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+  self::expect(n1, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t130 = v in #t130.{self::IntClass::field} = #t130.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
+  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t131 = v in #t131.{self::IntClass::field} = #t131.{self::IntClass::field}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+  self::expect(n1, v.{self::IntClass::field}{core::int*});
+  let final self::IntClass* #t132 = v in #t132.{self::IntClass::field} = #t132.{self::IntClass::field}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
+  self::expect(n0, v.{self::IntClass::field}{core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  self::expect(n1, let final self::IntClass* #t133 = v in let final core::int* #t134 = self::IntClassExtension|get#property(#t133).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t135 = self::IntClassExtension|set#property(#t133, #t134) in #t134);
+  self::expect(n2, let final self::IntClass* #t136 = v in let final core::int* #t137 = self::IntClassExtension|get#property(#t136).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t138 = self::IntClassExtension|set#property(#t136, #t137) in #t137);
+  self::expect(n0, let final self::IntClass* #t139 = v in let final core::int* #t140 = self::IntClassExtension|get#property(#t139).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t141 = self::IntClassExtension|set#property(#t139, #t140) in #t140);
+  self::expect(n1, let final self::IntClass* #t142 = v in let final core::int* #t143 = self::IntClassExtension|get#property(#t142).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t144 = self::IntClassExtension|set#property(#t142, #t143) in #t143);
+  self::expect(n0, let final self::IntClass* #t145 = v in let final core::int* #t146 = self::IntClassExtension|get#property(#t145).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t147 = self::IntClassExtension|set#property(#t145, #t146) in #t146);
+  self::expect(n1, let final self::IntClass* #t148 = v in let final core::int* #t149 = self::IntClassExtension|get#property(#t148).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t150 = self::IntClassExtension|set#property(#t148, #t149) in #t149);
+  self::expect(n0, let final self::IntClass* #t151 = v in let final core::int* #t152 = self::IntClassExtension|get#property(#t151).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t153 = self::IntClassExtension|set#property(#t151, #t152) in #t152);
+  self::expect(n0, let final self::IntClass* #t154 = v in let final core::int* #t155 = self::IntClassExtension|get#property(#t154) in let final core::int* #t156 = self::IntClassExtension|set#property(#t154, #t155.{core::num::+}(1){(core::num*) →* core::int*}) in #t155);
+  self::expect(n1, let final self::IntClass* #t157 = v in let final core::int* #t158 = self::IntClassExtension|get#property(#t157) in let final core::int* #t159 = self::IntClassExtension|set#property(#t157, #t158.{core::num::-}(1){(core::num*) →* core::int*}) in #t158);
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t160 = v in self::IntClassExtension|set#property(#t160, self::IntClassExtension|get#property(#t160).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t161 = v in self::IntClassExtension|set#property(#t161, self::IntClassExtension|get#property(#t161).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n2, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t162 = v in self::IntClassExtension|set#property(#t162, self::IntClassExtension|get#property(#t162).{core::num::-}(n2){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t163 = v in self::IntClassExtension|set#property(#t163, self::IntClassExtension|get#property(#t163).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t164 = v in self::IntClassExtension|set#property(#t164, self::IntClassExtension|get#property(#t164).{core::num::-}(n1){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t165 = v in let final core::int* #t166 = self::IntClassExtension|get#property(#t165).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t167 = self::IntClassExtension|set#property(#t165, #t166) in #t166;
+  self::expect(n1, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t168 = v in let final core::int* #t169 = self::IntClassExtension|get#property(#t168).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t170 = self::IntClassExtension|set#property(#t168, #t169) in #t169;
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t171 = v in self::IntClassExtension|set#property(#t171, self::IntClassExtension|get#property(#t171).{core::num::+}(1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t172 = v in self::IntClassExtension|set#property(#t172, self::IntClassExtension|get#property(#t172).{core::num::-}(1){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(v));
+}
+static method testExplicitProperties() → dynamic {
+  self::Number* n0 = new self::Number::•(0);
+  self::Number* n1 = new self::Number::•(1);
+  self::Number* n2 = new self::Number::•(2);
+  self::Class* v = new self::Class::•(n0);
+  self::expect(n0, self::ClassExtension|get#property(v));
+  self::expect(n1, let final self::Class* #t173 = v in let final self::Number* #t174 = self::NumberExtension|+(self::ClassExtension|get#property(#t173), n1) in let final void #t175 = self::ClassExtension|set#property(#t173, #t174) in #t174);
+  self::expect(n2, let final self::Class* #t176 = v in let final self::Number* #t177 = self::NumberExtension|+(self::ClassExtension|get#property(#t176), n1) in let final void #t178 = self::ClassExtension|set#property(#t176, #t177) in #t177);
+  self::expect(n0, let final self::Class* #t179 = v in let final self::Number* #t180 = self::NumberExtension|-(self::ClassExtension|get#property(#t179), n2) in let final void #t181 = self::ClassExtension|set#property(#t179, #t180) in #t180);
+  self::expect(n1, let final self::Class* #t182 = v in let final self::Number* #t183 = self::NumberExtension|+(self::ClassExtension|get#property(#t182), n1) in let final void #t184 = self::ClassExtension|set#property(#t182, #t183) in #t183);
+  self::expect(n0, let final self::Class* #t185 = v in let final self::Number* #t186 = self::NumberExtension|-(self::ClassExtension|get#property(#t185), n1) in let final void #t187 = self::ClassExtension|set#property(#t185, #t186) in #t186);
+  self::expect(n1, let final self::Class* #t188 = v in let final self::Number* #t189 = self::NumberExtension|+(self::ClassExtension|get#property(#t188), 1) in let final void #t190 = self::ClassExtension|set#property(#t188, #t189) in #t189);
+  self::expect(n0, let final self::Class* #t191 = v in let final self::Number* #t192 = self::NumberExtension|-(self::ClassExtension|get#property(#t191), 1) in let final void #t193 = self::ClassExtension|set#property(#t191, #t192) in #t192);
+  self::expect(n0, let final self::Class* #t194 = v in let final self::Number* #t195 = self::ClassExtension|get#property(#t194) in let final self::Number* #t196 = let final self::Number* #t197 = self::NumberExtension|+(#t195, 1) in let final void #t198 = self::ClassExtension|set#property(#t194, #t197) in #t197 in #t195);
+  self::expect(n1, let final self::Class* #t199 = v in let final self::Number* #t200 = self::ClassExtension|get#property(#t199) in let final self::Number* #t201 = let final self::Number* #t202 = self::NumberExtension|-(#t200, 1) in let final void #t203 = self::ClassExtension|set#property(#t199, #t202) in #t202 in #t200);
+  self::expect(n0, self::ClassExtension|get#property(v));
+  self::expect(n0, self::ClassExtension|get#property(v));
+  let final self::Class* #t204 = v in self::ClassExtension|set#property(#t204, self::NumberExtension|+(self::ClassExtension|get#property(#t204), n1));
+  self::expect(n1, self::ClassExtension|get#property(v));
+  let final self::Class* #t205 = v in self::ClassExtension|set#property(#t205, self::NumberExtension|+(self::ClassExtension|get#property(#t205), n1));
+  self::expect(n2, self::ClassExtension|get#property(v));
+  let final self::Class* #t206 = v in self::ClassExtension|set#property(#t206, self::NumberExtension|-(self::ClassExtension|get#property(#t206), n2));
+  self::expect(n0, self::ClassExtension|get#property(v));
+  let final self::Class* #t207 = v in self::ClassExtension|set#property(#t207, self::NumberExtension|+(self::ClassExtension|get#property(#t207), n1));
+  self::expect(n1, self::ClassExtension|get#property(v));
+  let final self::Class* #t208 = v in self::ClassExtension|set#property(#t208, self::NumberExtension|-(self::ClassExtension|get#property(#t208), n1));
+  self::expect(n0, self::ClassExtension|get#property(v));
+  let final self::Class* #t209 = v in let final self::Number* #t210 = self::NumberExtension|+(self::ClassExtension|get#property(#t209), 1) in let final void #t211 = self::ClassExtension|set#property(#t209, #t210) in #t210;
+  self::expect(n1, self::ClassExtension|get#property(v));
+  let final self::Class* #t212 = v in let final self::Number* #t213 = self::NumberExtension|-(self::ClassExtension|get#property(#t212), 1) in let final void #t214 = self::ClassExtension|set#property(#t212, #t213) in #t213;
+  self::expect(n0, self::ClassExtension|get#property(v));
+  let final self::Class* #t215 = v in self::ClassExtension|set#property(#t215, self::NumberExtension|+(self::ClassExtension|get#property(#t215), 1));
+  self::expect(n1, self::ClassExtension|get#property(v));
+  let final self::Class* #t216 = v in self::ClassExtension|set#property(#t216, self::NumberExtension|-(self::ClassExtension|get#property(#t216), 1));
+  self::expect(n0, self::ClassExtension|get#property(v));
+}
+static method testExplicitIntProperties() → dynamic {
+  core::int* n0 = 0;
+  core::int* n1 = 1;
+  core::int* n2 = 2;
+  self::IntClass* v = new self::IntClass::•(n0);
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  self::expect(n1, let final self::IntClass* #t217 = v in let final core::int* #t218 = self::IntClassExtension|get#property(#t217).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t219 = self::IntClassExtension|set#property(#t217, #t218) in #t218);
+  self::expect(n2, let final self::IntClass* #t220 = v in let final core::int* #t221 = self::IntClassExtension|get#property(#t220).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t222 = self::IntClassExtension|set#property(#t220, #t221) in #t221);
+  self::expect(n0, let final self::IntClass* #t223 = v in let final core::int* #t224 = self::IntClassExtension|get#property(#t223).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t225 = self::IntClassExtension|set#property(#t223, #t224) in #t224);
+  self::expect(n1, let final self::IntClass* #t226 = v in let final core::int* #t227 = self::IntClassExtension|get#property(#t226).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t228 = self::IntClassExtension|set#property(#t226, #t227) in #t227);
+  self::expect(n0, let final self::IntClass* #t229 = v in let final core::int* #t230 = self::IntClassExtension|get#property(#t229).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t231 = self::IntClassExtension|set#property(#t229, #t230) in #t230);
+  self::expect(n1, let final self::IntClass* #t232 = v in let final core::int* #t233 = self::IntClassExtension|get#property(#t232).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t234 = self::IntClassExtension|set#property(#t232, #t233) in #t233);
+  self::expect(n0, let final self::IntClass* #t235 = v in let final core::int* #t236 = self::IntClassExtension|get#property(#t235).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t237 = self::IntClassExtension|set#property(#t235, #t236) in #t236);
+  self::expect(n0, let final self::IntClass* #t238 = v in let final core::int* #t239 = self::IntClassExtension|get#property(#t238) in let final core::int* #t240 = let final core::int* #t241 = #t239.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t242 = self::IntClassExtension|set#property(#t238, #t241) in #t241 in #t239);
+  self::expect(n1, let final self::IntClass* #t243 = v in let final core::int* #t244 = self::IntClassExtension|get#property(#t243) in let final core::int* #t245 = let final core::int* #t246 = #t244.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t247 = self::IntClassExtension|set#property(#t243, #t246) in #t246 in #t244);
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t248 = v in self::IntClassExtension|set#property(#t248, self::IntClassExtension|get#property(#t248).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t249 = v in self::IntClassExtension|set#property(#t249, self::IntClassExtension|get#property(#t249).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n2, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t250 = v in self::IntClassExtension|set#property(#t250, self::IntClassExtension|get#property(#t250).{core::num::-}(n2){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t251 = v in self::IntClassExtension|set#property(#t251, self::IntClassExtension|get#property(#t251).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t252 = v in self::IntClassExtension|set#property(#t252, self::IntClassExtension|get#property(#t252).{core::num::-}(n1){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t253 = v in let final core::int* #t254 = self::IntClassExtension|get#property(#t253).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t255 = self::IntClassExtension|set#property(#t253, #t254) in #t254;
+  self::expect(n1, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t256 = v in let final core::int* #t257 = self::IntClassExtension|get#property(#t256).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t258 = self::IntClassExtension|set#property(#t256, #t257) in #t257;
+  self::expect(n0, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t259 = v in self::IntClassExtension|set#property(#t259, self::IntClassExtension|get#property(#t259).{core::num::+}(1){(core::num*) →* core::int*});
+  self::expect(n1, self::IntClassExtension|get#property(v));
+  let final self::IntClass* #t260 = v in self::IntClassExtension|set#property(#t260, self::IntClassExtension|get#property(#t260).{core::num::-}(1){(core::num*) →* core::int*});
+  self::expect(n0, self::IntClassExtension|get#property(v));
+}
+static method testExplicitNullAwareProperties(self::Class* v) → dynamic {
+  self::Number* n0 = new self::Number::•(0);
+  self::Number* n1 = new self::Number::•(1);
+  self::Number* n2 = new self::Number::•(2);
+  self::expect(n0, let final self::Class* #t261 = v in #t261 == null ?{self::Number*} null : self::ClassExtension|get#property(#t261), v == null);
+  self::expect(n1, let final self::Class* #t262 = v in #t262 == null ?{self::Number*} null : let final self::Number* #t263 = self::NumberExtension|+(self::ClassExtension|get#property(#t262), n1) in let final void #t264 = self::ClassExtension|set#property(#t262, #t263) in #t263, v == null);
+  self::expect(n2, let final self::Class* #t265 = v in #t265 == null ?{self::Number*} null : let final self::Number* #t266 = self::NumberExtension|+(self::ClassExtension|get#property(#t265), n1) in let final void #t267 = self::ClassExtension|set#property(#t265, #t266) in #t266, v == null);
+  self::expect(n0, let final self::Class* #t268 = v in #t268 == null ?{self::Number*} null : let final self::Number* #t269 = self::NumberExtension|-(self::ClassExtension|get#property(#t268), n2) in let final void #t270 = self::ClassExtension|set#property(#t268, #t269) in #t269, v == null);
+  self::expect(n1, let final self::Class* #t271 = v in #t271 == null ?{self::Number*} null : let final self::Number* #t272 = self::NumberExtension|+(self::ClassExtension|get#property(#t271), n1) in let final void #t273 = self::ClassExtension|set#property(#t271, #t272) in #t272, v == null);
+  self::expect(n0, let final self::Class* #t274 = v in #t274 == null ?{self::Number*} null : let final self::Number* #t275 = self::NumberExtension|-(self::ClassExtension|get#property(#t274), n1) in let final void #t276 = self::ClassExtension|set#property(#t274, #t275) in #t275, v == null);
+  self::expect(n1, let final self::Class* #t277 = v in #t277 == null ?{self::Number*} null : let final self::Number* #t278 = self::NumberExtension|+(self::ClassExtension|get#property(#t277), 1) in let final void #t279 = self::ClassExtension|set#property(#t277, #t278) in #t278, v == null);
+  self::expect(n0, let final self::Class* #t280 = v in #t280 == null ?{self::Number*} null : let final self::Number* #t281 = self::NumberExtension|-(self::ClassExtension|get#property(#t280), 1) in let final void #t282 = self::ClassExtension|set#property(#t280, #t281) in #t281, v == null);
+  self::expect(n0, let final self::Class* #t283 = v in #t283 == null ?{self::Number*} null : let final self::Number* #t284 = self::ClassExtension|get#property(#t283) in let final self::Number* #t285 = let final self::Number* #t286 = self::NumberExtension|+(#t284, 1) in let final void #t287 = self::ClassExtension|set#property(#t283, #t286) in #t286 in #t284, v == null);
+  self::expect(n1, let final self::Class* #t288 = v in #t288 == null ?{self::Number*} null : let final self::Number* #t289 = self::ClassExtension|get#property(#t288) in let final self::Number* #t290 = let final self::Number* #t291 = self::NumberExtension|-(#t289, 1) in let final void #t292 = self::ClassExtension|set#property(#t288, #t291) in #t291 in #t289, v == null);
+  self::expect(n0, let final self::Class* #t293 = v in #t293 == null ?{self::Number*} null : self::ClassExtension|get#property(#t293), v == null);
+  self::expect(n0, let final self::Class* #t294 = v in #t294 == null ?{self::Number*} null : self::ClassExtension|get#property(#t294), v == null);
+  let final self::Class* #t295 = v in #t295 == null ?{self::Number*} null : self::ClassExtension|set#property(#t295, self::NumberExtension|+(self::ClassExtension|get#property(#t295), n1));
+  self::expect(n1, let final self::Class* #t296 = v in #t296 == null ?{self::Number*} null : self::ClassExtension|get#property(#t296), v == null);
+  let final self::Class* #t297 = v in #t297 == null ?{self::Number*} null : self::ClassExtension|set#property(#t297, self::NumberExtension|+(self::ClassExtension|get#property(#t297), n1));
+  self::expect(n2, let final self::Class* #t298 = v in #t298 == null ?{self::Number*} null : self::ClassExtension|get#property(#t298), v == null);
+  let final self::Class* #t299 = v in #t299 == null ?{self::Number*} null : self::ClassExtension|set#property(#t299, self::NumberExtension|-(self::ClassExtension|get#property(#t299), n2));
+  self::expect(n0, let final self::Class* #t300 = v in #t300 == null ?{self::Number*} null : self::ClassExtension|get#property(#t300), v == null);
+  let final self::Class* #t301 = v in #t301 == null ?{self::Number*} null : self::ClassExtension|set#property(#t301, self::NumberExtension|+(self::ClassExtension|get#property(#t301), n1));
+  self::expect(n1, let final self::Class* #t302 = v in #t302 == null ?{self::Number*} null : self::ClassExtension|get#property(#t302), v == null);
+  let final self::Class* #t303 = v in #t303 == null ?{self::Number*} null : self::ClassExtension|set#property(#t303, self::NumberExtension|-(self::ClassExtension|get#property(#t303), n1));
+  self::expect(n0, let final self::Class* #t304 = v in #t304 == null ?{self::Number*} null : self::ClassExtension|get#property(#t304), v == null);
+  let final self::Class* #t305 = v in #t305 == null ?{self::Number*} null : let final self::Number* #t306 = self::NumberExtension|+(self::ClassExtension|get#property(#t305), 1) in let final void #t307 = self::ClassExtension|set#property(#t305, #t306) in #t306;
+  self::expect(n1, let final self::Class* #t308 = v in #t308 == null ?{self::Number*} null : self::ClassExtension|get#property(#t308), v == null);
+  let final self::Class* #t309 = v in #t309 == null ?{self::Number*} null : let final self::Number* #t310 = self::NumberExtension|-(self::ClassExtension|get#property(#t309), 1) in let final void #t311 = self::ClassExtension|set#property(#t309, #t310) in #t310;
+  self::expect(n0, let final self::Class* #t312 = v in #t312 == null ?{self::Number*} null : self::ClassExtension|get#property(#t312), v == null);
+  let final self::Class* #t313 = v in #t313 == null ?{self::Number*} null : self::ClassExtension|set#property(#t313, self::NumberExtension|+(self::ClassExtension|get#property(#t313), 1));
+  self::expect(n1, let final self::Class* #t314 = v in #t314 == null ?{self::Number*} null : self::ClassExtension|get#property(#t314), v == null);
+  let final self::Class* #t315 = v in #t315 == null ?{self::Number*} null : self::ClassExtension|set#property(#t315, self::NumberExtension|-(self::ClassExtension|get#property(#t315), 1));
+  self::expect(n0, let final self::Class* #t316 = v in #t316 == null ?{self::Number*} null : self::ClassExtension|get#property(#t316), v == null);
+}
+static method testExplicitNullAwareIntProperties(self::IntClass* v) → dynamic {
+  core::int* n0 = 0;
+  core::int* n1 = 1;
+  core::int* n2 = 2;
+  self::expect(n0, let final self::IntClass* #t317 = v in #t317 == null ?{core::int*} null : self::IntClassExtension|get#property(#t317), v == null);
+  self::expect(n1, let final self::IntClass* #t318 = v in #t318 == null ?{core::int*} null : let final core::int* #t319 = self::IntClassExtension|get#property(#t318).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t320 = self::IntClassExtension|set#property(#t318, #t319) in #t319, v == null);
+  self::expect(n2, let final self::IntClass* #t321 = v in #t321 == null ?{core::int*} null : let final core::int* #t322 = self::IntClassExtension|get#property(#t321).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t323 = self::IntClassExtension|set#property(#t321, #t322) in #t322, v == null);
+  self::expect(n0, let final self::IntClass* #t324 = v in #t324 == null ?{core::int*} null : let final core::int* #t325 = self::IntClassExtension|get#property(#t324).{core::num::-}(n2){(core::num*) →* core::int*} in let final void #t326 = self::IntClassExtension|set#property(#t324, #t325) in #t325, v == null);
+  self::expect(n1, let final self::IntClass* #t327 = v in #t327 == null ?{core::int*} null : let final core::int* #t328 = self::IntClassExtension|get#property(#t327).{core::num::+}(n1){(core::num*) →* core::int*} in let final void #t329 = self::IntClassExtension|set#property(#t327, #t328) in #t328, v == null);
+  self::expect(n0, let final self::IntClass* #t330 = v in #t330 == null ?{core::int*} null : let final core::int* #t331 = self::IntClassExtension|get#property(#t330).{core::num::-}(n1){(core::num*) →* core::int*} in let final void #t332 = self::IntClassExtension|set#property(#t330, #t331) in #t331, v == null);
+  self::expect(n1, let final self::IntClass* #t333 = v in #t333 == null ?{core::int*} null : let final core::int* #t334 = self::IntClassExtension|get#property(#t333).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t335 = self::IntClassExtension|set#property(#t333, #t334) in #t334, v == null);
+  self::expect(n0, let final self::IntClass* #t336 = v in #t336 == null ?{core::int*} null : let final core::int* #t337 = self::IntClassExtension|get#property(#t336).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t338 = self::IntClassExtension|set#property(#t336, #t337) in #t337, v == null);
+  self::expect(n0, let final self::IntClass* #t339 = v in #t339 == null ?{core::int*} null : let final core::int* #t340 = self::IntClassExtension|get#property(#t339) in let final core::int* #t341 = let final core::int* #t342 = #t340.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t343 = self::IntClassExtension|set#property(#t339, #t342) in #t342 in #t340, v == null);
+  self::expect(n1, let final self::IntClass* #t344 = v in #t344 == null ?{core::int*} null : let final core::int* #t345 = self::IntClassExtension|get#property(#t344) in let final core::int* #t346 = let final core::int* #t347 = #t345.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t348 = self::IntClassExtension|set#property(#t344, #t347) in #t347 in #t345, v == null);
+  self::expect(n0, let final self::IntClass* #t349 = v in #t349 == null ?{core::int*} null : self::IntClassExtension|get#property(#t349), v == null);
+  self::expect(n0, let final self::IntClass* #t350 = v in #t350 == null ?{core::int*} null : self::IntClassExtension|get#property(#t350), v == null);
+  let final self::IntClass* #t351 = v in #t351 == null ?{core::int*} null : self::IntClassExtension|set#property(#t351, self::IntClassExtension|get#property(#t351).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n1, let final self::IntClass* #t352 = v in #t352 == null ?{core::int*} null : self::IntClassExtension|get#property(#t352), v == null);
+  let final self::IntClass* #t353 = v in #t353 == null ?{core::int*} null : self::IntClassExtension|set#property(#t353, self::IntClassExtension|get#property(#t353).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n2, let final self::IntClass* #t354 = v in #t354 == null ?{core::int*} null : self::IntClassExtension|get#property(#t354), v == null);
+  let final self::IntClass* #t355 = v in #t355 == null ?{core::int*} null : self::IntClassExtension|set#property(#t355, self::IntClassExtension|get#property(#t355).{core::num::-}(n2){(core::num*) →* core::int*});
+  self::expect(n0, let final self::IntClass* #t356 = v in #t356 == null ?{core::int*} null : self::IntClassExtension|get#property(#t356), v == null);
+  let final self::IntClass* #t357 = v in #t357 == null ?{core::int*} null : self::IntClassExtension|set#property(#t357, self::IntClassExtension|get#property(#t357).{core::num::+}(n1){(core::num*) →* core::int*});
+  self::expect(n1, let final self::IntClass* #t358 = v in #t358 == null ?{core::int*} null : self::IntClassExtension|get#property(#t358), v == null);
+  let final self::IntClass* #t359 = v in #t359 == null ?{core::int*} null : self::IntClassExtension|set#property(#t359, self::IntClassExtension|get#property(#t359).{core::num::-}(n1){(core::num*) →* core::int*});
+  self::expect(n0, let final self::IntClass* #t360 = v in #t360 == null ?{core::int*} null : self::IntClassExtension|get#property(#t360), v == null);
+  let final self::IntClass* #t361 = v in #t361 == null ?{core::int*} null : let final core::int* #t362 = self::IntClassExtension|get#property(#t361).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t363 = self::IntClassExtension|set#property(#t361, #t362) in #t362;
+  self::expect(n1, let final self::IntClass* #t364 = v in #t364 == null ?{core::int*} null : self::IntClassExtension|get#property(#t364), v == null);
+  let final self::IntClass* #t365 = v in #t365 == null ?{core::int*} null : let final core::int* #t366 = self::IntClassExtension|get#property(#t365).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t367 = self::IntClassExtension|set#property(#t365, #t366) in #t366;
+  self::expect(n0, let final self::IntClass* #t368 = v in #t368 == null ?{core::int*} null : self::IntClassExtension|get#property(#t368), v == null);
+  let final self::IntClass* #t369 = v in #t369 == null ?{core::int*} null : self::IntClassExtension|set#property(#t369, self::IntClassExtension|get#property(#t369).{core::num::+}(1){(core::num*) →* core::int*});
+  self::expect(n1, let final self::IntClass* #t370 = v in #t370 == null ?{core::int*} null : self::IntClassExtension|get#property(#t370), v == null);
+  let final self::IntClass* #t371 = v in #t371 == null ?{core::int*} null : self::IntClassExtension|set#property(#t371, self::IntClassExtension|get#property(#t371).{core::num::-}(1){(core::num*) →* core::int*});
+  self::expect(n0, let final self::IntClass* #t372 = v in #t372 == null ?{core::int*} null : self::IntClassExtension|get#property(#t372), v == null);
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C1]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic} core::bool*) {
+    expected = null;
+  }
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.modular.expect
new file mode 100644
index 0000000..101c651
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:6:11: Error: This extension member conflicts with Object member 'noSuchMethod'.
+//   int get noSuchMethod => 42;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
+//   int runtimeType() {}
+//       ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
+//   operator ==(other) => false;
+//            ^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:10:17: Error: This extension member conflicts with Object member 'toString'.
+//   static String toString() => 'Foo';
+//                 ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:7:12: Error: This extension member conflicts with Object member 'hashCode'.
+//   void set hashCode(int value) {}
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
+//  - 'Invocation' is from 'dart:core'.
+//   value = "".noSuchMethod;
+//              ^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
+//   "".hashCode = 42;
+//      ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
+//  - 'Type' is from 'dart:core'.
+//   value = "".runtimeType;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+  get noSuchMethod = self::Extension|get#noSuchMethod;
+  method runtimeType = self::Extension|runtimeType;
+  tearoff runtimeType = self::Extension|get#runtimeType;
+  operator == = self::Extension|==;
+  static method toString = self::Extension|toString;
+  set hashCode = self::Extension|set#hashCode;
+}
+static method Extension|get#noSuchMethod(lowered final core::String* #this) → core::int*
+  return 42;
+static method Extension|set#hashCode(lowered final core::String* #this, core::int* value) → void {}
+static method Extension|runtimeType(lowered final core::String* #this) → core::int* {}
+static method Extension|get#runtimeType(lowered final core::String* #this) → () →* core::int*
+  return () → core::int* => self::Extension|runtimeType(#this);
+static method Extension|==(lowered final core::String* #this, dynamic other) → dynamic
+  return false;
+static method Extension|toString() → core::String*
+  return "Foo";
+static method main() → dynamic {
+  core::int* value;
+  self::expect(true, "".{core::Object::noSuchMethod}{(core::Invocation*) →* dynamic} is core::Function*);
+  value = self::Extension|get#noSuchMethod("");
+  self::Extension|set#hashCode("", 42);
+  self::expect(true, "".{core::Object::runtimeType}{core::Type*} is core::Type*);
+  self::expect(true, self::Extension|get#runtimeType("") is core::Function*);
+  value = self::Extension|runtimeType("");
+  self::expect(true, "" =={core::String::==}{(core::Object*) →* core::bool*} "");
+  self::expect("Foo", self::Extension|toString());
+}
+static method errors() → dynamic {
+  core::int* value;
+  value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
+ - 'Invocation' is from 'dart:core'.
+  value = \"\".noSuchMethod;
+             ^" in "".{core::Object::noSuchMethod}{(core::Invocation*) →* dynamic} as{TypeError} core::int*;
+  invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
+  \"\".hashCode = 42;
+     ^^^^^^^^" in ""{<unresolved>}.hashCode = 42;
+  value = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
+ - 'Type' is from 'dart:core'.
+  value = \"\".runtimeType;
+             ^" in "".{core::Object::runtimeType}{core::Type*} as{TypeError} core::int*;
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/conflicts.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/conflicts.dart.weak.modular.expect
new file mode 100644
index 0000000..3373345
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/conflicts.dart.weak.modular.expect
@@ -0,0 +1,90 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/conflicts.dart:14:11: Error: 'DuplicateExtensionName' is already declared in this scope.
+// extension DuplicateExtensionName on Class2 {
+//           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/conflicts.dart:9:11: Context: Previous declaration of 'DuplicateExtensionName'.
+// extension DuplicateExtensionName on Class1 {
+//           ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflicts.dart:21:3: Error: 'duplicateMethodName1' is already declared in this scope.
+//   duplicateMethodName1() => 2;
+//   ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/conflicts.dart:20:3: Context: Previous declaration of 'duplicateMethodName1'.
+//   duplicateMethodName1() => 1;
+//   ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflicts.dart:31:6: Error: The method 'uniqueMethod2' isn't defined for the class 'Class2'.
+//  - 'Class2' is from 'pkg/front_end/testcases/extensions/conflicts.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'uniqueMethod2'.
+//   c2.uniqueMethod2();
+//      ^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension DuplicateExtensionName on self::Class1* {
+  method uniqueMethod1 = self::DuplicateExtensionName|uniqueMethod1;
+  tearoff uniqueMethod1 = self::DuplicateExtensionName|get#uniqueMethod1;
+  method duplicateMethodName2 = self::DuplicateExtensionName|duplicateMethodName2;
+  tearoff duplicateMethodName2 = self::DuplicateExtensionName|get#duplicateMethodName2;
+}
+extension UniqueExtensionName on self::Class1* {
+  method duplicateMethodName1 = self::UniqueExtensionName|duplicateMethodName1;
+  tearoff duplicateMethodName1 = self::UniqueExtensionName|get#duplicateMethodName1;
+}
+static method DuplicateExtensionName|uniqueMethod1(lowered final self::Class1* #this) → dynamic {}
+static method DuplicateExtensionName|get#uniqueMethod1(lowered final self::Class1* #this) → () →* dynamic
+  return () → dynamic => self::DuplicateExtensionName|uniqueMethod1(#this);
+static method DuplicateExtensionName|duplicateMethodName2(lowered final self::Class1* #this) → dynamic
+  return 1;
+static method DuplicateExtensionName|get#duplicateMethodName2(lowered final self::Class1* #this) → () →* dynamic
+  return () → dynamic => self::DuplicateExtensionName|duplicateMethodName2(#this);
+static method UniqueExtensionName|duplicateMethodName1(lowered final self::Class1* #this) → dynamic
+  return 1;
+static method UniqueExtensionName|get#duplicateMethodName1(lowered final self::Class1* #this) → () →* dynamic
+  return () → dynamic => self::UniqueExtensionName|duplicateMethodName1(#this);
+static method main() → dynamic {
+  self::Class1* c1 = new self::Class1::•();
+  self::DuplicateExtensionName|uniqueMethod1(c1);
+}
+static method errors() → dynamic {
+  self::Class2* c2 = new self::Class2::•();
+  invalid-expression "pkg/front_end/testcases/extensions/conflicts.dart:31:6: Error: The method 'uniqueMethod2' isn't defined for the class 'Class2'.
+ - 'Class2' is from 'pkg/front_end/testcases/extensions/conflicts.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'uniqueMethod2'.
+  c2.uniqueMethod2();
+     ^^^^^^^^^^^^^" in c2{<unresolved>}.uniqueMethod2();
+}
diff --git a/pkg/front_end/testcases/extensions/default_values.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..99dd7ec
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/default_values.dart.weak.modular.expect
@@ -0,0 +1,75 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  method method0 = self::Extension|method0;
+  tearoff method0 = self::Extension|get#method0;
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+  method method2 = self::Extension|method2;
+  tearoff method2 = self::Extension|get#method2;
+  method method3 = self::Extension|method3;
+  tearoff method3 = self::Extension|get#method3;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static method Extension|method0(lowered final self::Class* #this, [dynamic a = #C1]) → dynamic
+  return a;
+static method Extension|get#method0(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+  return ([dynamic a = #C1]) → dynamic => self::Extension|method0(#this, a);
+static method Extension|method1(lowered final self::Class* #this, [dynamic a = #C2]) → dynamic
+  return a;
+static method Extension|get#method1(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+  return ([dynamic a = #C2]) → dynamic => self::Extension|method1(#this, a);
+static method Extension|method2(lowered final self::Class* #this, {dynamic b = #C3}) → dynamic
+  return b;
+static method Extension|get#method2(lowered final self::Class* #this) → ({b: dynamic}) →* dynamic
+  return ({dynamic b = #C3}) → dynamic => self::Extension|method2(#this, b: b);
+static method Extension|method3(lowered final self::Class* #this, {dynamic c = #C4}) → dynamic
+  return c{dynamic}.call();
+static method Extension|get#method3(lowered final self::Class* #this) → ({c: dynamic}) →* dynamic
+  return ({dynamic c = #C4}) → dynamic => self::Extension|method3(#this, c: c);
+static method Extension|staticMethod() → dynamic
+  return 123;
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  ([dynamic]) →* dynamic tearOff0 = self::Extension|get#method0(c);
+  self::expect(0, tearOff0(0){([dynamic]) →* dynamic});
+  self::expect(null, tearOff0(){([dynamic]) →* dynamic});
+  ([dynamic]) →* dynamic tearOff1 = self::Extension|get#method1(c);
+  self::expect(0, tearOff1(0){([dynamic]) →* dynamic});
+  self::expect(42, tearOff1(){([dynamic]) →* dynamic});
+  ({b: dynamic}) →* dynamic tearOff2 = self::Extension|get#method2(c);
+  self::expect(0, tearOff2(b: 0){({b: dynamic}) →* dynamic});
+  self::expect(87, tearOff2(){({b: dynamic}) →* dynamic});
+  ({c: dynamic}) →* dynamic tearOff3 = self::Extension|get#method3(c);
+  self::expect(0, tearOff3(c: () → core::int* => 0){({c: dynamic}) →* dynamic});
+  self::expect(123, tearOff3(){({c: dynamic}) →* dynamic});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = null
+  #C2 = 42
+  #C3 = 87
+  #C4 = static-tearoff self::Extension|staticMethod
+}
diff --git a/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.modular.expect
new file mode 100644
index 0000000..a3e0d9a
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_explicit_access.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/deferred_explicit_access.dart:5:1: Error: Extension 'Extension' cannot be imported through a deferred import.
+// Try adding the `hide Extension` to the import.
+// import 'deferred_explicit_access_lib.dart' deferred as prefix;
+// ^
+//
+import self as self;
+import "deferred_explicit_access_lib.dart" as def;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix;
+
+static method main() → dynamic async {
+  await LoadLibrary(prefix);
+  self::expect(0, let final dynamic #t1 = CheckLibraryIsLoaded(prefix) in def::Extension|staticField);
+  self::expect(0, let final dynamic #t2 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(0));
+  self::expect(42, let final dynamic #t3 = CheckLibraryIsLoaded(prefix) in let final core::int* #t4 = 0 in let final core::int* #t5 = 42 in let final void #t6 = def::Extension|set#property(#t4, #t5) in #t5);
+  self::expect(84, let final dynamic #t7 = CheckLibraryIsLoaded(prefix) in def::Extension|get#property(42));
+  self::expect(85, let final dynamic #t8 = CheckLibraryIsLoaded(prefix) in def::Extension|method(43));
+  self::expect(42, let final dynamic #t9 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty);
+  self::expect(87, let final dynamic #t10 = CheckLibraryIsLoaded(prefix) in def::Extension|staticProperty = 87);
+  self::expect(87, let final dynamic #t11 = CheckLibraryIsLoaded(prefix) in def::Extension|staticMethod());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  static field staticField = def::Extension|staticField;
+  static get staticProperty = get def::Extension|staticProperty;
+  static method staticMethod = def::Extension|staticMethod;
+  get property = def::Extension|get#property;
+  method method = def::Extension|method;
+  tearoff method = def::Extension|get#method;
+  static set staticProperty = set def::Extension|staticProperty;
+  set property = def::Extension|set#property;
+}
+static field core::int* Extension|staticField = 0;
+static field core::int* topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int*
+  return def::Extension|staticField;
+static set Extension|staticProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|staticMethod() → core::int*
+  return def::Extension|staticField;
+static method Extension|get#property(lowered final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
+static method Extension|set#property(lowered final core::int* #this, core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|method(lowered final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
+static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
+  return () → core::int* => def::Extension|method(#this);
+static get topLevelProperty() → core::int*
+  return def::Extension|staticField;
+static set topLevelProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method topLevelMethod() → dynamic
+  return def::Extension|staticField;
diff --git a/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.modular.expect
new file mode 100644
index 0000000..ddd41d6
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/deferred_import_hidden.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "deferred_explicit_access_lib.dart" as def;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///deferred_explicit_access_lib.dart" deferred as prefix hide Extension;
+
+static method main() → dynamic async {
+  await LoadLibrary(prefix);
+  self::expect(0, let final dynamic #t1 = CheckLibraryIsLoaded(prefix) in def::topLevelField);
+  self::expect(42, let final dynamic #t2 = CheckLibraryIsLoaded(prefix) in def::topLevelField = 42);
+  self::expect(42, let final dynamic #t3 = CheckLibraryIsLoaded(prefix) in def::topLevelField);
+  self::expect(0, let final dynamic #t4 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty);
+  self::expect(87, let final dynamic #t5 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty = 87);
+  self::expect(87, let final dynamic #t6 = CheckLibraryIsLoaded(prefix) in def::topLevelProperty);
+  self::expect(87, let final dynamic #t7 = CheckLibraryIsLoaded(prefix) in def::topLevelMethod());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+extension Extension on core::int* {
+  static field staticField = def::Extension|staticField;
+  static get staticProperty = get def::Extension|staticProperty;
+  static method staticMethod = def::Extension|staticMethod;
+  get property = def::Extension|get#property;
+  method method = def::Extension|method;
+  tearoff method = def::Extension|get#method;
+  static set staticProperty = set def::Extension|staticProperty;
+  set property = def::Extension|set#property;
+}
+static field core::int* Extension|staticField = 0;
+static field core::int* topLevelField = def::Extension|staticField;
+static get Extension|staticProperty() → core::int*
+  return def::Extension|staticField;
+static set Extension|staticProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|staticMethod() → core::int*
+  return def::Extension|staticField;
+static method Extension|get#property(lowered final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
+static method Extension|set#property(lowered final core::int* #this, core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method Extension|method(lowered final core::int* #this) → core::int*
+  return #this.{core::num::+}(def::Extension|staticField){(core::num*) →* core::int*};
+static method Extension|get#method(lowered final core::int* #this) → () →* core::int*
+  return () → core::int* => def::Extension|method(#this);
+static get topLevelProperty() → core::int*
+  return def::Extension|staticField;
+static set topLevelProperty(core::int* value) → void {
+  def::Extension|staticField = value;
+}
+static method topLevelMethod() → dynamic
+  return def::Extension|staticField;
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.modular.expect
new file mode 100644
index 0000000..d892e0f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.weak.modular.expect
@@ -0,0 +1,297 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::GenericClass::T* field = null;
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  method readGetter = self::Extension|readGetter;
+  tearoff readGetter = self::Extension|get#readGetter;
+  method writeSetterRequired = self::Extension|writeSetterRequired;
+  tearoff writeSetterRequired = self::Extension|get#writeSetterRequired;
+  method writeSetterOptional = self::Extension|writeSetterOptional;
+  tearoff writeSetterOptional = self::Extension|get#writeSetterOptional;
+  method writeSetterNamed = self::Extension|writeSetterNamed;
+  tearoff writeSetterNamed = self::Extension|get#writeSetterNamed;
+  get tearOffGetterNoArgs = self::Extension|get#tearOffGetterNoArgs;
+  get tearOffGetterRequired = self::Extension|get#tearOffGetterRequired;
+  get tearOffGetterOptional = self::Extension|get#tearOffGetterOptional;
+  get tearOffGetterNamed = self::Extension|get#tearOffGetterNamed;
+  get property = self::Extension|get#property;
+  method invocations = self::Extension|invocations;
+  tearoff invocations = self::Extension|get#invocations;
+  method tearOffs = self::Extension|tearOffs;
+  tearoff tearOffs = self::Extension|get#tearOffs;
+  method getterCalls = self::Extension|getterCalls;
+  tearoff getterCalls = self::Extension|get#getterCalls;
+  set property = self::Extension|set#property;
+}
+extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+  method readGetter = self::GenericExtension|readGetter;
+  tearoff readGetter = self::GenericExtension|get#readGetter;
+  method writeSetterRequired = self::GenericExtension|writeSetterRequired;
+  tearoff writeSetterRequired = self::GenericExtension|get#writeSetterRequired;
+  method writeSetterOptional = self::GenericExtension|writeSetterOptional;
+  tearoff writeSetterOptional = self::GenericExtension|get#writeSetterOptional;
+  method writeSetterNamed = self::GenericExtension|writeSetterNamed;
+  tearoff writeSetterNamed = self::GenericExtension|get#writeSetterNamed;
+  method genericWriteSetterRequired = self::GenericExtension|genericWriteSetterRequired;
+  tearoff genericWriteSetterRequired = self::GenericExtension|get#genericWriteSetterRequired;
+  method genericWriteSetterOptional = self::GenericExtension|genericWriteSetterOptional;
+  tearoff genericWriteSetterOptional = self::GenericExtension|get#genericWriteSetterOptional;
+  method genericWriteSetterNamed = self::GenericExtension|genericWriteSetterNamed;
+  tearoff genericWriteSetterNamed = self::GenericExtension|get#genericWriteSetterNamed;
+  get property = self::GenericExtension|get#property;
+  get tearOffGetterNoArgs = self::GenericExtension|get#tearOffGetterNoArgs;
+  get tearOffGetterRequired = self::GenericExtension|get#tearOffGetterRequired;
+  get tearOffGetterOptional = self::GenericExtension|get#tearOffGetterOptional;
+  get tearOffGetterNamed = self::GenericExtension|get#tearOffGetterNamed;
+  get tearOffGetterGenericRequired = self::GenericExtension|get#tearOffGetterGenericRequired;
+  get tearOffGetterGenericOptional = self::GenericExtension|get#tearOffGetterGenericOptional;
+  get tearOffGetterGenericNamed = self::GenericExtension|get#tearOffGetterGenericNamed;
+  method invocations = self::GenericExtension|invocations;
+  tearoff invocations = self::GenericExtension|get#invocations;
+  method tearOffs = self::GenericExtension|tearOffs;
+  tearoff tearOffs = self::GenericExtension|get#tearOffs;
+  method getterCalls = self::GenericExtension|getterCalls;
+  tearoff getterCalls = self::GenericExtension|get#getterCalls;
+  set property = self::GenericExtension|set#property;
+}
+static method Extension|get#readGetter(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|readGetter(#this);
+static method Extension|readGetter(lowered final self::Class* #this) → dynamic {
+  return self::Extension|get#property(#this);
+}
+static method Extension|writeSetterRequired(lowered final self::Class* #this, dynamic value) → dynamic {
+  self::Extension|set#property(#this, value);
+}
+static method Extension|get#writeSetterRequired(lowered final self::Class* #this) → (dynamic) →* dynamic
+  return (dynamic value) → dynamic => self::Extension|writeSetterRequired(#this, value);
+static method Extension|writeSetterOptional(lowered final self::Class* #this, [dynamic value = #C1]) → dynamic {
+  self::Extension|set#property(#this, value);
+}
+static method Extension|get#writeSetterOptional(lowered final self::Class* #this) → ([dynamic]) →* dynamic
+  return ([dynamic value = #C1]) → dynamic => self::Extension|writeSetterOptional(#this, value);
+static method Extension|writeSetterNamed(lowered final self::Class* #this, {dynamic value = #C1}) → dynamic {
+  self::Extension|set#property(#this, value);
+}
+static method Extension|get#writeSetterNamed(lowered final self::Class* #this) → ({value: dynamic}) →* dynamic
+  return ({dynamic value = #C1}) → dynamic => self::Extension|writeSetterNamed(#this, value: value);
+static method Extension|get#tearOffGetterNoArgs(lowered final self::Class* #this) → dynamic
+  return self::Extension|get#readGetter(#this);
+static method Extension|get#tearOffGetterRequired(lowered final self::Class* #this) → dynamic
+  return self::Extension|get#writeSetterRequired(#this);
+static method Extension|get#tearOffGetterOptional(lowered final self::Class* #this) → dynamic
+  return self::Extension|get#writeSetterOptional(#this);
+static method Extension|get#tearOffGetterNamed(lowered final self::Class* #this) → dynamic
+  return self::Extension|get#writeSetterNamed(#this);
+static method Extension|get#property(lowered final self::Class* #this) → dynamic
+  return #this.{self::Class::field}{dynamic};
+static method Extension|set#property(lowered final self::Class* #this, dynamic value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|invocations(lowered final self::Class* #this, dynamic value) → dynamic {
+  self::Extension|readGetter(#this);
+  self::Extension|writeSetterRequired(#this, value);
+  self::Extension|writeSetterOptional(#this);
+  self::Extension|writeSetterOptional(#this, value);
+  self::Extension|writeSetterNamed(#this);
+  self::Extension|writeSetterNamed(#this, value: value);
+}
+static method Extension|get#invocations(lowered final self::Class* #this) → (dynamic) →* dynamic
+  return (dynamic value) → dynamic => self::Extension|invocations(#this, value);
+static method Extension|get#tearOffs(lowered final self::Class* #this) → (dynamic) →* dynamic
+  return (dynamic value) → dynamic => self::Extension|tearOffs(#this, value);
+static method Extension|tearOffs(lowered final self::Class* #this, dynamic value) → dynamic {
+  () →* dynamic tearOffNoArgs = self::Extension|get#readGetter(#this);
+  tearOffNoArgs(){() →* dynamic};
+  (dynamic) →* dynamic tearOffRequired = self::Extension|get#writeSetterRequired(#this);
+  tearOffRequired(value){(dynamic) →* dynamic};
+  ([dynamic]) →* dynamic tearOffOptional = self::Extension|get#writeSetterOptional(#this);
+  tearOffOptional(){([dynamic]) →* dynamic};
+  tearOffOptional(value){([dynamic]) →* dynamic};
+  ({value: dynamic}) →* dynamic tearOffNamed = self::Extension|get#writeSetterNamed(#this);
+  tearOffNamed(){({value: dynamic}) →* dynamic};
+  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
+}
+static method Extension|getterCalls(lowered final self::Class* #this, dynamic value) → dynamic {
+  self::Extension|get#tearOffGetterNoArgs(#this){dynamic}.call();
+  self::Extension|get#tearOffGetterRequired(#this){dynamic}.call(value);
+  self::Extension|get#tearOffGetterOptional(#this){dynamic}.call();
+  self::Extension|get#tearOffGetterOptional(#this){dynamic}.call(value);
+  self::Extension|get#tearOffGetterNamed(#this){dynamic}.call();
+  self::Extension|get#tearOffGetterNamed(#this){dynamic}.call(value: value);
+}
+static method Extension|get#getterCalls(lowered final self::Class* #this) → (dynamic) →* dynamic
+  return (dynamic value) → dynamic => self::Extension|getterCalls(#this, value);
+static method GenericExtension|readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|readGetter::T*>* #this) → self::GenericExtension|readGetter::T* {
+  return self::GenericExtension|get#property<self::GenericExtension|readGetter::T*>(#this);
+}
+static method GenericExtension|get#readGetter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#readGetter::T*>* #this) → () →* self::GenericExtension|get#readGetter::T*
+  return () → self::GenericExtension|get#readGetter::T* => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T*>(#this);
+static method GenericExtension|writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterRequired::T*>* #this, self::GenericExtension|writeSetterRequired::T* value) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterRequired::T*>(#this, value);
+}
+static method GenericExtension|get#writeSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T*>* #this) → (self::GenericExtension|get#writeSetterRequired::T*) →* dynamic
+  return (self::GenericExtension|get#writeSetterRequired::T* value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T*>(#this, value);
+static method GenericExtension|writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterOptional::T*>* #this, [self::GenericExtension|writeSetterOptional::T* value = #C1]) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterOptional::T*>(#this, value);
+}
+static method GenericExtension|get#writeSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T*>* #this) → ([self::GenericExtension|get#writeSetterOptional::T*]) →* dynamic
+  return ([self::GenericExtension|get#writeSetterOptional::T* value = #C1]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T*>(#this, value);
+static method GenericExtension|writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|writeSetterNamed::T*>* #this, {self::GenericExtension|writeSetterNamed::T* value = #C1}) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|writeSetterNamed::T*>(#this, value);
+}
+static method GenericExtension|get#writeSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T*>* #this) → ({value: self::GenericExtension|get#writeSetterNamed::T*}) →* dynamic
+  return ({self::GenericExtension|get#writeSetterNamed::T* value = #C1}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T*>(#this, value: value);
+static method GenericExtension|genericWriteSetterRequired<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T*>* #this, self::GenericExtension|genericWriteSetterRequired::S* value) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterRequired::T*>(#this, value);
+}
+static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S*) →* dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S* value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T*, S*>(#this, value);
+static method GenericExtension|genericWriteSetterOptional<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterOptional::T*>(#this, value);
+}
+static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S*]) →* dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S* value = #C1]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T*, S*>(#this, value);
+static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({value: S*}) →* dynamic
+  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({S* value = #C1}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T*, S*>(#this, value: value);
+static method GenericExtension|genericWriteSetterNamed<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
+  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterNamed::T*>(#this, value);
+}
+static method GenericExtension|get#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
+  return #this.{self::GenericClass::field}{self::GenericExtension|get#property::T*};
+static method GenericExtension|set#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void {
+  #this.{self::GenericClass::field} = value;
+}
+static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
+  return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T*>(#this);
+static method GenericExtension|get#tearOffGetterRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T*>* #this) → dynamic
+  return self::GenericExtension|get#writeSetterRequired<self::GenericExtension|get#tearOffGetterRequired::T*>(#this);
+static method GenericExtension|get#tearOffGetterOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T*>* #this) → dynamic
+  return self::GenericExtension|get#writeSetterOptional<self::GenericExtension|get#tearOffGetterOptional::T*>(#this);
+static method GenericExtension|get#tearOffGetterNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T*>* #this) → dynamic
+  return self::GenericExtension|get#writeSetterNamed<self::GenericExtension|get#tearOffGetterNamed::T*>(#this);
+static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T*>* #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|get#tearOffGetterGenericRequired::T*>(#this);
+static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T*>* #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|get#tearOffGetterGenericOptional::T*>(#this);
+static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T*>* #this) → dynamic
+  return self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|get#tearOffGetterGenericNamed::T*>(#this);
+static method GenericExtension|invocations<T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|invocations::T*>* #this, self::GenericExtension|invocations::S* value) → dynamic {
+  self::GenericExtension|readGetter<self::GenericExtension|invocations::T*>(#this);
+  self::GenericExtension|writeSetterRequired<self::GenericExtension|invocations::T*>(#this, value);
+  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this);
+  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this, value);
+  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this);
+  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this, value: value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
+  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
+  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value: value);
+  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
+}
+static method GenericExtension|get#invocations<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#invocations::T*>* #this) → <S extends self::GenericExtension|get#invocations::T* = dynamic>(S*) →* dynamic
+  return <S extends self::GenericExtension|get#invocations::T* = dynamic>(S* value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T*, S*>(#this, value);
+static method GenericExtension|tearOffs<T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|tearOffs::T*>* #this, self::GenericExtension|tearOffs::S* value) → dynamic {
+  () →* self::GenericExtension|tearOffs::T* tearOffNoArgs = self::GenericExtension|get#readGetter<self::GenericExtension|tearOffs::T*>(#this);
+  tearOffNoArgs(){() →* self::GenericExtension|tearOffs::T*};
+  (self::GenericExtension|tearOffs::T*) →* dynamic tearOffRequired = self::GenericExtension|get#writeSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
+  tearOffRequired(value){(self::GenericExtension|tearOffs::T*) →* dynamic};
+  ([self::GenericExtension|tearOffs::T*]) →* dynamic tearOffOptional = self::GenericExtension|get#writeSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
+  tearOffOptional(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
+  tearOffOptional(value){([self::GenericExtension|tearOffs::T*]) →* dynamic};
+  ({value: self::GenericExtension|tearOffs::T*}) →* dynamic tearOffNamed = self::GenericExtension|get#writeSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
+  tearOffNamed(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
+  tearOffNamed(value: value){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
+  <S extends self::GenericExtension|tearOffs::T* = dynamic>(S*) →* dynamic genericTearOffRequired = self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
+  genericTearOffRequired<self::GenericExtension|tearOffs::S*>(value){(self::GenericExtension|tearOffs::S*) →* dynamic};
+  genericTearOffRequired<self::GenericExtension|tearOffs::T*>(value){(self::GenericExtension|tearOffs::T*) →* dynamic};
+  genericTearOffRequired<self::GenericExtension|tearOffs::S*>(value){(self::GenericExtension|tearOffs::S*) →* dynamic};
+  <S extends self::GenericExtension|tearOffs::T* = dynamic>([S*]) →* dynamic genericTearOffOptional = self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
+  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(){([self::GenericExtension|tearOffs::T*]) →* dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(){([self::GenericExtension|tearOffs::S*]) →* dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(value){([self::GenericExtension|tearOffs::S*]) →* dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::T*>(value){([self::GenericExtension|tearOffs::T*]) →* dynamic};
+  genericTearOffOptional<self::GenericExtension|tearOffs::S*>(value){([self::GenericExtension|tearOffs::S*]) →* dynamic};
+  <S extends self::GenericExtension|tearOffs::T* = dynamic>({value: S*}) →* dynamic genericTearOffNamed = self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
+  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(value: value){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::T*>(value: value){({value: self::GenericExtension|tearOffs::T*}) →* dynamic};
+  genericTearOffNamed<self::GenericExtension|tearOffs::S*>(value: value){({value: self::GenericExtension|tearOffs::S*}) →* dynamic};
+}
+static method GenericExtension|get#tearOffs<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#tearOffs::T*>* #this) → <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S*) →* dynamic
+  return <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S* value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T*, S*>(#this, value);
+static method GenericExtension|getterCalls<T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::T* = dynamic>(lowered final self::GenericClass<self::GenericExtension|getterCalls::T*>* #this, self::GenericExtension|getterCalls::S* value) → dynamic {
+  self::GenericExtension|get#tearOffGetterNoArgs<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value: value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value);
+  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>();
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value);
+  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>();
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call(value: value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::T*>(value: value);
+  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this){dynamic}.call<self::GenericExtension|getterCalls::S*>(value: value);
+}
+static method GenericExtension|get#getterCalls<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#getterCalls::T*>* #this) → <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S*) →* dynamic
+  return <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S* value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T*, S*>(#this, value);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.modular.expect
new file mode 100644
index 0000000..942973c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.weak.modular.expect
@@ -0,0 +1,242 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic field = null;
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+  static get property = get self::Extension|property;
+  static field field = self::Extension|field;
+  static method readGetter = self::Extension|readGetter;
+  static method writeSetterRequired = self::Extension|writeSetterRequired;
+  static method writeSetterOptional = self::Extension|writeSetterOptional;
+  static method writeSetterNamed = self::Extension|writeSetterNamed;
+  static method genericWriteSetterRequired = self::Extension|genericWriteSetterRequired;
+  static method genericWriteSetterOptional = self::Extension|genericWriteSetterOptional;
+  static method genericWriteSetterNamed = self::Extension|genericWriteSetterNamed;
+  static get tearOffGetterNoArgs = get self::Extension|tearOffGetterNoArgs;
+  static get tearOffGetterRequired = get self::Extension|tearOffGetterRequired;
+  static get tearOffGetterOptional = get self::Extension|tearOffGetterOptional;
+  static get tearOffGetterNamed = get self::Extension|tearOffGetterNamed;
+  static get tearOffGetterGenericRequired = get self::Extension|tearOffGetterGenericRequired;
+  static get tearOffGetterGenericOptional = get self::Extension|tearOffGetterGenericOptional;
+  static get tearOffGetterGenericNamed = get self::Extension|tearOffGetterGenericNamed;
+  static method invocationsFromStaticContext = self::Extension|invocationsFromStaticContext;
+  static method tearOffsFromStaticContext = self::Extension|tearOffsFromStaticContext;
+  static method fieldAccessFromStaticContext = self::Extension|fieldAccessFromStaticContext;
+  static method getterCallsFromStaticContext = self::Extension|getterCallsFromStaticContext;
+  method invocationsFromInstanceContext = self::Extension|invocationsFromInstanceContext;
+  tearoff invocationsFromInstanceContext = self::Extension|get#invocationsFromInstanceContext;
+  method tearOffsFromInstanceContext = self::Extension|tearOffsFromInstanceContext;
+  tearoff tearOffsFromInstanceContext = self::Extension|get#tearOffsFromInstanceContext;
+  method fieldAccessFromInstanceContext = self::Extension|fieldAccessFromInstanceContext;
+  tearoff fieldAccessFromInstanceContext = self::Extension|get#fieldAccessFromInstanceContext;
+  method getterCallsFromInstanceContext = self::Extension|getterCallsFromInstanceContext;
+  tearoff getterCallsFromInstanceContext = self::Extension|get#getterCallsFromInstanceContext;
+  static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static get Extension|property() → dynamic
+  return self::Class::field;
+static set Extension|property(dynamic value) → void {
+  self::Class::field = value;
+}
+static method Extension|readGetter() → dynamic {
+  return self::Extension|property;
+}
+static method Extension|writeSetterRequired(dynamic value) → dynamic {
+  self::Extension|property = value;
+}
+static method Extension|writeSetterOptional([dynamic value = #C1]) → dynamic {
+  self::Extension|property = value;
+}
+static method Extension|writeSetterNamed({dynamic value = #C1}) → dynamic {
+  self::Extension|property = value;
+}
+static method Extension|genericWriteSetterRequired<S extends core::Object* = dynamic>(self::Extension|genericWriteSetterRequired::S* value) → dynamic {
+  self::Extension|property = value;
+}
+static method Extension|genericWriteSetterOptional<S extends core::Object* = dynamic>([self::Extension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
+  self::Extension|property = value;
+}
+static method Extension|genericWriteSetterNamed<S extends core::Object* = dynamic>({self::Extension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
+  self::Extension|property = value;
+}
+static get Extension|tearOffGetterNoArgs() → dynamic
+  return #C2;
+static get Extension|tearOffGetterRequired() → dynamic
+  return #C3;
+static get Extension|tearOffGetterOptional() → dynamic
+  return #C4;
+static get Extension|tearOffGetterNamed() → dynamic
+  return #C5;
+static get Extension|tearOffGetterGenericRequired() → dynamic
+  return #C6;
+static get Extension|tearOffGetterGenericOptional() → dynamic
+  return #C7;
+static get Extension|tearOffGetterGenericNamed() → dynamic
+  return #C8;
+static method Extension|invocationsFromStaticContext(core::int* value) → dynamic {
+  self::Extension|readGetter();
+  self::Extension|writeSetterRequired(value);
+  self::Extension|writeSetterOptional();
+  self::Extension|writeSetterOptional(value);
+  self::Extension|writeSetterNamed();
+  self::Extension|writeSetterNamed(value: value);
+  self::Extension|genericWriteSetterRequired<core::int*>(value);
+  self::Extension|genericWriteSetterRequired<core::int*>(value);
+  self::Extension|genericWriteSetterOptional<dynamic>();
+  self::Extension|genericWriteSetterOptional<core::int*>();
+  self::Extension|genericWriteSetterOptional<core::int*>(value);
+  self::Extension|genericWriteSetterOptional<core::int*>(value);
+  self::Extension|genericWriteSetterNamed<dynamic>();
+  self::Extension|genericWriteSetterNamed<core::int*>();
+  self::Extension|genericWriteSetterNamed<core::int*>(value: value);
+  self::Extension|genericWriteSetterNamed<core::int*>(value: value);
+}
+static method Extension|tearOffsFromStaticContext(core::int* value) → dynamic {
+  () →* dynamic tearOffNoArgs = #C2;
+  tearOffNoArgs(){() →* dynamic};
+  (dynamic) →* dynamic tearOffRequired = #C3;
+  tearOffRequired(value){(dynamic) →* dynamic};
+  ([dynamic]) →* dynamic tearOffOptional = #C4;
+  tearOffOptional(){([dynamic]) →* dynamic};
+  tearOffOptional(value){([dynamic]) →* dynamic};
+  ({value: dynamic}) →* dynamic tearOffNamed = #C5;
+  tearOffNamed(){({value: dynamic}) →* dynamic};
+  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
+  <S extends core::Object* = dynamic>(S*) →* dynamic tearOffGenericRequired = #C6;
+  tearOffGenericRequired<core::int*>(value){(core::int*) →* dynamic};
+  tearOffGenericRequired<core::int*>(value){(core::int*) →* dynamic};
+  <S extends core::Object* = dynamic>([S*]) →* dynamic tearOffGenericOptional = #C7;
+  tearOffGenericOptional<dynamic>(){([dynamic]) →* dynamic};
+  tearOffGenericOptional<core::int*>(){([core::int*]) →* dynamic};
+  tearOffGenericOptional<core::int*>(value){([core::int*]) →* dynamic};
+  tearOffGenericOptional<core::int*>(value){([core::int*]) →* dynamic};
+  <S extends core::Object* = dynamic>({value: S*}) →* dynamic tearOffGenericNamed = #C8;
+  tearOffGenericNamed<dynamic>(){({value: dynamic}) →* dynamic};
+  tearOffGenericNamed<core::int*>(){({value: core::int*}) →* dynamic};
+  tearOffGenericNamed<core::int*>(value: value){({value: core::int*}) →* dynamic};
+  tearOffGenericNamed<core::int*>(value: value){({value: core::int*}) →* dynamic};
+}
+static method Extension|fieldAccessFromStaticContext() → dynamic {
+  self::Extension|field = self::Extension|property;
+  self::Extension|property = self::Extension|field;
+}
+static method Extension|getterCallsFromStaticContext(core::int* value) → dynamic {
+  self::Extension|tearOffGetterNoArgs{dynamic}.call();
+  self::Extension|tearOffGetterRequired{dynamic}.call(value);
+  self::Extension|tearOffGetterOptional{dynamic}.call();
+  self::Extension|tearOffGetterOptional{dynamic}.call(value);
+  self::Extension|tearOffGetterNamed{dynamic}.call();
+  self::Extension|tearOffGetterNamed{dynamic}.call(value: value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call(value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call<core::int*>(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int*>();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<core::int*>(value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int*>();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call(value: value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<core::int*>(value: value);
+}
+static method Extension|invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|invocationsFromInstanceContext::T*>* #this, self::Extension|invocationsFromInstanceContext::T* value) → dynamic {
+  self::Extension|readGetter();
+  self::Extension|writeSetterRequired(value);
+  self::Extension|writeSetterOptional();
+  self::Extension|writeSetterOptional(value);
+  self::Extension|writeSetterNamed();
+  self::Extension|writeSetterNamed(value: value);
+  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterRequired<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterOptional<dynamic>();
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>();
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterOptional<self::Extension|invocationsFromInstanceContext::T*>(value);
+  self::Extension|genericWriteSetterNamed<dynamic>();
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>();
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>(value: value);
+  self::Extension|genericWriteSetterNamed<self::Extension|invocationsFromInstanceContext::T*>(value: value);
+}
+static method Extension|get#invocationsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#invocationsFromInstanceContext::T*>* #this) → (self::Extension|get#invocationsFromInstanceContext::T*) →* dynamic
+  return (self::Extension|get#invocationsFromInstanceContext::T* value) → dynamic => self::Extension|invocationsFromInstanceContext<self::Extension|get#invocationsFromInstanceContext::T*>(#this, value);
+static method Extension|tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|tearOffsFromInstanceContext::T*>* #this, self::Extension|tearOffsFromInstanceContext::T* value) → dynamic {
+  () →* dynamic tearOffNoArgs = #C2;
+  tearOffNoArgs(){() →* dynamic};
+  (dynamic) →* dynamic tearOffRequired = #C3;
+  tearOffRequired(value){(dynamic) →* dynamic};
+  ([dynamic]) →* dynamic tearOffOptional = #C4;
+  tearOffOptional(){([dynamic]) →* dynamic};
+  tearOffOptional(value){([dynamic]) →* dynamic};
+  ({value: dynamic}) →* dynamic tearOffNamed = #C5;
+  tearOffNamed(){({value: dynamic}) →* dynamic};
+  tearOffNamed(value: value){({value: dynamic}) →* dynamic};
+  <S extends core::Object* = dynamic>(S*) →* dynamic tearOffGenericRequired = #C6;
+  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T*>(value){(self::Extension|tearOffsFromInstanceContext::T*) →* dynamic};
+  tearOffGenericRequired<self::Extension|tearOffsFromInstanceContext::T*>(value){(self::Extension|tearOffsFromInstanceContext::T*) →* dynamic};
+  <S extends core::Object* = dynamic>([S*]) →* dynamic tearOffGenericOptional = #C7;
+  tearOffGenericOptional<dynamic>(){([dynamic]) →* dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(value){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
+  tearOffGenericOptional<self::Extension|tearOffsFromInstanceContext::T*>(value){([self::Extension|tearOffsFromInstanceContext::T*]) →* dynamic};
+  <S extends core::Object* = dynamic>({value: S*}) →* dynamic tearOffGenericNamed = #C8;
+  tearOffGenericNamed<dynamic>(){({value: dynamic}) →* dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
+  tearOffGenericNamed<self::Extension|tearOffsFromInstanceContext::T*>(value: value){({value: self::Extension|tearOffsFromInstanceContext::T*}) →* dynamic};
+}
+static method Extension|get#tearOffsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#tearOffsFromInstanceContext::T*>* #this) → (self::Extension|get#tearOffsFromInstanceContext::T*) →* dynamic
+  return (self::Extension|get#tearOffsFromInstanceContext::T* value) → dynamic => self::Extension|tearOffsFromInstanceContext<self::Extension|get#tearOffsFromInstanceContext::T*>(#this, value);
+static method Extension|fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|fieldAccessFromInstanceContext::T*>* #this) → dynamic {
+  self::Extension|field = self::Extension|property;
+  self::Extension|property = self::Extension|field;
+}
+static method Extension|get#fieldAccessFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#fieldAccessFromInstanceContext::T*>* #this) → () →* dynamic
+  return () → dynamic => self::Extension|fieldAccessFromInstanceContext<self::Extension|get#fieldAccessFromInstanceContext::T*>(#this);
+static method Extension|getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|getterCallsFromInstanceContext::T*>* #this, self::Extension|getterCallsFromInstanceContext::T* value) → dynamic {
+  self::Extension|tearOffGetterNoArgs{dynamic}.call();
+  self::Extension|tearOffGetterRequired{dynamic}.call(value);
+  self::Extension|tearOffGetterOptional{dynamic}.call();
+  self::Extension|tearOffGetterOptional{dynamic}.call(value);
+  self::Extension|tearOffGetterNamed{dynamic}.call();
+  self::Extension|tearOffGetterNamed{dynamic}.call(value: value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call(value);
+  self::Extension|tearOffGetterGenericRequired{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>();
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call(value);
+  self::Extension|tearOffGetterGenericOptional{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>();
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call(value: value);
+  self::Extension|tearOffGetterGenericNamed{dynamic}.call<self::Extension|getterCallsFromInstanceContext::T*>(value: value);
+}
+static method Extension|get#getterCallsFromInstanceContext<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#getterCallsFromInstanceContext::T*>* #this) → (self::Extension|get#getterCallsFromInstanceContext::T*) →* dynamic
+  return (self::Extension|get#getterCallsFromInstanceContext::T* value) → dynamic => self::Extension|getterCallsFromInstanceContext<self::Extension|get#getterCallsFromInstanceContext::T*>(#this, value);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = static-tearoff self::Extension|readGetter
+  #C3 = static-tearoff self::Extension|writeSetterRequired
+  #C4 = static-tearoff self::Extension|writeSetterOptional
+  #C5 = static-tearoff self::Extension|writeSetterNamed
+  #C6 = static-tearoff self::Extension|genericWriteSetterRequired
+  #C7 = static-tearoff self::Extension|genericWriteSetterOptional
+  #C8 = static-tearoff self::Extension|genericWriteSetterNamed
+}
diff --git a/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.modular.expect
new file mode 100644
index 0000000..8289cb4
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/dynamic_invoke.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return 123;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension ClassExtension on self::Class* {
+  method method = self::ClassExtension|method;
+  tearoff method = self::ClassExtension|get#method;
+}
+extension Extension on dynamic {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+}
+static method ClassExtension|method(lowered final self::Class* #this) → core::int*
+  return 42;
+static method ClassExtension|get#method(lowered final self::Class* #this) → () →* core::int*
+  return () → core::int* => self::ClassExtension|method(#this);
+static method Extension|method(lowered final dynamic #this) → core::int*
+  return 87;
+static method Extension|get#method(lowered final dynamic #this) → () →* core::int*
+  return () → core::int* => self::Extension|method(#this);
+static method main() → dynamic {
+  dynamic c0 = new self::Class::•();
+  core::Object* c1 = new self::Class::•();
+  self::Class* c2 = new self::Class::•();
+  self::expect(123, c0{dynamic}.method());
+  self::expect(87, self::Extension|method(c1));
+  self::expect(42, self::ClassExtension|method(c2));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.modular.expect
new file mode 100644
index 0000000..b2bd40c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_access.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int* field1 = 42;
+  field core::int* field2 = 87;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension1 on self::Class* {
+  get field = self::Extension1|get#field;
+  method method = self::Extension1|method;
+  tearoff method = self::Extension1|get#method;
+  method genericMethod = self::Extension1|genericMethod;
+  tearoff genericMethod = self::Extension1|get#genericMethod;
+  set field = self::Extension1|set#field;
+}
+extension Extension2 on self::Class* {
+  get field = self::Extension2|get#field;
+  method method = self::Extension2|method;
+  tearoff method = self::Extension2|get#method;
+  method genericMethod = self::Extension2|genericMethod;
+  tearoff genericMethod = self::Extension2|get#genericMethod;
+  set field = self::Extension2|set#field;
+}
+static method Extension1|get#field(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field1}{core::int*};
+static method Extension1|set#field(lowered final self::Class* #this, core::int* value) → void {
+  #this.{self::Class::field1} = value;
+}
+static method Extension1|method(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field1}{core::int*};
+static method Extension1|get#method(lowered final self::Class* #this) → () →* core::int*
+  return () → core::int* => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension1|genericMethod::T* t) → core::int*
+  return #this.{self::Class::field1}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension1|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension2|get#field(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field2}{core::int*};
+static method Extension2|set#field(lowered final self::Class* #this, core::int* value) → void {
+  #this.{self::Class::field2} = value;
+}
+static method Extension2|method(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field2}{core::int*};
+static method Extension2|get#method(lowered final self::Class* #this) → () →* core::int*
+  return () → core::int* => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class* #this, self::Extension2|genericMethod::T* t) → core::int*
+  return #this.{self::Class::field2}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+static method Extension2|get#genericMethod(lowered final self::Class* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  self::expect(42, self::Extension1|get#field(c));
+  self::expect(87, self::Extension2|get#field(c));
+  self::expect(42, self::Extension1|method(c));
+  self::expect(87, self::Extension2|method(c));
+  () →* core::int* tearOff1 = self::Extension1|get#method(c);
+  () →* core::int* tearOff2 = self::Extension2|get#method(c);
+  self::expect(42, tearOff1(){() →* core::int*});
+  self::expect(87, tearOff2(){() →* core::int*});
+  self::expect(52, self::Extension1|genericMethod<core::int*>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::int*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::num*>(c, 10));
+  self::expect(97, self::Extension2|genericMethod<core::num*>(c, 10));
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c);
+  <T extends core::num*>(T*) →* core::int* genericTearOff2 = self::Extension2|get#genericMethod(c);
+  self::expect(52, genericTearOff1<core::int*>(10){(core::int*) →* core::int*});
+  self::expect(97, genericTearOff2<core::int*>(10){(core::int*) →* core::int*});
+  self::expect(52, genericTearOff1<core::num*>(10){(core::num*) →* core::int*});
+  self::expect(97, genericTearOff2<core::num*>(10){(core::num*) →* core::int*});
+  self::expect(23, let final self::Class* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
+  self::expect(67, let final self::Class* #t4 = c in let final core::int* #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
+  self::expect(23, self::Extension1|get#field(c));
+  self::expect(67, self::Extension2|get#field(c));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_extension_inference.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_extension_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..429ac83
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_extension_inference.dart.weak.modular.expect
@@ -0,0 +1,140 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
+  return null;
+static method GenericExtension|method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T*>* #this, self::GenericExtension|method::T* t) → self::GenericExtension|method::T*
+  return null;
+static method GenericExtension|get#method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T*>* #this) → (self::GenericExtension|get#method::T*) →* self::GenericExtension|get#method::T*
+  return (self::GenericExtension|get#method::T* t) → self::GenericExtension|get#method::T* => self::GenericExtension|method<self::GenericExtension|get#method::T*>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T*>* #this, self::GenericExtension|genericMethod1::S* s) → self::GenericExtension|genericMethod1::S*
+  return null;
+static method GenericExtension|get#genericMethod1<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* S*
+  return <S extends core::Object* = dynamic>(S* s) → S* => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T*, S*>(#this, s);
+static method main() → dynamic {
+  self::A* aVariable;
+  self::C* cVariable;
+  self::GenericClass<self::A*>* aClass;
+  self::GenericClass<self::B*>* bClass;
+  self::GenericClass<self::C*>* cClass;
+  cVariable = self::GenericExtension|get#property<self::A*>(aClass) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|get#property<self::A*>(aClass) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|get#property<self::B*>(aClass as{TypeError} self::GenericClass<self::B*>*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|get#property<self::C*>(aClass as{TypeError} self::GenericClass<self::C*>*);
+  cVariable = self::GenericExtension|get#property<self::B*>(bClass) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|get#property<self::A*>(bClass) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|get#property<self::B*>(bClass) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|get#property<self::C*>(bClass as{TypeError} self::GenericClass<self::C*>*);
+  aVariable = self::GenericExtension|get#property<self::C*>(cClass);
+  aVariable = self::GenericExtension|get#property<self::A*>(cClass);
+  aVariable = self::GenericExtension|get#property<self::B*>(cClass);
+  aVariable = self::GenericExtension|get#property<self::C*>(cClass);
+  cVariable = self::GenericExtension|method<self::A*>(aClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|method<self::A*>(aClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|method<self::B*>(aClass as{TypeError} self::GenericClass<self::B*>*, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|method<self::C*>(aClass as{TypeError} self::GenericClass<self::C*>*, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|method<self::B*>(bClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|method<self::A*>(bClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|method<self::B*>(bClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|method<self::C*>(bClass as{TypeError} self::GenericClass<self::C*>*, aVariable as{TypeError} self::C*);
+  aVariable = self::GenericExtension|method<self::C*>(cClass, aVariable as{TypeError} self::C*);
+  aVariable = self::GenericExtension|method<self::A*>(cClass, aVariable);
+  aVariable = self::GenericExtension|method<self::B*>(cClass, aVariable as{TypeError} self::B*);
+  aVariable = self::GenericExtension|method<self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(aClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::A*>(aClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::B*>(aClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(aClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(aClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::A*>(aClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::B*>(aClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(aClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(aClass as{TypeError} self::GenericClass<self::B*>*, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::A*>(aClass as{TypeError} self::GenericClass<self::B*>*, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::B*>(aClass as{TypeError} self::GenericClass<self::B*>*, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(aClass as{TypeError} self::GenericClass<self::B*>*, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(aClass as{TypeError} self::GenericClass<self::C*>*, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::A*>(aClass as{TypeError} self::GenericClass<self::C*>*, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::B*>(aClass as{TypeError} self::GenericClass<self::C*>*, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(aClass as{TypeError} self::GenericClass<self::C*>*, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(bClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::A*>(bClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::B*>(bClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(bClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(bClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::A*>(bClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::B*>(bClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(bClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(bClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::A*>(bClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::B*>(bClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(bClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(bClass as{TypeError} self::GenericClass<self::C*>*, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::A*>(bClass as{TypeError} self::GenericClass<self::C*>*, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::B*>(bClass as{TypeError} self::GenericClass<self::C*>*, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(bClass as{TypeError} self::GenericClass<self::C*>*, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::A*>(cClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::B*>(cClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::A*>(cClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::B*>(cClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::A*>(cClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::B*>(cClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::A*>(cClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::B*>(cClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.modular.expect
new file mode 100644
index 0000000..ad69a00
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_generic_extension_access.dart.weak.modular.expect
@@ -0,0 +1,134 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::num*> extends core::Object {
+  covariant-by-class field self::Class::T* field1;
+  covariant-by-class field self::Class::T* field2;
+  constructor •(self::Class::T* field1, self::Class::T* field2) → self::Class<self::Class::T*>*
+    : self::Class::field1 = field1, self::Class::field2 = field2, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension1<T extends core::num*> on self::Class<T*>* {
+  static field latestType = self::Extension1|latestType;
+  get field = self::Extension1|get#field;
+  method method = self::Extension1|method;
+  tearoff method = self::Extension1|get#method;
+  method genericMethod = self::Extension1|genericMethod;
+  tearoff genericMethod = self::Extension1|get#genericMethod;
+  set field = self::Extension1|set#field;
+}
+extension Extension2<T extends core::num*> on self::Class<T*>* {
+  get field = self::Extension2|get#field;
+  method method = self::Extension2|method;
+  tearoff method = self::Extension2|get#method;
+  method genericMethod = self::Extension2|genericMethod;
+  tearoff genericMethod = self::Extension2|get#genericMethod;
+  set field = self::Extension2|set#field;
+}
+static field core::String* Extension1|latestType;
+static method Extension1|get#field<T extends core::num*>(lowered final self::Class<self::Extension1|get#field::T*>* #this) → self::Extension1|get#field::T* {
+  self::Extension1|latestType = "${self::Extension1|get#field::T*}";
+  return #this.{self::Class::field1}{self::Extension1|get#field::T*};
+}
+static method Extension1|set#field<T extends core::num*>(lowered final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
+  self::Extension1|latestType = "${self::Extension1|set#field::T*}";
+  #this.{self::Class::field1} = value;
+}
+static method Extension1|method<T extends core::num*>(lowered final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
+  self::Extension1|latestType = "${self::Extension1|method::T*}";
+  return #this.{self::Class::field1}{self::Extension1|method::T*};
+}
+static method Extension1|get#method<T extends core::num*>(lowered final self::Class<self::Extension1|get#method::T*>* #this) → () →* self::Extension1|get#method::T*
+  return () → self::Extension1|get#method::T* => self::Extension1|method<self::Extension1|get#method::T*>(#this);
+static method Extension1|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension1|genericMethod::T*>* #this, self::Extension1|genericMethod::S* t) → self::Extension1|genericMethod::T* {
+  self::Extension1|latestType = "${self::Extension1|genericMethod::T*}:${self::Extension1|genericMethod::S*}";
+  return #this.{self::Class::field1}{self::Extension1|genericMethod::T*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} self::Extension1|genericMethod::T*;
+}
+static method Extension1|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension1|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension1|get#genericMethod::T*
+  return <S extends core::num*>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
+static method Extension2|get#field<T extends core::num*>(lowered final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
+  return #this.{self::Class::field2}{self::Extension2|get#field::T*};
+static method Extension2|set#field<T extends core::num*>(lowered final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
+  #this.{self::Class::field2} = value;
+}
+static method Extension2|method<T extends core::num*>(lowered final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
+  return #this.{self::Class::field2}{self::Extension2|method::T*};
+static method Extension2|get#method<T extends core::num*>(lowered final self::Class<self::Extension2|get#method::T*>* #this) → () →* self::Extension2|get#method::T*
+  return () → self::Extension2|get#method::T* => self::Extension2|method<self::Extension2|get#method::T*>(#this);
+static method Extension2|genericMethod<T extends core::num*, S extends core::num*>(lowered final self::Class<self::Extension2|genericMethod::T*>* #this, self::Extension2|genericMethod::S* t) → self::Extension2|genericMethod::T*
+  return #this.{self::Class::field2}{self::Extension2|genericMethod::T*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} self::Extension2|genericMethod::T*;
+static method Extension2|get#genericMethod<T extends core::num*>(lowered final self::Class<self::Extension2|get#genericMethod::T*>* #this) → <S extends core::num*>(S*) →* self::Extension2|get#genericMethod::T*
+  return <S extends core::num*>(S* t) → self::Extension2|get#genericMethod::T* => self::Extension2|genericMethod<self::Extension2|get#genericMethod::T*, S*>(#this, t);
+static method main() → dynamic {
+  self::Class<core::int*>* c = new self::Class::•<core::int*>(42, 87);
+  self::expect(42, self::Extension1|get#field<core::num*>(c));
+  self::expect("num", self::Extension1|latestType);
+  self::expect(42, self::Extension1|get#field<core::int*>(c));
+  self::expect("int", self::Extension1|latestType);
+  self::expect(87, self::Extension2|get#field<core::num*>(c));
+  self::expect(42, self::Extension1|method<core::num*>(c));
+  self::expect("num", self::Extension1|latestType);
+  self::expect(42, self::Extension1|method<core::int*>(c));
+  self::expect("int", self::Extension1|latestType);
+  self::expect(87, self::Extension2|method<core::num*>(c));
+  () →* core::num* tearOffNumber1 = self::Extension1|get#method<core::num*>(c);
+  () →* core::int* tearOffInteger1 = self::Extension1|get#method<core::int*>(c);
+  () →* core::num* tearOff2 = self::Extension2|get#method<core::num*>(c);
+  self::expect(42, tearOffNumber1(){() →* core::num*});
+  self::expect("num", self::Extension1|latestType);
+  self::expect(42, tearOffInteger1(){() →* core::int*});
+  self::expect("int", self::Extension1|latestType);
+  self::expect(87, tearOff2(){() →* core::num*});
+  self::expect(52, self::Extension1|genericMethod<core::num*, core::int*>(c, 10));
+  self::expect("num:int", self::Extension1|latestType);
+  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect("int:int", self::Extension1|latestType);
+  self::expect(97, self::Extension2|genericMethod<core::num*, core::int*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::num*, core::num*>(c, 10));
+  self::expect("num:num", self::Extension1|latestType);
+  self::expect(52, self::Extension1|genericMethod<core::int*, core::num*>(c, 10));
+  self::expect("int:num", self::Extension1|latestType);
+  self::expect(97, self::Extension2|genericMethod<core::num*, core::num*>(c, 10));
+  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect("int:int", self::Extension1|latestType);
+  self::expect(52, self::Extension1|genericMethod<core::int*, core::num*>(c, 10));
+  self::expect("int:num", self::Extension1|latestType);
+  self::expect(52, self::Extension1|genericMethod<core::int*, core::int*>(c, 10));
+  self::expect("int:int", self::Extension1|latestType);
+  <S extends core::num*>(S*) →* core::num* genericTearOffNumber1 = self::Extension1|get#genericMethod<core::num*>(c);
+  <S extends core::num*>(S*) →* core::int* genericTearOffInteger1 = self::Extension1|get#genericMethod<core::int*>(c);
+  <S extends core::num*>(S*) →* core::num* genericTearOff2 = self::Extension2|get#genericMethod<core::num*>(c);
+  self::expect(52, genericTearOffNumber1<core::int*>(10){(core::int*) →* core::num*});
+  self::expect("num:int", self::Extension1|latestType);
+  self::expect(52, genericTearOffInteger1<core::int*>(10){(core::int*) →* core::int*});
+  self::expect("int:int", self::Extension1|latestType);
+  self::expect(97, genericTearOff2<core::int*>(10){(core::int*) →* core::num*});
+  self::expect(52, genericTearOffNumber1<core::num*>(10){(core::num*) →* core::num*});
+  self::expect("num:num", self::Extension1|latestType);
+  self::expect(52, genericTearOffInteger1<core::num*>(10){(core::num*) →* core::int*});
+  self::expect("int:num", self::Extension1|latestType);
+  self::expect(97, genericTearOff2<core::num*>(10){(core::num*) →* core::num*});
+  self::expect(23, let final self::Class<core::int*>* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num*>(#t1, #t2) in #t2);
+  self::expect("num", self::Extension1|latestType);
+  self::expect(23, let final self::Class<core::int*>* #t4 = c in let final core::int* #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int*>(#t4, #t5) in #t5);
+  self::expect("int", self::Extension1|latestType);
+  self::expect(67, let final self::Class<core::int*>* #t7 = c in let final core::int* #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num*>(#t7, #t8) in #t8);
+  self::expect(23, self::Extension1|get#field<core::num*>(c));
+  self::expect(67, self::Extension2|get#field<core::num*>(c));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.modular.expect
new file mode 100644
index 0000000..f0bae7e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_invalid_access.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_invalid_access.dart:10:3: Error: Explicit extension application cannot be used as an expression.
+//   Extension(c);
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_invalid_access.dart:11:3: Error: Explicit extension application cannot be a target for assignment.
+//   Extension(c) = 42;
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_invalid_access.dart:12:3: Error: Explicit extension application cannot be used as an expression.
+//   Extension(c) += 42;
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_invalid_access.dart:13:3: Error: Explicit extension application cannot be used as an expression.
+//   Extension(c)++;
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_invalid_access.dart:14:5: Error: Explicit extension application cannot be used as an expression.
+//   ++Extension(c);
+//     ^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+}
+static method errors(self::Class* c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_invalid_access.dart:10:3: Error: Explicit extension application cannot be used as an expression.
+  Extension(c);
+  ^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_invalid_access.dart:11:3: Error: Explicit extension application cannot be a target for assignment.
+  Extension(c) = 42;
+  ^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_invalid_access.dart:12:3: Error: Explicit extension application cannot be used as an expression.
+  Extension(c) += 42;
+  ^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_invalid_access.dart:13:3: Error: Explicit extension application cannot be used as an expression.
+  Extension(c)++;
+  ^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/explicit_invalid_access.dart:14:5: Error: Explicit extension application cannot be used as an expression.
+  ++Extension(c);
+    ^^^^^^^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.modular.expect
new file mode 100644
index 0000000..9328ef6
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field core::Object* field = null;
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension A2 on self::A1* {
+  method method2 = self::A2|method2;
+  tearoff method2 = self::A2|get#method2;
+  method method3 = self::A2|method3;
+  tearoff method3 = self::A2|get#method3;
+  method method4 = self::A2|method4;
+  tearoff method4 = self::A2|get#method4;
+}
+static method A2|method2(lowered final self::A1* #this) → void
+  return #this.{self::A1::method1}(){() →* void};
+static method A2|get#method2(lowered final self::A1* #this) → () →* void
+  return () → void => self::A2|method2(#this);
+static method A2|method3(lowered final self::A1* #this) → core::Object*
+  return #this.{self::A1::field}{core::Object*};
+static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
+  return () → core::Object* => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1* #this, core::Object* o) → void {
+  #this.{self::A1::field} = o;
+}
+static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
+  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.modular.expect
new file mode 100644
index 0000000..6a3bebc
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_from_dill/main.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "main_lib2.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+
+static method main() → dynamic {
+  mai::Extension|set#instanceProperty(0, mai::Extension|get#instanceProperty(1));
+  mai::Extension|instanceMethod(2);
+  mai::Extension|get#instanceMethod(3);
+  mai::Extension|staticField = #C1;
+  mai::Extension|set#instanceProperty(3, mai::Extension|staticFinalField);
+  mai::Extension|staticProperty = mai::Extension|staticProperty;
+  mai::Extension|staticMethod();
+  #C2;
+}
+
+constants  {
+  #C1 = 42
+  #C2 = static-tearoff mai::Extension|staticMethod
+}
diff --git a/pkg/front_end/testcases/extensions/export_twice.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/export_twice.dart.weak.modular.expect
new file mode 100644
index 0000000..d7eef99
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/export_twice.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "export_twice_lib1.dart" as exp;
+
+import "org-dartlang-testcase:///export_twice_lib1.dart";
+import "org-dartlang-testcase:///export_twice_lib2.dart";
+
+static method main() → dynamic {
+  exp::Extension|method(new exp::Class::•());
+}
+
+library;
+import self as exp;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → exp::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on exp::Class* {
+  method method = exp::Extension|method;
+  tearoff method = exp::Extension|get#method;
+}
+static method Extension|method(lowered final exp::Class* #this) → dynamic {}
+static method Extension|get#method(lowered final exp::Class* #this) → () →* dynamic
+  return () → dynamic => exp::Extension|method(#this);
+
+library;
+import self as self2;
+import "export_twice_lib1.dart" as exp;
+additionalExports = (exp::Extension)
+
+export "org-dartlang-testcase:///export_twice_lib1.dart" show Extension;
diff --git a/pkg/front_end/testcases/extensions/extension_call.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_call.dart.weak.modular.expect
new file mode 100644
index 0000000..13106a6
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_call.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  method method(covariant-by-class self::Class::T* a) → self::Class::T*
+    return a;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+}
+static method Extension|call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|call::T*>* #this, self::Extension|call::T* a) → self::Extension|call::T*
+  return #this.{self::Class::method}(a){(self::Extension|call::T*) →* self::Extension|call::T*};
+static method Extension|get#call<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#call::T*>* #this) → (self::Extension|get#call::T*) →* self::Extension|get#call::T*
+  return (self::Extension|get#call::T* a) → self::Extension|get#call::T* => self::Extension|call<self::Extension|get#call::T*>(#this, a);
+static method main() → dynamic {
+  self::Class<core::int*>* c = new self::Class::•<core::int*>();
+  self::expect(42, self::Extension|call<core::int*>(c, 42));
+  self::expect(87, self::Extension|call<core::int*>(c, 87));
+  self::expect(123, self::Extension|call<core::int*>(c, 123));
+  self::expect(42, self::Extension|call<core::int*>(c, 42));
+  self::expect(87, self::Extension|call<core::int*>(c, 87));
+  self::expect(123, self::Extension|call<core::int*>(c, 123));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..8400d5d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_constructor.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/extension_constructor.dart:8:3: Error: Extensions can't declare constructors.
+// Try removing the constructor declaration.
+//   Extension() {}
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_constructor.dart:9:3: Error: Extensions can't declare constructors.
+// Try removing the constructor declaration.
+//   Extension.named() {}
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_constructor.dart:10:3: Error: Extensions can't declare constructors.
+// Try removing the constructor declaration.
+//   factory Extension.fact() => null;
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_constructor.dart:11:3: Error: Extensions can't declare constructors.
+// Try removing the constructor declaration.
+//   factory Extension.redirect() = Extension;
+//   ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+}
+static method Extension|method(lowered final self::Class* #this) → dynamic {}
+static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|method(#this);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.weak.modular.expect
new file mode 100644
index 0000000..1539e4a
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart:6:5: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   U field1 = null;
+//     ^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart:7:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? field2 = () { U x = null; return null; }();
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart:8:12: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   List<U>? field3 = null;
+//            ^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart:9:18: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   U Function(U)? field4 = null;
+//                  ^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart:10:30: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   List<U> Function(List<U>)? field5 = null;
+//                              ^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart:11:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? field6 = <E>() { E? x = null; return null; }<String>();
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart:12:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? field7 = <E>() { E? x = null; return null; }<U>();
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart:13:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   Type field8 = U;
+//        ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension E<U extends core::Object? = dynamic> on core::String {
+  field field1 = self::E|field1;
+  field field2 = self::E|field2;
+  field field3 = self::E|field3;
+  field field4 = self::E|field4;
+  field field5 = self::E|field5;
+  field field6 = self::E|field6;
+  field field7 = self::E|field7;
+  field field8 = self::E|field8;
+}
+static field invalid-type E|field1 = null;
+static field core::int? E|field2 = (() → Null {
+  invalid-type x = null;
+  return null;
+})(){() → Null};
+static field core::List<invalid-type>? E|field3 = null;
+static field (invalid-type) →? invalid-type E|field4 = null;
+static field (core::List<invalid-type>) →? core::List<invalid-type> E|field5 = null;
+static field core::int? E|field6 = (<E extends core::Object? = dynamic>() → Null {
+  E? x = null;
+  return null;
+})<core::String>(){() → Null};
+static field core::int? E|field7 = (<E extends core::Object? = dynamic>() → Null {
+  E? x = null;
+  return null;
+})<invalid-type>(){() → Null};
+static field core::Type E|field8 = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(invalid-type)
+}
diff --git a/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.modular.expect
new file mode 100644
index 0000000..fd72cf1
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_member_conflict.dart.weak.modular.expect
@@ -0,0 +1,209 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:7:11: Error: 'duplicateInstanceGetter' is already declared in this scope.
+//   int get duplicateInstanceGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:6:11: Context: Previous declaration of 'duplicateInstanceGetter'.
+//   int get duplicateInstanceGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:10:12: Error: 'duplicateInstanceSetter' is already declared in this scope.
+//   void set duplicateInstanceSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:9:12: Context: Previous declaration of 'duplicateInstanceSetter'.
+//   void set duplicateInstanceSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:13:8: Error: 'duplicateInstanceMethod' is already declared in this scope.
+//   void duplicateInstanceMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:12:8: Context: Previous declaration of 'duplicateInstanceMethod'.
+//   void duplicateInstanceMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:16:14: Error: 'duplicateStaticField' is already declared in this scope.
+//   static int duplicateStaticField = 0;
+//              ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:15:14: Context: Previous declaration of 'duplicateStaticField'.
+//   static int duplicateStaticField = 0;
+//              ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:19:18: Error: 'duplicateStaticGetter' is already declared in this scope.
+//   static int get duplicateStaticGetter => 0;
+//                  ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:18:18: Context: Previous declaration of 'duplicateStaticGetter'.
+//   static int get duplicateStaticGetter => 0;
+//                  ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:22:19: Error: 'duplicateStaticSetter' is already declared in this scope.
+//   static void set duplicateStaticSetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:21:19: Context: Previous declaration of 'duplicateStaticSetter'.
+//   static void set duplicateStaticSetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:25:15: Error: 'duplicateStaticMethod' is already declared in this scope.
+//   static void duplicateStaticMethod() {}
+//               ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:24:15: Context: Previous declaration of 'duplicateStaticMethod'.
+//   static void duplicateStaticMethod() {}
+//               ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:28:11: Error: 'duplicateInstanceGetterPlusSetter' is already declared in this scope.
+//   int get duplicateInstanceGetterPlusSetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:27:11: Context: Previous declaration of 'duplicateInstanceGetterPlusSetter'.
+//   int get duplicateInstanceGetterPlusSetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:33:12: Error: 'duplicateInstanceSetterPlusGetter' is already declared in this scope.
+//   void set duplicateInstanceSetterPlusGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:32:12: Context: Previous declaration of 'duplicateInstanceSetterPlusGetter'.
+//   void set duplicateInstanceSetterPlusGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:36:11: Error: 'duplicateInstanceGetterAndSetter' is already declared in this scope.
+//   int get duplicateInstanceGetterAndSetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:35:11: Context: Previous declaration of 'duplicateInstanceGetterAndSetter'.
+//   int get duplicateInstanceGetterAndSetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:38:12: Error: 'duplicateInstanceGetterAndSetter' is already declared in this scope.
+//   void set duplicateInstanceGetterAndSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:37:12: Context: Previous declaration of 'duplicateInstanceGetterAndSetter'.
+//   void set duplicateInstanceGetterAndSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:41:18: Error: 'duplicateStaticGetterPlusSetter' is already declared in this scope.
+//   static int get duplicateStaticGetterPlusSetter => 0;
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:40:18: Context: Previous declaration of 'duplicateStaticGetterPlusSetter'.
+//   static int get duplicateStaticGetterPlusSetter => 0;
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:46:19: Error: 'duplicateStaticSetterPlusGetter' is already declared in this scope.
+//   static void set duplicateStaticSetterPlusGetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:45:19: Context: Previous declaration of 'duplicateStaticSetterPlusGetter'.
+//   static void set duplicateStaticSetterPlusGetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:49:18: Error: 'duplicateStaticGetterAndSetter' is already declared in this scope.
+//   static int get duplicateStaticGetterAndSetter => 0;
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:48:18: Context: Previous declaration of 'duplicateStaticGetterAndSetter'.
+//   static int get duplicateStaticGetterAndSetter => 0;
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:51:19: Error: 'duplicateStaticGetterAndSetter' is already declared in this scope.
+//   static void set duplicateStaticGetterAndSetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:50:19: Context: Previous declaration of 'duplicateStaticGetterAndSetter'.
+//   static void set duplicateStaticGetterAndSetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:60:14: Error: 'instanceGetterAndStaticField' is already declared in this scope.
+//   static int instanceGetterAndStaticField = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:59:11: Context: Previous declaration of 'instanceGetterAndStaticField'.
+//   int get instanceGetterAndStaticField => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:63:20: Error: 'instanceGetterAndStaticField' is already declared in this scope.
+//   static final int instanceGetterAndStaticField = 0;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:60:14: Context: Previous declaration of 'instanceGetterAndStaticField'.
+//   static int instanceGetterAndStaticField = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:54:19: Error: Conflicts with member 'instanceGetterAndStaticSetter'.
+//   static void set instanceGetterAndStaticSetter(int value) {}
+//                   ^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:53:11: Error: Conflicts with setter 'instanceGetterAndStaticSetter'.
+//   int get instanceGetterAndStaticSetter => 0;
+//           ^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:57:12: Error: Conflicts with member 'instanceSetterAndStaticGetter'.
+//   void set instanceSetterAndStaticGetter(int value) {}
+//            ^
+//
+// pkg/front_end/testcases/extensions/extension_member_conflict.dart:56:18: Error: Conflicts with setter 'instanceSetterAndStaticGetter'.
+//   static int get instanceSetterAndStaticGetter => 0;
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension<T extends core::Object* = dynamic> on core::int* {
+  get duplicateInstanceGetter = self::Extension|get#duplicateInstanceGetter;
+  method duplicateInstanceMethod = self::Extension|duplicateInstanceMethod;
+  tearoff duplicateInstanceMethod = self::Extension|get#duplicateInstanceMethod;
+  static field duplicateStaticField = self::Extension|duplicateStaticField;
+  static get duplicateStaticGetter = get self::Extension|duplicateStaticGetter;
+  static method duplicateStaticMethod = self::Extension|duplicateStaticMethod;
+  get duplicateInstanceGetterPlusSetter = self::Extension|get#duplicateInstanceGetterPlusSetter;
+  get duplicateInstanceSetterPlusGetter = self::Extension|get#duplicateInstanceSetterPlusGetter;
+  get duplicateInstanceGetterAndSetter = self::Extension|get#duplicateInstanceGetterAndSetter;
+  static get duplicateStaticGetterPlusSetter = get self::Extension|duplicateStaticGetterPlusSetter;
+  static get duplicateStaticSetterPlusGetter = get self::Extension|duplicateStaticSetterPlusGetter;
+  static get duplicateStaticGetterAndSetter = get self::Extension|duplicateStaticGetterAndSetter;
+  get instanceGetterAndStaticSetter = self::Extension|get#instanceGetterAndStaticSetter;
+  static get instanceSetterAndStaticGetter = get self::Extension|instanceSetterAndStaticGetter;
+  get instanceGetterAndStaticField = self::Extension|get#instanceGetterAndStaticField;
+  set duplicateInstanceSetter = self::Extension|set#duplicateInstanceSetter;
+  static set duplicateStaticSetter = set self::Extension|duplicateStaticSetter;
+  set duplicateInstanceGetterPlusSetter = self::Extension|set#duplicateInstanceGetterPlusSetter;
+  set duplicateInstanceSetterPlusGetter = self::Extension|set#duplicateInstanceSetterPlusGetter;
+  set duplicateInstanceGetterAndSetter = self::Extension|set#duplicateInstanceGetterAndSetter;
+  static set duplicateStaticGetterPlusSetter = set self::Extension|duplicateStaticGetterPlusSetter;
+  static set duplicateStaticSetterPlusGetter = set self::Extension|duplicateStaticSetterPlusGetter;
+  static set duplicateStaticGetterAndSetter = set self::Extension|duplicateStaticGetterAndSetter;
+  static set instanceGetterAndStaticSetter = set self::Extension|instanceGetterAndStaticSetter;
+  set instanceSetterAndStaticGetter = self::Extension|set#instanceSetterAndStaticGetter;
+  set instanceSetterAndStaticField = self::Extension|set#instanceSetterAndStaticField;
+}
+static field core::int* Extension|duplicateStaticField;
+static method Extension|get#duplicateInstanceGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+  return 0;
+static method Extension|set#duplicateInstanceSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static method Extension|duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → void {}
+static method Extension|get#duplicateInstanceMethod<T extends core::Object* = dynamic>(lowered final core::int* #this) → () →* void
+  return () → void => self::Extension|duplicateInstanceMethod<self::Extension|get#duplicateInstanceMethod::T*>(#this);
+static get Extension|duplicateStaticGetter() → core::int*
+  return 0;
+static set Extension|duplicateStaticSetter(core::int* value) → void {}
+static method Extension|duplicateStaticMethod() → void {}
+static method Extension|get#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+  return 0;
+static method Extension|set#duplicateInstanceGetterPlusSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static method Extension|get#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+  return 0;
+static method Extension|set#duplicateInstanceSetterPlusGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static method Extension|get#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+  return 0;
+static method Extension|set#duplicateInstanceGetterAndSetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static get Extension|duplicateStaticGetterPlusSetter() → core::int*
+  return 0;
+static set Extension|duplicateStaticGetterPlusSetter(core::int* value) → void {}
+static get Extension|duplicateStaticSetterPlusGetter() → core::int*
+  return 0;
+static set Extension|duplicateStaticSetterPlusGetter(core::int* value) → void {}
+static get Extension|duplicateStaticGetterAndSetter() → core::int*
+  return 0;
+static set Extension|duplicateStaticGetterAndSetter(core::int* value) → void {}
+static method Extension|get#instanceGetterAndStaticSetter<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+  return 0;
+static set Extension|instanceGetterAndStaticSetter(core::int* value) → void {}
+static get Extension|instanceSetterAndStaticGetter() → core::int*
+  return 0;
+static method Extension|set#instanceSetterAndStaticGetter<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static method Extension|get#instanceGetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this) → core::int*
+  return 0;
+static method Extension|set#instanceSetterAndStaticField<T extends core::Object* = dynamic>(lowered final core::int* #this, core::int* value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/extension_methods.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.modular.expect
new file mode 100644
index 0000000..dd3ee97
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_methods.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  get one() → core::int*
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension E on self::C* {
+  get two = self::E|get#two;
+}
+static method E|get#two(lowered final self::C* #this) → core::int*
+  return 2;
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  core::int* result = c.{self::C::one}{core::int*}.{core::num::+}(self::E|get#two(c)){(core::num*) →* core::int*};
+  exp::Expect::equals(result, 3);
+}
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..049dae0
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.weak.modular.expect
@@ -0,0 +1,223 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int* field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  get simpleSetter = self::Extension|get#simpleSetter;
+  get mutatingSetter = self::Extension|get#mutatingSetter;
+  get setterWithReturn = self::Extension|get#setterWithReturn;
+  get setterWithClosure = self::Extension|get#setterWithClosure;
+  method testInternal = self::Extension|testInternal;
+  tearoff testInternal = self::Extension|get#testInternal;
+  set simpleSetter = self::Extension|set#simpleSetter;
+  set mutatingSetter = self::Extension|set#mutatingSetter;
+  set setterWithReturn = self::Extension|set#setterWithReturn;
+  set setterWithClosure = self::Extension|set#setterWithClosure;
+}
+extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+  set setter = self::GenericExtension|set#setter;
+}
+static method Extension|get#simpleSetter(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method Extension|set#simpleSetter(lowered final self::Class* #this, core::int* value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#mutatingSetter(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method Extension|set#mutatingSetter(lowered final self::Class* #this, core::int* value) → void {
+  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#setterWithReturn(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method Extension|set#setterWithReturn(lowered final self::Class* #this, core::int* value) → void {
+  if(value.{core::num::<}(0){(core::num*) →* core::bool*}) {
+    #this.{self::Class::field} = value.{core::int::unary-}(){() →* core::int*};
+    return;
+  }
+  #this.{self::Class::field} = value;
+}
+static method Extension|get#setterWithClosure(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method Extension|set#setterWithClosure(lowered final self::Class* #this, core::int* value) → void {
+  function abs(dynamic value) → dynamic {
+    return value{dynamic}.<(0) as{TypeError,ForDynamic} core::bool* ?{dynamic} value{dynamic}.unary-() : value;
+  }
+  #this.{self::Class::field} = abs(value){(dynamic) →* dynamic} as{TypeError,ForDynamic} core::int*;
+}
+static method Extension|testInternal(lowered final self::Class* #this) → dynamic {
+  self::expect(null, #this.{self::Class::field}{core::int*});
+  self::Extension|set#simpleSetter(#this, 0);
+  self::expect(0, #this.{self::Class::field}{core::int*});
+  self::expect(1, let final core::int* #t1 = 1 in let final void #t2 = self::Extension|set#simpleSetter(#this, #t1) in #t1);
+  self::Extension|set#mutatingSetter(#this, 0);
+  self::expect(1, #this.{self::Class::field}{core::int*});
+  self::expect(2, let final core::int* #t3 = 2 in let final void #t4 = self::Extension|set#mutatingSetter(#this, #t3) in #t3);
+  self::expect(3, #this.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithReturn(#this, 1);
+  self::expect(1, #this.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithReturn(#this, 2.{core::int::unary-}(){() →* core::int*});
+  self::expect(2, #this.{self::Class::field}{core::int*});
+  self::expect(3, let final core::int* #t5 = 3 in let final void #t6 = self::Extension|set#setterWithReturn(#this, #t5) in #t5);
+  self::expect(3, #this.{self::Class::field}{core::int*});
+  self::expect(4.{core::int::unary-}(){() →* core::int*}, let final core::int* #t7 = 4.{core::int::unary-}(){() →* core::int*} in let final void #t8 = self::Extension|set#setterWithReturn(#this, #t7) in #t7);
+  self::expect(4, #this.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithClosure(#this, 1);
+  self::expect(1, #this.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithClosure(#this, 2.{core::int::unary-}(){() →* core::int*});
+  self::expect(2, #this.{self::Class::field}{core::int*});
+  self::expect(3, let final core::int* #t9 = 3 in let final void #t10 = self::Extension|set#setterWithClosure(#this, #t9) in #t9);
+  self::expect(3, #this.{self::Class::field}{core::int*});
+  self::expect(4.{core::int::unary-}(){() →* core::int*}, let final core::int* #t11 = 4.{core::int::unary-}(){() →* core::int*} in let final void #t12 = self::Extension|set#setterWithClosure(#this, #t11) in #t11);
+  self::expect(4, #this.{self::Class::field}{core::int*});
+}
+static method Extension|get#testInternal(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|testInternal(#this);
+static method GenericExtension|set#setter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T*>* #this, self::GenericExtension|set#setter::T* value) → void {}
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  self::expect(null, c.{self::Class::field}{core::int*});
+  self::Extension|set#simpleSetter(c, 0);
+  self::expect(0, c.{self::Class::field}{core::int*});
+  self::expect(1, let final core::int* #t13 = 1 in let final void #t14 = self::Extension|set#simpleSetter(c, #t13) in #t13);
+  self::Extension|set#simpleSetter(c, 2);
+  self::expect(2, c.{self::Class::field}{core::int*});
+  self::expect(3, let final self::Class* #t15 = c in let final core::int* #t16 = 3 in let final void #t17 = self::Extension|set#simpleSetter(#t15, #t16) in #t16);
+  self::Extension|set#mutatingSetter(c, 0);
+  self::expect(1, c.{self::Class::field}{core::int*});
+  self::expect(2, let final core::int* #t18 = 2 in let final void #t19 = self::Extension|set#mutatingSetter(c, #t18) in #t18);
+  self::expect(3, c.{self::Class::field}{core::int*});
+  self::Extension|set#mutatingSetter(c, 4);
+  self::expect(5, c.{self::Class::field}{core::int*});
+  self::expect(6, let final self::Class* #t20 = c in let final core::int* #t21 = 6 in let final void #t22 = self::Extension|set#mutatingSetter(#t20, #t21) in #t21);
+  self::expect(7, c.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithReturn(c, 1);
+  self::expect(1, c.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithReturn(c, 2.{core::int::unary-}(){() →* core::int*});
+  self::expect(2, c.{self::Class::field}{core::int*});
+  self::expect(3, let final core::int* #t23 = 3 in let final void #t24 = self::Extension|set#setterWithReturn(c, #t23) in #t23);
+  self::expect(3, c.{self::Class::field}{core::int*});
+  self::expect(4.{core::int::unary-}(){() →* core::int*}, let final core::int* #t25 = 4.{core::int::unary-}(){() →* core::int*} in let final void #t26 = self::Extension|set#setterWithReturn(c, #t25) in #t25);
+  self::expect(4, c.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithReturn(c, 5);
+  self::expect(5, c.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}(){() →* core::int*});
+  self::expect(6, c.{self::Class::field}{core::int*});
+  self::expect(7, let final self::Class* #t27 = c in let final core::int* #t28 = 7 in let final void #t29 = self::Extension|set#setterWithReturn(#t27, #t28) in #t28);
+  self::expect(7, c.{self::Class::field}{core::int*});
+  self::expect(8.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t30 = c in let final core::int* #t31 = 8.{core::int::unary-}(){() →* core::int*} in let final void #t32 = self::Extension|set#setterWithReturn(#t30, #t31) in #t31);
+  self::expect(8, c.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithClosure(c, 1);
+  self::expect(1, c.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithClosure(c, 2.{core::int::unary-}(){() →* core::int*});
+  self::expect(2, c.{self::Class::field}{core::int*});
+  self::expect(3, let final core::int* #t33 = 3 in let final void #t34 = self::Extension|set#setterWithClosure(c, #t33) in #t33);
+  self::expect(3, c.{self::Class::field}{core::int*});
+  self::expect(4.{core::int::unary-}(){() →* core::int*}, let final core::int* #t35 = 4.{core::int::unary-}(){() →* core::int*} in let final void #t36 = self::Extension|set#setterWithClosure(c, #t35) in #t35);
+  self::expect(4, c.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithClosure(c, 5);
+  self::expect(5, c.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}(){() →* core::int*});
+  self::expect(6, c.{self::Class::field}{core::int*});
+  self::expect(7, let final self::Class* #t37 = c in let final core::int* #t38 = 7 in let final void #t39 = self::Extension|set#setterWithClosure(#t37, #t38) in #t38);
+  self::expect(7, c.{self::Class::field}{core::int*});
+  self::expect(8.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t40 = c in let final core::int* #t41 = 8.{core::int::unary-}(){() →* core::int*} in let final void #t42 = self::Extension|set#setterWithClosure(#t40, #t41) in #t41);
+  self::expect(8, c.{self::Class::field}{core::int*});
+  self::Extension|set#simpleSetter(c, 0);
+  self::expect(0, let final self::Class* #t43 = c in #t43 == null ?{core::int*} null : #t43.{self::Class::field}{core::int*});
+  self::expect(1, let final self::Class* #t44 = c in #t44 == null ?{core::int*} null : let final core::int* #t45 = 1 in let final void #t46 = self::Extension|set#simpleSetter(#t44, #t45) in #t45);
+  self::Extension|set#simpleSetter(c, 2);
+  self::expect(2, let final self::Class* #t47 = c in #t47 == null ?{core::int*} null : #t47.{self::Class::field}{core::int*});
+  self::expect(3, let final self::Class* #t48 = c in let final core::int* #t49 = 3 in let final void #t50 = self::Extension|set#simpleSetter(#t48, #t49) in #t49);
+  self::Extension|set#mutatingSetter(c, 0);
+  self::expect(1, let final self::Class* #t51 = c in #t51 == null ?{core::int*} null : #t51.{self::Class::field}{core::int*});
+  self::expect(2, let final self::Class* #t52 = c in #t52 == null ?{core::int*} null : let final core::int* #t53 = 2 in let final void #t54 = self::Extension|set#mutatingSetter(#t52, #t53) in #t53);
+  self::expect(3, let final self::Class* #t55 = c in #t55 == null ?{core::int*} null : #t55.{self::Class::field}{core::int*});
+  self::Extension|set#mutatingSetter(c, 4);
+  self::expect(5, let final self::Class* #t56 = c in #t56 == null ?{core::int*} null : #t56.{self::Class::field}{core::int*});
+  self::expect(6, let final self::Class* #t57 = c in let final core::int* #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
+  self::expect(7, let final self::Class* #t60 = c in #t60 == null ?{core::int*} null : #t60.{self::Class::field}{core::int*});
+  let final self::Class* #t61 = c in #t61 == null ?{core::int*} null : self::Extension|set#setterWithReturn(#t61, 1);
+  self::expect(1, let final self::Class* #t62 = c in #t62 == null ?{core::int*} null : #t62.{self::Class::field}{core::int*});
+  let final self::Class* #t63 = c in #t63 == null ?{core::int*} null : self::Extension|set#setterWithReturn(#t63, 2.{core::int::unary-}(){() →* core::int*});
+  self::expect(2, let final self::Class* #t64 = c in #t64 == null ?{core::int*} null : #t64.{self::Class::field}{core::int*});
+  self::expect(3, let final self::Class* #t65 = c in #t65 == null ?{core::int*} null : let final core::int* #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65, #t66) in #t66);
+  self::expect(3, let final self::Class* #t68 = c in #t68 == null ?{core::int*} null : #t68.{self::Class::field}{core::int*});
+  self::expect(4.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t69 = c in #t69 == null ?{core::int*} null : let final core::int* #t70 = 4.{core::int::unary-}(){() →* core::int*} in let final void #t71 = self::Extension|set#setterWithReturn(#t69, #t70) in #t70);
+  self::expect(4, let final self::Class* #t72 = c in #t72 == null ?{core::int*} null : #t72.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithReturn(c, 5);
+  self::expect(5, let final self::Class* #t73 = c in #t73 == null ?{core::int*} null : #t73.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}(){() →* core::int*});
+  self::expect(6, let final self::Class* #t74 = c in #t74 == null ?{core::int*} null : #t74.{self::Class::field}{core::int*});
+  self::expect(7, let final self::Class* #t75 = c in let final core::int* #t76 = 7 in let final void #t77 = self::Extension|set#setterWithReturn(#t75, #t76) in #t76);
+  self::expect(7, let final self::Class* #t78 = c in #t78 == null ?{core::int*} null : #t78.{self::Class::field}{core::int*});
+  self::expect(8.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t79 = c in let final core::int* #t80 = 8.{core::int::unary-}(){() →* core::int*} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
+  self::expect(8, let final self::Class* #t82 = c in #t82 == null ?{core::int*} null : #t82.{self::Class::field}{core::int*});
+  let final self::Class* #t83 = c in #t83 == null ?{core::int*} null : self::Extension|set#setterWithClosure(#t83, 1);
+  self::expect(1, let final self::Class* #t84 = c in #t84 == null ?{core::int*} null : #t84.{self::Class::field}{core::int*});
+  let final self::Class* #t85 = c in #t85 == null ?{core::int*} null : self::Extension|set#setterWithClosure(#t85, 2.{core::int::unary-}(){() →* core::int*});
+  self::expect(2, let final self::Class* #t86 = c in #t86 == null ?{core::int*} null : #t86.{self::Class::field}{core::int*});
+  self::expect(3, let final self::Class* #t87 = c in #t87 == null ?{core::int*} null : let final core::int* #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87, #t88) in #t88);
+  self::expect(3, let final self::Class* #t90 = c in #t90 == null ?{core::int*} null : #t90.{self::Class::field}{core::int*});
+  self::expect(4.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t91 = c in #t91 == null ?{core::int*} null : let final core::int* #t92 = 4.{core::int::unary-}(){() →* core::int*} in let final void #t93 = self::Extension|set#setterWithClosure(#t91, #t92) in #t92);
+  self::expect(4, let final self::Class* #t94 = c in #t94 == null ?{core::int*} null : #t94.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithClosure(c, 5);
+  self::expect(5, let final self::Class* #t95 = c in #t95 == null ?{core::int*} null : #t95.{self::Class::field}{core::int*});
+  self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}(){() →* core::int*});
+  self::expect(6, let final self::Class* #t96 = c in #t96 == null ?{core::int*} null : #t96.{self::Class::field}{core::int*});
+  self::expect(7, let final self::Class* #t97 = c in let final core::int* #t98 = 7 in let final void #t99 = self::Extension|set#setterWithClosure(#t97, #t98) in #t98);
+  self::expect(7, let final self::Class* #t100 = c in #t100 == null ?{core::int*} null : #t100.{self::Class::field}{core::int*});
+  self::expect(8.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t101 = c in let final core::int* #t102 = 8.{core::int::unary-}(){() →* core::int*} in let final void #t103 = self::Extension|set#setterWithClosure(#t101, #t102) in #t102);
+  self::expect(8, let final self::Class* #t104 = c in #t104 == null ?{core::int*} null : #t104.{self::Class::field}{core::int*});
+  c.{self::Class::field} = null;
+  let final self::Class* #t105 = c in self::Extension|get#simpleSetter(#t105) == null ?{core::int*} self::Extension|set#simpleSetter(#t105, 1) : null;
+  self::expect(1, c.{self::Class::field}{core::int*});
+  self::expect(1, let final self::Class* #t106 = c in let final core::int* #t107 = self::Extension|get#simpleSetter(#t106) in #t107 == null ?{core::int*} let final core::int* #t108 = 2 in let final void #t109 = self::Extension|set#simpleSetter(#t106, #t108) in #t108 : #t107);
+  c.{self::Class::field} = null;
+  self::expect(2, let final self::Class* #t110 = c in let final core::int* #t111 = self::Extension|get#simpleSetter(#t110) in #t111 == null ?{core::int*} let final core::int* #t112 = 2 in let final void #t113 = self::Extension|set#simpleSetter(#t110, #t112) in #t112 : #t111);
+  let final self::Class* #t114 = c in #t114 == null ?{Null} null : #t114.{self::Class::field} = null;
+  let final self::Class* #t115 = c in #t115 == null ?{core::int*} null : self::Extension|get#simpleSetter(#t115) == null ?{core::int*} self::Extension|set#simpleSetter(#t115, 1) : null;
+  self::expect(1, let final self::Class* #t116 = c in #t116 == null ?{core::int*} null : #t116.{self::Class::field}{core::int*});
+  self::expect(1, let final self::Class* #t117 = c in #t117 == null ?{core::int*} null : let final core::int* #t118 = self::Extension|get#simpleSetter(#t117) in #t118 == null ?{core::int*} let final core::int* #t119 = 2 in let final void #t120 = self::Extension|set#simpleSetter(#t117, #t119) in #t119 : #t118);
+  let final self::Class* #t121 = c in #t121 == null ?{Null} null : #t121.{self::Class::field} = null;
+  self::expect(2, let final self::Class* #t122 = c in #t122 == null ?{core::int*} null : let final core::int* #t123 = self::Extension|get#simpleSetter(#t122) in #t123 == null ?{core::int*} let final core::int* #t124 = 2 in let final void #t125 = self::Extension|set#simpleSetter(#t122, #t124) in #t124 : #t123);
+  self::Extension|testInternal(new self::Class::•());
+  self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
+  self::expect(1, let final self::GenericClass<core::int*>* #t126 = genericClass in let final core::int* #t127 = 1 in let final void #t128 = self::GenericExtension|set#setter<core::int*>(#t126, #t127) in #t127);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.modular.expect
new file mode 100644
index 0000000..9811ed6
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
+//  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
+//   expect(null, GenericExtension<double>(genericClass).setter = null);
+//                                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+  set setter = self::GenericExtension|set#setter;
+}
+static method GenericExtension|set#setter<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|set#setter::T*>* #this, self::GenericExtension|set#setter::T* value) → void {}
+static method error() → dynamic {
+  self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
+  self::expect(null, let final self::GenericClass<core::int*>* #t1 = invalid-expression "pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
+ - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
+  expect(null, GenericExtension<double>(genericClass).setter = null);
+                                        ^" in genericClass as{TypeError} self::GenericClass<core::double*>* in let final Null #t2 = null in let final void #t3 = self::GenericExtension|set#setter<core::double*>(#t1, #t2) in #t2);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/external.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/external.dart.weak.modular.expect
new file mode 100644
index 0000000..f9c3590
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/external.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension Extension<T extends core::num> on core::List<T> {
+  get field = self::Extension|get#field;
+  set field = self::Extension|set#field;
+  static get staticField = get self::Extension|staticField;
+  static set staticField = set self::Extension|staticField;
+  get finalField = self::Extension|get#finalField;
+  static get staticFinalField = get self::Extension|staticFinalField;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  static method staticMethod = self::Extension|staticMethod;
+  get getter = self::Extension|get#getter;
+  static get staticGetter = get self::Extension|staticGetter;
+  get property = self::Extension|get#property;
+  static get staticProperty = get self::Extension|staticProperty;
+  get fieldSetter = self::Extension|get#fieldSetter;
+  static get staticFieldSetter = get self::Extension|staticFieldSetter;
+  set setter = self::Extension|set#setter;
+  static set staticSetter = set self::Extension|staticSetter;
+  set property = self::Extension|set#property;
+  static set staticProperty = set self::Extension|staticProperty;
+  set fieldSetter = self::Extension|set#fieldSetter;
+  static set staticFieldSetter = set self::Extension|staticFieldSetter;
+}
+external static method Extension|get#field<T extends core::num>(core::List<self::Extension|get#field::T> #this) → self::Extension|get#field::T;
+external static method Extension|set#field<T extends core::num>(core::List<self::Extension|set#field::T> #this, self::Extension|set#field::T #externalFieldValue) → void;
+external static get Extension|staticField() → core::int;
+external static set Extension|staticField(core::int #externalFieldValue) → void;
+external static method Extension|get#finalField<T extends core::num>(core::List<self::Extension|get#finalField::T> #this) → self::Extension|get#finalField::T;
+external static get Extension|staticFinalField() → core::int;
+external static method Extension|method<T extends core::num>(lowered final core::List<self::Extension|method::T> #this) → self::Extension|method::T;
+static method Extension|get#method<T extends core::num>(lowered final core::List<self::Extension|get#method::T> #this) → () → self::Extension|get#method::T
+  return () → self::Extension|get#method::T => self::Extension|method<self::Extension|get#method::T>(#this);
+external static method Extension|staticMethod() → core::int;
+external static method Extension|get#getter<T extends core::num>(lowered final core::List<self::Extension|get#getter::T> #this) → self::Extension|get#getter::T;
+external static get Extension|staticGetter() → core::int;
+external static method Extension|set#setter<T extends core::num>(lowered final core::List<self::Extension|set#setter::T> #this, self::Extension|set#setter::T value) → void;
+external static set Extension|staticSetter(core::int value) → void;
+external static method Extension|get#property<T extends core::num>(lowered final core::List<self::Extension|get#property::T> #this) → self::Extension|get#property::T;
+external static method Extension|set#property<T extends core::num>(lowered final core::List<self::Extension|set#property::T> #this, self::Extension|set#property::T value) → void;
+external static get Extension|staticProperty() → core::int;
+external static set Extension|staticProperty(core::int value) → void;
+external static method Extension|get#fieldSetter<T extends core::num>(core::List<self::Extension|get#fieldSetter::T> #this) → self::Extension|get#fieldSetter::T;
+external static method Extension|set#fieldSetter<T extends core::num>(lowered final core::List<self::Extension|set#fieldSetter::T> #this, self::Extension|set#fieldSetter::T value) → void;
+external static get Extension|staticFieldSetter() → core::int;
+external static set Extension|staticFieldSetter(core::int value) → void;
+static method test() → dynamic {
+  core::List<core::int> list = <core::int>[];
+  core::int value = self::Extension|get#field<core::int>(list);
+  self::Extension|set#field<core::int>(list, value);
+  value = self::Extension|get#finalField<core::int>(list);
+  value = self::Extension|method<core::int>(list);
+  value = self::Extension|get#getter<core::int>(list);
+  self::Extension|set#setter<core::int>(list, value);
+  value = self::Extension|get#property<core::int>(list);
+  self::Extension|set#property<core::int>(list, value);
+  value = self::Extension|get#fieldSetter<core::int>(list);
+  self::Extension|set#fieldSetter<core::int>(list, value);
+  core::List<core::int> iterable = list;
+  core::num n = self::Extension|get#field<core::num>(iterable);
+  self::Extension|set#field<core::num>(iterable, n);
+  n = self::Extension|get#finalField<core::num>(iterable);
+  n = self::Extension|method<core::num>(iterable);
+  n = self::Extension|get#getter<core::num>(iterable);
+  self::Extension|set#setter<core::num>(iterable, n);
+  n = self::Extension|get#property<core::num>(iterable);
+  self::Extension|set#property<core::num>(iterable, n);
+  n = self::Extension|get#fieldSetter<core::num>(iterable);
+  self::Extension|set#fieldSetter<core::num>(iterable, n);
+  value = self::Extension|staticField;
+  self::Extension|staticField = value;
+  value = self::Extension|staticFinalField;
+  value = self::Extension|staticMethod();
+  value = self::Extension|staticGetter;
+  self::Extension|staticSetter = value;
+  value = self::Extension|staticProperty;
+  self::Extension|staticProperty = value;
+  value = self::Extension|staticFieldSetter;
+  self::Extension|staticFieldSetter = value;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..47243334
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+}
+static method Extension|method<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final self::Class<self::Extension|method::T*>* #this, self::Extension|method::T* t) → self::Extension|method::R*
+  return null;
+static method Extension|get#method<T extends core::Object* = dynamic>(lowered final self::Class<self::Extension|get#method::T*>* #this) → <R extends core::Object* = dynamic>(self::Extension|get#method::T*) →* R*
+  return <R extends core::Object* = dynamic>(self::Extension|get#method::T* t) → R* => self::Extension|method<self::Extension|get#method::T*, R*>(#this, t);
+static method main() → dynamic {
+  let final dynamic #t1 = self::Extension|method<core::int*, dynamic>(new self::Class::•<core::int*>(), 0) in #t1 == null ?{core::String*} null : #t1.{core::Object::toString}(){() →* core::String*};
+}
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.modular.expect
new file mode 100644
index 0000000..6666d8f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.weak.modular.expect
@@ -0,0 +1,147 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:30:15: Error: The getter 'm2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm2'.
+//   expect(0, c.m2);
+//               ^^
+//
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:31:5: Error: The setter 'm1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm1'.
+//   c.m1 = 2;
+//     ^^
+//
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.m3;
+//     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+//   void set m3(int x) {}
+//            ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+//   int get m3 => 0;
+//           ^^
+//
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.m3 = 2;
+//     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+//   void set m3(int x) {}
+//            ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+//   int get m3 => 0;
+//           ^^
+//
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.m4;
+//     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+//   int get m4 => 0;
+//           ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+//   void set m4(int x) {}
+//            ^^
+//
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.m4 = 2;
+//     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+//   int get m4 => 0;
+//           ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+//   void set m4(int x) {}
+//            ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  get m1() → core::int*
+    return 0;
+  set m2(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension0 on self::Class* {
+  get m2 = self::Extension0|get#m2;
+  get m4 = self::Extension0|get#m4;
+  set m1 = self::Extension0|set#m1;
+  set m3 = self::Extension0|set#m3;
+}
+extension Extension1 on self::Class* {
+  get m3 = self::Extension1|get#m3;
+  set m4 = self::Extension1|set#m4;
+}
+static method Extension0|set#m1(lowered final self::Class* #this, core::int* x) → void {}
+static method Extension0|get#m2(lowered final self::Class* #this) → core::int*
+  return 0;
+static method Extension0|set#m3(lowered final self::Class* #this, core::int* x) → void {}
+static method Extension0|get#m4(lowered final self::Class* #this) → core::int*
+  return 0;
+static method Extension1|get#m3(lowered final self::Class* #this) → core::int*
+  return 0;
+static method Extension1|set#m4(lowered final self::Class* #this, core::int* x) → void {}
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  self::expect(0, c.{self::Class::m1}{core::int*});
+  c.{self::Class::m2} = 2;
+}
+static method errors() → dynamic {
+  self::Class* c = new self::Class::•();
+  self::expect(0, invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:30:15: Error: The getter 'm2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'm2'.
+  expect(0, c.m2);
+              ^^" in c{<unresolved>}.m2);
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:31:5: Error: The setter 'm1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'm1'.
+  c.m1 = 2;
+    ^^" in c{<unresolved>}.m1 = 2;
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.m3;
+    ^^" in c{<unresolved>}.m3;
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.m3 = 2;
+    ^^" in c{<unresolved>}.m3 = 2;
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.m4;
+    ^^" in c{<unresolved>}.m4;
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.m4 = 2;
+    ^^" in c{<unresolved>}.m4 = 2;
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/if_null.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/if_null.dart.weak.modular.expect
new file mode 100644
index 0000000..34aa9aa
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/if_null.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int* field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  get property = self::Extension|get#property;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method Extension|set#property(lowered final self::Class* #this, core::int* value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|method(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method Extension|get#method(lowered final self::Class* #this) → () →* core::int*
+  return () → core::int* => self::Extension|method(#this);
+static method main() → dynamic {
+  self::Class* c;
+  let final core::int* #t1 = let final self::Class* #t2 = c in #t2 == null ?{core::int*} null : self::Extension|get#property(#t2) in #t1 == null ?{core::int*} 0 : #t1;
+  let final core::int* #t3 = let final self::Class* #t4 = c in #t4 == null ?{core::int*} null : self::Extension|get#property(#t4) in #t3 == null ?{core::int*} 0 : #t3;
+  let final self::Class* #t5 = c in #t5 == null ?{core::int*} null : self::Extension|set#property(#t5, let final core::int* #t6 = 42 in #t6 == null ?{core::int*} 0 : #t6);
+  let final self::Class* #t7 = c in #t7 == null ?{core::int*} null : self::Extension|set#property(#t7, let final core::int* #t8 = 42 in #t8 == null ?{core::int*} 0 : #t8);
+  let final core::int* #t9 = let final self::Class* #t10 = c in #t10 == null ?{core::int*} null : let final core::int* #t11 = 42 in let final void #t12 = self::Extension|set#property(#t10, #t11) in #t11 in #t9 == null ?{core::int*} 0 : #t9;
+  let final core::int* #t13 = let final self::Class* #t14 = c in #t14 == null ?{core::int*} null : let final core::int* #t15 = 42 in let final void #t16 = self::Extension|set#property(#t14, #t15) in #t15 in #t13 == null ?{core::int*} 0 : #t13;
+  let final core::int* #t17 = let final self::Class* #t18 = c in #t18 == null ?{core::int*} null : self::Extension|method(#t18) in #t17 == null ?{core::int*} 0 : #t17;
+  let final core::int* #t19 = let final self::Class* #t20 = c in #t20 == null ?{core::int*} null : self::Extension|method(#t20) in #t19 == null ?{core::int*} 0 : #t19;
+  c = new self::Class::•();
+  let final core::int* #t21 = self::Extension|get#property(c) in #t21 == null ?{core::int*} 0 : #t21;
+  let final core::int* #t22 = self::Extension|get#property(c) in #t22 == null ?{core::int*} 0 : #t22;
+}
diff --git a/pkg/front_end/testcases/extensions/implicit_extension_inference.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/implicit_extension_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..68819f0
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_extension_inference.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+  get property = self::GenericExtension|get#property;
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+  method genericMethod1 = self::GenericExtension|genericMethod1;
+  tearoff genericMethod1 = self::GenericExtension|get#genericMethod1;
+}
+static method GenericExtension|get#property<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
+  return null;
+static method GenericExtension|method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T*>* #this, self::GenericExtension|method::T* t) → self::GenericExtension|method::T*
+  return null;
+static method GenericExtension|get#method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T*>* #this) → (self::GenericExtension|get#method::T*) →* self::GenericExtension|get#method::T*
+  return (self::GenericExtension|get#method::T* t) → self::GenericExtension|get#method::T* => self::GenericExtension|method<self::GenericExtension|get#method::T*>(#this, t);
+static method GenericExtension|genericMethod1<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|genericMethod1::T*>* #this, self::GenericExtension|genericMethod1::S* s) → self::GenericExtension|genericMethod1::S*
+  return null;
+static method GenericExtension|get#genericMethod1<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#genericMethod1::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* S*
+  return <S extends core::Object* = dynamic>(S* s) → S* => self::GenericExtension|genericMethod1<self::GenericExtension|get#genericMethod1::T*, S*>(#this, s);
+static method main() → dynamic {
+  self::A* aVariable;
+  self::C* cVariable;
+  self::GenericClass<self::A*>* aClass;
+  self::GenericClass<self::B*>* bClass;
+  self::GenericClass<self::C*>* cClass;
+  cVariable = self::GenericExtension|get#property<self::A*>(aClass) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|get#property<self::B*>(bClass) as{TypeError} self::C*;
+  aVariable = self::GenericExtension|get#property<self::C*>(cClass);
+  cVariable = self::GenericExtension|method<self::A*>(aClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|method<self::B*>(bClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  aVariable = self::GenericExtension|method<self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(aClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::A*>(aClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::B*>(aClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::A*, self::C*>(aClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(bClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::A*>(bClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::B*>(bClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::B*, self::C*>(bClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::A*>(cClass, aVariable) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::B*>(cClass, aVariable as{TypeError} self::B*) as{TypeError} self::C*;
+  cVariable = self::GenericExtension|genericMethod1<self::C*, self::C*>(cClass, aVariable as{TypeError} self::C*);
+}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.modular.expect
new file mode 100644
index 0000000..9328ef6
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field core::Object* field = null;
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension A2 on self::A1* {
+  method method2 = self::A2|method2;
+  tearoff method2 = self::A2|get#method2;
+  method method3 = self::A2|method3;
+  tearoff method3 = self::A2|get#method3;
+  method method4 = self::A2|method4;
+  tearoff method4 = self::A2|get#method4;
+}
+static method A2|method2(lowered final self::A1* #this) → void
+  return #this.{self::A1::method1}(){() →* void};
+static method A2|get#method2(lowered final self::A1* #this) → () →* void
+  return () → void => self::A2|method2(#this);
+static method A2|method3(lowered final self::A1* #this) → core::Object*
+  return #this.{self::A1::field}{core::Object*};
+static method A2|get#method3(lowered final self::A1* #this) → () →* core::Object*
+  return () → core::Object* => self::A2|method3(#this);
+static method A2|method4(lowered final self::A1* #this, core::Object* o) → void {
+  #this.{self::A1::field} = o;
+}
+static method A2|get#method4(lowered final self::A1* #this) → (core::Object*) →* void
+  return (core::Object* o) → void => self::A2|method4(#this, o);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.modular.expect
new file mode 100644
index 0000000..216ab75
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_from_dill/main.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+
+static method main() → dynamic {
+  mai::Extension|set#instanceProperty(0, mai::Extension|get#instanceProperty(1));
+  mai::Extension|instanceMethod(2);
+  mai::Extension|get#instanceMethod(3);
+  mai::Extension|staticField = #C1;
+  mai::Extension|set#instanceProperty(3, mai::Extension|staticFinalField);
+  mai::Extension|staticProperty = mai::Extension|staticProperty;
+  mai::Extension|staticMethod();
+  #C2;
+}
+
+constants  {
+  #C1 = 42
+  #C2 = static-tearoff mai::Extension|staticMethod
+}
diff --git a/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.modular.expect
new file mode 100644
index 0000000..0b2f376
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/import_via_prefix.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "import_via_prefix_lib.dart" as imp;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///import_via_prefix_lib.dart" as prefix;
+
+static method main() → dynamic {
+  self::expect(3, imp::Extension|method("foo"));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as imp;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+  method method = imp::Extension|method;
+  tearoff method = imp::Extension|get#method;
+}
+static method Extension|method(lowered final core::String* #this) → core::int*
+  return #this.{core::String::length}{core::int*};
+static method Extension|get#method(lowered final core::String* #this) → () →* core::int*
+  return () → core::int* => imp::Extension|method(#this);
diff --git a/pkg/front_end/testcases/extensions/index.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/index.dart.weak.modular.expect
new file mode 100644
index 0000000..e91fc4b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/index.dart.weak.modular.expect
@@ -0,0 +1,123 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class MapLike<K extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object {
+  final field core::Map<self::MapLike::K*, self::MapLike::V*>* _map = <self::MapLike::K*, self::MapLike::V*>{};
+  synthetic constructor •() → self::MapLike<self::MapLike::K*, self::MapLike::V*>*
+    : super core::Object::•()
+    ;
+  method get(core::Object* key) → self::MapLike::V*
+    return this.{self::MapLike::_map}{core::Map<self::MapLike::K*, self::MapLike::V*>*}.{core::Map::[]}(key){(core::Object*) →* self::MapLike::V*};
+  method put(covariant-by-class self::MapLike::K* key, covariant-by-class self::MapLike::V* value) → self::MapLike::V*
+    return let final core::Map<self::MapLike::K*, self::MapLike::V*>* #t1 = this.{self::MapLike::_map}{core::Map<self::MapLike::K*, self::MapLike::V*>*} in let final self::MapLike::K* #t2 = key in let final self::MapLike::V* #t3 = value in let final void #t4 = #t1.{core::Map::[]=}(#t2, #t3){(self::MapLike::K*, self::MapLike::V*) →* void} in #t3;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension<K extends core::Object* = dynamic, V extends core::Object* = dynamic> on self::MapLike<K*, V*>* {
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+}
+static method Extension|[]<K extends core::Object* = dynamic, V extends core::Object* = dynamic>(lowered final self::MapLike<self::Extension|[]::K*, self::Extension|[]::V*>* #this, core::Object* key) → self::Extension|[]::V*
+  return #this.{self::MapLike::get}(key){(core::Object*) →* self::Extension|[]::V*};
+static method Extension|[]=<K extends core::Object* = dynamic, V extends core::Object* = dynamic>(lowered final self::MapLike<self::Extension|[]=::K*, self::Extension|[]=::V*>* #this, self::Extension|[]=::K* key, self::Extension|[]=::V* value) → void
+  return #this.{self::MapLike::put}(key, value){(self::Extension|[]=::K*, self::Extension|[]=::V*) →* self::Extension|[]=::V*};
+static method main() → dynamic {
+  self::implicit();
+  self::explicitWithTypeArguments();
+  self::explicitInferredTypeArguments();
+}
+static method implicit() → dynamic {
+  self::MapLike<core::int*, core::String*>* map1 = new self::MapLike::•<core::int*, core::String*>();
+  self::expect(null, self::Extension|[]<core::int*, core::String*>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int*, core::String*) →* core::String*};
+  self::expect("0", self::Extension|[]<core::int*, core::String*>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::Extension|[]=<core::int*, core::String*>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int*, core::String*>* #t5 = map1 in let final core::int* #t6 = 1 in let final core::String* #t7 = "2" in let final void #t8 = self::Extension|[]=<core::int*, core::String*>(#t5, #t6, #t7) in #t7);
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  let final self::MapLike<core::int*, core::String*>* #t9 = map1 in let final core::int* #t10 = 1 in self::Extension|[]<core::int*, core::String*>(#t9, #t10) == null ?{core::String*} self::Extension|[]=<core::int*, core::String*>(#t9, #t10, "3") : null;
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int*, core::String*>* #t11 = map1 in let final core::int* #t12 = 1 in let final core::String* #t13 = self::Extension|[]<core::int*, core::String*>(#t11, #t12) in #t13 == null ?{core::String*} let final core::String* #t14 = "4" in let final void #t15 = self::Extension|[]=<core::int*, core::String*>(#t11, #t12, #t14) in #t14 : #t13);
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  let final self::MapLike<core::int*, core::String*>* #t16 = map1 in let final core::int* #t17 = 2 in self::Extension|[]<core::int*, core::String*>(#t16, #t17) == null ?{core::String*} self::Extension|[]=<core::int*, core::String*>(#t16, #t17, "2") : null;
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int*, core::String*>* #t18 = map1 in let final core::int* #t19 = 3 in let final core::String* #t20 = self::Extension|[]<core::int*, core::String*>(#t18, #t19) in #t20 == null ?{core::String*} let final core::String* #t21 = "3" in let final void #t22 = self::Extension|[]=<core::int*, core::String*>(#t18, #t19, #t21) in #t21 : #t20);
+  self::expect("3", self::Extension|[]<core::int*, core::String*>(map1, 3));
+  self::MapLike<core::int*, core::int*>* map2 = new self::MapLike::•<core::int*, core::int*>();
+  self::expect(1, let final self::MapLike<core::int*, core::int*>* #t23 = map2 in let final core::int* #t24 = 0 in let final core::int* #t25 = 1 in let final void #t26 = self::Extension|[]=<core::int*, core::int*>(#t23, #t24, #t25) in #t25);
+  self::expect(3, let final self::MapLike<core::int*, core::int*>* #t27 = map2 in let final core::int* #t28 = 0 in let final core::int* #t29 = self::Extension|[]<core::int*, core::int*>(#t27, #t28).{core::num::+}(2){(core::num*) →* core::int*} in let final void #t30 = self::Extension|[]=<core::int*, core::int*>(#t27, #t28, #t29) in #t29);
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t31 = map2 in let final core::int* #t32 = 0 in let final core::int* #t33 = self::Extension|[]<core::int*, core::int*>(#t31, #t32).{core::num::+}(2){(core::num*) →* core::int*} in let final void #t34 = self::Extension|[]=<core::int*, core::int*>(#t31, #t32, #t33) in #t33);
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t35 = map2 in let final core::int* #t36 = 0 in let final core::int* #t37 = self::Extension|[]<core::int*, core::int*>(#t35, #t36) in let final void #t38 = self::Extension|[]=<core::int*, core::int*>(#t35, #t36, #t37.{core::num::+}(1){(core::num*) →* core::int*}) in #t37);
+  self::expect(6, self::Extension|[]<core::int*, core::int*>(map2, 0));
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t39 = map2 in let final core::int* #t40 = 0 in let final core::int* #t41 = self::Extension|[]<core::int*, core::int*>(#t39, #t40).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t42 = self::Extension|[]=<core::int*, core::int*>(#t39, #t40, #t41) in #t41);
+  self::expect(5, self::Extension|[]<core::int*, core::int*>(map2, 0));
+}
+static method explicitWithTypeArguments() → dynamic {
+  self::MapLike<core::int*, core::String*>* map1 = new self::MapLike::•<core::int*, core::String*>();
+  self::expect(null, self::Extension|[]<core::int*, core::String*>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int*, core::String*) →* core::String*};
+  self::expect("0", self::Extension|[]<core::int*, core::String*>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::Extension|[]=<core::int*, core::String*>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int*, core::String*>* #t43 = map1 in let final core::String* #t44 = "2" in let final void #t45 = self::Extension|[]=<core::int*, core::String*>(#t43, 1, #t44) in #t44);
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  let final self::MapLike<core::int*, core::String*>* #t46 = map1 in let final core::int* #t47 = 1 in self::Extension|[]<core::int*, core::String*>(#t46, #t47) == null ?{core::String*} self::Extension|[]=<core::int*, core::String*>(#t46, #t47, "3") : null;
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int*, core::String*>* #t48 = map1 in let final core::int* #t49 = 1 in let final core::String* #t50 = self::Extension|[]<core::int*, core::String*>(#t48, #t49) in #t50 == null ?{core::String*} let final core::String* #t51 = "4" in let final void #t52 = self::Extension|[]=<core::int*, core::String*>(#t48, #t49, #t51) in #t51 : #t50);
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  let final self::MapLike<core::int*, core::String*>* #t53 = map1 in let final core::int* #t54 = 2 in self::Extension|[]<core::int*, core::String*>(#t53, #t54) == null ?{core::String*} self::Extension|[]=<core::int*, core::String*>(#t53, #t54, "2") : null;
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int*, core::String*>* #t55 = map1 in let final core::int* #t56 = 3 in let final core::String* #t57 = self::Extension|[]<core::int*, core::String*>(#t55, #t56) in #t57 == null ?{core::String*} let final core::String* #t58 = "3" in let final void #t59 = self::Extension|[]=<core::int*, core::String*>(#t55, #t56, #t58) in #t58 : #t57);
+  self::expect("3", self::Extension|[]<core::int*, core::String*>(map1, 3));
+  self::MapLike<core::int*, core::int*>* map2 = new self::MapLike::•<core::int*, core::int*>();
+  self::expect(1, let final self::MapLike<core::int*, core::int*>* #t60 = map2 in let final core::int* #t61 = 1 in let final void #t62 = self::Extension|[]=<core::int*, core::int*>(#t60, 0, #t61) in #t61);
+  self::expect(3, let final self::MapLike<core::int*, core::int*>* #t63 = map2 in let final core::int* #t64 = 0 in let final core::int* #t65 = self::Extension|[]<core::int*, core::int*>(#t63, #t64).{core::num::+}(2){(core::num*) →* core::int*} in let final void #t66 = self::Extension|[]=<core::int*, core::int*>(#t63, #t64, #t65) in #t65);
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t67 = map2 in let final core::int* #t68 = 0 in let final core::int* #t69 = self::Extension|[]<core::int*, core::int*>(#t67, #t68).{core::num::+}(2){(core::num*) →* core::int*} in let final void #t70 = self::Extension|[]=<core::int*, core::int*>(#t67, #t68, #t69) in #t69);
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t71 = map2 in let final core::int* #t72 = 0 in let final core::int* #t73 = self::Extension|[]<core::int*, core::int*>(#t71, #t72) in let final void #t74 = self::Extension|[]=<core::int*, core::int*>(#t71, #t72, #t73.{core::num::+}(1){(core::num*) →* core::int*}) in #t73);
+  self::expect(6, self::Extension|[]<core::int*, core::int*>(map2, 0));
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t75 = map2 in let final core::int* #t76 = 0 in let final core::int* #t77 = self::Extension|[]<core::int*, core::int*>(#t75, #t76).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t78 = self::Extension|[]=<core::int*, core::int*>(#t75, #t76, #t77) in #t77);
+  self::expect(5, self::Extension|[]<core::int*, core::int*>(map2, 0));
+}
+static method explicitInferredTypeArguments() → dynamic {
+  self::MapLike<core::int*, core::String*>* map1 = new self::MapLike::•<core::int*, core::String*>();
+  self::expect(null, self::Extension|[]<core::int*, core::String*>(map1, 0));
+  map1.{self::MapLike::put}(0, "0"){(core::int*, core::String*) →* core::String*};
+  self::expect("0", self::Extension|[]<core::int*, core::String*>(map1, 0));
+  self::expect(null, self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::Extension|[]=<core::int*, core::String*>(map1, 1, "1");
+  self::expect("1", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int*, core::String*>* #t79 = map1 in let final core::String* #t80 = "2" in let final void #t81 = self::Extension|[]=<core::int*, core::String*>(#t79, 1, #t80) in #t80);
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  let final self::MapLike<core::int*, core::String*>* #t82 = map1 in let final core::int* #t83 = 1 in self::Extension|[]<core::int*, core::String*>(#t82, #t83) == null ?{core::String*} self::Extension|[]=<core::int*, core::String*>(#t82, #t83, "3") : null;
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  self::expect("2", let final self::MapLike<core::int*, core::String*>* #t84 = map1 in let final core::int* #t85 = 1 in let final core::String* #t86 = self::Extension|[]<core::int*, core::String*>(#t84, #t85) in #t86 == null ?{core::String*} let final core::String* #t87 = "4" in let final void #t88 = self::Extension|[]=<core::int*, core::String*>(#t84, #t85, #t87) in #t87 : #t86);
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 1));
+  let final self::MapLike<core::int*, core::String*>* #t89 = map1 in let final core::int* #t90 = 2 in self::Extension|[]<core::int*, core::String*>(#t89, #t90) == null ?{core::String*} self::Extension|[]=<core::int*, core::String*>(#t89, #t90, "2") : null;
+  self::expect("2", self::Extension|[]<core::int*, core::String*>(map1, 2));
+  self::expect("3", let final self::MapLike<core::int*, core::String*>* #t91 = map1 in let final core::int* #t92 = 3 in let final core::String* #t93 = self::Extension|[]<core::int*, core::String*>(#t91, #t92) in #t93 == null ?{core::String*} let final core::String* #t94 = "3" in let final void #t95 = self::Extension|[]=<core::int*, core::String*>(#t91, #t92, #t94) in #t94 : #t93);
+  self::expect("3", self::Extension|[]<core::int*, core::String*>(map1, 3));
+  self::MapLike<core::int*, core::int*>* map2 = new self::MapLike::•<core::int*, core::int*>();
+  self::expect(1, let final self::MapLike<core::int*, core::int*>* #t96 = map2 in let final core::int* #t97 = 1 in let final void #t98 = self::Extension|[]=<core::int*, core::int*>(#t96, 0, #t97) in #t97);
+  self::expect(3, let final self::MapLike<core::int*, core::int*>* #t99 = map2 in let final core::int* #t100 = 0 in let final core::int* #t101 = self::Extension|[]<core::int*, core::int*>(#t99, #t100).{core::num::+}(2){(core::num*) →* core::int*} in let final void #t102 = self::Extension|[]=<core::int*, core::int*>(#t99, #t100, #t101) in #t101);
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t103 = map2 in let final core::int* #t104 = 0 in let final core::int* #t105 = self::Extension|[]<core::int*, core::int*>(#t103, #t104).{core::num::+}(2){(core::num*) →* core::int*} in let final void #t106 = self::Extension|[]=<core::int*, core::int*>(#t103, #t104, #t105) in #t105);
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t107 = map2 in let final core::int* #t108 = 0 in let final core::int* #t109 = self::Extension|[]<core::int*, core::int*>(#t107, #t108) in let final void #t110 = self::Extension|[]=<core::int*, core::int*>(#t107, #t108, #t109.{core::num::+}(1){(core::num*) →* core::int*}) in #t109);
+  self::expect(6, self::Extension|[]<core::int*, core::int*>(map2, 0));
+  self::expect(5, let final self::MapLike<core::int*, core::int*>* #t111 = map2 in let final core::int* #t112 = 0 in let final core::int* #t113 = self::Extension|[]<core::int*, core::int*>(#t111, #t112).{core::num::-}(1){(core::num*) →* core::int*} in let final void #t114 = self::Extension|[]=<core::int*, core::int*>(#t111, #t112, #t113) in #t113);
+  self::expect(5, self::Extension|[]<core::int*, core::int*>(map2, 0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/instance_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/instance_access.dart.weak.modular.expect
new file mode 100644
index 0000000..215028e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_access.dart.weak.modular.expect
@@ -0,0 +1,147 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::Class1*
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return "Class1(${this.{self::Class1::field}{core::int*}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::Class2*
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return "Class2(${this.{self::Class2::field}{core::int*}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension1 on self::Class1* {
+  method method = self::Extension1|method;
+  tearoff method = self::Extension1|get#method;
+  method genericMethod = self::Extension1|genericMethod;
+  tearoff genericMethod = self::Extension1|get#genericMethod;
+  get property = self::Extension1|get#property;
+  set property = self::Extension1|set#property;
+}
+extension Extension2 on self::Class2* {
+  method method = self::Extension2|method;
+  tearoff method = self::Extension2|get#method;
+  method genericMethod = self::Extension2|genericMethod;
+  tearoff genericMethod = self::Extension2|get#genericMethod;
+  get property = self::Extension2|get#property;
+  set property = self::Extension2|set#property;
+}
+static method Extension1|method(lowered final self::Class1* #this) → core::int* {
+  core::print("Extension1.method on ${#this}");
+  return #this.{self::Class1::field}{core::int*};
+}
+static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
+  return () → core::int* => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
+  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+}
+static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension1|get#property(lowered final self::Class1* #this) → core::int* {
+  core::print("Extension1.property get on ${#this}");
+  return #this.{self::Class1::field}{core::int*};
+}
+static method Extension1|set#property(lowered final self::Class1* #this, core::int* value) → void {
+  #this.{self::Class1::field} = value;
+  core::print("Extension1.property set(${value}) on ${#this}");
+  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+}
+static method Extension2|method(lowered final self::Class2* #this) → core::int* {
+  core::print("Extension2.method on ${#this}");
+  return #this.{self::Class2::field}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*};
+}
+static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
+  return () → core::int* => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
+  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(4){(core::num*) →* core::num*} as{TypeError} core::int*;
+}
+static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method Extension2|get#property(lowered final self::Class2* #this) → core::int* {
+  core::print("Extension2.property get on ${#this}");
+  return #this.{self::Class2::field}{core::int*}.{core::num::+}(5){(core::num*) →* core::int*};
+}
+static method Extension2|set#property(lowered final self::Class2* #this, core::int* value) → void {
+  core::print("Extension2.property set(${value}) on ${#this}");
+  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  #this.{self::Class2::field} = value;
+}
+static method main() → dynamic {
+  self::testExtension1();
+  self::testExtension2();
+}
+static method testExtension1() → dynamic {
+  self::Class1* c0 = new self::Class1::•(0);
+  self::Class1* c1 = new self::Class1::•(1);
+  self::expect(0, self::Extension1|method(c0));
+  self::expect(1, self::Extension1|method(c1));
+  self::expect(1, let final self::Class1* #t1 = c1 in #t1 == null ?{core::int*} null : self::Extension1|method(#t1));
+  self::expect(42, self::Extension1|genericMethod<core::int*>(c0, 42));
+  self::expect(43, self::Extension1|genericMethod<core::num*>(c0, 43));
+  self::expect(88, self::Extension1|genericMethod<core::int*>(c1, 87));
+  self::expect(89, self::Extension1|genericMethod<core::num*>(c1, 88));
+  self::expect(0, self::Extension1|get#property(c0));
+  self::expect(0, let final self::Class1* #t2 = c0 in #t2 == null ?{core::int*} null : self::Extension1|get#property(#t2));
+  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::Extension1|set#property(c0, #t3) in #t3);
+  self::expect(1, self::Extension1|get#property(c1));
+  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::Extension1|set#property(c0, #t5) in #t5);
+  self::expect(27, let final core::int* #t7 = let final core::int* #t8 = 27 in let final void #t9 = self::Extension1|set#property(c1, #t8) in #t8 in let final void #t10 = self::Extension1|set#property(c0, #t7) in #t7);
+  self::expect(37, let final core::int* #t11 = let final core::int* #t12 = 37 in let final void #t13 = self::Extension1|set#property(c0, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(c1, #t11) in #t11);
+  self::expect(77, let final core::int* #t15 = let final core::int* #t16 = let final core::int* #t17 = 77 in let final void #t18 = self::Extension1|set#property(c1, #t17) in #t17 in let final void #t19 = self::Extension1|set#property(c0, #t16) in #t16 in let final void #t20 = self::Extension1|set#property(c1, #t15) in #t15);
+  self::expect(67, let final core::int* #t21 = let final core::int* #t22 = let final core::int* #t23 = 67 in let final void #t24 = self::Extension1|set#property(c0, #t23) in #t23 in let final void #t25 = self::Extension1|set#property(c1, #t22) in #t22 in let final void #t26 = self::Extension1|set#property(c0, #t21) in #t21);
+}
+static method testExtension2() → dynamic {
+  self::Class2* c0 = new self::Class2::•(0);
+  self::Class2* c1 = new self::Class2::•(1);
+  self::expect(3, self::Extension2|method(c0));
+  self::expect(3, let final self::Class2* #t27 = c0 in #t27 == null ?{core::int*} null : self::Extension2|method(#t27));
+  self::expect(4, self::Extension2|method(c1));
+  self::expect(46, self::Extension2|genericMethod<core::int*>(c0, 42));
+  self::expect(47, self::Extension2|genericMethod<core::num*>(c0, 43));
+  self::expect(92, self::Extension2|genericMethod<core::int*>(c1, 87));
+  self::expect(93, self::Extension2|genericMethod<core::num*>(c1, 88));
+  self::expect(5, self::Extension2|get#property(c0));
+  self::expect(5, let final self::Class2* #t28 = c0 in #t28 == null ?{core::int*} null : self::Extension2|get#property(#t28));
+  self::expect(42, let final core::int* #t29 = 42 in let final void #t30 = self::Extension2|set#property(c0, #t29) in #t29);
+  self::expect(48, self::Extension2|get#property(c0));
+  self::expect(6, self::Extension2|get#property(c1));
+  self::expect(43, let final core::int* #t31 = 43 in let final void #t32 = self::Extension2|set#property(c1, #t31) in #t31);
+  self::expect(49, self::Extension2|get#property(c1));
+  self::expect(49, let final core::int* #t33 = self::Extension2|get#property(c1) in let final void #t34 = self::Extension2|set#property(c0, #t33) in #t33);
+  self::expect(55, let final core::int* #t35 = self::Extension2|get#property(c0) in let final void #t36 = self::Extension2|set#property(c1, #t35) in #t35);
+  self::expect(61, let final core::int* #t37 = let final core::int* #t38 = self::Extension2|get#property(c1) in let final void #t39 = self::Extension2|set#property(c0, #t38) in #t38 in let final void #t40 = self::Extension2|set#property(c1, #t37) in #t37);
+  self::expect(67, let final core::int* #t41 = let final core::int* #t42 = self::Extension2|get#property(c0) in let final void #t43 = self::Extension2|set#property(c1, #t42) in #t42 in let final void #t44 = self::Extension2|set#property(c0, #t41) in #t41);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.modular.expect
new file mode 100644
index 0000000..1dadbb1
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_access_of_static.dart.weak.modular.expect
@@ -0,0 +1,108 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
+//   c.staticMethod();
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
+//   c.staticMethod;
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
+//   c.staticProperty;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
+//   c.staticProperty = 42;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
+//   c.staticField;
+//     ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
+//   c.staticField = 42;
+//     ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension1 on self::Class1* {
+  static method staticMethod = self::Extension1|staticMethod;
+  static get staticProperty = get self::Extension1|staticProperty;
+  static field staticField = self::Extension1|staticField;
+  static set staticProperty = set self::Extension1|staticProperty;
+}
+static field core::int* Extension1|staticField = 42;
+static method Extension1|staticMethod() → dynamic {
+  core::print("Extension1.staticMethod()");
+}
+static get Extension1|staticProperty() → dynamic {
+  core::print("Extension1.staticProperty()");
+}
+static set Extension1|staticProperty(core::int* value) → void {
+  core::print("Extension1.staticProperty(${value})");
+  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+}
+static method main() → dynamic {
+  self::Class1* c = new self::Class1::•();
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:26:5: Error: The method 'staticMethod' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'staticMethod'.
+  c.staticMethod();
+    ^^^^^^^^^^^^" in c{<unresolved>}.staticMethod();
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:27:5: Error: The getter 'staticMethod' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticMethod'.
+  c.staticMethod;
+    ^^^^^^^^^^^^" in c{<unresolved>}.staticMethod;
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:28:5: Error: The getter 'staticProperty' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticProperty'.
+  c.staticProperty;
+    ^^^^^^^^^^^^^^" in c{<unresolved>}.staticProperty;
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:29:5: Error: The setter 'staticProperty' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticProperty'.
+  c.staticProperty = 42;
+    ^^^^^^^^^^^^^^" in c{<unresolved>}.staticProperty = 42;
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:30:5: Error: The getter 'staticField' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'staticField'.
+  c.staticField;
+    ^^^^^^^^^^^" in c{<unresolved>}.staticField;
+  invalid-expression "pkg/front_end/testcases/extensions/instance_access_of_static.dart:31:5: Error: The setter 'staticField' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/extensions/instance_access_of_static.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticField'.
+  c.staticField = 42;
+    ^^^^^^^^^^^" in c{<unresolved>}.staticField = 42;
+}
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/instance_members.dart.weak.modular.expect
new file mode 100644
index 0000000..d189b6d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.weak.modular.expect
@@ -0,0 +1,89 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension A2 on self::A1* {
+  method method1 = self::A2|method1;
+  tearoff method1 = self::A2|get#method1;
+  method method2 = self::A2|method2;
+  tearoff method2 = self::A2|get#method2;
+  method method3 = self::A2|method3;
+  tearoff method3 = self::A2|get#method3;
+  method method4 = self::A2|method4;
+  tearoff method4 = self::A2|get#method4;
+}
+extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+  method method1 = self::B2|method1;
+  tearoff method1 = self::B2|get#method1;
+  method method2 = self::B2|method2;
+  tearoff method2 = self::B2|get#method2;
+}
+static method A2|method1(lowered final self::A1* #this) → self::A1* {
+  return #this;
+}
+static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
+  return () → self::A1* => self::A2|method1(#this);
+static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+  core::print(o);
+  return #this;
+}
+static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
+  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
+static method A2|method3<T extends core::Object* = dynamic>(lowered final self::A1* #this, [self::A2|method3::T* o = #C1]) → self::A1* {
+  core::print(o);
+  return #this;
+}
+static method A2|get#method3(lowered final self::A1* #this) → <T extends core::Object* = dynamic>([T*]) →* self::A1*
+  return <T extends core::Object* = dynamic>([T* o = #C1]) → self::A1* => self::A2|method3<T*>(#this, o);
+static method A2|method4<T extends core::Object* = dynamic>(lowered final self::A1* #this, {self::A2|method4::T* o = #C1}) → self::A1* {
+  core::print(o);
+  return #this;
+}
+static method A2|get#method4(lowered final self::A1* #this) → <T extends core::Object* = dynamic>({o: T*}) →* self::A1*
+  return <T extends core::Object* = dynamic>({T* o = #C1}) → self::A1* => self::A2|method4<T*>(#this, o: o);
+static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
+  return #this;
+}
+static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
+  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
+static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
+  core::print(o);
+  return #this;
+}
+static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
+  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.modular.expect
new file mode 100644
index 0000000..1240994
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_tearoff.dart.weak.modular.expect
@@ -0,0 +1,119 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::Class1*
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return "Class1(${this.{self::Class1::field}{core::int*}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::Class2*
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return "Class2(${this.{self::Class2::field}{core::int*}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension1 on self::Class1* {
+  method method = self::Extension1|method;
+  tearoff method = self::Extension1|get#method;
+  method genericMethod = self::Extension1|genericMethod;
+  tearoff genericMethod = self::Extension1|get#genericMethod;
+}
+extension Extension2 on self::Class2* {
+  method method = self::Extension2|method;
+  tearoff method = self::Extension2|get#method;
+  method genericMethod = self::Extension2|genericMethod;
+  tearoff genericMethod = self::Extension2|get#genericMethod;
+}
+static method Extension1|method(lowered final self::Class1* #this) → core::int* {
+  core::print("Extension1.method on ${#this}");
+  return #this.{self::Class1::field}{core::int*};
+}
+static method Extension1|get#method(lowered final self::Class1* #this) → () →* core::int*
+  return () → core::int* => self::Extension1|method(#this);
+static method Extension1|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::Extension1|genericMethod::T* t) → core::int* {
+  core::print("Extension1.genericMethod<${self::Extension1|genericMethod::T*}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+}
+static method Extension1|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
+static method Extension2|method(lowered final self::Class2* #this) → core::int* {
+  core::print("Extension2.method on ${#this}");
+  return #this.{self::Class2::field}{core::int*}.{core::num::+}(2){(core::num*) →* core::int*};
+}
+static method Extension2|get#method(lowered final self::Class2* #this) → () →* core::int*
+  return () → core::int* => self::Extension2|method(#this);
+static method Extension2|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::Extension2|genericMethod::T* t) → core::int* {
+  core::print("Extension2.genericMethod<${self::Extension2|genericMethod::T*}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(3){(core::num*) →* core::num*} as{TypeError} core::int*;
+}
+static method Extension2|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::Extension2|genericMethod<T*>(#this, t);
+static method main() → dynamic {
+  self::testExtension1();
+  self::testExtension2();
+}
+static method testExtension1() → dynamic {
+  self::Class1* c0 = new self::Class1::•(0);
+  self::Class1* c1 = new self::Class1::•(1);
+  () →* core::int* tearOff0 = self::Extension1|get#method(c0);
+  self::expect(0, tearOff0(){() →* core::int*});
+  c0 = new self::Class1::•(4.{core::int::unary-}(){() →* core::int*});
+  self::expect(0, tearOff0(){() →* core::int*});
+  () →* core::int* tearOff1 = self::Extension1|get#method(c1);
+  self::expect(1, tearOff1(){() →* core::int*});
+  c1 = new self::Class1::•(7.{core::int::unary-}(){() →* core::int*});
+  self::expect(1, tearOff1(){() →* core::int*});
+  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension1|get#genericMethod(c0);
+  self::expect(38, genericTearOff0<core::int*>(42){(core::int*) →* core::int*});
+  self::expect(38, genericTearOff0<core::num*>(42){(core::num*) →* core::int*});
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension1|get#genericMethod(c1);
+  self::expect(35, genericTearOff1<core::int*>(42){(core::int*) →* core::int*});
+  self::expect(35, genericTearOff1<core::num*>(42){(core::num*) →* core::int*});
+}
+static method testExtension2() → dynamic {
+  self::Class2* c0 = new self::Class2::•(0);
+  self::Class2* c1 = new self::Class2::•(1);
+  () →* core::int* tearOff0 = self::Extension2|get#method(c0);
+  self::expect(2, tearOff0(){() →* core::int*});
+  c0 = new self::Class2::•(4.{core::int::unary-}(){() →* core::int*});
+  self::expect(2, tearOff0(){() →* core::int*});
+  () →* core::int* tearOff1 = self::Extension2|get#method(c1);
+  self::expect(3, tearOff1(){() →* core::int*});
+  c1 = new self::Class2::•(7.{core::int::unary-}(){() →* core::int*});
+  self::expect(3, tearOff1(){() →* core::int*});
+  <T extends core::num*>(T*) →* core::int* genericTearOff0 = self::Extension2|get#genericMethod(c0);
+  self::expect(41, genericTearOff0<core::int*>(42){(core::int*) →* core::int*});
+  self::expect(41, genericTearOff0<core::num*>(42){(core::num*) →* core::int*});
+  <T extends core::num*>(T*) →* core::int* genericTearOff1 = self::Extension2|get#genericMethod(c1);
+  self::expect(38, genericTearOff1<core::int*>(42){(core::int*) →* core::int*});
+  self::expect(38, genericTearOff1<core::num*>(42){(core::num*) →* core::int*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.modular.expect
new file mode 100644
index 0000000..80f8e09
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/internal_resolution.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int* field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension _extension#0 on self::Class* {
+  get property1 = self::_extension#0|get#property1;
+  set property1 = self::_extension#0|set#property1;
+}
+extension _extension#1 on self::Class* {
+  get property2 = self::_extension#1|get#property2;
+  set property2 = self::_extension#1|set#property2;
+}
+static method _extension#0|get#property1(lowered final self::Class* #this) → core::int*
+  return self::_extension#1|get#property2(#this);
+static method _extension#0|set#property1(lowered final self::Class* #this, core::int* value) → void
+  return #this.{self::Class::field} = value;
+static method _extension#1|get#property2(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method _extension#1|set#property2(lowered final self::Class* #this, core::int* value) → void
+  return let final core::int* #t1 = value in let final void #t2 = self::_extension#0|set#property1(#this, #t1) in #t1;
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  self::expect(null, self::_extension#0|get#property1(c));
+  self::expect(null, self::_extension#1|get#property2(c));
+  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::_extension#0|set#property1(c, #t3) in #t3);
+  self::expect(42, self::_extension#1|get#property2(c));
+  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::_extension#1|set#property2(c, #t5) in #t5);
+  self::expect(87, self::_extension#0|get#property1(c));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.modular.expect
new file mode 100644
index 0000000..0dd6942
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.weak.modular.expect
@@ -0,0 +1,254 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:23:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   Extension().method(null);
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:24:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   Extension(c1, null).method(null);
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:25:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   Extension(receiver: c1).method(null);
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:26:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   Extension(c1, receiver: null).method(null);
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:27:3: Error: Explicit extension application of extension 'Extension' takes '0' type argument(s).
+//   Extension<int>(c1).method(null);
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Member not found: 'foo'.
+//   Extension(c1).foo;
+//                 ^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:17: Error: Setter not found: 'foo'.
+//   Extension(c1).foo = null;
+//                 ^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
+//   Extension(c1).foo();
+//                 ^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension(c1).method();
+//                 ^
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
+//   method(a) {}
+//   ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   Extension(c1).method(1, 2);
+//                 ^
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
+//   method(a) {}
+//   ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
+//   Extension(c1).method(a: 1);
+//                 ^
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
+//   method(a) {}
+//   ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
+//   Extension(c1).method(1, a: 2);
+//                           ^
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
+//   method(a) {}
+//   ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
+//   Extension(c1).method<int>(null);
+//                 ^
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
+//   method(a) {}
+//   ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   GenericExtension().method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:43:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   GenericExtension<int>().method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:44:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   GenericExtension(c2, null).method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:45:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   GenericExtension<int>(c2, null).method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:46:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   GenericExtension(receiver: c2).method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:47:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   GenericExtension<int>(receiver: c2).method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:48:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   GenericExtension(c2, receiver: null).method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:49:3: Error: Explicit extension application requires exactly 1 positional argument.
+//   GenericExtension<int>(c2, receiver: null).method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:50:3: Error: Explicit extension application of extension 'GenericExtension' takes '1' type argument(s).
+//   GenericExtension<int, String>(c2).method();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
+//   Extension(s).method(null);
+//             ^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
+//  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
+//   GenericExtension(s).method();
+//                    ^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+//  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
+//   GenericExtension<int>(s).method();
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+}
+extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+  method method = self::GenericExtension|method;
+  tearoff method = self::GenericExtension|get#method;
+}
+static method Extension|method(lowered final self::Class* #this, dynamic a) → dynamic {}
+static method Extension|get#method(lowered final self::Class* #this) → (dynamic) →* dynamic
+  return (dynamic a) → dynamic => self::Extension|method(#this, a);
+static method GenericExtension|method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|method::T*>* #this) → dynamic {}
+static method GenericExtension|get#method<T extends core::Object* = dynamic>(lowered final self::GenericClass<self::GenericExtension|get#method::T*>* #this) → () →* dynamic
+  return () → dynamic => self::GenericExtension|method<self::GenericExtension|get#method::T*>(#this);
+static method main() → dynamic {
+  core::String* s = "";
+  self::Class* c1 = new self::Class::•();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:23:3: Error: Explicit extension application requires exactly 1 positional argument.
+  Extension().method(null);
+  ^^^^^^^^^"{dynamic}.method(null);
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:24:3: Error: Explicit extension application requires exactly 1 positional argument.
+  Extension(c1, null).method(null);
+  ^^^^^^^^^"{dynamic}.method(null);
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:25:3: Error: Explicit extension application requires exactly 1 positional argument.
+  Extension(receiver: c1).method(null);
+  ^^^^^^^^^"{dynamic}.method(null);
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:26:3: Error: Explicit extension application requires exactly 1 positional argument.
+  Extension(c1, receiver: null).method(null);
+  ^^^^^^^^^"{dynamic}.method(null);
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:27:3: Error: Explicit extension application of extension 'Extension' takes '0' type argument(s).
+  Extension<int>(c1).method(null);
+  ^^^^^^^^^"{dynamic}.method(null);
+  self::Extension|method(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
+  Extension(s).method(null);
+            ^" in s as{TypeError} self::Class*, null);
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Member not found: 'foo'.
+  Extension(c1).foo;
+                ^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:17: Error: Setter not found: 'foo'.
+  Extension(c1).foo = null;
+                ^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
+  Extension(c1).foo();
+                ^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 1 required, 0 given.
+  Extension(c1).method();
+                ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  Extension(c1).method(1, 2);
+                ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 1 required, 0 given.
+  Extension(c1).method(a: 1);
+                ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
+  Extension(c1).method(1, a: 2);
+                          ^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
+  Extension(c1).method<int>(null);
+                ^";
+  self::GenericClass<core::int*>* c2 = new self::GenericClass::•<core::int*>();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
+  GenericExtension().method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:43:3: Error: Explicit extension application requires exactly 1 positional argument.
+  GenericExtension<int>().method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:44:3: Error: Explicit extension application requires exactly 1 positional argument.
+  GenericExtension(c2, null).method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:45:3: Error: Explicit extension application requires exactly 1 positional argument.
+  GenericExtension<int>(c2, null).method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:46:3: Error: Explicit extension application requires exactly 1 positional argument.
+  GenericExtension(receiver: c2).method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:47:3: Error: Explicit extension application requires exactly 1 positional argument.
+  GenericExtension<int>(receiver: c2).method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:48:3: Error: Explicit extension application requires exactly 1 positional argument.
+  GenericExtension(c2, receiver: null).method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:49:3: Error: Explicit extension application requires exactly 1 positional argument.
+  GenericExtension<int>(c2, receiver: null).method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:50:3: Error: Explicit extension application of extension 'GenericExtension' takes '1' type argument(s).
+  GenericExtension<int, String>(c2).method();
+  ^^^^^^^^^^^^^^^^"{dynamic}.method();
+  self::GenericExtension|method<dynamic>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
+ - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
+  GenericExtension(s).method();
+                   ^" in s as{TypeError} self::GenericClass<dynamic>*);
+  self::GenericExtension|method<core::int*>(invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
+ - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
+  GenericExtension<int>(s).method();
+                        ^" in s as{TypeError} self::GenericClass<core::int*>*);
+}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.modular.expect
new file mode 100644
index 0000000..94d05b9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.weak.modular.expect
@@ -0,0 +1,104 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
+//   Extension(s).method();
+//                ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:19:16: Error: Member not found: 'method'.
+//   Extension(s).method;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:20:16: Error: Setter not found: 'method'.
+//   Extension(s).method = 42;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:21:16: Error: Member not found: 'getter'.
+//   Extension(s).getter;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:22:16: Error: Setter not found: 'getter'.
+//   Extension(s).getter = 42;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:23:16: Error: Member not found: 'setter'.
+//   Extension(s).setter;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:24:16: Error: Setter not found: 'setter'.
+//   Extension(s).setter = 42;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:25:16: Error: Member not found: 'property'.
+//   Extension(s).property;
+//                ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:26:16: Error: Setter not found: 'property'.
+//   Extension(s).property = 42;
+//                ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:27:16: Error: Member not found: 'field'.
+//   Extension(s).field;
+//                ^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:28:16: Error: Setter not found: 'field'.
+//   Extension(s).field = 42;
+//                ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+  static method method = self::Extension|method;
+  static get getter = get self::Extension|getter;
+  static get property = get self::Extension|property;
+  static field field = self::Extension|field;
+  static set setter = set self::Extension|setter;
+  static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static method Extension|method() → dynamic {}
+static get Extension|getter() → dynamic
+  return null;
+static set Extension|setter(dynamic _) → void {}
+static get Extension|property() → dynamic
+  return null;
+static set Extension|property(dynamic _) → void {}
+static method main() → dynamic {}
+static method errors() → dynamic {
+  core::String* s = "";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
+  Extension(s).method();
+               ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:19:16: Error: Member not found: 'method'.
+  Extension(s).method;
+               ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:20:16: Error: Setter not found: 'method'.
+  Extension(s).method = 42;
+               ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:21:16: Error: Member not found: 'getter'.
+  Extension(s).getter;
+               ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:22:16: Error: Setter not found: 'getter'.
+  Extension(s).getter = 42;
+               ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:23:16: Error: Member not found: 'setter'.
+  Extension(s).setter;
+               ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:24:16: Error: Setter not found: 'setter'.
+  Extension(s).setter = 42;
+               ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:25:16: Error: Member not found: 'property'.
+  Extension(s).property;
+               ^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:26:16: Error: Setter not found: 'property'.
+  Extension(s).property = 42;
+               ^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:27:16: Error: Member not found: 'field'.
+  Extension(s).field;
+               ^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:28:16: Error: Setter not found: 'field'.
+  Extension(s).field = 42;
+               ^^^^^";
+}
diff --git a/pkg/front_end/testcases/extensions/issue38600.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38600.dart.weak.modular.expect
new file mode 100644
index 0000000..373bda2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue38600.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:1: Error: Expected 'on' after this.
+// extension try<T> on Class<T> {}
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:11: Error: Expected a type, but got 'try'.
+// extension try<T> on Class<T> {}
+//           ^^^
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:11: Error: A extension declaration must have a body, even if it is empty.
+// Try adding an empty body.
+// extension try<T> on Class<T> {}
+//           ^^^
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:11: Error: 'try' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+// extension try<T> on Class<T> {}
+//           ^^^
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension try<T> on Class<T> {}
+//           ^^^
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:18: Error: Expected '{' before this.
+// extension try<T> on Class<T> {}
+//                  ^^
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:21: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension try<T> on Class<T> {}
+//                     ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:21: Error: 'Class' is already declared in this scope.
+// extension try<T> on Class<T> {}
+//                     ^^^^^
+// pkg/front_end/testcases/extensions/issue38600.dart:5:7: Context: Previous declaration of 'Class'.
+// class Class<T> {}
+//       ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38600.dart:7:18: Error: Type 'on' not found.
+// extension try<T> on Class<T> {}
+//                  ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension _extension#0 on invalid-type {
+}
+static method try<T extends core::Object* = dynamic>() → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue38712.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38712.dart.weak.modular.expect
new file mode 100644
index 0000000..464cf79
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue38712.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue38712.dart:5:11: Error: Expected 'on' after this.
+// extension C {
+//           ^
+//
+// pkg/front_end/testcases/extensions/issue38712.dart:5:13: Error: Expected a type, but got '{'.
+// extension C {
+//             ^
+//
+import self as self;
+
+extension C on invalid-type {
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/issue38713.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38713.dart.weak.modular.expect
new file mode 100644
index 0000000..8dbe072
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue38713.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue38713.dart:7:19: Error: Conflicts with the implicit setter of the field 'property2'.
+//   static void set property2(int x) {}
+//                   ^
+//
+// pkg/front_end/testcases/extensions/issue38713.dart:6:14: Error: Conflicts with setter 'property2'.
+//   static int property2;
+//              ^
+//
+// pkg/front_end/testcases/extensions/issue38713.dart:9:19: Error: Conflicts with member 'property3'.
+//   static void set property3(int x) {}
+//                   ^
+//
+// pkg/front_end/testcases/extensions/issue38713.dart:10:11: Error: Conflicts with setter 'property3'.
+//   int get property3 => 1;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension C on core::int* {
+  static field property2 = self::C|property2;
+  get property3 = self::C|get#property3;
+  static set property3 = set self::C|property3;
+}
+static field core::int* C|property2;
+static set C|property3(core::int* x) → void {}
+static method C|get#property3(lowered final core::int* #this) → core::int*
+  return 1;
+static method main() → void {
+  self::C|property2;
+  self::C|property2 = 42;
+  self::C|property3 = 42;
+  self::C|get#property3(42);
+}
diff --git a/pkg/front_end/testcases/extensions/issue38745.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38745.dart.weak.modular.expect
new file mode 100644
index 0000000..aa7f4d8
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue38745.dart.weak.modular.expect
@@ -0,0 +1,196 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:9:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int field;
+//       ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:11:13: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int property = 42;
+//             ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:15:13: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int property2 = 42;
+//             ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:17:19: Error: Conflicts with member 'property2'.
+//   static void set property2(int value) {}
+//                   ^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:15:13: Error: Conflicts with setter 'property2'.
+//   final int property2 = 42;
+//             ^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:20:5: Error: Undefined name 'field'.
+//     field;
+//     ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:21:5: Error: Setter not found: 'field'.
+//     field = 23;
+//     ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:22:5: Error: Getter not found: 'property'.
+//     property;
+//     ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:24:5: Error: Undefined name 'property2'.
+//     property2;
+//     ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:25:5: Error: Setter not found: 'property2'.
+//     property2 = 23;
+//     ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:40:10: Error: Member not found: 'field'.
+//   ext(c).field;
+//          ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:41:10: Error: Setter not found: 'field'.
+//   ext(c).field = 23;
+//          ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:42:10: Error: Getter not found: 'property'.
+//   ext(c).property;
+//          ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:44:10: Error: Member not found: 'property2'.
+//   ext(c).property2;
+//          ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:45:10: Error: Setter not found: 'property2'.
+//   ext(c).property2 = 23;
+//          ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:34:5: Error: The getter 'field' isn't defined for the class 'C<int>'.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'field'.
+//   c.field;
+//     ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:35:5: Error: The setter 'field' isn't defined for the class 'C<int>'.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'field'.
+//   c.field = 23;
+//     ^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:36:5: Error: The getter 'property' isn't defined for the class 'C<int>'.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   c.property;
+//     ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:38:5: Error: The getter 'property2' isn't defined for the class 'C<int>'.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property2'.
+//   c.property2;
+//     ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38745.dart:39:5: Error: The setter 'property2' isn't defined for the class 'C<int>'.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property2'.
+//   c.property2 = 23;
+//     ^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension ext<T extends core::Object* = dynamic> on self::C<T*>* {
+  field field = self::ext|field;
+  field property = self::ext|property;
+  field property2 = self::ext|property2;
+  method method = self::ext|method;
+  tearoff method = self::ext|get#method;
+  set property = self::ext|set#property;
+  static set property2 = set self::ext|property2;
+}
+static field core::int* ext|field;
+static final field core::int* ext|property = 42;
+static final field core::int* ext|property2 = 42;
+static method ext|set#property<T extends core::Object* = dynamic>(lowered final self::C<self::ext|set#property::T*>* #this, core::int* value) → void {}
+static set ext|property2(core::int* value) → void {}
+static method ext|method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|method::T*>* #this) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:20:5: Error: Undefined name 'field'.
+    field;
+    ^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:21:5: Error: Setter not found: 'field'.
+    field = 23;
+    ^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:22:5: Error: Getter not found: 'property'.
+    property;
+    ^^^^^^^^";
+  self::ext|set#property<self::ext|method::T*>(#this, 23);
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:24:5: Error: Undefined name 'property2'.
+    property2;
+    ^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:25:5: Error: Setter not found: 'property2'.
+    property2 = 23;
+    ^^^^^^^^^";
+}
+static method ext|get#method<T extends core::Object* = dynamic>(lowered final self::C<self::ext|get#method::T*>* #this) → () →* dynamic
+  return () → dynamic => self::ext|method<self::ext|get#method::T*>(#this);
+static method main() → dynamic {}
+static method errors() → dynamic {
+  self::C<core::int*>* c = new self::C::•<core::int*>();
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:34:5: Error: The getter 'field' isn't defined for the class 'C<int>'.
+ - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'field'.
+  c.field;
+    ^^^^^" in c{<unresolved>}.field;
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:35:5: Error: The setter 'field' isn't defined for the class 'C<int>'.
+ - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'field'.
+  c.field = 23;
+    ^^^^^" in c{<unresolved>}.field = 23;
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:36:5: Error: The getter 'property' isn't defined for the class 'C<int>'.
+ - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  c.property;
+    ^^^^^^^^" in c{<unresolved>}.property;
+  self::ext|set#property<core::int*>(c, 23);
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:38:5: Error: The getter 'property2' isn't defined for the class 'C<int>'.
+ - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property2'.
+  c.property2;
+    ^^^^^^^^^" in c{<unresolved>}.property2;
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:39:5: Error: The setter 'property2' isn't defined for the class 'C<int>'.
+ - 'C' is from 'pkg/front_end/testcases/extensions/issue38745.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property2'.
+  c.property2 = 23;
+    ^^^^^^^^^" in c{<unresolved>}.property2 = 23;
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:40:10: Error: Member not found: 'field'.
+  ext(c).field;
+         ^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:41:10: Error: Setter not found: 'field'.
+  ext(c).field = 23;
+         ^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:42:10: Error: Getter not found: 'property'.
+  ext(c).property;
+         ^^^^^^^^";
+  self::ext|set#property<core::int*>(c, 23);
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:44:10: Error: Member not found: 'property2'.
+  ext(c).property2;
+         ^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/issue38745.dart:45:10: Error: Setter not found: 'property2'.
+  ext(c).property2 = 23;
+         ^^^^^^^^^";
+  self::ext|method<core::int*>(c);
+}
diff --git a/pkg/front_end/testcases/extensions/issue38750.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38750.dart.weak.modular.expect
new file mode 100644
index 0000000..4dbcce1
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue38750.dart.weak.modular.expect
@@ -0,0 +1,118 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue38750.dart:13:5: Error: Member not found: 'C._staticFoo'.
+//   C._staticFoo();
+//     ^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue38750.dart:12:5: Error: The method '_foo' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '_foo'.
+//   c._foo();
+//     ^^^^
+//
+// pkg/front_end/testcases/extensions/issue38750.dart:16:5: Error: The method '_bar' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '_bar'.
+//   c._bar();
+//     ^^^^
+//
+import self as self;
+import "issue38750_lib1.dart" as iss;
+
+import "org-dartlang-testcase:///issue38750_lib1.dart";
+import "org-dartlang-testcase:///issue38750_lib2.dart";
+
+static method main() → dynamic {}
+static method errors() → dynamic {
+  iss::C* c = new iss::C::•();
+  invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:12:5: Error: The method '_foo' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '_foo'.
+  c._foo();
+    ^^^^" in c{<unresolved>}._foo();
+  invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:13:5: Error: Member not found: 'C._staticFoo'.
+  C._staticFoo();
+    ^^^^^^^^^^";
+  c.{iss::C::foo}(){() →* dynamic};
+  iss::C::staticFoo();
+  invalid-expression "pkg/front_end/testcases/extensions/issue38750.dart:16:5: Error: The method '_bar' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '_bar'.
+  c._bar();
+    ^^^^" in c{<unresolved>}._bar();
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → iss::C*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return this.{iss::C::_foo}(){() →* dynamic};
+  method _foo() → dynamic {
+    try {
+      throw "producing a stack trace";
+    }
+    on dynamic catch(final dynamic e, final core::StackTrace* s) {
+      core::print(s);
+    }
+  }
+  static method _staticFoo() → dynamic {
+    core::print("_staticFoo");
+  }
+  static method staticFoo() → dynamic
+    return iss::C::_staticFoo();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension ext on iss::C* {
+  method _bar = iss::ext|_bar;
+  tearoff _bar = iss::ext|get#_bar;
+}
+static method ext|_bar(lowered final iss::C* #this) → dynamic {
+  try {
+    throw "producing a stack trace";
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace* s) {
+    core::print(s);
+  }
+}
+static method ext|get#_bar(lowered final iss::C* #this) → () →* dynamic
+  return () → dynamic => iss::ext|_bar(#this);
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue38750_lib2.dart:9:5: Error: The method '_bar' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '_bar'.
+//   c._bar();
+//     ^^^^
+//
+import self as self2;
+import "issue38750_lib1.dart" as iss;
+
+import "org-dartlang-testcase:///issue38750_lib1.dart";
+
+static method errors() → dynamic {
+  iss::C* c = new iss::C::•();
+  invalid-expression "pkg/front_end/testcases/extensions/issue38750_lib2.dart:9:5: Error: The method '_bar' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/extensions/issue38750_lib1.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '_bar'.
+  c._bar();
+    ^^^^" in c{<unresolved>}._bar();
+}
diff --git a/pkg/front_end/testcases/extensions/issue38755.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38755.dart.weak.modular.expect
new file mode 100644
index 0000000..8be9036
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue38755.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension A<T extends core::Object* = dynamic> on core::List<T*>* {
+  method myMap = self::A|myMap;
+  tearoff myMap = self::A|get#myMap;
+}
+static final field core::List<core::String*>* list = self::A|myMap<core::String*, core::String*>(<core::String*>["a", "b", "c"], (core::String* it) → core::String* => it);
+static method A|myMap<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final core::List<self::A|myMap::T*>* #this, (self::A|myMap::T*) →* self::A|myMap::R* block) → core::List<self::A|myMap::R*>* {
+  return #this.{core::Iterable::map}<self::A|myMap::R*>(block){((self::A|myMap::T*) →* self::A|myMap::R*) →* core::Iterable<self::A|myMap::R*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<self::A|myMap::R*>*};
+}
+static method A|get#myMap<T extends core::Object* = dynamic>(lowered final core::List<self::A|get#myMap::T*>* #this) → <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R*) →* core::List<R*>*
+  return <R extends core::Object* = dynamic>((self::A|get#myMap::T*) →* R* block) → core::List<R*>* => self::A|myMap<self::A|get#myMap::T*, R*>(#this, block);
+static method main() → dynamic {
+  core::print(self::list);
+}
diff --git a/pkg/front_end/testcases/extensions/issue38915.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue38915.dart.weak.modular.expect
new file mode 100644
index 0000000..ab76811
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue38915.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+  method method2 = self::Extension|method2;
+  tearoff method2 = self::Extension|get#method2;
+  method method3 = self::Extension|method3;
+  tearoff method3 = self::Extension|get#method3;
+  method method4 = self::Extension|method4;
+  tearoff method4 = self::Extension|get#method4;
+}
+static method Extension|method1(lowered final self::Class* #this, {core::bool* b = #C1, core::String* s = #C2}) → void
+  return null;
+static method Extension|get#method1(lowered final self::Class* #this) → ({b: core::bool*, s: core::String*}) →* void
+  return ({core::bool* b = #C1, core::String* s = #C2}) → void => self::Extension|method1(#this, b: b, s: s);
+static method Extension|method2(lowered final self::Class* #this, [core::bool* b = #C1, core::String* s = #C2]) → void
+  return null;
+static method Extension|get#method2(lowered final self::Class* #this) → ([core::bool*, core::String*]) →* void
+  return ([core::bool* b = #C1, core::String* s = #C2]) → void => self::Extension|method2(#this, b, s);
+static method Extension|method3(lowered final self::Class* #this, core::int* i, {core::bool* b = #C1, core::String* s = #C2}) → void {}
+static method Extension|get#method3(lowered final self::Class* #this) → (core::int*, {b: core::bool*, s: core::String*}) →* void
+  return (core::int* i, {core::bool* b = #C1, core::String* s = #C2}) → void => self::Extension|method3(#this, i, b: b, s: s);
+static method Extension|method4(lowered final self::Class* #this, core::int* i, [core::bool* b = #C1, core::String* s = #C2]) → void {}
+static method Extension|get#method4(lowered final self::Class* #this) → (core::int*, [core::bool*, core::String*]) →* void
+  return (core::int* i, [core::bool* b = #C1, core::String* s = #C2]) → void => self::Extension|method4(#this, i, b, s);
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  self::Extension|method1(c);
+  self::Extension|method1(c, s: "foo");
+  self::Extension|method1(c, b: true);
+  self::Extension|method1(c, b: true, s: "foo");
+  self::Extension|method1(c, s: "foo", b: true);
+  self::Extension|method2(c);
+  self::Extension|method2(c, true);
+  self::Extension|method2(c, true, "foo");
+  self::Extension|method3(c, 42);
+  self::Extension|method3(c, 42, s: "foo");
+  self::Extension|method3(c, 42, b: true);
+  self::Extension|method3(c, 42, b: true, s: "foo");
+  self::Extension|method3(c, 42, s: "foo", b: true);
+  self::Extension|method4(c, 42);
+  self::Extension|method4(c, 42, true);
+  self::Extension|method4(c, 42, true, "foo");
+}
+
+constants  {
+  #C1 = false
+  #C2 = ", "
+}
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue39527.dart.weak.modular.expect
new file mode 100644
index 0000000..7d9415b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* value = 0;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension1 on self::C* {
+  operator [] = self::Extension1|[];
+  operator []= = self::Extension1|[]=;
+  operator - = self::Extension1|-;
+}
+static method Extension1|[](lowered final self::C* #this, core::int* index) → self::C*
+  return let final self::C* #t1 = #this in block {
+    #t1.{self::C::value} = #t1.{self::C::value}{core::int*}.{core::num::+}(index.{core::num::+}(1){(core::num*) →* core::int*}){(core::num*) →* core::int*};
+  } =>#t1;
+static method Extension1|[]=(lowered final self::C* #this, core::int* index, self::C* other) → void
+  return #this.{self::C::value} = #this.{self::C::value}{core::int*}.{core::num::+}(other.{self::C::value}{core::int*}.{core::num::+}(index){(core::num*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*}){(core::num*) →* core::int*};
+static method Extension1|-(lowered final self::C* #this, core::int* val) → self::C*
+  return #this;
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  let final self::C* #t2 = c in let final core::int* #t3 = 42 in let final self::C* #t4 = self::Extension1|-(self::Extension1|[](#t2, #t3), 1) in let final void #t5 = self::Extension1|[]=(#t2, #t3, #t4) in #t4;
+  let final self::C* #t6 = c in let final core::int* #t7 = 42 in self::Extension1|[]=(#t6, #t7, self::Extension1|-(self::Extension1|[](#t6, #t7), 1));
+  self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
+}
diff --git a/pkg/front_end/testcases/extensions/issue39889.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue39889.dart.weak.modular.expect
new file mode 100644
index 0000000..3d65b0f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39889.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension E on self::C* {
+  method f = self::E|f;
+  tearoff f = self::E|get#f;
+}
+static method E|f(lowered final self::C* #this, core::String* b) → void {}
+static method E|get#f(lowered final self::C* #this) → (core::String*) →* void
+  return (core::String* b) → void => self::E|f(#this, b);
+static method main() → void {
+  dynamic b = "456";
+  self::C* c = new self::C::•();
+  self::E|f(c, b as{TypeError,ForDynamic} core::String*);
+}
diff --git a/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.modular.expect
new file mode 100644
index 0000000..1c4dd76
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39938/issue39938.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "issue39938_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue39938_lib.dart";
+
+static method main() → dynamic {
+  self::expect(true, iss::Extension|+(true, true));
+  self::expect(true, iss::Extension|+(true, false));
+  self::expect(true, iss::Extension|+(false, true));
+  self::expect(false, iss::Extension|+(false, false));
+  self::expect(true, iss::Extension|+(true, true));
+  self::expect(true, iss::Extension|+(true, false));
+  self::expect(true, iss::Extension|+(false, true));
+  self::expect(false, iss::Extension|+(false, false));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}.";
+}
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect
new file mode 100644
index 0000000..4f80fad
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+extension Extension<T extends core::Object* = dynamic> on asy::Stream<T*>* {
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+}
+static method main() → void {
+  asy::StreamController<core::String*>* controller = asy::StreamController::•<core::String*>();
+  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* Null #t2 = (dynamic s) → Null {
+    core::print(s);
+  } in self::Extension|call<core::String*>(#t1.{asy::StreamController::stream}{asy::Stream<core::String*>*}, #t2);
+}
+static method Extension|call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>* {
+  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → Null {
+    onData(d);
+  }){((self::Extension|call::T*) →* void, {cancelOnError: core::bool*, onDone: () →* void, onError: core::Function*}) →* asy::StreamSubscription<self::Extension|call::T*>*};
+}
+static method Extension|get#call<T extends core::Object* = dynamic>(lowered final asy::Stream<self::Extension|get#call::T*>* #this) → (core::Function*) →* asy::StreamSubscription<self::Extension|get#call::T*>*
+  return (core::Function* onData) → asy::StreamSubscription<self::Extension|get#call::T*>* => self::Extension|call<self::Extension|get#call::T*>(#this, onData);
diff --git a/pkg/front_end/testcases/extensions/issue40713.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue40713.dart.weak.modular.expect
new file mode 100644
index 0000000..568f207
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40713.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue40713.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+//   list.safeFirst();
+//        ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/issue40713.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+//   list2.safeFirst();
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension SafeAccess<T extends core::Object* = dynamic> on core::Iterable<T*>* {
+  get safeFirst = self::SafeAccess|get#safeFirst;
+}
+static method SafeAccess|get#safeFirst<T extends core::Object* = dynamic>(lowered final core::Iterable<self::SafeAccess|get#safeFirst::T*>* #this) → self::SafeAccess|get#safeFirst::T* {
+  return #this.{core::Iterable::isNotEmpty}{core::bool*} ?{self::SafeAccess|get#safeFirst::T*} #this.{core::Iterable::first}{self::SafeAccess|get#safeFirst::T*} : null;
+}
+static method main() → dynamic {}
+static method test() → void {
+  final core::List<dynamic>* list = <dynamic>[];
+  self::SafeAccess|get#safeFirst<dynamic>(list){dynamic}.call();
+  final core::List<(core::int*) →* void>* list2 = <(core::int*) →* void>[];
+  self::SafeAccess|get#safeFirst<(core::int*) →* void>(list2)(0){(core::int*) →* void};
+}
+static method errors() → void {
+  final core::List<core::Object*>* list = <core::Object*>[];
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:22:8: Error: 'safeFirst' isn't a function or method and can't be invoked.
+  list.safeFirst();
+       ^^^^^^^^^" in self::SafeAccess|get#safeFirst<core::Object*>(list){<unresolved>}.call();
+  final core::List<(core::int*) →* void>* list2 = <(core::int*) →* void>[];
+  invalid-expression "pkg/front_end/testcases/extensions/issue40713.dart:24:18: Error: Too few positional arguments: 1 required, 0 given.
+  list2.safeFirst();
+                 ^" in self::SafeAccess|get#safeFirst<(core::int*) →* void>(list2){<inapplicable>}.();
+}
diff --git a/pkg/front_end/testcases/extensions/issue40816.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue40816.dart.weak.modular.expect
new file mode 100644
index 0000000..70c933c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue40816.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension _extension#0 on self::A* {
+  method foo = self::_extension#0|foo;
+  tearoff foo = self::_extension#0|get#foo;
+}
+static method _extension#0|foo(lowered final self::A* #this, self::A* a, self::B* b) → void {}
+static method _extension#0|get#foo(lowered final self::A* #this) → (self::A*, self::B*) →* void
+  return (self::A* a, self::B* b) → void => self::_extension#0|foo(#this, a, b);
+static method main() → void {
+  dynamic a = new self::A::•();
+  dynamic b = new self::B::•();
+  self::_extension#0|foo(new self::A::•(), a as{TypeError,ForDynamic} self::A*, b as{TypeError,ForDynamic} self::B*);
+}
diff --git a/pkg/front_end/testcases/extensions/issue43218.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue43218.dart.weak.modular.expect
new file mode 100644
index 0000000..8f03ff9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue43218.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
+//   Ext(c).id++;
+//          ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* value;
+  constructor •() → self::C*
+    : self::C::value = 0, super core::Object::•() {}
+  method init() → dynamic {
+    this.{self::C::value} = 0;
+  }
+  get id() → core::int*
+    return this.{self::C::value}{core::int*};
+  set id(core::int* v) → void {
+    this.{self::C::value} = v;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Ext on self::C* {
+  get id = self::Ext|get#id;
+}
+static method Ext|get#id(lowered final self::C* #this) → core::int*
+  return #this.{self::C::value}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+static method test() → dynamic {
+  self::C* c = new self::C::•();
+  let final self::C* #t1 = c in invalid-expression "pkg/front_end/testcases/extensions/issue43218.dart:24:10: Error: The setter 'id' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'id'.
+  Ext(c).id++;
+         ^^" in #t1{<unresolved>}.id = self::Ext|get#id(#t1).{core::num::+}(1){(core::num*) →* core::int*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue44003.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue44003.dart.weak.modular.expect
new file mode 100644
index 0000000..a8d4f63
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue44003.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue44003.dart:14:8: Error: 'foo' is already declared in this scope.
+//   void foo(String baz, int a) {
+//        ^^^
+// pkg/front_end/testcases/extensions/issue44003.dart:10:8: Context: Previous declaration of 'foo'.
+//   void foo(String bar) {
+//        ^^^
+//
+// pkg/front_end/testcases/extensions/issue44003.dart:6:8: Error: The method 'foo' isn't defined for the class 'List<String>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+//   args.foo('1', 2);
+//        ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension _extension#0 on core::List<core::String*>* {
+  method foo = self::_extension#0|foo;
+  tearoff foo = self::_extension#0|get#foo;
+}
+static method test(core::List<core::String*>* args) → void {
+  invalid-expression "pkg/front_end/testcases/extensions/issue44003.dart:6:8: Error: The method 'foo' isn't defined for the class 'List<String>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+  args.foo('1', 2);
+       ^^^" in args{<unresolved>}.foo("1", 2);
+}
+static method _extension#0|foo(lowered final core::List<core::String*>* #this, core::String* bar) → void {
+  core::print(1);
+}
+static method _extension#0|get#foo(lowered final core::List<core::String*>* #this) → (core::String*) →* void
+  return (core::String* bar) → void => self::_extension#0|foo(#this, bar);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue44844.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue44844.dart.weak.modular.expect
new file mode 100644
index 0000000..1a705d7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue44844.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/issue44844.dart:7:8: Error: 'foo' is already declared in this scope.
+//   void foo() {}
+//        ^^^
+// pkg/front_end/testcases/extensions/issue44844.dart:6:14: Context: Previous declaration of 'foo'.
+//   static int foo = 2;
+//              ^^^
+//
+// pkg/front_end/testcases/extensions/issue44844.dart:11:5: Error: The method 'foo' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+//   3.foo();
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension _extension#0 on core::int* {
+  static field foo = self::_extension#0|foo;
+}
+static field core::int* _extension#0|foo;
+static method test() → void {
+  invalid-expression "pkg/front_end/testcases/extensions/issue44844.dart:11:5: Error: The method 'foo' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+  3.foo();
+    ^^^" in 3{<unresolved>}.foo();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/issue47345.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/issue47345.dart.weak.modular.expect
new file mode 100644
index 0000000..38d9756
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue47345.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+extension _extension#0 on self::Foo {
+  static field bar = self::_extension#0|bar;
+  static field doubleBar = self::_extension#0|doubleBar;
+}
+static const field core::int _extension#0|bar = #C1;
+static const field core::int _extension#0|doubleBar = #C2;
+static method main() → void {}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.modular.expect
new file mode 100644
index 0000000..d952a83
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/language_issue1182.dart:13:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+//     S Function(S) f = x.test;
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S*>*
+    : super core::Object::•()
+    ;
+  method test1(covariant-by-class self::Foo::S* x) → void {
+    (self::Foo::S*) →* self::Foo::S* f = invalid-expression "pkg/front_end/testcases/extensions/language_issue1182.dart:13:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+    S Function(S) f = x.test;
+                        ^" in self::Test|get#test<core::num*>(x) as{TypeError} Never;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Test<T extends core::Object* = dynamic> on T* {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object* = dynamic>(lowered final self::Test|get#test::T* #this) → (self::Test|get#test::T*) →* self::Test|get#test::T*
+  return (self::Test|get#test::T* a) → self::Test|get#test::T* => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.modular.expect
new file mode 100644
index 0000000..6d6179a
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/missing_toplevel.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/missing_toplevel.dart:13:23: Error: The getter 'setter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/extensions/missing_toplevel.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'setter'.
+// var missingGetter = c.setter += 42;
+//                       ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  set setter = self::Extension|set#setter;
+}
+static field self::Class* c = new self::Class::•();
+static field dynamic missingGetter = let final self::Class* #t1 = self::c in let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/extensions/missing_toplevel.dart:13:23: Error: The getter 'setter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/extensions/missing_toplevel.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'setter'.
+var missingGetter = c.setter += 42;
+                      ^^^^^^" in #t1{<unresolved>}.setter{dynamic}.+(42) as{TypeError,ForDynamic} core::int* in let final void #t3 = self::Extension|set#setter(#t1, #t2) in #t2;
+static method Extension|set#setter(lowered final self::Class* #this, core::int* value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/multi_export.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/multi_export.dart.weak.modular.expect
new file mode 100644
index 0000000..b369c9b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/multi_export.dart.weak.modular.expect
@@ -0,0 +1,98 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "multi_export_lib1.dart" as mul;
+import "multi_export_lib.dart" as mul2;
+import "multi_export_lib2.dart" as mul3;
+import "multi_export_lib3.dart" as mul4;
+import "multi_export_lib4.dart" as mul5;
+
+import "org-dartlang-testcase:///multi_export_lib1.dart" as lib;
+import "org-dartlang-testcase:///multi_export_lib2.dart" as lib;
+import "org-dartlang-testcase:///multi_export_lib3.dart" as lib;
+import "org-dartlang-testcase:///multi_export_lib4.dart" as lib;
+
+static method main() → dynamic {
+  let final mul::SubClass1 #t1 = new mul::SubClass1::•() in block {
+    mul2::Extension|method<mul::SubClass1>(#t1);
+  } =>#t1;
+  let final mul3::SubClass2 #t2 = new mul3::SubClass2::•() in block {
+    mul2::Extension|method<mul3::SubClass2>(#t2);
+  } =>#t2;
+  let final mul4::SubClass3 #t3 = new mul4::SubClass3::•() in block {
+    mul2::Extension|method<mul4::SubClass3>(#t3);
+  } =>#t3;
+  let final mul5::SubClass4 #t4 = new mul5::SubClass4::•() in block {
+    mul2::Extension|method<mul5::SubClass4>(#t4);
+  } =>#t4;
+}
+
+library /*isNonNullableByDefault*/;
+import self as mul;
+import "multi_export_lib.dart" as mul2;
+
+import "org-dartlang-testcase:///multi_export_lib.dart";
+
+class SubClass1 extends mul2::Class {
+  synthetic constructor •() → mul::SubClass1
+    : super mul2::Class::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as mul3;
+import "multi_export_lib.dart" as mul2;
+additionalExports = (mul2::Extension)
+
+import "org-dartlang-testcase:///multi_export_lib.dart";
+export "org-dartlang-testcase:///multi_export_lib.dart" show Extension;
+
+class SubClass2 extends mul2::Class {
+  synthetic constructor •() → mul3::SubClass2
+    : super mul2::Class::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as mul4;
+import "multi_export_lib.dart" as mul2;
+additionalExports = (mul2::Extension)
+
+import "org-dartlang-testcase:///multi_export_lib.dart";
+export "org-dartlang-testcase:///multi_export_lib.dart" show Extension;
+
+class SubClass3 extends mul2::Class {
+  synthetic constructor •() → mul4::SubClass3
+    : super mul2::Class::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as mul5;
+import "multi_export_lib.dart" as mul2;
+additionalExports = (mul2::Extension)
+
+import "org-dartlang-testcase:///multi_export_lib.dart";
+export "org-dartlang-testcase:///multi_export_lib.dart" show Extension;
+
+class SubClass4 extends mul2::Class {
+  synthetic constructor •() → mul5::SubClass4
+    : super mul2::Class::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as mul2;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → mul2::Class
+    : super core::Object::•()
+    ;
+}
+extension Extension<T extends mul2::Class> on T {
+  method method = mul2::Extension|method;
+  tearoff method = mul2::Extension|get#method;
+}
+static method Extension|method<T extends mul2::Class>(lowered final mul2::Extension|method::T #this) → dynamic {}
+static method Extension|get#method<T extends mul2::Class>(lowered final mul2::Extension|get#method::T #this) → () → dynamic
+  return () → dynamic => mul2::Extension|method<mul2::Extension|get#method::T>(#this);
diff --git a/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.modular.expect
new file mode 100644
index 0000000..001a0b6
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/nested_on_types.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension<T extends core::Object* = dynamic> on self::A<self::A<T*>*>* {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+  method method2 = self::Extension|method2;
+  tearoff method2 = self::Extension|get#method2;
+}
+static method Extension|method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method1::T*>*>* #this) → dynamic {}
+static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method1::T*>*>* #this) → () →* dynamic
+  return () → dynamic => self::Extension|method1<self::Extension|get#method1::T*>(#this);
+static method Extension|method2<T extends core::Object* = dynamic, A extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|method2::T*>*>* #this, self::Extension|method2::A* a) → dynamic {}
+static method Extension|get#method2<T extends core::Object* = dynamic>(lowered final self::A<self::A<self::Extension|get#method2::T*>*>* #this) → <A extends core::Object* = dynamic>(A*) →* dynamic
+  return <A extends core::Object* = dynamic>(A* a) → dynamic => self::Extension|method2<self::Extension|get#method2::T*, A*>(#this, a);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/null_aware.dart.weak.modular.expect
new file mode 100644
index 0000000..31cc462
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.weak.modular.expect
@@ -0,0 +1,87 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int* field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  get property = self::Extension|get#property;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method testImplicitThis = self::Extension|testImplicitThis;
+  tearoff testImplicitThis = self::Extension|get#testImplicitThis;
+  set property = self::Extension|set#property;
+}
+static method Extension|get#property(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method Extension|set#property(lowered final self::Class* #this, core::int* value) → void {
+  #this.{self::Class::field} = value;
+}
+static method Extension|method(lowered final self::Class* #this) → core::int*
+  return #this.{self::Class::field}{core::int*};
+static method Extension|get#method(lowered final self::Class* #this) → () →* core::int*
+  return () → core::int* => self::Extension|method(#this);
+static method Extension|testImplicitThis(lowered final self::Class* #this) → dynamic {
+  self::expect(null, self::Extension|get#property(#this));
+  self::expect(42, let final core::int* #t1 = self::Extension|get#property(#this) in #t1 == null ?{core::int*} let final core::int* #t2 = 42 in let final void #t3 = self::Extension|set#property(#this, #t2) in #t2 : #t1);
+  self::expect(42, let final core::int* #t4 = self::Extension|get#property(#this) in #t4 == null ?{core::int*} let final core::int* #t5 = 87 in let final void #t6 = self::Extension|set#property(#this, #t5) in #t5 : #t4);
+}
+static method Extension|get#testImplicitThis(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|testImplicitThis(#this);
+static method main() → dynamic {
+  self::Class* c;
+  self::expect(null, let final self::Class* #t7 = c in #t7 == null ?{core::int*} null : self::Extension|get#property(#t7));
+  self::expect(null, let final self::Class* #t8 = c in #t8 == null ?{() →* core::int*} null : self::Extension|get#method(#t8));
+  self::expect(null, let final self::Class* #t9 = c in #t9 == null ?{core::int*} null : self::Extension|method(#t9));
+  self::expect(null, let final self::Class* #t10 = c in #t10 == null ?{core::int*} null : let final core::int* #t11 = 42 in let final void #t12 = self::Extension|set#property(#t10, #t11) in #t11);
+  self::expect(null, let final self::Class* #t13 = c in #t13 == null ?{core::int*} null : let final core::int* #t14 = self::Extension|get#property(#t13) in #t14 == null ?{core::int*} let final core::int* #t15 = 42 in let final void #t16 = self::Extension|set#property(#t13, #t15) in #t15 : #t14);
+  c = new self::Class::•();
+  self::expect(null, let final self::Class* #t17 = c in #t17 == null ?{core::int*} null : self::Extension|get#property(#t17));
+  self::expect(null, let final self::Class* #t18 = c in #t18 == null ?{core::int*} null : self::Extension|method(#t18));
+  () →* core::int* tearOff = let final self::Class* #t19 = c in #t19 == null ?{() →* core::int*} null : self::Extension|get#method(#t19);
+  self::expect(null, tearOff(){() →* core::int*});
+  self::expect(42, let final self::Class* #t20 = c in #t20 == null ?{core::int*} null : let final core::int* #t21 = 42 in let final void #t22 = self::Extension|set#property(#t20, #t21) in #t21);
+  self::expect(42, tearOff(){() →* core::int*});
+  self::expect(null, let final self::Class* #t23 = c in #t23 == null ?{Null} null : let final Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
+  self::expect(42, let final self::Class* #t26 = c in #t26 == null ?{core::int*} null : let final core::int* #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26, #t27) in #t27);
+  let final self::Class* #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29, null);
+  self::expect(null, let final self::Class* #t30 = c in #t30 == null ?{core::int*} null : self::Extension|get#property(#t30));
+  self::expect(42, let final self::Class* #t31 = c in let final core::int* #t32 = self::Extension|get#property(#t31) in #t32 == null ?{core::int*} let final core::int* #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31, #t33) in #t33 : #t32);
+  self::expect(42, let final self::Class* #t35 = c in let final core::int* #t36 = self::Extension|get#property(#t35) in #t36 == null ?{core::int*} let final core::int* #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35, #t37) in #t37 : #t36);
+  self::expect(null, let final self::Class* #t39 = c in #t39 == null ?{Null} null : let final Null #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
+  let final self::Class* #t42 = c in self::Extension|get#property(#t42) == null ?{core::int*} self::Extension|set#property(#t42, 42) : null;
+  self::expect(42, let final self::Class* #t43 = c in #t43 == null ?{core::int*} null : self::Extension|get#property(#t43));
+  let final self::Class* #t44 = c in self::Extension|get#property(#t44) == null ?{core::int*} self::Extension|set#property(#t44, 87) : null;
+  self::expect(42, let final self::Class* #t45 = c in #t45 == null ?{core::int*} null : self::Extension|get#property(#t45));
+  let final self::Class* #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46, null);
+  self::expect(null, let final self::Class* #t47 = c in #t47 == null ?{core::int*} null : self::Extension|get#property(#t47));
+  self::expect(42, let final self::Class* #t48 = c in let final core::int* #t49 = self::Extension|get#property(#t48) in #t49 == null ?{core::int*} let final core::int* #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48, #t50) in #t50 : #t49);
+  self::expect(42, let final self::Class* #t52 = c in let final core::int* #t53 = self::Extension|get#property(#t52) in #t53 == null ?{core::int*} let final core::int* #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52, #t54) in #t54 : #t53);
+  let final self::Class* #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56, null);
+  self::expect(null, let final self::Class* #t57 = c in #t57 == null ?{core::int*} null : self::Extension|get#property(#t57));
+  let final self::Class* #t58 = c in self::Extension|get#property(#t58) == null ?{core::int*} self::Extension|set#property(#t58, 42) : null;
+  self::expect(42, let final self::Class* #t59 = c in #t59 == null ?{core::int*} null : self::Extension|get#property(#t59));
+  let final self::Class* #t60 = c in self::Extension|get#property(#t60) == null ?{core::int*} self::Extension|set#property(#t60, 87) : null;
+  self::expect(42, let final self::Class* #t61 = c in #t61 == null ?{core::int*} null : self::Extension|get#property(#t61));
+  let final self::Class* #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62, null);
+  self::Extension|testImplicitThis(c);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/on_function_type.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.modular.expect
new file mode 100644
index 0000000..7fd4a5b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_function_type.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends self::Class<self::Class::T*>* = self::Class<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Subclass extends self::Class<self::Subclass*> {
+  synthetic constructor •() → self::Subclass*
+    : super self::Class::•()
+    ;
+}
+extension _extension#0<R extends core::Object* = dynamic, T extends core::Object* = dynamic> on (T*) →* R* {
+  get returnType = self::_extension#0|get#returnType;
+  get parameterType = self::_extension#0|get#parameterType;
+}
+extension _extension#1<T extends self::Class<T*>* = self::Class<dynamic>*> on <S extends T* = dynamic>(T*, S*) →* dynamic {
+  get parameterType = self::_extension#1|get#parameterType;
+}
+static method _extension#0|get#returnType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#returnType::T*) →* self::_extension#0|get#returnType::R* #this) → core::Type*
+  return self::_extension#0|get#returnType::R*;
+static method _extension#0|get#parameterType<R extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final (self::_extension#0|get#parameterType::T*) →* self::_extension#0|get#parameterType::R* #this) → core::Type*
+  return self::_extension#0|get#parameterType::T*;
+static method _extension#1|get#parameterType<T extends self::Class<self::_extension#1|get#parameterType::T*>* = self::Class<dynamic>*>(lowered final <S extends self::_extension#1|get#parameterType::T* = dynamic>(self::_extension#1|get#parameterType::T*, S*) →* dynamic #this) → core::Type*
+  return self::_extension#1|get#parameterType::T*;
+static method main() → dynamic {
+  function local1(core::int* i) → core::int*
+    return i;
+  core::print(self::_extension#0|get#returnType<core::int*, core::int*>(local1));
+  core::print(self::_extension#0|get#parameterType<core::int*, core::int*>(local1));
+  function local2<S extends self::Subclass*>(self::Subclass* a, S* b) → self::Subclass*
+    return a;
+  core::print(self::_extension#1|get#parameterType<self::Subclass*>(local2));
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..a5fc214
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_inference.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension BestCom<T extends core::num*> on core::Iterable<T*>* {
+  method best = self::BestCom|best;
+  tearoff best = self::BestCom|get#best;
+}
+extension BestList<T extends core::Object* = dynamic> on core::List<T*>* {
+  method best = self::BestList|best;
+  tearoff best = self::BestList|get#best;
+}
+extension BestSpec on core::List<core::num*>* {
+  method best = self::BestSpec|best;
+  tearoff best = self::BestSpec|get#best;
+}
+static method BestCom|best<T extends core::num*>(lowered final core::Iterable<self::BestCom|best::T*>* #this) → self::BestCom|best::T*
+  return null;
+static method BestCom|get#best<T extends core::num*>(lowered final core::Iterable<self::BestCom|get#best::T*>* #this) → () →* self::BestCom|get#best::T*
+  return () → self::BestCom|get#best::T* => self::BestCom|best<self::BestCom|get#best::T*>(#this);
+static method BestList|best<T extends core::Object* = dynamic>(lowered final core::List<self::BestList|best::T*>* #this) → self::BestList|best::T*
+  return null;
+static method BestList|get#best<T extends core::Object* = dynamic>(lowered final core::List<self::BestList|get#best::T*>* #this) → () →* self::BestList|get#best::T*
+  return () → self::BestList|get#best::T* => self::BestList|best<self::BestList|get#best::T*>(#this);
+static method BestSpec|best(lowered final core::List<core::num*>* #this) → core::num*
+  return null;
+static method BestSpec|get#best(lowered final core::List<core::num*>* #this) → () →* core::num*
+  return () → core::num* => self::BestSpec|best(#this);
+static method main() → dynamic {
+  core::List<core::int*>* x;
+  core::int* v = self::BestList|best<core::int*>(x);
+  core::List<core::num*>* y;
+  core::num* w = self::BestSpec|best(y);
+}
diff --git a/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..ea9e928
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/on_type_variable_inference.dart.weak.modular.expect
@@ -0,0 +1,148 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   nonStruct.method();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   nonStruct.property = nonStruct.property;
+//                                  ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   nonStruct.property = nonStruct.property;
+//             ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method'.
+//   new NonStruct().method();
+//                   ^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+//   new NonStruct().property;
+//                   ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+//  - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+//   new NonStruct().property = null;
+//                   ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Struct extends core::Object {
+  synthetic constructor •() → self::Struct*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class StructA extends self::Struct {
+  synthetic constructor •() → self::StructA*
+    : super self::Struct::•()
+    ;
+}
+class StructB extends self::Struct {
+  synthetic constructor •() → self::StructB*
+    : super self::Struct::•()
+    ;
+}
+class NonStruct extends core::Object {
+  synthetic constructor •() → self::NonStruct*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension<T extends self::Struct*> on T* {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  get property = self::Extension|get#property;
+  set property = self::Extension|set#property;
+}
+static method Extension|method<T extends self::Struct*>(lowered final self::Extension|method::T* #this) → self::Extension|method::T*
+  return #this;
+static method Extension|get#method<T extends self::Struct*>(lowered final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
+  return () → self::Extension|get#method::T* => self::Extension|method<self::Extension|get#method::T*>(#this);
+static method Extension|get#property<T extends self::Struct*>(lowered final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
+  return #this;
+static method Extension|set#property<T extends self::Struct*>(lowered final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void {}
+static method main() → dynamic {
+  self::Struct* struct;
+  self::StructA* structA;
+  self::StructB* structB;
+  self::Extension|method<self::Struct*>(struct);
+  self::Extension|set#property<self::Struct*>(struct, self::Extension|get#property<self::StructA*>(structA));
+  self::Extension|method<self::StructA*>(structA);
+  self::Extension|set#property<self::StructA*>(structA, self::Extension|get#property<self::Struct*>(struct) as{TypeError} self::StructA*);
+  self::Extension|method<self::StructB*>(structB);
+  self::Extension|set#property<self::StructB*>(structB, self::Extension|get#property<self::StructB*>(structB));
+  self::Extension|method<self::Struct*>(new self::Struct::•());
+  self::Extension|get#property<self::Struct*>(new self::Struct::•());
+  self::Extension|set#property<self::Struct*>(new self::Struct::•(), null);
+  self::Extension|method<self::StructA*>(new self::StructA::•());
+  self::Extension|get#property<self::StructA*>(new self::StructA::•());
+  self::Extension|set#property<self::StructA*>(new self::StructA::•(), null);
+  self::Extension|method<self::StructB*>(new self::StructB::•());
+  self::Extension|get#property<self::StructB*>(new self::StructB::•());
+  self::Extension|set#property<self::StructB*>(new self::StructB::•(), null);
+}
+static method testNonStruct() → dynamic {
+  self::NonStruct* nonStruct;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:44:13: Error: The method 'method' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  nonStruct.method();
+            ^^^^^^" in nonStruct{<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:13: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  nonStruct.property = nonStruct.property;
+            ^^^^^^^^" in nonStruct{<unresolved>}.property = invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:45:34: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  nonStruct.property = nonStruct.property;
+                                 ^^^^^^^^" in nonStruct{<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:46:19: Error: The method 'method' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method'.
+  new NonStruct().method();
+                  ^^^^^^" in new self::NonStruct::•(){<unresolved>}.method();
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:47:19: Error: The getter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+  new NonStruct().property;
+                  ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property;
+  invalid-expression "pkg/front_end/testcases/extensions/on_type_variable_inference.dart:48:19: Error: The setter 'property' isn't defined for the class 'NonStruct'.
+ - 'NonStruct' is from 'pkg/front_end/testcases/extensions/on_type_variable_inference.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+  new NonStruct().property = null;
+                  ^^^^^^^^" in new self::NonStruct::•(){<unresolved>}.property = null;
+}
diff --git a/pkg/front_end/testcases/extensions/operators.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/operators.dart.weak.modular.expect
new file mode 100644
index 0000000..d97d9f4
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/operators.dart.weak.modular.expect
@@ -0,0 +1,147 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
+//   Operators(c) == c;
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
+//   Operators(c) != c;
+//   ^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Complex extends core::Object /*hasConstConstructor*/  {
+  final field core::double* real;
+  final field core::double* imaginary;
+  const constructor •(core::double* real, core::double* imaginary) → self::Complex*
+    : self::Complex::real = real, self::Complex::imaginary = imaginary, super core::Object::•()
+    ;
+  method add(self::Complex* other) → self::Complex* {
+    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::+}(other.{self::Complex::real}{core::double*}){(core::num*) →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::+}(other.{self::Complex::imaginary}{core::double*}){(core::num*) →* core::double*});
+  }
+  method sub(self::Complex* other) → self::Complex* {
+    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::-}(other.{self::Complex::real}{core::double*}){(core::num*) →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::-}(other.{self::Complex::imaginary}{core::double*}){(core::num*) →* core::double*});
+  }
+  method negate() → self::Complex* {
+    return new self::Complex::•(this.{self::Complex::real}{core::double*}.{core::double::unary-}(){() →* core::double*}, this.{self::Complex::imaginary}{core::double*}.{core::double::unary-}(){() →* core::double*});
+  }
+  get hashCode() → core::int*
+    return this.{self::Complex::real}{core::double*}.{core::num::hashCode}{core::int*}.{core::num::*}(13){(core::num*) →* core::int*}.{core::num::+}(this.{self::Complex::imaginary}{core::double*}.{core::num::hashCode}{core::int*}.{core::num::*}(19){(core::num*) →* core::int*}){(core::num*) →* core::int*};
+  operator ==(core::Object* other) → core::bool* {
+    if(core::identical(this, other))
+      return true;
+    return other is self::Complex* && this.{self::Complex::real}{core::double*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Complex*}.{self::Complex::real}{core::double*} && this.{self::Complex::imaginary}{core::double*} =={core::num::==}{(core::Object*) →* core::bool*} other{self::Complex*}.{self::Complex::imaginary}{core::double*};
+  }
+  method toString() → core::String*
+    return "Complex(${this.{self::Complex::real}{core::double*}},${this.{self::Complex::imaginary}{core::double*}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Operators on self::Complex* {
+  operator + = self::Operators|+;
+  operator - = self::Operators|-;
+  operator unary- = self::Operators|unary-;
+}
+static method Operators|+(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
+  return #this.{self::Complex::add}(other){(self::Complex*) →* self::Complex*};
+static method Operators|-(lowered final self::Complex* #this, self::Complex* other) → self::Complex*
+  return #this.{self::Complex::sub}(other){(self::Complex*) →* self::Complex*};
+static method Operators|unary-(lowered final self::Complex* #this) → self::Complex*
+  return #this.{self::Complex::negate}(){() →* self::Complex*};
+static method main() → dynamic {
+  self::implicit();
+  self::explicit();
+}
+static method implicit() → dynamic {
+  self::Complex* c_m2 = new self::Complex::•(-2.0, 2.0);
+  self::Complex* c_m1 = new self::Complex::•(-1.0, 1.0);
+  self::Complex* c0 = new self::Complex::•(0.0, 0.0);
+  self::Complex* c1 = new self::Complex::•(1.0, -1.0);
+  self::Complex* c2 = new self::Complex::•(2.0, -2.0);
+  self::expect(c_m2, self::Operators|+(c0, c_m2));
+  self::expect(c_m2, self::Operators|+(c_m2, c0));
+  self::expect(c_m2, self::Operators|+(c_m1, c_m1));
+  self::expect(c_m1, self::Operators|+(c0, c_m1));
+  self::expect(c_m1, self::Operators|+(c_m1, c0));
+  self::expect(c0, self::Operators|+(c_m2, c2));
+  self::expect(c0, self::Operators|+(c2, c_m2));
+  self::expect(c0, self::Operators|+(c_m1, c1));
+  self::expect(c0, self::Operators|+(c1, c_m1));
+  self::expect(c0, self::Operators|+(c0, c0));
+  self::expect(c1, self::Operators|+(c0, c1));
+  self::expect(c1, self::Operators|+(c1, c0));
+  self::expect(c2, self::Operators|+(c0, c2));
+  self::expect(c2, self::Operators|+(c2, c0));
+  self::expect(c2, self::Operators|+(c1, c1));
+  self::expect(c_m2, self::Operators|-(c0, c2));
+  self::expect(c2, self::Operators|-(c2, c0));
+  self::expect(c_m2, self::Operators|unary-(c2));
+  self::expect(c_m1, self::Operators|-(c1, c2));
+  self::expect(c1, self::Operators|-(c2, c1));
+  self::expect(c_m1, self::Operators|-(c0, c1));
+  self::expect(c1, self::Operators|-(c1, c0));
+  self::expect(c_m1, self::Operators|unary-(c1));
+  self::expect(c0, self::Operators|-(c2, c2));
+  self::expect(c0, self::Operators|-(c1, c1));
+  self::expect(c0, self::Operators|-(c0, c0));
+  self::expect(c0, self::Operators|-(c_m1, c_m1));
+  self::expect(c0, self::Operators|-(c_m2, c_m2));
+  self::expect(c0, self::Operators|unary-(c0));
+}
+static method explicit() → dynamic {
+  self::Complex* c_m2 = new self::Complex::•(-2.0, 2.0);
+  self::Complex* c_m1 = new self::Complex::•(-1.0, 1.0);
+  self::Complex* c0 = new self::Complex::•(0.0, 0.0);
+  self::Complex* c1 = new self::Complex::•(1.0, -1.0);
+  self::Complex* c2 = new self::Complex::•(2.0, -2.0);
+  self::expect(c_m2, self::Operators|+(c0, c_m2));
+  self::expect(c_m2, self::Operators|+(c_m2, c0));
+  self::expect(c_m2, self::Operators|+(c_m1, c_m1));
+  self::expect(c_m1, self::Operators|+(c0, c_m1));
+  self::expect(c_m1, self::Operators|+(c_m1, c0));
+  self::expect(c0, self::Operators|+(c_m2, c2));
+  self::expect(c0, self::Operators|+(c2, c_m2));
+  self::expect(c0, self::Operators|+(c_m1, c1));
+  self::expect(c0, self::Operators|+(c1, c_m1));
+  self::expect(c0, self::Operators|+(c0, c0));
+  self::expect(c1, self::Operators|+(c0, c1));
+  self::expect(c1, self::Operators|+(c1, c0));
+  self::expect(c2, self::Operators|+(c0, c2));
+  self::expect(c2, self::Operators|+(c2, c0));
+  self::expect(c2, self::Operators|+(c1, c1));
+  self::expect(c_m2, self::Operators|-(c0, c2));
+  self::expect(c2, self::Operators|-(c2, c0));
+  self::expect(c_m2, self::Operators|unary-(c2));
+  self::expect(c_m1, self::Operators|-(c1, c2));
+  self::expect(c1, self::Operators|-(c2, c1));
+  self::expect(c_m1, self::Operators|-(c0, c1));
+  self::expect(c1, self::Operators|-(c1, c0));
+  self::expect(c_m1, self::Operators|unary-(c1));
+  self::expect(c0, self::Operators|-(c2, c2));
+  self::expect(c0, self::Operators|-(c1, c1));
+  self::expect(c0, self::Operators|-(c0, c0));
+  self::expect(c0, self::Operators|-(c_m1, c_m1));
+  self::expect(c0, self::Operators|-(c_m2, c_m2));
+  self::expect(c0, self::Operators|unary-(c0));
+}
+static method errors(self::Complex* c) → void {
+  invalid-expression "pkg/front_end/testcases/extensions/operators.dart:125:3: Error: Explicit extension application cannot be used as an expression.
+  Operators(c) == c;
+  ^^^^^^^^^" =={core::Object::==}{(core::Object*) →* core::bool*} c;
+  !(invalid-expression "pkg/front_end/testcases/extensions/operators.dart:126:3: Error: Explicit extension application cannot be used as an expression.
+  Operators(c) != c;
+  ^^^^^^^^^" =={core::Object::==}{(core::Object*) →* core::bool*} c);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.modular.expect
new file mode 100644
index 0000000..5a567f7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field core::int* _instanceField = null;
+  static field core::int* _staticField = 0;
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  method getInstanceField() → core::int*
+    return this.{self::A1::_instanceField}{core::int*};
+  method setInstanceField(core::int* value) → void {
+    this.{self::A1::_instanceField} = value;
+  }
+  static method getStaticField() → core::int*
+    return self::A1::_staticField;
+  static method setStaticField(core::int* value) → void {
+    self::A1::_staticField = value;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension A2 on self::A1* {
+  get instanceProperty = self::A2|get#instanceProperty;
+  operator + = self::A2|+;
+  operator - = self::A2|-;
+  operator unary- = self::A2|unary-;
+  static field staticField = self::A2|staticField;
+  static get staticProperty = get self::A2|staticProperty;
+  set instanceProperty = self::A2|set#instanceProperty;
+  static set staticProperty = set self::A2|staticProperty;
+}
+static field core::int* A2|staticField = self::A1::getStaticField();
+static method A2|get#instanceProperty(lowered final self::A1* #this) → core::int*
+  return #this.{self::A1::getInstanceField}(){() →* core::int*};
+static method A2|set#instanceProperty(lowered final self::A1* #this, core::int* value) → void {
+  #this.{self::A1::setInstanceField}(value){(core::int*) →* void};
+}
+static method A2|+(lowered final self::A1* #this, core::int* value) → core::int* {
+  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::num::+}(value){(core::num*) →* core::int*};
+}
+static method A2|-(lowered final self::A1* #this, core::int* value) → core::int* {
+  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::num::-}(value){(core::num*) →* core::int*};
+}
+static method A2|unary-(lowered final self::A1* #this) → core::int* {
+  return #this.{self::A1::getInstanceField}(){() →* core::int*}.{core::int::unary-}(){() →* core::int*};
+}
+static get A2|staticProperty() → core::int*
+  return self::A1::getStaticField();
+static set A2|staticProperty(core::int* value) → void {
+  self::A1::setStaticField(value);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/private_members.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/private_members.dart.weak.modular.expect
new file mode 100644
index 0000000..1e4a440
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/private_members.dart.weak.modular.expect
@@ -0,0 +1,223 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/private_members.dart:23:14: Error: Method not found: '_PrivateExtension'.
+//   expect(42, _PrivateExtension("").publicMethod1());
+//              ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:24:14: Error: Method not found: '_PrivateExtension'.
+//   expect(87, _PrivateExtension("")._privateMethod1());
+//              ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:25:35: Error: Method not found: '_privateMethod2'.
+//   expect(237, PublicExtension("")._privateMethod2());
+//                                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:27:14: Error: Undefined name '_PrivateExtension'.
+//   expect(24, _PrivateExtension.publicStaticMethod1());
+//              ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:28:14: Error: Undefined name '_PrivateExtension'.
+//   expect(78, _PrivateExtension._privateStaticMethod1());
+//              ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:29:31: Error: Member not found: 'PublicExtension._privateStaticMethod2'.
+//   expect(732, PublicExtension._privateStaticMethod2());
+//                               ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:17:17: Error: The method 'publicMethod1' isn't defined for the class 'String'.
+// Try correcting the name to the name of an existing method, or defining a method named 'publicMethod1'.
+//   expect(42, "".publicMethod1());
+//                 ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:18:17: Error: The method '_privateMethod1' isn't defined for the class 'String'.
+// Try correcting the name to the name of an existing method, or defining a method named '_privateMethod1'.
+//   expect(87, ""._privateMethod1());
+//                 ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:19:18: Error: The method '_privateMethod2' isn't defined for the class 'String'.
+// Try correcting the name to the name of an existing method, or defining a method named '_privateMethod2'.
+//   expect(237, ""._privateMethod2());
+//                  ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:20:18: Error: The method 'publicMethod3' isn't defined for the class 'String'.
+// Try correcting the name to the name of an existing method, or defining a method named 'publicMethod3'.
+//   expect(473, "".publicMethod3());
+//                  ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/private_members.dart:21:18: Error: The method '_privateMethod3' isn't defined for the class 'String'.
+// Try correcting the name to the name of an existing method, or defining a method named '_privateMethod3'.
+//   expect(586, ""._privateMethod3());
+//                  ^^^^^^^^^^^^^^^
+//
+import self as self;
+import "private_members_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_members_lib.dart";
+
+static method main() → dynamic {
+  pri::test();
+  pri::expect(123, pri::PublicExtension|publicMethod2(""));
+  pri::expect(123, pri::PublicExtension|publicMethod2(""));
+  pri::expect(321, pri::PublicExtension|publicStaticMethod2());
+}
+static method errors() → dynamic {
+  pri::expect(42, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:17:17: Error: The method 'publicMethod1' isn't defined for the class 'String'.
+Try correcting the name to the name of an existing method, or defining a method named 'publicMethod1'.
+  expect(42, \"\".publicMethod1());
+                ^^^^^^^^^^^^^" in ""{<unresolved>}.publicMethod1());
+  pri::expect(87, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:18:17: Error: The method '_privateMethod1' isn't defined for the class 'String'.
+Try correcting the name to the name of an existing method, or defining a method named '_privateMethod1'.
+  expect(87, \"\"._privateMethod1());
+                ^^^^^^^^^^^^^^^" in ""{<unresolved>}._privateMethod1());
+  pri::expect(237, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:19:18: Error: The method '_privateMethod2' isn't defined for the class 'String'.
+Try correcting the name to the name of an existing method, or defining a method named '_privateMethod2'.
+  expect(237, \"\"._privateMethod2());
+                 ^^^^^^^^^^^^^^^" in ""{<unresolved>}._privateMethod2());
+  pri::expect(473, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:20:18: Error: The method 'publicMethod3' isn't defined for the class 'String'.
+Try correcting the name to the name of an existing method, or defining a method named 'publicMethod3'.
+  expect(473, \"\".publicMethod3());
+                 ^^^^^^^^^^^^^" in ""{<unresolved>}.publicMethod3());
+  pri::expect(586, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:21:18: Error: The method '_privateMethod3' isn't defined for the class 'String'.
+Try correcting the name to the name of an existing method, or defining a method named '_privateMethod3'.
+  expect(586, \"\"._privateMethod3());
+                 ^^^^^^^^^^^^^^^" in ""{<unresolved>}._privateMethod3());
+  pri::expect(42, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:23:14: Error: Method not found: '_PrivateExtension'.
+  expect(42, _PrivateExtension(\"\").publicMethod1());
+             ^^^^^^^^^^^^^^^^^"{dynamic}.publicMethod1());
+  pri::expect(87, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:24:14: Error: Method not found: '_PrivateExtension'.
+  expect(87, _PrivateExtension(\"\")._privateMethod1());
+             ^^^^^^^^^^^^^^^^^"{dynamic}._privateMethod1());
+  pri::expect(237, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:25:35: Error: Method not found: '_privateMethod2'.
+  expect(237, PublicExtension(\"\")._privateMethod2());
+                                  ^^^^^^^^^^^^^^^");
+  pri::expect(24, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:27:14: Error: Undefined name '_PrivateExtension'.
+  expect(24, _PrivateExtension.publicStaticMethod1());
+             ^^^^^^^^^^^^^^^^^"{dynamic}.publicStaticMethod1());
+  pri::expect(78, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:28:14: Error: Undefined name '_PrivateExtension'.
+  expect(78, _PrivateExtension._privateStaticMethod1());
+             ^^^^^^^^^^^^^^^^^"{dynamic}._privateStaticMethod1());
+  pri::expect(732, invalid-expression "pkg/front_end/testcases/extensions/private_members.dart:29:31: Error: Member not found: 'PublicExtension._privateStaticMethod2'.
+  expect(732, PublicExtension._privateStaticMethod2());
+                              ^^^^^^^^^^^^^^^^^^^^^");
+}
+
+library;
+import self as pri;
+import "dart:core" as core;
+
+extension _PrivateExtension on core::String* {
+  method publicMethod1 = pri::_PrivateExtension|publicMethod1;
+  tearoff publicMethod1 = pri::_PrivateExtension|get#publicMethod1;
+  method _privateMethod1 = pri::_PrivateExtension|_privateMethod1;
+  tearoff _privateMethod1 = pri::_PrivateExtension|get#_privateMethod1;
+  static method publicStaticMethod1 = pri::_PrivateExtension|publicStaticMethod1;
+  static method _privateStaticMethod1 = pri::_PrivateExtension|_privateStaticMethod1;
+  method test1 = pri::_PrivateExtension|test1;
+  tearoff test1 = pri::_PrivateExtension|get#test1;
+}
+extension PublicExtension on core::String* {
+  method publicMethod2 = pri::PublicExtension|publicMethod2;
+  tearoff publicMethod2 = pri::PublicExtension|get#publicMethod2;
+  method _privateMethod2 = pri::PublicExtension|_privateMethod2;
+  tearoff _privateMethod2 = pri::PublicExtension|get#_privateMethod2;
+  static method publicStaticMethod2 = pri::PublicExtension|publicStaticMethod2;
+  static method _privateStaticMethod2 = pri::PublicExtension|_privateStaticMethod2;
+  method test2 = pri::PublicExtension|test2;
+  tearoff test2 = pri::PublicExtension|get#test2;
+}
+extension _extension#0 on core::String* {
+  method publicMethod3 = pri::_extension#0|publicMethod3;
+  tearoff publicMethod3 = pri::_extension#0|get#publicMethod3;
+  method _privateMethod3 = pri::_extension#0|_privateMethod3;
+  tearoff _privateMethod3 = pri::_extension#0|get#_privateMethod3;
+  static method publicStaticMethod3 = pri::_extension#0|publicStaticMethod3;
+  static method _privateStaticMethod3 = pri::_extension#0|_privateStaticMethod3;
+  method test3 = pri::_extension#0|test3;
+  tearoff test3 = pri::_extension#0|get#test3;
+}
+static method _PrivateExtension|publicMethod1(lowered final core::String* #this) → core::int*
+  return 42;
+static method _PrivateExtension|get#publicMethod1(lowered final core::String* #this) → () →* core::int*
+  return () → core::int* => pri::_PrivateExtension|publicMethod1(#this);
+static method _PrivateExtension|_privateMethod1(lowered final core::String* #this) → core::int*
+  return 87;
+static method _PrivateExtension|get#_privateMethod1(lowered final core::String* #this) → () →* core::int*
+  return () → core::int* => pri::_PrivateExtension|_privateMethod1(#this);
+static method _PrivateExtension|publicStaticMethod1() → core::int*
+  return 24;
+static method _PrivateExtension|_privateStaticMethod1() → core::int*
+  return 78;
+static method _PrivateExtension|test1(lowered final core::String* #this) → dynamic {
+  pri::expect(42, pri::_PrivateExtension|publicMethod1(#this));
+  pri::expect(87, pri::_PrivateExtension|_privateMethod1(#this));
+  pri::expect(24, pri::_PrivateExtension|publicStaticMethod1());
+  pri::expect(78, pri::_PrivateExtension|_privateStaticMethod1());
+}
+static method _PrivateExtension|get#test1(lowered final core::String* #this) → () →* dynamic
+  return () → dynamic => pri::_PrivateExtension|test1(#this);
+static method PublicExtension|publicMethod2(lowered final core::String* #this) → core::int*
+  return 123;
+static method PublicExtension|get#publicMethod2(lowered final core::String* #this) → () →* core::int*
+  return () → core::int* => pri::PublicExtension|publicMethod2(#this);
+static method PublicExtension|_privateMethod2(lowered final core::String* #this) → core::int*
+  return 237;
+static method PublicExtension|get#_privateMethod2(lowered final core::String* #this) → () →* core::int*
+  return () → core::int* => pri::PublicExtension|_privateMethod2(#this);
+static method PublicExtension|publicStaticMethod2() → core::int*
+  return 321;
+static method PublicExtension|_privateStaticMethod2() → core::int*
+  return 732;
+static method PublicExtension|test2(lowered final core::String* #this) → dynamic {
+  pri::expect(123, pri::PublicExtension|publicMethod2(#this));
+  pri::expect(237, pri::PublicExtension|_privateMethod2(#this));
+  pri::expect(321, pri::PublicExtension|publicStaticMethod2());
+  pri::expect(732, pri::PublicExtension|_privateStaticMethod2());
+}
+static method PublicExtension|get#test2(lowered final core::String* #this) → () →* dynamic
+  return () → dynamic => pri::PublicExtension|test2(#this);
+static method _extension#0|publicMethod3(lowered final core::String* #this) → core::int*
+  return 473;
+static method _extension#0|get#publicMethod3(lowered final core::String* #this) → () →* core::int*
+  return () → core::int* => pri::_extension#0|publicMethod3(#this);
+static method _extension#0|_privateMethod3(lowered final core::String* #this) → core::int*
+  return 586;
+static method _extension#0|get#_privateMethod3(lowered final core::String* #this) → () →* core::int*
+  return () → core::int* => pri::_extension#0|_privateMethod3(#this);
+static method _extension#0|publicStaticMethod3() → core::int*
+  return 374;
+static method _extension#0|_privateStaticMethod3() → core::int*
+  return 685;
+static method _extension#0|test3(lowered final core::String* #this) → dynamic {
+  pri::expect(473, pri::_extension#0|publicMethod3(#this));
+  pri::expect(586, pri::_extension#0|_privateMethod3(#this));
+  pri::expect(374, pri::_extension#0|publicStaticMethod3());
+  pri::expect(685, pri::_extension#0|_privateStaticMethod3());
+}
+static method _extension#0|get#test3(lowered final core::String* #this) → () →* dynamic
+  return () → dynamic => pri::_extension#0|test3(#this);
+static method test() → dynamic {
+  pri::expect(42, pri::_PrivateExtension|publicMethod1(""));
+  pri::expect(87, pri::_PrivateExtension|_privateMethod1(""));
+  pri::expect(123, pri::PublicExtension|publicMethod2(""));
+  pri::expect(237, pri::PublicExtension|_privateMethod2(""));
+  pri::expect(473, pri::_extension#0|publicMethod3(""));
+  pri::expect(586, pri::_extension#0|_privateMethod3(""));
+  pri::expect(42, pri::_PrivateExtension|publicMethod1(""));
+  pri::expect(87, pri::_PrivateExtension|_privateMethod1(""));
+  pri::expect(123, pri::PublicExtension|publicMethod2(""));
+  pri::expect(237, pri::PublicExtension|_privateMethod2(""));
+  pri::expect(24, pri::_PrivateExtension|publicStaticMethod1());
+  pri::expect(78, pri::_PrivateExtension|_privateStaticMethod1());
+  pri::expect(321, pri::PublicExtension|publicStaticMethod2());
+  pri::expect(732, pri::PublicExtension|_privateStaticMethod2());
+  pri::_PrivateExtension|test1("");
+  pri::PublicExtension|test2("");
+  pri::_extension#0|test3("");
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/static_access.dart.weak.modular.expect
new file mode 100644
index 0000000..973805f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/static_access.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  static method method = self::Extension|method;
+  static method genericMethod = self::Extension|genericMethod;
+  static get property = get self::Extension|property;
+  static field field = self::Extension|field;
+  method instanceMethod = self::Extension|instanceMethod;
+  tearoff instanceMethod = self::Extension|get#instanceMethod;
+  get instanceProperty = self::Extension|get#instanceProperty;
+  static set property = set self::Extension|property;
+  set instanceProperty = self::Extension|set#instanceProperty;
+}
+static field dynamic Extension|field;
+static method Extension|method() → dynamic {}
+static method Extension|genericMethod<T extends core::Object* = dynamic>(self::Extension|genericMethod::T* t) → dynamic {}
+static get Extension|property() → dynamic
+  return 42;
+static set Extension|property(dynamic value) → void {}
+static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic {}
+static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|instanceMethod(#this);
+static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+  return 42;
+static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void {}
+static method main() → dynamic {
+  self::Extension|method();
+  self::Extension|genericMethod<core::int*>(42);
+  self::Extension|genericMethod<core::num*>(42);
+  #C1;
+  #C2;
+  self::Extension|property;
+  self::Extension|property = 42;
+  self::Extension|field;
+  self::Extension|field = 42;
+}
+
+constants  {
+  #C1 = static-tearoff self::Extension|method
+  #C2 = static-tearoff self::Extension|genericMethod
+}
diff --git a/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.modular.expect
new file mode 100644
index 0000000..b6e0e94
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/static_access_of_instance.dart.weak.modular.expect
@@ -0,0 +1,64 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/static_access_of_instance.dart:14:13: Error: Member not found: 'Extension.instanceMethod'.
+//   Extension.instanceMethod();
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/static_access_of_instance.dart:15:13: Error: Member not found: 'instanceMethod'.
+//   Extension.instanceMethod;
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/static_access_of_instance.dart:16:13: Error: Member not found: 'instanceProperty'.
+//   Extension.instanceProperty;
+//             ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/static_access_of_instance.dart:17:13: Error: Setter not found: 'instanceProperty'.
+//   Extension.instanceProperty = 42;
+//             ^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  method instanceMethod = self::Extension|instanceMethod;
+  tearoff instanceMethod = self::Extension|get#instanceMethod;
+  get instanceProperty = self::Extension|get#instanceProperty;
+  set instanceProperty = self::Extension|set#instanceProperty;
+}
+static method Extension|instanceMethod(lowered final self::Class* #this) → dynamic {}
+static method Extension|get#instanceMethod(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|instanceMethod(#this);
+static method Extension|get#instanceProperty(lowered final self::Class* #this) → dynamic
+  return 42;
+static method Extension|set#instanceProperty(lowered final self::Class* #this, dynamic value) → void {}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:14:13: Error: Member not found: 'Extension.instanceMethod'.
+  Extension.instanceMethod();
+            ^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:15:13: Error: Member not found: 'instanceMethod'.
+  Extension.instanceMethod;
+            ^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:16:13: Error: Member not found: 'instanceProperty'.
+  Extension.instanceProperty;
+            ^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:17:13: Error: Setter not found: 'instanceProperty'.
+  Extension.instanceProperty = 42;
+            ^^^^^^^^^^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/extensions/tear_offs.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/tear_offs.dart.weak.modular.expect
new file mode 100644
index 0000000..d56bc4b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/tear_offs.dart.weak.modular.expect
@@ -0,0 +1,75 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+//     int Function(int) intId = getter;
+//                               ^
+//
+// pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
+//   num Function(num) numId = c.getter;
+//                               ^
+//
+// pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
+//   bool Function(bool) boolId = Extension(c).getter;
+//                                             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  method id = self::Extension|id;
+  tearoff id = self::Extension|get#id;
+  get getter = self::Extension|get#getter;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  method errors = self::Extension|errors;
+  tearoff errors = self::Extension|get#errors;
+}
+static method Extension|id<T extends core::Object* = dynamic>(lowered final self::Class* #this, self::Extension|id::T* t) → self::Extension|id::T*
+  return t;
+static method Extension|get#id(lowered final self::Class* #this) → <T extends core::Object* = dynamic>(T*) →* T*
+  return <T extends core::Object* = dynamic>(T* t) → T* => self::Extension|id<T*>(#this, t);
+static method Extension|get#getter(lowered final self::Class* #this) → <T extends core::Object* = dynamic>(T*) →* T*
+  return self::Extension|get#id(#this);
+static method Extension|method(lowered final self::Class* #this) → dynamic {
+  (core::String*) →* core::String* stringId = self::Extension|get#id(#this)<core::String*>;
+}
+static method Extension|get#method(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|method(#this);
+static method Extension|errors(lowered final self::Class* #this) → dynamic {
+  (core::int*) →* core::int* intId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+    int Function(int) intId = getter;
+                              ^" in self::Extension|get#getter(#this) as{TypeError} (core::int*) →* core::int*;
+}
+static method Extension|get#errors(lowered final self::Class* #this) → () →* dynamic
+  return () → dynamic => self::Extension|errors(#this);
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  (core::int*) →* core::int* intId = self::Extension|get#id(c)<core::int*>;
+  (core::double*) →* core::double* doubleId = self::Extension|get#id(c)<core::double*>;
+}
+static method errors() → dynamic {
+  self::Class* c = new self::Class::•();
+  (core::num*) →* core::num* numId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
+  num Function(num) numId = c.getter;
+                              ^" in self::Extension|get#getter(c) as{TypeError} (core::num*) →* core::num*;
+  (core::bool*) →* core::bool* boolId = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
+  bool Function(bool) boolId = Extension(c).getter;
+                                            ^" in self::Extension|get#getter(c) as{TypeError} (core::bool*) →* core::bool*;
+}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..42e4b34
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass*
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object* = dynamic> on T* {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class*> on T* {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object* = dynamic>(lowered final self::Extension|method1::T* #this) → self::Extension|method1::T*
+  return #this;
+static method Extension|get#method1<T extends core::Object* = dynamic>(lowered final self::Extension|get#method1::T* #this) → () →* self::Extension|get#method1::T*
+  return () → self::Extension|get#method1::T* => self::Extension|method1<self::Extension|get#method1::T*>(#this);
+static method BoundExtension|method2<T extends self::Class*>(lowered final self::BoundExtension|method2::T* #this) → self::BoundExtension|method2::T*
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class*>(lowered final self::BoundExtension|get#method2::T* #this) → () →* self::BoundExtension|get#method2::T*
+  return () → self::BoundExtension|get#method2::T* => self::BoundExtension|method2<self::BoundExtension|get#method2::T*>(#this);
+static method test1<T extends core::Object* = dynamic>(self::test1::T* t1) → self::Class* {
+  if(t1 is self::SubClass*) {
+    return self::Extension|method1<self::SubClass*>(t1{self::test1::T* & self::SubClass* /* '*' & '*' = '*' */});
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class*>(self::test2::T* t2) → dynamic {
+  if(self::test2::T* =={core::Type::==}{(core::Object*) →* core::bool*} #C1) {
+    self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
+  }
+}
+static method test3<T extends core::Object* = dynamic>(self::test3::T* t3) → dynamic {
+  if(t3 is self::SubClass*) {
+    self::SubClass* subClass = self::BoundExtension|method2<self::SubClass*>(t3{self::test3::T* & self::SubClass* /* '*' & '*' = '*' */});
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::SubClass*)
+}
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/type_variables.dart.weak.modular.expect
new file mode 100644
index 0000000..aeae0f7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension A2<T extends core::Object* = dynamic> on self::A1<T*>* {
+  method method1 = self::A2|method1;
+  tearoff method1 = self::A2|get#method1;
+  method method2 = self::A2|method2;
+  tearoff method2 = self::A2|get#method2;
+}
+extension A3<T extends self::A1<T*>* = self::A1<dynamic>*> on self::A1<T*>* {
+}
+extension A4<T extends core::Object* = dynamic> on self::A1<T*>* {
+  method method = self::A4|method;
+  tearoff method = self::A4|get#method;
+}
+static method A2|method1<T extends core::Object* = dynamic, S extends self::A2|method1::T* = dynamic>(lowered final self::A1<self::A2|method1::T*>* #this) → self::A1<self::A2|method1::T*>* {
+  return #this;
+}
+static method A2|get#method1<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method1::T*>* #this) → <S extends self::A2|get#method1::T* = dynamic>() →* self::A1<self::A2|get#method1::T*>*
+  return <S extends self::A2|get#method1::T* = dynamic>() → self::A1<self::A2|get#method1::T*>* => self::A2|method1<self::A2|get#method1::T*, S*>(#this);
+static method A2|method2<T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::T*>* = self::A1<dynamic>*>(lowered final self::A1<self::A2|method2::T*>* #this, self::A2|method2::S* o) → self::A1<self::A2|method2::T*>* {
+  core::print(o);
+  core::print(self::A2|method2::T*);
+  core::print(self::A2|method2::S*);
+  return #this;
+}
+static method A2|get#method2<T extends core::Object* = dynamic>(lowered final self::A1<self::A2|get#method2::T*>* #this) → <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S*) →* self::A1<self::A2|get#method2::T*>*
+  return <S extends self::A1<self::A2|get#method2::T*>* = self::A1<dynamic>*>(S* o) → self::A1<self::A2|get#method2::T*>* => self::A2|method2<self::A2|get#method2::T*, S*>(#this, o);
+static method A4|method<#T extends core::Object* = dynamic, T extends core::Object* = dynamic>(lowered final self::A1<self::A4|method::#T*>* #this) → dynamic {}
+static method A4|get#method<#T extends core::Object* = dynamic>(lowered final self::A1<self::A4|get#method::#T*>* #this) → <T extends core::Object* = dynamic>() →* dynamic
+  return <T extends core::Object* = dynamic>() → dynamic => self::A4|method<self::A4|get#method::#T*, T*>(#this);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.modular.expect
new file mode 100644
index 0000000..6532400
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/unnamed_extensions.dart.weak.modular.expect
@@ -0,0 +1,147 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::Class1*
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return "Class1(${this.{self::Class1::field}{core::int*}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::Class2*
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return "Class2(${this.{self::Class2::field}{core::int*}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension _extension#0 on self::Class1* {
+  method method = self::_extension#0|method;
+  tearoff method = self::_extension#0|get#method;
+  method genericMethod = self::_extension#0|genericMethod;
+  tearoff genericMethod = self::_extension#0|get#genericMethod;
+  get property = self::_extension#0|get#property;
+  set property = self::_extension#0|set#property;
+}
+extension _extension#1 on self::Class2* {
+  method method = self::_extension#1|method;
+  tearoff method = self::_extension#1|get#method;
+  method genericMethod = self::_extension#1|genericMethod;
+  tearoff genericMethod = self::_extension#1|get#genericMethod;
+  get property = self::_extension#1|get#property;
+  set property = self::_extension#1|set#property;
+}
+static method _extension#0|method(lowered final self::Class1* #this) → core::int* {
+  core::print("Extension1.method on ${#this}");
+  return #this.{self::Class1::field}{core::int*};
+}
+static method _extension#0|get#method(lowered final self::Class1* #this) → () →* core::int*
+  return () → core::int* => self::_extension#0|method(#this);
+static method _extension#0|genericMethod<T extends core::num*>(lowered final self::Class1* #this, self::_extension#0|genericMethod::T* t) → core::int* {
+  core::print("Extension1.genericMethod<${self::_extension#0|genericMethod::T*}>(${t}) on ${#this}");
+  return #this.{self::Class1::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*} as{TypeError} core::int*;
+}
+static method _extension#0|get#genericMethod(lowered final self::Class1* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::_extension#0|genericMethod<T*>(#this, t);
+static method _extension#0|get#property(lowered final self::Class1* #this) → core::int* {
+  core::print("Extension1.property get on ${#this}");
+  return #this.{self::Class1::field}{core::int*};
+}
+static method _extension#0|set#property(lowered final self::Class1* #this, core::int* value) → void {
+  #this.{self::Class1::field} = value;
+  core::print("Extension1.property set(${value}) on ${#this}");
+  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+}
+static method _extension#1|method(lowered final self::Class2* #this) → core::int* {
+  core::print("Extension2.method on ${#this}");
+  return #this.{self::Class2::field}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*};
+}
+static method _extension#1|get#method(lowered final self::Class2* #this) → () →* core::int*
+  return () → core::int* => self::_extension#1|method(#this);
+static method _extension#1|genericMethod<T extends core::num*>(lowered final self::Class2* #this, self::_extension#1|genericMethod::T* t) → core::int* {
+  core::print("Extension2.genericMethod<${self::_extension#1|genericMethod::T*}>(${t}) on ${#this}");
+  return #this.{self::Class2::field}{core::int*}.{core::num::+}(t){(core::num*) →* core::num*}.{core::num::+}(4){(core::num*) →* core::num*} as{TypeError} core::int*;
+}
+static method _extension#1|get#genericMethod(lowered final self::Class2* #this) → <T extends core::num*>(T*) →* core::int*
+  return <T extends core::num*>(T* t) → core::int* => self::_extension#1|genericMethod<T*>(#this, t);
+static method _extension#1|get#property(lowered final self::Class2* #this) → core::int* {
+  core::print("Extension2.property get on ${#this}");
+  return #this.{self::Class2::field}{core::int*}.{core::num::+}(5){(core::num*) →* core::int*};
+}
+static method _extension#1|set#property(lowered final self::Class2* #this, core::int* value) → void {
+  core::print("Extension2.property set(${value}) on ${#this}");
+  value = value.{core::num::+}(1){(core::num*) →* core::int*};
+  #this.{self::Class2::field} = value;
+}
+static method main() → dynamic {
+  self::testExtension1();
+  self::testExtension2();
+}
+static method testExtension1() → dynamic {
+  self::Class1* c0 = new self::Class1::•(0);
+  self::Class1* c1 = new self::Class1::•(1);
+  self::expect(0, self::_extension#0|method(c0));
+  self::expect(1, self::_extension#0|method(c1));
+  self::expect(1, let final self::Class1* #t1 = c1 in #t1 == null ?{core::int*} null : self::_extension#0|method(#t1));
+  self::expect(42, self::_extension#0|genericMethod<core::int*>(c0, 42));
+  self::expect(43, self::_extension#0|genericMethod<core::num*>(c0, 43));
+  self::expect(88, self::_extension#0|genericMethod<core::int*>(c1, 87));
+  self::expect(89, self::_extension#0|genericMethod<core::num*>(c1, 88));
+  self::expect(0, self::_extension#0|get#property(c0));
+  self::expect(0, let final self::Class1* #t2 = c0 in #t2 == null ?{core::int*} null : self::_extension#0|get#property(#t2));
+  self::expect(42, let final core::int* #t3 = 42 in let final void #t4 = self::_extension#0|set#property(c0, #t3) in #t3);
+  self::expect(1, self::_extension#0|get#property(c1));
+  self::expect(87, let final core::int* #t5 = 87 in let final void #t6 = self::_extension#0|set#property(c0, #t5) in #t5);
+  self::expect(27, let final core::int* #t7 = let final core::int* #t8 = 27 in let final void #t9 = self::_extension#0|set#property(c1, #t8) in #t8 in let final void #t10 = self::_extension#0|set#property(c0, #t7) in #t7);
+  self::expect(37, let final core::int* #t11 = let final core::int* #t12 = 37 in let final void #t13 = self::_extension#0|set#property(c0, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(c1, #t11) in #t11);
+  self::expect(77, let final core::int* #t15 = let final core::int* #t16 = let final core::int* #t17 = 77 in let final void #t18 = self::_extension#0|set#property(c1, #t17) in #t17 in let final void #t19 = self::_extension#0|set#property(c0, #t16) in #t16 in let final void #t20 = self::_extension#0|set#property(c1, #t15) in #t15);
+  self::expect(67, let final core::int* #t21 = let final core::int* #t22 = let final core::int* #t23 = 67 in let final void #t24 = self::_extension#0|set#property(c0, #t23) in #t23 in let final void #t25 = self::_extension#0|set#property(c1, #t22) in #t22 in let final void #t26 = self::_extension#0|set#property(c0, #t21) in #t21);
+}
+static method testExtension2() → dynamic {
+  self::Class2* c0 = new self::Class2::•(0);
+  self::Class2* c1 = new self::Class2::•(1);
+  self::expect(3, self::_extension#1|method(c0));
+  self::expect(3, let final self::Class2* #t27 = c0 in #t27 == null ?{core::int*} null : self::_extension#1|method(#t27));
+  self::expect(4, self::_extension#1|method(c1));
+  self::expect(46, self::_extension#1|genericMethod<core::int*>(c0, 42));
+  self::expect(47, self::_extension#1|genericMethod<core::num*>(c0, 43));
+  self::expect(92, self::_extension#1|genericMethod<core::int*>(c1, 87));
+  self::expect(93, self::_extension#1|genericMethod<core::num*>(c1, 88));
+  self::expect(5, self::_extension#1|get#property(c0));
+  self::expect(5, let final self::Class2* #t28 = c0 in #t28 == null ?{core::int*} null : self::_extension#1|get#property(#t28));
+  self::expect(42, let final core::int* #t29 = 42 in let final void #t30 = self::_extension#1|set#property(c0, #t29) in #t29);
+  self::expect(48, self::_extension#1|get#property(c0));
+  self::expect(6, self::_extension#1|get#property(c1));
+  self::expect(43, let final core::int* #t31 = 43 in let final void #t32 = self::_extension#1|set#property(c1, #t31) in #t31);
+  self::expect(49, self::_extension#1|get#property(c1));
+  self::expect(49, let final core::int* #t33 = self::_extension#1|get#property(c1) in let final void #t34 = self::_extension#1|set#property(c0, #t33) in #t33);
+  self::expect(55, let final core::int* #t35 = self::_extension#1|get#property(c0) in let final void #t36 = self::_extension#1|set#property(c1, #t35) in #t35);
+  self::expect(61, let final core::int* #t37 = let final core::int* #t38 = self::_extension#1|get#property(c1) in let final void #t39 = self::_extension#1|set#property(c0, #t38) in #t38 in let final void #t40 = self::_extension#1|set#property(c1, #t37) in #t37);
+  self::expect(67, let final core::int* #t41 = let final core::int* #t42 = self::_extension#1|get#property(c0) in let final void #t43 = self::_extension#1|set#property(c1, #t42) in #t42 in let final void #t44 = self::_extension#1|set#property(c0, #t41) in #t41);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.weak.modular.expect b/pkg/front_end/testcases/extensions/use_this.dart.weak.modular.expect
new file mode 100644
index 0000000..f7ce7a4
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/use_this.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension A2 on self::A1* {
+  method method1 = self::A2|method1;
+  tearoff method1 = self::A2|get#method1;
+  method method2 = self::A2|method2;
+  tearoff method2 = self::A2|get#method2;
+}
+extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+  method method1 = self::B2|method1;
+  tearoff method1 = self::B2|get#method1;
+  method method2 = self::B2|method2;
+  tearoff method2 = self::B2|get#method2;
+}
+static method A2|method1(lowered final self::A1* #this) → self::A1* {
+  return #this;
+}
+static method A2|get#method1(lowered final self::A1* #this) → () →* self::A1*
+  return () → self::A1* => self::A2|method1(#this);
+static method A2|method2<T extends core::Object* = dynamic>(lowered final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+  core::print(o);
+  return #this;
+}
+static method A2|get#method2(lowered final self::A1* #this) → <T extends core::Object* = dynamic>(T*) →* self::A1*
+  return <T extends core::Object* = dynamic>(T* o) → self::A1* => self::A2|method2<T*>(#this, o);
+static method B2|method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|method1::T*>* #this) → self::B1<self::B2|method1::T*>* {
+  return #this;
+}
+static method B2|get#method1<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method1::T*>* #this) → () →* self::B1<self::B2|get#method1::T*>*
+  return () → self::B1<self::B2|get#method1::T*>* => self::B2|method1<self::B2|get#method1::T*>(#this);
+static method B2|method2<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(lowered final self::B1<self::B2|method2::T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::T*>* {
+  core::print(o);
+  return #this;
+}
+static method B2|get#method2<T extends core::Object* = dynamic>(lowered final self::B1<self::B2|get#method2::T*>* #this) → <S extends core::Object* = dynamic>(S*) →* self::B1<self::B2|get#method2::T*>*
+  return <S extends core::Object* = dynamic>(S* o) → self::B1<self::B2|get#method2::T*>* => self::B2|method2<self::B2|get#method2::T*, S*>(#this, o);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.weak.modular.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.weak.modular.expect
new file mode 100644
index 0000000..c7ae21e
--- /dev/null
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.weak.modular.expect
@@ -0,0 +1,541 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class DeltaBlue extends core::Object {
+  synthetic constructor •() → self::DeltaBlue*
+    : super core::Object::•()
+    ;
+  method run() → void {
+    self::chainTest(100);
+    self::projectionTest(100);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Strength extends core::Object /*hasConstConstructor*/  {
+  final field core::int* value;
+  final field core::String* name;
+  const constructor •(core::int* value, core::String* name) → self::Strength*
+    : self::Strength::value = value, self::Strength::name = name, super core::Object::•()
+    ;
+  method nextWeaker() → self::Strength*
+    return #C19.{core::List::[]}(this.{self::Strength::value}{core::int*}){(core::int*) →* self::Strength*};
+  static method stronger(self::Strength* s1, self::Strength* s2) → core::bool* {
+    return s1.{self::Strength::value}{core::int*}.{core::num::<}(s2.{self::Strength::value}{core::int*}){(core::num*) →* core::bool*};
+  }
+  static method weaker(self::Strength* s1, self::Strength* s2) → core::bool* {
+    return s1.{self::Strength::value}{core::int*}.{core::num::>}(s2.{self::Strength::value}{core::int*}){(core::num*) →* core::bool*};
+  }
+  static method weakest(self::Strength* s1, self::Strength* s2) → self::Strength* {
+    return self::Strength::weaker(s1, s2) ?{self::Strength*} s1 : s2;
+  }
+  static method strongest(self::Strength* s1, self::Strength* s2) → self::Strength* {
+    return self::Strength::stronger(s1, s2) ?{self::Strength*} s1 : s2;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Constraint extends core::Object /*hasConstConstructor*/  {
+  final field self::Strength* strength;
+  const constructor •(self::Strength* strength) → self::Constraint*
+    : self::Constraint::strength = strength, super core::Object::•()
+    ;
+  abstract method isSatisfied() → core::bool*;
+  abstract method markUnsatisfied() → void;
+  abstract method addToGraph() → void;
+  abstract method removeFromGraph() → void;
+  abstract method chooseMethod(core::int* mark) → void;
+  abstract method markInputs(core::int* mark) → void;
+  abstract method inputsKnown(core::int* mark) → core::bool*;
+  abstract method output() → self::Variable*;
+  abstract method execute() → void;
+  abstract method recalculate() → void;
+  method addConstraint() → void {
+    this.{self::Constraint::addToGraph}(){() →* void};
+    self::planner.{self::Planner::incrementalAdd}(this){(self::Constraint*) →* void};
+  }
+  method satisfy(dynamic mark) → self::Constraint* {
+    this.{self::Constraint::chooseMethod}(mark as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+    if(!this.{self::Constraint::isSatisfied}(){() →* core::bool*}) {
+      if(this.{self::Constraint::strength}{self::Strength*} =={self::Strength::==}{(dynamic) →* core::bool*} #C22) {
+        core::print("Could not satisfy a required constraint!");
+      }
+      return null;
+    }
+    this.{self::Constraint::markInputs}(mark as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+    self::Variable* out = this.{self::Constraint::output}(){() →* self::Variable*};
+    self::Constraint* overridden = out.{self::Variable::determinedBy}{self::Constraint*};
+    if(!(overridden == null))
+      overridden.{self::Constraint::markUnsatisfied}(){() →* void};
+    out.{self::Variable::determinedBy} = this;
+    if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError,ForDynamic} core::int*){(self::Constraint*, core::int*) →* core::bool*})
+      core::print("Cycle encountered");
+    out.{self::Variable::mark} = mark as{TypeError,ForDynamic} core::int*;
+    return overridden;
+  }
+  method destroyConstraint() → void {
+    if(this.{self::Constraint::isSatisfied}(){() →* core::bool*})
+      self::planner.{self::Planner::incrementalRemove}(this){(self::Constraint*) →* void};
+    this.{self::Constraint::removeFromGraph}(){() →* void};
+  }
+  method isInput() → core::bool*
+    return false;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class UnaryConstraint extends self::Constraint {
+  final field self::Variable* myOutput;
+  field core::bool* satisfied = false;
+  constructor •(self::Variable* myOutput, self::Strength* strength) → self::UnaryConstraint*
+    : self::UnaryConstraint::myOutput = myOutput, super self::Constraint::•(strength) {
+    this.{self::Constraint::addConstraint}(){() →* void};
+  }
+  method addToGraph() → void {
+    this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
+    this.{self::UnaryConstraint::satisfied} = false;
+  }
+  method chooseMethod(core::int* mark) → void {
+    this.{self::UnaryConstraint::satisfied} = !(this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) && self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*});
+  }
+  method isSatisfied() → core::bool*
+    return this.{self::UnaryConstraint::satisfied}{core::bool*};
+  method markInputs(core::int* mark) → void {}
+  method output() → self::Variable*
+    return this.{self::UnaryConstraint::myOutput}{self::Variable*};
+  method recalculate() → void {
+    this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::walkStrength} = this.{self::Constraint::strength}{self::Strength*};
+    this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::stay} = !this.{self::Constraint::isInput}(){() →* core::bool*};
+    if(this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::stay}{core::bool*})
+      this.{self::Constraint::execute}(){() →* void};
+  }
+  method markUnsatisfied() → void {
+    this.{self::UnaryConstraint::satisfied} = false;
+  }
+  method inputsKnown(core::int* mark) → core::bool*
+    return true;
+  method removeFromGraph() → void {
+    if(!(this.{self::UnaryConstraint::myOutput}{self::Variable*} == null))
+      this.{self::UnaryConstraint::myOutput}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
+    this.{self::UnaryConstraint::satisfied} = false;
+  }
+}
+class StayConstraint extends self::UnaryConstraint {
+  constructor •(self::Variable* v, self::Strength* str) → self::StayConstraint*
+    : super self::UnaryConstraint::•(v, str)
+    ;
+  method execute() → void {}
+}
+class EditConstraint extends self::UnaryConstraint {
+  constructor •(self::Variable* v, self::Strength* str) → self::EditConstraint*
+    : super self::UnaryConstraint::•(v, str)
+    ;
+  method isInput() → core::bool*
+    return true;
+  method execute() → void {}
+}
+abstract class BinaryConstraint extends self::Constraint {
+  field self::Variable* v1;
+  field self::Variable* v2;
+  field core::int* direction = #C1;
+  constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) → self::BinaryConstraint*
+    : self::BinaryConstraint::v1 = v1, self::BinaryConstraint::v2 = v2, super self::Constraint::•(strength) {
+    this.{self::Constraint::addConstraint}(){() →* void};
+  }
+  method chooseMethod(core::int* mark) → void {
+    if(this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) {
+      this.{self::BinaryConstraint::direction} = !(this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) && self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}) ?{core::int*} #C4 : #C1;
+    }
+    if(this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) {
+      this.{self::BinaryConstraint::direction} = !(this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) && self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}) ?{core::int*} #C20 : #C1;
+    }
+    if(self::Strength::weaker(this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}, this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*})) {
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}) ?{core::int*} #C20 : #C1;
+    }
+    else {
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}{self::Strength*}, this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::walkStrength}{self::Strength*}) ?{core::int*} #C4 : #C20;
+    }
+  }
+  method addToGraph() → void {
+    this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
+    this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
+    this.{self::BinaryConstraint::direction} = #C1;
+  }
+  method isSatisfied() → core::bool*
+    return !(this.{self::BinaryConstraint::direction}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} #C1);
+  method markInputs(core::int* mark) → void {
+    this.{self::BinaryConstraint::input}(){() →* self::Variable*}.{self::Variable::mark} = mark;
+  }
+  method input() → self::Variable*
+    return this.{self::BinaryConstraint::direction}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} #C4 ?{self::Variable*} this.{self::BinaryConstraint::v1}{self::Variable*} : this.{self::BinaryConstraint::v2}{self::Variable*};
+  method output() → self::Variable*
+    return this.{self::BinaryConstraint::direction}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} #C4 ?{self::Variable*} this.{self::BinaryConstraint::v2}{self::Variable*} : this.{self::BinaryConstraint::v1}{self::Variable*};
+  method recalculate() → void {
+    self::Variable* ihn = this.{self::BinaryConstraint::input}(){() →* self::Variable*};
+    self::Variable* out = this.{self::BinaryConstraint::output}(){() →* self::Variable*};
+    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}{self::Strength*}, ihn.{self::Variable::walkStrength}{self::Strength*});
+    out.{self::Variable::stay} = ihn.{self::Variable::stay}{core::bool*};
+    if(out.{self::Variable::stay}{core::bool*})
+      this.{self::Constraint::execute}(){() →* void};
+  }
+  method markUnsatisfied() → void {
+    this.{self::BinaryConstraint::direction} = #C1;
+  }
+  method inputsKnown(core::int* mark) → core::bool* {
+    self::Variable* i = this.{self::BinaryConstraint::input}(){() →* self::Variable*};
+    return i.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark || i.{self::Variable::stay}{core::bool*} || i.{self::Variable::determinedBy}{self::Constraint*} == null;
+  }
+  method removeFromGraph() → void {
+    if(!(this.{self::BinaryConstraint::v1}{self::Variable*} == null))
+      this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
+    if(!(this.{self::BinaryConstraint::v2}{self::Variable*} == null))
+      this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
+    this.{self::BinaryConstraint::direction} = #C1;
+  }
+}
+class ScaleConstraint extends self::BinaryConstraint {
+  final field self::Variable* scale;
+  final field self::Variable* offset;
+  constructor •(self::Variable* src, self::Variable* scale, self::Variable* offset, self::Variable* dest, self::Strength* strength) → self::ScaleConstraint*
+    : self::ScaleConstraint::scale = scale, self::ScaleConstraint::offset = offset, super self::BinaryConstraint::•(src, dest, strength)
+    ;
+  method addToGraph() → void {
+    super.{self::BinaryConstraint::addToGraph}();
+    this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
+    this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::addConstraint}(this){(self::Constraint*) →* void};
+  }
+  method removeFromGraph() → void {
+    super.{self::BinaryConstraint::removeFromGraph}();
+    if(!(this.{self::ScaleConstraint::scale}{self::Variable*} == null))
+      this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
+    if(!(this.{self::ScaleConstraint::offset}{self::Variable*} == null))
+      this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::removeConstraint}(this){(self::Constraint*) →* void};
+  }
+  method markInputs(core::int* mark) → void {
+    super.{self::BinaryConstraint::markInputs}(mark);
+    this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::mark} = mark;
+  }
+  method execute() → void {
+    if(this.{self::BinaryConstraint::direction}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} #C4) {
+      this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::value} = this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::value}{core::int*}.{core::num::*}(this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::value}{core::int*}){(core::num*) →* core::int*}.{core::num::+}(this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::value}{core::int*}){(core::num*) →* core::int*};
+    }
+    else {
+      this.{self::BinaryConstraint::v1}{self::Variable*}.{self::Variable::value} = this.{self::BinaryConstraint::v2}{self::Variable*}.{self::Variable::value}{core::int*}.{core::num::-}(this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::value}{core::int*}){(core::num*) →* core::int*}.{core::num::~/}(this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::value}{core::int*}){(core::num*) →* core::int*};
+    }
+  }
+  method recalculate() → void {
+    self::Variable* ihn = this.{self::BinaryConstraint::input}(){() →* self::Variable*};
+    self::Variable* out = this.{self::BinaryConstraint::output}(){() →* self::Variable*};
+    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}{self::Strength*}, ihn.{self::Variable::walkStrength}{self::Strength*});
+    out.{self::Variable::stay} = ihn.{self::Variable::stay}{core::bool*} && this.{self::ScaleConstraint::scale}{self::Variable*}.{self::Variable::stay}{core::bool*} && this.{self::ScaleConstraint::offset}{self::Variable*}.{self::Variable::stay}{core::bool*};
+    if(out.{self::Variable::stay}{core::bool*})
+      this.{self::ScaleConstraint::execute}(){() →* void};
+  }
+}
+class EqualityConstraint extends self::BinaryConstraint {
+  constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) → self::EqualityConstraint*
+    : super self::BinaryConstraint::•(v1, v2, strength)
+    ;
+  method execute() → void {
+    this.{self::BinaryConstraint::output}(){() →* self::Variable*}.{self::Variable::value} = this.{self::BinaryConstraint::input}(){() →* self::Variable*}.{self::Variable::value}{core::int*};
+  }
+}
+class Variable extends core::Object {
+  field core::List<self::Constraint*>* constraints = <self::Constraint*>[];
+  field self::Constraint* determinedBy = null;
+  field core::int* mark = 0;
+  field self::Strength* walkStrength = #C18;
+  field core::bool* stay = true;
+  field core::int* value;
+  final field core::String* name;
+  constructor •(core::String* name, core::int* value) → self::Variable*
+    : self::Variable::name = name, self::Variable::value = value, super core::Object::•()
+    ;
+  method addConstraint(self::Constraint* c) → void {
+    this.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::add}(c){(self::Constraint*) →* void};
+  }
+  method removeConstraint(self::Constraint* c) → void {
+    this.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::remove}(c){(core::Object*) →* core::bool*};
+    if(this.{self::Variable::determinedBy}{self::Constraint*} =={self::Constraint::==}{(dynamic) →* core::bool*} c)
+      this.{self::Variable::determinedBy} = null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Planner extends core::Object {
+  field core::int* currentMark = 0;
+  synthetic constructor •() → self::Planner*
+    : super core::Object::•()
+    ;
+  method incrementalAdd(self::Constraint* c) → void {
+    core::int* mark = this.{self::Planner::newMark}(){() →* core::int*};
+    for (self::Constraint* overridden = c.{self::Constraint::satisfy}(mark){(dynamic) →* self::Constraint*}; !(overridden == null); overridden = overridden.{self::Constraint::satisfy}(mark){(dynamic) →* self::Constraint*})
+      ;
+  }
+  method incrementalRemove(self::Constraint* c) → void {
+    self::Variable* out = c.{self::Constraint::output}(){() →* self::Variable*};
+    c.{self::Constraint::markUnsatisfied}(){() →* void};
+    c.{self::Constraint::removeFromGraph}(){() →* void};
+    core::List<self::Constraint*>* unsatisfied = this.{self::Planner::removePropagateFrom}(out){(self::Variable*) →* core::List<self::Constraint*>*};
+    self::Strength* strength = #C22;
+    do {
+      for (core::int* i = 0; i.{core::num::<}(unsatisfied.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+        self::Constraint* u = unsatisfied.{core::List::[]}(i){(core::int*) →* self::Constraint*};
+        if(u.{self::Constraint::strength}{self::Strength*} =={self::Strength::==}{(dynamic) →* core::bool*} strength)
+          this.{self::Planner::incrementalAdd}(u){(self::Constraint*) →* void};
+      }
+      strength = strength.{self::Strength::nextWeaker}(){() →* self::Strength*};
+    }
+    while (!(strength =={self::Strength::==}{(dynamic) →* core::bool*} #C18))
+  }
+  method newMark() → core::int*
+    return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+  method makePlan(core::List<self::Constraint*>* sources) → self::Plan* {
+    core::int* mark = this.{self::Planner::newMark}(){() →* core::int*};
+    self::Plan* plan = new self::Plan::•();
+    core::List<self::Constraint*>* todo = sources;
+    while (todo.{core::List::length}{core::int*}.{core::num::>}(0){(core::num*) →* core::bool*}) {
+      self::Constraint* c = todo.{core::List::removeLast}(){() →* self::Constraint*};
+      if(!(c.{self::Constraint::output}(){() →* self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) && c.{self::Constraint::inputsKnown}(mark){(core::int*) →* core::bool*}) {
+        plan.{self::Plan::addConstraint}(c){(self::Constraint*) →* void};
+        c.{self::Constraint::output}(){() →* self::Variable*}.{self::Variable::mark} = mark;
+        this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(){() →* self::Variable*}, todo){(self::Variable*, core::List<self::Constraint*>*) →* void};
+      }
+    }
+    return plan;
+  }
+  method extractPlanFromConstraints(core::List<self::Constraint*>* constraints) → self::Plan* {
+    core::List<self::Constraint*>* sources = <self::Constraint*>[];
+    for (core::int* i = 0; i.{core::num::<}(constraints.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+      self::Constraint* c = constraints.{core::List::[]}(i){(core::int*) →* self::Constraint*};
+      if(c.{self::Constraint::isInput}(){() →* core::bool*} && c.{self::Constraint::isSatisfied}(){() →* core::bool*})
+        sources.{core::List::add}(c){(self::Constraint*) →* void};
+    }
+    return this.{self::Planner::makePlan}(sources){(core::List<self::Constraint*>*) →* self::Plan*};
+  }
+  method addPropagate(self::Constraint* c, core::int* mark) → core::bool* {
+    core::List<self::Constraint*>* todo = <self::Constraint*>[c];
+    while (todo.{core::List::length}{core::int*}.{core::num::>}(0){(core::num*) →* core::bool*}) {
+      self::Constraint* d = todo.{core::List::removeLast}(){() →* self::Constraint*};
+      if(d.{self::Constraint::output}(){() →* self::Variable*}.{self::Variable::mark}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} mark) {
+        this.{self::Planner::incrementalRemove}(c){(self::Constraint*) →* void};
+        return false;
+      }
+      d.{self::Constraint::recalculate}(){() →* void};
+      this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(){() →* self::Variable*}, todo){(self::Variable*, core::List<self::Constraint*>*) →* void};
+    }
+    return true;
+  }
+  method removePropagateFrom(self::Variable* out) → core::List<self::Constraint*>* {
+    out.{self::Variable::determinedBy} = null;
+    out.{self::Variable::walkStrength} = #C18;
+    out.{self::Variable::stay} = true;
+    core::List<self::Constraint*>* unsatisfied = <self::Constraint*>[];
+    core::List<self::Variable*>* todo = <self::Variable*>[out];
+    while (todo.{core::List::length}{core::int*}.{core::num::>}(0){(core::num*) →* core::bool*}) {
+      self::Variable* v = todo.{core::List::removeLast}(){() →* self::Variable*};
+      for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+        self::Constraint* c = v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::[]}(i){(core::int*) →* self::Constraint*};
+        if(!c.{self::Constraint::isSatisfied}(){() →* core::bool*})
+          unsatisfied.{core::List::add}(c){(self::Constraint*) →* void};
+      }
+      self::Constraint* determining = v.{self::Variable::determinedBy}{self::Constraint*};
+      for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+        self::Constraint* next = v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::[]}(i){(core::int*) →* self::Constraint*};
+        if(!(next =={self::Constraint::==}{(dynamic) →* core::bool*} determining) && next.{self::Constraint::isSatisfied}(){() →* core::bool*}) {
+          next.{self::Constraint::recalculate}(){() →* void};
+          todo.{core::List::add}(next.{self::Constraint::output}(){() →* self::Variable*}){(self::Variable*) →* void};
+        }
+      }
+    }
+    return unsatisfied;
+  }
+  method addConstraintsConsumingTo(self::Variable* v, core::List<self::Constraint*>* coll) → void {
+    self::Constraint* determining = v.{self::Variable::determinedBy}{self::Constraint*};
+    for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+      self::Constraint* c = v.{self::Variable::constraints}{core::List<self::Constraint*>*}.{core::List::[]}(i){(core::int*) →* self::Constraint*};
+      if(!(c =={self::Constraint::==}{(dynamic) →* core::bool*} determining) && c.{self::Constraint::isSatisfied}(){() →* core::bool*})
+        coll.{core::List::add}(c){(self::Constraint*) →* void};
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Plan extends core::Object {
+  field core::List<self::Constraint*>* list = <self::Constraint*>[];
+  synthetic constructor •() → self::Plan*
+    : super core::Object::•()
+    ;
+  method addConstraint(self::Constraint* c) → void {
+    this.{self::Plan::list}{core::List<self::Constraint*>*}.{core::List::add}(c){(self::Constraint*) →* void};
+  }
+  method size() → core::int*
+    return this.{self::Plan::list}{core::List<self::Constraint*>*}.{core::List::length}{core::int*};
+  method execute() → void {
+    for (core::int* i = 0; i.{core::num::<}(this.{self::Plan::list}{core::List<self::Constraint*>*}.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+      this.{self::Plan::list}{core::List<self::Constraint*>*}.{core::List::[]}(i){(core::int*) →* self::Constraint*}.{self::Constraint::execute}(){() →* void};
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field self::Strength* REQUIRED = #C22;
+static const field self::Strength* STRONG_PREFERRED = #C3;
+static const field self::Strength* PREFERRED = #C6;
+static const field self::Strength* STRONG_DEFAULT = #C9;
+static const field self::Strength* NORMAL = #C12;
+static const field self::Strength* WEAK_DEFAULT = #C15;
+static const field self::Strength* WEAKEST = #C18;
+static const field core::int* NONE = #C1;
+static const field core::int* FORWARD = #C4;
+static const field core::int* BACKWARD = #C20;
+static field self::Planner* planner;
+static method main() → dynamic {
+  new self::DeltaBlue::•().{self::DeltaBlue::run}(){() →* void};
+}
+static method chainTest(core::int* n) → void {
+  self::planner = new self::Planner::•();
+  self::Variable* prev = null;
+  self::Variable* first = null;
+  self::Variable* last = null;
+  for (core::int* i = 0; i.{core::num::<=}(n){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    self::Variable* v = new self::Variable::•("v${i}", 0);
+    if(!(prev == null))
+      new self::EqualityConstraint::•(prev, v, #C22);
+    if(i =={core::num::==}{(core::Object*) →* core::bool*} 0)
+      first = v;
+    if(i =={core::num::==}{(core::Object*) →* core::bool*} n)
+      last = v;
+    prev = v;
+  }
+  new self::StayConstraint::•(last, #C9);
+  self::EditConstraint* edit = new self::EditConstraint::•(first, #C6);
+  self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint*>[edit]){(core::List<self::Constraint*>*) →* self::Plan*};
+  for (core::int* i = 0; i.{core::num::<}(100){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    first.{self::Variable::value} = i;
+    plan.{self::Plan::execute}(){() →* void};
+    if(!(last.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} i)) {
+      core::print("Chain test failed:");
+      core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}{core::int*}}.");
+    }
+  }
+}
+static method projectionTest(core::int* n) → void {
+  self::planner = new self::Planner::•();
+  self::Variable* scale = new self::Variable::•("scale", 10);
+  self::Variable* offset = new self::Variable::•("offset", 1000);
+  self::Variable* src = null;
+  self::Variable* dst = null;
+  core::List<self::Variable*>* dests = <self::Variable*>[];
+  for (core::int* i = 0; i.{core::num::<}(n){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    src = new self::Variable::•("src", i);
+    dst = new self::Variable::•("dst", i);
+    dests.{core::List::add}(dst){(self::Variable*) →* void};
+    new self::StayConstraint::•(src, #C12);
+    new self::ScaleConstraint::•(src, scale, offset, dst, #C22);
+  }
+  self::change(src, 17);
+  if(!(dst.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 1170))
+    core::print("Projection 1 failed");
+  self::change(dst, 1050);
+  if(!(src.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 5))
+    core::print("Projection 2 failed");
+  self::change(scale, 5);
+  for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1){(core::num*) →* core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    if(!(dests.{core::List::[]}(i){(core::int*) →* self::Variable*}.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} i.{core::num::*}(5){(core::num*) →* core::int*}.{core::num::+}(1000){(core::num*) →* core::int*}))
+      core::print("Projection 3 failed");
+  }
+  self::change(offset, 2000);
+  for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1){(core::num*) →* core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    if(!(dests.{core::List::[]}(i){(core::int*) →* self::Variable*}.{self::Variable::value}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} i.{core::num::*}(5){(core::num*) →* core::int*}.{core::num::+}(2000){(core::num*) →* core::int*}))
+      core::print("Projection 4 failed");
+  }
+}
+static method change(self::Variable* v, core::int* newValue) → void {
+  self::EditConstraint* edit = new self::EditConstraint::•(v, #C6);
+  self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint*>[edit]){(core::List<self::Constraint*>*) →* self::Plan*};
+  for (core::int* i = 0; i.{core::num::<}(10){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    v.{self::Variable::value} = newValue;
+    plan.{self::Plan::execute}(){() →* void};
+  }
+  edit.{self::Constraint::destroyConstraint}(){() →* void};
+}
+
+constants  {
+  #C1 = 1
+  #C2 = "strongPreferred"
+  #C3 = self::Strength {value:#C1, name:#C2}
+  #C4 = 2
+  #C5 = "preferred"
+  #C6 = self::Strength {value:#C4, name:#C5}
+  #C7 = 3
+  #C8 = "strongDefault"
+  #C9 = self::Strength {value:#C7, name:#C8}
+  #C10 = 4
+  #C11 = "normal"
+  #C12 = self::Strength {value:#C10, name:#C11}
+  #C13 = 5
+  #C14 = "weakDefault"
+  #C15 = self::Strength {value:#C13, name:#C14}
+  #C16 = 6
+  #C17 = "weakest"
+  #C18 = self::Strength {value:#C16, name:#C17}
+  #C19 = <self::Strength*>[#C3, #C6, #C9, #C12, #C15, #C18]
+  #C20 = 0
+  #C21 = "required"
+  #C22 = self::Strength {value:#C20, name:#C21}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///DeltaBlue.dart:
+- Strength. (from org-dartlang-testcase:///DeltaBlue.dart:59:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..d76d693
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_instantiation.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: Factory redirects to class 'A', which is abstract and can't be instantiated.
+//   factory B() = A;
+//                 ^
+//
+// pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
+//  - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+//   factory B() = A;
+//                 ^
+//
+// pkg/front_end/testcases/general/abstract_instantiation.dart:12:7: Error: The class 'A' is abstract and can't be instantiated.
+//   new A();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •() → self::B
+    return invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
+ - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+ - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+  factory B() = A;
+                ^";
+}
+static method test() → dynamic {
+  throw new core::AbstractClassInstantiationError::•("A");
+  invalid-expression "pkg/front_end/testcases/general/abstract_instantiation.dart:8:17: Error: The constructor function type 'A Function()' isn't a subtype of 'B Function()'.
+ - 'A' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+ - 'B' is from 'pkg/front_end/testcases/general/abstract_instantiation.dart'.
+  factory B() = A;
+                ^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.weak.modular.expect b/pkg/front_end/testcases/general/abstract_members.dart.weak.modular.expect
new file mode 100644
index 0000000..d874a11
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_members.dart.weak.modular.expect
@@ -0,0 +1,442 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_members.dart:21:16: Error: Can't inherit members that conflict with each other.
+// abstract class A implements Interface1, Interface2, Interface3 {
+//                ^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:29:16: Error: Can't inherit members that conflict with each other.
+// abstract class B extends A {
+//                ^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:35:7: Error: Can't inherit members that conflict with each other.
+// class MyClass extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:35:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class MyClass extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:23:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:26:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:18:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:44:7: Error: Can't inherit members that conflict with each other.
+// class MyMock1 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:50:7: Error: Can't inherit members that conflict with each other.
+// class MyMock2 extends MyMock1 {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:56:7: Error: Can't inherit members that conflict with each other.
+// class MyMock3 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:56:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property2=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class MyMock3 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:23:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:25:12: Context: 'A.property2=' is defined here.
+//   void set property2(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:26:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:18:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:66:16: Error: Can't inherit members that conflict with each other.
+// abstract class D extends C implements Interface2 {}
+//                ^
+// pkg/front_end/testcases/general/abstract_members.dart:14:7: Context: This is one inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:61:8: Context: This is the other inherited member.
+//   void interfaceMethod1(_) {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:74:16: Error: Can't inherit members that conflict with each other.
+// abstract class F extends E implements Interface1 {}
+//                ^
+// pkg/front_end/testcases/general/abstract_members.dart:8:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:69:12: Context: This is the other inherited member.
+//   void set interfaceMethod1(_) {}
+//            ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:86:16: Error: Can't inherit members that conflict with each other.
+// abstract class H extends G implements Foo {}
+//                ^
+// pkg/front_end/testcases/general/abstract_members.dart:77:8: Context: This is one inherited member.
+//   void foo() {}
+//        ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:81:14: Context: This is the other inherited member.
+//   Object get foo => null;
+//              ^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:98:16: Error: Can't inherit members that conflict with each other.
+// abstract class J extends I implements Bar {}
+//                ^
+// pkg/front_end/testcases/general/abstract_members.dart:89:14: Context: This is one inherited member.
+//   Object get foo => null;
+//              ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:93:10: Context: This is the other inherited member.
+//   Object foo() {}
+//          ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1*
+    : super core::Object::•()
+    ;
+  method interfaceMethod1() → void {}
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1 = null;
+  synthetic constructor •() → self::Interface2*
+    : super core::Object::•()
+    ;
+  method interfaceMethod2() → void {}
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3*
+    : super core::Object::•()
+    ;
+  method interfaceMethod3() → void {}
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A extends core::Object implements self::Interface1, self::Interface2, self::Interface3 {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method aMethod() → dynamic {}
+  abstract method abstractMethod() → dynamic;
+  abstract set property1(dynamic _) → void;
+  abstract set property2(dynamic _) → void;
+  abstract set property3(dynamic _) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  final field dynamic property1 = null;
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+}
+class MyClass extends self::B {
+  field dynamic property2 = null;
+  synthetic constructor •() → self::MyClass*
+    : super self::B::•()
+    ;
+  method aaMethod() → dynamic {}
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+  method cMethod() → dynamic {}
+}
+class MyMock1 extends self::B {
+  synthetic constructor •() → self::MyMock1*
+    : super self::B::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return null;
+  no-such-method-forwarder method interfaceMethod2() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+class MyMock2 extends self::MyMock1 {
+  synthetic constructor •() → self::MyMock2*
+    : super self::MyMock1::•()
+    ;
+  abstract method noSuchMethod(core::Invocation* _) → dynamic;
+}
+class MyMock3 extends self::B {
+  synthetic constructor •() → self::MyMock3*
+    : super self::B::•()
+    ;
+  abstract method noSuchMethod(core::Invocation* _) → dynamic;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method interfaceMethod1(dynamic _) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends self::C implements self::Interface2 {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  set interfaceMethod1(dynamic _) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class F extends self::E implements self::Interface1 {
+  synthetic constructor •() → self::F*
+    : super self::E::•()
+    ;
+}
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G extends core::Object {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  get foo() → core::Object*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class H extends self::G implements self::Foo {
+  synthetic constructor •() → self::H*
+    : super self::G::•()
+    ;
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  get foo() → core::Object*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method foo() → core::Object* {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class J extends self::I implements self::Bar {
+  synthetic constructor •() → self::J*
+    : super self::I::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #interfaceMethod2
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #abstractMethod
+  #C6 = #interfaceMethod1
+  #C7 = #interfaceMethod3
+  #C8 = #property3=
+  #C9 = #interfaceMethod1=
+  #C10 = #property1=
+  #C11 = #property2=
+}
diff --git a/pkg/front_end/testcases/general/abstract_operator_override.dart.weak.modular.expect b/pkg/front_end/testcases/general/abstract_operator_override.dart.weak.modular.expect
new file mode 100644
index 0000000..6b85486
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_operator_override.dart.weak.modular.expect
@@ -0,0 +1,124 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_operator_override.dart:12:7: Error: The implementation of '+' in the non-abstract class 'B' does not conform to its interface.
+// class B extends A {
+//       ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:6:18: Context: The parameter 'b' of the method 'A.+' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'B.+'.
+//  - 'B' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   A operator +(B b) => new A();
+//                  ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:13:14: Context: This is the overridden method ('+').
+//   A operator +(A a);
+//              ^
+//
+// pkg/front_end/testcases/general/abstract_operator_override.dart:12:7: Error: The implementation of 'unary-' in the non-abstract class 'B' does not conform to its interface.
+// class B extends A {
+//       ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:7:14: Context: The return type of the method 'A.unary-' is 'A', which does not match the return type, 'B', of the overridden method, 'B.unary-'.
+//  - 'A' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+// Change to a subtype of 'B'.
+//   A operator -() => new A();
+//              ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:14:14: Context: This is the overridden method ('unary-').
+//   B operator -();
+//              ^
+//
+// pkg/front_end/testcases/general/abstract_operator_override.dart:12:7: Error: The implementation of '[]' in the non-abstract class 'B' does not conform to its interface.
+// class B extends A {
+//       ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:8:19: Context: The parameter 'b' of the method 'A.[]' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'B.[]'.
+//  - 'B' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   A operator [](B b) => new A();
+//                   ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:15:14: Context: This is the overridden method ('[]').
+//   A operator [](A a);
+//              ^
+//
+// pkg/front_end/testcases/general/abstract_operator_override.dart:12:7: Error: The implementation of '[]=' in the non-abstract class 'B' does not conform to its interface.
+// class B extends A {
+//       ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:9:23: Context: The parameter 'b1' of the method 'A.[]=' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'B.[]='.
+//  - 'B' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void operator []=(B b1, B b2) {}
+//                       ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:16:17: Context: This is the overridden method ('[]=').
+//   void operator []=(A a, B b);
+//                 ^
+//
+// pkg/front_end/testcases/general/abstract_operator_override.dart:19:7: Error: The implementation of '[]' in the non-abstract class 'C' does not conform to its interface.
+// class C extends A {
+//       ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:8:14: Context: The return type of the method 'A.[]' is 'A', which does not match the return type, 'B', of the overridden method, 'C.[]'.
+//  - 'A' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+// Change to a subtype of 'B'.
+//   A operator [](B b) => new A();
+//              ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:20:14: Context: This is the overridden method ('[]').
+//   B operator [](B b);
+//              ^
+//
+// pkg/front_end/testcases/general/abstract_operator_override.dart:19:7: Error: The implementation of '[]=' in the non-abstract class 'C' does not conform to its interface.
+// class C extends A {
+//       ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:9:29: Context: The parameter 'b2' of the method 'A.[]=' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.[]='.
+//  - 'B' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/abstract_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void operator []=(B b1, B b2) {}
+//                             ^
+// pkg/front_end/testcases/general/abstract_operator_override.dart:21:17: Context: This is the overridden method ('[]=').
+//   void operator []=(B b, A a);
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(self::B* b) → self::A*
+    return new self::A::•();
+  operator unary-() → self::A*
+    return new self::A::•();
+  operator [](self::B* b) → self::A*
+    return new self::A::•();
+  operator []=(self::B* b1, self::B* b2) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract operator +(self::A* a) → self::A*;
+  abstract operator unary-() → self::B*;
+  abstract operator [](self::A* a) → self::A*;
+  abstract operator []=(self::A* a, self::B* b) → void;
+}
+class C extends self::A {
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+  abstract operator [](self::B* b) → self::B*;
+  abstract operator []=(self::B* b, self::A* a) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.weak.modular.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.weak.modular.expect
new file mode 100644
index 0000000..90c7a87
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete.dart.weak.modular.expect
@@ -0,0 +1,102 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:17:7: Error: The implementation of 'foo' in the non-abstract class 'C' does not conform to its interface.
+// class C extends B {}
+//       ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'B.foo'.
+//   void foo() {}
+//        ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:14:8: Context: This is the overridden method ('foo').
+//   void foo([a]);
+//        ^
+//
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:19:7: Error: The implementation of 'foo' in the non-abstract class 'D' does not conform to its interface.
+// class D extends A implements I {}
+//       ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'I.foo'.
+//   void foo() {}
+//        ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:10:8: Context: This is the overridden method ('foo').
+//   void foo([a]);
+//        ^
+//
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:23:7: Error: The implementation of 'foo' in the non-abstract class 'F' does not conform to its interface.
+// class F extends E {}
+//       ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:6:8: Context: The method 'A.foo' has fewer positional arguments than those of overridden method 'I.foo'.
+//   void foo() {}
+//        ^
+// pkg/front_end/testcases/general/abstract_overrides_concrete.dart:10:8: Context: This is the overridden method ('foo').
+//   void foo([a]);
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method foo([dynamic a = #C1]) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract method foo([dynamic a = #C1]) → void;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class D extends self::A implements self::I {
+  synthetic constructor •() → self::D*
+    : super self::A::•()
+    ;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
+}
+abstract class E extends self::A implements self::I {
+  synthetic constructor •() → self::E*
+    : super self::A::•()
+    ;
+  abstract member-signature method foo([dynamic a = #C1]) → void; -> self::I::foo
+}
+class F extends self::E {
+  synthetic constructor •() → self::F*
+    : super self::E::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.weak.modular.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.weak.modular.expect
new file mode 100644
index 0000000..882db16
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo() → self::A*
+    return null;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract method foo() → self::B*;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C implements self::B {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  no-such-method-forwarder method foo() → self::B*
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} self::B*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/general/accessors.dart.weak.modular.expect b/pkg/front_end/testcases/general/accessors.dart.weak.modular.expect
new file mode 100644
index 0000000..d09f07b
--- /dev/null
+++ b/pkg/front_end/testcases/general/accessors.dart.weak.modular.expect
@@ -0,0 +1,90 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/accessors.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/accessors.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/accessors.dart:40:11: Error: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set onlySetter(dynamic value) → void {
+    core::print("C.onlySetter called with ${value}.");
+  }
+  method testC() → dynamic {
+    try {
+      core::print(invalid-expression "pkg/front_end/testcases/general/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/accessors.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+      print(onlySetter);
+            ^^^^^^^^^^" in this{<unresolved>}.onlySetter);
+      throw "No error thrown";
+    }
+    on core::NoSuchMethodError* catch(final core::NoSuchMethodError* e) {
+      core::print("Expected error: ${e}");
+    }
+    this.{self::C::onlySetter} = "hest";
+  }
+  method testD() → dynamic {
+    core::print(invalid-expression "pkg/front_end/testcases/general/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/accessors.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+    print(onlySetter);
+          ^^^^^^^^^^" in this{<unresolved>}.onlySetter);
+    this.{self::C::onlySetter} = "hest";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  get onlySetter() → core::String*
+    return "D.onlySetter called.";
+  set onlySetter(dynamic value) → void {
+    core::print("D.onlySetter called with ${value}.");
+  }
+}
+static set onlySetter(dynamic value) → void {
+  core::print("onlySetter called with ${value}.");
+}
+static method main() → dynamic {
+  try {
+    core::print(invalid-expression "pkg/front_end/testcases/general/accessors.dart:40:11: Error: Getter not found: 'onlySetter'.
+    print(onlySetter);
+          ^^^^^^^^^^");
+    throw "No error thrown";
+  }
+  on core::NoSuchMethodError* catch(final core::NoSuchMethodError* e) {
+    core::print("Expected error: ${e}");
+  }
+  self::onlySetter = "fisk";
+  new self::C::•().{self::C::testC}(){() →* dynamic};
+  new self::D::•().{self::C::testD}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/general/all_variances.dart.weak.modular.expect b/pkg/front_end/testcases/general/all_variances.dart.weak.modular.expect
new file mode 100644
index 0000000..f7afd1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/all_variances.dart.weak.modular.expect
@@ -0,0 +1,6 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F<unrelated W extends core::Object* = dynamic, X extends core::Object* = dynamic, contravariant Y extends core::Object* = dynamic, invariant Z extends core::Object* = dynamic> = (Y*, (Z*) →* Z*) →* X*;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.modular.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.modular.expect
new file mode 100644
index 0000000..8155e8e
--- /dev/null
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/general/hello.dart' and 'pkg/front_end/testcases/general/map.dart'.
+// export 'map.dart' show main;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+export "org-dartlang-testcase:///hello.dart" show main;
+export "org-dartlang-testcase:///map.dart" show main;
+
+static const field dynamic _exports# = #C1;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("Hello, World!");
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(core::Map::•<dynamic, dynamic>());
+}
+
+constants  {
+  #C1 = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/general/hello.dart' and 'pkg/front_end/testcases/general/map.dart'.\"}"
+}
diff --git a/pkg/front_end/testcases/general/annotation_eof.dart.weak.modular.expect b/pkg/front_end/testcases/general/annotation_eof.dart.weak.modular.expect
new file mode 100644
index 0000000..f4d0e53
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_eof.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("There is a dangling annotation at the end of this file");
+}
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.weak.modular.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.weak.modular.expect
new file mode 100644
index 0000000..80eb1d7
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Fisk<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field self::Fisk::T* x;
+  const constructor fisk(self::Fisk::T* x) → self::Fisk<self::Fisk::T*>*
+    : self::Fisk::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Foo*>* values = #C10;
+  @#C11
+  static const field self::Foo* bar = #C3;
+  @#C12
+  static const field self::Foo* baz = #C6;
+  static const field self::Foo* cafebabe = #C9;
+  const constructor •(core::int* index, core::String* name) → self::Foo*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "Foo.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* hest = #C11;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "bar"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "baz"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "cafebabe"
+  #C9 = self::Foo {index:#C7, _name:#C8}
+  #C10 = <self::Foo*>[#C3, #C6, #C9]
+  #C11 = 42
+  #C12 = self::Fisk<core::int*> {x:#C11}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///annotation_on_enum_values.dart:
+- Foo. (from org-dartlang-testcase:///annotation_on_enum_values.dart:15:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Fisk.fisk (from org-dartlang-testcase:///annotation_on_enum_values.dart:12:9)
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.weak.modular.expect b/pkg/front_end/testcases/general/annotation_top.dart.weak.modular.expect
new file mode 100644
index 0000000..b8fa4b8
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_top.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+@#C1
+@#C2
+library test;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+@#C2
+typedef F1 = () →* void;
+@#C1
+@#C2
+typedef F2 = () →* void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::int* value) → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+@#C1
+@#C2
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::Object* a = #C1;
+@#C1
+@#C2
+static field core::int* f1;
+@#C1
+@#C2
+static field core::int* f2;
+@#C1
+@#C2
+static method main() → void {}
+
+constants  {
+  #C1 = core::Object {}
+  #C2 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///annotation_top.dart:
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- A. (from org-dartlang-testcase:///annotation_top.dart:12:9)
diff --git a/pkg/front_end/testcases/general/annotation_typedef_formals.dart.weak.modular.expect b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.weak.modular.expect
new file mode 100644
index 0000000..d6f9911
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (@#C1 core::int* x, core::num* y, {@#C2 @#C3 core::String* z, core::Object* w}) →* void;
+typedef G = (@#C1 core::int* a, core::num* b, [@#C2 @#C3 core::String* c, core::Object* d]) →* void;
+static const field core::int* foo = #C1;
+static const field core::int* bar = #C2;
+static const field core::int* baz = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 21
+  #C2 = 42
+  #C3 = 84
+}
diff --git a/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.weak.modular.expect b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.weak.modular.expect
new file mode 100644
index 0000000..9bab9c9
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (@#C1 core::int* app) →* core::int*;
+static const field core::int* app = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.weak.modular.expect
new file mode 100644
index 0000000..de080e6
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef hest_t = ({@#C1 dynamic named}) →* dynamic;
+class Bar extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  const constructor named(dynamic x) → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Baz extends core::Object {
+  constructor •(@#C1 dynamic constructorFormal) → self::Baz*
+    : super core::Object::•()
+    ;
+  static factory bazFactory(@#C1 dynamic factoryFormal) → self::Baz*
+    return null;
+  method fisk(@#C1 dynamic formal1, @#C2 dynamic formal2, @#C2 dynamic formal3, @#C1 @#C2 dynamic formal4, [@#C1 dynamic optional = #C3]) → dynamic {
+    @#C1 dynamic local1;
+    @#C2 dynamic local2;
+    @#C2 dynamic local3;
+    @#C1 @#C2 dynamic local4;
+    @#C1 core::String* localWithInitializer = "hello";
+    @#C1 @#C2 dynamic localGroupPart1;
+    @#C1 @#C2 dynamic localGroupPart2;
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
+      return null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
+  }
+  method hest({@#C1 dynamic named = #C3}) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = self::Bar {}
+  #C3 = null
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///annotation_variable_declaration.dart:
+- Bar. (from org-dartlang-testcase:///annotation_variable_declaration.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Bar.named (from org-dartlang-testcase:///annotation_variable_declaration.dart:9:9)
diff --git a/pkg/front_end/testcases/general/argument.dart.weak.modular.expect b/pkg/front_end/testcases/general/argument.dart.weak.modular.expect
new file mode 100644
index 0000000..e667193
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo extends self::Base {
+  synthetic constructor •() → self::Foo*
+    : super self::Base::•()
+    ;
+}
+class Bar extends self::Base {
+  synthetic constructor •() → self::Bar*
+    : super self::Base::•()
+    ;
+}
+class Baz extends self::Base {
+  synthetic constructor •() → self::Baz*
+    : super self::Base::•()
+    ;
+}
+static method foo(dynamic x) → void {}
+static method bar(dynamic x) → void {}
+static method foo_escaped(dynamic x) → void {}
+static method bar_escaped(dynamic x) → void {}
+static method escape(dynamic fn) → void {
+  fn{dynamic}.call(new self::Baz::•());
+}
+static method main() → dynamic {
+  self::foo(new self::Foo::•());
+  self::bar(new self::Bar::•());
+  self::escape(#C1);
+  self::escape(#C2);
+}
+
+constants  {
+  #C1 = static-tearoff self::foo_escaped
+  #C2 = static-tearoff self::bar_escaped
+}
diff --git a/pkg/front_end/testcases/general/argument_mismatch.dart.weak.modular.expect b/pkg/front_end/testcases/general/argument_mismatch.dart.weak.modular.expect
new file mode 100644
index 0000000..b0d5171
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument_mismatch.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/argument_mismatch.dart:8:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   foo(null);
+//      ^
+// pkg/front_end/testcases/general/argument_mismatch.dart:5:1: Context: Found this candidate, but the arguments don't match.
+// foo() {}
+// ^^^
+//
+import self as self;
+
+static method foo() → dynamic {}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/argument_mismatch.dart:8:6: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  foo(null);
+     ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/arithmetic.dart.weak.modular.expect b/pkg/front_end/testcases/general/arithmetic.dart.weak.modular.expect
new file mode 100644
index 0000000..0e703fd
--- /dev/null
+++ b/pkg/front_end/testcases/general/arithmetic.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo(core::int* x, core::int* y) → core::int* {
+  core::int* z = x.{core::num::+}(y){(core::num*) →* core::int*};
+  return z.{core::int::<<}(4){(core::int*) →* core::int*};
+}
+static method loop(core::List<dynamic>* xs) → void {
+  core::int* _ = xs.{core::List::length}{core::int*};
+  for (core::int* i = 0; i.{core::num::<}(xs.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+  }
+}
+static method main() → dynamic {
+  self::foo(4, 5);
+  self::foo(6, 7);
+  self::loop(<dynamic>["dfg"]);
+}
diff --git a/pkg/front_end/testcases/general/arrow_function.dart.weak.modular.expect b/pkg/front_end/testcases/general/arrow_function.dart.weak.modular.expect
new file mode 100644
index 0000000..964b0b4
--- /dev/null
+++ b/pkg/front_end/testcases/general/arrow_function.dart.weak.modular.expect
@@ -0,0 +1,6 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main<T extends core::Object* = dynamic>() → dynamic
+  return () → core::Type* => self::main::T*;
diff --git a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.weak.modular.expect b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.weak.modular.expect
new file mode 100644
index 0000000..49729e1
--- /dev/null
+++ b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/assign_to_initializing_formal.dart:13:11: Error: Can't assign to the final variable 'x'.
+//           x = 3;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class A extends core::Object {
+  field dynamic x;
+  field dynamic y;
+  constructor •(dynamic x) → self::A*
+    : self::A::x = x, self::A::y = () → Null {
+      invalid-expression "pkg/front_end/testcases/general/assign_to_initializing_formal.dart:13:11: Error: Can't assign to the final variable 'x'.
+          x = 3;
+          ^";
+    }, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/async_function.dart.weak.modular.expect b/pkg/front_end/testcases/general/async_function.dart.weak.modular.expect
new file mode 100644
index 0000000..4a640a9
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_function.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field core::List<core::String*>* stringList = <core::String*>["bar"];
+static method asyncString() → asy::Future<core::String*>* async {
+  return "foo";
+}
+static method asyncString2() → asy::Future<core::String*>* async {
+  return self::asyncString();
+}
+static method syncStarString() → core::Iterable<core::String*>* sync* {
+  yield "foo";
+  yield* self::syncStarString2();
+  yield* self::stringList;
+}
+static method syncStarString2() → core::Iterable<core::String*>* sync* {
+  yield "foo";
+}
+static method asyncStarString() → asy::Stream<core::String*>* async* {
+  yield "foo";
+  yield* self::asyncStarString2();
+  yield await self::asyncString();
+}
+static method asyncStarString2() → asy::Stream<core::String*>* async* {
+  yield "bar";
+}
+static method main() → dynamic async {
+  core::String* str = await self::asyncString();
+}
diff --git a/pkg/front_end/testcases/general/async_method_with_invalid_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/async_method_with_invalid_type.dart.weak.modular.expect
new file mode 100644
index 0000000..5472a32
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_method_with_invalid_type.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/async_method_with_invalid_type.dart:8:3: Error: 'Bar' isn't a type.
+//   Bar x;
+//   ^^^
+//
+import self as self;
+
+static method foo() → dynamic async {
+  invalid-type x;
+  for (dynamic y in x{<invalid>}.z) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/async_nested.dart.weak.modular.expect b/pkg/front_end/testcases/general/async_nested.dart.weak.modular.expect
new file mode 100644
index 0000000..48269f1
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_nested.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Node extends core::Object {
+  final field core::List<self::Node*>* nested;
+  final field core::String* name;
+  constructor •(core::String* name, [core::List<self::Node*>* nested = #C1]) → self::Node*
+    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
+  method toString() → core::String*
+    return "<${this.{self::Node::name}{core::String*}}:[${let final core::List<self::Node*>* #t1 = this.{self::Node::nested}{core::List<self::Node*>*} in #t1 == null ?{core::String*} null : #t1.{core::Iterable::join}(", "){([core::String*]) →* core::String*}}]>";
+  method toSimpleString() → dynamic {
+    core::Iterable<dynamic>* tmp = let final core::List<self::Node*>* #t2 = this.{self::Node::nested}{core::List<self::Node*>*} in #t2 == null ?{core::Iterable<dynamic>*} null : #t2.{core::Iterable::map}<dynamic>((self::Node* child) → dynamic => child.{self::Node::toSimpleString}(){() →* dynamic}){((self::Node*) →* dynamic) →* core::Iterable<dynamic>*};
+    return "${this.{self::Node::name}{core::String*}} ${let final core::Iterable<dynamic>* #t3 = tmp in #t3 == null ?{core::String*} null : #t3.{core::Iterable::join}(" "){([core::String*]) →* core::String*}}".{core::String::trim}(){() →* core::String*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void async {
+  core::String* expected = "1 2 3 4 5 6 7 8 9 10";
+  self::Node* node = new self::Node::•("1", <self::Node*>[new self::Node::•("2", <self::Node*>[]), await asy::Future::value<self::Node*>(new self::Node::•("3", <self::Node*>[await asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[await asy::Future::value<self::Node*>(new self::Node::•("6", <self::Node*>[await asy::Future::value<self::Node*>(new self::Node::•("7", <self::Node*>[]))])), await asy::Future::value<self::Node*>(new self::Node::•("8", <self::Node*>[])), await asy::Future::value<self::Node*>(new self::Node::•("9", <self::Node*>[]))])]))])), await asy::Future::value<self::Node*>(new self::Node::•("10", <self::Node*>[]))]);
+  core::String* actual = node.{self::Node::toSimpleString}(){() →* dynamic} as{TypeError,ForDynamic} core::String*;
+  core::print(actual);
+  if(!(actual =={core::String::==}{(core::Object*) →* core::bool*} expected)) {
+    throw "Expected '${expected}' but got '${actual}'";
+  }
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/await.dart.weak.modular.expect b/pkg/front_end/testcases/general/await.dart.weak.modular.expect
new file mode 100644
index 0000000..5b1be33
--- /dev/null
+++ b/pkg/front_end/testcases/general/await.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic async {
+  core::print(await "Hello, World!");
+}
diff --git a/pkg/front_end/testcases/general/await_complex.dart.weak.modular.expect b/pkg/front_end/testcases/general/await_complex.dart.weak.modular.expect
new file mode 100644
index 0000000..20324c7
--- /dev/null
+++ b/pkg/front_end/testcases/general/await_complex.dart.weak.modular.expect
@@ -0,0 +1,260 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class C extends core::Object {
+  static field core::int* staticField = 1;
+  field core::int* field = 1;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static get staticGetter() → core::int*
+    return self::C::staticField;
+  static set staticSetter(dynamic val) → void {
+    self::C::staticField = val as{TypeError,ForDynamic} core::int*;
+  }
+  static method staticFoo(core::int* param) → core::int*
+    return param;
+  get getter() → core::int*
+    return this.{self::C::field}{core::int*};
+  set setter(dynamic val) → void {
+    this.{self::C::field} = val as{TypeError,ForDynamic} core::int*;
+  }
+  method foo(core::int* param) → core::int*
+    return param;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* globalVariable = 1;
+static final field core::bool* assertStatementsEnabled = (() → core::bool* {
+  try {
+    assert(false);
+    return false;
+  }
+  on dynamic catch(final dynamic _) {
+    return true;
+  }
+})(){() →* core::bool*};
+static method topLevelFoo(core::int* param) → core::int*
+  return 1;
+static get topLevelGetter() → core::int*
+  return self::globalVariable;
+static set topLevelSetter(dynamic val) → void {
+  self::globalVariable = val as{TypeError,ForDynamic} core::int*;
+}
+static method dummy() → dynamic
+  return 1;
+static method staticMembers() → dynamic async {
+  core::num* a = self::C::staticField.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, a);
+  core::num* f = (self::C::staticField = 1).{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, f);
+  core::num* b = self::C::staticGetter.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, b);
+  core::num* c = (self::C::staticSetter = 1).{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, c);
+  core::num* d = self::C::staticFoo(2).{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(3, d);
+  core::num* e = self::C::staticField.{core::num::+}(self::C::staticGetter){(core::num*) →* core::int*}.{core::num::+}(self::C::staticSetter = 1){(core::num*) →* core::int*}.{core::num::+}(self::C::staticFoo(1)){(core::num*) →* core::int*}.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(5, e);
+}
+static method topLevelMembers() → dynamic async {
+  core::num* a = self::globalVariable.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, a);
+  core::num* b = self::topLevelGetter.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, b);
+  core::num* c = (self::topLevelSetter = 1).{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, c);
+  core::num* d = self::topLevelFoo(1).{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, d);
+  core::num* e = self::globalVariable.{core::num::+}(self::topLevelGetter){(core::num*) →* core::int*}.{core::num::+}(self::topLevelSetter = 1){(core::num*) →* core::int*}.{core::num::+}(self::topLevelFoo(1)){(core::num*) →* core::int*}.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(5, e);
+}
+static method instanceMembers() → dynamic async {
+  self::C* inst = new self::C::•();
+  core::num* a = inst.{self::C::field}{core::int*}.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, a);
+  core::num* b = inst.{self::C::getter}{core::int*}.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, b);
+  core::num* c = (inst.{self::C::setter} = 1).{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, c);
+  core::num* d = inst.{self::C::foo}(1){(core::int*) →* core::int*}.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, d);
+  core::num* e = inst.{self::C::field}{core::int*}.{core::num::+}(inst.{self::C::getter}{core::int*}){(core::num*) →* core::int*}.{core::num::+}(inst.{self::C::setter} = 1){(core::num*) →* core::int*}.{core::num::+}(inst.{self::C::foo}(1){(core::int*) →* core::int*}){(core::num*) →* core::int*}.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(5, e);
+}
+static method others() → dynamic async {
+  core::String* a = "${self::globalVariable} ${await self::dummy()} ".{core::String::+}(await "someString"){(core::String*) →* core::String*};
+  self::expect("1 1 someString", a);
+  self::C* c = new self::C::•();
+  core::num* d = c.{self::C::field}{core::int*}.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  core::int* cnt = 2;
+  core::List<core::int*>* b = <core::int*>[1, 2, 3];
+  b.{core::List::[]=}(cnt, await self::dummy() as{TypeError,ForDynamic} core::int*){(core::int*, core::int*) →* void};
+  self::expect(1, b.{core::List::[]}(cnt){(core::int*) →* core::int*});
+  core::num* e = b.{core::List::[]}(0){(core::int*) →* core::int*}.{core::num::+}(await self::dummy() as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  self::expect(2, e);
+}
+static method conditionals() → dynamic async {
+  core::bool* a = false;
+  core::bool* b = true;
+  core::bool* c = a || b || await self::dummy() as{TypeError,ForDynamic} core::bool*;
+  self::expect(true, c);
+  dynamic d = a || b ?{dynamic} a : await self::dummy();
+  self::expect(false, d);
+  dynamic e = a is core::int* ?{dynamic} await self::dummy() : 2;
+  self::expect(2, e);
+  try {
+    dynamic f = a is core::int* ?{dynamic} await self::dummy() : 2;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
+static method asserts() → dynamic async {
+  for (final core::Function* #t1 in <core::Function*>[#C1, #C2]) {
+    final <T extends core::Object* = dynamic>(T*) →* FutureOr<T*>* func = #t1 as{TypeError} <T extends core::Object* = dynamic>(T*) →* FutureOr<T*>*;
+    assert(await func<core::bool*>(true){(core::bool*) →* FutureOr<core::bool*>*});
+    assert(self::id<core::bool*>(true) as{TypeError} core::bool*, await func<core::String*>("message"){(core::String*) →* FutureOr<core::String*>*});
+    assert(await func<core::bool*>(true){(core::bool*) →* FutureOr<core::bool*>*}, await func<core::String*>("message"){(core::String*) →* FutureOr<core::String*>*});
+    try {
+      assert(await func<core::bool*>(false){(core::bool*) →* FutureOr<core::bool*>*}, await func<core::String*>("message"){(core::String*) →* FutureOr<core::String*>*});
+      if(self::assertStatementsEnabled)
+        throw "Didn't throw";
+    }
+    on core::AssertionError* catch(final core::AssertionError* e) {
+      self::expect("message", e.{core::AssertionError::message}{core::Object*});
+    }
+  }
+}
+static method controlFlow() → dynamic async {
+  for (final core::Function* #t2 in <core::Function*>[#C1, #C2]) {
+    final <T extends core::Object* = dynamic>(T*) →* FutureOr<T*>* func = #t2 as{TypeError} <T extends core::Object* = dynamic>(T*) →* FutureOr<T*>*;
+    core::int* c = 0;
+    for (core::int* i = await func<core::int*>(0){(core::int*) →* FutureOr<core::int*>*}; await func<core::bool*>(i.{core::num::<}(5){(core::num*) →* core::bool*}){(core::bool*) →* FutureOr<core::bool*>*}; await func<core::int*>(let final core::int* #t3 = i in let final core::int* #t4 = i = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3){(core::int*) →* FutureOr<core::int*>*}) {
+      c = c.{core::num::+}(1){(core::num*) →* core::int*};
+    }
+    self::expect(5, c);
+    c = 0;
+    while (await func<core::bool*>(c.{core::num::<}(5){(core::num*) →* core::bool*}){(core::bool*) →* FutureOr<core::bool*>*})
+      c = c.{core::num::+}(1){(core::num*) →* core::int*};
+    self::expect(5, c);
+    c = 0;
+    do {
+      c = c.{core::num::+}(1){(core::num*) →* core::int*};
+    }
+    while (await func<core::bool*>(c.{core::num::<}(5){(core::num*) →* core::bool*}){(core::bool*) →* FutureOr<core::bool*>*})
+    self::expect(5, c);
+    if(await func<core::bool*>(c =={core::num::==}{(core::Object*) →* core::bool*} 5){(core::bool*) →* FutureOr<core::bool*>*}) {
+      self::expect(5, c);
+    }
+    else {
+      throw "unreachable";
+    }
+    try {
+      throw await func<core::String*>("string"){(core::String*) →* FutureOr<core::String*>*};
+    }
+    on core::String* catch(no-exception-var) {
+    }
+    try {
+      await throw "string";
+    }
+    on core::String* catch(no-exception-var) {
+    }
+    try
+      try {
+        try
+          try {
+            throw "string";
+          }
+          on dynamic catch(final dynamic e) {
+            self::expect("string", e);
+            self::expect(0, await func<core::int*>(0){(core::int*) →* FutureOr<core::int*>*});
+            rethrow;
+          }
+        finally {
+          self::expect(0, await func<core::int*>(0){(core::int*) →* FutureOr<core::int*>*});
+        }
+      }
+      on dynamic catch(final dynamic e) {
+        self::expect(0, await func<core::int*>(0){(core::int*) →* FutureOr<core::int*>*});
+        self::expect("string", e);
+      }
+    finally {
+      self::expect(0, await func<core::int*>(0){(core::int*) →* FutureOr<core::int*>*});
+    }
+    #L1:
+    switch(await func<core::int*>(2){(core::int*) →* FutureOr<core::int*>*}) {
+      #L2:
+      case #C3:
+        {
+          break #L1;
+        }
+      #L3:
+      default:
+        {
+          throw "unreachable";
+        }
+    }
+    self::expect(42, await(() → asy::Future<dynamic>* async {
+      return await func<dynamic>(42){(dynamic) →* FutureOr<dynamic>*};
+    })(){() →* asy::Future<dynamic>*});
+    self::expect(42, await(() → asy::Future<dynamic>* async {
+      return func<dynamic>(42){(dynamic) →* FutureOr<dynamic>*};
+    })(){() →* asy::Future<dynamic>*});
+    function testStream1() → asy::Stream<core::int*>* async* {
+      yield await func<core::int*>(42){(core::int*) →* FutureOr<core::int*>*};
+    }
+    self::expectList(<dynamic>[42], await testStream1(){() →* asy::Stream<core::int*>*}.{asy::Stream::toList}(){() →* asy::Future<core::List<core::int*>*>*});
+    function testStream2() → asy::Stream<core::int*>* async* {
+      yield* await func<asy::Stream<core::int*>*>(self::intStream()){(asy::Stream<core::int*>*) →* FutureOr<asy::Stream<core::int*>*>*};
+    }
+    self::expectList(<dynamic>[42], await testStream2(){() →* asy::Stream<core::int*>*}.{asy::Stream::toList}(){() →* asy::Future<core::List<core::int*>*>*});
+  }
+}
+static method future<T extends core::Object* = dynamic>(self::future::T* value) → FutureOr<self::future::T*>* async 
+  return value;
+static method id<T extends core::Object* = dynamic>(self::id::T* value) → FutureOr<self::id::T*>*
+  return value;
+static method intStream() → asy::Stream<core::int*>* async* {
+  yield 42;
+}
+static method main() → dynamic async {
+  for (core::int* i = 0; i.{core::num::<}(11){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    await self::staticMembers();
+    await self::topLevelMembers();
+    await self::instanceMembers();
+    await self::conditionals();
+    await self::others();
+    await self::asserts();
+    await self::controlFlow();
+  }
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method expectList(core::List<dynamic>* expected, core::List<dynamic>* actual) → dynamic {
+  if(!(expected.{core::List::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} actual.{core::List::length}{core::int*})) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+  for (core::int* i = 0; i.{core::num::<}(expected.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    self::expect(expected.{core::List::[]}(i){(core::int*) →* dynamic}, actual.{core::List::[]}(i){(core::int*) →* dynamic});
+  }
+}
+
+constants  {
+  #C1 = static-tearoff self::id
+  #C2 = static-tearoff self::future
+  #C3 = 2
+}
diff --git a/pkg/front_end/testcases/general/await_in_cascade.dart.weak.modular.expect b/pkg/front_end/testcases/general/await_in_cascade.dart.weak.modular.expect
new file mode 100644
index 0000000..8a57698
--- /dev/null
+++ b/pkg/front_end/testcases/general/await_in_cascade.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m() → asy::Future<core::List<core::int*>*>* async 
+    return let final core::List<core::int*>* #t1 = <core::int*>[] in block {
+      #t1.{core::List::add}(await this.{self::C::_m}(){() →* asy::Future<core::int*>*}){(core::int*) →* void};
+    } =>#t1;
+  method _m() → asy::Future<core::int*>* async 
+    return 42;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic async {
+  self::expect(42, (await new self::C::•().{self::C::m}(){() →* asy::Future<core::List<core::int*>*>*}).{core::Iterable::first}{core::int*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/general/await_in_non_async.dart.weak.modular.expect b/pkg/front_end/testcases/general/await_in_non_async.dart.weak.modular.expect
new file mode 100644
index 0000000..aa3b0e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/await_in_non_async.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/await_in_non_async.dart:11:3: Error: 'await' can only be used in 'async' or 'async*' methods.
+//   await foo();
+//   ^^^^^
+//
+import self as self;
+
+static method main() → dynamic {
+  self::foo();
+}
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/await_in_non_async.dart:11:3: Error: 'await' can only be used in 'async' or 'async*' methods.
+  await foo();
+  ^^^^^";
+}
diff --git a/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.modular.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.modular.expect
new file mode 100644
index 0000000..839e066
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.modular.expect
@@ -0,0 +1,179 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+// set b();
+//      ^
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+// set c(x, y);
+//      ^
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+//   set a();
+//        ^
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+//   set d(x, y);
+//        ^
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+//   set a();
+//        ^
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+//   set d(x, y);
+//        ^
+//
+// pkg/front_end/testcases/general/bad_setter_abstract.dart:66:9: Error: The class 'B' is abstract and can't be instantiated.
+//     new B();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  set a(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/general/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+  set a();
+       ^";
+    ;
+  }
+  set d(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/general/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+  set d(x, y);
+       ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  set a(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/general/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+  set a();
+       ^";
+    ;
+  }
+  set d(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/general/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+  set d(x, y);
+       ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static set b(dynamic #synthetic) → void {
+  invalid-expression "pkg/front_end/testcases/general/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+set b();
+     ^";
+  ;
+}
+static set c(dynamic #synthetic) → void {
+  invalid-expression "pkg/front_end/testcases/general/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+set c(x, y);
+     ^";
+  {
+    dynamic x;
+    dynamic y;
+    ;
+  }
+}
+static method main() → dynamic {
+  core::bool* threw;
+  try {
+    threw = true;
+    new self::A::•().{self::A::a} = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    new self::A::•().{self::A::d} = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    self::b = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    self::c = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    throw new core::AbstractClassInstantiationError::•("B");
+    threw = false;
+  }
+  on core::AbstractClassInstantiationError* catch(final core::AbstractClassInstantiationError* _) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+}
diff --git a/pkg/front_end/testcases/general/bad_store.dart.weak.modular.expect b/pkg/front_end/testcases/general/bad_store.dart.weak.modular.expect
new file mode 100644
index 0000000..f25c04b
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_store.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method identity(dynamic x) → dynamic
+  return x;
+static method use(dynamic x) → void {}
+static method main(core::List<core::String*>* args) → dynamic {
+  dynamic foo = self::identity(new self::Foo::•());
+  if(args.{core::List::length}{core::int*}.{core::num::>}(1){(core::num*) →* core::bool*}) {
+    foo{dynamic}.field = "string";
+    dynamic first = foo{dynamic}.field;
+    self::use(first);
+    foo{dynamic}.noField = "string";
+    dynamic second = foo{dynamic}.noField;
+    self::use(second);
+  }
+}
diff --git a/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.weak.modular.expect b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.weak.modular.expect
new file mode 100644
index 0000000..1e435e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.weak.modular.expect
@@ -0,0 +1,633 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class B<T> extends A<Function(T)> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:15:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Bc<T> extends A<ContravariantUse<T>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:17:7: Error: Can't use implicitly 'out' variable 'T' in an 'inout' position in supertype 'A'.
+// class Bi<T> extends A<InvariantUse<T>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:19:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class C<T> implements A<Function(T)> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:21:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Cc<T> implements A<ContravariantUse<T>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:23:7: Error: Can't use implicitly 'out' variable 'T' in an 'inout' position in supertype 'A'.
+// class Ci<T> implements A<InvariantUse<T>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:25:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class D<T> = Object with A<Function(T)>;
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:27:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Dc<T> = Object with A<ContravariantUse<T>>;
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:29:7: Error: Can't use implicitly 'out' variable 'T' in an 'inout' position in supertype 'A'.
+// class Di<T> = Object with A<InvariantUse<T>>;
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:31:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class E<T> = A<Function(T)> with Empty;
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:33:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Ec<T> = A<ContravariantUse<T>> with Empty;
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:35:7: Error: Can't use implicitly 'out' variable 'T' in an 'inout' position in supertype 'A'.
+// class Ei<T> = A<InvariantUse<T>> with Empty;
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:37:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class F<T> extends Object with A<Function(T)> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:39:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Fc<T> extends Object with A<ContravariantUse<T>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:41:7: Error: Can't use implicitly 'out' variable 'T' in an 'inout' position in supertype 'A'.
+// class Fi<T> extends Object with A<InvariantUse<T>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:43:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class G<T> extends A<Function(T)> with Empty {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:45:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Gc<T> extends A<ContravariantUse<T>> with Empty {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:47:7: Error: Can't use implicitly 'out' variable 'T' in an 'inout' position in supertype 'A'.
+// class Gi<T> extends A<InvariantUse<T>> with Empty {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:57:7: Error: Can't use implicitly 'out' variable 'T' in an 'inout' position in supertype 'A'.
+// class Hii<T> extends A<InvariantUse<InvariantUse<T>>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:71:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Jfff<T> extends A<Function(Function(Function(T)))> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:73:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Jffc<T> extends A<Function(Function(ContravariantUse<T>))> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:75:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Jfcf<T> extends A<Function(ContravariantUse<Function(T)>)> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:77:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Jfcc<T> extends A<Function(ContravariantUse<ContravariantUse<T>>)> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:79:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Jcff<T> extends A<ContravariantUse<Function(Function(T))>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:81:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Jcfc<T> extends A<ContravariantUse<Function(ContravariantUse<T>)>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:83:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Jccf<T> extends A<ContravariantUse<ContravariantUse<Function(T)>>> {}
+//       ^
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:85:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class Jccc<T>
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef ContravariantUse<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef InvariantUse<invariant T extends core::Object* = dynamic> = (T*) →* T*;
+class Empty extends core::Object {
+  synthetic constructor •() → self::Empty*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bc<self::Bc::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bi<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bi<self::Bi::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Cc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cc<self::Cc::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Ci<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Ci<self::Ci::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Dc<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Dc<self::Dc::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Di<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Di<self::Di::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Ec<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::Ec<self::Ec::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Ei<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::Ei<self::Ei::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _F&Object&A<T extends core::Object* = dynamic> extends core::Object /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F<T extends core::Object* = dynamic> extends self::_F&Object&A<self::F::T*> {
+  synthetic constructor •() → self::F<self::F::T*>*
+    : super self::_F&Object&A::•()
+    ;
+}
+abstract class _Fc&Object&A<T extends core::Object* = dynamic> extends core::Object /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fc<T extends core::Object* = dynamic> extends self::_Fc&Object&A<self::Fc::T*> {
+  synthetic constructor •() → self::Fc<self::Fc::T*>*
+    : super self::_Fc&Object&A::•()
+    ;
+}
+abstract class _Fi&Object&A<T extends core::Object* = dynamic> extends core::Object /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fi<T extends core::Object* = dynamic> extends self::_Fi&Object&A<self::Fi::T*> {
+  synthetic constructor •() → self::Fi<self::Fi::T*>*
+    : super self::_Fi&Object&A::•()
+    ;
+}
+abstract class _G&A&Empty<T extends core::Object* = dynamic> = core::Object with self::Empty /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G<T extends core::Object* = dynamic> extends self::_G&A&Empty<self::G::T*> {
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super self::_G&A&Empty::•()
+    ;
+}
+abstract class _Gc&A&Empty<T extends core::Object* = dynamic> = core::Object with self::Empty /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Gc<T extends core::Object* = dynamic> extends self::_Gc&A&Empty<self::Gc::T*> {
+  synthetic constructor •() → self::Gc<self::Gc::T*>*
+    : super self::_Gc&A&Empty::•()
+    ;
+}
+abstract class _Gi&A&Empty<T extends core::Object* = dynamic> = core::Object with self::Empty /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Gi<T extends core::Object* = dynamic> extends self::_Gi&A&Empty<self::Gi::T*> {
+  synthetic constructor •() → self::Gi<self::Gi::T*>*
+    : super self::_Gi&A&Empty::•()
+    ;
+}
+class Hff<T extends core::Object* = dynamic> extends self::A<((self::Hff::T*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Hff<self::Hff::T*>*
+    : super self::A::•()
+    ;
+}
+class Hfc<T extends core::Object* = dynamic> extends self::A<((self::Hfc::T*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Hfc<self::Hfc::T*>*
+    : super self::A::•()
+    ;
+}
+class Hcf<T extends core::Object* = dynamic> extends self::A<((self::Hcf::T*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Hcf<self::Hcf::T*>*
+    : super self::A::•()
+    ;
+}
+class Hcc<T extends core::Object* = dynamic> extends self::A<((self::Hcc::T*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Hcc<self::Hcc::T*>*
+    : super self::A::•()
+    ;
+}
+class Hii<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hii<self::Hii::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Iafc<T extends core::Object* = dynamic> extends self::A<self::A<((self::Iafc::T*) →* dynamic) →* dynamic>*> {
+  synthetic constructor •() → self::Iafc<self::Iafc::T*>*
+    : super self::A::•()
+    ;
+}
+class Iacf<T extends core::Object* = dynamic> extends self::A<self::A<((self::Iacf::T*) →* dynamic) →* dynamic>*> {
+  synthetic constructor •() → self::Iacf<self::Iacf::T*>*
+    : super self::A::•()
+    ;
+}
+class Ifac<T extends core::Object* = dynamic> extends self::A<(self::A<(self::Ifac::T*) →* dynamic>*) →* dynamic> {
+  synthetic constructor •() → self::Ifac<self::Ifac::T*>*
+    : super self::A::•()
+    ;
+}
+class Ifca<T extends core::Object* = dynamic> extends self::A<((self::A<self::Ifca::T*>*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Ifca<self::Ifca::T*>*
+    : super self::A::•()
+    ;
+}
+class Icaf<T extends core::Object* = dynamic> extends self::A<(self::A<(self::Icaf::T*) →* dynamic>*) →* dynamic> {
+  synthetic constructor •() → self::Icaf<self::Icaf::T*>*
+    : super self::A::•()
+    ;
+}
+class Icfa<T extends core::Object* = dynamic> extends self::A<((self::A<self::Icfa::T*>*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Icfa<self::Icfa::T*>*
+    : super self::A::•()
+    ;
+}
+class Jfff<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfff<self::Jfff::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jffc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jffc<self::Jffc::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jfcf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcf<self::Jfcf::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jfcc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcc<self::Jfcc::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jcff<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcff<self::Jcff::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jcfc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcfc<self::Jcfc::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jccf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccf<self::Jccf::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jccc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccc<self::Jccc::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounded_implicit_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounded_implicit_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..2b37371
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounded_implicit_instantiation.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounded_implicit_instantiation.dart:7:22: Error: The argument type 'String' can't be assigned to the parameter type 'Never'.
+//   String a = bounded('');
+//                      ^
+//
+// pkg/front_end/testcases/general/bounded_implicit_instantiation.dart:8:21: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'bounded'.
+// Try changing type arguments so that they conform to the bounds.
+//   String b = bounded<String>('');
+//                     ^
+//
+// pkg/front_end/testcases/general/bounded_implicit_instantiation.dart:9:31: Error: Inferred type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'X Function<X extends num>(X)'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   String Function(String) c = bounded;
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method test() → dynamic {
+  function bounded<X extends core::num>(X x) → X
+    return x;
+  core::String a = let final Never #t1 = bounded<Never>(invalid-expression "pkg/front_end/testcases/general/bounded_implicit_instantiation.dart:7:22: Error: The argument type 'String' can't be assigned to the parameter type 'Never'.
+  String a = bounded('');
+                     ^" in "" as{TypeError,ForNonNullableByDefault} Never){(Never) → Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  core::String b = bounded<core::String>(""){(core::String) → core::String};
+  (core::String) → core::String c = bounded<core::String>;
+  core::String d = c(""){(core::String) → core::String};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..228018a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  method bar<covariant-by-class Y extends self::A::X*>() → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  static method foo<Y extends core::Object*>() → self::A<self::B::foo::Y*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method baz() → dynamic {
+  self::B::foo<core::Object*>().{self::A::bar}<core::String*>(){() →* dynamic};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..01f1570
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_in_typedef.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:7:40: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef F = Function<Z extends A<Y>>() Function<Y extends num>();
+//                                        ^
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends String> {}
+//         ^
+//
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:8:18: Error: Type argument 'Y' doesn't conform to the bound 'String' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef G = void Function<Y extends num>(Function<Z extends A<Y>>());
+//                  ^
+// pkg/front_end/testcases/general/bounds_check_in_typedef.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends String> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <Y extends core::num* = dynamic>() →* <Z extends self::A<Y*>* = dynamic>() →* dynamic;
+typedef G = <Y extends core::num* = dynamic>(<Z extends self::A<Y*>* = dynamic>() →* dynamic) →* void;
+class A<X extends core::String*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug21938.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug21938.dart.weak.modular.expect
new file mode 100644
index 0000000..d46ee72
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug21938.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug21938.dart:8:4: Error: The method 'call' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   x();
+//    ^
+//
+// pkg/front_end/testcases/general/bug21938.dart:9:4: Error: The method 'call' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   x(3);
+//    ^
+//
+// pkg/front_end/testcases/general/bug21938.dart:11:5: Error: The method 'call' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   x.call();
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::Object* x;
+  core::Function* f;
+  invalid-expression "pkg/front_end/testcases/general/bug21938.dart:8:4: Error: The method 'call' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+  x();
+   ^" in x{<unresolved>}.call();
+  invalid-expression "pkg/front_end/testcases/general/bug21938.dart:9:4: Error: The method 'call' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+  x(3);
+   ^" in x{<unresolved>}.call(3);
+  f(5, 2);
+  invalid-expression "pkg/front_end/testcases/general/bug21938.dart:11:5: Error: The method 'call' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+  x.call();
+    ^^^^" in x{<unresolved>}.call();
+  f.call;
+  f(5, 2);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug30695.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug30695.dart.weak.modular.expect
new file mode 100644
index 0000000..87f32bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug30695.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
+//   foo() => 42;
+//   ^^^
+// pkg/front_end/testcases/general/bug30695.dart:6:7: Context: This is the inherited member.
+//   var foo = 42;
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* foo = 42;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method foo() → dynamic
+    return 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug31124.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug31124.dart.weak.modular.expect
new file mode 100644
index 0000000..05d5b71
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug31124.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug31124.dart:2:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/general/bug31124.dart:2:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/general/bug31124.dart:2:5: Context: Previous declaration of 'a'.
+// var a = () => 'b';a();
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field () →* core::String* a;
diff --git a/pkg/front_end/testcases/general/bug32414a.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug32414a.dart.weak.modular.expect
new file mode 100644
index 0000000..8f4896c
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414a.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   b = 42;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  dynamic a = 5;
+  core::String* b = a.{core::Object::toString}(){() →* core::String*};
+  b = invalid-expression "pkg/front_end/testcases/general/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  b = 42;
+      ^" in 42 as{TypeError} core::String*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/bug32414b.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug32414b.dart.weak.modular.expect
new file mode 100644
index 0000000..f09b3fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414b.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::List<dynamic>* l = <dynamic>[1, "hello"];
+  core::List<core::String*>* l2 = l.{core::Iterable::map}<core::String*>((dynamic element) → core::String* => element.{core::Object::toString}(){() →* core::String*}){((dynamic) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/bug32426.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug32426.dart.weak.modular.expect
new file mode 100644
index 0000000..3e48d58
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32426.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method call() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method call([core::int* x = #C1]) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::I* i = new self::C::•();
+  ([core::int*]) →* void f = (let final self::I* #t1 = i in #t1 == null ?{() →* void} null : #t1.{self::I::call}{() →* void}) as{TypeError} ([core::int*]) →* void;
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/bug32629.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug32629.dart.weak.modular.expect
new file mode 100644
index 0000000..48c5ec01a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32629.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug32629.dart:16:19: Error: The argument type 'dynamic Function(dynamic, dynamic)' can't be assigned to the parameter type 'String Function(String, dynamic)'.
+//   foo<String>(new A());
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Reducer<invariant S extends core::Object* = dynamic> = (S*, dynamic) →* S*;
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method call(dynamic a, dynamic b) → dynamic {
+    return a;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo<S extends core::Object* = dynamic>((self::foo::S*, dynamic) →* self::foo::S* v) → void {}
+static method test() → void {
+  self::foo<core::String*>(invalid-expression "pkg/front_end/testcases/general/bug32629.dart:16:19: Error: The argument type 'dynamic Function(dynamic, dynamic)' can't be assigned to the parameter type 'String Function(String, dynamic)'.
+  foo<String>(new A());
+                  ^" in (let final self::A* #t1 = new self::A::•() in #t1 == null ?{(dynamic, dynamic) →* dynamic} null : #t1.{self::A::call}{(dynamic, dynamic) →* dynamic}) as{TypeError} (core::String*, dynamic) →* core::String*);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug32866.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug32866.dart.weak.modular.expect
new file mode 100644
index 0000000..25924d8
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32866.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract get f() → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object implements self::B {
+  final field core::String* f;
+  constructor •(core::String* f) → self::A*
+    : self::A::f = f, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* a = new self::A::•("foo");
+static method main() → dynamic
+  return core::print(self::a);
diff --git a/pkg/front_end/testcases/general/bug33099.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug33099.dart.weak.modular.expect
new file mode 100644
index 0000000..68aa1c4
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33099.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:mirrors" as mir;
+
+import "dart:mirrors";
+
+class _FailingTest extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::_FailingTest*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class MyTest extends core::Object {
+  synthetic constructor •() → self::MyTest*
+    : super core::Object::•()
+    ;
+  @#C1
+  method foo() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MyTest::foo}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class MyTest2 extends self::_MyTest2&Object&MyTest {
+  synthetic constructor •() → self::MyTest2*
+    : super self::_MyTest2&Object&MyTest::•()
+    ;
+}
+static const field self::_FailingTest* failingTest = #C1;
+static method main() → dynamic {
+  mir::ClassMirror* classMirror = mir::reflectClass(#C2);
+  classMirror.{mir::ClassMirror::instanceMembers}{core::Map<core::Symbol*, mir::MethodMirror*>*}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
+    if(memberMirror.{mir::DeclarationMirror::simpleName}{core::Symbol*} =={core::Symbol::==}{(core::Object*) →* core::bool*} #C3) {
+      core::print(memberMirror);
+      core::print(self::_hasFailingTestAnnotation(memberMirror));
+    }
+  }){((core::Symbol*, mir::MethodMirror*) →* void) →* void};
+}
+static method _hasFailingTestAnnotation(mir::MethodMirror* method) → core::bool* {
+  core::bool* r = self::_hasAnnotationInstance(method, #C1);
+  core::print("[_hasFailingTestAnnotation] ${method} ${r}");
+  return r;
+}
+static method _hasAnnotationInstance(mir::DeclarationMirror* declaration, dynamic instance) → core::bool*
+  return declaration.{mir::DeclarationMirror::metadata}{core::List<mir::InstanceMirror*>*}.{core::Iterable::any}((mir::InstanceMirror* annotation) → core::bool* {
+    core::print("annotation: ${annotation.{mir::InstanceMirror::reflectee}{dynamic}}");
+    return core::identical(annotation.{mir::InstanceMirror::reflectee}{dynamic}, instance);
+  }){((mir::InstanceMirror*) →* core::bool*) →* core::bool*};
+
+constants  {
+  #C1 = self::_FailingTest {}
+  #C2 = TypeLiteralConstant(self::MyTest2*)
+  #C3 = #foo
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bug33099.dart:
+- _FailingTest. (from org-dartlang-testcase:///bug33099.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/bug33196.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug33196.dart.weak.modular.expect
new file mode 100644
index 0000000..306df2a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33196.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method main() → dynamic {
+  FutureOr<core::String*>* result = self::returnsString();
+  core::print(result.{core::Object::runtimeType}{core::Type*});
+}
+static method returnsString() → FutureOr<core::String*>* async {
+  return "oh no";
+}
diff --git a/pkg/front_end/testcases/general/bug33206.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug33206.dart.weak.modular.expect
new file mode 100644
index 0000000..b73a7ce
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33206.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class X extends core::Object {
+  final field dynamic x;
+  final field dynamic y;
+  constructor •(dynamic x, dynamic y) → self::X*
+    : self::X::x = x, self::X::y = y, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return "X(${this.{self::X::x}{dynamic}}, ${this.{self::X::y}{dynamic}})";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Y extends core::Object {
+  synthetic constructor •() → self::Y*
+    : super core::Object::•()
+    ;
+  method f(dynamic _) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f1() → asy::Future<core::List<core::Object*>*>* async {
+  return <core::Object*>[1];
+}
+static method f2() → core::List<core::Object*>*
+  return <core::Object*>[2];
+static method f3() → asy::Future<core::Object*>* async {
+  return 3;
+}
+static method foo() → asy::Future<self::X*>* async {
+  return new self::X::•(let final self::Y* #t1 = new self::Y::•() in block {
+    #t1.{self::Y::f}(await self::f1()){(dynamic) →* dynamic};
+    #t1.{self::Y::f}(self::f2()){(dynamic) →* dynamic};
+  } =>#t1, await self::f3());
+}
+static method main() → asy::Future<void>* async {
+  core::print(await self::foo());
+}
diff --git a/pkg/front_end/testcases/general/bug33298.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug33298.dart.weak.modular.expect
new file mode 100644
index 0000000..d656910
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33298.dart.weak.modular.expect
@@ -0,0 +1,76 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
+//   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
+//                                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method call(core::String* s) → core::String*
+    return "${s}${s}";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method call(covariant-by-class self::B::T* t) → self::B::T*
+    return t;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object* = dynamic>(self::C::call::T* t) → self::C::call::T*
+    return t;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  self::A* a = new self::A::•();
+  core::List<core::String*>* list1 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(a.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  core::List<core::String*>* list2 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(let final self::A* #t1 = a in #t1 == null ?{(core::String*) →* core::String*} null : #t1.{self::A::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  self::B<core::String*>* b = new self::B::•<core::String*>();
+  core::List<core::String*>* list3 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(b.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  core::List<core::String*>* list4 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(let final self::B<core::String*>* #t2 = b in #t2 == null ?{(core::String*) →* core::String*} null : #t2.{self::B::call}{(core::String*) →* core::String*}){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  self::C* c = new self::C::•();
+  core::List<core::String*>* list5 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(c.{self::C::call}{<T extends core::Object* = dynamic>(T*) →* T*}<core::String*>){((core::String*) →* core::String*) →* core::Iterable<core::String*>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+  core::List<core::String*>* list6 = <core::String*>["a", "b", "c"].{core::Iterable::map}<dynamic>(invalid-expression "pkg/front_end/testcases/general/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
+  List<String> list6 = ['a', 'b', 'c'].map(c).toList();
+                                           ^" in (let final self::C* #t3 = c in #t3 == null ?{<T extends core::Object* = dynamic>(T*) →* T*} null : #t3.{self::C::call}{<T extends core::Object* = dynamic>(T*) →* T*}) as{TypeError} (core::String*) →* dynamic){((core::String*) →* dynamic) →* core::Iterable<dynamic>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<dynamic>*} as{TypeError} core::List<core::String*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug34511.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug34511.dart.weak.modular.expect
new file mode 100644
index 0000000..5cda82c
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug34511.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _B&Object&A<Z extends core::Object* = dynamic> = core::Object with self::A<() →* self::_B&Object&A::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<Z extends core::Object* = dynamic> extends self::_B&Object&A<self::B::Z*> {
+  synthetic constructor •() → self::B<self::B::Z*>*
+    : super self::_B&Object&A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug35470.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug35470.dart.weak.modular.expect
new file mode 100644
index 0000000..bc15f31
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug35470.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class Y extends self::A::X*>() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method bar(self::B* b) → dynamic {
+  b.{self::A::foo}<dynamic>(){() →* dynamic};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug37476.dart.weak.modular.expect b/pkg/front_end/testcases/general/bug37476.dart.weak.modular.expect
new file mode 100644
index 0000000..6cc98ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug37476.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
+    core::print("foo: T = ${self::A::T*}");
+    return <S extends self::A::T*>(S* a) → Null {};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method foo() → (self::B::T*) →* void {
+    core::print("foo: T = ${self::B::T*}");
+    return (self::B::T* a) → Null {};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A<core::num*>* a = new self::A::•<core::int*>();
+static field self::B<core::num*>* b = new self::B::•<core::int*>();
+static method main() → dynamic {
+  try {
+    self::a.{self::A::foo}(){() →* <S extends core::num* = dynamic>(S*) →* void} as{TypeError,CovarianceCheck} <S extends core::num* = dynamic>(S*) →* void;
+    throw "Expected TypeError";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    self::b.{self::B::foo}(){() →* (core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+    throw "Expected TypeError";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/build_issue_2688.dart.weak.modular.expect b/pkg/front_end/testcases/general/build_issue_2688.dart.weak.modular.expect
new file mode 100644
index 0000000..226f3df
--- /dev/null
+++ b/pkg/front_end/testcases/general/build_issue_2688.dart.weak.modular.expect
@@ -0,0 +1,560 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super*
+    : super core::Object::•()
+    ;
+  abstract get property() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Super&M0 = self::Super with self::M0 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0*
+    : super self::Super::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M0::property
+}
+abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1*
+    : super self::_Class&Super&M0::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M1::property
+}
+abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2*
+    : super self::_Class&Super&M0&M1::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M2::property
+}
+abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3*
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M3::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4*
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M4::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5*
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M5::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M6::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M7::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M8::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M9::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M10::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M11::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M12::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M13::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M14::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M15::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M16::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M17::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M18::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M19::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M20::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M21::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M22::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M23::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M24::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M25::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M26::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+  abstract mixin-stub get property() → core::int*; -> self::M27::property
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class*
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27::•()
+    ;
+  get property() → core::int*
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/call.dart.weak.modular.expect b/pkg/front_end/testcases/general/call.dart.weak.modular.expect
new file mode 100644
index 0000000..f9559169
--- /dev/null
+++ b/pkg/front_end/testcases/general/call.dart.weak.modular.expect
@@ -0,0 +1,234 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+//  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   var string5 = callableGetter(1);
+//                               ^
+//
+// pkg/front_end/testcases/general/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing1 = closure();
+//                         ^
+//
+// pkg/front_end/testcases/general/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing2 = closure.call();
+//                              ^
+//
+// pkg/front_end/testcases/general/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing3 = closure.call.call();
+//                                   ^
+//
+// pkg/front_end/testcases/general/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing4 = closure.call.call.call();
+//                                        ^
+//
+// pkg/front_end/testcases/general/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing5 = callable();
+//                          ^
+//
+// pkg/front_end/testcases/general/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing6 = callable.call();
+//                               ^
+//
+// pkg/front_end/testcases/general/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing7 = callable.call.call();
+//                                    ^
+//
+// pkg/front_end/testcases/general/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing8 = callable.call.call.call();
+//                                         ^
+//
+// pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+//  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   var nothing9 = callableGetter();
+//                                ^
+//
+// pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+//  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var string5 = callableGetter(1);
+//                             ^
+//
+// pkg/front_end/testcases/general/call.dart:68:23: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing1 = closure();
+//                       ^
+//
+// pkg/front_end/testcases/general/call.dart:69:28: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing2 = closure.call();
+//                            ^
+//
+// pkg/front_end/testcases/general/call.dart:70:33: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing3 = closure.call.call();
+//                                 ^
+//
+// pkg/front_end/testcases/general/call.dart:71:38: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing4 = closure.call.call.call();
+//                                      ^
+//
+// pkg/front_end/testcases/general/call.dart:73:24: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing5 = callable();
+//                        ^
+//
+// pkg/front_end/testcases/general/call.dart:74:29: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing6 = callable.call();
+//                             ^
+//
+// pkg/front_end/testcases/general/call.dart:75:34: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing7 = callable.call.call();
+//                                  ^
+//
+// pkg/front_end/testcases/general/call.dart:76:39: Error: Too few positional arguments: 1 required, 0 given.
+// var nothing8 = callable.call.call.call();
+//                                       ^
+//
+// pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+//  - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var nothing9 = callableGetter();
+//                              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Callable extends core::Object {
+  synthetic constructor •() → self::Callable*
+    : super core::Object::•()
+    ;
+  method call(dynamic x) → dynamic {
+    return "string";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CallableGetter extends core::Object {
+  synthetic constructor •() → self::CallableGetter*
+    : super core::Object::•()
+    ;
+  get call() → dynamic
+    return new self::Callable::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field (dynamic) →* dynamic closure = (dynamic x) → dynamic => x;
+static field dynamic int1 = self::closure(1){(dynamic) →* dynamic};
+static field dynamic int2 = self::closure(1){(dynamic) →* dynamic};
+static field dynamic int3 = self::closure.call(1){(dynamic) →* dynamic};
+static field dynamic int4 = self::closure.call.call(1){(dynamic) →* dynamic};
+static field self::Callable* callable = new self::Callable::•();
+static field dynamic string1 = self::callable.{self::Callable::call}(1){(dynamic) →* dynamic};
+static field dynamic string2 = self::callable.{self::Callable::call}(1){(dynamic) →* dynamic};
+static field dynamic string3 = self::callable.{self::Callable::call}{(dynamic) →* dynamic}(1){(dynamic) →* dynamic};
+static field dynamic string4 = self::callable.{self::Callable::call}{(dynamic) →* dynamic}.call(1){(dynamic) →* dynamic};
+static field self::CallableGetter* callableGetter = new self::CallableGetter::•();
+static field invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:63:29: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+ - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var string5 = callableGetter(1);
+                            ^";
+static field dynamic string6 = let final self::CallableGetter* #t1 = self::callableGetter in let final core::int* #t2 = 1 in #t1.{self::CallableGetter::call}{dynamic}{dynamic}.call(#t2);
+static field dynamic string7 = self::callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call(1);
+static field dynamic string8 = self::callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call{dynamic}.call(1);
+static field dynamic nothing1 = invalid-expression "pkg/front_end/testcases/general/call.dart:68:23: Error: Too few positional arguments: 1 required, 0 given.
+var nothing1 = closure();
+                      ^" in self::closure{<inapplicable>}.();
+static field dynamic nothing2 = invalid-expression "pkg/front_end/testcases/general/call.dart:69:28: Error: Too few positional arguments: 1 required, 0 given.
+var nothing2 = closure.call();
+                           ^" in self::closure{<inapplicable>}.();
+static field dynamic nothing3 = invalid-expression "pkg/front_end/testcases/general/call.dart:70:33: Error: Too few positional arguments: 1 required, 0 given.
+var nothing3 = closure.call.call();
+                                ^" in self::closure.call{<inapplicable>}.();
+static field dynamic nothing4 = invalid-expression "pkg/front_end/testcases/general/call.dart:71:38: Error: Too few positional arguments: 1 required, 0 given.
+var nothing4 = closure.call.call.call();
+                                     ^" in self::closure.call.call{<inapplicable>}.();
+static field dynamic nothing5 = invalid-expression "pkg/front_end/testcases/general/call.dart:73:24: Error: Too few positional arguments: 1 required, 0 given.
+var nothing5 = callable();
+                       ^" in self::callable.{self::Callable::call}{<inapplicable>}.(){() →* invalid-type};
+static field dynamic nothing6 = invalid-expression "pkg/front_end/testcases/general/call.dart:74:29: Error: Too few positional arguments: 1 required, 0 given.
+var nothing6 = callable.call();
+                            ^" in self::callable.{self::Callable::call}{<inapplicable>}.(){() →* invalid-type};
+static field dynamic nothing7 = invalid-expression "pkg/front_end/testcases/general/call.dart:75:34: Error: Too few positional arguments: 1 required, 0 given.
+var nothing7 = callable.call.call();
+                                 ^" in self::callable.{self::Callable::call}{(dynamic) →* dynamic}{<inapplicable>}.();
+static field dynamic nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:76:39: Error: Too few positional arguments: 1 required, 0 given.
+var nothing8 = callable.call.call.call();
+                                      ^" in self::callable.{self::Callable::call}{(dynamic) →* dynamic}.call{<inapplicable>}.();
+static field invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:78:30: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+ - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var nothing9 = callableGetter();
+                             ^";
+static field dynamic nothing10 = self::callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call();
+static field dynamic nothing11 = self::callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call();
+static field dynamic nothing12 = self::callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call{dynamic}.call();
+static method main() → dynamic {
+  (dynamic) →* dynamic closure = (dynamic x) → dynamic => x;
+  dynamic int1 = closure(1){(dynamic) →* dynamic};
+  dynamic int2 = closure(1){(dynamic) →* dynamic};
+  dynamic int3 = closure.call(1){(dynamic) →* dynamic};
+  dynamic int4 = closure.call.call(1){(dynamic) →* dynamic};
+  self::Callable* callable = new self::Callable::•();
+  dynamic string1 = callable.{self::Callable::call}(1){(dynamic) →* dynamic};
+  dynamic string2 = callable.{self::Callable::call}(1){(dynamic) →* dynamic};
+  dynamic string3 = callable.{self::Callable::call}{(dynamic) →* dynamic}(1){(dynamic) →* dynamic};
+  dynamic string4 = callable.{self::Callable::call}{(dynamic) →* dynamic}.call(1){(dynamic) →* dynamic};
+  self::CallableGetter* callableGetter = new self::CallableGetter::•();
+  invalid-type string5 = invalid-expression "pkg/front_end/testcases/general/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+ - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  var string5 = callableGetter(1);
+                              ^";
+  dynamic string6 = let final self::CallableGetter* #t3 = callableGetter in let final core::int* #t4 = 1 in #t3.{self::CallableGetter::call}{dynamic}{dynamic}.call(#t4);
+  dynamic string7 = callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call(1);
+  dynamic string8 = callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call{dynamic}.call(1);
+  invalid-type nothing1 = invalid-expression "pkg/front_end/testcases/general/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing1 = closure();
+                        ^" in closure{<inapplicable>}.();
+  invalid-type nothing2 = invalid-expression "pkg/front_end/testcases/general/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing2 = closure.call();
+                             ^" in closure{<inapplicable>}.();
+  invalid-type nothing3 = invalid-expression "pkg/front_end/testcases/general/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing3 = closure.call.call();
+                                  ^" in closure.call{<inapplicable>}.();
+  invalid-type nothing4 = invalid-expression "pkg/front_end/testcases/general/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing4 = closure.call.call.call();
+                                       ^" in closure.call.call{<inapplicable>}.();
+  invalid-type nothing5 = invalid-expression "pkg/front_end/testcases/general/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing5 = callable();
+                         ^" in callable.{self::Callable::call}{<inapplicable>}.(){() →* invalid-type};
+  invalid-type nothing6 = invalid-expression "pkg/front_end/testcases/general/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing6 = callable.call();
+                              ^" in callable.{self::Callable::call}{<inapplicable>}.(){() →* invalid-type};
+  invalid-type nothing7 = invalid-expression "pkg/front_end/testcases/general/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing7 = callable.call.call();
+                                   ^" in callable.{self::Callable::call}{(dynamic) →* dynamic}{<inapplicable>}.();
+  invalid-type nothing8 = invalid-expression "pkg/front_end/testcases/general/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing8 = callable.call.call.call();
+                                        ^" in callable.{self::Callable::call}{(dynamic) →* dynamic}.call{<inapplicable>}.();
+  invalid-type nothing9 = invalid-expression "pkg/front_end/testcases/general/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+ - 'CallableGetter' is from 'pkg/front_end/testcases/general/call.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  var nothing9 = callableGetter();
+                               ^";
+  dynamic nothing10 = callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call();
+  dynamic nothing11 = callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call();
+  dynamic nothing12 = callableGetter.{self::CallableGetter::call}{dynamic}{dynamic}.call{dynamic}.call();
+}
diff --git a/pkg/front_end/testcases/general/callable_type_variable.dart.weak.modular.expect b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..82b2ca3
--- /dev/null
+++ b/pkg/front_end/testcases/general/callable_type_variable.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/callable_type_variable.dart:25:19: Error: Too few positional arguments: 1 required, 0 given.
+//     var v1 = field(); // error
+//                   ^
+//
+// pkg/front_end/testcases/general/callable_type_variable.dart:28:24: Error: Too few positional arguments: 1 required, 0 given.
+//     var v4 = field.call(); // error
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1<T extends core::Function*> extends core::Object {
+  covariant-by-class field self::Class1::T* field;
+  constructor •(self::Class1::T* field) → self::Class1<self::Class1::T*>*
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  method method() → dynamic {
+    dynamic v1 = this.{self::Class1::field}{self::Class1::T*}();
+    dynamic v2 = let final core::int* #t1 = 0 in this.{self::Class1::field}{self::Class1::T*}(#t1);
+    self::Class1::T* v3 = this.{self::Class1::field}{self::Class1::T*}.call;
+    dynamic v4 = this.{self::Class1::field}{self::Class1::T*}();
+    dynamic v5 = this.{self::Class1::field}{self::Class1::T*}(0);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2<T extends (core::int*) →* core::String*> extends core::Object {
+  covariant-by-class field self::Class2::T* field;
+  constructor •(self::Class2::T* field) → self::Class2<self::Class2::T*>*
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  method method() → dynamic {
+    invalid-type v1 = invalid-expression "pkg/front_end/testcases/general/callable_type_variable.dart:25:19: Error: Too few positional arguments: 1 required, 0 given.
+    var v1 = field(); // error
+                  ^" in this.{self::Class2::field}{self::Class2::T*}{<inapplicable>}.();
+    core::String* v2 = let final core::int* #t2 = 0 in this.{self::Class2::field}{self::Class2::T*}(#t2){(core::int*) →* core::String*};
+    self::Class2::T* v3 = this.{self::Class2::field}{self::Class2::T*}.call;
+    invalid-type v4 = invalid-expression "pkg/front_end/testcases/general/callable_type_variable.dart:28:24: Error: Too few positional arguments: 1 required, 0 given.
+    var v4 = field.call(); // error
+                       ^" in this.{self::Class2::field}{self::Class2::T*}{<inapplicable>}.();
+    core::String* v5 = this.{self::Class2::field}{self::Class2::T*}(0){(core::int*) →* core::String*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/candidate_found.dart.weak.modular.expect b/pkg/front_end/testcases/general/candidate_found.dart.weak.modular.expect
new file mode 100644
index 0000000..a8817a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/candidate_found.dart.weak.modular.expect
@@ -0,0 +1,85 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/candidate_found.dart:16:11: Error: Too few positional arguments: 1 required, 0 given.
+//   new Fisk();
+//           ^
+// pkg/front_end/testcases/general/candidate_found.dart:6:3: Context: Found this candidate, but the arguments don't match.
+//   Fisk(int x) {}
+//   ^^^^
+//
+// pkg/front_end/testcases/general/candidate_found.dart:17:17: Error: Too few positional arguments: 1 required, 0 given.
+//   new Fisk.named();
+//                 ^
+// pkg/front_end/testcases/general/candidate_found.dart:8:3: Context: Found this candidate, but the arguments don't match.
+//   Fisk.named(int x) {}
+//   ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/candidate_found.dart:18:7: Error: Too few positional arguments: 1 required, 0 given.
+//   Fisk();
+//       ^
+// pkg/front_end/testcases/general/candidate_found.dart:6:3: Context: Found this candidate, but the arguments don't match.
+//   Fisk(int x) {}
+//   ^^^^
+//
+// pkg/front_end/testcases/general/candidate_found.dart:19:13: Error: Too few positional arguments: 1 required, 0 given.
+//   Fisk.named();
+//             ^
+// pkg/front_end/testcases/general/candidate_found.dart:8:3: Context: Found this candidate, but the arguments don't match.
+//   Fisk.named(int x) {}
+//   ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/candidate_found.dart:20:20: Error: Too few positional arguments: 1 required, 0 given.
+//   Fisk.staticMethod();
+//                    ^
+// pkg/front_end/testcases/general/candidate_found.dart:12:15: Context: Found this candidate, but the arguments don't match.
+//   static void staticMethod(int x) {}
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/candidate_found.dart:21:24: Error: Too few positional arguments: 1 required, 0 given.
+//   (null as Fisk).method();
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Fisk extends core::Object {
+  constructor •(core::int* x) → self::Fisk*
+    : super core::Object::•() {}
+  constructor named(core::int* x) → self::Fisk*
+    : super core::Object::•() {}
+  method method(core::int* x) → void {}
+  static method staticMethod(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/candidate_found.dart:16:11: Error: Too few positional arguments: 1 required, 0 given.
+  new Fisk();
+          ^";
+  invalid-expression "pkg/front_end/testcases/general/candidate_found.dart:17:17: Error: Too few positional arguments: 1 required, 0 given.
+  new Fisk.named();
+                ^";
+  invalid-expression "pkg/front_end/testcases/general/candidate_found.dart:18:7: Error: Too few positional arguments: 1 required, 0 given.
+  Fisk();
+      ^";
+  invalid-expression "pkg/front_end/testcases/general/candidate_found.dart:19:13: Error: Too few positional arguments: 1 required, 0 given.
+  Fisk.named();
+            ^";
+  invalid-expression "pkg/front_end/testcases/general/candidate_found.dart:20:20: Error: Too few positional arguments: 1 required, 0 given.
+  Fisk.staticMethod();
+                   ^";
+  invalid-expression "pkg/front_end/testcases/general/candidate_found.dart:21:24: Error: Too few positional arguments: 1 required, 0 given.
+  (null as Fisk).method();
+                       ^" in (null as self::Fisk*).{self::Fisk::method}{<inapplicable>}.(){() →* invalid-type};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/cascade.dart.weak.modular.expect b/pkg/front_end/testcases/general/cascade.dart.weak.modular.expect
new file mode 100644
index 0000000..3d4d8ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+//  - 'List' is from 'dart:core'.
+//     [1]
+//     ^
+//
+// pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+//     ..first.last.toString()
+//             ^^^^
+//
+// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//     ..first[0].toString()
+//            ^
+//
+// pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+//     ..[0].last.toString();
+//           ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<core::int*>* list = let final core::List<core::int*>* #t1 = <core::int*>[1] in block {
+    #t1.{core::List::add}(2){(core::int*) →* void};
+    #t1.{core::List::add}(3){(core::int*) →* void};
+    #t1.{core::List::addAll}(<core::int*>[4, 5]){(core::Iterable<core::int*>*) →* void};
+  } =>#t1;
+  core::print(list);
+  let final core::List<core::int*>* #t2 = list in block {
+    #t2.{core::List::add}(2){(core::int*) →* void};
+    #t2.{core::List::length}{core::int*};
+    #t2.{core::List::length} = 0;
+  } =>#t2;
+  core::print(list);
+  let final core::List<core::int*>* #t3 = list in block {
+    #t3.{core::List::add}(2){(core::int*) →* void};
+    #t3.{core::List::[]}(0){(core::int*) →* core::int*};
+    #t3.{core::List::[]=}(0, 87){(core::int*, core::int*) →* void};
+  } =>#t3;
+  core::print(list);
+  list = let final core::List<core::int*>* #t4 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+ - 'List' is from 'dart:core'.
+    [1]
+    ^" in <core::int*>[1] as{TypeError} core::int*] in block {
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+    ..first.last.toString()
+            ^^^^" in #t4.{core::Iterable::first}{core::int*}{<unresolved>}.last.{core::Object::toString}(){() →* core::String*};
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+    ..first[0].toString()
+           ^" in #t4.{core::Iterable::first}{core::int*}{<unresolved>}.[](0).{core::Object::toString}(){() →* core::String*};
+    invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+    ..[0].last.toString();
+          ^^^^" in #t4.{core::List::[]}(0){(core::int*) →* core::int*}{<unresolved>}.last.{core::Object::toString}(){() →* core::String*};
+  } =>#t4;
+  core::print(list);
+}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.weak.modular.expect b/pkg/front_end/testcases/general/cascade_context.dart.weak.modular.expect
new file mode 100644
index 0000000..11f2c0b
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → dynamic {
+  core::int* v1 = self::f<core::int*>();
+  core::int* v2 = let final core::int* #t1 = self::f<core::int*>() in block {
+    #t1.{core::int::isEven}{core::bool*};
+  } =>#t1;
+  core::int* v3 = let final core::int* #t2 = self::f<core::int*>() in block {
+    #t2.{core::int::isEven}{core::bool*};
+    #t2.{core::int::isEven}{core::bool*};
+  } =>#t2;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/casts.dart.weak.modular.expect b/pkg/front_end/testcases/general/casts.dart.weak.modular.expect
new file mode 100644
index 0000000..bfac5fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/casts.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("" as core::String*);
+  core::print(1 as core::int*);
+  core::print(1.0 as core::double*);
+  core::print("" is core::String*);
+  core::print("" is core::int*);
+  core::print("" is core::double*);
+  core::print(1 is core::String*);
+  core::print(1 is core::int*);
+  core::print(1 is core::double*);
+  core::print(1.0 is core::String*);
+  core::print(1.0 is core::int*);
+  core::print(1.0 is core::double*);
+}
diff --git a/pkg/front_end/testcases/general/check_deferred_allocation.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.weak.modular.expect
new file mode 100644
index 0000000..ee44558
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_allocation.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in new def::C::•());
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_as_check.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.weak.modular.expect
new file mode 100644
index 0000000..3ed13e8
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_as_check.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_as_check.dart:9:8: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/general/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
+//   x as lib.C;
+//        ^^^^^
+//
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test(dynamic x) → dynamic {
+  x as invalid-type;
+}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → self2::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.weak.modular.expect
new file mode 100644
index 0000000..a15d266
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "deferred_lib.dart" as def;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::x = self::m2() as{TypeError,ForDynamic} core::int*;
+  let final dynamic #t2 = CheckLibraryIsLoaded(lib) in def::m(self::m2());
+}
+static method m2() → dynamic
+  return 1;
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.weak.modular.expect
new file mode 100644
index 0000000..12e71e3
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic async {
+  let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::m(await LoadLibrary(lib));
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_call.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.weak.modular.expect
new file mode 100644
index 0000000..1d2d900
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_call.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::m(3);
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_write.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.weak.modular.expect
new file mode 100644
index 0000000..549e5e0
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_write.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::x = 2;
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_is_check.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.weak.modular.expect
new file mode 100644
index 0000000..08b44c2
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_is_check.dart:9:14: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/general/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
+//   print(x is lib.C);
+//              ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test(dynamic x) → dynamic {
+  core::print(x is invalid-type);
+}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → self2::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.weak.modular.expect
new file mode 100644
index 0000000..d298cb9
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print((let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::x).{core::num::+}(1){(core::num*) →* core::int*});
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.weak.modular.expect
new file mode 100644
index 0000000..7ebd7ea
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::C::y);
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.weak.modular.expect
new file mode 100644
index 0000000..efb9d56
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in #C1);
+}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → self2::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
+
+constants  {
+  #C1 = TypeLiteralConstant(self2::C*)
+}
diff --git a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.weak.modular.expect
new file mode 100644
index 0000000..2fb6711
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  core::print(let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::C::m());
+}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.weak.modular.expect
new file mode 100644
index 0000000..1189c30
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_type_declaration.dart:9:3: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/general/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
+//   lib.C x = null;
+//   ^^^^^
+//
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  return self::test();
+static method test() → dynamic {
+  invalid-type x = null;
+}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → self2::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.weak.modular.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.weak.modular.expect
new file mode 100644
index 0000000..80172a1
--- /dev/null
+++ b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
+// Specify the type explicitly.
+//   C._circular(this.f);
+//   ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field self::C* f = new self::C::_circular(null);
+  constructor _circular(self::C* f) → self::C*
+    : self::C::f = f, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* x = new self::C::_circular(null);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/classes.dart.weak.modular.expect b/pkg/front_end/testcases/general/classes.dart.weak.modular.expect
new file mode 100644
index 0000000..288e237
--- /dev/null
+++ b/pkg/front_end/testcases/general/classes.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* x;
+  final field core::int* y;
+  constructor •(core::int* y) → self::A*
+    : self::A::y = y, self::A::x = 42, super core::Object::•()
+    ;
+  method method() → dynamic {
+    core::print("A.method x: ${this.{self::A::x}{core::int*}} y: ${this.{self::A::y}{core::int*}}");
+    core::print(this);
+    core::print(this.{self::A::runtimeType}{core::Type*});
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  constructor •(dynamic x) → self::B*
+    : super self::A::•(x as{TypeError,ForDynamic} core::int*)
+    ;
+  method method() → dynamic {
+    core::print("B.method x: ${this.{self::A::x}{core::int*}} y: ${this.{self::A::y}{core::int*}}");
+    super.{self::A::method}();
+  }
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•(87);
+  self::B* b = new self::B::•(117);
+  a.{self::A::method}(){() →* dynamic};
+  b.{self::B::method}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/clone_function_type.dart.weak.modular.expect
new file mode 100644
index 0000000..7453dc4
--- /dev/null
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.weak.modular.expect
@@ -0,0 +1,1425 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// class Qm1<Z> = Object with Am1<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// class Qm2<Z> = Object with Am2<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bm2<Z> extends Object with Am2<Function(int), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Jm2<Z> extends Object with Am2<Function, Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Mm2<Z> = Object with Am2<Function(int), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Nm2<Z> = Object with Am2<Function(int x), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Um2<Z> = Object with Am2<Function, Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef TdB = (core::int*) →* dynamic;
+typedef TdC = (core::int*) →* dynamic;
+typedef TdD = () →* core::int*;
+typedef TdE = () →* dynamic;
+typedef TdF = () →* dynamic;
+typedef TdG = ({x: core::int*}) →* dynamic;
+typedef TdH = ([core::int*]) →* dynamic;
+typedef TdI = ([core::int*]) →* dynamic;
+typedef TdJ = (core::Function*) →* dynamic;
+typedef TdK = () →* (() →* core::Function*) →* dynamic;
+class Am1<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am1<self::Am1::X*, self::Am1::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Bm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::_Bm1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bm1<Z extends core::Object* = dynamic> extends self::_Bm1&Object&Am1<self::Bm1::Z*> {
+  synthetic constructor •() → self::Bm1<self::Bm1::Z*>*
+    : super self::_Bm1&Object&Am1::•()
+    ;
+}
+abstract class _Cm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::_Cm1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Cm1<Z extends core::Object* = dynamic> extends self::_Cm1&Object&Am1<self::Cm1::Z*> {
+  synthetic constructor •() → self::Cm1<self::Cm1::Z*>*
+    : super self::_Cm1&Object&Am1::•()
+    ;
+}
+abstract class _Dm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* core::int*, self::_Dm1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Dm1<Z extends core::Object* = dynamic> extends self::_Dm1&Object&Am1<self::Dm1::Z*> {
+  synthetic constructor •() → self::Dm1<self::Dm1::Z*>*
+    : super self::_Dm1&Object&Am1::•()
+    ;
+}
+abstract class _Em1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::_Em1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Em1<Z extends core::Object* = dynamic> extends self::_Em1&Object&Am1<self::Em1::Z*> {
+  synthetic constructor •() → self::Em1<self::Em1::Z*>*
+    : super self::_Em1&Object&Am1::•()
+    ;
+}
+abstract class _Fm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::_Fm1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fm1<Z extends core::Object* = dynamic> extends self::_Fm1&Object&Am1<self::Fm1::Z*> {
+  synthetic constructor •() → self::Fm1<self::Fm1::Z*>*
+    : super self::_Fm1&Object&Am1::•()
+    ;
+}
+abstract class _Gm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<({x: core::int*}) →* dynamic, self::_Gm1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Gm1<Z extends core::Object* = dynamic> extends self::_Gm1&Object&Am1<self::Gm1::Z*> {
+  synthetic constructor •() → self::Gm1<self::Gm1::Z*>*
+    : super self::_Gm1&Object&Am1::•()
+    ;
+}
+abstract class _Hm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::_Hm1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Hm1<Z extends core::Object* = dynamic> extends self::_Hm1&Object&Am1<self::Hm1::Z*> {
+  synthetic constructor •() → self::Hm1<self::Hm1::Z*>*
+    : super self::_Hm1&Object&Am1::•()
+    ;
+}
+abstract class _Im1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::_Im1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Im1<Z extends core::Object* = dynamic> extends self::_Im1&Object&Am1<self::Im1::Z*> {
+  synthetic constructor •() → self::Im1<self::Im1::Z*>*
+    : super self::_Im1&Object&Am1::•()
+    ;
+}
+abstract class _Jm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<core::Function*, self::_Jm1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jm1<Z extends core::Object* = dynamic> extends self::_Jm1&Object&Am1<self::Jm1::Z*> {
+  synthetic constructor •() → self::Jm1<self::Jm1::Z*>*
+    : super self::_Jm1&Object&Am1::•()
+    ;
+}
+abstract class _Km1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::Function*) →* dynamic, self::_Km1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Km1<Z extends core::Object* = dynamic> extends self::_Km1&Object&Am1<self::Km1::Z*> {
+  synthetic constructor •() → self::Km1<self::Km1::Z*>*
+    : super self::_Km1&Object&Am1::•()
+    ;
+}
+abstract class _Lm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* (() →* core::Function*) →* dynamic, self::_Lm1&Object&Am1::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Lm1<Z extends core::Object* = dynamic> extends self::_Lm1&Object&Am1<self::Lm1::Z*> {
+  synthetic constructor •() → self::Lm1<self::Lm1::Z*>*
+    : super self::_Lm1&Object&Am1::•()
+    ;
+}
+class Mm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::Mm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Nm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::Nm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Om1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* core::int*, self::Om1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Om1<self::Om1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Pm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::Pm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Qm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::Qm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Rm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<({x: core::int*}) →* dynamic, self::Rm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Sm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::Sm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Tm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::Tm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Um1<Z extends core::Object* = dynamic> = core::Object with self::Am1<core::Function*, self::Um1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Um1<self::Um1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Vm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::Function*) →* dynamic, self::Vm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Wm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* (() →* core::Function*) →* dynamic, self::Wm1::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Am2<X extends () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::_Bm2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bm2<Z extends core::Object* = dynamic> extends self::_Bm2&Object&Am2<self::Bm2::Z*> {
+  synthetic constructor •() → self::Bm2<self::Bm2::Z*>*
+    : super self::_Bm2&Object&Am2::•()
+    ;
+}
+abstract class _Cm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::_Cm2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Cm2<Z extends core::Object* = dynamic> extends self::_Cm2&Object&Am2<self::Cm2::Z*> {
+  synthetic constructor •() → self::Cm2<self::Cm2::Z*>*
+    : super self::_Cm2&Object&Am2::•()
+    ;
+}
+abstract class _Dm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* core::int*, self::_Dm2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Dm2<Z extends core::Object* = dynamic> extends self::_Dm2&Object&Am2<self::Dm2::Z*> {
+  synthetic constructor •() → self::Dm2<self::Dm2::Z*>*
+    : super self::_Dm2&Object&Am2::•()
+    ;
+}
+abstract class _Em2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::_Em2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Em2<Z extends core::Object* = dynamic> extends self::_Em2&Object&Am2<self::Em2::Z*> {
+  synthetic constructor •() → self::Em2<self::Em2::Z*>*
+    : super self::_Em2&Object&Am2::•()
+    ;
+}
+abstract class _Fm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::_Fm2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fm2<Z extends core::Object* = dynamic> extends self::_Fm2&Object&Am2<self::Fm2::Z*> {
+  synthetic constructor •() → self::Fm2<self::Fm2::Z*>*
+    : super self::_Fm2&Object&Am2::•()
+    ;
+}
+abstract class _Gm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<({x: core::int*}) →* dynamic, self::_Gm2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Gm2<Z extends core::Object* = dynamic> extends self::_Gm2&Object&Am2<self::Gm2::Z*> {
+  synthetic constructor •() → self::Gm2<self::Gm2::Z*>*
+    : super self::_Gm2&Object&Am2::•()
+    ;
+}
+abstract class _Hm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::_Hm2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Hm2<Z extends core::Object* = dynamic> extends self::_Hm2&Object&Am2<self::Hm2::Z*> {
+  synthetic constructor •() → self::Hm2<self::Hm2::Z*>*
+    : super self::_Hm2&Object&Am2::•()
+    ;
+}
+abstract class _Im2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::_Im2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Im2<Z extends core::Object* = dynamic> extends self::_Im2&Object&Am2<self::Im2::Z*> {
+  synthetic constructor •() → self::Im2<self::Im2::Z*>*
+    : super self::_Im2&Object&Am2::•()
+    ;
+}
+abstract class _Jm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<core::Function*, self::_Jm2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jm2<Z extends core::Object* = dynamic> extends self::_Jm2&Object&Am2<self::Jm2::Z*> {
+  synthetic constructor •() → self::Jm2<self::Jm2::Z*>*
+    : super self::_Jm2&Object&Am2::•()
+    ;
+}
+abstract class _Km2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::Function*) →* dynamic, self::_Km2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Km2<Z extends core::Object* = dynamic> extends self::_Km2&Object&Am2<self::Km2::Z*> {
+  synthetic constructor •() → self::Km2<self::Km2::Z*>*
+    : super self::_Km2&Object&Am2::•()
+    ;
+}
+abstract class _Lm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* (() →* core::Function*) →* dynamic, self::_Lm2&Object&Am2::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Lm2<Z extends core::Object* = dynamic> extends self::_Lm2&Object&Am2<self::Lm2::Z*> {
+  synthetic constructor •() → self::Lm2<self::Lm2::Z*>*
+    : super self::_Lm2&Object&Am2::•()
+    ;
+}
+class Mm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::Mm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Nm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::Nm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Om2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* core::int*, self::Om2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Om2<self::Om2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Pm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::Pm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Qm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::Qm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Rm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<({x: core::int*}) →* dynamic, self::Rm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Sm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::Sm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Tm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::Tm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Um2<Z extends core::Object* = dynamic> = core::Object with self::Am2<core::Function*, self::Um2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Um2<self::Um2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Vm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::Function*) →* dynamic, self::Vm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Wm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* (() →* core::Function*) →* dynamic, self::Wm2::Z*> /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Am3<L extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am3<self::Am3::L*, self::Am3::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Bm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<(core::int*) →* dynamic, self::_Bm3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bm3<Z extends core::Object* = dynamic> extends self::_Bm3&Object&Am3<self::Bm3::Z*> {
+  synthetic constructor •() → self::Bm3<self::Bm3::Z*>*
+    : super self::_Bm3&Object&Am3::•()
+    ;
+}
+abstract class _Cm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<(core::int*) →* dynamic, self::_Cm3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Cm3<Z extends core::Object* = dynamic> extends self::_Cm3&Object&Am3<self::Cm3::Z*> {
+  synthetic constructor •() → self::Cm3<self::Cm3::Z*>*
+    : super self::_Cm3&Object&Am3::•()
+    ;
+}
+abstract class _Dm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<() →* core::int*, self::_Dm3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Dm3<Z extends core::Object* = dynamic> extends self::_Dm3&Object&Am3<self::Dm3::Z*> {
+  synthetic constructor •() → self::Dm3<self::Dm3::Z*>*
+    : super self::_Dm3&Object&Am3::•()
+    ;
+}
+abstract class _Em3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<() →* dynamic, self::_Em3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Em3<Z extends core::Object* = dynamic> extends self::_Em3&Object&Am3<self::Em3::Z*> {
+  synthetic constructor •() → self::Em3<self::Em3::Z*>*
+    : super self::_Em3&Object&Am3::•()
+    ;
+}
+abstract class _Fm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<() →* dynamic, self::_Fm3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fm3<Z extends core::Object* = dynamic> extends self::_Fm3&Object&Am3<self::Fm3::Z*> {
+  synthetic constructor •() → self::Fm3<self::Fm3::Z*>*
+    : super self::_Fm3&Object&Am3::•()
+    ;
+}
+abstract class _Gm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<({x: core::int*}) →* dynamic, self::_Gm3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Gm3<Z extends core::Object* = dynamic> extends self::_Gm3&Object&Am3<self::Gm3::Z*> {
+  synthetic constructor •() → self::Gm3<self::Gm3::Z*>*
+    : super self::_Gm3&Object&Am3::•()
+    ;
+}
+abstract class _Hm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<([core::int*]) →* dynamic, self::_Hm3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Hm3<Z extends core::Object* = dynamic> extends self::_Hm3&Object&Am3<self::Hm3::Z*> {
+  synthetic constructor •() → self::Hm3<self::Hm3::Z*>*
+    : super self::_Hm3&Object&Am3::•()
+    ;
+}
+abstract class _Im3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<([core::int*]) →* dynamic, self::_Im3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Im3<Z extends core::Object* = dynamic> extends self::_Im3&Object&Am3<self::Im3::Z*> {
+  synthetic constructor •() → self::Im3<self::Im3::Z*>*
+    : super self::_Im3&Object&Am3::•()
+    ;
+}
+abstract class _Jm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<(core::Function*) →* dynamic, self::_Jm3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jm3<Z extends core::Object* = dynamic> extends self::_Jm3&Object&Am3<self::Jm3::Z*> {
+  synthetic constructor •() → self::Jm3<self::Jm3::Z*>*
+    : super self::_Jm3&Object&Am3::•()
+    ;
+}
+abstract class _Km3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<() →* (() →* core::Function*) →* dynamic, self::_Km3&Object&Am3::Z*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Km3<Z extends core::Object* = dynamic> extends self::_Km3&Object&Am3<self::Km3::Z*> {
+  synthetic constructor •() → self::Km3<self::Km3::Z*>*
+    : super self::_Km3&Object&Am3::•()
+    ;
+}
+class Af1<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Af1<self::Af1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bf1<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Cf1<X extends () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int*>() → self::Cf1<self::Cf1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Df1<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Df1<self::Df1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Ef1<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Ff1<X extends ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Gf1<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Hf1<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class If1<X extends core::Function*> extends core::Object {
+  static factory foo<X extends core::Function*>() → self::If1<self::If1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jf1<X extends (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bf2<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Cf2<X extends (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Df2<X extends () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int*>() → self::Df2<self::Df2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Ef2<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Ff2<X extends () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Gf2<X extends ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Hf2<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class If2<X extends ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic>() → self::If2<self::If2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Jf2<X extends (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/closure.dart.weak.modular.expect b/pkg/front_end/testcases/general/closure.dart.weak.modular.expect
new file mode 100644
index 0000000..2d530e8
--- /dev/null
+++ b/pkg/front_end/testcases/general/closure.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field self::Bar* _field = new self::Bar::•();
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method useCallback(dynamic callback) → dynamic {
+  dynamic _ = callback{dynamic}.call();
+}
+static method main() → dynamic {
+  dynamic x;
+  function inner() → self::Foo* {
+    x = new self::Foo::•();
+    return new self::Foo::•();
+  }
+  self::useCallback(inner);
+  self::Bar* _ = inner(){() →* self::Foo*}.{self::Foo::_field}{self::Bar*};
+}
diff --git a/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.weak.modular.expect b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.weak.modular.expect
new file mode 100644
index 0000000..58cf612
--- /dev/null
+++ b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
+// class B {}
+// ^^^^^
+//
+// pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
+// A()
+// ^
+// pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart:16:7: Context: Previous declaration of 'A'.
+// class A {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.modular.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.modular.expect
new file mode 100644
index 0000000..79836e1
--- /dev/null
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.weak.modular.expect
@@ -0,0 +1,210 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class G<T extends self::A*> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GB extends self::G<self::B*> {
+  synthetic constructor •() → self::GB*
+    : super self::G::•()
+    ;
+}
+class GC extends self::G<self::C*> {
+  synthetic constructor •() → self::GC*
+    : super self::G::•()
+    ;
+}
+class GD extends self::G<self::D*> {
+  synthetic constructor •() → self::GD*
+    : super self::G::•()
+    ;
+}
+class X extends core::Object implements self::A {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Y extends self::X {
+  synthetic constructor •() → self::Y*
+    : super self::X::•()
+    ;
+}
+class Z extends core::Object implements self::Y {
+  synthetic constructor •() → self::Z*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class W extends core::Object implements self::Z {
+  synthetic constructor •() → self::W*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GX extends core::Object implements self::G<self::A*> {
+  synthetic constructor •() → self::GX*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GY extends self::X implements self::GB {
+  synthetic constructor •() → self::GY*
+    : super self::X::•()
+    ;
+}
+class GZ extends core::Object implements self::Y, self::GC {
+  synthetic constructor •() → self::GZ*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GW extends core::Object implements self::Z, self::GD {
+  synthetic constructor •() → self::GW*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GU extends self::GW {
+  synthetic constructor •() → self::GU*
+    : super self::GW::•()
+    ;
+}
+class GV extends self::GU implements self::GW {
+  synthetic constructor •() → self::GV*
+    : super self::GU::•()
+    ;
+}
+class ARO<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::ARO<self::ARO::S*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ARQ<T extends core::Object* = dynamic> extends core::Object implements self::ARO<self::ARQ::T*> {
+  synthetic constructor •() → self::ARQ<self::ARQ::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ARN extends self::ARQ<self::A*> {
+  synthetic constructor •() → self::ARN*
+    : super self::ARQ::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.weak.modular.expect b/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.weak.modular.expect
new file mode 100644
index 0000000..19b1b00
--- /dev/null
+++ b/pkg/front_end/testcases/general/compound_binary_implicit_as.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::B* b) → self::A*
+    return new self::C::•();
+}
+class C extends self::A {
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  core::Map<core::int*, self::B*>* map = <core::int*, self::B*>{0: new self::B::•()};
+  try {
+    let final core::Map<core::int*, self::B*>* #t1 = map in let final core::int* #t2 = 0 in #t1.{core::Map::[]=}(#t2, #t1.{core::Map::[]}(#t2){(core::Object*) →* self::B*}.{self::B::+}(new self::B::•()){(self::B*) →* self::A*} as{TypeError} self::B*){(core::int*, self::B*) →* void};
+    throw "Expected type error";
+  }
+  on dynamic catch(final dynamic _) {
+  }
+}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart b/pkg/front_end/testcases/general/conditional_import.dart
new file mode 100644
index 0000000..067c784
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+// All three libraries have an HttpRequest class.
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {
+  request.certificate; // ok (from dart:io)
+  request.response; // ok (from dart:io and dart:html)
+  request.readyState; // error (from dart:html)
+  request.hashCode; // ok
+}
+
+testB(b.HttpRequest request) {
+  request.certificate; // error
+  request.response; // error
+  request.readyState; // error
+  request.hashCode; // ok
+}
+
+void main() {
+  expect(true, const bool.fromEnvironment("dart.library.io"));
+  expect(false, const bool.fromEnvironment("dart.library.html"));
+  expect(false, const bool.fromEnvironment("dart.library.foo"));
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.textual_outline.expect b/pkg/front_end/testcases/general/conditional_import.dart.textual_outline.expect
new file mode 100644
index 0000000..dc10727
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+
+class HttpRequest {}
+
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/conditional_import.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..6e90f3d
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.textual_outline_modelled.expect
@@ -0,0 +1,11 @@
+import "conditional_import.dart" if (dart.library.foo) "dart:foo" as b;
+import "conditional_import.dart"
+    if (dart.library.io) "dart:io"
+    if (dart.library.html) "dart:html" as a;
+
+class HttpRequest {}
+
+expect(expected, actual) {}
+testA(a.HttpRequest request) {}
+testB(b.HttpRequest request) {}
+void main() {}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.weak.expect b/pkg/front_end/testcases/general/conditional_import.dart.weak.expect
new file mode 100644
index 0000000..0ae3432
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.weak.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.weak.modular.expect b/pkg/front_end/testcases/general/conditional_import.dart.weak.modular.expect
new file mode 100644
index 0000000..0ae3432
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.weak.outline.expect b/pkg/front_end/testcases/general/conditional_import.dart.weak.outline.expect
new file mode 100644
index 0000000..17e396c
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.weak.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    ;
+}
+static method testA(_ht::HttpRequest request) → dynamic
+  ;
+static method testB(self::HttpRequest request) → dynamic
+  ;
+static method main() → void
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/conditional_import.dart.weak.transformed.expect b/pkg/front_end/testcases/general/conditional_import.dart.weak.transformed.expect
new file mode 100644
index 0000000..0ae3432
--- /dev/null
+++ b/pkg/front_end/testcases/general/conditional_import.dart.weak.transformed.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'dart:_http'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error (from dart:html)
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+//   request.certificate; // error
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+//   request.response; // error
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+//  - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+//   request.readyState; // error
+//           ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+import "dart:io" as io;
+
+import "dart:io" as a;
+import "org-dartlang-testcase:///conditional_import.dart" as b;
+
+class HttpRequest extends core::Object {
+  synthetic constructor •() → self::HttpRequest
+    : super core::Object::•()
+    ;
+}
+static method testA(_ht::HttpRequest request) → dynamic {
+  request.{_ht::HttpRequest::certificate}{io::X509Certificate?};
+  request.{_ht::HttpRequest::response}{_ht::HttpResponse};
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:18:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'dart:_http'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error (from dart:html)
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method testB(self::HttpRequest request) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:23:11: Error: The getter 'certificate' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'certificate'.
+  request.certificate; // error
+          ^^^^^^^^^^^" in request{<unresolved>}.certificate;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:24:11: Error: The getter 'response' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'response'.
+  request.response; // error
+          ^^^^^^^^" in request{<unresolved>}.response;
+  invalid-expression "pkg/front_end/testcases/general/conditional_import.dart:25:11: Error: The getter 'readyState' isn't defined for the class 'HttpRequest'.
+ - 'HttpRequest' is from 'pkg/front_end/testcases/general/conditional_import.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'readyState'.
+  request.readyState; // error
+          ^^^^^^^^^^" in request{<unresolved>}.readyState;
+  request.{core::Object::hashCode}{core::int};
+}
+static method main() → void {
+  self::expect(true, #C1);
+  self::expect(false, #C1);
+  self::expect(false, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/general/const_redirect_to_nonconst.dart.weak.modular.expect b/pkg/front_end/testcases/general/const_redirect_to_nonconst.dart.weak.modular.expect
new file mode 100644
index 0000000..38baae2
--- /dev/null
+++ b/pkg/front_end/testcases/general/const_redirect_to_nonconst.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/const_redirect_to_nonconst.dart:12:21: Error: A constant constructor can't call a non-constant super constructor.
+//   const B() : super.bad();
+//                     ^^^
+//
+// pkg/front_end/testcases/general/const_redirect_to_nonconst.dart:6:20: Error: A constant constructor can't call a non-constant constructor.
+//   const A() : this.bad();
+//                    ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : this self::A::bad()
+    ;
+  constructor bad() → self::A
+    : super core::Object::•() {}
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super self::A::bad()
+    ;
+}
+static method test() → dynamic {
+  core::print(invalid-expression "A constant constructor can't call a non-constant constructor.");
+  core::print(invalid-expression "A constant constructor can't call a non-constant super constructor.");
+}
+static method main() → dynamic {
+  core::print(new self::A::•());
+  core::print(new self::B::•());
+}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_redirect_to_nonconst.dart:
+- A. (from org-dartlang-testcase:///const_redirect_to_nonconst.dart:6:9)
+- B. (from org-dartlang-testcase:///const_redirect_to_nonconst.dart:12:9)
diff --git a/pkg/front_end/testcases/general/constant_truncate.dart.weak.modular.expect b/pkg/front_end/testcases/general/constant_truncate.dart.weak.modular.expect
new file mode 100644
index 0000000..f87f7ba
--- /dev/null
+++ b/pkg/front_end/testcases/general/constant_truncate.dart.weak.modular.expect
@@ -0,0 +1,415 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:5:14: Error: Constant evaluation error:
+// const a0 = 0 ~/ 0; // error
+//              ^
+// pkg/front_end/testcases/general/constant_truncate.dart:5:14: Context: Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.
+// const a0 = 0 ~/ 0; // error
+//              ^
+// pkg/front_end/testcases/general/constant_truncate.dart:5:7: Context: While analyzing:
+// const a0 = 0 ~/ 0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:6:16: Error: Constant evaluation error:
+// const a1 = 0.0 ~/ 0; // error
+//                ^
+// pkg/front_end/testcases/general/constant_truncate.dart:6:16: Context: Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.
+// const a1 = 0.0 ~/ 0; // error
+//                ^
+// pkg/front_end/testcases/general/constant_truncate.dart:6:7: Context: While analyzing:
+// const a1 = 0.0 ~/ 0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:7:17: Error: Constant evaluation error:
+// const a2 = -0.0 ~/ 0; // error
+//                 ^
+// pkg/front_end/testcases/general/constant_truncate.dart:7:17: Context: Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.
+// const a2 = -0.0 ~/ 0; // error
+//                 ^
+// pkg/front_end/testcases/general/constant_truncate.dart:7:7: Context: While analyzing:
+// const a2 = -0.0 ~/ 0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:8:23: Error: Constant evaluation error:
+// const a3 = double.nan ~/ 0; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:8:23: Context: Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.
+// const a3 = double.nan ~/ 0; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:8:7: Context: While analyzing:
+// const a3 = double.nan ~/ 0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:9:28: Error: Constant evaluation error:
+// const a4 = double.infinity ~/ 0; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:9:28: Context: Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.
+// const a4 = double.infinity ~/ 0; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:9:7: Context: While analyzing:
+// const a4 = double.infinity ~/ 0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:10:36: Error: Constant evaluation error:
+// const a5 = double.negativeInfinity ~/ 0; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:10:36: Context: Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.
+// const a5 = double.negativeInfinity ~/ 0; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:10:7: Context: While analyzing:
+// const a5 = double.negativeInfinity ~/ 0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:12:14: Error: Constant evaluation error:
+// const b0 = 0 ~/ 0.0; // error
+//              ^
+// pkg/front_end/testcases/general/constant_truncate.dart:12:14: Context: Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.
+// const b0 = 0 ~/ 0.0; // error
+//              ^
+// pkg/front_end/testcases/general/constant_truncate.dart:12:7: Context: While analyzing:
+// const b0 = 0 ~/ 0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:13:16: Error: Constant evaluation error:
+// const b1 = 0.0 ~/ 0.0; // error
+//                ^
+// pkg/front_end/testcases/general/constant_truncate.dart:13:16: Context: Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.
+// const b1 = 0.0 ~/ 0.0; // error
+//                ^
+// pkg/front_end/testcases/general/constant_truncate.dart:13:7: Context: While analyzing:
+// const b1 = 0.0 ~/ 0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:14:17: Error: Constant evaluation error:
+// const b2 = -0.0 ~/ 0.0; // error
+//                 ^
+// pkg/front_end/testcases/general/constant_truncate.dart:14:17: Context: Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.
+// const b2 = -0.0 ~/ 0.0; // error
+//                 ^
+// pkg/front_end/testcases/general/constant_truncate.dart:14:7: Context: While analyzing:
+// const b2 = -0.0 ~/ 0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:15:23: Error: Constant evaluation error:
+// const b3 = double.nan ~/ 0.0; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:15:23: Context: Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.
+// const b3 = double.nan ~/ 0.0; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:15:7: Context: While analyzing:
+// const b3 = double.nan ~/ 0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:16:28: Error: Constant evaluation error:
+// const b4 = double.infinity ~/ 0.0; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:16:28: Context: Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.
+// const b4 = double.infinity ~/ 0.0; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:16:7: Context: While analyzing:
+// const b4 = double.infinity ~/ 0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:17:36: Error: Constant evaluation error:
+// const b5 = double.negativeInfinity ~/ 0.0; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:17:36: Context: Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.
+// const b5 = double.negativeInfinity ~/ 0.0; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:17:7: Context: While analyzing:
+// const b5 = double.negativeInfinity ~/ 0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:19:14: Error: Constant evaluation error:
+// const c0 = 0 ~/ -0.0; // error
+//              ^
+// pkg/front_end/testcases/general/constant_truncate.dart:19:14: Context: Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.
+// const c0 = 0 ~/ -0.0; // error
+//              ^
+// pkg/front_end/testcases/general/constant_truncate.dart:19:7: Context: While analyzing:
+// const c0 = 0 ~/ -0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:20:16: Error: Constant evaluation error:
+// const c1 = 0.0 ~/ -0.0; // error
+//                ^
+// pkg/front_end/testcases/general/constant_truncate.dart:20:16: Context: Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.
+// const c1 = 0.0 ~/ -0.0; // error
+//                ^
+// pkg/front_end/testcases/general/constant_truncate.dart:20:7: Context: While analyzing:
+// const c1 = 0.0 ~/ -0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:21:17: Error: Constant evaluation error:
+// const c2 = -0.0 ~/ -0.0; // error
+//                 ^
+// pkg/front_end/testcases/general/constant_truncate.dart:21:17: Context: Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.
+// const c2 = -0.0 ~/ -0.0; // error
+//                 ^
+// pkg/front_end/testcases/general/constant_truncate.dart:21:7: Context: While analyzing:
+// const c2 = -0.0 ~/ -0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:22:23: Error: Constant evaluation error:
+// const c3 = double.nan ~/ -0.0; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:22:23: Context: Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.
+// const c3 = double.nan ~/ -0.0; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:22:7: Context: While analyzing:
+// const c3 = double.nan ~/ -0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:23:28: Error: Constant evaluation error:
+// const c4 = double.infinity ~/ -0.0; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:23:28: Context: Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.
+// const c4 = double.infinity ~/ -0.0; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:23:7: Context: While analyzing:
+// const c4 = double.infinity ~/ -0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:24:36: Error: Constant evaluation error:
+// const c5 = double.negativeInfinity ~/ -0.0; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:24:36: Context: Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.
+// const c5 = double.negativeInfinity ~/ -0.0; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:24:7: Context: While analyzing:
+// const c5 = double.negativeInfinity ~/ -0.0; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:26:14: Error: Constant evaluation error:
+// const d0 = 0 ~/ double.nan; // error
+//              ^
+// pkg/front_end/testcases/general/constant_truncate.dart:26:14: Context: Binary operator '0 ~/ NaN' results is Infinity or NaN.
+// const d0 = 0 ~/ double.nan; // error
+//              ^
+// pkg/front_end/testcases/general/constant_truncate.dart:26:7: Context: While analyzing:
+// const d0 = 0 ~/ double.nan; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:27:16: Error: Constant evaluation error:
+// const d1 = 0.0 ~/ double.nan; // error
+//                ^
+// pkg/front_end/testcases/general/constant_truncate.dart:27:16: Context: Binary operator '0.0 ~/ NaN' results is Infinity or NaN.
+// const d1 = 0.0 ~/ double.nan; // error
+//                ^
+// pkg/front_end/testcases/general/constant_truncate.dart:27:7: Context: While analyzing:
+// const d1 = 0.0 ~/ double.nan; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:28:17: Error: Constant evaluation error:
+// const d2 = -0.0 ~/ double.nan; // error
+//                 ^
+// pkg/front_end/testcases/general/constant_truncate.dart:28:17: Context: Binary operator '-0.0 ~/ NaN' results is Infinity or NaN.
+// const d2 = -0.0 ~/ double.nan; // error
+//                 ^
+// pkg/front_end/testcases/general/constant_truncate.dart:28:7: Context: While analyzing:
+// const d2 = -0.0 ~/ double.nan; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:29:23: Error: Constant evaluation error:
+// const d3 = double.nan ~/ double.nan; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:29:23: Context: Binary operator 'NaN ~/ NaN' results is Infinity or NaN.
+// const d3 = double.nan ~/ double.nan; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:29:7: Context: While analyzing:
+// const d3 = double.nan ~/ double.nan; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:30:28: Error: Constant evaluation error:
+// const d4 = double.infinity ~/ double.nan; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:30:28: Context: Binary operator 'Infinity ~/ NaN' results is Infinity or NaN.
+// const d4 = double.infinity ~/ double.nan; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:30:7: Context: While analyzing:
+// const d4 = double.infinity ~/ double.nan; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:31:36: Error: Constant evaluation error:
+// const d5 = double.negativeInfinity ~/ double.nan; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:31:36: Context: Binary operator '-Infinity ~/ NaN' results is Infinity or NaN.
+// const d5 = double.negativeInfinity ~/ double.nan; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:31:7: Context: While analyzing:
+// const d5 = double.negativeInfinity ~/ double.nan; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:36:23: Error: Constant evaluation error:
+// const e3 = double.nan ~/ double.infinity; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:36:23: Context: Binary operator 'NaN ~/ Infinity' results is Infinity or NaN.
+// const e3 = double.nan ~/ double.infinity; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:36:7: Context: While analyzing:
+// const e3 = double.nan ~/ double.infinity; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:37:28: Error: Constant evaluation error:
+// const e4 = double.infinity ~/ double.infinity; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:37:28: Context: Binary operator 'Infinity ~/ Infinity' results is Infinity or NaN.
+// const e4 = double.infinity ~/ double.infinity; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:37:7: Context: While analyzing:
+// const e4 = double.infinity ~/ double.infinity; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:38:36: Error: Constant evaluation error:
+// const e5 = double.negativeInfinity ~/ double.infinity; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:38:36: Context: Binary operator '-Infinity ~/ Infinity' results is Infinity or NaN.
+// const e5 = double.negativeInfinity ~/ double.infinity; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:38:7: Context: While analyzing:
+// const e5 = double.negativeInfinity ~/ double.infinity; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:43:23: Error: Constant evaluation error:
+// const f3 = double.nan ~/ double.negativeInfinity; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:43:23: Context: Binary operator 'NaN ~/ -Infinity' results is Infinity or NaN.
+// const f3 = double.nan ~/ double.negativeInfinity; // error
+//                       ^
+// pkg/front_end/testcases/general/constant_truncate.dart:43:7: Context: While analyzing:
+// const f3 = double.nan ~/ double.negativeInfinity; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:44:28: Error: Constant evaluation error:
+// const f4 = double.infinity ~/ double.negativeInfinity; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:44:28: Context: Binary operator 'Infinity ~/ -Infinity' results is Infinity or NaN.
+// const f4 = double.infinity ~/ double.negativeInfinity; // error
+//                            ^
+// pkg/front_end/testcases/general/constant_truncate.dart:44:7: Context: While analyzing:
+// const f4 = double.infinity ~/ double.negativeInfinity; // error
+//       ^
+//
+// pkg/front_end/testcases/general/constant_truncate.dart:45:36: Error: Constant evaluation error:
+// const f5 = double.negativeInfinity ~/ double.negativeInfinity; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:45:36: Context: Binary operator '-Infinity ~/ -Infinity' results is Infinity or NaN.
+// const f5 = double.negativeInfinity ~/ double.negativeInfinity; // error
+//                                    ^
+// pkg/front_end/testcases/general/constant_truncate.dart:45:7: Context: While analyzing:
+// const f5 = double.negativeInfinity ~/ double.negativeInfinity; // error
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* a0 = invalid-expression "Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* a1 = invalid-expression "Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* a2 = invalid-expression "Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* a3 = invalid-expression "Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* a4 = invalid-expression "Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* a5 = invalid-expression "Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* b0 = invalid-expression "Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* b1 = invalid-expression "Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* b2 = invalid-expression "Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* b3 = invalid-expression "Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* b4 = invalid-expression "Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* b5 = invalid-expression "Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* c0 = invalid-expression "Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* c1 = invalid-expression "Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* c2 = invalid-expression "Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* c3 = invalid-expression "Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* c4 = invalid-expression "Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* c5 = invalid-expression "Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* d0 = invalid-expression "Binary operator '0 ~/ NaN' results is Infinity or NaN.";
+static const field core::int* d1 = invalid-expression "Binary operator '0.0 ~/ NaN' results is Infinity or NaN.";
+static const field core::int* d2 = invalid-expression "Binary operator '-0.0 ~/ NaN' results is Infinity or NaN.";
+static const field core::int* d3 = invalid-expression "Binary operator 'NaN ~/ NaN' results is Infinity or NaN.";
+static const field core::int* d4 = invalid-expression "Binary operator 'Infinity ~/ NaN' results is Infinity or NaN.";
+static const field core::int* d5 = invalid-expression "Binary operator '-Infinity ~/ NaN' results is Infinity or NaN.";
+static const field core::int* e0 = #C1;
+static const field core::int* e1 = #C1;
+static const field core::int* e2 = #C1;
+static const field core::int* e3 = invalid-expression "Binary operator 'NaN ~/ Infinity' results is Infinity or NaN.";
+static const field core::int* e4 = invalid-expression "Binary operator 'Infinity ~/ Infinity' results is Infinity or NaN.";
+static const field core::int* e5 = invalid-expression "Binary operator '-Infinity ~/ Infinity' results is Infinity or NaN.";
+static const field core::int* f0 = #C1;
+static const field core::int* f1 = #C1;
+static const field core::int* f2 = #C1;
+static const field core::int* f3 = invalid-expression "Binary operator 'NaN ~/ -Infinity' results is Infinity or NaN.";
+static const field core::int* f4 = invalid-expression "Binary operator 'Infinity ~/ -Infinity' results is Infinity or NaN.";
+static const field core::int* f5 = invalid-expression "Binary operator '-Infinity ~/ -Infinity' results is Infinity or NaN.";
+static method main() → dynamic {
+  self::test(0, 0, () → core::int* => invalid-expression "Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.");
+  self::test(0.0, 0, () → core::int* => invalid-expression "Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.");
+  self::test(0.0.{core::double::unary-}(){() →* core::double*}, 0, () → core::int* => invalid-expression "Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C2, 0, () → core::int* => invalid-expression "Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C3, 0, () → core::int* => invalid-expression "Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C4, 0, () → core::int* => invalid-expression "Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.");
+  self::test(0, 0.0, () → core::int* => invalid-expression "Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.");
+  self::test(0.0, 0.0, () → core::int* => invalid-expression "Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.");
+  self::test(0.0.{core::double::unary-}(){() →* core::double*}, 0.0, () → core::int* => invalid-expression "Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C2, 0.0, () → core::int* => invalid-expression "Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C3, 0.0, () → core::int* => invalid-expression "Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C4, 0.0, () → core::int* => invalid-expression "Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.");
+  self::test(0, 0.0.{core::double::unary-}(){() →* core::double*}, () → core::int* => invalid-expression "Binary operator '~/' on '0' requires non-zero divisor, but divisor was '0'.");
+  self::test(0.0, 0.0.{core::double::unary-}(){() →* core::double*}, () → core::int* => invalid-expression "Binary operator '~/' on '0.0' requires non-zero divisor, but divisor was '0'.");
+  self::test(0.0.{core::double::unary-}(){() →* core::double*}, 0.0.{core::double::unary-}(){() →* core::double*}, () → core::int* => invalid-expression "Binary operator '~/' on '-0.0' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C2, 0.0.{core::double::unary-}(){() →* core::double*}, () → core::int* => invalid-expression "Binary operator '~/' on 'NaN' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C3, 0.0.{core::double::unary-}(){() →* core::double*}, () → core::int* => invalid-expression "Binary operator '~/' on 'Infinity' requires non-zero divisor, but divisor was '0'.");
+  self::test(#C4, 0.0.{core::double::unary-}(){() →* core::double*}, () → core::int* => invalid-expression "Binary operator '~/' on '-Infinity' requires non-zero divisor, but divisor was '0'.");
+  self::test(0, #C2, () → core::int* => invalid-expression "Binary operator '0 ~/ NaN' results is Infinity or NaN.");
+  self::test(0.0, #C2, () → core::int* => invalid-expression "Binary operator '0.0 ~/ NaN' results is Infinity or NaN.");
+  self::test(0.0.{core::double::unary-}(){() →* core::double*}, #C2, () → core::int* => invalid-expression "Binary operator '-0.0 ~/ NaN' results is Infinity or NaN.");
+  self::test(#C2, #C2, () → core::int* => invalid-expression "Binary operator 'NaN ~/ NaN' results is Infinity or NaN.");
+  self::test(#C3, #C2, () → core::int* => invalid-expression "Binary operator 'Infinity ~/ NaN' results is Infinity or NaN.");
+  self::test(#C4, #C2, () → core::int* => invalid-expression "Binary operator '-Infinity ~/ NaN' results is Infinity or NaN.");
+  self::test(0, #C3, () → core::int* => #C1);
+  self::test(0.0, #C3, () → core::int* => #C1);
+  self::test(0.0.{core::double::unary-}(){() →* core::double*}, #C3, () → core::int* => #C1);
+  self::test(#C2, #C3, () → core::int* => invalid-expression "Binary operator 'NaN ~/ Infinity' results is Infinity or NaN.");
+  self::test(#C3, #C3, () → core::int* => invalid-expression "Binary operator 'Infinity ~/ Infinity' results is Infinity or NaN.");
+  self::test(#C4, #C3, () → core::int* => invalid-expression "Binary operator '-Infinity ~/ Infinity' results is Infinity or NaN.");
+  self::test(0, #C4, () → core::int* => #C1);
+  self::test(0.0, #C4, () → core::int* => #C1);
+  self::test(0.0.{core::double::unary-}(){() →* core::double*}, #C4, () → core::int* => #C1);
+  self::test(#C2, #C4, () → core::int* => invalid-expression "Binary operator 'NaN ~/ -Infinity' results is Infinity or NaN.");
+  self::test(#C3, #C4, () → core::int* => invalid-expression "Binary operator 'Infinity ~/ -Infinity' results is Infinity or NaN.");
+  self::test(#C4, #C4, () → core::int* => invalid-expression "Binary operator '-Infinity ~/ -Infinity' results is Infinity or NaN.");
+}
+static method test(core::num* a, core::num* b, () →* core::num* f) → void {
+  core::num* result;
+  try {
+    result = a.{core::num::~/}(b){(core::num*) →* core::int*};
+    core::print("${a} ~/ ${b} = ${result}");
+  }
+  on dynamic catch(final dynamic e) {
+    core::print("${a} ~/ ${b} throws ${e}");
+    self::throws(f);
+    return;
+  }
+  self::expect(f(){() →* core::num*}, result);
+}
+static method expect(dynamic expected, dynamic actual) → void {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
+static method throws(() →* core::num* f) → void {
+  try {
+    f(){() →* core::num*};
+  }
+  on dynamic catch(final dynamic e) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+constants  {
+  #C1 = 0
+  #C2 = NaN
+  #C3 = Infinity
+  #C4 = -Infinity
+}
diff --git a/pkg/front_end/testcases/general/constants/circularity.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/circularity.dart.weak.modular.expect
new file mode 100644
index 0000000..d9ec24f
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/circularity.dart.weak.modular.expect
@@ -0,0 +1,143 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/circularity.dart:37:34: Error: Constant evaluation error:
+//   const Class4({Class4 c = const Class4()});
+//                                  ^
+// pkg/front_end/testcases/general/constants/circularity.dart:37:34: Context: Constant expression depends on itself.
+//   const Class4({Class4 c = const Class4()});
+//                                  ^
+// pkg/front_end/testcases/general/constants/circularity.dart:37:24: Context: While analyzing:
+//   const Class4({Class4 c = const Class4()});
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/circularity.dart:5:15: Error: Constant evaluation error:
+// const int a = b;
+//               ^
+// pkg/front_end/testcases/general/constants/circularity.dart:5:15: Context: Constant expression depends on itself.
+// const int a = b;
+//               ^
+// pkg/front_end/testcases/general/constants/circularity.dart:5:11: Context: While analyzing:
+// const int a = b;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/circularity.dart:7:15: Error: Constant evaluation error:
+// const int c = d;
+//               ^
+// pkg/front_end/testcases/general/constants/circularity.dart:8:17: Context: Constant expression depends on itself.
+// const int d = e + 1;
+//                 ^
+// pkg/front_end/testcases/general/constants/circularity.dart:7:11: Context: While analyzing:
+// const int c = d;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/circularity.dart:8:17: Error: Constant evaluation error:
+// const int d = e + 1;
+//                 ^
+// pkg/front_end/testcases/general/constants/circularity.dart:8:17: Context: Constant expression depends on itself.
+// const int d = e + 1;
+//                 ^
+// pkg/front_end/testcases/general/constants/circularity.dart:8:11: Context: While analyzing:
+// const int d = e + 1;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object /*hasConstConstructor*/  {
+  const constructor •({self::Class1* c = #C1}) → self::Class1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object /*hasConstConstructor*/  {
+  final field self::Class2* field;
+  const constructor •(core::int* value) → self::Class2*
+    : self::Class2::field = value =={core::num::==}{(core::Object*) →* core::bool*} 0 ?{self::Class2*} null : #C3, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class3 extends core::Object /*hasConstConstructor*/  {
+  const constructor •([self::Class3* c = #C4]) → self::Class3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class4 extends core::Object /*hasConstConstructor*/  {
+  const constructor •({self::Class4* c = invalid-expression "Constant expression depends on itself."}) → self::Class4*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* a = invalid-expression "Constant expression depends on itself.";
+static const field core::int* b = invalid-expression "Constant expression depends on itself.";
+static const field core::int* c = invalid-expression "Constant expression depends on itself.";
+static const field core::int* d = invalid-expression "Constant expression depends on itself.";
+static const field core::int* e = invalid-expression "Constant expression depends on itself.";
+static const field self::Class1* c1_0 = #C1;
+static const field self::Class1* c1_1 = #C1;
+static const field self::Class1* c1_2 = #C1;
+static const field self::Class2* c2_0 = #C5;
+static const field self::Class2* c2_1 = #C3;
+static const field self::Class2* c2_2 = #C5;
+static const field self::Class3* c3_0 = #C4;
+static const field self::Class3* c3_1 = #C4;
+static const field self::Class3* c3_2 = #C4;
+static const field self::Class4* c4_0 = invalid-expression "Constant expression depends on itself.";
+static const field self::Class4* c4_1 = #C6;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Class1 {}
+  #C2 = null
+  #C3 = self::Class2 {field:#C2}
+  #C4 = self::Class3 {}
+  #C5 = self::Class2 {field:#C3}
+  #C6 = self::Class4 {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///circularity.dart:
+- Class1. (from org-dartlang-testcase:///circularity.dart:12:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Class2. (from org-dartlang-testcase:///circularity.dart:21:9)
+- Class3. (from org-dartlang-testcase:///circularity.dart:29:9)
+- Class4. (from org-dartlang-testcase:///circularity.dart:37:9)
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.modular.expect
new file mode 100644
index 0000000..be365f6
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.modular.expect
@@ -0,0 +1,220 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   const Foo.withInvalidCondition(this.x) : assert(x);
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:19:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//       : assert(bool.fromEnvironment("foo", defaultValue: null));
+//                     ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:32:24: Error: Constant evaluation error:
+// const Foo foo2 = const Foo(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:8:18: Context: This assertion failed with message: x is not positive
+//       : assert(x > 0, "x is not positive"),
+//                  ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:32:11: Context: While analyzing:
+// const Foo foo2 = const Foo(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:33:24: Error: Constant evaluation error:
+// const Foo foo3 = const Foo.withMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:15:18: Context: This assertion failed with message: btw foo was false
+//       : assert(x < 0, "btw foo was ${const bool.fromEnvironment("foo")}");
+//                  ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:33:11: Context: While analyzing:
+// const Foo foo3 = const Foo.withMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:34:24: Error: Constant evaluation error:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+//   const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+//                                                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:34:11: Context: While analyzing:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:36:24: Error: Constant evaluation error:
+// const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:19:21: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+//       : assert(bool.fromEnvironment("foo", defaultValue: null));
+//                     ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:36:11: Context: While analyzing:
+// const Foo foo6 = const Foo.withNullConditionFromEnv1(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:37:24: Error: Constant evaluation error:
+// const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:21:22: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+//       : assert(const bool.fromEnvironment("foo", defaultValue: null));
+//                      ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:37:11: Context: While analyzing:
+// const Foo foo7 = const Foo.withNullConditionFromEnv2(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:38:24: Error: Constant evaluation error:
+// const Bar bar1 = const Bar.withMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:26:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:38:11: Context: While analyzing:
+// const Bar bar1 = const Bar.withMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:39:24: Error: Constant evaluation error:
+// const Bar bar2 = const Bar.withMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:26:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:39:11: Context: While analyzing:
+// const Bar bar2 = const Bar.withMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:40:24: Error: Constant evaluation error:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:27:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:40:11: Context: While analyzing:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:41:24: Error: Constant evaluation error:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:27:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:41:11: Context: While analyzing:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:42:24: Error: Constant evaluation error:
+// const Bar bar5 = const Bar.withEmptyMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:28:49: Context: This assertion failed.
+//   const Bar.withEmptyMessage(this.x) : assert(x < 0);
+//                                                 ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:42:11: Context: While analyzing:
+// const Bar bar5 = const Bar.withEmptyMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/const_asserts.dart:43:24: Error: Constant evaluation error:
+// const Bar bar6 = const Bar.withEmptyMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:28:49: Context: This assertion failed.
+//   const Bar.withEmptyMessage(this.x) : assert(x < 0);
+//                                                 ^
+// pkg/front_end/testcases/general/constants/const_asserts.dart:43:11: Context: While analyzing:
+// const Bar bar6 = const Bar.withEmptyMessage(0);
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor •(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::>}(0){(core::num*) →* core::bool*}, "x is not positive"), assert(x.{core::num::>}(0){(core::num*) →* core::bool*}), assert(x.{core::num::>}(0){(core::num*) →* core::bool*}, ""), assert(#C1 =={core::Object::==}{(core::Object*) →* core::bool*} false, "foo was ${#C1}"), assert(#C1 =={core::Object::==}{(core::Object*) →* core::bool*} false), super core::Object::•()
+    ;
+  const constructor withMessage(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::<}(0){(core::num*) →* core::bool*}, "btw foo was ${#C1}"), super core::Object::•()
+    ;
+  const constructor withInvalidMessage(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(x.{core::num::<}(0){(core::num*) →* core::bool*}, x), super core::Object::•()
+    ;
+  const constructor withInvalidCondition(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^" in x as{TypeError} core::bool*), super core::Object::•()
+    ;
+  const constructor withNullConditionFromEnv1(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(#C2), super core::Object::•()
+    ;
+  const constructor withNullConditionFromEnv2(core::int* x) → self::Foo*
+    : self::Foo::x = x, assert(#C2), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor withMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0){(core::num*) →* core::bool*}, "x is not negative"), super core::Object::•()
+    ;
+  const constructor withoutMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0){(core::num*) →* core::bool*}), super core::Object::•()
+    ;
+  const constructor withEmptyMessage(core::int* x) → self::Bar*
+    : self::Bar::x = x, assert(x.{core::num::<}(0){(core::num*) →* core::bool*}), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field self::Foo* foo1 = #C4;
+static const field self::Foo* foo2 = invalid-expression "This assertion failed with message: x is not positive";
+static const field self::Foo* foo3 = invalid-expression "This assertion failed with message: btw foo was false";
+static const field self::Foo* foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo* foo5 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^";
+static const field self::Foo* foo6 = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field self::Foo* foo7 = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field self::Bar* bar1 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar* bar2 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar* bar3 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar4 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar5 = invalid-expression "This assertion failed.";
+static const field self::Bar* bar6 = invalid-expression "This assertion failed.";
+static method main() → dynamic {
+  core::print(#C4);
+}
+
+constants  {
+  #C1 = false
+  #C2 = null
+  #C3 = 1
+  #C4 = self::Foo {x:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_asserts.dart:
+- Foo. (from org-dartlang-testcase:///const_asserts.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Foo.withMessage (from org-dartlang-testcase:///const_asserts.dart:14:9)
+- Foo.withInvalidMessage (from org-dartlang-testcase:///const_asserts.dart:16:9)
+- Foo.withInvalidCondition (from org-dartlang-testcase:///const_asserts.dart:17:9)
+- Foo.withNullConditionFromEnv1 (from org-dartlang-testcase:///const_asserts.dart:18:9)
+- Foo.withNullConditionFromEnv2 (from org-dartlang-testcase:///const_asserts.dart:20:9)
+- Bar.withMessage (from org-dartlang-testcase:///const_asserts.dart:26:9)
+- Bar.withoutMessage (from org-dartlang-testcase:///const_asserts.dart:27:9)
+- Bar.withEmptyMessage (from org-dartlang-testcase:///const_asserts.dart:28:9)
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.weak.modular.expect
new file mode 100644
index 0000000..456d5c3
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.weak.modular.expect
@@ -0,0 +1,513 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+// const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:25:51: Error: Unexpected type 'Map<String, String>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+// const List<String> barWithMapSpread = [...foo, ...quux];
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+//                                                  ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:42:38: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Set<String> quxWithMapSpread = {...baz, ...quux};
+//                                      ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:48:59: Error: A value of type 'CustomIterable' can't be assigned to a variable of type 'String'.
+//  - 'CustomIterable' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+// const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+//                                                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:58:60: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+// const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+//                                                            ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:59:47: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+//                                               ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:60:46: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// const Map<String, String> mapWithSetSpread = {...baz};
+//                                              ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:40: Error: Constant evaluation error:
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:52: Context: Null value during constant evaluation.
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                                                    ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:22:20: Context: While analyzing:
+// const List<String> barWithNullSpread = [...foo, ...nullList];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:46: Error: Constant evaluation error:
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                                              ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:58: Context: Expected constant '42' to be of type 'Iterable<dynamic>', but was of type 'int'.
+//  - 'Iterable' is from 'dart:core'.
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                                                          ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:24:20: Context: While analyzing:
+// const List<String> barWithIntDynamicSpread = [...foo, ...fortyTwoAsDynamic];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:26:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread1 = [
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:28:12: Context: Only lists and sets can be used in spreads in constant lists and sets.
+//   ...const CustomIterable()
+//            ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:26:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread1 = [
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:63: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                                                               ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:30:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread2 = [...bar, ...CustomIterable()];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:51: Error: Constant evaluation error:
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:63: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                                                               ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:32:20: Context: While analyzing:
+// const List<String> barWithCustomIterableSpread3 = [...bar, ...customIterable];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:43: Error: Constant evaluation error:
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:43: Context: The method '+' can't be invoked on '<String>["Hello"]' in a constant expression.
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:33:20: Context: While analyzing:
+// const List<String> listConcat = ["Hello"] + ["World"];
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:39: Error: Constant evaluation error:
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                                       ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:51: Context: Null value during constant evaluation.
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:40:19: Context: While analyzing:
+// const Set<String> quxWithNullSpread = {...baz, ...nullSet};
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:43:50: Error: Constant evaluation error:
+// const Set<String> quxWithCustomIterableSpread1 = {
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:45:12: Context: Only lists and sets can be used in spreads in constant lists and sets.
+//   ...const CustomIterable()
+//            ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:43:19: Context: While analyzing:
+// const Set<String> quxWithCustomIterableSpread1 = {
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:50: Error: Constant evaluation error:
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:62: Context: Only lists and sets can be used in spreads in constant lists and sets.
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                                                              ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:47:19: Context: While analyzing:
+// const Set<String> quxWithCustomIterableSpread2 = {...baz, ...CustomIterable()};
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:48: Error: Constant evaluation error:
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                                                ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:55: Context: The element 'WithEquals {i: 42}' does not have a primitive operator '=='.
+//  - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                                                       ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:49:20: Context: While analyzing:
+// const Set<dynamic> setWithNonPrimitiveEquals = {const WithEquals(42)};
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:40: Error: Constant evaluation error:
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:45: Context: The element '42' conflicts with another existing element in the set.
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                                             ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:50:20: Context: While analyzing:
+// const Set<dynamic> setWithDuplicates = {42, 42};
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:27: Error: Constant evaluation error:
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:61: Context: Null value during constant evaluation.
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                                                             ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:57:27: Context: While analyzing:
+// const Map<String, String> quuzWithNullSpread = {...quux, ...nullMap};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:57: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                                                         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:61:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap1 = {...const CustomMap()};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:51: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:62:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap2 = {...CustomMap()};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:27: Error: Constant evaluation error:
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                           ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:51: Context: Only maps can be used in spreads in constant maps.
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                                                   ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:64:27: Context: While analyzing:
+// const Map<String, String> mapWithCustomMap3 = {...customMap};
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:65:56: Error: Constant evaluation error:
+// const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+//                                                        ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:66:9: Context: The key 'WithEquals {i: 42}' does not have a primitive operator '=='.
+//  - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+//   const WithEquals(42): 42
+//         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:65:25: Context: While analyzing:
+// const Map<dynamic, int> mapWithNonPrimitiveEqualsKey = {
+//                         ^
+//
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:41: Error: Constant evaluation error:
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                                         ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:50: Context: The key '42' conflicts with another existing key in the map.
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                                                  ^
+// pkg/front_end/testcases/general/constants/const_collections.dart:68:21: Context: While analyzing:
+// const Map<int, int> mapWithDuplicates = {42: 42, 42: 42};
+//                     ^
+//
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+import "dart:collection";
+
+class ConstIterable extends col::IterableBase<core::int*> /*hasConstConstructor*/  {
+  const constructor •() → self::ConstIterable*
+    : super col::IterableBase::•()
+    ;
+  get iterator() → core::Iterator<core::int*>*
+    return <core::int*>[].{core::Iterable::iterator}{core::Iterator<core::int*>*};
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::ConstIterable::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(covariant-by-class core::Iterable<core::int*>* other) → core::Iterable<core::int*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::int*) →* self::ConstIterable::map::T* toElement) → core::Iterable<self::ConstIterable::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::ConstIterable::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::int*) →* core::Iterable<self::ConstIterable::expand::T*>* toElements) → core::Iterable<self::ConstIterable::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::int*) →* void action) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(covariant-by-class (core::int*, core::int*) →* core::int* combine) → core::int*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::ConstIterable::fold::T* initialValue, (self::ConstIterable::fold::T*, core::int*) →* self::ConstIterable::fold::T* combine) → self::ConstIterable::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::int*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator = #C1]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::int*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable = #C2}) → core::List<core::int*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::int*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::int*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::int*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::int*) →* core::bool* test) → core::Iterable<core::int*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::int*) →* core::bool* test, {covariant-by-class () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::int*) →* core::bool* test, {covariant-by-class () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::int*) →* core::bool* test, {covariant-by-class () →* core::int* orElse = #C3}) → core::int*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::int*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class WithEquals extends core::Object /*hasConstConstructor*/  {
+  final field core::int* i;
+  const constructor •(core::int* i) → self::WithEquals*
+    : self::WithEquals::i = i, super core::Object::•()
+    ;
+  operator ==(core::Object* o) → core::bool* {
+    return o is self::WithEquals* && (o{self::WithEquals*} as self::WithEquals*).{self::WithEquals::i}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} this.{self::WithEquals::i}{core::int*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CustomIterable extends col::IterableBase<core::String*> /*hasConstConstructor*/  {
+  const constructor •() → self::CustomIterable*
+    : super col::IterableBase::•()
+    ;
+  get iterator() → core::Iterator<core::String*>*
+    return <core::String*>[].{core::Iterable::iterator}{core::Iterator<core::String*>*};
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::CustomIterable::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(covariant-by-class core::Iterable<core::String*>* other) → core::Iterable<core::String*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::String*) →* self::CustomIterable::map::T* toElement) → core::Iterable<self::CustomIterable::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::CustomIterable::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::String*) →* core::Iterable<self::CustomIterable::expand::T*>* toElements) → core::Iterable<self::CustomIterable::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::String*) →* void action) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(covariant-by-class (core::String*, core::String*) →* core::String* combine) → core::String*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::CustomIterable::fold::T* initialValue, (self::CustomIterable::fold::T*, core::String*) →* self::CustomIterable::fold::T* combine) → self::CustomIterable::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::String*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator = #C1]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::String*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable = #C2}) → core::List<core::String*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::String*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::String*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::String*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::String*) →* core::bool* test) → core::Iterable<core::String*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::String*) →* core::bool* test, {covariant-by-class () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::String*) →* core::bool* test, {covariant-by-class () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::String*) →* core::bool* test, {covariant-by-class () →* core::String* orElse = #C3}) → core::String*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::String*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CustomMap extends core::Object implements core::Map<core::String*, core::String*> /*hasConstConstructor*/  {
+  const constructor •() → self::CustomMap*
+    : super core::Object::•()
+    ;
+  @#C4
+  get entries() → core::Iterable<core::MapEntry<core::String*, core::String*>*>*
+    return <core::MapEntry<core::String*, core::String*>*>[];
+  @#C4
+  operator [](core::Object* key) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  operator []=(covariant-by-class core::String* key, covariant-by-class core::String* value) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method cast<RK extends core::Object* = dynamic, RV extends core::Object* = dynamic>() → core::Map<self::CustomMap::cast::RK*, self::CustomMap::cast::RV*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method clear() → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method containsKey(core::Object* key) → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method containsValue(core::Object* value) → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get isEmpty() → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get isNotEmpty() → core::bool*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get keys() → core::Iterable<core::String*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get length() → core::int*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method remove(core::Object* key) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  get values() → core::Iterable<core::String*>*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method addAll(covariant-by-class core::Map<core::String*, core::String*>* other) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method addEntries(covariant-by-class core::Iterable<core::MapEntry<core::String*, core::String*>*>* newEntries) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method forEach((core::String*, core::String*) →* void f) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method putIfAbsent(covariant-by-class core::String* key, covariant-by-class () →* core::String* ifAbsent) → core::String*
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method updateAll(covariant-by-class (core::String*, core::String*) →* core::String* update) → void
+    return throw new core::UnimplementedError::•();
+  @#C4
+  method removeWhere((core::String*, core::String*) →* core::bool* predicate) → void
+    return throw new core::UnimplementedError::•();
+  method update(covariant-by-class core::String* key, covariant-by-class (core::String*) →* core::String* update, {covariant-by-class () →* core::String* ifAbsent = #C3}) → core::String*
+    return throw new core::UnimplementedError::•();
+  method map<K2 extends core::Object* = dynamic, V2 extends core::Object* = dynamic>((core::String*, core::String*) →* core::MapEntry<self::CustomMap::map::K2*, self::CustomMap::map::V2*>* f) → core::Map<self::CustomMap::map::K2*, self::CustomMap::map::V2*>*
+    return throw new core::UnimplementedError::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* fortyTwo = #C5;
+static const field dynamic fortyTwoAsDynamic = #C5;
+static const field core::List<core::String*>* nullList = #C3;
+static const field core::List<core::String*>* foo = #C8;
+static const field core::List<core::String*>* bar = #C10;
+static field core::List<core::String*>* barAsVar = block {
+  final core::List<core::String*>* #t1 = core::List::of<core::String*>(#C8);
+  #t1.{core::List::add}{Invariant}("!"){(core::String*) →* void};
+} =>#t1;
+static const field core::List<core::String*>* barWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::List<core::String*>* barWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:23:51: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+const List<String> barWithIntSpread = [...foo, ...fortyTwo];
+                                                  ^";
+static const field core::List<core::String*>* barWithIntDynamicSpread = invalid-expression "Expected constant '42' to be of type 'Iterable<dynamic>', but was of type 'int'.
+ - 'Iterable' is from 'dart:core'.";
+static const field core::List<core::String*>* barWithMapSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:25:51: Error: Unexpected type 'Map<String, String>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+const List<String> barWithMapSpread = [...foo, ...quux];
+                                                  ^";
+static const field core::List<core::String*>* barWithCustomIterableSpread1 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::List<core::String*>* barWithCustomIterableSpread2 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field self::CustomIterable* customIterable = #C11;
+static const field core::List<core::String*>* barWithCustomIterableSpread3 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::List<core::String*>* listConcat = invalid-expression "The method '+' can't be invoked on '<String>[\"Hello\"]' in a constant expression.";
+static const field core::Set<core::String*>* nullSet = #C3;
+static const field core::Set<core::String*>* baz = #C12;
+static const field core::Set<core::String*>* qux = #C13;
+static const field core::Set<core::String*>* quxWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::Set<core::String*>* quxWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:41:50: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+const Set<String> quxWithIntSpread = {...baz, ...fortyTwo};
+                                                 ^";
+static const field core::Set<core::String*>* quxWithMapSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:42:38: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Set<String> quxWithMapSpread = {...baz, ...quux};
+                                     ^";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread1 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread2 = invalid-expression "Only lists and sets can be used in spreads in constant lists and sets.";
+static const field core::Set<core::String*>* quxWithCustomIterableSpread3 = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:48:59: Error: A value of type 'CustomIterable' can't be assigned to a variable of type 'String'.
+ - 'CustomIterable' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.
+const Set<String> quxWithCustomIterableSpread3 = {...baz, customIterable};
+                                                          ^";
+static const field core::Set<dynamic>* setWithNonPrimitiveEquals = invalid-expression "The element 'WithEquals {i: 42}' does not have a primitive operator '=='.
+ - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.";
+static const field core::Set<dynamic>* setWithDuplicates = invalid-expression "The element '42' conflicts with another existing element in the set.";
+static const field core::Map<core::String*, core::String*>* nullMap = #C3;
+static const field core::Map<core::String*, core::String*>* quux = #C14;
+static const field core::Map<core::String*, core::String*>* quuz = #C16;
+static const field core::Map<core::String*, core::String*>* quuzWithNullSpread = invalid-expression "Null value during constant evaluation.";
+static const field core::Map<core::String*, core::String*>* quuzWithIntSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:58:60: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+const Map<String, String> quuzWithIntSpread = {...quux, ...fortyTwo};
+                                                           ^";
+static const field core::Map<core::String*, core::String*>* quuzWithSetSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:59:47: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Map<String, String> quuzWithSetSpread = {...quux, ...baz};
+                                              ^";
+static const field core::Map<core::String*, core::String*>* mapWithSetSpread = invalid-expression "pkg/front_end/testcases/general/constants/const_collections.dart:60:46: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+const Map<String, String> mapWithSetSpread = {...baz};
+                                             ^";
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap1 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap2 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<core::String*, core::String*>* customMap = #C17;
+static const field core::Map<core::String*, core::String*>* mapWithCustomMap3 = invalid-expression "Only maps can be used in spreads in constant maps.";
+static const field core::Map<dynamic, core::int*>* mapWithNonPrimitiveEqualsKey = invalid-expression "The key 'WithEquals {i: 42}' does not have a primitive operator '=='.
+ - 'WithEquals' is from 'pkg/front_end/testcases/general/constants/const_collections.dart'.";
+static const field core::Map<core::int*, core::int*>* mapWithDuplicates = invalid-expression "The key '42' conflicts with another existing key in the map.";
+static get fooAsGetter() → core::List<core::String*>*
+  return #C8;
+static get barAsGetter() → core::List<core::String*>*
+  return #C10;
+static get bazAsGetter() → core::Set<core::String*>*
+  return #C12;
+static get quxAsGetter() → core::Set<core::String*>*
+  return #C13;
+static get quuxAsGetter() → core::Map<core::String*, core::String*>*
+  return #C14;
+static get quuzAsGetter() → core::Map<core::String*, core::String*>*
+  return #C16;
+static method main() → dynamic {
+  core::print(#C10);
+  core::print(#C13);
+  core::print(#C16);
+  core::print( block {
+    final core::Set<core::String*>* #t2 = col::LinkedHashSet::•<core::String*>();
+    #t2.{core::Set::add}{Invariant}("hello"){(core::String*) →* core::bool*};
+  } =>#t2);
+  core::print(#C18);
+}
+
+constants  {
+  #C1 = ""
+  #C2 = true
+  #C3 = null
+  #C4 = core::_Override {}
+  #C5 = 42
+  #C6 = "hello"
+  #C7 = "world"
+  #C8 = <core::String*>[#C6, #C7]
+  #C9 = "!"
+  #C10 = <core::String*>[#C6, #C7, #C9]
+  #C11 = self::CustomIterable {}
+  #C12 = <core::String*>{#C6, #C7}
+  #C13 = <core::String*>{#C6, #C7, #C9}
+  #C14 = <core::String*, core::String*>{#C6:#C7)
+  #C15 = "bye!"
+  #C16 = <core::String*, core::String*>{#C6:#C7, #C9:#C15)
+  #C17 = self::CustomMap {}
+  #C18 = <core::String*>{#C6}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_collections.dart:
+- CustomIterable. (from org-dartlang-testcase:///const_collections.dart:79:9)
+- IterableBase. (from org-dartlang-sdk:///sdk/lib/collection/iterable.dart:219:9)
+- Iterable. (from org-dartlang-sdk:///sdk/lib/core/iterable.dart:87:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- WithEquals. (from org-dartlang-testcase:///const_collections.dart:72:9)
+- CustomMap. (from org-dartlang-testcase:///const_collections.dart:84:9)
diff --git a/pkg/front_end/testcases/general/constants/const_constructor_coverage.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/const_constructor_coverage.dart.weak.modular.expect
new file mode 100644
index 0000000..75eedd4
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/const_constructor_coverage.dart.weak.modular.expect
@@ -0,0 +1,155 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "const_constructor_coverage_lib1.dart" as con;
+
+import "org-dartlang-testcase:///const_constructor_coverage_lib1.dart";
+import "org-dartlang-testcase:///const_constructor_coverage_lib2.dart";
+
+static const field con::Foo* foo1 = #C4;
+static const field con::Foo* foo2 = #C4;
+static const field con::Foo* foo3 = #C4;
+static const field con::Foo* foo4 = #C4;
+static method main() → dynamic {
+  core::print(#C4);
+}
+
+library;
+import self as con;
+import "dart:core" as core;
+import "const_constructor_coverage_lib2.dart" as con2;
+
+import "org-dartlang-testcase:///const_constructor_coverage_lib2.dart";
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field con::Bar* bar;
+  const constructor •() → con::Foo*
+    : con::Foo::bar = #C3, super core::Object::•()
+    ;
+  const constructor named1() → con::Foo*
+    : con::Foo::bar = #C3, super core::Object::•()
+    ;
+  const constructor named2() → con::Foo*
+    : con::Foo::bar = #C3, super core::Object::•()
+    ;
+  const constructor named3() → con::Foo*
+    : con::Foo::bar = #C3, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field con2::Baz* baz;
+  const constructor •() → con::Bar*
+    : con::Bar::baz = #C2, super core::Object::•()
+    ;
+  const constructor named1() → con::Bar*
+    : con::Bar::baz = #C2, super core::Object::•()
+    ;
+  const constructor named2() → con::Bar*
+    : con::Bar::baz = #C2, super core::Object::•()
+    ;
+  const constructor named3() → con::Bar*
+    : con::Bar::baz = #C2, super core::Object::•()
+    ;
+  const constructor named4(core::int* i) → con::Bar*
+    : con::Bar::baz = i.{core::num::>}(0){(core::num*) →* core::bool*} ?{con2::Baz*} #C2 : #C2, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field con::Foo* foo = #C4;
+
+library;
+import self as con2;
+import "dart:core" as core;
+import "const_constructor_coverage_lib1.dart" as con;
+
+import "org-dartlang-testcase:///const_constructor_coverage_lib1.dart";
+
+class Baz extends core::Object /*hasConstConstructor*/  {
+  final field con::Bar* bar;
+  const constructor •() → con2::Baz*
+    : con2::Baz::bar = null, super core::Object::•()
+    ;
+  const constructor named1() → con2::Baz*
+    : con2::Baz::bar = null, super core::Object::•()
+    ;
+  const constructor named2() → con2::Baz*
+    : con2::Baz::bar = null, super core::Object::•()
+    ;
+  const constructor named3() → con2::Baz*
+    : con2::Baz::bar = #C3, super core::Object::•()
+    ;
+  const constructor named4() → con2::Baz*
+    : con2::Baz::bar = null, super core::Object::•()
+    ;
+  const constructor named5() → con2::Baz*
+    : con2::Baz::bar = null, super core::Object::•()
+    ;
+  const constructor named6() → con2::Baz*
+    : con2::Baz::bar = null, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field con2::Baz* baz = #C2;
+static const field con::Foo* foo = #C4;
+static const field con::Bar* bar = #C3;
+
+constants  {
+  #C1 = null
+  #C2 = con2::Baz {bar:#C1}
+  #C3 = con::Bar {baz:#C2}
+  #C4 = con::Foo {bar:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_constructor_coverage.dart:
+- Foo. (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:9:15)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Foo.named1 (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:10:15)
+- Foo.named2 (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:11:15)
+- Foo.named3 (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:12:15)
+
+org-dartlang-testcase:///const_constructor_coverage_lib1.dart:
+- Bar. (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:17:15)
+- Baz. (from org-dartlang-testcase:///const_constructor_coverage_lib2.dart:9:15)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Bar.named1 (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:18:15)
+- Baz.named1 (from org-dartlang-testcase:///const_constructor_coverage_lib2.dart:10:15)
+- Baz.named5 (from org-dartlang-testcase:///const_constructor_coverage_lib2.dart:14:15)
+- Baz.named6 (from org-dartlang-testcase:///const_constructor_coverage_lib2.dart:15:15)
+- Foo.named3 (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:12:15)
+
+org-dartlang-testcase:///const_constructor_coverage_lib2.dart:
+- Bar.named3 (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:20:15)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Baz.named4 (from org-dartlang-testcase:///const_constructor_coverage_lib2.dart:13:15)
+- Foo.named2 (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:11:15)
+- Bar.named2 (from org-dartlang-testcase:///const_constructor_coverage_lib1.dart:19:15)
diff --git a/pkg/front_end/testcases/general/constants/from_lib/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/from_lib/main.dart.weak.modular.expect
new file mode 100644
index 0000000..4af39e7
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/from_lib/main.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart" as a;
+
+static const field core::Map<core::int*, core::String*>* map = #C3;
+static const field core::Set<core::int*>* set = #C6;
+static const field core::List<core::int*>* list = #C7;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = "a"
+  #C3 = <core::int*, core::String*>{#C1:#C2)
+  #C4 = 2
+  #C5 = 3
+  #C6 = <core::int*>{#C4, #C5}
+  #C7 = <core::int*>[#C5, #C4]
+}
diff --git a/pkg/front_end/testcases/general/constants/function_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/function_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..ade1d05
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/function_invocation.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/function_invocation.dart:7:20: Error: Method invocation is not a constant expression.
+// const invocation = tearOff();
+//                    ^^^^^^^
+//
+import self as self;
+
+static const field () → dynamic tearOff = #C1;
+static const field invalid-type invocation = invalid-expression "pkg/front_end/testcases/general/constants/function_invocation.dart:7:20: Error: Method invocation is not a constant expression.
+const invocation = tearOff();
+                   ^^^^^^^";
+static method method() → dynamic {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::method
+}
diff --git a/pkg/front_end/testcases/general/constants/issue46925.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/issue46925.dart.weak.modular.expect
new file mode 100644
index 0000000..86587cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/issue46925.dart.weak.modular.expect
@@ -0,0 +1,95 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:14:21: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   const v1 = MyClass<String>.new;
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:14:30: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   const v1 = MyClass<String>.new;
+//                              ^^^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:14:30: Error: Member not found: 'new'.
+//   const v1 = MyClass<String>.new;
+//                              ^^^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:15:21: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   const v2 = MyClass<int>.constr;
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:15:27: Error: Member not found: 'constr'.
+//   const v2 = MyClass<int>.constr;
+//                           ^^^^^^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:16:21: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   const v3 = MyClass<int>.new;
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:16:27: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   const v3 = MyClass<int>.new;
+//                           ^^^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:16:27: Error: Member not found: 'new'.
+//   const v3 = MyClass<int>.new;
+//                           ^^^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:17:21: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   const v4 = MyClass<String>.constr;
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/issue46925.dart:17:30: Error: Member not found: 'constr'.
+//   const v4 = MyClass<String>.constr;
+//                              ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class MyClass<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field dynamic a;
+  const constructor •(core::int i, core::int j) → self::MyClass<self::MyClass::T%>
+    : self::MyClass::a = i.{core::num::+}(j){(core::num) → core::int}, super core::Object::•()
+    ;
+  const constructor constr() → self::MyClass<self::MyClass::T%>
+    : self::MyClass::a = 0, super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  const invalid-type v1 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:14:30: Error: Member not found: 'new'.
+  const v1 = MyClass<String>.new;
+                             ^^^";
+  const invalid-type v2 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:15:27: Error: Member not found: 'constr'.
+  const v2 = MyClass<int>.constr;
+                          ^^^^^^";
+  const invalid-type v3 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:16:27: Error: Member not found: 'new'.
+  const v3 = MyClass<int>.new;
+                          ^^^";
+  const invalid-type v4 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:17:30: Error: Member not found: 'constr'.
+  const v4 = MyClass<String>.constr;
+                             ^^^^^^";
+  const dynamic c1 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:14:30: Error: Member not found: 'new'.
+  const v1 = MyClass<String>.new;
+                             ^^^";
+  const dynamic c2 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:14:30: Error: Member not found: 'new'.
+  const v1 = MyClass<String>.new;
+                             ^^^";
+  const dynamic c3 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:15:27: Error: Member not found: 'constr'.
+  const v2 = MyClass<int>.constr;
+                          ^^^^^^";
+  const dynamic c4 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:15:27: Error: Member not found: 'constr'.
+  const v2 = MyClass<int>.constr;
+                          ^^^^^^";
+  const dynamic c5 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:16:27: Error: Member not found: 'new'.
+  const v3 = MyClass<int>.new;
+                          ^^^";
+  const dynamic c6 = invalid-expression "pkg/front_end/testcases/general/constants/issue46925.dart:17:30: Error: Member not found: 'constr'.
+  const v4 = MyClass<String>.constr;
+                             ^^^^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constants/issue_43431.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/issue_43431.dart.weak.modular.expect
new file mode 100644
index 0000000..65e909f
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/issue_43431.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/issue_43431.dart:9:3: Error: Only static fields can be declared as const.
+// Try using 'final' instead of 'const', or adding the keyword 'static'.
+//   const x = Foo();
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/issue_43431.dart:9:13: Error: Constant expression expected.
+// Try inserting 'const'.
+//   const x = Foo();
+//             ^^^
+//
+// pkg/front_end/testcases/general/constants/issue_43431.dart:8:9: Error: Constructor is marked 'const' so all fields must be final.
+//   const Foo({bool x: true});
+//         ^
+// pkg/front_end/testcases/general/constants/issue_43431.dart:9:9: Context: Field isn't final, but constructor is 'const'.
+//   const x = Foo();
+//         ^
+//
+// pkg/front_end/testcases/general/constants/issue_43431.dart:9:13: Error: Constant evaluation error:
+//   const x = Foo();
+//             ^
+// pkg/front_end/testcases/general/constants/issue_43431.dart:9:13: Context: Constant expression depends on itself.
+//   const x = Foo();
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  field self::Foo* x = invalid-expression "Constant expression depends on itself.";
+  const constructor •({core::bool* x = #C1}) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = true
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue_43431.dart:
+- Foo. (from org-dartlang-testcase:///issue_43431.dart:8:9)
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.modular.expect
new file mode 100644
index 0000000..966e5dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue45376.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class MyClass extends core::Object /*hasConstConstructor*/  {
+  final field core::int a;
+  final field core::int b;
+  const constructor •(dynamic i1, dynamic i2) → self::MyClass
+    : self::MyClass::a = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, self::MyClass::b = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
+    ;
+  static method _#new#tearOff(dynamic i1, dynamic i2) → self::MyClass
+    return new self::MyClass::•(i1, i2);
+}
+static method test() → dynamic {}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue45376.dart:
+- MyClass. (from org-dartlang-testcase:///issue45376.dart:8:9)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.modular.expect
new file mode 100644
index 0000000..c62f518
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart:13:17: Error: Constant evaluation error:
+// test() => const ParallaxOptions();
+//                 ^
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart:13:17: Context: External factory constructors can't be evaluated in constant expressions.
+// test() => const ParallaxOptions();
+//                 ^
+//
+import self as self;
+import "package:js/js.dart" as js;
+import "dart:core" as core;
+
+import "package:js/js.dart";
+
+@#C2
+@#C3
+class ParallaxOptions extends core::Object {
+  external static factory •() → self::ParallaxOptions;
+  static method _#new#tearOff() → self::ParallaxOptions
+    return self::ParallaxOptions::•();
+}
+static method test() → dynamic
+  return invalid-expression "External factory constructors can't be evaluated in constant expressions.";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = js::JS {name:#C1}
+  #C3 = js::_Anonymous {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue46123.dart:
+- JS. (from org-dartlang-testcase-sdk:///pkg/js/lib/js.dart:21:9)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.modular.expect
new file mode 100644
index 0000000..215e011
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart:13:17: Error: Constant evaluation error:
+// test() => const ParallaxOptions();
+//                 ^
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart:13:17: Context: External constructors can't be evaluated in constant expressions.
+// test() => const ParallaxOptions();
+//                 ^
+//
+import self as self;
+import "package:js/js.dart" as js;
+import "dart:core" as core;
+
+import "package:js/js.dart";
+
+@#C2
+@#C3
+class ParallaxOptions extends core::Object /*hasConstConstructor*/  {
+  external const constructor •() → self::ParallaxOptions
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff() → self::ParallaxOptions
+    return new self::ParallaxOptions::•();
+}
+static method test() → dynamic
+  return invalid-expression "External constructors can't be evaluated in constant expressions.";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = js::JS {name:#C1}
+  #C3 = js::_Anonymous {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue46123b.dart:
+- JS. (from org-dartlang-testcase-sdk:///pkg/js/lib/js.dart:21:9)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.modular.expect
new file mode 100644
index 0000000..e2269a8
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart.weak.modular.expect
@@ -0,0 +1,148 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:13:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:30: Error: Constant evaluation error:
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:30: Context: Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:5:11: Context: While analyzing:
+// const int shiftNegative1 = 2 << -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Error: Constant evaluation error:
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:30: Context: Binary operator '>>>' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:6:11: Context: While analyzing:
+// const int shiftNegative2 = 2 >>> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:30: Error: Constant evaluation error:
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:30: Context: Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:7:11: Context: While analyzing:
+// const int shiftNegative3 = 2 >> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:23: Error: Constant evaluation error:
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:23: Context: Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:8:11: Context: While analyzing:
+// const int modZero = 2 % 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:26: Error: Constant evaluation error:
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:26: Context: Binary operator '~/' on '2.0' requires non-zero divisor, but divisor was '0'.
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:10:11: Context: While analyzing:
+// const int intdivZero = 2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:37:40: Error: Constant evaluation error:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:37:40: Context: Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:37:11: Context: While analyzing:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:40: Error: Constant evaluation error:
+// const int doubleTruncateDivNull = 84.2 ~/ nil;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:40: Context: Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.
+// const int doubleTruncateDivNull = 84.2 ~/ nil;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:39:11: Context: While analyzing:
+// const int doubleTruncateDivNull = 84.2 ~/ nil;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:39: Error: Constant evaluation error:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:39: Context: Binary operator '84.2 ~/ NaN' results is Infinity or NaN.
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:41:11: Context: While analyzing:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int shiftNegative1 = invalid-expression "Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int shiftNegative2 = invalid-expression "Binary operator '>>>' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int shiftNegative3 = invalid-expression "Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int modZero = invalid-expression "Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int divZero = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^";
+static const field core::int intdivZero = invalid-expression "Binary operator '~/' on '2.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int unaryMinus = #C1;
+static const field core::int unaryTilde = #C2;
+static const field core::int unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds.dart:13:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^";
+static const field core::int binaryPlus = #C3;
+static const field core::int binaryMinus = #C3;
+static const field core::int binaryTimes = #C3;
+static const field core::double binaryDiv = #C3;
+static const field core::int binaryTildeDiv = #C3;
+static const field core::int binaryMod = #C3;
+static const field core::int binaryOr = #C3;
+static const field core::int binaryAnd = #C3;
+static const field core::int binaryXor = #C3;
+static const field core::int binaryShift1 = #C3;
+static const field core::int binaryShift2 = #C3;
+static const field core::int binaryShift3 = #C4;
+static const field core::int binaryShift4 = #C3;
+static const field core::int binaryShift5 = #C5;
+static const field core::bool binaryLess = #C6;
+static const field core::bool binaryLessEqual = #C7;
+static const field core::bool binaryGreaterEqual = #C7;
+static const field core::bool binaryGreater = #C6;
+static const field core::int doubleTruncateDiv = #C3;
+static const field core::int doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
+static const field dynamic nil = #C8;
+static const field core::int doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
+static const field core::double doubleNan = #C9;
+static const field core::int doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
+static const field core::int bigNumber = #C10;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = -2.0
+  #C2 = 4294967293.0
+  #C3 = 42.0
+  #C4 = 0.0
+  #C5 = 4294967295.0
+  #C6 = false
+  #C7 = true
+  #C8 = null
+  #C9 = NaN
+  #C10 = 9223372036854776000.0
+}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..220b700
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart.weak.modular.expect
@@ -0,0 +1,132 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:14:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:10:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:7:30: Error: Constant evaluation error:
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:7:30: Context: Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:7:11: Context: While analyzing:
+// const int shiftNegative1 = 2 << -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:8:30: Error: Constant evaluation error:
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:8:30: Context: Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:8:11: Context: While analyzing:
+// const int shiftNegative3 = 2 >> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:9:23: Error: Constant evaluation error:
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:9:23: Context: Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:9:11: Context: While analyzing:
+// const int modZero = 2 % 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:11:26: Error: Constant evaluation error:
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:11:26: Context: Binary operator '~/' on '2.0' requires non-zero divisor, but divisor was '0'.
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:11:11: Context: While analyzing:
+// const int intdivZero = 2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:35:40: Error: Constant evaluation error:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:35:40: Context: Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:35:11: Context: While analyzing:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:36:40: Error: Constant evaluation error:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:36:40: Context: Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:36:11: Context: While analyzing:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:38:39: Error: Constant evaluation error:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:38:39: Context: Binary operator '84.2 ~/ NaN' results is Infinity or NaN.
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:38:11: Context: While analyzing:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2.0' requires non-negative operand, but was '-1.0'.";
+static const field core::int* modZero = invalid-expression "Binary operator '%' on '2.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:10:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^";
+static const field core::int* intdivZero = invalid-expression "Binary operator '~/' on '2.0' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* unaryMinus = #C1;
+static const field core::int* unaryTilde = #C2;
+static const field core::int* unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/js_semantics/number_folds_opt_out.dart:14:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^";
+static const field core::int* binaryPlus = #C3;
+static const field core::int* binaryMinus = #C3;
+static const field core::int* binaryTimes = #C3;
+static const field core::double* binaryDiv = #C3;
+static const field core::int* binaryTildeDiv = #C3;
+static const field core::int* binaryMod = #C3;
+static const field core::int* binaryOr = #C3;
+static const field core::int* binaryAnd = #C3;
+static const field core::int* binaryXor = #C3;
+static const field core::int* binaryShift1 = #C3;
+static const field core::int* binaryShift4 = #C3;
+static const field core::int* binaryShift5 = #C4;
+static const field core::bool* binaryLess = #C5;
+static const field core::bool* binaryLessEqual = #C6;
+static const field core::bool* binaryGreaterEqual = #C6;
+static const field core::bool* binaryGreater = #C5;
+static const field core::int* doubleTruncateDiv = #C3;
+static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
+static const field core::double* doubleNan = #C7;
+static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
+static const field core::int* bigNumber = #C8;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = -2.0
+  #C2 = 4294967293.0
+  #C3 = 42.0
+  #C4 = 4294967295.0
+  #C5 = false
+  #C6 = true
+  #C7 = NaN
+  #C8 = 9223372036854776000.0
+}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.modular.expect
new file mode 100644
index 0000000..03c80f1
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/on_double.dart.weak.modular.expect
@@ -0,0 +1,151 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:27:26: Error: Constant evaluation error:
+//   const Class c2 = Class.doubleShift(b, 1);
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:21:45: Context: Binary operator '>>' on '1.5' requires operand of type 'int', but was of type 'double'.
+//   const Class.doubleShift(i1, i2) : a = (i1 >> i2);
+//                                             ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:27:15: Context: While analyzing:
+//   const Class c2 = Class.doubleShift(b, 1);
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:29:26: Error: Constant evaluation error:
+//   const Class c4 = Class.tripleShift(b, 1);
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:22:45: Context: Binary operator '>>>' on '1.5' requires operand of type 'int', but was of type 'double'.
+//   const Class.tripleShift(i1, i2) : a = (i1 >>> i2);
+//                                             ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:29:15: Context: While analyzing:
+//   const Class c4 = Class.tripleShift(b, 1);
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:32:26: Error: Constant evaluation error:
+//   const Class d2 = Class.doubleShift(1, b);
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:21:45: Context: Binary operator '>>' on '1.5' requires operand of type 'int', but was of type 'double'.
+//   const Class.doubleShift(i1, i2) : a = (i1 >> i2);
+//                                             ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:32:15: Context: While analyzing:
+//   const Class d2 = Class.doubleShift(1, b);
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:34:26: Error: Constant evaluation error:
+//   const Class d4 = Class.tripleShift(1, b);
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:22:45: Context: Binary operator '>>>' on '1.5' requires operand of type 'int', but was of type 'double'.
+//   const Class.tripleShift(i1, i2) : a = (i1 >>> i2);
+//                                             ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:34:15: Context: While analyzing:
+//   const Class d4 = Class.tripleShift(1, b);
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:37:26: Error: Constant evaluation error:
+//   const Class e2 = Class.doubleShift(1.5, 1);
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:21:45: Context: Binary operator '>>' on '1.5' requires operand of type 'int', but was of type 'double'.
+//   const Class.doubleShift(i1, i2) : a = (i1 >> i2);
+//                                             ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:37:15: Context: While analyzing:
+//   const Class e2 = Class.doubleShift(1.5, 1);
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:39:26: Error: Constant evaluation error:
+//   const Class e4 = Class.tripleShift(1.5, 1);
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:22:45: Context: Binary operator '>>>' on '1.5' requires operand of type 'int', but was of type 'double'.
+//   const Class.tripleShift(i1, i2) : a = (i1 >>> i2);
+//                                             ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:39:15: Context: While analyzing:
+//   const Class e4 = Class.tripleShift(1.5, 1);
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:9:22: Error: Constant evaluation error:
+// const dynamic c1 = b >> 1;
+//                      ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:9:22: Context: Binary operator '>>' on '1.5' requires operand of type 'int', but was of type 'double'.
+// const dynamic c1 = b >> 1;
+//                      ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:9:15: Context: While analyzing:
+// const dynamic c1 = b >> 1;
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:11:22: Error: Constant evaluation error:
+// const dynamic c3 = b >>> 1;
+//                      ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:11:22: Context: Binary operator '>>>' on '1.5' requires operand of type 'int', but was of type 'double'.
+// const dynamic c3 = b >>> 1;
+//                      ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:11:15: Context: While analyzing:
+// const dynamic c3 = b >>> 1;
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:14:22: Error: Constant evaluation error:
+// const dynamic d1 = 1 >> b;
+//                      ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:14:25: Context: Expected constant '1.5' to be of type 'int', but was of type 'double'.
+// const dynamic d1 = 1 >> b;
+//                         ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:14:15: Context: While analyzing:
+// const dynamic d1 = 1 >> b;
+//               ^
+//
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:16:22: Error: Constant evaluation error:
+// const dynamic d3 = 1 >>> b;
+//                      ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:16:26: Context: Expected constant '1.5' to be of type 'int', but was of type 'double'.
+// const dynamic d3 = 1 >>> b;
+//                          ^
+// pkg/front_end/testcases/general/constants/js_semantics/on_double.dart:16:15: Context: While analyzing:
+// const dynamic d3 = 1 >>> b;
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object /*hasConstConstructor*/  {
+  final field core::int a;
+  const constructor doubleShift(dynamic i1, dynamic i2) → self::Class
+    : self::Class::a = i1{dynamic}.>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
+    ;
+  const constructor tripleShift(dynamic i1, dynamic i2) → self::Class
+    : self::Class::a = i1{dynamic}.>>>(i2) as{TypeError,ForDynamic,ForNonNullableByDefault} core::int, super core::Object::•()
+    ;
+  static method _#doubleShift#tearOff(dynamic i1, dynamic i2) → self::Class
+    return new self::Class::doubleShift(i1, i2);
+  static method _#tripleShift#tearOff(dynamic i1, dynamic i2) → self::Class
+    return new self::Class::tripleShift(i1, i2);
+}
+static const field dynamic a = #C1;
+static const field dynamic b = #C2;
+static const field dynamic c0 = #C3;
+static const field dynamic c1 = invalid-expression "Binary operator '>>' on '1.5' requires operand of type 'int', but was of type 'double'.";
+static const field dynamic c2 = #C3;
+static const field dynamic c3 = invalid-expression "Binary operator '>>>' on '1.5' requires operand of type 'int', but was of type 'double'.";
+static const field dynamic d0 = #C3;
+static const field dynamic d1 = invalid-expression "Expected constant '1.5' to be of type 'int', but was of type 'double'.";
+static const field dynamic d2 = #C3;
+static const field dynamic d3 = invalid-expression "Expected constant '1.5' to be of type 'int', but was of type 'double'.";
+static method main() → dynamic {
+  const self::Class c2 = invalid-expression "Binary operator '>>' on '1.5' requires operand of type 'int', but was of type 'double'.";
+  const self::Class c4 = invalid-expression "Binary operator '>>>' on '1.5' requires operand of type 'int', but was of type 'double'.";
+  const self::Class d2 = invalid-expression "Binary operator '>>' on '1.5' requires operand of type 'int', but was of type 'double'.";
+  const self::Class d4 = invalid-expression "Binary operator '>>>' on '1.5' requires operand of type 'int', but was of type 'double'.";
+  const self::Class e2 = invalid-expression "Binary operator '>>' on '1.5' requires operand of type 'int', but was of type 'double'.";
+  const self::Class e4 = invalid-expression "Binary operator '>>>' on '1.5' requires operand of type 'int', but was of type 'double'.";
+}
+
+constants  {
+  #C1 = 1.0
+  #C2 = 1.5
+  #C3 = 0.0
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///on_double.dart:
+- Class.doubleShift (from org-dartlang-testcase:///on_double.dart:21:9)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart:25:9)
+- Class.tripleShift (from org-dartlang-testcase:///on_double.dart:22:9)
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/various.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.weak.modular.expect
new file mode 100644
index 0000000..0570489
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/various.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::bool* y = #C1;
+static const field core::bool* z = #C2;
+static const field core::Object* maybeInt = #C3;
+static const field core::bool* isItInt = #C2;
+static const field core::bool* isItDouble = #C2;
+static const field core::int* actualInt = #C3;
+static const field core::bool* isItInt2 = #C2;
+static const field core::bool* isItDouble2 = #C2;
+static const field core::Object* maybeDouble = #C3;
+static const field core::bool* isItInt3 = #C2;
+static const field core::bool* isItDouble3 = #C2;
+static const field core::double* actualDouble = #C3;
+static const field core::bool* isItInt4 = #C2;
+static const field core::bool* isItDouble4 = #C2;
+static const field core::Object* maybeDouble2 = #C4;
+static const field core::bool* isItInt5 = #C1;
+static const field core::bool* isItDouble5 = #C2;
+static const field core::double* actualDouble2 = #C4;
+static const field core::bool* isItInt6 = #C1;
+static const field core::bool* isItDouble7 = #C2;
+static const field core::bool* zeroPointZeroIdentical = #C2;
+static const field core::bool* zeroPointZeroIdenticalToZero = #C2;
+static const field core::bool* zeroIdenticalToZeroPointZero = #C2;
+static const field core::bool* nanIdentical = #C1;
+static const field core::bool* stringIdentical = #C2;
+static const field core::bool* string2Identical = #C1;
+static const field core::bool* zeroPointZeroEqual = #C2;
+static const field core::bool* zeroPointZeroEqualToZero = #C2;
+static const field core::bool* zeroEqualToZeroPointZero = #C2;
+static const field core::bool* nanEqual = #C1;
+static const field core::bool* stringEqual = #C2;
+static const field core::bool* string2Equal = #C1;
+static const field core::int* intFortyTwo = #C3;
+static const field core::String* intStringConcat = #C5;
+
+constants  {
+  #C1 = false
+  #C2 = true
+  #C3 = 42.0
+  #C4 = 42.42
+  #C5 = "hello1764"
+}
diff --git a/pkg/front_end/testcases/general/constants/no_experiments/various.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.weak.modular.expect
new file mode 100644
index 0000000..376dfb4
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/no_experiments/various.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static const field core::Symbol* tripleShiftSymbol = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #>>>
+}
diff --git a/pkg/front_end/testcases/general/constants/non_const_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/non_const_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..378710d4
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/non_const_constructor.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/non_const_constructor.dart:8:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const Class.named() {
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/non_const_constructor.dart:13:17: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const a = const Class();
+//                 ^^^^^
+//
+// pkg/front_end/testcases/general/constants/non_const_constructor.dart:14:17: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const b = const Class.named();
+//                 ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  constructor named() → self::Class
+    : super core::Object::•() {
+    1;
+  }
+}
+static const field invalid-type a = invalid-expression "pkg/front_end/testcases/general/constants/non_const_constructor.dart:13:17: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+const a = const Class();
+                ^^^^^";
+static const field invalid-type b = invalid-expression "pkg/front_end/testcases/general/constants/non_const_constructor.dart:14:17: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+const b = const Class.named();
+                ^^^^^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constants/non_const_variable.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/non_const_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..a600694
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/non_const_variable.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/non_const_variable.dart:7:13: Error: Not a constant expression.
+//   const b = a;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method method() → dynamic {
+  core::int a = 0;
+  const invalid-type b = invalid-expression "pkg/front_end/testcases/general/constants/non_const_variable.dart:7:13: Error: Not a constant expression.
+  const b = a;
+            ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constants/number_folds.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/number_folds.dart.weak.modular.expect
new file mode 100644
index 0000000..6de8923
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/number_folds.dart.weak.modular.expect
@@ -0,0 +1,145 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:13:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:30: Error: Constant evaluation error:
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:30: Context: Binary operator '<<' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:5:11: Context: While analyzing:
+// const int shiftNegative1 = 2 << -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Error: Constant evaluation error:
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:30: Context: Binary operator '>>>' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative2 = 2 >>> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:6:11: Context: While analyzing:
+// const int shiftNegative2 = 2 >>> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:30: Error: Constant evaluation error:
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:30: Context: Binary operator '>>' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:7:11: Context: While analyzing:
+// const int shiftNegative3 = 2 >> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:23: Error: Constant evaluation error:
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:23: Context: Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:8:11: Context: While analyzing:
+// const int modZero = 2 % 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:26: Error: Constant evaluation error:
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:26: Context: Binary operator '~/' on '2' requires non-zero divisor, but divisor was '0'.
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:10:11: Context: While analyzing:
+// const int intdivZero = 2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:36:40: Error: Constant evaluation error:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:36:40: Context: Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:36:11: Context: While analyzing:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:40: Error: Constant evaluation error:
+// const int doubleTruncateDivNull = 84.2 ~/ nil;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:40: Context: Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.
+// const int doubleTruncateDivNull = 84.2 ~/ nil;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:38:11: Context: While analyzing:
+// const int doubleTruncateDivNull = 84.2 ~/ nil;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:39: Error: Constant evaluation error:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:39: Context: Binary operator '84.2 ~/ NaN' results is Infinity or NaN.
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/number_folds.dart:40:11: Context: While analyzing:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int shiftNegative1 = invalid-expression "Binary operator '<<' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int shiftNegative2 = invalid-expression "Binary operator '>>>' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int shiftNegative3 = invalid-expression "Binary operator '>>' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int modZero = invalid-expression "Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int divZero = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:9:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^";
+static const field core::int intdivZero = invalid-expression "Binary operator '~/' on '2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int unaryMinus = #C1;
+static const field core::int unaryTilde = #C2;
+static const field core::int unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/number_folds.dart:13:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^";
+static const field core::int binaryPlus = #C3;
+static const field core::int binaryMinus = #C3;
+static const field core::int binaryTimes = #C3;
+static const field core::double binaryDiv = #C4;
+static const field core::int binaryTildeDiv = #C3;
+static const field core::int binaryMod = #C3;
+static const field core::int binaryOr = #C3;
+static const field core::int binaryAnd = #C3;
+static const field core::int binaryXor = #C3;
+static const field core::int binaryShift1 = #C3;
+static const field core::int binaryShift2 = #C3;
+static const field core::int binaryShift3 = #C5;
+static const field core::int binaryShift4 = #C3;
+static const field core::bool binaryLess = #C6;
+static const field core::bool binaryLessEqual = #C7;
+static const field core::bool binaryGreaterEqual = #C7;
+static const field core::bool binaryGreater = #C6;
+static const field core::int doubleTruncateDiv = #C3;
+static const field core::int doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
+static const field dynamic nil = #C8;
+static const field core::int doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
+static const field core::double doubleNan = #C9;
+static const field core::int doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = -2
+  #C2 = -3
+  #C3 = 42
+  #C4 = 42.0
+  #C5 = 0
+  #C6 = false
+  #C7 = true
+  #C8 = null
+  #C9 = NaN
+}
diff --git a/pkg/front_end/testcases/general/constants/number_folds_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/number_folds_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..44bc90e
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/number_folds_opt_out.dart.weak.modular.expect
@@ -0,0 +1,129 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:14:23: Error: '+' is not a prefix operator.
+// Try removing '+'.
+// const int unaryPlus = +2;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:10:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// const int divZero = 2 / 0;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:7:30: Error: Constant evaluation error:
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:7:30: Context: Binary operator '<<' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative1 = 2 << -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:7:11: Context: While analyzing:
+// const int shiftNegative1 = 2 << -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:8:30: Error: Constant evaluation error:
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:8:30: Context: Binary operator '>>' on '2' requires non-negative operand, but was '-1'.
+// const int shiftNegative3 = 2 >> -1;
+//                              ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:8:11: Context: While analyzing:
+// const int shiftNegative3 = 2 >> -1;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:9:23: Error: Constant evaluation error:
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:9:23: Context: Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.
+// const int modZero = 2 % 0;
+//                       ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:9:11: Context: While analyzing:
+// const int modZero = 2 % 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:11:26: Error: Constant evaluation error:
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:11:26: Context: Binary operator '~/' on '2' requires non-zero divisor, but divisor was '0'.
+// const int intdivZero = 2 ~/ 0;
+//                          ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:11:11: Context: While analyzing:
+// const int intdivZero = 2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:34:40: Error: Constant evaluation error:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:34:40: Context: Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:34:11: Context: While analyzing:
+// const int doubleTruncateDivZero = 84.2 ~/ 0;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:35:40: Error: Constant evaluation error:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:35:40: Context: Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//                                        ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:35:11: Context: While analyzing:
+// const int doubleTruncateDivNull = 84.2 ~/ null;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:37:39: Error: Constant evaluation error:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:37:39: Context: Binary operator '84.2 ~/ NaN' results is Infinity or NaN.
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//                                       ^
+// pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:37:11: Context: While analyzing:
+// const int doubleTruncateDivNaN = 84.2 ~/ doubleNan;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* shiftNegative1 = invalid-expression "Binary operator '<<' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int* shiftNegative3 = invalid-expression "Binary operator '>>' on '2' requires non-negative operand, but was '-1'.";
+static const field core::int* modZero = invalid-expression "Binary operator '%' on '2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* divZero = invalid-expression "pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:10:23: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+const int divZero = 2 / 0;
+                      ^";
+static const field core::int* intdivZero = invalid-expression "Binary operator '~/' on '2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* unaryMinus = #C1;
+static const field core::int* unaryTilde = #C2;
+static const field core::int* unaryPlus = invalid-expression "pkg/front_end/testcases/general/constants/number_folds_opt_out.dart:14:23: Error: This couldn't be parsed.
+const int unaryPlus = +2;
+                      ^";
+static const field core::int* binaryPlus = #C3;
+static const field core::int* binaryMinus = #C3;
+static const field core::int* binaryTimes = #C3;
+static const field core::double* binaryDiv = #C4;
+static const field core::int* binaryTildeDiv = #C3;
+static const field core::int* binaryMod = #C3;
+static const field core::int* binaryOr = #C3;
+static const field core::int* binaryAnd = #C3;
+static const field core::int* binaryXor = #C3;
+static const field core::int* binaryShift1 = #C3;
+static const field core::int* binaryShift4 = #C3;
+static const field core::bool* binaryLess = #C5;
+static const field core::bool* binaryLessEqual = #C6;
+static const field core::bool* binaryGreaterEqual = #C6;
+static const field core::bool* binaryGreater = #C5;
+static const field core::int* doubleTruncateDiv = #C3;
+static const field core::int* doubleTruncateDivZero = invalid-expression "Binary operator '~/' on '84.2' requires non-zero divisor, but divisor was '0'.";
+static const field core::int* doubleTruncateDivNull = invalid-expression "Binary operator '~/' on '84.2' requires operand of type 'num', but was of type 'Null'.";
+static const field core::double* doubleNan = #C7;
+static const field core::int* doubleTruncateDivNaN = invalid-expression "Binary operator '84.2 ~/ NaN' results is Infinity or NaN.";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = -2
+  #C2 = -3
+  #C3 = 42
+  #C4 = 42.0
+  #C5 = false
+  #C6 = true
+  #C7 = NaN
+}
diff --git a/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.modular.expect
new file mode 100644
index 0000000..35d93a3
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/potentially_constant_type.dart.weak.modular.expect
@@ -0,0 +1,666 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:26:18: Error: Type variables can't be used as constants.
+//       : field1 = T,
+//                  ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:27:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field5 = <T>[],
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:27:19: Error: Type variables can't be used as constants.
+//         field5 = <T>[],
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:28:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field6 = <T>{},
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:28:19: Error: Type variables can't be used as constants.
+//         field6 = <T>{},
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:24: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field7 = <T, T>{},
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:19: Error: Type variables can't be used as constants.
+//         field7 = <T, T>{},
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:29:22: Error: Type variables can't be used as constants.
+//         field7 = <T, T>{},
+//                      ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:30:23: Error: Type variables can't be used as constants.
+//         field8 = o is T,
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:31:29: Error: Type variables can't be used as constants.
+//         field9 = o is Class<T>,
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:32:24: Error: Type variables can't be used as constants.
+//         field10 = o as T,
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:33:30: Error: Type variables can't be used as constants.
+//         field11 = o as Class<T>,
+//                              ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:34:26: Error: Type variables can't be used as constants.
+//         field15 = <Class<T>>[];
+//                          ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:34:29: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field15 = <Class<T>>[];
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:40:20: Error: Type variables can't be used as constants.
+//     const local1 = T;
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:41:21: Error: Type variables can't be used as constants.
+//     const local5 = <T>[];
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:42:21: Error: Type variables can't be used as constants.
+//     const local6 = <T>{};
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:43:21: Error: Type variables can't be used as constants.
+//     const local7 = <T, T>{};
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:43:24: Error: Type variables can't be used as constants.
+//     const local7 = <T, T>{};
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:44:25: Error: Type variables can't be used as constants.
+//     const local8 = o is T;
+//                         ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:45:31: Error: Type variables can't be used as constants.
+//     const local9 = o is Class<T>;
+//                               ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:46:26: Error: Type variables can't be used as constants.
+//     const local10 = o as T;
+//                          ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:47:32: Error: Type variables can't be used as constants.
+//     const local11 = o as Class<T>;
+//                                ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:48:28: Error: Type variables can't be used as constants.
+//     const local15 = <Class<T>>[];
+//                            ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:63:18: Error: Type variables can't be used as constants.
+//     print(const [T]);
+//                  ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:64:19: Error: Type variables can't be used as constants.
+//     print(const [<T>[]]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:65:19: Error: Type variables can't be used as constants.
+//     print(const [<T>{}]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:66:19: Error: Type variables can't be used as constants.
+//     print(const [<T, T>{}]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:66:22: Error: Type variables can't be used as constants.
+//     print(const [<T, T>{}]);
+//                      ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:67:23: Error: Type variables can't be used as constants.
+//     print(const [o is T]);
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:68:29: Error: Type variables can't be used as constants.
+//     print(const [o is Class<T>]);
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:69:23: Error: Type variables can't be used as constants.
+//     print(const [o as T]);
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:70:29: Error: Type variables can't be used as constants.
+//     print(const [o as Class<T>]);
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type.dart:71:25: Error: Type variables can't be used as constants.
+//     print(const [<Class<T>>[]]);
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///potentially_constant_type_lib1.dart";
+import "org-dartlang-testcase:///potentially_constant_type_lib2.dart";
+
+class Class<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field dynamic field1;
+  final field dynamic field5;
+  final field dynamic field6;
+  final field dynamic field7;
+  final field dynamic field8;
+  final field dynamic field9;
+  final field dynamic field10;
+  final field dynamic field11;
+  final field dynamic field15;
+  const constructor •(dynamic o) → self::Class<self::Class::T*>*
+    : self::Class::field1 = #C1, self::Class::field5 = #C2, self::Class::field6 = #C3, self::Class::field7 = #C4, self::Class::field8 = o is invalid-type, self::Class::field9 = o is self::Class<invalid-type>*, self::Class::field10 = o as invalid-type, self::Class::field11 = o as self::Class<invalid-type>*, self::Class::field15 = #C5, super core::Object::•()
+    ;
+  method method() → void {
+    core::print(#C1);
+    core::print(#C2);
+    core::print(#C3);
+    core::print(#C4);
+    core::print(#C6);
+    core::print(#C7);
+    core::print(#C8);
+    core::print(#C8);
+    core::print(#C5);
+    core::print(#C9);
+    core::print(#C10);
+    core::print(#C11);
+    core::print(#C12);
+    core::print(#C13);
+    core::print(#C14);
+    core::print(#C15);
+    core::print(#C16);
+    core::print(#C17);
+    core::print(#C18);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method id<T extends core::Object* = dynamic>(self::id::T* t) → self::id::T*
+  return t;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:23:18: Error: Type variables can't be used as constants.
+//       : field1 = T,
+//                  ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:24:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field5 = <T>[],
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:24:19: Error: Type variables can't be used as constants.
+//         field5 = <T>[],
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:25:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field6 = <T>{},
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:25:19: Error: Type variables can't be used as constants.
+//         field6 = <T>{},
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:24: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field7 = <T, T>{},
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:19: Error: Type variables can't be used as constants.
+//         field7 = <T, T>{},
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:26:22: Error: Type variables can't be used as constants.
+//         field7 = <T, T>{},
+//                      ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:31:26: Error: Type variables can't be used as constants.
+//         field15 = <Class<T>>[];
+//                          ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:31:29: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field15 = <Class<T>>[];
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:37:20: Error: Type variables can't be used as constants.
+//     const local1 = T;
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:38:21: Error: Type variables can't be used as constants.
+//     const local5 = <T>[];
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:39:21: Error: Type variables can't be used as constants.
+//     const local6 = <T>{};
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:40:21: Error: Type variables can't be used as constants.
+//     const local7 = <T, T>{};
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:40:24: Error: Type variables can't be used as constants.
+//     const local7 = <T, T>{};
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:41:25: Error: Type variables can't be used as constants.
+//     const local8 = o is T;
+//                         ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:42:31: Error: Type variables can't be used as constants.
+//     const local9 = o is Class<T>;
+//                               ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:43:26: Error: Type variables can't be used as constants.
+//     const local10 = o as T;
+//                          ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:44:32: Error: Type variables can't be used as constants.
+//     const local11 = o as Class<T>;
+//                                ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:45:28: Error: Type variables can't be used as constants.
+//     const local15 = <Class<T>>[];
+//                            ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:60:18: Error: Type variables can't be used as constants.
+//     print(const [T]);
+//                  ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:61:19: Error: Type variables can't be used as constants.
+//     print(const [<T>[]]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:62:19: Error: Type variables can't be used as constants.
+//     print(const [<T>{}]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:63:19: Error: Type variables can't be used as constants.
+//     print(const [<T, T>{}]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:63:22: Error: Type variables can't be used as constants.
+//     print(const [<T, T>{}]);
+//                      ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:64:23: Error: Type variables can't be used as constants.
+//     print(const [o is T]);
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:65:29: Error: Type variables can't be used as constants.
+//     print(const [o is Class<T>]);
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:66:23: Error: Type variables can't be used as constants.
+//     print(const [o as T]);
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:67:29: Error: Type variables can't be used as constants.
+//     print(const [o as Class<T>]);
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib1.dart:68:25: Error: Type variables can't be used as constants.
+//     print(const [<Class<T>>[]]);
+//                         ^
+//
+import self as self2;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field dynamic field1;
+  final field dynamic field5;
+  final field dynamic field6;
+  final field dynamic field7;
+  final field dynamic field8;
+  final field dynamic field9;
+  final field dynamic field10;
+  final field dynamic field11;
+  final field dynamic field15;
+  const constructor •(dynamic o) → self2::Class<self2::Class::T%>
+    : self2::Class::field1 = #C1, self2::Class::field5 = #C2, self2::Class::field6 = #C3, self2::Class::field7 = #C4, self2::Class::field8 = o is{ForNonNullableByDefault} self2::Class::T%, self2::Class::field9 = o is{ForNonNullableByDefault} self2::Class<self2::Class::T%>, self2::Class::field10 = o as{ForNonNullableByDefault} self2::Class::T%, self2::Class::field11 = o{self2::Class::T%} as{ForNonNullableByDefault} self2::Class<self2::Class::T%>, self2::Class::field15 = #C19, super core::Object::•()
+    ;
+  method method() → void {
+    core::print(#C1);
+    core::print(#C2);
+    core::print(#C3);
+    core::print(#C4);
+    core::print(#C6);
+    core::print(#C7);
+    core::print(#C8);
+    core::print(#C8);
+    core::print(#C19);
+    core::print(#C20);
+    core::print(#C10);
+    core::print(#C11);
+    core::print(#C12);
+    core::print(#C13);
+    core::print(#C14);
+    core::print(#C15);
+    core::print(#C21);
+    core::print(#C22);
+    core::print(#C23);
+  }
+}
+static method id<T extends core::Object? = dynamic>(self2::id::T% t) → self2::id::T%
+  return t;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:34:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field5 = <T>[],
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:34:19: Error: Type variables can't be used as constants.
+//         field5 = <T>[],
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:35:21: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field6 = <T>{},
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:35:19: Error: Type variables can't be used as constants.
+//         field6 = <T>{},
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:24: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field7 = <T, T>{},
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:19: Error: Type variables can't be used as constants.
+//         field7 = <T, T>{},
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:36:22: Error: Type variables can't be used as constants.
+//         field7 = <T, T>{},
+//                      ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:44:29: Error: Constant expression expected.
+// Try inserting 'const'.
+//         field15 = <Class<T>>[],
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:44:26: Error: Type variables can't be used as constants.
+//         field15 = <Class<T>>[],
+//                          ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:51:20: Error: Type variables can't be used as constants.
+//     const local1 = T;
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:52:26: Error: Type variables can't be used as constants.
+//     const local2 = Class<T>;
+//                          ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:53:23: Error: Type variables can't be used as constants.
+//     const local3 = id<T>;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:54:25: Error: Type variables can't be used as constants.
+//     const local4 = (id)<T>;
+//                         ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:55:21: Error: Type variables can't be used as constants.
+//     const local5 = <T>[];
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:56:21: Error: Type variables can't be used as constants.
+//     const local6 = <T>{};
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:57:21: Error: Type variables can't be used as constants.
+//     const local7 = <T, T>{};
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:57:24: Error: Type variables can't be used as constants.
+//     const local7 = <T, T>{};
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:58:25: Error: Type variables can't be used as constants.
+//     const local8 = o is T;
+//                         ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:59:31: Error: Type variables can't be used as constants.
+//     const local9 = o is Class<T>;
+//                               ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:60:26: Error: Type variables can't be used as constants.
+//     const local10 = o as T;
+//                          ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:61:32: Error: Type variables can't be used as constants.
+//     const local11 = o as Class<T>;
+//                                ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:62:27: Error: Type variables can't be used as constants.
+//     const local12 = Class<T>.new;
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:63:23: Error: Type variables can't be used as constants.
+//     const local13 = F<T, T>.new;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:63:26: Error: Type variables can't be used as constants.
+//     const local13 = F<T, T>.new;
+//                          ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:64:30: Error: Type variables can't be used as constants.
+//     const local14 = id<Class<T>>;
+//                              ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:65:28: Error: Type variables can't be used as constants.
+//     const local15 = <Class<T>>[];
+//                            ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:66:23: Error: Type variables can't be used as constants.
+//     const local16 = G<T>.new;
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:88:18: Error: Type variables can't be used as constants.
+//     print(const [T]);
+//                  ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:89:24: Error: Type variables can't be used as constants.
+//     print(const [Class<T>]);
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:90:21: Error: Type variables can't be used as constants.
+//     print(const [id<T>]);
+//                     ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:91:23: Error: Type variables can't be used as constants.
+//     print(const [(id)<T>]);
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:92:19: Error: Type variables can't be used as constants.
+//     print(const [<T>[]]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:93:19: Error: Type variables can't be used as constants.
+//     print(const [<T>{}]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:94:19: Error: Type variables can't be used as constants.
+//     print(const [<T, T>{}]);
+//                   ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:94:22: Error: Type variables can't be used as constants.
+//     print(const [<T, T>{}]);
+//                      ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:95:23: Error: Type variables can't be used as constants.
+//     print(const [o is T]);
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:96:29: Error: Type variables can't be used as constants.
+//     print(const [o is Class<T>]);
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:97:23: Error: Type variables can't be used as constants.
+//     print(const [o as T]);
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:98:29: Error: Type variables can't be used as constants.
+//     print(const [o as Class<T>]);
+//                             ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:99:24: Error: Type variables can't be used as constants.
+//     print(const [Class<T>.new]);
+//                        ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:100:20: Error: Type variables can't be used as constants.
+//     print(const [F<T, T>.new]);
+//                    ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:100:23: Error: Type variables can't be used as constants.
+//     print(const [F<T, T>.new]);
+//                       ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:101:27: Error: Type variables can't be used as constants.
+//     print(const [id<Class<T>>]);
+//                           ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:102:25: Error: Type variables can't be used as constants.
+//     print(const [<Class<T>>[]]);
+//                         ^
+//
+// pkg/front_end/testcases/general/constants/potentially_constant_type_lib2.dart:103:20: Error: Type variables can't be used as constants.
+//     print(const [G<T>.new]);
+//                    ^
+//
+import self as self3;
+import "dart:core" as core;
+
+typedef F<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self3::Class<X%>;
+typedef G<unrelated X extends core::Object? = dynamic> = self3::Class<core::int>;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field dynamic field1;
+  final field dynamic field2;
+  final field dynamic field3;
+  final field dynamic field4;
+  final field dynamic field5;
+  final field dynamic field6;
+  final field dynamic field7;
+  final field dynamic field8;
+  final field dynamic field9;
+  final field dynamic field10;
+  final field dynamic field11;
+  final field dynamic field12;
+  final field dynamic field13;
+  final field dynamic field14;
+  final field dynamic field15;
+  final field dynamic field16;
+  const constructor •(dynamic o) → self3::Class<self3::Class::T%>
+    : self3::Class::field1 = self3::Class::T%, self3::Class::field2 = self3::Class<self3::Class::T%>, self3::Class::field3 = #C24<self3::Class::T%>, self3::Class::field4 = #C24<self3::Class::T%>, self3::Class::field5 = #C2, self3::Class::field6 = #C3, self3::Class::field7 = #C4, self3::Class::field8 = o is{ForNonNullableByDefault} self3::Class::T%, self3::Class::field9 = o is{ForNonNullableByDefault} self3::Class<self3::Class::T%>, self3::Class::field10 = o as{ForNonNullableByDefault} self3::Class::T%, self3::Class::field11 = o{self3::Class::T%} as{ForNonNullableByDefault} self3::Class<self3::Class::T%>, self3::Class::field12 = #C25<self3::Class::T%>, self3::Class::field13 = #C25<self3::Class::T%>, self3::Class::field14 = #C24<self3::Class<self3::Class::T%>>, self3::Class::field15 = #C26, self3::Class::field16 = #C27, super core::Object::•()
+    ;
+  method method() → void {
+    core::print(#C1);
+    core::print(#C28);
+    core::print(#C29);
+    core::print(#C29);
+    core::print(#C2);
+    core::print(#C3);
+    core::print(#C4);
+    core::print(#C6);
+    core::print(#C7);
+    core::print(#C8);
+    core::print(#C8);
+    core::print(#C30);
+    core::print(#C30);
+    core::print(#C31);
+    core::print(#C26);
+    core::print(#C27);
+    core::print(#C20);
+    core::print(#C10);
+    core::print(#C32);
+    core::print(#C33);
+    core::print(#C33);
+    core::print(#C11);
+    core::print(#C12);
+    core::print(#C13);
+    core::print(#C14);
+    core::print(#C15);
+    core::print(#C21);
+    core::print(#C34);
+    core::print(#C35);
+    core::print(#C35);
+    core::print(#C36);
+    core::print(#C37);
+    core::print(#C38);
+  }
+}
+static method id<T extends core::Object? = dynamic>(self3::id::T% t) → self3::id::T%
+  return t;
+static method main() → dynamic {}
+static method _#F#new#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>(dynamic o) → self3::Class<self3::_#F#new#tearOff::X%>
+  return new self3::Class::•<self3::_#F#new#tearOff::X%>(o);
+static method _#G#new#tearOff<unrelated X extends core::Object? = dynamic>(dynamic o) → self3::Class<core::int>
+  return new self3::Class::•<core::int>(o);
+
+constants  {
+  #C1 = TypeLiteralConstant(invalid-type)
+  #C2 = <invalid-type>[]
+  #C3 = <invalid-type>{}
+  #C4 = <invalid-type, invalid-type>{)
+  #C5 = <self::Class<invalid-type>*>[]
+  #C6 = true
+  #C7 = false
+  #C8 = null
+  #C9 = <Null>[]
+  #C10 = <core::Type*>[#C1]
+  #C11 = <core::List<invalid-type>*>[#C2]
+  #C12 = <core::Set<invalid-type>*>[#C3]
+  #C13 = <core::Map<invalid-type, invalid-type>*>[#C4]
+  #C14 = <core::bool*>[#C6]
+  #C15 = <core::bool*>[#C7]
+  #C16 = <invalid-type>[#C8]
+  #C17 = <self::Class<invalid-type>*>[#C8]
+  #C18 = <core::List<self::Class<invalid-type>*>*>[#C5]
+  #C19 = <self2::Class<invalid-type>*>[]
+  #C20 = <Never*>[]
+  #C21 = <dynamic>[#C8]
+  #C22 = <self2::Class<invalid-type>*>[#C8]
+  #C23 = <core::List<self2::Class<invalid-type>*>*>[#C19]
+  #C24 = static-tearoff self3::id
+  #C25 = constructor-tearoff self3::Class::•
+  #C26 = <self3::Class<invalid-type>*>[]
+  #C27 = instantiation #C25 <core::int*>
+  #C28 = TypeLiteralConstant(self3::Class<invalid-type>*)
+  #C29 = instantiation #C24 <invalid-type>
+  #C30 = instantiation #C25 <invalid-type>
+  #C31 = instantiation #C24 <self3::Class<invalid-type>*>
+  #C32 = <core::Type*>[#C28]
+  #C33 = <(invalid-type) →* invalid-type>[#C29]
+  #C34 = <self3::Class<invalid-type>*>[#C8]
+  #C35 = <(dynamic) →* self3::Class<invalid-type>*>[#C30]
+  #C36 = <(self3::Class<invalid-type>*) →* self3::Class<invalid-type>*>[#C31]
+  #C37 = <core::List<self3::Class<invalid-type>*>*>[#C26]
+  #C38 = <(dynamic) →* self3::Class<core::int*>*>[#C27]
+}
diff --git a/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.weak.modular.expect
new file mode 100644
index 0000000..f3b74df
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/rudimentary_test_01.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* foo = #C1;
+static const field core::String* bar = #C2;
+static const field core::String* bar2 = #C3;
+static const field core::bool* baz = #C4;
+static const field core::Symbol* blaSymbol = #C5;
+static method main() → dynamic {
+  self::_x();
+  #C6;
+  core::print(#C2);
+}
+static method _x() → void {
+  core::print(#C1);
+  core::print(#C2);
+}
+
+constants  {
+  #C1 = 1764
+  #C2 = "hello 42!"
+  #C3 = "hello2 2hello 42!"
+  #C4 = true
+  #C5 = #org-dartlang-testcase:///rudimentary_test_01.dart::_x
+  #C6 = false
+}
diff --git a/pkg/front_end/testcases/general/constants/various.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/various.dart.weak.modular.expect
new file mode 100644
index 0000000..9fa5cbe
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/various.dart.weak.modular.expect
@@ -0,0 +1,644 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/various.dart:162:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const ClassWithNonEmptyConstConstructor() {
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:76:14: Error: Not a constant expression.
+// const x1 = --x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:77:14: Error: Not a constant expression.
+// const x2 = ++x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:78:12: Error: Not a constant expression.
+// const x3 = x--;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:79:12: Error: Not a constant expression.
+// const x4 = x++;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:82:14: Error: Setter not found: 'y'.
+// const y1 = --y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:83:14: Error: Setter not found: 'y'.
+// const y2 = ++y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:84:12: Error: Setter not found: 'y'.
+// const y3 = y--;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:85:12: Error: Setter not found: 'y'.
+// const y4 = y++;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
+// const function_const = () {};
+//                        ^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:180:14: Error: Can't access 'this' in a field initializer to read 'y'.
+//   final z1 = y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: The class 'AbstractClass' is abstract and can't be instantiated.
+//   @AbstractClass()
+//    ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   @AbstractClass()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: The class 'AbstractClassWithConstructor' is abstract and can't be instantiated.
+//   @AbstractClassWithConstructor()
+//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   @AbstractClassWithConstructor()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:118:39: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+// const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+//                                       ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+//   const ExtendsFoo2();
+//         ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:180:14: Error: Not a constant expression.
+//   final z1 = y;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:181:14: Error: Not a constant expression.
+//   final z2 = x;
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:96:11: Error: The class 'AbstractClassWithConstructor' is abstract and can't be instantiated.
+//     const AbstractClassWithConstructor();
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:96:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//     const AbstractClassWithConstructor();
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:168:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//     const ClassWithNonEmptyConstConstructor();
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/constants/various.dart:114:7: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+// class ExtendsFoo1 extends Foo {
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:99:4: Error: Not a constant expression.
+//   @AbstractClass()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:102:4: Error: Not a constant expression.
+//   @AbstractClassWithConstructor()
+//    ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:10:34: Error: Constant evaluation error:
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:10:34: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:10:12: Context: While analyzing:
+// const bool notBarFromEnvOrNull = !barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:11:49: Error: Constant evaluation error:
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//                                                 ^
+// pkg/front_end/testcases/general/constants/various.dart:11:32: Context: Expected constant 'null' to be of type 'bool', but was of type 'Null'.
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//                                ^
+// pkg/front_end/testcases/general/constants/various.dart:11:12: Context: While analyzing:
+// const bool conditionalOnNull = barFromEnvOrNull ? true : false;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:16:41: Error: Constant evaluation error:
+// const bool andOnNull = barFromEnvOrNull && true;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:16:41: Context: The method '&&' can't be invoked on 'null' in a constant expression.
+// const bool andOnNull = barFromEnvOrNull && true;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:16:12: Context: While analyzing:
+// const bool andOnNull = barFromEnvOrNull && true;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:17:30: Error: Constant evaluation error:
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:17:30: Context: Binary operator '&&' on 'true' requires operand of type 'bool', but was of type 'Null'.
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:17:12: Context: While analyzing:
+// const bool andOnNull2 = true && barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:18:40: Error: Constant evaluation error:
+// const bool orOnNull = barFromEnvOrNull || true;
+//                                        ^
+// pkg/front_end/testcases/general/constants/various.dart:18:40: Context: The method '||' can't be invoked on 'null' in a constant expression.
+// const bool orOnNull = barFromEnvOrNull || true;
+//                                        ^
+// pkg/front_end/testcases/general/constants/various.dart:18:12: Context: While analyzing:
+// const bool orOnNull = barFromEnvOrNull || true;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:19:41: Error: Constant evaluation error:
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:19:41: Context: The method '||' can't be invoked on 'null' in a constant expression.
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:19:12: Context: While analyzing:
+// const bool orOnNull2 = barFromEnvOrNull || false;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:21:30: Error: Constant evaluation error:
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:21:30: Context: Binary operator '||' on 'false' requires operand of type 'bool', but was of type 'Null'.
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//                              ^
+// pkg/front_end/testcases/general/constants/various.dart:21:12: Context: While analyzing:
+// const bool orOnNull4 = false || barFromEnvOrNull;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:29:11: Error: Constant evaluation error:
+//     const String.fromEnvironment(barFromEnvOrNullString);
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:29:11: Context: Null value during constant evaluation.
+//     const String.fromEnvironment(barFromEnvOrNullString);
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:28:14: Context: While analyzing:
+// const String nullFromEnvString =
+//              ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:36:36: Error: Constant evaluation error:
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//                                    ^
+// pkg/front_end/testcases/general/constants/various.dart:36:36: Context: Null value during constant evaluation.
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//                                    ^
+// pkg/front_end/testcases/general/constants/various.dart:36:12: Context: While analyzing:
+// const bool nullFromEnvBool = const bool.fromEnvironment(barFromEnvOrNullString);
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:43:34: Error: Constant evaluation error:
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:43:34: Context: Null value during constant evaluation.
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:43:11: Context: While analyzing:
+// const int nullFromEnvInt = const int.fromEnvironment(barFromEnvOrNullString);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:64:37: Error: Constant evaluation error:
+// const binaryOnDouble = willBeDouble << 2;
+//                                     ^
+// pkg/front_end/testcases/general/constants/various.dart:64:37: Context: Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.
+// const binaryOnDouble = willBeDouble << 2;
+//                                     ^
+// pkg/front_end/testcases/general/constants/various.dart:64:7: Context: While analyzing:
+// const binaryOnDouble = willBeDouble << 2;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:66:44: Error: Constant evaluation error:
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:66:44: Context: Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:66:7: Context: While analyzing:
+// const binaryOnIntWithDoubleBad = willBeInt << willBeDouble;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:68:41: Error: Constant evaluation error:
+// const binaryOnIntWithString = willBeInt << "hello";
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:68:41: Context: Binary operator '<<' on '42' requires operand of type 'num', but was of type 'String'.
+// const binaryOnIntWithString = willBeInt << "hello";
+//                                         ^
+// pkg/front_end/testcases/general/constants/various.dart:68:7: Context: While analyzing:
+// const binaryOnIntWithString = willBeInt << "hello";
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:72:44: Error: Constant evaluation error:
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:72:44: Context: Binary operator '+' on '"hello"' requires operand of type 'String', but was of type 'int'.
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//                                            ^
+// pkg/front_end/testcases/general/constants/various.dart:72:7: Context: While analyzing:
+// const binaryOnStringWithInt = willBeString + willBeInt;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:73:50: Error: Constant evaluation error:
+// const binaryOnStringWithStringBad = willBeString - " world";
+//                                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:73:50: Context: The method '-' can't be invoked on '"hello"' in a constant expression.
+// const binaryOnStringWithStringBad = willBeString - " world";
+//                                                  ^
+// pkg/front_end/testcases/general/constants/various.dart:73:7: Context: While analyzing:
+// const binaryOnStringWithStringBad = willBeString - " world";
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:78:13: Error: Constant evaluation error:
+// const x3 = x--;
+//             ^
+// pkg/front_end/testcases/general/constants/various.dart:78:12: Context: The invocation of 'x' is not allowed in a constant expression.
+// const x3 = x--;
+//            ^
+// pkg/front_end/testcases/general/constants/various.dart:78:7: Context: While analyzing:
+// const x3 = x--;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:79:13: Error: Constant evaluation error:
+// const x4 = x++;
+//             ^
+// pkg/front_end/testcases/general/constants/various.dart:79:12: Context: The invocation of 'x' is not allowed in a constant expression.
+// const x4 = x++;
+//            ^
+// pkg/front_end/testcases/general/constants/various.dart:79:7: Context: While analyzing:
+// const x4 = x++;
+//       ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:129:29: Error: Constant evaluation error:
+// const bool foosEqual = foo1 == foo2;
+//                             ^
+// pkg/front_end/testcases/general/constants/various.dart:129:29: Context: Binary operator '==' requires receiver constant 'Foo {x: 42, y: 5}' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/constants/various.dart'.
+// const bool foosEqual = foo1 == foo2;
+//                             ^
+// pkg/front_end/testcases/general/constants/various.dart:129:12: Context: While analyzing:
+// const bool foosEqual = foo1 == foo2;
+//            ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:135:26: Error: Constant evaluation error:
+// const int circularity1 = circularity2;
+//                          ^
+// pkg/front_end/testcases/general/constants/various.dart:135:26: Context: Constant expression depends on itself.
+// const int circularity1 = circularity2;
+//                          ^
+// pkg/front_end/testcases/general/constants/various.dart:135:11: Context: While analyzing:
+// const int circularity1 = circularity2;
+//           ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:148:11: Error: Constant evaluation error:
+//     const ConstClassWithFailingAssertWithEmptyMessage();
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:144:64: Context: This assertion failed with message: (empty)
+//   const ConstClassWithFailingAssertWithEmptyMessage() : assert(false, "");
+//                                                                ^
+//
+// pkg/front_end/testcases/general/constants/various.dart:185:11: Error: Constant evaluation error:
+//     const ConstClassWithFinalFields2();
+//           ^
+// pkg/front_end/testcases/general/constants/various.dart:181:14: Context: The invocation of 'x' is not allowed in a constant expression.
+//   final z2 = x;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class AbstractClass extends core::Object {
+  synthetic constructor •() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class AbstractClassWithConstructor extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::AbstractClassWithConstructor*
+    : super core::Object::•()
+    ;
+  abstract method foo() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NotAbstractClass extends core::Object {
+  @invalid-expression "Not a constant expression."
+  field core::Object* foo = null;
+  @invalid-expression "Not a constant expression."
+  field core::Object* bar = null;
+  synthetic constructor •() → self::NotAbstractClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  final field core::int* y;
+  const constructor •(core::int* x) → self::Foo*
+    : self::Foo::x = x, self::Foo::y = "hello".{core::String::length}{core::int*}, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ExtendsFoo1 extends self::Foo {
+  synthetic constructor •() → self::ExtendsFoo1*
+    : invalid-initializer
+    ;
+}
+class ExtendsFoo2 extends self::Foo /*hasConstConstructor*/  {
+  const constructor •() → self::ExtendsFoo2*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+  const ExtendsFoo2();
+        ^^^^^^^^^^^"
+    ;
+}
+class ConstClassWithFailingAssertWithEmptyMessage extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::ConstClassWithFailingAssertWithEmptyMessage*
+    : assert(false, ""), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithTypeArguments<E extends core::Object* = dynamic, F extends core::Object* = dynamic, G extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(self::ClassWithTypeArguments::E* e, self::ClassWithTypeArguments::F* f, self::ClassWithTypeArguments::G* g) → self::ClassWithTypeArguments<self::ClassWithTypeArguments::E*, self::ClassWithTypeArguments::F*, self::ClassWithTypeArguments::G*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithNonEmptyConstConstructor extends core::Object {
+  constructor •() → self::ClassWithNonEmptyConstConstructor*
+    : super core::Object::•() {
+    core::print("hello");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ConstClassWithFinalFields1 extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x = 1;
+  const constructor •() → self::ConstClassWithFinalFields1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ConstClassWithFinalFields2 extends core::Object /*hasConstConstructor*/  {
+  final field core::int* y = 1;
+  final field invalid-type z1 = this.{self::ConstClassWithFinalFields2::y}{core::int*};
+  final field core::int* z2 = self::x;
+  const constructor •() → self::ConstClassWithFinalFields2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::bool* barFromEnv = #C1;
+static const field core::bool* hasBarEnv = #C1;
+static const field core::bool* barFromEnvOrNull = #C2;
+static const field core::bool* notBarFromEnvOrNull = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field core::bool* conditionalOnNull = invalid-expression "Expected constant 'null' to be of type 'bool', but was of type 'Null'.";
+static const field core::bool* nullAwareOnNullTrue = #C3;
+static const field core::bool* nullAwareOnNullFalse = #C1;
+static const field core::bool* andOnFalse = #C1;
+static const field core::bool* andOnFalse2 = #C1;
+static const field core::bool* andOnNull = invalid-expression "The method '&&' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* andOnNull2 = invalid-expression "Binary operator '&&' on 'true' requires operand of type 'bool', but was of type 'Null'.";
+static const field core::bool* orOnNull = invalid-expression "The method '||' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* orOnNull2 = invalid-expression "The method '||' can't be invoked on 'null' in a constant expression.";
+static const field core::bool* orOnNull3 = #C3;
+static const field core::bool* orOnNull4 = invalid-expression "Binary operator '||' on 'false' requires operand of type 'bool', but was of type 'Null'.";
+static const field core::String* barFromEnvString = #C4;
+static const field core::String* barFromEnvOrNullString = #C2;
+static const field core::String* barFromEnvOrActualString = #C5;
+static const field core::String* nullFromEnvString = invalid-expression "Null value during constant evaluation.";
+static const field core::bool* barFromEnvBool = #C1;
+static const field core::bool* barFromEnvOrNullBool = #C2;
+static const field core::bool* barFromEnvOrActualBool = #C3;
+static const field core::bool* nullFromEnvBool = invalid-expression "Null value during constant evaluation.";
+static const field core::int* barFromEnvInt = #C6;
+static const field core::int* barFromEnvOrNullInt = #C2;
+static const field core::int* barFromEnvOrActualInt = #C7;
+static const field core::int* nullFromEnvInt = invalid-expression "Null value during constant evaluation.";
+static const field core::bool* bazFromEnv = #C1;
+static const field core::bool* hasBazEnv = #C3;
+static const field core::int* bazFromEnvAsInt = #C7;
+static const field core::String* bazFromEnvAsString = #C8;
+static const field core::bool* bazTrueFromEnv = #C3;
+static const field core::bool* bazFalseFromEnv = #C1;
+static const field core::bool* trueBool = #C3;
+static const field core::bool* falseBool = #C1;
+static const field core::bool* binaryOnBoolCaret = #C3;
+static const field core::bool* binaryOnBoolAmpersand = #C1;
+static const field core::bool* binaryOnBoolBar = #C3;
+static const field core::bool* binaryOnBoolBar2 = #C3;
+static const field dynamic willBeDouble = #C9;
+static const field dynamic binaryOnDouble = invalid-expression "Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.";
+static const field dynamic willBeInt = #C7;
+static const field dynamic binaryOnIntWithDoubleBad = invalid-expression "Binary operator '<<' on '42.42' requires operand of type 'int', but was of type 'double'.";
+static const field dynamic binaryOnIntWithDoubleOK = #C10;
+static const field dynamic binaryOnIntWithString = invalid-expression "Binary operator '<<' on '42' requires operand of type 'num', but was of type 'String'.";
+static const field dynamic willBeString = #C5;
+static const field dynamic binaryOnStringWithStringOK = #C11;
+static const field dynamic binaryOnStringWithInt = invalid-expression "Binary operator '+' on '\"hello\"' requires operand of type 'String', but was of type 'int'.";
+static const field dynamic binaryOnStringWithStringBad = invalid-expression "The method '-' can't be invoked on '\"hello\"' in a constant expression.";
+static field core::int* x = 1;
+static const field core::int* x1 = invalid-expression "Not a constant expression.";
+static const field core::int* x2 = invalid-expression "Not a constant expression.";
+static const field core::int* x3 = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::int* x4 = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::int* y = #C12;
+static const field invalid-type y1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:82:14: Error: Setter not found: 'y'.
+const y1 = --y;
+             ^";
+static const field invalid-type y2 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:83:14: Error: Setter not found: 'y'.
+const y2 = ++y;
+             ^";
+static const field core::int* y3 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:84:12: Error: Setter not found: 'y'.
+const y3 = y--;
+           ^";
+static const field core::int* y4 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:85:12: Error: Setter not found: 'y'.
+const y4 = y++;
+           ^";
+static field self::AbstractClassWithConstructor* abstractClassWithConstructor = throw invalid-expression "pkg/front_end/testcases/general/constants/various.dart:96:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+    const AbstractClassWithConstructor();
+          ^";
+static const field self::ExtendsFoo1* extendsFoo1 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:118:39: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+const ExtendsFoo1 extendsFoo1 = const ExtendsFoo1();
+                                      ^^^^^^^^^^^";
+static const field self::ExtendsFoo2* extendsFoo2 = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:121:9: Error: The superclass, 'Foo', has no unnamed constructor that takes no arguments.
+  const ExtendsFoo2();
+        ^^^^^^^^^^^";
+static const field self::Foo* foo1 = #C14;
+static const field self::Foo* foo2 = #C14;
+static const field core::bool* foosIdentical = #C3;
+static const field core::bool* foosEqual = invalid-expression "Binary operator '==' requires receiver constant 'Foo {x: 42, y: 5}' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/constants/various.dart'.";
+static const field core::Symbol* barFoo = #C15;
+static const field core::Symbol* barFooEqual = #C16;
+static const field core::Symbol* tripleShiftSymbol = #C17;
+static const field core::Symbol* symbolWithDots = #C18;
+static const field core::int* circularity1 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity2 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity3 = invalid-expression "Constant expression depends on itself.";
+static const field core::int* circularity4 = invalid-expression "Constant expression depends on itself.";
+static const field invalid-type function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
+const function_const = () {};
+                       ^^";
+static field () →* Null function_var = () → Null {};
+static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage = invalid-expression "This assertion failed with message: (empty)";
+static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = #C19;
+static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = #C20;
+static const field core::bool* classWithTypeArgumentsIdentical = #C1;
+static field self::ClassWithNonEmptyConstConstructor* classWithNonEmptyConstConstructor = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:168:11: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+    const ClassWithNonEmptyConstConstructor();
+          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+static field self::ConstClassWithFinalFields2* constClassWithFinalFields = invalid-expression "The invocation of 'x' is not allowed in a constant expression.";
+static const field core::bool* zeroPointZeroIdentical = #C3;
+static const field core::bool* zeroPointZeroIdenticalToZero = #C1;
+static const field core::bool* zeroIdenticalToZeroPointZero = #C1;
+static const field core::bool* nanIdentical = #C3;
+static const field core::bool* zeroPointZeroEqual = #C3;
+static const field core::bool* zeroPointZeroEqualToZero = #C3;
+static const field core::bool* zeroEqualToZeroPointZero = #C3;
+static const field core::bool* nanEqual = #C1;
+static const field dynamic willBecomeNull = #C2;
+static const field (core::int*) →* core::int* willBecomeNullToo = #C2;
+static const field (core::int*) →* core::int* partialInstantiation = #C22;
+static const field core::bool* yBool = #C3;
+static const field core::bool* zBool = #C1;
+static const field core::Object* maybeInt = #C3;
+static const field core::bool* isItInt = #C1;
+static const field core::Object* maybeInt2 = #C3;
+static const field core::bool* isItInt2 = #C1;
+static const field core::int* maybeInt3 = #C2;
+static const field core::bool* isItInt3 = #C1;
+static method id1<T extends core::Object* = dynamic>(self::id1::T* t) → self::id1::T*
+  return t;
+static method id2<T extends core::Object* = dynamic>(self::id2::T* t) → self::id2::T*
+  return t;
+static method main() → dynamic {
+  core::print(#C1);
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = false
+  #C2 = null
+  #C3 = true
+  #C4 = ""
+  #C5 = "hello"
+  #C6 = 0
+  #C7 = 42
+  #C8 = "42"
+  #C9 = 42.42
+  #C10 = 84.42
+  #C11 = "hello world"
+  #C12 = 1
+  #C13 = 5
+  #C14 = self::Foo {x:#C7, y:#C13}
+  #C15 = #Foo
+  #C16 = #Foo=
+  #C17 = #>>>
+  #C18 = #I.Have.Dots
+  #C19 = self::ClassWithTypeArguments<core::int*, core::int*, core::int*> {}
+  #C20 = self::ClassWithTypeArguments<dynamic, dynamic, dynamic> {}
+  #C21 = static-tearoff self::id1
+  #C22 = instantiation #C21 <core::int*>
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///various.dart:
+- ExtendsFoo2. (from org-dartlang-testcase:///various.dart:121:9)
+- Foo. (from org-dartlang-testcase:///various.dart:109:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- ConstClassWithFailingAssertWithEmptyMessage. (from org-dartlang-testcase:///various.dart:144:9)
+- ClassWithTypeArguments. (from org-dartlang-testcase:///various.dart:151:9)
+- ConstClassWithFinalFields2. (from org-dartlang-testcase:///various.dart:177:9)
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.modular.expect
new file mode 100644
index 0000000..9f6cb29
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.modular.expect
@@ -0,0 +1,137 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   const Foo.withInvalidCondition(this.x) : assert(x);
+//                                                   ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:26:24: Error: Constant evaluation error:
+// const Foo foo2 = const Foo(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:8:18: Context: This assertion failed with message: x is not positive
+//       : assert(x > 0, "x is not positive"),
+//                  ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:26:11: Context: While analyzing:
+// const Foo foo2 = const Foo(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:24: Error: Constant evaluation error:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+//   const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
+//                                                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:11: Context: While analyzing:
+// const Foo foo4 = const Foo.withInvalidMessage(42);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:30:24: Error: Constant evaluation error:
+// const Bar bar1 = const Bar.withMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:21:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:30:11: Context: While analyzing:
+// const Bar bar1 = const Bar.withMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:31:24: Error: Constant evaluation error:
+// const Bar bar2 = const Bar.withMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:21:44: Context: This assertion failed with message: x is not negative
+//   const Bar.withMessage(this.x) : assert(x < 0, "x is not negative");
+//                                            ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:31:11: Context: While analyzing:
+// const Bar bar2 = const Bar.withMessage(0);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:32:24: Error: Constant evaluation error:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:22:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:32:11: Context: While analyzing:
+// const Bar bar3 = const Bar.withoutMessage(1);
+//           ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:33:24: Error: Constant evaluation error:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//                        ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:22:47: Context: This assertion failed.
+//   const Bar.withoutMessage(this.x) : assert(x < 0);
+//                                               ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:33:11: Context: While analyzing:
+// const Bar bar4 = const Bar.withoutMessage(0);
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor •(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::>}(0){(core::num) → core::bool}, "x is not positive"), assert(x.{core::num::>}(0){(core::num) → core::bool}), assert(#C2 =={core::Object::==}{(core::Object) → core::bool} false, "foo was ${#C3}"), assert(#C4 =={core::Object::==}{(core::Object) → core::bool} false), super core::Object::•()
+    ;
+  const constructor withMessage(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::<}(0){(core::num) → core::bool}, "btw foo was ${#C5}"), super core::Object::•()
+    ;
+  const constructor withInvalidMessage(core::int x) → self::Foo
+    : self::Foo::x = x, assert(x.{core::num::<}(0){(core::num) → core::bool}, x), super core::Object::•()
+    ;
+  const constructor withInvalidCondition(core::int x) → self::Foo
+    : self::Foo::x = x, assert(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^" in x as{TypeError,ForNonNullableByDefault} core::bool), super core::Object::•()
+    ;
+}
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor withMessage(core::int x) → self::Bar
+    : self::Bar::x = x, assert(x.{core::num::<}(0){(core::num) → core::bool}, "x is not negative"), super core::Object::•()
+    ;
+  const constructor withoutMessage(core::int x) → self::Bar
+    : self::Bar::x = x, assert(x.{core::num::<}(0){(core::num) → core::bool}), super core::Object::•()
+    ;
+}
+static const field self::Foo foo1 = #C9;
+static const field self::Foo foo2 = invalid-expression "This assertion failed with message: x is not positive";
+static const field self::Foo foo3 = #C12;
+static const field self::Foo foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo foo5 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  const Foo.withInvalidCondition(this.x) : assert(x);
+                                                  ^";
+static const field self::Bar bar1 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar bar2 = invalid-expression "This assertion failed with message: x is not negative";
+static const field self::Bar bar3 = invalid-expression "This assertion failed.";
+static const field self::Bar bar4 = invalid-expression "This assertion failed.";
+static method main() → dynamic {
+  core::print(#C9);
+}
+
+constants  {
+  #C1 = "foo"
+  #C2 = eval const core::bool::fromEnvironment(#C1)
+  #C3 = eval const core::bool::fromEnvironment(#C1)
+  #C4 = eval const core::bool::fromEnvironment(#C1)
+  #C5 = eval const core::bool::fromEnvironment(#C1)
+  #C6 = 1
+  #C7 = false
+  #C8 = "foo was "
+  #C9 = eval self::Foo{x:#C6, assert(const core::bool::fromEnvironment(#C1) =={core::Object::==}{(core::Object) → core::bool} #C7, "${#C8}${const core::bool::fromEnvironment(#C1)}"), assert(const core::bool::fromEnvironment(#C1) =={core::Object::==}{(core::Object) → core::bool} #C7)}
+  #C10 = 42
+  #C11 = "btw foo was "
+  #C12 = eval self::Foo{x:#C10, assert(#C7, "${#C11}${const core::bool::fromEnvironment(#C1)}")}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_asserts.dart:
+- Foo. (from org-dartlang-testcase:///const_asserts.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Foo.withMessage (from org-dartlang-testcase:///const_asserts.dart:13:9)
+- Foo.withInvalidMessage (from org-dartlang-testcase:///const_asserts.dart:15:9)
+- Foo.withInvalidCondition (from org-dartlang-testcase:///const_asserts.dart:16:9)
+- Bar.withMessage (from org-dartlang-testcase:///const_asserts.dart:21:9)
+- Bar.withoutMessage (from org-dartlang-testcase:///const_asserts.dart:22:9)
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.weak.modular.expect
new file mode 100644
index 0000000..8044a08
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections.dart:27:7: Error: Expected 2 type arguments.
+// const Map<bool> MapWithUnevaluated = {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::bool> listWithUnevaluated = #C5;
+static const field core::List<core::bool> listWithUnevaluatedSpread = #C8;
+static const field core::Set<core::bool> setWithUnevaluated = #C10;
+static const field core::Set<core::bool> setWithUnevaluatedSpread = #C12;
+static const field core::List<core::int> a = #C13;
+static const field core::List<core::int?> b = #C14;
+static const field core::Set<core::List<core::int?>> setNotAgnosticOK = #C15;
+static const field invalid-type MapWithUnevaluated = #C16;
+static const field core::Map<core::List<core::int?>, core::int> mapNotAgnosticOK = #C19;
+static method main() → dynamic {
+  core::print(#C5);
+  core::print(#C8);
+  core::print(#C10);
+  core::print(#C12);
+  core::print(<core::String>{"hello"});
+  core::print(#C21);
+}
+
+constants  {
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = true
+  #C4 = <core::bool*>[#C3]
+  #C5 = eval const <dynamic>[const core::bool::fromEnvironment(#C1)] + const <dynamic>[const core::bool::fromEnvironment(#C2)] + #C4
+  #C6 = false
+  #C7 = <core::bool*>[#C6]
+  #C8 = eval #C4 + const <dynamic>[const core::bool::fromEnvironment(#C1)] + const <dynamic>[const core::bool::fromEnvironment(#C2)] + #C4 + #C7
+  #C9 = <core::bool*>{#C3}
+  #C10 = eval const <dynamic>{const core::bool::fromEnvironment(#C1)} + const <dynamic>{const core::bool::fromEnvironment(#C2)} + #C9
+  #C11 = <core::bool*>{#C6}
+  #C12 = eval #C9 + const <dynamic>{const core::bool::fromEnvironment(#C1)} + const <dynamic>{const core::bool::fromEnvironment(#C2)} + #C9 + #C11
+  #C13 = <core::int*>[]
+  #C14 = <core::int?>[]
+  #C15 = <core::List<core::int?>*>{#C13, #C14}
+  #C16 = eval const <dynamic, dynamic>{const core::bool::fromEnvironment(#C1): const core::bool::fromEnvironment(#C2)}
+  #C17 = 0
+  #C18 = 1
+  #C19 = <core::List<core::int?>*, core::int*>{#C13:#C17, #C14:#C18)
+  #C20 = "hello"
+  #C21 = <core::String*>{#C20}
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.weak.modular.expect
new file mode 100644
index 0000000..19a8cfb
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_collections_2.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::String> listWithUnevaluatedUnevaluatedFirst = #C6;
+static const field core::List<core::String> listWithUnevaluatedUnevaluatedMiddle = #C14;
+static const field core::Set<core::String> setWithUnevaluatedUnevaluatedFirst = #C16;
+static const field core::Set<core::String> setWithUnevaluatedUnevaluatedMiddle = #C19;
+static const field core::Map<core::String, core::int> mapWithUnevaluatedUnevaluatedFirst = #C22;
+static const field core::Map<core::String, core::int> mapWithUnevaluatedUnevaluatedMiddle = #C25;
+
+constants  {
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = "hello"
+  #C4 = "world"
+  #C5 = <core::String*>[#C3, #C4]
+  #C6 = eval const <dynamic>[const core::String::fromEnvironment(#C1)] + const <dynamic>[const core::String::fromEnvironment(#C2)] + #C5
+  #C7 = "A"
+  #C8 = "few"
+  #C9 = "strings"
+  #C10 = <core::String*>[#C7, #C8, #C9]
+  #C11 = "and"
+  #C12 = "more"
+  #C13 = <core::String*>[#C3, #C4, #C11, #C12]
+  #C14 = eval #C10 + const <dynamic>[const core::String::fromEnvironment(#C1)] + const <dynamic>[const core::String::fromEnvironment(#C2)] + #C13
+  #C15 = <core::String*>{#C3, #C4}
+  #C16 = eval const <dynamic>{const core::String::fromEnvironment(#C1)} + #C15
+  #C17 = <core::String*>{#C7, #C8, #C9}
+  #C18 = <core::String*>{#C3, #C4, #C11, #C12}
+  #C19 = eval #C17 + const <dynamic>{const core::String::fromEnvironment(#C1)} + #C18
+  #C20 = 42
+  #C21 = <core::String*, core::int*>{#C3:#C20, #C4:#C20)
+  #C22 = eval const <dynamic, dynamic>{const core::String::fromEnvironment(#C1): #C20} + #C21
+  #C23 = <core::String*, core::int*>{#C7:#C20, #C8:#C20, #C9:#C20)
+  #C24 = <core::String*, core::int*>{#C3:#C20, #C4:#C20, #C11:#C20, #C12:#C20)
+  #C25 = eval #C23 + const <dynamic, dynamic>{const core::String::fromEnvironment(#C1): #C20} + #C24
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.weak.modular.expect
new file mode 100644
index 0000000..8a84689
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/many_fields_pointing_to_previous_field.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::List<core::String> original = #C11;
+static const field core::List<core::String> copy1 = #C11;
+static const field core::List<core::String> copy2 = #C11;
+static const field core::List<core::String> copy3 = #C11;
+static const field core::List<core::String> copy4 = #C11;
+static const field core::List<core::String> copy5 = #C11;
+static const field core::List<core::String> copy6 = #C11;
+static const field core::List<core::String> copy7 = #C11;
+static const field core::List<core::String> copy8 = #C11;
+static const field core::List<core::String> copy9 = #C11;
+static const field core::List<core::String> copy10 = #C11;
+static const field core::List<core::String> copy11 = #C11;
+static const field core::List<core::String> copy12 = #C11;
+static const field core::List<core::String> copy13 = #C11;
+static const field core::List<core::String> copy14 = #C11;
+static const field core::List<core::String> copy15 = #C11;
+static const field core::List<core::String> copy16 = #C11;
+static const field core::List<core::String> copy17 = #C11;
+static const field core::List<core::String> copy18 = #C11;
+static const field core::List<core::String> copy19 = #C11;
+static const field core::List<core::String> copy20 = #C11;
+static const field core::List<core::String> copy21 = #C11;
+static const field core::List<core::String> copy22 = #C11;
+static const field core::List<core::String> copy23 = #C11;
+static const field core::List<core::String> copy24 = #C11;
+static const field core::List<core::String> copy25 = #C11;
+static const field core::List<core::String> copy26 = #C11;
+static const field core::List<core::String> copy27 = #C11;
+static const field core::List<core::String> copy28 = #C11;
+static const field core::List<core::String> copy29 = #C11;
+static const field core::List<core::String> copy30 = #C11;
+static const field core::List<core::String> copy31 = #C11;
+static const field core::List<core::String> copy32 = #C11;
+static const field core::List<core::String> copy33 = #C11;
+static const field core::List<core::String> copy34 = #C11;
+static const field core::List<core::String> copy35 = #C11;
+static const field core::List<core::String> copy36 = #C11;
+static const field core::List<core::String> copy37 = #C11;
+static const field core::List<core::String> copy38 = #C11;
+static const field core::List<core::String> copy39 = #C11;
+static const field core::List<core::String> copy40 = #C11;
+static const field core::List<core::String> copy41 = #C11;
+static const field core::List<core::String> copy42 = #C11;
+static const field core::List<core::String> copy43 = #C11;
+static const field core::List<core::String> copy44 = #C11;
+static const field core::List<core::String> copy45 = #C11;
+static const field core::List<core::String> copy46 = #C11;
+static const field core::List<core::String> copy47 = #C11;
+static const field core::List<core::String> copy48 = #C11;
+static const field core::List<core::String> copy49 = #C11;
+static const field core::List<core::String> copy50 = #C11;
+
+constants  {
+  #C1 = "lots"
+  #C2 = "of"
+  #C3 = "strings"
+  #C4 = <core::String*>[#C1, #C2, #C3]
+  #C5 = "original"
+  #C6 = "that"
+  #C7 = "are"
+  #C8 = "already"
+  #C9 = "constants"
+  #C10 = <core::String*>[#C6, #C7, #C8, #C9]
+  #C11 = eval #C4 + const <dynamic>[const core::String::fromEnvironment(#C5)] + #C10
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.weak.modular.expect
new file mode 100644
index 0000000..9505b07
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/rudimentary_test_01.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int foo = #C1;
+static const field core::String bar = #C6;
+static const field core::bool baz = #C7;
+static const field core::Symbol blaSymbol = #C8;
+static method main() → dynamic {
+  self::_x();
+  #C10;
+  core::print(#C6);
+}
+static method _x() → void {
+  core::print(#C1);
+  core::print(#C6);
+}
+
+constants  {
+  #C1 = 1764
+  #C2 = "hello "
+  #C3 = "baz"
+  #C4 = "world"
+  #C5 = "!"
+  #C6 = eval "${#C2}${const core::String::fromEnvironment(#C3, defaultValue: #C4)}${#C5}"
+  #C7 = true
+  #C8 = #org-dartlang-testcase:///rudimentary_test_01.dart::_x
+  #C9 = "foo"
+  #C10 = eval const core::bool::fromEnvironment(#C9)
+}
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.modular.expect
new file mode 100644
index 0000000..d340989
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.modular.expect
@@ -0,0 +1,255 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:27:3: Error: Only static fields can be declared as const.
+// Try using 'final' instead of 'const', or adding the keyword 'static'.
+//   const bool initialized =
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:25: Error: 'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.
+// Try moving the constant from the deferred library, or removing 'deferred' from the import.
+//
+// const fromDeferredLib = lib.x;
+//                         ^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:14:30: Warning: Operand of null-aware operation '??' has type 'bool' which excludes null.
+// const bool nullAwareOnNull = barFromEnvOrNull ?? true;
+//                              ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+//  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+//   const Class.method(T t) : this(-t);
+//                                  ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:123:27: Error: The parameter 'named' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// int procedure(int i, {int named}) => i;
+//                           ^^^^^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:31:9: Error: Constructor is marked 'const' so all fields must be final.
+//   const Foo(this.value,
+//         ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:27:14: Context: Field isn't final, but constructor is 'const'.
+//   const bool initialized =
+//              ^
+//
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:29: Error: Constant evaluation error:
+// const fromDeferredLib = lib.x;
+//                             ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:29: Context: 'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.
+// Try moving the constant from the deferred library, or removing 'deferred' from the import.
+//
+// const fromDeferredLib = lib.x;
+//                             ^
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:22:7: Context: While analyzing:
+// const fromDeferredLib = lib.x;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+import "org-dartlang-testcase:///various_lib.dart" deferred as lib;
+
+typedef F = (core::int, {named: core::int}) → core::int;
+class Foo<E extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool saved;
+  final field core::bool saved2;
+  field core::bool initialized = #C3;
+  final field self::Foo::E% value;
+  const constructor •(self::Foo::E% value, {core::bool saved2 = #C4, core::bool x = #C5}) → self::Foo<self::Foo::E%>
+    : self::Foo::value = value, self::Foo::saved2 = saved2, self::Foo::saved = x, super core::Object::•()
+    ;
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator unary-() → self::A
+    return this;
+}
+class B extends core::Object implements self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+  operator unary-() → self::B
+    return this;
+}
+class C extends core::Object implements self::A /*hasConstConstructor*/  {
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator unary-() → self::C
+    return this;
+}
+class Class<T extends self::A> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(self::Class::T t) → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+  const constructor redirect(dynamic t) → self::Class<self::Class::T>
+    : this self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Class::T)
+    ;
+  const constructor method(self::Class::T t) → self::Class<self::Class::T>
+    : this self::Class::•(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^" in t.{self::A::unary-}(){() → self::A} as{TypeError,ForNonNullableByDefault} Never)
+    ;
+}
+class Subclass<T extends self::A> extends self::Class<self::Subclass::T> /*hasConstConstructor*/  {
+  const constructor •(dynamic t) → self::Subclass<self::Subclass::T>
+    : super self::Class::•(t as{TypeError,ForDynamic,ForNonNullableByDefault} self::Subclass::T)
+    ;
+}
+class ConstClassWithF extends core::Object /*hasConstConstructor*/  {
+  final field (core::int, {named: core::int}) → core::int foo;
+  const constructor •((core::int, {named: core::int}) → core::int foo) → self::ConstClassWithF
+    : self::ConstClassWithF::foo = foo, super core::Object::•()
+    ;
+}
+static const field core::bool barFromEnv = #C6;
+static const field core::bool hasBarEnv = #C7;
+static const field core::bool? barFromEnvOrNull0 = #C10;
+static const field core::bool barFromEnvOrNull = #C11;
+static const field core::bool notBarFromEnvOrNull = #C12;
+static const field core::bool conditionalOnNull = #C14;
+static const field core::bool nullAwareOnNull = #C15;
+static const field core::bool andOnNull = #C16;
+static const field core::bool andOnNull2 = #C11;
+static const field core::bool orOnNull = #C17;
+static const field core::bool orOnNull2 = #C18;
+static const field core::bool orOnNull3 = #C8;
+static const field core::bool orOnNull4 = #C11;
+static const field core::int fromDeferredLib = invalid-expression "'lib' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.";
+static const field self::Foo<core::int> x = #C20;
+static const field core::bool? y = #C8;
+static const field core::bool z = #C13;
+static const field core::Object maybeInt = #C21;
+static const field core::bool isItInt = #C22;
+static const field core::Object maybeInt2 = #C8;
+static const field core::bool isItInt2 = #C13;
+static const field core::int? maybeInt3 = #C9;
+static const field core::bool isItInt3 = #C13;
+static const field dynamic listOfNull = #C23;
+static const field core::bool isListOfNull = #C8;
+static const field dynamic listOfInt = #C24;
+static const field core::bool isListOfInt = #C8;
+static const field core::bool isList = #C8;
+static const field dynamic setOfInt = #C25;
+static const field core::bool isSetOfInt = #C8;
+static const field dynamic mapOfInt = #C26;
+static const field core::bool isMapOfInt = #C8;
+static const field dynamic listOfListOfInt = #C27;
+static const field core::bool isListOfListOfInt = #C8;
+static const field dynamic setOfSetOfInt = #C28;
+static const field core::bool isSetOfSetOfInt = #C8;
+static const field dynamic mapOfMapOfInt1 = #C29;
+static const field dynamic mapOfMapOfInt2 = #C30;
+static const field core::bool isMapOfMapOfInt1 = #C8;
+static const field core::bool isMapOfMapOfInt2 = #C8;
+static const field core::Symbol symbolWithUnevaluatedParameter = #C31;
+static const field core::Symbol symbolWithInvalidName = #C32;
+static const field self::Class<self::B>? c0 = #C34;
+static const field self::Class<self::A>? c1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^";
+static const field self::Subclass<self::B>? c2 = #C35;
+static const field self::Class<self::A>? c3 = #C36;
+static const field self::Class<self::B>? c4 = #C37;
+static const field self::Subclass<self::A>? c5 = #C38;
+static const field self::Subclass<self::B>? c6 = #C39;
+static const field core::Type f = #C40;
+static field self::ConstClassWithF constClassWithF1 = #C42;
+static const field self::ConstClassWithF constClassWithF2 = #C42;
+static const field core::bool unevaluatedBool = #C43;
+static const field core::bool notUnevaluatedBool = #C44;
+static const field core::bool? unevaluatedBoolOrNull = #C45;
+static const field core::bool unevaluatedBoolNotNull = #C46;
+static method procedure(core::int i, {core::int named = #C9}) → core::int
+  return i;
+static method main() → dynamic {
+  core::print(#C34);
+  core::print(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
+ - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
+  const Class.method(T t) : this(-t);
+                                 ^");
+  core::print(#C35);
+  core::print(#C36);
+  core::print(#C37);
+  core::print(#C38);
+  core::print(#C39);
+  core::print(#C20);
+  core::print(#C20.{self::Foo::saved}{core::bool});
+  core::print(#C20.{self::Foo::value}{core::int});
+}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+static const field core::int x = #C19;
+
+constants  {
+  #C1 = "foo"
+  #C2 = "bar"
+  #C3 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C4 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C5 = eval const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2))
+  #C6 = eval const core::bool::fromEnvironment(#C2)
+  #C7 = eval const core::bool::hasEnvironment(#C2)
+  #C8 = true
+  #C9 = null
+  #C10 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9
+  #C11 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C12 = eval !const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C13 = false
+  #C14 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) ?{core::bool} #C8 : #C13
+  #C15 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) == null ?{core::bool} #C8 : const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!)
+  #C16 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) && #C8
+  #C17 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || #C8
+  #C18 = eval const core::bool::fromEnvironment(#C2, defaultValue: (const core::bool::fromEnvironment(#C2) ?{core::bool?} #C8 : #C9)!) || #C13
+  #C19 = 42
+  #C20 = eval self::Foo<core::int*>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C19}
+  #C21 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8
+  #C22 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
+  #C23 = <Null>[#C9]
+  #C24 = <core::int*>[#C19]
+  #C25 = <core::int*>{#C19}
+  #C26 = <core::int*, core::int*>{#C19:#C19)
+  #C27 = <core::List<core::int*>*>[#C24]
+  #C28 = <core::Set<core::int*>*>{#C25}
+  #C29 = <core::Map<core::int*, core::int*>*, core::int*>{#C26:#C19)
+  #C30 = <core::int*, core::Map<core::int*, core::int*>*>{#C19:#C26)
+  #C31 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
+  #C32 = #42
+  #C33 = "x"
+  #C34 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
+  #C35 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
+  #C36 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::A>?} #C9 : self::Class<self::A*>{self::A{}}
+  #C37 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
+  #C38 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A*>{(self::A{}) as{ForNonNullableByDefault} self::A*}
+  #C39 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
+  #C40 = TypeLiteralConstant((core::int*, {named: core::int*}) →* core::int*)
+  #C41 = static-tearoff self::procedure
+  #C42 = self::ConstClassWithF {foo:#C41}
+  #C43 = eval const core::bool::fromEnvironment(#C1)
+  #C44 = eval !const core::bool::fromEnvironment(#C1)
+  #C45 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
+  #C46 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///various.dart:
+- C. (from org-dartlang-testcase:///various.dart:92:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Class.redirect (from org-dartlang-testcase:///various.dart:99:9)
+- Class. (from org-dartlang-testcase:///various.dart:98:9)
+- A. (from org-dartlang-testcase:///various.dart:80:9)
+- Class.method (from org-dartlang-testcase:///various.dart:100:9)
+- Subclass. (from org-dartlang-testcase:///various.dart:104:9)
+- B. (from org-dartlang-testcase:///various.dart:86:9)
+- Foo. (from org-dartlang-testcase:///various.dart:31:9)
+- ConstClassWithF. (from org-dartlang-testcase:///various.dart:120:9)
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.modular.expect
new file mode 100644
index 0000000..d4686ed
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various_2.dart.weak.modular.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "various_2_lib.dart" as var;
+
+import "org-dartlang-testcase:///various_2_lib.dart" as lib;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+static const field core::Type objectTypeLiteral = #C1;
+static const field (core::int) → core::int partialInstantiation = #C3;
+static const field var::Class<core::int> instance = #C5;
+static const field var::Class<dynamic> instance2 = #C8;
+static const field core::Type functionTypeLiteral = #C9;
+static const field core::Type genericFunctionTypeLiteral = #C10;
+static const field core::List<core::int> listLiteral = #C11;
+static const field core::List<dynamic> listLiteral2 = #C12;
+static const field core::Set<core::int> setLiteral = #C13;
+static const field core::Set<dynamic> setLiteral2 = #C14;
+static const field core::Map<core::int, core::String> mapLiteral = #C16;
+static const field core::Map<dynamic, dynamic> mapLiteral2 = #C18;
+static const field core::List<core::int> listConcatenation = #C11;
+static const field core::Set<core::int> setConcatenation = #C13;
+static const field core::Map<core::int, core::String> mapConcatenation = #C16;
+static const field core::bool objectTypeLiteralIdentical = #C19;
+static const field core::bool partialInstantiationIdentical = #C21;
+static const field core::bool instanceIdentical = #C19;
+static const field core::bool instance2Identical = #C19;
+static const field core::bool functionTypeLiteralIdentical = #C19;
+static const field core::bool genericFunctionTypeLiteralIdentical = #C19;
+static const field core::bool listLiteralIdentical = #C19;
+static const field core::bool listLiteral2Identical = #C19;
+static const field core::bool setLiteralIdentical = #C19;
+static const field core::bool setLiteral2Identical = #C19;
+static const field core::bool mapLiteralIdentical = #C19;
+static const field core::bool mapLiteral2Identical = #C19;
+static const field core::bool listConcatenationIdentical = #C19;
+static const field core::bool setConcatenationIdentical = #C19;
+static const field core::bool mapConcatenationIdentical = #C19;
+static method main() → dynamic {
+  self::test(#C1, #C1);
+  self::test(#C3, #C22);
+  self::test(#C5, #C5);
+  self::test(#C9, #C9);
+  self::test(#C10, #C10);
+  self::test(#C11, #C11);
+  self::test(#C13, #C13);
+  self::test(#C16, #C16);
+  self::test(#C11, #C11);
+  self::test(#C13, #C13);
+  self::test(#C16, #C16);
+  self::test(true, #C19);
+  self::test(true, #C21);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+  self::test(true, #C19);
+}
+static method test(dynamic expected, dynamic actual) → dynamic {
+  core::print("test(${expected}, ${actual})");
+  if(!core::identical(expected, actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
+
+library /*isNonNullableByDefault*/;
+import self as var;
+import "dart:core" as core;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field var::Class::T% field;
+  const constructor •(var::Class::T% field) → var::Class<var::Class::T%>
+    : var::Class::field = field, super core::Object::•()
+    ;
+}
+static const field core::Type objectTypeLiteral = #C1;
+static const field (core::Object?, core::Object?) → core::bool c2 = #C23;
+static const field (core::int) → core::int partialInstantiation = #C22;
+static const field var::Class<core::int> instance = #C5;
+static const field var::Class<dynamic> instance2 = #C8;
+static const field core::Type functionTypeLiteral = #C9;
+static const field core::Type genericFunctionTypeLiteral = #C10;
+static const field core::List<core::int> listLiteral = #C11;
+static const field core::List<dynamic> listLiteral2 = #C12;
+static const field core::Set<core::int> setLiteral = #C13;
+static const field core::Set<dynamic> setLiteral2 = #C14;
+static const field core::Map<core::int, core::String> mapLiteral = #C16;
+static const field core::Map<dynamic, dynamic> mapLiteral2 = #C18;
+static const field core::List<core::int> listConcatenation = #C11;
+static const field core::Set<core::int> setConcatenation = #C13;
+static const field core::Map<core::int, core::String> mapConcatenation = #C16;
+static method id1<T extends core::Object? = dynamic>(var::id1::T% t) → var::id1::T%
+  return t;
+static method id2<T extends core::Object? = dynamic>(var::id2::T% t) → var::id2::T%
+  return t;
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Object*)
+  #C2 = static-tearoff var::id1
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = 0
+  #C5 = var::Class<core::int*> {field:#C4}
+  #C6 = 42
+  #C7 = <core::int*>[#C6]
+  #C8 = var::Class<dynamic> {field:#C7}
+  #C9 = TypeLiteralConstant((dynamic) →* dynamic)
+  #C10 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T*) →* T*)
+  #C11 = <core::int*>[#C4]
+  #C12 = <dynamic>[#C7]
+  #C13 = <core::int*>{#C4}
+  #C14 = <dynamic>{#C7}
+  #C15 = "foo"
+  #C16 = <core::int*, core::String*>{#C4:#C15)
+  #C17 = null
+  #C18 = <dynamic, dynamic>{#C7:#C15, #C17:#C7)
+  #C19 = true
+  #C20 = static-tearoff var::id2
+  #C21 = eval const core::identical(#C3, const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>)
+  #C22 = eval const core::bool::fromEnvironment(#C15) ?{(core::int) → core::int} #C2<core::int> : #C20<core::int>
+  #C23 = static-tearoff core::identical
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///various_2.dart:
+- Class. (from org-dartlang-testcase:///various_2_lib.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+
+org-dartlang-testcase:///various_2_lib.dart:
+- Class. (from org-dartlang-testcase:///various_2_lib.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.weak.modular.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..2c1402b
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::_Y<self::A::T*>* x;
+  constructor •(self::_Y<self::A::T*>* x) → self::A<self::A::T*>*
+    : self::A::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
+  constructor •() → self::B<self::B::T*>*
+    : super self::A::•(#C1)
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().{self::A::x}{self::_Y<dynamic>*};
+  if(!(x is self::_Y<Null>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}{core::Type*}}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<Null> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_const_inference.dart:
+- _Y. (from org-dartlang-testcase:///constructor_const_inference.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constructor_cycle.dart.weak.modular.expect b/pkg/front_end/testcases/general/constructor_cycle.dart.weak.modular.expect
new file mode 100644
index 0000000..7510955
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_cycle.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constructor_cycle.dart:7:18: Error: Redirecting constructors can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A.bar() : this.foo();
+//                  ^^^
+//
+// pkg/front_end/testcases/general/constructor_cycle.dart:9:9: Error: Redirecting constructors can't be cyclic.
+// Try to have all constructors eventually redirect to a non-redirecting constructor.
+//   A() : this();
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor foo() → self::A*
+    : this self::A::bar()
+    ;
+  constructor bar() → self::A*
+    : this self::A::foo()
+    ;
+  constructor baz() → self::A*
+    : this self::A::foo()
+    ;
+  constructor •() → self::A*
+    : this self::A::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constructor_function_types.dart.weak.modular.expect b/pkg/front_end/testcases/general/constructor_function_types.dart.weak.modular.expect
new file mode 100644
index 0000000..3e5a359
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_function_types.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  constructor •(core::int* x, core::double* y, core::String* s) → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<T extends core::Object* = dynamic, S extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::D::T* x, self::D::S* y) → self::D<self::D::T*, self::D::S*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  new self::A::•();
+  new self::B::•(0, 3.14, "foo");
+  new self::C::•<dynamic>();
+  new self::D::•<core::Object*, core::int*>(null, 3);
+}
diff --git a/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.weak.modular.expect b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.weak.modular.expect
new file mode 100644
index 0000000..69f8ec9
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.weak.modular.expect
@@ -0,0 +1,87 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constructor_initializer_invalid.dart:5:24: Error: Expected an initializer.
+// class C1 { int f; C1() : ; }
+//                        ^
+//
+// pkg/front_end/testcases/general/constructor_initializer_invalid.dart:6:26: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+// class C2 { int f; C2() : f; }
+//                          ^
+//
+// pkg/front_end/testcases/general/constructor_initializer_invalid.dart:7:26: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+// class C3 { int f; C3() : f++; }
+//                          ^
+//
+// pkg/front_end/testcases/general/constructor_initializer_invalid.dart:7:26: Error: Can't access 'this' in a field initializer to read 'f'.
+// class C3 { int f; C3() : f++; }
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C1 extends core::Object {
+  field core::int* f = null;
+  constructor •() → self::C1*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/constructor_initializer_invalid.dart:5:26: Error: This couldn't be parsed.
+class C1 { int f; C1() : ; }
+                         ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+  field core::int* f;
+  constructor •() → self::C2*
+    : self::C2::f = invalid-expression "pkg/front_end/testcases/general/constructor_initializer_invalid.dart:6:27: Error: This couldn't be parsed.
+class C2 { int f; C2() : f; }
+                          ^", super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C3 extends core::Object {
+  field core::int* f = null;
+  constructor •() → self::C3*
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/constructor_initializer_invalid.dart:7:26: Error: This couldn't be parsed.
+class C3 { int f; C3() : f++; }
+                         ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C1* c1 = new self::C1::•();
+  c1.{self::C1::toString}(){() →* core::String*};
+  self::C2* c2 = new self::C2::•();
+  c2.{self::C2::toString}(){() →* core::String*};
+  self::C3* c3 = new self::C3::•();
+  c3.{self::C3::toString}(){() →* core::String*};
+}
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.modular.expect
new file mode 100644
index 0000000..40f37f3
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+  new test::Class::generative();
+  #C2;
+}
+
+library /*isNonNullableByDefault*/;
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C3
+class Class extends core::Object /*hasConstConstructor*/  {
+  final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+  @#C3
+  constructor generative({core::bool defaultValue = #C1}) → test::Class
+    : test::Class::defaultValue = defaultValue, super core::Object::•()
+    ;
+  @#C3
+  const constructor constGenerative({core::bool defaultValue = #C1}) → test::Class
+    : test::Class::defaultValue = defaultValue, super core::Object::•()
+    ;
+}
+
+constants  {
+  #C1 = true
+  #C2 = test::Class {defaultValue:#C1}
+  #C3 = _in::_Patch {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- Class.constGenerative (from org-dartlang-testcase:///patch_lib.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect
index d5e5658..ef6d09e 100644
--- a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect
@@ -17,7 +17,7 @@
 class Class extends core::Object /*hasConstConstructor*/  {
   final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
   @_in::patch
-  external constructor generative({core::bool defaultValue}) → self2::Class
+  external constructor generative({core::bool defaultValue = true}) → self2::Class
     ;
   @_in::patch
   const constructor constGenerative({core::bool defaultValue = true}) → self2::Class
diff --git a/pkg/front_end/testcases/general/continue_inference_after_error.dart.weak.modular.expect b/pkg/front_end/testcases/general/continue_inference_after_error.dart.weak.modular.expect
new file mode 100644
index 0000000..cbaacd1
--- /dev/null
+++ b/pkg/front_end/testcases/general/continue_inference_after_error.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/continue_inference_after_error.dart:10:3: Error: A prefix can't be used as an expression.
+//   lib(new C().missing());
+//   ^^^
+//
+// pkg/front_end/testcases/general/continue_inference_after_error.dart:10:15: Error: The method 'missing' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/continue_inference_after_error.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'missing'.
+//   lib(new C().missing());
+//               ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///continue_inference_after_error_lib.dart" as lib;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/continue_inference_after_error.dart:10:3: Error: A prefix can't be used as an expression.
+  lib(new C().missing());
+  ^^^" in let final core::Object* #t1 = invalid-expression "pkg/front_end/testcases/general/continue_inference_after_error.dart:10:15: Error: The method 'missing' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/continue_inference_after_error.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'missing'.
+  lib(new C().missing());
+              ^^^^^^^" in new self::C::•(){<unresolved>}.missing() in null;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.weak.modular.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.weak.modular.expect
new file mode 100644
index 0000000..ca02ce0
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.weak.modular.expect
@@ -0,0 +1,71 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  final core::List<core::int*>* aList = block {
+    final core::List<core::int*>* #t1 = <core::int*>[1];
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      #t1.{core::List::add}{Invariant}(2){(core::int*) →* void};
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      #t1.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    else
+      #t1.{core::List::add}{Invariant}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* void};
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+        #t1.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+        #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
+    for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t1.{core::List::add}{Invariant}(i){(core::int*) →* void};
+  } =>#t1;
+  final core::Set<core::int*>* aSet = block {
+    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    #t2.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      #t2.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      #t2.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    else
+      #t2.{core::Set::add}{Invariant}(1.{core::int::unary-}(){() →* core::int*}){(core::int*) →* core::bool*};
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+        #t2.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+        #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t2.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+  } =>#t2;
+  final core::Map<core::int*, core::int*>* aMap = block {
+    final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
+    #t3.{core::Map::[]=}{Invariant}(1, 1){(core::int*, core::int*) →* void};
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      #t3.{core::Map::[]=}{Invariant}(2, 2){(core::int*, core::int*) →* void};
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      #t3.{core::Map::[]=}{Invariant}(3, 3){(core::int*, core::int*) →* void};
+    else
+      #t3.{core::Map::[]=}{Invariant}(1.{core::int::unary-}(){() →* core::int*}, 1.{core::int::unary-}(){() →* core::int*}){(core::int*, core::int*) →* void};
+    if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+        #t3.{core::Map::[]=}{Invariant}(4, 4){(core::int*, core::int*) →* void};
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError,ForDynamic} core::bool*)
+        #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
+    for (core::int* i = 11; i.{core::num::<=}(14){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t3.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
+  } =>#t3;
+  core::print(aList);
+  core::print(aSet);
+  core::print(aMap);
+}
+static method oracle() → dynamic
+  return true;
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.modular.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..2ebf6f7
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.weak.modular.expect
@@ -0,0 +1,2158 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                  ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:106:44: Error: Expected ':' after this.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                            ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:107:53: Error: Expected ':' after this.
+//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                                     ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:108:61: Error: Expected ':' after this.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
+//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                   ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                                    ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int>[if (oracle("foo")) "bar"];
+//                            ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int>{if (oracle("foo")) "bar", null};
+//                            ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
+//                                           ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//                                ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//                                ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) ...map];
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map, null};
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                                       ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//                                       ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//                                       ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                                              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                                                             ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                                       ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//                                       ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:106:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                        ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:108:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                        ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   List<int> list20 = [if (42) 42];
+//                           ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   Set<int> set20 = {if (42) 42};
+//                         ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+//   Map<int, int> map30 = {if (42) 42: 42};
+//                              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                                     ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                                   ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+//                                                             ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
+//                                                                           ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                                                 ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                                                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
+//   <int>[for (i in <int>[1]) i];
+//              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
+//   <int>{for (i in <int>[1]) i, null};
+//              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Can't assign to the final variable 'i'.
+// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
+// 	                   ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:246:17: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var list50 = [await for (;;) 42];
+//                 ^^^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:247:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var set50 = {await for (;;) 42, null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:248:16: Error: The keyword 'await' isn't allowed for a normal 'for' statement.
+// Try removing the keyword, or use a for-each statement.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+//                                             ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+//                                             ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                  ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                         ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//                                                                ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//                                                 ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//                                                 ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                             ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                                     ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//                                                ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//                                                ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//                                                     ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                                             ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
+//                                                                                            ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                                              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                                              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
+//                                                                                     ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var list10 = [for (var i in "not iterable") i];
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var set10 = {for (var i in "not iterable") i, null};
+//                              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
+//                              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                                ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                                       ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                               ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                                      ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var list30 = [await for (var i in "not stream") i];
+//                                     ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var set30 = {await for (var i in "not stream") i, null};
+//                                    ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
+//                                    ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                                                          ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                                                                 ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                                                         ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                                                                ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+//                                                         ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
+//                                                                ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+//   var list60 = [for (; "not bool";) 42];
+//                        ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+//   var set60 = {for (; "not bool";) 42, null};
+//                       ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
+//                       ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:255:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>[await for (int i in stream) i];
+//                          ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:256:26: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <int>{await for (int i in stream) i};
+//                          ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:257:34: Error: The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.
+// Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                                  ^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  get foo() → core::int*
+    return 42;
+}
+static method oracle<T extends core::Object* = dynamic>([self::oracle::T* t = #C1]) → dynamic
+  return true;
+static method testIfElement(dynamic dynVar, core::List<core::int*>* listInt, core::List<core::double*>* listDouble, core::Map<core::String*, core::int*>* mapToInt, core::Map<core::String*, core::double*>* mapToDouble) → dynamic {
+  core::List<core::int*>* list10 = block {
+    final core::List<core::int*>* #t1 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t1.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t1;
+  core::Set<core::int*>* set10 = block {
+    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t2.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t2;
+  core::Map<core::String*, core::int*>* map10 = block {
+    final core::Map<core::String*, core::int*>* #t3 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t3.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t3.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t3;
+  core::List<dynamic>* list11 = block {
+    final core::List<dynamic>* #t4 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t4.{core::List::add}{Invariant}(dynVar){(dynamic) →* void};
+  } =>#t4;
+  core::Set<dynamic>* set11 = block {
+    final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t5.{core::Set::add}{Invariant}(dynVar){(dynamic) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t5;
+  core::Map<core::String*, dynamic>* map11 = block {
+    final core::Map<core::String*, dynamic>* #t6 = <core::String*, dynamic>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t6.{core::Map::[]=}{Invariant}("bar", dynVar){(core::String*, dynamic) →* void};
+    #t6.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
+  } =>#t6;
+  core::List<core::List<core::int*>*>* list12 = block {
+    final core::List<core::List<core::int*>*>* #t7 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t7.{core::List::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* void};
+  } =>#t7;
+  core::Set<core::List<core::int*>*>* set12 = block {
+    final core::Set<core::List<core::int*>*>* #t8 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t8.{core::Set::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t8;
+  core::Map<core::String*, core::List<core::int*>*>* map12 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t9 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t9.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]){(core::String*, core::List<core::int*>*) →* void};
+    #t9.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t9;
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t10 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t10.{core::List::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+  } =>#t10;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t11.{core::Set::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+    #t11.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t11;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t12 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t13 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+        #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t12.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t12;
+  core::List<dynamic>* list21 = block {
+    final core::List<dynamic>* #t14 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t14.{core::List::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+  } =>#t14;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t15 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t15.{core::Set::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+    #t15.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t15;
+  core::Map<core::String*, dynamic>* map21 = block {
+    final core::Map<core::String*, dynamic>* #t16 = <core::String*, dynamic>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<core::String*, dynamic>* #t17 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>})
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}{core::String*}, #t17.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+    #t16.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
+  } =>#t16;
+  core::List<core::List<core::int*>*>* list22 = block {
+    final core::List<core::List<core::int*>*>* #t18 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t18.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t18;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t19 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t19.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t19.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t19;
+  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t20 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t21 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{core::String*}, #t21.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t20.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t20;
+  core::List<core::int*>* list30 = block {
+    final core::List<core::int*>* #t22 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t22.{core::List::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+  } =>#t22;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t23 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t23.{core::Set::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+    #t23.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t23;
+  core::Map<core::String*, core::int*>* map30 = block {
+    final core::Map<core::String*, core::int*>* #t24 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t25 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+          #t24.{core::Map::[]=}{Invariant}(#t25.{core::MapEntry::key}{core::String*}, #t25.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t24.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t24;
+  core::List<dynamic>* list31 = block {
+    final core::List<dynamic>* #t26 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t26.{core::List::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+  } =>#t26;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t27 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t27.{core::Set::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+    #t27.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t27;
+  core::Map<core::String*, dynamic>* map31 = block {
+    final core::Map<core::String*, dynamic>* #t28 = <core::String*, dynamic>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, dynamic>* #t29 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>})
+          #t28.{core::Map::[]=}{Invariant}(#t29.{core::MapEntry::key}{core::String*}, #t29.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+    #t28.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
+  } =>#t28;
+  core::List<core::List<core::int*>*>* list33 = block {
+    final core::List<core::List<core::int*>*>* #t30 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t30.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t30;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t31 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t31.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t31.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t31;
+  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t32 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t33 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+          #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t32.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t32;
+  core::List<core::List<core::int*>*>* list40 = block {
+    final core::List<core::List<core::int*>*>* #t34 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t34.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t34;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t35 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t35.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t35.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t35;
+  core::Map<core::String*, core::List<core::int*>*>* map40 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:34: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Map<String, List<int>> map40 = {if (oracle(\"foo\")) ...{\"bar\", []}, \"baz\": null};
+                                 ^";
+  core::List<core::List<core::int*>*>* list41 = block {
+    final core::List<core::List<core::int*>*>* #t36 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t36.{core::List::addAll}{Invariant}( block {
+        final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t37.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+      } =>#t37){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t36;
+  core::Set<core::List<core::int*>*>* set41 = block {
+    final core::Set<core::List<core::int*>*>* #t38 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t38.{core::Set::addAll}{Invariant}( block {
+        final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t39.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+      } =>#t39){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t38.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t38;
+  core::List<core::List<core::int*>*>* list42 = block {
+    final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t40.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t40;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t41 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t41.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t41.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t41;
+  core::Map<core::String*, core::List<core::int*>*>* map42 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t42 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+          #t42.{core::Map::[]=}{Invariant}(#t43.{core::MapEntry::key}{core::String*}, #t43.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t42.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t42;
+  core::List<core::int*>* list50 = block {
+    final core::List<core::int*>* #t44 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t44.{core::List::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+  } =>#t44;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t45 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t45.{core::Set::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+    #t45.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t45;
+  core::Map<core::String*, core::int*>* map50 = block {
+    final core::Map<core::String*, core::int*>* #t46 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t47 in <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+        #t46.{core::Map::[]=}{Invariant}(#t47.{core::MapEntry::key}{core::String*}, #t47.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t46.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t46;
+  core::List<core::int*>* list51 = block {
+    final core::List<core::int*>* #t48 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t48.{core::List::addAll}{Invariant}( block {
+        final core::Set<core::int*>* #t49 = col::LinkedHashSet::•<core::int*>();
+      } =>#t49){(core::Iterable<core::int*>*) →* void};
+  } =>#t48;
+  core::Set<core::int*>* set51 = block {
+    final core::Set<core::int*>* #t50 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t50.{core::Set::addAll}{Invariant}( block {
+        final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
+      } =>#t51){(core::Iterable<core::int*>*) →* void};
+    #t50.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t50;
+  core::List<core::int*>* list52 = block {
+    final core::List<core::int*>* #t52 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t52.{core::List::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+  } =>#t52;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t53 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t53.{core::Set::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+    #t53.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t53;
+  core::Map<core::String*, core::int*>* map52 = block {
+    final core::Map<core::String*, core::int*>* #t54 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t55 in <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+          #t54.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}{core::String*}, #t55.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t54.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t54;
+  core::List<core::List<core::int*>*>* list60 = block {
+    final core::List<core::List<core::int*>*>* #t56 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t56.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t56;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t57 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t57.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t57.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t57;
+  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t58 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t59 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+        #t58.{core::Map::[]=}{Invariant}(#t59.{core::MapEntry::key}{core::String*}, #t59.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t58.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t58;
+  core::List<core::List<core::int*>*>* list61 = block {
+    final core::List<core::List<core::int*>*>* #t60 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t60.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t60;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t61 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t61.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t61.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t61;
+  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t62 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t63 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+          #t62.{core::Map::[]=}{Invariant}(#t63.{core::MapEntry::key}{core::String*}, #t63.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t62.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t62;
+  core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t64 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t64.{core::List::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* void};
+  } =>#t64;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t65 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t65.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+    #t65.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t65;
+  core::List<core::List<core::int*>*>* list71 = block {
+    final core::List<core::List<core::int*>*>* #t66 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t66.{core::List::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* void};
+  } =>#t66;
+  core::Set<core::List<core::int*>*>* set71 = block {
+    final core::Set<core::List<core::int*>*>* #t67 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t67.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+    #t67.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t67;
+  core::List<core::num*>* list80 = block {
+    final core::List<core::num*>* #t68 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t68.{core::List::add}{Invariant}(42){(core::num*) →* void};
+    else
+      #t68.{core::List::add}{Invariant}(3.14){(core::num*) →* void};
+  } =>#t68;
+  core::Set<core::num*>* set80 = block {
+    final core::Set<core::num*>* #t69 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t69.{core::Set::add}{Invariant}(42){(core::num*) →* core::bool*};
+    else
+      #t69.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t69.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
+  } =>#t69;
+  core::Map<core::String*, core::num*>* map80 = block {
+    final core::Map<core::String*, core::num*>* #t70 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t70.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::num*) →* void};
+    else
+      #t70.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t70.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
+  } =>#t70;
+  core::List<core::num*>* list81 = block {
+    final core::List<core::num*>* #t71 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t71.{core::List::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
+    else
+      #t71.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+  } =>#t71;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t72 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t72.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
+    else
+      #t72.{core::Set::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+    #t72.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
+  } =>#t72;
+  core::Map<core::String*, core::num*>* map81 = block {
+    final core::Map<core::String*, core::num*>* #t73 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<core::String*, core::num*>* #t74 in mapToInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
+        #t73.{core::Map::[]=}{Invariant}(#t74.{core::MapEntry::key}{core::String*}, #t74.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+    else
+      for (final core::MapEntry<core::String*, core::num*>* #t75 in mapToDouble.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
+        #t73.{core::Map::[]=}{Invariant}(#t75.{core::MapEntry::key}{core::String*}, #t75.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+    #t73.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
+  } =>#t73;
+  core::List<dynamic>* list82 = block {
+    final core::List<dynamic>* #t76 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t76.{core::List::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
+    else
+      #t76.{core::List::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+  } =>#t76;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t77.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
+    else
+      #t77.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t77.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t77;
+  core::Set<dynamic>* map82 = block {
+    final core::Set<dynamic>* #t78 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t78.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  var map82 = {if (oracle(\"foo\")) ...mapToInt else ...dynVar, null};
+                                     ^"){(dynamic) →* core::bool*};
+    else
+      #t78.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t78.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t78;
+  core::List<core::num*>* list83 = block {
+    final core::List<core::num*>* #t79 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t79.{core::List::add}{Invariant}(42){(core::num*) →* void};
+    else
+      #t79.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+  } =>#t79;
+  core::Set<core::num*>* set83 = block {
+    final core::Set<core::num*>* #t80 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t80.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
+    else
+      #t80.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t80.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
+  } =>#t80;
+  core::Map<core::String*, core::num*>* map83 = block {
+    final core::Map<core::String*, core::num*>* #t81 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<core::String*, core::num*>* #t82 in mapToInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
+        #t81.{core::Map::[]=}{Invariant}(#t82.{core::MapEntry::key}{core::String*}, #t82.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+    else
+      #t81.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t81.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
+  } =>#t81;
+  core::List<core::int*>* list90 = block {
+    final core::List<core::int*>* #t83 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t83.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+  } =>#t83;
+  core::Set<core::int*>* set90 = block {
+    final core::Set<core::int*>* #t84 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t84.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t84.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t84;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t85 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t85.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+    #t85.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t85;
+  core::List<core::int*>* list91 = block {
+    final core::List<core::int*>* #t86 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final dynamic #t87 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t88 = #t87 as{TypeError} core::int*;
+        #t86.{core::List::add}{Invariant}(#t88){(core::int*) →* void};
+      }
+  } =>#t86;
+  core::Set<core::int*>* set91 = block {
+    final core::Set<core::int*>* #t89 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final dynamic #t90 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t91 = #t90 as{TypeError} core::int*;
+        #t89.{core::Set::add}{Invariant}(#t91){(core::int*) →* core::bool*};
+      }
+    #t89.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t89;
+  core::Map<core::String*, core::int*>* map91 = block {
+    final core::Map<core::String*, core::int*>* #t92 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<dynamic, dynamic>* #t93 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}) {
+        final core::String* #t94 = #t93.{core::MapEntry::key}{dynamic} as{TypeError} core::String*;
+        final core::int* #t95 = #t93.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
+        #t92.{core::Map::[]=}{Invariant}(#t94, #t95){(core::String*, core::int*) →* void};
+      }
+    #t92.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t92;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t96 = <core::int*>[];
+    if(dynVar as{TypeError,ForDynamic} core::bool*)
+      #t96.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t96;
+  core::Set<core::int*>* set100 = block {
+    final core::Set<core::int*>* #t97 = col::LinkedHashSet::•<core::int*>();
+    if(dynVar as{TypeError,ForDynamic} core::bool*)
+      #t97.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+  } =>#t97;
+  core::Map<core::int*, core::int*>* map100 = block {
+    final core::Map<core::int*, core::int*>* #t98 = <core::int*, core::int*>{};
+    if(dynVar as{TypeError,ForDynamic} core::bool*)
+      #t98.{core::Map::[]=}{Invariant}(42, 42){(core::int*, core::int*) →* void};
+  } =>#t98;
+}
+static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
+  block {
+    final core::List<core::int*>* #t99 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t99.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int>[if (oracle(\"foo\")) \"bar\"];
+                           ^" in "bar" as{TypeError} core::int*){(core::int*) →* void};
+  } =>#t99;
+  block {
+    final core::Set<core::int*>* #t100 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t100.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int>{if (oracle(\"foo\")) \"bar\", null};
+                           ^" in "bar" as{TypeError} core::int*){(core::int*) →* core::bool*};
+    #t100.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t100;
+  block {
+    final core::Map<core::String*, core::int*>* #t101 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t101.{core::Map::[]=}{Invariant}("bar", invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
+                                          ^" in "bar" as{TypeError} core::int*){(core::String*, core::int*) →* void};
+    #t101.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t101;
+  block {
+    final core::List<core::int*>* #t102 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t102.{core::List::addAll}{Invariant}(<core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int>[if (oracle(\"foo\")) ...[\"bar\"]];
+                               ^" in "bar" as{TypeError} core::int*]){(core::Iterable<core::int*>*) →* void};
+  } =>#t102;
+  block {
+    final core::Set<core::int*>* #t103 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t103.{core::Set::addAll}{Invariant}(<core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
+                               ^" in "bar" as{TypeError} core::int*]){(core::Iterable<core::int*>*) →* void};
+    #t103.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t103;
+  block {
+    final core::Map<core::String*, core::int*>* #t104 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t105 in <core::String*, core::int*>{"bar": invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                              ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+        #t104.{core::Map::[]=}{Invariant}(#t105.{core::MapEntry::key}{core::String*}, #t105.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t104.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t104;
+  block {
+    final core::List<core::int*>* #t106 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t106.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) ...map];
+                              ^"){(core::int*) →* void};
+  } =>#t106;
+  block {
+    final core::Set<core::int*>* #t107 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t107.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map, null};
+                              ^"){(core::int*) →* core::bool*};
+    #t107.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t107;
+  <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
+                                      ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:39: Error: Unexpected type 'List<String>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[\"bar\"], \"baz\": null};
+                                      ^": null};
+  block {
+    final core::List<core::String*>* #t108 = <core::String*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t108.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                              ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
+    else
+      #t108.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                                      ^" in 3.14 as{TypeError} core::String*){(core::String*) →* void};
+  } =>#t108;
+  block {
+    final core::Set<core::String*>* #t109 = col::LinkedHashSet::•<core::String*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t109.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                              ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
+    else
+      #t109.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                                      ^" in 3.14 as{TypeError} core::String*){(core::String*) →* core::bool*};
+    #t109.{core::Set::add}{Invariant}(null){(core::String*) →* core::bool*};
+  } =>#t109;
+  block {
+    final core::Map<core::String*, core::String*>* #t110 = <core::String*, core::String*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t110.{core::Map::[]=}{Invariant}("bar", invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                             ^" in 42 as{TypeError} core::String*){(core::String*, core::String*) →* void};
+    else
+      #t110.{core::Map::[]=}{Invariant}("baz", invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                                            ^" in 3.14 as{TypeError} core::String*){(core::String*, core::String*) →* void};
+    #t110.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::String*) →* void};
+  } =>#t110;
+  block {
+    final core::List<core::int*>* #t111 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t111.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) ...map else 42];
+                              ^"){(core::int*) →* void};
+    else
+      #t111.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t111;
+  block {
+    final core::Set<core::int*>* #t112 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t112.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map else 42, null};
+                              ^"){(core::int*) →* core::bool*};
+    else
+      #t112.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t112.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t112;
+  <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
+                                      ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:39: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) ...[42] else \"bar\": 42, \"baz\": null};
+                                      ^": null};
+  block {
+    final core::List<core::int*>* #t113 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t113.{core::List::add}{Invariant}(42){(core::int*) →* void};
+    else
+      #t113.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:39: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[if (oracle(\"foo\")) 42 else ...map];
+                                      ^"){(core::int*) →* void};
+  } =>#t113;
+  block {
+    final core::Set<core::int*>* #t114 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t114.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{if (oracle(\"foo\")) ...map else 42, null};
+                              ^"){(core::int*) →* core::bool*};
+    else
+      #t114.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t114.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t114;
+  <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
+                                                     ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:54: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": 42 else ...[42], \"baz\": null};
+                                                     ^": null};
+  core::Set<dynamic>* set10 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:106:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Set<dynamic> set10 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                       ^";
+  core::Map<dynamic, dynamic>* map10 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:107:53: Error: Expected ':' after this.
+  Map<dynamic, dynamic> map10 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                                                    ^": null};
+  core::Set<dynamic>* set11 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:108:24: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  Set<dynamic> set11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                       ^";
+  core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
+  Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                                                                     ^": null};
+  core::Map<invalid-type, Null>* map12 = <invalid-type, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+  var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
+                                  ^": null};
+  core::Map<invalid-type, Null>* map13 = <invalid-type, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+  var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
+                                                   ^": null};
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t115 = <core::int*>[];
+    if(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  List<int> list20 = [if (42) 42];
+                          ^" in 42 as{TypeError} core::bool*)
+      #t115.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t115;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t116 = col::LinkedHashSet::•<core::int*>();
+    if(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  Set<int> set20 = {if (42) 42};
+                        ^" in 42 as{TypeError} core::bool*)
+      #t116.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+  } =>#t116;
+  core::Map<core::int*, core::int*>* map30 = block {
+    final core::Map<core::int*, core::int*>* #t117 = <core::int*, core::int*>{};
+    if(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
+  Map<int, int> map30 = {if (42) 42: 42};
+                             ^" in 42 as{TypeError} core::bool*)
+      #t117.{core::Map::[]=}{Invariant}(42, 42){(core::int*, core::int*) →* void};
+  } =>#t117;
+  core::List<core::String*>* list40 = block {
+    final core::List<core::String*>* #t118 = <core::String*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t118.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                    ^" in true as{TypeError} core::String*){(core::String*) →* void};
+    else
+      #t118.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                              ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
+  } =>#t118;
+  core::Set<core::String*>* set40 = block {
+    final core::Set<core::String*>* #t119 = col::LinkedHashSet::•<core::String*>();
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t119.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                  ^" in true as{TypeError} core::String*){(core::String*) →* core::bool*};
+    else
+      #t119.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                            ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
+  } =>#t119;
+  core::Map<core::String*, core::int*>* map40 = block {
+    final core::Map<core::String*, core::int*>* #t120 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                            ^" in true as{TypeError} core::String*, 42){(core::String*, core::int*) →* void};
+    else
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                                          ^" in 42 as{TypeError} core::String*, 42){(core::String*, core::int*) →* void};
+  } =>#t120;
+  core::Map<core::int*, core::String*>* map41 = block {
+    final core::Map<core::int*, core::String*>* #t121 = <core::int*, core::String*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
+      #t121.{core::Map::[]=}{Invariant}(42, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                ^" in true as{TypeError} core::String*){(core::int*, core::String*) →* void};
+    else
+      #t121.{core::Map::[]=}{Invariant}(42, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                              ^" in 42 as{TypeError} core::String*){(core::int*, core::String*) →* void};
+  } =>#t121;
+}
+static method testForElement(dynamic dynVar, core::List<core::int*>* listInt, core::List<core::double*>* listDouble, core::int* index, core::Map<core::String*, core::int*>* mapStringInt, core::Map<core::String*, core::double*>* mapStringDouble) → dynamic {
+  core::List<core::int*>* list10 = block {
+    final core::List<core::int*>* #t122 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t122.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t122;
+  core::Set<core::int*>* set10 = block {
+    final core::Set<core::int*>* #t123 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t123.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t123.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t123;
+  core::Map<core::String*, core::int*>* map10 = block {
+    final core::Map<core::String*, core::int*>* #t124 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t124.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t124.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t124;
+  core::List<dynamic>* list11 = block {
+    final core::List<dynamic>* #t125 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t125.{core::List::add}{Invariant}(dynVar){(dynamic) →* void};
+  } =>#t125;
+  core::Set<dynamic>* set11 = block {
+    final core::Set<dynamic>* #t126 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t126.{core::Set::add}{Invariant}(dynVar){(dynamic) →* core::bool*};
+    #t126.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t126;
+  core::Map<core::String*, dynamic>* map11 = block {
+    final core::Map<core::String*, dynamic>* #t127 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t127.{core::Map::[]=}{Invariant}("bar", dynVar){(core::String*, dynamic) →* void};
+    #t127.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
+  } =>#t127;
+  core::List<core::List<core::int*>*>* list12 = block {
+    final core::List<core::List<core::int*>*>* #t128 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t128.{core::List::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* void};
+  } =>#t128;
+  core::Set<core::List<core::int*>*>* set12 = block {
+    final core::Set<core::List<core::int*>*>* #t129 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t129.{core::Set::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
+    #t129.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t129;
+  core::Map<core::String*, core::List<core::int*>*>* map12 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t130 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t130.{core::Map::[]=}{Invariant}("bar", <core::int*>[42]){(core::String*, core::List<core::int*>*) →* void};
+    #t130.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t130;
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t131 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t131.{core::List::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+  } =>#t131;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t132 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t132.{core::Set::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+    #t132.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t132;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<core::String*, core::int*>* #t134 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+        #t133.{core::Map::[]=}{Invariant}(#t134.{core::MapEntry::key}{core::String*}, #t134.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t133.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t133;
+  core::List<dynamic>* list21 = block {
+    final core::List<dynamic>* #t135 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t135.{core::List::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+  } =>#t135;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t136 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t136.{core::Set::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+    #t136.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t136;
+  core::Map<core::String*, dynamic>* map21 = block {
+    final core::Map<core::String*, dynamic>* #t137 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<core::String*, dynamic>* #t138 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>})
+        #t137.{core::Map::[]=}{Invariant}(#t138.{core::MapEntry::key}{core::String*}, #t138.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+    #t137.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
+  } =>#t137;
+  core::List<core::List<core::int*>*>* list22 = block {
+    final core::List<core::List<core::int*>*>* #t139 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t139.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t139;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t140 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t140.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t140.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t140;
+  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t141 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t142 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+        #t141.{core::Map::[]=}{Invariant}(#t142.{core::MapEntry::key}{core::String*}, #t142.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t141.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t141;
+  core::List<core::int*>* list30 = block {
+    final core::List<core::int*>* #t143 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t143.{core::List::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+  } =>#t143;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t144 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t144.{core::Set::addAll}{Invariant}(<core::int*>[42]){(core::Iterable<core::int*>*) →* void};
+    #t144.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t144;
+  core::Map<core::String*, core::int*>* map30 = block {
+    final core::Map<core::String*, core::int*>* #t145 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t146 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+          #t145.{core::Map::[]=}{Invariant}(#t146.{core::MapEntry::key}{core::String*}, #t146.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t145.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t145;
+  core::List<dynamic>* list31 = block {
+    final core::List<dynamic>* #t147 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t147.{core::List::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+  } =>#t147;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t148 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t148.{core::Set::addAll}{Invariant}(<dynamic>[dynVar]){(core::Iterable<dynamic>*) →* void};
+    #t148.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t148;
+  core::Map<core::String*, dynamic>* map31 = block {
+    final core::Map<core::String*, dynamic>* #t149 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, dynamic>* #t150 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>>})
+          #t149.{core::Map::[]=}{Invariant}(#t150.{core::MapEntry::key}{core::String*}, #t150.{core::MapEntry::value}{dynamic}){(core::String*, dynamic) →* void};
+    #t149.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
+  } =>#t149;
+  core::List<core::List<core::int*>*>* list33 = block {
+    final core::List<core::List<core::int*>*>* #t151 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t151.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t151;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t152 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t152.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[42]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t152.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t152;
+  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t153 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t154 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+          #t153.{core::Map::[]=}{Invariant}(#t154.{core::MapEntry::key}{core::String*}, #t154.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t153.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t153;
+  core::List<core::List<core::int*>*>* list40 = block {
+    final core::List<core::List<core::int*>*>* #t155 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t155.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t155;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t156 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t156.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t156.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t156;
+  core::Map<core::String*, core::List<core::int*>*>* map40 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t157 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t158 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+        #t157.{core::Map::[]=}{Invariant}(#t158.{core::MapEntry::key}{core::String*}, #t158.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t157.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t157;
+  core::List<core::List<core::int*>*>* list41 = block {
+    final core::List<core::List<core::int*>*>* #t159 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t159.{core::List::addAll}{Invariant}( block {
+        final core::Set<core::List<core::int*>*>* #t160 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t160.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+      } =>#t160){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t159;
+  core::Set<core::List<core::int*>*>* set41 = block {
+    final core::Set<core::List<core::int*>*>* #t161 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t161.{core::Set::addAll}{Invariant}( block {
+        final core::Set<core::List<core::int*>*>* #t162 = col::LinkedHashSet::•<core::List<core::int*>*>();
+        #t162.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+      } =>#t162){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t161.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t161;
+  core::List<core::List<core::int*>*>* list42 = block {
+    final core::List<core::List<core::int*>*>* #t163 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t163.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t163;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t164 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t164.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t164.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t164;
+  core::Map<core::String*, core::List<core::int*>*>* map42 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t165 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t166 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+          #t165.{core::Map::[]=}{Invariant}(#t166.{core::MapEntry::key}{core::String*}, #t166.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t165.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t165;
+  core::List<core::int*>* list50 = block {
+    final core::List<core::int*>* #t167 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t167.{core::List::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+  } =>#t167;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t168 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t168.{core::Set::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+    #t168.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t168;
+  core::Map<core::String*, core::int*>* map50 = block {
+    final core::Map<core::String*, core::int*>* #t169 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<core::String*, core::int*>* #t170 in <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+        #t169.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}{core::String*}, #t170.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t169.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t169;
+  core::List<core::int*>* list51 = block {
+    final core::List<core::int*>* #t171 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t171.{core::List::addAll}{Invariant}( block {
+        final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
+      } =>#t172){(core::Iterable<core::int*>*) →* void};
+  } =>#t171;
+  core::Set<core::int*>* set51 = block {
+    final core::Set<core::int*>* #t173 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t173.{core::Set::addAll}{Invariant}( block {
+        final core::Set<core::int*>* #t174 = col::LinkedHashSet::•<core::int*>();
+      } =>#t174){(core::Iterable<core::int*>*) →* void};
+    #t173.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t173;
+  core::List<core::int*>* list52 = block {
+    final core::List<core::int*>* #t175 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t175.{core::List::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+  } =>#t175;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t176 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t176.{core::Set::addAll}{Invariant}(<core::int*>[]){(core::Iterable<core::int*>*) →* void};
+    #t176.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t176;
+  core::List<core::List<core::int*>*>* list60 = block {
+    final core::List<core::List<core::int*>*>* #t177 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t177.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t177;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t178 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t178.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t178.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t178;
+  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t179 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t180 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+        #t179.{core::Map::[]=}{Invariant}(#t180.{core::MapEntry::key}{core::String*}, #t180.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t179.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t179;
+  core::List<core::List<core::int*>*>* list61 = block {
+    final core::List<core::List<core::int*>*>* #t181 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t181.{core::List::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+  } =>#t181;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t182 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t182.{core::Set::addAll}{Invariant}(<core::List<core::int*>*>[<core::int*>[]]){(core::Iterable<core::List<core::int*>*>*) →* void};
+    #t182.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t182;
+  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t183 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t184 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+          #t183.{core::Map::[]=}{Invariant}(#t184.{core::MapEntry::key}{core::String*}, #t184.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+    #t183.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t183;
+  core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t185 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t185.{core::List::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* void};
+  } =>#t185;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t186 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t186.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+    #t186.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t186;
+  core::Map<core::String*, core::List<core::int*>*>* map70 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t187 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t187.{core::Map::[]=}{Invariant}("bar", <core::int*>[]){(core::String*, core::List<core::int*>*) →* void};
+    #t187.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t187;
+  core::List<core::List<core::int*>*>* list71 = block {
+    final core::List<core::List<core::int*>*>* #t188 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t188.{core::List::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* void};
+  } =>#t188;
+  core::Set<core::List<core::int*>*>* set71 = block {
+    final core::Set<core::List<core::int*>*>* #t189 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t189.{core::Set::add}{Invariant}(<core::int*>[]){(core::List<core::int*>*) →* core::bool*};
+    #t189.{core::Set::add}{Invariant}(null){(core::List<core::int*>*) →* core::bool*};
+  } =>#t189;
+  core::Map<core::String*, core::List<core::int*>*>* map71 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t190 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t190.{core::Map::[]=}{Invariant}("bar", <core::int*>[]){(core::String*, core::List<core::int*>*) →* void};
+    #t190.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t190;
+  core::List<core::num*>* list80 = block {
+    final core::List<core::num*>* #t191 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t191.{core::List::add}{Invariant}(42){(core::num*) →* void};
+      else
+        #t191.{core::List::add}{Invariant}(3.14){(core::num*) →* void};
+  } =>#t191;
+  core::Set<core::num*>* set80 = block {
+    final core::Set<core::num*>* #t192 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t192.{core::Set::add}{Invariant}(42){(core::num*) →* core::bool*};
+      else
+        #t192.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t192.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
+  } =>#t192;
+  core::Map<core::String*, core::num*>* map80 = block {
+    final core::Map<core::String*, core::num*>* #t193 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t193.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::num*) →* void};
+      else
+        #t193.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t193.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
+  } =>#t193;
+  core::List<core::num*>* list81 = block {
+    final core::List<core::num*>* #t194 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t194.{core::List::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
+      else
+        #t194.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+  } =>#t194;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t195 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t195.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
+      else
+        #t195.{core::Set::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+    #t195.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
+  } =>#t195;
+  core::Map<core::String*, core::num*>* map81 = block {
+    final core::Map<core::String*, core::num*>* #t196 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::num*>* #t197 in mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
+          #t196.{core::Map::[]=}{Invariant}(#t197.{core::MapEntry::key}{core::String*}, #t197.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+      else
+        for (final core::MapEntry<core::String*, core::num*>* #t198 in mapStringDouble.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
+          #t196.{core::Map::[]=}{Invariant}(#t198.{core::MapEntry::key}{core::String*}, #t198.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+    #t196.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
+  } =>#t196;
+  core::List<dynamic>* list82 = block {
+    final core::List<dynamic>* #t199 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t199.{core::List::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
+      else
+        #t199.{core::List::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+  } =>#t199;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t200 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t200.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<dynamic>*) →* void};
+      else
+        #t200.{core::Set::addAll}{Invariant}(dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*){(core::Iterable<dynamic>*) →* void};
+    #t200.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t200;
+  core::Map<dynamic, dynamic>* map82 = block {
+    final core::Map<dynamic, dynamic>* #t201 = <dynamic, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<dynamic, dynamic>* #t202 in mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+          #t201.{core::Map::[]=}{Invariant}(#t202.{core::MapEntry::key}{dynamic}, #t202.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+      else
+        for (final core::MapEntry<dynamic, dynamic>* #t203 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+          #t201.{core::Map::[]=}{Invariant}(#t203.{core::MapEntry::key}{dynamic}, #t203.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+    #t201.{core::Map::[]=}{Invariant}("baz", null){(dynamic, dynamic) →* void};
+  } =>#t201;
+  core::List<core::num*>* list83 = block {
+    final core::List<core::num*>* #t204 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t204.{core::List::add}{Invariant}(42){(core::num*) →* void};
+      else
+        #t204.{core::List::addAll}{Invariant}(listDouble){(core::Iterable<core::num*>*) →* void};
+  } =>#t204;
+  core::Set<core::num*>* set83 = block {
+    final core::Set<core::num*>* #t205 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t205.{core::Set::addAll}{Invariant}(listInt){(core::Iterable<core::num*>*) →* void};
+      else
+        #t205.{core::Set::add}{Invariant}(3.14){(core::num*) →* core::bool*};
+    #t205.{core::Set::add}{Invariant}(null){(core::num*) →* core::bool*};
+  } =>#t205;
+  core::Map<core::String*, core::num*>* map83 = block {
+    final core::Map<core::String*, core::num*>* #t206 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        for (final core::MapEntry<core::String*, core::num*>* #t207 in mapStringInt.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::num*>>})
+          #t206.{core::Map::[]=}{Invariant}(#t207.{core::MapEntry::key}{core::String*}, #t207.{core::MapEntry::value}{core::num*}){(core::String*, core::num*) →* void};
+      else
+        #t206.{core::Map::[]=}{Invariant}("bar", 3.14){(core::String*, core::num*) →* void};
+    #t206.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::num*) →* void};
+  } =>#t206;
+  core::List<core::int*>* list90 = block {
+    final core::List<core::int*>* #t208 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t208.{core::List::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+  } =>#t208;
+  core::Set<core::int*>* set90 = block {
+    final core::Set<core::int*>* #t209 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t209.{core::Set::add}{Invariant}(dynVar as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t209.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t209;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t210 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t210.{core::Map::[]=}{Invariant}("bar", dynVar as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+    #t210.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t210;
+  core::List<core::int*>* list91 = block {
+    final core::List<core::int*>* #t211 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final dynamic #t212 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t213 = #t212 as{TypeError} core::int*;
+        #t211.{core::List::add}{Invariant}(#t213){(core::int*) →* void};
+      }
+  } =>#t211;
+  core::Set<core::int*>* set91 = block {
+    final core::Set<core::int*>* #t214 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final dynamic #t215 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        final core::int* #t216 = #t215 as{TypeError} core::int*;
+        #t214.{core::Set::add}{Invariant}(#t216){(core::int*) →* core::bool*};
+      }
+    #t214.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t214;
+  core::Map<core::String*, core::int*>* map91 = block {
+    final core::Map<core::String*, core::int*>* #t217 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<dynamic, dynamic>* #t218 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>}) {
+        final core::String* #t219 = #t218.{core::MapEntry::key}{dynamic} as{TypeError} core::String*;
+        final core::int* #t220 = #t218.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
+        #t217.{core::Map::[]=}{Invariant}(#t219, #t220){(core::String*, core::int*) →* void};
+      }
+    #t217.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t217;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t221 = <core::int*>[];
+    for (final core::int* #t222 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
+      #t221.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t221;
+  core::Set<core::int*>* set100 = block {
+    final core::Set<core::int*>* #t223 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t224 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
+      #t223.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+  } =>#t223;
+  core::Map<core::String*, core::int*>* map100 = block {
+    final core::Map<core::String*, core::int*>* #t225 = <core::String*, core::int*>{};
+    for (final core::int* #t226 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1){(core::num*) →* core::int*})
+      #t225.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+  } =>#t225;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t227 = <core::int*>[];
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t227.{core::List::add}{Invariant}(i){(core::int*) →* void};
+  } =>#t227;
+  core::Set<core::int*>* set110 = block {
+    final core::Set<core::int*>* #t228 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t228.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    #t228.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t228;
+  core::Map<core::String*, core::int*>* map110 = block {
+    final core::Map<core::String*, core::int*>* #t229 = <core::String*, core::int*>{};
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t229.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
+    #t229.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t229;
+  core::List<core::int*>* list120 = block {
+    final core::List<core::int*>* #t230 = <core::int*>[];
+    for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+      #t230.{core::List::add}{Invariant}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* void};
+  } =>#t230;
+  core::Set<core::int*>* set120 = block {
+    final core::Set<core::int*>* #t231 = col::LinkedHashSet::•<core::int*>();
+    for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+      #t231.{core::Set::add}{Invariant}(i as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t231.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t231;
+  core::Map<core::String*, core::int*>* map120 = block {
+    final core::Map<core::String*, core::int*>* #t232 = <core::String*, core::int*>{};
+    for (dynamic i in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*)
+      #t232.{core::Map::[]=}{Invariant}("bar", i as{TypeError,ForDynamic} core::int*){(core::String*, core::int*) →* void};
+    #t232.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t232;
+  core::List<core::int*>* list130 = block {
+    final core::List<core::int*>* #t233 = <core::int*>[];
+    for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t233.{core::List::add}{Invariant}(i){(core::int*) →* void};
+  } =>#t233;
+  core::Set<core::int*>* set130 = block {
+    final core::Set<core::int*>* #t234 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t234.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+  } =>#t234;
+  core::Map<core::int*, core::int*>* map130 = block {
+    final core::Map<core::int*, core::int*>* #t235 = <core::int*, core::int*>{};
+    for (core::int* i = 1; i.{core::num::<}(2){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t235.{core::Map::[]=}{Invariant}(i, i){(core::int*, core::int*) →* void};
+  } =>#t235;
+}
+static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic async {
+  block {
+    final core::List<core::int*>* #t236 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t236.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
+                                            ^" in "bar" as{TypeError} core::int*){(core::int*) →* void};
+  } =>#t236;
+  block {
+    final core::Set<core::int*>* #t237 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t237.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
+                                            ^" in "bar" as{TypeError} core::int*){(core::int*) →* core::bool*};
+    #t237.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t237;
+  block {
+    final core::Map<core::int*, core::int*>* #t238 = <core::int*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t238.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                 ^" in "bar" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                        ^" in "bar" as{TypeError} core::int*){(core::int*, core::int*) →* void};
+    #t238.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                               ^" in "baz" as{TypeError} core::int*, null){(core::int*, core::int*) →* void};
+  } =>#t238;
+  block {
+    final core::List<core::int*>* #t239 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t239.{core::List::addAll}{Invariant}(<core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
+                                                ^" in "bar" as{TypeError} core::int*]){(core::Iterable<core::int*>*) →* void};
+  } =>#t239;
+  block {
+    final core::Set<core::int*>* #t240 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t240.{core::Set::addAll}{Invariant}(<core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
+                                                ^" in "bar" as{TypeError} core::int*]){(core::Iterable<core::int*>*) →* void};
+    #t240.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t240;
+  block {
+    final core::Map<core::int*, core::int*>* #t241 = <core::int*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<core::int*, core::int*>* #t242 in <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                     ^" in "bar" as{TypeError} core::int*: invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                            ^" in "bar" as{TypeError} core::int*}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>})
+        #t241.{core::Map::[]=}{Invariant}(#t242.{core::MapEntry::key}{core::int*}, #t242.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+    #t241.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                                    ^" in "baz" as{TypeError} core::int*, null){(core::int*, core::int*) →* void};
+  } =>#t241;
+  block {
+    final core::List<core::int*>* #t243 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t243.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) ...map];
+                                               ^"){(core::int*) →* void};
+  } =>#t243;
+  block {
+    final core::Set<core::int*>* #t244 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t244.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) ...map, null};
+                                               ^"){(core::int*) →* core::bool*};
+    #t244.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t244;
+  <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
+                                                    ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:53: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...list, 42: null};
+                                                    ^": null};
+  block {
+    final core::List<core::String*>* #t245 = <core::String*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t245.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                             ^" in 42 as{TypeError} core::String*){(core::String*) →* void};
+      else
+        #t245.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                                     ^" in 3.14 as{TypeError} core::String*){(core::String*) →* void};
+  } =>#t245;
+  block {
+    final core::Set<core::String*>* #t246 = col::LinkedHashSet::•<core::String*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t246.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                             ^" in 42 as{TypeError} core::String*){(core::String*) →* core::bool*};
+      else
+        #t246.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                                     ^" in 3.14 as{TypeError} core::String*){(core::String*) →* core::bool*};
+    #t246.{core::Set::add}{Invariant}(null){(core::String*) →* core::bool*};
+  } =>#t246;
+  block {
+    final core::Map<core::String*, core::String*>* #t247 = <core::String*, core::String*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t247.{core::Map::[]=}{Invariant}("bar", invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
+                                                                            ^" in 42 as{TypeError} core::String*){(core::String*, core::String*) →* void};
+      else
+        #t247.{core::Map::[]=}{Invariant}("bar", invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  <String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
+                                                                                           ^" in 3.14 as{TypeError} core::String*){(core::String*, core::String*) →* void};
+    #t247.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::String*) →* void};
+  } =>#t247;
+  block {
+    final core::List<core::int*>* #t248 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t248.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42];
+                                                             ^"){(core::int*) →* void};
+      else
+        #t248.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t248;
+  block {
+    final core::Set<core::int*>* #t249 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t249.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...map else 42, null};
+                                                             ^"){(core::int*) →* core::bool*};
+      else
+        #t249.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t249.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t249;
+  <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
+                                                                     ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:224:70: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) ...list else \"bar\": 42, \"baz\": null};
+                                                                     ^": null};
+  block {
+    final core::List<core::int*>* #t250 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t250.{core::List::add}{Invariant}(42){(core::int*) →* void};
+      else
+        #t250.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map];
+                                                                     ^"){(core::int*) →* void};
+  } =>#t250;
+  block {
+    final core::Set<core::int*>* #t251 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
+        #t251.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+      else
+        #t251.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:70: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else ...map, null};
+                                                                     ^"){(core::int*) →* core::bool*};
+    #t251.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t251;
+  <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
+                                                                                    ^": null, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:227:85: Error: Unexpected type 'List<int>' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+  <String, int>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else ...list, \"baz\": null};
+                                                                                    ^": null};
+  final core::int* i = 0;
+  block {
+    final core::List<core::int*>* #t252 = <core::int*>[];
+    for (final core::int* #t253 in <core::int*>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Can't assign to the final variable 'i'.
+  <int>[for (i in <int>[1]) i];
+             ^";
+      #t252.{core::List::add}{Invariant}(i){(core::int*) →* void};
+    }
+  } =>#t252;
+  block {
+    final core::Set<core::int*>* #t254 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t255 in <core::int*>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Can't assign to the final variable 'i'.
+  <int>{for (i in <int>[1]) i, null};
+             ^";
+      #t254.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    }
+    #t254.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t254;
+  block {
+    final core::Map<core::String*, core::int*>* #t256 = <core::String*, core::int*>{};
+    for (final core::int* #t257 in <core::int*>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Can't assign to the final variable 'i'.
+\t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
+\t                   ^";
+      #t256.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
+    }
+    #t256.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t256;
+  core::List<dynamic>* list10 = block {
+    final core::List<dynamic>* #t258 = <dynamic>[];
+    for (dynamic i in invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:31: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var list10 = [for (var i in \"not iterable\") i];
+                              ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
+      #t258.{core::List::add}{Invariant}(i){(dynamic) →* void};
+  } =>#t258;
+  core::Set<dynamic>* set10 = block {
+    final core::Set<dynamic>* #t259 = col::LinkedHashSet::•<dynamic>();
+    for (dynamic i in invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var set10 = {for (var i in \"not iterable\") i, null};
+                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
+      #t259.{core::Set::add}{Invariant}(i){(dynamic) →* core::bool*};
+    #t259.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t259;
+  core::Map<core::String*, dynamic>* map10 = block {
+    final core::Map<core::String*, dynamic>* #t260 = <core::String*, dynamic>{};
+    for (dynamic i in invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  var map10 = {for (var i in \"not iterable\") \"bar\": i, \"baz\": null};
+                             ^" in "not iterable" as{TypeError} core::Iterable<dynamic>*)
+      #t260.{core::Map::[]=}{Invariant}("bar", i){(core::String*, dynamic) →* void};
+    #t260.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
+  } =>#t260;
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t261 = <core::int*>[];
+    for (core::int* i in <core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                               ^" in "not" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                                      ^" in "int" as{TypeError} core::int*])
+      #t261.{core::List::add}{Invariant}(i){(core::int*) →* void};
+  } =>#t261;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i in <core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                              ^" in "not" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                                     ^" in "int" as{TypeError} core::int*])
+      #t262.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    #t262.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t262;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t263 = <core::String*, core::int*>{};
+    for (core::int* i in <core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                              ^" in "not" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                                     ^" in "int" as{TypeError} core::int*])
+      #t263.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
+    #t263.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t263;
+  core::List<dynamic>* list30 = block {
+    final core::List<dynamic>* #t264 = <dynamic>[];
+    await for (dynamic i in invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:37: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var list30 = [await for (var i in \"not stream\") i];
+                                    ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
+      #t264.{core::List::add}{Invariant}(i){(dynamic) →* void};
+  } =>#t264;
+  core::Set<dynamic>* set30 = block {
+    final core::Set<dynamic>* #t265 = col::LinkedHashSet::•<dynamic>();
+    await for (dynamic i in invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var set30 = {await for (var i in \"not stream\") i, null};
+                                   ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
+      #t265.{core::Set::add}{Invariant}(i){(dynamic) →* core::bool*};
+    #t265.{core::Set::add}{Invariant}(null){(dynamic) →* core::bool*};
+  } =>#t265;
+  core::Map<core::String*, dynamic>* map30 = block {
+    final core::Map<core::String*, dynamic>* #t266 = <core::String*, dynamic>{};
+    await for (dynamic i in invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  var map30 = {await for (var i in \"not stream\") \"bar\": i, \"baz\": null};
+                                   ^" in "not stream" as{TypeError} asy::Stream<dynamic>*)
+      #t266.{core::Map::[]=}{Invariant}("bar", i){(core::String*, dynamic) →* void};
+    #t266.{core::Map::[]=}{Invariant}("baz", null){(core::String*, dynamic) →* void};
+  } =>#t266;
+  core::List<core::int*>* list40 = block {
+    final core::List<core::int*>* #t267 = <core::int*>[];
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                         ^" in "not" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                                ^" in "int" as{TypeError} core::int*]))
+      #t267.{core::List::add}{Invariant}(i){(core::int*) →* void};
+  } =>#t267;
+  core::Set<core::int*>* set40 = block {
+    final core::Set<core::int*>* #t268 = col::LinkedHashSet::•<core::int*>();
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                        ^" in "not" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                               ^" in "int" as{TypeError} core::int*]))
+      #t268.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+    #t268.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t268;
+  core::Map<core::String*, core::int*>* map40 = block {
+    final core::Map<core::String*, core::int*>* #t269 = <core::String*, core::int*>{};
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                        ^" in "not" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                               ^" in "int" as{TypeError} core::int*]))
+      #t269.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
+    #t269.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t269;
+  core::List<core::int*>* list50 = block {
+    final core::List<core::int*>* #t270 = <core::int*>[];
+    for (; ; )
+      #t270.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t270;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t271 = col::LinkedHashSet::•<core::int*>();
+    for (; ; )
+      #t271.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t271.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t271;
+  core::Map<core::String*, core::int*>* map50 = block {
+    final core::Map<core::String*, core::int*>* #t272 = <core::String*, core::int*>{};
+    for (; ; )
+      #t272.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t272.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t272;
+  core::List<core::int*>* list60 = block {
+    final core::List<core::int*>* #t273 = <core::int*>[];
+    for (; invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+  var list60 = [for (; \"not bool\";) 42];
+                       ^" in "not bool" as{TypeError} core::bool*; )
+      #t273.{core::List::add}{Invariant}(42){(core::int*) →* void};
+  } =>#t273;
+  core::Set<core::int*>* set60 = block {
+    final core::Set<core::int*>* #t274 = col::LinkedHashSet::•<core::int*>();
+    for (; invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+  var set60 = {for (; \"not bool\";) 42, null};
+                      ^" in "not bool" as{TypeError} core::bool*; )
+      #t274.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+    #t274.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t274;
+  core::Map<core::String*, core::int*>* map60 = block {
+    final core::Map<core::String*, core::int*>* #t275 = <core::String*, core::int*>{};
+    for (; invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
+  var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
+                      ^" in "not bool" as{TypeError} core::bool*; )
+      #t275.{core::Map::[]=}{Invariant}("bar", 42){(core::String*, core::int*) →* void};
+    #t275.{core::Map::[]=}{Invariant}("baz", null){(core::String*, core::int*) →* void};
+  } =>#t275;
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
+  block {
+    final core::List<core::int*>* #t276 = <core::int*>[];
+    await for (core::int* i in stream)
+      #t276.{core::List::add}{Invariant}(i){(core::int*) →* void};
+  } =>#t276;
+  block {
+    final core::Set<core::int*>* #t277 = col::LinkedHashSet::•<core::int*>();
+    await for (core::int* i in stream)
+      #t277.{core::Set::add}{Invariant}(i){(core::int*) →* core::bool*};
+  } =>#t277;
+  block {
+    final core::Map<core::String*, core::int*>* #t278 = <core::String*, core::int*>{};
+    await for (core::int* i in stream)
+      #t278.{core::Map::[]=}{Invariant}("bar", i){(core::String*, core::int*) →* void};
+  } =>#t278;
+}
+static method testPromotion(self::A* a) → dynamic {
+  core::List<core::int*>* list10 = block {
+    final core::List<core::int*>* #t279 = <core::int*>[];
+    if(a is self::B*)
+      #t279.{core::List::add}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* void};
+  } =>#t279;
+  core::Set<core::int*>* set10 = block {
+    final core::Set<core::int*>* #t280 = col::LinkedHashSet::•<core::int*>();
+    if(a is self::B*)
+      #t280.{core::Set::add}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}){(core::int*) →* core::bool*};
+  } =>#t280;
+  core::Map<core::int*, core::int*>* map10 = block {
+    final core::Map<core::int*, core::int*>* #t281 = <core::int*, core::int*>{};
+    if(a is self::B*)
+      #t281.{core::Map::[]=}{Invariant}(a{self::B*}.{self::B::foo}{core::int*}, a{self::B*}.{self::B::foo}{core::int*}){(core::int*, core::int*) →* void};
+  } =>#t281;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/covariant_equals.dart.weak.modular.expect b/pkg/front_end/testcases/general/covariant_equals.dart.weak.modular.expect
new file mode 100644
index 0000000..3f1296f
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_equals.dart.weak.modular.expect
@@ -0,0 +1,284 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:24:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   a == c_dynamic; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:25:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   a == c_int; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:26:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   a == c_string; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:27:8: Error: The argument type 'D' can't be assigned to the parameter type 'A'.
+//  - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   a == d; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:31:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   b == c_dynamic; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:32:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   b == c_int; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:33:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   b == c_string; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:34:8: Error: The argument type 'D' can't be assigned to the parameter type 'A'.
+//  - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   b == d; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:36:16: Error: The argument type 'A' can't be assigned to the parameter type 'C<dynamic>'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_dynamic == a; // error
+//                ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:37:16: Error: The argument type 'B' can't be assigned to the parameter type 'C<dynamic>'.
+//  - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_dynamic == b; // error
+//                ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:43:12: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_int == a; // error
+//            ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:44:12: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>'.
+//  - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_int == b; // error
+//            ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:47:12: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_int == c_string; // error
+//            ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:50:15: Error: The argument type 'A' can't be assigned to the parameter type 'C<String>'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_string == a; // error
+//               ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:51:15: Error: The argument type 'B' can't be assigned to the parameter type 'C<String>'.
+//  - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_string == b; // error
+//               ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:53:15: Error: The argument type 'C<int>' can't be assigned to the parameter type 'C<String>'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_string == c_int; // error
+//               ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:55:15: Error: The argument type 'D' can't be assigned to the parameter type 'C<String>'.
+//  - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   c_string == d; // error
+//               ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:57:8: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>'.
+//  - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   d == a; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:58:8: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>'.
+//  - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   d == b; // error
+//        ^
+//
+// pkg/front_end/testcases/general/covariant_equals.dart:61:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>'.
+//  - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+//   d == c_string; // error
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator ==(covariant-by-declaration self::A* other) → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator ==(covariant-by-declaration self::A* other) → core::bool*
+    return true;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  operator ==(covariant-by-declaration covariant-by-class self::C<self::C::T*>* other) → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C<core::int*> {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+static method main() → dynamic {}
+static method test(self::A* a, self::B* b, self::C<dynamic>* c_dynamic, self::C<core::int*>* c_int, self::C<core::String*>* c_string, self::D* d) → dynamic {
+  a =={self::A::==}{(self::A*) →* core::bool*} a;
+  a =={self::A::==}{(self::A*) →* core::bool*} b;
+  a =={self::A::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:24:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  a == c_dynamic; // error
+       ^" in c_dynamic as{TypeError} self::A*;
+  a =={self::A::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:25:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  a == c_int; // error
+       ^" in c_int as{TypeError} self::A*;
+  a =={self::A::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:26:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  a == c_string; // error
+       ^" in c_string as{TypeError} self::A*;
+  a =={self::A::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:27:8: Error: The argument type 'D' can't be assigned to the parameter type 'A'.
+ - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  a == d; // error
+       ^" in d as{TypeError} self::A*;
+  b =={self::B::==}{(self::A*) →* core::bool*} a;
+  b =={self::B::==}{(self::A*) →* core::bool*} b;
+  b =={self::B::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:31:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  b == c_dynamic; // error
+       ^" in c_dynamic as{TypeError} self::A*;
+  b =={self::B::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:32:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  b == c_int; // error
+       ^" in c_int as{TypeError} self::A*;
+  b =={self::B::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:33:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  b == c_string; // error
+       ^" in c_string as{TypeError} self::A*;
+  b =={self::B::==}{(self::A*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:34:8: Error: The argument type 'D' can't be assigned to the parameter type 'A'.
+ - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  b == d; // error
+       ^" in d as{TypeError} self::A*;
+  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:36:16: Error: The argument type 'A' can't be assigned to the parameter type 'C<dynamic>'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_dynamic == a; // error
+               ^" in a as{TypeError} self::C<dynamic>*;
+  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:37:16: Error: The argument type 'B' can't be assigned to the parameter type 'C<dynamic>'.
+ - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_dynamic == b; // error
+               ^" in b as{TypeError} self::C<dynamic>*;
+  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} c_dynamic;
+  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} c_int;
+  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} c_string;
+  c_dynamic =={self::C::==}{(self::C<dynamic>*) →* core::bool*} d;
+  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:43:12: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_int == a; // error
+           ^" in a as{TypeError} self::C<core::int*>*;
+  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:44:12: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>'.
+ - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_int == b; // error
+           ^" in b as{TypeError} self::C<core::int*>*;
+  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} c_dynamic as{TypeError} self::C<core::int*>*;
+  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} c_int;
+  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:47:12: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_int == c_string; // error
+           ^" in c_string as{TypeError} self::C<core::int*>*;
+  c_int =={self::C::==}{(self::C<core::int*>*) →* core::bool*} d;
+  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:50:15: Error: The argument type 'A' can't be assigned to the parameter type 'C<String>'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_string == a; // error
+              ^" in a as{TypeError} self::C<core::String*>*;
+  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:51:15: Error: The argument type 'B' can't be assigned to the parameter type 'C<String>'.
+ - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_string == b; // error
+              ^" in b as{TypeError} self::C<core::String*>*;
+  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} c_dynamic as{TypeError} self::C<core::String*>*;
+  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:53:15: Error: The argument type 'C<int>' can't be assigned to the parameter type 'C<String>'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_string == c_int; // error
+              ^" in c_int as{TypeError} self::C<core::String*>*;
+  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} c_string;
+  c_string =={self::C::==}{(self::C<core::String*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:55:15: Error: The argument type 'D' can't be assigned to the parameter type 'C<String>'.
+ - 'D' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  c_string == d; // error
+              ^" in d as{TypeError} self::C<core::String*>*;
+  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:57:8: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>'.
+ - 'A' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  d == a; // error
+       ^" in a as{TypeError} self::C<core::int*>*;
+  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:58:8: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>'.
+ - 'B' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  d == b; // error
+       ^" in b as{TypeError} self::C<core::int*>*;
+  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} c_dynamic as{TypeError} self::C<core::int*>*;
+  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} c_int;
+  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} invalid-expression "pkg/front_end/testcases/general/covariant_equals.dart:61:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>'.
+ - 'C' is from 'pkg/front_end/testcases/general/covariant_equals.dart'.
+  d == c_string; // error
+       ^" in c_string as{TypeError} self::C<core::int*>*;
+  d =={self::C::==}{(self::C<core::int*>*) →* core::bool*} d;
+}
diff --git a/pkg/front_end/testcases/general/covariant_field.dart.weak.modular.expect b/pkg/front_end/testcases/general/covariant_field.dart.weak.modular.expect
new file mode 100644
index 0000000..6453946
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field.dart.weak.modular.expect
@@ -0,0 +1,90 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/covariant_field.dart:19:31: Error: The parameter 'value' of the method 'C.invariantField' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'A.invariantField'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void set invariantField(int value) {} // error
+//                               ^
+// pkg/front_end/testcases/general/covariant_field.dart:6:7: Context: This is the overridden method ('invariantField').
+//   num invariantField;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num* invariantField = null;
+  covariant-by-declaration field core::num* covariantField = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::num*;
+  abstract set invariantField(core::num* value) → void;
+  abstract get covariantField() → core::num*;
+  abstract set covariantField(covariant-by-declaration core::num* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::A {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::int*;
+  set invariantField(core::int* value) → void {}
+  abstract get covariantField() → core::int*;
+  set covariantField(covariant-by-declaration core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::int*;
+  set invariantField(covariant-by-declaration core::int* value) → void {}
+  abstract get covariantField() → core::int*;
+  set covariantField(covariant-by-declaration core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_field_override.dart.weak.modular.expect b/pkg/front_end/testcases/general/covariant_field_override.dart.weak.modular.expect
new file mode 100644
index 0000000..fb69f60
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_field_override.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num* field = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  covariant-by-declaration field core::num* field = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A implements self::B {
+  covariant-by-declaration field core::num* field = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.weak.modular.expect b/pkg/front_end/testcases/general/covariant_generic.dart.weak.modular.expect
new file mode 100644
index 0000000..f28d890
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Callback<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  final field self::Foo::T* finalField;
+  final field (self::Foo::T*) →* void callbackField;
+  covariant-by-class field self::Foo::T* mutableField = null;
+  field (self::Foo::T*) →* void mutableCallbackField = null;
+  constructor •(self::Foo::T* finalField, (self::Foo::T*) →* void callbackField) → self::Foo<self::Foo::T*>*
+    : self::Foo::finalField = finalField, self::Foo::callbackField = callbackField, super core::Object::•()
+    ;
+  method method(covariant-by-class self::Foo::T* x) → void {}
+  set setter(covariant-by-class self::Foo::T* x) → void {}
+  method withCallback((self::Foo::T*) →* void callback) → void {
+    callback(this.{self::Foo::finalField}{self::Foo::T*}){(self::Foo::T*) →* void};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
+  fooInt.{self::Foo::method}(3){(core::int*) →* void};
+  fooInt.{self::Foo::setter} = 3;
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {}){((core::int*) →* void) →* void};
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {}){((core::int*) →* void) →* void};
+  fooInt.{self::Foo::mutableField} = 3;
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
+  self::Foo<core::num*>* fooNum = fooInt;
+  fooNum.{self::Foo::method}(3){(core::num*) →* void};
+  fooNum.{self::Foo::method}(2.5){(core::num*) →* void};
+  fooNum.{self::Foo::setter} = 3;
+  fooNum.{self::Foo::setter} = 2.5;
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {}){((core::num*) →* void) →* void};
+  fooNum.{self::Foo::mutableField} = 3;
+  fooNum.{self::Foo::mutableField} = 2.5;
+  let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void)(#t2){(core::num*) →* void};
+  let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void)(#t4){(core::num*) →* void};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
+}
diff --git a/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.weak.modular.expect
new file mode 100644
index 0000000..0390bb6
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-declaration core::num* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _D&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&A&B*
+    : super self::A::•()
+    ;
+  forwarding-stub method foo(covariant-by-declaration core::num* x) → void
+    return super.{self::B::foo}(x);
+}
+class D extends self::_D&A&B implements self::C {
+  synthetic constructor •() → self::D*
+    : super self::_D&A&B::•()
+    ;
+  method foo(covariant-by-declaration core::int* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_super_check.dart.weak.modular.expect b/pkg/front_end/testcases/general/covariant_super_check.dart.weak.modular.expect
new file mode 100644
index 0000000..044d867
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_super_check.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/covariant_super_check.dart:16:27: Error: The parameter 'a' of the method 'C.method' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'A.method'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   method(covariant String a) {}
+//                           ^
+// pkg/front_end/testcases/general/covariant_super_check.dart:6:3: Context: This is the overridden method ('method').
+//   method(num a) {}
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method method(core::num* a) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method method(dynamic a) → dynamic {}
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  method method(covariant-by-declaration core::String* a) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..d28fb6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_type_parameter.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::S*>*
+    : super core::Object::•()
+    ;
+  method method<covariant-by-class T extends self::A::S*>(covariant-by-class self::A::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::S*>*
+    : super core::Object::•()
+    ;
+  method method<covariant-by-class T extends self::B::S*>(covariant-by-declaration covariant-by-class self::B::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<S extends core::Object* = dynamic> extends self::A<self::C::S*> implements self::B<self::C::S*> {
+  synthetic constructor •() → self::C<self::C::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub forwarding-semi-stub method method<covariant-by-class T extends self::C::S*>(covariant-by-declaration covariant-by-class self::C::S* s) → void
+    return super.{self::A::method}<self::C::method::T*>(s);
+}
+class D<S extends core::Object* = dynamic> extends self::A<self::D::S*> implements self::B<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    : super self::A::•()
+    ;
+  forwarding-stub method method<covariant-by-class T extends self::D::S*>(covariant-by-declaration covariant-by-class self::D::S* s) → void
+    return super.{self::A::method}<self::D::method::T*>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.modular.expect
new file mode 100644
index 0000000..fb38c29
--- /dev/null
+++ b/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class SliverConstraints extends core::Object {
+  synthetic constructor •() → self::SliverConstraints
+    : super core::Object::•()
+    ;
+}
+abstract class RenderSliver extends mai::RenderObject {
+  synthetic constructor •() → self::RenderSliver
+    : super mai::RenderObject::•()
+    ;
+  get constraints() → self::SliverConstraints
+    return super.{mai::RenderObject::constraints} as{ForNonNullableByDefault} self::SliverConstraints;
+}
+abstract class _RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin = self::RenderSliver with mai::RenderObjectWithChildMixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin
+    : super self::RenderSliver::•()
+    ;
+  abstract member-signature get constraints() → invalid-type; -> self::RenderSliver::constraints
+}
+abstract class RenderSliverSingleBoxAdapter extends self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin {
+  synthetic constructor •() → self::RenderSliverSingleBoxAdapter
+    : super self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/crashes/crash_01/main_lib.dart:2:3: Error: Type 'Constraints' not found.
+//   Constraints get constraints {}
+//   ^^^^^^^^^^^
+//
+import self as mai;
+import "dart:core" as core;
+
+abstract class RenderObject extends core::Object {
+  synthetic constructor •() → mai::RenderObject
+    : super core::Object::•()
+    ;
+  get constraints() → invalid-type {}
+}
+abstract class RenderObjectWithChildMixin extends mai::RenderObject /*isMixinDeclaration*/  {
+}
diff --git a/pkg/front_end/testcases/general/crashes/crash_03/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/crashes/crash_03/main.dart.weak.modular.expect
new file mode 100644
index 0000000..923fadf
--- /dev/null
+++ b/pkg/front_end/testcases/general/crashes/crash_03/main.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/crashes/crash_03/main.dart:7:57: Error: Type 'MouseTrackerAnnotation' not found.
+// mixin _PlatformViewGestureMixin on RenderBox implements MouseTrackerAnnotation {
+//                                                         ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_03/main.dart:9:7: Error: The getter '_hitTestBehavior' isn't defined for the class '_PlatformViewGestureMixin'.
+//  - '_PlatformViewGestureMixin' is from 'pkg/front_end/testcases/general/crashes/crash_03/main.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named '_hitTestBehavior'.
+//       _hitTestBehavior != PlatformViewHitTestBehavior.transparent;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_03/main.dart:9:27: Error: The getter 'PlatformViewHitTestBehavior' isn't defined for the class '_PlatformViewGestureMixin'.
+//  - '_PlatformViewGestureMixin' is from 'pkg/front_end/testcases/general/crashes/crash_03/main.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'PlatformViewHitTestBehavior'.
+//       _hitTestBehavior != PlatformViewHitTestBehavior.transparent;
+//                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class Offset extends core::Object {
+  synthetic constructor •() → self::Offset
+    : super core::Object::•()
+    ;
+}
+abstract class _PlatformViewRenderBox&RenderBox&_PlatformViewGestureMixin = mai::RenderBox with self::_PlatformViewGestureMixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PlatformViewRenderBox&RenderBox&_PlatformViewGestureMixin
+    : super mai::RenderBox::•()
+    ;
+  mixin-super-stub method hitTestSelf(self::Offset position) → core::bool
+    return super.{self::_PlatformViewGestureMixin::hitTestSelf}(position);
+}
+class PlatformViewRenderBox extends self::_PlatformViewRenderBox&RenderBox&_PlatformViewGestureMixin {
+  synthetic constructor •() → self::PlatformViewRenderBox
+    : super self::_PlatformViewRenderBox&RenderBox&_PlatformViewGestureMixin::•()
+    ;
+}
+abstract class _PlatformViewGestureMixin extends mai::RenderBox /*isMixinDeclaration*/  {
+  method hitTestSelf(self::Offset position) → core::bool
+    return !(invalid-expression "pkg/front_end/testcases/general/crashes/crash_03/main.dart:9:7: Error: The getter '_hitTestBehavior' isn't defined for the class '_PlatformViewGestureMixin'.
+ - '_PlatformViewGestureMixin' is from 'pkg/front_end/testcases/general/crashes/crash_03/main.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named '_hitTestBehavior'.
+      _hitTestBehavior != PlatformViewHitTestBehavior.transparent;
+      ^^^^^^^^^^^^^^^^" in this{<unresolved>}._hitTestBehavior =={core::Object::==}{(core::Object) → core::bool} invalid-expression "pkg/front_end/testcases/general/crashes/crash_03/main.dart:9:27: Error: The getter 'PlatformViewHitTestBehavior' isn't defined for the class '_PlatformViewGestureMixin'.
+ - '_PlatformViewGestureMixin' is from 'pkg/front_end/testcases/general/crashes/crash_03/main.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'PlatformViewHitTestBehavior'.
+      _hitTestBehavior != PlatformViewHitTestBehavior.transparent;
+                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^" in this{<unresolved>}.PlatformViewHitTestBehavior{dynamic}.transparent);
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/crashes/crash_03/main_lib.dart:2:20: Error: Type 'Offset' not found.
+//   bool hitTestSelf(Offset position) => false;
+//                    ^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_03/main_lib.dart:2:20: Error: 'Offset' isn't a type.
+//   bool hitTestSelf(Offset position) => false;
+//                    ^^^^^^
+//
+import self as mai;
+import "dart:core" as core;
+
+abstract class RenderBox extends core::Object {
+  synthetic constructor •() → mai::RenderBox
+    : super core::Object::•()
+    ;
+  method hitTestSelf(invalid-type position) → core::bool
+    return false;
+}
diff --git a/pkg/front_end/testcases/general/crashes/crash_04/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/crashes/crash_04/main.dart.weak.modular.expect
new file mode 100644
index 0000000..9b02f5d
--- /dev/null
+++ b/pkg/front_end/testcases/general/crashes/crash_04/main.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/crashes/crash_04/main.dart:1:19: Error: Type 'C' not found.
+// mixin A<T extends C> on D {}
+//                   ^
+//
+// pkg/front_end/testcases/general/crashes/crash_04/main.dart:1:25: Error: Type 'D' not found.
+// mixin A<T extends C> on D {}
+//                         ^
+//
+// pkg/front_end/testcases/general/crashes/crash_04/main.dart:3:17: Error: Type 'D' not found.
+// class B extends D with A {}
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends invalid-type> extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class _B&D&A = core::Object with self::A<invalid-type> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B&D&A
+    : super core::Object::•()
+    ;
+}
+class B extends self::_B&D&A {
+  synthetic constructor •() → self::B
+    : super self::_B&D&A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.modular.expect
new file mode 100644
index 0000000..3a5d2de
--- /dev/null
+++ b/pkg/front_end/testcases/general/crashes/crash_05/main.dart.weak.modular.expect
@@ -0,0 +1,98 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main.dart:6:20: Error: Type 'PointerEvent' not found.
+//   void handleEvent(PointerEvent event, SliverHitTestEntry entry) {}
+//                    ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main.dart:10:37: Error: Type 'RenderBox' not found.
+//     with RenderObjectWithChildMixin<RenderBox>, RenderSliverHelpers {}
+//                                     ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main.dart:10:49: Error: Type 'RenderSliverHelpers' not found.
+//     with RenderObjectWithChildMixin<RenderBox>, RenderSliverHelpers {}
+//                                                 ^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main.dart:9:16: Error: The type 'RenderSliverHelpers' can't be mixed in.
+// abstract class RenderSliverSingleBoxAdapter extends RenderSliver
+//                ^
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main.dart:9:16: Error: 'RenderSliver' doesn't implement 'RenderObject' so it can't be used with 'RenderObjectWithChildMixin<invalid-type>'.
+//  - 'RenderSliver' is from 'pkg/front_end/testcases/general/crashes/crash_05/main.dart'.
+//  - 'RenderObject' is from 'pkg/front_end/testcases/general/crashes/crash_05/main_lib.dart'.
+//  - 'RenderObjectWithChildMixin' is from 'pkg/front_end/testcases/general/crashes/crash_05/main_lib.dart'.
+// abstract class RenderSliverSingleBoxAdapter extends RenderSliver
+//                ^
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main.dart:6:20: Error: 'PointerEvent' isn't a type.
+//   void handleEvent(PointerEvent event, SliverHitTestEntry entry) {}
+//                    ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class SliverHitTestEntry extends core::Object {
+  synthetic constructor •() → self::SliverHitTestEntry
+    : super core::Object::•()
+    ;
+}
+abstract class RenderSliver extends core::Object {
+  synthetic constructor •() → self::RenderSliver
+    : super core::Object::•()
+    ;
+  method handleEvent(invalid-type event, self::SliverHitTestEntry entry) → void {}
+}
+abstract class _RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin = self::RenderSliver with mai::RenderObjectWithChildMixin<invalid-type> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin
+    : super self::RenderSliver::•()
+    ;
+  forwarding-stub method handleEvent(invalid-type event, covariant-by-declaration invalid-type entry) → void
+    return super.{self::RenderSliver::handleEvent}(event, entry);
+}
+abstract class _RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin&RenderSliverHelpers extends self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin&RenderSliverHelpers
+    : super self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin::•()
+    ;
+}
+abstract class RenderSliverSingleBoxAdapter extends self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin&RenderSliverHelpers {
+  synthetic constructor •() → self::RenderSliverSingleBoxAdapter
+    : super self::_RenderSliverSingleBoxAdapter&RenderSliver&RenderObjectWithChildMixin&RenderSliverHelpers::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main_lib.dart:2:20: Error: Type 'PointerEvent' not found.
+//   void handleEvent(PointerEvent event, covariant HitTestEntry entry) {}
+//                    ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main_lib.dart:2:50: Error: Type 'HitTestEntry' not found.
+//   void handleEvent(PointerEvent event, covariant HitTestEntry entry) {}
+//                                                  ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main_lib.dart:2:20: Error: 'PointerEvent' isn't a type.
+//   void handleEvent(PointerEvent event, covariant HitTestEntry entry) {}
+//                    ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/crashes/crash_05/main_lib.dart:2:50: Error: 'HitTestEntry' isn't a type.
+//   void handleEvent(PointerEvent event, covariant HitTestEntry entry) {}
+//                                                  ^^^^^^^^^^^^
+//
+import self as mai;
+import "dart:core" as core;
+
+abstract class RenderObject extends core::Object {
+  synthetic constructor •() → mai::RenderObject
+    : super core::Object::•()
+    ;
+  method handleEvent(invalid-type event, covariant-by-declaration invalid-type entry) → void {}
+}
+abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
+}
diff --git a/pkg/front_end/testcases/general/cycles.dart.weak.modular.expect b/pkg/front_end/testcases/general/cycles.dart.weak.modular.expect
new file mode 100644
index 0000000..ec6f025
--- /dev/null
+++ b/pkg/front_end/testcases/general/cycles.dart.weak.modular.expect
@@ -0,0 +1,85 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/cycles.dart:5:7: Error: 'A' is a supertype of itself.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/general/cycles.dart:7:7: Error: 'B' is a supertype of itself.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/general/cycles.dart:9:7: Error: 'C' is a supertype of itself.
+// class C extends B implements D {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(new self::A::•());
+  core::print(new self::B::•());
+  core::print(new self::C::•());
+  core::print(new self::D::•());
+}
diff --git a/pkg/front_end/testcases/general/default_values.dart.weak.modular.expect b/pkg/front_end/testcases/general/default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..7b8886e
--- /dev/null
+++ b/pkg/front_end/testcases/general/default_values.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method topLevel([dynamic a = #C1]) → dynamic
+  return a;
+static method main() → dynamic {
+  core::print(self::topLevel());
+}
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/general/deferred_type_annotation.dart.weak.modular.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.weak.modular.expect
new file mode 100644
index 0000000..bdaedd7
--- /dev/null
+++ b/pkg/front_end/testcases/general/deferred_type_annotation.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/deferred_type_annotation.dart:7:5: Error: The type 'C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/general/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'd' or use a supertype of 'C' that isn't deferred.
+// bad(d.C x) {}
+//     ^^^
+//
+import self as self;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as d;
+
+static method bad(def::C* x) → dynamic {}
+static method main() → dynamic {}
+
+library;
+import self as def;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y = 1;
+  synthetic constructor •() → def::C*
+    : super core::Object::•()
+    ;
+  static method m() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/demote_closure_types.dart.weak.modular.expect b/pkg/front_end/testcases/general/demote_closure_types.dart.weak.modular.expect
new file mode 100644
index 0000000..f789104
--- /dev/null
+++ b/pkg/front_end/testcases/general/demote_closure_types.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/demote_closure_types.dart:8:17: Error: A value of type 'T' can't be assigned to a variable of type 'String'.
+//     String s = f();
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method method<T extends core::Object* = dynamic>(self::method::T* a, self::method::T* b) → dynamic {
+  if(a is core::String*) {
+    () →* self::method::T* f = () → self::method::T* => a{self::method::T* & core::String* /* '*' & '*' = '*' */};
+    core::String* s = invalid-expression "pkg/front_end/testcases/general/demote_closure_types.dart:8:17: Error: A value of type 'T' can't be assigned to a variable of type 'String'.
+    String s = f();
+                ^" in f(){() →* self::method::T*} as{TypeError} core::String*;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/duplicate_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/general/duplicate_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..05dcdaa
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicate_instantiation.dart.weak.modular.expect
@@ -0,0 +1,346 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:13:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   Class<int>;
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:15:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>;
+//            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:15:18: Error: Expected '[' before this.
+//   Class<int><int>;
+//                  ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:16:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>();
+//            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:16:20: Error: Unexpected token ';'.
+//   Class<int><int>();
+//                    ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:16:20: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   Class<int><int>();
+//                    ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:16:20: Error: Expected ';' after this.
+//   Class<int><int>();
+//                    ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:17:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   Class<int>.named;
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:17:14: Error: Member not found: 'named'.
+//   Class<int>.named;
+//              ^^^^^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:19:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   Class<int>.named<int>;
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:19:19: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   Class<int>.named<int>;
+//                   ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:19:14: Error: Member not found: 'named'.
+//   Class<int>.named<int>;
+//              ^^^^^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:20:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   Class<int>.named<int>();
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:20:14: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   Class<int>.named<int>();
+//              ^^^^^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:21:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named;
+//            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:21:18: Error: Expected '[' before this.
+//   Class<int><int>.named;
+//                  ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:22:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named();
+//            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:22:18: Error: Expected '[' before this.
+//   Class<int><int>.named();
+//                  ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:23:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int>;
+//            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:23:18: Error: Expected '[' before this.
+//   Class<int><int>.named<int>;
+//                  ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:23:24: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   Class<int><int>.named<int>;
+//                        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:24:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int>();
+//            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:24:18: Error: Expected '[' before this.
+//   Class<int><int>.named<int>();
+//                  ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:25:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>;
+//            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:25:18: Error: Expected '[' before this.
+//   Class<int><int>.named<int><int>;
+//                  ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:25:24: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>;
+//                        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:25:28: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>;
+//                            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:25:34: Error: Expected '[' before this.
+//   Class<int><int>.named<int><int>;
+//                                  ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:12: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>();
+//            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:18: Error: Expected '[' before this.
+//   Class<int><int>.named<int><int>();
+//                  ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:24: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>();
+//                        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:28: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
+//   Class<int><int>.named<int><int>();
+//                            ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:36: Error: Unexpected token ';'.
+//   Class<int><int>.named<int><int>();
+//                                    ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:36: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   Class<int><int>.named<int><int>();
+//                                    ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:36: Error: Expected ';' after this.
+//   Class<int><int>.named<int><int>();
+//                                    ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:15:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>;
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:16:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>();
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:21:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named;
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:21:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+//   Class<int><int>.named;
+//                   ^^^^^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:22:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named();
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:22:19: Error: The method 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'named'.
+//   Class<int><int>.named();
+//                   ^^^^^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:23:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named<int>;
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:23:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+//   Class<int><int>.named<int>;
+//                   ^^^^^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:24:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named<int>();
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:24:19: Error: The method 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'named'.
+//   Class<int><int>.named<int>();
+//                   ^^^^^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:25:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named<int><int>;
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:25:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+//   Class<int><int>.named<int><int>;
+//                   ^^^^^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:8: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   Class<int><int>.named<int><int>();
+//        ^
+//
+// pkg/front_end/testcases/general/duplicate_instantiation.dart:26:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+//   Class<int><int>.named<int><int>();
+//                   ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  constructor named() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  #C1;
+  new self::Class::•<core::int>();
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:15:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>;
+       ^" in #C1{<unresolved>}.<(#C2){dynamic}.>(<core::int>[]);
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:16:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>();
+       ^" in #C1{<unresolved>}.<(#C2){dynamic}.>(<int extends core::Object? = dynamic>() → Null
+    ;
+);
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:17:14: Error: Member not found: 'named'.
+  Class<int>.named;
+             ^^^^^";
+  new self::Class::named<core::int>();
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:19:14: Error: Member not found: 'named'.
+  Class<int>.named<int>;
+             ^^^^^";
+  new self::Class::named<core::int>();
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:21:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named;
+       ^" in #C1{<unresolved>}.<(#C2){dynamic}.>(invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:21:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+  Class<int><int>.named;
+                  ^^^^^" in <core::int>[]{<unresolved>}.named);
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:22:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named();
+       ^" in #C1{<unresolved>}.<(#C2){dynamic}.>(invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:22:19: Error: The method 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'named'.
+  Class<int><int>.named();
+                  ^^^^^" in <core::int>[]{<unresolved>}.named());
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:23:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named<int>;
+       ^" in #C1{<unresolved>}.<(#C2){dynamic}.>(invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:23:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+  Class<int><int>.named<int>;
+                  ^^^^^" in <core::int>[]{<unresolved>}.named);
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:24:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named<int>();
+       ^" in #C1{<unresolved>}.<(#C2){dynamic}.>(invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:24:19: Error: The method 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'named'.
+  Class<int><int>.named<int>();
+                  ^^^^^" in <core::int>[]{<unresolved>}.named<core::int>());
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:25:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named<int><int>;
+       ^" in #C1{<unresolved>}.<(#C2){dynamic}.>(invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:25:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+  Class<int><int>.named<int><int>;
+                  ^^^^^" in <core::int>[]{<unresolved>}.named){dynamic}.<(#C2){dynamic}.>(<core::int>[]);
+  invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:26:8: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  Class<int><int>.named<int><int>();
+       ^" in #C1{<unresolved>}.<(#C2){dynamic}.>(invalid-expression "pkg/front_end/testcases/general/duplicate_instantiation.dart:26:19: Error: The getter 'named' isn't defined for the class 'List<int>'.
+ - 'List' is from 'dart:core'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'named'.
+  Class<int><int>.named<int><int>();
+                  ^^^^^" in <core::int>[]{<unresolved>}.named){dynamic}.<(#C2){dynamic}.>(<int extends core::Object? = dynamic>() → Null
+    ;
+);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::Class<dynamic>*)
+  #C2 = TypeLiteralConstant(core::int*)
+}
diff --git a/pkg/front_end/testcases/general/duplicate_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/general/duplicate_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..6428f44
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicate_typedef.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicate_typedef.dart:6:9: Error: 'F' is already declared in this scope.
+// typedef F = void Function();
+//         ^
+// pkg/front_end/testcases/general/duplicate_typedef.dart:5:9: Context: Previous declaration of 'F'.
+// typedef F = void Function();
+//         ^
+//
+// pkg/front_end/testcases/general/duplicate_typedef.dart:9:9: Error: 'G' is already declared in this scope.
+// typedef G<T> = void Function(T);
+//         ^
+// pkg/front_end/testcases/general/duplicate_typedef.dart:8:9: Context: Previous declaration of 'G'.
+// typedef G<T> = void Function(T);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = () → void;
+typedef G<contravariant T extends core::Object? = dynamic> = (T%) → void;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.weak.modular.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.weak.modular.expect
new file mode 100644
index 0000000..c5b39f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.weak.modular.expect
@@ -0,0 +1,117 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:12:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:10:7: Context: Previous declaration of 'Dupe'.
+// class Dupe {}
+//       ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:15:3: Error: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:8:45: Error: 'C' is imported from both 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib2.dart'.
+// import 'duplicated_bad_prefix_lib2.dart' as dupe;
+//                                             ^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:15:3: Error: 'Dupe.a' isn't a type.
+//   Dupe.a b;
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///duplicated_bad_prefix_lib1.dart" as dupe;
+import "org-dartlang-testcase:///duplicated_bad_prefix_lib2.dart" as dupe;
+
+class Dupe#1 extends core::Object {
+  synthetic constructor •() → self::Dupe#1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field invalid-type b = null;
+  field invalid-type d = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self2::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self3::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.weak.modular.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.weak.modular.expect
new file mode 100644
index 0000000..183d7ef
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.weak.modular.expect
@@ -0,0 +1,693 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:7:1: Error: Import directives must precede part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:9:1: Error: Import directives must precede part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:11:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:15:1: Error: Directives must appear before any declarations.
+// Try moving the directive before any declarations.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:17:14: Context: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:21:5: Context: Previous declaration of 'field'.
+// var field = "1st";
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:25:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:43:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:42:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:46:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:44:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:52:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:48:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:60:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:56:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:72:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:41:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:77:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:79:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:78:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:83:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:76:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:95:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:89:6: Context: Previous declaration of 'toString' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:96:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:89:6: Context: Previous declaration of 'values' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:13:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:19:16: Context: Previous declaration of 'OldTypedef'.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
+// var field = "3rd";
+//     ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:23:5: Context: Previous declaration of 'field'.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:29:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:72:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:83:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:7:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:9:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:11:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:15:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:17:14: Context: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = 4;
+//     ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:21:5: Context: Previous declaration of 'field'.
+// var field = "3rd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
+// var field = 5.0;
+//     ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:23:5: Context: Previous declaration of 'field'.
+// var field = 4;
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:27:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:31:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:65:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:74:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:75:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:73:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:80:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+//                                              ^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:13:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:67:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:67:19: Context: This isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:94:3: Error: Can't declare a member that conflicts with an inherited one.
+//   index,
+//   ^^^^^
+// sdk/lib/core/enum.dart:74:13: Context: This is the inherited member.
+//   final int index;
+//             ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
+//   main();
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
+//   print(field);
+//         ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
+//   C.s();
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:37:5: Error: Expected identifier, but got 'this'.
+//   C.this();
+//     ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:38:6: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   C.();
+//      ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:38:5: Error: Expected an identifier, but got '('.
+// Try inserting an identifier before '('.
+//   C.();
+//     ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:64:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:68:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   Sub() : super(null);
+//                ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:69:16: Error: Superclass has no method named 'm'.
+//   m() => super.m();
+//                ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:106:41: Error: Can't use 'toString' because it is declared more than once.
+//     "AnotherEnum.toString": AnotherEnum.toString,
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:107:39: Error: Can't use 'values' because it is declared more than once.
+//     "AnotherEnum.values": AnotherEnum.values,
+//                                       ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///duplicated_declarations_lib.dart" as Typedef;
+import "org-dartlang-testcase:///duplicated_declarations_lib.dart" as Typedef;
+import "org-dartlang-testcase:///duplicated_declarations_lib.dart" as Typedef;
+import "org-dartlang-testcase:///duplicated_declarations_lib.dart" as Typedef;
+import "org-dartlang-testcase:///duplicated_declarations_lib.dart" as Typedef;
+import "org-dartlang-testcase:///duplicated_declarations_lib.dart" as Typedef;
+
+part duplicated_declarations_part.dart;
+typedef Typedef = () →* void;
+typedef OldTypedef = () →* void;
+class C#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#4*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  field core::String* field = null;
+  constructor •(dynamic a) → self::C#2*
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/general/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C#1 extends core::Object {
+  constructor _() → self::C#1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field core::String* field = null;
+  constructor •(dynamic a) → self::C*
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:64:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Sub extends core::Object {
+  constructor •() → self::Sub*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:68:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  Sub() : super(null);
+               ^"
+    ;
+  method m() → dynamic
+    return super.m();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Enum#4 extends core::_Enum /*isEnum*/  { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  static const field core::List<self::Enum#4*>* values = #C4;
+  static const field self::Enum#4* a = #C3;
+  const constructor •(core::int* index, core::String* name) → self::Enum#4*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "Enum#4.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Enum#3 extends core::_Enum /*isEnum*/  { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  static const field core::List<self::Enum#3*>* values = #C12;
+  static const field self::Enum#3* a = #C5;
+  static const field self::Enum#3* b = #C8;
+  static const field self::Enum#3* c = #C11;
+  const constructor •(core::int* index, core::String* name) → self::Enum#3*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "Enum#3.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Enum#2 extends core::_Enum /*isEnum*/  { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  static const field core::List<self::Enum#2*>* values = #C17;
+  static const field self::Enum#2* Enum = #C14;
+  static const field self::Enum#2* a = #C15;
+  static const field self::Enum#2* b = #C16;
+  const constructor •(core::int* index, core::String* name) → self::Enum#2*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "Enum#2.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Enum#1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum#1*>* values = #C21;
+  static const field self::Enum#1* a = #C18;
+  static const field self::Enum#1* b = #C19;
+  static const field self::Enum#1* c = #C20;
+  const constructor •(core::int* index, core::String* name) → self::Enum#1*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "Enum#1.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Enum extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum*>* values = #C25;
+  static const field self::Enum* Enum = #C22;
+  static const field self::Enum* a = #C23;
+  static const field self::Enum* b = #C24;
+  const constructor •(core::int* index, core::String* name) → self::Enum*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "Enum.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AnotherEnum extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::AnotherEnum*>* values = #C35;
+  static const field self::AnotherEnum* a = #C26;
+  static const field self::AnotherEnum* b = #C27;
+  static const field self::AnotherEnum* c = #C28;
+  static const field self::AnotherEnum* _name = #C31;
+  static const field self::AnotherEnum* index = #C34;
+  const constructor •(core::int* index, core::String* name) → self::AnotherEnum*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "AnotherEnum.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::String* field;
+static method main() → dynamic {
+  "1st";
+}
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
+  main();
+  ^"{dynamic}.call();
+  core::print(invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
+  print(field);
+        ^");
+  invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
+  C.s();
+  ^"{dynamic}.s();
+  invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:37:5: Error: Expected identifier, but got 'this'.
+  C.this();
+    ^^^^";
+  invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:38:5: Error: Expected an identifier, but got '('.
+Try inserting an identifier before '('.
+  C.();
+    ^";
+}
+static method useAnotherEnum() → dynamic {
+  <core::String*, core::Object*>{"AnotherEnum.a": #C26, "AnotherEnum.b": #C27, "AnotherEnum.c": #C28, "AnotherEnum._name": #C31, "AnotherEnum.index": #C34, "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:106:41: Error: Can't use 'toString' because it is declared more than once.
+    \"AnotherEnum.toString\": AnotherEnum.toString,
+                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:107:39: Error: Can't use 'values' because it is declared more than once.
+    \"AnotherEnum.values\": AnotherEnum.values,
+                                      ^^^^^^"};
+}
+
+library;
+import self as self2;
+
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::Enum#4 {index:#C1, _name:#C2}
+  #C4 = <self::Enum#4*>[#C3]
+  #C5 = self::Enum#3 {index:#C1, _name:#C2}
+  #C6 = 1
+  #C7 = "b"
+  #C8 = self::Enum#3 {index:#C6, _name:#C7}
+  #C9 = 2
+  #C10 = "c"
+  #C11 = self::Enum#3 {index:#C9, _name:#C10}
+  #C12 = <self::Enum#3*>[#C5, #C8, #C11]
+  #C13 = "Enum"
+  #C14 = self::Enum#2 {index:#C1, _name:#C13}
+  #C15 = self::Enum#2 {index:#C6, _name:#C2}
+  #C16 = self::Enum#2 {index:#C9, _name:#C7}
+  #C17 = <self::Enum#2*>[#C14, #C15, #C16]
+  #C18 = self::Enum#1 {index:#C1, _name:#C2}
+  #C19 = self::Enum#1 {index:#C6, _name:#C7}
+  #C20 = self::Enum#1 {index:#C9, _name:#C10}
+  #C21 = <self::Enum#1*>[#C18, #C19, #C20]
+  #C22 = self::Enum {index:#C1, _name:#C13}
+  #C23 = self::Enum {index:#C6, _name:#C2}
+  #C24 = self::Enum {index:#C9, _name:#C7}
+  #C25 = <self::Enum*>[#C22, #C23, #C24]
+  #C26 = self::AnotherEnum {index:#C1, _name:#C2}
+  #C27 = self::AnotherEnum {index:#C6, _name:#C7}
+  #C28 = self::AnotherEnum {index:#C9, _name:#C10}
+  #C29 = 3
+  #C30 = "_name"
+  #C31 = self::AnotherEnum {index:#C29, _name:#C30}
+  #C32 = 4
+  #C33 = "index"
+  #C34 = self::AnotherEnum {index:#C32, _name:#C33}
+  #C35 = <self::AnotherEnum*>[#C26, #C27, #C28, #C31, #C34]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///duplicated_declarations.dart:
+- Enum#1. (from org-dartlang-testcase:///duplicated_declarations.dart:83:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Enum. (from org-dartlang-testcase:///duplicated_declarations.dart:76:6)
+- AnotherEnum. (from org-dartlang-testcase:///duplicated_declarations.dart:89:6)
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..92572f2
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
+//   int a;
+//       ^
+// pkg/front_end/testcases/general/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
+//   int a;
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
+//   A(this.a);
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* a = null;
+  constructor •(core::int* a) → self::A*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
+  A(this.a);
+         ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/general/duplicated_named_args_3.dart.weak.modular.expect b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.weak.modular.expect
new file mode 100644
index 0000000..d6d8288
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_named_args_3.dart:13:13: Error: Duplicated named argument 'a'.
+//   C.m(a: 1, a: 2, a: 3);
+//             ^
+//
+// pkg/front_end/testcases/general/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
+//   C.m(a: 1, a: 2, a: 3);
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static method m({core::int* a = #C1}) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  self::C::m(a: invalid-expression "pkg/front_end/testcases/general/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
+  C.m(a: 1, a: 2, a: 3);
+                  ^" in block {
+    invalid-expression "pkg/front_end/testcases/general/duplicated_named_args_3.dart:13:13: Error: Duplicated named argument 'a'.
+  C.m(a: 1, a: 2, a: 3);
+            ^" in block {
+      1;
+    } =>2;
+  } =>3);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/general/dynamic_and_void.dart.weak.modular.expect b/pkg/front_end/testcases/general/dynamic_and_void.dart.weak.modular.expect
new file mode 100644
index 0000000..c400faa
--- /dev/null
+++ b/pkg/front_end/testcases/general/dynamic_and_void.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/dynamic_and_void.dart:10:1: Error: Type 'dynamic' not found.
+// dynamic testDynamic() => 0;
+// ^^^^^^^
+//
+import self as self;
+
+import "dart:core" show int;
+
+static method testDynamic() → invalid-type
+  return 0;
+static method testVoid() → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/enum_names_from_core.dart.weak.modular.expect b/pkg/front_end/testcases/general/enum_names_from_core.dart.weak.modular.expect
new file mode 100644
index 0000000..f367499
--- /dev/null
+++ b/pkg/front_end/testcases/general/enum_names_from_core.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class int extends core::Object {
+  synthetic constructor •() → self::int
+    : super core::Object::•()
+    ;
+}
+class Object extends core::Object {
+  synthetic constructor •() → self::Object
+    : super core::Object::•()
+    ;
+}
+class String extends core::Object {
+  synthetic constructor •() → self::String
+    : super core::Object::•()
+    ;
+}
+class _Enum extends core::Object {
+  synthetic constructor •() → self::_Enum
+    : super core::Object::•()
+    ;
+}
+class List extends core::Object {
+  synthetic constructor •() → self::List
+    : super core::Object::•()
+    ;
+}
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = #C16;
+  static const field self::E int = #C3;
+  static const field self::E Object = #C6;
+  static const field self::E String = #C9;
+  static const field self::E _Enum = #C12;
+  static const field self::E List = #C15;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "int"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Object"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "String"
+  #C9 = self::E {index:#C7, _name:#C8}
+  #C10 = 3
+  #C11 = "_Enum"
+  #C12 = self::E {index:#C10, _name:#C11}
+  #C13 = 4
+  #C14 = "List"
+  #C15 = self::E {index:#C13, _name:#C14}
+  #C16 = <self::E*>[#C3, #C6, #C9, #C12, #C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum_names_from_core.dart:
+- E. (from org-dartlang-testcase:///enum_names_from_core.dart:15:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_01.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_locations/error_location_01.dart.weak.modular.expect
new file mode 100644
index 0000000..a1e0f80
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_locations/error_location_01.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "error_location_01_lib1.dart" as err;
+import "error_location_01_lib2.dart" as err2;
+
+import "org-dartlang-testcase:///error_location_01_lib1.dart";
+import "org-dartlang-testcase:///error_location_01_lib2.dart";
+
+static method main() → dynamic {
+  err::foo();
+  err2::bar();
+}
+
+library;
+import self as err;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::int* i) → err::Foo*
+    : assert(i.{core::num::>}(0){(core::num*) →* core::bool*}), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  new err::Foo::•(0);
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_locations/error_location_01_lib2.dart:8:9: Error: Constant evaluation error:
+//   const Foo(0);
+//         ^
+// pkg/front_end/testcases/general/error_locations/error_location_01_lib1.dart:6:31: Context: This assertion failed.
+//   const Foo(int i) : assert(i > 0);
+//                               ^
+//
+import self as err2;
+
+import "org-dartlang-testcase:///error_location_01_lib1.dart";
+
+static method bar() → dynamic {
+  invalid-expression "This assertion failed.";
+}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///error_location_01_lib2.dart:
+- Foo. (from org-dartlang-testcase:///error_location_01_lib1.dart:6:9)
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_02.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_locations/error_location_02.dart.weak.modular.expect
new file mode 100644
index 0000000..4b68f2c
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_locations/error_location_02.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library;
+import self as self;
+import "error_location_02_lib1.dart" as err;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///error_location_02_lib1.dart";
+import "org-dartlang-testcase:///error_location_02_lib2.dart";
+import "org-dartlang-testcase:///error_location_02_lib3.dart";
+
+static method main() → dynamic {
+  err::foo();
+  core::print(invalid-expression "This assertion failed.");
+}
+
+library;
+import self as err;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::int* i) → err::Foo*
+    : assert(i.{core::num::>}(0){(core::num*) →* core::bool*}), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  new err::Foo::•(0);
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_locations/error_location_02_lib2.dart:7:24: Error: Constant evaluation error:
+// const fooField = const Foo(0);
+//                        ^
+// pkg/front_end/testcases/general/error_locations/error_location_02_lib1.dart:6:31: Context: This assertion failed.
+//   const Foo(int i) : assert(i > 0);
+//                               ^
+// pkg/front_end/testcases/general/error_locations/error_location_02_lib2.dart:7:7: Context: While analyzing:
+// const fooField = const Foo(0);
+//       ^
+//
+import self as self2;
+import "error_location_02_lib1.dart" as err;
+
+import "org-dartlang-testcase:///error_location_02_lib1.dart";
+
+static const field err::Foo* fooField = invalid-expression "This assertion failed.";
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_locations/error_location_02_lib3.dart:7:19: Error: Constant evaluation error:
+// const fooField2 = fooField;
+//                   ^
+// pkg/front_end/testcases/general/error_locations/error_location_02_lib1.dart:6:31: Context: This assertion failed.
+//   const Foo(int i) : assert(i > 0);
+//                               ^
+// pkg/front_end/testcases/general/error_locations/error_location_02_lib3.dart:7:7: Context: While analyzing:
+// const fooField2 = fooField;
+//       ^
+//
+import self as self3;
+import "error_location_02_lib1.dart" as err;
+
+import "org-dartlang-testcase:///error_location_02_lib2.dart";
+
+static const field err::Foo* fooField2 = invalid-expression "This assertion failed.";
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///error_location_02_lib2.dart:
+- Foo. (from org-dartlang-testcase:///error_location_02_lib1.dart:6:9)
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_03.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_locations/error_location_03.dart.weak.modular.expect
new file mode 100644
index 0000000..a11cbcd
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_locations/error_location_03.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library;
+import self as self;
+import "error_location_03_lib1.dart" as err;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///error_location_03_lib1.dart";
+import "org-dartlang-testcase:///error_location_03_lib2.dart";
+import "org-dartlang-testcase:///error_location_03_lib3.dart";
+
+static method main() → dynamic {
+  err::foo();
+  core::print(invalid-expression "This assertion failed.");
+  core::print(invalid-expression "This assertion failed.");
+}
+
+library;
+import self as err;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::int* i) → err::Foo*
+    : assert(i.{core::num::>}(0){(core::num*) →* core::bool*}), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  new err::Foo::•(0);
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_locations/error_location_03_lib2.dart:7:24: Error: Constant evaluation error:
+// const fooField = const Foo(0);
+//                        ^
+// pkg/front_end/testcases/general/error_locations/error_location_03_lib1.dart:6:31: Context: This assertion failed.
+//   const Foo(int i) : assert(i > 0);
+//                               ^
+// pkg/front_end/testcases/general/error_locations/error_location_03_lib2.dart:7:7: Context: While analyzing:
+// const fooField = const Foo(0);
+//       ^
+//
+import self as self2;
+import "error_location_03_lib1.dart" as err;
+
+import "org-dartlang-testcase:///error_location_03_lib1.dart";
+
+static const field err::Foo* fooField = invalid-expression "This assertion failed.";
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_locations/error_location_03_lib3.dart:7:25: Error: Constant evaluation error:
+// const fooField2 = const Foo(0);
+//                         ^
+// pkg/front_end/testcases/general/error_locations/error_location_03_lib1.dart:6:31: Context: This assertion failed.
+//   const Foo(int i) : assert(i > 0);
+//                               ^
+// pkg/front_end/testcases/general/error_locations/error_location_03_lib3.dart:7:7: Context: While analyzing:
+// const fooField2 = const Foo(0);
+//       ^
+//
+import self as self3;
+import "error_location_03_lib1.dart" as err;
+
+import "org-dartlang-testcase:///error_location_03_lib1.dart";
+
+static const field err::Foo* fooField2 = invalid-expression "This assertion failed.";
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///error_location_03_lib2.dart:
+- Foo. (from org-dartlang-testcase:///error_location_03_lib1.dart:6:9)
+
+org-dartlang-testcase:///error_location_03_lib3.dart:
+- Foo. (from org-dartlang-testcase:///error_location_03_lib1.dart:6:9)
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_04.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_locations/error_location_04.dart.weak.modular.expect
new file mode 100644
index 0000000..32f4daa
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_locations/error_location_04.dart.weak.modular.expect
@@ -0,0 +1,76 @@
+library;
+import self as self;
+import "error_location_04_lib1.dart" as err;
+import "error_location_04_lib2.dart" as err2;
+
+import "org-dartlang-testcase:///error_location_04_lib1.dart";
+import "org-dartlang-testcase:///error_location_04_lib2.dart";
+
+static method main() → dynamic {
+  err::foo();
+  err2::bar();
+}
+
+library;
+import self as err;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::int* i) → err::Foo*
+    : assert(i.{core::num::>}(0){(core::num*) →* core::bool*}), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  new err::Foo::•(0);
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_locations/error_location_04_lib2.dart:9:27: Error: Constant evaluation error:
+//   const Bar() : x = const Foo(0);
+//                           ^
+// pkg/front_end/testcases/general/error_locations/error_location_04_lib1.dart:6:31: Context: This assertion failed.
+//   const Foo(int i) : assert(i > 0);
+//                               ^
+//
+import self as err2;
+import "dart:core" as core;
+import "error_location_04_lib1.dart" as err;
+
+import "org-dartlang-testcase:///error_location_04_lib1.dart";
+
+class Bar extends core::Object /*hasConstConstructor*/  {
+  final field err::Foo* x;
+  const constructor •() → err2::Bar*
+    : err2::Bar::x = invalid-expression "This assertion failed.", super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method bar() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///error_location_04_lib2.dart:
+- Foo. (from org-dartlang-testcase:///error_location_04_lib1.dart:6:9)
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.weak.modular.expect
new file mode 100644
index 0000000..c53238d
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library error_location_05;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_locations/error_location_05_lib1.dart:7:8: Error: Duplicated parameter name 'z'.
+// x1(z, {z}) {}
+//        ^
+// pkg/front_end/testcases/general/error_locations/error_location_05_lib1.dart:7:4: Context: Other parameter named 'z'.
+// x1(z, {z}) {}
+//    ^
+//
+// pkg/front_end/testcases/general/error_locations/error_location_05_lib1.dart:10:9: Error: 'z' is already declared in this scope.
+//   y(z, {z}) {}
+//         ^
+// pkg/front_end/testcases/general/error_locations/error_location_05_lib1.dart:10:5: Context: Previous declaration of 'z'.
+//   y(z, {z}) {}
+//     ^
+//
+import self as self;
+
+part error_location_05_lib1.dart;
+static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
+static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.weak.modular.expect
new file mode 100644
index 0000000..de18361
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library error_location_06;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_locations/error_location_06_lib1.dart:12:8: Error: Duplicated parameter name 'z'.
+// x1(z, {z}) {}
+//        ^
+// pkg/front_end/testcases/general/error_locations/error_location_06_lib1.dart:12:4: Context: Other parameter named 'z'.
+// x1(z, {z}) {}
+//    ^
+//
+// pkg/front_end/testcases/general/error_locations/error_location_06_lib1.dart:15:9: Error: 'z' is already declared in this scope.
+//   y(z, {z}) {}
+//         ^
+// pkg/front_end/testcases/general/error_locations/error_location_06_lib1.dart:15:5: Context: Previous declaration of 'z'.
+//   y(z, {z}) {}
+//     ^
+//
+import self as self;
+
+part error_location_06_lib1.dart;
+static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
+static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/annotations.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/annotations.dart.weak.modular.expect
new file mode 100644
index 0000000..c6d3c9f
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/annotations.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/annotations.dart:15:16: Error: Type arguments can't have annotations because they aren't declarations.
+//   m() => new A<@annotation @Annotation("test") C>();
+//                ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/annotations.dart:15:28: Error: Type arguments can't have annotations because they aren't declarations.
+//   m() => new A<@annotation @Annotation("test") C>();
+//                            ^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Annotation extends core::Object /*hasConstConstructor*/  {
+  final field core::String* message;
+  const constructor •(core::String* message) → self::Annotation*
+    : self::Annotation::message = message, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::E*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return new self::A::•<self::C*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field dynamic annotation = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/await_not_in_async.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/await_not_in_async.dart.weak.modular.expect
new file mode 100644
index 0000000..12f76fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/await_not_in_async.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/await_not_in_async.dart:4:3: Error: 'await' can only be used in 'async' or 'async*' methods.
+//   await f();
+//   ^^^^^
+//
+import self as self;
+import "dart:async" as asy;
+
+static method f() → asy::Future<void>
+  return asy::Future::value<void>();
+static method g() → void {
+  invalid-expression "pkg/front_end/testcases/general/error_recovery/await_not_in_async.dart:4:3: Error: 'await' can only be used in 'async' or 'async*' methods.
+  await f();
+  ^^^^^";
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..17c2eb1
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart.weak.modular.expect
@@ -0,0 +1,377 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:2:3: Error: The name of a constructor must match the name of the enclosing class.
+//   foo.x() {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:5:3: Error: The name of a constructor must match the name of the enclosing class.
+//   foo.x() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:5:3: Error: 'Foo.x' is already declared in this scope.
+//   foo.x() : initializer = true {
+//   ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:2:3: Context: Previous declaration of 'Foo.x'.
+//   foo.x() {
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:8:3: Error: The name of a constructor must match the name of the enclosing class.
+//   foo() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:11:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   get Foo => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:12:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   get Foo {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:12:7: Error: 'Foo' is already declared in this scope.
+//   get Foo {
+//       ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:11:7: Context: Previous declaration of 'Foo'.
+//   get Foo => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:15:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   get Foo.X => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:15:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get Foo.X => 0;
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:16:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   get Foo.X {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:16:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get Foo.X {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:16:7: Error: 'Foo.X' is already declared in this scope.
+//   get Foo.X {
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:15:7: Context: Previous declaration of 'Foo.X'.
+//   get Foo.X => 0;
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:19:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   get Foo : bla = null => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:19:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get Foo : bla = null => 0;
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:20:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   get Foo.X : bla = null {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:20:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get Foo.X : bla = null {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:20:7: Error: 'Foo.X' is already declared in this scope.
+//   get Foo.X : bla = null {
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:16:7: Context: Previous declaration of 'Foo.X'.
+//   get Foo.X {
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   set Foo => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   set Foo => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:24:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   set Foo {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:24:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   set Foo {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:24:7: Error: 'Foo' is already declared in this scope.
+//   set Foo {
+//       ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Context: Previous declaration of 'Foo'.
+//   set Foo => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:27:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   set Foo.X => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:27:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set Foo.X => 0;
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:27:7: Error: 'Foo.X' is already declared in this scope.
+//   set Foo.X => 0;
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:20:7: Context: Previous declaration of 'Foo.X'.
+//   get Foo.X : bla = null {
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:28:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   set Foo.X {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:28:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set Foo.X {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:28:7: Error: 'Foo.X' is already declared in this scope.
+//   set Foo.X {
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:27:7: Context: Previous declaration of 'Foo.X'.
+//   set Foo.X => 0;
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:31:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   set Foo : bla = null => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:31:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set Foo : bla = null => 0;
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:31:7: Error: 'Foo' is already declared in this scope.
+//   set Foo : bla = null => 0;
+//       ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:19:7: Context: Previous declaration of 'Foo'.
+//   get Foo : bla = null => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:32:7: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   set Foo.X : bla = null {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:32:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set Foo.X : bla = null {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:32:7: Error: 'Foo.X' is already declared in this scope.
+//   set Foo.X : bla = null {
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:28:7: Context: Previous declaration of 'Foo.X'.
+//   set Foo.X {
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:35:18: Error: An external constructor can't have any initializers.
+//   external Foo() : bla = null;
+//                  ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:35:12: Error: 'Foo' is already declared in this scope.
+//   external Foo() : bla = null;
+//            ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:31:7: Context: Previous declaration of 'Foo'.
+//   set Foo : bla = null => 0;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:36:33: Error: An external or native method can't have a body.
+//   external Foo.X() : bla = null {
+//                                 ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:36:20: Error: An external constructor can't have any initializers.
+//   external Foo.X() : bla = null {
+//                    ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:36:12: Error: 'Foo.X' is already declared in this scope.
+//   external Foo.X() : bla = null {
+//            ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:32:7: Context: Previous declaration of 'Foo.X'.
+//   set Foo.X : bla = null {
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   int Foo;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: 'Foo' is already declared in this scope.
+//   int Foo;
+//       ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:12:7: Context: Previous declaration of 'Foo'.
+//   get Foo {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:10: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   int A, Foo, B;
+//          ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:10: Error: 'Foo' is already declared in this scope.
+//   int A, Foo, B;
+//          ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Context: Previous declaration of 'Foo'.
+//   int Foo;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:24:7: Error: Conflicts with the implicit setter of the field 'Foo'.
+//   set Foo {
+//       ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:7: Error: Conflicts with the implicit setter of the field 'Foo'.
+//   set Foo => 0;
+//       ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:10: Error: Conflicts with setter 'Foo'.
+//   int A, Foo, B;
+//          ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: Conflicts with setter 'Foo'.
+//   int Foo;
+//       ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:5:13: Error: 'initializer' isn't an instance field of this class.
+//   foo.x() : initializer = true {
+//             ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:8:11: Error: 'initializer' isn't an instance field of this class.
+//   foo() : initializer = true {
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:15:16: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   get Foo.X => 0;
+//                ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:17:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return 0;
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:19:13: Error: 'bla' isn't an instance field of this class.
+//   get Foo : bla = null => 0;
+//             ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:19:27: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   get Foo : bla = null => 0;
+//                           ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:20:15: Error: 'bla' isn't an instance field of this class.
+//   get Foo.X : bla = null {
+//               ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:21:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return 0;
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:23:11: Error: A setter should have exactly one formal parameter.
+//   set Foo => 0;
+//           ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:25:12: Error: Can't return a value from a void function.
+//     return 0;
+//            ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:24:11: Error: A setter should have exactly one formal parameter.
+//   set Foo {
+//           ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:27:16: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   set Foo.X => 0;
+//                ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:29:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return 0;
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:31:13: Error: 'bla' isn't an instance field of this class.
+//   set Foo : bla = null => 0;
+//             ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:31:27: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   set Foo : bla = null => 0;
+//                           ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:32:15: Error: 'bla' isn't an instance field of this class.
+//   set Foo.X : bla = null {
+//               ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:33:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return 0;
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:37:5: Error: Constructors can't have a return type.
+// Try removing the return type.
+//     return 0;
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:39:7: Error: Field 'Foo' should be initialized because its type 'int' doesn't allow null.
+//   int Foo;
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:7: Error: Field 'A' should be initialized because its type 'int' doesn't allow null.
+//   int A, Foo, B;
+//       ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:40:15: Error: Field 'B' should be initialized because its type 'int' doesn't allow null.
+//   int A, Foo, B;
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int A = null;
+  field core::int B = null;
+  constructor x() → self::Foo
+    : super core::Object::•() {}
+  constructor foo() → self::Foo
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:8:11: Error: 'initializer' isn't an instance field of this class.
+  foo() : initializer = true {
+          ^^^^^^^^^^^" {}
+  constructor X() → self::Foo
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:15:16: Error: Constructors can't have a return type.
+Try removing the return type.
+  get Foo.X => 0;
+               ^";
+  constructor •() → self::Foo
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:19:13: Error: 'bla' isn't an instance field of this class.
+  get Foo : bla = null => 0;
+            ^^^"
+    invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_general.crash_dart:19:27: Error: Constructors can't have a return type.
+Try removing the return type.
+  get Foo : bla = null => 0;
+                          ^";
+  get Foo() → dynamic
+    return 0;
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..4435554
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:2:7: Error: The name of a constructor must match the name of the enclosing class.
+//   get foo.x() {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:2:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get foo.x() {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:5:7: Error: The name of a constructor must match the name of the enclosing class.
+//   get foo.x() : initializer = true {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:5:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get foo.x() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:5:7: Error: 'Foo.x' is already declared in this scope.
+//   get foo.x() : initializer = true {
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:2:7: Context: Previous declaration of 'Foo.x'.
+//   get foo.x() {
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:8:10: Error: A getter can't have formal parameters.
+// Try removing '(...)'.
+//   get foo() : initializer = true {
+//          ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:8:7: Error: The name of a constructor must match the name of the enclosing class.
+//   get foo() : initializer = true {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:8:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get foo() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:5:17: Error: 'initializer' isn't an instance field of this class.
+//   get foo.x() : initializer = true {
+//                 ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:8:15: Error: 'initializer' isn't an instance field of this class.
+//   get foo() : initializer = true {
+//               ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor x() → self::Foo
+    : super core::Object::•() {}
+  constructor foo() → self::Foo
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_get.crash_dart:8:15: Error: 'initializer' isn't an instance field of this class.
+  get foo() : initializer = true {
+              ^^^^^^^^^^^" {}
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..ef13e6b
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:2:8: Error: The name of a constructor must match the name of the enclosing class.
+//   void foo.x() {
+//        ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:2:3: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   void foo.x() {
+//   ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:5:8: Error: The name of a constructor must match the name of the enclosing class.
+//   void foo.x() : initializer = true {
+//        ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:5:3: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   void foo.x() : initializer = true {
+//   ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:5:8: Error: 'Foo.x' is already declared in this scope.
+//   void foo.x() : initializer = true {
+//        ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:2:8: Context: Previous declaration of 'Foo.x'.
+//   void foo.x() {
+//        ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:8:8: Error: The name of a constructor must match the name of the enclosing class.
+//   void foo() : initializer = true {
+//        ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:8:3: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   void foo() : initializer = true {
+//   ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:5:18: Error: 'initializer' isn't an instance field of this class.
+//   void foo.x() : initializer = true {
+//                  ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:8:16: Error: 'initializer' isn't an instance field of this class.
+//   void foo() : initializer = true {
+//                ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor x() → self::Foo
+    : super core::Object::•() {}
+  constructor foo() → self::Foo
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_return_type.crash_dart:8:16: Error: 'initializer' isn't an instance field of this class.
+  void foo() : initializer = true {
+               ^^^^^^^^^^^" {}
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..583688c
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:2:7: Error: The name of a constructor must match the name of the enclosing class.
+//   set foo.x() {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:2:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set foo.x() {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:5:7: Error: The name of a constructor must match the name of the enclosing class.
+//   set foo.x() : initializer = true {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:5:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set foo.x() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:5:7: Error: 'Foo.x' is already declared in this scope.
+//   set foo.x() : initializer = true {
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:2:7: Context: Previous declaration of 'Foo.x'.
+//   set foo.x() {
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:8:7: Error: The name of a constructor must match the name of the enclosing class.
+//   set foo() : initializer = true {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:8:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set foo() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:5:17: Error: 'initializer' isn't an instance field of this class.
+//   set foo.x() : initializer = true {
+//                 ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:8:15: Error: 'initializer' isn't an instance field of this class.
+//   set foo() : initializer = true {
+//               ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor x() → self::Foo
+    : super core::Object::•() {}
+  constructor foo() → self::Foo
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_bad_name_set.crash_dart:8:15: Error: 'initializer' isn't an instance field of this class.
+  set foo() : initializer = true {
+              ^^^^^^^^^^^" {}
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart.weak.modular.expect
new file mode 100644
index 0000000..eea597e
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart.weak.modular.expect
@@ -0,0 +1,71 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:3:10: Error: A getter can't have formal parameters.
+// Try removing '(...)'.
+//   get Foo() {
+//          ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:3:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   get Foo() {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:6:10: Error: A getter can't have formal parameters.
+// Try removing '(...)'.
+//   get Foo() : initializer = true {
+//          ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:6:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get Foo() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:9:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get Foo.x() {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:12:3: Error: Constructors can't be a getter.
+// Try removing 'get'.
+//   get Foo.x() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:12:7: Error: 'Foo.x' is already declared in this scope.
+//   get Foo.x() : initializer = true {
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:9:7: Context: Previous declaration of 'Foo.x'.
+//   get Foo.x() {
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:6:15: Error: 'initializer' isn't an instance field of this class.
+//   get Foo() : initializer = true {
+//               ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:12:17: Error: 'initializer' isn't an instance field of this class.
+//   get Foo.x() : initializer = true {
+//                 ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •() → self::Foo*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_get.dart:6:15: Error: 'initializer' isn't an instance field of this class.
+  get Foo() : initializer = true {
+              ^^^^^^^^^^^" {}
+  constructor x() → self::Foo*
+    : super core::Object::•() {}
+  get Foo() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart.weak.modular.expect
new file mode 100644
index 0000000..92284b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart:6:3: Error: 'Foo' is already declared in this scope.
+//   Foo() : initializer = true {
+//   ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart:3:3: Context: Previous declaration of 'Foo'.
+//   Foo() {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart:12:3: Error: 'Foo.x' is already declared in this scope.
+//   Foo.x() : initializer = true {
+//   ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart:9:3: Context: Previous declaration of 'Foo.x'.
+//   Foo.x() {
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart:6:11: Error: 'initializer' isn't an instance field of this class.
+//   Foo() : initializer = true {
+//           ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_ok.dart:12:13: Error: 'initializer' isn't an instance field of this class.
+//   Foo.x() : initializer = true {
+//             ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •() → self::Foo*
+    : super core::Object::•() {}
+  constructor x() → self::Foo*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..7267317
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart.weak.modular.expect
@@ -0,0 +1,145 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:2:9: Error: Expected '{' before this.
+//   Foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:2:9: Error: Operator declarations must be preceded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   Foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:2:9: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   Foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:2:9: Error: The name of a constructor must match the name of the enclosing class.
+//   Foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:2:9: Error: Operator '/' should have exactly one parameter.
+//   Foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:8: Error: Expected '{' before this.
+//   Foo()./ : super() {
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:3: Error: 'Foo' is already declared in this scope.
+//   Foo()./ : super() {
+//   ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:2:3: Context: Previous declaration of 'Foo'.
+//   Foo() / : super() {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:8: Error: Expected a class member, but got '.'.
+//   Foo()./ : super() {
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:9: Error: Operator declarations must be preceded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   Foo()./ : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:9: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   Foo()./ : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:9: Error: The name of a constructor must match the name of the enclosing class.
+//   Foo()./ : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:9: Error: Operator '/' should have exactly one parameter.
+//   Foo()./ : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:9: Error: 'Foo./' is already declared in this scope.
+//   Foo()./ : super() {
+//         ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:2:9: Context: Previous declaration of 'Foo./'.
+//   Foo() / : super() {
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:8:9: Error: Expected '{' before this.
+//   foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:8:9: Error: Operator declarations must be preceded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:8:9: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:8:9: Error: The name of a constructor must match the name of the enclosing class.
+//   foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:8:9: Error: Operator '/' should have exactly one parameter.
+//   foo() / : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:8:9: Error: 'Foo./' is already declared in this scope.
+//   foo() / : super() {
+//         ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:5:9: Context: Previous declaration of 'Foo./'.
+//   Foo()./ : super() {
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:11:8: Error: Expected '{' before this.
+//   foo()./ : super() {
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:11:3: Error: 'foo' is already declared in this scope.
+//   foo()./ : super() {
+//   ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:8:3: Context: Previous declaration of 'foo'.
+//   foo() / : super() {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:11:8: Error: Expected a class member, but got '.'.
+//   foo()./ : super() {
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:11:9: Error: Operator declarations must be preceded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   foo()./ : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:11:9: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   foo()./ : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:11:9: Error: The name of a constructor must match the name of the enclosing class.
+//   foo()./ : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:11:9: Error: Operator '/' should have exactly one parameter.
+//   foo()./ : super() {
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:11:9: Error: 'Foo./' is already declared in this scope.
+//   foo()./ : super() {
+//         ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_operator.crash_dart:8:9: Context: Previous declaration of 'Foo./'.
+//   foo() / : super() {
+//         ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •() → self::Foo
+    : super core::Object::•() {}
+  constructor /() → self::Foo
+    : super core::Object::•() {}
+  method foo() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart.weak.modular.expect
new file mode 100644
index 0000000..b038f45e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:3:3: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   void Foo() {
+//   ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:6:3: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   void Foo() : initializer = true {
+//   ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:6:8: Error: 'Foo' is already declared in this scope.
+//   void Foo() : initializer = true {
+//        ^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:3:8: Context: Previous declaration of 'Foo'.
+//   void Foo() {
+//        ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:9:3: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   void Foo.x() {
+//   ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:12:3: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   void Foo.x() : initializer = true {
+//   ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:12:8: Error: 'Foo.x' is already declared in this scope.
+//   void Foo.x() : initializer = true {
+//        ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:9:8: Context: Previous declaration of 'Foo.x'.
+//   void Foo.x() {
+//        ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:6:16: Error: 'initializer' isn't an instance field of this class.
+//   void Foo() : initializer = true {
+//                ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_return_type.dart:12:18: Error: 'initializer' isn't an instance field of this class.
+//   void Foo.x() : initializer = true {
+//                  ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •() → self::Foo*
+    : super core::Object::•() {}
+  constructor x() → self::Foo*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart.weak.modular.expect
new file mode 100644
index 0000000..b3eba22
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:3:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   set Foo() {
+//       ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:6:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set Foo() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:9:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set Foo.x() {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:12:3: Error: Constructors can't be a setter.
+// Try removing 'set'.
+//   set Foo.x() : initializer = true {
+//   ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:12:7: Error: 'Foo.x' is already declared in this scope.
+//   set Foo.x() : initializer = true {
+//       ^^^^^
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:9:7: Context: Previous declaration of 'Foo.x'.
+//   set Foo.x() {
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:3:10: Error: A setter should have exactly one formal parameter.
+//   set Foo() {
+//          ^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:6:15: Error: 'initializer' isn't an instance field of this class.
+//   set Foo() : initializer = true {
+//               ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:12:17: Error: 'initializer' isn't an instance field of this class.
+//   set Foo.x() : initializer = true {
+//                 ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •() → self::Foo*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:6:15: Error: 'initializer' isn't an instance field of this class.
+  set Foo() : initializer = true {
+              ^^^^^^^^^^^" {}
+  constructor x() → self::Foo*
+    : super core::Object::•() {}
+  set Foo(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/general/error_recovery/constructor_recovery_set.dart:3:10: Error: A setter should have exactly one formal parameter.
+  set Foo() {
+         ^";
+    {}
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/empty_await_for.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/empty_await_for.dart.weak.modular.expect
new file mode 100644
index 0000000..ef2f7e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/empty_await_for.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/empty_await_for.dart:3:14: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   await for () {}
+//              ^
+//
+// pkg/front_end/testcases/general/error_recovery/empty_await_for.dart:3:14: Error: Expected 'in' before this.
+//   await for () {}
+//              ^
+//
+import self as self;
+
+static method main() → dynamic async {
+  await for (final dynamic #t1 in invalid-expression "pkg/front_end/testcases/general/error_recovery/empty_await_for.dart:3:14: Error: This couldn't be parsed.
+  await for () {}
+             ^") {
+    invalid-expression "pkg/front_end/testcases/general/error_recovery/empty_await_for.dart:3:14: Error: This couldn't be parsed.
+  await for () {}
+             ^";
+  }
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/empty_for.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/empty_for.dart.weak.modular.expect
new file mode 100644
index 0000000..35aa6ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/empty_for.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/empty_for.dart:3:8: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   for () {}
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/empty_for.dart:3:7: Error: Expected ';' after this.
+//   for () {}
+//       ^
+//
+import self as self;
+
+static method main() → dynamic {
+  for (final invalid-type #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/empty_for.dart:3:8: Error: This couldn't be parsed.
+  for () {}
+       ^"; invalid-expression "pkg/front_end/testcases/general/error_recovery/empty_for.dart:3:8: Error: This couldn't be parsed.
+  for () {}
+       ^"; ) {
+  }
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/for_in_with_colon.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/for_in_with_colon.dart.weak.modular.expect
new file mode 100644
index 0000000..9124332
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/for_in_with_colon.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/for_in_with_colon.dart:6:13: Error: For-in loops use 'in' rather than a colon.
+// Try replacing the colon with the keyword 'in'.
+//   for(int i : [1, 2, 3]) {
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  for (core::int* i in <core::int*>[1, 2, 3]) {
+    core::print(i);
+  }
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_22313.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_22313.dart.weak.modular.expect
new file mode 100644
index 0000000..4a09d61
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_22313.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_22313.dart:5:20: Error: Each class definition can have at most one extends clause.
+// Try choosing one superclass and define your class to implement (or mix in) the others.
+// class Foo extends A, B {
+//                    ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_22313.dart:9:11: Error: Expected 'extends' instead of this.
+// class Bar extend A, B {
+//           ^^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_22313.dart:9:19: Error: Each class definition can have at most one extends clause.
+// Try choosing one superclass and define your class to implement (or mix in) the others.
+// class Bar extend A, B {
+//                   ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_22313.dart:13:11: Error: Expected 'extends' instead of this.
+// class Baz on A, B {
+//           ^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_22313.dart:13:15: Error: Each class definition can have at most one extends clause.
+// Try choosing one superclass and define your class to implement (or mix in) the others.
+// class Baz on A, B {
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class Foo extends self::A {
+  constructor •() → self::Foo
+    : super self::A::•() {}
+}
+class Bar extends core::Object {
+  constructor •() → self::Bar
+    : super core::Object::•() {}
+}
+class Baz extends core::Object {
+  constructor •() → self::Baz
+    : super core::Object::•() {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.weak.modular.expect
new file mode 100644
index 0000000..fa47aba
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.weak.modular.expect
@@ -0,0 +1,152 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:6:37: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int get a => runtimeType.hashCode xor null.hashCode;
+//                                     ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:11:41: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int get e => 1 + runtimeType.hashCode xor null.hashCode + 3;
+//                                         ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:16:28: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int i(int x, int y) => x xor y;
+//                            ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:23:32: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int o(int x, int y) => 1 + x xor y + 3;
+//                                ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:36:31: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   Key(int x, int y) : foo = x xor y, bar = x xor y {
+//                               ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:36:46: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   Key(int x, int y) : foo = x xor y, bar = x xor y {
+//                                              ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:8:43: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int get c { return runtimeType.hashCode xor null.hashCode; }
+//                                           ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:13:47: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int get g { return 1 + runtimeType.hashCode xor null.hashCode + 3; }
+//                                               ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:18:34: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int k(int x, int y) { return x xor y; }
+//                                  ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:20:36: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int m(int x, int y) { int z =  x xor y; return z; }
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:25:38: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//   int q(int x, int y) { return 1 + x xor y + 3; }
+//                                      ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:29:9: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//     s(x xor y, x xor y);
+//         ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:29:18: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//     s(x xor y, x xor y);
+//                  ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_26810.dart:37:22: Error: Binary operator 'xor' is written as '^' instead of the written out word.
+// Try replacing 'xor' with '^'.
+//     print("hello ${x xor y}");
+//                      ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Key extends core::Object {
+  field core::int* foo;
+  field core::int* bar;
+  constructor •(core::int* x, core::int* y) → self::Key*
+    : self::Key::foo = x.{core::int::^}(y){(core::int*) →* core::int*}, self::Key::bar = x.{core::int::^}(y){(core::int*) →* core::int*}, super core::Object::•() {
+    core::print("hello ${x.{core::int::^}(y){(core::int*) →* core::int*}}");
+  }
+  constructor NotDuplicate(core::int* x, core::int* y) → self::Key*
+    : self::Key::foo = x.{core::int::^}(y){(core::int*) →* core::int*}, self::Key::bar = x.{core::int::^}(y){(core::int*) →* core::int*}, super core::Object::•() {
+    core::print("hello ${x.{core::int::^}(y){(core::int*) →* core::int*}}");
+  }
+  get a() → core::int*
+    return this.{self::Key::runtimeType}{core::Type*}.{core::Type::hashCode}{core::int*}.{core::int::^}(null.{core::Object::hashCode}{core::int*}){(core::int*) →* core::int*};
+  get b() → core::int*
+    return this.{self::Key::runtimeType}{core::Type*}.{core::Type::hashCode}{core::int*}.{core::int::^}(null.{core::Object::hashCode}{core::int*}){(core::int*) →* core::int*};
+  get c() → core::int* {
+    return this.{self::Key::runtimeType}{core::Type*}.{core::Type::hashCode}{core::int*}.{core::int::^}(null.{core::Object::hashCode}{core::int*}){(core::int*) →* core::int*};
+  }
+  get d() → core::int* {
+    return this.{self::Key::runtimeType}{core::Type*}.{core::Type::hashCode}{core::int*}.{core::int::^}(null.{core::Object::hashCode}{core::int*}){(core::int*) →* core::int*};
+  }
+  get e() → core::int*
+    return 1.{core::num::+}(this.{self::Key::runtimeType}{core::Type*}.{core::Type::hashCode}{core::int*}){(core::num*) →* core::int*}.{core::int::^}(null.{core::Object::hashCode}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*}){(core::int*) →* core::int*};
+  get f() → core::int*
+    return 1.{core::num::+}(this.{self::Key::runtimeType}{core::Type*}.{core::Type::hashCode}{core::int*}){(core::num*) →* core::int*}.{core::int::^}(null.{core::Object::hashCode}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*}){(core::int*) →* core::int*};
+  get g() → core::int* {
+    return 1.{core::num::+}(this.{self::Key::runtimeType}{core::Type*}.{core::Type::hashCode}{core::int*}){(core::num*) →* core::int*}.{core::int::^}(null.{core::Object::hashCode}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*}){(core::int*) →* core::int*};
+  }
+  get h() → core::int* {
+    return 1.{core::num::+}(this.{self::Key::runtimeType}{core::Type*}.{core::Type::hashCode}{core::int*}){(core::num*) →* core::int*}.{core::int::^}(null.{core::Object::hashCode}{core::int*}.{core::num::+}(3){(core::num*) →* core::int*}){(core::int*) →* core::int*};
+  }
+  method i(core::int* x, core::int* y) → core::int*
+    return x.{core::int::^}(y){(core::int*) →* core::int*};
+  method j(core::int* x, core::int* y) → core::int*
+    return x.{core::int::^}(y){(core::int*) →* core::int*};
+  method k(core::int* x, core::int* y) → core::int* {
+    return x.{core::int::^}(y){(core::int*) →* core::int*};
+  }
+  method l(core::int* x, core::int* y) → core::int* {
+    return x.{core::int::^}(y){(core::int*) →* core::int*};
+  }
+  method m(core::int* x, core::int* y) → core::int* {
+    core::int* z = x.{core::int::^}(y){(core::int*) →* core::int*};
+    return z;
+  }
+  method n(core::int* x, core::int* y) → core::int* {
+    core::int* z = x.{core::int::^}(y){(core::int*) →* core::int*};
+    return z;
+  }
+  method o(core::int* x, core::int* y) → core::int*
+    return 1.{core::num::+}(x){(core::num*) →* core::int*}.{core::int::^}(y.{core::num::+}(3){(core::num*) →* core::int*}){(core::int*) →* core::int*};
+  method p(core::int* x, core::int* y) → core::int*
+    return 1.{core::num::+}(x){(core::num*) →* core::int*}.{core::int::^}(y.{core::num::+}(3){(core::num*) →* core::int*}){(core::int*) →* core::int*};
+  method q(core::int* x, core::int* y) → core::int* {
+    return 1.{core::num::+}(x){(core::num*) →* core::int*}.{core::int::^}(y.{core::num::+}(3){(core::num*) →* core::int*}){(core::int*) →* core::int*};
+  }
+  method r(core::int* x, core::int* y) → core::int* {
+    return 1.{core::num::+}(x){(core::num*) →* core::int*}.{core::int::^}(y.{core::num::+}(3){(core::num*) →* core::int*}){(core::int*) →* core::int*};
+  }
+  method s(core::int* x, core::int* y) → dynamic {
+    this.{self::Key::s}(x.{core::int::^}(y){(core::int*) →* core::int*}, x.{core::int::^}(y){(core::int*) →* core::int*}){(core::int*, core::int*) →* dynamic};
+    this.{self::Key::s}(x.{core::int::^}(y){(core::int*) →* core::int*}, x.{core::int::^}(y){(core::int*) →* core::int*}){(core::int*, core::int*) →* dynamic};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..75defa5
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:12: Error: Can't find ')' to match '('.
+// f() { m(T<R(<Z
+//            ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:10: Error: Can't find '>' to match '<'.
+// f() { m(T<R(<Z
+//          ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:8: Error: Can't find ')' to match '('.
+// f() { m(T<R(<Z
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:5: Error: Can't find '}' to match '{'.
+// f() { m(T<R(<Z
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:14: Error: 'Z' isn't a type.
+// f() { m(T<R(<Z
+//              ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:15: Error: Expected '[' before this.
+// f() { m(T<R(<Z
+//               ^...
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:11: Error: Method not found: 'R'.
+// f() { m(T<R(<Z
+//           ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:9: Error: Undefined name 'T'.
+// f() { m(T<R(<Z
+//         ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:7: Error: Method not found: 'm'.
+// f() { m(T<R(<Z
+//       ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:15: Error: Expected ';' after this.
+// f() { m(T<R(<Z
+//               ^...
+//
+import self as self;
+
+static method f() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/error_recovery/issue_38415.crash_dart:1:7: Error: Method not found: 'm'.
+f() { m(T<R(<Z
+      ^";
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..679fe85
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:6: Error: Can't find ')' to match '('.
+// n<S e(
+//      ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:2: Error: Can't find '>' to match '<'.
+// n<S e(
+//  ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:3: Error: Expected '>' after this.
+// n<S e(
+//   ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:7: Error: Expected an identifier, but got ''.
+// Try inserting an identifier before ''.
+// n<S e(
+//       ^...
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:7: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// n<S e(
+//       ^...
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:7: Error: Expected '{' before this.
+// n<S e(
+//       ^...
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:3: Error: Type 'S' not found.
+// n<S e(
+//   ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:1: Error: Type 'n' not found.
+// n<S e(
+// ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39024.crash_dart:1:1: Error: Expected 0 type arguments.
+// n<S e(
+// ^
+//
+import self as self;
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..ac2beca
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart:2:8: Error: Operator declarations must be preceded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//     co <{
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart:2:8: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//     co <{
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart:2:8: Error: Operator '<' should have exactly one parameter.
+//     co <{
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart:2:5: Error: Type 'co' not found.
+//     co <{
+//     ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator <() → invalid-type {}
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..65bece2
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart:2:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//     co operator <{
+//                 ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart:2:17: Error: Operator '<' should have exactly one parameter.
+//     co operator <{
+//                 ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart:2:5: Error: Type 'co' not found.
+//     co operator <{
+//     ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator <() → invalid-type {}
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..0292288
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033.crash_dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39033.crash_dart:1:11: Error: Expected '>' after this.
+// typedef F<Glib.=
+//           ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39033.crash_dart:1:17: Error: Expected a type, but got ''.
+// typedef F<Glib.=
+//                 ^...
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39033.crash_dart:1:16: Error: Expected ';' after this.
+// typedef F<Glib.=
+//                ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39033.crash_dart:1:16: Error: Can't create typedef from non-type.
+// typedef F<Glib.=
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<unrelated Glib extends core::Object? = dynamic> = invalid-type;
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..cd13068
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:11: Error: Expected '>' after this.
+// typedef F<Glib.=
+//           ^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:17: Error: Expected a type, but got ''.
+// typedef F<Glib.=
+//                 ^...
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Expected ';' after this.
+// typedef F<Glib.=
+//                ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
+// typedef F<Glib.=
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<unrelated Glib extends core::Object? = dynamic> = invalid-type;
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39058.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39058.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..d532f41
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39058.crash_dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39058.crash_dart:1:5: Error: Can't find ')' to match '('.
+// {<[](
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39058.crash_dart:1:2: Error: Can't find '>' to match '<'.
+// {<[](
+//  ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39058.crash_dart:1:1: Error: Can't find '}' to match '{'.
+// {<[](
+// ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39058.crash_dart:1:1: Error: Expected a declaration, but got '{'.
+// {<[](
+// ^
+//
+import self as self;
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39058_prime.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39058_prime.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..ae54add
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39058_prime.crash_dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39058_prime.crash_dart:1:1: Error: Expected a declaration, but got '{'.
+// {<[]()>}
+// ^
+//
+import self as self;
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39060.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39060.dart.weak.modular.expect
new file mode 100644
index 0000000..a49ea7c
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39060.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39060.dart:3:4: Error: 's' isn't a type.
+//   {s A<}>
+//    ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39060.dart:3:6: Error: Expected ';' after this.
+//   {s A<}>
+//      ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39060.dart:3:8: Error: Expected a type, but got '}'.
+//   {s A<}>
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39060.dart:3:8: Error: This couldn't be parsed.
+//   {s A<}>
+//        ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39060.dart:4:1: Error: Expected '[' before this.
+// }
+// ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39060.dart:4:1: Error: Expected ';' after this.
+// }
+// ^
+//
+import self as self;
+
+static method main() → dynamic {
+  {
+    invalid-type A;
+    <invalid-type>[];
+  }
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..e1e7c23
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:1: Error: Expected a declaration, but got '('.
+// () async => a b < c $? >
+// ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:2: Error: Expected a declaration, but got ')'.
+// () async => a b < c $? >
+//  ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:4: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// () async => a b < c $? >
+//    ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:19: Error: Expected '>' after this.
+// () async => a b < c $? >
+//                   ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:25: Error: Expected an identifier, but got ''.
+// Try inserting an identifier before ''.
+// () async => a b < c $? >
+//                         ^...
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:24: Error: Expected ';' after this.
+// () async => a b < c $? >
+//                        ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:19: Error: Type 'c' not found.
+// () async => a b < c $? >
+//                   ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:15: Error: Type 'b' not found.
+// () async => a b < c $? >
+//               ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:15: Error: Expected 0 type arguments.
+// () async => a b < c $? >
+//               ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:13: Error: Expected ';' after this.
+// () async => a b < c $? >
+//             ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:13: Error: Undefined name 'a'.
+// () async => a b < c $? >
+//             ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:15: Error: Unexpected token 'b'.
+// () async => a b < c $? >
+//               ^
+//
+import self as self;
+
+static method async() → dynamic
+  return invalid-expression "pkg/front_end/testcases/general/error_recovery/issue_39202.crash_dart:1:13: Error: Undefined name 'a'.
+() async => a b < c \$? >
+            ^";
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39230.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39230.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..34c35fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39230.crash_dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39230.crash_dart:3:5: Error: Expected '{' before this.
+//     /
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39230.crash_dart:3:5: Error: Operator declarations must be preceded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//     /
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39230.crash_dart:3:5: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//     /
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39230.crash_dart:3:5: Error: The name of a constructor must match the name of the enclosing class.
+//     /
+//     ^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39230.crash_dart:3:5: Error: Operator '/' should have exactly one parameter.
+//     /
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : super core::Object::•() {}
+  constructor /() → self::C
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39958_01.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39958_01.dart.weak.modular.expect
new file mode 100644
index 0000000..0b3c58e
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39958_01.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39958_01.dart:2:5: Error: Type 'void' can't have type arguments.
+// Try removing the type arguments.
+// void<int> f() {}
+//     ^
+//
+import self as self;
+
+static method f() → void {}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39958_02.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39958_02.dart.weak.modular.expect
new file mode 100644
index 0000000..f4c6611
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39958_02.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39958_02.dart:2:1: Error: Expected 0 type arguments.
+// dynamic<int> f() {}
+// ^
+//
+import self as self;
+
+static method f() → invalid-type {}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39958_03.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39958_03.dart.weak.modular.expect
new file mode 100644
index 0000000..46d364b
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39958_03.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39958_03.dart:2:1: Error: Expected 0 type arguments.
+// int<int> f() {}
+// ^
+//
+import self as self;
+
+static method f() → invalid-type {}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39958_04.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_39958_04.dart.weak.modular.expect
new file mode 100644
index 0000000..b829820
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39958_04.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39958_04.dart:2:1: Error: Type 'Foo' not found.
+// Foo<int> f() {}
+// ^^^
+//
+// pkg/front_end/testcases/general/error_recovery/issue_39958_04.dart:2:1: Error: Expected 0 type arguments.
+// Foo<int> f() {}
+// ^
+//
+import self as self;
+
+static method f() → invalid-type {}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_43090.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/issue_43090.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..c79c850
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/issue_43090.crash_dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/issue_43090.crash_dart:1:12: Error: Expected an identifier, but got '='.
+// Try inserting an identifier before '='.
+// typedef A< = void Function();
+//            ^
+//
+import self as self;
+
+typedef A = () → void;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/error_recovery/yield_not_in_generator.dart.weak.modular.expect b/pkg/front_end/testcases/general/error_recovery/yield_not_in_generator.dart.weak.modular.expect
new file mode 100644
index 0000000..c923736
--- /dev/null
+++ b/pkg/front_end/testcases/general/error_recovery/yield_not_in_generator.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/error_recovery/yield_not_in_generator.dart:4:3: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//   yield f();
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/error_recovery/yield_not_in_generator.dart:3:11: Error: A non-null value must be returned since the return type 'List<int>' doesn't allow null.
+//  - 'List' is from 'dart:core'.
+// List<int> g() {
+//           ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method f() → asy::Future<core::int>
+  return asy::Future::value<core::int>(7);
+static method g() → core::List<core::int> {
+  invalid-expression "pkg/front_end/testcases/general/error_recovery/yield_not_in_generator.dart:4:3: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+  yield f();
+  ^";
+  return invalid-expression "pkg/front_end/testcases/general/error_recovery/yield_not_in_generator.dart:3:11: Error: A non-null value must be returned since the return type 'List<int>' doesn't allow null.
+ - 'List' is from 'dart:core'.
+List<int> g() {
+          ^" in null;
+}
diff --git a/pkg/front_end/testcases/general/escape.dart.weak.modular.expect b/pkg/front_end/testcases/general/escape.dart.weak.modular.expect
new file mode 100644
index 0000000..e9c05d7
--- /dev/null
+++ b/pkg/front_end/testcases/general/escape.dart.weak.modular.expect
@@ -0,0 +1,89 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic x) → core::bool*
+    return false;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class X extends core::Object implements self::A, self::B {
+  field dynamic field = null;
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method useAsA(self::A* object) → void {
+  dynamic _ = object.{self::A::field}{dynamic};
+}
+static method useAsB(self::B* object) → void {
+  dynamic _ = object.{self::B::field}{dynamic};
+  self::escape(object);
+}
+static method escape(dynamic x) → void {
+  x == null ?{dynamic} x = "" : null;
+  x == null ?{dynamic} x = 45 : null;
+  if(!(x is core::int*) && !(x is core::String*)) {
+    x{dynamic}.field = 45;
+  }
+}
+static method main() → dynamic {
+  self::X* object = new self::X::•();
+  self::useAsA(new self::A::•());
+  self::useAsA(object);
+  self::useAsB(new self::B::•());
+  self::useAsB(object);
+}
diff --git a/pkg/front_end/testcases/general/experiment_release_version/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/experiment_release_version/main.dart.weak.modular.expect
new file mode 100644
index 0000000..b77b7a9
--- /dev/null
+++ b/pkg/front_end/testcases/general/experiment_release_version/main.dart.weak.modular.expect
@@ -0,0 +1,120 @@
+//
+// Problems outside component:
+//
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/unversioned_lib.dart:5:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versionedUnallowedPackage; // error
+//    ^
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/unversioned_lib.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_8_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_8_AllowedPackage; // error
+//    ^
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_8_lib.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_9_AllowedPackage; // error
+//    ^
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_10_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versionedAllowedPackage; // error
+//    ^
+// pkg/front_end/testcases/general/experiment_release_version/not_allowed_package/lib/versioned_2_10_lib.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+library;
+import self as self;
+
+import "package:allowed_package/unversioned_lib.dart";
+import "package:allowed_package/versioned_2_8_lib.dart";
+import "package:allowed_package/versioned_2_9_lib.dart";
+import "package:allowed_package/versioned_2_10_lib.dart";
+import "package:not_allowed_package/unversioned_lib.dart";
+import "package:not_allowed_package/versioned_2_8_lib.dart";
+import "package:not_allowed_package/versioned_2_9_lib.dart";
+import "package:not_allowed_package/versioned_2_10_lib.dart";
+import "org-dartlang-testcase:///unversioned_lib.dart";
+import "org-dartlang-testcase:///versioned_2_8_lib.dart";
+import "org-dartlang-testcase:///versioned_2_9_lib.dart";
+import "org-dartlang-testcase:///versioned_2_10_lib.dart";
+
+static method main() → dynamic {}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/experiment_release_version/unversioned_lib.dart:5:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? unversionedLibrary; // error
+//    ^
+// pkg/front_end/testcases/general/experiment_release_version/unversioned_lib.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+import self as self2;
+import "dart:core" as core;
+
+static field core::int? unversionedLibrary;
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_8_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_8_Library; // error
+//    ^
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_8_lib.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+import self as self3;
+import "dart:core" as core;
+
+static field core::int? versioned_2_8_Library;
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_9_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_9_Library; // error
+//    ^
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_9_lib.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+import self as self4;
+import "dart:core" as core;
+
+static field core::int? versioned_2_9_Library;
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_10_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_10_Library; // error
+//    ^
+// pkg/front_end/testcases/general/experiment_release_version/versioned_2_10_lib.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+import self as self5;
+import "dart:core" as core;
+
+static field core::int? versioned_2_10_Library;
diff --git a/pkg/front_end/testcases/general/export_main.dart.weak.modular.expect b/pkg/front_end/testcases/general/export_main.dart.weak.modular.expect
new file mode 100644
index 0000000..94479f0
--- /dev/null
+++ b/pkg/front_end/testcases/general/export_main.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "hello.dart" as hel;
+additionalExports = (hel::main)
+
+export "org-dartlang-testcase:///hello.dart" show main;
+
+
+library;
+import self as hel;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("Hello, World!");
+}
diff --git a/pkg/front_end/testcases/general/export_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/export_test.dart.weak.modular.expect
new file mode 100644
index 0000000..497ce03
--- /dev/null
+++ b/pkg/front_end/testcases/general/export_test.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+additionalExports = (core::print)
+
+import "dart:developer" show UserTag;
+export "dart:core" show print;
+
+static method main() → dynamic {
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(dev::UserTag*)
+}
diff --git a/pkg/front_end/testcases/general/expressions.dart.weak.modular.expect b/pkg/front_end/testcases/general/expressions.dart.weak.modular.expect
new file mode 100644
index 0000000..20f5b17
--- /dev/null
+++ b/pkg/front_end/testcases/general/expressions.dart.weak.modular.expect
@@ -0,0 +1,101 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
+//     print(int?.toString());
+//                ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo({dynamic fisk = #C1}) → dynamic {
+  core::print(fisk);
+}
+static method caller(dynamic f) → dynamic {
+  f{dynamic}.call();
+}
+static method main() → dynamic {
+  core::int* i = 0;
+  core::print(i =={core::num::==}{(core::Object*) →* core::bool*} 1 ?{core::String*} "bad" : "good");
+  core::print("${i}");
+  core::print("'${i}'");
+  core::print(" '${i}' ");
+  core::print(" '${i}' '${i}'");
+  core::print(" '${i}' '${i}'");
+  core::print("foobar");
+  core::print(" '${i}' '${i}' '${i}' '${i}'");
+  try {
+    throw "fisk";
+  }
+  on core::String* catch(final core::String* e, final core::StackTrace* s) {
+    core::print(e);
+    if(!(s == null))
+      core::print(s);
+  }
+  for (; false; ) {
+  }
+  core::List<core::String*>* list = <core::String*>["Hello, World!"];
+  core::print(list.{core::List::[]}(i){(core::int*) →* core::String*});
+  list.{core::List::[]=}(i, "Hello, Brave New World!"){(core::int*, core::String*) →* void};
+  core::print(list.{core::List::[]}(i){(core::int*) →* core::String*});
+  i = 87;
+  core::print(i.{core::int::unary-}(){() →* core::int*});
+  core::print(i.{core::int::~}(){() →* core::int*});
+  core::print(!(i =={core::num::==}{(core::Object*) →* core::bool*} 42));
+  core::print(i = i.{core::num::-}(1){(core::num*) →* core::int*});
+  core::print(i = i.{core::num::+}(1){(core::num*) →* core::int*});
+  core::print(let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::-}(1){(core::num*) →* core::int*} in #t1);
+  core::print(let final core::int* #t3 = i in let final core::int* #t4 = i = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3);
+  core::print(new core::Object::•());
+  core::print(#C2);
+  core::print(core::List::filled<core::String*>(2, null).{core::Object::runtimeType}{core::Type*});
+  self::foo(fisk: "Blorp gulp");
+  function f() → Null {
+    core::print("f was called");
+  }
+  self::caller(f);
+  self::caller(() → Null {
+    core::print("<anon> was called");
+  });
+  function g([dynamic message = #C1]) → Null {
+    core::print(message);
+  }
+  g("Hello, World"){([dynamic]) →* Null};
+  self::caller(([dynamic x = #C1]) → Null {
+    core::print("<anon> was called with ${x}");
+  });
+  function h({dynamic message = #C1}) → Null {
+    core::print(message);
+  }
+  h(message: "Hello, World"){({message: dynamic}) →* Null};
+  self::caller(({dynamic x = #C1}) → Null {
+    core::print("<anon> was called with ${x}");
+  });
+  core::print(#C3.{core::Type::toString}(){() →* core::String*});
+  core::print(#C3);
+  core::print(let final core::Type* #t5 = #C3 in block {
+    #t5.{core::Type::toString}(){() →* core::String*};
+  } =>#t5);
+  try {
+    core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
+    print(int?.toString());
+               ^^^^^^^^");
+    throw "Shouldn't work";
+  }
+  on core::NoSuchMethodError* catch(final core::NoSuchMethodError* e) {
+    core::print("As expected: ${e}");
+  }
+  core::print(core::int::parse("42"));
+}
+
+constants  {
+  #C1 = null
+  #C2 = core::Object {}
+  #C3 = TypeLiteralConstant(core::int*)
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///expressions.dart:
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.modular.expect b/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..8ead278
--- /dev/null
+++ b/pkg/front_end/testcases/general/extend_with_type_variable.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/extend_with_type_variable.dart:13:7: Error: The type 'M' can't be mixed in.
+// class Class2<T, M extends Mixin<T>> extends SuperClass with M {}
+//       ^
+//
+// pkg/front_end/testcases/general/extend_with_type_variable.dart:11:7: Error: The type variable 'S' can't be used as supertype.
+// class Class1<T, S extends SuperClass> extends S with Mixin<T> {}
+//       ^
+//
+// pkg/front_end/testcases/general/extend_with_type_variable.dart:13:7: Error: The type variable 'M' can't be used as supertype.
+// class Class2<T, M extends Mixin<T>> extends SuperClass with M {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class SuperClass extends core::Object {
+  synthetic constructor •() → self::SuperClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Mixin<T extends core::Object* = dynamic> extends core::Object /*isMixinDeclaration*/  {
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class1&S&Mixin<T extends core::Object* = dynamic, S extends self::SuperClass*> = core::Object with self::Mixin<self::_Class1&S&Mixin::T*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class1&S&Mixin<self::_Class1&S&Mixin::T*, self::_Class1&S&Mixin::S*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class1<T extends core::Object* = dynamic, S extends self::SuperClass*> extends self::_Class1&S&Mixin<self::Class1::T*, self::Class1::S*> {
+  synthetic constructor •() → self::Class1<self::Class1::T*, self::Class1::S*>*
+    : super self::_Class1&S&Mixin::•()
+    ;
+}
+abstract class _Class2&SuperClass&M<T extends core::Object* = dynamic, M extends self::Mixin<self::_Class2&SuperClass&M::T*>* = self::Mixin<dynamic>*> extends self::SuperClass /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class2&SuperClass&M<self::_Class2&SuperClass&M::T*, self::_Class2&SuperClass&M::M*>*
+    : super self::SuperClass::•()
+    ;
+}
+class Class2<T extends core::Object* = dynamic, M extends self::Mixin<self::Class2::T*>* = self::Mixin<dynamic>*> extends self::_Class2&SuperClass&M<self::Class2::T*, self::Class2::M*> {
+  synthetic constructor •() → self::Class2<self::Class2::T*, self::Class2::M*>*
+    : super self::_Class2&SuperClass&M::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/extension_annotation.dart.weak.modular.expect b/pkg/front_end/testcases/general/extension_annotation.dart.weak.modular.expect
new file mode 100644
index 0000000..d44af16
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_annotation.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+@#C1
+extension Extension on core::int {
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///extension_annotation.dart:
+- A. (from org-dartlang-testcase:///extension_annotation.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.expect b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.expect
index bc4eb86..dfe0844 100644
--- a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.expect
+++ b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart:11:6: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // test(E e) {} // Error.
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.modular.expect b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.modular.expect
new file mode 100644
index 0000000..dfe0844
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart:11:6: Error: This requires the 'extension-types' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// test(E e) {} // Error.
+//      ^
+//
+// pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart:11:6: Error: 'E' isn't a type.
+// test(E e) {} // Error.
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+extension E on self::A {
+}
+static method test(invalid-type e) → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.outline.expect b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.outline.expect
index 1a1b4af..7be45bb 100644
--- a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.outline.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart:11:6: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // test(E e) {} // Error.
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.transformed.expect b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.transformed.expect
index bc4eb86..dfe0844 100644
--- a/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_type_when_experiment_not_enabled.dart:11:6: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // test(E e) {} // Error.
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.expect b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.expect
index e55b3b5..0c596cb 100644
--- a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.expect
+++ b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart:9:11: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // extension type E on A {} // Error because of 'type'.
 //           ^^^^
 //
diff --git a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.modular.expect b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.modular.expect
new file mode 100644
index 0000000..0c596cb
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart:9:11: Error: This requires the 'extension-types' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// extension type E on A {} // Error because of 'type'.
+//           ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+extension type E on self::A {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.outline.expect b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.outline.expect
index a219bab..8b21c25 100644
--- a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.outline.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart:9:11: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // extension type E on A {} // Error because of 'type'.
 //           ^^^^
 //
diff --git a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.transformed.expect b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.transformed.expect
index e55b3b5..0c596cb 100644
--- a/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart.weak.transformed.expect
@@ -3,7 +3,7 @@
 // Problems in library:
 //
 // pkg/front_end/testcases/general/extension_types_feature_not_enabled.dart:9:11: Error: This requires the 'extension-types' language feature to be enabled.
-// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
 // extension type E on A {} // Error because of 'type'.
 //           ^^^^
 //
diff --git a/pkg/front_end/testcases/general/external.dart.weak.modular.expect b/pkg/front_end/testcases/general/external.dart.weak.modular.expect
new file mode 100644
index 0000000..5e9b241
--- /dev/null
+++ b/pkg/front_end/testcases/general/external.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:isolate" as iso;
+import "dart:async" as asy;
+
+import "dart:isolate";
+
+static field dynamic subscription;
+static method onData(dynamic x) → void {
+  core::print(x);
+  self::subscription{dynamic}.cancel();
+}
+static method main() → dynamic {
+  core::String* string = core::String::fromCharCode(65);
+  iso::ReceivePort* port = iso::ReceivePort::•();
+  self::subscription = port.{iso::ReceivePort::listen}(#C1){((dynamic) →* void, {cancelOnError: core::bool*, onDone: () →* void, onError: core::Function*}) →* asy::StreamSubscription<dynamic>*};
+  port.{iso::ReceivePort::sendPort}{iso::SendPort*}.{iso::SendPort::send}(string){(core::Object*) →* void};
+}
+
+constants  {
+  #C1 = static-tearoff self::onData
+}
diff --git a/pkg/front_end/testcases/general/external_import.dart.weak.modular.expect b/pkg/front_end/testcases/general/external_import.dart.weak.modular.expect
new file mode 100644
index 0000000..0d7662f
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_import.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+@#C2
+@#C4
+@#C6
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/external_import.dart:7:1: Error: Dart native extensions are no longer supported.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:here';
+// ^
+//
+// pkg/front_end/testcases/general/external_import.dart:8:1: Error: Dart native extensions are no longer supported.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:foo/../there';
+// ^
+//
+// pkg/front_end/testcases/general/external_import.dart:9:1: Error: Dart native extensions are no longer supported.
+// Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)
+// import 'dart-ext:/usr/local/somewhere';
+// ^
+//
+import self as self;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "dart-ext:here"
+  #C2 = _in::ExternalName {name:#C1}
+  #C3 = "dart-ext:foo/../there"
+  #C4 = _in::ExternalName {name:#C3}
+  #C5 = "dart-ext:/usr/local/somewhere"
+  #C6 = _in::ExternalName {name:#C5}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///external_import.dart:
+- ExternalName. (from org-dartlang-sdk:///sdk/lib/internal/internal.dart:92:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/external_method.dart.weak.modular.expect b/pkg/front_end/testcases/general/external_method.dart.weak.modular.expect
new file mode 100644
index 0000000..323ca66
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_method.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  external method externalMethod() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+external static method externalMethod() → void;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect
new file mode 100644
index 0000000..0cdd47c
--- /dev/null
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+  test::Class::fact();
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/factory_patch/patch_lib.dart:22:52: Error: Can't have a default value here because any default values of 'Class._internal' would be used instead.
+// Try removing the default value.
+//   const factory Class.redirect({bool defaultValue: true}) = Class._internal;
+//                                                    ^
+//
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class extends core::Object {
+  final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  const constructor _internal({core::bool defaultValue = #C3}) → test::Class
+    : test::Class::defaultValue = defaultValue, super core::Object::•()
+    ;
+  @#C1
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ fact({core::bool defaultValue = #C4}) → test::Class
+    return new test::Class::_internal(defaultValue: defaultValue);
+  @#C1
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C4}) → test::Class
+    return throw "unsupported";
+  @#C1
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C4}) → test::Class
+    return new test::Class::_internal(defaultValue: defaultValue);
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+  #C2 = constructor-tearoff test::Class::redirect
+  #C3 = false
+  #C4 = true
+}
diff --git a/pkg/front_end/testcases/general/fallthrough.dart.weak.modular.expect b/pkg/front_end/testcases/general/fallthrough.dart.weak.modular.expect
new file mode 100644
index 0000000..4348081
--- /dev/null
+++ b/pkg/front_end/testcases/general/fallthrough.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/fallthrough.dart:8:5: Error: Switch case may fall through to the next case.
+//     case 3:
+//     ^
+//
+// pkg/front_end/testcases/general/fallthrough.dart:12:5: Error: Switch case may fall through to the next case.
+//     case 6:
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main(core::List<core::String*>* args) → void {
+  core::int* x = args.{core::List::length}{core::int*};
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        x = 4;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///fallthrough.dart", 8);
+      }
+    #L3:
+    case #C2:
+      {
+        break #L1;
+      }
+    #L4:
+    case #C3:
+    case #C4:
+      {
+        if(args.{core::List::[]}(0){(core::int*) →* core::String*} =={core::String::==}{(core::Object*) →* core::bool*} "") {
+          break #L1;
+        }
+        else {
+          return;
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///fallthrough.dart", 12);
+      }
+    #L5:
+    case #C5:
+      {}
+  }
+}
+
+constants  {
+  #C1 = 3
+  #C2 = 5
+  #C3 = 6
+  #C4 = 7
+  #C5 = 4
+}
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.modular.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.modular.expect
new file mode 100644
index 0000000..6895041
--- /dev/null
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:ffi" as ffi;
+import "dart:core" as core;
+
+import "dart:ffi";
+import "package:ffi/ffi.dart";
+
+class Coordinate extends ffi::Struct {
+  @#C1
+  field core::double* x = null;
+  @#C1
+  field core::double* y = null;
+  field ffi::Pointer<self::Coordinate*>* next = null;
+  static factory allocate(ffi::Allocator* allocator, core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate* {
+    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(ffi::AllocatorAlloc|call<self::Coordinate*>(allocator)) in block {
+      #t1.{self::Coordinate::x} = x;
+      #t1.{self::Coordinate::y} = y;
+      #t1.{self::Coordinate::next} = next;
+    } =>#t1;
+  }
+  abstract member-signature get _typedDataBase() → core::Object*; -> ffi::_Compound::_typedDataBase
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = ffi::Double {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///ffi_sample.dart:
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
+- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
index 8f1e1c3..57cc30b 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
@@ -59,16 +59,16 @@
   #C7 = core::pragma {name:#C1, options:#C6}
   #C8 = ffi::Double {}
   #C9 = 0
-  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C10 = <core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C14 = <core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <core::int*>[#C17, #C18, #C17]
+  #C19 = <core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/general/fibonacci.dart.weak.modular.expect b/pkg/front_end/testcases/general/fibonacci.dart.weak.modular.expect
new file mode 100644
index 0000000..df2b7da
--- /dev/null
+++ b/pkg/front_end/testcases/general/fibonacci.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method fibonacci(core::int* n) → core::int* {
+  if(n.{core::num::<}(2){(core::num*) →* core::bool*})
+    return n;
+  return self::fibonacci(n.{core::num::-}(1){(core::num*) →* core::int*}).{core::num::+}(self::fibonacci(n.{core::num::-}(2){(core::num*) →* core::int*})){(core::num*) →* core::int*};
+}
+static method main() → dynamic {
+  for (core::int* i = 0; i.{core::num::<}(20){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    core::print(self::fibonacci(i));
+  }
+}
diff --git a/pkg/front_end/testcases/general/field_initializer_capture_this.dart.weak.modular.expect b/pkg/front_end/testcases/general/field_initializer_capture_this.dart.weak.modular.expect
new file mode 100644
index 0000000..6307537
--- /dev/null
+++ b/pkg/front_end/testcases/general/field_initializer_capture_this.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/field_initializer_capture_this.dart:6:17: Error: Can't access 'this' in a field initializer to read 'x'.
+//   var f = () => x; // error
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field () →* invalid-type f = () → invalid-type => invalid-expression "pkg/front_end/testcases/general/field_initializer_capture_this.dart:6:17: Error: Can't access 'this' in a field initializer to read 'x'.
+  var f = () => x; // error
+                ^";
+  field dynamic x = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/final_field_setter.dart.weak.modular.expect b/pkg/front_end/testcases/general/final_field_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..b2023bc
--- /dev/null
+++ b/pkg/front_end/testcases/general/final_field_setter.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  final field core::int* field = 42;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  set field(core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static final field core::int* field = 42;
+static set field(core::int* value) → void {}
+static method main() → dynamic {
+  self::field = self::field;
+  self::Class* c = new self::Class::•();
+  c.{self::Class::field} = self::field;
+}
diff --git a/pkg/front_end/testcases/general/flutter_issue64155.dart.weak.modular.expect b/pkg/front_end/testcases/general/flutter_issue64155.dart.weak.modular.expect
new file mode 100644
index 0000000..5cfbd7c
--- /dev/null
+++ b/pkg/front_end/testcases/general/flutter_issue64155.dart.weak.modular.expect
@@ -0,0 +1,137 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class TestMixin<R extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object /*isMixinDeclaration*/  {
+  method test(covariant-by-class asy::Future<self::TestMixin::R*>* fetch) → asy::Future<self::TestMixin::T*>* async {
+    final self::TestMixin::R* response = await fetch;
+    self::TestMixin::T* result;
+    if(response is self::Response<dynamic>*) {
+      result = response{self::TestMixin::R* & self::Response<dynamic>* /* '*' & '*' = '*' */}.{self::Response::data}{dynamic} as{TypeError,ForDynamic} self::TestMixin::T*;
+    }
+    else
+      if(response is self::PagingResponse<dynamic>*) {
+        result = response{self::TestMixin::R* & self::PagingResponse<dynamic>* /* '*' & '*' = '*' */}.{self::PagingResponse::data}{self::PagingResponseData<dynamic>*}.{self::PagingResponseData::data}{core::List<dynamic>*} as self::TestMixin::T*;
+      }
+      else
+        if(response is self::TestMixin::T*) {
+          result = response{self::TestMixin::R* & self::TestMixin::T* /* '*' & '*' = '*' */};
+        }
+        else {
+          throw core::Exception::•("Invalid response type");
+        }
+    return result;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class PagingResponse<T extends core::Object* = dynamic> extends core::Object {
+  final field self::PagingResponseData<self::PagingResponse::T*>* data;
+  constructor •(self::PagingResponseData<self::PagingResponse::T*>* data) → self::PagingResponse<self::PagingResponse::T*>*
+    : self::PagingResponse::data = data, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class PagingResponseData<T extends core::Object* = dynamic> extends core::Object {
+  final field core::List<self::PagingResponseData::T*>* data;
+  constructor •(core::List<self::PagingResponseData::T*>* data) → self::PagingResponseData<self::PagingResponseData::T*>*
+    : self::PagingResponseData::data = data, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Response<T extends core::Object* = dynamic> extends core::Object {
+  final field self::Response::T* data;
+  constructor •(self::Response::T* data) → self::Response<self::Response::T*>*
+    : self::Response::data = data, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class1&Object&TestMixin = core::Object with self::TestMixin<self::Response<core::String*>*, core::String*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class1&Object&TestMixin*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method test(covariant-by-class asy::Future<self::Response<core::String*>*>* fetch) → asy::Future<core::String*>*
+    return super.{self::TestMixin::test}(fetch);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class1 extends self::_Class1&Object&TestMixin {
+  synthetic constructor •() → self::Class1*
+    : super self::_Class1&Object&TestMixin::•()
+    ;
+  method _test() → dynamic {
+    final self::Response<core::String*>* response = new self::Response::•<core::String*>("test");
+    this.{self::_Class1&Object&TestMixin::test}(asy::Future::value<self::Response<core::String*>*>(response)){(asy::Future<self::Response<core::String*>*>*) →* asy::Future<core::String*>*};
+  }
+}
+abstract class _Class2&Object&TestMixin = core::Object with self::TestMixin<self::PagingResponse<core::String*>*, core::String*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class2&Object&TestMixin*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method test(covariant-by-class asy::Future<self::PagingResponse<core::String*>*>* fetch) → asy::Future<core::String*>*
+    return super.{self::TestMixin::test}(fetch);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends self::_Class2&Object&TestMixin {
+  synthetic constructor •() → self::Class2*
+    : super self::_Class2&Object&TestMixin::•()
+    ;
+  method _test() → dynamic {
+    final self::PagingResponse<core::String*>* response = new self::PagingResponse::•<core::String*>(new self::PagingResponseData::•<core::String*>(<core::String*>["test"]));
+    this.{self::_Class2&Object&TestMixin::test}(asy::Future::value<self::PagingResponse<core::String*>*>(response)){(asy::Future<self::PagingResponse<core::String*>*>*) →* asy::Future<core::String*>*};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.modular.expect
new file mode 100644
index 0000000..5ba0d07
--- /dev/null
+++ b/pkg/front_end/testcases/general/flutter_issue68092/main.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → void {
+  function f({core::int* x = #C1}) → core::int*
+    return null;
+  new mai::Registry::•().{mai::DynamicDispatchRegistry::register}(f){(({x: core::int*}) →* core::int*) →* ({x: core::int*}) →* core::int*};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/for_in_scope.dart.weak.modular.expect b/pkg/front_end/testcases/general/for_in_scope.dart.weak.modular.expect
new file mode 100644
index 0000000..78f359e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_scope.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main(core::List<core::String*>* arguments) → dynamic {
+  for (core::String* arguments in arguments) {
+    core::print(arguments);
+  }
+}
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.weak.modular.expect
new file mode 100644
index 0000000..ba021d0
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.weak.modular.expect
@@ -0,0 +1,200 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
+// Try inserting an identifier before 'super'.
+//     for (super.untypedSuperInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
+//     for (c.instanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
+//     for (c.untypedSuperInstanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
+//     for (unresolved.foo in []) {}
+//                    ^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
+//     for (c.unresolved in []) {}
+//           ^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
+//     for (main() in []) {}
+//              ^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+//     for (main() in []) {}
+//          ^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
+//     for (var x, y in <int>[]) {
+//               ^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+//     for (var x, y in <int>[]) {
+//          ^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:46:10: Error: Can't assign to the const variable 'constant'.
+//     for (constant in []) {}
+//          ^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
+//     for (unresolved.foo in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+//     for (c.unresolved in []) {}
+//            ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int* superInstanceField = null;
+  field dynamic untypedSuperInstanceField = null;
+  synthetic constructor •() → self::Super*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::Super {
+  field core::int* instanceField = null;
+  field dynamic untypedInstanceField = null;
+  static field core::double* staticField = null;
+  static field dynamic untypedStaticField = null;
+  synthetic constructor •() → self::C*
+    : super self::Super::•()
+    ;
+  method m() → dynamic {
+    core::String* local;
+    dynamic untypedLocal;
+    for (final core::String* #t1 in <core::String*>[]) {
+      local = #t1;
+    }
+    for (final dynamic #t2 in <dynamic>[]) {
+      untypedLocal = #t2;
+    }
+    for (final core::int* #t3 in <core::int*>[]) {
+      this.{self::C::instanceField} = #t3;
+    }
+    for (final dynamic #t4 in <dynamic>[]) {
+      this.{self::C::untypedInstanceField} = #t4;
+    }
+    for (final core::double* #t5 in <core::double*>[]) {
+      self::C::staticField = #t5;
+    }
+    for (final dynamic #t6 in <dynamic>[]) {
+      self::C::untypedStaticField = #t6;
+    }
+    for (final core::bool* #t7 in <core::bool*>[]) {
+      self::topLevelField = #t7;
+    }
+    for (final dynamic #t8 in <dynamic>[]) {
+      self::untypedTopLevelField = #t8;
+    }
+    for (final core::int* #t9 in <core::int*>[]) {
+      super.{self::Super::superInstanceField} = #t9;
+    }
+    for (final dynamic #t10 in <dynamic>[]) {
+      super.{self::Super::untypedSuperInstanceField} = #t10;
+    }
+    self::C* c = new self::C::•();
+    for (final core::int* #t11 in <core::int*>[]) {
+      c.{self::C::instanceField} = #t11;
+    }
+    for (final dynamic #t12 in <dynamic>[]) {
+      c.{self::Super::untypedSuperInstanceField} = #t12;
+    }
+    for (final dynamic #t13 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+    for (unresolved in []) {}
+         ^^^^^^^^^^" in this{<unresolved>}.unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+    for (unresolved in []) {}
+         ^^^^^^^^^^";
+    }
+    for (final dynamic #t14 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
+    for (unresolved.foo in []) {}
+         ^^^^^^^^^^" in this{<unresolved>}.unresolved{<invalid>}.foo = #t14;
+    }
+    for (final dynamic #t15 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+    for (c.unresolved in []) {}
+           ^^^^^^^^^^" in c{<unresolved>}.unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+    for (c.unresolved in []) {}
+           ^^^^^^^^^^";
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (main() in []) {}
+         ^^^^";
+      for (final dynamic #t16 in <dynamic>[]) {
+        invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (main() in []) {}
+         ^^^^";
+        self::main();
+      }
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+    for (var x, y in <int>[]) {
+         ^^^";
+      for (final core::int* #t17 in <core::int*>[]) {
+        invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+    for (var x, y in <int>[]) {
+         ^^^";
+        dynamic x;
+        dynamic y;
+        core::print(x);
+        core::print(y);
+      }
+    }
+    for (final dynamic #t18 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:46:10: Error: Can't assign to the const variable 'constant'.
+    for (constant in []) {}
+         ^^^^^^^^";
+    }
+  }
+}
+static field core::bool* topLevelField;
+static field dynamic untypedTopLevelField;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/forwarding_semi_stub.dart.weak.modular.expect b/pkg/front_end/testcases/general/forwarding_semi_stub.dart.weak.modular.expect
new file mode 100644
index 0000000..f1523c5
--- /dev/null
+++ b/pkg/front_end/testcases/general/forwarding_semi_stub.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::T%>
+    : super core::Object::•()
+    ;
+  method method1(core::int a) → void {}
+  method method2({core::int? a = #C1}) → void {}
+  method method3(core::int a) → void {}
+  method method4(core::num a) → void {}
+  method method5({core::int? a = #C1}) → void {}
+  method method6({core::num? a = #C1}) → void {}
+  method method7(covariant-by-class core::List<self::Super::T%> a) → void {}
+  method method8({covariant-by-class core::List<self::Super::T%>? a = #C1}) → void {}
+  method method9(covariant-by-class core::List<self::Super::T%> a) → void {}
+  method method10(covariant-by-class core::Iterable<self::Super::T%> a) → void {}
+  method method11({covariant-by-class core::List<self::Super::T%>? a = #C1}) → void {}
+  method method12({covariant-by-class core::Iterable<self::Super::T%>? a = #C1}) → void {}
+  set setter1(core::int a) → void {}
+  set setter2(core::num a) → void {}
+  set setter3(covariant-by-class core::List<self::Super::T%> a) → void {}
+  set setter4(covariant-by-class core::Iterable<self::Super::T%> a) → void {}
+}
+class Interface<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Interface<self::Interface::T%>
+    : super core::Object::•()
+    ;
+  method method1(covariant-by-declaration core::num a) → void {}
+  method method2({covariant-by-declaration core::num? a = #C1}) → void {}
+  method method7(covariant-by-declaration covariant-by-class core::Iterable<self::Interface::T%> a) → void {}
+  method method8({covariant-by-declaration covariant-by-class core::Iterable<self::Interface::T%>? a = #C1}) → void {}
+  set setter1(covariant-by-declaration core::num a) → void {}
+  set setter3(covariant-by-declaration covariant-by-class core::Iterable<self::Interface::T%> a) → void {}
+}
+abstract class Class<T extends core::Object? = dynamic> extends self::Super<self::Class::T%> implements self::Interface<self::Class::T%> {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::num) → void */ method3(covariant-by-declaration core::int a) → void
+    return super.{self::Super::method3}(a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method4(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method4}(a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: ({a: core::num?}) → void */ method5({covariant-by-declaration core::int? a = #C1}) → void
+    return super.{self::Super::method5}(a: a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: ({a: core::int?}) → void */ method6({covariant-by-declaration core::num? a = #C1}) → void
+    return super.{self::Super::method6}(a: a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::Iterable<self::Class::T%>) → void */ method9(covariant-by-declaration covariant-by-class core::List<self::Class::T%> a) → void
+    return super.{self::Super::method9}(a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::List<self::Class::T%>) → void */ method10(covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%> a) → void
+    return super.{self::Super::method10}(a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: ({a: core::Iterable<self::Class::T%>?}) → void */ method11({covariant-by-declaration covariant-by-class core::List<self::Class::T%>? a = #C1}) → void
+    return super.{self::Super::method11}(a: a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: ({a: core::List<self::Class::T%>?}) → void */ method12({covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%>? a = #C1}) → void
+    return super.{self::Super::method12}(a: a);
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter2(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter2} = a;
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::List<self::Class::T%>) → void */ setter4(covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%> a) → void
+    return super.{self::Super::setter4} = a;
+  forwarding-stub method method1(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method1}(a as core::int);
+  forwarding-stub method method2({covariant-by-declaration core::num? a = #C1}) → void
+    return super.{self::Super::method2}(a: a as core::int?);
+  forwarding-stub method method7(covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%> a) → void
+    return super.{self::Super::method7}(a as core::List<self::Class::T%>);
+  forwarding-stub method method8({covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%>? a = #C1}) → void
+    return super.{self::Super::method8}(a: a as core::List<self::Class::T%>?);
+  forwarding-stub set setter1(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter1} = a as core::int;
+  forwarding-stub set setter3(covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%> a) → void
+    return super.{self::Super::setter3} = a as core::List<self::Class::T%>;
+}
+class Subclass<T extends core::Object? = dynamic> extends self::Class<self::Subclass::T%> {
+  synthetic constructor •() → self::Subclass<self::Subclass::T%>
+    : super self::Class::•()
+    ;
+  method method1(covariant-by-declaration core::num a) → void {}
+  method method2({covariant-by-declaration core::num? a = #C1}) → void {}
+  method method3(covariant-by-declaration core::num a) → void {}
+  method method4(covariant-by-declaration core::num a) → void {}
+  method method5({covariant-by-declaration core::num? a = #C1}) → void {}
+  method method6({covariant-by-declaration core::num? a = #C1}) → void {}
+  method method7(covariant-by-declaration covariant-by-class core::Iterable<self::Subclass::T%> a) → void {}
+  method method8({covariant-by-declaration covariant-by-class core::Iterable<self::Subclass::T%>? a = #C1}) → void {}
+  method method9(covariant-by-declaration covariant-by-class core::Iterable<self::Subclass::T%> a) → void {}
+  method method10(covariant-by-declaration covariant-by-class core::Iterable<self::Subclass::T%> a) → void {}
+  method method11({covariant-by-declaration covariant-by-class core::Iterable<self::Subclass::T%>? a = #C1}) → void {}
+  method method12({covariant-by-declaration covariant-by-class core::Iterable<self::Subclass::T%>? a = #C1}) → void {}
+  set setter1(covariant-by-declaration core::num a) → void {}
+  set setter2(covariant-by-declaration core::num a) → void {}
+  set setter3(covariant-by-declaration covariant-by-class core::Iterable<self::Subclass::T%> a) → void {}
+  set setter4(covariant-by-declaration covariant-by-class core::Iterable<self::Subclass::T%> a) → void {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.weak.modular.expect b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.weak.modular.expect
new file mode 100644
index 0000000..6b4bf1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(covariant-by-declaration core::int* a) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(dynamic b) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub operator +(covariant-by-declaration dynamic b) → dynamic;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  operator +(dynamic d) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (core::int*) →* dynamic */ +(covariant-by-declaration dynamic e) → dynamic
+    return super.{self::D::+}(e);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_bad_use.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_bad_use.dart.weak.modular.expect
new file mode 100644
index 0000000..044f5c0
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_bad_use.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:1:7: Error: 'Function' is a built-in identifier, could not used as a class name.
+// class Function {}
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:3:9: Error: 'Function' is a built-in identifier, could not used as a type identifier.
+// class C<Function> {}
+//         ^^^^^^^^
+//
+// pkg/front_end/testcases/general/function_bad_use.dart:5:9: Error: 'Function' is a built-in identifier, could not used as a type identifier.
+// mixin M<Function> implements List<Function> {}
+//         ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Function extends core::Object {
+  synthetic constructor •() → self::Function
+    : super core::Object::•()
+    ;
+}
+class C<Function extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::Function%>
+    : super core::Object::•()
+    ;
+}
+abstract class M<Function extends core::Object? = dynamic> extends core::Object implements core::List<self::M::Function%> /*isMixinDeclaration*/  {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_call1.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_call1.dart.weak.modular.expect
new file mode 100644
index 0000000..c5b503d
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call1.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_call1.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   foo();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   bar();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field1 = closure1();
+//                      ^
+//
+// pkg/front_end/testcases/general/function_call1.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field2 = closure2();
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class _Closure1 extends core::Object {
+  synthetic constructor •() → self::_Closure1
+    : super core::Object::•()
+    ;
+  get call() → self::_Closure1
+    return this;
+}
+class _Closure2 extends core::Object {
+  final field self::_Closure2 call;
+  constructor •(self::_Closure2 call) → self::_Closure2
+    : self::_Closure2::call = call, super core::Object::•()
+    ;
+}
+late static field self::_Closure1 closure1;
+late static field self::_Closure2 closure2;
+static field invalid-type field1 = invalid-expression "pkg/front_end/testcases/general/function_call1.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field1 = closure1();
+                     ^";
+static field invalid-type field2 = invalid-expression "pkg/front_end/testcases/general/function_call1.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field2 = closure2();
+                     ^";
+static method test(self::_Closure1 foo, self::_Closure2 bar) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/function_call1.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/general/function_call1.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call1.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  bar();
+     ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_call2.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_call2.dart.weak.modular.expect
new file mode 100644
index 0000000..c0f6881
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_call2.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_call2.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   foo();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   bar();
+//      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+//  - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field1 = closure1();
+//                      ^
+//
+// pkg/front_end/testcases/general/function_call2.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+//  - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+// var field2 = closure2();
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class _Closure1 extends core::Object {
+  synthetic constructor •() → self::_Closure1
+    : super core::Object::•()
+    ;
+  get call() → () → void
+    return () → void {};
+}
+class _Closure2 extends core::Object {
+  final field () → void call;
+  constructor •(() → void call) → self::_Closure2
+    : self::_Closure2::call = call, super core::Object::•()
+    ;
+}
+late static field self::_Closure1 closure1;
+late static field self::_Closure2 closure2;
+static field invalid-type field1 = invalid-expression "pkg/front_end/testcases/general/function_call2.dart:23:22: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field1 = closure1();
+                     ^";
+static field invalid-type field2 = invalid-expression "pkg/front_end/testcases/general/function_call2.dart:24:22: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+var field2 = closure2();
+                     ^";
+static method test(self::_Closure1 foo, self::_Closure2 bar) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/function_call2.dart:16:6: Error: Cannot invoke an instance of '_Closure1' because it declares 'call' to be something other than a method.
+ - '_Closure1' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/general/function_call2.dart:17:6: Error: Cannot invoke an instance of '_Closure2' because it declares 'call' to be something other than a method.
+ - '_Closure2' is from 'pkg/front_end/testcases/general/function_call2.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  bar();
+     ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_in_field.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_in_field.dart.weak.modular.expect
new file mode 100644
index 0000000..a2c6a44
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_in_field.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field () →* core::int* x = () → core::int* {
+  core::int* y = 42;
+  return y;
+};
+static method main() → dynamic {
+  core::print(self::x(){() →* core::int*});
+}
diff --git a/pkg/front_end/testcases/general/function_invocation_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_invocation_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..c7ced86
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_invocation_bounds.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_invocation_bounds.dart:9:8: Error: Inferred type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'local'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   local("");
+//        ^
+//
+// pkg/front_end/testcases/general/function_invocation_bounds.dart:10:8: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'local'.
+// Try changing type arguments so that they conform to the bounds.
+//   local<String>(throw '');
+//        ^
+//
+// pkg/front_end/testcases/general/function_invocation_bounds.dart:13:8: Error: Expected 1 type arguments.
+//   local<int, String>(throw '');
+//        ^
+//
+// pkg/front_end/testcases/general/function_invocation_bounds.dart:15:4: Error: Inferred type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   f("");
+//    ^
+//
+// pkg/front_end/testcases/general/function_invocation_bounds.dart:16:4: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try changing type arguments so that they conform to the bounds.
+//   f<String>(throw '');
+//    ^
+//
+// pkg/front_end/testcases/general/function_invocation_bounds.dart:19:4: Error: Expected 1 type arguments.
+//   f<int, String>(throw '');
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant T extends core::Object? = dynamic> = (T%) → T%;
+static method test() → dynamic {
+  function local<T extends core::num>(T t) → T
+    return t;
+  local<core::String>(""){(core::String) → core::String};
+  local<core::String>(throw ""){(core::String) → core::String};
+  local<core::int>(0){(core::int) → core::int};
+  local<core::int>(throw ""){(core::int) → core::int};
+  invalid-expression "pkg/front_end/testcases/general/function_invocation_bounds.dart:13:8: Error: Expected 1 type arguments.
+  local<int, String>(throw '');
+       ^" in local{<inapplicable>}.<core::int, core::String>(throw "");
+  <T extends core::num>(T) → T f = local;
+  f<core::String>(""){(core::String) → core::String};
+  f<core::String>(throw ""){(core::String) → core::String};
+  f<core::int>(0){(core::int) → core::int};
+  f<core::int>(throw ""){(core::int) → core::int};
+  invalid-expression "pkg/front_end/testcases/general/function_invocation_bounds.dart:19:4: Error: Expected 1 type arguments.
+  f<int, String>(throw '');
+   ^" in f{<inapplicable>}.<core::int, core::String>(throw "");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.weak.modular.expect
new file mode 100644
index 0000000..0333159
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
+// String x = identity; // No bound
+//            ^
+//
+// pkg/front_end/testcases/general/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
+//  - 'Object' is from 'dart:core'.
+// String y = identityObject; // Object bound
+//            ^
+//
+// pkg/front_end/testcases/general/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
+//  - 'List' is from 'dart:core'.
+// String z = identityList; // List<T> bound
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::String* x = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
+String x = identity; // No bound
+           ^" in #C1 as{TypeError} core::String*;
+static field core::String* y = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
+ - 'Object' is from 'dart:core'.
+String y = identityObject; // Object bound
+           ^" in #C2 as{TypeError} core::String*;
+static field core::String* z = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
+ - 'List' is from 'dart:core'.
+String z = identityList; // List<T> bound
+           ^" in #C3 as{TypeError} core::String*;
+static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
+  return t;
+static method identityObject<T extends core::Object*>(self::identityObject::T* t) → self::identityObject::T*
+  return t;
+static method identityList<T extends core::List<self::identityList::T*>* = core::List<dynamic>*>(self::identityList::T* t) → self::identityList::T*
+  return t;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::identity
+  #C2 = static-tearoff self::identityObject
+  #C3 = static-tearoff self::identityList
+}
diff --git a/pkg/front_end/testcases/general/function_type_default_value.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_type_default_value.dart.weak.modular.expect
new file mode 100644
index 0000000..37aef15
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_default_value.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
+// Try inserting an identifier before ':'.
+// void Function({obj: Object}) x;
+//                   ^
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:19: Error: Can't have a default value in a function type.
+// void Function({obj: Object}) x;
+//                   ^
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:16: Error: Type 'obj' not found.
+// void Function({obj: Object}) x;
+//                ^^^
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:16: Error: 'obj' isn't a type.
+// void Function({obj: Object}) x;
+//                ^^^
+//
+import self as self;
+
+static field () →* void x;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.weak.modular.expect
new file mode 100644
index 0000000..3994837
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart" show Expect;
+
+static method test(dynamic f) → dynamic {
+  if(f is (core::Object*, core::StackTrace*) →* void)
+    return 1;
+  if(f is (core::Object*) →* void)
+    return 10;
+  if(f is () →* void)
+    return 100;
+}
+static method main() → dynamic {
+  exp::Expect::equals(111, self::test(() → Null => null){dynamic}.+(self::test((core::Object* o) → Null => null)){dynamic}.+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
+}
diff --git a/pkg/front_end/testcases/general/function_type_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_type_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..9c2602d
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_parameter.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:11:20: Error: A type variable on a function type can't have annotations.
+// void Function<@A() T>(T)? f;
+//                    ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:13:32: Error: A type variable on a function type can't have annotations.
+// typedef F = void Function<@A() T>(T);
+//                                ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:19:33: Error: A type variable on a function type can't have annotations.
+// void method2(void Function<@A() T>(T) f) {}
+//                                 ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:21:42: Error: A type variable on a function type can't have annotations.
+// class Class<T extends void Function<@A() S>(S)> {}
+//                                          ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:21:13: Error: Type variables can't have generic function types in their bounds.
+// class Class<T extends void Function<@A() S>(S)> {}
+//             ^
+//
+// pkg/front_end/testcases/general/function_type_parameter.dart:26:22: Error: A type variable on a function type can't have annotations.
+//   void Function<@A() T>(T)? f;
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@#C1 T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@#C1 T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///function_type_parameter.dart:
+- A. (from org-dartlang-testcase:///function_type_parameter.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/function_type_recovery.dart.weak.modular.expect b/pkg/front_end/testcases/general/function_type_recovery.dart.weak.modular.expect
new file mode 100644
index 0000000..b221bcb
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_recovery.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_recovery.dart:8:31: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+// typedef F = int Function(int f(String x));
+//                               ^
+//
+// pkg/front_end/testcases/general/function_type_recovery.dart:12:27: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+//   String Function(String g(int y)) g = null;
+//                           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = ((core::String*) →* core::int*) →* core::int*;
+static method main() → dynamic {
+  ((core::String*) →* core::int*) →* core::int* f = null;
+  ((core::int*) →* core::String*) →* core::String* g = null;
+}
diff --git a/pkg/front_end/testcases/general/functions.dart.weak.modular.expect b/pkg/front_end/testcases/general/functions.dart.weak.modular.expect
new file mode 100644
index 0000000..a0fd727
--- /dev/null
+++ b/pkg/front_end/testcases/general/functions.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function local(({a: dynamic}) →* void f) → void {
+    f(a: "Hello, World"){({a: dynamic}) →* void};
+    f(){({a: dynamic}) →* void};
+  }
+  local(({dynamic a = #C1}) → Null {
+    core::print(a);
+  }){(({a: dynamic}) →* void) →* void};
+}
+
+constants  {
+  #C1 = "Default greeting!"
+}
diff --git a/pkg/front_end/testcases/general/future_or_null.dart.weak.modular.expect b/pkg/front_end/testcases/general/future_or_null.dart.weak.modular.expect
new file mode 100644
index 0000000..040f77f
--- /dev/null
+++ b/pkg/front_end/testcases/general/future_or_null.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+
+import "dart:async";
+
+static get foo() → FutureOr<Null>*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/future_or_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/future_or_test.dart.weak.modular.expect
new file mode 100644
index 0000000..cc061fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/future_or_test.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  field self::A* a = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method bar() → asy::Future<dynamic>* async 
+    return this.{self::B::a}{self::A*}.{self::A::foo}(){() →* dynamic};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::B* b = new self::B::•();
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method baz() → asy::Future<core::int*>* async 
+    return this.{self::C::b}{self::B*}.{self::B::bar}(){() →* asy::Future<dynamic>*} as{TypeError} FutureOr<core::int*>*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/future_return.dart.weak.modular.expect b/pkg/front_end/testcases/general/future_return.dart.weak.modular.expect
new file mode 100644
index 0000000..3514a60
--- /dev/null
+++ b/pkg/front_end/testcases/general/future_return.dart.weak.modular.expect
@@ -0,0 +1,81 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/future_return.dart:11:7: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// Class returnClass() async => new Class();
+//       ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/future_return.dart:17:7: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// Class returnClassFromDynamic() async => returnDynamic();
+//       ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/future_return.dart:23:7: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// Class returnClassFromFutureClass() async => returnFutureClass();
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/future_return.dart:30:7: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// Class returnClassFromFutureOrClass() async => returnFutureOrClass();
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method returnDynamic() → dynamic
+  return new self::Class::•();
+static method returnClass() → self::Class* async 
+  return new self::Class::•();
+static method returnFutureClass() → asy::Future<self::Class*>* async 
+  return new self::Class::•();
+static method returnFutureOrClass() → FutureOr<self::Class*>* async 
+  return new self::Class::•();
+static method returnClassFromDynamic() → self::Class* async 
+  return self::returnDynamic() as{TypeError} FutureOr<self::Class*>*;
+static method returnFutureClassDynamic() → asy::Future<self::Class*>* async 
+  return self::returnDynamic() as{TypeError} FutureOr<self::Class*>*;
+static method returnFutureOrClassDynamic() → FutureOr<self::Class*>* async 
+  return self::returnDynamic() as{TypeError} FutureOr<self::Class*>*;
+static method returnClassFromFutureClass() → self::Class* async 
+  return self::returnFutureClass();
+static method returnFutureClassFromFutureClass() → asy::Future<self::Class*>* async 
+  return self::returnFutureClass();
+static method returnFutureOrClassFromFutureClass() → FutureOr<self::Class*>* async 
+  return self::returnFutureClass();
+static method returnClassFromFutureOrClass() → self::Class* async 
+  return self::returnFutureOrClass();
+static method returnFutureClassFromFutureOrClass() → asy::Future<self::Class*>* async 
+  return self::returnFutureOrClass();
+static method returnFutureOrClassFromFutureOrClass() → FutureOr<self::Class*>* async 
+  return self::returnFutureOrClass();
+static method main() → dynamic async {
+  await self::returnClass();
+  await self::returnFutureClass();
+  await self::returnFutureOrClass();
+  await self::returnClassFromDynamic();
+  await self::returnFutureClassDynamic();
+  await self::returnFutureOrClassDynamic();
+  await self::returnClassFromFutureClass();
+  await self::returnFutureClassFromFutureClass();
+  await self::returnFutureOrClassFromFutureClass();
+  await self::returnClassFromFutureOrClass();
+  await self::returnFutureClassFromFutureOrClass();
+  await self::returnFutureOrClassFromFutureOrClass();
+}
diff --git a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.modular.expect b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.modular.expect
new file mode 100644
index 0000000..20b824e
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/generic_function_type_in_message.dart:8:11: Error: A value of type 'num Function<A extends num, B extends num>(A, B)' can't be assigned to a variable of type 'int'.
+//   int x = add;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method add<A extends core::num*, B extends core::num*>(self::add::A* a, self::add::B* b) → core::num*
+  return a.{core::num::+}(b){(core::num*) →* core::num*};
+static method test() → dynamic {
+  core::int* x = invalid-expression "pkg/front_end/testcases/general/generic_function_type_in_message.dart:8:11: Error: A value of type 'num Function<A extends num, B extends num>(A, B)' can't be assigned to a variable of type 'int'.
+  int x = add;
+          ^" in #C1 as{TypeError} core::int*;
+}
+static method main() → dynamic {
+  if(self::add<core::int*, core::int*>(1, 2).{core::num::<}(3){(core::num*) →* core::bool*})
+    self::test();
+}
+
+constants  {
+  #C1 = static-tearoff self::add
+}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..509ac9e
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef E2<unrelated T extends core::num*> = () →* void;
+typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
+typedef E4<unrelated T extends core::num*, unrelated S extends core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num*> = () →* void;
+typedef E6<unrelated T extends core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef F1 = <T extends core::Object* = dynamic>() →* void;
+typedef F2 = <T extends core::num* = dynamic>() →* void;
+typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
+typedef F4 = <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
+typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num*> = <T extends X* = dynamic>() →* void;
+typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G4<invariant X extends core::num*, invariant Y extends core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
+typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
+typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
+typedef H4 = (<T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H5 = (<T extends S* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H6 = (<T extends core::num* = dynamic, S extends T* = dynamic>() →* void) →* void;
+static field <T extends core::Object* = dynamic>() →* void f1;
+static field <T extends core::num* = dynamic>() →* void f2;
+static field <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void f3;
+static field <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void f4;
+static field <T extends S* = dynamic, S extends core::num* = dynamic>() →* void f5;
+static field <T extends core::num* = dynamic, S extends T* = dynamic>() →* void f6;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/generic_typedef_in_generic_class.dart.weak.modular.expect b/pkg/front_end/testcases/general/generic_typedef_in_generic_class.dart.weak.modular.expect
new file mode 100644
index 0000000..9a41483
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_typedef_in_generic_class.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%) → T%;
+class Class<A extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::A%>
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    core::print(#C1);
+    core::print(#C1);
+  }
+}
+static method main() → dynamic {
+  new self::Class::•<core::int>().{self::Class::method}(){() → dynamic};
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T*, S*) →* T*)
+}
diff --git a/pkg/front_end/testcases/general/getter_call.dart.weak.modular.expect b/pkg/front_end/testcases/general/getter_call.dart.weak.modular.expect
new file mode 100644
index 0000000..bcf489c
--- /dev/null
+++ b/pkg/front_end/testcases/general/getter_call.dart.weak.modular.expect
@@ -0,0 +1,187 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::Function* field1a = #C1;
+  field () →* core::int* field1b = #C1;
+  field (core::int*) →* core::int* field2 = #C2;
+  field (core::int*, core::int*) →* core::int* field3 = #C3;
+  field (core::int*, [core::int*]) →* core::int* field4 = #C4;
+  field ([core::int*, core::int*]) →* core::int* field5 = #C5;
+  field (core::int*, {b: core::int*}) →* core::int* field6 = #C6;
+  field ({a: core::int*, b: core::int*}) →* core::int* field7 = #C7;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  get getter1a() → core::Function*
+    return #C1;
+  get getter1b() → () →* core::int*
+    return #C1;
+  get getter2() → (core::int*) →* core::int*
+    return #C2;
+  get getter3() → (core::int*, core::int*) →* core::int*
+    return #C3;
+  get getter4() → (core::int*, [core::int*]) →* core::int*
+    return #C4;
+  get getter5() → ([core::int*, core::int*]) →* core::int*
+    return #C5;
+  get getter6() → (core::int*, {b: core::int*}) →* core::int*
+    return #C6;
+  get getter7() → ({a: core::int*, b: core::int*}) →* core::int*
+    return #C7;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass*
+    : super self::Class::•()
+    ;
+  get field1a() → core::Function* {
+    self::enableRead = false;
+    return #C1;
+  }
+  get field1b() → () →* core::int* {
+    self::enableRead = false;
+    return #C1;
+  }
+  get field2() → (core::int*) →* core::int* {
+    self::enableRead = false;
+    return #C2;
+  }
+  get field3() → (core::int*, core::int*) →* core::int* {
+    self::enableRead = false;
+    return #C3;
+  }
+  get field4() → (core::int*, [core::int*]) →* core::int* {
+    self::enableRead = false;
+    return #C4;
+  }
+  get field5() → ([core::int*, core::int*]) →* core::int* {
+    self::enableRead = false;
+    return #C5;
+  }
+  get field6() → (core::int*, {b: core::int*}) →* core::int* {
+    self::enableRead = false;
+    return #C6;
+  }
+  get field7() → ({a: core::int*, b: core::int*}) →* core::int* {
+    self::enableRead = false;
+    return #C7;
+  }
+  get getter1a() → core::Function* {
+    self::enableRead = false;
+    return #C1;
+  }
+  get getter1b() → () →* core::int* {
+    self::enableRead = false;
+    return #C1;
+  }
+  get getter2() → (core::int*) →* core::int* {
+    self::enableRead = false;
+    return #C2;
+  }
+  get getter3() → (core::int*, core::int*) →* core::int* {
+    self::enableRead = false;
+    return #C3;
+  }
+  get getter4() → (core::int*, [core::int*]) →* core::int* {
+    self::enableRead = false;
+    return #C4;
+  }
+  get getter5() → ([core::int*, core::int*]) →* core::int* {
+    self::enableRead = false;
+    return #C5;
+  }
+  get getter6() → (core::int*, {b: core::int*}) →* core::int* {
+    self::enableRead = false;
+    return #C6;
+  }
+  get getter7() → ({a: core::int*, b: core::int*}) →* core::int* {
+    self::enableRead = false;
+    return #C7;
+  }
+}
+static field core::bool* enableRead = true;
+static method read(core::int* value) → core::int*
+  return self::enableRead ?{core::int*} value : 1.{core::int::unary-}(){() →* core::int*};
+static method method1() → core::int*
+  return 0;
+static method method2(core::int* a) → core::int*
+  return a.{core::int::unary-}(){() →* core::int*};
+static method method3(core::int* a, core::int* b) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method method4(core::int* a, [core::int* b = #C8]) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method method5([core::int* a = #C8, core::int* b = #C8]) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method method6(core::int* a, {core::int* b = #C8}) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method method7({core::int* a = #C8, core::int* b = #C8}) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method main() → dynamic {
+  self::callField(new self::Class::•());
+  self::callGetter(new self::Class::•());
+  self::callField(new self::Subclass::•());
+  self::callGetter(new self::Subclass::•());
+}
+static method callField(self::Class* c) → dynamic {
+  self::expect(0, c.{self::Class::field1a}{core::Function*}());
+  self::expect(0, c.{self::Class::field1b}{() →* core::int*}(){() →* core::int*});
+  self::expect(42.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t1 = c in let final core::int* #t2 = self::read(42) in #t1.{self::Class::field2}{(core::int*) →* core::int*}(#t2){(core::int*) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t3 = c in let final core::int* #t4 = self::read(12) in let final core::int* #t5 = self::read(23) in #t3.{self::Class::field3}{(core::int*, core::int*) →* core::int*}(#t4, #t5){(core::int*, core::int*) →* core::int*});
+  self::expect(12, let final self::Class* #t6 = c in let final core::int* #t7 = self::read(12) in #t6.{self::Class::field4}{(core::int*, [core::int*]) →* core::int*}(#t7){(core::int*, [core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t8 = c in let final core::int* #t9 = self::read(12) in let final core::int* #t10 = self::read(23) in #t8.{self::Class::field4}{(core::int*, [core::int*]) →* core::int*}(#t9, #t10){(core::int*, [core::int*]) →* core::int*});
+  self::expect(0, c.{self::Class::field5}{([core::int*, core::int*]) →* core::int*}(){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t11 = c in let final core::int* #t12 = self::read(12) in #t11.{self::Class::field5}{([core::int*, core::int*]) →* core::int*}(#t12){([core::int*, core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t13 = c in let final core::int* #t14 = self::read(12) in let final core::int* #t15 = self::read(23) in #t13.{self::Class::field5}{([core::int*, core::int*]) →* core::int*}(#t14, #t15){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t16 = c in let final core::int* #t17 = self::read(12) in #t16.{self::Class::field6}{(core::int*, {b: core::int*}) →* core::int*}(#t17){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t18 = c in let final core::int* #t19 = self::read(12) in let final core::int* #t20 = self::read(23) in #t18.{self::Class::field6}{(core::int*, {b: core::int*}) →* core::int*}(#t19, b: #t20){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(0, c.{self::Class::field7}{({a: core::int*, b: core::int*}) →* core::int*}(){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(12, let final self::Class* #t21 = c in let final core::int* #t22 = self::read(12) in #t21.{self::Class::field7}{({a: core::int*, b: core::int*}) →* core::int*}(a: #t22){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(23.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t23 = c in let final core::int* #t24 = self::read(23) in #t23.{self::Class::field7}{({a: core::int*, b: core::int*}) →* core::int*}(b: #t24){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t25 = c in let final core::int* #t26 = self::read(12) in let final core::int* #t27 = self::read(23) in #t25.{self::Class::field7}{({a: core::int*, b: core::int*}) →* core::int*}(a: #t26, b: #t27){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t28 = c in let final core::int* #t29 = self::read(23) in let final core::int* #t30 = self::read(12) in #t28.{self::Class::field7}{({a: core::int*, b: core::int*}) →* core::int*}(b: #t29, a: #t30){({a: core::int*, b: core::int*}) →* core::int*});
+}
+static method callGetter(self::Class* c) → dynamic {
+  self::expect(0, c.{self::Class::getter1a}{core::Function*}());
+  self::expect(0, c.{self::Class::getter1b}{() →* core::int*}(){() →* core::int*});
+  self::expect(42.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t31 = c in let final core::int* #t32 = self::read(42) in #t31.{self::Class::getter2}{(core::int*) →* core::int*}(#t32){(core::int*) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t33 = c in let final core::int* #t34 = self::read(12) in let final core::int* #t35 = self::read(23) in #t33.{self::Class::getter3}{(core::int*, core::int*) →* core::int*}(#t34, #t35){(core::int*, core::int*) →* core::int*});
+  self::expect(12, let final self::Class* #t36 = c in let final core::int* #t37 = self::read(12) in #t36.{self::Class::getter4}{(core::int*, [core::int*]) →* core::int*}(#t37){(core::int*, [core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t38 = c in let final core::int* #t39 = self::read(12) in let final core::int* #t40 = self::read(23) in #t38.{self::Class::getter4}{(core::int*, [core::int*]) →* core::int*}(#t39, #t40){(core::int*, [core::int*]) →* core::int*});
+  self::expect(0, c.{self::Class::getter5}{([core::int*, core::int*]) →* core::int*}(){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t41 = c in let final core::int* #t42 = self::read(12) in #t41.{self::Class::getter5}{([core::int*, core::int*]) →* core::int*}(#t42){([core::int*, core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t43 = c in let final core::int* #t44 = self::read(12) in let final core::int* #t45 = self::read(23) in #t43.{self::Class::getter5}{([core::int*, core::int*]) →* core::int*}(#t44, #t45){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t46 = c in let final core::int* #t47 = self::read(12) in #t46.{self::Class::getter6}{(core::int*, {b: core::int*}) →* core::int*}(#t47){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t48 = c in let final core::int* #t49 = self::read(12) in let final core::int* #t50 = self::read(23) in #t48.{self::Class::getter6}{(core::int*, {b: core::int*}) →* core::int*}(#t49, b: #t50){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(0, c.{self::Class::getter7}{({a: core::int*, b: core::int*}) →* core::int*}(){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(12, let final self::Class* #t51 = c in let final core::int* #t52 = self::read(12) in #t51.{self::Class::getter7}{({a: core::int*, b: core::int*}) →* core::int*}(a: #t52){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(23.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t53 = c in let final core::int* #t54 = self::read(23) in #t53.{self::Class::getter7}{({a: core::int*, b: core::int*}) →* core::int*}(b: #t54){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t55 = c in let final core::int* #t56 = self::read(12) in let final core::int* #t57 = self::read(23) in #t55.{self::Class::getter7}{({a: core::int*, b: core::int*}) →* core::int*}(a: #t56, b: #t57){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t58 = c in let final core::int* #t59 = self::read(23) in let final core::int* #t60 = self::read(12) in #t58.{self::Class::getter7}{({a: core::int*, b: core::int*}) →* core::int*}(b: #t59, a: #t60){({a: core::int*, b: core::int*}) →* core::int*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  self::enableRead = true;
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, ${actual}";
+}
+
+constants  {
+  #C1 = static-tearoff self::method1
+  #C2 = static-tearoff self::method2
+  #C3 = static-tearoff self::method3
+  #C4 = static-tearoff self::method4
+  #C5 = static-tearoff self::method5
+  #C6 = static-tearoff self::method6
+  #C7 = static-tearoff self::method7
+  #C8 = 0
+}
diff --git a/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.modular.expect
new file mode 100644
index 0000000..e38d7f0
--- /dev/null
+++ b/pkg/front_end/testcases/general/getter_vs_setter_type.dart.weak.modular.expect
@@ -0,0 +1,423 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:15:14: Error: The type 'String' of the getter 'A.property3' is not assignable to the type 'int' of the setter 'A.property3'.
+//   String get property3; // error
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:16:12: Context: This is the declaration of the setter 'A.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:33:18: Error: The type 'num' of the getter 'A.property9' is not assignable to the type 'String' of the setter 'A.property9'.
+//   static num get property9 => 0; // error
+//                  ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:34:19: Context: This is the declaration of the setter 'A.property9'.
+//   static void set property9(String value) {}
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:56:12: Error: The type 'int' of the inherited getter 'B1.property2' is not assignable to the type 'String' of the setter 'B2.property2'.
+//   void set property2(String i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:40:11: Context: This is the declaration of the getter 'B1.property2'.
+//   int get property2;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:58:12: Error: The type 'String' of the inherited getter 'B1.property3' is not assignable to the type 'int' of the setter 'B2.property3'.
+//   void set property3(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:42:14: Context: This is the declaration of the getter 'B1.property3'.
+//   String get property3;
+//              ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:62:12: Error: The type 'int' of the inherited field 'B1.property5' is not assignable to the type 'String' of the setter 'B2.property5'.
+//   void set property5(String i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:46:13: Context: This is the declaration of the field 'B1.property5'.
+//   final int property5;
+//             ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:64:12: Error: The type 'String' of the inherited field 'B1.property6' is not assignable to the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:48:16: Context: This is the declaration of the field 'B1.property6'.
+//   final String property6;
+//                ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:84:11: Error: The type 'int' of the getter 'C2.property2' is not assignable to the type 'String' of the inherited setter 'C1.property2'.
+//   int get property2; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:70:12: Context: This is the declaration of the setter 'C1.property2'.
+//   void set property2(String i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:86:14: Error: The type 'String' of the getter 'C2.property3' is not assignable to the type 'int' of the inherited setter 'C1.property3'.
+//   String get property3; // error
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:72:12: Context: This is the declaration of the setter 'C1.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The type 'int' of the getter 'C2.property5' is not assignable to the type 'String' of the inherited setter 'C1.property5'.
+//   int get property5; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the declaration of the setter 'C1.property5'.
+//   String property5;
+//          ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The type 'String' of the getter 'C2.property6' is not assignable to the type 'int' of the inherited setter 'C1.property6'.
+//   String get property6; // error
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:92:11: Error: The return type of the method 'C2.property5' is 'int', which does not match the return type, 'String', of the overridden method, 'C1.property5'.
+// Change to a subtype of 'String'.
+//   int get property5; // error
+//           ^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:76:10: Context: This is the overridden method ('property5').
+//   String property5;
+//          ^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:96:14: Error: The return type of the method 'C2.property6' is 'String', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
+// Change to a subtype of 'int'.
+//   String get property6; // error
+//              ^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:78:7: Context: This is the overridden method ('property6').
+//   int property6;
+//       ^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:115:16: Error: The type 'int' of the inherited getter 'D1.property2' is not assignable to the type 'String' of the inherited setter 'D2.property2'.
+// abstract class D3 implements D1, D2 /* error on property2 and property3 */ {}
+//                ^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:102:11: Context: This is the declaration of the getter 'D1.property2'.
+//   int get property2;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:110:12: Context: This is the declaration of the setter 'D2.property2'.
+//   void set property2(String i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:115:16: Error: The type 'String' of the inherited getter 'D1.property3' is not assignable to the type 'int' of the inherited setter 'D2.property3'.
+// abstract class D3 implements D1, D2 /* error on property2 and property3 */ {}
+//                ^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:104:14: Context: This is the declaration of the getter 'D1.property3'.
+//   String get property3;
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:112:12: Context: This is the declaration of the setter 'D2.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:117:16: Error: The type 'int' of the inherited getter 'D1.property2' is not assignable to the type 'String' of the inherited setter 'D2.property2'.
+// abstract class D4
+//                ^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:102:11: Context: This is the declaration of the getter 'D1.property2'.
+//   int get property2;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:110:12: Context: This is the declaration of the setter 'D2.property2'.
+//   void set property2(String i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:117:16: Error: The type 'String' of the inherited getter 'D1.property3' is not assignable to the type 'int' of the inherited setter 'D2.property3'.
+// abstract class D4
+//                ^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:104:14: Context: This is the declaration of the getter 'D1.property3'.
+//   String get property3;
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:112:12: Context: This is the declaration of the setter 'D2.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:130:14: Error: The type 'String' of the getter 'property3' is not assignable to the type 'int' of the setter 'property3'.
+//   String get property3 => ''; // error
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:131:12: Context: This is the declaration of the setter 'property3'.
+//   void set property3(int i) {}
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:142:14: Error: The type 'String' of the getter 'property6' is not assignable to the type 'S' of the setter 'property6'.
+//   String get property6 => ''; // error
+//              ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:143:12: Context: This is the declaration of the setter 'property6'.
+//   void set property6(S i) {}
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:154:18: Error: The type 'num' of the getter 'property9' is not assignable to the type 'String' of the setter 'property9'.
+//   static num get property9 => 0; // error
+//                  ^^^^^^^^^
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:155:19: Context: This is the declaration of the setter 'property9'.
+//   static void set property9(String value) {}
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:133:22: Error: A value of type 'int' can't be assigned to a variable of type 'S'.
+//   S get property4 => 0; // ok
+//                      ^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:136:23: Error: A value of type 'int' can't be assigned to a variable of type 'S'.
+//   S get property5a => 0; // ok
+//                       ^
+//
+// pkg/front_end/testcases/general/getter_vs_setter_type.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'T'.
+//   T get property5b => 0; // ok
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int* property4 = null;
+  field core::int* property5 = null;
+  covariant-by-declaration field core::String* property6 = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get property1() → core::int*;
+  abstract set property1(core::int* i) → void;
+  abstract get property2a() → core::num*;
+  abstract set property2a(core::int* i) → void;
+  abstract get property2b() → core::int*;
+  abstract set property2b(core::num* i) → void;
+  abstract get property3() → core::String*;
+  abstract set property3(core::int* i) → void;
+  static get property7() → core::int*
+    return 0;
+  static set property7(core::int* value) → void {}
+  static get property8a() → core::int*
+    return 0;
+  static set property8a(core::num* value) → void {}
+  static get property8b() → core::num*
+    return 0;
+  static set property8b(core::int* value) → void {}
+  static get property9() → core::num*
+    return 0;
+  static set property9(core::String* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B1 extends core::Object {
+  final field core::int* property4;
+  final field core::int* property5;
+  final field core::String* property6;
+  constructor •(core::int* property4, core::int* property5, core::String* property6) → self::B1*
+    : self::B1::property4 = property4, self::B1::property5 = property5, self::B1::property6 = property6, super core::Object::•()
+    ;
+  abstract get property1() → core::int*;
+  abstract get property2() → core::int*;
+  abstract get property3() → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B2 extends core::Object implements self::B1 {
+  synthetic constructor •() → self::B2*
+    : super core::Object::•()
+    ;
+  abstract set property1(core::int* i) → void;
+  abstract set property2(core::String* i) → void;
+  abstract set property3(core::int* i) → void;
+  abstract set property4(core::int* i) → void;
+  abstract set property5(core::String* i) → void;
+  abstract set property6(core::int* i) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C1 extends core::Object {
+  field core::int* property4 = null;
+  field core::String* property5 = null;
+  field core::int* property6 = null;
+  synthetic constructor •() → self::C1*
+    : super core::Object::•()
+    ;
+  abstract set property1(core::int* i) → void;
+  abstract set property2(core::String* i) → void;
+  abstract set property3(core::int* i) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C2 extends core::Object implements self::C1 {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  abstract get property1() → core::int*;
+  abstract get property2() → core::int*;
+  abstract get property3() → core::String*;
+  abstract get property4() → core::int*;
+  abstract get property5() → core::int*;
+  abstract get property6() → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D1 extends core::Object {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract get property1() → core::int*;
+  abstract get property2() → core::int*;
+  abstract get property3() → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D2 extends core::Object {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  abstract set property1(core::int* i) → void;
+  abstract set property2(core::String* i) → void;
+  abstract set property3(core::int* i) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D3 extends core::Object implements self::D1, self::D2 {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D4 extends core::Object implements self::D3 {
+  synthetic constructor •() → self::D4*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension<T extends core::num*, S extends T* = core::num*> on core::int* {
+  get property1 = self::Extension|get#property1;
+  get property2a = self::Extension|get#property2a;
+  get property2b = self::Extension|get#property2b;
+  get property3 = self::Extension|get#property3;
+  get property4 = self::Extension|get#property4;
+  get property5a = self::Extension|get#property5a;
+  get property5b = self::Extension|get#property5b;
+  get property6 = self::Extension|get#property6;
+  static get property7 = get self::Extension|property7;
+  static get property8a = get self::Extension|property8a;
+  static get property8b = get self::Extension|property8b;
+  static get property9 = get self::Extension|property9;
+  set property1 = self::Extension|set#property1;
+  set property2a = self::Extension|set#property2a;
+  set property2b = self::Extension|set#property2b;
+  set property3 = self::Extension|set#property3;
+  set property4 = self::Extension|set#property4;
+  set property5a = self::Extension|set#property5a;
+  set property5b = self::Extension|set#property5b;
+  set property6 = self::Extension|set#property6;
+  static set property7 = set self::Extension|property7;
+  static set property8a = set self::Extension|property8a;
+  static set property8b = set self::Extension|property8b;
+  static set property9 = set self::Extension|property9;
+}
+static method Extension|get#property1<T extends core::num*, S extends self::Extension|get#property1::T* = core::num*>(lowered final core::int* #this) → core::int*
+  return 0;
+static method Extension|set#property1<T extends core::num*, S extends self::Extension|set#property1::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
+static method Extension|get#property2a<T extends core::num*, S extends self::Extension|get#property2a::T* = core::num*>(lowered final core::int* #this) → core::num*
+  return 0;
+static method Extension|set#property2a<T extends core::num*, S extends self::Extension|set#property2a::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
+static method Extension|get#property2b<T extends core::num*, S extends self::Extension|get#property2b::T* = core::num*>(lowered final core::int* #this) → core::int*
+  return 0;
+static method Extension|set#property2b<T extends core::num*, S extends self::Extension|set#property2b::T* = core::num*>(lowered final core::int* #this, core::num* i) → void {}
+static method Extension|get#property3<T extends core::num*, S extends self::Extension|get#property3::T* = core::num*>(lowered final core::int* #this) → core::String*
+  return "";
+static method Extension|set#property3<T extends core::num*, S extends self::Extension|set#property3::T* = core::num*>(lowered final core::int* #this, core::int* i) → void {}
+static method Extension|get#property4<T extends core::num*, S extends self::Extension|get#property4::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property4::S*
+  return invalid-expression "pkg/front_end/testcases/general/getter_vs_setter_type.dart:133:22: Error: A value of type 'int' can't be assigned to a variable of type 'S'.
+  S get property4 => 0; // ok
+                     ^" in 0 as{TypeError} Never;
+static method Extension|set#property4<T extends core::num*, S extends self::Extension|set#property4::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property4::S* i) → void {}
+static method Extension|get#property5a<T extends core::num*, S extends self::Extension|get#property5a::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5a::S*
+  return invalid-expression "pkg/front_end/testcases/general/getter_vs_setter_type.dart:136:23: Error: A value of type 'int' can't be assigned to a variable of type 'S'.
+  S get property5a => 0; // ok
+                      ^" in 0 as{TypeError} Never;
+static method Extension|set#property5a<T extends core::num*, S extends self::Extension|set#property5a::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5a::T* i) → void {}
+static method Extension|get#property5b<T extends core::num*, S extends self::Extension|get#property5b::T* = core::num*>(lowered final core::int* #this) → self::Extension|get#property5b::T*
+  return invalid-expression "pkg/front_end/testcases/general/getter_vs_setter_type.dart:139:23: Error: A value of type 'int' can't be assigned to a variable of type 'T'.
+  T get property5b => 0; // ok
+                      ^" in 0 as{TypeError} Never;
+static method Extension|set#property5b<T extends core::num*, S extends self::Extension|set#property5b::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property5b::S* i) → void {}
+static method Extension|get#property6<T extends core::num*, S extends self::Extension|get#property6::T* = core::num*>(lowered final core::int* #this) → core::String*
+  return "";
+static method Extension|set#property6<T extends core::num*, S extends self::Extension|set#property6::T* = core::num*>(lowered final core::int* #this, self::Extension|set#property6::S* i) → void {}
+static get Extension|property7() → core::int*
+  return 0;
+static set Extension|property7(core::int* value) → void {}
+static get Extension|property8a() → core::int*
+  return 0;
+static set Extension|property8a(core::num* value) → void {}
+static get Extension|property8b() → core::num*
+  return 0;
+static set Extension|property8b(core::int* value) → void {}
+static get Extension|property9() → core::num*
+  return 0;
+static set Extension|property9(core::String* value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.weak.modular.expect b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.weak.modular.expect
new file mode 100644
index 0000000..5744ee3
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/having_part_with_part_and_annotation_lib1.dart:10:6: Error: A file that's a part of a library can't have parts itself.
+// Try moving the 'part' declaration to the containing library.
+// part 'having_part_with_part_and_annotation_lib2.dart';
+//      ^
+// pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart: Context: This is the containing library.
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+part having_part_with_part_and_annotation_lib1.dart;
+static const field core::int* Foo = #C1;
+static const field core::int* Bar = #C2 /* from org-dartlang-testcase:///having_part_with_part_and_annotation_lib1.dart */;
+static method fromMain() → void {}
+static method main() → dynamic {}
+static method /* from org-dartlang-testcase:///having_part_with_part_and_annotation_lib1.dart */ fromLib1() → void {}
+
+constants  {
+  #C1 = 42
+  #C2 = 43
+}
diff --git a/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.weak.modular.expect b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.weak.modular.expect
new file mode 100644
index 0000000..9054021
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart:6:6: Error: The language version override has to be the same in the library and its part(s).
+// part 'having_part_with_parts_and_annotation_lib1.dart';
+//      ^
+// pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart:4:1: Context: This is language version annotation in the library.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/having_part_with_parts_and_annotation_lib1.dart:4:6: Error: A file that's a part of a library can't have parts itself.
+// Try moving the 'part' declaration to the containing library.
+// part 'having_part_with_parts_and_annotation_lib2.dart';
+//      ^
+// pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
+//
+// pkg/front_end/testcases/general/having_part_with_parts_and_annotation_lib1.dart:6:6: Error: A file that's a part of a library can't have parts itself.
+// Try moving the 'part' declaration to the containing library.
+// part 'having_part_with_parts_and_annotation_lib2.dart';
+//      ^
+// pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+part having_part_with_parts_and_annotation_lib1.dart;
+static const field core::int* Foo = #C1;
+static const field core::int* Bar = #C2 /*isNonNullableByDefault, from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static const field core::int* Baz = #C3 /*isNonNullableByDefault, from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static method fromMain() → void {}
+static method main() → dynamic {}
+static method /*isNonNullableByDefault, from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */ fromLib1() → void {}
+
+constants  {
+  #C1 = 42
+  #C2 = 43
+  #C3 = 44
+}
diff --git a/pkg/front_end/testcases/general/hello.dart.weak.modular.expect b/pkg/front_end/testcases/general/hello.dart.weak.modular.expect
new file mode 100644
index 0000000..fea7b39
--- /dev/null
+++ b/pkg/front_end/testcases/general/hello.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("Hello, World!");
+}
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect
new file mode 100644
index 0000000..3c3d062
--- /dev/null
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect
@@ -0,0 +1,325 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
+//  - A1.extendedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class A6 extends A1 implements A1 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:7:8: Context: 'A1.extendedInterfaceMember' is defined here.
+//   void extendedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:41:7: Error: The non-abstract class 'B5' is missing implementations for these members:
+//  - B1.twiceInterfaceMember
+//  - B2.twiceInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class B5 extends B4 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:43:7: Error: The non-abstract class 'B6' is missing implementations for these members:
+//  - B1.twiceInterfaceMember
+//  - B2.twiceInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class B6 extends B3 implements B1, B2 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:27:8: Context: 'B1.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:32:8: Context: 'B2.twiceInterfaceMember' is defined here.
+//   void twiceInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:57:7: Error: The non-abstract class 'C4' is missing implementations for these members:
+//  - C1.mixedInAndImplementedInterfaceMember
+//  - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C4 extends C3 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:59:7: Error: The non-abstract class 'C5' is missing implementations for these members:
+//  - C1.mixedInAndImplementedInterfaceMember
+//  - C2.mixedInAndImplementedInterfaceMember
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C5 with C1 implements C2 {}
+//       ^^
+// pkg/front_end/testcases/general/hierarchy.dart:47:8: Context: 'C1.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/hierarchy.dart:52:8: Context: 'C2.mixedInAndImplementedInterfaceMember' is defined here.
+//   void mixedInAndImplementedInterfaceMember() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  method extendedClassMember() → void {}
+  abstract method extendedInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A2 extends core::Object {
+  synthetic constructor •() → self::A2*
+    : super core::Object::•()
+    ;
+  method mixedInClassMember() → void {}
+  abstract method mixedInInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A3&A1&A2 = self::A1 with self::A2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A3&A1&A2*
+    : super self::A1::•()
+    ;
+  mixin-super-stub method mixedInClassMember() → void
+    return super.{self::A2::mixedInClassMember}();
+  abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A3 extends self::_A3&A1&A2 {
+  synthetic constructor •() → self::A3*
+    : super self::_A3&A1&A2::•()
+    ;
+  method declaredClassMember() → void {}
+  abstract method declaredInterfaceMember() → void;
+}
+abstract class A4 = self::A1 with self::A2 {
+  synthetic constructor •() → self::A4*
+    : super self::A1::•()
+    ;
+  mixin-super-stub method mixedInClassMember() → void
+    return super.{self::A2::mixedInClassMember}();
+  abstract mixin-stub method mixedInInterfaceMember() → void; -> self::A2::mixedInInterfaceMember
+}
+abstract class A5 extends core::Object implements self::A1 {
+  synthetic constructor •() → self::A5*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A6 extends self::A1 implements self::A1 {
+  synthetic constructor •() → self::A6*
+    : super self::A1::•()
+    ;
+}
+abstract class B1 extends core::Object {
+  synthetic constructor •() → self::B1*
+    : super core::Object::•()
+    ;
+  method twiceInterfaceMember() → void {}
+  method extendedAndImplementedMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B2 extends core::Object {
+  synthetic constructor •() → self::B2*
+    : super core::Object::•()
+    ;
+  method twiceInterfaceMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B3 extends core::Object {
+  synthetic constructor •() → self::B3*
+    : super core::Object::•()
+    ;
+  method extendedAndImplementedMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B4 extends self::B3 implements self::B1, self::B2 {
+  synthetic constructor •() → self::B4*
+    : super self::B3::•()
+    ;
+}
+class B5 extends self::B4 {
+  synthetic constructor •() → self::B5*
+    : super self::B4::•()
+    ;
+}
+class B6 extends self::B3 implements self::B1, self::B2 {
+  synthetic constructor •() → self::B6*
+    : super self::B3::•()
+    ;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → self::C1*
+    : super core::Object::•()
+    ;
+  method mixedInAndImplementedClassMember() → void {}
+  abstract method mixedInAndImplementedInterfaceMember() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  method mixedInAndImplementedClassMember() → void {}
+  method mixedInAndImplementedInterfaceMember() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C3&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C3&Object&C1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method mixedInAndImplementedClassMember() → void
+    return super.{self::C1::mixedInAndImplementedClassMember}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+abstract class C3 extends self::_C3&Object&C1 implements self::C2 {
+  synthetic constructor •() → self::C3*
+    : super self::_C3&Object&C1::•()
+    ;
+}
+class C4 extends self::C3 {
+  synthetic constructor •() → self::C4*
+    : super self::C3::•()
+    ;
+}
+abstract class _C5&Object&C1 = core::Object with self::C1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C5&Object&C1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method mixedInAndImplementedClassMember() → void
+    return super.{self::C1::mixedInAndImplementedClassMember}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract mixin-stub method mixedInAndImplementedInterfaceMember() → void; -> self::C1::mixedInAndImplementedInterfaceMember
+}
+class C5 extends self::_C5&Object&C1 implements self::C2 {
+  synthetic constructor •() → self::C5*
+    : super self::_C5&Object&C1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.modular.expect b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.modular.expect
new file mode 100644
index 0000000..d1b803d
--- /dev/null
+++ b/pkg/front_end/testcases/general/identical_instantiated_function_tearoffs.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static field (core::int) → core::int implicitInstantiation = #C2;
+static const field (core::int) → core::int implicitConstInstantiation = #C2;
+static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
+  return t;
+static method create<T extends core::Object? = dynamic>() → (self::create::T%) → self::create::T%
+  return #C1<self::create::T%>;
+static method main() → dynamic {
+  self::expect(true, core::identical(self::implicitInstantiation, self::implicitInstantiation));
+  self::expect(true, core::identical(self::implicitInstantiation, #C2));
+  self::expect(false, core::identical(self::implicitInstantiation, self::create<core::int>()));
+  self::expect(true, core::identical(#C2, self::implicitInstantiation));
+  self::expect(true, core::identical(#C2, #C2));
+  self::expect(false, core::identical(#C2, self::create<core::int>()));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = static-tearoff self::id
+  #C2 = instantiation #C1 <core::int*>
+}
diff --git a/pkg/front_end/testcases/general/if_null_in_cascade.dart.weak.modular.expect b/pkg/front_end/testcases/general/if_null_in_cascade.dart.weak.modular.expect
new file mode 100644
index 0000000..9873ac0
--- /dev/null
+++ b/pkg/front_end/testcases/general/if_null_in_cascade.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  method method() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::Class* a;
+  self::Class* b = new self::Class::•();
+  let final self::Class* #t1 = let final self::Class* #t2 = a in #t2 == null ?{self::Class*} b : #t2 in block {
+    #t1.{self::Class::method}(){() →* dynamic};
+  } =>#t1;
+}
diff --git a/pkg/front_end/testcases/general/if_null_in_list_literal.dart.weak.modular.expect b/pkg/front_end/testcases/general/if_null_in_list_literal.dart.weak.modular.expect
new file mode 100644
index 0000000..e781dcd
--- /dev/null
+++ b/pkg/front_end/testcases/general/if_null_in_list_literal.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Object* a;
+  core::Object* b;
+  return <core::Object*>[let final core::Object* #t1 = a in #t1 == null ?{core::Object*} b : #t1];
+}
diff --git a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.modular.expect b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.modular.expect
new file mode 100644
index 0000000..cc17e25
--- /dev/null
+++ b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  core::Object* a;
+  core::Object* b;
+  return block {
+    final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>();
+    #t1.{core::Set::add}{Invariant}(let final core::Object* #t2 = a in #t2 == null ?{core::Object*} b : #t2){(core::Object*) →* core::bool*};
+  } =>#t1;
+}
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.weak.modular.expect b/pkg/front_end/testcases/general/ignore_function.dart.weak.modular.expect
new file mode 100644
index 0000000..004e6cc
--- /dev/null
+++ b/pkg/front_end/testcases/general/ignore_function.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ignore_function.dart:18:7: Error: 'Function' is a built-in identifier, could not used as a class name.
+// class Function {
+//       ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic other) → core::bool*
+    return false;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::Function {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic other) → core::bool*
+    return false;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Function extends core::Object {
+  synthetic constructor •() → self::Function*
+    : super core::Object::•()
+    ;
+  operator ==(core::Object* other) → core::bool*
+    return false;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.weak.modular.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.weak.modular.expect
new file mode 100644
index 0000000..96419b3
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/general/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
+  core::print(x.{core::Object::runtimeType}{core::Type*});
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
+}
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.weak.modular.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.weak.modular.expect
new file mode 100644
index 0000000..63bcf5a
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function f() → void {}
+  core::print(let final () →* Null f = () → Null {} in f);
+}
diff --git a/pkg/front_end/testcases/general/implement_semi_stub.dart.weak.modular.expect b/pkg/front_end/testcases/general/implement_semi_stub.dart.weak.modular.expect
new file mode 100644
index 0000000..e8b7608
--- /dev/null
+++ b/pkg/front_end/testcases/general/implement_semi_stub.dart.weak.modular.expect
@@ -0,0 +1,222 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:52:23: Error: The parameter 'a' of the method 'Class1.method1' has type 'double', which does not match the corresponding type, 'int', in the overridden method, 'Class.method1'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   void method1(double a) {} // error
+//                       ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:39:8: Context: This is the overridden method ('method1').
+//   void method1(covariant int a);
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:53:23: Error: The parameter 'b' of the method 'Class1.method2' has type 'double', which does not match the corresponding type, 'int', in the overridden method, 'Super.method2'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   void method2(double b) {} // error
+//                       ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:7:8: Context: This is the overridden method ('method2').
+//   void method2(int b) {}
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:54:23: Error: The parameter 'a' of the method 'Class1.method3' has type 'double', which does not match the corresponding type, 'int', in the overridden method, 'Class.method3'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   void method3(double a, double b) {} // error
+//                       ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:41:8: Context: This is the overridden method ('method3').
+//   void method3(covariant int a, num b);
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:54:33: Error: The parameter 'b' of the method 'Class1.method3' has type 'double', which does not match the corresponding type, 'int', in the overridden method, 'Super.method3'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   void method3(double a, double b) {} // error
+//                                 ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:8:8: Context: This is the overridden method ('method3').
+//   void method3(num a, int b) {}
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:55:33: Error: The parameter 'a' of the method 'Class1.method4' has type 'double', which does not match the corresponding type, 'num', in the overridden method, 'Super.method4'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void method4({required double a}) {} // error
+//                                 ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:9:8: Context: This is the overridden method ('method4').
+//   void method4({required num a}) {}
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:56:33: Error: The parameter 'b' of the method 'Class1.method5' has type 'double', which does not match the corresponding type, 'int', in the overridden method, 'Super.method5'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   void method5({required double b}) {} // error
+//                                 ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:10:8: Context: This is the overridden method ('method5').
+//   void method5({required int b}) {}
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:58:23: Error: The parameter 'a' of the method 'Class1.method7' has type 'Set<T>', which does not match the corresponding type, 'List<T>', in the overridden method, 'Class.method7'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// Change to a supertype of 'List<T>', or, for a covariant parameter, a subtype.
+//   void method7(Set<T> a) {} // error
+//                       ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:42:8: Context: This is the overridden method ('method7').
+//   void method7(covariant List<T> a);
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:59:23: Error: The parameter 'b' of the method 'Class1.method8' has type 'Set<T>', which does not match the corresponding type, 'List<T>', in the overridden method, 'Super.method8'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// Change to a supertype of 'List<T>', or, for a covariant parameter, a subtype.
+//   void method8(Set<T> b) {} // error
+//                       ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:13:8: Context: This is the overridden method ('method8').
+//   void method8(List<T> b) {}
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:60:23: Error: The parameter 'a' of the method 'Class1.method9' has type 'Set<T>', which does not match the corresponding type, 'List<T>', in the overridden method, 'Class.method9'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// Change to a supertype of 'List<T>', or, for a covariant parameter, a subtype.
+//   void method9(Set<T> a, Set<T> b) {} // error
+//                       ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:44:8: Context: This is the overridden method ('method9').
+//   void method9(covariant List<T> a, Iterable<T> b);
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:60:33: Error: The parameter 'b' of the method 'Class1.method9' has type 'Set<T>', which does not match the corresponding type, 'List<T>', in the overridden method, 'Super.method9'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// Change to a supertype of 'List<T>', or, for a covariant parameter, a subtype.
+//   void method9(Set<T> a, Set<T> b) {} // error
+//                                 ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:14:8: Context: This is the overridden method ('method9').
+//   void method9(Iterable<T> a, List<T> b) {}
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:61:34: Error: The parameter 'a' of the method 'Class1.method10' has type 'Set<T>', which does not match the corresponding type, 'Iterable<T>', in the overridden method, 'Super.method10'.
+//  - 'Set' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+// Change to a supertype of 'Iterable<T>', or, for a covariant parameter, a subtype.
+//   void method10({required Set<T> a}) {} // error
+//                                  ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:15:8: Context: This is the overridden method ('method10').
+//   void method10({required Iterable<T> a}) {}
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:62:34: Error: The parameter 'b' of the method 'Class1.method11' has type 'Set<T>', which does not match the corresponding type, 'List<T>', in the overridden method, 'Super.method11'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// Change to a supertype of 'List<T>', or, for a covariant parameter, a subtype.
+//   void method11({required Set<T> b}) {} // error
+//                                  ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:16:8: Context: This is the overridden method ('method11').
+//   void method11({required List<T> b}) {}
+//        ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:64:27: Error: The parameter 'a' of the method 'Class1.setter1' has type 'double', which does not match the corresponding type, 'int', in the overridden method, 'Class.setter1'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   void set setter1(double a) {} // error
+//                           ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:45:12: Context: This is the overridden method ('setter1').
+//   void set setter1(covariant int a);
+//            ^
+//
+// pkg/front_end/testcases/general/implement_semi_stub.dart:66:27: Error: The parameter 'a' of the method 'Class1.setter3' has type 'Set<T>', which does not match the corresponding type, 'List<T>', in the overridden method, 'Class.setter3'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// Change to a supertype of 'List<T>', or, for a covariant parameter, a subtype.
+//   void set setter3(Set<T> a) {} // error
+//                           ^
+// pkg/front_end/testcases/general/implement_semi_stub.dart:47:12: Context: This is the overridden method ('setter3').
+//   void set setter3(covariant List<T> a);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::T%>
+    : super core::Object::•()
+    ;
+  method method1(core::num a) → void {}
+  method method2(core::int b) → void {}
+  method method3(core::num a, core::int b) → void {}
+  method method4({required core::num a = #C1}) → void {}
+  method method5({required core::int b = #C1}) → void {}
+  method method7(covariant-by-class core::Iterable<self::Super::T%> a) → void {}
+  method method8(covariant-by-class core::List<self::Super::T%> b) → void {}
+  method method9(covariant-by-class core::Iterable<self::Super::T%> a, covariant-by-class core::List<self::Super::T%> b) → void {}
+  method method10({required covariant-by-class core::Iterable<self::Super::T%> a = #C1}) → void {}
+  method method11({required covariant-by-class core::List<self::Super::T%> b = #C1}) → void {}
+  set setter1(core::num a) → void {}
+  set setter3(covariant-by-class core::Iterable<self::Super::T%> a) → void {}
+}
+abstract class Interface<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Interface<self::Interface::T%>
+    : super core::Object::•()
+    ;
+  method method2(covariant-by-declaration core::num b) → void {}
+  method method3(core::num a, covariant-by-declaration core::num b) → void {}
+  method method5({required core::int b = #C1}) → void {}
+  method method8(covariant-by-declaration covariant-by-class core::Iterable<self::Interface::T%> b) → void {}
+  method method9(covariant-by-class core::Iterable<self::Interface::T%> a, covariant-by-declaration covariant-by-class core::Iterable<self::Interface::T%> b) → void {}
+  method method11({required covariant-by-class core::List<self::Interface::T%> b = #C1}) → void {}
+}
+class Class<T extends core::Object? = dynamic> extends self::Super<self::Class::T%> implements self::Interface<self::Class::T%> {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method1(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method1}(a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::num) → void */ method2(covariant-by-declaration core::int b) → void
+    return super.{self::Super::method2}(b);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int, core::num) → void */ method3(covariant-by-declaration core::num a, covariant-by-declaration core::int b) → void
+    return super.{self::Super::method3}(a, b);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::List<self::Class::T%>) → void */ method7(covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%> a) → void
+    return super.{self::Super::method7}(a);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::Iterable<self::Class::T%>) → void */ method8(covariant-by-declaration covariant-by-class core::List<self::Class::T%> b) → void
+    return super.{self::Super::method8}(b);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::List<self::Class::T%>, core::Iterable<self::Class::T%>) → void */ method9(covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%> a, covariant-by-declaration covariant-by-class core::List<self::Class::T%> b) → void
+    return super.{self::Super::method9}(a, b);
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter1(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter1} = a;
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::List<self::Class::T%>) → void */ setter3(covariant-by-declaration covariant-by-class core::Iterable<self::Class::T%> a) → void
+    return super.{self::Super::setter3} = a;
+}
+class Class1<T extends core::Object? = dynamic> extends core::Object implements self::Class<self::Class1::T%> {
+  synthetic constructor •() → self::Class1<self::Class1::T%>
+    : super core::Object::•()
+    ;
+  method method1(covariant-by-declaration core::double a) → void {}
+  method method2(covariant-by-declaration core::double b) → void {}
+  method method3(covariant-by-declaration core::double a, covariant-by-declaration core::double b) → void {}
+  method method4({required core::double a = #C1}) → void {}
+  method method5({required core::double b = #C1}) → void {}
+  method method7(covariant-by-declaration covariant-by-class core::Set<self::Class1::T%> a) → void {}
+  method method8(covariant-by-declaration covariant-by-class core::Set<self::Class1::T%> b) → void {}
+  method method9(covariant-by-declaration covariant-by-class core::Set<self::Class1::T%> a, covariant-by-declaration covariant-by-class core::Set<self::Class1::T%> b) → void {}
+  method method10({required covariant-by-class core::Set<self::Class1::T%> a = #C1}) → void {}
+  method method11({required covariant-by-class core::Set<self::Class1::T%> b = #C1}) → void {}
+  set setter1(covariant-by-declaration core::double a) → void {}
+  set setter3(covariant-by-declaration covariant-by-class core::Set<self::Class1::T%> a) → void {}
+}
+abstract class Interface2<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Interface2<self::Interface2::T%>
+    : super core::Object::•()
+    ;
+  abstract method method1(core::int a) → void;
+  abstract method method2(core::int b) → void;
+  abstract method method3(core::int a, core::int b) → void;
+  abstract method method7(covariant-by-class core::List<self::Interface2::T%> a) → void;
+  abstract method method8(covariant-by-class core::List<self::Interface2::T%> b) → void;
+  abstract method method9(covariant-by-class core::List<self::Interface2::T%> a, covariant-by-class core::List<self::Interface2::T%> b) → void;
+  abstract set setter1(core::int a) → void;
+  abstract set setter3(covariant-by-class core::List<self::Interface2::T%> a) → void;
+}
+abstract class Class2<T extends core::Object? = dynamic> extends core::Object implements self::Class<self::Class2::T%>, self::Interface2<self::Class2::T%> {
+  synthetic constructor •() → self::Class2<self::Class2::T%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..93d939a
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object /*hasConstConstructor*/  {
+  static const field core::int* constField = #C1;
+  const constructor •(dynamic x) → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* constTopLevelField = #C2;
+static method main() → dynamic {
+  new self::C::•(#C1);
+  new self::C::•(#C2);
+}
+
+constants  {
+  #C1 = 87
+  #C2 = 42
+}
diff --git a/pkg/front_end/testcases/general/implicit_constructor_02.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_constructor_02.dart.weak.modular.expect
new file mode 100644
index 0000000..febd66a
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_constructor_02.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::bool* v1;
+  field core::num* v2;
+  constructor •(core::bool* v1, core::num* v2) → self::A*
+    : self::A::v1 = v1, self::A::v2 = v2, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M1 extends core::Object {
+  field core::num* v2 = 1.{core::int::unary-}(){() →* core::int*};
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C = self::A with self::M1 {
+  synthetic constructor •(core::bool* v1, core::num* v2) → self::C*
+    : super self::A::•(v1, v2)
+    ;
+  mixin-super-stub get v2() → core::num*
+    return super.{self::M1::v2};
+  mixin-super-stub set v2(core::num* value) → void
+    return super.{self::M1::v2} = value;
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•(true, 2);
+  self::expect(true, c.{self::A::v1}{core::bool*});
+  self::expect(1.{core::int::unary-}(){() →* core::int*}, c.{self::C::v2}{core::num*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/general/implicit_covariance.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_covariance.dart.weak.modular.expect
new file mode 100644
index 0000000..3fd3297
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_covariance.dart.weak.modular.expect
@@ -0,0 +1,71 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant-by-class self::A::T* x) → dynamic;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B<T extends core::Object* = dynamic> extends core::Object implements self::A<self::B::T*> {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _D&C&B<T extends core::num*> = self::C with self::B<self::_D&C&B::T*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&C&B<self::_D&C&B::T*>*
+    : super self::C::•()
+    ;
+  forwarding-stub method foo(covariant-by-class core::num* x) → dynamic
+    return super.{self::C::foo}(x);
+}
+class D<T extends core::num*> extends self::_D&C&B<self::D::T*> {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super self::_D&C&B::•()
+    ;
+}
+class E<T extends core::num*> = self::C with self::B<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super self::C::•()
+    ;
+  forwarding-stub method foo(covariant-by-class core::num* x) → dynamic
+    return super.{self::C::foo}(x);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/implicit_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..b226b4e
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_instantiation.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_instantiation.dart:18:25: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+//   int Function(int) f = alias;
+//                         ^
+//
+// pkg/front_end/testcases/general/implicit_instantiation.dart:20:7: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+//   g = alias;
+//       ^
+//
+// pkg/front_end/testcases/general/implicit_instantiation.dart:21:21: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+//   int Function(int) h = c;
+//                     ^
+//
+// pkg/front_end/testcases/general/implicit_instantiation.dart:22:3: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+//   g = c;
+//   ^
+//
+// pkg/front_end/testcases/general/implicit_instantiation.dart:23:10: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'int Function(int)'.
+//   method(alias);
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>(self::Class::call::T% t) → self::Class::call::T%
+    return t;
+}
+static field <T extends core::Object? = dynamic>(T%) → T% alias = #C1;
+static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
+  return t;
+static method method((core::int) → core::int f) → dynamic {}
+static method test() → dynamic {
+  self::Class c = new self::Class::•();
+  (core::int) → core::int f = invalid-expression "pkg/front_end/testcases/general/implicit_instantiation.dart:18:25: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+  int Function(int) f = alias;
+                        ^" in self::alias as{TypeError,ForNonNullableByDefault} (core::int) → core::int;
+  (core::int) → core::int g;
+  g = invalid-expression "pkg/front_end/testcases/general/implicit_instantiation.dart:20:7: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+  g = alias;
+      ^" in self::alias as{TypeError,ForNonNullableByDefault} (core::int) → core::int;
+  (core::int) → core::int h = invalid-expression "pkg/front_end/testcases/general/implicit_instantiation.dart:21:21: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+  int Function(int) h = c;
+                    ^" in (let final self::Class #t1 = c in #t1 == null ?{<T extends core::Object? = dynamic>(T%) → T%} null : #t1.{self::Class::call}{<T extends core::Object? = dynamic>(T%) → T%}) as{TypeError,ForNonNullableByDefault} (core::int) → core::int;
+  g = invalid-expression "pkg/front_end/testcases/general/implicit_instantiation.dart:22:3: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+  g = c;
+  ^" in (let final self::Class #t2 = c in #t2 == null ?{<T extends core::Object? = dynamic>(T%) → T%} null : #t2.{self::Class::call}{<T extends core::Object? = dynamic>(T%) → T%}) as{TypeError,ForNonNullableByDefault} (core::int) → core::int;
+  self::method(invalid-expression "pkg/front_end/testcases/general/implicit_instantiation.dart:23:10: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'int Function(int)'.
+  method(alias);
+         ^" in self::alias as{TypeError,ForNonNullableByDefault} (core::int) → core::int);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::id
+}
diff --git a/pkg/front_end/testcases/general/implicit_new.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_new.dart.weak.modular.expect
new file mode 100644
index 0000000..908fc59
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_new.dart.weak.modular.expect
@@ -0,0 +1,106 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_new.dart:18:18: Error: Couldn't find constructor 'Bar'.
+//   var y = prefix.Bar();
+//                  ^^^
+//
+// pkg/front_end/testcases/general/implicit_new.dart:19:10: Error: Couldn't find constructor 'Bar'.
+//   prefix.Bar();
+//          ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///implicit_new.dart" as prefix;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object {
+  constructor named() → self::Bar*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class IndexTester extends core::Object {
+  synthetic constructor •() → self::IndexTester*
+    : super core::Object::•()
+    ;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic _a, dynamic _b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method testNSM() → dynamic {
+  invalid-type y = invalid-expression "pkg/front_end/testcases/general/implicit_new.dart:18:18: Error: Couldn't find constructor 'Bar'.
+  var y = prefix.Bar();
+                 ^^^";
+  invalid-expression "pkg/front_end/testcases/general/implicit_new.dart:19:10: Error: Couldn't find constructor 'Bar'.
+  prefix.Bar();
+         ^^^";
+}
+static method f(dynamic x) → dynamic
+  return x;
+static method main() → dynamic {
+  self::Foo* x = new self::Foo::•();
+  x = new self::Foo::•();
+  self::Bar* z = new self::Bar::named();
+  z = new self::Bar::named();
+  self::f(new self::Foo::•());
+  self::f(new self::Foo::•());
+  self::f(new self::Bar::named());
+  self::f(new self::Bar::named());
+  core::List<core::Object*>* l = <core::Object*>[new self::Foo::•(), new self::Bar::named()];
+  l = <core::Object*>[new self::Foo::•(), new self::Bar::named()];
+  core::Map<core::String*, core::Object*>* m = <core::String*, core::Object*>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  m = <core::String*, core::Object*>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  self::IndexTester* i = new self::IndexTester::•();
+  i.{self::IndexTester::[]}(new self::Foo::•()){(dynamic) →* dynamic};
+  i.{self::IndexTester::[]}(new self::Foo::•()){(dynamic) →* dynamic};
+  i.{self::IndexTester::[]}(new self::Bar::named()){(dynamic) →* dynamic};
+  i.{self::IndexTester::[]}(new self::Bar::named()){(dynamic) →* dynamic};
+  i.{self::IndexTester::[]=}(new self::Foo::•(), null){(dynamic, dynamic) →* void};
+  i.{self::IndexTester::[]=}(new self::Foo::•(), null){(dynamic, dynamic) →* void};
+  i.{self::IndexTester::[]=}(new self::Bar::named(), null){(dynamic, dynamic) →* void};
+  i.{self::IndexTester::[]=}(new self::Bar::named(), null){(dynamic, dynamic) →* void};
+  new self::Foo::•().{self::Foo::+}(new self::Bar::named()){(dynamic) →* dynamic};
+  new self::Foo::•().{self::Foo::+}(new self::Bar::named()){(dynamic) →* dynamic};
+  new self::Bar::named().{self::Bar::+}(new self::Foo::•()){(dynamic) →* dynamic};
+  new self::Bar::named().{self::Bar::+}(new self::Foo::•()){(dynamic) →* dynamic};
+}
diff --git a/pkg/front_end/testcases/general/implicit_new2.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_new2.dart.weak.modular.expect
new file mode 100644
index 0000000..a487595
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_new2.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field void voidValue = null;
+static method main() → void {
+  self::test1();
+  self::test2();
+  self::test3();
+  self::test4();
+  self::test5();
+  self::test6();
+}
+static method test1() → FutureOr<FutureOr<void>> {}
+static method test2() → FutureOr<FutureOr<void>> {
+  return asy::Future::value<void>(0);
+}
+static method test3() → FutureOr<FutureOr<void>> {
+  return null as{ForNonNullableByDefault} FutureOr<void>;
+}
+static method test4() → FutureOr<FutureOr<void>> {
+  return asy::Future::value<asy::Future<void>>(asy::Future::value<void>(null));
+}
+static method test5() → FutureOr<FutureOr<void>> {
+  return 42;
+}
+static method test6() → FutureOr<FutureOr<void>> {
+  return asy::Future::value<FutureOr<void>?>(42);
+}
+static method test() → FutureOr<FutureOr<void>> {
+  return asy::Future::value<asy::Future<asy::Future<void>>>(asy::Future::value<asy::Future<void>>(asy::Future::value<void>(null)));
+}
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.weak.modular.expect
new file mode 100644
index 0000000..ef54b52
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class ImplicitScopeTest extends core::Object {
+  synthetic constructor •() → self::ImplicitScopeTest*
+    : super core::Object::•()
+    ;
+  static method alwaysTrue() → core::bool* {
+    return 1.{core::num::+}(1){(core::num*) →* core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 2;
+  }
+  static method testMain() → dynamic {
+    core::String* a = "foo";
+    dynamic b;
+    if(self::ImplicitScopeTest::alwaysTrue()) {
+      core::String* a = "bar";
+    }
+    else {
+      core::String* b = a;
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    while (!self::ImplicitScopeTest::alwaysTrue()) {
+      core::String* a = "bar";
+      core::String* b = "baz";
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    for (core::int* i = 0; i.{core::num::<}(10){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+      core::String* a = "bar";
+      core::String* b = "baz";
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    do {
+      core::String* a = "bar";
+      core::String* b = "baz";
+    }
+    while ("black" =={core::String::==}{(core::Object*) →* core::bool*} "white")
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::ImplicitScopeTest::testMain();
+}
diff --git a/pkg/front_end/testcases/general/implicit_super_call.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_super_call.dart.weak.modular.expect
new file mode 100644
index 0000000..f6e3ccb
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_super_call.dart.weak.modular.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:67:5: Error: Cannot invoke `super` because it declares 'call' to be something other than a method.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//     super(0); // error
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:81:5: Error: Cannot invoke `super` because it declares 'call' to be something other than a method.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//     super(0); // error
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:95:5: Error: Superclass has no method named 'call'.
+//     super(0); // error
+//     ^^^^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:96:11: Error: Superclass has no method named 'call'.
+//     super.call(0); // error
+//           ^^^^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:104:5: Error: Superclass has no method named 'call'.
+//     super(); // error
+//     ^^^^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:105:11: Error: Superclass has no method named 'call'.
+//     super.call(); // error
+//           ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+  synthetic constructor •() → self::Super1
+    : super core::Object::•()
+    ;
+  method call() → void {}
+}
+class Class1 extends self::Super1 {
+  synthetic constructor •() → self::Class1
+    : super self::Super1::•()
+    ;
+  method method() → void {
+    super.{self::Super1::call}();
+    super.{self::Super1::call}();
+  }
+}
+class Super2 extends core::Object {
+  synthetic constructor •() → self::Super2
+    : super core::Object::•()
+    ;
+  method call(core::int a, [core::int? b = #C1]) → core::int
+    return a;
+}
+class Class2 extends self::Super2 {
+  synthetic constructor •() → self::Class2
+    : super self::Super2::•()
+    ;
+  method method() → void {
+    super.{self::Super2::call}(0);
+    super.{self::Super2::call}(0, 1);
+    super.{self::Super2::call}(0);
+    super.{self::Super2::call}(0, 1);
+  }
+}
+class Super3 extends core::Object {
+  synthetic constructor •() → self::Super3
+    : super core::Object::•()
+    ;
+  method call(core::int a, {core::int? b = #C1, core::int? c = #C1}) → core::int
+    return a;
+}
+class Class3 extends self::Super3 {
+  synthetic constructor •() → self::Class3
+    : super self::Super3::•()
+    ;
+  method method() → void {
+    super.{self::Super3::call}(0);
+    super.{self::Super3::call}(0, b: 1);
+    super.{self::Super3::call}(0, c: 1);
+    super.{self::Super3::call}(0, b: 1, c: 2);
+    super.{self::Super3::call}(0, c: 1, b: 2);
+    super.{self::Super3::call}(0);
+    super.{self::Super3::call}(0, b: 1);
+    super.{self::Super3::call}(0, c: 1);
+    super.{self::Super3::call}(0, b: 1, c: 2);
+    super.{self::Super3::call}(0, c: 1, b: 2);
+  }
+}
+class Super4 extends core::Object {
+  synthetic constructor •() → self::Super4
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>(self::Super4::call::T% a) → self::Super4::call::T%
+    return a;
+}
+class Class4 extends self::Super4 {
+  synthetic constructor •() → self::Class4
+    : super self::Super4::•()
+    ;
+  method method() → void {
+    super.{self::Super4::call}<core::int>(0);
+    super.{self::Super4::call}<core::int>(0);
+    super.{self::Super4::call}<core::int>(0);
+    super.{self::Super4::call}<core::int>(0);
+  }
+}
+class Super5 extends core::Object {
+  synthetic constructor •() → self::Super5
+    : super core::Object::•()
+    ;
+  get call() → (core::int) → core::int
+    return (core::int a) → core::int => a;
+}
+class Class5 extends self::Super5 {
+  synthetic constructor •() → self::Class5
+    : super self::Super5::•()
+    ;
+  method test() → void {
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:67:5: Error: Cannot invoke `super` because it declares 'call' to be something other than a method.
+Try changing 'call' to a method or explicitly invoke 'call'.
+    super(0); // error
+    ^";
+  }
+  method method() → void {
+    super.{self::Super5::call}(0){(core::int) → core::int};
+  }
+}
+class Super6 extends core::Object {
+  field (core::int) → core::int call = (core::int a) → core::int => a;
+  synthetic constructor •() → self::Super6
+    : super core::Object::•()
+    ;
+}
+class Class6 extends self::Super6 {
+  synthetic constructor •() → self::Class6
+    : super self::Super6::•()
+    ;
+  method test() → void {
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:81:5: Error: Cannot invoke `super` because it declares 'call' to be something other than a method.
+Try changing 'call' to a method or explicitly invoke 'call'.
+    super(0); // error
+    ^";
+  }
+  method method() → void {
+    super.{self::Super6::call}(0){(core::int) → core::int};
+  }
+}
+class Super7 extends core::Object {
+  synthetic constructor •() → self::Super7
+    : super core::Object::•()
+    ;
+  set call((core::int) → core::int value) → void {}
+}
+class Class7 extends self::Super7 {
+  synthetic constructor •() → self::Class7
+    : super self::Super7::•()
+    ;
+  method test() → void {
+    super.call(0);
+    super.call(0);
+  }
+}
+class Super8 extends core::Object {
+  synthetic constructor •() → self::Super8
+    : super core::Object::•()
+    ;
+}
+class Class8 extends self::Super8 {
+  synthetic constructor •() → self::Class8
+    : super self::Super8::•()
+    ;
+  method test() → void {
+    super.call();
+    super.call();
+  }
+}
+static method main() → dynamic {
+  new self::Class1::•().{self::Class1::method}(){() → void};
+  new self::Class2::•().{self::Class2::method}(){() → void};
+  new self::Class3::•().{self::Class3::method}(){() → void};
+  new self::Class4::•().{self::Class4::method}(){() → void};
+  new self::Class5::•().{self::Class5::method}(){() → void};
+  new self::Class6::•().{self::Class6::method}(){() → void};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/implicit_this.dart.weak.modular.expect b/pkg/front_end/testcases/general/implicit_this.dart.weak.modular.expect
new file mode 100644
index 0000000..23d7a44
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_this.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    core::print("Called m");
+  }
+  method testC() → dynamic {
+    this.{self::C::m}(){() →* dynamic};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method testD() → dynamic {
+    this.{self::C::m}(){() →* dynamic};
+  }
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::testC}(){() →* dynamic};
+  new self::D::•().{self::D::testD}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/general/import_conflicting_getters.dart.weak.modular.expect b/pkg/front_end/testcases/general/import_conflicting_getters.dart.weak.modular.expect
new file mode 100644
index 0000000..14ee367
--- /dev/null
+++ b/pkg/front_end/testcases/general/import_conflicting_getters.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/import_conflicting_getters.dart:11:9: Error: 'foo' is imported from both 'pkg/front_end/testcases/general/import_conflicting_getters_lib1.dart' and 'pkg/front_end/testcases/general/import_conflicting_getters_lib2.dart'.
+//   print(foo);
+//         ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///import_conflicting_getters_lib1.dart";
+import "org-dartlang-testcase:///import_conflicting_getters_lib2.dart";
+
+static method main() → dynamic {}
+static method errors() → dynamic {
+  core::print(invalid-expression "pkg/front_end/testcases/general/import_conflicting_getters.dart:11:9: Error: 'foo' is imported from both 'pkg/front_end/testcases/general/import_conflicting_getters_lib1.dart' and 'pkg/front_end/testcases/general/import_conflicting_getters_lib2.dart'.
+  print(foo);
+        ^^^");
+}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static get foo() → core::int*
+  return 42;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static get foo() → core::int*
+  return 87;
diff --git a/pkg/front_end/testcases/general/import_conflicting_setters.dart.weak.modular.expect b/pkg/front_end/testcases/general/import_conflicting_setters.dart.weak.modular.expect
new file mode 100644
index 0000000..26d7537
--- /dev/null
+++ b/pkg/front_end/testcases/general/import_conflicting_setters.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/import_conflicting_setters.dart:11:3: Error: Setter not found: 'foo'.
+//   foo = 42;
+//   ^^^
+//
+import self as self;
+
+import "org-dartlang-testcase:///import_conflicting_setters_lib1.dart";
+import "org-dartlang-testcase:///import_conflicting_setters_lib2.dart";
+
+static method main() → dynamic {}
+static method errors() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/import_conflicting_setters.dart:11:3: Error: Setter not found: 'foo'.
+  foo = 42;
+  ^^^";
+}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static set foo(core::int* value) → void {}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static set foo(core::int* value) → void {}
diff --git a/pkg/front_end/testcases/general/import_conflicting_type_member.dart.weak.modular.expect b/pkg/front_end/testcases/general/import_conflicting_type_member.dart.weak.modular.expect
new file mode 100644
index 0000000..d883515
--- /dev/null
+++ b/pkg/front_end/testcases/general/import_conflicting_type_member.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/import_conflicting_type_member.dart:6:1: Error: 'Foo' is imported from both 'pkg/front_end/testcases/general/import_conflicting_type_member_lib1.dart' and 'pkg/front_end/testcases/general/import_conflicting_type_member_lib2.dart'.
+// import 'import_conflicting_type_member_lib2.dart';
+// ^^^
+//
+// pkg/front_end/testcases/general/import_conflicting_type_member.dart:12:3: Error: 'Foo' is imported from both 'pkg/front_end/testcases/general/import_conflicting_type_member_lib1.dart' and 'pkg/front_end/testcases/general/import_conflicting_type_member_lib2.dart'.
+//   Foo();
+//   ^^^
+//
+import self as self;
+
+import "org-dartlang-testcase:///import_conflicting_type_member_lib1.dart";
+import "org-dartlang-testcase:///import_conflicting_type_member_lib2.dart";
+
+static method main() → dynamic {}
+static method errors() → dynamic {
+  invalid-type foo;
+  invalid-expression "pkg/front_end/testcases/general/import_conflicting_type_member.dart:12:3: Error: 'Foo' is imported from both 'pkg/front_end/testcases/general/import_conflicting_type_member_lib1.dart' and 'pkg/front_end/testcases/general/import_conflicting_type_member_lib2.dart'.
+  Foo();
+  ^^^";
+}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self2::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library;
+import self as self3;
+
+static method Foo() → dynamic {}
diff --git a/pkg/front_end/testcases/general/import_conflicting_types.dart.weak.modular.expect b/pkg/front_end/testcases/general/import_conflicting_types.dart.weak.modular.expect
new file mode 100644
index 0000000..6154f37
--- /dev/null
+++ b/pkg/front_end/testcases/general/import_conflicting_types.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/import_conflicting_types.dart:6:1: Error: 'Foo' is imported from both 'pkg/front_end/testcases/general/import_conflicting_types_lib1.dart' and 'pkg/front_end/testcases/general/import_conflicting_types_lib2.dart'.
+// import 'import_conflicting_types_lib2.dart';
+// ^^^
+//
+import self as self;
+
+import "org-dartlang-testcase:///import_conflicting_types_lib1.dart";
+import "org-dartlang-testcase:///import_conflicting_types_lib2.dart";
+
+static method main() → dynamic {}
+static method errors() → dynamic {
+  invalid-type foo;
+}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self2::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self3::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..2967d68
--- /dev/null
+++ b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:7: Error: 'this' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   C.a(this);
+//       ^^^^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   C.b(this.);
+//            ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:7: Error: 'this' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   C.c(this, p);
+//       ^^^^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
+// Try inserting an identifier before ','.
+//   C.d(this., p);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor a(dynamic this) → self::C*
+    : super core::Object::•()
+    ;
+  constructor b() → self::C*
+    : super core::Object::•()
+    ;
+  constructor c(dynamic this, dynamic p) → self::C*
+    : super core::Object::•()
+    ;
+  constructor d() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/infer_equals.dart.weak.modular.expect b/pkg/front_end/testcases/general/infer_equals.dart.weak.modular.expect
new file mode 100644
index 0000000..4b8aa53e
--- /dev/null
+++ b/pkg/front_end/testcases/general/infer_equals.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic o) → core::bool* {
+    if(!(o is self::Class*))
+      return false;
+    return this.{self::Class::field}{dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} o{dynamic}.field;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.weak.modular.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.weak.modular.expect
new file mode 100644
index 0000000..4796a9b
--- /dev/null
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.weak.modular.expect
@@ -0,0 +1,297 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field2; // error
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
+//   var field2 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
+//   var field2 = '';
+//       ^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field4 = 0; // error
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
+//   var field4 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
+//   var field4 = '';
+//       ^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field6; // error
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
+//   int field6;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
+//   String field6;
+//          ^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field8 = 0; // error
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
+//   int field8;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
+//   String field8;
+//          ^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field11; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the overridden members.
+//   T field11;
+//     ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the overridden members.
+//   S field11;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field17; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
+//   var field17 = 0;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
+//   String field17;
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field18; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
+//   int field18;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
+//   var field18 = '';
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field2; // error
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
+//   var field2 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
+//   var field2 = '';
+//       ^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field4 = 0; // error
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
+//   var field4 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
+//   var field4 = '';
+//       ^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field6; // error
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
+//   int field6;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
+//   String field6;
+//          ^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field8 = 0; // error
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
+//   int field8;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
+//   String field8;
+//          ^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field17; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
+//   var field17 = 0;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
+//   String field17;
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field18; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
+//   int field18;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
+//   var field18 = '';
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:61:7: Error: The return type of the method 'C.field14' is 'int', which does not match the return type, 'String', of the overridden method, 'B.field14'.
+// Change to a subtype of 'String'.
+//   int field14; // error
+//       ^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:40:5: Context: This is the overridden method ('field14').
+//   S field14;
+//     ^
+//
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:61:7: Error: The field 'C.field14' has type 'int', which does not match the corresponding type, 'String', in the overridden setter, 'B.field14'.
+//   int field14; // error
+//       ^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:40:5: Context: This is the overridden method ('field14').
+//   S field14;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  field core::int* field1 = 0;
+  field core::int* field2 = 0;
+  field core::int* field3 = 0;
+  field core::int* field4 = 0;
+  field core::int* field5 = null;
+  field core::int* field6 = null;
+  field core::int* field7 = null;
+  field core::int* field8 = null;
+  field dynamic field9 = null;
+  covariant-by-class field self::A::T* field10 = null;
+  covariant-by-class field self::A::T* field11 = null;
+  covariant-by-class field self::A::T* field12 = null;
+  covariant-by-class field self::A::T* field13 = null;
+  covariant-by-class field self::A::T* field14 = null;
+  field core::int* field15 = 0;
+  field core::int* field16 = null;
+  field core::int* field17 = 0;
+  field core::int* field18 = null;
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic, S extends core::Object* = dynamic> extends core::Object {
+  field core::int* field1 = 1;
+  field core::String* field2 = "";
+  field core::int* field3 = 1;
+  field core::String* field4 = "";
+  field core::int* field5 = null;
+  field core::String* field6 = null;
+  field core::int* field7 = null;
+  field core::String* field8 = null;
+  field dynamic field9 = null;
+  covariant-by-class field self::B::T* field10 = null;
+  covariant-by-class field self::B::S* field11 = null;
+  covariant-by-class field self::B::T* field12 = null;
+  covariant-by-class field self::B::T* field13 = null;
+  covariant-by-class field self::B::S* field14 = null;
+  field core::int* field15 = null;
+  field core::int* field16 = 0;
+  field core::String* field17 = null;
+  field core::String* field18 = "";
+  synthetic constructor •() → self::B<self::B::T*, self::B::S*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object implements self::A<core::int*>, self::B<core::int*, core::String*> {
+  field core::int* field1;
+  field invalid-type field2;
+  field core::int* field3 = 0;
+  field invalid-type field4 = 0;
+  field core::int* field5;
+  field invalid-type field6;
+  field core::int* field7 = 0;
+  field invalid-type field8 = 0;
+  field dynamic field9;
+  covariant-by-class field core::int* field10;
+  covariant-by-class field invalid-type field11;
+  covariant-by-class field core::int* field12;
+  covariant-by-class field core::int* field13 = 0;
+  covariant-by-class field core::int* field14;
+  field core::int* field15;
+  field core::int* field16;
+  field invalid-type field17;
+  field invalid-type field18;
+  constructor •(core::int* field1, invalid-type field2, core::int* field3, invalid-type field4, core::int* field5, invalid-type field6, core::int* field7, invalid-type field8, dynamic field9, core::int* field10, invalid-type field11, core::int* field12, core::int* field13, core::int* field14, core::int* field15, core::int* field16, invalid-type field17, invalid-type field18) → self::C*
+    : self::C::field1 = field1, self::C::field2 = field2, self::C::field3 = field3, self::C::field4 = field4, self::C::field5 = field5, self::C::field6 = field6, self::C::field7 = field7, self::C::field8 = field8, self::C::field9 = field9, self::C::field10 = field10, self::C::field11 = field11, self::C::field12 = field12, self::C::field13 = field13, self::C::field14 = field14, self::C::field15 = field15, self::C::field16 = field16, self::C::field17 = field17, self::C::field18 = field18, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<T extends core::Object* = dynamic> extends core::Object implements self::A<self::D::T*>, self::B<self::D::T*, self::D::T*> {
+  field core::int* field1;
+  field invalid-type field2;
+  field core::int* field3 = 0;
+  field invalid-type field4 = 0;
+  field core::int* field5;
+  field invalid-type field6;
+  field core::int* field7 = 0;
+  field invalid-type field8 = 0;
+  field dynamic field9;
+  covariant-by-class field self::D::T* field10;
+  covariant-by-class field self::D::T* field11;
+  covariant-by-class field self::D::T* field12;
+  covariant-by-class field self::D::T* field13 = null;
+  covariant-by-class field self::D::T* field14;
+  field core::int* field15;
+  field core::int* field16;
+  field invalid-type field17;
+  field invalid-type field18;
+  constructor •(core::int* field1, invalid-type field2, core::int* field3, invalid-type field4, core::int* field5, invalid-type field6, core::int* field7, invalid-type field8, dynamic field9, self::D::T* field10, self::D::T* field11, self::D::T* field12, self::D::T* field13, self::D::T* field14, core::int* field15, core::int* field16, invalid-type field17, invalid-type field18) → self::D<self::D::T*>*
+    : self::D::field1 = field1, self::D::field2 = field2, self::D::field3 = field3, self::D::field4 = field4, self::D::field5 = field5, self::D::field6 = field6, self::D::field7 = field7, self::D::field8 = field8, self::D::field9 = field9, self::D::field10 = field10, self::D::field11 = field11, self::D::field12 = field12, self::D::field13 = field13, self::D::field14 = field14, self::D::field15 = field15, self::D::field16 = field16, self::D::field17 = field17, self::D::field18 = field18, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/infer_field_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/infer_field_type.dart.weak.modular.expect
new file mode 100644
index 0000000..aa6a7e49
--- /dev/null
+++ b/pkg/front_end/testcases/general/infer_field_type.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends self::B {
+  field core::int* field = null;
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  get field() → core::int*
+    return null;
+  set field(core::int* value) → void {}
+}
+class A extends core::Object {
+  field core::int* field = 0;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* topLevelFieldFromA = new self::A::•().{self::A::field}{core::int*};
+static field core::int* topLevelFieldFromB = new self::B::•().{self::B::field}{core::int*};
+static field core::int* topLevelFieldFromC = new self::C::•().{self::C::field}{core::int*};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.weak.modular.expect
new file mode 100644
index 0000000..bf294a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/infer_fixed_generic_return_type.dart.weak.modular.expect
@@ -0,0 +1,127 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class MixinA<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::MixinA<self::MixinA::T*>*
+    : super core::Object::•()
+    ;
+  abstract method method(core::Object* t) → self::MixinA::T*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Base&MixinA = self::Base with self::MixinA<dynamic> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Base&MixinA*
+    : super self::Base::•()
+    ;
+  abstract mixin-stub method method(core::Object* t) → dynamic; -> self::MixinA::method
+}
+abstract class Class extends self::_Class&Base&MixinA {
+  synthetic constructor •() → self::Class*
+    : super self::_Class&Base&MixinA::•()
+    ;
+  method method(core::Object* t) → dynamic {}
+}
+abstract class YamlNode extends core::Object {
+  synthetic constructor •() → self::YamlNode*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Map<K extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Map<self::Map::K*, self::Map::V*>*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::Object* key) → self::Map::V*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class MapMixin<K extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object implements self::Map<self::MapMixin::K*, self::MapMixin::V*> {
+  synthetic constructor •() → self::MapMixin<self::MapMixin::K*, self::MapMixin::V*>*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::Object* key) → self::MapMixin::V*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class UnmodifiableMapMixin<K extends core::Object* = dynamic, V extends core::Object* = dynamic> extends core::Object implements self::Map<self::UnmodifiableMapMixin::K*, self::UnmodifiableMapMixin::V*> {
+  synthetic constructor •() → self::UnmodifiableMapMixin<self::UnmodifiableMapMixin::K*, self::UnmodifiableMapMixin::V*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _YamlMap&YamlNode&MapMixin = self::YamlNode with self::MapMixin<dynamic, dynamic> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin*
+    : super self::YamlNode::•()
+    ;
+  abstract mixin-stub operator [](core::Object* key) → dynamic; -> self::MapMixin::[]
+}
+abstract class _YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin = self::_YamlMap&YamlNode&MapMixin with self::UnmodifiableMapMixin<dynamic, dynamic> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin*
+    : super self::_YamlMap&YamlNode&MapMixin::•()
+    ;
+}
+class YamlMap extends self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin {
+  synthetic constructor •() → self::YamlMap*
+    : super self::_YamlMap&YamlNode&MapMixin&UnmodifiableMapMixin::•()
+    ;
+  operator [](core::Object* key) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart.weak.modular.expect b/pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart.weak.modular.expect
new file mode 100644
index 0000000..4574621
--- /dev/null
+++ b/pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart.weak.modular.expect
@@ -0,0 +1,100 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:9:10: Error: A value of type 'S Function<S>(S, S)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = <S>(S a, S b) => a;
+//          ^
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:15:7: Error: A value of type 'S Function<S>(S, S)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = f;
+//       ^
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:20:10: Error: A value of type 'dynamic Function<S>(dynamic, S)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = <S>(a, S b) => a;
+//          ^
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:25:10: Error: A value of type 'S Function<S>(dynamic, S)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = <S>(a, S b) => b;
+//          ^
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:30:10: Error: A value of type 'dynamic Function<S>(dynamic, dynamic)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = <S>(a, b) => a;
+//          ^
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:35:7: Error: A value of type 'int Function(int, int, dynamic)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = (a, b, c) => a;
+//       ^
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:40:7: Error: A value of type 'int Function(int)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = (a) => a;
+//       ^
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:45:10: Error: A value of type 'dynamic Function<S>(dynamic, dynamic, dynamic)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = <S>(a, b, c) => a;
+//          ^
+//
+// pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:50:10: Error: A value of type 'dynamic Function<S>(dynamic)' can't be assigned to a variable of type 'int Function(int, int)'.
+//   d = <S>(a) => a;
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant T extends core::Object* = dynamic> = (T*, T*) →* T*;
+static method test1() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:9:10: Error: A value of type 'S Function<S>(S, S)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = <S>(S a, S b) => a;
+         ^" in (<S extends core::Object* = dynamic>(S* a, S* b) → S* => a) as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method test2() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  <S extends core::Object* = dynamic>(S*, S*) →* S* f = <S extends core::Object* = dynamic>(S* a, S* b) → S* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:15:7: Error: A value of type 'S Function<S>(S, S)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = f;
+      ^" in f as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method test3a() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:20:10: Error: A value of type 'dynamic Function<S>(dynamic, S)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = <S>(a, S b) => a;
+         ^" in (<S extends core::Object* = dynamic>(dynamic a, S* b) → dynamic => a) as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method test3b() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:25:10: Error: A value of type 'S Function<S>(dynamic, S)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = <S>(a, S b) => b;
+         ^" in (<S extends core::Object* = dynamic>(dynamic a, S* b) → S* => b) as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method test4() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:30:10: Error: A value of type 'dynamic Function<S>(dynamic, dynamic)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = <S>(a, b) => a;
+         ^" in (<S extends core::Object* = dynamic>(dynamic a, dynamic b) → dynamic => a) as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method test5() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:35:7: Error: A value of type 'int Function(int, int, dynamic)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = (a, b, c) => a;
+      ^" in ((core::int* a, core::int* b, dynamic c) → core::int* => a) as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method test6() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:40:7: Error: A value of type 'int Function(int)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = (a) => a;
+      ^" in ((core::int* a) → core::int* => a) as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method test7() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:45:10: Error: A value of type 'dynamic Function<S>(dynamic, dynamic, dynamic)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = <S>(a, b, c) => a;
+         ^" in (<S extends core::Object* = dynamic>(dynamic a, dynamic b, dynamic c) → dynamic => a) as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method test8() → dynamic {
+  (core::int*, core::int*) →* core::int* d = (core::int* a, core::int* b) → core::int* => a;
+  d = invalid-expression "pkg/front_end/testcases/general/infer_generic_type_parameter_mismatch.dart:50:10: Error: A value of type 'dynamic Function<S>(dynamic)' can't be assigned to a variable of type 'int Function(int, int)'.
+  d = <S>(a) => a;
+         ^" in (<S extends core::Object* = dynamic>(dynamic a) → dynamic => a) as{TypeError} (core::int*, core::int*) →* core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.weak.modular.expect b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.weak.modular.expect
new file mode 100644
index 0000000..4e6b1e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::Map<core::String*, (core::String*) →* Null>* map = <core::String*, (core::String*) →* Null>{"foo": (core::String* a) → Null {
+    core::int* c = a.{core::String::length}{core::int*};
+  }};
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/inherit_function.dart.weak.modular.expect b/pkg/front_end/testcases/general/inherit_function.dart.weak.modular.expect
new file mode 100644
index 0000000..8b7e846
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&Function extends core::Object {
+  synthetic constructor •() → self::_C&Object&Function*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::_C&Object&Function {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&Function::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/initialzation_errors.dart.weak.modular.expect b/pkg/front_end/testcases/general/initialzation_errors.dart.weak.modular.expect
new file mode 100644
index 0000000..fc29ac4
--- /dev/null
+++ b/pkg/front_end/testcases/general/initialzation_errors.dart.weak.modular.expect
@@ -0,0 +1,321 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:9:16: Error: 'x' was already initialized by this constructor.
+//         this.x = 42 {}
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:16:16: Error: 'x' was already initialized by this constructor.
+//         this.x = 42 {}
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:22:16: Error: 'x' is a final instance variable that was initialized at the declaration.
+//       : this.x = 41,
+//                ^
+// pkg/front_end/testcases/general/initialzation_errors.dart:20:13: Context: 'x' was initialized here.
+//   final int x = 2;
+//             ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:23:16: Error: 'x' was already initialized by this constructor.
+//         this.x = 42 {}
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:30:16: Error: A redirecting constructor can't have other initializers.
+//       : this.x = 41,
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:32:16: Error: A redirecting constructor can't have other initializers.
+//         this.y = 42 {}
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:43:16: Error: A redirecting constructor can't have other initializers.
+//         this.x = 1,
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:44:16: Error: A redirecting constructor can't have other initializers.
+//         this.y = 2 {}
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:49:16: Error: A redirecting constructor can't have other initializers.
+//       : this.x = 1,
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:51:16: Error: A redirecting constructor can't have other initializers.
+//         this.y = 2;
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:53:9: Error: A redirecting constructor can't have a 'super' initializer.
+//       : super(),
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:55:16: Error: Can't have initializers after 'super'.
+//         this.x = 1,
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:56:16: Error: Can't have initializers after 'super'.
+//         this.y = 2;
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:58:16: Error: A redirecting constructor can't have other initializers.
+//       : this.x = 1,
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:59:16: Error: A redirecting constructor can't have other initializers.
+//         this.y = 2,
+//                ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:62:9: Error: A redirecting constructor can't have other initializers.
+//       : assert(true),
+//         ^^^^^^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:66:9: Error: A redirecting constructor can't have other initializers.
+//         assert(true);
+//         ^^^^^^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:72:9: Error: A redirecting constructor can't have a 'super' initializer.
+//         super() {}
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:78:9: Error: A redirecting constructor can't have a 'super' initializer.
+//       : super(),
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:80:9: Error: Can't have more than one 'super' initializer.
+//         super() {}
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:87:14: Error: A redirecting constructor can't have more than one redirection.
+//         this.named();
+//              ^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:94:9: Error: Can't have more than one 'super' initializer.
+//         super() {}
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/initialzation_errors.dart:101:16: Error: Can't have initializers after 'super'.
+//         this.x = 42 {}
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  constructor •() → self::A*
+    : self::A::x = 41, final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:9:16: Error: 'x' was already initialized by this constructor.
+        this.x = 42 {}
+               ^", super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  final field core::int* x;
+  constructor •() → self::B*
+    : self::B::x = 41, final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:16:16: Error: 'x' was already initialized by this constructor.
+        this.x = 42 {}
+               ^", super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  final field core::int* x = 2;
+  constructor •() → self::C*
+    : final dynamic #t3 = throw new core::_DuplicatedFieldInitializerError::•("x"), final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:23:16: Error: 'x' was already initialized by this constructor.
+        this.x = 42 {}
+               ^", super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  final field core::int* x;
+  final field core::int* y;
+  constructor •() → self::D*
+    : final dynamic #t5 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:30:16: Error: A redirecting constructor can't have other initializers.
+      : this.x = 41,
+               ^", final dynamic #t6 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:32:16: Error: A redirecting constructor can't have other initializers.
+        this.y = 42 {}
+               ^", this self::D::named() {}
+  constructor named() → self::D*
+    : self::D::x = 41, self::D::y = 42, super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object {
+  final field core::int* x;
+  final field core::int* y;
+  constructor •() → self::E*
+    : final dynamic #t7 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:43:16: Error: A redirecting constructor can't have other initializers.
+        this.x = 1,
+               ^", final dynamic #t8 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:44:16: Error: A redirecting constructor can't have other initializers.
+        this.y = 2 {}
+               ^", this self::E::named() {}
+  constructor named() → self::E*
+    : self::E::x = 41, self::E::y = 42, super core::Object::•() {}
+  constructor named2() → self::E*
+    : final dynamic #t9 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:49:16: Error: A redirecting constructor can't have other initializers.
+      : this.x = 1,
+               ^", final dynamic #t10 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:51:16: Error: A redirecting constructor can't have other initializers.
+        this.y = 2;
+               ^", this self::E::named()
+    ;
+  constructor named3() → self::E*
+    : final dynamic #t11 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:53:9: Error: A redirecting constructor can't have a 'super' initializer.
+      : super(),
+        ^^^^^", final dynamic #t12 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:55:16: Error: Can't have initializers after 'super'.
+        this.x = 1,
+               ^", final dynamic #t13 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:56:16: Error: Can't have initializers after 'super'.
+        this.y = 2;
+               ^", super core::Object::•()
+    ;
+  constructor named4() → self::E*
+    : final dynamic #t14 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:58:16: Error: A redirecting constructor can't have other initializers.
+      : this.x = 1,
+               ^", final dynamic #t15 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:59:16: Error: A redirecting constructor can't have other initializers.
+        this.y = 2,
+               ^", this self::E::named()
+    ;
+  constructor named5() → self::E*
+    : final dynamic #t16 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:62:9: Error: A redirecting constructor can't have other initializers.
+      : assert(true),
+        ^^^^^^", this self::E::named()
+    ;
+  constructor named6() → self::E*
+    : final dynamic #t17 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:66:9: Error: A redirecting constructor can't have other initializers.
+        assert(true);
+        ^^^^^^", this self::E::named()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F extends core::Object {
+  constructor •() → self::F*
+    : final dynamic #t18 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:72:9: Error: A redirecting constructor can't have a 'super' initializer.
+        super() {}
+        ^^^^^", this self::F::named() {}
+  constructor named() → self::F*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G extends core::Object {
+  constructor •() → self::G*
+    : final dynamic #t19 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:78:9: Error: A redirecting constructor can't have a 'super' initializer.
+      : super(),
+        ^^^^^", final dynamic #t20 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:80:9: Error: Can't have more than one 'super' initializer.
+        super() {}
+        ^^^^^", super core::Object::•() {}
+  constructor named() → self::G*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class H extends core::Object {
+  constructor •() → self::H*
+    : final dynamic #t21 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:87:14: Error: A redirecting constructor can't have more than one redirection.
+        this.named();
+             ^", this self::H::named()
+    ;
+  constructor named() → self::H*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class I extends core::Object {
+  constructor •() → self::I*
+    : final dynamic #t22 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:94:9: Error: Can't have more than one 'super' initializer.
+        super() {}
+        ^^^^^", super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class J extends core::Object {
+  field core::int* x;
+  constructor •() → self::J*
+    : final dynamic #t23 = invalid-expression "pkg/front_end/testcases/general/initialzation_errors.dart:101:16: Error: Can't have initializers after 'super'.
+        this.x = 42 {}
+               ^", super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/instance_setter_conflict.dart.weak.modular.expect b/pkg/front_end/testcases/general/instance_setter_conflict.dart.weak.modular.expect
new file mode 100644
index 0000000..22c9052
--- /dev/null
+++ b/pkg/front_end/testcases/general/instance_setter_conflict.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/instance_setter_conflict.dart:11:14: Error: Can't declare a member that conflicts with an inherited one.
+//   static get v {
+//              ^
+// pkg/front_end/testcases/general/instance_setter_conflict.dart:6:7: Context: This is the inherited member.
+//   int v;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* v = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A {
+  static field core::int* n = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+  static get v() → dynamic {
+    return self::C::n;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.weak.modular.expect b/pkg/front_end/testcases/general/interface_conflict.dart.weak.modular.expect
new file mode 100644
index 0000000..35d40fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.weak.modular.expect
@@ -0,0 +1,83 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_conflict.dart:13:16: Error: Class 'C' inherits multiple members named 'n' with incompatible signatures.
+// Try adding a declaration of 'n' to 'C'.
+// abstract class C implements A, B {}
+//                ^
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the overridden members.
+//   int get n => 1;
+//           ^
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the overridden members.
+//   double get n => 2.0;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  get n() → core::int*
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get n() → core::double*
+    return 2.0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object implements self::C {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.weak.modular.expect b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.weak.modular.expect
new file mode 100644
index 0000000..a99ce5f
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.weak.modular.expect
@@ -0,0 +1,64 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_contravariant_from_class.dart:17:16: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'B'.
+// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
+//                ^
+//
+// pkg/front_end/testcases/general/interface_contravariant_from_class.dart:17:16: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'I'.
+// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method f(core::int* x) → self::B::T* {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f(core::Object* x) → self::I::T*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.weak.modular.expect b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.weak.modular.expect
new file mode 100644
index 0000000..5ba8fab
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.weak.modular.expect
@@ -0,0 +1,64 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart:17:16: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'B'.
+// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
+//                ^
+//
+// pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart:17:16: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'I'.
+// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method f((self::B::T*) →* void x, core::int* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f((self::I::T*) →* void x, core::Object* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.weak.modular.expect b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.weak.modular.expect
new file mode 100644
index 0000000..68f6ac0
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:13:7: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// class B<T> implements A<F<T>> {
+//       ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:17:16: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'A'.
+// abstract class I<T> implements A<F<T>> {
+//                ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:21:16: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'B'.
+// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
+//                ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:21:16: Error: Can't use implicitly 'out' variable 'T' in an 'in' position in supertype 'I'.
+// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-class self::A::T* x, core::int* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method f((self::B::T*) →* void x, core::int* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f((self::I::T*) →* void x, core::Object* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.weak.modular.expect
new file mode 100644
index 0000000..a16acb5
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   i = s;
+//       ^
+//
+// pkg/front_end/testcases/general/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   i ??= s;
+//         ^
+//
+// pkg/front_end/testcases/general/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/general/invalid_assignment.dart'.
+//   a += 1;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(core::int* i) → core::String*
+    return "";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(core::int* i, core::String* s, self::A* a) → dynamic {
+  i = 1;
+  i = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i = s;
+      ^" in s as{TypeError} core::int*;
+  i == null ?{core::int*} i = 1 : null;
+  i == null ?{core::Object*} i = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i ??= s;
+        ^" in s as{TypeError} core::int* : null;
+  a = new self::A::•();
+  a = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/general/invalid_assignment.dart'.
+  a += 1;
+    ^" in a.{self::A::+}(1){(core::int*) →* core::String*} as{TypeError} self::A*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_cast.dart.weak.modular.expect
new file mode 100644
index 0000000..6d764be
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.weak.modular.expect
@@ -0,0 +1,175 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:22:25: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Object' is from 'dart:core'.
+// Change the type of the list literal or the context in which it is used.
+//   List<int> a = <Object>[];
+//                         ^
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:23:40: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Object' is from 'dart:core'.
+// Change the type of the map literal or the context in which it is used.
+//   Map<int, String> b = <Object, String>{};
+//                                        ^
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:24:37: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Object' is from 'dart:core'.
+// Change the type of the map literal or the context in which it is used.
+//   Map<int, String> c = <int, Object>{};
+//                                     ^
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:25:28: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+//  - 'Object' is from 'dart:core'.
+// Change the type of the function expression or the context in which it is used.
+//   int Function(Object) d = (int i) => i;
+//                            ^
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:28:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+//  - 'C' is from 'pkg/front_end/testcases/general/invalid_cast.dart'.
+//  - 'D' is from 'pkg/front_end/testcases/general/invalid_cast.dart'.
+// Change the type of the object being constructed or the context in which it is used.
+//   D g = new C.nonFact();
+//             ^
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:29:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+//  - 'C' is from 'pkg/front_end/testcases/general/invalid_cast.dart'.
+//  - 'D' is from 'pkg/front_end/testcases/general/invalid_cast.dart'.
+// Change the type of the object being constructed or the context in which it is used.
+//   D h = new C.nonFact2();
+//             ^
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:30:31: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+//  - 'Object' is from 'dart:core'.
+// Change the type of the method or the context in which it is used.
+//   void Function(Object) i = C.staticFunction;
+//                               ^
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:31:29: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+//  - 'Object' is from 'dart:core'.
+// Change the type of the function or the context in which it is used.
+//   void Function(Object) j = topLevelFunction;
+//                             ^
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:32:29: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+//  - 'Object' is from 'dart:core'.
+// Change the type of the function or the context in which it is used.
+//   void Function(Object) k = localFunction;
+//                             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  constructor nonFact() → self::C*
+    : super core::Object::•()
+    ;
+  constructor nonFact2() → self::C*
+    : this self::C::nonFact()
+    ;
+  static factory fact() → self::C*
+    return null;
+  static factory fact2() → self::C*
+    return new self::D::•();
+  static method staticFunction(core::int* i) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+static method topLevelFunction(core::int* i) → void {}
+static method bad() → dynamic {
+  function localFunction(core::int* i) → void {}
+  core::List<core::int*>* a = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:22:25: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
+Change the type of the list literal or the context in which it is used.
+  List<int> a = <Object>[];
+                        ^" in <core::Object*>[];
+  core::Map<core::int*, core::String*>* b = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:23:40: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
+Change the type of the map literal or the context in which it is used.
+  Map<int, String> b = <Object, String>{};
+                                       ^" in <core::Object*, core::String*>{};
+  core::Map<core::int*, core::String*>* c = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:24:37: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
+Change the type of the map literal or the context in which it is used.
+  Map<int, String> c = <int, Object>{};
+                                    ^" in <core::int*, core::Object*>{};
+  (core::Object*) →* core::int* d = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:25:28: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+ - 'Object' is from 'dart:core'.
+Change the type of the function expression or the context in which it is used.
+  int Function(Object) d = (int i) => i;
+                           ^" in (core::int* i) → core::int* => i;
+  self::D* e = self::C::fact() as{TypeError} self::D*;
+  self::D* f = new self::D::•() as{TypeError} self::D*;
+  self::D* g = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:28:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+ - 'C' is from 'pkg/front_end/testcases/general/invalid_cast.dart'.
+ - 'D' is from 'pkg/front_end/testcases/general/invalid_cast.dart'.
+Change the type of the object being constructed or the context in which it is used.
+  D g = new C.nonFact();
+            ^" in new self::C::nonFact();
+  self::D* h = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:29:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+ - 'C' is from 'pkg/front_end/testcases/general/invalid_cast.dart'.
+ - 'D' is from 'pkg/front_end/testcases/general/invalid_cast.dart'.
+Change the type of the object being constructed or the context in which it is used.
+  D h = new C.nonFact2();
+            ^" in new self::C::nonFact2();
+  (core::Object*) →* void i = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:30:31: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
+Change the type of the method or the context in which it is used.
+  void Function(Object) i = C.staticFunction;
+                              ^" in #C2;
+  (core::Object*) →* void j = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:31:29: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
+Change the type of the function or the context in which it is used.
+  void Function(Object) j = topLevelFunction;
+                            ^" in #C3;
+  (core::Object*) →* void k = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:32:29: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
+Change the type of the function or the context in which it is used.
+  void Function(Object) k = localFunction;
+                            ^" in localFunction;
+}
+static method ok() → dynamic {
+  function localFunction(core::int* i) → void {}
+  core::List<core::int*>* a = <core::int*>[];
+  core::Map<core::int*, core::String*>* b = <core::int*, core::String*>{};
+  core::Map<core::int*, core::String*>* c = <core::int*, core::String*>{};
+  (core::int*) →* core::int* d = (core::int* i) → core::int* => i;
+  self::D* e = self::C::fact() as{TypeError} self::D*;
+  self::D* f = new self::D::•() as{TypeError} self::D*;
+  self::C* g = new self::C::nonFact();
+  self::C* h = new self::C::nonFact2();
+  (core::int*) →* void i = #C2;
+  (core::int*) →* void j = #C3;
+  (core::int*) →* void k = localFunction;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::fact2
+  #C2 = static-tearoff self::C::staticFunction
+  #C3 = static-tearoff self::topLevelFunction
+}
diff --git a/pkg/front_end/testcases/general/invalid_for_in_iterable.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_for_in_iterable.dart.weak.modular.expect
new file mode 100644
index 0000000..bf9baa8
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_for_in_iterable.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_for_in_iterable.dart:14:27: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   for (var v in takesNoArg(0)) {}
+//                           ^
+// pkg/front_end/testcases/general/invalid_for_in_iterable.dart:7:10: Context: Found this candidate, but the arguments don't match.
+// Iterable takesNoArg() => null;
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/invalid_for_in_iterable.dart:15:17: Error: This expression has type 'void' and can't be used.
+//   for (var v in returnVoid()) {}
+//                 ^
+//
+// pkg/front_end/testcases/general/invalid_for_in_iterable.dart:16:17: Error: The type 'int' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (var v in returnInt()) {}
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method takesNoArg() → core::Iterable<dynamic>*
+  return null;
+static method returnVoid() → void {}
+static method returnInt() → core::int*
+  return 42;
+static method returnDynamic() → dynamic
+  return <dynamic>[];
+static method returnObject() → core::Object*
+  return 0;
+static method test() → dynamic {
+  for (dynamic v in invalid-expression "pkg/front_end/testcases/general/invalid_for_in_iterable.dart:14:27: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  for (var v in takesNoArg(0)) {}
+                          ^") {
+  }
+  for (dynamic v in invalid-expression "pkg/front_end/testcases/general/invalid_for_in_iterable.dart:15:17: Error: This expression has type 'void' and can't be used.
+  for (var v in returnVoid()) {}
+                ^" in self::returnVoid()) {
+  }
+  for (dynamic v in invalid-expression "pkg/front_end/testcases/general/invalid_for_in_iterable.dart:16:17: Error: The type 'int' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  for (var v in returnInt()) {}
+                ^" in self::returnInt() as{TypeError} core::Iterable<dynamic>*) {
+  }
+  for (dynamic v in self::returnDynamic() as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+  }
+  for (dynamic v in self::returnObject() as{TypeError} core::Iterable<dynamic>*) {
+  }
+  for (dynamic v in throw "") {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.weak.expect b/pkg/front_end/testcases/general/invalid_operator.dart.weak.expect
index c3f1e06..1bababf 100644
--- a/pkg/front_end/testcases/general/invalid_operator.dart.weak.expect
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.weak.expect
@@ -564,35 +564,35 @@
 // Try adding explicit types.
 //   operator ==<T>(a) => true;
 //            ^^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is one of the overridden members.
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is one of the overridden members.
 //   external bool operator ==(Object other);
 //                          ^^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:6:12: Error: The method 'Operators1.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   operator ==() => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:27:12: Error: The method 'Operators2.==' has more required arguments than those of overridden method 'Object.=='.
 //   operator ==(a, b) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:71:12: Error: The method 'Operators4.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   operator ==({a}) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:137:12: Error: Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
 //   operator ==<T>(a) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_operator.dart.weak.modular.expect
new file mode 100644
index 0000000..1bababf
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.weak.modular.expect
@@ -0,0 +1,968 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:6:12: Error: Operator '==' should have exactly one parameter.
+//   operator ==() => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:7:12: Error: Operator '<' should have exactly one parameter.
+//   operator <() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:8:12: Error: Operator '>' should have exactly one parameter.
+//   operator >() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:9:12: Error: Operator '<=' should have exactly one parameter.
+//   operator <=() => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:10:12: Error: Operator '>=' should have exactly one parameter.
+//   operator >=() => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:11:12: Error: Operator '+' should have exactly one parameter.
+//   operator +() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:12:12: Error: Operator '/' should have exactly one parameter.
+//   operator /() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:13:12: Error: Operator '~/' should have exactly one parameter.
+//   operator ~/() => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:14:12: Error: Operator '*' should have exactly one parameter.
+//   operator *() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:15:12: Error: Operator '%' should have exactly one parameter.
+//   operator %() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:16:12: Error: Operator '|' should have exactly one parameter.
+//   operator |() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:17:12: Error: Operator '^' should have exactly one parameter.
+//   operator ^() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:18:12: Error: Operator '&' should have exactly one parameter.
+//   operator &() => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:19:12: Error: Operator '<<' should have exactly one parameter.
+//   operator <<() => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:20:12: Error: Operator '>>' should have exactly one parameter.
+//   operator >>() => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:21:12: Error: Operator '[]=' should have exactly two parameters.
+//   operator []=(a, b, c) => true;
+//            ^^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:22:12: Error: Operator '[]' should have exactly one parameter.
+//   operator []() => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:23:12: Error: Operator '~' shouldn't have any parameters.
+//   operator ~(a) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:27:12: Error: Operator '==' should have exactly one parameter.
+//   operator ==(a, b) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:28:12: Error: Operator '<' should have exactly one parameter.
+//   operator <(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:29:12: Error: Operator '>' should have exactly one parameter.
+//   operator >(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:30:12: Error: Operator '<=' should have exactly one parameter.
+//   operator <=(a, b) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:31:12: Error: Operator '>=' should have exactly one parameter.
+//   operator >=(a, b) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:32:12: Error: Operator '-' should have zero or one parameter.
+// With zero parameters, it has the syntactic form '-a', formally known as 'unary-'. With one parameter, it has the syntactic form 'a - b', formally known as '-'.
+//   operator -(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:33:12: Error: Operator '+' should have exactly one parameter.
+//   operator +(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:34:12: Error: Operator '/' should have exactly one parameter.
+//   operator /(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:35:12: Error: Operator '~/' should have exactly one parameter.
+//   operator ~/(a, b) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:36:12: Error: Operator '*' should have exactly one parameter.
+//   operator *(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:37:12: Error: Operator '%' should have exactly one parameter.
+//   operator %(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:38:12: Error: Operator '|' should have exactly one parameter.
+//   operator |(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:39:12: Error: Operator '^' should have exactly one parameter.
+//   operator ^(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:40:12: Error: Operator '&' should have exactly one parameter.
+//   operator &(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:41:12: Error: Operator '<<' should have exactly one parameter.
+//   operator <<(a, b) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:42:12: Error: Operator '>>' should have exactly one parameter.
+//   operator >>(a, b) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:43:12: Error: Operator '[]=' should have exactly two parameters.
+//   operator []=(a, b, c) => true;
+//            ^^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:44:12: Error: Operator '[]' should have exactly one parameter.
+//   operator [](a, b) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:45:12: Error: Operator '~' shouldn't have any parameters.
+//   operator ~(a, b) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:49:16: Error: An operator can't have optional parameters.
+//   operator ==([a]) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:50:15: Error: An operator can't have optional parameters.
+//   operator <([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:51:15: Error: An operator can't have optional parameters.
+//   operator >([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:52:16: Error: An operator can't have optional parameters.
+//   operator <=([a]) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:53:16: Error: An operator can't have optional parameters.
+//   operator >=([a]) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:54:15: Error: An operator can't have optional parameters.
+//   operator -([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:55:15: Error: An operator can't have optional parameters.
+//   operator +([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:56:15: Error: An operator can't have optional parameters.
+//   operator /([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:57:16: Error: An operator can't have optional parameters.
+//   operator ~/([a]) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:58:15: Error: An operator can't have optional parameters.
+//   operator *([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:59:15: Error: An operator can't have optional parameters.
+//   operator %([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:60:15: Error: An operator can't have optional parameters.
+//   operator |([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:61:15: Error: An operator can't have optional parameters.
+//   operator ^([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:62:15: Error: An operator can't have optional parameters.
+//   operator &([a]) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:63:16: Error: An operator can't have optional parameters.
+//   operator <<([a]) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:64:16: Error: An operator can't have optional parameters.
+//   operator >>([a]) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:65:17: Error: An operator can't have optional parameters.
+//   operator []=([a, b]) => true;
+//                 ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:65:20: Error: An operator can't have optional parameters.
+//   operator []=([a, b]) => true;
+//                    ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:66:16: Error: An operator can't have optional parameters.
+//   operator []([a]) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:67:12: Error: Operator '~' shouldn't have any parameters.
+//   operator ~([a]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:71:16: Error: An operator can't have optional parameters.
+//   operator ==({a}) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:72:15: Error: An operator can't have optional parameters.
+//   operator <({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:73:15: Error: An operator can't have optional parameters.
+//   operator >({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:74:16: Error: An operator can't have optional parameters.
+//   operator <=({a}) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:75:16: Error: An operator can't have optional parameters.
+//   operator >=({a}) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:76:15: Error: An operator can't have optional parameters.
+//   operator -({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:77:15: Error: An operator can't have optional parameters.
+//   operator +({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:78:15: Error: An operator can't have optional parameters.
+//   operator /({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:79:16: Error: An operator can't have optional parameters.
+//   operator ~/({a}) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:80:15: Error: An operator can't have optional parameters.
+//   operator *({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:81:15: Error: An operator can't have optional parameters.
+//   operator %({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:82:15: Error: An operator can't have optional parameters.
+//   operator |({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:83:15: Error: An operator can't have optional parameters.
+//   operator ^({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:84:15: Error: An operator can't have optional parameters.
+//   operator &({a}) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:85:16: Error: An operator can't have optional parameters.
+//   operator <<({a}) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:86:16: Error: An operator can't have optional parameters.
+//   operator >>({a}) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:87:17: Error: An operator can't have optional parameters.
+//   operator []=({a, b}) => true;
+//                 ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:87:20: Error: An operator can't have optional parameters.
+//   operator []=({a, b}) => true;
+//                    ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:88:16: Error: An operator can't have optional parameters.
+//   operator []({a}) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:89:12: Error: Operator '~' shouldn't have any parameters.
+//   operator ~({a}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:93:12: Error: Operator '==' should have exactly one parameter.
+//   operator ==(a, [b]) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:94:12: Error: Operator '<' should have exactly one parameter.
+//   operator <(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:95:12: Error: Operator '>' should have exactly one parameter.
+//   operator >(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:96:12: Error: Operator '<=' should have exactly one parameter.
+//   operator <=(a, [b]) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:97:12: Error: Operator '>=' should have exactly one parameter.
+//   operator >=(a, [b]) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:98:12: Error: Operator '-' should have zero or one parameter.
+// With zero parameters, it has the syntactic form '-a', formally known as 'unary-'. With one parameter, it has the syntactic form 'a - b', formally known as '-'.
+//   operator -(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:99:12: Error: Operator '+' should have exactly one parameter.
+//   operator +(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:100:12: Error: Operator '/' should have exactly one parameter.
+//   operator /(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:101:12: Error: Operator '~/' should have exactly one parameter.
+//   operator ~/(a, [b]) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:102:12: Error: Operator '*' should have exactly one parameter.
+//   operator *(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:103:12: Error: Operator '%' should have exactly one parameter.
+//   operator %(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:104:12: Error: Operator '|' should have exactly one parameter.
+//   operator |(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:105:12: Error: Operator '^' should have exactly one parameter.
+//   operator ^(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:106:12: Error: Operator '&' should have exactly one parameter.
+//   operator &(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:107:12: Error: Operator '<<' should have exactly one parameter.
+//   operator <<(a, [b]) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:108:12: Error: Operator '>>' should have exactly one parameter.
+//   operator >>(a, [b]) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:109:12: Error: Operator '[]=' should have exactly two parameters.
+//   operator []=(a, b, [c]) => true;
+//            ^^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:110:12: Error: Operator '[]' should have exactly one parameter.
+//   operator [](a, [b]) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:111:12: Error: Operator '~' shouldn't have any parameters.
+//   operator ~(a, [b]) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:115:12: Error: Operator '==' should have exactly one parameter.
+//   operator ==(a, {b}) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:116:12: Error: Operator '<' should have exactly one parameter.
+//   operator <(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:117:12: Error: Operator '>' should have exactly one parameter.
+//   operator >(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:118:12: Error: Operator '<=' should have exactly one parameter.
+//   operator <=(a, {b}) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:119:12: Error: Operator '>=' should have exactly one parameter.
+//   operator >=(a, {b}) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:120:12: Error: Operator '-' should have zero or one parameter.
+// With zero parameters, it has the syntactic form '-a', formally known as 'unary-'. With one parameter, it has the syntactic form 'a - b', formally known as '-'.
+//   operator -(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:121:12: Error: Operator '+' should have exactly one parameter.
+//   operator +(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:122:12: Error: Operator '/' should have exactly one parameter.
+//   operator /(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:123:12: Error: Operator '~/' should have exactly one parameter.
+//   operator ~/(a, {b}) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:124:12: Error: Operator '*' should have exactly one parameter.
+//   operator *(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:125:12: Error: Operator '%' should have exactly one parameter.
+//   operator %(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:126:12: Error: Operator '|' should have exactly one parameter.
+//   operator |(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:127:12: Error: Operator '^' should have exactly one parameter.
+//   operator ^(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:128:12: Error: Operator '&' should have exactly one parameter.
+//   operator &(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:129:12: Error: Operator '<<' should have exactly one parameter.
+//   operator <<(a, {b}) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:130:12: Error: Operator '>>' should have exactly one parameter.
+//   operator >>(a, {b}) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:131:12: Error: Operator '[]=' should have exactly two parameters.
+//   operator []=(a, b, {c}) => true;
+//            ^^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:132:12: Error: Operator '[]' should have exactly one parameter.
+//   operator [](a, {b}) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:133:12: Error: Operator '~' shouldn't have any parameters.
+//   operator ~(a, {b}) => true;
+//            ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:137:15: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator ==<T>(a) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:138:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator ><T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:139:15: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator <=<T>(a) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:140:15: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator >=<T>(a) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:141:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator -<T>() => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:142:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator -<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:143:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator +<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:144:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator /<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:145:15: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator ~/<T>(a) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:146:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator *<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:147:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator %<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:148:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator |<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:149:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator ^<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:150:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator &<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:151:15: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator <<<T>(a) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:152:15: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator >><T>(a) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:153:16: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator []=<T>(a, b) => true;
+//                ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:154:15: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator []<T>(a) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:155:14: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator ~<T>() => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:137:12: Error: Can't infer types for '==' as the overridden members don't have a combined signature.
+// Try adding explicit types.
+//   operator ==<T>(a) => true;
+//            ^^
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is one of the overridden members.
+//   external bool operator ==(Object other);
+//                          ^^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:6:12: Error: The method 'Operators1.==' has fewer positional arguments than those of overridden method 'Object.=='.
+//   operator ==() => true;
+//            ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:27:12: Error: The method 'Operators2.==' has more required arguments than those of overridden method 'Object.=='.
+//   operator ==(a, b) => true;
+//            ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:71:12: Error: The method 'Operators4.==' has fewer positional arguments than those of overridden method 'Object.=='.
+//   operator ==({a}) => true;
+//            ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
+//
+// pkg/front_end/testcases/general/invalid_operator.dart:137:12: Error: Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
+//   operator ==<T>(a) => true;
+//            ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Operators1 extends core::Object {
+  synthetic constructor •() → self::Operators1*
+    : super core::Object::•()
+    ;
+  operator ==() → core::bool*
+    return true;
+  operator <() → dynamic
+    return true;
+  operator >() → dynamic
+    return true;
+  operator <=() → dynamic
+    return true;
+  operator >=() → dynamic
+    return true;
+  operator +() → dynamic
+    return true;
+  operator /() → dynamic
+    return true;
+  operator ~/() → dynamic
+    return true;
+  operator *() → dynamic
+    return true;
+  operator %() → dynamic
+    return true;
+  operator |() → dynamic
+    return true;
+  operator ^() → dynamic
+    return true;
+  operator &() → dynamic
+    return true;
+  operator <<() → dynamic
+    return true;
+  operator >>() → dynamic
+    return true;
+  operator []=(dynamic a, dynamic b, dynamic c) → void
+    return true;
+  operator []() → dynamic
+    return true;
+  operator ~(dynamic a) → dynamic
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Operators2 extends core::Object {
+  synthetic constructor •() → self::Operators2*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic a, dynamic b) → core::bool*
+    return true;
+  operator <(dynamic a, dynamic b) → dynamic
+    return true;
+  operator >(dynamic a, dynamic b) → dynamic
+    return true;
+  operator <=(dynamic a, dynamic b) → dynamic
+    return true;
+  operator >=(dynamic a, dynamic b) → dynamic
+    return true;
+  operator -(dynamic a, dynamic b) → dynamic
+    return true;
+  operator +(dynamic a, dynamic b) → dynamic
+    return true;
+  operator /(dynamic a, dynamic b) → dynamic
+    return true;
+  operator ~/(dynamic a, dynamic b) → dynamic
+    return true;
+  operator *(dynamic a, dynamic b) → dynamic
+    return true;
+  operator %(dynamic a, dynamic b) → dynamic
+    return true;
+  operator |(dynamic a, dynamic b) → dynamic
+    return true;
+  operator ^(dynamic a, dynamic b) → dynamic
+    return true;
+  operator &(dynamic a, dynamic b) → dynamic
+    return true;
+  operator <<(dynamic a, dynamic b) → dynamic
+    return true;
+  operator >>(dynamic a, dynamic b) → dynamic
+    return true;
+  operator []=(dynamic a, dynamic b, dynamic c) → void
+    return true;
+  operator [](dynamic a, dynamic b) → dynamic
+    return true;
+  operator ~(dynamic a, dynamic b) → dynamic
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Operators3 extends core::Object {
+  synthetic constructor •() → self::Operators3*
+    : super core::Object::•()
+    ;
+  operator ==([dynamic a = #C1]) → core::bool*
+    return true;
+  operator <([dynamic a = #C1]) → dynamic
+    return true;
+  operator >([dynamic a = #C1]) → dynamic
+    return true;
+  operator <=([dynamic a = #C1]) → dynamic
+    return true;
+  operator >=([dynamic a = #C1]) → dynamic
+    return true;
+  operator -([dynamic a = #C1]) → dynamic
+    return true;
+  operator +([dynamic a = #C1]) → dynamic
+    return true;
+  operator /([dynamic a = #C1]) → dynamic
+    return true;
+  operator ~/([dynamic a = #C1]) → dynamic
+    return true;
+  operator *([dynamic a = #C1]) → dynamic
+    return true;
+  operator %([dynamic a = #C1]) → dynamic
+    return true;
+  operator |([dynamic a = #C1]) → dynamic
+    return true;
+  operator ^([dynamic a = #C1]) → dynamic
+    return true;
+  operator &([dynamic a = #C1]) → dynamic
+    return true;
+  operator <<([dynamic a = #C1]) → dynamic
+    return true;
+  operator >>([dynamic a = #C1]) → dynamic
+    return true;
+  operator []=([dynamic a = #C1, dynamic b = #C1]) → void
+    return true;
+  operator []([dynamic a = #C1]) → dynamic
+    return true;
+  operator ~([dynamic a = #C1]) → dynamic
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Operators4 extends core::Object {
+  synthetic constructor •() → self::Operators4*
+    : super core::Object::•()
+    ;
+  operator ==({dynamic a = #C1}) → core::bool*
+    return true;
+  operator <({dynamic a = #C1}) → dynamic
+    return true;
+  operator >({dynamic a = #C1}) → dynamic
+    return true;
+  operator <=({dynamic a = #C1}) → dynamic
+    return true;
+  operator >=({dynamic a = #C1}) → dynamic
+    return true;
+  operator -({dynamic a = #C1}) → dynamic
+    return true;
+  operator +({dynamic a = #C1}) → dynamic
+    return true;
+  operator /({dynamic a = #C1}) → dynamic
+    return true;
+  operator ~/({dynamic a = #C1}) → dynamic
+    return true;
+  operator *({dynamic a = #C1}) → dynamic
+    return true;
+  operator %({dynamic a = #C1}) → dynamic
+    return true;
+  operator |({dynamic a = #C1}) → dynamic
+    return true;
+  operator ^({dynamic a = #C1}) → dynamic
+    return true;
+  operator &({dynamic a = #C1}) → dynamic
+    return true;
+  operator <<({dynamic a = #C1}) → dynamic
+    return true;
+  operator >>({dynamic a = #C1}) → dynamic
+    return true;
+  operator []=({dynamic a = #C1, dynamic b = #C1}) → void
+    return true;
+  operator []({dynamic a = #C1}) → dynamic
+    return true;
+  operator ~({dynamic a = #C1}) → dynamic
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Operators5 extends core::Object {
+  synthetic constructor •() → self::Operators5*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic a, [dynamic b = #C1]) → core::bool*
+    return true;
+  operator <(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator >(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator <=(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator >=(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator -(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator +(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator /(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator ~/(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator *(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator %(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator |(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator ^(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator &(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator <<(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator >>(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator []=(dynamic a, dynamic b, [dynamic c = #C1]) → void
+    return true;
+  operator [](dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  operator ~(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Operators6 extends core::Object {
+  synthetic constructor •() → self::Operators6*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic a, {dynamic b = #C1}) → core::bool*
+    return true;
+  operator <(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator >(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator <=(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator >=(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator -(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator +(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator /(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator ~/(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator *(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator %(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator |(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator ^(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator &(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator <<(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator >>(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator []=(dynamic a, dynamic b, {dynamic c = #C1}) → void
+    return true;
+  operator [](dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  operator ~(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Operators7 extends core::Object {
+  synthetic constructor •() → self::Operators7*
+    : super core::Object::•()
+    ;
+  operator ==<T extends core::Object* = dynamic>(invalid-type a) → invalid-type
+    return true;
+  operator ><T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator <=<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator >=<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator unary-<T extends core::Object* = dynamic>() → dynamic
+    return true;
+  operator -<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator +<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator /<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator ~/<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator *<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator %<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator |<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator ^<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator &<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator <<<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator >><T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator []=<T extends core::Object* = dynamic>(dynamic a, dynamic b) → void
+    return true;
+  operator []<T extends core::Object* = dynamic>(dynamic a) → dynamic
+    return true;
+  operator ~<T extends core::Object* = dynamic>() → dynamic
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.weak.outline.expect b/pkg/front_end/testcases/general/invalid_operator.dart.weak.outline.expect
index c1ee228..c9f7e40 100644
--- a/pkg/front_end/testcases/general/invalid_operator.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.weak.outline.expect
@@ -564,35 +564,35 @@
 // Try adding explicit types.
 //   operator ==<T>(a) => true;
 //            ^^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is one of the overridden members.
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is one of the overridden members.
 //   external bool operator ==(Object other);
 //                          ^^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:6:12: Error: The method 'Operators1.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   operator ==() => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:27:12: Error: The method 'Operators2.==' has more required arguments than those of overridden method 'Object.=='.
 //   operator ==(a, b) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:71:12: Error: The method 'Operators4.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   operator ==({a}) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
 // pkg/front_end/testcases/general/invalid_operator.dart:137:12: Error: Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
 //   operator ==<T>(a) => true;
 //            ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
diff --git a/pkg/front_end/testcases/general/invalid_operator2.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_operator2.dart.weak.modular.expect
new file mode 100644
index 0000000..7ad624a
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_operator2.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_operator2.dart:6:12: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator <<T>(a) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator2.dart:6:14: Error: Expected '{' before this.
+//   operator <<T>(a) => true;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator2.dart:6:12: Error: Operator '<<' should have exactly one parameter.
+//   operator <<T>(a) => true;
+//            ^^
+//
+// pkg/front_end/testcases/general/invalid_operator2.dart:6:15: Error: Operator declarations must be preceded by the keyword 'operator'.
+// Try adding the keyword 'operator'.
+//   operator <<T>(a) => true;
+//               ^
+//
+// pkg/front_end/testcases/general/invalid_operator2.dart:6:14: Error: Type 'T' not found.
+//   operator <<T>(a) => true;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Operators7 extends core::Object {
+  synthetic constructor •() → self::Operators7*
+    : super core::Object::•()
+    ;
+  operator <<() → dynamic {}
+  operator >(dynamic a) → invalid-type
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_operator_override.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_operator_override.dart.weak.modular.expect
new file mode 100644
index 0000000..aad884f
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_operator_override.dart.weak.modular.expect
@@ -0,0 +1,120 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_operator_override.dart:13:18: Error: The parameter 'b' of the method 'B.+' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'A.+'.
+//  - 'B' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   A operator +(B b) => b;
+//                  ^
+// pkg/front_end/testcases/general/invalid_operator_override.dart:6:14: Context: This is the overridden method ('+').
+//   A operator +(A a) => a;
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator_override.dart:14:14: Error: The return type of the method 'B.unary-' is 'A', which does not match the return type, 'B', of the overridden method, 'A.unary-'.
+//  - 'A' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+// Change to a subtype of 'B'.
+//   A operator -() => this;
+//              ^
+// pkg/front_end/testcases/general/invalid_operator_override.dart:7:14: Context: This is the overridden method ('unary-').
+//   B operator -() => new B();
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator_override.dart:15:19: Error: The parameter 'b' of the method 'B.[]' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'A.[]'.
+//  - 'B' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   B operator [](B b) => b;
+//                   ^
+// pkg/front_end/testcases/general/invalid_operator_override.dart:8:14: Context: This is the overridden method ('[]').
+//   B operator [](A a) => new B();
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator_override.dart:16:23: Error: The parameter 'b' of the method 'B.[]=' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'A.[]='.
+//  - 'B' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void operator []=(B b, A a) {}
+//                       ^
+// pkg/front_end/testcases/general/invalid_operator_override.dart:9:17: Context: This is the overridden method ('[]=').
+//   void operator []=(A a1, A a2) {}
+//                 ^
+//
+// pkg/front_end/testcases/general/invalid_operator_override.dart:20:14: Error: The return type of the method 'C.[]' is 'A', which does not match the return type, 'B', of the overridden method, 'A.[]'.
+//  - 'A' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+// Change to a subtype of 'B'.
+//   A operator [](B b) => b;
+//              ^
+// pkg/front_end/testcases/general/invalid_operator_override.dart:8:14: Context: This is the overridden method ('[]').
+//   B operator [](A a) => new B();
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator_override.dart:20:19: Error: The parameter 'b' of the method 'C.[]' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'A.[]'.
+//  - 'B' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   A operator [](B b) => b;
+//                   ^
+// pkg/front_end/testcases/general/invalid_operator_override.dart:8:14: Context: This is the overridden method ('[]').
+//   B operator [](A a) => new B();
+//              ^
+//
+// pkg/front_end/testcases/general/invalid_operator_override.dart:21:28: Error: The parameter 'b' of the method 'C.[]=' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'A.[]='.
+//  - 'B' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/invalid_operator_override.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void operator []=(A a, B b) {}
+//                            ^
+// pkg/front_end/testcases/general/invalid_operator_override.dart:9:17: Context: This is the overridden method ('[]=').
+//   void operator []=(A a1, A a2) {}
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(self::A* a) → self::A*
+    return a;
+  operator unary-() → self::B*
+    return new self::B::•();
+  operator [](self::A* a) → self::B*
+    return new self::B::•();
+  operator []=(self::A* a1, self::A* a2) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::B* b) → self::A*
+    return b;
+  operator unary-() → self::A*
+    return this;
+  operator [](self::B* b) → self::B*
+    return b;
+  operator []=(self::B* b, self::A* a) → void {}
+}
+class C extends self::A {
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+  operator [](self::B* b) → self::A*
+    return b;
+  operator []=(self::A* a, self::B* b) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_setter_return_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.weak.modular.expect
new file mode 100644
index 0000000..096efed
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.weak.modular.expect
@@ -0,0 +1,110 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:5:1: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+// int set setter1(_) {} // error
+// ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:6:1: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+// dynamic set setter2(_) {} // error
+// ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:11:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   int set setter1(_) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:12:3: Error: The return type of the operator []= must be 'void'.
+// Try changing the return type to 'void'.
+//   int operator []=(a, b) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:16:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   dynamic set setter2(_) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:17:3: Error: The return type of the operator []= must be 'void'.
+// Try changing the return type to 'void'.
+//   dynamic operator []=(a, b) {} // error
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1*
+    : super core::Object::•()
+    ;
+  set setter1(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2*
+    : super core::Object::•()
+    ;
+  set setter2(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class3 extends core::Object {
+  synthetic constructor •() → self::Class3*
+    : super core::Object::•()
+    ;
+  set setter3(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class4 extends core::Object {
+  synthetic constructor •() → self::Class4*
+    : super core::Object::•()
+    ;
+  set setter4(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static set setter1(dynamic _) → void {}
+static set setter2(dynamic _) → void {}
+static set setter3(dynamic _) → void {}
+static set setter4(dynamic _) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_super_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_super_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..09921df
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_super_initializer.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_super_initializer.dart:8:8: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//   B(): super()?.foo() {}
+//        ^
+//
+// pkg/front_end/testcases/general/invalid_super_initializer.dart:8:8: Error: Expected an initializer.
+//   B(): super()?.foo() {}
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •() → self::B
+    : final dynamic #t1 = let final invalid-type #t2 = invalid-expression "pkg/front_end/testcases/general/invalid_super_initializer.dart:8:8: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+  B(): super()?.foo() {}
+       ^" in #t2 == null ?{dynamic} null : #t2{dynamic}.foo() {}
+}
+static method bad() → dynamic {
+  new self::B::•();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/invalid_type.dart.weak.modular.expect
new file mode 100644
index 0000000..5bf84b6
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_type.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
+//     this.bar();
+//     ^^^^
+//
+// pkg/front_end/testcases/general/invalid_type.dart:12:12: Error: 'Missing' isn't a type.
+//   (null as Missing).bar();
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/general/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+//   null.bar();
+//        ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static method foo() → dynamic {
+    invalid-expression "pkg/front_end/testcases/general/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
+    this.bar();
+    ^^^^"{dynamic}.bar();
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  (null as invalid-type){dynamic}.bar();
+  invalid-expression "pkg/front_end/testcases/general/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+  null.bar();
+       ^^^" in null{<unresolved>}.bar();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invocations.dart.weak.modular.expect b/pkg/front_end/testcases/general/invocations.dart.weak.modular.expect
new file mode 100644
index 0000000..64be843
--- /dev/null
+++ b/pkg/front_end/testcases/general/invocations.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invocations.dart:7:3: Error: Method not found: 'z'.
+//   z("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/general/invocations.dart:8:3: Error: Undefined name 'z'.
+//   z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/general/invocations.dart:9:3: Error: Undefined name 'y'.
+//   y.z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/general/invocations.dart:10:3: Error: Undefined name 'x'.
+//   x.y.z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/general/invocations.dart:14:7: Error: Method not found: 'z'.
+//       z("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/general/invocations.dart:15:7: Error: Undefined name 'z'.
+//       z.print("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/general/invocations.dart:16:7: Error: Undefined name 'y'.
+//       y.z.print("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/general/invocations.dart:17:7: Error: Undefined name 'x'.
+//       x.y.z.print("Hello, World!");
+//       ^
+//
+// pkg/front_end/testcases/general/invocations.dart:13:7: Error: This expression has type 'void' and can't be used.
+//       print("Hello, World!") +
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/general/invocations.dart:7:3: Error: Method not found: 'z'.
+  z(\"Hello, World!\");
+  ^";
+  invalid-expression "pkg/front_end/testcases/general/invocations.dart:8:3: Error: Undefined name 'z'.
+  z.print(\"Hello, World!\");
+  ^"{dynamic}.print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/general/invocations.dart:9:3: Error: Undefined name 'y'.
+  y.z.print(\"Hello, World!\");
+  ^"{<invalid>}.z{dynamic}.print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/general/invocations.dart:10:3: Error: Undefined name 'x'.
+  x.y.z.print(\"Hello, World!\");
+  ^"{<invalid>}.y{<invalid>}.z{dynamic}.print("Hello, World!");
+  1.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:13:7: Error: This expression has type 'void' and can't be used.
+      print(\"Hello, World!\") +
+      ^" in core::print("Hello, World!")){(core::num*) →* core::num*}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:14:7: Error: Method not found: 'z'.
+      z(\"Hello, World!\") +
+      ^"){(core::num*) →* core::num*}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:15:7: Error: Undefined name 'z'.
+      z.print(\"Hello, World!\") +
+      ^"{dynamic}.print("Hello, World!") as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:16:7: Error: Undefined name 'y'.
+      y.z.print(\"Hello, World!\") +
+      ^"{<invalid>}.z{dynamic}.print("Hello, World!") as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:17:7: Error: Undefined name 'x'.
+      x.y.z.print(\"Hello, World!\");
+      ^"{<invalid>}.y{<invalid>}.z{dynamic}.print("Hello, World!") as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+}
diff --git a/pkg/front_end/testcases/general/issue129167943.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue129167943.dart.weak.modular.expect
new file mode 100644
index 0000000..dbcaed7
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue129167943.dart.weak.modular.expect
@@ -0,0 +1,244 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method foo(core::num* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant-by-declaration core::int* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D1 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant-by-declaration core::int* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D2 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-declaration core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D3 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method foo(covariant-by-declaration core::num* x) → void;
+}
+abstract class D4 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D4*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant-by-declaration core::int* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D5 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D5*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant-by-declaration core::num* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract set foo(core::num* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class G extends core::Object implements self::E {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant-by-declaration core::int* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class H1 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H1*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant-by-declaration core::int* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class H2 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H2*
+    : super core::Object::•()
+    ;
+  set foo(covariant-by-declaration core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class H3 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub set foo(covariant-by-declaration core::num* x) → void;
+}
+abstract class H4 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H4*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant-by-declaration core::int* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class H5 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H5*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant-by-declaration core::num* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue31767.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue31767.dart.weak.modular.expect
new file mode 100644
index 0000000..af92d7d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue31767.dart.weak.modular.expect
@@ -0,0 +1,135 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue31767_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue31767_lib.dart";
+
+class C extends core::Object {
+  final field core::int* w;
+  constructor foo(core::int* x, [core::int* y = #C1, core::int* z = #C1]) → self::C*
+    : self::C::w = self::p("x", x).{core::num::+}(self::p("y", y)){(core::num*) →* core::int*}.{core::num::+}(self::p("z", z)){(core::num*) →* core::int*}, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M extends self::C /*isMixinDeclaration*/  {
+  get w2() → core::int*
+    return this.{self::C::w}{core::int*}.{core::num::*}(this.{self::C::w}{core::int*}){(core::num*) →* core::int*};
+}
+class D = self::C with self::M {
+  synthetic constructor foo(core::int* x, [core::int* y = #C1, core::int* z = #C1]) → self::D*
+    : super self::C::foo(x, y, z)
+    ;
+  mixin-super-stub get w2() → core::int*
+    return super.{self::M::w2};
+}
+abstract class N extends iss::A /*isMixinDeclaration*/  {
+  get w2() → core::int*
+    return this.{iss::A::w}{core::int*}.{core::num::*}(this.{iss::A::w}{core::int*}){(core::num*) →* core::int*};
+}
+class E = iss::A with self::N {
+  synthetic constructor foo(core::int* x, [core::int* y = #C2, core::int* z = #C2, iss::_A* a = #C4]) → self::E*
+    : super iss::A::foo(x, y, z, a)
+    ;
+  mixin-super-stub get w2() → core::int*
+    return super.{self::N::w2};
+}
+static field core::StringBuffer* sb;
+static method p(core::String* name, core::int* value) → core::int* {
+  self::sb.{core::StringBuffer::write}("${name} = ${value}, "){(core::Object*) →* void};
+  return value;
+}
+static method main() → dynamic {
+  self::sb = new core::StringBuffer::•();
+  iss::A* a = new iss::A::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 3, ", self::sb.{core::StringBuffer::toString}(){() →* core::String*});
+  self::expect(6, a.{iss::A::w}{core::int*});
+  self::expect(5, a.{iss::A::a}{iss::_A*}.{iss::_A::field}{core::int*});
+  self::sb = new core::StringBuffer::•();
+  self::C* c = new self::C::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 0, ", self::sb.{core::StringBuffer::toString}(){() →* core::String*});
+  self::expect(3, c.{self::C::w}{core::int*});
+  self::sb = new core::StringBuffer::•();
+  self::D* d = new self::D::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 0, ", self::sb.{core::StringBuffer::toString}(){() →* core::String*});
+  self::expect(3, d.{self::C::w}{core::int*});
+  self::expect(9, d.{self::D::w2}{core::int*});
+  self::sb = new core::StringBuffer::•();
+  self::E* e = new self::E::foo(1, 2);
+  self::expect("x = 1, y = 2, z = 3, ", self::sb.{core::StringBuffer::toString}(){() →* core::String*});
+  self::expect(6, e.{iss::A::w}{core::int*});
+  self::expect(36, e.{self::E::w2}{core::int*});
+  self::expect(5, e.{iss::A::a}{iss::_A*}.{iss::_A::field}{core::int*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+import "issue31767.dart" as self;
+
+import "org-dartlang-testcase:///issue31767.dart";
+
+class A extends core::Object {
+  final field core::int* w;
+  final field iss::_A* a;
+  constructor foo(core::int* x, [core::int* y = #C2, core::int* z = #C2, iss::_A* a = #C4]) → iss::A*
+    : iss::A::a = a, iss::A::w = self::p("x", x).{core::num::+}(self::p("y", y)){(core::num*) →* core::int*}.{core::num::+}(self::p("z", z)){(core::num*) →* core::int*}, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class _A extends core::Object /*hasConstConstructor*/  {
+  final field core::int* field;
+  const constructor •(core::int* field) → iss::_A*
+    : iss::_A::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* _private = #C2;
+
+constants  {
+  #C1 = 0
+  #C2 = 3
+  #C3 = 5
+  #C4 = iss::_A {field:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue31767.dart:
+- _A. (from org-dartlang-testcase:///issue31767_lib.dart:20:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+
+org-dartlang-testcase:///issue31767_lib.dart:
+- _A. (from org-dartlang-testcase:///issue31767_lib.dart:20:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
index 43bfbd8..d4d8c65 100644
--- a/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue31767.dart.weak.outline.expect
@@ -7,7 +7,7 @@
 
 class C extends core::Object {
   final field core::int* w;
-  constructor foo(core::int* x, [core::int* y, core::int* z]) → self::C*
+  constructor foo(core::int* x, [core::int* y = 0, core::int* z = 0]) → self::C*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -59,7 +59,7 @@
 class A extends core::Object {
   final field core::int* w;
   final field iss::_A* a;
-  constructor foo(core::int* x, [core::int* y, core::int* z, iss::_A* a]) → iss::A*
+  constructor foo(core::int* x, [core::int* y = iss::_private, core::int* z = iss::_private, iss::_A* a = const iss::_A::•(5)]) → iss::A*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -89,3 +89,10 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static const field core::int* _private = 3;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///issue31767_lib.dart:14:25 -> IntConstant(3)
+Evaluated: StaticGet @ org-dartlang-testcase:///issue31767_lib.dart:14:43 -> IntConstant(3)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue31767_lib.dart:14:68 -> InstanceConstant(const _A{_A.field: 5})
+Extra constant evaluation: evaluated: 13, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/issue34515.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue34515.dart.weak.modular.expect
new file mode 100644
index 0000000..6ca6a9d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34515.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue34515.dart:9:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/general/issue34515_lib1.dart' and 'pkg/front_end/testcases/general/issue34515_lib2.dart'.
+//   ImportedClass(1);
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue34515.dart:10:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/general/issue34515_lib1.dart' and 'pkg/front_end/testcases/general/issue34515_lib2.dart'.
+//   ImportedClass("a");
+//   ^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue34515_lib1.dart";
+import "org-dartlang-testcase:///issue34515_lib2.dart";
+
+static method test() → void {
+  let final core::Object* #t1 = 1 in invalid-expression "pkg/front_end/testcases/general/issue34515.dart:9:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/general/issue34515_lib1.dart' and 'pkg/front_end/testcases/general/issue34515_lib2.dart'.
+  ImportedClass(1);
+  ^^^^^^^^^^^^^";
+  let final core::Object* #t2 = "a" in invalid-expression "pkg/front_end/testcases/general/issue34515.dart:10:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/general/issue34515_lib1.dart' and 'pkg/front_end/testcases/general/issue34515_lib2.dart'.
+  ImportedClass(\"a\");
+  ^^^^^^^^^^^^^";
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class ImportedClass extends core::Object {
+  constructor •(core::int* a) → self2::ImportedClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class ImportedClass extends core::Object {
+  constructor •(core::String* a) → self3::ImportedClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/issue34714.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue34714.dart.weak.modular.expect
new file mode 100644
index 0000000..c0cc024
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34714.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    return new self::B::•<self::A::•::T*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends core::Object implements self::A<self::B::T*> {
+  constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+}
diff --git a/pkg/front_end/testcases/general/issue34899.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue34899.dart.weak.modular.expect
new file mode 100644
index 0000000..c1735e3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34899.dart.weak.modular.expect
@@ -0,0 +1,76 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  final field () →* asy::Future<dynamic>* quux;
+  covariant-by-class field self::Foo::T* t;
+  constructor •(() →* asy::Future<dynamic>* quux, self::Foo::T* t) → self::Foo<self::Foo::T*>*
+    : self::Foo::quux = quux, self::Foo::t = t, super core::Object::•()
+    ;
+  method call() → asy::Future<self::Foo::T*>*
+    return this.{self::Foo::quux}{() →* asy::Future<dynamic>*}(){() →* asy::Future<dynamic>*}.{asy::Future::then}<self::Foo::T*>((dynamic _) → self::Foo::T* => this.{self::Foo::t}{self::Foo::T*}){((dynamic) →* FutureOr<self::Foo::T*>*, {onError: core::Function*}) →* asy::Future<self::Foo::T*>*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object {
+  field self::Foo<self::Baz*>* qux = null;
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  method quuz() → asy::Future<void>*
+    return this.{self::Bar::qux}{self::Foo<self::Baz*>*}.{self::Foo::call}(){() →* asy::Future<self::Baz*>*}.{asy::Future::then}<self::Grault*>((self::Baz* baz) → self::Grault* => this.{self::Bar::corge}(baz){(self::Baz*) →* self::Grault*}){((self::Baz*) →* FutureOr<self::Grault*>*, {onError: core::Function*}) →* asy::Future<self::Grault*>*}.{asy::Future::then}<void>((self::Grault* grault) → void => this.{self::Bar::garply}(grault){(self::Grault*) →* void}){((self::Grault*) →* FutureOr<void>*, {onError: core::Function*}) →* asy::Future<void>*};
+  method corge(self::Baz* baz) → self::Grault*
+    return null;
+  method garply(self::Grault* grault) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Baz extends core::Object {
+  synthetic constructor •() → self::Baz*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Grault extends core::Object {
+  synthetic constructor •() → self::Grault*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue35875.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue35875.dart.weak.modular.expect
new file mode 100644
index 0000000..fe26450
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue35875.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* a = null;
+  constructor •(core::int* a) → self::A*
+    : super core::Object::•() {
+    this.{self::A::a} = a;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue37027.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue37027.dart.weak.modular.expect
new file mode 100644
index 0000000..eeb421b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37027.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class C extends core::Object {
+  final field core::Set<core::int> s;
+  constructor •(core::List<core::int> ell) → self::C
+    : self::C::s = block {
+      final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
+      for (core::int e in ell)
+        if(e.{core::int::isOdd}{core::bool})
+          #t1.{core::Set::add}{Invariant}(2.{core::num::*}(e){(core::num) → core::int}){(core::int) → core::bool};
+    } =>#t1, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue37381.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue37381.dart.weak.modular.expect
new file mode 100644
index 0000000..8ec0e22
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37381.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  method f<R extends core::Object* = dynamic>(<X extends core::Object* = dynamic>(self::A<X*>*) →* self::A::f::R* f) → self::A::f::R*
+    return f<self::A::X*>(this){(self::A<self::A::X*>*) →* self::A::f::R*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A<core::num*>* a = new self::A::•<core::int*>();
+  a.{self::A::f}<core::int*>(<X extends core::Object* = dynamic>(self::A<X*>* _) → core::int* => 42){(<X extends core::Object* = dynamic>(self::A<X*>*) →* core::int*) →* core::int*};
+}
diff --git a/pkg/front_end/testcases/general/issue37753.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue37753.dart.weak.modular.expect
new file mode 100644
index 0000000..8ce1e9b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37753.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method getElements() → core::Iterable<core::int*>* sync* {
+  core::Iterable<core::int*>* elements;
+  elements = (() → core::Iterable<core::int*>* sync* {
+    yield 7;
+  })(){() →* core::Iterable<core::int*>*};
+  yield* elements;
+}
+static method main() → dynamic
+  return core::print(self::getElements());
diff --git a/pkg/front_end/testcases/general/issue37776.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue37776.dart.weak.modular.expect
new file mode 100644
index 0000000..7840a4b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37776.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue37776.dart:11:7: Error: 'X' is already declared in this scope.
+// class X {
+//       ^
+// pkg/front_end/testcases/general/issue37776.dart:7:7: Context: Previous declaration of 'X'.
+// class X {
+//       ^
+//
+// pkg/front_end/testcases/general/issue37776.dart:16:9: Error: Couldn't find constructor 'X.foo'.
+//   const X.foo();
+//         ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class X#1 extends core::Object /*hasConstConstructor*/  {
+  const constructor foo() → self::X#1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class X extends core::Object /*hasConstConstructor*/  {
+  const constructor foo() → self::X*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  invalid-expression "pkg/front_end/testcases/general/issue37776.dart:16:9: Error: Couldn't find constructor 'X.foo'.
+  const X.foo();
+        ^^^";
+}
diff --git a/pkg/front_end/testcases/general/issue38253.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue38253.dart.weak.modular.expect
new file mode 100644
index 0000000..293f3f6
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue38253.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue38253.dart:9:1: Error: Expected ';' after this.
+// }
+// ^
+//
+// pkg/front_end/testcases/general/issue38253.dart:6:3: Error: 'g' isn't a type.
+//   g f(){
+//   ^
+//
+// pkg/front_end/testcases/general/issue38253.dart:7:5: Error: A value must be explicitly returned from a non-void function.
+//     return;
+//     ^
+//
+import self as self;
+
+static field () → Null a = () → Null {
+  function f() → invalid-type {
+    return invalid-expression "pkg/front_end/testcases/general/issue38253.dart:7:5: Error: A value must be explicitly returned from a non-void function.
+    return;
+    ^" in null;
+  }
+};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue38253b.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue38253b.dart.weak.modular.expect
new file mode 100644
index 0000000..3d3ebd1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue38253b.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue38253b.dart:6:3: Error: 'g' isn't a type.
+//   g f1() {
+//   ^
+//
+// pkg/front_end/testcases/general/issue38253b.dart:10:3: Error: 'g' isn't a type.
+//   g f2() async {
+//   ^
+//
+// pkg/front_end/testcases/general/issue38253b.dart:7:5: Error: A value must be explicitly returned from a non-void function.
+//     return;
+//     ^
+//
+// pkg/front_end/testcases/general/issue38253b.dart:11:5: Error: A value must be explicitly returned from a non-void async function.
+//     return;
+//     ^
+//
+import self as self;
+
+static field () → Null a = () → Null {
+  function f1() → invalid-type {
+    return invalid-expression "pkg/front_end/testcases/general/issue38253b.dart:7:5: Error: A value must be explicitly returned from a non-void function.
+    return;
+    ^" in null;
+  }
+  function f2() → invalid-type async {
+    return invalid-expression "pkg/front_end/testcases/general/issue38253b.dart:11:5: Error: A value must be explicitly returned from a non-void async function.
+    return;
+    ^" in null;
+  }
+};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue38253c.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue38253c.dart.weak.modular.expect
new file mode 100644
index 0000000..2de98d4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue38253c.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue38253c.dart:6:3: Error: 'g' isn't a type.
+//   g f1() {}
+//   ^
+//
+// pkg/front_end/testcases/general/issue38253c.dart:7:3: Error: 'g' isn't a type.
+//   g f2() async {}
+//   ^
+//
+// pkg/front_end/testcases/general/issue38253c.dart:8:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   int f3() {}
+//   ^
+//
+// pkg/front_end/testcases/general/issue38253c.dart:9:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   Future<int> f4() async {}
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static field () → Null a = () → Null {
+  function f1() → invalid-type {}
+  function f2() → invalid-type async {}
+  function f3() → core::int {
+    return invalid-expression "pkg/front_end/testcases/general/issue38253c.dart:8:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  int f3() {}
+  ^" in null;
+  }
+  function f4() → asy::Future<core::int> async {
+    return invalid-expression "pkg/front_end/testcases/general/issue38253c.dart:9:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  Future<int> f4() async {}
+  ^" in null;
+  }
+};
+static field (dynamic) → asy::Future<dynamic> b = (dynamic f) → asy::Future<dynamic> async => await f;
+static field (dynamic) → dynamic c = (dynamic f) → dynamic => f;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue38812.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue38812.dart.weak.modular.expect
new file mode 100644
index 0000000..1bcd793
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue38812.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef G<unrelated X extends core::Object* = dynamic> = () →* void;
+class A<X extends () →* void, Y extends () →* void> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*, self::A::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•<() →* void, () →* void>();
+}
diff --git a/pkg/front_end/testcases/general/issue38938.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue38938.dart.weak.modular.expect
new file mode 100644
index 0000000..2ed9c3f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue38938.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue38938.dart:7:7: Error: 'v' is already declared in this scope.
+//   int v;
+//       ^
+// pkg/front_end/testcases/general/issue38938.dart:6:7: Context: Previous declaration of 'v'.
+//   int v;
+//       ^
+//
+// pkg/front_end/testcases/general/issue38938.dart:8:10: Error: Can't use 'v' because it is declared more than once.
+//   A(this.v);
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* v = null;
+  constructor •(core::int* v) → self::A*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue38938.dart:8:10: Error: Can't use 'v' because it is declared more than once.
+  A(this.v);
+         ^"
+    ;
+  constructor second() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/issue38943.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue38943.dart.weak.modular.expect
new file mode 100644
index 0000000..c723406
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue38943.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class D<X extends () →* void> extends core::Object {
+  constructor _() → self::D<self::D::X*>*
+    : super core::Object::•() {}
+  static factory foo<X extends () →* void>() → self::D<self::D::foo::X*>*
+    return new self::D::_<self::D::foo::X*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(self::D::foo<() →* void>());
+}
diff --git a/pkg/front_end/testcases/general/issue38944.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue38944.dart.weak.modular.expect
new file mode 100644
index 0000000..6ac58de
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue38944.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue38944.dart:6:7: Error: Can't use implicitly 'out' variable 'X' in an 'inout' position in supertype 'A'.
+// class B<X> extends Object with A<void Function<Y extends X>()> {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<Q extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::Q*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _B&Object&A<X extends core::Object* = dynamic> extends core::Object /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<X extends core::Object* = dynamic> extends self::_B&Object&A<self::B::X*> {
+  synthetic constructor •() → self::B<self::B::X*>*
+    : super self::_B&Object&A::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/issue38961.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue38961.dart.weak.modular.expect
new file mode 100644
index 0000000..a588600
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue38961.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue38961.dart:7:7: Error: 'x' is already declared in this scope.
+//   var x = this;
+//       ^
+// pkg/front_end/testcases/general/issue38961.dart:6:11: Context: Previous declaration of 'x'.
+//   dynamic x = this;
+//           ^
+//
+// pkg/front_end/testcases/general/issue38961.dart:6:15: Error: Can't access 'this' in a field initializer.
+//   dynamic x = this;
+//               ^^^^
+//
+// pkg/front_end/testcases/general/issue38961.dart:7:11: Error: Can't access 'this' in a field initializer.
+//   var x = this;
+//           ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic x = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/issue39344.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue39344.dart.weak.modular.expect
new file mode 100644
index 0000000..fd2787d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue39344.dart.weak.modular.expect
@@ -0,0 +1,116 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue39344.dart:19:12: Error: A value of type 'List<T>' can't be assigned to a variable of type 'List<B>'.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/general/issue39344.dart'.
+//       xs = ys;
+//            ^
+//
+// pkg/front_end/testcases/general/issue39344.dart:31:13: Error: A value of type 'List<List<T>>' can't be assigned to a variable of type 'List<List<B>>'.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/general/issue39344.dart'.
+//       xss = yss;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class Class<T extends self::A*> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  method method1a(covariant-by-class self::Class::T* t) → void {
+    if(t is self::B*) {
+      core::List<self::Class::T*>* ys = <self::Class::T*>[t{self::Class::T* & self::B* /* '*' & '*' = '*' */}];
+      self::xs = invalid-expression "pkg/front_end/testcases/general/issue39344.dart:19:12: Error: A value of type 'List<T>' can't be assigned to a variable of type 'List<B>'.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/general/issue39344.dart'.
+      xs = ys;
+           ^" in ys as{TypeError} core::List<self::B*>*;
+    }
+  }
+  method method1b(covariant-by-class self::Class::T* t) → void {
+    if(t is self::B*) {
+      core::List<core::List<self::Class::T*>*>* yss = <core::List<self::Class::T*>*>[<self::Class::T*>[t{self::Class::T* & self::B* /* '*' & '*' = '*' */}]];
+      self::xss = invalid-expression "pkg/front_end/testcases/general/issue39344.dart:31:13: Error: A value of type 'List<List<T>>' can't be assigned to a variable of type 'List<List<B>>'.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/general/issue39344.dart'.
+      xss = yss;
+            ^" in yss as{TypeError} core::List<core::List<self::B*>*>*;
+    }
+  }
+  method method2a(covariant-by-class self::Class::T* t) → void {
+    dynamic alias;
+    if(t is self::B*) {
+      core::List<self::Class::T*>* ys = <self::Class::T*>[t{self::Class::T* & self::B* /* '*' & '*' = '*' */}];
+      alias = ys;
+      self::xs = alias as{TypeError,ForDynamic} core::List<self::B*>*;
+    }
+  }
+  method method2b(covariant-by-class self::Class::T* t) → void {
+    dynamic alias;
+    if(t is self::B*) {
+      core::List<core::List<self::Class::T*>*>* yss = <core::List<self::Class::T*>*>[<self::Class::T*>[t{self::Class::T* & self::B* /* '*' & '*' = '*' */}]];
+      alias = yss;
+      self::xss = alias as{TypeError,ForDynamic} core::List<core::List<self::B*>*>*;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::B*>* xs;
+static field core::List<core::List<self::B*>*>* xss;
+static method main() → void {
+  self::throws(() → Null {
+    new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•()){(self::A*) →* void};
+    core::print(self::xs.{core::Object::runtimeType}{core::Type*});
+  });
+  self::throws(() → Null {
+    new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•()){(self::A*) →* void};
+    core::print(self::xs.{core::Object::runtimeType}{core::Type*});
+  });
+}
+static method errors() → void {
+  new self::Class::•<self::A*>().{self::Class::method1a}(new self::B::•()){(self::A*) →* void};
+  new self::Class::•<self::A*>().{self::Class::method1b}(new self::B::•()){(self::A*) →* void};
+}
+static method throws(() →* void f) → void {
+  try {
+    f(){() →* void};
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+    return;
+  }
+  throw "Expected throws";
+}
diff --git a/pkg/front_end/testcases/general/issue39421.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue39421.dart.weak.modular.expect
new file mode 100644
index 0000000..cb1d71a
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue39421.dart.weak.modular.expect
@@ -0,0 +1,78 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue39421.dart:9:7: Error: 'A' is already declared in this scope.
+// class A {}
+//       ^
+// pkg/front_end/testcases/general/issue39421.dart:7:7: Context: Previous declaration of 'A'.
+// class A {}
+//       ^
+//
+// pkg/front_end/testcases/general/issue39421.dart:16:12: Error: 'A' isn't a type.
+//   foo(List<A> a) {}
+//            ^
+// pkg/front_end/testcases/general/issue39421.dart:16:12: Context: This isn't a type.
+//   foo(List<A> a) {}
+//            ^
+//
+// pkg/front_end/testcases/general/issue39421.dart:16:12: Error: Can't use 'A' because it is declared more than once.
+//   foo(List<A> a) {}
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A#1 extends core::Object {
+  synthetic constructor •() → self::A#1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo(core::List<Null>* a) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  method foo(core::List<invalid-type>* a) → dynamic {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue39817.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue39817.dart.weak.modular.expect
new file mode 100644
index 0000000..cad4f51
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue39817.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+
+static method foo() → dynamic {
+  Null _null;
+  for (dynamic i in _null) {
+  }
+  ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue40242.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue40242.dart.weak.modular.expect
new file mode 100644
index 0000000..69ece96a
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue40242.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue40242.dart:9:5: Error: Can't assign to 'this'.
+//     this = new C();
+//     ^^^^
+//
+// pkg/front_end/testcases/general/issue40242.dart:15:3: Error: Can't assign to the final variable 'c1'.
+//   c1 = new C();
+//   ^^
+//
+// pkg/front_end/testcases/general/issue40242.dart:16:3: Error: Can't assign to a type literal.
+//   C = Object;
+//   ^
+//
+// pkg/front_end/testcases/general/issue40242.dart:18:6: Error: Can't assign to a parenthesized expression.
+//   (c2) = new C();
+//      ^
+//
+// pkg/front_end/testcases/general/issue40242.dart:20:3: Error: Can't assign to the const variable 'c3'.
+//   c3 = null;
+//   ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension E on self::C* {
+  method errors = self::E|errors;
+  tearoff errors = self::E|get#errors;
+}
+static method E|errors(lowered final self::C* #this) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:9:5: Error: Can't assign to 'this'.
+    this = new C();
+    ^^^^";
+}
+static method E|get#errors(lowered final self::C* #this) → () →* dynamic
+  return () → dynamic => self::E|errors(#this);
+static method errors() → dynamic {
+  final self::C* c1 = new self::C::•();
+  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:15:3: Error: Can't assign to the final variable 'c1'.
+  c1 = new C();
+  ^^";
+  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:16:3: Error: Can't assign to a type literal.
+  C = Object;
+  ^";
+  self::C* c2;
+  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:18:6: Error: Can't assign to a parenthesized expression.
+  (c2) = new C();
+     ^";
+  invalid-expression "pkg/front_end/testcases/general/issue40242.dart:20:3: Error: Can't assign to the const variable 'c3'.
+  c3 = null;
+  ^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue40428.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue40428.dart.weak.modular.expect
new file mode 100644
index 0000000..d89d308
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue40428.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue40428.dart:28:19: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//   new NamedMixin1(0);
+//                   ^
+//
+// pkg/front_end/testcases/general/issue40428.dart:29:19: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//   new NamedMixin2(0);
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class SuperClass1 extends core::Object {
+  final field core::String* value;
+  constructor •(core::String* value) → self::SuperClass1*
+    : self::SuperClass1::value = value, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class SuperClass2 extends core::Object {
+  final field core::String* value;
+  constructor •(core::String* i) → self::SuperClass2*
+    : self::SuperClass2::value = i, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NamedMixin1 = self::SuperClass1 with self::Mixin {
+  synthetic constructor •(core::String* value) → self::NamedMixin1*
+    : super self::SuperClass1::•(value)
+    ;
+}
+class NamedMixin2 = self::SuperClass2 with self::Mixin {
+  synthetic constructor •(core::String* i) → self::NamedMixin2*
+    : super self::SuperClass2::•(i)
+    ;
+}
+static method main() → void {
+  new self::NamedMixin1::•("");
+  new self::NamedMixin2::•("");
+}
+static method errors() → dynamic {
+  new self::NamedMixin1::•(invalid-expression "pkg/front_end/testcases/general/issue40428.dart:28:19: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+  new NamedMixin1(0);
+                  ^" in 0 as{TypeError} core::String*);
+  new self::NamedMixin2::•(invalid-expression "pkg/front_end/testcases/general/issue40428.dart:29:19: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+  new NamedMixin2(0);
+                  ^" in 0 as{TypeError} core::String*);
+}
diff --git a/pkg/front_end/testcases/general/issue40662.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue40662.dart.weak.modular.expect
new file mode 100644
index 0000000..dc6a6d8
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue40662.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method bar(core::int* a, core::List<core::int*>* b) → dynamic {
+  self::expect(1.{core::int::unary-}(){() →* core::int*}, a);
+  self::expect(1.{core::int::unary-}(){() →* core::int*}, b.{core::List::[]}(0){(core::int*) →* core::int*}.{core::num::-}(2){(core::num*) →* core::int*});
+}
+static method foo(core::int* x) → dynamic async 
+  return self::bar(x.{core::num::-}(1){(core::num*) →* core::int*}, !(x == null) ?{core::List<core::int*>*} <core::int*>[x.{core::num::+}(1){(core::num*) →* core::int*}, x.{core::num::+}(2){(core::num*) →* core::int*}, await null] : null);
+static method main() → void async 
+  return await self::foo(0);
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/general/issue40744.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue40744.dart.weak.modular.expect
new file mode 100644
index 0000000..cab8593
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue40744.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::Map<core::String*, dynamic>* generatorConfigDefaultJson = #C3;
+static method helper(core::Map<core::String*, dynamic>* input) → void {
+  core::print(input);
+}
+static method main() → void {
+  final core::Map<core::String*, Null>* nullValueMap = core::Map::fromEntries<core::String*, Null>(#C3.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, dynamic>*>*}.{core::Iterable::map}<core::MapEntry<core::String*, Null>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, Null>* => new core::MapEntry::_<core::String*, Null>(e.{core::MapEntry::key}{core::String*}, null)){((core::MapEntry<core::String*, dynamic>*) →* core::MapEntry<core::String*, Null>*) →* core::Iterable<core::MapEntry<core::String*, Null>*>*});
+  self::helper(nullValueMap);
+}
+
+constants  {
+  #C1 = "a"
+  #C2 = 1
+  #C3 = <core::String*, dynamic>{#C1:#C2)
+}
diff --git a/pkg/front_end/testcases/general/issue40982.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue40982.dart.weak.modular.expect
new file mode 100644
index 0000000..9eb651c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue40982.dart.weak.modular.expect
@@ -0,0 +1,109 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue40982.dart:28:9: Error: A constant constructor can't call a non-constant super constructor.
+//   const E1();
+//         ^
+//
+// pkg/front_end/testcases/general/issue40982.dart:34:9: Error: A constant constructor can't call a non-constant super constructor.
+//   const E3();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object /*isMixinDeclaration*/  {
+  static const field core::int* value = #C1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C1&A&B = self::A with self::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C1&A&B*
+    : super self::A::•()
+    ;
+}
+class C1 extends self::_C1&A&B /*hasConstConstructor*/  {
+  const constructor •() → self::C1*
+    : super self::_C1&A&B::•()
+    ;
+}
+class C2 = self::A with self::B /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::C2*
+    : super self::A::•()
+    ;
+}
+class C3 extends self::C2 /*hasConstConstructor*/  {
+  const constructor •() → self::C3*
+    : super self::C2::•()
+    ;
+}
+abstract class D extends core::Object /*isMixinDeclaration*/  {
+  field core::int* value = 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E1&A&D = self::A with self::D /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_E1&A&D*
+    : super self::A::•()
+    ;
+  mixin-super-stub get value() → core::int*
+    return super.{self::D::value};
+  mixin-super-stub set value(core::int* value) → void
+    return super.{self::D::value} = value;
+}
+class E1 extends self::_E1&A&D /*hasConstConstructor*/  {
+  const constructor •() → self::E1*
+    : super self::_E1&A&D::•()
+    ;
+}
+class E2 = self::A with self::D {
+  synthetic constructor •() → self::E2*
+    : super self::A::•()
+    ;
+  mixin-super-stub get value() → core::int*
+    return super.{self::D::value};
+  mixin-super-stub set value(core::int* value) → void
+    return super.{self::D::value} = value;
+}
+class E3 extends self::E2 /*hasConstConstructor*/  {
+  const constructor •() → self::E3*
+    : super self::E2::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+}
diff --git a/pkg/front_end/testcases/general/issue41070.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue41070.dart.weak.modular.expect
new file mode 100644
index 0000000..d159c73
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41070.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Base extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor •(core::int* x) → self::Base*
+    : self::Base::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Application = self::Base with self::Mixin /*hasConstConstructor*/  {
+  const synthetic constructor •(core::int* x) → self::Application*
+    : super self::Base::•(x)
+    ;
+}
+static method main() → dynamic {
+  self::expect(42, #C2.{self::Base::x}{core::int*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = self::Application {x:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue41070.dart:
+- Application. (from org-dartlang-testcase:///issue41070.dart:12:7)
+- Base. (from org-dartlang-testcase:///issue41070.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue41210a.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue41210a.dart.weak.modular.expect
new file mode 100644
index 0000000..f270273
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210a.dart.weak.modular.expect
@@ -0,0 +1,201 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue41210a.dart:23:7: Error: Applying the mixin 'B' to 'Object with A' introduces an erroneous override of 'method'.
+// class C with A, B {} // error
+//       ^
+// pkg/front_end/testcases/general/issue41210a.dart:20:10: Context: The method 'B.method' has fewer named arguments than those of overridden method 'Object with A.method'.
+//   String method(num i);
+//          ^
+// pkg/front_end/testcases/general/issue41210a.dart:23:7: Context: This is the overridden method ('method').
+// class C with A, B {} // error
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2*
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-declaration core::int* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A extends core::Object implements self::Interface /*isMixinDeclaration*/  {
+  method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements self::Interface {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B = self::_C&Object&A with self::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+  abstract mixin-stub method method(core::num* i) → core::String*; -> self::B::method
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+abstract class D extends core::Object implements self::Interface, self::Interface2 {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E&Object&A&D = self::_E&Object&A with self::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A&D*
+    : super self::_E&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
+}
+class E extends self::_E&Object&A&D {
+  synthetic constructor •() → self::E*
+    : super self::_E&Object&A&D::•()
+    ;
+}
+abstract class F extends core::Object implements self::Interface {
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A&F = self::_G&Object&A with self::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A&B::method}(0){(core::num*) →* core::String*});
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/general/issue41210a_no_error.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue41210a_no_error.dart.weak.modular.expect
new file mode 100644
index 0000000..daf4b8e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210a_no_error.dart.weak.modular.expect
@@ -0,0 +1,158 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2*
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-declaration core::int* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A extends core::Object implements self::Interface /*isMixinDeclaration*/  {
+  method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements self::Interface {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object implements self::Interface, self::Interface2 {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E&Object&A&D = self::_E&Object&A with self::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A&D*
+    : super self::_E&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
+}
+class E extends self::_E&Object&A&D {
+  synthetic constructor •() → self::E*
+    : super self::_E&Object&A&D::•()
+    ;
+}
+abstract class F extends core::Object implements self::Interface {
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A&F = self::_G&Object&A with self::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.weak.modular.expect
new file mode 100644
index 0000000..d12bb3b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.dart.weak.modular.expect
@@ -0,0 +1,111 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue41210b/issue41210.dart:9:7: Error: Applying the mixin 'B' to 'Object with A' introduces an erroneous override of 'method'.
+// class C with A, B {} // error
+//       ^
+// pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart:20:10: Context: The method 'B.method' has fewer named arguments than those of overridden method 'Object with A.method'.
+//   String method(num i);
+//          ^
+// pkg/front_end/testcases/general/issue41210b/issue41210.dart:9:7: Context: This is the overridden method ('method').
+// class C with A, B {} // error
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib.dart";
+
+abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+  abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+}
+abstract class _E&Object&A&D = self::_E&Object&A with iss::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A&D*
+    : super self::_E&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
+}
+class E extends self::_E&Object&A&D {
+  synthetic constructor •() → self::E*
+    : super self::_E&Object&A&D::•()
+    ;
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+}
+abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A&B::method}(0){(core::num*) →* core::String*});
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..038d724
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart.weak.modular.expect
@@ -0,0 +1,209 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart:7:7: Error: Applying the mixin 'B' to 'Object with A' introduces an erroneous override of 'method'.
+// class C with A, B {} // error
+//       ^
+// pkg/front_end/testcases/general/issue41210b/issue41210_lib.dart:20:10: Context: The method 'B.method' has fewer named arguments than those of overridden method 'Object with A.method'.
+//   String method(num i);
+//          ^
+// pkg/front_end/testcases/general/issue41210b/issue41210.no_link.dart:7:7: Context: This is the overridden method ('method').
+// class C with A, B {} // error
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib.dart";
+
+abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+  abstract mixin-stub method method(core::num* i) → core::String*; -> iss::B::method
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E&Object&A&D = self::_E&Object&A with iss::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A&D*
+    : super self::_E&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
+}
+class E extends self::_E&Object&A&D {
+  synthetic constructor •() → self::E*
+    : super self::_E&Object&A&D::•()
+    ;
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A&B::method}(0){(core::num*) →* core::String*});
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → iss::Interface*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → iss::Interface2*
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-declaration core::int* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A extends core::Object implements iss::Interface /*isMixinDeclaration*/  {
+  method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::B*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object implements iss::Interface, iss::Interface2 {
+  synthetic constructor •() → iss::D*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class F extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210_no_error.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue41210b/issue41210_no_error.dart.weak.modular.expect
new file mode 100644
index 0000000..20cd047
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210_no_error.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib.dart";
+
+abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+}
+abstract class _E&Object&A&D = self::_E&Object&A with iss::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A&D*
+    : super self::_E&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
+}
+class E extends self::_E&Object&A&D {
+  synthetic constructor •() → self::E*
+    : super self::_E&Object&A&D::•()
+    ;
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+}
+abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/general/issue41210b/issue41210_no_error.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue41210b/issue41210_no_error.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..cf99014
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41210b/issue41210_no_error.no_link.dart.weak.modular.expect
@@ -0,0 +1,166 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib.dart";
+
+abstract class _E&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E&Object&A&D = self::_E&Object&A with iss::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E&Object&A&D*
+    : super self::_E&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E&Object&A::method}(i, s: s);
+}
+class E extends self::_E&Object&A&D {
+  synthetic constructor •() → self::E*
+    : super self::_E&Object&A&D::•()
+    ;
+}
+abstract class _G&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&A&F = self::_G&Object&A with iss::F /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&A&F*
+    : super self::_G&Object&A::•()
+    ;
+}
+class G extends self::_G&Object&A&F {
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&A&F::•()
+    ;
+}
+static method main() → dynamic {}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → iss::Interface*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → iss::Interface2*
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-declaration core::int* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A extends core::Object implements iss::Interface /*isMixinDeclaration*/  {
+  method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::B*
+    : super core::Object::•()
+    ;
+  abstract method method(core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object implements iss::Interface, iss::Interface2 {
+  synthetic constructor •() → iss::D*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration core::num* i) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class F extends core::Object implements iss::Interface {
+  synthetic constructor •() → iss::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/general/issue41252.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue41252.dart.weak.modular.expect
new file mode 100644
index 0000000..6d313f3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue41252.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue41252.dart:7:20: Error: 'X' is already declared in this scope.
+//   static final int X = 0;
+//                    ^
+// pkg/front_end/testcases/general/issue41252.dart:6:20: Context: Previous declaration of 'X'.
+//   static final int X = 0;
+//                    ^
+//
+// pkg/front_end/testcases/general/issue41252.dart:9:26: Error: Can't use 'X' because it is declared more than once.
+//   static final int foo = X + 1;
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field core::int X = null;
+  static final field core::int foo = invalid-expression "pkg/front_end/testcases/general/issue41252.dart:9:26: Error: Can't use 'X' because it is declared more than once.
+  static final int foo = X + 1;
+                         ^"{<invalid>}.+(1);
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue42435.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue42435.dart.weak.modular.expect
new file mode 100644
index 0000000..3dd8dc5
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42435.dart.weak.modular.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue42435.dart:7:22: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// typedef F = Function<Y extends A>();
+//                      ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:10:14: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   B(Function<Z extends A>() a);
+//              ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:11:26: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   factory B.foo(Function<Z extends A>() a) => new B(a);
+//                          ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:12:17: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   foo2(Function<Z extends A>() a) {}
+//                 ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:13:12: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   Function<Z extends A>() foo3() => throw 42;
+//            ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:14:12: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   Function<Z extends A>() get foo4 => throw 42;
+//            ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:16:12: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   Function<Z extends A>() foo6 = (() => throw 42)();
+//            ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:15:26: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   void set foo5(Function<Z extends A>() a) {}
+//                          ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:19:15: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// bar2(Function<Z extends A>() a) {}
+//               ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:20:10: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// Function<Z extends A>() bar3() => throw 42;
+//          ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:21:10: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// Function<Z extends A>() get bar4 => throw 42;
+//          ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:23:10: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// Function<Z extends A>() bar6 = (() => throw 42)();
+//          ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:26:17: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   baz2(Function<Z extends A>() a) {}
+//                 ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:27:12: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   Function<Z extends A>() baz3() => throw 42;
+//            ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:28:12: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   Function<Z extends A>() get baz4 => throw 42;
+//            ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:29:26: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+//   void set baz5(Function<Z extends A>() a) {}
+//                          ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue42435.dart:22:24: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// void set bar5(Function<Z extends A>() a) {}
+//                        ^
+// pkg/front_end/testcases/general/issue42435.dart:5:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+typedef F = <Y extends self::A<self::A<dynamic>> = dynamic>() → dynamic;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  field <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic foo6 = let final Never #t1 = (() → Never => throw 42)(){() → Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  constructor •(<Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → self::B
+    : super core::Object::•()
+    ;
+  static factory foo(<Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → self::B
+    return new self::B::•(a);
+  method foo2(<Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → dynamic {}
+  method foo3() → <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic
+    return throw 42;
+  get foo4() → <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic
+    return throw 42;
+  set foo5(<Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → void {}
+}
+extension E on core::int {
+  method baz2 = self::E|baz2;
+  tearoff baz2 = self::E|get#baz2;
+  method baz3 = self::E|baz3;
+  tearoff baz3 = self::E|get#baz3;
+  get baz4 = self::E|get#baz4;
+  set baz5 = self::E|set#baz5;
+}
+static field <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic bar6 = let final Never #t2 = (() → Never => throw 42)(){() → Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+static method bar2(<Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → dynamic {}
+static method bar3() → <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic
+  return throw 42;
+static get bar4() → <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic
+  return throw 42;
+static set bar5(<Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → void {}
+static method E|baz2(lowered final core::int #this, <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → dynamic {}
+static method E|get#baz2(lowered final core::int #this) → (<Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic) → dynamic
+  return (<Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → dynamic => self::E|baz2(#this, a);
+static method E|baz3(lowered final core::int #this) → <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic
+  return throw 42;
+static method E|get#baz3(lowered final core::int #this) → () → <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic
+  return () → <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic => self::E|baz3(#this);
+static method E|get#baz4(lowered final core::int #this) → <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic
+  return throw 42;
+static method E|set#baz5(lowered final core::int #this, <Z extends self::A<self::A<dynamic>> = dynamic>() → dynamic a) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue42435_2.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue42435_2.dart.weak.modular.expect
new file mode 100644
index 0000000..aa9fc93
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42435_2.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue42435_2.dart:3:27: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// typedef AAlias = Function<X extends A>();
+//                           ^
+// pkg/front_end/testcases/general/issue42435_2.dart:1:9: Context: Bound of this variable references variable 'X' from the same declaration.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias = <X extends self::A<self::A<dynamic>> = dynamic>() → dynamic;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue42610.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue42610.dart.weak.modular.expect
new file mode 100644
index 0000000..44db974
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42610.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue42610.dart:6:4: Error: 'final' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   #final;
+//    ^^^^^
+//
+// pkg/front_end/testcases/general/issue42610.dart:7:9: Error: The final variable 'x' must be initialized.
+// Try adding an initializer ('= expression') to the declaration.
+//   final x;
+//         ^
+//
+// pkg/front_end/testcases/general/issue42610.dart:8:9: Error: The const variable 'y' must be initialized.
+// Try adding an initializer ('= expression') to the declaration.
+//   const y;
+//         ^
+//
+// pkg/front_end/testcases/general/issue42610.dart:9:13: Error: The final variable 'z' must be initialized.
+// Try adding an initializer ('= expression') to the declaration.
+//   final int z;
+//             ^
+//
+// pkg/front_end/testcases/general/issue42610.dart:10:13: Error: The const variable 'w' must be initialized.
+// Try adding an initializer ('= expression') to the declaration.
+//   const int w;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  #C1;
+  final invalid-type x = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:7:9: Error: The final variable 'x' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  final x;
+        ^";
+  const invalid-type y = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:8:9: Error: The const variable 'y' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  const y;
+        ^";
+  final core::int* z = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:9:13: Error: The final variable 'z' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  final int z;
+            ^";
+  const core::int* w = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:10:13: Error: The const variable 'w' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  const int w;
+            ^";
+}
+static method main() → void {}
+
+constants  {
+  #C1 = #final
+}
diff --git a/pkg/front_end/testcases/general/issue42615.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue42615.dart.weak.modular.expect
new file mode 100644
index 0000000..08aafe4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42615.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({() →* FutureOr<core::List<self::Class::T*>*>* a = #C1}) → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method method() → dynamic
+  return null;
+static method main() → dynamic {
+  new self::Class::•<dynamic>(a: () → FutureOr<core::List<dynamic>*>* async => self::method() as{TypeError} FutureOr<core::List<dynamic>*>*);
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/issue42694.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue42694.dart.weak.modular.expect
new file mode 100644
index 0000000..f8b3fdc
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42694.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set setter(core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get setter() → core::int*
+    return throw "";
+  set setter(core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue42997.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue42997.dart.weak.modular.expect
new file mode 100644
index 0000000..b11e219
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42997.dart.weak.modular.expect
@@ -0,0 +1,87 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue42997.dart:9:16: Error: Expected a function body or '=>'.
+// Try adding {}.
+// PropertyState();
+//                ^
+//
+// pkg/front_end/testcases/general/issue42997.dart:10:7: Error: 'PropertyState' is already declared in this scope.
+// class PropertyState<I, O> {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/issue42997.dart:9:1: Context: Previous declaration of 'PropertyState'.
+// PropertyState();
+// ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue42997.dart:12:10: Error: Can't use 'PropertyState' because it is declared more than once.
+//     for (PropertyState<Object, Object>> state in _states) ;
+//          ^
+//
+// pkg/front_end/testcases/general/issue42997.dart:12:24: Error: Expected ';' after this.
+//     for (PropertyState<Object, Object>> state in _states) ;
+//                        ^^^^^^
+//
+// pkg/front_end/testcases/general/issue42997.dart:12:30: Error: Expected an identifier, but got ','.
+// Try inserting an identifier before ','.
+//     for (PropertyState<Object, Object>> state in _states) ;
+//                              ^
+//
+// pkg/front_end/testcases/general/issue42997.dart:12:47: Error: Unexpected token 'in'.
+//     for (PropertyState<Object, Object>> state in _states) ;
+//                                               ^^
+//
+// pkg/front_end/testcases/general/issue42997.dart:12:41: Error: The getter 'state' isn't defined for the class 'PropertyState#1<I, O>'.
+//  - 'PropertyState#1' is from 'pkg/front_end/testcases/general/issue42997.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'state'.
+//     for (PropertyState<Object, Object>> state in _states) ;
+//                                         ^^^^^
+//
+// pkg/front_end/testcases/general/issue42997.dart:12:38: Error: The operator '>>' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
+//     for (PropertyState<Object, Object>> state in _states) ;
+//                                      ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class PropertyState#1<I extends core::Object* = dynamic, O extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::PropertyState#1<self::PropertyState#1::I*, self::PropertyState#1::O*>*
+    : super core::Object::•()
+    ;
+  method dispose() → void {
+    for (final invalid-type #t1 = invalid-expression "pkg/front_end/testcases/general/issue42997.dart:12:10: Error: Can't use 'PropertyState' because it is declared more than once.
+    for (PropertyState<Object, Object>> state in _states) ;
+         ^"{<invalid>}.<(#C1); invalid-expression "pkg/front_end/testcases/general/issue42997.dart:12:30: Error: This couldn't be parsed.
+    for (PropertyState<Object, Object>> state in _states) ;
+                             ^"; invalid-expression "pkg/front_end/testcases/general/issue42997.dart:12:30: Error: This couldn't be parsed.
+    for (PropertyState<Object, Object>> state in _states) ;
+                             ^", invalid-expression "pkg/front_end/testcases/general/issue42997.dart:12:38: Error: The operator '>>' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
+    for (PropertyState<Object, Object>> state in _states) ;
+                                     ^^" in #C1{<unresolved>}.>>(invalid-expression "pkg/front_end/testcases/general/issue42997.dart:12:41: Error: The getter 'state' isn't defined for the class 'PropertyState#1<I, O>'.
+ - 'PropertyState#1' is from 'pkg/front_end/testcases/general/issue42997.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'state'.
+    for (PropertyState<Object, Object>> state in _states) ;
+                                        ^^^^^" in this{<unresolved>}.state))
+      ;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+static abstract method PropertyState() → dynamic;
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Object*)
+}
diff --git a/pkg/front_end/testcases/general/issue43290.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue43290.dart.weak.modular.expect
new file mode 100644
index 0000000..436e5dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43290.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43290.dart:15:25: Error: Not a constant expression.
+//     const Class(length: length);
+//                         ^^^^^^
+//
+// pkg/front_end/testcases/general/issue43290.dart:23:15: Error: Not a constant expression.
+//     const a = length;
+//               ^^^^^^
+//
+// pkg/front_end/testcases/general/issue43290.dart:11:11: Error: Constant evaluation error:
+//     const Class(length: this.length);
+//           ^
+// pkg/front_end/testcases/general/issue43290.dart:11:30: Context: Not a constant expression.
+//     const Class(length: this.length);
+//                              ^
+//
+// pkg/front_end/testcases/general/issue43290.dart:15:11: Error: Constant evaluation error:
+//     const Class(length: length);
+//           ^
+// pkg/front_end/testcases/general/issue43290.dart:15:25: Context: Not a constant expression.
+//     const Class(length: length);
+//                         ^
+//
+// pkg/front_end/testcases/general/issue43290.dart:19:20: Error: Constant evaluation error:
+//     const a = this.length;
+//                    ^
+// pkg/front_end/testcases/general/issue43290.dart:19:20: Context: Not a constant expression.
+//     const a = this.length;
+//                    ^
+// pkg/front_end/testcases/general/issue43290.dart:19:11: Context: While analyzing:
+//     const a = this.length;
+//           ^
+//
+// pkg/front_end/testcases/general/issue43290.dart:23:15: Error: Constant evaluation error:
+//     const a = length;
+//               ^
+// pkg/front_end/testcases/general/issue43290.dart:23:15: Context: Not a constant expression.
+//     const a = length;
+//               ^
+// pkg/front_end/testcases/general/issue43290.dart:23:11: Context: While analyzing:
+//     const a = length;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object /*hasConstConstructor*/  {
+  final field core::int* length;
+  const constructor •({core::int* length = #C1}) → self::Class*
+    : self::Class::length = length, super core::Object::•()
+    ;
+  method method1a() → dynamic {
+    invalid-expression "Not a constant expression.";
+  }
+  method method1b() → dynamic {
+    invalid-expression "Not a constant expression.";
+  }
+  method method2a() → dynamic {
+    const core::int* a = invalid-expression "Not a constant expression.";
+  }
+  method method2b() → dynamic {
+    const core::int* a = invalid-expression "Not a constant expression.";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/issue43363.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue43363.dart.weak.modular.expect
new file mode 100644
index 0000000..b4cfb49
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43363.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:9: Error: Expected a class member, but got 'this'.
+//         this.y = 2;
+//         ^^^^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:13: Error: Expected a class member, but got '.'.
+//         this.y = 2;
+//             ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//         this.y = 2;
+//              ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:10:14: Error: 'y' is already declared in this scope.
+//         this.y = 2;
+//              ^
+// pkg/front_end/testcases/general/issue43363.dart:7:13: Context: Previous declaration of 'y'.
+//   final int y;
+//             ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers.
+//         this.x = 1;
+//                ^
+//
+// pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once.
+//               this.y = 6;
+//                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  final field core::int* x;
+  final field core::int* y = null;
+  constructor •() → self::E*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:9:16: Error: A redirecting constructor can't have other initializers.
+        this.x = 1;
+               ^", this self::E::named()
+    ;
+  constructor named() → self::E*
+    : self::E::x = 5, final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/issue43363.dart:13:20: Error: Can't use 'y' because it is declared more than once.
+              this.y = 6;
+                   ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue43721.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue43721.dart.weak.modular.expect
new file mode 100644
index 0000000..4ca7943
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43721.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43721.dart:18:3: Error: Inferred type argument 'FutureOr<num>' doesn't conform to the bound 'FutureOr<int>' of the type variable 'T' on 'error'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   error(z); // Error.
+//   ^
+// pkg/front_end/testcases/general/issue43721.dart:10:7: Context: This is the type variable whose bound isn't conformed to.
+// error<T extends FutureOr<int>>(T t) {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method ok<T extends FutureOr<core::num*>*>(self::ok::T* t) → dynamic {}
+static method error<T extends FutureOr<core::int*>*>(self::error::T* t) → dynamic {}
+static method bar(core::bool* condition) → dynamic {
+  FutureOr<core::int*>* x = null;
+  core::num* n = 1;
+  FutureOr<core::num*>* z = condition ?{FutureOr<core::num*>*} x : n;
+  self::ok<FutureOr<core::num*>*>(z);
+  self::error<FutureOr<core::num*>*>(z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue43975.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue43975.dart.weak.modular.expect
new file mode 100644
index 0000000..a1da936
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43975.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43975.dart:5:9: Error: The typedef 'F' has a reference to itself.
+// typedef F = void Function<X extends F>() Function();
+//         ^
+//
+import self as self;
+
+typedef F = invalid-type;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/issue44007.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue44007.dart.weak.modular.expect
new file mode 100644
index 0000000..efd3a92
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue44007.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue44007.dart:16:35: Error: Expected ',' before this.
+//   print(DateTime.parse(2019-01-17 00:00:00.000));
+//                                   ^^
+//
+// pkg/front_end/testcases/general/issue44007.dart:16:35: Error: Expected an identifier, but got '00'.
+// Try inserting an identifier before '00'.
+//   print(DateTime.parse(2019-01-17 00:00:00.000));
+//                                   ^^
+//
+// pkg/front_end/testcases/general/issue44007.dart:16:40: Error: Expected ')' before this.
+//   print(DateTime.parse(2019-01-17 00:00:00.000));
+//                                        ^
+//
+// pkg/front_end/testcases/general/issue44007.dart:16:18: Error: Expected an identifier, but got 'parse'.
+// Try inserting an identifier before 'parse'.
+//   print(DateTime.parse(2019-01-17 00:00:00.000));
+//                  ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::List<core::DateTime> list = <core::DateTime>[new core::DateTime::now().{core::DateTime::add}(new core::Duration::•(days: 3)){(core::Duration) → core::DateTime}, new core::DateTime::now().{core::DateTime::add}(new core::Duration::•(days: 2)){(core::Duration) → core::DateTime}, new core::DateTime::now(), new core::DateTime::now().{core::DateTime::subtract}(new core::Duration::•(days: 1)){(core::Duration) → core::DateTime}];
+  list.{core::List::sort}((core::DateTime a, core::DateTime b) → core::int => a.{core::DateTime::compareTo}(b){(core::DateTime) → core::int}){([(core::DateTime, core::DateTime) →? core::int]) → void};
+  core::print(list);
+  core::print(invalid-expression "pkg/front_end/testcases/general/issue44007.dart:16:18: Error: Expected an identifier, but got 'parse'.
+Try inserting an identifier before 'parse'.
+  print(DateTime.parse(2019-01-17 00:00:00.000));
+                 ^^^^^");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue44347.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue44347.dart.weak.modular.expect
new file mode 100644
index 0000000..0fce86b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue44347.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue44347.dart:8:6: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   Set<int>.();
+//      ^
+//
+// pkg/front_end/testcases/general/issue44347.dart:8:13: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   Set<int>.();
+//             ^
+//
+// pkg/front_end/testcases/general/issue44347.dart:8:12: Error: Expected an identifier, but got '('.
+// Try inserting an identifier before '('.
+//   Set<int>.();
+//            ^
+//
+import self as self;
+
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/issue44347.dart:8:12: Error: Expected an identifier, but got '('.
+Try inserting an identifier before '('.
+  Set<int>.();
+           ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue44476.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue44476.dart.weak.modular.expect
new file mode 100644
index 0000000..645587c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue44476.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue44476.dart:7:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// foo(A<num> x) {
+//            ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:9:19: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//     barbar(A<num> yy) => null;
+//                   ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:8:14: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   bar(A<num> y) {
+//              ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:12:26: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//     var bazbaz = (A<num> zz) => null;
+//                          ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:12:9: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     var bazbaz = (A<num> zz) => null;
+//         ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:11:21: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   var baz = (A<num> z) {
+//                     ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44476.dart:11:7: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   var baz = (A<num> z) {
+//       ^
+// pkg/front_end/testcases/general/issue44476.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo(self::A<core::num*>* x) → dynamic {
+  function bar(self::A<core::num*>* y) → Null {
+    function barbar(self::A<core::num*>* yy) → Null
+      return null;
+  }
+  (self::A<core::num*>*) →* Null baz = (self::A<core::num*>* z) → Null {
+    (self::A<core::num*>*) →* Null bazbaz = (self::A<core::num*>* zz) → Null => null;
+  };
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue44654.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue44654.dart.weak.modular.expect
new file mode 100644
index 0000000..0832149
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue44654.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test2() → void {
+  core::String* string = null;
+  if(let final core::String* #t1 = string in #t1 == null ?{core::bool*} null : #t1.{core::String::isNotEmpty}{core::bool*})
+    ;
+}
+static method main() → void {
+  try {
+    self::test2();
+  }
+  on dynamic catch(final dynamic e, final core::StackTrace* s) {
+    self::checkFirstLineHasPosition(s);
+  }
+}
+static method checkFirstLineHasPosition(core::StackTrace* stackTrace) → void {
+  core::String* firstLine = "${stackTrace}".{core::String::split}("
+"){(core::Pattern*) →* core::List<core::String*>*}.{core::Iterable::firstWhere}((core::String* line) → core::bool* => line.{core::String::startsWith}("#0"){(core::Pattern*, [core::int*]) →* core::bool*}){((core::String*) →* core::bool*, {orElse: () →* core::String*}) →* core::String*};
+  core::int* lastParen = firstLine.{core::String::lastIndexOf}(")"){(core::Pattern*, [core::int*]) →* core::int*};
+  if(!(lastParen =={core::num::==}{(core::Object*) →* core::bool*} 1.{core::int::unary-}(){() →* core::int*})) {
+    core::int* secondColon = firstLine.{core::String::lastIndexOf}(":", lastParen.{core::num::-}(1){(core::num*) →* core::int*}){(core::Pattern*, [core::int*]) →* core::int*};
+    if(!(secondColon =={core::num::==}{(core::Object*) →* core::bool*} 1.{core::int::unary-}(){() →* core::int*})) {
+      core::int* firstColon = firstLine.{core::String::lastIndexOf}(":", secondColon.{core::num::-}(1){(core::num*) →* core::int*}){(core::Pattern*, [core::int*]) →* core::int*};
+      core::String* lineText = firstLine.{core::String::substring}(firstColon.{core::num::+}(1){(core::num*) →* core::int*}, secondColon){(core::int*, [core::int*]) →* core::String*};
+      core::String* posText = firstLine.{core::String::substring}(secondColon.{core::num::+}(1){(core::num*) →* core::int*}, lastParen){(core::int*, [core::int*]) →* core::String*};
+      core::int* line = core::int::tryParse(lineText);
+      core::int* pos = core::int::tryParse(posText);
+      if(!(line == null) && !(pos == null)) {
+        core::print("Found position ${line}:${pos}");
+        return;
+      }
+    }
+  }
+  throw "No position found in \"${firstLine}\"";
+}
diff --git a/pkg/front_end/testcases/general/issue44733.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue44733.dart.weak.modular.expect
new file mode 100644
index 0000000..0b3bd97
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue44733.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue44733.dart:22:3: Error: Type 'F' not found.
+//   F get y => super.y as F;
+//   ^
+//
+// pkg/front_end/testcases/general/issue44733.dart:5:16: Error: 'A' doesn't implement 'D' so it can't be used with 'C'.
+//  - 'A' is from 'pkg/front_end/testcases/general/issue44733.dart'.
+//  - 'D' is from 'pkg/front_end/testcases/general/issue44733.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/general/issue44733.dart'.
+// abstract class B extends A with C {}
+//                ^
+//
+// pkg/front_end/testcases/general/issue44733.dart:9:12: Error: Expected identifier, but got 'super'.
+// B get x => super.x;
+//            ^^^^^
+//
+// pkg/front_end/testcases/general/issue44733.dart:18:9: Error: A non-null value must be returned since the return type 'E' doesn't allow null.
+//  - 'E' is from 'pkg/front_end/testcases/general/issue44733.dart'.
+//   E get y {}
+//         ^
+//
+// pkg/front_end/testcases/general/issue44733.dart:22:25: Error: 'F' isn't a type.
+//   F get y => super.y as F;
+//                         ^
+//
+// pkg/front_end/testcases/general/issue44733.dart:22:20: Error: Superclass has no getter named 'y'.
+//   F get y => super.y as F;
+//                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&A&C = self::A with self::C /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B&A&C
+    : super self::A::•()
+    ;
+}
+abstract class B extends self::_B&A&C {
+  synthetic constructor •() → self::B
+    : super self::_B&A&C::•()
+    ;
+}
+abstract class C extends self::D /*isMixinDeclaration*/  {
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+}
+abstract class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  get y() → self::E {
+    return invalid-expression "pkg/front_end/testcases/general/issue44733.dart:18:9: Error: A non-null value must be returned since the return type 'E' doesn't allow null.
+ - 'E' is from 'pkg/front_end/testcases/general/issue44733.dart'.
+  E get y {}
+        ^" in null;
+  }
+}
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get y() → invalid-type
+    return super.y as{ForNonNullableByDefault} invalid-type;
+}
+static get x() → self::B
+  return invalid-expression "pkg/front_end/testcases/general/issue44733.dart:9:12: Error: Expected identifier, but got 'super'.
+B get x => super.x;
+           ^^^^^"{<invalid>}.x;
+static method f() → void {
+  switch(self::x.{self::A::y}{invalid-type}{<invalid>}.z) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue45003/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45003/main.dart.weak.modular.expect
new file mode 100644
index 0000000..d657617
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45003/main.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "foo_lib.dart" as foo;
+
+import "org-dartlang-testcase:///foo_lib.dart";
+
+static const field core::Set<foo::Foo> foo = #C2;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as foo;
+import "dart:core" as core;
+import "bar_lib.dart" as bar;
+additionalExports = (bar::Bar)
+
+import "org-dartlang-testcase:///bar_lib.dart";
+export "org-dartlang-testcase:///bar_lib.dart";
+
+abstract class Foo extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C3]/*isLegacy*/;
+  const constructor •() → foo::Foo
+    : super core::Object::•()
+    ;
+  static factory bar() → foo::Foo
+    return new bar::Bar::•<dynamic>();
+}
+
+library /*isNonNullableByDefault*/;
+import self as bar;
+import "dart:core" as core;
+import "foo_lib.dart" as foo;
+
+import "org-dartlang-testcase:///foo_lib.dart";
+
+class Bar<T extends core::Object? = dynamic> extends foo::Foo /*hasConstConstructor*/  {
+  const constructor •() → bar::Bar<bar::Bar::T%>
+    : super foo::Foo::•()
+    ;
+}
+
+constants  {
+  #C1 = bar::Bar<dynamic> {}
+  #C2 = <foo::Foo*>{#C1}
+  #C3 = constructor-tearoff foo::Foo::bar
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- Bar. (from org-dartlang-testcase:///bar_lib.dart:8:9)
+- Foo. (from org-dartlang-testcase:///foo_lib.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue45003_2.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45003_2.dart.weak.modular.expect
new file mode 100644
index 0000000..9e86d1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45003_2.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object /*hasConstConstructor*/  {
+  const constructor •({dynamic x = #C1}) → self::C
+    : super core::Object::•()
+    ;
+}
+class B<X extends core::Object? = dynamic> extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B<self::B::X%>
+    : super self::A::•()
+    ;
+}
+abstract class A extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static factory foo() → self::A
+    return new self::B::•<dynamic>();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::B<dynamic> {}
+  #C2 = constructor-tearoff self::A::foo
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue45003_2.dart:
+- B. (from org-dartlang-testcase:///issue45003_2.dart:10:9)
+- A. (from org-dartlang-testcase:///issue45003_2.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue45101/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45101/main.dart.weak.modular.expect
new file mode 100644
index 0000000..d517647
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45101/main.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+import self as self;
+
+import "dart:test";
+
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+import "dart:_internal";
+
+class _ArraySize<T extends core::Object* = dynamic> extends core::Object implements self2::Array<self2::_ArraySize::T*> /*hasConstConstructor*/  { // from org-dartlang-testcase:///patch_lib.dart
+  final field core::int* foo;
+  const constructor •(core::int* foo) → self2::_ArraySize<self2::_ArraySize::T*>*
+    : self2::_ArraySize::foo = foo, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+@#C1
+@#C4
+class Array<T extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C5];
+  @#C1
+  static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object* = dynamic>(core::int* foo) → self2::Array<self2::Array::•::T*>*
+    return new self2::_ArraySize::•<self2::Array::•::T*>(foo);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+  #C2 = "vm:entry-point"
+  #C3 = null
+  #C4 = core::pragma {name:#C2, options:#C3}
+  #C5 = constructor-tearoff self2::Array::•
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///origin_lib.dart:
+- pragma._ (from org-dartlang-sdk:///sdk/lib/core/annotations.dart:188:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue45204.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45204.dart.weak.modular.expect
new file mode 100644
index 0000000..29d551e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45204.dart.weak.modular.expect
@@ -0,0 +1,213 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+//   S(3).test();
+//        ^
+// pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
+//   void test(int x) {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   S(4).test(5, 6);
+//        ^
+// pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
+//   void test(int x) {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
+//   S(5).test<int>(6);
+//        ^
+// pkg/front_end/testcases/general/issue45204.dart:6:8: Context: Found this candidate, but the arguments don't match.
+//   void test(int x) {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+//   S2(3).test2();
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
+//   void test2(int x) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   S2(4).test2(5, 6);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
+//   void test2(int x) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+//   S2(5).test2<int>(6);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:10:8: Context: Found this candidate, but the arguments don't match.
+//   void test2(int x) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+//   S2(3).test3();
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
+//   void test3<Y>(Y y) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   S2(4).test3(5, 6);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
+//   void test3<Y>(Y y) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+//   S2(6).test3<int, int>(7);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
+//   void test3<Y>(Y y) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+//   S2(7).test3<int, int, int>(8);
+//         ^
+// pkg/front_end/testcases/general/issue45204.dart:11:8: Context: Found this candidate, but the arguments don't match.
+//   void test3<Y>(Y y) {}
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue45204.dart:15:9: Error: Too few positional arguments: 1 required, 0 given.
+//   3.test();
+//         ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:16:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   4.test(5, 6);
+//         ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:17:5: Error: Expected 0 type arguments.
+//   5.test<int>(6);
+//     ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:19:10: Error: Too few positional arguments: 1 required, 0 given.
+//   3.test2();
+//          ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:20:10: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   4.test2(5, 6);
+//          ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:21:5: Error: Expected 0 type arguments.
+//   5.test2<int>(6);
+//     ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:23:10: Error: Too few positional arguments: 1 required, 0 given.
+//   3.test3();
+//          ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:24:10: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   4.test3(5, 6);
+//          ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:26:5: Error: Expected 1 type arguments.
+//   6.test3<int, int>(7);
+//     ^
+//
+// pkg/front_end/testcases/general/issue45204.dart:27:5: Error: Expected 1 type arguments.
+//   7.test3<int, int, int>(8);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension S on core::int {
+  method test = self::S|test;
+  tearoff test = self::S|get#test;
+}
+extension S2<X extends core::Object? = dynamic> on core::int {
+  method test2 = self::S2|test2;
+  tearoff test2 = self::S2|get#test2;
+  method test3 = self::S2|test3;
+  tearoff test3 = self::S2|get#test3;
+}
+static method S|test(lowered final core::int #this, core::int x) → void {}
+static method S|get#test(lowered final core::int #this) → (core::int) → void
+  return (core::int x) → void => self::S|test(#this, x);
+static method S2|test2<X extends core::Object? = dynamic>(lowered final core::int #this, core::int x) → void {}
+static method S2|get#test2<X extends core::Object? = dynamic>(lowered final core::int #this) → (core::int) → void
+  return (core::int x) → void => self::S2|test2<self::S2|get#test2::X%>(#this, x);
+static method S2|test3<X extends core::Object? = dynamic, Y extends core::Object? = dynamic>(lowered final core::int #this, self::S2|test3::Y% y) → void {}
+static method S2|get#test3<X extends core::Object? = dynamic>(lowered final core::int #this) → <Y extends core::Object? = dynamic>(Y%) → void
+  return <Y extends core::Object? = dynamic>(Y% y) → void => self::S2|test3<self::S2|get#test3::X%, Y%>(#this, y);
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:15:9: Error: Too few positional arguments: 1 required, 0 given.
+  3.test();
+        ^" in self::S|test(3);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:16:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  4.test(5, 6);
+        ^" in self::S|test(4, 5, 6);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:17:5: Error: Expected 0 type arguments.
+  5.test<int>(6);
+    ^" in self::S|test<core::int>(5, 6);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:19:10: Error: Too few positional arguments: 1 required, 0 given.
+  3.test2();
+         ^" in self::S2|test2<dynamic>(3);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:20:10: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  4.test2(5, 6);
+         ^" in self::S2|test2<dynamic>(4, 5, 6);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:21:5: Error: Expected 0 type arguments.
+  5.test2<int>(6);
+    ^" in self::S2|test2<dynamic, core::int>(5, 6);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:23:10: Error: Too few positional arguments: 1 required, 0 given.
+  3.test3();
+         ^" in self::S2|test3<dynamic, dynamic>(3);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:24:10: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  4.test3(5, 6);
+         ^" in self::S2|test3<dynamic, core::int>(4, 5, 6);
+  self::S2|test3<dynamic, core::int>(5, 6);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:26:5: Error: Expected 1 type arguments.
+  6.test3<int, int>(7);
+    ^" in self::S2|test3<dynamic, core::int, core::int>(6, 7);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:27:5: Error: Expected 1 type arguments.
+  7.test3<int, int, int>(8);
+    ^" in self::S2|test3<dynamic, core::int, core::int, core::int>(7, 8);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:29:8: Error: Too few positional arguments: 1 required, 0 given.
+  S(3).test();
+       ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:30:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  S(4).test(5, 6);
+       ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:31:8: Error: Expected 0 type arguments.
+  S(5).test<int>(6);
+       ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:33:9: Error: Too few positional arguments: 1 required, 0 given.
+  S2(3).test2();
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:34:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  S2(4).test2(5, 6);
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:35:9: Error: Expected 1 type arguments.
+  S2(5).test2<int>(6);
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:37:9: Error: Too few positional arguments: 1 required, 0 given.
+  S2(3).test3();
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:38:9: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  S2(4).test3(5, 6);
+        ^";
+  self::S2|test3<dynamic, core::int>(5, 6);
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:40:9: Error: Expected 2 type arguments.
+  S2(6).test3<int, int>(7);
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/issue45204.dart:41:9: Error: Expected 2 type arguments.
+  S2(7).test3<int, int, int>(8);
+        ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue45330.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45330.dart.weak.modular.expect
new file mode 100644
index 0000000..56fe32f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45330.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue45330.dart:12:31: Error: Type 'T' is a bound of itself via 'T'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//   genericMethod<void Function<T extends T>()>();
+//                               ^
+//
+// pkg/front_end/testcases/general/issue45330.dart:12:3: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   genericMethod<void Function<T extends T>()>();
+//   ^
+//
+// pkg/front_end/testcases/general/issue45330_lib.dart:37:31: Error: Type 'T' is a bound of itself via 'T'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//   genericMethod<void Function<T extends T>()>();
+//                               ^
+//
+// pkg/front_end/testcases/general/issue45330_lib.dart:37:3: Error: A generic function type can't be used as a type argument.
+// Try using a non-generic function type.
+//   genericMethod<void Function<T extends T>()>();
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+part issue45330_lib.dart;
+static method genericMethod<T extends core::Object? = dynamic>() → void {}
+static method testInMain() → dynamic {
+  self::genericMethod<<T extends invalid-type>() → void>();
+}
+static method main() → dynamic {}
+static method /* from org-dartlang-testcase:///issue45330_lib.dart */ testInPart() → dynamic {
+  self::genericMethod<<T extends invalid-type>() → void>();
+}
diff --git a/pkg/front_end/testcases/general/issue45490.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45490.dart.weak.modular.expect
new file mode 100644
index 0000000..4ebc700
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45490.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue45490.dart:7:29: Error: Expected '>' after this.
+// class test<X extends A> = A<X extends A<X>>;
+//                             ^
+//
+// pkg/front_end/testcases/general/issue45490.dart:7:44: Error: Expected 'with' before this.
+// class test<X extends A> = A<X extends A<X>>;
+//                                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue45598.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45598.dart.weak.modular.expect
new file mode 100644
index 0000000..4463884
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45598.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo(<X extends Z* = dynamic, Y extends core::Object* = dynamic, Z extends core::Object* = dynamic>({m: core::Map<Y*, Z*>*}) →* dynamic bar, core::Map<core::String*, core::String*>* m) → dynamic {
+  bar<core::String*, core::String*, core::String*>(m: m){({m: core::Map<core::String*, core::String*>*}) →* dynamic};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue45598_2.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45598_2.dart.weak.modular.expect
new file mode 100644
index 0000000..eff30fa
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45598_2.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo(core::Map<core::String*, core::String*>* m) → dynamic {
+  function bar<X extends Z* = dynamic, Y extends core::Object* = dynamic, Z extends core::Object* = dynamic>({core::Map<Y*, Z*>* m = #C1}) → void {}
+  bar<core::String*, core::String*, core::String*>(m: m){({m: core::Map<core::String*, core::String*>*}) →* void};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/issue45660.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45660.dart.weak.modular.expect
new file mode 100644
index 0000000..5111de9
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45660.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue45660.dart:11:22: Error: Inferred type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'call'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   extendsNumReturnArg/*<String>*/("");
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field <T extends core::num* = dynamic>(T*) →* T* extendsNumReturnArg = <S extends core::num*>(S* s) → S* => s;
+static method functionInvocations() → dynamic {
+  self::extendsNumReturnArg<Null>(null){(Null) →* Null};
+  self::extendsNumReturnArg<core::String*>(""){(core::String*) →* core::String*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue45700.crash_dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45700.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..a03c56f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45700.crash_dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue45700.crash_dart:5:7: Error: Can't use a function type as supertype.
+// mixin M on Function() {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/issue45834.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue45834.dart.weak.modular.expect
new file mode 100644
index 0000000..62ca870
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue45834.dart.weak.modular.expect
@@ -0,0 +1,211 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue45834.dart:7:10: Error: Type variables can't have generic function types in their bounds.
+// class A1<X extends Function<T>()> {
+//          ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:8:15: Error: Type variables can't have generic function types in their bounds.
+//   A1(Function<X extends Function<T>()>() f);
+//               ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:9:17: Error: Type variables can't have generic function types in their bounds.
+//   bar1(Function<X extends Function<T>()>() f) {}
+//                 ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:10:12: Error: Type variables can't have generic function types in their bounds.
+//   Function<X extends Function<T>()>() bar2() => throw 42;
+//            ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:11:12: Error: Type variables can't have generic function types in their bounds.
+//   Function<X extends Function<T>()>() get baz1 => throw 42;
+//            ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:13:12: Error: Type variables can't have generic function types in their bounds.
+//   Function<X extends Function<T>()>() quux1 = throw 42;
+//            ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:14:19: Error: Type variables can't have generic function types in their bounds.
+//   static Function<X extends Function<T>()>() quux2 = throw 42;
+//                   ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:12:26: Error: Type variables can't have generic function types in their bounds.
+//   void set qux1(Function<X extends Function<T>()>() value) {}
+//                          ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:17:10: Error: Type variables can't have generic function types in their bounds.
+// class A2<X extends void Function<Y extends Function<T>()>()> {}
+//          ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:17:34: Error: Type variables can't have generic function types in their bounds.
+// class A2<X extends void Function<Y extends Function<T>()>()> {}
+//                                  ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:22:15: Error: Type variables can't have generic function types in their bounds.
+// foo1(Function<X extends Function<T>()>() f) {}
+//               ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:24:10: Error: Type variables can't have generic function types in their bounds.
+// Function<X extends Function<T>()>() foo3() => throw 42;
+//          ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:26:10: Error: Type variables can't have generic function types in their bounds.
+// Function<X extends Function<T>()>() get corge1 => throw 42;
+//          ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:28:10: Error: Type variables can't have generic function types in their bounds.
+// Function<X extends Function<T>()>() quuz1 = throw 42;
+//          ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:30:28: Error: Type variables can't have generic function types in their bounds.
+// typedef F1 = void Function<X extends void Function<T>()>();
+//                            ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:32:12: Error: Type variables can't have generic function types in their bounds.
+// typedef F3<X extends Function<T>()> = Function();
+//            ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:33:12: Error: Type variables can't have generic function types in their bounds.
+// typedef F4<X extends Function<Y extends Function<T>()>()> = Function();
+//            ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:33:31: Error: Type variables can't have generic function types in their bounds.
+// typedef F4<X extends Function<Y extends Function<T>()>()> = Function();
+//                               ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:39:14: Error: Type variables can't have generic function types in their bounds.
+// extension E1<X extends Function<T>()> on B1 {
+//              ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:40:17: Error: Type variables can't have generic function types in their bounds.
+//   bar3(Function<X extends Function<T>()>() f) {}
+//                 ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:41:12: Error: Type variables can't have generic function types in their bounds.
+//   Function<X extends Function<T>()>() bar4() => throw 42;
+//            ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:42:12: Error: Type variables can't have generic function types in their bounds.
+//   Function<X extends Function<T>()>() get baz2 => throw 42;
+//            ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:44:19: Error: Type variables can't have generic function types in their bounds.
+//   static Function<X extends Function<T>()>() quux3 = throw 42;
+//                   ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:43:26: Error: Type variables can't have generic function types in their bounds.
+//   void set qux2(Function<X extends Function<T>()>() value) {}
+//                          ^
+//
+// pkg/front_end/testcases/general/issue45834.dart:27:27: Error: Type variables can't have generic function types in their bounds.
+// void set grault1(Function<X extends Function<T>()>() value) {}
+//                           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F1 = <X extends <T extends core::Object* = dynamic>() →* void = dynamic>() →* void;
+typedef F2 = <X extends (<T extends core::Object* = dynamic>() →* void) →* dynamic = dynamic>() →* void;
+typedef F3<unrelated X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic> = () →* dynamic;
+typedef F4<unrelated X extends <Y extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic = dynamic> = () →* dynamic;
+typedef F5<unrelated X extends (<Y extends (<T extends core::Object* = dynamic>() →* dynamic) →* dynamic = dynamic>() →* dynamic) →* dynamic> = () →* dynamic;
+class A1<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic> extends core::Object {
+  field <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic quux1 = throw 42;
+  static field <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic quux2 = throw 42;
+  constructor •(<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic f) → self::A1<self::A1::X*>*
+    : super core::Object::•()
+    ;
+  method bar1(<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic f) → dynamic {}
+  method bar2() → <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic
+    return throw 42;
+  get baz1() → <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic
+    return throw 42;
+  set qux1(<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A2<X extends <Y extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A3<X extends (<Y extends (<T extends core::Object* = dynamic>() →* dynamic) →* dynamic = dynamic>() →* void) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::A3<self::A3::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B1 extends core::Object {
+  synthetic constructor •() → self::B1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension E1<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic> on self::B1* {
+  method bar3 = self::E1|bar3;
+  tearoff bar3 = self::E1|get#bar3;
+  method bar4 = self::E1|bar4;
+  tearoff bar4 = self::E1|get#bar4;
+  get baz2 = self::E1|get#baz2;
+  static field quux3 = self::E1|quux3;
+  set qux2 = self::E1|set#qux2;
+}
+static field <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic quuz1 = throw 42;
+static field <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic E1|quux3 = throw 42;
+static method foo1(<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic f) → dynamic {}
+static method foo2(<X extends (<T extends core::Object* = dynamic>() →* dynamic) →* dynamic = dynamic>() →* dynamic f) → dynamic {}
+static method foo3() → <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic
+  return throw 42;
+static method foo4() → <X extends (<T extends core::Object* = dynamic>() →* dynamic) →* dynamic = dynamic>() →* dynamic
+  return throw 42;
+static get corge1() → <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic
+  return throw 42;
+static set grault1(<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic value) → void {}
+static method E1|bar3<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>(lowered final self::B1* #this, <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic f) → dynamic {}
+static method E1|get#bar3<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>(lowered final self::B1* #this) → (<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic) →* dynamic
+  return (<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic f) → dynamic => self::E1|bar3<self::E1|get#bar3::X*>(#this, f);
+static method E1|bar4<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>(lowered final self::B1* #this) → <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic
+  return throw 42;
+static method E1|get#bar4<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>(lowered final self::B1* #this) → () →* <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic
+  return () → <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic => self::E1|bar4<self::E1|get#bar4::X*>(#this);
+static method E1|get#baz2<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>(lowered final self::B1* #this) → <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic
+  return throw 42;
+static method E1|set#qux2<X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>(lowered final self::B1* #this, <X extends <T extends core::Object* = dynamic>() →* dynamic = dynamic>() →* dynamic value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue46334.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46334.dart.weak.modular.expect
new file mode 100644
index 0000000..e0ea5d7
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46334.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue46334.dart:6:11: Error: Cyclic definition of factory 'C'.
+//   factory C() = C;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •() → self::C
+    return invalid-expression "pkg/front_end/testcases/general/issue46334.dart:6:11: Error: Cyclic definition of factory 'C'.
+  factory C() = C;
+          ^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/general/issue46389.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46389.dart.weak.modular.expect
new file mode 100644
index 0000000..55be1b7
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46389.dart.weak.modular.expect
@@ -0,0 +1,73 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int boz = 0;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo(core::int n) → core::num {
+    core::print(n.{core::Object::runtimeType}{core::Type});
+    return 1.1;
+  }
+  method bar({required core::int x = #C1}) → core::num {
+    core::print(x.{core::Object::runtimeType}{core::Type});
+    return 1.1;
+  }
+  set baz(core::int x) → void {
+    core::print(x.{core::Object::runtimeType}{core::Type});
+  }
+}
+abstract class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant-by-class self::B::X% x) → self::B::X%;
+  abstract method bar({required covariant-by-class self::B::X% x = #C1}) → self::B::X%;
+  abstract set baz(covariant-by-class self::B::X% x) → void;
+  abstract set boz(covariant-by-class self::B::X% x) → void;
+}
+abstract class _C&A&B = self::A with self::B<core::num> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+  forwarding-stub set boz(covariant-by-class core::num x) → void
+    return super.{self::A::boz} = x as core::int;
+  forwarding-stub method foo(covariant-by-class core::num x) → core::num
+    return super.{self::A::foo}(x as core::int);
+  forwarding-stub method bar({required covariant-by-class core::num x = #C1}) → core::num
+    return super.{self::A::bar}(x: x as core::int);
+  forwarding-stub set baz(covariant-by-class core::num x) → void
+    return super.{self::A::baz} = x as core::int;
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → self::C
+    : super self::_C&A&B::•()
+    ;
+}
+static method main() → void {
+  self::C a = new self::C::•();
+  a.{self::_C&A&B::foo}(1){(core::num) → core::num};
+  self::throws(() → void => a.{self::_C&A&B::foo}(1.2){(core::num) → core::num});
+  a.{self::_C&A&B::bar}(x: 1){({required x: core::num}) → core::num};
+  self::throws(() → void => a.{self::_C&A&B::bar}(x: 1.2){({required x: core::num}) → core::num});
+  a.{self::_C&A&B::baz} = 1;
+  self::throws(() → void => a.{self::_C&A&B::baz} = 1.2);
+  a.{self::_C&A&B::boz} = 1;
+  self::throws(() → void => a.{self::_C&A&B::boz} = 1.2);
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Exception expected";
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/issue46390.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46390.dart.weak.modular.expect
new file mode 100644
index 0000000..8c31872
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46390.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo(core::num n) → core::num {
+    core::print(n.{core::Object::runtimeType}{core::Type});
+    return 1.1;
+  }
+}
+abstract class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant-by-class self::B::X% x) → self::B::X%;
+}
+abstract class _C&A&B = self::A with self::B<core::num> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+  forwarding-stub method foo(covariant-by-class core::num x) → core::num
+    return super.{self::A::foo}(x);
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → self::C
+    : super self::_C&A&B::•()
+    ;
+}
+static method main() → void {
+  self::B<core::Object> b = new self::C::•();
+  try {
+    b.{self::B::foo}(true){(core::Object) → core::Object};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Missing type error";
+}
diff --git a/pkg/front_end/testcases/general/issue46581.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46581.dart.weak.modular.expect
new file mode 100644
index 0000000..e6c9e95
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46581.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "issue46581_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue46581_lib.dart";
+
+abstract class _TestClass&MyClass&MyMixin = iss::MyClass with self::MyMixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor _() → self::_TestClass&MyClass&MyMixin
+    : super iss::MyClass::_()
+    ;
+  const synthetic constructor named() → self::_TestClass&MyClass&MyMixin
+    : super iss::MyClass::named()
+    ;
+}
+class TestClass extends self::_TestClass&MyClass&MyMixin {
+  constructor •() → self::TestClass
+    : super self::_TestClass&MyClass&MyMixin::named()
+    ;
+}
+abstract class MyMixin extends core::Object /*isMixinDeclaration*/  {
+}
+static method main() → void {}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+
+class MyClass extends core::Object /*hasConstConstructor*/  {
+  const constructor _() → iss::MyClass
+    : super core::Object::•()
+    ;
+  const constructor named() → iss::MyClass
+    : this iss::MyClass::_()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/issue46581/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46581/main.dart.weak.modular.expect
new file mode 100644
index 0000000..b46584b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46581/main.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _TestClass&MyClass&MyMixin = mai::MyClass with self::MyMixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor _() → self::_TestClass&MyClass&MyMixin
+    : super mai::MyClass::_()
+    ;
+  const synthetic constructor named() → self::_TestClass&MyClass&MyMixin
+    : super mai::MyClass::named()
+    ;
+}
+class TestClass extends self::_TestClass&MyClass&MyMixin {
+  constructor •() → self::TestClass
+    : super self::_TestClass&MyClass&MyMixin::named()
+    ;
+}
+abstract class MyMixin extends core::Object /*isMixinDeclaration*/  {
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/issue46719.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46719.dart.weak.modular.expect
new file mode 100644
index 0000000..449b259
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46719.dart.weak.modular.expect
@@ -0,0 +1,120 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue46719.dart:27:12: Error: Couldn't find constructor 'm.applyAndPrint'.
+//   a.m<int>.applyAndPrint([2]);
+//            ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue46719.dart:28:15: Error: Couldn't find constructor 'm.applyAndPrint'.
+//   a.m<String>.applyAndPrint(['three']);
+//               ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue46719.dart:29:12: Error: Couldn't find constructor 'n.applyAndPrint'.
+//   A.n<int>.applyAndPrint([2]);
+//            ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue46719.dart:30:15: Error: Couldn't find constructor 'n.applyAndPrint'.
+//   A.n<String>.applyAndPrint(['three']);
+//               ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue46719.dart:31:15: Error: Couldn't find constructor 'm.applyAndPrint'.
+//   self.m<int>.applyAndPrint([2]);
+//               ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue46719.dart:32:18: Error: Couldn't find constructor 'm.applyAndPrint'.
+//   self.m<String>.applyAndPrint(['three']);
+//                  ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/issue46719.dart:33:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   self.A.n<int>.applyAndPrint([2]);
+//           ^
+//
+// pkg/front_end/testcases/general/issue46719.dart:34:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   self.A.n<String>.applyAndPrint(['three']);
+//           ^
+//
+// pkg/front_end/testcases/general/issue46719.dart:35:5: Error: Member not found: 'named'.
+//   A.named.toString();
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/issue46719.dart:36:4: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   A<int>.named.toString();
+//    ^
+//
+// pkg/front_end/testcases/general/issue46719.dart:36:10: Error: Member not found: 'named'.
+//   A<int>.named.toString();
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/issue46719.dart:37:5: Error: Couldn't find constructor 'named'.
+//   A.named<int>.toString();
+//     ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue46719.dart" as self;
+
+class A<T extends core::Object? = dynamic> extends core::Object {
+  constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  constructor named() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  method m<X extends core::Object? = dynamic>(self::A::m::X% x) → core::List<self::A::m::X%>
+    return <self::A::m::X%>[x];
+  static method n<X extends core::Object? = dynamic>(self::A::n::X% x) → core::List<self::A::n::X%>
+    return <self::A::n::X%>[x];
+}
+extension FunctionApplier on core::Function {
+  method applyAndPrint = self::FunctionApplier|applyAndPrint;
+  tearoff applyAndPrint = self::FunctionApplier|get#applyAndPrint;
+}
+static method m<X extends core::Object? = dynamic>(self::m::X% x) → core::List<self::m::X%>
+  return <self::m::X%>[x];
+static method FunctionApplier|applyAndPrint(lowered final core::Function #this, core::List<core::Object?> positionalArguments) → void
+  return core::print(core::Function::apply(#this, positionalArguments, #C1));
+static method FunctionApplier|get#applyAndPrint(lowered final core::Function #this) → (core::List<core::Object?>) → void
+  return (core::List<core::Object?> positionalArguments) → void => self::FunctionApplier|applyAndPrint(#this, positionalArguments);
+static method test() → dynamic {
+  self::A<dynamic> a = new self::A::•<dynamic>();
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:27:12: Error: Couldn't find constructor 'm.applyAndPrint'.
+  a.m<int>.applyAndPrint([2]);
+           ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:28:15: Error: Couldn't find constructor 'm.applyAndPrint'.
+  a.m<String>.applyAndPrint(['three']);
+              ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:29:12: Error: Couldn't find constructor 'n.applyAndPrint'.
+  A.n<int>.applyAndPrint([2]);
+           ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:30:15: Error: Couldn't find constructor 'n.applyAndPrint'.
+  A.n<String>.applyAndPrint(['three']);
+              ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:31:15: Error: Couldn't find constructor 'm.applyAndPrint'.
+  self.m<int>.applyAndPrint([2]);
+              ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:32:18: Error: Couldn't find constructor 'm.applyAndPrint'.
+  self.m<String>.applyAndPrint(['three']);
+                 ^^^^^^^^^^^^^";
+  self::FunctionApplier|applyAndPrint(#C2, <core::Object?>[2]);
+  self::FunctionApplier|applyAndPrint(#C2, <core::Object?>["three"]);
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:35:5: Error: Member not found: 'named'.
+  A.named.toString();
+    ^^^^^".{core::Object::toString}(){() → core::String};
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:36:10: Error: Member not found: 'named'.
+  A<int>.named.toString();
+         ^^^^^".{core::Object::toString}(){() → core::String};
+  invalid-expression "pkg/front_end/testcases/general/issue46719.dart:37:5: Error: Couldn't find constructor 'named'.
+  A.named<int>.toString();
+    ^^^^^";
+}
+static method main() → void {}
+
+constants  {
+  #C1 = <core::Symbol*, dynamic>{)
+  #C2 = static-tearoff self::A::n
+}
diff --git a/pkg/front_end/testcases/general/issue46745.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46745.dart.weak.modular.expect
new file mode 100644
index 0000000..a375575
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46745.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue46745.dart:8:3: Error: 'A.foo' is already declared in this scope.
+//   A.foo();
+//   ^^^^^
+// pkg/front_end/testcases/general/issue46745.dart:7:11: Context: Previous declaration of 'A.foo'.
+//   factory A.foo() => A._();
+//           ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor _() → self::A
+    : super core::Object::•()
+    ;
+  static factory foo() → self::A
+    return new self::A::_();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue46863.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46863.dart.weak.modular.expect
new file mode 100644
index 0000000..20ac68c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46863.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue46863.dart:5:36: Error: Method not found: 'bar'.
+// final foo = [() => const [], () => bar()];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/issue46863.dart:7:41: Error: 'Bar' isn't a type.
+// final foo2 = [(dynamic x) => const [], (Bar x) => const []];
+//                                         ^^^
+//
+// pkg/front_end/testcases/general/issue46863.dart:9:52: Error: 'Bar' isn't a type.
+// final foo3 = [(List<dynamic> x) => const [], (List<Bar> x) => const []];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/issue46863.dart:11:60: Error: 'Bar' isn't a type.
+// final foo4 = [(Function(dynamic) x) => const [], (Function(Bar) x) => const []];
+//                                                            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static final field core::List<() → invalid-type> foo = <() → invalid-type>[() → core::List<dynamic> => #C1, () → invalid-type => invalid-expression "pkg/front_end/testcases/general/issue46863.dart:5:36: Error: Method not found: 'bar'.
+final foo = [() => const [], () => bar()];
+                                   ^^^"];
+static final field core::List<(invalid-type) → core::List<dynamic>> foo2 = <(invalid-type) → core::List<dynamic>>[(dynamic x) → core::List<dynamic> => #C1, (invalid-type x) → core::List<dynamic> => #C1];
+static final field core::List<(core::List<dynamic>) → core::List<dynamic>> foo3 = <(core::List<dynamic>) → core::List<dynamic>>[(core::List<dynamic> x) → core::List<dynamic> => #C1, (core::List<invalid-type> x) → core::List<dynamic> => #C1];
+static final field core::List<((invalid-type) → dynamic) → core::List<dynamic>> foo4 = <((invalid-type) → dynamic) → core::List<dynamic>>[((dynamic) → dynamic x) → core::List<dynamic> => #C1, ((invalid-type) → dynamic x) → core::List<dynamic> => #C1];
+static method main() → dynamic {}
+
+constants  {
+  #C1 = <dynamic>[]
+}
diff --git a/pkg/front_end/testcases/general/issue46956.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue46956.dart.weak.modular.expect
new file mode 100644
index 0000000..eb4a9a3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue46956.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+static method foo<X extends core::Object?>(self::A<self::foo::X%> x) → asy::Future<self::foo::X?>
+  return throw 42;
+static method bar(core::String? y) → dynamic {}
+static method test(self::A<core::String> a) → dynamic async {
+  final core::String? x = await(() → asy::Future<core::String?> async {
+    return self::foo<core::String>(a);
+  })(){() → asy::Future<core::String?>};
+  self::bar(x);
+}
+static method test2(self::A<core::String> a) → dynamic async {
+  return self::foo<core::String>(a);
+}
+static method test3(self::A<core::String> a) → dynamic {
+  return self::foo<core::String>(a);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47013.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47013.dart.weak.modular.expect
new file mode 100644
index 0000000..f555ae6
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47013.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method m(core::int n) → void {}
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  abstract method m(covariant-by-declaration core::num n) → void;
+}
+class C extends self::A implements self::I {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  forwarding-stub method m(covariant-by-declaration core::num n) → void
+    return super.{self::A::m}(n as core::int);
+}
+static method main() → void {
+  self::throws(() → void => (new self::C::•() as{ForNonNullableByDefault} dynamic){dynamic}.m(1.1));
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Exception expected";
+}
diff --git a/pkg/front_end/testcases/general/issue47013b.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47013b.dart.weak.modular.expect
new file mode 100644
index 0000000..7ab0301
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47013b.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method m(core::num n) → void {}
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ m(covariant-by-declaration core::num i) → void
+    return super.{self::A::m}(i);
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  method m(covariant-by-declaration core::int i) → void {}
+}
+static method main() → dynamic {
+  self::A a = new self::C::•();
+  self::throws(() → void => a.{self::A::m}(1.5){(core::num) → void});
+  a = new self::B::•();
+  a.{self::A::m}(1.5){(core::num) → void};
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Exception expected";
+}
diff --git a/pkg/front_end/testcases/general/issue47013c.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47013c.dart.weak.modular.expect
new file mode 100644
index 0000000..e4ef550
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47013c.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class D1 extends core::Object {
+  synthetic constructor •() → self::D1
+    : super core::Object::•()
+    ;
+}
+class D2 extends core::Object {
+  synthetic constructor •() → self::D2
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object implements self::D1, self::D2 {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method m(covariant-by-declaration self::D d) → void {}
+}
+abstract class B1 extends core::Object {
+  synthetic constructor •() → self::B1
+    : super core::Object::•()
+    ;
+  abstract method m(self::D1 d1) → void;
+}
+abstract class B2 extends core::Object {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+  abstract method m(self::D2 d2) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47013d.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47013d.dart.weak.modular.expect
new file mode 100644
index 0000000..20bde3e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47013d.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47013d.dart:15:20: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//   throws(() => b.m(1.5, 0));
+//                    ^
+//
+// pkg/front_end/testcases/general/issue47013d.dart:17:23: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//   throws(() => a.m(1, 1.5));
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method m(core::num n, core::int i) → void {}
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int, core::num) → void */ m(covariant-by-declaration core::num i, covariant-by-declaration core::int n) → void
+    return super.{self::A::m}(i, n);
+}
+static method main() → dynamic {
+  self::B b = new self::B::•();
+  self::throws(() → void => b.{self::B::m}(invalid-expression "pkg/front_end/testcases/general/issue47013d.dart:15:20: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  throws(() => b.m(1.5, 0));
+                   ^" in 1.5 as{TypeError,ForNonNullableByDefault} core::int, 0){(core::int, core::num) → void});
+  self::A a = b;
+  self::throws(() → void => a.{self::A::m}(1, invalid-expression "pkg/front_end/testcases/general/issue47013d.dart:17:23: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  throws(() => a.m(1, 1.5));
+                      ^" in 1.5 as{TypeError,ForNonNullableByDefault} core::int){(core::num, core::int) → void});
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Exception expected";
+}
diff --git a/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect
new file mode 100644
index 0000000..706562c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47036.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Default extends core::Object /*hasConstConstructor*/  {
+  final field core::Object? defaultValue;
+  const constructor •(core::Object? defaultValue) → self::Default
+    : self::Default::defaultValue = defaultValue, super core::Object::•()
+    ;
+}
+class Settings extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •({@#C3 self::Sidebar sidebar = #C4}) → self::Settings
+    return self::_SSettings::•(sidebar: sidebar);
+}
+class Sidebar extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C5]/*isLegacy*/;
+  static factory •() → self::Sidebar
+    return self::_SSidebar::•();
+}
+abstract class _SSettings extends core::Object implements self::Settings {
+  static final field dynamic _redirecting# = <dynamic>[#C6]/*isLegacy*/;
+  static factory •({self::Sidebar sidebar = #C4}) → self::_SSettings
+    return new self::_$_SSettings::•(sidebar: sidebar);
+}
+class _$_SSettings extends core::Object implements self::_SSettings /*hasConstConstructor*/  {
+  final field self::Sidebar sidebar;
+  const constructor •({self::Sidebar sidebar = #C2}) → self::_$_SSettings
+    : self::_$_SSettings::sidebar = sidebar, super core::Object::•()
+    ;
+}
+abstract class _SSidebar extends core::Object implements self::Sidebar {
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  static factory •() → self::_SSidebar
+    return new self::_$_SSidebar::•();
+}
+class _$_SSidebar extends core::Object implements self::_SSidebar /*hasConstConstructor*/  {
+  const constructor •() → self::_$_SSidebar
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = constructor-tearoff self::Settings::•
+  #C2 = self::_$_SSidebar {}
+  #C3 = self::Default {defaultValue:#C2}
+  #C4 = null
+  #C5 = constructor-tearoff self::Sidebar::•
+  #C6 = constructor-tearoff self::_SSettings::•
+  #C7 = constructor-tearoff self::_SSidebar::•
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47036.dart:
+- _$_SSidebar. (from org-dartlang-testcase:///issue47036.dart:36:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Default. (from org-dartlang-testcase:///issue47036.dart:6:9)
diff --git a/pkg/front_end/testcases/general/issue47057.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47057.dart.weak.modular.expect
new file mode 100644
index 0000000..abd22ad
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47057.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method foo<X extends core::Object?>(self::foo::X% x) → asy::Future<core::int> async {
+  if(x is{ForNonNullableByDefault} asy::Future<core::int>) {
+    return x{self::foo::X% & asy::Future<core::int> /* '%' & '!' = '!' */};
+  }
+  else {
+    throw 42;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47072.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47072.dart.weak.modular.expect
new file mode 100644
index 0000000..54bf6d2
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47072.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method f(self::B b) → void {}
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-declaration self::A a) → void;
+}
+class D extends self::C implements self::I {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  forwarding-stub method f(covariant-by-declaration self::A a) → void
+    return super.{self::C::f}(a as self::B);
+}
+static method main() → void {
+  self::I i = new self::D::•();
+  try {
+    i.{self::I::f}(new self::A::•()){(self::A) → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Missing type error";
+}
diff --git a/pkg/front_end/testcases/general/issue47223a.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47223a.dart.weak.modular.expect
new file mode 100644
index 0000000..1640c03
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223a.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47223a.dart:6:4: Warning: Operand of null-aware operation '??' has type 'Never' which excludes null.
+//   (throw "some value") ?? "some other value";
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  let final Never #t1 = throw "some value" in #t1 == null ?{core::String} "some other value" : #t1;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47223b.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47223b.dart.weak.modular.expect
new file mode 100644
index 0000000..13e925e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47223b.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47223b.dart:6:24: Warning: Operand of null-aware operation '??=' has type 'Never' which excludes null.
+//   (throw "some value").foo ??= "foo";
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  let final Never #t1 = throw "some value" in #t1{Never}.foo == null ?{core::String} #t1{Never}.foo = "foo" : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47339.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47339.dart.weak.modular.expect
new file mode 100644
index 0000000..02f1b57
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47339.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Bar = self::Foo;
+typedef BarGeneric<X extends core::Object? = dynamic> = self::FooGeneric<X%>;
+class Foo extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  const constructor named() → self::Foo
+    : super core::Object::•()
+    ;
+  static factory namedFactory() → self::Foo
+    return new self::Foo::named();
+}
+class FooGeneric<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  const constructor named() → self::FooGeneric<self::FooGeneric::X%>
+    : super core::Object::•()
+    ;
+  static factory namedFactory<X extends core::Object? = dynamic>() → self::FooGeneric<self::FooGeneric::namedFactory::X%>
+    return new self::FooGeneric::named<self::FooGeneric::namedFactory::X%>();
+}
+static const field self::Foo bar = #C3;
+static const field self::Foo bar2 = #C3;
+static const field self::FooGeneric<core::int> barGeneric = #C4;
+static const field self::FooGeneric<core::int> barGeneric2 = #C4;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Foo::namedFactory
+  #C2 = constructor-tearoff self::FooGeneric::namedFactory
+  #C3 = self::Foo {}
+  #C4 = self::FooGeneric<core::int*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47339.dart:
+- Foo.named (from org-dartlang-testcase:///issue47339.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- FooGeneric.named (from org-dartlang-testcase:///issue47339.dart:17:9)
diff --git a/pkg/front_end/testcases/general/issue47462.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47462.dart.weak.modular.expect
new file mode 100644
index 0000000..2a6bd0b
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47462.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef MyList<T extends core::num> = core::List<T>;
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(false, #C2);
+  self::expect(true, core::identical(#C4, #C4));
+  self::expect(false, core::identical(#C4, #C6));
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v1 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v2 = #C4;
+  (core::int, core::num, {growable: core::bool}) → core::List<core::num> v3 = #C6;
+  core::bool v4 = core::identical(v1, v2);
+  core::bool v5 = core::identical(v1, v3);
+  self::expect(true, v4);
+  self::expect(false, v5);
+  self::expect(true, core::identical(v1, v2));
+  self::expect(false, core::identical(v1, v3));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#new#tearOff<T extends core::num>([core::int? length = #C7]) → core::List<self::_#MyList#new#tearOff::T>
+  return core::List::•<self::_#MyList#new#tearOff::T>(length);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#filled#tearOff<T extends core::num>(core::int length, self::_#MyList#filled#tearOff::T fill, {core::bool growable = #C2}) → core::List<self::_#MyList#filled#tearOff::T>
+  return core::List::filled<self::_#MyList#filled#tearOff::T>(length, fill, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#empty#tearOff<T extends core::num>({core::bool growable = #C2}) → core::List<self::_#MyList#empty#tearOff::T>
+  return core::List::empty<self::_#MyList#empty#tearOff::T>(growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#from#tearOff<T extends core::num>(core::Iterable<dynamic> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#from#tearOff::T>
+  return core::List::from<self::_#MyList#from#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#of#tearOff<T extends core::num>(core::Iterable<self::_#MyList#of#tearOff::T> elements, {core::bool growable = #C1}) → core::List<self::_#MyList#of#tearOff::T>
+  return core::List::of<self::_#MyList#of#tearOff::T>(elements, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#generate#tearOff<T extends core::num>(core::int length, (core::int) → self::_#MyList#generate#tearOff::T generator, {core::bool growable = #C1}) → core::List<self::_#MyList#generate#tearOff::T>
+  return core::List::generate<self::_#MyList#generate#tearOff::T>(length, generator, growable: growable);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/array_patch.dart */ _#MyList#unmodifiable#tearOff<T extends core::num>(core::Iterable<dynamic> elements) → core::List<self::_#MyList#unmodifiable#tearOff::T>
+  return core::List::unmodifiable<self::_#MyList#unmodifiable#tearOff::T>(elements);
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = constructor-tearoff core::List::filled
+  #C4 = instantiation #C3 <core::num*>
+  #C5 = static-tearoff self::_#MyList#filled#tearOff
+  #C6 = instantiation #C5 <core::num*>
+  #C7 = null
+}
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.expect
index 1c6fab0..aeebd16 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.modular.expect
new file mode 100644
index 0000000..aeebd16
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47495.dart:10:16: Error: Can't create typedef from non-function type.
+// typedef SAlias = S;
+//                ^
+//
+// pkg/front_end/testcases/general/issue47495.dart:11:16: Error: Can't create typedef from non-function type.
+// typedef MAlias = M;
+//                ^
+//
+// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' can't be mixed in.
+// class C = SAlias with MAlias;
+//       ^
+// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
+// typedef MAlias = M;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef SAlias = invalid-type;
+typedef MAlias = invalid-type;
+class S extends core::Object {
+  synthetic constructor •() → self::S*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
index f366ace..697ca5b 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
index 1c6fab0..aeebd16 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart b/pkg/front_end/testcases/general/issue47728_1.dart
new file mode 100644
index 0000000..c21c8d9
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.12
+
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect
new file mode 100644
index 0000000..ce30a6e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+// @dart = 2.12
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..41cba10
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+// @dart = 2.12
+class B {}
+
+class C = A with B;
+main() {}
+typedef A = Function()?;
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect
new file mode 100644
index 0000000..a0401b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.modular.expect
new file mode 100644
index 0000000..a0401b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect
new file mode 100644
index 0000000..f10b81e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect
new file mode 100644
index 0000000..047429d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart b/pkg/front_end/testcases/general/issue47728_2.dart
new file mode 100644
index 0000000..70ff02c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef A = ;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect
new file mode 100644
index 0000000..d2e4a8cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+typedef A = ;
+class B {}
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect
new file mode 100644
index 0000000..82e50f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.modular.expect
new file mode 100644
index 0000000..82e50f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect
new file mode 100644
index 0000000..836ab09
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect
new file mode 100644
index 0000000..3b07de4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart b/pkg/front_end/testcases/general/issue47728_3.dart
new file mode 100644
index 0000000..cc160b7
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.12
+
+typedef A = ;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect
new file mode 100644
index 0000000..f5e4116
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+// @dart = 2.12
+typedef A = ;
+class B {}
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect
new file mode 100644
index 0000000..7f3c778
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.modular.expect
new file mode 100644
index 0000000..7f3c778
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect
new file mode 100644
index 0000000..e34cb28
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect
new file mode 100644
index 0000000..11c3c9f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart b/pkg/front_end/testcases/general/issue47728_4.dart
new file mode 100644
index 0000000..bd0512e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect
new file mode 100644
index 0000000..aca4ab4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..09de3de
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class B {}
+
+class C = A with B;
+main() {}
+typedef A = Function()?;
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect
new file mode 100644
index 0000000..b242e08
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.modular.expect
new file mode 100644
index 0000000..b242e08
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect
new file mode 100644
index 0000000..bcc7a6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect
new file mode 100644
index 0000000..a92eb47
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue_46886.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue_46886.dart.weak.modular.expect
new file mode 100644
index 0000000..e64cce5
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_46886.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue_46886.dart:8:16: Error: This requires the 'triple-shift' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   Foo operator >>>(_) => this;
+//                ^^^
+//
+// pkg/front_end/testcases/general/issue_46886.dart:20:7: Error: This requires the 'triple-shift' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   foo >>> 42;
+//       ^^^
+//
+// pkg/front_end/testcases/general/issue_46886.dart:21:13: Error: This requires the 'triple-shift' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   print(foo >>> 42);
+//             ^^^
+//
+// pkg/front_end/testcases/general/issue_46886.dart:22:13: Error: This requires the 'triple-shift' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   print(foo >>>= 42);
+//             ^^^^
+//
+// pkg/front_end/testcases/general/issue_46886.dart:23:12: Error: This requires the 'triple-shift' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   if ((foo >>>= 42) == foo) {
+//            ^^^^
+//
+// pkg/front_end/testcases/general/issue_46886.dart:28:13: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   print(#>>>);
+//             ^
+//
+// pkg/front_end/testcases/general/issue_46886.dart:30:14: Error: This requires the 'triple-shift' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var x = 10 >>> 2;
+//              ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  operator >>>(dynamic _) → self::Foo
+    return this;
+}
+abstract class Bar extends core::Object implements core::List<core::List<core::List<core::String>>> {
+  synthetic constructor •() → self::Bar
+    : super core::Object::•()
+    ;
+}
+extension _extension#0 on core::Symbol {
+  operator > = self::_extension#0|>;
+  method call = self::_extension#0|call;
+  tearoff call = self::_extension#0|get#call;
+}
+static method _extension#0|>(lowered final core::Symbol #this, dynamic _) → core::String
+  return "Greater Than used";
+static method _extension#0|call(lowered final core::Symbol #this, dynamic _) → core::String
+  return "Called";
+static method _extension#0|get#call(lowered final core::Symbol #this) → (dynamic) → core::String
+  return (dynamic _) → core::String => self::_extension#0|call(#this, _);
+static method main() → dynamic {
+  self::Foo foo = new self::Foo::•();
+  foo.{self::Foo::>>>}(42){(dynamic) → self::Foo};
+  core::print(foo.{self::Foo::>>>}(42){(dynamic) → self::Foo});
+  core::print(foo = foo.{self::Foo::>>>}(42){(dynamic) → self::Foo});
+  if((foo = foo.{self::Foo::>>>}(42){(dynamic) → self::Foo}) =={core::Object::==}{(core::Object) → core::bool} foo) {
+    core::print("same");
+  }
+  core::print(self::_extension#0|>(#C1, 2));
+  core::print(self::_extension#0|>(#C1, invalid-expression "pkg/front_end/testcases/general/issue_46886.dart:28:13: Error: This couldn't be parsed.
+  print(#>>>);
+            ^"));
+  core::int x = 10.{core::int::>>>}(2){(core::int) → core::int};
+  core::print("x: ${x}");
+}
+
+constants  {
+  #C1 = #>>
+}
diff --git a/pkg/front_end/testcases/general/issue_47008_01.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue_47008_01.dart.weak.modular.expect
new file mode 100644
index 0000000..383dfab
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47008_01.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int b = 1;
+  core::int c = 2;
+  core::int d = 3;
+  core::int e = 4;
+  self::a(b.{core::num::<}(c){(core::num) → core::bool}, d.{core::num::<}(e){(core::num) → core::bool}, 1.{core::int::>>}(2){(core::int) → core::int});
+}
+static method a(core::bool x, core::bool y, core::int z) → void {
+  core::print("${x} ${y} ${z}");
+}
diff --git a/pkg/front_end/testcases/general/issue_47008_02.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue_47008_02.dart.weak.modular.expect
new file mode 100644
index 0000000..d448313
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47008_02.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int b = 1;
+  core::int c = 2;
+  core::int d = 3;
+  core::int e = 4;
+  core::int f = 5;
+  core::int g = 6;
+  self::a(b.{core::num::<}(c){(core::num) → core::bool}, d.{core::num::<}(e){(core::num) → core::bool}, f.{core::num::<}(g){(core::num) → core::bool}, 1.{core::int::>>>}(2){(core::int) → core::int});
+}
+static method a(core::bool x, core::bool y, core::bool z1, core::int z2) → void {
+  core::print("${x} ${y} ${z1} ${z2}");
+}
diff --git a/pkg/front_end/testcases/general/issue_47009_01.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue_47009_01.dart.weak.modular.expect
new file mode 100644
index 0000000..a9de674
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47009_01.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int b = 1;
+  core::int c = 2;
+  core::int as = 3;
+  self::a(b.{core::num::<}(c){(core::num) → core::bool}, as.{core::num::>}(1){(core::num) → core::bool});
+}
+static method a(core::bool x, core::bool y) → void {
+  core::print("${x} ${y}");
+}
diff --git a/pkg/front_end/testcases/general/issue_47009_02.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue_47009_02.dart.weak.modular.expect
new file mode 100644
index 0000000..c5218bb
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47009_02.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int b = 1;
+  core::int c = 2;
+  core::int d = 3;
+  core::int e = 4;
+  core::int as = 5;
+  self::a(b.{core::num::<}(c){(core::num) → core::bool}, d.{core::num::<}(e){(core::num) → core::bool}, as.{core::int::>>}(1){(core::int) → core::int});
+}
+static method a(core::bool x, core::bool y, core::int z) → void {
+  core::print("${x} ${y} ${z}");
+}
diff --git a/pkg/front_end/testcases/general/issue_47009_03.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue_47009_03.dart.weak.modular.expect
new file mode 100644
index 0000000..1d366c4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47009_03.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int b = 1;
+  core::int c = 2;
+  core::int d = 3;
+  core::int e = 4;
+  core::int f = 5;
+  core::int g = 6;
+  core::int as = 7;
+  self::a(b.{core::num::<}(c){(core::num) → core::bool}, d.{core::num::<}(e){(core::num) → core::bool}, f.{core::num::<}(g){(core::num) → core::bool}, as.{core::int::>>>}(1){(core::int) → core::int});
+}
+static method a(core::bool x, core::bool y, core::bool z1, core::int z2) → void {
+  core::print("${x} ${y} ${z1} ${z2}");
+}
diff --git a/pkg/front_end/testcases/general/literals.dart.weak.modular.expect b/pkg/front_end/testcases/general/literals.dart.weak.modular.expect
new file mode 100644
index 0000000..8ef3e48
--- /dev/null
+++ b/pkg/front_end/testcases/general/literals.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method testString() → dynamic {
+  core::print("a");
+}
+static method testInt() → dynamic {
+  core::print(1);
+}
+static method testBool() → dynamic {
+  core::print(true);
+  core::print(false);
+}
+static method testDouble() → dynamic {
+  core::print(1.0);
+}
+static method testNull() → dynamic {
+  core::print(null);
+}
+static method testList() → dynamic {
+  core::print(<dynamic>[]);
+  core::print(<core::String*>["a", "b"]);
+}
+static method testMap() → dynamic {
+  core::print(<dynamic, dynamic>{});
+  core::print(<core::String*, core::String*>{"a": "b"});
+}
+static method testSymbol() → dynamic {
+  core::print(#C1);
+  core::print(#C2);
+  core::print(#C3);
+}
+static method main() → dynamic {
+  self::testString();
+  self::testInt();
+  self::testBool();
+  self::testDouble();
+  self::testNull();
+  self::testList();
+  self::testMap();
+  self::testSymbol();
+}
+
+constants  {
+  #C1 = #fisk
+  #C2 = #org-dartlang-testcase:///literals.dart::_fisk
+  #C3 = #fisk.hest.ko
+}
diff --git a/pkg/front_end/testcases/general/local_generic_function.dart.weak.modular.expect b/pkg/front_end/testcases/general/local_generic_function.dart.weak.modular.expect
new file mode 100644
index 0000000..b22d5a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/local_generic_function.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function f<T extends core::Object* = dynamic>(core::List<T*>* l) → T*
+    return l.{core::List::[]}(0){(core::int*) →* T*};
+  core::int* x = f<core::int*>(<core::int*>[0]){(core::List<core::int*>*) →* core::int*};
+}
diff --git a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.weak.modular.expect b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.weak.modular.expect
new file mode 100644
index 0000000..10636b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/macro_class.dart b/pkg/front_end/testcases/general/macro_class.dart
new file mode 100644
index 0000000..36ad13f
--- /dev/null
+++ b/pkg/front_end/testcases/general/macro_class.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Super {}
+mixin Mixin {}
+
+macro class Class1 {}
+abstract macro class Class2 {}
+macro class Class3 = Super with Mixin;
+abstract macro class Class4 = Super with Mixin;
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/macro_class.dart.textual_outline.expect b/pkg/front_end/testcases/general/macro_class.dart.textual_outline.expect
new file mode 100644
index 0000000..d33df1d
--- /dev/null
+++ b/pkg/front_end/testcases/general/macro_class.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+class Super {}
+mixin Mixin {}
+macro
+class Class1 {}
+abstract macro class Class2 {}
+macro
+class Class3 = Super with Mixin;
+abstract macro class Class4 = Super with Mixin;
+main() {}
diff --git a/pkg/front_end/testcases/general/macro_class.dart.weak.expect b/pkg/front_end/testcases/general/macro_class.dart.weak.expect
new file mode 100644
index 0000000..5a61151
--- /dev/null
+++ b/pkg/front_end/testcases/general/macro_class.dart.weak.expect
@@ -0,0 +1,55 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/macro_class.dart:8:7: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// macro class Class1 {}
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:9:16: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// abstract macro class Class2 {}
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:10:7: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// macro class Class3 = Super with Mixin;
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:11:16: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// abstract macro class Class4 = Super with Mixin;
+//                ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+abstract class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+class Class3 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract class Class4 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/macro_class.dart.weak.modular.expect b/pkg/front_end/testcases/general/macro_class.dart.weak.modular.expect
new file mode 100644
index 0000000..5a61151
--- /dev/null
+++ b/pkg/front_end/testcases/general/macro_class.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/macro_class.dart:8:7: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// macro class Class1 {}
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:9:16: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// abstract macro class Class2 {}
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:10:7: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// macro class Class3 = Super with Mixin;
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:11:16: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// abstract macro class Class4 = Super with Mixin;
+//                ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+abstract class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+class Class3 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract class Class4 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/macro_class.dart.weak.outline.expect b/pkg/front_end/testcases/general/macro_class.dart.weak.outline.expect
new file mode 100644
index 0000000..13e7bcc
--- /dev/null
+++ b/pkg/front_end/testcases/general/macro_class.dart.weak.outline.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/macro_class.dart:8:7: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// macro class Class1 {}
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:9:16: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// abstract macro class Class2 {}
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:10:7: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// macro class Class3 = Super with Mixin;
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:11:16: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// abstract macro class Class4 = Super with Mixin;
+//                ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    ;
+}
+abstract class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    ;
+}
+class Class3 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract class Class4 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/macro_class.dart.weak.transformed.expect b/pkg/front_end/testcases/general/macro_class.dart.weak.transformed.expect
new file mode 100644
index 0000000..506e808
--- /dev/null
+++ b/pkg/front_end/testcases/general/macro_class.dart.weak.transformed.expect
@@ -0,0 +1,55 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/macro_class.dart:8:7: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// macro class Class1 {}
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:9:16: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// abstract macro class Class2 {}
+//                ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:10:7: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// macro class Class3 = Super with Mixin;
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/macro_class.dart:11:16: Error: This requires the 'macros' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.16 or higher, and running 'pub get'.
+// abstract macro class Class4 = Super with Mixin;
+//                ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+abstract class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+class Class3 extends self::Super implements self::Mixin /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract class Class4 extends self::Super implements self::Mixin /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/magic_const.dart.weak.modular.expect b/pkg/front_end/testcases/general/magic_const.dart.weak.modular.expect
new file mode 100644
index 0000000..60dcd8b
--- /dev/null
+++ b/pkg/front_end/testcases/general/magic_const.dart.weak.modular.expect
@@ -0,0 +1,81 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/magic_const.dart:15:9: Error: Constant expression expected.
+// Try inserting 'const'.
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//         ^^^^^^^^
+//
+// pkg/front_end/testcases/general/magic_const.dart:15:24: Error: Constant expression expected.
+// Try inserting 'const'.
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                        ^^^^^^^^
+//
+// pkg/front_end/testcases/general/magic_const.dart:15:39: Error: Constant expression expected.
+// Try inserting 'const'.
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                       ^
+//
+// pkg/front_end/testcases/general/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const NotConstant();
+//         ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/magic_const.dart:15:39: Error: Non-constant list literal is not a constant expression.
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Constant extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::Constant*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NotConstant extends core::Object {
+  synthetic constructor •() → self::NotConstant*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo({dynamic a = #C1, dynamic b = #C1, dynamic c = invalid-expression "Non-constant list literal is not a constant expression."}) → dynamic {}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/magic_const.dart:18:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const NotConstant();
+        ^^^^^^^^^^^";
+  new self::Constant::•();
+  core::bool::fromEnvironment("fisk");
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Constant {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///magic_const.dart:
+- Constant. (from org-dartlang-testcase:///magic_const.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/main_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/general/main_declaration.dart.weak.modular.expect
new file mode 100644
index 0000000..58118e1
--- /dev/null
+++ b/pkg/front_end/testcases/general/main_declaration.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///main_declaration_lib.dart";
+
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static method main(core::String* args) → dynamic {}
diff --git a/pkg/front_end/testcases/general/many_errors.dart.weak.modular.expect b/pkg/front_end/testcases/general/many_errors.dart.weak.modular.expect
new file mode 100644
index 0000000..48ce15f
--- /dev/null
+++ b/pkg/front_end/testcases/general/many_errors.dart.weak.modular.expect
@@ -0,0 +1,144 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/many_errors.dart:8:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const A.named1() sync* {}
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/many_errors.dart:13:1: Error: An external or native method can't have a body.
+// external foo(String x) {
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/general/many_errors.dart:10:26: Error: New expression is not a constant expression.
+//   const A.named2() : x = new Object();
+//                          ^^^
+//
+// pkg/front_end/testcases/general/many_errors.dart:10:24: Error: 'x' is a final instance variable that was initialized at the declaration.
+//   const A.named2() : x = new Object();
+//                        ^
+// pkg/front_end/testcases/general/many_errors.dart:6:9: Context: 'x' was initialized here.
+//   final x = null;
+//         ^
+//
+// pkg/front_end/testcases/general/many_errors.dart:10:24: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const A.named2() : x = new Object();
+//                        ^
+//
+// pkg/front_end/testcases/general/many_errors.dart:8:26: Error: Constructor bodies can't use 'async', 'async*', or 'sync*'.
+//   const A.named1() sync* {}
+//                          ^
+//
+// pkg/front_end/testcases/general/many_errors.dart:13:24: Error: An external or native method can't have a body.
+// external foo(String x) {
+//                        ^
+//
+// pkg/front_end/testcases/general/many_errors.dart:28:9: Error: The class 'AbstractClass' is abstract and can't be instantiated.
+//   const AbstractClass.id();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/many_errors.dart:28:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const AbstractClass.id();
+//         ^
+//
+// pkg/front_end/testcases/general/many_errors.dart:29:28: Error: The getter 'b' isn't defined for the class 'B'.
+//  - 'B' is from 'pkg/front_end/testcases/general/many_errors.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'b'.
+//   (new C()?.b ??= new B()).b;
+//                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field dynamic x = null;
+  constructor named1() → self::A*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/many_errors.dart:8:26: Error: Constructor bodies can't use 'async', 'async*', or 'sync*'.
+  const A.named1() sync* {}
+                         ^" {}
+  const constructor named2() → self::A*
+    : final dynamic #t2 = throw invalid-expression "pkg/front_end/testcases/general/many_errors.dart:10:24: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const A.named2() : x = new Object();
+                       ^", super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::B* b = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class AbstractClass extends core::Object /*hasConstConstructor*/  {
+  const constructor id() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+external static method foo(core::String* x) → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/many_errors.dart:13:24: Error: An external or native method can't have a body.
+external foo(String x) {
+                       ^";
+  {
+    return x.{core::String::length}{core::int*};
+  }
+}
+static method m() → dynamic {
+  throw invalid-expression "pkg/front_end/testcases/general/many_errors.dart:28:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const AbstractClass.id();
+        ^";
+  invalid-expression "pkg/front_end/testcases/general/many_errors.dart:29:28: Error: The getter 'b' isn't defined for the class 'B'.
+ - 'B' is from 'pkg/front_end/testcases/general/many_errors.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'b'.
+  (new C()?.b ??= new B()).b;
+                           ^" in (let final self::C* #t3 = new self::C::•() in #t3 == null ?{self::B*} null : let final self::B* #t4 = #t3.{self::C::b}{self::B*} in #t4 == null ?{self::B*} #t3.{self::C::b} = new self::B::•() : #t4){<unresolved>}.b;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/map.dart.weak.modular.expect b/pkg/front_end/testcases/general/map.dart.weak.modular.expect
new file mode 100644
index 0000000..c82d4a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/map.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(core::Map::•<dynamic, dynamic>());
+}
diff --git a/pkg/front_end/testcases/general/metadata_enum.dart.weak.modular.expect b/pkg/front_end/testcases/general/metadata_enum.dart.weak.modular.expect
new file mode 100644
index 0000000..a1967bf
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E*>* values = #C11;
+  static const field self::E* E1 = #C4;
+  static const field self::E* E2 = #C7;
+  static const field self::E* E3 = #C10;
+  const constructor •(core::int* index, core::String* name) → self::E*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = "E1"
+  #C4 = self::E {index:#C2, _name:#C3}
+  #C5 = 1
+  #C6 = "E2"
+  #C7 = self::E {index:#C5, _name:#C6}
+  #C8 = 2
+  #C9 = "E3"
+  #C10 = self::E {index:#C8, _name:#C9}
+  #C11 = <self::E*>[#C4, #C7, #C10]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///metadata_enum.dart:
+- E. (from org-dartlang-testcase:///metadata_enum.dart:8:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.weak.modular.expect
new file mode 100644
index 0000000..02845a0
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class C = self::D with self::E {
+  synthetic constructor •() → self::C*
+    : super self::D::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check.dart.weak.modular.expect b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check.dart.weak.modular.expect
new file mode 100644
index 0000000..a99c84b
--- /dev/null
+++ b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+  method f<covariant-by-class Y extends self::A::X>(self::A::f::Y y) → void {}
+}
+static method expectThrows(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object e) {
+    return;
+  }
+  throw "Expected an exception to be thrown!";
+}
+static method main() → dynamic {
+  self::A<core::num> a = new self::A::•<core::int>();
+  self::expectThrows(() → void {
+    <Y extends core::num>(Y) → void f = a.{self::A::f}{<covariant-by-class Y extends core::num>(Y) → void} as{TypeError,CovarianceCheck,ForNonNullableByDefault} <covariant-by-class Y extends core::num>(Y) → void;
+  });
+}
diff --git a/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..090dbcd
--- /dev/null
+++ b/pkg/front_end/testcases/general/method_tearoff_covariant_generic_type_check_opt_out.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  method f<covariant-by-class Y extends self::A::X*>(self::A::f::Y* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method expectThrows(() →* void f) → dynamic {
+  try {
+    f(){() →* void};
+  }
+  on dynamic catch(final dynamic e) {
+    return;
+  }
+  throw "Expected an exception to be thrown!";
+}
+static method main() → dynamic {
+  self::A<core::num*>* a = new self::A::•<core::int*>();
+  <Y extends core::num*>(Y*) →* void f = a.{self::A::f}{<covariant-by-class Y extends core::num*>(Y*) →* void};
+  self::expectThrows(() → Null {
+    f<core::double*>(3.14){(core::double*) →* void};
+  });
+}
diff --git a/pkg/front_end/testcases/general/micro.dart.weak.modular.expect b/pkg/front_end/testcases/general/micro.dart.weak.modular.expect
new file mode 100644
index 0000000..8bd8f18
--- /dev/null
+++ b/pkg/front_end/testcases/general/micro.dart.weak.modular.expect
@@ -0,0 +1,151 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  method instanceMethod() → dynamic {
+    return 123;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class ExternalValue extends core::Object {
+  synthetic constructor •() → self::ExternalValue*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract method externalInstanceMethod() → self::ExternalValue*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Box extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Box*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class FinalBox extends core::Object {
+  final field dynamic finalField;
+  constructor •(dynamic finalField) → self::FinalBox*
+    : self::FinalBox::finalField = finalField, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubFinalBox extends self::FinalBox {
+  constructor •(dynamic value) → self::SubFinalBox*
+    : super self::FinalBox::•(value)
+    ;
+}
+class DynamicReceiver1 extends core::Object {
+  synthetic constructor •() → self::DynamicReceiver1*
+    : super core::Object::•()
+    ;
+  method dynamicallyCalled(dynamic x) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class DynamicReceiver2 extends core::Object {
+  synthetic constructor •() → self::DynamicReceiver2*
+    : super core::Object::•()
+    ;
+  method dynamicallyCalled(dynamic x) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method staticMethod() → dynamic {
+  return "sdfg";
+}
+external static method externalStatic() → core::bool*;
+external static method createBar() → self::Bar*;
+static method stringArgument(dynamic x) → dynamic {}
+static method intArgument(dynamic x) → dynamic {}
+static method makeDynamicCall(dynamic receiver) → void {
+  receiver{dynamic}.dynamicallyCalled("sdfg");
+}
+static method main() → dynamic {
+  dynamic x = self::staticMethod();
+  dynamic y = new self::Foo::•().{self::Foo::instanceMethod}(){() →* dynamic};
+  core::bool* z = self::externalStatic();
+  self::ExternalValue* w = self::createBar().{self::Bar::externalInstanceMethod}(){() →* self::ExternalValue*};
+  self::stringArgument("sdfg");
+  self::intArgument(42);
+  self::Box* box = new self::Box::•();
+  box.{self::Box::field} = "sdfg";
+  dynamic a = box.{self::Box::field}{dynamic};
+  self::FinalBox* finalBox = new self::FinalBox::•("dfg");
+  dynamic b = finalBox.{self::FinalBox::finalField}{dynamic};
+  self::SubFinalBox* subBox = new self::SubFinalBox::•("dfg");
+  dynamic c = subBox.{self::FinalBox::finalField}{dynamic};
+  self::makeDynamicCall(new self::DynamicReceiver1::•());
+  self::makeDynamicCall(new self::DynamicReceiver2::•());
+  core::List<core::String*>* list = <core::String*>["string"];
+  core::String* d = list.{core::List::[]}(0){(core::int*) →* core::String*};
+}
diff --git a/pkg/front_end/testcases/general/minimum_int.dart.weak.modular.expect b/pkg/front_end/testcases/general/minimum_int.dart.weak.modular.expect
new file mode 100644
index 0000000..65f7c38
--- /dev/null
+++ b/pkg/front_end/testcases/general/minimum_int.dart.weak.modular.expect
@@ -0,0 +1,6 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  return core::print(-9223372036854775808.{core::int::unary-}(){() →* core::int*});
diff --git a/pkg/front_end/testcases/general/missing_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/general/missing_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..12e92e5
--- /dev/null
+++ b/pkg/front_end/testcases/general/missing_constructor.dart.weak.modular.expect
@@ -0,0 +1,113 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:10:11: Error: Superclass has no constructor named 'Super'.
+//   Sub() : super();
+//           ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:11:15: Error: Superclass has no constructor named 'Super.foo'.
+//   Sub.foo() : super.foo();
+//               ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:15:15: Error: Couldn't find constructor 'Bad'.
+//   Bad.foo() : this();
+//               ^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:16:15: Error: Couldn't find constructor 'Bad.baz'.
+//   Bad.bar() : this.baz();
+//               ^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:22:24: Error: Superclass has no constructor named 'Super'.
+//   MixinApplication() : super();
+//                        ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:23:28: Error: Superclass has no constructor named 'Super.foo'.
+//   MixinApplication.foo() : super.foo();
+//                            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor _() → self::Super*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Sub extends self::Super {
+  constructor •() → self::Sub*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/missing_constructor.dart:10:11: Error: Superclass has no constructor named 'Super'.
+  Sub() : super();
+          ^^^^^"
+    ;
+  constructor foo() → self::Sub*
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/missing_constructor.dart:11:15: Error: Superclass has no constructor named 'Super.foo'.
+  Sub.foo() : super.foo();
+              ^^^^^"
+    ;
+}
+class Bad extends core::Object {
+  constructor foo() → self::Bad*
+    : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/missing_constructor.dart:15:15: Error: Couldn't find constructor 'Bad'.
+  Bad.foo() : this();
+              ^^^^"
+    ;
+  constructor bar() → self::Bad*
+    : final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_constructor.dart:16:15: Error: Couldn't find constructor 'Bad.baz'.
+  Bad.bar() : this.baz();
+              ^^^^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _MixinApplication&Super&M = self::Super with self::M /*isAnonymousMixin*/  {
+  synthetic constructor _() → self::_MixinApplication&Super&M*
+    : super self::Super::_()
+    ;
+}
+class MixinApplication extends self::_MixinApplication&Super&M {
+  constructor •() → self::MixinApplication*
+    : final dynamic #t5 = invalid-expression "pkg/front_end/testcases/general/missing_constructor.dart:22:24: Error: Superclass has no constructor named 'Super'.
+  MixinApplication() : super();
+                       ^^^^^"
+    ;
+  constructor foo() → self::MixinApplication*
+    : final dynamic #t6 = invalid-expression "pkg/front_end/testcases/general/missing_constructor.dart:23:28: Error: Superclass has no constructor named 'Super.foo'.
+  MixinApplication.foo() : super.foo();
+                           ^^^^^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/missing_prefix_name.dart.weak.modular.expect b/pkg/front_end/testcases/general/missing_prefix_name.dart.weak.modular.expect
new file mode 100644
index 0000000..fc75ee08
--- /dev/null
+++ b/pkg/front_end/testcases/general/missing_prefix_name.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/missing_prefix_name.dart:5:37: Error: Expected an identifier, but got ';'.
+// Try inserting an identifier before ';'.
+// import "missing_prefix_name.dart" as;
+//                                     ^
+//
+import self as self;
+
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/missing_toplevel.dart.weak.modular.expect b/pkg/front_end/testcases/general/missing_toplevel.dart.weak.modular.expect
new file mode 100644
index 0000000..e4cac82
--- /dev/null
+++ b/pkg/front_end/testcases/general/missing_toplevel.dart.weak.modular.expect
@@ -0,0 +1,131 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
+//  - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+// var missingBinary = classWithProperty.property += 2;
+//                                                ^
+//
+// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
+//  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+// var missingIndexGet = classWithIndexSet[0] ??= 2;
+//                                        ^
+//
+// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
+//  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+// var missingIndexSet = classWithIndexGet[0] ??= 2;
+//                                        ^
+//
+// pkg/front_end/testcases/general/missing_toplevel.dart:30:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
+//  - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+// var missingPropertyGet = emptyClass.property;
+//                                     ^^^^^^^^
+//
+// pkg/front_end/testcases/general/missing_toplevel.dart:31:37: Error: The setter 'property' isn't defined for the class 'EmptyClass'.
+//  - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+// var missingPropertySet = emptyClass.property = 42;
+//                                     ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class EmptyClass extends core::Object {
+  synthetic constructor •() → self::EmptyClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithProperty extends core::Object {
+  field self::EmptyClass* property = null;
+  synthetic constructor •() → self::ClassWithProperty*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithIndexSet extends core::Object {
+  synthetic constructor •() → self::ClassWithIndexSet*
+    : super core::Object::•()
+    ;
+  operator []=(core::int* index, core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassWithIndexGet extends core::Object {
+  synthetic constructor •() → self::ClassWithIndexGet*
+    : super core::Object::•()
+    ;
+  operator [](core::int* index) → core::int*
+    return 42;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::EmptyClass* emptyClass = new self::EmptyClass::•();
+static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
+static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
+static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
+ - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+var missingBinary = classWithProperty.property += 2;
+                                               ^" in #t1.{self::ClassWithProperty::property}{self::EmptyClass*}{<unresolved>}.+(2) as{TypeError,ForDynamic} self::EmptyClass*;
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
+ - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+var missingIndexGet = classWithIndexSet[0] ??= 2;
+                                       ^" in #t2{<unresolved>}.[](#t3) in #t4 == null ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5){(core::int*, core::int*) →* void} in #t5 : #t4;
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8){(core::int*) →* core::int*} in #t9 == null ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
+ - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+var missingIndexSet = classWithIndexGet[0] ??= 2;
+                                       ^" in #t7{<unresolved>}.[]=(#t8, #t10) in #t10 : #t9;
+static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:30:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
+ - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'property'.
+var missingPropertyGet = emptyClass.property;
+                                    ^^^^^^^^" in self::emptyClass{<unresolved>}.property;
+static field core::int* missingPropertySet = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:31:37: Error: The setter 'property' isn't defined for the class 'EmptyClass'.
+ - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'property'.
+var missingPropertySet = emptyClass.property = 42;
+                                    ^^^^^^^^" in self::emptyClass{<unresolved>}.property = 42;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/mixin.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..9ec9ad2d
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin.dart.weak.modular.expect
@@ -0,0 +1,142 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&Object&M1 = core::Object with self::M1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_B&Object&M1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method m() → dynamic
+    return super.{self::M1::m}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_B&Object&M1&M2*
+    : super self::_B&Object&M1::•()
+    ;
+  mixin-super-stub method m() → dynamic
+    return super.{self::M2::m}();
+}
+class B extends self::_B&Object&M1&M2 {
+  constructor •(dynamic value) → self::B*
+    : super self::_B&Object&M1&M2::•()
+    ;
+}
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&M1 = core::Object with self::M1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&M1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method m() → dynamic
+    return super.{self::M1::m}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&M1&M2*
+    : super self::_C&Object&M1::•()
+    ;
+  mixin-super-stub method m() → dynamic
+    return super.{self::M2::m}();
+}
+class C extends self::_C&Object&M1&M2 {
+  constructor •(dynamic value) → self::C*
+    : super self::_C&Object&M1&M2::•()
+    ;
+}
+abstract class G1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G1<self::G1::T*>*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print(self::G1::T*);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _D&Object&G1<S extends core::Object* = dynamic> = core::Object with self::G1<self::_D&Object&G1::S*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S*>*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method m() → dynamic
+    return super.{self::G1::m}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<S extends core::Object* = dynamic> extends self::_D&Object&G1<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    : super self::_D&Object&G1::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•(null).{self::_B&Object&M1&M2::m}(){() →* dynamic};
+  new self::C::•(null).{self::_C&Object&M1&M2::m}(){() →* dynamic};
+  new self::D::•<dynamic>().{self::_D&Object&G1::m}(){() →* dynamic};
+  new self::D::•<core::int*>().{self::_D&Object&G1::m}(){() →* dynamic};
+  new self::D::•<core::List<core::int*>*>().{self::_D&Object&G1::m}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/general/mixin_application_inferred_parameter_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_application_inferred_parameter_type.dart.weak.modular.expect
new file mode 100644
index 0000000..c6579d8
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_application_inferred_parameter_type.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_application_inferred_parameter_type.dart:20:13: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//   new Class('');
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Super extends core::Object {
+  field core::int* field = 42;
+  constructor •(core::int* field) → self::Super*
+    : self::Super::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class = self::Super with self::Mixin {
+  synthetic constructor •(core::int* field) → self::Class*
+    : super self::Super::•(field)
+    ;
+}
+static method main() → dynamic {
+  new self::Class::•(0);
+}
+static method error() → dynamic {
+  new self::Class::•(invalid-expression "pkg/front_end/testcases/general/mixin_application_inferred_parameter_type.dart:20:13: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  new Class('');
+            ^" in "" as{TypeError} core::int*);
+}
diff --git a/pkg/front_end/testcases/general/mixin_application_lub.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_application_lub.dart.weak.modular.expect
new file mode 100644
index 0000000..8972ec3
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_application_lub.dart.weak.modular.expect
@@ -0,0 +1,78 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Diagnosticable extends core::Object {
+  synthetic constructor •() → self::Diagnosticable*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _SomeClass&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_SomeClass&Object&Diagnosticable*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SomeClass extends self::_SomeClass&Object&Diagnosticable {
+  synthetic constructor •() → self::SomeClass*
+    : super self::_SomeClass&Object&Diagnosticable::•()
+    ;
+}
+abstract class _State&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_State&Object&Diagnosticable*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class State<T extends core::Object* = dynamic> extends self::_State&Object&Diagnosticable {
+  synthetic constructor •() → self::State<self::State::T*>*
+    : super self::_State&Object&Diagnosticable::•()
+    ;
+}
+class StateA extends self::State<dynamic> {
+  synthetic constructor •() → self::StateA*
+    : super self::State::•()
+    ;
+}
+class StateB extends self::State<core::int*> {
+  synthetic constructor •() → self::StateB*
+    : super self::State::•()
+    ;
+}
+static field self::StateA* a = new self::StateA::•();
+static field self::StateB* b = new self::StateB::•();
+static method foo<T extends core::Object* = dynamic>(self::foo::T* x) → dynamic {
+  core::print(self::foo::T*);
+}
+static method main() → dynamic {
+  self::Diagnosticable* x = let final self::StateA* #t1 = self::a in #t1 == null ?{self::Diagnosticable*} self::b : #t1;
+  self::foo<self::Diagnosticable*>(x);
+}
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.weak.modular.expect
new file mode 100644
index 0000000..56cdffa
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.weak.modular.expect
@@ -0,0 +1,413 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:21:7: Error: The mixin application class 'A0' introduces an erroneous override of 'foo'.
+// class A0 = S with M;
+//       ^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:22:7: Error: The mixin application class 'A1' introduces an erroneous override of 'foo'.
+// class A1 = S with M1, M;
+//       ^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:23:7: Error: The mixin application class 'A2' introduces an erroneous override of 'foo'.
+// class A2 = S with M1, M2, M;
+//       ^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:25:7: Error: Applying the mixin 'M' to 'S' introduces an erroneous override of 'foo'.
+// class A0X = S with M, MX;
+//       ^^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:26:7: Error: Applying the mixin 'M' to 'S with M1' introduces an erroneous override of 'foo'.
+// class A1X = S with M1, M, MX;
+//       ^^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:27:7: Error: Applying the mixin 'M' to 'S with M1, M2' introduces an erroneous override of 'foo'.
+// class A2X = S with M1, M2, M, MX;
+//       ^^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:29:7: Error: Applying the mixin 'M' to 'S' introduces an erroneous override of 'foo'.
+// class B0 extends S with M {}
+//       ^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:31:7: Error: Applying the mixin 'M' to 'S with M1' introduces an erroneous override of 'foo'.
+// class B1 extends S with M1, M {}
+//       ^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:33:7: Error: Applying the mixin 'M' to 'S with M1, M2' introduces an erroneous override of 'foo'.
+// class B2 extends S with M1, M2, M {}
+//       ^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:35:7: Error: Applying the mixin 'M' to 'S' introduces an erroneous override of 'foo'.
+// class B0X extends S with M, MX {}
+//       ^^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:37:7: Error: Applying the mixin 'M' to 'S with M1' introduces an erroneous override of 'foo'.
+// class B1X extends S with M1, M, MX {}
+//       ^^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:39:7: Error: Applying the mixin 'M' to 'S with M1, M2' introduces an erroneous override of 'foo'.
+// class B2X extends S with M1, M2, M, MX {}
+//       ^^^
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Context: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class S extends core::Object {
+  synthetic constructor •() → self::S*
+    : super core::Object::•()
+    ;
+  method foo([dynamic x = #C1]) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class MX extends core::Object {
+  synthetic constructor •() → self::MX*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A0 = self::S with self::M {
+  synthetic constructor •() → self::A0*
+    : super self::S::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+abstract class _A1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A1&S&M1*
+    : super self::S::•()
+    ;
+}
+class A1 = self::_A1&S&M1 with self::M {
+  synthetic constructor •() → self::A1*
+    : super self::_A1&S&M1::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+abstract class _A2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A2&S&M1&M2*
+    : super self::_A2&S&M1::•()
+    ;
+}
+class A2 = self::_A2&S&M1&M2 with self::M {
+  synthetic constructor •() → self::A2*
+    : super self::_A2&S&M1&M2::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+abstract class _A0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A0X&S&M*
+    : super self::S::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+class A0X = self::_A0X&S&M with self::MX {
+  synthetic constructor •() → self::A0X*
+    : super self::_A0X&S&M::•()
+    ;
+}
+abstract class _A1X&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A1X&S&M1&M*
+    : super self::_A1X&S&M1::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+class A1X = self::_A1X&S&M1&M with self::MX {
+  synthetic constructor •() → self::A1X*
+    : super self::_A1X&S&M1&M::•()
+    ;
+}
+abstract class _A2X&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A2X&S&M1&M2*
+    : super self::_A2X&S&M1::•()
+    ;
+}
+abstract class _A2X&S&M1&M2&M = self::_A2X&S&M1&M2 with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A2X&S&M1&M2&M*
+    : super self::_A2X&S&M1&M2::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+class A2X = self::_A2X&S&M1&M2&M with self::MX {
+  synthetic constructor •() → self::A2X*
+    : super self::_A2X&S&M1&M2&M::•()
+    ;
+}
+abstract class _B0&S&M = self::S with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B0&S&M*
+    : super self::S::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0*
+    : super self::_B0&S&M::•()
+    ;
+}
+abstract class _B1&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B1&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B1&S&M1&M*
+    : super self::_B1&S&M1::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1*
+    : super self::_B1&S&M1&M::•()
+    ;
+}
+abstract class _B2&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B2&S&M1&M2*
+    : super self::_B2&S&M1::•()
+    ;
+}
+abstract class _B2&S&M1&M2&M = self::_B2&S&M1&M2 with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B2&S&M1&M2&M*
+    : super self::_B2&S&M1&M2::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+class B2 extends self::_B2&S&M1&M2&M {
+  synthetic constructor •() → self::B2*
+    : super self::_B2&S&M1&M2&M::•()
+    ;
+}
+abstract class _B0X&S&M = self::S with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B0X&S&M*
+    : super self::S::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B0X&S&M&MX*
+    : super self::_B0X&S&M::•()
+    ;
+}
+class B0X extends self::_B0X&S&M&MX {
+  synthetic constructor •() → self::B0X*
+    : super self::_B0X&S&M&MX::•()
+    ;
+}
+abstract class _B1X&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B1X&S&M1&M*
+    : super self::_B1X&S&M1::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B1X&S&M1&M&MX*
+    : super self::_B1X&S&M1&M::•()
+    ;
+}
+class B1X extends self::_B1X&S&M1&M&MX {
+  synthetic constructor •() → self::B1X*
+    : super self::_B1X&S&M1&M&MX::•()
+    ;
+}
+abstract class _B2X&S&M1 = self::S with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B2X&S&M1&M2*
+    : super self::_B2X&S&M1::•()
+    ;
+}
+abstract class _B2X&S&M1&M2&M = self::_B2X&S&M1&M2 with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M*
+    : super self::_B2X&S&M1&M2::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+}
+abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M&MX*
+    : super self::_B2X&S&M1&M2&M::•()
+    ;
+}
+class B2X extends self::_B2X&S&M1&M2&M&MX {
+  synthetic constructor •() → self::B2X*
+    : super self::_B2X&S&M1&M2&M&MX::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/mixin_conflicts.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_conflicts.dart.weak.modular.expect
new file mode 100644
index 0000000..94fa4c4
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_conflicts.dart.weak.modular.expect
@@ -0,0 +1,185 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_conflicts.dart:22:7: Error: The non-abstract class 'N2' is missing implementations for these members:
+//  - M.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class N2 = Object with M2;
+//       ^^
+// pkg/front_end/testcases/general/mixin_conflicts.dart:7:3: Context: 'M.foo' is defined here.
+//   foo() {}
+//   ^^^
+//
+// pkg/front_end/testcases/general/mixin_conflicts.dart:29:7: Error: The non-abstract class 'C2' is missing implementations for these members:
+//  - M.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C2 extends Object with M2 {}
+//       ^^
+// pkg/front_end/testcases/general/mixin_conflicts.dart:7:3: Context: 'M.foo' is defined here.
+//   foo() {}
+//   ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class N = core::Object with self::M /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::N*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&N = core::Object with self::N /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&N*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::M::foo}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::_C&Object&N {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&N::•()
+    ;
+}
+abstract class M2 extends core::Object implements self::M {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class N2 = core::Object with self::M2 /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::N2*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method bar() → dynamic
+    return super.{self::M2::bar}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class N3 = core::Object with self::M2 /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::N3*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method bar() → dynamic
+    return super.{self::M2::bar}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C2&Object&M2 = core::Object with self::M2 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C2&Object&M2*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method bar() → dynamic
+    return super.{self::M2::bar}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends self::_C2&Object&M2 {
+  synthetic constructor •() → self::C2*
+    : super self::_C2&Object&M2::•()
+    ;
+}
+abstract class _C3&Object&M2 = core::Object with self::M2 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C3&Object&M2*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method bar() → dynamic
+    return super.{self::M2::bar}();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C3 extends self::_C3&Object&M2 {
+  synthetic constructor •() → self::C3*
+    : super self::_C3&Object&M2::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.expect
index eba1d44..813bde3 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: Type variables can't be used as constants.
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: Type variables can't be used in static members.
 //   C({a: 0, b: T}) : trace = "a: $a, b: $b";
 //               ^
 //
@@ -14,7 +14,7 @@
 
 class C<T extends core::Object* = dynamic> extends core::Object {
   field core::String* trace;
-  constructor •({dynamic a = #C1, dynamic b = invalid-expression "Type variables can't be used as constants."}) → self::C<self::C::T*>*
+  constructor •({dynamic a = #C1, dynamic b = #C2}) → self::C<self::C::T*>*
     : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -54,7 +54,7 @@
     ;
 }
 abstract class _F&C&M = self::C<core::int*> with self::M /*isAnonymousMixin*/  {
-  synthetic constructor •({dynamic a = #C1, dynamic b = #C3}) → self::_F&C&M*
+  synthetic constructor •({dynamic a = #C1, dynamic b = #C2}) → self::_F&C&M*
     : super self::C::•(a: a, b: b)
     ;
 }
@@ -73,6 +73,5 @@
 
 constants  {
   #C1 = 0
-  #C2 = TypeLiteralConstant(core::String*)
-  #C3 = TypeLiteralConstant(core::int*)
+  #C2 = TypeLiteralConstant(invalid-type)
 }
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..813bde3
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: Type variables can't be used in static members.
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field core::String* trace;
+  constructor •({dynamic a = #C1, dynamic b = #C2}) → self::C<self::C::T*>*
+    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D = self::C<core::String*> with self::M {
+  synthetic constructor •({dynamic a = #C1, dynamic b = #C2}) → self::D*
+    : super self::C::•(a: a, b: b)
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+}
+abstract class _F&C&M = self::C<core::int*> with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •({dynamic a = #C1, dynamic b = #C2}) → self::_F&C&M*
+    : super self::C::•(a: a, b: b)
+    ;
+}
+class F extends self::_F&C&M {
+  synthetic constructor •() → self::F*
+    : super self::_F&C&M::•()
+    ;
+}
+static method main() → dynamic {
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<core::Object*>().{self::C::trace}{core::String*});
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().{self::C::trace}{core::String*});
+  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().{self::C::trace}{core::String*});
+  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().{self::C::trace}{core::String*});
+  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().{self::C::trace}{core::String*});
+}
+
+constants  {
+  #C1 = 0
+  #C2 = TypeLiteralConstant(invalid-type)
+}
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
index 1b5d000..b84923c 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.outline.expect
@@ -1,4 +1,11 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: Type variables can't be used in static members.
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//               ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -6,7 +13,7 @@
 
 class C<T extends core::Object* = dynamic> extends core::Object {
   field core::String* trace;
-  constructor •({dynamic a, dynamic b}) → self::C<self::C::T*>*
+  constructor •({dynamic a = 0, dynamic b = invalid-type}) → self::C<self::C::T*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -53,3 +60,8 @@
 }
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///mixin_constructors_with_default_values.dart:9:15 -> TypeLiteralConstant(<invalid>)
+Extra constant evaluation: evaluated: 5, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.transformed.expect
index 7780786..ee8735c 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: Type variables can't be used as constants.
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: Type variables can't be used in static members.
 //   C({a: 0, b: T}) : trace = "a: $a, b: $b";
 //               ^
 //
@@ -14,7 +14,7 @@
 
 class C<T extends core::Object* = dynamic> extends core::Object {
   field core::String* trace;
-  constructor •({dynamic a = #C1, dynamic b = invalid-expression "Type variables can't be used as constants."}) → self::C<self::C::T*>*
+  constructor •({dynamic a = #C1, dynamic b = #C2}) → self::C<self::C::T*>*
     : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -54,7 +54,7 @@
     ;
 }
 abstract class _F&C&M extends self::C<core::int*> implements self::M /*isAnonymousMixin,isEliminatedMixin*/  {
-  synthetic constructor •({dynamic a = #C1, dynamic b = #C3}) → self::_F&C&M*
+  synthetic constructor •({dynamic a = #C1, dynamic b = #C2}) → self::_F&C&M*
     : super self::C::•(a: a, b: b)
     ;
 }
@@ -73,6 +73,5 @@
 
 constants  {
   #C1 = 0
-  #C2 = TypeLiteralConstant(core::String*)
-  #C3 = TypeLiteralConstant(core::int*)
+  #C2 = TypeLiteralConstant(invalid-type)
 }
diff --git a/pkg/front_end/testcases/general/mixin_covariant.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_covariant.dart.weak.modular.expect
new file mode 100644
index 0000000..503a71e
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_covariant.dart.weak.modular.expect
@@ -0,0 +1,359 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef TakeInts = (core::int*, core::int*, core::int*, core::int*, core::int*) →* void;
+typedef TakeObjectsAndInts = (core::Object*, core::int*, core::Object*, core::int*, core::int*) →* void;
+typedef TakeObjects = (core::Object*, core::Object*, core::Object*, core::Object*, core::Object*) →* void;
+typedef TakeOptionalInts = ([core::int*, core::int*, core::int*, core::int*]) →* void;
+typedef TakeOptionalObjectsAndInts = ([core::Object*, core::int*, core::Object*, core::int*]) →* void;
+typedef TakeNamedInts = ({a: core::int*, b: core::int*, c: core::int*, d: core::int*}) →* void;
+typedef TakeNamedObjectsAndInts = ({a: core::Object*, b: core::int*, c: core::Object*, d: core::int*}) →* void;
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int* a, core::int* b) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+  method method(core::int* a, covariant-by-declaration core::int* b) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&M1 = core::Object with self::M1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&M1*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(covariant-by-declaration core::int* a, core::int* b) → dynamic
+    return super.{self::M1::method}(a, b);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&M1&M2*
+    : super self::_C&Object&M1::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::int* a, covariant-by-declaration core::int* b) → dynamic
+    return super.{self::M2::method}(a, b);
+}
+class C extends self::_C&Object&M1&M2 {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&M1&M2::•()
+    ;
+}
+class Direct extends core::Object {
+  synthetic constructor •() → self::Direct*
+    : super core::Object::•()
+    ;
+  method positional(covariant-by-declaration core::int* a, core::int* b, covariant-by-declaration core::int* c, core::int* d, core::int* e) → void {}
+  method optional([covariant-by-declaration core::int* a = #C1, core::int* b = #C1, covariant-by-declaration core::int* c = #C1, core::int* d = #C1]) → void {}
+  method named({covariant-by-declaration core::int* a = #C1, core::int* b = #C1, covariant-by-declaration core::int* c = #C1, core::int* d = #C1}) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Inherited extends self::Direct {
+  synthetic constructor •() → self::Inherited*
+    : super self::Direct::•()
+    ;
+}
+class Override1 extends core::Object {
+  synthetic constructor •() → self::Override1*
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int* a, core::int* b, core::int* c, core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Override2 extends self::Override1 {
+  synthetic constructor •() → self::Override2*
+    : super self::Override1::•()
+    ;
+  method method(covariant-by-declaration core::int* a, core::int* b, covariant-by-declaration core::int* c, core::int* d, core::int* e) → void {}
+}
+class Override3 extends self::Override2 {
+  synthetic constructor •() → self::Override3*
+    : super self::Override2::•()
+    ;
+  method method(covariant-by-declaration core::int* a, core::int* b, covariant-by-declaration core::int* c, core::int* d, core::int* e) → void {}
+}
+abstract class Implement1 extends core::Object {
+  synthetic constructor •() → self::Implement1*
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int* a, core::int* b, core::int* c, core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Implement2 extends core::Object {
+  synthetic constructor •() → self::Implement2*
+    : super core::Object::•()
+    ;
+  method method(core::int* a, covariant-by-declaration core::int* b, core::int* c, core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Implement3 extends core::Object {
+  synthetic constructor •() → self::Implement3*
+    : super core::Object::•()
+    ;
+  method method(core::int* a, core::int* b, covariant-by-declaration core::int* c, core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Implement4 extends core::Object implements self::Implement3 {
+  synthetic constructor •() → self::Implement4*
+    : super core::Object::•()
+    ;
+  method method(core::int* a, core::int* b, covariant-by-declaration core::int* c, covariant-by-declaration core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Implement5 extends core::Object implements self::Implement1, self::Implement2, self::Implement4 {
+  synthetic constructor •() → self::Implement5*
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int* a, covariant-by-declaration core::int* b, covariant-by-declaration core::int* c, covariant-by-declaration core::int* d, covariant-by-declaration core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1*
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int* a, core::int* b, core::int* c, core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2*
+    : super core::Object::•()
+    ;
+  method method(core::int* a, covariant-by-declaration core::int* b, core::int* c, core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mixin1 extends core::Object {
+  synthetic constructor •() → self::Mixin1*
+    : super core::Object::•()
+    ;
+  method method(core::int* a, core::int* b, covariant-by-declaration core::int* c, core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mixin2 extends core::Object {
+  synthetic constructor •() → self::Mixin2*
+    : super core::Object::•()
+    ;
+  method method(core::int* a, core::int* b, core::int* c, covariant-by-declaration core::int* d, core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass*
+    : super core::Object::•()
+    ;
+  method method(core::int* a, core::int* b, core::int* c, core::int* d, covariant-by-declaration core::int* e) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Mixed&Superclass&Mixin1 = self::Superclass with self::Mixin1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Mixed&Superclass&Mixin1*
+    : super self::Superclass::•()
+    ;
+  forwarding-stub method method(core::int* a, core::int* b, covariant-by-declaration core::int* c, core::int* d, covariant-by-declaration core::int* e) → void
+    return super.{self::Mixin1::method}(a, b, c, d, e);
+}
+abstract class _Mixed&Superclass&Mixin1&Mixin2 = self::_Mixed&Superclass&Mixin1 with self::Mixin2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Mixed&Superclass&Mixin1&Mixin2*
+    : super self::_Mixed&Superclass&Mixin1::•()
+    ;
+  forwarding-stub method method(core::int* a, core::int* b, covariant-by-declaration core::int* c, covariant-by-declaration core::int* d, covariant-by-declaration core::int* e) → void
+    return super.{self::Mixin2::method}(a, b, c, d, e);
+}
+class Mixed extends self::_Mixed&Superclass&Mixin1&Mixin2 implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::Mixed*
+    : super self::_Mixed&Superclass&Mixin1&Mixin2::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::int* a, covariant-by-declaration core::int* b, covariant-by-declaration core::int* c, covariant-by-declaration core::int* d, covariant-by-declaration core::int* e) → void
+    return super.{self::Mixin2::method}(a, b, c, d, e);
+}
+static method main() → void {
+  self::testDirect();
+  self::testInherited();
+  self::testOverridden();
+  self::testImplemented();
+  self::testMixed();
+}
+static method testDirect() → void {
+  (core::int*, core::int*, core::int*, core::int*, core::int*) →* void positional = new self::Direct::•().{self::Direct::positional}{(core::int*, core::int*, core::int*, core::int*, core::int*) →* void};
+  self::isTrue(positional is (core::int*, core::int*, core::int*, core::int*, core::int*) →* void);
+  self::isTrue(positional is (core::Object*, core::int*, core::Object*, core::int*, core::int*) →* void);
+  ([core::int*, core::int*, core::int*, core::int*]) →* void optional = new self::Direct::•().{self::Direct::optional}{([core::int*, core::int*, core::int*, core::int*]) →* void};
+  self::isTrue(optional is ([core::int*, core::int*, core::int*, core::int*]) →* void);
+  self::isTrue(optional is ([core::Object*, core::int*, core::Object*, core::int*]) →* void);
+  ({a: core::int*, b: core::int*, c: core::int*, d: core::int*}) →* void named = new self::Direct::•().{self::Direct::named}{({a: core::int*, b: core::int*, c: core::int*, d: core::int*}) →* void};
+  self::isTrue(named is ({a: core::int*, b: core::int*, c: core::int*, d: core::int*}) →* void);
+  self::isTrue(named is ({a: core::Object*, b: core::int*, c: core::Object*, d: core::int*}) →* void);
+}
+static method testInherited() → void {
+  (core::int*, core::int*, core::int*, core::int*, core::int*) →* void positional = new self::Inherited::•().{self::Direct::positional}{(core::int*, core::int*, core::int*, core::int*, core::int*) →* void};
+  self::isTrue(positional is (core::int*, core::int*, core::int*, core::int*, core::int*) →* void);
+  self::isTrue(positional is (core::Object*, core::int*, core::Object*, core::int*, core::int*) →* void);
+  ([core::int*, core::int*, core::int*, core::int*]) →* void optional = new self::Inherited::•().{self::Direct::optional}{([core::int*, core::int*, core::int*, core::int*]) →* void};
+  self::isTrue(optional is ([core::int*, core::int*, core::int*, core::int*]) →* void);
+  self::isTrue(optional is ([core::Object*, core::int*, core::Object*, core::int*]) →* void);
+  ({a: core::int*, b: core::int*, c: core::int*, d: core::int*}) →* void named = new self::Inherited::•().{self::Direct::named}{({a: core::int*, b: core::int*, c: core::int*, d: core::int*}) →* void};
+  self::isTrue(named is ({a: core::int*, b: core::int*, c: core::int*, d: core::int*}) →* void);
+  self::isTrue(named is ({a: core::Object*, b: core::int*, c: core::Object*, d: core::int*}) →* void);
+}
+static method testOverridden() → void {
+  (core::int*, core::int*, core::int*, core::int*, core::int*) →* void method2 = new self::Override2::•().{self::Override2::method}{(core::int*, core::int*, core::int*, core::int*, core::int*) →* void};
+  self::isTrue(method2 is (core::int*, core::int*, core::int*, core::int*, core::int*) →* void);
+  self::isTrue(method2 is (core::Object*, core::int*, core::Object*, core::int*, core::int*) →* void);
+  (core::int*, core::int*, core::int*, core::int*, core::int*) →* void method3 = new self::Override3::•().{self::Override3::method}{(core::int*, core::int*, core::int*, core::int*, core::int*) →* void};
+  self::isTrue(method3 is (core::int*, core::int*, core::int*, core::int*, core::int*) →* void);
+  self::isTrue(method3 is (core::Object*, core::int*, core::Object*, core::int*, core::int*) →* void);
+}
+static method testImplemented() → void {
+  (core::int*, core::int*, core::int*, core::int*, core::int*) →* void method = new self::Implement5::•().{self::Implement5::method}{(core::int*, core::int*, core::int*, core::int*, core::int*) →* void};
+  self::isTrue(method is (core::int*, core::int*, core::int*, core::int*, core::int*) →* void);
+  self::isTrue(method is (core::Object*, core::Object*, core::Object*, core::Object*, core::Object*) →* void);
+}
+static method testMixed() → void {
+  (core::int*, core::int*, core::int*, core::int*, core::int*) →* void method = new self::Mixed::•().{self::Mixed::method}{(core::int*, core::int*, core::int*, core::int*, core::int*) →* void};
+  self::isTrue(method is (core::int*, core::int*, core::int*, core::int*, core::int*) →* void);
+  self::isTrue(method is (core::Object*, core::Object*, core::Object*, core::Object*, core::Object*) →* void);
+}
+static method isTrue(core::bool* value) → void {
+  if(!value)
+    throw "Expected true";
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/mixin_covariant2.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_covariant2.dart.weak.modular.expect
new file mode 100644
index 0000000..8a65e36
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_covariant2.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass*
+    : super core::Object::•()
+    ;
+  method method1(core::num* argument1, core::num* argument2) → core::String*
+    return "Superclass";
+  method method2(core::num* argument1, core::num* argument2) → core::String*
+    return "Superclass";
+  method method3(core::num* argument1, covariant-by-declaration core::int* argument2) → core::String*
+    return "Superclass";
+  method method4(core::num* argument1, covariant-by-declaration core::num* argument2) → core::String*
+    return "Superclass";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin*
+    : super core::Object::•()
+    ;
+  method method1(core::num* argument1, core::num* argument2) → core::String*
+    return "Mixin";
+  method method2(covariant-by-declaration core::int* argument1, core::num* argument2) → core::String*
+    return "Mixin";
+  method method3(core::num* argument1, core::num* argument2) → core::String*
+    return "Mixin";
+  method method4(covariant-by-declaration core::int* argument1, core::int* argument2) → core::String*
+    return "Mixin";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Superclass&Mixin*
+    : super self::Superclass::•()
+    ;
+  mixin-super-stub method method1(core::num* argument1, core::num* argument2) → core::String*
+    return super.{self::Mixin::method1}(argument1, argument2);
+  mixin-super-stub method method2(covariant-by-declaration core::int* argument1, core::num* argument2) → core::String*
+    return super.{self::Mixin::method2}(argument1, argument2);
+  forwarding-stub method method3(core::num* argument1, covariant-by-declaration core::num* argument2) → core::String*
+    return super.{self::Mixin::method3}(argument1, argument2);
+  forwarding-stub method method4(covariant-by-declaration core::int* argument1, covariant-by-declaration core::int* argument2) → core::String*
+    return super.{self::Mixin::method4}(argument1, argument2);
+}
+class Class extends self::_Class&Superclass&Mixin {
+  synthetic constructor •() → self::Class*
+    : super self::_Class&Superclass&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  self::Class* c = new self::Class::•();
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num*, core::num*) →* core::String*});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int*, core::num*) →* core::String*});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num*, core::num*) →* core::String*});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int*, core::int*) →* core::String*});
+  self::Superclass* s = c;
+  self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num*, core::num*) →* core::String*});
+  self::throws(() → core::String* => s.{self::Superclass::method2}(0.5, 1.5){(core::num*, core::num*) →* core::String*});
+  self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1){(core::num*, core::int*) →* core::String*});
+  self::throws(() → core::String* => s.{self::Superclass::method4}(0.5, 1){(core::num*, core::num*) →* core::String*});
+  self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5){(core::num*, core::num*) →* core::String*});
+  self::Mixin* m = c;
+  self::expect("Mixin", m.{self::Mixin::method1}(0, 1){(core::num*, core::num*) →* core::String*});
+  self::expect("Mixin", m.{self::Mixin::method2}(0, 1){(core::int*, core::num*) →* core::String*});
+  self::expect("Mixin", m.{self::Mixin::method3}(0, 1){(core::num*, core::num*) →* core::String*});
+  self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int*, core::int*) →* core::String*});
+}
+static method expect(dynamic expected, dynamic actual) → void {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() →* void f) → void {
+  try {
+    f(){() →* void};
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.modular.expect
new file mode 100644
index 0000000..964cf88
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+  new test::Class::patched();
+  new test::Class::unpatched();
+  new test::SubClass::patched();
+  new test::SubClass::unpatched();
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_from_patch/origin_lib.dart:14:12: Error: The superclass, 'Class with Mixin', has no unnamed constructor that takes no arguments.
+//   external SubClass.patched();
+//            ^^^^^^^
+//
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class extends core::Object {
+  constructor _internal({core::bool* value = #C2}) → test::Class*
+    : super core::Object::•()
+    ;
+  @#C1
+  constructor patched() → test::Class*
+    : this test::Class::_internal()
+    ;
+  constructor unpatched() → test::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _SubClass&Class&Mixin = test::Class with test::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor patched() → test::_SubClass&Class&Mixin*
+    : super test::Class::patched()
+    ;
+  synthetic constructor unpatched() → test::_SubClass&Class&Mixin*
+    : super test::Class::unpatched()
+    ;
+  synthetic constructor _internal({core::bool* value = #C2}) → test::_SubClass&Class&Mixin*
+    : super test::Class::_internal(value: value)
+    ;
+}
+@#C1
+class SubClass extends test::_SubClass&Class&Mixin {
+  constructor _internal() → test::SubClass*
+    : super test::_SubClass&Class&Mixin::_internal(value: true)
+    ;
+  @#C1
+  constructor patched() → test::SubClass*
+    : this test::SubClass::_internal()
+    ;
+  constructor unpatched() → test::SubClass*
+    : super test::_SubClass&Class&Mixin::unpatched()
+    ;
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
index 03b90d2..46d5dff 100644
--- a/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_from_patch/main.dart.weak.outline.expect
@@ -15,7 +15,7 @@
 
 @_in::patch
 class Class extends core::Object {
-  constructor _internal({core::bool* value}) → self2::Class*
+  constructor _internal({core::bool* value = false}) → self2::Class*
     ;
   @_in::patch
   external constructor patched() → self2::Class*
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.modular.expect
new file mode 100644
index 0000000..df2967e
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.weak.modular.expect
@@ -0,0 +1,78 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends self::A*> extends core::Object {
+  covariant-by-class field self::C::T* _field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-class self::C::T* x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C<self::B*> {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+abstract class _Foo&Object&C = core::Object with self::C<self::B*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Foo&Object&C*
+    : super core::Object::•()
+    ;
+  mixin-super-stub get _field() → self::B*
+    return super.{self::C::_field};
+  mixin-super-stub set _field(covariant-by-class self::B* value) → void
+    return super.{self::C::_field} = value;
+  mixin-super-stub method foo(covariant-by-class self::B* x) → dynamic
+    return super.{self::C::foo}(x);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo extends self::_Foo&Object&C {
+  synthetic constructor •() → self::Foo*
+    : super self::_Foo&Object&C::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  foo.{self::_Foo&Object&C::foo}(new self::B::•()){(self::B*) →* dynamic};
+}
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.weak.modular.expect
new file mode 100644
index 0000000..194538f
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:13:7: Error: Class 'B with C' inherits multiple members named 'n' with incompatible signatures.
+// Try adding a declaration of 'n' to 'B with C'.
+// mixin M on B, C {}
+//       ^^^^^^
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the overridden members.
+//   int get n => 1;
+//           ^
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the overridden members.
+//   double get n => 2.0;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get n() → core::int*
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  get n() → core::double*
+    return 2.0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _M&B&C extends core::Object implements self::B, self::C /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_M&B&C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M extends self::_M&B&C /*isMixinDeclaration*/  {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/mixin_stubs.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_stubs.dart.weak.modular.expect
new file mode 100644
index 0000000..32aae43
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_stubs.dart.weak.modular.expect
@@ -0,0 +1,197 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super*
+    : super core::Object::•()
+    ;
+  method concreteExtendsConcreteMixin() → void {}
+  method concreteExtendsAbstractMixin() → void {}
+  abstract method abstractExtendsConcreteMixin() → void;
+  abstract method abstractExtendsAbstractMixin() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class MixinClass extends core::Object {
+  synthetic constructor •() → self::MixinClass*
+    : super core::Object::•()
+    ;
+  method concreteExtendsConcreteMixin() → void {}
+  abstract method concreteExtendsAbstractMixin() → void;
+  method concreteMixin() → void {}
+  method abstractExtendsConcreteMixin() → void {}
+  abstract method abstractExtendsAbstractMixin() → void;
+  abstract method abstractMixin() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+  method concreteExtendsConcreteMixin() → void {}
+  abstract method concreteExtendsAbstractMixin() → void;
+  method concreteMixin() → void {}
+  method abstractExtendsConcreteMixin() → void {}
+  abstract method abstractExtendsAbstractMixin() → void;
+  abstract method abstractMixin() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class ClassEqMixinClass = self::Super with self::MixinClass {
+  synthetic constructor •() → self::ClassEqMixinClass*
+    : super self::Super::•()
+    ;
+  mixin-super-stub method concreteExtendsConcreteMixin() → void
+    return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
+  mixin-super-stub method concreteMixin() → void
+    return super.{self::MixinClass::concreteMixin}();
+  mixin-super-stub method abstractExtendsConcreteMixin() → void
+    return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
+}
+abstract class _ClassExtendsMixinClass&Super&MixinClass = self::Super with self::MixinClass /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassExtendsMixinClass&Super&MixinClass*
+    : super self::Super::•()
+    ;
+  mixin-super-stub method concreteExtendsConcreteMixin() → void
+    return super.{self::MixinClass::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::MixinClass::concreteExtendsAbstractMixin
+  mixin-super-stub method concreteMixin() → void
+    return super.{self::MixinClass::concreteMixin}();
+  mixin-super-stub method abstractExtendsConcreteMixin() → void
+    return super.{self::MixinClass::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::MixinClass::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::MixinClass::abstractMixin
+}
+abstract class ClassExtendsMixinClass extends self::_ClassExtendsMixinClass&Super&MixinClass {
+  synthetic constructor •() → self::ClassExtendsMixinClass*
+    : super self::_ClassExtendsMixinClass&Super&MixinClass::•()
+    ;
+}
+abstract class ClassEqMixin = self::Super with self::Mixin {
+  synthetic constructor •() → self::ClassEqMixin*
+    : super self::Super::•()
+    ;
+  mixin-super-stub method concreteExtendsConcreteMixin() → void
+    return super.{self::Mixin::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
+  mixin-super-stub method concreteMixin() → void
+    return super.{self::Mixin::concreteMixin}();
+  mixin-super-stub method abstractExtendsConcreteMixin() → void
+    return super.{self::Mixin::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
+}
+abstract class _ClassExtendsMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassExtendsMixin&Super&Mixin*
+    : super self::Super::•()
+    ;
+  mixin-super-stub method concreteExtendsConcreteMixin() → void
+    return super.{self::Mixin::concreteExtendsConcreteMixin}();
+  abstract mixin-stub method concreteExtendsAbstractMixin() → void; -> self::Mixin::concreteExtendsAbstractMixin
+  mixin-super-stub method concreteMixin() → void
+    return super.{self::Mixin::concreteMixin}();
+  mixin-super-stub method abstractExtendsConcreteMixin() → void
+    return super.{self::Mixin::abstractExtendsConcreteMixin}();
+  abstract mixin-stub method abstractExtendsAbstractMixin() → void; -> self::Mixin::abstractExtendsAbstractMixin
+  abstract mixin-stub method abstractMixin() → void; -> self::Mixin::abstractMixin
+}
+abstract class ClassExtendsMixin extends self::_ClassExtendsMixin&Super&Mixin {
+  synthetic constructor •() → self::ClassExtendsMixin*
+    : super self::_ClassExtendsMixin&Super&Mixin::•()
+    ;
+}
+abstract class SubclassEqMixinClass extends self::ClassEqMixinClass {
+  synthetic constructor •() → self::SubclassEqMixinClass*
+    : super self::ClassEqMixinClass::•()
+    ;
+  method method() → dynamic {
+    this.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}(){() →* void};
+    this.{self::ClassEqMixinClass::concreteExtendsAbstractMixin}(){() →* void};
+    this.{self::ClassEqMixinClass::concreteMixin}(){() →* void};
+    this.{self::ClassEqMixinClass::abstractExtendsConcreteMixin}(){() →* void};
+    this.{self::ClassEqMixinClass::abstractExtendsAbstractMixin}(){() →* void};
+    this.{self::ClassEqMixinClass::abstractMixin}(){() →* void};
+    super.{self::ClassEqMixinClass::concreteExtendsConcreteMixin}();
+    super.{self::Super::concreteExtendsAbstractMixin}();
+    super.{self::ClassEqMixinClass::concreteMixin}();
+    super.{self::ClassEqMixinClass::abstractExtendsConcreteMixin}();
+  }
+}
+abstract class SubclassExtendsMixinClass extends self::ClassExtendsMixinClass {
+  synthetic constructor •() → self::SubclassExtendsMixinClass*
+    : super self::ClassExtendsMixinClass::•()
+    ;
+  method method() → dynamic {
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}(){() →* void};
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}(){() →* void};
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsAbstractMixin}(){() →* void};
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsConcreteMixin}(){() →* void};
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsAbstractMixin}(){() →* void};
+    this.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractMixin}(){() →* void};
+    super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteExtendsConcreteMixin}();
+    super.{self::Super::concreteExtendsAbstractMixin}();
+    super.{self::_ClassExtendsMixinClass&Super&MixinClass::concreteMixin}();
+    super.{self::_ClassExtendsMixinClass&Super&MixinClass::abstractExtendsConcreteMixin}();
+  }
+}
+abstract class SubclassEqMixin extends self::ClassEqMixin {
+  synthetic constructor •() → self::SubclassEqMixin*
+    : super self::ClassEqMixin::•()
+    ;
+  method method() → dynamic {
+    this.{self::ClassEqMixin::concreteExtendsConcreteMixin}(){() →* void};
+    this.{self::ClassEqMixin::concreteExtendsAbstractMixin}(){() →* void};
+    this.{self::ClassEqMixin::concreteMixin}(){() →* void};
+    this.{self::ClassEqMixin::abstractExtendsConcreteMixin}(){() →* void};
+    this.{self::ClassEqMixin::abstractExtendsAbstractMixin}(){() →* void};
+    this.{self::ClassEqMixin::abstractMixin}(){() →* void};
+    super.{self::ClassEqMixin::concreteExtendsConcreteMixin}();
+    super.{self::Super::concreteExtendsAbstractMixin}();
+    super.{self::ClassEqMixin::concreteMixin}();
+    super.{self::ClassEqMixin::abstractExtendsConcreteMixin}();
+  }
+}
+abstract class SubclassExtendsMixin extends self::ClassExtendsMixin {
+  synthetic constructor •() → self::SubclassExtendsMixin*
+    : super self::ClassExtendsMixin::•()
+    ;
+  method method() → dynamic {
+    this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}(){() →* void};
+    this.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsAbstractMixin}(){() →* void};
+    this.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}(){() →* void};
+    this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsConcreteMixin}(){() →* void};
+    this.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsAbstractMixin}(){() →* void};
+    this.{self::_ClassExtendsMixin&Super&Mixin::abstractMixin}(){() →* void};
+    super.{self::_ClassExtendsMixin&Super&Mixin::concreteExtendsConcreteMixin}();
+    super.{self::Super::concreteExtendsAbstractMixin}();
+    super.{self::_ClassExtendsMixin&Super&Mixin::concreteMixin}();
+    super.{self::_ClassExtendsMixin&Super&Mixin::abstractExtendsConcreteMixin}();
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/mixin_super_repeated.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_super_repeated.dart.weak.modular.expect
new file mode 100644
index 0000000..526ec74
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super_repeated.dart.weak.modular.expect
@@ -0,0 +1,83 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M extends core::Object {
+  field dynamic m = null;
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class N extends self::M {
+  synthetic constructor •() → self::N*
+    : super self::M::•()
+    ;
+  set superM(dynamic value) → void {
+    super.{self::M::m} = value;
+  }
+  get superM() → dynamic
+    return super.{self::M::m};
+}
+class S extends core::Object {
+  synthetic constructor •() → self::S*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Named&S&M = self::S with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Named&S&M*
+    : super self::S::•()
+    ;
+  mixin-super-stub get m() → dynamic
+    return super.{self::M::m};
+  mixin-super-stub set m(dynamic value) → void
+    return super.{self::M::m} = value;
+}
+abstract class _Named&S&M&N = self::_Named&S&M with self::N /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Named&S&M&N*
+    : super self::_Named&S&M::•()
+    ;
+  mixin-super-stub get superM() → dynamic
+    return super.{self::N::superM};
+  mixin-super-stub set superM(dynamic value) → void
+    return super.{self::N::superM} = value;
+}
+class Named = self::_Named&S&M&N with self::M {
+  synthetic constructor •() → self::Named*
+    : super self::_Named&S&M&N::•()
+    ;
+  mixin-super-stub get m() → dynamic
+    return super.{self::M::m};
+  mixin-super-stub set m(dynamic value) → void
+    return super.{self::M::m} = value;
+}
+static method main() → dynamic {
+  self::Named* named = new self::Named::•();
+  named.{self::Named::m} = 42;
+  named.{self::_Named&S&M&N::superM} = 87;
+  if(!(named.{self::Named::m}{dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} 42)) {
+    throw "Bad mixin translation of set:superM";
+  }
+  if(!(named.{self::_Named&S&M&N::superM}{dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} 87)) {
+    throw "Bad mixin translation of get:superM";
+  }
+}
diff --git a/pkg/front_end/testcases/general/mixin_with_static_member.dart.weak.modular.expect b/pkg/front_end/testcases/general/mixin_with_static_member.dart.weak.modular.expect
new file mode 100644
index 0000000..e89e537
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_with_static_member.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _A&B&M = self::B with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&B&M*
+    : super self::B::•()
+    ;
+}
+class A extends self::_A&B&M {
+  synthetic constructor •() → self::A*
+    : super self::_A&B&M::•()
+    ;
+}
+class B extends core::Object {
+  final field core::Object* m = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  static method m() → core::Object*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/general/named_function_scope.dart.weak.modular.expect b/pkg/front_end/testcases/general/named_function_scope.dart.weak.modular.expect
new file mode 100644
index 0000000..8ae3c40
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.weak.modular.expect
@@ -0,0 +1,195 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:26:13: Error: A function expression can't have a name.
+//     var x = T() {};
+//             ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V;
+//         ^
+// pkg/front_end/testcases/general/named_function_scope.dart:29:5: Context: Previous use of 'V'.
+//     V v;
+//     ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+//     var V = null;
+//         ^
+// pkg/front_end/testcases/general/named_function_scope.dart:34:5: Context: Previous use of 'V'.
+//     V v;
+//     ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: A function expression can't have a name.
+//     var x = T T() {};
+//               ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+//     var x = T T() {};
+//               ^
+// pkg/front_end/testcases/general/named_function_scope.dart:41:13: Context: Previous use of 'T'.
+//     var x = T T() {};
+//             ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+//     V V;
+//       ^
+// pkg/front_end/testcases/general/named_function_scope.dart:47:5: Context: Previous use of 'V'.
+//     V V;
+//     ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: A function expression can't have a name.
+//     var x = T<T>() {};
+//             ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+//     var x = T<T>() {};
+//             ^
+// pkg/front_end/testcases/general/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
+//     var x = T<T>() {};
+//               ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/general/named_function_scope.dart:55:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T() {}
+//       ^
+// pkg/front_end/testcases/general/named_function_scope.dart:59:5: Context: Previous use of 'T'.
+//     T T() {}
+//     ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
+// pkg/front_end/testcases/general/named_function_scope.dart:62:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+//     T T(T t) {}
+//       ^
+// pkg/front_end/testcases/general/named_function_scope.dart:66:5: Context: Previous use of 'T'.
+//     T T(T t) {}
+//     ^
+//
+// pkg/front_end/testcases/general/named_function_scope.dart:69:12: Error: 'T' isn't a type.
+//     void T(T t) {}
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class T extends core::Object {
+  synthetic constructor •() → self::T*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class V extends core::Object {
+  synthetic constructor •() → self::V*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  self::T* t;
+  self::V* v;
+  {
+    function T() → Null {}
+  }
+  {
+    dynamic v;
+  }
+  {
+    self::T* t;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
+  }
+  {
+    self::V* v;
+    invalid-type V = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V;
+        ^";
+  }
+  {
+    self::V* v;
+    invalid-type V = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
+    var V = null;
+        ^" in null;
+  }
+  {
+    () →* Null x = let final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    var x = T T() {};
+              ^" in let final () →* Null T = () → Null {} in T;
+  }
+  {
+    self::V* V = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
+    V V;
+      ^";
+  }
+  {
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    var x = T<T>() {};
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
+  }
+  {
+    self::T* t;
+    {
+      invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:56:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
+      function T() → self::T* {}
+    }
+  }
+  {
+    {
+      invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:59:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T() {}
+      ^";
+      function T() → self::T* {}
+    }
+  }
+  {
+    self::T* t;
+    {
+      invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:63:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
+      function T(self::T* t) → self::T* {}
+    }
+  }
+  {
+    {
+      invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:66:7: Error: Can't declare 'T' because it was already used in this scope.
+    T T(T t) {}
+      ^";
+      function T(self::T* t) → self::T* {}
+    }
+  }
+  {
+    function T(invalid-type t) → void {}
+  }
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/named_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/general/named_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..ad0b537
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_parameters.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass
+    : super core::Object::•()
+    ;
+  method foo({dynamic alpha = #C1, dynamic beta = #C1}) → dynamic {}
+  method bar({dynamic beta = #C1, dynamic alpha = #C1}) → dynamic {}
+  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {
+    callback(alpha: "one", beta: 2){({alpha: core::String, beta: core::int}) → dynamic};
+    callback(beta: 1, alpha: "two"){({alpha: core::String, beta: core::int}) → dynamic};
+  }
+}
+class Subclass extends self::Superclass {
+  synthetic constructor •() → self::Subclass
+    : super self::Superclass::•()
+    ;
+  method foo({dynamic beta = #C1, dynamic alpha = #C1}) → dynamic {}
+  method bar({dynamic alpha = #C1, dynamic beta = #C1}) → dynamic {}
+  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {}
+}
+static method topLevelNamed(dynamic beta, dynamic alpha, {dynamic gamma = #C1, dynamic delta = #C1}) → dynamic {}
+static method topLevelOptional(dynamic beta, dynamic alpha, [dynamic gamma = #C1, dynamic delta = #C1]) → dynamic {}
+static method main() → dynamic {
+  new self::Subclass::•().{self::Subclass::foo}(beta: 1, alpha: 2){({alpha: dynamic, beta: dynamic}) → dynamic};
+  new self::Subclass::•().{self::Subclass::foo}(alpha: 1, beta: 2){({alpha: dynamic, beta: dynamic}) → dynamic};
+  self::topLevelNamed(1, 2, gamma: 3, delta: 4);
+  self::topLevelNamed(1, 2, delta: 3, gamma: 4);
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.weak.modular.expect b/pkg/front_end/testcases/general/native_as_name.dart.weak.modular.expect
new file mode 100644
index 0000000..f85423d
--- /dev/null
+++ b/pkg/front_end/testcases/general/native_as_name.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class W extends core::Object {
+  field core::String* native;
+  constructor •() → self::W*
+    : self::W::native = "field", super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  method native() → core::String*
+    return "method";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Y1 extends core::Object {
+  synthetic constructor •() → self::Y1*
+    : super core::Object::•()
+    ;
+  abstract get native() → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Y2 extends self::Y1 {
+  synthetic constructor •() → self::Y2*
+    : super self::Y1::•()
+    ;
+  @#C1
+  get native() → core::String*
+    return "getter";
+}
+class Z extends core::Object {
+  field core::String* f = null;
+  synthetic constructor •() → self::Z*
+    : super core::Object::•()
+    ;
+  set native(core::String* s) → void
+    return this.{self::Z::f} = s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(new self::W::•().{self::W::native}{core::String*});
+  core::print(new self::X::•().{self::X::native}(){() →* core::String*});
+  core::print(new self::Y2::•().{self::Y2::native}{core::String*});
+  core::print((let final self::Z* #t1 = new self::Z::•() in block {
+    #t1.{self::Z::native} = "setter";
+  } =>#t1).{self::Z::f}{core::String*});
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.weak.modular.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.weak.modular.expect
new file mode 100644
index 0000000..ddcf830
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field core::int* bar;
+  const constructor •(core::int* bar) → self::A*
+    : self::A::bar = bar, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  final field self::A* baz;
+  const constructor •(self::A* baz) → self::B*
+    : self::B::baz = baz, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    new self::B::•(new self::A::•(#C1));
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/general/nested_property_set.dart.weak.modular.expect b/pkg/front_end/testcases/general/nested_property_set.dart.weak.modular.expect
new file mode 100644
index 0000000..692bedb
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_property_set.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class NumField extends core::Object {
+  field core::num* field = null;
+  synthetic constructor •() → self::NumField*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class IntField extends core::Object {
+  field core::int* field = null;
+  synthetic constructor •() → self::IntField*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class DoubleField extends core::Object {
+  field core::double* field = null;
+  synthetic constructor •() → self::DoubleField*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::IntField* intField1 = new self::IntField::•();
+  self::IntField* intField2 = new self::IntField::•();
+  self::NumField* numField = new self::NumField::•();
+  self::DoubleField* doubleField = new self::DoubleField::•();
+  intField1.{self::IntField::field} = (intField2.{self::IntField::field} = numField.{self::NumField::field}{core::num*} as{TypeError} core::int*) as{TypeError} core::int*;
+  intField1.{self::IntField::field} = numField.{self::NumField::field} = intField2.{self::IntField::field}{core::int*};
+  try {
+    numField.{self::NumField::field} = 0.5;
+    intField1.{self::IntField::field} = (doubleField.{self::DoubleField::field} = numField.{self::NumField::field}{core::num*} as{TypeError} core::double*) as{TypeError} core::int*;
+    throw "Should fail";
+  }
+  on dynamic catch(final dynamic _) {
+  }
+}
diff --git a/pkg/front_end/testcases/general/nested_variable_set.dart.weak.modular.expect b/pkg/front_end/testcases/general/nested_variable_set.dart.weak.modular.expect
new file mode 100644
index 0000000..7e193c1
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_variable_set.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int* intLocal1;
+  core::int* intLocal2;
+  core::num* numLocal;
+  core::double* doubleLocal;
+  intLocal1 = (intLocal2 = numLocal as{TypeError} core::int*) as{TypeError} core::int*;
+  intLocal1 = numLocal = intLocal2;
+  numLocal = 0.5;
+  try {
+    intLocal1 = (doubleLocal = numLocal as{TypeError} core::double*) as{TypeError} core::int*;
+    throw "Should fail";
+  }
+  on dynamic catch(final dynamic _) {
+  }
+}
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.weak.modular.expect b/pkg/front_end/testcases/general/nested_variance.dart.weak.modular.expect
new file mode 100644
index 0000000..ab01f23
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_variance.dart.weak.modular.expect
@@ -0,0 +1,301 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object* = dynamic> = <Y extends X* = dynamic>() →* void;
+typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
+typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
+typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
+typedef FcovBound<X extends core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num*> = (X*) →* X*;
+typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
+typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
+typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
+typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
+class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Acov<self::Acov::X*, self::Acov::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Ainv<X extends (self::Ainv::Y*) →* self::Ainv::Y* = (dynamic) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Ainv<self::Ainv::X*, self::Ainv::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AcovBound<X extends () →* self::AcovBound::Y* = () →* core::num*, Y extends core::num*> extends core::Object {
+  synthetic constructor •() → self::AcovBound<self::AcovBound::X*, self::AcovBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num*> extends core::Object {
+  synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AinvBound<X extends (self::AinvBound::Y*) →* self::AinvBound::Y* = (core::num*) →* core::num*, Y extends core::num*> extends core::Object {
+  synthetic constructor •() → self::AinvBound<self::AinvBound::X*, self::AinvBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AcovCyclicBound<X extends () →* self::AcovCyclicBound::Y* = () →* self::A<dynamic>*, Y extends self::A<self::AcovCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::AcovCyclicBound<self::AcovCyclicBound::X*, self::AcovCyclicBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AinvCyclicBound<X extends (self::AinvCyclicBound::Y*) →* self::AinvCyclicBound::Y* = (self::A<dynamic>*) →* self::A<dynamic>*, Y extends self::A<self::AinvCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::AinvCyclicBound<self::AinvCyclicBound::X*, self::AinvCyclicBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method toF<X extends core::Object* = dynamic>(self::toF::X* x) → <Y extends self::toF::X* = dynamic>() →* void
+  return null;
+static method testTypeAliasAsTypeArgument() → void {
+  self::Acov<() →* dynamic, dynamic>* source1;
+  <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
+  <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
+  <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
+  <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
+  self::AcovBound<() →* core::num*, core::num*>* source4;
+  <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
+  <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
+  <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
+  <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
+  self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
+  <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
+  <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
+}
+static method testNested() → void {
+  self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
+  <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
+  <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
+  <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
+  <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
+  self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
+  <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
+  <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
+  <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
+  <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
+  self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
+  <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
+  <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
+}
+static method main() → dynamic {
+  self::testTypeAliasAsTypeArgument();
+  self::testNested();
+}
diff --git a/pkg/front_end/testcases/general/new_as_selector.dart.weak.modular.expect b/pkg/front_end/testcases/general/new_as_selector.dart.weak.modular.expect
new file mode 100644
index 0000000..01083e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/new_as_selector.dart.weak.modular.expect
@@ -0,0 +1,311 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:10:5: Error: 'new' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+// int new = 87; // error
+//     ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:17:7: Error: 'new' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   int new = 42; // error
+//       ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:19:15: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   C() : super.new(); // error
+//               ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   C.named() : this.new(); // error
+//                    ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:31:16: Error: 'new' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   external int new; // error
+//                ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:23:10: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//     this.new; // error
+//          ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:24:10: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//     this.new(); // error
+//          ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:25:10: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//     this.new<int>(); // error
+//          ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:26:10: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//     this.new = 87; // error
+//          ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:39:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   new C().new; // error
+//           ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:40:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   new C().new(); // error
+//           ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:41:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   new C().new = 87; // error
+//           ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:43:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   c.new; // error
+//     ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:44:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   c.new = 87; // error
+//     ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:46:7: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo.new; // error
+//       ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:47:7: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo.new(); // error
+//       ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:48:7: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo.new<int>(); // error
+//       ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:49:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo?.new; // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:50:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo?.new(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:51:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo?.new<int>(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:52:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo..new; // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:53:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo..new(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:54:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   foo..new<int>(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:55:9: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   (foo).new; // error
+//         ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:56:9: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   (foo).new(); // error
+//         ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:57:9: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   (foo).new<int>(); // error
+//         ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:58:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   prefix1.new; // error
+//           ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:59:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   prefix1.new(); // error
+//           ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:60:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   prefix1.new<int>(); // error
+//           ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:61:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   prefix2.c.new; // error
+//             ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:62:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   prefix2.c.new(); // error
+//             ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:63:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   prefix2.c.new<int>(); // error
+//             ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:64:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   E(0).new; // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:65:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   E(0).new(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:66:8: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   E(0).new<int>(); // error
+//        ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:67:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   unresolved.new; // error
+//              ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:67:3: Error: Undefined name 'unresolved'.
+//   unresolved.new; // error
+//   ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:68:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   unresolved.new(); // error
+//              ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:68:3: Error: Undefined name 'unresolved'.
+//   unresolved.new(); // error
+//   ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:69:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   unresolved.new<int>(); // error
+//              ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:69:3: Error: Undefined name 'unresolved'.
+//   unresolved.new<int>(); // error
+//   ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:70:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   C.new; // error
+//     ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:70:5: Error: Member not found: 'new'.
+//   C.new; // error
+//     ^^^
+//
+// pkg/front_end/testcases/general/new_as_selector.dart:71:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   C.new(); // error
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///new_as_selector.dart" as prefix1;
+import "org-dartlang-testcase:///new_as_selector.dart" deferred as prefix2 hide E;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+class C extends self::Super {
+  field core::int new = 42;
+  constructor •() → self::C
+    : super self::Super::•()
+    ;
+  constructor named() → self::C
+    : this self::C::•()
+    ;
+  method method() → dynamic {
+    this.{self::C::new}{core::int};
+    self::E|call<dynamic>(this.{self::C::new}{core::int});
+    self::E|call<core::int>(this.{self::C::new}{core::int});
+    this.{self::C::new} = 87;
+  }
+}
+extension E on core::int {
+  get new = self::E|get#new;
+  set new = self::E|set#new;
+  method call = self::E|call;
+  tearoff call = self::E|get#call;
+}
+static field core::int new = 87;
+static field self::C c = new self::C::•();
+external static method E|get#new(core::int #this) → core::int;
+external static method E|set#new(core::int #this, core::int #externalFieldValue) → void;
+static method E|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method E|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+  return <T extends core::Object? = dynamic>() → dynamic => self::E|call<T%>(#this);
+static method method(dynamic d) → dynamic
+  return d{dynamic}.new;
+static method test() → dynamic {
+  new self::C::•().{self::C::new}{core::int};
+  self::E|call<dynamic>(new self::C::•().{self::C::new}{core::int});
+  new self::C::•().{self::C::new} = 87;
+  self::C c = new self::C::•();
+  c.{self::C::new}{core::int};
+  c.{self::C::new} = 87;
+  dynamic foo;
+  foo{dynamic}.new;
+  foo{dynamic}.new();
+  foo{dynamic}.new<core::int>();
+  let final dynamic #t1 = foo in #t1 == null ?{dynamic} null : #t1{dynamic}.new;
+  let final dynamic #t2 = foo in #t2 == null ?{dynamic} null : #t2{dynamic}.new();
+  let final dynamic #t3 = foo in #t3 == null ?{dynamic} null : #t3{dynamic}.new<core::int>();
+  let final dynamic #t4 = foo in block {
+    #t4{dynamic}.new;
+  } =>#t4;
+  let final dynamic #t5 = foo in block {
+    #t5{dynamic}.new();
+  } =>#t5;
+  let final dynamic #t6 = foo in block {
+    #t6{dynamic}.new<core::int>();
+  } =>#t6;
+  foo{dynamic}.new;
+  foo{dynamic}.new();
+  foo{dynamic}.new<core::int>();
+  self::new;
+  self::E|call<dynamic>(self::new);
+  self::E|call<core::int>(self::new);
+  let final dynamic #t7 = CheckLibraryIsLoaded(prefix2) in self::c.{self::C::new}{core::int};
+  let final dynamic #t8 = CheckLibraryIsLoaded(prefix2) in self::E|call<dynamic>(self::c.{self::C::new}{core::int});
+  let final dynamic #t9 = CheckLibraryIsLoaded(prefix2) in self::E|call<core::int>(self::c.{self::C::new}{core::int});
+  self::E|get#new(0);
+  self::E|call<dynamic>(self::E|get#new(0));
+  self::E|call<core::int>(self::E|get#new(0));
+  invalid-expression "pkg/front_end/testcases/general/new_as_selector.dart:67:3: Error: Undefined name 'unresolved'.
+  unresolved.new; // error
+  ^^^^^^^^^^"{<invalid>}.new;
+  invalid-expression "pkg/front_end/testcases/general/new_as_selector.dart:68:3: Error: Undefined name 'unresolved'.
+  unresolved.new(); // error
+  ^^^^^^^^^^"{dynamic}.new();
+  invalid-expression "pkg/front_end/testcases/general/new_as_selector.dart:69:3: Error: Undefined name 'unresolved'.
+  unresolved.new<int>(); // error
+  ^^^^^^^^^^"{dynamic}.new<core::int>();
+  invalid-expression "pkg/front_end/testcases/general/new_as_selector.dart:70:5: Error: Member not found: 'new'.
+  C.new; // error
+    ^^^";
+  new self::C::•();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.weak.modular.expect b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.weak.modular.expect
new file mode 100644
index 0000000..2fd6b9d
--- /dev/null
+++ b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  method _foo() → void async {
+    await null;
+    core::print("hello");
+  }
+  method foo() → void
+    return this.{self::X::_foo}(){() →* void};
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Y extends core::Object implements self::X {
+  synthetic constructor •() → self::Y*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → void {
+    core::print("Hello from noSuchMethod");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _foo() → void
+    return this.{self::Y::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* void};
+  no-such-method-forwarder method foo() → void
+    return this.{self::Y::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* void};
+}
+static method main() → dynamic {
+  self::Y* y = new self::Y::•();
+  y.{self::X::foo}(){() →* void};
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///no_such_method_forwarder.dart::_foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #foo
+}
diff --git a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.weak.modular.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..180ea5a
--- /dev/null
+++ b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "no_such_method_private_setter_lib.dart" as no_;
+
+import "org-dartlang-testcase:///no_such_method_private_setter_lib.dart";
+
+class Foo extends core::Object implements no_::Bar {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int*
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  no-such-method-forwarder set /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x(core::int* value) → void
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {
+  no_::baz(new self::Foo::•());
+}
+
+library;
+import self as no_;
+import "dart:core" as core;
+
+class Bar extends core::Object {
+  field core::int* _x = null;
+  synthetic constructor •() → no_::Bar*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method baz(no_::Bar* bar) → void {
+  return;
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///no_such_method_private_setter.dart::_x
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #org-dartlang-testcase:///no_such_method_private_setter.dart::_x=
+}
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.modular.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.modular.expect
new file mode 100644
index 0000000..5f06498
--- /dev/null
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.weak.modular.expect
@@ -0,0 +1,493 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* field1;
+  covariant-by-class field () →* self::C::T* field2;
+  field (self::C::T*) →* void field3;
+  covariant-by-class field (self::C::T*) →* self::C::T* field4;
+  covariant-by-class field () →* () →* self::C::T* field5;
+  field (() →* self::C::T*) →* void field6;
+  covariant-by-class field (() →* self::C::T*) →* self::C::T* field7;
+  covariant-by-class field ((self::C::T*) →* void) →* void field8;
+  covariant-by-class field ((self::C::T*) →* void) →* self::C::T* field9;
+  covariant-by-class field ((self::C::T*) →* self::C::T*) →* void field10;
+  covariant-by-class field ((self::C::T*) →* self::C::T*) →* self::C::T* field11;
+  covariant-by-class field <S extends self::C::T* = dynamic>() →* S* field12;
+  covariant-by-class field <S extends self::C::T* = dynamic>(S*) →* void field13;
+  covariant-by-class field <S extends self::C::T* = dynamic>(S*) →* S* field14;
+  covariant-by-class field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
+  constructor •(self::C::T* field1) → self::C<self::C::T*>*
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T*>() →* S* f) → Null {}, super core::Object::•()
+    ;
+  get getter1() → self::C::T*
+    return this.{self::C::field1}{self::C::T*};
+  get getter2() → () →* self::C::T*
+    return this.{self::C::field2}{() →* self::C::T*};
+  get getter3() → (self::C::T*) →* void
+    return this.{self::C::field3}{(self::C::T*) →* void};
+  get getter4() → (self::C::T*) →* self::C::T*
+    return this.{self::C::field4}{(self::C::T*) →* self::C::T*};
+  get getter5() → () →* () →* self::C::T*
+    return this.{self::C::field5}{() →* () →* self::C::T*};
+  get getter6() → (() →* self::C::T*) →* void
+    return this.{self::C::field6}{(() →* self::C::T*) →* void};
+  get getter7() → (() →* self::C::T*) →* self::C::T*
+    return this.{self::C::field7}{(() →* self::C::T*) →* self::C::T*};
+  get getter8() → ((self::C::T*) →* void) →* void
+    return this.{self::C::field8}{((self::C::T*) →* void) →* void};
+  get getter9() → ((self::C::T*) →* void) →* self::C::T*
+    return this.{self::C::field9}{((self::C::T*) →* void) →* self::C::T*};
+  get getter10() → ((self::C::T*) →* self::C::T*) →* void
+    return this.{self::C::field10}{((self::C::T*) →* self::C::T*) →* void};
+  get getter11() → ((self::C::T*) →* self::C::T*) →* self::C::T*
+    return this.{self::C::field11}{((self::C::T*) →* self::C::T*) →* self::C::T*};
+  get getter12() → <S extends self::C::T* = dynamic>() →* S*
+    return this.{self::C::field12}{<S extends self::C::T* = dynamic>() →* S*};
+  get getter13() → <S extends self::C::T* = dynamic>(S*) →* void
+    return this.{self::C::field13}{<S extends self::C::T* = dynamic>(S*) →* void};
+  get getter14() → <S extends self::C::T* = dynamic>(S*) →* S*
+    return this.{self::C::field14}{<S extends self::C::T* = dynamic>(S*) →* S*};
+  get getter15() → (<S extends self::C::T* = dynamic>() →* S*) →* void
+    return this.{self::C::field15}{(<S extends self::C::T* = dynamic>() →* S*) →* void};
+  set setter1(covariant-by-class self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  set setter2(covariant-by-class () →* self::C::T* value) → void {
+    this.{self::C::field2} = value;
+  }
+  set setter3((self::C::T*) →* void value) → void {
+    this.{self::C::field3} = value;
+  }
+  set setter4(covariant-by-class (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  set setter5(covariant-by-class () →* () →* self::C::T* value) → void {
+    this.{self::C::field5} = value;
+  }
+  set setter6((() →* self::C::T*) →* void value) → void {
+    this.{self::C::field6} = value;
+  }
+  set setter7(covariant-by-class (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  set setter8(covariant-by-class ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  set setter9(covariant-by-class ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  set setter10(covariant-by-class ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  set setter11(covariant-by-class ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  set setter12(covariant-by-class <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  set setter13(covariant-by-class <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  set setter14(covariant-by-class <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  set setter15(covariant-by-class (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+  method method1(covariant-by-class self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  method method2(covariant-by-class () →* self::C::T* value) → void {
+    this.{self::C::field2} = value;
+  }
+  method method3((self::C::T*) →* void value) → void {
+    this.{self::C::field3} = value;
+  }
+  method method4(covariant-by-class (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  method method5(covariant-by-class () →* () →* self::C::T* value) → void {
+    this.{self::C::field5} = value;
+  }
+  method method6((() →* self::C::T*) →* void value) → void {
+    this.{self::C::field6} = value;
+  }
+  method method7(covariant-by-class (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  method method8(covariant-by-class ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  method method9(covariant-by-class ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  method method10(covariant-by-class ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  method method11(covariant-by-class ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  method method12(covariant-by-class <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  method method13(covariant-by-class <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  method method14(covariant-by-class <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  method method15(covariant-by-class (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::num*>* c = new self::C::•<core::int*>(0);
+  c.{self::C::field1}{core::num*};
+  c.{self::C::field2}{() →* core::num*};
+  try {
+    c.{self::C::field3}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field4}{(core::num*) →* core::num*} as{TypeError,CovarianceCheck} (core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::field5}{() →* () →* core::num*};
+  try {
+    c.{self::C::field6}{(() →* core::num*) →* void} as{TypeError,CovarianceCheck} (() →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field7}{(() →* core::num*) →* core::num*} as{TypeError,CovarianceCheck} (() →* core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::field8}{((core::num*) →* void) →* void};
+  c.{self::C::field9}{((core::num*) →* void) →* core::num*};
+  try {
+    c.{self::C::field10}{((core::num*) →* core::num*) →* void} as{TypeError,CovarianceCheck} ((core::num*) →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field11}{((core::num*) →* core::num*) →* core::num*} as{TypeError,CovarianceCheck} ((core::num*) →* core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field12}{<S extends core::num* = dynamic>() →* S*} as{TypeError,CovarianceCheck} <S extends core::num* = dynamic>() →* S*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field13}{<S extends core::num* = dynamic>(S*) →* void} as{TypeError,CovarianceCheck} <S extends core::num* = dynamic>(S*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field14}{<S extends core::num* = dynamic>(S*) →* S*} as{TypeError,CovarianceCheck} <S extends core::num* = dynamic>(S*) →* S*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field15}{(<S extends core::num* = dynamic>() →* S*) →* void} as{TypeError,CovarianceCheck} (<S extends core::num* = dynamic>() →* S*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::getter1}{core::num*};
+  c.{self::C::getter2}{() →* core::num*};
+  try {
+    c.{self::C::getter3}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter4}{(core::num*) →* core::num*} as{TypeError,CovarianceCheck} (core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::getter5}{() →* () →* core::num*};
+  try {
+    c.{self::C::getter6}{(() →* core::num*) →* void} as{TypeError,CovarianceCheck} (() →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter7}{(() →* core::num*) →* core::num*} as{TypeError,CovarianceCheck} (() →* core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::getter8}{((core::num*) →* void) →* void};
+  c.{self::C::getter9}{((core::num*) →* void) →* core::num*};
+  try {
+    c.{self::C::getter10}{((core::num*) →* core::num*) →* void} as{TypeError,CovarianceCheck} ((core::num*) →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter11}{((core::num*) →* core::num*) →* core::num*} as{TypeError,CovarianceCheck} ((core::num*) →* core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter12}{<S extends core::num* = dynamic>() →* S*} as{TypeError,CovarianceCheck} <S extends core::num* = dynamic>() →* S*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter13}{<S extends core::num* = dynamic>(S*) →* void} as{TypeError,CovarianceCheck} <S extends core::num* = dynamic>(S*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter14}{<S extends core::num* = dynamic>(S*) →* S*} as{TypeError,CovarianceCheck} <S extends core::num* = dynamic>(S*) →* S*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter15}{(<S extends core::num* = dynamic>() →* S*) →* void} as{TypeError,CovarianceCheck} (<S extends core::num* = dynamic>() →* S*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter1} = 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter2} = () → core::double* => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::setter3} = (core::num* n) → Null {};
+  try {
+    c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter5} = () → () →* core::double* => () → core::double* => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
+  try {
+    c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter9} = ((core::double*) →* void f) → core::double* => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter11} = ((core::double*) →* core::num* f) → core::double* => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter12} = <S extends core::num*>() → Null => null;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter13} = <S extends core::num*>(S* s) → Null {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter14} = <S extends core::num*>(S* s) → S* => s;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter15} = (<S extends core::num*>() →* S* f) → Null {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method1}(0.5){(core::num*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method2}(() → core::double* => 0.5){(() →* core::num*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::method3}((core::num* n) → Null {}){((core::num*) →* void) →* void};
+  try {
+    c.{self::C::method4}((core::num* n) → core::double* => 0.5){((core::num*) →* core::num*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method5}(() → () →* core::double* => () → core::double* => 0.5){(() →* () →* core::num*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::method6}((() →* core::num* f) → Null {}){((() →* core::num*) →* void) →* void};
+  try {
+    c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5){((() →* core::num*) →* core::num*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method8}(((core::double*) →* void f) → Null {}){(((core::num*) →* void) →* void) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method9}(((core::double*) →* void f) → core::double* => 0.5){(((core::num*) →* void) →* core::num*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {}){(((core::num*) →* core::num*) →* void) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method11}(((core::double*) →* core::num* f) → core::double* => 0.5){(((core::num*) →* core::num*) →* core::num*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method12}(<S extends core::num*>() → Null => null){(<S extends core::num* = dynamic>() →* S*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method13}(<S extends core::num*>(S* s) → Null {}){(<S extends core::num* = dynamic>(S*) →* void) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method14}(<S extends core::num*>(S* s) → S* => s){(<S extends core::num* = dynamic>(S*) →* S*) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method15}((<S extends core::num*>() →* S* f) → Null {}){((<S extends core::num* = dynamic>() →* S*) →* void) →* void};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/nsm_covariance.dart.weak.modular.expect b/pkg/front_end/testcases/general/nsm_covariance.dart.weak.modular.expect
new file mode 100644
index 0000000..ac4c6e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/nsm_covariance.dart.weak.modular.expect
@@ -0,0 +1,247 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "nsm_covariance_lib.dart" as nsm;
+
+import "org-dartlang-testcase:///nsm_covariance_lib.dart";
+
+abstract class D1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* a, covariant-by-declaration core::int* b, covariant-by-class core::int* c, covariant-by-declaration covariant-by-class core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, covariant-by-class core::int* c = #C1, covariant-by-declaration covariant-by-class core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant-by-declaration core::int* a, covariant-by-class core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant-by-declaration core::int* a = #C1, covariant-by-class core::int* b = #C1}) → void;
+}
+abstract class D2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* x, covariant-by-declaration core::int* y, covariant-by-class core::int* z, covariant-by-declaration covariant-by-class core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, covariant-by-class core::int* c = #C1, covariant-by-declaration covariant-by-class core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant-by-declaration core::int* x, covariant-by-class core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant-by-declaration core::int* a = #C1, covariant-by-class core::int* b = #C1}) → void;
+}
+class D3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant-by-declaration core::int* b, covariant-by-class core::int* c, covariant-by-declaration covariant-by-class core::int* d) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, covariant-by-class core::int* c = #C1, covariant-by-declaration covariant-by-class core::int* d = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d}))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method3(covariant-by-declaration core::int* a, covariant-by-class core::int* b) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method4({covariant-by-declaration core::int* a = #C1, covariant-by-class core::int* b = #C1}) → void
+    return this.{self::D3::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b}))){(core::Invocation*) →* dynamic};
+}
+class D4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → self::D4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant-by-declaration core::int* y, covariant-by-class core::int* z, covariant-by-declaration covariant-by-class core::int* w) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, covariant-by-class core::int* c = #C1, covariant-by-declaration covariant-by-class core::int* d = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d}))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method3(covariant-by-declaration core::int* x, covariant-by-class core::int* y) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method4({covariant-by-declaration core::int* a = #C1, covariant-by-class core::int* b = #C1}) → void
+    return this.{self::D4::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b}))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+library;
+import self as nsm;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → nsm::A<nsm::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* a, core::int* b, covariant-by-class nsm::A::T* c, covariant-by-class nsm::A::T* d) → void;
+  abstract method _method2({core::int* a = #C1, core::int* b = #C1, covariant-by-class nsm::A::T* c = #C1, covariant-by-class nsm::A::T* d = #C1}) → void;
+  abstract method _method3(core::int* a, covariant-by-class nsm::A::T* b) → void;
+  abstract method _method4({core::int* a = #C1, covariant-by-class nsm::A::T* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → nsm::B*
+    : super core::Object::•()
+    ;
+  abstract method _method1(core::int* x, covariant-by-declaration core::int* y, core::int* z, covariant-by-declaration core::int* w) → void;
+  abstract method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, core::int* c = #C1, covariant-by-declaration core::int* d = #C1}) → void;
+  abstract method _method3(covariant-by-declaration core::int* x, core::int* y) → void;
+  abstract method _method4({covariant-by-declaration core::int* a = #C1, core::int* b = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C1 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* a, covariant-by-declaration core::int* b, covariant-by-class core::int* c, covariant-by-declaration covariant-by-class core::int* d) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, covariant-by-class core::int* c = #C1, covariant-by-declaration covariant-by-class core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant-by-declaration core::int* a, covariant-by-class core::int* b) → void;
+  abstract forwarding-stub method _method4({covariant-by-declaration core::int* a = #C1, covariant-by-class core::int* b = #C1}) → void;
+}
+abstract class C2 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method _method1(core::int* x, covariant-by-declaration core::int* y, covariant-by-class core::int* z, covariant-by-declaration covariant-by-class core::int* w) → void;
+  abstract forwarding-stub method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, covariant-by-class core::int* c = #C1, covariant-by-declaration covariant-by-class core::int* d = #C1}) → void;
+  abstract forwarding-stub method _method3(covariant-by-declaration core::int* x, covariant-by-class core::int* y) → void;
+  abstract forwarding-stub method _method4({covariant-by-declaration core::int* a = #C1, covariant-by-class core::int* b = #C1}) → void;
+}
+class C3 extends core::Object implements nsm::A<core::int*>, nsm::B {
+  synthetic constructor •() → nsm::C3*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* a, covariant-by-declaration core::int* b, covariant-by-class core::int* c, covariant-by-declaration covariant-by-class core::int* d) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b, c, d]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, covariant-by-class core::int* c = #C1, covariant-by-declaration covariant-by-class core::int* d = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d}))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method3(covariant-by-declaration core::int* a, covariant-by-class core::int* b) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[a, b]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method4({covariant-by-declaration core::int* a = #C1, covariant-by-class core::int* b = #C1}) → void
+    return this.{nsm::C3::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b}))){(core::Invocation*) →* dynamic};
+}
+class C4 extends core::Object implements nsm::B, nsm::A<core::int*> {
+  synthetic constructor •() → nsm::C4*
+    : super core::Object::•()
+    ;
+  @#C2
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method _method1(core::int* x, covariant-by-declaration core::int* y, covariant-by-class core::int* z, covariant-by-declaration covariant-by-class core::int* w) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y, z, w]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method2({core::int* a = #C1, covariant-by-declaration core::int* b = #C1, covariant-by-class core::int* c = #C1, covariant-by-declaration covariant-by-class core::int* d = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b, #C10: c, #C11: d}))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method3(covariant-by-declaration core::int* x, covariant-by-class core::int* y) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 0, #C4, core::List::unmodifiable<dynamic>(<dynamic>[x, y]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method _method4({covariant-by-declaration core::int* a = #C1, covariant-by-class core::int* b = #C1}) → void
+    return this.{nsm::C4::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 0, #C4, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: a, #C9: b}))){(core::Invocation*) →* dynamic};
+}
+
+constants  {
+  #C1 = null
+  #C2 = core::_Override {}
+  #C3 = #org-dartlang-testcase:///nsm_covariance.dart::_method1
+  #C4 = <core::Type*>[]
+  #C5 = <core::Symbol*, dynamic>{)
+  #C6 = #org-dartlang-testcase:///nsm_covariance.dart::_method2
+  #C7 = <dynamic>[]
+  #C8 = #a
+  #C9 = #b
+  #C10 = #c
+  #C11 = #d
+  #C12 = #org-dartlang-testcase:///nsm_covariance.dart::_method3
+  #C13 = #org-dartlang-testcase:///nsm_covariance.dart::_method4
+  #C14 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method1
+  #C15 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method2
+  #C16 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method3
+  #C17 = #org-dartlang-testcase:///nsm_covariance_lib.dart::_method4
+}
diff --git a/pkg/front_end/testcases/general/null_aware.dart.weak.modular.expect b/pkg/front_end/testcases/general/null_aware.dart.weak.modular.expect
new file mode 100644
index 0000000..6e39869
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int* field = null;
+  static field core::int* staticField = null;
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  let final self::Foo* #t1 = foo in #t1 == null ?{core::int*} null : #t1.{self::Foo::field} = 5;
+  self::Foo::staticField = 5;
+  let final self::Foo* #t2 = foo in #t2.{self::Foo::field}{core::int*} == null ?{core::int*} #t2.{self::Foo::field} = 5 : null;
+  self::Foo::staticField == null ?{core::int*} self::Foo::staticField = 5 : null;
+  let final self::Foo* #t3 = foo in #t3 == null ?{core::int*} null : #t3.{self::Foo::field}{core::int*} == null ?{core::int*} #t3.{self::Foo::field} = 5 : null;
+  self::Foo::staticField == null ?{core::int*} self::Foo::staticField = 5 : null;
+  core::int* intValue = let final core::int* #t4 = foo.{self::Foo::field}{core::int*} in #t4 == null ?{core::int*} 6 : #t4;
+  core::num* numValue = let final core::int* #t5 = foo.{self::Foo::field}{core::int*} in #t5 == null ?{core::num*} 4.5 : #t5;
+}
diff --git a/pkg/front_end/testcases/general/null_aware_for_in.dart.weak.modular.expect b/pkg/front_end/testcases/general/null_aware_for_in.dart.weak.modular.expect
new file mode 100644
index 0000000..46f5652
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware_for_in.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  dynamic o;
+  if(false) {
+    for (final dynamic #t1 in (let final dynamic #t2 = o in #t2 == null ?{dynamic} null : #t2{dynamic}.iterable) as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      self::Class* c = #t1 as{TypeError,ForDynamic} self::Class*;
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/general/null_aware_postfix.dart.weak.modular.expect b/pkg/front_end/testcases/general/null_aware_postfix.dart.weak.modular.expect
new file mode 100644
index 0000000..b31646a
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware_postfix.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(core::int* i) → self::C*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method main() → dynamic {
+  self::A* a;
+  let final self::A* #t1 = a in #t1 == null ?{self::B*} null : #t1.{self::A::b} = #t1.{self::A::b}{self::B*}.{self::B::+}(1){(core::int*) →* self::C*};
+  self::C* c = (let final self::A* #t2 = a in #t2 == null ?{self::B*} null : let final self::B* #t3 = #t2.{self::A::b}{self::B*} in let final void #t4 = #t2.{self::A::b} = #t3.{self::B::+}(1){(core::int*) →* self::C*} in #t3) as{TypeError} self::C*;
+}
diff --git a/pkg/front_end/testcases/general/null_aware_spread.dart.weak.modular.expect b/pkg/front_end/testcases/general/null_aware_spread.dart.weak.modular.expect
new file mode 100644
index 0000000..01b31a0
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware_spread.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method nullAwareListSpread(core::List<core::String*>* list) → dynamic {
+  list = block {
+    final core::List<core::String*>* #t1 = <core::String*>["foo"];
+    final core::Iterable<core::String*>* #t2 = list;
+    if(!(#t2 == null))
+      #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::String*>*) →* void};
+  } =>#t1;
+}
+static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
+  set = block {
+    final core::Set<core::String*>* #t3 = col::LinkedHashSet::•<core::String*>();
+    #t3.{core::Set::add}{Invariant}("foo"){(core::String*) →* core::bool*};
+    final core::Iterable<core::String*>* #t4 = set;
+    if(!(#t4 == null))
+      #t3.{core::Set::addAll}{Invariant}(#t4){(core::Iterable<core::String*>*) →* void};
+  } =>#t3;
+}
+static method nullAwareMapSpread(core::Map<core::int*, core::String*>* map) → dynamic {
+  map = block {
+    final core::Map<core::int*, core::String*>* #t5 = <core::int*, core::String*>{};
+    #t5.{core::Map::[]=}{Invariant}(0, "foo"){(core::int*, core::String*) →* void};
+    final core::Map<core::int*, core::String*>* #t6 = map;
+    if(!(#t6 == null))
+      for (final core::MapEntry<core::int*, core::String*>* #t7 in #t6.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>})
+        #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{core::int*}, #t7.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
+  } =>#t5;
+}
+static method main() → dynamic {
+  self::nullAwareListSpread(null);
+  self::nullAwareSetSpread(null);
+  self::nullAwareMapSpread(null);
+}
diff --git a/pkg/front_end/testcases/general/null_aware_super.dart.weak.modular.expect b/pkg/front_end/testcases/general/null_aware_super.dart.weak.modular.expect
new file mode 100644
index 0000000..2e47743
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware_super.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_aware_super.dart:10:18: Error: The operator '?.' cannot be used with 'super' because 'super' cannot be null.
+// Try replacing '?.' with '.'
+//   Class() : super?.named();
+//                  ^^
+//
+// pkg/front_end/testcases/general/null_aware_super.dart:10:18: Error: Cannot use '?.' here.
+// Try using '.'.
+//   Class() : super?.named();
+//                  ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor named() → self::Super
+    : super core::Object::•()
+    ;
+}
+class Class extends self::Super {
+  constructor •() → self::Class
+    : super self::Super::named()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.modular.expect b/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.modular.expect
new file mode 100644
index 0000000..7426716
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_check_type_variable_type.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class Element extends core::Object {
+  synthetic constructor •() → self::Element
+    : super core::Object::•()
+    ;
+}
+class Class<E extends self::Element?> extends core::Object {
+  covariant-by-class field self::Class::E? element;
+  constructor •(self::Class::E? element) → self::Class<self::Class::E%>
+    : self::Class::element = element, super core::Object::•()
+    ;
+  method setElement(covariant-by-class self::Class::E? element) → void {
+    if(!(this.{self::Class::element}{self::Class::E?} =={core::Object::==}{(core::Object) → core::bool} element)) {
+      this.{self::Class::element} = element;
+      core::Set<self::Element> elements = col::LinkedHashSet::•<self::Element>();
+      if(!(element == null)) {
+        elements.{core::Set::add}(element{self::Class::E% & self::Element /* '%' & '!' = '!' */}){(self::Element) → core::bool};
+      }
+      if(!(this.{self::Class::element}{self::Class::E?} == null)) {
+        elements.{core::Set::add}(this.{self::Class::element}{self::Class::E?}!){(self::Element) → core::bool};
+      }
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.weak.modular.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.weak.modular.expect
new file mode 100644
index 0000000..9f0d253
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:5:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// int? i;
+//    ^
+// pkg/front_end/testcases/general/null_safety_invalid_experiment.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.weak.modular.expect b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.weak.modular.expect
new file mode 100644
index 0000000..14c6cd9
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// int? i;
+//    ^
+// pkg/front_end/testcases/general/null_safety_invalid_experiment_and_language_version.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.weak.modular.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.weak.modular.expect
new file mode 100644
index 0000000..eb609ae
--- /dev/null
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.weak.modular.expect
@@ -0,0 +1,367 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:36:10: Error: 'foo' isn't a type.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
+//   print(<foo);
+//          ^^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
+//   print(<foo);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
+// Try inserting an identifier before '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+// Try inserting an identifier before '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+// Try inserting an identifier before '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+// Try inserting an identifier before '=='.
+//   print(==foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//   print(+foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
+// Try inserting an identifier before '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+// Try inserting an identifier before '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+// Try inserting an identifier before '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+// Try inserting an identifier before '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+// Try inserting an identifier before '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+// Try inserting an identifier before '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+// Try inserting an identifier before '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+// Try inserting an identifier before '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+// Try inserting an identifier before '>>'.
+//   print(>>foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+//   print(foo ~ 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   print(foo < 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
+//   print(foo > 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
+//   print(foo <= 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
+//   print(foo >= 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
+//   print(foo - 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//   print(foo + 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
+//   print(foo / 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
+//   print(foo ~/ 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
+//   print(foo * 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
+//   print(foo % 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
+//   print(foo | 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
+//   print(foo ^ 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
+//   print(foo & 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
+//   print(foo << 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
+//   print(foo >> 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//   print(foo[2] = 2);
+//            ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//   print(foo[2]);
+//            ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
+//   print(~foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+//   print(-foo);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  print(foo < 2);
+            ^" in foo{<unresolved>}.<(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
+  print(foo > 2);
+            ^" in foo{<unresolved>}.>(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
+  print(foo <= 2);
+            ^^" in foo{<unresolved>}.<=(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
+  print(foo >= 2);
+            ^^" in foo{<unresolved>}.>=(2));
+  core::print(foo =={self::Foo::==}{(dynamic) →* core::bool*} 2);
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
+  print(foo - 2);
+            ^" in foo{<unresolved>}.-(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+  print(foo + 2);
+            ^" in foo{<unresolved>}.+(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
+  print(foo / 2);
+            ^" in foo{<unresolved>}./(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
+  print(foo ~/ 2);
+            ^^" in foo{<unresolved>}.~/(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
+  print(foo * 2);
+            ^" in foo{<unresolved>}.*(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
+  print(foo % 2);
+            ^" in foo{<unresolved>}.%(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
+  print(foo | 2);
+            ^" in foo{<unresolved>}.|(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
+  print(foo ^ 2);
+            ^" in foo{<unresolved>}.^(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
+  print(foo & 2);
+            ^" in foo{<unresolved>}.&(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
+  print(foo << 2);
+            ^^" in foo{<unresolved>}.<<(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
+  print(foo >> 2);
+            ^^" in foo{<unresolved>}.>>(2));
+  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+  print(foo[2] = 2);
+           ^" in #t1{<unresolved>}.[]=(#t2, #t3) in #t3);
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+  print(foo[2]);
+           ^" in foo{<unresolved>}.[](2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
+  print(~foo);
+        ^" in foo{<unresolved>}.~());
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+  print(-foo);
+        ^" in foo{<unresolved>}.unary-());
+  core::print(<invalid-type>[]);
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
+  print(>foo);
+        ^"{<invalid>}.>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
+  print(<=foo);
+        ^"{<invalid>}.<=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
+  print(>=foo);
+        ^"{<invalid>}.>=(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
+  print(==foo);
+        ^" =={core::Object::==}{(core::Object*) →* core::bool*} foo);
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
+  print(+foo);
+        ^"{<invalid>}.+(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
+  print(/foo);
+        ^"{<invalid>}./(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
+  print(~/foo);
+        ^"{<invalid>}.~/(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
+  print(*foo);
+        ^"{<invalid>}.*(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
+  print(%foo);
+        ^"{<invalid>}.%(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
+  print(|foo);
+        ^"{<invalid>}.|(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
+  print(^foo);
+        ^"{<invalid>}.^(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
+  print(&foo);
+        ^"{<invalid>}.&(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
+  print(<<foo);
+        ^"{<invalid>}.<<(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
+  print(>>foo);
+        ^"{<invalid>}.>>(foo));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+  print(foo ~ 2);
+            ^");
+}
diff --git a/pkg/front_end/testcases/general/operators.dart.weak.modular.expect b/pkg/front_end/testcases/general/operators.dart.weak.modular.expect
new file mode 100644
index 0000000..8796e3d4
--- /dev/null
+++ b/pkg/front_end/testcases/general/operators.dart.weak.modular.expect
@@ -0,0 +1,81 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Operators extends core::Object {
+  synthetic constructor •() → self::Operators*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+  operator &(dynamic other) → dynamic
+    return null;
+  operator ~() → dynamic
+    return null;
+  operator |(dynamic other) → dynamic
+    return null;
+  operator ^(dynamic other) → dynamic
+    return null;
+  operator /(dynamic other) → dynamic
+    return null;
+  operator ==(dynamic other) → core::bool*
+    return null;
+  operator >(dynamic other) → dynamic
+    return null;
+  operator >=(dynamic other) → dynamic
+    return null;
+  operator [](dynamic index) → dynamic
+    return null;
+  operator []=(dynamic index, dynamic value) → void {}
+  operator <<(dynamic other) → dynamic
+    return null;
+  operator <(dynamic other) → dynamic
+    return null;
+  operator <=(dynamic other) → dynamic
+    return null;
+  operator *(dynamic other) → dynamic
+    return null;
+  operator %(dynamic other) → dynamic
+    return null;
+  operator >>(dynamic other) → dynamic
+    return null;
+  operator -(dynamic other) → dynamic
+    return null;
+  operator ~/(dynamic other) → dynamic
+    return null;
+  operator unary-() → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main(dynamic arguments) → dynamic {
+  self::Operators* a = new self::Operators::•();
+  self::Operators* b = new self::Operators::•();
+  a.{self::Operators::+}(b){(dynamic) →* dynamic};
+  a.{self::Operators::&}(b){(dynamic) →* dynamic};
+  a.{self::Operators::~}(){() →* dynamic};
+  a.{self::Operators::|}(b){(dynamic) →* dynamic};
+  a.{self::Operators::^}(b){(dynamic) →* dynamic};
+  a.{self::Operators::/}(b){(dynamic) →* dynamic};
+  a =={self::Operators::==}{(dynamic) →* core::bool*} b;
+  a.{self::Operators::>}(b){(dynamic) →* dynamic};
+  a.{self::Operators::>=}(b){(dynamic) →* dynamic};
+  a.{self::Operators::[]}(0){(dynamic) →* dynamic};
+  a.{self::Operators::[]=}(0, b){(dynamic, dynamic) →* void};
+  a.{self::Operators::<<}(b){(dynamic) →* dynamic};
+  a.{self::Operators::<}(b){(dynamic) →* dynamic};
+  a.{self::Operators::<=}(b){(dynamic) →* dynamic};
+  a.{self::Operators::*}(b){(dynamic) →* dynamic};
+  a.{self::Operators::%}(b){(dynamic) →* dynamic};
+  a.{self::Operators::>>}(b){(dynamic) →* dynamic};
+  a.{self::Operators::-}(b){(dynamic) →* dynamic};
+  a.{self::Operators::~/}(b){(dynamic) →* dynamic};
+  a.{self::Operators::unary-}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/general/optional.dart.weak.modular.expect b/pkg/front_end/testcases/general/optional.dart.weak.modular.expect
new file mode 100644
index 0000000..6ca451d
--- /dev/null
+++ b/pkg/front_end/testcases/general/optional.dart.weak.modular.expect
@@ -0,0 +1,146 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/optional.dart:47:21: Error: The argument type 'InvalidListener' can't be assigned to the parameter type 'Listener'.
+//  - 'InvalidListener' is from 'pkg/front_end/testcases/general/optional.dart'.
+//  - 'Listener' is from 'pkg/front_end/testcases/general/optional.dart'.
+//   extern.listen(new InvalidListener());
+//                     ^
+//
+// pkg/front_end/testcases/general/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing1 = foo.method();
+//                            ^
+//
+// pkg/front_end/testcases/general/optional.dart:50:28: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   var nothing2 = foo.method(1, 2, 3, 4);
+//                            ^
+//
+// pkg/front_end/testcases/general/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing3 = extern.externalMethod();
+//                                       ^
+//
+// pkg/front_end/testcases/general/optional.dart:52:39: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   var nothing4 = extern.externalMethod(1, 2, 3, 4);
+//                                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  method method(dynamic x, [dynamic y = #C1, dynamic z = #C1]) → dynamic {
+    return "string";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class External extends core::Object {
+  synthetic constructor •() → self::External*
+    : super core::Object::•()
+    ;
+  abstract method externalMethod(core::int* x, [core::int* y = #C1, core::int* z = #C1]) → core::String*;
+  abstract method listen(self::Listener* listener) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Listener extends core::Object {
+  synthetic constructor •() → self::Listener*
+    : super core::Object::•()
+    ;
+  abstract method event(core::String* input, [core::int* x = #C1, core::int* y = #C1]) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class TestListener extends self::Listener {
+  synthetic constructor •() → self::TestListener*
+    : super self::Listener::•()
+    ;
+  method event(core::String* input, [core::int* x = #C1, core::int* y = #C1]) → void {}
+}
+class ExtendedListener extends self::Listener {
+  synthetic constructor •() → self::ExtendedListener*
+    : super self::Listener::•()
+    ;
+  method event(core::String* input, [core::int* x = #C1, core::int* y = #C1, dynamic z = #C1]) → void {}
+}
+class InvalidListener extends core::Object {
+  synthetic constructor •() → self::InvalidListener*
+    : super core::Object::•()
+    ;
+  method event(dynamic input, [dynamic x = #C1]) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+external static method createExternal() → self::External*;
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  dynamic string1 = foo.{self::Foo::method}(1){(dynamic, [dynamic, dynamic]) →* dynamic};
+  dynamic string2 = foo.{self::Foo::method}(1, 2){(dynamic, [dynamic, dynamic]) →* dynamic};
+  dynamic string3 = foo.{self::Foo::method}(1, 2, 3){(dynamic, [dynamic, dynamic]) →* dynamic};
+  self::External* extern = self::createExternal();
+  core::String* string4 = extern.{self::External::externalMethod}(1){(core::int*, [core::int*, core::int*]) →* core::String*};
+  core::String* string5 = extern.{self::External::externalMethod}(1, 2){(core::int*, [core::int*, core::int*]) →* core::String*};
+  core::String* string6 = extern.{self::External::externalMethod}(1, 2, 3){(core::int*, [core::int*, core::int*]) →* core::String*};
+  extern.{self::External::listen}(new self::TestListener::•()){(self::Listener*) →* void};
+  extern.{self::External::listen}(new self::ExtendedListener::•()){(self::Listener*) →* void};
+  extern.{self::External::listen}(invalid-expression "pkg/front_end/testcases/general/optional.dart:47:21: Error: The argument type 'InvalidListener' can't be assigned to the parameter type 'Listener'.
+ - 'InvalidListener' is from 'pkg/front_end/testcases/general/optional.dart'.
+ - 'Listener' is from 'pkg/front_end/testcases/general/optional.dart'.
+  extern.listen(new InvalidListener());
+                    ^" in new self::InvalidListener::•() as{TypeError} self::Listener*){(self::Listener*) →* void};
+  invalid-type nothing1 = invalid-expression "pkg/front_end/testcases/general/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing1 = foo.method();
+                           ^" in foo.{self::Foo::method}{<inapplicable>}.(){() →* invalid-type};
+  invalid-type nothing2 = invalid-expression "pkg/front_end/testcases/general/optional.dart:50:28: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  var nothing2 = foo.method(1, 2, 3, 4);
+                           ^" in foo.{self::Foo::method}{<inapplicable>}.(1, 2, 3, 4){(invalid-type, invalid-type, invalid-type, invalid-type) →* invalid-type};
+  invalid-type nothing3 = invalid-expression "pkg/front_end/testcases/general/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
+  var nothing3 = extern.externalMethod();
+                                      ^" in extern.{self::External::externalMethod}{<inapplicable>}.(){() →* invalid-type};
+  invalid-type nothing4 = invalid-expression "pkg/front_end/testcases/general/optional.dart:52:39: Error: Too many positional arguments: 3 allowed, but 4 found.
+Try removing the extra positional arguments.
+  var nothing4 = extern.externalMethod(1, 2, 3, 4);
+                                      ^" in extern.{self::External::externalMethod}{<inapplicable>}.(1, 2, 3, 4){(invalid-type, invalid-type, invalid-type, invalid-type) →* invalid-type};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/override.dart.weak.modular.expect b/pkg/front_end/testcases/general/override.dart.weak.modular.expect
new file mode 100644
index 0000000..2ce1243
--- /dev/null
+++ b/pkg/front_end/testcases/general/override.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends self::Foo {
+  synthetic constructor •() → self::Bar*
+    : super self::Foo::•()
+    ;
+}
+class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  method method() → self::Foo* {
+    return new self::Foo::•();
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Sub extends self::Base {
+  synthetic constructor •() → self::Sub*
+    : super self::Base::•()
+    ;
+  method method() → self::Foo* {
+    return new self::Bar::•();
+  }
+}
+static method main(core::List<core::String*>* args) → dynamic {
+  self::Base* object = args.{core::List::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 0 ?{self::Base*} new self::Base::•() : new self::Sub::•();
+  self::Foo* a = object.{self::Base::method}(){() →* self::Foo*};
+  core::print(a);
+}
diff --git a/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..181c1db
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.weak.modular.expect
@@ -0,0 +1,90 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:26:9: Error: The return type of the method 'F.y' is 'A', which does not match the return type, 'B', of the overridden method, 'D.y'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+// Change to a subtype of 'B'.
+//   A get y => null;
+//         ^
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:16:7: Context: This is the overridden method ('y').
+//   get y => null; // Inferred type: B
+//       ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:25:16: Error: The parameter 'value' of the method 'F.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.x'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x(B value) {}
+//                ^
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:15:12: Context: This is the overridden method ('x').
+//   void set x(value) {} // Inferred type: A
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set x(self::A* value) → void {}
+  get y() → self::B*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x(self::A* value) → void {}
+  get y() → self::B*
+    return null;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  set x(self::A* value) → void {}
+  get y() → self::B*
+    return null;
+}
+class F extends self::D {
+  synthetic constructor •() → self::F*
+    : super self::D::•()
+    ;
+  set x(self::B* value) → void {}
+  get y() → self::A*
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_accessor_basic.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.weak.modular.expect
new file mode 100644
index 0000000..d576b70
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:21:14: Error: The return type of the method 'E.y' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.y'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+// Change to a subtype of 'A'.
+//   Object get y => null;
+//              ^
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:11:9: Context: This is the overridden method ('y').
+//   A get y => null;
+//         ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:20:16: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x(B value) {}
+//                ^
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:10:12: Context: This is the overridden method ('x').
+//   void set x(A value) {}
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set x(self::A* value) → void {}
+  get y() → self::A*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x(core::Object* value) → void {}
+  get y() → self::B*
+    return null;
+}
+class E extends self::C {
+  synthetic constructor •() → self::E*
+    : super self::C::•()
+    ;
+  set x(self::B* value) → void {}
+  get y() → core::Object*
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.weak.modular.expect
new file mode 100644
index 0000000..14fa421
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:22:17: Error: The parameter 'value' of the method 'D.x4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x4'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x4(B value) {} // Not covariant
+//                 ^
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:13:12: Context: This is the overridden method ('x4').
+//   void set x4(A value) {}
+//            ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:23:32: Error: The parameter 'value' of the method 'D.x5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.x5'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x5(covariant String value) {}
+//                                ^
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:14:12: Context: This is the overridden method ('x5').
+//   void set x5(covariant A value) {}
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set x1(covariant-by-declaration self::A* value) → void {}
+  set x2(self::A* value) → void {}
+  set x3(covariant-by-declaration self::A* value) → void {}
+  set x4(self::A* value) → void {}
+  set x5(covariant-by-declaration self::A* value) → void {}
+  set x6(covariant-by-declaration self::B* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x1(covariant-by-declaration self::B* value) → void {}
+  set x2(covariant-by-declaration self::B* value) → void {}
+  set x3(covariant-by-declaration self::B* value) → void {}
+  set x4(self::B* value) → void {}
+  set x5(covariant-by-declaration core::String* value) → void {}
+  set x6(covariant-by-declaration self::A* value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_after_inference.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_check_after_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..f6a987f
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_after_inference.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_after_inference.dart:22:12: Error: The parameter 'x' of the method 'F.f' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.f'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f(B x) {}
+//            ^
+// pkg/front_end/testcases/general/override_check_after_inference.dart:14:8: Context: This is the overridden method ('f').
+//   void f(x) {} // Inferred type: (A) -> void
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f(self::A* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f(self::A* x) → void {}
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  method f(self::A* x) → void {}
+}
+class F extends self::D {
+  synthetic constructor •() → self::F*
+    : super self::D::•()
+    ;
+  method f(self::B* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_basic.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_check_basic.dart.weak.modular.expect
new file mode 100644
index 0000000..e19c0a4
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_basic.dart.weak.modular.expect
@@ -0,0 +1,109 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:24:13: Error: The parameter 'x' of the method 'E.f1' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f1'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f1(B x) {}
+//             ^
+// pkg/front_end/testcases/general/override_check_basic.dart:10:8: Context: This is the overridden method ('f1').
+//   void f1(A x) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:25:14: Error: The parameter 'x' of the method 'E.f2' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f2'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f2([B x]) {}
+//              ^
+// pkg/front_end/testcases/general/override_check_basic.dart:11:8: Context: This is the overridden method ('f2').
+//   void f2([A x]) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:26:14: Error: The parameter 'x' of the method 'E.f3' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f3'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f3({B x}) {}
+//              ^
+// pkg/front_end/testcases/general/override_check_basic.dart:12:8: Context: This is the overridden method ('f3').
+//   void f3({A x}) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:27:10: Error: The return type of the method 'E.f4' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.f4'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a subtype of 'A'.
+//   Object f4() {}
+//          ^
+// pkg/front_end/testcases/general/override_check_basic.dart:13:5: Context: This is the overridden method ('f4').
+//   A f4() {}
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f1(self::A* x) → void {}
+  method f2([self::A* x = #C1]) → void {}
+  method f3({self::A* x = #C1}) → void {}
+  method f4() → self::A* {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f1(core::Object* x) → void {}
+  method f2([core::Object* x = #C1]) → void {}
+  method f3({core::Object* x = #C1}) → void {}
+  method f4() → self::B* {}
+}
+class E extends self::C {
+  synthetic constructor •() → self::E*
+    : super self::C::•()
+    ;
+  method f1(self::B* x) → void {}
+  method f2([self::B* x = #C1]) → void {}
+  method f3({self::B* x = #C1}) → void {}
+  method f4() → core::Object* {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.weak.modular.expect
new file mode 100644
index 0000000..ed9f7b4
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends self::Foo<self::Foo::T*>* = self::Foo<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract method fisk<S extends self::Foo<self::Bar::fisk::S*>* = self::Foo<dynamic>*>() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Hest extends core::Object implements self::Bar {
+  synthetic constructor •() → self::Hest*
+    : super core::Object::•()
+    ;
+  @#C1
+  method fisk<U extends self::Foo<self::Hest::fisk::U*>* = self::Foo<dynamic>*>() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/override_check_two_substitutions.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.weak.modular.expect
new file mode 100644
index 0000000..54a4764
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  method f<U extends core::Object* = dynamic>(covariant-by-class core::Map<self::A::T*, self::A::f::U*>* m) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A<core::String*> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method f<V extends core::Object* = dynamic>(covariant-by-class core::Map<core::String*, self::B::f::V*>* m) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.weak.modular.expect
new file mode 100644
index 0000000..ceabd22
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:22:13: Error: The parameter 'x' of the method 'D.f4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f4'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f4(B x) {} // Not covariant
+//             ^
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:13:8: Context: This is the overridden method ('f4').
+//   void f4(A x) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:23:28: Error: The parameter 'x' of the method 'D.f5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.f5'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f5(covariant String x) {}
+//                            ^
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:14:8: Context: This is the overridden method ('f5').
+//   void f5(covariant A x) {}
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f1(covariant-by-declaration self::A* x) → void {}
+  method f2(self::A* x) → void {}
+  method f3(covariant-by-declaration self::A* x) → void {}
+  method f4(self::A* x) → void {}
+  method f5(covariant-by-declaration self::A* x) → void {}
+  method f6(covariant-by-declaration self::B* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f1(covariant-by-declaration self::B* x) → void {}
+  method f2(covariant-by-declaration self::B* x) → void {}
+  method f3(covariant-by-declaration self::B* x) → void {}
+  method f4(self::B* x) → void {}
+  method f5(covariant-by-declaration core::String* x) → void {}
+  method f6(covariant-by-declaration self::A* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.weak.modular.expect
new file mode 100644
index 0000000..a188410
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.weak.modular.expect
@@ -0,0 +1,117 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get getterFromGetter() → core::num*;
+  abstract set setterFromSetter(core::num* value) → void;
+  abstract set getterFromSetter(core::num* value) → void;
+  abstract get setterFromGetter() → core::num*;
+  abstract get getterFromGetterWithSetterConflict() → core::num*;
+  abstract set getterFromGetterWithSetterConflict(dynamic num) → void;
+  abstract get setterFromSetterWithGetterConflict() → core::num*;
+  abstract set setterFromSetterWithGetterConflict(dynamic num) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract get getterFromGetter() → core::int*;
+  abstract set setterFromSetter(core::int* value) → void;
+  abstract get setterFromGetter() → core::int*;
+  abstract get setterFromSetterWithGetterConflict() → core::int*;
+  abstract set getterFromGetterWithSetterConflict(core::int* value) → void;
+  abstract set getterFromSetter(core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends self::A {
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+  abstract get getterFromGetter() → core::num*;
+  abstract set setterFromSetter(core::num* value) → void;
+  abstract get getterFromSetter() → core::num*;
+  abstract set setterFromGetter(core::num* value) → void;
+  abstract get getterFromGetterWithSetterConflict() → core::num*;
+  abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
+}
+abstract class D extends self::A implements self::B {
+  synthetic constructor •() → self::D*
+    : super self::A::•()
+    ;
+  abstract get getterFromGetter() → core::int*;
+  abstract set setterFromSetter(core::num* value) → void;
+  abstract get getterFromSetter() → core::num*;
+  abstract set setterFromGetter(core::int* value) → void;
+  abstract get getterFromGetterWithSetterConflict() → core::num*;
+  abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
+}
+abstract class E extends core::Object implements self::A {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract get getterFromGetter() → core::num*;
+  abstract set setterFromSetter(core::num* value) → void;
+  abstract get getterFromSetter() → core::num*;
+  abstract set setterFromGetter(core::num* value) → void;
+  abstract get getterFromGetterWithSetterConflict() → core::num*;
+  abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class F extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract get getterFromGetter() → core::int*;
+  abstract set setterFromSetter(core::num* value) → void;
+  abstract get getterFromSetter() → core::num*;
+  abstract set setterFromGetter(core::int* value) → void;
+  abstract get getterFromGetterWithSetterConflict() → core::num*;
+  abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
+  abstract member-signature get setterFromGetter() → core::int*; -> self::B::setterFromGetter
+  abstract member-signature get setterFromSetterWithGetterConflict() → core::int*; -> self::B::setterFromSetterWithGetterConflict
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_inference_for_setters.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_inference_for_setters.dart.weak.modular.expect
new file mode 100644
index 0000000..845e3fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_for_setters.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get foo() → core::num*
+    return null;
+  set foo(dynamic newFoo) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends self::B {
+  synthetic constructor •() → self::A*
+    : super self::B::•()
+    ;
+  set foo(dynamic newFoo) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.weak.modular.expect
new file mode 100644
index 0000000..6e67b60
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo({core::bool* c = #C1, core::bool* a = #C2}) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method foo({core::bool* c = #C1, core::bool* a = #C2}) → dynamic {}
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  method foo({core::bool* c = #C1, core::bool* a = #C2}) → dynamic {}
+}
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+  method foo({core::bool* a = #C1, core::bool* c = #C2}) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B1 extends self::A1 {
+  synthetic constructor •() → self::B1*
+    : super self::A1::•()
+    ;
+  method foo({core::bool* a = #C1, core::bool* c = #C2}) → dynamic {}
+}
+class C1 extends self::B1 {
+  synthetic constructor •() → self::C1*
+    : super self::B1::•()
+    ;
+  method foo({core::bool* a = #C1, core::bool* c = #C2}) → dynamic {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = true
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/general/override_setter_with_field.dart.weak.modular.expect b/pkg/front_end/testcases/general/override_setter_with_field.dart.weak.modular.expect
new file mode 100644
index 0000000..765d23f
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_setter_with_field.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_setter_with_field.dart:12:7: Error: The field 'B.x' has type 'int', which does not match the corresponding type, 'Object', in the overridden setter, 'A.x'.
+//  - 'Object' is from 'dart:core'.
+//   int x;
+//       ^
+// pkg/front_end/testcases/general/override_setter_with_field.dart:8:12: Context: This is the overridden method ('x').
+//   void set x(Object y);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set x(core::Object* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  field core::int* x = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::B::•().{self::B::x} = 5;
+}
diff --git a/pkg/front_end/testcases/general/part_as_entry_point.dart.weak.modular.expect b/pkg/front_end/testcases/general/part_as_entry_point.dart.weak.modular.expect
new file mode 100644
index 0000000..b77b0c2
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_as_entry_point.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+part part_as_entry_point.dart;
+static method main() → dynamic {
+  core::print("Hello, World!");
+}
diff --git a/pkg/front_end/testcases/general/part_not_part_of.dart.weak.modular.expect b/pkg/front_end/testcases/general/part_not_part_of.dart.weak.modular.expect
new file mode 100644
index 0000000..f22e87e
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_not_part_of.dart:8:6: Error: Can't use 'pkg/front_end/testcases/general/part_not_part_of_lib1.dart' as a part, because it has no 'part of' declaration.
+// part 'part_not_part_of_lib1.dart';
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///part_not_part_of_lib2.dart";
+
+@#C1
+part part_not_part_of_lib1.dart;
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "part_not_part_of_lib1.dart" as par;
+
+import "org-dartlang-testcase:///part_not_part_of_lib1.dart";
+
+static method methodFromLib2() → dynamic {
+  par::methodFromLib1();
+}
+
+library;
+import self as par;
+
+static method methodFromLib1() → dynamic {}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.weak.modular.expect b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.weak.modular.expect
new file mode 100644
index 0000000..2048308
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart:8:6: Error: Using 'pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart' but its 'part of' declaration says 'foo'.
+// Try changing the 'part of' declaration to use a relative file name.
+// part 'part_not_part_of_same_named_library_lib1.dart';
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///part_not_part_of_same_named_library_lib2.dart";
+
+@#C1
+part part_not_part_of_same_named_library_lib1.dart;
+static method main() → dynamic {}
+
+library foo;
+import self as self2;
+
+part part_not_part_of_same_named_library_lib1.dart;
+static method /* from org-dartlang-testcase:///part_not_part_of_same_named_library_lib1.dart */ methodFromLib1() → dynamic {}
+static method methodFromLib2() → dynamic {
+  self2::methodFromLib1();
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.weak.modular.expect b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.weak.modular.expect
new file mode 100644
index 0000000..693c671
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart:8:6: Error: Using 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib2.dart'.
+// part 'part_part_of_different_unnamed_library_lib1.dart';
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///part_part_of_different_unnamed_library_lib2.dart";
+
+@#C1
+part part_part_of_different_unnamed_library_lib1.dart;
+static method main() → dynamic {}
+
+library;
+import self as self2;
+
+part part_part_of_different_unnamed_library_lib1.dart;
+static method /* from org-dartlang-testcase:///part_part_of_different_unnamed_library_lib1.dart */ methodFromLib1() → dynamic {}
+static method methodFromLib2() → dynamic {
+  self2::methodFromLib1();
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.weak.modular.expect b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.weak.modular.expect
new file mode 100644
index 0000000..0ec56bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library foo;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_part_of_differently_named_library.dart:10:6: Error: Using 'pkg/front_end/testcases/general/part_part_of_differently_named_library_lib1.dart' as part of 'foo' but its 'part of' declaration says 'bar'.
+// part 'part_part_of_differently_named_library_lib1.dart';
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///part_part_of_differently_named_library_lib2.dart";
+
+@#C1
+part part_part_of_differently_named_library_lib1.dart;
+static method main() → dynamic {}
+
+library bar;
+import self as self2;
+
+part part_part_of_differently_named_library_lib1.dart;
+static method /* from org-dartlang-testcase:///part_part_of_differently_named_library_lib1.dart */ methodFromLib1() → dynamic {}
+static method methodFromLib2() → dynamic {
+  self2::methodFromLib1();
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/platform.dart.weak.modular.expect b/pkg/front_end/testcases/general/platform.dart.weak.modular.expect
new file mode 100644
index 0000000..bef6d48
--- /dev/null
+++ b/pkg/front_end/testcases/general/platform.dart.weak.modular.expect
@@ -0,0 +1,4 @@
+library;
+import self as self;
+
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.weak.modular.expect
new file mode 100644
index 0000000..fa5d4ba
--- /dev/null
+++ b/pkg/front_end/testcases/general/platform_invalid_uris/main.dart.weak.modular.expect
@@ -0,0 +1,108 @@
+library;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+  new test::Class::•();
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/platform_invalid_uris/patch_lib.dart:8:9: Error: Couldn't parse URI ':c':
+//   Invalid empty scheme.
+// import ':c';
+//         ^
+//
+// pkg/front_end/testcases/general/platform_invalid_uris/patch_lib.dart:9:9: Error: Couldn't parse URI ':d':
+//   Invalid empty scheme.
+// export ':d';
+//         ^
+//
+// pkg/front_end/testcases/general/platform_invalid_uris/origin_lib.dart:5:9: Error: Couldn't parse URI ':a':
+//   Invalid empty scheme.
+// import ':a';
+//         ^
+//
+// pkg/front_end/testcases/general/platform_invalid_uris/origin_lib.dart:6:9: Error: Couldn't parse URI ':b':
+//   Invalid empty scheme.
+// export ':b';
+//         ^
+//
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+import "org-dartlang-malformed-uri:?%3Ac";
+export "org-dartlang-malformed-uri:?%3Ad";
+import "org-dartlang-malformed-uri:?%3Aa";
+export "org-dartlang-malformed-uri:?%3Ab";
+
+@#C1
+class Class extends core::Object {
+  synthetic constructor •() → test::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/platform_invalid_uris/patch_lib.dart:8:8: Error: Expected a URI.
+// import ':c';
+//        ^
+//
+import self as self2;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/platform_invalid_uris/patch_lib.dart:9:1: Error: Expected a URI.
+// export ':d';
+// ^
+//
+import self as self3;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/platform_invalid_uris/origin_lib.dart:5:8: Error: Expected a URI.
+// import ':a';
+//        ^
+//
+import self as self4;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/platform_invalid_uris/origin_lib.dart:6:1: Error: Expected a URI.
+// export ':b';
+// ^
+//
+import self as self5;
+
+
+constants  {
+  #C1 = _in::_Patch {}
+}
diff --git a/pkg/front_end/testcases/general/prefer_baseclass.dart.weak.modular.expect b/pkg/front_end/testcases/general/prefer_baseclass.dart.weak.modular.expect
new file mode 100644
index 0000000..8785424
--- /dev/null
+++ b/pkg/front_end/testcases/general/prefer_baseclass.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class AB1 extends self::A implements self::B {
+  synthetic constructor •() → self::AB1*
+    : super self::A::•()
+    ;
+}
+class AB2 extends self::A implements self::B {
+  synthetic constructor •() → self::AB2*
+    : super self::A::•()
+    ;
+}
+class BA1 extends self::B implements self::A {
+  synthetic constructor •() → self::BA1*
+    : super self::B::•()
+    ;
+}
+class BA2 extends self::B implements self::A {
+  synthetic constructor •() → self::BA2*
+    : super self::B::•()
+    ;
+}
+static method takeSubclassOfA(dynamic obj) → dynamic {}
+static method takeSubclassOfB(dynamic obj) → dynamic {}
+static method main() → dynamic {
+  self::takeSubclassOfA(new self::AB1::•());
+  self::takeSubclassOfA(new self::AB2::•());
+  self::takeSubclassOfB(new self::BA1::•());
+  self::takeSubclassOfB(new self::BA2::•());
+}
diff --git a/pkg/front_end/testcases/general/private_members.dart.weak.modular.expect b/pkg/front_end/testcases/general/private_members.dart.weak.modular.expect
new file mode 100644
index 0000000..7d67ee2
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_members.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+abstract class _AbstractClass extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  synthetic constructor •() → self::_AbstractClass
+    : super core::Object::•()
+    ;
+  abstract get _privateAbstractField() → core::int;
+  abstract set _privateAbstractField(core::int #externalFieldValue) → void;
+}
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int _privateField = 1;
+  field core::int _privateFinalField = 1;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _privateConstructor() → self::_Class
+    : super core::Object::•()
+    ;
+  static factory _privateRedirectingFactory() → self::_Class
+    return new self::_Class::_privateConstructor();
+  method _privateMethod() → void {}
+  get _privateGetter() → core::int
+    return 42;
+  set _privateSetter(core::int value) → void {}
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  method _privateMethod = self::_Extension|_privateMethod;
+  tearoff _privateMethod = self::_Extension|get#_privateMethod;
+  get _privateGetter = self::_Extension|get#_privateGetter;
+  static field _privateField = self::_Extension|_privateField;
+  static field _privateFinalField = self::_Extension|_privateFinalField;
+  set _privateSetter = self::_Extension|set#_privateSetter;
+}
+static field core::int _Extension|_privateField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int _Extension|_privateFinalField = 1 /* from org-dartlang-testcase:///private_members_part.dart */;
+static method test(self::_AbstractClass c) → dynamic {
+  c.{self::_AbstractClass::_privateAbstractField} = c.{self::_AbstractClass::_privateAbstractField}{core::int};
+}
+static method main() → dynamic {
+  self::_Class c = new self::_Class::_privateConstructor();
+  c = new self::_Class::_privateConstructor();
+  c.{self::_Class::_privateMethod}(){() → void};
+  c.{self::_Class::_privateSetter} = c.{self::_Class::_privateGetter}{core::int};
+  c.{self::_Class::_privateField} = c.{self::_Class::_privateField}{core::int};
+  c.{self::_Class::_privateFinalField}{core::int};
+  self::_Extension|_privateMethod(0);
+  self::_Extension|get#_privateMethod(0)(){() → void};
+  self::_Extension|set#_privateSetter(0, self::_Extension|get#_privateGetter(0));
+  self::_Extension|_privateField = self::_Extension|_privateField;
+  self::_Extension|_privateFinalField;
+}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateMethod(lowered final core::int #this) → void {}
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateMethod(lowered final core::int #this) → () → void
+  return () → void => self::_Extension|_privateMethod(#this);
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|get#_privateGetter(lowered final core::int #this) → core::int
+  return 42;
+static method /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|set#_privateSetter(lowered final core::int #this, core::int value) → void {}
+
+constants  {
+  #C1 = constructor-tearoff self::_Class::_privateRedirectingFactory
+}
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart.weak.modular.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.weak.modular.expect
new file mode 100644
index 0000000..ca1fea0
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart.weak.modular.expect
@@ -0,0 +1,63 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "private_method_tearoff_lib.dart" as pri;
+
+import "org-dartlang-testcase:///private_method_tearoff_lib.dart";
+
+class Foo extends core::Object implements pri::Bar {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+class Baz extends self::Foo {
+  synthetic constructor •() → self::Baz*
+    : super self::Foo::•()
+    ;
+}
+static method main() → dynamic {
+  pri::baz(new self::Foo::•());
+}
+
+library;
+import self as pri;
+import "dart:core" as core;
+
+class Bar extends core::Object {
+  synthetic constructor •() → pri::Bar*
+    : super core::Object::•()
+    ;
+  method _f() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method baz(pri::Bar* bar) → void {
+  core::print("${bar.{pri::Bar::_f}{() →* void}.{core::Object::runtimeType}{core::Type*}}");
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_method_tearoff.dart::_f
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/general/promoted_access.dart.weak.modular.expect b/pkg/front_end/testcases/general/promoted_access.dart.weak.modular.expect
new file mode 100644
index 0000000..7439751
--- /dev/null
+++ b/pkg/front_end/testcases/general/promoted_access.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super core::Object::•()
+    ;
+  method method(covariant-by-class self::Class::T* o) → dynamic {
+    if(o is self::Class<dynamic>*) {
+      o{self::Class::T* & self::Class<dynamic>* /* '*' & '*' = '*' */}.{self::Class::method}(null){(dynamic) →* dynamic};
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method method<T extends core::Object* = dynamic>(self::method::T* o) → dynamic {
+  if(o is self::Class<dynamic>*) {
+    o{self::method::T* & self::Class<dynamic>* /* '*' & '*' = '*' */}.{self::Class::method}(null){(dynamic) →* dynamic};
+  }
+}
+static method main() → dynamic {
+  new self::Class::•<dynamic>().{self::Class::method}(new self::Class::•<dynamic>()){(dynamic) →* dynamic};
+  self::method<self::Class<dynamic>*>(new self::Class::•<dynamic>());
+}
diff --git a/pkg/front_end/testcases/general/promoted_null_aware_access.dart.weak.modular.expect b/pkg/front_end/testcases/general/promoted_null_aware_access.dart.weak.modular.expect
new file mode 100644
index 0000000..09affa3
--- /dev/null
+++ b/pkg/front_end/testcases/general/promoted_null_aware_access.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method method<T extends core::Object* = dynamic>(self::method::T* o) → dynamic {
+  if(o is core::String*) {
+    let final self::method::T* & core::String* /* '*' & '*' = '*' */ #t1 = o{self::method::T* & core::String* /* '*' & '*' = '*' */} in #t1 == null ?{core::int*} null : #t1.{core::String::length}{core::int*};
+  }
+}
+static method main() → dynamic {
+  self::method<core::String*>("");
+}
diff --git a/pkg/front_end/testcases/general/public_method_tearoff.dart.weak.modular.expect b/pkg/front_end/testcases/general/public_method_tearoff.dart.weak.modular.expect
new file mode 100644
index 0000000..6fc1a72
--- /dev/null
+++ b/pkg/front_end/testcases/general/public_method_tearoff.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "public_method_tearoff_lib.dart" as pub;
+
+import "org-dartlang-testcase:///public_method_tearoff_lib.dart";
+
+class Foo extends pub::Bar {
+  synthetic constructor •() → self::Foo*
+    : super pub::Bar::•()
+    ;
+}
+static method main() → void {
+  pub::baz(new self::Foo::•());
+}
+
+library;
+import self as pub;
+import "dart:core" as core;
+
+class Bar extends core::Object {
+  synthetic constructor •() → pub::Bar*
+    : super core::Object::•()
+    ;
+  method f() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method baz(pub::Bar* bar) → void {
+  core::print("${bar.{pub::Bar::f}{() →* void}.{core::Object::runtimeType}{core::Type*}}");
+}
diff --git a/pkg/front_end/testcases/general/pure_index_expressions.dart.weak.modular.expect b/pkg/front_end/testcases/general/pure_index_expressions.dart.weak.modular.expect
new file mode 100644
index 0000000..e1a3cd8
--- /dev/null
+++ b/pkg/front_end/testcases/general/pure_index_expressions.dart.weak.modular.expect
@@ -0,0 +1,199 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  operator [](self::Class* cls) → self::Class*
+    return new self::Class::•();
+  operator []=(self::Class* cls, self::Class* value) → void {}
+  operator +(self::Class* cls) → self::Class*
+    return cls;
+  method indexGetSetForEffect(core::Map<self::Class*, self::Class*>* map) → void {
+    final self::Class* self = this;
+    let final core::Map<self::Class*, self::Class*>* #t1 = map in #t1.{core::Map::[]}(this){(core::Object*) →* self::Class*} == null ?{self::Class*} #t1.{core::Map::[]=}(this, this){(self::Class*, self::Class*) →* void} : null;
+    let final core::Map<self::Class*, self::Class*>* #t2 = map in #t2.{core::Map::[]}(self){(core::Object*) →* self::Class*} == null ?{self::Class*} #t2.{core::Map::[]=}(self, self){(self::Class*, self::Class*) →* void} : null;
+    map.{core::Map::[]=}(this, this){(self::Class*, self::Class*) →* void};
+    map.{core::Map::[]=}(self, self){(self::Class*, self::Class*) →* void};
+    map.{core::Map::[]}(this){(core::Object*) →* self::Class*};
+    map.{core::Map::[]}(self){(core::Object*) →* self::Class*};
+    let final core::Map<self::Class*, self::Class*>* #t3 = map in #t3.{core::Map::[]=}(this, #t3.{core::Map::[]}(this){(core::Object*) →* self::Class*}.{self::Class::+}(this){(self::Class*) →* self::Class*}){(self::Class*, self::Class*) →* void};
+    let final core::Map<self::Class*, self::Class*>* #t4 = map in #t4.{core::Map::[]=}(self, #t4.{core::Map::[]}(self){(core::Object*) →* self::Class*}.{self::Class::+}(self){(self::Class*) →* self::Class*}){(self::Class*, self::Class*) →* void};
+  }
+  method indexGetSetForValue(core::Map<self::Class*, self::Class*>* map) → void {
+    final self::Class* self = this;
+    dynamic v;
+    v = let final core::Map<self::Class*, self::Class*>* #t5 = map in let final self::Class* #t6 = #t5.{core::Map::[]}(this){(core::Object*) →* self::Class*} in #t6 == null ?{self::Class*} let final void #t7 = #t5.{core::Map::[]=}(this, this){(self::Class*, self::Class*) →* void} in this : #t6;
+    v = let final core::Map<self::Class*, self::Class*>* #t8 = map in let final self::Class* #t9 = #t8.{core::Map::[]}(self){(core::Object*) →* self::Class*} in #t9 == null ?{self::Class*} let final void #t10 = #t8.{core::Map::[]=}(self, self){(self::Class*, self::Class*) →* void} in self : #t9;
+    v = let final core::Map<self::Class*, self::Class*>* #t11 = map in let final void #t12 = #t11.{core::Map::[]=}(this, this){(self::Class*, self::Class*) →* void} in this;
+    v = let final core::Map<self::Class*, self::Class*>* #t13 = map in let final void #t14 = #t13.{core::Map::[]=}(self, self){(self::Class*, self::Class*) →* void} in self;
+    v = map.{core::Map::[]}(this){(core::Object*) →* self::Class*};
+    v = map.{core::Map::[]}(self){(core::Object*) →* self::Class*};
+    v = let final core::Map<self::Class*, self::Class*>* #t15 = map in let final self::Class* #t16 = #t15.{core::Map::[]}(this){(core::Object*) →* self::Class*}.{self::Class::+}(this){(self::Class*) →* self::Class*} in let final void #t17 = #t15.{core::Map::[]=}(this, #t16){(self::Class*, self::Class*) →* void} in #t16;
+    v = let final core::Map<self::Class*, self::Class*>* #t18 = map in let final self::Class* #t19 = #t18.{core::Map::[]}(self){(core::Object*) →* self::Class*}.{self::Class::+}(self){(self::Class*) →* self::Class*} in let final void #t20 = #t18.{core::Map::[]=}(self, #t19){(self::Class*, self::Class*) →* void} in #t19;
+  }
+  method implicitExtensionGetSetForEffect(core::int* i) → void {
+    final self::Class* self = this;
+    let final core::int* #t21 = i in self::Extension|[](#t21, this) == null ?{self::Class*} self::Extension|[]=(#t21, this, this) : null;
+    let final core::int* #t22 = i in self::Extension|[](#t22, self) == null ?{self::Class*} self::Extension|[]=(#t22, self, self) : null;
+    self::Extension|[]=(i, this, this);
+    self::Extension|[]=(i, self, self);
+    self::Extension|[](i, this);
+    self::Extension|[](i, self);
+    let final core::int* #t23 = i in self::Extension|[]=(#t23, this, self::Extension|[](#t23, this).{self::Class::+}(this){(self::Class*) →* self::Class*});
+    let final core::int* #t24 = i in self::Extension|[]=(#t24, self, self::Extension|[](#t24, self).{self::Class::+}(self){(self::Class*) →* self::Class*});
+  }
+  method implicitExtensionGetSetForValue(core::int* i) → void {
+    final self::Class* self = this;
+    dynamic v;
+    v = let final core::int* #t25 = i in let final self::Class* #t26 = self::Extension|[](#t25, this) in #t26 == null ?{self::Class*} let final void #t27 = self::Extension|[]=(#t25, this, this) in this : #t26;
+    v = let final core::int* #t28 = i in let final self::Class* #t29 = self::Extension|[](#t28, self) in #t29 == null ?{self::Class*} let final void #t30 = self::Extension|[]=(#t28, self, self) in self : #t29;
+    v = let final core::int* #t31 = i in let final void #t32 = self::Extension|[]=(#t31, this, this) in this;
+    v = let final core::int* #t33 = i in let final void #t34 = self::Extension|[]=(#t33, self, self) in self;
+    v = self::Extension|[](i, this);
+    v = self::Extension|[](i, self);
+    v = let final core::int* #t35 = i in let final self::Class* #t36 = self::Extension|[](#t35, this).{self::Class::+}(this){(self::Class*) →* self::Class*} in let final void #t37 = self::Extension|[]=(#t35, this, #t36) in #t36;
+    v = let final core::int* #t38 = i in let final self::Class* #t39 = self::Extension|[](#t38, self).{self::Class::+}(self){(self::Class*) →* self::Class*} in let final void #t40 = self::Extension|[]=(#t38, self, #t39) in #t39;
+  }
+  method explicitExtensionGetSetForEffect(core::int* i) → void {
+    final self::Class* self = this;
+    let final core::int* #t41 = i in self::Extension|[](#t41, this) == null ?{self::Class*} self::Extension|[]=(#t41, this, this) : null;
+    let final core::int* #t42 = i in self::Extension|[](#t42, self) == null ?{self::Class*} self::Extension|[]=(#t42, self, self) : null;
+    self::Extension|[]=(i, this, this);
+    self::Extension|[]=(i, self, self);
+    self::Extension|[](i, this);
+    self::Extension|[](i, self);
+    let final core::int* #t43 = i in self::Extension|[]=(#t43, this, self::Extension|[](#t43, this).{self::Class::+}(this){(self::Class*) →* self::Class*});
+    let final core::int* #t44 = i in self::Extension|[]=(#t44, self, self::Extension|[](#t44, self).{self::Class::+}(self){(self::Class*) →* self::Class*});
+  }
+  method explicitExtensionGetSetForValue(core::int* i) → void {
+    final self::Class* self = this;
+    dynamic v;
+    v = let final core::int* #t45 = i in let final self::Class* #t46 = self::Extension|[](#t45, this) in #t46 == null ?{self::Class*} let final void #t47 = self::Extension|[]=(#t45, this, this) in this : #t46;
+    v = let final core::int* #t48 = i in let final self::Class* #t49 = self::Extension|[](#t48, self) in #t49 == null ?{self::Class*} let final void #t50 = self::Extension|[]=(#t48, self, self) in self : #t49;
+    v = let final core::int* #t51 = i in let final void #t52 = self::Extension|[]=(#t51, this, this) in this;
+    v = let final core::int* #t53 = i in let final void #t54 = self::Extension|[]=(#t53, self, self) in self;
+    v = self::Extension|[](i, this);
+    v = self::Extension|[](i, self);
+    v = let final core::int* #t55 = i in let final self::Class* #t56 = self::Extension|[](#t55, this).{self::Class::+}(this){(self::Class*) →* self::Class*} in let final void #t57 = self::Extension|[]=(#t55, this, #t56) in #t56;
+    v = let final core::int* #t58 = i in let final self::Class* #t59 = self::Extension|[](#t58, self).{self::Class::+}(self){(self::Class*) →* self::Class*} in let final void #t60 = self::Extension|[]=(#t58, self, #t59) in #t59;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass*
+    : super self::Class::•()
+    ;
+  method superIndexGetSetForEffect() → void {
+    final self::Class* self = this;
+    super.{self::Class::[]}(this) == null ?{self::Class*} super.{self::Class::[]=}(this, this) : null;
+    super.{self::Class::[]}(self) == null ?{self::Class*} super.{self::Class::[]=}(self, self) : null;
+    super.{self::Class::[]=}(this, this);
+    super.{self::Class::[]=}(self, self);
+    super.{self::Class::[]}(this);
+    super.{self::Class::[]}(self);
+    super.{self::Class::[]=}(this, super.{self::Class::[]}(this).{self::Class::+}(this){(self::Class*) →* self::Class*});
+    super.{self::Class::[]=}(self, super.{self::Class::[]}(self).{self::Class::+}(self){(self::Class*) →* self::Class*});
+  }
+  method superIndexGetSetForValue() → void {
+    final self::Class* self = this;
+    dynamic v;
+    v = let final self::Class* #t61 = super.{self::Class::[]}(this) in #t61 == null ?{self::Class*} let final void #t62 = super.{self::Class::[]=}(this, this) in this : #t61;
+    v = let final self::Class* #t63 = super.{self::Class::[]}(self) in #t63 == null ?{self::Class*} let final void #t64 = super.{self::Class::[]=}(self, self) in self : #t63;
+    v = let final void #t65 = super.{self::Class::[]=}(this, this) in this;
+    v = let final void #t66 = super.{self::Class::[]=}(self, self) in self;
+    v = super.{self::Class::[]}(this);
+    v = super.{self::Class::[]}(self);
+    v = let final self::Class* #t67 = super.{self::Class::[]}(this).{self::Class::+}(this){(self::Class*) →* self::Class*} in let final void #t68 = super.{self::Class::[]=}(this, #t67) in #t67;
+    v = let final self::Class* #t69 = super.{self::Class::[]}(self).{self::Class::+}(self){(self::Class*) →* self::Class*} in let final void #t70 = super.{self::Class::[]=}(self, #t69) in #t69;
+  }
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2*
+    : super core::Object::•()
+    ;
+  operator +(self::Class2* cls) → self::Class2*
+    return cls;
+  method implicitExtensionGetSetForEffect() → void {
+    final self::Class2* self = this;
+    self::Extension2|[](this, this) == null ?{self::Class2*} self::Extension2|[]=(this, this, this) : null;
+    self::Extension2|[](self, self) == null ?{self::Class2*} self::Extension2|[]=(self, self, self) : null;
+    self::Extension2|[]=(this, this, this);
+    self::Extension2|[]=(self, self, self);
+    self::Extension2|[](this, this);
+    self::Extension2|[](self, self);
+    self::Extension2|[]=(this, this, self::Extension2|[](this, this).{self::Class2::+}(this){(self::Class2*) →* self::Class2*});
+    self::Extension2|[]=(self, self, self::Extension2|[](self, self).{self::Class2::+}(self){(self::Class2*) →* self::Class2*});
+  }
+  method implicitExtensionGetSetForValue() → void {
+    final self::Class2* self = this;
+    dynamic v;
+    v = let final self::Class2* #t71 = self::Extension2|[](this, this) in #t71 == null ?{self::Class2*} let final void #t72 = self::Extension2|[]=(this, this, this) in this : #t71;
+    v = let final self::Class2* #t73 = self::Extension2|[](self, self) in #t73 == null ?{self::Class2*} let final void #t74 = self::Extension2|[]=(self, self, self) in self : #t73;
+    v = let final void #t75 = self::Extension2|[]=(this, this, this) in this;
+    v = let final void #t76 = self::Extension2|[]=(self, self, self) in self;
+    v = self::Extension2|[](this, this);
+    v = self::Extension2|[](self, self);
+    v = let final self::Class2* #t77 = self::Extension2|[](this, this).{self::Class2::+}(this){(self::Class2*) →* self::Class2*} in let final void #t78 = self::Extension2|[]=(this, this, #t77) in #t77;
+    v = let final self::Class2* #t79 = self::Extension2|[](self, self).{self::Class2::+}(self){(self::Class2*) →* self::Class2*} in let final void #t80 = self::Extension2|[]=(self, self, #t79) in #t79;
+  }
+  method explicitExtensionGetSetForEffect() → void {
+    final self::Class2* self = this;
+    self::Extension2|[](this, this) == null ?{self::Class2*} self::Extension2|[]=(this, this, this) : null;
+    self::Extension2|[](self, self) == null ?{self::Class2*} self::Extension2|[]=(self, self, self) : null;
+    self::Extension2|[]=(this, this, this);
+    self::Extension2|[]=(self, self, self);
+    self::Extension2|[](this, this);
+    self::Extension2|[](self, self);
+    self::Extension2|[]=(this, this, self::Extension2|[](this, this).{self::Class2::+}(this){(self::Class2*) →* self::Class2*});
+    self::Extension2|[]=(self, self, self::Extension2|[](self, self).{self::Class2::+}(self){(self::Class2*) →* self::Class2*});
+  }
+  method explicitExtensionGetSetForValue() → void {
+    final self::Class2* self = this;
+    dynamic v;
+    v = let final self::Class2* #t81 = self::Extension2|[](this, this) in #t81 == null ?{self::Class2*} let final void #t82 = self::Extension2|[]=(this, this, this) in this : #t81;
+    v = let final self::Class2* #t83 = self::Extension2|[](self, self) in #t83 == null ?{self::Class2*} let final void #t84 = self::Extension2|[]=(self, self, self) in self : #t83;
+    v = let final void #t85 = self::Extension2|[]=(this, this, this) in this;
+    v = let final void #t86 = self::Extension2|[]=(self, self, self) in self;
+    v = self::Extension2|[](this, this);
+    v = self::Extension2|[](self, self);
+    v = let final self::Class2* #t87 = self::Extension2|[](this, this).{self::Class2::+}(this){(self::Class2*) →* self::Class2*} in let final void #t88 = self::Extension2|[]=(this, this, #t87) in #t87;
+    v = let final self::Class2* #t89 = self::Extension2|[](self, self).{self::Class2::+}(self){(self::Class2*) →* self::Class2*} in let final void #t90 = self::Extension2|[]=(self, self, #t89) in #t89;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on core::int* {
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+}
+extension Extension2 on self::Class2* {
+  operator [] = self::Extension2|[];
+  operator []= = self::Extension2|[]=;
+}
+static method Extension|[](lowered final core::int* #this, self::Class* cls) → self::Class*
+  return new self::Class::•();
+static method Extension|[]=(lowered final core::int* #this, self::Class* cls, self::Class* value) → void {}
+static method Extension2|[](lowered final self::Class2* #this, self::Class2* cls) → self::Class2*
+  return new self::Class2::•();
+static method Extension2|[]=(lowered final self::Class2* #this, self::Class2* cls, self::Class2* value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/qualified.dart.weak.modular.expect b/pkg/front_end/testcases/general/qualified.dart.weak.modular.expect
new file mode 100644
index 0000000..59d3ddb
--- /dev/null
+++ b/pkg/front_end/testcases/general/qualified.dart.weak.modular.expect
@@ -0,0 +1,167 @@
+library test.qualified.main;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+//   factory WrongName() {}
+//           ^^^^^^^^^
+// pkg/front_end/testcases/general/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
+// class Bad extends lib.Missing {
+//       ^^^
+//
+// pkg/front_end/testcases/general/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/qualified.dart:18:7: Error: The type 'lib.VoidFunction' which is an alias of 'void Function()' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+// pkg/front_end/testcases/general/qualified_lib.dart:27:9: Context: The issue arises via this type alias.
+// typedef VoidFunction = void Function();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "qualified_lib.dart" as lib;
+
+import "org-dartlang-testcase:///qualified_lib.dart" as lib;
+
+part qualified_part.dart;
+class Bad extends core::Object {
+  method method() → invalid-type {}
+  static factory WrongName() → self::Bad* {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_WithMixin&Supertype&Mixin*
+    : super lib::Supertype::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{lib::Mixin::foo}();
+}
+class WithMixin extends self::_WithMixin&Supertype&Mixin {
+  synthetic constructor •() → self::WithMixin*
+    : super self::_WithMixin&Supertype&Mixin::•()
+    ;
+}
+class IllegalSupertype extends core::Object {
+  synthetic constructor •() → self::IllegalSupertype*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends core::Object* = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  constructor a() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static factory b<T extends core::Object* = dynamic>() → self::C<self::C::b::T*>*
+    return lib::C::b<self::C::b::T*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•<core::String*>();
+  new self::C::a<core::String*>();
+  new lib::C::a<core::String*>();
+  new lib::C::•<core::String*>();
+  new lib::C::a<core::String*>();
+  new lib::C::a<core::String*>();
+  new self::WithMixin::•().{lib::Supertype::supertypeMethod}(){() →* dynamic};
+  new self::WithMixin::•().{self::_WithMixin&Supertype&Mixin::foo}(){() →* dynamic};
+  new self::IllegalSupertype::•();
+}
+
+library test.qualified.lib;
+import self as lib;
+import "dart:core" as core;
+import "qualified.dart" as self;
+
+import "org-dartlang-testcase:///qualified.dart" as main;
+
+typedef VoidFunction = () →* void;
+class C<T extends core::Object* = dynamic> extends self::C<lib::C::T*> {
+  static final field dynamic _redirecting# = <dynamic>[#C2];
+  constructor •() → lib::C<lib::C::T*>*
+    : super self::C::•()
+    ;
+  constructor a() → lib::C<lib::C::T*>*
+    : super self::C::•()
+    ;
+  static factory b<T extends core::Object* = dynamic>() → lib::C<lib::C::b::T*>*
+    return new lib::C::a<lib::C::b::T*>();
+}
+class Supertype extends core::Object {
+  synthetic constructor •() → lib::Supertype*
+    : super core::Object::•()
+    ;
+  method supertypeMethod() → dynamic {
+    core::print("I'm supertypeMethod form lib.Supertype");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Mixin extends core::Object {
+  synthetic constructor •() → lib::Mixin*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::print("I'm Mixin.foo");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = constructor-tearoff self::C::b
+  #C2 = constructor-tearoff lib::C::b
+}
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..293f8a2
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory fisk() → self::A*
+    return new self::B::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::fisk
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.modular.expect
new file mode 100644
index 0000000..ba2466c
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.weak.modular.expect
@@ -0,0 +1,183 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+//  - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+//   factory FooBase(int x) = Foo<Tf>;
+//                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class FooBase<Tf extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  abstract get x() → core::int*;
+  static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
+    return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
+  static final field dynamic _redirecting# = <dynamic>[#C2];
+  static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
+    return new self::Bar::•<core::String*, self::Foo::•::T*>(x);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar<Sb extends core::Object* = dynamic, Tb extends core::Object* = dynamic> extends core::Object implements self::Foo<self::Bar::Tb*> {
+  field core::int* x;
+  constructor •(core::int* x) → self::Bar<self::Bar::Sb*, self::Bar::Tb*>*
+    : self::Bar::x = x, super core::Object::•() {
+    core::print("Bar<${self::Bar::Sb*},${self::Bar::Tb*}>");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Builder<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Builder<self::Builder::X*>*
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    return invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C3];
+  static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
+    return self::SimpleCaseImpl::•<self::SimpleCase::•::A*, self::SimpleCase::•::B*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SimpleCaseImpl<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai*, self::SimpleCaseImpl::Bi*> {
+  static final field dynamic _redirecting# = <dynamic>[#C4];
+  static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
+    return new self::SimpleCaseImpl2::•<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SimpleCaseImpl2<Ai2 extends core::Object* = dynamic, Bi2 extends core::Object* = dynamic> extends core::Object implements self::SimpleCaseImpl<self::SimpleCaseImpl2::Ai2*, self::SimpleCaseImpl2::Bi2*> {
+  synthetic constructor •() → self::SimpleCaseImpl2<self::SimpleCaseImpl2::Ai2*, self::SimpleCaseImpl2::Bi2*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Base<M extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Base<self::Base::M*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mixin<M extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Mixin<self::Mixin::M*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mix<M extends core::Object* = dynamic> = self::Base<self::Mix::M*> with self::Mixin<self::Mix::M*> {
+  synthetic constructor •() → self::Mix<self::Mix::M*>*
+    : super self::Base::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(invalid-expression "pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+ - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+  factory FooBase(int x) = Foo<Tf>;
+                           ^".{self::FooBase::x}{core::int*});
+  new self::SimpleCaseImpl2::•<core::int*, core::double*>();
+  new self::Mix::•<core::double*>();
+}
+
+constants  {
+  #C1 = constructor-tearoff self::FooBase::•
+  #C2 = constructor-tearoff self::Foo::•
+  #C3 = constructor-tearoff self::SimpleCase::•
+  #C4 = constructor-tearoff self::SimpleCaseImpl::•
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.modular.expect
new file mode 100644
index 0000000..e86259e
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library redirecting_factory_constructors.chain_test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory first() → self::A*
+    return new self::A::•();
+  static factory second() → self::A*
+    return self::A::first();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•();
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::first
+  #C2 = constructor-tearoff self::A::second
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..3dc0b99
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
+    return new self::_Y::•<self::_X::•::T*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class _Y<T extends core::Object* = dynamic> extends core::Object implements self::_X<self::_Y::T*> /*hasConstConstructor*/  {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::_X<self::A::T*>* x;
+  constructor •(self::_X<self::A::T*>* x) → self::A<self::A::T*>*
+    : self::A::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
+  constructor •() → self::B<self::B::T*>*
+    : super self::A::•(#C2)
+    ;
+}
+static method main() → dynamic {
+  dynamic x = new self::B::•<dynamic>().{self::A::x}{self::_X<dynamic>*};
+  if(!(x is self::_Y<Null>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}{core::Type*}}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = constructor-tearoff self::_X::•
+  #C2 = self::_Y<Null> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///redirecting_factory_const_inference.dart:
+- _Y. (from org-dartlang-testcase:///redirecting_factory_const_inference.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect
new file mode 100644
index 0000000..4a74b87
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_factory_default_value.dart:10:35: Error: Can't have a default value here because any default values of 'A' would be used instead.
+// Try removing the default value.
+//   factory A.redirect([int field = 87]) = A;
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •([core::int field = #C2]) → self::A
+    : self::A::field = field, super core::Object::•()
+    ;
+  static factory redirect([core::int field]) → self::A
+    return new self::A::•(field);
+}
+static method main() → dynamic {
+  self::expect(42, new self::A::•().{self::A::field}{core::int});
+  self::expect(123, new self::A::•(123).{self::A::field}{core::int});
+  self::expect(42, new self::A::•().{self::A::field}{core::int});
+  self::expect(123, new self::A::•(123).{self::A::field}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::redirect
+  #C2 = 42
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
index 7669a3f..05e4ae1 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_default_value.dart.weak.outline.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   final field core::int field;
   static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
-  constructor •([core::int field]) → self::A
+  constructor •([core::int field = 42]) → self::A
     ;
   static factory redirect([core::int field]) → self::A
     return new self::A::•(field);
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.modular.expect
new file mode 100644
index 0000000..f674d71
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart.weak.modular.expect
@@ -0,0 +1,196 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:47:10: Error: Superclass has no method named '[]'.
+//     super[new Class1()];
+//          ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:49:10: Error: Superclass has no method named '[]='.
+//     super[0] = new Class1();
+//          ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:51:11: Error: Superclass has no setter named 'foo'.
+//     super.foo = new Class1();
+//           ^^^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:53:11: Error: Superclass has no method named 'foo'.
+//     super.foo(new Class1());
+//           ^^^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:55:11: Error: Superclass has no method named '+'.
+//     super + new Class1();
+//           ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:20:5: Error: The operator 'unary-' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+//     -new Class1();
+//     ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:22:15: Error: The operator '-' isn't defined for the class 'String'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
+//     ('' + '') - new Class1();
+//               ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:24:12: Error: The operator '[]=' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//     (0 + 1)[0] = new Class1();
+//            ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:25:8: Error: The operator '[]=' isn't defined for the class 'Class2'.
+//  - 'Class2' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//     _c2[0] = new Class1();
+//        ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:27:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//     (0 + 1)[new Class1()];
+//            ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:29:18: Error: The getter 'foo' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'foo'.
+//     new Class1().foo;
+//                  ^^^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:31:13: Error: The setter 'foo' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
+//     (0 + 1).foo = new Class1();
+//             ^^^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:33:18: Error: The method 'foo' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+//     new Class1().foo();
+//                  ^^^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:35:17: Error: The method 'call' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     new Class1()();
+//                 ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:37:23: Error: 'field' isn't a function or method and can't be invoked.
+//     new Class1().field();
+//                       ^^^^...
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:39:24: Error: 'getter' isn't a function or method and can't be invoked.
+//     new Class1().getter();
+//                        ^^^^...
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:41:8: Error: 'call' isn't a function or method and can't be invoked.
+//     _c2(new Class1());
+//        ^^^^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:43:18: Error: Duplicated named argument 'a'.
+//     method(a: 0, a: new Class1());
+//                  ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:45:18: Error: Duplicated named argument 'a'.
+//     method(a: 0, a: 1, a: new Class1());
+//                  ^
+//
+// pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:45:24: Error: Duplicated named argument 'a'.
+//     method(a: 0, a: 1, a: new Class1());
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  field core::int field = 0;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor _() → self::Class1
+    : super core::Object::•()
+    ;
+  static factory •() → self::Class1
+    return new self::Class1::_();
+  get getter() → core::int
+    return 0;
+}
+class Class2 extends self::Class1 {
+  final field self::Class2 _c2;
+  constructor •(self::Class2 _c2) → self::Class2
+    : self::Class2::_c2 = _c2, super self::Class1::_() {
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:20:5: Error: The operator 'unary-' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+    -new Class1();
+    ^" in new self::Class1::_(){<unresolved>}.unary-();
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:22:15: Error: The operator '-' isn't defined for the class 'String'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
+    ('' + '') - new Class1();
+              ^" in "".{core::String::+}(""){(core::String) → core::String}{<unresolved>}.-(new self::Class1::_());
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:24:12: Error: The operator '[]=' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+    (0 + 1)[0] = new Class1();
+           ^" in 0.{core::num::+}(1){(core::num) → core::int}{<unresolved>}.[]=(0, new self::Class1::_());
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:25:8: Error: The operator '[]=' isn't defined for the class 'Class2'.
+ - 'Class2' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+    _c2[0] = new Class1();
+       ^" in this.{self::Class2::_c2}{self::Class2}{<unresolved>}.[]=(0, new self::Class1::_());
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:27:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+    (0 + 1)[new Class1()];
+           ^" in 0.{core::num::+}(1){(core::num) → core::int}{<unresolved>}.[](new self::Class1::_());
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:29:18: Error: The getter 'foo' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'foo'.
+    new Class1().foo;
+                 ^^^" in new self::Class1::_(){<unresolved>}.foo;
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:31:13: Error: The setter 'foo' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
+    (0 + 1).foo = new Class1();
+            ^^^" in 0.{core::num::+}(1){(core::num) → core::int}{<unresolved>}.foo = new self::Class1::_();
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:33:18: Error: The method 'foo' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+    new Class1().foo();
+                 ^^^" in new self::Class1::_(){<unresolved>}.foo();
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:35:17: Error: The method 'call' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    new Class1()();
+                ^" in new self::Class1::_(){<unresolved>}.call();
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:37:23: Error: 'field' isn't a function or method and can't be invoked.
+    new Class1().field();
+                      ^^^^..." in new self::Class1::_().{self::Class1::field}{core::int}{<unresolved>}.call();
+    invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:39:24: Error: 'getter' isn't a function or method and can't be invoked.
+    new Class1().getter();
+                       ^^^^..." in new self::Class1::_().{self::Class1::getter}{core::int}{<unresolved>}.call();
+    let final self::Class2 #t1 = this.{self::Class2::_c2}{self::Class2} in let final self::Class1 #t2 = new self::Class1::_() in invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:41:8: Error: 'call' isn't a function or method and can't be invoked.
+    _c2(new Class1());
+       ^^^^" in #t1.{self::Class2::call}{core::int}{<unresolved>}.call(#t2);
+    this.{self::Class2::method}(a: invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:43:18: Error: Duplicated named argument 'a'.
+    method(a: 0, a: new Class1());
+                 ^" in block {
+      0;
+    } =>new self::Class1::_()){({a: dynamic}) → dynamic};
+    this.{self::Class2::method}(a: invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:45:24: Error: Duplicated named argument 'a'.
+    method(a: 0, a: 1, a: new Class1());
+                       ^" in block {
+      invalid-expression "pkg/front_end/testcases/general/redirecting_factory_invocation_in_invalid.dart:45:18: Error: Duplicated named argument 'a'.
+    method(a: 0, a: 1, a: new Class1());
+                 ^" in block {
+        0;
+      } =>1;
+    } =>new self::Class1::_()){({a: dynamic}) → dynamic};
+    super.[](new self::Class1::_());
+    super.[]=(0, new self::Class1::_());
+    super.foo = new self::Class1::_();
+    super.foo(new self::Class1::_());
+    super.+(new self::Class1::_());
+  }
+  method method({dynamic a = #C2}) → dynamic {}
+  get call() → core::int
+    return 0;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class1::•
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.modular.expect
new file mode 100644
index 0000000..4f4319e
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.modular.expect
@@ -0,0 +1,106 @@
+@#C1
+library name /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart" as self;
+export "org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart";
+
+@#C1
+part redirecting_factory_invocation_metadata_lib.dart;
+@#C1
+typedef Typedef1<@#C1 unrelated T extends core::Object? = dynamic> = <T extends core::Object? = dynamic>(@#C1 self::Class<dynamic> #t1, [@#C1 self::Class<dynamic> #t2]) → dynamic;
+@#C1
+typedef Typedef2<@#C1 unrelated T extends core::Object? = dynamic> = <T extends core::Object? = dynamic>(@#C1 self::Class<dynamic> #t3, {@#C1 self::Class<dynamic> o2}) → dynamic;
+@#C1
+typedef Typedef3<@#C1 unrelated T extends core::Object? = dynamic> = (@#C1 dynamic o1, [@#C1 dynamic o2]) → void;
+@#C1
+typedef Typedef4<@#C1 unrelated T extends core::Object? = dynamic> = (@#C1 dynamic o1, {@#C1 dynamic o2}) → void;
+@#C1
+class Const extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  const constructor internal() → self::Const
+    : super core::Object::•()
+    ;
+  static factory •() → self::Const
+    return new self::Const::internal();
+}
+class Class<@#C1 T extends core::Object? = dynamic> extends core::Object {
+  @#C1
+  field <T extends core::Object? = dynamic>(dynamic, {o2: dynamic}) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {
+    @#C1 dynamic l1;
+    @#C1
+    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {}
+  };
+  @#C1
+  constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  @#C1
+  method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
+    @#C1 dynamic l1;
+    @#C1
+    function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
+  }
+  @#C1
+  method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+    <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
+  }
+}
+@#C1
+extension Extension<@#C1 T extends core::Object? = dynamic> on self::Class<T%> {
+  static field field = self::Extension|field;
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+  method method2 = self::Extension|method2;
+  tearoff method2 = self::Extension|get#method2;
+}
+@#C1
+static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {
+  @#C1 dynamic l1;
+  @#C1
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
+};
+@#C1
+static field <T extends core::Object? = dynamic>(dynamic, [dynamic]) → Null Extension|field = <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {
+  @#C1 dynamic l1;
+  @#C1
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
+};
+@#C1
+static method method1<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
+  @#C1 dynamic l1;
+  @#C1
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
+}
+@#C1
+static method method2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
+}
+@#C1
+static method Extension|method1<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method1::#T%> #this, @#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → dynamic {
+  @#C1 dynamic l1;
+  @#C1
+  function l2<@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, [@#C1 dynamic o2 = #C3]) → Null {}
+}
+static method Extension|get#method1<#T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method1::#T%> #this) → <T extends core::Object? = dynamic>(dynamic, [dynamic]) → dynamic
+  return <T extends core::Object? = dynamic>(dynamic o1, [dynamic o2 = #C3]) → dynamic => self::Extension|method1<self::Extension|get#method1::#T%, T%>(#this, o1, o2);
+@#C1
+static method Extension|method2<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|method2::#T%> #this, @#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → dynamic {
+  <@#C1 T extends core::Object? = dynamic>(@#C1 dynamic o1, {@#C1 dynamic o2 = #C3}) → Null {};
+}
+static method Extension|get#method2<#T extends core::Object? = dynamic>(lowered final self::Class<self::Extension|get#method2::#T%> #this) → <T extends core::Object? = dynamic>(dynamic, {o2: dynamic}) → dynamic
+  return <T extends core::Object? = dynamic>(dynamic o1, {dynamic o2 = #C3}) → dynamic => self::Extension|method2<self::Extension|get#method2::#T%, T%>(#this, o1, o2: o2);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Const {}
+  #C2 = constructor-tearoff self::Const::•
+  #C3 = null
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:
+- Const.internal (from org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart:19:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.modular.expect
new file mode 100644
index 0000000..9b12539
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor named(dynamic p) → self::Foo*
+    : super core::Object::•()
+    ;
+  @#C2
+  static factory •(@#C3 @#C4 dynamic p) → self::Foo*
+    return new self::Foo::named(p);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* forParameter = #C3;
+static const field core::int* forFactoryItself = #C2;
+static const field core::int* anotherForParameter = #C4;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Foo::•
+  #C2 = 2
+  #C3 = 1
+  #C4 = 3
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.modular.expect
new file mode 100644
index 0000000..f2a4360
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library redirecting_factory_constructors.simple_test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory redir() → self::A*
+    return new self::A::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•();
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.modular.expect
new file mode 100644
index 0000000..16c46e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library redirecting_factory_constructors.typeargs_test;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Y extends self::X {
+  synthetic constructor •() → self::Y*
+    : super self::X::•()
+    ;
+}
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory redir() → self::A*
+    return new self::B::•<self::Y*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends self::X*> extends self::A {
+  constructor •() → self::B<self::B::T*>*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•<self::Y*>();
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.modular.expect
new file mode 100644
index 0000000..469f2af
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library redirecting_factory_constructors.typeparam_test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic, S extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
+    : super core::Object::•()
+    ;
+  static factory redir<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
+    return new self::A::•<self::A::redir::T*, self::A::redir::S*>(t, s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•<core::int*, core::String*>(42, "foobar");
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.modular.expect
new file mode 100644
index 0000000..98d4e12
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library redirecting_factory_constructors.typeparambounds_test;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Y extends self::X {
+  synthetic constructor •() → self::Y*
+    : super self::X::•()
+    ;
+}
+class A<T extends core::Object* = dynamic, S extends self::A::T* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
+    : super core::Object::•()
+    ;
+  static factory redir<T extends core::Object* = dynamic, S extends self::A::redir::T* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
+    return new self::A::•<self::A::redir::T*, self::A::redir::S*>(t, s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•<self::X*, self::Y*>(new self::X::•(), new self::Y::•());
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::redir
+}
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.modular.expect
new file mode 100644
index 0000000..a539f39
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo<T extends self::X*> extends core::Object {
+  covariant-by-class field self::Foo::T* x;
+  constructor fromX(self::X* _init) → self::Foo<self::Foo::T*>*
+    : this self::Foo::_internal(x: _init as{TypeError} self::Foo::T*)
+    ;
+  constructor fromT(self::Foo::T* _init) → self::Foo<self::Foo::T*>*
+    : this self::Foo::_internal(x: _init)
+    ;
+  constructor _internal({self::Foo::T* x = #C1}) → self::Foo<self::Foo::T*>*
+    : self::Foo::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.weak.modular.expect
new file mode 100644
index 0000000..6c401a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
+//   Foo.from(String _init) : this._internal(x: _init);
+//                                              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::Foo::T* x;
+  constructor from(core::String* _init) → self::Foo<self::Foo::T*>*
+    : this self::Foo::_internal(x: invalid-expression "pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
+  Foo.from(String _init) : this._internal(x: _init);
+                                             ^" in _init as{TypeError} Never)
+    ;
+  constructor _internal({self::Foo::T* x = #C1}) → self::Foo<self::Foo::T*>*
+    : self::Foo::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..273bd861
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    return self::B::•<self::A::•::T*, core::num*>();
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static final field dynamic _redirecting# = <dynamic>[#C2];
+  constructor empty() → self::B<self::B::U*, self::B::W*>*
+    : super self::A::empty()
+    ;
+  static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
+    return new self::C::•<self::B::•::U*, self::B::•::W*, core::String*>();
+}
+class C<V extends core::Object* = dynamic, S extends core::Object* = dynamic, R extends core::Object* = dynamic> extends self::B<self::C::V*, self::C::S*> {
+  constructor •() → self::C<self::C::V*, self::C::S*, self::C::R*>*
+    : super self::B::empty()
+    ;
+  method toString() → core::String*
+    return "${self::C::V*},${self::C::S*},${self::C::R*}";
+}
+static method main() → dynamic {
+  exp::Expect::equals("${new self::C::•<core::int*, core::num*, core::String*>()}", "int,num,String");
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.modular.expect
new file mode 100644
index 0000000..516d00c
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    return self::B::•<self::A::•::T*, core::List<self::A::•::T*>*>();
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static final field dynamic _redirecting# = <dynamic>[#C2];
+  constructor empty() → self::B<self::B::U*, self::B::W*>*
+    : super self::A::empty()
+    ;
+  static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
+    return new self::C::•<self::B::•::U*, self::B::•::W*, core::Map<self::B::•::U*, self::B::•::W*>*>();
+}
+class C<V extends core::Object* = dynamic, S extends core::Object* = dynamic, R extends core::Object* = dynamic> extends self::B<self::C::V*, self::C::S*> {
+  constructor •() → self::C<self::C::V*, self::C::S*, self::C::R*>*
+    : super self::B::empty()
+    ;
+  method toString() → core::String*
+    return "${self::C::V*},${self::C::S*},${self::C::R*}";
+}
+static method main() → dynamic {
+  exp::Expect::equals("${new self::C::•<core::int*, core::List<core::int*>*, core::Map<core::int*, core::List<core::int*>*>*>()}", "int,List<int>,Map<int, List<int>>");
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..be27ced
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  const constructor empty() → self::A*
+    : super core::Object::•()
+    ;
+  static factory •() → self::A*
+    return new self::B::•<core::String*>();
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B<self::B::T*>*
+    : super self::A::empty()
+    ;
+  method toString() → core::String*
+    return "${self::B::T*}";
+}
+static method main() → void {
+  exp::Expect::equals("${#C2}", "String");
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = self::B<core::String*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///redirection_type_arguments.dart:
+- B. (from org-dartlang-testcase:///redirection_type_arguments.dart:16:9)
+- A.empty (from org-dartlang-testcase:///redirection_type_arguments.dart:12:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/regression_flutter51828.dart.weak.modular.expect b/pkg/front_end/testcases/general/regression_flutter51828.dart.weak.modular.expect
new file mode 100644
index 0000000..7cc953e
--- /dev/null
+++ b/pkg/front_end/testcases/general/regression_flutter51828.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo(dynamic x) → asy::Future<void>* async {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method bar(dynamic x) → asy::Future<void>* async {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic async 
+  return <asy::Future<void>*>[new self::A::•().{self::A::foo}(await null){(dynamic) →* asy::Future<void>*}, new self::B::•().{self::B::bar}(await null){(dynamic) →* asy::Future<void>*}];
diff --git a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..dcd7a33
--- /dev/null
+++ b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart:8:12: Error: Type variables can't have generic function types in their bounds.
+// class Hest<TypeX extends TypeY Function<TypeY>(TypeY)> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends <TypeY extends core::Object* = dynamic>(TypeY*) →* TypeY* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.weak.modular.expect b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.weak.modular.expect
new file mode 100644
index 0000000..7704535
--- /dev/null
+++ b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::List<dynamic>* x) → core::bool* {
+  return x.{core::Iterable::expand}<dynamic>((dynamic y) → core::Iterable<dynamic>* {
+    return y{dynamic}.split(",") as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+  }){((dynamic) →* core::Iterable<dynamic>*) →* core::Iterable<dynamic>*}.{core::Iterable::any}((dynamic y) → core::bool* => y =={core::Object::==}{(core::Object*) →* core::bool*} "z"){((dynamic) →* core::bool*) →* core::bool*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.weak.modular.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.weak.modular.expect
new file mode 100644
index 0000000..7131789
--- /dev/null
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/sdk_diagnostic.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - Iterable.iterator
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C extends Iterable<Object> {
+//       ^
+// sdk/lib/core/iterable.dart:148:19: Context: 'Iterable.iterator' is defined here.
+//   Iterator<E> get iterator;
+//                   ^^^^^^^^
+//
+// pkg/front_end/testcases/general/sdk_diagnostic.dart:12:8: Error: Too few positional arguments: 1 required, 0 given.
+//   print(incorrectArgument: "fisk");
+//        ^
+// sdk/lib/core/print.dart:8:6: Context: Found this candidate, but the arguments don't match.
+// void print(Object? object) {
+//      ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Iterable<core::Object*> {
+  synthetic constructor •() → self::C*
+    : super core::Iterable::•()
+    ;
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → core::Iterable<self::C::cast::R*>*; -> core::Iterable::cast
+  abstract member-signature method followedBy(covariant-by-class core::Iterable<core::Object*>* other) → core::Iterable<core::Object*>*; -> core::Iterable::followedBy
+  abstract member-signature method map<T extends core::Object* = dynamic>((core::Object*) →* self::C::map::T* toElement) → core::Iterable<self::C::map::T*>*; -> core::Iterable::map
+  abstract member-signature method where((core::Object*) →* core::bool* test) → core::Iterable<core::Object*>*; -> core::Iterable::where
+  abstract member-signature method whereType<T extends core::Object* = dynamic>() → core::Iterable<self::C::whereType::T*>*; -> core::Iterable::whereType
+  abstract member-signature method expand<T extends core::Object* = dynamic>((core::Object*) →* core::Iterable<self::C::expand::T*>* toElements) → core::Iterable<self::C::expand::T*>*; -> core::Iterable::expand
+  abstract member-signature method contains(core::Object* element) → core::bool*; -> core::Iterable::contains
+  abstract member-signature method forEach((core::Object*) →* void action) → void; -> core::Iterable::forEach
+  abstract member-signature method reduce(covariant-by-class (core::Object*, core::Object*) →* core::Object* combine) → core::Object*; -> core::Iterable::reduce
+  abstract member-signature method fold<T extends core::Object* = dynamic>(self::C::fold::T* initialValue, (self::C::fold::T*, core::Object*) →* self::C::fold::T* combine) → self::C::fold::T*; -> core::Iterable::fold
+  abstract member-signature method every((core::Object*) →* core::bool* test) → core::bool*; -> core::Iterable::every
+  abstract member-signature method join([core::String* separator = #C1]) → core::String*; -> core::Iterable::join
+  abstract member-signature method any((core::Object*) →* core::bool* test) → core::bool*; -> core::Iterable::any
+  abstract member-signature method toList({core::bool* growable = #C2}) → core::List<core::Object*>*; -> core::Iterable::toList
+  abstract member-signature method toSet() → core::Set<core::Object*>*; -> core::Iterable::toSet
+  abstract member-signature get length() → core::int*; -> core::Iterable::length
+  abstract member-signature get isEmpty() → core::bool*; -> core::Iterable::isEmpty
+  abstract member-signature get isNotEmpty() → core::bool*; -> core::Iterable::isNotEmpty
+  abstract member-signature method take(core::int* count) → core::Iterable<core::Object*>*; -> core::Iterable::take
+  abstract member-signature method takeWhile((core::Object*) →* core::bool* test) → core::Iterable<core::Object*>*; -> core::Iterable::takeWhile
+  abstract member-signature method skip(core::int* count) → core::Iterable<core::Object*>*; -> core::Iterable::skip
+  abstract member-signature method skipWhile((core::Object*) →* core::bool* test) → core::Iterable<core::Object*>*; -> core::Iterable::skipWhile
+  abstract member-signature method firstWhere((core::Object*) →* core::bool* test, {covariant-by-class () →* core::Object* orElse = #C3}) → core::Object*; -> core::Iterable::firstWhere
+  abstract member-signature method lastWhere((core::Object*) →* core::bool* test, {covariant-by-class () →* core::Object* orElse = #C3}) → core::Object*; -> core::Iterable::lastWhere
+  abstract member-signature method singleWhere((core::Object*) →* core::bool* test, {covariant-by-class () →* core::Object* orElse = #C3}) → core::Object*; -> core::Iterable::singleWhere
+  abstract member-signature method elementAt(core::int* index) → core::Object*; -> core::Iterable::elementAt
+  abstract member-signature method toString() → core::String*; -> core::Iterable::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature get iterator() → core::Iterator<core::Object*>*; -> core::Iterable::iterator
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/sdk_diagnostic.dart:12:8: Error: Too few positional arguments: 1 required, 0 given.
+  print(incorrectArgument: \"fisk\");
+       ^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = ""
+  #C2 = true
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.weak.modular.expect b/pkg/front_end/testcases/general/spread_collection.dart.weak.modular.expect
new file mode 100644
index 0000000..6948e05
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/spread_collection.dart:21:21: Error: Not enough type information to disambiguate between literal set and literal map.
+// Try providing type arguments for the literal explicitly to disambiguate it.
+//   final aSetOrMap = {...foo()};
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  final core::List<core::int*>* aList = block {
+    final core::List<core::int*>* #t1 = <core::int*>[1];
+    #t1.{core::List::addAll}{Invariant}(<core::int*>[2]){(core::Iterable<core::int*>*) →* void};
+    final core::Iterable<core::int*>* #t2 = <core::int*>[3];
+    if(!(#t2 == null))
+      #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::int*>*) →* void};
+  } =>#t1;
+  final core::Map<core::int*, core::int*>* aMap = block {
+    final core::Map<core::int*, core::int*>* #t3 = <core::int*, core::int*>{};
+    #t3.{core::Map::[]=}{Invariant}(1, 1){(core::int*, core::int*) →* void};
+    for (final core::MapEntry<core::int*, core::int*>* #t4 in <core::int*, core::int*>{2: 2}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>})
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{core::int*}, #t4.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+    final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{3: 3};
+    if(!(#t5 == null))
+      for (final core::MapEntry<core::int*, core::int*>* #t6 in #t5.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>})
+        #t3.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{core::int*}, #t6.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+  } =>#t3;
+  final core::Set<core::int*>* aSet = block {
+    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
+    #t7.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
+    #t7.{core::Set::addAll}{Invariant}(<core::int*>[2]){(core::Iterable<core::int*>*) →* void};
+    final core::Iterable<core::int*>* #t8 = <core::int*>[3];
+    if(!(#t8 == null))
+      #t7.{core::Set::addAll}{Invariant}(#t8){(core::Iterable<core::int*>*) →* void};
+  } =>#t7;
+  final Never* aSetOrMap = invalid-expression "pkg/front_end/testcases/general/spread_collection.dart:21:21: Error: Not enough type information to disambiguate between literal set and literal map.
+Try providing type arguments for the literal explicitly to disambiguate it.
+  final aSetOrMap = {...foo()};
+                    ^";
+  core::print(aList);
+  core::print(aSet);
+  core::print(aMap);
+}
+static method foo() → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.modular.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..470fbda
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.weak.modular.expect
@@ -0,0 +1,376 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:64:28: Error: Not enough type information to disambiguate between literal set and literal map.
+// Try providing type arguments for the literal explicitly to disambiguate it.
+//   dynamic map21ambiguous = {...(mapSpread as dynamic)};
+//                            ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:96:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+//   dynamic map24ambiguous = {...spread, ...mapSpread};
+//                            ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:98:36: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+//  - 'List' is from 'dart:core'.
+//   int lhs30 = /*@ typeArgs=int* */ [...spread];
+//                                    ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:100:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+//  - 'Set' is from 'dart:core'.
+//   int set30 = /*@ typeArgs=int* */ {...spread, 42};
+//                                    ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+//  - 'Set' is from 'dart:core'.
+//       {...spread};
+//       ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+//  - 'Map' is from 'dart:core'.
+//       {...mapSpread, "baz": 42};
+//       ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+//  - 'Map' is from 'dart:core'.
+//       {...mapSpread};
+//       ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:111:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+//   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
+//                                      ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+//   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
+//                                     ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:115:55: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+//   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
+//                                                       ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:117:38: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+//   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
+//                                      ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+//   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
+//                                     ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:121:55: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+//   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
+//                                                       ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:123:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+//   List<String> lhs60 = <String>[...spread];
+//                                    ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+//   Set<String> set60 = <String>{...spread};
+//                                   ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:127:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+//   Map<int, int> map60 = <int, int>{...mapSpread};
+//                                       ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:129:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+//   Map<String, String> map61 = <String, String>{...mapSpread};
+//                                                   ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
+//   List<int> lhs70 = <int>[...null];
+//                              ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
+//   Set<int> set70 = <int>{...null};
+//                             ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
+//     ...null,
+//        ^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
+//   Map<String, int> map70 = <String, int>{...null};
+//                                             ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method bar<K extends core::Object* = dynamic, V extends core::Object* = dynamic>() → core::Map<self::bar::K*, self::bar::V*>*
+  return null;
+static method foo(dynamic dynVar) → dynamic {
+  core::List<core::int*>* spread = <core::int*>[1, 2, 3];
+  core::Map<core::String*, core::int*>* mapSpread = <core::String*, core::int*>{"foo": 4, "bar": 2};
+  core::int* notSpreadInt = 42;
+  () →* core::int* notSpreadFunction = null;
+  core::Map<core::int*, core::num*>* mapIntNum = <core::int*, core::num*>{42: 42};
+  core::List<core::num*>* listNum = <core::num*>[42];
+  core::List<dynamic>* lhs10 = block {
+    final core::List<dynamic>* #t1 = core::List::of<dynamic>(<dynamic>[]);
+  } =>#t1;
+  core::Set<dynamic>* set10 = block {
+    final core::Set<dynamic>* #t2 = col::LinkedHashSet::of<dynamic>(<dynamic>[]);
+  } =>#t2;
+  core::Map<dynamic, dynamic>* map10 = block {
+    final core::Map<dynamic, dynamic>* #t3 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t4 in <dynamic, dynamic>{}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+  } =>#t3;
+  core::Map<dynamic, dynamic>* map10ambiguous = block {
+    final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t6 in <dynamic, dynamic>{}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+  } =>#t5;
+  core::List<core::int*>* lhs20 = block {
+    final core::List<core::int*>* #t7 = core::List::of<core::int*>(spread);
+  } =>#t7;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t8 = col::LinkedHashSet::of<core::int*>(spread);
+    #t8.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+  } =>#t8;
+  core::Set<core::int*>* set20ambiguous = block {
+    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t10 in spread) {
+      final core::int* #t11 = #t10 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
+    }
+  } =>#t9;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t12 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t13 in mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+      #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{core::String*}, #t13.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t12.{core::Map::[]=}{Invariant}("baz", 42){(core::String*, core::int*) →* void};
+  } =>#t12;
+  core::Map<core::String*, core::int*>* map20ambiguous = block {
+    final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t15 in mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+      #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::String*}, #t15.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+  } =>#t14;
+  core::List<dynamic>* lhs21 = block {
+    final core::List<dynamic>* #t16 = core::List::of<dynamic>((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*);
+  } =>#t16;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t17 = col::LinkedHashSet::of<dynamic>((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*);
+    #t17.{core::Set::add}{Invariant}(42){(dynamic) →* core::bool*};
+  } =>#t17;
+  core::Map<dynamic, dynamic>* map21 = block {
+    final core::Map<dynamic, dynamic>* #t18 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t19 in ((mapSpread as dynamic) as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+    #t18.{core::Map::[]=}{Invariant}("baz", 42){(dynamic, dynamic) →* void};
+  } =>#t18;
+  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:64:28: Error: Not enough type information to disambiguate between literal set and literal map.
+Try providing type arguments for the literal explicitly to disambiguate it.
+  dynamic map21ambiguous = {...(mapSpread as dynamic)};
+                           ^";
+  core::List<core::int*>* lhs22 = block {
+    final core::List<core::int*>* #t20 = core::List::of<core::int*>(<core::int*>[]);
+  } =>#t20;
+  core::Set<core::int*>* set22 = block {
+    final core::Set<core::int*>* #t21 = col::LinkedHashSet::of<core::int*>(<core::int*>[]);
+    #t21.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+  } =>#t21;
+  core::Set<core::int*>* set22ambiguous = block {
+    final core::Set<core::int*>* #t22 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t23 in <core::int*>[]) {
+      final core::int* #t24 = #t23 as{TypeError} core::int*;
+      #t22.{core::Set::add}{Invariant}(#t24){(core::int*) →* core::bool*};
+    }
+  } =>#t22;
+  core::Map<core::String*, core::int*>* map22 = block {
+    final core::Map<core::String*, core::int*>* #t25 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t26 in <core::String*, core::int*>{}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+      #t25.{core::Map::[]=}{Invariant}(#t26.{core::MapEntry::key}{core::String*}, #t26.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+  } =>#t25;
+  core::List<core::List<core::int*>*>* lhs23 = block {
+    final core::List<core::List<core::int*>*>* #t27 = core::List::of<core::List<core::int*>*>(<core::List<core::int*>*>[<core::int*>[]]);
+  } =>#t27;
+  core::Set<core::List<core::int*>*>* set23 = block {
+    final core::Set<core::List<core::int*>*>* #t28 = col::LinkedHashSet::of<core::List<core::int*>*>(<core::List<core::int*>*>[<core::int*>[]]);
+    #t28.{core::Set::add}{Invariant}(<core::int*>[42]){(core::List<core::int*>*) →* core::bool*};
+  } =>#t28;
+  core::Set<core::List<core::int*>*>* set23ambiguous = block {
+    final core::Set<core::List<core::int*>*>* #t29 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (final dynamic #t30 in <core::List<core::int*>*>[<core::int*>[]]) {
+      final core::List<core::int*>* #t31 = #t30 as{TypeError} core::List<core::int*>*;
+      #t29.{core::Set::add}{Invariant}(#t31){(core::List<core::int*>*) →* core::bool*};
+    }
+  } =>#t29;
+  core::Map<core::String*, core::List<core::int*>*>* map23 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t32 = <core::String*, core::List<core::int*>*>{};
+    for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t33 in <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::List<core::int*>*>>})
+      #t32.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::String*}, #t33.{core::MapEntry::value}{core::List<core::int*>*}){(core::String*, core::List<core::int*>*) →* void};
+  } =>#t32;
+  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:96:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+  dynamic map24ambiguous = {...spread, ...mapSpread};
+                           ^";
+  core::int* lhs30 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:98:36: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+ - 'List' is from 'dart:core'.
+  int lhs30 = /*@ typeArgs=int* */ [...spread];
+                                   ^" in ( block {
+    final core::List<core::int*>* #t34 = core::List::of<core::int*>(spread);
+  } =>#t34) as{TypeError} core::int*;
+  core::int* set30 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:100:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+ - 'Set' is from 'dart:core'.
+  int set30 = /*@ typeArgs=int* */ {...spread, 42};
+                                   ^" in ( block {
+    final core::Set<core::int*>* #t35 = col::LinkedHashSet::of<core::int*>(spread);
+    #t35.{core::Set::add}{Invariant}(42){(core::int*) →* core::bool*};
+  } =>#t35) as{TypeError} core::int*;
+  core::int* set30ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
+ - 'Set' is from 'dart:core'.
+      {...spread};
+      ^" in ( block {
+    final core::Set<core::int*>* #t36 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t37 in spread) {
+      final core::int* #t38 = #t37 as{TypeError} core::int*;
+      #t36.{core::Set::add}{Invariant}(#t38){(core::int*) →* core::bool*};
+    }
+  } =>#t36) as{TypeError} core::int*;
+  core::int* map30 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+ - 'Map' is from 'dart:core'.
+      {...mapSpread, \"baz\": 42};
+      ^" in ( block {
+    final core::Map<core::String*, core::int*>* #t39 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t40 in mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+      #t39.{core::Map::[]=}{Invariant}(#t40.{core::MapEntry::key}{core::String*}, #t40.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+    #t39.{core::Map::[]=}{Invariant}("baz", 42){(core::String*, core::int*) →* void};
+  } =>#t39) as{TypeError} core::int*;
+  core::int* map30ambiguous = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
+ - 'Map' is from 'dart:core'.
+      {...mapSpread};
+      ^" in ( block {
+    final core::Map<core::String*, core::int*>* #t41 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t42 in mapSpread.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+      #t41.{core::Map::[]=}{Invariant}(#t42.{core::MapEntry::key}{core::String*}, #t42.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+  } =>#t41) as{TypeError} core::int*;
+  core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:111:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
+                                     ^"];
+  core::Set<dynamic>* set40 = block {
+    final core::Set<dynamic>* #t43 = col::LinkedHashSet::•<dynamic>();
+    #t43.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  Set<dynamic> set40 = <dynamic>{...notSpreadInt};
+                                    ^"){(dynamic) →* core::bool*};
+  } =>#t43;
+  core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:115:55: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
+  Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
+                                                      ^": null};
+  core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:117:38: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
+                                     ^"];
+  core::Set<dynamic>* set50 = block {
+    final core::Set<dynamic>* #t44 = col::LinkedHashSet::•<dynamic>();
+    #t44.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
+                                    ^"){(dynamic) →* core::bool*};
+  } =>#t44;
+  core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:121:55: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
+  Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
+                                                      ^": null};
+  core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:123:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  List<String> lhs60 = <String>[...spread];
+                                   ^"];
+  core::Set<core::String*>* set60 = block {
+    final core::Set<core::String*>* #t45 = col::LinkedHashSet::•<core::String*>();
+    #t45.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  Set<String> set60 = <String>{...spread};
+                                  ^"){(core::String*) →* core::bool*};
+  } =>#t45;
+  core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:127:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
+  Map<int, int> map60 = <int, int>{...mapSpread};
+                                      ^": null};
+  core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:129:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
+  Map<String, String> map61 = <String, String>{...mapSpread};
+                                                  ^"};
+  core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
+  List<int> lhs70 = <int>[...null];
+                             ^"];
+  core::Set<core::int*>* set70 = block {
+    final core::Set<core::int*>* #t46 = col::LinkedHashSet::•<core::int*>();
+    #t46.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
+  Set<int> set70 = <int>{...null};
+                            ^"){(core::int*) →* core::bool*};
+  } =>#t46;
+  core::Set<dynamic>* set71ambiguous = block {
+    final core::Set<dynamic>* #t47 = col::LinkedHashSet::•<dynamic>();
+    #t47.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
+    ...null,
+       ^"){(dynamic) →* core::bool*};
+    for (final dynamic #t48 in <dynamic>[]) {
+      final dynamic #t49 = #t48 as{TypeError} dynamic;
+      #t47.{core::Set::add}{Invariant}(#t49){(dynamic) →* core::bool*};
+    }
+  } =>#t47;
+  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
+  Map<String, int> map70 = <String, int>{...null};
+                                            ^": null};
+  core::List<core::int*>* lhs80 = block {
+    final core::List<core::int*>* #t50 = <core::int*>[];
+    final core::Iterable<core::int*>* #t51 = null;
+    if(!(#t51 == null))
+      #t50.{core::List::addAll}{Invariant}(#t51){(core::Iterable<core::int*>*) →* void};
+  } =>#t50;
+  core::Set<core::int*>* set80 = block {
+    final core::Set<core::int*>* #t52 = col::LinkedHashSet::•<core::int*>();
+    final core::Iterable<core::int*>* #t53 = null;
+    if(!(#t53 == null))
+      #t52.{core::Set::addAll}{Invariant}(#t53){(core::Iterable<core::int*>*) →* void};
+  } =>#t52;
+  core::Set<dynamic>* set81ambiguous = block {
+    final core::Set<dynamic>* #t54 = col::LinkedHashSet::•<dynamic>();
+    final core::Iterable<dynamic>* #t55 = null;
+    if(!(#t55 == null))
+      for (final dynamic #t56 in #t55) {
+        final dynamic #t57 = #t56 as{TypeError} dynamic;
+        #t54.{core::Set::add}{Invariant}(#t57){(dynamic) →* core::bool*};
+      }
+    for (final dynamic #t58 in <dynamic>[]) {
+      final dynamic #t59 = #t58 as{TypeError} dynamic;
+      #t54.{core::Set::add}{Invariant}(#t59){(dynamic) →* core::bool*};
+    }
+  } =>#t54;
+  core::Map<core::String*, core::int*>* map80 = block {
+    final core::Map<core::String*, core::int*>* #t60 = <core::String*, core::int*>{};
+    final core::Map<core::String*, core::int*>* #t61 = null;
+    if(!(#t61 == null))
+      for (final core::MapEntry<core::String*, core::int*>* #t62 in #t61.{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+        #t60.{core::Map::[]=}{Invariant}(#t62.{core::MapEntry::key}{core::String*}, #t62.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+  } =>#t60;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t63 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t64 in self::bar<core::String*, core::int*>().{core::Map::entries}{core::Iterable<core::MapEntry<core::String*, core::int*>>})
+      #t63.{core::Map::[]=}{Invariant}(#t64.{core::MapEntry::key}{core::String*}, #t64.{core::MapEntry::value}{core::int*}){(core::String*, core::int*) →* void};
+  } =>#t63;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t65 = <core::int*>[];
+    for (final dynamic #t66 in listNum) {
+      final core::int* #t67 = #t66 as{TypeError} core::int*;
+      #t65.{core::List::add}{Invariant}(#t67){(core::int*) →* void};
+    }
+  } =>#t65;
+  core::Map<core::num*, core::int*>* map100 = block {
+    final core::Map<core::num*, core::int*>* #t68 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t69 in mapIntNum.{core::Map::entries}{core::Iterable<core::MapEntry<core::num*, core::int*>>}) {
+      final core::num* #t70 = #t69.{core::MapEntry::key}{dynamic} as{TypeError} core::num*;
+      final core::int* #t71 = #t69.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
+      #t68.{core::Map::[]=}{Invariant}(#t70, #t71){(core::num*, core::int*) →* void};
+    }
+  } =>#t68;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t72 = <core::int*>[];
+    for (final dynamic #t73 in dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t74 = #t73 as{TypeError} core::int*;
+      #t72.{core::List::add}{Invariant}(#t74){(core::int*) →* void};
+    }
+  } =>#t72;
+  core::Map<core::num*, core::int*>* map110 = block {
+    final core::Map<core::num*, core::int*>* #t75 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t76 in (dynVar as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::num*, core::int*>>}) {
+      final core::num* #t77 = #t76.{core::MapEntry::key}{dynamic} as{TypeError} core::num*;
+      final core::int* #t78 = #t76.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
+      #t75.{core::Map::[]=}{Invariant}(#t77, #t78){(core::num*, core::int*) →* void};
+    }
+  } =>#t75;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/statements.dart.weak.modular.expect b/pkg/front_end/testcases/general/statements.dart.weak.modular.expect
new file mode 100644
index 0000000..8d3c256
--- /dev/null
+++ b/pkg/front_end/testcases/general/statements.dart.weak.modular.expect
@@ -0,0 +1,159 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method foo() → dynamic {
+  try {
+    return;
+  }
+  finally {
+    core::print("Hello from finally block!");
+  }
+}
+static method bar(dynamic d) → dynamic async* {
+  await for (dynamic x in d as{TypeError,ForDynamic} asy::Stream<dynamic>*) {
+    yield x;
+    yield* x as{TypeError,ForDynamic} asy::Stream<dynamic>*;
+  }
+}
+static method main() → dynamic {
+  do {
+    core::print("Hello from do-while!");
+  }
+  while (false)
+  do {
+    void x = core::print("Hello from do-while!");
+  }
+  while (false)
+  for (core::String* s in <core::String*>["Hello from for-in!"]) {
+    core::print(s);
+  }
+  for (core::String* s in <core::String*>["Hello from for-in without block!"])
+    core::print(s);
+  dynamic s;
+  for (final dynamic #t1 in <dynamic>["Hello from for-in without decl!"]) {
+    s = #t1;
+    core::print(s);
+  }
+  for (final dynamic #t2 in <dynamic>["Hello from for-in without decl and block!"]) {
+    s = #t2;
+    core::print(s);
+  }
+  core::print("Hello from labeled statement!");
+  try {
+    try {
+      throw "Hello from rethrow!";
+    }
+    on dynamic catch(final dynamic e) {
+      rethrow;
+    }
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+  }
+  self::foo();
+  core::bool* done = false;
+  while (!done) {
+    done = true;
+    core::print("Hello from while!");
+  }
+  ;
+  assert(true);
+  assert(true, "Hello from assert!");
+  try {
+    assert(false, "Hello from assert!");
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+  }
+  #L1:
+  switch(1) {
+    #L2:
+    case #C1:
+    case #C2:
+      {
+        core::print("Hello from switch case!");
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  #L4:
+  switch(4) {
+    #L5:
+    case #C2:
+      {
+        core::print("Hello from case 2!");
+        break #L4;
+      }
+    #L6:
+    case #C1:
+      {
+        core::print("Hello from case 1!");
+        continue #L5;
+      }
+    #L7:
+    case #C3:
+      {
+        core::print("Hello from case 0!");
+        continue #L6;
+      }
+    #L8:
+    case #C4:
+      {
+        core::print("Hello from case 4!");
+        continue #L9;
+      }
+    #L9:
+    default:
+      {
+        continue #L7;
+      }
+  }
+  #L10:
+  switch(4) {
+    #L11:
+    case #C1:
+      {
+        core::print("Hello from next case 1");
+        break #L10;
+      }
+    #L12:
+    default:
+      {
+        continue #L11;
+      }
+  }
+  core::int* i = 0;
+  #L13:
+  do
+    #L14:
+    {
+      core::print("Hello from do-while!");
+      if((i = i.{core::num::+}(1){(core::num*) →* core::int*}).{core::num::<}(3){(core::num*) →* core::bool*})
+        break #L14;
+      break #L13;
+    }
+  while (true)
+  i = 0;
+  #L15:
+  while (true)
+    #L16:
+    {
+      core::print("Hello from while!");
+      if((i = i.{core::num::+}(1){(core::num*) →* core::int*}).{core::num::<}(3){(core::num*) →* core::bool*})
+        break #L16;
+      break #L15;
+    }
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 0
+  #C4 = 4
+}
diff --git a/pkg/front_end/testcases/general/static_setter.dart.weak.modular.expect b/pkg/front_end/testcases/general/static_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..33c8de3
--- /dev/null
+++ b/pkg/front_end/testcases/general/static_setter.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static set foo(dynamic x) → void {}
+static method main() → dynamic {
+  self::foo = new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/general/store_load.dart.weak.modular.expect b/pkg/front_end/testcases/general/store_load.dart.weak.modular.expect
new file mode 100644
index 0000000..b5b20a2
--- /dev/null
+++ b/pkg/front_end/testcases/general/store_load.dart.weak.modular.expect
@@ -0,0 +1,76 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic _field = null;
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class FooValue extends core::Object {
+  synthetic constructor •() → self::FooValue*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object {
+  field dynamic _field = null;
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class BarValue extends core::Object {
+  synthetic constructor •() → self::BarValue*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  foo.{self::Foo::_field} = new self::FooValue::•();
+  dynamic fooValue = foo.{self::Foo::_field}{dynamic};
+  core::print(fooValue);
+  self::Bar* bar = new self::Bar::•();
+  bar.{self::Bar::_field} = new self::BarValue::•();
+  dynamic barValue = bar.{self::Bar::_field}{dynamic};
+  core::print(barValue);
+}
diff --git a/pkg/front_end/testcases/general/stream_future.dart.weak.modular.expect b/pkg/front_end/testcases/general/stream_future.dart.weak.modular.expect
new file mode 100644
index 0000000..2914b7b
--- /dev/null
+++ b/pkg/front_end/testcases/general/stream_future.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/stream_future.dart:18:9: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'FutureOr<Class>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'Class' is from 'pkg/front_end/testcases/general/stream_future.dart'.
+//   yield returnFutureDynamic();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method returnDynamic() → dynamic
+  return new self::Class::•();
+static method returnClass() → self::Class*
+  return new self::Class::•();
+static method returnFutureDynamic() → asy::Future<dynamic>* async 
+  return new self::Class::•();
+static method returnFutureClass() → asy::Future<self::Class*>* async 
+  return new self::Class::•();
+static method error() → asy::Stream<FutureOr<self::Class*>*>* async* {
+  yield invalid-expression "pkg/front_end/testcases/general/stream_future.dart:18:9: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'FutureOr<Class>'.
+ - 'Future' is from 'dart:async'.
+ - 'Class' is from 'pkg/front_end/testcases/general/stream_future.dart'.
+  yield returnFutureDynamic();
+        ^" in self::returnFutureDynamic() as{TypeError} FutureOr<self::Class*>*;
+}
+static method stream() → asy::Stream<FutureOr<self::Class*>*>* async* {
+  yield self::returnDynamic() as{TypeError,ForDynamic} FutureOr<self::Class*>*;
+  yield self::returnClass();
+  yield self::returnFutureClass();
+}
+static method main() → dynamic async {
+  await for (FutureOr<self::Class*>* cls in self::stream()) {
+    core::print(cls);
+  }
+}
diff --git a/pkg/front_end/testcases/general/stringliteral.dart.weak.modular.expect b/pkg/front_end/testcases/general/stringliteral.dart.weak.modular.expect
new file mode 100644
index 0000000..2d193f7
--- /dev/null
+++ b/pkg/front_end/testcases/general/stringliteral.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static field core::String color = "brown";
+static field core::String thing = "lazy dog";
+static field core::String phrase = "The quick ${self::color} fox
+jumped over the ${self::thing}.
+";
+static field core::String adjacent = "${self::color}${self::color}${self::color}";
+static field core::String linebreaks = "${self::color}
+${self::color}
+${self::color}";
+static field core::String other = "${self::color}
+ is 
+${self::color}";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_access_in_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_access_in_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..651a9c4
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_access_in_initializer.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Undefined name 'property'.
+//       : assert(property),
+//                ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Undefined name 'property'.
+//         this.field = property,
+//                      ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Undefined name 'property'.
+//         super(property);
+//               ^^^^^^^^
+//
+// pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Undefined name 'property'.
+//   Class.redirect() : this(property);
+//                           ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor •(core::bool* value) → self::Super*
+    : super core::Object::•()
+    ;
+  get property() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends self::Super {
+  field core::bool* field;
+  constructor •(core::bool* value) → self::Class*
+    : assert(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:15:16: Error: Undefined name 'property'.
+      : assert(property),
+               ^^^^^^^^"), self::Class::field = invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:16:22: Error: Undefined name 'property'.
+        this.field = property,
+                     ^^^^^^^^", super self::Super::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:17:15: Error: Undefined name 'property'.
+        super(property);
+              ^^^^^^^^")
+    ;
+  constructor redirect() → self::Class*
+    : this self::Class::•(invalid-expression "pkg/front_end/testcases/general/super_access_in_initializer.dart:19:27: Error: Undefined name 'property'.
+  Class.redirect() : this(property);
+                          ^^^^^^^^")
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_call.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_call.dart.weak.modular.expect
new file mode 100644
index 0000000..1e7e27c
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_call.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method call(core::int* x) → core::int*
+    return x.{core::num::*}(2){(core::num*) →* core::int*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method call(core::int* x) → core::int*
+    return x.{core::num::*}(3){(core::num*) →* core::int*};
+  method call_super() → core::int* {
+    return super.{self::A::call}(5);
+  }
+}
+static method main() → dynamic {
+  assert(new self::B::•().{self::B::call_super}(){() →* core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 10);
+}
diff --git a/pkg/front_end/testcases/general/super_nsm.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_nsm.dart.weak.modular.expect
new file mode 100644
index 0000000..671d437
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_nsm.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method interfaceMethod() → dynamic;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return "C";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method interfaceMethod() → dynamic
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} dynamic;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return "D";
+  method dMethod() → dynamic
+    return super.{self::C::interfaceMethod}();
+}
+static method main() → dynamic {
+  dynamic result = new self::D::•().{self::D::dMethod}(){() →* dynamic};
+  if(!(result =={core::Object::==}{(core::Object*) →* core::bool*} "D"))
+    throw "Expected 'D' but got: '${result}'";
+}
+
+constants  {
+  #C1 = #interfaceMethod
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/general/super_semi_stub.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_semi_stub.dart.weak.modular.expect
new file mode 100644
index 0000000..31c108e
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_semi_stub.dart.weak.modular.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_semi_stub.dart:17:37: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) sup1 = super.method; // ok
+//                                     ^
+//
+// pkg/front_end/testcases/general/super_semi_stub.dart:19:39: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+//     void Function(num) cls1 = Class().method; // error
+//                                       ^
+//
+// pkg/front_end/testcases/general/super_semi_stub.dart:34:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//   sub.method(0.5); // error
+//              ^
+//
+// pkg/front_end/testcases/general/super_semi_stub.dart:38:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//   cls.method(0.5); // error
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method(core::num a) → void {}
+  set setter(core::num a) → void {}
+}
+class Class extends self::Super {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method(covariant-by-declaration core::num a) → void
+    return super.{self::Super::method}(a);
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter(covariant-by-declaration core::num a) → void
+    return super.{self::Super::setter} = a;
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method method(covariant-by-declaration core::int a) → void {
+    (core::num) → void sup1 = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:17:37: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) sup1 = super.method; // ok
+                                    ^" in super.{self::Class::method} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    (core::int) → void sup2 = super.{self::Class::method};
+    (core::num) → void cls1 = invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:19:39: Error: A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(num)'.
+    void Function(num) cls1 = Class().method; // error
+                                      ^" in new self::Class::•().{self::Class::method}{(core::int) → void} as{TypeError,ForNonNullableByDefault} (core::num) → void;
+    (core::int) → void cls2 = new self::Class::•().{self::Class::method}{(core::int) → void};
+    (core::int) → void cls3 = new self::Class::•().{self::Class::method}{(core::int) → void};
+  }
+  set setter(covariant-by-declaration core::int a) → void {
+    super.{self::Class::setter} = 0;
+    super.{self::Class::setter} = 0.5;
+    new self::Class::•().{self::Class::setter} = 0;
+    new self::Class::•().{self::Class::setter} = 0.5;
+  }
+}
+static method test(self::Subclass sub) → dynamic {
+  sub.{self::Subclass::method}(0){(core::int) → void};
+  sub.{self::Subclass::method}(invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:34:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  sub.method(0.5); // error
+             ^" in 0.5 as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  self::Class cls = sub;
+  cls.{self::Class::method}(0){(core::int) → void};
+  cls.{self::Class::method}(invalid-expression "pkg/front_end/testcases/general/super_semi_stub.dart:38:14: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  cls.method(0.5); // error
+             ^" in 0.5 as{TypeError,ForNonNullableByDefault} core::int){(core::int) → void};
+  self::Super sup = sub;
+  sup.{self::Super::method}(0){(core::num) → void};
+  sup.{self::Super::method}(0.5){(core::num) → void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_set_abstract.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_set_abstract.dart.weak.modular.expect
new file mode 100644
index 0000000..096efc9
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_set_abstract.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_set_abstract.dart:15:24: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     super.setter = '$o';
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class SuperClass extends core::Object {
+  synthetic constructor •() → self::SuperClass*
+    : super core::Object::•()
+    ;
+  set setter(core::int* o) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Class extends self::SuperClass {
+  synthetic constructor •() → self::Class*
+    : super self::SuperClass::•()
+    ;
+  abstract set setter(core::Object* o) → void;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass*
+    : super self::Class::•()
+    ;
+  set setter(core::Object* o) → void {
+    super.{self::SuperClass::setter} = invalid-expression "pkg/front_end/testcases/general/super_set_abstract.dart:15:24: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    super.setter = '\$o';
+                       ^" in "${o}" as{TypeError} core::int*;
+  }
+}
+static method test() → dynamic {
+  new self::SubClass::•().{self::SubClass::setter} = "0";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/super_set_covariant.dart.weak.modular.expect b/pkg/front_end/testcases/general/super_set_covariant.dart.weak.modular.expect
new file mode 100644
index 0000000..fede2f5
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_set_covariant.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class SuperClass extends core::Object {
+  synthetic constructor •() → self::SuperClass*
+    : super core::Object::•()
+    ;
+  set setter(core::Object* o) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Class extends self::SuperClass {
+  synthetic constructor •() → self::Class*
+    : super self::SuperClass::•()
+    ;
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int*) →* void */ setter(covariant-by-declaration core::Object* o) → void
+    return super.{self::SuperClass::setter} = o;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass*
+    : super self::Class::•()
+    ;
+  set setter(covariant-by-declaration core::int* o) → void {
+    super.{self::Class::setter} = "${o}";
+  }
+}
+static method test() → dynamic {
+  new self::SubClass::•().{self::SubClass::setter} = 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/tabs.dart.weak.modular.expect b/pkg/front_end/testcases/general/tabs.dart.weak.modular.expect
new file mode 100644
index 0000000..c69fb6b
--- /dev/null
+++ b/pkg/front_end/testcases/general/tabs.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/tabs.dart:9:9: Error: Undefined name 'one'.
+//   print(one);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:10:9: Error: Undefined name 'two'.
+//   print(two);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:11:9: Error: Undefined name 'three'.
+//   print(three);
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:12:9: Error: Undefined name 'four'.
+//   print(four);
+//         ^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:13:9: Error: Undefined name 'five'.
+//   print(five);
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:9:9: Error: Undefined name 'one'.
+  print(one);
+        ^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:10:9: Error: Undefined name 'two'.
+  print(two);
+        ^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:11:9: Error: Undefined name 'three'.
+  print(three);
+        ^^^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:12:9: Error: Undefined name 'four'.
+  print(four);
+        ^^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:13:9: Error: Undefined name 'five'.
+  print(five);
+        ^^^^");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/this_field_call.dart.weak.modular.expect b/pkg/front_end/testcases/general/this_field_call.dart.weak.modular.expect
new file mode 100644
index 0000000..1156174
--- /dev/null
+++ b/pkg/front_end/testcases/general/this_field_call.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  field (self::A::T*) →* void f;
+  constructor •((self::A::T*) →* void f) → self::A<self::A::T*>*
+    : self::A::f = f, super core::Object::•()
+    ;
+  method foo(covariant-by-class self::A::T* x) → dynamic
+    return let final self::A::T* #t1 = x in this.{self::A::f}{(self::A::T*) →* void}(#t1){(self::A::T*) →* void};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3){(core::int*) →* dynamic};
+}
diff --git a/pkg/front_end/testcases/general/three_typedefs_loop.dart.weak.modular.expect b/pkg/front_end/testcases/general/three_typedefs_loop.dart.weak.modular.expect
new file mode 100644
index 0000000..bd2fff9
--- /dev/null
+++ b/pkg/front_end/testcases/general/three_typedefs_loop.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/three_typedefs_loop.dart:8:9: Error: The typedef 'Bar' has a reference to itself.
+// typedef Bar<T> = void Function(Baz<T>);
+//         ^^^
+//
+// pkg/front_end/testcases/general/three_typedefs_loop.dart:7:9: Error: The typedef 'Foo' has a reference to itself.
+// typedef Foo<T> = void Function(Bar<T>);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Foo<unrelated T extends core::Object* = dynamic> = invalid-type;
+typedef Bar<unrelated T extends core::Object* = dynamic> = ((invalid-type) →* void) →* void;
+typedef Baz<unrelated T extends core::Object* = dynamic> = (invalid-type) →* void;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/top_level_accessors.dart.weak.modular.expect b/pkg/front_end/testcases/general/top_level_accessors.dart.weak.modular.expect
new file mode 100644
index 0000000..9898bf6
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_accessors.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library top_level_accessors;
+import self as self;
+import "dart:core" as core;
+
+part top_level_accessors_part.dart;
+static set /* from org-dartlang-testcase:///top_level_accessors_part.dart */ exitCode(core::int* code) → void {
+  core::print(code);
+}
+static get /* from org-dartlang-testcase:///top_level_accessors_part.dart */ exitCode() → core::int*
+  return 0;
+static method /* from org-dartlang-testcase:///top_level_accessors_part.dart */ main() → dynamic {
+  self::exitCode = 42;
+  core::print(self::exitCode);
+}
diff --git a/pkg/front_end/testcases/general/top_level_library_method.dart.weak.modular.expect b/pkg/front_end/testcases/general/top_level_library_method.dart.weak.modular.expect
new file mode 100644
index 0000000..f23119a
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_library_method.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method library() → dynamic {
+  core::print("Hello, World!");
+}
+static method main() → dynamic
+  return self::library();
diff --git a/pkg/front_end/testcases/general/top_level_map_literal_error.dart.weak.modular.expect b/pkg/front_end/testcases/general/top_level_map_literal_error.dart.weak.modular.expect
new file mode 100644
index 0000000..d52f9e6
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_map_literal_error.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/top_level_map_literal_error.dart:7:9: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var c = {...a, ...b};
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static field core::Set<core::int> a = block {
+  final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
+  #t1.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
+} =>#t1;
+static field core::Map<core::int, core::int> b = <core::int, core::int>{0: 1};
+static field Never c = invalid-expression "pkg/front_end/testcases/general/top_level_map_literal_error.dart:7:9: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var c = {...a, ...b};
+        ^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.modular.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.modular.expect
new file mode 100644
index 0000000..c61d2e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.weak.modular.expect
@@ -0,0 +1,125 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant X extends core::Object* = dynamic> = <Y extends X* = dynamic>() →* void;
+typedef Fcov<X extends core::Object* = dynamic> = () →* X*;
+typedef Fcon<contravariant X extends core::Object* = dynamic> = (X*) →* dynamic;
+typedef Finv<invariant X extends core::Object* = dynamic> = (X*) →* X*;
+typedef FcovBound<X extends core::num*> = () →* X*;
+typedef FconBound<contravariant X extends core::num*> = (X*) →* dynamic;
+typedef FinvBound<invariant X extends core::num*> = (X*) →* X*;
+typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
+typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
+typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
+typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method toF<X extends core::Object* = dynamic>(self::toF::X* x) → <Y extends self::toF::X* = dynamic>() →* void
+  return null;
+static method testTopLevel() → void {
+  () →* dynamic source1;
+  <Y extends () →* dynamic = dynamic>() →* void fsource1 = self::toF<() →* dynamic>(source1);
+  <Y extends () →* dynamic = dynamic>() →* void target1 = fsource1;
+  (dynamic) →* dynamic source2;
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource2 = self::toF<(dynamic) →* dynamic>(source2);
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void target2 = fsource2;
+  (dynamic) →* dynamic source3;
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void fsource3 = self::toF<(dynamic) →* dynamic>(source3);
+  <Y extends (dynamic) →* dynamic = dynamic>() →* void target3 = fsource3;
+  () →* core::num* source4;
+  <Y extends () →* core::num* = dynamic>() →* void fsource4 = self::toF<() →* core::num*>(source4);
+  <Y extends () →* core::num* = dynamic>() →* void target4 = fsource4;
+  (core::num*) →* dynamic source5;
+  <Y extends (core::num*) →* dynamic = dynamic>() →* void fsource5 = self::toF<(core::num*) →* dynamic>(source5);
+  <Y extends (core::num*) →* dynamic = dynamic>() →* void target5 = fsource5;
+  (core::num*) →* core::num* source6;
+  <Y extends (core::num*) →* core::num* = dynamic>() →* void fsource6 = self::toF<(core::num*) →* core::num*>(source6);
+  <Y extends (core::num*) →* core::num* = dynamic>() →* void target6 = fsource6;
+  () →* self::A<dynamic>* source7;
+  <Y extends () →* self::A<dynamic>* = dynamic>() →* void fsource7 = self::toF<() →* self::A<dynamic>*>(source7);
+  <Y extends () →* self::A<dynamic>* = dynamic>() →* void target7 = fsource7;
+  (self::A<Null>*) →* dynamic source8;
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<Null>*) →* dynamic>(source8);
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void target8 = fsource8;
+  (self::A<dynamic>*) →* self::A<dynamic>* source9;
+  () →* (Null) →* dynamic source10;
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (Null) →* dynamic>(source10);
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void target10 = fsource10;
+  ((dynamic) →* dynamic) →* dynamic source11;
+  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void fsource11 = self::toF<((dynamic) →* dynamic) →* dynamic>(source11);
+  <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void target11 = fsource11;
+  ((dynamic) →* dynamic) →* (dynamic) →* dynamic source12;
+  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void fsource12 = self::toF<((dynamic) →* dynamic) →* (dynamic) →* dynamic>(source12);
+  <Y extends ((dynamic) →* dynamic) →* (dynamic) →* dynamic = dynamic>() →* void target12 = fsource12;
+}
+static method testNested() → void {
+  self::B<() →* dynamic>* source1;
+  <Y extends self::B<() →* dynamic>* = dynamic>() →* void fsource1 = self::toF<self::B<() →* dynamic>*>(source1);
+  <Y extends self::B<() →* dynamic>* = dynamic>() →* void target1 = fsource1;
+  self::B<(dynamic) →* dynamic>* source2;
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource2 = self::toF<self::B<(dynamic) →* dynamic>*>(source2);
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::B<(dynamic) →* dynamic>* source3;
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void fsource3 = self::toF<self::B<(dynamic) →* dynamic>*>(source3);
+  <Y extends self::B<(dynamic) →* dynamic>* = dynamic>() →* void target3 = fsource3;
+  self::B<() →* core::num*>* source4;
+  <Y extends self::B<() →* core::num*>* = dynamic>() →* void fsource4 = self::toF<self::B<() →* core::num*>*>(source4);
+  <Y extends self::B<() →* core::num*>* = dynamic>() →* void target4 = fsource4;
+  self::B<(core::num*) →* dynamic>* source5;
+  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void fsource5 = self::toF<self::B<(core::num*) →* dynamic>*>(source5);
+  <Y extends self::B<(core::num*) →* dynamic>* = dynamic>() →* void target5 = fsource5;
+  self::B<(core::num*) →* core::num*>* source6;
+  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void fsource6 = self::toF<self::B<(core::num*) →* core::num*>*>(source6);
+  <Y extends self::B<(core::num*) →* core::num*>* = dynamic>() →* void target6 = fsource6;
+  self::B<() →* self::A<dynamic>*>* source7;
+  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::B<() →* self::A<dynamic>*>*>(source7);
+  <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
+  self::B<(self::A<Null>*) →* dynamic>* source8;
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<Null>*) →* dynamic>*>(source8);
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
+  self::B<(self::A<dynamic>*) →* self::A<dynamic>*>* source9;
+  self::B<() →* (Null) →* dynamic>* source10;
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (Null) →* dynamic>*>(source10);
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::B<((dynamic) →* dynamic) →* dynamic>* source11;
+  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::B<((dynamic) →* dynamic) →* dynamic>*>(source11);
+  <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* source12;
+  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void fsource12 = self::toF<self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>*>(source12);
+  <Y extends self::B<((dynamic) →* dynamic) →* (dynamic) →* dynamic>* = dynamic>() →* void target12 = fsource12;
+}
+static method main() → dynamic {
+  self::testTopLevel();
+  self::testNested();
+}
diff --git a/pkg/front_end/testcases/general/type_literal_as_metadata.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_literal_as_metadata.dart.weak.modular.expect
new file mode 100644
index 0000000..6039ee4
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_literal_as_metadata.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_literal_as_metadata.dart:9:2: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+// @A
+//  ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+@invalid-expression "pkg/front_end/testcases/general/type_literal_as_metadata.dart:9:2: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+@A
+ ^"
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_of_null.dart.weak.modular.expect
new file mode 100644
index 0000000..4f0b860
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_of_null.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
+static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
+  return t;
+static method foo() → Null
+  return null;
+static method main() → dynamic {
+  self::map<Null>(() → Null {}, () → Null => throw "hello");
+  self::map<Null>(() → Null => throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → Null => throw "hello");
+  self::map<Null>(() → Null => throw "hello", #C1);
+  self::map<Null>(() → Null {
+    return null;
+  }, () → Null => throw "hello");
+  self::map<Null>(() → Null => throw "hello", () → Null {
+    return null;
+  });
+  self::id<() →* Null>(() → Null {});
+}
+
+constants  {
+  #C1 = static-tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.weak.modular.expect
new file mode 100644
index 0000000..ea169b3
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameter_type_named_int.dart:13:12: Error: A value of type 'List<int/*1*/>' can't be assigned to a variable of type 'List<int/*2*/>'.
+//  - 'List' is from 'dart:core'.
+//  - 'int/*1*/' is from 'pkg/front_end/testcases/general/type_parameter_type_named_int.dart'.
+//  - 'int/*2*/' is from 'dart:core'.
+//     list = value;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Foo<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+  abstract get list() → core::List<self::Foo::T*>*;
+  abstract method setList<T extends core::Object* = dynamic>(core::List<self::Foo::setList::T*>* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object implements self::Foo<core::int*> {
+  field core::List<core::int*>* list = null;
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  method setList<int extends core::Object* = dynamic>(core::List<self::Bar::setList::int*>* value) → void {
+    this.{self::Bar::list} = invalid-expression "pkg/front_end/testcases/general/type_parameter_type_named_int.dart:13:12: Error: A value of type 'List<int/*1*/>' can't be assigned to a variable of type 'List<int/*2*/>'.
+ - 'List' is from 'dart:core'.
+ - 'int/*1*/' is from 'pkg/front_end/testcases/general/type_parameter_type_named_int.dart'.
+ - 'int/*2*/' is from 'dart:core'.
+    list = value;
+           ^" in value as{TypeError} core::List<core::int*>*;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.modular.expect
new file mode 100644
index 0000000..cb0d959
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart.weak.modular.expect
@@ -0,0 +1,206 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:6:10: Error: Type variables can't be used in static members.
+//   static U foo1() { return null; }
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:7:15: Error: Type variables can't be used in static members.
+//   static List<U> foo1Prime() { return null; }
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:8:20: Error: Type variables can't be used in static members.
+//   static void foo2(U x) { return null; }
+//                    ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:9:30: Error: Type variables can't be used in static members.
+//   static void foo2Prime(List<U> x) { return null; }
+//                              ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:20:10: Error: Type variables can't be used in static members.
+//   static U Function() foo8() { return null; }
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:21:15: Error: Type variables can't be used in static members.
+//   static List<U> Function() foo8Prime() { return null; }
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:22:24: Error: Type variables can't be used in static members.
+//   static void Function(U) foo9() { return null; }
+//                        ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:23:29: Error: Type variables can't be used in static members.
+//   static void Function(List<U>) foo9Prime() { return null; }
+//                             ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:24:21: Error: Type variables can't be used in static members.
+//   static void foo10(U Function()) { return null; }
+//                     ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:25:31: Error: Type variables can't be used in static members.
+//   static void foo10Prime(List<U> Function()) { return null; }
+//                               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:28:35: Error: Type variables can't be used in static members.
+//   static void foo12(void Function(U) b) { return null; }
+//                                   ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:29:45: Error: Type variables can't be used in static members.
+//   static void foo12Prime(void Function(List<U>) b) { return null; }
+//                                             ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:31:35: Error: Type variables can't be used in static members.
+//   static void foo13(void Function(U b)) { return null; }
+//                                   ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:33:45: Error: Type variables can't be used in static members.
+//   static void foo13Prime(void Function(List<U> b)) { return null; }
+//                                             ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:34:10: Error: Type variables can't be used in static members.
+//   static U foo14 = null;
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:35:15: Error: Type variables can't be used in static members.
+//   static List<U> foo14Prime = null;
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:36:10: Error: Type variables can't be used in static members.
+//   static U Function(U) foo15 = null;
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:36:21: Error: Type variables can't be used in static members.
+//   static U Function(U) foo15 = null;
+//                     ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:37:15: Error: Type variables can't be used in static members.
+//   static List<U> Function(List<U>) foo15Prime = null;
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:37:32: Error: Type variables can't be used in static members.
+//   static List<U> Function(List<U>) foo15Prime = null;
+//                                ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:11:5: Error: Type variables can't be used in static members.
+//     U foo4;
+//     ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:12:10: Error: Type variables can't be used in static members.
+//     List<U> foo4Prime;
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:13:15: Error: Type variables can't be used in static members.
+//     void foo5(U y) => print(y);
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:14:25: Error: Type variables can't be used in static members.
+//     void foo5Prime(List<U> y) => print(y);
+//                         ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:15:5: Error: Type variables can't be used in static members.
+//     U foo6() => null;
+//     ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:16:10: Error: Type variables can't be used in static members.
+//     List<U> foo6Prime() => null;
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:17:20: Error: Type variables can't be used in static members.
+//     void Function (U y) foo7 = (U y) => y;
+//                    ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:17:33: Error: Type variables can't be used in static members.
+//     void Function (U y) foo7 = (U y) => y;
+//                                 ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:18:25: Error: Type variables can't be used in static members.
+//     void Function (List<U> y) foo7Prime = (List<U> y) => y;
+//                         ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_class.dart:18:49: Error: Type variables can't be used in static members.
+//     void Function (List<U> y) foo7Prime = (List<U> y) => y;
+//                                                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo<U extends core::Object* = dynamic> extends core::Object {
+  static field invalid-type foo14 = null;
+  static field core::List<invalid-type>* foo14Prime = null;
+  static field (invalid-type) →* invalid-type foo15 = null;
+  static field (core::List<invalid-type>*) →* core::List<invalid-type>* foo15Prime = null;
+  synthetic constructor •() → self::Foo<self::Foo::U*>*
+    : super core::Object::•()
+    ;
+  static method foo1() → invalid-type {
+    return null;
+  }
+  static method foo1Prime() → core::List<invalid-type>* {
+    return null;
+  }
+  static method foo2(invalid-type x) → void {
+    return null;
+  }
+  static method foo2Prime(core::List<invalid-type>* x) → void {
+    return null;
+  }
+  static method foo3() → void {
+    invalid-type foo4;
+    core::List<invalid-type>* foo4Prime;
+    function foo5(invalid-type y) → void
+      return core::print(y);
+    function foo5Prime(core::List<invalid-type>* y) → void
+      return core::print(y);
+    function foo6() → invalid-type
+      return null;
+    function foo6Prime() → core::List<invalid-type>*
+      return null;
+    (invalid-type) →* void foo7 = (invalid-type y) → invalid-type => y;
+    (core::List<invalid-type>*) →* void foo7Prime = (core::List<invalid-type>* y) → core::List<invalid-type>* => y;
+  }
+  static method foo8() → () →* invalid-type {
+    return null;
+  }
+  static method foo8Prime() → () →* core::List<invalid-type>* {
+    return null;
+  }
+  static method foo9() → (invalid-type) →* void {
+    return null;
+  }
+  static method foo9Prime() → (core::List<invalid-type>*) →* void {
+    return null;
+  }
+  static method foo10(() →* invalid-type Function) → void {
+    return null;
+  }
+  static method foo10Prime(() →* core::List<invalid-type>* Function) → void {
+    return null;
+  }
+  static method foo11((dynamic) →* void Function) → void {
+    return null;
+  }
+  static method foo12((invalid-type) →* void b) → void {
+    return null;
+  }
+  static method foo12Prime((core::List<invalid-type>*) →* void b) → void {
+    return null;
+  }
+  static method foo13((invalid-type) →* void Function) → void {
+    return null;
+  }
+  static method foo13Prime((core::List<invalid-type>*) →* void Function) → void {
+    return null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..d4e95b2
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart.weak.modular.expect
@@ -0,0 +1,213 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:6:10: Error: Type variables can't be used in static members.
+//   static U foo1() { return null; }
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:7:15: Error: Type variables can't be used in static members.
+//   static List<U> foo1Prime() { return null; }
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:8:20: Error: Type variables can't be used in static members.
+//   static void foo2(U x) { return null; }
+//                    ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:9:30: Error: Type variables can't be used in static members.
+//   static void foo2Prime(List<U> x) { return null; }
+//                              ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:20:10: Error: Type variables can't be used in static members.
+//   static U Function() foo8() { return null; }
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:21:15: Error: Type variables can't be used in static members.
+//   static List<U> Function() foo8Prime() { return null; }
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:22:24: Error: Type variables can't be used in static members.
+//   static void Function(U) foo9() { return null; }
+//                        ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:23:29: Error: Type variables can't be used in static members.
+//   static void Function(List<U>) foo9Prime() { return null; }
+//                             ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:24:21: Error: Type variables can't be used in static members.
+//   static void foo10(U Function()) { return null; }
+//                     ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:25:31: Error: Type variables can't be used in static members.
+//   static void foo10Prime(List<U> Function()) { return null; }
+//                               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:28:35: Error: Type variables can't be used in static members.
+//   static void foo12(void Function(U) b) { return null; }
+//                                   ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:29:45: Error: Type variables can't be used in static members.
+//   static void foo12Prime(void Function(List<U>) b) { return null; }
+//                                             ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:31:35: Error: Type variables can't be used in static members.
+//   static void foo13(void Function(U b)) { return null; }
+//                                   ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:33:45: Error: Type variables can't be used in static members.
+//   static void foo13Prime(void Function(List<U> b)) { return null; }
+//                                             ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:34:10: Error: Type variables can't be used in static members.
+//   static U foo14 = null;
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:35:15: Error: Type variables can't be used in static members.
+//   static List<U> foo14Prime = null;
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:36:10: Error: Type variables can't be used in static members.
+//   static U Function(U) foo15 = null;
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:36:21: Error: Type variables can't be used in static members.
+//   static U Function(U) foo15 = null;
+//                     ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:37:15: Error: Type variables can't be used in static members.
+//   static List<U> Function(List<U>) foo15Prime = null;
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:37:32: Error: Type variables can't be used in static members.
+//   static List<U> Function(List<U>) foo15Prime = null;
+//                                ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:11:5: Error: Type variables can't be used in static members.
+//     U foo4;
+//     ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:12:10: Error: Type variables can't be used in static members.
+//     List<U> foo4Prime;
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:13:15: Error: Type variables can't be used in static members.
+//     void foo5(U y) => print(y);
+//               ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:14:25: Error: Type variables can't be used in static members.
+//     void foo5Prime(List<U> y) => print(y);
+//                         ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:15:5: Error: Type variables can't be used in static members.
+//     U foo6() => null;
+//     ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:16:10: Error: Type variables can't be used in static members.
+//     List<U> foo6Prime() => null;
+//          ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:17:20: Error: Type variables can't be used in static members.
+//     void Function (U y) foo7 = (U y) => y;
+//                    ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:17:33: Error: Type variables can't be used in static members.
+//     void Function (U y) foo7 = (U y) => y;
+//                                 ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:18:25: Error: Type variables can't be used in static members.
+//     void Function (List<U> y) foo7Prime = (List<U> y) => y;
+//                         ^
+//
+// pkg/front_end/testcases/general/type_parameter_usage_in_static_method_in_extension.dart:18:49: Error: Type variables can't be used in static members.
+//     void Function (List<U> y) foo7Prime = (List<U> y) => y;
+//                                                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Foo<U extends core::Object* = dynamic> on core::List<dynamic>* {
+  static method foo1 = self::Foo|foo1;
+  static method foo1Prime = self::Foo|foo1Prime;
+  static method foo2 = self::Foo|foo2;
+  static method foo2Prime = self::Foo|foo2Prime;
+  static method foo3 = self::Foo|foo3;
+  static method foo8 = self::Foo|foo8;
+  static method foo8Prime = self::Foo|foo8Prime;
+  static method foo9 = self::Foo|foo9;
+  static method foo9Prime = self::Foo|foo9Prime;
+  static method foo10 = self::Foo|foo10;
+  static method foo10Prime = self::Foo|foo10Prime;
+  static method foo11 = self::Foo|foo11;
+  static method foo12 = self::Foo|foo12;
+  static method foo12Prime = self::Foo|foo12Prime;
+  static method foo13 = self::Foo|foo13;
+  static method foo13Prime = self::Foo|foo13Prime;
+  static field foo14 = self::Foo|foo14;
+  static field foo14Prime = self::Foo|foo14Prime;
+  static field foo15 = self::Foo|foo15;
+  static field foo15Prime = self::Foo|foo15Prime;
+}
+static field invalid-type Foo|foo14 = null;
+static field core::List<invalid-type>* Foo|foo14Prime = null;
+static field (invalid-type) →* invalid-type Foo|foo15 = null;
+static field (core::List<invalid-type>*) →* core::List<invalid-type>* Foo|foo15Prime = null;
+static method Foo|foo1() → invalid-type {
+  return null;
+}
+static method Foo|foo1Prime() → core::List<invalid-type>* {
+  return null;
+}
+static method Foo|foo2(invalid-type x) → void {
+  return null;
+}
+static method Foo|foo2Prime(core::List<invalid-type>* x) → void {
+  return null;
+}
+static method Foo|foo3() → void {
+  invalid-type foo4;
+  core::List<invalid-type>* foo4Prime;
+  function foo5(invalid-type y) → void
+    return core::print(y);
+  function foo5Prime(core::List<invalid-type>* y) → void
+    return core::print(y);
+  function foo6() → invalid-type
+    return null;
+  function foo6Prime() → core::List<invalid-type>*
+    return null;
+  (invalid-type) →* void foo7 = (invalid-type y) → invalid-type => y;
+  (core::List<invalid-type>*) →* void foo7Prime = (core::List<invalid-type>* y) → core::List<invalid-type>* => y;
+}
+static method Foo|foo8() → () →* invalid-type {
+  return null;
+}
+static method Foo|foo8Prime() → () →* core::List<invalid-type>* {
+  return null;
+}
+static method Foo|foo9() → (invalid-type) →* void {
+  return null;
+}
+static method Foo|foo9Prime() → (core::List<invalid-type>*) →* void {
+  return null;
+}
+static method Foo|foo10(() →* invalid-type Function) → void {
+  return null;
+}
+static method Foo|foo10Prime(() →* core::List<invalid-type>* Function) → void {
+  return null;
+}
+static method Foo|foo11((dynamic) →* void Function) → void {
+  return null;
+}
+static method Foo|foo12((invalid-type) →* void b) → void {
+  return null;
+}
+static method Foo|foo12Prime((core::List<invalid-type>*) →* void b) → void {
+  return null;
+}
+static method Foo|foo13((invalid-type) →* void Function) → void {
+  return null;
+}
+static method Foo|foo13Prime((core::List<invalid-type>*) →* void Function) → void {
+  return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.weak.modular.expect
new file mode 100644
index 0000000..bdb4a9f
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_dynamic.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameters_on_dynamic.dart:2:1: Error: Expected 0 type arguments.
+// dynamic<int> f() {}
+// ^
+//
+import self as self;
+
+static method f() → invalid-type {}
+static method main() → dynamic {
+  self::f();
+}
diff --git a/pkg/front_end/testcases/general/type_parameters_on_void.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_parameters_on_void.dart.weak.modular.expect
new file mode 100644
index 0000000..6e6a65f
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameters_on_void.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_parameters_on_void.dart:1:5: Error: Type 'void' can't have type arguments.
+// Try removing the type arguments.
+// void<int> f() {}
+//     ^
+//
+import self as self;
+
+static method f() → void {}
+static method main() → dynamic {
+  self::f();
+}
diff --git a/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.modular.expect
new file mode 100644
index 0000000..21c0f72
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_annotations.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class Class<@#C1 T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  method method<@#C1 T extends core::Object? = dynamic>() → void {
+    function local<@#C1 T extends core::Object? = dynamic>() → void {}
+  }
+}
+extension Extension<@#C1 T extends core::Object? = dynamic> on T% {
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+}
+static method method<@#C1 T extends core::Object? = dynamic>() → void {}
+static method Extension|method<#T extends core::Object? = dynamic, @#C1 T extends core::Object? = dynamic>(lowered final self::Extension|method::#T% #this) → void {}
+static method Extension|get#method<#T extends core::Object? = dynamic>(lowered final self::Extension|get#method::#T% #this) → <T extends core::Object? = dynamic>() → void
+  return <T extends core::Object? = dynamic>() → void => self::Extension|method<self::Extension|get#method::#T%, T%>(#this);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///type_variable_annotations.dart:
+- A. (from org-dartlang-testcase:///type_variable_annotations.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/type_variable_as_super.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_variable_as_super.dart.weak.modular.expect
new file mode 100644
index 0000000..aac4117
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_as_super.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_as_super.dart:5:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class A<T> extends T {}
+//                ^
+//
+// pkg/front_end/testcases/general/type_variable_as_super.dart:7:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class B<T> extends T {
+//                ^
+//
+// pkg/front_end/testcases/general/type_variable_as_super.dart:11:7: Error: The type variable 'T' can't be used as supertype.
+// class C<T> extends T {}
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_as_super.dart:14:7: Error: The class 'A' is abstract and can't be instantiated.
+//   new A();
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_as_super.dart:15:7: Error: The class 'B' is abstract and can't be instantiated.
+//   new B();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  throw new core::AbstractClassInstantiationError::•("A");
+  throw new core::AbstractClassInstantiationError::•("B");
+  new self::C::•<dynamic>();
+}
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.modular.expect
new file mode 100644
index 0000000..c281ff0
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_bound_access.dart:22:36: Error: The getter 'length' isn't defined for the class 'num'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+//   num method2() => field1 + field2.length;
+//                                    ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class DynamicClass<T extends dynamic, S extends self::DynamicClass::T* = dynamic> extends core::Object {
+  covariant-by-class field self::DynamicClass::T* field1;
+  covariant-by-class field self::DynamicClass::T* field2;
+  constructor •(self::DynamicClass::T* field1, self::DynamicClass::T* field2) → self::DynamicClass<self::DynamicClass::T*, self::DynamicClass::S*>*
+    : self::DynamicClass::field1 = field1, self::DynamicClass::field2 = field2, super core::Object::•()
+    ;
+  method method() → dynamic
+    return this.{self::DynamicClass::field1}{self::DynamicClass::T*}{dynamic}.*(this.{self::DynamicClass::field2}{self::DynamicClass::T*});
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NumClass<T extends core::num*, S extends self::NumClass::T* = core::num*> extends core::Object {
+  covariant-by-class field self::NumClass::T* field1;
+  covariant-by-class field self::NumClass::S* field2;
+  constructor •(self::NumClass::T* field1, self::NumClass::S* field2) → self::NumClass<self::NumClass::T*, self::NumClass::S*>*
+    : self::NumClass::field1 = field1, self::NumClass::field2 = field2, super core::Object::•()
+    ;
+  method method1() → core::num*
+    return this.{self::NumClass::field1}{self::NumClass::T*}.{core::num::*}(this.{self::NumClass::field2}{self::NumClass::S*}){(core::num*) →* core::num*};
+  method method2() → core::num*
+    return this.{self::NumClass::field1}{self::NumClass::T*}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/type_variable_bound_access.dart:22:36: Error: The getter 'length' isn't defined for the class 'num'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
+  num method2() => field1 + field2.length;
+                                   ^^^^^^" in this.{self::NumClass::field2}{self::NumClass::S*}{<unresolved>}.length as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int*> extends core::Object {
+  covariant-by-class field self::Class::X0* field0 = null;
+  covariant-by-class field self::Class::X1* field1 = null;
+  covariant-by-class field self::Class::X2* field2 = null;
+  covariant-by-class field self::Class::X3* field3 = null;
+  covariant-by-class field self::Class::X4* field4 = null;
+  covariant-by-class field self::Class::X5* field5 = null;
+  synthetic constructor •() → self::Class<self::Class::X5*, self::Class::X4*, self::Class::X3*, self::Class::X2*, self::Class::X1*, self::Class::X0*>*
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    this.{self::Class::field0}{self::Class::X0*}.{core::int::isEven}{core::bool*};
+    this.{self::Class::field1}{self::Class::X1*}.{core::int::isEven}{core::bool*};
+    this.{self::Class::field2}{self::Class::X2*}.{core::int::isEven}{core::bool*};
+    this.{self::Class::field3}{self::Class::X3*}.{core::int::isEven}{core::bool*};
+    this.{self::Class::field4}{self::Class::X4*}.{core::int::isEven}{core::bool*};
+    this.{self::Class::field5}{self::Class::X5*}.{core::int::isEven}{core::bool*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::DynamicClass::•<core::num*, core::int*>(0.5, 2).{self::DynamicClass::method}(){() →* dynamic};
+  new self::NumClass::•<core::num*, core::double*>(2, 0.5).{self::NumClass::method1}(){() →* core::num*};
+}
diff --git a/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.modular.expect
new file mode 100644
index 0000000..31bd8fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_in_static_context.dart.weak.modular.expect
@@ -0,0 +1,630 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:105:3: Error: Extensions can't declare constructors.
+// Try removing the constructor declaration.
+//   Extension(T t);
+//   ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:107:3: Error: Extensions can't declare constructors.
+// Try removing the constructor declaration.
+//   factory Extension.fact(T t) => null;
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:113:5: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   T field1;
+//     ^^^^^^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:130:3: Error: Mixins can't declare constructors.
+//   Mixin(T t);
+//   ^^^^^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:132:3: Error: Mixins can't declare constructors.
+//   factory Mixin.fact(T t) => null;
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:107:11: Error: Expected 0 type arguments.
+//   factory Extension.fact(T t) => null;
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:13:31: Error: Type variables can't be used in static members.
+//   static T? method0<S extends T>(T arg) {
+//                               ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:20:44: Error: Type variables can't be used in static members.
+//   static Class<T>? method1<S extends Class<T>>(Class<T> arg) {
+//                                            ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:29:57: Error: Type variables can't be used in static members.
+//   static Class<Class<T>>? method2<S extends Class<Class<T>>>(Class<Class<T>> arg) {
+//                                                         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:38:36: Error: Type variables can't be used in static members.
+//   static A<T>? method3<S extends A<T>>(A<T> arg) {
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:47:41: Error: Type variables can't be used in static members.
+//   static A<A<T>>? method4<S extends A<A<T>>>(A<A<T>> arg) {
+//                                         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:56:36: Error: Type variables can't be used in static members.
+//   static B<T>? method5<S extends B<T>>(B<T> arg) {
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:65:41: Error: Type variables can't be used in static members.
+//   static A<B<T>>? method6<S extends A<B<T>>>(A<B<T>> arg) {
+//                                         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:73:34: Error: Type variables can't be used in static members.
+//   @Class<void Function<S extends T>()>()
+//                                  ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:74:34: Error: Type variables can't be used in static members.
+//   static void Function<S extends T>()? method7<U extends void Function<S extends T>()>(void Function<S extends T>() arg) {
+//                                  ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:74:82: Error: Type variables can't be used in static members.
+//   static void Function<S extends T>()? method7<U extends void Function<S extends T>()>(void Function<S extends T>() arg) {
+//                                                                                  ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:74:112: Error: Type variables can't be used in static members.
+//   static void Function<S extends T>()? method7<U extends void Function<S extends T>()>(void Function<S extends T>() arg) {
+//                                                                                                                ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:116:36: Error: Type variables can't be used in static members.
+//   static T? staticMethod<S extends T>(T arg) {
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:138:36: Error: Type variables can't be used in static members.
+//   static T? staticMethod<S extends T>(T arg) {
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:13:34: Error: Type variables can't be used in static members.
+//   static T? method0<S extends T>(T arg) {
+//                                  ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:13:10: Error: Type variables can't be used in static members.
+//   static T? method0<S extends T>(T arg) {
+//          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:20:54: Error: Type variables can't be used in static members.
+//   static Class<T>? method1<S extends Class<T>>(Class<T> arg) {
+//                                                      ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:20:16: Error: Type variables can't be used in static members.
+//   static Class<T>? method1<S extends Class<T>>(Class<T> arg) {
+//                ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:29:74: Error: Type variables can't be used in static members.
+//   static Class<Class<T>>? method2<S extends Class<Class<T>>>(Class<Class<T>> arg) {
+//                                                                          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:29:22: Error: Type variables can't be used in static members.
+//   static Class<Class<T>>? method2<S extends Class<Class<T>>>(Class<Class<T>> arg) {
+//                      ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:38:42: Error: Type variables can't be used in static members.
+//   static A<T>? method3<S extends A<T>>(A<T> arg) {
+//                                          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:38:12: Error: Type variables can't be used in static members.
+//   static A<T>? method3<S extends A<T>>(A<T> arg) {
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:47:50: Error: Type variables can't be used in static members.
+//   static A<A<T>>? method4<S extends A<A<T>>>(A<A<T>> arg) {
+//                                                  ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:47:14: Error: Type variables can't be used in static members.
+//   static A<A<T>>? method4<S extends A<A<T>>>(A<A<T>> arg) {
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:56:42: Error: Type variables can't be used in static members.
+//   static B<T>? method5<S extends B<T>>(B<T> arg) {
+//                                          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:56:12: Error: Type variables can't be used in static members.
+//   static B<T>? method5<S extends B<T>>(B<T> arg) {
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:65:50: Error: Type variables can't be used in static members.
+//   static A<B<T>>? method6<S extends A<B<T>>>(A<B<T>> arg) {
+//                                                  ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:65:14: Error: Type variables can't be used in static members.
+//   static A<B<T>>? method6<S extends A<B<T>>>(A<B<T>> arg) {
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:80:10: Error: Type variables can't be used in static members.
+//   static T field0;
+//          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:83:16: Error: Type variables can't be used in static members.
+//   static Class<T>? field1;
+//                ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:110:10: Error: Type variables can't be used in static members.
+//   static T field0;
+//          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:116:39: Error: Type variables can't be used in static members.
+//   static T? staticMethod<S extends T>(T arg) {
+//                                       ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:116:10: Error: Type variables can't be used in static members.
+//   static T? staticMethod<S extends T>(T arg) {
+//          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:135:10: Error: Type variables can't be used in static members.
+//   static T field0;
+//          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:138:39: Error: Type variables can't be used in static members.
+//   static T? staticMethod<S extends T>(T arg) {
+//                                       ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:138:10: Error: Type variables can't be used in static members.
+//   static T? staticMethod<S extends T>(T arg) {
+//          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:92:24: Error: Type variables can't be used in static members.
+//   static var field4 = (T t) => T;
+//                        ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:92:32: Error: Type variables can't be used in static members.
+//   static var field4 = (T t) => T;
+//                                ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:12:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:19:10: Error: Type variables can't be used in static members.
+//   @Class<T>()
+//          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:28:16: Error: Type variables can't be used in static members.
+//   @Class<Class<T>>()
+//                ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:37:6: Error: Type variables can't be used in static members.
+//   @A<T>()
+//      ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:46:8: Error: Type variables can't be used in static members.
+//   @A<A<T>>()
+//        ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:55:6: Error: Type variables can't be used in static members.
+//   @B<T>()
+//      ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:64:8: Error: Type variables can't be used in static members.
+//   @A<B<T>>()
+//        ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:79:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:82:10: Error: Type variables can't be used in static members.
+//   @Class<T>()
+//          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:85:16: Error: Type variables can't be used in static members.
+//   @Class<Class<T>>()
+//                ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:88:6: Error: Type variables can't be used in static members.
+//   @A<T>()
+//      ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:91:6: Error: Type variables can't be used in static members.
+//   @B<T>()
+//      ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:94:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:97:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:109:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:112:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:115:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:122:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:134:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:137:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:144:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:147:4: Error: Couldn't find constructor 'T'.
+//   @T()
+//    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:14:5: Error: Type variables can't be used in static members.
+//     T? local;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:15:5: Error: Type variables can't be used in static members.
+//     T;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:16:24: Error: Type variables can't be used in static members.
+//     void fun<U extends T>() {}
+//                        ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:21:11: Error: Type variables can't be used in static members.
+//     Class<T>? local;
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:22:15: Error: Type variables can't be used in static members.
+//     new Class<T>();
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:23:11: Error: Type variables can't be used in static members.
+//     Class<T>;
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:24:11: Error: Type variables can't be used in static members.
+//     Class<T>.new;
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:25:30: Error: Type variables can't be used in static members.
+//     void fun<U extends Class<T>>() {}
+//                              ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:30:17: Error: Type variables can't be used in static members.
+//     Class<Class<T>>? local;
+//                 ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:31:21: Error: Type variables can't be used in static members.
+//     new Class<Class<T>>();
+//                     ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:32:17: Error: Type variables can't be used in static members.
+//     Class<Class<T>>;
+//                 ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:33:17: Error: Type variables can't be used in static members.
+//     Class<Class<T>>.new;
+//                 ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:34:36: Error: Type variables can't be used in static members.
+//     void fun<U extends Class<Class<T>>>() {}
+//                                    ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:39:7: Error: Type variables can't be used in static members.
+//     A<T>? local;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:40:11: Error: Type variables can't be used in static members.
+//     new A<T>();
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:41:7: Error: Type variables can't be used in static members.
+//     A<T>;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:42:7: Error: Type variables can't be used in static members.
+//     A<T>.new;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:43:26: Error: Type variables can't be used in static members.
+//     void fun<U extends A<T>>() {}
+//                          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:48:9: Error: Type variables can't be used in static members.
+//     A<A<T>>? local;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:49:13: Error: Type variables can't be used in static members.
+//     new A<A<T>>();
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:50:9: Error: Type variables can't be used in static members.
+//     A<A<T>>;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:51:9: Error: Type variables can't be used in static members.
+//     A<A<T>>.new;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:52:28: Error: Type variables can't be used in static members.
+//     void fun<U extends A<A<T>>>() {}
+//                            ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:57:7: Error: Type variables can't be used in static members.
+//     B<T>? local;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:58:11: Error: Type variables can't be used in static members.
+//     new B<T>();
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:59:7: Error: Type variables can't be used in static members.
+//     B<T>;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:60:7: Error: Type variables can't be used in static members.
+//     B<T>.new;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:61:26: Error: Type variables can't be used in static members.
+//     void fun<U extends B<T>>() {}
+//                          ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:66:9: Error: Type variables can't be used in static members.
+//     A<B<T>>? local;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:67:13: Error: Type variables can't be used in static members.
+//     new A<B<T>>();
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:68:9: Error: Type variables can't be used in static members.
+//     A<B<T>>;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:69:9: Error: Type variables can't be used in static members.
+//     A<B<T>>.new;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:70:28: Error: Type variables can't be used in static members.
+//     void fun<U extends A<B<T>>>() {}
+//                            ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:75:29: Error: Type variables can't be used in static members.
+//     void Function<S extends T>()? local;
+//                             ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:76:48: Error: Type variables can't be used in static members.
+//     void fun<V extends void Function<S extends T>()>() {}
+//                                                ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:86:24: Error: Type variables can't be used in static members.
+//   static Type field2 = T;
+//                        ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:89:30: Error: Type variables can't be used in static members.
+//   static Type field3 = Class<T>;
+//                              ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:117:5: Error: Type variables can't be used in static members.
+//     T? local;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:118:5: Error: Type variables can't be used in static members.
+//     T;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:119:24: Error: Type variables can't be used in static members.
+//     void fun<U extends T>() {}
+//                        ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:132:30: Error: The value 'null' can't be returned from a function with return type 'Mixin<T>' because 'Mixin<T>' is not nullable.
+//  - 'Mixin' is from 'pkg/front_end/testcases/general/type_variable_in_static_context.dart'.
+//   factory Mixin.fact(T t) => null;
+//                              ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:139:5: Error: Type variables can't be used in static members.
+//     T? local;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:140:5: Error: Type variables can't be used in static members.
+//     T;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:141:24: Error: Type variables can't be used in static members.
+//     void fun<U extends T>() {}
+//                        ^
+//
+// pkg/front_end/testcases/general/type_variable_in_static_context.dart:95:12: Error: Final field 'instanceField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final T? instanceField;
+//            ^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object? = dynamic> = self::Class<T%>;
+typedef B<T extends core::num> = self::Class<T>;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  @invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:79:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+  static field invalid-type field0 = null;
+  @#C2
+  static field self::Class<invalid-type>? field1 = null;
+  @#C3
+  static field core::Type field2 = #C4;
+  @#C2
+  static field core::Type field3 = #C5;
+  @#C2
+  static field (invalid-type) → core::Type field4 = (invalid-type t) → core::Type => #C4;
+  @invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:94:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+  final field self::Class::T? instanceField = null;
+  const constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  @invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:12:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+  static method method0<S extends invalid-type>(invalid-type arg) → invalid-type {
+    invalid-type local;
+    #C4;
+    function fun<U extends invalid-type>() → void {}
+  }
+  @#C2
+  static method method1<S extends self::Class<invalid-type>>(self::Class<invalid-type> arg) → self::Class<invalid-type>? {
+    self::Class<invalid-type>? local;
+    new self::Class::•<invalid-type>();
+    #C5;
+    #C7;
+    function fun<U extends self::Class<invalid-type>>() → void {}
+  }
+  @#C3
+  static method method2<S extends self::Class<self::Class<invalid-type>>>(self::Class<self::Class<invalid-type>> arg) → self::Class<self::Class<invalid-type>>? {
+    self::Class<self::Class<invalid-type>>? local;
+    new self::Class::•<self::Class<invalid-type>>();
+    #C8;
+    #C9;
+    function fun<U extends self::Class<self::Class<invalid-type>>>() → void {}
+  }
+  @#C2
+  static method method3<S extends self::Class<invalid-type>>(self::Class<invalid-type> arg) → self::Class<invalid-type>? {
+    self::Class<invalid-type>? local;
+    new self::Class::•<invalid-type>();
+    #C5;
+    #C7;
+    function fun<U extends self::Class<invalid-type>>() → void {}
+  }
+  @#C3
+  static method method4<S extends self::Class<self::Class<invalid-type>>>(self::Class<self::Class<invalid-type>> arg) → self::Class<self::Class<invalid-type>>? {
+    self::Class<self::Class<invalid-type>>? local;
+    new self::Class::•<self::Class<invalid-type>>();
+    #C8;
+    #C9;
+    function fun<U extends self::Class<self::Class<invalid-type>>>() → void {}
+  }
+  @#C2
+  static method method5<S extends self::Class<invalid-type>>(self::Class<invalid-type> arg) → self::Class<invalid-type>? {
+    self::Class<invalid-type>? local;
+    new self::Class::•<invalid-type>();
+    #C5;
+    #C7;
+    function fun<U extends self::Class<invalid-type>>() → void {}
+  }
+  @#C3
+  static method method6<S extends self::Class<self::Class<invalid-type>>>(self::Class<self::Class<invalid-type>> arg) → self::Class<self::Class<invalid-type>>? {
+    self::Class<self::Class<invalid-type>>? local;
+    new self::Class::•<self::Class<invalid-type>>();
+    #C8;
+    #C9;
+    function fun<U extends self::Class<self::Class<invalid-type>>>() → void {}
+  }
+  @#C10
+  static method method7<U extends <S extends invalid-type = dynamic>() → void>(<S extends invalid-type = dynamic>() → void arg) → <S extends invalid-type = dynamic>() →? void {
+    <S extends invalid-type>() →? void local;
+    function fun<V extends <S extends invalid-type>() → void>() → void {}
+  }
+  @invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:97:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+  method instanceMethod<covariant-by-class S extends self::Class::T%>(covariant-by-class self::Class::T% t) → self::Class::T% {
+    self::Class::T%;
+    return t;
+  }
+}
+abstract class Mixin<T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+  @invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:134:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+  static field invalid-type field0 = null;
+  @invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:144:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+  covariant-by-class field self::Mixin::T? instanceField = null;
+  constructor •(invalid-type t) → self::Mixin<self::Mixin::T%>
+    : super core::Object::•()
+    ;
+  static factory fact<T extends core::Object? = dynamic>(self::Mixin::fact::T% t) → self::Mixin<self::Mixin::fact::T%>
+    return invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:132:30: Error: The value 'null' can't be returned from a function with return type 'Mixin<T>' because 'Mixin<T>' is not nullable.
+ - 'Mixin' is from 'pkg/front_end/testcases/general/type_variable_in_static_context.dart'.
+  factory Mixin.fact(T t) => null;
+                             ^" in null as{TypeError,ForNonNullableByDefault} Never;
+  @invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:137:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+  static method staticMethod<S extends invalid-type>(invalid-type arg) → invalid-type {
+    invalid-type local;
+    #C4;
+    function fun<U extends invalid-type>() → void {}
+  }
+  @invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:147:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+  method instanceMethod<covariant-by-class S extends self::Mixin::T%>(covariant-by-class self::Mixin::T% t) → self::Mixin::T% {
+    self::Mixin::T%;
+    return t;
+  }
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  static field field0 = self::Extension|field0;
+  field field1 = self::Extension|field1;
+  static method staticMethod = self::Extension|staticMethod;
+  method instanceMethod = self::Extension|instanceMethod;
+  tearoff instanceMethod = self::Extension|get#instanceMethod;
+}
+@invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:109:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+static field invalid-type Extension|field0;
+@invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:112:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+static field invalid-type Extension|field1;
+@invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:115:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+static method Extension|staticMethod<S extends invalid-type>(invalid-type arg) → invalid-type {
+  invalid-type local;
+  #C4;
+  function fun<U extends invalid-type>() → void {}
+}
+@invalid-expression "pkg/front_end/testcases/general/type_variable_in_static_context.dart:122:4: Error: Couldn't find constructor 'T'.
+  @T()
+   ^"
+static method Extension|instanceMethod<T extends core::Object? = dynamic, S extends self::Extension|instanceMethod::T% = dynamic>(lowered final self::Extension|instanceMethod::T% #this, self::Extension|instanceMethod::T% t) → self::Extension|instanceMethod::T% {
+  self::Extension|instanceMethod::T%;
+  return t;
+}
+static method Extension|get#instanceMethod<T extends core::Object? = dynamic>(lowered final self::Extension|get#instanceMethod::T% #this) → <S extends self::Extension|get#instanceMethod::T% = dynamic>(self::Extension|get#instanceMethod::T%) → self::Extension|get#instanceMethod::T%
+  return <S extends self::Extension|get#instanceMethod::T% = dynamic>(self::Extension|get#instanceMethod::T% t) → self::Extension|get#instanceMethod::T% => self::Extension|instanceMethod<self::Extension|get#instanceMethod::T%, S%>(#this, t);
+static method main() → dynamic {}
+static method _#B#new#tearOff<T extends core::num>() → self::Class<self::_#B#new#tearOff::T>
+  return new self::Class::•<self::_#B#new#tearOff::T>();
+
+constants  {
+  #C1 = null
+  #C2 = self::Class<invalid-type> {instanceField:#C1}
+  #C3 = self::Class<self::Class<invalid-type>*> {instanceField:#C1}
+  #C4 = TypeLiteralConstant(invalid-type)
+  #C5 = TypeLiteralConstant(self::Class<invalid-type>*)
+  #C6 = constructor-tearoff self::Class::•
+  #C7 = instantiation #C6 <invalid-type>
+  #C8 = TypeLiteralConstant(self::Class<self::Class<invalid-type>*>*)
+  #C9 = instantiation #C6 <self::Class<invalid-type>*>
+  #C10 = self::Class<<S extends invalid-type>() →* void> {instanceField:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///type_variable_in_static_context.dart:
+- Class. (from org-dartlang-testcase:///type_variable_in_static_context.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/type_variable_prefix.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.weak.modular.expect
new file mode 100644
index 0000000..20eabce
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_prefix.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_prefix.dart:10:3: Error: 'T.String' can't be used as a type because 'T' doesn't refer to an import prefix.
+//   T.String method() => "Hello, World!";
+//   ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as T;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method method() → invalid-type
+    return "Hello, World!";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::String* s = new self::C::•<dynamic>().{self::C::method}(){() →* invalid-type};
+  core::print(s);
+}
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.weak.modular.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.weak.modular.expect
new file mode 100644
index 0000000..4fbbbaa
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.weak.modular.expect
@@ -0,0 +1,120 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:7:12: Error: Type variables can't be used in static members.
+//   static C<T> staticMethod() {
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
+//     print(T);
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
+//     C<T> l;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
+//     C<C<T>> ll;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
+//     const C<T>();
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
+//     const <T>[];
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
+//     const <C<T>>[];
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
+//     const <Object>[T];
+//                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:16:28: Error: Type variables can't be used in static members.
+//     const <Object>[const C<T>()];
+//                            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
+//     const C<T>();
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:25:12: Error: Type variables can't be used as constants.
+//     const <T>[];
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:26:14: Error: Type variables can't be used as constants.
+//     const <C<T>>[];
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:27:20: Error: Type variables can't be used as constants.
+//     const <Object>[T];
+//                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:28:28: Error: Type variables can't be used as constants.
+//     const <Object>[const C<T>()];
+//                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static method staticMethod() → self::C<invalid-type>* {
+    core::print(#C1);
+    invalid-type t;
+    self::C<invalid-type>* l;
+    self::C<self::C<invalid-type>*>* ll;
+    #C2;
+    #C3;
+    #C4;
+    #C5;
+    #C6;
+  }
+  method instanceMethod() → self::C<self::C::T*>* {
+    core::print(self::C::T*);
+    self::C::T* t;
+    self::C<self::C::T*>* l;
+    self::C<self::C<self::C::T*>*>* ll;
+    #C2;
+    #C3;
+    #C4;
+    #C5;
+    #C6;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(invalid-type)
+  #C2 = self::C<invalid-type> {}
+  #C3 = <invalid-type>[]
+  #C4 = <self::C<invalid-type>*>[]
+  #C5 = <core::Object*>[#C1]
+  #C6 = <core::Object*>[#C2]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///type_variable_uses.dart:
+- C. (from org-dartlang-testcase:///type_variable_uses.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/typedef.dart.weak.modular.expect b/pkg/front_end/testcases/general/typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..2b36abf
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef _NullaryFunction = () →* dynamic;
+typedef _UnaryFunction = (dynamic) →* dynamic;
+typedef _BinaryFunction = (dynamic, dynamic) →* dynamic;
+static method main() → dynamic {
+  core::print(#C1 is () →* dynamic);
+  core::print(#C1 is (dynamic) →* dynamic);
+  core::print(#C1 is (dynamic, dynamic) →* dynamic);
+}
+
+constants  {
+  #C1 = static-tearoff self::main
+}
diff --git a/pkg/front_end/testcases/general/typedef_annotation.dart.weak.modular.expect b/pkg/front_end/testcases/general/typedef_annotation.dart.weak.modular.expect
new file mode 100644
index 0000000..3c94843
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef_annotation.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+typedef F = () → void;
+@#C1
+typedef G = () → void;
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///typedef_annotation.dart:
+- A. (from org-dartlang-testcase:///typedef_annotation.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/undefined.dart.weak.modular.expect b/pkg/front_end/testcases/general/undefined.dart.weak.modular.expect
new file mode 100644
index 0000000..0c68639
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined.dart.weak.modular.expect
@@ -0,0 +1,63 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/undefined.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
+//   c.y;
+//     ^
+//
+// pkg/front_end/testcases/general/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/undefined.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'g'.
+//   c.g();
+//     ^
+//
+// pkg/front_end/testcases/general/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/undefined.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
+//   c.y = null;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic x = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C* c) → void {
+  c.{self::C::x}{dynamic};
+  invalid-expression "pkg/front_end/testcases/general/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/undefined.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
+  c.y;
+    ^" in c{<unresolved>}.y;
+  c.{self::C::f}(){() →* void};
+  invalid-expression "pkg/front_end/testcases/general/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/undefined.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'g'.
+  c.g();
+    ^" in c{<unresolved>}.g();
+  c.{self::C::x} = null;
+  invalid-expression "pkg/front_end/testcases/general/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/undefined.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
+  c.y = null;
+    ^" in c{<unresolved>}.y = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.weak.modular.expect b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.weak.modular.expect
new file mode 100644
index 0000000..fdcdf1e
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart:11:5: Error: The getter 'x' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
+//   c.x += 1;
+//     ^
+//
+// pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart:12:5: Error: The getter 'x' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
+//   c.x ??= 1;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set x(dynamic value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C* c) → void {
+  c.{self::C::x} = 1;
+  let final self::C* #t1 = c in #t1.{self::C::x} = invalid-expression "pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart:11:5: Error: The getter 'x' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
+  c.x += 1;
+    ^" in #t1{<unresolved>}.x{dynamic}.+(1);
+  let final self::C* #t2 = c in invalid-expression "pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart:12:5: Error: The getter 'x' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
+  c.x ??= 1;
+    ^" in #t2{<unresolved>}.x == null ?{dynamic} #t2.{self::C::x} = 1 : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/uninitialized_fields.dart.weak.modular.expect b/pkg/front_end/testcases/general/uninitialized_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..66c109b
--- /dev/null
+++ b/pkg/front_end/testcases/general/uninitialized_fields.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Uninitialized extends core::Object {
+  field core::int* x = null;
+  synthetic constructor •() → self::Uninitialized*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class PartiallyInitialized extends core::Object {
+  field core::int* x;
+  constructor •(core::int* x) → self::PartiallyInitialized*
+    : self::PartiallyInitialized::x = x, super core::Object::•()
+    ;
+  constructor noInitializer() → self::PartiallyInitialized*
+    : self::PartiallyInitialized::x = null, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Initialized extends core::Object {
+  field core::int* x;
+  constructor •(core::int* x) → self::Initialized*
+    : self::Initialized::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Forwarding extends core::Object {
+  field core::int* x;
+  constructor initialize(core::int* x) → self::Forwarding*
+    : self::Forwarding::x = x, super core::Object::•()
+    ;
+  constructor •(core::int* arg) → self::Forwarding*
+    : this self::Forwarding::initialize(arg)
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* uninitializedTopLevel;
+static field core::int* initializedTopLevel = 4;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/unresolved_constructor_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/general/unresolved_constructor_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..63b12b9
--- /dev/null
+++ b/pkg/front_end/testcases/general/unresolved_constructor_invocation.dart.weak.modular.expect
@@ -0,0 +1,866 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:14:26: Error: Superclass has no constructor named 'Super'.
+//   Class.constructor1() : super();
+//                          ^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:15:26: Error: Superclass has no constructor named 'Super.unresolved'.
+//   Class.constructor2() : super.unresolved();
+//                          ^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:16:26: Error: Couldn't find constructor 'Class'.
+//   Class.constructor3() : this();
+//                          ^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:17:26: Error: Couldn't find constructor 'Class.unresolved'.
+//   Class.constructor4() : this.unresolved();
+//                          ^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:25:3: Error: Method not found: 'UnresolvedClass'.
+//   UnresolvedClass();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:26:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:27:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:29:3: Error: Undefined name 'UnresolvedClass'.
+//   UnresolvedClass.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:30:7: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   new UnresolvedClass.unresolvedConstructor();
+//       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:31:9: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   const UnresolvedClass.unresolvedConstructor();
+//         ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:32:3: Error: Undefined name 'UnresolvedClass'.
+//   UnresolvedClass /**/ .unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:33:7: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   new UnresolvedClass. /**/ unresolvedConstructor();
+//       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:34:9: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   const UnresolvedClass /**/ .unresolvedConstructor();
+//         ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:36:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix.UnresolvedClass();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:37:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   new unresolved_prefix.UnresolvedClass();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:38:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   const unresolved_prefix.UnresolvedClass();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:39:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix. /**/ UnresolvedClass();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:40:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   new unresolved_prefix /**/ .UnresolvedClass();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:41:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   const unresolved_prefix. /**/ UnresolvedClass();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:43:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:44:41: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   new unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                                         ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:45:43: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   const unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                                           ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:46:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix /**/ .UnresolvedClass.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:47:47: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   new unresolved_prefix.UnresolvedClass /**/ .unresolvedConstructor();
+//                                               ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:48:55: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   const unresolved_prefix. /**/ UnresolvedClass. /**/ unresolvedConstructor();
+//                                                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:50:3: Error: Method not found: 'UnresolvedClass'.
+//   UnresolvedClass<int>();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:51:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass<int>();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:52:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass<int>();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:53:3: Error: Method not found: 'UnresolvedClass'.
+//   UnresolvedClass /**/ <int>();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:54:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass<int> /**/ ();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:55:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass /**/ <int>();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:57:3: Error: Couldn't find constructor 'UnresolvedClass'.
+//   UnresolvedClass<int>.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:58:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass<int>.unresolvedConstructor();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:59:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass<int>.unresolvedConstructor();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:60:3: Error: Couldn't find constructor 'UnresolvedClass'.
+//   UnresolvedClass /**/ <int>.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:61:7: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new UnresolvedClass<int> /**/ .unresolvedConstructor();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:62:9: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const UnresolvedClass<int>. /**/ unresolvedConstructor();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:64:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix.UnresolvedClass<int>();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:65:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   new unresolved_prefix.UnresolvedClass<int>();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:66:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   const unresolved_prefix.UnresolvedClass<int>();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:67:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix /**/ .UnresolvedClass<int>();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:68:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   new unresolved_prefix.UnresolvedClass /**/ <int>();
+//       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:69:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+//   const unresolved_prefix.UnresolvedClass<int> /**/ ();
+//         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:71:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:71:42: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                                          ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:72:46: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   new unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                                              ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:73:48: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   const unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                                                ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:74:3: Error: Undefined name 'unresolved_prefix'.
+//   unresolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+//   ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:74:48: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+//   unresolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+//                                                ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:75:52: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   new unresolved_prefix.UnresolvedClass /**/ <int>.unresolvedConstructor();
+//                                                    ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:76:54: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+//   const unresolved_prefix.UnresolvedClass<int>. /**/ unresolvedConstructor();
+//                                                      ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:78:3: Error: Couldn't find constructor 'ResolvedClass'.
+//   ResolvedClass();
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:79:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new ResolvedClass();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:80:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const ResolvedClass();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:82:17: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+//   ResolvedClass.unresolvedConstructor();
+//                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:83:21: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new ResolvedClass.unresolvedConstructor();
+//                     ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:84:23: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const ResolvedClass.unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:85:23: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+//   ResolvedClass /**/ .unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:86:27: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new ResolvedClass. /**/ unresolvedConstructor();
+//                           ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:87:29: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const ResolvedClass /**/ .unresolvedConstructor();
+//                             ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:89:19: Error: Method not found: 'UnresolvedClass'.
+//   resolved_prefix.UnresolvedClass();
+//                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:90:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:91:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:92:25: Error: Method not found: 'UnresolvedClass'.
+//   resolved_prefix. /**/ UnresolvedClass();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:93:29: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix /**/ .UnresolvedClass();
+//                             ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:94:31: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix. /**/ UnresolvedClass();
+//                               ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:96:19: Error: Couldn't find constructor 'ResolvedClass'.
+//   resolved_prefix.ResolvedClass();
+//                   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:97:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new resolved_prefix.ResolvedClass();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:98:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const resolved_prefix.ResolvedClass();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:99:25: Error: Couldn't find constructor 'ResolvedClass'.
+//   resolved_prefix. /**/ ResolvedClass();
+//                         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:100:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new resolved_prefix /**/ .ResolvedClass();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:101:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const resolved_prefix. /**/ ResolvedClass();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:103:19: Error: Undefined name 'UnresolvedClass'.
+//   resolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:104:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:105:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass.unresolvedConstructor();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:106:25: Error: Undefined name 'UnresolvedClass'.
+//   resolved_prefix /**/ .UnresolvedClass.unresolvedConstructor();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:107:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass /**/ .unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:108:31: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix. /**/ UnresolvedClass. /**/ unresolvedConstructor();
+//                               ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:110:33: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+//   resolved_prefix.ResolvedClass.unresolvedConstructor();
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:111:37: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new resolved_prefix.ResolvedClass.unresolvedConstructor();
+//                                     ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:112:39: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const resolved_prefix.ResolvedClass.unresolvedConstructor();
+//                                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:113:39: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+//   resolved_prefix /**/ .ResolvedClass.unresolvedConstructor();
+//                                       ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:114:43: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new resolved_prefix.ResolvedClass /**/ .unresolvedConstructor();
+//                                           ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:115:51: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const resolved_prefix. /**/ ResolvedClass. /**/ unresolvedConstructor();
+//                                                   ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:117:3: Error: Couldn't find constructor 'ResolvedClass'.
+//   ResolvedClass<int>();
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:118:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new ResolvedClass<int>();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:119:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const ResolvedClass<int>();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:120:3: Error: Couldn't find constructor 'ResolvedClass'.
+//   ResolvedClass /**/ <int>();
+//   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:121:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new ResolvedClass /**/ <int>();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:122:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const ResolvedClass /**/ <int>();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:124:22: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   ResolvedClass<int>.unresolvedConstructor();
+//                      ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:125:26: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new ResolvedClass<int>.unresolvedConstructor();
+//                          ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:126:28: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const ResolvedClass<int>.unresolvedConstructor();
+//                            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:127:28: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   ResolvedClass<int> /**/ .unresolvedConstructor();
+//                            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:128:32: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new ResolvedClass<int>. /**/ unresolvedConstructor();
+//                                ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:129:34: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const ResolvedClass /**/ <int>.unresolvedConstructor();
+//                                  ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:131:19: Error: Method not found: 'UnresolvedClass'.
+//   resolved_prefix.UnresolvedClass<int>();
+//                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:132:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass<int>();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:133:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass<int>();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:134:25: Error: Method not found: 'UnresolvedClass'.
+//   resolved_prefix. /**/ UnresolvedClass<int>();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:135:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass /**/ <int>();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:136:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass<int> /**/ ();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:138:19: Error: Couldn't find constructor 'ResolvedClass'.
+//   resolved_prefix.ResolvedClass<int>();
+//                   ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:139:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new resolved_prefix.ResolvedClass<int>();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:140:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const resolved_prefix.ResolvedClass<int>();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:141:25: Error: Couldn't find constructor 'ResolvedClass'.
+//   resolved_prefix. /**/ ResolvedClass<int>();
+//                         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:142:7: Error: Couldn't find constructor 'ResolvedClass'.
+//   new resolved_prefix.ResolvedClass /**/ <int>();
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:143:9: Error: Couldn't find constructor 'ResolvedClass'.
+//   const resolved_prefix.ResolvedClass<int> /**/ ();
+//         ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:145:19: Error: Couldn't find constructor 'UnresolvedClass'.
+//   resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:146:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:147:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   const resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:148:25: Error: Couldn't find constructor 'UnresolvedClass'.
+//   resolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:149:23: Error: Couldn't find constructor 'UnresolvedClass'.
+//   new resolved_prefix.UnresolvedClass<int> /**/ .unresolvedConstructor();
+//                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:151:14: Error: Couldn't find constructor 'UnresolvedClass'.
+//       . /**/ UnresolvedClass<int>. /**/ unresolvedConstructor();
+//              ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:153:38: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+//                                      ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:154:42: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+//                                          ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:155:44: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+//                                            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:156:44: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   resolved_prefix /**/ .ResolvedClass<int>.unresolvedConstructor();
+//                                            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:157:48: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   new resolved_prefix.ResolvedClass<int> /**/ .unresolvedConstructor();
+//                                                ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:158:56: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+//   const resolved_prefix. /**/ ResolvedClass<int>. /**/ unresolvedConstructor();
+//                                                        ^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///unresolved_constructor_invocation.dart" as resolved_prefix;
+
+class Super extends core::Object {
+  constructor named() → self::Super
+    : super core::Object::•()
+    ;
+}
+class Class extends self::Super {
+  constructor constructor1() → self::Class
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:14:26: Error: Superclass has no constructor named 'Super'.
+  Class.constructor1() : super();
+                         ^^^^^"
+    ;
+  constructor constructor2() → self::Class
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:15:26: Error: Superclass has no constructor named 'Super.unresolved'.
+  Class.constructor2() : super.unresolved();
+                         ^^^^^"
+    ;
+  constructor constructor3() → self::Class
+    : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:16:26: Error: Couldn't find constructor 'Class'.
+  Class.constructor3() : this();
+                         ^^^^"
+    ;
+  constructor constructor4() → self::Class
+    : final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:17:26: Error: Couldn't find constructor 'Class.unresolved'.
+  Class.constructor4() : this.unresolved();
+                         ^^^^"
+    ;
+}
+class ResolvedClass<T extends core::Object? = dynamic> extends core::Object {
+  constructor named() → self::ResolvedClass<self::ResolvedClass::T%>
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:25:3: Error: Method not found: 'UnresolvedClass'.
+  UnresolvedClass();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:26:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:27:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:29:3: Error: Undefined name 'UnresolvedClass'.
+  UnresolvedClass.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^"{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:30:7: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  new UnresolvedClass.unresolvedConstructor();
+      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:31:9: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  const UnresolvedClass.unresolvedConstructor();
+        ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:32:3: Error: Undefined name 'UnresolvedClass'.
+  UnresolvedClass /**/ .unresolvedConstructor();
+  ^^^^^^^^^^^^^^^"{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:33:7: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  new UnresolvedClass. /**/ unresolvedConstructor();
+      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:34:9: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  const UnresolvedClass /**/ .unresolvedConstructor();
+        ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:36:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix.UnresolvedClass();
+  ^^^^^^^^^^^^^^^^^"{dynamic}.UnresolvedClass();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:37:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  new unresolved_prefix.UnresolvedClass();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:38:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  const unresolved_prefix.UnresolvedClass();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:39:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix. /**/ UnresolvedClass();
+  ^^^^^^^^^^^^^^^^^"{dynamic}.UnresolvedClass();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:40:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  new unresolved_prefix /**/ .UnresolvedClass();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:41:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  const unresolved_prefix. /**/ UnresolvedClass();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:43:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^^^"{<invalid>}.UnresolvedClass{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:44:41: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  new unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+                                        ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:45:43: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  const unresolved_prefix.UnresolvedClass.unresolvedConstructor();
+                                          ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:46:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix /**/ .UnresolvedClass.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^^^"{<invalid>}.UnresolvedClass{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:47:47: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  new unresolved_prefix.UnresolvedClass /**/ .unresolvedConstructor();
+                                              ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:48:55: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  const unresolved_prefix. /**/ UnresolvedClass. /**/ unresolvedConstructor();
+                                                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:50:3: Error: Method not found: 'UnresolvedClass'.
+  UnresolvedClass<int>();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:51:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass<int>();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:52:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass<int>();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:53:3: Error: Method not found: 'UnresolvedClass'.
+  UnresolvedClass /**/ <int>();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:54:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass<int> /**/ ();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:55:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass /**/ <int>();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:57:3: Error: Couldn't find constructor 'UnresolvedClass'.
+  UnresolvedClass<int>.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:58:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass<int>.unresolvedConstructor();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:59:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass<int>.unresolvedConstructor();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:60:3: Error: Couldn't find constructor 'UnresolvedClass'.
+  UnresolvedClass /**/ <int>.unresolvedConstructor();
+  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:61:7: Error: Couldn't find constructor 'UnresolvedClass'.
+  new UnresolvedClass<int> /**/ .unresolvedConstructor();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:62:9: Error: Couldn't find constructor 'UnresolvedClass'.
+  const UnresolvedClass<int>. /**/ unresolvedConstructor();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:64:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix.UnresolvedClass<int>();
+  ^^^^^^^^^^^^^^^^^"{dynamic}.UnresolvedClass<core::int>();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:65:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  new unresolved_prefix.UnresolvedClass<int>();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:66:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  const unresolved_prefix.UnresolvedClass<int>();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:67:3: Error: Undefined name 'unresolved_prefix'.
+  unresolved_prefix /**/ .UnresolvedClass<int>();
+  ^^^^^^^^^^^^^^^^^"{dynamic}.UnresolvedClass<core::int>();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:68:7: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  new unresolved_prefix.UnresolvedClass /**/ <int>();
+      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:69:9: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass'.
+  const unresolved_prefix.UnresolvedClass<int> /**/ ();
+        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:71:42: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                                         ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:72:46: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  new unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                                             ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:73:48: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  const unresolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                                               ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:74:48: Error: Couldn't find constructor 'UnresolvedClass.unresolvedConstructor'.
+  unresolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+                                               ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:75:52: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  new unresolved_prefix.UnresolvedClass /**/ <int>.unresolvedConstructor();
+                                                   ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:76:54: Error: Couldn't find constructor 'unresolved_prefix.UnresolvedClass.unresolvedConstructor'.
+  const unresolved_prefix.UnresolvedClass<int>. /**/ unresolvedConstructor();
+                                                     ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:78:3: Error: Couldn't find constructor 'ResolvedClass'.
+  ResolvedClass();
+  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:79:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new ResolvedClass();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:80:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const ResolvedClass();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:82:17: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+  ResolvedClass.unresolvedConstructor();
+                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:83:21: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new ResolvedClass.unresolvedConstructor();
+                    ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:84:23: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const ResolvedClass.unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:85:23: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+  ResolvedClass /**/ .unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:86:27: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new ResolvedClass. /**/ unresolvedConstructor();
+                          ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:87:29: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const ResolvedClass /**/ .unresolvedConstructor();
+                            ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:89:19: Error: Method not found: 'UnresolvedClass'.
+  resolved_prefix.UnresolvedClass();
+                  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:90:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:91:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:92:25: Error: Method not found: 'UnresolvedClass'.
+  resolved_prefix. /**/ UnresolvedClass();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:93:29: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix /**/ .UnresolvedClass();
+                            ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:94:31: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix. /**/ UnresolvedClass();
+                              ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:96:19: Error: Couldn't find constructor 'ResolvedClass'.
+  resolved_prefix.ResolvedClass();
+                  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:97:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new resolved_prefix.ResolvedClass();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:98:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const resolved_prefix.ResolvedClass();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:99:25: Error: Couldn't find constructor 'ResolvedClass'.
+  resolved_prefix. /**/ ResolvedClass();
+                        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:100:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new resolved_prefix /**/ .ResolvedClass();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:101:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const resolved_prefix. /**/ ResolvedClass();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:103:19: Error: Undefined name 'UnresolvedClass'.
+  resolved_prefix.UnresolvedClass.unresolvedConstructor();
+                  ^^^^^^^^^^^^^^^"{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:104:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass.unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:105:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass.unresolvedConstructor();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:106:25: Error: Undefined name 'UnresolvedClass'.
+  resolved_prefix /**/ .UnresolvedClass.unresolvedConstructor();
+                        ^^^^^^^^^^^^^^^"{dynamic}.unresolvedConstructor();
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:107:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass /**/ .unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:108:31: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix. /**/ UnresolvedClass. /**/ unresolvedConstructor();
+                              ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:110:33: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+  resolved_prefix.ResolvedClass.unresolvedConstructor();
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:111:37: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new resolved_prefix.ResolvedClass.unresolvedConstructor();
+                                    ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:112:39: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const resolved_prefix.ResolvedClass.unresolvedConstructor();
+                                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:113:39: Error: Member not found: 'ResolvedClass.unresolvedConstructor'.
+  resolved_prefix /**/ .ResolvedClass.unresolvedConstructor();
+                                      ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:114:43: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new resolved_prefix.ResolvedClass /**/ .unresolvedConstructor();
+                                          ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:115:51: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const resolved_prefix. /**/ ResolvedClass. /**/ unresolvedConstructor();
+                                                  ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:117:3: Error: Couldn't find constructor 'ResolvedClass'.
+  ResolvedClass<int>();
+  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:118:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new ResolvedClass<int>();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:119:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const ResolvedClass<int>();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:120:3: Error: Couldn't find constructor 'ResolvedClass'.
+  ResolvedClass /**/ <int>();
+  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:121:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new ResolvedClass /**/ <int>();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:122:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const ResolvedClass /**/ <int>();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:124:22: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  ResolvedClass<int>.unresolvedConstructor();
+                     ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:125:26: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new ResolvedClass<int>.unresolvedConstructor();
+                         ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:126:28: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const ResolvedClass<int>.unresolvedConstructor();
+                           ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:127:28: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  ResolvedClass<int> /**/ .unresolvedConstructor();
+                           ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:128:32: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new ResolvedClass<int>. /**/ unresolvedConstructor();
+                               ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:129:34: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const ResolvedClass /**/ <int>.unresolvedConstructor();
+                                 ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:131:19: Error: Method not found: 'UnresolvedClass'.
+  resolved_prefix.UnresolvedClass<int>();
+                  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:132:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass<int>();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:133:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass<int>();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:134:25: Error: Method not found: 'UnresolvedClass'.
+  resolved_prefix. /**/ UnresolvedClass<int>();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:135:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass /**/ <int>();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:136:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass<int> /**/ ();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:138:19: Error: Couldn't find constructor 'ResolvedClass'.
+  resolved_prefix.ResolvedClass<int>();
+                  ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:139:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new resolved_prefix.ResolvedClass<int>();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:140:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const resolved_prefix.ResolvedClass<int>();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:141:25: Error: Couldn't find constructor 'ResolvedClass'.
+  resolved_prefix. /**/ ResolvedClass<int>();
+                        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:142:7: Error: Couldn't find constructor 'ResolvedClass'.
+  new resolved_prefix.ResolvedClass /**/ <int>();
+      ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:143:9: Error: Couldn't find constructor 'ResolvedClass'.
+  const resolved_prefix.ResolvedClass<int> /**/ ();
+        ^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:145:19: Error: Couldn't find constructor 'UnresolvedClass'.
+  resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                  ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:146:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:147:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  const resolved_prefix.UnresolvedClass<int>.unresolvedConstructor();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:148:25: Error: Couldn't find constructor 'UnresolvedClass'.
+  resolved_prefix /**/ .UnresolvedClass<int>.unresolvedConstructor();
+                        ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:149:23: Error: Couldn't find constructor 'UnresolvedClass'.
+  new resolved_prefix.UnresolvedClass<int> /**/ .unresolvedConstructor();
+                      ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:151:14: Error: Couldn't find constructor 'UnresolvedClass'.
+      . /**/ UnresolvedClass<int>. /**/ unresolvedConstructor();
+             ^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:153:38: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+                                     ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:154:42: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+                                         ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:155:44: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const resolved_prefix.ResolvedClass<int>.unresolvedConstructor();
+                                           ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:156:44: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  resolved_prefix /**/ .ResolvedClass<int>.unresolvedConstructor();
+                                           ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:157:48: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  new resolved_prefix.ResolvedClass<int> /**/ .unresolvedConstructor();
+                                               ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_constructor_invocation.dart:158:56: Error: Couldn't find constructor 'ResolvedClass.unresolvedConstructor'.
+  const resolved_prefix. /**/ ResolvedClass<int>. /**/ unresolvedConstructor();
+                                                       ^^^^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/unresolved_prefix_access.dart.weak.modular.expect b/pkg/front_end/testcases/general/unresolved_prefix_access.dart.weak.modular.expect
new file mode 100644
index 0000000..a7f4e10
--- /dev/null
+++ b/pkg/front_end/testcases/general/unresolved_prefix_access.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/unresolved_prefix_access.dart:8:10: Error: Method not found: 'unresolved'.
+//   prefix.unresolved();
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/unresolved_prefix_access.dart:9:3: Error: A prefix can't be used with null-aware operators.
+// Try replacing '?.' with '.'
+//   prefix?.test();
+//   ^^^^^^
+//
+import self as self;
+
+import "org-dartlang-testcase:///unresolved_prefix_access.dart" as prefix;
+
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/unresolved_prefix_access.dart:8:10: Error: Method not found: 'unresolved'.
+  prefix.unresolved();
+         ^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/general/unresolved_prefix_access.dart:9:3: Error: A prefix can't be used with null-aware operators.
+Try replacing '?.' with '.'
+  prefix?.test();
+  ^^^^^^" in self::test();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.weak.modular.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.weak.modular.expect
new file mode 100644
index 0000000..e5a07f2
--- /dev/null
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/unsound_promotion.dart:21:16: Error: Inferred type argument 'S' doesn't conform to the bound 'A' of the type variable 'T' on 'g'.
+//  - 'A' is from 'pkg/front_end/testcases/general/unsound_promotion.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     var list = g(s);
+//                ^
+// pkg/front_end/testcases/general/unsound_promotion.dart:13:11: Context: This is the type variable whose bound isn't conformed to.
+// List<T> g<T extends A>(T t) {
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B implements self::A {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static field core::List<self::A*>* list;
+static method g<T extends self::A*>(self::g::T* t) → core::List<self::g::T*>* {
+  self::list = <self::g::T*>[];
+  core::print(self::list.{core::Object::runtimeType}{core::Type*});
+  return self::list as{TypeError} core::List<self::g::T*>*;
+}
+static method f<S extends core::Object* = dynamic>(self::f::S* s) → core::List<self::f::S*>* {
+  if(s is self::A*) {
+    core::List<self::f::S*>* list = self::g<self::f::S*>(s{self::f::S* & self::A* /* '*' & '*' = '*' */});
+    return list;
+  }
+  return null;
+}
+static method main() → dynamic {
+  self::f<self::B*>(new self::C::•());
+  core::print(self::list.{core::Object::runtimeType}{core::Type*});
+  core::List<self::A*>* aList;
+  aList = self::list;
+  core::Object* o = aList;
+  aList = o as{TypeError} core::List<self::A*>*;
+}
diff --git a/pkg/front_end/testcases/general/unused_methods.dart.weak.modular.expect b/pkg/front_end/testcases/general/unused_methods.dart.weak.modular.expect
new file mode 100644
index 0000000..060120a
--- /dev/null
+++ b/pkg/front_end/testcases/general/unused_methods.dart.weak.modular.expect
@@ -0,0 +1,126 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class UnusedClass extends core::Object {
+  constructor •() → self::UnusedClass*
+    : super core::Object::•() {
+    core::print("Unused");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class UsedAsBaseClass extends core::Object {
+  synthetic constructor •() → self::UsedAsBaseClass*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+  method calledFromB() → void {
+    this.{self::UsedAsBaseClass::calledFromSubclass}(){() →* void};
+  }
+  method calledFromSubclass() → void {
+    core::print("Unused");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class UsedAsInterface extends core::Object {
+  synthetic constructor •() → self::UsedAsInterface*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class InstantiatedButMethodsUnused extends core::Object {
+  synthetic constructor •() → self::InstantiatedButMethodsUnused*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
+  synthetic constructor •() → self::ClassA*
+    : super self::UsedAsBaseClass::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("A");
+  }
+}
+class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
+  synthetic constructor •() → self::ClassB*
+    : super self::UsedAsBaseClass::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("B");
+    this.{self::UsedAsBaseClass::calledFromB}(){() →* void};
+  }
+  method calledFromSubclass() → void {}
+}
+static method baseClassCall(self::UsedAsBaseClass* object) → void {
+  object.{self::UsedAsBaseClass::usedInSubclass}(){() →* void};
+}
+static method interfaceCall(self::UsedAsInterface* object) → void {
+  object.{self::UsedAsInterface::usedInSubclass}(){() →* void};
+}
+static method exactCallA(self::ClassA* object) → void {
+  object.{self::ClassA::usedInSubclass}(){() →* void};
+}
+static method exactCallB(self::ClassB* object) → void {
+  object.{self::ClassB::usedInSubclass}(){() →* void};
+}
+static method unusedTopLevel() → dynamic {
+  core::print("Unused");
+}
+static method usedTopLevel() → dynamic {}
+static method main() → dynamic {
+  self::usedTopLevel();
+  self::ClassA* a = new self::ClassA::•();
+  self::exactCallA(a);
+  self::baseClassCall(a);
+  self::interfaceCall(a);
+  self::ClassB* b = new self::ClassB::•();
+  self::exactCallB(b);
+  self::baseClassCall(b);
+  self::interfaceCall(b);
+  new self::InstantiatedButMethodsUnused::•();
+}
diff --git a/pkg/front_end/testcases/general/var_as_type_name.dart.weak.modular.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.weak.modular.expect
new file mode 100644
index 0000000..4673e3d
--- /dev/null
+++ b/pkg/front_end/testcases/general/var_as_type_name.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Error: The keyword 'var' can't be used as a type name.
+//   Map<String, var> m;
+//               ^^^
+//
+// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Error: Type 'var' not found.
+//   Map<String, var> m;
+//               ^^^
+//
+// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Error: 'var' isn't a type.
+//   Map<String, var> m;
+//               ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::Map<core::String*, invalid-type>* m = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•();
+  a.{self::A::m} = null;
+}
diff --git a/pkg/front_end/testcases/general/vm_type_ops.dart.weak.modular.expect b/pkg/front_end/testcases/general/vm_type_ops.dart.weak.modular.expect
new file mode 100644
index 0000000..47d6412f
--- /dev/null
+++ b/pkg/front_end/testcases/general/vm_type_ops.dart.weak.modular.expect
@@ -0,0 +1,127 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A<core::String*> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C<T1 extends core::Object* = dynamic, T2 extends core::Object* = dynamic, T3 extends core::Object* = dynamic> extends self::B {
+  synthetic constructor •() → self::C<self::C::T1*, self::C::T2*, self::C::T3*>*
+    : super self::B::•()
+    ;
+}
+class D<P extends core::Object* = dynamic, Q extends core::Object* = dynamic> extends self::C<core::int*, self::D::Q*, self::D::P*> {
+  covariant-by-class field core::Map<self::D::P*, self::D::Q*>* foo;
+  constructor •(dynamic tt) → self::D<self::D::P*, self::D::Q*>*
+    : self::D::foo = tt as{TypeError,ForDynamic} core::Map<self::D::P*, self::D::Q*>*, super self::C::•()
+    ;
+  method foo2(dynamic y) → dynamic {
+    if(y is self::A<self::D::P*>*) {
+      core::print("21");
+    }
+    if(y is self::C<dynamic, self::D::Q*, core::List<self::D::P*>*>*) {
+      core::print("22");
+    }
+    this.{self::D::foo} = y as{TypeError,ForDynamic} core::Map<self::D::P*, self::D::Q*>*;
+  }
+  method foo3<T1 extends core::Object* = dynamic, T2 extends core::Object* = dynamic>(dynamic z) → dynamic {
+    if(z is self::A<self::D::foo3::T1*>*) {
+      core::print("31");
+    }
+    if(z is self::C<core::Map<self::D::foo3::T1*, self::D::P*>*, core::List<self::D::foo3::T2*>*, self::D::Q*>*) {
+      core::print("32");
+    }
+    return (z as core::Map<self::D::foo3::T2*, self::D::Q*>*).{core::Map::values}{core::Iterable<self::D::Q*>*};
+  }
+  method foo4(dynamic w) → core::Map<self::D::P*, self::D::Q*>* {
+    core::List<core::Map<self::D::P*, self::D::Q*>*>* list = <core::Map<self::D::P*, self::D::Q*>*>[w as{TypeError,ForDynamic} core::Map<self::D::P*, self::D::Q*>*];
+    return w as{TypeError,ForDynamic} core::Map<self::D::P*, self::D::Q*>*;
+  }
+}
+class E<P extends core::String*> extends core::Object {
+  static factory •<P extends core::String*>() → self::E<self::E::•::P*>*
+    return null;
+  method foo6<covariant-by-class T extends self::E::P*, U extends core::List<self::E::foo6::T*>* = core::List<self::E::P*>*>(core::Map<self::E::foo6::T*, self::E::foo6::U*>* map) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class F<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::T*>*
+    : super core::Object::•()
+    ;
+  abstract method foo7<covariant-by-class Q extends self::F::T*>(self::F::foo7::Q* a, covariant-by-declaration core::num* b, covariant-by-class self::F::T* c) → void;
+  abstract method foo8<covariant-by-class Q extends self::F::T*>(self::F::foo8::Q* a, covariant-by-declaration core::num* b, covariant-by-class self::F::T* c) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super core::Object::•()
+    ;
+  method foo7<covariant-by-class Q extends self::G::T*>(self::G::foo7::Q* a, core::int* b, covariant-by-class self::G::T* c) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class H<T extends core::Object* = dynamic> extends self::G<self::H::T*> implements self::F<self::H::T*> {
+  synthetic constructor •() → self::H<self::H::T*>*
+    : super self::G::•()
+    ;
+  method foo8<covariant-by-class Q extends self::H::T*>(self::H::foo8::Q* a, covariant-by-declaration core::int* b, covariant-by-class self::H::T* c) → void {}
+  forwarding-stub method foo7<covariant-by-class Q extends self::H::T*>(self::H::foo7::Q* a, covariant-by-declaration core::num* b, covariant-by-class self::H::T* c) → void
+    return super.{self::G::foo7}<self::H::foo7::Q*>(a, b as core::int*, c);
+}
+static field core::List<core::Iterable<dynamic>*>* globalVar;
+static method foo1(dynamic x) → dynamic {
+  if(x is self::B*) {
+    core::print("11");
+  }
+  if(x is self::C<core::int*, core::Object*, dynamic>*) {
+    core::print("12");
+  }
+  return x as self::A<core::int*>*;
+}
+static method foo5(dynamic x) → void {
+  self::globalVar = x as{TypeError,ForDynamic} core::List<core::Iterable<dynamic>*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/void_methods.dart.weak.modular.expect b/pkg/front_end/testcases/general/void_methods.dart.weak.modular.expect
new file mode 100644
index 0000000..dff46ae
--- /dev/null
+++ b/pkg/front_end/testcases/general/void_methods.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::List<dynamic>* list = <dynamic>[1, 2, 3];
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  set first(dynamic x) → void
+    return let final core::List<dynamic>* #t1 = this.{self::Foo::list}{core::List<dynamic>*} in let final core::int* #t2 = 0 in let final dynamic #t3 = x in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3){(core::int*, dynamic) →* void} in #t3;
+  operator []=(dynamic x, dynamic y) → void
+    return let final core::List<dynamic>* #t5 = this.{self::Foo::list}{core::List<dynamic>*} in let final dynamic #t6 = x as{TypeError,ForDynamic} core::int* in let final dynamic #t7 = y in let final void #t8 = #t5.{core::List::[]=}(#t6, #t7){(core::int*, dynamic) →* void} in #t7;
+  method clear() → void
+    return this.{self::Foo::list}{core::List<dynamic>*}.{core::List::clear}(){() →* void};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::Foo::•().{self::Foo::first} = 4;
+  new self::Foo::•().{self::Foo::[]=}(3, 4){(dynamic, dynamic) →* void};
+  new self::Foo::•().{self::Foo::clear}(){() →* void};
+}
diff --git a/pkg/front_end/testcases/general/warn_unresolved_sends.dart.weak.modular.expect b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.weak.modular.expect
new file mode 100644
index 0000000..300333f2
--- /dev/null
+++ b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.weak.modular.expect
@@ -0,0 +1,136 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:48:10: Error: The getter 'missingField' isn't defined for the class 'D'.
+//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.
+//     this.missingField;
+//          ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:49:10: Error: The setter 'missingField' isn't defined for the class 'D'.
+//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.
+//     this.missingField = 0;
+//          ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:50:10: Error: The method 'missingMethod' isn't defined for the class 'D'.
+//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'missingMethod'.
+//     this.missingMethod();
+//          ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:52:5: Error: The getter 'missingField' isn't defined for the class 'D'.
+//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.
+//     missingField;
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:53:5: Error: The setter 'missingField' isn't defined for the class 'D'.
+//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.
+//     missingField = 0;
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:54:5: Error: The method 'missingMethod' isn't defined for the class 'D'.
+//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'missingMethod'.
+//     missingMethod();
+//     ^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic superField = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method superMethod() → dynamic {}
+  get setterOnly() → dynamic
+    return null;
+  set setterOnly(dynamic _) → void {}
+  get getterOnly() → dynamic
+    return null;
+  set getterOnly(dynamic _) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  field dynamic field = null;
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set setterOnly(dynamic _) → void {}
+  get getterOnly() → dynamic
+    return null;
+  method method() → dynamic {}
+  method test() → void {
+    this.{self::D::field}{dynamic};
+    this.{self::C::superField}{dynamic};
+    this.{self::D::field} = 0;
+    this.{self::C::superField} = 0;
+    this.{self::D::method}(){() →* dynamic};
+    this.{self::C::superMethod}(){() →* dynamic};
+    this.{self::C::setterOnly}{dynamic};
+    this.{self::D::setterOnly} = 0;
+    this.{self::D::getterOnly}{dynamic};
+    this.{self::C::getterOnly} = 0;
+    this.{self::D::field}{dynamic};
+    this.{self::C::superField}{dynamic};
+    this.{self::D::field} = 0;
+    this.{self::C::superField} = 0;
+    this.{self::D::method}(){() →* dynamic};
+    this.{self::C::superMethod}(){() →* dynamic};
+    this.{self::C::setterOnly}{dynamic};
+    this.{self::D::setterOnly} = 0;
+    this.{self::D::getterOnly}{dynamic};
+    this.{self::C::getterOnly} = 0;
+    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:48:10: Error: The getter 'missingField' isn't defined for the class 'D'.
+ - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.
+    this.missingField;
+         ^^^^^^^^^^^^" in this{<unresolved>}.missingField;
+    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:49:10: Error: The setter 'missingField' isn't defined for the class 'D'.
+ - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.
+    this.missingField = 0;
+         ^^^^^^^^^^^^" in this{<unresolved>}.missingField = 0;
+    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:50:10: Error: The method 'missingMethod' isn't defined for the class 'D'.
+ - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'missingMethod'.
+    this.missingMethod();
+         ^^^^^^^^^^^^^" in this{<unresolved>}.missingMethod();
+    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:52:5: Error: The getter 'missingField' isn't defined for the class 'D'.
+ - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.
+    missingField;
+    ^^^^^^^^^^^^" in this{<unresolved>}.missingField;
+    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:53:5: Error: The setter 'missingField' isn't defined for the class 'D'.
+ - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.
+    missingField = 0;
+    ^^^^^^^^^^^^" in this{<unresolved>}.missingField = 0;
+    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:54:5: Error: The method 'missingMethod' isn't defined for the class 'D'.
+ - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'missingMethod'.
+    missingMethod();
+    ^^^^^^^^^^^^^" in this{<unresolved>}.missingMethod();
+  }
+}
+class E extends self::D {
+  field dynamic missingField = null;
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  method missingMethod() → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.modular.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.modular.expect
new file mode 100644
index 0000000..a688b79
--- /dev/null
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.weak.modular.expect
@@ -0,0 +1,116 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:8:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num> fieldOfA; // Error.
+//          ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:9:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> staticFieldOfA; // Error.
+//                 ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+//             ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   static A<num> fieldOfE; // Error.
+//                 ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:15:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num> fooOfE() => null; // Error.
+//                ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void barOfE(A<num> a) {} // Error.
+//                      ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   void bazOfE<Y extends A<num>>() {} // Error.
+//               ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  field self::A<core::num*>* fieldOfA = null;
+  static field self::A<core::num*>* staticFieldOfA = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension E<X extends self::A<core::num*>*> on self::A<core::int*>* {
+  static field fieldOfE = self::E|fieldOfE;
+  method fooOfE = self::E|fooOfE;
+  tearoff fooOfE = self::E|get#fooOfE;
+  method barOfE = self::E|barOfE;
+  tearoff barOfE = self::E|get#barOfE;
+  method bazOfE = self::E|bazOfE;
+  tearoff bazOfE = self::E|get#bazOfE;
+}
+static field self::A<core::num*>* E|fieldOfE;
+static method E|fooOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → self::A<core::num*>*
+  return null;
+static method E|get#fooOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → () →* self::A<core::num*>*
+  return () → self::A<core::num*>* => self::E|fooOfE<self::E|get#fooOfE::X*>(#this);
+static method E|barOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this, self::A<core::num*>* a) → void {}
+static method E|get#barOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → (self::A<core::num*>*) →* void
+  return (self::A<core::num*>* a) → void => self::E|barOfE<self::E|get#barOfE::X*>(#this, a);
+static method E|bazOfE<X extends self::A<core::num*>*, Y extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → void {}
+static method E|get#bazOfE<X extends self::A<core::num*>*>(lowered final self::A<core::int*>* #this) → <Y extends self::A<core::num*>*>() →* void
+  return <Y extends self::A<core::num*>*>() → void => self::E|bazOfE<self::E|get#bazOfE::X*, Y*>(#this);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/with_dependencies/abstract_members_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/abstract_members_from_dill/main.dart.weak.modular.expect
new file mode 100644
index 0000000..f1e3ba3
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/abstract_members_from_dill/main.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class B extends mai::A {
+  synthetic constructor •() → self::B*
+    : super mai::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/with_dependencies/extension_from_dill/extension_from_dill.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/extension_from_dill/extension_from_dill.dart.weak.modular.expect
new file mode 100644
index 0000000..85f323d
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/extension_from_dill/extension_from_dill.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "extension_from_dill_lib2.dart" as ext;
+
+import "org-dartlang-testcase:///extension_from_dill_lib.dart";
+
+static method main() → dynamic {
+  ext::Extension|foo("");
+}
diff --git a/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.weak.modular.expect
new file mode 100644
index 0000000..c6ae209
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/issue43538/main.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "const_lib.dart" as con;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///const_lib.dart";
+
+static const field con::B* crossModule = #C3;
+static method main() → dynamic {
+  self::expect(2.71, #C3.{con::A::d}{core::double*});
+  self::expect("default", #C3.{con::A::s}{core::String*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = 2.71
+  #C2 = "default"
+  #C3 = con::B {d:#C1, s:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- B. (from org-dartlang-testcase:///const_lib.dart:16:9)
+- _B&A&M. (from org-dartlang-testcase:///const_lib.dart:15:7)
+- A. (from org-dartlang-testcase:///const_lib.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/with_dependencies/issue_43084/issue_43084.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/issue_43084/issue_43084.dart.weak.modular.expect
new file mode 100644
index 0000000..d7417c6
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/issue_43084/issue_43084.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/with_dependencies/issue_43084/issue_43084.dart:8:20: Error: Couldn't find constructor 'Bar'.
+//   Bar<int> x = new Bar<int>();
+//                    ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue_43084_lib.dart";
+
+static method main() → dynamic {
+  invalid-type x = invalid-expression "pkg/front_end/testcases/general/with_dependencies/issue_43084/issue_43084.dart:8:20: Error: Couldn't find constructor 'Bar'.
+  Bar<int> x = new Bar<int>();
+                   ^^^";
+  core::print(x);
+}
diff --git a/pkg/front_end/testcases/general/with_dependencies/issue_43084_2/issue_43084.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/issue_43084_2/issue_43084.dart.weak.modular.expect
new file mode 100644
index 0000000..1854736
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/issue_43084_2/issue_43084.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/with_dependencies/issue_43084_2/issue_43084.dart:8:3: Error: Couldn't find constructor 'F'.
+//   F();
+//   ^
+//
+import self as self;
+
+import "org-dartlang-testcase:///issue_43084_lib.dart";
+
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/general/with_dependencies/issue_43084_2/issue_43084.dart:8:3: Error: Couldn't find constructor 'F'.
+  F();
+  ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/with_dependencies/mixin_from_dill/mixin_from_dill.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/mixin_from_dill/mixin_from_dill.dart.weak.modular.expect
new file mode 100644
index 0000000..fc924c0
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/mixin_from_dill/mixin_from_dill.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library;
+import self as self;
+import "mixin_from_dill_lib1.dart" as mix;
+import "dart:core" as core;
+import "mixin_from_dill_lib2.dart" as mix2;
+
+import "org-dartlang-testcase:///mixin_from_dill_lib1.dart" as lib1;
+import "org-dartlang-testcase:///mixin_from_dill_lib2.dart" as lib2;
+
+static method main() → dynamic {
+  mix::Foo* foo1 = new mix::Foo::•();
+  if(foo1 == null)
+    throw "what?";
+  if(!(foo1 =={mix::_Foo&B&D::==}{(dynamic) →* core::bool*} foo1))
+    throw "what?";
+  foo1.{mix::_Foo&B&D::x}(){() →* void};
+  mix2::Foo* foo2 = new mix2::Foo::•();
+  if(foo2 == null)
+    throw "what?";
+  if(!(foo2 =={mix2::_Foo&B&D::==}{(dynamic) →* core::bool*} foo2))
+    throw "what?";
+  foo2.{mix2::_Foo&B&D::x}(){() →* void};
+}
+
+library;
+import self as mix2;
+import "dart:core" as core;
+
+abstract class _Foo&B&D = mix2::B with mix2::D /*isAnonymousMixin*/  {
+  synthetic constructor •() → mix2::_Foo&B&D*
+    : super mix2::B::•()
+    ;
+  mixin-super-stub operator ==(dynamic dynamic) → core::bool*
+    return super.{mix2::D::==}(dynamic);
+  mixin-super-stub method x() → void
+    return super.{mix2::D::x}();
+}
+class Foo extends mix2::_Foo&B&D {
+  synthetic constructor •() → mix2::Foo*
+    : super mix2::_Foo&B&D::•()
+    ;
+}
+abstract class B extends core::Object implements mix2::C {
+  synthetic constructor •() → mix2::B*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic dynamic) → core::bool* {
+    core::print("B.==");
+    return true;
+  }
+  method x() → void {
+    core::print("B.x");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → mix2::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object implements mix2::C {
+  synthetic constructor •() → mix2::D*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic dynamic) → core::bool* {
+    core::print("D.==");
+    return true;
+  }
+  method x() → void {
+    core::print("D.x");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/with_dependencies/mixin_from_dill/mixin_from_dill.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/mixin_from_dill/mixin_from_dill.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..787fde3
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/mixin_from_dill/mixin_from_dill.no_link.dart.weak.modular.expect
@@ -0,0 +1,175 @@
+library;
+import self as self;
+import "mixin_from_dill_lib1.dart" as mix;
+import "dart:core" as core;
+import "mixin_from_dill_lib2.dart" as mix2;
+
+import "org-dartlang-testcase:///mixin_from_dill_lib1.dart" as lib1;
+import "org-dartlang-testcase:///mixin_from_dill_lib2.dart" as lib2;
+
+static method main() → dynamic {
+  mix::Foo* foo1 = new mix::Foo::•();
+  if(foo1 == null)
+    throw "what?";
+  if(!(foo1 =={mix::_Foo&B&D::==}{(dynamic) →* core::bool*} foo1))
+    throw "what?";
+  foo1.{mix::_Foo&B&D::x}(){() →* void};
+  mix2::Foo* foo2 = new mix2::Foo::•();
+  if(foo2 == null)
+    throw "what?";
+  if(!(foo2 =={mix2::_Foo&B&D::==}{(dynamic) →* core::bool*} foo2))
+    throw "what?";
+  foo2.{mix2::_Foo&B&D::x}(){() →* void};
+}
+
+library;
+import self as mix;
+import "dart:core" as core;
+
+abstract class _Foo&B&D = mix::B with mix::D /*isAnonymousMixin*/  {
+  synthetic constructor •() → mix::_Foo&B&D*
+    : super mix::B::•()
+    ;
+  mixin-super-stub operator ==(dynamic dynamic) → core::bool*
+    return super.{mix::D::==}(dynamic);
+  mixin-super-stub method x() → void
+    return super.{mix::D::x}();
+}
+class Foo extends mix::_Foo&B&D {
+  synthetic constructor •() → mix::Foo*
+    : super mix::_Foo&B&D::•()
+    ;
+}
+abstract class B extends core::Object implements mix::C {
+  synthetic constructor •() → mix::B*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic dynamic) → core::bool* {
+    core::print("B.==");
+    return true;
+  }
+  method x() → void {
+    core::print("B.x");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → mix::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object implements mix::C {
+  synthetic constructor •() → mix::D*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic dynamic) → core::bool* {
+    core::print("D.==");
+    return true;
+  }
+  method x() → void {
+    core::print("D.x");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library;
+import self as mix2;
+import "dart:core" as core;
+
+abstract class _Foo&B&D = mix2::B with mix2::D /*isAnonymousMixin*/  {
+  synthetic constructor •() → mix2::_Foo&B&D*
+    : super mix2::B::•()
+    ;
+  mixin-super-stub operator ==(dynamic dynamic) → core::bool*
+    return super.{mix2::D::==}(dynamic);
+  mixin-super-stub method x() → void
+    return super.{mix2::D::x}();
+}
+class Foo extends mix2::_Foo&B&D {
+  synthetic constructor •() → mix2::Foo*
+    : super mix2::_Foo&B&D::•()
+    ;
+}
+abstract class B extends core::Object implements mix2::C {
+  synthetic constructor •() → mix2::B*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic dynamic) → core::bool* {
+    core::print("B.==");
+    return true;
+  }
+  method x() → void {
+    core::print("B.x");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → mix2::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object implements mix2::C {
+  synthetic constructor •() → mix2::D*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic dynamic) → core::bool* {
+    core::print("D.==");
+    return true;
+  }
+  method x() → void {
+    core::print("D.x");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.weak.modular.expect
new file mode 100644
index 0000000..02192bf
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "stub_or_not_lib1.dart" as stu;
+
+import "org-dartlang-testcase:///stub_or_not_lib1.dart";
+
+class ProblemClass extends stu::Foo {
+  synthetic constructor •() → self::ProblemClass*
+    : super stu::Foo::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..68cbb20
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/stub_or_not/stub_or_not.no_link.dart.weak.modular.expect
@@ -0,0 +1,89 @@
+library;
+import self as self;
+import "stub_or_not_lib1.dart" as stu;
+
+import "org-dartlang-testcase:///stub_or_not_lib1.dart";
+
+class ProblemClass extends stu::Foo {
+  synthetic constructor •() → self::ProblemClass*
+    : super stu::Foo::•()
+    ;
+}
+static method main() → dynamic {}
+
+library;
+import self as stu;
+import "dart:core" as core;
+import "stub_or_not_lib2.dart" as stu2;
+
+import "org-dartlang-testcase:///stub_or_not_lib2.dart";
+
+abstract class Qux extends core::Object implements stu2::EventFileA {
+  synthetic constructor •() → stu::Qux*
+    : super core::Object::•()
+    ;
+  method handleEvent(covariant-by-declaration stu2::EvenFileB* entry) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class EvenFileBPrime extends stu2::EvenFileB {
+  synthetic constructor •() → stu::EvenFileBPrime*
+    : super stu2::EvenFileB::•()
+    ;
+}
+abstract class Baz extends stu::Qux {
+  synthetic constructor •() → stu::Baz*
+    : super stu::Qux::•()
+    ;
+  method handleEvent(covariant-by-declaration stu::EvenFileBPrime* entry) → void {}
+}
+abstract class Foo extends stu::Baz implements stu::Qux {
+  synthetic constructor •() → stu::Foo*
+    : super stu::Baz::•()
+    ;
+  abstract member-signature method handleEvent(covariant-by-declaration stu2::EvenFileB* entry) → void; -> stu::Qux::handleEvent
+}
+
+library;
+import self as stu2;
+import "dart:core" as core;
+
+abstract class EventFileA extends core::Object {
+  synthetic constructor •() → stu2::EventFileA*
+    : super core::Object::•()
+    ;
+  abstract method handleEvent(stu2::EvenFileB* entry) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class EvenFileB extends core::Object {
+  synthetic constructor •() → stu2::EvenFileB*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.weak.modular.expect b/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.weak.modular.expect
new file mode 100644
index 0000000..18c9317
--- /dev/null
+++ b/pkg/front_end/testcases/general/with_dependencies/variance_from_dill/variance_from_dill.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///variance_from_dill_lib.dart";
+
+typedef G<unrelated T extends core::Object? = dynamic> = (() → dynamic) → dynamic;
+static method main() → dynamic {
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = TypeLiteralConstant((() →* dynamic) →* dynamic)
+}
diff --git a/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..5d340a4
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+// typedef void G<@A<dynamic>() T>(T t);
+//                           ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+// void method1<@A<String>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:9:22: Error: Too few positional arguments: 1 required, 0 given.
+// void Function<@A<int>() T>(T)? f;
+//                      ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:18:35: Error: Too few positional arguments: 1 required, 0 given.
+// void method2(void Function<@A<num>() T>(T) f) {}
+//                                   ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void local<@A<double>() T>(T t) {}
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:26:24: Error: Too few positional arguments: 1 required, 0 given.
+//   void Function<@A<int>() T>(T)? f;
+//                        ^
+// pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A(o);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:14:27: Error: Too few positional arguments: 1 required, 0 given.
+typedef void G<@A<dynamic>() T>(T t);
+                          ^" contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic o) → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:16:24: Error: Too few positional arguments: 1 required, 0 given.
+void method1<@A<String>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@invalid-expression "pkg/front_end/testcases/generic_metadata/erroneous_function_type_parameter.dart:24:24: Error: Too few positional arguments: 1 required, 0 given.
+  void local<@A<double>() T>(T t) {}
+                       ^" T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
diff --git a/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.modular.expect
new file mode 100644
index 0000000..6900388
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/from_dill/main.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+static method main() → dynamic {
+  mai::C1<<T extends core::Object? = dynamic>(T%) → T%> c1 = new mai::C1::•<<T extends core::Object? = dynamic>(T%) → T%>();
+  mai::C1<<T extends core::Object? = dynamic>(T%) → T%> c2 = new mai::C1::•<<T extends core::Object? = dynamic>(T%) → T%>();
+  mai::C2<<T extends core::Object? = dynamic>() → void> c3 = new mai::C2::•<<T extends core::Object? = dynamic>() → void>();
+  mai::C2<<T extends core::Object? = dynamic>() → void> c4 = new mai::C2::•<<int extends core::Object? = dynamic>() → void>();
+  mai::C3<<T extends core::Object? = dynamic>() → T%> c5 = new mai::C3::•<<T extends core::Object? = dynamic>() → T%>();
+  mai::C3<<T extends core::Object? = dynamic>() → T%> c6 = new mai::C3::•<<T extends core::Object? = dynamic>() → T%>();
+  mai::C4<<T extends core::Object? = dynamic>(T%) → void> c7 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
+  mai::C4<<T extends core::Object? = dynamic>(T%) → void> c8 = new mai::C4::•<<T extends core::Object? = dynamic>(T%) → void>();
+  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c9 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T>();
+  mai::C5<<T extends <S extends core::Object? = dynamic>(S%) → S% = dynamic>(T) → T> c10 = new mai::C5::•<<T extends <S extends core::Object? = dynamic>(S%) → S%>(T) → T>();
+  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c11 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
+  mai::C6<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S% = dynamic, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%> c12 = new mai::C6::•<<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(T%, S%, <V extends S%, U extends core::Object? = dynamic>(T%, U%, V%, core::Map<S%, U%>) → V%) → T%>();
+}
diff --git a/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..d081a19
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/function_type_parameter.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <T extends core::Object? = dynamic>(T%) → void;
+typedef G<@#C1 contravariant T extends core::Object? = dynamic> = (T%) → void;
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Class<T extends <S extends core::Object? = dynamic>(S%) → void> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T>
+    : super core::Object::•()
+    ;
+}
+static field <T extends core::Object? = dynamic>(T%) →? void f;
+static method method1<@#C2 T extends core::Object? = dynamic>(self::method1::T% t) → void {}
+static method method2(<T extends core::Object? = dynamic>(T%) → void f) → void {}
+static method main() → dynamic {
+  function local<@#C3 T extends core::Object? = dynamic>(T% t) → void {}
+  <T extends core::Object? = dynamic>(T%) →? void f;
+}
+
+constants  {
+  #C1 = self::A<dynamic> {}
+  #C2 = self::A<core::String*> {}
+  #C3 = self::A<core::double*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///function_type_parameter.dart:
+- A. (from org-dartlang-testcase:///function_type_parameter.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.modular.expect
new file mode 100644
index 0000000..b60d2ce
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/generic_metadata.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments.
+// @A<int, num>() // error
+//  ^
+// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:6:9: Context: Found this candidate, but the arguments don't match.
+//   const A();
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments.
+// @B<int>() // error
+//  ^
+// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:10:9: Context: Found this candidate, but the arguments don't match.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:23:2: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'T' on 'C'.
+// Try changing type arguments so that they conform to the bounds.
+// @C<String>() // error
+//  ^
+// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class C<T extends num> {
+//         ^
+//
+// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:24:2: Error: Type argument 'num' doesn't conform to the bound 'S' of the type variable 'T' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// @D<int, num>() // error
+//  ^
+// pkg/front_end/testcases/generic_metadata/generic_metadata.dart:17:24: Context: This is the type variable whose bound isn't conformed to.
+// class D<S extends num, T extends S> {
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class B<S extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::B<self::B::S%, self::B::T%>
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::num> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+}
+class D<S extends core::num, T extends self::D::S = core::num> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::D<self::D::S, self::D::T>
+    : super core::Object::•()
+    ;
+}
+@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:21:2: Error: Expected 1 type arguments.
+@A<int, num>() // error
+ ^"
+@invalid-expression "pkg/front_end/testcases/generic_metadata/generic_metadata.dart:22:2: Error: Expected 2 type arguments.
+@B<int>() // error
+ ^"
+@#C1
+@#C2
+static method test() → dynamic {}
+@#C3
+@#C4
+@#C5
+@#C6
+@#C7
+@#C7
+@#C8
+@#C9
+@#C9
+@#C10
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<core::String*> {}
+  #C2 = self::D<core::int*, core::num*> {}
+  #C3 = self::A<dynamic> {}
+  #C4 = self::A<core::int*> {}
+  #C5 = self::B<dynamic, dynamic> {}
+  #C6 = self::B<core::int*, core::String*> {}
+  #C7 = self::C<core::num*> {}
+  #C8 = self::C<core::int*> {}
+  #C9 = self::D<core::num*, core::num*> {}
+  #C10 = self::D<core::num*, core::int*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///generic_metadata.dart:
+- C. (from org-dartlang-testcase:///generic_metadata.dart:14:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- D. (from org-dartlang-testcase:///generic_metadata.dart:18:9)
+- A. (from org-dartlang-testcase:///generic_metadata.dart:6:9)
+- B. (from org-dartlang-testcase:///generic_metadata.dart:10:9)
diff --git a/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..86bb196
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/inferred_generic_types_in_arguments_and_bounds.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+static method foo<Y extends core::Object? = dynamic>(self::foo::Y% y) → self::A<self::foo::Y%>
+  return throw 42;
+static method test() → dynamic {
+  self::A<<Z extends core::Object? = dynamic>(dynamic) → Never> x = self::foo<<Z extends core::Object? = dynamic>(dynamic) → Never>(<Z extends core::Object? = dynamic>(dynamic Z) → Never => throw 42);
+  core::List<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> y = <<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>[#C1];
+  core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> z = block {
+    final core::Set<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>> #t1 = col::LinkedHashSet::•<<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>>();
+    #t1.{core::Set::add}{Invariant}(y.{core::Iterable::first}{<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>}){(<Y extends core::Object? = dynamic>(Y%) → self::A<Y%>) → core::bool};
+  } =>#t1;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.modular.expect
new file mode 100644
index 0000000..3dbf472
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45329.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/issue45329.dart:6:9: Error: Expected an identifier, but got 'void'.
+// Try inserting an identifier before 'void'.
+//   local<void Function()>() {}
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function local<#T1 extends core::Object? = dynamic>() → Null {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.modular.expect
new file mode 100644
index 0000000..156f3fb
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/issue45330.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/generic_metadata/issue45330.dart:10:31: Error: Type 'T' is a bound of itself via 'T'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//   genericMethod<void Function<T extends T>()>();
+//                               ^
+//
+// pkg/front_end/testcases/generic_metadata/issue45330_lib.dart:35:31: Error: Type 'T' is a bound of itself via 'T'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+//   genericMethod<void Function<T extends T>()>();
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+part issue45330_lib.dart;
+static method genericMethod<T extends core::Object? = dynamic>() → void {}
+static method testInMain() → dynamic {
+  self::genericMethod<<T extends invalid-type>() → void>();
+}
+static method main() → dynamic {}
+static method /* from org-dartlang-testcase:///issue45330_lib.dart */ testInPart() → dynamic {
+  self::genericMethod<<T extends invalid-type>() → void>();
+}
diff --git a/pkg/front_end/testcases/generic_metadata/nested_generic_arguments_and_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/nested_generic_arguments_and_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..5c86a64
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/nested_generic_arguments_and_bounds.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant U extends core::Object? = dynamic> = <V extends U% = dynamic>(V%) → dynamic;
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+static method foo() → self::A<<Y extends <Z extends core::Object? = dynamic>(Z%) → dynamic = dynamic>(Y) → dynamic>
+  return throw 42;
+static method bar() → self::A<<V extends <W extends core::Object? = dynamic>(W%) → dynamic = dynamic>(V) → dynamic>
+  return throw 42;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..3c45ce6
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/simple_generic_types_in_arguments_and_bounds.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B extends self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::Z>
+    : super core::Object::•()
+    ;
+}
+static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
+  return throw 42;
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+  return throw 42;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.modular.expect
new file mode 100644
index 0000000..f970a2a
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/type_parameters_in_default_types.dart.weak.modular.expect
@@ -0,0 +1,5 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method foo<X extends <Y extends self::foo::X = dynamic>() → dynamic = <Y extends dynamic>() → dynamic>() → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..e853954
--- /dev/null
+++ b/pkg/front_end/testcases/generic_metadata/typedef_generic_types_in_arguments_and_bounds.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = <Y extends core::Object? = dynamic>(Y%) → dynamic;
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B extends self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C<Z extends <Y extends core::Object? = dynamic>(Y%) → dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::Z>
+    : super core::Object::•()
+    ;
+}
+static method foo(self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic> x) → self::A<<Y extends core::Object? = dynamic>(Y%) → dynamic>
+  return throw 42;
+static method bar<V extends <Y extends core::Object? = dynamic>(Y%) → dynamic>() → dynamic
+  return throw 42;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.modular.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.modular.expect
new file mode 100644
index 0000000..90a2cad
--- /dev/null
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.modular.expect
@@ -0,0 +1,187 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::Function* field1a = #C1;
+  field () →* core::int* field1b = #C1;
+  field (core::int*) →* core::int* field2 = #C2;
+  field (core::int*, core::int*) →* core::int* field3 = #C3;
+  field (core::int*, [core::int*]) →* core::int* field4 = #C4;
+  field ([core::int*, core::int*]) →* core::int* field5 = #C5;
+  field (core::int*, {b: core::int*}) →* core::int* field6 = #C6;
+  field ({a: core::int*, b: core::int*}) →* core::int* field7 = #C7;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  get getter1a() → core::Function*
+    return #C1;
+  get getter1b() → () →* core::int*
+    return #C1;
+  get getter2() → (core::int*) →* core::int*
+    return #C2;
+  get getter3() → (core::int*, core::int*) →* core::int*
+    return #C3;
+  get getter4() → (core::int*, [core::int*]) →* core::int*
+    return #C4;
+  get getter5() → ([core::int*, core::int*]) →* core::int*
+    return #C5;
+  get getter6() → (core::int*, {b: core::int*}) →* core::int*
+    return #C6;
+  get getter7() → ({a: core::int*, b: core::int*}) →* core::int*
+    return #C7;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass*
+    : super self::Class::•()
+    ;
+  get field1a() → core::Function* {
+    self::enableRead = false;
+    return #C1;
+  }
+  get field1b() → () →* core::int* {
+    self::enableRead = false;
+    return #C1;
+  }
+  get field2() → (core::int*) →* core::int* {
+    self::enableRead = false;
+    return #C2;
+  }
+  get field3() → (core::int*, core::int*) →* core::int* {
+    self::enableRead = false;
+    return #C3;
+  }
+  get field4() → (core::int*, [core::int*]) →* core::int* {
+    self::enableRead = false;
+    return #C4;
+  }
+  get field5() → ([core::int*, core::int*]) →* core::int* {
+    self::enableRead = false;
+    return #C5;
+  }
+  get field6() → (core::int*, {b: core::int*}) →* core::int* {
+    self::enableRead = false;
+    return #C6;
+  }
+  get field7() → ({a: core::int*, b: core::int*}) →* core::int* {
+    self::enableRead = false;
+    return #C7;
+  }
+  get getter1a() → core::Function* {
+    self::enableRead = false;
+    return #C1;
+  }
+  get getter1b() → () →* core::int* {
+    self::enableRead = false;
+    return #C1;
+  }
+  get getter2() → (core::int*) →* core::int* {
+    self::enableRead = false;
+    return #C2;
+  }
+  get getter3() → (core::int*, core::int*) →* core::int* {
+    self::enableRead = false;
+    return #C3;
+  }
+  get getter4() → (core::int*, [core::int*]) →* core::int* {
+    self::enableRead = false;
+    return #C4;
+  }
+  get getter5() → ([core::int*, core::int*]) →* core::int* {
+    self::enableRead = false;
+    return #C5;
+  }
+  get getter6() → (core::int*, {b: core::int*}) →* core::int* {
+    self::enableRead = false;
+    return #C6;
+  }
+  get getter7() → ({a: core::int*, b: core::int*}) →* core::int* {
+    self::enableRead = false;
+    return #C7;
+  }
+}
+static field core::bool* enableRead = true;
+static method read(core::int* value) → core::int*
+  return self::enableRead ?{core::int*} value : 1.{core::int::unary-}(){() →* core::int*};
+static method method1() → core::int*
+  return 0;
+static method method2(core::int* a) → core::int*
+  return a.{core::int::unary-}(){() →* core::int*};
+static method method3(core::int* a, core::int* b) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method method4(core::int* a, [core::int* b = #C8]) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method method5([core::int* a = #C8, core::int* b = #C8]) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method method6(core::int* a, {core::int* b = #C8}) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method method7({core::int* a = #C8, core::int* b = #C8}) → core::int*
+  return a.{core::num::-}(b){(core::num*) →* core::int*};
+static method main() → dynamic {
+  self::callField(new self::Class::•());
+  self::callGetter(new self::Class::•());
+  self::callField(new self::Subclass::•());
+  self::callGetter(new self::Subclass::•());
+}
+static method callField(self::Class* c) → dynamic {
+  self::expect(0, c.{self::Class::field1a}());
+  self::expect(0, c.{self::Class::field1b}(){() →* core::int*});
+  self::expect(42.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t1 = c in let final core::int* #t2 = self::read(42) in #t1.{self::Class::field2}(#t2){(core::int*) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t3 = c in let final core::int* #t4 = self::read(12) in let final core::int* #t5 = self::read(23) in #t3.{self::Class::field3}(#t4, #t5){(core::int*, core::int*) →* core::int*});
+  self::expect(12, let final self::Class* #t6 = c in let final core::int* #t7 = self::read(12) in #t6.{self::Class::field4}(#t7){(core::int*, [core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t8 = c in let final core::int* #t9 = self::read(12) in let final core::int* #t10 = self::read(23) in #t8.{self::Class::field4}(#t9, #t10){(core::int*, [core::int*]) →* core::int*});
+  self::expect(0, c.{self::Class::field5}(){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t11 = c in let final core::int* #t12 = self::read(12) in #t11.{self::Class::field5}(#t12){([core::int*, core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t13 = c in let final core::int* #t14 = self::read(12) in let final core::int* #t15 = self::read(23) in #t13.{self::Class::field5}(#t14, #t15){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t16 = c in let final core::int* #t17 = self::read(12) in #t16.{self::Class::field6}(#t17){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t18 = c in let final core::int* #t19 = self::read(12) in let final core::int* #t20 = self::read(23) in #t18.{self::Class::field6}(#t19, b: #t20){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(0, c.{self::Class::field7}(){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(12, let final self::Class* #t21 = c in let final core::int* #t22 = self::read(12) in #t21.{self::Class::field7}(a: #t22){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(23.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t23 = c in let final core::int* #t24 = self::read(23) in #t23.{self::Class::field7}(b: #t24){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t25 = c in let final core::int* #t26 = self::read(12) in let final core::int* #t27 = self::read(23) in #t25.{self::Class::field7}(a: #t26, b: #t27){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t28 = c in let final core::int* #t29 = self::read(23) in let final core::int* #t30 = self::read(12) in #t28.{self::Class::field7}(b: #t29, a: #t30){({a: core::int*, b: core::int*}) →* core::int*});
+}
+static method callGetter(self::Class* c) → dynamic {
+  self::expect(0, c.{self::Class::getter1a}());
+  self::expect(0, c.{self::Class::getter1b}(){() →* core::int*});
+  self::expect(42.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t31 = c in let final core::int* #t32 = self::read(42) in #t31.{self::Class::getter2}(#t32){(core::int*) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t33 = c in let final core::int* #t34 = self::read(12) in let final core::int* #t35 = self::read(23) in #t33.{self::Class::getter3}(#t34, #t35){(core::int*, core::int*) →* core::int*});
+  self::expect(12, let final self::Class* #t36 = c in let final core::int* #t37 = self::read(12) in #t36.{self::Class::getter4}(#t37){(core::int*, [core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t38 = c in let final core::int* #t39 = self::read(12) in let final core::int* #t40 = self::read(23) in #t38.{self::Class::getter4}(#t39, #t40){(core::int*, [core::int*]) →* core::int*});
+  self::expect(0, c.{self::Class::getter5}(){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t41 = c in let final core::int* #t42 = self::read(12) in #t41.{self::Class::getter5}(#t42){([core::int*, core::int*]) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t43 = c in let final core::int* #t44 = self::read(12) in let final core::int* #t45 = self::read(23) in #t43.{self::Class::getter5}(#t44, #t45){([core::int*, core::int*]) →* core::int*});
+  self::expect(12, let final self::Class* #t46 = c in let final core::int* #t47 = self::read(12) in #t46.{self::Class::getter6}(#t47){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t48 = c in let final core::int* #t49 = self::read(12) in let final core::int* #t50 = self::read(23) in #t48.{self::Class::getter6}(#t49, b: #t50){(core::int*, {b: core::int*}) →* core::int*});
+  self::expect(0, c.{self::Class::getter7}(){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(12, let final self::Class* #t51 = c in let final core::int* #t52 = self::read(12) in #t51.{self::Class::getter7}(a: #t52){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(23.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t53 = c in let final core::int* #t54 = self::read(23) in #t53.{self::Class::getter7}(b: #t54){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t55 = c in let final core::int* #t56 = self::read(12) in let final core::int* #t57 = self::read(23) in #t55.{self::Class::getter7}(a: #t56, b: #t57){({a: core::int*, b: core::int*}) →* core::int*});
+  self::expect(11.{core::int::unary-}(){() →* core::int*}, let final self::Class* #t58 = c in let final core::int* #t59 = self::read(23) in let final core::int* #t60 = self::read(12) in #t58.{self::Class::getter7}(b: #t59, a: #t60){({a: core::int*, b: core::int*}) →* core::int*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  self::enableRead = true;
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, ${actual}";
+}
+
+constants  {
+  #C1 = static-tearoff self::method1
+  #C2 = static-tearoff self::method2
+  #C3 = static-tearoff self::method3
+  #C4 = static-tearoff self::method4
+  #C5 = static-tearoff self::method5
+  #C6 = static-tearoff self::method6
+  #C7 = static-tearoff self::method7
+  #C8 = 0
+}
diff --git a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.modular.expect b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.modular.expect
new file mode 100644
index 0000000..c46c847
--- /dev/null
+++ b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  field (self::A::T*) →* void f;
+  constructor •((self::A::T*) →* void f) → self::A<self::A::T*>*
+    : self::A::f = f, super core::Object::•()
+    ;
+  method foo(covariant-by-class self::A::T* x) → dynamic
+    return let final self::A::T* #t1 = x in this.{self::A::f}(#t1){(self::A::T*) →* void};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3){(core::int*) →* dynamic};
+}
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml b/pkg/front_end/testcases/incremental/change_main.yaml
new file mode 100644
index 0000000..e7167fa
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml
@@ -0,0 +1,59 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Change entry point between deltas, provoking the read of the new entry
+# point before the read of the previous entry point. This triggers the crash
+# in https://github.com/flutter/flutter/issues/95014
+
+type: newworld
+worlds:
+  - entry: first.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      first.dart: |
+        import 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {}
+      second.dart: |
+        import 'first.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method2() {}
+    expectedLibraryCount: 2
+  - entry: second.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      [second.dart, first.dart]
+    sources:
+      first.dart: |
+        import 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {
+          print('method1');
+        }
+      second.dart: |
+        import 'first.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method2() {
+          print('method2');
+        }
+    expectedLibraryCount: 2
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect b/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect
new file mode 100644
index 0000000..1e283df
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect
@@ -0,0 +1,21 @@
+main = fir::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+  import "org-dartlang-test:///second.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method1() → dynamic {}
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+  import "org-dartlang-test:///first.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method2() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect b/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect
new file mode 100644
index 0000000..df10188
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect
@@ -0,0 +1,25 @@
+main = sec::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+  import "org-dartlang-test:///second.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method1() → dynamic {
+    dart.core::print("method1");
+  }
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+  import "org-dartlang-test:///first.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method2() → dynamic {
+    dart.core::print("method2");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental/change_main2.yaml b/pkg/front_end/testcases/incremental/change_main2.yaml
new file mode 100644
index 0000000..1ceabb1
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main2.yaml
@@ -0,0 +1,45 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+type: newworld
+worlds:
+  - entry: first.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      first.dart: |
+        import 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {}
+      second.dart: |
+        import 'first.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method2() {}
+    expectedLibraryCount: 2
+  - entry: second.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - second.dart
+    sources:
+      second.dart: |
+        import 'first.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method2() {
+          print('method2');
+        }
+    expectedLibraryCount: 2
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental/change_main2.yaml.world.1.expect b/pkg/front_end/testcases/incremental/change_main2.yaml.world.1.expect
new file mode 100644
index 0000000..1e283df
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main2.yaml.world.1.expect
@@ -0,0 +1,21 @@
+main = fir::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+  import "org-dartlang-test:///second.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method1() → dynamic {}
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+  import "org-dartlang-test:///first.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method2() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental/change_main2.yaml.world.2.expect b/pkg/front_end/testcases/incremental/change_main2.yaml.world.2.expect
new file mode 100644
index 0000000..d55656f
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main2.yaml.world.2.expect
@@ -0,0 +1,23 @@
+main = sec::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+  import "org-dartlang-test:///second.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method1() → dynamic {}
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+  import "org-dartlang-test:///first.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method2() → dynamic {
+    dart.core::print("method2");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect b/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
index 9ecd41a..cd22c39 100644
--- a/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/crash_05.yaml.world.1.expect
@@ -56,11 +56,11 @@
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = dart.ffi::Uint32 {}
   #C8 = 0
-  #C9 = <dart.core::int*>[#C8, #C8, #C8]
+  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
   #C10 = "vm:prefer-inline"
   #C11 = dart.core::pragma {name:#C10, options:#C4}
   #C12 = 4
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C13 = <dart.core::int*>[#C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12]
   #C14 = TypeLiteralConstant(lib::Y)
   #C15 = <dart.core::Type>[#C14]
   #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
diff --git a/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect b/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
index 9ecd41a..cd22c39 100644
--- a/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/crash_05.yaml.world.2.expect
@@ -56,11 +56,11 @@
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = dart.ffi::Uint32 {}
   #C8 = 0
-  #C9 = <dart.core::int*>[#C8, #C8, #C8]
+  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
   #C10 = "vm:prefer-inline"
   #C11 = dart.core::pragma {name:#C10, options:#C4}
   #C12 = 4
-  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C13 = <dart.core::int*>[#C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12, #C12]
   #C14 = TypeLiteralConstant(lib::Y)
   #C15 = <dart.core::Type>[#C14]
   #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
diff --git a/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect b/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
index e06b9d6..2b217e2 100644
--- a/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/crash_06.yaml.world.1.expect
@@ -62,7 +62,7 @@
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C8 = <dart.core::int*>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7]
   #C9 = "vm:prefer-inline"
   #C10 = dart.core::pragma {name:#C9, options:#C4}
 }
diff --git a/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect b/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
index e06b9d6..2b217e2 100644
--- a/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/crash_06.yaml.world.2.expect
@@ -62,7 +62,7 @@
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C8 = <dart.core::int*>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7]
   #C9 = "vm:prefer-inline"
   #C10 = dart.core::pragma {name:#C9, options:#C4}
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
index 7f32b12..2e5c180 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
@@ -62,14 +62,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
index 17f1531..a82af2e 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
@@ -66,14 +66,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
index 583ebfd..68633a6 100644
--- a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
@@ -63,14 +63,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
index 3456d148..e925f93 100644
--- a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
@@ -101,19 +101,19 @@
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = 0
-  #C9 = <dart.core::int*>[#C8, #C8, #C8]
-  #C10 = 8
-  #C11 = 4
-  #C12 = <dart.core::int*>[#C10, #C11, #C11]
+  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
+  #C10 = 4
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C10, #C11, #C10, #C11, #C11, #C11, #C10, #C11, #C11, #C10, #C11, #C10, #C11, #C11, #C11, #C11, #C10, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C10, #C10]
-  #C15 = 24
-  #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C16]
+  #C14 = <dart.core::int*>[#C11, #C13, #C11, #C13, #C13, #C13, #C11, #C13, #C13, #C11, #C13, #C11, #C13, #C13, #C13, #C13, #C11, #C13]
+  #C15 = 12
+  #C16 = 24
+  #C17 = <dart.core::int*>[#C15, #C16, #C15, #C16, #C16, #C16, #C15, #C16, #C16, #C15, #C16, #C15, #C16, #C16, #C16, #C16, #C15, #C16]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 48
-  #C21 = <dart.core::int*>[#C20, #C15, #C15]
+  #C21 = <dart.core::int*>[#C16, #C20, #C16, #C20, #C20, #C20, #C16, #C20, #C20, #C16, #C20, #C16, #C20, #C20, #C20, #C20, #C16, #C20]
   #C22 = <dart.core::Type>[#C2, #C2, #C2]
   #C23 = dart.ffi::_FfiStructLayout {fieldTypes:#C22, packing:#C5}
   #C24 = dart.core::pragma {name:#C1, options:#C23}
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
index 3456d148..e925f93 100644
--- a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
@@ -101,19 +101,19 @@
   #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = 0
-  #C9 = <dart.core::int*>[#C8, #C8, #C8]
-  #C10 = 8
-  #C11 = 4
-  #C12 = <dart.core::int*>[#C10, #C11, #C11]
+  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
+  #C10 = 4
+  #C11 = 8
+  #C12 = <dart.core::int*>[#C10, #C11, #C10, #C11, #C11, #C11, #C10, #C11, #C11, #C10, #C11, #C10, #C11, #C11, #C11, #C11, #C10, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C10, #C10]
-  #C15 = 24
-  #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C16]
+  #C14 = <dart.core::int*>[#C11, #C13, #C11, #C13, #C13, #C13, #C11, #C13, #C13, #C11, #C13, #C11, #C13, #C13, #C13, #C13, #C11, #C13]
+  #C15 = 12
+  #C16 = 24
+  #C17 = <dart.core::int*>[#C15, #C16, #C15, #C16, #C16, #C16, #C15, #C16, #C16, #C15, #C16, #C15, #C16, #C16, #C16, #C16, #C15, #C16]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 48
-  #C21 = <dart.core::int*>[#C20, #C15, #C15]
+  #C21 = <dart.core::int*>[#C16, #C20, #C16, #C20, #C20, #C20, #C16, #C20, #C20, #C16, #C20, #C16, #C20, #C20, #C20, #C20, #C16, #C20]
   #C22 = <dart.core::Type>[#C2, #C2, #C2]
   #C23 = dart.ffi::_FfiStructLayout {fieldTypes:#C22, packing:#C5}
   #C24 = dart.core::pragma {name:#C1, options:#C23}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
index 7f32b12..2e5c180 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
@@ -62,14 +62,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
index ea6646e..9d91273 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
@@ -63,14 +63,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
index 127f040..afef6e0 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
@@ -64,14 +64,14 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Double {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <dart.core::int*>[#C13, #C13, #C13]
+  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = dart.core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
index e53139b..3f3d73e 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
@@ -82,26 +82,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 1
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = dart.ffi::Uint64 {}
   #C14 = 8
   #C15 = 4
-  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C16 = <dart.core::int*>[#C14, #C14, #C15, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C14, #C14]
   #C17 = "vm:prefer-inline"
   #C18 = dart.core::pragma {name:#C17, options:#C5}
   #C19 = 16
   #C20 = 12
-  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C21 = <dart.core::int*>[#C19, #C19, #C20, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C19, #C19]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 32
   #C27 = 24
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 40
   #C30 = 28
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
index c5fa703..e241ee1 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
@@ -82,26 +82,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = dart.ffi::Uint64 {}
   #C12 = 8
   #C13 = 4
-  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C14 = <dart.core::int*>[#C12, #C12, #C13, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C12, #C12]
   #C15 = 16
   #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C17 = <dart.core::int*>[#C15, #C15, #C16, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C15, #C15]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 24
-  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C21 = <dart.core::int*>[#C20, #C20, #C15, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C20, #C20]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 48
   #C27 = 32
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 56
   #C30 = 36
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
index e53139b..3f3d73e 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
@@ -82,26 +82,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 1
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = dart.ffi::Uint64 {}
   #C14 = 8
   #C15 = 4
-  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C16 = <dart.core::int*>[#C14, #C14, #C15, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C14, #C14]
   #C17 = "vm:prefer-inline"
   #C18 = dart.core::pragma {name:#C17, options:#C5}
   #C19 = 16
   #C20 = 12
-  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C21 = <dart.core::int*>[#C19, #C19, #C20, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C19, #C19]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 32
   #C27 = 24
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 40
   #C30 = 28
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
index c5fa703..e241ee1 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
@@ -82,26 +82,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = dart.ffi::Uint64 {}
   #C12 = 8
   #C13 = 4
-  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C14 = <dart.core::int*>[#C12, #C12, #C13, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C12, #C12]
   #C15 = 16
   #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C17 = <dart.core::int*>[#C15, #C15, #C16, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C15, #C15]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 24
-  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C21 = <dart.core::int*>[#C20, #C20, #C15, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C20, #C20]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 48
   #C27 = 32
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 56
   #C30 = 36
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
index 1d8965d..ffb841a 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
@@ -39,6 +39,11 @@
   ffi::unsized,
   ffi::sizeOf,
   ffi::Dart_NativeMessageHandler,
+  ffi::Abi,
+  ffi::AbiSpecificInteger,
+  ffi::AbiSpecificIntegerArray,
+  ffi::AbiSpecificIntegerMapping,
+  ffi::AbiSpecificIntegerPointer,
   ffi::Allocator,
   ffi::AllocatorAlloc,
   ffi::Array,
@@ -112,6 +117,11 @@
   ffi::unsized,
   ffi::sizeOf,
   ffi::Dart_NativeMessageHandler,
+  ffi::Abi,
+  ffi::AbiSpecificInteger,
+  ffi::AbiSpecificIntegerArray,
+  ffi::AbiSpecificIntegerMapping,
+  ffi::AbiSpecificIntegerPointer,
   ffi::Allocator,
   ffi::AllocatorAlloc,
   ffi::Array,
@@ -228,26 +238,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 1
-  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = dart.ffi::Uint64 {}
   #C14 = 8
   #C15 = 4
-  #C16 = <dart.core::int*>[#C14, #C15, #C14]
+  #C16 = <dart.core::int*>[#C14, #C14, #C15, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C15, #C14, #C14, #C14, #C14, #C14, #C14]
   #C17 = "vm:prefer-inline"
   #C18 = dart.core::pragma {name:#C17, options:#C5}
   #C19 = 16
   #C20 = 12
-  #C21 = <dart.core::int*>[#C19, #C20, #C19]
+  #C21 = <dart.core::int*>[#C19, #C19, #C20, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C20, #C19, #C19, #C19, #C19, #C19, #C19]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 32
   #C27 = 24
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 40
   #C30 = 28
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
index 6bf1e19..40804c4 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
@@ -39,6 +39,11 @@
   ffi::unsized,
   ffi::sizeOf,
   ffi::Dart_NativeMessageHandler,
+  ffi::Abi,
+  ffi::AbiSpecificInteger,
+  ffi::AbiSpecificIntegerArray,
+  ffi::AbiSpecificIntegerMapping,
+  ffi::AbiSpecificIntegerPointer,
   ffi::Allocator,
   ffi::AllocatorAlloc,
   ffi::Array,
@@ -112,6 +117,11 @@
   ffi::unsized,
   ffi::sizeOf,
   ffi::Dart_NativeMessageHandler,
+  ffi::Abi,
+  ffi::AbiSpecificInteger,
+  ffi::AbiSpecificIntegerArray,
+  ffi::AbiSpecificIntegerMapping,
+  ffi::AbiSpecificIntegerPointer,
   ffi::Allocator,
   ffi::AllocatorAlloc,
   ffi::Array,
@@ -228,26 +238,26 @@
   #C7 = dart.core::pragma {name:#C1, options:#C6}
   #C8 = dart.ffi::Uint8 {}
   #C9 = 0
-  #C10 = <dart.core::int*>[#C9, #C9, #C9]
+  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = dart.ffi::Uint64 {}
   #C12 = 8
   #C13 = 4
-  #C14 = <dart.core::int*>[#C12, #C13, #C12]
+  #C14 = <dart.core::int*>[#C12, #C12, #C13, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C13, #C12, #C12, #C12, #C12, #C12, #C12]
   #C15 = 16
   #C16 = 12
-  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C17 = <dart.core::int*>[#C15, #C15, #C16, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C16, #C15, #C15, #C15, #C15, #C15, #C15]
   #C18 = "vm:prefer-inline"
   #C19 = dart.core::pragma {name:#C18, options:#C5}
   #C20 = 24
-  #C21 = <dart.core::int*>[#C20, #C15, #C20]
+  #C21 = <dart.core::int*>[#C20, #C20, #C15, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C15, #C20, #C20, #C20, #C20, #C20, #C20]
   #C22 = TypeLiteralConstant(lib::Y)
   #C23 = <dart.core::Type>[#C22, #C22, #C2]
   #C24 = dart.ffi::_FfiStructLayout {fieldTypes:#C23, packing:#C5}
   #C25 = dart.core::pragma {name:#C1, options:#C24}
   #C26 = 48
   #C27 = 32
-  #C28 = <dart.core::int*>[#C26, #C27, #C26]
+  #C28 = <dart.core::int*>[#C26, #C26, #C27, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C27, #C26, #C26, #C26, #C26, #C26, #C26]
   #C29 = 56
   #C30 = 36
-  #C31 = <dart.core::int*>[#C29, #C30, #C29]
+  #C31 = <dart.core::int*>[#C29, #C29, #C30, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C30, #C29, #C29, #C29, #C29, #C29, #C29]
 }
diff --git a/pkg/front_end/testcases/incremental/part_main.yaml b/pkg/front_end/testcases/incremental/part_main.yaml
new file mode 100644
index 0000000..fc73d0d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/part_main.yaml
@@ -0,0 +1,53 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Compile an application, change a file, but don't change the outline.
+
+type: newworld
+worlds:
+  - entry: first.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      first.dart: |
+        library first;
+
+        part 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {}
+      second.dart: |
+        part of first;
+
+        method2() {}
+    expectedLibraryCount: 1
+  - entry: first.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      [second.dart, first.dart]
+    sources:
+      first.dart: |
+        library first;
+
+        part 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {
+          print('method1');
+        }
+      second.dart: |
+        part of first;
+
+        method2() {
+          print('method2');
+        }
+    expectedLibraryCount: 1
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental/part_main.yaml.world.1.expect b/pkg/front_end/testcases/incremental/part_main.yaml.world.1.expect
new file mode 100644
index 0000000..547dc7c
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/part_main.yaml.world.1.expect
@@ -0,0 +1,11 @@
+main = fir::main;
+library first from "org-dartlang-test:///first.dart" as fir {
+
+  part second.dart;
+  static method main() → dynamic {
+    fir::method1();
+    fir::method2();
+  }
+  static method method1() → dynamic {}
+  static method /* from org-dartlang-test:///second.dart */ method2() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental/part_main.yaml.world.2.expect b/pkg/front_end/testcases/incremental/part_main.yaml.world.2.expect
new file mode 100644
index 0000000..8cd5855
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/part_main.yaml.world.2.expect
@@ -0,0 +1,15 @@
+main = fir::main;
+library first from "org-dartlang-test:///first.dart" as fir {
+
+  part second.dart;
+  static method main() → dynamic {
+    fir::method1();
+    fir::method2();
+  }
+  static method method1() → dynamic {
+    dart.core::print("method1");
+  }
+  static method /* from org-dartlang-test:///second.dart */ method2() → dynamic {
+    dart.core::print("method2");
+  }
+}
diff --git a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
index ef8614b..9cb7f28 100644
--- a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.1.expect
@@ -55,12 +55,12 @@
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C8 = <dart.core::int*>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7]
   #C9 = "vm:prefer-inline"
   #C10 = dart.core::pragma {name:#C9, options:#C4}
-  #C11 = 8
-  #C12 = 4
-  #C13 = <dart.core::int*>[#C11, #C12, #C12]
+  #C11 = 4
+  #C12 = 8
+  #C13 = <dart.core::int*>[#C11, #C12, #C11, #C12, #C12, #C12, #C11, #C12, #C12, #C11, #C12, #C11, #C12, #C12, #C12, #C12, #C11, #C12]
   #C14 = TypeLiteralConstant(lib::COMObject)
   #C15 = <dart.core::Type>[#C14]
   #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
diff --git a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
index ef8614b..9cb7f28 100644
--- a/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/regress_46004.yaml.world.2.expect
@@ -55,12 +55,12 @@
   #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
   #C6 = dart.core::pragma {name:#C1, options:#C5}
   #C7 = 0
-  #C8 = <dart.core::int*>[#C7, #C7, #C7]
+  #C8 = <dart.core::int*>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7]
   #C9 = "vm:prefer-inline"
   #C10 = dart.core::pragma {name:#C9, options:#C4}
-  #C11 = 8
-  #C12 = 4
-  #C13 = <dart.core::int*>[#C11, #C12, #C12]
+  #C11 = 4
+  #C12 = 8
+  #C13 = <dart.core::int*>[#C11, #C12, #C11, #C12, #C12, #C12, #C11, #C12, #C12, #C11, #C12, #C11, #C12, #C12, #C12, #C12, #C11, #C12]
   #C14 = TypeLiteralConstant(lib::COMObject)
   #C15 = <dart.core::Type>[#C14]
   #C16 = dart.ffi::_FfiStructLayout {fieldTypes:#C15, packing:#C4}
diff --git a/pkg/front_end/testcases/incremental/second_first.yaml b/pkg/front_end/testcases/incremental/second_first.yaml
new file mode 100644
index 0000000..80faceb
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/second_first.yaml
@@ -0,0 +1,43 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+type: newworld
+worlds:
+  - entry: first.dart
+    experiments: alternative-invalidation-strategy
+    sources:
+      first.dart: |
+        import 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {}
+      second.dart: |
+        method2() {}
+    expectedLibraryCount: 2
+  - entry: first.dart
+    experiments: alternative-invalidation-strategy
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+        [second.dart, first.dart]
+    sources:
+      first.dart: |
+        import 'second.dart';
+
+        main() {
+          method1();
+          method2();
+        }
+        method1() {
+          print('method1');
+        }
+      second.dart: |
+        method2() {
+          print('method2');
+        }
+    expectedLibraryCount: 2
+    expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental/second_first.yaml.world.1.expect b/pkg/front_end/testcases/incremental/second_first.yaml.world.1.expect
new file mode 100644
index 0000000..b38f4b8
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/second_first.yaml.world.1.expect
@@ -0,0 +1,15 @@
+main = fir::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+  import "org-dartlang-test:///second.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method1() → dynamic {}
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+  static method method2() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental/second_first.yaml.world.2.expect b/pkg/front_end/testcases/incremental/second_first.yaml.world.2.expect
new file mode 100644
index 0000000..0b236b5
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/second_first.yaml.world.2.expect
@@ -0,0 +1,19 @@
+main = fir::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+  import "org-dartlang-test:///second.dart";
+
+  static method main() → dynamic {
+    fir::method1();
+    sec::method2();
+  }
+  static method method1() → dynamic {
+    dart.core::print("method1");
+  }
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+  static method method2() → dynamic {
+    dart.core::print("method2");
+  }
+}
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..e38191b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/abstract_class_instantiation.dart:15:34: Error: The class 'C' is abstract and can't be instantiated.
+//   var /*@type=dynamic */ x = new C();
+//                                  ^
+//
+// pkg/front_end/testcases/inference/abstract_class_instantiation.dart:16:34: Error: The class 'D' is abstract and can't be instantiated.
+//   var /*@type=dynamic */ y = new D(1);
+//                                  ^
+//
+// pkg/front_end/testcases/inference/abstract_class_instantiation.dart:17:24: Error: The class 'D' is abstract and can't be instantiated.
+//   D<List<int>> z = new D(/*@typeArgs=dynamic*/ []);
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::D::T* t) → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  dynamic x = throw new core::AbstractClassInstantiationError::•("C");
+  dynamic y = let final core::Object* #t1 = 1 in throw new core::AbstractClassInstantiationError::•("D");
+  self::D<core::List<core::int*>*>* z = let final core::Object* #t2 = <dynamic>[] in throw new core::AbstractClassInstantiationError::•("D");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/assert.dart.weak.modular.expect b/pkg/front_end/testcases/inference/assert.dart.weak.modular.expect
new file mode 100644
index 0000000..1122765
--- /dev/null
+++ b/pkg/front_end/testcases/inference/assert.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → void {
+  assert(self::f<core::bool*>());
+  assert(self::f<core::bool*>(), self::f<dynamic>());
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..8d3a6de
--- /dev/null
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor expressionOnly() → self::C*
+    : assert(self::f<core::bool*>()), super core::Object::•()
+    ;
+  constructor expressionAndMessage() → self::C*
+    : assert(self::f<core::bool*>(), self::f<dynamic>()), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {
+  assert(self::f<core::bool*>());
+  assert(self::f<core::bool*>(), self::f<dynamic>());
+}
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.weak.modular.expect b/pkg/front_end/testcases/inference/assign_local.dart.weak.modular.expect
new file mode 100644
index 0000000..21f996a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/assign_local.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  core::num* x;
+  core::int* x1 = x = 1;
+  core::double* x2 = x = 1.0;
+  self::A<core::int*>* y;
+  self::A<core::int*>* y1 = y = new self::A::•<core::int*>();
+  self::B<core::int*>* y2 = y = new self::B::•<core::int*>();
+}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.weak.modular.expect b/pkg/front_end/testcases/inference/async_await.dart.weak.modular.expect
new file mode 100644
index 0000000..3d172fc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_await.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+abstract class MyFuture extends core::Object implements asy::Future<core::int*> {
+  synthetic constructor •() → self::MyFuture*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method then<R extends core::Object* = dynamic>((core::int*) →* FutureOr<self::MyFuture::then::R*>* onValue, {core::Function* onError = #C1}) → asy::Future<self::MyFuture::then::R*>*; -> asy::Future::then
+  abstract member-signature method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<core::int*>*; -> asy::Future::catchError
+  abstract member-signature method whenComplete(() →* FutureOr<void>* action) → asy::Future<core::int*>*; -> asy::Future::whenComplete
+  abstract member-signature method asStream() → asy::Stream<core::int*>*; -> asy::Future::asStream
+  abstract member-signature method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<core::int*>* onTimeout = #C1}) → asy::Future<core::int*>*; -> asy::Future::timeout
+}
+static method test() → void async {
+  core::int* x0;
+  asy::Future<core::int*>* x1;
+  asy::Future<asy::Future<core::int*>*>* x2;
+  asy::Future<FutureOr<core::int*>*>* x3;
+  asy::Future<self::MyFuture*>* x4;
+  FutureOr<core::int*>* x5;
+  FutureOr<asy::Future<core::int*>*>* x6;
+  FutureOr<FutureOr<core::int*>*>* x7;
+  FutureOr<self::MyFuture*>* x8;
+  self::MyFuture* x9;
+  function test0() → asy::Future<core::int*>* async 
+    return x0;
+  function test1() → asy::Future<core::int*>* async 
+    return x1;
+  function test2() → asy::Future<asy::Future<core::int*>*>* async 
+    return x2;
+  function test3() → asy::Future<FutureOr<core::int*>*>* async 
+    return x3;
+  function test4() → asy::Future<self::MyFuture*>* async 
+    return x4;
+  function test5() → asy::Future<core::int*>* async 
+    return x5;
+  function test6() → asy::Future<asy::Future<core::int*>*>* async 
+    return x6;
+  function test7() → asy::Future<FutureOr<core::int*>*>* async 
+    return x7;
+  function test8() → asy::Future<self::MyFuture*>* async 
+    return x8;
+  function test9() → asy::Future<core::int*>* async 
+    return x9;
+  core::int* y0 = await x0;
+  core::int* y1 = await x1;
+  asy::Future<core::int*>* y2 = await x2;
+  FutureOr<core::int*>* y3 = await x3;
+  self::MyFuture* y4 = await x4;
+  core::int* y5 = await x5;
+  asy::Future<core::int*>* y6 = await x6;
+  FutureOr<core::int*>* y7 = await x7;
+  self::MyFuture* y8 = await x8;
+  core::int* y9 = await x9;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.weak.modular.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.weak.modular.expect
new file mode 100644
index 0000000..7974c45
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field asy::Future<core::int*>* futureInt = null;
+static field () →* asy::Future<core::int*>* f = () → asy::Future<core::int*>* => self::futureInt;
+static field () →* asy::Future<core::int*>* g = () → asy::Future<core::int*>* async => self::futureInt;
+static method main() → dynamic {
+  self::f;
+  self::g;
+}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.weak.modular.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.weak.modular.expect
new file mode 100644
index 0000000..6e90053
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static field () →* asy::Future<core::int*>* f = () → asy::Future<core::int*>* async => 0;
+static method main() → dynamic {
+  self::f;
+}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.weak.modular.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.weak.modular.expect
new file mode 100644
index 0000000..a44a6a9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field FutureOr<core::int*>* futureOrInt = null;
+static field () →* FutureOr<core::int*>* f = () → FutureOr<core::int*>* => self::futureOrInt;
+static field () →* asy::Future<core::int*>* g = () → asy::Future<core::int*>* async => self::futureOrInt;
+static method main() → dynamic {
+  self::f;
+  self::g;
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.weak.modular.expect
new file mode 100644
index 0000000..f19d465
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:math" as math;
+
+import "dart:async";
+import "dart:math" show Random;
+
+static method test() → dynamic {
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* async {
+    if(math::Random::•().{math::Random::nextBool}(){() →* core::bool*}) {
+      return asy::Future::value<core::int*>(1);
+    }
+    else {
+      return asy::Future::value<core::double*>(2.0);
+    }
+  };
+  asy::Future<core::num*>* g = f(){() →* asy::Future<core::num*>*};
+  asy::Future<core::int*>* h = f(){() →* asy::Future<core::num*>*} as{TypeError} asy::Future<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.weak.modular.expect
new file mode 100644
index 0000000..419ef81
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:math" as math;
+
+import "dart:async";
+import "dart:math" show Random;
+
+static method test() → dynamic {
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* async {
+    if(math::Random::•().{math::Random::nextBool}(){() →* core::bool*}) {
+      return 1;
+    }
+    else {
+      return 2.0;
+    }
+  };
+  asy::Future<core::num*>* g = f(){() →* asy::Future<core::num*>*};
+  asy::Future<core::int*>* h = f(){() →* asy::Future<core::num*>*} as{TypeError} asy::Future<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.weak.modular.expect
new file mode 100644
index 0000000..3af04ad
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:math" as math;
+
+import "dart:async";
+import "dart:math" show Random;
+
+static method test() → dynamic {
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* async {
+    if(math::Random::•().{math::Random::nextBool}(){() →* core::bool*}) {
+      return asy::Future::value<core::int*>(1);
+    }
+    else {
+      return 2.0;
+    }
+  };
+  asy::Future<core::num*>* g = f(){() →* asy::Future<core::num*>*};
+  asy::Future<core::int*>* h = f(){() →* asy::Future<core::num*>*} as{TypeError} asy::Future<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.weak.modular.expect
new file mode 100644
index 0000000..f68b064
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method test() → dynamic {
+  () →* asy::Stream<core::num*>* f = () → asy::Stream<core::num*>* async* {
+    yield 1;
+    asy::Stream<core::double*>* s;
+    yield* s;
+  };
+  asy::Stream<core::num*>* g = f(){() →* asy::Stream<core::num*>*};
+  asy::Stream<core::int*>* h = f(){() →* asy::Stream<core::num*>*} as{TypeError} asy::Stream<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.weak.modular.expect
new file mode 100644
index 0000000..add23e8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test1() → dynamic {
+  core::List<core::int*>* o;
+  core::Iterable<core::int*>* y = o.{core::Iterable::map}<core::int*>((core::int* x) → core::int* {
+    return x.{core::num::+}(1){(core::num*) →* core::int*};
+  }){((core::int*) →* core::int*) →* core::Iterable<core::int*>*};
+  core::Iterable<core::int*>* z = y;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.weak.modular.expect
new file mode 100644
index 0000000..446c911
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f() → dynamic {
+  core::List<core::int*>* o;
+  o.{core::Iterable::where}((core::int* i) → core::bool* {
+    return i =={core::num::==}{(core::Object*) →* core::bool*} 0;
+  }){((core::int*) →* core::bool*) →* core::Iterable<core::int*>*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..e90018d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
+//                                             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function f() → core::String*
+    return null;
+  () →* core::String* g = f;
+  g = () → core::String* {
+    return invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    return /*error:RETURN_OF_INVALID_TYPE*/ 1;
+                                            ^" in 1 as{TypeError} core::String*;
+  };
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..f1a6a23
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field () →* core::String* g = #C1;
+static method f() → core::String*
+  return null;
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.weak.modular.expect
new file mode 100644
index 0000000..729dbe7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method main() → dynamic async {
+  () →* asy::Future<Null>* f = () → asy::Future<Null>* async {
+    return null;
+  };
+  asy::Future<dynamic>* y = f(){() →* asy::Future<Null>*};
+  asy::Future<core::String*>* z = f(){() →* asy::Future<Null>*};
+  core::String* s = await f(){() →* asy::Future<Null>*};
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.weak.modular.expect
new file mode 100644
index 0000000..a85a79c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method main() → dynamic async {
+  () →* asy::Stream<Null>* f = () → asy::Stream<Null>* async* {
+    yield null;
+  };
+  asy::Stream<dynamic>* y = f(){() →* asy::Stream<Null>*};
+  asy::Stream<core::String*>* z = f(){() →* asy::Stream<Null>*};
+  core::String* s = await f(){() →* asy::Stream<Null>*}.{asy::Stream::first}{asy::Future<Null>*};
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.weak.modular.expect
new file mode 100644
index 0000000..4f32533
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic h = null;
+static method foo((core::Object*) →* core::int* f) → void {}
+static method test() → dynamic {
+  (core::Object*) →* Null f = (core::Object* x) → Null {
+    return null;
+  };
+  core::String* y = f(42){(core::Object*) →* Null};
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
+  self::foo((core::Object* x) → Null {
+    return null;
+  });
+  self::foo((core::Object* x) → Null {
+    throw "not implemented";
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.weak.modular.expect
new file mode 100644
index 0000000..579df9a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  () →* core::Iterable<Null>* f = () → core::Iterable<Null>* sync* {
+    yield null;
+  };
+  core::Iterable<dynamic>* y = f(){() →* core::Iterable<Null>*};
+  core::Iterable<core::String*>* z = f(){() →* core::Iterable<Null>*};
+  core::String* s = f(){() →* core::Iterable<Null>*}.{core::Iterable::first}{Null};
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.weak.modular.expect
new file mode 100644
index 0000000..314b863
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:math" as math;
+
+import "dart:math" show Random;
+
+static method test2() → dynamic {
+  core::List<core::num*>* o;
+  core::Iterable<core::num*>* y = o.{core::Iterable::map}<core::num*>((core::num* x) → core::num* {
+    if(math::Random::•().{math::Random::nextBool}(){() →* core::bool*}) {
+      return x.{core::num::toInt}(){() →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+    }
+    else {
+      return x.{core::num::toDouble}(){() →* core::double*};
+    }
+  }){((core::num*) →* core::num*) →* core::Iterable<core::num*>*};
+  core::Iterable<core::num*>* w = y;
+  core::Iterable<core::int*>* z = y as{TypeError} core::Iterable<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.weak.modular.expect
new file mode 100644
index 0000000..e9db0d8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  () →* (core::int*) →* core::double* f = () → (core::int*) →* core::double* {
+    return (core::int* x) → core::double* {
+      return 2.0.{core::double::*}(x){(core::num*) →* core::double*};
+    };
+  };
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.weak.modular.expect
new file mode 100644
index 0000000..f309388
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test1() → dynamic {
+  core::List<core::int*>* o;
+  core::Iterable<Null>* y = o.{core::Iterable::map}<Null>((core::int* x) → Null {}){((core::int*) →* Null) →* core::Iterable<Null>*};
+  core::Iterable<core::int*>* z = y;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.weak.modular.expect
new file mode 100644
index 0000000..39b321c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:35:7: Warning: Must explicitly return a value from a non-void function.
+//       return;
+//       ^
+//
+// pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart:65:7: Warning: Must explicitly return a value from a non-void function.
+//       return;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  () →* Null a = () → Null {};
+  () →* Null b = () → Null {
+    return;
+  };
+  () →* Null c = () → Null {
+    return null;
+  };
+  () →* core::int* d = () → core::int* {
+    return 0;
+  };
+  (core::bool*) →* Null e = (core::bool* b) → Null {
+    if(b) {
+      return;
+    }
+    else {
+      return;
+    }
+  };
+  (core::bool*) →* Null f = (core::bool* b) → Null {
+    if(b) {
+      return;
+    }
+    else {
+      return null;
+    }
+  };
+  (core::bool*) →* core::int* g = (core::bool* b) → core::int* {
+    if(b) {
+      return null;
+    }
+    else {
+      return 0;
+    }
+  };
+  (core::bool*) →* Null h = (core::bool* b) → Null {
+    if(b) {
+      return null;
+    }
+    else {
+      return;
+    }
+  };
+  (core::bool*) →* Null i = (core::bool* b) → Null {
+    if(b) {
+      return null;
+    }
+    else {
+      return null;
+    }
+  };
+  (core::bool*) →* core::int* j = (core::bool* b) → core::int* {
+    if(b) {
+      return null;
+    }
+    else {
+      return 0;
+    }
+  };
+  (core::bool*) →* core::int* k = (core::bool* b) → core::int* {
+    if(b) {
+      return 0;
+    }
+    else {
+      return null;
+    }
+  };
+  (core::bool*) →* core::int* l = (core::bool* b) → core::int* {
+    if(b) {
+      return 0;
+    }
+    else {
+      return null;
+    }
+  };
+  (core::bool*) →* core::int* m = (core::bool* b) → core::int* {
+    if(b) {
+      return 0;
+    }
+    else {
+      return 0;
+    }
+  };
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.weak.modular.expect
new file mode 100644
index 0000000..09f2baf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  () →* core::Iterable<core::num*>* f = () → core::Iterable<core::num*>* sync* {
+    yield 1;
+    yield*<core::num*>[3, 4.0];
+  };
+  core::Iterable<core::num*>* g = f(){() →* core::Iterable<core::num*>*};
+  core::Iterable<core::int*>* h = f(){() →* core::Iterable<core::num*>*} as{TypeError} core::Iterable<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.weak.modular.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.weak.modular.expect
new file mode 100644
index 0000000..246d431
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f() → dynamic {
+  core::List<core::int*>* o;
+  o.{core::Iterable::forEach}((core::int* i) → core::int* {
+    return i.{core::num::+}(1){(core::num*) →* core::int*};
+  }){((core::int*) →* void) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bottom.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bottom.dart.weak.modular.expect
new file mode 100644
index 0000000..d841a5d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bottom.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static field dynamic v = null;
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.weak.modular.expect
new file mode 100644
index 0000000..63cbd26
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static field () →* Null v = () → Null => null;
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug30251.dart.weak.modular.expect
new file mode 100644
index 0000000..0622d1c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30251.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic x;
+  constructor •(core::int* p) → self::C*
+    : self::C::x = self::f<core::int*>(1.{core::num::+}(p){(core::num*) →* core::int*}), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>(self::f::T* t) → self::f::T*
+  return t;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug30620.dart.weak.modular.expect
new file mode 100644
index 0000000..e2320e0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::A*
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other{self::A*}.{self::A::foo}{core::String*} =={core::String::==}{(core::Object*) →* core::bool*} this.{self::A::foo}{core::String*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello") =={self::A::==}{(core::Object*) →* core::bool*} new self::A::•("hello"));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.weak.modular.expect
new file mode 100644
index 0000000..bc320a3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::A*
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other{self::A*}.{self::A::foo}{core::String*} =={core::String::==}{(core::Object*) →* core::bool*} this.{self::A::foo}{core::String*} && other{self::A*}.{self::A::foo}{core::String*} =={core::String::==}{(core::Object*) →* core::bool*} this.{self::A::foo}{core::String*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello") =={self::A::==}{(core::Object*) →* core::bool*} new self::A::•("hello"));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.weak.modular.expect
new file mode 100644
index 0000000..5a1ff19
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::A*
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object* other) → core::bool* {
+    if(other is self::A* && other{self::A*}.{self::A::foo}{core::String*} =={core::String::==}{(core::Object*) →* core::bool*} this.{self::A::foo}{core::String*}) {
+      if(other{self::A*}.{self::A::foo}{core::String*} =={core::String::==}{(core::Object*) →* core::bool*} this.{self::A::foo}{core::String*}) {
+      }
+    }
+    return true;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello") =={self::A::==}{(core::Object*) →* core::bool*} new self::A::•("hello"));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.weak.modular.expect
new file mode 100644
index 0000000..bfc06da
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method foo(dynamic obj) → core::String*
+  return obj is core::String* ?{core::String*} obj{core::String*}.{core::String::toUpperCase}(){() →* core::String*} : null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug30624.dart.weak.modular.expect
new file mode 100644
index 0000000..630409a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30624.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::E*>*
+    : super core::Object::•()
+    ;
+  method barA([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, let final (self::C::E*, self::C::E*) →* core::int* #t1 = cmp in #t1 == null ?{(self::C::E*, self::C::E*) →* core::int*} #C2 : #t1);
+  }
+  method barB([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, let final (self::C::E*, self::C::E*) →* core::int* #t2 = cmp in #t2 == null ?{(self::C::E*, self::C::E*) →* core::int*} #C2 as (self::C::E*, self::C::E*) →* core::int* : #t2);
+  }
+  method barC([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    (self::C::E*, self::C::E*) →* core::int* v = #C2;
+    self::foo<self::C::E*>(this, let final (self::C::E*, self::C::E*) →* core::int* #t3 = cmp in #t3 == null ?{(self::C::E*, self::C::E*) →* core::int*} v : #t3);
+  }
+  method barD([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, let final (self::C::E*, self::C::E*) →* core::int* #t4 = cmp in #t4 == null ?{(self::C::E*, self::C::E*) →* core::int*} #C2 : #t4);
+  }
+  method barE([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, cmp == null ?{(self::C::E*, self::C::E*) →* core::int*} #C2 : cmp);
+  }
+  method barF([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, !(cmp == null) ?{(self::C::E*, self::C::E*) →* core::int*} cmp : #C2);
+  }
+  static method _default(dynamic a, dynamic b) → core::int* {
+    return 1.{core::int::unary-}(){() →* core::int*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo<E extends core::Object* = dynamic>(self::C<self::foo::E*>* c, (self::foo::E*, self::foo::E*) →* core::int* cmp) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = static-tearoff self::C::_default
+}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug31132.dart.weak.modular.expect
new file mode 100644
index 0000000..135614f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug31132.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  field dynamic z = null;
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method test(self::B* x) → void {
+  self::C* y = x is self::C* ?{self::C*} x{self::C*} : new self::C::•();
+  core::print(y.{self::C::z}{dynamic});
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug31133.dart.weak.modular.expect
new file mode 100644
index 0000000..46ea8a2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug31133.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::int* i = 0;
+  for (final core::int* #t1 = i = i.{core::num::+}(1){(core::num*) →* core::int*}; i.{core::num::<}(10){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+  }
+  for (final core::int* #t2 = i = i.{core::num::+}(1){(core::num*) →* core::int*}; i.{core::num::<}(10){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+  }
+  for (final core::int* #t3 = i = i.{core::num::-}(1){(core::num*) →* core::int*}; i.{core::num::>=}(0){(core::num*) →* core::bool*}; i = i.{core::num::-}(1){(core::num*) →* core::int*}) {
+  }
+  for (final core::int* #t4 = i = i.{core::num::-}(1){(core::num*) →* core::int*}; i.{core::num::>=}(0){(core::num*) →* core::bool*}; i = i.{core::num::-}(1){(core::num*) →* core::int*}) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug31436.dart.weak.modular.expect
new file mode 100644
index 0000000..adc6d4a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug31436.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method block_test() → void {
+  () →* core::List<core::Object*>* g;
+  g = () → core::List<core::Object*>* {
+    return <core::Object*>[3];
+  };
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  g(){() →* core::List<core::Object*>*}.{core::List::add}("hello"){(core::Object*) →* void};
+  core::List<core::int*>* l = <core::int*>[3];
+  g = () → core::List<core::int*>* {
+    return l;
+  };
+  assert(g is () →* core::List<core::Object*>*);
+  assert(g is () →* core::List<core::int*>*);
+  try {
+    g(){() →* core::List<core::Object*>*}.{core::List::add}("hello"){(core::Object*) →* void};
+    throw "expected a runtime error";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+  core::Object* o = l;
+  g = () → core::List<core::Object*>* {
+    return o as{TypeError} core::List<core::Object*>*;
+  };
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  assert(!(g is () →* core::Object*));
+  g(){() →* core::List<core::Object*>*};
+  o = 3;
+  try {
+    g(){() →* core::List<core::Object*>*};
+    throw "expected a runtime error";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method arrow_test() → void {
+  () →* core::List<core::Object*>* g;
+  g = () → core::List<core::Object*>* => <core::Object*>[3];
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  g(){() →* core::List<core::Object*>*}.{core::List::add}("hello"){(core::Object*) →* void};
+  core::List<core::int*>* l = <core::int*>[3];
+  g = () → core::List<core::int*>* => l;
+  assert(g is () →* core::List<core::Object*>*);
+  assert(g is () →* core::List<core::int*>*);
+  try {
+    g(){() →* core::List<core::Object*>*}.{core::List::add}("hello"){(core::Object*) →* void};
+    throw "expected a runtime error";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+  core::Object* o = l;
+  g = () → core::List<core::Object*>* => o as{TypeError} core::List<core::Object*>*;
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  assert(!(g is () →* core::Object*));
+  g(){() →* core::List<core::Object*>*};
+  o = 3;
+  try {
+    g(){() →* core::List<core::Object*>*};
+    throw "expected a runtime error";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::block_test();
+  self::arrow_test();
+}
diff --git a/pkg/front_end/testcases/inference/bug32291.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug32291.dart.weak.modular.expect
new file mode 100644
index 0000000..b473c4f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug32291.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → void {
+  core::List<core::List<core::String*>*>* l = <core::List<core::String*>*>[<core::String*>["hi", "world"]];
+  core::Iterable<core::List<core::String*>*>* i1 = l.{core::Iterable::map}<core::List<core::String*>*>((core::List<core::String*>* ll) → core::List<core::String*>* => let final core::List<core::String*>* #t1 = ll in #t1 == null ?{core::List<core::String*>*} <core::String*>[] : #t1){((core::List<core::String*>*) →* core::List<core::String*>*) →* core::Iterable<core::List<core::String*>*>*};
+  core::Iterable<core::int*>* i2 = i1.{core::Iterable::map}<core::int*>((core::List<core::String*>* l) → core::int* => l.{core::List::length}{core::int*}){((core::List<core::String*>*) →* core::int*) →* core::Iterable<core::int*>*};
+  core::print(i2);
+}
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.weak.modular.expect b/pkg/front_end/testcases/inference/bug33324.dart.weak.modular.expect
new file mode 100644
index 0000000..318df8a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug33324.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → core::int* {
+  core::Function* f = (dynamic x) → dynamic => x;
+  core::List<dynamic>* l = <core::String*>["bar"].{core::Iterable::map}<dynamic>(f as{TypeError} (core::String*) →* dynamic){((core::String*) →* dynamic) →* core::Iterable<dynamic>*}.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<dynamic>*};
+  l.{core::List::add}(42){(dynamic) →* void};
+  return l.{core::Iterable::first}{dynamic}{dynamic}.length as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.weak.modular.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.weak.modular.expect
new file mode 100644
index 0000000..bc9a2a22
--- /dev/null
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method call() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get call() → self::A*
+    return new self::A::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  field self::A* fieldA = new self::A::•();
+  field self::B* fieldB = new self::B::•();
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  get getA() → self::A*
+    return new self::A::•();
+  get getB() → self::B*
+    return new self::B::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  core::int* callA = new self::A::•().{self::A::call}(){() →* core::int*};
+  core::int* callFieldA = new self::D::•().{self::D::fieldA}{self::A*}.{self::A::call}(){() →* core::int*};
+  core::int* callGetA = new self::D::•().{self::D::getA}{self::A*}.{self::A::call}(){() →* core::int*};
+  core::int* callFieldB = new self::D::•().{self::D::fieldB}{self::B*}.{self::B::call}{self::A*}.{self::A::call}(){() →* core::int*};
+  core::int* callGetB = new self::D::•().{self::D::getB}{self::B*}.{self::B::call}{self::A*}.{self::A::call}(){() →* core::int*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.weak.modular.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.weak.modular.expect
new file mode 100644
index 0000000..36688cc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class ActionDispatcher<P extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P*>*
+    : super core::Object::•()
+    ;
+  method call([covariant-by-class self::ActionDispatcher::P* value = #C1]) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class FooActions extends core::Object {
+  synthetic constructor •() → self::FooActions*
+    : super core::Object::•()
+    ;
+  get foo() → self::ActionDispatcher<self::Bar*>*
+    return new self::ActionDispatcher::•<self::Bar*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  let final self::FooActions* #t1 = new self::FooActions::•() in let final self::Bar* #t2 = new self::Bar::•() in #t1.{self::FooActions::foo}{self::ActionDispatcher<self::Bar*>*}.{self::ActionDispatcher::call}(#t2){([self::Bar*]) →* void};
+  new self::FooActions::•().{self::FooActions::foo}{self::ActionDispatcher<self::Bar*>*}.{self::ActionDispatcher::call}(new self::Bar::•()){([self::Bar*]) →* void};
+  new self::FooActions::•().{self::FooActions::foo}{self::ActionDispatcher<self::Bar*>*}.{self::ActionDispatcher::call}(new self::Bar::•()){([self::Bar*]) →* void};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.weak.modular.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..1bacd22
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself.
+// abstract class B extends A {
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract method f(dynamic x) → dynamic;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method f(dynamic x) → dynamic;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.weak.modular.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.weak.modular.expect
new file mode 100644
index 0000000..189aa8d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
+//     ^
+//
+import self as self;
+
+static field invalid-type x = () → () →* invalid-type => self::y;
+static field () →* invalid-type y = () → invalid-type => self::x;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.weak.modular.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.weak.modular.expect
new file mode 100644
index 0000000..2439199
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
+//     ^
+//
+import self as self;
+
+static field invalid-type x = () → () →* invalid-type => self::y;
+static field () →* invalid-type y = () → invalid-type => self::x;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.weak.modular.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.weak.modular.expect
new file mode 100644
index 0000000..1937cae
--- /dev/null
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  (Null) →* core::int* f = (core::Object* x) → core::int* => 1;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.weak.modular.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.weak.modular.expect
new file mode 100644
index 0000000..9396c77
--- /dev/null
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f() → dynamic {
+  core::int* a = 0;
+  dynamic b = null;
+  dynamic c = throw "foo";
+  () →* core::int* d = () → core::int* => 0;
+  () →* Null e = () → Null => null;
+  () →* Null f = () → Null => throw "foo";
+  () →* core::int* g = () → core::int* {
+    return 0;
+  };
+  () →* Null h = () → Null {
+    return null;
+  };
+  () →* Null i = () → Null {
+    return throw "foo";
+  };
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/complex_predecrement.dart.weak.modular.expect b/pkg/front_end/testcases/inference/complex_predecrement.dart.weak.modular.expect
new file mode 100644
index 0000000..a27510a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/complex_predecrement.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<core::int*>* foo = <core::int*>[1, 2, 3];
+  core::print(let final core::List<core::int*>* #t1 = foo in let final core::int* #t2 = 0 in let final core::int* #t3 = #t1.{core::List::[]}(#t2){(core::int*) →* core::int*}.{core::num::-}(1){(core::num*) →* core::int*} in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3){(core::int*, core::int*) →* void} in #t3);
+}
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.weak.modular.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.weak.modular.expect
new file mode 100644
index 0000000..0d65f10
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* b = true;
+static field core::int* x = 0;
+static field core::double* y = 0.0;
+static field core::num* z = self::b ?{core::num*} self::x : self::y;
+static method main() → dynamic {
+  core::num* z = self::b ?{core::num*} self::x : self::y;
+}
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.weak.modular.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..c929f40
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::List<self::C::T*>* x) → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::bool* b = false;
+  core::List<core::int*>* l1 = <core::int*>[1];
+  core::List<core::int*>* l2 = <core::int*>[2];
+  self::C<core::int*>* x = new self::C::•<core::int*>(l1);
+  self::C<core::int*>* y = new self::C::•<core::int*>(l2);
+  self::C<core::int*>* z = new self::C::•<core::int*>(b ?{core::List<core::int*>*} l1 : l2);
+}
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.weak.modular.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..24a2f0c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic field1 = null;
+  field core::int* field2 = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class I extends core::Object {
+  field core::int* field1 = null;
+  field dynamic field2 = null;
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A implements self::I {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  get field1() → core::int*
+    return null;
+  get field2() → core::int*
+    return null;
+  set field1(dynamic value) → void {}
+  set field2(dynamic value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.weak.modular.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.weak.modular.expect
new file mode 100644
index 0000000..edd05fe
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I1 extends core::Object {
+  field core::int* x = null;
+  synthetic constructor •() → self::I1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class I2 extends self::I1 {
+  field core::int* y = null;
+  synthetic constructor •() → self::I2*
+    : super self::I1::•()
+    ;
+}
+class A extends core::Object {
+  final field self::I1* a = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  final field self::I2* a = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C1 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C1*
+    : super core::Object::•()
+    ;
+  get a() → self::I2*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object implements self::B, self::A {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  get a() → self::I2*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.weak.modular.expect
new file mode 100644
index 0000000..f8a6f85
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.weak.modular.expect
@@ -0,0 +1,134 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   get a => null;
+//       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the overridden members.
+//   final I1 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the overridden members.
+//   final I2 a = null;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class I1 extends core::Object {
+  field core::int* x = null;
+  synthetic constructor •() → self::I1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class I2 extends core::Object {
+  field core::int* y = null;
+  synthetic constructor •() → self::I2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class I3 extends core::Object implements self::I1, self::I2 {
+  field core::int* x = null;
+  field core::int* y = null;
+  synthetic constructor •() → self::I3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  final field self::I1* a = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  final field self::I2* a = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C1 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C1*
+    : super core::Object::•()
+    ;
+  get a() → self::I3*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  get a() → invalid-type
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.modular.expect
new file mode 100644
index 0000000..7a1c1c0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class Foo<T extends self::A*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  self::Foo<self::B*>* foo = new self::Foo::•<self::B*>();
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..1797fc0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:55: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   x. /*@target=C.t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
+//                                                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
+    : self::C::t = t, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  self::C<core::int*>* x = new self::C::•<core::int*>(42);
+  core::num* y;
+  self::C<core::int*>* c_int = new self::C::•<core::int*>(y as{TypeError} core::int*);
+  self::C<core::num*>* c_num = new self::C::•<core::num*>(123);
+  self::C<core::num*>* c_num2 = let final self::C<core::num*>* #t1 = new self::C::•<core::num*>(456) in block {
+    #t1.{self::C::t} = 1.0;
+  } =>#t1;
+  self::C<dynamic>* c_dynamic = new self::C::•<dynamic>(42);
+  x.{self::C::t} = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:55: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  x. /*@target=C.t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
+                                                      ^" in "hello" as{TypeError} core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.modular.expect
new file mode 100644
index 0000000..3ed0854
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:22:59: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
+//  - 'NotA' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//       new /*error:COULD_NOT_INFER*/ /*@ typeArgs=NotA* */ C(myF);
+//                                                           ^
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:12:9: Context: This is the type variable whose bound isn't conformed to.
+// class C<T extends A> {
+//         ^
+//
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:21:29: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
+//  - 'NotA' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   var /*@ type=C<NotA*>* */ x =
+//                             ^
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:12:9: Context: This is the type variable whose bound isn't conformed to.
+// class C<T extends A> {
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<T extends core::Object* = dynamic> = () →* T*;
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends self::A*> extends core::Object {
+  constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class NotA extends core::Object {
+  synthetic constructor •() → self::NotA*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method myF() → self::NotA*
+  return null;
+static method main() → dynamic {
+  self::C<self::NotA*>* x = new self::C::•<self::NotA*>(#C1);
+}
+
+constants  {
+  #C1 = static-tearoff self::myF
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.weak.modular.expect
new file mode 100644
index 0000000..5cf994f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field self::C::T* t;
+  const constructor •(self::C::T* t) → self::C<self::C::T*>*
+    : self::C::t = t, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* x = #C2;
+}
+
+constants  {
+  #C1 = 42
+  #C2 = self::C<core::int*> {t:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructors_infer_from_arguments_const.dart:
+- C. (from org-dartlang-testcase:///constructors_infer_from_arguments_const.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..c79ff6d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num*> extends core::Object /*hasConstConstructor*/  {
+  final field self::C::T* x;
+  const constructor •(self::C::T* x) → self::C<self::C::T*>*
+    : self::C::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<T extends core::num*> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  self::C<core::int*>* c2 = #C2;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::C<core::int*> {x:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructors_infer_from_arguments_const_with_upper_bound.dart:
+- C. (from org-dartlang-testcase:///constructors_infer_from_arguments_const_with_upper_bound.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- D. (from org-dartlang-testcase:///constructors_infer_from_arguments_const_with_upper_bound.dart:14:9)
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..760a01e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::List<self::C::T*>* list) → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* x = new self::C::•<core::int*>(<core::int*>[123]);
+  self::C<core::int*>* y = x;
+  self::C<dynamic>* a = new self::C::•<dynamic>(<dynamic>[123]);
+  self::C<core::Object*>* b = new self::C::•<core::Object*>(<core::Object*>[123]);
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.weak.modular.expect
new file mode 100644
index 0000000..32c7a0d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:3: Error: Setter not found: 't'.
+//   t = /*error:INVALID_ASSIGNMENT*/ 'hello';
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* t = null;
+  constructor _() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>* {
+    self::C<self::C::•::T*>* x = new self::C::_<self::C::•::T*>();
+    t = t;
+    return x;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  self::C<core::int*>* x = self::C::•<core::int*>(42);
+  invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:3: Error: Setter not found: 't'.
+  t = /*error:INVALID_ASSIGNMENT*/ 'hello';
+  ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..ba0e34d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::A<self::A::T*>* f = new self::A::•<self::A::T*>();
+  constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory factory<T extends core::Object* = dynamic>() → self::A<self::A::factory::T*>*
+    return new self::A::•<self::A::factory::T*>();
+  method m() → self::A<self::A::T*>*
+    return new self::A::•<self::A::T*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.weak.modular.expect
new file mode 100644
index 0000000..adf0647
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* t = null;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* x = new self::C::named<core::int*>(<core::int*>[]);
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.weak.modular.expect
new file mode 100644
index 0000000..c030443
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* t = null;
+  constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static factory named<T extends core::Object* = dynamic>(self::C::named::T* t) → self::C<self::C::named::T*>* {
+    self::C<self::C::named::T*>* x = new self::C::•<self::C::named::T*>();
+    x.{self::C::t} = t;
+    return x;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* x = self::C::named<core::int*>(42);
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.weak.modular.expect
new file mode 100644
index 0000000..b9202f7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
+    : self::C::t = t, super core::Object::•()
+    ;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
+    : this self::C::•(t.{core::List::[]}(0){(core::int*) →* self::C::T*})
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* x = new self::C::named<core::int*>(<core::int*>[42]);
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.modular.expect
new file mode 100644
index 0000000..7f8c3dd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  abstract get t() → self::C::T*;
+  abstract set t(covariant-by-class self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    return new self::CImpl::•<self::C::•::T*>(t);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  covariant-by-class field self::CImpl::T* t;
+  constructor •(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
+    : self::CImpl::t = t, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* x = new self::CImpl::•<core::int*>(42);
+}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.modular.expect
new file mode 100644
index 0000000..a2fd0ae
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  abstract get t() → self::C::T*;
+  abstract set t(covariant-by-class self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    return self::CImpl::•<self::C::•::T*>(t);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  covariant-by-class field self::CImpl::T* t;
+  constructor _(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
+    : self::CImpl::t = t, super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>(self::CImpl::•::T* t) → self::CImpl<self::CImpl::•::T*>*
+    return new self::CImpl::_<self::CImpl::•::T*>(t);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* x = self::CImpl::•<core::int*>(42);
+}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.weak.modular.expect
new file mode 100644
index 0000000..5ef8772
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:116: Error: Inferred type argument 'Cloneable<dynamic>' doesn't conform to the bound 'Cloneable<T>' of the type variable 'T' on 'Pair'.
+//  - 'Cloneable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@ typeArgs=Cloneable<dynamic>*, Cloneable<dynamic>* */ Pair
+//                                                                                                                    ^
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:10:12: Context: This is the type variable whose bound isn't conformed to.
+// class Pair<T extends Cloneable<T>, U extends Cloneable<U>> {
+//            ^
+//
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:116: Error: Inferred type argument 'Cloneable<dynamic>' doesn't conform to the bound 'Cloneable<U>' of the type variable 'U' on 'Pair'.
+//  - 'Cloneable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@ typeArgs=Cloneable<dynamic>*, Cloneable<dynamic>* */ Pair
+//                                                                                                                    ^
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:10:36: Context: This is the type variable whose bound isn't conformed to.
+// class Pair<T extends Cloneable<T>, U extends Cloneable<U>> {
+//                                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Cloneable<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cloneable<self::Cloneable::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Pair<T extends self::Cloneable<self::Pair::T*>* = self::Cloneable<dynamic>*, U extends self::Cloneable<self::Pair::U*>* = self::Cloneable<dynamic>*> extends core::Object {
+  covariant-by-class field self::Pair::T* t;
+  covariant-by-class field self::Pair::U* u;
+  constructor •(self::Pair::T* t, self::Pair::U* u) → self::Pair<self::Pair::T*, self::Pair::U*>*
+    : self::Pair::t = t, self::Pair::u = u, super core::Object::•()
+    ;
+  constructor _() → self::Pair<self::Pair::T*, self::Pair::U*>*
+    : self::Pair::u = null, self::Pair::t = null, super core::Object::•()
+    ;
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
+    return new self::Pair::•<self::Pair::U*, self::Pair::T*>(this.{self::Pair::u}{self::Pair::U*}, this.{self::Pair::t}{self::Pair::T*});
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  final self::Pair<self::Cloneable<dynamic>*, self::Cloneable<dynamic>*>* x = new self::Pair::_<self::Cloneable<dynamic>*, self::Cloneable<dynamic>*>();
+}
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..f36fcca
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Pair<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::Pair::T* t;
+  covariant-by-class field self::Pair::U* u;
+  constructor •(self::Pair::T* t, self::Pair::U* u) → self::Pair<self::Pair::T*, self::Pair::U*>*
+    : self::Pair::t = t, self::Pair::u = u, super core::Object::•()
+    ;
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
+    return new self::Pair::•<self::Pair::U*, self::Pair::T*>(this.{self::Pair::u}{self::Pair::U*}, this.{self::Pair::t}{self::Pair::T*});
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..63ca562
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart:11:77: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   var /*@type=invalid-type*/ a = new A /*error:EXTRA_POSITIONAL_ARGUMENTS*/ (42);
+//                                                                             ^
+// pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart:8:7: Context: The class 'A' has a constructor that takes no arguments.
+// class A<T> {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  invalid-type a = invalid-expression "pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart:11:77: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  var /*@type=invalid-type*/ a = new A /*error:EXTRA_POSITIONAL_ARGUMENTS*/ (42);
+                                                                            ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.weak.modular.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.weak.modular.expect
new file mode 100644
index 0000000..51015b3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:13:49: Error: The return type of the method 'B.x' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.x'.
+// Change to a subtype of 'int'.
+//   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
+//                                                 ^
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:9:13: Context: This is the overridden method ('x').
+//   final int x = 2;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get x() → dynamic
+    return 3;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::String* y = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::String*;
+  core::int* z = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {
+  self::foo();
+}
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.weak.modular.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.weak.modular.expect
new file mode 100644
index 0000000..9adf7a2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic x = null;
+  static field core::int* y = 3;
+  field dynamic x2 = null;
+  field core::int* y2 = 3;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field dynamic x = null;
+static field core::int* y = 3;
+static method main() → dynamic {
+  self::x;
+  self::y;
+}
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.weak.modular.expect b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.weak.modular.expect
new file mode 100644
index 0000000..6fc489d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+
+static method test() → dynamic {
+  dynamic x = 3;
+  x = "hi";
+}
+static method main() → dynamic {
+  self::test();
+}
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.weak.modular.expect b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.weak.modular.expect
new file mode 100644
index 0000000..7dd89fd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+
+static method test() → dynamic {
+  dynamic x = null;
+  x = "hi";
+  x = 3;
+}
+static method main() → dynamic {
+  self::test();
+}
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.weak.modular.expect
new file mode 100644
index 0000000..c7d6e17
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:65: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   dynamic c = /*error:COULD_NOT_INFER*/ /*@ typeArgs=dynamic */ max(x, y);
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:81: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   var /*@ type=dynamic */ d = /*error:COULD_NOT_INFER*/ /*@ typeArgs=dynamic */ max(
+//                                                                                 ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:math" as math;
+
+import "dart:math";
+
+static method f() → dynamic {
+  core::num* x;
+  dynamic y;
+  core::num* a = math::max<core::num*>(x, y as{TypeError,ForDynamic} core::num*);
+  core::Object* b = math::max<core::num*>(x, y as{TypeError,ForDynamic} core::num*);
+  dynamic c = math::max<dynamic>(x, y);
+  dynamic d = math::max<dynamic>(x, y);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.weak.modular.expect
new file mode 100644
index 0000000..9ecd2a9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<contravariant S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
+class A<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field (self::A::T*) →* self::A::T* x;
+  constructor •((self::A::T*) →* self::A::T* x) → self::A<self::A::T*>*
+    : self::A::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  {
+    core::String* x = "hello";
+    core::int* y = 3;
+    function f(core::List<core::Map<core::int*, core::String*>*>* l) → void {}
+    ;
+    f(<core::Map<core::int*, core::String*>*>[<core::int*, core::String*>{y: x}]){(core::List<core::Map<core::int*, core::String*>*>*) →* void};
+  }
+  {
+    function f(core::int* x) → core::int*
+      return 0;
+    self::A<core::int*>* a = new self::A::•<core::int*>(f);
+  }
+}
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.weak.modular.expect
new file mode 100644
index 0000000..350439b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::Iterable<core::String*>*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  final field core::Iterable<core::String*>* foo = #C1;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.weak.modular.expect
new file mode 100644
index 0000000..5fdfe4d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  const constructor named(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+@#C1
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+@#C1
+class Baz extends core::Object {
+  synthetic constructor •() → self::Baz*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Foo.named (from org-dartlang-testcase:///downwards_inference_annotations.dart:10:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.weak.modular.expect
new file mode 100644
index 0000000..bc1bc95
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Bar extends core::Object {
+  @#C1
+  field dynamic x = null;
+  @#C1
+  constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  @#C1
+  abstract method f() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_class_members.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_class_members.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..c56e8ad
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  for (@#C1 core::int* i = 0; i.{core::num::<}(1){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+  }
+  for (@#C1 core::int* i in <core::int*>[0]) {
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_for_loop_variable.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_for_loop_variable.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.weak.modular.expect
new file mode 100644
index 0000000..bd79165
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  @#C1 dynamic x;
+  @#C1
+  function f() → void {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_locals.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_locals.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.weak.modular.expect
new file mode 100644
index 0000000..4f025f27
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  @#C1 dynamic y;
+  @#C1
+  function bar() → void {}
+  function baz(@#C1 dynamic formal) → void {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_locals_referring_to_locals.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_locals_referring_to_locals.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..d7a402b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m(@#C1 dynamic x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f(@#C1 dynamic x) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_parameter.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_parameter.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.weak.modular.expect
new file mode 100644
index 0000000..b72210d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  function f(@#C1 dynamic x) → void {}
+  (dynamic) →* Null x = (@#C1 dynamic x) → Null {};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_parameter_local.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_parameter_local.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..60436b4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.weak.modular.expect
@@ -0,0 +1,63 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<@#C1 unrelated T extends core::Object* = dynamic> = () →* void;
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<@#C1 T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  method m<@#C1 T extends core::Object* = dynamic>() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<@#C1 T extends core::Object* = dynamic>() → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_type_variable.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.weak.modular.expect
new file mode 100644
index 0000000..59529f1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  function f<@#C1 T extends core::Object* = dynamic>() → void {}
+  <T extends core::Object* = dynamic>() →* Null x = <@#C1 T extends core::Object* = dynamic>() → Null {};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_type_variable_local.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_type_variable_local.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..17384f4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+typedef F = () →* void;
+class Foo extends core::Object /*hasConstConstructor*/  {
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///downwards_inference_annotations_typedef.dart:
+- Foo. (from org-dartlang-testcase:///downwards_inference_annotations_typedef.dart:9:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.weak.modular.expect
new file mode 100644
index 0000000..c16d9c4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
+//                                                                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::List<core::int*>* l;
+  l = <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
+                                                                       ^" in "hello" as{TypeError} core::int*];
+  l = l = <core::int*>[1];
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.weak.modular.expect
new file mode 100644
index 0000000..1a5ac1a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method main() → asy::Future<dynamic>* async {
+  dynamic d;
+  core::List<core::int*>* l0 = await<core::int*>[d as{TypeError,ForDynamic} core::int*];
+  core::List<core::int*>* l1 = await asy::Future::value<core::List<core::int*>*>(<core::int*>[d as{TypeError,ForDynamic} core::int*]);
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.weak.modular.expect
new file mode 100644
index 0000000..e2d0f6d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.weak.modular.expect
@@ -0,0 +1,105 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
+  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
+    return null;
+  abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
+  abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
+  abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
+  abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
+  abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
+  abstract member-signature method asyncExpand<E extends core::Object* = dynamic>((self::MyStream::T*) →* asy::Stream<self::MyStream::asyncExpand::E*>* convert) → asy::Stream<self::MyStream::asyncExpand::E*>*; -> asy::Stream::asyncExpand
+  abstract member-signature method handleError(core::Function* onError, {(dynamic) →* core::bool* test = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::handleError
+  abstract member-signature method expand<S extends core::Object* = dynamic>((self::MyStream::T*) →* core::Iterable<self::MyStream::expand::S*>* convert) → asy::Stream<self::MyStream::expand::S*>*; -> asy::Stream::expand
+  abstract member-signature method pipe(covariant-by-class asy::StreamConsumer<self::MyStream::T*>* streamConsumer) → asy::Future<dynamic>*; -> asy::Stream::pipe
+  abstract member-signature method transform<S extends core::Object* = dynamic>(covariant-by-class asy::StreamTransformer<self::MyStream::T*, self::MyStream::transform::S*>* streamTransformer) → asy::Stream<self::MyStream::transform::S*>*; -> asy::Stream::transform
+  abstract member-signature method reduce(covariant-by-class (self::MyStream::T*, self::MyStream::T*) →* self::MyStream::T* combine) → asy::Future<self::MyStream::T*>*; -> asy::Stream::reduce
+  abstract member-signature method fold<S extends core::Object* = dynamic>(self::MyStream::fold::S* initialValue, (self::MyStream::fold::S*, self::MyStream::T*) →* self::MyStream::fold::S* combine) → asy::Future<self::MyStream::fold::S*>*; -> asy::Stream::fold
+  abstract member-signature method join([core::String* separator = #C2]) → asy::Future<core::String*>*; -> asy::Stream::join
+  abstract member-signature method contains(core::Object* needle) → asy::Future<core::bool*>*; -> asy::Stream::contains
+  abstract member-signature method forEach((self::MyStream::T*) →* void action) → asy::Future<dynamic>*; -> asy::Stream::forEach
+  abstract member-signature method every((self::MyStream::T*) →* core::bool* test) → asy::Future<core::bool*>*; -> asy::Stream::every
+  abstract member-signature method any((self::MyStream::T*) →* core::bool* test) → asy::Future<core::bool*>*; -> asy::Stream::any
+  abstract member-signature get length() → asy::Future<core::int*>*; -> asy::Stream::length
+  abstract member-signature get isEmpty() → asy::Future<core::bool*>*; -> asy::Stream::isEmpty
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → asy::Stream<self::MyStream::cast::R*>*; -> asy::Stream::cast
+  abstract member-signature method toList() → asy::Future<core::List<self::MyStream::T*>*>*; -> asy::Stream::toList
+  abstract member-signature method toSet() → asy::Future<core::Set<self::MyStream::T*>*>*; -> asy::Stream::toSet
+  abstract member-signature method drain<E extends core::Object* = dynamic>([self::MyStream::drain::E* futureValue = #C1]) → asy::Future<self::MyStream::drain::E*>*; -> asy::Stream::drain
+  abstract member-signature method take(core::int* count) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::take
+  abstract member-signature method takeWhile((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::takeWhile
+  abstract member-signature method skip(core::int* count) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::skip
+  abstract member-signature method skipWhile((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::skipWhile
+  abstract member-signature method distinct([(self::MyStream::T*, self::MyStream::T*) →* core::bool* equals = #C1]) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::distinct
+  abstract member-signature get first() → asy::Future<self::MyStream::T*>*; -> asy::Stream::first
+  abstract member-signature get last() → asy::Future<self::MyStream::T*>*; -> asy::Stream::last
+  abstract member-signature get single() → asy::Future<self::MyStream::T*>*; -> asy::Stream::single
+  abstract member-signature method firstWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::firstWhere
+  abstract member-signature method lastWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::lastWhere
+  abstract member-signature method singleWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::singleWhere
+  abstract member-signature method elementAt(core::int* index) → asy::Future<self::MyStream::T*>*; -> asy::Stream::elementAt
+  abstract member-signature method timeout(core::Duration* timeLimit, {(asy::EventSink<self::MyStream::T*>*) →* void onTimeout = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::timeout
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
+}
+static method F<T extends core::Object* = dynamic>() → self::F::T*
+  return null;
+static method f() → asy::Future<dynamic>* async {
+  dynamic d;
+  core::Object* o;
+  for (dynamic x in self::F<core::Iterable<dynamic>*>()) {
+  }
+  for (dynamic x in self::F<core::Iterable<dynamic>*>()) {
+  }
+  for (core::Object* x in self::F<core::Iterable<core::Object*>*>()) {
+  }
+  for (final dynamic #t1 in self::F<core::Iterable<dynamic>*>()) {
+    d = #t1;
+  }
+  for (final core::Object* #t2 in self::F<core::Iterable<core::Object*>*>()) {
+    o = #t2;
+  }
+  await for (dynamic x in self::F<asy::Stream<dynamic>*>()) {
+  }
+  await for (dynamic x in self::F<asy::Stream<dynamic>*>()) {
+  }
+  await for (core::Object* x in self::F<asy::Stream<core::Object*>*>()) {
+  }
+  await for (final dynamic #t3 in self::F<asy::Stream<dynamic>*>()) {
+    d = #t3;
+  }
+  await for (final core::Object* #t4 in self::F<asy::Stream<core::Object*>*>()) {
+    o = #t4;
+  }
+}
+static method main() → asy::Future<dynamic>* async {
+  for (core::int* x in <core::int*>[1, 2, 3]) {
+  }
+  for (core::num* x in <core::num*>[1, 2, 3]) {
+  }
+  for (core::int* x in <core::int*>[1, 2, 3]) {
+  }
+  await for (core::int* x in self::MyStream::•<core::int*>()) {
+  }
+  await for (core::int* x in self::MyStream::•<core::int*>()) {
+  }
+}
+
+constants  {
+  #C1 = null
+  #C2 = ""
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.weak.modular.expect
new file mode 100644
index 0000000..1283bb2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<contravariant S extends core::Object* = dynamic, T extends core::Object* = dynamic> = ([S*]) →* T*;
+class Foo extends core::Object {
+  field core::List<core::int*>* x;
+  constructor •([core::List<core::int*>* x = #C2]) → self::Foo*
+    : self::Foo::x = x, super core::Object::•()
+    ;
+  constructor named([core::List<core::int*>* x = #C2]) → self::Foo*
+    : self::Foo::x = null, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field ([core::List<core::int*>*]) →* core::String* g = ([core::List<core::int*>* llll = #C2]) → core::String* => "hello";
+static method f([core::List<core::int*>* l = #C2]) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = <core::int*>[#C1]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.weak.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.weak.outline.expect
index 2f2896d..91466e9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.weak.outline.expect
@@ -5,9 +5,9 @@
 typedef Function2<contravariant S extends core::Object* = dynamic, T extends core::Object* = dynamic> = ([S*]) →* T*;
 class Foo extends core::Object {
   field core::List<core::int*>* x;
-  constructor •([core::List<core::int*>* x]) → self::Foo*
+  constructor •([core::List<core::int*>* x = const <core::int*>[1]]) → self::Foo*
     ;
-  constructor named([core::List<core::int*>* x]) → self::Foo*
+  constructor named([core::List<core::int*>* x = const <core::int*>[1]]) → self::Foo*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -25,3 +25,9 @@
   ;
 static method main() → dynamic
   ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///downwards_inference_initializing_formal_default_formal.dart:12:38 -> ListConstant(const <int*>[1])
+Evaluated: ListLiteral @ org-dartlang-testcase:///downwards_inference_initializing_formal_default_formal.dart:13:49 -> ListConstant(const <int*>[1])
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..c66599a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* t1 = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::b} = new self::B::•<core::int*>(1);
+} =>#t1;
+static field core::List<self::B<core::int*>*>* t2 = <self::B<core::int*>*>[new self::B::•<core::int*>(2)];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.weak.modular.expect
new file mode 100644
index 0000000..69f8074
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::A<core::int*>*>* t1 = <self::A<core::int*>*>[new self::A::•<core::int*>(1)];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..3550c19
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.weak.modular.expect
@@ -0,0 +1,164 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class F0 extends core::Object {
+  constructor •(core::List<core::int*>* a) → self::F0*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F1 extends core::Object {
+  constructor •({core::List<core::int*>* a = #C1}) → self::F1*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F2 extends core::Object {
+  constructor •(core::Iterable<core::int*>* a) → self::F2*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F3 extends core::Object {
+  constructor •(core::Iterable<core::Iterable<core::int*>*>* a) → self::F3*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F4 extends core::Object {
+  constructor •({core::Iterable<core::Iterable<core::int*>*>* a = #C1}) → self::F4*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  new self::F0::•(<core::int*>[]);
+  new self::F0::•(<core::int*>[3]);
+  new self::F0::•(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F0::•(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  new self::F1::•(a: <core::int*>[]);
+  new self::F1::•(a: <core::int*>[3]);
+  new self::F1::•(a: <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
+                                               ^" in "hello" as{TypeError} core::int*]);
+  new self::F1::•(a: <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  new self::F2::•(<core::int*>[]);
+  new self::F2::•(<core::int*>[3]);
+  new self::F2::•(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F2::•(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  new self::F3::•(<core::Iterable<core::int*>*>[]);
+  new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[3]]);
+  new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
+                                                                     ^" in "hello" as{TypeError} core::int*]]);
+  new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
+                                                                     ^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
+  new self::F4::•(a: <core::Iterable<core::int*>*>[]);
+  new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
+  new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
+                                                                     ^" in "hello" as{TypeError} core::int*]]);
+  new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
+                                                                     ^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..5fd719d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                          ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f0(core::List<core::int*>* a) → void {}
+static method f1({core::List<core::int*>* a = #C1}) → void {}
+static method f2(core::Iterable<core::int*>* a) → void {}
+static method f3(core::Iterable<core::Iterable<core::int*>*>* a) → void {}
+static method f4({core::Iterable<core::Iterable<core::int*>*>* a = #C1}) → void {}
+static method test() → void {
+  self::f0(<core::int*>[]);
+  self::f0(<core::int*>[3]);
+  self::f0(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                      ^" in "hello" as{TypeError} core::int*]);
+  self::f0(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
+                                                                      ^" in "hello" as{TypeError} core::int*, 3]);
+  self::f1(a: <core::int*>[]);
+  self::f1(a: <core::int*>[3]);
+  self::f1(a: <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                         ^" in "hello" as{TypeError} core::int*]);
+  self::f1(a: <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  self::f2(<core::int*>[]);
+  self::f2(<core::int*>[3]);
+  self::f2(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                      ^" in "hello" as{TypeError} core::int*]);
+  self::f2(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
+                                                                      ^" in "hello" as{TypeError} core::int*, 3]);
+  self::f3(<core::Iterable<core::int*>*>[]);
+  self::f3(<core::Iterable<core::int*>*>[<core::int*>[3]]);
+  self::f3(<core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
+                                                                     ^" in "hello" as{TypeError} core::int*]]);
+  self::f3(<core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
+                                                                     ^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
+  self::f4(a: <core::Iterable<core::int*>*>[]);
+  self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
+  self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
+                                                                     ^" in "hello" as{TypeError} core::int*]]);
+  self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
+                                                                     ^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.weak.modular.expect
new file mode 100644
index 0000000..f4f3e7f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.weak.modular.expect
@@ -0,0 +1,117 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:80: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//         l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
+//                                                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//             3;
+//             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ x;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+//  - 'List' is from 'dart:core'.
+//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
+//                                                                            ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//               /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                          ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//             x;
+//             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'substring'.
+//             .substring(3);
+//              ^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<contravariant S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
+static method test() → void {
+  {
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
+    (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
+    (core::int*) →* core::String* l2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+        l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
+                                                                    ^" in ((core::String* x) → core::String* => "hello") as{TypeError} (core::int*) →* core::String*;
+    (core::int*) →* core::String* l3 = (core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:80: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
+                                                                               ^" in 3 as{TypeError} core::String*;
+    (core::int*) →* core::String* l4 = (core::int* x) → core::String* {
+      return invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+                                              ^" in 3 as{TypeError} core::String*;
+    };
+  }
+  {
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
+    (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
+    (core::int*) →* core::String* l2 = (core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+            3;
+            ^" in 3 as{TypeError} core::String*;
+    (core::int*) →* core::String* l3 = (core::int* x) → core::String* {
+      return invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+                                              ^" in 3 as{TypeError} core::String*;
+    };
+    (core::int*) →* core::String* l4 = (core::int* x) → core::String* {
+      return invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      return /*error:RETURN_OF_INVALID_TYPE*/ x;
+                                              ^" in x as{TypeError} core::String*;
+    };
+  }
+  {
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → Null => null;
+    (core::int*) →* core::List<core::String*>* l1 = (core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
+    (core::int*) →* core::List<core::String*>* l2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+ - 'List' is from 'dart:core'.
+        l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
+                                                                           ^" in ((core::String* x) → core::List<core::String*>* => <core::String*>["hello"]) as{TypeError} (core::int*) →* core::List<core::String*>*;
+    (core::int*) →* core::List<core::String*>* l3 = (core::int* x) → core::List<core::String*>* => <core::String*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+              /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+                                                         ^" in 3 as{TypeError} core::String*];
+    (core::int*) →* core::List<core::String*>* l4 = (core::int* x) → core::List<core::String*>* {
+      return <core::String*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+                                                   ^" in 3 as{TypeError} core::String*];
+    };
+  }
+  {
+    (core::int*) →* core::int* l0 = (core::int* x) → core::int* => x;
+    (core::int*) →* core::int* l1 = (core::int* x) → core::int* => x.{core::num::+}(1){(core::num*) →* core::int*};
+    (core::int*) →* core::String* l2 = (core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+            x;
+            ^" in x as{TypeError} core::String*;
+    (core::int*) →* core::String* l3 = (core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'substring'.
+            .substring(3);
+             ^^^^^^^^^" in x{<unresolved>}.substring(3) as{TypeError,ForDynamic} core::String*;
+    (core::String*) →* core::String* l4 = (core::String* x) → core::String* => x.{core::String::substring}(3){(core::int*, [core::int*]) →* core::String*};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.weak.modular.expect
new file mode 100644
index 0000000..a686107
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → void {
+  {
+    function f<T extends core::Object* = dynamic>(T* x) → T*
+      return null;
+    <T extends core::Object* = dynamic>(T*) →* T* v1 = f;
+    v1 = <S extends core::Object* = dynamic>(S* x) → S* => x;
+  }
+  {
+    function f<T extends core::Object* = dynamic>(T* x) → core::List<T*>*
+      return null;
+    <T extends core::Object* = dynamic>(T*) →* core::List<T*>* v2 = f;
+    v2 = <S extends core::Object* = dynamic>(S* x) → core::List<S*>* => <S*>[x];
+    core::Iterable<core::int*>* r = v2<core::int*>(42){(core::int*) →* core::List<core::int*>*};
+    core::Iterable<core::String*>* s = v2<core::String*>("hello"){(core::String*) →* core::List<core::String*>*};
+    core::Iterable<core::List<core::int*>*>* t = v2<core::List<core::int*>*>(<core::int*>[]){(core::List<core::int*>*) →* core::List<core::List<core::int*>*>*};
+    core::Iterable<core::num*>* u = v2<core::num*>(42){(core::num*) →* core::List<core::num*>*};
+    core::Iterable<core::num*>* v = v2<core::num*>(42){(core::num*) →* core::List<core::num*>*};
+  }
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.weak.modular.expect
new file mode 100644
index 0000000..81acf78
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class F3<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<core::Iterable<self::F3::T*>*>* a) → self::F3<self::F3::T*>*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F4<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::Iterable<core::Iterable<self::F4::T*>*>* a = #C1}) → self::F4<self::F4::T*>*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  new self::F3::•<dynamic>(<core::Iterable<dynamic>*>[]);
+  new self::F4::•<dynamic>(a: <core::Iterable<dynamic>*>[]);
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..6d35ee8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.weak.modular.expect
@@ -0,0 +1,172 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class F0<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::List<self::F0::T*>* a) → self::F0<self::F0::T*>*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F1<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::List<self::F1::T*>* a = #C1}) → self::F1<self::F1::T*>*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F2<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<self::F2::T*>* a) → self::F2<self::F2::T*>*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F3<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<core::Iterable<self::F3::T*>*>* a) → self::F3<self::F3::T*>*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F4<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::Iterable<core::Iterable<self::F4::T*>*>* a = #C1}) → self::F4<self::F4::T*>*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → void {
+  new self::F0::•<core::int*>(<core::int*>[]);
+  new self::F0::•<core::int*>(<core::int*>[3]);
+  new self::F0::•<core::int*>(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F0::•<core::int*>(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  new self::F1::•<core::int*>(a: <core::int*>[]);
+  new self::F1::•<core::int*>(a: <core::int*>[3]);
+  new self::F1::•<core::int*>(a: <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
+                                               ^" in "hello" as{TypeError} core::int*]);
+  new self::F1::•<core::int*>(a: <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  new self::F2::•<core::int*>(<core::int*>[]);
+  new self::F2::•<core::int*>(<core::int*>[3]);
+  new self::F2::•<core::int*>(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F2::•<core::int*>(<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[]);
+  new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[3]]);
+  new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
+                                                                     ^" in "hello" as{TypeError} core::int*]]);
+  new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
+                                                                     ^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
+  new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[]);
+  new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
+  new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
+                                                                     ^" in "hello" as{TypeError} core::int*]]);
+  new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
+                                                                     ^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
+  new self::F3::•<dynamic>(<core::Iterable<dynamic>*>[]);
+  self::F3<core::int*>* f31 = new self::F3::•<core::int*>(<core::List<core::int*>*>[<core::int*>[3]]);
+  self::F3<core::String*>* f32 = new self::F3::•<core::String*>(<core::List<core::String*>*>[<core::String*>["hello"]]);
+  self::F3<core::Object*>* f33 = new self::F3::•<core::Object*>(<core::List<core::Object*>*>[<core::String*>["hello"], <core::int*>[3]]);
+  new self::F4::•<dynamic>(a: <core::Iterable<dynamic>*>[]);
+  new self::F4::•<core::int*>(a: <core::List<core::int*>*>[<core::int*>[3]]);
+  new self::F4::•<core::String*>(a: <core::List<core::String*>*>[<core::String*>["hello"]]);
+  new self::F4::•<core::Object*>(a: <core::List<core::Object*>*>[<core::String*>["hello"], <core::int*>[3]]);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.weak.modular.expect
new file mode 100644
index 0000000..9dc00c4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.weak.modular.expect
@@ -0,0 +1,134 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//         3;
+//         ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       return /*error:RETURN_OF_INVALID_TYPE*/ x;
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+//  - 'List' is from 'dart:core'.
+//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
+//                                                                           ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                    ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//         x;
+//         ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'substring'.
+//         .substring(3);
+//          ^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  {
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
+      return null;
+    <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
+    v = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
+                                                                   ^" in (<T extends core::Object* = dynamic>(core::String* x) → core::String* => "hello") as{TypeError} <S extends core::Object* = dynamic>(core::int*) →* core::String*;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
+                                                                              ^" in 3 as{TypeError} core::String*;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
+      return invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+                                              ^" in 3 as{TypeError} core::String*;
+    };
+  }
+  {
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
+      return null;
+    <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        3;
+        ^" in 3 as{TypeError} core::String*;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
+      return invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      return /*error:RETURN_OF_INVALID_TYPE*/ 3;
+                                              ^" in 3 as{TypeError} core::String*;
+    };
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
+      return invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      return /*error:RETURN_OF_INVALID_TYPE*/ x;
+                                              ^" in x as{TypeError} core::String*;
+    };
+  }
+  {
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>*
+      return null;
+    <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
+    v = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+ - 'List' is from 'dart:core'.
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
+                                                                          ^" in (<T extends core::Object* = dynamic>(core::String* x) → core::List<core::String*>* => <core::String*>["hello"]) as{TypeError} <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>*;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+                                                     ^" in 3 as{TypeError} core::String*];
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* {
+      return <core::String*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+                                                   ^" in 3 as{TypeError} core::String*];
+    };
+  }
+  {
+    function int2int<S extends core::Object* = dynamic>(core::int* x) → core::int*
+      return null;
+    function int2String<T extends core::Object* = dynamic>(core::int* x) → core::String*
+      return null;
+    function string2String<T extends core::Object* = dynamic>(core::String* x) → core::String*
+      return null;
+    <S extends core::Object* = dynamic>(core::int*) →* core::int* x = int2int;
+    x = <T extends core::Object* = dynamic>(core::int* x) → core::int* => x;
+    x = <T extends core::Object* = dynamic>(core::int* x) → core::int* => x.{core::num::+}(1){(core::num*) →* core::int*};
+    <T extends core::Object* = dynamic>(core::int*) →* core::String* y = int2String;
+    y = <T extends core::Object* = dynamic>(core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        x;
+        ^" in x as{TypeError} core::String*;
+    y = <T extends core::Object* = dynamic>(core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'substring'.
+        .substring(3);
+         ^^^^^^^^^" in x{<unresolved>}.substring(3) as{TypeError,ForDynamic} core::String*;
+    <T extends core::Object* = dynamic>(core::String*) →* core::String* z = string2String;
+    z = <T extends core::Object* = dynamic>(core::String* x) → core::String* => x.{core::String::substring}(3){(core::int*, [core::int*]) →* core::String*};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..ef65173
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.weak.modular.expect
@@ -0,0 +1,312 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'A<int, dynamic>' that isn't of expected type 'A<int, String>'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+// Change the type of the object being constructed or the context in which it is used.
+//         a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, "hello");
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'A<dynamic, dynamic>' that isn't of expected type 'A<int, String>'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+// Change the type of the object being constructed or the context in which it is used.
+//         a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//         a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>("hello", 3);
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//         a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+//  - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//     A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
+//                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+//  - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//     A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
+//                                                       ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+//  - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//         a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>("hello");
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+//  - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//         a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
+//                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+//                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
+//                                                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::A::S* x;
+  covariant-by-class field self::A::T* y;
+  constructor •(self::A::S* x, self::A::T* y) → self::A<self::A::S*, self::A::T*>*
+    : self::A::x = x, self::A::y = y, super core::Object::•()
+    ;
+  constructor named(self::A::S* x, self::A::T* y) → self::A<self::A::S*, self::A::T*>*
+    : self::A::x = x, self::A::y = y, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::B::T*, self::B::S*> {
+  constructor •(self::B::S* y, self::B::T* x) → self::B<self::B::S*, self::B::T*>*
+    : super self::A::•(x, y)
+    ;
+  constructor named(self::B::S* y, self::B::T* x) → self::B<self::B::S*, self::B::T*>*
+    : super self::A::named(x, y)
+    ;
+}
+class C<S extends core::Object* = dynamic> extends self::B<self::C::S*, self::C::S*> {
+  constructor •(self::C::S* a) → self::C<self::C::S*>*
+    : super self::B::•(a, a)
+    ;
+  constructor named(self::C::S* a) → self::C<self::C::S*>*
+    : super self::B::named(a, a)
+    ;
+}
+class D<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::B<self::D::T*, core::int*> {
+  constructor •(self::D::T* a) → self::D<self::D::S*, self::D::T*>*
+    : super self::B::•(a, 3)
+    ;
+  constructor named(self::D::T* a) → self::D<self::D::S*, self::D::T*>*
+    : super self::B::named(a, 3)
+    ;
+}
+class E<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::C<self::E::S*>*, self::E::T*> {
+  constructor •(self::E::T* a) → self::E<self::E::S*, self::E::T*>*
+    : super self::A::•(null, a)
+    ;
+}
+class F<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::F::S*, self::F::T*> {
+  constructor •(self::F::S* x, self::F::T* y, {core::List<self::F::S*>* a = #C1, core::List<self::F::T*>* b = #C1}) → self::F<self::F::S*, self::F::T*>*
+    : super self::A::•(x, y)
+    ;
+  constructor named(self::F::S* x, self::F::T* y, [self::F::S* a = #C1, self::F::T* b = #C1]) → self::F<self::F::S*, self::F::T*>*
+    : super self::A::•(a, b)
+    ;
+}
+static method test() → void {
+  {
+    self::A<core::int*, core::String*>* a0 = new self::A::•<core::int*, core::String*>(3, "hello");
+    self::A<core::int*, core::String*>* a1 = new self::A::named<core::int*, core::String*>(3, "hello");
+    self::A<core::int*, core::String*>* a2 = new self::A::•<core::int*, core::String*>(3, "hello");
+    self::A<core::int*, core::String*>* a3 = new self::A::named<core::int*, core::String*>(3, "hello");
+    self::A<core::int*, core::String*>* a4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'A<int, dynamic>' that isn't of expected type 'A<int, String>'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Change the type of the object being constructed or the context in which it is used.
+        a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, \"hello\");
+                                                 ^" in new self::A::•<core::int*, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'A<dynamic, dynamic>' that isn't of expected type 'A<int, String>'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Change the type of the object being constructed or the context in which it is used.
+        a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(
+                                                 ^" in new self::A::named<dynamic, dynamic>(3, "hello");
+  }
+  {
+    self::A<core::int*, core::String*>* a0 = new self::A::•<core::int*, core::String*>(invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a1 = new self::A::named<core::int*, core::String*>(invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+                                               ^" in 3 as{TypeError} core::String*);
+  }
+  {
+    self::A<core::int*, core::String*>* a0 = new self::B::•<core::String*, core::int*>("hello", 3);
+    self::A<core::int*, core::String*>* a1 = new self::B::named<core::String*, core::int*>("hello", 3);
+    self::A<core::int*, core::String*>* a2 = new self::B::•<core::String*, core::int*>("hello", 3);
+    self::A<core::int*, core::String*>* a3 = new self::B::named<core::String*, core::int*>("hello", 3);
+    self::A<core::int*, core::String*>* a4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+        a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);
+                                              ^" in new self::B::•<core::String*, dynamic>("hello", 3) as{TypeError} self::A<core::int*, core::String*>*;
+    self::A<core::int*, core::String*>* a5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+        a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
+                                              ^" in new self::B::named<dynamic, dynamic>("hello", 3) as{TypeError} self::A<core::int*, core::String*>*;
+  }
+  {
+    self::A<core::int*, core::String*>* a0 = new self::B::•<core::String*, core::int*>(invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
+                                               ^" in 3 as{TypeError} core::String*, invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
+                                               ^" in "hello" as{TypeError} core::int*);
+    self::A<core::int*, core::String*>* a1 = new self::B::named<core::String*, core::int*>(invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
+                                               ^" in 3 as{TypeError} core::String*, invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
+                                               ^" in "hello" as{TypeError} core::int*);
+  }
+  {
+    self::A<core::int*, core::int*>* a0 = new self::C::•<core::int*>(3);
+    self::A<core::int*, core::int*>* a1 = new self::C::named<core::int*>(3);
+    self::A<core::int*, core::int*>* a2 = new self::C::•<core::int*>(3);
+    self::A<core::int*, core::int*>* a3 = new self::C::named<core::int*>(3);
+    self::A<core::int*, core::int*>* a4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+ - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+    A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
+                                                      ^" in new self::C::•<dynamic>(3) as{TypeError} self::A<core::int*, core::int*>*;
+    self::A<core::int*, core::int*>* a5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+ - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+    A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
+                                                      ^" in new self::C::named<dynamic>(3) as{TypeError} self::A<core::int*, core::int*>*;
+  }
+  {
+    self::A<core::int*, core::int*>* a0 = new self::C::•<core::int*>(invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
+                                               ^" in "hello" as{TypeError} core::int*);
+    self::A<core::int*, core::int*>* a1 = new self::C::named<core::int*>(invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
+                                               ^" in "hello" as{TypeError} core::int*);
+  }
+  {
+    self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, core::String*>("hello");
+    self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, core::String*>("hello");
+    self::A<core::int*, core::String*>* a2 = new self::D::•<core::int*, core::String*>("hello");
+    self::A<core::int*, core::String*>* a3 = new self::D::named<core::String*, core::String*>("hello");
+    self::A<core::int*, core::String*>* a4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+        a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");
+                                              ^" in new self::D::•<core::num*, dynamic>("hello") as{TypeError} self::A<core::int*, core::String*>*;
+    self::A<core::int*, core::String*>* a5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+        a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
+                                              ^" in new self::D::named<dynamic, dynamic>("hello") as{TypeError} self::A<core::int*, core::String*>*;
+  }
+  {
+    self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, core::String*>(invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, core::String*>(invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+                                               ^" in 3 as{TypeError} core::String*);
+  }
+  {
+    self::A<self::C<core::int*>*, core::String*>* a0 = new self::E::•<core::int*, core::String*>("hello");
+  }
+  {
+    self::A<core::int*, core::String*>* a0 = new self::F::•<core::int*, core::String*>(3, "hello", a: <core::int*>[3], b: <core::String*>["hello"]);
+    self::A<core::int*, core::String*>* a1 = new self::F::•<core::int*, core::String*>(3, "hello", a: <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
+                                                     ^" in "hello" as{TypeError} core::int*], b: <core::String*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
+                                                     ^" in 3 as{TypeError} core::String*]);
+    self::A<core::int*, core::String*>* a2 = new self::F::named<core::int*, core::String*>(3, "hello", 3, "hello");
+    self::A<core::int*, core::String*>* a3 = new self::F::named<core::int*, core::String*>(3, "hello");
+    self::A<core::int*, core::String*>* a4 = new self::F::named<core::int*, core::String*>(3, "hello", invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                               ^" in "hello" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a5 = new self::F::named<core::int*, core::String*>(3, "hello", invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+        /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
+                                               ^" in "hello" as{TypeError} core::int*);
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..871e6e1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.weak.modular.expect
@@ -0,0 +1,136 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
+//                                                                                         ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Change the type of the list literal or the context in which it is used.
+//     List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Change the type of the list literal or the context in which it is used.
+//     List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Change the type of the list literal or the context in which it is used.
+//     List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
+// Change the type of the list literal or the context in which it is used.
+//     List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
+//                                                                                         ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
+//                                                                                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo([core::List<core::String*>* list1 = #C1, core::List<core::String*>* list2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
+                                                                                        ^"]) → void {}
+static method main() → void {
+  {
+    core::List<core::int*>* l0 = <core::int*>[];
+    core::List<core::int*>* l1 = <core::int*>[3];
+    core::List<core::int*>* l2 = <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
+                                                 ^" in "hello" as{TypeError} core::int*];
+    core::List<core::int*>* l3 = <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                                 ^" in "hello" as{TypeError} core::int*, 3];
+  }
+  {
+    core::List<dynamic>* l0 = <dynamic>[];
+    core::List<dynamic>* l1 = <dynamic>[3];
+    core::List<dynamic>* l2 = <dynamic>["hello"];
+    core::List<dynamic>* l3 = <dynamic>["hello", 3];
+  }
+  {
+    core::List<core::int*>* l0 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
+Change the type of the list literal or the context in which it is used.
+    List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
+                                                            ^" in <core::num*>[];
+    core::List<core::int*>* l1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
+Change the type of the list literal or the context in which it is used.
+    List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];
+                                                            ^" in <core::num*>[3];
+    core::List<core::int*>* l2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
+Change the type of the list literal or the context in which it is used.
+    List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
+                                                            ^" in <core::num*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
+                                                 ^" in "hello" as{TypeError} core::num*];
+    core::List<core::int*>* l3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
+Change the type of the list literal or the context in which it is used.
+    List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
+                                                            ^" in <core::num*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                                 ^" in "hello" as{TypeError} core::num*, 3];
+  }
+  {
+    core::Iterable<core::int*>* i0 = <core::int*>[];
+    core::Iterable<core::int*>* i1 = <core::int*>[3];
+    core::Iterable<core::int*>* i2 = <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
+                                                 ^" in "hello" as{TypeError} core::int*];
+    core::Iterable<core::int*>* i3 = <core::int*>[invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                                 ^" in "hello" as{TypeError} core::int*, 3];
+  }
+  {
+    const core::List<core::int*>* c2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
+                                                                                        ^";
+    const core::List<core::int*>* c3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
+                                                                                        ^";
+  }
+}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.weak.modular.expect
new file mode 100644
index 0000000..c0dae24
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Asserter<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+typedef AsserterBuilder<contravariant S extends core::Object* = dynamic, contravariant T extends core::Object* = dynamic> = (S*) →* (T*) →* void;
+class DartType extends core::Object {
+  synthetic constructor •() → self::DartType*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  static field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertBOf = null;
+  field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static get assertCOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void
+    return null;
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
+    let final core::List<(self::DartType*) →* void>* #t1 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in this.{self::C::assertAOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t1){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+    self::C::assertBOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+    self::C::assertCOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+    let final core::List<(self::DartType*) →* void>* #t2 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in this.{self::C::assertDOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t2){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+    assertEOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class G<T extends core::Object* = dynamic> extends core::Object {
+  field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf = null;
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super core::Object::•()
+    ;
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
+    let final core::List<(self::DartType*) →* void>* #t3 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in this.{self::G::assertAOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t3){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+    let final core::List<(self::DartType*) →* void>* #t4 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in this.{self::G::assertAOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t4){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+    let final core::List<(self::DartType*) →* void>* #t5 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in this.{self::G::assertDOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t5){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+    assertEOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field (self::DartType*) →* void _isInt;
+static field (self::DartType*) →* void _isString;
+static field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertBOf;
+static get assertCOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void
+  return null;
+static method test() → dynamic {
+  (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
+  assertAOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  self::assertBOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  self::assertCOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  self::C::assertBOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  self::C::assertCOf(<(self::DartType*) →* void>[self::_isInt, self::_isString]){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  self::C* c;
+  let final self::C* #t6 = c in let final core::List<(self::DartType*) →* void>* #t7 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in #t6.{self::C::assertAOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t7){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  let final self::C* #t8 = c in let final core::List<(self::DartType*) →* void>* #t9 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in #t8.{self::C::assertDOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t9){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  self::G<core::int*>* g;
+  let final self::G<core::int*>* #t10 = g in let final core::List<(self::DartType*) →* void>* #t11 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in #t10.{self::G::assertAOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t11){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+  let final self::G<core::int*>* #t12 = g in let final core::List<(self::DartType*) →* void>* #t13 = <(self::DartType*) →* void>[self::_isInt, self::_isString] in #t12.{self::G::assertDOf}{(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void}(#t13){(core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..ab58333
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.weak.modular.expect
@@ -0,0 +1,161 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
+//                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
+//                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                   ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                  ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       "hello": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                        ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
+//                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": 3
+//                                             ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
+// Change the type of the map literal or the context in which it is used.
+//     Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};
+//                                                                            ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
+// Change the type of the map literal or the context in which it is used.
+//     Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
+//                                                                            ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
+// Change the type of the map literal or the context in which it is used.
+//     Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
+//                                                                            ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                                                      ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+//                                                                                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo([core::Map<core::int*, core::String*>* m1 = #C3, core::Map<core::int*, core::String*>* m2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
+                                                                              ^"]) → void {}
+static method test() → void {
+  {
+    core::Map<core::int*, core::String*>* l0 = <core::int*, core::String*>{};
+    core::Map<core::int*, core::String*>* l1 = <core::int*, core::String*>{3: "hello"};
+    core::Map<core::int*, core::String*>* l2 = <core::int*, core::String*>{invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
+                                            ^" in "hello" as{TypeError} core::int*: "hello"};
+    core::Map<core::int*, core::String*>* l3 = <core::int*, core::String*>{3: invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+                                                 ^" in 3 as{TypeError} core::String*};
+    core::Map<core::int*, core::String*>* l4 = <core::int*, core::String*>{3: "hello", invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
+                                            ^" in "hello" as{TypeError} core::int*: invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+          /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+                                                  ^" in 3 as{TypeError} core::String*};
+  }
+  {
+    core::Map<dynamic, dynamic>* l0 = <dynamic, dynamic>{};
+    core::Map<dynamic, dynamic>* l1 = <dynamic, dynamic>{3: "hello"};
+    core::Map<dynamic, dynamic>* l2 = <dynamic, dynamic>{"hello": "hello"};
+    core::Map<dynamic, dynamic>* l3 = <dynamic, dynamic>{3: 3};
+    core::Map<dynamic, dynamic>* l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
+  }
+  {
+    core::Map<dynamic, core::String*>* l0 = <dynamic, core::String*>{};
+    core::Map<dynamic, core::String*>* l1 = <dynamic, core::String*>{3: "hello"};
+    core::Map<dynamic, core::String*>* l2 = <dynamic, core::String*>{"hello": "hello"};
+    core::Map<dynamic, core::String*>* l3 = <dynamic, core::String*>{3: invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+                                                 ^" in 3 as{TypeError} core::String*};
+    core::Map<dynamic, core::String*>* l4 = <dynamic, core::String*>{3: "hello", "hello": invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+                                                       ^" in 3 as{TypeError} core::String*};
+  }
+  {
+    core::Map<core::int*, dynamic>* l0 = <core::int*, dynamic>{};
+    core::Map<core::int*, dynamic>* l1 = <core::int*, dynamic>{3: "hello"};
+    core::Map<core::int*, dynamic>* l2 = <core::int*, dynamic>{invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
+                                            ^" in "hello" as{TypeError} core::int*: "hello"};
+    core::Map<core::int*, dynamic>* l3 = <core::int*, dynamic>{3: 3};
+    core::Map<core::int*, dynamic>* l4 = <core::int*, dynamic>{3: "hello", invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
+                                            ^" in "hello" as{TypeError} core::int*: 3};
+  }
+  {
+    core::Map<core::int*, core::String*>* l0 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+Change the type of the map literal or the context in which it is used.
+    Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};
+                                                                           ^" in <core::num*, dynamic>{};
+    core::Map<core::int*, core::String*>* l1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+Change the type of the map literal or the context in which it is used.
+    Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
+                                                                           ^" in <core::num*, dynamic>{3: "hello"};
+    core::Map<core::int*, core::String*>* l3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+Change the type of the map literal or the context in which it is used.
+    Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
+                                                                           ^" in <core::num*, dynamic>{3: 3};
+  }
+  {
+    const core::Map<core::int*, core::String*>* l2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
+                                                                              ^";
+    const core::Map<core::int*, core::String*>* l3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+      3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
+                                                                                     ^";
+    const core::Map<core::int*, core::String*>* l4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
+                                                                              ^";
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = "hello"
+  #C3 = <core::int*, core::String*>{#C1:#C2)
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.weak.modular.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.weak.modular.expect
new file mode 100644
index 0000000..5951999
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.weak.modular.expect
@@ -0,0 +1,119 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:69: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+//  - 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
+//  - 'List' is from 'dart:core'.
+//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Stream' is from 'dart:async'.
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
+//                                                                ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:63: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
+//   yield /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
+//                                                               ^
+//
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:79: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
+//                                                                               ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
+  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
+    return null;
+  abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
+  abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
+  abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
+  abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
+  abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
+  abstract member-signature method asyncExpand<E extends core::Object* = dynamic>((self::MyStream::T*) →* asy::Stream<self::MyStream::asyncExpand::E*>* convert) → asy::Stream<self::MyStream::asyncExpand::E*>*; -> asy::Stream::asyncExpand
+  abstract member-signature method handleError(core::Function* onError, {(dynamic) →* core::bool* test = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::handleError
+  abstract member-signature method expand<S extends core::Object* = dynamic>((self::MyStream::T*) →* core::Iterable<self::MyStream::expand::S*>* convert) → asy::Stream<self::MyStream::expand::S*>*; -> asy::Stream::expand
+  abstract member-signature method pipe(covariant-by-class asy::StreamConsumer<self::MyStream::T*>* streamConsumer) → asy::Future<dynamic>*; -> asy::Stream::pipe
+  abstract member-signature method transform<S extends core::Object* = dynamic>(covariant-by-class asy::StreamTransformer<self::MyStream::T*, self::MyStream::transform::S*>* streamTransformer) → asy::Stream<self::MyStream::transform::S*>*; -> asy::Stream::transform
+  abstract member-signature method reduce(covariant-by-class (self::MyStream::T*, self::MyStream::T*) →* self::MyStream::T* combine) → asy::Future<self::MyStream::T*>*; -> asy::Stream::reduce
+  abstract member-signature method fold<S extends core::Object* = dynamic>(self::MyStream::fold::S* initialValue, (self::MyStream::fold::S*, self::MyStream::T*) →* self::MyStream::fold::S* combine) → asy::Future<self::MyStream::fold::S*>*; -> asy::Stream::fold
+  abstract member-signature method join([core::String* separator = #C2]) → asy::Future<core::String*>*; -> asy::Stream::join
+  abstract member-signature method contains(core::Object* needle) → asy::Future<core::bool*>*; -> asy::Stream::contains
+  abstract member-signature method forEach((self::MyStream::T*) →* void action) → asy::Future<dynamic>*; -> asy::Stream::forEach
+  abstract member-signature method every((self::MyStream::T*) →* core::bool* test) → asy::Future<core::bool*>*; -> asy::Stream::every
+  abstract member-signature method any((self::MyStream::T*) →* core::bool* test) → asy::Future<core::bool*>*; -> asy::Stream::any
+  abstract member-signature get length() → asy::Future<core::int*>*; -> asy::Stream::length
+  abstract member-signature get isEmpty() → asy::Future<core::bool*>*; -> asy::Stream::isEmpty
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → asy::Stream<self::MyStream::cast::R*>*; -> asy::Stream::cast
+  abstract member-signature method toList() → asy::Future<core::List<self::MyStream::T*>*>*; -> asy::Stream::toList
+  abstract member-signature method toSet() → asy::Future<core::Set<self::MyStream::T*>*>*; -> asy::Stream::toSet
+  abstract member-signature method drain<E extends core::Object* = dynamic>([self::MyStream::drain::E* futureValue = #C1]) → asy::Future<self::MyStream::drain::E*>*; -> asy::Stream::drain
+  abstract member-signature method take(core::int* count) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::take
+  abstract member-signature method takeWhile((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::takeWhile
+  abstract member-signature method skip(core::int* count) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::skip
+  abstract member-signature method skipWhile((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::skipWhile
+  abstract member-signature method distinct([(self::MyStream::T*, self::MyStream::T*) →* core::bool* equals = #C1]) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::distinct
+  abstract member-signature get first() → asy::Future<self::MyStream::T*>*; -> asy::Stream::first
+  abstract member-signature get last() → asy::Future<self::MyStream::T*>*; -> asy::Stream::last
+  abstract member-signature get single() → asy::Future<self::MyStream::T*>*; -> asy::Stream::single
+  abstract member-signature method firstWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::firstWhere
+  abstract member-signature method lastWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::lastWhere
+  abstract member-signature method singleWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::singleWhere
+  abstract member-signature method elementAt(core::int* index) → asy::Future<self::MyStream::T*>*; -> asy::Stream::elementAt
+  abstract member-signature method timeout(core::Duration* timeLimit, {(asy::EventSink<self::MyStream::T*>*) →* void onTimeout = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::timeout
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
+}
+static method foo() → asy::Stream<core::List<core::int*>*>* async* {
+  yield<core::int*>[];
+  yield invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:69: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+ - 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
+ - 'List' is from 'dart:core'.
+  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
+                                                                    ^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int*>*;
+  yield* invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+ - 'List' is from 'dart:core'.
+ - 'Stream' is from 'dart:async'.
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
+                                                               ^" in <dynamic>[] as{TypeError} asy::Stream<core::List<core::int*>*>*;
+  yield* self::MyStream::•<core::List<core::int*>*>();
+}
+static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>* sync* {
+  yield core::Map::•<core::int*, core::int*>();
+  yield invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:63: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+ - 'List' is from 'dart:core'.
+ - 'Map' is from 'dart:core'.
+  yield /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
+                                                              ^" in <dynamic>[] as{TypeError} core::Map<core::int*, core::int*>*;
+  yield* invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:79: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+ - 'Map' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
+                                                                              ^" in core::Map::•<dynamic, dynamic>() as{TypeError} core::Iterable<core::Map<core::int*, core::int*>*>*;
+  yield*<core::Map<core::int*, core::int*>*>[];
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = ""
+}
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.weak.modular.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.weak.modular.expect
new file mode 100644
index 0000000..3cc9299
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/dynamic_methods.dart:16:46: Error: 'hashCode' isn't a function or method and can't be invoked.
+//       d. /*@target=Object.hashCode*/ hashCode();
+//                                              ^^^^...
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  method foo(core::int* x) → core::int*
+    return x;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  dynamic d = new self::Foo::•();
+  core::int* get_hashCode = d.{core::Object::hashCode}{core::int*};
+  dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:46: Error: 'hashCode' isn't a function or method and can't be invoked.
+      d. /*@target=Object.hashCode*/ hashCode();
+                                             ^^^^..." in d.{core::Object::hashCode}{core::int*}{<unresolved>}.call();
+  core::String* call_toString = d.{core::Object::toString}(){() →* core::String*};
+  dynamic call_toStringArg = d{dynamic}.toString(color: "pink");
+  dynamic call_foo0 = d{dynamic}.foo();
+  dynamic call_foo1 = d{dynamic}.foo(1);
+  dynamic call_foo2 = d{dynamic}.foo(1, 2);
+  dynamic call_nsm0 = d{dynamic}.noSuchMethod();
+  dynamic call_nsm1 = d.{core::Object::noSuchMethod}(null){(core::Invocation*) →* dynamic};
+  dynamic call_nsm2 = d{dynamic}.noSuchMethod(null, null);
+  core::bool* equals_self = d =={core::Object::==}{(core::Object*) →* core::bool*} d;
+  core::bool* equals_null = d == null;
+  core::bool* null_equals = d == null;
+  core::bool* not_equals_self = !(d =={core::Object::==}{(core::Object*) →* core::bool*} d);
+  core::bool* not_equals_null = !(d == null);
+  core::bool* null_not_equals = !(d == null);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.weak.modular.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.weak.modular.expect
new file mode 100644
index 0000000..be4cd27
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.weak.modular.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.weak.modular.expect
new file mode 100644
index 0000000..4be2a2e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object implements self::B {
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.weak.modular.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.weak.modular.expect
new file mode 100644
index 0000000..be4cd27
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..fa1a596
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic x;
+  constructor •(core::int* p) → self::C*
+    : self::C::x = self::f<core::int*>(p), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>(self::f::T* t) → self::f::T*
+  return t;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..0c7c096
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::int* x = self::C::_x;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static get _x() → core::int*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..f7f1c21
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::int* x = self::y;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static get y() → core::int*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.weak.modular.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.weak.modular.expect
new file mode 100644
index 0000000..93ecd39
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method test() → dynamic async {
+  core::Object* o;
+  for (dynamic x in o as{TypeError} core::Iterable<dynamic>*) {
+  }
+  await for (dynamic x in o as{TypeError} asy::Stream<dynamic>*) {
+  }
+  core::int* y;
+  for (final dynamic #t1 in o as{TypeError} core::Iterable<dynamic>*) {
+    y = #t1 as{TypeError,ForDynamic} core::int*;
+  }
+  await for (final dynamic #t2 in o as{TypeError} asy::Stream<dynamic>*) {
+    y = #t2 as{TypeError,ForDynamic} core::int*;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.weak.modular.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.weak.modular.expect
new file mode 100644
index 0000000..f98e42e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::List<core::num*>* nums) → void {
+  for (core::num* x in nums) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.weak.modular.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.weak.modular.expect
new file mode 100644
index 0000000..f17816f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  #L1:
+  for (core::num* x = 0; ; x = x.{core::num::+}(1){(core::num*) →* core::num*}) {
+    if(x.{core::num::>=}(10){(core::num*) →* core::bool*})
+      break #L1;
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.weak.modular.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.weak.modular.expect
new file mode 100644
index 0000000..8f36a9c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::num* x;
+  for (final core::int* #t1 = x = 0; x.{core::num::<}(10){(core::num*) →* core::bool*}; x = x.{core::num::+}(1){(core::num*) →* core::num*}) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.weak.modular.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.weak.modular.expect
new file mode 100644
index 0000000..6cecf17
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  for (core::num* x = 0; x.{core::num::<}(10){(core::num*) →* core::bool*}; x = x.{core::num::+}(1){(core::num*) →* core::num*}) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.weak.modular.expect
new file mode 100644
index 0000000..36d60ee
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_or_subtyping.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method add(core::int* x) → void {}
+static method add2(core::int* y) → dynamic {}
+static method test() → dynamic {
+  asy::Future<core::int*>* f;
+  asy::Future<void>* a = f.{asy::Future::then}<void>(#C1){((core::int*) →* FutureOr<void>*, {onError: core::Function*}) →* asy::Future<void>*};
+  asy::Future<dynamic>* b = f.{asy::Future::then}<dynamic>(#C2){((core::int*) →* FutureOr<dynamic>*, {onError: core::Function*}) →* asy::Future<dynamic>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::add
+  #C2 = static-tearoff self::add2
+}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then.dart.weak.modular.expect
new file mode 100644
index 0000000..3472083
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => await asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return await asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return 3;
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_2.dart.weak.modular.expect
new file mode 100644
index 0000000..caba7e5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => await new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return await new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return 3;
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_3.dart.weak.modular.expect
new file mode 100644
index 0000000..1efc406
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<dynamic>* f;
+  self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => await asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return await asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return 3;
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_4.dart.weak.modular.expect
new file mode 100644
index 0000000..eaff2a5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<dynamic>* f;
+  self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => await new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return await new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return 3;
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_5.dart.weak.modular.expect
new file mode 100644
index 0000000..955cbb3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  asy::Future<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => await new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return await new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t3 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t4 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return 3;
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t7 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => new self::MyFuture::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t8 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return new self::MyFuture::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_6.dart.weak.modular.expect
new file mode 100644
index 0000000..438bfac
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  asy::Future<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => await asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return await asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t3 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t4 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return 3;
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t7 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => asy::Future::value<core::int*>(3)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t8 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return asy::Future::value<core::int*>(3);
+  }){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.weak.modular.expect
new file mode 100644
index 0000000..816b3ee
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async => x ?{core::int*} 2 : await asy::Future::value<core::int*>(3)){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* async {
+    return (await x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.weak.modular.expect
new file mode 100644
index 0000000..11b74949
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async => x ?{core::int*} 2 : await new self::MyFuture::value<core::int*>(3)){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* async {
+    return (await x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.weak.modular.expect
new file mode 100644
index 0000000..11b63b1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<core::bool*>* f;
+  self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async => x ?{core::int*} 2 : await asy::Future::value<core::int*>(3)){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* async {
+    return (await x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.weak.modular.expect
new file mode 100644
index 0000000..cc3ada3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<core::bool*>* f;
+  self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async => x ?{core::int*} 2 : await new self::MyFuture::value<core::int*>(3)){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* async {
+    return (await x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.weak.modular.expect
new file mode 100644
index 0000000..83acf25
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  asy::Future<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async => x ?{core::int*} 2 : await new self::MyFuture::value<core::int*>(3)){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* async {
+    return (await x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.weak.modular.expect
new file mode 100644
index 0000000..0c2809d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  asy::Future<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async => x ?{core::int*} 2 : await asy::Future::value<core::int*>(3)){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* async {
+    return (await x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((core::bool* x) → FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} FutureOr<core::int*>*;
+  }){((core::bool*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.weak.modular.expect
new file mode 100644
index 0000000..7024c62
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method test() → dynamic {
+  asy::Future<core::int*>* f;
+  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]){((core::int*) →* FutureOr<core::List<dynamic>*>*, {onError: core::Function*}) →* asy::Future<core::List<dynamic>*>*}.{asy::Future::whenComplete}(() → Null {}){(() →* FutureOr<void>*) →* asy::Future<core::List<dynamic>*>*} as{TypeError} asy::Future<core::List<core::int*>*>*;
+  b = f.{asy::Future::then}<core::List<core::int*>*>((core::int* x) → core::List<core::int*>* => <core::int*>[]){((core::int*) →* FutureOr<core::List<core::int*>*>*, {onError: core::Function*}) →* asy::Future<core::List<core::int*>*>*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_explicit_future.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.weak.modular.expect
new file mode 100644
index 0000000..668e6c8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/future_then_explicit_future.dart:15:99: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'FutureOr<Future<List<int>>>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Future' is from 'dart:async'.
+//       /*@returnType=FutureOr<Future<List<int*>*>*>**/ (/*@type=int**/ x) => /*@typeArgs=dynamic*/ []);
+//                                                                                                   ^
+//
+// pkg/front_end/testcases/inference/future_then_explicit_future.dart:16:25: Error: A value of type 'Future<Future<List<int>>>' can't be assigned to a variable of type 'Future<List<int>>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'List' is from 'dart:core'.
+//   Future<List<int>> y = x;
+//                         ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method m1() → dynamic {
+  asy::Future<core::int*>* f;
+  asy::Future<asy::Future<core::List<core::int*>*>*>* x = f.{asy::Future::then}<asy::Future<core::List<core::int*>*>*>((core::int* x) → FutureOr<asy::Future<core::List<core::int*>*>*>* => invalid-expression "pkg/front_end/testcases/inference/future_then_explicit_future.dart:15:99: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'FutureOr<Future<List<int>>>'.
+ - 'List' is from 'dart:core'.
+ - 'Future' is from 'dart:async'.
+      /*@returnType=FutureOr<Future<List<int*>*>*>**/ (/*@type=int**/ x) => /*@typeArgs=dynamic*/ []);
+                                                                                                  ^" in <dynamic>[] as{TypeError} FutureOr<asy::Future<core::List<core::int*>*>*>*){((core::int*) →* FutureOr<asy::Future<core::List<core::int*>*>*>*, {onError: core::Function*}) →* asy::Future<asy::Future<core::List<core::int*>*>*>*};
+  asy::Future<core::List<core::int*>*>* y = invalid-expression "pkg/front_end/testcases/inference/future_then_explicit_future.dart:16:25: Error: A value of type 'Future<Future<List<int>>>' can't be assigned to a variable of type 'Future<List<int>>'.
+ - 'Future' is from 'dart:async'.
+ - 'List' is from 'dart:core'.
+  Future<List<int>> y = x;
+                        ^" in x as{TypeError} asy::Future<core::List<core::int*>*>*;
+}
+static method m2() → dynamic {
+  asy::Future<core::int*>* f;
+  asy::Future<core::List<core::int*>*>* x = f.{asy::Future::then}<core::List<core::int*>*>((core::int* x) → core::List<core::int*>* => <core::int*>[]){((core::int*) →* FutureOr<core::List<core::int*>*>*, {onError: core::Function*}) →* asy::Future<core::List<core::int*>*>*};
+  asy::Future<core::List<core::int*>*>* y = x;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.weak.modular.expect
new file mode 100644
index 0000000..39e82e2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  self::MyFuture<core::int*>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::Future<core::int*>* async => let final core::int* #t1 = x in #t1 == null ?{core::int*} await asy::Future::value<core::int*>(3) : #t1){((core::int*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::int* x) → FutureOr<core::int*>* async {
+    return (let final core::int* #t2 = await x in #t2 == null ?{core::Object*} asy::Future::value<core::int*>(3) : #t2) as{TypeError} FutureOr<core::int*>*;
+  }){((core::int*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::int* x) → FutureOr<core::int*>* => (let final core::int* #t3 = x in #t3 == null ?{core::Object*} asy::Future::value<core::int*>(3) : #t3) as{TypeError} FutureOr<core::int*>*){((core::int*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::int* x) → FutureOr<core::int*>* {
+    return (let final core::int* #t4 = x in #t4 == null ?{core::Object*} asy::Future::value<core::int*>(3) : #t4) as{TypeError} FutureOr<core::int*>*;
+  }){((core::int*) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..ac37ff3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
+//  - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
+//  - 'Future' is from 'dart:async'.
+//   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+//                                                 ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method main() → void {
+  self::MyFuture<core::double*>* f = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3){((dynamic) →* FutureOr<core::double*>*, {onError: core::Function*}) →* self::MyFuture<core::double*>*};
+  asy::Future<core::int*>* f2 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
+ - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
+ - 'Future' is from 'dart:async'.
+  Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+                                                ^" in f as{TypeError} asy::Future<core::int*>*;
+  asy::Future<core::num*>* f3 = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3){((dynamic) →* FutureOr<core::double*>*, {onError: core::Function*}) →* self::MyFuture<core::double*>*} as asy::Future<core::double*>*;
+}
+static method foo() → self::MyFuture<dynamic>*
+  return new self::MyFuture::value<core::int*>(1);
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.weak.modular.expect
new file mode 100644
index 0000000..e071ff7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
+//  - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
+//   MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+//                                                   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method main() → void {
+  self::MyFuture<core::double*>* f = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3){((dynamic) →* FutureOr<core::double*>*, {onError: core::Function*}) →* self::MyFuture<core::double*>*};
+  self::MyFuture<core::int*>* f2 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
+ - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
+  MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+                                                  ^" in f as{TypeError} self::MyFuture<core::int*>*;
+  self::MyFuture<core::num*>* f3 = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3){((dynamic) →* FutureOr<core::double*>*, {onError: core::Function*}) →* self::MyFuture<core::double*>*} as self::MyFuture<core::double*>*;
+}
+static method foo() → self::MyFuture<dynamic>*
+  return new self::MyFuture::value<core::int*>(1);
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.weak.modular.expect
new file mode 100644
index 0000000..c45ca17
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
+//  - 'Future' is from 'dart:async'.
+//   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+//                                                 ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method test() → void {
+  asy::Future<core::double*>* f = self::foo().{asy::Future::then}<core::double*>((dynamic _) → core::double* => 2.3){((dynamic) →* FutureOr<core::double*>*, {onError: core::Function*}) →* asy::Future<core::double*>*};
+  asy::Future<core::int*>* f2 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
+ - 'Future' is from 'dart:async'.
+  Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
+                                                ^" in f as{TypeError} asy::Future<core::int*>*;
+  asy::Future<core::num*>* f3 = self::foo().{asy::Future::then}<core::double*>((dynamic _) → core::double* => 2.3){((dynamic) →* FutureOr<core::double*>*, {onError: core::Function*}) →* asy::Future<core::double*>*} as asy::Future<core::double*>*;
+}
+static method foo() → asy::Future<dynamic>*
+  return asy::Future::value<core::int*>(1);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.weak.modular.expect
new file mode 100644
index 0000000..3acce35
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method test() → dynamic {
+  asy::Future<core::int*>* base;
+  asy::Future<core::bool*>* f = base.{asy::Future::then}<core::bool*>((core::int* x) → core::bool* {
+    return x =={core::num::==}{(core::Object*) →* core::bool*} 0;
+  }){((core::int*) →* FutureOr<core::bool*>*, {onError: core::Function*}) →* asy::Future<core::bool*>*};
+  asy::Future<core::bool*>* g = base.{asy::Future::then}<core::bool*>((core::int* x) → core::bool* => x =={core::num::==}{(core::Object*) →* core::bool*} 0){((core::int*) →* FutureOr<core::bool*>*, {onError: core::Function*}) →* asy::Future<core::bool*>*};
+  asy::Future<core::bool*>* b = f;
+  b = g;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.weak.modular.expect
new file mode 100644
index 0000000..dcdc4a1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method g1(core::bool* x) → asy::Future<core::int*>* async {
+  return (x ?{core::Object*} 42 : asy::Future::value<core::int*>(42)) as{TypeError} FutureOr<core::int*>*;
+}
+static method g2(core::bool* x) → asy::Future<core::int*>* async 
+  return (x ?{core::Object*} 42 : asy::Future::value<core::int*>(42)) as{TypeError} FutureOr<core::int*>*;
+static method g3(core::bool* x) → asy::Future<core::int*>* async {
+  core::Object* y = x ?{core::Object*} 42 : asy::Future::value<core::int*>(42);
+  return y as{TypeError} FutureOr<core::int*>*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.weak.modular.expect
new file mode 100644
index 0000000..1c0791d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static method g1(core::bool* x) → asy::Future<core::int*>* async {
+  return (x ?{core::Object*} 42 : new self::MyFuture::value<core::int*>(42)) as{TypeError} FutureOr<core::int*>*;
+}
+static method g2(core::bool* x) → asy::Future<core::int*>* async 
+  return (x ?{core::Object*} 42 : new self::MyFuture::value<core::int*>(42)) as{TypeError} FutureOr<core::int*>*;
+static method g3(core::bool* x) → asy::Future<core::int*>* async {
+  core::Object* y = x ?{core::Object*} 42 : new self::MyFuture::value<dynamic>(42);
+  return y as{TypeError} FutureOr<core::int*>*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..ccef45f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/future_union_downwards.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+//         new /*@ typeArgs=int* */ Future.value('hi'));
+//                                               ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static field self::MyFuture<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+        new /*@ typeArgs=int* */ Future.value('hi'));
+                                              ^" in "hi" as{TypeError} FutureOr<core::int*>?)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.{self::MyFuture::then}<core::List<core::int*>*>((dynamic _) → core::List<core::int*>* => <core::int*>[3]){((dynamic) →* FutureOr<core::List<core::int*>*>*, {onError: core::Function*}) →* self::MyFuture<core::List<core::int*>*>*};
+static method g2() → asy::Future<core::List<core::int*>*>* async {
+  return <core::int*>[3];
+}
+static method g3() → asy::Future<core::List<core::int*>*>* async {
+  return asy::Future::value<core::List<core::int*>*>(<core::int*>[3]);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.weak.modular.expect
new file mode 100644
index 0000000..09bd9c2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static field self::MyFuture<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>("hi")){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* self::MyFuture<core::int*>*};
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.{self::MyFuture::then}<core::List<core::int*>*>((dynamic _) → core::List<core::int*>* => <core::int*>[3]){((dynamic) →* FutureOr<core::List<core::int*>*>*, {onError: core::Function*}) →* self::MyFuture<core::List<core::int*>*>*};
+static method g2() → asy::Future<core::List<core::int*>*>* async {
+  return <core::int*>[3];
+}
+static method g3() → asy::Future<core::List<core::int*>*>* async {
+  return new self::MyFuture::value<core::List<core::int*>*>(<core::int*>[3]);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.weak.modular.expect
new file mode 100644
index 0000000..36b2fa5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+//         new /*@ typeArgs=int* */ Future.value('hi'));
+//                                               ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static field asy::Future<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+        new /*@ typeArgs=int* */ Future.value('hi'));
+                                              ^" in "hi" as{TypeError} FutureOr<core::int*>?)){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.{asy::Future::then}<core::List<core::int*>*>((dynamic _) → core::List<core::int*>* => <core::int*>[3]){((dynamic) →* FutureOr<core::List<core::int*>*>*, {onError: core::Function*}) →* asy::Future<core::List<core::int*>*>*};
+static method g2() → asy::Future<core::List<core::int*>*>* async {
+  return <core::int*>[3];
+}
+static method g3() → asy::Future<core::List<core::int*>*>* async {
+  return asy::Future::value<core::List<core::int*>*>(<core::int*>[3]);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.weak.modular.expect
new file mode 100644
index 0000000..5ecc3e7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
+    : super core::Object::•() {}
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method catchError(core::Function* onError, {(core::Object*) →* core::bool* test = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method whenComplete(() →* FutureOr<void>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C8, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Stream<self::MyFuture::T*>*;
+  no-such-method-forwarder method timeout(core::Duration* timeLimit, {covariant-by-class () →* FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onTimeout}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} asy::Future<self::MyFuture::T*>*;
+}
+static field asy::Future<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>("hi")){((dynamic) →* FutureOr<core::int*>*, {onError: core::Function*}) →* asy::Future<core::int*>*};
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.{asy::Future::then}<core::List<core::int*>*>((dynamic _) → core::List<core::int*>* => <core::int*>[3]){((dynamic) →* FutureOr<core::List<core::int*>*>*, {onError: core::Function*}) →* asy::Future<core::List<core::int*>*>*};
+static method g2() → asy::Future<core::List<core::int*>*>* async {
+  return <core::int*>[3];
+}
+static method g3() → asy::Future<core::List<core::int*>*>* async {
+  return new self::MyFuture::value<core::List<core::int*>*>(<core::int*>[3]);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #asStream
+  #C8 = <dynamic>[]
+  #C9 = #timeout
+  #C10 = #onTimeout
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.weak.modular.expect
new file mode 100644
index 0000000..05e3e74
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic async {
+  asy::Future<core::List<self::A*>*>* f1 = null;
+  asy::Future<core::List<self::A*>*>* f2 = null;
+  core::List<core::List<self::A*>*>* merged = await asy::Future::wait<core::List<self::A*>*>(<asy::Future<core::List<self::A*>*>*>[f1, f2]);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.weak.modular.expect
new file mode 100644
index 0000000..8b0d132
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method id<T extends core::Object* = dynamic>(self::id::T* x) → self::id::T*
+  return x;
+static method test() → dynamic async {
+  asy::Future<core::String*>* f;
+  core::String* s = await self::id<FutureOr<core::String*>*>(f);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.weak.modular.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.weak.modular.expect
new file mode 100644
index 0000000..f663f65
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::A {
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic async {
+  asy::Future<self::B*>* b = asy::Future::value<self::B*>(new self::B::•());
+  asy::Future<self::C*>* c = asy::Future::value<self::C*>(new self::C::•());
+  core::List<asy::Future<self::A*>*>* lll = <asy::Future<self::A*>*>[b, c];
+  core::List<self::A*>* result = await asy::Future::wait<self::A*>(lll);
+  core::List<self::A*>* result2 = await asy::Future::wait<self::A*>(<asy::Future<self::A*>*>[b, c]);
+  core::List<self::A*>* list = result;
+  list = result2;
+}
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generator_closure.dart.weak.modular.expect
new file mode 100644
index 0000000..c703bed
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generator_closure.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method foo(() →* asy::Stream<core::int*>* values) → void {}
+static method main() → void {
+  self::foo(() → asy::Stream<core::int*>* async* {
+    yield 0;
+    yield 1;
+  });
+}
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..b6875d1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef ToValue<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+static method main() → dynamic {
+  function f<T extends core::Object* = dynamic>(T* x) → (T*) →* void
+    return null;
+  (core::int*) →* void x = f<core::int*>(42){(core::int*) →* (core::int*) →* void};
+  (core::int*) →* void y = f<core::int*>(42){(core::int*) →* (core::int*) →* void};
+  (core::int*) →* void takesInt = x;
+  takesInt = y;
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..421c4af
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f<S extends core::Object* = dynamic, T extends core::Object* = dynamic>(self::f::S* s) → self::f::T*
+  return null;
+static method main() → dynamic {
+  core::String* x = self::f<core::int*, core::String*>(42);
+  core::String* y = #C1<core::int*, core::String*>(42){(core::int*) →* core::String*};
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..3871d0a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart:26:79: Error: Inferred type argument 'int' doesn't conform to the bound 'String' of the type variable 'U' on 'Foo<String>.method'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//       . /*error:COULD_NOT_INFER*/ /*@ typeArgs=int* */ /*@target=Foo.method*/ method(
+//                                                                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Pattern*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+  method method<covariant-by-class U extends self::Foo::T*>(self::Foo::method::U* u) → self::Foo::method::U*
+    return u;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::Foo::•<core::String*>().{self::Foo::method}<core::int*>(42){(core::int*) →* core::int*};
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.weak.modular.expect
new file mode 100644
index 0000000..9c23381
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//       /*@ typeArgs=int* */ max(1, 2.0));
+//                                   ^
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//       /*@ typeArgs=int* */ min(1, 2.0));
+//                                   ^
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:37: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//   printInt(/*@ typeArgs=int* */ min("hi", "there"));
+//                                     ^
+//
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:43: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//   printInt(/*@ typeArgs=int* */ min("hi", "there"));
+//                                           ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:math" as math;
+
+import "dart:math";
+
+static method printInt(core::int* x) → void
+  return core::print(x);
+static method printDouble(core::double* x) → void
+  return core::print(x);
+static method myMax(core::num* x, core::num* y) → core::num*
+  return math::max<core::num*>(x, y);
+static method f() → dynamic {
+  self::printInt(math::max<core::int*>(1, 2));
+  self::printInt(math::min<core::int*>(1, 2));
+  self::printDouble(math::max<core::double*>(1.0, 2.0));
+  self::printDouble(math::min<core::double*>(1.0, 2.0));
+  self::printInt(self::myMax(1, 2) as{TypeError} core::int*);
+  self::printInt(self::myMax(1, 2) as core::int*);
+  self::printInt(math::max<core::int*>(1, invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+      /*@ typeArgs=int* */ max(1, 2.0));
+                                  ^" in 2.0 as{TypeError} core::int*));
+  self::printInt(math::min<core::int*>(1, invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+      /*@ typeArgs=int* */ min(1, 2.0));
+                                  ^" in 2.0 as{TypeError} core::int*));
+  self::printDouble(math::max<core::double*>(1.0, 2.0));
+  self::printDouble(math::min<core::double*>(1.0, 2.0));
+  self::printInt(math::min<core::int*>(invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:37: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  printInt(/*@ typeArgs=int* */ min(\"hi\", \"there\"));
+                                    ^" in "hi" as{TypeError} core::int*, invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:43: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  printInt(/*@ typeArgs=int* */ min(\"hi\", \"there\"));
+                                          ^" in "there" as{TypeError} core::int*));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.weak.modular.expect
new file mode 100644
index 0000000..6c102fe
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:3: Error: Can't infer types for 'm' as the overridden members don't have a combined signature.
+// Try adding explicit types.
+//   m(x) => x;
+//   ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is one of the overridden members.
+//   T m<T>(T x) => x;
+//     ^
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:3: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   m(x) => x;
+//   ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
+//   T m<T>(T x) => x;
+//     ^
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:18:73: Error: Expected 0 type arguments.
+//       . /*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/ /*@target=D.m*/ m<int>(
+//                                                                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    return x;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method m(invalid-type x) → invalid-type
+    return x;
+}
+static method main() → dynamic {
+  core::int* y = invalid-expression "pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:18:73: Error: Expected 0 type arguments.
+      . /*error:WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD*/ /*@target=D.m*/ m<int>(
+                                                                        ^" in new self::D::•().{self::D::m}{<inapplicable>}.<core::int*>(42){(invalid-type) →* invalid-type};
+  core::print(y);
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..79f41c9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//           /*@ typeArgs=String* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
+//                                                                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>(core::List<self::f::T*>* s) → self::f::T*
+  return null;
+static method test() → dynamic {
+  core::String* x = self::f<core::String*>(<core::String*>["hi"]);
+  core::String* y = self::f<core::String*>(<core::String*>[invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+          /*@ typeArgs=String* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
+                                                                              ^" in 42 as{TypeError} core::String*]);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.weak.modular.expect
new file mode 100644
index 0000000..b0966cb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::List<core::int*>* o;
+  core::int* y = o.{core::Iterable::fold}<core::int*>(0, (core::int* x, core::int* y) → core::int* => x.{core::num::+}(y){(core::num*) →* core::int*}){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
+  dynamic z = o.{core::Iterable::fold}<dynamic>(0, (dynamic x, core::int* y) → dynamic => x{dynamic}.+(y)){(dynamic, (dynamic, core::int*) →* dynamic) →* dynamic};
+  y = z as{TypeError,ForDynamic} core::int*;
+}
+static method functionExpressionInvocation() → void {
+  core::List<core::int*>* o;
+  core::int* y = o.{core::Iterable::fold}{<T extends core::Object* = dynamic>(T*, (T*, core::int*) →* T*) →* T*}<core::int*>(0, (core::int* x, core::int* y) → core::int* => x.{core::num::+}(y){(core::num*) →* core::int*}){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
+  dynamic z = o.{core::Iterable::fold}{<T extends core::Object* = dynamic>(T*, (T*, core::int*) →* T*) →* T*}<dynamic>(0, (dynamic x, core::int* y) → dynamic => x{dynamic}.+(y)){(dynamic, (dynamic, core::int*) →* dynamic) →* dynamic};
+  y = z as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.weak.modular.expect
new file mode 100644
index 0000000..7241ba2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:5: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   T m<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:12: Error: The parameter 'x' of the method 'D.m' has type 'T', which does not match the corresponding type, 'dynamic', in the overridden method, 'C.m'.
+// Change to a supertype of 'dynamic', or, for a covariant parameter, a subtype.
+//   T m<T>(T x) => x;
+//            ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:5: Error: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
+//   T g<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:12: Error: The parameter 'x' of the method 'D.g' has type 'T', which does not match the corresponding type, 'int', in the overridden method, 'C.g'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   T g<T>(T x) => x;
+//            ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m(dynamic x) → dynamic
+    return x;
+  method g(core::int* x) → dynamic
+    return x;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method m<T extends core::Object* = dynamic>(self::D::m::T* x) → self::D::m::T*
+    return x;
+  method g<T extends core::Object* = dynamic>(self::D::g::T* x) → self::D::g::T*
+    return x;
+}
+static method main() → dynamic {
+  core::int* y = (new self::D::•() as self::C*).{self::C::m}(42){(dynamic) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  core::print(y);
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.weak.modular.expect
new file mode 100644
index 0000000..6d57e34
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant V extends core::Object* = dynamic> = (V*) →* void;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super self::D::•()
+    ;
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::f::U*) →* void {}
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → (self::D::f::U*) →* void
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.weak.modular.expect
new file mode 100644
index 0000000..58ca700
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef G<V extends core::Object* = dynamic> = () →* core::List<V*>*;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super self::D::•()
+    ;
+  method f<U extends core::Object* = dynamic>(() →* core::List<self::C::f::U*>* g) → void
+    return null;
+}
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f<U extends core::Object* = dynamic>(() →* core::List<self::D::f::U*>* g) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.weak.modular.expect
new file mode 100644
index 0000000..60d43bc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<V extends core::Object* = dynamic> = () →* V*;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super self::D::•()
+    ;
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → () →* self::C::f::U* {}
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → () →* self::D::f::U*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..a033796
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.weak.modular.expect
@@ -0,0 +1,189 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:26:70: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   takeOOI(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+//       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
+//                                                                         ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+//       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
+//                                                                         ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:31:70: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   takeOON(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:32:70: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   takeOOO(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ math.max);
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:45:65: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   takeOOI(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+//   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+//   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
+//                                                                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:48:65: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   takeOON(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:49:65: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   takeOOO(/*error:COULD_NOT_INFER,error:INVALID_CAST_FUNCTION*/ min);
+//                                                                 ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:73:25: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//       . /*@target=C.m*/ m);
+//                         ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:75:25: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//       . /*@target=C.m*/ m);
+//                         ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:82:25: Error: Inferred type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'T Function<T extends num>(T, T)'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//       . /*@target=C.m*/ m);
+//                         ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:29: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+//           . /*@target=C.m*/ m);
+//                             ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:29: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+//           . /*@target=C.m*/ m);
+//                             ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:math" as math;
+import "dart:math" show min;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m<T extends core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  self::takeIII(#C2);
+  self::takeDDD(#C3);
+  self::takeNNN(#C4);
+  self::takeIDN(#C4);
+  self::takeDIN(#C4);
+  self::takeIIN(#C2);
+  self::takeDDN(#C3);
+  self::takeIIO(#C2);
+  self::takeDDO(#C3);
+  self::takeOOI(#C5 as{TypeError} (core::Object*, core::Object*) →* core::int*);
+  self::takeIDI(invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
+                                                                        ^" in #C4 as{TypeError} (core::double*, core::int*) →* core::int*);
+  self::takeDID(invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+      /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
+                                                                        ^" in #C4 as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON(#C5 as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO(#C5 as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeIII(#C7);
+  self::takeDDD(#C8);
+  self::takeNNN(#C9);
+  self::takeIDN(#C9);
+  self::takeDIN(#C9);
+  self::takeIIN(#C7);
+  self::takeDDN(#C8);
+  self::takeIIO(#C7);
+  self::takeDDO(#C8);
+  self::takeOOI(#C10 as{TypeError} (core::Object*, core::Object*) →* core::int*);
+  self::takeIDI(invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+  takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
+                                                                       ^" in #C9 as{TypeError} (core::double*, core::int*) →* core::int*);
+  self::takeDID(invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+  takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
+                                                                       ^" in #C9 as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON(#C10 as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO(#C10 as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeIII(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::int*>);
+  self::takeDDD(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::double*>);
+  self::takeNNN(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::num*>);
+  self::takeIDN(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::num*>);
+  self::takeDIN(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::num*>);
+  self::takeIIN(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::int*>);
+  self::takeDDN(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::double*>);
+  self::takeIIO(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::int*>);
+  self::takeDDO(new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::double*>);
+  self::takeOON((new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOI((new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
+  self::takeIDI(invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:29: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+          . /*@target=C.m*/ m);
+                            ^" in (new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
+  self::takeDID(invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:29: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+          . /*@target=C.m*/ m);
+                            ^" in (new self::C::•().{self::C::m}{<T extends core::num*>(T*, T*) →* T*}<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+}
+static method takeIII((core::int*, core::int*) →* core::int* fn) → void {}
+static method takeDDD((core::double*, core::double*) →* core::double* fn) → void {}
+static method takeIDI((core::double*, core::int*) →* core::int* fn) → void {}
+static method takeDID((core::int*, core::double*) →* core::double* fn) → void {}
+static method takeIDN((core::double*, core::int*) →* core::num* fn) → void {}
+static method takeDIN((core::int*, core::double*) →* core::num* fn) → void {}
+static method takeIIN((core::int*, core::int*) →* core::num* fn) → void {}
+static method takeDDN((core::double*, core::double*) →* core::num* fn) → void {}
+static method takeNNN((core::num*, core::num*) →* core::num* fn) → void {}
+static method takeOON((core::Object*, core::Object*) →* core::num* fn) → void {}
+static method takeOOO((core::Object*, core::Object*) →* core::num* fn) → void {}
+static method takeOOI((core::Object*, core::Object*) →* core::int* fn) → void {}
+static method takeIIO((core::int*, core::int*) →* core::Object* fn) → void {}
+static method takeDDO((core::double*, core::double*) →* core::Object* fn) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff math::max
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = instantiation #C1 <core::double*>
+  #C4 = instantiation #C1 <core::num*>
+  #C5 = instantiation #C1 <core::Object*>
+  #C6 = static-tearoff math::min
+  #C7 = instantiation #C6 <core::int*>
+  #C8 = instantiation #C6 <core::double*>
+  #C9 = instantiation #C6 <core::num*>
+  #C10 = instantiation #C6 <core::Object*>
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.weak.modular.expect
new file mode 100644
index 0000000..530ec6a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    return x;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method m<S extends core::Object* = dynamic>(self::D::m::S* x) → self::D::m::S*
+    return x;
+}
+static method main() → dynamic {
+  core::int* y = new self::D::•().{self::D::m}<core::int*>(42){(core::int*) →* core::int*};
+  core::print(y);
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.weak.modular.expect
new file mode 100644
index 0000000..4831a9f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+//
+// Problems outside component:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:9:8: Error: Not found: 'dart:_foreign_helper'
+// import 'dart:_foreign_helper' show JS; // error
+//        ^
+//
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:9:8: Error: Can't access platform private library.
+// import 'dart:_foreign_helper' show JS; // error
+//        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:12:14: Error: Method not found: 'JS'.
+//   String x = JS('int', '42'); // error
+//              ^^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:13:34: Error: Method not found: 'JS'.
+//   var /*@type=invalid-type*/ y = JS<String>('String', '"hello"');
+//                                  ^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:_foreign_helper" show JS;
+
+static method test() → dynamic {
+  core::String* x = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:12:14: Error: Method not found: 'JS'.
+  String x = JS('int', '42'); // error
+             ^^";
+  invalid-type y = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:13:34: Error: Method not found: 'JS'.
+  var /*@type=invalid-type*/ y = JS<String>('String', '\"hello\"');
+                                 ^^";
+  y = "world";
+  y = 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.weak.modular.expect
new file mode 100644
index 0000000..f3dc908
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//           1.0);
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f() → void {
+  core::List<core::String*>* y;
+  core::Iterable<core::String*>* x = y.{core::Iterable::map}<core::String*>((core::String* z) → core::String* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+          1.0);
+          ^" in 1.0 as{TypeError} core::String*){((core::String*) →* core::String*) →* core::Iterable<core::String*>*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.weak.modular.expect
new file mode 100644
index 0000000..2f4c738
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//                           /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
+//                                                                                                                           ^
+//
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+//                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
+//                                                                                                               ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method make(core::int* x) → asy::Future<core::int*>*
+  return asy::Future::•<core::int*>(() → core::int* => x);
+static method test() → dynamic {
+  core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int*>*>(#C1){((core::int*) →* asy::Future<core::int*>*) →* core::Iterable<asy::Future<core::int*>*>*};
+  asy::Future<core::List<core::int*>*>* results = asy::Future::wait<core::int*>(list);
+  asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → FutureOr<core::String*>* => list.{core::Iterable::fold}<FutureOr<core::String*>*>("", (FutureOr<core::String*>* x, core::int* y) → FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+                          /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
+                                                                                                                          ^" in x{<unresolved>}.+(y.{core::int::toString}(){() →* core::String*}) as{TypeError,ForDynamic} FutureOr<core::String*>*){(FutureOr<core::String*>*, (FutureOr<core::String*>*, core::int*) →* FutureOr<core::String*>*) →* FutureOr<core::String*>*}){((core::List<core::int*>*) →* FutureOr<core::String*>*, {onError: core::Function*}) →* asy::Future<core::String*>*};
+  asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → FutureOr<core::String*>* => list.{core::Iterable::fold}<FutureOr<core::String*>*>("", invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+                  /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
+                                                                                                              ^" in ((core::String* x, core::int* y) → core::String* => x.{core::String::+}(y.{core::int::toString}(){() →* core::String*}){(core::String*) →* core::String*}) as{TypeError} (FutureOr<core::String*>*, core::int*) →* FutureOr<core::String*>*){(FutureOr<core::String*>*, (FutureOr<core::String*>*, core::int*) →* FutureOr<core::String*>*) →* FutureOr<core::String*>*}){((core::List<core::int*>*) →* FutureOr<core::String*>*, {onError: core::Function*}) →* asy::Future<core::String*>*};
+  asy::Future<core::String*>* results4 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → core::String* => list.{core::Iterable::fold}<core::String*>("", (core::String* x, core::int* y) → core::String* => x.{core::String::+}(y.{core::int::toString}(){() →* core::String*}){(core::String*) →* core::String*}){(core::String*, (core::String*, core::int*) →* core::String*) →* core::String*}){((core::List<core::int*>*) →* FutureOr<core::String*>*, {onError: core::Function*}) →* asy::Future<core::String*>*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::make
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.modular.expect
new file mode 100644
index 0000000..5a1deb3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:math" as math;
+
+class Trace extends core::Object {
+  field core::List<self::Frame*>* frames = <self::Frame*>[];
+  synthetic constructor •() → self::Trace*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Frame extends core::Object {
+  field core::String* location = "";
+  synthetic constructor •() → self::Frame*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::List<self::Trace*>* traces = <self::Trace*>[];
+  core::int* longest = traces.{core::Iterable::map}<core::int*>((self::Trace* trace) → core::int* {
+    return trace.{self::Trace::frames}{core::List<self::Frame*>*}.{core::Iterable::map}<core::int*>((self::Frame* frame) → core::int* => frame.{self::Frame::location}{core::String*}.{core::String::length}{core::int*}){((self::Frame*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C2){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
+  }){((self::Trace*) →* core::int*) →* core::Iterable<core::int*>*}.{core::Iterable::fold}<core::int*>(0, #C2){(core::int*, (core::int*, core::int*) →* core::int*) →* core::int*};
+}
+
+constants  {
+  #C1 = static-tearoff math::max
+  #C2 = instantiation #C1 <core::int*>
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.weak.modular.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..868f419
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::Iterable<core::num*>*;
+typedef G = (core::double*) →* core::List<core::int*>*;
+static method generic<T extends core::Object* = dynamic>((self::generic::T*) →* dynamic a, (self::generic::T*) →* dynamic b) → self::generic::T*
+  return null;
+static method main() → dynamic {
+  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → Null => null, ((core::double*) →* core::List<core::int*>* g) → Null => null);
+}
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.weak.modular.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.weak.modular.expect
new file mode 100644
index 0000000..d6bd505
--- /dev/null
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class C<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::E*>*
+    : super core::Object::•()
+    ;
+  method sort([(self::C::E*, self::C::E*) →* core::int* compare = #C1]) → void {
+    self::C::sort2<self::C::E*>(this, let final (self::C::E*, self::C::E*) →* core::int* #t1 = compare in #t1 == null ?{(self::C::E*, self::C::E*) →* core::int*} #C2 : #t1);
+  }
+  static method _compareAny(dynamic a, dynamic b) → core::int* {
+    throw "unimplemented";
+  }
+  static method sort2<E extends core::Object* = dynamic>(self::C<self::C::sort2::E*>* a, (self::C::sort2::E*, self::C::sort2::E*) →* core::int* compare) → void {
+    throw "unimplemented";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = static-tearoff self::C::_compareAny
+}
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.weak.modular.expect
new file mode 100644
index 0000000..2948381e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.weak.modular.expect
@@ -0,0 +1,89 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer types for 'f' as the overridden members don't have a combined signature.
+// Try adding explicit types.
+//   f(x, {y}) {}
+//   ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
+//   I f(I x, {I y}) {}
+//     ^
+//
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:3: Error: Can't infer types for 'g' as the overridden members don't have a combined signature.
+// Try adding explicit types.
+//   g(x, {y}) {}
+//   ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
+//   A g(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
+//   A g(I x, {I y}) {}
+//     ^
+//
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:3: Error: Can't infer types for 'h' as the overridden members don't have a combined signature.
+// Try adding explicit types.
+//   h(x, {y}) {}
+//   ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the overridden members.
+//   A h(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the overridden members.
+//   A h(A x, {I y}) {}
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method f(self::A* x, {self::A* y = #C1}) → self::A* {}
+  method g(self::A* x, {self::A* y = #C1}) → self::A* {}
+  method h(self::A* x, {self::A* y = #C1}) → self::A* {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A implements self::I {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method f(invalid-type x, {invalid-type y = #C1}) → invalid-type {}
+  method g(invalid-type x, {invalid-type y = #C1}) → invalid-type {}
+  method h(invalid-type x, {invalid-type y = #C1}) → invalid-type {}
+}
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method f(self::I* x, {self::I* y = #C1}) → self::I* {}
+  method g(self::I* x, {self::I* y = #C1}) → self::A* {}
+  method h(self::A* x, {self::I* y = #C1}) → self::A* {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.weak.modular.expect
new file mode 100644
index 0000000..d7facc2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator []=(dynamic index, dynamic value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  operator []=(dynamic index, dynamic value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C implements self::I {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  operator []=(dynamic index, dynamic value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.weak.modular.expect
new file mode 100644
index 0000000..9cecf38
--- /dev/null
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator []=(core::int* index, dynamic value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  operator []=(core::int* index, dynamic value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C implements self::I {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  operator []=(core::int* index, dynamic value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.weak.modular.expect
new file mode 100644
index 0000000..d6c7c50
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object implements self::B {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return self::f() as{TypeError,ForDynamic} core::int*;
+  set x(core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  field core::int* x = 0;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f() → dynamic
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.weak.modular.expect
new file mode 100644
index 0000000..43a39ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  method test() → void {
+    this.{self::Test::member} = self::f<self::B*>();
+    this.{self::Test::member}{self::B*} == null ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : null;
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v1 = this.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::B* #t1 = this.{self::Test::member}{self::B*} in #t1 == null ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : #t1;
+    self::A* v3 = this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    self::B* v4 = this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    self::C* v5 = this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    self::B* v6 = this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v7 = let final self::B* #t2 = this.{self::Test::member}{self::B*} in let final self::B* #t3 = this.{self::Test::member} = #t2.{self::B::-}(1){(core::int*) →* self::B*} in #t2;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..af067f3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Test1 extends core::Object {
+  field core::int* t = null;
+  synthetic constructor •() → self::Test1*
+    : super core::Object::•()
+    ;
+  method test() → void {
+    core::int* v1 = this.{self::Test1::t} = self::getInt();
+    core::int* v4 = let final core::int* #t1 = this.{self::Test1::t}{core::int*} in #t1 == null ?{core::int*} this.{self::Test1::t} = self::getInt() : #t1;
+    core::int* v7 = this.{self::Test1::t} = this.{self::Test1::t}{core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+    core::int* v10 = this.{self::Test1::t} = this.{self::Test1::t}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+    core::int* v11 = let final core::int* #t2 = this.{self::Test1::t}{core::int*} in let final core::int* #t3 = this.{self::Test1::t} = #t2.{core::num::+}(1){(core::num*) →* core::int*} in #t2;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test2 extends core::Object {
+  field core::num* t = null;
+  synthetic constructor •() → self::Test2*
+    : super core::Object::•()
+    ;
+  method test() → void {
+    core::int* v1 = this.{self::Test2::t} = self::getInt();
+    core::num* v2 = this.{self::Test2::t} = self::getNum();
+    core::double* v3 = this.{self::Test2::t} = self::getDouble();
+    core::num* v4 = let final core::num* #t4 = this.{self::Test2::t}{core::num*} in #t4 == null ?{core::num*} this.{self::Test2::t} = self::getInt() : #t4;
+    core::num* v5 = let final core::num* #t5 = this.{self::Test2::t}{core::num*} in #t5 == null ?{core::num*} this.{self::Test2::t} = self::getNum() : #t5;
+    core::num* v6 = let final core::num* #t6 = this.{self::Test2::t}{core::num*} in #t6 == null ?{core::num*} this.{self::Test2::t} = self::getDouble() : #t6;
+    core::num* v7 = this.{self::Test2::t} = this.{self::Test2::t}{core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+    core::num* v8 = this.{self::Test2::t} = this.{self::Test2::t}{core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+    core::num* v9 = this.{self::Test2::t} = this.{self::Test2::t}{core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+    core::num* v10 = this.{self::Test2::t} = this.{self::Test2::t}{core::num*}.{core::num::+}(1){(core::num*) →* core::num*};
+    core::num* v11 = let final core::num* #t7 = this.{self::Test2::t}{core::num*} in let final core::num* #t8 = this.{self::Test2::t} = #t7.{core::num::+}(1){(core::num*) →* core::num*} in #t7;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test3 extends core::Object {
+  field core::double* t = null;
+  synthetic constructor •() → self::Test3*
+    : super core::Object::•()
+    ;
+  method test3() → void {
+    core::double* v3 = this.{self::Test3::t} = self::getDouble();
+    core::double* v6 = let final core::double* #t9 = this.{self::Test3::t}{core::double*} in #t9 == null ?{core::double*} this.{self::Test3::t} = self::getDouble() : #t9;
+    core::double* v7 = this.{self::Test3::t} = this.{self::Test3::t}{core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+    core::double* v8 = this.{self::Test3::t} = this.{self::Test3::t}{core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+    core::double* v9 = this.{self::Test3::t} = this.{self::Test3::t}{core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+    core::double* v10 = this.{self::Test3::t} = this.{self::Test3::t}{core::double*}.{core::double::+}(1){(core::num*) →* core::double*};
+    core::double* v11 = let final core::double* #t10 = this.{self::Test3::t}{core::double*} in let final core::double* #t11 = this.{self::Test3::t} = #t10.{core::double::+}(1){(core::num*) →* core::double*} in #t10;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.weak.modular.expect
new file mode 100644
index 0000000..446a6ee
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Index extends core::Object {
+  synthetic constructor •() → self::Index*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  operator [](self::Index* i) → self::B*
+    return null;
+  operator []=(self::Index* i, self::B* v) → void {}
+  method test() → void {
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<self::Index*>(), self::f<self::B*>()){(self::Index*, self::B*) →* void};
+    let final self::Test* #t1 = t in let final self::Index* #t2 = self::f<self::Index*>() in #t1.{self::Test::[]}(#t2){(self::Index*) →* self::B*} == null ?{self::B*} #t1.{self::Test::[]=}(#t2, self::f<self::B*>()){(self::Index*, self::B*) →* void} : null;
+    let final self::Test* #t3 = t in let final self::Index* #t4 = self::f<self::Index*>() in #t3.{self::Test::[]=}(#t4, #t3.{self::Test::[]}(#t4){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*){(self::Index*, self::B*) →* void};
+    let final self::Test* #t5 = t in let final self::Index* #t6 = self::f<self::Index*>() in #t5.{self::Test::[]=}(#t6, #t5.{self::Test::[]}(#t6){(self::Index*) →* self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*}){(self::Index*, self::B*) →* void};
+    let final self::Test* #t7 = t in let final self::Index* #t8 = self::f<self::Index*>() in #t7.{self::Test::[]=}(#t8, #t7.{self::Test::[]}(#t8){(self::Index*) →* self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*}){(self::Index*, self::B*) →* void};
+    t.{self::Test::[]}(self::f<self::Index*>()){(self::Index*) →* self::B*};
+    let final self::Test* #t9 = t in let final self::Index* #t10 = self::f<self::Index*>() in let final self::B* #t11 = #t9.{self::Test::[]}(#t10){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t12 = #t9.{self::Test::[]=}(#t10, #t11){(self::Index*, self::B*) →* void} in #t11;
+    let final self::Test* #t13 = t in let final self::Index* #t14 = self::f<self::Index*>() in #t13.{self::Test::[]=}(#t14, #t13.{self::Test::[]}(#t14){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*}){(self::Index*, self::B*) →* void};
+    self::B* v1 = let final self::Test* #t15 = t in let final self::Index* #t16 = self::f<self::Index*>() in let final self::B* #t17 = self::f<self::B*>() in let final void #t18 = #t15.{self::Test::[]=}(#t16, #t17){(self::Index*, self::B*) →* void} in #t17;
+    self::B* v2 = let final self::Test* #t19 = t in let final self::Index* #t20 = self::f<self::Index*>() in let final self::B* #t21 = #t19.{self::Test::[]}(#t20){(self::Index*) →* self::B*} in #t21 == null ?{self::B*} let final self::B* #t22 = self::f<self::B*>() in let final void #t23 = #t19.{self::Test::[]=}(#t20, #t22){(self::Index*, self::B*) →* void} in #t22 : #t21;
+    self::B* v4 = let final self::Test* #t24 = t in let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = #t24.{self::Test::[]}(#t25){(self::Index*) →* self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*} in let final void #t27 = #t24.{self::Test::[]=}(#t25, #t26){(self::Index*, self::B*) →* void} in #t26;
+    self::C* v5 = let final self::Test* #t28 = t in let final self::Index* #t29 = self::f<self::Index*>() in let final self::C* #t30 = #t28.{self::Test::[]}(#t29){(self::Index*) →* self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*} in let final void #t31 = #t28.{self::Test::[]=}(#t29, #t30){(self::Index*, self::B*) →* void} in #t30;
+    self::B* v6 = t.{self::Test::[]}(self::f<self::Index*>()){(self::Index*) →* self::B*};
+    self::B* v7 = let final self::Test* #t32 = t in let final self::Index* #t33 = self::f<self::Index*>() in let final self::B* #t34 = #t32.{self::Test::[]}(#t33){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t35 = #t32.{self::Test::[]=}(#t33, #t34){(self::Index*, self::B*) →* void} in #t34;
+    self::B* v8 = let final self::Test* #t36 = t in let final self::Index* #t37 = self::f<self::Index*>() in let final self::B* #t38 = #t36.{self::Test::[]}(#t37){(self::Index*) →* self::B*} in let final void #t39 = #t36.{self::Test::[]=}(#t37, #t38.{self::B::-}(1){(core::int*) →* self::B*}){(self::Index*, self::B*) →* void} in #t38;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.weak.modular.expect
new file mode 100644
index 0000000..3a7a814
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.weak.modular.expect
@@ -0,0 +1,94 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Index extends core::Object {
+  synthetic constructor •() → self::Index*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  operator [](self::Index* i) → self::B*
+    return null;
+  operator []=(self::Index* i, self::B* v) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test extends self::Base {
+  synthetic constructor •() → self::Test*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    super.{self::Base::[]=}(self::f<self::Index*>(), self::f<self::B*>());
+    let final self::Index* #t1 = self::f<self::Index*>() in super.{self::Base::[]}(#t1) == null ?{self::B*} super.{self::Base::[]=}(#t1, self::f<self::B*>()) : null;
+    let final self::Index* #t2 = self::f<self::Index*>() in super.{self::Base::[]=}(#t2, super.{self::Base::[]}(#t2).{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*);
+    let final self::Index* #t3 = self::f<self::Index*>() in super.{self::Base::[]=}(#t3, super.{self::Base::[]}(#t3).{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*});
+    let final self::Index* #t4 = self::f<self::Index*>() in super.{self::Base::[]=}(#t4, super.{self::Base::[]}(#t4).{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*});
+    let final self::Index* #t5 = self::f<self::Index*>() in let final self::B* #t6 = super.{self::Base::[]}(#t5).{self::B::-}(1){(core::int*) →* self::B*} in let final void #t7 = super.{self::Base::[]=}(#t5, #t6) in #t6;
+    let final self::Index* #t8 = self::f<self::Index*>() in super.{self::Base::[]=}(#t8, super.{self::Base::[]}(#t8).{self::B::-}(1){(core::int*) →* self::B*});
+    self::B* v1 = let final self::Index* #t9 = self::f<self::Index*>() in let final self::B* #t10 = self::f<self::B*>() in let final void #t11 = super.{self::Base::[]=}(#t9, #t10) in #t10;
+    self::B* v2 = let final self::Index* #t12 = self::f<self::Index*>() in let final self::B* #t13 = super.{self::Base::[]}(#t12) in #t13 == null ?{self::B*} let final self::B* #t14 = self::f<self::B*>() in let final void #t15 = super.{self::Base::[]=}(#t12, #t14) in #t14 : #t13;
+    self::A* v3 = let final self::Index* #t16 = self::f<self::Index*>() in let final self::A* #t17 = super.{self::Base::[]}(#t16).{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B* in let final void #t18 = super.{self::Base::[]=}(#t16, #t17) in #t17;
+    self::B* v4 = let final self::Index* #t19 = self::f<self::Index*>() in let final self::B* #t20 = super.{self::Base::[]}(#t19).{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*} in let final void #t21 = super.{self::Base::[]=}(#t19, #t20) in #t20;
+    self::C* v5 = let final self::Index* #t22 = self::f<self::Index*>() in let final self::C* #t23 = super.{self::Base::[]}(#t22).{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*} in let final void #t24 = super.{self::Base::[]=}(#t22, #t23) in #t23;
+    self::B* v6 = let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = super.{self::Base::[]}(#t25).{self::B::-}(1){(core::int*) →* self::B*} in let final void #t27 = super.{self::Base::[]=}(#t25, #t26) in #t26;
+    self::B* v7 = let final self::Index* #t28 = self::f<self::Index*>() in let final self::B* #t29 = super.{self::Base::[]}(#t28) in let final void #t30 = super.{self::Base::[]=}(#t28, #t29.{self::B::-}(1){(core::int*) →* self::B*}) in #t29;
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.weak.modular.expect
new file mode 100644
index 0000000..d61e224
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.weak.modular.expect
@@ -0,0 +1,89 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Index extends core::Object {
+  synthetic constructor •() → self::Index*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  operator [](self::Index* i) → self::B*
+    return null;
+  operator []=(self::Index* i, self::B* v) → void {}
+  method test() → void {
+    this.{self::Test::[]=}(self::f<self::Index*>(), self::f<self::B*>()){(self::Index*, self::B*) →* void};
+    let final self::Index* #t1 = self::f<self::Index*>() in this.{self::Test::[]}(#t1){(self::Index*) →* self::B*} == null ?{self::B*} this.{self::Test::[]=}(#t1, self::f<self::B*>()){(self::Index*, self::B*) →* void} : null;
+    let final self::Index* #t2 = self::f<self::Index*>() in this.{self::Test::[]=}(#t2, this.{self::Test::[]}(#t2){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*){(self::Index*, self::B*) →* void};
+    let final self::Index* #t3 = self::f<self::Index*>() in this.{self::Test::[]=}(#t3, this.{self::Test::[]}(#t3){(self::Index*) →* self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*}){(self::Index*, self::B*) →* void};
+    let final self::Index* #t4 = self::f<self::Index*>() in this.{self::Test::[]=}(#t4, this.{self::Test::[]}(#t4){(self::Index*) →* self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*}){(self::Index*, self::B*) →* void};
+    let final self::Index* #t5 = self::f<self::Index*>() in let final self::B* #t6 = this.{self::Test::[]}(#t5){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t7 = this.{self::Test::[]=}(#t5, #t6){(self::Index*, self::B*) →* void} in #t6;
+    let final self::Index* #t8 = self::f<self::Index*>() in this.{self::Test::[]=}(#t8, this.{self::Test::[]}(#t8){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*}){(self::Index*, self::B*) →* void};
+    self::B* v1 = let final self::Index* #t9 = self::f<self::Index*>() in let final self::B* #t10 = self::f<self::B*>() in let final void #t11 = this.{self::Test::[]=}(#t9, #t10){(self::Index*, self::B*) →* void} in #t10;
+    self::B* v2 = let final self::Index* #t12 = self::f<self::Index*>() in let final self::B* #t13 = this.{self::Test::[]}(#t12){(self::Index*) →* self::B*} in #t13 == null ?{self::B*} let final self::B* #t14 = self::f<self::B*>() in let final void #t15 = this.{self::Test::[]=}(#t12, #t14){(self::Index*, self::B*) →* void} in #t14 : #t13;
+    self::A* v4 = let final self::Index* #t16 = self::f<self::Index*>() in let final self::A* #t17 = this.{self::Test::[]}(#t16){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B* in let final void #t18 = this.{self::Test::[]=}(#t16, #t17){(self::Index*, self::B*) →* void} in #t17;
+    self::B* v3 = let final self::Index* #t19 = self::f<self::Index*>() in let final self::B* #t20 = this.{self::Test::[]}(#t19){(self::Index*) →* self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*} in let final void #t21 = this.{self::Test::[]=}(#t19, #t20){(self::Index*, self::B*) →* void} in #t20;
+    self::C* v5 = let final self::Index* #t22 = self::f<self::Index*>() in let final self::C* #t23 = this.{self::Test::[]}(#t22){(self::Index*) →* self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*} in let final void #t24 = this.{self::Test::[]=}(#t22, #t23){(self::Index*, self::B*) →* void} in #t23;
+    self::B* v6 = let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = this.{self::Test::[]}(#t25){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t27 = this.{self::Test::[]=}(#t25, #t26){(self::Index*, self::B*) →* void} in #t26;
+    self::B* v7 = let final self::Index* #t28 = self::f<self::Index*>() in let final self::B* #t29 = this.{self::Test::[]}(#t28){(self::Index*) →* self::B*} in let final void #t30 = this.{self::Test::[]=}(#t28, #t29.{self::B::-}(1){(core::int*) →* self::B*}){(self::Index*, self::B*) →* void} in #t29;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.weak.modular.expect
new file mode 100644
index 0000000..5bdc052
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → void {
+  self::B* local;
+  local = self::f<self::B*>();
+  local == null ?{self::B*} local = self::f<self::B*>() : null;
+  local = local.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  local = local.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  local = local.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  local = local.{self::B::-}(1){(core::int*) →* self::B*};
+  local = local.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v1 = local = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = local in #t1 == null ?{self::B*} local = self::f<self::B*>() : #t1;
+  self::A* v3 = local = local.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::B* v4 = local = local.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::C* v5 = local = local.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::B* v6 = local = local.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v7 = let final self::B* #t2 = local in let final self::B* #t3 = local = #t2.{self::B::-}(1){(core::int*) →* self::B*} in #t2;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..eda9415
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method test1(core::int* t) → void {
+  core::int* v1 = t = self::getInt();
+  core::int* v4 = let final core::int* #t1 = t in #t1 == null ?{core::int*} t = self::getInt() : #t1;
+  core::int* v7 = t = t.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+  core::int* v10 = t = t.{core::num::+}(1){(core::num*) →* core::int*};
+  core::int* v11 = let final core::int* #t2 = t in let final core::int* #t3 = t = #t2.{core::num::+}(1){(core::num*) →* core::int*} in #t2;
+}
+static method test2(core::num* t) → void {
+  core::int* v1 = t = self::getInt();
+  core::num* v2 = t = self::getNum();
+  core::double* v3 = t = self::getDouble();
+  core::num* v4 = let final core::num* #t4 = t in #t4 == null ?{core::num*} t = self::getInt() : #t4;
+  core::num* v5 = let final core::num* #t5 = t in #t5 == null ?{core::num*} t = self::getNum() : #t5;
+  core::num* v6 = let final core::num* #t6 = t in #t6 == null ?{core::num*} t = self::getDouble() : #t6;
+  core::num* v7 = t = t.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+  core::num* v8 = t = t.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+  core::num* v9 = t = t.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+  core::num* v10 = t = t.{core::num::+}(1){(core::num*) →* core::num*};
+  core::num* v11 = let final core::num* #t7 = t in let final core::num* #t8 = t = #t7.{core::num::+}(1){(core::num*) →* core::num*} in #t7;
+}
+static method test3(core::double* t) → void {
+  core::double* v3 = t = self::getDouble();
+  core::double* v6 = let final core::double* #t9 = t in #t9 == null ?{core::double*} t = self::getDouble() : #t9;
+  core::double* v7 = t = t.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+  core::double* v8 = t = t.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+  core::double* v9 = t = t.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+  core::double* v10 = t = t.{core::double::+}(1){(core::num*) →* core::double*};
+  core::double* v11 = let final core::double* #t10 = t in let final core::double* #t11 = t = #t10.{core::double::+}(1){(core::num*) →* core::double*} in #t10;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.weak.modular.expect
new file mode 100644
index 0000000..2e41284
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  static method test(self::Test* t) → void {
+    t.{self::Test::member} = self::f<self::B*>();
+    let final self::Test* #t1 = t in #t1.{self::Test::member}{self::B*} == null ?{self::B*} #t1.{self::Test::member} = self::f<self::B*>() : null;
+    let final self::Test* #t2 = t in #t2.{self::Test::member} = #t2.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    let final self::Test* #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    let final self::Test* #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    let final self::Test* #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    let final self::Test* #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v1 = t.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::Test* #t7 = t in let final self::B* #t8 = #t7.{self::Test::member}{self::B*} in #t8 == null ?{self::B*} #t7.{self::Test::member} = self::f<self::B*>() : #t8;
+    self::A* v3 = let final self::Test* #t9 = t in #t9.{self::Test::member} = #t9.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    self::B* v4 = let final self::Test* #t10 = t in #t10.{self::Test::member} = #t10.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    self::C* v5 = let final self::Test* #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    self::B* v6 = let final self::Test* #t12 = t in #t12.{self::Test::member} = #t12.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v7 = let final self::Test* #t13 = t in let final self::B* #t14 = #t13.{self::Test::member}{self::B*} in let final self::B* #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1){(core::int*) →* self::B*} in #t14;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.weak.modular.expect
new file mode 100644
index 0000000..681f9aa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  static method test(self::Test* t) → void {
+    let final self::Test* #t1 = t in #t1 == null ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
+    let final self::Test* #t2 = t in #t2 == null ?{self::B*} null : #t2.{self::Test::member}{self::B*} == null ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
+    let final self::Test* #t3 = t in #t3 == null ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    let final self::Test* #t4 = t in #t4 == null ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    let final self::Test* #t5 = t in #t5 == null ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    let final self::Test* #t6 = t in #t6 == null ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
+    let final self::Test* #t9 = t in #t9 == null ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v1 = let final self::Test* #t10 = t in #t10 == null ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::Test* #t11 = t in #t11 == null ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member}{self::B*} in #t12 == null ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
+    self::A* v3 = let final self::Test* #t13 = t in #t13 == null ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
+    self::B* v4 = let final self::Test* #t16 = t in #t16 == null ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*} in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
+    self::C* v5 = let final self::Test* #t19 = t in #t19 == null ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*} in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
+    self::B* v6 = let final self::Test* #t22 = t in #t22 == null ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
+    self::B* v7 = let final self::Test* #t25 = t in #t25 == null ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member}{self::B*} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1){(core::int*) →* self::B*} in #t26;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..defcb5a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Test1 extends core::Object {
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
+    : super core::Object::•()
+    ;
+  static method test(self::Test1* t) → void {
+    core::int* v1 = let final self::Test1* #t1 = t in #t1 == null ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
+    core::int* v4 = let final self::Test1* #t2 = t in #t2 == null ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop}{core::int*} in #t3 == null ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
+    core::int* v7 = let final self::Test1* #t4 = t in #t4 == null ?{core::int*} null : let final core::int* #t5 = #t4.{self::Test1::prop}{core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*} in let final void #t6 = #t4.{self::Test1::prop} = #t5 in #t5;
+    core::int* v10 = let final self::Test1* #t7 = t in #t7 == null ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
+    core::int* v11 = let final self::Test1* #t10 = t in #t10 == null ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop}{core::int*} in let final void #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1){(core::num*) →* core::int*} in #t11;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test2 extends core::Object {
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
+    : super core::Object::•()
+    ;
+  static method test(self::Test2* t) → void {
+    core::int* v1 = let final self::Test2* #t13 = t in #t13 == null ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
+    core::num* v2 = let final self::Test2* #t14 = t in #t14 == null ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
+    core::double* v3 = let final self::Test2* #t15 = t in #t15 == null ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
+    core::num* v4 = let final self::Test2* #t16 = t in #t16 == null ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop}{core::num*} in #t17 == null ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
+    core::num* v5 = let final self::Test2* #t18 = t in #t18 == null ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop}{core::num*} in #t19 == null ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
+    core::num* v6 = let final self::Test2* #t20 = t in #t20 == null ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop}{core::num*} in #t21 == null ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
+    core::num* v7 = let final self::Test2* #t22 = t in #t22 == null ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop}{core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*} in let final void #t24 = #t22.{self::Test2::prop} = #t23 in #t23;
+    core::num* v8 = let final self::Test2* #t25 = t in #t25 == null ?{core::num*} null : let final core::num* #t26 = #t25.{self::Test2::prop}{core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} in let final void #t27 = #t25.{self::Test2::prop} = #t26 in #t26;
+    core::num* v9 = let final self::Test2* #t28 = t in #t28 == null ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}{core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*} in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
+    core::num* v10 = let final self::Test2* #t31 = t in #t31 == null ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}{core::num*}.{core::num::+}(1){(core::num*) →* core::num*} in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
+    core::num* v11 = let final self::Test2* #t34 = t in #t34 == null ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop}{core::num*} in let final void #t36 = #t34.{self::Test2::prop} = #t35.{core::num::+}(1){(core::num*) →* core::num*} in #t35;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test3 extends core::Object {
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
+    : super core::Object::•()
+    ;
+  static method test3(self::Test3* t) → void {
+    core::double* v3 = let final self::Test3* #t37 = t in #t37 == null ?{core::double*} null : #t37.{self::Test3::prop} = self::getDouble();
+    core::double* v6 = let final self::Test3* #t38 = t in #t38 == null ?{core::double*} null : let final core::double* #t39 = #t38.{self::Test3::prop}{core::double*} in #t39 == null ?{core::double*} #t38.{self::Test3::prop} = self::getDouble() : #t39;
+    core::double* v7 = let final self::Test3* #t40 = t in #t40 == null ?{core::double*} null : let final core::double* #t41 = #t40.{self::Test3::prop}{core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*} in let final void #t42 = #t40.{self::Test3::prop} = #t41 in #t41;
+    core::double* v8 = let final self::Test3* #t43 = t in #t43 == null ?{core::double*} null : let final core::double* #t44 = #t43.{self::Test3::prop}{core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*} in let final void #t45 = #t43.{self::Test3::prop} = #t44 in #t44;
+    core::double* v9 = let final self::Test3* #t46 = t in #t46 == null ?{core::double*} null : let final core::double* #t47 = #t46.{self::Test3::prop}{core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t48 = #t46.{self::Test3::prop} = #t47 in #t47;
+    core::double* v10 = let final self::Test3* #t49 = t in #t49 == null ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}{core::double*}.{core::double::+}(1){(core::num*) →* core::double*} in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
+    core::double* v11 = let final self::Test3* #t52 = t in #t52 == null ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop}{core::double*} in let final void #t54 = #t52.{self::Test3::prop} = #t53.{core::double::+}(1){(core::num*) →* core::double*} in #t53;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.weak.modular.expect
new file mode 100644
index 0000000..28b3433
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Base extends core::Object {
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test extends self::Base {
+  synthetic constructor •() → self::Test*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    super.{self::Base::member} = self::f<self::B*>();
+    super.{self::Base::member} == null ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : null;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1){(core::int*) →* self::B*};
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v1 = super.{self::Base::member} = self::f<self::B*>();
+    self::B* v2 = let final self::B* #t1 = super.{self::Base::member} in #t1 == null ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : #t1;
+    self::A* v3 = super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    self::B* v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    self::C* v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    self::B* v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v7 = let final self::B* #t2 = super.{self::Base::member} in let final self::B* #t3 = super.{self::Base::member} = #t2.{self::B::-}(1){(core::int*) →* self::B*} in #t2;
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..15883a8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.weak.modular.expect
@@ -0,0 +1,73 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test1 extends self::Base {
+  synthetic constructor •() → self::Test1*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = super.{self::Base::intProp} = self::getInt();
+    core::int* v4 = let final core::int* #t1 = super.{self::Base::intProp} in #t1 == null ?{core::int*} super.{self::Base::intProp} = self::getInt() : #t1;
+    core::int* v7 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+    core::int* v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1){(core::num*) →* core::int*};
+    core::int* v11 = let final core::int* #t2 = super.{self::Base::intProp} in let final core::int* #t3 = super.{self::Base::intProp} = #t2.{core::num::+}(1){(core::num*) →* core::int*} in #t2;
+  }
+}
+class Test2 extends self::Base {
+  synthetic constructor •() → self::Test2*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = super.{self::Base::numProp} = self::getInt();
+    core::num* v2 = super.{self::Base::numProp} = self::getNum();
+    core::double* v3 = super.{self::Base::numProp} = self::getDouble();
+    core::num* v4 = let final core::num* #t4 = super.{self::Base::numProp} in #t4 == null ?{core::num*} super.{self::Base::numProp} = self::getInt() : #t4;
+    core::num* v5 = let final core::num* #t5 = super.{self::Base::numProp} in #t5 == null ?{core::num*} super.{self::Base::numProp} = self::getNum() : #t5;
+    core::num* v6 = let final core::num* #t6 = super.{self::Base::numProp} in #t6 == null ?{core::num*} super.{self::Base::numProp} = self::getDouble() : #t6;
+    core::num* v7 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+    core::num* v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+    core::num* v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+    core::num* v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1){(core::num*) →* core::num*};
+    core::num* v11 = let final core::num* #t7 = super.{self::Base::numProp} in let final core::num* #t8 = super.{self::Base::numProp} = #t7.{core::num::+}(1){(core::num*) →* core::num*} in #t7;
+  }
+}
+class Test3 extends self::Base {
+  synthetic constructor •() → self::Test3*
+    : super self::Base::•()
+    ;
+  method test3() → void {
+    core::double* v3 = super.{self::Base::doubleProp} = self::getDouble();
+    core::double* v6 = let final core::double* #t9 = super.{self::Base::doubleProp} in #t9 == null ?{core::double*} super.{self::Base::doubleProp} = self::getDouble() : #t9;
+    core::double* v7 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+    core::double* v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+    core::double* v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+    core::double* v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1){(core::num*) →* core::double*};
+    core::double* v11 = let final core::double* #t10 = super.{self::Base::doubleProp} in let final core::double* #t11 = super.{self::Base::doubleProp} = #t10.{core::double::+}(1){(core::num*) →* core::double*} in #t10;
+  }
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..1e03234
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Test1 extends core::Object {
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
+    : super core::Object::•()
+    ;
+  static method test(self::Test1* t) → void {
+    core::int* v1 = t.{self::Test1::prop} = self::getInt();
+    core::int* v4 = let final self::Test1* #t1 = t in let final core::int* #t2 = #t1.{self::Test1::prop}{core::int*} in #t2 == null ?{core::int*} #t1.{self::Test1::prop} = self::getInt() : #t2;
+    core::int* v7 = let final self::Test1* #t3 = t in #t3.{self::Test1::prop} = #t3.{self::Test1::prop}{core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+    core::int* v10 = let final self::Test1* #t4 = t in #t4.{self::Test1::prop} = #t4.{self::Test1::prop}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+    core::int* v11 = let final self::Test1* #t5 = t in let final core::int* #t6 = #t5.{self::Test1::prop}{core::int*} in let final core::int* #t7 = #t5.{self::Test1::prop} = #t6.{core::num::+}(1){(core::num*) →* core::int*} in #t6;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test2 extends core::Object {
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
+    : super core::Object::•()
+    ;
+  static method test(self::Test2* t) → void {
+    core::int* v1 = t.{self::Test2::prop} = self::getInt();
+    core::num* v2 = t.{self::Test2::prop} = self::getNum();
+    core::double* v3 = t.{self::Test2::prop} = self::getDouble();
+    core::num* v4 = let final self::Test2* #t8 = t in let final core::num* #t9 = #t8.{self::Test2::prop}{core::num*} in #t9 == null ?{core::num*} #t8.{self::Test2::prop} = self::getInt() : #t9;
+    core::num* v5 = let final self::Test2* #t10 = t in let final core::num* #t11 = #t10.{self::Test2::prop}{core::num*} in #t11 == null ?{core::num*} #t10.{self::Test2::prop} = self::getNum() : #t11;
+    core::num* v6 = let final self::Test2* #t12 = t in let final core::num* #t13 = #t12.{self::Test2::prop}{core::num*} in #t13 == null ?{core::num*} #t12.{self::Test2::prop} = self::getDouble() : #t13;
+    core::num* v7 = let final self::Test2* #t14 = t in #t14.{self::Test2::prop} = #t14.{self::Test2::prop}{core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+    core::num* v8 = let final self::Test2* #t15 = t in #t15.{self::Test2::prop} = #t15.{self::Test2::prop}{core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+    core::num* v9 = let final self::Test2* #t16 = t in #t16.{self::Test2::prop} = #t16.{self::Test2::prop}{core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+    core::num* v10 = let final self::Test2* #t17 = t in #t17.{self::Test2::prop} = #t17.{self::Test2::prop}{core::num*}.{core::num::+}(1){(core::num*) →* core::num*};
+    core::num* v11 = let final self::Test2* #t18 = t in let final core::num* #t19 = #t18.{self::Test2::prop}{core::num*} in let final core::num* #t20 = #t18.{self::Test2::prop} = #t19.{core::num::+}(1){(core::num*) →* core::num*} in #t19;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test3 extends core::Object {
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
+    : super core::Object::•()
+    ;
+  static method test3(self::Test3* t) → void {
+    core::double* v3 = t.{self::Test3::prop} = self::getDouble();
+    core::double* v6 = let final self::Test3* #t21 = t in let final core::double* #t22 = #t21.{self::Test3::prop}{core::double*} in #t22 == null ?{core::double*} #t21.{self::Test3::prop} = self::getDouble() : #t22;
+    core::double* v7 = let final self::Test3* #t23 = t in #t23.{self::Test3::prop} = #t23.{self::Test3::prop}{core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+    core::double* v8 = let final self::Test3* #t24 = t in #t24.{self::Test3::prop} = #t24.{self::Test3::prop}{core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+    core::double* v9 = let final self::Test3* #t25 = t in #t25.{self::Test3::prop} = #t25.{self::Test3::prop}{core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+    core::double* v10 = let final self::Test3* #t26 = t in #t26.{self::Test3::prop} = #t26.{self::Test3::prop}{core::double*}.{core::double::+}(1){(core::num*) →* core::double*};
+    core::double* v11 = let final self::Test3* #t27 = t in let final core::double* #t28 = #t27.{self::Test3::prop}{core::double*} in let final core::double* #t29 = #t27.{self::Test3::prop} = #t28.{core::double::+}(1){(core::num*) →* core::double*} in #t28;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.weak.modular.expect
new file mode 100644
index 0000000..e1508e3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* a = new self::A::•();
+static field core::int* c = 0;
+static method main() → dynamic {
+  self::a;
+  self::c;
+}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.weak.modular.expect
new file mode 100644
index 0000000..090413f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static field self::B* topLevelVariable;
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test_topLevelVariable() → void {
+  self::topLevelVariable = self::f<self::B*>();
+  self::topLevelVariable == null ?{self::B*} self::topLevelVariable = self::f<self::B*>() : null;
+  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::topLevelVariable = self::topLevelVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::topLevelVariable = self::topLevelVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v1 = self::topLevelVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = self::topLevelVariable in #t1 == null ?{self::B*} self::topLevelVariable = self::f<self::B*>() : #t1;
+  self::A* v3 = self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::B* v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::C* v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::B* v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v7 = let final self::B* #t2 = self::topLevelVariable in let final self::B* #t3 = self::topLevelVariable = #t2.{self::B::-}(1){(core::int*) →* self::B*} in #t2;
+}
+static method test_staticVariable() → void {
+  self::B::staticVariable = self::f<self::B*>();
+  self::B::staticVariable == null ?{self::B*} self::B::staticVariable = self::f<self::B*>() : null;
+  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::B::staticVariable = self::B::staticVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B::staticVariable = self::B::staticVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v1 = self::B::staticVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t4 = self::B::staticVariable in #t4 == null ?{self::B*} self::B::staticVariable = self::f<self::B*>() : #t4;
+  self::A* v3 = self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::B* v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::C* v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::B* v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v7 = let final self::B* #t5 = self::B::staticVariable in let final self::B* #t6 = self::B::staticVariable = #t5.{self::B::-}(1){(core::int*) →* self::B*} in #t5;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..4130e63
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* topLevelInt;
+static field core::num* topLevelNum;
+static field core::double* topLevelDouble;
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method test1() → void {
+  core::int* v1 = self::topLevelInt = self::getInt();
+  core::int* v4 = let final core::int* #t1 = self::topLevelInt in #t1 == null ?{core::int*} self::topLevelInt = self::getInt() : #t1;
+  core::int* v7 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+  core::int* v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1){(core::num*) →* core::int*};
+  core::int* v11 = let final core::int* #t2 = self::topLevelInt in let final core::int* #t3 = self::topLevelInt = #t2.{core::num::+}(1){(core::num*) →* core::int*} in #t2;
+}
+static method test2() → void {
+  core::int* v1 = self::topLevelNum = self::getInt();
+  core::num* v2 = self::topLevelNum = self::getNum();
+  core::double* v3 = self::topLevelNum = self::getDouble();
+  core::num* v4 = let final core::num* #t4 = self::topLevelNum in #t4 == null ?{core::num*} self::topLevelNum = self::getInt() : #t4;
+  core::num* v5 = let final core::num* #t5 = self::topLevelNum in #t5 == null ?{core::num*} self::topLevelNum = self::getNum() : #t5;
+  core::num* v6 = let final core::num* #t6 = self::topLevelNum in #t6 == null ?{core::num*} self::topLevelNum = self::getDouble() : #t6;
+  core::num* v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+  core::num* v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+  core::num* v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+  core::num* v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1){(core::num*) →* core::num*};
+  core::num* v11 = let final core::num* #t7 = self::topLevelNum in let final core::num* #t8 = self::topLevelNum = #t7.{core::num::+}(1){(core::num*) →* core::num*} in #t7;
+}
+static method test3() → void {
+  core::double* v3 = self::topLevelDouble = self::getDouble();
+  core::double* v6 = let final core::double* #t9 = self::topLevelDouble in #t9 == null ?{core::double*} self::topLevelDouble = self::getDouble() : #t9;
+  core::double* v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+  core::double* v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+  core::double* v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+  core::double* v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1){(core::num*) →* core::double*};
+  core::double* v11 = let final core::double* #t10 = self::topLevelDouble in let final core::double* #t11 = self::topLevelDouble = #t10.{core::double::+}(1){(core::num*) →* core::double*} in #t10;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.weak.modular.expect
new file mode 100644
index 0000000..2fd7b9e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → core::int*
+    return 1;
+  operator -(dynamic other) → core::double*
+    return 2.0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* v_add = new self::A::•().{self::A::+}("foo"){(dynamic) →* core::int*};
+static field core::double* v_minus = new self::A::•().{self::A::-}("bar"){(dynamic) →* core::double*};
+static method main() → dynamic {
+  self::v_add;
+  self::v_minus;
+}
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.weak.modular.expect
new file mode 100644
index 0000000..38be484
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal = 1.0 =={core::num::==}{(core::Object*) →* core::bool*} 2.0;
+static field core::bool* a_notEqual = !(1.0 =={core::num::==}{(core::Object*) →* core::bool*} 2.0);
+static field core::double* a_add = 1.0.{core::double::+}(2.0){(core::num*) →* core::double*};
+static field core::double* a_subtract = 1.0.{core::double::-}(2.0){(core::num*) →* core::double*};
+static field core::double* a_multiply = 1.0.{core::double::*}(2.0){(core::num*) →* core::double*};
+static field core::double* a_divide = 1.0.{core::double::/}(2.0){(core::num*) →* core::double*};
+static field core::int* a_floorDivide = 1.0.{core::double::~/}(2.0){(core::num*) →* core::int*};
+static field core::bool* a_greater = 1.0.{core::num::>}(2.0){(core::num*) →* core::bool*};
+static field core::bool* a_less = 1.0.{core::num::<}(2.0){(core::num*) →* core::bool*};
+static field core::bool* a_greaterEqual = 1.0.{core::num::>=}(2.0){(core::num*) →* core::bool*};
+static field core::bool* a_lessEqual = 1.0.{core::num::<=}(2.0){(core::num*) →* core::bool*};
+static field core::double* a_modulo = 1.0.{core::double::%}(2.0){(core::num*) →* core::double*};
+static method main() → dynamic {
+  self::a_equal;
+  self::a_notEqual;
+  self::a_add;
+  self::a_subtract;
+  self::a_multiply;
+  self::a_divide;
+  self::a_floorDivide;
+  self::a_greater;
+  self::a_less;
+  self::a_greaterEqual;
+  self::a_lessEqual;
+  self::a_modulo;
+}
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.weak.modular.expect
new file mode 100644
index 0000000..1f62c1e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal = 1.0 =={core::num::==}{(core::Object*) →* core::bool*} 2;
+static field core::bool* a_notEqual = !(1.0 =={core::num::==}{(core::Object*) →* core::bool*} 2);
+static field core::double* a_add = 1.0.{core::double::+}(2){(core::num*) →* core::double*};
+static field core::double* a_subtract = 1.0.{core::double::-}(2){(core::num*) →* core::double*};
+static field core::double* a_multiply = 1.0.{core::double::*}(2){(core::num*) →* core::double*};
+static field core::double* a_divide = 1.0.{core::double::/}(2){(core::num*) →* core::double*};
+static field core::int* a_floorDivide = 1.0.{core::double::~/}(2){(core::num*) →* core::int*};
+static field core::bool* a_greater = 1.0.{core::num::>}(2){(core::num*) →* core::bool*};
+static field core::bool* a_less = 1.0.{core::num::<}(2){(core::num*) →* core::bool*};
+static field core::bool* a_greaterEqual = 1.0.{core::num::>=}(2){(core::num*) →* core::bool*};
+static field core::bool* a_lessEqual = 1.0.{core::num::<=}(2){(core::num*) →* core::bool*};
+static field core::double* a_modulo = 1.0.{core::double::%}(2){(core::num*) →* core::double*};
+static method main() → dynamic {
+  self::a_equal;
+  self::a_notEqual;
+  self::a_add;
+  self::a_subtract;
+  self::a_multiply;
+  self::a_divide;
+  self::a_floorDivide;
+  self::a_greater;
+  self::a_less;
+  self::a_greaterEqual;
+  self::a_lessEqual;
+  self::a_modulo;
+}
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.weak.modular.expect
new file mode 100644
index 0000000..1e26a3e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal = 1 =={core::num::==}{(core::Object*) →* core::bool*} 2.0;
+static field core::bool* a_notEqual = !(1 =={core::num::==}{(core::Object*) →* core::bool*} 2.0);
+static field core::double* a_add = 1.{core::num::+}(2.0){(core::num*) →* core::double*};
+static field core::double* a_subtract = 1.{core::num::-}(2.0){(core::num*) →* core::double*};
+static field core::double* a_multiply = 1.{core::num::*}(2.0){(core::num*) →* core::double*};
+static field core::double* a_divide = 1.{core::num::/}(2.0){(core::num*) →* core::double*};
+static field core::int* a_floorDivide = 1.{core::num::~/}(2.0){(core::num*) →* core::int*};
+static field core::bool* a_greater = 1.{core::num::>}(2.0){(core::num*) →* core::bool*};
+static field core::bool* a_less = 1.{core::num::<}(2.0){(core::num*) →* core::bool*};
+static field core::bool* a_greaterEqual = 1.{core::num::>=}(2.0){(core::num*) →* core::bool*};
+static field core::bool* a_lessEqual = 1.{core::num::<=}(2.0){(core::num*) →* core::bool*};
+static field core::double* a_modulo = 1.{core::num::%}(2.0){(core::num*) →* core::double*};
+static method main() → dynamic {
+  self::a_equal;
+  self::a_notEqual;
+  self::a_add;
+  self::a_subtract;
+  self::a_multiply;
+  self::a_divide;
+  self::a_floorDivide;
+  self::a_greater;
+  self::a_less;
+  self::a_greaterEqual;
+  self::a_lessEqual;
+  self::a_modulo;
+}
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.weak.modular.expect
new file mode 100644
index 0000000..883662f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal = 1 =={core::num::==}{(core::Object*) →* core::bool*} 2;
+static field core::bool* a_notEqual = !(1 =={core::num::==}{(core::Object*) →* core::bool*} 2);
+static field core::int* a_bitXor = 1.{core::int::^}(2){(core::int*) →* core::int*};
+static field core::int* a_bitAnd = 1.{core::int::&}(2){(core::int*) →* core::int*};
+static field core::int* a_bitOr = 1.{core::int::|}(2){(core::int*) →* core::int*};
+static field core::int* a_bitShiftRight = 1.{core::int::>>}(2){(core::int*) →* core::int*};
+static field core::int* a_bitShiftLeft = 1.{core::int::<<}(2){(core::int*) →* core::int*};
+static field core::int* a_add = 1.{core::num::+}(2){(core::num*) →* core::int*};
+static field core::int* a_subtract = 1.{core::num::-}(2){(core::num*) →* core::int*};
+static field core::int* a_multiply = 1.{core::num::*}(2){(core::num*) →* core::int*};
+static field core::double* a_divide = 1.{core::num::/}(2){(core::num*) →* core::double*};
+static field core::int* a_floorDivide = 1.{core::num::~/}(2){(core::num*) →* core::int*};
+static field core::bool* a_greater = 1.{core::num::>}(2){(core::num*) →* core::bool*};
+static field core::bool* a_less = 1.{core::num::<}(2){(core::num*) →* core::bool*};
+static field core::bool* a_greaterEqual = 1.{core::num::>=}(2){(core::num*) →* core::bool*};
+static field core::bool* a_lessEqual = 1.{core::num::<=}(2){(core::num*) →* core::bool*};
+static field core::int* a_modulo = 1.{core::num::%}(2){(core::num*) →* core::int*};
+static method main() → dynamic {
+  self::a_equal;
+  self::a_notEqual;
+  self::a_bitXor;
+  self::a_bitAnd;
+  self::a_bitOr;
+  self::a_bitShiftRight;
+  self::a_bitShiftLeft;
+  self::a_add;
+  self::a_subtract;
+  self::a_multiply;
+  self::a_divide;
+  self::a_floorDivide;
+  self::a_greater;
+  self::a_less;
+  self::a_greaterEqual;
+  self::a_lessEqual;
+  self::a_modulo;
+}
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.weak.modular.expect
new file mode 100644
index 0000000..b2128b8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_conditional.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::num* a = 1 =={core::num::==}{(core::Object*) →* core::bool*} 2 ?{core::num*} 1 : 2.0;
+static field core::num* b = 1 =={core::num::==}{(core::Object*) →* core::bool*} 2 ?{core::num*} 1.0 : 2;
+static method main() → dynamic {
+  self::a;
+  self::b;
+}
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.weak.modular.expect
new file mode 100644
index 0000000..ba94200
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
+
+static const field core::int* m1 = #C1;
+static const field core::int* m2 = #C1;
+static method foo() → dynamic {
+  core::int* i;
+  i = #C1;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
+import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
+
+static const field core::int* a1 = #C1;
+static const field core::int* a2 = #C1;
+static method main() → dynamic {}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static const field core::int* b1 = #C1;
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = 2
+}
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.weak.modular.expect
new file mode 100644
index 0000000..7f72a48
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
+import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
+
+static const field core::int* a1 = #C1;
+static const field core::int* a2 = #C1;
+static method main() → dynamic {}
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
+
+static const field core::int* m1 = #C1;
+static const field core::int* m2 = #C1;
+static method foo() → dynamic {
+  core::int* i;
+  i = #C1;
+}
+static method main() → dynamic {}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static const field core::int* b1 = #C1;
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = 2
+}
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.weak.modular.expect
new file mode 100644
index 0000000..85d3066
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* b1 = #C1;
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = 2
+}
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.weak.modular.expect
new file mode 100644
index 0000000..85d3066
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* b1 = #C1;
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = 2
+}
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.weak.modular.expect
new file mode 100644
index 0000000..5692085
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.weak.modular.expect
@@ -0,0 +1,75 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.y*/ y;
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.w*/ w;
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.z*/ z;
+//                                                             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic x = null;
+  field core::int* y = 2;
+  field core::String* z = "hi";
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  field dynamic x = 2;
+  field core::int* y = 3;
+  field core::String* z = null;
+  field core::int* w = 2;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::String* s;
+  core::int* i;
+  s = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::String*;
+  s = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.y*/ y;
+                                                            ^" in new self::B::•().{self::B::y}{core::int*} as{TypeError} core::String*;
+  s = new self::B::•().{self::B::z}{core::String*};
+  s = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.w*/ w;
+                                                            ^" in new self::B::•().{self::B::w}{core::int*} as{TypeError} core::String*;
+  i = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::int*;
+  i = new self::B::•().{self::B::y}{core::int*};
+  i = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.z*/ z;
+                                                            ^" in new self::B::•().{self::B::z}{core::String*} as{TypeError} core::int*;
+  i = new self::B::•().{self::B::w}{core::int*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.weak.modular.expect
new file mode 100644
index 0000000..ba522a3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object implements self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  field core::int* x = 0;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..cc037d5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object implements self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements self::C {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..ad938ca
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object implements self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements self::C {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract set x(core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract set x(core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.weak.modular.expect
new file mode 100644
index 0000000..4c56b7e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.weak.modular.expect
@@ -0,0 +1,107 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var x;
+//       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
+//   double get x;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::num*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::double*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends self::A implements self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
+    : super self::A::•()
+    ;
+}
+class F extends self::A implements self::C {
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
+    : super self::A::•()
+    ;
+}
+class G extends self::A implements self::D {
+  field invalid-type x = null;
+  synthetic constructor •() → self::G*
+    : super self::A::•()
+    ;
+}
+class H extends self::C implements self::D {
+  field core::double* x = null;
+  synthetic constructor •() → self::H*
+    : super self::C::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.weak.modular.expect
new file mode 100644
index 0000000..c1a5df1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::num*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract get x() → core::int*;
+}
+class C extends self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.weak.modular.expect
new file mode 100644
index 0000000..7b26ea1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field core::List<self::A::T*>* z = null;
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::List<self::A::T*>*;
+  abstract set y(covariant-by-class core::List<self::A::T*>* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A<core::int*> {
+  field core::List<core::int*>* x = null;
+  covariant-by-class field core::List<core::int*>* y = null;
+  covariant-by-class field core::List<core::int*>* z = null;
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..c7c2a14
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.weak.modular.expect
@@ -0,0 +1,105 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A {
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+class D extends self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::D*
+    : super self::B::•()
+    ;
+}
+class E extends core::Object implements self::A {
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F extends core::Object implements self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&B = core::Object with self::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&B*
+    : super core::Object::•()
+    ;
+  mixin-super-stub get x() → core::int*
+    return super.{self::B::x};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G extends self::_G&Object&B {
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..476388a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.weak.modular.expect
@@ -0,0 +1,104 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set x(core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  set x(core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A {
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+class D extends self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::D*
+    : super self::B::•()
+    ;
+}
+class E extends core::Object implements self::A {
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F extends core::Object implements self::B {
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _G&Object&B = core::Object with self::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_G&Object&B*
+    : super core::Object::•()
+    ;
+  mixin-super-stub set x(core::int* value) → void
+    return super.{self::B::x} = value;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G extends self::_G&Object&B {
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
+    : super self::_G&Object&B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.weak.modular.expect
new file mode 100644
index 0000000..c785e64
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_static.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static get x() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  static field dynamic x = self::f();
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::A {
+  static field dynamic x = null;
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+}
+static method f() → dynamic
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..3eab43e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart:9:11: Error: The type 'int' of the getter 'A.x' is not assignable to the type 'double' of the setter 'A.x'.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart:10:12: Context: This is the declaration of the setter 'A.x'.
+//   void set x(double value) {}
+//            ^
+//
+// pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart:14:9: Error: The type 'int' of the field 'B.x' is not assignable to the type 'double' of the inherited setter 'A.x'.
+//   final x;
+//         ^
+// pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart:10:12: Context: This is the declaration of the setter 'A.x'.
+//   void set x(double value) {}
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  set x(core::double* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  final field core::int* x;
+  constructor •(core::int* x) → self::B*
+    : self::B::x = x, super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.weak.modular.expect
new file mode 100644
index 0000000..2668951
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  final field core::int* x;
+  constructor •(core::int* x) → self::B*
+    : self::B::x = x, super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.weak.modular.expect
new file mode 100644
index 0000000..287066b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  set x(core::double* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  final field core::double* x;
+  constructor •(core::double* x) → self::B*
+    : self::B::x = x, super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.weak.modular.expect
new file mode 100644
index 0000000..a18d682
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.weak.modular.expect
@@ -0,0 +1,191 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:46: Error: Undefined name 'x'.
+// var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+//                                              ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Undefined name 'x'.
+//   /*error:UNDEFINED_IDENTIFIER*/ x
+//                                  ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+// var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
+//                                                          ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+//   a = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+//   b = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<invalid-type>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+//   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
+//                                                           ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+//   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
+//                                                           ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+//  - 'Map' is from 'dart:core'.
+//   d = /*error:INVALID_ASSIGNMENT*/ 3;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+//  - 'Map' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+//   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
+//                                                                   ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+//   f = /*error:INVALID_ASSIGNMENT*/ false;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+//   g = /*error:INVALID_ASSIGNMENT*/ false;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+//   h = /*error:INVALID_ASSIGNMENT*/ false;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+//   j = /*error:INVALID_ASSIGNMENT*/ false;
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+//   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
+//                                                          ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class A extends core::Object {
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → self::B*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  constructor •(dynamic ignore) → self::B*
+    : super self::A::•()
+    ;
+}
+static field self::A* a = new self::A::•();
+static field self::B* b = new self::B::•(invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:46: Error: Undefined name 'x'.
+var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+                                             ^");
+static field core::List<invalid-type>* c1 = <invalid-type>[invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Undefined name 'x'.
+  /*error:UNDEFINED_IDENTIFIER*/ x
+                                 ^"];
+static field core::List<dynamic>* c2 = #C1;
+static field core::Map<dynamic, dynamic>* d = <dynamic, dynamic>{"a": "b"};
+static field self::A* e = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::x} = 3;
+} =>#t1;
+static field core::int* f = 2.{core::num::+}(3){(core::num*) →* core::int*};
+static field core::int* g = 3.{core::int::unary-}(){() →* core::int*};
+static field self::B* h = new self::A::•().{self::A::+}(3){(dynamic) →* self::B*};
+static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
+                                                         ^" in new self::A::•(){<unresolved>}.unary-();
+static field self::B* j = null as self::B*;
+static method test1() → dynamic {
+  self::a = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+  a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} self::A*;
+  self::a = new self::B::•(3);
+  self::b = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+  b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} self::B*;
+  self::b = new self::B::•(3);
+  self::c1 = <invalid-type>[];
+  self::c1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<invalid-type>'.
+ - 'Set' is from 'dart:core'.
+ - 'List' is from 'dart:core'.
+  c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
+                                                          ^" in ( block {
+    final core::Set<dynamic>* #t2 = col::LinkedHashSet::•<dynamic>();
+  } =>#t2) as{TypeError} core::List<invalid-type>*;
+  self::c2 = <dynamic>[];
+  self::c2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'Set' is from 'dart:core'.
+ - 'List' is from 'dart:core'.
+  c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
+                                                          ^" in ( block {
+    final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
+  } =>#t3) as{TypeError} core::List<dynamic>*;
+  self::d = <dynamic, dynamic>{};
+  self::d = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+ - 'Map' is from 'dart:core'.
+  d = /*error:INVALID_ASSIGNMENT*/ 3;
+                                   ^" in 3 as{TypeError} core::Map<dynamic, dynamic>*;
+  self::e = new self::A::•();
+  self::e = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+ - 'Map' is from 'dart:core'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+  e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
+                                                                  ^" in <dynamic, dynamic>{} as{TypeError} self::A*;
+  self::f = 3;
+  self::f = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+  f = /*error:INVALID_ASSIGNMENT*/ false;
+                                   ^" in false as{TypeError} core::int*;
+  self::g = 1;
+  self::g = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+  g = /*error:INVALID_ASSIGNMENT*/ false;
+                                   ^" in false as{TypeError} core::int*;
+  self::h = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+  h = /*error:INVALID_ASSIGNMENT*/ false;
+                                   ^" in false as{TypeError} self::B*;
+  self::h = new self::B::•("b");
+  self::i = false;
+  self::j = new self::B::•("b");
+  self::j = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+  j = /*error:INVALID_ASSIGNMENT*/ false;
+                                   ^" in false as{TypeError} self::B*;
+  self::j = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+  j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
+                                                         ^" in <dynamic>[] as{TypeError} self::B*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = <dynamic>[]
+}
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..8b4fa52
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic x = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  field dynamic x = 2;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::String* y = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::String*;
+  core::int* z = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.weak.modular.expect
new file mode 100644
index 0000000..d5127a5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field dynamic x = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  final field dynamic x = 2;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::String* y = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::String*;
+  core::int* z = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.weak.modular.expect
new file mode 100644
index 0000000..79f52e7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
+
+static field core::int* y = inf::x;
+static method test1() → dynamic {
+  core::int* t = 3;
+  t = inf::x;
+  t = self::y;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+static field core::int* x = 2;
+static method main() → dynamic {}
+
+library test;
+import self as self2;
+import "dart:core" as core;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf2;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y = inf2::A::x;
+  synthetic constructor •() → self2::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test1() → dynamic {
+  core::int* t = 3;
+  t = inf2::A::x;
+  t = self2::B::y;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x = 2;
+  synthetic constructor •() → inf2::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.weak.modular.expect
new file mode 100644
index 0000000..fb74297
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test1() → dynamic {
+  core::int* t = 3;
+  t = inf::A::x;
+  t = self::B::y;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.weak.modular.expect
new file mode 100644
index 0000000..da8a870
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x = 2;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library test;
+import self as self2;
+import "dart:core" as core;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as self;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y = self::A::x;
+  synthetic constructor •() → self2::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test1() → dynamic {
+  core::int* t = 3;
+  t = self::A::x;
+  t = self2::B::y;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.weak.modular.expect
new file mode 100644
index 0000000..7e9fca5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+static field core::int* x = 2;
+static method main() → dynamic {}
+
+library test;
+import self as self2;
+import "dart:core" as core;
+import "infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self2::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test1() → dynamic {
+  core::int* t = 3;
+  t = inf::A::x;
+  t = self2::B::y;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.weak.modular.expect
new file mode 100644
index 0000000..cfb8761
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   y = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+import self as self;
+import "infer_from_variables_in_non_cycle_imports_with_flag_a.dart" as inf;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
+
+static field core::int* y = inf::x;
+static method test1() → dynamic {
+  inf::x = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} core::int*;
+  self::y = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} core::int*;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+static field core::int* x = 2;
+static method main() → dynamic {
+  inf::x;
+}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.weak.modular.expect
new file mode 100644
index 0000000..74f640c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   A.x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+//
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   B.y = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+//
+import self as self;
+import "dart:core" as core;
+import "infer_from_variables_in_non_cycle_imports_with_flag2_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test1() → dynamic {
+  inf::A::x = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                     ^" in "hi" as{TypeError} core::int*;
+  self::B::y = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                     ^" in "hi" as{TypeError} core::int*;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.weak.modular.expect
new file mode 100644
index 0000000..81376fe
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int* x = 2;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.weak.modular.expect
new file mode 100644
index 0000000..298b12b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* x = 2;
+static method main() → dynamic {
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_field_types.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_generic_field_types.dart.weak.modular.expect
new file mode 100644
index 0000000..91d941e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_field_types.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::A::X* field = null;
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B<Y extends core::Object* = dynamic> extends core::Object implements self::A<self::B::Y*> {
+  synthetic constructor •() → self::B<self::B::Y*>*
+    : super core::Object::•()
+    ;
+  abstract get field() → self::B::Y*;
+  abstract set field(covariant-by-class self::B::Y* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int*;
+  abstract set field(covariant-by-class core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.weak.modular.expect
new file mode 100644
index 0000000..6d31625
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, {core::String* b = #C1, self::C::m::T* c = #C1}) → self::C::m::T*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, b: "bbb", c: 2.0){(core::int*, {b: core::String*, c: core::double*}) →* core::double*};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.weak.modular.expect
new file mode 100644
index 0000000..5c86982
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, [self::C::m::T* b = #C1]) → self::C::m::T*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, 2.0){(core::int*, [core::double*]) →* core::double*};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.weak.modular.expect
new file mode 100644
index 0000000..7af5aa7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, [core::String* b = #C1, self::C::m::T* c = #C1]) → self::C::m::T*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, "bbb", 2.0){(core::int*, [core::String*, core::double*]) →* core::double*};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.weak.modular.expect
new file mode 100644
index 0000000..4435be3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    return x;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::int* y = new self::C::•().{self::C::m}<core::int*>(42){(core::int*) →* core::int*};
+}
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..b45aed1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set x(core::double* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract get x() → core::double*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..a1ce381
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object implements self::B {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return self::f() as{TypeError,ForDynamic} core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements self::C {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f() → dynamic
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.weak.modular.expect
new file mode 100644
index 0000000..74ddf33
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Resource extends core::Object {
+  synthetic constructor •() → self::Resource*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Folder extends self::Resource {
+  synthetic constructor •() → self::Folder*
+    : super self::Resource::•()
+    ;
+}
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::Foo::T* t) → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getResource(core::String* str) → self::Resource*
+  return null;
+static method main() → dynamic {
+  core::Map<core::String*, core::List<self::Folder*>*>* map = <core::String*, core::List<self::Folder*>*>{"pkgA": <self::Folder*>[self::getResource("/pkgA/lib/") as{TypeError} self::Folder*], "pkgB": <self::Folder*>[self::getResource("/pkgB/lib/") as{TypeError} self::Folder*]};
+  core::List<core::Map<core::String*, self::Folder*>*>* list = <core::Map<core::String*, self::Folder*>*>[<core::String*, self::Folder*>{"pkgA": self::getResource("/pkgA/lib/") as{TypeError} self::Folder*}, <core::String*, self::Folder*>{"pkgB": self::getResource("/pkgB/lib/") as{TypeError} self::Folder*}];
+  self::Foo<core::List<self::Folder*>*>* foo = new self::Foo::•<core::List<self::Folder*>*>(<self::Folder*>[self::getResource("/pkgA/lib/") as{TypeError} self::Folder*]);
+}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.weak.modular.expect
new file mode 100644
index 0000000..588ca83
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:79: Error: Method not found: 'g'.
+//   /*@returnType=invalid-type*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                               ^
+//
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
+//   g() => 0;
+//   ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:79: Context: Previous use of 'g'.
+//   /*@returnType=invalid-type*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function f() → invalid-type
+    return invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:79: Error: Method not found: 'g'.
+  /*@returnType=invalid-type*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+                                                                              ^";
+  {
+    invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
+  g() => 0;
+  ^";
+    function g() → core::int*
+      return 0;
+  }
+  () →* invalid-type v = f;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.weak.modular.expect
new file mode 100644
index 0000000..eb05a20
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method test() → dynamic {
+  function f0() → core::int*
+    return 42;
+  function f1() → asy::Future<core::int*>* async 
+    return 42;
+  function f2() → core::int* {
+    return 42;
+  }
+  function f3() → asy::Future<core::int*>* async {
+    return 42;
+  }
+  function f4() → core::Iterable<core::int*>* sync* {
+    yield 42;
+  }
+  function f5() → asy::Stream<core::int*>* async* {
+    yield 42;
+  }
+  function f6() → core::num*
+    return 42;
+  function f7() → dynamic
+    return f7(){() →* dynamic};
+  function f8() → asy::Stream<core::int*>*
+    return f5(){() →* asy::Stream<core::int*>*};
+  () →* core::int* v0 = f0;
+  () →* asy::Future<core::int*>* v1 = f1;
+  () →* core::int* v2 = f2;
+  () →* asy::Future<core::int*>* v3 = f3;
+  () →* core::Iterable<core::int*>* v4 = f4;
+  () →* asy::Stream<core::int*>* v5 = f5;
+  () →* core::num* v6 = f6;
+  () →* dynamic v7 = f7;
+  () →* asy::Stream<core::int*>* v8 = f8;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.weak.modular.expect
new file mode 100644
index 0000000..abae228
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* core::int*;
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract method x(() →* core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract method x(() →* dynamic value) → void;
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method g(self::B* b) → dynamic {
+  b.{self::B::x}(self::f<() →* dynamic>()){(() →* dynamic) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.weak.modular.expect
new file mode 100644
index 0000000..4b3051b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.weak.modular.expect
@@ -0,0 +1,98 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:3: Error: Can't infer types for 'f' as the overridden members don't have a combined signature.
+// Try adding explicit types.
+//   f(x, y);
+//   ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:11:7: Context: This is one of the overridden members.
+//   int f(int x, int y);
+//       ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:18:7: Context: This is one of the overridden members.
+//   int f(int x);
+//       ^
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:28:3: Error: Can't infer types for 'i' as the overridden members don't have a combined signature.
+// Try adding explicit types.
+//   i(x, {y, z});
+//   ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:14:7: Context: This is one of the overridden members.
+//   int i(int x, {int y});
+//       ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:21:7: Context: This is one of the overridden members.
+//   int i(int x, {int z});
+//       ^
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:3: Error: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
+//   f(x, y);
+//   ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:18:7: Context: This is the overridden method ('f').
+//   int f(int x);
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract method f(core::int* x, core::int* y) → core::int*;
+  abstract method g(core::int* x, [core::int* y = #C1]) → core::int*;
+  abstract method h(core::int* x, {core::int* y = #C1}) → core::int*;
+  abstract method i(core::int* x, {core::int* y = #C1}) → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method f(core::int* x) → core::int*;
+  abstract method g(core::int* x) → core::int*;
+  abstract method h(core::int* x) → core::int*;
+  abstract method i(core::int* x, {core::int* z = #C1}) → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract method f(invalid-type x, invalid-type y) → invalid-type;
+  abstract method g(core::int* x, [core::int* y = #C1]) → core::int*;
+  abstract method h(core::int* x, {core::int* y = #C1}) → core::int*;
+  abstract method i(invalid-type x, {invalid-type y = #C1, invalid-type z = #C1}) → invalid-type;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.weak.modular.expect
new file mode 100644
index 0000000..516ea9a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends self::D {
+  synthetic constructor •() → self::C*
+    : super self::D::•()
+    ;
+  set foo(core::int* x) → void {}
+}
+class D extends core::Object {
+  field core::int* foo = null;
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..84b9408
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends self::D {
+  synthetic constructor •() → self::C*
+    : super self::D::•()
+    ;
+  set foo(core::int* x) → void {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  set foo(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.weak.modular.expect
new file mode 100644
index 0000000..ec7b742
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_not = !true;
+static field core::int* a_complement = 1.{core::int::~}(){() →* core::int*};
+static field core::int* a_negate = 1.{core::int::unary-}(){() →* core::int*};
+static method main() → dynamic {
+  self::a_not;
+  self::a_complement;
+  self::a_negate;
+}
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.weak.modular.expect
new file mode 100644
index 0000000..2c6f832
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator ~() → core::int*
+    return 1;
+  operator unary-() → core::double*
+    return 2.0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* a = new self::A::•();
+static field core::int* v_complement = self::a.{self::A::~}(){() →* core::int*};
+static field core::double* v_negate = self::a.{self::A::unary-}(){() →* core::double*};
+static method main() → dynamic {
+  self::a;
+  self::v_complement;
+  self::v_negate;
+}
diff --git a/pkg/front_end/testcases/inference/infer_rethrow.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_rethrow.dart.weak.modular.expect
new file mode 100644
index 0000000..1e36c8b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_rethrow.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+
+static method test(() →* dynamic f, () →* dynamic g) → dynamic {
+  try {
+    f(){() →* dynamic};
+  }
+  on dynamic catch(final dynamic _) {
+    g(){() →* dynamic};
+    rethrow;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.weak.modular.expect
new file mode 100644
index 0000000..cdbf9e5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method strings() → core::List<core::String*>* {
+  core::Iterable<core::String*>* stuff = <dynamic>[].{core::Iterable::expand}<core::String*>((dynamic i) → core::List<core::String*>* {
+    return <core::String*>[];
+  }){((dynamic) →* core::Iterable<core::String*>*) →* core::Iterable<core::String*>*};
+  return stuff.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+}
+static method main() → dynamic {
+  self::strings();
+}
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..3259075
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static set foo(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static set bar(core::int* x) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..8778884
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::double*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract set x(core::double* value) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..70ec7fa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object implements self::B {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  set x(core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements self::C {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract set x(core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract set x(core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.weak.modular.expect
new file mode 100644
index 0000000..6c97fd8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* core::int*;
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set x(() →* core::int* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract set x(() →* dynamic value) → void;
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method g(self::B* b) → dynamic {
+  b.{self::B::x} = self::f<() →* dynamic>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.weak.modular.expect
new file mode 100644
index 0000000..a14272b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  set x(core::int* i) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  set x(core::Object* o) → void {}
+}
+static method main() → dynamic {
+  new self::B::•().{self::B::x} = "hello";
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.weak.modular.expect
new file mode 100644
index 0000000..445bbcb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_statics_transitively_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1 = inf::a1;
+static final field core::int* m2 = inf::A::a2;
+static method foo() → dynamic {
+  core::int* i;
+  i = self::m1;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+import "infer_statics_transitively_b.dart" as inf2;
+import "infer_statics_transitively.dart" as self;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2 = inf2::b1;
+  synthetic constructor •() → inf::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static final field core::int* a1 = self::m2;
+static method main() → dynamic {}
+
+library;
+import self as inf2;
+import "dart:core" as core;
+
+static final field core::int* b1 = 2;
+static method main() → dynamic {
+  inf2::b1;
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.weak.modular.expect
new file mode 100644
index 0000000..a530b9e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* x1 = #C1;
+static final field core::int* x2 = 1;
+static final field core::int* y1 = #C1;
+static final field core::int* y2 = self::x2;
+static method foo() → dynamic {
+  core::int* i;
+  i = self::y1;
+  i = self::y2;
+}
+static method main() → dynamic {
+  self::foo();
+}
+
+constants  {
+  #C1 = 1
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.weak.modular.expect
new file mode 100644
index 0000000..0f736d7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" show a1, A;
+import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p show a2, A;
+
+static const field core::int* t1 = #C1;
+static const field core::int* t2 = #C1;
+static const field core::int* t3 = #C2;
+static const field core::int* t4 = #C3;
+static const field dynamic t5 = #C4;
+static const field dynamic t6 = #C4;
+static method foo() → dynamic {
+  core::int* i;
+  i = #C1;
+  i = #C1;
+  i = #C2;
+  i = #C3;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static const field dynamic a3 = #C4;
+  synthetic constructor •() → self2::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* a1 = #C2;
+static const field core::int* a2 = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 3
+  #C3 = 4
+  #C4 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.weak.modular.expect
new file mode 100644
index 0000000..a54e7ab
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static const field dynamic a3 = #C1;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::int* a1 = #C2;
+static const field core::int* a2 = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 3
+  #C3 = 4
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.weak.modular.expect
new file mode 100644
index 0000000..54b40b9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.weak.modular.expect
@@ -0,0 +1,81 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static final field core::int* a1 = test::m2;
+static method main() → dynamic {
+  self::a1;
+}
+
+library test;
+import self as test;
+import "dart:core" as core;
+import "infer_statics_transitively_a.dart" as inf2;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1 = inf2::a1;
+static final field core::int* m2 = inf2::A::a2;
+static method foo() → dynamic {
+  core::int* i;
+  i = test::m1;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+static final field core::int* b1 = 2;
+static method main() → dynamic {
+  inf::b1;
+}
+
+library;
+import self as inf2;
+import "dart:core" as core;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → inf2::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static final field core::int* a1 = test::m2;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.weak.modular.expect
new file mode 100644
index 0000000..327bcc1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_statics_transitively_b.dart" as inf;
+import "infer_statics_transitively.dart" as test;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static final field core::int* a1 = test::m2;
+static method main() → dynamic {}
+
+library test;
+import self as test;
+import "dart:core" as core;
+import "infer_statics_transitively_a.dart" as self;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1 = self::a1;
+static final field core::int* m2 = self::A::a2;
+static method foo() → dynamic {
+  core::int* i;
+  i = test::m1;
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+static final field core::int* b1 = 2;
+static method main() → dynamic {
+  inf::b1;
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.weak.modular.expect
new file mode 100644
index 0000000..8c80bfe
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static final field core::int* b1 = 2;
+static method main() → dynamic {
+  self::b1;
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.weak.modular.expect
new file mode 100644
index 0000000..4a992cd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_statics_with_method_invocations_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_statics_with_method_invocations_a.dart";
+
+class T extends core::Object {
+  static final field self::T* foo = self::T::m1(self::T::m2(inf::m3("", "")));
+  synthetic constructor •() → self::T*
+    : super core::Object::•()
+    ;
+  static method m1(core::String* m) → self::T* {
+    return null;
+  }
+  static method m2(dynamic e) → core::String* {
+    return "";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+static method m3(core::String* a, core::String* b, [dynamic a1 = #C1, dynamic a2 = #C1]) → dynamic {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.weak.modular.expect
new file mode 100644
index 0000000..e864516
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method m3(core::String* a, core::String* b, [dynamic a1 = #C1, dynamic a2 = #C1]) → dynamic {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_throw.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_throw.dart.weak.modular.expect
new file mode 100644
index 0000000..8f6f2b1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_throw.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* t = true;
+static field dynamic a = throw 0;
+static field core::int* b = (throw 0) ?{core::int*} 1 : 2;
+static field core::int* c = self::t ?{core::int*} throw 1 : 2;
+static field core::int* d = self::t ?{core::int*} 1 : throw 2;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..e583c2a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic x = throw self::f<dynamic>();
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method g() → void {
+  dynamic x = throw self::f<dynamic>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.weak.modular.expect
new file mode 100644
index 0000000..454f2de
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.x*/ x;
+//                                                                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  get x() → core::int*
+    return 3;
+}
+static method foo() → dynamic {
+  core::String* y = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.x*/ x;
+                                                                   ^" in new self::B::•().{self::B::x}{core::int*} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x}{core::int*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.weak.modular.expect
new file mode 100644
index 0000000..a8b5b21
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.x*/ x;
+//                                                                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return 3;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::String* y = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.x*/ x;
+                                                                   ^" in new self::B::•().{self::B::x}{core::int*} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x}{core::int*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.weak.modular.expect
new file mode 100644
index 0000000..be69c0e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test1() → dynamic {
+  core::int* x = 3;
+  x = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.weak.modular.expect
new file mode 100644
index 0000000..318a2d0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test2() → dynamic {
+  core::int* x = 3;
+  x = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.weak.modular.expect
new file mode 100644
index 0000000..f622139
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     a = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     b = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//     c = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x = 0;
+  field core::int* y = null;
+  final field core::int* z = 42;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method test1() → dynamic {
+    core::int* a = this.{self::A::x}{core::int*};
+    a = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                     ^" in "hi" as{TypeError} core::int*;
+    a = 3;
+    core::int* b = this.{self::A::y}{core::int*};
+    b = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                     ^" in "hi" as{TypeError} core::int*;
+    b = 4;
+    core::int* c = this.{self::A::z}{core::int*};
+    c = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+    c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                     ^" in "hi" as{TypeError} core::int*;
+    c = 4;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..63aa12a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   a = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   b = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   c = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int* x = 0;
+static field core::int* y = 0;
+static final field core::int* z = 42;
+static method test1() → dynamic {
+  core::int* a = self::x;
+  a = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} core::int*;
+  a = 3;
+  core::int* b = self::y;
+  b = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} core::int*;
+  b = 4;
+  core::int* c = self::z;
+  c = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                   ^" in "hi" as{TypeError} core::int*;
+  c = 4;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.weak.modular.expect
new file mode 100644
index 0000000..dced83d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C.x*/ x;
+//                                                                    ^
+//
+import self as self;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
+
+class C extends inf::B {
+  synthetic constructor •() → self::C*
+    : super inf::B::•()
+    ;
+  get x() → core::int*
+    return null;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::int* y = new self::C::•().{self::C::x}{core::int*};
+  core::String* z = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C.x*/ x;
+                                                                   ^" in new self::C::•().{self::C::x}{core::int*} as{TypeError} core::String*;
+}
+static method main() → dynamic {
+  self::foo();
+}
+
+library;
+import self as inf;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
+
+class B extends self::A {
+  synthetic constructor •() → inf::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.weak.modular.expect
new file mode 100644
index 0000000..0acdfbf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
+
+class B extends test::A {
+  synthetic constructor •() → self::B*
+    : super test::A::•()
+    ;
+}
+static method main() → dynamic {}
+
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C.x*/ x;
+//                                                                    ^
+//
+import self as test;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
+
+class C extends self::B {
+  synthetic constructor •() → test::C*
+    : super self::B::•()
+    ;
+  get x() → core::int*
+    return null;
+}
+class A extends core::Object {
+  synthetic constructor •() → test::A*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::int* y = new test::C::•().{test::C::x}{core::int*};
+  core::String* z = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C.x*/ x;
+                                                                   ^" in new test::C::•().{test::C::x}{core::int*} as{TypeError} core::String*;
+}
+static method main() → dynamic {
+  test::foo();
+}
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.weak.modular.expect
new file mode 100644
index 0000000..a416db2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::Map<core::int*, core::String*>* a = <core::int*, core::String*>{0: "aaa", 1: "bbb"};
+static field core::Map<core::double*, core::int*>* b = <core::double*, core::int*>{1.1: 1, 2.2: 2};
+static field core::Map<core::List<core::int*>*, core::Map<core::String*, core::double*>*>* c = <core::List<core::int*>*, core::Map<core::String*, core::double*>*>{};
+static field core::Map<core::int*, dynamic>* d = <core::int*, dynamic>{};
+static field core::Map<dynamic, core::int*>* e = <dynamic, core::int*>{};
+static field core::Map<dynamic, dynamic>* f = <dynamic, dynamic>{};
+static method main() → dynamic {
+  self::a;
+  self::b;
+  self::c;
+  self::d;
+  self::e;
+  self::f;
+}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.weak.modular.expect
new file mode 100644
index 0000000..a263f07
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   get w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
+//                                             ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.x*/ x;
+//                                                                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  final field self::A::T* x = null;
+  final field self::A::T* w = null;
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return 3;
+  get w() → core::int*
+    return invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  get w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
+                                            ^" in "hello" as{TypeError} core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::String* y = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:68: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B.x*/ x;
+                                                                   ^" in new self::B::•().{self::B::x}{core::int*} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x}{core::int*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.weak.modular.expect
new file mode 100644
index 0000000..4e199e1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:73: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B.x*/ x;
+//                                                                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::A::T* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> {
+  covariant-by-class field self::B::E* y = null;
+  synthetic constructor •() → self::B<self::B::E*>*
+    : super self::A::•()
+    ;
+  get x() → self::B::E*
+    return this.{self::B::y}{self::B::E*};
+}
+static method foo() → dynamic {
+  core::int* y = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:73: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B.x*/ x;
+                                                                        ^" in new self::B::•<core::String*>().{self::B::x}{core::String*} as{TypeError} core::int*;
+  core::String* z = new self::B::•<core::String*>().{self::B::x}{core::String*};
+}
+static method main() → dynamic {
+  self::foo();
+}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.weak.modular.expect
new file mode 100644
index 0000000..5b19a39
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:25: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       . /*@target=B.m*/ m(null, null);
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::E*>*
+    : super core::Object::•()
+    ;
+  abstract method m(dynamic a, (dynamic, self::I::E*) →* core::String* f) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<self::A::E*> /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::E*>*
+    : super core::Object::•()
+    ;
+  abstract method m(dynamic a, (dynamic, self::A::E*) →* core::String* f) → core::String*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M extends core::Object {
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M /*hasConstConstructor*/  {
+  const constructor •() → self::B<self::B::E*>*
+    : super self::A::•()
+    ;
+  get y() → core::int*
+    return 0;
+  method m(dynamic a, (dynamic, self::B::E*) →* dynamic f) → core::String* {}
+}
+static method foo() → dynamic {
+  core::int* y = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:25: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      . /*@target=B.m*/ m(null, null);
+                        ^" in new self::B::•<dynamic>().{self::B::m}(null, null){(dynamic, (dynamic, dynamic) →* dynamic) →* core::String*} as{TypeError} core::int*;
+  core::String* z = new self::B::•<dynamic>().{self::B::m}(null, null){(dynamic, (dynamic, dynamic) →* dynamic) →* core::String*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.weak.modular.expect
new file mode 100644
index 0000000..27f0da3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:29: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       . /*@target=A.value*/ value;
+//                             ^
+//
+import self as self;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
+
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements inf::I<self::A::E*> /*hasConstConstructor*/  {
+  final field self::A::E* value = null;
+  const constructor •() → self::A<self::A::E*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M extends core::Object {
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M /*hasConstConstructor*/  {
+  const constructor •() → self::B<self::B::E*>*
+    : super self::A::•()
+    ;
+  get y() → core::int*
+    return 0;
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → self::A<self::B::E*>* {}
+}
+static method foo() → dynamic {
+  core::int* y = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:29: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      . /*@target=A.value*/ value;
+                            ^" in new self::B::•<core::String*>().{self::B::m}(null, null){(dynamic, (dynamic, core::int*) →* dynamic) →* self::A<core::String*>*}.{self::A::value}{core::String*} as{TypeError} core::int*;
+  core::String* z = new self::B::•<core::String*>().{self::B::m}(null, null){(dynamic, (dynamic, core::int*) →* dynamic) →* self::A<core::String*>*}.{self::A::value}{core::String*};
+}
+static method main() → dynamic {}
+
+library;
+import self as inf;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inf::I<inf::I::E*>*
+    : super core::Object::•()
+    ;
+  abstract method m(dynamic a, (dynamic, core::int*) →* core::String* f) → self::A<inf::I::E*>*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.weak.modular.expect
new file mode 100644
index 0000000..e7555d5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::E*>*
+    : super core::Object::•()
+    ;
+  abstract method m(dynamic a, (dynamic, core::int*) →* core::String* f) → test::A<self::I::E*>*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:29: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       . /*@target=A.value*/ value;
+//                             ^
+//
+import self as test;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
+
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<test::A::E*> /*hasConstConstructor*/  {
+  final field test::A::E* value = null;
+  const constructor •() → test::A<test::A::E*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M extends core::Object {
+  final field core::int* y = 0;
+  synthetic constructor •() → test::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<E extends core::Object* = dynamic> extends test::A<test::B::E*> implements test::M /*hasConstConstructor*/  {
+  const constructor •() → test::B<test::B::E*>*
+    : super test::A::•()
+    ;
+  get y() → core::int*
+    return 0;
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → test::A<test::B::E*>* {}
+}
+static method foo() → dynamic {
+  core::int* y = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:29: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      . /*@target=A.value*/ value;
+                            ^" in new test::B::•<core::String*>().{test::B::m}(null, null){(dynamic, (dynamic, core::int*) →* dynamic) →* test::A<core::String*>*}.{test::A::value}{core::String*} as{TypeError} core::int*;
+  core::String* z = new test::B::•<core::String*>().{test::B::m}(null, null){(dynamic, (dynamic, core::int*) →* dynamic) →* test::A<core::String*>*}.{test::A::value}{core::String*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.weak.modular.expect
new file mode 100644
index 0000000..bd1fcf0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:13:49: Error: The return type of the method 'B.x' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.x'.
+// Change to a subtype of 'int'.
+//   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
+//                                                 ^
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:9:11: Context: This is the overridden method ('x').
+//   final T x = null;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  final field self::A::T* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get x() → dynamic
+    return 3;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → dynamic {
+  core::String* y = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::String*;
+  core::int* z = new self::B::•().{self::B::x}{dynamic} as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {
+  self::foo();
+}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.modular.expect
new file mode 100644
index 0000000..680de12
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.weak.modular.expect
@@ -0,0 +1,142 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       int x = /*error:INVALID_ASSIGNMENT*/ i;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+//       int x = /*error:INVALID_ASSIGNMENT*/ i;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+//     String y = /*error:INVALID_ASSIGNMENT*/ x;
+//                                             ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+// Try changing the type of the variable.
+//   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
+//               ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:70: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+//                                                                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar<T extends core::Iterable<core::String*>*> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-class self::Bar::T* t) → void {
+    for (core::String* i in t) {
+      core::int* x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      int x = /*error:INVALID_ASSIGNMENT*/ i;
+                                           ^" in i as{TypeError} core::int*;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Baz<T extends core::Object* = dynamic, E extends core::Iterable<self::Baz::T*>* = core::Iterable<dynamic>*, S extends self::Baz::E* = core::Iterable<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-class self::Baz::S* t) → void {
+    for (self::Baz::T* i in t) {
+      core::int* x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+      int x = /*error:INVALID_ASSIGNMENT*/ i;
+                                           ^" in i as{TypeError} core::int*;
+      self::Baz::T* y = i;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  core::List<self::Foo*>* list = <self::Foo*>[];
+  for (self::Foo* x in list) {
+    core::String* y = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+    String y = /*error:INVALID_ASSIGNMENT*/ x;
+                                            ^" in x as{TypeError} core::String*;
+  }
+  for (dynamic x in list) {
+    core::String* y = x as{TypeError,ForDynamic} core::String*;
+  }
+  for (final self::Foo* #t1 in list) {
+    core::String* x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+Try changing the type of the variable.
+  for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
+              ^" in #t1 as{TypeError} core::String*;
+    core::String* y = x;
+  }
+  dynamic z;
+  for (final self::Foo* #t2 in list) {
+    z = #t2;
+    core::String* y = z as{TypeError,ForDynamic} core::String*;
+  }
+  core::Iterable<dynamic>* iter = list;
+  for (final dynamic #t3 in iter) {
+    self::Foo* x = #t3 as{TypeError,ForDynamic} self::Foo*;
+    self::Foo* y = x;
+  }
+  dynamic iter2 = list;
+  for (final dynamic #t4 in iter2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+    self::Foo* x = #t4 as{TypeError,ForDynamic} self::Foo*;
+    self::Foo* y = x;
+  }
+  core::Map<core::String*, self::Foo*>* map = <core::String*, self::Foo*>{};
+  for (dynamic x in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:70: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Map' is from 'dart:core'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+                                                                     ^" in map as{TypeError} core::Iterable<dynamic>*) {
+    core::String* y = x as{TypeError,ForDynamic} core::String*;
+  }
+  for (core::String* x in map.{core::Map::keys}{core::Iterable<core::String*>*}) {
+    core::String* y = x;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.modular.expect
new file mode 100644
index 0000000..c16146f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.weak.modular.expect
@@ -0,0 +1,198 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       int x = /*error:INVALID_ASSIGNMENT*/ i;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+//       int x = /*error:INVALID_ASSIGNMENT*/ i;
+//                                            ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+//     String y = /*error:INVALID_ASSIGNMENT*/ x;
+//                                             ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+// Try changing the type of the variable.
+//   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
+//                     ^
+//
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:76: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+//  - 'Stream' is from 'dart:async'.
+//   await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+//                                                                            ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Foo extends core::Object {
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar<T extends asy::Stream<core::String*>*> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-class self::Bar::T* t) → dynamic async {
+    await for (core::String* i in t) {
+      core::int* x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      int x = /*error:INVALID_ASSIGNMENT*/ i;
+                                           ^" in i as{TypeError} core::int*;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = asy::Stream<dynamic>*, S extends self::Baz::E* = asy::Stream<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-class self::Baz::S* t) → dynamic async {
+    await for (self::Baz::T* i in t) {
+      core::int* x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+      int x = /*error:INVALID_ASSIGNMENT*/ i;
+                                           ^" in i as{TypeError} core::int*;
+      self::Baz::T* y = i;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
+  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
+    return null;
+  abstract member-signature get isBroadcast() → core::bool*; -> asy::Stream::isBroadcast
+  abstract member-signature method asBroadcastStream({(asy::StreamSubscription<self::MyStream::T*>*) →* void onListen = #C1, (asy::StreamSubscription<self::MyStream::T*>*) →* void onCancel = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::asBroadcastStream
+  abstract member-signature method where((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::where
+  abstract member-signature method map<S extends core::Object* = dynamic>((self::MyStream::T*) →* self::MyStream::map::S* convert) → asy::Stream<self::MyStream::map::S*>*; -> asy::Stream::map
+  abstract member-signature method asyncMap<E extends core::Object* = dynamic>((self::MyStream::T*) →* FutureOr<self::MyStream::asyncMap::E*>* convert) → asy::Stream<self::MyStream::asyncMap::E*>*; -> asy::Stream::asyncMap
+  abstract member-signature method asyncExpand<E extends core::Object* = dynamic>((self::MyStream::T*) →* asy::Stream<self::MyStream::asyncExpand::E*>* convert) → asy::Stream<self::MyStream::asyncExpand::E*>*; -> asy::Stream::asyncExpand
+  abstract member-signature method handleError(core::Function* onError, {(dynamic) →* core::bool* test = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::handleError
+  abstract member-signature method expand<S extends core::Object* = dynamic>((self::MyStream::T*) →* core::Iterable<self::MyStream::expand::S*>* convert) → asy::Stream<self::MyStream::expand::S*>*; -> asy::Stream::expand
+  abstract member-signature method pipe(covariant-by-class asy::StreamConsumer<self::MyStream::T*>* streamConsumer) → asy::Future<dynamic>*; -> asy::Stream::pipe
+  abstract member-signature method transform<S extends core::Object* = dynamic>(covariant-by-class asy::StreamTransformer<self::MyStream::T*, self::MyStream::transform::S*>* streamTransformer) → asy::Stream<self::MyStream::transform::S*>*; -> asy::Stream::transform
+  abstract member-signature method reduce(covariant-by-class (self::MyStream::T*, self::MyStream::T*) →* self::MyStream::T* combine) → asy::Future<self::MyStream::T*>*; -> asy::Stream::reduce
+  abstract member-signature method fold<S extends core::Object* = dynamic>(self::MyStream::fold::S* initialValue, (self::MyStream::fold::S*, self::MyStream::T*) →* self::MyStream::fold::S* combine) → asy::Future<self::MyStream::fold::S*>*; -> asy::Stream::fold
+  abstract member-signature method join([core::String* separator = #C2]) → asy::Future<core::String*>*; -> asy::Stream::join
+  abstract member-signature method contains(core::Object* needle) → asy::Future<core::bool*>*; -> asy::Stream::contains
+  abstract member-signature method forEach((self::MyStream::T*) →* void action) → asy::Future<dynamic>*; -> asy::Stream::forEach
+  abstract member-signature method every((self::MyStream::T*) →* core::bool* test) → asy::Future<core::bool*>*; -> asy::Stream::every
+  abstract member-signature method any((self::MyStream::T*) →* core::bool* test) → asy::Future<core::bool*>*; -> asy::Stream::any
+  abstract member-signature get length() → asy::Future<core::int*>*; -> asy::Stream::length
+  abstract member-signature get isEmpty() → asy::Future<core::bool*>*; -> asy::Stream::isEmpty
+  abstract member-signature method cast<R extends core::Object* = dynamic>() → asy::Stream<self::MyStream::cast::R*>*; -> asy::Stream::cast
+  abstract member-signature method toList() → asy::Future<core::List<self::MyStream::T*>*>*; -> asy::Stream::toList
+  abstract member-signature method toSet() → asy::Future<core::Set<self::MyStream::T*>*>*; -> asy::Stream::toSet
+  abstract member-signature method drain<E extends core::Object* = dynamic>([self::MyStream::drain::E* futureValue = #C1]) → asy::Future<self::MyStream::drain::E*>*; -> asy::Stream::drain
+  abstract member-signature method take(core::int* count) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::take
+  abstract member-signature method takeWhile((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::takeWhile
+  abstract member-signature method skip(core::int* count) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::skip
+  abstract member-signature method skipWhile((self::MyStream::T*) →* core::bool* test) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::skipWhile
+  abstract member-signature method distinct([(self::MyStream::T*, self::MyStream::T*) →* core::bool* equals = #C1]) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::distinct
+  abstract member-signature get first() → asy::Future<self::MyStream::T*>*; -> asy::Stream::first
+  abstract member-signature get last() → asy::Future<self::MyStream::T*>*; -> asy::Stream::last
+  abstract member-signature get single() → asy::Future<self::MyStream::T*>*; -> asy::Stream::single
+  abstract member-signature method firstWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::firstWhere
+  abstract member-signature method lastWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::lastWhere
+  abstract member-signature method singleWhere((self::MyStream::T*) →* core::bool* test, {covariant-by-class () →* self::MyStream::T* orElse = #C1}) → asy::Future<self::MyStream::T*>*; -> asy::Stream::singleWhere
+  abstract member-signature method elementAt(core::int* index) → asy::Future<self::MyStream::T*>*; -> asy::Stream::elementAt
+  abstract member-signature method timeout(core::Duration* timeLimit, {(asy::EventSink<self::MyStream::T*>*) →* void onTimeout = #C1}) → asy::Stream<self::MyStream::T*>*; -> asy::Stream::timeout
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method listen((self::MyStream::T*) →* void onData, {core::Function* onError = #C1, () →* void onDone = #C1, core::bool* cancelOnError = #C1}) → asy::StreamSubscription<self::MyStream::T*>*; -> asy::Stream::listen
+}
+static method test() → dynamic async {
+  self::MyStream<self::Foo*>* myStream = self::MyStream::•<self::Foo*>();
+  await for (self::Foo* x in myStream) {
+    core::String* y = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+    String y = /*error:INVALID_ASSIGNMENT*/ x;
+                                            ^" in x as{TypeError} core::String*;
+  }
+  await for (dynamic x in myStream) {
+    core::String* y = x as{TypeError,ForDynamic} core::String*;
+  }
+  await for (final self::Foo* #t1 in myStream) {
+    core::String* x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+Try changing the type of the variable.
+  await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
+                    ^" in #t1 as{TypeError} core::String*;
+    core::String* y = x;
+  }
+  dynamic z;
+  await for (final self::Foo* #t2 in myStream) {
+    z = #t2;
+    core::String* y = z as{TypeError,ForDynamic} core::String*;
+  }
+  asy::Stream<dynamic>* stream = myStream;
+  await for (final dynamic #t3 in stream) {
+    self::Foo* x = #t3 as{TypeError,ForDynamic} self::Foo*;
+    self::Foo* y = x;
+  }
+  dynamic stream2 = myStream;
+  await for (final dynamic #t4 in stream2 as{TypeError,ForDynamic} asy::Stream<dynamic>*) {
+    self::Foo* x = #t4 as{TypeError,ForDynamic} self::Foo*;
+    self::Foo* y = x;
+  }
+  core::Map<core::String*, self::Foo*>* map = <core::String*, self::Foo*>{};
+  await for (dynamic x in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:76: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Map' is from 'dart:core'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+ - 'Stream' is from 'dart:async'.
+  await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+                                                                           ^" in map as{TypeError} asy::Stream<dynamic>*) {
+    core::String* y = x as{TypeError,ForDynamic} core::String*;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = ""
+}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..22c972f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  for (core::int* i = 0; i.{core::num::<}(10){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    core::int* j = i.{core::num::+}(1){(core::num*) →* core::int*};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_use_of_void_local.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_use_of_void_local.dart.weak.modular.expect
new file mode 100644
index 0000000..f8773b2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_use_of_void_local.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+
+static method f() → void {}
+static method g() → void {
+  void x = self::f();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_variable_void.dart.weak.modular.expect b/pkg/front_end/testcases/inference/infer_variable_void.dart.weak.modular.expect
new file mode 100644
index 0000000..3bfd2e6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_variable_void.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+
+static field void x = self::f();
+static method f() → void {}
+static method main() → dynamic {
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.weak.modular.expect
new file mode 100644
index 0000000..524ef39
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ "1"]);
+//                                              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int* x = 1;
+  constructor •([core::int* x = invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
+                                             ^"]) → self::Foo*
+    : self::Foo::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.weak.outline.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.weak.outline.expect
index 0bc9761..c617c3d 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.weak.outline.expect
@@ -1,10 +1,19 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ "1"]);
+//                                              ^
+//
 import self as self;
 import "dart:core" as core;
 
 class Foo extends core::Object {
   field core::int* x;
-  constructor •([core::int* x]) → self::Foo*
+  constructor •([core::int* x = invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
+                                             ^" in "1" as{TypeError} core::int*]) → self::Foo*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.weak.modular.expect
new file mode 100644
index 0000000..24a6a4b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String* x = "x";
+  field core::Map<core::String*, core::Map<core::String*, core::String*>*>* y = <core::String*, core::Map<core::String*, core::String*>*>{"a": <core::String*, core::String*>{"b": "c"}, "d": <core::String*, core::String*>{"e": self::C::x}};
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.weak.modular.expect
new file mode 100644
index 0000000..3b47743
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::String* y = self::x;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::String* x = "x";
+static method main() → dynamic {
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.weak.modular.expect
new file mode 100644
index 0000000..8ee4d33
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.weak.modular.expect
@@ -0,0 +1,6 @@
+library test;
+import self as self;
+
+static method main() → dynamic {
+  () →* Null f = () → Null {};
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.weak.modular.expect
new file mode 100644
index 0000000..21efe4c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •(() →* void func) → self::C*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•(() → Null {});
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.weak.modular.expect
new file mode 100644
index 0000000..e5b98d2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* a = null;
+  field core::List<core::int*>* b = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method m() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* v = let final self::A* #t1 = new self::A::•() in block {
+  #t1.{self::A::a} = 1;
+  #t1.{self::A::b}{core::List<core::int*>*}.{core::List::add}(2){(core::int*) →* void};
+  #t1.{self::A::m}(){() →* void};
+} =>#t1;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.weak.modular.expect
new file mode 100644
index 0000000..83b4e3b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator *(self::C* other) → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* c = new self::C::•();
+static field core::bool* x = self::c.{self::C::*}(self::c){(self::C*) →* core::bool*};
+static method main() → dynamic {
+  self::c;
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.weak.modular.expect
new file mode 100644
index 0000000..6764bc5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  operator *(self::C* other) → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* c;
+static field core::bool* x = self::c.{self::I::*}(self::c){(self::C*) →* core::bool*};
+static method main() → dynamic {
+  self::c;
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.weak.modular.expect
new file mode 100644
index 0000000..250adf8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator [](core::int* index) → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  core::bool* x = c.{self::C::[]}(0){(core::int*) →* core::bool*};
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.weak.modular.expect
new file mode 100644
index 0000000..007c0cd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  operator [](core::int* index) → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f() → dynamic {
+  self::C* c;
+  core::bool* x = c.{self::I::[]}(0){(core::int*) →* core::bool*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.weak.modular.expect
new file mode 100644
index 0000000..d0c4a3c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator unary-() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* c = new self::C::•();
+static field core::bool* x = self::c.{self::C::unary-}(){() →* core::bool*};
+static method main() → dynamic {
+  self::c;
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.weak.modular.expect
new file mode 100644
index 0000000..443ba4b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  operator unary-() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* c;
+static field core::bool* x = self::c.{self::I::unary-}(){() →* core::bool*};
+static method main() → dynamic {
+  self::c;
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..909f982
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method g() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field () →* core::bool* x = self::f().{self::C::g}{() →* core::bool*};
+static method f() → self::C*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.weak.modular.expect
new file mode 100644
index 0000000..a162c11
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method g() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field () →* core::bool* x = self::f().{self::I::g}{() →* core::bool*};
+static method f() → self::C*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..6eef7cc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field (core::Object*) →* void v = #C1;
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff core::print
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.weak.modular.expect
new file mode 100644
index 0000000..429fa8a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method g() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::bool* x = self::f().{self::C::g}(){() →* core::bool*};
+static method f() → self::C*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.weak.modular.expect
new file mode 100644
index 0000000..c694d88
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method g() → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::bool* x = self::f().{self::I::g}(){() →* core::bool*};
+static method f() → self::C*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.weak.modular.expect
new file mode 100644
index 0000000..5f1e09a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E*>* values = #C4;
+  static const field self::E* v1 = #C3;
+  const constructor •(core::int* index, core::String* name) → self::E*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static final field self::E* x = #C3;
+static method main() → dynamic {
+  self::x;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = "v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inferred_type_is_enum.dart:
+- E. (from org-dartlang-testcase:///inferred_type_is_enum.dart:8:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.weak.modular.expect
new file mode 100644
index 0000000..624054f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E*>* values = #C4;
+  static const field self::E* v1 = #C3;
+  const constructor •(core::int* index, core::String* name) → self::E*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static final field core::List<self::E*>* x = #C4;
+static method main() → dynamic {
+  self::x;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = "v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///inferred_type_is_enum_values.dart:
+- E. (from org-dartlang-testcase:///inferred_type_is_enum_values.dart:8:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..2f74b63
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* void;
+static final field core::Map<core::String*, () →* void>* x = <core::String*, () →* void>{};
+static method main() → dynamic {
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.weak.modular.expect
new file mode 100644
index 0000000..24aba57
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<T extends core::Object* = dynamic> = () →* T*;
+static final field core::Map<core::String*, () →* core::int*>* x = <core::String*, () →* core::int*>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.weak.modular.expect
new file mode 100644
index 0000000..21d3b06
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<() →* core::Object*>* v = <() →* core::Object*>[#C1, #C2];
+static method f() → core::int*
+  return null;
+static method g() → core::String*
+  return null;
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+  #C2 = static-tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.weak.modular.expect
new file mode 100644
index 0000000..9be942f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<((core::String*) →* core::int*) →* core::Object*>* v = <((core::String*) →* core::int*) →* core::Object*>[#C1, #C2];
+static method f((core::String*) →* core::int* x) → core::int*
+  return null;
+static method g((core::String*) →* core::int* x) → core::String*
+  return null;
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+  #C2 = static-tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.weak.modular.expect
new file mode 100644
index 0000000..0b7d047
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<({x: core::int*}) →* core::Object*>* v = <({x: core::int*}) →* core::Object*>[#C1, #C2];
+static method f({core::int* x = #C3}) → core::int*
+  return null;
+static method g({core::int* x = #C3}) → core::String*
+  return null;
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+  #C2 = static-tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.weak.modular.expect
new file mode 100644
index 0000000..704ff597
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<([core::int*]) →* core::Object*>* v = <([core::int*]) →* core::Object*>[#C1, #C2];
+static method f([core::int* x = #C3]) → core::int*
+  return null;
+static method g([core::int* x = #C3]) → core::String*
+  return null;
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+  #C2 = static-tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.weak.modular.expect
new file mode 100644
index 0000000..b495253
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<(core::int*) →* core::Object*>* v = <(core::int*) →* core::Object*>[#C1, #C2];
+static method f(core::int* x) → core::int*
+  return null;
+static method g(core::int* x) → core::String*
+  return null;
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+  #C2 = static-tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.weak.modular.expect
new file mode 100644
index 0000000..7c6c26d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* (core::int*) →* core::Map<core::int*, core::bool*>* f = (core::bool* b) → (core::int*) →* core::Map<core::int*, core::bool*>* => (core::int* i) → core::Map<core::int*, core::bool*>* => <core::int*, core::bool*>{i: b};
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.weak.modular.expect
new file mode 100644
index 0000000..edd69ee
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* core::bool* f = (core::bool* b) → core::bool* => b;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.weak.modular.expect
new file mode 100644
index 0000000..06af2b3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* core::int* f = (core::bool* b) → core::int* => 1;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..ac18ccc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static final field (core::bool*) →* core::int* f = (core::bool* b) → core::int* => 1;
+static method main() → dynamic {
+  self::f;
+}
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.weak.modular.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.weak.modular.expect
new file mode 100644
index 0000000..7b33a23
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I1 extends core::Object {
+  final field core::int* x = self::y;
+  synthetic constructor •() → self::I1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I2 extends core::Object {
+  synthetic constructor •() → self::I2*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::num*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object implements self::I1, self::I2 {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* y = new self::C::•().{self::C::x}{core::int*};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..1e592bc2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B<core::List<self::A::T*>*>* b) → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A<dynamic>* x = new self::A::•<dynamic>(new self::B::•<core::List<dynamic>*>());
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.modular.expect
new file mode 100644
index 0000000..f272f74
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object* = dynamic>(self::C::f::T* x) → self::C::f::T*
+    return x;
+  static method g<T extends core::Object* = dynamic>(self::C::g::T* x) → self::C::g::T*
+    return x;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method test() → void {
+    (core::int*) →* core::int* func;
+    func = super.{self::C::f}<core::int*>;
+  }
+}
+static method f<T extends core::Object* = dynamic>(self::f::T* x) → self::f::T*
+  return x;
+static method test() → void {
+  function h<T extends core::Object* = dynamic>(T* x) → T*
+    return x;
+  (core::int*) →* core::int* func;
+  func = #C2;
+  func = new self::C::•().{self::C::f}{<T extends core::Object* = dynamic>(T*) →* T*}<core::int*>;
+  func = #C4;
+  func = h<core::int*>;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::f
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = static-tearoff self::C::g
+  #C4 = instantiation #C3 <core::int*>
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.weak.modular.expect
new file mode 100644
index 0000000..86594e9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
+    return (self::C::T* y) → Null {};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C<core::String*>* c) → void {
+  (core::int*) →* (core::String*) →* void tearoff = (c.{self::C::f}{<U extends core::Object* = dynamic>(U*) →* (core::String*) →* void} as{TypeError,CovarianceCheck} <U extends core::Object* = dynamic>(U*) →* (core::String*) →* void)<core::int*>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.weak.modular.expect
new file mode 100644
index 0000000..2e086bf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:10:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+//   func = f.call;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test(<T extends core::Object* = dynamic>(T*) →* T* f) → void {
+  (core::int*) →* core::int* func;
+  func = invalid-expression "pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:10:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+  func = f.call;
+           ^" in f.call as{TypeError} (core::int*) →* core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.modular.expect
new file mode 100644
index 0000000..0fb60dc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A<T extends core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::B<self::A<core::int*>*>* v = null;
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.modular.expect
new file mode 100644
index 0000000..0612d0f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::B<self::A<core::int*>*>* v = null;
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..731ae28
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::B<self::A<dynamic>*>* v = null;
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.modular.expect
new file mode 100644
index 0000000..09072c4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A<core::int*>* v = null;
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.modular.expect
new file mode 100644
index 0000000..09072c4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A<core::int*>* v = null;
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..05cb019
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<dynamic>* v = new self::C::•<dynamic>();
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.modular.expect
new file mode 100644
index 0000000..1fb9971
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C<core::int*>* x = new self::C::•<core::int*>();
+static method main() → dynamic {
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.modular.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.modular.expect
new file mode 100644
index 0000000..6bd9194
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends self::A*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::B<self::A*>* v = null;
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/int_upwards_local.dart.weak.modular.expect b/pkg/front_end/testcases/inference/int_upwards_local.dart.weak.modular.expect
new file mode 100644
index 0000000..bdd406c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/int_upwards_local.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int* x = 1;
+}
diff --git a/pkg/front_end/testcases/inference/issue41199.dart.weak.modular.expect b/pkg/front_end/testcases/inference/issue41199.dart.weak.modular.expect
new file mode 100644
index 0000000..6d7392d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/issue41199.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo<X extends core::Object* = dynamic>(<Y extends core::Object* = dynamic>() →* core::Map<self::foo::X*, Y*>* f) → dynamic
+  return null;
+static method baz() → dynamic
+  return self::foo<dynamic>(<Z extends core::Object* = dynamic>() → core::Map<dynamic, Z*>* => <dynamic, Z*>{});
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.weak.modular.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.weak.modular.expect
new file mode 100644
index 0000000..9cfc708
--- /dev/null
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method getListOfString() → core::List<core::String*>*
+  return #C1;
+static method foo() → void {
+  core::List<dynamic>* myList = self::getListOfString();
+  myList.{core::Iterable::map}<core::int*>((dynamic type) → core::int* => 42){((dynamic) →* core::int*) →* core::Iterable<core::int*>*};
+}
+static method bar() → void {
+  dynamic list;
+  try {
+    list = <core::String*>[];
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  list{dynamic}.map((dynamic value) → core::String* => "${value}");
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/lambda_return_type.dart.weak.modular.expect
new file mode 100644
index 0000000..c4026b5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/lambda_return_type.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef FunctionReturningNum = () →* core::num*;
+static method test() → dynamic {
+  core::int* i = 1;
+  core::Object* o = 1;
+  () →* core::num* a = () → core::int* => i;
+  () →* core::num* b = () → core::num* => o as{TypeError} core::num*;
+  () →* core::num* c = () → core::int* {
+    return i;
+  };
+  () →* core::num* d = () → core::num* {
+    return o as{TypeError} core::num*;
+  };
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/lambda_void_context.dart.weak.modular.expect b/pkg/front_end/testcases/inference/lambda_void_context.dart.weak.modular.expect
new file mode 100644
index 0000000..bfc338c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/lambda_void_context.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f() → dynamic {
+  core::List<core::int*>* o;
+  o.{core::Iterable::forEach}((core::int* i) → core::int* => i.{core::num::+}(1){(core::num*) →* core::int*}){((core::int*) →* void) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart.weak.modular.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.weak.modular.expect
new file mode 100644
index 0000000..87ba7a9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literal_typed.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* a = <core::int*>[];
+static field core::List<core::double*>* b = <core::double*>[1.0, 2.0, 3.0];
+static field core::List<core::List<core::int*>*>* c = <core::List<core::int*>*>[];
+static field core::List<dynamic>* d = <dynamic>[1, 2.0, false];
+static method main() → dynamic {
+  core::List<core::int*>* a = <core::int*>[];
+  core::List<core::double*>* b = <core::double*>[1.0, 2.0, 3.0];
+  core::List<core::List<core::int*>*>* c = <core::List<core::int*>*>[];
+  core::List<dynamic>* d = <dynamic>[1, 2.0, false];
+}
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.weak.modular.expect b/pkg/front_end/testcases/inference/list_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..a4e38e4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/list_literals.dart:10:70: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//   x. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/list_literals.dart:11:70: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//   x. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
+//                                                                      ^
+//
+// pkg/front_end/testcases/inference/list_literals.dart:18:70: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+//   x. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+//                                                                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test1() → dynamic {
+  core::List<core::int*>* x = <core::int*>[1, 2, 3];
+  x.{core::List::add}(invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:70: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  x. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+                                                                     ^" in "hi" as{TypeError} core::int*){(core::int*) →* void};
+  x.{core::List::add}(invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:70: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  x. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
+                                                                     ^" in 4.0 as{TypeError} core::int*){(core::int*) →* void};
+  x.{core::List::add}(4){(core::int*) →* void};
+  core::List<core::num*>* y = x;
+}
+static method test2() → dynamic {
+  core::List<core::num*>* x = <core::num*>[1, 2.0, 3];
+  x.{core::List::add}(invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:70: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+  x. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+                                                                     ^" in "hi" as{TypeError} core::num*){(core::num*) →* void};
+  x.{core::List::add}(4.0){(core::num*) →* void};
+  core::List<core::int*>* y = x as{TypeError} core::List<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.weak.modular.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.weak.modular.expect
new file mode 100644
index 0000000..6efc2e7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test1() → dynamic {
+  core::List<Null>* x = <Null>[null];
+  x.{core::List::add}(42 as{TypeError} Null){(Null) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..75f767f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+//   x1. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+//   x1. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
+//                                                                       ^
+//
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+//   x2. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+//                                                                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* x1 = <core::int*>[1, 2, 3];
+static field core::List<core::num*>* x2 = <core::num*>[1, 2.0, 3];
+static method test1() → dynamic {
+  self::x1.{core::List::add}(invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+  x1. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+                                                                      ^" in "hi" as{TypeError} core::int*){(core::int*) →* void};
+  self::x1.{core::List::add}(invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  x1. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
+                                                                      ^" in 4.0 as{TypeError} core::int*){(core::int*) →* void};
+  self::x1.{core::List::add}(4){(core::int*) →* void};
+  core::List<core::num*>* y = self::x1;
+}
+static method test2() → dynamic {
+  self::x2.{core::List::add}(invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+  x2. /*@target=List.add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
+                                                                      ^" in "hi" as{TypeError} core::num*){(core::num*) →* void};
+  self::x2.{core::List::add}(4.0){(core::num*) →* void};
+  core::List<core::int*>* y = self::x2 as{TypeError} core::List<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.weak.modular.expect
new file mode 100644
index 0000000..908eca7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
+    : self::C::t = t, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* x = new self::C::•<core::int*>(42);
+  core::num* y;
+  self::C<core::int*>* c_int = new self::C::•<core::int*>(y as{TypeError} core::int*);
+  self::C<core::num*>* c_num = new self::C::•<core::num*>(123);
+  self::C<dynamic>* c_dynamic = new self::C::•<dynamic>(42);
+}
diff --git a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.weak.modular.expect b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.weak.modular.expect
new file mode 100644
index 0000000..220da3b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method main() → dynamic {
+  asy::Future<core::int*>* futureInt = null;
+  asy::Future<core::int*>* x = futureInt;
+}
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.weak.modular.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.weak.modular.expect
new file mode 100644
index 0000000..421e71c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'Future<dynamic Function(dynamic)>' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+//  - 'Future' is from 'dart:async'.
+//     return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+//                                      ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+typedef IntToInt = (core::int*) →* core::int*;
+static method main() → dynamic {
+  function a() → (core::int*) →* core::int* {
+    return (core::int* x) → core::int* => x;
+  }
+  function b() → asy::Future<(core::int*) →* core::int*>* async {
+    return invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'Future<dynamic Function(dynamic)>' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+ - 'Future' is from 'dart:async'.
+    return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+                                     ^" in ((dynamic x) → dynamic => x) as{TypeError} FutureOr<(core::int*) →* core::int*>*;
+  }
+  function c() → core::Iterable<(core::int*) →* core::int*>* sync* {
+    yield(core::int* x) → core::int* => x;
+  }
+  function d() → core::Iterable<(core::int*) →* core::int*>* sync* {
+    yield*<(core::int*) →* core::int*>[(core::int* x) → core::int* => x];
+  }
+  function e() → asy::Stream<(core::int*) →* core::int*>* async* {
+    yield(core::int* x) → core::int* => x;
+  }
+  function f() → asy::Stream<(core::int*) →* core::int*>* async* {
+    yield* asy::Stream::fromIterable<(core::int*) →* core::int*>(<(core::int*) →* core::int*>[(core::int* x) → core::int* => x]);
+  }
+}
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.weak.modular.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.weak.modular.expect
new file mode 100644
index 0000000..8b606cf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::A* a = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f(core::Object* o) → void {
+    if(o is self::A* || o is self::B*) {
+      if(o is self::A*) {
+        this.{self::C::a} = o{self::A*};
+      }
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.weak.modular.expect b/pkg/front_end/testcases/inference/map_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..f3f2fd7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+//                                              ^
+//
+// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
+//                                              ^
+//
+// pkg/front_end/testcases/inference/map_literals.dart:15:60: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   x /*@target=Map.[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+//                                                            ^
+//
+// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+//       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+//                                              ^
+//
+// pkg/front_end/testcases/inference/map_literals.dart:29:60: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+//  - 'Pattern' is from 'dart:core'.
+//   x /*@target=Map.[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+//                                                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test1() → dynamic {
+  core::Map<core::int*, core::String*>* x = <core::int*, core::String*>{1: "x", 2: "y"};
+  x.{core::Map::[]=}(3, "z"){(core::int*, core::String*) →* void};
+  x.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+                                             ^" in "hi" as{TypeError} core::int*, "w"){(core::int*, core::String*) →* void};
+  x.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
+                                             ^" in 4.0 as{TypeError} core::int*, "u"){(core::int*, core::String*) →* void};
+  x.{core::Map::[]=}(3, invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:60: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  x /*@target=Map.[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+                                                           ^" in 42 as{TypeError} core::String*){(core::int*, core::String*) →* void};
+  core::Map<core::num*, core::String*>* y = x;
+}
+static method test2() → dynamic {
+  core::Map<core::num*, core::Pattern*>* x = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
+  x.{core::Map::[]=}(3, "z"){(core::num*, core::Pattern*) →* void};
+  x.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+                                             ^" in "hi" as{TypeError} core::num*, "w"){(core::num*, core::Pattern*) →* void};
+  x.{core::Map::[]=}(4.0, "u"){(core::num*, core::Pattern*) →* void};
+  x.{core::Map::[]=}(3, invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:60: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+ - 'Pattern' is from 'dart:core'.
+  x /*@target=Map.[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+                                                           ^" in 42 as{TypeError} core::Pattern*){(core::num*, core::Pattern*) →* void};
+  core::Pattern* p = null;
+  x.{core::Map::[]=}(2, p){(core::num*, core::Pattern*) →* void};
+  core::Map<core::int*, core::String*>* y = x as{TypeError} core::Map<core::int*, core::String*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.weak.modular.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.weak.modular.expect
new file mode 100644
index 0000000..b636b6c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test1() → dynamic {
+  core::Map<Null, Null>* x = <Null, Null>{null: null};
+  x.{core::Map::[]=}(3 as{TypeError} Null, "z" as{TypeError} Null){(Null, Null) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..cd284fd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:66: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   x1 /*@target=Map.[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+//                                                                  ^
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:66: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   x1 /*@target=Map.[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
+//                                                                  ^
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   x1 /*@target=Map.[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:66: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+//   x2 /*@target=Map.[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+//                                                                  ^
+//
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+//  - 'Pattern' is from 'dart:core'.
+//   x2 /*@target=Map.[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+//                                                             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::Map<core::int*, core::String*>* x1 = <core::int*, core::String*>{1: "x", 2: "y"};
+static field core::Map<core::num*, core::Pattern*>* x2 = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
+static method test1() → dynamic {
+  self::x1.{core::Map::[]=}(3, "z"){(core::int*, core::String*) →* void};
+  self::x1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:66: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  x1 /*@target=Map.[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+                                                                 ^" in "hi" as{TypeError} core::int*, "w"){(core::int*, core::String*) →* void};
+  self::x1.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:66: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  x1 /*@target=Map.[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
+                                                                 ^" in 4.0 as{TypeError} core::int*, "u"){(core::int*, core::String*) →* void};
+  self::x1.{core::Map::[]=}(3, invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  x1 /*@target=Map.[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+                                                            ^" in 42 as{TypeError} core::String*){(core::int*, core::String*) →* void};
+  core::Map<core::num*, core::String*>* y = self::x1;
+}
+static method test2() → dynamic {
+  self::x2.{core::Map::[]=}(3, "z"){(core::num*, core::Pattern*) →* void};
+  self::x2.{core::Map::[]=}(invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:66: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+  x2 /*@target=Map.[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
+                                                                 ^" in "hi" as{TypeError} core::num*, "w"){(core::num*, core::Pattern*) →* void};
+  self::x2.{core::Map::[]=}(4.0, "u"){(core::num*, core::Pattern*) →* void};
+  self::x2.{core::Map::[]=}(3, invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+ - 'Pattern' is from 'dart:core'.
+  x2 /*@target=Map.[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
+                                                            ^" in 42 as{TypeError} core::Pattern*){(core::num*, core::Pattern*) →* void};
+  core::Pattern* p = null;
+  self::x2.{core::Map::[]=}(2, p){(core::num*, core::Pattern*) →* void};
+  core::Map<core::int*, core::String*>* y = self::x2 as{TypeError} core::Map<core::int*, core::String*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.weak.modular.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.weak.modular.expect
new file mode 100644
index 0000000..05bd044
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::D<core::int*>* f = new self::C::•().{self::C::f}<core::int*>(){() →* self::D<core::int*>*};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.weak.modular.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.weak.modular.expect
new file mode 100644
index 0000000..28c5383
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* c;
+static field self::D<core::int*>* f = self::c.{self::C::f}<core::int*>(){() →* self::D<core::int*>*};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.weak.modular.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.weak.modular.expect
new file mode 100644
index 0000000..b87237a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::D<core::int*>* f = self::C::f<core::int*>();
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.weak.modular.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.weak.modular.expect
new file mode 100644
index 0000000..a32a635
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::D<core::int*>* g = self::f<core::int*>();
+static method f<T extends core::Object* = dynamic>() → self::D<self::f::T*>*
+  return null;
+static method main() → dynamic {
+  self::g;
+}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.modular.expect
new file mode 100644
index 0000000..ce1b438
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<X extends core::Object* = dynamic, Y extends core::String*> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::String*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M1&M0*
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.weak.modular.expect
new file mode 100644
index 0000000..f202e79
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<X extends core::Object* = dynamic, Y extends self::M0::X* = dynamic> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M1&M0*
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.modular.expect
new file mode 100644
index 0000000..69d5022
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+//  - 'Comparable' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class A extends M1 with M0 {}
+//       ^
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
+// class M0<X, Y extends Comparable<Y>> extends I<X> {}
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y*>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::Comparable<dynamic>*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M1&M0*
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.modular.expect
new file mode 100644
index 0000000..4493630
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_4.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<X extends core::Object* = dynamic, Y extends ({name: core::String*}) →* void> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, ({name: core::String*}) →* void> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M1&M0*
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.weak.modular.expect
new file mode 100644
index 0000000..4f31d67
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.weak.modular.expect
@@ -0,0 +1,75 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class J<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> = self::I<self::_M0&I&J::X*> with self::J<self::_M0&I&J::Y*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X*, self::_M0&I&J::Y*>*
+    : super self::I::•()
+    ;
+}
+class M0<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::_M0&I&J<self::M0::X*, self::M0::Y*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
+    : super self::_M0&I&J::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M2 extends self::M1 implements self::J<core::double*> {
+  synthetic constructor •() → self::M2*
+    : super self::M1::•()
+    ;
+}
+abstract class _A&M2&M0 = self::M2 with self::M0<core::int*, core::double*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M2&M0*
+    : super self::M2::•()
+    ;
+}
+class A extends self::_A&M2&M0 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M2&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.weak.modular.expect
new file mode 100644
index 0000000..012dd24
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<T extends core::Object* = dynamic> extends self::I<core::List<self::M0::T*>*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object* = dynamic> extends self::I<core::List<self::M1::T*>*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
+    : super self::I::•()
+    ;
+}
+class M2<T extends core::Object* = dynamic> extends self::M1<core::Map<self::M2::T*, self::M2::T*>*> {
+  synthetic constructor •() → self::M2<self::M2::T*>*
+    : super self::M1::•()
+    ;
+}
+abstract class _A&M2&M0 = self::M2<core::int*> with self::M0<core::Map<core::int*, core::int*>*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M2&M0*
+    : super self::M2::•()
+    ;
+}
+class A extends self::_A&M2&M0 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M2&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.weak.modular.expect
new file mode 100644
index 0000000..0f8933b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
+    : super self::I::•()
+    ;
+}
+abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M0&M1*
+    : super self::M0::•()
+    ;
+}
+class A extends self::_A&M0&M1 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.weak.modular.expect
new file mode 100644
index 0000000..d7c017d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
+    : super self::I::•()
+    ;
+}
+class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> {
+  synthetic constructor •() → self::M2<self::M2::T*>*
+    : super self::I::•()
+    ;
+}
+abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M0&M1*
+    : super self::M0::•()
+    ;
+}
+abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&M0&M1&M2*
+    : super self::_A&M0&M1::•()
+    ;
+}
+class A extends self::_A&M0&M1&M2 {
+  synthetic constructor •() → self::A*
+    : super self::_A&M0&M1&M2::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.weak.modular.expect
new file mode 100644
index 0000000..da805eec
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.weak.modular.expect
@@ -0,0 +1,73 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
+// class A extends Object with M0, M1<int> {}
+//       ^
+//
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<T extends core::Object* = dynamic> extends core::Object implements self::I<self::M0::T*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
+    : super self::I::•()
+    ;
+}
+abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M0*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M0&M1*
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A*
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.weak.modular.expect
new file mode 100644
index 0000000..1391478
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.weak.modular.expect
@@ -0,0 +1,73 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:14:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
+// class A extends Object with M0, M1 implements I<int> {}
+//       ^
+//
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<T extends core::Object* = dynamic> extends core::Object implements self::I<self::M0::T*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
+    : super self::I::•()
+    ;
+}
+abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M0*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M0&M1*
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 implements self::I<core::int*> {
+  synthetic constructor •() → self::A*
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.weak.modular.expect
new file mode 100644
index 0000000..5907e7e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.weak.modular.expect
@@ -0,0 +1,83 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
+// class A extends Object with M0, M1 {}
+//       ^
+//
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*, self::I::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<T extends core::Object* = dynamic> extends core::Object implements self::I<self::M0::T*, core::int*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M1<T extends core::Object* = dynamic> extends core::Object implements self::I<core::String*, self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M0*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M0&M1*
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A*
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.weak.modular.expect
new file mode 100644
index 0000000..41a47e4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
+// class A extends Object with M0, M1 {}
+//       ^
+//
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*, self::I::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M0<T extends core::Object* = dynamic> extends core::Object implements self::I<self::M0::T*, core::List<self::M0::T*>*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M1<T extends core::Object* = dynamic> extends core::Object implements self::I<core::List<self::M1::T*>*, self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&M0 = core::Object with self::M0<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M0*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M0&M1*
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A*
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.weak.modular.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.weak.modular.expect
new file mode 100644
index 0000000..fb95dc3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test1() → dynamic {
+  core::num* x = 3;
+  x = null;
+}
+static method main() → dynamic {
+  self::test1();
+}
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..5049806
--- /dev/null
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant U extends core::Object* = dynamic, V extends core::Object* = dynamic> = (U*) →* V*;
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+  get v1() → self::Bar<self::Foo::T*>*
+    return new self::Bar::•<self::Foo::T*>();
+  get v2() → self::Bar<core::List<self::Foo::T*>*>*
+    return new self::Bar::•<core::List<self::Foo::T*>*>();
+  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
+    return new self::Bar::•<(self::Foo::T*) →* self::Foo::T*>();
+  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
+    return new self::Bar::•<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>();
+  get v5() → core::List<self::Foo::T*>*
+    return <self::Foo::T*>[];
+  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
+    return <(self::Foo::T*) →* self::Foo::T*>[];
+  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
+    return <self::Foo::T*, self::Foo::T*>{};
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
+    return <(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>{};
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
+    return <self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>{};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::Bar<self::Bar::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..8a5e873
--- /dev/null
+++ b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  get x() → dynamic
+    return null;
+  set x(dynamic value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..cbf7329
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → core::int*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g(self::C* c) → dynamic {
+  core::int* x = let final self::C* #t1 = c in #t1 == null ?{core::int*} null : #t1.{self::C::f}(){() →* core::int*};
+  let final self::C* #t2 = c in #t2 == null ?{core::int*} null : #t2.{self::C::f}(){() →* core::int*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.weak.modular.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.weak.modular.expect
new file mode 100644
index 0000000..b8c3acb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f(self::C* c) → void {
+  core::int* x = let final self::C* #t1 = c in #t1 == null ?{core::int*} null : #t1.{self::C::x}{core::int*};
+  let final self::C* #t2 = c in #t2 == null ?{core::int*} null : #t2.{self::C::x}{core::int*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.weak.modular.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.weak.modular.expect
new file mode 100644
index 0000000..15f12a3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<core::int*>* x;
+  core::List<core::int*>* y = let final core::List<core::int*>* #t1 = x in #t1 == null ?{core::List<core::int*>*} <core::int*>[] : #t1;
+  core::List<core::int*>* z = y;
+}
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.weak.modular.expect
new file mode 100644
index 0000000..33d1268
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<core::int*>* x;
+  core::List<core::num*>* y = let final core::List<core::int*>* #t1 = x in #t1 == null ?{core::List<core::num*>*} <core::num*>[] : #t1;
+}
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.weak.modular.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.weak.modular.expect
new file mode 100644
index 0000000..4344e6b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic h = null;
+static method foo((core::Object*) →* core::int* f) → void {}
+static method test() → dynamic {
+  (core::Object*) →* Null f = (core::Object* x) → Null => null;
+  core::String* y = f(42){(core::Object*) →* Null};
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
+  dynamic g = null;
+  g = "hello";
+  g{dynamic}.foo();
+  self::h = "hello";
+  self::h{dynamic}.foo();
+  self::foo((core::Object* x) → Null => null);
+  self::foo((core::Object* x) → Null => throw "not implemented");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.weak.modular.expect b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.weak.modular.expect
new file mode 100644
index 0000000..09b660d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::num* n = 1;
+  core::int* i = 1;
+  core::double* d = 1.0;
+  core::double* ddPlus = d.{core::double::+}(d){(core::num*) →* core::double*};
+  core::double* ddMinus = d.{core::double::-}(d){(core::num*) →* core::double*};
+  core::double* ddTimes = d.{core::double::*}(d){(core::num*) →* core::double*};
+  core::double* ddMod = d.{core::double::%}(d){(core::num*) →* core::double*};
+  core::double* diPlus = d.{core::double::+}(i){(core::num*) →* core::double*};
+  core::double* diMinus = d.{core::double::-}(i){(core::num*) →* core::double*};
+  core::double* diTimes = d.{core::double::*}(i){(core::num*) →* core::double*};
+  core::double* diMod = d.{core::double::%}(i){(core::num*) →* core::double*};
+  core::double* dnPlus = d.{core::double::+}(n){(core::num*) →* core::double*};
+  core::double* dnMinus = d.{core::double::-}(n){(core::num*) →* core::double*};
+  core::double* dnTimes = d.{core::double::*}(n){(core::num*) →* core::double*};
+  core::double* dnMod = d.{core::double::%}(n){(core::num*) →* core::double*};
+  core::double* idPlus = i.{core::num::+}(d){(core::num*) →* core::double*};
+  core::double* idMinus = i.{core::num::-}(d){(core::num*) →* core::double*};
+  core::double* idTimes = i.{core::num::*}(d){(core::num*) →* core::double*};
+  core::double* idMod = i.{core::num::%}(d){(core::num*) →* core::double*};
+  core::int* iiPlus = i.{core::num::+}(i){(core::num*) →* core::int*};
+  core::int* iiMinus = i.{core::num::-}(i){(core::num*) →* core::int*};
+  core::int* iiTimes = i.{core::num::*}(i){(core::num*) →* core::int*};
+  core::int* iiMod = i.{core::num::%}(i){(core::num*) →* core::int*};
+  core::num* inPlus = i.{core::num::+}(n){(core::num*) →* core::num*};
+  core::num* inMinus = i.{core::num::-}(n){(core::num*) →* core::num*};
+  core::num* inTimes = i.{core::num::*}(n){(core::num*) →* core::num*};
+  core::num* inMod = i.{core::num::%}(n){(core::num*) →* core::num*};
+  core::num* ndPlus = n.{core::num::+}(d){(core::num*) →* core::num*};
+  core::num* ndMinus = n.{core::num::-}(d){(core::num*) →* core::num*};
+  core::num* ndTimes = n.{core::num::*}(d){(core::num*) →* core::num*};
+  core::num* ndMod = n.{core::num::%}(d){(core::num*) →* core::num*};
+  core::num* niPlus = n.{core::num::+}(i){(core::num*) →* core::num*};
+  core::num* niMinus = n.{core::num::-}(i){(core::num*) →* core::num*};
+  core::num* niTimes = n.{core::num::*}(i){(core::num*) →* core::num*};
+  core::num* niMod = n.{core::num::%}(i){(core::num*) →* core::num*};
+  core::num* nnPlus = n.{core::num::+}(n){(core::num*) →* core::num*};
+  core::num* nnMinus = n.{core::num::-}(n){(core::num*) →* core::num*};
+  core::num* nnTimes = n.{core::num::*}(n){(core::num*) →* core::num*};
+  core::num* nnMod = n.{core::num::%}(n){(core::num*) →* core::num*};
+}
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.weak.modular.expect b/pkg/front_end/testcases/inference/override_equals.dart.weak.modular.expect
new file mode 100644
index 0000000..736b7cd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/override_equals.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class NullEquality extends core::Object {
+  synthetic constructor •() → self::NullEquality*
+    : super core::Object::•()
+    ;
+  @#C1
+  operator ==(core::Object* other) → Null
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubNullEquality extends self::NullEquality {
+  synthetic constructor •() → self::SubNullEquality*
+    : super self::NullEquality::•()
+    ;
+  method test() → void {
+    core::bool* super_equals_self = super.{self::NullEquality::==}(this);
+    core::bool* super_equals_null = super.{self::NullEquality::==}(null);
+    core::bool* super_not_equals_self = !super.{self::NullEquality::==}(this);
+    core::bool* super_not_equals_null = !super.{self::NullEquality::==}(null);
+  }
+}
+static method test() → dynamic {
+  self::NullEquality* n = new self::NullEquality::•();
+  core::bool* equals_self = n =={self::NullEquality::==}{(core::Object*) →* Null} n;
+  core::bool* equals_null = n == null;
+  core::bool* null_equals = n == null;
+  core::bool* not_equals_self = !(n =={self::NullEquality::==}{(core::Object*) →* Null} n);
+  core::bool* not_equals_null = !(n == null);
+  core::bool* null_not_equals = !(n == null);
+}
+static method main() → dynamic {
+  self::test();
+  new self::SubNullEquality::•().{self::SubNullEquality::test}(){() →* void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.weak.modular.expect b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..d9defc4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  final field core::String* foo = "bar";
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<Y extends core::Object* = dynamic> extends self::A<self::B::Y*> {
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::B<self::B::Y*>*
+    : self::B::foo = foo, super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..4e88a92
--- /dev/null
+++ b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract method foo({covariant-by-class core::Iterable<self::A::X*>* x = #C1}) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<Y extends core::Object* = dynamic> extends core::Object implements self::A<self::B::Y*> {
+  synthetic constructor •() → self::B<self::B::Y*>*
+    : super core::Object::•()
+    ;
+  method foo({covariant-by-class core::Iterable<self::B::Y*>* x = #C1}) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..b20f8c7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method optional_toplevel([core::List<core::int*>* x = #C1]) → void {}
+static method named_toplevel({core::List<core::int*>* x = #C1}) → void {}
+static method main() → dynamic {
+  function optional_local([core::List<core::int*>* x = #C1]) → void {}
+  function named_local({core::List<core::int*>* x = #C1}) → void {}
+  ([core::List<core::int*>*]) →* Null optional_closure = ([core::List<core::int*>* x = #C1]) → Null {};
+  ({x: core::List<core::int*>*}) →* Null name_closure = ({core::List<core::int*>* x = #C1}) → Null {};
+}
+
+constants  {
+  #C1 = <core::int*>[]
+}
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..d6fb1da
--- /dev/null
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor optional(([self::C::T*]) →* void func) → self::C<self::C::T*>*
+    : super core::Object::•() {}
+  constructor named(({x: self::C::T*}) →* void func) → self::C<self::C::T*>*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method optional_toplevel([dynamic x = #C2]) → void {}
+static method named_toplevel({dynamic x = #C2}) → void {}
+static method main() → dynamic {
+  function optional_local([dynamic x = #C2]) → void {}
+  function named_local({dynamic x = #C2}) → void {}
+  self::C<dynamic>* c_optional_toplevel = new self::C::optional<dynamic>(#C3);
+  self::C<dynamic>* c_named_toplevel = new self::C::named<dynamic>(#C4);
+  self::C<dynamic>* c_optional_local = new self::C::optional<dynamic>(optional_local);
+  self::C<dynamic>* c_named_local = new self::C::named<dynamic>(named_local);
+  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → Null {});
+  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → Null {});
+}
+
+constants  {
+  #C1 = 0
+  #C2 = <core::int*>[#C1]
+  #C3 = static-tearoff self::optional_toplevel
+  #C4 = static-tearoff self::named_toplevel
+}
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..cdec2e88
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  abstract method bar() → void;
+}
+static method f<T extends self::B*>(self::f::T* a) → void {
+  if(a is core::String*) {
+    a.{self::B::foo}(){() →* void};
+  }
+  if(a is self::C*) {
+    a{self::f::T* & self::C* /* '*' & '*' = '*' */}.{self::C::bar}(){() →* void};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.weak.modular.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.weak.modular.expect
new file mode 100644
index 0000000..16ae59d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::Object* a, core::bool* b) → void {
+  if(b && a is core::int*) {
+    core::print(a{core::int*});
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.weak.modular.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.weak.modular.expect
new file mode 100644
index 0000000..f240935
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::Object* x) → void {
+  if(x is core::int*) {
+    if(x{core::int*} is core::String*) {
+      core::int* y = x{core::int*};
+    }
+  }
+}
+static method g(core::int* x) → void {
+  if(x is core::String*) {
+    core::int* y = x;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.weak.modular.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.weak.modular.expect
new file mode 100644
index 0000000..3e27040
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•();
+  self::A* b = a;
+  core::print(a.{self::A::x}{core::int*});
+  core::print(a.{self::A::x}{core::int*}.{core::num::+}(2){(core::num*) →* core::int*});
+}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.weak.modular.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.weak.modular.expect
new file mode 100644
index 0000000..06148db
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  dynamic a = new self::A::•();
+  self::A* b = a as{TypeError,ForDynamic} self::A*;
+  core::print(a{dynamic}.x);
+  core::print(a{dynamic}.x{dynamic}.+(2));
+}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.weak.modular.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.weak.modular.expect
new file mode 100644
index 0000000..81035d4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   a1. /*@target=A.x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                                        ^
+//
+// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+//   a2. /*@target=A.x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
+//                                                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test5() → dynamic {
+  self::A* a1 = new self::A::•();
+  a1.{self::A::x} = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  a1. /*@target=A.x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                                       ^" in "hi" as{TypeError} core::int*;
+  self::A* a2 = new self::A::•();
+  a2.{self::A::x} = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  a2. /*@target=A.x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
+                                                       ^" in "hi" as{TypeError} core::int*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.weak.modular.expect
new file mode 100644
index 0000000..91157a6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x = 42;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  field self::A* a = new self::A::•();
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::B* b = new self::B::•();
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  field self::C* c = new self::C::•();
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  self::D* d1 = new self::D::•();
+  core::print(d1.{self::D::c}{self::C*}.{self::C::b}{self::B*}.{self::B::a}{self::A*}.{self::A::x}{core::int*});
+  self::D* d2 = new self::D::•();
+  core::print(d2.{self::D::c}{self::C*}.{self::C::b}{self::B*}.{self::B::a}{self::A*}.{self::A::x}{core::int*});
+}
diff --git a/pkg/front_end/testcases/inference/propagate_variable_get.dart.weak.modular.expect b/pkg/front_end/testcases/inference/propagate_variable_get.dart.weak.modular.expect
new file mode 100644
index 0000000..ba60f97
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_variable_get.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int* a = 0;
+  core::int* b = a;
+}
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.weak.modular.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.weak.modular.expect
new file mode 100644
index 0000000..4c93980
--- /dev/null
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  get getter() → core::int*
+    return 0;
+  method function() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* c = new self::C::•();
+static field () →* core::int* function_ref = self::c.{self::C::function}{() →* core::int*};
+static field core::List<() →* core::int*>* function_ref_list = <() →* core::int*>[self::c.{self::C::function}{() →* core::int*}];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set.dart.weak.modular.expect b/pkg/front_end/testcases/inference/property_set.dart.weak.modular.expect
new file mode 100644
index 0000000..c2feed8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/property_set.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field core::List<self::A::T*>* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  set y(covariant-by-class core::List<self::A::T*>* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  self::A<core::int*>* a_int = new self::A::•<core::int*>();
+  self::A<core::Object*>* a_object = new self::A::•<core::Object*>();
+  self::A<dynamic>* a_dynamic = new self::A::•<dynamic>();
+  core::List<core::int*>* x_int = a_int.{self::A::x} = <core::int*>[0];
+  core::List<core::int*>* y_int = a_int.{self::A::y} = <core::int*>[0];
+  core::List<core::Object*>* x_object = a_object.{self::A::x} = <core::Object*>[0];
+  core::List<core::Object*>* y_object = a_object.{self::A::y} = <core::Object*>[0];
+  core::List<dynamic>* x_dynamic = a_dynamic.{self::A::x} = <dynamic>[0];
+  core::List<dynamic>* y_dynamic = a_dynamic.{self::A::y} = <dynamic>[0];
+  core::List<core::int*>* x_int_explicit = a_int.{self::A::x} = <core::int*>[0];
+  core::List<core::int*>* y_int_explicit = a_int.{self::A::y} = <core::int*>[0];
+  core::List<core::int*>* x_object_explicit = a_object.{self::A::x} = <core::int*>[0];
+  core::List<core::int*>* y_object_explicit = a_object.{self::A::y} = <core::int*>[0];
+  core::List<core::int*>* x_dynamic_explicit = a_dynamic.{self::A::x} = <core::int*>[0];
+  core::List<core::int*>* y_dynamic_explicit = a_dynamic.{self::A::y} = <core::int*>[0];
+  core::List<core::int*>* x_int_downward = a_int.{self::A::x} = <core::int*>[0];
+  core::List<core::int*>* y_int_downward = a_int.{self::A::y} = <core::int*>[0];
+  core::List<core::int*>* x_object_downward = (a_object.{self::A::x} = <core::Object*>[0]) as{TypeError} core::List<core::int*>*;
+  core::List<core::int*>* y_object_downward = (a_object.{self::A::y} = <core::Object*>[0]) as{TypeError} core::List<core::int*>*;
+  core::List<core::int*>* x_dynamic_downward = (a_dynamic.{self::A::x} = <dynamic>[0]) as{TypeError} core::List<core::int*>*;
+  core::List<core::int*>* y_dynamic_downward = (a_dynamic.{self::A::y} = <dynamic>[0]) as{TypeError} core::List<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..3e05504
--- /dev/null
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:13: Error: A setter should have exactly one formal parameter.
+//   void set x() {}
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  set x(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:13: Error: A setter should have exactly one formal parameter.
+  void set x() {}
+            ^";
+    {}
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f(self::A* a) → void {
+  core::int* x = a.{self::A::x} = 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.weak.modular.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.weak.modular.expect
new file mode 100644
index 0000000..d617cd4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method _mergeSort<T extends core::Object* = dynamic>((self::_mergeSort::T*) →* self::_mergeSort::T* list, (self::_mergeSort::T*, self::_mergeSort::T*) →* core::int* compare, (self::_mergeSort::T*) →* self::_mergeSort::T* target) → void {
+  self::_mergeSort<self::_mergeSort::T*>(list, compare, target);
+  self::_mergeSort<self::_mergeSort::T*>(list, compare, list);
+  self::_mergeSort<self::_mergeSort::T*>(target, compare, target);
+  self::_mergeSort<self::_mergeSort::T*>(target, compare, list);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..1c7e0ba
--- /dev/null
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* void;
+static final field core::Type* x = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(() →* void)
+}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.modular.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.modular.expect
new file mode 100644
index 0000000..a3cae75
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num*> extends core::Object {
+  covariant-by-class field self::C::T* a = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method op(core::double* b) → void {
+    core::double* r1 = this.{self::C::a}{self::C::T*}.{core::num::+}(b){(core::num*) →* core::num*} as{TypeError} core::double*;
+    core::double* r2 = this.{self::C::a}{self::C::T*}.{core::num::-}(b){(core::num*) →* core::num*} as{TypeError} core::double*;
+    core::double* r3 = this.{self::C::a}{self::C::T*}.{core::num::*}(b){(core::num*) →* core::num*} as{TypeError} core::double*;
+    core::double* r4 = this.{self::C::a}{self::C::T*}.{core::num::/}(b){(core::num*) →* core::double*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.modular.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.modular.expect
new file mode 100644
index 0000000..24e9591
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num*> extends core::Object {
+  covariant-by-class field self::C::T* a = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method op(core::int* b) → void {
+    self::C::T* r1 = this.{self::C::a}{self::C::T*}.{core::num::+}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+    self::C::T* r2 = this.{self::C::a}{self::C::T*}.{core::num::-}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+    self::C::T* r3 = this.{self::C::a}{self::C::T*}.{core::num::*}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+  }
+  method opEq(core::int* b) → void {
+    this.{self::C::a} = this.{self::C::a}{self::C::T*}.{core::num::+}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}{self::C::T*}.{core::num::-}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}{self::C::T*}.{core::num::*}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.modular.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.modular.expect
new file mode 100644
index 0000000..88143e7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num*> extends core::Object {
+  covariant-by-class field self::C::T* a = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method op(covariant-by-class self::C::T* b) → void {
+    self::C::T* r1 = this.{self::C::a}{self::C::T*}.{core::num::+}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+    self::C::T* r2 = this.{self::C::a}{self::C::T*}.{core::num::-}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+    self::C::T* r3 = this.{self::C::a}{self::C::T*}.{core::num::*}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+  }
+  method opEq(covariant-by-class self::C::T* b) → void {
+    this.{self::C::a} = this.{self::C::a}{self::C::T*}.{core::num::+}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}{self::C::T*}.{core::num::-}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}{self::C::T*}.{core::num::*}(b){(core::num*) →* core::num*} as{TypeError} self::C::T*;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.weak.modular.expect
new file mode 100644
index 0000000..b816e0d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set x(core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  set x(core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C implements self::I {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x(core::int* value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/simple_literal_bool.dart.weak.modular.expect b/pkg/front_end/testcases/inference/simple_literal_bool.dart.weak.modular.expect
new file mode 100644
index 0000000..da6bc88
--- /dev/null
+++ b/pkg/front_end/testcases/inference/simple_literal_bool.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a = true;
+static method main() → dynamic {
+  core::bool* b = false;
+}
diff --git a/pkg/front_end/testcases/inference/simple_literal_double.dart.weak.modular.expect b/pkg/front_end/testcases/inference/simple_literal_double.dart.weak.modular.expect
new file mode 100644
index 0000000..ce86f42
--- /dev/null
+++ b/pkg/front_end/testcases/inference/simple_literal_double.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::double* a = 1.2;
+static method main() → dynamic {
+  core::double* b = 3.4;
+}
diff --git a/pkg/front_end/testcases/inference/simple_literal_int.dart.weak.modular.expect b/pkg/front_end/testcases/inference/simple_literal_int.dart.weak.modular.expect
new file mode 100644
index 0000000..02faaca
--- /dev/null
+++ b/pkg/front_end/testcases/inference/simple_literal_int.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* a = 1;
+static method main() → dynamic {
+  core::int* b = 2;
+}
diff --git a/pkg/front_end/testcases/inference/simple_literal_null.dart.weak.modular.expect b/pkg/front_end/testcases/inference/simple_literal_null.dart.weak.modular.expect
new file mode 100644
index 0000000..8afbb2c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/simple_literal_null.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static field dynamic a = null;
+static method main() → dynamic {
+  dynamic b = null;
+}
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..b89fa7d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static method f(core::String* s) → core::int*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field (core::String*) →* core::int* v = #C1;
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = static-tearoff self::C::f
+}
diff --git a/pkg/front_end/testcases/inference/string_literal.dart.weak.modular.expect b/pkg/front_end/testcases/inference/string_literal.dart.weak.modular.expect
new file mode 100644
index 0000000..c59623a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/string_literal.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* x = 1;
+static field core::String* a = "aaa";
+static field core::String* b = "b ${self::x} bb";
+static field core::String* c = "c ${self::x} ccccc";
+static method main() → dynamic {
+  core::int* x = 1;
+  core::String* a = "aaa";
+  core::String* b = "b ${x} bb";
+  core::String* c = "c ${x} ccccc";
+}
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.weak.modular.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..d1ef879
--- /dev/null
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::List<core::num*>* x = <core::num*>[0];
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<core::num*>* y = <core::num*>[0];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_index_set.dart.weak.modular.expect
new file mode 100644
index 0000000..8b870ab
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator []=(core::int* x, core::String* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  operator []=(core::Object* x, core::Object* y) → void {}
+  method h() → void {
+    super.{self::B::[]=}(self::f<core::int*>(), self::f<core::String*>());
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.weak.modular.expect
new file mode 100644
index 0000000..e59a920
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  operator []=(covariant-by-class core::Map<core::int*, self::B::T*>* x, covariant-by-class core::List<self::B::T*>* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
+    : super self::B::•()
+    ;
+  operator []=(covariant-by-class core::Object* x, covariant-by-class core::Object* y) → void {}
+  method h() → void {
+    super.{self::B::[]=}(self::f<core::Map<core::int*, asy::Future<self::C::U*>*>*>(), self::f<core::List<asy::Future<self::C::U*>*>*>());
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..8e244eb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends self::B {
+  constructor •() → self::C*
+    : super self::B::•(self::f<core::int*>())
+    ;
+}
+class B extends core::Object {
+  constructor •(core::int* x) → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.weak.modular.expect
new file mode 100644
index 0000000..1d91491
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* t) → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<U extends core::Object* = dynamic> extends self::B<core::List<self::C::U*>*> {
+  constructor •() → self::C<self::C::U*>*
+    : super self::B::•(self::f<core::List<self::C::U*>*>())
+    ;
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..f51320a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method g() → void {
+    core::int* x = super.{self::C::f}();
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.weak.modular.expect
new file mode 100644
index 0000000..940c20e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<T extends core::Object* = dynamic> extends self::D<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super self::D::•()
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method g(covariant-by-class self::E<self::B::T*>* x) → self::D<self::B::T*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
+    : super self::B::•()
+    ;
+  method g(covariant-by-class core::Object* x) → self::E<asy::Future<self::C::U*>*>*
+    return null;
+  method h() → void {
+    self::D<asy::Future<self::C::U*>*>* x = super.{self::B::g}(self::f<self::E<asy::Future<self::C::U*>*>*>());
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_property_get.dart.weak.modular.expect
new file mode 100644
index 0000000..c9a8df8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* x = 0;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method g() → void {
+    core::int* y = super.{self::C::x};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.weak.modular.expect
new file mode 100644
index 0000000..23c68ac
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field () →* core::int* f = () → core::int* => 0;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method g() → void {
+    core::int* y = super.{self::C::f}(){() →* core::int*};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.weak.modular.expect
new file mode 100644
index 0000000..f32675f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class CallableClass extends core::Object {
+  synthetic constructor •() → self::CallableClass*
+    : super core::Object::•()
+    ;
+  method call() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::CallableClass* f = new self::CallableClass::•();
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method g() → void {
+    core::int* y = super.{self::C::f}.{self::CallableClass::call}(){() →* core::int*};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.weak.modular.expect
new file mode 100644
index 0000000..752cdaf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<T extends core::Object* = dynamic> extends self::D<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super self::D::•()
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
+    : super self::B::•()
+    ;
+  get x() → self::E<asy::Future<self::C::U*>*>*
+    return null;
+  set x(covariant-by-class core::Object* x) → void {}
+  method g() → void {
+    self::D<asy::Future<self::C::U*>*>* y = super.{self::B::x};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.weak.modular.expect
new file mode 100644
index 0000000..5f7255e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method g() → void {
+    () →* core::int* y = super.{self::C::f};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.weak.modular.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.weak.modular.expect
new file mode 100644
index 0000000..2b490e3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<T extends core::Object* = dynamic> extends self::D<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super self::D::•()
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
+    : super self::B::•()
+    ;
+  get x() → self::E<asy::Future<self::C::U*>*>*
+    return null;
+  set x(covariant-by-class core::Object* x) → void {}
+  method g() → void {
+    super.{self::B::x} = self::f<self::D<asy::Future<self::C::U*>*>*>();
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/switch_continue.dart.weak.modular.expect b/pkg/front_end/testcases/inference/switch_continue.dart.weak.modular.expect
new file mode 100644
index 0000000..64406d0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/switch_continue.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::int* x, () →* void f) → void {
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        f(){() →* void};
+        continue #L3;
+      }
+    #L3:
+    case #C2:
+      {
+        f(){() →* void};
+        break #L1;
+      }
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/inference/symbol_literal.dart.weak.modular.expect b/pkg/front_end/testcases/inference/symbol_literal.dart.weak.modular.expect
new file mode 100644
index 0000000..1a4d6a8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/symbol_literal.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::Symbol* x = #C1;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+}
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.weak.modular.expect b/pkg/front_end/testcases/inference/this_reference.dart.weak.modular.expect
new file mode 100644
index 0000000..06fb537
--- /dev/null
+++ b/pkg/front_end/testcases/inference/this_reference.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f() → void {
+    self::C<self::C::T*>* x = this;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.weak.modular.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.weak.modular.expect
new file mode 100644
index 0000000..3ca6230
--- /dev/null
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'Future<dynamic Function(dynamic)>' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+//  - 'Future' is from 'dart:async'.
+//   return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+//                                    ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+typedef IntToInt = (core::int*) →* core::int*;
+static method a() → (core::int*) →* core::int* {
+  return (core::int* x) → core::int* => x;
+}
+static method b() → asy::Future<(core::int*) →* core::int*>* async {
+  return invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'Future<dynamic Function(dynamic)>' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+ - 'Future' is from 'dart:async'.
+  return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+                                   ^" in ((dynamic x) → dynamic => x) as{TypeError} FutureOr<(core::int*) →* core::int*>*;
+}
+static method c() → core::Iterable<(core::int*) →* core::int*>* sync* {
+  yield(core::int* x) → core::int* => x;
+}
+static method d() → core::Iterable<(core::int*) →* core::int*>* sync* {
+  yield*<(core::int*) →* core::int*>[(core::int* x) → core::int* => x];
+}
+static method e() → asy::Stream<(core::int*) →* core::int*>* async* {
+  yield(core::int* x) → core::int* => x;
+}
+static method f() → asy::Stream<(core::int*) →* core::int*>* async* {
+  yield* asy::Stream::fromIterable<(core::int*) →* core::int*>(<(core::int*) →* core::int*>[(core::int* x) → core::int* => x]);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.weak.modular.expect b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.weak.modular.expect
new file mode 100644
index 0000000..9ab8405
--- /dev/null
+++ b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* i = 0;
+static method main() → dynamic {
+  core::int* j = self::i;
+}
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.weak.modular.expect b/pkg/front_end/testcases/inference/try_catch.dart.weak.modular.expect
new file mode 100644
index 0000000..086e91e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/try_catch.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(() →* void f) → void {
+  try {
+    core::int* x = 0;
+    f(){() →* void};
+  }
+  on self::C* catch(no-exception-var) {
+    core::int* x = 0;
+  }
+  on self::D* catch(final self::D* x) {
+    self::D* x2 = x;
+  }
+  on self::E* catch(final self::E* x, final core::StackTrace* y) {
+    self::E* x2 = x;
+    core::StackTrace* y2 = y;
+  }
+  on dynamic catch(final dynamic x, final core::StackTrace* y) {
+    dynamic x2 = x;
+    core::StackTrace* y2 = y;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.weak.modular.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.weak.modular.expect
new file mode 100644
index 0000000..62db44d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(() →* void f) → void {
+  try
+    try {
+      core::int* x = 0;
+      f(){() →* void};
+    }
+    on self::C* catch(no-exception-var) {
+      core::int* x = 0;
+    }
+    on self::D* catch(final self::D* x) {
+      self::D* x2 = x;
+    }
+    on self::E* catch(final self::E* x, final core::StackTrace* y) {
+      self::E* x2 = x;
+      core::StackTrace* y2 = y;
+    }
+    on dynamic catch(final dynamic x, final core::StackTrace* y) {
+      dynamic x2 = x;
+      core::StackTrace* y2 = y;
+    }
+  finally {
+    core::int* x = 0;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.weak.modular.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.weak.modular.expect
new file mode 100644
index 0000000..0f37b73
--- /dev/null
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class E extends core::StackTrace {
+  synthetic constructor •() → self::E*
+    : super core::StackTrace::•()
+    ;
+  abstract member-signature method toString() → core::String*; -> core::StackTrace::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(() →* void f) → void {
+  try {
+    f(){() →* void};
+  }
+  on self::C* catch(final self::C* x, final core::StackTrace* y) {
+    self::C* x1 = x;
+    core::StackTrace* y1 = y;
+    if(x is self::D*) {
+      self::D* x2 = x{self::D*};
+    }
+    if(y is self::E*) {
+      self::E* y2 = y{self::E*};
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_finally.dart.weak.modular.expect b/pkg/front_end/testcases/inference/try_finally.dart.weak.modular.expect
new file mode 100644
index 0000000..f52f88a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/try_finally.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(() →* void f) → void {
+  try {
+    core::int* x = 0;
+    f(){() →* void};
+  }
+  finally {
+    core::int* x = 0;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.weak.modular.expect b/pkg/front_end/testcases/inference/type_cast.dart.weak.modular.expect
new file mode 100644
index 0000000..4d12ac0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_cast.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super self::A::•()
+    ;
+  method foo() → dynamic {}
+}
+static field self::A<core::num*>* a = new self::B::•<core::int*>();
+static field self::B<core::int*>* b = self::a as self::B<core::int*>*;
+static method main() → dynamic {
+  self::A<core::num*>* a = new self::B::•<core::int*>();
+  self::B<core::int*>* b = a as self::B<core::int*>*;
+}
diff --git a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.weak.modular.expect b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.weak.modular.expect
new file mode 100644
index 0000000..6269884
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef FunctionReturningInt = () →* core::int*;
+static method main() → dynamic {
+  function f() → core::num*
+    return 0;
+  if(f is () →* core::int*) {
+    f;
+  }
+}
diff --git a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.weak.modular.expect b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.weak.modular.expect
new file mode 100644
index 0000000..ca793f8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::Object* x) → void {
+  if(!(x is core::int*) && !(x is core::String*)) {
+    core::print(x);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.weak.modular.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.weak.modular.expect
new file mode 100644
index 0000000..4e2acb6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::num* n = null;
+  if(n is core::int*) {
+    core::int* i = n{core::int*};
+  }
+}
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.weak.modular.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.weak.modular.expect
new file mode 100644
index 0000000..db5f0ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::num* n = null;
+  if(n is core::int*) {
+    core::num* i = n;
+    () → Null {
+      n;
+    };
+  }
+  n = null;
+}
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.weak.modular.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.weak.modular.expect
new file mode 100644
index 0000000..ca4ba99
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::num* n = null;
+  if(n is core::int*) {
+    core::num* i = n;
+    n = null;
+  }
+}
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.weak.modular.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.weak.modular.expect
new file mode 100644
index 0000000..d377034
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::num* n = null;
+  if(n is core::int*) {
+    core::num* i = n;
+  }
+  () → Null {
+    n = null;
+  };
+}
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.weak.modular.expect
new file mode 100644
index 0000000..e3758d3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
+//     var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
+//                                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method test() → void {
+    dynamic v5 = let final core::int* #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = invalid-expression "pkg/front_end/testcases/inference/unresolved_super.dart:16:37: Error: Superclass has no method named '[]='.
+    var /*@type=dynamic*/ v5 = super[0] = /*@typeArgs=dynamic*/ f();
+                                    ^" in #t2;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.weak.modular.expect
new file mode 100644
index 0000000..4c0ed46
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::double* v = ((dynamic x) → core::double* => 1.0)(() → core::int* {
+    return 1;
+  }){(dynamic) →* core::double*};
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.weak.modular.expect
new file mode 100644
index 0000000..e65f4933
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C<dynamic>* v = new self::C::•<dynamic>(() → core::int* {
+  return 1;
+});
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..156c565
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C<core::int*>* v = new self::C::•<core::int*>(() → core::int* {
+  return 1;
+});
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..0e7282f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* v = new self::C::•<core::int*>(() → core::int* {
+    return 1;
+  });
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..939c023
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •(() →* dynamic x) → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* v = new self::C::•(() → core::int* {
+  return 1;
+});
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.weak.modular.expect
new file mode 100644
index 0000000..2ac59fb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<dynamic>* v = self::f<dynamic>(() → core::int* {
+  return 1;
+});
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.modular.expect
new file mode 100644
index 0000000..14f27fa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// var v = (f<dynamic>)/*@typeArgs=int**/(/*@returnType=int**/() {
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* v = #C1<core::int*>(() → core::int* {
+  return 1;
+}){(() →* core::int*) →* core::List<core::int*>*};
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.weak.modular.expect
new file mode 100644
index 0000000..cf406c1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<dynamic>* v = #C1<dynamic>(() → core::int* {
+  return 1;
+}){(() →* dynamic) →* core::List<dynamic>*};
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..06e337e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* v = self::f<core::int*>(() → core::int* {
+  return 1;
+});
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.modular.expect
new file mode 100644
index 0000000..1d604ce
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// var v = (f<int>)/*@typeArgs=int**/(/*@returnType=int**/() {
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* v = #C1<core::int*>(() → core::int* {
+  return 1;
+}){(() →* core::int*) →* core::List<core::int*>*};
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.weak.modular.expect
new file mode 100644
index 0000000..26fdda1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* v = #C1<core::int*>(() → core::int* {
+  return 1;
+}){(() →* core::int*) →* core::List<core::int*>*};
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..720cf75
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<core::int*>* v = self::f<core::int*>(() → core::int* {
+    return 1;
+  });
+}
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.weak.modular.expect
new file mode 100644
index 0000000..7def91f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<core::int*>* v = #C1<core::int*>(() → core::int* {
+    return 1;
+  }){(() →* core::int*) →* core::List<core::int*>*};
+}
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..715a3f3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::double* v = self::f(() → core::int* {
+    return 1;
+  });
+}
+static method f(dynamic x) → core::double*
+  return 1.0;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.weak.modular.expect
new file mode 100644
index 0000000..d720962
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::double* v = #C1(() → core::int* {
+    return 1;
+  }){(dynamic) →* core::double*};
+}
+static method f(dynamic x) → core::double*
+  return 1.0;
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.weak.modular.expect
new file mode 100644
index 0000000..bc2b33d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<dynamic>* v = <dynamic>[() → core::int* {
+    return 1;
+  }];
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.weak.modular.expect
new file mode 100644
index 0000000..b747c51
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* core::int*;
+static method main() → dynamic {
+  core::List<() →* core::int*>* v = <() →* core::int*>[() → core::int* {
+    return 1;
+  }];
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.weak.modular.expect
new file mode 100644
index 0000000..5b2da50
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<() →* core::int*>* v = <() →* core::int*>[() → core::int* {
+    return 1;
+  }];
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.weak.modular.expect
new file mode 100644
index 0000000..07d95de
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Map<core::int*, dynamic>* v = <core::int*, dynamic>{1: () → core::int* {
+    return 1;
+  }};
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.weak.modular.expect
new file mode 100644
index 0000000..7e2da76
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* core::int*;
+static method main() → dynamic {
+  core::Map<core::int*, () →* core::int*>* v = <core::int*, () →* core::int*>{1: () → core::int* {
+    return 1;
+  }};
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.weak.modular.expect
new file mode 100644
index 0000000..f2aa7b1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Map<core::int*, () →* core::int*>* v = <core::int*, () →* core::int*>{1: () → core::int* {
+    return 1;
+  }};
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.weak.modular.expect
new file mode 100644
index 0000000..7011442a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g(){() →* self::C::f::T*}];
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::List<dynamic>* v = new self::C::•().{self::C::f}<dynamic>(() → core::int* {
+    return 1;
+  }){(() →* dynamic) →* core::List<dynamic>*};
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..3df5bcf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g(){() →* self::C::f::T*}];
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::List<core::int*>* v = new self::C::•().{self::C::f}<core::int*>(() → core::int* {
+    return 1;
+  }){(() →* core::int*) →* core::List<core::int*>*};
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..3df5bcf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g(){() →* self::C::f::T*}];
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::List<core::int*>* v = new self::C::•().{self::C::f}<core::int*>(() → core::int* {
+    return 1;
+  }){(() →* core::int*) →* core::List<core::int*>*};
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.weak.modular.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.weak.modular.expect
new file mode 100644
index 0000000..f00aa66
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f(dynamic x) → core::double*
+    return 1.0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::double* v = new self::C::•().{self::C::f}(() → core::int* {
+  return 1;
+}){(dynamic) →* core::double*};
+static method main() → dynamic {
+  self::v;
+}
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.weak.modular.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.weak.modular.expect
new file mode 100644
index 0000000..751e547
--- /dev/null
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic x = self::run<dynamic>(#C1);
+static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T* {
+  core::print("running");
+  self::run::T* t = f(){() →* self::run::T*};
+  core::print("done running");
+  return t;
+}
+static method printRunning() → void {
+  core::print("running");
+}
+static method main() → dynamic {
+  function printRunning() → void {
+    core::print("running");
+  }
+  dynamic x = self::run<dynamic>(printRunning);
+  void y = self::run<void>(printRunning);
+  x = 123;
+  x = "hi";
+  y = 123;
+  y = "hi";
+}
+
+constants  {
+  #C1 = static-tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..388292d
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant U extends core::Object* = dynamic, V extends core::Object* = dynamic> = (U*) →* V*;
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+  get v1() → self::Bar<self::Foo::T*>*
+    return #C1;
+  get v2() → self::Bar<core::List<self::Foo::T*>*>*
+    return #C2;
+  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
+    return #C3;
+  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
+    return #C4;
+  get v5() → core::List<self::Foo::T*>*
+    return #C5;
+  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
+    return #C6;
+  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
+    return #C7;
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
+    return #C8;
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
+    return #C9;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::Bar<self::Bar::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Bar<Null> {}
+  #C2 = self::Bar<core::List<Null>*> {}
+  #C3 = self::Bar<(core::Object*) →* Null> {}
+  #C4 = self::Bar<((Null) →* core::Object*) →* Null> {}
+  #C5 = <Null>[]
+  #C6 = <(core::Object*) →* Null>[]
+  #C7 = <Null, Null>{)
+  #C8 = <(core::Object*) →* Null, Null>{)
+  #C9 = <Null, (core::Object*) →* Null>{)
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_invocation.dart:
+- Bar. (from org-dartlang-testcase:///const_invocation.dart:24:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.weak.modular.expect
new file mode 100644
index 0000000..a062019
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:5: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var b = /*@ returnType=() ->* invalid-type */ () =>
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method f<T extends core::Object* = dynamic>(self::A::f::T* t) → self::A::f::T*
+    return t;
+  method g(dynamic i) → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* a = new self::A::•();
+static field invalid-type b = () → () →* invalid-type => self::a.{self::A::f}<() →* invalid-type>(self::c){(() →* invalid-type) →* () →* invalid-type};
+static field () →* invalid-type c = () → invalid-type => self::a.{self::A::f}<invalid-type>(self::b){(invalid-type) →* invalid-type};
+static field () →* () →* core::int* d = () → () →* core::int* => self::a.{self::A::f}<() →* core::int*>(self::e){(() →* core::int*) →* () →* core::int*};
+static field () →* core::int* e = () → core::int* => self::a.{self::A::g}(self::d){(dynamic) →* core::int*};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.weak.modular.expect
new file mode 100644
index 0000000..3ae5f85
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:5: Error: Can't infer the type of 'a': circularity found during type inference.
+// Specify the type explicitly.
+// var a = /*@ returnType=num* */ () => intValue /*@target=num.+*/ + b;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int* intValue = 0;
+static field core::num* numValue = 0;
+static field core::double* doubleValue = 0.0;
+static field invalid-type a = () → core::num* => self::intValue.{core::num::+}(self::b as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*};
+static field dynamic b = self::a{dynamic}.call();
+static field () →* core::num* c = () → core::num* => self::numValue.{core::num::+}(self::d){(core::num*) →* core::num*};
+static field core::num* d = self::c(){() →* core::num*};
+static field () →* core::double* e = () → core::double* => self::doubleValue.{core::double::+}(self::f){(core::num*) →* core::double*};
+static field core::double* f = self::e(){() →* core::double*};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.weak.modular.expect
new file mode 100644
index 0000000..2639877
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → void {
+  do {
+    core::int* x = 0;
+  }
+  while (self::f<core::bool*>())
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..f211b44
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::B<core::int*>*>* t3 = <self::B<core::int*>*>[new self::B::•<core::int*>(3)];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.weak.modular.expect
new file mode 100644
index 0000000..aaa7123
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::A<core::int*>*>* t2 = <self::A<core::int*>*>[new self::A::•<core::int*>(2)];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.weak.modular.expect
new file mode 100644
index 0000000..b83a5f8
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:7: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var x = /*@returnType=invalid-type*/ () => new B(). /*@target=B.x*/ x;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field invalid-type x = () → invalid-type => new self::B::•().{self::B::x}{invalid-type};
+  field () →* invalid-type y = () → invalid-type => new self::B::•().{self::B::x}{invalid-type};
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  field invalid-type x = null;
+  field () →* invalid-type y = null;
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.weak.modular.expect
new file mode 100644
index 0000000..0a972fb
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::A* aField = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set aSetter(self::A* value) → void {}
+  method test() → void {
+    self::A* aLocal;
+    for (final self::A* #t1 in self::f<core::Iterable<self::A*>*>()) {
+      aLocal = #t1;
+    }
+    for (final self::A* #t2 in self::f<core::Iterable<self::A*>*>()) {
+      this.{self::C::aField} = #t2;
+    }
+    for (final self::A* #t3 in self::f<core::Iterable<self::A*>*>()) {
+      this.{self::C::aSetter} = #t3;
+    }
+    for (final self::A* #t4 in self::f<core::Iterable<self::A*>*>()) {
+      self::aTopLevel = #t4;
+    }
+    for (final self::A* #t5 in self::f<core::Iterable<self::A*>*>()) {
+      self::aTopLevelSetter = #t5;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* aTopLevel;
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static set aTopLevelSetter(self::A* value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.weak.modular.expect
new file mode 100644
index 0000000..727e04a
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:17: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (int x in s) {}
+//                 ^
+//
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:23: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   await for (int x in s) {}
+//                       ^
+//
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:13: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (y in s) {}
+//             ^
+//
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:19: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
+//   await for (y in s) {}
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method test() → dynamic async {
+  core::String* s;
+  for (final dynamic #t1 in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:17: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in s) {}
+                ^" in s as{TypeError} core::Iterable<dynamic>*) {
+    core::int* x = #t1 as{TypeError,ForDynamic} core::int*;
+  }
+  await for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:23: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  await for (int x in s) {}
+                      ^" in s as{TypeError} asy::Stream<dynamic>*) {
+    core::int* x = #t2 as{TypeError,ForDynamic} core::int*;
+  }
+  core::int* y;
+  for (final dynamic #t3 in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:13: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
+  for (y in s) {}
+            ^" in s as{TypeError} core::Iterable<dynamic>*) {
+    y = #t3 as{TypeError,ForDynamic} core::int*;
+  }
+  await for (final dynamic #t4 in invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:19: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
+  await for (y in s) {}
+                  ^" in s as{TypeError} asy::Stream<dynamic>*) {
+    y = #t4 as{TypeError,ForDynamic} core::int*;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.weak.modular.expect
new file mode 100644
index 0000000..e195507
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:10: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
+// Try changing the type of the variable.
+//   for (i in iterable) {}
+//          ^
+//
+// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:16: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
+// Try changing the type of the variable.
+//   await for (i in stream) {}
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → dynamic async {
+  core::Iterable<self::A*>* iterable;
+  asy::Stream<self::A*>* stream;
+  self::A* a;
+  self::B* b;
+  core::int* i;
+  for (final self::A* #t1 in iterable) {
+    a = #t1;
+  }
+  await for (final self::A* #t2 in stream) {
+    a = #t2;
+  }
+  for (final self::A* #t3 in iterable) {
+    b = #t3 as{TypeError} self::B*;
+  }
+  await for (final self::A* #t4 in stream) {
+    b = #t4 as{TypeError} self::B*;
+  }
+  for (final self::A* #t5 in iterable) {
+    i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:10: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
+Try changing the type of the variable.
+  for (i in iterable) {}
+         ^" in #t5 as{TypeError} core::int*;
+  }
+  await for (final self::A* #t6 in stream) {
+    i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:16: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
+Try changing the type of the variable.
+  await for (i in stream) {}
+               ^" in #t6 as{TypeError} core::int*;
+  }
+  for (final self::A* #t7 in self::f<core::Iterable<self::A*>*>()) {
+    a = #t7;
+  }
+  await for (final self::A* #t8 in self::f<asy::Stream<self::A*>*>()) {
+    a = #t8;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.weak.modular.expect
new file mode 100644
index 0000000..cf8fb9e
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.weak.modular.expect
@@ -0,0 +1,125 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(core::int* value) → self::C*
+    return null;
+  operator *(self::D* value) → self::C*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(core::int* value) → self::E*
+    return null;
+  operator *(self::F* value) → self::E*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F extends core::Object {
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G extends core::Object {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  operator [](core::int* i) → self::A*
+    return null;
+  operator []=(core::int* i, self::B* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test1(self::G* g) → void {
+  let final self::G* #t1 = g in let final core::int* #t2 = 0 in #t1.{self::G::[]=}(#t2, #t1.{self::G::[]}(#t2){(core::int*) →* self::A*}.{self::A::*}(self::f<self::D*>()){(self::D*) →* self::C*}){(core::int*, self::B*) →* void};
+  self::C* x = let final self::G* #t3 = g in let final core::int* #t4 = 0 in let final self::C* #t5 = #t3.{self::G::[]}(#t4){(core::int*) →* self::A*}.{self::A::*}(self::f<self::D*>()){(self::D*) →* self::C*} in let final void #t6 = #t3.{self::G::[]=}(#t4, #t5){(core::int*, self::B*) →* void} in #t5;
+}
+static method test2(self::G* g) → void {
+  let final self::G* #t7 = g in let final core::int* #t8 = 0 in let final self::C* #t9 = #t7.{self::G::[]}(#t8){(core::int*) →* self::A*}.{self::A::+}(1){(core::int*) →* self::C*} in let final void #t10 = #t7.{self::G::[]=}(#t8, #t9){(core::int*, self::B*) →* void} in #t9;
+  self::C* x = let final self::G* #t11 = g in let final core::int* #t12 = 0 in let final self::C* #t13 = #t11.{self::G::[]}(#t12){(core::int*) →* self::A*}.{self::A::+}(1){(core::int*) →* self::C*} in let final void #t14 = #t11.{self::G::[]=}(#t12, #t13){(core::int*, self::B*) →* void} in #t13;
+}
+static method test3(self::G* g) → void {
+  let final self::G* #t15 = g in let final core::int* #t16 = 0 in #t15.{self::G::[]=}(#t16, #t15.{self::G::[]}(#t16){(core::int*) →* self::A*}.{self::A::+}(1){(core::int*) →* self::C*}){(core::int*, self::B*) →* void};
+  self::A* x = let final self::G* #t17 = g in let final core::int* #t18 = 0 in let final self::A* #t19 = #t17.{self::G::[]}(#t18){(core::int*) →* self::A*} in let final void #t20 = #t17.{self::G::[]=}(#t18, #t19.{self::A::+}(1){(core::int*) →* self::C*}){(core::int*, self::B*) →* void} in #t19;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.weak.modular.expect
new file mode 100644
index 0000000..43a39ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  method test() → void {
+    this.{self::Test::member} = self::f<self::B*>();
+    this.{self::Test::member}{self::B*} == null ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : null;
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v1 = this.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::B* #t1 = this.{self::Test::member}{self::B*} in #t1 == null ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : #t1;
+    self::A* v3 = this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    self::B* v4 = this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    self::C* v5 = this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    self::B* v6 = this.{self::Test::member} = this.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v7 = let final self::B* #t2 = this.{self::Test::member}{self::B*} in let final self::B* #t3 = this.{self::Test::member} = #t2.{self::B::-}(1){(core::int*) →* self::B*} in #t2;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..c9e63c0
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Test1 extends core::Object {
+  field core::int* t = null;
+  synthetic constructor •() → self::Test1*
+    : super core::Object::•()
+    ;
+  method test() → void {
+    core::int* v1 = this.{self::Test1::t} = self::getInt();
+    core::num* v2 = this.{self::Test1::t} = self::getNum() as{TypeError} core::int*;
+    core::int* v4 = let final core::int* #t1 = this.{self::Test1::t}{core::int*} in #t1 == null ?{core::int*} this.{self::Test1::t} = self::getInt() : #t1;
+    core::num* v5 = let final core::int* #t2 = this.{self::Test1::t}{core::int*} in #t2 == null ?{core::num*} this.{self::Test1::t} = self::getNum() as{TypeError} core::int* : #t2;
+    core::int* v7 = this.{self::Test1::t} = this.{self::Test1::t}{core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+    core::num* v8 = this.{self::Test1::t} = this.{self::Test1::t}{core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int*;
+    core::int* v10 = this.{self::Test1::t} = this.{self::Test1::t}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+    core::int* v11 = let final core::int* #t3 = this.{self::Test1::t}{core::int*} in let final core::int* #t4 = this.{self::Test1::t} = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test2 extends core::Object {
+  field core::num* t = null;
+  synthetic constructor •() → self::Test2*
+    : super core::Object::•()
+    ;
+  method test() → void {
+    core::int* v1 = this.{self::Test2::t} = self::getInt();
+    core::num* v2 = this.{self::Test2::t} = self::getNum();
+    core::double* v3 = this.{self::Test2::t} = self::getDouble();
+    core::num* v4 = let final core::num* #t5 = this.{self::Test2::t}{core::num*} in #t5 == null ?{core::num*} this.{self::Test2::t} = self::getInt() : #t5;
+    core::num* v5 = let final core::num* #t6 = this.{self::Test2::t}{core::num*} in #t6 == null ?{core::num*} this.{self::Test2::t} = self::getNum() : #t6;
+    core::num* v6 = let final core::num* #t7 = this.{self::Test2::t}{core::num*} in #t7 == null ?{core::num*} this.{self::Test2::t} = self::getDouble() : #t7;
+    core::num* v7 = this.{self::Test2::t} = this.{self::Test2::t}{core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+    core::num* v8 = this.{self::Test2::t} = this.{self::Test2::t}{core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+    core::num* v9 = this.{self::Test2::t} = this.{self::Test2::t}{core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+    core::num* v10 = this.{self::Test2::t} = this.{self::Test2::t}{core::num*}.{core::num::+}(1){(core::num*) →* core::num*};
+    core::num* v11 = let final core::num* #t8 = this.{self::Test2::t}{core::num*} in let final core::num* #t9 = this.{self::Test2::t} = #t8.{core::num::+}(1){(core::num*) →* core::num*} in #t8;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test3 extends core::Object {
+  field core::double* t = null;
+  synthetic constructor •() → self::Test3*
+    : super core::Object::•()
+    ;
+  method test3() → void {
+    core::num* v2 = this.{self::Test3::t} = self::getNum() as{TypeError} core::double*;
+    core::double* v3 = this.{self::Test3::t} = self::getDouble();
+    core::num* v5 = let final core::double* #t10 = this.{self::Test3::t}{core::double*} in #t10 == null ?{core::num*} this.{self::Test3::t} = self::getNum() as{TypeError} core::double* : #t10;
+    core::double* v6 = let final core::double* #t11 = this.{self::Test3::t}{core::double*} in #t11 == null ?{core::double*} this.{self::Test3::t} = self::getDouble() : #t11;
+    core::double* v7 = this.{self::Test3::t} = this.{self::Test3::t}{core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+    core::double* v8 = this.{self::Test3::t} = this.{self::Test3::t}{core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+    core::double* v9 = this.{self::Test3::t} = this.{self::Test3::t}{core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+    core::double* v10 = this.{self::Test3::t} = this.{self::Test3::t}{core::double*}.{core::double::+}(1){(core::num*) →* core::double*};
+    core::double* v11 = let final core::double* #t12 = this.{self::Test3::t}{core::double*} in let final core::double* #t13 = this.{self::Test3::t} = #t12.{core::double::+}(1){(core::num*) →* core::double*} in #t12;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.weak.modular.expect
new file mode 100644
index 0000000..f6ef830
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::double*>* a = <core::double*>[];
+static field core::double* b = let final core::List<core::double*>* #t1 = self::a in let final core::int* #t2 = 0 in let final core::double* #t3 = 1.0 in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3){(core::int*, core::double*) →* void} in #t3;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.weak.modular.expect
new file mode 100644
index 0000000..8b4ab90
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.weak.modular.expect
@@ -0,0 +1,92 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Index extends core::Object {
+  synthetic constructor •() → self::Index*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  operator [](self::Index* i) → self::B*
+    return null;
+  operator []=(self::Index* i, self::B* v) → void {}
+  method test() → void {
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<self::Index*>(), self::f<self::B*>()){(self::Index*, self::B*) →* void};
+    let final self::Test* #t1 = t in let final self::Index* #t2 = self::f<self::Index*>() in #t1.{self::Test::[]}(#t2){(self::Index*) →* self::B*} == null ?{self::B*} #t1.{self::Test::[]=}(#t2, self::f<self::B*>()){(self::Index*, self::B*) →* void} : null;
+    let final self::Test* #t3 = t in let final self::Index* #t4 = self::f<self::Index*>() in #t3.{self::Test::[]=}(#t4, #t3.{self::Test::[]}(#t4){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*){(self::Index*, self::B*) →* void};
+    let final self::Test* #t5 = t in let final self::Index* #t6 = self::f<self::Index*>() in #t5.{self::Test::[]=}(#t6, #t5.{self::Test::[]}(#t6){(self::Index*) →* self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*}){(self::Index*, self::B*) →* void};
+    let final self::Test* #t7 = t in let final self::Index* #t8 = self::f<self::Index*>() in #t7.{self::Test::[]=}(#t8, #t7.{self::Test::[]}(#t8){(self::Index*) →* self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*}){(self::Index*, self::B*) →* void};
+    t.{self::Test::[]}(self::f<self::Index*>()){(self::Index*) →* self::B*};
+    let final self::Test* #t9 = t in let final self::Index* #t10 = self::f<self::Index*>() in let final self::B* #t11 = #t9.{self::Test::[]}(#t10){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t12 = #t9.{self::Test::[]=}(#t10, #t11){(self::Index*, self::B*) →* void} in #t11;
+    let final self::Test* #t13 = t in let final self::Index* #t14 = self::f<self::Index*>() in #t13.{self::Test::[]=}(#t14, #t13.{self::Test::[]}(#t14){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*}){(self::Index*, self::B*) →* void};
+    self::B* v1 = let final self::Test* #t15 = t in let final self::Index* #t16 = self::f<self::Index*>() in let final self::B* #t17 = self::f<self::B*>() in let final void #t18 = #t15.{self::Test::[]=}(#t16, #t17){(self::Index*, self::B*) →* void} in #t17;
+    self::B* v2 = let final self::Test* #t19 = t in let final self::Index* #t20 = self::f<self::Index*>() in let final self::B* #t21 = #t19.{self::Test::[]}(#t20){(self::Index*) →* self::B*} in #t21 == null ?{self::B*} let final self::B* #t22 = self::f<self::B*>() in let final void #t23 = #t19.{self::Test::[]=}(#t20, #t22){(self::Index*, self::B*) →* void} in #t22 : #t21;
+    self::A* v3 = let final self::Test* #t24 = t in let final self::Index* #t25 = self::f<self::Index*>() in let final self::A* #t26 = #t24.{self::Test::[]}(#t25){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B* in let final void #t27 = #t24.{self::Test::[]=}(#t25, #t26){(self::Index*, self::B*) →* void} in #t26;
+    self::B* v4 = let final self::Test* #t28 = t in let final self::Index* #t29 = self::f<self::Index*>() in let final self::B* #t30 = #t28.{self::Test::[]}(#t29){(self::Index*) →* self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*} in let final void #t31 = #t28.{self::Test::[]=}(#t29, #t30){(self::Index*, self::B*) →* void} in #t30;
+    self::C* v5 = let final self::Test* #t32 = t in let final self::Index* #t33 = self::f<self::Index*>() in let final self::C* #t34 = #t32.{self::Test::[]}(#t33){(self::Index*) →* self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*} in let final void #t35 = #t32.{self::Test::[]=}(#t33, #t34){(self::Index*, self::B*) →* void} in #t34;
+    self::B* v6 = t.{self::Test::[]}(self::f<self::Index*>()){(self::Index*) →* self::B*};
+    self::B* v7 = let final self::Test* #t36 = t in let final self::Index* #t37 = self::f<self::Index*>() in let final self::B* #t38 = #t36.{self::Test::[]}(#t37){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t39 = #t36.{self::Test::[]=}(#t37, #t38){(self::Index*, self::B*) →* void} in #t38;
+    self::B* v8 = let final self::Test* #t40 = t in let final self::Index* #t41 = self::f<self::Index*>() in let final self::B* #t42 = #t40.{self::Test::[]}(#t41){(self::Index*) →* self::B*} in let final void #t43 = #t40.{self::Test::[]=}(#t41, #t42.{self::B::-}(1){(core::int*) →* self::B*}){(self::Index*, self::B*) →* void} in #t42;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.weak.modular.expect
new file mode 100644
index 0000000..685af9c
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.weak.modular.expect
@@ -0,0 +1,101 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Index extends core::Object {
+  synthetic constructor •() → self::Index*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(self::F* v) → self::C*
+    return null;
+  operator -(core::int* i) → self::C*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::E* v) → self::D*
+    return null;
+  operator -(core::int* i) → self::D*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+}
+class F extends self::E {
+  synthetic constructor •() → self::F*
+    : super self::E::•()
+    ;
+}
+class Test extends core::Object {
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  operator [](self::Index* i) → self::B*
+    return null;
+  operator []=(self::Index* i, self::A* v) → void {}
+  method test() → void {
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<self::Index*>(), self::f<self::A*>()){(self::Index*, self::A*) →* void};
+    let final self::Test* #t1 = t in let final self::Index* #t2 = self::f<self::Index*>() in #t1.{self::Test::[]}(#t2){(self::Index*) →* self::B*} == null ?{self::A*} #t1.{self::Test::[]=}(#t2, self::f<self::A*>()){(self::Index*, self::A*) →* void} : null;
+    let final self::Test* #t3 = t in let final self::Index* #t4 = self::f<self::Index*>() in #t3.{self::Test::[]=}(#t4, #t3.{self::Test::[]}(#t4){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::E*>()){(self::E*) →* self::D*}){(self::Index*, self::A*) →* void};
+    let final self::Test* #t5 = t in let final self::Index* #t6 = self::f<self::Index*>() in let final self::D* #t7 = #t5.{self::Test::[]}(#t6){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::D*} in let final void #t8 = #t5.{self::Test::[]=}(#t6, #t7){(self::Index*, self::A*) →* void} in #t7;
+    let final self::Test* #t9 = t in let final self::Index* #t10 = self::f<self::Index*>() in #t9.{self::Test::[]=}(#t10, #t9.{self::Test::[]}(#t10){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::D*}){(self::Index*, self::A*) →* void};
+    self::A* v1 = let final self::Test* #t11 = t in let final self::Index* #t12 = self::f<self::Index*>() in let final self::A* #t13 = self::f<self::A*>() in let final void #t14 = #t11.{self::Test::[]=}(#t12, #t13){(self::Index*, self::A*) →* void} in #t13;
+    self::A* v2 = let final self::Test* #t15 = t in let final self::Index* #t16 = self::f<self::Index*>() in let final self::B* #t17 = #t15.{self::Test::[]}(#t16){(self::Index*) →* self::B*} in #t17 == null ?{self::A*} let final self::A* #t18 = self::f<self::A*>() in let final void #t19 = #t15.{self::Test::[]=}(#t16, #t18){(self::Index*, self::A*) →* void} in #t18 : #t17;
+    self::D* v3 = let final self::Test* #t20 = t in let final self::Index* #t21 = self::f<self::Index*>() in let final self::D* #t22 = #t20.{self::Test::[]}(#t21){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::E*>()){(self::E*) →* self::D*} in let final void #t23 = #t20.{self::Test::[]=}(#t21, #t22){(self::Index*, self::A*) →* void} in #t22;
+    self::D* v4 = let final self::Test* #t24 = t in let final self::Index* #t25 = self::f<self::Index*>() in let final self::D* #t26 = #t24.{self::Test::[]}(#t25){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::D*} in let final void #t27 = #t24.{self::Test::[]=}(#t25, #t26){(self::Index*, self::A*) →* void} in #t26;
+    self::B* v5 = let final self::Test* #t28 = t in let final self::Index* #t29 = self::f<self::Index*>() in let final self::B* #t30 = #t28.{self::Test::[]}(#t29){(self::Index*) →* self::B*} in let final void #t31 = #t28.{self::Test::[]=}(#t29, #t30.{self::B::-}(1){(core::int*) →* self::D*}){(self::Index*, self::A*) →* void} in #t30;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.weak.modular.expect
new file mode 100644
index 0000000..3a7a814
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.weak.modular.expect
@@ -0,0 +1,94 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Index extends core::Object {
+  synthetic constructor •() → self::Index*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  operator [](self::Index* i) → self::B*
+    return null;
+  operator []=(self::Index* i, self::B* v) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test extends self::Base {
+  synthetic constructor •() → self::Test*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    super.{self::Base::[]=}(self::f<self::Index*>(), self::f<self::B*>());
+    let final self::Index* #t1 = self::f<self::Index*>() in super.{self::Base::[]}(#t1) == null ?{self::B*} super.{self::Base::[]=}(#t1, self::f<self::B*>()) : null;
+    let final self::Index* #t2 = self::f<self::Index*>() in super.{self::Base::[]=}(#t2, super.{self::Base::[]}(#t2).{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*);
+    let final self::Index* #t3 = self::f<self::Index*>() in super.{self::Base::[]=}(#t3, super.{self::Base::[]}(#t3).{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*});
+    let final self::Index* #t4 = self::f<self::Index*>() in super.{self::Base::[]=}(#t4, super.{self::Base::[]}(#t4).{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*});
+    let final self::Index* #t5 = self::f<self::Index*>() in let final self::B* #t6 = super.{self::Base::[]}(#t5).{self::B::-}(1){(core::int*) →* self::B*} in let final void #t7 = super.{self::Base::[]=}(#t5, #t6) in #t6;
+    let final self::Index* #t8 = self::f<self::Index*>() in super.{self::Base::[]=}(#t8, super.{self::Base::[]}(#t8).{self::B::-}(1){(core::int*) →* self::B*});
+    self::B* v1 = let final self::Index* #t9 = self::f<self::Index*>() in let final self::B* #t10 = self::f<self::B*>() in let final void #t11 = super.{self::Base::[]=}(#t9, #t10) in #t10;
+    self::B* v2 = let final self::Index* #t12 = self::f<self::Index*>() in let final self::B* #t13 = super.{self::Base::[]}(#t12) in #t13 == null ?{self::B*} let final self::B* #t14 = self::f<self::B*>() in let final void #t15 = super.{self::Base::[]=}(#t12, #t14) in #t14 : #t13;
+    self::A* v3 = let final self::Index* #t16 = self::f<self::Index*>() in let final self::A* #t17 = super.{self::Base::[]}(#t16).{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B* in let final void #t18 = super.{self::Base::[]=}(#t16, #t17) in #t17;
+    self::B* v4 = let final self::Index* #t19 = self::f<self::Index*>() in let final self::B* #t20 = super.{self::Base::[]}(#t19).{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*} in let final void #t21 = super.{self::Base::[]=}(#t19, #t20) in #t20;
+    self::C* v5 = let final self::Index* #t22 = self::f<self::Index*>() in let final self::C* #t23 = super.{self::Base::[]}(#t22).{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*} in let final void #t24 = super.{self::Base::[]=}(#t22, #t23) in #t23;
+    self::B* v6 = let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = super.{self::Base::[]}(#t25).{self::B::-}(1){(core::int*) →* self::B*} in let final void #t27 = super.{self::Base::[]=}(#t25, #t26) in #t26;
+    self::B* v7 = let final self::Index* #t28 = self::f<self::Index*>() in let final self::B* #t29 = super.{self::Base::[]}(#t28) in let final void #t30 = super.{self::Base::[]=}(#t28, #t29.{self::B::-}(1){(core::int*) →* self::B*}) in #t29;
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..92e9469
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.weak.modular.expect
@@ -0,0 +1,224 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:106:31: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//             /*@target=num.+*/ += getInt();
+//                               ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:116:50: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//     var /*@ type=int* */ v10 = /*@target=num.+*/ ++super
+//                                                  ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:120:33: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//         ['x'] /*@target=num.+*/ ++;
+//                                 ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:244:34: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//             /*@target=double.+*/ += getInt();
+//                                  ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:248:34: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//             /*@target=double.+*/ += getNum();
+//                                  ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:250:56: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//     var /*@ type=double* */ v10 = /*@target=double.+*/ ++super
+//                                                        ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:254:36: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//         ['x'] /*@target=double.+*/ ++;
+//                                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Base<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Base<self::Base::T*, self::Base::U*>*
+    : super core::Object::•()
+    ;
+  operator [](core::String* s) → self::Base::T*
+    return this.{self::Base::getValue}(s){(core::String*) →* self::Base::T*};
+  operator []=(core::String* s, covariant-by-class self::Base::U* v) → void
+    return this.{self::Base::setValue}(s, v){(core::String*, self::Base::U*) →* void};
+  abstract method getValue(core::String* s) → self::Base::T*;
+  abstract method setValue(core::String* s, covariant-by-class self::Base::U* v) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test1 extends self::Base<core::int*, core::int*> {
+  synthetic constructor •() → self::Test1*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = let final core::String* #t1 = "x" in let final core::int* #t2 = self::getInt() in let final void #t3 = super.{self::Base::[]=}(#t1, #t2) in #t2;
+    core::num* v2 = let final core::String* #t4 = "x" in let final core::num* #t5 = self::getNum() as{TypeError} core::int* in let final void #t6 = super.{self::Base::[]=}(#t4, #t5) in #t5;
+    core::int* v4 = let final core::String* #t7 = "x" in let final core::int* #t8 = super.{self::Base::[]}(#t7) in #t8 == null ?{core::int*} let final core::int* #t9 = self::getInt() in let final void #t10 = super.{self::Base::[]=}(#t7, #t9) in #t9 : #t8;
+    core::num* v5 = let final core::String* #t11 = "x" in let final core::int* #t12 = super.{self::Base::[]}(#t11) in #t12 == null ?{core::num*} let final core::num* #t13 = self::getNum() as{TypeError} core::int* in let final void #t14 = super.{self::Base::[]=}(#t11, #t13) in #t13 : #t12;
+    core::int* v7 = let final core::String* #t15 = "x" in let final core::int* #t16 = super.{self::Base::[]}(#t15).{core::num::+}(self::getInt()){(core::num*) →* core::int*} in let final void #t17 = super.{self::Base::[]=}(#t15, #t16) in #t16;
+    core::num* v8 = let final core::String* #t18 = "x" in let final core::num* #t19 = super.{self::Base::[]}(#t18).{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t20 = super.{self::Base::[]=}(#t18, #t19) in #t19;
+    core::int* v10 = let final core::String* #t21 = "x" in let final core::int* #t22 = super.{self::Base::[]}(#t21).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t23 = super.{self::Base::[]=}(#t21, #t22) in #t22;
+    core::int* v11 = let final core::String* #t24 = "x" in let final core::int* #t25 = super.{self::Base::[]}(#t24) in let final void #t26 = super.{self::Base::[]=}(#t24, #t25.{core::num::+}(1){(core::num*) →* core::int*}) in #t25;
+  }
+}
+abstract class Test2 extends self::Base<core::int*, core::num*> {
+  synthetic constructor •() → self::Test2*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = let final core::String* #t27 = "x" in let final core::int* #t28 = self::getInt() in let final void #t29 = super.{self::Base::[]=}(#t27, #t28) in #t28;
+    core::num* v2 = let final core::String* #t30 = "x" in let final core::num* #t31 = self::getNum() in let final void #t32 = super.{self::Base::[]=}(#t30, #t31) in #t31;
+    core::double* v3 = let final core::String* #t33 = "x" in let final core::double* #t34 = self::getDouble() in let final void #t35 = super.{self::Base::[]=}(#t33, #t34) in #t34;
+    core::int* v4 = let final core::String* #t36 = "x" in let final core::int* #t37 = super.{self::Base::[]}(#t36) in #t37 == null ?{core::int*} let final core::int* #t38 = self::getInt() in let final void #t39 = super.{self::Base::[]=}(#t36, #t38) in #t38 : #t37;
+    core::num* v5 = let final core::String* #t40 = "x" in let final core::int* #t41 = super.{self::Base::[]}(#t40) in #t41 == null ?{core::num*} let final core::num* #t42 = self::getNum() in let final void #t43 = super.{self::Base::[]=}(#t40, #t42) in #t42 : #t41;
+    core::num* v6 = let final core::String* #t44 = "x" in let final core::int* #t45 = super.{self::Base::[]}(#t44) in #t45 == null ?{core::num*} let final core::double* #t46 = self::getDouble() in let final void #t47 = super.{self::Base::[]=}(#t44, #t46) in #t46 : #t45;
+    core::int* v7 = let final core::String* #t48 = "x" in let final core::int* #t49 = super.{self::Base::[]}(#t48).{core::num::+}(self::getInt()){(core::num*) →* core::int*} in let final void #t50 = super.{self::Base::[]=}(#t48, #t49) in #t49;
+    core::num* v8 = let final core::String* #t51 = "x" in let final core::num* #t52 = super.{self::Base::[]}(#t51).{core::num::+}(self::getNum()){(core::num*) →* core::num*} in let final void #t53 = super.{self::Base::[]=}(#t51, #t52) in #t52;
+    core::double* v9 = let final core::String* #t54 = "x" in let final core::double* #t55 = super.{self::Base::[]}(#t54).{core::num::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t56 = super.{self::Base::[]=}(#t54, #t55) in #t55;
+    core::int* v10 = let final core::String* #t57 = "x" in let final core::int* #t58 = super.{self::Base::[]}(#t57).{core::num::+}(1){(core::num*) →* core::int*} in let final void #t59 = super.{self::Base::[]=}(#t57, #t58) in #t58;
+    core::int* v11 = let final core::String* #t60 = "x" in let final core::int* #t61 = super.{self::Base::[]}(#t60) in let final void #t62 = super.{self::Base::[]=}(#t60, #t61.{core::num::+}(1){(core::num*) →* core::int*}) in #t61;
+  }
+}
+abstract class Test3 extends self::Base<core::int*, core::double*> {
+  synthetic constructor •() → self::Test3*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::num* v2 = let final core::String* #t63 = "x" in let final core::num* #t64 = self::getNum() as{TypeError} core::double* in let final void #t65 = super.{self::Base::[]=}(#t63, #t64) in #t64;
+    core::double* v3 = let final core::String* #t66 = "x" in let final core::double* #t67 = self::getDouble() in let final void #t68 = super.{self::Base::[]=}(#t66, #t67) in #t67;
+    core::num* v5 = let final core::String* #t69 = "x" in let final core::int* #t70 = super.{self::Base::[]}(#t69) in #t70 == null ?{core::num*} let final core::num* #t71 = self::getNum() as{TypeError} core::double* in let final void #t72 = super.{self::Base::[]=}(#t69, #t71) in #t71 : #t70;
+    core::num* v6 = let final core::String* #t73 = "x" in let final core::int* #t74 = super.{self::Base::[]}(#t73) in #t74 == null ?{core::num*} let final core::double* #t75 = self::getDouble() in let final void #t76 = super.{self::Base::[]=}(#t73, #t75) in #t75 : #t74;
+    core::int* v7 = let final core::String* #t77 = "x" in let final core::int* #t78 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:106:31: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+            /*@target=num.+*/ += getInt();
+                              ^" in super.{self::Base::[]}(#t77).{core::num::+}(self::getInt()){(core::num*) →* core::int*} as{TypeError} core::double* in let final void #t79 = super.{self::Base::[]=}(#t77, #t78) in #t78;
+    core::num* v8 = let final core::String* #t80 = "x" in let final core::num* #t81 = super.{self::Base::[]}(#t80).{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t82 = super.{self::Base::[]=}(#t80, #t81) in #t81;
+    core::double* v9 = let final core::String* #t83 = "x" in let final core::double* #t84 = super.{self::Base::[]}(#t83).{core::num::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t85 = super.{self::Base::[]=}(#t83, #t84) in #t84;
+    core::int* v10 = let final core::String* #t86 = "x" in let final core::int* #t87 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:116:50: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    var /*@ type=int* */ v10 = /*@target=num.+*/ ++super
+                                                 ^" in super.{self::Base::[]}(#t86).{core::num::+}(1){(core::num*) →* core::int*} as{TypeError} core::double* in let final void #t88 = super.{self::Base::[]=}(#t86, #t87) in #t87;
+    core::int* v11 = let final core::String* #t89 = "x" in let final core::int* #t90 = super.{self::Base::[]}(#t89) in let final void #t91 = super.{self::Base::[]=}(#t89, invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:120:33: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+        ['x'] /*@target=num.+*/ ++;
+                                ^" in #t90.{core::num::+}(1){(core::num*) →* core::int*} as{TypeError} core::double*) in #t90;
+  }
+}
+abstract class Test4 extends self::Base<core::num*, core::int*> {
+  synthetic constructor •() → self::Test4*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = let final core::String* #t92 = "x" in let final core::int* #t93 = self::getInt() in let final void #t94 = super.{self::Base::[]=}(#t92, #t93) in #t93;
+    core::num* v2 = let final core::String* #t95 = "x" in let final core::num* #t96 = self::getNum() as{TypeError} core::int* in let final void #t97 = super.{self::Base::[]=}(#t95, #t96) in #t96;
+    core::num* v4 = let final core::String* #t98 = "x" in let final core::num* #t99 = super.{self::Base::[]}(#t98) in #t99 == null ?{core::num*} let final core::int* #t100 = self::getInt() in let final void #t101 = super.{self::Base::[]=}(#t98, #t100) in #t100 : #t99;
+    core::num* v5 = let final core::String* #t102 = "x" in let final core::num* #t103 = super.{self::Base::[]}(#t102) in #t103 == null ?{core::num*} let final core::num* #t104 = self::getNum() as{TypeError} core::int* in let final void #t105 = super.{self::Base::[]=}(#t102, #t104) in #t104 : #t103;
+    core::num* v7 = let final core::String* #t106 = "x" in let final core::num* #t107 = super.{self::Base::[]}(#t106).{core::num::+}(self::getInt()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t108 = super.{self::Base::[]=}(#t106, #t107) in #t107;
+    core::num* v8 = let final core::String* #t109 = "x" in let final core::num* #t110 = super.{self::Base::[]}(#t109).{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t111 = super.{self::Base::[]=}(#t109, #t110) in #t110;
+    core::num* v10 = let final core::String* #t112 = "x" in let final core::num* #t113 = super.{self::Base::[]}(#t112).{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t114 = super.{self::Base::[]=}(#t112, #t113) in #t113;
+    core::num* v11 = let final core::String* #t115 = "x" in let final core::num* #t116 = super.{self::Base::[]}(#t115) in let final void #t117 = super.{self::Base::[]=}(#t115, #t116.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::int*) in #t116;
+  }
+}
+abstract class Test5 extends self::Base<core::num*, core::num*> {
+  synthetic constructor •() → self::Test5*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = let final core::String* #t118 = "x" in let final core::int* #t119 = self::getInt() in let final void #t120 = super.{self::Base::[]=}(#t118, #t119) in #t119;
+    core::num* v2 = let final core::String* #t121 = "x" in let final core::num* #t122 = self::getNum() in let final void #t123 = super.{self::Base::[]=}(#t121, #t122) in #t122;
+    core::double* v3 = let final core::String* #t124 = "x" in let final core::double* #t125 = self::getDouble() in let final void #t126 = super.{self::Base::[]=}(#t124, #t125) in #t125;
+    core::num* v4 = let final core::String* #t127 = "x" in let final core::num* #t128 = super.{self::Base::[]}(#t127) in #t128 == null ?{core::num*} let final core::int* #t129 = self::getInt() in let final void #t130 = super.{self::Base::[]=}(#t127, #t129) in #t129 : #t128;
+    core::num* v5 = let final core::String* #t131 = "x" in let final core::num* #t132 = super.{self::Base::[]}(#t131) in #t132 == null ?{core::num*} let final core::num* #t133 = self::getNum() in let final void #t134 = super.{self::Base::[]=}(#t131, #t133) in #t133 : #t132;
+    core::num* v6 = let final core::String* #t135 = "x" in let final core::num* #t136 = super.{self::Base::[]}(#t135) in #t136 == null ?{core::num*} let final core::double* #t137 = self::getDouble() in let final void #t138 = super.{self::Base::[]=}(#t135, #t137) in #t137 : #t136;
+    core::num* v7 = let final core::String* #t139 = "x" in let final core::num* #t140 = super.{self::Base::[]}(#t139).{core::num::+}(self::getInt()){(core::num*) →* core::num*} in let final void #t141 = super.{self::Base::[]=}(#t139, #t140) in #t140;
+    core::num* v8 = let final core::String* #t142 = "x" in let final core::num* #t143 = super.{self::Base::[]}(#t142).{core::num::+}(self::getNum()){(core::num*) →* core::num*} in let final void #t144 = super.{self::Base::[]=}(#t142, #t143) in #t143;
+    core::num* v9 = let final core::String* #t145 = "x" in let final core::num* #t146 = super.{self::Base::[]}(#t145).{core::num::+}(self::getDouble()){(core::num*) →* core::num*} in let final void #t147 = super.{self::Base::[]=}(#t145, #t146) in #t146;
+    core::num* v10 = let final core::String* #t148 = "x" in let final core::num* #t149 = super.{self::Base::[]}(#t148).{core::num::+}(1){(core::num*) →* core::num*} in let final void #t150 = super.{self::Base::[]=}(#t148, #t149) in #t149;
+    core::num* v11 = let final core::String* #t151 = "x" in let final core::num* #t152 = super.{self::Base::[]}(#t151) in let final void #t153 = super.{self::Base::[]=}(#t151, #t152.{core::num::+}(1){(core::num*) →* core::num*}) in #t152;
+  }
+}
+abstract class Test6 extends self::Base<core::num*, core::double*> {
+  synthetic constructor •() → self::Test6*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::num* v2 = let final core::String* #t154 = "x" in let final core::num* #t155 = self::getNum() as{TypeError} core::double* in let final void #t156 = super.{self::Base::[]=}(#t154, #t155) in #t155;
+    core::double* v3 = let final core::String* #t157 = "x" in let final core::double* #t158 = self::getDouble() in let final void #t159 = super.{self::Base::[]=}(#t157, #t158) in #t158;
+    core::num* v5 = let final core::String* #t160 = "x" in let final core::num* #t161 = super.{self::Base::[]}(#t160) in #t161 == null ?{core::num*} let final core::num* #t162 = self::getNum() as{TypeError} core::double* in let final void #t163 = super.{self::Base::[]=}(#t160, #t162) in #t162 : #t161;
+    core::num* v6 = let final core::String* #t164 = "x" in let final core::num* #t165 = super.{self::Base::[]}(#t164) in #t165 == null ?{core::num*} let final core::double* #t166 = self::getDouble() in let final void #t167 = super.{self::Base::[]=}(#t164, #t166) in #t166 : #t165;
+    core::num* v7 = let final core::String* #t168 = "x" in let final core::num* #t169 = super.{self::Base::[]}(#t168).{core::num::+}(self::getInt()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t170 = super.{self::Base::[]=}(#t168, #t169) in #t169;
+    core::num* v8 = let final core::String* #t171 = "x" in let final core::num* #t172 = super.{self::Base::[]}(#t171).{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t173 = super.{self::Base::[]=}(#t171, #t172) in #t172;
+    core::num* v9 = let final core::String* #t174 = "x" in let final core::num* #t175 = super.{self::Base::[]}(#t174).{core::num::+}(self::getDouble()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t176 = super.{self::Base::[]=}(#t174, #t175) in #t175;
+    core::num* v10 = let final core::String* #t177 = "x" in let final core::num* #t178 = super.{self::Base::[]}(#t177).{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t179 = super.{self::Base::[]=}(#t177, #t178) in #t178;
+    core::num* v11 = let final core::String* #t180 = "x" in let final core::num* #t181 = super.{self::Base::[]}(#t180) in let final void #t182 = super.{self::Base::[]=}(#t180, #t181.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::double*) in #t181;
+  }
+}
+abstract class Test7 extends self::Base<core::double*, core::int*> {
+  synthetic constructor •() → self::Test7*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = let final core::String* #t183 = "x" in let final core::int* #t184 = self::getInt() in let final void #t185 = super.{self::Base::[]=}(#t183, #t184) in #t184;
+    core::num* v2 = let final core::String* #t186 = "x" in let final core::num* #t187 = self::getNum() as{TypeError} core::int* in let final void #t188 = super.{self::Base::[]=}(#t186, #t187) in #t187;
+    core::num* v4 = let final core::String* #t189 = "x" in let final core::double* #t190 = super.{self::Base::[]}(#t189) in #t190 == null ?{core::num*} let final core::int* #t191 = self::getInt() in let final void #t192 = super.{self::Base::[]=}(#t189, #t191) in #t191 : #t190;
+    core::num* v5 = let final core::String* #t193 = "x" in let final core::double* #t194 = super.{self::Base::[]}(#t193) in #t194 == null ?{core::num*} let final core::num* #t195 = self::getNum() as{TypeError} core::int* in let final void #t196 = super.{self::Base::[]=}(#t193, #t195) in #t195 : #t194;
+    core::double* v7 = let final core::String* #t197 = "x" in let final core::double* #t198 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:244:34: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+            /*@target=double.+*/ += getInt();
+                                 ^" in super.{self::Base::[]}(#t197).{core::double::+}(self::getInt()){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t199 = super.{self::Base::[]=}(#t197, #t198) in #t198;
+    core::double* v8 = let final core::String* #t200 = "x" in let final core::double* #t201 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:248:34: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+            /*@target=double.+*/ += getNum();
+                                 ^" in super.{self::Base::[]}(#t200).{core::double::+}(self::getNum()){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t202 = super.{self::Base::[]=}(#t200, #t201) in #t201;
+    core::double* v10 = let final core::String* #t203 = "x" in let final core::double* #t204 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:250:56: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    var /*@ type=double* */ v10 = /*@target=double.+*/ ++super
+                                                       ^" in super.{self::Base::[]}(#t203).{core::double::+}(1){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t205 = super.{self::Base::[]=}(#t203, #t204) in #t204;
+    core::double* v11 = let final core::String* #t206 = "x" in let final core::double* #t207 = super.{self::Base::[]}(#t206) in let final void #t208 = super.{self::Base::[]=}(#t206, invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:254:36: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+        ['x'] /*@target=double.+*/ ++;
+                                   ^" in #t207.{core::double::+}(1){(core::num*) →* core::double*} as{TypeError} core::int*) in #t207;
+  }
+}
+abstract class Test8 extends self::Base<core::double*, core::num*> {
+  synthetic constructor •() → self::Test8*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = let final core::String* #t209 = "x" in let final core::int* #t210 = self::getInt() in let final void #t211 = super.{self::Base::[]=}(#t209, #t210) in #t210;
+    core::num* v2 = let final core::String* #t212 = "x" in let final core::num* #t213 = self::getNum() in let final void #t214 = super.{self::Base::[]=}(#t212, #t213) in #t213;
+    core::double* v3 = let final core::String* #t215 = "x" in let final core::double* #t216 = self::getDouble() in let final void #t217 = super.{self::Base::[]=}(#t215, #t216) in #t216;
+    core::num* v4 = let final core::String* #t218 = "x" in let final core::double* #t219 = super.{self::Base::[]}(#t218) in #t219 == null ?{core::num*} let final core::int* #t220 = self::getInt() in let final void #t221 = super.{self::Base::[]=}(#t218, #t220) in #t220 : #t219;
+    core::num* v5 = let final core::String* #t222 = "x" in let final core::double* #t223 = super.{self::Base::[]}(#t222) in #t223 == null ?{core::num*} let final core::num* #t224 = self::getNum() in let final void #t225 = super.{self::Base::[]=}(#t222, #t224) in #t224 : #t223;
+    core::double* v6 = let final core::String* #t226 = "x" in let final core::double* #t227 = super.{self::Base::[]}(#t226) in #t227 == null ?{core::double*} let final core::double* #t228 = self::getDouble() in let final void #t229 = super.{self::Base::[]=}(#t226, #t228) in #t228 : #t227;
+    core::double* v7 = let final core::String* #t230 = "x" in let final core::double* #t231 = super.{self::Base::[]}(#t230).{core::double::+}(self::getInt()){(core::num*) →* core::double*} in let final void #t232 = super.{self::Base::[]=}(#t230, #t231) in #t231;
+    core::double* v8 = let final core::String* #t233 = "x" in let final core::double* #t234 = super.{self::Base::[]}(#t233).{core::double::+}(self::getNum()){(core::num*) →* core::double*} in let final void #t235 = super.{self::Base::[]=}(#t233, #t234) in #t234;
+    core::double* v9 = let final core::String* #t236 = "x" in let final core::double* #t237 = super.{self::Base::[]}(#t236).{core::double::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t238 = super.{self::Base::[]=}(#t236, #t237) in #t237;
+    core::double* v10 = let final core::String* #t239 = "x" in let final core::double* #t240 = super.{self::Base::[]}(#t239).{core::double::+}(1){(core::num*) →* core::double*} in let final void #t241 = super.{self::Base::[]=}(#t239, #t240) in #t240;
+    core::double* v11 = let final core::String* #t242 = "x" in let final core::double* #t243 = super.{self::Base::[]}(#t242) in let final void #t244 = super.{self::Base::[]=}(#t242, #t243.{core::double::+}(1){(core::num*) →* core::double*}) in #t243;
+  }
+}
+abstract class Test9 extends self::Base<core::double*, core::double*> {
+  synthetic constructor •() → self::Test9*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::num* v2 = let final core::String* #t245 = "x" in let final core::num* #t246 = self::getNum() as{TypeError} core::double* in let final void #t247 = super.{self::Base::[]=}(#t245, #t246) in #t246;
+    core::double* v3 = let final core::String* #t248 = "x" in let final core::double* #t249 = self::getDouble() in let final void #t250 = super.{self::Base::[]=}(#t248, #t249) in #t249;
+    core::num* v5 = let final core::String* #t251 = "x" in let final core::double* #t252 = super.{self::Base::[]}(#t251) in #t252 == null ?{core::num*} let final core::num* #t253 = self::getNum() as{TypeError} core::double* in let final void #t254 = super.{self::Base::[]=}(#t251, #t253) in #t253 : #t252;
+    core::double* v6 = let final core::String* #t255 = "x" in let final core::double* #t256 = super.{self::Base::[]}(#t255) in #t256 == null ?{core::double*} let final core::double* #t257 = self::getDouble() in let final void #t258 = super.{self::Base::[]=}(#t255, #t257) in #t257 : #t256;
+    core::double* v7 = let final core::String* #t259 = "x" in let final core::double* #t260 = super.{self::Base::[]}(#t259).{core::double::+}(self::getInt()){(core::num*) →* core::double*} in let final void #t261 = super.{self::Base::[]=}(#t259, #t260) in #t260;
+    core::double* v8 = let final core::String* #t262 = "x" in let final core::double* #t263 = super.{self::Base::[]}(#t262).{core::double::+}(self::getNum()){(core::num*) →* core::double*} in let final void #t264 = super.{self::Base::[]=}(#t262, #t263) in #t263;
+    core::double* v9 = let final core::String* #t265 = "x" in let final core::double* #t266 = super.{self::Base::[]}(#t265).{core::double::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t267 = super.{self::Base::[]=}(#t265, #t266) in #t266;
+    core::double* v10 = let final core::String* #t268 = "x" in let final core::double* #t269 = super.{self::Base::[]}(#t268).{core::double::+}(1){(core::num*) →* core::double*} in let final void #t270 = super.{self::Base::[]=}(#t268, #t269) in #t269;
+    core::double* v11 = let final core::String* #t271 = "x" in let final core::double* #t272 = super.{self::Base::[]}(#t271) in let final void #t273 = super.{self::Base::[]=}(#t271, #t272.{core::double::+}(1){(core::num*) →* core::double*}) in #t272;
+  }
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.weak.modular.expect
new file mode 100644
index 0000000..0202be1
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.weak.modular.expect
@@ -0,0 +1,89 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Index extends core::Object {
+  synthetic constructor •() → self::Index*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  operator [](self::Index* i) → self::B*
+    return null;
+  operator []=(self::Index* i, self::B* v) → void {}
+  method test() → void {
+    this.{self::Test::[]=}(self::f<self::Index*>(), self::f<self::B*>()){(self::Index*, self::B*) →* void};
+    let final self::Index* #t1 = self::f<self::Index*>() in this.{self::Test::[]}(#t1){(self::Index*) →* self::B*} == null ?{self::B*} this.{self::Test::[]=}(#t1, self::f<self::B*>()){(self::Index*, self::B*) →* void} : null;
+    let final self::Index* #t2 = self::f<self::Index*>() in this.{self::Test::[]=}(#t2, this.{self::Test::[]}(#t2){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*){(self::Index*, self::B*) →* void};
+    let final self::Index* #t3 = self::f<self::Index*>() in this.{self::Test::[]=}(#t3, this.{self::Test::[]}(#t3){(self::Index*) →* self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*}){(self::Index*, self::B*) →* void};
+    let final self::Index* #t4 = self::f<self::Index*>() in this.{self::Test::[]=}(#t4, this.{self::Test::[]}(#t4){(self::Index*) →* self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*}){(self::Index*, self::B*) →* void};
+    let final self::Index* #t5 = self::f<self::Index*>() in let final self::B* #t6 = this.{self::Test::[]}(#t5){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t7 = this.{self::Test::[]=}(#t5, #t6){(self::Index*, self::B*) →* void} in #t6;
+    let final self::Index* #t8 = self::f<self::Index*>() in this.{self::Test::[]=}(#t8, this.{self::Test::[]}(#t8){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*}){(self::Index*, self::B*) →* void};
+    self::B* v1 = let final self::Index* #t9 = self::f<self::Index*>() in let final self::B* #t10 = self::f<self::B*>() in let final void #t11 = this.{self::Test::[]=}(#t9, #t10){(self::Index*, self::B*) →* void} in #t10;
+    self::B* v2 = let final self::Index* #t12 = self::f<self::Index*>() in let final self::B* #t13 = this.{self::Test::[]}(#t12){(self::Index*) →* self::B*} in #t13 == null ?{self::B*} let final self::B* #t14 = self::f<self::B*>() in let final void #t15 = this.{self::Test::[]=}(#t12, #t14){(self::Index*, self::B*) →* void} in #t14 : #t13;
+    self::A* v3 = let final self::Index* #t16 = self::f<self::Index*>() in let final self::A* #t17 = this.{self::Test::[]}(#t16){(self::Index*) →* self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B* in let final void #t18 = this.{self::Test::[]=}(#t16, #t17){(self::Index*, self::B*) →* void} in #t17;
+    self::B* v4 = let final self::Index* #t19 = self::f<self::Index*>() in let final self::B* #t20 = this.{self::Test::[]}(#t19){(self::Index*) →* self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*} in let final void #t21 = this.{self::Test::[]=}(#t19, #t20){(self::Index*, self::B*) →* void} in #t20;
+    self::C* v5 = let final self::Index* #t22 = self::f<self::Index*>() in let final self::C* #t23 = this.{self::Test::[]}(#t22){(self::Index*) →* self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*} in let final void #t24 = this.{self::Test::[]=}(#t22, #t23){(self::Index*, self::B*) →* void} in #t23;
+    self::B* v6 = let final self::Index* #t25 = self::f<self::Index*>() in let final self::B* #t26 = this.{self::Test::[]}(#t25){(self::Index*) →* self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t27 = this.{self::Test::[]=}(#t25, #t26){(self::Index*, self::B*) →* void} in #t26;
+    self::B* v7 = let final self::Index* #t28 = self::f<self::Index*>() in let final self::B* #t29 = this.{self::Test::[]}(#t28){(self::Index*) →* self::B*} in let final void #t30 = this.{self::Test::[]=}(#t28, #t29.{self::B::-}(1){(core::int*) →* self::B*}){(self::Index*, self::B*) →* void} in #t29;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..99a0822
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.weak.modular.expect
@@ -0,0 +1,311 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:109:27: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//         /*@target=num.+*/ += getInt();
+//                           ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:119:50: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//     var /*@ type=int* */ v10 = /*@target=num.+*/ ++this
+//                                                  ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:124:27: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//         /*@target=num.+*/ ++;
+//                           ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:264:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//         /*@target=double.+*/ += getInt();
+//                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:268:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//         /*@target=double.+*/ += getNum();
+//                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:270:56: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//     var /*@ type=double* */ v10 = /*@target=double.+*/ ++this
+//                                                        ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:275:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//         /*@target=double.+*/ ++;
+//                              ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Test1 extends core::Object {
+  synthetic constructor •() → self::Test1*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::int* v) → void;
+  method test() → void {
+    core::int* v1 = let final core::String* #t1 = "x" in let final core::int* #t2 = self::getInt() in let final void #t3 = this.{self::Test1::[]=}(#t1, #t2){(core::String*, core::int*) →* void} in #t2;
+    core::num* v2 = let final core::String* #t4 = "x" in let final core::num* #t5 = self::getNum() as{TypeError} core::int* in let final void #t6 = this.{self::Test1::[]=}(#t4, #t5){(core::String*, core::int*) →* void} in #t5;
+    core::int* v4 = let final core::String* #t7 = "x" in let final core::int* #t8 = this.{self::Test1::[]}(#t7){(core::String*) →* core::int*} in #t8 == null ?{core::int*} let final core::int* #t9 = self::getInt() in let final void #t10 = this.{self::Test1::[]=}(#t7, #t9){(core::String*, core::int*) →* void} in #t9 : #t8;
+    core::num* v5 = let final core::String* #t11 = "x" in let final core::int* #t12 = this.{self::Test1::[]}(#t11){(core::String*) →* core::int*} in #t12 == null ?{core::num*} let final core::num* #t13 = self::getNum() as{TypeError} core::int* in let final void #t14 = this.{self::Test1::[]=}(#t11, #t13){(core::String*, core::int*) →* void} in #t13 : #t12;
+    core::int* v7 = let final core::String* #t15 = "x" in let final core::int* #t16 = this.{self::Test1::[]}(#t15){(core::String*) →* core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*} in let final void #t17 = this.{self::Test1::[]=}(#t15, #t16){(core::String*, core::int*) →* void} in #t16;
+    core::num* v8 = let final core::String* #t18 = "x" in let final core::num* #t19 = this.{self::Test1::[]}(#t18){(core::String*) →* core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t20 = this.{self::Test1::[]=}(#t18, #t19){(core::String*, core::int*) →* void} in #t19;
+    core::int* v10 = let final core::String* #t21 = "x" in let final core::int* #t22 = this.{self::Test1::[]}(#t21){(core::String*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t23 = this.{self::Test1::[]=}(#t21, #t22){(core::String*, core::int*) →* void} in #t22;
+    core::int* v11 = let final core::String* #t24 = "x" in let final core::int* #t25 = this.{self::Test1::[]}(#t24){(core::String*) →* core::int*} in let final void #t26 = this.{self::Test1::[]=}(#t24, #t25.{core::num::+}(1){(core::num*) →* core::int*}){(core::String*, core::int*) →* void} in #t25;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test2 extends core::Object {
+  synthetic constructor •() → self::Test2*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::num* v) → void;
+  method test() → void {
+    core::int* v1 = let final core::String* #t27 = "x" in let final core::int* #t28 = self::getInt() in let final void #t29 = this.{self::Test2::[]=}(#t27, #t28){(core::String*, core::num*) →* void} in #t28;
+    core::num* v2 = let final core::String* #t30 = "x" in let final core::num* #t31 = self::getNum() in let final void #t32 = this.{self::Test2::[]=}(#t30, #t31){(core::String*, core::num*) →* void} in #t31;
+    core::double* v3 = let final core::String* #t33 = "x" in let final core::double* #t34 = self::getDouble() in let final void #t35 = this.{self::Test2::[]=}(#t33, #t34){(core::String*, core::num*) →* void} in #t34;
+    core::int* v4 = let final core::String* #t36 = "x" in let final core::int* #t37 = this.{self::Test2::[]}(#t36){(core::String*) →* core::int*} in #t37 == null ?{core::int*} let final core::int* #t38 = self::getInt() in let final void #t39 = this.{self::Test2::[]=}(#t36, #t38){(core::String*, core::num*) →* void} in #t38 : #t37;
+    core::num* v5 = let final core::String* #t40 = "x" in let final core::int* #t41 = this.{self::Test2::[]}(#t40){(core::String*) →* core::int*} in #t41 == null ?{core::num*} let final core::num* #t42 = self::getNum() in let final void #t43 = this.{self::Test2::[]=}(#t40, #t42){(core::String*, core::num*) →* void} in #t42 : #t41;
+    core::num* v6 = let final core::String* #t44 = "x" in let final core::int* #t45 = this.{self::Test2::[]}(#t44){(core::String*) →* core::int*} in #t45 == null ?{core::num*} let final core::double* #t46 = self::getDouble() in let final void #t47 = this.{self::Test2::[]=}(#t44, #t46){(core::String*, core::num*) →* void} in #t46 : #t45;
+    core::int* v7 = let final core::String* #t48 = "x" in let final core::int* #t49 = this.{self::Test2::[]}(#t48){(core::String*) →* core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*} in let final void #t50 = this.{self::Test2::[]=}(#t48, #t49){(core::String*, core::num*) →* void} in #t49;
+    core::num* v8 = let final core::String* #t51 = "x" in let final core::num* #t52 = this.{self::Test2::[]}(#t51){(core::String*) →* core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} in let final void #t53 = this.{self::Test2::[]=}(#t51, #t52){(core::String*, core::num*) →* void} in #t52;
+    core::double* v9 = let final core::String* #t54 = "x" in let final core::double* #t55 = this.{self::Test2::[]}(#t54){(core::String*) →* core::int*}.{core::num::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t56 = this.{self::Test2::[]=}(#t54, #t55){(core::String*, core::num*) →* void} in #t55;
+    core::int* v10 = let final core::String* #t57 = "x" in let final core::int* #t58 = this.{self::Test2::[]}(#t57){(core::String*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t59 = this.{self::Test2::[]=}(#t57, #t58){(core::String*, core::num*) →* void} in #t58;
+    core::int* v11 = let final core::String* #t60 = "x" in let final core::int* #t61 = this.{self::Test2::[]}(#t60){(core::String*) →* core::int*} in let final void #t62 = this.{self::Test2::[]=}(#t60, #t61.{core::num::+}(1){(core::num*) →* core::int*}){(core::String*, core::num*) →* void} in #t61;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test3 extends core::Object {
+  synthetic constructor •() → self::Test3*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::double* v) → void;
+  method test() → void {
+    core::num* v2 = let final core::String* #t63 = "x" in let final core::num* #t64 = self::getNum() as{TypeError} core::double* in let final void #t65 = this.{self::Test3::[]=}(#t63, #t64){(core::String*, core::double*) →* void} in #t64;
+    core::double* v3 = let final core::String* #t66 = "x" in let final core::double* #t67 = self::getDouble() in let final void #t68 = this.{self::Test3::[]=}(#t66, #t67){(core::String*, core::double*) →* void} in #t67;
+    core::num* v5 = let final core::String* #t69 = "x" in let final core::int* #t70 = this.{self::Test3::[]}(#t69){(core::String*) →* core::int*} in #t70 == null ?{core::num*} let final core::num* #t71 = self::getNum() as{TypeError} core::double* in let final void #t72 = this.{self::Test3::[]=}(#t69, #t71){(core::String*, core::double*) →* void} in #t71 : #t70;
+    core::num* v6 = let final core::String* #t73 = "x" in let final core::int* #t74 = this.{self::Test3::[]}(#t73){(core::String*) →* core::int*} in #t74 == null ?{core::num*} let final core::double* #t75 = self::getDouble() in let final void #t76 = this.{self::Test3::[]=}(#t73, #t75){(core::String*, core::double*) →* void} in #t75 : #t74;
+    core::int* v7 = let final core::String* #t77 = "x" in let final core::int* #t78 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:109:27: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+        /*@target=num.+*/ += getInt();
+                          ^" in this.{self::Test3::[]}(#t77){(core::String*) →* core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*} as{TypeError} core::double* in let final void #t79 = this.{self::Test3::[]=}(#t77, #t78){(core::String*, core::double*) →* void} in #t78;
+    core::num* v8 = let final core::String* #t80 = "x" in let final core::num* #t81 = this.{self::Test3::[]}(#t80){(core::String*) →* core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t82 = this.{self::Test3::[]=}(#t80, #t81){(core::String*, core::double*) →* void} in #t81;
+    core::double* v9 = let final core::String* #t83 = "x" in let final core::double* #t84 = this.{self::Test3::[]}(#t83){(core::String*) →* core::int*}.{core::num::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t85 = this.{self::Test3::[]=}(#t83, #t84){(core::String*, core::double*) →* void} in #t84;
+    core::int* v10 = let final core::String* #t86 = "x" in let final core::int* #t87 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:119:50: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    var /*@ type=int* */ v10 = /*@target=num.+*/ ++this
+                                                 ^" in this.{self::Test3::[]}(#t86){(core::String*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*} as{TypeError} core::double* in let final void #t88 = this.{self::Test3::[]=}(#t86, #t87){(core::String*, core::double*) →* void} in #t87;
+    core::int* v11 = let final core::String* #t89 = "x" in let final core::int* #t90 = this.{self::Test3::[]}(#t89){(core::String*) →* core::int*} in let final void #t91 = this.{self::Test3::[]=}(#t89, invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:124:27: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+        /*@target=num.+*/ ++;
+                          ^" in #t90.{core::num::+}(1){(core::num*) →* core::int*} as{TypeError} core::double*){(core::String*, core::double*) →* void} in #t90;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test4 extends core::Object {
+  synthetic constructor •() → self::Test4*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::int* v) → void;
+  method test() → void {
+    core::int* v1 = let final core::String* #t92 = "x" in let final core::int* #t93 = self::getInt() in let final void #t94 = this.{self::Test4::[]=}(#t92, #t93){(core::String*, core::int*) →* void} in #t93;
+    core::num* v2 = let final core::String* #t95 = "x" in let final core::num* #t96 = self::getNum() as{TypeError} core::int* in let final void #t97 = this.{self::Test4::[]=}(#t95, #t96){(core::String*, core::int*) →* void} in #t96;
+    core::num* v4 = let final core::String* #t98 = "x" in let final core::num* #t99 = this.{self::Test4::[]}(#t98){(core::String*) →* core::num*} in #t99 == null ?{core::num*} let final core::int* #t100 = self::getInt() in let final void #t101 = this.{self::Test4::[]=}(#t98, #t100){(core::String*, core::int*) →* void} in #t100 : #t99;
+    core::num* v5 = let final core::String* #t102 = "x" in let final core::num* #t103 = this.{self::Test4::[]}(#t102){(core::String*) →* core::num*} in #t103 == null ?{core::num*} let final core::num* #t104 = self::getNum() as{TypeError} core::int* in let final void #t105 = this.{self::Test4::[]=}(#t102, #t104){(core::String*, core::int*) →* void} in #t104 : #t103;
+    core::num* v7 = let final core::String* #t106 = "x" in let final core::num* #t107 = this.{self::Test4::[]}(#t106){(core::String*) →* core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t108 = this.{self::Test4::[]=}(#t106, #t107){(core::String*, core::int*) →* void} in #t107;
+    core::num* v8 = let final core::String* #t109 = "x" in let final core::num* #t110 = this.{self::Test4::[]}(#t109){(core::String*) →* core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t111 = this.{self::Test4::[]=}(#t109, #t110){(core::String*, core::int*) →* void} in #t110;
+    core::num* v10 = let final core::String* #t112 = "x" in let final core::num* #t113 = this.{self::Test4::[]}(#t112){(core::String*) →* core::num*}.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t114 = this.{self::Test4::[]=}(#t112, #t113){(core::String*, core::int*) →* void} in #t113;
+    core::num* v11 = let final core::String* #t115 = "x" in let final core::num* #t116 = this.{self::Test4::[]}(#t115){(core::String*) →* core::num*} in let final void #t117 = this.{self::Test4::[]=}(#t115, #t116.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::int*){(core::String*, core::int*) →* void} in #t116;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test5 extends core::Object {
+  synthetic constructor •() → self::Test5*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::num* v) → void;
+  method test() → void {
+    core::int* v1 = let final core::String* #t118 = "x" in let final core::int* #t119 = self::getInt() in let final void #t120 = this.{self::Test5::[]=}(#t118, #t119){(core::String*, core::num*) →* void} in #t119;
+    core::num* v2 = let final core::String* #t121 = "x" in let final core::num* #t122 = self::getNum() in let final void #t123 = this.{self::Test5::[]=}(#t121, #t122){(core::String*, core::num*) →* void} in #t122;
+    core::double* v3 = let final core::String* #t124 = "x" in let final core::double* #t125 = self::getDouble() in let final void #t126 = this.{self::Test5::[]=}(#t124, #t125){(core::String*, core::num*) →* void} in #t125;
+    core::num* v4 = let final core::String* #t127 = "x" in let final core::num* #t128 = this.{self::Test5::[]}(#t127){(core::String*) →* core::num*} in #t128 == null ?{core::num*} let final core::int* #t129 = self::getInt() in let final void #t130 = this.{self::Test5::[]=}(#t127, #t129){(core::String*, core::num*) →* void} in #t129 : #t128;
+    core::num* v5 = let final core::String* #t131 = "x" in let final core::num* #t132 = this.{self::Test5::[]}(#t131){(core::String*) →* core::num*} in #t132 == null ?{core::num*} let final core::num* #t133 = self::getNum() in let final void #t134 = this.{self::Test5::[]=}(#t131, #t133){(core::String*, core::num*) →* void} in #t133 : #t132;
+    core::num* v6 = let final core::String* #t135 = "x" in let final core::num* #t136 = this.{self::Test5::[]}(#t135){(core::String*) →* core::num*} in #t136 == null ?{core::num*} let final core::double* #t137 = self::getDouble() in let final void #t138 = this.{self::Test5::[]=}(#t135, #t137){(core::String*, core::num*) →* void} in #t137 : #t136;
+    core::num* v7 = let final core::String* #t139 = "x" in let final core::num* #t140 = this.{self::Test5::[]}(#t139){(core::String*) →* core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*} in let final void #t141 = this.{self::Test5::[]=}(#t139, #t140){(core::String*, core::num*) →* void} in #t140;
+    core::num* v8 = let final core::String* #t142 = "x" in let final core::num* #t143 = this.{self::Test5::[]}(#t142){(core::String*) →* core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} in let final void #t144 = this.{self::Test5::[]=}(#t142, #t143){(core::String*, core::num*) →* void} in #t143;
+    core::num* v9 = let final core::String* #t145 = "x" in let final core::num* #t146 = this.{self::Test5::[]}(#t145){(core::String*) →* core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*} in let final void #t147 = this.{self::Test5::[]=}(#t145, #t146){(core::String*, core::num*) →* void} in #t146;
+    core::num* v10 = let final core::String* #t148 = "x" in let final core::num* #t149 = this.{self::Test5::[]}(#t148){(core::String*) →* core::num*}.{core::num::+}(1){(core::num*) →* core::num*} in let final void #t150 = this.{self::Test5::[]=}(#t148, #t149){(core::String*, core::num*) →* void} in #t149;
+    core::num* v11 = let final core::String* #t151 = "x" in let final core::num* #t152 = this.{self::Test5::[]}(#t151){(core::String*) →* core::num*} in let final void #t153 = this.{self::Test5::[]=}(#t151, #t152.{core::num::+}(1){(core::num*) →* core::num*}){(core::String*, core::num*) →* void} in #t152;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test6 extends core::Object {
+  synthetic constructor •() → self::Test6*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::double* v) → void;
+  method test() → void {
+    core::num* v2 = let final core::String* #t154 = "x" in let final core::num* #t155 = self::getNum() as{TypeError} core::double* in let final void #t156 = this.{self::Test6::[]=}(#t154, #t155){(core::String*, core::double*) →* void} in #t155;
+    core::double* v3 = let final core::String* #t157 = "x" in let final core::double* #t158 = self::getDouble() in let final void #t159 = this.{self::Test6::[]=}(#t157, #t158){(core::String*, core::double*) →* void} in #t158;
+    core::num* v5 = let final core::String* #t160 = "x" in let final core::num* #t161 = this.{self::Test6::[]}(#t160){(core::String*) →* core::num*} in #t161 == null ?{core::num*} let final core::num* #t162 = self::getNum() as{TypeError} core::double* in let final void #t163 = this.{self::Test6::[]=}(#t160, #t162){(core::String*, core::double*) →* void} in #t162 : #t161;
+    core::num* v6 = let final core::String* #t164 = "x" in let final core::num* #t165 = this.{self::Test6::[]}(#t164){(core::String*) →* core::num*} in #t165 == null ?{core::num*} let final core::double* #t166 = self::getDouble() in let final void #t167 = this.{self::Test6::[]=}(#t164, #t166){(core::String*, core::double*) →* void} in #t166 : #t165;
+    core::num* v7 = let final core::String* #t168 = "x" in let final core::num* #t169 = this.{self::Test6::[]}(#t168){(core::String*) →* core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t170 = this.{self::Test6::[]=}(#t168, #t169){(core::String*, core::double*) →* void} in #t169;
+    core::num* v8 = let final core::String* #t171 = "x" in let final core::num* #t172 = this.{self::Test6::[]}(#t171){(core::String*) →* core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t173 = this.{self::Test6::[]=}(#t171, #t172){(core::String*, core::double*) →* void} in #t172;
+    core::num* v9 = let final core::String* #t174 = "x" in let final core::num* #t175 = this.{self::Test6::[]}(#t174){(core::String*) →* core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t176 = this.{self::Test6::[]=}(#t174, #t175){(core::String*, core::double*) →* void} in #t175;
+    core::num* v10 = let final core::String* #t177 = "x" in let final core::num* #t178 = this.{self::Test6::[]}(#t177){(core::String*) →* core::num*}.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t179 = this.{self::Test6::[]=}(#t177, #t178){(core::String*, core::double*) →* void} in #t178;
+    core::num* v11 = let final core::String* #t180 = "x" in let final core::num* #t181 = this.{self::Test6::[]}(#t180){(core::String*) →* core::num*} in let final void #t182 = this.{self::Test6::[]=}(#t180, #t181.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::double*){(core::String*, core::double*) →* void} in #t181;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test7 extends core::Object {
+  synthetic constructor •() → self::Test7*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::int* v) → void;
+  method test() → void {
+    core::int* v1 = let final core::String* #t183 = "x" in let final core::int* #t184 = self::getInt() in let final void #t185 = this.{self::Test7::[]=}(#t183, #t184){(core::String*, core::int*) →* void} in #t184;
+    core::num* v2 = let final core::String* #t186 = "x" in let final core::num* #t187 = self::getNum() as{TypeError} core::int* in let final void #t188 = this.{self::Test7::[]=}(#t186, #t187){(core::String*, core::int*) →* void} in #t187;
+    core::num* v4 = let final core::String* #t189 = "x" in let final core::double* #t190 = this.{self::Test7::[]}(#t189){(core::String*) →* core::double*} in #t190 == null ?{core::num*} let final core::int* #t191 = self::getInt() in let final void #t192 = this.{self::Test7::[]=}(#t189, #t191){(core::String*, core::int*) →* void} in #t191 : #t190;
+    core::num* v5 = let final core::String* #t193 = "x" in let final core::double* #t194 = this.{self::Test7::[]}(#t193){(core::String*) →* core::double*} in #t194 == null ?{core::num*} let final core::num* #t195 = self::getNum() as{TypeError} core::int* in let final void #t196 = this.{self::Test7::[]=}(#t193, #t195){(core::String*, core::int*) →* void} in #t195 : #t194;
+    core::double* v7 = let final core::String* #t197 = "x" in let final core::double* #t198 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:264:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+        /*@target=double.+*/ += getInt();
+                             ^" in this.{self::Test7::[]}(#t197){(core::String*) →* core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t199 = this.{self::Test7::[]=}(#t197, #t198){(core::String*, core::int*) →* void} in #t198;
+    core::double* v8 = let final core::String* #t200 = "x" in let final core::double* #t201 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:268:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+        /*@target=double.+*/ += getNum();
+                             ^" in this.{self::Test7::[]}(#t200){(core::String*) →* core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t202 = this.{self::Test7::[]=}(#t200, #t201){(core::String*, core::int*) →* void} in #t201;
+    core::double* v10 = let final core::String* #t203 = "x" in let final core::double* #t204 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:270:56: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    var /*@ type=double* */ v10 = /*@target=double.+*/ ++this
+                                                       ^" in this.{self::Test7::[]}(#t203){(core::String*) →* core::double*}.{core::double::+}(1){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t205 = this.{self::Test7::[]=}(#t203, #t204){(core::String*, core::int*) →* void} in #t204;
+    core::double* v11 = let final core::String* #t206 = "x" in let final core::double* #t207 = this.{self::Test7::[]}(#t206){(core::String*) →* core::double*} in let final void #t208 = this.{self::Test7::[]=}(#t206, invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:275:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+        /*@target=double.+*/ ++;
+                             ^" in #t207.{core::double::+}(1){(core::num*) →* core::double*} as{TypeError} core::int*){(core::String*, core::int*) →* void} in #t207;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test8 extends core::Object {
+  synthetic constructor •() → self::Test8*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::num* v) → void;
+  method test() → void {
+    core::int* v1 = let final core::String* #t209 = "x" in let final core::int* #t210 = self::getInt() in let final void #t211 = this.{self::Test8::[]=}(#t209, #t210){(core::String*, core::num*) →* void} in #t210;
+    core::num* v2 = let final core::String* #t212 = "x" in let final core::num* #t213 = self::getNum() in let final void #t214 = this.{self::Test8::[]=}(#t212, #t213){(core::String*, core::num*) →* void} in #t213;
+    core::double* v3 = let final core::String* #t215 = "x" in let final core::double* #t216 = self::getDouble() in let final void #t217 = this.{self::Test8::[]=}(#t215, #t216){(core::String*, core::num*) →* void} in #t216;
+    core::num* v4 = let final core::String* #t218 = "x" in let final core::double* #t219 = this.{self::Test8::[]}(#t218){(core::String*) →* core::double*} in #t219 == null ?{core::num*} let final core::int* #t220 = self::getInt() in let final void #t221 = this.{self::Test8::[]=}(#t218, #t220){(core::String*, core::num*) →* void} in #t220 : #t219;
+    core::num* v5 = let final core::String* #t222 = "x" in let final core::double* #t223 = this.{self::Test8::[]}(#t222){(core::String*) →* core::double*} in #t223 == null ?{core::num*} let final core::num* #t224 = self::getNum() in let final void #t225 = this.{self::Test8::[]=}(#t222, #t224){(core::String*, core::num*) →* void} in #t224 : #t223;
+    core::double* v6 = let final core::String* #t226 = "x" in let final core::double* #t227 = this.{self::Test8::[]}(#t226){(core::String*) →* core::double*} in #t227 == null ?{core::double*} let final core::double* #t228 = self::getDouble() in let final void #t229 = this.{self::Test8::[]=}(#t226, #t228){(core::String*, core::num*) →* void} in #t228 : #t227;
+    core::double* v7 = let final core::String* #t230 = "x" in let final core::double* #t231 = this.{self::Test8::[]}(#t230){(core::String*) →* core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*} in let final void #t232 = this.{self::Test8::[]=}(#t230, #t231){(core::String*, core::num*) →* void} in #t231;
+    core::double* v8 = let final core::String* #t233 = "x" in let final core::double* #t234 = this.{self::Test8::[]}(#t233){(core::String*) →* core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*} in let final void #t235 = this.{self::Test8::[]=}(#t233, #t234){(core::String*, core::num*) →* void} in #t234;
+    core::double* v9 = let final core::String* #t236 = "x" in let final core::double* #t237 = this.{self::Test8::[]}(#t236){(core::String*) →* core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t238 = this.{self::Test8::[]=}(#t236, #t237){(core::String*, core::num*) →* void} in #t237;
+    core::double* v10 = let final core::String* #t239 = "x" in let final core::double* #t240 = this.{self::Test8::[]}(#t239){(core::String*) →* core::double*}.{core::double::+}(1){(core::num*) →* core::double*} in let final void #t241 = this.{self::Test8::[]=}(#t239, #t240){(core::String*, core::num*) →* void} in #t240;
+    core::double* v11 = let final core::String* #t242 = "x" in let final core::double* #t243 = this.{self::Test8::[]}(#t242){(core::String*) →* core::double*} in let final void #t244 = this.{self::Test8::[]=}(#t242, #t243.{core::double::+}(1){(core::num*) →* core::double*}){(core::String*, core::num*) →* void} in #t243;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Test9 extends core::Object {
+  synthetic constructor •() → self::Test9*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::double* v) → void;
+  method test() → void {
+    core::num* v2 = let final core::String* #t245 = "x" in let final core::num* #t246 = self::getNum() as{TypeError} core::double* in let final void #t247 = this.{self::Test9::[]=}(#t245, #t246){(core::String*, core::double*) →* void} in #t246;
+    core::double* v3 = let final core::String* #t248 = "x" in let final core::double* #t249 = self::getDouble() in let final void #t250 = this.{self::Test9::[]=}(#t248, #t249){(core::String*, core::double*) →* void} in #t249;
+    core::num* v5 = let final core::String* #t251 = "x" in let final core::double* #t252 = this.{self::Test9::[]}(#t251){(core::String*) →* core::double*} in #t252 == null ?{core::num*} let final core::num* #t253 = self::getNum() as{TypeError} core::double* in let final void #t254 = this.{self::Test9::[]=}(#t251, #t253){(core::String*, core::double*) →* void} in #t253 : #t252;
+    core::double* v6 = let final core::String* #t255 = "x" in let final core::double* #t256 = this.{self::Test9::[]}(#t255){(core::String*) →* core::double*} in #t256 == null ?{core::double*} let final core::double* #t257 = self::getDouble() in let final void #t258 = this.{self::Test9::[]=}(#t255, #t257){(core::String*, core::double*) →* void} in #t257 : #t256;
+    core::double* v7 = let final core::String* #t259 = "x" in let final core::double* #t260 = this.{self::Test9::[]}(#t259){(core::String*) →* core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*} in let final void #t261 = this.{self::Test9::[]=}(#t259, #t260){(core::String*, core::double*) →* void} in #t260;
+    core::double* v8 = let final core::String* #t262 = "x" in let final core::double* #t263 = this.{self::Test9::[]}(#t262){(core::String*) →* core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*} in let final void #t264 = this.{self::Test9::[]=}(#t262, #t263){(core::String*, core::double*) →* void} in #t263;
+    core::double* v9 = let final core::String* #t265 = "x" in let final core::double* #t266 = this.{self::Test9::[]}(#t265){(core::String*) →* core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t267 = this.{self::Test9::[]=}(#t265, #t266){(core::String*, core::double*) →* void} in #t266;
+    core::double* v10 = let final core::String* #t268 = "x" in let final core::double* #t269 = this.{self::Test9::[]}(#t268){(core::String*) →* core::double*}.{core::double::+}(1){(core::num*) →* core::double*} in let final void #t270 = this.{self::Test9::[]=}(#t268, #t269){(core::String*, core::double*) →* void} in #t269;
+    core::double* v11 = let final core::String* #t271 = "x" in let final core::double* #t272 = this.{self::Test9::[]}(#t271){(core::String*) →* core::double*} in let final void #t273 = this.{self::Test9::[]=}(#t271, #t272.{core::double::+}(1){(core::num*) →* core::double*}){(core::String*, core::double*) →* void} in #t272;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..895c644
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.weak.modular.expect
@@ -0,0 +1,175 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:90:74: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
+//                                                                          ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:102:25: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//       /*@target=num.+*/ ++t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];
+//                         ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:105:74: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ ++;
+//                                                                          ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:211:77: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
+//                                                                             ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:215:77: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
+//                                                                             ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:219:28: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//       /*@target=double.+*/ ++t
+//                            ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:223:77: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//       t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ ++;
+//                                                                             ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Test<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Test<self::Test::T*, self::Test::U*>*
+    : super core::Object::•()
+    ;
+  abstract operator [](core::String* s) → self::Test::T*;
+  abstract operator []=(core::String* s, covariant-by-class self::Test::U* v) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method test1(self::Test<core::int*, core::int*>* t) → void {
+  core::int* v1 = let final self::Test<core::int*, core::int*>* #t1 = t in let final core::String* #t2 = "x" in let final core::int* #t3 = self::getInt() in let final void #t4 = #t1.{self::Test::[]=}(#t2, #t3){(core::String*, core::int*) →* void} in #t3;
+  core::num* v2 = let final self::Test<core::int*, core::int*>* #t5 = t in let final core::String* #t6 = "x" in let final core::num* #t7 = self::getNum() as{TypeError} core::int* in let final void #t8 = #t5.{self::Test::[]=}(#t6, #t7){(core::String*, core::int*) →* void} in #t7;
+  core::int* v4 = let final self::Test<core::int*, core::int*>* #t9 = t in let final core::String* #t10 = "x" in let final core::int* #t11 = #t9.{self::Test::[]}(#t10){(core::String*) →* core::int*} in #t11 == null ?{core::int*} let final core::int* #t12 = self::getInt() in let final void #t13 = #t9.{self::Test::[]=}(#t10, #t12){(core::String*, core::int*) →* void} in #t12 : #t11;
+  core::num* v5 = let final self::Test<core::int*, core::int*>* #t14 = t in let final core::String* #t15 = "x" in let final core::int* #t16 = #t14.{self::Test::[]}(#t15){(core::String*) →* core::int*} in #t16 == null ?{core::num*} let final core::num* #t17 = self::getNum() as{TypeError} core::int* in let final void #t18 = #t14.{self::Test::[]=}(#t15, #t17){(core::String*, core::int*) →* void} in #t17 : #t16;
+  core::int* v7 = let final self::Test<core::int*, core::int*>* #t19 = t in let final core::String* #t20 = "x" in let final core::int* #t21 = #t19.{self::Test::[]}(#t20){(core::String*) →* core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*} in let final void #t22 = #t19.{self::Test::[]=}(#t20, #t21){(core::String*, core::int*) →* void} in #t21;
+  core::num* v8 = let final self::Test<core::int*, core::int*>* #t23 = t in let final core::String* #t24 = "x" in let final core::num* #t25 = #t23.{self::Test::[]}(#t24){(core::String*) →* core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t26 = #t23.{self::Test::[]=}(#t24, #t25){(core::String*, core::int*) →* void} in #t25;
+  core::int* v10 = let final self::Test<core::int*, core::int*>* #t27 = t in let final core::String* #t28 = "x" in let final core::int* #t29 = #t27.{self::Test::[]}(#t28){(core::String*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t30 = #t27.{self::Test::[]=}(#t28, #t29){(core::String*, core::int*) →* void} in #t29;
+  core::int* v11 = let final self::Test<core::int*, core::int*>* #t31 = t in let final core::String* #t32 = "x" in let final core::int* #t33 = #t31.{self::Test::[]}(#t32){(core::String*) →* core::int*} in let final void #t34 = #t31.{self::Test::[]=}(#t32, #t33.{core::num::+}(1){(core::num*) →* core::int*}){(core::String*, core::int*) →* void} in #t33;
+}
+static method test2(self::Test<core::int*, core::num*>* t) → void {
+  core::int* v1 = let final self::Test<core::int*, core::num*>* #t35 = t in let final core::String* #t36 = "x" in let final core::int* #t37 = self::getInt() in let final void #t38 = #t35.{self::Test::[]=}(#t36, #t37){(core::String*, core::num*) →* void} in #t37;
+  core::num* v2 = let final self::Test<core::int*, core::num*>* #t39 = t in let final core::String* #t40 = "x" in let final core::num* #t41 = self::getNum() in let final void #t42 = #t39.{self::Test::[]=}(#t40, #t41){(core::String*, core::num*) →* void} in #t41;
+  core::double* v3 = let final self::Test<core::int*, core::num*>* #t43 = t in let final core::String* #t44 = "x" in let final core::double* #t45 = self::getDouble() in let final void #t46 = #t43.{self::Test::[]=}(#t44, #t45){(core::String*, core::num*) →* void} in #t45;
+  core::int* v4 = let final self::Test<core::int*, core::num*>* #t47 = t in let final core::String* #t48 = "x" in let final core::int* #t49 = #t47.{self::Test::[]}(#t48){(core::String*) →* core::int*} in #t49 == null ?{core::int*} let final core::int* #t50 = self::getInt() in let final void #t51 = #t47.{self::Test::[]=}(#t48, #t50){(core::String*, core::num*) →* void} in #t50 : #t49;
+  core::num* v5 = let final self::Test<core::int*, core::num*>* #t52 = t in let final core::String* #t53 = "x" in let final core::int* #t54 = #t52.{self::Test::[]}(#t53){(core::String*) →* core::int*} in #t54 == null ?{core::num*} let final core::num* #t55 = self::getNum() in let final void #t56 = #t52.{self::Test::[]=}(#t53, #t55){(core::String*, core::num*) →* void} in #t55 : #t54;
+  core::num* v6 = let final self::Test<core::int*, core::num*>* #t57 = t in let final core::String* #t58 = "x" in let final core::int* #t59 = #t57.{self::Test::[]}(#t58){(core::String*) →* core::int*} in #t59 == null ?{core::num*} let final core::double* #t60 = self::getDouble() in let final void #t61 = #t57.{self::Test::[]=}(#t58, #t60){(core::String*, core::num*) →* void} in #t60 : #t59;
+  core::int* v7 = let final self::Test<core::int*, core::num*>* #t62 = t in let final core::String* #t63 = "x" in let final core::int* #t64 = #t62.{self::Test::[]}(#t63){(core::String*) →* core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*} in let final void #t65 = #t62.{self::Test::[]=}(#t63, #t64){(core::String*, core::num*) →* void} in #t64;
+  core::num* v8 = let final self::Test<core::int*, core::num*>* #t66 = t in let final core::String* #t67 = "x" in let final core::num* #t68 = #t66.{self::Test::[]}(#t67){(core::String*) →* core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} in let final void #t69 = #t66.{self::Test::[]=}(#t67, #t68){(core::String*, core::num*) →* void} in #t68;
+  core::double* v9 = let final self::Test<core::int*, core::num*>* #t70 = t in let final core::String* #t71 = "x" in let final core::double* #t72 = #t70.{self::Test::[]}(#t71){(core::String*) →* core::int*}.{core::num::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t73 = #t70.{self::Test::[]=}(#t71, #t72){(core::String*, core::num*) →* void} in #t72;
+  core::int* v10 = let final self::Test<core::int*, core::num*>* #t74 = t in let final core::String* #t75 = "x" in let final core::int* #t76 = #t74.{self::Test::[]}(#t75){(core::String*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t77 = #t74.{self::Test::[]=}(#t75, #t76){(core::String*, core::num*) →* void} in #t76;
+  core::int* v11 = let final self::Test<core::int*, core::num*>* #t78 = t in let final core::String* #t79 = "x" in let final core::int* #t80 = #t78.{self::Test::[]}(#t79){(core::String*) →* core::int*} in let final void #t81 = #t78.{self::Test::[]=}(#t79, #t80.{core::num::+}(1){(core::num*) →* core::int*}){(core::String*, core::num*) →* void} in #t80;
+}
+static method test3(self::Test<core::int*, core::double*>* t) → void {
+  core::num* v2 = let final self::Test<core::int*, core::double*>* #t82 = t in let final core::String* #t83 = "x" in let final core::num* #t84 = self::getNum() as{TypeError} core::double* in let final void #t85 = #t82.{self::Test::[]=}(#t83, #t84){(core::String*, core::double*) →* void} in #t84;
+  core::double* v3 = let final self::Test<core::int*, core::double*>* #t86 = t in let final core::String* #t87 = "x" in let final core::double* #t88 = self::getDouble() in let final void #t89 = #t86.{self::Test::[]=}(#t87, #t88){(core::String*, core::double*) →* void} in #t88;
+  core::num* v5 = let final self::Test<core::int*, core::double*>* #t90 = t in let final core::String* #t91 = "x" in let final core::int* #t92 = #t90.{self::Test::[]}(#t91){(core::String*) →* core::int*} in #t92 == null ?{core::num*} let final core::num* #t93 = self::getNum() as{TypeError} core::double* in let final void #t94 = #t90.{self::Test::[]=}(#t91, #t93){(core::String*, core::double*) →* void} in #t93 : #t92;
+  core::num* v6 = let final self::Test<core::int*, core::double*>* #t95 = t in let final core::String* #t96 = "x" in let final core::int* #t97 = #t95.{self::Test::[]}(#t96){(core::String*) →* core::int*} in #t97 == null ?{core::num*} let final core::double* #t98 = self::getDouble() in let final void #t99 = #t95.{self::Test::[]=}(#t96, #t98){(core::String*, core::double*) →* void} in #t98 : #t97;
+  core::int* v7 = let final self::Test<core::int*, core::double*>* #t100 = t in let final core::String* #t101 = "x" in let final core::int* #t102 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:90:74: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
+                                                                         ^" in #t100.{self::Test::[]}(#t101){(core::String*) →* core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*} as{TypeError} core::double* in let final void #t103 = #t100.{self::Test::[]=}(#t101, #t102){(core::String*, core::double*) →* void} in #t102;
+  core::num* v8 = let final self::Test<core::int*, core::double*>* #t104 = t in let final core::String* #t105 = "x" in let final core::num* #t106 = #t104.{self::Test::[]}(#t105){(core::String*) →* core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t107 = #t104.{self::Test::[]=}(#t105, #t106){(core::String*, core::double*) →* void} in #t106;
+  core::double* v9 = let final self::Test<core::int*, core::double*>* #t108 = t in let final core::String* #t109 = "x" in let final core::double* #t110 = #t108.{self::Test::[]}(#t109){(core::String*) →* core::int*}.{core::num::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t111 = #t108.{self::Test::[]=}(#t109, #t110){(core::String*, core::double*) →* void} in #t110;
+  core::int* v10 = let final self::Test<core::int*, core::double*>* #t112 = t in let final core::String* #t113 = "x" in let final core::int* #t114 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:102:25: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+      /*@target=num.+*/ ++t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];
+                        ^" in #t112.{self::Test::[]}(#t113){(core::String*) →* core::int*}.{core::num::+}(1){(core::num*) →* core::int*} as{TypeError} core::double* in let final void #t115 = #t112.{self::Test::[]=}(#t113, #t114){(core::String*, core::double*) →* void} in #t114;
+  core::int* v11 = let final self::Test<core::int*, core::double*>* #t116 = t in let final core::String* #t117 = "x" in let final core::int* #t118 = #t116.{self::Test::[]}(#t117){(core::String*) →* core::int*} in let final void #t119 = #t116.{self::Test::[]=}(#t117, invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:105:74: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ ++;
+                                                                         ^" in #t118.{core::num::+}(1){(core::num*) →* core::int*} as{TypeError} core::double*){(core::String*, core::double*) →* void} in #t118;
+}
+static method test4(self::Test<core::num*, core::int*>* t) → void {
+  core::int* v1 = let final self::Test<core::num*, core::int*>* #t120 = t in let final core::String* #t121 = "x" in let final core::int* #t122 = self::getInt() in let final void #t123 = #t120.{self::Test::[]=}(#t121, #t122){(core::String*, core::int*) →* void} in #t122;
+  core::num* v2 = let final self::Test<core::num*, core::int*>* #t124 = t in let final core::String* #t125 = "x" in let final core::num* #t126 = self::getNum() as{TypeError} core::int* in let final void #t127 = #t124.{self::Test::[]=}(#t125, #t126){(core::String*, core::int*) →* void} in #t126;
+  core::num* v4 = let final self::Test<core::num*, core::int*>* #t128 = t in let final core::String* #t129 = "x" in let final core::num* #t130 = #t128.{self::Test::[]}(#t129){(core::String*) →* core::num*} in #t130 == null ?{core::num*} let final core::int* #t131 = self::getInt() in let final void #t132 = #t128.{self::Test::[]=}(#t129, #t131){(core::String*, core::int*) →* void} in #t131 : #t130;
+  core::num* v5 = let final self::Test<core::num*, core::int*>* #t133 = t in let final core::String* #t134 = "x" in let final core::num* #t135 = #t133.{self::Test::[]}(#t134){(core::String*) →* core::num*} in #t135 == null ?{core::num*} let final core::num* #t136 = self::getNum() as{TypeError} core::int* in let final void #t137 = #t133.{self::Test::[]=}(#t134, #t136){(core::String*, core::int*) →* void} in #t136 : #t135;
+  core::num* v7 = let final self::Test<core::num*, core::int*>* #t138 = t in let final core::String* #t139 = "x" in let final core::num* #t140 = #t138.{self::Test::[]}(#t139){(core::String*) →* core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t141 = #t138.{self::Test::[]=}(#t139, #t140){(core::String*, core::int*) →* void} in #t140;
+  core::num* v8 = let final self::Test<core::num*, core::int*>* #t142 = t in let final core::String* #t143 = "x" in let final core::num* #t144 = #t142.{self::Test::[]}(#t143){(core::String*) →* core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t145 = #t142.{self::Test::[]=}(#t143, #t144){(core::String*, core::int*) →* void} in #t144;
+  core::num* v10 = let final self::Test<core::num*, core::int*>* #t146 = t in let final core::String* #t147 = "x" in let final core::num* #t148 = #t146.{self::Test::[]}(#t147){(core::String*) →* core::num*}.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t149 = #t146.{self::Test::[]=}(#t147, #t148){(core::String*, core::int*) →* void} in #t148;
+  core::num* v11 = let final self::Test<core::num*, core::int*>* #t150 = t in let final core::String* #t151 = "x" in let final core::num* #t152 = #t150.{self::Test::[]}(#t151){(core::String*) →* core::num*} in let final void #t153 = #t150.{self::Test::[]=}(#t151, #t152.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::int*){(core::String*, core::int*) →* void} in #t152;
+}
+static method test5(self::Test<core::num*, core::num*>* t) → void {
+  core::int* v1 = let final self::Test<core::num*, core::num*>* #t154 = t in let final core::String* #t155 = "x" in let final core::int* #t156 = self::getInt() in let final void #t157 = #t154.{self::Test::[]=}(#t155, #t156){(core::String*, core::num*) →* void} in #t156;
+  core::num* v2 = let final self::Test<core::num*, core::num*>* #t158 = t in let final core::String* #t159 = "x" in let final core::num* #t160 = self::getNum() in let final void #t161 = #t158.{self::Test::[]=}(#t159, #t160){(core::String*, core::num*) →* void} in #t160;
+  core::double* v3 = let final self::Test<core::num*, core::num*>* #t162 = t in let final core::String* #t163 = "x" in let final core::double* #t164 = self::getDouble() in let final void #t165 = #t162.{self::Test::[]=}(#t163, #t164){(core::String*, core::num*) →* void} in #t164;
+  core::num* v4 = let final self::Test<core::num*, core::num*>* #t166 = t in let final core::String* #t167 = "x" in let final core::num* #t168 = #t166.{self::Test::[]}(#t167){(core::String*) →* core::num*} in #t168 == null ?{core::num*} let final core::int* #t169 = self::getInt() in let final void #t170 = #t166.{self::Test::[]=}(#t167, #t169){(core::String*, core::num*) →* void} in #t169 : #t168;
+  core::num* v5 = let final self::Test<core::num*, core::num*>* #t171 = t in let final core::String* #t172 = "x" in let final core::num* #t173 = #t171.{self::Test::[]}(#t172){(core::String*) →* core::num*} in #t173 == null ?{core::num*} let final core::num* #t174 = self::getNum() in let final void #t175 = #t171.{self::Test::[]=}(#t172, #t174){(core::String*, core::num*) →* void} in #t174 : #t173;
+  core::num* v6 = let final self::Test<core::num*, core::num*>* #t176 = t in let final core::String* #t177 = "x" in let final core::num* #t178 = #t176.{self::Test::[]}(#t177){(core::String*) →* core::num*} in #t178 == null ?{core::num*} let final core::double* #t179 = self::getDouble() in let final void #t180 = #t176.{self::Test::[]=}(#t177, #t179){(core::String*, core::num*) →* void} in #t179 : #t178;
+  core::num* v7 = let final self::Test<core::num*, core::num*>* #t181 = t in let final core::String* #t182 = "x" in let final core::num* #t183 = #t181.{self::Test::[]}(#t182){(core::String*) →* core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*} in let final void #t184 = #t181.{self::Test::[]=}(#t182, #t183){(core::String*, core::num*) →* void} in #t183;
+  core::num* v8 = let final self::Test<core::num*, core::num*>* #t185 = t in let final core::String* #t186 = "x" in let final core::num* #t187 = #t185.{self::Test::[]}(#t186){(core::String*) →* core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} in let final void #t188 = #t185.{self::Test::[]=}(#t186, #t187){(core::String*, core::num*) →* void} in #t187;
+  core::num* v9 = let final self::Test<core::num*, core::num*>* #t189 = t in let final core::String* #t190 = "x" in let final core::num* #t191 = #t189.{self::Test::[]}(#t190){(core::String*) →* core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*} in let final void #t192 = #t189.{self::Test::[]=}(#t190, #t191){(core::String*, core::num*) →* void} in #t191;
+  core::num* v10 = let final self::Test<core::num*, core::num*>* #t193 = t in let final core::String* #t194 = "x" in let final core::num* #t195 = #t193.{self::Test::[]}(#t194){(core::String*) →* core::num*}.{core::num::+}(1){(core::num*) →* core::num*} in let final void #t196 = #t193.{self::Test::[]=}(#t194, #t195){(core::String*, core::num*) →* void} in #t195;
+  core::num* v11 = let final self::Test<core::num*, core::num*>* #t197 = t in let final core::String* #t198 = "x" in let final core::num* #t199 = #t197.{self::Test::[]}(#t198){(core::String*) →* core::num*} in let final void #t200 = #t197.{self::Test::[]=}(#t198, #t199.{core::num::+}(1){(core::num*) →* core::num*}){(core::String*, core::num*) →* void} in #t199;
+}
+static method test6(self::Test<core::num*, core::double*>* t) → void {
+  core::num* v2 = let final self::Test<core::num*, core::double*>* #t201 = t in let final core::String* #t202 = "x" in let final core::num* #t203 = self::getNum() as{TypeError} core::double* in let final void #t204 = #t201.{self::Test::[]=}(#t202, #t203){(core::String*, core::double*) →* void} in #t203;
+  core::double* v3 = let final self::Test<core::num*, core::double*>* #t205 = t in let final core::String* #t206 = "x" in let final core::double* #t207 = self::getDouble() in let final void #t208 = #t205.{self::Test::[]=}(#t206, #t207){(core::String*, core::double*) →* void} in #t207;
+  core::num* v5 = let final self::Test<core::num*, core::double*>* #t209 = t in let final core::String* #t210 = "x" in let final core::num* #t211 = #t209.{self::Test::[]}(#t210){(core::String*) →* core::num*} in #t211 == null ?{core::num*} let final core::num* #t212 = self::getNum() as{TypeError} core::double* in let final void #t213 = #t209.{self::Test::[]=}(#t210, #t212){(core::String*, core::double*) →* void} in #t212 : #t211;
+  core::num* v6 = let final self::Test<core::num*, core::double*>* #t214 = t in let final core::String* #t215 = "x" in let final core::num* #t216 = #t214.{self::Test::[]}(#t215){(core::String*) →* core::num*} in #t216 == null ?{core::num*} let final core::double* #t217 = self::getDouble() in let final void #t218 = #t214.{self::Test::[]=}(#t215, #t217){(core::String*, core::double*) →* void} in #t217 : #t216;
+  core::num* v7 = let final self::Test<core::num*, core::double*>* #t219 = t in let final core::String* #t220 = "x" in let final core::num* #t221 = #t219.{self::Test::[]}(#t220){(core::String*) →* core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t222 = #t219.{self::Test::[]=}(#t220, #t221){(core::String*, core::double*) →* void} in #t221;
+  core::num* v8 = let final self::Test<core::num*, core::double*>* #t223 = t in let final core::String* #t224 = "x" in let final core::num* #t225 = #t223.{self::Test::[]}(#t224){(core::String*) →* core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t226 = #t223.{self::Test::[]=}(#t224, #t225){(core::String*, core::double*) →* void} in #t225;
+  core::num* v9 = let final self::Test<core::num*, core::double*>* #t227 = t in let final core::String* #t228 = "x" in let final core::num* #t229 = #t227.{self::Test::[]}(#t228){(core::String*) →* core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t230 = #t227.{self::Test::[]=}(#t228, #t229){(core::String*, core::double*) →* void} in #t229;
+  core::num* v10 = let final self::Test<core::num*, core::double*>* #t231 = t in let final core::String* #t232 = "x" in let final core::num* #t233 = #t231.{self::Test::[]}(#t232){(core::String*) →* core::num*}.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::double* in let final void #t234 = #t231.{self::Test::[]=}(#t232, #t233){(core::String*, core::double*) →* void} in #t233;
+  core::num* v11 = let final self::Test<core::num*, core::double*>* #t235 = t in let final core::String* #t236 = "x" in let final core::num* #t237 = #t235.{self::Test::[]}(#t236){(core::String*) →* core::num*} in let final void #t238 = #t235.{self::Test::[]=}(#t236, #t237.{core::num::+}(1){(core::num*) →* core::num*} as{TypeError} core::double*){(core::String*, core::double*) →* void} in #t237;
+}
+static method test7(self::Test<core::double*, core::int*>* t) → void {
+  core::int* v1 = let final self::Test<core::double*, core::int*>* #t239 = t in let final core::String* #t240 = "x" in let final core::int* #t241 = self::getInt() in let final void #t242 = #t239.{self::Test::[]=}(#t240, #t241){(core::String*, core::int*) →* void} in #t241;
+  core::num* v2 = let final self::Test<core::double*, core::int*>* #t243 = t in let final core::String* #t244 = "x" in let final core::num* #t245 = self::getNum() as{TypeError} core::int* in let final void #t246 = #t243.{self::Test::[]=}(#t244, #t245){(core::String*, core::int*) →* void} in #t245;
+  core::num* v4 = let final self::Test<core::double*, core::int*>* #t247 = t in let final core::String* #t248 = "x" in let final core::double* #t249 = #t247.{self::Test::[]}(#t248){(core::String*) →* core::double*} in #t249 == null ?{core::num*} let final core::int* #t250 = self::getInt() in let final void #t251 = #t247.{self::Test::[]=}(#t248, #t250){(core::String*, core::int*) →* void} in #t250 : #t249;
+  core::num* v5 = let final self::Test<core::double*, core::int*>* #t252 = t in let final core::String* #t253 = "x" in let final core::double* #t254 = #t252.{self::Test::[]}(#t253){(core::String*) →* core::double*} in #t254 == null ?{core::num*} let final core::num* #t255 = self::getNum() as{TypeError} core::int* in let final void #t256 = #t252.{self::Test::[]=}(#t253, #t255){(core::String*, core::int*) →* void} in #t255 : #t254;
+  core::double* v7 = let final self::Test<core::double*, core::int*>* #t257 = t in let final core::String* #t258 = "x" in let final core::double* #t259 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:211:77: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
+                                                                            ^" in #t257.{self::Test::[]}(#t258){(core::String*) →* core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t260 = #t257.{self::Test::[]=}(#t258, #t259){(core::String*, core::int*) →* void} in #t259;
+  core::double* v8 = let final self::Test<core::double*, core::int*>* #t261 = t in let final core::String* #t262 = "x" in let final core::double* #t263 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:215:77: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
+                                                                            ^" in #t261.{self::Test::[]}(#t262){(core::String*) →* core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t264 = #t261.{self::Test::[]=}(#t262, #t263){(core::String*, core::int*) →* void} in #t263;
+  core::double* v10 = let final self::Test<core::double*, core::int*>* #t265 = t in let final core::String* #t266 = "x" in let final core::double* #t267 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:219:28: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+      /*@target=double.+*/ ++t
+                           ^" in #t265.{self::Test::[]}(#t266){(core::String*) →* core::double*}.{core::double::+}(1){(core::num*) →* core::double*} as{TypeError} core::int* in let final void #t268 = #t265.{self::Test::[]=}(#t266, #t267){(core::String*, core::int*) →* void} in #t267;
+  core::double* v11 = let final self::Test<core::double*, core::int*>* #t269 = t in let final core::String* #t270 = "x" in let final core::double* #t271 = #t269.{self::Test::[]}(#t270){(core::String*) →* core::double*} in let final void #t272 = #t269.{self::Test::[]=}(#t270, invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:223:77: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ ++;
+                                                                            ^" in #t271.{core::double::+}(1){(core::num*) →* core::double*} as{TypeError} core::int*){(core::String*, core::int*) →* void} in #t271;
+}
+static method test8(self::Test<core::double*, core::num*>* t) → void {
+  core::int* v1 = let final self::Test<core::double*, core::num*>* #t273 = t in let final core::String* #t274 = "x" in let final core::int* #t275 = self::getInt() in let final void #t276 = #t273.{self::Test::[]=}(#t274, #t275){(core::String*, core::num*) →* void} in #t275;
+  core::num* v2 = let final self::Test<core::double*, core::num*>* #t277 = t in let final core::String* #t278 = "x" in let final core::num* #t279 = self::getNum() in let final void #t280 = #t277.{self::Test::[]=}(#t278, #t279){(core::String*, core::num*) →* void} in #t279;
+  core::double* v3 = let final self::Test<core::double*, core::num*>* #t281 = t in let final core::String* #t282 = "x" in let final core::double* #t283 = self::getDouble() in let final void #t284 = #t281.{self::Test::[]=}(#t282, #t283){(core::String*, core::num*) →* void} in #t283;
+  core::num* v4 = let final self::Test<core::double*, core::num*>* #t285 = t in let final core::String* #t286 = "x" in let final core::double* #t287 = #t285.{self::Test::[]}(#t286){(core::String*) →* core::double*} in #t287 == null ?{core::num*} let final core::int* #t288 = self::getInt() in let final void #t289 = #t285.{self::Test::[]=}(#t286, #t288){(core::String*, core::num*) →* void} in #t288 : #t287;
+  core::num* v5 = let final self::Test<core::double*, core::num*>* #t290 = t in let final core::String* #t291 = "x" in let final core::double* #t292 = #t290.{self::Test::[]}(#t291){(core::String*) →* core::double*} in #t292 == null ?{core::num*} let final core::num* #t293 = self::getNum() in let final void #t294 = #t290.{self::Test::[]=}(#t291, #t293){(core::String*, core::num*) →* void} in #t293 : #t292;
+  core::double* v6 = let final self::Test<core::double*, core::num*>* #t295 = t in let final core::String* #t296 = "x" in let final core::double* #t297 = #t295.{self::Test::[]}(#t296){(core::String*) →* core::double*} in #t297 == null ?{core::double*} let final core::double* #t298 = self::getDouble() in let final void #t299 = #t295.{self::Test::[]=}(#t296, #t298){(core::String*, core::num*) →* void} in #t298 : #t297;
+  core::double* v7 = let final self::Test<core::double*, core::num*>* #t300 = t in let final core::String* #t301 = "x" in let final core::double* #t302 = #t300.{self::Test::[]}(#t301){(core::String*) →* core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*} in let final void #t303 = #t300.{self::Test::[]=}(#t301, #t302){(core::String*, core::num*) →* void} in #t302;
+  core::double* v8 = let final self::Test<core::double*, core::num*>* #t304 = t in let final core::String* #t305 = "x" in let final core::double* #t306 = #t304.{self::Test::[]}(#t305){(core::String*) →* core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*} in let final void #t307 = #t304.{self::Test::[]=}(#t305, #t306){(core::String*, core::num*) →* void} in #t306;
+  core::double* v9 = let final self::Test<core::double*, core::num*>* #t308 = t in let final core::String* #t309 = "x" in let final core::double* #t310 = #t308.{self::Test::[]}(#t309){(core::String*) →* core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t311 = #t308.{self::Test::[]=}(#t309, #t310){(core::String*, core::num*) →* void} in #t310;
+  core::double* v10 = let final self::Test<core::double*, core::num*>* #t312 = t in let final core::String* #t313 = "x" in let final core::double* #t314 = #t312.{self::Test::[]}(#t313){(core::String*) →* core::double*}.{core::double::+}(1){(core::num*) →* core::double*} in let final void #t315 = #t312.{self::Test::[]=}(#t313, #t314){(core::String*, core::num*) →* void} in #t314;
+  core::double* v11 = let final self::Test<core::double*, core::num*>* #t316 = t in let final core::String* #t317 = "x" in let final core::double* #t318 = #t316.{self::Test::[]}(#t317){(core::String*) →* core::double*} in let final void #t319 = #t316.{self::Test::[]=}(#t317, #t318.{core::double::+}(1){(core::num*) →* core::double*}){(core::String*, core::num*) →* void} in #t318;
+}
+static method test9(self::Test<core::double*, core::double*>* t) → void {
+  core::num* v2 = let final self::Test<core::double*, core::double*>* #t320 = t in let final core::String* #t321 = "x" in let final core::num* #t322 = self::getNum() as{TypeError} core::double* in let final void #t323 = #t320.{self::Test::[]=}(#t321, #t322){(core::String*, core::double*) →* void} in #t322;
+  core::double* v3 = let final self::Test<core::double*, core::double*>* #t324 = t in let final core::String* #t325 = "x" in let final core::double* #t326 = self::getDouble() in let final void #t327 = #t324.{self::Test::[]=}(#t325, #t326){(core::String*, core::double*) →* void} in #t326;
+  core::num* v5 = let final self::Test<core::double*, core::double*>* #t328 = t in let final core::String* #t329 = "x" in let final core::double* #t330 = #t328.{self::Test::[]}(#t329){(core::String*) →* core::double*} in #t330 == null ?{core::num*} let final core::num* #t331 = self::getNum() as{TypeError} core::double* in let final void #t332 = #t328.{self::Test::[]=}(#t329, #t331){(core::String*, core::double*) →* void} in #t331 : #t330;
+  core::double* v6 = let final self::Test<core::double*, core::double*>* #t333 = t in let final core::String* #t334 = "x" in let final core::double* #t335 = #t333.{self::Test::[]}(#t334){(core::String*) →* core::double*} in #t335 == null ?{core::double*} let final core::double* #t336 = self::getDouble() in let final void #t337 = #t333.{self::Test::[]=}(#t334, #t336){(core::String*, core::double*) →* void} in #t336 : #t335;
+  core::double* v7 = let final self::Test<core::double*, core::double*>* #t338 = t in let final core::String* #t339 = "x" in let final core::double* #t340 = #t338.{self::Test::[]}(#t339){(core::String*) →* core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*} in let final void #t341 = #t338.{self::Test::[]=}(#t339, #t340){(core::String*, core::double*) →* void} in #t340;
+  core::double* v8 = let final self::Test<core::double*, core::double*>* #t342 = t in let final core::String* #t343 = "x" in let final core::double* #t344 = #t342.{self::Test::[]}(#t343){(core::String*) →* core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*} in let final void #t345 = #t342.{self::Test::[]=}(#t343, #t344){(core::String*, core::double*) →* void} in #t344;
+  core::double* v9 = let final self::Test<core::double*, core::double*>* #t346 = t in let final core::String* #t347 = "x" in let final core::double* #t348 = #t346.{self::Test::[]}(#t347){(core::String*) →* core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t349 = #t346.{self::Test::[]=}(#t347, #t348){(core::String*, core::double*) →* void} in #t348;
+  core::double* v10 = let final self::Test<core::double*, core::double*>* #t350 = t in let final core::String* #t351 = "x" in let final core::double* #t352 = #t350.{self::Test::[]}(#t351){(core::String*) →* core::double*}.{core::double::+}(1){(core::num*) →* core::double*} in let final void #t353 = #t350.{self::Test::[]=}(#t351, #t352){(core::String*, core::double*) →* void} in #t352;
+  core::double* v11 = let final self::Test<core::double*, core::double*>* #t354 = t in let final core::String* #t355 = "x" in let final core::double* #t356 = #t354.{self::Test::[]}(#t355){(core::String*) →* core::double*} in let final void #t357 = #t354.{self::Test::[]=}(#t355, #t356.{core::double::+}(1){(core::num*) →* core::double*}){(core::String*, core::double*) →* void} in #t356;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.weak.modular.expect
new file mode 100644
index 0000000..5bdc052
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → void {
+  self::B* local;
+  local = self::f<self::B*>();
+  local == null ?{self::B*} local = self::f<self::B*>() : null;
+  local = local.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  local = local.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  local = local.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  local = local.{self::B::-}(1){(core::int*) →* self::B*};
+  local = local.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v1 = local = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = local in #t1 == null ?{self::B*} local = self::f<self::B*>() : #t1;
+  self::A* v3 = local = local.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::B* v4 = local = local.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::C* v5 = local = local.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::B* v6 = local = local.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v7 = let final self::B* #t2 = local in let final self::B* #t3 = local = #t2.{self::B::-}(1){(core::int*) →* self::B*} in #t2;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..9e55829
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method test1(core::int* t) → void {
+  core::int* v1 = t = self::getInt();
+  core::num* v2 = t = self::getNum() as{TypeError} core::int*;
+  core::int* v4 = let final core::int* #t1 = t in #t1 == null ?{core::int*} t = self::getInt() : #t1;
+  core::num* v5 = let final core::int* #t2 = t in #t2 == null ?{core::num*} t = self::getNum() as{TypeError} core::int* : #t2;
+  core::int* v7 = t = t.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+  core::num* v8 = t = t.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int*;
+  core::int* v10 = t = t.{core::num::+}(1){(core::num*) →* core::int*};
+  core::int* v11 = let final core::int* #t3 = t in let final core::int* #t4 = t = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3;
+}
+static method test2(core::num* t) → void {
+  core::int* v1 = t = self::getInt();
+  core::num* v2 = t = self::getNum();
+  core::double* v3 = t = self::getDouble();
+  core::num* v4 = let final core::num* #t5 = t in #t5 == null ?{core::num*} t = self::getInt() : #t5;
+  core::num* v5 = let final core::num* #t6 = t in #t6 == null ?{core::num*} t = self::getNum() : #t6;
+  core::num* v6 = let final core::num* #t7 = t in #t7 == null ?{core::num*} t = self::getDouble() : #t7;
+  core::num* v7 = t = t.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+  core::num* v8 = t = t.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+  core::num* v9 = t = t.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+  core::num* v10 = t = t.{core::num::+}(1){(core::num*) →* core::num*};
+  core::num* v11 = let final core::num* #t8 = t in let final core::num* #t9 = t = #t8.{core::num::+}(1){(core::num*) →* core::num*} in #t8;
+}
+static method test3(core::double* t) → void {
+  core::num* v2 = t = self::getNum() as{TypeError} core::double*;
+  core::double* v3 = t = self::getDouble();
+  core::num* v5 = let final core::double* #t10 = t in #t10 == null ?{core::num*} t = self::getNum() as{TypeError} core::double* : #t10;
+  core::double* v6 = let final core::double* #t11 = t in #t11 == null ?{core::double*} t = self::getDouble() : #t11;
+  core::double* v7 = t = t.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+  core::double* v8 = t = t.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+  core::double* v9 = t = t.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+  core::double* v10 = t = t.{core::double::+}(1){(core::num*) →* core::double*};
+  core::double* v11 = let final core::double* #t12 = t in let final core::double* #t13 = t = #t12.{core::double::+}(1){(core::num*) →* core::double*} in #t12;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.weak.modular.expect
new file mode 100644
index 0000000..6ae0089
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* v_assign = new self::A::•().{self::A::f} = 1;
+static field core::int* v_plus = let final self::A* #t1 = new self::A::•() in #t1.{self::A::f} = #t1.{self::A::f}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+static field core::int* v_minus = let final self::A* #t2 = new self::A::•() in #t2.{self::A::f} = #t2.{self::A::f}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
+static field core::int* v_multiply = let final self::A* #t3 = new self::A::•() in #t3.{self::A::f} = #t3.{self::A::f}{core::int*}.{core::num::*}(1){(core::num*) →* core::int*};
+static field core::int* v_prefix_pp = let final self::A* #t4 = new self::A::•() in #t4.{self::A::f} = #t4.{self::A::f}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+static field core::int* v_prefix_mm = let final self::A* #t5 = new self::A::•() in #t5.{self::A::f} = #t5.{self::A::f}{core::int*}.{core::num::-}(1){(core::num*) →* core::int*};
+static field core::int* v_postfix_pp = let final self::A* #t6 = new self::A::•() in let final core::int* #t7 = #t6.{self::A::f}{core::int*} in let final core::int* #t8 = #t6.{self::A::f} = #t7.{core::num::+}(1){(core::num*) →* core::int*} in #t7;
+static field core::int* v_postfix_mm = let final self::A* #t9 = new self::A::•() in let final core::int* #t10 = #t9.{self::A::f}{core::int*} in let final core::int* #t11 = #t9.{self::A::f} = #t10.{core::num::-}(1){(core::num*) →* core::int*} in #t10;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.weak.modular.expect
new file mode 100644
index 0000000..1bf4996
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:36: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+// var v_prefix_pp = (/*@target=A.+*/ ++new /*@ type=B* */ B()
+//                                    ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:36: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+// var v_prefix_mm = (/*@target=A.-*/ --new /*@ type=B* */ B()
+//                                    ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:23:40: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+//     /*@ type=int* */ a /*@target=A.+*/ ++);
+//                                        ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:26:43: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+//     /*@ type=double* */ a /*@target=A.-*/ --);
+//                                           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → core::int*
+    return 1;
+  operator -(dynamic other) → core::double*
+    return 2.0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  field self::A* a = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::int* v_prefix_pp = let final self::B* #t1 = new self::B::•() in #t1.{self::B::a} = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:36: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+var v_prefix_pp = (/*@target=A.+*/ ++new /*@ type=B* */ B()
+                                   ^" in #t1.{self::B::a}{self::A*}.{self::A::+}(1){(dynamic) →* core::int*} as{TypeError} self::A*;
+static field core::double* v_prefix_mm = let final self::B* #t2 = new self::B::•() in #t2.{self::B::a} = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:36: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+var v_prefix_mm = (/*@target=A.-*/ --new /*@ type=B* */ B()
+                                   ^" in #t2.{self::B::a}{self::A*}.{self::A::-}(1){(dynamic) →* core::double*} as{TypeError} self::A*;
+static field self::A* v_postfix_pp = let final self::B* #t3 = new self::B::•() in let final self::A* #t4 = #t3.{self::B::a}{self::A*} in let final core::int* #t5 = #t3.{self::B::a} = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:23:40: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+    /*@ type=int* */ a /*@target=A.+*/ ++);
+                                       ^" in #t4.{self::A::+}(1){(dynamic) →* core::int*} as{TypeError} self::A* in #t4;
+static field self::A* v_postfix_mm = let final self::B* #t6 = new self::B::•() in let final self::A* #t7 = #t6.{self::B::a}{self::A*} in let final core::double* #t8 = #t6.{self::B::a} = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:26:43: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+    /*@ type=double* */ a /*@target=A.-*/ --);
+                                          ^" in #t7.{self::A::-}(1){(dynamic) →* core::double*} as{TypeError} self::A* in #t7;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.weak.modular.expect
new file mode 100644
index 0000000..2e41284
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  static method test(self::Test* t) → void {
+    t.{self::Test::member} = self::f<self::B*>();
+    let final self::Test* #t1 = t in #t1.{self::Test::member}{self::B*} == null ?{self::B*} #t1.{self::Test::member} = self::f<self::B*>() : null;
+    let final self::Test* #t2 = t in #t2.{self::Test::member} = #t2.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    let final self::Test* #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    let final self::Test* #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    let final self::Test* #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    let final self::Test* #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v1 = t.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::Test* #t7 = t in let final self::B* #t8 = #t7.{self::Test::member}{self::B*} in #t8 == null ?{self::B*} #t7.{self::Test::member} = self::f<self::B*>() : #t8;
+    self::A* v3 = let final self::Test* #t9 = t in #t9.{self::Test::member} = #t9.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    self::B* v4 = let final self::Test* #t10 = t in #t10.{self::Test::member} = #t10.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    self::C* v5 = let final self::Test* #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    self::B* v6 = let final self::Test* #t12 = t in #t12.{self::Test::member} = #t12.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v7 = let final self::Test* #t13 = t in let final self::B* #t14 = #t13.{self::Test::member}{self::B*} in let final self::B* #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1){(core::int*) →* self::B*} in #t14;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.weak.modular.expect
new file mode 100644
index 0000000..681f9aa
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Test extends core::Object {
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
+    : super core::Object::•()
+    ;
+  static method test(self::Test* t) → void {
+    let final self::Test* #t1 = t in #t1 == null ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
+    let final self::Test* #t2 = t in #t2 == null ?{self::B*} null : #t2.{self::Test::member}{self::B*} == null ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
+    let final self::Test* #t3 = t in #t3 == null ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    let final self::Test* #t4 = t in #t4 == null ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    let final self::Test* #t5 = t in #t5 == null ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    let final self::Test* #t6 = t in #t6 == null ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
+    let final self::Test* #t9 = t in #t9 == null ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v1 = let final self::Test* #t10 = t in #t10 == null ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::Test* #t11 = t in #t11 == null ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member}{self::B*} in #t12 == null ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
+    self::A* v3 = let final self::Test* #t13 = t in #t13 == null ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}{self::B*}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
+    self::B* v4 = let final self::Test* #t16 = t in #t16 == null ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}{self::B*}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*} in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
+    self::C* v5 = let final self::Test* #t19 = t in #t19 == null ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}{self::B*}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*} in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
+    self::B* v6 = let final self::Test* #t22 = t in #t22 == null ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}{self::B*}.{self::B::-}(1){(core::int*) →* self::B*} in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
+    self::B* v7 = let final self::Test* #t25 = t in #t25 == null ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member}{self::B*} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1){(core::int*) →* self::B*} in #t26;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..1e360b8
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Test1 extends core::Object {
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
+    : super core::Object::•()
+    ;
+  static method test(self::Test1* t) → void {
+    core::int* v1 = let final self::Test1* #t1 = t in #t1 == null ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
+    core::num* v2 = let final self::Test1* #t2 = t in #t2 == null ?{core::num*} null : #t2.{self::Test1::prop} = self::getNum() as{TypeError} core::int*;
+    core::int* v4 = let final self::Test1* #t3 = t in #t3 == null ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop}{core::int*} in #t4 == null ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
+    core::num* v5 = let final self::Test1* #t5 = t in #t5 == null ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop}{core::int*} in #t6 == null ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
+    core::int* v7 = let final self::Test1* #t7 = t in #t7 == null ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}{core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*} in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
+    core::num* v8 = let final self::Test1* #t10 = t in #t10 == null ?{core::num*} null : let final core::num* #t11 = #t10.{self::Test1::prop}{core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int* in let final void #t12 = #t10.{self::Test1::prop} = #t11 in #t11;
+    core::int* v10 = let final self::Test1* #t13 = t in #t13 == null ?{core::int*} null : let final core::int* #t14 = #t13.{self::Test1::prop}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*} in let final void #t15 = #t13.{self::Test1::prop} = #t14 in #t14;
+    core::int* v11 = let final self::Test1* #t16 = t in #t16 == null ?{core::int*} null : let final core::int* #t17 = #t16.{self::Test1::prop}{core::int*} in let final void #t18 = #t16.{self::Test1::prop} = #t17.{core::num::+}(1){(core::num*) →* core::int*} in #t17;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test2 extends core::Object {
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
+    : super core::Object::•()
+    ;
+  static method test(self::Test2* t) → void {
+    core::int* v1 = let final self::Test2* #t19 = t in #t19 == null ?{core::int*} null : #t19.{self::Test2::prop} = self::getInt();
+    core::num* v2 = let final self::Test2* #t20 = t in #t20 == null ?{core::num*} null : #t20.{self::Test2::prop} = self::getNum();
+    core::double* v3 = let final self::Test2* #t21 = t in #t21 == null ?{core::double*} null : #t21.{self::Test2::prop} = self::getDouble();
+    core::num* v4 = let final self::Test2* #t22 = t in #t22 == null ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop}{core::num*} in #t23 == null ?{core::num*} #t22.{self::Test2::prop} = self::getInt() : #t23;
+    core::num* v5 = let final self::Test2* #t24 = t in #t24 == null ?{core::num*} null : let final core::num* #t25 = #t24.{self::Test2::prop}{core::num*} in #t25 == null ?{core::num*} #t24.{self::Test2::prop} = self::getNum() : #t25;
+    core::num* v6 = let final self::Test2* #t26 = t in #t26 == null ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop}{core::num*} in #t27 == null ?{core::num*} #t26.{self::Test2::prop} = self::getDouble() : #t27;
+    core::num* v7 = let final self::Test2* #t28 = t in #t28 == null ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}{core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*} in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
+    core::num* v8 = let final self::Test2* #t31 = t in #t31 == null ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}{core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
+    core::num* v9 = let final self::Test2* #t34 = t in #t34 == null ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop}{core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*} in let final void #t36 = #t34.{self::Test2::prop} = #t35 in #t35;
+    core::num* v10 = let final self::Test2* #t37 = t in #t37 == null ?{core::num*} null : let final core::num* #t38 = #t37.{self::Test2::prop}{core::num*}.{core::num::+}(1){(core::num*) →* core::num*} in let final void #t39 = #t37.{self::Test2::prop} = #t38 in #t38;
+    core::num* v11 = let final self::Test2* #t40 = t in #t40 == null ?{core::num*} null : let final core::num* #t41 = #t40.{self::Test2::prop}{core::num*} in let final void #t42 = #t40.{self::Test2::prop} = #t41.{core::num::+}(1){(core::num*) →* core::num*} in #t41;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test3 extends core::Object {
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
+    : super core::Object::•()
+    ;
+  static method test3(self::Test3* t) → void {
+    core::num* v2 = let final self::Test3* #t43 = t in #t43 == null ?{core::num*} null : #t43.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
+    core::double* v3 = let final self::Test3* #t44 = t in #t44 == null ?{core::double*} null : #t44.{self::Test3::prop} = self::getDouble();
+    core::num* v5 = let final self::Test3* #t45 = t in #t45 == null ?{core::num*} null : let final core::double* #t46 = #t45.{self::Test3::prop}{core::double*} in #t46 == null ?{core::num*} #t45.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t46;
+    core::double* v6 = let final self::Test3* #t47 = t in #t47 == null ?{core::double*} null : let final core::double* #t48 = #t47.{self::Test3::prop}{core::double*} in #t48 == null ?{core::double*} #t47.{self::Test3::prop} = self::getDouble() : #t48;
+    core::double* v7 = let final self::Test3* #t49 = t in #t49 == null ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}{core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*} in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
+    core::double* v8 = let final self::Test3* #t52 = t in #t52 == null ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop}{core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*} in let final void #t54 = #t52.{self::Test3::prop} = #t53 in #t53;
+    core::double* v9 = let final self::Test3* #t55 = t in #t55 == null ?{core::double*} null : let final core::double* #t56 = #t55.{self::Test3::prop}{core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*} in let final void #t57 = #t55.{self::Test3::prop} = #t56 in #t56;
+    core::double* v10 = let final self::Test3* #t58 = t in #t58 == null ?{core::double*} null : let final core::double* #t59 = #t58.{self::Test3::prop}{core::double*}.{core::double::+}(1){(core::num*) →* core::double*} in let final void #t60 = #t58.{self::Test3::prop} = #t59 in #t59;
+    core::double* v11 = let final self::Test3* #t61 = t in #t61 == null ?{core::double*} null : let final core::double* #t62 = #t61.{self::Test3::prop}{core::double*} in let final void #t63 = #t61.{self::Test3::prop} = #t62.{core::double::+}(1){(core::num*) →* core::double*} in #t62;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.weak.modular.expect
new file mode 100644
index 0000000..28b3433
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class Base extends core::Object {
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test extends self::Base {
+  synthetic constructor •() → self::Test*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    super.{self::Base::member} = self::f<self::B*>();
+    super.{self::Base::member} == null ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : null;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1){(core::int*) →* self::B*};
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v1 = super.{self::Base::member} = self::f<self::B*>();
+    self::B* v2 = let final self::B* #t1 = super.{self::Base::member} in #t1 == null ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : #t1;
+    self::A* v3 = super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+    self::B* v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+    self::C* v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+    self::B* v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1){(core::int*) →* self::B*};
+    self::B* v7 = let final self::B* #t2 = super.{self::Base::member} in let final self::B* #t3 = super.{self::Base::member} = #t2.{self::B::-}(1){(core::int*) →* self::B*} in #t2;
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..4dec3f9
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.weak.modular.expect
@@ -0,0 +1,78 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test1 extends self::Base {
+  synthetic constructor •() → self::Test1*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = super.{self::Base::intProp} = self::getInt();
+    core::num* v2 = super.{self::Base::intProp} = self::getNum() as{TypeError} core::int*;
+    core::int* v4 = let final core::int* #t1 = super.{self::Base::intProp} in #t1 == null ?{core::int*} super.{self::Base::intProp} = self::getInt() : #t1;
+    core::num* v5 = let final core::int* #t2 = super.{self::Base::intProp} in #t2 == null ?{core::num*} super.{self::Base::intProp} = self::getNum() as{TypeError} core::int* : #t2;
+    core::int* v7 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+    core::num* v8 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int*;
+    core::int* v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1){(core::num*) →* core::int*};
+    core::int* v11 = let final core::int* #t3 = super.{self::Base::intProp} in let final core::int* #t4 = super.{self::Base::intProp} = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3;
+  }
+}
+class Test2 extends self::Base {
+  synthetic constructor •() → self::Test2*
+    : super self::Base::•()
+    ;
+  method test() → void {
+    core::int* v1 = super.{self::Base::numProp} = self::getInt();
+    core::num* v2 = super.{self::Base::numProp} = self::getNum();
+    core::double* v3 = super.{self::Base::numProp} = self::getDouble();
+    core::num* v4 = let final core::num* #t5 = super.{self::Base::numProp} in #t5 == null ?{core::num*} super.{self::Base::numProp} = self::getInt() : #t5;
+    core::num* v5 = let final core::num* #t6 = super.{self::Base::numProp} in #t6 == null ?{core::num*} super.{self::Base::numProp} = self::getNum() : #t6;
+    core::num* v6 = let final core::num* #t7 = super.{self::Base::numProp} in #t7 == null ?{core::num*} super.{self::Base::numProp} = self::getDouble() : #t7;
+    core::num* v7 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+    core::num* v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+    core::num* v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+    core::num* v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1){(core::num*) →* core::num*};
+    core::num* v11 = let final core::num* #t8 = super.{self::Base::numProp} in let final core::num* #t9 = super.{self::Base::numProp} = #t8.{core::num::+}(1){(core::num*) →* core::num*} in #t8;
+  }
+}
+class Test3 extends self::Base {
+  synthetic constructor •() → self::Test3*
+    : super self::Base::•()
+    ;
+  method test3() → void {
+    core::num* v2 = super.{self::Base::doubleProp} = self::getNum() as{TypeError} core::double*;
+    core::double* v3 = super.{self::Base::doubleProp} = self::getDouble();
+    core::num* v5 = let final core::double* #t10 = super.{self::Base::doubleProp} in #t10 == null ?{core::num*} super.{self::Base::doubleProp} = self::getNum() as{TypeError} core::double* : #t10;
+    core::double* v6 = let final core::double* #t11 = super.{self::Base::doubleProp} in #t11 == null ?{core::double*} super.{self::Base::doubleProp} = self::getDouble() : #t11;
+    core::double* v7 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+    core::double* v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+    core::double* v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+    core::double* v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1){(core::num*) →* core::double*};
+    core::double* v11 = let final core::double* #t12 = super.{self::Base::doubleProp} in let final core::double* #t13 = super.{self::Base::doubleProp} = #t12.{core::double::+}(1){(core::num*) →* core::double*} in #t12;
+  }
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..f994d28
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Test1 extends core::Object {
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
+    : super core::Object::•()
+    ;
+  static method test(self::Test1* t) → void {
+    core::int* v1 = t.{self::Test1::prop} = self::getInt();
+    core::num* v2 = t.{self::Test1::prop} = self::getNum() as{TypeError} core::int*;
+    core::int* v4 = let final self::Test1* #t1 = t in let final core::int* #t2 = #t1.{self::Test1::prop}{core::int*} in #t2 == null ?{core::int*} #t1.{self::Test1::prop} = self::getInt() : #t2;
+    core::num* v5 = let final self::Test1* #t3 = t in let final core::int* #t4 = #t3.{self::Test1::prop}{core::int*} in #t4 == null ?{core::num*} #t3.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t4;
+    core::int* v7 = let final self::Test1* #t5 = t in #t5.{self::Test1::prop} = #t5.{self::Test1::prop}{core::int*}.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+    core::num* v8 = let final self::Test1* #t6 = t in #t6.{self::Test1::prop} = #t6.{self::Test1::prop}{core::int*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int*;
+    core::int* v10 = let final self::Test1* #t7 = t in #t7.{self::Test1::prop} = #t7.{self::Test1::prop}{core::int*}.{core::num::+}(1){(core::num*) →* core::int*};
+    core::int* v11 = let final self::Test1* #t8 = t in let final core::int* #t9 = #t8.{self::Test1::prop}{core::int*} in let final core::int* #t10 = #t8.{self::Test1::prop} = #t9.{core::num::+}(1){(core::num*) →* core::int*} in #t9;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test2 extends core::Object {
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
+    : super core::Object::•()
+    ;
+  static method test(self::Test2* t) → void {
+    core::int* v1 = t.{self::Test2::prop} = self::getInt();
+    core::num* v2 = t.{self::Test2::prop} = self::getNum();
+    core::double* v3 = t.{self::Test2::prop} = self::getDouble();
+    core::num* v4 = let final self::Test2* #t11 = t in let final core::num* #t12 = #t11.{self::Test2::prop}{core::num*} in #t12 == null ?{core::num*} #t11.{self::Test2::prop} = self::getInt() : #t12;
+    core::num* v5 = let final self::Test2* #t13 = t in let final core::num* #t14 = #t13.{self::Test2::prop}{core::num*} in #t14 == null ?{core::num*} #t13.{self::Test2::prop} = self::getNum() : #t14;
+    core::num* v6 = let final self::Test2* #t15 = t in let final core::num* #t16 = #t15.{self::Test2::prop}{core::num*} in #t16 == null ?{core::num*} #t15.{self::Test2::prop} = self::getDouble() : #t16;
+    core::num* v7 = let final self::Test2* #t17 = t in #t17.{self::Test2::prop} = #t17.{self::Test2::prop}{core::num*}.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+    core::num* v8 = let final self::Test2* #t18 = t in #t18.{self::Test2::prop} = #t18.{self::Test2::prop}{core::num*}.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+    core::num* v9 = let final self::Test2* #t19 = t in #t19.{self::Test2::prop} = #t19.{self::Test2::prop}{core::num*}.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+    core::num* v10 = let final self::Test2* #t20 = t in #t20.{self::Test2::prop} = #t20.{self::Test2::prop}{core::num*}.{core::num::+}(1){(core::num*) →* core::num*};
+    core::num* v11 = let final self::Test2* #t21 = t in let final core::num* #t22 = #t21.{self::Test2::prop}{core::num*} in let final core::num* #t23 = #t21.{self::Test2::prop} = #t22.{core::num::+}(1){(core::num*) →* core::num*} in #t22;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Test3 extends core::Object {
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
+    : super core::Object::•()
+    ;
+  static method test3(self::Test3* t) → void {
+    core::num* v2 = t.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
+    core::double* v3 = t.{self::Test3::prop} = self::getDouble();
+    core::num* v5 = let final self::Test3* #t24 = t in let final core::double* #t25 = #t24.{self::Test3::prop}{core::double*} in #t25 == null ?{core::num*} #t24.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t25;
+    core::double* v6 = let final self::Test3* #t26 = t in let final core::double* #t27 = #t26.{self::Test3::prop}{core::double*} in #t27 == null ?{core::double*} #t26.{self::Test3::prop} = self::getDouble() : #t27;
+    core::double* v7 = let final self::Test3* #t28 = t in #t28.{self::Test3::prop} = #t28.{self::Test3::prop}{core::double*}.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+    core::double* v8 = let final self::Test3* #t29 = t in #t29.{self::Test3::prop} = #t29.{self::Test3::prop}{core::double*}.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+    core::double* v9 = let final self::Test3* #t30 = t in #t30.{self::Test3::prop} = #t30.{self::Test3::prop}{core::double*}.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+    core::double* v10 = let final self::Test3* #t31 = t in #t31.{self::Test3::prop} = #t31.{self::Test3::prop}{core::double*}.{core::double::+}(1){(core::num*) →* core::double*};
+    core::double* v11 = let final self::Test3* #t32 = t in let final core::double* #t33 = #t32.{self::Test3::prop}{core::double*} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1){(core::num*) →* core::double*} in #t33;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.weak.modular.expect
new file mode 100644
index 0000000..e2c5e19
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* a = new self::A::•();
+static field core::int* b = self::a.{self::A::f} = 1;
+static field core::int* c = 0;
+static field core::int* d = self::c = 1;
+static method main() → dynamic {
+  self::a;
+  self::b;
+  self::c;
+  self::d;
+}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.weak.modular.expect
new file mode 100644
index 0000000..090413f
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(self::C* v) → self::A*
+    return null;
+  operator -(core::int* i) → self::B*
+    return null;
+  operator *(self::B* v) → self::B*
+    return null;
+  operator &(self::A* v) → self::C*
+    return null;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static field self::B* topLevelVariable;
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test_topLevelVariable() → void {
+  self::topLevelVariable = self::f<self::B*>();
+  self::topLevelVariable == null ?{self::B*} self::topLevelVariable = self::f<self::B*>() : null;
+  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::topLevelVariable = self::topLevelVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::topLevelVariable = self::topLevelVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v1 = self::topLevelVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = self::topLevelVariable in #t1 == null ?{self::B*} self::topLevelVariable = self::f<self::B*>() : #t1;
+  self::A* v3 = self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::B* v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::C* v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::B* v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v7 = let final self::B* #t2 = self::topLevelVariable in let final self::B* #t3 = self::topLevelVariable = #t2.{self::B::-}(1){(core::int*) →* self::B*} in #t2;
+}
+static method test_staticVariable() → void {
+  self::B::staticVariable = self::f<self::B*>();
+  self::B::staticVariable == null ?{self::B*} self::B::staticVariable = self::f<self::B*>() : null;
+  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::B::staticVariable = self::B::staticVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B::staticVariable = self::B::staticVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v1 = self::B::staticVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t4 = self::B::staticVariable in #t4 == null ?{self::B*} self::B::staticVariable = self::f<self::B*>() : #t4;
+  self::A* v3 = self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<self::C*>()){(self::C*) →* self::A*} as{TypeError} self::B*;
+  self::B* v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<self::B*>()){(self::B*) →* self::B*};
+  self::C* v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<self::A*>()){(self::A*) →* self::C*};
+  self::B* v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1){(core::int*) →* self::B*};
+  self::B* v7 = let final self::B* #t5 = self::B::staticVariable in let final self::B* #t6 = self::B::staticVariable = #t5.{self::B::-}(1){(core::int*) →* self::B*} in #t5;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.weak.modular.expect
new file mode 100644
index 0000000..ae43fd0
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* topLevelInt;
+static field core::num* topLevelNum;
+static field core::double* topLevelDouble;
+static method getInt() → core::int*
+  return 0;
+static method getNum() → core::num*
+  return 0;
+static method getDouble() → core::double*
+  return 0.0;
+static method test1() → void {
+  core::int* v1 = self::topLevelInt = self::getInt();
+  core::num* v2 = self::topLevelInt = self::getNum() as{TypeError} core::int*;
+  core::int* v4 = let final core::int* #t1 = self::topLevelInt in #t1 == null ?{core::int*} self::topLevelInt = self::getInt() : #t1;
+  core::num* v5 = let final core::int* #t2 = self::topLevelInt in #t2 == null ?{core::num*} self::topLevelInt = self::getNum() as{TypeError} core::int* : #t2;
+  core::int* v7 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getInt()){(core::num*) →* core::int*};
+  core::num* v8 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getNum()){(core::num*) →* core::num*} as{TypeError} core::int*;
+  core::int* v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1){(core::num*) →* core::int*};
+  core::int* v11 = let final core::int* #t3 = self::topLevelInt in let final core::int* #t4 = self::topLevelInt = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3;
+}
+static method test2() → void {
+  core::int* v1 = self::topLevelNum = self::getInt();
+  core::num* v2 = self::topLevelNum = self::getNum();
+  core::double* v3 = self::topLevelNum = self::getDouble();
+  core::num* v4 = let final core::num* #t5 = self::topLevelNum in #t5 == null ?{core::num*} self::topLevelNum = self::getInt() : #t5;
+  core::num* v5 = let final core::num* #t6 = self::topLevelNum in #t6 == null ?{core::num*} self::topLevelNum = self::getNum() : #t6;
+  core::num* v6 = let final core::num* #t7 = self::topLevelNum in #t7 == null ?{core::num*} self::topLevelNum = self::getDouble() : #t7;
+  core::num* v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt()){(core::num*) →* core::num*};
+  core::num* v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum()){(core::num*) →* core::num*};
+  core::num* v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble()){(core::num*) →* core::num*};
+  core::num* v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1){(core::num*) →* core::num*};
+  core::num* v11 = let final core::num* #t8 = self::topLevelNum in let final core::num* #t9 = self::topLevelNum = #t8.{core::num::+}(1){(core::num*) →* core::num*} in #t8;
+}
+static method test3() → void {
+  core::num* v2 = self::topLevelDouble = self::getNum() as{TypeError} core::double*;
+  core::double* v3 = self::topLevelDouble = self::getDouble();
+  core::num* v5 = let final core::double* #t10 = self::topLevelDouble in #t10 == null ?{core::num*} self::topLevelDouble = self::getNum() as{TypeError} core::double* : #t10;
+  core::double* v6 = let final core::double* #t11 = self::topLevelDouble in #t11 == null ?{core::double*} self::topLevelDouble = self::getDouble() : #t11;
+  core::double* v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt()){(core::num*) →* core::double*};
+  core::double* v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum()){(core::num*) →* core::double*};
+  core::double* v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble()){(core::num*) →* core::double*};
+  core::double* v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1){(core::num*) →* core::double*};
+  core::double* v11 = let final core::double* #t12 = self::topLevelDouble in let final core::double* #t13 = self::topLevelDouble = #t12.{core::double::+}(1){(core::num*) →* core::double*} in #t12;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.weak.modular.expect
new file mode 100644
index 0000000..871301b
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var x;
+//       ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the overridden members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the overridden members.
+//   void set x(double value);
+//            ^
+//
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Error: The type 'int' of the getter 'A.x' is not assignable to the type 'double' of the setter 'A.x'.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is the declaration of the setter 'A.x'.
+//   void set x(double value);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int*;
+  abstract set x(core::double* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  field invalid-type x = null;
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.weak.modular.expect
new file mode 100644
index 0000000..497e214
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var x;
+//       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the overridden members.
+//   A get x;
+//         ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the overridden members.
+//   void set x(B value);
+//            ^
+//
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var y;
+//       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the overridden members.
+//   B get y;
+//         ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the overridden members.
+//   void set y(A value);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → self::A*;
+  abstract set x(self::B* value) → void;
+  abstract get y() → self::B*;
+  abstract set y(self::A* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  field invalid-type x = null;
+  field invalid-type y = null;
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..6282349
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var x;
+//       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the overridden members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the overridden members.
+//   void set x(num value);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set x(core::num* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract get x() → core::int*;
+}
+class C extends self::B {
+  field invalid-type x = null;
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..001d19d
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var x;
+//       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the overridden members.
+//   num get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the overridden members.
+//   void set x(int value);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract get x() → core::num*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  abstract set x(core::int* value) → void;
+}
+class C extends self::B {
+  field invalid-type x = null;
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.modular.expect
new file mode 100644
index 0000000..ea950c6
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get c() → self::C*
+    return null;
+  set c(self::C* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+static field self::A* a = new self::A::•();
+static field self::C* x = self::a.{self::A::b}{self::B*}.{self::B::c}{self::C*};
+static field self::C* y = let final self::B* #t1 = self::a.{self::A::b}{self::B*} in let final self::C* #t2 = #t1.{self::B::c}{self::C*} in #t2 == null ?{self::C*} #t1.{self::B::c} = new self::D::•() : #t2;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.modular.expect
new file mode 100644
index 0000000..b174194
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  field self::C* c = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+static field self::A* a = new self::A::•();
+static field self::C* x = self::a.{self::A::b}{self::B*}.{self::B::c}{self::C*};
+static field self::C* y = let final self::B* #t1 = self::a.{self::A::b}{self::B*} in let final self::C* #t2 = #t1.{self::B::c}{self::C*} in #t2 == null ?{self::C*} #t1.{self::B::c} = new self::D::•() : #t2;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.weak.modular.expect
new file mode 100644
index 0000000..21df0fc
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:7: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+//   var b = /*@ returnType=() ->* invalid-type */ () => x;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field invalid-type b = () → () →* invalid-type => self::x;
+  field () →* () →* invalid-type c = () → () →* invalid-type => self::x;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A* a = new self::A::•();
+static field () →* invalid-type x = () → invalid-type => self::a.{self::A::b}{invalid-type};
+static field () →* () →* () →* invalid-type y = () → () →* () →* invalid-type => self::a.{self::A::c}{() →* () →* invalid-type};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.weak.modular.expect
new file mode 100644
index 0000000..2b05154
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* x = self::f<core::bool*>() || self::f<core::bool*>();
+static field core::bool* y = self::f<core::bool*>() && self::f<core::bool*>();
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → void {
+  core::bool* x = self::f<core::bool*>() || self::f<core::bool*>();
+  core::bool* y = self::f<core::bool*>() && self::f<core::bool*>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.weak.modular.expect
new file mode 100644
index 0000000..18cf625
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  method f() → void {}
+}
+static field void x = new self::C::•().{self::C::f}(){() →* void};
+static method main() → dynamic {
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..3faad32
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:13: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// var x = i = s;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int* i;
+static field core::String* s;
+static field core::String* x = self::i = invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:13: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+var x = i = s;
+            ^" in self::s as{TypeError} core::int*;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..30af47a
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<Null>* x = <Null>[null];
+static method main() → dynamic {
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.weak.modular.expect
new file mode 100644
index 0000000..c5b6db9
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::Map<Null, Null>* x = <Null, Null>{null: null};
+static method main() → dynamic {
+  self::x;
+}
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.weak.modular.expect
new file mode 100644
index 0000000..35f8118
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.weak.modular.expect
@@ -0,0 +1,89 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class I1 extends core::Object {
+  synthetic constructor •() → self::I1*
+    : super core::Object::•()
+    ;
+  abstract method f(core::int* i) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I2 extends core::Object {
+  synthetic constructor •() → self::I2*
+    : super core::Object::•()
+    ;
+  abstract method f(core::Object* o) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends core::Object implements self::I1, self::I2 {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature method f(core::Object* o) → void; -> self::I2::f
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f(core::Object* o) → void {}
+}
+abstract class E extends core::Object implements self::I2, self::I1 {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F extends self::E {
+  synthetic constructor •() → self::F*
+    : super self::E::•()
+    ;
+  method f(core::Object* o) → void {}
+}
+static method g1(self::C* c) → void {
+  c.{self::C::f}("hi"){(core::Object*) →* void};
+}
+static method g2(self::E* e) → void {
+  e.{self::I2::f}("hi"){(core::Object*) →* void};
+}
+static method main() → dynamic {
+  self::g1(new self::D::•());
+  self::g2(new self::F::•());
+}
diff --git a/pkg/front_end/testcases/inference_new/null_aware_property_get.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/null_aware_property_get.dart.weak.modular.expect
new file mode 100644
index 0000000..fa63c03
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/null_aware_property_get.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  method method<T extends core::Object* = dynamic>() → self::Class::method::T*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::Class* c;
+  () →* core::num* f = let final self::Class* #t1 = c in #t1 == null ?{() →* core::num*} null : #t1.{self::Class::method}{<T extends core::Object* = dynamic>() →* T*}<core::num*>;
+}
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.weak.modular.expect
new file mode 100644
index 0000000..facdace
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.weak.modular.expect
@@ -0,0 +1,137 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/property_assign_combiner.dart:29:9: Error: The type 'A' of the getter 'G.target' is not assignable to the type 'B' of the setter 'G.target'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/property_assign_combiner.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/inference_new/property_assign_combiner.dart'.
+//   A get target => null;
+//         ^^^^^^
+// pkg/front_end/testcases/inference_new/property_assign_combiner.dart:31:12: Context: This is the declaration of the setter 'G.target'.
+//   void set target(B value) {}
+//            ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(core::int* value) → self::C*
+    return null;
+  operator *(self::D* value) → self::C*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(core::int* value) → self::E*
+    return null;
+  operator *(self::F* value) → self::E*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F extends core::Object {
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G extends core::Object {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  get target() → self::A*
+    return null;
+  set target(self::B* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test1(self::G* g) → void {
+  let final self::G* #t1 = g in #t1.{self::G::target} = #t1.{self::G::target}{self::A*}.{self::A::*}(self::f<self::D*>()){(self::D*) →* self::C*};
+  self::C* x = let final self::G* #t2 = g in #t2.{self::G::target} = #t2.{self::G::target}{self::A*}.{self::A::*}(self::f<self::D*>()){(self::D*) →* self::C*};
+}
+static method test2(self::G* g) → void {
+  let final self::G* #t3 = g in #t3.{self::G::target} = #t3.{self::G::target}{self::A*}.{self::A::+}(1){(core::int*) →* self::C*};
+  self::C* x = let final self::G* #t4 = g in #t4.{self::G::target} = #t4.{self::G::target}{self::A*}.{self::A::+}(1){(core::int*) →* self::C*};
+}
+static method test3(self::G* g) → void {
+  let final self::G* #t5 = g in #t5.{self::G::target} = #t5.{self::G::target}{self::A*}.{self::A::+}(1){(core::int*) →* self::C*};
+  self::A* x = let final self::G* #t6 = g in let final self::A* #t7 = #t6.{self::G::target}{self::A*} in let final self::C* #t8 = #t6.{self::G::target} = #t7.{self::A::+}(1){(core::int*) →* self::C*} in #t7;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.weak.modular.expect
new file mode 100644
index 0000000..d52af61
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  get getter() → core::int*
+    return 0;
+  method function() → core::int*
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C* c = new self::C::•();
+static field core::int* field_ref = self::c.{self::C::field}{core::int*};
+static field core::int* getter_ref = self::c.{self::C::getter}{core::int*};
+static field () →* core::int* function_ref = self::c.{self::C::function}{() →* core::int*};
+static field core::List<core::int*>* field_ref_list = <core::int*>[self::c.{self::C::field}{core::int*}];
+static field core::List<core::int*>* getter_ref_list = <core::int*>[self::c.{self::C::getter}{core::int*}];
+static field core::List<() →* core::int*>* function_ref_list = <() →* core::int*>[self::c.{self::C::function}{() →* core::int*}];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.weak.modular.expect
new file mode 100644
index 0000000..0c920ee
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.weak.modular.expect
@@ -0,0 +1,122 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/static_assign_combiner.dart:28:7: Error: The type 'A' of the getter 'target' is not assignable to the type 'B' of the setter 'target'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/static_assign_combiner.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/inference_new/static_assign_combiner.dart'.
+// A get target => null;
+//       ^^^^^^
+// pkg/front_end/testcases/inference_new/static_assign_combiner.dart:30:10: Context: This is the declaration of the setter 'target'.
+// void set target(B value) {}
+//          ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(core::int* value) → self::C*
+    return null;
+  operator *(self::D* value) → self::C*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(core::int* value) → self::E*
+    return null;
+  operator *(self::F* value) → self::E*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F extends core::Object {
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static get target() → self::A*
+  return null;
+static set target(self::B* value) → void {}
+static method test1() → void {
+  self::target = self::target.{self::A::*}(self::f<self::D*>()){(self::D*) →* self::C*};
+  self::C* x = self::target = self::target.{self::A::*}(self::f<self::D*>()){(self::D*) →* self::C*};
+}
+static method test2() → void {
+  self::target = self::target.{self::A::+}(1){(core::int*) →* self::C*};
+  self::C* x = self::target = self::target.{self::A::+}(1){(core::int*) →* self::C*};
+}
+static method test3() → void {
+  self::target = self::target.{self::A::+}(1){(core::int*) →* self::C*};
+  self::A* x = let final self::A* #t1 = self::target in let final self::C* #t2 = self::target = #t1.{self::A::+}(1){(core::int*) →* self::C*} in #t1;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.weak.modular.expect
new file mode 100644
index 0000000..276a1c2
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => f() ? y : z;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type x = () → () →* invalid-type => self::f() ?{() →* invalid-type} self::y : self::z;
+static field () →* invalid-type y = () → invalid-type => self::x;
+static field () →* invalid-type z = () → invalid-type => self::x;
+static method f() → core::bool*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.weak.modular.expect
new file mode 100644
index 0000000..2910dae
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator [](core::int* x) → core::num*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  operator [](core::Object* x) → core::int*
+    return null;
+  method h() → void {
+    core::num* x = super.{self::B::[]}(self::f<core::int*>());
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.weak.modular.expect
new file mode 100644
index 0000000..b2841e6
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<T extends core::Object* = dynamic> extends self::D<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super self::D::•()
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  operator [](covariant-by-class self::E<self::B::T*>* x) → self::D<self::B::T*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
+    : super self::B::•()
+    ;
+  operator [](covariant-by-class core::Object* x) → self::E<asy::Future<self::C::U*>*>*
+    return null;
+  method h() → void {
+    self::D<asy::Future<self::C::U*>*>* x = super.{self::B::[]}(self::f<self::E<asy::Future<self::C::U*>*>*>());
+  }
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/switch.dart.weak.modular.expect
new file mode 100644
index 0000000..6e55000
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/switch.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test(self::C<core::int*>* x) → void {
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        core::int* y = 0;
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        core::int* y = 0;
+        break #L1;
+      }
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<core::int*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///switch.dart:
+- C. (from org-dartlang-testcase:///switch.dart:11:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.weak.modular.expect
new file mode 100644
index 0000000..69cac39
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.weak.modular.expect
@@ -0,0 +1,104 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+abstract class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract method foo() → self::A*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract method foo() → self::B*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class F extends core::Object {
+  synthetic constructor •() → self::F*
+    : super core::Object::•()
+    ;
+  abstract method foo() → core::Object*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class G extends core::Object implements self::D, self::E, self::F {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  abstract member-signature method foo() → self::B*; -> self::E::foo
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class H extends self::G {
+  synthetic constructor •() → self::H*
+    : super self::G::•()
+    ;
+  method foo() → self::C*
+    return new self::C::•();
+}
+static field self::B* x = self::bar().{self::G::foo}(){() →* self::B*};
+static method bar() → self::G*
+  return new self::H::•();
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.weak.modular.expect
new file mode 100644
index 0000000..26fdda1
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* v = #C1<core::int*>(() → core::int* {
+  return 1;
+}){(() →* core::int*) →* core::List<core::int*>*};
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.weak.modular.expect
new file mode 100644
index 0000000..26fdda1
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* v = #C1<core::int*>(() → core::int* {
+  return 1;
+}){(() →* core::int*) →* core::List<core::int*>*};
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g(){() →* self::f::T*}];
+static method main() → dynamic {
+  self::v;
+}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.weak.modular.expect
new file mode 100644
index 0000000..96e59b9
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field void y = self::run<void>(#C1);
+static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T* {
+  core::print("running");
+  self::run::T* t = f(){() →* self::run::T*};
+  core::print("done running");
+  return t;
+}
+static method printRunning() → void {
+  core::print("running");
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.weak.modular.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.weak.modular.expect
new file mode 100644
index 0000000..7469e19
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+  return null;
+static method test() → void {
+  while (self::f<core::bool*>()) {
+    core::int* x = 0;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.modular.expect
new file mode 100644
index 0000000..336e446
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (Null) →* self::B<dynamic, dynamic>*, core::num*>* d;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.weak.modular.expect
new file mode 100644
index 0000000..7de5b6d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+import "dart:collection";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    col::LinkedListEntry<col::LinkedListEntry<dynamic>>* bar;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  col::LinkedListEntry<col::LinkedListEntry<dynamic>>* bar;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.modular.expect
new file mode 100644
index 0000000..ff8c02f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::List<self::A<core::num*>*>* a = <self::A<core::num*>*>[];
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::List<self::A<core::num*>*>* a = <self::A<core::num*>*>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.weak.modular.expect
new file mode 100644
index 0000000..186472b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<U extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::U*>*
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    core::List<self::A<self::B::U*>*>* foo = <self::A<self::B::U*>*>[];
+    core::List<self::A<core::num*>*>* bar = <self::A<core::num*>*>[];
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.modular.expect
new file mode 100644
index 0000000..28c2e96
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::Map<self::A<core::num*>*, self::A<core::num*>*>* a = <self::A<core::num*>*, self::A<core::num*>*>{};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::Map<self::A<core::num*>*, self::A<core::num*>*>* a = <self::A<core::num*>*, self::A<core::num*>*>{};
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..5aa8724
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+import "dart:collection";
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    self::A<dynamic>* a;
+    col::DoubleLinkedQueue<dynamic>* c;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A<dynamic>* a;
+  col::DoubleLinkedQueue<dynamic>* c;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.weak.modular.expect
new file mode 100644
index 0000000..9b5f2f8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends self::A<self::A::T*>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    self::A<self::A<dynamic>*>* a;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A<self::A<dynamic>*>* a;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.modular.expect
new file mode 100644
index 0000000..19c0496
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::List<(core::num*) →* dynamic>* a = <(core::num*) →* dynamic>[];
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::List<(core::num*) →* dynamic>* a = <(core::num*) →* dynamic>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.weak.modular.expect
new file mode 100644
index 0000000..cf2c35d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+class B<U extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::U*>*
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    core::List<(self::B::U*) →* dynamic>* foo = <(self::B::U*) →* dynamic>[];
+    core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.modular.expect
new file mode 100644
index 0000000..82bfe94
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a = <(core::num*) →* dynamic, (core::num*) →* dynamic>{};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a = <(core::num*) →* dynamic, (core::num*) →* dynamic>{};
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..f6435f7
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    (dynamic) →* dynamic a;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  (dynamic) →* dynamic a;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.weak.modular.expect
new file mode 100644
index 0000000..d4a97aa
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<contravariant U extends (U*) →* dynamic = (dynamic) →* dynamic> = (U*) →* dynamic;
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    ((dynamic) →* dynamic) →* dynamic b;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  ((dynamic) →* dynamic) →* dynamic b;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.modular.expect
new file mode 100644
index 0000000..98dbd20
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C<X extends core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C<core::num*, (Null) →* void>* c;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..a7c105a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C<X extends core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::C<core::num*, (Null) →* void>*>* lc = <self::C<core::num*, (Null) →* void>*>[];
+static field core::Map<self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>* mc = <self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.weak.modular.expect
new file mode 100644
index 0000000..e4ecd94
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::D<(Null, Null) →* void, (Null, Null) →* void>* d;
+static field self::E<(Null) →* void>* e;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..eaaf4d5
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::D<(Null, Null) →* void, (Null, Null) →* void>*>* ld = <self::D<(Null, Null) →* void, (Null, Null) →* void>*>[];
+static field core::Map<self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>* md = <self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>{};
+static field core::List<self::E<(Null) →* void>*>* le = <self::E<(Null) →* void>*>[];
+static field core::Map<self::E<(Null) →* void>*, self::E<(Null) →* void>*>* me = <self::E<(Null) →* void>*, self::E<(Null) →* void>*>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.modular.expect
new file mode 100644
index 0000000..5fa1f9e
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<X extends core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F<X extends core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C<dynamic, self::A<dynamic>*>* c;
+static field self::D<core::num*, self::A<core::num*>*>* d;
+static field self::E<dynamic, () →* dynamic>* e;
+static field self::F<core::num*, () →* core::num*>* f;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..6957306
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<X extends core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F<X extends core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::C<dynamic, self::A<dynamic>*>*>* lc = <self::C<dynamic, self::A<dynamic>*>*>[];
+static field core::Map<self::C<dynamic, self::A<dynamic>*>*, self::C<dynamic, self::A<dynamic>*>*>* mc = <self::C<dynamic, self::A<dynamic>*>*, self::C<dynamic, self::A<dynamic>*>*>{};
+static field core::List<self::D<core::num*, self::A<core::num*>*>*>* ld = <self::D<core::num*, self::A<core::num*>*>*>[];
+static field core::Map<self::D<core::num*, self::A<core::num*>*>*, self::D<core::num*, self::A<core::num*>*>*>* md = <self::D<core::num*, self::A<core::num*>*>*, self::D<core::num*, self::A<core::num*>*>*>{};
+static field core::List<self::E<dynamic, () →* dynamic>*>* le = <self::E<dynamic, () →* dynamic>*>[];
+static field core::Map<self::E<dynamic, () →* dynamic>*, self::E<dynamic, () →* dynamic>*>* me = <self::E<dynamic, () →* dynamic>*, self::E<dynamic, () →* dynamic>*>{};
+static field core::List<self::F<core::num*, () →* core::num*>*>* lf = <self::F<core::num*, () →* core::num*>*>[];
+static field core::Map<self::F<core::num*, () →* core::num*>*, self::F<core::num*, () →* core::num*>*>* mf = <self::F<core::num*, () →* core::num*>*, self::F<core::num*, () →* core::num*>*>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.weak.modular.expect
new file mode 100644
index 0000000..e5e5db0
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.weak.modular.expect
@@ -0,0 +1,83 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<X extends self::B<self::E::X*, self::E::Y*>* = self::B<dynamic, dynamic>*, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F<X extends () →* self::F::X* = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>* d;
+static field self::E<self::B<dynamic, dynamic>*, () →* dynamic>* e;
+static field self::F<() →* dynamic>* f;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..b532365
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<X extends self::B<self::E::X*, self::E::Y*>* = self::B<dynamic, dynamic>*, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F<X extends () →* self::F::X* = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>* ld = <self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>[];
+static field core::Map<self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>* md = <self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>{};
+static field core::List<self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>* le = <self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>[];
+static field core::Map<self::E<self::B<dynamic, dynamic>*, () →* dynamic>*, self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>* me = <self::E<self::B<dynamic, dynamic>*, () →* dynamic>*, self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>{};
+static field core::List<self::F<() →* dynamic>*>* lf = <self::F<() →* dynamic>*>[];
+static field core::Map<self::F<() →* dynamic>*, self::F<() →* dynamic>*>* mf = <self::F<() →* dynamic>*, self::F<() →* dynamic>*>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.modular.expect
new file mode 100644
index 0000000..e5f74ce
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<X extends core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C<dynamic, (Null) →* dynamic>* c;
+static field self::D<core::num*, (Null) →* core::num*>* d;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..2cf489e
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<X extends core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::C<dynamic, (Null) →* dynamic>*>* lc = <self::C<dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>* mc = <self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::D<core::num*, (Null) →* core::num*>*>* ld = <self::D<core::num*, (Null) →* core::num*>*>[];
+static field core::Map<self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>* md = <self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.weak.modular.expect
new file mode 100644
index 0000000..175fa49
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:collection" as col;
+
+import "dart:collection";
+
+static field col::LinkedListEntry<col::LinkedListEntry<dynamic>>* y;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..5da171e
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A<core::num*>* a = new self::A::•<core::num*>();
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..13d0abf
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•<core::num*>();
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.modular.expect
new file mode 100644
index 0000000..f971b81
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::num*, S extends core::List<self::B::T*>* = core::List<core::num*>*> extends self::A<self::B::T*> {
+  constructor •([self::B::T* x = #C1]) → self::B<self::B::T*, self::B::S*>*
+    : super self::A::•() {}
+}
+static method main() → dynamic {
+  self::B<core::num*, core::List<core::num*>*>* x;
+  self::B<core::int*, core::List<core::int*>*>* y = new self::B::•<core::int*, core::List<core::int*>*>(3);
+  self::A<core::int*>* z = new self::B::•<core::int*, core::List<core::int*>*>();
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.weak.modular.expect
new file mode 100644
index 0000000..7c188466
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Inferred type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<T>' of the type variable 'T' on 'B'.
+//  - 'Comparable' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// var y = new B();
+//             ^
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:9:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<T extends Comparable<T>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Comparable<self::B::T*>* = core::Comparable<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::B<core::Comparable<dynamic>*>* y = new self::B::•<core::Comparable<dynamic>*>();
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.modular.expect
new file mode 100644
index 0000000..e04675b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo(self::A<core::num*>* a) → dynamic
+    return null;
+  method bar() → self::A<core::num*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.modular.expect
new file mode 100644
index 0000000..f1af679
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::A<core::num*>*>* a = <self::A<core::num*>*>[];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.weak.modular.expect
new file mode 100644
index 0000000..a42b37a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends core::Object {
+  final field core::List<self::A<self::B::S*>*>* foo = <self::A<self::B::S*>*>[];
+  final field core::List<self::A<core::num*>*>* bar = <self::A<core::num*>*>[];
+  synthetic constructor •() → self::B<self::B::S*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.modular.expect
new file mode 100644
index 0000000..e2fc6ab
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::Map<self::A<core::num*>*, self::A<core::num*>*>* a = <self::A<core::num*>*, self::A<core::num*>*>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.modular.expect
new file mode 100644
index 0000000..1576c98
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.weak.modular.expect
@@ -0,0 +1,170 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart:41:9: Error: Type 'T' is a bound of itself via 'U', 'Y', 'Z'.
+// Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.
+// class I<T extends U, U extends Y, V extends Function(W), W extends Function(X),
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<X extends self::A<self::D::X*>* = self::A<dynamic>*, Y extends self::A<self::D::Y*>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<W extends self::B<self::E::W*, self::E::X*>* = self::B<dynamic, dynamic>*, X extends self::C<self::E::W*, self::E::X*>* = self::C<dynamic, dynamic>*, Y extends self::B<self::E::Y*, self::E::Z*>* = self::B<dynamic, dynamic>*, Z extends self::C<self::E::Y*, self::E::Z*>* = self::C<dynamic, dynamic>*> extends core::Object {
+  synthetic constructor •() → self::E<self::E::W*, self::E::X*, self::E::Y*, self::E::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F<V extends core::num*, W extends self::B<self::F::W*, self::F::X*>* = self::B<dynamic, dynamic>*, X extends self::C<self::F::W*, self::F::X*>* = self::C<dynamic, dynamic>*, Y extends self::B<self::F::W*, self::F::X*>* = self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, Z extends self::C<self::F::Y*, self::F::Z*>* = self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*> extends core::Object {
+  synthetic constructor •() → self::F<self::F::V*, self::F::W*, self::F::X*, self::F::Y*, self::F::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class G<V extends core::num*, W extends self::B<self::G::V*, self::G::X*>* = self::B<core::num*, dynamic>*, X extends self::C<self::G::W*, self::G::V*>* = self::C<dynamic, core::num*>*, Y extends self::B<self::G::W*, self::G::X*>* = self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, Z extends self::C<self::G::Y*, self::G::Z*>* = self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*> extends core::Object {
+  synthetic constructor •() → self::G<self::G::V*, self::G::W*, self::G::X*, self::G::Y*, self::G::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class H<S extends self::A<self::H::S*>* = self::A<dynamic>*, T extends self::B<self::H::T*, self::H::U*>* = self::B<dynamic, dynamic>*, U extends self::C<self::H::T*, self::H::U*>* = self::C<dynamic, dynamic>*, V extends self::A<self::H::V*>* = self::A<dynamic>*, W extends self::H::S* = self::A<dynamic>*, X extends self::H::T* = self::B<dynamic, dynamic>*, Y extends self::H::U* = self::C<dynamic, dynamic>*, Z extends self::H::V* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::H<self::H::S*, self::H::T*, self::H::U*, self::H::V*, self::H::W*, self::H::X*, self::H::Y*, self::H::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class I<T extends invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*, self::I::U*, self::I::V*, self::I::W*, self::I::X*, self::I::Y*, self::I::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class J<S extends (self::J::U*) →* self::J::T* = (Null) →* dynamic, T extends (self::J::S*) →* self::J::U* = (Null) →* dynamic, U extends (self::J::T*) →* self::J::S* = (Null) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (Null) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V*, self::J::W*, self::J::X*, self::J::Y*, self::J::Z*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::D<self::A<dynamic>*, self::A<dynamic>*>* d;
+static field self::E<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>* e;
+static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
+static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
+static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
+static field self::I<invalid-type, invalid-type, (Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, invalid-type, invalid-type>* i;
+static field self::J<(Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, dynamic, dynamic, (Null) →* dynamic, dynamic, dynamic>* j;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.weak.modular.expect
new file mode 100644
index 0000000..381fd70
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.weak.modular.expect
@@ -0,0 +1,164 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C1<(Null) →* dynamic, (Null) →* dynamic>* c1;
+static field self::C2<(Null) →* dynamic, (Null) →* dynamic>* c2;
+static field self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c3;
+static field self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d4;
+static field self::E<(Null) →* dynamic>* e;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..57e2111
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.weak.modular.expect
@@ -0,0 +1,173 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* lc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* mc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* lc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* mc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::E<(Null) →* dynamic>*>* le = <self::E<(Null) →* dynamic>*>[];
+static field core::Map<self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>* me = <self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.modular.expect
new file mode 100644
index 0000000..c15ea34
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// class B<TypeU extends A> {}
+//         ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:10:16: Context: Bound of this variable references variable 'TypeT' from the same declaration.
+// class A<TypeT, TypeS extends TypeT> {}
+//                ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object* = dynamic, TypeS extends self::A::TypeT* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::TypeT*, self::A::TypeS*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<TypeV extends self::B<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::TypeV*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::C<self::B<dynamic>*>* c;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.weak.modular.expect
new file mode 100644
index 0000000..a052bc5
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'A' here.
+// class B<TypeU extends A> {}
+//         ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:9:16: Context: Bound of this variable references variable 'TypeT' from the same declaration.
+// class A<TypeT, TypeS extends TypeT> {}
+//                ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object* = dynamic, TypeS extends self::A::TypeT* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::TypeT*, self::A::TypeS*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::B<dynamic>* b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.weak.modular.expect
new file mode 100644
index 0000000..a8be06f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:9:12: Error: Type variables can't have generic function types in their bounds.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:9: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// typedef Fisk = void Function<TypeY extends Hest>();
+//         ^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:11:30: Context: Bound of this variable references raw type 'Hest'.
+// typedef Fisk = void Function<TypeY extends Hest>();
+//                              ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart:9:12: Context: Bound of this variable references raw type 'Fisk'.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk = <TypeY extends core::Object* = dynamic>() →* void;
+class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.modular.expect
new file mode 100644
index 0000000..1adc8bcb
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// typedef void Fisk<TypeY extends Hest>();
+//              ^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:19: Context: Bound of this variable references raw type 'Hest'.
+// typedef void Fisk<TypeY extends Hest>();
+//                   ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:8:12: Context: Bound of this variable references raw type 'Fisk'.
+// class Hest<TypeX extends Fisk> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<unrelated TypeY extends core::Object* = dynamic> = () →* void;
+class Hest<TypeX extends () →* void> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.weak.modular.expect
new file mode 100644
index 0000000..a6180cf
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.weak.modular.expect
new file mode 100644
index 0000000..3cc0758
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest, TypeY extends Hest> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:32: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Hest, TypeY extends Hest> {}
+//                                ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object* = dynamic, TypeY extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*, self::Hest::TypeY*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.weak.modular.expect
new file mode 100644
index 0000000..637253f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+// Try providing type arguments to 'Hest' here.
+// class Hest<TypeX extends Map<Hest, Hest>> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.modular.expect
new file mode 100644
index 0000000..f205aa6
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.weak.modular.expect
new file mode 100644
index 0000000..340e597
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:9:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:32: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+//                                ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:9:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX*>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic, TypeZ extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*, self::Fisk::TypeZ*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.weak.modular.expect
new file mode 100644
index 0000000..5f8978b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'LinkedListEntry' here.
+// class Hest<X extends LinkedListEntry> {}
+//            ^
+//
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+import "dart:collection";
+
+class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.weak.modular.expect
new file mode 100644
index 0000000..74416db
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart:11:12: Error: Type variables can't have generic function types in their bounds.
+// class Fisk<TypeY extends Function<TypeZ extends Hest<Null>>(TypeZ)> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX*>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<Null>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.weak.modular.expect
new file mode 100644
index 0000000..e411b58
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+//               ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:8:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Fisk' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Fisk' here.
+// class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+//               ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:10:12: Context: Bound of this variable references variable 'TypeY' from the same declaration.
+// class Fisk<TypeY extends Fisk<TypeY>> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX*>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY*>* = self::Fisk<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<self::Hest<dynamic>*>*, self::Fisk<self::Fisk<dynamic>*>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.modular.expect
new file mode 100644
index 0000000..0124e15
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+// Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+// class Hest<TypeX extends lib.Hest> {}
+//       ^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:12: Context: Bound of this variable references raw type 'Hest'.
+// class Hest<TypeX extends lib.Hest> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart:16:12: Context: Bound of this variable references raw type 'Hest'.
+// class Hest<TypeY extends lib.Hest> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
+
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library non_simple_many_libs_same_name_cycle_lib;
+import self as self2;
+import "non_simple_many_libs_same_name_cycle.dart" as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
+
+class Hest<TypeY extends self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self2::Hest<self2::Hest::TypeY*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.weak.modular.expect
new file mode 100644
index 0000000..28d37ca
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Map<Hest, Hest>> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:9:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX*>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fisk<TypeY extends core::Map<self::Hest<self::Hest<dynamic>*>*, self::Hest<self::Hest<dynamic>*>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.modular.expect
new file mode 100644
index 0000000..34ba795
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:9:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX*>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.weak.modular.expect
new file mode 100644
index 0000000..5334658
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'Hest' here.
+// class Fisk<TypeY extends Hest> {}
+//            ^^^^^
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:10:12: Context: Bound of this variable references variable 'TypeX' from the same declaration.
+// class Hest<TypeX extends Hest<TypeX>> {}
+//            ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX*>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..8000a5e
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+import "dart:collection";
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo() → self::A<dynamic>*
+    return null;
+  method baz() → col::DoubleLinkedQueue<dynamic>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A<dynamic>* a;
+static field col::DoubleLinkedQueue<dynamic>* c;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..97505bc
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends self::A<core::num*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..5ec3988
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Comparable<self::A::X*>* = core::Comparable<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<Y extends self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.weak.modular.expect
new file mode 100644
index 0000000..a0f95a2
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends self::A<self::A::T*>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::A<self::A<dynamic>*>* a;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.modular.expect
new file mode 100644
index 0000000..fbb18cb
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class X<T extends self::B*> extends core::Object {
+  synthetic constructor •() → self::X<self::X::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Y extends self::X<self::B*> {
+  synthetic constructor •() → self::Y*
+    : super self::X::•()
+    ;
+}
+static method main() → void {
+  exp::Expect::isTrue(new self::Y::•() is self::X<self::B*>*);
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.modular.expect
new file mode 100644
index 0000000..1e4c90a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo((core::num*) →* dynamic a) → dynamic
+    return null;
+  method bar() → (core::num*) →* dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.modular.expect
new file mode 100644
index 0000000..954f38c
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+static field core::List<(core::num*) →* dynamic>* a = <(core::num*) →* dynamic>[];
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.weak.modular.expect
new file mode 100644
index 0000000..8f09136
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+class B<S extends core::Object* = dynamic> extends core::Object {
+  final field core::List<(self::B::S*) →* dynamic>* foo = <(self::B::S*) →* dynamic>[];
+  final field core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
+  synthetic constructor •() → self::B<self::B::S*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.modular.expect
new file mode 100644
index 0000000..0914a2c
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+static field core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a = <(core::num*) →* dynamic, (core::num*) →* dynamic>{};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..900d197
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo() → (dynamic) →* dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field (dynamic) →* dynamic a;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..f32d1b22
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::num*> = (T*) →* dynamic;
+class B<T extends (core::num*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.weak.modular.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.weak.modular.expect
new file mode 100644
index 0000000..4280623
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<contravariant S extends (S*) →* dynamic = (dynamic) →* dynamic> = (S*) →* dynamic;
+static field ((dynamic) →* dynamic) →* dynamic b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/compound.dart.weak.modular.expect
new file mode 100644
index 0000000..eb987a6
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Late variable 'local' without initializer is definitely unassigned.
+//   local += 0;
+//   ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+  lowered core::int? #local1;
+  lowered core::bool #local1#isSet = false;
+  function #local1#get() → core::int
+    return #local1#isSet ?{core::int} #local1{core::int} : throw new _in::LateError::localNI("local1");
+  function #local1#set(core::int #t1) → dynamic {
+    #local1#isSet = true;
+    return #local1 = #t1;
+  }
+  #local1#set(0){(core::int) → dynamic};
+  self::expect(0, #local1#get(){() → core::int});
+  #local1#set(#local1#get(){() → core::int}.{core::num::+}(2){(core::num) → core::int}){(core::int) → dynamic};
+  self::expect(2, #local1#get(){() → core::int});
+  lowered core::int? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → core::int {
+    if(!#local2#isSet) {
+      #local2 = 1;
+      #local2#isSet = true;
+    }
+    return #local2{core::int};
+  }
+  function #local2#set(core::int #t2) → dynamic {
+    #local2#isSet = true;
+    return #local2 = #t2;
+  }
+  self::expect(1, #local2#get(){() → core::int});
+  #local2#set(#local2#get(){() → core::int}.{core::num::+}(2){(core::num) → core::int}){(core::int) → dynamic};
+  self::expect(3, #local2#get(){() → core::int});
+}
+static method error() → dynamic {
+  lowered final core::int? #local;
+  lowered core::bool #local#isSet = false;
+  function #local#get() → core::int
+    return #local#isSet ?{core::int} #local{core::int} : throw new _in::LateError::localNI("local");
+  function #local#set(core::int #t3) → dynamic
+    if(#local#isSet)
+      throw new _in::LateError::localAI("local");
+    else {
+      #local#isSet = true;
+      return #local = #t3;
+    }
+  #local#set(invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Late variable 'local' without initializer is definitely unassigned.
+  local += 0;
+  ^^^^^" in #local#get(){() → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int) → dynamic};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.weak.modular.expect
new file mode 100644
index 0000000..c2ac0b9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/covariant_late_field.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/covariant_late_field.dart:19:31: Error: The parameter 'value' of the method 'C.invariantField' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'A.invariantField'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void set invariantField(int value) {} // error
+//                               ^
+// pkg/front_end/testcases/late_lowering/covariant_late_field.dart:6:12: Context: This is the overridden method ('invariantField').
+//   late num invariantField;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class A extends core::Object {
+  field core::num? _#A#invariantField = null;
+  field core::bool _#A#invariantField#isSet = false;
+  field core::num? _#A#covariantField = null;
+  field core::bool _#A#covariantField#isSet = false;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get invariantField() → core::num
+    return this.{self::A::_#A#invariantField#isSet}{core::bool} ?{core::num} let final core::num? #t1 = this.{self::A::_#A#invariantField}{core::num?} in #t1{core::num} : throw new _in::LateError::fieldNI("invariantField");
+  set invariantField(core::num #t2) → void {
+    this.{self::A::_#A#invariantField#isSet} = true;
+    this.{self::A::_#A#invariantField} = #t2;
+  }
+  get covariantField() → core::num
+    return this.{self::A::_#A#covariantField#isSet}{core::bool} ?{core::num} let final core::num? #t3 = this.{self::A::_#A#covariantField}{core::num?} in #t3{core::num} : throw new _in::LateError::fieldNI("covariantField");
+  set covariantField(covariant-by-declaration core::num #t4) → void {
+    this.{self::A::_#A#covariantField#isSet} = true;
+    this.{self::A::_#A#covariantField} = #t4;
+  }
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::num;
+  abstract set invariantField(core::num value) → void;
+  abstract get covariantField() → core::num;
+  abstract set covariantField(covariant-by-declaration core::num value) → void;
+}
+abstract class C extends core::Object implements self::A {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::int;
+  set invariantField(core::int value) → void {}
+  abstract get covariantField() → core::int;
+  set covariantField(covariant-by-declaration core::int value) → void {}
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::int;
+  set invariantField(covariant-by-declaration core::int value) → void {}
+  abstract get covariantField() → core::int;
+  set covariantField(covariant-by-declaration core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.modular.expect
new file mode 100644
index 0000000..28154dd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.modular.expect
@@ -0,0 +1,299 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable '#local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable '#local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable '#local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable '#local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable '#local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable '#local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable '#local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable '#local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable '#local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable '#local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable '#local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable '#local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable '#local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable '#local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
+  lowered final T? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → T%
+    return #local2#isSet ?{T%} #local2{T%} : throw new _in::LateError::localNI("local2");
+  function #local2#set(T% #t1) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateError::localAI("local2");
+    else {
+      #local2#isSet = true;
+      return #local2 = #t1;
+    }
+  lowered final core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t2) → dynamic
+    if(#local4#isSet)
+      throw new _in::LateError::localAI("local4");
+    else {
+      #local4#isSet = true;
+      return #local4 = #t2;
+    }
+  lowered final FutureOr<core::int>? #local6;
+  lowered core::bool #local6#isSet = false;
+  function #local6#get() → FutureOr<core::int>
+    return #local6#isSet ?{FutureOr<core::int>} #local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
+  function #local6#set(FutureOr<core::int>#t3) → dynamic
+    if(#local6#isSet)
+      throw new _in::LateError::localAI("local6");
+    else {
+      #local6#isSet = true;
+      return #local6 = #t3;
+    }
+  #local2#set(value){(T%) → dynamic};
+  #local4#set(0){(core::int) → dynamic};
+  #local6#set(0){(FutureOr<core::int>) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Late final variable '#local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^^" in #local2#set(value){(T%) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Late final variable '#local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^^" in #local4#set(0){(core::int) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Late final variable '#local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^^" in #local6#set(0){(FutureOr<core::int>) → dynamic};
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
+  lowered final T? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → T%
+    return #local2#isSet ?{T%} #local2{T%} : throw new _in::LateError::localNI("local2");
+  function #local2#set(T% #t4) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateError::localAI("local2");
+    else {
+      #local2#isSet = true;
+      return #local2 = #t4;
+    }
+  lowered final core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t5) → dynamic
+    if(#local4#isSet)
+      throw new _in::LateError::localAI("local4");
+    else {
+      #local4#isSet = true;
+      return #local4 = #t5;
+    }
+  lowered final FutureOr<core::int>? #local6;
+  lowered core::bool #local6#isSet = false;
+  function #local6#get() → FutureOr<core::int>
+    return #local6#isSet ?{FutureOr<core::int>} #local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
+  function #local6#set(FutureOr<core::int>#t6) → dynamic
+    if(#local6#isSet)
+      throw new _in::LateError::localAI("local6");
+    else {
+      #local6#isSet = true;
+      return #local6 = #t6;
+    }
+  if(b) {
+    #local2#set(value){(T%) → dynamic};
+    #local4#set(0){(core::int) → dynamic};
+    #local6#set(0){(FutureOr<core::int>) → dynamic};
+  }
+  #local2#set(value){(T%) → dynamic};
+  #local4#set(0){(core::int) → dynamic};
+  #local6#set(0){(FutureOr<core::int>) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Late final variable '#local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^^" in #local2#set(value){(T%) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Late final variable '#local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^^" in #local4#set(0){(core::int) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Late final variable '#local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^^" in #local6#set(0){(FutureOr<core::int>) → dynamic};
+};
+static field () → Null fieldCompound = () → Null {
+  lowered final core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t7) → dynamic
+    if(#local4#isSet)
+      throw new _in::LateError::localAI("local4");
+    else {
+      #local4#isSet = true;
+      return #local4 = #t7;
+    }
+  #local4#set(0){(core::int) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Late final variable '#local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^^" in #local4#set(#local4#get(){() → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int) → dynamic};
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  lowered final self::methodDirect::T? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → self::methodDirect::T%
+    return #local2#isSet ?{self::methodDirect::T%} #local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
+  function #local2#set(self::methodDirect::T% #t8) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateError::localAI("local2");
+    else {
+      #local2#isSet = true;
+      return #local2 = #t8;
+    }
+  lowered final core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t9) → dynamic
+    if(#local4#isSet)
+      throw new _in::LateError::localAI("local4");
+    else {
+      #local4#isSet = true;
+      return #local4 = #t9;
+    }
+  lowered final FutureOr<core::int>? #local6;
+  lowered core::bool #local6#isSet = false;
+  function #local6#get() → FutureOr<core::int>
+    return #local6#isSet ?{FutureOr<core::int>} #local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
+  function #local6#set(FutureOr<core::int>#t10) → dynamic
+    if(#local6#isSet)
+      throw new _in::LateError::localAI("local6");
+    else {
+      #local6#isSet = true;
+      return #local6 = #t10;
+    }
+  #local2#set(value){(self::methodDirect::T%) → dynamic};
+  #local4#set(0){(core::int) → dynamic};
+  #local6#set(0){(FutureOr<core::int>) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Late final variable '#local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^^" in #local2#set(value){(self::methodDirect::T%) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Late final variable '#local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^^" in #local4#set(0){(core::int) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Late final variable '#local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^^" in #local6#set(0){(FutureOr<core::int>) → dynamic};
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  lowered final self::methodConditional::T? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → self::methodConditional::T%
+    return #local2#isSet ?{self::methodConditional::T%} #local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
+  function #local2#set(self::methodConditional::T% #t11) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateError::localAI("local2");
+    else {
+      #local2#isSet = true;
+      return #local2 = #t11;
+    }
+  lowered final core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t12) → dynamic
+    if(#local4#isSet)
+      throw new _in::LateError::localAI("local4");
+    else {
+      #local4#isSet = true;
+      return #local4 = #t12;
+    }
+  lowered final FutureOr<core::int>? #local6;
+  lowered core::bool #local6#isSet = false;
+  function #local6#get() → FutureOr<core::int>
+    return #local6#isSet ?{FutureOr<core::int>} #local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
+  function #local6#set(FutureOr<core::int>#t13) → dynamic
+    if(#local6#isSet)
+      throw new _in::LateError::localAI("local6");
+    else {
+      #local6#isSet = true;
+      return #local6 = #t13;
+    }
+  if(b) {
+    #local2#set(value){(self::methodConditional::T%) → dynamic};
+    #local4#set(0){(core::int) → dynamic};
+    #local6#set(0){(FutureOr<core::int>) → dynamic};
+  }
+  #local2#set(value){(self::methodConditional::T%) → dynamic};
+  #local4#set(0){(core::int) → dynamic};
+  #local6#set(0){(FutureOr<core::int>) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Late final variable '#local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^^" in #local2#set(value){(self::methodConditional::T%) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Late final variable '#local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^^" in #local4#set(0){(core::int) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Late final variable '#local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^^" in #local6#set(0){(FutureOr<core::int>) → dynamic};
+}
+static method methodCompound() → dynamic {
+  lowered final core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t14) → dynamic
+    if(#local4#isSet)
+      throw new _in::LateError::localAI("local4");
+    else {
+      #local4#isSet = true;
+      return #local4 = #t14;
+    }
+  #local4#set(0){(core::int) → dynamic};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Late final variable '#local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^^" in #local4#set(#local4#get(){() → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int) → dynamic};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.modular.expect
new file mode 100644
index 0000000..5589982
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.modular.expect
@@ -0,0 +1,383 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
+  T% local1;
+  lowered T? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → T%
+    return #local2#isSet ?{T%} #local2{T%} : throw new _in::LateError::localNI("local2");
+  function #local2#set(T% #t1) → dynamic {
+    #local2#isSet = true;
+    return #local2 = #t1;
+  }
+  core::int local3;
+  lowered core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t2) → dynamic {
+    #local4#isSet = true;
+    return #local4 = #t2;
+  }
+  FutureOr<core::int>local5;
+  lowered FutureOr<core::int>? #local6;
+  lowered core::bool #local6#isSet = false;
+  function #local6#get() → FutureOr<core::int>
+    return #local6#isSet ?{FutureOr<core::int>} #local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
+  function #local6#set(FutureOr<core::int>#t3) → dynamic {
+    #local6#isSet = true;
+    return #local6 = #t3;
+  }
+  lowered T? #local7;
+  lowered core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7 = value;
+      #local7#isSet = true;
+    }
+    return #local7{T%};
+  }
+  function #local7#set(T% #t4) → dynamic {
+    #local7#isSet = true;
+    return #local7 = #t4;
+  }
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get(){() → T%};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in #local6#get(){() → FutureOr<core::int>};
+  #local7#get(){() → T%};
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
+  T% local1;
+  lowered T? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → T%
+    return #local2#isSet ?{T%} #local2{T%} : throw new _in::LateError::localNI("local2");
+  function #local2#set(T% #t5) → dynamic {
+    #local2#isSet = true;
+    return #local2 = #t5;
+  }
+  core::int local3;
+  lowered core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t6) → dynamic {
+    #local4#isSet = true;
+    return #local4 = #t6;
+  }
+  FutureOr<core::int>local5;
+  lowered FutureOr<core::int>? #local6;
+  lowered core::bool #local6#isSet = false;
+  function #local6#get() → FutureOr<core::int>
+    return #local6#isSet ?{FutureOr<core::int>} #local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
+  function #local6#set(FutureOr<core::int>#t7) → dynamic {
+    #local6#isSet = true;
+    return #local6 = #t7;
+  }
+  lowered T? #local7;
+  lowered core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7 = value;
+      #local7#isSet = true;
+    }
+    return #local7{T%};
+  }
+  function #local7#set(T% #t8) → dynamic {
+    #local7#isSet = true;
+    return #local7 = #t8;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set(value){(T%) → dynamic};
+    local3 = 0;
+    #local4#set(0){(core::int) → dynamic};
+    local5 = 0;
+    #local6#set(0){(FutureOr<core::int>) → dynamic};
+    #local7#get(){() → T%};
+  }
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get(){() → T%};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get(){() → FutureOr<core::int>};
+  #local7#get(){() → T%};
+};
+static field () → Null fieldCompound = () → Null {
+  core::int local3;
+  lowered core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t9) → dynamic {
+    #local4#isSet = true;
+    return #local4 = #t9;
+  }
+  local3 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3 += 0; // error
+  ^^^^^^" in local3.{core::num::+}(0){(core::num) → core::int};
+  #local4#set(invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get(){() → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int) → dynamic};
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  lowered self::methodDirect::T? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → self::methodDirect::T%
+    return #local2#isSet ?{self::methodDirect::T%} #local2{self::methodDirect::T%} : throw new _in::LateError::localNI("local2");
+  function #local2#set(self::methodDirect::T% #t10) → dynamic {
+    #local2#isSet = true;
+    return #local2 = #t10;
+  }
+  core::int local3;
+  lowered core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t11) → dynamic {
+    #local4#isSet = true;
+    return #local4 = #t11;
+  }
+  FutureOr<core::int>local5;
+  lowered FutureOr<core::int>? #local6;
+  lowered core::bool #local6#isSet = false;
+  function #local6#get() → FutureOr<core::int>
+    return #local6#isSet ?{FutureOr<core::int>} #local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
+  function #local6#set(FutureOr<core::int>#t12) → dynamic {
+    #local6#isSet = true;
+    return #local6 = #t12;
+  }
+  lowered self::methodDirect::T? #local7;
+  lowered core::bool #local7#isSet = false;
+  function #local7#get() → self::methodDirect::T% {
+    if(!#local7#isSet) {
+      #local7 = value;
+      #local7#isSet = true;
+    }
+    return #local7{self::methodDirect::T%};
+  }
+  function #local7#set(self::methodDirect::T% #t13) → dynamic {
+    #local7#isSet = true;
+    return #local7 = #t13;
+  }
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get(){() → self::methodDirect::T%};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in #local6#get(){() → FutureOr<core::int>};
+  #local7#get(){() → self::methodDirect::T%};
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  lowered self::methodConditional::T? #local2;
+  lowered core::bool #local2#isSet = false;
+  function #local2#get() → self::methodConditional::T%
+    return #local2#isSet ?{self::methodConditional::T%} #local2{self::methodConditional::T%} : throw new _in::LateError::localNI("local2");
+  function #local2#set(self::methodConditional::T% #t14) → dynamic {
+    #local2#isSet = true;
+    return #local2 = #t14;
+  }
+  core::int local3;
+  lowered core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t15) → dynamic {
+    #local4#isSet = true;
+    return #local4 = #t15;
+  }
+  FutureOr<core::int>local5;
+  lowered FutureOr<core::int>? #local6;
+  lowered core::bool #local6#isSet = false;
+  function #local6#get() → FutureOr<core::int>
+    return #local6#isSet ?{FutureOr<core::int>} #local6{FutureOr<core::int>} : throw new _in::LateError::localNI("local6");
+  function #local6#set(FutureOr<core::int>#t16) → dynamic {
+    #local6#isSet = true;
+    return #local6 = #t16;
+  }
+  lowered self::methodConditional::T? #local7;
+  lowered core::bool #local7#isSet = false;
+  function #local7#get() → self::methodConditional::T% {
+    if(!#local7#isSet) {
+      #local7 = value;
+      #local7#isSet = true;
+    }
+    return #local7{self::methodConditional::T%};
+  }
+  function #local7#set(self::methodConditional::T% #t17) → dynamic {
+    #local7#isSet = true;
+    return #local7 = #t17;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set(value){(self::methodConditional::T%) → dynamic};
+    local3 = 0;
+    #local4#set(0){(core::int) → dynamic};
+    local5 = 0;
+    #local6#set(0){(FutureOr<core::int>) → dynamic};
+    #local7#set(value){(self::methodConditional::T%) → dynamic};
+  }
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get(){() → self::methodConditional::T%};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get(){() → FutureOr<core::int>};
+  #local7#get(){() → self::methodConditional::T%};
+}
+static method methodCompound() → dynamic {
+  core::int local3;
+  lowered core::int? #local4;
+  lowered core::bool #local4#isSet = false;
+  function #local4#get() → core::int
+    return #local4#isSet ?{core::int} #local4{core::int} : throw new _in::LateError::localNI("local4");
+  function #local4#set(core::int #t18) → dynamic {
+    #local4#isSet = true;
+    return #local4 = #t18;
+  }
+  local3 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3 += 0; // error
+  ^^^^^^" in local3.{core::num::+}(0){(core::num) → core::int};
+  #local4#set(invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get(){() → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int) → dynamic};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.modular.expect
new file mode 100644
index 0000000..12210ba
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart.weak.modular.expect
@@ -0,0 +1,151 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:12: Error: The type 'int?' of the inherited getter 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the declaration of the getter 'B1.property6'.
+//   late final int? property6;
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:32:26: Error: The parameter 'i' of the method 'B2.property6' has type 'int', which does not match the corresponding type, 'int?', in the overridden method, 'B1.property6'.
+// Change to a supertype of 'int?', or, for a covariant parameter, a subtype.
+//   void set property6(int i); // error
+//                          ^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:20:19: Context: This is the overridden method ('property6').
+//   late final int? property6;
+//                   ^
+//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:52:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
+// Change to a subtype of 'int'.
+//   int? get property6; // error
+//            ^
+// pkg/front_end/testcases/late_lowering/getter_vs_setter_type.dart:40:12: Context: This is the overridden method ('property6').
+//   late int property6;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A extends core::Object {
+  field core::int? _#A#property4 = null;
+  field core::bool _#A#property4#isSet = false;
+  field core::int? _#A#property5 = null;
+  field core::bool _#A#property5#isSet = false;
+  field core::int? _#A#property6 = null;
+  field core::bool _#A#property6#isSet = false;
+  constructor •(core::int property4, core::int? property5, core::int property6) → self::A
+    : self::A::_#A#property4#isSet = true, self::A::_#A#property4 = property4, self::A::_#A#property5#isSet = true, self::A::_#A#property5 = property5, self::A::_#A#property6#isSet = true, self::A::_#A#property6 = property6, super core::Object::•()
+    ;
+  get property4() → core::int
+    return this.{self::A::_#A#property4#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#property4}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("property4");
+  set property4(core::int #t2) → void {
+    this.{self::A::_#A#property4#isSet} = true;
+    this.{self::A::_#A#property4} = #t2;
+  }
+  get property5() → core::int?
+    return this.{self::A::_#A#property5#isSet}{core::bool} ?{core::int?} this.{self::A::_#A#property5}{core::int?} : throw new _in::LateError::fieldNI("property5");
+  set property5(core::int? #t3) → void {
+    this.{self::A::_#A#property5#isSet} = true;
+    this.{self::A::_#A#property5} = #t3;
+  }
+  get property6() → core::int
+    return this.{self::A::_#A#property6#isSet}{core::bool} ?{core::int} let final core::int? #t4 = this.{self::A::_#A#property6}{core::int?} in #t4{core::int} : throw new _in::LateError::fieldNI("property6");
+  set property6(covariant-by-declaration core::int #t5) → void {
+    this.{self::A::_#A#property6#isSet} = true;
+    this.{self::A::_#A#property6} = #t5;
+  }
+}
+abstract class B1 extends core::Object {
+  field core::int? _#B1#property4 = null;
+  field core::bool _#B1#property4#isSet = false;
+  field core::int? _#B1#property5 = null;
+  field core::bool _#B1#property5#isSet = false;
+  field core::int? _#B1#property6 = null;
+  field core::bool _#B1#property6#isSet = false;
+  constructor •(core::int property4, core::int property5, core::int? property6) → self::B1
+    : self::B1::_#B1#property4#isSet = true, self::B1::_#B1#property4 = property4, self::B1::_#B1#property5#isSet = true, self::B1::_#B1#property5 = property5, self::B1::_#B1#property6#isSet = true, self::B1::_#B1#property6 = property6, super core::Object::•()
+    ;
+  get property4() → core::int
+    return this.{self::B1::_#B1#property4#isSet}{core::bool} ?{core::int} let final core::int? #t6 = this.{self::B1::_#B1#property4}{core::int?} in #t6{core::int} : throw new _in::LateError::fieldNI("property4");
+  set property4(core::int #t7) → void
+    if(this.{self::B1::_#B1#property4#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("property4");
+    else {
+      this.{self::B1::_#B1#property4#isSet} = true;
+      this.{self::B1::_#B1#property4} = #t7;
+    }
+  get property5() → core::int
+    return this.{self::B1::_#B1#property5#isSet}{core::bool} ?{core::int} let final core::int? #t8 = this.{self::B1::_#B1#property5}{core::int?} in #t8{core::int} : throw new _in::LateError::fieldNI("property5");
+  set property5(core::int #t9) → void
+    if(this.{self::B1::_#B1#property5#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("property5");
+    else {
+      this.{self::B1::_#B1#property5#isSet} = true;
+      this.{self::B1::_#B1#property5} = #t9;
+    }
+  get property6() → core::int?
+    return this.{self::B1::_#B1#property6#isSet}{core::bool} ?{core::int?} this.{self::B1::_#B1#property6}{core::int?} : throw new _in::LateError::fieldNI("property6");
+  set property6(core::int? #t10) → void
+    if(this.{self::B1::_#B1#property6#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("property6");
+    else {
+      this.{self::B1::_#B1#property6#isSet} = true;
+      this.{self::B1::_#B1#property6} = #t10;
+    }
+}
+abstract class B2 extends core::Object implements self::B1 {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+  abstract set property4(core::int i) → void;
+  abstract set property5(core::int? i) → void;
+  abstract set property6(core::int i) → void;
+}
+abstract class C1 extends core::Object {
+  field core::int? _#C1#property4 = null;
+  field core::bool _#C1#property4#isSet = false;
+  field core::int? _#C1#property5 = null;
+  field core::bool _#C1#property5#isSet = false;
+  field core::int? _#C1#property6 = null;
+  field core::bool _#C1#property6#isSet = false;
+  constructor •(core::int property4, core::int property5, core::int property6) → self::C1
+    : self::C1::_#C1#property4#isSet = true, self::C1::_#C1#property4 = property4, self::C1::_#C1#property5#isSet = true, self::C1::_#C1#property5 = property5, self::C1::_#C1#property6#isSet = true, self::C1::_#C1#property6 = property6, super core::Object::•()
+    ;
+  get property4() → core::int
+    return this.{self::C1::_#C1#property4#isSet}{core::bool} ?{core::int} let final core::int? #t11 = this.{self::C1::_#C1#property4}{core::int?} in #t11{core::int} : throw new _in::LateError::fieldNI("property4");
+  set property4(core::int #t12) → void {
+    this.{self::C1::_#C1#property4#isSet} = true;
+    this.{self::C1::_#C1#property4} = #t12;
+  }
+  get property5() → core::int
+    return this.{self::C1::_#C1#property5#isSet}{core::bool} ?{core::int} let final core::int? #t13 = this.{self::C1::_#C1#property5}{core::int?} in #t13{core::int} : throw new _in::LateError::fieldNI("property5");
+  set property5(core::int #t14) → void {
+    this.{self::C1::_#C1#property5#isSet} = true;
+    this.{self::C1::_#C1#property5} = #t14;
+  }
+  get property6() → core::int
+    return this.{self::C1::_#C1#property6#isSet}{core::bool} ?{core::int} let final core::int? #t15 = this.{self::C1::_#C1#property6}{core::int?} in #t15{core::int} : throw new _in::LateError::fieldNI("property6");
+  set property6(core::int #t16) → void {
+    this.{self::C1::_#C1#property6#isSet} = true;
+    this.{self::C1::_#C1#property6} = #t16;
+  }
+}
+abstract class C2 extends core::Object implements self::C1 {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+  abstract get property4() → core::int;
+  abstract get property5() → core::int;
+  abstract get property6() → core::int?;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..6d53db1
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method main() → dynamic {
+  lowered core::int? #local;
+  lowered core::bool #local#isSet = false;
+  function #local#get() → core::int
+    return #local#isSet ?{core::int} #local{core::int} : throw new _in::LateError::localNI("local");
+  function #local#set(core::int #t1) → dynamic {
+    #local#isSet = true;
+    return #local = #t1;
+  }
+  #local#set(self::f<core::int>(0)){(core::int) → dynamic};
+}
diff --git a/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.modular.expect
new file mode 100644
index 0000000..f6de289
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_late_field_type.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class A extends core::Object {
+  field core::int? field = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  field core::int? _#B#field = null;
+  field core::bool _#B#field#isSet = false;
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  get field() → core::int?
+    return this.{self::B::_#B#field#isSet}{core::bool} ?{core::int?} this.{self::B::_#B#field}{core::int?} : throw new _in::LateError::fieldNI("field");
+  set field(core::int? #t1) → void {
+    this.{self::B::_#B#field#isSet} = true;
+    this.{self::B::_#B#field} = #t1;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.modular.expect
new file mode 100644
index 0000000..fdfbb02
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite.dart.weak.modular.expect
@@ -0,0 +1,107 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  static field core::int nonNullableStaticFieldReads = 0;
+  static field core::int? _#nonNullableStaticField = null;
+  static field core::bool _#nonNullableStaticField#isSet = false;
+  static field core::int nullableStaticFieldReads = 0;
+  static field core::int? _#nullableStaticField = null;
+  static field core::bool _#nullableStaticField#isSet = false;
+  field core::int nonNullableInstanceFieldReads = 0;
+  field core::int? _#Class#nonNullableInstanceField = null;
+  field core::bool _#Class#nonNullableInstanceField#isSet = false;
+  field core::int nullableInstanceFieldReads = 0;
+  field core::int? _#Class#nullableInstanceField = null;
+  field core::bool _#Class#nullableInstanceField#isSet = false;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static get nonNullableStaticField() → core::int {
+    if(!self::Class::_#nonNullableStaticField#isSet) {
+      final core::int #t1 = (let final core::int #t2 = self::Class::nonNullableStaticFieldReads in let final core::int #t3 = self::Class::nonNullableStaticFieldReads = #t2.{core::num::+}(1){(core::num) → core::int} in #t2) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} self::Class::nonNullableStaticField.{core::num::+}(1){(core::num) → core::int} : 0;
+      if(self::Class::_#nonNullableStaticField#isSet)
+        throw new _in::LateError::fieldADI("nonNullableStaticField");
+      self::Class::_#nonNullableStaticField = #t1;
+      self::Class::_#nonNullableStaticField#isSet = true;
+    }
+    return let final core::int? #t4 = self::Class::_#nonNullableStaticField in #t4{core::int};
+  }
+  static get nullableStaticField() → core::int? {
+    if(!self::Class::_#nullableStaticField#isSet) {
+      final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1){(core::num) → core::int} in #t6) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} self::Class::nullableStaticField.{core::Object::hashCode}{core::int} : 0;
+      if(self::Class::_#nullableStaticField#isSet)
+        throw new _in::LateError::fieldADI("nullableStaticField");
+      self::Class::_#nullableStaticField = #t5;
+      self::Class::_#nullableStaticField#isSet = true;
+    }
+    return self::Class::_#nullableStaticField;
+  }
+  get nonNullableInstanceField() → core::int {
+    if(!this.{self::Class::_#Class#nonNullableInstanceField#isSet}{core::bool}) {
+      final core::int #t8 = (let final core::int #t9 = this.{self::Class::nonNullableInstanceFieldReads}{core::int} in let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} = #t9.{core::num::+}(1){(core::num) → core::int} in #t9) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} this.{self::Class::nonNullableInstanceField}{core::int}.{core::num::+}(1){(core::num) → core::int} : 0;
+      if(this.{self::Class::_#Class#nonNullableInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("nonNullableInstanceField");
+      this.{self::Class::_#Class#nonNullableInstanceField} = #t8;
+      this.{self::Class::_#Class#nonNullableInstanceField#isSet} = true;
+    }
+    return let final core::int? #t11 = this.{self::Class::_#Class#nonNullableInstanceField}{core::int?} in #t11{core::int};
+  }
+  get nullableInstanceField() → core::int? {
+    if(!this.{self::Class::_#Class#nullableInstanceField#isSet}{core::bool}) {
+      final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads}{core::int} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1){(core::num) → core::int} in #t13) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} this.{self::Class::nullableInstanceField}{core::int?}.{core::Object::hashCode}{core::int} : 0;
+      if(this.{self::Class::_#Class#nullableInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("nullableInstanceField");
+      this.{self::Class::_#Class#nullableInstanceField} = #t12;
+      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
+    }
+    return this.{self::Class::_#Class#nullableInstanceField}{core::int?};
+  }
+}
+static field core::int nonNullableTopLevelFieldReads = 0;
+static field core::int? _#nonNullableTopLevelField = null;
+static field core::bool _#nonNullableTopLevelField#isSet = false;
+static field core::int nullableTopLevelFieldReads = 0;
+static field core::int? _#nullableTopLevelField = null;
+static field core::bool _#nullableTopLevelField#isSet = false;
+static get nonNullableTopLevelField() → core::int {
+  if(!self::_#nonNullableTopLevelField#isSet) {
+    final core::int #t15 = (let final core::int #t16 = self::nonNullableTopLevelFieldReads in let final core::int #t17 = self::nonNullableTopLevelFieldReads = #t16.{core::num::+}(1){(core::num) → core::int} in #t16) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} self::nonNullableTopLevelField.{core::num::+}(1){(core::num) → core::int} : 0;
+    if(self::_#nonNullableTopLevelField#isSet)
+      throw new _in::LateError::fieldADI("nonNullableTopLevelField");
+    self::_#nonNullableTopLevelField = #t15;
+    self::_#nonNullableTopLevelField#isSet = true;
+  }
+  return let final core::int? #t18 = self::_#nonNullableTopLevelField in #t18{core::int};
+}
+static get nullableTopLevelField() → core::int? {
+  if(!self::_#nullableTopLevelField#isSet) {
+    final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1){(core::num) → core::int} in #t20) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} self::nullableTopLevelField.{core::Object::hashCode}{core::int} : 0;
+    if(self::_#nullableTopLevelField#isSet)
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
+    self::_#nullableTopLevelField = #t19;
+    self::_#nullableTopLevelField#isSet = true;
+  }
+  return self::_#nullableTopLevelField;
+}
+static method main() → void {
+  self::throws(() → core::int => self::nonNullableTopLevelField, "Read nonNullableTopLevelField");
+  self::throws(() → core::int? => self::nullableTopLevelField, "Read nullableTopLevelField");
+  self::throws(() → core::int => self::Class::nonNullableStaticField, "Read nonNullableStaticField");
+  self::throws(() → core::int? => self::Class::nullableStaticField, "Read nullableStaticField");
+  self::throws(() → core::int => new self::Class::•().{self::Class::nonNullableInstanceField}{core::int}, "Read nonNullableInstanceField");
+  self::throws(() → core::int? => new self::Class::•().{self::Class::nullableInstanceField}{core::int?}, "Read nullableInstanceField");
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..c72d69f
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/initializer_rewrite_from_opt_out.dart.weak.modular.expect
@@ -0,0 +1,117 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "initializer_rewrite_from_opt_out_lib.dart" as ini;
+import "dart:_internal" as _in;
+
+import "org-dartlang-testcase:///initializer_rewrite_from_opt_out_lib.dart";
+
+class Class extends core::Object {
+  static field core::int nonNullableStaticFieldReads = 0;
+  static field core::int? _#nonNullableStaticField = null;
+  static field core::bool _#nonNullableStaticField#isSet = false;
+  static field core::int nullableStaticFieldReads = 0;
+  static field core::int? _#nullableStaticField = null;
+  static field core::bool _#nullableStaticField#isSet = false;
+  field core::int nonNullableInstanceFieldReads = 0;
+  field core::int? _#Class#nonNullableInstanceField = null;
+  field core::bool _#Class#nonNullableInstanceField#isSet = false;
+  field core::int nullableInstanceFieldReads = 0;
+  field core::int? _#Class#nullableInstanceField = null;
+  field core::bool _#Class#nullableInstanceField#isSet = false;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static get nonNullableStaticField() → core::int {
+    if(!self::Class::_#nonNullableStaticField#isSet) {
+      final core::int #t1 = (let final core::int #t2 = self::Class::nonNullableStaticFieldReads in let final core::int #t3 = self::Class::nonNullableStaticFieldReads = #t2.{core::num::+}(1){(core::num) → core::int} in #t2) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int*} self::Class::nonNullableStaticField : ini::computeInitialValue();
+      if(self::Class::_#nonNullableStaticField#isSet)
+        throw new _in::LateError::fieldADI("nonNullableStaticField");
+      self::Class::_#nonNullableStaticField = #t1;
+      self::Class::_#nonNullableStaticField#isSet = true;
+    }
+    return let final core::int? #t4 = self::Class::_#nonNullableStaticField in #t4{core::int};
+  }
+  static get nullableStaticField() → core::int? {
+    if(!self::Class::_#nullableStaticField#isSet) {
+      final core::int? #t5 = (let final core::int #t6 = self::Class::nullableStaticFieldReads in let final core::int #t7 = self::Class::nullableStaticFieldReads = #t6.{core::num::+}(1){(core::num) → core::int} in #t6) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int?} self::Class::nullableStaticField : ini::computeInitialValue();
+      if(self::Class::_#nullableStaticField#isSet)
+        throw new _in::LateError::fieldADI("nullableStaticField");
+      self::Class::_#nullableStaticField = #t5;
+      self::Class::_#nullableStaticField#isSet = true;
+    }
+    return self::Class::_#nullableStaticField;
+  }
+  get nonNullableInstanceField() → core::int {
+    if(!this.{self::Class::_#Class#nonNullableInstanceField#isSet}{core::bool}) {
+      final core::int #t8 = (let final core::int #t9 = this.{self::Class::nonNullableInstanceFieldReads}{core::int} in let final core::int #t10 = this.{self::Class::nonNullableInstanceFieldReads} = #t9.{core::num::+}(1){(core::num) → core::int} in #t9) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int*} this.{self::Class::nonNullableInstanceField}{core::int} : ini::computeInitialValue();
+      if(this.{self::Class::_#Class#nonNullableInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("nonNullableInstanceField");
+      this.{self::Class::_#Class#nonNullableInstanceField} = #t8;
+      this.{self::Class::_#Class#nonNullableInstanceField#isSet} = true;
+    }
+    return let final core::int? #t11 = this.{self::Class::_#Class#nonNullableInstanceField}{core::int?} in #t11{core::int};
+  }
+  get nullableInstanceField() → core::int? {
+    if(!this.{self::Class::_#Class#nullableInstanceField#isSet}{core::bool}) {
+      final core::int? #t12 = (let final core::int #t13 = this.{self::Class::nullableInstanceFieldReads}{core::int} in let final core::int #t14 = this.{self::Class::nullableInstanceFieldReads} = #t13.{core::num::+}(1){(core::num) → core::int} in #t13) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int?} this.{self::Class::nullableInstanceField}{core::int?} : ini::computeInitialValue();
+      if(this.{self::Class::_#Class#nullableInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("nullableInstanceField");
+      this.{self::Class::_#Class#nullableInstanceField} = #t12;
+      this.{self::Class::_#Class#nullableInstanceField#isSet} = true;
+    }
+    return this.{self::Class::_#Class#nullableInstanceField}{core::int?};
+  }
+}
+static field core::int nonNullableTopLevelFieldReads = 0;
+static field core::int? _#nonNullableTopLevelField = null;
+static field core::bool _#nonNullableTopLevelField#isSet = false;
+static field core::int nullableTopLevelFieldReads = 0;
+static field core::int? _#nullableTopLevelField = null;
+static field core::bool _#nullableTopLevelField#isSet = false;
+static get nonNullableTopLevelField() → core::int {
+  if(!self::_#nonNullableTopLevelField#isSet) {
+    final core::int #t15 = (let final core::int #t16 = self::nonNullableTopLevelFieldReads in let final core::int #t17 = self::nonNullableTopLevelFieldReads = #t16.{core::num::+}(1){(core::num) → core::int} in #t16) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int*} self::nonNullableTopLevelField : ini::computeInitialValue();
+    if(self::_#nonNullableTopLevelField#isSet)
+      throw new _in::LateError::fieldADI("nonNullableTopLevelField");
+    self::_#nonNullableTopLevelField = #t15;
+    self::_#nonNullableTopLevelField#isSet = true;
+  }
+  return let final core::int? #t18 = self::_#nonNullableTopLevelField in #t18{core::int};
+}
+static get nullableTopLevelField() → core::int? {
+  if(!self::_#nullableTopLevelField#isSet) {
+    final core::int? #t19 = (let final core::int #t20 = self::nullableTopLevelFieldReads in let final core::int #t21 = self::nullableTopLevelFieldReads = #t20.{core::num::+}(1){(core::num) → core::int} in #t20) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int?} self::nullableTopLevelField : ini::computeInitialValue();
+    if(self::_#nullableTopLevelField#isSet)
+      throw new _in::LateError::fieldADI("nullableTopLevelField");
+    self::_#nullableTopLevelField = #t19;
+    self::_#nullableTopLevelField#isSet = true;
+  }
+  return self::_#nullableTopLevelField;
+}
+static method main() → void {
+  self::throws(() → core::int => self::nonNullableTopLevelField, "Read nonNullableTopLevelField");
+  self::throws(() → core::int? => self::nullableTopLevelField, "Read nullableTopLevelField");
+  self::throws(() → core::int => self::Class::nonNullableStaticField, "Read nonNullableStaticField");
+  self::throws(() → core::int? => self::Class::nullableStaticField, "Read nullableStaticField");
+  self::throws(() → core::int => new self::Class::•().{self::Class::nonNullableInstanceField}{core::int}, "Read nonNullableInstanceField");
+  self::throws(() → core::int? => new self::Class::•().{self::Class::nullableInstanceField}{core::int?}, "Read nullableInstanceField");
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
+
+library;
+import self as ini;
+import "dart:core" as core;
+
+static method computeInitialValue() → core::int*
+  return null;
diff --git a/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.modular.expect
new file mode 100644
index 0000000..75e0cf4
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/injected_late_field_checks/main.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "dart:test";
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class extends core::Object {
+  field core::int? _#Class#foo = null /* from org-dartlang-testcase:///patch_lib.dart */;
+  field core::bool _#Class#foo#isSet = false /* from org-dartlang-testcase:///patch_lib.dart */;
+  constructor bar() → self2::Class
+    : super core::Object::•()
+    ;
+  constructor baz(core::int foo) → self2::Class
+    : self2::Class::_#Class#foo#isSet = true, self2::Class::_#Class#foo = foo, super core::Object::•()
+    ;
+  get /* from org-dartlang-testcase:///patch_lib.dart */ foo() → core::int
+    return this.{self2::Class::_#Class#foo#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self2::Class::_#Class#foo}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("foo");
+  set /* from org-dartlang-testcase:///patch_lib.dart */ foo(core::int #t2) → void {
+    this.{self2::Class::_#Class#foo#isSet} = true;
+    this.{self2::Class::_#Class#foo} = #t2;
+  }
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+}
diff --git a/pkg/front_end/testcases/late_lowering/instance_field_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/instance_field_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..ccb0618
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/instance_field_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,102 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? _#Class#field = null;
+  field core::bool _#Class#field#isSet = false;
+  constructor constructor1() → self::Class
+    : super core::Object::•()
+    ;
+  constructor constructor2(core::int field) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  constructor constructor3(core::int value) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = value.{core::num::+}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+  constructor constructor4([core::int field = #C1]) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  get field() → core::int {
+    if(!this.{self::Class::_#Class#field#isSet}{core::bool}) {
+      this.{self::Class::_#Class#field} = 10;
+      this.{self::Class::_#Class#field#isSet} = true;
+    }
+    return let final core::int? #t1 = this.{self::Class::_#Class#field}{core::int?} in #t1{core::int};
+  }
+  set field(core::int #t2) → void {
+    this.{self::Class::_#Class#field#isSet} = true;
+    this.{self::Class::_#Class#field} = #t2;
+  }
+}
+class Subclass extends self::Class {
+  constructor constructor1() → self::Subclass
+    : super self::Class::constructor1()
+    ;
+  constructor constructor2(core::int value) → self::Subclass
+    : super self::Class::constructor2(value)
+    ;
+  constructor constructor3(core::int value) → self::Subclass
+    : super self::Class::constructor3(value)
+    ;
+  constructor constructor4([core::int value = #C2]) → self::Subclass
+    : super self::Class::constructor4(value)
+    ;
+}
+static method test1() → dynamic {
+  self::Class c1 = new self::Class::constructor1();
+  self::expect(10, c1.{self::Class::field}{core::int});
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int});
+  self::Class c2 = new self::Class::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int});
+  c2.{self::Class::field} = 43;
+  self::expect(43, c2.{self::Class::field}{core::int});
+  self::Class c3 = new self::Class::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int});
+  c3.{self::Class::field} = 89;
+  self::expect(89, c3.{self::Class::field}{core::int});
+  self::Class c4 = new self::Class::constructor4();
+  self::expect(42, c4.{self::Class::field}{core::int});
+  c4.{self::Class::field} = 43;
+  self::expect(43, c4.{self::Class::field}{core::int});
+  self::Class c5 = new self::Class::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int});
+  c5.{self::Class::field} = 124;
+  self::expect(124, c5.{self::Class::field}{core::int});
+}
+static method test2() → dynamic {
+  self::Subclass c1 = new self::Subclass::constructor1();
+  self::expect(10, c1.{self::Class::field}{core::int});
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int});
+  self::Subclass c2 = new self::Subclass::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int});
+  c2.{self::Class::field} = 43;
+  self::expect(43, c2.{self::Class::field}{core::int});
+  self::Subclass c3 = new self::Subclass::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int});
+  c3.{self::Class::field} = 89;
+  self::expect(89, c3.{self::Class::field}{core::int});
+  self::Subclass c4 = new self::Subclass::constructor4();
+  self::expect(87, c4.{self::Class::field}{core::int});
+  c4.{self::Class::field} = 88;
+  self::expect(88, c4.{self::Class::field}{core::int});
+  self::Subclass c5 = new self::Subclass::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int});
+  c5.{self::Class::field} = 124;
+  self::expect(124, c5.{self::Class::field}{core::int});
+}
+static method main() → dynamic {
+  self::test1();
+  self::test2();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = 87
+}
diff --git a/pkg/front_end/testcases/late_lowering/instance_field_with_initializer.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/instance_field_with_initializer.dart.weak.outline.expect
index fa7bd6a..6ae21b7 100644
--- a/pkg/front_end/testcases/late_lowering/instance_field_with_initializer.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_field_with_initializer.dart.weak.outline.expect
@@ -11,7 +11,7 @@
     ;
   constructor constructor3(core::int value) → self::Class
     ;
-  constructor constructor4([core::int field]) → self::Class
+  constructor constructor4([core::int field = 42]) → self::Class
     ;
   get field() → core::int;
   set field(core::int #t1) → void;
@@ -23,7 +23,7 @@
     ;
   constructor constructor3(core::int value) → self::Subclass
     ;
-  constructor constructor4([core::int value]) → self::Subclass
+  constructor constructor4([core::int value = 87]) → self::Subclass
     ;
 }
 static method test1() → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..b2fdacb
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  field core::int? _#Class#field = null;
+  field core::bool _#Class#field#isSet = false;
+  constructor constructor1() → self::Class
+    : super core::Object::•()
+    ;
+  constructor constructor2(core::int field) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  constructor constructor3(core::int value) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = value.{core::num::+}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+  constructor constructor4([core::int field = #C1]) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  get field() → core::int
+    return this.{self::Class::_#Class#field#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("field");
+  set field(core::int #t2) → void {
+    this.{self::Class::_#Class#field#isSet} = true;
+    this.{self::Class::_#Class#field} = #t2;
+  }
+}
+class Subclass extends self::Class {
+  constructor constructor1() → self::Subclass
+    : super self::Class::constructor1()
+    ;
+  constructor constructor2(core::int value) → self::Subclass
+    : super self::Class::constructor2(value)
+    ;
+  constructor constructor3(core::int value) → self::Subclass
+    : super self::Class::constructor3(value)
+    ;
+  constructor constructor4([core::int value = #C2]) → self::Subclass
+    : super self::Class::constructor4(value)
+    ;
+}
+static method test1() → dynamic {
+  self::Class c1 = new self::Class::constructor1();
+  self::throws(() → core::int => c1.{self::Class::field}{core::int}, "Read value from uninitialized Class.field");
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int});
+  self::Class c2 = new self::Class::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int});
+  c2.{self::Class::field} = 43;
+  self::expect(43, c2.{self::Class::field}{core::int});
+  self::Class c3 = new self::Class::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int});
+  c3.{self::Class::field} = 89;
+  self::expect(89, c3.{self::Class::field}{core::int});
+  self::Class c4 = new self::Class::constructor4();
+  self::expect(42, c4.{self::Class::field}{core::int});
+  c4.{self::Class::field} = 43;
+  self::expect(43, c4.{self::Class::field}{core::int});
+  self::Class c5 = new self::Class::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int});
+  c5.{self::Class::field} = 124;
+  self::expect(124, c5.{self::Class::field}{core::int});
+}
+static method test2() → dynamic {
+  self::Subclass c1 = new self::Subclass::constructor1();
+  self::throws(() → core::int => c1.{self::Class::field}{core::int}, "Read value from uninitialized Class.field");
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int});
+  self::Subclass c2 = new self::Subclass::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int});
+  c2.{self::Class::field} = 43;
+  self::expect(43, c2.{self::Class::field}{core::int});
+  self::Subclass c3 = new self::Subclass::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int});
+  c3.{self::Class::field} = 89;
+  self::expect(89, c3.{self::Class::field}{core::int});
+  self::Subclass c4 = new self::Subclass::constructor4();
+  self::expect(87, c4.{self::Class::field}{core::int});
+  c4.{self::Class::field} = 88;
+  self::expect(88, c4.{self::Class::field}{core::int});
+  self::Subclass c5 = new self::Subclass::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int});
+  c5.{self::Class::field} = 124;
+  self::expect(124, c5.{self::Class::field}{core::int});
+}
+static method main() → dynamic {
+  self::test1();
+  self::test2();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = 87
+}
diff --git a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.outline.expect
index f83a9eb..b454862 100644
--- a/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_field_without_initializer.dart.weak.outline.expect
@@ -11,7 +11,7 @@
     ;
   constructor constructor3(core::int value) → self::Class
     ;
-  constructor constructor4([core::int field]) → self::Class
+  constructor constructor4([core::int field = 42]) → self::Class
     ;
   get field() → core::int;
   set field(core::int #t1) → void;
@@ -23,7 +23,7 @@
     ;
   constructor constructor3(core::int value) → self::Subclass
     ;
-  constructor constructor4([core::int value]) → self::Subclass
+  constructor constructor4([core::int value = 87]) → self::Subclass
     ;
 }
 static method test1() → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..463e342
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,114 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  field core::int? _#Class#field = null;
+  field core::bool _#Class#field#isSet = false;
+  constructor constructor1() → self::Class
+    : super core::Object::•()
+    ;
+  constructor constructor2(core::int field) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  constructor constructor3(core::int value) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = value.{core::num::+}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+  constructor constructor4([core::int field = #C1]) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  get field() → core::int
+    return this.{self::Class::_#Class#field#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("field");
+  set field(core::int #t2) → void
+    if(this.{self::Class::_#Class#field#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("field");
+    else {
+      this.{self::Class::_#Class#field#isSet} = true;
+      this.{self::Class::_#Class#field} = #t2;
+    }
+}
+class Subclass extends self::Class {
+  constructor constructor1() → self::Subclass
+    : super self::Class::constructor1()
+    ;
+  constructor constructor2(core::int value) → self::Subclass
+    : super self::Class::constructor2(value)
+    ;
+  constructor constructor3(core::int value) → self::Subclass
+    : super self::Class::constructor3(value)
+    ;
+  constructor constructor4([core::int value = #C2]) → self::Subclass
+    : super self::Class::constructor4(value)
+    ;
+}
+static method test1() → dynamic {
+  self::Class c1 = new self::Class::constructor1();
+  self::throws(() → core::int => c1.{self::Class::field}{core::int}, "Read value from uninitialized Class.field");
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int});
+  self::throws(() → core::int => c1.{self::Class::field} = 17, "Write value to initialized Class.field");
+  self::Class c2 = new self::Class::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int});
+  self::throws(() → core::int => c2.{self::Class::field} = 43, "Write value to initialized Class.field");
+  self::Class c3 = new self::Class::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int});
+  self::throws(() → core::int => c3.{self::Class::field} = 89, "Write value to initialized Class.field");
+  self::Class c4 = new self::Class::constructor4();
+  self::expect(42, c4.{self::Class::field}{core::int});
+  self::throws(() → core::int => c4.{self::Class::field} = 43, "Write value to initialized Class.field");
+  self::Class c5 = new self::Class::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int});
+  self::throws(() → core::int => c5.{self::Class::field} = 124, "Write value to initialized Class.field");
+  self::Class c6 = new self::Class::constructor1();
+  c6.{self::Class::field} = 32;
+  self::expect(32, c6.{self::Class::field}{core::int});
+  self::throws(() → core::int => c6.{self::Class::field} = 32, "Write value to initialized Class.field");
+}
+static method test2() → dynamic {
+  self::Subclass c1 = new self::Subclass::constructor1();
+  self::throws(() → core::int => c1.{self::Class::field}{core::int}, "Read value from uninitialized Class1.field");
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int});
+  self::throws(() → core::int => c1.{self::Class::field} = 17, "Write value to initialized Class.field");
+  self::Subclass c2 = new self::Subclass::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int});
+  self::throws(() → core::int => c2.{self::Class::field} = 43, "Write value to initialized Class.field");
+  self::Subclass c3 = new self::Subclass::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int});
+  self::throws(() → core::int => c3.{self::Class::field} = 89, "Write value to initialized Class.field");
+  self::Subclass c4 = new self::Subclass::constructor4();
+  self::expect(87, c4.{self::Class::field}{core::int});
+  self::throws(() → core::int => c4.{self::Class::field} = 88, "Write value to initialized Class.field");
+  self::Subclass c5 = new self::Subclass::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int});
+  self::throws(() → core::int => c5.{self::Class::field} = 124, "Write value to initialized Class.field");
+  self::Subclass c6 = new self::Subclass::constructor1();
+  c6.{self::Class::field} = 32;
+  self::expect(32, c6.{self::Class::field}{core::int});
+  self::throws(() → core::int => c6.{self::Class::field} = 32, "Write value to initialized Class.field");
+}
+static method main() → dynamic {
+  self::test1();
+  self::test2();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = 87
+}
diff --git a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.outline.expect
index f83a9eb..b454862 100644
--- a/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_final_field_without_initializer.dart.weak.outline.expect
@@ -11,7 +11,7 @@
     ;
   constructor constructor3(core::int value) → self::Class
     ;
-  constructor constructor4([core::int field]) → self::Class
+  constructor constructor4([core::int field = 42]) → self::Class
     ;
   get field() → core::int;
   set field(core::int #t1) → void;
@@ -23,7 +23,7 @@
     ;
   constructor constructor3(core::int value) → self::Subclass
     ;
-  constructor constructor4([core::int value]) → self::Subclass
+  constructor constructor4([core::int value = 87]) → self::Subclass
     ;
 }
 static method test1() → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..5a147d7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,104 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? _#Class#field = null;
+  field core::bool _#Class#field#isSet = false;
+  constructor constructor1() → self::Class
+    : super core::Object::•()
+    ;
+  constructor constructor2(core::int? field) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  constructor constructor3(core::int value) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = value.{core::num::+}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+  constructor constructor4([core::int? field = #C1]) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  get field() → core::int? {
+    if(!this.{self::Class::_#Class#field#isSet}{core::bool}) {
+      this.{self::Class::_#Class#field} = self::initField();
+      this.{self::Class::_#Class#field#isSet} = true;
+    }
+    return this.{self::Class::_#Class#field}{core::int?};
+  }
+  set field(core::int? #t1) → void {
+    this.{self::Class::_#Class#field#isSet} = true;
+    this.{self::Class::_#Class#field} = #t1;
+  }
+}
+class Subclass extends self::Class {
+  constructor constructor1() → self::Subclass
+    : super self::Class::constructor1()
+    ;
+  constructor constructor2(core::int value) → self::Subclass
+    : super self::Class::constructor2(value)
+    ;
+  constructor constructor3(core::int value) → self::Subclass
+    : super self::Class::constructor3(value)
+    ;
+  constructor constructor4([core::int value = #C2]) → self::Subclass
+    : super self::Class::constructor4(value)
+    ;
+}
+static method initField() → core::int?
+  return 10;
+static method test1() → dynamic {
+  self::Class c1 = new self::Class::constructor1();
+  self::expect(10, c1.{self::Class::field}{core::int?});
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int?});
+  self::Class c2 = new self::Class::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int?});
+  c2.{self::Class::field} = 43;
+  self::expect(43, c2.{self::Class::field}{core::int?});
+  self::Class c3 = new self::Class::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int?});
+  c3.{self::Class::field} = 89;
+  self::expect(89, c3.{self::Class::field}{core::int?});
+  self::Class c4 = new self::Class::constructor4();
+  self::expect(42, c4.{self::Class::field}{core::int?});
+  c4.{self::Class::field} = 43;
+  self::expect(43, c4.{self::Class::field}{core::int?});
+  self::Class c5 = new self::Class::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int?});
+  c5.{self::Class::field} = 124;
+  self::expect(124, c5.{self::Class::field}{core::int?});
+}
+static method test2() → dynamic {
+  self::Subclass c1 = new self::Subclass::constructor1();
+  self::expect(10, c1.{self::Class::field}{core::int?});
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int?});
+  self::Subclass c2 = new self::Subclass::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int?});
+  c2.{self::Class::field} = 43;
+  self::expect(43, c2.{self::Class::field}{core::int?});
+  self::Subclass c3 = new self::Subclass::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int?});
+  c3.{self::Class::field} = 89;
+  self::expect(89, c3.{self::Class::field}{core::int?});
+  self::Subclass c4 = new self::Subclass::constructor4();
+  self::expect(87, c4.{self::Class::field}{core::int?});
+  c4.{self::Class::field} = 88;
+  self::expect(88, c4.{self::Class::field}{core::int?});
+  self::Subclass c5 = new self::Subclass::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int?});
+  c5.{self::Class::field} = 124;
+  self::expect(124, c5.{self::Class::field}{core::int?});
+}
+static method main() → dynamic {
+  self::test1();
+  self::test2();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = 87
+}
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.outline.expect
index 511d101..dfec80d 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_with_initializer.dart.weak.outline.expect
@@ -11,7 +11,7 @@
     ;
   constructor constructor3(core::int value) → self::Class
     ;
-  constructor constructor4([core::int? field]) → self::Class
+  constructor constructor4([core::int? field = 42]) → self::Class
     ;
   get field() → core::int?;
   set field(core::int? #t1) → void;
@@ -23,7 +23,7 @@
     ;
   constructor constructor3(core::int value) → self::Subclass
     ;
-  constructor constructor4([core::int value]) → self::Subclass
+  constructor constructor4([core::int value = 87]) → self::Subclass
     ;
 }
 static method initField() → core::int?
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..58f7272
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,109 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  field core::int? _#Class#field = null;
+  field core::bool _#Class#field#isSet = false;
+  constructor constructor1() → self::Class
+    : super core::Object::•()
+    ;
+  constructor constructor2(core::int? field) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  constructor constructor3(core::int value) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = value.{core::num::+}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+  constructor constructor4([core::int? field = #C1]) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  get field() → core::int?
+    return this.{self::Class::_#Class#field#isSet}{core::bool} ?{core::int?} this.{self::Class::_#Class#field}{core::int?} : throw new _in::LateError::fieldNI("field");
+  set field(core::int? #t1) → void {
+    this.{self::Class::_#Class#field#isSet} = true;
+    this.{self::Class::_#Class#field} = #t1;
+  }
+}
+class Subclass extends self::Class {
+  constructor constructor1() → self::Subclass
+    : super self::Class::constructor1()
+    ;
+  constructor constructor2(core::int value) → self::Subclass
+    : super self::Class::constructor2(value)
+    ;
+  constructor constructor3(core::int value) → self::Subclass
+    : super self::Class::constructor3(value)
+    ;
+  constructor constructor4([core::int value = #C2]) → self::Subclass
+    : super self::Class::constructor4(value)
+    ;
+}
+static method test1() → dynamic {
+  self::Class c1 = new self::Class::constructor1();
+  self::throws(() → core::int? => c1.{self::Class::field}{core::int?}, "Read value from uninitialized Class.field");
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int?});
+  self::Class c2 = new self::Class::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int?});
+  c2.{self::Class::field} = 43;
+  self::expect(43, c2.{self::Class::field}{core::int?});
+  self::Class c3 = new self::Class::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int?});
+  c3.{self::Class::field} = 89;
+  self::expect(89, c3.{self::Class::field}{core::int?});
+  self::Class c4 = new self::Class::constructor4();
+  self::expect(42, c4.{self::Class::field}{core::int?});
+  c4.{self::Class::field} = 43;
+  self::expect(43, c4.{self::Class::field}{core::int?});
+  self::Class c5 = new self::Class::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int?});
+  c5.{self::Class::field} = 124;
+  self::expect(124, c5.{self::Class::field}{core::int?});
+}
+static method test2() → dynamic {
+  self::Subclass c1 = new self::Subclass::constructor1();
+  self::throws(() → core::int? => c1.{self::Class::field}{core::int?}, "Read value from uninitialized Class.field");
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int?});
+  self::Subclass c2 = new self::Subclass::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int?});
+  c2.{self::Class::field} = 43;
+  self::expect(43, c2.{self::Class::field}{core::int?});
+  self::Subclass c3 = new self::Subclass::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int?});
+  c3.{self::Class::field} = 89;
+  self::expect(89, c3.{self::Class::field}{core::int?});
+  self::Subclass c4 = new self::Subclass::constructor4();
+  self::expect(87, c4.{self::Class::field}{core::int?});
+  c4.{self::Class::field} = 88;
+  self::expect(88, c4.{self::Class::field}{core::int?});
+  self::Subclass c5 = new self::Subclass::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int?});
+  c5.{self::Class::field} = 124;
+  self::expect(124, c5.{self::Class::field}{core::int?});
+}
+static method main() → dynamic {
+  self::test1();
+  self::test2();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = 87
+}
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.outline.expect
index 2ed3a81..4c71a87 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_field_without_initializer.dart.weak.outline.expect
@@ -11,7 +11,7 @@
     ;
   constructor constructor3(core::int value) → self::Class
     ;
-  constructor constructor4([core::int? field]) → self::Class
+  constructor constructor4([core::int? field = 42]) → self::Class
     ;
   get field() → core::int?;
   set field(core::int? #t1) → void;
@@ -23,7 +23,7 @@
     ;
   constructor constructor3(core::int value) → self::Subclass
     ;
-  constructor constructor4([core::int value]) → self::Subclass
+  constructor constructor4([core::int value = 87]) → self::Subclass
     ;
 }
 static method test1() → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..8bbbcaf
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,114 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  field core::int? _#Class#field = null;
+  field core::bool _#Class#field#isSet = false;
+  constructor constructor1() → self::Class
+    : super core::Object::•()
+    ;
+  constructor constructor2(core::int? field) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  constructor constructor3(core::int value) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = value.{core::num::+}(1){(core::num) → core::int}, super core::Object::•()
+    ;
+  constructor constructor4([core::int? field = #C1]) → self::Class
+    : self::Class::_#Class#field#isSet = true, self::Class::_#Class#field = field, super core::Object::•()
+    ;
+  get field() → core::int?
+    return this.{self::Class::_#Class#field#isSet}{core::bool} ?{core::int?} this.{self::Class::_#Class#field}{core::int?} : throw new _in::LateError::fieldNI("field");
+  set field(core::int? #t1) → void
+    if(this.{self::Class::_#Class#field#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("field");
+    else {
+      this.{self::Class::_#Class#field#isSet} = true;
+      this.{self::Class::_#Class#field} = #t1;
+    }
+}
+class Subclass extends self::Class {
+  constructor constructor1() → self::Subclass
+    : super self::Class::constructor1()
+    ;
+  constructor constructor2(core::int value) → self::Subclass
+    : super self::Class::constructor2(value)
+    ;
+  constructor constructor3(core::int value) → self::Subclass
+    : super self::Class::constructor3(value)
+    ;
+  constructor constructor4([core::int value = #C2]) → self::Subclass
+    : super self::Class::constructor4(value)
+    ;
+}
+static method test1() → dynamic {
+  self::Class c1 = new self::Class::constructor1();
+  self::throws(() → core::int? => c1.{self::Class::field}{core::int?}, "Read value from uninitialized Class.field");
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c1.{self::Class::field} = 17, "Write value to initialized Class.field");
+  self::Class c2 = new self::Class::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c2.{self::Class::field} = 43, "Write value to initialized Class.field");
+  self::Class c3 = new self::Class::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c3.{self::Class::field} = 89, "Write value to initialized Class.field");
+  self::Class c4 = new self::Class::constructor4();
+  self::expect(42, c4.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c4.{self::Class::field} = 43, "Write value to initialized Class.field");
+  self::Class c5 = new self::Class::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c5.{self::Class::field} = 124, "Write value to initialized Class.field");
+  self::Class c6 = new self::Class::constructor1();
+  c6.{self::Class::field} = 32;
+  self::expect(32, c6.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c6.{self::Class::field} = 32, "Write value to initialized Class.field");
+}
+static method test2() → dynamic {
+  self::Subclass c1 = new self::Subclass::constructor1();
+  self::throws(() → core::int? => c1.{self::Class::field}{core::int?}, "Read value from uninitialized Class1.field");
+  c1.{self::Class::field} = 16;
+  self::expect(16, c1.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c1.{self::Class::field} = 17, "Write value to initialized Class.field");
+  self::Subclass c2 = new self::Subclass::constructor2(42);
+  self::expect(42, c2.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c2.{self::Class::field} = 43, "Write value to initialized Class.field");
+  self::Subclass c3 = new self::Subclass::constructor3(87);
+  self::expect(88, c3.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c3.{self::Class::field} = 89, "Write value to initialized Class.field");
+  self::Subclass c4 = new self::Subclass::constructor4();
+  self::expect(87, c4.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c4.{self::Class::field} = 88, "Write value to initialized Class.field");
+  self::Subclass c5 = new self::Subclass::constructor4(123);
+  self::expect(123, c5.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c5.{self::Class::field} = 124, "Write value to initialized Class.field");
+  self::Subclass c6 = new self::Subclass::constructor1();
+  c6.{self::Class::field} = 32;
+  self::expect(32, c6.{self::Class::field}{core::int?});
+  self::throws(() → core::int => c6.{self::Class::field} = 32, "Write value to initialized Class.field");
+}
+static method main() → dynamic {
+  self::test1();
+  self::test2();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = 87
+}
diff --git a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.outline.expect b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.outline.expect
index 2ed3a81..4c71a87 100644
--- a/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/instance_nullable_final_field_without_initializer.dart.weak.outline.expect
@@ -11,7 +11,7 @@
     ;
   constructor constructor3(core::int value) → self::Class
     ;
-  constructor constructor4([core::int? field]) → self::Class
+  constructor constructor4([core::int? field = 42]) → self::Class
     ;
   get field() → core::int?;
   set field(core::int? #t1) → void;
@@ -23,7 +23,7 @@
     ;
   constructor constructor3(core::int value) → self::Subclass
     ;
-  constructor constructor4([core::int value]) → self::Subclass
+  constructor constructor4([core::int value = 87]) → self::Subclass
     ;
 }
 static method test1() → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/issue40093.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue40093.dart.weak.modular.expect
new file mode 100644
index 0000000..fe10901
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40093.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/issue40093.dart:6:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int i = 0; i < 10; ++i) {
+//        ^^^^
+//
+// pkg/front_end/testcases/late_lowering/issue40093.dart:9:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int i in <int>[]) {
+//        ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method error() → dynamic {
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    core::print(i);
+  }
+  for (core::int i in <core::int>[]) {
+    core::print(i);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.modular.expect
new file mode 100644
index 0000000..32f6e7c
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40373.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class C extends core::Object {
+  field core::num pi = 3.14;
+  field core::num? _#C#p1 = null;
+  field core::bool _#C#p1#isSet = false;
+  field core::num? _#C#p2 = null;
+  field core::bool _#C#p2#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get p1() → core::num {
+    if(!this.{self::C::_#C#p1#isSet}{core::bool}) {
+      this.{self::C::_#C#p1} = this.{self::C::pi}{core::num};
+      this.{self::C::_#C#p1#isSet} = true;
+    }
+    return let final core::num? #t1 = this.{self::C::_#C#p1}{core::num?} in #t1{core::num};
+  }
+  set p1(core::num #t2) → void {
+    this.{self::C::_#C#p1#isSet} = true;
+    this.{self::C::_#C#p1} = #t2;
+  }
+  get p2() → core::num {
+    if(!this.{self::C::_#C#p2#isSet}{core::bool}) {
+      final core::num #t3 = this.{self::C::pi}{core::num};
+      if(this.{self::C::_#C#p2#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("p2");
+      this.{self::C::_#C#p2} = #t3;
+      this.{self::C::_#C#p2#isSet} = true;
+    }
+    return let final core::num? #t4 = this.{self::C::_#C#p2}{core::num?} in #t4{core::num};
+  }
+}
+static method main() → dynamic {
+  self::expect(3.14, new self::C::•().{self::C::p1}{core::num});
+  self::expect(3.14, new self::C::•().{self::C::p2}{core::num});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.modular.expect
new file mode 100644
index 0000000..149d652
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40373b.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class C extends core::Object {
+  static field dynamic _#s = null;
+  static field core::bool _#s#isSet = false;
+  field dynamic _#C#v = null;
+  field core::bool _#C#v#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get s() → dynamic
+    return self::C::_#s#isSet ?{dynamic} self::C::_#s : throw new _in::LateError::fieldNI("s");
+  static set s(dynamic #t1) → void
+    if(self::C::_#s#isSet)
+      throw new _in::LateError::fieldAI("s");
+    else {
+      self::C::_#s#isSet = true;
+      self::C::_#s = #t1;
+    }
+  get v() → dynamic
+    return this.{self::C::_#C#v#isSet}{core::bool} ?{dynamic} this.{self::C::_#C#v}{dynamic} : throw new _in::LateError::fieldNI("v");
+  set v(dynamic #t2) → void
+    if(this.{self::C::_#C#v#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("v");
+    else {
+      this.{self::C::_#C#v#isSet} = true;
+      this.{self::C::_#C#v} = #t2;
+    }
+}
+static field dynamic _#g = null;
+static field core::bool _#g#isSet = false;
+static get g() → dynamic
+  return self::_#g#isSet ?{dynamic} self::_#g : throw new _in::LateError::fieldNI("g");
+static set g(dynamic #t3) → void
+  if(self::_#g#isSet)
+    throw new _in::LateError::fieldAI("g");
+  else {
+    self::_#g#isSet = true;
+    self::_#g = #t3;
+  }
+static method main() → dynamic {
+  lowered final dynamic #l;
+  lowered core::bool #l#isSet = false;
+  function #l#get() → dynamic
+    return #l#isSet ?{dynamic} #l : throw new _in::LateError::localNI("l");
+  function #l#set(dynamic #t4) → dynamic
+    if(#l#isSet)
+      throw new _in::LateError::localAI("l");
+    else {
+      #l#isSet = true;
+      return #l = #t4;
+    }
+  self::g = "Lily";
+  self::C::s = "was";
+  self::C c = new self::C::•();
+  c.{self::C::v} = "here";
+  #l#set("Run, Forrest, run"){(dynamic) → dynamic};
+  self::expect("Lily", self::g);
+  self::expect("was", self::C::s);
+  self::expect("here", c.{self::C::v}{dynamic});
+  self::expect("Run, Forrest, run", #l#get(){() → dynamic});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.modular.expect
new file mode 100644
index 0000000..e8923f9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(covariant-by-class self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    lowered self::A::T? #value;
+    lowered core::bool #value#isSet = false;
+    function #value#get() → self::A::T%
+      return #value#isSet ?{self::A::T%} #value{self::A::T%} : throw new _in::LateError::localNI("value");
+    function #value#set(self::A::T% #t1) → dynamic {
+      #value#isSet = true;
+      return #value = #t1;
+    }
+    () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get(){() → self::A::T%}){(self::A::T%) → dynamic};
+    (() → Null {
+      #value#set(this.{self::A::baz}(){() → self::A::T%}){(self::A::T%) → dynamic};
+    })(){() → Null};
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.modular.expect
new file mode 100644
index 0000000..a37d11f
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40805.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class C extends core::Object {
+  field core::int? _#C#x = null;
+  field core::bool _#C#x#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return this.{self::C::_#C#x#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::C::_#C#x}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
+  set x(covariant-by-declaration core::int #t2) → void
+    if(this.{self::C::_#C#x#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("x");
+    else {
+      this.{self::C::_#C#x#isSet} = true;
+      this.{self::C::_#C#x} = #t2;
+    }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  set x(covariant-by-declaration core::num value) → void {
+    super.{self::C::x} = value.{core::num::toInt}(){() → core::int};
+  }
+}
+static method main() → dynamic {
+  new self::D::•().{self::D::x} = 3.14;
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.modular.expect
new file mode 100644
index 0000000..c3f8ab3
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41436/issue41436.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+  test::A a;
+}
+
+library /*isNonNullableByDefault*/;
+import self as test;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A extends core::Object {
+  field core::int? _#A#x = null;
+  field core::bool _#A#x#isSet = false;
+  synthetic constructor •() → test::A
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return this.{test::A::_#A#x#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{test::A::_#A#x}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
+  set x(core::int #t2) → void {
+    this.{test::A::_#A#x#isSet} = true;
+    this.{test::A::_#A#x} = #t2;
+  }
+}
+class _B extends core::Object implements test::A {
+  field core::int x = 3;
+  synthetic constructor •() → test::_B
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.modular.expect
new file mode 100644
index 0000000..0c45d0a
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41436b.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A extends core::Object {
+  field core::int? _#A#x = null;
+  field core::bool _#A#x#isSet = false;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return this.{self::A::_#A#x#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
+  set x(core::int #t2) → void {
+    this.{self::A::_#A#x#isSet} = true;
+    this.{self::A::_#A#x} = #t2;
+  }
+}
+class _B extends core::Object implements self::A {
+  field core::int x = 3;
+  synthetic constructor •() → self::_B
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::A a;
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.modular.expect
new file mode 100644
index 0000000..4a82ef6
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41436c/issue41436c.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "issue41436c_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue41436c_lib.dart";
+
+class C extends iss::B {
+  synthetic constructor •() → self::C
+    : super iss::B::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet() → core::bool
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x() → core::int?
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x#isSet(core::bool value) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
+  no-such-method-forwarder set /* from org-dartlang-testcase:///issue41436c_lib.dart */ _#A#x(core::int? value) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
+}
+static method main() → dynamic {
+  new self::C::•();
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///issue41436c.dart::_#A#x#isSet
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #org-dartlang-testcase:///issue41436c.dart::_#A#x
+  #C6 = #org-dartlang-testcase:///issue41436c.dart::_#A#x#isSet=
+  #C7 = #org-dartlang-testcase:///issue41436c.dart::_#A#x=
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.modular.expect
new file mode 100644
index 0000000..f4abe91
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue41922.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String? _#s = null;
+  static field core::bool _#s#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get s() → core::String? {
+    if(!self::C::_#s#isSet) {
+      self::C::_#s = self::init("lateValue");
+      self::C::_#s#isSet = true;
+    }
+    return self::C::_#s;
+  }
+  static set s(core::String? #t1) → void {
+    self::C::_#s#isSet = true;
+    self::C::_#s = #t1;
+  }
+}
+static field core::bool _called = false;
+static method init(core::String val) → core::String {
+  if(!self::_called) {
+    self::_called = true;
+    throw core::Exception::•();
+  }
+  return val;
+}
+static method main() → dynamic {
+  self::throws(() → void {
+    self::C::s;
+  });
+  self::expect("lateValue", self::C::s);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.modular.expect
new file mode 100644
index 0000000..16c8e79
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue42407.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class A<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::A::T? _#A#x = null;
+  field core::bool _#A#x#isSet = false;
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  get x() → self::A::T%
+    return this.{self::A::_#A#x#isSet}{core::bool} ?{self::A::T%} let final self::A::T? #t1 = this.{self::A::_#A#x}{self::A::T?} in #t1{self::A::T%} : throw new _in::LateError::fieldNI("x");
+  set x(covariant-by-class self::A::T% #t2) → void {
+    this.{self::A::_#A#x#isSet} = true;
+    this.{self::A::_#A#x} = #t2;
+  }
+}
+class B<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::B::T? _y = null;
+  synthetic constructor •() → self::B<self::B::T%>
+    : super core::Object::•()
+    ;
+  get y() → self::B::T?
+    return this.{self::B::_y}{self::B::T?};
+  set y(covariant-by-class self::B::T? val) → void {
+    this.{self::B::_y} = val;
+  }
+}
+static method main() → dynamic {
+  self::A<core::num> a = new self::A::•<core::int>();
+  self::expect(42, a.{self::A::x} = 42);
+  self::throws(() → void => a.{self::A::x} = 0.5);
+  self::B<core::num> b = new self::B::•<core::int>();
+  self::expect(42, b.{self::B::y} = 42);
+  self::throws(() → void => b.{self::B::y} = 0.5);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/late_lowering/issue44372.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/issue44372.dart.weak.modular.expect
new file mode 100644
index 0000000..57a90e0
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue44372.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main(core::List<core::String> args) → dynamic {
+  lowered () →? core::int #recursiveInitLocal;
+  lowered core::bool #recursiveInitLocal#isSet = false;
+  function #recursiveInitLocal#get() → () → core::int
+    return #recursiveInitLocal#isSet ?{() → core::int} #recursiveInitLocal{() → core::int} : throw new _in::LateError::localNI("recursiveInitLocal");
+  function #recursiveInitLocal#set(() → core::int #t1) → dynamic {
+    #recursiveInitLocal#isSet = true;
+    return #recursiveInitLocal = #t1;
+  }
+  lowered final core::int? #local;
+  lowered core::bool #local#isSet = false;
+  function #local#get() → core::int {
+    if(!#local#isSet) {
+      final core::int #t2 = #recursiveInitLocal#get(){() → () → core::int}(){() → core::int};
+      if(#local#isSet)
+        throw new _in::LateError::localADI("local");
+      #local = #t2;
+      #local#isSet = true;
+    }
+    return #local{core::int};
+  }
+  core::bool doRecursiveInitLocal = true;
+  #recursiveInitLocal#set(() → core::int {
+    core::print("Executing initializer");
+    if(doRecursiveInitLocal) {
+      doRecursiveInitLocal = false;
+      core::print("Trigger recursive initialization");
+      core::int val = #local#get(){() → core::int};
+      core::print("Final local has value ${val}");
+      core::print("Returning 4 from initializer");
+      return 4;
+    }
+    core::print("Returning 3 from initializer");
+    return 3;
+  }){(() → core::int) → dynamic};
+  self::throws(() → Null {
+    core::int val = #local#get(){() → core::int};
+    core::print("Final local has value ${val}");
+  }, "Read local");
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.modular.expect
new file mode 100644
index 0000000..784ff0c
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_annotations.dart.weak.modular.expect
@@ -0,0 +1,277 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Annotation extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::Annotation
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  field core::int? _#A#instanceField = null;
+  field core::bool _#A#instanceField#isSet = false;
+  field core::int? _#A#finalInstanceField = null;
+  field core::bool _#A#finalInstanceField#isSet = false;
+  field core::int? _#A#finalInstanceFieldWithInitializer = null;
+  field core::bool _#A#finalInstanceFieldWithInitializer#isSet = false;
+  field core::num? _#A#covariantInstanceField = null;
+  field core::bool _#A#covariantInstanceField#isSet = false;
+  static field core::int? _#staticField = null;
+  static field core::bool _#staticField#isSet = false;
+  static field core::int? _#finalStaticField = null;
+  static field core::bool _#finalStaticField#isSet = false;
+  static field core::int? _#finalStaticFieldWithInitializer = null;
+  static field core::bool _#finalStaticFieldWithInitializer#isSet = false;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  @#C1
+  get instanceField() → core::int
+    return this.{self::A::_#A#instanceField#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#instanceField}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("instanceField");
+  @#C1
+  set instanceField(core::int #t2) → void {
+    this.{self::A::_#A#instanceField#isSet} = true;
+    this.{self::A::_#A#instanceField} = #t2;
+  }
+  @#C1
+  get finalInstanceField() → core::int
+    return this.{self::A::_#A#finalInstanceField#isSet}{core::bool} ?{core::int} let final core::int? #t3 = this.{self::A::_#A#finalInstanceField}{core::int?} in #t3{core::int} : throw new _in::LateError::fieldNI("finalInstanceField");
+  @#C1
+  set finalInstanceField(core::int #t4) → void
+    if(this.{self::A::_#A#finalInstanceField#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("finalInstanceField");
+    else {
+      this.{self::A::_#A#finalInstanceField#isSet} = true;
+      this.{self::A::_#A#finalInstanceField} = #t4;
+    }
+  @#C1
+  get finalInstanceFieldWithInitializer() → core::int {
+    if(!this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet}{core::bool}) {
+      final core::int #t5 = 0;
+      if(this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer");
+      this.{self::A::_#A#finalInstanceFieldWithInitializer} = #t5;
+      this.{self::A::_#A#finalInstanceFieldWithInitializer#isSet} = true;
+    }
+    return let final core::int? #t6 = this.{self::A::_#A#finalInstanceFieldWithInitializer}{core::int?} in #t6{core::int};
+  }
+  @#C1
+  get covariantInstanceField() → core::num
+    return this.{self::A::_#A#covariantInstanceField#isSet}{core::bool} ?{core::num} let final core::num? #t7 = this.{self::A::_#A#covariantInstanceField}{core::num?} in #t7{core::num} : throw new _in::LateError::fieldNI("covariantInstanceField");
+  @#C1
+  set covariantInstanceField(covariant-by-declaration core::num #t8) → void {
+    this.{self::A::_#A#covariantInstanceField#isSet} = true;
+    this.{self::A::_#A#covariantInstanceField} = #t8;
+  }
+  @#C1
+  static get staticField() → core::int
+    return self::A::_#staticField#isSet ?{core::int} let final core::int? #t9 = self::A::_#staticField in #t9{core::int} : throw new _in::LateError::fieldNI("staticField");
+  @#C1
+  static set staticField(core::int #t10) → void {
+    self::A::_#staticField#isSet = true;
+    self::A::_#staticField = #t10;
+  }
+  @#C1
+  static get finalStaticField() → core::int
+    return self::A::_#finalStaticField#isSet ?{core::int} let final core::int? #t11 = self::A::_#finalStaticField in #t11{core::int} : throw new _in::LateError::fieldNI("finalStaticField");
+  @#C1
+  static set finalStaticField(core::int #t12) → void
+    if(self::A::_#finalStaticField#isSet)
+      throw new _in::LateError::fieldAI("finalStaticField");
+    else {
+      self::A::_#finalStaticField#isSet = true;
+      self::A::_#finalStaticField = #t12;
+    }
+  @#C1
+  static get finalStaticFieldWithInitializer() → core::int {
+    if(!self::A::_#finalStaticFieldWithInitializer#isSet) {
+      final core::int #t13 = 0;
+      if(self::A::_#finalStaticFieldWithInitializer#isSet)
+        throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer");
+      self::A::_#finalStaticFieldWithInitializer = #t13;
+      self::A::_#finalStaticFieldWithInitializer#isSet = true;
+    }
+    return let final core::int? #t14 = self::A::_#finalStaticFieldWithInitializer in #t14{core::int};
+  }
+}
+abstract class B extends core::Object /*isMixinDeclaration*/  {
+  field core::int? _#B#instanceField = null;
+  field core::bool _#B#instanceField#isSet = false;
+  field core::int? _#B#finalInstanceField = null;
+  field core::bool _#B#finalInstanceField#isSet = false;
+  field core::int? _#B#finalInstanceFieldWithInitializer = null;
+  field core::bool _#B#finalInstanceFieldWithInitializer#isSet = false;
+  field core::num? _#B#covariantInstanceField = null;
+  field core::bool _#B#covariantInstanceField#isSet = false;
+  static field core::int? _#staticField = null;
+  static field core::bool _#staticField#isSet = false;
+  static field core::int? _#finalStaticField = null;
+  static field core::bool _#finalStaticField#isSet = false;
+  static field core::int? _#finalStaticFieldWithInitializer = null;
+  static field core::bool _#finalStaticFieldWithInitializer#isSet = false;
+  @#C1
+  get instanceField() → core::int
+    return this.{self::B::_#B#instanceField#isSet}{core::bool} ?{core::int} let final core::int? #t15 = this.{self::B::_#B#instanceField}{core::int?} in #t15{core::int} : throw new _in::LateError::fieldNI("instanceField");
+  @#C1
+  set instanceField(core::int #t16) → void {
+    this.{self::B::_#B#instanceField#isSet} = true;
+    this.{self::B::_#B#instanceField} = #t16;
+  }
+  @#C1
+  get finalInstanceField() → core::int
+    return this.{self::B::_#B#finalInstanceField#isSet}{core::bool} ?{core::int} let final core::int? #t17 = this.{self::B::_#B#finalInstanceField}{core::int?} in #t17{core::int} : throw new _in::LateError::fieldNI("finalInstanceField");
+  @#C1
+  set finalInstanceField(core::int #t18) → void
+    if(this.{self::B::_#B#finalInstanceField#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("finalInstanceField");
+    else {
+      this.{self::B::_#B#finalInstanceField#isSet} = true;
+      this.{self::B::_#B#finalInstanceField} = #t18;
+    }
+  @#C1
+  get finalInstanceFieldWithInitializer() → core::int {
+    if(!this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet}{core::bool}) {
+      final core::int #t19 = 0;
+      if(this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("finalInstanceFieldWithInitializer");
+      this.{self::B::_#B#finalInstanceFieldWithInitializer} = #t19;
+      this.{self::B::_#B#finalInstanceFieldWithInitializer#isSet} = true;
+    }
+    return let final core::int? #t20 = this.{self::B::_#B#finalInstanceFieldWithInitializer}{core::int?} in #t20{core::int};
+  }
+  @#C1
+  get covariantInstanceField() → core::num
+    return this.{self::B::_#B#covariantInstanceField#isSet}{core::bool} ?{core::num} let final core::num? #t21 = this.{self::B::_#B#covariantInstanceField}{core::num?} in #t21{core::num} : throw new _in::LateError::fieldNI("covariantInstanceField");
+  @#C1
+  set covariantInstanceField(covariant-by-declaration core::num #t22) → void {
+    this.{self::B::_#B#covariantInstanceField#isSet} = true;
+    this.{self::B::_#B#covariantInstanceField} = #t22;
+  }
+  @#C1
+  static get staticField() → core::int
+    return self::B::_#staticField#isSet ?{core::int} let final core::int? #t23 = self::B::_#staticField in #t23{core::int} : throw new _in::LateError::fieldNI("staticField");
+  @#C1
+  static set staticField(core::int #t24) → void {
+    self::B::_#staticField#isSet = true;
+    self::B::_#staticField = #t24;
+  }
+  @#C1
+  static get finalStaticField() → core::int
+    return self::B::_#finalStaticField#isSet ?{core::int} let final core::int? #t25 = self::B::_#finalStaticField in #t25{core::int} : throw new _in::LateError::fieldNI("finalStaticField");
+  @#C1
+  static set finalStaticField(core::int #t26) → void
+    if(self::B::_#finalStaticField#isSet)
+      throw new _in::LateError::fieldAI("finalStaticField");
+    else {
+      self::B::_#finalStaticField#isSet = true;
+      self::B::_#finalStaticField = #t26;
+    }
+  @#C1
+  static get finalStaticFieldWithInitializer() → core::int {
+    if(!self::B::_#finalStaticFieldWithInitializer#isSet) {
+      final core::int #t27 = 0;
+      if(self::B::_#finalStaticFieldWithInitializer#isSet)
+        throw new _in::LateError::fieldADI("finalStaticFieldWithInitializer");
+      self::B::_#finalStaticFieldWithInitializer = #t27;
+      self::B::_#finalStaticFieldWithInitializer#isSet = true;
+    }
+    return let final core::int? #t28 = self::B::_#finalStaticFieldWithInitializer in #t28{core::int};
+  }
+}
+extension Extension on self::A {
+  static field extensionStaticField = self::_#Extension|extensionStaticField;
+  static field extensionStaticField = self::_#Extension|extensionStaticField#isSet;
+  static get extensionStaticField = get self::Extension|extensionStaticField;
+  static set extensionStaticField = set self::Extension|extensionStaticField;
+  static field finalExtensionStaticField = self::_#Extension|finalExtensionStaticField;
+  static field finalExtensionStaticField = self::_#Extension|finalExtensionStaticField#isSet;
+  static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
+  static set finalExtensionStaticField = set self::Extension|finalExtensionStaticField;
+  static field finalExtensionStaticFieldWithInitializer = self::_#Extension|finalExtensionStaticFieldWithInitializer;
+  static field finalExtensionStaticFieldWithInitializer = self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet;
+  static get finalExtensionStaticFieldWithInitializer = get self::Extension|finalExtensionStaticFieldWithInitializer;
+}
+static field core::int? _#topLevelField = null;
+static field core::bool _#topLevelField#isSet = false;
+static field core::int? _#finalTopLevelField = null;
+static field core::bool _#finalTopLevelField#isSet = false;
+static field core::int? _#finalTopLevelFieldWithInitializer = null;
+static field core::bool _#finalTopLevelFieldWithInitializer#isSet = false;
+static field core::int? _#Extension|extensionStaticField = null;
+static field core::bool _#Extension|extensionStaticField#isSet = false;
+static field core::int? _#Extension|finalExtensionStaticField = null;
+static field core::bool _#Extension|finalExtensionStaticField#isSet = false;
+static field core::int? _#Extension|finalExtensionStaticFieldWithInitializer = null;
+static field core::bool _#Extension|finalExtensionStaticFieldWithInitializer#isSet = false;
+@#C1
+static get topLevelField() → core::int
+  return self::_#topLevelField#isSet ?{core::int} let final core::int? #t29 = self::_#topLevelField in #t29{core::int} : throw new _in::LateError::fieldNI("topLevelField");
+@#C1
+static set topLevelField(core::int #t30) → void {
+  self::_#topLevelField#isSet = true;
+  self::_#topLevelField = #t30;
+}
+@#C1
+static get finalTopLevelField() → core::int
+  return self::_#finalTopLevelField#isSet ?{core::int} let final core::int? #t31 = self::_#finalTopLevelField in #t31{core::int} : throw new _in::LateError::fieldNI("finalTopLevelField");
+@#C1
+static set finalTopLevelField(core::int #t32) → void
+  if(self::_#finalTopLevelField#isSet)
+    throw new _in::LateError::fieldAI("finalTopLevelField");
+  else {
+    self::_#finalTopLevelField#isSet = true;
+    self::_#finalTopLevelField = #t32;
+  }
+@#C1
+static get finalTopLevelFieldWithInitializer() → core::int {
+  if(!self::_#finalTopLevelFieldWithInitializer#isSet) {
+    final core::int #t33 = 0;
+    if(self::_#finalTopLevelFieldWithInitializer#isSet)
+      throw new _in::LateError::fieldADI("finalTopLevelFieldWithInitializer");
+    self::_#finalTopLevelFieldWithInitializer = #t33;
+    self::_#finalTopLevelFieldWithInitializer#isSet = true;
+  }
+  return let final core::int? #t34 = self::_#finalTopLevelFieldWithInitializer in #t34{core::int};
+}
+@#C1
+static get Extension|extensionStaticField() → core::int
+  return self::_#Extension|extensionStaticField#isSet ?{core::int} let final core::int? #t35 = self::_#Extension|extensionStaticField in #t35{core::int} : throw new _in::LateError::fieldNI("extensionStaticField");
+@#C1
+static set Extension|extensionStaticField(core::int #t36) → void {
+  self::_#Extension|extensionStaticField#isSet = true;
+  self::_#Extension|extensionStaticField = #t36;
+}
+@#C1
+static get Extension|finalExtensionStaticField() → core::int
+  return self::_#Extension|finalExtensionStaticField#isSet ?{core::int} let final core::int? #t37 = self::_#Extension|finalExtensionStaticField in #t37{core::int} : throw new _in::LateError::fieldNI("finalExtensionStaticField");
+@#C1
+static set Extension|finalExtensionStaticField(core::int #t38) → void
+  if(self::_#Extension|finalExtensionStaticField#isSet)
+    throw new _in::LateError::fieldAI("finalExtensionStaticField");
+  else {
+    self::_#Extension|finalExtensionStaticField#isSet = true;
+    self::_#Extension|finalExtensionStaticField = #t38;
+  }
+@#C1
+static get Extension|finalExtensionStaticFieldWithInitializer() → core::int {
+  if(!self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet) {
+    final core::int #t39 = 0;
+    if(self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet)
+      throw new _in::LateError::fieldADI("finalExtensionStaticFieldWithInitializer");
+    self::_#Extension|finalExtensionStaticFieldWithInitializer = #t39;
+    self::_#Extension|finalExtensionStaticFieldWithInitializer#isSet = true;
+  }
+  return let final core::int? #t40 = self::_#Extension|finalExtensionStaticFieldWithInitializer in #t40{core::int};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Annotation {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///late_annotations.dart:
+- Annotation. (from org-dartlang-testcase:///late_annotations.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..bb1a104
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_field_inference.dart.weak.modular.expect
@@ -0,0 +1,101 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int? _#A#nonNullableInstanceField = null;
+  field core::bool _#A#nonNullableInstanceField#isSet = false;
+  field core::int? _#A#nullableInstanceField = null;
+  field core::bool _#A#nullableInstanceField#isSet = false;
+  static field core::int? _#nonNullableStaticField = null;
+  static field core::bool _#nonNullableStaticField#isSet = false;
+  static field core::int? _#nullableStaticField = null;
+  static field core::bool _#nullableStaticField#isSet = false;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get nonNullableInstanceField() → core::int {
+    if(!this.{self::A::_#A#nonNullableInstanceField#isSet}{core::bool}) {
+      this.{self::A::_#A#nonNullableInstanceField} = 0;
+      this.{self::A::_#A#nonNullableInstanceField#isSet} = true;
+    }
+    return let final core::int? #t1 = this.{self::A::_#A#nonNullableInstanceField}{core::int?} in #t1{core::int};
+  }
+  set nonNullableInstanceField(core::int #t2) → void {
+    this.{self::A::_#A#nonNullableInstanceField#isSet} = true;
+    this.{self::A::_#A#nonNullableInstanceField} = #t2;
+  }
+  get nullableInstanceField() → core::int? {
+    if(!this.{self::A::_#A#nullableInstanceField#isSet}{core::bool}) {
+      this.{self::A::_#A#nullableInstanceField} = self::method();
+      this.{self::A::_#A#nullableInstanceField#isSet} = true;
+    }
+    return this.{self::A::_#A#nullableInstanceField}{core::int?};
+  }
+  set nullableInstanceField(core::int? #t3) → void {
+    this.{self::A::_#A#nullableInstanceField#isSet} = true;
+    this.{self::A::_#A#nullableInstanceField} = #t3;
+  }
+  static get nonNullableStaticField() → core::int {
+    if(!self::A::_#nonNullableStaticField#isSet) {
+      self::A::_#nonNullableStaticField = 0;
+      self::A::_#nonNullableStaticField#isSet = true;
+    }
+    return let final core::int? #t4 = self::A::_#nonNullableStaticField in #t4{core::int};
+  }
+  static set nonNullableStaticField(core::int #t5) → void {
+    self::A::_#nonNullableStaticField#isSet = true;
+    self::A::_#nonNullableStaticField = #t5;
+  }
+  static get nullableStaticField() → core::int? {
+    if(!self::A::_#nullableStaticField#isSet) {
+      self::A::_#nullableStaticField = self::method();
+      self::A::_#nullableStaticField#isSet = true;
+    }
+    return self::A::_#nullableStaticField;
+  }
+  static set nullableStaticField(core::int? #t6) → void {
+    self::A::_#nullableStaticField#isSet = true;
+    self::A::_#nullableStaticField = #t6;
+  }
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  get nonNullableInstanceField() → core::int
+    return 0;
+  set nonNullableInstanceField(core::int value) → void {}
+  get nullableInstanceField() → core::int?
+    return 0;
+  set nullableInstanceField(core::int? value) → void {}
+}
+static field core::int? _#nonNullableTopLevelField = null;
+static field core::bool _#nonNullableTopLevelField#isSet = false;
+static field core::int? _#nullableTopLevelField = null;
+static field core::bool _#nullableTopLevelField#isSet = false;
+static method method() → core::int?
+  return null;
+static get nonNullableTopLevelField() → core::int {
+  if(!self::_#nonNullableTopLevelField#isSet) {
+    self::_#nonNullableTopLevelField = 0;
+    self::_#nonNullableTopLevelField#isSet = true;
+  }
+  return let final core::int? #t7 = self::_#nonNullableTopLevelField in #t7{core::int};
+}
+static set nonNullableTopLevelField(core::int #t8) → void {
+  self::_#nonNullableTopLevelField#isSet = true;
+  self::_#nonNullableTopLevelField = #t8;
+}
+static get nullableTopLevelField() → core::int? {
+  if(!self::_#nullableTopLevelField#isSet) {
+    self::_#nullableTopLevelField = self::method();
+    self::_#nullableTopLevelField#isSet = true;
+  }
+  return self::_#nullableTopLevelField;
+}
+static set nullableTopLevelField(core::int? #t9) → void {
+  self::_#nullableTopLevelField#isSet = true;
+  self::_#nullableTopLevelField = #t9;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..8d1c620
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_field_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,163 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static field core::int? _#lateStaticField1 = null;
+  static field core::bool _#lateStaticField1#isSet = false;
+  static field core::int? _#lateStaticField2 = null;
+  static field core::bool _#lateStaticField2#isSet = false;
+  field core::int? _#Class#lateInstanceField = null;
+  field core::bool _#Class#lateInstanceField#isSet = false;
+  final field self::Class::T% field;
+  covariant-by-class field self::Class::T? _#Class#lateGenericField1 = null;
+  field core::bool _#Class#lateGenericField1#isSet = false;
+  covariant-by-class field self::Class::T? _#Class#lateGenericField2 = null;
+  field core::bool _#Class#lateGenericField2#isSet = false;
+  constructor •(self::Class::T% field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  static get lateStaticField1() → core::int {
+    if(!self::Class::_#lateStaticField1#isSet) {
+      self::Class::_#lateStaticField1 = 87;
+      self::Class::_#lateStaticField1#isSet = true;
+    }
+    return let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int};
+  }
+  static set lateStaticField1(core::int #t2) → void {
+    self::Class::_#lateStaticField1#isSet = true;
+    self::Class::_#lateStaticField1 = #t2;
+  }
+  static get lateStaticField2() → core::int {
+    if(!self::Class::_#lateStaticField2#isSet) {
+      self::Class::_#lateStaticField2 = 42;
+      self::Class::_#lateStaticField2#isSet = true;
+    }
+    return let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int};
+  }
+  static set lateStaticField2(core::int #t4) → void {
+    self::Class::_#lateStaticField2#isSet = true;
+    self::Class::_#lateStaticField2 = #t4;
+  }
+  static method staticMethod() → dynamic {
+    self::expect(42, self::Class::lateStaticField2);
+    self::Class::lateStaticField2 = 43;
+    self::expect(43, self::Class::lateStaticField2);
+  }
+  get lateInstanceField() → core::int {
+    if(!this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool}) {
+      this.{self::Class::_#Class#lateInstanceField} = 16;
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+    }
+    return let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField}{core::int?} in #t5{core::int};
+  }
+  set lateInstanceField(core::int #t6) → void {
+    this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+    this.{self::Class::_#Class#lateInstanceField} = #t6;
+  }
+  get lateGenericField1() → self::Class::T% {
+    if(!this.{self::Class::_#Class#lateGenericField1#isSet}{core::bool}) {
+      this.{self::Class::_#Class#lateGenericField1} = this.{self::Class::field}{self::Class::T%};
+      this.{self::Class::_#Class#lateGenericField1#isSet} = true;
+    }
+    return let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericField1}{self::Class::T?} in #t7{self::Class::T%};
+  }
+  set lateGenericField1(covariant-by-class self::Class::T% #t8) → void {
+    this.{self::Class::_#Class#lateGenericField1#isSet} = true;
+    this.{self::Class::_#Class#lateGenericField1} = #t8;
+  }
+  get lateGenericField2() → self::Class::T% {
+    if(!this.{self::Class::_#Class#lateGenericField2#isSet}{core::bool}) {
+      this.{self::Class::_#Class#lateGenericField2} = this.{self::Class::field}{self::Class::T%};
+      this.{self::Class::_#Class#lateGenericField2#isSet} = true;
+    }
+    return let final self::Class::T? #t9 = this.{self::Class::_#Class#lateGenericField2}{self::Class::T?} in #t9{self::Class::T%};
+  }
+  set lateGenericField2(covariant-by-class self::Class::T% #t10) → void {
+    this.{self::Class::_#Class#lateGenericField2#isSet} = true;
+    this.{self::Class::_#Class#lateGenericField2} = #t10;
+  }
+  method instanceMethod(covariant-by-class self::Class::T% value) → dynamic {
+    self::expect(16, this.{self::Class::lateInstanceField}{core::int});
+    this.{self::Class::lateInstanceField} = 17;
+    self::expect(17, this.{self::Class::lateInstanceField}{core::int});
+    self::expect(this.{self::Class::field}{self::Class::T%}, this.{self::Class::lateGenericField1}{self::Class::T%});
+    this.{self::Class::lateGenericField1} = value;
+    self::expect(value, this.{self::Class::lateGenericField1}{self::Class::T%});
+    this.{self::Class::lateGenericField2} = value;
+    self::expect(value, this.{self::Class::lateGenericField2}{self::Class::T%});
+  }
+}
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
+  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
+  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
+  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
+  static set lateExtensionField2 = set self::Extension|lateExtensionField2;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static field core::int? _#lateTopLevelField1 = null;
+static field core::bool _#lateTopLevelField1#isSet = false;
+static field core::int? _#Extension|lateExtensionField1 = null;
+static field core::bool _#Extension|lateExtensionField1#isSet = false;
+static field core::int? _#Extension|lateExtensionField2 = null;
+static field core::bool _#Extension|lateExtensionField2#isSet = false;
+static get lateTopLevelField1() → core::int {
+  if(!self::_#lateTopLevelField1#isSet) {
+    self::_#lateTopLevelField1 = 123;
+    self::_#lateTopLevelField1#isSet = true;
+  }
+  return let final core::int? #t11 = self::_#lateTopLevelField1 in #t11{core::int};
+}
+static set lateTopLevelField1(core::int #t12) → void {
+  self::_#lateTopLevelField1#isSet = true;
+  self::_#lateTopLevelField1 = #t12;
+}
+static get Extension|lateExtensionField1() → core::int {
+  if(!self::_#Extension|lateExtensionField1#isSet) {
+    self::_#Extension|lateExtensionField1 = 87;
+    self::_#Extension|lateExtensionField1#isSet = true;
+  }
+  return let final core::int? #t13 = self::_#Extension|lateExtensionField1 in #t13{core::int};
+}
+static set Extension|lateExtensionField1(core::int #t14) → void {
+  self::_#Extension|lateExtensionField1#isSet = true;
+  self::_#Extension|lateExtensionField1 = #t14;
+}
+static get Extension|lateExtensionField2() → core::int {
+  if(!self::_#Extension|lateExtensionField2#isSet) {
+    self::_#Extension|lateExtensionField2 = 42;
+    self::_#Extension|lateExtensionField2#isSet = true;
+  }
+  return let final core::int? #t15 = self::_#Extension|lateExtensionField2 in #t15{core::int};
+}
+static set Extension|lateExtensionField2(core::int #t16) → void {
+  self::_#Extension|lateExtensionField2#isSet = true;
+  self::_#Extension|lateExtensionField2 = #t16;
+}
+static method Extension|staticMethod() → dynamic {
+  self::expect(42, self::Extension|lateExtensionField2);
+  self::Extension|lateExtensionField2 = 43;
+  self::expect(43, self::Extension|lateExtensionField2);
+}
+static method main() → dynamic {
+  self::expect(123, self::lateTopLevelField1);
+  self::lateTopLevelField1 = 124;
+  self::expect(124, self::lateTopLevelField1);
+  self::expect(87, self::Class::lateStaticField1);
+  self::Class::lateStaticField1 = 88;
+  self::expect(88, self::Class::lateStaticField1);
+  self::Class::staticMethod();
+  new self::Class::•<core::int>(0).{self::Class::instanceMethod}(42){(core::int) → dynamic};
+  self::expect(87, self::Extension|lateExtensionField1);
+  self::Extension|lateExtensionField1 = 88;
+  self::expect(88, self::Extension|lateExtensionField1);
+  self::Extension|staticMethod();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..9734ddb
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_field_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,131 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static field core::int? _#lateStaticField1 = null;
+  static field core::bool _#lateStaticField1#isSet = false;
+  static field core::int? _#lateStaticField2 = null;
+  static field core::bool _#lateStaticField2#isSet = false;
+  field core::int? _#Class#lateInstanceField = null;
+  field core::bool _#Class#lateInstanceField#isSet = false;
+  covariant-by-class field self::Class::T? _#Class#lateGenericInstanceField = null;
+  field core::bool _#Class#lateGenericInstanceField#isSet = false;
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static get lateStaticField1() → core::int
+    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateError::fieldNI("lateStaticField1");
+  static set lateStaticField1(core::int #t2) → void {
+    self::Class::_#lateStaticField1#isSet = true;
+    self::Class::_#lateStaticField1 = #t2;
+  }
+  static get lateStaticField2() → core::int
+    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateError::fieldNI("lateStaticField2");
+  static set lateStaticField2(core::int #t4) → void {
+    self::Class::_#lateStaticField2#isSet = true;
+    self::Class::_#lateStaticField2 = #t4;
+  }
+  static method staticMethod() → dynamic {
+    self::throws(() → core::int => self::Class::lateStaticField2, "Read value from uninitialized Class.lateStaticField2");
+    self::Class::lateStaticField2 = 42;
+    self::expect(42, self::Class::lateStaticField2);
+  }
+  get lateInstanceField() → core::int
+    return this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField}{core::int?} in #t5{core::int} : throw new _in::LateError::fieldNI("lateInstanceField");
+  set lateInstanceField(core::int #t6) → void {
+    this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+    this.{self::Class::_#Class#lateInstanceField} = #t6;
+  }
+  get lateGenericInstanceField() → self::Class::T%
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool} ?{self::Class::T%} let final self::Class::T? #t7 = this.{self::Class::_#Class#lateGenericInstanceField}{self::Class::T?} in #t7{self::Class::T%} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
+  set lateGenericInstanceField(covariant-by-class self::Class::T% #t8) → void {
+    this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
+    this.{self::Class::_#Class#lateGenericInstanceField} = #t8;
+  }
+  method instanceMethod(covariant-by-class self::Class::T% value) → dynamic {
+    self::throws(() → core::int => this.{self::Class::lateInstanceField}{core::int}, "Read value from uninitialized Class.lateInstanceField");
+    this.{self::Class::lateInstanceField} = 16;
+    self::expect(16, this.{self::Class::lateInstanceField}{core::int});
+    self::throws(() → self::Class::T% => this.{self::Class::lateGenericInstanceField}{self::Class::T%}, "Read value from uninitialized Class.lateGenericInstanceField");
+    this.{self::Class::lateGenericInstanceField} = value;
+    self::expect(value, this.{self::Class::lateGenericInstanceField}{self::Class::T%});
+  }
+}
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
+  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
+  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
+  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
+  static set lateExtensionField2 = set self::Extension|lateExtensionField2;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static field core::int? _#lateTopLevelField = null;
+static field core::bool _#lateTopLevelField#isSet = false;
+static field core::int? _#Extension|lateExtensionField1 = null;
+static field core::bool _#Extension|lateExtensionField1#isSet = false;
+static field core::int? _#Extension|lateExtensionField2 = null;
+static field core::bool _#Extension|lateExtensionField2#isSet = false;
+static get lateTopLevelField() → core::int
+  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t9 = self::_#lateTopLevelField in #t9{core::int} : throw new _in::LateError::fieldNI("lateTopLevelField");
+static set lateTopLevelField(core::int #t10) → void {
+  self::_#lateTopLevelField#isSet = true;
+  self::_#lateTopLevelField = #t10;
+}
+static get Extension|lateExtensionField1() → core::int
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField1 in #t11{core::int} : throw new _in::LateError::fieldNI("lateExtensionField1");
+static set Extension|lateExtensionField1(core::int #t12) → void {
+  self::_#Extension|lateExtensionField1#isSet = true;
+  self::_#Extension|lateExtensionField1 = #t12;
+}
+static get Extension|lateExtensionField2() → core::int
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t13 = self::_#Extension|lateExtensionField2 in #t13{core::int} : throw new _in::LateError::fieldNI("lateExtensionField2");
+static set Extension|lateExtensionField2(core::int #t14) → void {
+  self::_#Extension|lateExtensionField2#isSet = true;
+  self::_#Extension|lateExtensionField2 = #t14;
+}
+static method Extension|staticMethod() → dynamic {
+  self::throws(() → core::int => self::Extension|lateExtensionField2, "Read value from uninitialized Class.lateExtensionField2");
+  self::Extension|lateExtensionField2 = 42;
+  self::expect(42, self::Extension|lateExtensionField2);
+}
+static method main() → dynamic {
+  self::throws(() → core::int => self::lateTopLevelField, "Read value from uninitialized lateTopLevelField");
+  self::lateTopLevelField = 123;
+  self::expect(123, self::lateTopLevelField);
+  self::throws(() → core::int => self::Class::lateStaticField1, "Read value from uninitialized Class.lateStaticField1");
+  self::Class::lateStaticField1 = 87;
+  self::expect(87, self::Class::lateStaticField1);
+  self::Class::staticMethod();
+  new self::Class::•<core::int>().{self::Class::instanceMethod}(0){(core::int) → dynamic};
+  self::Class<core::int> c = new self::Class::•<core::int>();
+  self::throws(() → core::int => c.{self::Class::lateInstanceField}{core::int}, "Read value from uninitialized Class.lateInstanceField");
+  c.{self::Class::lateInstanceField} = 16;
+  self::expect(16, c.{self::Class::lateInstanceField}{core::int});
+  self::throws(() → core::int => c.{self::Class::lateGenericInstanceField}{core::int}, "Read value from uninitialized Class.lateGenericInstanceField");
+  c.{self::Class::lateGenericInstanceField} = 0;
+  self::expect(0, c.{self::Class::lateGenericInstanceField}{core::int});
+  self::throws(() → core::int => self::Extension|lateExtensionField1, "Read value from uninitialized Extension.lateExtensionField1");
+  self::Extension|lateExtensionField1 = 87;
+  self::expect(87, self::Extension|lateExtensionField1);
+  self::Extension|staticMethod();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..35715d5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,198 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class B extends core::Object {
+  final field core::int x;
+  constructor •(core::int x) → self::B
+    : self::B::x = x, super core::Object::•()
+    ;
+}
+class C extends self::B {
+  field core::int? _#C#y = null;
+  field core::bool _#C#y#isSet = false;
+  constructor •(core::int x) → self::C
+    : super self::B::•(x)
+    ;
+  get y() → core::int {
+    if(!this.{self::C::_#C#y#isSet}{core::bool}) {
+      final core::int #t1 = this.{self::B::x}{core::int}.{core::num::+}(1){(core::num) → core::int};
+      if(this.{self::C::_#C#y#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("y");
+      this.{self::C::_#C#y} = #t1;
+      this.{self::C::_#C#y#isSet} = true;
+    }
+    return let final core::int? #t2 = this.{self::C::_#C#y}{core::int?} in #t2{core::int};
+  }
+  method method() → dynamic
+    return this.{self::B::x}{core::int};
+}
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static field core::int? lateStaticField1Init = null;
+  static field core::int? _#lateStaticField1 = null;
+  static field core::bool _#lateStaticField1#isSet = false;
+  static field core::int? lateStaticField2Init = null;
+  static field core::int? _#lateStaticField2 = null;
+  static field core::bool _#lateStaticField2#isSet = false;
+  field core::int? lateInstanceFieldInit = null;
+  field core::int? _#Class#lateInstanceField = null;
+  field core::bool _#Class#lateInstanceField#isSet = false;
+  covariant-by-class field self::Class::T? lateGenericFieldInit = null;
+  final field self::Class::T% field;
+  field self::Class::T? _#Class#lateGenericField = null;
+  field core::bool _#Class#lateGenericField#isSet = false;
+  constructor •(self::Class::T% field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  static method initLateStaticField1(core::int value) → core::int {
+    return self::Class::lateStaticField1Init = value;
+  }
+  static get lateStaticField1() → core::int {
+    if(!self::Class::_#lateStaticField1#isSet) {
+      final core::int #t3 = self::Class::initLateStaticField1(87);
+      if(self::Class::_#lateStaticField1#isSet)
+        throw new _in::LateError::fieldADI("lateStaticField1");
+      self::Class::_#lateStaticField1 = #t3;
+      self::Class::_#lateStaticField1#isSet = true;
+    }
+    return let final core::int? #t4 = self::Class::_#lateStaticField1 in #t4{core::int};
+  }
+  static method initLateStaticField2(core::int value) → core::int {
+    return self::Class::lateStaticField2Init = value;
+  }
+  static get lateStaticField2() → core::int {
+    if(!self::Class::_#lateStaticField2#isSet) {
+      final core::int #t5 = self::Class::initLateStaticField2(42);
+      if(self::Class::_#lateStaticField2#isSet)
+        throw new _in::LateError::fieldADI("lateStaticField2");
+      self::Class::_#lateStaticField2 = #t5;
+      self::Class::_#lateStaticField2#isSet = true;
+    }
+    return let final core::int? #t6 = self::Class::_#lateStaticField2 in #t6{core::int};
+  }
+  static method staticMethod() → dynamic {
+    self::expect(null, self::Class::lateStaticField2Init);
+    self::expect(42, self::Class::lateStaticField2);
+    self::expect(42, self::Class::lateStaticField2Init);
+  }
+  method initLateInstanceField(core::int value) → core::int {
+    return this.{self::Class::lateInstanceFieldInit} = value;
+  }
+  get lateInstanceField() → core::int {
+    if(!this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool}) {
+      final core::int #t7 = this.{self::Class::initLateInstanceField}(16){(core::int) → core::int};
+      if(this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("lateInstanceField");
+      this.{self::Class::_#Class#lateInstanceField} = #t7;
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+    }
+    return let final core::int? #t8 = this.{self::Class::_#Class#lateInstanceField}{core::int?} in #t8{core::int};
+  }
+  method initLateGenericField(covariant-by-class self::Class::T% value) → self::Class::T% {
+    return this.{self::Class::lateGenericFieldInit} = value;
+  }
+  get lateGenericField() → self::Class::T% {
+    if(!this.{self::Class::_#Class#lateGenericField#isSet}{core::bool}) {
+      final self::Class::T% #t9 = this.{self::Class::initLateGenericField}(this.{self::Class::field}{self::Class::T%}){(self::Class::T%) → self::Class::T%};
+      if(this.{self::Class::_#Class#lateGenericField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("lateGenericField");
+      this.{self::Class::_#Class#lateGenericField} = #t9;
+      this.{self::Class::_#Class#lateGenericField#isSet} = true;
+    }
+    return let final self::Class::T? #t10 = this.{self::Class::_#Class#lateGenericField}{self::Class::T?} in #t10{self::Class::T%};
+  }
+  method instanceMethod() → dynamic {
+    self::expect(null, this.{self::Class::lateInstanceFieldInit}{core::int?});
+    self::expect(16, this.{self::Class::lateInstanceField}{core::int});
+    self::expect(16, this.{self::Class::lateInstanceFieldInit}{core::int?});
+    self::expect(null, this.{self::Class::lateGenericFieldInit}{self::Class::T?});
+    self::expect(this.{self::Class::field}{self::Class::T%}, this.{self::Class::lateGenericField}{self::Class::T%});
+    self::expect(this.{self::Class::field}{self::Class::T%}, this.{self::Class::lateGenericFieldInit}{self::Class::T?});
+  }
+}
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
+  static field lateExtensionField1Init = self::Extension|lateExtensionField1Init;
+  static method initLateExtensionField1 = self::Extension|initLateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
+  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
+  static field lateExtensionField2Init = self::Extension|lateExtensionField2Init;
+  static method initLateExtensionField2 = self::Extension|initLateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
+  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static field core::int? lateTopLevelField1Init;
+static field core::int? _#lateTopLevelField1 = null;
+static field core::bool _#lateTopLevelField1#isSet = false;
+static field core::int? Extension|lateExtensionField1Init;
+static field core::int? _#Extension|lateExtensionField1 = null;
+static field core::bool _#Extension|lateExtensionField1#isSet = false;
+static field core::int? Extension|lateExtensionField2Init;
+static field core::int? _#Extension|lateExtensionField2 = null;
+static field core::bool _#Extension|lateExtensionField2#isSet = false;
+static method initLateTopLevelField1(core::int value) → core::int {
+  return self::lateTopLevelField1Init = value;
+}
+static get lateTopLevelField1() → core::int {
+  if(!self::_#lateTopLevelField1#isSet) {
+    final core::int #t11 = self::initLateTopLevelField1(123);
+    if(self::_#lateTopLevelField1#isSet)
+      throw new _in::LateError::fieldADI("lateTopLevelField1");
+    self::_#lateTopLevelField1 = #t11;
+    self::_#lateTopLevelField1#isSet = true;
+  }
+  return let final core::int? #t12 = self::_#lateTopLevelField1 in #t12{core::int};
+}
+static method Extension|initLateExtensionField1(core::int value) → core::int {
+  return self::Extension|lateExtensionField1Init = value;
+}
+static get Extension|lateExtensionField1() → core::int {
+  if(!self::_#Extension|lateExtensionField1#isSet) {
+    final core::int #t13 = self::Extension|initLateExtensionField1(87);
+    if(self::_#Extension|lateExtensionField1#isSet)
+      throw new _in::LateError::fieldADI("lateExtensionField1");
+    self::_#Extension|lateExtensionField1 = #t13;
+    self::_#Extension|lateExtensionField1#isSet = true;
+  }
+  return let final core::int? #t14 = self::_#Extension|lateExtensionField1 in #t14{core::int};
+}
+static method Extension|initLateExtensionField2(core::int value) → core::int {
+  return self::Extension|lateExtensionField2Init = value;
+}
+static get Extension|lateExtensionField2() → core::int {
+  if(!self::_#Extension|lateExtensionField2#isSet) {
+    final core::int #t15 = self::Extension|initLateExtensionField2(42);
+    if(self::_#Extension|lateExtensionField2#isSet)
+      throw new _in::LateError::fieldADI("lateExtensionField2");
+    self::_#Extension|lateExtensionField2 = #t15;
+    self::_#Extension|lateExtensionField2#isSet = true;
+  }
+  return let final core::int? #t16 = self::_#Extension|lateExtensionField2 in #t16{core::int};
+}
+static method Extension|staticMethod() → dynamic {
+  self::expect(null, self::Extension|lateExtensionField2Init);
+  self::expect(42, self::Extension|lateExtensionField2);
+  self::expect(42, self::Extension|lateExtensionField2Init);
+}
+static method main() → dynamic {
+  self::expect(null, self::lateTopLevelField1Init);
+  self::expect(123, self::lateTopLevelField1);
+  self::expect(123, self::lateTopLevelField1Init);
+  self::expect(null, self::Class::lateStaticField1Init);
+  self::expect(87, self::Class::lateStaticField1);
+  self::expect(87, self::Class::lateStaticField1Init);
+  self::Class::staticMethod();
+  new self::Class::•<core::int>(0).{self::Class::instanceMethod}(){() → dynamic};
+  self::expect(null, self::Extension|lateExtensionField1Init);
+  self::expect(87, self::Extension|lateExtensionField1);
+  self::expect(87, self::Extension|lateExtensionField1Init);
+  self::Extension|staticMethod();
+  self::expect(2, new self::C::•(1).{self::C::y}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..f0429db
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_final_field_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,137 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  static field core::int? _#lateStaticField1 = null;
+  static field core::bool _#lateStaticField1#isSet = false;
+  static field core::int? _#lateStaticField2 = null;
+  static field core::bool _#lateStaticField2#isSet = false;
+  field core::int? _#Class#lateInstanceField = null;
+  field core::bool _#Class#lateInstanceField#isSet = false;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static get lateStaticField1() → core::int
+    return self::Class::_#lateStaticField1#isSet ?{core::int} let final core::int? #t1 = self::Class::_#lateStaticField1 in #t1{core::int} : throw new _in::LateError::fieldNI("lateStaticField1");
+  static set lateStaticField1(core::int #t2) → void
+    if(self::Class::_#lateStaticField1#isSet)
+      throw new _in::LateError::fieldAI("lateStaticField1");
+    else {
+      self::Class::_#lateStaticField1#isSet = true;
+      self::Class::_#lateStaticField1 = #t2;
+    }
+  static get lateStaticField2() → core::int
+    return self::Class::_#lateStaticField2#isSet ?{core::int} let final core::int? #t3 = self::Class::_#lateStaticField2 in #t3{core::int} : throw new _in::LateError::fieldNI("lateStaticField2");
+  static set lateStaticField2(core::int #t4) → void
+    if(self::Class::_#lateStaticField2#isSet)
+      throw new _in::LateError::fieldAI("lateStaticField2");
+    else {
+      self::Class::_#lateStaticField2#isSet = true;
+      self::Class::_#lateStaticField2 = #t4;
+    }
+  static method staticMethod() → dynamic {
+    self::throws(() → core::int => self::Class::lateStaticField2, "Read value from uninitialized Class.lateStaticField2");
+    self::Class::lateStaticField2 = 42;
+    self::expect(42, self::Class::lateStaticField2);
+    self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
+  }
+  get lateInstanceField() → core::int
+    return this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#lateInstanceField}{core::int?} in #t5{core::int} : throw new _in::LateError::fieldNI("lateInstanceField");
+  set lateInstanceField(core::int #t6) → void
+    if(this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("lateInstanceField");
+    else {
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+      this.{self::Class::_#Class#lateInstanceField} = #t6;
+    }
+  method instanceMethod() → dynamic {
+    self::throws(() → core::int => this.{self::Class::lateInstanceField}{core::int}, "Read value from uninitialized Class.lateInstanceField");
+    this.{self::Class::lateInstanceField} = 16;
+    self::expect(16, this.{self::Class::lateInstanceField}{core::int});
+    self::throws(() → core::int => this.{self::Class::lateInstanceField} = 17, "Write value to initialized Class.lateInstanceField");
+  }
+}
+extension Extension on self::Class {
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
+  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
+  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
+  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
+  static set lateExtensionField2 = set self::Extension|lateExtensionField2;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static field core::int? _#lateTopLevelField = null;
+static field core::bool _#lateTopLevelField#isSet = false;
+static field core::int? _#Extension|lateExtensionField1 = null;
+static field core::bool _#Extension|lateExtensionField1#isSet = false;
+static field core::int? _#Extension|lateExtensionField2 = null;
+static field core::bool _#Extension|lateExtensionField2#isSet = false;
+static get lateTopLevelField() → core::int
+  return self::_#lateTopLevelField#isSet ?{core::int} let final core::int? #t7 = self::_#lateTopLevelField in #t7{core::int} : throw new _in::LateError::fieldNI("lateTopLevelField");
+static set lateTopLevelField(core::int #t8) → void
+  if(self::_#lateTopLevelField#isSet)
+    throw new _in::LateError::fieldAI("lateTopLevelField");
+  else {
+    self::_#lateTopLevelField#isSet = true;
+    self::_#lateTopLevelField = #t8;
+  }
+static get Extension|lateExtensionField1() → core::int
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int} let final core::int? #t9 = self::_#Extension|lateExtensionField1 in #t9{core::int} : throw new _in::LateError::fieldNI("lateExtensionField1");
+static set Extension|lateExtensionField1(core::int #t10) → void
+  if(self::_#Extension|lateExtensionField1#isSet)
+    throw new _in::LateError::fieldAI("lateExtensionField1");
+  else {
+    self::_#Extension|lateExtensionField1#isSet = true;
+    self::_#Extension|lateExtensionField1 = #t10;
+  }
+static get Extension|lateExtensionField2() → core::int
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int} let final core::int? #t11 = self::_#Extension|lateExtensionField2 in #t11{core::int} : throw new _in::LateError::fieldNI("lateExtensionField2");
+static set Extension|lateExtensionField2(core::int #t12) → void
+  if(self::_#Extension|lateExtensionField2#isSet)
+    throw new _in::LateError::fieldAI("lateExtensionField2");
+  else {
+    self::_#Extension|lateExtensionField2#isSet = true;
+    self::_#Extension|lateExtensionField2 = #t12;
+  }
+static method Extension|staticMethod() → dynamic {
+  self::throws(() → core::int => self::Extension|lateExtensionField2, "Read value from uninitialized Class.lateExtensionField2");
+  self::Extension|lateExtensionField2 = 42;
+  self::expect(42, self::Extension|lateExtensionField2);
+  self::throws(() → core::int => self::Extension|lateExtensionField2 = 43, "Write value to initialized Class.lateExtensionField2");
+}
+static method main() → dynamic {
+  self::throws(() → core::int => self::lateTopLevelField, "Read value from uninitialized lateTopLevelField");
+  self::lateTopLevelField = 123;
+  self::expect(123, self::lateTopLevelField);
+  self::throws(() → core::int => self::lateTopLevelField = 124, "Write value to initialized lateTopLevelField");
+  self::throws(() → core::int => self::Class::lateStaticField1, "Read value from uninitialized Class.lateStaticField1");
+  self::Class::lateStaticField1 = 87;
+  self::expect(87, self::Class::lateStaticField1);
+  self::throws(() → core::int => self::Class::lateStaticField1 = 88, "Write value to initialized Class.lateStaticField1");
+  self::Class::staticMethod();
+  new self::Class::•().{self::Class::instanceMethod}(){() → dynamic};
+  self::throws(() → core::int => self::Extension|lateExtensionField1, "Read value from uninitialized Extension.lateExtensionField1");
+  self::Extension|lateExtensionField1 = 87;
+  self::expect(87, self::Extension|lateExtensionField1);
+  self::throws(() → core::int => self::Extension|lateExtensionField1 = 88, "Write value to initialized Extension.lateExtensionField1");
+  self::Extension|staticMethod();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..49e5b26
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+  core::int? lateLocalInit;
+  function initLateLocal(core::int value) → core::int {
+    return lateLocalInit = value;
+  }
+  lowered final core::int? #lateLocal;
+  lowered core::bool #lateLocal#isSet = false;
+  function #lateLocal#get() → core::int {
+    if(!#lateLocal#isSet) {
+      final core::int #t1 = initLateLocal(123){(core::int) → core::int};
+      if(#lateLocal#isSet)
+        throw new _in::LateError::localADI("lateLocal");
+      #lateLocal = #t1;
+      #lateLocal#isSet = true;
+    }
+    return #lateLocal{core::int};
+  }
+  self::expect(null, lateLocalInit);
+  self::expect(123, #lateLocal#get(){() → core::int});
+  self::expect(123, lateLocalInit);
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
+    T? lateGenericLocalInit;
+    function initLateGenericLocal(T% value) → T% {
+      return lateGenericLocalInit = value;
+    }
+    lowered final T? #lateGenericLocal;
+    lowered core::bool #lateGenericLocal#isSet = false;
+    function #lateGenericLocal#get() → T% {
+      if(!#lateGenericLocal#isSet) {
+        final T% #t2 = initLateGenericLocal(value){(T%) → T%};
+        if(#lateGenericLocal#isSet)
+          throw new _in::LateError::localADI("lateGenericLocal");
+        #lateGenericLocal = #t2;
+        #lateGenericLocal#isSet = true;
+      }
+      return #lateGenericLocal{T%};
+    }
+    self::expect(null, lateGenericLocalInit);
+    self::expect(value, #lateGenericLocal#get(){() → T%});
+    self::expect(value, lateGenericLocalInit);
+  }
+  local<core::int?>(null){(core::int?) → Null};
+  local<core::int?>(42){(core::int?) → Null};
+  local<core::int>(42){(core::int) → Null};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..6050d9e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+  core::bool b = (() → core::bool => false)(){() → core::bool};
+  lowered final core::int? #lateLocal;
+  lowered core::bool #lateLocal#isSet = false;
+  function #lateLocal#get() → core::int
+    return #lateLocal#isSet ?{core::int} #lateLocal{core::int} : throw new _in::LateError::localNI("lateLocal");
+  function #lateLocal#set(core::int #t1) → dynamic
+    if(#lateLocal#isSet)
+      throw new _in::LateError::localAI("lateLocal");
+    else {
+      #lateLocal#isSet = true;
+      return #lateLocal = #t1;
+    }
+  if(b) {
+    #lateLocal#set(123){(core::int) → dynamic};
+  }
+  self::throws(() → core::int => #lateLocal#get(){() → core::int}, "Read value from uninitialized lateLocal");
+  if(!b) {
+    self::expect(123, #lateLocal#set(123){(core::int) → dynamic});
+    self::expect(123, #lateLocal#get(){() → core::int});
+  }
+  self::throws(() → core::int => #lateLocal#set(124){(core::int) → dynamic}, "Write value to initialized lateLocal");
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
+    lowered final T? #lateGenericLocal;
+    lowered core::bool #lateGenericLocal#isSet = false;
+    function #lateGenericLocal#get() → T%
+      return #lateGenericLocal#isSet ?{T%} #lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
+    function #lateGenericLocal#set(T% #t2) → dynamic
+      if(#lateGenericLocal#isSet)
+        throw new _in::LateError::localAI("lateGenericLocal");
+      else {
+        #lateGenericLocal#isSet = true;
+        return #lateGenericLocal = #t2;
+      }
+    if(b) {
+      #lateGenericLocal#set(value){(T%) → dynamic};
+    }
+    self::throws(() → T% => #lateGenericLocal#get(){() → T%}, "Read value from uninitialized lateGenericLocal");
+    if(!b) {
+      self::expect(value, #lateGenericLocal#set(value){(T%) → dynamic});
+      self::expect(value, #lateGenericLocal#get(){() → T%});
+    }
+    self::throws(() → T% => #lateGenericLocal#set(value){(T%) → dynamic}, "Write value to initialized lateGenericLocal");
+  }
+  local<core::int?>(null){(core::int?) → Null};
+  local<core::int?>(42){(core::int?) → Null};
+  local<core::int>(42){(core::int) → Null};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..0b29db8
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,174 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static field core::int? lateStaticField1Init = null;
+  static field core::int? _#lateStaticField1 = null;
+  static field core::bool _#lateStaticField1#isSet = false;
+  static field core::int? lateStaticField2Init = null;
+  static field core::int? _#lateStaticField2 = null;
+  static field core::bool _#lateStaticField2#isSet = false;
+  field core::int? lateInstanceFieldInit = null;
+  field core::int? _#Class#lateInstanceField = null;
+  field core::bool _#Class#lateInstanceField#isSet = false;
+  covariant-by-class field self::Class::T? lateGenericInstanceFieldInit = null;
+  final field self::Class::T? field;
+  field self::Class::T? _#Class#lateGenericInstanceField = null;
+  field core::bool _#Class#lateGenericInstanceField#isSet = false;
+  constructor •(self::Class::T? field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  static method initLateStaticField1(core::int value) → core::int? {
+    return self::Class::lateStaticField1Init = value;
+  }
+  static get lateStaticField1() → core::int? {
+    if(!self::Class::_#lateStaticField1#isSet) {
+      final core::int? #t1 = self::Class::initLateStaticField1(87);
+      if(self::Class::_#lateStaticField1#isSet)
+        throw new _in::LateError::fieldADI("lateStaticField1");
+      self::Class::_#lateStaticField1 = #t1;
+      self::Class::_#lateStaticField1#isSet = true;
+    }
+    return self::Class::_#lateStaticField1;
+  }
+  static method initLateStaticField2(core::int value) → core::int? {
+    return self::Class::lateStaticField2Init = value;
+  }
+  static get lateStaticField2() → core::int? {
+    if(!self::Class::_#lateStaticField2#isSet) {
+      final core::int? #t2 = self::Class::initLateStaticField2(42);
+      if(self::Class::_#lateStaticField2#isSet)
+        throw new _in::LateError::fieldADI("lateStaticField2");
+      self::Class::_#lateStaticField2 = #t2;
+      self::Class::_#lateStaticField2#isSet = true;
+    }
+    return self::Class::_#lateStaticField2;
+  }
+  static method staticMethod() → dynamic {
+    self::expect(null, self::Class::lateStaticField2Init);
+    self::expect(42, self::Class::lateStaticField2);
+    self::expect(42, self::Class::lateStaticField2Init);
+  }
+  method initLateInstanceField(core::int value) → core::int? {
+    return this.{self::Class::lateInstanceFieldInit} = value;
+  }
+  get lateInstanceField() → core::int? {
+    if(!this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool}) {
+      final core::int? #t3 = this.{self::Class::initLateInstanceField}(16){(core::int) → core::int?};
+      if(this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("lateInstanceField");
+      this.{self::Class::_#Class#lateInstanceField} = #t3;
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+    }
+    return this.{self::Class::_#Class#lateInstanceField}{core::int?};
+  }
+  method initLateGenericInstanceField(covariant-by-class self::Class::T? value) → self::Class::T? {
+    return this.{self::Class::lateGenericInstanceFieldInit} = value;
+  }
+  get lateGenericInstanceField() → self::Class::T? {
+    if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool}) {
+      final self::Class::T? #t4 = this.{self::Class::initLateGenericInstanceField}(this.{self::Class::field}{self::Class::T?}){(self::Class::T?) → self::Class::T?};
+      if(this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("lateGenericInstanceField");
+      this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
+    }
+    return this.{self::Class::_#Class#lateGenericInstanceField}{self::Class::T?};
+  }
+  method instanceMethod() → dynamic {
+    self::expect(null, this.{self::Class::lateInstanceFieldInit}{core::int?});
+    self::expect(16, this.{self::Class::lateInstanceField}{core::int?});
+    self::expect(16, this.{self::Class::lateInstanceFieldInit}{core::int?});
+    self::expect(null, this.{self::Class::lateGenericInstanceFieldInit}{self::Class::T?});
+    self::expect(this.{self::Class::field}{self::Class::T?}, this.{self::Class::lateGenericInstanceField}{self::Class::T?});
+    self::expect(this.{self::Class::field}{self::Class::T?}, this.{self::Class::lateGenericInstanceFieldInit}{self::Class::T?});
+  }
+}
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
+  static field lateExtensionField1Init = self::Extension|lateExtensionField1Init;
+  static method initLateExtensionField1 = self::Extension|initLateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
+  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
+  static field lateExtensionField2Init = self::Extension|lateExtensionField2Init;
+  static method initLateExtensionField2 = self::Extension|initLateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
+  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static field core::int? lateTopLevelField1Init;
+static field core::int? _#lateTopLevelField1 = null;
+static field core::bool _#lateTopLevelField1#isSet = false;
+static field core::int? Extension|lateExtensionField1Init;
+static field core::int? _#Extension|lateExtensionField1 = null;
+static field core::bool _#Extension|lateExtensionField1#isSet = false;
+static field core::int? Extension|lateExtensionField2Init;
+static field core::int? _#Extension|lateExtensionField2 = null;
+static field core::bool _#Extension|lateExtensionField2#isSet = false;
+static method initLateTopLevelField1(core::int value) → core::int? {
+  return self::lateTopLevelField1Init = value;
+}
+static get lateTopLevelField1() → core::int? {
+  if(!self::_#lateTopLevelField1#isSet) {
+    final core::int? #t5 = self::initLateTopLevelField1(123);
+    if(self::_#lateTopLevelField1#isSet)
+      throw new _in::LateError::fieldADI("lateTopLevelField1");
+    self::_#lateTopLevelField1 = #t5;
+    self::_#lateTopLevelField1#isSet = true;
+  }
+  return self::_#lateTopLevelField1;
+}
+static method Extension|initLateExtensionField1(core::int value) → core::int? {
+  return self::Extension|lateExtensionField1Init = value;
+}
+static get Extension|lateExtensionField1() → core::int? {
+  if(!self::_#Extension|lateExtensionField1#isSet) {
+    final core::int? #t6 = self::Extension|initLateExtensionField1(87);
+    if(self::_#Extension|lateExtensionField1#isSet)
+      throw new _in::LateError::fieldADI("lateExtensionField1");
+    self::_#Extension|lateExtensionField1 = #t6;
+    self::_#Extension|lateExtensionField1#isSet = true;
+  }
+  return self::_#Extension|lateExtensionField1;
+}
+static method Extension|initLateExtensionField2(core::int value) → core::int? {
+  return self::Extension|lateExtensionField2Init = value;
+}
+static get Extension|lateExtensionField2() → core::int? {
+  if(!self::_#Extension|lateExtensionField2#isSet) {
+    final core::int? #t7 = self::Extension|initLateExtensionField2(42);
+    if(self::_#Extension|lateExtensionField2#isSet)
+      throw new _in::LateError::fieldADI("lateExtensionField2");
+    self::_#Extension|lateExtensionField2 = #t7;
+    self::_#Extension|lateExtensionField2#isSet = true;
+  }
+  return self::_#Extension|lateExtensionField2;
+}
+static method Extension|staticMethod() → dynamic {
+  self::expect(null, self::Extension|lateExtensionField2Init);
+  self::expect(42, self::Extension|lateExtensionField2);
+  self::expect(42, self::Extension|lateExtensionField2Init);
+}
+static method main() → dynamic {
+  self::expect(null, self::lateTopLevelField1Init);
+  self::expect(123, self::lateTopLevelField1);
+  self::expect(123, self::lateTopLevelField1Init);
+  self::expect(null, self::Class::lateStaticField1Init);
+  self::expect(87, self::Class::lateStaticField1);
+  self::expect(87, self::Class::lateStaticField1Init);
+  self::Class::staticMethod();
+  new self::Class::•<core::int?>(null).{self::Class::instanceMethod}(){() → dynamic};
+  new self::Class::•<core::int?>(0).{self::Class::instanceMethod}(){() → dynamic};
+  new self::Class::•<core::int>(0).{self::Class::instanceMethod}(){() → dynamic};
+  self::expect(null, self::Extension|lateExtensionField1Init);
+  self::expect(87, self::Extension|lateExtensionField1);
+  self::expect(87, self::Extension|lateExtensionField1Init);
+  self::Extension|staticMethod();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..ce6ed76
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_field_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,154 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static field core::int? _#lateStaticField1 = null;
+  static field core::bool _#lateStaticField1#isSet = false;
+  static field core::int? _#lateStaticField2 = null;
+  static field core::bool _#lateStaticField2#isSet = false;
+  field core::int? _#Class#lateInstanceField = null;
+  field core::bool _#Class#lateInstanceField#isSet = false;
+  field self::Class::T? _#Class#lateGenericInstanceField = null;
+  field core::bool _#Class#lateGenericInstanceField#isSet = false;
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static get lateStaticField1() → core::int?
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
+  static set lateStaticField1(core::int? #t1) → void
+    if(self::Class::_#lateStaticField1#isSet)
+      throw new _in::LateError::fieldAI("lateStaticField1");
+    else {
+      self::Class::_#lateStaticField1#isSet = true;
+      self::Class::_#lateStaticField1 = #t1;
+    }
+  static get lateStaticField2() → core::int?
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
+  static set lateStaticField2(core::int? #t2) → void
+    if(self::Class::_#lateStaticField2#isSet)
+      throw new _in::LateError::fieldAI("lateStaticField2");
+    else {
+      self::Class::_#lateStaticField2#isSet = true;
+      self::Class::_#lateStaticField2 = #t2;
+    }
+  static method staticMethod() → dynamic {
+    self::throws(() → core::int? => self::Class::lateStaticField2, "Read value from uninitialized Class.lateStaticField2");
+    self::Class::lateStaticField2 = 42;
+    self::expect(42, self::Class::lateStaticField2);
+    self::throws(() → core::int => self::Class::lateStaticField2 = 43, "Write value to initialized Class.lateStaticField2");
+  }
+  get lateInstanceField() → core::int?
+    return this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool} ?{core::int?} this.{self::Class::_#Class#lateInstanceField}{core::int?} : throw new _in::LateError::fieldNI("lateInstanceField");
+  set lateInstanceField(core::int? #t3) → void
+    if(this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("lateInstanceField");
+    else {
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+      this.{self::Class::_#Class#lateInstanceField} = #t3;
+    }
+  get lateGenericInstanceField() → self::Class::T?
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField}{self::Class::T?} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
+  set lateGenericInstanceField(self::Class::T? #t4) → void
+    if(this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("lateGenericInstanceField");
+    else {
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
+      this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
+    }
+  method instanceMethod(covariant-by-class self::Class::T% value) → dynamic {
+    self::throws(() → core::int? => this.{self::Class::lateInstanceField}{core::int?}, "Read value from uninitialized Class.lateInstanceField");
+    this.{self::Class::lateInstanceField} = 16;
+    self::expect(16, this.{self::Class::lateInstanceField}{core::int?});
+    self::throws(() → core::int => this.{self::Class::lateInstanceField} = 17, "Write value to initialized Class.lateInstanceField");
+    self::throws(() → self::Class::T? => this.{self::Class::lateGenericInstanceField}{self::Class::T?}, "Read value from uninitialized Class.lateGenericInstanceField");
+    this.{self::Class::lateGenericInstanceField} = value;
+    self::expect(value, this.{self::Class::lateGenericInstanceField}{self::Class::T?});
+    self::throws(() → self::Class::T% => this.{self::Class::lateGenericInstanceField} = value, "Write value to initialized Class.lateGenericInstanceField");
+  }
+}
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
+  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
+  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
+  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
+  static set lateExtensionField2 = set self::Extension|lateExtensionField2;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static field core::int? _#lateTopLevelField = null;
+static field core::bool _#lateTopLevelField#isSet = false;
+static field core::int? _#Extension|lateExtensionField1 = null;
+static field core::bool _#Extension|lateExtensionField1#isSet = false;
+static field core::int? _#Extension|lateExtensionField2 = null;
+static field core::bool _#Extension|lateExtensionField2#isSet = false;
+static get lateTopLevelField() → core::int?
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
+static set lateTopLevelField(core::int? #t5) → void
+  if(self::_#lateTopLevelField#isSet)
+    throw new _in::LateError::fieldAI("lateTopLevelField");
+  else {
+    self::_#lateTopLevelField#isSet = true;
+    self::_#lateTopLevelField = #t5;
+  }
+static get Extension|lateExtensionField1() → core::int?
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
+static set Extension|lateExtensionField1(core::int? #t6) → void
+  if(self::_#Extension|lateExtensionField1#isSet)
+    throw new _in::LateError::fieldAI("lateExtensionField1");
+  else {
+    self::_#Extension|lateExtensionField1#isSet = true;
+    self::_#Extension|lateExtensionField1 = #t6;
+  }
+static get Extension|lateExtensionField2() → core::int?
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
+static set Extension|lateExtensionField2(core::int? #t7) → void
+  if(self::_#Extension|lateExtensionField2#isSet)
+    throw new _in::LateError::fieldAI("lateExtensionField2");
+  else {
+    self::_#Extension|lateExtensionField2#isSet = true;
+    self::_#Extension|lateExtensionField2 = #t7;
+  }
+static method Extension|staticMethod() → dynamic {
+  self::throws(() → core::int? => self::Extension|lateExtensionField2, "Read value from uninitialized Class.lateExtensionField2");
+  self::Extension|lateExtensionField2 = 42;
+  self::expect(42, self::Extension|lateExtensionField2);
+  self::throws(() → core::int => self::Extension|lateExtensionField2 = 43, "Write value to initialized Class.lateExtensionField2");
+}
+static method main() → dynamic {
+  self::throws(() → core::int? => self::lateTopLevelField, "Read value from uninitialized lateTopLevelField");
+  self::lateTopLevelField = 123;
+  self::expect(123, self::lateTopLevelField);
+  self::throws(() → core::int => self::lateTopLevelField = 124, "Write value to initialized lateTopLevelField");
+  self::throws(() → core::int? => self::Class::lateStaticField1, "Read value from uninitialized Class.lateStaticField1");
+  self::Class::lateStaticField1 = 87;
+  self::expect(87, self::Class::lateStaticField1);
+  self::throws(() → core::int => self::Class::lateStaticField1 = 88, "Write value to initialized Class.lateStaticField1");
+  self::Class::staticMethod();
+  new self::Class::•<core::int?>().{self::Class::instanceMethod}(null){(core::int?) → dynamic};
+  new self::Class::•<core::int?>().{self::Class::instanceMethod}(0){(core::int?) → dynamic};
+  new self::Class::•<core::int>().{self::Class::instanceMethod}(0){(core::int) → dynamic};
+  self::throws(() → core::int? => self::Extension|lateExtensionField1, "Read value from uninitialized Extension.lateExtensionField1");
+  self::Extension|lateExtensionField1 = 87;
+  self::expect(87, self::Extension|lateExtensionField1);
+  self::throws(() → core::int => self::Extension|lateExtensionField1 = 88, "Write value to initialized Extension.lateExtensionField1");
+  self::Extension|staticMethod();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..9d9501d
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+  core::int? lateLocalInit;
+  function initLateLocal(core::int? value) → core::int? {
+    return lateLocalInit = value;
+  }
+  lowered final core::int? #lateLocal;
+  lowered core::bool #lateLocal#isSet = false;
+  function #lateLocal#get() → core::int? {
+    if(!#lateLocal#isSet) {
+      final core::int? #t1 = initLateLocal(123){(core::int?) → core::int?};
+      if(#lateLocal#isSet)
+        throw new _in::LateError::localADI("lateLocal");
+      #lateLocal = #t1;
+      #lateLocal#isSet = true;
+    }
+    return #lateLocal;
+  }
+  self::expect(null, lateLocalInit);
+  self::expect(123, #lateLocal#get(){() → core::int?});
+  self::expect(123, lateLocalInit);
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
+    T? lateGenericLocalInit;
+    function initLateGenericLocal(T? value) → T? {
+      return lateGenericLocalInit = value;
+    }
+    lowered final T? #lateGenericLocal;
+    lowered core::bool #lateGenericLocal#isSet = false;
+    function #lateGenericLocal#get() → T? {
+      if(!#lateGenericLocal#isSet) {
+        final T? #t2 = initLateGenericLocal(value){(T?) → T?};
+        if(#lateGenericLocal#isSet)
+          throw new _in::LateError::localADI("lateGenericLocal");
+        #lateGenericLocal = #t2;
+        #lateGenericLocal#isSet = true;
+      }
+      return #lateGenericLocal;
+    }
+    self::expect(null, lateGenericLocalInit);
+    self::expect(value, #lateGenericLocal#get(){() → T?});
+    self::expect(value, lateGenericLocalInit);
+  }
+  local<core::int?>(null){(core::int?) → Null};
+  local<core::int?>(42){(core::int?) → Null};
+  local<core::int>(42){(core::int?) → Null};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..751ada1
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+  lowered final core::int? #lateLocal;
+  lowered core::bool #lateLocal#isSet = false;
+  function #lateLocal#get() → core::int?
+    return #lateLocal#isSet ?{core::int?} #lateLocal : throw new _in::LateError::localNI("lateLocal");
+  function #lateLocal#set(core::int? #t1) → dynamic
+    if(#lateLocal#isSet)
+      throw new _in::LateError::localAI("lateLocal");
+    else {
+      #lateLocal#isSet = true;
+      return #lateLocal = #t1;
+    }
+  self::throws(() → core::int? => #lateLocal#get(){() → core::int?}, "Read value from uninitialized lateLocal");
+  if(1 =={core::num::==}{(core::Object) → core::bool} 1) {
+    self::expect(123, #lateLocal#set(123){(core::int?) → dynamic});
+  }
+  self::expect(123, #lateLocal#get(){() → core::int?});
+  self::throws(() → core::int => #lateLocal#set(124){(core::int?) → dynamic}, "Write value to initialized lateLocal");
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
+    lowered final T? #lateGenericLocal;
+    lowered core::bool #lateGenericLocal#isSet = false;
+    function #lateGenericLocal#get() → T?
+      return #lateGenericLocal#isSet ?{T?} #lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
+    function #lateGenericLocal#set(T? #t2) → dynamic
+      if(#lateGenericLocal#isSet)
+        throw new _in::LateError::localAI("lateGenericLocal");
+      else {
+        #lateGenericLocal#isSet = true;
+        return #lateGenericLocal = #t2;
+      }
+    self::throws(() → T? => #lateGenericLocal#get(){() → T?}, "Read value from uninitialized lateGenericLocal");
+    if(1 =={core::num::==}{(core::Object) → core::bool} 1) {
+      self::expect(value, #lateGenericLocal#set(value){(T?) → dynamic});
+    }
+    self::expect(value, #lateGenericLocal#get(){() → T?});
+    self::throws(() → T? => #lateGenericLocal#set(value){(T?) → dynamic}, "Write value to initialized lateGenericLocal");
+  }
+  local<core::int?>(null){(core::int?) → Null};
+  local<core::int?>(0){(core::int?) → Null};
+  local<core::int>(null){(core::int?) → Null};
+  local<core::int>(0){(core::int?) → Null};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.modular.expect
new file mode 100644
index 0000000..b358ead
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_future_or.dart.weak.modular.expect
@@ -0,0 +1,185 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+import "dart:async";
+
+class C<T extends core::Object? = dynamic> extends core::Object {
+  field FutureOr<dynamic>? _#C#field1 = null;
+  field core::bool _#C#field1#isSet = false;
+  field FutureOr<dynamic>? _#C#field2 = null;
+  field core::bool _#C#field2#isSet = false;
+  covariant-by-class field FutureOr<self::C::T%>? _#C#field3 = null;
+  field core::bool _#C#field3#isSet = false;
+  covariant-by-class field FutureOr<self::C::T?>? _#C#field4 = null;
+  field core::bool _#C#field4#isSet = false;
+  covariant-by-class field FutureOr<self::C::T?>? _#C#field5 = null;
+  field core::bool _#C#field5#isSet = false;
+  synthetic constructor •() → self::C<self::C::T%>
+    : super core::Object::•()
+    ;
+  get field1() → FutureOr<dynamic>
+    return this.{self::C::_#C#field1#isSet}{core::bool} ?{FutureOr<dynamic>} this.{self::C::_#C#field1}{FutureOr<dynamic>?} : throw new _in::LateError::fieldNI("field1");
+  set field1(FutureOr<dynamic>#t1) → void {
+    this.{self::C::_#C#field1#isSet} = true;
+    this.{self::C::_#C#field1} = #t1;
+  }
+  get field2() → FutureOr<dynamic>?
+    return this.{self::C::_#C#field2#isSet}{core::bool} ?{FutureOr<dynamic>?} this.{self::C::_#C#field2}{FutureOr<dynamic>?} : throw new _in::LateError::fieldNI("field2");
+  set field2(FutureOr<dynamic>? #t2) → void {
+    this.{self::C::_#C#field2#isSet} = true;
+    this.{self::C::_#C#field2} = #t2;
+  }
+  get field3() → FutureOr<self::C::T%>
+    return this.{self::C::_#C#field3#isSet}{core::bool} ?{FutureOr<self::C::T%>} let final FutureOr<self::C::T%>? #t3 = this.{self::C::_#C#field3}{FutureOr<self::C::T%>?} in #t3{FutureOr<self::C::T%>} : throw new _in::LateError::fieldNI("field3");
+  set field3(covariant-by-class FutureOr<self::C::T%>#t4) → void {
+    this.{self::C::_#C#field3#isSet} = true;
+    this.{self::C::_#C#field3} = #t4;
+  }
+  get field4() → FutureOr<self::C::T?>
+    return this.{self::C::_#C#field4#isSet}{core::bool} ?{FutureOr<self::C::T?>} this.{self::C::_#C#field4}{FutureOr<self::C::T?>?} : throw new _in::LateError::fieldNI("field4");
+  set field4(covariant-by-class FutureOr<self::C::T?>#t5) → void {
+    this.{self::C::_#C#field4#isSet} = true;
+    this.{self::C::_#C#field4} = #t5;
+  }
+  get field5() → FutureOr<self::C::T?>?
+    return this.{self::C::_#C#field5#isSet}{core::bool} ?{FutureOr<self::C::T?>?} this.{self::C::_#C#field5}{FutureOr<self::C::T?>?} : throw new _in::LateError::fieldNI("field5");
+  set field5(covariant-by-class FutureOr<self::C::T?>? #t6) → void {
+    this.{self::C::_#C#field5#isSet} = true;
+    this.{self::C::_#C#field5} = #t6;
+  }
+  method method() → dynamic {
+    lowered FutureOr<dynamic>? #local1;
+    lowered core::bool #local1#isSet = false;
+    function #local1#get() → FutureOr<dynamic>
+      return #local1#isSet ?{FutureOr<dynamic>} #local1 : throw new _in::LateError::localNI("local1");
+    function #local1#set(FutureOr<dynamic>#t7) → dynamic {
+      #local1#isSet = true;
+      return #local1 = #t7;
+    }
+    lowered FutureOr<dynamic>? #local2;
+    lowered core::bool #local2#isSet = false;
+    function #local2#get() → FutureOr<dynamic>?
+      return #local2#isSet ?{FutureOr<dynamic>?} #local2 : throw new _in::LateError::localNI("local2");
+    function #local2#set(FutureOr<dynamic>? #t8) → dynamic {
+      #local2#isSet = true;
+      return #local2 = #t8;
+    }
+    lowered FutureOr<self::C::T%>? #local3;
+    lowered core::bool #local3#isSet = false;
+    function #local3#get() → FutureOr<self::C::T%>
+      return #local3#isSet ?{FutureOr<self::C::T%>} #local3{FutureOr<self::C::T%>} : throw new _in::LateError::localNI("local3");
+    function #local3#set(FutureOr<self::C::T%>#t9) → dynamic {
+      #local3#isSet = true;
+      return #local3 = #t9;
+    }
+    lowered FutureOr<self::C::T?>? #local4;
+    lowered core::bool #local4#isSet = false;
+    function #local4#get() → FutureOr<self::C::T?>
+      return #local4#isSet ?{FutureOr<self::C::T?>} #local4 : throw new _in::LateError::localNI("local4");
+    function #local4#set(FutureOr<self::C::T?>#t10) → dynamic {
+      #local4#isSet = true;
+      return #local4 = #t10;
+    }
+    lowered FutureOr<self::C::T?>? #local5;
+    lowered core::bool #local5#isSet = false;
+    function #local5#get() → FutureOr<self::C::T?>?
+      return #local5#isSet ?{FutureOr<self::C::T?>?} #local5 : throw new _in::LateError::localNI("local5");
+    function #local5#set(FutureOr<self::C::T?>? #t11) → dynamic {
+      #local5#isSet = true;
+      return #local5 = #t11;
+    }
+  }
+}
+static field FutureOr<dynamic>? _#field1 = null;
+static field core::bool _#field1#isSet = false;
+static field FutureOr<dynamic>? _#field2 = null;
+static field core::bool _#field2#isSet = false;
+static field FutureOr<dynamic>? _#field3 = null;
+static field core::bool _#field3#isSet = false;
+static field FutureOr<core::int>? _#field4 = null;
+static field core::bool _#field4#isSet = false;
+static field FutureOr<core::int?>? _#field5 = null;
+static field core::bool _#field5#isSet = false;
+static field FutureOr<core::int?>? _#field6 = null;
+static field core::bool _#field6#isSet = false;
+static method method1() → FutureOr<dynamic>
+  return null;
+static method method2() → FutureOr<dynamic>?
+  return null;
+static method method3() → FutureOr<dynamic>
+  return null;
+static method method4() → FutureOr<core::int>
+  return 0;
+static method method5() → FutureOr<core::int?>
+  return null;
+static method method6() → FutureOr<core::int?>?
+  return null;
+static get field1() → FutureOr<dynamic> {
+  if(!self::_#field1#isSet) {
+    self::_#field1 = self::method1();
+    self::_#field1#isSet = true;
+  }
+  return self::_#field1;
+}
+static set field1(FutureOr<dynamic>#t12) → void {
+  self::_#field1#isSet = true;
+  self::_#field1 = #t12;
+}
+static get field2() → FutureOr<dynamic>? {
+  if(!self::_#field2#isSet) {
+    self::_#field2 = self::method2();
+    self::_#field2#isSet = true;
+  }
+  return self::_#field2;
+}
+static set field2(FutureOr<dynamic>? #t13) → void {
+  self::_#field2#isSet = true;
+  self::_#field2 = #t13;
+}
+static get field3() → FutureOr<dynamic> {
+  if(!self::_#field3#isSet) {
+    self::_#field3 = self::method3();
+    self::_#field3#isSet = true;
+  }
+  return self::_#field3;
+}
+static set field3(FutureOr<dynamic>#t14) → void {
+  self::_#field3#isSet = true;
+  self::_#field3 = #t14;
+}
+static get field4() → FutureOr<core::int> {
+  if(!self::_#field4#isSet) {
+    self::_#field4 = self::method4();
+    self::_#field4#isSet = true;
+  }
+  return let final FutureOr<core::int>? #t15 = self::_#field4 in #t15{FutureOr<core::int>};
+}
+static set field4(FutureOr<core::int>#t16) → void {
+  self::_#field4#isSet = true;
+  self::_#field4 = #t16;
+}
+static get field5() → FutureOr<core::int?> {
+  if(!self::_#field5#isSet) {
+    self::_#field5 = self::method5();
+    self::_#field5#isSet = true;
+  }
+  return self::_#field5;
+}
+static set field5(FutureOr<core::int?>#t17) → void {
+  self::_#field5#isSet = true;
+  self::_#field5 = #t17;
+}
+static get field6() → FutureOr<core::int?>? {
+  if(!self::_#field6#isSet) {
+    self::_#field6 = self::method6();
+    self::_#field6#isSet = true;
+  }
+  return self::_#field6;
+}
+static set field6(FutureOr<core::int?>? #t18) → void {
+  self::_#field6#isSet = true;
+  self::_#field6 = #t18;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..caa8e52
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  lowered core::int? #lateLocal;
+  lowered core::bool #lateLocal#isSet = false;
+  function #lateLocal#get() → core::int {
+    if(!#lateLocal#isSet) {
+      #lateLocal = 123;
+      #lateLocal#isSet = true;
+    }
+    return #lateLocal{core::int};
+  }
+  function #lateLocal#set(core::int #t1) → dynamic {
+    #lateLocal#isSet = true;
+    return #lateLocal = #t1;
+  }
+  self::expect(123, #lateLocal#get(){() → core::int});
+  self::expect(124, #lateLocal#set(124){(core::int) → dynamic});
+  self::expect(124, #lateLocal#get(){() → core::int});
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
+    lowered T? #lateGenericLocal;
+    lowered core::bool #lateGenericLocal#isSet = false;
+    function #lateGenericLocal#get() → T% {
+      if(!#lateGenericLocal#isSet) {
+        #lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
+      }
+      return #lateGenericLocal{T%};
+    }
+    function #lateGenericLocal#set(T% #t2) → dynamic {
+      #lateGenericLocal#isSet = true;
+      return #lateGenericLocal = #t2;
+    }
+    self::expect(value1, #lateGenericLocal#get(){() → T%});
+    self::expect(value2, #lateGenericLocal#set(value2){(T%) → dynamic});
+    self::expect(value2, #lateGenericLocal#get(){() → T%});
+  }
+  local<core::int?>(null, 0){(core::int?, core::int?) → Null};
+  local<core::int?>(0, null){(core::int?, core::int?) → Null};
+  local<core::int>(0, 42){(core::int, core::int) → Null};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..c6c3b91
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+  lowered core::int? #lateLocal;
+  lowered core::bool #lateLocal#isSet = false;
+  function #lateLocal#get() → core::int
+    return #lateLocal#isSet ?{core::int} #lateLocal{core::int} : throw new _in::LateError::localNI("lateLocal");
+  function #lateLocal#set(core::int #t1) → dynamic {
+    #lateLocal#isSet = true;
+    return #lateLocal = #t1;
+  }
+  self::throws(() → core::int => #lateLocal#get(){() → core::int}, "Read value from uninitialized lateLocal");
+  self::expect(123, #lateLocal#set(123){(core::int) → dynamic});
+  self::expect(123, #lateLocal#get(){() → core::int});
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
+    lowered T? #lateGenericLocal;
+    lowered core::bool #lateGenericLocal#isSet = false;
+    function #lateGenericLocal#get() → T%
+      return #lateGenericLocal#isSet ?{T%} #lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
+    function #lateGenericLocal#set(T% #t2) → dynamic {
+      #lateGenericLocal#isSet = true;
+      return #lateGenericLocal = #t2;
+    }
+    self::throws(() → T% => #lateGenericLocal#get(){() → T%}, "Read value from uninitialized lateGenericLocal");
+    self::expect(value, #lateGenericLocal#set(value){(T%) → dynamic});
+    self::expect(value, #lateGenericLocal#get(){() → T%});
+  }
+  local<core::int?>(null){(core::int?) → Null};
+  local<core::int?>(0){(core::int?) → Null};
+  local<core::int>(0){(core::int) → Null};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_lowering_bitmasks.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_lowering_bitmasks.dart.weak.modular.expect
new file mode 100644
index 0000000..4c7909a
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_lowering_bitmasks.dart.weak.modular.expect
@@ -0,0 +1,233 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  static field core::int? _#uninitializedNonFinalStaticField = null;
+  static field core::bool _#uninitializedNonFinalStaticField#isSet = false;
+  static field core::int? _#uninitializedFinalStaticField = null;
+  static field core::bool _#uninitializedFinalStaticField#isSet = false;
+  static field core::int? _#initializedNonFinalStaticField = null;
+  static field core::bool _#initializedNonFinalStaticField#isSet = false;
+  static field core::int? _#initializedFinalStaticField = null;
+  static field core::bool _#initializedFinalStaticField#isSet = false;
+  field core::int? _#Class#uninitializedNonFinalInstanceField = null;
+  field core::bool _#Class#uninitializedNonFinalInstanceField#isSet = false;
+  field core::int? _#Class#uninitializedFinalInstanceField = null;
+  field core::bool _#Class#uninitializedFinalInstanceField#isSet = false;
+  field core::int? _#Class#initializedNonFinalInstanceField = null;
+  field core::bool _#Class#initializedNonFinalInstanceField#isSet = false;
+  field core::int? _#Class#initializedFinalInstanceField = null;
+  field core::bool _#Class#initializedFinalInstanceField#isSet = false;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static get uninitializedNonFinalStaticField() → core::int
+    return self::Class::_#uninitializedNonFinalStaticField#isSet ?{core::int} let final core::int? #t1 = self::Class::_#uninitializedNonFinalStaticField in #t1{core::int} : throw new _in::LateError::fieldNI("uninitializedNonFinalStaticField");
+  static set uninitializedNonFinalStaticField(core::int #t2) → void {
+    self::Class::_#uninitializedNonFinalStaticField#isSet = true;
+    self::Class::_#uninitializedNonFinalStaticField = #t2;
+  }
+  static get uninitializedFinalStaticField() → core::int
+    return self::Class::_#uninitializedFinalStaticField#isSet ?{core::int} let final core::int? #t3 = self::Class::_#uninitializedFinalStaticField in #t3{core::int} : throw new _in::LateError::fieldNI("uninitializedFinalStaticField");
+  static set uninitializedFinalStaticField(core::int #t4) → void
+    if(self::Class::_#uninitializedFinalStaticField#isSet)
+      throw new _in::LateError::fieldAI("uninitializedFinalStaticField");
+    else {
+      self::Class::_#uninitializedFinalStaticField#isSet = true;
+      self::Class::_#uninitializedFinalStaticField = #t4;
+    }
+  static get initializedNonFinalStaticField() → core::int {
+    if(!self::Class::_#initializedNonFinalStaticField#isSet) {
+      self::Class::_#initializedNonFinalStaticField = 0;
+      self::Class::_#initializedNonFinalStaticField#isSet = true;
+    }
+    return let final core::int? #t5 = self::Class::_#initializedNonFinalStaticField in #t5{core::int};
+  }
+  static set initializedNonFinalStaticField(core::int #t6) → void {
+    self::Class::_#initializedNonFinalStaticField#isSet = true;
+    self::Class::_#initializedNonFinalStaticField = #t6;
+  }
+  static get initializedFinalStaticField() → core::int {
+    if(!self::Class::_#initializedFinalStaticField#isSet) {
+      final core::int #t7 = 0;
+      if(self::Class::_#initializedFinalStaticField#isSet)
+        throw new _in::LateError::fieldADI("initializedFinalStaticField");
+      self::Class::_#initializedFinalStaticField = #t7;
+      self::Class::_#initializedFinalStaticField#isSet = true;
+    }
+    return let final core::int? #t8 = self::Class::_#initializedFinalStaticField in #t8{core::int};
+  }
+  get uninitializedNonFinalInstanceField() → core::int
+    return this.{self::Class::_#Class#uninitializedNonFinalInstanceField#isSet}{core::bool} ?{core::int} let final core::int? #t9 = this.{self::Class::_#Class#uninitializedNonFinalInstanceField}{core::int?} in #t9{core::int} : throw new _in::LateError::fieldNI("uninitializedNonFinalInstanceField");
+  set uninitializedNonFinalInstanceField(core::int #t10) → void {
+    this.{self::Class::_#Class#uninitializedNonFinalInstanceField#isSet} = true;
+    this.{self::Class::_#Class#uninitializedNonFinalInstanceField} = #t10;
+  }
+  get uninitializedFinalInstanceField() → core::int
+    return this.{self::Class::_#Class#uninitializedFinalInstanceField#isSet}{core::bool} ?{core::int} let final core::int? #t11 = this.{self::Class::_#Class#uninitializedFinalInstanceField}{core::int?} in #t11{core::int} : throw new _in::LateError::fieldNI("uninitializedFinalInstanceField");
+  set uninitializedFinalInstanceField(core::int #t12) → void
+    if(this.{self::Class::_#Class#uninitializedFinalInstanceField#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("uninitializedFinalInstanceField");
+    else {
+      this.{self::Class::_#Class#uninitializedFinalInstanceField#isSet} = true;
+      this.{self::Class::_#Class#uninitializedFinalInstanceField} = #t12;
+    }
+  get initializedNonFinalInstanceField() → core::int {
+    if(!this.{self::Class::_#Class#initializedNonFinalInstanceField#isSet}{core::bool}) {
+      this.{self::Class::_#Class#initializedNonFinalInstanceField} = 0;
+      this.{self::Class::_#Class#initializedNonFinalInstanceField#isSet} = true;
+    }
+    return let final core::int? #t13 = this.{self::Class::_#Class#initializedNonFinalInstanceField}{core::int?} in #t13{core::int};
+  }
+  set initializedNonFinalInstanceField(core::int #t14) → void {
+    this.{self::Class::_#Class#initializedNonFinalInstanceField#isSet} = true;
+    this.{self::Class::_#Class#initializedNonFinalInstanceField} = #t14;
+  }
+  get initializedFinalInstanceField() → core::int {
+    if(!this.{self::Class::_#Class#initializedFinalInstanceField#isSet}{core::bool}) {
+      final core::int #t15 = 0;
+      if(this.{self::Class::_#Class#initializedFinalInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("initializedFinalInstanceField");
+      this.{self::Class::_#Class#initializedFinalInstanceField} = #t15;
+      this.{self::Class::_#Class#initializedFinalInstanceField#isSet} = true;
+    }
+    return let final core::int? #t16 = this.{self::Class::_#Class#initializedFinalInstanceField}{core::int?} in #t16{core::int};
+  }
+}
+static field core::int? _#uninitializedNonFinalTopLevelField = null;
+static field core::bool _#uninitializedNonFinalTopLevelField#isSet = false;
+static field core::int? _#uninitializedFinalTopLevelField = null;
+static field core::bool _#uninitializedFinalTopLevelField#isSet = false;
+static field core::int? _#initializedNonFinalTopLevelField = null;
+static field core::bool _#initializedNonFinalTopLevelField#isSet = false;
+static field core::int? _#initializedFinalTopLevelField = null;
+static field core::bool _#initializedFinalTopLevelField#isSet = false;
+static method main() → dynamic {}
+static method method() → dynamic {
+  lowered core::int? #nullableUninitializedNonFinalLocal;
+  lowered core::bool #nullableUninitializedNonFinalLocal#isSet = false;
+  function #nullableUninitializedNonFinalLocal#get() → core::int?
+    return #nullableUninitializedNonFinalLocal#isSet ?{core::int?} #nullableUninitializedNonFinalLocal : throw new _in::LateError::localNI("nullableUninitializedNonFinalLocal");
+  function #nullableUninitializedNonFinalLocal#set(core::int? #t17) → dynamic {
+    #nullableUninitializedNonFinalLocal#isSet = true;
+    return #nullableUninitializedNonFinalLocal = #t17;
+  }
+  lowered core::int? #nonNullableUninitializedNonFinalLocal;
+  lowered core::bool #nonNullableUninitializedNonFinalLocal#isSet = false;
+  function #nonNullableUninitializedNonFinalLocal#get() → core::int
+    return #nonNullableUninitializedNonFinalLocal#isSet ?{core::int} #nonNullableUninitializedNonFinalLocal{core::int} : throw new _in::LateError::localNI("nonNullableUninitializedNonFinalLocal");
+  function #nonNullableUninitializedNonFinalLocal#set(core::int #t18) → dynamic {
+    #nonNullableUninitializedNonFinalLocal#isSet = true;
+    return #nonNullableUninitializedNonFinalLocal = #t18;
+  }
+  lowered final core::int? #nullableUninitializedFinalLocal;
+  lowered core::bool #nullableUninitializedFinalLocal#isSet = false;
+  function #nullableUninitializedFinalLocal#get() → core::int?
+    return #nullableUninitializedFinalLocal#isSet ?{core::int?} #nullableUninitializedFinalLocal : throw new _in::LateError::localNI("nullableUninitializedFinalLocal");
+  function #nullableUninitializedFinalLocal#set(core::int? #t19) → dynamic
+    if(#nullableUninitializedFinalLocal#isSet)
+      throw new _in::LateError::localAI("nullableUninitializedFinalLocal");
+    else {
+      #nullableUninitializedFinalLocal#isSet = true;
+      return #nullableUninitializedFinalLocal = #t19;
+    }
+  lowered final core::int? #nonNullableUninitializedFinalLocal;
+  lowered core::bool #nonNullableUninitializedFinalLocal#isSet = false;
+  function #nonNullableUninitializedFinalLocal#get() → core::int
+    return #nonNullableUninitializedFinalLocal#isSet ?{core::int} #nonNullableUninitializedFinalLocal{core::int} : throw new _in::LateError::localNI("nonNullableUninitializedFinalLocal");
+  function #nonNullableUninitializedFinalLocal#set(core::int #t20) → dynamic
+    if(#nonNullableUninitializedFinalLocal#isSet)
+      throw new _in::LateError::localAI("nonNullableUninitializedFinalLocal");
+    else {
+      #nonNullableUninitializedFinalLocal#isSet = true;
+      return #nonNullableUninitializedFinalLocal = #t20;
+    }
+  lowered core::int? #nullableInitializedNonFinalLocal;
+  lowered core::bool #nullableInitializedNonFinalLocal#isSet = false;
+  function #nullableInitializedNonFinalLocal#get() → core::int? {
+    if(!#nullableInitializedNonFinalLocal#isSet) {
+      #nullableInitializedNonFinalLocal = 0;
+      #nullableInitializedNonFinalLocal#isSet = true;
+    }
+    return #nullableInitializedNonFinalLocal;
+  }
+  function #nullableInitializedNonFinalLocal#set(core::int? #t21) → dynamic {
+    #nullableInitializedNonFinalLocal#isSet = true;
+    return #nullableInitializedNonFinalLocal = #t21;
+  }
+  lowered core::int? #nonNullableInitializedNonFinalLocal;
+  lowered core::bool #nonNullableInitializedNonFinalLocal#isSet = false;
+  function #nonNullableInitializedNonFinalLocal#get() → core::int {
+    if(!#nonNullableInitializedNonFinalLocal#isSet) {
+      #nonNullableInitializedNonFinalLocal = 0;
+      #nonNullableInitializedNonFinalLocal#isSet = true;
+    }
+    return #nonNullableInitializedNonFinalLocal{core::int};
+  }
+  function #nonNullableInitializedNonFinalLocal#set(core::int #t22) → dynamic {
+    #nonNullableInitializedNonFinalLocal#isSet = true;
+    return #nonNullableInitializedNonFinalLocal = #t22;
+  }
+  lowered final core::int? #nullableInitializedFinalLocal;
+  lowered core::bool #nullableInitializedFinalLocal#isSet = false;
+  function #nullableInitializedFinalLocal#get() → core::int? {
+    if(!#nullableInitializedFinalLocal#isSet) {
+      final core::int? #t23 = 0;
+      if(#nullableInitializedFinalLocal#isSet)
+        throw new _in::LateError::localADI("nullableInitializedFinalLocal");
+      #nullableInitializedFinalLocal = #t23;
+      #nullableInitializedFinalLocal#isSet = true;
+    }
+    return #nullableInitializedFinalLocal;
+  }
+  lowered final core::int? #nonNullableInitializedFinalLocal;
+  lowered core::bool #nonNullableInitializedFinalLocal#isSet = false;
+  function #nonNullableInitializedFinalLocal#get() → core::int {
+    if(!#nonNullableInitializedFinalLocal#isSet) {
+      final core::int #t24 = 0;
+      if(#nonNullableInitializedFinalLocal#isSet)
+        throw new _in::LateError::localADI("nonNullableInitializedFinalLocal");
+      #nonNullableInitializedFinalLocal = #t24;
+      #nonNullableInitializedFinalLocal#isSet = true;
+    }
+    return #nonNullableInitializedFinalLocal{core::int};
+  }
+}
+static get uninitializedNonFinalTopLevelField() → core::int
+  return self::_#uninitializedNonFinalTopLevelField#isSet ?{core::int} let final core::int? #t25 = self::_#uninitializedNonFinalTopLevelField in #t25{core::int} : throw new _in::LateError::fieldNI("uninitializedNonFinalTopLevelField");
+static set uninitializedNonFinalTopLevelField(core::int #t26) → void {
+  self::_#uninitializedNonFinalTopLevelField#isSet = true;
+  self::_#uninitializedNonFinalTopLevelField = #t26;
+}
+static get uninitializedFinalTopLevelField() → core::int
+  return self::_#uninitializedFinalTopLevelField#isSet ?{core::int} let final core::int? #t27 = self::_#uninitializedFinalTopLevelField in #t27{core::int} : throw new _in::LateError::fieldNI("uninitializedFinalTopLevelField");
+static set uninitializedFinalTopLevelField(core::int #t28) → void
+  if(self::_#uninitializedFinalTopLevelField#isSet)
+    throw new _in::LateError::fieldAI("uninitializedFinalTopLevelField");
+  else {
+    self::_#uninitializedFinalTopLevelField#isSet = true;
+    self::_#uninitializedFinalTopLevelField = #t28;
+  }
+static get initializedNonFinalTopLevelField() → core::int {
+  if(!self::_#initializedNonFinalTopLevelField#isSet) {
+    self::_#initializedNonFinalTopLevelField = 0;
+    self::_#initializedNonFinalTopLevelField#isSet = true;
+  }
+  return let final core::int? #t29 = self::_#initializedNonFinalTopLevelField in #t29{core::int};
+}
+static set initializedNonFinalTopLevelField(core::int #t30) → void {
+  self::_#initializedNonFinalTopLevelField#isSet = true;
+  self::_#initializedNonFinalTopLevelField = #t30;
+}
+static get initializedFinalTopLevelField() → core::int {
+  if(!self::_#initializedFinalTopLevelField#isSet) {
+    final core::int #t31 = 0;
+    if(self::_#initializedFinalTopLevelField#isSet)
+      throw new _in::LateError::fieldADI("initializedFinalTopLevelField");
+    self::_#initializedFinalTopLevelField = #t31;
+    self::_#initializedFinalTopLevelField#isSet = true;
+  }
+  return let final core::int? #t32 = self::_#initializedFinalTopLevelField in #t32{core::int};
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..a743497
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,167 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static field core::int? _#lateStaticField1 = null;
+  static field core::bool _#lateStaticField1#isSet = false;
+  static field core::int? _#lateStaticField2 = null;
+  static field core::bool _#lateStaticField2#isSet = false;
+  field core::int? _#Class#lateInstanceField = null;
+  field core::bool _#Class#lateInstanceField#isSet = false;
+  final field self::Class::T? field;
+  covariant-by-class field self::Class::T? _#Class#lateGenericInstanceField = null;
+  field core::bool _#Class#lateGenericInstanceField#isSet = false;
+  constructor •(self::Class::T? field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  static method lateStaticField1Init() → core::int?
+    return 87;
+  static get lateStaticField1() → core::int? {
+    if(!self::Class::_#lateStaticField1#isSet) {
+      self::Class::_#lateStaticField1 = self::Class::lateStaticField1Init();
+      self::Class::_#lateStaticField1#isSet = true;
+    }
+    return self::Class::_#lateStaticField1;
+  }
+  static set lateStaticField1(core::int? #t1) → void {
+    self::Class::_#lateStaticField1#isSet = true;
+    self::Class::_#lateStaticField1 = #t1;
+  }
+  static method lateStaticField2Init() → core::int?
+    return 42;
+  static get lateStaticField2() → core::int? {
+    if(!self::Class::_#lateStaticField2#isSet) {
+      self::Class::_#lateStaticField2 = self::Class::lateStaticField2Init();
+      self::Class::_#lateStaticField2#isSet = true;
+    }
+    return self::Class::_#lateStaticField2;
+  }
+  static set lateStaticField2(core::int? #t2) → void {
+    self::Class::_#lateStaticField2#isSet = true;
+    self::Class::_#lateStaticField2 = #t2;
+  }
+  static method staticMethod() → dynamic {
+    self::expect(42, self::Class::lateStaticField2);
+    self::Class::lateStaticField2 = 43;
+    self::expect(43, self::Class::lateStaticField2);
+  }
+  method lateInstanceFieldInit() → core::int?
+    return 16;
+  get lateInstanceField() → core::int? {
+    if(!this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool}) {
+      this.{self::Class::_#Class#lateInstanceField} = this.{self::Class::lateInstanceFieldInit}(){() → core::int?};
+      this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+    }
+    return this.{self::Class::_#Class#lateInstanceField}{core::int?};
+  }
+  set lateInstanceField(core::int? #t3) → void {
+    this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+    this.{self::Class::_#Class#lateInstanceField} = #t3;
+  }
+  method lateGenericInstanceFieldInit() → self::Class::T?
+    return this.{self::Class::field}{self::Class::T?};
+  get lateGenericInstanceField() → self::Class::T? {
+    if(!this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool}) {
+      this.{self::Class::_#Class#lateGenericInstanceField} = this.{self::Class::lateGenericInstanceFieldInit}(){() → self::Class::T?};
+      this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
+    }
+    return this.{self::Class::_#Class#lateGenericInstanceField}{self::Class::T?};
+  }
+  set lateGenericInstanceField(covariant-by-class self::Class::T? #t4) → void {
+    this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
+    this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
+  }
+  method instanceMethod(covariant-by-class self::Class::T? value) → dynamic {
+    self::expect(16, this.{self::Class::lateInstanceField}{core::int?});
+    this.{self::Class::lateInstanceField} = 17;
+    self::expect(17, this.{self::Class::lateInstanceField}{core::int?});
+    self::expect(this.{self::Class::field}{self::Class::T?}, this.{self::Class::lateGenericInstanceField}{self::Class::T?});
+    this.{self::Class::lateGenericInstanceField} = value;
+    self::expect(value, this.{self::Class::lateGenericInstanceField}{self::Class::T?});
+  }
+}
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
+  static method lateExtensionField1Init = self::Extension|lateExtensionField1Init;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
+  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
+  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
+  static method lateExtensionField2Init = self::Extension|lateExtensionField2Init;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
+  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
+  static set lateExtensionField2 = set self::Extension|lateExtensionField2;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static field core::int? _#lateTopLevelField1 = null;
+static field core::bool _#lateTopLevelField1#isSet = false;
+static field core::int? _#Extension|lateExtensionField1 = null;
+static field core::bool _#Extension|lateExtensionField1#isSet = false;
+static field core::int? _#Extension|lateExtensionField2 = null;
+static field core::bool _#Extension|lateExtensionField2#isSet = false;
+static method lateTopLevelField1Init() → core::int?
+  return 123;
+static get lateTopLevelField1() → core::int? {
+  if(!self::_#lateTopLevelField1#isSet) {
+    self::_#lateTopLevelField1 = self::lateTopLevelField1Init();
+    self::_#lateTopLevelField1#isSet = true;
+  }
+  return self::_#lateTopLevelField1;
+}
+static set lateTopLevelField1(core::int? #t5) → void {
+  self::_#lateTopLevelField1#isSet = true;
+  self::_#lateTopLevelField1 = #t5;
+}
+static method Extension|lateExtensionField1Init() → core::int?
+  return 87;
+static get Extension|lateExtensionField1() → core::int? {
+  if(!self::_#Extension|lateExtensionField1#isSet) {
+    self::_#Extension|lateExtensionField1 = self::Extension|lateExtensionField1Init();
+    self::_#Extension|lateExtensionField1#isSet = true;
+  }
+  return self::_#Extension|lateExtensionField1;
+}
+static set Extension|lateExtensionField1(core::int? #t6) → void {
+  self::_#Extension|lateExtensionField1#isSet = true;
+  self::_#Extension|lateExtensionField1 = #t6;
+}
+static method Extension|lateExtensionField2Init() → core::int?
+  return 42;
+static get Extension|lateExtensionField2() → core::int? {
+  if(!self::_#Extension|lateExtensionField2#isSet) {
+    self::_#Extension|lateExtensionField2 = self::Extension|lateExtensionField2Init();
+    self::_#Extension|lateExtensionField2#isSet = true;
+  }
+  return self::_#Extension|lateExtensionField2;
+}
+static set Extension|lateExtensionField2(core::int? #t7) → void {
+  self::_#Extension|lateExtensionField2#isSet = true;
+  self::_#Extension|lateExtensionField2 = #t7;
+}
+static method Extension|staticMethod() → dynamic {
+  self::expect(42, self::Extension|lateExtensionField2);
+  self::Extension|lateExtensionField2 = 43;
+  self::expect(43, self::Extension|lateExtensionField2);
+}
+static method main() → dynamic {
+  self::expect(123, self::lateTopLevelField1);
+  self::lateTopLevelField1 = 124;
+  self::expect(124, self::lateTopLevelField1);
+  self::expect(87, self::Class::lateStaticField1);
+  self::Class::lateStaticField1 = 88;
+  self::expect(88, self::Class::lateStaticField1);
+  self::Class::staticMethod();
+  new self::Class::•<core::int?>(null).{self::Class::instanceMethod}(0){(core::int?) → dynamic};
+  new self::Class::•<core::int?>(0).{self::Class::instanceMethod}(null){(core::int?) → dynamic};
+  new self::Class::•<core::int>(null).{self::Class::instanceMethod}(0){(core::int?) → dynamic};
+  new self::Class::•<core::int>(0).{self::Class::instanceMethod}(null){(core::int?) → dynamic};
+  self::expect(87, self::Extension|lateExtensionField1);
+  self::Extension|lateExtensionField1 = 88;
+  self::expect(88, self::Extension|lateExtensionField1);
+  self::Extension|staticMethod();
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..91ed9ea
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_field_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,127 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  static field core::int? _#lateStaticField1 = null;
+  static field core::bool _#lateStaticField1#isSet = false;
+  static field core::int? _#lateStaticField2 = null;
+  static field core::bool _#lateStaticField2#isSet = false;
+  field core::int? _#Class#lateInstanceField = null;
+  field core::bool _#Class#lateInstanceField#isSet = false;
+  covariant-by-class field self::Class::T? _#Class#lateGenericInstanceField = null;
+  field core::bool _#Class#lateGenericInstanceField#isSet = false;
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  static get lateStaticField1() → core::int?
+    return self::Class::_#lateStaticField1#isSet ?{core::int?} self::Class::_#lateStaticField1 : throw new _in::LateError::fieldNI("lateStaticField1");
+  static set lateStaticField1(core::int? #t1) → void {
+    self::Class::_#lateStaticField1#isSet = true;
+    self::Class::_#lateStaticField1 = #t1;
+  }
+  static get lateStaticField2() → core::int?
+    return self::Class::_#lateStaticField2#isSet ?{core::int?} self::Class::_#lateStaticField2 : throw new _in::LateError::fieldNI("lateStaticField2");
+  static set lateStaticField2(core::int? #t2) → void {
+    self::Class::_#lateStaticField2#isSet = true;
+    self::Class::_#lateStaticField2 = #t2;
+  }
+  static method staticMethod() → dynamic {
+    self::throws(() → core::int? => self::Class::lateStaticField2, "Read value from uninitialized Class.lateStaticField2");
+    self::Class::lateStaticField2 = 42;
+    self::expect(42, self::Class::lateStaticField2);
+  }
+  get lateInstanceField() → core::int?
+    return this.{self::Class::_#Class#lateInstanceField#isSet}{core::bool} ?{core::int?} this.{self::Class::_#Class#lateInstanceField}{core::int?} : throw new _in::LateError::fieldNI("lateInstanceField");
+  set lateInstanceField(core::int? #t3) → void {
+    this.{self::Class::_#Class#lateInstanceField#isSet} = true;
+    this.{self::Class::_#Class#lateInstanceField} = #t3;
+  }
+  get lateGenericInstanceField() → self::Class::T?
+    return this.{self::Class::_#Class#lateGenericInstanceField#isSet}{core::bool} ?{self::Class::T?} this.{self::Class::_#Class#lateGenericInstanceField}{self::Class::T?} : throw new _in::LateError::fieldNI("lateGenericInstanceField");
+  set lateGenericInstanceField(covariant-by-class self::Class::T? #t4) → void {
+    this.{self::Class::_#Class#lateGenericInstanceField#isSet} = true;
+    this.{self::Class::_#Class#lateGenericInstanceField} = #t4;
+  }
+  method instanceMethod(covariant-by-class self::Class::T? value) → dynamic {
+    self::throws(() → core::int? => this.{self::Class::lateInstanceField}{core::int?}, "Read value from uninitialized Class.lateInstanceField");
+    this.{self::Class::lateInstanceField} = 16;
+    self::expect(16, this.{self::Class::lateInstanceField}{core::int?});
+    self::throws(() → self::Class::T? => this.{self::Class::lateGenericInstanceField}{self::Class::T?}, "Read value from uninitialized Class.lateGenericInstanceField");
+    this.{self::Class::lateGenericInstanceField} = value;
+    self::expect(value, this.{self::Class::lateGenericInstanceField}{self::Class::T?});
+  }
+}
+extension Extension<T extends core::Object? = dynamic> on self::Class<T%> {
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1;
+  static field lateExtensionField1 = self::_#Extension|lateExtensionField1#isSet;
+  static get lateExtensionField1 = get self::Extension|lateExtensionField1;
+  static set lateExtensionField1 = set self::Extension|lateExtensionField1;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2;
+  static field lateExtensionField2 = self::_#Extension|lateExtensionField2#isSet;
+  static get lateExtensionField2 = get self::Extension|lateExtensionField2;
+  static set lateExtensionField2 = set self::Extension|lateExtensionField2;
+  static method staticMethod = self::Extension|staticMethod;
+}
+static field core::int? _#lateTopLevelField = null;
+static field core::bool _#lateTopLevelField#isSet = false;
+static field core::int? _#Extension|lateExtensionField1 = null;
+static field core::bool _#Extension|lateExtensionField1#isSet = false;
+static field core::int? _#Extension|lateExtensionField2 = null;
+static field core::bool _#Extension|lateExtensionField2#isSet = false;
+static get lateTopLevelField() → core::int?
+  return self::_#lateTopLevelField#isSet ?{core::int?} self::_#lateTopLevelField : throw new _in::LateError::fieldNI("lateTopLevelField");
+static set lateTopLevelField(core::int? #t5) → void {
+  self::_#lateTopLevelField#isSet = true;
+  self::_#lateTopLevelField = #t5;
+}
+static get Extension|lateExtensionField1() → core::int?
+  return self::_#Extension|lateExtensionField1#isSet ?{core::int?} self::_#Extension|lateExtensionField1 : throw new _in::LateError::fieldNI("lateExtensionField1");
+static set Extension|lateExtensionField1(core::int? #t6) → void {
+  self::_#Extension|lateExtensionField1#isSet = true;
+  self::_#Extension|lateExtensionField1 = #t6;
+}
+static get Extension|lateExtensionField2() → core::int?
+  return self::_#Extension|lateExtensionField2#isSet ?{core::int?} self::_#Extension|lateExtensionField2 : throw new _in::LateError::fieldNI("lateExtensionField2");
+static set Extension|lateExtensionField2(core::int? #t7) → void {
+  self::_#Extension|lateExtensionField2#isSet = true;
+  self::_#Extension|lateExtensionField2 = #t7;
+}
+static method Extension|staticMethod() → dynamic {
+  self::throws(() → core::int? => self::Extension|lateExtensionField2, "Read value from uninitialized Class.lateExtensionField2");
+  self::Extension|lateExtensionField2 = 42;
+  self::expect(42, self::Extension|lateExtensionField2);
+}
+static method main() → dynamic {
+  self::throws(() → core::int? => self::lateTopLevelField, "Read value from uninitialized lateTopLevelField");
+  self::lateTopLevelField = 123;
+  self::expect(123, self::lateTopLevelField);
+  self::throws(() → core::int? => self::Class::lateStaticField1, "Read value from uninitialized Class.lateStaticField1");
+  self::Class::lateStaticField1 = 87;
+  self::expect(87, self::Class::lateStaticField1);
+  self::Class::staticMethod();
+  self::throws(() → core::int? => self::Extension|lateExtensionField1, "Read value from uninitialized Extension.lateExtensionField1");
+  self::Extension|lateExtensionField1 = 87;
+  self::expect(87, self::Extension|lateExtensionField1);
+  self::Extension|staticMethod();
+  new self::Class::•<core::int?>().{self::Class::instanceMethod}(null){(core::int?) → dynamic};
+  new self::Class::•<core::int?>().{self::Class::instanceMethod}(0){(core::int?) → dynamic};
+  new self::Class::•<core::int>().{self::Class::instanceMethod}(null){(core::int?) → dynamic};
+  new self::Class::•<core::int>().{self::Class::instanceMethod}(0){(core::int?) → dynamic};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..a150002
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method lateLocalInit() → core::int?
+  return 123;
+static method main() → dynamic {
+  lowered core::int? #lateLocal;
+  lowered core::bool #lateLocal#isSet = false;
+  function #lateLocal#get() → core::int? {
+    if(!#lateLocal#isSet) {
+      #lateLocal = self::lateLocalInit();
+      #lateLocal#isSet = true;
+    }
+    return #lateLocal;
+  }
+  function #lateLocal#set(core::int? #t1) → dynamic {
+    #lateLocal#isSet = true;
+    return #lateLocal = #t1;
+  }
+  self::expect(123, #lateLocal#get(){() → core::int?});
+  self::expect(124, #lateLocal#set(124){(core::int?) → dynamic});
+  self::expect(124, #lateLocal#get(){() → core::int?});
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
+    lowered T? #lateGenericLocal;
+    lowered core::bool #lateGenericLocal#isSet = false;
+    function #lateGenericLocal#get() → T? {
+      if(!#lateGenericLocal#isSet) {
+        #lateGenericLocal = value1;
+        #lateGenericLocal#isSet = true;
+      }
+      return #lateGenericLocal;
+    }
+    function #lateGenericLocal#set(T? #t2) → dynamic {
+      #lateGenericLocal#isSet = true;
+      return #lateGenericLocal = #t2;
+    }
+    self::expect(value1, #lateGenericLocal#get(){() → T?});
+    self::expect(value2, #lateGenericLocal#set(value2){(T?) → dynamic});
+    self::expect(value2, #lateGenericLocal#get(){() → T?});
+  }
+  local<core::int?>(null, 0){(core::int?, core::int?) → Null};
+  local<core::int?>(0, null){(core::int?, core::int?) → Null};
+  local<core::int>(null, 0){(core::int?, core::int?) → Null};
+  local<core::int>(0, null){(core::int?, core::int?) → Null};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..133710a
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method main() → dynamic {
+  lowered core::int? #lateLocal;
+  lowered core::bool #lateLocal#isSet = false;
+  function #lateLocal#get() → core::int?
+    return #lateLocal#isSet ?{core::int?} #lateLocal : throw new _in::LateError::localNI("lateLocal");
+  function #lateLocal#set(core::int? #t1) → dynamic {
+    #lateLocal#isSet = true;
+    return #lateLocal = #t1;
+  }
+  self::throws(() → core::int? => #lateLocal#get(){() → core::int?}, "Read value from uninitialized lateLocal");
+  self::expect(123, #lateLocal#set(123){(core::int?) → dynamic});
+  self::expect(123, #lateLocal#get(){() → core::int?});
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
+    lowered T? #lateGenericLocal;
+    lowered core::bool #lateGenericLocal#isSet = false;
+    function #lateGenericLocal#get() → T?
+      return #lateGenericLocal#isSet ?{T?} #lateGenericLocal : throw new _in::LateError::localNI("lateGenericLocal");
+    function #lateGenericLocal#set(T? #t2) → dynamic {
+      #lateGenericLocal#isSet = true;
+      return #lateGenericLocal = #t2;
+    }
+    self::throws(() → T? => #lateGenericLocal#get(){() → T?}, "Read value from uninitialized lateGenericLocal");
+    self::expect(value, #lateGenericLocal#set(value){(T?) → dynamic});
+    self::expect(value, #lateGenericLocal#get(){() → T?});
+  }
+  local<core::int?>(null){(core::int?) → Null};
+  local<core::int?>(0){(core::int?) → Null};
+  local<core::int>(null){(core::int?) → Null};
+  local<core::int>(0){(core::int?) → Null};
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/late_override.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.modular.expect
new file mode 100644
index 0000000..bb99080
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/late_override.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Interface extends core::Object {
+  field core::int? _#Interface#implementedLateFieldDeclaredGetterSetter = null;
+  field core::bool _#Interface#implementedLateFieldDeclaredGetterSetter#isSet = false;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("implementedLateFieldDeclaredGetterSetter");
+  set implementedLateFieldDeclaredGetterSetter(core::int #t2) → void {
+    this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter#isSet} = true;
+    this.{self::Interface::_#Interface#implementedLateFieldDeclaredGetterSetter} = #t2;
+  }
+}
+class Class extends core::Object implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get implementedLateFieldDeclaredGetterSetter() → core::int
+    return 0;
+  set implementedLateFieldDeclaredGetterSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/later.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/later.dart.weak.modular.expect
new file mode 100644
index 0000000..a38e25a
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.modular.expect
@@ -0,0 +1,208 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/later.dart:14:7: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   foo(late int x) {} // Error.
+//       ^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:17:5: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+// bar(late int x) {} // Error.
+//     ^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:22:28: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
+// No types are needed, the first is given by 'on', the second is always 'StackTrace'.
+//   } on dynamic catch (late e, late t) {} // Error.
+//                            ^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:22:31: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   } on dynamic catch (late e, late t) {} // Error.
+//                               ^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:22:36: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
+// No types are needed, the first is given by 'on', the second is always 'StackTrace'.
+//   } on dynamic catch (late e, late t) {} // Error.
+//                                    ^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:23:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int i = 0; i < 10; ++i) { // Error.
+//        ^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:26:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late String s in ["baz"]) { // Error.
+//        ^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:29:9: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   [for (late int i = 0; i < 10; ++i) i]; // Error.
+//         ^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:33:14: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   await for (late String s in new Stream.fromIterable(["hest"])) { // Error.
+//              ^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:40:20: Error: `await` expressions are not supported in late local initializers.
+//   late String s1 = await hest(); // Error.
+//                    ^^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:41:30: Error: `await` expressions are not supported in late local initializers.
+//   late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
+//                              ^^^^^
+//
+// pkg/front_end/testcases/late_lowering/later.dart:46:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int x = 42;
+//                  ^
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Context: This constructor is const.
+//   const B(); // Error: B has late final fields.
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  field core::int a = 42;
+  field core::int? _#A#b = null;
+  field core::bool _#A#b#isSet = false;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get b() → core::int {
+    if(!this.{self::A::_#A#b#isSet}{core::bool}) {
+      this.{self::A::_#A#b} = this.{self::A::a}{core::int}.{core::num::*}(2){(core::num) → core::int}.{core::int::>>}(1){(core::int) → core::int};
+      this.{self::A::_#A#b#isSet} = true;
+    }
+    return let final core::int? #t1 = this.{self::A::_#A#b}{core::int?} in #t1{core::int};
+  }
+  set b(core::int #t2) → void {
+    this.{self::A::_#A#b#isSet} = true;
+    this.{self::A::_#A#b} = #t2;
+  }
+  method foo(core::int x) → dynamic {}
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  field core::int? _#B#x = null;
+  field core::bool _#B#x#isSet = false;
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+  get x() → core::int {
+    if(!this.{self::B::_#B#x#isSet}{core::bool}) {
+      final core::int #t3 = 42;
+      if(this.{self::B::_#B#x#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("x");
+      this.{self::B::_#B#x} = #t3;
+      this.{self::B::_#B#x#isSet} = true;
+    }
+    return let final core::int? #t4 = this.{self::B::_#B#x}{core::int?} in #t4{core::int};
+  }
+}
+class C extends core::Object {
+  field core::int? _#C#x = null;
+  field core::bool _#C#x#isSet = false;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return this.{self::C::_#C#x#isSet}{core::bool} ?{core::int} let final core::int? #t5 = this.{self::C::_#C#x}{core::int?} in #t5{core::int} : throw new _in::LateError::fieldNI("x");
+  set x(core::int #t6) → void
+    if(this.{self::C::_#C#x#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("x");
+    else {
+      this.{self::C::_#C#x#isSet} = true;
+      this.{self::C::_#C#x} = #t6;
+    }
+  method initVars() → dynamic {
+    this.{self::C::x} = 42;
+  }
+}
+static method bar(core::int x) → dynamic {}
+static method baz() → dynamic {
+  {
+    {
+      invalid-expression "pkg/front_end/testcases/late_lowering/later.dart:22:36: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
+No types are needed, the first is given by 'on', the second is always 'StackTrace'.
+  } on dynamic catch (late e, late t) {} // Error.
+                                   ^";
+    }
+    try {
+      throw "baz";
+    }
+    on dynamic catch(final dynamic late, final core::StackTrace e) {
+    }
+  }
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    core::print("baz");
+  }
+  for (core::String s in <core::String>["baz"]) {
+    core::print(s);
+  }
+  block {
+    final core::List<core::int> #t7 = <core::int>[];
+    for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      #t7.{core::List::add}{Invariant}(i){(core::int) → void};
+  } =>#t7;
+}
+static method hest() → dynamic async {
+  await for (core::String s in asy::Stream::fromIterable<core::String>(<core::String>["hest"])) {
+    core::print(s);
+  }
+  return "hest";
+}
+static method fisk() → dynamic async {
+  lowered core::String? #s1;
+  lowered core::bool #s1#isSet = false;
+  function #s1#get() → core::String {
+    if(!#s1#isSet) {
+      #s1 = invalid-expression "pkg/front_end/testcases/late_lowering/later.dart:40:20: Error: `await` expressions are not supported in late local initializers.
+  late String s1 = await hest(); // Error.
+                   ^^^^^";
+      #s1#isSet = true;
+    }
+    return #s1{core::String};
+  }
+  function #s1#set(core::String #t8) → dynamic {
+    #s1#isSet = true;
+    return #s1 = #t8;
+  }
+  lowered core::String? #s2;
+  lowered core::bool #s2#isSet = false;
+  function #s2#get() → core::String {
+    if(!#s2#isSet) {
+      #s2 = "${#C1}${invalid-expression "pkg/front_end/testcases/late_lowering/later.dart:41:30: Error: `await` expressions are not supported in late local initializers.
+  late String s2 = '\${fisk}\${await hest()}\${fisk}'; // Error.
+                             ^^^^^"}${#C1}";
+      #s2#isSet = true;
+    }
+    return #s2{core::String};
+  }
+  function #s2#set(core::String #t9) → dynamic {
+    #s2#isSet = true;
+    return #s2 = #t9;
+  }
+  lowered core::Function? #f;
+  lowered core::bool #f#isSet = false;
+  function #f#get() → core::Function {
+    if(!#f#isSet) {
+      #f = () → asy::Future<dynamic> async => await self::hest();
+      #f#isSet = true;
+    }
+    return #f{core::Function};
+  }
+  function #f#set(core::Function #t10) → dynamic {
+    #f#isSet = true;
+    return #f = #t10;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::fisk
+}
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..86913df
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.modular.expect
@@ -0,0 +1,183 @@
+library;
+import self as self;
+import "non_nullable_from_opt_out_lib.dart" as non;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///non_nullable_from_opt_out_lib.dart";
+
+static method main() → dynamic {
+  non::topLevelField = null;
+  non::finalTopLevelField = null;
+  non::Class<core::int*>* c = new non::Class::•<core::int*>();
+  c.{non::Class::instanceField} = null;
+  c.{non::Class::finalInstanceField} = null;
+  c.{non::Class::instanceTypeVariable} = null;
+  c.{non::Class::finalInstanceTypeVariable} = null;
+  non::Class::staticField = null;
+  non::Class::staticFinalField = null;
+  non::expect(null, non::topLevelField);
+  non::expect(null, non::finalTopLevelField);
+  non::expect(null, c.{non::Class::instanceField}{core::int*});
+  non::expect(null, c.{non::Class::finalInstanceField}{dynamic});
+  non::expect(null, c.{non::Class::instanceTypeVariable}{core::int*});
+  non::expect(null, c.{non::Class::finalInstanceTypeVariable}{core::int*});
+  non::expect(null, non::Class::staticField);
+  non::expect(null, non::Class::staticFinalField);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
+}
+
+library /*isNonNullableByDefault*/;
+import self as non;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class<T extends core::Object> extends core::Object {
+  field core::int? _#Class#instanceField = null;
+  field core::bool _#Class#instanceField#isSet = false;
+  field dynamic _#Class#finalInstanceField = null;
+  field core::bool _#Class#finalInstanceField#isSet = false;
+  covariant-by-class field non::Class::T? _#Class#instanceTypeVariable = null;
+  field core::bool _#Class#instanceTypeVariable#isSet = false;
+  field non::Class::T? _#Class#finalInstanceTypeVariable = null;
+  field core::bool _#Class#finalInstanceTypeVariable#isSet = false;
+  static field core::int? _#staticField = null;
+  static field core::bool _#staticField#isSet = false;
+  static field dynamic _#staticFinalField = null;
+  static field core::bool _#staticFinalField#isSet = false;
+  synthetic constructor •() → non::Class<non::Class::T>
+    : super core::Object::•()
+    ;
+  get instanceField() → core::int
+    return this.{non::Class::_#Class#instanceField#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{non::Class::_#Class#instanceField}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("instanceField");
+  set instanceField(core::int #t2) → void {
+    this.{non::Class::_#Class#instanceField#isSet} = true;
+    this.{non::Class::_#Class#instanceField} = #t2;
+  }
+  get finalInstanceField() → dynamic
+    return this.{non::Class::_#Class#finalInstanceField#isSet}{core::bool} ?{dynamic} this.{non::Class::_#Class#finalInstanceField}{dynamic} : throw new _in::LateError::fieldNI("finalInstanceField");
+  set finalInstanceField(dynamic #t3) → void
+    if(this.{non::Class::_#Class#finalInstanceField#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("finalInstanceField");
+    else {
+      this.{non::Class::_#Class#finalInstanceField#isSet} = true;
+      this.{non::Class::_#Class#finalInstanceField} = #t3;
+    }
+  get instanceTypeVariable() → non::Class::T
+    return this.{non::Class::_#Class#instanceTypeVariable#isSet}{core::bool} ?{non::Class::T} let final non::Class::T? #t4 = this.{non::Class::_#Class#instanceTypeVariable}{non::Class::T?} in #t4{non::Class::T} : throw new _in::LateError::fieldNI("instanceTypeVariable");
+  set instanceTypeVariable(covariant-by-class non::Class::T #t5) → void {
+    this.{non::Class::_#Class#instanceTypeVariable#isSet} = true;
+    this.{non::Class::_#Class#instanceTypeVariable} = #t5;
+  }
+  get finalInstanceTypeVariable() → non::Class::T
+    return this.{non::Class::_#Class#finalInstanceTypeVariable#isSet}{core::bool} ?{non::Class::T} let final non::Class::T? #t6 = this.{non::Class::_#Class#finalInstanceTypeVariable}{non::Class::T?} in #t6{non::Class::T} : throw new _in::LateError::fieldNI("finalInstanceTypeVariable");
+  set finalInstanceTypeVariable(non::Class::T #t7) → void
+    if(this.{non::Class::_#Class#finalInstanceTypeVariable#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("finalInstanceTypeVariable");
+    else {
+      this.{non::Class::_#Class#finalInstanceTypeVariable#isSet} = true;
+      this.{non::Class::_#Class#finalInstanceTypeVariable} = #t7;
+    }
+  static get staticField() → core::int
+    return non::Class::_#staticField#isSet ?{core::int} let final core::int? #t8 = non::Class::_#staticField in #t8{core::int} : throw new _in::LateError::fieldNI("staticField");
+  static set staticField(core::int #t9) → void {
+    non::Class::_#staticField#isSet = true;
+    non::Class::_#staticField = #t9;
+  }
+  static get staticFinalField() → dynamic
+    return non::Class::_#staticFinalField#isSet ?{dynamic} non::Class::_#staticFinalField : throw new _in::LateError::fieldNI("staticFinalField");
+  static set staticFinalField(dynamic #t10) → void
+    if(non::Class::_#staticFinalField#isSet)
+      throw new _in::LateError::fieldAI("staticFinalField");
+    else {
+      non::Class::_#staticFinalField#isSet = true;
+      non::Class::_#staticFinalField = #t10;
+    }
+}
+static field core::int? _#topLevelField = null;
+static field core::bool _#topLevelField#isSet = false;
+static field dynamic _#finalTopLevelField = null;
+static field core::bool _#finalTopLevelField#isSet = false;
+static get topLevelField() → core::int
+  return non::_#topLevelField#isSet ?{core::int} let final core::int? #t11 = non::_#topLevelField in #t11{core::int} : throw new _in::LateError::fieldNI("topLevelField");
+static set topLevelField(core::int #t12) → void {
+  non::_#topLevelField#isSet = true;
+  non::_#topLevelField = #t12;
+}
+static get finalTopLevelField() → dynamic
+  return non::_#finalTopLevelField#isSet ?{dynamic} non::_#finalTopLevelField : throw new _in::LateError::fieldNI("finalTopLevelField");
+static set finalTopLevelField(dynamic #t13) → void
+  if(non::_#finalTopLevelField#isSet)
+    throw new _in::LateError::fieldAI("finalTopLevelField");
+  else {
+    non::_#finalTopLevelField#isSet = true;
+    non::_#finalTopLevelField = #t13;
+  }
+static method method<T extends core::Object>(core::bool b, core::int i, non::method::T t) → dynamic {
+  lowered core::int? #local;
+  lowered core::bool #local#isSet = false;
+  function #local#get() → core::int
+    return #local#isSet ?{core::int} #local{core::int} : throw new _in::LateError::localNI("local");
+  function #local#set(core::int #t14) → dynamic {
+    #local#isSet = true;
+    return #local = #t14;
+  }
+  lowered final dynamic #finalLocal;
+  lowered core::bool #finalLocal#isSet = false;
+  function #finalLocal#get() → dynamic
+    return #finalLocal#isSet ?{dynamic} #finalLocal : throw new _in::LateError::localNI("finalLocal");
+  function #finalLocal#set(dynamic #t15) → dynamic
+    if(#finalLocal#isSet)
+      throw new _in::LateError::localAI("finalLocal");
+    else {
+      #finalLocal#isSet = true;
+      return #finalLocal = #t15;
+    }
+  lowered non::method::T? #localTypeVariable;
+  lowered core::bool #localTypeVariable#isSet = false;
+  function #localTypeVariable#get() → non::method::T
+    return #localTypeVariable#isSet ?{non::method::T} #localTypeVariable{non::method::T} : throw new _in::LateError::localNI("localTypeVariable");
+  function #localTypeVariable#set(non::method::T #t16) → dynamic {
+    #localTypeVariable#isSet = true;
+    return #localTypeVariable = #t16;
+  }
+  lowered final non::method::T? #finalLocalTypeVariable;
+  lowered core::bool #finalLocalTypeVariable#isSet = false;
+  function #finalLocalTypeVariable#get() → non::method::T
+    return #finalLocalTypeVariable#isSet ?{non::method::T} #finalLocalTypeVariable{non::method::T} : throw new _in::LateError::localNI("finalLocalTypeVariable");
+  function #finalLocalTypeVariable#set(non::method::T #t17) → dynamic
+    if(#finalLocalTypeVariable#isSet)
+      throw new _in::LateError::localAI("finalLocalTypeVariable");
+    else {
+      #finalLocalTypeVariable#isSet = true;
+      return #finalLocalTypeVariable = #t17;
+    }
+  if(b) {
+    #local#set(i){(core::int) → dynamic};
+    #finalLocal#set(i){(dynamic) → dynamic};
+    #localTypeVariable#set(t){(non::method::T) → dynamic};
+    #finalLocalTypeVariable#set(t){(non::method::T) → dynamic};
+    non::expect(i, #local#get(){() → core::int});
+    non::expect(i, #finalLocal#get(){() → dynamic});
+    non::expect(t, #localTypeVariable#get(){() → non::method::T});
+    non::expect(t, #finalLocalTypeVariable#get(){() → non::method::T});
+  }
+  non::throws(() → void => #finalLocal#set(i){(dynamic) → dynamic});
+  non::throws(() → void => #finalLocalTypeVariable#set(t){(non::method::T) → dynamic});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Missing exception";
+}
diff --git a/pkg/front_end/testcases/late_lowering/override.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/override.dart.weak.modular.expect
new file mode 100644
index 0000000..d89b35a
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/override.dart.weak.modular.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  field core::int? _#Class#field1 = null;
+  field core::bool _#Class#field1#isSet = false;
+  field core::int? _#Class#field2 = null;
+  field core::bool _#Class#field2#isSet = false;
+  field core::int? _#Class#field3 = null;
+  field core::bool _#Class#field3#isSet = false;
+  field core::int? _#Class#field4 = null;
+  field core::bool _#Class#field4#isSet = false;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get field1() → core::int
+    return this.{self::Class::_#Class#field1#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::Class::_#Class#field1}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("field1");
+  set field1(core::int #t2) → void {
+    this.{self::Class::_#Class#field1#isSet} = true;
+    this.{self::Class::_#Class#field1} = #t2;
+  }
+  get field2() → core::int
+    return this.{self::Class::_#Class#field2#isSet}{core::bool} ?{core::int} let final core::int? #t3 = this.{self::Class::_#Class#field2}{core::int?} in #t3{core::int} : throw new _in::LateError::fieldNI("field2");
+  set field2(core::int #t4) → void {
+    this.{self::Class::_#Class#field2#isSet} = true;
+    this.{self::Class::_#Class#field2} = #t4;
+  }
+  get field3() → core::int
+    return this.{self::Class::_#Class#field3#isSet}{core::bool} ?{core::int} let final core::int? #t5 = this.{self::Class::_#Class#field3}{core::int?} in #t5{core::int} : throw new _in::LateError::fieldNI("field3");
+  set field3(core::int #t6) → void
+    if(this.{self::Class::_#Class#field3#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("field3");
+    else {
+      this.{self::Class::_#Class#field3#isSet} = true;
+      this.{self::Class::_#Class#field3} = #t6;
+    }
+  get field4() → core::int
+    return this.{self::Class::_#Class#field4#isSet}{core::bool} ?{core::int} let final core::int? #t7 = this.{self::Class::_#Class#field4}{core::int?} in #t7{core::int} : throw new _in::LateError::fieldNI("field4");
+  set field4(core::int #t8) → void
+    if(this.{self::Class::_#Class#field4#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("field4");
+    else {
+      this.{self::Class::_#Class#field4#isSet} = true;
+      this.{self::Class::_#Class#field4} = #t8;
+    }
+}
+class SubClass extends self::Class {
+  field core::int? _#SubClass#field1 = null;
+  field core::bool _#SubClass#field1#isSet = false;
+  field core::int? _#SubClass#field2 = null;
+  field core::bool _#SubClass#field2#isSet = false;
+  field core::int? _#SubClass#field3 = null;
+  field core::bool _#SubClass#field3#isSet = false;
+  field core::int? _#SubClass#field4 = null;
+  field core::bool _#SubClass#field4#isSet = false;
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+  get field1() → core::int
+    return this.{self::SubClass::_#SubClass#field1#isSet}{core::bool} ?{core::int} let final core::int? #t9 = this.{self::SubClass::_#SubClass#field1}{core::int?} in #t9{core::int} : throw new _in::LateError::fieldNI("field1");
+  set field1(core::int #t10) → void {
+    this.{self::SubClass::_#SubClass#field1#isSet} = true;
+    this.{self::SubClass::_#SubClass#field1} = #t10;
+  }
+  get field2() → core::int {
+    if(!this.{self::SubClass::_#SubClass#field2#isSet}{core::bool}) {
+      this.{self::SubClass::_#SubClass#field2} = 0;
+      this.{self::SubClass::_#SubClass#field2#isSet} = true;
+    }
+    return let final core::int? #t11 = this.{self::SubClass::_#SubClass#field2}{core::int?} in #t11{core::int};
+  }
+  set field2(core::int #t12) → void {
+    this.{self::SubClass::_#SubClass#field2#isSet} = true;
+    this.{self::SubClass::_#SubClass#field2} = #t12;
+  }
+  get field3() → core::int
+    return this.{self::SubClass::_#SubClass#field3#isSet}{core::bool} ?{core::int} let final core::int? #t13 = this.{self::SubClass::_#SubClass#field3}{core::int?} in #t13{core::int} : throw new _in::LateError::fieldNI("field3");
+  set field3(core::int #t14) → void
+    if(this.{self::SubClass::_#SubClass#field3#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("field3");
+    else {
+      this.{self::SubClass::_#SubClass#field3#isSet} = true;
+      this.{self::SubClass::_#SubClass#field3} = #t14;
+    }
+  get field4() → core::int {
+    if(!this.{self::SubClass::_#SubClass#field4#isSet}{core::bool}) {
+      final core::int #t15 = 0;
+      if(this.{self::SubClass::_#SubClass#field4#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("field4");
+      this.{self::SubClass::_#SubClass#field4} = #t15;
+      this.{self::SubClass::_#SubClass#field4#isSet} = true;
+    }
+    return let final core::int? #t16 = this.{self::SubClass::_#SubClass#field4}{core::int?} in #t16{core::int};
+  }
+  get directField1() → core::int
+    return super.{self::Class::field1};
+  set directField1(core::int value) → void {
+    super.{self::Class::field1} = value;
+  }
+  get directField2() → core::int
+    return super.{self::Class::field2};
+  set directField2(core::int value) → void {
+    super.{self::Class::field2} = value;
+  }
+  get directField3() → core::int
+    return super.{self::Class::field3};
+  get directField4() → core::int
+    return super.{self::Class::field4};
+}
+static method main() → dynamic {
+  self::SubClass sc = new self::SubClass::•();
+  self::Class c = sc;
+  self::throws(() → core::int => c.{self::Class::field1}{core::int}, "Read value from uninitialized SubClass.field1");
+  self::throws(() → core::int => sc.{self::SubClass::directField1}{core::int}, "Read value from uninitialized Class.field1");
+  self::expect(42, c.{self::Class::field1} = 42);
+  self::expect(42, c.{self::Class::field1}{core::int});
+  self::throws(() → core::int => sc.{self::SubClass::directField1}{core::int}, "Read value from uninitialized Class.field1");
+  self::expect(87, sc.{self::SubClass::directField1} = 87);
+  self::expect(87, sc.{self::SubClass::directField1}{core::int});
+  self::expect(0, c.{self::Class::field2}{core::int});
+  self::throws(() → core::int => sc.{self::SubClass::directField2}{core::int}, "Read value from uninitialized Class.field2");
+  self::expect(42, c.{self::Class::field2} = 42);
+  self::expect(42, c.{self::Class::field2}{core::int});
+  self::throws(() → core::int => sc.{self::SubClass::directField2}{core::int}, "Read value from uninitialized Class.field2");
+  self::expect(87, sc.{self::SubClass::directField2} = 87);
+  self::expect(87, sc.{self::SubClass::directField2}{core::int});
+  self::throws(() → core::int => c.{self::Class::field3}{core::int}, "Read value from uninitialized SubClass.field3");
+  self::throws(() → core::int => sc.{self::SubClass::directField3}{core::int}, "Read value from uninitialized Class.field3");
+  self::expect(42, c.{self::Class::field3} = 42);
+  self::expect(42, c.{self::Class::field3}{core::int});
+  self::throws(() → core::int => sc.{self::SubClass::directField3}{core::int}, "Read value from uninitialized Class.field3");
+  self::throws(() → core::int => c.{self::Class::field3} = 87, "Write value to initialized SubClass.field3");
+  self::expect(0, c.{self::Class::field4}{core::int});
+  self::throws(() → core::int => sc.{self::SubClass::directField4}{core::int}, "Read value from uninitialized Class.field4");
+  self::expect(42, c.{self::Class::field4} = 42);
+  self::expect(0, c.{self::Class::field4}{core::int});
+  self::expect(42, sc.{self::SubClass::directField4}{core::int});
+  self::throws(() → core::int => c.{self::Class::field4} = 87, "Write value to initialized SubClass.field4");
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}.";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..e46b981
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/override_getter_setter.dart.weak.modular.expect
@@ -0,0 +1,101 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class A extends core::Object {
+  field core::int? _#A#x = null;
+  field core::bool _#A#x#isSet = false;
+  field core::int? _#A#y = null;
+  field core::bool _#A#y#isSet = false;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return this.{self::A::_#A#x#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
+  set x(core::int #t2) → void
+    if(this.{self::A::_#A#x#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("x");
+    else {
+      this.{self::A::_#A#x#isSet} = true;
+      this.{self::A::_#A#x} = #t2;
+    }
+  get y() → core::int?
+    return this.{self::A::_#A#y#isSet}{core::bool} ?{core::int?} this.{self::A::_#A#y}{core::int?} : throw new _in::LateError::fieldNI("y");
+  set y(core::int? #t3) → void
+    if(this.{self::A::_#A#y#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("y");
+    else {
+      this.{self::A::_#A#y#isSet} = true;
+      this.{self::A::_#A#y} = #t3;
+    }
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  get x() → core::int
+    return 1;
+  get y() → core::int?
+    return 1;
+}
+class C extends self::A {
+  field core::int? _#C#x = null;
+  field core::bool _#C#x#isSet = false;
+  field core::int? _#C#y = null;
+  field core::bool _#C#y#isSet = false;
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  get x() → core::int {
+    if(!this.{self::C::_#C#x#isSet}{core::bool}) {
+      final core::int #t4 = 2;
+      if(this.{self::C::_#C#x#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("x");
+      this.{self::C::_#C#x} = #t4;
+      this.{self::C::_#C#x#isSet} = true;
+    }
+    return let final core::int? #t5 = this.{self::C::_#C#x}{core::int?} in #t5{core::int};
+  }
+  get y() → core::int? {
+    if(!this.{self::C::_#C#y#isSet}{core::bool}) {
+      final core::int? #t6 = 2;
+      if(this.{self::C::_#C#y#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("y");
+      this.{self::C::_#C#y} = #t6;
+      this.{self::C::_#C#y#isSet} = true;
+    }
+    return this.{self::C::_#C#y}{core::int?};
+  }
+}
+static method main() → dynamic {
+  self::B b = new self::B::•();
+  b.{self::A::x} = 3;
+  self::C c = new self::C::•();
+  self::throws(() → core::int => b.{self::A::x} = 14, "Write to B.x");
+  c.{self::A::x} = 3;
+  self::throws(() → core::int => c.{self::A::x} = 14, "Write to C.x");
+  self::expect(1, b.{self::B::x}{core::int});
+  self::expect(2, c.{self::C::x}{core::int});
+  b.{self::A::y} = 3;
+  self::throws(() → core::int => b.{self::A::y} = 14, "Write to B.y");
+  c.{self::A::y} = 3;
+  self::throws(() → core::int => c.{self::A::y} = 14, "Write to C.y");
+  self::expect(1, b.{self::B::y}{core::int?});
+  self::expect(2, c.{self::C::y}{core::int?});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/private_members.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.modular.expect
new file mode 100644
index 0000000..10fbd90
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/private_members.dart.weak.modular.expect
@@ -0,0 +1,143 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+part private_members_part.dart;
+class _Class extends core::Object { // from org-dartlang-testcase:///private_members_part.dart
+  field core::int? _#_Class#_privateField1 = null;
+  field core::bool _#_Class#_privateField1#isSet = false;
+  field core::int? _#_Class#_privateField2 = null;
+  field core::bool _#_Class#_privateField2#isSet = false;
+  field core::int? _#_Class#_privateFinalField1 = null;
+  field core::bool _#_Class#_privateFinalField1#isSet = false;
+  field core::int? _#_Class#_privateFinalField2 = null;
+  field core::bool _#_Class#_privateFinalField2#isSet = false;
+  synthetic constructor •() → self::_Class
+    : super core::Object::•()
+    ;
+  get _privateField1() → core::int {
+    if(!this.{self::_Class::_#_Class#_privateField1#isSet}{core::bool}) {
+      this.{self::_Class::_#_Class#_privateField1} = 1;
+      this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+    }
+    return let final core::int? #t1 = this.{self::_Class::_#_Class#_privateField1}{core::int?} in #t1{core::int};
+  }
+  set _privateField1(core::int #t2) → void {
+    this.{self::_Class::_#_Class#_privateField1#isSet} = true;
+    this.{self::_Class::_#_Class#_privateField1} = #t2;
+  }
+  get _privateField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateField2#isSet}{core::bool}) {
+      this.{self::_Class::_#_Class#_privateField2} = 1;
+      this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateField2}{core::int?};
+  }
+  set _privateField2(core::int? #t3) → void {
+    this.{self::_Class::_#_Class#_privateField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateField2} = #t3;
+  }
+  get _privateFinalField1() → core::int {
+    if(!this.{self::_Class::_#_Class#_privateFinalField1#isSet}{core::bool}) {
+      this.{self::_Class::_#_Class#_privateFinalField1} = 1;
+      this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+    }
+    return let final core::int? #t4 = this.{self::_Class::_#_Class#_privateFinalField1}{core::int?} in #t4{core::int};
+  }
+  set _privateFinalField1(core::int #t5) → void {
+    this.{self::_Class::_#_Class#_privateFinalField1#isSet} = true;
+    this.{self::_Class::_#_Class#_privateFinalField1} = #t5;
+  }
+  get _privateFinalField2() → core::int? {
+    if(!this.{self::_Class::_#_Class#_privateFinalField2#isSet}{core::bool}) {
+      this.{self::_Class::_#_Class#_privateFinalField2} = 1;
+      this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    }
+    return this.{self::_Class::_#_Class#_privateFinalField2}{core::int?};
+  }
+  set _privateFinalField2(core::int? #t6) → void {
+    this.{self::_Class::_#_Class#_privateFinalField2#isSet} = true;
+    this.{self::_Class::_#_Class#_privateFinalField2} = #t6;
+  }
+}
+extension _Extension on core::int { // from org-dartlang-testcase:///private_members_part.dart
+  static field _privateField1 = self::_#_Extension|_privateField1;
+  static field _privateField1 = self::_#_Extension|_privateField1#isSet;
+  static get _privateField1 = get self::_Extension|_privateField1;
+  static set _privateField1 = set self::_Extension|_privateField1;
+  static field _privateField2 = self::_#_Extension|_privateField2;
+  static field _privateField2 = self::_#_Extension|_privateField2#isSet;
+  static get _privateField2 = get self::_Extension|_privateField2;
+  static set _privateField2 = set self::_Extension|_privateField2;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1;
+  static field _privateFinalField1 = self::_#_Extension|_privateFinalField1#isSet;
+  static get _privateFinalField1 = get self::_Extension|_privateFinalField1;
+  static set _privateFinalField1 = set self::_Extension|_privateFinalField1;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2;
+  static field _privateFinalField2 = self::_#_Extension|_privateFinalField2#isSet;
+  static get _privateFinalField2 = get self::_Extension|_privateFinalField2;
+  static set _privateFinalField2 = set self::_Extension|_privateFinalField2;
+}
+static field core::int? _#_Extension|_privateField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField1 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField1#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::int? _#_Extension|_privateFinalField2 = null /* from org-dartlang-testcase:///private_members_part.dart */;
+static field core::bool _#_Extension|_privateFinalField2#isSet = false /* from org-dartlang-testcase:///private_members_part.dart */;
+static method main() → dynamic {
+  self::_Class c = new self::_Class::•();
+  c.{self::_Class::_privateField1} = c.{self::_Class::_privateField1}{core::int};
+  c.{self::_Class::_privateField2} = c.{self::_Class::_privateField2}{core::int?};
+  c.{self::_Class::_privateFinalField1}{core::int};
+  c.{self::_Class::_privateFinalField2}{core::int?};
+  self::_Extension|_privateField1 = self::_Extension|_privateField1;
+  self::_Extension|_privateField2 = self::_Extension|_privateField2;
+  self::_Extension|_privateFinalField1;
+  self::_Extension|_privateFinalField2;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1() → core::int {
+  if(!self::_#_Extension|_privateField1#isSet) {
+    self::_#_Extension|_privateField1 = 1;
+    self::_#_Extension|_privateField1#isSet = true;
+  }
+  return let final core::int? #t7 = self::_#_Extension|_privateField1 in #t7{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField1(core::int #t8) → void {
+  self::_#_Extension|_privateField1#isSet = true;
+  self::_#_Extension|_privateField1 = #t8;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2() → core::int? {
+  if(!self::_#_Extension|_privateField2#isSet) {
+    self::_#_Extension|_privateField2 = 1;
+    self::_#_Extension|_privateField2#isSet = true;
+  }
+  return self::_#_Extension|_privateField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateField2(core::int? #t9) → void {
+  self::_#_Extension|_privateField2#isSet = true;
+  self::_#_Extension|_privateField2 = #t9;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1() → core::int {
+  if(!self::_#_Extension|_privateFinalField1#isSet) {
+    self::_#_Extension|_privateFinalField1 = 1;
+    self::_#_Extension|_privateFinalField1#isSet = true;
+  }
+  return let final core::int? #t10 = self::_#_Extension|_privateFinalField1 in #t10{core::int};
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField1(core::int #t11) → void {
+  self::_#_Extension|_privateFinalField1#isSet = true;
+  self::_#_Extension|_privateFinalField1 = #t11;
+}
+static get /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2() → core::int? {
+  if(!self::_#_Extension|_privateFinalField2#isSet) {
+    self::_#_Extension|_privateFinalField2 = 1;
+    self::_#_Extension|_privateFinalField2#isSet = true;
+  }
+  return self::_#_Extension|_privateFinalField2;
+}
+static set /* from org-dartlang-testcase:///private_members_part.dart */ _Extension|_privateFinalField2(core::int? #t12) → void {
+  self::_#_Extension|_privateFinalField2#isSet = true;
+  self::_#_Extension|_privateFinalField2 = #t12;
+}
diff --git a/pkg/front_end/testcases/late_lowering/return_late.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/return_late.dart.weak.modular.expect
new file mode 100644
index 0000000..3733586
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/return_late.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class<E extends core::Object? = dynamic> extends core::Object {
+  final field self::Class::E% field;
+  constructor •(self::Class::E% field) → self::Class<self::Class::E%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  method returnTypeVariable() → self::Class::E% {
+    lowered self::Class::E? #result;
+    lowered core::bool #result#isSet = false;
+    function #result#get() → self::Class::E% {
+      if(!#result#isSet) {
+        #result = this.{self::Class::field}{self::Class::E%};
+        #result#isSet = true;
+      }
+      return #result{self::Class::E%};
+    }
+    function #result#set(self::Class::E% #t1) → dynamic {
+      #result#isSet = true;
+      return #result = #t1;
+    }
+    return #result#get(){() → self::Class::E%};
+  }
+}
+static method returnNonNullable(core::int value) → core::int {
+  lowered core::int? #result;
+  lowered core::bool #result#isSet = false;
+  function #result#get() → core::int {
+    if(!#result#isSet) {
+      #result = value;
+      #result#isSet = true;
+    }
+    return #result{core::int};
+  }
+  function #result#set(core::int #t2) → dynamic {
+    #result#isSet = true;
+    return #result = #t2;
+  }
+  return #result#get(){() → core::int};
+}
+static method returnNullable(core::int? value) → core::int? {
+  lowered core::int? #result;
+  lowered core::bool #result#isSet = false;
+  function #result#get() → core::int? {
+    if(!#result#isSet) {
+      #result = value;
+      #result#isSet = true;
+    }
+    return #result;
+  }
+  function #result#set(core::int? #t3) → dynamic {
+    #result#isSet = true;
+    return #result = #t3;
+  }
+  return #result#get(){() → core::int?};
+}
+static method main() → dynamic {
+  self::expect(42, new self::Class::•<core::int>(42).{self::Class::returnTypeVariable}(){() → core::int});
+  self::expect(87, new self::Class::•<core::int?>(87).{self::Class::returnTypeVariable}(){() → core::int?});
+  self::expect(null, new self::Class::•<core::int?>(null).{self::Class::returnTypeVariable}(){() → core::int?});
+  self::expect(42, self::returnNonNullable(42));
+  self::expect(87, self::returnNullable(87));
+  self::expect(null, self::returnNullable(null));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/skip_late_final_uninitialized_instance_fields/main.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/skip_late_final_uninitialized_instance_fields/main.dart.weak.modular.expect
new file mode 100644
index 0000000..bfdde61
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/skip_late_final_uninitialized_instance_fields/main.dart.weak.modular.expect
@@ -0,0 +1,226 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  static field core::int? _#uninitializedNonFinalStaticField = null;
+  static field core::bool _#uninitializedNonFinalStaticField#isSet = false;
+  static field core::int? _#uninitializedFinalStaticField = null;
+  static field core::bool _#uninitializedFinalStaticField#isSet = false;
+  static field core::int? _#initializedNonFinalStaticField = null;
+  static field core::bool _#initializedNonFinalStaticField#isSet = false;
+  static field core::int? _#initializedFinalStaticField = null;
+  static field core::bool _#initializedFinalStaticField#isSet = false;
+  late field core::int uninitializedNonFinalInstanceField;
+  field core::int? _#Class#uninitializedFinalInstanceField = null;
+  field core::bool _#Class#uninitializedFinalInstanceField#isSet = false;
+  field core::int? _#Class#initializedNonFinalInstanceField = null;
+  field core::bool _#Class#initializedNonFinalInstanceField#isSet = false;
+  field core::int? _#Class#initializedFinalInstanceField = null;
+  field core::bool _#Class#initializedFinalInstanceField#isSet = false;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static get uninitializedNonFinalStaticField() → core::int
+    return self::Class::_#uninitializedNonFinalStaticField#isSet ?{core::int} let final core::int? #t1 = self::Class::_#uninitializedNonFinalStaticField in #t1{core::int} : throw new _in::LateError::fieldNI("uninitializedNonFinalStaticField");
+  static set uninitializedNonFinalStaticField(core::int #t2) → void {
+    self::Class::_#uninitializedNonFinalStaticField#isSet = true;
+    self::Class::_#uninitializedNonFinalStaticField = #t2;
+  }
+  static get uninitializedFinalStaticField() → core::int
+    return self::Class::_#uninitializedFinalStaticField#isSet ?{core::int} let final core::int? #t3 = self::Class::_#uninitializedFinalStaticField in #t3{core::int} : throw new _in::LateError::fieldNI("uninitializedFinalStaticField");
+  static set uninitializedFinalStaticField(core::int #t4) → void
+    if(self::Class::_#uninitializedFinalStaticField#isSet)
+      throw new _in::LateError::fieldAI("uninitializedFinalStaticField");
+    else {
+      self::Class::_#uninitializedFinalStaticField#isSet = true;
+      self::Class::_#uninitializedFinalStaticField = #t4;
+    }
+  static get initializedNonFinalStaticField() → core::int {
+    if(!self::Class::_#initializedNonFinalStaticField#isSet) {
+      self::Class::_#initializedNonFinalStaticField = 0;
+      self::Class::_#initializedNonFinalStaticField#isSet = true;
+    }
+    return let final core::int? #t5 = self::Class::_#initializedNonFinalStaticField in #t5{core::int};
+  }
+  static set initializedNonFinalStaticField(core::int #t6) → void {
+    self::Class::_#initializedNonFinalStaticField#isSet = true;
+    self::Class::_#initializedNonFinalStaticField = #t6;
+  }
+  static get initializedFinalStaticField() → core::int {
+    if(!self::Class::_#initializedFinalStaticField#isSet) {
+      final core::int #t7 = 0;
+      if(self::Class::_#initializedFinalStaticField#isSet)
+        throw new _in::LateError::fieldADI("initializedFinalStaticField");
+      self::Class::_#initializedFinalStaticField = #t7;
+      self::Class::_#initializedFinalStaticField#isSet = true;
+    }
+    return let final core::int? #t8 = self::Class::_#initializedFinalStaticField in #t8{core::int};
+  }
+  get uninitializedFinalInstanceField() → core::int
+    return this.{self::Class::_#Class#uninitializedFinalInstanceField#isSet}{core::bool} ?{core::int} let final core::int? #t9 = this.{self::Class::_#Class#uninitializedFinalInstanceField}{core::int?} in #t9{core::int} : throw new _in::LateError::fieldNI("uninitializedFinalInstanceField");
+  set uninitializedFinalInstanceField(core::int #t10) → void
+    if(this.{self::Class::_#Class#uninitializedFinalInstanceField#isSet}{core::bool})
+      throw new _in::LateError::fieldAI("uninitializedFinalInstanceField");
+    else {
+      this.{self::Class::_#Class#uninitializedFinalInstanceField#isSet} = true;
+      this.{self::Class::_#Class#uninitializedFinalInstanceField} = #t10;
+    }
+  get initializedNonFinalInstanceField() → core::int {
+    if(!this.{self::Class::_#Class#initializedNonFinalInstanceField#isSet}{core::bool}) {
+      this.{self::Class::_#Class#initializedNonFinalInstanceField} = 0;
+      this.{self::Class::_#Class#initializedNonFinalInstanceField#isSet} = true;
+    }
+    return let final core::int? #t11 = this.{self::Class::_#Class#initializedNonFinalInstanceField}{core::int?} in #t11{core::int};
+  }
+  set initializedNonFinalInstanceField(core::int #t12) → void {
+    this.{self::Class::_#Class#initializedNonFinalInstanceField#isSet} = true;
+    this.{self::Class::_#Class#initializedNonFinalInstanceField} = #t12;
+  }
+  get initializedFinalInstanceField() → core::int {
+    if(!this.{self::Class::_#Class#initializedFinalInstanceField#isSet}{core::bool}) {
+      final core::int #t13 = 0;
+      if(this.{self::Class::_#Class#initializedFinalInstanceField#isSet}{core::bool})
+        throw new _in::LateError::fieldADI("initializedFinalInstanceField");
+      this.{self::Class::_#Class#initializedFinalInstanceField} = #t13;
+      this.{self::Class::_#Class#initializedFinalInstanceField#isSet} = true;
+    }
+    return let final core::int? #t14 = this.{self::Class::_#Class#initializedFinalInstanceField}{core::int?} in #t14{core::int};
+  }
+}
+static field core::int? _#uninitializedNonFinalTopLevelField = null;
+static field core::bool _#uninitializedNonFinalTopLevelField#isSet = false;
+static field core::int? _#uninitializedFinalTopLevelField = null;
+static field core::bool _#uninitializedFinalTopLevelField#isSet = false;
+static field core::int? _#initializedNonFinalTopLevelField = null;
+static field core::bool _#initializedNonFinalTopLevelField#isSet = false;
+static field core::int? _#initializedFinalTopLevelField = null;
+static field core::bool _#initializedFinalTopLevelField#isSet = false;
+static method main() → dynamic {}
+static method method() → dynamic {
+  lowered core::int? #nullableUninitializedNonFinalLocal;
+  lowered core::bool #nullableUninitializedNonFinalLocal#isSet = false;
+  function #nullableUninitializedNonFinalLocal#get() → core::int?
+    return #nullableUninitializedNonFinalLocal#isSet ?{core::int?} #nullableUninitializedNonFinalLocal : throw new _in::LateError::localNI("nullableUninitializedNonFinalLocal");
+  function #nullableUninitializedNonFinalLocal#set(core::int? #t15) → dynamic {
+    #nullableUninitializedNonFinalLocal#isSet = true;
+    return #nullableUninitializedNonFinalLocal = #t15;
+  }
+  lowered core::int? #nonNullableUninitializedNonFinalLocal;
+  lowered core::bool #nonNullableUninitializedNonFinalLocal#isSet = false;
+  function #nonNullableUninitializedNonFinalLocal#get() → core::int
+    return #nonNullableUninitializedNonFinalLocal#isSet ?{core::int} #nonNullableUninitializedNonFinalLocal{core::int} : throw new _in::LateError::localNI("nonNullableUninitializedNonFinalLocal");
+  function #nonNullableUninitializedNonFinalLocal#set(core::int #t16) → dynamic {
+    #nonNullableUninitializedNonFinalLocal#isSet = true;
+    return #nonNullableUninitializedNonFinalLocal = #t16;
+  }
+  lowered final core::int? #nullableUninitializedFinalLocal;
+  lowered core::bool #nullableUninitializedFinalLocal#isSet = false;
+  function #nullableUninitializedFinalLocal#get() → core::int?
+    return #nullableUninitializedFinalLocal#isSet ?{core::int?} #nullableUninitializedFinalLocal : throw new _in::LateError::localNI("nullableUninitializedFinalLocal");
+  function #nullableUninitializedFinalLocal#set(core::int? #t17) → dynamic
+    if(#nullableUninitializedFinalLocal#isSet)
+      throw new _in::LateError::localAI("nullableUninitializedFinalLocal");
+    else {
+      #nullableUninitializedFinalLocal#isSet = true;
+      return #nullableUninitializedFinalLocal = #t17;
+    }
+  lowered final core::int? #nonNullableUninitializedFinalLocal;
+  lowered core::bool #nonNullableUninitializedFinalLocal#isSet = false;
+  function #nonNullableUninitializedFinalLocal#get() → core::int
+    return #nonNullableUninitializedFinalLocal#isSet ?{core::int} #nonNullableUninitializedFinalLocal{core::int} : throw new _in::LateError::localNI("nonNullableUninitializedFinalLocal");
+  function #nonNullableUninitializedFinalLocal#set(core::int #t18) → dynamic
+    if(#nonNullableUninitializedFinalLocal#isSet)
+      throw new _in::LateError::localAI("nonNullableUninitializedFinalLocal");
+    else {
+      #nonNullableUninitializedFinalLocal#isSet = true;
+      return #nonNullableUninitializedFinalLocal = #t18;
+    }
+  lowered core::int? #nullableInitializedNonFinalLocal;
+  lowered core::bool #nullableInitializedNonFinalLocal#isSet = false;
+  function #nullableInitializedNonFinalLocal#get() → core::int? {
+    if(!#nullableInitializedNonFinalLocal#isSet) {
+      #nullableInitializedNonFinalLocal = 0;
+      #nullableInitializedNonFinalLocal#isSet = true;
+    }
+    return #nullableInitializedNonFinalLocal;
+  }
+  function #nullableInitializedNonFinalLocal#set(core::int? #t19) → dynamic {
+    #nullableInitializedNonFinalLocal#isSet = true;
+    return #nullableInitializedNonFinalLocal = #t19;
+  }
+  lowered core::int? #nonNullableInitializedNonFinalLocal;
+  lowered core::bool #nonNullableInitializedNonFinalLocal#isSet = false;
+  function #nonNullableInitializedNonFinalLocal#get() → core::int {
+    if(!#nonNullableInitializedNonFinalLocal#isSet) {
+      #nonNullableInitializedNonFinalLocal = 0;
+      #nonNullableInitializedNonFinalLocal#isSet = true;
+    }
+    return #nonNullableInitializedNonFinalLocal{core::int};
+  }
+  function #nonNullableInitializedNonFinalLocal#set(core::int #t20) → dynamic {
+    #nonNullableInitializedNonFinalLocal#isSet = true;
+    return #nonNullableInitializedNonFinalLocal = #t20;
+  }
+  lowered final core::int? #nullableInitializedFinalLocal;
+  lowered core::bool #nullableInitializedFinalLocal#isSet = false;
+  function #nullableInitializedFinalLocal#get() → core::int? {
+    if(!#nullableInitializedFinalLocal#isSet) {
+      final core::int? #t21 = 0;
+      if(#nullableInitializedFinalLocal#isSet)
+        throw new _in::LateError::localADI("nullableInitializedFinalLocal");
+      #nullableInitializedFinalLocal = #t21;
+      #nullableInitializedFinalLocal#isSet = true;
+    }
+    return #nullableInitializedFinalLocal;
+  }
+  lowered final core::int? #nonNullableInitializedFinalLocal;
+  lowered core::bool #nonNullableInitializedFinalLocal#isSet = false;
+  function #nonNullableInitializedFinalLocal#get() → core::int {
+    if(!#nonNullableInitializedFinalLocal#isSet) {
+      final core::int #t22 = 0;
+      if(#nonNullableInitializedFinalLocal#isSet)
+        throw new _in::LateError::localADI("nonNullableInitializedFinalLocal");
+      #nonNullableInitializedFinalLocal = #t22;
+      #nonNullableInitializedFinalLocal#isSet = true;
+    }
+    return #nonNullableInitializedFinalLocal{core::int};
+  }
+}
+static get uninitializedNonFinalTopLevelField() → core::int
+  return self::_#uninitializedNonFinalTopLevelField#isSet ?{core::int} let final core::int? #t23 = self::_#uninitializedNonFinalTopLevelField in #t23{core::int} : throw new _in::LateError::fieldNI("uninitializedNonFinalTopLevelField");
+static set uninitializedNonFinalTopLevelField(core::int #t24) → void {
+  self::_#uninitializedNonFinalTopLevelField#isSet = true;
+  self::_#uninitializedNonFinalTopLevelField = #t24;
+}
+static get uninitializedFinalTopLevelField() → core::int
+  return self::_#uninitializedFinalTopLevelField#isSet ?{core::int} let final core::int? #t25 = self::_#uninitializedFinalTopLevelField in #t25{core::int} : throw new _in::LateError::fieldNI("uninitializedFinalTopLevelField");
+static set uninitializedFinalTopLevelField(core::int #t26) → void
+  if(self::_#uninitializedFinalTopLevelField#isSet)
+    throw new _in::LateError::fieldAI("uninitializedFinalTopLevelField");
+  else {
+    self::_#uninitializedFinalTopLevelField#isSet = true;
+    self::_#uninitializedFinalTopLevelField = #t26;
+  }
+static get initializedNonFinalTopLevelField() → core::int {
+  if(!self::_#initializedNonFinalTopLevelField#isSet) {
+    self::_#initializedNonFinalTopLevelField = 0;
+    self::_#initializedNonFinalTopLevelField#isSet = true;
+  }
+  return let final core::int? #t27 = self::_#initializedNonFinalTopLevelField in #t27{core::int};
+}
+static set initializedNonFinalTopLevelField(core::int #t28) → void {
+  self::_#initializedNonFinalTopLevelField#isSet = true;
+  self::_#initializedNonFinalTopLevelField = #t28;
+}
+static get initializedFinalTopLevelField() → core::int {
+  if(!self::_#initializedFinalTopLevelField#isSet) {
+    final core::int #t29 = 0;
+    if(self::_#initializedFinalTopLevelField#isSet)
+      throw new _in::LateError::fieldADI("initializedFinalTopLevelField");
+    self::_#initializedFinalTopLevelField = #t29;
+    self::_#initializedFinalTopLevelField#isSet = true;
+  }
+  return let final core::int? #t30 = self::_#initializedFinalTopLevelField in #t30{core::int};
+}
diff --git a/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..13fee7d
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/uninitialized_non_nullable_late_fields.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class A extends core::Object {
+  field core::int? _#A#x = null;
+  field core::bool _#A#x#isSet = false;
+  constructor foo(core::int x) → self::A
+    : self::A::_#A#x#isSet = true, self::A::_#A#x = x, super core::Object::•()
+    ;
+  constructor bar() → self::A
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return this.{self::A::_#A#x#isSet}{core::bool} ?{core::int} let final core::int? #t1 = this.{self::A::_#A#x}{core::int?} in #t1{core::int} : throw new _in::LateError::fieldNI("x");
+  set x(core::int #t2) → void {
+    this.{self::A::_#A#x#isSet} = true;
+    this.{self::A::_#A#x} = #t2;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..c037d72
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_fields.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static field core::int? _#nullableTopLevelField = _in::createSentinel<core::int?>();
+static field core::int? _#nonNullableTopLevelField = _in::createSentinel<core::int>();
+static field core::int? _#nullableTopLevelFieldWithInitializer = _in::createSentinel<core::int?>();
+static field core::int? _#nonNullableTopLevelFieldWithInitializer = _in::createSentinel<core::int>();
+static field core::int? _#nullableFinalTopLevelField = _in::createSentinel<core::int?>();
+static field core::int? _#nonNullableFinalTopLevelField = _in::createSentinel<core::int>();
+static field core::int? _#nullableFinalTopLevelFieldWithInitializer = _in::createSentinel<core::int?>();
+static field core::int? _#nonNullableFinalTopLevelFieldWithInitializer = _in::createSentinel<core::int>();
+static field Never? _#neverTopLevelField = _in::createSentinel<Never>();
+static get nullableTopLevelField() → core::int?
+  return let final core::int? #t1 = self::_#nullableTopLevelField in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::fieldNI("nullableTopLevelField") : #t1{core::int?};
+static set nullableTopLevelField(core::int? #t2) → void
+  self::_#nullableTopLevelField = #t2;
+static get nonNullableTopLevelField() → core::int
+  return let final core::int? #t3 = self::_#nonNullableTopLevelField in _in::isSentinel(#t3) ?{core::int} throw new _in::LateError::fieldNI("nonNullableTopLevelField") : #t3{core::int};
+static set nonNullableTopLevelField(core::int #t4) → void
+  self::_#nonNullableTopLevelField = #t4;
+static get nullableTopLevelFieldWithInitializer() → core::int?
+  return let final core::int? #t5 = self::_#nullableTopLevelFieldWithInitializer in _in::isSentinel(#t5) ?{core::int?} self::_#nullableTopLevelFieldWithInitializer = null : #t5{core::int?};
+static set nullableTopLevelFieldWithInitializer(core::int? #t6) → void
+  self::_#nullableTopLevelFieldWithInitializer = #t6;
+static get nonNullableTopLevelFieldWithInitializer() → core::int
+  return let final core::int? #t7 = self::_#nonNullableTopLevelFieldWithInitializer in _in::isSentinel(#t7) ?{core::int} self::_#nonNullableTopLevelFieldWithInitializer = 0 : #t7{core::int};
+static set nonNullableTopLevelFieldWithInitializer(core::int #t8) → void
+  self::_#nonNullableTopLevelFieldWithInitializer = #t8;
+static get nullableFinalTopLevelField() → core::int?
+  return let final core::int? #t9 = self::_#nullableFinalTopLevelField in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::fieldNI("nullableFinalTopLevelField") : #t9{core::int?};
+static set nullableFinalTopLevelField(core::int? #t10) → void
+  if(_in::isSentinel(self::_#nullableFinalTopLevelField))
+    self::_#nullableFinalTopLevelField = #t10;
+  else
+    throw new _in::LateError::fieldAI("nullableFinalTopLevelField");
+static get nonNullableFinalTopLevelField() → core::int
+  return let final core::int? #t11 = self::_#nonNullableFinalTopLevelField in _in::isSentinel(#t11) ?{core::int} throw new _in::LateError::fieldNI("nonNullableFinalTopLevelField") : #t11{core::int};
+static set nonNullableFinalTopLevelField(core::int #t12) → void
+  if(_in::isSentinel(self::_#nonNullableFinalTopLevelField))
+    self::_#nonNullableFinalTopLevelField = #t12;
+  else
+    throw new _in::LateError::fieldAI("nonNullableFinalTopLevelField");
+static get nullableFinalTopLevelFieldWithInitializer() → core::int?
+  return let final core::int? #t13 = self::_#nullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(self::_#nullableFinalTopLevelFieldWithInitializer) ?{core::int?} self::_#nullableFinalTopLevelFieldWithInitializer = #t14 : throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer") : #t13;
+static get nonNullableFinalTopLevelFieldWithInitializer() → core::int
+  return let final core::int #t15 = self::_#nonNullableFinalTopLevelFieldWithInitializer in _in::isSentinel(#t15) ?{core::int} let final core::int #t16 = 0 in _in::isSentinel(self::_#nonNullableFinalTopLevelFieldWithInitializer) ?{core::int} self::_#nonNullableFinalTopLevelFieldWithInitializer = #t16 : throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer") : #t15;
+static get neverTopLevelField() → Never
+  return let final Never? #t17 = self::_#neverTopLevelField in _in::isSentinel(#t17) ?{Never} throw new _in::LateError::fieldNI("neverTopLevelField") : #t17{Never};
+static set neverTopLevelField(Never #t18) → void
+  self::_#neverTopLevelField = #t18;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.modular.expect b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.modular.expect
new file mode 100644
index 0000000..98019ae
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering_sentinel/late_locals.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method test() → dynamic {
+  lowered core::int? #nullableTopLevelLocal = _in::createSentinel<core::int?>();
+  function #nullableTopLevelLocal#get() → core::int?
+    return let final core::int? #t1 = #nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::localNI("nullableTopLevelLocal") : #t1{core::int?};
+  function #nullableTopLevelLocal#set(core::int? #t2) → dynamic
+    return #nullableTopLevelLocal = #t2;
+  lowered core::int? #nonNullableTopLevelLocal = _in::createSentinel<core::int>();
+  function #nonNullableTopLevelLocal#get() → core::int
+    return let final core::int? #t3 = #nonNullableTopLevelLocal in _in::isSentinel(#t3) ?{core::int} throw new _in::LateError::localNI("nonNullableTopLevelLocal") : #t3{core::int};
+  function #nonNullableTopLevelLocal#set(core::int #t4) → dynamic
+    return #nonNullableTopLevelLocal = #t4;
+  lowered core::int? #nullableTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
+  function #nullableTopLevelLocalWithInitializer#get() → core::int?
+    return let final core::int? #t5 = #nullableTopLevelLocalWithInitializer in _in::isSentinel(#t5) ?{core::int?} #nullableTopLevelLocalWithInitializer = null : #t5{core::int?};
+  function #nullableTopLevelLocalWithInitializer#set(core::int? #t6) → dynamic
+    return #nullableTopLevelLocalWithInitializer = #t6;
+  lowered core::int? #nonNullableTopLevelLocalWithInitializer = _in::createSentinel<core::int>();
+  function #nonNullableTopLevelLocalWithInitializer#get() → core::int
+    return let final core::int? #t7 = #nonNullableTopLevelLocalWithInitializer in _in::isSentinel(#t7) ?{core::int} #nonNullableTopLevelLocalWithInitializer = 0 : #t7{core::int};
+  function #nonNullableTopLevelLocalWithInitializer#set(core::int #t8) → dynamic
+    return #nonNullableTopLevelLocalWithInitializer = #t8;
+  lowered final core::int? #nullableFinalTopLevelLocal = _in::createSentinel<core::int?>();
+  function #nullableFinalTopLevelLocal#get() → core::int?
+    return let final core::int? #t9 = #nullableFinalTopLevelLocal in _in::isSentinel(#t9) ?{core::int?} throw new _in::LateError::localNI("nullableFinalTopLevelLocal") : #t9{core::int?};
+  function #nullableFinalTopLevelLocal#set(core::int? #t10) → dynamic
+    if(_in::isSentinel(#nullableFinalTopLevelLocal))
+      return #nullableFinalTopLevelLocal = #t10;
+    else
+      throw new _in::LateError::localAI("nullableFinalTopLevelLocal");
+  lowered final core::int? #nonNullableFinalTopLevelLocal = _in::createSentinel<core::int>();
+  function #nonNullableFinalTopLevelLocal#get() → core::int
+    return let final core::int? #t11 = #nonNullableFinalTopLevelLocal in _in::isSentinel(#t11) ?{core::int} throw new _in::LateError::localNI("nonNullableFinalTopLevelLocal") : #t11{core::int};
+  function #nonNullableFinalTopLevelLocal#set(core::int #t12) → dynamic
+    if(_in::isSentinel(#nonNullableFinalTopLevelLocal))
+      return #nonNullableFinalTopLevelLocal = #t12;
+    else
+      throw new _in::LateError::localAI("nonNullableFinalTopLevelLocal");
+  lowered final core::int? #nullableFinalTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
+  function #nullableFinalTopLevelLocalWithInitializer#get() → core::int?
+    return let final core::int? #t13 = #nullableFinalTopLevelLocalWithInitializer in _in::isSentinel(#t13) ?{core::int?} let final core::int? #t14 = null in _in::isSentinel(#nullableFinalTopLevelLocalWithInitializer) ?{core::int?} #nullableFinalTopLevelLocalWithInitializer = #t14 : throw new _in::LateError::localADI("nullableFinalTopLevelLocalWithInitializer") : #t13;
+  lowered final core::int? #nonNullableFinalTopLevelLocalWithInitializer = _in::createSentinel<core::int>();
+  function #nonNullableFinalTopLevelLocalWithInitializer#get() → core::int
+    return let final core::int #t15 = #nonNullableFinalTopLevelLocalWithInitializer in _in::isSentinel(#t15) ?{core::int} let final core::int #t16 = 0 in _in::isSentinel(#nonNullableFinalTopLevelLocalWithInitializer) ?{core::int} #nonNullableFinalTopLevelLocalWithInitializer = #t16 : throw new _in::LateError::localADI("nonNullableFinalTopLevelLocalWithInitializer") : #t15;
+  lowered Null #neverLocal = _in::createSentinel<Never>();
+  function #neverLocal#get() → Never
+    return let final Never? #t17 = #neverLocal in _in::isSentinel(#t17) ?{Never} throw new _in::LateError::localNI("neverLocal") : #t17{Never};
+  function #neverLocal#set(Never #t18) → dynamic
+    return #neverLocal = #t18;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/macros/folder.options b/pkg/front_end/testcases/macros/folder.options
new file mode 100644
index 0000000..05bef8b
--- /dev/null
+++ b/pkg/front_end/testcases/macros/folder.options
@@ -0,0 +1 @@
+--enable-experiment=macros
\ No newline at end of file
diff --git a/pkg/front_end/testcases/macros/macro_class.dart b/pkg/front_end/testcases/macros/macro_class.dart
new file mode 100644
index 0000000..36ad13f
--- /dev/null
+++ b/pkg/front_end/testcases/macros/macro_class.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Super {}
+mixin Mixin {}
+
+macro class Class1 {}
+abstract macro class Class2 {}
+macro class Class3 = Super with Mixin;
+abstract macro class Class4 = Super with Mixin;
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/macros/macro_class.dart.strong.expect b/pkg/front_end/testcases/macros/macro_class.dart.strong.expect
new file mode 100644
index 0000000..d2dba25
--- /dev/null
+++ b/pkg/front_end/testcases/macros/macro_class.dart.strong.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+macro class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+abstract macro class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+macro class Class3 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract macro class Class4 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/macros/macro_class.dart.strong.transformed.expect b/pkg/front_end/testcases/macros/macro_class.dart.strong.transformed.expect
new file mode 100644
index 0000000..d100b6c
--- /dev/null
+++ b/pkg/front_end/testcases/macros/macro_class.dart.strong.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+macro class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+abstract macro class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+macro class Class3 extends self::Super implements self::Mixin /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract macro class Class4 extends self::Super implements self::Mixin /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/macros/macro_class.dart.textual_outline.expect b/pkg/front_end/testcases/macros/macro_class.dart.textual_outline.expect
new file mode 100644
index 0000000..d33df1d
--- /dev/null
+++ b/pkg/front_end/testcases/macros/macro_class.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+class Super {}
+mixin Mixin {}
+macro
+class Class1 {}
+abstract macro class Class2 {}
+macro
+class Class3 = Super with Mixin;
+abstract macro class Class4 = Super with Mixin;
+main() {}
diff --git a/pkg/front_end/testcases/macros/macro_class.dart.weak.expect b/pkg/front_end/testcases/macros/macro_class.dart.weak.expect
new file mode 100644
index 0000000..d2dba25
--- /dev/null
+++ b/pkg/front_end/testcases/macros/macro_class.dart.weak.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+macro class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+abstract macro class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+macro class Class3 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract macro class Class4 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/macros/macro_class.dart.weak.modular.expect b/pkg/front_end/testcases/macros/macro_class.dart.weak.modular.expect
new file mode 100644
index 0000000..d2dba25
--- /dev/null
+++ b/pkg/front_end/testcases/macros/macro_class.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+macro class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+abstract macro class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+macro class Class3 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract macro class Class4 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/macros/macro_class.dart.weak.outline.expect b/pkg/front_end/testcases/macros/macro_class.dart.weak.outline.expect
new file mode 100644
index 0000000..ecf4712
--- /dev/null
+++ b/pkg/front_end/testcases/macros/macro_class.dart.weak.outline.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+macro class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    ;
+}
+abstract macro class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    ;
+}
+macro class Class3 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract macro class Class4 = self::Super with self::Mixin {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/macros/macro_class.dart.weak.transformed.expect b/pkg/front_end/testcases/macros/macro_class.dart.weak.transformed.expect
new file mode 100644
index 0000000..d100b6c
--- /dev/null
+++ b/pkg/front_end/testcases/macros/macro_class.dart.weak.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+macro class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+}
+abstract macro class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+macro class Class3 extends self::Super implements self::Mixin /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::Class3
+    : super self::Super::•()
+    ;
+}
+abstract macro class Class4 extends self::Super implements self::Mixin /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::Class4
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/modular.status b/pkg/front_end/testcases/modular.status
new file mode 100644
index 0000000..3d6a84f
--- /dev/null
+++ b/pkg/front_end/testcases/modular.status
@@ -0,0 +1,89 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Status file for the modular_suite.dart test suite.
+
+constructor_tearoffs/call_instantiation: TypeCheckError
+constructor_tearoffs/lowering/invalid_redirect: VerificationError
+extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
+extension_types/call_not_get: ExpectationFileMismatchSerialized # Expected.
+extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
+extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
+extension_types/show_and_run_ceil: ExpectationFileMismatchSerialized # Expected.
+extension_types/simple: ExpectationFileMismatchSerialized # Expected.
+extension_types/simple_getter_resolution: ExpectationFileMismatchSerialized # Expected.
+extension_types/simple_method_resolution: ExpectationFileMismatchSerialized # Expected.
+extension_types/simple_operator_resolution: ExpectationFileMismatchSerialized # Expected.
+extension_types/simple_setter_resolution: ExpectationFileMismatchSerialized # Expected.
+extension_types/simple_show_hide: ExpectationFileMismatchSerialized # Expected.
+extension_types/type_variable_in_static_context: ExpectationFileMismatchSerialized # Expected.
+extensions/extension_setter_error: TypeCheckError
+general/abstract_members: TypeCheckError
+general/bounded_implicit_instantiation: TypeCheckError
+general/bug30695: TypeCheckError
+general/covariant_field: TypeCheckError
+general/crashes/crash_02/main: Crash
+general/crashes/crash_06/main: Crash
+general/duplicated_declarations: TypeCheckError
+general/getter_vs_setter_type: TypeCheckError
+general/implement_semi_stub: TypeCheckError
+general/implicit_super_call: TypeCheckError
+general/infer_field_from_multiple: TypeCheckError
+general/invalid_operator: TypeCheckError
+general/invalid_operator_override: TypeCheckError
+general/issue41210a: TypeCheckError
+general/issue41210b/issue41210.no_link: TypeCheckError
+general/issue41210b/issue41210: TypeCheckError
+general/issue44733: TypeCheckError
+general/mixin_application_override: ExpectationFileMismatch # Too many errors.
+general/mixin_application_override: TypeCheckError
+general/override_check_accessor_after_inference: TypeCheckError # Issue #31620
+general/override_check_accessor_basic: TypeCheckError # Issue #31620
+general/override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
+general/override_check_after_inference: TypeCheckError # Issue #31620
+general/override_check_basic: TypeCheckError # Issue #31620
+general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
+general/override_setter_with_field: TypeCheckError
+general/redirecting_factory_invocation_in_invalid: TypeCheckError
+general/super_semi_stub: TypeCheckError
+general/unsound_promotion: TypeCheckError
+inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
+inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
+inference/generic_methods_correctly_recognize_generic_upper_bound: TypeCheckError
+inference/generic_methods_do_not_infer_invalid_override_of_generic_method: TypeCheckError
+inference/generic_methods_handle_override_of_non_generic_with_generic: TypeCheckError
+inference/infer_method_missing_params: TypeCheckError
+inference/infer_types_on_generic_instantiations_infer: TypeCheckError
+inference/mixin_inference_outwards_3: TypeCheckError
+inference/mixin_inference_outwards_4: TypeCheckError
+inference/mixin_inference_unification_1: TypeCheckError
+inference/mixin_inference_unification_2: TypeCheckError
+inference_new/infer_assign_to_index_super_upwards: TypeCheckError
+inference_new/infer_assign_to_index_this_upwards: TypeCheckError
+inference_new/infer_assign_to_index_upwards: TypeCheckError
+late_lowering/covariant_late_field: TypeCheckError
+nnbd/covariant_late_field: TypeCheckError
+nnbd/getter_vs_setter_type: TypeCheckError
+nnbd/issue42603: TypeCheckError
+nnbd_mixed/bad_mixins: TypeCheckError
+nnbd_mixed/covariant_from_opt_in: TypeCheckError
+nnbd_mixed/hierarchy/conflict: TypeCheckError
+nnbd_mixed/hierarchy/duplicates: TypeCheckError
+nnbd_mixed/hierarchy/forwarding_semi_stub_field: TypeCheckError
+nnbd_mixed/hierarchy/forwarding_semi_stub_method: TypeCheckError
+nnbd_mixed/hierarchy/forwarding_semi_stub_setter: TypeCheckError
+nnbd_mixed/hierarchy/getter_setter: TypeCheckError
+nnbd_mixed/hierarchy/mix_in_override: TypeCheckError
+nnbd_mixed/hierarchy/override: TypeCheckError
+nnbd_mixed/inheritance_from_opt_in: TypeCheckError
+nnbd_mixed/issue41567: TypeCheckError
+nnbd_mixed/messages_with_types_opt_in: TypeCheckError
+nnbd_mixed/messages_with_types_opt_out: TypeCheckError
+rasta/mixin_library: TypeCheckError
+rasta/super: TypeCheckError
+rasta/super_mixin: TypeCheckError
+rasta/super_operator: TypeCheckError
+rasta/unresolved_recovery: TypeCheckError
+regress/issue_31180: TypeCheckError
+runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.modular.expect b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.modular.expect
new file mode 100644
index 0000000..2f58211
--- /dev/null
+++ b/pkg/front_end/testcases/named_arguments_anywhere/all_kinds.dart.weak.modular.expect
@@ -0,0 +1,78 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef B = self::A;
+class A extends core::Object {
+  constructor •(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    : super core::Object::•()
+    ;
+  static factory foo(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    return new self::A::•(x, y, z: z);
+  get property() → (core::int, core::int, {required z: core::int}) → void
+    return throw 42;
+  method bar(core::int x, core::int y, {required core::int z = #C1}) → void {}
+}
+class Test extends self::A {
+  constructor •() → self::Test
+    : super self::A::•(1, 2, z: 3)
+    ;
+  method test() → dynamic {
+    super.{self::A::bar}(1, 2, z: 3);
+    let final core::int #t1 = 1 in let final core::int #t2 = 2 in super.{self::A::bar}(#t1, 3, z: #t2);
+    let final core::int #t3 = 1 in super.{self::A::bar}(2, 3, z: #t3);
+  }
+}
+extension E on self::A {
+  method method1 = self::E|method1;
+  tearoff method1 = self::E|get#method1;
+  method method2 = self::E|method2;
+  tearoff method2 = self::E|get#method2;
+}
+static method foo(core::int x, core::int y, {required core::int z = #C1}) → dynamic {}
+static method E|method1(lowered final self::A #this) → dynamic {
+  let final self::A #t4 = #this in let final core::int #t5 = 1 in self::E|method2(#t4, 2, foo: #t5);
+}
+static method E|get#method1(lowered final self::A #this) → () → dynamic
+  return () → dynamic => self::E|method1(#this);
+static method E|method2(lowered final self::A #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
+static method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+  return (core::int bar, {core::int? foo = #C1}) → dynamic => self::E|method2(#this, bar, foo: foo);
+static method test(dynamic d, core::Function f, self::A a) → dynamic {
+  function local(core::int x, core::int y, {required core::int z = #C1}) → void {}
+  self::foo(1, 2, z: 3);
+  let final core::int #t6 = 1 in let final core::int #t7 = 2 in self::foo(#t6, 3, z: #t7);
+  let final core::int #t8 = 1 in self::foo(2, 3, z: #t8);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t9 = 1 in let final core::int #t10 = 2 in self::A::foo(#t9, 3, z: #t10);
+  let final core::int #t11 = 1 in self::A::foo(2, 3, z: #t11);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t12 = 1 in let final core::int #t13 = 2 in self::A::foo(#t12, 3, z: #t13);
+  let final core::int #t14 = 1 in self::A::foo(2, 3, z: #t14);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t15 = 1 in let final core::int #t16 = 2 in new self::A::•(#t15, 3, z: #t16);
+  let final core::int #t17 = 1 in new self::A::•(2, 3, z: #t17);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t18 = 1 in let final core::int #t19 = 2 in new self::A::•(#t18, 3, z: #t19);
+  let final core::int #t20 = 1 in new self::A::•(2, 3, z: #t20);
+  d{dynamic}.call(1, 2, z: 3);
+  let final core::int #t21 = 1 in let final core::int #t22 = 2 in d{dynamic}.call(#t21, 3, z: #t22);
+  let final core::int #t23 = 1 in d{dynamic}.call(2, 3, z: #t23);
+  f(1, 2, z: 3);
+  let final core::int #t24 = 1 in let final core::int #t25 = 2 in f(#t24, 3, z: #t25);
+  let final core::int #t26 = 1 in f(2, 3, z: #t26);
+  let final self::A #t27 = a in let final core::int #t28 = 1 in let final core::int #t29 = 2 in let final core::int #t30 = 3 in #t27.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t28, #t29, z: #t30){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t31 = a in let final core::int #t32 = 1 in let final core::int #t33 = 2 in let final core::int #t34 = 3 in #t31.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t32, #t34, z: #t33){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t35 = a in let final core::int #t36 = 1 in let final core::int #t37 = 2 in let final core::int #t38 = 3 in #t35.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t37, #t38, z: #t36){(core::int, core::int, {required z: core::int}) → void};
+  a.{self::A::bar}(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t39 = a in let final core::int #t40 = 1 in let final core::int #t41 = 2 in #t39.{self::A::bar}(#t40, 3, z: #t41){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t42 = a in let final core::int #t43 = 1 in #t42.{self::A::bar}(2, 3, z: #t43){(core::int, core::int, {required z: core::int}) → void};
+  local(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t44 = 1 in let final core::int #t45 = 2 in local(#t44, 3, z: #t45){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t46 = 1 in local(2, 3, z: #t46){(core::int, core::int, {required z: core::int}) → void};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.modular.expect b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.modular.expect
new file mode 100644
index 0000000..5b2dee8
--- /dev/null
+++ b/pkg/front_end/testcases/named_arguments_anywhere/redirecting_constructor_initializers.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •(core::int x, core::bool y, {required core::String z = #C2}) → self::A
+    : super core::Object::•()
+    ;
+  constructor foo() → self::A
+    : final core::int #t1 = 42, final core::String #t2 = "foo", this self::A::•(#t1, false, z: #t2)
+    ;
+  static factory bar(core::int x, core::bool y, {required core::String z = #C2}) → self::A
+    return new self::A::•(x, y, z: z);
+}
+class B extends self::A {
+  constructor •() → self::B
+    : final core::int #t3 = 42, final core::String #t4 = "foo", super self::A::•(#t3, false, z: #t4)
+    ;
+}
+static method test() → dynamic {
+  new self::A::•(42, false, z: "bar");
+  let final core::int #t5 = 42 in let final core::String #t6 = "bar" in new self::A::•(#t5, false, z: #t6);
+  let final core::String #t7 = "bar" in new self::A::•(42, false, z: #t7);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::bar
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.weak.modular.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.weak.modular.expect
new file mode 100644
index 0000000..47eae93
--- /dev/null
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field core::int* x;
+  const constructor •(core::int* x) → self::A*
+    : self::A::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::int* foo = 42;
+  new self::A::•(5);
+  new self::A::•(5.{core::num::+}(5){(core::num*) →* core::int*});
+  new self::A::•(foo);
+  new self::A::•(5.{core::num::+}(foo){(core::num*) →* core::int*});
+}
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.modular.expect
new file mode 100644
index 0000000..ce1c9c6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.modular.expect
@@ -0,0 +1,248 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:1: Error: Can't have modifier 'abstract' here.
+// Try removing 'abstract'.
+// abstract int topLevelField;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:7:1: Error: Can't have modifier 'abstract' here.
+// Try removing 'abstract'.
+// abstract final int finalTopLevelField = 0;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:9:1: Error: Can't have modifier 'abstract' here.
+// Try removing 'abstract'.
+// abstract const int constField = 0;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:20:3: Error: Static fields can't be declared 'abstract'.
+// Try removing the 'abstract' or 'static' keyword.
+//   abstract static int staticField;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:22:3: Error: Static fields can't be declared 'abstract'.
+// Try removing the 'abstract' or 'static' keyword.
+//   abstract static final int finalStaticField;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:24:3: Error: Abstract fields cannot be late.
+// Try removing the 'abstract' or 'late' keyword.
+//   abstract late int lateInstanceField;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   external abstract int externalInstanceField1;
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   external abstract final int externalFinalInstanceField1;
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   external abstract covariant num externalCovariantInstanceField1;
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   abstract external int externalInstanceField2;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   abstract external final int externalFinalInstanceField2;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   abstract external covariant num externalCovariantInstanceField2;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   external abstract late int externalLateInstanceField;
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Abstract fields cannot be late.
+// Try removing the 'abstract' or 'late' keyword.
+//   external abstract late int externalLateInstanceField;
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:42:3: Error: Static fields can't be declared 'abstract'.
+// Try removing the 'abstract' or 'static' keyword.
+//   abstract static int staticField;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:44:3: Error: Static fields can't be declared 'abstract'.
+// Try removing the 'abstract' or 'static' keyword.
+//   abstract static final int finalStaticField;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:46:12: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   external abstract int externalInstanceField;
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:48:12: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   external abstract final int externalFinalInstanceField;
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:50:12: Error: Fields can't be declared both 'abstract' and 'external'.
+// Try removing the 'abstract' or 'external' keyword.
+//   external abstract covariant num externalCovariantInstanceField;
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:55:16: Error: Extension fields can't be declared 'abstract'.
+// Try removing the 'abstract' keyword.
+//   abstract int extensionInstanceField;
+//                ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:55:16: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   abstract int extensionInstanceField;
+//                ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:56:22: Error: Extension fields can't be declared 'abstract'.
+// Try removing the 'abstract' keyword.
+//   abstract final int finalExtensionInstanceField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:56:22: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   abstract final int finalExtensionInstanceField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
+// Try removing the 'abstract' keyword.
+//   abstract static int extensionStaticField = 0;
+//                       ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
+// Try removing the 'abstract' or 'static' keyword.
+//   abstract static int extensionStaticField = 0;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
+// Try removing the 'abstract' keyword.
+//   abstract static final int finalExtensionStaticField = 0;
+//                             ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
+// Try removing the 'abstract' or 'static' keyword.
+//   abstract static final int finalExtensionStaticField = 0;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
+// abstract int topLevelField;
+//              ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:20:23: Error: Field 'staticField' should be initialized because its type 'int' doesn't allow null.
+//   abstract static int staticField;
+//                       ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:22:29: Error: Field 'finalStaticField' should be initialized because its type 'int' doesn't allow null.
+//   abstract static final int finalStaticField;
+//                             ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:42:23: Error: Field 'staticField' should be initialized because its type 'int' doesn't allow null.
+//   abstract static int staticField;
+//                       ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:44:29: Error: Field 'finalStaticField' should be initialized because its type 'int' doesn't allow null.
+//   abstract static final int finalStaticField;
+//                             ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:12:37: Error: Abstract fields cannot have initializers.
+// Try removing the initializer or the 'abstract' keyword.
+//   abstract int fieldWithInitializer = 0;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:18:10: Error: Abstract fields cannot have initializers.
+// Try removing the field initializer or the 'abstract' keyword from the field declaration.
+//   A(this.initializedField1) : this.initializedField2 = 0;
+//          ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:18:36: Error: Abstract fields cannot have initializers.
+// Try removing the field initializer or the 'abstract' keyword from the field declaration.
+//   A(this.initializedField1) : this.initializedField2 = 0;
+//                                    ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:22:29: Error: Final field 'finalStaticField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   abstract static final int finalStaticField;
+//                             ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:44:29: Error: Final field 'finalStaticField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   abstract static final int finalStaticField;
+//                             ^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  static field core::int staticField = null;
+  static final field core::int finalStaticField = null;
+  late field core::int lateInstanceField;
+  constructor •(core::int initializedField1) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/nnbd/abstract_field_errors.dart:18:10: Error: Abstract fields cannot have initializers.
+Try removing the field initializer or the 'abstract' keyword from the field declaration.
+  A(this.initializedField1) : this.initializedField2 = 0;
+         ^^^^^^^^^^^^^^^^^", final dynamic #t2 = invalid-expression "pkg/front_end/testcases/nnbd/abstract_field_errors.dart:18:36: Error: Abstract fields cannot have initializers.
+Try removing the field initializer or the 'abstract' keyword from the field declaration.
+  A(this.initializedField1) : this.initializedField2 = 0;
+                                   ^^^^^^^^^^^^^^^^^"
+    ;
+  abstract get fieldWithInitializer() → core::int;
+  abstract set fieldWithInitializer(core::int #externalFieldValue) → void;
+  abstract get initializedField1() → core::int;
+  abstract set initializedField1(core::int #externalFieldValue) → void;
+  abstract get initializedField2() → core::int;
+  abstract set initializedField2(core::int #externalFieldValue) → void;
+  external get externalInstanceField1() → core::int;
+  external set externalInstanceField1(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField1() → core::int;
+  external get externalCovariantInstanceField1() → core::num;
+  external set externalCovariantInstanceField1(covariant-by-declaration core::num #externalFieldValue) → void;
+  external get externalInstanceField2() → core::int;
+  external set externalInstanceField2(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField2() → core::int;
+  external get externalCovariantInstanceField2() → core::num;
+  external set externalCovariantInstanceField2(covariant-by-declaration core::num #externalFieldValue) → void;
+  external get externalLateInstanceField() → core::int;
+  external set externalLateInstanceField(core::int #externalFieldValue) → void;
+}
+abstract class B extends core::Object /*isMixinDeclaration*/  {
+  static field core::int staticField = null;
+  static final field core::int finalStaticField = null;
+  external get externalInstanceField() → core::int;
+  external set externalInstanceField(core::int #externalFieldValue) → void;
+  external get externalFinalInstanceField() → core::int;
+  external get externalCovariantInstanceField() → core::num;
+  external set externalCovariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
+}
+extension Extension on self::A {
+  get extensionInstanceField = get self::Extension|extensionInstanceField;
+  set extensionInstanceField = set self::Extension|extensionInstanceField;
+  get finalExtensionInstanceField = get self::Extension|finalExtensionInstanceField;
+  static field extensionStaticField = self::Extension|extensionStaticField;
+  static field finalExtensionStaticField = self::Extension|finalExtensionStaticField;
+}
+static field core::int topLevelField;
+static final field core::int finalTopLevelField = 0;
+static const field core::int constField = #C1;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
+static abstract get Extension|extensionInstanceField() → core::int;
+static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
+static abstract get Extension|finalExtensionInstanceField() → core::int;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/nnbd/abstract_fields.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/abstract_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..f9cfd21
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/abstract_fields.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract get instanceField() → core::int;
+  abstract set instanceField(core::int #externalFieldValue) → void;
+  abstract get finalInstanceField() → core::int;
+  abstract get covariantInstanceField() → core::num;
+  abstract set covariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
+}
+abstract class B extends core::Object /*isMixinDeclaration*/  {
+  abstract get instanceField() → core::int;
+  abstract set instanceField(core::int #externalFieldValue) → void;
+  abstract get finalInstanceField() → core::int;
+  abstract get covariantInstanceField() → core::num;
+  abstract set covariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/abstract_fields_spec.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/abstract_fields_spec.dart.weak.modular.expect
new file mode 100644
index 0000000..efa8606
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/abstract_fields_spec.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract get i1() → core::int;
+  abstract set i1(core::int #externalFieldValue) → void;
+  abstract get i2() → core::int;
+  abstract set i2(core::int #externalFieldValue) → void;
+  abstract get x() → dynamic;
+  abstract set x(dynamic #externalFieldValue) → void;
+  abstract get fi() → core::int;
+  abstract get fx() → dynamic;
+  abstract get cn() → core::num;
+  abstract set cn(covariant-by-declaration core::num #externalFieldValue) → void;
+  abstract get cx() → dynamic;
+  abstract set cx(covariant-by-declaration dynamic #externalFieldValue) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.modular.expect
new file mode 100644
index 0000000..02aa3e0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/ambiguous_main_export.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///ambiguous_main_export_lib0.dart";
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/ambiguous_main_export_lib0.dart:6:1: Error: 'main' is exported from both 'pkg/front_end/testcases/nnbd/ambiguous_main_export_lib1.dart' and 'pkg/front_end/testcases/nnbd/ambiguous_main_export_lib2.dart'.
+// export 'ambiguous_main_export_lib2.dart';
+// ^
+//
+import self as self2;
+import "dart:core" as core;
+
+export "org-dartlang-testcase:///ambiguous_main_export_lib1.dart";
+export "org-dartlang-testcase:///ambiguous_main_export_lib2.dart";
+
+static const field dynamic _exports# = #C1 /*isLegacy*/;
+
+library /*isNonNullableByDefault*/;
+import self as self3;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(42);
+}
+
+library /*isNonNullableByDefault*/;
+import self as self4;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(87);
+}
+
+constants  {
+  #C1 = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/nnbd/ambiguous_main_export_lib1.dart' and 'pkg/front_end/testcases/nnbd/ambiguous_main_export_lib2.dart'.\"}"
+}
diff --git a/pkg/front_end/testcases/nnbd/assign_type_variable.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/assign_type_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..e981e5c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assign_type_variable.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class<E extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::E%>
+    : super core::Object::•()
+    ;
+  method method(covariant-by-class self::Class::E% e) → void {
+    e = self::id<self::Class::E%>(e);
+    e = self::id<self::Class::E%>(e);
+    if(!(e == null)) {
+      self::Class::E% e2 = e{self::Class::E% & core::Object /* '%' & '!' = '!' */};
+      e2 = self::id<self::Class::E%>(e{self::Class::E% & core::Object /* '%' & '!' = '!' */});
+      e2 = self::id<self::Class::E%>(e{self::Class::E% & core::Object /* '%' & '!' = '!' */});
+      e2 = self::id<self::Class::E%>(e2);
+      e2 = self::id<self::Class::E%>(e2);
+    }
+  }
+}
+static method id<T extends core::Object? = dynamic>(self::id::T% t) → self::id::T%
+  return t;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.modular.expect
new file mode 100644
index 0000000..5603cdc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.modular.expect
@@ -0,0 +1,1790 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   Object objectVar = objectNullableArg;
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = numNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = intNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = doubleNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
+//  - 'Function' is from 'dart:core'.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = functionNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = toVoidNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = tearoffableNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = xNonNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = xPotentiallyNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = xPotentiallyNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = yNonNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = yPotentiallyNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   objectVar = yPotentiallyNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
+//  - 'Object' is from 'dart:core'.
+//   num numVar = objectArg;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
+//  - 'Object' is from 'dart:core'.
+//   numVar = objectNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
+//   numVar = numNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
+//   numVar = intNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
+//   numVar = doubleNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
+//  - 'Function' is from 'dart:core'.
+//   numVar = functionArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
+//  - 'Function' is from 'dart:core'.
+//   numVar = functionNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
+//   numVar = toVoidArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
+//   numVar = toVoidNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   numVar = tearoffableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   numVar = tearoffableNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
+//   numVar = xNonNullArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
+//   numVar = xNonNullNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
+//   numVar = xPotentiallyNullArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
+//   numVar = xPotentiallyNullNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
+//   numVar = yNonNullArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
+//   numVar = yNonNullNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
+//   numVar = yPotentiallyNullArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
+//   numVar = yPotentiallyNullNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
+//  - 'Object' is from 'dart:core'.
+//   int intVar = objectArg;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
+//  - 'Object' is from 'dart:core'.
+//   intVar = objectNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   intVar = numArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
+//   intVar = numNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//   intVar = intNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   intVar = doubleArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
+//   intVar = doubleNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
+//  - 'Function' is from 'dart:core'.
+//   intVar = functionArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
+//  - 'Function' is from 'dart:core'.
+//   intVar = functionNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
+//   intVar = toVoidArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
+//   intVar = toVoidNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   intVar = tearoffableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   intVar = tearoffableNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
+//   intVar = xNonNullArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
+//   intVar = xNonNullNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
+//   intVar = xPotentiallyNullArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
+//   intVar = xPotentiallyNullNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
+//   intVar = yNonNullArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
+//   intVar = yNonNullNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
+//   intVar = yPotentiallyNullArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
+//   intVar = yPotentiallyNullNullableArg;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
+//  - 'Object' is from 'dart:core'.
+//   double doubleVar = objectArg;
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
+//  - 'Object' is from 'dart:core'.
+//   doubleVar = objectNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   doubleVar = numArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
+//   doubleVar = numNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+//   doubleVar = intArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
+//   doubleVar = intNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
+//   doubleVar = doubleNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
+//  - 'Function' is from 'dart:core'.
+//   doubleVar = functionArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
+//  - 'Function' is from 'dart:core'.
+//   doubleVar = functionNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
+//   doubleVar = toVoidArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
+//   doubleVar = toVoidNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   doubleVar = tearoffableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   doubleVar = tearoffableNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
+//   doubleVar = xNonNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
+//   doubleVar = xNonNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
+//   doubleVar = xPotentiallyNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
+//   doubleVar = xPotentiallyNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
+//   doubleVar = yNonNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
+//   doubleVar = yNonNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
+//   doubleVar = yPotentiallyNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
+//   doubleVar = yPotentiallyNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Function' is from 'dart:core'.
+//   Function functionVar = objectArg;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = objectNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = numArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = numNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = intArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = intNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = doubleArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = doubleNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = functionNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = toVoidNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
+//   functionVar = tearoffableNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = xNonNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = xNonNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = xPotentiallyNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = xPotentiallyNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = yNonNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = yNonNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = yPotentiallyNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+//  - 'Function' is from 'dart:core'.
+//   functionVar = yPotentiallyNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
+//  - 'Object' is from 'dart:core'.
+//   void Function() toVoidVar = objectArg;
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
+//  - 'Object' is from 'dart:core'.
+//   toVoidVar = objectNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = numArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = numNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = intArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = intNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = doubleArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = doubleNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
+//  - 'Function' is from 'dart:core'.
+//   toVoidVar = functionArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
+//  - 'Function' is from 'dart:core'.
+//   toVoidVar = functionNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
+//   toVoidVar = toVoidNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
+//   toVoidVar = tearoffableNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = xNonNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = xNonNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = xPotentiallyNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = xPotentiallyNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = yNonNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = yNonNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = yPotentiallyNullArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+//   toVoidVar = yPotentiallyNullNullableArg;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   Tearoffable tearoffableVar = objectArg;
+//                                ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = objectNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = numArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = numNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = intArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = intNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = doubleArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = doubleNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Function' is from 'dart:core'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = functionArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Function' is from 'dart:core'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = functionNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = toVoidArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = toVoidNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = tearoffableNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = xNonNullArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = xNonNullNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = xPotentiallyNullArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = xPotentiallyNullNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = yNonNullArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = yNonNullNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = yPotentiallyNullArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   tearoffableVar = yPotentiallyNullNullableArg;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
+//  - 'Object' is from 'dart:core'.
+//   XnonNull xNonNullVar = objectArg;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
+//  - 'Object' is from 'dart:core'.
+//   xNonNullVar = objectNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = numArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = numNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = intArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = intNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = doubleArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = doubleNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
+//  - 'Function' is from 'dart:core'.
+//   xNonNullVar = functionArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
+//  - 'Function' is from 'dart:core'.
+//   xNonNullVar = functionNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = toVoidArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = toVoidNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   xNonNullVar = tearoffableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   xNonNullVar = tearoffableNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
+//   xNonNullVar = xNonNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = xPotentiallyNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = xPotentiallyNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
+//   xNonNullVar = yNonNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = yPotentiallyNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+//   xNonNullVar = yPotentiallyNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
+//  - 'Object' is from 'dart:core'.
+//   XpotentiallyNull xPotentiallyNullVar = objectArg;
+//                                          ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//  - 'Object' is from 'dart:core'.
+//   xPotentiallyNullVar = objectNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = numArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = numNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = intArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = intNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = doubleArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = doubleNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
+//  - 'Function' is from 'dart:core'.
+//   xPotentiallyNullVar = functionArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//  - 'Function' is from 'dart:core'.
+//   xPotentiallyNullVar = functionNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = toVoidArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = toVoidNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   xPotentiallyNullVar = tearoffableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   xPotentiallyNullVar = tearoffableNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = xNonNullArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = xNonNullNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
+//   xPotentiallyNullVar = xPotentiallyNullNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = yNonNullArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+//   xPotentiallyNullVar = yNonNullNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
+//   xPotentiallyNullVar = yPotentiallyNullNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
+//  - 'Object' is from 'dart:core'.
+//   YnonNull yNonNullVar = objectArg;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
+//  - 'Object' is from 'dart:core'.
+//   yNonNullVar = objectNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = numArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = numNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = intArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = intNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = doubleArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = doubleNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
+//  - 'Function' is from 'dart:core'.
+//   yNonNullVar = functionArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
+//  - 'Function' is from 'dart:core'.
+//   yNonNullVar = functionNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = toVoidArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = toVoidNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   yNonNullVar = tearoffableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   yNonNullVar = tearoffableNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = xNonNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = xNonNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = xPotentiallyNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = xPotentiallyNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
+//   yNonNullVar = yNonNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = yPotentiallyNullArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+//   yNonNullVar = yPotentiallyNullNullableArg;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
+//  - 'Object' is from 'dart:core'.
+//   YpotentiallyNull yPotentiallyNullVar = objectArg;
+//                                          ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//  - 'Object' is from 'dart:core'.
+//   yPotentiallyNullVar = objectNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = numArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = numNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = intArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = intNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = doubleArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = doubleNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
+//  - 'Function' is from 'dart:core'.
+//   yPotentiallyNullVar = functionArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//  - 'Function' is from 'dart:core'.
+//   yPotentiallyNullVar = functionNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = toVoidArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = toVoidNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   yPotentiallyNullVar = tearoffableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+//   yPotentiallyNullVar = tearoffableNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = xNonNullArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = xNonNullNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = xPotentiallyNullArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = xPotentiallyNullNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = yNonNullArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+//   yPotentiallyNullVar = yNonNullNullableArg;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
+//   yPotentiallyNullVar = yPotentiallyNullNullableArg;
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Tearoffable extends core::Object {
+  synthetic constructor •() → self::Tearoffable
+    : super core::Object::•()
+    ;
+  method call() → void {}
+}
+static method ok<XnonNull extends core::Object, YnonNull extends self::ok::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::ok::XpotentiallyNull% = core::Object?>(dynamic dynamicArg, core::Object objectArg, core::num numArg, core::int intArg, core::double doubleArg, core::Function functionArg, () → void toVoidArg, self::Tearoffable tearoffableArg, self::ok::XnonNull xNonNullArg, self::ok::XpotentiallyNull% xPotentiallyNullArg, self::ok::YnonNull yNonNullArg, self::ok::YpotentiallyNull% yPotentiallyNullArg) → dynamic {
+  dynamic dynamicVar = dynamicArg;
+  dynamicVar = objectArg;
+  dynamicVar = numArg;
+  dynamicVar = intArg;
+  dynamicVar = doubleArg;
+  dynamicVar = functionArg;
+  dynamicVar = toVoidArg;
+  dynamicVar = tearoffableArg;
+  dynamicVar = xNonNullArg;
+  dynamicVar = xPotentiallyNullArg;
+  dynamicVar = yNonNullArg;
+  dynamicVar = yPotentiallyNullArg;
+  core::Object objectVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object;
+  objectVar = objectArg;
+  objectVar = numArg;
+  objectVar = intArg;
+  objectVar = functionArg;
+  objectVar = toVoidArg;
+  objectVar = tearoffableArg;
+  objectVar = xNonNullArg;
+  objectVar = yNonNullArg;
+  core::num numVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::num;
+  numVar = numArg;
+  numVar = intArg;
+  numVar = doubleArg;
+  core::int intVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  intVar = intArg;
+  core::double doubleVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::double;
+  doubleVar = doubleArg;
+  core::Function functionVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Function;
+  functionVar = functionArg;
+  functionVar = toVoidArg;
+  functionVar = let final self::Tearoffable #t1 = tearoffableArg in #t1 == null ?{() → void} null : #t1.{self::Tearoffable::call}{() → void};
+  () → void toVoidVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} () → void;
+  toVoidVar = toVoidArg;
+  toVoidVar = let final self::Tearoffable #t2 = tearoffableArg in #t2 == null ?{() → void} null : #t2.{self::Tearoffable::call}{() → void};
+  self::Tearoffable tearoffableVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = tearoffableArg;
+  self::ok::XnonNull xNonNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::XnonNull;
+  xNonNullVar = xNonNullArg;
+  xNonNullVar = yNonNullArg;
+  self::ok::YnonNull yNonNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::YnonNull;
+  yNonNullVar = yNonNullArg;
+  self::ok::XpotentiallyNull% xPotentiallyNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::XpotentiallyNull%;
+  xPotentiallyNullVar = xPotentiallyNullArg;
+  xPotentiallyNullVar = yPotentiallyNullArg;
+  self::ok::YpotentiallyNull% yPotentiallyNullVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} self::ok::YpotentiallyNull%;
+  yPotentiallyNullVar = yPotentiallyNullArg;
+}
+static method error<XnonNull extends core::Object, YnonNull extends self::error::XnonNull = core::Object, XpotentiallyNull extends core::Object?, YpotentiallyNull extends self::error::XpotentiallyNull% = core::Object?>(core::Object objectArg, core::Object? objectNullableArg, core::num numArg, core::num? numNullableArg, core::int intArg, core::int? intNullableArg, core::double doubleArg, core::double? doubleNullableArg, core::Function functionArg, core::Function? functionNullableArg, () → void toVoidArg, () →? void toVoidNullableArg, self::Tearoffable tearoffableArg, self::Tearoffable? tearoffableNullableArg, self::error::XnonNull xNonNullArg, self::error::XnonNull? xNonNullNullableArg, self::error::XpotentiallyNull% xPotentiallyNullArg, self::error::XpotentiallyNull? xPotentiallyNullNullableArg, self::error::YnonNull yNonNullArg, self::error::YnonNull? yNonNullNullableArg, self::error::YpotentiallyNull% yPotentiallyNullArg, self::error::YpotentiallyNull? yPotentiallyNullNullableArg) → dynamic {
+  core::Object objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:114:22: Error: A value of type 'Object?' can't be assigned to a variable of type 'Object' because 'Object?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  Object objectVar = objectNullableArg;
+                     ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:115:15: Error: A value of type 'num?' can't be assigned to a variable of type 'Object' because 'num?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = numNullableArg;
+              ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:116:15: Error: A value of type 'int?' can't be assigned to a variable of type 'Object' because 'int?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = intNullableArg;
+              ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:117:15: Error: A value of type 'double?' can't be assigned to a variable of type 'Object' because 'double?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = doubleNullableArg;
+              ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:118:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'Object' because 'Function?' is nullable and 'Object' isn't.
+ - 'Function' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
+  objectVar = functionNullableArg;
+              ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:119:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Object' because 'void Function()?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = toVoidNullableArg;
+              ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:120:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Object' because 'Tearoffable?' is nullable and 'Object' isn't.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+ - 'Object' is from 'dart:core'.
+  objectVar = tearoffableNullableArg;
+              ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:121:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Object' because 'XnonNull?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = xNonNullNullableArg;
+              ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:122:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = xPotentiallyNullArg;
+              ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:123:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'XpotentiallyNull?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = xPotentiallyNullNullableArg;
+              ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:124:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Object' because 'YnonNull?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = yNonNullNullableArg;
+              ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:125:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = yPotentiallyNullArg;
+              ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Object;
+  objectVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:126:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Object' because 'YpotentiallyNull?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  objectVar = yPotentiallyNullNullableArg;
+              ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  core::num numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
+ - 'Object' is from 'dart:core'.
+  num numVar = objectArg;
+               ^" in objectArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
+ - 'Object' is from 'dart:core'.
+  numVar = objectNullableArg;
+           ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:130:12: Error: A value of type 'num?' can't be assigned to a variable of type 'num' because 'num?' is nullable and 'num' isn't.
+  numVar = numNullableArg;
+           ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:131:12: Error: A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
+  numVar = intNullableArg;
+           ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:132:12: Error: A value of type 'double?' can't be assigned to a variable of type 'num' because 'double?' is nullable and 'num' isn't.
+  numVar = doubleNullableArg;
+           ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:133:12: Error: A value of type 'Function' can't be assigned to a variable of type 'num'.
+ - 'Function' is from 'dart:core'.
+  numVar = functionArg;
+           ^" in functionArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
+ - 'Function' is from 'dart:core'.
+  numVar = functionNullableArg;
+           ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
+  numVar = toVoidArg;
+           ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
+  numVar = toVoidNullableArg;
+           ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  numVar = tearoffableArg;
+           ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  numVar = tearoffableNullableArg;
+           ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
+  numVar = xNonNullArg;
+           ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
+  numVar = xNonNullNullableArg;
+           ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
+  numVar = xPotentiallyNullArg;
+           ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
+  numVar = xPotentiallyNullNullableArg;
+           ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
+  numVar = yNonNullArg;
+           ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
+  numVar = yNonNullNullableArg;
+           ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
+  numVar = yPotentiallyNullArg;
+           ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
+  numVar = yPotentiallyNullNullableArg;
+           ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+  core::int intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+  int intVar = objectArg;
+               ^" in objectArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+  intVar = objectNullableArg;
+           ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  intVar = numArg;
+           ^" in numArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:151:12: Error: A value of type 'num?' can't be assigned to a variable of type 'int'.
+  intVar = numNullableArg;
+           ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:152:12: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  intVar = intNullableArg;
+           ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:153:12: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  intVar = doubleArg;
+           ^" in doubleArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
+  intVar = doubleNullableArg;
+           ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
+ - 'Function' is from 'dart:core'.
+  intVar = functionArg;
+           ^" in functionArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
+ - 'Function' is from 'dart:core'.
+  intVar = functionNullableArg;
+           ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
+  intVar = toVoidArg;
+           ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
+  intVar = toVoidNullableArg;
+           ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  intVar = tearoffableArg;
+           ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  intVar = tearoffableNullableArg;
+           ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
+  intVar = xNonNullArg;
+           ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
+  intVar = xNonNullNullableArg;
+           ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
+  intVar = xPotentiallyNullArg;
+           ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
+  intVar = xPotentiallyNullNullableArg;
+           ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
+  intVar = yNonNullArg;
+           ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
+  intVar = yNonNullNullableArg;
+           ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
+  intVar = yPotentiallyNullArg;
+           ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
+  intVar = yPotentiallyNullNullableArg;
+           ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  core::double doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+  double doubleVar = objectArg;
+                     ^" in objectArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+  doubleVar = objectNullableArg;
+              ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  doubleVar = numArg;
+              ^" in numArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
+  doubleVar = numNullableArg;
+              ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+  doubleVar = intArg;
+              ^" in intArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:175:15: Error: A value of type 'int?' can't be assigned to a variable of type 'double'.
+  doubleVar = intNullableArg;
+              ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:176:15: Error: A value of type 'double?' can't be assigned to a variable of type 'double' because 'double?' is nullable and 'double' isn't.
+  doubleVar = doubleNullableArg;
+              ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:177:15: Error: A value of type 'Function' can't be assigned to a variable of type 'double'.
+ - 'Function' is from 'dart:core'.
+  doubleVar = functionArg;
+              ^" in functionArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
+ - 'Function' is from 'dart:core'.
+  doubleVar = functionNullableArg;
+              ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
+  doubleVar = toVoidArg;
+              ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
+  doubleVar = toVoidNullableArg;
+              ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  doubleVar = tearoffableArg;
+              ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  doubleVar = tearoffableNullableArg;
+              ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
+  doubleVar = xNonNullArg;
+              ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = xNonNullNullableArg;
+              ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
+  doubleVar = xPotentiallyNullArg;
+              ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = xPotentiallyNullNullableArg;
+              ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
+  doubleVar = yNonNullArg;
+              ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = yNonNullNullableArg;
+              ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
+  doubleVar = yPotentiallyNullArg;
+              ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = yPotentiallyNullNullableArg;
+              ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  core::Function functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+  Function functionVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+  functionVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = numArg;
+                ^" in numArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = numNullableArg;
+                ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = intArg;
+                ^" in intArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = intNullableArg;
+                ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = doubleArg;
+                ^" in doubleArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = doubleNullableArg;
+                ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:200:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'Function' because 'Function?' is nullable and 'Function' isn't.
+ - 'Function' is from 'dart:core'.
+  functionVar = functionNullableArg;
+                ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:201:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Function' because 'void Function()?' is nullable and 'Function' isn't.
+ - 'Function' is from 'dart:core'.
+  functionVar = toVoidNullableArg;
+                ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
+  functionVar = tearoffableNullableArg;
+                ^" in tearoffableNullableArg as{TypeError} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = xNonNullArg;
+                ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = xNonNullNullableArg;
+                ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = xPotentiallyNullArg;
+                ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = xPotentiallyNullNullableArg;
+                ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = yNonNullArg;
+                ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = yNonNullNullableArg;
+                ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = yPotentiallyNullArg;
+                ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+ - 'Function' is from 'dart:core'.
+  functionVar = yPotentiallyNullNullableArg;
+                ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  () → void toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+  void Function() toVoidVar = objectArg;
+                              ^" in objectArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+  toVoidVar = objectNullableArg;
+              ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = numArg;
+              ^" in numArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = numNullableArg;
+              ^" in numNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = intArg;
+              ^" in intArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = intNullableArg;
+              ^" in intNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = doubleArg;
+              ^" in doubleArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = doubleNullableArg;
+              ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
+ - 'Function' is from 'dart:core'.
+  toVoidVar = functionArg;
+              ^" in functionArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
+ - 'Function' is from 'dart:core'.
+  toVoidVar = functionNullableArg;
+              ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:222:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'void Function()' because 'void Function()?' is nullable and 'void Function()' isn't.
+  toVoidVar = toVoidNullableArg;
+              ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
+  toVoidVar = tearoffableNullableArg;
+              ^" in tearoffableNullableArg as{TypeError} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = xNonNullArg;
+              ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = xNonNullNullableArg;
+              ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = xPotentiallyNullArg;
+              ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = xPotentiallyNullNullableArg;
+              ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = yNonNullArg;
+              ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = yNonNullNullableArg;
+              ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = yPotentiallyNullArg;
+              ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = yPotentiallyNullNullableArg;
+              ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  self::Tearoffable tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  Tearoffable tearoffableVar = objectArg;
+                               ^" in objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = objectNullableArg;
+                   ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = numArg;
+                   ^" in numArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = numNullableArg;
+                   ^" in numNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = intArg;
+                   ^" in intArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = intNullableArg;
+                   ^" in intNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = doubleArg;
+                   ^" in doubleArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = doubleNullableArg;
+                   ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Function' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = functionArg;
+                   ^" in functionArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Function' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = functionNullableArg;
+                   ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = toVoidArg;
+                   ^" in toVoidArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = toVoidNullableArg;
+                   ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:245:20: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'Tearoffable' because 'Tearoffable?' is nullable and 'Tearoffable' isn't.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = tearoffableNullableArg;
+                   ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = xNonNullArg;
+                   ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = xNonNullNullableArg;
+                   ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = xPotentiallyNullArg;
+                   ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = xPotentiallyNullNullableArg;
+                   ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = yNonNullArg;
+                   ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = yNonNullNullableArg;
+                   ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = yPotentiallyNullArg;
+                   ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = yPotentiallyNullNullableArg;
+                   ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  self::error::XnonNull xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+  XnonNull xNonNullVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+  xNonNullVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = numArg;
+                ^" in numArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = numNullableArg;
+                ^" in numNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = intArg;
+                ^" in intArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = intNullableArg;
+                ^" in intNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = doubleArg;
+                ^" in doubleArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = doubleNullableArg;
+                ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
+ - 'Function' is from 'dart:core'.
+  xNonNullVar = functionArg;
+                ^" in functionArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
+ - 'Function' is from 'dart:core'.
+  xNonNullVar = functionNullableArg;
+                ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = toVoidArg;
+                ^" in toVoidArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = toVoidNullableArg;
+                ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  xNonNullVar = tearoffableArg;
+                ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  xNonNullVar = tearoffableNullableArg;
+                ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:269:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XnonNull' because 'XnonNull?' is nullable and 'XnonNull' isn't.
+  xNonNullVar = xNonNullNullableArg;
+                ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:270:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = xPotentiallyNullArg;
+                ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:271:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = xPotentiallyNullNullableArg;
+                ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:272:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XnonNull' because 'YnonNull?' is nullable and 'XnonNull' isn't.
+  xNonNullVar = yNonNullNullableArg;
+                ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:273:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = yPotentiallyNullArg;
+                ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} Never;
+  xNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = yPotentiallyNullNullableArg;
+                ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  self::error::XpotentiallyNull% xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  XpotentiallyNull xPotentiallyNullVar = objectArg;
+                                         ^" in objectArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  xPotentiallyNullVar = objectNullableArg;
+                        ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = numArg;
+                        ^" in numArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = numNullableArg;
+                        ^" in numNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = intArg;
+                        ^" in intArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = intNullableArg;
+                        ^" in intNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = doubleArg;
+                        ^" in doubleArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = doubleNullableArg;
+                        ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Function' is from 'dart:core'.
+  xPotentiallyNullVar = functionArg;
+                        ^" in functionArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Function' is from 'dart:core'.
+  xPotentiallyNullVar = functionNullableArg;
+                        ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = toVoidArg;
+                        ^" in toVoidArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = toVoidNullableArg;
+                        ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  xPotentiallyNullVar = tearoffableArg;
+                        ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  xPotentiallyNullVar = tearoffableNullableArg;
+                        ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = xNonNullArg;
+                        ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:291:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = xNonNullNullableArg;
+                        ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:292:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'XpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
+  xPotentiallyNullVar = xPotentiallyNullNullableArg;
+                        ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:293:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = yNonNullArg;
+                        ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:294:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = yNonNullNullableArg;
+                        ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  xPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:295:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'XpotentiallyNull' isn't.
+  xPotentiallyNullVar = yPotentiallyNullNullableArg;
+                        ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  self::error::YnonNull yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:297:26: Error: A value of type 'Object' can't be assigned to a variable of type 'YnonNull'.
+ - 'Object' is from 'dart:core'.
+  YnonNull yNonNullVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
+ - 'Object' is from 'dart:core'.
+  yNonNullVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = numArg;
+                ^" in numArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = numNullableArg;
+                ^" in numNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = intArg;
+                ^" in intArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = intNullableArg;
+                ^" in intNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = doubleArg;
+                ^" in doubleArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = doubleNullableArg;
+                ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
+ - 'Function' is from 'dart:core'.
+  yNonNullVar = functionArg;
+                ^" in functionArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
+ - 'Function' is from 'dart:core'.
+  yNonNullVar = functionNullableArg;
+                ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = toVoidArg;
+                ^" in toVoidArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = toVoidNullableArg;
+                ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  yNonNullVar = tearoffableArg;
+                ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  yNonNullVar = tearoffableNullableArg;
+                ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = xNonNullArg;
+                ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = xNonNullNullableArg;
+                ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = xPotentiallyNullArg;
+                ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:314:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = xPotentiallyNullNullableArg;
+                ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:315:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YnonNull' because 'YnonNull?' is nullable and 'YnonNull' isn't.
+  yNonNullVar = yNonNullNullableArg;
+                ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:316:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = yPotentiallyNullArg;
+                ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} Never;
+  yNonNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = yPotentiallyNullNullableArg;
+                ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  self::error::YpotentiallyNull% yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  YpotentiallyNull yPotentiallyNullVar = objectArg;
+                                         ^" in objectArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  yPotentiallyNullVar = objectNullableArg;
+                        ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = numArg;
+                        ^" in numArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = numNullableArg;
+                        ^" in numNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = intArg;
+                        ^" in intArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = intNullableArg;
+                        ^" in intNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = doubleArg;
+                        ^" in doubleArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = doubleNullableArg;
+                        ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Function' is from 'dart:core'.
+  yPotentiallyNullVar = functionArg;
+                        ^" in functionArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Function' is from 'dart:core'.
+  yPotentiallyNullVar = functionNullableArg;
+                        ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = toVoidArg;
+                        ^" in toVoidArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = toVoidNullableArg;
+                        ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  yPotentiallyNullVar = tearoffableArg;
+                        ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  yPotentiallyNullVar = tearoffableNullableArg;
+                        ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = xNonNullArg;
+                        ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = xNonNullNullableArg;
+                        ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = xPotentiallyNullArg;
+                        ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = xPotentiallyNullNullableArg;
+                        ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = yNonNullArg;
+                        ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:338:25: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = yNonNullNullableArg;
+                        ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+  yPotentiallyNullVar = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:339:25: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull' because 'YpotentiallyNull?' is nullable and 'YpotentiallyNull' isn't.
+  yPotentiallyNullVar = yPotentiallyNullNullableArg;
+                        ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} Never;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.modular.expect
new file mode 100644
index 0000000..1f4c1bb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/assignability_error_messages.dart.weak.modular.expect
@@ -0,0 +1,393 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a = x; // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A>[...l]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A>[...l2]; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <A, A>{...m}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   <A, A>{...m2}; // Error.
+//             ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (A y in l) {} // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (A y in l2) {} // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:36:16: Error: Type 'A' of the case expression is not a subtype of type 'B?' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     case const A():
+//                ^
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:35:11: Context: The switch expression is here.
+//   switch (x) /*  Error. */ {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return x; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<B?>.value(x); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   barContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   List<A> y = x; // Error.
+//               ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>>[...l]; // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   <List<A>, List<A>>{...m}; // Error.
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+// Try changing the type of the variable.
+//   for (List<A> y in l) {} // Error.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   return x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+//   bazContext(c);
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(x); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   fooContext(null); // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a1 = x; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//   A a2 = null; // Error.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return x; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//     return null; // Error.
+//            ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return null; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+//       return new Future<Null>.value(null); // Error.
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::num? {}
+}
+static method fooContext(self::A x) → void {}
+static method barContext(core::List<self::A> x) → void {}
+static method bazContext(() → core::num f) → void {}
+static method foo(self::B? x, core::List<self::B?> l, core::Map<self::B?, self::B?> m, core::List<self::B>? l2, core::Map<self::B, self::B>? m2) → self::A {
+  self::fooContext(invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:27:14: Error: The argument type 'B?' can't be assigned to the parameter type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A);
+  self::A a = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:28:9: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a = x; // Error.
+        ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:29:10: Error: Can't assign spread elements of type 'B?' to collection elements of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A>[...l]; // Error.
+         ^"];
+  <self::A>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:30:10: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A>[...l2]; // Error.
+         ^"];
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry keys of type 'B?' to map entry keys of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:31:13: Error: Can't assign spread entry values of type 'B?' to map entry values of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <A, A>{...m}; // Error.
+            ^"};
+  <self::A, self::A>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:32:13: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  <A, A>{...m2}; // Error.
+            ^": null};
+  for (final self::B? #t1 in l) {
+    self::A y = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:33:10: Error: A value of type 'B?' can't be assigned to a variable of type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (A y in l) {} // Error.
+         ^" in #t1 as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  for (self::A y in invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:34:15: Error: The type 'List<B>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<B>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'Iterable' is from 'dart:core'.
+  for (A y in l2) {} // Error.
+              ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+  }
+  #L1:
+  switch(x) {
+    #L2:
+    case #C1:
+      {
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  function local() → FutureOr<self::A> async {
+    if(true) {
+      return invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:43:14: Error: A value of type 'B?' can't be returned from an async function with return type 'FutureOr<A>' because 'B?' is nullable and 'FutureOr<A>' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return x; // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+    }
+    else {
+      return invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:45:18: Error: A value of type 'Future<B?>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<B?>.value(x); // Error.
+                 ^" in asy::Future::value<self::B?>(x) as{TypeError,ForNonNullableByDefault} self::A;
+    }
+  }
+  return invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:49:10: Error: A value of type 'B?' can't be returned from a function with return type 'A' because 'B?' is nullable and 'A' isn't.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+}
+static method bar(core::List<self::B?> x, core::List<core::List<self::B?>> l, core::Map<core::List<self::B?>, core::List<self::B?>> m) → core::List<self::A> {
+  self::barContext(invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:53:14: Error: The argument type 'List<B?>' can't be assigned to the parameter type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  barContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>);
+  core::List<self::A> y = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:54:15: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  List<A> y = x; // Error.
+              ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  <core::List<self::A>>[invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:55:16: Error: Can't assign spread elements of type 'List<B?>' to collection elements of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>>[...l]; // Error.
+               ^"];
+  <core::List<self::A>, core::List<self::A>>{invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry keys of type 'List<B?>' to map entry keys of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^": invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:56:25: Error: Can't assign spread entry values of type 'List<B?>' to map entry values of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  <List<A>, List<A>>{...m}; // Error.
+                        ^"};
+  for (final core::List<self::B?> #t2 in l) {
+    core::List<self::A> y = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:57:16: Error: A value of type 'List<B?>' can't be assigned to a variable of type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+Try changing the type of the variable.
+  for (List<A> y in l) {} // Error.
+               ^" in #t2 as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+  }
+  return invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:58:10: Error: A value of type 'List<B?>' can't be returned from a function with return type 'List<A>' because 'B?' is nullable and 'A' isn't.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  return x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} core::List<self::A>;
+}
+static method baz(self::C c) → void {
+  self::bazContext(invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:62:14: Error: The argument type 'num? Function()' can't be assigned to the parameter type 'num Function()' because 'num?' is nullable and 'num' isn't.
+  bazContext(c);
+             ^" in (let final self::C #t3 = c in #t3 == null ?{() → core::num?} null : #t3.{self::C::call}{() → core::num?}) as{TypeError,ForNonNullableByDefault} () → core::num);
+}
+static method boz(Null x) → self::A {
+  self::fooContext(invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:66:14: Error: The argument type 'Null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(x); // Error.
+             ^" in x as{TypeError,ForNonNullableByDefault} self::A);
+  self::fooContext(invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:67:14: Error: The value 'null' can't be assigned to the parameter type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  fooContext(null); // Error.
+             ^" in null as{TypeError,ForNonNullableByDefault} self::A);
+  self::A a1 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:68:10: Error: A value of type 'Null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a1 = x; // Error.
+         ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  self::A a2 = invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:69:10: Error: The value 'null' can't be assigned to a variable of type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+  A a2 = null; // Error.
+         ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+  if(true) {
+    return invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:71:12: Error: A value of type 'Null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return x; // Error.
+           ^" in x as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  else {
+    return invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:73:12: Error: The value 'null' can't be returned from a function with return type 'A' because 'A' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+    return null; // Error.
+           ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+  }
+  function local() → FutureOr<self::A> async {
+    if(true) {
+      return invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:77:14: Error: The value 'null' can't be returned from an async function with return type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return null; // Error.
+             ^" in null as{TypeError,ForNonNullableByDefault} self::A;
+    }
+    else {
+      return invalid-expression "pkg/front_end/testcases/nnbd/assignability_error_messages.dart:79:18: Error: A value of type 'Future<Null>' can't be returned from an async function with return type 'FutureOr<A>'.
+ - 'Future' is from 'dart:async'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/assignability_error_messages.dart'.
+      return new Future<Null>.value(null); // Error.
+                 ^" in asy::Future::value<Null>(null) as{TypeError,ForNonNullableByDefault} self::A;
+    }
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///assignability_error_messages.dart:
+- A. (from org-dartlang-testcase:///assignability_error_messages.dart:11:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.modular.expect
new file mode 100644
index 0000000..ab741a5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// foo(A<num?> a) {} // Error
+//             ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+// A<num?>? bar() {} // Error
+//             ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// baz<T extends A<num?>>() {} // Error
+//     ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// class B extends A<num?> {} // Error
+//       ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// class C<T extends A<num?>> {} // Error
+//         ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
+// Try changing type arguments so that they conform to the bounds.
+//   hest<num?>();
+//   ^
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:17:11: Context: This is the type variable whose bound isn't conformed to.
+// void hest<T extends num>() {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
+//  - 'Hest' is from 'pkg/front_end/testcases/nnbd/bounds_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   h.hest<num?>();
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class B extends self::A<core::num?> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C<T extends self::A<core::num?>> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+}
+class Hest extends core::Object {
+  synthetic constructor •() → self::Hest
+    : super core::Object::•()
+    ;
+  method hest<T extends core::num>() → void {}
+}
+static method foo(self::A<core::num?> a) → dynamic {}
+static method bar() → self::A<core::num?>? {}
+static method baz<T extends self::A<core::num?>>() → dynamic {}
+static method hest<T extends core::num>() → void {}
+static method fisk(self::Hest h) → dynamic {
+  self::hest<core::num?>();
+  h.{self::Hest::hest}<core::num?>(){() → void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.modular.expect
new file mode 100644
index 0000000..2ae4ce3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/build_issue_2688.dart.weak.modular.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class M0 extends core::Object /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M1 extends core::Object implements self::M0 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M2 extends core::Object implements self::M1 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M3 extends core::Object implements self::M2 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M4 extends core::Object implements self::M3 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M5 extends core::Object implements self::M4 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M6 extends core::Object implements self::M5 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M7 extends core::Object implements self::M6 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M8 extends core::Object implements self::M7 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M9 extends core::Object implements self::M8 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M10 extends core::Object implements self::M9 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M11 extends core::Object implements self::M10 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M12 extends core::Object implements self::M11 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M13 extends core::Object implements self::M12 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M14 extends core::Object implements self::M13 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M15 extends core::Object implements self::M14 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M16 extends core::Object implements self::M15 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M17 extends core::Object implements self::M16 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M18 extends core::Object implements self::M17 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M19 extends core::Object implements self::M18 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M20 extends core::Object implements self::M19 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M21 extends core::Object implements self::M20 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M22 extends core::Object implements self::M21 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M23 extends core::Object implements self::M22 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M24 extends core::Object implements self::M23 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M25 extends core::Object implements self::M24 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M26 extends core::Object implements self::M25 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class M27 extends core::Object implements self::M26 /*isMixinDeclaration*/  {
+  abstract get property() → core::int;
+}
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get property() → core::int;
+}
+abstract class _Class&Super&M0 = self::Super with self::M0 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0
+    : super self::Super::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M0::property
+}
+abstract class _Class&Super&M0&M1 = self::_Class&Super&M0 with self::M1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1
+    : super self::_Class&Super&M0::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M1::property
+}
+abstract class _Class&Super&M0&M1&M2 = self::_Class&Super&M0&M1 with self::M2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2
+    : super self::_Class&Super&M0&M1::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M2::property
+}
+abstract class _Class&Super&M0&M1&M2&M3 = self::_Class&Super&M0&M1&M2 with self::M3 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3
+    : super self::_Class&Super&M0&M1&M2::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M3::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4 = self::_Class&Super&M0&M1&M2&M3 with self::M4 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4
+    : super self::_Class&Super&M0&M1&M2&M3::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M4::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5 = self::_Class&Super&M0&M1&M2&M3&M4 with self::M5 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5
+    : super self::_Class&Super&M0&M1&M2&M3&M4::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M5::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6 = self::_Class&Super&M0&M1&M2&M3&M4&M5 with self::M6 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M6::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6 with self::M7 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M7::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7 with self::M8 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M8::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8 with self::M9 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M9::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9 with self::M10 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M10::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10 with self::M11 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M11::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11 with self::M12 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M12::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12 with self::M13 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M13::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13 with self::M14 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M14::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14 with self::M15 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M15::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15 with self::M16 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M16::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16 with self::M17 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M17::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17 with self::M18 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M18::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18 with self::M19 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M19::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19 with self::M20 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M20::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20 with self::M21 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M21::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21 with self::M22 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M22::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22 with self::M23 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M23::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23 with self::M24 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M24::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24 with self::M25 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M25::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25 with self::M26 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M26::property
+}
+abstract class _Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 = self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26 with self::M27 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26::•()
+    ;
+  abstract mixin-stub get property() → core::int; -> self::M27::property
+}
+class Class extends self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27 {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&M0&M1&M2&M3&M4&M5&M6&M7&M8&M9&M10&M11&M12&M13&M14&M15&M16&M17&M18&M19&M20&M21&M22&M23&M24&M25&M26&M27::•()
+    ;
+  get property() → core::int
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/call.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/call.dart.weak.modular.expect
new file mode 100644
index 0000000..e93db55
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/call.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   f();
+//    ^
+//
+// pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+//   f.call();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   c.field();
+//          ^
+//
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   c.getter();
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field () →? void field = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get getter() → () →? void
+    return null;
+}
+static method error() → dynamic {
+  () →? void f;
+  invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  f();
+   ^" in f{<nullable>}.(){() →? void};
+  invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+  f.call();
+    ^^^^" in f{<nullable>}.(){() →? void};
+  self::Class c = new self::Class::•();
+  invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  c.field();
+         ^" in c.{self::Class::field}{() →? void}{<nullable>}.(){() →? void};
+  invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  c.getter();
+          ^" in c.{self::Class::getter}{() →? void}{<nullable>}.(){() →? void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/combined_required.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/combined_required.dart.weak.modular.expect
new file mode 100644
index 0000000..4e4e563
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/combined_required.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1({required core::int a = #C1}) → void {}
+  method method2({core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1({required covariant-by-declaration core::int a = #C1}) → void {}
+  method method2({covariant-by-declaration core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+class C extends self::A implements self::B {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  forwarding-stub method method1({required covariant-by-declaration core::int a = #C1}) → void
+    return super.{self::A::method1}(a: a);
+  forwarding-stub method method2({covariant-by-declaration core::int? a = #C1, required core::int b = #C1}) → void
+    return super.{self::A::method2}(a: a, b: b);
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method method1({required covariant-by-declaration core::int a = #C1}) → void {}
+  method method2({covariant-by-declaration core::int? a = #C1, required core::int b = #C1}) → void {}
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/const_canonical_type.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/const_canonical_type.dart.weak.modular.expect
new file mode 100644
index 0000000..5e1af23
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_canonical_type.dart.weak.modular.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef F1 = () → self::A<FutureOr<dynamic>>;
+typedef F2 = () → self::A<dynamic>;
+typedef F3 = () → self::A<FutureOr<FutureOr<dynamic>?>>;
+typedef F4 = () → self::A<dynamic>;
+class Check extends core::Object /*hasConstConstructor*/  {
+  final field dynamic _ignored;
+  const constructor •(dynamic x, dynamic y) → self::Check
+    : assert(core::identical(x, y)), self::Check::_ignored = core::identical(x, y) ?{core::int} 42 : 1.{core::num::~/}(0){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+class A<X extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+static method expectEqual(dynamic x, dynamic y) → void {
+  if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
+    throw "Arguments were supposed to be identical.";
+  }
+}
+static method test1() → dynamic {
+  core::Type v = #C1;
+  self::expectEqual(#C1, #C1);
+  self::expectEqual(#C1, #C1);
+  self::expectEqual(#C1, #C1);
+  self::expectEqual(v, v);
+  self::expectEqual(v, #C1);
+  core::Type vf1 = #C2;
+  core::Type vf2 = #C2;
+  core::Type vf3 = #C2;
+  core::Type vf4 = #C2;
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, vf1);
+  self::expectEqual(vf1, vf2);
+  self::expectEqual(vf2, vf3);
+  self::expectEqual(vf3, vf4);
+  return #C5;
+}
+static method main() → dynamic {
+  self::test1();
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::A<dynamic>*)
+  #C2 = TypeLiteralConstant(() →* self::A<dynamic>*)
+  #C3 = 42
+  #C4 = self::Check {_ignored:#C3}
+  #C5 = <dynamic>[#C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_canonical_type.dart:
+- A. (from org-dartlang-testcase:///const_canonical_type.dart:22:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Check. (from org-dartlang-testcase:///const_canonical_type.dart:10:9)
diff --git a/pkg/front_end/testcases/nnbd/const_is.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/const_is.dart.weak.modular.expect
new file mode 100644
index 0000000..81ac3c3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/const_is.dart.weak.modular.expect
@@ -0,0 +1,106 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef fType = ({required i: core::int}) → core::int;
+typedef gType = ({i: core::int}) → core::int;
+typedef bigType = ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int;
+typedef func = (core::Object) → self::B;
+typedef t1 = (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A, self::A1, self::A2 {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object implements self::C {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static field core::bool inStrongMode = !(<core::int?>[] is{ForNonNullableByDefault} core::List<core::int>);
+static const field core::bool f_is_fType = #C1;
+static const field core::bool f_is_gType = #C1;
+static const field core::bool g_is_fType = #C1;
+static const field core::bool g_is_gType = #C1;
+static const field core::bool f_is_bigType = #C2;
+static const field core::bool f1_is_t1 = #C2;
+static const field core::bool f2_is_t1 = #C2;
+static const field core::bool f3_is_t1 = #C1;
+static const field core::bool f4_is_t1 = #C1;
+static const field core::bool f5_is_t1 = #C1;
+static method f({required core::int i = #C3}) → core::int {
+  return i.{core::num::+}(1){(core::num) → core::int};
+}
+static method g({core::int i = #C4}) → core::int {
+  return i.{core::num::+}(1){(core::num) → core::int};
+}
+static method f1(core::int i, self::B b, core::Map<core::int, core::num> m, dynamic x, {required dynamic extraParam = #C3, required core::bool obool = #C3, required dynamic ox = #C3, required self::D ob = #C3, required core::List<core::num>? ol = #C3}) → self::B
+  return new self::B::•();
+static method f2(core::int i, self::D b, core::Map<core::int, core::int> m, (core::Object) → self::B x, {required (core::Object) → self::B ox = #C3, required self::D ob = #C3, required core::List<core::int> ol = #C3, required core::bool obool = #C3}) → self::D
+  return new self::D::•();
+static method f3(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required dynamic extraParam = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::Object obool = #C3}) → self::C
+  return new self::C::•();
+static method f4(core::num i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::A2 ob = #C3, required core::List<dynamic> ol = #C3, required core::bool obool = #C3, required self::A xx = #C3, required self::B yy = #C3}) → self::C
+  return new self::C::•();
+static method f5(core::int i, self::A b, core::Map<core::Object, core::Object> m, dynamic x, {required dynamic ox = #C3, required self::B ob = #C3, required core::List<dynamic> ol = #C3, required dynamic obool = #C3}) → self::C
+  return new self::C::•();
+static method main() → dynamic {
+  self::expect(true, #C1);
+  self::expect(#C5 is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect(#C5 is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C1);
+  self::expect(true, #C1);
+  self::expect(#C6 is{ForNonNullableByDefault} ({required i: core::int}) → core::int, #C1);
+  self::expect(true, #C1);
+  self::expect(#C6 is{ForNonNullableByDefault} ({i: core::int}) → core::int, #C1);
+  self::expect(false, #C2);
+  self::expect(#C5 is{ForNonNullableByDefault} ({required i1: core::int, required i10: core::int, required i11: core::int, required i12: core::int, required i13: core::int, required i14: core::int, required i15: core::int, required i16: core::int, required i17: core::int, required i18: core::int, required i19: core::int, required i2: core::int, required i20: core::int, required i21: core::int, required i22: core::int, required i23: core::int, required i24: core::int, required i25: core::int, required i26: core::int, required i27: core::int, required i28: core::int, required i29: core::int, required i3: core::int, required i30: core::int, required i31: core::int, required i32: core::int, required i33: core::int, required i34: core::int, required i35: core::int, required i36: core::int, required i37: core::int, required i38: core::int, required i39: core::int, required i4: core::int, required i40: core::int, required i41: core::int, required i42: core::int, required i43: core::int, required i44: core::int, required i45: core::int, required i46: core::int, required i47: core::int, required i48: core::int, required i49: core::int, required i5: core::int, required i50: core::int, required i51: core::int, required i52: core::int, required i53: core::int, required i54: core::int, required i55: core::int, required i56: core::int, required i57: core::int, required i58: core::int, required i59: core::int, required i6: core::int, required i60: core::int, required i61: core::int, required i62: core::int, required i63: core::int, required i64: core::int, required i65: core::int, required i66: core::int, required i67: core::int, required i68: core::int, required i69: core::int, required i7: core::int, required i70: core::int, required i8: core::int, required i9: core::int}) → core::int, #C2);
+  self::expect(false, #C2);
+  self::expect(#C7 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(false, #C2);
+  self::expect(#C8 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C2);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect(#C9 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+  self::expect(!self::inStrongMode, #C1);
+  self::expect(#C10 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+  self::expect(true, #C1);
+  self::expect(#C11 is{ForNonNullableByDefault} (core::int, self::B, core::Map<core::int, core::num>, dynamic, {required ob: self::B, required obool: core::bool, required ol: core::List<core::num>, required ox: dynamic}) → self::B, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = false
+  #C3 = null
+  #C4 = 1
+  #C5 = static-tearoff self::f
+  #C6 = static-tearoff self::g
+  #C7 = static-tearoff self::f1
+  #C8 = static-tearoff self::f2
+  #C9 = static-tearoff self::f3
+  #C10 = static-tearoff self::f4
+  #C11 = static-tearoff self::f5
+}
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.weak.modular.expect
new file mode 100644
index 0000000..a50f6c7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Constant evaluation error:
+// const int? d = c!;
+//                 ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Context: Constant expression must be non-null.
+// const int? d = c!;
+//                 ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:12: Context: While analyzing:
+// const int? d = c!;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:23: Error: Constant evaluation error:
+// const Class f = const Class(c);
+//                       ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Context: Constant expression must be non-null.
+//   const Class(int? x) : y = x!;
+//                              ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:13: Context: While analyzing:
+// const Class f = const Class(c);
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object /*hasConstConstructor*/  {
+  final field core::int y;
+  const constructor •(core::int? x) → self::Class
+    : self::Class::y = x!, super core::Object::•()
+    ;
+}
+static const field core::int? a = #C1;
+static const field core::int b = #C1;
+static const field core::int? c = #C2;
+static const field core::int? d = invalid-expression "Constant expression must be non-null.";
+static const field self::Class e = #C3;
+static const field self::Class f = invalid-expression "Constant expression must be non-null.";
+static method main() → dynamic {
+  self::expect(42, #C1);
+  self::expect(42, #C1);
+  self::expect(42, #C3.{self::Class::y}{core::int});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = 42
+  #C2 = null
+  #C3 = self::Class {y:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constant_null_check.dart:
+- Class. (from org-dartlang-testcase:///constant_null_check.dart:13:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.modular.expect
new file mode 100644
index 0000000..94f3fa4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.modular.expect
@@ -0,0 +1,103 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool field;
+  const constructor constructor1(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
+    ;
+  const constructor constructor2(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class::T?, super core::Object::•()
+    ;
+  const constructor constructor3(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class<self::Class::T%>, super core::Object::•()
+    ;
+  const constructor constructor4(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class<self::Class::T%>?, super core::Object::•()
+    ;
+}
+static final field core::bool isWeakMode = #C1 is{ForNonNullableByDefault} core::List<core::Object>;
+static const field core::bool c0 = #C2;
+static const field core::bool c1 = #C3;
+static const field core::bool c2 = #C2;
+static const field core::bool c3 = #C2;
+static const field core::bool c4 = #C3;
+static const field core::bool c5 = #C2;
+static const field core::bool c6 = #C3;
+static const field core::bool c7 = #C2;
+static const field core::bool c8 = #C2;
+static const field core::bool c9 = #C2;
+static const field core::bool c10 = #C3;
+static const field core::bool c11 = #C2;
+static const field core::bool c12 = #C2;
+static const field self::Class<core::int> e1 = #C4;
+static const field self::Class<core::List<core::int>> e2 = #C5;
+static const field self::Class<Null> e3 = #C6;
+static const field self::Class<core::int> e4 = #C7;
+static const field self::Class<core::int?> e5 = #C8;
+static const field self::Class<Null> e6 = #C6;
+static const field self::Class<core::int> e7 = #C4;
+static const field self::Class<core::int?> e8 = #C9;
+static const field self::Class<Null> e9 = #C10;
+static const field self::Class<core::int> e10 = #C7;
+static const field self::Class<core::int?> e11 = #C8;
+static const field self::Class<Null> e12 = #C6;
+static method main() → dynamic {
+  self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
+  self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
+  self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
+  self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}{core::bool}, #C4.{self::Class::field}{core::bool}, "Class<int>.constructor1(null).field");
+  self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}{core::bool}, "new Class<int?>.constructor1(null).field");
+  self::expect(self::isWeakMode, #C5.{self::Class::field}{core::bool}, "const Class<List<int>>.constructor1(<Null>[null]).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}{core::bool}, #C6.{self::Class::field}{core::bool}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}{core::bool}, #C7.{self::Class::field}{core::bool}, "Class<int>.constructor2(null).field");
+  self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}{core::bool}, "new Class<int?>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}{core::bool}, #C8.{self::Class::field}{core::bool}, "Class<int?>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}{core::bool}, #C6.{self::Class::field}{core::bool}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}{core::bool}, #C4.{self::Class::field}{core::bool}, "Class<int>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}{core::bool}, #C9.{self::Class::field}{core::bool}, "Class<int?>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}{core::bool}, #C9.{self::Class::field}{core::bool}, "Class<int?>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}{core::bool}, #C10.{self::Class::field}{core::bool}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}{core::bool}, #C7.{self::Class::field}{core::bool}, "Class<int>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}{core::bool}, #C8.{self::Class::field}{core::bool}, "Class<int?>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}{core::bool}, #C6.{self::Class::field}{core::bool}, "Class<Null>.constructor4(null).field");
+}
+static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual} for ${message}";
+}
+
+constants  {
+  #C1 = <Null>[]
+  #C2 = true
+  #C3 = false
+  #C4 = self::Class<core::int*> {field:#C3}
+  #C5 = self::Class<core::List<core::int*>*> {field:#C2}
+  #C6 = self::Class<Null> {field:#C2}
+  #C7 = self::Class<core::int*> {field:#C2}
+  #C8 = self::Class<core::int?> {field:#C2}
+  #C9 = self::Class<core::int?> {field:#C3}
+  #C10 = self::Class<Null> {field:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constant_null_is.dart:
+- Class.constructor1 (from org-dartlang-testcase:///constant_null_is.dart:38:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Class.constructor2 (from org-dartlang-testcase:///constant_null_is.dart:39:9)
+- Class.constructor3 (from org-dartlang-testcase:///constant_null_is.dart:40:9)
+- Class.constructor4 (from org-dartlang-testcase:///constant_null_is.dart:41:9)
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.modular.expect
new file mode 100644
index 0000000..9af4cec
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.modular.expect
@@ -0,0 +1,114 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "constants_lib.dart" as con;
+
+import "org-dartlang-testcase:///constants_lib.dart" as lib;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+static const field core::Type objectTypeLiteral = #C1;
+static const field (core::int) → core::int partialInstantiation = #C3;
+static const field con::Class<core::int> instance = #C5;
+static const field core::Type functionTypeLiteral = #C6;
+static const field core::Type genericFunctionTypeLiteral = #C7;
+static const field core::List<core::int> listLiteral = #C8;
+static const field core::Set<core::int> setLiteral = #C9;
+static const field core::Map<core::int, core::String> mapLiteral = #C11;
+static const field core::List<core::int> listConcatenation = #C8;
+static const field core::Set<core::int> setConcatenation = #C9;
+static const field core::Map<core::int, core::String> mapConcatenation = #C11;
+static const field core::bool objectTypeLiteralIdentical = #C12;
+static const field core::bool partialInstantiationIdentical = #C12;
+static const field core::bool instanceIdentical = #C12;
+static const field core::bool functionTypeLiteralIdentical = #C12;
+static const field core::bool genericFunctionTypeLiteralIdentical = #C12;
+static const field core::bool listLiteralIdentical = #C12;
+static const field core::bool setLiteralIdentical = #C12;
+static const field core::bool mapLiteralIdentical = #C12;
+static const field core::bool listConcatenationIdentical = #C12;
+static const field core::bool setConcatenationIdentical = #C12;
+static const field core::bool mapConcatenationIdentical = #C12;
+static method main() → dynamic {
+  self::test(#C1, #C1);
+  self::test(#C3, #C3);
+  self::test(#C5, #C5);
+  self::test(#C6, #C6);
+  self::test(#C7, #C7);
+  self::test(#C8, #C8);
+  self::test(#C9, #C9);
+  self::test(#C11, #C11);
+  self::test(#C8, #C8);
+  self::test(#C9, #C9);
+  self::test(#C11, #C11);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+  self::test(true, #C12);
+}
+static method test(dynamic expected, dynamic actual) → dynamic {
+  core::print("test(${expected}, ${actual})");
+  if(!core::identical(expected, actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
+
+library /*isNonNullableByDefault*/;
+import self as con;
+import "dart:core" as core;
+
+typedef F1<invariant T extends core::Object? = dynamic> = (T%) → T%;
+typedef F2 = <T extends core::Object? = dynamic>(T%) → T%;
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field con::Class::T% field;
+  const constructor •(con::Class::T% field) → con::Class<con::Class::T%>
+    : con::Class::field = field, super core::Object::•()
+    ;
+}
+static const field core::Type objectTypeLiteral = #C1;
+static const field (core::Object?, core::Object?) → core::bool c2 = #C13;
+static const field (core::int) → core::int partialInstantiation = #C3;
+static const field con::Class<core::int> instance = #C5;
+static const field core::Type functionTypeLiteral = #C6;
+static const field core::Type genericFunctionTypeLiteral = #C7;
+static const field core::List<core::int> listLiteral = #C8;
+static const field core::Set<core::int> setLiteral = #C9;
+static const field core::Map<core::int, core::String> mapLiteral = #C11;
+static const field core::List<core::int> listConcatenation = #C8;
+static const field core::Set<core::int> setConcatenation = #C9;
+static const field core::Map<core::int, core::String> mapConcatenation = #C11;
+static method id<T extends core::Object? = dynamic>(con::id::T% t) → con::id::T%
+  return t;
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Object*)
+  #C2 = static-tearoff con::id
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = 0
+  #C5 = con::Class<core::int*> {field:#C4}
+  #C6 = TypeLiteralConstant((dynamic) →* dynamic)
+  #C7 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T*) →* T*)
+  #C8 = <core::int*>[#C4]
+  #C9 = <core::int*>{#C4}
+  #C10 = "foo"
+  #C11 = <core::int*, core::String*>{#C4:#C10)
+  #C12 = true
+  #C13 = static-tearoff core::identical
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constants.dart:
+- Class. (from org-dartlang-testcase:///constants_lib.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+
+org-dartlang-testcase:///constants_lib.dart:
+- Class. (from org-dartlang-testcase:///constants_lib.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/covariant_equals.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/covariant_equals.dart.weak.modular.expect
new file mode 100644
index 0000000..ac2d469
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/covariant_equals.dart.weak.modular.expect
@@ -0,0 +1,546 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:24:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   a == c_dynamic; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:25:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   a == c_int; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:26:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   a == c_string; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:27:8: Error: The argument type 'D' can't be assigned to the parameter type 'A?'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   a == d; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:31:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   b == c_dynamic; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:32:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   b == c_int; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:33:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   b == c_string; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:34:8: Error: The argument type 'D' can't be assigned to the parameter type 'A?'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   b == d; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:36:16: Error: The argument type 'A' can't be assigned to the parameter type 'C<dynamic>?'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_dynamic == a; // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:37:16: Error: The argument type 'B' can't be assigned to the parameter type 'C<dynamic>?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_dynamic == b; // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:43:12: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>?'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_int == a; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:44:12: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_int == b; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:45:12: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'C<int>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_int == c_dynamic; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:47:12: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_int == c_string; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:50:15: Error: The argument type 'A' can't be assigned to the parameter type 'C<String>?'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == a; // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:51:15: Error: The argument type 'B' can't be assigned to the parameter type 'C<String>?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == b; // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:52:15: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'C<String>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == c_dynamic; // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:53:15: Error: The argument type 'C<int>' can't be assigned to the parameter type 'C<String>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == c_int; // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:55:15: Error: The argument type 'D' can't be assigned to the parameter type 'C<String>?'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == d; // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:57:8: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>?'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   d == a; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:58:8: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   d == b; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:59:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'C<int>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   d == c_dynamic; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:61:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   d == c_string; // error
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:75:8: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   a == c_dynamic; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:76:8: Error: The argument type 'C<int>?' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   a == c_int; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:77:8: Error: The argument type 'C<String>?' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   a == c_string; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:78:8: Error: The argument type 'D?' can't be assigned to the parameter type 'A?'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   a == d; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:82:8: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   b == c_dynamic; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:83:8: Error: The argument type 'C<int>?' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   b == c_int; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:84:8: Error: The argument type 'C<String>?' can't be assigned to the parameter type 'A?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   b == c_string; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:85:8: Error: The argument type 'D?' can't be assigned to the parameter type 'A?'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   b == d; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:87:16: Error: The argument type 'A?' can't be assigned to the parameter type 'C<dynamic>?'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_dynamic == a; // ok or error ?
+//                ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:88:16: Error: The argument type 'B?' can't be assigned to the parameter type 'C<dynamic>?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_dynamic == b; // ok or error ?
+//                ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:94:12: Error: The argument type 'A?' can't be assigned to the parameter type 'C<int>?'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_int == a; // ok or error ?
+//            ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:95:12: Error: The argument type 'B?' can't be assigned to the parameter type 'C<int>?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_int == b; // ok or error ?
+//            ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:96:12: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'C<int>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_int == c_dynamic; // ok or error ?
+//            ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:98:12: Error: The argument type 'C<String>?' can't be assigned to the parameter type 'C<int>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_int == c_string; // ok or error ?
+//            ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:101:15: Error: The argument type 'A?' can't be assigned to the parameter type 'C<String>?'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == a; // ok or error ?
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:102:15: Error: The argument type 'B?' can't be assigned to the parameter type 'C<String>?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == b; // ok or error ?
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:103:15: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'C<String>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == c_dynamic; // ok or error ?
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:104:15: Error: The argument type 'C<int>?' can't be assigned to the parameter type 'C<String>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == c_int; // ok or error ?
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:106:15: Error: The argument type 'D?' can't be assigned to the parameter type 'C<String>?'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   c_string == d; // ok or error ?
+//               ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:108:8: Error: The argument type 'A?' can't be assigned to the parameter type 'C<int>?'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   d == a; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:109:8: Error: The argument type 'B?' can't be assigned to the parameter type 'C<int>?'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   d == b; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:110:8: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'C<int>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   d == c_dynamic; // ok or error ?
+//        ^
+//
+// pkg/front_end/testcases/nnbd/covariant_equals.dart:112:8: Error: The argument type 'C<String>?' can't be assigned to the parameter type 'C<int>?'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+//   d == c_string; // ok or error ?
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator ==(covariant-by-declaration self::A other) → core::bool
+    return true;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  operator ==(covariant-by-declaration self::A other) → core::bool
+    return true;
+}
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
+    : super core::Object::•()
+    ;
+  operator ==(covariant-by-declaration covariant-by-class self::C<self::C::T%> other) → core::bool
+    return true;
+}
+class D extends self::C<core::int> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+}
+static method main() → dynamic {}
+static method testNonNullable(self::A a, self::B b, self::C<dynamic> c_dynamic, self::C<core::int> c_int, self::C<core::String> c_string, self::D d) → dynamic {
+  a =={self::A::==}{(self::A) → core::bool} a;
+  a =={self::A::==}{(self::A) → core::bool} b;
+  a =={self::A::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:24:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  a == c_dynamic; // error
+       ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::A?;
+  a =={self::A::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:25:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  a == c_int; // error
+       ^" in c_int as{TypeError,ForNonNullableByDefault} self::A?;
+  a =={self::A::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:26:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  a == c_string; // error
+       ^" in c_string as{TypeError,ForNonNullableByDefault} self::A?;
+  a =={self::A::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:27:8: Error: The argument type 'D' can't be assigned to the parameter type 'A?'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  a == d; // error
+       ^" in d as{TypeError,ForNonNullableByDefault} self::A?;
+  b =={self::B::==}{(self::A) → core::bool} a;
+  b =={self::B::==}{(self::A) → core::bool} b;
+  b =={self::B::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:31:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  b == c_dynamic; // error
+       ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::A?;
+  b =={self::B::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:32:8: Error: The argument type 'C<int>' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  b == c_int; // error
+       ^" in c_int as{TypeError,ForNonNullableByDefault} self::A?;
+  b =={self::B::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:33:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  b == c_string; // error
+       ^" in c_string as{TypeError,ForNonNullableByDefault} self::A?;
+  b =={self::B::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:34:8: Error: The argument type 'D' can't be assigned to the parameter type 'A?'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  b == d; // error
+       ^" in d as{TypeError,ForNonNullableByDefault} self::A?;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:36:16: Error: The argument type 'A' can't be assigned to the parameter type 'C<dynamic>?'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_dynamic == a; // error
+               ^" in a as{TypeError,ForNonNullableByDefault} self::C<dynamic>?;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:37:16: Error: The argument type 'B' can't be assigned to the parameter type 'C<dynamic>?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_dynamic == b; // error
+               ^" in b as{TypeError,ForNonNullableByDefault} self::C<dynamic>?;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} c_dynamic;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} c_int;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} c_string;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} d;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:43:12: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>?'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_int == a; // error
+           ^" in a as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:44:12: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_int == b; // error
+           ^" in b as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:45:12: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'C<int>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_int == c_dynamic; // error
+           ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} c_int;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:47:12: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_int == c_string; // error
+           ^" in c_string as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} d;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:50:15: Error: The argument type 'A' can't be assigned to the parameter type 'C<String>?'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == a; // error
+              ^" in a as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:51:15: Error: The argument type 'B' can't be assigned to the parameter type 'C<String>?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == b; // error
+              ^" in b as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:52:15: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'C<String>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == c_dynamic; // error
+              ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:53:15: Error: The argument type 'C<int>' can't be assigned to the parameter type 'C<String>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == c_int; // error
+              ^" in c_int as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} c_string;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:55:15: Error: The argument type 'D' can't be assigned to the parameter type 'C<String>?'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == d; // error
+              ^" in d as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:57:8: Error: The argument type 'A' can't be assigned to the parameter type 'C<int>?'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  d == a; // error
+       ^" in a as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:58:8: Error: The argument type 'B' can't be assigned to the parameter type 'C<int>?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  d == b; // error
+       ^" in b as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:59:8: Error: The argument type 'C<dynamic>' can't be assigned to the parameter type 'C<int>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  d == c_dynamic; // error
+       ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} c_int;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:61:8: Error: The argument type 'C<String>' can't be assigned to the parameter type 'C<int>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  d == c_string; // error
+       ^" in c_string as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} d;
+}
+static method testNullable(self::A? a, self::B? b, self::C<dynamic>? c_dynamic, self::C<core::int>? c_int, self::C<core::String>? c_string, self::D? d) → dynamic {
+  a =={self::A::==}{(self::A) → core::bool} a;
+  a =={self::A::==}{(self::A) → core::bool} b;
+  a =={self::A::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:75:8: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  a == c_dynamic; // ok or error ?
+       ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::A?;
+  a =={self::A::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:76:8: Error: The argument type 'C<int>?' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  a == c_int; // ok or error ?
+       ^" in c_int as{TypeError,ForNonNullableByDefault} self::A?;
+  a =={self::A::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:77:8: Error: The argument type 'C<String>?' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  a == c_string; // ok or error ?
+       ^" in c_string as{TypeError,ForNonNullableByDefault} self::A?;
+  a =={self::A::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:78:8: Error: The argument type 'D?' can't be assigned to the parameter type 'A?'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  a == d; // ok or error ?
+       ^" in d as{TypeError,ForNonNullableByDefault} self::A?;
+  b =={self::B::==}{(self::A) → core::bool} a;
+  b =={self::B::==}{(self::A) → core::bool} b;
+  b =={self::B::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:82:8: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  b == c_dynamic; // ok or error ?
+       ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::A?;
+  b =={self::B::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:83:8: Error: The argument type 'C<int>?' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  b == c_int; // ok or error ?
+       ^" in c_int as{TypeError,ForNonNullableByDefault} self::A?;
+  b =={self::B::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:84:8: Error: The argument type 'C<String>?' can't be assigned to the parameter type 'A?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  b == c_string; // ok or error ?
+       ^" in c_string as{TypeError,ForNonNullableByDefault} self::A?;
+  b =={self::B::==}{(self::A) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:85:8: Error: The argument type 'D?' can't be assigned to the parameter type 'A?'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  b == d; // ok or error ?
+       ^" in d as{TypeError,ForNonNullableByDefault} self::A?;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:87:16: Error: The argument type 'A?' can't be assigned to the parameter type 'C<dynamic>?'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_dynamic == a; // ok or error ?
+               ^" in a as{TypeError,ForNonNullableByDefault} self::C<dynamic>?;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:88:16: Error: The argument type 'B?' can't be assigned to the parameter type 'C<dynamic>?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_dynamic == b; // ok or error ?
+               ^" in b as{TypeError,ForNonNullableByDefault} self::C<dynamic>?;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} c_dynamic;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} c_int;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} c_string;
+  c_dynamic =={self::C::==}{(self::C<dynamic>) → core::bool} d;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:94:12: Error: The argument type 'A?' can't be assigned to the parameter type 'C<int>?'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_int == a; // ok or error ?
+           ^" in a as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:95:12: Error: The argument type 'B?' can't be assigned to the parameter type 'C<int>?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_int == b; // ok or error ?
+           ^" in b as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:96:12: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'C<int>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_int == c_dynamic; // ok or error ?
+           ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} c_int;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:98:12: Error: The argument type 'C<String>?' can't be assigned to the parameter type 'C<int>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_int == c_string; // ok or error ?
+           ^" in c_string as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  c_int =={self::C::==}{(self::C<core::int>) → core::bool} d;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:101:15: Error: The argument type 'A?' can't be assigned to the parameter type 'C<String>?'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == a; // ok or error ?
+              ^" in a as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:102:15: Error: The argument type 'B?' can't be assigned to the parameter type 'C<String>?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == b; // ok or error ?
+              ^" in b as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:103:15: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'C<String>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == c_dynamic; // ok or error ?
+              ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:104:15: Error: The argument type 'C<int>?' can't be assigned to the parameter type 'C<String>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == c_int; // ok or error ?
+              ^" in c_int as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} c_string;
+  c_string =={self::C::==}{(self::C<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:106:15: Error: The argument type 'D?' can't be assigned to the parameter type 'C<String>?'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  c_string == d; // ok or error ?
+              ^" in d as{TypeError,ForNonNullableByDefault} self::C<core::String>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:108:8: Error: The argument type 'A?' can't be assigned to the parameter type 'C<int>?'.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  d == a; // ok or error ?
+       ^" in a as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:109:8: Error: The argument type 'B?' can't be assigned to the parameter type 'C<int>?'.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  d == b; // ok or error ?
+       ^" in b as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:110:8: Error: The argument type 'C<dynamic>?' can't be assigned to the parameter type 'C<int>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  d == c_dynamic; // ok or error ?
+       ^" in c_dynamic as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} c_int;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/covariant_equals.dart:112:8: Error: The argument type 'C<String>?' can't be assigned to the parameter type 'C<int>?'.
+ - 'C' is from 'pkg/front_end/testcases/nnbd/covariant_equals.dart'.
+  d == c_string; // ok or error ?
+       ^" in c_string as{TypeError,ForNonNullableByDefault} self::C<core::int>?;
+  d =={self::C::==}{(self::C<core::int>) → core::bool} d;
+}
diff --git a/pkg/front_end/testcases/nnbd/covariant_late_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/covariant_late_field.dart.weak.modular.expect
new file mode 100644
index 0000000..2aecfe1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/covariant_late_field.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/covariant_late_field.dart:19:31: Error: The parameter 'value' of the method 'C.invariantField' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'A.invariantField'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void set invariantField(int value) {} // error
+//                               ^
+// pkg/front_end/testcases/nnbd/covariant_late_field.dart:6:12: Context: This is the overridden method ('invariantField').
+//   late num invariantField;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  late field core::num invariantField;
+  late covariant-by-declaration field core::num covariantField;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::num;
+  abstract set invariantField(core::num value) → void;
+  abstract get covariantField() → core::num;
+  abstract set covariantField(covariant-by-declaration core::num value) → void;
+}
+abstract class C extends core::Object implements self::A {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::int;
+  set invariantField(core::int value) → void {}
+  abstract get covariantField() → core::int;
+  set covariantField(covariant-by-declaration core::int value) → void {}
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  abstract get invariantField() → core::int;
+  set invariantField(covariant-by-declaration core::int value) → void {}
+  abstract get covariantField() → core::int;
+  set covariantField(covariant-by-declaration core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.modular.expect
new file mode 100644
index 0000000..692e181
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/covariant_nnbd_top_merge.dart.weak.modular.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract method method(dynamic a) → void;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-declaration core::num a) → void;
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-declaration core::int a) → void;
+}
+abstract class D1 extends core::Object implements self::A, self::B, self::C {
+  synthetic constructor •() → self::D1
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration dynamic a) → void;
+}
+abstract class D2 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::D2
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration dynamic a) → void;
+}
+abstract class D3 extends core::Object implements self::B, self::C {
+  synthetic constructor •() → self::D3
+    : super core::Object::•()
+    ;
+}
+abstract class D4 extends core::Object implements self::C, self::B {
+  synthetic constructor •() → self::D4
+    : super core::Object::•()
+    ;
+  abstract member-signature method method(covariant-by-declaration core::num a) → void; -> self::B::method
+}
+abstract class D5 extends core::Object implements self::A, self::C {
+  synthetic constructor •() → self::D5
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration dynamic a) → void;
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+  abstract method method(core::num a) → void;
+}
+abstract class F extends core::Object {
+  synthetic constructor •() → self::F
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-declaration core::int a) → void;
+}
+abstract class G1 extends core::Object implements self::E, self::F {
+  synthetic constructor •() → self::G1
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration core::num a) → void;
+}
+abstract class G2 extends core::Object implements self::F, self::E {
+  synthetic constructor •() → self::G2
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration core::num a) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.modular.expect
new file mode 100644
index 0000000..aae820c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
+//   return x;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
+//     return x;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor •(core::int x) → self::Class
+    : self::Class::x = x, super core::Object::•()
+    ;
+  method foo() → core::int {
+    core::int x;
+    return invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
+    return x;
+           ^" in x;
+  }
+  method bar() → core::int
+    return 0;
+  method baz(core::int x) → core::int {
+    return x;
+  }
+  method boz(core::int x) → core::int
+    return x;
+}
+static method foo() → core::int {
+  core::int x;
+  return invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
+  return x;
+         ^" in x;
+}
+static method bar() → core::int
+  return 0;
+static method baz(core::int x) → core::int {
+  return x;
+}
+static method boz(core::int x) → core::int
+  return x;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.modular.expect
new file mode 100644
index 0000000..8a0aaba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.modular.expect
@@ -0,0 +1,158 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
+  late final T% local2;
+  late final core::int local4;
+  late final FutureOr<core::int>local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
+  late final T% local2;
+  late final core::int local4;
+  late final FutureOr<core::int>local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+};
+static field () → Null fieldCompound = () → Null {
+  late final core::int local4;
+  local4 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0){(core::num) → core::int};
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  late final self::methodDirect::T% local2;
+  late final core::int local4;
+  late final FutureOr<core::int>local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  late final self::methodConditional::T% local2;
+  late final core::int local4;
+  late final FutureOr<core::int>local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+  late final core::int local4;
+  local4 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0){(core::num) → core::int};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.modular.expect
new file mode 100644
index 0000000..58f8535
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.modular.expect
@@ -0,0 +1,236 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  FutureOr<core::int>local5;
+  late FutureOr<core::int>local6;
+  late T% local7 = value;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in local6;
+  local7;
+};
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  FutureOr<core::int>local5;
+  late FutureOr<core::int>local6;
+  late T% local7 = value;
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7;
+  }
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+};
+static field () → Null fieldCompound = () → Null {
+  core::int local3;
+  late core::int local4;
+  local3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3 += 0; // error
+  ^^^^^^" in local3.{core::num::+}(0){(core::num) → core::int};
+  local4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4.{core::num::+}(0){(core::num) → core::int};
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  late self::methodDirect::T% local2;
+  core::int local3;
+  late core::int local4;
+  FutureOr<core::int>local5;
+  late FutureOr<core::int>local6;
+  late self::methodDirect::T% local7 = value;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in local6;
+  local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  late self::methodConditional::T% local2;
+  core::int local3;
+  late core::int local4;
+  FutureOr<core::int>local5;
+  late FutureOr<core::int>local6;
+  late self::methodConditional::T% local7 = value;
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7 = value;
+  }
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+}
+static method methodCompound() → dynamic {
+  core::int local3;
+  late core::int local4;
+  local3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3 += 0; // error
+  ^^^^^^" in local3.{core::num::+}(0){(core::num) → core::int};
+  local4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4.{core::num::+}(0){(core::num) → core::int};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.modular.expect
new file mode 100644
index 0000000..677a9bb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Late variable 'value' without initializer is definitely unassigned.
+//     bar(value); // Error.
+//         ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Late variable 'intValue' without initializer is definitely unassigned.
+//     barInt(intValue); // Error.
+//            ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  method bar(covariant-by-class self::A::T% value) → dynamic {}
+  method barInt(core::int value) → dynamic {}
+  method foo() → dynamic {
+    late self::A::T% value;
+    late core::int intValue;
+    this.{self::A::bar}(invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Late variable 'value' without initializer is definitely unassigned.
+    bar(value); // Error.
+        ^^^^^" in value){(self::A::T%) → dynamic};
+    this.{self::A::barInt}(invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Late variable 'intValue' without initializer is definitely unassigned.
+    barInt(intValue); // Error.
+           ^^^^^^^^" in intValue){(core::int) → dynamic};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/demote_closure_types.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/demote_closure_types.dart.weak.modular.expect
new file mode 100644
index 0000000..d3ad413
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/demote_closure_types.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/demote_closure_types.dart:8:17: Error: A value of type 'T' can't be assigned to a variable of type 'String'.
+//     String s = f();
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method method<T extends core::Object? = dynamic>(self::method::T% a, self::method::T% b) → dynamic {
+  if(a is{ForNonNullableByDefault} core::String) {
+    () → self::method::T% f = () → self::method::T% => a{self::method::T% & core::String /* '%' & '!' = '!' */};
+    core::String s = invalid-expression "pkg/front_end/testcases/nnbd/demote_closure_types.dart:8:17: Error: A value of type 'T' can't be assigned to a variable of type 'String'.
+    String s = f();
+                ^" in f(){() → self::method::T%} as{TypeError,ForNonNullableByDefault} core::String;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.modular.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicates_instance.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/duplicates_instance.dart.weak.modular.expect
new file mode 100644
index 0000000..36ed89b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicates_instance.dart.weak.modular.expect
@@ -0,0 +1,344 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:9:7: Error: 'instanceMethod' is already declared in this scope.
+//   int instanceMethod() => 2;
+//       ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:8:7: Context: Previous declaration of 'instanceMethod'.
+//   int instanceMethod() => 1;
+//       ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:12:11: Error: 'instanceGetter' is already declared in this scope.
+//   int get instanceGetter => 2;
+//           ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:11:11: Context: Previous declaration of 'instanceGetter'.
+//   int get instanceGetter => 1;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:18:12: Error: 'instanceSetter' is already declared in this scope.
+//   void set instanceSetter(value) {
+//            ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:14:12: Context: Previous declaration of 'instanceSetter'.
+//   void set instanceSetter(value) {
+//            ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:23:7: Error: 'instanceField' is already declared in this scope.
+//   int instanceField = 2;
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:22:7: Context: Previous declaration of 'instanceField'.
+//   int instanceField = 1;
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:48:13: Error: 'instanceDuplicateFieldAndSetter' is already declared in this scope.
+//   final int instanceDuplicateFieldAndSetter = 2;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:47:13: Context: Previous declaration of 'instanceDuplicateFieldAndSetter'.
+//   final int instanceDuplicateFieldAndSetter = 1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:58:12: Error: 'instanceFieldAndDuplicateSetter' is already declared in this scope.
+//   void set instanceFieldAndDuplicateSetter(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:54:12: Context: Previous declaration of 'instanceFieldAndDuplicateSetter'.
+//   void set instanceFieldAndDuplicateSetter(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:63:13: Error: 'instanceDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+//   final int instanceDuplicateFieldAndDuplicateSetter = 2;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:62:13: Context: Previous declaration of 'instanceDuplicateFieldAndDuplicateSetter'.
+//   final int instanceDuplicateFieldAndDuplicateSetter = 1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:68:12: Error: 'instanceDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+//   void set instanceDuplicateFieldAndDuplicateSetter(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:64:12: Context: Previous declaration of 'instanceDuplicateFieldAndDuplicateSetter'.
+//   void set instanceDuplicateFieldAndDuplicateSetter(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:26:12: Error: Conflicts with the implicit setter of the field 'instanceFieldAndSetter1'.
+//   void set instanceFieldAndSetter1(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:25:7: Error: Conflicts with setter 'instanceFieldAndSetter1'.
+//   int instanceFieldAndSetter1 = 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:30:12: Error: Conflicts with the implicit setter of the field 'instanceFieldAndSetter2'.
+//   void set instanceFieldAndSetter2(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:34:7: Error: Conflicts with setter 'instanceFieldAndSetter2'.
+//   int instanceFieldAndSetter2 = 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:37:12: Error: Conflicts with the implicit setter of the field 'instanceLateFinalFieldAndSetter1'.
+//   void set instanceLateFinalFieldAndSetter1(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:36:18: Error: Conflicts with setter 'instanceLateFinalFieldAndSetter1'.
+//   late final int instanceLateFinalFieldAndSetter1;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:41:12: Error: Conflicts with the implicit setter of the field 'instanceLateFinalFieldAndSetter2'.
+//   void set instanceLateFinalFieldAndSetter2(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:45:18: Error: Conflicts with setter 'instanceLateFinalFieldAndSetter2'.
+//   late final int instanceLateFinalFieldAndSetter2;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:73:12: Error: 'instanceMethodAndSetter1' is already declared in this scope.
+//   void set instanceMethodAndSetter1(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:72:7: Context: Previous declaration of 'instanceMethodAndSetter1'.
+//   int instanceMethodAndSetter1() => 1;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:81:7: Error: 'instanceMethodAndSetter2' is already declared in this scope.
+//   int instanceMethodAndSetter2() => 1;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:77:12: Context: Previous declaration of 'instanceMethodAndSetter2'.
+//   void set instanceMethodAndSetter2(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:86:5: Error: Can't use 'instanceMethod' because it is declared more than once.
+//   c.instanceMethod();
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:86:5: Error: The method 'instanceMethod' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'instanceMethod'.
+//   c.instanceMethod();
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:87:6: Error: Can't use 'instanceMethod' because it is declared more than once.
+//   (c.instanceMethod)();
+//      ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:87:6: Error: The getter 'instanceMethod' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceMethod'.
+//   (c.instanceMethod)();
+//      ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:88:5: Error: Can't use 'instanceGetter' because it is declared more than once.
+//   c.instanceGetter;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:88:5: Error: The getter 'instanceGetter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceGetter'.
+//   c.instanceGetter;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:89:5: Error: Can't use 'instanceSetter' because it is declared more than once.
+//   c.instanceSetter = 0;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:89:5: Error: The setter 'instanceSetter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceSetter'.
+//   c.instanceSetter = 0;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:90:5: Error: Can't use 'instanceField' because it is declared more than once.
+//   c.instanceField;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:90:5: Error: The getter 'instanceField' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceField'.
+//   c.instanceField;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:91:5: Error: Can't use 'instanceField' because it is declared more than once.
+//   c.instanceField = 0;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:91:5: Error: The setter 'instanceField' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceField'.
+//   c.instanceField = 0;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:92:5: Error: Can't use 'instanceDuplicateFieldAndSetter' because it is declared more than once.
+//   c.instanceDuplicateFieldAndSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:92:5: Error: The getter 'instanceDuplicateFieldAndSetter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceDuplicateFieldAndSetter'.
+//   c.instanceDuplicateFieldAndSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:95:5: Error: Can't use 'instanceFieldAndDuplicateSetter' because it is declared more than once.
+//   c.instanceFieldAndDuplicateSetter = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:95:5: Error: The setter 'instanceFieldAndDuplicateSetter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceFieldAndDuplicateSetter'.
+//   c.instanceFieldAndDuplicateSetter = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:96:5: Error: Can't use 'instanceDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+//   c.instanceDuplicateFieldAndDuplicateSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:96:5: Error: The getter 'instanceDuplicateFieldAndDuplicateSetter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceDuplicateFieldAndDuplicateSetter'.
+//   c.instanceDuplicateFieldAndDuplicateSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:97:5: Error: Can't use 'instanceDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+//   c.instanceDuplicateFieldAndDuplicateSetter = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance.dart:97:5: Error: The setter 'instanceDuplicateFieldAndDuplicateSetter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceDuplicateFieldAndDuplicateSetter'.
+//   c.instanceDuplicateFieldAndDuplicateSetter = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int instanceField = null;
+  field core::int instanceFieldAndSetter1 = 1;
+  field core::int instanceFieldAndSetter2 = 1;
+  late final [setter] field core::int instanceLateFinalFieldAndSetter1;
+  late final [setter] field core::int instanceLateFinalFieldAndSetter2;
+  final field core::int instanceDuplicateFieldAndSetter = null;
+  final field core::int instanceFieldAndDuplicateSetter = 1;
+  final field core::int instanceDuplicateFieldAndDuplicateSetter = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method instanceMethod() → core::int
+    return 1;
+  get instanceGetter() → core::int
+    return 1;
+  set instanceSetter(dynamic value) → void {
+    self::result = 1;
+  }
+  set instanceDuplicateFieldAndSetter(core::int value) → void {
+    self::result = 3;
+  }
+  set instanceFieldAndDuplicateSetter(core::int value) → void {
+    self::result = 2;
+  }
+  set instanceDuplicateFieldAndDuplicateSetter(core::int value) → void {
+    self::result = 3;
+  }
+  method instanceMethodAndSetter1() → core::int
+    return 1;
+  set instanceMethodAndSetter1(core::int value) → void {
+    self::result = 2;
+  }
+  set instanceMethodAndSetter2(core::int value) → void {
+    self::result = 2;
+  }
+  method instanceMethodAndSetter2() → core::int
+    return 1;
+}
+static field dynamic result;
+static method test() → dynamic {
+  self::Class c = new self::Class::•();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:86:5: Error: The method 'instanceMethod' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'instanceMethod'.
+  c.instanceMethod();
+    ^^^^^^^^^^^^^^" in c{<unresolved>}.instanceMethod();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:87:6: Error: The getter 'instanceMethod' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceMethod'.
+  (c.instanceMethod)();
+     ^^^^^^^^^^^^^^" in c{<unresolved>}.instanceMethod{dynamic}.call();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:88:5: Error: The getter 'instanceGetter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceGetter'.
+  c.instanceGetter;
+    ^^^^^^^^^^^^^^" in c{<unresolved>}.instanceGetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:89:5: Error: The setter 'instanceSetter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceSetter'.
+  c.instanceSetter = 0;
+    ^^^^^^^^^^^^^^" in c{<unresolved>}.instanceSetter = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:90:5: Error: The getter 'instanceField' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceField'.
+  c.instanceField;
+    ^^^^^^^^^^^^^" in c{<unresolved>}.instanceField;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:91:5: Error: The setter 'instanceField' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceField'.
+  c.instanceField = 0;
+    ^^^^^^^^^^^^^" in c{<unresolved>}.instanceField = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:92:5: Error: The getter 'instanceDuplicateFieldAndSetter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceDuplicateFieldAndSetter'.
+  c.instanceDuplicateFieldAndSetter;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceDuplicateFieldAndSetter;
+  c.{self::Class::instanceDuplicateFieldAndSetter} = 0;
+  c.{self::Class::instanceFieldAndDuplicateSetter}{core::int};
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:95:5: Error: The setter 'instanceFieldAndDuplicateSetter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceFieldAndDuplicateSetter'.
+  c.instanceFieldAndDuplicateSetter = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceFieldAndDuplicateSetter = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:96:5: Error: The getter 'instanceDuplicateFieldAndDuplicateSetter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceDuplicateFieldAndDuplicateSetter'.
+  c.instanceDuplicateFieldAndDuplicateSetter;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceDuplicateFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance.dart:97:5: Error: The setter 'instanceDuplicateFieldAndDuplicateSetter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/duplicates_instance.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceDuplicateFieldAndDuplicateSetter'.
+  c.instanceDuplicateFieldAndDuplicateSetter = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceDuplicateFieldAndDuplicateSetter = 0;
+}
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  c.{self::Class::instanceFieldAndSetter1} = 0;
+  self::expect(null, self::result);
+  self::expect(0, c.{self::Class::instanceFieldAndSetter1}{core::int});
+  self::result = null;
+  c.{self::Class::instanceFieldAndSetter2} = 0;
+  self::expect(null, self::result);
+  self::expect(0, c.{self::Class::instanceFieldAndSetter2}{core::int});
+  self::result = null;
+  c.{self::Class::instanceLateFinalFieldAndSetter1} = 0;
+  self::expect(null, self::result);
+  self::expect(0, c.{self::Class::instanceLateFinalFieldAndSetter1}{core::int});
+  self::result = null;
+  c.{self::Class::instanceLateFinalFieldAndSetter2} = 0;
+  self::expect(null, self::result);
+  self::expect(0, c.{self::Class::instanceLateFinalFieldAndSetter2}{core::int});
+  self::result = null;
+  self::expect(1, c.{self::Class::instanceMethodAndSetter1}(){() → core::int});
+  c.{self::Class::instanceMethodAndSetter1} = 0;
+  self::expect(2, self::result);
+  self::result = null;
+  self::expect(1, c.{self::Class::instanceMethodAndSetter2}(){() → core::int});
+  c.{self::Class::instanceMethodAndSetter2} = 0;
+  self::expect(2, self::result);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..92b80e8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart.weak.modular.expect
@@ -0,0 +1,432 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:9:7: Error: 'instanceMethod' is already declared in this scope.
+//   int instanceMethod() => 2;
+//       ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:8:7: Context: Previous declaration of 'instanceMethod'.
+//   int instanceMethod() => 1;
+//       ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:12:11: Error: 'instanceGetter' is already declared in this scope.
+//   int get instanceGetter => 2;
+//           ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:11:11: Context: Previous declaration of 'instanceGetter'.
+//   int get instanceGetter => 1;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:18:12: Error: 'instanceSetter' is already declared in this scope.
+//   void set instanceSetter(value) {
+//            ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:14:12: Context: Previous declaration of 'instanceSetter'.
+//   void set instanceSetter(value) {
+//            ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:22:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int instanceField = 1;
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:23:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int instanceField = 2;
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:23:7: Error: 'instanceField' is already declared in this scope.
+//   int instanceField = 2;
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:22:7: Context: Previous declaration of 'instanceField'.
+//   int instanceField = 1;
+//       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:25:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int instanceFieldAndSetter1 = 1;
+//       ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:33:7: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int instanceFieldAndSetter2 = 1;
+//       ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:35:18: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   late final int instanceLateFinalFieldAndSetter1;
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:43:18: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   late final int instanceLateFinalFieldAndSetter2;
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:45:13: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int instanceDuplicateFieldAndSetter = 1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:46:13: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int instanceDuplicateFieldAndSetter = 2;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:46:13: Error: 'instanceDuplicateFieldAndSetter' is already declared in this scope.
+//   final int instanceDuplicateFieldAndSetter = 2;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:45:13: Context: Previous declaration of 'instanceDuplicateFieldAndSetter'.
+//   final int instanceDuplicateFieldAndSetter = 1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:51:13: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int instanceFieldAndDuplicateSetter = 1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:56:12: Error: 'instanceFieldAndDuplicateSetter' is already declared in this scope.
+//   void set instanceFieldAndDuplicateSetter(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:52:12: Context: Previous declaration of 'instanceFieldAndDuplicateSetter'.
+//   void set instanceFieldAndDuplicateSetter(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:60:13: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int instanceDuplicateFieldAndDuplicateSetter = 1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:61:13: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int instanceDuplicateFieldAndDuplicateSetter = 2;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:61:13: Error: 'instanceDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+//   final int instanceDuplicateFieldAndDuplicateSetter = 2;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:60:13: Context: Previous declaration of 'instanceDuplicateFieldAndDuplicateSetter'.
+//   final int instanceDuplicateFieldAndDuplicateSetter = 1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:66:12: Error: 'instanceDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+//   void set instanceDuplicateFieldAndDuplicateSetter(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:62:12: Context: Previous declaration of 'instanceDuplicateFieldAndDuplicateSetter'.
+//   void set instanceDuplicateFieldAndDuplicateSetter(int value) {
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:26:12: Error: Conflicts with the implicit setter of the field 'instanceFieldAndSetter1'.
+//   void set instanceFieldAndSetter1(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:25:7: Error: Conflicts with setter 'instanceFieldAndSetter1'.
+//   int instanceFieldAndSetter1 = 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:30:12: Error: Conflicts with the implicit setter of the field 'instanceFieldAndSetter2'.
+//   void set instanceFieldAndSetter2(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:33:7: Error: Conflicts with setter 'instanceFieldAndSetter2'.
+//   int instanceFieldAndSetter2 = 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:36:12: Error: Conflicts with the implicit setter of the field 'instanceLateFinalFieldAndSetter1'.
+//   void set instanceLateFinalFieldAndSetter1(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:35:18: Error: Conflicts with setter 'instanceLateFinalFieldAndSetter1'.
+//   late final int instanceLateFinalFieldAndSetter1;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:40:12: Error: Conflicts with the implicit setter of the field 'instanceLateFinalFieldAndSetter2'.
+//   void set instanceLateFinalFieldAndSetter2(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:43:18: Error: Conflicts with setter 'instanceLateFinalFieldAndSetter2'.
+//   late final int instanceLateFinalFieldAndSetter2;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:71:12: Error: Conflicts with member 'instanceMethodAndSetter1'.
+//   void set instanceMethodAndSetter1(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:70:7: Error: Conflicts with setter 'instanceMethodAndSetter1'.
+//   int instanceMethodAndSetter1() => 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:75:12: Error: Conflicts with member 'instanceMethodAndSetter2'.
+//   void set instanceMethodAndSetter2(int value) {
+//            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:78:7: Error: Conflicts with setter 'instanceMethodAndSetter2'.
+//   int instanceMethodAndSetter2() => 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:83:5: Error: The method 'instanceMethod' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'instanceMethod'.
+//   c.instanceMethod();
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:84:6: Error: The getter 'instanceMethod' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceMethod'.
+//   (c.instanceMethod)();
+//      ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:85:5: Error: The getter 'instanceGetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceGetter'.
+//   c.instanceGetter;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:86:5: Error: The setter 'instanceSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceSetter'.
+//   c.instanceSetter = 0;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:87:5: Error: The getter 'instanceField' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceField'.
+//   c.instanceField;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:88:5: Error: The setter 'instanceField' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceField'.
+//   c.instanceField = 0;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:89:5: Error: The getter 'instanceFieldAndSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceFieldAndSetter1'.
+//   c.instanceFieldAndSetter1;
+//     ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:90:5: Error: The setter 'instanceFieldAndSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceFieldAndSetter1'.
+//   c.instanceFieldAndSetter1 = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:91:5: Error: The getter 'instanceFieldAndSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceFieldAndSetter2'.
+//   c.instanceFieldAndSetter2;
+//     ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:92:5: Error: The setter 'instanceFieldAndSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceFieldAndSetter2'.
+//   c.instanceFieldAndSetter2 = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:93:5: Error: The getter 'instanceLateFinalFieldAndSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceLateFinalFieldAndSetter1'.
+//   c.instanceLateFinalFieldAndSetter1;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:94:5: Error: The setter 'instanceLateFinalFieldAndSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceLateFinalFieldAndSetter1'.
+//   c.instanceLateFinalFieldAndSetter1 = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:95:5: Error: The getter 'instanceLateFinalFieldAndSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceLateFinalFieldAndSetter2'.
+//   c.instanceLateFinalFieldAndSetter2;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:96:5: Error: The setter 'instanceLateFinalFieldAndSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceLateFinalFieldAndSetter2'.
+//   c.instanceLateFinalFieldAndSetter2 = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:97:5: Error: The getter 'instanceDuplicateFieldAndSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceDuplicateFieldAndSetter'.
+//   c.instanceDuplicateFieldAndSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:98:5: Error: The getter 'instanceFieldAndDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceFieldAndDuplicateSetter'.
+//   c.instanceFieldAndDuplicateSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:99:5: Error: The setter 'instanceFieldAndDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceFieldAndDuplicateSetter'.
+//   c.instanceFieldAndDuplicateSetter = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:100:5: Error: The getter 'instanceDuplicateFieldAndDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceDuplicateFieldAndDuplicateSetter'.
+//   c.instanceDuplicateFieldAndDuplicateSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:101:5: Error: The setter 'instanceDuplicateFieldAndDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceDuplicateFieldAndDuplicateSetter'.
+//   c.instanceDuplicateFieldAndDuplicateSetter = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::int {
+  method instanceMethod = self::Extension|instanceMethod;
+  tearoff instanceMethod = self::Extension|get#instanceMethod;
+  get instanceGetter = self::Extension|get#instanceGetter;
+  field instanceField = self::Extension|instanceField;
+  field instanceFieldAndSetter1 = self::Extension|instanceFieldAndSetter1;
+  field instanceFieldAndSetter2 = self::Extension|instanceFieldAndSetter2;
+  field instanceLateFinalFieldAndSetter1 = self::Extension|instanceLateFinalFieldAndSetter1;
+  field instanceLateFinalFieldAndSetter2 = self::Extension|instanceLateFinalFieldAndSetter2;
+  field instanceDuplicateFieldAndSetter = self::Extension|instanceDuplicateFieldAndSetter;
+  field instanceFieldAndDuplicateSetter = self::Extension|instanceFieldAndDuplicateSetter;
+  field instanceDuplicateFieldAndDuplicateSetter = self::Extension|instanceDuplicateFieldAndDuplicateSetter;
+  method instanceMethodAndSetter1 = self::Extension|instanceMethodAndSetter1;
+  tearoff instanceMethodAndSetter1 = self::Extension|get#instanceMethodAndSetter1;
+  method instanceMethodAndSetter2 = self::Extension|instanceMethodAndSetter2;
+  tearoff instanceMethodAndSetter2 = self::Extension|get#instanceMethodAndSetter2;
+  set instanceSetter = self::Extension|set#instanceSetter;
+  set instanceDuplicateFieldAndSetter = self::Extension|set#instanceDuplicateFieldAndSetter;
+  set instanceFieldAndDuplicateSetter = self::Extension|set#instanceFieldAndDuplicateSetter;
+  set instanceDuplicateFieldAndDuplicateSetter = self::Extension|set#instanceDuplicateFieldAndDuplicateSetter;
+  set instanceMethodAndSetter1 = self::Extension|set#instanceMethodAndSetter1;
+  set instanceMethodAndSetter2 = self::Extension|set#instanceMethodAndSetter2;
+}
+static field dynamic result;
+static field core::int Extension|instanceField;
+static field core::int Extension|instanceFieldAndSetter1 = 1;
+static field core::int Extension|instanceFieldAndSetter2 = 1;
+late static final [setter] field core::int Extension|instanceLateFinalFieldAndSetter1;
+late static final [setter] field core::int Extension|instanceLateFinalFieldAndSetter2;
+static final field core::int Extension|instanceDuplicateFieldAndSetter;
+static final field core::int Extension|instanceFieldAndDuplicateSetter = 1;
+static final field core::int Extension|instanceDuplicateFieldAndDuplicateSetter;
+static method Extension|instanceMethod(lowered final core::int #this) → core::int
+  return 1;
+static method Extension|get#instanceMethod(lowered final core::int #this) → () → core::int
+  return () → core::int => self::Extension|instanceMethod(#this);
+static method Extension|get#instanceGetter(lowered final core::int #this) → core::int
+  return 1;
+static method Extension|set#instanceSetter(lowered final core::int #this, dynamic value) → void {
+  self::result = 1;
+}
+static method Extension|set#instanceDuplicateFieldAndSetter(lowered final core::int #this, core::int value) → void {
+  self::result = 3;
+}
+static method Extension|set#instanceFieldAndDuplicateSetter(lowered final core::int #this, core::int value) → void {
+  self::result = 2;
+}
+static method Extension|set#instanceDuplicateFieldAndDuplicateSetter(lowered final core::int #this, core::int value) → void {
+  self::result = 3;
+}
+static method Extension|instanceMethodAndSetter1(lowered final core::int #this) → core::int
+  return 1;
+static method Extension|get#instanceMethodAndSetter1(lowered final core::int #this) → () → core::int
+  return () → core::int => self::Extension|instanceMethodAndSetter1(#this);
+static method Extension|set#instanceMethodAndSetter1(lowered final core::int #this, core::int value) → void {
+  self::result = 2;
+}
+static method Extension|set#instanceMethodAndSetter2(lowered final core::int #this, core::int value) → void {
+  self::result = 2;
+}
+static method Extension|instanceMethodAndSetter2(lowered final core::int #this) → core::int
+  return 1;
+static method Extension|get#instanceMethodAndSetter2(lowered final core::int #this) → () → core::int
+  return () → core::int => self::Extension|instanceMethodAndSetter2(#this);
+static method test() → dynamic {
+  core::int c = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:83:5: Error: The method 'instanceMethod' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'instanceMethod'.
+  c.instanceMethod();
+    ^^^^^^^^^^^^^^" in c{<unresolved>}.instanceMethod();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:84:6: Error: The getter 'instanceMethod' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceMethod'.
+  (c.instanceMethod)();
+     ^^^^^^^^^^^^^^" in c{<unresolved>}.instanceMethod{dynamic}.call();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:85:5: Error: The getter 'instanceGetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceGetter'.
+  c.instanceGetter;
+    ^^^^^^^^^^^^^^" in c{<unresolved>}.instanceGetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:86:5: Error: The setter 'instanceSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceSetter'.
+  c.instanceSetter = 0;
+    ^^^^^^^^^^^^^^" in c{<unresolved>}.instanceSetter = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:87:5: Error: The getter 'instanceField' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceField'.
+  c.instanceField;
+    ^^^^^^^^^^^^^" in c{<unresolved>}.instanceField;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:88:5: Error: The setter 'instanceField' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceField'.
+  c.instanceField = 0;
+    ^^^^^^^^^^^^^" in c{<unresolved>}.instanceField = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:89:5: Error: The getter 'instanceFieldAndSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceFieldAndSetter1'.
+  c.instanceFieldAndSetter1;
+    ^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceFieldAndSetter1;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:90:5: Error: The setter 'instanceFieldAndSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceFieldAndSetter1'.
+  c.instanceFieldAndSetter1 = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceFieldAndSetter1 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:91:5: Error: The getter 'instanceFieldAndSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceFieldAndSetter2'.
+  c.instanceFieldAndSetter2;
+    ^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceFieldAndSetter2;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:92:5: Error: The setter 'instanceFieldAndSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceFieldAndSetter2'.
+  c.instanceFieldAndSetter2 = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceFieldAndSetter2 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:93:5: Error: The getter 'instanceLateFinalFieldAndSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceLateFinalFieldAndSetter1'.
+  c.instanceLateFinalFieldAndSetter1;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceLateFinalFieldAndSetter1;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:94:5: Error: The setter 'instanceLateFinalFieldAndSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceLateFinalFieldAndSetter1'.
+  c.instanceLateFinalFieldAndSetter1 = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceLateFinalFieldAndSetter1 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:95:5: Error: The getter 'instanceLateFinalFieldAndSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceLateFinalFieldAndSetter2'.
+  c.instanceLateFinalFieldAndSetter2;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceLateFinalFieldAndSetter2;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:96:5: Error: The setter 'instanceLateFinalFieldAndSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceLateFinalFieldAndSetter2'.
+  c.instanceLateFinalFieldAndSetter2 = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceLateFinalFieldAndSetter2 = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:97:5: Error: The getter 'instanceDuplicateFieldAndSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceDuplicateFieldAndSetter'.
+  c.instanceDuplicateFieldAndSetter;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceDuplicateFieldAndSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:98:5: Error: The getter 'instanceFieldAndDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceFieldAndDuplicateSetter'.
+  c.instanceFieldAndDuplicateSetter;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:99:5: Error: The setter 'instanceFieldAndDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceFieldAndDuplicateSetter'.
+  c.instanceFieldAndDuplicateSetter = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceFieldAndDuplicateSetter = 0;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:100:5: Error: The getter 'instanceDuplicateFieldAndDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'instanceDuplicateFieldAndDuplicateSetter'.
+  c.instanceDuplicateFieldAndDuplicateSetter;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceDuplicateFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_instance_extension.dart:101:5: Error: The setter 'instanceDuplicateFieldAndDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'instanceDuplicateFieldAndDuplicateSetter'.
+  c.instanceDuplicateFieldAndDuplicateSetter = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.instanceDuplicateFieldAndDuplicateSetter = 0;
+}
+static method main() → dynamic {
+  core::int c = 0;
+  self::result = null;
+  self::Extension|set#instanceDuplicateFieldAndSetter(c, 0);
+  self::expect(3, self::result);
+  self::result = null;
+  self::expect(1, self::Extension|instanceMethodAndSetter1(c));
+  self::Extension|set#instanceMethodAndSetter1(c, 0);
+  self::expect(2, self::result);
+  self::result = null;
+  self::expect(1, self::Extension|instanceMethodAndSetter2(c));
+  self::Extension|set#instanceMethodAndSetter2(c, 0);
+  self::expect(2, self::result);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd/duplicates_static.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/duplicates_static.dart.weak.modular.expect
new file mode 100644
index 0000000..d487082
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicates_static.dart.weak.modular.expect
@@ -0,0 +1,293 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:9:14: Error: 'staticMethod' is already declared in this scope.
+//   static int staticMethod() => 2;
+//              ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:8:14: Context: Previous declaration of 'staticMethod'.
+//   static int staticMethod() => 1;
+//              ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:12:18: Error: 'staticGetter' is already declared in this scope.
+//   static int get staticGetter => 2;
+//                  ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:11:18: Context: Previous declaration of 'staticGetter'.
+//   static int get staticGetter => 1;
+//                  ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:18:19: Error: 'staticSetter' is already declared in this scope.
+//   static void set staticSetter(value) {
+//                   ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:14:19: Context: Previous declaration of 'staticSetter'.
+//   static void set staticSetter(value) {
+//                   ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:23:14: Error: 'staticField' is already declared in this scope.
+//   static int staticField = 2;
+//              ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:22:14: Context: Previous declaration of 'staticField'.
+//   static int staticField = 1;
+//              ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:48:20: Error: 'staticDuplicateFieldAndSetter' is already declared in this scope.
+//   static final int staticDuplicateFieldAndSetter = 2;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:47:20: Context: Previous declaration of 'staticDuplicateFieldAndSetter'.
+//   static final int staticDuplicateFieldAndSetter = 1;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:58:19: Error: 'staticFieldAndDuplicateSetter' is already declared in this scope.
+//   static void set staticFieldAndDuplicateSetter(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:54:19: Context: Previous declaration of 'staticFieldAndDuplicateSetter'.
+//   static void set staticFieldAndDuplicateSetter(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:63:20: Error: 'staticDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+//   static final int staticDuplicateFieldAndDuplicateSetter = 2;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:62:20: Context: Previous declaration of 'staticDuplicateFieldAndDuplicateSetter'.
+//   static final int staticDuplicateFieldAndDuplicateSetter = 1;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:68:19: Error: 'staticDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+//   static void set staticDuplicateFieldAndDuplicateSetter(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:64:19: Context: Previous declaration of 'staticDuplicateFieldAndDuplicateSetter'.
+//   static void set staticDuplicateFieldAndDuplicateSetter(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:26:19: Error: Conflicts with the implicit setter of the field 'staticFieldAndSetter1'.
+//   static void set staticFieldAndSetter1(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:25:14: Error: Conflicts with setter 'staticFieldAndSetter1'.
+//   static int staticFieldAndSetter1 = 1;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:30:19: Error: Conflicts with the implicit setter of the field 'staticFieldAndSetter2'.
+//   static void set staticFieldAndSetter2(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:34:14: Error: Conflicts with setter 'staticFieldAndSetter2'.
+//   static int staticFieldAndSetter2 = 1;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:37:19: Error: Conflicts with the implicit setter of the field 'staticLateFinalFieldAndSetter1'.
+//   static void set staticLateFinalFieldAndSetter1(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:36:25: Error: Conflicts with setter 'staticLateFinalFieldAndSetter1'.
+//   static late final int staticLateFinalFieldAndSetter1;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:41:19: Error: Conflicts with the implicit setter of the field 'staticLateFinalFieldAndSetter2'.
+//   static void set staticLateFinalFieldAndSetter2(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:45:25: Error: Conflicts with setter 'staticLateFinalFieldAndSetter2'.
+//   static late final int staticLateFinalFieldAndSetter2;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:73:19: Error: 'staticMethodAndSetter1' is already declared in this scope.
+//   static void set staticMethodAndSetter1(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:72:14: Context: Previous declaration of 'staticMethodAndSetter1'.
+//   static int staticMethodAndSetter1() => 1;
+//              ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:81:14: Error: 'staticMethodAndSetter2' is already declared in this scope.
+//   static int staticMethodAndSetter2() => 1;
+//              ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:77:19: Context: Previous declaration of 'staticMethodAndSetter2'.
+//   static void set staticMethodAndSetter2(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:85:9: Error: Can't use 'staticMethod' because it is declared more than once.
+//   Class.staticMethod();
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:86:10: Error: Can't use 'staticMethod' because it is declared more than once.
+//   (Class.staticMethod)();
+//          ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:87:9: Error: Can't use 'staticGetter' because it is declared more than once.
+//   Class.staticGetter;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:88:9: Error: Can't use 'staticSetter' because it is declared more than once.
+//   Class.staticSetter = 0;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:88:22: Error: Can't assign to this.
+//   Class.staticSetter = 0;
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:89:9: Error: Can't use 'staticField' because it is declared more than once.
+//   Class.staticField;
+//         ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:90:9: Error: Can't use 'staticField' because it is declared more than once.
+//   Class.staticField = 0;
+//         ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:90:21: Error: Can't assign to this.
+//   Class.staticField = 0;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:91:9: Error: Can't use 'staticDuplicateFieldAndSetter' because it is declared more than once.
+//   Class.staticDuplicateFieldAndSetter;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:92:9: Error: Can't use 'staticDuplicateFieldAndSetter' because it is declared more than once.
+//   Class.staticDuplicateFieldAndSetter = 0;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:92:39: Error: Can't assign to this.
+//   Class.staticDuplicateFieldAndSetter = 0;
+//                                       ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:94:9: Error: Setter not found: 'staticFieldAndDuplicateSetter'.
+//   Class.staticFieldAndDuplicateSetter = 0;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:95:9: Error: Can't use 'staticDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+//   Class.staticDuplicateFieldAndDuplicateSetter;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:96:9: Error: Can't use 'staticDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+//   Class.staticDuplicateFieldAndDuplicateSetter = 0;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:96:48: Error: Can't assign to this.
+//   Class.staticDuplicateFieldAndDuplicateSetter = 0;
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:97:9: Error: Setter not found: 'staticMethodAndSetter1'.
+//   Class.staticMethodAndSetter1 = 0;
+//         ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static.dart:98:9: Error: Setter not found: 'staticMethodAndSetter2'.
+//   Class.staticMethodAndSetter2 = 0;
+//         ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static field core::int staticField = null;
+  static field core::int staticFieldAndSetter1 = 1;
+  static field core::int staticFieldAndSetter2 = 1;
+  late static final [setter] field core::int staticLateFinalFieldAndSetter1;
+  late static final [setter] field core::int staticLateFinalFieldAndSetter2;
+  static final field core::int staticDuplicateFieldAndSetter = null;
+  static final field core::int staticFieldAndDuplicateSetter = 1;
+  static final field core::int staticDuplicateFieldAndDuplicateSetter = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static method staticMethod() → core::int
+    return 1;
+  static get staticGetter() → core::int
+    return 1;
+  static set staticSetter(dynamic value) → void {
+    self::result = 1;
+  }
+  static set staticDuplicateFieldAndSetter(core::int value) → void {
+    self::result = 3;
+  }
+  static set staticFieldAndDuplicateSetter(core::int value) → void {
+    self::result = 2;
+  }
+  static set staticDuplicateFieldAndDuplicateSetter(core::int value) → void {
+    self::result = 3;
+  }
+  static method staticMethodAndSetter1() → core::int
+    return 1;
+  static set staticMethodAndSetter1(core::int value) → void {
+    self::result = 2;
+  }
+  static set staticMethodAndSetter2(core::int value) → void {
+    self::result = 2;
+  }
+  static method staticMethodAndSetter2() → core::int
+    return 1;
+}
+static field dynamic result;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:85:9: Error: Can't use 'staticMethod' because it is declared more than once.
+  Class.staticMethod();
+        ^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:86:10: Error: Can't use 'staticMethod' because it is declared more than once.
+  (Class.staticMethod)();
+         ^^^^^^^^^^^^"{dynamic}.call();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:87:9: Error: Can't use 'staticGetter' because it is declared more than once.
+  Class.staticGetter;
+        ^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:88:22: Error: Can't assign to this.
+  Class.staticSetter = 0;
+                     ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:89:9: Error: Can't use 'staticField' because it is declared more than once.
+  Class.staticField;
+        ^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:90:21: Error: Can't assign to this.
+  Class.staticField = 0;
+                    ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:91:9: Error: Can't use 'staticDuplicateFieldAndSetter' because it is declared more than once.
+  Class.staticDuplicateFieldAndSetter;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:92:39: Error: Can't assign to this.
+  Class.staticDuplicateFieldAndSetter = 0;
+                                      ^";
+  self::Class::staticFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:94:9: Error: Setter not found: 'staticFieldAndDuplicateSetter'.
+  Class.staticFieldAndDuplicateSetter = 0;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:95:9: Error: Can't use 'staticDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+  Class.staticDuplicateFieldAndDuplicateSetter;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:96:48: Error: Can't assign to this.
+  Class.staticDuplicateFieldAndDuplicateSetter = 0;
+                                               ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:97:9: Error: Setter not found: 'staticMethodAndSetter1'.
+  Class.staticMethodAndSetter1 = 0;
+        ^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static.dart:98:9: Error: Setter not found: 'staticMethodAndSetter2'.
+  Class.staticMethodAndSetter2 = 0;
+        ^^^^^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  self::result = null;
+  self::Class::staticFieldAndSetter1 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::Class::staticFieldAndSetter1);
+  self::result = null;
+  self::Class::staticFieldAndSetter2 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::Class::staticFieldAndSetter2);
+  self::result = null;
+  self::Class::staticLateFinalFieldAndSetter1 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::Class::staticLateFinalFieldAndSetter1);
+  self::result = null;
+  self::Class::staticLateFinalFieldAndSetter2 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::Class::staticLateFinalFieldAndSetter2);
+  self::expect(1, self::Class::staticMethodAndSetter1());
+  self::expect(1, self::Class::staticMethodAndSetter2());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd/duplicates_static_extension.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/duplicates_static_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..925247a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicates_static_extension.dart.weak.modular.expect
@@ -0,0 +1,310 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:9:14: Error: 'staticMethod' is already declared in this scope.
+//   static int staticMethod() => 2;
+//              ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:8:14: Context: Previous declaration of 'staticMethod'.
+//   static int staticMethod() => 1;
+//              ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:12:18: Error: 'staticGetter' is already declared in this scope.
+//   static int get staticGetter => 2;
+//                  ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:11:18: Context: Previous declaration of 'staticGetter'.
+//   static int get staticGetter => 1;
+//                  ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:18:19: Error: 'staticSetter' is already declared in this scope.
+//   static void set staticSetter(value) {
+//                   ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:14:19: Context: Previous declaration of 'staticSetter'.
+//   static void set staticSetter(value) {
+//                   ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:23:14: Error: 'staticField' is already declared in this scope.
+//   static int staticField = 2;
+//              ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:22:14: Context: Previous declaration of 'staticField'.
+//   static int staticField = 1;
+//              ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:48:20: Error: 'staticDuplicateFieldAndSetter' is already declared in this scope.
+//   static final int staticDuplicateFieldAndSetter = 2;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:47:20: Context: Previous declaration of 'staticDuplicateFieldAndSetter'.
+//   static final int staticDuplicateFieldAndSetter = 1;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:58:19: Error: 'staticFieldAndDuplicateSetter' is already declared in this scope.
+//   static void set staticFieldAndDuplicateSetter(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:54:19: Context: Previous declaration of 'staticFieldAndDuplicateSetter'.
+//   static void set staticFieldAndDuplicateSetter(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:63:20: Error: 'staticDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+//   static final int staticDuplicateFieldAndDuplicateSetter = 2;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:62:20: Context: Previous declaration of 'staticDuplicateFieldAndDuplicateSetter'.
+//   static final int staticDuplicateFieldAndDuplicateSetter = 1;
+//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:68:19: Error: 'staticDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+//   static void set staticDuplicateFieldAndDuplicateSetter(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:64:19: Context: Previous declaration of 'staticDuplicateFieldAndDuplicateSetter'.
+//   static void set staticDuplicateFieldAndDuplicateSetter(int value) {
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:26:19: Error: Conflicts with the implicit setter of the field 'staticFieldAndSetter1'.
+//   static void set staticFieldAndSetter1(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:25:14: Error: Conflicts with setter 'staticFieldAndSetter1'.
+//   static int staticFieldAndSetter1 = 1;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:30:19: Error: Conflicts with the implicit setter of the field 'staticFieldAndSetter2'.
+//   static void set staticFieldAndSetter2(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:34:14: Error: Conflicts with setter 'staticFieldAndSetter2'.
+//   static int staticFieldAndSetter2 = 1;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:37:19: Error: Conflicts with the implicit setter of the field 'staticLateFinalFieldAndSetter1'.
+//   static void set staticLateFinalFieldAndSetter1(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:36:25: Error: Conflicts with setter 'staticLateFinalFieldAndSetter1'.
+//   static late final int staticLateFinalFieldAndSetter1;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:41:19: Error: Conflicts with the implicit setter of the field 'staticLateFinalFieldAndSetter2'.
+//   static void set staticLateFinalFieldAndSetter2(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:45:25: Error: Conflicts with setter 'staticLateFinalFieldAndSetter2'.
+//   static late final int staticLateFinalFieldAndSetter2;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:73:19: Error: Conflicts with member 'staticMethodAndSetter1'.
+//   static void set staticMethodAndSetter1(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:72:14: Error: Conflicts with setter 'staticMethodAndSetter1'.
+//   static int staticMethodAndSetter1() => 1;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:77:19: Error: Conflicts with member 'staticMethodAndSetter2'.
+//   static void set staticMethodAndSetter2(int value) {
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:81:14: Error: Conflicts with setter 'staticMethodAndSetter2'.
+//   static int staticMethodAndSetter2() => 1;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:85:13: Error: Can't use 'staticMethod' because it is declared more than once.
+//   Extension.staticMethod();
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:86:14: Error: Can't use 'staticMethod' because it is declared more than once.
+//   (Extension.staticMethod)();
+//              ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:87:13: Error: Can't use 'staticGetter' because it is declared more than once.
+//   Extension.staticGetter;
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:88:13: Error: Can't use 'staticSetter' because it is declared more than once.
+//   Extension.staticSetter = 0;
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:88:26: Error: Can't assign to this.
+//   Extension.staticSetter = 0;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:89:13: Error: Can't use 'staticField' because it is declared more than once.
+//   Extension.staticField;
+//             ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:90:13: Error: Can't use 'staticField' because it is declared more than once.
+//   Extension.staticField = 0;
+//             ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:90:25: Error: Can't assign to this.
+//   Extension.staticField = 0;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:91:13: Error: Can't use 'staticDuplicateFieldAndSetter' because it is declared more than once.
+//   Extension.staticDuplicateFieldAndSetter;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:92:13: Error: Can't use 'staticDuplicateFieldAndSetter' because it is declared more than once.
+//   Extension.staticDuplicateFieldAndSetter = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:92:43: Error: Can't assign to this.
+//   Extension.staticDuplicateFieldAndSetter = 0;
+//                                           ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:94:13: Error: Setter not found: 'staticFieldAndDuplicateSetter'.
+//   Extension.staticFieldAndDuplicateSetter = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:95:13: Error: Can't use 'staticDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+//   Extension.staticDuplicateFieldAndDuplicateSetter;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:96:13: Error: Can't use 'staticDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+//   Extension.staticDuplicateFieldAndDuplicateSetter = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:96:52: Error: Can't assign to this.
+//   Extension.staticDuplicateFieldAndDuplicateSetter = 0;
+//                                                    ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:97:13: Error: Setter not found: 'staticMethodAndSetter1'.
+//   Extension.staticMethodAndSetter1 = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:98:13: Error: Setter not found: 'staticMethodAndSetter2'.
+//   Extension.staticMethodAndSetter2 = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::int {
+  static method staticMethod = self::Extension|staticMethod;
+  static get staticGetter = get self::Extension|staticGetter;
+  static field staticField = self::Extension|staticField;
+  static field staticFieldAndSetter1 = self::Extension|staticFieldAndSetter1;
+  static field staticFieldAndSetter2 = self::Extension|staticFieldAndSetter2;
+  static field staticLateFinalFieldAndSetter1 = self::Extension|staticLateFinalFieldAndSetter1;
+  static field staticLateFinalFieldAndSetter2 = self::Extension|staticLateFinalFieldAndSetter2;
+  static field staticDuplicateFieldAndSetter = self::Extension|staticDuplicateFieldAndSetter;
+  static field staticFieldAndDuplicateSetter = self::Extension|staticFieldAndDuplicateSetter;
+  static field staticDuplicateFieldAndDuplicateSetter = self::Extension|staticDuplicateFieldAndDuplicateSetter;
+  static method staticMethodAndSetter1 = self::Extension|staticMethodAndSetter1;
+  static method staticMethodAndSetter2 = self::Extension|staticMethodAndSetter2;
+  static set staticSetter = set self::Extension|staticSetter;
+  static set staticDuplicateFieldAndSetter = set self::Extension|staticDuplicateFieldAndSetter;
+  static set staticFieldAndDuplicateSetter = set self::Extension|staticFieldAndDuplicateSetter;
+  static set staticDuplicateFieldAndDuplicateSetter = set self::Extension|staticDuplicateFieldAndDuplicateSetter;
+  static set staticMethodAndSetter1 = set self::Extension|staticMethodAndSetter1;
+  static set staticMethodAndSetter2 = set self::Extension|staticMethodAndSetter2;
+}
+static field dynamic result;
+static field core::int Extension|staticField;
+static field core::int Extension|staticFieldAndSetter1 = 1;
+static field core::int Extension|staticFieldAndSetter2 = 1;
+late static final [setter] field core::int Extension|staticLateFinalFieldAndSetter1;
+late static final [setter] field core::int Extension|staticLateFinalFieldAndSetter2;
+static final field core::int Extension|staticDuplicateFieldAndSetter;
+static final field core::int Extension|staticFieldAndDuplicateSetter = 1;
+static final field core::int Extension|staticDuplicateFieldAndDuplicateSetter;
+static method Extension|staticMethod() → core::int
+  return 1;
+static get Extension|staticGetter() → core::int
+  return 1;
+static set Extension|staticSetter(dynamic value) → void {
+  self::result = 1;
+}
+static set Extension|staticDuplicateFieldAndSetter(core::int value) → void {
+  self::result = 3;
+}
+static set Extension|staticFieldAndDuplicateSetter(core::int value) → void {
+  self::result = 2;
+}
+static set Extension|staticDuplicateFieldAndDuplicateSetter(core::int value) → void {
+  self::result = 3;
+}
+static method Extension|staticMethodAndSetter1() → core::int
+  return 1;
+static set Extension|staticMethodAndSetter1(core::int value) → void {
+  self::result = 2;
+}
+static set Extension|staticMethodAndSetter2(core::int value) → void {
+  self::result = 2;
+}
+static method Extension|staticMethodAndSetter2() → core::int
+  return 1;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:85:13: Error: Can't use 'staticMethod' because it is declared more than once.
+  Extension.staticMethod();
+            ^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:86:14: Error: Can't use 'staticMethod' because it is declared more than once.
+  (Extension.staticMethod)();
+             ^^^^^^^^^^^^"{dynamic}.call();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:87:13: Error: Can't use 'staticGetter' because it is declared more than once.
+  Extension.staticGetter;
+            ^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:88:26: Error: Can't assign to this.
+  Extension.staticSetter = 0;
+                         ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:89:13: Error: Can't use 'staticField' because it is declared more than once.
+  Extension.staticField;
+            ^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:90:25: Error: Can't assign to this.
+  Extension.staticField = 0;
+                        ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:91:13: Error: Can't use 'staticDuplicateFieldAndSetter' because it is declared more than once.
+  Extension.staticDuplicateFieldAndSetter;
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:92:43: Error: Can't assign to this.
+  Extension.staticDuplicateFieldAndSetter = 0;
+                                          ^";
+  self::Extension|staticFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:94:13: Error: Setter not found: 'staticFieldAndDuplicateSetter'.
+  Extension.staticFieldAndDuplicateSetter = 0;
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:95:13: Error: Can't use 'staticDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+  Extension.staticDuplicateFieldAndDuplicateSetter;
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:96:52: Error: Can't assign to this.
+  Extension.staticDuplicateFieldAndDuplicateSetter = 0;
+                                                   ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:97:13: Error: Setter not found: 'staticMethodAndSetter1'.
+  Extension.staticMethodAndSetter1 = 0;
+            ^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_static_extension.dart:98:13: Error: Setter not found: 'staticMethodAndSetter2'.
+  Extension.staticMethodAndSetter2 = 0;
+            ^^^^^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  self::result = null;
+  self::Extension|staticFieldAndSetter1 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::Extension|staticFieldAndSetter1);
+  self::result = null;
+  self::Extension|staticFieldAndSetter2 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::Extension|staticFieldAndSetter2);
+  self::result = null;
+  self::Extension|staticLateFinalFieldAndSetter1 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::Extension|staticLateFinalFieldAndSetter1);
+  self::result = null;
+  self::Extension|staticLateFinalFieldAndSetter2 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::Extension|staticLateFinalFieldAndSetter2);
+  self::expect(1, self::Extension|staticMethodAndSetter1());
+  self::expect(1, self::Extension|staticMethodAndSetter2());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.modular.expect
new file mode 100644
index 0000000..85c4c69
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicates_toplevel.dart.weak.modular.expect
@@ -0,0 +1,400 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:8:5: Error: 'topLevelMethod' is already declared in this scope.
+// int topLevelMethod() => 2;
+//     ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:7:5: Context: Previous declaration of 'topLevelMethod'.
+// int topLevelMethod() => 1;
+//     ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:11:9: Error: 'topLevelGetter' is already declared in this scope.
+// int get topLevelGetter => 2;
+//         ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:10:9: Context: Previous declaration of 'topLevelGetter'.
+// int get topLevelGetter => 1;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:17:10: Error: 'topLevelSetter' is already declared in this scope.
+// void set topLevelSetter(value) {
+//          ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:13:10: Context: Previous declaration of 'topLevelSetter'.
+// void set topLevelSetter(value) {
+//          ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:22:5: Error: 'topLevelField' is already declared in this scope.
+// int topLevelField = 2;
+//     ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:21:5: Context: Previous declaration of 'topLevelField'.
+// int topLevelField = 1;
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:47:11: Error: 'topLevelDuplicateFieldAndSetter' is already declared in this scope.
+// final int topLevelDuplicateFieldAndSetter = 2;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:46:11: Context: Previous declaration of 'topLevelDuplicateFieldAndSetter'.
+// final int topLevelDuplicateFieldAndSetter = 1;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:57:10: Error: 'topLevelFieldAndDuplicateSetter' is already declared in this scope.
+// void set topLevelFieldAndDuplicateSetter(int value) {
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:53:10: Context: Previous declaration of 'topLevelFieldAndDuplicateSetter'.
+// void set topLevelFieldAndDuplicateSetter(int value) {
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:62:11: Error: 'topLevelDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+// final int topLevelDuplicateFieldAndDuplicateSetter = 2;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:61:11: Context: Previous declaration of 'topLevelDuplicateFieldAndDuplicateSetter'.
+// final int topLevelDuplicateFieldAndDuplicateSetter = 1;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:67:10: Error: 'topLevelDuplicateFieldAndDuplicateSetter' is already declared in this scope.
+// void set topLevelDuplicateFieldAndDuplicateSetter(int value) {
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:63:10: Context: Previous declaration of 'topLevelDuplicateFieldAndDuplicateSetter'.
+// void set topLevelDuplicateFieldAndDuplicateSetter(int value) {
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart: Error: 'topLevelSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart: Error: 'topLevelFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart: Error: 'topLevelDuplicateFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:25:10: Error: Conflicts with the implicit setter of the field 'topLevelFieldAndSetter1'.
+// void set topLevelFieldAndSetter1(int value) {
+//          ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:24:5: Error: Conflicts with setter 'topLevelFieldAndSetter1'.
+// int topLevelFieldAndSetter1 = 1;
+//     ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:29:10: Error: Conflicts with the implicit setter of the field 'topLevelFieldAndSetter2'.
+// void set topLevelFieldAndSetter2(int value) {
+//          ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:33:5: Error: Conflicts with setter 'topLevelFieldAndSetter2'.
+// int topLevelFieldAndSetter2 = 1;
+//     ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:36:10: Error: Conflicts with the implicit setter of the field 'topLevelLateFinalFieldAndSetter1'.
+// void set topLevelLateFinalFieldAndSetter1(int value) {
+//          ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:35:16: Error: Conflicts with setter 'topLevelLateFinalFieldAndSetter1'.
+// late final int topLevelLateFinalFieldAndSetter1;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:40:10: Error: Conflicts with the implicit setter of the field 'topLevelLateFinalFieldAndSetter2'.
+// void set topLevelLateFinalFieldAndSetter2(int value) {
+//          ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:44:16: Error: Conflicts with setter 'topLevelLateFinalFieldAndSetter2'.
+// late final int topLevelLateFinalFieldAndSetter2;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:72:10: Error: Conflicts with member 'topLevelMethodAndSetter1'.
+// void set topLevelMethodAndSetter1(int value) {
+//          ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:71:5: Error: Conflicts with setter 'topLevelMethodAndSetter1'.
+// int topLevelMethodAndSetter1() => 1;
+//     ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:76:10: Error: Conflicts with member 'topLevelMethodAndSetter2'.
+// void set topLevelMethodAndSetter2(int value) {
+//          ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:80:5: Error: Conflicts with setter 'topLevelMethodAndSetter2'.
+// int topLevelMethodAndSetter2() => 1;
+//     ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:82:13: Error: Can't use 'topLevelMethod' because it is declared more than once.
+// var field = topLevelMethod;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:84:2: Error: Can't use 'topLevelMethod' because it is declared more than once.
+// @topLevelMethod
+//  ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:84:2: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+// @topLevelMethod
+//  ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:86:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:87:4: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   (topLevelMethod)();
+//    ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:88:7: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   if (topLevelMethod) {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:89:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:90:4: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   @topLevelMethod
+//    ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:90:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @topLevelMethod
+//    ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:93:24: Error: Expected ':' before this.
+//     case topLevelMethod;
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:93:10: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//     case topLevelMethod;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:95:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod || topLevelMethod;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:95:21: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod || topLevelMethod;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:96:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod + 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:97:18: Error: '~' isn't a binary operator.
+//   topLevelMethod ~ 0;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:98:21: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod ?? topLevelMethod;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:98:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod ?? topLevelMethod;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:99:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod?.foo;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:100:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+//   topLevelMethod?.foo();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:101:3: Error: Can't use 'topLevelGetter' because it is declared more than once.
+//   topLevelGetter;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:102:18: Error: Can't assign to this.
+//   topLevelSetter = 0;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:103:3: Error: Can't use 'topLevelField' because it is declared more than once.
+//   topLevelField;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:104:17: Error: Can't assign to this.
+//   topLevelField = 0;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:105:3: Error: Can't use 'topLevelDuplicateFieldAndSetter' because it is declared more than once.
+//   topLevelDuplicateFieldAndSetter;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:106:35: Error: Can't assign to this.
+//   topLevelDuplicateFieldAndSetter = 0;
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:108:3: Error: Setter not found: 'topLevelFieldAndDuplicateSetter'.
+//   topLevelFieldAndDuplicateSetter = 0;
+//   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:109:3: Error: Can't use 'topLevelDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+//   topLevelDuplicateFieldAndDuplicateSetter;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:110:44: Error: Can't assign to this.
+//   topLevelDuplicateFieldAndDuplicateSetter = 0;
+//                                            ^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:111:3: Error: Setter not found: 'topLevelMethodAndSetter1'.
+//   topLevelMethodAndSetter1 = 0;
+//   ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:112:3: Error: Setter not found: 'topLevelMethodAndSetter2'.
+//   topLevelMethodAndSetter2 = 0;
+//   ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static field dynamic result;
+static field core::int topLevelField;
+static field core::int topLevelFieldAndSetter1 = 1;
+static field core::int topLevelFieldAndSetter2 = 1;
+late static final [setter] field core::int topLevelLateFinalFieldAndSetter1;
+late static final [setter] field core::int topLevelLateFinalFieldAndSetter2;
+static final field core::int topLevelDuplicateFieldAndSetter;
+static final field core::int topLevelFieldAndDuplicateSetter = 1;
+static final field core::int topLevelDuplicateFieldAndDuplicateSetter;
+static field invalid-type field = invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:82:13: Error: Can't use 'topLevelMethod' because it is declared more than once.
+var field = topLevelMethod;
+            ^";
+static const field dynamic _exports# = #C1 /*isLegacy*/;
+static method topLevelMethod() → core::int
+  return 1;
+static get topLevelGetter() → core::int
+  return 1;
+static set topLevelSetter(dynamic value) → void {
+  self::result = 1;
+}
+static set topLevelDuplicateFieldAndSetter(core::int value) → void {
+  self::result = 3;
+}
+static set topLevelFieldAndDuplicateSetter(core::int value) → void {
+  self::result = 2;
+}
+static set topLevelDuplicateFieldAndDuplicateSetter(core::int value) → void {
+  self::result = 3;
+}
+static method topLevelMethodAndSetter1() → core::int
+  return 1;
+static set topLevelMethodAndSetter1(core::int value) → void {
+  self::result = 2;
+}
+static set topLevelMethodAndSetter2(core::int value) → void {
+  self::result = 2;
+}
+static method topLevelMethodAndSetter2() → core::int
+  return 1;
+@invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:84:2: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+@topLevelMethod
+ ^"
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:86:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod();
+  ^"{dynamic}.call();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:87:4: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  (topLevelMethod)();
+   ^"{dynamic}.call();
+  if(invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:88:7: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  if (topLevelMethod) {}
+      ^") {
+  }
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:89:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod;
+  ^";
+  @invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:90:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @topLevelMethod
+   ^" dynamic foo;
+  switch(null) {
+    #L1:
+    case invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:93:10: Error: Can't use 'topLevelMethod' because it is declared more than once.
+    case topLevelMethod;
+         ^":
+      {
+        ;
+      }
+  }
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:95:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod || topLevelMethod;
+  ^" || invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:95:21: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod || topLevelMethod;
+                    ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:96:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod + 0;
+  ^"{<invalid>}.+(0);
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:97:18: Error: '~' isn't a binary operator.
+  topLevelMethod ~ 0;
+                 ^";
+  let final invalid-type #t1 = invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:98:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod ?? topLevelMethod;
+  ^" in #t1 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:98:21: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod ?? topLevelMethod;
+                    ^" : #t1;
+  let final invalid-type #t2 = invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:99:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod?.foo;
+  ^" in #t2 == null ?{invalid-type} null : #t2{<invalid>}.foo;
+  let final invalid-type #t3 = invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:100:3: Error: Can't use 'topLevelMethod' because it is declared more than once.
+  topLevelMethod?.foo();
+  ^" in #t3 == null ?{dynamic} null : #t3{dynamic}.foo();
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:101:3: Error: Can't use 'topLevelGetter' because it is declared more than once.
+  topLevelGetter;
+  ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:102:18: Error: Can't assign to this.
+  topLevelSetter = 0;
+                 ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:103:3: Error: Can't use 'topLevelField' because it is declared more than once.
+  topLevelField;
+  ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:104:17: Error: Can't assign to this.
+  topLevelField = 0;
+                ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:105:3: Error: Can't use 'topLevelDuplicateFieldAndSetter' because it is declared more than once.
+  topLevelDuplicateFieldAndSetter;
+  ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:106:35: Error: Can't assign to this.
+  topLevelDuplicateFieldAndSetter = 0;
+                                  ^";
+  self::topLevelFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:108:3: Error: Setter not found: 'topLevelFieldAndDuplicateSetter'.
+  topLevelFieldAndDuplicateSetter = 0;
+  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:109:3: Error: Can't use 'topLevelDuplicateFieldAndDuplicateSetter' because it is declared more than once.
+  topLevelDuplicateFieldAndDuplicateSetter;
+  ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:110:44: Error: Can't assign to this.
+  topLevelDuplicateFieldAndDuplicateSetter = 0;
+                                           ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:111:3: Error: Setter not found: 'topLevelMethodAndSetter1'.
+  topLevelMethodAndSetter1 = 0;
+  ^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/duplicates_toplevel.dart:112:3: Error: Setter not found: 'topLevelMethodAndSetter2'.
+  topLevelMethodAndSetter2 = 0;
+  ^^^^^^^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  self::result = null;
+  self::topLevelFieldAndSetter1 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::topLevelFieldAndSetter1);
+  self::result = null;
+  self::topLevelFieldAndSetter2 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::topLevelFieldAndSetter2);
+  self::result = null;
+  self::topLevelLateFinalFieldAndSetter1 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::topLevelLateFinalFieldAndSetter1);
+  self::result = null;
+  self::topLevelLateFinalFieldAndSetter2 = 0;
+  self::expect(null, self::result);
+  self::expect(0, self::topLevelLateFinalFieldAndSetter2);
+  self::expect(1, self::topLevelMethodAndSetter1());
+  self::expect(1, self::topLevelMethodAndSetter2());
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f) → dynamic {
+  try {
+    f(){() → dynamic};
+  }
+  on core::Object catch(final core::Object e) {
+    core::print(e);
+    return;
+  }
+  throw "Expected exception.";
+}
+
+constants  {
+  #C1 = "{\"topLevelSetter\":\"'topLevelSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\",\"topLevelFieldAndDuplicateSetter\":\"'topLevelFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\",\"topLevelDuplicateFieldAndDuplicateSetter\":\"'topLevelDuplicateFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart' and 'pkg/front_end/testcases/nnbd/duplicates_toplevel.dart'.\"}"
+}
diff --git a/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.weak.modular.expect
new file mode 100644
index 0000000..0d1dd3b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/dynamic_object_call.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/dynamic_object_call.dart:21:22: Error: 'hashCode' isn't a function or method and can't be invoked.
+//   var v5 = c.hashCode();
+//                      ^^^^...
+//
+// pkg/front_end/testcases/nnbd/dynamic_object_call.dart:23:27: Error: The argument type 'String' can't be assigned to the parameter type 'Invocation'.
+//  - 'Invocation' is from 'dart:core'.
+//   var v6 = c.noSuchMethod("foo");
+//                           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Object o, {core::String foo = #C2}) → dynamic
+    return 42;
+  @#C1
+  method toString({core::String foo = #C2}) → core::String
+    return "foo";
+}
+static method main() → dynamic {}
+static method test() → dynamic {
+  dynamic c = new self::Class::•();
+  core::String v1 = c.{core::Object::toString}(){() → core::String};
+  dynamic v2 = c{dynamic}.toString(foo: 42);
+  () → core::String v3 = c.{core::Object::toString}{() → core::String};
+  core::int v4 = c.{core::Object::hashCode}{core::int};
+  dynamic v5 = invalid-expression "pkg/front_end/testcases/nnbd/dynamic_object_call.dart:21:22: Error: 'hashCode' isn't a function or method and can't be invoked.
+  var v5 = c.hashCode();
+                     ^^^^..." in c.{core::Object::hashCode}{core::int}{<unresolved>}.call();
+  dynamic v6 = c.{core::Object::noSuchMethod}(invalid-expression "pkg/front_end/testcases/nnbd/dynamic_object_call.dart:23:27: Error: The argument type 'String' can't be assigned to the parameter type 'Invocation'.
+ - 'Invocation' is from 'dart:core'.
+  var v6 = c.noSuchMethod(\"foo\");
+                          ^" in "foo" as{TypeError,ForNonNullableByDefault} core::Invocation){(core::Invocation) → dynamic};
+  dynamic v7 = c{dynamic}.noSuchMethod("foo", foo: 42);
+  (core::Invocation) → dynamic v8 = c.{core::Object::noSuchMethod}{(core::Invocation) → dynamic};
+}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.modular.expect
new file mode 100644
index 0000000..c4ad76f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/export_main_declaration.dart.weak.modular.expect
@@ -0,0 +1,416 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_declaration.dart" as mai;
+additionalExports = (mai::main)
+
+import "org-dartlang-testcase:///export_main_declaration_class_lib.dart" as class_lib;
+import "org-dartlang-testcase:///export_main_declaration_extension_lib.dart" as extension_lib;
+import "org-dartlang-testcase:///export_main_declaration_field_lib.dart" as field_lib;
+import "org-dartlang-testcase:///export_main_declaration_getter_lib.dart" as getter_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_extra_optional_parameters_lib.dart" as method_extra_optional_parameters_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_named_parameters_lib.dart" as method_named_parameters_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_one_optional_parameter_lib.dart" as method_one_optional_parameter_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_one_parameter_lib.dart" as method_one_parameter_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_one_required_optional_lib.dart" as method_one_required_optional_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_required_named_parameters_lib.dart" as method_required_named_parameters_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_too_many_parameters_lib.dart" as method_too_many_parameters_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_two_optional_parameters_lib.dart" as method_two_optional_parameters_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_two_parameters_lib.dart" as method_two_parameters_lib;
+import "org-dartlang-testcase:///export_main_declaration_method_wrong_parameter_type_lib.dart" as method_wrong_parameter_type_lib;
+import "org-dartlang-testcase:///export_main_declaration_setter_lib.dart" as setter_lib;
+import "org-dartlang-testcase:///export_main_declaration_typedef_lib.dart" as typedef_lib;
+export "org-dartlang-testcase:///main_declaration.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_class_lib.dart: Error: The exported 'main' declaration must be a function declaration.
+// pkg/front_end/testcases/nnbd/main_declaration_class_lib.dart:5:7: Context: This is exported 'main' declaration.
+// class main /* error */ {}
+//       ^
+//
+import self as self2;
+import "main_declaration_class_lib.dart" as mai2;
+additionalExports = (mai2::main)
+
+export "org-dartlang-testcase:///main_declaration_class_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_extension_lib.dart: Error: The exported 'main' declaration must be a function declaration.
+// pkg/front_end/testcases/nnbd/main_declaration_extension_lib.dart:5:11: Context: This is exported 'main' declaration.
+// extension main /* error */ on Object {}
+//           ^
+//
+import self as self3;
+import "main_declaration_extension_lib.dart" as mai3;
+additionalExports = (mai3::main)
+
+export "org-dartlang-testcase:///main_declaration_extension_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_field_lib.dart: Error: The exported 'main' declaration must be a function declaration.
+// pkg/front_end/testcases/nnbd/main_declaration_field_lib.dart:5:17: Context: This is exported 'main' declaration.
+// void Function() main /* error */ = () {};
+//                 ^^^^
+//
+import self as self4;
+import "main_declaration_field_lib.dart" as mai4;
+additionalExports = (mai4::main,
+  mai4::main)
+
+export "org-dartlang-testcase:///main_declaration_field_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_getter_lib.dart: Error: The exported 'main' declaration must be a function declaration.
+// pkg/front_end/testcases/nnbd/main_declaration_getter_lib.dart:5:21: Context: This is exported 'main' declaration.
+// void Function() get main /* error */ => () {};
+//                     ^^^^
+//
+import self as self5;
+import "main_declaration_getter_lib.dart" as mai5;
+additionalExports = (mai5::main)
+
+export "org-dartlang-testcase:///main_declaration_getter_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as self6;
+import "main_declaration_method_extra_optional_parameters_lib.dart" as mai6;
+additionalExports = (mai6::main)
+
+export "org-dartlang-testcase:///main_declaration_method_extra_optional_parameters_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as self7;
+import "main_declaration_method_named_parameters_lib.dart" as mai7;
+additionalExports = (mai7::main)
+
+export "org-dartlang-testcase:///main_declaration_method_named_parameters_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as self8;
+import "main_declaration_method_one_optional_parameter_lib.dart" as mai8;
+additionalExports = (mai8::main)
+
+export "org-dartlang-testcase:///main_declaration_method_one_optional_parameter_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as self9;
+import "main_declaration_method_one_parameter_lib.dart" as mai9;
+additionalExports = (mai9::main)
+
+export "org-dartlang-testcase:///main_declaration_method_one_parameter_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as self10;
+import "main_declaration_method_one_required_optional_lib.dart" as mai10;
+additionalExports = (mai10::main)
+
+export "org-dartlang-testcase:///main_declaration_method_one_required_optional_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_method_required_named_parameters_lib.dart: Error: The exported 'main' method cannot have required named parameters.
+// pkg/front_end/testcases/nnbd/main_declaration_method_required_named_parameters_lib.dart:5:6: Context: This is exported 'main' declaration.
+// void main({required List<String> args}) /* error */ {}
+//      ^^^^
+//
+import self as self11;
+import "main_declaration_method_required_named_parameters_lib.dart" as mai11;
+additionalExports = (mai11::main)
+
+export "org-dartlang-testcase:///main_declaration_method_required_named_parameters_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_method_too_many_parameters_lib.dart: Error: The exported 'main' method must have at most 2 required parameters.
+// pkg/front_end/testcases/nnbd/main_declaration_method_too_many_parameters_lib.dart:5:6: Context: This is exported 'main' declaration.
+// void main(List<String> args, a, b) /* error */ {}
+//      ^^^^
+//
+import self as self12;
+import "main_declaration_method_too_many_parameters_lib.dart" as mai12;
+additionalExports = (mai12::main)
+
+export "org-dartlang-testcase:///main_declaration_method_too_many_parameters_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as self13;
+import "main_declaration_method_two_optional_parameters_lib.dart" as mai13;
+additionalExports = (mai13::main)
+
+export "org-dartlang-testcase:///main_declaration_method_two_optional_parameters_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as self14;
+import "main_declaration_method_two_parameters_lib.dart" as mai14;
+additionalExports = (mai14::main)
+
+export "org-dartlang-testcase:///main_declaration_method_two_parameters_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_method_wrong_parameter_type_lib.dart: Error: The type 'Set<String>' of the first parameter of the exported 'main' method is not a supertype of 'List<String>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// pkg/front_end/testcases/nnbd/main_declaration_method_wrong_parameter_type_lib.dart:5:6: Context: This is exported 'main' declaration.
+// void main(Set<String> args) /* error */ {}
+//      ^^^^
+//
+import self as self15;
+import "main_declaration_method_wrong_parameter_type_lib.dart" as mai15;
+additionalExports = (mai15::main)
+
+export "org-dartlang-testcase:///main_declaration_method_wrong_parameter_type_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_setter_lib.dart: Error: The exported 'main' declaration must be a function declaration.
+// pkg/front_end/testcases/nnbd/main_declaration_setter_lib.dart:5:10: Context: This is exported 'main' declaration.
+// void set main(void Function() f) /* error */ {}
+//          ^^^^
+//
+import self as self16;
+import "main_declaration_setter_lib.dart" as mai16;
+additionalExports = (mai16::main)
+
+export "org-dartlang-testcase:///main_declaration_setter_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/export_main_declaration_typedef_lib.dart: Error: The exported 'main' declaration must be a function declaration.
+// pkg/front_end/testcases/nnbd/main_declaration_typedef_lib.dart:5:9: Context: This is exported 'main' declaration.
+// typedef main /* error */ = void Function();
+//         ^
+//
+import self as self17;
+import "main_declaration_typedef_lib.dart" as mai17;
+additionalExports = (mai17::main)
+
+export "org-dartlang-testcase:///main_declaration_typedef_lib.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+
+import "org-dartlang-testcase:///main_declaration_class_lib.dart" as class_lib;
+import "org-dartlang-testcase:///main_declaration_extension_lib.dart" as extension_lib;
+import "org-dartlang-testcase:///main_declaration_field_lib.dart" as field_lib;
+import "org-dartlang-testcase:///main_declaration_getter_lib.dart" as getter_lib;
+import "org-dartlang-testcase:///main_declaration_method_extra_optional_parameters_lib.dart" as method_extra_optional_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_named_parameters_lib.dart" as method_named_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_one_optional_parameter_lib.dart" as method_one_optional_parameter_lib;
+import "org-dartlang-testcase:///main_declaration_method_one_parameter_lib.dart" as method_one_parameter_lib;
+import "org-dartlang-testcase:///main_declaration_method_one_required_optional_lib.dart" as method_one_required_optional_lib;
+import "org-dartlang-testcase:///main_declaration_method_required_named_parameters_lib.dart" as method_required_named_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_too_many_parameters_lib.dart" as method_too_many_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_two_optional_parameters_lib.dart" as method_two_optional_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_two_parameters_lib.dart" as method_two_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_wrong_parameter_type_lib.dart" as method_wrong_parameter_type_lib;
+import "org-dartlang-testcase:///main_declaration_setter_lib.dart" as setter_lib;
+import "org-dartlang-testcase:///main_declaration_typedef_lib.dart" as typedef_lib;
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_class_lib.dart:5:7: Error: The 'main' declaration must be a function declaration.
+// class main /* error */ {}
+//       ^
+//
+import self as mai2;
+import "dart:core" as core;
+
+class main extends core::Object {
+  synthetic constructor •() → mai2::main
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_extension_lib.dart:5:11: Error: The 'main' declaration must be a function declaration.
+// extension main /* error */ on Object {}
+//           ^
+//
+import self as mai3;
+import "dart:core" as core;
+
+extension main on core::Object {
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_field_lib.dart:5:17: Error: The 'main' declaration must be a function declaration.
+// void Function() main /* error */ = () {};
+//                 ^^^^
+//
+import self as mai4;
+
+static field () → void main = () → void {};
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_getter_lib.dart:5:21: Error: The 'main' declaration must be a function declaration.
+// void Function() get main /* error */ => () {};
+//                     ^^^^
+//
+import self as mai5;
+
+static get main() → () → void
+  return () → void {};
+
+library /*isNonNullableByDefault*/;
+import self as mai6;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args, dynamic other, [dynamic extra = #C1]) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as mai7;
+import "dart:core" as core;
+
+static method main({core::List<core::String> args = #C2}) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as mai8;
+import "dart:core" as core;
+
+static method main([core::List<core::String>? args = #C1]) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as mai9;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as mai10;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args, [dynamic other = #C1]) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_method_required_named_parameters_lib.dart:5:6: Error: The 'main' method cannot have required named parameters.
+// void main({required List<String> args}) /* error */ {}
+//      ^^^^
+//
+import self as mai11;
+import "dart:core" as core;
+
+static method main({required core::List<core::String> args = #C1}) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_method_too_many_parameters_lib.dart:5:6: Error: The 'main' method must have at most 2 required parameters.
+// void main(List<String> args, a, b) /* error */ {}
+//      ^^^^
+//
+import self as mai12;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args, dynamic a, dynamic b) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as mai13;
+import "dart:core" as core;
+
+static method main([core::List<core::String> args = #C2, dynamic other = #C1]) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as mai14;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args, dynamic other) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_method_wrong_parameter_type_lib.dart:5:6: Error: The type 'Set<String>' of the first parameter of the 'main' method is not a supertype of 'List<String>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// void main(Set<String> args) /* error */ {}
+//      ^^^^
+//
+import self as mai15;
+import "dart:core" as core;
+
+static method main(core::Set<core::String> args) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_setter_lib.dart:5:10: Error: The 'main' declaration must be a function declaration.
+// void set main(void Function() f) /* error */ {}
+//          ^^^^
+//
+import self as mai16;
+
+static set main(() → void f) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_typedef_lib.dart:5:9: Error: The 'main' declaration must be a function declaration.
+// typedef main /* error */ = void Function();
+//         ^
+//
+import self as mai17;
+
+typedef main = () → void;
+
+constants  {
+  #C1 = null
+  #C2 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..71679c9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_bounds.dart.weak.modular.expect
@@ -0,0 +1,140 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension Extension1<T extends core::Object> on T {
+  method method1 = self::Extension1|method1;
+  tearoff method1 = self::Extension1|get#method1;
+  method method2 = self::Extension1|method2;
+  tearoff method2 = self::Extension1|get#method2;
+  method method3 = self::Extension1|method3;
+  tearoff method3 = self::Extension1|get#method3;
+  method method4 = self::Extension1|method4;
+  tearoff method4 = self::Extension1|get#method4;
+  method method5 = self::Extension1|method5;
+  tearoff method5 = self::Extension1|get#method5;
+}
+extension Extension2<T extends core::String> on T {
+  method method1 = self::Extension2|method1;
+  tearoff method1 = self::Extension2|get#method1;
+  method method2 = self::Extension2|method2;
+  tearoff method2 = self::Extension2|get#method2;
+  method method3 = self::Extension2|method3;
+  tearoff method3 = self::Extension2|get#method3;
+  method method4 = self::Extension2|method4;
+  tearoff method4 = self::Extension2|get#method4;
+  method method5 = self::Extension2|method5;
+  tearoff method5 = self::Extension2|get#method5;
+}
+extension Extension3<T extends dynamic> on T% {
+  method method1 = self::Extension3|method1;
+  tearoff method1 = self::Extension3|get#method1;
+  method method2 = self::Extension3|method2;
+  tearoff method2 = self::Extension3|get#method2;
+  method method3 = self::Extension3|method3;
+  tearoff method3 = self::Extension3|get#method3;
+  method method4 = self::Extension3|method4;
+  tearoff method4 = self::Extension3|get#method4;
+  method method5 = self::Extension3|method5;
+  tearoff method5 = self::Extension3|get#method5;
+}
+extension Extension4<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension4|method1;
+  tearoff method1 = self::Extension4|get#method1;
+  method method2 = self::Extension4|method2;
+  tearoff method2 = self::Extension4|get#method2;
+  method method3 = self::Extension4|method3;
+  tearoff method3 = self::Extension4|get#method3;
+  method method4 = self::Extension4|method4;
+  tearoff method4 = self::Extension4|get#method4;
+  method method5 = self::Extension4|method5;
+  tearoff method5 = self::Extension4|get#method5;
+}
+extension Extension5<T extends core::Object?> on T% {
+  method method1 = self::Extension5|method1;
+  tearoff method1 = self::Extension5|get#method1;
+  method method2 = self::Extension5|method2;
+  tearoff method2 = self::Extension5|get#method2;
+  method method3 = self::Extension5|method3;
+  tearoff method3 = self::Extension5|get#method3;
+  method method4 = self::Extension5|method4;
+  tearoff method4 = self::Extension5|get#method4;
+  method method5 = self::Extension5|method5;
+  tearoff method5 = self::Extension5|get#method5;
+}
+static method Extension1|method1<T extends core::Object, S extends core::Object>(lowered final self::Extension1|method1::T #this) → dynamic {}
+static method Extension1|get#method1<T extends core::Object>(lowered final self::Extension1|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension1|method1<self::Extension1|get#method1::T, S>(#this);
+static method Extension1|method2<T extends core::Object, S extends core::String>(lowered final self::Extension1|method2::T #this) → dynamic {}
+static method Extension1|get#method2<T extends core::Object>(lowered final self::Extension1|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension1|method2<self::Extension1|get#method2::T, S>(#this);
+static method Extension1|method3<T extends core::Object, S extends dynamic>(lowered final self::Extension1|method3::T #this) → dynamic {}
+static method Extension1|get#method3<T extends core::Object>(lowered final self::Extension1|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension1|method3<self::Extension1|get#method3::T, S%>(#this);
+static method Extension1|method4<T extends core::Object, S extends core::Object? = dynamic>(lowered final self::Extension1|method4::T #this) → dynamic {}
+static method Extension1|get#method4<T extends core::Object>(lowered final self::Extension1|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension1|method4<self::Extension1|get#method4::T, S%>(#this);
+static method Extension1|method5<T extends core::Object, S extends core::Object?>(lowered final self::Extension1|method5::T #this) → dynamic {}
+static method Extension1|get#method5<T extends core::Object>(lowered final self::Extension1|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension1|method5<self::Extension1|get#method5::T, S%>(#this);
+static method Extension2|method1<T extends core::String, S extends core::Object>(lowered final self::Extension2|method1::T #this) → dynamic {}
+static method Extension2|get#method1<T extends core::String>(lowered final self::Extension2|get#method1::T #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension2|method1<self::Extension2|get#method1::T, S>(#this);
+static method Extension2|method2<T extends core::String, S extends core::String>(lowered final self::Extension2|method2::T #this) → dynamic {}
+static method Extension2|get#method2<T extends core::String>(lowered final self::Extension2|get#method2::T #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension2|method2<self::Extension2|get#method2::T, S>(#this);
+static method Extension2|method3<T extends core::String, S extends dynamic>(lowered final self::Extension2|method3::T #this) → dynamic {}
+static method Extension2|get#method3<T extends core::String>(lowered final self::Extension2|get#method3::T #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension2|method3<self::Extension2|get#method3::T, S%>(#this);
+static method Extension2|get#method4<T extends core::String>(lowered final self::Extension2|get#method4::T #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension2|method4<self::Extension2|get#method4::T, S%>(#this);
+static method Extension2|method4<T extends core::String, S extends core::Object? = dynamic>(lowered final self::Extension2|method4::T #this) → dynamic {}
+static method Extension2|method5<T extends core::String, S extends core::Object?>(lowered final self::Extension2|method5::T #this) → dynamic {}
+static method Extension2|get#method5<T extends core::String>(lowered final self::Extension2|get#method5::T #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension2|method5<self::Extension2|get#method5::T, S%>(#this);
+static method Extension3|method1<T extends dynamic, S extends core::Object>(lowered final self::Extension3|method1::T% #this) → dynamic {}
+static method Extension3|get#method1<T extends dynamic>(lowered final self::Extension3|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension3|method1<self::Extension3|get#method1::T%, S>(#this);
+static method Extension3|method2<T extends dynamic, S extends core::String>(lowered final self::Extension3|method2::T% #this) → dynamic {}
+static method Extension3|get#method2<T extends dynamic>(lowered final self::Extension3|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension3|method2<self::Extension3|get#method2::T%, S>(#this);
+static method Extension3|method3<T extends dynamic, S extends dynamic>(lowered final self::Extension3|method3::T% #this) → dynamic {}
+static method Extension3|get#method3<T extends dynamic>(lowered final self::Extension3|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension3|method3<self::Extension3|get#method3::T%, S%>(#this);
+static method Extension3|method4<T extends dynamic, S extends core::Object? = dynamic>(lowered final self::Extension3|method4::T% #this) → dynamic {}
+static method Extension3|get#method4<T extends dynamic>(lowered final self::Extension3|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension3|method4<self::Extension3|get#method4::T%, S%>(#this);
+static method Extension3|method5<T extends dynamic, S extends core::Object?>(lowered final self::Extension3|method5::T% #this) → dynamic {}
+static method Extension3|get#method5<T extends dynamic>(lowered final self::Extension3|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension3|method5<self::Extension3|get#method5::T%, S%>(#this);
+static method Extension4|method1<T extends core::Object? = dynamic, S extends core::Object>(lowered final self::Extension4|method1::T% #this) → dynamic {}
+static method Extension4|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension4|method1<self::Extension4|get#method1::T%, S>(#this);
+static method Extension4|method2<T extends core::Object? = dynamic, S extends core::String>(lowered final self::Extension4|method2::T% #this) → dynamic {}
+static method Extension4|get#method2<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension4|method2<self::Extension4|get#method2::T%, S>(#this);
+static method Extension4|method3<T extends core::Object? = dynamic, S extends dynamic>(lowered final self::Extension4|method3::T% #this) → dynamic {}
+static method Extension4|get#method3<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension4|method3<self::Extension4|get#method3::T%, S%>(#this);
+static method Extension4|method4<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(lowered final self::Extension4|method4::T% #this) → dynamic {}
+static method Extension4|get#method4<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension4|method4<self::Extension4|get#method4::T%, S%>(#this);
+static method Extension4|method5<T extends core::Object? = dynamic, S extends core::Object?>(lowered final self::Extension4|method5::T% #this) → dynamic {}
+static method Extension4|get#method5<T extends core::Object? = dynamic>(lowered final self::Extension4|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension4|method5<self::Extension4|get#method5::T%, S%>(#this);
+static method Extension5|method1<T extends core::Object?, S extends core::Object>(lowered final self::Extension5|method1::T% #this) → dynamic {}
+static method Extension5|get#method1<T extends core::Object?>(lowered final self::Extension5|get#method1::T% #this) → <S extends core::Object>() → dynamic
+  return <S extends core::Object>() → dynamic => self::Extension5|method1<self::Extension5|get#method1::T%, S>(#this);
+static method Extension5|method2<T extends core::Object?, S extends core::String>(lowered final self::Extension5|method2::T% #this) → dynamic {}
+static method Extension5|get#method2<T extends core::Object?>(lowered final self::Extension5|get#method2::T% #this) → <S extends core::String>() → dynamic
+  return <S extends core::String>() → dynamic => self::Extension5|method2<self::Extension5|get#method2::T%, S>(#this);
+static method Extension5|method3<T extends core::Object?, S extends dynamic>(lowered final self::Extension5|method3::T% #this) → dynamic {}
+static method Extension5|get#method3<T extends core::Object?>(lowered final self::Extension5|get#method3::T% #this) → <S extends dynamic>() → dynamic
+  return <S extends dynamic>() → dynamic => self::Extension5|method3<self::Extension5|get#method3::T%, S%>(#this);
+static method Extension5|method4<T extends core::Object?, S extends core::Object? = dynamic>(lowered final self::Extension5|method4::T% #this) → dynamic {}
+static method Extension5|get#method4<T extends core::Object?>(lowered final self::Extension5|get#method4::T% #this) → <S extends core::Object? = dynamic>() → dynamic
+  return <S extends core::Object? = dynamic>() → dynamic => self::Extension5|method4<self::Extension5|get#method4::T%, S%>(#this);
+static method Extension5|method5<T extends core::Object?, S extends core::Object?>(lowered final self::Extension5|method5::T% #this) → dynamic {}
+static method Extension5|get#method5<T extends core::Object?>(lowered final self::Extension5|get#method5::T% #this) → <S extends core::Object?>() → dynamic
+  return <S extends core::Object?>() → dynamic => self::Extension5|method5<self::Extension5|get#method5::T%, S%>(#this);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/extension_never.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/extension_never.dart.weak.modular.expect
new file mode 100644
index 0000000..16f18a0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_never.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+
+extension Extension on Never {
+  method extensionMethod = self::Extension|extensionMethod;
+  tearoff extensionMethod = self::Extension|get#extensionMethod;
+}
+static method Extension|extensionMethod(lowered final Never #this) → dynamic {}
+static method Extension|get#extensionMethod(lowered final Never #this) → () → dynamic
+  return () → dynamic => self::Extension|extensionMethod(#this);
+static method implicitAccess(Never never) → dynamic {
+  let final Never #t1 = (let final Never #t2 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.extensionMethod() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t3 = (let final Never #t4 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.missingMethod() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+}
+static method explicitAccess(Never never) → dynamic {
+  self::Extension|extensionMethod(let final Never #t5 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..beb5bfc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.modular.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     return t1.method1();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+//     SubClass subClass = t2.method2();
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+//     SubClass subClass = t3.method2();
+//                            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic> on T% {
+  method method1 = self::Extension|method1;
+  tearoff method1 = self::Extension|get#method1;
+}
+extension BoundExtension<T extends self::Class> on T {
+  method method2 = self::BoundExtension|method2;
+  tearoff method2 = self::BoundExtension|get#method2;
+}
+static method Extension|method1<T extends core::Object? = dynamic>(lowered final self::Extension|method1::T% #this) → self::Extension|method1::T%
+  return #this;
+static method Extension|get#method1<T extends core::Object? = dynamic>(lowered final self::Extension|get#method1::T% #this) → () → self::Extension|get#method1::T%
+  return () → self::Extension|get#method1::T% => self::Extension|method1<self::Extension|get#method1::T%>(#this);
+static method BoundExtension|method2<T extends self::Class>(lowered final self::BoundExtension|method2::T #this) → self::BoundExtension|method2::T
+  return #this;
+static method BoundExtension|get#method2<T extends self::Class>(lowered final self::BoundExtension|get#method2::T #this) → () → self::BoundExtension|get#method2::T
+  return () → self::BoundExtension|get#method2::T => self::BoundExtension|method2<self::BoundExtension|get#method2::T>(#this);
+static method test1<T extends core::Object? = dynamic>(self::test1::T% t1) → self::Class {
+  if(t1 is{ForNonNullableByDefault} self::SubClass) {
+    return invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:19:15: Error: A value of type 'T' can't be returned from a function with return type 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    return t1.method1();
+              ^" in self::Extension|method1<self::test1::T%>(t1{self::test1::T% & self::SubClass /* '%' & '!' = '!' */}) as{TypeError,ForNonNullableByDefault} self::Class;
+  }
+  return new self::Class::•();
+}
+static method test2<T extends self::Class>(self::test2::T t2) → dynamic {
+  if(self::test2::T =={core::Type::==}{(core::Object) → core::bool} #C1) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+    SubClass subClass = t2.method2();
+                           ^" in self::BoundExtension|method2<self::test2::T>(t2) as{TypeError,ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method test3<T extends core::Object? = dynamic>(self::test3::T% t3) → dynamic {
+  if(t3 is{ForNonNullableByDefault} self::SubClass) {
+    self::SubClass subClass = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:32:28: Error: The method 'method2' isn't defined for the class 'SubClass'.
+ - 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'method2'.
+    SubClass subClass = t3.method2();
+                           ^^^^^^^" in t3{self::test3::T% & self::SubClass /* '%' & '!' = '!' */}{<unresolved>}.method2() as{TypeError,ForDynamic,ForNonNullableByDefault} self::SubClass;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::SubClass*)
+}
diff --git a/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.modular.expect
new file mode 100644
index 0000000..ec21f8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/external_field_errors.dart.weak.modular.expect
@@ -0,0 +1,122 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:5:28: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+// external int topLevelField = 0;
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:7:39: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+// external final int finalTopLevelField = 0;
+//                                       ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:9:31: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+// external const int constField = 0;
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:12:37: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external int fieldWithInitializer = 0;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:18:10: Error: External fields cannot have initializers.
+// Try removing the field initializer or the 'external' keyword from the field declaration.
+//   A(this.initializedField1) : this.initializedField2 = 0;
+//          ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:18:36: Error: External fields cannot have initializers.
+// Try removing the field initializer or the 'external' keyword from the field declaration.
+//   A(this.initializedField1) : this.initializedField2 = 0;
+//                                    ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:20:35: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external static int staticField = 0;
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:22:46: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external static final int finalStaticField = 0;
+//                                              ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:26:35: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external static int staticField = 0;
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:28:46: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external static final int finalStaticField = 0;
+//                                              ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:32:39: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external int extensionInstanceField = 0;
+//                                       ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:33:50: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external final int finalExtensionInstanceField = 0;
+//                                                  ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:34:44: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external static int extensionStaticField = 0;
+//                                            ^
+//
+// pkg/front_end/testcases/nnbd/external_field_errors.dart:35:55: Error: External fields cannot have initializers.
+// Try removing the initializer or the 'external' keyword.
+//   external static final int finalExtensionStaticField = 0;
+//                                                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  constructor •(core::int initializedField1) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/nnbd/external_field_errors.dart:18:10: Error: External fields cannot have initializers.
+Try removing the field initializer or the 'external' keyword from the field declaration.
+  A(this.initializedField1) : this.initializedField2 = 0;
+         ^^^^^^^^^^^^^^^^^", final dynamic #t2 = invalid-expression "pkg/front_end/testcases/nnbd/external_field_errors.dart:18:36: Error: External fields cannot have initializers.
+Try removing the field initializer or the 'external' keyword from the field declaration.
+  A(this.initializedField1) : this.initializedField2 = 0;
+                                   ^^^^^^^^^^^^^^^^^"
+    ;
+  external get fieldWithInitializer() → core::int;
+  external set fieldWithInitializer(core::int #externalFieldValue) → void;
+  external get initializedField1() → core::int;
+  external set initializedField1(core::int #externalFieldValue) → void;
+  external get initializedField2() → core::int;
+  external set initializedField2(core::int #externalFieldValue) → void;
+  external static get staticField() → core::int;
+  external static set staticField(core::int #externalFieldValue) → void;
+  external static get finalStaticField() → core::int;
+}
+abstract class B extends core::Object /*isMixinDeclaration*/  {
+  external static get staticField() → core::int;
+  external static set staticField(core::int #externalFieldValue) → void;
+  external static get finalStaticField() → core::int;
+}
+extension Extension on self::A {
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
+  static get extensionStaticField = get self::Extension|extensionStaticField;
+  static set extensionStaticField = set self::Extension|extensionStaticField;
+  static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
+}
+external static get topLevelField() → core::int;
+external static set topLevelField(core::int #externalFieldValue) → void;
+external static get finalTopLevelField() → core::int;
+external static get constField() → core::int;
+external static set constField(core::int #externalFieldValue) → void;
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
+external static get Extension|extensionStaticField() → core::int;
+external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
+external static get Extension|finalExtensionStaticField() → core::int;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/external_fields.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..9ca288c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/external_fields.dart.weak.modular.expect
@@ -0,0 +1,131 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Annotation extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::Annotation
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  @#C1
+  external get instanceField() → core::int;
+  @#C1
+  external set instanceField(core::int #externalFieldValue) → void;
+  @#C1
+  external get finalInstanceField() → core::int;
+  @#C1
+  external get covariantInstanceField() → core::num;
+  @#C1
+  external set covariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
+  @#C1
+  external static get staticField() → core::int;
+  @#C1
+  external static set staticField(core::int #externalFieldValue) → void;
+  @#C1
+  external static get finalStaticField() → core::int;
+  external get untypedInstanceField() → dynamic;
+  external set untypedInstanceField(dynamic #externalFieldValue) → void;
+  external get untypedFinalInstanceField() → dynamic;
+  external get untypedCovariantInstanceField() → dynamic;
+  external set untypedCovariantInstanceField(covariant-by-declaration dynamic #externalFieldValue) → void;
+  external static get untypedStaticField() → dynamic;
+  external static set untypedStaticField(dynamic #externalFieldValue) → void;
+  external static get untypedFinalStaticField() → dynamic;
+}
+abstract class B extends core::Object /*isMixinDeclaration*/  {
+  @#C1
+  external get instanceField() → core::int;
+  @#C1
+  external set instanceField(core::int #externalFieldValue) → void;
+  @#C1
+  external get finalInstanceField() → core::int;
+  @#C1
+  external get covariantInstanceField() → core::num;
+  @#C1
+  external set covariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
+  @#C1
+  external static get staticField() → core::int;
+  @#C1
+  external static set staticField(core::int #externalFieldValue) → void;
+  @#C1
+  external static get finalStaticField() → core::int;
+  external get untypedInstanceField() → dynamic;
+  external set untypedInstanceField(dynamic #externalFieldValue) → void;
+  external get untypedFinalInstanceField() → dynamic;
+  external get untypedCovariantInstanceField() → dynamic;
+  external set untypedCovariantInstanceField(covariant-by-declaration dynamic #externalFieldValue) → void;
+  external static get untypedStaticField() → dynamic;
+  external static set untypedStaticField(dynamic #externalFieldValue) → void;
+  external static get untypedFinalStaticField() → dynamic;
+}
+class C extends core::Object implements self::A {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  external get instanceField() → core::int;
+  external set instanceField(core::int #externalFieldValue) → void;
+  external get finalInstanceField() → core::int;
+  external get covariantInstanceField() → core::num;
+  external set covariantInstanceField(covariant-by-declaration core::num #externalFieldValue) → void;
+  external get untypedInstanceField() → dynamic;
+  external set untypedInstanceField(dynamic #externalFieldValue) → void;
+  external get untypedFinalInstanceField() → dynamic;
+  external get untypedCovariantInstanceField() → dynamic;
+  external set untypedCovariantInstanceField(covariant-by-declaration dynamic #externalFieldValue) → void;
+}
+extension Extension on self::A {
+  get extensionInstanceField = self::Extension|get#extensionInstanceField;
+  set extensionInstanceField = self::Extension|set#extensionInstanceField;
+  get finalExtensionInstanceField = self::Extension|get#finalExtensionInstanceField;
+  static get extensionStaticField = get self::Extension|extensionStaticField;
+  static set extensionStaticField = set self::Extension|extensionStaticField;
+  static get finalExtensionStaticField = get self::Extension|finalExtensionStaticField;
+  get untypedExtensionInstanceField = self::Extension|get#untypedExtensionInstanceField;
+  set untypedExtensionInstanceField = self::Extension|set#untypedExtensionInstanceField;
+  get untypedFinalExtensionInstanceField = self::Extension|get#untypedFinalExtensionInstanceField;
+  static get untypedExtensionStaticField = get self::Extension|untypedExtensionStaticField;
+  static set untypedExtensionStaticField = set self::Extension|untypedExtensionStaticField;
+  static get untypedFinalExtensionStaticField = get self::Extension|untypedFinalExtensionStaticField;
+}
+@#C1
+external static get topLevelField() → core::int;
+@#C1
+external static set topLevelField(core::int #externalFieldValue) → void;
+@#C1
+external static get finalTopLevelField() → core::int;
+external static get untypedTopLevelField() → dynamic;
+external static set untypedTopLevelField(dynamic #externalFieldValue) → void;
+external static get untypedFinalTopLevelField() → dynamic;
+@#C1
+external static method Extension|get#extensionInstanceField(self::A #this) → core::int;
+@#C1
+external static method Extension|set#extensionInstanceField(self::A #this, core::int #externalFieldValue) → void;
+@#C1
+external static method Extension|get#finalExtensionInstanceField(self::A #this) → core::int;
+@#C1
+external static get Extension|extensionStaticField() → core::int;
+@#C1
+external static set Extension|extensionStaticField(core::int #externalFieldValue) → void;
+@#C1
+external static get Extension|finalExtensionStaticField() → core::int;
+external static method Extension|get#untypedExtensionInstanceField(self::A #this) → dynamic;
+external static method Extension|set#untypedExtensionInstanceField(self::A #this, dynamic #externalFieldValue) → void;
+external static method Extension|get#untypedFinalExtensionInstanceField(self::A #this) → dynamic;
+external static get Extension|untypedExtensionStaticField() → dynamic;
+external static set Extension|untypedExtensionStaticField(dynamic #externalFieldValue) → void;
+external static get Extension|untypedFinalExtensionStaticField() → dynamic;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Annotation {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///external_fields.dart:
+- Annotation. (from org-dartlang-testcase:///external_fields.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/external_fields_spec.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/external_fields_spec.dart.weak.modular.expect
new file mode 100644
index 0000000..d5e1933
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/external_fields_spec.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  external get i1() → core::int;
+  external set i1(core::int #externalFieldValue) → void;
+  external get cx() → dynamic;
+  external set cx(covariant-by-declaration dynamic #externalFieldValue) → void;
+  external static get s1() → core::int;
+  external static set s1(core::int #externalFieldValue) → void;
+  external static get fx() → dynamic;
+}
+external static get s1() → core::int;
+external static set s1(core::int #externalFieldValue) → void;
+external static get fx() → dynamic;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
index 1f2d2a4..6b19c1d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
@@ -50,16 +50,16 @@
   #C7 = core::pragma {name:#C1, options:#C6}
   #C8 = ffi::Double {}
   #C9 = 0
-  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C10 = <core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C14 = <core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <core::int*>[#C17, #C18, #C17]
+  #C19 = <core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.modular.expect
new file mode 100644
index 0000000..8fae114
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:ffi" as ffi;
+import "dart:core" as core;
+
+import "dart:ffi";
+import "package:ffi/ffi.dart";
+
+class Coordinate extends ffi::Struct {
+  @#C1
+  external get x() → core::double;
+  @#C1
+  external set x(core::double #externalFieldValue) → void;
+  @#C1
+  external get y() → core::double;
+  @#C1
+  external set y(core::double #externalFieldValue) → void;
+  external get next() → ffi::Pointer<self::Coordinate>;
+  external set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void;
+  static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
+    return let final self::Coordinate #t1 = ffi::StructPointer|get#ref<self::Coordinate>(ffi::AllocatorAlloc|call<self::Coordinate>(allocator)) in block {
+      #t1.{self::Coordinate::x} = x;
+      #t1.{self::Coordinate::y} = y;
+      #t1.{self::Coordinate::next} = next;
+    } =>#t1;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = ffi::Double {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///ffi_sample.dart:
+- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
+- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:34:9)
+- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:12:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
index 1f2d2a4..6b19c1d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
@@ -50,16 +50,16 @@
   #C7 = core::pragma {name:#C1, options:#C6}
   #C8 = ffi::Double {}
   #C9 = 0
-  #C10 = <core::int*>[#C9, #C9, #C9]
+  #C10 = <core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
   #C11 = 8
-  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
   #C13 = 16
-  #C14 = <core::int*>[#C13, #C13, #C13]
+  #C14 = <core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C5}
   #C17 = 24
   #C18 = 20
-  #C19 = <core::int*>[#C17, #C18, #C17]
+  #C19 = <core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
index 0a88f78..0db513d 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect
@@ -25,5 +25,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
index 1513405..b41e171 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
@@ -42,8 +42,8 @@
   #C8 = core::pragma {name:#C1, options:#C7}
   #C9 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
   #C10 = 0
-  #C11 = <core::int*>[#C10, #C10, #C10]
-  #C12 = <core::int*>[#C3, #C3, #C3]
+  #C11 = <core::int*>[#C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10]
+  #C12 = <core::int*>[#C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3]
   #C13 = <core::int*>[]
   #C14 = "vm:prefer-inline"
   #C15 = core::pragma {name:#C14, options:#C6}
@@ -52,5 +52,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
index c47d067..e6c0f95 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect
@@ -25,5 +25,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.modular.expect
new file mode 100644
index 0000000..e6c0f95
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:ffi" as ffi;
+
+import "dart:ffi";
+import "package:ffi/ffi.dart";
+
+class StructInlineArray extends ffi::Struct {
+  synthetic constructor •() → self::StructInlineArray
+    : super ffi::Struct::•()
+    ;
+  @#C3
+  external get a0() → ffi::Array<ffi::Uint8>;
+  @#C3
+  external set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 8
+  #C2 = null
+  #C3 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C1, dimension2:#C2, dimension3:#C2, dimension4:#C2, dimension5:#C2, dimensions:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///ffi_struct_inline_array.dart:
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
index ce41031..c21a02f 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
@@ -42,8 +42,8 @@
   #C8 = core::pragma {name:#C1, options:#C7}
   #C9 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
   #C10 = 0
-  #C11 = <core::int*>[#C10, #C10, #C10]
-  #C12 = <core::int*>[#C3, #C3, #C3]
+  #C11 = <core::int*>[#C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10]
+  #C12 = <core::int*>[#C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3]
   #C13 = <core::int*>[]
   #C14 = "vm:prefer-inline"
   #C15 = core::pragma {name:#C14, options:#C6}
@@ -52,5 +52,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
index 0dd2727..0e058b1 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.expect
@@ -33,5 +33,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
index 1648007..dec8714 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
@@ -67,8 +67,8 @@
   #C9 = 2
   #C10 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C9, dimension2:#C9, dimension3:#C9, dimension4:#C6, dimension5:#C6, dimensions:#C6}
   #C11 = 0
-  #C12 = <core::int*>[#C11, #C11, #C11]
-  #C13 = <core::int*>[#C3, #C3, #C3]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
+  #C13 = <core::int*>[#C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3]
   #C14 = <core::int*>[#C9, #C9]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C6}
@@ -84,5 +84,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
index 8c3d96b..5e4b756 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.expect
@@ -33,5 +33,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.modular.expect
new file mode 100644
index 0000000..5e4b756
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:ffi" as ffi;
+
+import "dart:ffi";
+import "package:ffi/ffi.dart";
+
+class StructInlineArrayMultiDimensional extends ffi::Struct {
+  synthetic constructor •() → self::StructInlineArrayMultiDimensional
+    : super ffi::Struct::•()
+    ;
+  @#C3
+  external get a0() → ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>>;
+  @#C3
+  external set a0(ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> #externalFieldValue) → void;
+}
+static method main() → dynamic {
+  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = ffi::AllocatorAlloc|call<self::StructInlineArrayMultiDimensional>(#C4);
+  final self::StructInlineArrayMultiDimensional struct = ffi::StructPointer|get#ref<self::StructInlineArrayMultiDimensional>(pointer);
+  final ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> array = struct.{self::StructInlineArrayMultiDimensional::a0}{ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>>};
+  final ffi::Array<ffi::Array<ffi::Uint8>> subArray = ffi::ArrayArray|[]<ffi::Array<ffi::Uint8>>(array, 0);
+  ffi::ArrayArray|[]=<ffi::Array<ffi::Uint8>>(array, 1, subArray);
+  #C4.{ffi::Allocator::free}(pointer){(ffi::Pointer<ffi::NativeType>) → void};
+}
+
+constants  {
+  #C1 = 2
+  #C2 = null
+  #C3 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C1, dimension2:#C1, dimension3:#C1, dimension4:#C2, dimension5:#C2, dimensions:#C2}
+  #C4 = all::_CallocAllocator {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
index ca6f28b..e5881fb 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
@@ -67,8 +67,8 @@
   #C9 = 2
   #C10 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C9, dimension2:#C9, dimension3:#C9, dimension4:#C6, dimension5:#C6, dimensions:#C6}
   #C11 = 0
-  #C12 = <core::int*>[#C11, #C11, #C11]
-  #C13 = <core::int*>[#C3, #C3, #C3]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
+  #C13 = <core::int*>[#C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3, #C3]
   #C14 = <core::int*>[#C9, #C9]
   #C15 = "vm:prefer-inline"
   #C16 = core::pragma {name:#C15, options:#C6}
@@ -84,5 +84,5 @@
 
 Constructor coverage from constants:
 org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:
-- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
+- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:138:9)
 - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/field_setter_conflict.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/field_setter_conflict.dart.weak.modular.expect
new file mode 100644
index 0000000..4dec1df
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/field_setter_conflict.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/field_setter_conflict.dart:7:10: Error: Conflicts with the implicit setter of the field 'topLevelFieldInPartSetterInMain'.
+// void set topLevelFieldInPartSetterInMain(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_setter_conflict_part.dart:39:6: Error: Conflicts with setter 'topLevelFieldInPartSetterInMain'.
+// int? topLevelFieldInPartSetterInMain;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/field_setter_conflict_part.dart:40:10: Error: Conflicts with the implicit setter of the field 'topLevelFieldInMainSetterInPart'.
+// void set topLevelFieldInMainSetterInPart(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_setter_conflict.dart:8:6: Error: Conflicts with setter 'topLevelFieldInMainSetterInPart'.
+// int? topLevelFieldInMainSetterInPart;
+//      ^
+//
+import self as self;
+import "dart:core" as core;
+
+part field_setter_conflict_part.dart;
+static field core::int? topLevelFieldInMainSetterInPart;
+static field core::int? topLevelFieldInPartSetterInMain /* from org-dartlang-testcase:///field_setter_conflict_part.dart */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..6e42cfb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/field_vs_setter.dart.weak.modular.expect
@@ -0,0 +1,1348 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:10:10: Error: 'topLevelFieldAndDuplicateSetter' is already declared in this scope.
+// void set topLevelFieldAndDuplicateSetter(int? value) {}
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:9:10: Context: Previous declaration of 'topLevelFieldAndDuplicateSetter'.
+// void set topLevelFieldAndDuplicateSetter(int? value) {}
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:13:12: Error: 'duplicateTopLevelFieldAndSetter1' is already declared in this scope.
+// final int? duplicateTopLevelFieldAndSetter1 = null;
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:12:6: Context: Previous declaration of 'duplicateTopLevelFieldAndSetter1'.
+// int? duplicateTopLevelFieldAndSetter1;
+//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:17:6: Error: 'duplicateTopLevelFieldAndSetter2' is already declared in this scope.
+// int? duplicateTopLevelFieldAndSetter2;
+//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:16:12: Context: Previous declaration of 'duplicateTopLevelFieldAndSetter2'.
+// final int? duplicateTopLevelFieldAndSetter2 = null;
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:25:10: Error: 'topLevelLateFinalFieldAndDuplicateSetter' is already declared in this scope.
+// void set topLevelLateFinalFieldAndDuplicateSetter(int? value) {}
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:24:10: Context: Previous declaration of 'topLevelLateFinalFieldAndDuplicateSetter'.
+// void set topLevelLateFinalFieldAndDuplicateSetter(int? value) {}
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:33:12: Error: 'instanceFieldAndDuplicateSetter' is already declared in this scope.
+//   void set instanceFieldAndDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:32:12: Context: Previous declaration of 'instanceFieldAndDuplicateSetter'.
+//   void set instanceFieldAndDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:36:14: Error: 'duplicateInstanceFieldAndSetter1' is already declared in this scope.
+//   final int? duplicateInstanceFieldAndSetter1 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:35:8: Context: Previous declaration of 'duplicateInstanceFieldAndSetter1'.
+//   int? duplicateInstanceFieldAndSetter1;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:40:8: Error: 'duplicateInstanceFieldAndSetter2' is already declared in this scope.
+//   int? duplicateInstanceFieldAndSetter2;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:39:14: Context: Previous declaration of 'duplicateInstanceFieldAndSetter2'.
+//   final int? duplicateInstanceFieldAndSetter2 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:48:12: Error: 'instanceLateFinalFieldAndDuplicateSetter' is already declared in this scope.
+//   void set instanceLateFinalFieldAndDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:47:12: Context: Previous declaration of 'instanceLateFinalFieldAndDuplicateSetter'.
+//   void set instanceLateFinalFieldAndDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:55:19: Error: 'staticFieldAndDuplicateSetter' is already declared in this scope.
+//   static void set staticFieldAndDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:54:19: Context: Previous declaration of 'staticFieldAndDuplicateSetter'.
+//   static void set staticFieldAndDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:58:21: Error: 'duplicateStaticFieldAndSetter1' is already declared in this scope.
+//   static final int? duplicateStaticFieldAndSetter1 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:57:15: Context: Previous declaration of 'duplicateStaticFieldAndSetter1'.
+//   static int? duplicateStaticFieldAndSetter1;
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:62:15: Error: 'duplicateStaticFieldAndSetter2' is already declared in this scope.
+//   static int? duplicateStaticFieldAndSetter2;
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:61:21: Context: Previous declaration of 'duplicateStaticFieldAndSetter2'.
+//   static final int? duplicateStaticFieldAndSetter2 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:70:19: Error: 'staticLateFinalFieldAndDuplicateSetter' is already declared in this scope.
+//   static void set staticLateFinalFieldAndDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:69:19: Context: Previous declaration of 'staticLateFinalFieldAndDuplicateSetter'.
+//   static void set staticLateFinalFieldAndDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:77:12: Error: 'staticFieldAndInstanceDuplicateSetter' is already declared in this scope.
+//   void set staticFieldAndInstanceDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:76:12: Context: Previous declaration of 'staticFieldAndInstanceDuplicateSetter'.
+//   void set staticFieldAndInstanceDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:84:19: Error: 'instanceFieldAndStaticDuplicateSetter' is already declared in this scope.
+//   static void set instanceFieldAndStaticDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:83:19: Context: Previous declaration of 'instanceFieldAndStaticDuplicateSetter'.
+//   static void set instanceFieldAndStaticDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:87:14: Error: 'duplicateInstanceFieldAndStaticSetter1' is already declared in this scope.
+//   final int? duplicateInstanceFieldAndStaticSetter1 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:86:8: Context: Previous declaration of 'duplicateInstanceFieldAndStaticSetter1'.
+//   int? duplicateInstanceFieldAndStaticSetter1;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:91:8: Error: 'duplicateInstanceFieldAndStaticSetter2' is already declared in this scope.
+//   int? duplicateInstanceFieldAndStaticSetter2;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:90:14: Context: Previous declaration of 'duplicateInstanceFieldAndStaticSetter2'.
+//   final int? duplicateInstanceFieldAndStaticSetter2 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:95:21: Error: 'duplicateStaticFieldAndInstanceSetter1' is already declared in this scope.
+//   static final int? duplicateStaticFieldAndInstanceSetter1 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:94:15: Context: Previous declaration of 'duplicateStaticFieldAndInstanceSetter1'.
+//   static int? duplicateStaticFieldAndInstanceSetter1;
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:99:15: Error: 'duplicateStaticFieldAndInstanceSetter2' is already declared in this scope.
+//   static int? duplicateStaticFieldAndInstanceSetter2;
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:98:21: Context: Previous declaration of 'duplicateStaticFieldAndInstanceSetter2'.
+//   static final int? duplicateStaticFieldAndInstanceSetter2 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:104:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? extensionInstanceFieldAndSetter;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:107:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? extensionInstanceFieldAndDuplicateSetter;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:109:12: Error: 'extensionInstanceFieldAndDuplicateSetter' is already declared in this scope.
+//   void set extensionInstanceFieldAndDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:108:12: Context: Previous declaration of 'extensionInstanceFieldAndDuplicateSetter'.
+//   void set extensionInstanceFieldAndDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:111:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? duplicateExtensionInstanceFieldAndSetter1;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:112:14: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int? duplicateExtensionInstanceFieldAndSetter1 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:112:14: Error: 'duplicateExtensionInstanceFieldAndSetter1' is already declared in this scope.
+//   final int? duplicateExtensionInstanceFieldAndSetter1 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:111:8: Context: Previous declaration of 'duplicateExtensionInstanceFieldAndSetter1'.
+//   int? duplicateExtensionInstanceFieldAndSetter1;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:115:14: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int? duplicateExtensionInstanceFieldAndSetter2 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:116:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? duplicateExtensionInstanceFieldAndSetter2;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:116:8: Error: 'duplicateExtensionInstanceFieldAndSetter2' is already declared in this scope.
+//   int? duplicateExtensionInstanceFieldAndSetter2;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:115:14: Context: Previous declaration of 'duplicateExtensionInstanceFieldAndSetter2'.
+//   final int? duplicateExtensionInstanceFieldAndSetter2 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:124:19: Error: 'extensionStaticFieldAndDuplicateSetter' is already declared in this scope.
+//   static void set extensionStaticFieldAndDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:123:19: Context: Previous declaration of 'extensionStaticFieldAndDuplicateSetter'.
+//   static void set extensionStaticFieldAndDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:127:21: Error: 'duplicateExtensionStaticFieldAndSetter1' is already declared in this scope.
+//   static final int? duplicateExtensionStaticFieldAndSetter1 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:126:15: Context: Previous declaration of 'duplicateExtensionStaticFieldAndSetter1'.
+//   static int? duplicateExtensionStaticFieldAndSetter1;
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:131:15: Error: 'duplicateExtensionStaticFieldAndSetter2' is already declared in this scope.
+//   static int? duplicateExtensionStaticFieldAndSetter2;
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:130:21: Context: Previous declaration of 'duplicateExtensionStaticFieldAndSetter2'.
+//   static final int? duplicateExtensionStaticFieldAndSetter2 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:139:19: Error: 'extensionStaticLateFinalFieldAndDuplicateSetter' is already declared in this scope.
+//   static void set extensionStaticLateFinalFieldAndDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:138:19: Context: Previous declaration of 'extensionStaticLateFinalFieldAndDuplicateSetter'.
+//   static void set extensionStaticLateFinalFieldAndDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:146:12: Error: 'extensionStaticFieldAndInstanceDuplicateSetter' is already declared in this scope.
+//   void set extensionStaticFieldAndInstanceDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:145:12: Context: Previous declaration of 'extensionStaticFieldAndInstanceDuplicateSetter'.
+//   void set extensionStaticFieldAndInstanceDuplicateSetter(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:148:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? extensionInstanceFieldAndStaticSetter;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:151:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? extensionInstanceFieldAndStaticDuplicateSetter;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:153:19: Error: 'extensionInstanceFieldAndStaticDuplicateSetter' is already declared in this scope.
+//   static void set extensionInstanceFieldAndStaticDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:152:19: Context: Previous declaration of 'extensionInstanceFieldAndStaticDuplicateSetter'.
+//   static void set extensionInstanceFieldAndStaticDuplicateSetter(int? value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:155:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? duplicateExtensionInstanceFieldAndStaticSetter1;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:156:14: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int? duplicateExtensionInstanceFieldAndStaticSetter1 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:156:14: Error: 'duplicateExtensionInstanceFieldAndStaticSetter1' is already declared in this scope.
+//   final int? duplicateExtensionInstanceFieldAndStaticSetter1 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:155:8: Context: Previous declaration of 'duplicateExtensionInstanceFieldAndStaticSetter1'.
+//   int? duplicateExtensionInstanceFieldAndStaticSetter1;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:159:14: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   final int? duplicateExtensionInstanceFieldAndStaticSetter2 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:160:8: Error: Extensions can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? duplicateExtensionInstanceFieldAndStaticSetter2;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:160:8: Error: 'duplicateExtensionInstanceFieldAndStaticSetter2' is already declared in this scope.
+//   int? duplicateExtensionInstanceFieldAndStaticSetter2;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:159:14: Context: Previous declaration of 'duplicateExtensionInstanceFieldAndStaticSetter2'.
+//   final int? duplicateExtensionInstanceFieldAndStaticSetter2 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:164:21: Error: 'duplicateExtensionStaticFieldAndInstanceSetter1' is already declared in this scope.
+//   static final int? duplicateExtensionStaticFieldAndInstanceSetter1 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:163:15: Context: Previous declaration of 'duplicateExtensionStaticFieldAndInstanceSetter1'.
+//   static int? duplicateExtensionStaticFieldAndInstanceSetter1;
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:168:15: Error: 'duplicateExtensionStaticFieldAndInstanceSetter2' is already declared in this scope.
+//   static int? duplicateExtensionStaticFieldAndInstanceSetter2;
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:167:21: Context: Previous declaration of 'duplicateExtensionStaticFieldAndInstanceSetter2'.
+//   static final int? duplicateExtensionStaticFieldAndInstanceSetter2 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart: Error: 'topLevelFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/field_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart: Error: 'topLevelLateFinalFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/field_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:6:10: Error: Conflicts with the implicit setter of the field 'topLevelFieldAndSetter'.
+// void set topLevelFieldAndSetter(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:5:6: Error: Conflicts with setter 'topLevelFieldAndSetter'.
+// int? topLevelFieldAndSetter;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:10:10: Error: Conflicts with the implicit setter of the field 'topLevelFieldAndDuplicateSetter'.
+// void set topLevelFieldAndDuplicateSetter(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:9:10: Error: Conflicts with the implicit setter of the field 'topLevelFieldAndDuplicateSetter'.
+// void set topLevelFieldAndDuplicateSetter(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:8:6: Error: Conflicts with setter 'topLevelFieldAndDuplicateSetter'.
+// int? topLevelFieldAndDuplicateSetter;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:14:10: Error: Conflicts with the implicit setter of the field 'duplicateTopLevelFieldAndSetter1'.
+// void set duplicateTopLevelFieldAndSetter1(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:12:6: Error: Conflicts with setter 'duplicateTopLevelFieldAndSetter1'.
+// int? duplicateTopLevelFieldAndSetter1;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:18:10: Error: Conflicts with the implicit setter of the field 'duplicateTopLevelFieldAndSetter2'.
+// void set duplicateTopLevelFieldAndSetter2(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:17:6: Error: Conflicts with setter 'duplicateTopLevelFieldAndSetter2'.
+// int? duplicateTopLevelFieldAndSetter2;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:21:10: Error: Conflicts with the implicit setter of the field 'topLevelLateFinalFieldAndSetter'.
+// void set topLevelLateFinalFieldAndSetter(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:20:17: Error: Conflicts with setter 'topLevelLateFinalFieldAndSetter'.
+// late final int? topLevelLateFinalFieldAndSetter;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:25:10: Error: Conflicts with the implicit setter of the field 'topLevelLateFinalFieldAndDuplicateSetter'.
+// void set topLevelLateFinalFieldAndDuplicateSetter(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:24:10: Error: Conflicts with the implicit setter of the field 'topLevelLateFinalFieldAndDuplicateSetter'.
+// void set topLevelLateFinalFieldAndDuplicateSetter(int? value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:23:17: Error: Conflicts with setter 'topLevelLateFinalFieldAndDuplicateSetter'.
+// late final int? topLevelLateFinalFieldAndDuplicateSetter;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:29:12: Error: Conflicts with the implicit setter of the field 'instanceFieldAndSetter'.
+//   void set instanceFieldAndSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:28:8: Error: Conflicts with setter 'instanceFieldAndSetter'.
+//   int? instanceFieldAndSetter;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:33:12: Error: Conflicts with the implicit setter of the field 'instanceFieldAndDuplicateSetter'.
+//   void set instanceFieldAndDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:32:12: Error: Conflicts with the implicit setter of the field 'instanceFieldAndDuplicateSetter'.
+//   void set instanceFieldAndDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:31:8: Error: Conflicts with setter 'instanceFieldAndDuplicateSetter'.
+//   int? instanceFieldAndDuplicateSetter;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:37:12: Error: Conflicts with the implicit setter of the field 'duplicateInstanceFieldAndSetter1'.
+//   void set duplicateInstanceFieldAndSetter1(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:35:8: Error: Conflicts with setter 'duplicateInstanceFieldAndSetter1'.
+//   int? duplicateInstanceFieldAndSetter1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:41:12: Error: Conflicts with the implicit setter of the field 'duplicateInstanceFieldAndSetter2'.
+//   void set duplicateInstanceFieldAndSetter2(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:40:8: Error: Conflicts with setter 'duplicateInstanceFieldAndSetter2'.
+//   int? duplicateInstanceFieldAndSetter2;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:44:12: Error: Conflicts with the implicit setter of the field 'instanceLateFinalFieldAndSetter'.
+//   void set instanceLateFinalFieldAndSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:43:19: Error: Conflicts with setter 'instanceLateFinalFieldAndSetter'.
+//   late final int? instanceLateFinalFieldAndSetter;
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:48:12: Error: Conflicts with the implicit setter of the field 'instanceLateFinalFieldAndDuplicateSetter'.
+//   void set instanceLateFinalFieldAndDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:47:12: Error: Conflicts with the implicit setter of the field 'instanceLateFinalFieldAndDuplicateSetter'.
+//   void set instanceLateFinalFieldAndDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:46:19: Error: Conflicts with setter 'instanceLateFinalFieldAndDuplicateSetter'.
+//   late final int? instanceLateFinalFieldAndDuplicateSetter;
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:51:19: Error: Conflicts with the implicit setter of the field 'staticFieldAndSetter'.
+//   static void set staticFieldAndSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:50:15: Error: Conflicts with setter 'staticFieldAndSetter'.
+//   static int? staticFieldAndSetter;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:55:19: Error: Conflicts with the implicit setter of the field 'staticFieldAndDuplicateSetter'.
+//   static void set staticFieldAndDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:54:19: Error: Conflicts with the implicit setter of the field 'staticFieldAndDuplicateSetter'.
+//   static void set staticFieldAndDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:53:15: Error: Conflicts with setter 'staticFieldAndDuplicateSetter'.
+//   static int? staticFieldAndDuplicateSetter;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:59:19: Error: Conflicts with the implicit setter of the field 'duplicateStaticFieldAndSetter1'.
+//   static void set duplicateStaticFieldAndSetter1(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:57:15: Error: Conflicts with setter 'duplicateStaticFieldAndSetter1'.
+//   static int? duplicateStaticFieldAndSetter1;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:63:19: Error: Conflicts with the implicit setter of the field 'duplicateStaticFieldAndSetter2'.
+//   static void set duplicateStaticFieldAndSetter2(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:62:15: Error: Conflicts with setter 'duplicateStaticFieldAndSetter2'.
+//   static int? duplicateStaticFieldAndSetter2;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:66:19: Error: Conflicts with the implicit setter of the field 'staticLateFinalFieldAndSetter'.
+//   static void set staticLateFinalFieldAndSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:65:26: Error: Conflicts with setter 'staticLateFinalFieldAndSetter'.
+//   static late final int? staticLateFinalFieldAndSetter;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:70:19: Error: Conflicts with the implicit setter of the field 'staticLateFinalFieldAndDuplicateSetter'.
+//   static void set staticLateFinalFieldAndDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:69:19: Error: Conflicts with the implicit setter of the field 'staticLateFinalFieldAndDuplicateSetter'.
+//   static void set staticLateFinalFieldAndDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:68:26: Error: Conflicts with setter 'staticLateFinalFieldAndDuplicateSetter'.
+//   static late final int? staticLateFinalFieldAndDuplicateSetter;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:73:12: Error: Conflicts with the implicit setter of the field 'staticFieldAndInstanceSetter'.
+//   void set staticFieldAndInstanceSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:72:15: Error: Conflicts with setter 'staticFieldAndInstanceSetter'.
+//   static int? staticFieldAndInstanceSetter;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:77:12: Error: Conflicts with the implicit setter of the field 'staticFieldAndInstanceDuplicateSetter'.
+//   void set staticFieldAndInstanceDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:76:12: Error: Conflicts with the implicit setter of the field 'staticFieldAndInstanceDuplicateSetter'.
+//   void set staticFieldAndInstanceDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:75:15: Error: Conflicts with setter 'staticFieldAndInstanceDuplicateSetter'.
+//   static int? staticFieldAndInstanceDuplicateSetter;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:80:19: Error: Conflicts with the implicit setter of the field 'instanceFieldAndStaticSetter'.
+//   static void set instanceFieldAndStaticSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:79:8: Error: Conflicts with setter 'instanceFieldAndStaticSetter'.
+//   int? instanceFieldAndStaticSetter;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:84:19: Error: Conflicts with the implicit setter of the field 'instanceFieldAndStaticDuplicateSetter'.
+//   static void set instanceFieldAndStaticDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:83:19: Error: Conflicts with the implicit setter of the field 'instanceFieldAndStaticDuplicateSetter'.
+//   static void set instanceFieldAndStaticDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:82:8: Error: Conflicts with setter 'instanceFieldAndStaticDuplicateSetter'.
+//   int? instanceFieldAndStaticDuplicateSetter;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:88:19: Error: Conflicts with the implicit setter of the field 'duplicateInstanceFieldAndStaticSetter1'.
+//   static void set duplicateInstanceFieldAndStaticSetter1(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:86:8: Error: Conflicts with setter 'duplicateInstanceFieldAndStaticSetter1'.
+//   int? duplicateInstanceFieldAndStaticSetter1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:92:19: Error: Conflicts with the implicit setter of the field 'duplicateInstanceFieldAndStaticSetter2'.
+//   static void set duplicateInstanceFieldAndStaticSetter2(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:91:8: Error: Conflicts with setter 'duplicateInstanceFieldAndStaticSetter2'.
+//   int? duplicateInstanceFieldAndStaticSetter2;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:96:12: Error: Conflicts with the implicit setter of the field 'duplicateStaticFieldAndInstanceSetter1'.
+//   void set duplicateStaticFieldAndInstanceSetter1(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:94:15: Error: Conflicts with setter 'duplicateStaticFieldAndInstanceSetter1'.
+//   static int? duplicateStaticFieldAndInstanceSetter1;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:100:12: Error: Conflicts with the implicit setter of the field 'duplicateStaticFieldAndInstanceSetter2'.
+//   void set duplicateStaticFieldAndInstanceSetter2(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:99:15: Error: Conflicts with setter 'duplicateStaticFieldAndInstanceSetter2'.
+//   static int? duplicateStaticFieldAndInstanceSetter2;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:105:12: Error: Conflicts with the implicit setter of the field 'extensionInstanceFieldAndSetter'.
+//   void set extensionInstanceFieldAndSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:104:8: Error: Conflicts with setter 'extensionInstanceFieldAndSetter'.
+//   int? extensionInstanceFieldAndSetter;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:109:12: Error: Conflicts with the implicit setter of the field 'extensionInstanceFieldAndDuplicateSetter'.
+//   void set extensionInstanceFieldAndDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:108:12: Error: Conflicts with the implicit setter of the field 'extensionInstanceFieldAndDuplicateSetter'.
+//   void set extensionInstanceFieldAndDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:107:8: Error: Conflicts with setter 'extensionInstanceFieldAndDuplicateSetter'.
+//   int? extensionInstanceFieldAndDuplicateSetter;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:113:12: Error: Conflicts with the implicit setter of the field 'duplicateExtensionInstanceFieldAndSetter1'.
+//   void set duplicateExtensionInstanceFieldAndSetter1(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:111:8: Error: Conflicts with setter 'duplicateExtensionInstanceFieldAndSetter1'.
+//   int? duplicateExtensionInstanceFieldAndSetter1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:117:12: Error: Conflicts with the implicit setter of the field 'duplicateExtensionInstanceFieldAndSetter2'.
+//   void set duplicateExtensionInstanceFieldAndSetter2(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:116:8: Error: Conflicts with setter 'duplicateExtensionInstanceFieldAndSetter2'.
+//   int? duplicateExtensionInstanceFieldAndSetter2;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:120:19: Error: Conflicts with the implicit setter of the field 'extensionStaticFieldAndSetter'.
+//   static void set extensionStaticFieldAndSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:119:15: Error: Conflicts with setter 'extensionStaticFieldAndSetter'.
+//   static int? extensionStaticFieldAndSetter;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:124:19: Error: Conflicts with the implicit setter of the field 'extensionStaticFieldAndDuplicateSetter'.
+//   static void set extensionStaticFieldAndDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:123:19: Error: Conflicts with the implicit setter of the field 'extensionStaticFieldAndDuplicateSetter'.
+//   static void set extensionStaticFieldAndDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:122:15: Error: Conflicts with setter 'extensionStaticFieldAndDuplicateSetter'.
+//   static int? extensionStaticFieldAndDuplicateSetter;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:128:19: Error: Conflicts with the implicit setter of the field 'duplicateExtensionStaticFieldAndSetter1'.
+//   static void set duplicateExtensionStaticFieldAndSetter1(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:126:15: Error: Conflicts with setter 'duplicateExtensionStaticFieldAndSetter1'.
+//   static int? duplicateExtensionStaticFieldAndSetter1;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:132:19: Error: Conflicts with the implicit setter of the field 'duplicateExtensionStaticFieldAndSetter2'.
+//   static void set duplicateExtensionStaticFieldAndSetter2(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:131:15: Error: Conflicts with setter 'duplicateExtensionStaticFieldAndSetter2'.
+//   static int? duplicateExtensionStaticFieldAndSetter2;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:135:19: Error: Conflicts with the implicit setter of the field 'extensionStaticLateFinalFieldAndSetter'.
+//   static void set extensionStaticLateFinalFieldAndSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:134:26: Error: Conflicts with setter 'extensionStaticLateFinalFieldAndSetter'.
+//   static late final int? extensionStaticLateFinalFieldAndSetter;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:139:19: Error: Conflicts with the implicit setter of the field 'extensionStaticLateFinalFieldAndDuplicateSetter'.
+//   static void set extensionStaticLateFinalFieldAndDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:138:19: Error: Conflicts with the implicit setter of the field 'extensionStaticLateFinalFieldAndDuplicateSetter'.
+//   static void set extensionStaticLateFinalFieldAndDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:137:26: Error: Conflicts with setter 'extensionStaticLateFinalFieldAndDuplicateSetter'.
+//   static late final int? extensionStaticLateFinalFieldAndDuplicateSetter;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:142:12: Error: Conflicts with the implicit setter of the field 'extensionStaticFieldAndInstanceSetter'.
+//   void set extensionStaticFieldAndInstanceSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:141:15: Error: Conflicts with setter 'extensionStaticFieldAndInstanceSetter'.
+//   static int? extensionStaticFieldAndInstanceSetter;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:146:12: Error: Conflicts with the implicit setter of the field 'extensionStaticFieldAndInstanceDuplicateSetter'.
+//   void set extensionStaticFieldAndInstanceDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:145:12: Error: Conflicts with the implicit setter of the field 'extensionStaticFieldAndInstanceDuplicateSetter'.
+//   void set extensionStaticFieldAndInstanceDuplicateSetter(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:144:15: Error: Conflicts with setter 'extensionStaticFieldAndInstanceDuplicateSetter'.
+//   static int? extensionStaticFieldAndInstanceDuplicateSetter;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:149:19: Error: Conflicts with the implicit setter of the field 'extensionInstanceFieldAndStaticSetter'.
+//   static void set extensionInstanceFieldAndStaticSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:148:8: Error: Conflicts with setter 'extensionInstanceFieldAndStaticSetter'.
+//   int? extensionInstanceFieldAndStaticSetter;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:153:19: Error: Conflicts with the implicit setter of the field 'extensionInstanceFieldAndStaticDuplicateSetter'.
+//   static void set extensionInstanceFieldAndStaticDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:152:19: Error: Conflicts with the implicit setter of the field 'extensionInstanceFieldAndStaticDuplicateSetter'.
+//   static void set extensionInstanceFieldAndStaticDuplicateSetter(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:151:8: Error: Conflicts with setter 'extensionInstanceFieldAndStaticDuplicateSetter'.
+//   int? extensionInstanceFieldAndStaticDuplicateSetter;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:157:19: Error: Conflicts with the implicit setter of the field 'duplicateExtensionInstanceFieldAndStaticSetter1'.
+//   static void set duplicateExtensionInstanceFieldAndStaticSetter1(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:155:8: Error: Conflicts with setter 'duplicateExtensionInstanceFieldAndStaticSetter1'.
+//   int? duplicateExtensionInstanceFieldAndStaticSetter1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:156:14: Error: Conflicts with setter 'duplicateExtensionInstanceFieldAndStaticSetter1'.
+//   final int? duplicateExtensionInstanceFieldAndStaticSetter1 = null;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:161:19: Error: Conflicts with the implicit setter of the field 'duplicateExtensionInstanceFieldAndStaticSetter2'.
+//   static void set duplicateExtensionInstanceFieldAndStaticSetter2(int? value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:160:8: Error: Conflicts with setter 'duplicateExtensionInstanceFieldAndStaticSetter2'.
+//   int? duplicateExtensionInstanceFieldAndStaticSetter2;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:159:14: Error: Conflicts with setter 'duplicateExtensionInstanceFieldAndStaticSetter2'.
+//   final int? duplicateExtensionInstanceFieldAndStaticSetter2 = null;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:165:12: Error: Conflicts with the implicit setter of the field 'duplicateExtensionStaticFieldAndInstanceSetter1'.
+//   void set duplicateExtensionStaticFieldAndInstanceSetter1(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:163:15: Error: Conflicts with setter 'duplicateExtensionStaticFieldAndInstanceSetter1'.
+//   static int? duplicateExtensionStaticFieldAndInstanceSetter1;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:164:21: Error: Conflicts with setter 'duplicateExtensionStaticFieldAndInstanceSetter1'.
+//   static final int? duplicateExtensionStaticFieldAndInstanceSetter1 = null;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:169:12: Error: Conflicts with the implicit setter of the field 'duplicateExtensionStaticFieldAndInstanceSetter2'.
+//   void set duplicateExtensionStaticFieldAndInstanceSetter2(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:168:15: Error: Conflicts with setter 'duplicateExtensionStaticFieldAndInstanceSetter2'.
+//   static int? duplicateExtensionStaticFieldAndInstanceSetter2;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:167:21: Error: Conflicts with setter 'duplicateExtensionStaticFieldAndInstanceSetter2'.
+//   static final int? duplicateExtensionStaticFieldAndInstanceSetter2 = null;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:178:38: Error: Can't use 'duplicateTopLevelFieldAndSetter1' because it is declared more than once.
+//   duplicateTopLevelFieldAndSetter1 = duplicateTopLevelFieldAndSetter1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:178:36: Error: Can't assign to this.
+//   duplicateTopLevelFieldAndSetter1 = duplicateTopLevelFieldAndSetter1;
+//                                    ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:179:38: Error: Can't use 'duplicateTopLevelFieldAndSetter2' because it is declared more than once.
+//   duplicateTopLevelFieldAndSetter2 = duplicateTopLevelFieldAndSetter2;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:179:36: Error: Can't assign to this.
+//   duplicateTopLevelFieldAndSetter2 = duplicateTopLevelFieldAndSetter2;
+//                                    ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:198:9: Error: Can't use 'duplicateStaticFieldAndSetter1' because it is declared more than once.
+//   Class.duplicateStaticFieldAndSetter1 = Class.duplicateStaticFieldAndSetter1;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:198:48: Error: Can't use 'duplicateStaticFieldAndSetter1' because it is declared more than once.
+//   Class.duplicateStaticFieldAndSetter1 = Class.duplicateStaticFieldAndSetter1;
+//                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:198:40: Error: Can't assign to this.
+//   Class.duplicateStaticFieldAndSetter1 = Class.duplicateStaticFieldAndSetter1;
+//                                        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:199:9: Error: Can't use 'duplicateStaticFieldAndSetter2' because it is declared more than once.
+//   Class.duplicateStaticFieldAndSetter2 = Class.duplicateStaticFieldAndSetter2;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:199:48: Error: Can't use 'duplicateStaticFieldAndSetter2' because it is declared more than once.
+//   Class.duplicateStaticFieldAndSetter2 = Class.duplicateStaticFieldAndSetter2;
+//                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:199:40: Error: Can't assign to this.
+//   Class.duplicateStaticFieldAndSetter2 = Class.duplicateStaticFieldAndSetter2;
+//                                        ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:209:9: Error: Setter not found: 'instanceFieldAndStaticSetter'.
+//   Class.instanceFieldAndStaticSetter = c.instanceFieldAndStaticSetter;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:212:9: Error: Can't use 'instanceFieldAndStaticDuplicateSetter' because it is declared more than once.
+//   Class.instanceFieldAndStaticDuplicateSetter =
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:212:47: Error: Can't assign to this.
+//   Class.instanceFieldAndStaticDuplicateSetter =
+//                                               ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:218:13: Error: Can't use 'duplicateStaticFieldAndInstanceSetter1' because it is declared more than once.
+//       Class.duplicateStaticFieldAndInstanceSetter1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:219:9: Error: Can't use 'duplicateStaticFieldAndInstanceSetter1' because it is declared more than once.
+//   Class.duplicateStaticFieldAndInstanceSetter1 =
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:220:13: Error: Can't use 'duplicateStaticFieldAndInstanceSetter1' because it is declared more than once.
+//       Class.duplicateStaticFieldAndInstanceSetter1;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:219:48: Error: Can't assign to this.
+//   Class.duplicateStaticFieldAndInstanceSetter1 =
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:223:13: Error: Can't use 'duplicateStaticFieldAndInstanceSetter2' because it is declared more than once.
+//       Class.duplicateStaticFieldAndInstanceSetter2;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:224:9: Error: Can't use 'duplicateStaticFieldAndInstanceSetter2' because it is declared more than once.
+//   Class.duplicateStaticFieldAndInstanceSetter2 =
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:225:13: Error: Can't use 'duplicateStaticFieldAndInstanceSetter2' because it is declared more than once.
+//       Class.duplicateStaticFieldAndInstanceSetter2;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:224:48: Error: Can't assign to this.
+//   Class.duplicateStaticFieldAndInstanceSetter2 =
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:227:9: Error: Can't use 'duplicateInstanceFieldAndStaticSetter1' because it is declared more than once.
+//   Class.duplicateInstanceFieldAndStaticSetter1 =
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:227:48: Error: Can't assign to this.
+//   Class.duplicateInstanceFieldAndStaticSetter1 =
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:229:9: Error: Can't use 'duplicateInstanceFieldAndStaticSetter2' because it is declared more than once.
+//   Class.duplicateInstanceFieldAndStaticSetter2 =
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:229:48: Error: Can't assign to this.
+//   Class.duplicateInstanceFieldAndStaticSetter2 =
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:252:13: Error: Can't use 'duplicateExtensionStaticFieldAndSetter1' because it is declared more than once.
+//   Extension.duplicateExtensionStaticFieldAndSetter1 =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:253:17: Error: Can't use 'duplicateExtensionStaticFieldAndSetter1' because it is declared more than once.
+//       Extension.duplicateExtensionStaticFieldAndSetter1;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:252:53: Error: Can't assign to this.
+//   Extension.duplicateExtensionStaticFieldAndSetter1 =
+//                                                     ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:254:13: Error: Can't use 'duplicateExtensionStaticFieldAndSetter2' because it is declared more than once.
+//   Extension.duplicateExtensionStaticFieldAndSetter2 =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:255:17: Error: Can't use 'duplicateExtensionStaticFieldAndSetter2' because it is declared more than once.
+//       Extension.duplicateExtensionStaticFieldAndSetter2;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:254:53: Error: Can't assign to this.
+//   Extension.duplicateExtensionStaticFieldAndSetter2 =
+//                                                     ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:267:13: Error: Setter not found: 'extensionInstanceFieldAndStaticSetter'.
+//   Extension.extensionInstanceFieldAndStaticSetter =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:272:13: Error: Can't use 'extensionInstanceFieldAndStaticDuplicateSetter' because it is declared more than once.
+//   Extension.extensionInstanceFieldAndStaticDuplicateSetter =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:272:60: Error: Can't assign to this.
+//   Extension.extensionInstanceFieldAndStaticDuplicateSetter =
+//                                                            ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:277:13: Error: Can't use 'duplicateExtensionInstanceFieldAndStaticSetter1' because it is declared more than once.
+//   Extension.duplicateExtensionInstanceFieldAndStaticSetter1 =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:277:61: Error: Can't assign to this.
+//   Extension.duplicateExtensionInstanceFieldAndStaticSetter1 =
+//                                                             ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:282:13: Error: Can't use 'duplicateExtensionInstanceFieldAndStaticSetter2' because it is declared more than once.
+//   Extension.duplicateExtensionInstanceFieldAndStaticSetter2 =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:282:61: Error: Can't assign to this.
+//   Extension.duplicateExtensionInstanceFieldAndStaticSetter2 =
+//                                                             ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:287:13: Error: Can't use 'duplicateExtensionStaticFieldAndInstanceSetter1' because it is declared more than once.
+//   Extension.duplicateExtensionStaticFieldAndInstanceSetter1 =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:288:17: Error: Can't use 'duplicateExtensionStaticFieldAndInstanceSetter1' because it is declared more than once.
+//       Extension.duplicateExtensionStaticFieldAndInstanceSetter1;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:287:61: Error: Can't assign to this.
+//   Extension.duplicateExtensionStaticFieldAndInstanceSetter1 =
+//                                                             ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:290:17: Error: Can't use 'duplicateExtensionStaticFieldAndInstanceSetter1' because it is declared more than once.
+//       Extension.duplicateExtensionStaticFieldAndInstanceSetter1;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:292:13: Error: Can't use 'duplicateExtensionStaticFieldAndInstanceSetter2' because it is declared more than once.
+//   Extension.duplicateExtensionStaticFieldAndInstanceSetter2 =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:293:17: Error: Can't use 'duplicateExtensionStaticFieldAndInstanceSetter2' because it is declared more than once.
+//       Extension.duplicateExtensionStaticFieldAndInstanceSetter2;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:292:61: Error: Can't assign to this.
+//   Extension.duplicateExtensionStaticFieldAndInstanceSetter2 =
+//                                                             ^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:295:17: Error: Can't use 'duplicateExtensionStaticFieldAndInstanceSetter2' because it is declared more than once.
+//       Extension.duplicateExtensionStaticFieldAndInstanceSetter2;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:188:5: Error: Can't use 'duplicateInstanceFieldAndStaticSetter1' because it is declared more than once.
+//   c.duplicateInstanceFieldAndStaticSetter1 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:189:9: Error: Can't use 'duplicateInstanceFieldAndStaticSetter1' because it is declared more than once.
+//       c.duplicateInstanceFieldAndStaticSetter1;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:189:9: Error: The getter 'duplicateInstanceFieldAndStaticSetter1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateInstanceFieldAndStaticSetter1'.
+//       c.duplicateInstanceFieldAndStaticSetter1;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:188:5: Error: The setter 'duplicateInstanceFieldAndStaticSetter1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateInstanceFieldAndStaticSetter1'.
+//   c.duplicateInstanceFieldAndStaticSetter1 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:190:5: Error: Can't use 'duplicateInstanceFieldAndStaticSetter2' because it is declared more than once.
+//   c.duplicateInstanceFieldAndStaticSetter2 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:191:9: Error: Can't use 'duplicateInstanceFieldAndStaticSetter2' because it is declared more than once.
+//       c.duplicateInstanceFieldAndStaticSetter2;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:191:9: Error: The getter 'duplicateInstanceFieldAndStaticSetter2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateInstanceFieldAndStaticSetter2'.
+//       c.duplicateInstanceFieldAndStaticSetter2;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:190:5: Error: The setter 'duplicateInstanceFieldAndStaticSetter2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateInstanceFieldAndStaticSetter2'.
+//   c.duplicateInstanceFieldAndStaticSetter2 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:201:5: Error: The setter 'staticFieldAndInstanceSetter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticFieldAndInstanceSetter'.
+//   c.staticFieldAndInstanceSetter = Class.staticFieldAndInstanceSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:204:5: Error: The setter 'staticFieldAndInstanceDuplicateSetter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticFieldAndInstanceDuplicateSetter'.
+//   c.staticFieldAndInstanceDuplicateSetter =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:217:5: Error: The setter 'duplicateStaticFieldAndInstanceSetter1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateStaticFieldAndInstanceSetter1'.
+//   c.duplicateStaticFieldAndInstanceSetter1 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:222:5: Error: The setter 'duplicateStaticFieldAndInstanceSetter2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateStaticFieldAndInstanceSetter2'.
+//   c.duplicateStaticFieldAndInstanceSetter2 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:232:41: Error: The getter 'extensionInstanceFieldAndSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'extensionInstanceFieldAndSetter'.
+//   0.extensionInstanceFieldAndSetter = 0.extensionInstanceFieldAndSetter;
+//                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:232:5: Error: The setter 'extensionInstanceFieldAndSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndSetter'.
+//   0.extensionInstanceFieldAndSetter = 0.extensionInstanceFieldAndSetter;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:234:9: Error: The getter 'extensionInstanceFieldAndDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'extensionInstanceFieldAndDuplicateSetter'.
+//       0.extensionInstanceFieldAndDuplicateSetter;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:233:5: Error: The setter 'extensionInstanceFieldAndDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndDuplicateSetter'.
+//   0.extensionInstanceFieldAndDuplicateSetter =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:237:9: Error: The getter 'duplicateExtensionInstanceFieldAndSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateExtensionInstanceFieldAndSetter1'.
+//       0.duplicateExtensionInstanceFieldAndSetter1;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:236:5: Error: The setter 'duplicateExtensionInstanceFieldAndSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionInstanceFieldAndSetter1'.
+//   0.duplicateExtensionInstanceFieldAndSetter1 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:239:9: Error: The getter 'duplicateExtensionInstanceFieldAndSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateExtensionInstanceFieldAndSetter2'.
+//       0.duplicateExtensionInstanceFieldAndSetter2;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:238:5: Error: The setter 'duplicateExtensionInstanceFieldAndSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionInstanceFieldAndSetter2'.
+//   0.duplicateExtensionInstanceFieldAndSetter2 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:257:5: Error: The setter 'extensionStaticFieldAndInstanceSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionStaticFieldAndInstanceSetter'.
+//   0.extensionStaticFieldAndInstanceSetter =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:262:5: Error: The setter 'extensionStaticFieldAndInstanceDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionStaticFieldAndInstanceDuplicateSetter'.
+//   0.extensionStaticFieldAndInstanceDuplicateSetter =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:270:9: Error: The getter 'extensionInstanceFieldAndStaticSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'extensionInstanceFieldAndStaticSetter'.
+//       0.extensionInstanceFieldAndStaticSetter;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:269:5: Error: The setter 'extensionInstanceFieldAndStaticSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndStaticSetter'.
+//   0.extensionInstanceFieldAndStaticSetter =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:275:9: Error: The getter 'extensionInstanceFieldAndStaticDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'extensionInstanceFieldAndStaticDuplicateSetter'.
+//       0.extensionInstanceFieldAndStaticDuplicateSetter;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:274:5: Error: The setter 'extensionInstanceFieldAndStaticDuplicateSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndStaticDuplicateSetter'.
+//   0.extensionInstanceFieldAndStaticDuplicateSetter =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:280:9: Error: The getter 'duplicateExtensionInstanceFieldAndStaticSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateExtensionInstanceFieldAndStaticSetter1'.
+//       0.duplicateExtensionInstanceFieldAndStaticSetter1;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:279:5: Error: The setter 'duplicateExtensionInstanceFieldAndStaticSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionInstanceFieldAndStaticSetter1'.
+//   0.duplicateExtensionInstanceFieldAndStaticSetter1 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:285:9: Error: The getter 'duplicateExtensionInstanceFieldAndStaticSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateExtensionInstanceFieldAndStaticSetter2'.
+//       0.duplicateExtensionInstanceFieldAndStaticSetter2;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:284:5: Error: The setter 'duplicateExtensionInstanceFieldAndStaticSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionInstanceFieldAndStaticSetter2'.
+//   0.duplicateExtensionInstanceFieldAndStaticSetter2 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:289:5: Error: The setter 'duplicateExtensionStaticFieldAndInstanceSetter1' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionStaticFieldAndInstanceSetter1'.
+//   0.duplicateExtensionStaticFieldAndInstanceSetter1 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:294:5: Error: The setter 'duplicateExtensionStaticFieldAndInstanceSetter2' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionStaticFieldAndInstanceSetter2'.
+//   0.duplicateExtensionStaticFieldAndInstanceSetter2 =
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:39:14: Error: Final field 'duplicateInstanceFieldAndSetter2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int? duplicateInstanceFieldAndSetter2 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:61:21: Error: Final field 'duplicateStaticFieldAndSetter2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   static final int? duplicateStaticFieldAndSetter2 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:90:14: Error: Final field 'duplicateInstanceFieldAndStaticSetter2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int? duplicateInstanceFieldAndStaticSetter2 = null;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/field_vs_setter.dart:98:21: Error: Final field 'duplicateStaticFieldAndInstanceSetter2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   static final int? duplicateStaticFieldAndInstanceSetter2 = null;
+//                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? instanceFieldAndSetter = null;
+  field core::int? instanceFieldAndDuplicateSetter = null;
+  field core::int? duplicateInstanceFieldAndSetter1 = null;
+  final field core::int? duplicateInstanceFieldAndSetter2 = null;
+  late final [setter] field core::int? instanceLateFinalFieldAndSetter;
+  late final [setter] field core::int? instanceLateFinalFieldAndDuplicateSetter;
+  static field core::int? staticFieldAndSetter = null;
+  static field core::int? staticFieldAndDuplicateSetter = null;
+  static field core::int? duplicateStaticFieldAndSetter1 = null;
+  static final field core::int? duplicateStaticFieldAndSetter2 = null;
+  late static final [setter] field core::int? staticLateFinalFieldAndSetter;
+  late static final [setter] field core::int? staticLateFinalFieldAndDuplicateSetter;
+  static field core::int? staticFieldAndInstanceSetter = null;
+  static field core::int? staticFieldAndInstanceDuplicateSetter = null;
+  field core::int? instanceFieldAndStaticSetter = null;
+  field core::int? instanceFieldAndStaticDuplicateSetter = null;
+  field core::int? duplicateInstanceFieldAndStaticSetter1 = null;
+  final field core::int? duplicateInstanceFieldAndStaticSetter2 = null;
+  static field core::int? duplicateStaticFieldAndInstanceSetter1 = null;
+  static final field core::int? duplicateStaticFieldAndInstanceSetter2 = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+}
+extension Extension on core::int? {
+  field extensionInstanceFieldAndSetter = self::Extension|extensionInstanceFieldAndSetter;
+  field extensionInstanceFieldAndDuplicateSetter = self::Extension|extensionInstanceFieldAndDuplicateSetter;
+  field duplicateExtensionInstanceFieldAndSetter1 = self::Extension|duplicateExtensionInstanceFieldAndSetter1;
+  field duplicateExtensionInstanceFieldAndSetter2 = self::Extension|duplicateExtensionInstanceFieldAndSetter2;
+  static field extensionStaticFieldAndSetter = self::Extension|extensionStaticFieldAndSetter;
+  static field extensionStaticFieldAndDuplicateSetter = self::Extension|extensionStaticFieldAndDuplicateSetter;
+  static field duplicateExtensionStaticFieldAndSetter1 = self::Extension|duplicateExtensionStaticFieldAndSetter1;
+  static field duplicateExtensionStaticFieldAndSetter2 = self::Extension|duplicateExtensionStaticFieldAndSetter2;
+  static field extensionStaticLateFinalFieldAndSetter = self::Extension|extensionStaticLateFinalFieldAndSetter;
+  static field extensionStaticLateFinalFieldAndDuplicateSetter = self::Extension|extensionStaticLateFinalFieldAndDuplicateSetter;
+  static field extensionStaticFieldAndInstanceSetter = self::Extension|extensionStaticFieldAndInstanceSetter;
+  static field extensionStaticFieldAndInstanceDuplicateSetter = self::Extension|extensionStaticFieldAndInstanceDuplicateSetter;
+  field extensionInstanceFieldAndStaticSetter = self::Extension|extensionInstanceFieldAndStaticSetter;
+  field extensionInstanceFieldAndStaticDuplicateSetter = self::Extension|extensionInstanceFieldAndStaticDuplicateSetter;
+  field duplicateExtensionInstanceFieldAndStaticSetter1 = self::Extension|duplicateExtensionInstanceFieldAndStaticSetter1;
+  field duplicateExtensionInstanceFieldAndStaticSetter2 = self::Extension|duplicateExtensionInstanceFieldAndStaticSetter2;
+  static field duplicateExtensionStaticFieldAndInstanceSetter1 = self::Extension|duplicateExtensionStaticFieldAndInstanceSetter1;
+  static field duplicateExtensionStaticFieldAndInstanceSetter2 = self::Extension|duplicateExtensionStaticFieldAndInstanceSetter2;
+}
+static field core::int? topLevelFieldAndSetter;
+static field core::int? topLevelFieldAndDuplicateSetter;
+static field core::int? duplicateTopLevelFieldAndSetter1;
+static final field core::int? duplicateTopLevelFieldAndSetter2;
+late static final [setter] field core::int? topLevelLateFinalFieldAndSetter;
+late static final [setter] field core::int? topLevelLateFinalFieldAndDuplicateSetter;
+static field core::int? Extension|extensionInstanceFieldAndSetter;
+static field core::int? Extension|extensionInstanceFieldAndDuplicateSetter;
+static field core::int? Extension|duplicateExtensionInstanceFieldAndSetter1;
+static final field core::int? Extension|duplicateExtensionInstanceFieldAndSetter2;
+static field core::int? Extension|extensionStaticFieldAndSetter;
+static field core::int? Extension|extensionStaticFieldAndDuplicateSetter;
+static field core::int? Extension|duplicateExtensionStaticFieldAndSetter1;
+static final field core::int? Extension|duplicateExtensionStaticFieldAndSetter2;
+late static final [setter] field core::int? Extension|extensionStaticLateFinalFieldAndSetter;
+late static final [setter] field core::int? Extension|extensionStaticLateFinalFieldAndDuplicateSetter;
+static field core::int? Extension|extensionStaticFieldAndInstanceSetter;
+static field core::int? Extension|extensionStaticFieldAndInstanceDuplicateSetter;
+static field core::int? Extension|extensionInstanceFieldAndStaticSetter;
+static field core::int? Extension|extensionInstanceFieldAndStaticDuplicateSetter;
+static field core::int? Extension|duplicateExtensionInstanceFieldAndStaticSetter1;
+static final field core::int? Extension|duplicateExtensionInstanceFieldAndStaticSetter2;
+static field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter1;
+static final field core::int? Extension|duplicateExtensionStaticFieldAndInstanceSetter2;
+static const field dynamic _exports# = #C1 /*isLegacy*/;
+static method test() → dynamic {
+  self::topLevelFieldAndSetter = self::topLevelFieldAndSetter;
+  self::topLevelFieldAndDuplicateSetter = self::topLevelFieldAndDuplicateSetter;
+  self::topLevelLateFinalFieldAndSetter = self::topLevelLateFinalFieldAndSetter;
+  self::topLevelLateFinalFieldAndDuplicateSetter = self::topLevelLateFinalFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:178:36: Error: Can't assign to this.
+  duplicateTopLevelFieldAndSetter1 = duplicateTopLevelFieldAndSetter1;
+                                   ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:179:36: Error: Can't assign to this.
+  duplicateTopLevelFieldAndSetter2 = duplicateTopLevelFieldAndSetter2;
+                                   ^";
+  self::Class c = new self::Class::•();
+  c.{self::Class::instanceFieldAndSetter} = c.{self::Class::instanceFieldAndSetter}{core::int?};
+  c.{self::Class::instanceFieldAndDuplicateSetter} = c.{self::Class::instanceFieldAndDuplicateSetter}{core::int?};
+  c.{self::Class::instanceLateFinalFieldAndSetter} = c.{self::Class::instanceLateFinalFieldAndSetter}{core::int?};
+  c.{self::Class::instanceLateFinalFieldAndDuplicateSetter} = c.{self::Class::instanceLateFinalFieldAndDuplicateSetter}{core::int?};
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:188:5: Error: The setter 'duplicateInstanceFieldAndStaticSetter1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateInstanceFieldAndStaticSetter1'.
+  c.duplicateInstanceFieldAndStaticSetter1 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.duplicateInstanceFieldAndStaticSetter1 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:189:9: Error: The getter 'duplicateInstanceFieldAndStaticSetter1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateInstanceFieldAndStaticSetter1'.
+      c.duplicateInstanceFieldAndStaticSetter1;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.duplicateInstanceFieldAndStaticSetter1;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:190:5: Error: The setter 'duplicateInstanceFieldAndStaticSetter2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateInstanceFieldAndStaticSetter2'.
+  c.duplicateInstanceFieldAndStaticSetter2 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.duplicateInstanceFieldAndStaticSetter2 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:191:9: Error: The getter 'duplicateInstanceFieldAndStaticSetter2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateInstanceFieldAndStaticSetter2'.
+      c.duplicateInstanceFieldAndStaticSetter2;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.duplicateInstanceFieldAndStaticSetter2;
+  self::Class::staticFieldAndSetter = self::Class::staticFieldAndSetter;
+  self::Class::staticFieldAndDuplicateSetter = self::Class::staticFieldAndDuplicateSetter;
+  self::Class::staticLateFinalFieldAndSetter = self::Class::staticLateFinalFieldAndSetter;
+  self::Class::staticLateFinalFieldAndDuplicateSetter = self::Class::staticLateFinalFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:198:40: Error: Can't assign to this.
+  Class.duplicateStaticFieldAndSetter1 = Class.duplicateStaticFieldAndSetter1;
+                                       ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:199:40: Error: Can't assign to this.
+  Class.duplicateStaticFieldAndSetter2 = Class.duplicateStaticFieldAndSetter2;
+                                       ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:201:5: Error: The setter 'staticFieldAndInstanceSetter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticFieldAndInstanceSetter'.
+  c.staticFieldAndInstanceSetter = Class.staticFieldAndInstanceSetter;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.staticFieldAndInstanceSetter = self::Class::staticFieldAndInstanceSetter;
+  self::Class::staticFieldAndInstanceSetter = self::Class::staticFieldAndInstanceSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:204:5: Error: The setter 'staticFieldAndInstanceDuplicateSetter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'staticFieldAndInstanceDuplicateSetter'.
+  c.staticFieldAndInstanceDuplicateSetter =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.staticFieldAndInstanceDuplicateSetter = self::Class::staticFieldAndInstanceDuplicateSetter;
+  self::Class::staticFieldAndInstanceDuplicateSetter = self::Class::staticFieldAndInstanceDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:209:9: Error: Setter not found: 'instanceFieldAndStaticSetter'.
+  Class.instanceFieldAndStaticSetter = c.instanceFieldAndStaticSetter;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  c.{self::Class::instanceFieldAndStaticSetter} = c.{self::Class::instanceFieldAndStaticSetter}{core::int?};
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:212:47: Error: Can't assign to this.
+  Class.instanceFieldAndStaticDuplicateSetter =
+                                              ^";
+  c.{self::Class::instanceFieldAndStaticDuplicateSetter} = c.{self::Class::instanceFieldAndStaticDuplicateSetter}{core::int?};
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:217:5: Error: The setter 'duplicateStaticFieldAndInstanceSetter1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateStaticFieldAndInstanceSetter1'.
+  c.duplicateStaticFieldAndInstanceSetter1 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.duplicateStaticFieldAndInstanceSetter1 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:218:13: Error: Can't use 'duplicateStaticFieldAndInstanceSetter1' because it is declared more than once.
+      Class.duplicateStaticFieldAndInstanceSetter1;
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:219:48: Error: Can't assign to this.
+  Class.duplicateStaticFieldAndInstanceSetter1 =
+                                               ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:222:5: Error: The setter 'duplicateStaticFieldAndInstanceSetter2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateStaticFieldAndInstanceSetter2'.
+  c.duplicateStaticFieldAndInstanceSetter2 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.duplicateStaticFieldAndInstanceSetter2 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:223:13: Error: Can't use 'duplicateStaticFieldAndInstanceSetter2' because it is declared more than once.
+      Class.duplicateStaticFieldAndInstanceSetter2;
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:224:48: Error: Can't assign to this.
+  Class.duplicateStaticFieldAndInstanceSetter2 =
+                                               ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:227:48: Error: Can't assign to this.
+  Class.duplicateInstanceFieldAndStaticSetter1 =
+                                               ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:229:48: Error: Can't assign to this.
+  Class.duplicateInstanceFieldAndStaticSetter2 =
+                                               ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:232:5: Error: The setter 'extensionInstanceFieldAndSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndSetter'.
+  0.extensionInstanceFieldAndSetter = 0.extensionInstanceFieldAndSetter;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndSetter = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:232:41: Error: The getter 'extensionInstanceFieldAndSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'extensionInstanceFieldAndSetter'.
+  0.extensionInstanceFieldAndSetter = 0.extensionInstanceFieldAndSetter;
+                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:233:5: Error: The setter 'extensionInstanceFieldAndDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndDuplicateSetter'.
+  0.extensionInstanceFieldAndDuplicateSetter =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndDuplicateSetter = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:234:9: Error: The getter 'extensionInstanceFieldAndDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'extensionInstanceFieldAndDuplicateSetter'.
+      0.extensionInstanceFieldAndDuplicateSetter;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:236:5: Error: The setter 'duplicateExtensionInstanceFieldAndSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionInstanceFieldAndSetter1'.
+  0.duplicateExtensionInstanceFieldAndSetter1 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionInstanceFieldAndSetter1 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:237:9: Error: The getter 'duplicateExtensionInstanceFieldAndSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateExtensionInstanceFieldAndSetter1'.
+      0.duplicateExtensionInstanceFieldAndSetter1;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionInstanceFieldAndSetter1;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:238:5: Error: The setter 'duplicateExtensionInstanceFieldAndSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionInstanceFieldAndSetter2'.
+  0.duplicateExtensionInstanceFieldAndSetter2 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionInstanceFieldAndSetter2 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:239:9: Error: The getter 'duplicateExtensionInstanceFieldAndSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateExtensionInstanceFieldAndSetter2'.
+      0.duplicateExtensionInstanceFieldAndSetter2;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionInstanceFieldAndSetter2;
+  self::Extension|extensionStaticFieldAndSetter = self::Extension|extensionStaticFieldAndSetter;
+  self::Extension|extensionStaticFieldAndDuplicateSetter = self::Extension|extensionStaticFieldAndDuplicateSetter;
+  self::Extension|extensionStaticLateFinalFieldAndSetter = self::Extension|extensionStaticLateFinalFieldAndSetter;
+  self::Extension|extensionStaticLateFinalFieldAndDuplicateSetter = self::Extension|extensionStaticLateFinalFieldAndDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:252:53: Error: Can't assign to this.
+  Extension.duplicateExtensionStaticFieldAndSetter1 =
+                                                    ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:254:53: Error: Can't assign to this.
+  Extension.duplicateExtensionStaticFieldAndSetter2 =
+                                                    ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:257:5: Error: The setter 'extensionStaticFieldAndInstanceSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionStaticFieldAndInstanceSetter'.
+  0.extensionStaticFieldAndInstanceSetter =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionStaticFieldAndInstanceSetter = self::Extension|extensionStaticFieldAndInstanceSetter;
+  self::Extension|extensionStaticFieldAndInstanceSetter = self::Extension|extensionStaticFieldAndInstanceSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:262:5: Error: The setter 'extensionStaticFieldAndInstanceDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionStaticFieldAndInstanceDuplicateSetter'.
+  0.extensionStaticFieldAndInstanceDuplicateSetter =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionStaticFieldAndInstanceDuplicateSetter = self::Extension|extensionStaticFieldAndInstanceDuplicateSetter;
+  self::Extension|extensionStaticFieldAndInstanceDuplicateSetter = self::Extension|extensionStaticFieldAndInstanceDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:267:13: Error: Setter not found: 'extensionInstanceFieldAndStaticSetter'.
+  Extension.extensionInstanceFieldAndStaticSetter =
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:269:5: Error: The setter 'extensionInstanceFieldAndStaticSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndStaticSetter'.
+  0.extensionInstanceFieldAndStaticSetter =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndStaticSetter = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:270:9: Error: The getter 'extensionInstanceFieldAndStaticSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'extensionInstanceFieldAndStaticSetter'.
+      0.extensionInstanceFieldAndStaticSetter;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndStaticSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:272:60: Error: Can't assign to this.
+  Extension.extensionInstanceFieldAndStaticDuplicateSetter =
+                                                           ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:274:5: Error: The setter 'extensionInstanceFieldAndStaticDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndStaticDuplicateSetter'.
+  0.extensionInstanceFieldAndStaticDuplicateSetter =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndStaticDuplicateSetter = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:275:9: Error: The getter 'extensionInstanceFieldAndStaticDuplicateSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'extensionInstanceFieldAndStaticDuplicateSetter'.
+      0.extensionInstanceFieldAndStaticDuplicateSetter;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndStaticDuplicateSetter;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:277:61: Error: Can't assign to this.
+  Extension.duplicateExtensionInstanceFieldAndStaticSetter1 =
+                                                            ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:279:5: Error: The setter 'duplicateExtensionInstanceFieldAndStaticSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionInstanceFieldAndStaticSetter1'.
+  0.duplicateExtensionInstanceFieldAndStaticSetter1 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionInstanceFieldAndStaticSetter1 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:280:9: Error: The getter 'duplicateExtensionInstanceFieldAndStaticSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateExtensionInstanceFieldAndStaticSetter1'.
+      0.duplicateExtensionInstanceFieldAndStaticSetter1;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionInstanceFieldAndStaticSetter1;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:282:61: Error: Can't assign to this.
+  Extension.duplicateExtensionInstanceFieldAndStaticSetter2 =
+                                                            ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:284:5: Error: The setter 'duplicateExtensionInstanceFieldAndStaticSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionInstanceFieldAndStaticSetter2'.
+  0.duplicateExtensionInstanceFieldAndStaticSetter2 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionInstanceFieldAndStaticSetter2 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:285:9: Error: The getter 'duplicateExtensionInstanceFieldAndStaticSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'duplicateExtensionInstanceFieldAndStaticSetter2'.
+      0.duplicateExtensionInstanceFieldAndStaticSetter2;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionInstanceFieldAndStaticSetter2;
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:287:61: Error: Can't assign to this.
+  Extension.duplicateExtensionStaticFieldAndInstanceSetter1 =
+                                                            ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:289:5: Error: The setter 'duplicateExtensionStaticFieldAndInstanceSetter1' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionStaticFieldAndInstanceSetter1'.
+  0.duplicateExtensionStaticFieldAndInstanceSetter1 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionStaticFieldAndInstanceSetter1 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:290:17: Error: Can't use 'duplicateExtensionStaticFieldAndInstanceSetter1' because it is declared more than once.
+      Extension.duplicateExtensionStaticFieldAndInstanceSetter1;
+                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:292:61: Error: Can't assign to this.
+  Extension.duplicateExtensionStaticFieldAndInstanceSetter2 =
+                                                            ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:294:5: Error: The setter 'duplicateExtensionStaticFieldAndInstanceSetter2' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'duplicateExtensionStaticFieldAndInstanceSetter2'.
+  0.duplicateExtensionStaticFieldAndInstanceSetter2 =
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.duplicateExtensionStaticFieldAndInstanceSetter2 = invalid-expression "pkg/front_end/testcases/nnbd/field_vs_setter.dart:295:17: Error: Can't use 'duplicateExtensionStaticFieldAndInstanceSetter2' because it is declared more than once.
+      Extension.duplicateExtensionStaticFieldAndInstanceSetter2;
+                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "{\"topLevelFieldAndDuplicateSetter\":\"'topLevelFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/field_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.\",\"topLevelLateFinalFieldAndDuplicateSetter\":\"'topLevelLateFinalFieldAndDuplicateSetter' is exported from both 'pkg/front_end/testcases/nnbd/field_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/field_vs_setter.dart'.\"}"
+}
diff --git a/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.weak.modular.expect
new file mode 100644
index 0000000..5ed98d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/flutter_issue64155.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class TestMixin<R extends core::Object? = dynamic, T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+  method test(covariant-by-class asy::Future<self::TestMixin::R%> fetch) → asy::Future<self::TestMixin::T%> async {
+    final self::TestMixin::R% response = await fetch;
+    self::TestMixin::T% result;
+    if(response is{ForNonNullableByDefault} self::Response<dynamic>) {
+      result = response{self::TestMixin::R% & self::Response<dynamic> /* '%' & '!' = '!' */}.{self::Response::data}{dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::TestMixin::T%;
+    }
+    else
+      if(response is{ForNonNullableByDefault} self::PagingResponse<dynamic>) {
+        result = response{self::TestMixin::R% & self::PagingResponse<dynamic> /* '%' & '!' = '!' */}.{self::PagingResponse::data}{self::PagingResponseData<dynamic>}.{self::PagingResponseData::data}{core::List<dynamic>} as{ForNonNullableByDefault} self::TestMixin::T%;
+      }
+      else
+        if(response is{ForNonNullableByDefault} self::TestMixin::T%) {
+          result = response{self::TestMixin::R% & self::TestMixin::T% /* '%' & '%' = '%' */};
+        }
+        else {
+          throw core::Exception::•("Invalid response type");
+        }
+    return result;
+  }
+}
+class PagingResponse<T extends core::Object? = dynamic> extends core::Object {
+  final field self::PagingResponseData<self::PagingResponse::T%> data;
+  constructor •(self::PagingResponseData<self::PagingResponse::T%> data) → self::PagingResponse<self::PagingResponse::T%>
+    : self::PagingResponse::data = data, super core::Object::•()
+    ;
+}
+class PagingResponseData<T extends core::Object? = dynamic> extends core::Object {
+  final field core::List<self::PagingResponseData::T%> data;
+  constructor •(core::List<self::PagingResponseData::T%> data) → self::PagingResponseData<self::PagingResponseData::T%>
+    : self::PagingResponseData::data = data, super core::Object::•()
+    ;
+}
+class Response<T extends core::Object? = dynamic> extends core::Object {
+  final field self::Response::T% data;
+  constructor •(self::Response::T% data) → self::Response<self::Response::T%>
+    : self::Response::data = data, super core::Object::•()
+    ;
+}
+abstract class _Class1&Object&TestMixin = core::Object with self::TestMixin<self::Response<core::String>, core::String> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class1&Object&TestMixin
+    : super core::Object::•()
+    ;
+  mixin-super-stub method test(covariant-by-class asy::Future<self::Response<core::String>> fetch) → asy::Future<core::String>
+    return super.{self::TestMixin::test}(fetch);
+}
+class Class1 extends self::_Class1&Object&TestMixin {
+  synthetic constructor •() → self::Class1
+    : super self::_Class1&Object&TestMixin::•()
+    ;
+  method _test() → dynamic {
+    final self::Response<core::String> response = new self::Response::•<core::String>("test");
+    this.{self::_Class1&Object&TestMixin::test}(asy::Future::value<self::Response<core::String>>(response)){(asy::Future<self::Response<core::String>>) → asy::Future<core::String>};
+  }
+}
+abstract class _Class2&Object&TestMixin = core::Object with self::TestMixin<self::PagingResponse<core::String>, core::String> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class2&Object&TestMixin
+    : super core::Object::•()
+    ;
+  mixin-super-stub method test(covariant-by-class asy::Future<self::PagingResponse<core::String>> fetch) → asy::Future<core::String>
+    return super.{self::TestMixin::test}(fetch);
+}
+class Class2 extends self::_Class2&Object&TestMixin {
+  synthetic constructor •() → self::Class2
+    : super self::_Class2&Object&TestMixin::•()
+    ;
+  method _test() → dynamic {
+    final self::PagingResponse<core::String> response = new self::PagingResponse::•<core::String>(new self::PagingResponseData::•<core::String>(<core::String>["test"]));
+    this.{self::_Class2&Object&TestMixin::test}(asy::Future::value<self::PagingResponse<core::String>>(response)){(asy::Future<self::PagingResponse<core::String>>) → asy::Future<core::String>};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.modular.expect
new file mode 100644
index 0000000..5fac846
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.modular.expect
@@ -0,0 +1,283 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
+// class Coo extends Boo with Aoo? {}
+//       ^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Error: Can't extend 'Aoo' because it's marked with '?'.
+// class Doo extends Aoo? {}
+//       ^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Error: Can't implement 'Boo' because it's marked with '?'.
+// class Eoo implements Boo? {}
+//       ^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Error: Can't extend 'Boo' because it's marked with '?'.
+// class Foo extends Boo? with Aoo {}
+//       ^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't extend 'Boo' because it's marked with '?'.
+// class Goo = Boo? with Aoo?;
+//       ^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
+// class Goo = Boo? with Aoo?;
+//       ^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Error: Can't implement 'Boo' because it's marked with '?'.
+// class Hoo extends Object with Aoo implements Boo? {}
+//       ^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Error: Can't implement 'Boo' because it's marked with '?'.
+// class Ioo = Object with Aoo implements Boo?;
+//       ^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't extend 'Aoo' because it's marked with '?'.
+// mixin Moo1 on Aoo? implements Boo? {}
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't implement 'Boo' because it's marked with '?'.
+// mixin Moo1 on Aoo? implements Boo? {}
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Aoo' because it's marked with '?'.
+// mixin Moo2 on Aoo?, Boo? {}
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Boo' because it's marked with '?'.
+// mixin Moo2 on Aoo?, Boo? {}
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Aoo' because it's marked with '?'.
+// mixin Moo3 implements Aoo?, Boo? {}
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Boo' because it's marked with '?'.
+// mixin Moo3 implements Aoo?, Boo? {}
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:50:17: Error: Type 'void' can't be used here.
+// Try removing 'void' keyword or replace it with 'var', 'final', or a type.
+// class NooVoid = void with Aoo;
+//                 ^^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:50:17: Error: Type 'void' not found.
+// class NooVoid = void with Aoo;
+//                 ^^^^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:26:7: Error: The type 'Never' can't be mixed in.
+// class Joo extends Boo with Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:52:7: Error: The type 'Never' can't be mixed in.
+// class Ooo = Aoo with Never;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:26:7: Error: The type 'Never' can't be used as supertype.
+// class Joo extends Boo with Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:28:7: Error: The type 'Never' can't be used as supertype.
+// class Koo extends Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:30:7: Error: The type 'Never' can't be used as supertype.
+// class Loo implements Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:38:7: Error: The type 'Never' can't be used as supertype.
+// mixin Moo4 on Aoo implements Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:40:7: Error: The type 'Never' can't be used as supertype.
+// mixin Moo5 on Aoo, Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:42:7: Error: The type 'Never' can't be used as supertype.
+// mixin Moo6 on Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:44:7: Error: The type 'Never' can't be used as supertype.
+// mixin Moo7 implements Aoo, Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:46:7: Error: The type 'Never' can't be used as supertype.
+// mixin Moo8 implements Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:48:7: Error: The type 'Never' can't be used as supertype.
+// class Noo = Never with Aoo;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:49:7: Error: The type 'dynamic' can't be used as supertype.
+// class NooDynamic = dynamic with Aoo;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:52:7: Error: The type 'Never' can't be used as supertype.
+// class Ooo = Aoo with Never;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:28:7: Error: The type 'Never' can't be used in an 'extends' clause.
+// class Koo extends Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:30:7: Error: The type 'Never' can't be used in an 'implements' clause.
+// class Loo implements Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:38:7: Error: The type 'Never' can't be used in an 'implements' clause.
+// mixin Moo4 on Aoo implements Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:40:7: Error: The type 'Never' can't be used in an 'implements' clause.
+// mixin Moo5 on Aoo, Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:42:7: Error: The type 'Never' can't be used in an 'extends' clause.
+// mixin Moo6 on Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:44:7: Error: The type 'Never' can't be used in an 'implements' clause.
+// mixin Moo7 implements Aoo, Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:46:7: Error: The type 'Never' can't be used in an 'implements' clause.
+// mixin Moo8 implements Never {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:48:7: Error: The type 'Never' can't be used in an 'extends' clause.
+// class Noo = Never with Aoo;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Aoo extends core::Object {
+  synthetic constructor •() → self::Aoo
+    : super core::Object::•()
+    ;
+}
+class Boo extends core::Object {
+  synthetic constructor •() → self::Boo
+    : super core::Object::•()
+    ;
+}
+abstract class _Coo&Boo&Aoo = self::Boo with self::Aoo /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Coo&Boo&Aoo
+    : super self::Boo::•()
+    ;
+}
+class Coo extends self::_Coo&Boo&Aoo {
+  synthetic constructor •() → self::Coo
+    : super self::_Coo&Boo&Aoo::•()
+    ;
+}
+class Doo extends self::Aoo {
+  synthetic constructor •() → self::Doo
+    : super self::Aoo::•()
+    ;
+}
+class Eoo extends core::Object implements self::Boo {
+  synthetic constructor •() → self::Eoo
+    : super core::Object::•()
+    ;
+}
+abstract class _Foo&Boo&Aoo = self::Boo with self::Aoo /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Foo&Boo&Aoo
+    : super self::Boo::•()
+    ;
+}
+class Foo extends self::_Foo&Boo&Aoo {
+  synthetic constructor •() → self::Foo
+    : super self::_Foo&Boo&Aoo::•()
+    ;
+}
+class Goo = self::Boo with self::Aoo {
+  synthetic constructor •() → self::Goo
+    : super self::Boo::•()
+    ;
+}
+abstract class _Hoo&Object&Aoo = core::Object with self::Aoo /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Hoo&Object&Aoo
+    : super core::Object::•()
+    ;
+}
+class Hoo extends self::_Hoo&Object&Aoo implements self::Boo {
+  synthetic constructor •() → self::Hoo
+    : super self::_Hoo&Object&Aoo::•()
+    ;
+}
+class Ioo = core::Object with self::Aoo implements self::Boo /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::Ioo
+    : super core::Object::•()
+    ;
+}
+abstract class _Joo&Boo&Never extends self::Boo /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Joo&Boo&Never
+    : super self::Boo::•()
+    ;
+}
+class Joo extends self::_Joo&Boo&Never {
+  synthetic constructor •() → self::Joo
+    : super self::_Joo&Boo&Never::•()
+    ;
+}
+class Koo extends core::Object {
+  synthetic constructor •() → self::Koo
+    : super core::Object::•()
+    ;
+}
+class Loo extends core::Object {
+  synthetic constructor •() → self::Loo
+    : super core::Object::•()
+    ;
+}
+abstract class Moo1 extends self::Aoo implements self::Boo /*isMixinDeclaration*/  {
+}
+abstract class _Moo2&Aoo&Boo extends core::Object implements self::Aoo, self::Boo /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Moo2&Aoo&Boo
+    : super core::Object::•()
+    ;
+}
+abstract class Moo2 extends self::_Moo2&Aoo&Boo /*isMixinDeclaration*/  {
+}
+abstract class Moo3 extends core::Object implements self::Aoo, self::Boo /*isMixinDeclaration*/  {
+}
+abstract class Moo4 extends self::Aoo /*isMixinDeclaration*/  {
+}
+abstract class _Moo5&Aoo&Never extends core::Object implements self::Aoo /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Moo5&Aoo&Never
+    : super core::Object::•()
+    ;
+}
+abstract class Moo5 extends self::_Moo5&Aoo&Never /*isMixinDeclaration*/  {
+}
+abstract class Moo6 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class Moo7 extends core::Object implements self::Aoo /*isMixinDeclaration*/  {
+}
+abstract class Moo8 extends core::Object /*isMixinDeclaration*/  {
+}
+class Noo = core::Object with self::Aoo {
+  synthetic constructor •() → self::Noo
+    : super core::Object::•()
+    ;
+}
+class NooDynamic = core::Object with self::Aoo {
+  synthetic constructor •() → self::NooDynamic
+    : super core::Object::•()
+    ;
+}
+class NooVoid = core::Object with self::Aoo {
+  synthetic constructor •() → self::NooVoid
+    : super core::Object::•()
+    ;
+}
+class Ooo extends self::Aoo {
+  synthetic constructor •() → self::Ooo
+    : super self::Aoo::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.modular.expect
new file mode 100644
index 0000000..875fe7a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.modular.expect
@@ -0,0 +1,149 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'Iterable' is from 'dart:core'.
+//   for (int x in i2) x;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'Iterable' is from 'dart:core'.
+//   [for (int x in i2) x];
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (int x in l2) x;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+//   [for (int x in l2) x];
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (int x in o1) x;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+//   [for (int x in o1) x];
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+//   for (int x in o2) x;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+//   [for (int x in o2) x];
+//                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
+  for (core::int x in invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:9:17: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in i2) x;
+                ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
+    x;
+  block {
+    final core::List<core::int> #t1 = <core::int>[];
+    for (core::int x in invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:10:18: Error: The type 'Iterable<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'Iterable<int>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'Iterable' is from 'dart:core'.
+  [for (int x in i2) x];
+                 ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
+      #t1.{core::List::add}{Invariant}(x){(core::int) → void};
+  } =>#t1;
+  for (core::int x in invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:12:17: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in l2) x;
+                ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
+    x;
+  block {
+    final core::List<core::int> #t2 = <core::int>[];
+    for (core::int x in invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:13:18: Error: The type 'List<int>?' used in the 'for' loop must implement 'Iterable<dynamic>' because 'List<int>?' is nullable and 'Iterable<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  [for (int x in l2) x];
+                 ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
+      #t2.{core::List::add}{Invariant}(x){(core::int) → void};
+  } =>#t2;
+  for (final dynamic #t3 in invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:15:17: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in o1) x;
+                ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+    core::int x = #t3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    x;
+  }
+  block {
+    final core::List<core::int> #t4 = <core::int>[];
+    for (final dynamic #t5 in invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  [for (int x in o1) x];
+                 ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      core::int x = #t5 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+      #t4.{core::List::add}{Invariant}(x){(core::int) → void};
+    }
+  } =>#t4;
+  for (final dynamic #t6 in invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in o2) x;
+                ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+    core::int x = #t6 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    x;
+  }
+  block {
+    final core::List<core::int> #t7 = <core::int>[];
+    for (final dynamic #t8 in invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  [for (int x in o2) x];
+                 ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      core::int x = #t8 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+      #t7.{core::List::add}{Invariant}(x){(core::int) → void};
+    }
+  } =>#t7;
+}
+static method ok(core::Iterable<core::int> i1, core::List<core::int> l1, dynamic d) → dynamic {
+  for (core::int x in i1)
+    x;
+  block {
+    final core::List<core::int> #t9 = <core::int>[];
+    for (core::int x in i1)
+      #t9.{core::List::add}{Invariant}(x){(core::int) → void};
+  } =>#t9;
+  for (core::int x in l1)
+    x;
+  block {
+    final core::List<core::int> #t10 = <core::int>[];
+    for (core::int x in l1)
+      #t10.{core::List::add}{Invariant}(x){(core::int) → void};
+  } =>#t10;
+  for (final dynamic #t11 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+    core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+    x;
+  }
+  block {
+    final core::List<core::int> #t12 = <core::int>[];
+    for (final dynamic #t13 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      core::int x = #t13 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+      #t12.{core::List::add}{Invariant}(x){(core::int) → void};
+    }
+  } =>#t12;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.weak.modular.expect
new file mode 100644
index 0000000..5118ed8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///from_agnostic_lib.dart";
+
+static const field core::bool c1 = #C1;
+static const field core::Map<core::List<core::int?>, core::int> c2 = #C6;
+static const field core::Set<core::List<core::int?>> c3 = #C7;
+static const field core::List<core::int> c4 = #C2;
+static const field core::List<core::int?> c5 = #C4;
+static method main() → dynamic {
+  #C2;
+  #C4;
+}
+
+constants  {
+  #C1 = false
+  #C2 = <core::int*>[]
+  #C3 = 0
+  #C4 = <core::int?>[]
+  #C5 = 1
+  #C6 = <core::List<core::int?>*, core::int*>{#C2:#C3, #C4:#C5)
+  #C7 = <core::List<core::int?>*>{#C2, #C4}
+}
diff --git a/pkg/front_end/testcases/nnbd/function_types.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/function_types.dart.weak.modular.expect
new file mode 100644
index 0000000..57a3b98
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/function_types.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () → void;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class B extends self::A<() →? dynamic> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method method(() →? dynamic x) → () →? dynamic
+    return null;
+}
+static method foo() → void {}
+static method bar() → () → void
+  return #C1;
+static method baz() → () →? void
+  return #C1;
+static method hest() → () → void
+  return #C1;
+static method fisk() → () →? void
+  return #C1;
+static method foobar(() →? dynamic x) → () →? dynamic
+  return null;
+static method main() → dynamic {
+  () → void g = () → void {};
+  () →? void f = g;
+  () → void fBar = self::bar();
+  () →? void fBaz = self::baz();
+  () → void fHest = self::hest();
+  () →? void fFisk = self::fisk();
+}
+
+constants  {
+  #C1 = static-tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/nnbd/future_or_variables.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/future_or_variables.dart.weak.modular.expect
new file mode 100644
index 0000000..88659fb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/future_or_variables.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class1 extends core::Object {
+  field FutureOr<dynamic>instanceField1 = null;
+  field FutureOr<core::int?>instanceField2 = null;
+  field FutureOr<FutureOr<dynamic>>instanceField3 = null;
+  static field FutureOr<dynamic>staticField1 = null;
+  static field FutureOr<core::int?>staticField2 = null;
+  static field FutureOr<FutureOr<dynamic>>staticField3 = null;
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  method instanceMethod1([FutureOr<dynamic>parameter1 = #C1, FutureOr<core::int?>parameter2 = #C1, FutureOr<FutureOr<dynamic>>parameter3 = #C1]) → void {}
+  method instanceMethod2({FutureOr<dynamic>parameter1 = #C1, FutureOr<core::int?>parameter2 = #C1, FutureOr<FutureOr<dynamic>>parameter3 = #C1}) → void {}
+  static method staticMethod1([FutureOr<dynamic>parameter1 = #C1, FutureOr<core::int?>parameter2 = #C1, FutureOr<FutureOr<dynamic>>parameter3 = #C1]) → void {}
+  static method staticMethod2({FutureOr<dynamic>parameter1 = #C1, FutureOr<core::int?>parameter2 = #C1, FutureOr<FutureOr<dynamic>>parameter3 = #C1}) → void {}
+}
+class Class2 extends core::Object {
+  field FutureOr<dynamic>instanceField1;
+  field FutureOr<core::int?>instanceField2;
+  field FutureOr<FutureOr<dynamic>>instanceField3;
+  constructor constructor1(FutureOr<dynamic>instanceField1, FutureOr<core::int?>instanceField2, FutureOr<FutureOr<dynamic>>instanceField3) → self::Class2
+    : self::Class2::instanceField1 = instanceField1, self::Class2::instanceField2 = instanceField2, self::Class2::instanceField3 = instanceField3, super core::Object::•()
+    ;
+  constructor constructor2() → self::Class2
+    : self::Class2::instanceField3 = null, self::Class2::instanceField2 = null, self::Class2::instanceField1 = null, super core::Object::•()
+    ;
+}
+static field FutureOr<dynamic>topLevelField1;
+static field FutureOr<core::int?>topLevelField2;
+static field FutureOr<FutureOr<dynamic>>topLevelField3;
+static method toplevelMethod1([FutureOr<dynamic>parameter1 = #C1, FutureOr<core::int?>parameter2 = #C1, FutureOr<FutureOr<dynamic>>parameter3 = #C1]) → void {}
+static method toplevelMethod2({FutureOr<dynamic>parameter1 = #C1, FutureOr<core::int?>parameter2 = #C1, FutureOr<FutureOr<dynamic>>parameter3 = #C1}) → void {}
+static method main() → dynamic {
+  FutureOr<dynamic>local1;
+  FutureOr<core::int?>local2;
+  FutureOr<FutureOr<dynamic>>local3;
+  core::print(local1);
+  core::print(local2);
+  core::print(local3);
+  function localFunction1([FutureOr<dynamic>parameter1 = #C1, FutureOr<core::int?>parameter2 = #C1, FutureOr<FutureOr<dynamic>>parameter3 = #C1]) → void {}
+  function localFunction2({FutureOr<dynamic>parameter1 = #C1, FutureOr<core::int?>parameter2 = #C1, FutureOr<FutureOr<dynamic>>parameter3 = #C1}) → void {}
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.modular.expect
new file mode 100644
index 0000000..c796a15
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart.weak.modular.expect
@@ -0,0 +1,273 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:21:11: Error: The type 'num' of the getter 'A.property3' is not a subtype of the type 'int' of the setter 'A.property3'.
+//   num get property3; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:22:12: Context: This is the declaration of the setter 'A.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:36:18: Error: The type 'num' of the getter 'A.property9' is not a subtype of the type 'int' of the setter 'A.property9'.
+//   static num get property9 => 0; // error
+//                  ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:37:19: Context: This is the declaration of the setter 'A.property9'.
+//   static void set property9(int value) {}
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:61:12: Error: The type 'num' of the inherited getter 'B1.property3' is not a subtype of the type 'int' of the setter 'B2.property3'.
+//   void set property3(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:45:11: Context: This is the declaration of the getter 'B1.property3'.
+//   num get property3;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:67:12: Error: The type 'num' of the inherited field 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:51:13: Context: This is the declaration of the field 'B1.property6'.
+//   final num property6;
+//             ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:89:11: Error: The type 'num' of the getter 'C2.property3' is not a subtype of the type 'int' of the inherited setter 'C1.property3'.
+//   num get property3; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:75:12: Context: This is the declaration of the setter 'C1.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The type 'num' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   num get property6; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6 = 0;
+//       ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:97:11: Error: The return type of the method 'C2.property6' is 'num', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
+// Change to a subtype of 'int'.
+//   num get property6; // error
+//           ^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:81:7: Context: This is the overridden method ('property6').
+//   int property6 = 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:116:16: Error: The type 'num' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
+// abstract class D3 implements D1, D2 /* error on property3 */ {}
+//                ^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:105:11: Context: This is the declaration of the getter 'D1.property3'.
+//   num get property3;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:113:12: Context: This is the declaration of the setter 'D2.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:118:16: Error: The type 'num' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
+// abstract class D4 implements D3 /* no need for error on property3 */ {}
+//                ^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:105:11: Context: This is the declaration of the getter 'D1.property3'.
+//   num get property3;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:113:12: Context: This is the declaration of the setter 'D2.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:11:9: Error: The type 'num' of the getter 'property3' is not a subtype of the type 'int' of the setter 'property3'.
+// num get property3 => 0; // error
+//         ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:12:10: Context: This is the declaration of the setter 'property3'.
+// void set property3(int value) {}
+//          ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:127:11: Error: The type 'num' of the getter 'property3' is not a subtype of the type 'int' of the setter 'property3'.
+//   num get property3 => 0; // error
+//           ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:128:12: Context: This is the declaration of the setter 'property3'.
+//   void set property3(int i) {}
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:136:9: Error: The type 'T' of the getter 'property6' is not a subtype of the type 'S' of the setter 'property6'.
+//   T get property6 => 0; // error
+//         ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:137:12: Context: This is the declaration of the setter 'property6'.
+//   void set property6(S i) {}
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:145:18: Error: The type 'num' of the getter 'property9' is not a subtype of the type 'int' of the setter 'property9'.
+//   static num get property9 => 0; // error
+//                  ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:146:19: Context: This is the declaration of the setter 'property9'.
+//   static void set property9(int value) {}
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:130:22: Error: A value of type 'int' can't be returned from a function with return type 'S'.
+//   S get property4 => 0; // ok
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:133:22: Error: A value of type 'int' can't be returned from a function with return type 'S'.
+//   S get property5 => 0; // ok
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:136:22: Error: A value of type 'int' can't be returned from a function with return type 'T'.
+//   T get property6 => 0; // error
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int property4 = 0;
+  field core::int property5 = 0;
+  covariant-by-declaration field core::num property6 = 0;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract get property1() → core::int;
+  abstract set property1(core::int i) → void;
+  abstract get property2() → core::int;
+  abstract set property2(core::int i) → void;
+  abstract get property3() → core::num;
+  abstract set property3(core::int i) → void;
+  static get property7() → core::int
+    return 0;
+  static set property7(core::int value) → void {}
+  static get property8() → core::int
+    return 0;
+  static set property8(core::num value) → void {}
+  static get property9() → core::num
+    return 0;
+  static set property9(core::int value) → void {}
+}
+abstract class B1 extends core::Object {
+  final field core::int property4;
+  final field core::int property5;
+  final field core::num property6;
+  constructor •(core::int property4, core::int property5, core::num property6) → self::B1
+    : self::B1::property4 = property4, self::B1::property5 = property5, self::B1::property6 = property6, super core::Object::•()
+    ;
+  abstract get property1() → core::int;
+  abstract get property2() → core::int;
+  abstract get property3() → core::num;
+}
+abstract class B2 extends core::Object implements self::B1 {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+  abstract set property1(core::int i) → void;
+  abstract set property2(core::num i) → void;
+  abstract set property3(core::int i) → void;
+  abstract set property4(core::int i) → void;
+  abstract set property5(core::num i) → void;
+  abstract set property6(core::int i) → void;
+}
+abstract class C1 extends core::Object {
+  field core::int property4 = 0;
+  field core::num property5 = 0;
+  field core::int property6 = 0;
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+  abstract set property1(core::int i) → void;
+  abstract set property2(core::num i) → void;
+  abstract set property3(core::int i) → void;
+}
+abstract class C2 extends core::Object implements self::C1 {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+  abstract get property1() → core::int;
+  abstract get property2() → core::int;
+  abstract get property3() → core::num;
+  abstract get property4() → core::int;
+  abstract get property5() → core::int;
+  abstract get property6() → core::num;
+}
+abstract class D1 extends core::Object {
+  synthetic constructor •() → self::D1
+    : super core::Object::•()
+    ;
+  abstract get property1() → core::int;
+  abstract get property2() → core::int;
+  abstract get property3() → core::num;
+}
+abstract class D2 extends core::Object {
+  synthetic constructor •() → self::D2
+    : super core::Object::•()
+    ;
+  abstract set property1(core::int i) → void;
+  abstract set property2(core::num i) → void;
+  abstract set property3(core::int i) → void;
+}
+abstract class D3 extends core::Object implements self::D1, self::D2 {
+  synthetic constructor •() → self::D3
+    : super core::Object::•()
+    ;
+}
+abstract class D4 extends core::Object implements self::D3 {
+  synthetic constructor •() → self::D4
+    : super core::Object::•()
+    ;
+}
+extension Extension<T extends core::Object? = dynamic, S extends T% = dynamic> on core::int {
+  get property1 = self::Extension|get#property1;
+  get property2 = self::Extension|get#property2;
+  get property3 = self::Extension|get#property3;
+  get property4 = self::Extension|get#property4;
+  get property5 = self::Extension|get#property5;
+  get property6 = self::Extension|get#property6;
+  static get property7 = get self::Extension|property7;
+  static get property8 = get self::Extension|property8;
+  static get property9 = get self::Extension|property9;
+  set property1 = self::Extension|set#property1;
+  set property2 = self::Extension|set#property2;
+  set property3 = self::Extension|set#property3;
+  set property4 = self::Extension|set#property4;
+  set property5 = self::Extension|set#property5;
+  set property6 = self::Extension|set#property6;
+  static set property7 = set self::Extension|property7;
+  static set property8 = set self::Extension|property8;
+  static set property9 = set self::Extension|property9;
+}
+static get property1() → core::int
+  return 0;
+static set property1(core::int value) → void {}
+static get property2() → core::int
+  return 0;
+static set property2(core::num value) → void {}
+static get property3() → core::num
+  return 0;
+static set property3(core::int value) → void {}
+static method Extension|get#property1<T extends core::Object? = dynamic, S extends self::Extension|get#property1::T% = dynamic>(lowered final core::int #this) → core::int
+  return 0;
+static method Extension|set#property1<T extends core::Object? = dynamic, S extends self::Extension|set#property1::T% = dynamic>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property2<T extends core::Object? = dynamic, S extends self::Extension|get#property2::T% = dynamic>(lowered final core::int #this) → core::int
+  return 0;
+static method Extension|set#property2<T extends core::Object? = dynamic, S extends self::Extension|set#property2::T% = dynamic>(lowered final core::int #this, core::num i) → void {}
+static method Extension|get#property3<T extends core::Object? = dynamic, S extends self::Extension|get#property3::T% = dynamic>(lowered final core::int #this) → core::num
+  return 0;
+static method Extension|set#property3<T extends core::Object? = dynamic, S extends self::Extension|set#property3::T% = dynamic>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property4<T extends core::Object? = dynamic, S extends self::Extension|get#property4::T% = dynamic>(lowered final core::int #this) → self::Extension|get#property4::S%
+  return invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:130:22: Error: A value of type 'int' can't be returned from a function with return type 'S'.
+  S get property4 => 0; // ok
+                     ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
+static method Extension|set#property4<T extends core::Object? = dynamic, S extends self::Extension|set#property4::T% = dynamic>(lowered final core::int #this, self::Extension|set#property4::S% i) → void {}
+static method Extension|get#property5<T extends core::Object? = dynamic, S extends self::Extension|get#property5::T% = dynamic>(lowered final core::int #this) → self::Extension|get#property5::S%
+  return invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:133:22: Error: A value of type 'int' can't be returned from a function with return type 'S'.
+  S get property5 => 0; // ok
+                     ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
+static method Extension|set#property5<T extends core::Object? = dynamic, S extends self::Extension|set#property5::T% = dynamic>(lowered final core::int #this, self::Extension|set#property5::T% i) → void {}
+static method Extension|get#property6<T extends core::Object? = dynamic, S extends self::Extension|get#property6::T% = dynamic>(lowered final core::int #this) → self::Extension|get#property6::T%
+  return invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type.dart:136:22: Error: A value of type 'int' can't be returned from a function with return type 'T'.
+  T get property6 => 0; // error
+                     ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
+static method Extension|set#property6<T extends core::Object? = dynamic, S extends self::Extension|set#property6::T% = dynamic>(lowered final core::int #this, self::Extension|set#property6::S% i) → void {}
+static get Extension|property7() → core::int
+  return 0;
+static set Extension|property7(core::int value) → void {}
+static get Extension|property8() → core::int
+  return 0;
+static set Extension|property8(core::num value) → void {}
+static get Extension|property9() → core::num
+  return 0;
+static set Extension|property9(core::int value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.modular.expect
new file mode 100644
index 0000000..6234f7f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:30:12: Error: The type 'int?' of the inherited field 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:20:19: Context: This is the declaration of the field 'B1.property6'.
+//   late final int? property6;
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the declaration of the setter 'C1.property6'.
+//   late int property6;
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:50:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
+// Change to a subtype of 'int'.
+//   int? get property6; // error
+//            ^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_late.dart:38:12: Context: This is the overridden method ('property6').
+//   late int property6;
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  late field core::int property4;
+  late field core::int? property5;
+  late covariant-by-declaration field core::int property6;
+  constructor •(core::int property4, core::int? property5, core::int property6) → self::A
+    : self::A::property4 = property4, self::A::property5 = property5, self::A::property6 = property6, super core::Object::•()
+    ;
+}
+abstract class B1 extends core::Object {
+  late final [setter] field core::int property4;
+  late final [setter] field core::int property5;
+  late final [setter] field core::int? property6;
+  constructor •(core::int property4, core::int property5, core::int? property6) → self::B1
+    : self::B1::property4 = property4, self::B1::property5 = property5, self::B1::property6 = property6, super core::Object::•()
+    ;
+}
+abstract class B2 extends core::Object implements self::B1 {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+  abstract set property4(core::int i) → void;
+  abstract set property5(core::int? i) → void;
+  abstract set property6(core::int i) → void;
+}
+abstract class C1 extends core::Object {
+  late field core::int property4;
+  late field core::int property5;
+  late field core::int property6;
+  constructor •(core::int property4, core::int property5, core::int property6) → self::C1
+    : self::C1::property4 = property4, self::C1::property5 = property5, self::C1::property6 = property6, super core::Object::•()
+    ;
+}
+abstract class C2 extends core::Object implements self::C1 {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+  abstract get property4() → core::int;
+  abstract get property5() → core::int;
+  abstract get property6() → core::int?;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.modular.expect
new file mode 100644
index 0000000..1f17578
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart.weak.modular.expect
@@ -0,0 +1,284 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:21:12: Error: The type 'int?' of the getter 'A.property3' is not a subtype of the type 'int' of the setter 'A.property3'.
+//   int? get property3; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:22:12: Context: This is the declaration of the setter 'A.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:38:19: Error: The type 'int?' of the getter 'A.property9' is not a subtype of the type 'int' of the setter 'A.property9'.
+//   static int? get property9 => 0; // error
+//                   ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:39:19: Context: This is the declaration of the setter 'A.property9'.
+//   static void set property9(int value) {}
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:63:12: Error: The type 'int?' of the inherited getter 'B1.property3' is not a subtype of the type 'int' of the setter 'B2.property3'.
+//   void set property3(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:47:12: Context: This is the declaration of the getter 'B1.property3'.
+//   int? get property3;
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:69:12: Error: The type 'int?' of the inherited field 'B1.property6' is not a subtype of the type 'int' of the setter 'B2.property6'.
+//   void set property6(int i); // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:53:14: Context: This is the declaration of the field 'B1.property6'.
+//   final int? property6;
+//              ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:93:12: Error: The type 'int?' of the getter 'C2.property3' is not a subtype of the type 'int' of the inherited setter 'C1.property3'.
+//   int? get property3; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:77:12: Context: This is the declaration of the setter 'C1.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The type 'int?' of the getter 'C2.property6' is not a subtype of the type 'int' of the inherited setter 'C1.property6'.
+//   int? get property6; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the declaration of the setter 'C1.property6'.
+//   int property6;
+//       ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:101:12: Error: The return type of the method 'C2.property6' is 'int?', which does not match the return type, 'int', of the overridden method, 'C1.property6'.
+// Change to a subtype of 'int'.
+//   int? get property6; // error
+//            ^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:83:7: Context: This is the overridden method ('property6').
+//   int property6;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:120:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
+// abstract class D3 implements D1, D2 /* error on property3 */ {}
+//                ^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:109:12: Context: This is the declaration of the getter 'D1.property3'.
+//   int? get property3;
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:117:12: Context: This is the declaration of the setter 'D2.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:122:16: Error: The type 'int?' of the inherited getter 'D1.property3' is not a subtype of the type 'int' of the inherited setter 'D2.property3'.
+// abstract class D4 implements D3 /* no need for error on property3 */ {}
+//                ^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:109:12: Context: This is the declaration of the getter 'D1.property3'.
+//   int? get property3;
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:117:12: Context: This is the declaration of the setter 'D2.property3'.
+//   void set property3(int i);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:11:10: Error: The type 'int?' of the getter 'property3' is not a subtype of the type 'int' of the setter 'property3'.
+// int? get property3 => 0; // error
+//          ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:12:10: Context: This is the declaration of the setter 'property3'.
+// void set property3(int value) {}
+//          ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:131:12: Error: The type 'int?' of the getter 'property3' is not a subtype of the type 'int' of the setter 'property3'.
+//   int? get property3 => 0; // error
+//            ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:132:12: Context: This is the declaration of the setter 'property3'.
+//   void set property3(int i) {}
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:143:10: Error: The type 'T?' of the getter 'property6' is not a subtype of the type 'T' of the setter 'property6'.
+//   T? get property6 => 0; // error
+//          ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:144:12: Context: This is the declaration of the setter 'property6'.
+//   void set property6(T i) {}
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:152:19: Error: The type 'int?' of the getter 'property9' is not a subtype of the type 'int' of the setter 'property9'.
+//   static int? get property9 => 0; // error
+//                   ^^^^^^^^^
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:153:19: Context: This is the declaration of the setter 'property9'.
+//   static void set property9(int value) {}
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:134:23: Error: A value of type 'int' can't be returned from a function with return type 'T'.
+//   T get property4a => 0; // ok
+//                       ^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:137:24: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
+//   T? get property4b => 0; // ok
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:140:22: Error: A value of type 'int' can't be returned from a function with return type 'T'.
+//   T get property5 => 0; // ok
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:143:23: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
+//   T? get property6 => 0; // error
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int property4;
+  field core::int? property5;
+  covariant-by-declaration field core::int property6;
+  constructor •(core::int property4, core::int? property5, core::int property6) → self::A
+    : self::A::property4 = property4, self::A::property5 = property5, self::A::property6 = property6, super core::Object::•()
+    ;
+  abstract get property1() → core::int;
+  abstract set property1(core::int i) → void;
+  abstract get property2() → core::int;
+  abstract set property2(core::int? i) → void;
+  abstract get property3() → core::int?;
+  abstract set property3(core::int i) → void;
+  static get property7() → core::int
+    return 0;
+  static set property7(core::int value) → void {}
+  static get property8() → core::int
+    return 0;
+  static set property8(core::int? value) → void {}
+  static get property9() → core::int?
+    return 0;
+  static set property9(core::int value) → void {}
+}
+abstract class B1 extends core::Object {
+  final field core::int property4;
+  final field core::int property5;
+  final field core::int? property6;
+  constructor •(core::int property4, core::int property5, core::int? property6) → self::B1
+    : self::B1::property4 = property4, self::B1::property5 = property5, self::B1::property6 = property6, super core::Object::•()
+    ;
+  abstract get property1() → core::int;
+  abstract get property2() → core::int;
+  abstract get property3() → core::int?;
+}
+abstract class B2 extends core::Object implements self::B1 {
+  synthetic constructor •() → self::B2
+    : super core::Object::•()
+    ;
+  abstract set property1(core::int i) → void;
+  abstract set property2(core::int? i) → void;
+  abstract set property3(core::int i) → void;
+  abstract set property4(core::int i) → void;
+  abstract set property5(core::int? i) → void;
+  abstract set property6(core::int i) → void;
+}
+abstract class C1 extends core::Object {
+  field core::int property4;
+  field core::int? property5;
+  field core::int property6;
+  constructor •(core::int property4, core::int? property5, core::int property6) → self::C1
+    : self::C1::property4 = property4, self::C1::property5 = property5, self::C1::property6 = property6, super core::Object::•()
+    ;
+  abstract set property1(core::int i) → void;
+  abstract set property2(core::int? i) → void;
+  abstract set property3(core::int i) → void;
+}
+abstract class C2 extends core::Object implements self::C1 {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+  abstract get property1() → core::int;
+  abstract get property2() → core::int;
+  abstract get property3() → core::int?;
+  abstract get property4() → core::int;
+  abstract get property5() → core::int;
+  abstract get property6() → core::int?;
+}
+abstract class D1 extends core::Object {
+  synthetic constructor •() → self::D1
+    : super core::Object::•()
+    ;
+  abstract get property1() → core::int;
+  abstract get property2() → core::int;
+  abstract get property3() → core::int?;
+}
+abstract class D2 extends core::Object {
+  synthetic constructor •() → self::D2
+    : super core::Object::•()
+    ;
+  abstract set property1(core::int i) → void;
+  abstract set property2(core::int? i) → void;
+  abstract set property3(core::int i) → void;
+}
+abstract class D3 extends core::Object implements self::D1, self::D2 {
+  synthetic constructor •() → self::D3
+    : super core::Object::•()
+    ;
+}
+abstract class D4 extends core::Object implements self::D3 {
+  synthetic constructor •() → self::D4
+    : super core::Object::•()
+    ;
+}
+extension Extension<T extends core::num> on core::int {
+  get property1 = self::Extension|get#property1;
+  get property2 = self::Extension|get#property2;
+  get property3 = self::Extension|get#property3;
+  get property4a = self::Extension|get#property4a;
+  get property4b = self::Extension|get#property4b;
+  get property5 = self::Extension|get#property5;
+  get property6 = self::Extension|get#property6;
+  static get property7 = get self::Extension|property7;
+  static get property8 = get self::Extension|property8;
+  static get property9 = get self::Extension|property9;
+  set property1 = self::Extension|set#property1;
+  set property2 = self::Extension|set#property2;
+  set property3 = self::Extension|set#property3;
+  set property4a = self::Extension|set#property4a;
+  set property4b = self::Extension|set#property4b;
+  set property5 = self::Extension|set#property5;
+  set property6 = self::Extension|set#property6;
+  static set property7 = set self::Extension|property7;
+  static set property8 = set self::Extension|property8;
+  static set property9 = set self::Extension|property9;
+}
+static get property1() → core::int
+  return 0;
+static set property1(core::int value) → void {}
+static get property2() → core::int
+  return 0;
+static set property2(core::int? value) → void {}
+static get property3() → core::int?
+  return 0;
+static set property3(core::int value) → void {}
+static method Extension|get#property1<T extends core::num>(lowered final core::int #this) → core::int
+  return 0;
+static method Extension|set#property1<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property2<T extends core::num>(lowered final core::int #this) → core::int
+  return 0;
+static method Extension|set#property2<T extends core::num>(lowered final core::int #this, core::int? i) → void {}
+static method Extension|get#property3<T extends core::num>(lowered final core::int #this) → core::int?
+  return 0;
+static method Extension|set#property3<T extends core::num>(lowered final core::int #this, core::int i) → void {}
+static method Extension|get#property4a<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4a::T
+  return invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:134:23: Error: A value of type 'int' can't be returned from a function with return type 'T'.
+  T get property4a => 0; // ok
+                      ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
+static method Extension|set#property4a<T extends core::num>(lowered final core::int #this, self::Extension|set#property4a::T i) → void {}
+static method Extension|get#property4b<T extends core::num>(lowered final core::int #this) → self::Extension|get#property4b::T?
+  return invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:137:24: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
+  T? get property4b => 0; // ok
+                       ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
+static method Extension|set#property4b<T extends core::num>(lowered final core::int #this, self::Extension|set#property4b::T? i) → void {}
+static method Extension|get#property5<T extends core::num>(lowered final core::int #this) → self::Extension|get#property5::T
+  return invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:140:22: Error: A value of type 'int' can't be returned from a function with return type 'T'.
+  T get property5 => 0; // ok
+                     ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
+static method Extension|set#property5<T extends core::num>(lowered final core::int #this, self::Extension|set#property5::T? i) → void {}
+static method Extension|get#property6<T extends core::num>(lowered final core::int #this) → self::Extension|get#property6::T?
+  return invalid-expression "pkg/front_end/testcases/nnbd/getter_vs_setter_type_nnbd.dart:143:23: Error: A value of type 'int' can't be returned from a function with return type 'T?'.
+  T? get property6 => 0; // error
+                      ^" in 0 as{TypeError,ForNonNullableByDefault} Never;
+static method Extension|set#property6<T extends core::num>(lowered final core::int #this, self::Extension|set#property6::T i) → void {}
+static get Extension|property7() → core::int
+  return 0;
+static set Extension|property7(core::int value) → void {}
+static get Extension|property8() → core::int
+  return 0;
+static set Extension|property8(core::int? value) → void {}
+static get Extension|property9() → core::int?
+  return 0;
+static set Extension|property9(core::int value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.modular.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method main() → dynamic {
+  late core::int local;
+  local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_promoted.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/infer_from_promoted.dart.weak.modular.expect
new file mode 100644
index 0000000..2e2a614
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_promoted.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/infer_from_promoted.dart:16:21: Error: A value of type 'String' can't be returned from a function with return type 'int'.
+//   d = (a, b) => '$a';
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<invariant T extends core::Object? = dynamic> = (T%, T%) → T%;
+static method test1() → dynamic {
+  dynamic d = (core::int a, core::int b) → core::int => a;
+  d as{ForNonNullableByDefault} (core::int, core::int) → core::int;
+  d = <S extends core::Object? = dynamic>(S% a, S% b) → S% => a;
+}
+static method test2() → dynamic {
+  dynamic d = (core::int a, core::int b) → core::int => a;
+  d as{ForNonNullableByDefault} (core::int, core::int) → core::int;
+  d = (core::int a, core::int b) → core::int => invalid-expression "pkg/front_end/testcases/nnbd/infer_from_promoted.dart:16:21: Error: A value of type 'String' can't be returned from a function with return type 'int'.
+  d = (a, b) => '\$a';
+                    ^" in "${a}" as{TypeError,ForNonNullableByDefault} core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.modular.expect
new file mode 100644
index 0000000..fe4267a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_if_null.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A2 extends core::Object {
+  field core::String? foo = null;
+  synthetic constructor •() → self::A2
+    : super core::Object::•()
+    ;
+}
+class A5 extends core::Object {
+  synthetic constructor •() → self::A5
+    : super core::Object::•()
+    ;
+  operator []=(core::int index, core::String? value) → void {}
+  operator [](core::int index) → core::String?
+    return null;
+}
+class B5 extends self::A5 {
+  synthetic constructor •() → self::B5
+    : super self::A5::•()
+    ;
+  method test5() → dynamic {
+    core::String s = let final core::int #t1 = 0 in let final core::String? #t2 = super.{self::A5::[]}(#t1) in #t2 == null ?{core::String} let final core::String #t3 = "bar" in let final void #t4 = super.{self::A5::[]=}(#t1, #t3) in #t3 : #t2{core::String};
+  }
+}
+class A7 extends core::Object {
+  field core::String foo = "foo";
+  field core::String? bar = null;
+  synthetic constructor •() → self::A7
+    : super core::Object::•()
+    ;
+}
+extension E6 on core::double {
+  operator []= = self::E6|[]=;
+  operator [] = self::E6|[];
+}
+static method hest1<T extends core::Object? = dynamic>() → self::hest1::T%
+  return throw "hest";
+static method test1() → dynamic {
+  function foo() → core::String?
+    return null;
+  function bar() → core::String
+    return "bar";
+  core::String s = let final core::String? #t5 = foo(){() → core::String?} in #t5 == null ?{core::String} bar(){() → core::String} : #t5{core::String};
+  core::String s2 = let final core::String? #t6 = self::hest1<core::String?>() in #t6 == null ?{core::String} "fisk" : #t6{core::String};
+}
+static method test2(self::A2 a) → dynamic {
+  core::String s = let final self::A2 #t7 = a in let final core::String? #t8 = #t7.{self::A2::foo}{core::String?} in #t8 == null ?{core::String} #t7.{self::A2::foo} = "bar" : #t8{core::String};
+}
+static method test3() → dynamic {
+  core::String? s = null;
+  core::String s2 = let final core::String? #t9 = s in #t9 == null ?{core::String} s = "bar" : #t9{core::String};
+}
+static method test4() → dynamic {
+  core::List<core::String?> list = <core::String?>[null];
+  core::String s = let final core::List<core::String?> #t10 = list in let final core::int #t11 = 0 in let final core::String? #t12 = #t10.{core::List::[]}(#t11){(core::int) → core::String?} in #t12 == null ?{core::String} let final core::String #t13 = "bar" in let final void #t14 = #t10.{core::List::[]=}(#t11, #t13){(core::int, core::String?) → void} in #t13 : #t12{core::String};
+}
+static method E6|[]=(lowered final core::double #this, core::int index, core::String? value) → void {}
+static method E6|[](lowered final core::double #this, core::int index) → core::String?
+  return null;
+static method test6() → dynamic {
+  core::String s = let final core::double #t15 = 3.14 in let final core::int #t16 = 0 in let final core::String? #t17 = self::E6|[](#t15, #t16) in #t17 == null ?{core::String} let final core::String #t18 = "bar" in let final void #t19 = self::E6|[]=(#t15, #t16, #t18) in #t18 : #t17{core::String};
+}
+static method test7(self::A7? a) → dynamic {
+  core::String? s = let final self::A7? #t20 = a in #t20 == null ?{core::String?} null : let final core::String #t21 = #t20.{self::A7::foo}{core::String} in #t21 == null ?{core::String} #t20.{self::A7::foo} = "bar" : #t21;
+  core::String? s2 = let final self::A7? #t22 = a in #t22 == null ?{core::String?} null : let final core::String? #t23 = #t22.{self::A7::bar}{core::String?} in #t23 == null ?{core::String} #t22.{self::A7::bar} = "bar" : #t23{core::String};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.modular.expect
new file mode 100644
index 0000000..d29fed9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_method_types.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract method m(covariant-by-declaration core::int a) → core::Object?;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract method m(covariant-by-declaration core::num a) → dynamic;
+}
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method m(core::num a) → void;
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  abstract method m(covariant-by-declaration core::int a) → core::Object?;
+}
+abstract class E extends core::Object implements self::B {
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+  abstract method m(covariant-by-declaration core::num a) → dynamic;
+}
+abstract class F extends core::Object {
+  synthetic constructor •() → self::F
+    : super core::Object::•()
+    ;
+  abstract method m(core::int a) → core::Object?;
+}
+abstract class G extends core::Object implements self::C {
+  synthetic constructor •() → self::G
+    : super core::Object::•()
+    ;
+  abstract method m(core::num a) → void;
+}
+abstract class H extends core::Object implements self::D, self::E, self::F, self::C {
+  synthetic constructor •() → self::H
+    : super core::Object::•()
+    ;
+  abstract member-signature method m(covariant-by-declaration core::num a) → core::Object?; -> self::E::m
+}
+abstract class I extends core::Object implements self::D {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  abstract method m(covariant-by-declaration core::int a) → core::Object?;
+}
+abstract class J extends core::Object implements self::H {
+  synthetic constructor •() → self::J
+    : super core::Object::•()
+    ;
+  abstract method m(covariant-by-declaration core::num a) → core::Object?;
+}
+abstract class K extends core::Object implements self::I, self::E, self::G {
+  synthetic constructor •() → self::K
+    : super core::Object::•()
+    ;
+  abstract member-signature method m(covariant-by-declaration core::num a) → core::Object?; -> self::E::m
+}
+abstract class L extends core::Object implements self::K {
+  synthetic constructor •() → self::L
+    : super core::Object::•()
+    ;
+  abstract method m(covariant-by-declaration core::num a) → core::Object?;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.modular.expect
new file mode 100644
index 0000000..4c6feac
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+//   g(v);
+//     ^
+//
+// pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+//   h(v);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method g<T extends core::Object? = dynamic>(self::g::T? t) → self::g::T%
+  return t!;
+static method h<T extends core::Object>(self::h::T? t) → self::h::T
+  return t!;
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
+  self::f<dynamic>(d);
+  self::f<void>(v);
+  self::f<core::Object?>(onull);
+  self::f<core::Object>(o);
+  self::f<core::String?>(snull);
+  self::f<core::String>(s);
+  self::g<core::Object>(d);
+  self::g<core::Object>(invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:20:5: Error: This expression has type 'void' and can't be used.
+  g(v);
+    ^" in v);
+  self::g<core::Object>(onull);
+  self::g<core::Object>(o);
+  self::g<core::String>(snull);
+  self::g<core::String>(s);
+  self::h<core::Object>(d);
+  self::h<core::Object>(invalid-expression "pkg/front_end/testcases/nnbd/infer_object_from_dynamic.dart:27:5: Error: This expression has type 'void' and can't be used.
+  h(v);
+    ^" in v);
+  self::h<core::Object>(onull);
+  self::h<core::Object>(o);
+  self::h<core::String>(snull);
+  self::h<core::String>(s);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.weak.modular.expect
new file mode 100644
index 0000000..75d67bf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/injected_late_field_checks/main.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "dart:test";
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class extends core::Object {
+  late field core::int foo /* from org-dartlang-testcase:///patch_lib.dart */;
+  constructor bar() → self2::Class
+    : super core::Object::•()
+    ;
+  constructor baz(core::int foo) → self2::Class
+    : self2::Class::foo = foo, super core::Object::•()
+    ;
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+}
diff --git a/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.modular.expect
new file mode 100644
index 0000000..7e8a8f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/instance_duplicates.dart.weak.modular.expect
@@ -0,0 +1,668 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:7:8: Error: 'methodAndField1' is already declared in this scope.
+//   int? methodAndField1;
+//        ^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:6:8: Context: Previous declaration of 'methodAndField1'.
+//   int? methodAndField1() {}
+//        ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:10:8: Error: 'methodAndField2' is already declared in this scope.
+//   int? methodAndField2() {}
+//        ^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:9:8: Context: Previous declaration of 'methodAndField2'.
+//   int? methodAndField2;
+//        ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:13:14: Error: 'methodAndFinalField1' is already declared in this scope.
+//   final int? methodAndFinalField1 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:12:8: Context: Previous declaration of 'methodAndFinalField1'.
+//   int? methodAndFinalField1() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:16:8: Error: 'methodAndFinalField2' is already declared in this scope.
+//   int? methodAndFinalField2() {}
+//        ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:15:14: Context: Previous declaration of 'methodAndFinalField2'.
+//   final int? methodAndFinalField2 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:19:8: Error: 'methodAndFieldAndSetter1' is already declared in this scope.
+//   int? methodAndFieldAndSetter1;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:18:8: Context: Previous declaration of 'methodAndFieldAndSetter1'.
+//   int? methodAndFieldAndSetter1() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:23:8: Error: 'methodAndFieldAndSetter2' is already declared in this scope.
+//   int? methodAndFieldAndSetter2() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:22:8: Context: Previous declaration of 'methodAndFieldAndSetter2'.
+//   int? methodAndFieldAndSetter2;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:28:8: Error: 'methodAndFieldAndSetter3' is already declared in this scope.
+//   int? methodAndFieldAndSetter3;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:27:8: Context: Previous declaration of 'methodAndFieldAndSetter3'.
+//   int? methodAndFieldAndSetter3() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:32:8: Error: 'methodAndFieldAndSetter4' is already declared in this scope.
+//   int? methodAndFieldAndSetter4() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:31:8: Context: Previous declaration of 'methodAndFieldAndSetter4'.
+//   int? methodAndFieldAndSetter4;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:35:14: Error: 'methodAndFinalFieldAndSetter1' is already declared in this scope.
+//   final int? methodAndFinalFieldAndSetter1 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:34:8: Context: Previous declaration of 'methodAndFinalFieldAndSetter1'.
+//   int? methodAndFinalFieldAndSetter1() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:39:8: Error: 'methodAndFinalFieldAndSetter2' is already declared in this scope.
+//   int? methodAndFinalFieldAndSetter2() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:38:14: Context: Previous declaration of 'methodAndFinalFieldAndSetter2'.
+//   final int? methodAndFinalFieldAndSetter2 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:44:14: Error: 'methodAndFinalFieldAndSetter3' is already declared in this scope.
+//   final int? methodAndFinalFieldAndSetter3 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:43:8: Context: Previous declaration of 'methodAndFinalFieldAndSetter3'.
+//   int? methodAndFinalFieldAndSetter3() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:48:8: Error: 'methodAndFinalFieldAndSetter4' is already declared in this scope.
+//   int? methodAndFinalFieldAndSetter4() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:47:14: Context: Previous declaration of 'methodAndFinalFieldAndSetter4'.
+//   final int? methodAndFinalFieldAndSetter4 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:54:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   int? set methodAndSetter2() {}
+//   ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:63:14: Error: 'fieldAndFinalFieldAndSetter1' is already declared in this scope.
+//   final int? fieldAndFinalFieldAndSetter1 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:62:8: Context: Previous declaration of 'fieldAndFinalFieldAndSetter1'.
+//   int? fieldAndFinalFieldAndSetter1;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:67:8: Error: 'fieldAndFinalFieldAndSetter2' is already declared in this scope.
+//   int? fieldAndFinalFieldAndSetter2;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:66:14: Context: Previous declaration of 'fieldAndFinalFieldAndSetter2'.
+//   final int? fieldAndFinalFieldAndSetter2 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:72:14: Error: 'fieldAndFinalFieldAndSetter3' is already declared in this scope.
+//   final int? fieldAndFinalFieldAndSetter3 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:71:8: Context: Previous declaration of 'fieldAndFinalFieldAndSetter3'.
+//   int? fieldAndFinalFieldAndSetter3;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:76:8: Error: 'fieldAndFinalFieldAndSetter4' is already declared in this scope.
+//   int? fieldAndFinalFieldAndSetter4;
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:75:14: Context: Previous declaration of 'fieldAndFinalFieldAndSetter4'.
+//   final int? fieldAndFinalFieldAndSetter4 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:20:12: Error: Conflicts with the implicit setter of the field 'methodAndFieldAndSetter1'.
+//   void set methodAndFieldAndSetter1(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:19:8: Error: Conflicts with setter 'methodAndFieldAndSetter1'.
+//   int? methodAndFieldAndSetter1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:24:12: Error: Conflicts with the implicit setter of the field 'methodAndFieldAndSetter2'.
+//   void set methodAndFieldAndSetter2(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:22:8: Error: Conflicts with setter 'methodAndFieldAndSetter2'.
+//   int? methodAndFieldAndSetter2;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:26:12: Error: Conflicts with the implicit setter of the field 'methodAndFieldAndSetter3'.
+//   void set methodAndFieldAndSetter3(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:28:8: Error: Conflicts with setter 'methodAndFieldAndSetter3'.
+//   int? methodAndFieldAndSetter3;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:30:12: Error: Conflicts with the implicit setter of the field 'methodAndFieldAndSetter4'.
+//   void set methodAndFieldAndSetter4(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:31:8: Error: Conflicts with setter 'methodAndFieldAndSetter4'.
+//   int? methodAndFieldAndSetter4;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:57:12: Error: Conflicts with the implicit setter of the field 'fieldAndSetter1'.
+//   void set fieldAndSetter1(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:56:8: Error: Conflicts with setter 'fieldAndSetter1'.
+//   int? fieldAndSetter1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:60:12: Error: Conflicts with the implicit setter of the field 'fieldAndSetter2'.
+//   void set fieldAndSetter2(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:59:8: Error: Conflicts with setter 'fieldAndSetter2'.
+//   int? fieldAndSetter2;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:64:12: Error: Conflicts with the implicit setter of the field 'fieldAndFinalFieldAndSetter1'.
+//   void set fieldAndFinalFieldAndSetter1(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:62:8: Error: Conflicts with setter 'fieldAndFinalFieldAndSetter1'.
+//   int? fieldAndFinalFieldAndSetter1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:68:12: Error: Conflicts with the implicit setter of the field 'fieldAndFinalFieldAndSetter2'.
+//   void set fieldAndFinalFieldAndSetter2(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:67:8: Error: Conflicts with setter 'fieldAndFinalFieldAndSetter2'.
+//   int? fieldAndFinalFieldAndSetter2;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:70:12: Error: Conflicts with the implicit setter of the field 'fieldAndFinalFieldAndSetter3'.
+//   void set fieldAndFinalFieldAndSetter3(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:71:8: Error: Conflicts with setter 'fieldAndFinalFieldAndSetter3'.
+//   int? fieldAndFinalFieldAndSetter3;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:74:12: Error: Conflicts with the implicit setter of the field 'fieldAndFinalFieldAndSetter4'.
+//   void set fieldAndFinalFieldAndSetter4(int? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:76:8: Error: Conflicts with setter 'fieldAndFinalFieldAndSetter4'.
+//   int? fieldAndFinalFieldAndSetter4;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:40:12: Error: 'methodAndFinalFieldAndSetter2' is already declared in this scope.
+//   void set methodAndFinalFieldAndSetter2(int? value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:39:8: Context: Previous declaration of 'methodAndFinalFieldAndSetter2'.
+//   int? methodAndFinalFieldAndSetter2() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:51:12: Error: 'methodAndSetter1' is already declared in this scope.
+//   void set methodAndSetter1(int? value) {}
+//            ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:50:8: Context: Previous declaration of 'methodAndSetter1'.
+//   int? methodAndSetter1() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:54:12: Error: 'methodAndSetter2' is already declared in this scope.
+//   int? set methodAndSetter2() {}
+//            ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:53:8: Context: Previous declaration of 'methodAndSetter2'.
+//   void methodAndSetter2(int? value) {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:54:28: Error: A setter should have exactly one formal parameter.
+//   int? set methodAndSetter2() {}
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:80:5: Error: Can't use 'methodAndField1' because it is declared more than once.
+//   c.methodAndField1 = c.methodAndField1;
+//     ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:80:25: Error: Can't use 'methodAndField1' because it is declared more than once.
+//   c.methodAndField1 = c.methodAndField1;
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:80:25: Error: The getter 'methodAndField1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndField1'.
+//   c.methodAndField1 = c.methodAndField1;
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:80:5: Error: The setter 'methodAndField1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndField1'.
+//   c.methodAndField1 = c.methodAndField1;
+//     ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:81:5: Error: Can't use 'methodAndField2' because it is declared more than once.
+//   c.methodAndField2 = c.methodAndField2;
+//     ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:81:25: Error: Can't use 'methodAndField2' because it is declared more than once.
+//   c.methodAndField2 = c.methodAndField2;
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:81:25: Error: The getter 'methodAndField2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndField2'.
+//   c.methodAndField2 = c.methodAndField2;
+//                         ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:81:5: Error: The setter 'methodAndField2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndField2'.
+//   c.methodAndField2 = c.methodAndField2;
+//     ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:82:5: Error: Can't use 'methodAndFinalField1' because it is declared more than once.
+//   c.methodAndFinalField1;
+//     ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:82:5: Error: The getter 'methodAndFinalField1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalField1'.
+//   c.methodAndFinalField1;
+//     ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:83:5: Error: Can't use 'methodAndFinalField2' because it is declared more than once.
+//   c.methodAndFinalField2;
+//     ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:83:5: Error: The getter 'methodAndFinalField2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalField2'.
+//   c.methodAndFinalField2;
+//     ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:84:5: Error: Can't use 'methodAndFieldAndSetter1' because it is declared more than once.
+//   c.methodAndFieldAndSetter1 = c.methodAndFieldAndSetter1;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:84:34: Error: Can't use 'methodAndFieldAndSetter1' because it is declared more than once.
+//   c.methodAndFieldAndSetter1 = c.methodAndFieldAndSetter1;
+//                                  ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:84:34: Error: The getter 'methodAndFieldAndSetter1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFieldAndSetter1'.
+//   c.methodAndFieldAndSetter1 = c.methodAndFieldAndSetter1;
+//                                  ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:84:5: Error: The setter 'methodAndFieldAndSetter1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndFieldAndSetter1'.
+//   c.methodAndFieldAndSetter1 = c.methodAndFieldAndSetter1;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:85:5: Error: Can't use 'methodAndFieldAndSetter2' because it is declared more than once.
+//   c.methodAndFieldAndSetter2 = c.methodAndFieldAndSetter2;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:85:34: Error: Can't use 'methodAndFieldAndSetter2' because it is declared more than once.
+//   c.methodAndFieldAndSetter2 = c.methodAndFieldAndSetter2;
+//                                  ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:85:34: Error: The getter 'methodAndFieldAndSetter2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFieldAndSetter2'.
+//   c.methodAndFieldAndSetter2 = c.methodAndFieldAndSetter2;
+//                                  ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:85:5: Error: The setter 'methodAndFieldAndSetter2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndFieldAndSetter2'.
+//   c.methodAndFieldAndSetter2 = c.methodAndFieldAndSetter2;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:86:5: Error: Can't use 'methodAndFieldAndSetter3' because it is declared more than once.
+//   c.methodAndFieldAndSetter3 = c.methodAndFieldAndSetter3;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:86:34: Error: Can't use 'methodAndFieldAndSetter3' because it is declared more than once.
+//   c.methodAndFieldAndSetter3 = c.methodAndFieldAndSetter3;
+//                                  ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:86:34: Error: The getter 'methodAndFieldAndSetter3' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFieldAndSetter3'.
+//   c.methodAndFieldAndSetter3 = c.methodAndFieldAndSetter3;
+//                                  ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:86:5: Error: The setter 'methodAndFieldAndSetter3' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndFieldAndSetter3'.
+//   c.methodAndFieldAndSetter3 = c.methodAndFieldAndSetter3;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:87:5: Error: Can't use 'methodAndFieldAndSetter4' because it is declared more than once.
+//   c.methodAndFieldAndSetter4 = c.methodAndFieldAndSetter4;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:87:34: Error: Can't use 'methodAndFieldAndSetter4' because it is declared more than once.
+//   c.methodAndFieldAndSetter4 = c.methodAndFieldAndSetter4;
+//                                  ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:87:34: Error: The getter 'methodAndFieldAndSetter4' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFieldAndSetter4'.
+//   c.methodAndFieldAndSetter4 = c.methodAndFieldAndSetter4;
+//                                  ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:87:5: Error: The setter 'methodAndFieldAndSetter4' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndFieldAndSetter4'.
+//   c.methodAndFieldAndSetter4 = c.methodAndFieldAndSetter4;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:88:39: Error: Can't use 'methodAndFinalFieldAndSetter1' because it is declared more than once.
+//   c.methodAndFinalFieldAndSetter1 = c.methodAndFinalFieldAndSetter1;
+//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:88:39: Error: The getter 'methodAndFinalFieldAndSetter1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalFieldAndSetter1'.
+//   c.methodAndFinalFieldAndSetter1 = c.methodAndFinalFieldAndSetter1;
+//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:89:39: Error: Can't use 'methodAndFinalFieldAndSetter2' because it is declared more than once.
+//   c.methodAndFinalFieldAndSetter2 = c.methodAndFinalFieldAndSetter2;
+//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:89:39: Error: The getter 'methodAndFinalFieldAndSetter2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalFieldAndSetter2'.
+//   c.methodAndFinalFieldAndSetter2 = c.methodAndFinalFieldAndSetter2;
+//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:90:39: Error: Can't use 'methodAndFinalFieldAndSetter3' because it is declared more than once.
+//   c.methodAndFinalFieldAndSetter3 = c.methodAndFinalFieldAndSetter3;
+//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:90:39: Error: The getter 'methodAndFinalFieldAndSetter3' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalFieldAndSetter3'.
+//   c.methodAndFinalFieldAndSetter3 = c.methodAndFinalFieldAndSetter3;
+//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:91:39: Error: Can't use 'methodAndFinalFieldAndSetter4' because it is declared more than once.
+//   c.methodAndFinalFieldAndSetter4 = c.methodAndFinalFieldAndSetter4;
+//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:91:39: Error: The getter 'methodAndFinalFieldAndSetter4' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalFieldAndSetter4'.
+//   c.methodAndFinalFieldAndSetter4 = c.methodAndFinalFieldAndSetter4;
+//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:92:26: Error: A value of type 'int? Function()' can't be assigned to a variable of type 'int?'.
+//   c.methodAndSetter1 = c.methodAndSetter1;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:96:5: Error: Can't use 'fieldAndFinalFieldAndSetter1' because it is declared more than once.
+//   c.fieldAndFinalFieldAndSetter1 = c.fieldAndFinalFieldAndSetter1;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:96:38: Error: Can't use 'fieldAndFinalFieldAndSetter1' because it is declared more than once.
+//   c.fieldAndFinalFieldAndSetter1 = c.fieldAndFinalFieldAndSetter1;
+//                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:96:38: Error: The getter 'fieldAndFinalFieldAndSetter1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'fieldAndFinalFieldAndSetter1'.
+//   c.fieldAndFinalFieldAndSetter1 = c.fieldAndFinalFieldAndSetter1;
+//                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:96:5: Error: The setter 'fieldAndFinalFieldAndSetter1' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'fieldAndFinalFieldAndSetter1'.
+//   c.fieldAndFinalFieldAndSetter1 = c.fieldAndFinalFieldAndSetter1;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:97:5: Error: Can't use 'fieldAndFinalFieldAndSetter2' because it is declared more than once.
+//   c.fieldAndFinalFieldAndSetter2 = c.fieldAndFinalFieldAndSetter2;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:97:38: Error: Can't use 'fieldAndFinalFieldAndSetter2' because it is declared more than once.
+//   c.fieldAndFinalFieldAndSetter2 = c.fieldAndFinalFieldAndSetter2;
+//                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:97:38: Error: The getter 'fieldAndFinalFieldAndSetter2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'fieldAndFinalFieldAndSetter2'.
+//   c.fieldAndFinalFieldAndSetter2 = c.fieldAndFinalFieldAndSetter2;
+//                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:97:5: Error: The setter 'fieldAndFinalFieldAndSetter2' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'fieldAndFinalFieldAndSetter2'.
+//   c.fieldAndFinalFieldAndSetter2 = c.fieldAndFinalFieldAndSetter2;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:98:5: Error: Can't use 'fieldAndFinalFieldAndSetter3' because it is declared more than once.
+//   c.fieldAndFinalFieldAndSetter3 = c.fieldAndFinalFieldAndSetter3;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:98:38: Error: Can't use 'fieldAndFinalFieldAndSetter3' because it is declared more than once.
+//   c.fieldAndFinalFieldAndSetter3 = c.fieldAndFinalFieldAndSetter3;
+//                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:98:38: Error: The getter 'fieldAndFinalFieldAndSetter3' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'fieldAndFinalFieldAndSetter3'.
+//   c.fieldAndFinalFieldAndSetter3 = c.fieldAndFinalFieldAndSetter3;
+//                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:98:5: Error: The setter 'fieldAndFinalFieldAndSetter3' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'fieldAndFinalFieldAndSetter3'.
+//   c.fieldAndFinalFieldAndSetter3 = c.fieldAndFinalFieldAndSetter3;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:99:5: Error: Can't use 'fieldAndFinalFieldAndSetter4' because it is declared more than once.
+//   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:99:38: Error: Can't use 'fieldAndFinalFieldAndSetter4' because it is declared more than once.
+//   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
+//                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:99:38: Error: The getter 'fieldAndFinalFieldAndSetter4' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'fieldAndFinalFieldAndSetter4'.
+//   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
+//                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:99:5: Error: The setter 'fieldAndFinalFieldAndSetter4' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'fieldAndFinalFieldAndSetter4'.
+//   c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:66:14: Error: Final field 'fieldAndFinalFieldAndSetter2' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int? fieldAndFinalFieldAndSetter2 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/instance_duplicates.dart:75:14: Error: Final field 'fieldAndFinalFieldAndSetter4' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int? fieldAndFinalFieldAndSetter4 = 0;
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? methodAndField2 = null;
+  final field core::int? methodAndFinalField2 = null;
+  field core::int? methodAndFieldAndSetter2 = null;
+  field core::int? methodAndFieldAndSetter4 = null;
+  final field core::int? methodAndFinalFieldAndSetter2 = null;
+  final field core::int? methodAndFinalFieldAndSetter4 = null;
+  field core::int? fieldAndSetter1 = null;
+  field core::int? fieldAndSetter2 = null;
+  field core::int? fieldAndFinalFieldAndSetter1 = null;
+  final field core::int? fieldAndFinalFieldAndSetter2 = null;
+  field core::int? fieldAndFinalFieldAndSetter3 = null;
+  final field core::int? fieldAndFinalFieldAndSetter4 = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method methodAndField1() → core::int? {}
+  method methodAndFinalField1() → core::int? {}
+  method methodAndFieldAndSetter1() → core::int? {}
+  method methodAndFieldAndSetter3() → core::int? {}
+  method methodAndFinalFieldAndSetter1() → core::int? {}
+  set methodAndFinalFieldAndSetter1(core::int? value) → void {}
+  set methodAndFinalFieldAndSetter2(core::int? value) → void {}
+  set methodAndFinalFieldAndSetter3(core::int? value) → void {}
+  method methodAndFinalFieldAndSetter3() → core::int? {}
+  set methodAndFinalFieldAndSetter4(core::int? value) → void {}
+  method methodAndSetter1() → core::int? {}
+  set methodAndSetter1(core::int? value) → void {}
+  method methodAndSetter2(core::int? value) → void {}
+  set methodAndSetter2(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:54:28: Error: A setter should have exactly one formal parameter.
+  int? set methodAndSetter2() {}
+                           ^";
+    {}
+  }
+}
+static method test(self::Class c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:80:5: Error: The setter 'methodAndField1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndField1'.
+  c.methodAndField1 = c.methodAndField1;
+    ^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndField1 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:80:25: Error: The getter 'methodAndField1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndField1'.
+  c.methodAndField1 = c.methodAndField1;
+                        ^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndField1;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:81:5: Error: The setter 'methodAndField2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndField2'.
+  c.methodAndField2 = c.methodAndField2;
+    ^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndField2 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:81:25: Error: The getter 'methodAndField2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndField2'.
+  c.methodAndField2 = c.methodAndField2;
+                        ^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndField2;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:82:5: Error: The getter 'methodAndFinalField1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalField1'.
+  c.methodAndFinalField1;
+    ^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFinalField1;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:83:5: Error: The getter 'methodAndFinalField2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalField2'.
+  c.methodAndFinalField2;
+    ^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFinalField2;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:84:5: Error: The setter 'methodAndFieldAndSetter1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndFieldAndSetter1'.
+  c.methodAndFieldAndSetter1 = c.methodAndFieldAndSetter1;
+    ^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFieldAndSetter1 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:84:34: Error: The getter 'methodAndFieldAndSetter1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFieldAndSetter1'.
+  c.methodAndFieldAndSetter1 = c.methodAndFieldAndSetter1;
+                                 ^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFieldAndSetter1;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:85:5: Error: The setter 'methodAndFieldAndSetter2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndFieldAndSetter2'.
+  c.methodAndFieldAndSetter2 = c.methodAndFieldAndSetter2;
+    ^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFieldAndSetter2 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:85:34: Error: The getter 'methodAndFieldAndSetter2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFieldAndSetter2'.
+  c.methodAndFieldAndSetter2 = c.methodAndFieldAndSetter2;
+                                 ^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFieldAndSetter2;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:86:5: Error: The setter 'methodAndFieldAndSetter3' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndFieldAndSetter3'.
+  c.methodAndFieldAndSetter3 = c.methodAndFieldAndSetter3;
+    ^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFieldAndSetter3 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:86:34: Error: The getter 'methodAndFieldAndSetter3' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFieldAndSetter3'.
+  c.methodAndFieldAndSetter3 = c.methodAndFieldAndSetter3;
+                                 ^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFieldAndSetter3;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:87:5: Error: The setter 'methodAndFieldAndSetter4' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'methodAndFieldAndSetter4'.
+  c.methodAndFieldAndSetter4 = c.methodAndFieldAndSetter4;
+    ^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFieldAndSetter4 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:87:34: Error: The getter 'methodAndFieldAndSetter4' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFieldAndSetter4'.
+  c.methodAndFieldAndSetter4 = c.methodAndFieldAndSetter4;
+                                 ^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFieldAndSetter4;
+  c.{self::Class::methodAndFinalFieldAndSetter1} = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:88:39: Error: The getter 'methodAndFinalFieldAndSetter1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalFieldAndSetter1'.
+  c.methodAndFinalFieldAndSetter1 = c.methodAndFinalFieldAndSetter1;
+                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFinalFieldAndSetter1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+  c.{self::Class::methodAndFinalFieldAndSetter2} = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:89:39: Error: The getter 'methodAndFinalFieldAndSetter2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalFieldAndSetter2'.
+  c.methodAndFinalFieldAndSetter2 = c.methodAndFinalFieldAndSetter2;
+                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFinalFieldAndSetter2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+  c.{self::Class::methodAndFinalFieldAndSetter3} = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:90:39: Error: The getter 'methodAndFinalFieldAndSetter3' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalFieldAndSetter3'.
+  c.methodAndFinalFieldAndSetter3 = c.methodAndFinalFieldAndSetter3;
+                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFinalFieldAndSetter3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+  c.{self::Class::methodAndFinalFieldAndSetter4} = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:91:39: Error: The getter 'methodAndFinalFieldAndSetter4' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'methodAndFinalFieldAndSetter4'.
+  c.methodAndFinalFieldAndSetter4 = c.methodAndFinalFieldAndSetter4;
+                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.methodAndFinalFieldAndSetter4 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int?;
+  c.{self::Class::methodAndSetter1} = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:92:26: Error: A value of type 'int? Function()' can't be assigned to a variable of type 'int?'.
+  c.methodAndSetter1 = c.methodAndSetter1;
+                         ^" in c.{self::Class::methodAndSetter1}{() → core::int?} as{TypeError,ForNonNullableByDefault} core::int?;
+  c.{self::Class::methodAndSetter2} = c.{self::Class::methodAndSetter2}{(core::int?) → void};
+  c.{self::Class::fieldAndSetter1} = c.{self::Class::fieldAndSetter1}{core::int?};
+  c.{self::Class::fieldAndSetter2} = c.{self::Class::fieldAndSetter2}{core::int?};
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:96:5: Error: The setter 'fieldAndFinalFieldAndSetter1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'fieldAndFinalFieldAndSetter1'.
+  c.fieldAndFinalFieldAndSetter1 = c.fieldAndFinalFieldAndSetter1;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.fieldAndFinalFieldAndSetter1 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:96:38: Error: The getter 'fieldAndFinalFieldAndSetter1' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'fieldAndFinalFieldAndSetter1'.
+  c.fieldAndFinalFieldAndSetter1 = c.fieldAndFinalFieldAndSetter1;
+                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.fieldAndFinalFieldAndSetter1;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:97:5: Error: The setter 'fieldAndFinalFieldAndSetter2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'fieldAndFinalFieldAndSetter2'.
+  c.fieldAndFinalFieldAndSetter2 = c.fieldAndFinalFieldAndSetter2;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.fieldAndFinalFieldAndSetter2 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:97:38: Error: The getter 'fieldAndFinalFieldAndSetter2' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'fieldAndFinalFieldAndSetter2'.
+  c.fieldAndFinalFieldAndSetter2 = c.fieldAndFinalFieldAndSetter2;
+                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.fieldAndFinalFieldAndSetter2;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:98:5: Error: The setter 'fieldAndFinalFieldAndSetter3' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'fieldAndFinalFieldAndSetter3'.
+  c.fieldAndFinalFieldAndSetter3 = c.fieldAndFinalFieldAndSetter3;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.fieldAndFinalFieldAndSetter3 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:98:38: Error: The getter 'fieldAndFinalFieldAndSetter3' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'fieldAndFinalFieldAndSetter3'.
+  c.fieldAndFinalFieldAndSetter3 = c.fieldAndFinalFieldAndSetter3;
+                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.fieldAndFinalFieldAndSetter3;
+  invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:99:5: Error: The setter 'fieldAndFinalFieldAndSetter4' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'fieldAndFinalFieldAndSetter4'.
+  c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.fieldAndFinalFieldAndSetter4 = invalid-expression "pkg/front_end/testcases/nnbd/instance_duplicates.dart:99:38: Error: The getter 'fieldAndFinalFieldAndSetter4' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/instance_duplicates.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'fieldAndFinalFieldAndSetter4'.
+  c.fieldAndFinalFieldAndSetter4 = c.fieldAndFinalFieldAndSetter4;
+                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.fieldAndFinalFieldAndSetter4;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.modular.expect
new file mode 100644
index 0000000..9723009
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+class Foo<T extends self::A?> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T%>
+    : super core::Object::•()
+    ;
+  method doPromotionsToNullable(covariant-by-class self::Foo::T% t) → dynamic {
+    if(t is{ForNonNullableByDefault} self::B?) {
+      self::Foo::T% bar = t{self::Foo::T% & self::B? /* '%' & '?' = '%' */};
+      if(t{self::Foo::T% & self::B? /* '%' & '?' = '%' */} is{ForNonNullableByDefault} self::C?) {
+        self::Foo::T% baz = t{self::Foo::T% & self::C? /* '%' & '?' = '%' */};
+      }
+    }
+  }
+  method doPromotionsToNonNullable(covariant-by-class self::Foo::T% t) → dynamic {
+    if(t is{ForNonNullableByDefault} self::B) {
+      self::Foo::T% bar = t{self::Foo::T% & self::B /* '%' & '!' = '!' */};
+      if(t{self::Foo::T% & self::B /* '%' & '!' = '!' */} is{ForNonNullableByDefault} self::C) {
+        self::Foo::T baz = t{self::Foo::T & self::C /* '!' & '!' = '!' */};
+      }
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.modular.expect
new file mode 100644
index 0000000..c80806c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: Type 'Unresolved' not found.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:17:16: Error: Class 'D' inherits multiple members named 'method2' with incompatible signatures.
+// Try adding a declaration of 'method2' to 'D'.
+// abstract class D implements A, B {}
+//                ^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:7:8: Context: This is one of the overridden members.
+//   void method2(int a, int b) {}
+//        ^^^^^^^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:12:8: Context: This is one of the overridden members.
+//   void method2(int a) {}
+//        ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: 'Unresolved' isn't a type.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1(self::C c) → void {}
+  method method2(core::int a, core::int b) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1(invalid-type c) → void {}
+  method method2(core::int a) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+abstract class D extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  abstract member-signature method method1(invalid-type c) → void; -> self::A::method1
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue34803.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.modular.expect
new file mode 100644
index 0000000..fc4163c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue34803.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue34803.dart:7:9: Error: Type variables can't have generic function types in their bounds.
+// class A<X extends G<num>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant X extends core::Object? = dynamic> = <Y extends X% = dynamic>() → void;
+class A<X extends <Y extends core::num = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.modular.expect
new file mode 100644
index 0000000..910ce4f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
+//   throw bar();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
+  throw bar();
+        ^";
+}
+static method bar() → core::String?
+  return "asdf";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.modular.expect
new file mode 100644
index 0000000..5ffa759
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+static method foo(Null x) → dynamic {
+  self::bar(let final Never #t1 = x! in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+}
+static method bar(core::int y) → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40093.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue40093.dart.weak.modular.expect
new file mode 100644
index 0000000..f083d82
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40093.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40093.dart:6:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int i = 0; i < 10; ++i) {
+//        ^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40093.dart:9:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int i in <int>[]) {
+//        ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method error() → dynamic {
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    core::print(i);
+  }
+  for (core::int i in <core::int>[]) {
+    core::print(i);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40134.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.modular.expect
new file mode 100644
index 0000000..4f69681
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40134.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class GenericMethodBounds<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericMethodBounds<self::GenericMethodBounds::T%>
+    : super core::Object::•()
+    ;
+  get t() → core::Type
+    return self::GenericMethodBounds::T%;
+  method foo<covariant-by-class E extends self::GenericMethodBounds::T%>() → self::GenericMethodBounds<self::GenericMethodBounds::foo::E%>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::foo::E%>();
+  method bar<E extends (self::GenericMethodBounds::T%) → void>() → self::GenericMethodBounds<self::GenericMethodBounds::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBounds::bar::E>();
+}
+class GenericMethodBoundsDerived extends self::GenericMethodBounds<core::num> {
+  synthetic constructor •() → self::GenericMethodBoundsDerived
+    : super self::GenericMethodBounds::•()
+    ;
+  method foo<covariant-by-class E extends core::num>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::foo::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::foo::E>();
+  method bar<E extends (core::num) → void>() → self::GenericMethodBounds<self::GenericMethodBoundsDerived::bar::E>
+    return new self::GenericMethodBounds::•<self::GenericMethodBoundsDerived::bar::E>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.modular.expect
new file mode 100644
index 0000000..90f9674
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class B<Y extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::Y%>
+    : super core::Object::•()
+    ;
+  method bar(covariant-by-class FutureOr<self::B::Y%>y) → dynamic {}
+}
+class A<X extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class final field self::B<self::A::X%> b = new self::B::•<self::A::X%>();
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  method foo([covariant-by-class FutureOr<self::A::X%>? x = #C1]) → dynamic {
+    if(x is{ForNonNullableByDefault} asy::Future<self::A::X%>) {
+      this.{self::A::b}{self::B<self::A::X%>}.{self::B::bar}(x{asy::Future<self::A::X%>} as{ForNonNullableByDefault} FutureOr<self::A::X%>){(FutureOr<self::A::X%>) → dynamic};
+    }
+  }
+}
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
+    : super core::Object::•()
+    ;
+  method baz<covariant-by-class X extends FutureOr<self::C::T%>>(covariant-by-class FutureOr<self::C::T%>x) → FutureOr<self::C::T%>
+    return x;
+}
+class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
+  synthetic constructor •() → self::D<self::D::T%>
+    : super self::C::•()
+    ;
+  method baz<covariant-by-class X extends FutureOr<self::D::T%>>(covariant-by-class FutureOr<self::D::T%>x) → FutureOr<self::D::T%>
+    return x;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.modular.expect
new file mode 100644
index 0000000..8fd86fa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(covariant-by-class self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    late self::A::T% value;
+    () → dynamic result = () → dynamic => this.{self::A::bar}(value){(self::A::T%) → dynamic};
+    (() → Null {
+      value = this.{self::A::baz}(){() → self::A::T%};
+    })(){() → Null};
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40805.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue40805.dart.weak.modular.expect
new file mode 100644
index 0000000..0eacd23
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40805.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  late covariant-by-declaration final [setter] field core::int x;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  set x(covariant-by-declaration core::num value) → void {
+    super.{self::C::x} = value.{core::num::toInt}(){() → core::int};
+  }
+}
+static method main() → dynamic {
+  new self::D::•().{self::D::x} = 3.14;
+}
diff --git a/pkg/front_end/testcases/nnbd/issue40945.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue40945.dart.weak.modular.expect
new file mode 100644
index 0000000..f441fd5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40945.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40945.dart:7:15: Error: The type 'dynamic' of the getter 'C.test' is not a subtype of the type 'int' of the setter 'C.test'.
+//   dynamic get test => 3.14;
+//               ^^^^
+// pkg/front_end/testcases/nnbd/issue40945.dart:6:12: Context: This is the declaration of the setter 'C.test'.
+//   void set test(int v) {}
+//            ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  set test(core::int v) → void {}
+  get test() → dynamic
+    return 3.14;
+}
+static method test() → dynamic {
+  self::C c = new self::C::•();
+  c.{self::C::test} = 1;
+  c.{self::C::test}{dynamic};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40951.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue40951.dart.weak.modular.expect
new file mode 100644
index 0000000..42868d7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40951.dart.weak.modular.expect
@@ -0,0 +1,206 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:9:3: Error: This constructor should initialize field 'field1' because its type 'num' doesn't allow null.
+//   A() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:6:7: Context: 'field1' is defined here.
+//   num field1;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:9:3: Error: This constructor should initialize field 'field2' because its type 'num' doesn't allow null.
+//   A() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:7:7: Context: 'field2' is defined here.
+//   num field2;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:10:3: Error: This constructor should initialize field 'field1' because its type 'num' doesn't allow null.
+//   A.foo() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:6:7: Context: 'field1' is defined here.
+//   num field1;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:10:3: Error: This constructor should initialize field 'field2' because its type 'num' doesn't allow null.
+//   A.foo() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:7:7: Context: 'field2' is defined here.
+//   num field2;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:11:3: Error: This constructor should initialize field 'field2' because its type 'num' doesn't allow null.
+//   A.bar(this.field1) {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:7:7: Context: 'field2' is defined here.
+//   num field2;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:19:3: Error: This constructor should initialize field 'field1' because its type 'num' doesn't allow null.
+//   B() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:16:7: Context: 'field1' is defined here.
+//   num field1;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:19:3: Error: This constructor should initialize field 'field2' because its type 'num' doesn't allow null.
+//   B() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:17:7: Context: 'field2' is defined here.
+//   num field2;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:20:3: Error: This constructor should initialize field 'field1' because its type 'num' doesn't allow null.
+//   B.foo() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:16:7: Context: 'field1' is defined here.
+//   num field1;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:20:3: Error: This constructor should initialize field 'field2' because its type 'num' doesn't allow null.
+//   B.foo() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:17:7: Context: 'field2' is defined here.
+//   num field2;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:21:3: Error: This constructor should initialize field 'field2' because its type 'num' doesn't allow null.
+//   B.bar(this.field1) {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:17:7: Context: 'field2' is defined here.
+//   num field2;
+//       ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:29:3: Error: Final field 'field1' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   C() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:26:14: Context: 'field1' is defined here.
+//   final num? field1;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:29:3: Error: Final field 'field2' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   C() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:27:14: Context: 'field2' is defined here.
+//   final num? field2;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:30:3: Error: Final field 'field1' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   C.foo() {}
+//   ^^^
+// pkg/front_end/testcases/nnbd/issue40951.dart:26:14: Context: 'field1' is defined here.
+//   final num? field1;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:30:3: Error: Final field 'field2' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   C.foo() {}
+//   ^^^
+// pkg/front_end/testcases/nnbd/issue40951.dart:27:14: Context: 'field2' is defined here.
+//   final num? field2;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:31:3: Error: Final field 'field2' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   C.bar(this.field1) {}
+//   ^^^
+// pkg/front_end/testcases/nnbd/issue40951.dart:27:14: Context: 'field2' is defined here.
+//   final num? field2;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:39:3: Error: Final field 'field1' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   D() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:36:14: Context: 'field1' is defined here.
+//   final num? field1;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:39:3: Error: Final field 'field2' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   D() {}
+//   ^
+// pkg/front_end/testcases/nnbd/issue40951.dart:37:14: Context: 'field2' is defined here.
+//   final num? field2;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:40:3: Error: Final field 'field1' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   D.foo() {}
+//   ^^^
+// pkg/front_end/testcases/nnbd/issue40951.dart:36:14: Context: 'field1' is defined here.
+//   final num? field1;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:40:3: Error: Final field 'field2' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   D.foo() {}
+//   ^^^
+// pkg/front_end/testcases/nnbd/issue40951.dart:37:14: Context: 'field2' is defined here.
+//   final num? field2;
+//              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue40951.dart:41:3: Error: Final field 'field2' is not initialized by this constructor.
+// Try to initialize the field using an initializing formal or a field initializer.
+//   D.bar(this.field1) {}
+//   ^^^
+// pkg/front_end/testcases/nnbd/issue40951.dart:37:14: Context: 'field2' is defined here.
+//   final num? field2;
+//              ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num field1;
+  field core::num field2;
+  constructor •() → self::A
+    : self::A::field2 = null, self::A::field1 = null, super core::Object::•() {}
+  constructor foo() → self::A
+    : self::A::field2 = null, self::A::field1 = null, super core::Object::•() {}
+  constructor bar(core::num field1) → self::A
+    : self::A::field2 = null, self::A::field1 = field1, super core::Object::•() {}
+  constructor baz(core::num field1, core::num field2) → self::A
+    : self::A::field1 = field1, self::A::field2 = field2, super core::Object::•() {}
+}
+abstract class B extends core::Object {
+  field core::num field1;
+  field core::num field2;
+  constructor •() → self::B
+    : self::B::field2 = null, self::B::field1 = null, super core::Object::•() {}
+  constructor foo() → self::B
+    : self::B::field2 = null, self::B::field1 = null, super core::Object::•() {}
+  constructor bar(core::num field1) → self::B
+    : self::B::field2 = null, self::B::field1 = field1, super core::Object::•() {}
+  constructor baz(core::num field1, core::num field2) → self::B
+    : self::B::field1 = field1, self::B::field2 = field2, super core::Object::•() {}
+}
+class C extends core::Object {
+  final field core::num? field1;
+  final field core::num? field2;
+  constructor •() → self::C
+    : self::C::field2 = null, self::C::field1 = null, super core::Object::•() {}
+  constructor foo() → self::C
+    : self::C::field2 = null, self::C::field1 = null, super core::Object::•() {}
+  constructor bar(core::num? field1) → self::C
+    : self::C::field2 = null, self::C::field1 = field1, super core::Object::•() {}
+  constructor baz(core::num? field1, core::num? field2) → self::C
+    : self::C::field1 = field1, self::C::field2 = field2, super core::Object::•() {}
+}
+abstract class D extends core::Object {
+  final field core::num? field1;
+  final field core::num? field2;
+  constructor •() → self::D
+    : self::D::field2 = null, self::D::field1 = null, super core::Object::•() {}
+  constructor foo() → self::D
+    : self::D::field2 = null, self::D::field1 = null, super core::Object::•() {}
+  constructor bar(core::num? field1) → self::D
+    : self::D::field2 = null, self::D::field1 = field1, super core::Object::•() {}
+  constructor baz(core::num? field1, core::num? field2) → self::D
+    : self::D::field1 = field1, self::D::field2 = field2, super core::Object::•() {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.modular.expect
new file mode 100644
index 0000000..cbfe037
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.modular.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: The parameter 'a' can't have a value of 'null' because of its type 'A', but the implicit default value is 'null'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   static void test1(var v, [A a]) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: The parameter 'a' can't have a value of 'null' because of its type 'A', but the implicit default value is 'null'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   static void test2(var v, {A a}) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: The parameter 'a' can't have a value of 'null' because of its type 'A', but the implicit default value is 'null'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   void test11(var v, [A a]) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: The parameter 'a' can't have a value of 'null' because of its type 'A', but the implicit default value is 'null'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   void test22(var v, {A a}) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: The parameter 'a' can't have a value of 'null' because of its type 'A', but the implicit default value is 'null'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void test1(var v, [A a]) {}
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: The parameter 'a' can't have a value of 'null' because of its type 'A', but the implicit default value is 'null'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void test2(var v, {A a}) {}
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method test1(dynamic v, [self::A a = #C1]) → void {}
+  static method test2(dynamic v, {self::A a = #C1}) → void {}
+  method test11(dynamic v, [self::A a = #C1]) → void {}
+  method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.modular.expect
new file mode 100644
index 0000000..e9cdc2d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.modular.expect
@@ -0,0 +1,130 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+//  - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:17:36: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+// final s3 = new List<int>.filled(2, null);
+//                                    ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+//     case 0:
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+//     case '':
+//          ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+//   switch (e) {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s11 = s7.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+//                   ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data){(core::Object?) → void}), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}(){() → void}));
+static final field core::List<dynamic> s1 = <dynamic>[];
+static final field core::int? s2 = let final core::List<dynamic> #t1 = self::s1 in #t1 == null ?{core::int?} null : #t1.{core::List::length}{core::int};
+static final field core::List<core::int> s3 = core::List::filled<core::int>(2, invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:17:36: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+final s3 = new List<int>.filled(2, null);
+                                   ^" in null as{TypeError,ForNonNullableByDefault} core::int);
+static final field dynamic s4 = (() → Null {
+  core::int e = 0;
+  switch(e) {
+    #L1:
+    case #C1:
+      {
+        core::print("fallthrough");
+      }
+    #L2:
+    case #C2:
+    case #C3:
+      {}
+  }
+})(){() → Null};
+static field core::int? s5;
+static final field core::num s6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+              ^" in self::s5.{core::num::+}(0){(core::num) → core::num};
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+             ^" in self::s7.{core::List::[]}{<nullable>}.(0){(core::int) → dynamic};
+static final field core::int s9 = let final core::List<dynamic>? #t2 = self::s7 in let final core::int #t3 = 0 in let final core::int #t4 = 0 in let final void #t5 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+             ^" in #t2.{core::List::[]=}{<nullable>}.(#t3, #t4){(core::int, dynamic) → void} in #t4;
+static final field core::int s10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+               ^^^^^^" in self::s7.{core::List::length}{<nullable>}.{core::int};
+static final field core::int s11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s11 = s7.length = 0;
+               ^^^^^^" in self::s7.{core::List::length}{<nullable>}. = 0;
+static final field core::int s12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+            ^" in self::s5.{core::int::unary-}(){() → core::int};
+static field () →? core::int s13;
+static final field core::int s14 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+                 ^" in self::s13{<nullable>}.(){() →? core::int};
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+                  ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+  #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.modular.expect
new file mode 100644
index 0000000..d5d245a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<core::Object?, core::Object?> t = new asy::_StreamHandlerTransformer::•<core::Object?, core::Object?>(handleData: (core::Object? data, asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data){(core::Object?) → void}), handleDone: (asy::EventSink<core::Object?> sink) → void => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}(){() → void}));
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.modular.expect
new file mode 100644
index 0000000..3874c5a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
+//  - 'List' is from 'dart:core'.
+//   List y = await l(); // should be a List?
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method test() → dynamic async {
+  core::List<dynamic> y = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>' because 'List<dynamic>?' is nullable and 'List<dynamic>' isn't.
+ - 'List' is from 'dart:core'.
+  List y = await l(); // should be a List?
+           ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
+}
+static method l() → asy::Future<core::List<dynamic>>?
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41114.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41114.dart.weak.modular.expect
new file mode 100644
index 0000000..467d91a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41114.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic async {
+  core::List<core::String>? a = <core::String>[] as{ForNonNullableByDefault} core::List<core::String>?;
+  core::Iterable<core::String>? b = let final core::List<core::String>? #t1 = a in #t1 == null ?{core::Iterable<core::String>?} null : #t1{core::List<core::String>}.{core::Iterable::map}<core::String>((core::String e) → core::String => e){((core::String) → core::String) → core::Iterable<core::String>};
+  core::Iterable<core::String>? i = let final core::Iterable<core::String>? #t2 = b in #t2 == null ?{core::Iterable<core::String>?} a : #t2{core::Iterable<core::String>};
+  core::print(i);
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.modular.expect
new file mode 100644
index 0000000..9940f1b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.modular.expect
@@ -0,0 +1,155 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41156.dart:39:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String Function(int) x2 = (int v) /* error */ {
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String Function(int) x3 = (int v) /* error */ {
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/issue41156.dart:49:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String Function(int) x5 = (int v) /* error */ {
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String Function(int) x6 = (int v) /* error */ {
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/issue41156.dart:59:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   Future<String> Function(int) y2 = (int v) async /* error */ {
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   Future<String> Function(int) y3 = (int v) async /* error */ {
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue41156.dart:69:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   Future<String> Function(int) y5 = (int v) async /* error */ {
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   Future<String> Function(int) y6 = (int v) async /* error */ {
+//                                     ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+static method throwing() → Never
+  return throw "";
+static method main() → void {
+  (core::int) → core::String x1 = (core::int v) → Never => throw v;
+  (core::int) → core::String x2 = (core::int v) → Never {
+    throw v;
+  };
+  (core::int) → core::String x3 = (core::int v) → Never {
+    return throw v;
+  };
+  (core::int) → core::String x4 = (core::int v) → Never => let final Never #t1 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  (core::int) → core::String x5 = (core::int v) → Never {
+    let final Never #t2 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  };
+  (core::int) → core::String x6 = (core::int v) → Never {
+    return let final Never #t3 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  };
+  (core::int) → asy::Future<core::String> y1 = (core::int v) → asy::Future<Never> async => throw v;
+  (core::int) → asy::Future<core::String> y2 = (core::int v) → asy::Future<Never> async {
+    throw v;
+  };
+  (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> async {
+    return throw v;
+  };
+  (core::int) → asy::Future<core::String> y4 = (core::int v) → asy::Future<Never> async => let final Never #t4 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  (core::int) → asy::Future<core::String> y5 = (core::int v) → asy::Future<Never> async {
+    let final Never #t5 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  };
+  (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> async {
+    return let final Never #t6 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  };
+}
+static method errors() → void async {
+  (core::int) → core::String x2 = (core::int v) → core::String {
+    try {
+      throw v;
+    }
+    on core::Object catch(final core::Object _) {
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:39:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String Function(int) x2 = (int v) /* error */ {
+                            ^" in null;
+  };
+  (core::int) → core::String x3 = (core::int v) → core::String {
+    try {
+      return throw v;
+    }
+    on core::Object catch(final core::Object _) {
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String Function(int) x3 = (int v) /* error */ {
+                            ^" in null;
+  };
+  (core::int) → core::String x5 = (core::int v) → core::String {
+    try {
+      let final Never #t7 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    }
+    on core::Object catch(final core::Object _) {
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:49:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String Function(int) x5 = (int v) /* error */ {
+                            ^" in null;
+  };
+  (core::int) → core::String x6 = (core::int v) → core::String {
+    try {
+      return let final Never #t8 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    }
+    on core::Object catch(final core::Object _) {
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String Function(int) x6 = (int v) /* error */ {
+                            ^" in null;
+  };
+  (core::int) → asy::Future<core::String> y2 = (core::int v) → asy::Future<core::String> async {
+    try {
+      throw v;
+    }
+    on core::Object catch(final core::Object _) {
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:59:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  Future<String> Function(int) y2 = (int v) async /* error */ {
+                                    ^" in null;
+  };
+  (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> async {
+    try {
+      return throw v;
+    }
+    on core::Object catch(final core::Object _) {
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  Future<String> Function(int) y3 = (int v) async /* error */ {
+                                    ^" in null;
+  };
+  (core::int) → asy::Future<core::String> y5 = (core::int v) → asy::Future<core::String> async {
+    try {
+      let final Never #t9 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    }
+    on core::Object catch(final core::Object _) {
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:69:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  Future<String> Function(int) y5 = (int v) async /* error */ {
+                                    ^" in null;
+  };
+  (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> async {
+    try {
+      return let final Never #t10 = self::throwing() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    }
+    on core::Object catch(final core::Object _) {
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  Future<String> Function(int) y6 = (int v) async /* error */ {
+                                    ^" in null;
+  };
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41273.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.modular.expect
new file mode 100644
index 0000000..0bdfe20
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41273.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+static method test(dynamic x) → void {
+  if(x is{ForNonNullableByDefault} Never) {
+    Never n1 = let final Never #t1 = (let final Never #t2 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never n2 = let final Never #t3 = (let final Never #t4 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.runtimeType in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never n3 = let final Never #t5 = (let final Never #t6 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.someGetter in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never n4 = let final Never #t7 = (let final Never #t8 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.someMethod() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never n5 = let final Never #t9 = (let final Never #t10 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.+(let final Never #t11 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never n6 = let final Never #t12 = (let final Never #t13 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[](let final Never #t14 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never n7 = let final Never #t15 = (let final Never #t16 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never n8 = let final Never #t17 = (let final Never #t18 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.runtimeType() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never n9 = let final Never #t19 = (let final Never #t20 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    (let final Never #t21 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.runtimeType = #C1;
+    (let final Never #t22 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString = () → core::String => "";
+    Never v1 = let final Never #t23 = (let final Never #t24 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never v2 = let final Never #t25 = (let final Never #t26 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.runtimeType in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never v3 = let final Never #t27 = (let final Never #t28 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.someGetter in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never v4 = let final Never #t29 = (let final Never #t30 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.someMethod() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never v5 = let final Never #t31 = (let final Never #t32 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.+(let final Never #t33 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never v6 = let final Never #t34 = (let final Never #t35 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[](let final Never #t36 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never v7 = let final Never #t37 = (let final Never #t38 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never v8 = let final Never #t39 = (let final Never #t40 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.runtimeType() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    Never v9 = let final Never #t41 = (let final Never #t42 = x{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  }
+}
+static method main() → dynamic {
+  self::test(null);
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Object*)
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41349.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41349.dart.weak.modular.expect
new file mode 100644
index 0000000..16cf6c9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41349.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return 23;
+}
+extension B on self::A? {
+  method foo = self::B|foo;
+  tearoff foo = self::B|get#foo;
+  method bar = self::B|bar;
+  tearoff bar = self::B|get#bar;
+}
+extension C on self::A {
+  method bar = self::C|bar;
+  tearoff bar = self::C|get#bar;
+}
+extension D on () →? core::int {
+  method call = self::D|call;
+  tearoff call = self::D|get#call;
+}
+static method B|foo(lowered final self::A? #this) → dynamic
+  return 42;
+static method B|get#foo(lowered final self::A? #this) → () → dynamic
+  return () → dynamic => self::B|foo(#this);
+static method B|bar(lowered final self::A? #this) → dynamic
+  return 87;
+static method B|get#bar(lowered final self::A? #this) → () → dynamic
+  return () → dynamic => self::B|bar(#this);
+static method C|bar(lowered final self::A #this) → dynamic
+  return 123;
+static method C|get#bar(lowered final self::A #this) → () → dynamic
+  return () → dynamic => self::C|bar(#this);
+static method D|call(lowered final () →? core::int #this) → core::int
+  return 76;
+static method D|get#call(lowered final () →? core::int #this) → () → core::int
+  return () → core::int => self::D|call(#this);
+static method main() → dynamic {
+  self::testA(new self::A::•());
+  self::testFunction(() → core::int => 53);
+}
+static method testA(self::A? a) → dynamic {
+  self::expect(23, let final self::A? #t1 = a in #t1 == null ?{dynamic} null : #t1{self::A}.{self::A::foo}(){() → dynamic});
+  self::expect(42, self::B|foo(a));
+  self::expect(123, let final self::A? #t2 = a in #t2 == null ?{dynamic} null : self::C|bar(#t2{self::A}));
+  self::expect(87, self::B|bar(a));
+}
+static method testFunction(() →? core::int f) → dynamic {
+  self::expect(53, let final () →? core::int #t3 = f in #t3 == null ?{core::int?} null : #t3{() → core::int}(){() → core::int});
+  self::expect(76, self::D|call(f));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41386.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41386.dart.weak.modular.expect
new file mode 100644
index 0000000..fbc0fe4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41386.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41386.dart:8:28: Error: The operator '%' isn't defined for the class 'Object?'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
+//   print(predicate((v) => v % 2 == 1)(3));
+//                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method predicate<T extends core::Object? = dynamic>((self::predicate::T%) → core::bool fn) → (self::predicate::T%) → core::bool
+  return (self::predicate::T% val) → core::bool => fn(val){(self::predicate::T%) → core::bool};
+static method test() → void {
+  core::print(self::predicate<core::Object?>((core::Object? v) → core::bool => invalid-expression "pkg/front_end/testcases/nnbd/issue41386.dart:8:28: Error: The operator '%' isn't defined for the class 'Object?'.
+ - 'Object' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
+  print(predicate((v) => v % 2 == 1)(3));
+                           ^" in v{<unresolved>}.%(2) =={core::Object::==}{(core::Object) → core::bool} 1)(3){(core::Object?) → core::bool});
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.modular.expect
new file mode 100644
index 0000000..7223846
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41386b.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::Map<dynamic, dynamic> map = <dynamic, dynamic>{};
+  map.{core::Map::[]}(0){(core::Object?) → dynamic}{dynamic}.foo;
+  core::Iterable<core::String> elements = <core::String>[];
+  core::List<dynamic> list = core::List::from<dynamic>(elements);
+  core::List::from<dynamic>(elements).{core::Iterable::forEach}((dynamic element) → void => element{dynamic}.foo){((dynamic) → void) → void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.modular.expect
new file mode 100644
index 0000000..818e367a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {}
+static method test<X extends Null, Y extends Never?, Z extends Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
+  (Never) → core::int g = (core::Object? x) → core::int => 1;
+  (Never?) → core::int h = (core::Object? x) → core::int => 1;
+  (core::String) → core::int i = (core::String x) → core::int => 1;
+  (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+  (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+  (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+  (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41437a.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41437a.dart.weak.modular.expect
new file mode 100644
index 0000000..6b82704
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41437a.dart.weak.modular.expect
@@ -0,0 +1,94 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41437a.dart:18:25: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
+//  - 'Future' is from 'dart:async'.
+// Future<bool> test5() => getFutureNull(); // error
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue41437a.dart:27:27: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
+//  - 'Future' is from 'dart:async'.
+//   Future<bool> test5() => getFutureNull(); // error
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/issue41437a.dart:31:52: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
+//  - 'Future' is from 'dart:async'.
+//   Future<bool> var1 = (() async => await getNull())(); // error
+//                                                    ^
+//
+// pkg/front_end/testcases/nnbd/issue41437a.dart:34:58: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
+//  - 'Future' is from 'dart:async'.
+//   Future<bool> var4 = (() async => await getFutureNull())(); // error
+//                                                          ^
+//
+// pkg/front_end/testcases/nnbd/issue41437a.dart:35:46: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
+//  - 'Future' is from 'dart:async'.
+//   Future<bool> var5 = (() => getFutureNull())(); // error
+//                                              ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method getNull() → dynamic
+  return null;
+static method getFutureNull() → asy::Future<dynamic> async {
+  return null;
+}
+static method getFutureBool() → asy::Future<core::bool> async {
+  return true;
+}
+static method test1() → asy::Future<core::bool> async 
+  return await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
+static method test2() → asy::Future<core::bool>
+  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
+static method test3() → core::bool
+  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+static method test4() → asy::Future<core::bool> async 
+  return await self::getFutureNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
+static method test5() → asy::Future<core::bool>
+  return invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:18:25: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
+ - 'Future' is from 'dart:async'.
+Future<bool> test5() => getFutureNull(); // error
+                        ^" in self::getFutureNull() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
+static method test6() → asy::Future<core::bool>
+  return self::getFutureBool();
+static method test7() → asy::Future<core::bool> async 
+  return self::getFutureBool();
+static method test() → dynamic async {
+  function test1() → asy::Future<core::bool> async 
+    return await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
+  function test2() → asy::Future<core::bool>
+    return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
+  function test3() → core::bool
+    return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  function test4() → asy::Future<core::bool> async 
+    return await self::getFutureNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::bool>;
+  function test5() → asy::Future<core::bool>
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:27:27: Error: A value of type 'Future<dynamic>' can't be returned from a function with return type 'Future<bool>'.
+ - 'Future' is from 'dart:async'.
+  Future<bool> test5() => getFutureNull(); // error
+                          ^" in self::getFutureNull() as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
+  function test6() → asy::Future<core::bool>
+    return self::getFutureBool();
+  function test7() → asy::Future<core::bool> async 
+    return self::getFutureBool();
+  asy::Future<core::bool> var1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:31:52: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
+ - 'Future' is from 'dart:async'.
+  Future<bool> var1 = (() async => await getNull())(); // error
+                                                   ^" in (() → asy::Future<dynamic> async => await self::getNull())(){() → asy::Future<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
+  asy::Future<core::bool> var2 = (() → dynamic => self::getNull())(){() → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<core::bool>;
+  core::bool var3 = (() → dynamic => self::getNull())(){() → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  asy::Future<core::bool> var4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:34:58: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
+ - 'Future' is from 'dart:async'.
+  Future<bool> var4 = (() async => await getFutureNull())(); // error
+                                                         ^" in (() → asy::Future<dynamic> async => await self::getFutureNull())(){() → asy::Future<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
+  asy::Future<core::bool> var5 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437a.dart:35:46: Error: A value of type 'Future<dynamic>' can't be assigned to a variable of type 'Future<bool>'.
+ - 'Future' is from 'dart:async'.
+  Future<bool> var5 = (() => getFutureNull())(); // error
+                                             ^" in (() → asy::Future<dynamic> => self::getFutureNull())(){() → asy::Future<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Future<core::bool>;
+  asy::Future<core::bool> var6 = (() → asy::Future<core::bool> => self::getFutureBool())(){() → asy::Future<core::bool>};
+  asy::Future<core::bool> var7 = (() → asy::Future<core::bool> async => self::getFutureBool())(){() → asy::Future<core::bool>};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41437b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41437b.dart.weak.modular.expect
new file mode 100644
index 0000000..89bdcad
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41437b.dart.weak.modular.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41437b.dart:21:10: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+//  - 'Iterable' is from 'dart:core'.
+//   yield* getIterableNull(); // error
+//          ^
+//
+// pkg/front_end/testcases/nnbd/issue41437b.dart:24:27: Error: A value of type 'Iterable<dynamic>' can't be returned from a function with return type 'Iterable<bool>'.
+//  - 'Iterable' is from 'dart:core'.
+// Iterable<bool> test5() => getIterableNull(); // error
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/issue41437b.dart:38:12: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+//  - 'Iterable' is from 'dart:core'.
+//     yield* getIterableNull(); // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/issue41437b.dart:41:29: Error: A value of type 'Iterable<dynamic>' can't be returned from a function with return type 'Iterable<bool>'.
+//  - 'Iterable' is from 'dart:core'.
+//   Iterable<bool> test5() => getIterableNull(); // error
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/issue41437b.dart:49:5: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+//  - 'Iterable' is from 'dart:core'.
+//   })(); // error
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41437b.dart:54:5: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+//  - 'Iterable' is from 'dart:core'.
+//   })(); // error
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41437b.dart:55:50: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+//  - 'Iterable' is from 'dart:core'.
+//   Iterable<bool> var5 = (() => getIterableNull())(); // error
+//                                                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method getNull() → dynamic
+  return null;
+static method getIterableNull() → core::Iterable<dynamic> sync* {
+  yield null;
+}
+static method getIterableBool() → core::Iterable<core::bool> sync* {
+  yield true;
+}
+static method test1() → core::Iterable<core::bool> sync* {
+  yield self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+}
+static method test2() → core::Iterable<core::bool>
+  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<core::bool>;
+static method test3() → core::bool
+  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+static method test4() → core::Iterable<core::bool> sync* {
+  yield* invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:21:10: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+ - 'Iterable' is from 'dart:core'.
+  yield* getIterableNull(); // error
+         ^" in self::getIterableNull() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
+}
+static method test5() → core::Iterable<core::bool>
+  return invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:24:27: Error: A value of type 'Iterable<dynamic>' can't be returned from a function with return type 'Iterable<bool>'.
+ - 'Iterable' is from 'dart:core'.
+Iterable<bool> test5() => getIterableNull(); // error
+                          ^" in self::getIterableNull() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
+static method test6() → core::Iterable<core::bool>
+  return self::getIterableBool();
+static method test7() → core::Iterable<core::bool> sync* {
+  yield* self::getIterableBool();
+}
+static method test() → dynamic async {
+  function test1() → core::Iterable<core::bool> sync* {
+    yield self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  }
+  function test2() → core::Iterable<core::bool>
+    return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<core::bool>;
+  function test3() → core::bool
+    return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  function test4() → core::Iterable<core::bool> sync* {
+    yield* invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:38:12: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+ - 'Iterable' is from 'dart:core'.
+    yield* getIterableNull(); // error
+           ^" in self::getIterableNull() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
+  }
+  function test5() → core::Iterable<core::bool>
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:41:29: Error: A value of type 'Iterable<dynamic>' can't be returned from a function with return type 'Iterable<bool>'.
+ - 'Iterable' is from 'dart:core'.
+  Iterable<bool> test5() => getIterableNull(); // error
+                            ^" in self::getIterableNull() as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
+  function test6() → core::Iterable<core::bool>
+    return self::getIterableBool();
+  function test7() → core::Iterable<core::bool> sync* {
+    yield* self::getIterableBool();
+  }
+  core::Iterable<core::bool> var1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:49:5: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+ - 'Iterable' is from 'dart:core'.
+  })(); // error
+    ^" in (() → core::Iterable<dynamic> sync* {
+    yield self::getNull();
+  })(){() → core::Iterable<dynamic>} as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
+  core::Iterable<core::bool> var2 = (() → dynamic => self::getNull())(){() → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<core::bool>;
+  core::bool var3 = (() → dynamic => self::getNull())(){() → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  core::Iterable<core::bool> var4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:54:5: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+ - 'Iterable' is from 'dart:core'.
+  })(); // error
+    ^" in (() → core::Iterable<dynamic> sync* {
+    yield* self::getIterableNull();
+  })(){() → core::Iterable<dynamic>} as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
+  core::Iterable<core::bool> var5 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437b.dart:55:50: Error: A value of type 'Iterable<dynamic>' can't be assigned to a variable of type 'Iterable<bool>'.
+ - 'Iterable' is from 'dart:core'.
+  Iterable<bool> var5 = (() => getIterableNull())(); // error
+                                                 ^" in (() → core::Iterable<dynamic> => self::getIterableNull())(){() → core::Iterable<dynamic>} as{TypeError,ForNonNullableByDefault} core::Iterable<core::bool>;
+  core::Iterable<core::bool> var6 = (() → core::Iterable<core::bool> => self::getIterableBool())(){() → core::Iterable<core::bool>};
+  core::Iterable<core::bool> var7 = (() → core::Iterable<core::bool> sync* {
+    yield* self::getIterableBool();
+  })(){() → core::Iterable<core::bool>};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41437c.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41437c.dart.weak.modular.expect
new file mode 100644
index 0000000..54bbc93
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41437c.dart.weak.modular.expect
@@ -0,0 +1,122 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41437c.dart:21:10: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+//  - 'Stream' is from 'dart:async'.
+//   yield* getStreamNull(); // error
+//          ^
+//
+// pkg/front_end/testcases/nnbd/issue41437c.dart:24:25: Error: A value of type 'Stream<dynamic>' can't be returned from a function with return type 'Stream<bool>'.
+//  - 'Stream' is from 'dart:async'.
+// Stream<bool> test5() => getStreamNull(); // error
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/issue41437c.dart:38:12: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+//  - 'Stream' is from 'dart:async'.
+//     yield* getStreamNull(); // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/issue41437c.dart:41:27: Error: A value of type 'Stream<dynamic>' can't be returned from a function with return type 'Stream<bool>'.
+//  - 'Stream' is from 'dart:async'.
+//   Stream<bool> test5() => getStreamNull(); // error
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/issue41437c.dart:49:5: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+//  - 'Stream' is from 'dart:async'.
+//   })(); // error
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41437c.dart:54:5: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+//  - 'Stream' is from 'dart:async'.
+//   })(); // error
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41437c.dart:55:46: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+//  - 'Stream' is from 'dart:async'.
+//   Stream<bool> var5 = (() => getStreamNull())(); // error
+//                                              ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method getNull() → dynamic
+  return null;
+static method getStreamNull() → asy::Stream<dynamic> async* {
+  yield null;
+}
+static method getStreamBool() → asy::Stream<core::bool> async* {
+  yield true;
+}
+static method test1() → asy::Stream<core::bool> async* {
+  yield self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+}
+static method test2() → asy::Stream<core::bool>
+  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<core::bool>;
+static method test3() → core::bool
+  return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+static method test4() → asy::Stream<core::bool> async* {
+  yield* invalid-expression "pkg/front_end/testcases/nnbd/issue41437c.dart:21:10: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+ - 'Stream' is from 'dart:async'.
+  yield* getStreamNull(); // error
+         ^" in self::getStreamNull() as{TypeError,ForNonNullableByDefault} asy::Stream<core::bool>;
+}
+static method test5() → asy::Stream<core::bool>
+  return invalid-expression "pkg/front_end/testcases/nnbd/issue41437c.dart:24:25: Error: A value of type 'Stream<dynamic>' can't be returned from a function with return type 'Stream<bool>'.
+ - 'Stream' is from 'dart:async'.
+Stream<bool> test5() => getStreamNull(); // error
+                        ^" in self::getStreamNull() as{TypeError,ForNonNullableByDefault} asy::Stream<core::bool>;
+static method test6() → asy::Stream<core::bool>
+  return self::getStreamBool();
+static method test7() → asy::Stream<core::bool> async* {
+  yield* self::getStreamBool();
+}
+static method test() → dynamic async {
+  function test1() → asy::Stream<core::bool> async* {
+    yield self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  }
+  function test2() → asy::Stream<core::bool>
+    return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<core::bool>;
+  function test3() → core::bool
+    return self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  function test4() → asy::Stream<core::bool> async* {
+    yield* invalid-expression "pkg/front_end/testcases/nnbd/issue41437c.dart:38:12: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+ - 'Stream' is from 'dart:async'.
+    yield* getStreamNull(); // error
+           ^" in self::getStreamNull() as{TypeError,ForNonNullableByDefault} asy::Stream<core::bool>;
+  }
+  function test5() → asy::Stream<core::bool>
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41437c.dart:41:27: Error: A value of type 'Stream<dynamic>' can't be returned from a function with return type 'Stream<bool>'.
+ - 'Stream' is from 'dart:async'.
+  Stream<bool> test5() => getStreamNull(); // error
+                          ^" in self::getStreamNull() as{TypeError,ForNonNullableByDefault} asy::Stream<core::bool>;
+  function test6() → asy::Stream<core::bool>
+    return self::getStreamBool();
+  function test7() → asy::Stream<core::bool> async* {
+    yield* self::getStreamBool();
+  }
+  asy::Stream<core::bool> var1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437c.dart:49:5: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+ - 'Stream' is from 'dart:async'.
+  })(); // error
+    ^" in (() → asy::Stream<dynamic> async* {
+    yield self::getNull();
+  })(){() → asy::Stream<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Stream<core::bool>;
+  asy::Stream<core::bool> var2 = (() → dynamic => self::getNull())(){() → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<core::bool>;
+  core::bool var3 = (() → dynamic => self::getNull())(){() → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool;
+  asy::Stream<core::bool> var4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437c.dart:54:5: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+ - 'Stream' is from 'dart:async'.
+  })(); // error
+    ^" in (() → asy::Stream<dynamic> async* {
+    yield* self::getStreamNull();
+  })(){() → asy::Stream<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Stream<core::bool>;
+  asy::Stream<core::bool> var5 = invalid-expression "pkg/front_end/testcases/nnbd/issue41437c.dart:55:46: Error: A value of type 'Stream<dynamic>' can't be assigned to a variable of type 'Stream<bool>'.
+ - 'Stream' is from 'dart:async'.
+  Stream<bool> var5 = (() => getStreamNull())(); // error
+                                             ^" in (() → asy::Stream<dynamic> => self::getStreamNull())(){() → asy::Stream<dynamic>} as{TypeError,ForNonNullableByDefault} asy::Stream<core::bool>;
+  asy::Stream<core::bool> var6 = (() → asy::Stream<core::bool> => self::getStreamBool())(){() → asy::Stream<core::bool>};
+  asy::Stream<core::bool> var7 = (() → asy::Stream<core::bool> async* {
+    yield* self::getStreamBool();
+  })(){() → asy::Stream<core::bool>};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41495.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41495.dart.weak.modular.expect
new file mode 100644
index 0000000..f5982c7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41495.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41495.dart:14:6: Error: Property 'c1' cannot be accessed on 'A?' because it is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue41495.dart'.
+// Try accessing using ?. instead.
+//   a1.c1;
+//      ^^
+//
+// pkg/front_end/testcases/nnbd/issue41495.dart:15:6: Error: Property 'test' cannot be accessed on 'A?' because it is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue41495.dart'.
+// Try accessing using ?. instead.
+//   a1.test;
+//      ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int c1 = 1;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method test() → core::int
+    return 2;
+}
+static method main() → dynamic {}
+static method errors() → dynamic {
+  self::A? a1 = new self::A::•() as{ForNonNullableByDefault} self::A?;
+  invalid-expression "pkg/front_end/testcases/nnbd/issue41495.dart:14:6: Error: Property 'c1' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/issue41495.dart'.
+Try accessing using ?. instead.
+  a1.c1;
+     ^^" in a1.{self::A::c1}{<nullable>}.{core::int};
+  invalid-expression "pkg/front_end/testcases/nnbd/issue41495.dart:15:6: Error: Property 'test' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/issue41495.dart'.
+Try accessing using ?. instead.
+  a1.test;
+     ^^^^" in a1.{self::A::test}{<nullable>}.{() → core::int};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41520.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41520.dart.weak.modular.expect
new file mode 100644
index 0000000..c66c505
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41520.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41520.dart:7:11: Error: The method 'notAMethodOnObject' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnObject'.
+//     error.notAMethodOnObject();
+//           ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41520.dart:12:11: Error: The method 'notAMethodOnObject' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnObject'.
+//     error.notAMethodOnObject();
+//           ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41520.dart:13:16: Error: The method 'notAMethodOnStackTrace' isn't defined for the class 'StackTrace'.
+//  - 'StackTrace' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnStackTrace'.
+//     stackTrace.notAMethodOnStackTrace();
+//                ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method errors() → void {
+  try {
+  }
+  on core::Object catch(final core::Object error) {
+    invalid-expression "pkg/front_end/testcases/nnbd/issue41520.dart:7:11: Error: The method 'notAMethodOnObject' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnObject'.
+    error.notAMethodOnObject();
+          ^^^^^^^^^^^^^^^^^^" in error{<unresolved>}.notAMethodOnObject();
+    self::_takesObject(error);
+  }
+  try {
+  }
+  on core::Object catch(final core::Object error, final core::StackTrace stackTrace) {
+    invalid-expression "pkg/front_end/testcases/nnbd/issue41520.dart:12:11: Error: The method 'notAMethodOnObject' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnObject'.
+    error.notAMethodOnObject();
+          ^^^^^^^^^^^^^^^^^^" in error{<unresolved>}.notAMethodOnObject();
+    invalid-expression "pkg/front_end/testcases/nnbd/issue41520.dart:13:16: Error: The method 'notAMethodOnStackTrace' isn't defined for the class 'StackTrace'.
+ - 'StackTrace' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnStackTrace'.
+    stackTrace.notAMethodOnStackTrace();
+               ^^^^^^^^^^^^^^^^^^^^^^" in stackTrace{<unresolved>}.notAMethodOnStackTrace();
+    self::_takesObject(error);
+    self::_takesStackTrace(stackTrace);
+  }
+}
+static method _takesObject(core::Object o) → void {}
+static method _takesStackTrace(core::StackTrace o) → void {}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue41602.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41602.dart.weak.modular.expect
new file mode 100644
index 0000000..d7d296d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41602.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41602.dart:12:9: Error: This expression has type 'void' and can't be used.
+//   await returnVoid(); // error
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue41602.dart:13:9: Error: This expression has type 'void' and can't be used.
+//   await returnVoidAsync(); // error
+//         ^
+//
+import self as self;
+import "dart:async" as asy;
+
+static method returnFutureOfVoid() → asy::Future<void> async {}
+static method returnVoid() → void {}
+static method returnVoidAsync() → void async {}
+static method test() → dynamic async {
+  await self::returnVoid();
+  await self::returnVoidAsync();
+}
+static method main() → dynamic async {
+  await self::returnFutureOfVoid();
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.modular.expect
new file mode 100644
index 0000000..d4bfe7f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool isLegacySubtyping1b = #C1;
+static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool isLegacySubtyping2b = #C1;
+static const field core::List<core::int> assertLegacySubtyping1 = #C2;
+static const field core::List<core::int> assertLegacySubtyping2 = #C3;
+static method main() → void {
+  self::expect(self::isLegacySubtyping1a, #C1);
+  self::expect(self::isLegacySubtyping2a, #C1);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = true
+  #C2 = <Null>[]
+  #C3 = <core::int?>[]
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.modular.expect
new file mode 100644
index 0000000..d7f0e7d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41697.dart:33:14: Error: Operator '+' cannot be called on 'S' because it is potentially null.
+//     return s + 1; // error
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41697.dart:36:22: Error: Operator '+' cannot be called on 'num?' because it is potentially null.
+//     return (await t) + 1; // error
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/issue41697.dart:40:33: Error: Operator '+' cannot be called on 'S' because it is potentially null.
+// test3<S extends num?>(S s) => s + 1; // error
+//                                 ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
+class C<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+  covariant-by-class field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+  constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
+    : self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
+    ;
+}
+static method test1(self::C<core::num> c) → dynamic {
+  <S extends core::num>(S) → core::num f1 = c.{self::C::field1} = <S extends core::num>(S s) → core::num {
+    return s.{core::num::+}(1){(core::num) → core::num};
+  };
+  <S extends FutureOr<core::num>>(S, FutureOr<core::num>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num>>(S s, FutureOr<core::num>t) → asy::Future<core::num> async {
+    return (await t).{core::num::+}(1){(core::num) → core::num};
+  };
+}
+static method test2(self::C<core::num?> c) → dynamic {
+  <S extends core::num?>(S%) → core::num f1 = c.{self::C::field1} = <S extends core::num?>(S% s) → core::num {
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:33:14: Error: Operator '+' cannot be called on 'S' because it is potentially null.
+    return s + 1; // error
+             ^" in s.{core::num::+}(1){(core::num) → core::num};
+  };
+  <S extends FutureOr<core::num?>>(S%, FutureOr<core::num?>) → asy::Future<core::num> f2 = c.{self::C::field2} = <S extends FutureOr<core::num?>>(S% s, FutureOr<core::num?>t) → asy::Future<core::num> async {
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:36:22: Error: Operator '+' cannot be called on 'num?' because it is potentially null.
+    return (await t) + 1; // error
+                     ^" in (await t).{core::num::+}(1){(core::num) → core::num};
+  };
+}
+static method test3<S extends core::num?>(self::test3::S% s) → dynamic
+  return invalid-expression "pkg/front_end/testcases/nnbd/issue41697.dart:40:33: Error: Operator '+' cannot be called on 'S' because it is potentially null.
+test3<S extends num?>(S s) => s + 1; // error
+                                ^" in s.{core::num::+}(1){(core::num) → core::num};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.modular.expect
new file mode 100644
index 0000000..e45354a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41697b.dart:10:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
+//   var t = s + 1; // error
+//             ^
+//
+// pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
+//   var t = s + 1; // error
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test1<S extends core::num>(self::test1::S s) → dynamic {
+  core::num t = s.{core::num::+}(1){(core::num) → core::num};
+}
+static method test2<S extends core::num?>(self::test2::S% s) → dynamic {
+  core::num t = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:10:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
+  var t = s + 1; // error
+            ^" in s.{core::num::+}(1){(core::num) → core::num};
+}
+static method test3<S extends core::int>(self::test3::S s) → dynamic {
+  core::int t = s.{core::num::+}(1){(core::num) → core::int};
+}
+static method test4<S extends core::int?>(self::test4::S% s) → dynamic {
+  core::num t = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
+  var t = s + 1; // error
+            ^" in s.{core::num::+}(1){(core::num) → core::num};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.modular.expect
new file mode 100644
index 0000000..25b0480
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+//   x.foo();
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+//   y.foo();
+//     ^^^
+//
+import self as self;
+
+static method test() → dynamic {
+  Null x = null;
+  invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+  x.foo();
+    ^^^" in x{<unresolved>}.foo();
+  Null y = null;
+  invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+  y.foo();
+    ^^^" in y{<unresolved>}.foo();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.modular.expect
new file mode 100644
index 0000000..bf9a0db
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+//   Null x = null;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+//   x.foo();
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/issue41700b.dart:11:5: Error: The method 'foo' isn't defined for the class 'Null?'.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+//   y.foo();
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Null extends core::Object {
+  synthetic constructor •() → self::Null
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  self::Null x = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: The value 'null' can't be assigned to a variable of type 'Null' because 'Null' is not nullable.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  Null x = null;
+           ^" in null as{TypeError,ForNonNullableByDefault} self::Null;
+  invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+  x.foo();
+    ^^^" in x{<unresolved>}.foo();
+  self::Null? y = null;
+  invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:11:5: Error: The method 'foo' isn't defined for the class 'Null?'.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+  y.foo();
+    ^^^" in y{<unresolved>}.foo();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41952.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.modular.expect
new file mode 100644
index 0000000..3952efc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41952.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method i1<R extends core::Object? = dynamic>() → <S2 extends self::i1::R? = dynamic>() → void
+  return <S2 extends self::i1::R?>() → void {};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42089.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.modular.expect
new file mode 100644
index 0000000..1c01411
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42089.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//     Object o = x;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//     o = x;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test<X extends core::Object? = dynamic>(self::test::X? x) → dynamic {
+  if(x is{ForNonNullableByDefault} core::String?) {
+    core::Object o = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:7:16: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+    Object o = x;
+               ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
+    o = invalid-expression "pkg/front_end/testcases/nnbd/issue42089.dart:8:9: Error: A value of type 'X?' can't be assigned to a variable of type 'Object' because 'X?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+    o = x;
+        ^" in x{self::test::X? & core::String? /* '?' & '?' = '?' */} as{TypeError,ForNonNullableByDefault} core::Object;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42143.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42143.dart.weak.modular.expect
new file mode 100644
index 0000000..dd9388c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42143.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "dart:async";
+
+static method h1<T extends FutureOr<self::h1::T?>? = FutureOr<dynamic>?>(self::h1::T? t) → void {}
+static method h2<S extends FutureOr<self::h2::S?> = FutureOr<dynamic>>(self::h2::S? s) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42199.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42199.dart.weak.modular.expect
new file mode 100644
index 0000000..3ae4f33
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42199.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract operator ==(dynamic other) → core::bool;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42362.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.modular.expect
new file mode 100644
index 0000000..b233a23
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42362.dart.weak.modular.expect
@@ -0,0 +1,233 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:45:16: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   method3([int i]) {} // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:47:16: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   method4({int i}) {} // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:8:24: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   A.constructor1([this.i]); // error
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:10:24: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   A.constructor2({this.i}); // error
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:12:23: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   A.constructor3([int i]) // error
+//                       ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:15:23: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   A.constructor4({int i}) // error
+//                       ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:41:27: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   factory A.factory8([int i]) => new A.constructor3(); // error
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:43:27: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   factory A.factory9({int i}) => new A.constructor4(); // error
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:106:12: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   method3([i]) {} // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:108:12: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   method4({i}) {} // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:77:24: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   C.constructor1([this.i]); // error
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:79:24: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   C.constructor2({this.i}); // error
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:81:23: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   C.constructor3([int i]) : this.i = i; // error
+//                       ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:83:23: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   C.constructor4({int i}) : this.i = i; // error
+//                       ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:102:27: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   factory C.factory8([int i]) => new C.constructor3(); // error
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:104:27: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   factory C.factory9({int i}) => new C.constructor4(); // error
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//       : this.i = i; // error
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//       : this.i = i; // error
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//   C.constructor5([int? i]) : this.i = i; // error
+//                                       ^
+//
+// pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//   C.constructor6({int? i}) : this.i = i; // error
+//                                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int i;
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3, #C4, #C5]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::A
+    : self::A::i = i, super core::Object::•()
+    ;
+  constructor constructor2({core::int i = #C6}) → self::A
+    : self::A::i = i, super core::Object::•()
+    ;
+  constructor constructor3([core::int i = #C6]) → self::A
+    : self::A::i = i, super core::Object::•()
+    ;
+  constructor constructor4({core::int i = #C6}) → self::A
+    : self::A::i = i, super core::Object::•()
+    ;
+  constructor constructor5([core::int? i = #C6]) → self::A
+    : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:19:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+      : this.i = i; // error
+                 ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
+    ;
+  constructor constructor6({core::int? i = #C6}) → self::A
+    : self::A::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:22:18: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+      : this.i = i; // error
+                 ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
+    ;
+  constructor constructor7({required core::int i = #C6}) → self::A
+    : self::A::i = i, super core::Object::•()
+    ;
+  external constructor constructor8([core::int i = #C6]) → self::A
+    : super core::Object::•()
+    ;
+  external constructor constructor9({core::int i = #C6}) → self::A
+    : super core::Object::•()
+    ;
+  static factory factory3([core::int i = #C6]) → self::A
+    return new self::A::constructor3(i);
+  static factory factory4({core::int i = #C6}) → self::A
+    return new self::A::constructor4(i: i);
+  static factory factory5([core::int? i = #C6]) → self::A
+    return new self::A::constructor5(i);
+  static factory factory6({core::int? i = #C6}) → self::A
+    return new self::A::constructor6(i: i);
+  static factory factory7({required core::int i = #C6}) → self::A
+    return new self::A::constructor7(i: i);
+  static factory factory8([core::int i = #C6]) → self::A
+    return new self::A::constructor3();
+  static factory factory9({core::int i = #C6}) → self::A
+    return new self::A::constructor4();
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
+  external method method8([core::int i = #C6]) → dynamic;
+  external method method9({core::int i = #C6}) → dynamic;
+}
+abstract class B extends core::Object {
+  field core::int i = 42;
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract method method3([core::int i = #C6]) → dynamic;
+  abstract method method4({core::int i = #C6}) → dynamic;
+  abstract method method5([core::int? i = #C6]) → dynamic;
+  abstract method method6({core::int? i = #C6}) → dynamic;
+  abstract method method7({required core::int i = #C6}) → dynamic;
+}
+class C extends core::Object implements self::B {
+  field core::int i;
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10, #C11]/*isLegacy*/;
+  constructor constructor1([core::int i = #C6]) → self::C
+    : self::C::i = i, super core::Object::•()
+    ;
+  constructor constructor2({core::int i = #C6}) → self::C
+    : self::C::i = i, super core::Object::•()
+    ;
+  constructor constructor3([core::int i = #C6]) → self::C
+    : self::C::i = i, super core::Object::•()
+    ;
+  constructor constructor4({core::int i = #C6}) → self::C
+    : self::C::i = i, super core::Object::•()
+    ;
+  constructor constructor5([core::int? i = #C6]) → self::C
+    : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:85:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  C.constructor5([int? i]) : this.i = i; // error
+                                      ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
+    ;
+  constructor constructor6({core::int? i = #C6}) → self::C
+    : self::C::i = invalid-expression "pkg/front_end/testcases/nnbd/issue42362.dart:87:39: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  C.constructor6({int? i}) : this.i = i; // error
+                                      ^" in i as{TypeError,ForNonNullableByDefault} core::int, super core::Object::•()
+    ;
+  constructor constructor7({required core::int i = #C6}) → self::C
+    : self::C::i = i, super core::Object::•()
+    ;
+  static factory factory3([core::int i = #C6]) → self::C
+    return new self::C::constructor3(i);
+  static factory factory4({core::int i = #C6}) → self::C
+    return new self::C::constructor4(i: i);
+  static factory factory5([core::int? i = #C6]) → self::C
+    return new self::C::constructor5(i);
+  static factory factory6({core::int? i = #C6}) → self::C
+    return new self::C::constructor6(i: i);
+  static factory factory7({required core::int i = #C6}) → self::C
+    return new self::C::constructor7(i: i);
+  static factory factory8([core::int i = #C6]) → self::C
+    return new self::C::constructor3();
+  static factory factory9({core::int i = #C6}) → self::C
+    return new self::C::constructor4();
+  method method3([core::int i = #C6]) → dynamic {}
+  method method4({core::int i = #C6}) → dynamic {}
+  method method5([core::int? i = #C6]) → dynamic {}
+  method method6({core::int? i = #C6}) → dynamic {}
+  method method7({required core::int i = #C6}) → dynamic {}
+}
+static method main() → void {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::factory3
+  #C2 = constructor-tearoff self::A::factory4
+  #C3 = constructor-tearoff self::A::factory5
+  #C4 = constructor-tearoff self::A::factory6
+  #C5 = constructor-tearoff self::A::factory7
+  #C6 = null
+  #C7 = constructor-tearoff self::C::factory3
+  #C8 = constructor-tearoff self::C::factory4
+  #C9 = constructor-tearoff self::C::factory5
+  #C10 = constructor-tearoff self::C::factory6
+  #C11 = constructor-tearoff self::C::factory7
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.modular.expect
new file mode 100644
index 0000000..717c859
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.modular.expect
@@ -0,0 +1,259 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:13:13: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Object> aObject; // Error.
+//             ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:14:11: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<num?> aNumNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:15:11: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<int?> aIntNullable; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:16:11: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'T' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<Null> aNull; // Error.
+//           ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<T extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:17:21: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Object> fArgumentObject; // Error.
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:18:19: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<num?> fArgumentNumNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:19:19: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<int?> fArgumentIntNullable; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:20:19: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Null> fArgumentNull; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:21:19: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Object> fReturnObject; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:22:17: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<num?> fReturnNumNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:23:17: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<int?> fReturnIntNullable; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:24:17: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FReturn'.
+// Try changing type arguments so that they conform to the bounds.
+//   FReturn<Null> fReturnNull; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:8:17: Context: This is the type variable whose bound isn't conformed to.
+// typedef FReturn<X extends num> = X Function();
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:25:17: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Object> fBothObject; // Error.
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:26:15: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<num?> fBothNumNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:27:15: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<int?> fBothIntNullable; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:28:15: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FBoth'.
+// Try changing type arguments so that they conform to the bounds.
+//   FBoth<Null> fBothNull; // Error.
+//               ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:9:15: Context: This is the type variable whose bound isn't conformed to.
+// typedef FBoth<X extends num> = X Function(X);
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:29:20: Error: Type argument 'Object' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Object> fNowhereObject; // Error.
+//                    ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:30:18: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<num?> fNowhereNumNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:31:18: Error: Type argument 'int?' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<int?> fNowhereIntNullable; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:32:18: Error: Type argument 'Null' doesn't conform to the bound 'num' of the type variable 'X' on 'FNowhere'.
+// Try changing type arguments so that they conform to the bounds.
+//   FNowhere<Null> fNowhereNull; // Error.
+//                  ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:10:18: Context: This is the type variable whose bound isn't conformed to.
+// typedef FNowhere<X extends num> = Function();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:33:22: Error: Type argument 'Object?' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+//  - 'Object' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<Object?> fArgumentObjectNullable; // Error.
+//                      ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:34:22: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<dynamic> fArgumentDynamic; // Error.
+//                      ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue42429.dart:35:19: Error: Type argument 'void' doesn't conform to the bound 'num' of the type variable 'X' on 'FArgument'.
+// Try changing type arguments so that they conform to the bounds.
+//   FArgument<void> fArgumentVoid; // Error.
+//                   ^
+// pkg/front_end/testcases/nnbd/issue42429.dart:7:19: Context: This is the type variable whose bound isn't conformed to.
+// typedef FArgument<X extends num> = Function(X);
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef FArgument<contravariant X extends core::num> = (X) → dynamic;
+typedef FReturn<X extends core::num> = () → X;
+typedef FBoth<invariant X extends core::num> = (X) → X;
+typedef FNowhere<unrelated X extends core::num> = () → dynamic;
+class A<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+static method foo() → dynamic {
+  self::A<core::Object> aObject;
+  self::A<core::num?> aNumNullable;
+  self::A<core::int?> aIntNullable;
+  self::A<Null> aNull;
+  (core::Object) → dynamic fArgumentObject;
+  (core::num?) → dynamic fArgumentNumNullable;
+  (core::int?) → dynamic fArgumentIntNullable;
+  (Null) → dynamic fArgumentNull;
+  () → core::Object fReturnObject;
+  () → core::num? fReturnNumNullable;
+  () → core::int? fReturnIntNullable;
+  () → Null fReturnNull;
+  (core::Object) → core::Object fBothObject;
+  (core::num?) → core::num? fBothNumNullable;
+  (core::int?) → core::int? fBothIntNullable;
+  (Null) → Null fBothNull;
+  () → dynamic fNowhereObject;
+  () → dynamic fNowhereNumNullable;
+  () → dynamic fNowhereIntNullable;
+  () → dynamic fNowhereNull;
+  (core::Object?) → dynamic fArgumentObjectNullable;
+  (dynamic) → dynamic fArgumentDynamic;
+  (void) → dynamic fArgumentVoid;
+  self::A<core::Object?> aObjectNullable;
+  self::A<dynamic> aDynamic;
+  self::A<void> aVoid;
+  self::A<core::num> aNum;
+  self::A<core::int> aInt;
+  self::A<Never> aNever;
+  (core::num) → dynamic fArgumentNum;
+  (core::int) → dynamic fArgumentInt;
+  (Never) → dynamic fArgumentNever;
+  () → core::Object? fReturnObjectNullable;
+  () → dynamic fReturnDynamic;
+  () → void fReturnVoid;
+  () → core::num fReturnNum;
+  () → core::int fReturnInt;
+  () → Never fReturnNever;
+  (core::Object?) → core::Object? fBothObjectNullable;
+  (dynamic) → dynamic fBothDynamic;
+  (void) → void fBothVoid;
+  (core::num) → core::num fBothNum;
+  (core::int) → core::int fBothInt;
+  (Never) → Never fBothNever;
+  () → dynamic fNowhereObjectNullable;
+  () → dynamic fNowhereDynamic;
+  () → dynamic fNowhereVoid;
+  () → dynamic fNowhereNum;
+  () → dynamic fNowhereInt;
+  () → dynamic fNowhereNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.modular.expect
new file mode 100644
index 0000000..b570b8b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X> = (T?) → dynamic;
+class X extends core::Object {
+  synthetic constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method checkme<T extends self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+  (self::X?) → dynamic t2 = #C2;
+}
+
+constants  {
+  #C1 = static-tearoff self::checkme
+  #C2 = instantiation #C1 <self::X*>
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42434.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.modular.expect
new file mode 100644
index 0000000..e263ad8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434.dart:7:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<invariant X extends core::Object? = dynamic> = <X1 extends self::A<X%> = dynamic>() → dynamic;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.modular.expect
new file mode 100644
index 0000000..88588f6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42434_2.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:5:21: Error: Type argument 'X/*1*/' doesn't conform to the bound 'B<X/*2*/>' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue42434_2.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef AAlias<X> = Function<X1 extends A<X>> ();
+//                     ^
+// pkg/front_end/testcases/nnbd/issue42434_2.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends B<X>> = Function();
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<unrelated X extends core::Object? = dynamic> = <X1 extends () → dynamic = dynamic>() → dynamic;
+typedef A<unrelated X extends self::B<X> = self::B<dynamic>> = () → dynamic;
+class B<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.modular.expect
new file mode 100644
index 0000000..fe7ca67
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+//       return;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  (dynamic x) → core::int? {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return 1;
+    }
+    else {
+      return invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+      return;
+      ^" in null;
+    }
+  };
+  function local(dynamic x) → void {
+    if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+      return core::print("");
+    }
+    else {
+      return;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42504.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42504.dart.weak.modular.expect
new file mode 100644
index 0000000..62138bc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42504.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class ImageStreamCompleter extends core::Object {
+  synthetic constructor •() → self::ImageStreamCompleter
+    : super core::Object::•()
+    ;
+  abstract method addListener() → void;
+}
+class _LiveImage extends core::Object {
+  static factory •(self::ImageStreamCompleter a) → self::_LiveImage
+    return throw new core::UnimplementedError::•();
+}
+abstract class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  abstract get _pendingImages() → dynamic;
+  method putIfAbsent(core::Object key, () → self::ImageStreamCompleter loader) → self::ImageStreamCompleter? {
+    assert(!(key == null));
+    assert(!(loader == null));
+    self::ImageStreamCompleter? result = (let final dynamic #t1 = this.{self::Foo::_pendingImages}{dynamic}{dynamic}.[](key) in #t1 == null ?{dynamic} null : #t1{dynamic}.completer) as{TypeError,ForDynamic,ForNonNullableByDefault} self::ImageStreamCompleter?;
+    if(!(result == null)) {
+      return result{self::ImageStreamCompleter};
+    }
+    try {
+      result = loader(){() → self::ImageStreamCompleter};
+      self::_LiveImage::•(result{self::ImageStreamCompleter});
+    }
+    on core::Object catch(final core::Object error) {
+      return null;
+    }
+    result{self::ImageStreamCompleter}.{self::ImageStreamCompleter::addListener}(){() → void};
+    return result{self::ImageStreamCompleter};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42540.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42540.dart.weak.modular.expect
new file mode 100644
index 0000000..aaf931d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42540.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method getNull() → dynamic
+  return null;
+static method fn() → asy::Future<core::Object> async {
+  core::Object o = await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object;
+  return await self::getNull() as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Object>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42546.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.modular.expect
new file mode 100644
index 0000000..8563b46
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42546.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42546.dart:14:58: Error: A value of type 'Divergent<int>' can't be returned from an async function with return type 'Future<Divergent<Divergent<Divergent<int>>>>'.
+//  - 'Divergent' is from 'pkg/front_end/testcases/nnbd/issue42546.dart'.
+//  - 'Future' is from 'dart:async'.
+//   Future<Divergent<Divergent<int>>> x = (() async => new Divergent<int>())();
+//                                                          ^
+//
+// pkg/front_end/testcases/nnbd/issue42546.dart:14:75: Error: A value of type 'Future<Divergent<Divergent<Divergent<int>>>>' can't be assigned to a variable of type 'Future<Divergent<Divergent<int>>>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'Divergent' is from 'pkg/front_end/testcases/nnbd/issue42546.dart'.
+//   Future<Divergent<Divergent<int>>> x = (() async => new Divergent<int>())();
+//                                                                           ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Divergent<T extends core::Object? = dynamic> extends core::Object implements asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>> {
+  synthetic constructor •() → self::Divergent<self::Divergent::T%>
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation invocation) → dynamic
+    return super.{core::Object::noSuchMethod}(invocation);
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) →? core::bool test = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+    return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: test}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → FutureOr<void>action) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+    return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {covariant-by-class () →? FutureOr<self::Divergent<self::Divergent<self::Divergent::T%>>>onTimeout = #C1}) → asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>
+    return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C8: onTimeout}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<self::Divergent::T%>>>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ then<R extends core::Object? = dynamic>((self::Divergent<self::Divergent<self::Divergent::T%>>) → FutureOr<self::Divergent::then::R%>onValue, {core::Function? onError = #C1}) → asy::Future<self::Divergent::then::R%>
+    return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, core::List::unmodifiable<core::Type*>(<core::Type*>[self::Divergent::then::R%]), core::List::unmodifiable<dynamic>(<dynamic>[onValue]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C10: onError}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Future<self::Divergent::then::R%>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>
+    return this.{self::Divergent::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 0, #C3, #C12, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<self::Divergent<self::Divergent<self::Divergent::T%>>>;
+}
+static method test() → dynamic async {
+  asy::Future<self::Divergent<self::Divergent<core::int>>> x = invalid-expression "pkg/front_end/testcases/nnbd/issue42546.dart:14:75: Error: A value of type 'Future<Divergent<Divergent<Divergent<int>>>>' can't be assigned to a variable of type 'Future<Divergent<Divergent<int>>>'.
+ - 'Future' is from 'dart:async'.
+ - 'Divergent' is from 'pkg/front_end/testcases/nnbd/issue42546.dart'.
+  Future<Divergent<Divergent<int>>> x = (() async => new Divergent<int>())();
+                                                                          ^" in (() → asy::Future<self::Divergent<self::Divergent<self::Divergent<core::int>>>> async => invalid-expression "pkg/front_end/testcases/nnbd/issue42546.dart:14:58: Error: A value of type 'Divergent<int>' can't be returned from an async function with return type 'Future<Divergent<Divergent<Divergent<int>>>>'.
+ - 'Divergent' is from 'pkg/front_end/testcases/nnbd/issue42546.dart'.
+ - 'Future' is from 'dart:async'.
+  Future<Divergent<Divergent<int>>> x = (() async => new Divergent<int>())();
+                                                         ^" in new self::Divergent::•<core::int>() as{TypeError,ForNonNullableByDefault} self::Divergent<self::Divergent<self::Divergent<core::int>>>)(){() → asy::Future<self::Divergent<self::Divergent<self::Divergent<core::int>>>>} as{TypeError,ForNonNullableByDefault} asy::Future<self::Divergent<self::Divergent<core::int>>>;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <core::Symbol*, dynamic>{)
+  #C7 = #timeout
+  #C8 = #onTimeout
+  #C9 = #then
+  #C10 = #onError
+  #C11 = #asStream
+  #C12 = <dynamic>[]
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42579.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42579.dart.weak.modular.expect
new file mode 100644
index 0000000..6ee7128
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42579.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+static method foo<S extends core::Object? = dynamic>() → self::foo::S%
+  return throw "foo";
+static method bar<R extends core::Object? = dynamic>(self::A<self::bar::R%> a) → dynamic {}
+static method baz() → dynamic
+  return self::bar<core::Object?>(self::foo<self::A<core::Object?>>());
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42579_2.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42579_2.dart.weak.modular.expect
new file mode 100644
index 0000000..7b83456
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42579_2.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42579_2.dart:19:32: Error: The method 'unknown' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unknown'.
+//   wrap2(() => foo()..property?.unknown());
+//                                ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  get property() → self::A::T%
+    return throw "A.property";
+}
+static method foo<S extends core::Object? = dynamic>() → self::foo::S%
+  return throw "foo";
+static method wrap<R extends core::Object? = dynamic>(() → self::wrap::R% f) → dynamic {}
+static method wrap2<R extends core::Object? = dynamic>(() → self::A<self::wrap2::R%> f) → dynamic {}
+static method bar() → dynamic {
+  new self::A::•<dynamic>().{self::A::property}{dynamic}{dynamic}.unknown();
+  self::foo<dynamic>(){dynamic}.unknown();
+  self::wrap<dynamic>(() → dynamic => let final dynamic #t1 = self::foo<dynamic>() in block {
+    #t1{dynamic}.unknown();
+  } =>#t1);
+  self::wrap2<core::Object?>(() → self::A<core::Object?> => let final self::A<core::Object?> #t2 = self::foo<self::A<core::Object?>>() in block {
+    let final core::Object? #t3 = #t2.{self::A::property}{core::Object?} in #t3 == null ?{dynamic} null : invalid-expression "pkg/front_end/testcases/nnbd/issue42579_2.dart:19:32: Error: The method 'unknown' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'unknown'.
+  wrap2(() => foo()..property?.unknown());
+                               ^^^^^^^" in #t3{core::Object}{<unresolved>}.unknown();
+  } =>#t2);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42579_3.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42579_3.dart.weak.modular.expect
new file mode 100644
index 0000000..2763847
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42579_3.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42579_3.dart:16:25: Error: The method 'unknown' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unknown'.
+//   foo(() => B()..y1[0]?.unknown());
+//                         ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue42579_3.dart:17:25: Error: The method 'unknown' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unknown'.
+//   foo(() => B()..y2[0]?.unknown());
+//                         ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B<Y1 extends core::Object? = dynamic, Y2 extends core::List<self::B::Y3%> = core::List<dynamic>, Y3 extends core::Object? = dynamic> extends self::A<self::B::Y1%> {
+  synthetic constructor •() → self::B<self::B::Y1%, self::B::Y2, self::B::Y3%>
+    : super self::A::•()
+    ;
+  get y1() → self::B::Y1%
+    return throw "B.y1";
+  get y2() → self::B::Y2
+    return throw "B.y2";
+  get y3() → self::B::Y3%
+    return throw "B.y3";
+}
+static method foo<Z extends core::Object? = dynamic>(() → self::A<core::List<self::foo::Z%>> f) → dynamic {}
+static method bar() → dynamic {
+  self::foo<core::Object?>(() → self::B<core::List<core::Object?>, core::List<core::Object?>, dynamic> => let final self::B<core::List<core::Object?>, core::List<core::Object?>, dynamic> #t1 = new self::B::•<core::List<core::Object?>, core::List<core::Object?>, dynamic>() in block {
+    let final core::Object? #t2 = #t1.{self::B::y1}{core::List<core::Object?>}.{core::List::[]}(0){(core::int) → core::Object?} in #t2 == null ?{dynamic} null : invalid-expression "pkg/front_end/testcases/nnbd/issue42579_3.dart:16:25: Error: The method 'unknown' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'unknown'.
+  foo(() => B()..y1[0]?.unknown());
+                        ^^^^^^^" in #t2{core::Object}{<unresolved>}.unknown();
+  } =>#t1);
+  self::foo<core::Object?>(() → self::B<core::List<core::Object?>, core::List<core::Object?>, dynamic> => let final self::B<core::List<core::Object?>, core::List<core::Object?>, dynamic> #t3 = new self::B::•<core::List<core::Object?>, core::List<core::Object?>, dynamic>() in block {
+    let final core::Object? #t4 = #t3.{self::B::y2}{core::List<core::Object?>}.{core::List::[]}(0){(core::int) → core::Object?} in #t4 == null ?{dynamic} null : invalid-expression "pkg/front_end/testcases/nnbd/issue42579_3.dart:17:25: Error: The method 'unknown' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'unknown'.
+  foo(() => B()..y2[0]?.unknown());
+                        ^^^^^^^" in #t4{core::Object}{<unresolved>}.unknown();
+  } =>#t3);
+  self::foo<core::Object?>(() → self::B<core::List<core::Object?>, core::List<core::Object?>, dynamic> => let final self::B<core::List<core::Object?>, core::List<core::Object?>, dynamic> #t5 = new self::B::•<core::List<core::Object?>, core::List<core::Object?>, dynamic>() in block {
+    let final dynamic #t6 = #t5.{self::B::y3}{dynamic} in #t6 == null ?{dynamic} null : #t6{dynamic}.unknown();
+  } =>#t5);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
index 1717f29..7d802ac 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
@@ -9,7 +9,7 @@
 // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   bool operator ==() => true;
 //                 ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
index 1717f29..7d802ac 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
@@ -9,7 +9,7 @@
 // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   bool operator ==() => true;
 //                 ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.modular.expect
new file mode 100644
index 0000000..7d802ac
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: Operator '==' should have exactly one parameter.
+//   bool operator ==() => true;
+//                 ^^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
+//   bool operator ==() => true;
+//                 ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
+//   external bool operator ==(Object other);
+//                          ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
+//   bool operator ==(Object? other) => super == other;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Context: This is the overridden method ('==').
+//   bool operator ==() => true;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   bool operator ==(Object? other) => super == other;
+//                                            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool
+    return true;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  operator ==(core::Object? other) → core::bool
+    return super.{self::C::==}(other);
+  method method1(dynamic o) → core::bool
+    return super.{self::C::==}(o);
+  method method2(Null o) → core::bool
+    return super.{self::C::==}(o);
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+  operator ==() → core::bool
+    return true;
+}
+class F extends self::E {
+  synthetic constructor •() → self::F
+    : super self::E::•()
+    ;
+  operator ==(core::Object? other) → core::bool
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  bool operator ==(Object? other) => super == other;
+                                           ^" in super.{self::E::==}(other);
+}
+static method main() → dynamic {
+  self::expect(true, new self::D::•() =={self::D::==}{(core::Object?) → core::bool} new self::D::•());
+  self::expect(false, new self::D::•().{self::D::method1}(null){(dynamic) → core::bool});
+  self::expect(false, new self::D::•().{self::D::method2}(null){(Null) → core::bool});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.outline.expect
index f1a33e9..390818a 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.outline.expect
@@ -9,7 +9,7 @@
 // pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
 //   bool operator ==() => true;
 //                 ^
-// sdk/lib/_internal/vm/lib/object_patch.dart:29:26: Context: This is the overridden method ('==').
+// sdk/lib/_internal/vm/lib/object_patch.dart:21:26: Context: This is the overridden method ('==').
 //   external bool operator ==(Object other);
 //                          ^
 //
diff --git a/pkg/front_end/testcases/nnbd/issue42607.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42607.dart.weak.modular.expect
new file mode 100644
index 0000000..47b797f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42607.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::int* x = 3;
+  let final core::int* #t1 = x in #t1 == null ?{core::bool*} null : #t1.{core::int::isEven}{core::bool*};
+  x = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.modular.expect
new file mode 100644
index 0000000..3e6d749
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+  core::bool b = (() → core::bool => true)(){() → core::bool};
+  (dynamic _) → core::int? {
+    if(b)
+      return 42;
+  };
+  (dynamic _) → asy::Future<core::int?> async {
+    if(b)
+      return 42;
+  };
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.modular.expect
new file mode 100644
index 0000000..7478ccc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.modular.expect
@@ -0,0 +1,290 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var l2 = [...?n1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+//   var l3 = [...n2];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+//   var l5 = [...n3];
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var s2 = {...?n1, n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+//   var s3 = {...n2, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+//   var s5 = {...n3, n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+//   var m2 = {...?n1, n1: n1};
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+//   var m3 = {...n2, n1: n1};
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+//   var m5 = {...n3, n1: n1};
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t1 = core::List::of<Never>(let final Never #t2 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t1;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t3 = <Never>[];
+    final core::Iterable<Never>? #t4 = let final Never #t5 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!(#t4 == null))
+      #t3.{core::List::addAll}{Invariant}(#t4{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+  } =>#t3;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t6 = <Never>[];
+    final core::Iterable<Never>? #t7 = n2;
+    if(!(#t7 == null))
+      #t6.{core::List::addAll}{Invariant}(#t7{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+  } =>#t6;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t8 = <Never>[];
+    final core::Iterable<Never>? #t9 = n3;
+    if(!(#t9 == null))
+      #t8.{core::List::addAll}{Invariant}(#t9{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+  } =>#t8;
+  core::Set<Never> s1 = block {
+    final core::Set<Never> #t10 = col::LinkedHashSet::of<Never>(let final Never #t11 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+    #t10.{core::Set::add}{Invariant}(let final Never #t12 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+  } =>#t10;
+  core::Set<Never> s2 = block {
+    final core::Set<Never> #t13 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t14 = let final Never #t15 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!(#t14 == null))
+      #t13.{core::Set::addAll}{Invariant}(#t14{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t13.{core::Set::add}{Invariant}(let final Never #t16 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+  } =>#t13;
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>();
+    #t17.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  var s3 = {...n2, n1};
+               ^"){(dynamic) → core::bool};
+    #t17.{core::Set::add}{Invariant}(let final Never #t18 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+  } =>#t17;
+  core::Set<Never> s4 = block {
+    final core::Set<Never> #t19 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t20 = n2;
+    if(!(#t20 == null))
+      #t19.{core::Set::addAll}{Invariant}(#t20{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t19.{core::Set::add}{Invariant}(let final Never #t21 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+  } =>#t19;
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>();
+    #t22.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+  var s5 = {...n3, n1};
+               ^"){(dynamic) → core::bool};
+    #t22.{core::Set::add}{Invariant}(let final Never #t23 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+  } =>#t22;
+  core::Set<Never> s6 = block {
+    final core::Set<Never> #t24 = col::LinkedHashSet::•<Never>();
+    final core::Iterable<Never>? #t25 = n3;
+    if(!(#t25 == null))
+      #t24.{core::Set::addAll}{Invariant}(#t25{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+    #t24.{core::Set::add}{Invariant}(let final Never #t26 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never) → core::bool};
+  } =>#t24;
+  core::Map<Never, Never> m1 = block {
+    final core::Map<Never, Never> #t27 = <Never, Never>{};
+    for (final core::MapEntry<Never, Never> #t28 in (let final Never #t29 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
+      #t27.{core::Map::[]=}{Invariant}(#t28.{core::MapEntry::key}{Never}, #t28.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t27.{core::Map::[]=}{Invariant}(let final Never #t30 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t31 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+  } =>#t27;
+  core::Map<Never, Never> m2 = block {
+    final core::Map<Never, Never> #t32 = <Never, Never>{};
+    final core::Map<Never, Never>? #t33 = let final Never #t34 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!(#t33 == null))
+      for (final core::MapEntry<Never, Never> #t35 in #t33{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
+        #t32.{core::Map::[]=}{Invariant}(#t35.{core::MapEntry::key}{Never}, #t35.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t32.{core::Map::[]=}{Invariant}(let final Never #t36 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t37 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+  } =>#t32;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+  var m3 = {...n2, n1: n1};
+               ^": null, let final Never #t38 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t39 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+  core::Map<Never, Never> m4 = block {
+    final core::Map<Never, Never> #t40 = <Never, Never>{};
+    final core::Map<Never, Never>? #t41 = n2;
+    if(!(#t41 == null))
+      for (final core::MapEntry<Never, Never> #t42 in #t41{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
+        #t40.{core::Map::[]=}{Invariant}(#t42.{core::MapEntry::key}{Never}, #t42.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t40.{core::Map::[]=}{Invariant}(let final Never #t43 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t44 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+  } =>#t40;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+  var m5 = {...n3, n1: n1};
+               ^": null, let final Never #t45 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final Never #t46 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+  core::Map<Never, Never> m6 = block {
+    final core::Map<Never, Never> #t47 = <Never, Never>{};
+    final core::Map<Never, Never>? #t48 = n3;
+    if(!(#t48 == null))
+      for (final core::MapEntry<Never, Never> #t49 in #t48{core::Map<Never, Never>}.{core::Map::entries}{core::Iterable<core::MapEntry<Never, Never>>})
+        #t47.{core::Map::[]=}{Invariant}(#t49.{core::MapEntry::key}{Never}, #t49.{core::MapEntry::value}{Never}){(Never, Never) → void};
+    #t47.{core::Map::[]=}{Invariant}(let final Never #t50 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t51 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(Never, Never) → void};
+  } =>#t47;
+}
+static method test2<N1 extends Never, N2 extends Never?, N3 extends Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+  core::List<Never> l1 = block {
+    final core::List<Never> #t52 = core::List::of<Never>(let final self::test2::N1 #t53 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  } =>#t52;
+  core::List<Never> l2 = block {
+    final core::List<Never> #t54 = <Never>[];
+    final core::Iterable<Never>? #t55 = let final self::test2::N1 #t56 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!(#t55 == null))
+      #t54.{core::List::addAll}{Invariant}(#t55{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+  } =>#t54;
+  core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+  var l3 = [...n2];
+               ^"];
+  core::List<Never> l4 = block {
+    final core::List<Never> #t57 = <Never>[];
+    final core::Iterable<Never>? #t58 = n2;
+    if(!(#t58 == null))
+      #t57.{core::List::addAll}{Invariant}(#t58{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+  } =>#t57;
+  core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+  var l5 = [...n3];
+               ^"];
+  core::List<Never> l6 = block {
+    final core::List<Never> #t59 = <Never>[];
+    final core::Iterable<Never>? #t60 = n3;
+    if(!(#t60 == null))
+      #t59.{core::List::addAll}{Invariant}(#t60{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+  } =>#t59;
+  core::Set<self::test2::N1> s1 = block {
+    final core::Set<self::test2::N1> #t61 = col::LinkedHashSet::of<self::test2::N1>(let final self::test2::N1 #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+    #t61.{core::Set::add}{Invariant}(let final self::test2::N1 #t63 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+  } =>#t61;
+  core::Set<self::test2::N1> s2 = block {
+    final core::Set<self::test2::N1> #t64 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t65 = let final self::test2::N1 #t66 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!(#t65 == null))
+      #t64.{core::Set::addAll}{Invariant}(#t65{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t64.{core::Set::add}{Invariant}(let final self::test2::N1 #t67 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+  } =>#t64;
+  core::Set<dynamic> s3 = block {
+    final core::Set<dynamic> #t68 = col::LinkedHashSet::•<dynamic>();
+    #t68.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  var s3 = {...n2, n1};
+               ^"){(dynamic) → core::bool};
+    #t68.{core::Set::add}{Invariant}(let final self::test2::N1 #t69 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+  } =>#t68;
+  core::Set<self::test2::N1> s4 = block {
+    final core::Set<self::test2::N1> #t70 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t71 = n2;
+    if(!(#t71 == null))
+      #t70.{core::Set::addAll}{Invariant}(#t71{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t70.{core::Set::add}{Invariant}(let final self::test2::N1 #t72 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+  } =>#t70;
+  core::Set<dynamic> s5 = block {
+    final core::Set<dynamic> #t73 = col::LinkedHashSet::•<dynamic>();
+    #t73.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  var s5 = {...n3, n1};
+               ^"){(dynamic) → core::bool};
+    #t73.{core::Set::add}{Invariant}(let final self::test2::N1 #t74 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(dynamic) → core::bool};
+  } =>#t73;
+  core::Set<self::test2::N1> s6 = block {
+    final core::Set<self::test2::N1> #t75 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Iterable<self::test2::N1>? #t76 = n3;
+    if(!(#t76 == null))
+      #t75.{core::Set::addAll}{Invariant}(#t76{core::Iterable<self::test2::N1>}){(core::Iterable<self::test2::N1>) → void};
+    #t75.{core::Set::add}{Invariant}(let final self::test2::N1 #t77 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1) → core::bool};
+  } =>#t75;
+  core::Map<self::test2::N1, self::test2::N1> m1 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t78 = <self::test2::N1, self::test2::N1>{};
+    for (final core::MapEntry<self::test2::N1, self::test2::N1> #t79 in (let final self::test2::N1 #t80 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
+      #t78.{core::Map::[]=}{Invariant}(#t79.{core::MapEntry::key}{self::test2::N1}, #t79.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t78.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t81 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t82 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+  } =>#t78;
+  core::Map<self::test2::N1, self::test2::N1> m2 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t83 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t84 = let final self::test2::N1 #t85 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+    if(!(#t84 == null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t86 in #t84{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
+        #t83.{core::Map::[]=}{Invariant}(#t86.{core::MapEntry::key}{self::test2::N1}, #t86.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t83.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t87 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t88 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+  } =>#t83;
+  core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+  var m3 = {...n2, n1: n1};
+               ^": null, let final self::test2::N1 #t89 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t90 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+  core::Map<self::test2::N1, self::test2::N1> m4 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t91 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t92 = n2;
+    if(!(#t92 == null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t93 in #t92{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
+        #t91.{core::Map::[]=}{Invariant}(#t93.{core::MapEntry::key}{self::test2::N1}, #t93.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t91.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t94 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t95 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+  } =>#t91;
+  core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+  var m5 = {...n3, n1: n1};
+               ^": null, let final self::test2::N1 #t96 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."): let final self::test2::N1 #t97 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")};
+  core::Map<self::test2::N1, self::test2::N1> m6 = block {
+    final core::Map<self::test2::N1, self::test2::N1> #t98 = <self::test2::N1, self::test2::N1>{};
+    final core::Map<self::test2::N1, self::test2::N1>? #t99 = n3;
+    if(!(#t99 == null))
+      for (final core::MapEntry<self::test2::N1, self::test2::N1> #t100 in #t99{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}{core::Iterable<core::MapEntry<self::test2::N1, self::test2::N1>>})
+        #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}{self::test2::N1}, #t100.{core::MapEntry::value}{self::test2::N1}){(self::test2::N1, self::test2::N1) → void};
+    #t98.{core::Map::[]=}{Invariant}(let final self::test2::N1 #t101 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final self::test2::N1 #t102 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){(self::test2::N1, self::test2::N1) → void};
+  } =>#t98;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.modular.expect
new file mode 100644
index 0000000..2637180
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42844_1.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42844_1.dart:6:9: Error: Field 'n' should be initialized because its type 'Never' doesn't allow null.
+//   Never n; // Error.
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field Never n = null;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •(Never n) → self::C
+    return new self::D::•(n);
+}
+class D extends core::Object implements self::C {
+  field Never n;
+  constructor •(Never n) → self::D
+    : self::D::n = n, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.modular.expect
new file mode 100644
index 0000000..d84e75e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42844_2.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42844_2.dart:6:17: Error: Final field 'n' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final dynamic n; // Error.
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic n = null;
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •(dynamic n) → self::C
+    return new self::D::•(n);
+}
+class D extends core::Object implements self::C {
+  final field dynamic n;
+  constructor •(dynamic n) → self::D
+    : self::D::n = n, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42967.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue42967.dart.weak.modular.expect
new file mode 100644
index 0000000..3995dbf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42967.dart.weak.modular.expect
@@ -0,0 +1,86 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42967.dart:7:7: Error: Field 'fieldNonNullableOfA' should be initialized because its type 'num' doesn't allow null.
+//   num fieldNonNullableOfA; // Error.
+//       ^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue42967.dart:10:17: Error: Final field 'fieldFinalDynamicOfA' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final dynamic fieldFinalDynamicOfA; // Error.
+//                 ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue42967.dart:26:7: Error: Field 'fieldNonNullableOfB' should be initialized because its type 'num' doesn't allow null.
+//   num fieldNonNullableOfB; // Error.
+//       ^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue42967.dart:29:17: Error: Final field 'fieldFinalDynamicOfB' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final dynamic fieldFinalDynamicOfB; // Error.
+//                 ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue42967.dart:45:7: Error: Field 'fieldNonNullableOfM' should be initialized because its type 'num' doesn't allow null.
+//   num fieldNonNullableOfM; // Error.
+//       ^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue42967.dart:50:17: Error: Final field 'fieldFinalDynamicOfM' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final dynamic fieldFinalDynamicOfM; // Error.
+//                 ^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::num fieldNonNullableOfA = null;
+  late field core::num fieldLateNonNullableOfA;
+  final field dynamic fieldFinalDynamicOfA = null;
+  late final [setter] field dynamic fieldLateFinalDynamicOfA;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractA extends core::Object {
+  synthetic constructor •() → self::AbstractA
+    : super core::Object::•()
+    ;
+  external get fieldExternalNonNullableOfAbstractA() → core::num;
+  external set fieldExternalNonNullableOfAbstractA(core::num #externalFieldValue) → void;
+  abstract get fieldAbstractNonNullableOfAbstractA() → core::num;
+  abstract set fieldAbstractNonNullableOfAbstractA(core::num #externalFieldValue) → void;
+  external get fieldExternalFinalDynamicOfAbstractA() → dynamic;
+  abstract get fieldAbstractFinalDynamicOfAbstractA() → dynamic;
+}
+class B extends core::Object {
+  field core::num fieldNonNullableOfB = null;
+  late field core::num fieldLateNonNullableOfB;
+  final field dynamic fieldFinalDynamicOfB = null;
+  late final [setter] field dynamic fieldLateFinalDynamicOfB;
+  static factory •() → self::B
+    return throw 42;
+}
+abstract class AbstractB extends core::Object {
+  synthetic constructor •() → self::AbstractB
+    : super core::Object::•()
+    ;
+  external get fieldExternalNonNullableOfAbstractB() → core::num;
+  external set fieldExternalNonNullableOfAbstractB(core::num #externalFieldValue) → void;
+  abstract get fieldAbstractNonNullableOfAbstractB() → core::num;
+  abstract set fieldAbstractNonNullableOfAbstractB(core::num #externalFieldValue) → void;
+  external get fieldExternalFinalDynamicOfAbstractB() → dynamic;
+  abstract get fieldAbstractFinalDynamicOfAbstractB() → dynamic;
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+  field core::num fieldNonNullableOfM = null;
+  late field core::num fieldLateNonNullableOfM;
+  final field dynamic fieldFinalDynamicOfM = null;
+  late final [setter] field dynamic fieldLateFinalDynamicOfM;
+  external get fieldExternalNonNullableOfM() → core::num;
+  external set fieldExternalNonNullableOfM(core::num #externalFieldValue) → void;
+  abstract get fieldAbstractNonNullableOfM() → core::num;
+  abstract set fieldAbstractNonNullableOfM(core::num #externalFieldValue) → void;
+  external get fieldExternalFinalDynamicOfM() → dynamic;
+  abstract get fieldAbstractFinalDynamicOfM() → dynamic;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43174.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43174.dart.weak.modular.expect
new file mode 100644
index 0000000..2bc396c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43174.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+//     return 42; // error
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method method(() → void f) → dynamic {
+  f(){() → void};
+}
+static method method2(() → FutureOr<void>f) → dynamic {
+  f(){() → FutureOr<void>};
+}
+static method test() → dynamic {
+  self::method(() → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue43174.dart:17:12: Error: Can't return a value from a void function.
+    return 42; // error
+           ^" in 42;
+  });
+  self::method2(() → core::int {
+    return 42;
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.modular.expect
new file mode 100644
index 0000000..46f6782
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.modular.expect
@@ -0,0 +1,265 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+//  - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+//  - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+//       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                         ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+//                                                        ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                       ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//   void method2<Y extends String>(D<Y> a, D<String>? b) {
+//                                                     ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.redirect(A<A<Null>>? a) = C.internal;
+//                                  ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   factory C.fact(A<A<Null>>? a) {
+//                              ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? d;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<Y>? c;
+//           ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? d;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? b;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? c;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//     A<A<Null>>? a;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+//     D<String>? b;
+//                ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class D<X extends core::num> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X>
+    : super core::Object::•()
+    ;
+}
+class B<X extends self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
+  synthetic constructor •() → self::B<self::B::X%>
+    : super core::Object::•()
+    ;
+  method method1<Y extends self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
+    self::A<self::B::method1::Y%>? c;
+    self::A<self::A<Null>>? d;
+  }
+  method method2<Y extends core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+    self::D<self::B::method2::Y>? c;
+    self::D<core::String>? d;
+  }
+}
+class C extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor internal(dynamic _) → self::C
+    : super core::Object::•() {
+    self::A<self::A<Null>>? a;
+    self::D<core::String>? b;
+  }
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
+    return new self::C::internal(a);
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
+    self::D<core::String>? c;
+    return new self::C::internal(a);
+  }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+  method method1 = self::Extension1|method1;
+  tearoff method1 = self::Extension1|get#method1;
+  method method2 = self::Extension1|method2;
+  tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<Null>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
+  self::A<self::Extension1|method1::Y%>? c;
+  self::A<self::A<Null>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String>(lowered final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+  self::D<self::Extension1|method2::Y>? c;
+  self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(lowered final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String>(self::D<Y>, self::D<core::String>?) → void
+  return <Y extends core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+  self::A<Null> a = new self::A::•<Null>();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::redirect
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43256.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.modular.expect
new file mode 100644
index 0000000..097a586
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43256.dart.weak.modular.expect
@@ -0,0 +1,142 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableMap, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//   if (i > 0) ...nullableList, // error
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+//     if (i > 0) ...x, // error
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     if (i > 0) ...y, // error
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static field core::int i = 1;
+static field core::Map<core::int, core::String>? nullableMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field core::List<core::int>? nullableList = <core::int>[1, 2, 3];
+static field dynamic dynamicMap = <core::int, core::String>{1: "Let", 2: "it", 3: "be"};
+static field dynamic dynamicList = <core::int>[1, 2, 3];
+static field core::Map<dynamic, dynamic> map1 = block {
+  final core::Map<dynamic, dynamic> #t1 = <dynamic, dynamic>{};
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    #t1.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:16:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableMap, // error
+                ^", null){(dynamic, dynamic) → void};
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    for (final core::MapEntry<dynamic, dynamic> #t2 in (self::dynamicMap as{TypeError,ForDynamic,ForNonNullableByDefault} core::Map<dynamic, dynamic>).{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    for (final core::MapEntry<dynamic, dynamic> #t3 in self::nullableMap!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t1.{core::Map::[]=}{Invariant}(#t3.{core::MapEntry::key}{dynamic}, #t3.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+} =>#t1;
+static field core::Set<dynamic> set1 = block {
+  final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>();
+  #t4.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    #t4.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:23:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^"){(dynamic) → core::bool};
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    #t4.{core::Set::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    #t4.{core::Set::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
+} =>#t4;
+static field core::List<dynamic> list1 = block {
+  final core::List<dynamic> #t5 = <dynamic>[];
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    #t5.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:29:17: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+  if (i > 0) ...nullableList, // error
+                ^"){(dynamic) → void};
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    #t5.{core::List::addAll}{Invariant}(self::dynamicList as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>){(core::Iterable<dynamic>) → void};
+  if(self::i.{core::num::>}(0){(core::num) → core::bool})
+    #t5.{core::List::addAll}{Invariant}(self::nullableList!){(core::Iterable<dynamic>) → void};
+} =>#t5;
+static method testMap<X extends dynamic, Y extends core::Map<core::int, core::String>?, Z extends core::Map<core::int, core::String>>(self::testMap::X% x, self::testMap::Y% y, self::testMap::Z z) → dynamic {
+  core::Map<dynamic, dynamic> map2 = block {
+    final core::Map<dynamic, dynamic> #t6 = <dynamic, dynamic>{};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:37:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+    if (i > 0) ...x, // error
+                  ^", null){(dynamic, dynamic) → void};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      #t6.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:38:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^", null){(dynamic, dynamic) → void};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      for (final core::MapEntry<dynamic, dynamic> #t7 in z.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+        #t6.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      for (final core::MapEntry<dynamic, dynamic> #t8 in y!.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+        #t6.{core::Map::[]=}{Invariant}(#t8.{core::MapEntry::key}{dynamic}, #t8.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) → void};
+  } =>#t6;
+}
+static method testIterables<X extends dynamic, Y extends core::List<core::int>?, Z extends core::List<core::int>>(self::testIterables::X% x, self::testIterables::Y% y, self::testIterables::Z z) → dynamic {
+  core::Set<dynamic> set2 = block {
+    final core::Set<dynamic> #t9 = col::LinkedHashSet::•<dynamic>();
+    #t9.{core::Set::add}{Invariant}(0){(dynamic) → core::bool};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:48:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^"){(dynamic) → core::bool};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      #t9.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:49:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^"){(dynamic) → core::bool};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      #t9.{core::Set::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
+  } =>#t9;
+  core::List<dynamic> list2 = block {
+    final core::List<dynamic> #t10 = <dynamic>[];
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:53:19: Error: Unexpected type 'X' of a spread.  Expected 'dynamic' or an Iterable.
+    if (i > 0) ...x, // error
+                  ^"){(dynamic) → void};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      #t10.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43256.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    if (i > 0) ...y, // error
+                  ^"){(dynamic) → void};
+    if(self::i.{core::num::>}(0){(core::num) → core::bool})
+      #t10.{core::List::addAll}{Invariant}(z){(core::Iterable<dynamic>) → void};
+  } =>#t10;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43276.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.modular.expect
new file mode 100644
index 0000000..6fe128e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43276.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43276.dart:6:14: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   C.gen({int i}); // error
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue43276.dart:8:23: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   factory C.fact({int i}) /* error */ {
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor gen({core::int i = #C2}) → self::C
+    : super core::Object::•()
+    ;
+  static factory fact({core::int i = #C2}) → self::C {
+    return new self::C::gen();
+  }
+  static factory redirect({core::int i = #C2}) → self::C
+    return new self::C::gen(i: i);
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C::redirect
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43278.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.modular.expect
new file mode 100644
index 0000000..c69ecec
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43278.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43278.dart:13:5: Error: Property 'foo' cannot be accessed on 'A?' because it is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try accessing using ?. instead.
+//   a.foo ??= x; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/issue43278.dart:14:5: Error: Property 'foo' cannot be accessed on 'T' because it is potentially null.
+// Try accessing using ?. instead.
+//   t.foo ??= x; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/issue43278.dart:28:5: Error: Property 'fooExtension' cannot be accessed on 'B?' because it is potentially null.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+// Try accessing using ?. instead.
+//   b.fooExtension ??= x; // Error.
+//     ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
+// Try accessing using ?. instead.
+//   t.fooExtension ??= x; // Error.
+//     ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int? foo = null;
+  field self::A bar;
+  constructor •(self::A bar) → self::A
+    : self::A::bar = bar, super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::B {
+  get fooExtension = self::Extension|get#fooExtension;
+  get barExtension = self::Extension|get#barExtension;
+  set fooExtension = self::Extension|set#fooExtension;
+}
+static method test<T extends self::A?>(self::A? a, self::test::T% t, dynamic d, core::int x) → dynamic {
+  let final self::A? #t1 = a in invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:13:5: Error: Property 'foo' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try accessing using ?. instead.
+  a.foo ??= x; // Error.
+    ^^^" in #t1.{self::A::foo}{<nullable>}.{core::int?} == null ?{core::int} invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:13:5: Error: Property 'foo' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try accessing using ?. instead.
+  a.foo ??= x; // Error.
+    ^^^" in #t1.{self::A::foo}{<nullable>}. = x : null;
+  let final self::test::T% #t2 = t in invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:14:5: Error: Property 'foo' cannot be accessed on 'T' because it is potentially null.
+Try accessing using ?. instead.
+  t.foo ??= x; // Error.
+    ^^^" in #t2.{self::A::foo}{<nullable>}.{core::int?} == null ?{core::int} invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:14:5: Error: Property 'foo' cannot be accessed on 'T' because it is potentially null.
+Try accessing using ?. instead.
+  t.foo ??= x; // Error.
+    ^^^" in #t2.{self::A::foo}{<nullable>}. = x : null;
+  let final dynamic #t3 = d in #t3{dynamic}.foo == null ?{dynamic} #t3{dynamic}.foo = x : null;
+  let final self::A? #t4 = a in #t4 == null ?{core::int?} null : let final self::A #t5 = #t4{self::A}.{self::A::bar}{self::A} in #t5.{self::A::foo}{core::int?} == null ?{core::int} #t5.{self::A::foo} = x : null;
+}
+static method Extension|get#fooExtension(lowered final self::B #this) → core::int?
+  return null;
+static method Extension|set#fooExtension(lowered final self::B #this, core::int? value) → void {}
+static method Extension|get#barExtension(lowered final self::B #this) → self::B
+  return new self::B::•();
+static method testExtension<T extends self::B?>(self::B? b, self::testExtension::T% t, core::int x) → dynamic {
+  let final self::B? #t6 = b in invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:28:5: Error: Property 'fooExtension' cannot be accessed on 'B?' because it is potentially null.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try accessing using ?. instead.
+  b.fooExtension ??= x; // Error.
+    ^^^^^^^^^^^^" in self::Extension|get#fooExtension(#t6) == null ?{core::int} invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:28:5: Error: Property 'fooExtension' cannot be accessed on 'B?' because it is potentially null.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/issue43278.dart'.
+Try accessing using ?. instead.
+  b.fooExtension ??= x; // Error.
+    ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t6, x) : null;
+  let final self::testExtension::T% #t7 = t in invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
+Try accessing using ?. instead.
+  t.fooExtension ??= x; // Error.
+    ^^^^^^^^^^^^" in self::Extension|get#fooExtension(#t7) == null ?{core::int} invalid-expression "pkg/front_end/testcases/nnbd/issue43278.dart:29:5: Error: Property 'fooExtension' cannot be accessed on 'T' because it is potentially null.
+Try accessing using ?. instead.
+  t.fooExtension ??= x; // Error.
+    ^^^^^^^^^^^^" in self::Extension|set#fooExtension(#t7, x) : null;
+  let final self::B? #t8 = b in #t8 == null ?{core::int?} null : let final self::B #t9 = self::Extension|get#barExtension(#t8{self::B}) in self::Extension|get#fooExtension(#t9) == null ?{core::int} self::Extension|set#fooExtension(#t9, x) : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43354.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.modular.expect
new file mode 100644
index 0000000..b068885
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43354.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:8:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:9:9: Context: This constructor is const.
+//   const A();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:13:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:14:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:15:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:19:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:20:9: Context: This constructor is const.
+//   const C();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:25:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int foo = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43354.dart:26:21: Error: Can't have a late final field in a class with a const constructor.
+//   late final String bar = "foobar";
+//                     ^
+// pkg/front_end/testcases/nnbd/issue43354.dart:27:9: Context: This constructor is const.
+//   const D();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  const constructor •() → self::C
+    : super core::Object::•()
+    ;
+  const constructor another() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object /*hasConstConstructor*/  {
+  late final field core::int foo = 42;
+  late final field core::String bar = "foobar";
+  const constructor •() → self::D
+    : super core::Object::•()
+    ;
+  const constructor another() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43455.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.modular.expect
new file mode 100644
index 0000000..2815e55
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43455.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X%, self::C::Y>
+    : super core::Object::•()
+    ;
+  method test(covariant-by-class self::C::X% x, covariant-by-class self::C::Y? y) → dynamic {
+    core::Set<core::Object?> v = block {
+      final core::Set<core::Object?> #t1 = col::LinkedHashSet::•<core::Object?>();
+      #t1.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
+      #t1.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+    } =>#t1;
+    core::Set<core::Object?> w = block {
+      final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
+      #t2.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t2.{core::Set::add}{Invariant}(x){(core::Object?) → core::bool};
+    } =>#t2;
+    core::Set<core::Object?> p = block {
+      final core::Set<core::Object?> #t3 = col::LinkedHashSet::•<core::Object?>();
+      #t3.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+      #t3.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+    } =>#t3;
+    core::Set<core::Object?> q = block {
+      final core::Set<core::Object?> #t4 = col::LinkedHashSet::•<core::Object?>();
+      #t4.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      #t4.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
+    } =>#t4;
+    self::assertRightSubtype(v);
+    self::assertLeftSubtype<core::Set<core::Object?>>(v);
+    self::assertRightSubtype(w);
+    self::assertLeftSubtype<core::Set<core::Object?>>(w);
+    self::assertRightSubtype(p);
+    self::assertLeftSubtype<core::Set<core::Object?>>(p);
+    self::assertRightSubtype(q);
+    self::assertLeftSubtype<core::Set<core::Object?>>(q);
+    if(x is{ForNonNullableByDefault} core::Object?) {
+      core::Set<core::Object?> v = block {
+        final core::Set<core::Object?> #t5 = col::LinkedHashSet::•<core::Object?>();
+        #t5.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+        #t5.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+      } =>#t5;
+      core::Set<core::Object?> w = block {
+        final core::Set<core::Object?> #t6 = col::LinkedHashSet::•<core::Object?>();
+        #t6.{core::Set::add}{Invariant}(42){(core::Object?) → core::bool};
+        #t6.{core::Set::add}{Invariant}(x{self::C::X% & core::Object? /* '%' & '?' = '%' */}){(core::Object?) → core::bool};
+      } =>#t6;
+      self::assertRightSubtype(v);
+      self::assertLeftSubtype<core::Set<core::Object?>>(v);
+      self::assertRightSubtype(w);
+      self::assertLeftSubtype<core::Set<core::Object?>>(w);
+    }
+  }
+}
+static method assertRightSubtype(dynamic x) → dynamic {
+  x as{ForNonNullableByDefault} core::Set<core::Object?>;
+}
+static method assertLeftSubtype<X extends core::Object? = dynamic>(self::assertLeftSubtype::X% x) → dynamic {
+  col::LinkedHashSet::•<core::Object?>() as{ForNonNullableByDefault} self::assertLeftSubtype::X%;
+}
+static method main() → dynamic {
+  new self::C::•<core::int?, core::int>().{self::C::test}(42, null){(core::int?, core::int?) → dynamic};
+  new self::C::•<core::int?, core::int>().{self::C::test}(null, null){(core::int?, core::int?) → dynamic};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43495.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.modular.expect
new file mode 100644
index 0000000..e415041
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43495.dart.weak.modular.expect
@@ -0,0 +1,731 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:8:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {...a}, // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:9:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {...b}, // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:10:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {...c}, // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:11:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {...d}, // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:12:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     <int, int>{...a}, // Error.
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:12:19: Error: Unexpected type 'List<int>?' of a map spread entry.  Expected 'dynamic' or a Map.
+//  - 'List' is from 'dart:core'.
+//     <int, int>{...a}, // Error.
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     <int>{...d}, // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+//  - 'Map' is from 'dart:core'.
+//     <int>{...d}, // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {if (condition) ...a}, // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {if (condition) ...b}, // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {if (condition) ...c}, // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {if (condition) ...d}, // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (dynamic e in iterable) ...a}, // Error.
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (dynamic e in iterable) ...b}, // Error.
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (dynamic e in iterable) ...c}, // Error.
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (dynamic e in iterable) ...d}, // Error.
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (int i = 0; i < 42; ++i) ...a}, // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (int i = 0; i < 42; ++i) ...b}, // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (int i = 0; i < 42; ++i) ...c}, // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (int i = 0; i < 42; ++i) ...d}, // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {...x}, // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {...y}, // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {...z}, // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {...w}, // Error.
+//         ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:54:19: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     <int, int>{...x}, // Error.
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:54:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+//     <int, int>{...x}, // Error.
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     <int>{...w}, // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+//     <int>{...w}, // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {if (condition) ...x}, // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {if (condition) ...y}, // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {if (condition) ...z}, // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {if (condition) ...w}, // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (dynamic e in iterable) ...x}, // Error.
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (dynamic e in iterable) ...y}, // Error.
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (dynamic e in iterable) ...z}, // Error.
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (dynamic e in iterable) ...w}, // Error.
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (int i = 0; i < 42; ++i) ...x}, // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (int i = 0; i < 42; ++i) ...y}, // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (int i = 0; i < 42; ++i) ...z}, // Error.
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+//     {for (int i = 0; i < 42; ++i) ...w}, // Error.
+//                                      ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method foo(core::bool condition, core::Iterable<dynamic> iterable, core::List<core::int>? a, core::Set<core::int>? b, core::Iterable<core::int>? c, core::Map<core::int, core::int>? d) → dynamic {
+  return <core::Object>[ block {
+    final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:8:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {...a}, // Error.
+        ^") {
+      final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
+      #t1.{core::Set::add}{Invariant}(#t3){(core::int) → core::bool};
+    }
+  } =>#t1, block {
+    final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t5 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:9:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {...b}, // Error.
+        ^") {
+      final core::int #t6 = #t5 as{TypeError,ForNonNullableByDefault} core::int;
+      #t4.{core::Set::add}{Invariant}(#t6){(core::int) → core::bool};
+    }
+  } =>#t4, block {
+    final core::Set<core::int> #t7 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t8 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:10:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {...c}, // Error.
+        ^") {
+      final core::int #t9 = #t8 as{TypeError,ForNonNullableByDefault} core::int;
+      #t7.{core::Set::add}{Invariant}(#t9){(core::int) → core::bool};
+    }
+  } =>#t7, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:11:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {...d}, // Error.
+        ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:12:19: Error: Unexpected type 'List<int>?' of a map spread entry.  Expected 'dynamic' or a Map.
+ - 'List' is from 'dart:core'.
+    <int, int>{...a}, // Error.
+                  ^": null}, block {
+    final core::Set<core::int> #t10 = col::LinkedHashSet::•<core::int>();
+    #t10.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:13:14: Error: Unexpected type 'Map<int, int>?' of a spread.  Expected 'dynamic' or an Iterable.
+ - 'Map' is from 'dart:core'.
+    <int>{...d}, // Error.
+             ^"){(core::int) → core::bool};
+  } =>#t10, block {
+    final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
+    if(condition)
+      for (final dynamic #t12 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:14:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {if (condition) ...a}, // Error.
+                       ^") {
+        final core::int #t13 = #t12 as{TypeError,ForNonNullableByDefault} core::int;
+        #t11.{core::Set::add}{Invariant}(#t13){(core::int) → core::bool};
+      }
+  } =>#t11, block {
+    final core::Set<core::int> #t14 = col::LinkedHashSet::•<core::int>();
+    if(condition)
+      for (final dynamic #t15 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:15:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {if (condition) ...b}, // Error.
+                       ^") {
+        final core::int #t16 = #t15 as{TypeError,ForNonNullableByDefault} core::int;
+        #t14.{core::Set::add}{Invariant}(#t16){(core::int) → core::bool};
+      }
+  } =>#t14, block {
+    final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>();
+    if(condition)
+      for (final dynamic #t18 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:16:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {if (condition) ...c}, // Error.
+                       ^") {
+        final core::int #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::int;
+        #t17.{core::Set::add}{Invariant}(#t19){(core::int) → core::bool};
+      }
+  } =>#t17, block {
+    final core::Map<core::int, core::int> #t20 = <core::int, core::int>{};
+    if(condition)
+      #t20.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:17:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {if (condition) ...d}, // Error.
+                       ^", null){(core::int, core::int) → void};
+  } =>#t20, block {
+    final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable)
+      for (final dynamic #t22 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:18:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (dynamic e in iterable) ...a}, // Error.
+                                    ^") {
+        final core::int #t23 = #t22 as{TypeError,ForNonNullableByDefault} core::int;
+        #t21.{core::Set::add}{Invariant}(#t23){(core::int) → core::bool};
+      }
+  } =>#t21, block {
+    final core::Set<core::int> #t24 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable)
+      for (final dynamic #t25 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:19:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (dynamic e in iterable) ...b}, // Error.
+                                    ^") {
+        final core::int #t26 = #t25 as{TypeError,ForNonNullableByDefault} core::int;
+        #t24.{core::Set::add}{Invariant}(#t26){(core::int) → core::bool};
+      }
+  } =>#t24, block {
+    final core::Set<core::int> #t27 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable)
+      for (final dynamic #t28 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:20:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (dynamic e in iterable) ...c}, // Error.
+                                    ^") {
+        final core::int #t29 = #t28 as{TypeError,ForNonNullableByDefault} core::int;
+        #t27.{core::Set::add}{Invariant}(#t29){(core::int) → core::bool};
+      }
+  } =>#t27, block {
+    final core::Map<core::int, core::int> #t30 = <core::int, core::int>{};
+    for (dynamic e in iterable)
+      #t30.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:21:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (dynamic e in iterable) ...d}, // Error.
+                                    ^", null){(core::int, core::int) → void};
+  } =>#t30, block {
+    final core::Set<core::int> #t31 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      for (final dynamic #t32 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:22:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (int i = 0; i < 42; ++i) ...a}, // Error.
+                                     ^") {
+        final core::int #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::int;
+        #t31.{core::Set::add}{Invariant}(#t33){(core::int) → core::bool};
+      }
+  } =>#t31, block {
+    final core::Set<core::int> #t34 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      for (final dynamic #t35 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:23:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (int i = 0; i < 42; ++i) ...b}, // Error.
+                                     ^") {
+        final core::int #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::int;
+        #t34.{core::Set::add}{Invariant}(#t36){(core::int) → core::bool};
+      }
+  } =>#t34, block {
+    final core::Set<core::int> #t37 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      for (final dynamic #t38 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:24:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (int i = 0; i < 42; ++i) ...c}, // Error.
+                                     ^") {
+        final core::int #t39 = #t38 as{TypeError,ForNonNullableByDefault} core::int;
+        #t37.{core::Set::add}{Invariant}(#t39){(core::int) → core::bool};
+      }
+  } =>#t37, block {
+    final core::Map<core::int, core::int> #t40 = <core::int, core::int>{};
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      #t40.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:25:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (int i = 0; i < 42; ++i) ...d}, // Error.
+                                     ^", null){(core::int, core::int) → void};
+  } =>#t40, block {
+    final core::Set<core::int> #t41 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t42 = a;
+    if(!(#t42 == null))
+      for (final dynamic #t43 in #t42{core::Iterable<dynamic>}) {
+        final core::int #t44 = #t43 as{TypeError,ForNonNullableByDefault} core::int;
+        #t41.{core::Set::add}{Invariant}(#t44){(core::int) → core::bool};
+      }
+  } =>#t41, block {
+    final core::Set<core::int> #t45 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t46 = b;
+    if(!(#t46 == null))
+      for (final dynamic #t47 in #t46{core::Iterable<dynamic>}) {
+        final core::int #t48 = #t47 as{TypeError,ForNonNullableByDefault} core::int;
+        #t45.{core::Set::add}{Invariant}(#t48){(core::int) → core::bool};
+      }
+  } =>#t45, block {
+    final core::Set<core::int> #t49 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t50 = c;
+    if(!(#t50 == null))
+      for (final dynamic #t51 in #t50{core::Iterable<dynamic>}) {
+        final core::int #t52 = #t51 as{TypeError,ForNonNullableByDefault} core::int;
+        #t49.{core::Set::add}{Invariant}(#t52){(core::int) → core::bool};
+      }
+  } =>#t49, block {
+    final core::Map<core::int, core::int> #t53 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t54 = d;
+    if(!(#t54 == null))
+      for (final core::MapEntry<core::int, core::int> #t55 in #t54{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+        #t53.{core::Map::[]=}{Invariant}(#t55.{core::MapEntry::key}{core::int}, #t55.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+  } =>#t53, block {
+    final core::Set<core::int> #t56 = col::LinkedHashSet::•<core::int>();
+    if(condition) {
+      final core::Iterable<dynamic>? #t57 = a;
+      if(!(#t57 == null))
+        for (final dynamic #t58 in #t57{core::Iterable<dynamic>}) {
+          final core::int #t59 = #t58 as{TypeError,ForNonNullableByDefault} core::int;
+          #t56.{core::Set::add}{Invariant}(#t59){(core::int) → core::bool};
+        }
+    }
+  } =>#t56, block {
+    final core::Set<core::int> #t60 = col::LinkedHashSet::•<core::int>();
+    if(condition) {
+      final core::Iterable<dynamic>? #t61 = b;
+      if(!(#t61 == null))
+        for (final dynamic #t62 in #t61{core::Iterable<dynamic>}) {
+          final core::int #t63 = #t62 as{TypeError,ForNonNullableByDefault} core::int;
+          #t60.{core::Set::add}{Invariant}(#t63){(core::int) → core::bool};
+        }
+    }
+  } =>#t60, block {
+    final core::Set<core::int> #t64 = col::LinkedHashSet::•<core::int>();
+    if(condition) {
+      final core::Iterable<dynamic>? #t65 = c;
+      if(!(#t65 == null))
+        for (final dynamic #t66 in #t65{core::Iterable<dynamic>}) {
+          final core::int #t67 = #t66 as{TypeError,ForNonNullableByDefault} core::int;
+          #t64.{core::Set::add}{Invariant}(#t67){(core::int) → core::bool};
+        }
+    }
+  } =>#t64, block {
+    final core::Map<core::int, core::int> #t68 = <core::int, core::int>{};
+    if(condition) {
+      final core::Map<core::int, core::int>? #t69 = d;
+      if(!(#t69 == null))
+        for (final core::MapEntry<core::int, core::int> #t70 in #t69{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+          #t68.{core::Map::[]=}{Invariant}(#t70.{core::MapEntry::key}{core::int}, #t70.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    }
+  } =>#t68, block {
+    final core::Set<core::int> #t71 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable) {
+      final core::Iterable<dynamic>? #t72 = a;
+      if(!(#t72 == null))
+        for (final dynamic #t73 in #t72{core::Iterable<dynamic>}) {
+          final core::int #t74 = #t73 as{TypeError,ForNonNullableByDefault} core::int;
+          #t71.{core::Set::add}{Invariant}(#t74){(core::int) → core::bool};
+        }
+    }
+  } =>#t71, block {
+    final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable) {
+      final core::Iterable<dynamic>? #t76 = b;
+      if(!(#t76 == null))
+        for (final dynamic #t77 in #t76{core::Iterable<dynamic>}) {
+          final core::int #t78 = #t77 as{TypeError,ForNonNullableByDefault} core::int;
+          #t75.{core::Set::add}{Invariant}(#t78){(core::int) → core::bool};
+        }
+    }
+  } =>#t75, block {
+    final core::Set<core::int> #t79 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable) {
+      final core::Iterable<dynamic>? #t80 = c;
+      if(!(#t80 == null))
+        for (final dynamic #t81 in #t80{core::Iterable<dynamic>}) {
+          final core::int #t82 = #t81 as{TypeError,ForNonNullableByDefault} core::int;
+          #t79.{core::Set::add}{Invariant}(#t82){(core::int) → core::bool};
+        }
+    }
+  } =>#t79, block {
+    final core::Map<core::int, core::int> #t83 = <core::int, core::int>{};
+    for (dynamic e in iterable) {
+      final core::Map<core::int, core::int>? #t84 = d;
+      if(!(#t84 == null))
+        for (final core::MapEntry<core::int, core::int> #t85 in #t84{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+          #t83.{core::Map::[]=}{Invariant}(#t85.{core::MapEntry::key}{core::int}, #t85.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    }
+  } =>#t83, block {
+    final core::Set<core::int> #t86 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+      final core::Iterable<dynamic>? #t87 = a;
+      if(!(#t87 == null))
+        for (final dynamic #t88 in #t87{core::Iterable<dynamic>}) {
+          final core::int #t89 = #t88 as{TypeError,ForNonNullableByDefault} core::int;
+          #t86.{core::Set::add}{Invariant}(#t89){(core::int) → core::bool};
+        }
+    }
+  } =>#t86, block {
+    final core::Set<core::int> #t90 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+      final core::Iterable<dynamic>? #t91 = b;
+      if(!(#t91 == null))
+        for (final dynamic #t92 in #t91{core::Iterable<dynamic>}) {
+          final core::int #t93 = #t92 as{TypeError,ForNonNullableByDefault} core::int;
+          #t90.{core::Set::add}{Invariant}(#t93){(core::int) → core::bool};
+        }
+    }
+  } =>#t90, block {
+    final core::Set<core::int> #t94 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+      final core::Iterable<dynamic>? #t95 = c;
+      if(!(#t95 == null))
+        for (final dynamic #t96 in #t95{core::Iterable<dynamic>}) {
+          final core::int #t97 = #t96 as{TypeError,ForNonNullableByDefault} core::int;
+          #t94.{core::Set::add}{Invariant}(#t97){(core::int) → core::bool};
+        }
+    }
+  } =>#t94, block {
+    final core::Map<core::int, core::int> #t98 = <core::int, core::int>{};
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+      final core::Map<core::int, core::int>? #t99 = d;
+      if(!(#t99 == null))
+        for (final core::MapEntry<core::int, core::int> #t100 in #t99{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+          #t98.{core::Map::[]=}{Invariant}(#t100.{core::MapEntry::key}{core::int}, #t100.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    }
+  } =>#t98];
+}
+static method bar<X extends core::List<core::int>?, Y extends core::Set<core::int>?, Z extends core::Iterable<core::int>?, W extends core::Map<core::int, core::int>?>(core::bool condition, core::Iterable<dynamic> iterable, self::bar::X% x, self::bar::Y% y, self::bar::Z% z, self::bar::W% w) → dynamic {
+  return <core::Object>[ block {
+    final core::Set<core::int> #t101 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t102 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:50:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {...x}, // Error.
+        ^") {
+      final core::int #t103 = #t102 as{TypeError,ForNonNullableByDefault} core::int;
+      #t101.{core::Set::add}{Invariant}(#t103){(core::int) → core::bool};
+    }
+  } =>#t101, block {
+    final core::Set<core::int> #t104 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t105 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:51:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {...y}, // Error.
+        ^") {
+      final core::int #t106 = #t105 as{TypeError,ForNonNullableByDefault} core::int;
+      #t104.{core::Set::add}{Invariant}(#t106){(core::int) → core::bool};
+    }
+  } =>#t104, block {
+    final core::Set<core::int> #t107 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t108 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:52:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {...z}, // Error.
+        ^") {
+      final core::int #t109 = #t108 as{TypeError,ForNonNullableByDefault} core::int;
+      #t107.{core::Set::add}{Invariant}(#t109){(core::int) → core::bool};
+    }
+  } =>#t107, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:53:9: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {...w}, // Error.
+        ^": null}, <core::int, core::int>{invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:54:19: Error: Unexpected type 'X' of a map spread entry.  Expected 'dynamic' or a Map.
+    <int, int>{...x}, // Error.
+                  ^": null}, block {
+    final core::Set<core::int> #t110 = col::LinkedHashSet::•<core::int>();
+    #t110.{core::Set::add}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:55:14: Error: Unexpected type 'W' of a spread.  Expected 'dynamic' or an Iterable.
+    <int>{...w}, // Error.
+             ^"){(core::int) → core::bool};
+  } =>#t110, block {
+    final core::Set<core::int> #t111 = col::LinkedHashSet::•<core::int>();
+    if(condition)
+      for (final dynamic #t112 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:56:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {if (condition) ...x}, // Error.
+                       ^") {
+        final core::int #t113 = #t112 as{TypeError,ForNonNullableByDefault} core::int;
+        #t111.{core::Set::add}{Invariant}(#t113){(core::int) → core::bool};
+      }
+  } =>#t111, block {
+    final core::Set<core::int> #t114 = col::LinkedHashSet::•<core::int>();
+    if(condition)
+      for (final dynamic #t115 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:57:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {if (condition) ...y}, // Error.
+                       ^") {
+        final core::int #t116 = #t115 as{TypeError,ForNonNullableByDefault} core::int;
+        #t114.{core::Set::add}{Invariant}(#t116){(core::int) → core::bool};
+      }
+  } =>#t114, block {
+    final core::Set<core::int> #t117 = col::LinkedHashSet::•<core::int>();
+    if(condition)
+      for (final dynamic #t118 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:58:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {if (condition) ...z}, // Error.
+                       ^") {
+        final core::int #t119 = #t118 as{TypeError,ForNonNullableByDefault} core::int;
+        #t117.{core::Set::add}{Invariant}(#t119){(core::int) → core::bool};
+      }
+  } =>#t117, block {
+    final core::Map<core::int, core::int> #t120 = <core::int, core::int>{};
+    if(condition)
+      #t120.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:59:24: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {if (condition) ...w}, // Error.
+                       ^", null){(core::int, core::int) → void};
+  } =>#t120, block {
+    final core::Set<core::int> #t121 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable)
+      for (final dynamic #t122 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:60:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (dynamic e in iterable) ...x}, // Error.
+                                    ^") {
+        final core::int #t123 = #t122 as{TypeError,ForNonNullableByDefault} core::int;
+        #t121.{core::Set::add}{Invariant}(#t123){(core::int) → core::bool};
+      }
+  } =>#t121, block {
+    final core::Set<core::int> #t124 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable)
+      for (final dynamic #t125 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:61:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (dynamic e in iterable) ...y}, // Error.
+                                    ^") {
+        final core::int #t126 = #t125 as{TypeError,ForNonNullableByDefault} core::int;
+        #t124.{core::Set::add}{Invariant}(#t126){(core::int) → core::bool};
+      }
+  } =>#t124, block {
+    final core::Set<core::int> #t127 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable)
+      for (final dynamic #t128 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:62:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (dynamic e in iterable) ...z}, // Error.
+                                    ^") {
+        final core::int #t129 = #t128 as{TypeError,ForNonNullableByDefault} core::int;
+        #t127.{core::Set::add}{Invariant}(#t129){(core::int) → core::bool};
+      }
+  } =>#t127, block {
+    final core::Map<core::int, core::int> #t130 = <core::int, core::int>{};
+    for (dynamic e in iterable)
+      #t130.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:63:37: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (dynamic e in iterable) ...w}, // Error.
+                                    ^", null){(core::int, core::int) → void};
+  } =>#t130, block {
+    final core::Set<core::int> #t131 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      for (final dynamic #t132 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:64:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (int i = 0; i < 42; ++i) ...x}, // Error.
+                                     ^") {
+        final core::int #t133 = #t132 as{TypeError,ForNonNullableByDefault} core::int;
+        #t131.{core::Set::add}{Invariant}(#t133){(core::int) → core::bool};
+      }
+  } =>#t131, block {
+    final core::Set<core::int> #t134 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      for (final dynamic #t135 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:65:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (int i = 0; i < 42; ++i) ...y}, // Error.
+                                     ^") {
+        final core::int #t136 = #t135 as{TypeError,ForNonNullableByDefault} core::int;
+        #t134.{core::Set::add}{Invariant}(#t136){(core::int) → core::bool};
+      }
+  } =>#t134, block {
+    final core::Set<core::int> #t137 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      for (final dynamic #t138 in invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:66:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (int i = 0; i < 42; ++i) ...z}, // Error.
+                                     ^") {
+        final core::int #t139 = #t138 as{TypeError,ForNonNullableByDefault} core::int;
+        #t137.{core::Set::add}{Invariant}(#t139){(core::int) → core::bool};
+      }
+  } =>#t137, block {
+    final core::Map<core::int, core::int> #t140 = <core::int, core::int>{};
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      #t140.{core::Map::[]=}{Invariant}(invalid-expression "pkg/front_end/testcases/nnbd/issue43495.dart:67:38: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
+    {for (int i = 0; i < 42; ++i) ...w}, // Error.
+                                     ^", null){(core::int, core::int) → void};
+  } =>#t140, block {
+    final core::Set<core::int> #t141 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t142 = x;
+    if(!(#t142 == null))
+      for (final dynamic #t143 in #t142{core::Iterable<dynamic>}) {
+        final core::int #t144 = #t143 as{TypeError,ForNonNullableByDefault} core::int;
+        #t141.{core::Set::add}{Invariant}(#t144){(core::int) → core::bool};
+      }
+  } =>#t141, block {
+    final core::Set<core::int> #t145 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t146 = y;
+    if(!(#t146 == null))
+      for (final dynamic #t147 in #t146{core::Iterable<dynamic>}) {
+        final core::int #t148 = #t147 as{TypeError,ForNonNullableByDefault} core::int;
+        #t145.{core::Set::add}{Invariant}(#t148){(core::int) → core::bool};
+      }
+  } =>#t145, block {
+    final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t150 = z;
+    if(!(#t150 == null))
+      for (final dynamic #t151 in #t150{core::Iterable<dynamic>}) {
+        final core::int #t152 = #t151 as{TypeError,ForNonNullableByDefault} core::int;
+        #t149.{core::Set::add}{Invariant}(#t152){(core::int) → core::bool};
+      }
+  } =>#t149, block {
+    final core::Map<core::int, core::int> #t153 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t154 = w;
+    if(!(#t154 == null))
+      for (final core::MapEntry<core::int, core::int> #t155 in #t154{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+        #t153.{core::Map::[]=}{Invariant}(#t155.{core::MapEntry::key}{core::int}, #t155.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+  } =>#t153, block {
+    final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
+    if(condition) {
+      final core::Iterable<dynamic>? #t157 = x;
+      if(!(#t157 == null))
+        for (final dynamic #t158 in #t157{core::Iterable<dynamic>}) {
+          final core::int #t159 = #t158 as{TypeError,ForNonNullableByDefault} core::int;
+          #t156.{core::Set::add}{Invariant}(#t159){(core::int) → core::bool};
+        }
+    }
+  } =>#t156, block {
+    final core::Set<core::int> #t160 = col::LinkedHashSet::•<core::int>();
+    if(condition) {
+      final core::Iterable<dynamic>? #t161 = y;
+      if(!(#t161 == null))
+        for (final dynamic #t162 in #t161{core::Iterable<dynamic>}) {
+          final core::int #t163 = #t162 as{TypeError,ForNonNullableByDefault} core::int;
+          #t160.{core::Set::add}{Invariant}(#t163){(core::int) → core::bool};
+        }
+    }
+  } =>#t160, block {
+    final core::Set<core::int> #t164 = col::LinkedHashSet::•<core::int>();
+    if(condition) {
+      final core::Iterable<dynamic>? #t165 = z;
+      if(!(#t165 == null))
+        for (final dynamic #t166 in #t165{core::Iterable<dynamic>}) {
+          final core::int #t167 = #t166 as{TypeError,ForNonNullableByDefault} core::int;
+          #t164.{core::Set::add}{Invariant}(#t167){(core::int) → core::bool};
+        }
+    }
+  } =>#t164, block {
+    final core::Map<core::int, core::int> #t168 = <core::int, core::int>{};
+    if(condition) {
+      final core::Map<core::int, core::int>? #t169 = w;
+      if(!(#t169 == null))
+        for (final core::MapEntry<core::int, core::int> #t170 in #t169{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+          #t168.{core::Map::[]=}{Invariant}(#t170.{core::MapEntry::key}{core::int}, #t170.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    }
+  } =>#t168, block {
+    final core::Set<core::int> #t171 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable) {
+      final core::Iterable<dynamic>? #t172 = x;
+      if(!(#t172 == null))
+        for (final dynamic #t173 in #t172{core::Iterable<dynamic>}) {
+          final core::int #t174 = #t173 as{TypeError,ForNonNullableByDefault} core::int;
+          #t171.{core::Set::add}{Invariant}(#t174){(core::int) → core::bool};
+        }
+    }
+  } =>#t171, block {
+    final core::Set<core::int> #t175 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable) {
+      final core::Iterable<dynamic>? #t176 = y;
+      if(!(#t176 == null))
+        for (final dynamic #t177 in #t176{core::Iterable<dynamic>}) {
+          final core::int #t178 = #t177 as{TypeError,ForNonNullableByDefault} core::int;
+          #t175.{core::Set::add}{Invariant}(#t178){(core::int) → core::bool};
+        }
+    }
+  } =>#t175, block {
+    final core::Set<core::int> #t179 = col::LinkedHashSet::•<core::int>();
+    for (dynamic e in iterable) {
+      final core::Iterable<dynamic>? #t180 = z;
+      if(!(#t180 == null))
+        for (final dynamic #t181 in #t180{core::Iterable<dynamic>}) {
+          final core::int #t182 = #t181 as{TypeError,ForNonNullableByDefault} core::int;
+          #t179.{core::Set::add}{Invariant}(#t182){(core::int) → core::bool};
+        }
+    }
+  } =>#t179, block {
+    final core::Map<core::int, core::int> #t183 = <core::int, core::int>{};
+    for (dynamic e in iterable) {
+      final core::Map<core::int, core::int>? #t184 = w;
+      if(!(#t184 == null))
+        for (final core::MapEntry<core::int, core::int> #t185 in #t184{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+          #t183.{core::Map::[]=}{Invariant}(#t185.{core::MapEntry::key}{core::int}, #t185.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    }
+  } =>#t183, block {
+    final core::Set<core::int> #t186 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+      final core::Iterable<dynamic>? #t187 = x;
+      if(!(#t187 == null))
+        for (final dynamic #t188 in #t187{core::Iterable<dynamic>}) {
+          final core::int #t189 = #t188 as{TypeError,ForNonNullableByDefault} core::int;
+          #t186.{core::Set::add}{Invariant}(#t189){(core::int) → core::bool};
+        }
+    }
+  } =>#t186, block {
+    final core::Set<core::int> #t190 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+      final core::Iterable<dynamic>? #t191 = y;
+      if(!(#t191 == null))
+        for (final dynamic #t192 in #t191{core::Iterable<dynamic>}) {
+          final core::int #t193 = #t192 as{TypeError,ForNonNullableByDefault} core::int;
+          #t190.{core::Set::add}{Invariant}(#t193){(core::int) → core::bool};
+        }
+    }
+  } =>#t190, block {
+    final core::Set<core::int> #t194 = col::LinkedHashSet::•<core::int>();
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+      final core::Iterable<dynamic>? #t195 = z;
+      if(!(#t195 == null))
+        for (final dynamic #t196 in #t195{core::Iterable<dynamic>}) {
+          final core::int #t197 = #t196 as{TypeError,ForNonNullableByDefault} core::int;
+          #t194.{core::Set::add}{Invariant}(#t197){(core::int) → core::bool};
+        }
+    }
+  } =>#t194, block {
+    final core::Map<core::int, core::int> #t198 = <core::int, core::int>{};
+    for (core::int i = 0; i.{core::num::<}(42){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+      final core::Map<core::int, core::int>? #t199 = w;
+      if(!(#t199 == null))
+        for (final core::MapEntry<core::int, core::int> #t200 in #t199{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+          #t198.{core::Map::[]=}{Invariant}(#t200.{core::MapEntry::key}{core::int}, #t200.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    }
+  } =>#t198];
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43536.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43536.dart.weak.modular.expect
new file mode 100644
index 0000000..fc2321b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43536.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%>
+    : super core::Object::•()
+    ;
+  method foo<covariant-by-class E extends self::C::T%>(core::List<self::C::foo::E%> list) → dynamic {
+    core::List<self::C::foo::E%> variable = this.{self::C::method}<self::C::foo::E%>(list){(core::List<self::C::foo::E%>) → core::List<self::C::foo::E%>};
+  }
+  method method<covariant-by-class F extends self::C::T%>(core::List<self::C::method::F%> list) → core::List<self::C::method::F%>
+    return list;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43591.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.modular.expect
new file mode 100644
index 0000000..7bb6ecb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43591.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E<T extends core::Object? = dynamic> on T% {
+  get f = self::E|get#f;
+}
+static method E|get#f<T extends core::Object? = dynamic>(lowered final self::E|get#f::T% #this) → (self::E|get#f::T%) → self::E|get#f::T%
+  return (self::E|get#f::T% t) → self::E|get#f::T% => t;
+static method method1<S extends core::Object? = dynamic>(self::method1::S% s) → dynamic {
+  (self::method1::S%) → self::method1::S% f = self::E|get#f<self::method1::S%>(s);
+}
+static method method2<S extends dynamic>(self::method2::S% s) → dynamic {
+  self::throws(() → void => s{dynamic}.f);
+}
+static method main() → dynamic {}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object e) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43689.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43689.dart.weak.modular.expect
new file mode 100644
index 0000000..aa327e3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43689.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:6:17: Error: 'y' is already declared in this scope.
+// late final int? y;
+//                 ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:5:16: Context: Previous declaration of 'y'.
+// late final int y;
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+//   late final int? x;
+//                   ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:9:18: Context: Previous declaration of 'x'.
+//   late final int x;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+//   int? z;
+//        ^
+// pkg/front_end/testcases/nnbd/issue43689.dart:11:7: Context: Previous declaration of 'z'.
+//   int z;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+late static final [setter] field core::int y;
+static method test() → dynamic {
+  late final core::int x;
+  late final core::int? x = invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:10:19: Error: 'x' is already declared in this scope.
+  late final int? x;
+                  ^";
+  core::int z;
+  core::int? z = invalid-expression "pkg/front_end/testcases/nnbd/issue43689.dart:12:8: Error: 'z' is already declared in this scope.
+  int? z;
+       ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.modular.expect
new file mode 100644
index 0000000..2ed0f16
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//     return z.x; // Error.
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends self::C<self::C::X%, self::C::X%>? = self::C<dynamic, dynamic>?, Y extends self::C<self::C::Y%, self::C::Y%>? = self::C<dynamic, dynamic>?> extends core::Object {
+  covariant-by-class field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%, self::C::Y%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m(covariant-by-class self::C::X% x, covariant-by-class self::C::Y% y) → core::Object {
+    self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
+    if(z == null)
+      throw 0;
+    return invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object' because 'Object?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+    return z.x; // Error.
+             ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x}{core::Object?} as{TypeError,ForNonNullableByDefault} core::Object;
+  }
+}
+static field core::bool b = true;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.modular.expect
new file mode 100644
index 0000000..98741d8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+//     z(42); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends (self::C::X%) →? void = (Never) →? void> extends core::Object {
+  covariant-by-class field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m() → void {
+    (Never) →? void z = self::b ?{(Never) →? void} this.{self::C::x}{self::C::X%} : #C1;
+    if(z == null)
+      return;
+    z{(Never) → void}(invalid-expression "pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+    z(42); // Error.
+      ^" in 42 as{TypeError,ForNonNullableByDefault} Never){(Never) → void};
+  }
+}
+static field core::bool b = true;
+static method f(core::Object o) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::f
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.modular.expect
new file mode 100644
index 0000000..da9759d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
+//  - 'Object' is from 'dart:core'.
+//   foo(z); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method foo(core::Object x) → dynamic {}
+static method bar(core::bool condition) → dynamic {
+  FutureOr<core::int?>x = null;
+  core::num n = 1;
+  FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
+  self::foo(invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object' because 'num?' is nullable and 'Object' isn't.
+ - 'Object' is from 'dart:core'.
+  foo(z); // Error.
+      ^" in z as{TypeError,ForNonNullableByDefault} core::Object);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43918.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.modular.expect
new file mode 100644
index 0000000..9882343
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43918.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •<T extends core::Object? = dynamic>(self::A::•::T% value) → self::A<self::A::•::T%>
+    return new self::_A::•<self::A::•::T%>(value);
+}
+class _A<T extends core::Object? = dynamic> extends core::Object implements self::A<self::_A::T%> {
+  constructor •(self::_A::T% value) → self::_A<self::_A::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  static factory •<T extends core::Object? = dynamic>(core::int value) → self::B<self::B::•::T%>
+    return new self::_B::•<self::B::•::T%>(value);
+}
+class _B<T extends core::Object? = dynamic> extends core::Object implements self::B<self::_B::T%> {
+  constructor •(core::int value) → self::_B<self::_B::T%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::B::•
+}
diff --git a/pkg/front_end/testcases/nnbd/issue44276.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue44276.dart.weak.modular.expect
new file mode 100644
index 0000000..ce89c73
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44276.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  field core::int? value1 = null;
+  field core::int? value2 = null;
+  synthetic constructor •() → self::Base
+    : super core::Object::•()
+    ;
+}
+static method main() → void {
+  self::fun();
+}
+static method fun() → core::int? {
+  self::Base? a;
+  final core::int? b = let final core::int? #t1 = let final self::Base? #t2 = a in #t2 == null ?{core::int?} null : #t2{self::Base}.{self::Base::value1}{core::int?} in #t1 == null ?{core::int?} let final self::Base? #t3 = a in #t3 == null ?{core::int?} null : #t3{self::Base}.{self::Base::value2}{core::int?} : #t1{core::int};
+  return b;
+}
diff --git a/pkg/front_end/testcases/nnbd/issue44362.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue44362.dart.weak.modular.expect
new file mode 100644
index 0000000..3e32ea9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44362.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method foo<X extends core::Object? = dynamic>(self::foo::X? x) → dynamic {
+  if(x is{ForNonNullableByDefault} core::int) {
+    self::bar<dynamic>(x{self::foo::X? & core::int /* '?' & '!' = '!' */});
+  }
+}
+static method bar<Y extends core::Object? = dynamic>(dynamic y) → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue44455.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.modular.expect
new file mode 100644
index 0000000..d0065b3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44455.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:6:9: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F'.
+// Try changing type arguments so that they conform to the bounds.
+// class A<X extends F<X>> {}
+//         ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:5:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<Y extends num> = Y Function();
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue44455.dart:8:10: Error: Type argument 'X' doesn't conform to the bound 'num' of the type variable 'Y' on 'F2'.
+// Try changing type arguments so that they conform to the bounds.
+// class A2<X extends F2<X>> {}
+//          ^
+// pkg/front_end/testcases/nnbd/issue44455.dart:9:12: Context: This is the type variable whose bound isn't conformed to.
+// typedef F2<Y extends num> = Y Function();
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<Y extends core::num> = () → Y;
+typedef F2<Y extends core::num> = () → Y;
+class A<X extends () → self::A::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class A2<X extends () → self::A2::X = () → dynamic> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue44595.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue44595.dart.weak.modular.expect
new file mode 100644
index 0000000..150af53
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44595.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef Exactly<invariant T extends core::Object? = dynamic> = (T%) → T%;
+extension _extension#0<T extends core::Object? = dynamic> on T% {
+  method checkStaticType = self::_extension#0|checkStaticType;
+  tearoff checkStaticType = self::_extension#0|get#checkStaticType;
+}
+static method id<T extends core::Object? = dynamic>(self::id::T% value) → self::id::T%
+  return value;
+static method main() → dynamic async {
+  FutureOr<core::int>x = 1.{core::num::+}(self::id<core::int>(1)){(core::num) → core::int};
+  FutureOr<core::int>y = let final core::int #t1 = 1.{core::num::+}(self::id<core::int>(1)){(core::num) → core::int} in block {
+    self::_extension#0|checkStaticType<core::int, (core::int) → core::int>(#t1);
+  } =>#t1;
+  FutureOr<core::int>z = let final core::int #t2 = 1.{core::num::+}(self::contextType<core::int>(1)){(core::num) → core::int} in block {
+    self::_extension#0|checkStaticType<core::int, (core::int) → core::int>(#t2);
+  } =>#t2;
+}
+static method _extension#0|checkStaticType<T extends core::Object? = dynamic, R extends (self::_extension#0|checkStaticType::T%) → self::_extension#0|checkStaticType::T% = (dynamic) → dynamic>(lowered final self::_extension#0|checkStaticType::T% #this) → void {}
+static method _extension#0|get#checkStaticType<T extends core::Object? = dynamic>(lowered final self::_extension#0|get#checkStaticType::T% #this) → <R extends (self::_extension#0|get#checkStaticType::T%) → self::_extension#0|get#checkStaticType::T% = (dynamic) → dynamic>() → void
+  return <R extends (self::_extension#0|get#checkStaticType::T%) → self::_extension#0|get#checkStaticType::T% = (dynamic) → dynamic>() → void => self::_extension#0|checkStaticType<self::_extension#0|get#checkStaticType::T%, R>(#this);
+static method contextType<T extends core::Object? = dynamic>(core::Object? o) → self::contextType::T%
+  return o as{ForNonNullableByDefault} self::contextType::T%;
diff --git a/pkg/front_end/testcases/nnbd/issue44857.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.modular.expect
new file mode 100644
index 0000000..528dcbd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue44857.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (<T extends Never = dynamic>(T) → void) → Never;
+static method main() → void {
+  core::print("Are ${#C1}, ${#C1} identical?");
+  core::print(core::identical(#C1, #C1));
+}
+
+constants  {
+  #C1 = TypeLiteralConstant((<T extends Never* = dynamic>(Never*) →* void) →* Never*)
+}
diff --git a/pkg/front_end/testcases/nnbd/issue45598.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue45598.dart.weak.modular.expect
new file mode 100644
index 0000000..b03a7ab
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue45598.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method foo(<X extends Z% = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic>({m: core::Map<Y%, Z%>}) → dynamic bar, core::Map<core::String, core::String> m) → dynamic {
+  bar<core::String, core::String, core::String>(m: m){({m: core::Map<core::String, core::String>}) → dynamic};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue45598_2.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue45598_2.dart.weak.modular.expect
new file mode 100644
index 0000000..f0813ae
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue45598_2.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method foo(core::Map<core::String, core::String> m) → dynamic {
+  function bar<X extends Z% = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic>({required core::Map<Y%, Z%> m = #C1}) → void {}
+  bar<core::String, core::String, core::String>(m: m){({required m: core::Map<core::String, core::String>}) → void};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue47311.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue47311.dart.weak.modular.expect
new file mode 100644
index 0000000..baea864
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue47311.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef Baz<invariant T extends core::Object? = dynamic> = (T%) → T%;
+class Foo1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo1<self::Foo1::T%>
+    : super core::Object::•()
+    ;
+  method method<covariant-by-class S extends self::Foo1::T%>((self::Foo1::method::S%) → self::Foo1::method::S% x) → void {}
+}
+class Bar1 extends core::Object implements self::Foo1<core::Object> {
+  synthetic constructor •() → self::Bar1
+    : super core::Object::•()
+    ;
+  method method<covariant-by-class T extends core::Object>((self::Bar1::method::T) → self::Bar1::method::T x) → void {}
+}
+class Foo2<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo2<self::Foo2::T%>
+    : super core::Object::•()
+    ;
+  method method<V extends self::Foo2::method::S% = self::Foo2::T%, covariant-by-class S extends self::Foo2::T%>((self::Foo2::method::S%) → self::Foo2::method::S% x, (self::Foo2::method::V%) → self::Foo2::method::V% y) → void {}
+}
+class Bar2 extends core::Object implements self::Foo2<core::Object> {
+  synthetic constructor •() → self::Bar2
+    : super core::Object::•()
+    ;
+  method method<V extends self::Bar2::method::T = core::Object, covariant-by-class T extends core::Object>((self::Bar2::method::T) → self::Bar2::method::T x, (self::Bar2::method::V) → self::Bar2::method::V y) → void {}
+}
+class Foo3<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo3<self::Foo3::T%>
+    : super core::Object::•()
+    ;
+  method method<V extends self::Foo3::method::S% = FutureOr<self::Foo3::T%>, covariant-by-class S extends FutureOr<self::Foo3::T%>>((self::Foo3::method::S%) → self::Foo3::method::S% x, (self::Foo3::method::V%) → self::Foo3::method::V% y) → void {}
+}
+class Bar3 extends core::Object implements self::Foo3<core::Object> {
+  synthetic constructor •() → self::Bar3
+    : super core::Object::•()
+    ;
+  method method<V extends self::Bar3::method::T = FutureOr<core::Object>, covariant-by-class T extends FutureOr<core::Object>>((self::Bar3::method::T) → self::Bar3::method::T x, (self::Bar3::method::V) → self::Bar3::method::V y) → void {}
+}
+class Foo4<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo4<self::Foo4::T%>
+    : super core::Object::•()
+    ;
+  method method<V extends FutureOr<self::Foo4::method::S%> = FutureOr<self::Foo4::T%>, covariant-by-class S extends self::Foo4::T%>((self::Foo4::method::S%) → self::Foo4::method::S% x, (self::Foo4::method::V%) → self::Foo4::method::V% y) → void {}
+}
+class Bar4 extends core::Object implements self::Foo4<core::Object> {
+  synthetic constructor •() → self::Bar4
+    : super core::Object::•()
+    ;
+  method method<V extends FutureOr<self::Bar4::method::T> = FutureOr<core::Object>, covariant-by-class T extends core::Object>((self::Bar4::method::T) → self::Bar4::method::T x, (self::Bar4::method::V) → self::Bar4::method::V y) → void {}
+}
+class Foo5<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo5<self::Foo5::T%>
+    : super core::Object::•()
+    ;
+  method method<V extends FutureOr<self::Foo5::method::S%> = FutureOr<FutureOr<self::Foo5::T%>>, covariant-by-class S extends FutureOr<self::Foo5::T%>>((self::Foo5::method::S%) → self::Foo5::method::S% x, (self::Foo5::method::V%) → self::Foo5::method::V% y) → void {}
+}
+class Bar5 extends core::Object implements self::Foo5<core::Object> {
+  synthetic constructor •() → self::Bar5
+    : super core::Object::•()
+    ;
+  method method<V extends FutureOr<self::Bar5::method::T> = FutureOr<FutureOr<core::Object>>, covariant-by-class T extends FutureOr<core::Object>>((self::Bar5::method::T) → self::Bar5::method::T x, (self::Bar5::method::V) → self::Bar5::method::V y) → void {}
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.modular.expect
new file mode 100644
index 0000000..ebe9eae
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method f() → self::D?
+    return new self::D::•();
+  method h() → void {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  method g() → void {}
+}
+static method test(self::C x) → void {
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}(){() → self::D?}!.{self::D::g}(){() → void};
+    #t1.{self::C::h}(){() → void};
+  } =>#t1;
+}
+static method main() → dynamic {
+  self::test(new self::C::•());
+}
diff --git a/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.modular.expect
new file mode 100644
index 0000000..261dcc1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue_39286_2.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue_39286_2.dart:15:14: Warning: Operand of null-aware operation '!' has type 'String' which excludes null.
+//   x..f()!.g()['Hi!']!..h()!.y = 2;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue_39286_2.dart:15:24: Warning: Operand of null-aware operation '!' has type 'C' which excludes null.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/issue_39286_2.dart'.
+//   x..f()!.g()['Hi!']!..h()!.y = 2;
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int y = 42;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method f() → self::D?
+    return new self::D::•();
+  method h() → self::C
+    return this;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  method g() → self::D
+    return this;
+  operator [](core::String s) → core::String {
+    return "!${s}!";
+  }
+}
+static method test(self::C x) → void {
+  let final self::C #t1 = x in block {
+    #t1.{self::C::f}(){() → self::D?}!.{self::D::g}(){() → self::D}.{self::D::[]}("Hi!"){(core::String) → core::String}!;
+    #t1.{self::C::h}(){() → self::C}!.{self::C::y} = 2;
+  } =>#t1;
+}
+static method main() → dynamic {
+  self::test(new self::C::•());
+}
diff --git a/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.modular.expect
new file mode 100644
index 0000000..aa91968
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/language_issue1182.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<S extends core::num> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::S>
+    : super core::Object::•()
+    ;
+  method test1(covariant-by-class self::Foo::S x) → void {
+    (self::Foo::S) → self::Foo::S f = self::Test|get#test<self::Foo::S>(x);
+  }
+}
+extension Test<T extends core::Object? = dynamic> on T% {
+  get test = self::Test|get#test;
+}
+static method Test|get#test<T extends core::Object? = dynamic>(lowered final self::Test|get#test::T% #this) → (self::Test|get#test::T%) → self::Test|get#test::T%
+  return (self::Test|get#test::T% a) → self::Test|get#test::T% => #this;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/late.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/late.dart.weak.modular.expect
new file mode 100644
index 0000000..3eaeb2c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/late.dart.weak.modular.expect
@@ -0,0 +1,105 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/late.dart:40:5: Error: Can't assign to the final variable 'lateFinalVariableWithInit'.
+//     lateFinalVariableWithInit = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/late.dart:44:5: Error: Setter not found: 'lateFinalStaticFieldWithInit'.
+//     lateFinalStaticFieldWithInit = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/late.dart:42:5: Error: The setter 'lateFinalInstanceFieldWithInit' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/late.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'lateFinalInstanceFieldWithInit'.
+//     lateFinalInstanceFieldWithInit = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/late.dart:63:3: Error: Setter not found: 'lateFinalTopLevelFieldWithInit'.
+//   lateFinalTopLevelFieldWithInit = 0;
+//   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/late.dart:67:9: Error: Setter not found: 'lateFinalStaticFieldWithInit'.
+//   Class.lateFinalStaticFieldWithInit = 0;
+//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/late.dart:65:5: Error: The setter 'lateFinalInstanceFieldWithInit' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/late.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'lateFinalInstanceFieldWithInit'.
+//   c.lateFinalInstanceFieldWithInit = 0;
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  late field core::int lateInstanceField;
+  late final [setter] field core::int lateFinalInstanceField1;
+  late final [setter] field core::int lateFinalInstanceField2;
+  late final field core::int lateFinalInstanceFieldWithInit = 0;
+  late field self::Class lateInstanceFieldThis = this;
+  late final field self::Class lateFinalInstanceFieldThis = this;
+  late static field core::int lateStaticField;
+  late static final [setter] field core::int lateFinalStaticField1;
+  late static final [setter] field core::int lateFinalStaticField2;
+  late static final field core::int lateFinalStaticFieldWithInit = 0;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    late core::int lateVariable;
+    late final core::int lateFinalVariable;
+    late final core::int lateFinalVariableWithInit = 0;
+    lateVariable = 0;
+    lateFinalVariable = 0;
+    this.{self::Class::lateInstanceField} = 0;
+    this.{self::Class::lateFinalInstanceField1} = 0;
+    self::Class::lateStaticField = 0;
+    self::Class::lateFinalStaticField1 = 0;
+  }
+  method methodWithErrors() → dynamic {
+    late final core::int lateFinalVariableWithInit = 0;
+    invalid-expression "pkg/front_end/testcases/nnbd/late.dart:40:5: Error: Can't assign to the final variable 'lateFinalVariableWithInit'.
+    lateFinalVariableWithInit = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^";
+    invalid-expression "pkg/front_end/testcases/nnbd/late.dart:42:5: Error: The setter 'lateFinalInstanceFieldWithInit' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/late.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'lateFinalInstanceFieldWithInit'.
+    lateFinalInstanceFieldWithInit = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in this{<unresolved>}.lateFinalInstanceFieldWithInit = 0;
+    invalid-expression "pkg/front_end/testcases/nnbd/late.dart:44:5: Error: Setter not found: 'lateFinalStaticFieldWithInit'.
+    lateFinalStaticFieldWithInit = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  }
+}
+late static field core::int lateTopLevelField;
+late static final [setter] field core::int lateFinalTopLevelField;
+late static final field core::int lateFinalTopLevelFieldWithInit = 0;
+static method main() → dynamic {}
+static method noErrors() → dynamic {
+  self::lateTopLevelField = 0;
+  self::lateFinalTopLevelField = 0;
+  self::Class c1 = new self::Class::•();
+  c1.{self::Class::method}(){() → dynamic};
+  self::Class c2 = new self::Class::•();
+  c2.{self::Class::lateInstanceField} = 0;
+  c2.{self::Class::lateFinalInstanceField2} = 0;
+  self::Class::lateStaticField = 0;
+  self::Class::lateFinalStaticField2 = 0;
+}
+static method errors() → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/late.dart:63:3: Error: Setter not found: 'lateFinalTopLevelFieldWithInit'.
+  lateFinalTopLevelFieldWithInit = 0;
+  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  self::Class c = new self::Class::•();
+  invalid-expression "pkg/front_end/testcases/nnbd/late.dart:65:5: Error: The setter 'lateFinalInstanceFieldWithInit' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/late.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'lateFinalInstanceFieldWithInit'.
+  c.lateFinalInstanceFieldWithInit = 0;
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in c{<unresolved>}.lateFinalInstanceFieldWithInit = 0;
+  c.{self::Class::methodWithErrors}(){() → dynamic};
+  invalid-expression "pkg/front_end/testcases/nnbd/late.dart:67:9: Error: Setter not found: 'lateFinalStaticFieldWithInit'.
+  Class.lateFinalStaticFieldWithInit = 0;
+        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.modular.expect
new file mode 100644
index 0000000..63fc71a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.modular.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/later.dart:12:7: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   foo(late int x) {}
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:15:5: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+// bar(late int x) {}
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:20:28: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
+// No types are needed, the first is given by 'on', the second is always 'StackTrace'.
+//   } on dynamic catch (late e, late t) {}
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/later.dart:20:31: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   } on dynamic catch (late e, late t) {}
+//                               ^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:20:36: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
+// No types are needed, the first is given by 'on', the second is always 'StackTrace'.
+//   } on dynamic catch (late e, late t) {}
+//                                    ^
+//
+// pkg/front_end/testcases/nnbd/later.dart:21:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late int i = 0; i < 10; ++i) {
+//        ^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:24:8: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   for (late String s in ["baz"]) {
+//        ^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:27:9: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   [for (late int i = 0; i < 10; ++i) i];
+//         ^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:31:14: Error: Can't have modifier 'late' here.
+// Try removing 'late'.
+//   await for (late String s in new Stream.fromIterable(["hest"])) {
+//              ^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:38:20: Error: `await` expressions are not supported in late local initializers.
+//   late String s1 = await hest();
+//                    ^^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:39:30: Error: `await` expressions are not supported in late local initializers.
+//   late String s2 = '${fisk}${await hest()}${fisk}';
+//                              ^^^^^
+//
+// pkg/front_end/testcases/nnbd/later.dart:44:18: Error: Can't have a late final field in a class with a const constructor.
+//   late final int x = 42;
+//                  ^
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Context: This constructor is const.
+//   const B();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  field core::int a = 42;
+  late field core::int b = this.{self::A::a}{core::int}.{core::num::*}(2){(core::num) → core::int}.{core::int::>>}(1){(core::int) → core::int};
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo(core::int x) → dynamic {}
+}
+class B extends core::Object /*hasConstConstructor*/  {
+  late final field core::int x = 42;
+  const constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  late final [setter] field core::int x;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method initVars() → dynamic {
+    this.{self::C::x} = 42;
+  }
+}
+static method bar(core::int x) → dynamic {}
+static method baz() → dynamic {
+  {
+    {
+      invalid-expression "pkg/front_end/testcases/nnbd/later.dart:20:36: Error: 'catch' must be followed by '(identifier)' or '(identifier, identifier)'.
+No types are needed, the first is given by 'on', the second is always 'StackTrace'.
+  } on dynamic catch (late e, late t) {}
+                                   ^";
+    }
+    try {
+      throw "baz";
+    }
+    on dynamic catch(final dynamic late, final core::StackTrace e) {
+    }
+  }
+  for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    core::print("baz");
+  }
+  for (core::String s in <core::String>["baz"]) {
+    core::print(s);
+  }
+  block {
+    final core::List<core::int> #t1 = <core::int>[];
+    for (core::int i = 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
+      #t1.{core::List::add}{Invariant}(i){(core::int) → void};
+  } =>#t1;
+}
+static method hest() → dynamic async {
+  await for (core::String s in asy::Stream::fromIterable<core::String>(<core::String>["hest"])) {
+    core::print(s);
+  }
+  return "hest";
+}
+static method fisk() → dynamic async {
+  late core::String s1 = invalid-expression "pkg/front_end/testcases/nnbd/later.dart:38:20: Error: `await` expressions are not supported in late local initializers.
+  late String s1 = await hest();
+                   ^^^^^";
+  late core::String s2 = "${#C1}${invalid-expression "pkg/front_end/testcases/nnbd/later.dart:39:30: Error: `await` expressions are not supported in late local initializers.
+  late String s2 = '\${fisk}\${await hest()}\${fisk}';
+                             ^^^^^"}${#C1}";
+  late core::Function f = () → asy::Future<dynamic> async => await self::hest();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::fisk
+}
diff --git a/pkg/front_end/testcases/nnbd/lhs_of_if_null.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/lhs_of_if_null.dart.weak.modular.expect
new file mode 100644
index 0000000..42bf683
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/lhs_of_if_null.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f() → core::Object
+  return let final core::Object? #t1 = self::g<core::Object?>(null) in #t1 == null ?{core::Object} 0 : #t1{core::Object};
+static method g<T extends core::Object? = dynamic>(self::g::T% t) → self::g::T%
+  return t;
+static method main() → dynamic {
+  core::print(self::f());
+}
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..6ebdc4c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
+// Try using List.filled instead.
+//   new List<T>(42);
+//       ^
+//
+// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
+// Try using List.filled instead.
+//   new List<int?>(42);
+//       ^
+//
+// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
+// Try using List.filled instead.
+//   new List<int>(42);
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo<T extends core::Object?>() → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<T>(42);
+      ^" in core::List::•<self::foo::T%>(42);
+  invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<int?>(42);
+      ^" in core::List::•<core::int?>(42);
+  invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<int>(42);
+      ^" in core::List::•<core::int>(42);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/load_library.dart.weak.modular.expect
new file mode 100644
index 0000000..885e631
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:math" deferred as math;
+
+static method main() → dynamic {
+  asy::Future<dynamic> v1 = LoadLibrary(math);
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {}){((dynamic) → FutureOr<Null>, {onError: core::Function?}) → asy::Future<Null>};
+  () → asy::Future<dynamic> v2 = #C1;
+  v2(){() → asy::Future<dynamic>}.{asy::Future::then}<Null>((dynamic _) → Null {}){((dynamic) → FutureOr<Null>, {onError: core::Function?}) → asy::Future<Null>};
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+  return LoadLibrary(math);
+
+constants  {
+  #C1 = static-tearoff self::_#loadLibrary_math
+}
diff --git a/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.modular.expect
new file mode 100644
index 0000000..9319364
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/main_declaration.dart.weak.modular.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///main_declaration_class_lib.dart" as class_lib;
+import "org-dartlang-testcase:///main_declaration_extension_lib.dart" as extension_lib;
+import "org-dartlang-testcase:///main_declaration_field_lib.dart" as field_lib;
+import "org-dartlang-testcase:///main_declaration_getter_lib.dart" as getter_lib;
+import "org-dartlang-testcase:///main_declaration_method_extra_optional_parameters_lib.dart" as method_extra_optional_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_named_parameters_lib.dart" as method_named_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_one_optional_parameter_lib.dart" as method_one_optional_parameter_lib;
+import "org-dartlang-testcase:///main_declaration_method_one_parameter_lib.dart" as method_one_parameter_lib;
+import "org-dartlang-testcase:///main_declaration_method_one_required_optional_lib.dart" as method_one_required_optional_lib;
+import "org-dartlang-testcase:///main_declaration_method_required_named_parameters_lib.dart" as method_required_named_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_too_many_parameters_lib.dart" as method_too_many_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_two_optional_parameters_lib.dart" as method_two_optional_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_two_parameters_lib.dart" as method_two_parameters_lib;
+import "org-dartlang-testcase:///main_declaration_method_wrong_parameter_type_lib.dart" as method_wrong_parameter_type_lib;
+import "org-dartlang-testcase:///main_declaration_setter_lib.dart" as setter_lib;
+import "org-dartlang-testcase:///main_declaration_typedef_lib.dart" as typedef_lib;
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_class_lib.dart:5:7: Error: The 'main' declaration must be a function declaration.
+// class main /* error */ {}
+//       ^
+//
+import self as self2;
+import "dart:core" as core;
+
+class main extends core::Object {
+  synthetic constructor •() → self2::main
+    : super core::Object::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_extension_lib.dart:5:11: Error: The 'main' declaration must be a function declaration.
+// extension main /* error */ on Object {}
+//           ^
+//
+import self as self3;
+import "dart:core" as core;
+
+extension main on core::Object {
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_field_lib.dart:5:17: Error: The 'main' declaration must be a function declaration.
+// void Function() main /* error */ = () {};
+//                 ^^^^
+//
+import self as self4;
+
+static field () → void main = () → void {};
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_getter_lib.dart:5:21: Error: The 'main' declaration must be a function declaration.
+// void Function() get main /* error */ => () {};
+//                     ^^^^
+//
+import self as self5;
+
+static get main() → () → void
+  return () → void {};
+
+library /*isNonNullableByDefault*/;
+import self as self6;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args, dynamic other, [dynamic extra = #C1]) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as self7;
+import "dart:core" as core;
+
+static method main({core::List<core::String> args = #C2}) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as self8;
+import "dart:core" as core;
+
+static method main([core::List<core::String>? args = #C1]) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as self9;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as self10;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args, [dynamic other = #C1]) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_method_required_named_parameters_lib.dart:5:6: Error: The 'main' method cannot have required named parameters.
+// void main({required List<String> args}) /* error */ {}
+//      ^^^^
+//
+import self as self11;
+import "dart:core" as core;
+
+static method main({required core::List<core::String> args = #C1}) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_method_too_many_parameters_lib.dart:5:6: Error: The 'main' method must have at most 2 required parameters.
+// void main(List<String> args, a, b) /* error */ {}
+//      ^^^^
+//
+import self as self12;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args, dynamic a, dynamic b) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as self13;
+import "dart:core" as core;
+
+static method main([core::List<core::String> args = #C2, dynamic other = #C1]) → void {}
+
+library /*isNonNullableByDefault*/;
+import self as self14;
+import "dart:core" as core;
+
+static method main(core::List<core::String> args, dynamic other) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_method_wrong_parameter_type_lib.dart:5:6: Error: The type 'Set<String>' of the first parameter of the 'main' method is not a supertype of 'List<String>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// void main(Set<String> args) /* error */ {}
+//      ^^^^
+//
+import self as self15;
+import "dart:core" as core;
+
+static method main(core::Set<core::String> args) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_setter_lib.dart:5:10: Error: The 'main' declaration must be a function declaration.
+// void set main(void Function() f) /* error */ {}
+//          ^^^^
+//
+import self as self16;
+
+static set main(() → void f) → void {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/main_declaration_typedef_lib.dart:5:9: Error: The 'main' declaration must be a function declaration.
+// typedef main /* error */ = void Function();
+//         ^
+//
+import self as self17;
+
+typedef main = () → void;
+
+constants  {
+  #C1 = null
+  #C2 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..a736a23
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
+//   foo();
+//      ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:5:6: Context: Found this candidate, but the arguments don't match.
+// void foo({required String s}) {}
+//      ^^^
+//
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
+//   new A();
+//        ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:9:3: Context: Found this candidate, but the arguments don't match.
+//   A({required int x});
+//   ^
+//
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
+//   a.foo();
+//        ^
+//
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
+//   a.f();
+//      ^
+//
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
+//   g();
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field ({required s: core::String}) → void f = ({required core::String s = #C1}) → void {};
+  constructor •({required core::int x = #C1}) → self::A
+    : super core::Object::•()
+    ;
+  method foo({required core::int y = #C1}) → dynamic {}
+}
+static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → void {};
+static method foo({required core::String s = #C1}) → void {}
+static method bar() → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
+  new A();
+       ^";
+  self::A a = new self::A::•(x: 42);
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
+  a.foo();
+       ^" in a.{self::A::foo}{<inapplicable>}.(){() → invalid-type};
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
+  a.f();
+     ^" in a.{self::A::f}{({required s: core::String}) → void}{<inapplicable>}.();
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
+  g();
+   ^" in self::g{<inapplicable>}.();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.modular.expect
new file mode 100644
index 0000000..8015a15
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Mixin extends core::Object {
+  field FutureOr<Null>m = null;
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class _Class&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Object&Mixin
+    : super core::Object::•()
+    ;
+  mixin-super-stub get m() → FutureOr<Null>
+    return super.{self::Mixin::m};
+  mixin-super-stub set m(FutureOr<Null>value) → void
+    return super.{self::Mixin::m} = value;
+}
+class Class extends self::_Class&Object&Mixin {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Object&Mixin::•()
+    ;
+  method test(dynamic t1) → dynamic {
+    this.{self::_Class&Object&Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.modular.expect
new file mode 100644
index 0000000..b9ee95d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+//     return new Future<Null>.value(null); // error
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → FutureOr<void> {}
+  method method3() → FutureOr<void> {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1() → void {}
+  method method2() → void {}
+  method method3() → FutureOr<void> {}
+}
+class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method method1() → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method2() → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
+    return new Future<Null>.value(null); // error
+               ^" in asy::Future::value<Null>(null);
+  }
+  method method3() → FutureOr<void> {
+    return asy::Future::value<Null>(null);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.modular.expect
new file mode 100644
index 0000000..08602d8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/never_bound.dart:10:3: Error: Type argument 'Null' doesn't conform to the bound 'Never' of the type variable 'T' on 'GenericNever'.
+// Try changing type arguments so that they conform to the bounds.
+//   GenericNever<Null>();
+//   ^
+// pkg/front_end/testcases/nnbd/never_bound.dart:5:20: Context: This is the type variable whose bound isn't conformed to.
+// class GenericNever<T extends Never> {
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/never_bound.dart:11:3: Error: Type argument 'void' doesn't conform to the bound 'Never' of the type variable 'T' on 'GenericNever'.
+// Try changing type arguments so that they conform to the bounds.
+//   GenericNever<void>();
+//   ^
+// pkg/front_end/testcases/nnbd/never_bound.dart:5:20: Context: This is the type variable whose bound isn't conformed to.
+// class GenericNever<T extends Never> {
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/never_bound.dart:12:3: Error: Type argument 'int' doesn't conform to the bound 'Never' of the type variable 'T' on 'GenericNever'.
+// Try changing type arguments so that they conform to the bounds.
+//   GenericNever<int>();
+//   ^
+// pkg/front_end/testcases/nnbd/never_bound.dart:5:20: Context: This is the type variable whose bound isn't conformed to.
+// class GenericNever<T extends Never> {
+//                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class GenericNever<T extends Never> extends core::Object {
+  synthetic constructor •() → self::GenericNever<self::GenericNever::T>
+    : super core::Object::•()
+    ;
+  method getParamType() → dynamic
+    return self::GenericNever::T;
+}
+static method errors() → dynamic {
+  new self::GenericNever::•<Null>();
+  new self::GenericNever::•<void>();
+  new self::GenericNever::•<core::int>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_calls.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/never_calls.dart.weak.modular.expect
new file mode 100644
index 0000000..a1ee958
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/never_calls.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+static method propertyGet(Never never) → dynamic {
+  Never v1 = let final Never #t1 = (let final Never #t2 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.foo in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v2 = let final Never #t3 = (let final Never #t4 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.hashCode in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v3 = let final Never #t5 = (let final Never #t6 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.runtimeType in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v4 = let final Never #t7 = (let final Never #t8 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v5 = let final Never #t9 = (let final Never #t10 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.noSuchMethod in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+}
+static method propertySet(Never never) → dynamic {
+  core::int v1 = (let final Never #t11 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.foo = 42;
+}
+static method methodInvocation(Never never, core::Invocation invocation) → dynamic {
+  Never v1 = let final Never #t12 = (let final Never #t13 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v2 = let final Never #t14 = (let final Never #t15 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.hashCode() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v3 = let final Never #t16 = (let final Never #t17 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.runtimeType() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v4 = let final Never #t18 = (let final Never #t19 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v5 = let final Never #t20 = (let final Never #t21 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString(foo: 42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v6 = let final Never #t22 = (let final Never #t23 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.noSuchMethod(invocation) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v7 = let final Never #t24 = (let final Never #t25 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.noSuchMethod(42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+}
+static method equals(Never never) → dynamic {
+  core::bool v1 = (let final Never #t26 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
+  Never v2 = let final Never #t27 = (let final Never #t28 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} (let final Never #t29 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+}
+static method operator(Never never) → dynamic {
+  Never v1 = let final Never #t30 = (let final Never #t31 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.+(let final Never #t32 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v2 = let final Never #t33 = (let final Never #t34 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.unary-() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v3 = let final Never #t35 = (let final Never #t36 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[](let final Never #t37 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  Never v4 = let final Never #t38 = let final Never #t39 = let final Never #t40 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in let final Never #t41 = let final Never #t42 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in let final Never #t43 = let final Never #t44 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in let final void #t45 = #t39{Never}.[]=(#t41, #t43) in #t43 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_equals.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/never_equals.dart.weak.modular.expect
new file mode 100644
index 0000000..3863424
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/never_equals.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+static method test(Never nonNullableNever, Never? nullableNever) → dynamic {
+  Never v1 = let final Never #t1 = (let final Never #t2 = nonNullableNever in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} (let final Never #t3 = nonNullableNever in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  core::bool v2 = nullableNever =={core::Object::==}{(core::Object) → core::bool} nullableNever;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.modular.expect
new file mode 100644
index 0000000..910a2cd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.modular.expect
@@ -0,0 +1,124 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:24:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null.
+//   x?.foo(); // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:25:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null.
+//   x?.bar; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:26:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null.
+//   x?.baz = 42; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:27:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null.
+//   x?[42]; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:3: Warning: Operand of null-aware operation '?.' has type 'Never' which excludes null.
+//   x?[42] = 42; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
+// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+//   y.foo(); // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
+//   y.bar; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
+//   y.baz = 42; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   y(); // Error.
+//    ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//   y++; // Error.
+//    ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//   y += 1; // Error.
+//     ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
+//   y[42]; // Error.
+//    ^
+//
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
+//   y[42] = 42; // Error.
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method foo(Never x, Never? y) → dynamic {
+  core::String local0 = y.{core::Object::toString}(){() → core::String};
+  core::int local1 = y.{core::Object::hashCode}{core::int};
+  let final Never #t1 = (let final Never #t2 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t3 = (let final Never #t4 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  (let final Never #t5 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.baz = 42;
+  let final Never #t6 = (let final Never #t7 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t8 = (let final Never #t9 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  (let final Never #t10 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[]=(42, 42);
+  let final Never #t11 = x = let final Never #t12 = (let final Never #t13 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t14 = x = let final Never #t15 = (let final Never #t16 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t17 = y in #t17 == null ?{Null} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t20 = y in #t20 == null ?{Null} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t23 = y in #t23 == null ?{core::int?} null : (let final Never #t24 = #t23{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.baz = 42;
+  let final Never? #t25 = y in #t25 == null ?{Null} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t28 = y in #t28 == null ?{Null} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t31 = y in #t31 == null ?{core::int?} null : (let final Never #t32 = #t31{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[]=(42, 42);
+  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33 == null ?{Null} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37 == null ?{Null} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t41 = let final Never #t42 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t41 == null ?{core::int?} null : (let final Never #t43 = #t41 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.baz = 42;
+  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44 == null ?{Null} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t48 = let final Never #t49 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t48 == null ?{core::int?} null : (let final Never #t50 = #t48 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[]=(42, 42);
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
+Try correcting the name to the name of an existing method, or defining a method named 'foo'.
+  y.foo(); // Error.
+    ^^^" in y{<unresolved>}.foo();
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
+  y.bar; // Error.
+    ^^^" in y{<unresolved>}.bar;
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
+  y.baz = 42; // Error.
+    ^^^" in y{<unresolved>}.baz = 42;
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+  y(); // Error.
+   ^" in y{<unresolved>}.call();
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+  y++; // Error.
+   ^" in y{<unresolved>}.+(1) as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+  y += 1; // Error.
+    ^" in y{<unresolved>}.+(1) as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
+  y[42]; // Error.
+   ^" in y{<unresolved>}.[](42);
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
+  y[42] = 42; // Error.
+   ^" in y{<unresolved>}.[]=(42, 42);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart.weak.modular.expect
new file mode 100644
index 0000000..ce4e2f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart.weak.modular.expect
@@ -0,0 +1,131 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:7:6: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42];
+//      ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:8:6: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42] = 42;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:8:11: Error: Can't assign to this.
+//   c?.[42] = 42;
+//           ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:9:6: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42]++;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:9:6: Error: Can't assign to this.
+//   c?.[42]++;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:10:8: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   ++c?.[42];
+//        ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:10:8: Error: Can't assign to this.
+//   ++c?.[42];
+//        ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:11:6: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42]?.[0];
+//      ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:11:12: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42]?.[0];
+//            ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:12:6: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42]?.[0] ??= 42;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:12:12: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42]?.[0] ??= 42;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:12:16: Error: Can't assign to this.
+//   c?.[42]?.[0] ??= 42;
+//                ^^^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:13:6: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42]?.[0]++;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:13:12: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   c?.[42]?.[0]++;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:13:12: Error: Can't assign to this.
+//   c?.[42]?.[0]++;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:14:8: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   ++c?.[42]?.[0];
+//        ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:14:14: Error: Expected an identifier, but got '['.
+// Try inserting an identifier before '['.
+//   ++c?.[42]?.[0];
+//              ^
+//
+// pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:14:14: Error: Can't assign to this.
+//   ++c?.[42]?.[0];
+//              ^
+//
+import self as self;
+
+static method main() → dynamic {
+  dynamic c;
+  invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:7:6: Error: Expected an identifier, but got '['.
+Try inserting an identifier before '['.
+  c?.[42];
+     ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:8:11: Error: Can't assign to this.
+  c?.[42] = 42;
+          ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:9:6: Error: Can't assign to this.
+  c?.[42]++;
+     ^" in invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:9:6: Error: Expected an identifier, but got '['.
+Try inserting an identifier before '['.
+  c?.[42]++;
+     ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:10:8: Error: Can't assign to this.
+  ++c?.[42];
+       ^" in invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:10:8: Error: Expected an identifier, but got '['.
+Try inserting an identifier before '['.
+  ++c?.[42];
+       ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:11:12: Error: Expected an identifier, but got '['.
+Try inserting an identifier before '['.
+  c?.[42]?.[0];
+           ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:12:16: Error: Can't assign to this.
+  c?.[42]?.[0] ??= 42;
+               ^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:13:12: Error: Can't assign to this.
+  c?.[42]?.[0]++;
+           ^" in invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:13:12: Error: Expected an identifier, but got '['.
+Try inserting an identifier before '['.
+  c?.[42]?.[0]++;
+           ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:14:14: Error: Can't assign to this.
+  ++c?.[42]?.[0];
+             ^" in invalid-expression "pkg/front_end/testcases/nnbd/no_support_for_old_null_aware_index_access_syntax.dart:14:14: Error: Expected an identifier, but got '['.
+Try inserting an identifier before '['.
+  ++c?.[42]?.[0];
+             ^";
+}
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.modular.expect
new file mode 100644
index 0000000..ecbc399
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.modular.expect
@@ -0,0 +1,141 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
+// int topLevelField; // Error.
+//     ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Error: Field 'staticFieldOfA' should be initialized because its type 'int' doesn't allow null.
+//   static int staticFieldOfA; // Error.
+//              ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Error: Field 'staticFieldOfM' should be initialized because its type 'int' doesn't allow null.
+//   static int staticFieldOfM; // Error.
+//              ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+//   static int staticFieldOfE; // Error.
+//              ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
+//   A.foo();
+//   ^
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Context: 'fieldOfA' is defined here.
+//   int fieldOfA; // Error.
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:19:3: Error: This constructor should initialize field 'fieldOfB' because its type 'X' doesn't allow null.
+//   B.foo();
+//   ^
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Context: 'fieldOfB' is defined here.
+//   X fieldOfB; // Error.
+//     ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:19:3: Error: This constructor should initialize field 'fieldOfB2' because its type 'Y' doesn't allow null.
+//   B.foo();
+//   ^
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Context: 'fieldOfB2' is defined here.
+//   Y fieldOfB2; // Error.
+//     ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Error: Field 'fieldOfM' should be initialized because its type 'int' doesn't allow null.
+//   int fieldOfM; // Error.
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Error: Field 'fieldOfN' should be initialized because its type 'X' doesn't allow null.
+//   X fieldOfN; // Error.
+//     ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Error: Field 'fieldOfN2' should be initialized because its type 'Y' doesn't allow null.
+//   Y fieldOfN2; // Error.
+//     ^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+class A extends core::Object {
+  static field core::int staticFieldOfA = null;
+  field core::int fieldOfA;
+  constructor foo() → self::A
+    : self::A::fieldOfA = null, super core::Object::•()
+    ;
+  constructor bar(core::int fieldOfA) → self::A
+    : self::A::fieldOfA = fieldOfA, super core::Object::•()
+    ;
+}
+class B<X extends core::Object?, Y extends core::Object> extends core::Object {
+  covariant-by-class field self::B::X% fieldOfB;
+  covariant-by-class field self::B::Y fieldOfB2;
+  constructor foo() → self::B<self::B::X%, self::B::Y>
+    : self::B::fieldOfB2 = null, self::B::fieldOfB = null, super core::Object::•()
+    ;
+  constructor bar(self::B::X% fieldOfB, self::B::Y fieldOfB2) → self::B<self::B::X%, self::B::Y>
+    : self::B::fieldOfB = fieldOfB, self::B::fieldOfB2 = fieldOfB2, super core::Object::•()
+    ;
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+  static field core::int staticFieldOfM = null;
+  field core::int fieldOfM = null;
+}
+abstract class N<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
+  covariant-by-class field self::N::X% fieldOfN = null;
+  covariant-by-class field self::N::Y fieldOfN2 = null;
+}
+class C<X extends core::Object?, Y extends core::Object> extends core::Object {
+  static field core::int? staticFieldOfX = null;
+  static field core::int staticFieldOfXInitialized = 42;
+  covariant-by-class field self::C::X? fieldOfX = null;
+  field core::int? fieldOfX2 = null;
+  field dynamic fieldOfX3 = null;
+  field Null fieldOfX4 = null;
+  field () →? core::int fieldOfX5 = null;
+  covariant-by-class field self::C::Y? fieldOfX6 = null;
+  late static field core::int lateStaticFieldOfC;
+  late field core::int fieldOfC7;
+  late covariant-by-class field self::C::X% fieldOfC8;
+  late covariant-by-class field self::C::Y fieldOfC9;
+  field core::int fieldOfC10;
+  constructor foo(core::int fieldOfC10) → self::C<self::C::X%, self::C::Y>
+    : self::C::fieldOfC10 = fieldOfC10, super core::Object::•()
+    ;
+  constructor bar(core::int fieldOfC10) → self::C<self::C::X%, self::C::Y>
+    : self::C::fieldOfC10 = fieldOfC10, super core::Object::•()
+    ;
+}
+abstract class L<X extends core::Object?, Y extends core::Object> extends core::Object /*isMixinDeclaration*/  {
+  static field core::int? staticFieldOfL = null;
+  static field core::int staticFieldOfLInitialized = 42;
+  covariant-by-class field self::L::X? fieldOfL = null;
+  field core::int? fieldOfL2 = null;
+  field dynamic fieldOfL3 = null;
+  field Null fieldOfL4 = null;
+  field () →? core::int fieldOfL5 = null;
+  covariant-by-class field self::L::Y? fieldOfL6 = null;
+  late static field core::int lateStaticFieldOfM;
+  late field core::int fieldOfM7;
+  late covariant-by-class field self::L::X% fieldOfM8;
+  late covariant-by-class field self::L::Y fieldOfM9;
+}
+extension P on self::Foo {
+  static field staticFieldOfE = self::P|staticFieldOfE;
+}
+extension Q on self::Foo {
+  static field staticFieldOfQ = self::Q|staticFieldOfQ;
+  static field lateStaticFieldOfQ = self::Q|lateStaticFieldOfQ;
+  static field staticFieldOfQInitialized = self::Q|staticFieldOfQInitialized;
+}
+static field core::int topLevelField;
+static field core::int P|staticFieldOfE;
+static field core::int? nullableTopLevelField;
+late static field core::int lateTopLevelField;
+static field core::int topLevelFieldWithInitializer = 42;
+static field core::int? Q|staticFieldOfQ;
+late static field core::int Q|lateStaticFieldOfQ;
+static field core::int Q|staticFieldOfQInitialized = 42;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.modular.expect
new file mode 100644
index 0000000..f03bd13
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Error: The parameter 'a' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// method1({int a}) {}
+//              ^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Error: The parameter 'a' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// method2([int a]) {}
+//              ^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Error: The parameter 'a' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// method3({int a}) {}
+//              ^
+//
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Error: The parameter 'a' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// method4([int a]) {}
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+part non_nullable_optional_part.dart;
+static method main() → dynamic {}
+static method method1({core::int a = #C1}) → dynamic {}
+static method method2([core::int a = #C1]) → dynamic {}
+static method /* from org-dartlang-testcase:///non_nullable_optional_part.dart */ method3({core::int a = #C1}) → dynamic {}
+static method /* from org-dartlang-testcase:///non_nullable_optional_part.dart */ method4([core::int a = #C1]) → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..abcb54d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart.weak.modular.expect
@@ -0,0 +1,220 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:9:10: Error: 'topLevelMethodAndSetter' is already declared in this scope.
+// void set topLevelMethodAndSetter(value) {}
+//          ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:6:10: Context: Previous declaration of 'topLevelMethodAndSetter'.
+// void set topLevelMethodAndSetter(value) {}
+//          ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:29:12: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   void set Class(value) {}
+//            ^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart: Error: 'topLevelMethodAndSetter' is exported from both 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:9:10: Error: Conflicts with member 'topLevelMethodAndSetter'.
+// void set topLevelMethodAndSetter(value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:6:10: Error: Conflicts with member 'topLevelMethodAndSetter'.
+// void set topLevelMethodAndSetter(value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:5:1: Error: Conflicts with setter 'topLevelMethodAndSetter'.
+// topLevelMethodAndSetter() {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:13:10: Error: Conflicts with member 'classAndSetter'.
+// void set classAndSetter(value) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:11:7: Error: Conflicts with setter 'classAndSetter'.
+// class classAndSetter {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:34:12: Error: Conflicts with member 'extensionInstanceMethodAndSetter'.
+//   void set extensionInstanceMethodAndSetter(value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:33:3: Error: Conflicts with setter 'extensionInstanceMethodAndSetter'.
+//   extensionInstanceMethodAndSetter() {}
+//   ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:37:19: Error: Conflicts with member 'extensionStaticMethodAndSetter'.
+//   static void set extensionStaticMethodAndSetter(value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:36:10: Error: Conflicts with setter 'extensionStaticMethodAndSetter'.
+//   static extensionStaticMethodAndSetter() {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:40:19: Error: Conflicts with member 'extensionInstanceMethodAndStaticSetter'.
+//   static void set extensionInstanceMethodAndStaticSetter(value) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:39:3: Error: Conflicts with setter 'extensionInstanceMethodAndStaticSetter'.
+//   extensionInstanceMethodAndStaticSetter() {}
+//   ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:43:12: Error: Conflicts with member 'extensionStaticMethodAndInstanceSetter'.
+//   void set extensionStaticMethodAndInstanceSetter(value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:42:10: Error: Conflicts with setter 'extensionStaticMethodAndInstanceSetter'.
+//   static extensionStaticMethodAndInstanceSetter() {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:17:12: Error: 'instanceMethodAndSetter' is already declared in this scope.
+//   void set instanceMethodAndSetter(value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:16:3: Context: Previous declaration of 'instanceMethodAndSetter'.
+//   instanceMethodAndSetter() {}
+//   ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:20:19: Error: 'staticMethodAndSetter' is already declared in this scope.
+//   static void set staticMethodAndSetter(value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:19:10: Context: Previous declaration of 'staticMethodAndSetter'.
+//   static staticMethodAndSetter() {}
+//          ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:23:19: Error: This static member conflicts with an instance member.
+//   static void set instanceMethodAndStaticSetter(value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:22:3: Context: This is the instance member.
+//   instanceMethodAndStaticSetter() {}
+//   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:25:10: Error: This static member conflicts with an instance member.
+//   static staticMethodAndInstanceSetter() {}
+//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:26:12: Context: This is the instance member.
+//   void set staticMethodAndInstanceSetter(value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:47:3: Error: Setter not found: 'topLevelMethodAndSetter'.
+//   topLevelMethodAndSetter = topLevelMethodAndSetter();
+//   ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:48:22: Error: Couldn't find constructor 'typedefAndSetter'.
+//   typedefAndSetter = typedefAndSetter();
+//                      ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:48:3: Error: Can't assign to a type literal.
+//   typedefAndSetter = typedefAndSetter();
+//   ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:49:3: Error: Can't assign to a type literal.
+//   classAndSetter = classAndSetter();
+//   ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:55:9: Error: Setter not found: 'staticMethodAndSetter'.
+//   Class.staticMethodAndSetter = Class.staticMethodAndSetter();
+//         ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:65:13: Error: Setter not found: 'extensionStaticMethodAndSetter'.
+//   Extension.extensionStaticMethodAndSetter =
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:61:15: Error: The getter 'Class' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'Class'.
+//   c.Class = c.Class;
+//               ^^^^^
+//
+// pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:63:5: Error: The setter 'extensionInstanceFieldAndSetter' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndSetter'.
+//   0.extensionInstanceFieldAndSetter = 0.extensionInstanceMethodAndSetter();
+//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef typedefAndSetter = () → dynamic;
+class classAndSetter extends core::Object {
+  synthetic constructor •() → self::classAndSetter
+    : super core::Object::•()
+    ;
+}
+class Class extends core::Object {
+  constructor •() → self::Class
+    : super core::Object::•() {}
+  method instanceMethodAndSetter() → dynamic {}
+  set instanceMethodAndSetter(dynamic value) → void {}
+  static method staticMethodAndSetter() → dynamic {}
+  static set staticMethodAndSetter(dynamic value) → void {}
+  method instanceMethodAndStaticSetter() → dynamic {}
+  static set instanceMethodAndStaticSetter(dynamic value) → void {}
+  static method staticMethodAndInstanceSetter() → dynamic {}
+  set staticMethodAndInstanceSetter(dynamic value) → void {}
+  set Class(dynamic value) → void {}
+}
+extension Extension on core::int? {
+  method extensionInstanceMethodAndSetter = self::Extension|extensionInstanceMethodAndSetter;
+  tearoff extensionInstanceMethodAndSetter = self::Extension|get#extensionInstanceMethodAndSetter;
+  static method extensionStaticMethodAndSetter = self::Extension|extensionStaticMethodAndSetter;
+  method extensionInstanceMethodAndStaticSetter = self::Extension|extensionInstanceMethodAndStaticSetter;
+  tearoff extensionInstanceMethodAndStaticSetter = self::Extension|get#extensionInstanceMethodAndStaticSetter;
+  static method extensionStaticMethodAndInstanceSetter = self::Extension|extensionStaticMethodAndInstanceSetter;
+  set extensionInstanceMethodAndSetter = self::Extension|set#extensionInstanceMethodAndSetter;
+  static set extensionStaticMethodAndSetter = set self::Extension|extensionStaticMethodAndSetter;
+  static set extensionInstanceMethodAndStaticSetter = set self::Extension|extensionInstanceMethodAndStaticSetter;
+  set extensionStaticMethodAndInstanceSetter = self::Extension|set#extensionStaticMethodAndInstanceSetter;
+}
+static const field dynamic _exports# = #C1 /*isLegacy*/;
+static method topLevelMethodAndSetter() → dynamic {}
+static set topLevelMethodAndSetter(dynamic value) → void {}
+static set classAndSetter(dynamic value) → void {}
+static method Extension|extensionInstanceMethodAndSetter(lowered final core::int? #this) → dynamic {}
+static method Extension|get#extensionInstanceMethodAndSetter(lowered final core::int? #this) → () → dynamic
+  return () → dynamic => self::Extension|extensionInstanceMethodAndSetter(#this);
+static method Extension|set#extensionInstanceMethodAndSetter(lowered final core::int? #this, dynamic value) → void {}
+static method Extension|extensionStaticMethodAndSetter() → dynamic {}
+static set Extension|extensionStaticMethodAndSetter(dynamic value) → void {}
+static method Extension|extensionInstanceMethodAndStaticSetter(lowered final core::int? #this) → dynamic {}
+static method Extension|get#extensionInstanceMethodAndStaticSetter(lowered final core::int? #this) → () → dynamic
+  return () → dynamic => self::Extension|extensionInstanceMethodAndStaticSetter(#this);
+static set Extension|extensionInstanceMethodAndStaticSetter(dynamic value) → void {}
+static method Extension|extensionStaticMethodAndInstanceSetter() → dynamic {}
+static method Extension|set#extensionStaticMethodAndInstanceSetter(lowered final core::int? #this, dynamic value) → void {}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:47:3: Error: Setter not found: 'topLevelMethodAndSetter'.
+  topLevelMethodAndSetter = topLevelMethodAndSetter();
+  ^^^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:48:3: Error: Can't assign to a type literal.
+  typedefAndSetter = typedefAndSetter();
+  ^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:49:3: Error: Can't assign to a type literal.
+  classAndSetter = classAndSetter();
+  ^^^^^^^^^^^^^^";
+  self::Class c = new self::Class::•();
+  c.{self::Class::instanceMethodAndSetter} = c.{self::Class::instanceMethodAndSetter}(){() → dynamic};
+  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:55:9: Error: Setter not found: 'staticMethodAndSetter'.
+  Class.staticMethodAndSetter = Class.staticMethodAndSetter();
+        ^^^^^^^^^^^^^^^^^^^^^";
+  c.{self::Class::staticMethodAndInstanceSetter} = self::Class::staticMethodAndInstanceSetter();
+  self::Class::instanceMethodAndStaticSetter = c.{self::Class::instanceMethodAndStaticSetter}(){() → dynamic};
+  c.{self::Class::Class} = invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:61:15: Error: The getter 'Class' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'Class'.
+  c.Class = c.Class;
+              ^^^^^" in c{<unresolved>}.Class;
+  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:63:5: Error: The setter 'extensionInstanceFieldAndSetter' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'extensionInstanceFieldAndSetter'.
+  0.extensionInstanceFieldAndSetter = 0.extensionInstanceMethodAndSetter();
+    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" in 0{<unresolved>}.extensionInstanceFieldAndSetter = self::Extension|extensionInstanceMethodAndSetter(0);
+  invalid-expression "pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart:65:13: Error: Setter not found: 'extensionStaticMethodAndSetter'.
+  Extension.extensionStaticMethodAndSetter =
+            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
+  self::Extension|set#extensionStaticMethodAndInstanceSetter(0, self::Extension|extensionStaticMethodAndInstanceSetter());
+  self::Extension|extensionInstanceMethodAndStaticSetter = self::Extension|extensionInstanceMethodAndStaticSetter(0);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "{\"topLevelMethodAndSetter\":\"'topLevelMethodAndSetter' is exported from both 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart' and 'pkg/front_end/testcases/nnbd/nonfield_vs_setter.dart'.\"}"
+}
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.modular.expect
new file mode 100644
index 0000000..682b905
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(covariant-by-class self::A::T% value) → dynamic {}
+  method barInt(core::int value) → dynamic {}
+  method foo() → dynamic {
+    late self::A::T% value;
+    late core::int intValue;
+    () → Null result = () → Null {
+      this.{self::A::bar}(value){(self::A::T%) → dynamic};
+      this.{self::A::barInt}(intValue){(core::int) → dynamic};
+    };
+    (() → Null {
+      value = this.{self::A::baz}(){() → self::A::T%};
+      intValue = 42;
+    })(){() → Null};
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.modular.expect
new file mode 100644
index 0000000..e32613c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.modular.expect
@@ -0,0 +1,204 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+//   -nullableInt; // error
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   nullableInt + 2; // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+//   nullableClass[nonNullableInt]; // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+//   nullableClass[nonNullableInt] = nonNullableInt; // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+//   nullableClass[nonNullableInt] += nonNullableInt; // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+//   nullableClass[nonNullableInt] += nonNullableInt; // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
+//  - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+//   nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
+//  - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+//   nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+// Try accessing using ?. instead.
+//   nullableClass.nonNullableField; // error
+//                 ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+// Try accessing using ?. instead.
+//   nullableClass.nonNullableField = 2; // error
+//                 ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+// Try accessing using ?. instead.
+//   nullableClass.nonNullableField += 2; // error
+//                 ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   nonNullableClass.nullableField += 2; // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nonNullableClass.nullableField += 2; // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   nullableClass?.nullableField += 2; // error
+//                                ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+//   nullableClass?.nullableField += 2; // error
+//                                ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+// Try calling using ?.call instead.
+//   nullableClass(); // error
+//                ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:59:3: Warning: Operand of null-aware operation '?.' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+//   nonNullableClass?.nonNullableClass(); // ok
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_access.dart:60:3: Warning: Operand of null-aware operation '?.' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+//   nonNullableClass?.nonNullableClass.nonNullableClass(); // ok
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int nonNullableField = 0;
+  field core::int? nullableField = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  operator [](core::int key) → core::int
+    return key;
+  operator []=(core::int key, core::int value) → void {}
+  get nonNullableClass() → self::Class
+    return this;
+  method call() → self::Class
+    return this;
+  get nonNullableNullableIndexClass() → self::NullableIndexClass
+    return new self::NullableIndexClass::•();
+}
+class NullableIndexClass extends core::Object {
+  synthetic constructor •() → self::NullableIndexClass
+    : super core::Object::•()
+    ;
+  operator [](core::int key) → core::int?
+    return key;
+  operator []=(core::int key, core::int value) → void {}
+}
+static method main() → dynamic {}
+static method errors(self::Class? nullableClass, self::Class nonNullableClass, core::int? nullableInt, core::int nonNullableInt, self::NullableIndexClass? nullableNullableIndexClass) → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  -nullableInt; // error
+  ^" in nullableInt.{core::int::unary-}(){() → core::int};
+  invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableInt + 2; // error
+              ^" in nullableInt.{core::num::+}(2){(core::num) → core::num};
+  invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt]; // error
+               ^" in nullableClass.{self::Class::[]}{<nullable>}.(nonNullableInt){(core::int) → core::int};
+  invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] = nonNullableInt; // error
+               ^" in nullableClass.{self::Class::[]=}{<nullable>}.(nonNullableInt, nonNullableInt){(core::int, core::int) → void};
+  let final self::Class? #t1 = nullableClass in let final core::int #t2 = nonNullableInt in invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] += nonNullableInt; // error
+               ^" in #t1.{self::Class::[]=}{<nullable>}.(#t2, invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] += nonNullableInt; // error
+               ^" in #t1.{self::Class::[]}{<nullable>}.(#t2){(core::int) → core::int}.{core::num::+}(nonNullableInt){(core::num) → core::int}){(core::int, core::int) → void};
+  let final self::NullableIndexClass? #t3 = nullableNullableIndexClass in let final core::int #t4 = nonNullableInt in invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+                            ^" in #t3.{self::NullableIndexClass::[]}{<nullable>}.(#t4){(core::int) → core::int?} == null ?{core::int} invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+                            ^" in #t3.{self::NullableIndexClass::[]=}{<nullable>}.(#t4, nonNullableInt){(core::int, core::int) → void} : null;
+  let final self::Class? #t5 = nullableClass in #t5 == null ?{core::int?} null : #t5{self::Class}.{self::Class::nonNullableClass}{self::Class}.{self::Class::[]}(nonNullableInt){(core::int) → core::int};
+  let final self::Class? #t6 = nullableClass in #t6 == null ?{core::int?} null : #t6{self::Class}.{self::Class::nonNullableClass}{self::Class}.{self::Class::[]=}(nonNullableInt, nonNullableInt){(core::int, core::int) → void};
+  let final self::Class? #t7 = nullableClass in #t7 == null ?{core::int?} null : let final self::Class #t8 = #t7{self::Class}.{self::Class::nonNullableClass}{self::Class} in let final core::int #t9 = nonNullableInt in #t8.{self::Class::[]=}(#t9, #t8.{self::Class::[]}(#t9){(core::int) → core::int}.{core::num::+}(nonNullableInt){(core::num) → core::int}){(core::int, core::int) → void};
+  let final self::Class? #t10 = nullableClass in #t10 == null ?{core::int?} null : let final self::NullableIndexClass #t11 = #t10{self::Class}.{self::Class::nonNullableNullableIndexClass}{self::NullableIndexClass} in let final core::int #t12 = nonNullableInt in #t11.{self::NullableIndexClass::[]}(#t12){(core::int) → core::int?} == null ?{core::int} #t11.{self::NullableIndexClass::[]=}(#t12, nonNullableInt){(core::int, core::int) → void} : null;
+  invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField; // error
+                ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField}{<nullable>}.{core::int};
+  invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField = 2; // error
+                ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField}{<nullable>}. = 2;
+  let final self::Class? #t13 = nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField += 2; // error
+                ^^^^^^^^^^^^^^^^" in #t13.{self::Class::nonNullableField}{<nullable>}. = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField += 2; // error
+                ^^^^^^^^^^^^^^^^" in #t13.{self::Class::nonNullableField}{<nullable>}.{core::int}.{core::num::+}(2){(core::num) → core::int};
+  let final self::Class? #t14 = nullableClass in #t14 == null ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableField}{core::int};
+  let final self::Class? #t15 = nullableClass in #t15 == null ?{core::int?} null : #t15{self::Class}.{self::Class::nonNullableField} = 2;
+  let final self::Class? #t16 = nullableClass in #t16 == null ?{core::int?} null : #t16.{self::Class::nonNullableField} = #t16.{self::Class::nonNullableField}{core::int}.{core::num::+}(2){(core::num) → core::int};
+  let final self::Class? #t17 = nullableClass in #t17 == null ?{core::int?} null : #t17{self::Class}.{self::Class::nonNullableClass}{self::Class}.{self::Class::nonNullableField}{core::int};
+  let final self::Class? #t18 = nullableClass in #t18 == null ?{core::int?} null : #t18{self::Class}.{self::Class::nonNullableClass}{self::Class}.{self::Class::nonNullableField} = 2;
+  let final self::Class #t19 = nonNullableClass in #t19.{self::Class::nullableField} = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+  nonNullableClass.nullableField += 2; // error
+                                 ^" in invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nonNullableClass.nullableField += 2; // error
+                                 ^" in #t19.{self::Class::nullableField}{core::int?}.{core::num::+}(2){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int?;
+  let final self::Class? #t20 = nullableClass in #t20 == null ?{core::num?} null : #t20.{self::Class::nullableField} = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+  nullableClass?.nullableField += 2; // error
+                               ^" in invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableClass?.nullableField += 2; // error
+                               ^" in #t20.{self::Class::nullableField}{core::int?}.{core::num::+}(2){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int?;
+  let final self::Class? #t21 = nullableClass in #t21 == null ?{core::int?} null : #t21.{self::Class::nonNullableField}{core::int} == null ?{core::int} #t21.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t22 = nullableClass in #t22 == null ?{core::int?} null : #t22.{self::Class::nullableField}{core::int?} == null ?{core::int} #t22.{self::Class::nullableField} = 0 : null;
+  let final self::Class? #t23 = nullableClass in #t23 == null ?{core::int?} null : let final self::Class #t24 = #t23{self::Class}.{self::Class::nonNullableClass}{self::Class} in #t24.{self::Class::nonNullableField}{core::int} == null ?{core::int} #t24.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t25 = nullableClass in #t25 == null ?{core::int?} null : let final self::Class #t26 = #t25{self::Class}.{self::Class::nonNullableClass}{self::Class} in #t26.{self::Class::nullableField}{core::int?} == null ?{core::int} #t26.{self::Class::nullableField} = 0 : null;
+  invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try calling using ?.call instead.
+  nullableClass(); // error
+               ^" in nullableClass.{self::Class::call}{<nullable>}.(){() → self::Class};
+  nonNullableClass.{self::Class::call}(){() → self::Class};
+  let final self::Class #t27 = nonNullableClass in #t27 == null ?{self::Class?} null : #t27.{self::Class::nonNullableClass}{self::Class}.{self::Class::call}(){() → self::Class};
+  let final self::Class #t28 = nonNullableClass in #t28 == null ?{self::Class?} null : #t28.{self::Class::nonNullableClass}{self::Class}.{self::Class::nonNullableClass}{self::Class}.{self::Class::call}(){() → self::Class};
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.modular.expect
new file mode 100644
index 0000000..ce3973c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_chain.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field self::Class? field;
+  constructor •([self::Class? field = #C1]) → self::Class
+    : self::Class::field = field, super core::Object::•()
+    ;
+  get getter1() → self::Class
+    return this;
+  get getter2() → self::Class?
+    return this.{self::Class::field}{self::Class?};
+}
+static method main() → dynamic {
+  self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
+  let final self::Class? #t1 = c in #t1 == null ?{self::Class?} null : let final self::Class? #t2 = #t1{self::Class}.{self::Class::getter1}{self::Class}.{self::Class::getter2}{self::Class?} in #t2 == null ?{self::Class?} null : let final self::Class? #t3 = #t2{self::Class}.{self::Class::getter1}{self::Class}.{self::Class::getter2}{self::Class?} in #t3 == null ?{self::Class?} null : #t3{self::Class}.{self::Class::field} = c{self::Class};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.modular.expect
new file mode 100644
index 0000000..9811bce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_static_access.dart.weak.modular.expect
@@ -0,0 +1,98 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:17:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:18:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:19:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember = 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:21:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.isEven;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:22:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember.toString();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:23:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0];
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:24:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property[0] = 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:25:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.property2[0] ??= 0;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:26:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember2 ??= 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:27:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember += 2;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:28:3: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   C?.staticMember++;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_static_access.dart:29:5: Warning: The class 'C' cannot be null.
+// Try replacing '?.' with '.'
+//   --C?.staticMember;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static get staticMember() → core::int
+    return 0;
+  static set staticMember(core::int value) → void {}
+  static get staticMember2() → core::int?
+    return 0;
+  static set staticMember2(core::int? value) → void {}
+  static method staticMethod() → void {}
+  static get property() → core::List<core::int>
+    return <core::int>[0];
+  static get property2() → core::Map<core::int, core::int?>
+    return <core::int, core::int?>{};
+}
+static method main() → void {
+  self::C::staticMember;
+  self::C::staticMember;
+  self::C::staticMember = 42;
+  self::C::staticMethod();
+  self::C::staticMember.{core::int::isEven}{core::bool};
+  self::C::staticMember.{core::int::toString}(){() → core::String};
+  self::C::property.{core::List::[]}(0){(core::int) → core::int};
+  self::C::property.{core::List::[]=}(0, 0){(core::int, core::int) → void};
+  let final core::Map<core::int, core::int?> #t1 = self::C::property2 in let final core::int #t2 = 0 in #t1.{core::Map::[]}(#t2){(core::Object?) → core::int?} == null ?{core::int} #t1.{core::Map::[]=}(#t2, 0){(core::int, core::int?) → void} : null;
+  self::C::staticMember2 == null ?{core::int} self::C::staticMember2 = 42 : null;
+  self::C::staticMember = self::C::staticMember.{core::num::+}(2){(core::num) → core::int};
+  self::C::staticMember = self::C::staticMember.{core::num::+}(1){(core::num) → core::int};
+  self::C::staticMember = self::C::staticMember.{core::num::-}(1){(core::num) → core::int};
+}
diff --git a/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.modular.expect
new file mode 100644
index 0000000..aac887e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_aware_this_access.dart.weak.modular.expect
@@ -0,0 +1,170 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:12:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:13:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 = 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:14:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:15:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.m1;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:16:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property.method();
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:17:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:18:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:19:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:20:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:21:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:22:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] ??= 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:23:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m1 ??= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:24:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2 += 2;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:25:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.m2++;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:26:7: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     --this?.m2;
+//       ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:27:5: Warning: Operand of null-aware operation '??' has type 'C' which excludes null.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd/null_aware_this_access.dart'.
+//     this ?? new C();
+//     ^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:41:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:42:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:43:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?[0] += 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:44:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0];
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:45:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] = 0;
+//     ^^^^
+//
+// pkg/front_end/testcases/nnbd/null_aware_this_access.dart:46:5: Warning: The receiver 'this' cannot be null.
+// Try replacing '?.' with '.'
+//     this?.property[0] += 0;
+//     ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int? m1 = null;
+  field core::int m2 = 0;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get property() → self::C
+    return this;
+  method test() → dynamic {
+    this.{self::C::m1}{core::int?};
+    this.{self::C::m1} = 42;
+    this.{self::C::method}(){() → dynamic};
+    this.{self::C::property}{self::C}.{self::C::m1}{core::int?};
+    this.{self::C::property}{self::C}.{self::C::method}(){() → dynamic};
+    this.{self::C::[]}(0){(core::int) → core::int?};
+    this.{self::C::[]=}(0, 0){(core::int, core::int) → void};
+    let final core::int #t1 = 0 in this.{self::C::[]}(#t1){(core::int) → core::int?} == null ?{core::int} this.{self::C::[]=}(#t1, 0){(core::int, core::int) → void} : null;
+    this.{self::C::property}{self::C}.{self::C::[]}(0){(core::int) → core::int?};
+    this.{self::C::property}{self::C}.{self::C::[]=}(0, 0){(core::int, core::int) → void};
+    let final self::C #t2 = this.{self::C::property}{self::C} in let final core::int #t3 = 0 in #t2.{self::C::[]}(#t3){(core::int) → core::int?} == null ?{core::int} #t2.{self::C::[]=}(#t3, 0){(core::int, core::int) → void} : null;
+    this.{self::C::m1}{core::int?} == null ?{core::int} this.{self::C::m1} = 42 : null;
+    this.{self::C::m2} = this.{self::C::m2}{core::int}.{core::num::+}(2){(core::num) → core::int};
+    this.{self::C::m2} = this.{self::C::m2}{core::int}.{core::num::+}(1){(core::num) → core::int};
+    this.{self::C::m2} = this.{self::C::m2}{core::int}.{core::num::-}(1){(core::num) → core::int};
+    this;
+  }
+  operator [](core::int index) → core::int?
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+  method method() → dynamic {}
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  get property() → self::D
+    return this;
+  method test() → dynamic {
+    this.{self::D::[]}(0){(core::int) → core::int};
+    this.{self::D::[]=}(0, 0){(core::int, core::int) → void};
+    let final core::int #t4 = 0 in this.{self::D::[]=}(#t4, this.{self::D::[]}(#t4){(core::int) → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int, core::int) → void};
+    this.{self::D::property}{self::D}.{self::D::[]}(0){(core::int) → core::int};
+    this.{self::D::property}{self::D}.{self::D::[]=}(0, 0){(core::int, core::int) → void};
+    let final self::D #t5 = this.{self::D::property}{self::D} in let final core::int #t6 = 0 in #t5.{self::D::[]=}(#t6, #t5.{self::D::[]}(#t6){(core::int) → core::int}.{core::num::+}(0){(core::num) → core::int}){(core::int, core::int) → void};
+  }
+  operator [](core::int index) → core::int
+    return 0;
+  operator []=(core::int index, core::int value) → void {}
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}(){() → dynamic};
+  new self::D::•().{self::D::test}(){() → dynamic};
+}
diff --git a/pkg/front_end/testcases/nnbd/null_check.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_check.dart.weak.modular.expect
new file mode 100644
index 0000000..bbfe2d7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_check.dart.weak.modular.expect
@@ -0,0 +1,117 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:14:3: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c!.field;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:15:3: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c!.field = 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:16:3: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c!.method;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:17:3: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c!.method();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:18:3: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c!.field!.toString();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:19:3: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c!.method()!.toString();
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:20:3: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c! + c;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:21:3: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c! + c!;
+//   ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:21:8: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c! + c!;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:22:7: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   c + c!;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:23:6: Warning: Operand of null-aware operation '!' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_check.dart'.
+//   (c + c)!;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:26:10: Warning: Operand of null-aware operation '!' has type 'bool' which excludes null.
+//   !o! ? !o! : !!o!!;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:26:17: Warning: Operand of null-aware operation '!' has type 'bool' which excludes null.
+//   !o! ? !o! : !!o!!;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:26:18: Warning: Operand of null-aware operation '!' has type 'bool' which excludes null.
+//   !o! ? !o! : !!o!!;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:27:5: Warning: Operand of null-aware operation '!' has type 'bool' which excludes null.
+//   !(o!) ? (!o)! : (!(!o)!)!;
+//     ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:27:12: Warning: Operand of null-aware operation '!' has type 'bool' which excludes null.
+//   !(o!) ? (!o)! : (!(!o)!)!;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:27:22: Warning: Operand of null-aware operation '!' has type 'bool' which excludes null.
+//   !(o!) ? (!o)! : (!(!o)!)!;
+//                      ^
+//
+// pkg/front_end/testcases/nnbd/null_check.dart:27:20: Warning: Operand of null-aware operation '!' has type 'bool' which excludes null.
+//   !(o!) ? (!o)! : (!(!o)!)!;
+//                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? field = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method() → core::int?
+    return this.{self::Class::field}{core::int?};
+  operator +(self::Class other) → self::Class
+    return new self::Class::•();
+}
+static method main() → dynamic {
+  self::Class? c = new self::Class::•() as{ForNonNullableByDefault} self::Class?;
+  c!;
+  c{self::Class}!.{self::Class::field}{core::int?};
+  c{self::Class}!.{self::Class::field} = 42;
+  c{self::Class}!.{self::Class::method}{() → core::int?};
+  c{self::Class}!.{self::Class::method}(){() → core::int?};
+  c{self::Class}!.{self::Class::field}{core::int?}!.{core::int::toString}(){() → core::String};
+  c{self::Class}!.{self::Class::method}(){() → core::int?}!.{core::int::toString}(){() → core::String};
+  c{self::Class}!.{self::Class::+}(c{self::Class}){(self::Class) → self::Class};
+  c{self::Class}!.{self::Class::+}(c{self::Class}!){(self::Class) → self::Class};
+  c{self::Class}.{self::Class::+}(c{self::Class}!){(self::Class) → self::Class};
+  c{self::Class}.{self::Class::+}(c{self::Class}){(self::Class) → self::Class}!;
+  core::bool? o = true as{ForNonNullableByDefault} core::bool?;
+  !o! ?{core::bool} !o{core::bool}! : !!o{core::bool}!!;
+  !o{core::bool}! ?{core::bool} (!o{core::bool})! : (!(!o{core::bool})!)!;
+}
diff --git a/pkg/front_end/testcases/nnbd/null_check_context.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_check_context.dart.weak.modular.expect
new file mode 100644
index 0000000..010a0ff
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_check_context.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract method bar<T extends core::Object? = dynamic>() → self::A::bar::T%;
+  method foo() → core::String
+    return this.{self::A::bar}<core::String?>(){() → core::String?}!;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.modular.expect
new file mode 100644
index 0000000..6be85bf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.modular.expect
@@ -0,0 +1,269 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+// Try accessing using ?. instead.
+//   throws(() => (n1?.nullable1 = new Class1()).nullable1);
+//                                               ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+// Try accessing using ?. instead.
+//   throws(() => (n1?.nonNullable1Method()).nullable1);
+//                                           ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+//   throws(() => n1?.nonNullable1 + 0);
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+//   throws(() => -n1?.nonNullable1);
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  get property() → self::Class1?
+    return null;
+  set property(self::Class1? value) → void {}
+  get property1() → self::Class1
+    return new self::Class1::•();
+  get property2() → self::Class2
+    return new self::Class2::•();
+  get nullable1() → self::Class1?
+    return this.{self::Class1::property1}{self::Class1};
+  set nullable1(self::Class1? value) → void {
+    this.{self::Class1::property} = value;
+  }
+  method nonNullable1Method() → self::Class1
+    return this.{self::Class1::nonNullable1}{self::Class1};
+  operator [](self::Class1? key) → self::Class1?
+    return this.{self::Class1::nullable1}{self::Class1?};
+  operator []=(self::Class1? key, self::Class1? value) → void {
+    this.{self::Class1::property} = value;
+  }
+  operator +(core::int value) → self::Class1?
+    return this.{self::Class1::nullable1}{self::Class1?};
+  operator unary-() → self::Class1?
+    return this.{self::Class1::nullable1}{self::Class1?};
+  get nonNullable1() → self::Class1
+    return this.{self::Class1::property1}{self::Class1};
+  get nonNullable2() → self::Class2
+    return this.{self::Class1::property2}{self::Class2};
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+  get property() → self::Class2
+    return this;
+  set property(self::Class2 value) → void {}
+  method nonNullable2Method() → self::Class2
+    return this.{self::Class2::nonNullable2}{self::Class2};
+  operator [](self::Class2? key) → self::Class2
+    return this.{self::Class2::property}{self::Class2};
+  operator []=(self::Class2? key, self::Class2? value) → void
+    return this.{self::Class2::property}{self::Class2};
+  operator +(core::int value) → self::Class2
+    return this.{self::Class2::property}{self::Class2};
+  operator unary-() → self::Class2
+    return this.{self::Class2::property}{self::Class2};
+  get nonNullable2() → self::Class2
+    return this.{self::Class2::property}{self::Class2};
+  set nonNullable2(self::Class2 value) → void {
+    this.{self::Class2::property} = value;
+  }
+}
+class Class3 extends core::Object {
+  synthetic constructor •() → self::Class3
+    : super core::Object::•()
+    ;
+  get property() → self::Class2?
+    return null;
+  operator [](self::Class3? key) → self::Class2?
+    return this.{self::Class3::property}{self::Class2?};
+}
+static method main() → dynamic {
+  self::propertyAccess(null);
+  self::indexAccess(null, null, null);
+  self::operatorAccess(null, null);
+  self::ifNull(null);
+}
+static method propertyAccess(self::Class1? n1) → void {
+  self::Class1? nullable1 = n1;
+  let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : #t1{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : #t2{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : #t3{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t4 = n1 in #t4 == null ?{self::Class1?} null : #t4{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t5 = n1 in #t5 == null ?{self::Class1?} null : #t5{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : let final self::Class1? #t7 = #t6{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t7 == null ?{self::Class1?} null : #t7{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = #t8{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t9 == null ?{self::Class1?} null : #t9{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : #t10{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t11 = n1 in #t11 == null ?{self::Class1?} null : let final self::Class1? #t12 = #t11{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t12 == null ?{self::Class1?} null : #t12{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = #t13{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t14 == null ?{self::Class1?} null : #t14{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t15 = let final self::Class1? #t16 = n1 in #t16 == null ?{self::Class1?} null : #t16{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t15 == null ?{self::Class1?} null : #t15{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+Try accessing using ?. instead.
+  throws(() => (n1?.nullable1 = new Class1()).nullable1);
+                                              ^^^^^^^^^" in (let final self::Class1? #t17 = n1 in #t17 == null ?{self::Class1?} null : #t17{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1}{<nullable>}.{self::Class1?});
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+Try accessing using ?. instead.
+  throws(() => (n1?.nonNullable1Method()).nullable1);
+                                          ^^^^^^^^^" in (let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}).{self::Class1::nullable1}{<nullable>}.{self::Class1?});
+  nullable1 = let final self::Class1? #t19 = n1 in #t19 == null ?{self::Class1?} null : #t19{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t20 = n1 in #t20 == null ?{self::Class1?} null : let final self::Class1? #t21 = #t20{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t21 == null ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t22 = n1 in #t22 == null ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t23 == null ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t24 = n1 in #t24 == null ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t25 == null ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : #t26{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1}{self::Class1?};
+  nullable1 = let final self::Class1? #t27 = n1 in #t27 == null ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t28 = n1 in #t28 == null ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t29 = n1 in #t29 == null ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1};
+  nullable1 = let final self::Class1? #t31 = n1 in #t31 == null ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t32 = n1 in #t32 == null ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t33 = n1 in #t33 == null ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t35 = n1 in #t35 == null ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t38 = n1 in #t38 == null ?{self::Class1?} null : let final self::Class1? #t39 = #t38{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?} in #t39 == null ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : #t40{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  nullable1 = let final self::Class1? #t41 = n1 in #t41 == null ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t42 = n1 in #t42 == null ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t44 = n1 in #t44 == null ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  nullable1 = let final self::Class1? #t45 = n1 in #t45 == null ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t46 = n1 in #t46 == null ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t47 = n1 in #t47 == null ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1}{self::Class1?};
+  nullable1 = let final self::Class1? #t50 = n1 in #t50 == null ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t51 = n1 in #t51 == null ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1};
+  nullable1 = let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1}{self::Class1?};
+  nullable1 = let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t58 = n1 in #t58 == null ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t59 = n1 in #t59 == null ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1};
+  nullable1 = let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t61 = n1 in #t61 == null ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1}{self::Class1?};
+  nullable1 = let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t64 = n1 in #t64 == null ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t65 = n1 in #t65 == null ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1};
+  nullable1 = let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t67 = n1 in #t67 == null ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t68 = n1 in #t68 == null ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t70 = n1 in #t70 == null ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t71 = n1 in #t71 == null ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  nullable1 = let final self::Class1? #t72 = n1 in #t72 == null ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t73 = n1 in #t73 == null ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  nullable1 = let final self::Class1? #t76 = n1 in #t76 == null ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t77 = n1 in #t77 == null ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1}{self::Class1?};
+  let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : let final self::Class1? #t81 = #t80{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1} in #t81 == null ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+}
+static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
+  self::Class1? nullable1 = n1;
+  self::Class2? nullable2 = n2;
+  self::Class3? nullable3 = n3;
+  let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : #t82{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?};
+  let final self::Class1? #t83 = n1 in #t83 == null ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•()){(self::Class1?, self::Class1?) → void};
+  let final self::Class1? #t84 = n1 in #t84 == null ?{self::Class1?} null : let final self::Class1? #t85 = #t84{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t85 == null ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t86 = n1 in #t86 == null ?{self::Class1?} null : #t86{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?};
+  let final self::Class1? #t87 = n1 in #t87 == null ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•()){(self::Class1?, self::Class1?) → void};
+  nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = #t88{self::Class1}.{self::Class1::nonNullable1}{self::Class1} in let final self::Class1? #t90 = nullable1 in let final self::Class1 #t91 = new self::Class1::•() in let final void #t92 = #t89.{self::Class1::[]=}(#t90, #t91){(self::Class1?, self::Class1?) → void} in #t91;
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : let final self::Class1? #t94 = #t93{self::Class1}.{self::Class1::nonNullable1}{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t94 == null ?{self::Class1?} null : #t94{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t95 = n1 in #t95 == null ?{self::Class2?} null : let final self::Class2 #t96 = #t95{self::Class1}.{self::Class1::nonNullable2}{self::Class2} in let final self::Class2? #t97 = nullable2 in #t96.{self::Class2::[]=}(#t97, #t96.{self::Class2::[]}(#t97){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class1? #t98 = n1 in #t98 == null ?{self::Class2?} null : let final self::Class2 #t99 = #t98{self::Class1}.{self::Class1::nonNullable2}{self::Class2} in let final self::Class2? #t100 = nullable2 in let final self::Class2 #t101 = #t99.{self::Class2::[]}(#t100){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2} in let final void #t102 = #t99.{self::Class2::[]=}(#t100, #t101){(self::Class2?, self::Class2?) → void} in #t101;
+  let final self::Class1? #t103 = n1 in #t103 == null ?{self::Class1?} null : let final self::Class1? #t104 = nullable1 in #t103{self::Class1}.{self::Class1::[]}(#t104){(self::Class1?) → self::Class1?} == null ?{self::Class1?} #t103{self::Class1}.{self::Class1::[]=}(#t104, nullable1){(self::Class1?, self::Class1?) → void} : null;
+  nullable1 = let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in let final self::Class1? #t107 = #t105{self::Class1}.{self::Class1::[]}(#t106){(self::Class1?) → self::Class1?} in #t107 == null ?{self::Class1?} let final self::Class1? #t108 = nullable1 in let final void #t109 = #t105{self::Class1}.{self::Class1::[]=}(#t106, #t108){(self::Class1?, self::Class1?) → void} in #t108 : #t107{self::Class1};
+  let final self::Class2? #t110 = n2 in #t110 == null ?{self::Class2?} null : let final self::Class2? #t111 = nullable2 in #t110{self::Class2}.{self::Class2::[]=}(#t111, #t110{self::Class2}.{self::Class2::[]}(#t111){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class2? #t112 = n2 in #t112 == null ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in let final self::Class2 #t114 = #t112{self::Class2}.{self::Class2::[]}(#t113){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2} in let final void #t115 = #t112{self::Class2}.{self::Class2::[]=}(#t113, #t114){(self::Class2?, self::Class2?) → void} in #t114;
+  let final self::Class2? #t116 = n2 in #t116 == null ?{self::Class2?} null : let final self::Class2? #t117 = nullable2 in #t116{self::Class2}.{self::Class2::[]=}(#t117, #t116{self::Class2}.{self::Class2::[]}(#t117){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class2? #t118 = n2 in #t118 == null ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in let final self::Class2 #t120 = #t118{self::Class2}.{self::Class2::[]}(#t119){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2} in let final void #t121 = #t118{self::Class2}.{self::Class2::[]=}(#t119, #t120){(self::Class2?, self::Class2?) → void} in #t120;
+  let final self::Class2? #t122 = n2 in #t122 == null ?{self::Class2?} null : let final self::Class2? #t123 = nullable2 in #t122{self::Class2}.{self::Class2::[]=}(#t123, #t122{self::Class2}.{self::Class2::[]}(#t123){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class2? #t124 = n2 in #t124 == null ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in let final self::Class2 #t126 = #t124{self::Class2}.{self::Class2::[]}(#t125){(self::Class2?) → self::Class2} in let final void #t127 = #t124{self::Class2}.{self::Class2::[]=}(#t125, #t126.{self::Class2::+}(1){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void} in #t126;
+  let final self::Class2? #t128 = n2 in #t128 == null ?{self::Class2?} null : let final self::Class2? #t129 = nullable2 in let final self::Class2 #t130 = #t128{self::Class2}.{self::Class2::[]}(#t129){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t131 = #t128{self::Class2}.{self::Class2::[]=}(#t129, #t130){(self::Class2?, self::Class2?) → void} in #t130;
+  nullable2 = let final self::Class2? #t132 = n2 in #t132 == null ?{self::Class2?} null : let final self::Class2? #t133 = nullable2 in let final self::Class2 #t134 = #t132{self::Class2}.{self::Class2::[]}(#t133){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t135 = #t132{self::Class2}.{self::Class2::[]=}(#t133, #t134){(self::Class2?, self::Class2?) → void} in #t134;
+  let final self::Class1? #t136 = n1 in #t136 == null ?{self::Class2?} null : let final self::Class2 #t137 = #t136{self::Class1}.{self::Class1::nonNullable2}{self::Class2} in let final self::Class2? #t138 = nullable2 in #t137.{self::Class2::[]=}(#t138, #t137.{self::Class2::[]}(#t138){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class1? #t139 = n1 in #t139 == null ?{self::Class2?} null : let final self::Class2 #t140 = #t139{self::Class1}.{self::Class1::nonNullable2}{self::Class2} in let final self::Class2? #t141 = nullable2 in let final self::Class2 #t142 = #t140.{self::Class2::[]}(#t141){(self::Class2?) → self::Class2} in let final void #t143 = #t140.{self::Class2::[]=}(#t141, #t142.{self::Class2::+}(1){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void} in #t142;
+  let final self::Class1? #t144 = n1 in #t144 == null ?{self::Class2?} null : let final self::Class2 #t145 = #t144{self::Class1}.{self::Class1::nonNullable2}{self::Class2} in let final self::Class2? #t146 = nullable2 in let final self::Class2 #t147 = #t145.{self::Class2::[]}(#t146){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t148 = #t145.{self::Class2::[]=}(#t146, #t147){(self::Class2?, self::Class2?) → void} in #t147;
+  nullable2 = let final self::Class1? #t149 = n1 in #t149 == null ?{self::Class2?} null : let final self::Class2 #t150 = #t149{self::Class1}.{self::Class1::nonNullable2}{self::Class2} in let final self::Class2? #t151 = nullable2 in let final self::Class2 #t152 = #t150.{self::Class2::[]}(#t151){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t153 = #t150.{self::Class2::[]=}(#t151, #t152){(self::Class2?, self::Class2?) → void} in #t152;
+  let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class2?} null : #t154{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2};
+  let final self::Class1? #t155 = n1 in #t155 == null ?{self::Class2?} null : #t155{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2}.{self::Class2::[]=}(nullable2, new self::Class2::•()){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class1? #t156 = n1 in #t156 == null ?{self::Class2?} null : let final self::Class2 #t157 = #t156{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2} in let final self::Class2? #t158 = nullable2 in let final self::Class2 #t159 = new self::Class2::•() in let final void #t160 = #t157.{self::Class2::[]=}(#t158, #t159){(self::Class2?, self::Class2?) → void} in #t159;
+  let final self::Class1? #t161 = n1 in #t161 == null ?{self::Class2?} null : let final self::Class2? #t162 = #t161{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2} in #t162 == null ?{self::Class2?} null : #t162{self::Class2}.{self::Class2::nonNullable2Method}(){() → self::Class2};
+  let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class2?} null : let final self::Class2 #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2} in let final self::Class2? #t165 = nullable2 in #t164.{self::Class2::[]=}(#t165, #t164.{self::Class2::[]}(#t165){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class2?} null : let final self::Class2 #t167 = #t166{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2} in let final self::Class2? #t168 = nullable2 in let final self::Class2 #t169 = #t167.{self::Class2::[]}(#t168){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2} in let final void #t170 = #t167.{self::Class2::[]=}(#t168, #t169){(self::Class2?, self::Class2?) → void} in #t169;
+  let final self::Class1? #t171 = n1 in #t171 == null ?{self::Class2?} null : let final self::Class2 #t172 = #t171{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2} in let final self::Class2? #t173 = nullable2 in #t172.{self::Class2::[]=}(#t173, #t172.{self::Class2::[]}(#t173){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class1? #t174 = n1 in #t174 == null ?{self::Class2?} null : let final self::Class2 #t175 = #t174{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2} in let final self::Class2? #t176 = nullable2 in let final self::Class2 #t177 = #t175.{self::Class2::[]}(#t176){(self::Class2?) → self::Class2} in let final void #t178 = #t175.{self::Class2::[]=}(#t176, #t177.{self::Class2::+}(1){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void} in #t177;
+  let final self::Class1? #t179 = n1 in #t179 == null ?{self::Class2?} null : let final self::Class2 #t180 = #t179{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2} in let final self::Class2? #t181 = nullable2 in let final self::Class2 #t182 = #t180.{self::Class2::[]}(#t181){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t183 = #t180.{self::Class2::[]=}(#t181, #t182){(self::Class2?, self::Class2?) → void} in #t182;
+  nullable2 = let final self::Class1? #t184 = n1 in #t184 == null ?{self::Class2?} null : let final self::Class2 #t185 = #t184{self::Class1}.{self::Class1::nonNullable2}{self::Class2}.{self::Class2::[]}(nullable2){(self::Class2?) → self::Class2} in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = #t185.{self::Class2::[]}(#t186){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t188 = #t185.{self::Class2::[]=}(#t186, #t187){(self::Class2?, self::Class2?) → void} in #t187;
+  let final self::Class1? #t189 = n1 in #t189 == null ?{self::Class1?} null : let final self::Class1? #t190 = #t189{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t190 == null ?{self::Class1?} null : #t190{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?};
+  let final self::Class1? #t191 = n1 in #t191 == null ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t192 == null ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•()){(self::Class1?, self::Class1?) → void};
+  nullable1 = let final self::Class1? #t193 = n1 in #t193 == null ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t194 == null ?{self::Class1?} null : let final self::Class1? #t195 = nullable1 in let final self::Class1 #t196 = new self::Class1::•() in let final void #t197 = #t194{self::Class1}.{self::Class1::[]=}(#t195, #t196){(self::Class1?, self::Class1?) → void} in #t196;
+  let final self::Class1? #t198 = n1 in #t198 == null ?{self::Class1?} null : let final self::Class1? #t199 = #t198{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t199 == null ?{self::Class1?} null : let final self::Class1? #t200 = #t199{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t200 == null ?{self::Class1?} null : #t200{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  nullable1 = let final self::Class1? #t201 = n1 in #t201 == null ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t202 == null ?{self::Class1?} null : let final self::Class1? #t203 = #t202{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t203 == null ?{self::Class1?} null : #t203{self::Class1}.{self::Class1::nonNullable1Method}(){() → self::Class1};
+  let final self::Class1? #t204 = n1 in #t204 == null ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t205 == null ?{self::Class1?} null : let final self::Class1? #t206 = nullable1 in #t205{self::Class1}.{self::Class1::[]}(#t206){(self::Class1?) → self::Class1?} == null ?{self::Class1?} #t205{self::Class1}.{self::Class1::[]=}(#t206, nullable1){(self::Class1?, self::Class1?) → void} : null;
+  nullable1 = let final self::Class1? #t207 = n1 in #t207 == null ?{self::Class1?} null : let final self::Class1? #t208 = #t207{self::Class1}.{self::Class1::[]}(nullable1){(self::Class1?) → self::Class1?} in #t208 == null ?{self::Class1?} null : let final self::Class1? #t209 = nullable1 in let final self::Class1? #t210 = #t208{self::Class1}.{self::Class1::[]}(#t209){(self::Class1?) → self::Class1?} in #t210 == null ?{self::Class1?} let final self::Class1? #t211 = nullable1 in let final void #t212 = #t208{self::Class1}.{self::Class1::[]=}(#t209, #t211){(self::Class1?, self::Class1?) → void} in #t211 : #t210{self::Class1};
+  let final self::Class3? #t213 = n3 in #t213 == null ?{self::Class2?} null : let final self::Class2? #t214 = #t213{self::Class3}.{self::Class3::[]}(nullable3){(self::Class3?) → self::Class2?} in #t214 == null ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in #t214{self::Class2}.{self::Class2::[]=}(#t215, #t214{self::Class2}.{self::Class2::[]}(#t215){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class3? #t216 = n3 in #t216 == null ?{self::Class2?} null : let final self::Class2? #t217 = #t216{self::Class3}.{self::Class3::[]}(nullable3){(self::Class3?) → self::Class2?} in #t217 == null ?{self::Class2?} null : let final self::Class2? #t218 = nullable2 in let final self::Class2 #t219 = #t217{self::Class2}.{self::Class2::[]}(#t218){(self::Class2?) → self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2} in let final void #t220 = #t217{self::Class2}.{self::Class2::[]=}(#t218, #t219){(self::Class2?, self::Class2?) → void} in #t219;
+  let final self::Class3? #t221 = n3 in #t221 == null ?{self::Class2?} null : let final self::Class2? #t222 = #t221{self::Class3}.{self::Class3::[]}(nullable3){(self::Class3?) → self::Class2?} in #t222 == null ?{self::Class2?} null : let final self::Class2? #t223 = nullable2 in #t222{self::Class2}.{self::Class2::[]=}(#t223, #t222{self::Class2}.{self::Class2::[]}(#t223){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void};
+  nullable2 = let final self::Class3? #t224 = n3 in #t224 == null ?{self::Class2?} null : let final self::Class2? #t225 = #t224{self::Class3}.{self::Class3::[]}(nullable3){(self::Class3?) → self::Class2?} in #t225 == null ?{self::Class2?} null : let final self::Class2? #t226 = nullable2 in let final self::Class2 #t227 = #t225{self::Class2}.{self::Class2::[]}(#t226){(self::Class2?) → self::Class2} in let final void #t228 = #t225{self::Class2}.{self::Class2::[]=}(#t226, #t227.{self::Class2::+}(1){(core::int) → self::Class2}){(self::Class2?, self::Class2?) → void} in #t227;
+  let final self::Class3? #t229 = n3 in #t229 == null ?{self::Class2?} null : let final self::Class2? #t230 = #t229{self::Class3}.{self::Class3::[]}(nullable3){(self::Class3?) → self::Class2?} in #t230 == null ?{self::Class2?} null : let final self::Class2? #t231 = nullable2 in let final self::Class2 #t232 = #t230{self::Class2}.{self::Class2::[]}(#t231){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t233 = #t230{self::Class2}.{self::Class2::[]=}(#t231, #t232){(self::Class2?, self::Class2?) → void} in #t232;
+  nullable2 = let final self::Class3? #t234 = n3 in #t234 == null ?{self::Class2?} null : let final self::Class2? #t235 = #t234{self::Class3}.{self::Class3::[]}(nullable3){(self::Class3?) → self::Class2?} in #t235 == null ?{self::Class2?} null : let final self::Class2? #t236 = nullable2 in let final self::Class2 #t237 = #t235{self::Class2}.{self::Class2::[]}(#t236){(self::Class2?) → self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t238 = #t235{self::Class2}.{self::Class2::[]=}(#t236, #t237){(self::Class2?, self::Class2?) → void} in #t237;
+}
+static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
+  self::Class2? nullable2 = n2;
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+  throws(() => n1?.nonNullable1 + 0);
+                                ^" in (let final self::Class1? #t239 = n1 in #t239 == null ?{self::Class1?} null : #t239{self::Class1}.{self::Class1::nonNullable1}{self::Class1}).{self::Class1::+}(0){(core::int) → self::Class1?});
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+  throws(() => -n1?.nonNullable1);
+               ^" in (let final self::Class1? #t240 = n1 in #t240 == null ?{self::Class1?} null : #t240{self::Class1}.{self::Class1::nonNullable1}{self::Class1}).{self::Class1::unary-}(){() → self::Class1?});
+  let final self::Class2? #t241 = n2 in #t241 == null ?{self::Class2?} null : #t241.{self::Class2::nonNullable2} = #t241.{self::Class2::nonNullable2}{self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2};
+  nullable2 = let final self::Class2? #t242 = n2 in #t242 == null ?{self::Class2?} null : let final self::Class2 #t243 = #t242.{self::Class2::nonNullable2}{self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2} in let final void #t244 = #t242.{self::Class2::nonNullable2} = #t243 in #t243;
+  let final self::Class2? #t245 = n2 in #t245 == null ?{self::Class2?} null : let final self::Class2 #t246 = #t245{self::Class2}.{self::Class2::nonNullable2}{self::Class2} in #t246.{self::Class2::nonNullable2} = #t246.{self::Class2::nonNullable2}{self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2};
+  nullable2 = let final self::Class2? #t247 = n2 in #t247 == null ?{self::Class2?} null : let final self::Class2 #t248 = #t247{self::Class2}.{self::Class2::nonNullable2}{self::Class2} in #t248.{self::Class2::nonNullable2} = #t248.{self::Class2::nonNullable2}{self::Class2}.{self::Class2::+}(0){(core::int) → self::Class2};
+  let final self::Class2? #t249 = n2 in #t249 == null ?{self::Class2?} null : #t249.{self::Class2::nonNullable2} = #t249.{self::Class2::nonNullable2}{self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2};
+  nullable2 = let final self::Class2? #t250 = n2 in #t250 == null ?{self::Class2?} null : let final self::Class2 #t251 = #t250.{self::Class2::nonNullable2}{self::Class2} in let final void #t252 = #t250.{self::Class2::nonNullable2} = #t251.{self::Class2::+}(1){(core::int) → self::Class2} in #t251;
+  let final self::Class2? #t253 = n2 in #t253 == null ?{self::Class2?} null : let final self::Class2 #t254 = #t253.{self::Class2::nonNullable2}{self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t255 = #t253.{self::Class2::nonNullable2} = #t254 in #t254;
+  nullable2 = let final self::Class2? #t256 = n2 in #t256 == null ?{self::Class2?} null : let final self::Class2 #t257 = #t256.{self::Class2::nonNullable2}{self::Class2}.{self::Class2::+}(1){(core::int) → self::Class2} in let final void #t258 = #t256.{self::Class2::nonNullable2} = #t257 in #t257;
+}
+static method ifNull(self::Class1? n1) → void {
+  self::Class1? nullable1 = n1;
+  let final self::Class1? #t259 = n1 in #t259 == null ?{self::Class1?} null : #t259.{self::Class1::nullable1}{self::Class1?} == null ?{self::Class1} #t259.{self::Class1::nullable1} = n1{self::Class1} : null;
+  n1 = let final self::Class1? #t260 = n1 in #t260 == null ?{self::Class1?} null : let final self::Class1? #t261 = #t260.{self::Class1::nullable1}{self::Class1?} in #t261 == null ?{self::Class1} #t260.{self::Class1::nullable1} = n1{self::Class1} : #t261{self::Class1};
+  let final self::Class1? #t262 = n1 in #t262 == null ?{self::Class1?} null : let final self::Class1 #t263 = #t262{self::Class1}.{self::Class1::nonNullable1}{self::Class1} in #t263.{self::Class1::nullable1}{self::Class1?} == null ?{self::Class1} #t263.{self::Class1::nullable1} = n1{self::Class1} : null;
+  n1 = let final self::Class1? #t264 = n1 in #t264 == null ?{self::Class1?} null : let final self::Class1 #t265 = #t264{self::Class1}.{self::Class1::nonNullable1}{self::Class1} in let final self::Class1? #t266 = #t265.{self::Class1::nullable1}{self::Class1?} in #t266 == null ?{self::Class1} #t265.{self::Class1::nullable1} = n1{self::Class1} : #t266{self::Class1};
+  let final self::Class1? #t267 = n1 in #t267 == null ?{self::Class1?} null : let final self::Class1 #t268 = #t267{self::Class1}.{self::Class1::nonNullable1}{self::Class1} in let final self::Class1 #t269 = n1{self::Class1} in #t268.{self::Class1::[]}(#t269){(self::Class1?) → self::Class1?} == null ?{self::Class1} #t268.{self::Class1::[]=}(#t269, n1{self::Class1}){(self::Class1?, self::Class1?) → void} : null;
+  n1 = let final self::Class1? #t270 = n1 in #t270 == null ?{self::Class1?} null : let final self::Class1 #t271 = #t270{self::Class1}.{self::Class1::nonNullable1}{self::Class1} in let final self::Class1 #t272 = n1{self::Class1} in let final self::Class1? #t273 = #t271.{self::Class1::[]}(#t272){(self::Class1?) → self::Class1?} in #t273 == null ?{self::Class1} let final self::Class1 #t274 = n1{self::Class1} in let final void #t275 = #t271.{self::Class1::[]=}(#t272, #t274){(self::Class1?, self::Class1?) → void} in #t274 : #t273{self::Class1};
+}
+static method throws(() → void f) → void {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.modular.expect
new file mode 100644
index 0000000..740e044
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_shorting_cascade.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method() → self::Class
+    return this;
+}
+extension Extension on self::Class {
+  method extensionMethod = self::Extension|extensionMethod;
+  tearoff extensionMethod = self::Extension|get#extensionMethod;
+}
+static method Extension|extensionMethod(lowered final self::Class #this) → self::Class
+  return #this;
+static method Extension|get#extensionMethod(lowered final self::Class #this) → () → self::Class
+  return () → self::Class => self::Extension|extensionMethod(#this);
+static method main() → dynamic {
+  self::Class? c;
+  let final self::Class? #t1 = c in #t1 == null ?{self::Class?} null : block {
+    #t1{self::Class}.{self::Class::method}(){() → self::Class};
+  } =>#t1;
+  let final self::Class? #t2 = c in #t2 == null ?{self::Class?} null : block {
+    #t2{self::Class}.{self::Class::method}(){() → self::Class};
+    #t2{self::Class}.{self::Class::method}(){() → self::Class};
+  } =>#t2;
+  let final self::Class? #t3 = c in #t3 == null ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t3{self::Class});
+  } =>#t3;
+  let final self::Class? #t4 = c in #t4 == null ?{self::Class?} null : block {
+    self::Extension|extensionMethod(#t4{self::Class});
+    self::Extension|extensionMethod(#t4{self::Class});
+  } =>#t4;
+}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..410df6c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart.weak.modular.expect
@@ -0,0 +1,298 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+// Try accessing using ?. instead.
+//   throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
+//                                                           ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+// Try accessing using ?. instead.
+//   throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
+//                                                       ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+//   throws(() => Extension1(n1)?.nonNullable1 + 0);
+//                                             ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+//   throws(() => -Extension1(n1)?.nonNullable1);
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  get property() → self::Class1?
+    return null;
+  set property(self::Class1? value) → void {}
+  get property1() → self::Class1
+    return new self::Class1::•();
+  get property2() → self::Class2
+    return new self::Class2::•();
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+  get property() → self::Class2
+    return this;
+  set property(self::Class2 value) → void {}
+}
+class Class3 extends core::Object {
+  synthetic constructor •() → self::Class3
+    : super core::Object::•()
+    ;
+  get property() → self::Class2?
+    return null;
+}
+extension Extension1 on self::Class1 {
+  get nullable1 = self::Extension1|get#nullable1;
+  method nonNullable1Method = self::Extension1|nonNullable1Method;
+  tearoff nonNullable1Method = self::Extension1|get#nonNullable1Method;
+  operator [] = self::Extension1|[];
+  operator []= = self::Extension1|[]=;
+  operator + = self::Extension1|+;
+  operator unary- = self::Extension1|unary-;
+  get nonNullable1 = self::Extension1|get#nonNullable1;
+  get nonNullable2 = self::Extension1|get#nonNullable2;
+  set nullable1 = self::Extension1|set#nullable1;
+}
+extension Extension2 on self::Class2 {
+  method nonNullable2Method = self::Extension2|nonNullable2Method;
+  tearoff nonNullable2Method = self::Extension2|get#nonNullable2Method;
+  operator [] = self::Extension2|[];
+  operator []= = self::Extension2|[]=;
+  operator + = self::Extension2|+;
+  operator unary- = self::Extension2|unary-;
+  get nonNullable2 = self::Extension2|get#nonNullable2;
+  set nonNullable2 = self::Extension2|set#nonNullable2;
+}
+extension Extension3 on self::Class3 {
+  operator [] = self::Extension3|[];
+}
+static method Extension1|get#nullable1(lowered final self::Class1 #this) → self::Class1?
+  return #this.{self::Class1::property1}{self::Class1};
+static method Extension1|set#nullable1(lowered final self::Class1 #this, self::Class1? value) → void {
+  #this.{self::Class1::property} = value;
+}
+static method Extension1|nonNullable1Method(lowered final self::Class1 #this) → self::Class1
+  return self::Extension1|get#nonNullable1(#this);
+static method Extension1|get#nonNullable1Method(lowered final self::Class1 #this) → () → self::Class1
+  return () → self::Class1 => self::Extension1|nonNullable1Method(#this);
+static method Extension1|[](lowered final self::Class1 #this, self::Class1? key) → self::Class1?
+  return self::Extension1|get#nullable1(#this);
+static method Extension1|[]=(lowered final self::Class1 #this, self::Class1? key, self::Class1? value) → void {
+  #this.{self::Class1::property} = value;
+}
+static method Extension1|+(lowered final self::Class1 #this, core::int value) → self::Class1?
+  return self::Extension1|get#nullable1(#this);
+static method Extension1|unary-(lowered final self::Class1 #this) → self::Class1?
+  return self::Extension1|get#nullable1(#this);
+static method Extension1|get#nonNullable1(lowered final self::Class1 #this) → self::Class1
+  return #this.{self::Class1::property1}{self::Class1};
+static method Extension1|get#nonNullable2(lowered final self::Class1 #this) → self::Class2
+  return #this.{self::Class1::property2}{self::Class2};
+static method Extension2|nonNullable2Method(lowered final self::Class2 #this) → self::Class2
+  return self::Extension2|get#nonNullable2(#this);
+static method Extension2|get#nonNullable2Method(lowered final self::Class2 #this) → () → self::Class2
+  return () → self::Class2 => self::Extension2|nonNullable2Method(#this);
+static method Extension2|[](lowered final self::Class2 #this, self::Class2? key) → self::Class2
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|[]=(lowered final self::Class2 #this, self::Class2? key, self::Class2? value) → void
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|+(lowered final self::Class2 #this, core::int value) → self::Class2
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|unary-(lowered final self::Class2 #this) → self::Class2
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|get#nonNullable2(lowered final self::Class2 #this) → self::Class2
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|set#nonNullable2(lowered final self::Class2 #this, self::Class2 value) → void {
+  #this.{self::Class2::property} = value;
+}
+static method Extension3|[](lowered final self::Class3 #this, self::Class3? key) → self::Class2?
+  return #this.{self::Class3::property}{self::Class2?};
+static method main() → dynamic {
+  self::propertyAccess(null);
+  self::indexAccess(null, null, null);
+  self::operatorAccess(null, null);
+  self::ifNull(null);
+}
+static method propertyAccess(self::Class1? n1) → void {
+  self::Class1? nullable1 = n1;
+  let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t1{self::Class1});
+  let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
+  nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : let final self::Class1 #t4 = new self::Class1::•() in let final void #t5 = self::Extension1|set#nullable1(#t3{self::Class1}, #t4) in #t4;
+  let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t6{self::Class1});
+  let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
+  let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
+  let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
+  let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+Try accessing using ?. instead.
+  throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1);
+                                                          ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19 == null ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+Try accessing using ?. instead.
+  throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
+                                                      ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
+  nullable1 = let final self::Class1? #t23 = n1 in #t23 == null ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
+  nullable1 = let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27 == null ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
+  nullable1 = let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31 == null ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
+  let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
+  let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
+  let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
+  nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
+  let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
+  let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+  let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
+  let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
+  let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
+  let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
+  let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
+  nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
+  let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
+  let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+  let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
+  let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
+  nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
+  let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
+  nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
+  let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
+  nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
+  let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
+  nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
+  let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
+  let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
+  nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
+  let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
+  let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
+  let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
+  let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
+  let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t148 = n1 in #t148 == null ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
+  let final self::Class1? #t151 = n1 in #t151 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
+  nullable1 = let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
+  let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
+  let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
+  let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+  let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{self::Class1});
+}
+static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
+  self::Class1? nullable1 = n1;
+  self::Class2? nullable2 = n2;
+  self::Class3? nullable3 = n3;
+  let final self::Class1? #t168 = n1 in #t168 == null ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
+  let final self::Class1? #t169 = n1 in #t169 == null ?{void} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t170 = n1 in #t170 == null ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
+  let final self::Class1? #t172 = n1 in #t172 == null ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
+  let final self::Class1? #t173 = n1 in #t173 == null ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t174 = n1 in #t174 == null ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
+  let final self::Class1? #t179 = n1 in #t179 == null ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
+  let final self::Class1? #t181 = n1 in #t181 == null ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
+  nullable2 = let final self::Class1? #t184 = n1 in #t184 == null ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
+  let final self::Class1? #t189 = n1 in #t189 == null ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190) == null ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
+  nullable1 = let final self::Class1? #t191 = n1 in #t191 == null ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193 == null ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
+  let final self::Class2? #t196 = n2 in #t196 == null ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
+  nullable2 = let final self::Class2? #t198 = n2 in #t198 == null ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
+  let final self::Class2? #t202 = n2 in #t202 == null ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
+  nullable2 = let final self::Class2? #t204 = n2 in #t204 == null ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
+  let final self::Class2? #t208 = n2 in #t208 == null ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
+  nullable2 = let final self::Class2? #t210 = n2 in #t210 == null ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
+  let final self::Class2? #t214 = n2 in #t214 == null ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
+  nullable2 = let final self::Class2? #t218 = n2 in #t218 == null ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
+  let final self::Class1? #t222 = n1 in #t222 == null ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
+  nullable2 = let final self::Class1? #t225 = n1 in #t225 == null ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
+  let final self::Class1? #t230 = n1 in #t230 == null ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
+  nullable2 = let final self::Class1? #t235 = n1 in #t235 == null ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
+  let final self::Class1? #t240 = n1 in #t240 == null ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
+  let final self::Class1? #t241 = n1 in #t241 == null ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
+  nullable2 = let final self::Class1? #t242 = n1 in #t242 == null ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
+  let final self::Class1? #t247 = n1 in #t247 == null ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248 == null ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
+  let final self::Class1? #t249 = n1 in #t249 == null ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
+  nullable2 = let final self::Class1? #t252 = n1 in #t252 == null ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
+  let final self::Class1? #t257 = n1 in #t257 == null ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
+  nullable2 = let final self::Class1? #t260 = n1 in #t260 == null ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
+  let final self::Class1? #t265 = n1 in #t265 == null ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
+  nullable2 = let final self::Class1? #t270 = n1 in #t270 == null ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
+  let final self::Class1? #t275 = n1 in #t275 == null ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276 == null ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
+  let final self::Class1? #t277 = n1 in #t277 == null ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278 == null ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t279 = n1 in #t279 == null ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280 == null ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
+  let final self::Class1? #t284 = n1 in #t284 == null ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285 == null ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
+  nullable1 = let final self::Class1? #t287 = n1 in #t287 == null ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288 == null ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
+  let final self::Class1? #t290 = n1 in #t290 == null ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291 == null ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292) == null ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
+  nullable1 = let final self::Class1? #t293 = n1 in #t293 == null ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294 == null ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296 == null ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
+  let final self::Class3? #t299 = n3 in #t299 == null ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300 == null ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
+  nullable2 = let final self::Class3? #t302 = n3 in #t302 == null ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303 == null ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
+  let final self::Class3? #t307 = n3 in #t307 == null ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308 == null ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
+  nullable2 = let final self::Class3? #t310 = n3 in #t310 == null ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311 == null ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
+  let final self::Class3? #t315 = n3 in #t315 == null ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316 == null ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
+  nullable2 = let final self::Class3? #t320 = n3 in #t320 == null ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321 == null ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+}
+static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
+  self::Class2? nullable2 = n2;
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+  throws(() => Extension1(n1)?.nonNullable1 + 0);
+                                            ^" in self::Extension1|+(let final self::Class1? #t325 = n1 in #t325 == null ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+  throws(() => -Extension1(n1)?.nonNullable1);
+               ^" in self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326 == null ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
+  let final self::Class2? #t327 = n2 in #t327 == null ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t327{self::Class2}), 0));
+  nullable2 = let final self::Class2? #t328 = n2 in #t328 == null ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328{self::Class2}), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328{self::Class2}, #t329) in #t329;
+  let final self::Class2? #t331 = n2 in #t331 == null ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
+  nullable2 = let final self::Class2? #t333 = n2 in #t333 == null ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
+  let final self::Class2? #t337 = n2 in #t337 == null ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t337{self::Class2}), 1));
+  nullable2 = let final self::Class2? #t338 = n2 in #t338 == null ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final self::Class2 #t340 = let final self::Class2 #t341 = self::Extension2|+(#t339, 1) in let final void #t342 = self::Extension2|set#nonNullable2(#t338{self::Class2}, #t341) in #t341 in #t339;
+  let final self::Class2? #t343 = n2 in #t343 == null ?{self::Class2?} null : let final self::Class2 #t344 = self::Extension2|+(self::Extension2|get#nonNullable2(#t343{self::Class2}), 1) in let final void #t345 = self::Extension2|set#nonNullable2(#t343{self::Class2}, #t344) in #t344;
+  nullable2 = let final self::Class2? #t346 = n2 in #t346 == null ?{self::Class2?} null : let final self::Class2 #t347 = self::Extension2|+(self::Extension2|get#nonNullable2(#t346{self::Class2}), 1) in let final void #t348 = self::Extension2|set#nonNullable2(#t346{self::Class2}, #t347) in #t347;
+}
+static method ifNull(self::Class1? n1) → void {
+  self::Class1? nullable1 = n1;
+  let final self::Class1? #t349 = n1 in #t349 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t349) == null ?{self::Class1} self::Extension1|set#nullable1(#t349, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t350 = n1 in #t350 == null ?{self::Class1?} null : let final self::Class1? #t351 = self::Extension1|get#nullable1(#t350) in #t351 == null ?{self::Class1} let final self::Class1 #t352 = n1{self::Class1} in let final void #t353 = self::Extension1|set#nullable1(#t350, #t352) in #t352 : #t351{self::Class1};
+  let final self::Class1? #t354 = n1 in #t354 == null ?{self::Class1?} null : let final self::Class1 #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in self::Extension1|get#nullable1(#t355) == null ?{self::Class1} self::Extension1|set#nullable1(#t355, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t356 = n1 in #t356 == null ?{self::Class1?} null : let final self::Class1 #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in let final self::Class1? #t358 = self::Extension1|get#nullable1(#t357) in #t358 == null ?{self::Class1} let final self::Class1 #t359 = n1{self::Class1} in let final void #t360 = self::Extension1|set#nullable1(#t357, #t359) in #t359 : #t358{self::Class1};
+  let final self::Class1? #t361 = n1 in #t361 == null ?{self::Class1?} null : let final self::Class1 #t362 = self::Extension1|get#nonNullable1(#t361{self::Class1}) in let final self::Class1 #t363 = n1{self::Class1} in self::Extension1|[](#t362, #t363) == null ?{self::Class1} self::Extension1|[]=(#t362, #t363, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t364 = n1 in #t364 == null ?{self::Class1?} null : let final self::Class1 #t365 = self::Extension1|get#nonNullable1(#t364{self::Class1}) in let final self::Class1 #t366 = n1{self::Class1} in let final self::Class1? #t367 = self::Extension1|[](#t365, #t366) in #t367 == null ?{self::Class1} let final self::Class1 #t368 = n1{self::Class1} in let final void #t369 = self::Extension1|[]=(#t365, #t366, #t368) in #t368 : #t367{self::Class1};
+}
+static method throws(() → void f) → void {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..954b4c0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_shorting_extension.dart.weak.modular.expect
@@ -0,0 +1,298 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+// Try accessing using ?. instead.
+//   throws(() => (n1?.nullable1 = new Class1()).nullable1);
+//                                               ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+// Try accessing using ?. instead.
+//   throws(() => (n1?.nonNullable1Method()).nullable1);
+//                                           ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+//   throws(() => n1?.nonNullable1 + 0);
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+//   throws(() => -n1?.nonNullable1);
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  get property() → self::Class1?
+    return null;
+  set property(self::Class1? value) → void {}
+  get property1() → self::Class1
+    return new self::Class1::•();
+  get property2() → self::Class2
+    return new self::Class2::•();
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+  get property() → self::Class2
+    return this;
+  set property(self::Class2 value) → void {}
+}
+class Class3 extends core::Object {
+  synthetic constructor •() → self::Class3
+    : super core::Object::•()
+    ;
+  get property() → self::Class2?
+    return null;
+}
+extension Extension1 on self::Class1 {
+  get nullable1 = self::Extension1|get#nullable1;
+  method nonNullable1Method = self::Extension1|nonNullable1Method;
+  tearoff nonNullable1Method = self::Extension1|get#nonNullable1Method;
+  operator [] = self::Extension1|[];
+  operator []= = self::Extension1|[]=;
+  operator + = self::Extension1|+;
+  operator unary- = self::Extension1|unary-;
+  get nonNullable1 = self::Extension1|get#nonNullable1;
+  get nonNullable2 = self::Extension1|get#nonNullable2;
+  set nullable1 = self::Extension1|set#nullable1;
+}
+extension Extension2 on self::Class2 {
+  method nonNullable2Method = self::Extension2|nonNullable2Method;
+  tearoff nonNullable2Method = self::Extension2|get#nonNullable2Method;
+  operator [] = self::Extension2|[];
+  operator []= = self::Extension2|[]=;
+  operator + = self::Extension2|+;
+  operator unary- = self::Extension2|unary-;
+  get nonNullable2 = self::Extension2|get#nonNullable2;
+  set nonNullable2 = self::Extension2|set#nonNullable2;
+}
+extension Extension3 on self::Class3 {
+  operator [] = self::Extension3|[];
+}
+static method Extension1|get#nullable1(lowered final self::Class1 #this) → self::Class1?
+  return #this.{self::Class1::property1}{self::Class1};
+static method Extension1|set#nullable1(lowered final self::Class1 #this, self::Class1? value) → void {
+  #this.{self::Class1::property} = value;
+}
+static method Extension1|nonNullable1Method(lowered final self::Class1 #this) → self::Class1
+  return self::Extension1|get#nonNullable1(#this);
+static method Extension1|get#nonNullable1Method(lowered final self::Class1 #this) → () → self::Class1
+  return () → self::Class1 => self::Extension1|nonNullable1Method(#this);
+static method Extension1|[](lowered final self::Class1 #this, self::Class1? key) → self::Class1?
+  return self::Extension1|get#nullable1(#this);
+static method Extension1|[]=(lowered final self::Class1 #this, self::Class1? key, self::Class1? value) → void {
+  #this.{self::Class1::property} = value;
+}
+static method Extension1|+(lowered final self::Class1 #this, core::int value) → self::Class1?
+  return self::Extension1|get#nullable1(#this);
+static method Extension1|unary-(lowered final self::Class1 #this) → self::Class1?
+  return self::Extension1|get#nullable1(#this);
+static method Extension1|get#nonNullable1(lowered final self::Class1 #this) → self::Class1
+  return #this.{self::Class1::property1}{self::Class1};
+static method Extension1|get#nonNullable2(lowered final self::Class1 #this) → self::Class2
+  return #this.{self::Class1::property2}{self::Class2};
+static method Extension2|nonNullable2Method(lowered final self::Class2 #this) → self::Class2
+  return self::Extension2|get#nonNullable2(#this);
+static method Extension2|get#nonNullable2Method(lowered final self::Class2 #this) → () → self::Class2
+  return () → self::Class2 => self::Extension2|nonNullable2Method(#this);
+static method Extension2|[](lowered final self::Class2 #this, self::Class2? key) → self::Class2
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|[]=(lowered final self::Class2 #this, self::Class2? key, self::Class2? value) → void
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|+(lowered final self::Class2 #this, core::int value) → self::Class2
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|unary-(lowered final self::Class2 #this) → self::Class2
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|get#nonNullable2(lowered final self::Class2 #this) → self::Class2
+  return #this.{self::Class2::property}{self::Class2};
+static method Extension2|set#nonNullable2(lowered final self::Class2 #this, self::Class2 value) → void {
+  #this.{self::Class2::property} = value;
+}
+static method Extension3|[](lowered final self::Class3 #this, self::Class3? key) → self::Class2?
+  return #this.{self::Class3::property}{self::Class2?};
+static method main() → dynamic {
+  self::propertyAccess(null);
+  self::indexAccess(null, null, null);
+  self::operatorAccess(null, null);
+  self::ifNull(null);
+}
+static method propertyAccess(self::Class1? n1) → void {
+  self::Class1? nullable1 = n1;
+  let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t1{self::Class1});
+  let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
+  nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : let final self::Class1 #t4 = new self::Class1::•() in let final void #t5 = self::Extension1|set#nullable1(#t3{self::Class1}, #t4) in #t4;
+  let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t6{self::Class1});
+  let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
+  let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
+  let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
+  let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
+  let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+Try accessing using ?. instead.
+  throws(() => (n1?.nullable1 = new Class1()).nullable1);
+                                              ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19 == null ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+Try accessing using ?. instead.
+  throws(() => (n1?.nonNullable1Method()).nullable1);
+                                          ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
+  nullable1 = let final self::Class1? #t23 = n1 in #t23 == null ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
+  nullable1 = let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27 == null ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
+  nullable1 = let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31 == null ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
+  let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
+  let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
+  let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
+  nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
+  let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
+  let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
+  let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+  let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
+  let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
+  let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
+  let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
+  let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
+  nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
+  let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
+  let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
+  let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+  let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
+  let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
+  nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
+  let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
+  let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
+  nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
+  let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
+  nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
+  let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
+  nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
+  let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
+  let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
+  nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
+  let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
+  let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
+  let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
+  let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
+  let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t148 = n1 in #t148 == null ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
+  let final self::Class1? #t151 = n1 in #t151 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
+  nullable1 = let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
+  let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
+  let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
+  let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+  let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{self::Class1});
+}
+static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
+  self::Class1? nullable1 = n1;
+  self::Class2? nullable2 = n2;
+  self::Class3? nullable3 = n3;
+  let final self::Class1? #t168 = n1 in #t168 == null ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
+  let final self::Class1? #t169 = n1 in #t169 == null ?{self::Class1?} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t170 = n1 in #t170 == null ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
+  let final self::Class1? #t172 = n1 in #t172 == null ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
+  let final self::Class1? #t173 = n1 in #t173 == null ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t174 = n1 in #t174 == null ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
+  let final self::Class1? #t179 = n1 in #t179 == null ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
+  let final self::Class1? #t181 = n1 in #t181 == null ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
+  nullable2 = let final self::Class1? #t184 = n1 in #t184 == null ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
+  let final self::Class1? #t189 = n1 in #t189 == null ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190) == null ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
+  nullable1 = let final self::Class1? #t191 = n1 in #t191 == null ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193 == null ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
+  let final self::Class2? #t196 = n2 in #t196 == null ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
+  nullable2 = let final self::Class2? #t198 = n2 in #t198 == null ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
+  let final self::Class2? #t202 = n2 in #t202 == null ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
+  nullable2 = let final self::Class2? #t204 = n2 in #t204 == null ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
+  let final self::Class2? #t208 = n2 in #t208 == null ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
+  nullable2 = let final self::Class2? #t210 = n2 in #t210 == null ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
+  let final self::Class2? #t214 = n2 in #t214 == null ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
+  nullable2 = let final self::Class2? #t218 = n2 in #t218 == null ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
+  let final self::Class1? #t222 = n1 in #t222 == null ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
+  nullable2 = let final self::Class1? #t225 = n1 in #t225 == null ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
+  let final self::Class1? #t230 = n1 in #t230 == null ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
+  nullable2 = let final self::Class1? #t235 = n1 in #t235 == null ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
+  let final self::Class1? #t240 = n1 in #t240 == null ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
+  let final self::Class1? #t241 = n1 in #t241 == null ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
+  nullable2 = let final self::Class1? #t242 = n1 in #t242 == null ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
+  let final self::Class1? #t247 = n1 in #t247 == null ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248 == null ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
+  let final self::Class1? #t249 = n1 in #t249 == null ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
+  nullable2 = let final self::Class1? #t252 = n1 in #t252 == null ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
+  let final self::Class1? #t257 = n1 in #t257 == null ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
+  nullable2 = let final self::Class1? #t260 = n1 in #t260 == null ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
+  let final self::Class1? #t265 = n1 in #t265 == null ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
+  nullable2 = let final self::Class1? #t270 = n1 in #t270 == null ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
+  let final self::Class1? #t275 = n1 in #t275 == null ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276 == null ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
+  let final self::Class1? #t277 = n1 in #t277 == null ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278 == null ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t279 = n1 in #t279 == null ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280 == null ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
+  let final self::Class1? #t284 = n1 in #t284 == null ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285 == null ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
+  nullable1 = let final self::Class1? #t287 = n1 in #t287 == null ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288 == null ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
+  let final self::Class1? #t290 = n1 in #t290 == null ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291 == null ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292) == null ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
+  nullable1 = let final self::Class1? #t293 = n1 in #t293 == null ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294 == null ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296 == null ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
+  let final self::Class3? #t299 = n3 in #t299 == null ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300 == null ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
+  nullable2 = let final self::Class3? #t302 = n3 in #t302 == null ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303 == null ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
+  let final self::Class3? #t307 = n3 in #t307 == null ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308 == null ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
+  nullable2 = let final self::Class3? #t310 = n3 in #t310 == null ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311 == null ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
+  let final self::Class3? #t315 = n3 in #t315 == null ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316 == null ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
+  nullable2 = let final self::Class3? #t320 = n3 in #t320 == null ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321 == null ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+}
+static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
+  self::Class2? nullable2 = n2;
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Error: Operator '+' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+  throws(() => n1?.nonNullable1 + 0);
+                                ^" in self::Extension1|+(let final self::Class1? #t325 = n1 in #t325 == null ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Error: Operator 'unary-' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+  throws(() => -n1?.nonNullable1);
+               ^" in self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326 == null ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
+  let final self::Class2? #t327 = n2 in #t327 == null ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327, self::Extension2|+(self::Extension2|get#nonNullable2(#t327), 0));
+  nullable2 = let final self::Class2? #t328 = n2 in #t328 == null ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328, #t329) in #t329;
+  let final self::Class2? #t331 = n2 in #t331 == null ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
+  nullable2 = let final self::Class2? #t333 = n2 in #t333 == null ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
+  let final self::Class2? #t337 = n2 in #t337 == null ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337, self::Extension2|+(self::Extension2|get#nonNullable2(#t337), 1));
+  nullable2 = let final self::Class2? #t338 = n2 in #t338 == null ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, self::Extension2|+(#t339, 1)) in #t339;
+  let final self::Class2? #t341 = n2 in #t341 == null ?{self::Class2?} null : let final self::Class2 #t342 = self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1) in let final void #t343 = self::Extension2|set#nonNullable2(#t341, #t342) in #t342;
+  nullable2 = let final self::Class2? #t344 = n2 in #t344 == null ?{self::Class2?} null : let final self::Class2 #t345 = self::Extension2|+(self::Extension2|get#nonNullable2(#t344), 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t344, #t345) in #t345;
+}
+static method ifNull(self::Class1? n1) → void {
+  self::Class1? nullable1 = n1;
+  let final self::Class1? #t347 = n1 in #t347 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t347) == null ?{self::Class1} self::Extension1|set#nullable1(#t347, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t348 = n1 in #t348 == null ?{self::Class1?} null : let final self::Class1? #t349 = self::Extension1|get#nullable1(#t348) in #t349 == null ?{self::Class1} let final self::Class1 #t350 = n1{self::Class1} in let final void #t351 = self::Extension1|set#nullable1(#t348, #t350) in #t350 : #t349{self::Class1};
+  let final self::Class1? #t352 = n1 in #t352 == null ?{self::Class1?} null : let final self::Class1 #t353 = self::Extension1|get#nonNullable1(#t352{self::Class1}) in self::Extension1|get#nullable1(#t353) == null ?{self::Class1} self::Extension1|set#nullable1(#t353, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t354 = n1 in #t354 == null ?{self::Class1?} null : let final self::Class1 #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in let final self::Class1? #t356 = self::Extension1|get#nullable1(#t355) in #t356 == null ?{self::Class1} let final self::Class1 #t357 = n1{self::Class1} in let final void #t358 = self::Extension1|set#nullable1(#t355, #t357) in #t357 : #t356{self::Class1};
+  let final self::Class1? #t359 = n1 in #t359 == null ?{self::Class1?} null : let final self::Class1 #t360 = self::Extension1|get#nonNullable1(#t359{self::Class1}) in let final self::Class1 #t361 = n1{self::Class1} in self::Extension1|[](#t360, #t361) == null ?{self::Class1} self::Extension1|[]=(#t360, #t361, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t362 = n1 in #t362 == null ?{self::Class1?} null : let final self::Class1 #t363 = self::Extension1|get#nonNullable1(#t362{self::Class1}) in let final self::Class1 #t364 = n1{self::Class1} in let final self::Class1? #t365 = self::Extension1|[](#t363, #t364) in #t365 == null ?{self::Class1} let final self::Class1 #t366 = n1{self::Class1} in let final void #t367 = self::Extension1|[]=(#t363, #t364, #t366) in #t366 : #t365{self::Class1};
+}
+static method throws(() → void f) → void {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.modular.expect
new file mode 100644
index 0000000..438791b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/null_shorting_index.dart.weak.modular.expect
@@ -0,0 +1,133 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:31:6: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   c1?[0] ??= 1;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:32:6: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   c1?[0] ??= 1 + c1[1];
+//      ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:42:6: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   c2?[0] ??= 1;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:43:6: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   c2?[0] ??= 1 + c2[1];
+//      ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:52:17: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   Extension(c2)?[0] ??= 1;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:53:17: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   Extension(c2)?[0] ??= 1 + Extension(c2)[1];
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:62:13: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   c1?.field?[0] ??= 1;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:63:13: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   c1?.field?[0] ??= 1 + c1[1];
+//             ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:67:49: Warning: Operand of null-aware operation '!' has type 'int' which excludes null.
+//   Extension(c1?.field)?[0] = 1 + (Extension(c2)?[0]! as int);
+//                                                 ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:69:50: Warning: Operand of null-aware operation '!' has type 'int' which excludes null.
+//   Extension(c1?.field)?[0] += 1 + (Extension(c2)?[0]! as int);
+//                                                  ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:72:24: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   Extension(c1?.field)?[0] ??= 1;
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:73:24: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   Extension(c1?.field)?[0] ??= 1 + (Extension(c2)?[1]! as int);
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/null_shorting_index.dart:73:51: Warning: Operand of null-aware operation '!' has type 'int' which excludes null.
+//   Extension(c1?.field)?[0] ??= 1 + (Extension(c2)?[1]! as int);
+//                                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  get field() → self::Class2?
+    return null;
+  operator [](core::int index) → core::int
+    return index;
+  operator []=(core::int index, core::int value) → void {}
+}
+class Class2 extends core::Object {
+  field core::int field = 42;
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+}
+extension Extension on self::Class2 {
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+}
+static method Extension|[](lowered final self::Class2 #this, core::int index) → core::int
+  return #this.{self::Class2::field}{core::int};
+static method Extension|[]=(lowered final self::Class2 #this, core::int index, core::int value) → void {
+  #this.{self::Class2::field} = value;
+}
+static method main() → dynamic {
+  self::Class1? c1;
+  let final self::Class1? #t1 = c1 in #t1 == null ?{core::int?} null : #t1{self::Class1}.{self::Class1::[]}(0){(core::int) → core::int};
+  let final self::Class1? #t2 = c1 in #t2 == null ?{core::int?} null : #t2{self::Class1}.{self::Class1::[]=}(0, 1){(core::int, core::int) → void};
+  let final self::Class1? #t3 = c1 in #t3 == null ?{core::int?} null : #t3{self::Class1}.{self::Class1::[]=}(0, 1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(0){(core::int) → core::int}){(core::num) → core::int}){(core::int, core::int) → void};
+  let final self::Class1? #t4 = c1 in #t4 == null ?{core::int?} null : let final core::int #t5 = 0 in #t4{self::Class1}.{self::Class1::[]=}(#t5, #t4{self::Class1}.{self::Class1::[]}(#t5){(core::int) → core::int}.{core::num::+}(1){(core::num) → core::int}){(core::int, core::int) → void};
+  let final self::Class1? #t6 = c1 in #t6 == null ?{core::int?} null : let final core::int #t7 = 0 in #t6{self::Class1}.{self::Class1::[]=}(#t7, #t6{self::Class1}.{self::Class1::[]}(#t7){(core::int) → core::int}.{core::num::+}(1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(0){(core::int) → core::int}){(core::num) → core::int}){(core::num) → core::int}){(core::int, core::int) → void};
+  let final self::Class1? #t8 = c1 in #t8 == null ?{core::int?} null : let final core::int #t9 = 0 in let final core::int #t10 = #t8{self::Class1}.{self::Class1::[]}(#t9){(core::int) → core::int}.{core::num::+}(1){(core::num) → core::int} in let final void #t11 = #t8{self::Class1}.{self::Class1::[]=}(#t9, #t10){(core::int, core::int) → void} in #t10;
+  let final self::Class1? #t12 = c1 in #t12 == null ?{core::int?} null : let final core::int #t13 = 0 in #t12{self::Class1}.{self::Class1::[]=}(#t13, #t12{self::Class1}.{self::Class1::[]}(#t13){(core::int) → core::int}.{core::num::+}(1){(core::num) → core::int}){(core::int, core::int) → void};
+  let final self::Class1? #t14 = c1 in #t14 == null ?{core::int?} null : let final core::int #t15 = 0 in #t14{self::Class1}.{self::Class1::[]}(#t15){(core::int) → core::int} == null ?{core::int} #t14{self::Class1}.{self::Class1::[]=}(#t15, 1){(core::int, core::int) → void} : null;
+  let final self::Class1? #t16 = c1 in #t16 == null ?{core::int?} null : let final core::int #t17 = 0 in #t16{self::Class1}.{self::Class1::[]}(#t17){(core::int) → core::int} == null ?{core::int} #t16{self::Class1}.{self::Class1::[]=}(#t17, 1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(1){(core::int) → core::int}){(core::num) → core::int}){(core::int, core::int) → void} : null;
+  self::Class2? c2;
+  let final self::Class2? #t18 = c2 in #t18 == null ?{core::int?} null : self::Extension|[](#t18{self::Class2}, 0);
+  let final self::Class2? #t19 = c2 in #t19 == null ?{core::int?} null : self::Extension|[]=(#t19{self::Class2}, 0, 1);
+  let final self::Class2? #t20 = c2 in #t20 == null ?{core::int?} null : self::Extension|[]=(#t20{self::Class2}, 0, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int});
+  let final self::Class2? #t21 = c2 in #t21 == null ?{core::int?} null : let final core::int #t22 = 0 in self::Extension|[]=(#t21{self::Class2}, #t22, self::Extension|[](#t21{self::Class2}, #t22).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t23 = c2 in #t23 == null ?{core::int?} null : let final core::int #t24 = 0 in self::Extension|[]=(#t23{self::Class2}, #t24, self::Extension|[](#t23{self::Class2}, #t24).{core::num::+}(1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int}){(core::num) → core::int});
+  let final self::Class2? #t25 = c2 in #t25 == null ?{core::int?} null : let final core::int #t26 = 0 in let final core::int #t27 = self::Extension|[](#t25{self::Class2}, #t26).{core::num::+}(1){(core::num) → core::int} in let final void #t28 = self::Extension|[]=(#t25{self::Class2}, #t26, #t27) in #t27;
+  let final self::Class2? #t29 = c2 in #t29 == null ?{core::int?} null : let final core::int #t30 = 0 in self::Extension|[]=(#t29{self::Class2}, #t30, self::Extension|[](#t29{self::Class2}, #t30).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t31 = c2 in #t31 == null ?{core::int?} null : let final core::int #t32 = 0 in self::Extension|[](#t31{self::Class2}, #t32) == null ?{core::int} self::Extension|[]=(#t31{self::Class2}, #t32, 1) : null;
+  let final self::Class2? #t33 = c2 in #t33 == null ?{core::int?} null : let final core::int #t34 = 0 in self::Extension|[](#t33{self::Class2}, #t34) == null ?{core::int} self::Extension|[]=(#t33{self::Class2}, #t34, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 1)){(core::num) → core::int}) : null;
+  let final self::Class2? #t35 = c2 in #t35 == null ?{core::int?} null : self::Extension|[](#t35{self::Class2}, 0);
+  let final self::Class2? #t36 = c2 in #t36 == null ?{void} null : self::Extension|[]=(#t36{self::Class2}, 0, 1);
+  let final self::Class2? #t37 = c2 in #t37 == null ?{void} null : self::Extension|[]=(#t37{self::Class2}, 0, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int});
+  let final self::Class2? #t38 = c2 in #t38 == null ?{core::int?} null : let final core::int #t39 = 0 in self::Extension|[]=(#t38{self::Class2}, #t39, self::Extension|[](#t38{self::Class2}, #t39).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t40 = c2 in #t40 == null ?{core::int?} null : let final core::int #t41 = 0 in self::Extension|[]=(#t40{self::Class2}, #t41, self::Extension|[](#t40{self::Class2}, #t41).{core::num::+}(1.{core::num::+}(self::Extension|[](c2{self::Class2}, 0)){(core::num) → core::int}){(core::num) → core::int});
+  let final self::Class2? #t42 = c2 in #t42 == null ?{core::int?} null : let final core::int #t43 = 0 in let final core::int #t44 = self::Extension|[](#t42{self::Class2}, #t43).{core::num::+}(1){(core::num) → core::int} in let final void #t45 = self::Extension|[]=(#t42{self::Class2}, #t43, #t44) in #t44;
+  let final self::Class2? #t46 = c2 in #t46 == null ?{core::int?} null : let final core::int #t47 = 0 in self::Extension|[]=(#t46{self::Class2}, #t47, self::Extension|[](#t46{self::Class2}, #t47).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class2? #t48 = c2 in #t48 == null ?{core::int?} null : let final core::int #t49 = 0 in self::Extension|[](#t48{self::Class2}, #t49) == null ?{core::int} self::Extension|[]=(#t48{self::Class2}, #t49, 1) : null;
+  let final self::Class2? #t50 = c2 in #t50 == null ?{core::int?} null : let final core::int #t51 = 0 in self::Extension|[](#t50{self::Class2}, #t51) == null ?{core::int} self::Extension|[]=(#t50{self::Class2}, #t51, 1.{core::num::+}(self::Extension|[](c2{self::Class2}, 1)){(core::num) → core::int}) : null;
+  let final self::Class1? #t52 = c1 in #t52 == null ?{core::int?} null : let final self::Class2? #t53 = #t52{self::Class1}.{self::Class1::field}{self::Class2?} in #t53 == null ?{core::int?} null : self::Extension|[](#t53{self::Class2}, 0);
+  let final self::Class1? #t54 = c1 in #t54 == null ?{core::int?} null : let final self::Class2? #t55 = #t54{self::Class1}.{self::Class1::field}{self::Class2?} in #t55 == null ?{core::int?} null : self::Extension|[]=(#t55{self::Class2}, 0, 1);
+  let final self::Class1? #t56 = c1 in #t56 == null ?{core::int?} null : let final self::Class2? #t57 = #t56{self::Class1}.{self::Class1::field}{self::Class2?} in #t57 == null ?{core::int?} null : self::Extension|[]=(#t57{self::Class2}, 0, 1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(0){(core::int) → core::int}){(core::num) → core::int});
+  let final self::Class1? #t58 = c1 in #t58 == null ?{core::int?} null : let final self::Class2? #t59 = #t58{self::Class1}.{self::Class1::field}{self::Class2?} in #t59 == null ?{core::int?} null : let final core::int #t60 = 0 in self::Extension|[]=(#t59{self::Class2}, #t60, self::Extension|[](#t59{self::Class2}, #t60).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class1? #t61 = c1 in #t61 == null ?{core::int?} null : let final self::Class2? #t62 = #t61{self::Class1}.{self::Class1::field}{self::Class2?} in #t62 == null ?{core::int?} null : let final core::int #t63 = 0 in self::Extension|[]=(#t62{self::Class2}, #t63, self::Extension|[](#t62{self::Class2}, #t63).{core::num::+}(1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(0){(core::int) → core::int}){(core::num) → core::int}){(core::num) → core::int});
+  let final self::Class1? #t64 = c1 in #t64 == null ?{core::int?} null : let final self::Class2? #t65 = #t64{self::Class1}.{self::Class1::field}{self::Class2?} in #t65 == null ?{core::int?} null : let final core::int #t66 = 0 in let final core::int #t67 = self::Extension|[](#t65{self::Class2}, #t66).{core::num::+}(1){(core::num) → core::int} in let final void #t68 = self::Extension|[]=(#t65{self::Class2}, #t66, #t67) in #t67;
+  let final self::Class1? #t69 = c1 in #t69 == null ?{core::int?} null : let final self::Class2? #t70 = #t69{self::Class1}.{self::Class1::field}{self::Class2?} in #t70 == null ?{core::int?} null : let final core::int #t71 = 0 in self::Extension|[]=(#t70{self::Class2}, #t71, self::Extension|[](#t70{self::Class2}, #t71).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class1? #t72 = c1 in #t72 == null ?{core::int?} null : let final self::Class2? #t73 = #t72{self::Class1}.{self::Class1::field}{self::Class2?} in #t73 == null ?{core::int?} null : let final core::int #t74 = 0 in self::Extension|[](#t73{self::Class2}, #t74) == null ?{core::int} self::Extension|[]=(#t73{self::Class2}, #t74, 1) : null;
+  let final self::Class1? #t75 = c1 in #t75 == null ?{core::int?} null : let final self::Class2? #t76 = #t75{self::Class1}.{self::Class1::field}{self::Class2?} in #t76 == null ?{core::int?} null : let final core::int #t77 = 0 in self::Extension|[](#t76{self::Class2}, #t77) == null ?{core::int} self::Extension|[]=(#t76{self::Class2}, #t77, 1.{core::num::+}(c1{self::Class1}.{self::Class1::[]}(1){(core::int) → core::int}){(core::num) → core::int}) : null;
+  let final self::Class1? #t78 = c1 in #t78 == null ?{core::int?} null : let final self::Class2? #t79 = #t78{self::Class1}.{self::Class1::field}{self::Class2?} in #t79 == null ?{core::int?} null : self::Extension|[](#t79{self::Class2}, 0);
+  let final self::Class1? #t80 = c1 in #t80 == null ?{void} null : let final self::Class2? #t81 = #t80{self::Class1}.{self::Class1::field}{self::Class2?} in #t81 == null ?{void} null : self::Extension|[]=(#t81{self::Class2}, 0, 1);
+  let final self::Class1? #t82 = c1 in #t82 == null ?{void} null : let final self::Class2? #t83 = #t82{self::Class1}.{self::Class1::field}{self::Class2?} in #t83 == null ?{void} null : self::Extension|[]=(#t83{self::Class2}, 0, 1.{core::num::+}((let final self::Class2? #t84 = c2 in #t84 == null ?{core::int?} null : self::Extension|[](#t84{self::Class2}, 0)!) as{ForNonNullableByDefault} core::int){(core::num) → core::int});
+  let final self::Class1? #t85 = c1 in #t85 == null ?{core::int?} null : let final self::Class2? #t86 = #t85{self::Class1}.{self::Class1::field}{self::Class2?} in #t86 == null ?{core::int?} null : let final core::int #t87 = 0 in self::Extension|[]=(#t86{self::Class2}, #t87, self::Extension|[](#t86{self::Class2}, #t87).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class1? #t88 = c1 in #t88 == null ?{core::int?} null : let final self::Class2? #t89 = #t88{self::Class1}.{self::Class1::field}{self::Class2?} in #t89 == null ?{core::int?} null : let final core::int #t90 = 0 in self::Extension|[]=(#t89{self::Class2}, #t90, self::Extension|[](#t89{self::Class2}, #t90).{core::num::+}(1.{core::num::+}((let final self::Class2? #t91 = c2 in #t91 == null ?{core::int?} null : self::Extension|[](#t91{self::Class2}, 0)!) as{ForNonNullableByDefault} core::int){(core::num) → core::int}){(core::num) → core::int});
+  let final self::Class1? #t92 = c1 in #t92 == null ?{core::int?} null : let final self::Class2? #t93 = #t92{self::Class1}.{self::Class1::field}{self::Class2?} in #t93 == null ?{core::int?} null : let final core::int #t94 = 0 in let final core::int #t95 = self::Extension|[](#t93{self::Class2}, #t94).{core::num::+}(1){(core::num) → core::int} in let final void #t96 = self::Extension|[]=(#t93{self::Class2}, #t94, #t95) in #t95;
+  let final self::Class1? #t97 = c1 in #t97 == null ?{core::int?} null : let final self::Class2? #t98 = #t97{self::Class1}.{self::Class1::field}{self::Class2?} in #t98 == null ?{core::int?} null : let final core::int #t99 = 0 in self::Extension|[]=(#t98{self::Class2}, #t99, self::Extension|[](#t98{self::Class2}, #t99).{core::num::+}(1){(core::num) → core::int});
+  let final self::Class1? #t100 = c1 in #t100 == null ?{core::int?} null : let final self::Class2? #t101 = #t100{self::Class1}.{self::Class1::field}{self::Class2?} in #t101 == null ?{core::int?} null : let final core::int #t102 = 0 in self::Extension|[](#t101{self::Class2}, #t102) == null ?{core::int} self::Extension|[]=(#t101{self::Class2}, #t102, 1) : null;
+  let final self::Class1? #t103 = c1 in #t103 == null ?{core::int?} null : let final self::Class2? #t104 = #t103{self::Class1}.{self::Class1::field}{self::Class2?} in #t104 == null ?{core::int?} null : let final core::int #t105 = 0 in self::Extension|[](#t104{self::Class2}, #t105) == null ?{core::int} self::Extension|[]=(#t104{self::Class2}, #t105, 1.{core::num::+}((let final self::Class2? #t106 = c2 in #t106 == null ?{core::int?} null : self::Extension|[](#t106{self::Class2}, 1)!) as{ForNonNullableByDefault} core::int){(core::num) → core::int}) : null;
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.modular.expect
new file mode 100644
index 0000000..c5958c2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
+// Try accessing using ?. instead.
+//   throws(() => c.nonNullableField);
+//                  ^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field self::A nonNullableField = #C1;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get nonNullableProperty() → self::A
+    return this.{self::Class::nonNullableField}{self::A};
+  set nonNullableProperty(self::A value) → void {
+    this.{self::Class::nonNullableField} = value;
+  }
+  method nonNullableMethod() → self::A
+    return this.{self::Class::nonNullableField}{self::A};
+}
+class A extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get nonNullableProperty() → self::A
+    return this;
+}
+static method main() → dynamic {
+  self::Class? c;
+  self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
+Try accessing using ?. instead.
+  throws(() => c.nonNullableField);
+                 ^^^^^^^^^^^^^^^^" in c.{self::Class::nonNullableField}{<nullable>}.{self::A});
+  self::expect(null, let final self::Class? #t1 = c in #t1 == null ?{self::A?} null : #t1{self::Class}.{self::Class::nonNullableField}{self::A});
+  self::expect(null, let final self::Class? #t2 = c in #t2 == null ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField}{self::A}.{self::A::nonNullableProperty}{self::A});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object e) {
+    return;
+  }
+  throw "Expected throws.";
+}
+
+constants  {
+  #C1 = self::A {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///nullable_access.dart:
+- A. (from org-dartlang-testcase:///nullable_access.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/nullable_extension.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nullable_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..62d3a21
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_extension.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::String text = "";
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+extension _extension#0 on self::A? {
+  get text = self::_extension#0|get#text;
+}
+static method _extension#0|get#text(lowered final self::A? #this) → core::String
+  return "Lily was here";
+static method main() → void {
+  self::A? a = null;
+  self::expect("Lily was here", self::_extension#0|get#text(a));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.modular.expect
new file mode 100644
index 0000000..82c9494
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class B extends self::A<Null> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method foo(Null n, self::A<Null> an) → Null
+    return n;
+}
+static method foo() → dynamic {
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
+}
+static method bar() → dynamic {
+  return <core::List<self::A<Null>?>>[#C1, #C2];
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>*>[]
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_object_access.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nullable_object_access.dart.weak.modular.expect
new file mode 100644
index 0000000..3595f53
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_object_access.dart.weak.modular.expect
@@ -0,0 +1,127 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_object_access.dart:31:43: Error: The argument type 'Invocation' can't be assigned to the parameter type 'CustomInvocation'.
+//  - 'Invocation' is from 'dart:core'.
+//  - 'CustomInvocation' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+//   String noSuchMethod1b = c1.noSuchMethod(invocation); // error
+//                                           ^
+//
+// pkg/front_end/testcases/nnbd/nullable_object_access.dart:34:9: Error: The argument type 'String' can't be assigned to the parameter type 'Class?'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+//   c1 == ''; // error
+//         ^
+//
+// pkg/front_end/testcases/nnbd/nullable_object_access.dart:42:32: Error: A value of type 'Type' can't be assigned to a variable of type 'CustomType'.
+//  - 'Type' is from 'dart:core'.
+//  - 'CustomType' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+//   CustomType runtimeType2 = c2.runtimeType; // error
+//                                ^
+//
+// pkg/front_end/testcases/nnbd/nullable_object_access.dart:44:17: Error: 'runtimeType' isn't a function or method and can't be invoked.
+//   c2.runtimeType(); // error
+//                 ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_object_access.dart:47:10: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'String Function(CustomInvocation)'.
+//  - 'Invocation' is from 'dart:core'.
+//  - 'CustomInvocation' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+//       c2.noSuchMethod; // error
+//          ^
+//
+// pkg/front_end/testcases/nnbd/nullable_object_access.dart:56:9: Error: The argument type 'String' can't be assigned to the parameter type 'Class?'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+//   c2 == ''; // ok or error?
+//         ^
+//
+// pkg/front_end/testcases/nnbd/nullable_object_access.dart:59:53: Error: A value of type 'String Function()' can't be assigned to a variable of type 'String Function({Object o})'.
+//  - 'Object' is from 'dart:core'.
+//   String Function({Object o}) toStringTearOff2 = c2.toString; // error
+//                                                     ^
+//
+// pkg/front_end/testcases/nnbd/nullable_object_access.dart:62:15: Error: No named parameter with the name 'o'.
+//   c2.toString(o: c1); // error
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class CustomType extends core::Type {
+  synthetic constructor •() → self::CustomType
+    : super core::Type::•()
+    ;
+  method call() → void {}
+}
+abstract class CustomInvocation extends core::Object implements core::Invocation {
+  synthetic constructor •() → self::CustomInvocation
+    : super core::Object::•()
+    ;
+}
+abstract class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  abstract get runtimeType() → self::CustomType;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (self::CustomInvocation) → core::String */ noSuchMethod(covariant-by-declaration core::Invocation invocation) → core::String
+    return super.{core::Object::noSuchMethod}(invocation);
+  forwarding-stub forwarding-semi-stub operator /* signature-type: (self::Class) → core::bool */ ==(covariant-by-declaration core::Object o) → core::bool
+    return super.{core::Object::==}(o);
+  abstract method toString({core::Object o = #C1}) → core::String;
+}
+static method main() → dynamic {}
+static method test(self::Class c1, self::Class? c2, core::Invocation invocation, self::CustomInvocation customInvocation) → void {
+  self::CustomType runtimeType1 = c1.{self::Class::runtimeType}{self::CustomType};
+  self::CustomType runtimeTypeVariable1 = c1.{self::Class::runtimeType}{self::CustomType};
+  c1.{self::Class::runtimeType}{self::CustomType}.{self::CustomType::call}(){() → void};
+  (self::CustomInvocation) → core::String noSuchMethodTearOff1 = c1.{self::Class::noSuchMethod}{(self::CustomInvocation) → core::String};
+  (self::CustomInvocation) → core::String noSuchMethodTearOffVariable1 = c1.{self::Class::noSuchMethod}{(self::CustomInvocation) → core::String};
+  core::String noSuchMethod1a = c1.{self::Class::noSuchMethod}(customInvocation){(self::CustomInvocation) → core::String};
+  core::String noSuchMethod1b = c1.{self::Class::noSuchMethod}(invalid-expression "pkg/front_end/testcases/nnbd/nullable_object_access.dart:31:43: Error: The argument type 'Invocation' can't be assigned to the parameter type 'CustomInvocation'.
+ - 'Invocation' is from 'dart:core'.
+ - 'CustomInvocation' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+  String noSuchMethod1b = c1.noSuchMethod(invocation); // error
+                                          ^" in invocation as{TypeError,ForNonNullableByDefault} self::CustomInvocation){(self::CustomInvocation) → core::String};
+  core::String noSuchMethodVariable1 = c1.{self::Class::noSuchMethod}(customInvocation){(self::CustomInvocation) → core::String};
+  c1 =={self::Class::==}{(self::Class) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/nullable_object_access.dart:34:9: Error: The argument type 'String' can't be assigned to the parameter type 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+  c1 == ''; // error
+        ^" in "" as{TypeError,ForNonNullableByDefault} self::Class?;
+  c1 =={self::Class::==}{(self::Class) → core::bool} c2;
+  ({o: core::Object}) → core::String toStringTearOff1 = c1.{self::Class::toString}{({o: core::Object}) → core::String};
+  ({o: core::Object}) → core::String toStringTearOffVariable1 = c1.{self::Class::toString}{({o: core::Object}) → core::String};
+  c1.{self::Class::toString}(o: c1){({o: core::Object}) → core::String};
+  self::CustomType runtimeType2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_object_access.dart:42:32: Error: A value of type 'Type' can't be assigned to a variable of type 'CustomType'.
+ - 'Type' is from 'dart:core'.
+ - 'CustomType' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+  CustomType runtimeType2 = c2.runtimeType; // error
+                               ^" in c2.{core::Object::runtimeType}{core::Type} as{TypeError,ForNonNullableByDefault} self::CustomType;
+  core::Type runtimeTypeVariable2 = c2.{core::Object::runtimeType}{core::Type};
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_object_access.dart:44:17: Error: 'runtimeType' isn't a function or method and can't be invoked.
+  c2.runtimeType(); // error
+                ^^^^^^^^^^^" in c2.{core::Object::runtimeType}{core::Type}{<unresolved>}.call();
+  (self::CustomInvocation) → core::String noSuchMethodTearOff2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_object_access.dart:47:10: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'String Function(CustomInvocation)'.
+ - 'Invocation' is from 'dart:core'.
+ - 'CustomInvocation' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+      c2.noSuchMethod; // error
+         ^" in c2.{core::Object::noSuchMethod}{(core::Invocation) → dynamic} as{TypeError,ForNonNullableByDefault} (self::CustomInvocation) → core::String;
+  (core::Invocation) → dynamic noSuchMethodTearOffVariable2 = c2.{core::Object::noSuchMethod}{(core::Invocation) → dynamic};
+  core::int noSuchMethod2 = c2.{core::Object::noSuchMethod}(invocation){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  dynamic noSuchMethodVariable2 = c2.{core::Object::noSuchMethod}(invocation){(core::Invocation) → dynamic};
+  c2 =={self::Class::==}{(self::Class) → core::bool} invalid-expression "pkg/front_end/testcases/nnbd/nullable_object_access.dart:56:9: Error: The argument type 'String' can't be assigned to the parameter type 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_object_access.dart'.
+  c2 == ''; // ok or error?
+        ^" in "" as{TypeError,ForNonNullableByDefault} self::Class?;
+  c2 =={self::Class::==}{(self::Class) → core::bool} c1;
+  ({o: core::Object}) → core::String toStringTearOff2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_object_access.dart:59:53: Error: A value of type 'String Function()' can't be assigned to a variable of type 'String Function({Object o})'.
+ - 'Object' is from 'dart:core'.
+  String Function({Object o}) toStringTearOff2 = c2.toString; // error
+                                                    ^" in c2.{core::Object::toString}{() → core::String} as{TypeError,ForNonNullableByDefault} ({o: core::Object}) → core::String;
+  () → core::String toStringTearOffVariable2 = c2.{core::Object::toString}{() → core::String};
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_object_access.dart:62:15: Error: No named parameter with the name 'o'.
+  c2.toString(o: c1); // error
+              ^" in c2.{core::Object::toString}{<inapplicable>}.(o: c1){({o: invalid-type}) → invalid-type};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.modular.expect
new file mode 100644
index 0000000..1d7f270
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int? field = null;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  method bar(core::int? x) → core::int? {}
+}
+static method main() → dynamic {
+  self::Foo foo = new self::Foo::•();
+  foo.{self::Foo::field} = 5;
+  foo.{self::Foo::bar}(6){(core::int?) → core::int?};
+  self::test_nullable_function_type_formal_param(f: () → core::int => 2);
+}
+static method test_nullable_function_type_formal_param({() →? core::int f = #C1}) → core::int {
+  return let final core::int? #t1 = let final () →? core::int #t2 = f in #t2 == null ?{core::int?} null : #t2{() → core::int}(){() → core::int} in #t1 == null ?{core::int} 1.{core::int::unary-}(){() → core::int} : #t1{core::int};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.modular.expect
new file mode 100644
index 0000000..7274ffb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.modular.expect
@@ -0,0 +1,161 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+// Try accessing using ?. instead.
+//   s.length;
+//     ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+// Try calling using ?. instead.
+//   s.substring(1, 1);
+//     ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?. instead.
+//   a.foo();
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try accessing using ?. instead.
+//   a.bar;
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try accessing using ?. instead.
+//   a.baz = 42;
+//     ^^^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+// Try calling using ?.call instead.
+//   a();
+//    ^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:13: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   b.toString(0);
+//             ^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+//   Function f1 = a;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+//   void Function() f2 = a;
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+//   void Function()? f3 = a;
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+  get bar() → core::int
+    return 42;
+  set baz(core::int value) → void {}
+  method call() → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method toString([core::int extra = #C1]) → core::String
+    return super.{core::Object::toString}();
+}
+static method error(core::String? s, self::A? a, self::B? b) → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+Try accessing using ?. instead.
+  s.length;
+    ^^^^^^" in s.{core::String::length}{<nullable>}.{core::int};
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+Try calling using ?. instead.
+  s.substring(1, 1);
+    ^^^^^^^^^" in s.{core::String::substring}{<nullable>}.(1, 1){(core::int, [core::int?]) → core::String};
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  a.foo();
+    ^^^" in a.{self::A::foo}{<nullable>}.(){() → dynamic};
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+  a.bar;
+    ^^^" in a.{self::A::bar}{<nullable>}.{core::int};
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+  a.baz = 42;
+    ^^^" in a.{self::A::baz}{<nullable>}. = 42;
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?.call instead.
+  a();
+   ^" in a.{self::A::call}{<nullable>}.(){() → void};
+  invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:13: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  b.toString(0);
+            ^" in b.{core::Object::toString}{<inapplicable>}.(0){(invalid-type) → invalid-type};
+  core::Function f1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+  Function f1 = a;
+                ^" in a as{TypeError} core::Function;
+  () → void f2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+  void Function() f2 = a;
+                       ^" in a as{TypeError} () → void;
+  () →? void f3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+  void Function()? f3 = a;
+                        ^" in a as{TypeError} () →? void;
+}
+static method ok<T extends core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
+  s =={core::String::==}{(core::Object) → core::bool} s;
+  a =={core::Object::==}{(core::Object) → core::bool} a;
+  t =={core::Object::==}{(core::Object) → core::bool} t;
+  b =={core::Object::==}{(core::Object) → core::bool} b;
+  s.{core::Object::hashCode}{core::int};
+  a.{core::Object::hashCode}{core::int};
+  t.{core::Object::hashCode}{core::int};
+  b.{core::Object::hashCode}{core::int};
+  s.{core::Object::toString}(){() → core::String};
+  a.{core::Object::toString}(){() → core::String};
+  t.{core::Object::toString}(){() → core::String};
+  b.{core::Object::toString}(){() → core::String};
+  try {
+    s.{core::Object::noSuchMethod}(i){(core::Invocation) → dynamic};
+  }
+  on core::Object catch(final core::Object e, final core::StackTrace t) {
+  }
+  try {
+    a.{core::Object::noSuchMethod}(i){(core::Invocation) → dynamic};
+  }
+  on core::Object catch(final core::Object e, final core::StackTrace t) {
+  }
+  try {
+    t.{core::Object::noSuchMethod}(i){(core::Invocation) → dynamic};
+  }
+  on core::Object catch(final core::Object e, final core::StackTrace t) {
+  }
+  try {
+    b.{core::Object::noSuchMethod}(i){(core::Invocation) → dynamic};
+  }
+  on core::Object catch(final core::Object e, final core::StackTrace t) {
+  }
+  s.{core::Object::runtimeType}{core::Type};
+  a.{core::Object::runtimeType}{core::Type};
+  t.{core::Object::runtimeType}{core::Type};
+  b.{core::Object::runtimeType}{core::Type};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..5e0924e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
+import self as self;
+
+typedef F = invalid-type;
+static method foo(() → void x) → void {
+  self::bar(x);
+  self::bar(null);
+  self::baz(x);
+  self::baz(null);
+}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..297e474
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/nullable_setter.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::String m = "";
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  set setter(core::String v) → void {}
+  operator []=(core::int index, core::String value) → void {}
+}
+extension _extension#0 on self::C? {
+  operator []= = self::_extension#0|[]=;
+  set setter = self::_extension#0|set#setter;
+}
+static method _extension#0|set#setter(lowered final self::C? #this, core::String v) → void {
+  let final self::C? #t1 = #this in #t1 == null ?{core::String?} null : #t1{self::C}.{self::C::m} = v;
+}
+static method _extension#0|[]=(lowered final self::C? #this, core::int index, core::String value) → void {
+  let final self::C? #t2 = #this in #t2 == null ?{core::String?} null : #t2{self::C}.{self::C::m} = "${index}${value}";
+}
+static method main() → dynamic {
+  self::C? c = new self::C::•() as{ForNonNullableByDefault} self::C?;
+  self::expect("", let final self::C? #t3 = c in #t3 == null ?{core::String?} null : #t3{self::C}.{self::C::m}{core::String});
+  self::_extension#0|set#setter(c, "42");
+  self::expect("42", let final self::C? #t4 = c in #t4 == null ?{core::String?} null : #t4{self::C}.{self::C::m}{core::String});
+  self::_extension#0|[]=(c, 42, "87");
+  self::expect("4287", let final self::C? #t5 = c in #t5 == null ?{core::String?} null : #t5{self::C}.{self::C::m}{core::String});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/numbers.dart.weak.modular.expect
new file mode 100644
index 0000000..babfb04
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.weak.modular.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(n){(core::num) → core::num};
+  core::num n_i = n.{core::num::+}(i){(core::num) → core::num};
+  core::double n_d = n.{core::num::+}(d){(core::num) → core::double};
+  core::num n_x = n.{core::num::+}(x){(core::num) → core::num};
+  core::num n_y = n.{core::num::+}(y){(core::num) → core::num};
+  core::double n_z = n.{core::num::+}(z){(core::num) → core::double};
+  core::num i_n = i.{core::num::+}(n){(core::num) → core::num};
+  core::int i_i = i.{core::num::+}(i){(core::num) → core::int};
+  core::double i_d = i.{core::num::+}(d){(core::num) → core::double};
+  core::num i_x = i.{core::num::+}(x){(core::num) → core::num};
+  core::int i_y = i.{core::num::+}(y){(core::num) → core::int};
+  core::double i_z = i.{core::num::+}(z){(core::num) → core::double};
+  core::double d_n = d.{core::double::+}(n){(core::num) → core::double};
+  core::double d_i = d.{core::double::+}(i){(core::num) → core::double};
+  core::double d_d = d.{core::double::+}(d){(core::num) → core::double};
+  core::double d_x = d.{core::double::+}(x){(core::num) → core::double};
+  core::double d_y = d.{core::double::+}(y){(core::num) → core::double};
+  core::double d_z = d.{core::double::+}(z){(core::num) → core::double};
+  core::num x_n = x.{core::num::+}(n){(core::num) → core::num};
+  core::num x_i = x.{core::num::+}(i){(core::num) → core::num};
+  core::double x_d = x.{core::num::+}(d){(core::num) → core::double};
+  core::num x_x = x.{core::num::+}(x){(core::num) → core::num};
+  core::num x_y = x.{core::num::+}(y){(core::num) → core::num};
+  core::double x_z = x.{core::num::+}(z){(core::num) → core::double};
+  core::num y_n = y.{core::num::+}(n){(core::num) → core::num};
+  core::int y_i = y.{core::num::+}(i){(core::num) → core::int};
+  core::double y_d = y.{core::num::+}(d){(core::num) → core::double};
+  core::num y_x = y.{core::num::+}(x){(core::num) → core::num};
+  core::int y_y = y.{core::num::+}(y){(core::num) → core::int};
+  core::double y_z = y.{core::num::+}(z){(core::num) → core::double};
+  core::double z_n = z.{core::double::+}(n){(core::num) → core::double};
+  core::double z_i = z.{core::double::+}(i){(core::num) → core::double};
+  core::double z_d = z.{core::double::+}(d){(core::num) → core::double};
+  core::double z_x = z.{core::double::+}(x){(core::num) → core::double};
+  core::double z_y = z.{core::double::+}(y){(core::num) → core::double};
+  core::double z_z = z.{core::double::+}(z){(core::num) → core::double};
+}
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(n){(core::num) → core::num};
+  core::num n_i = n.{core::num::-}(i){(core::num) → core::num};
+  core::double n_d = n.{core::num::-}(d){(core::num) → core::double};
+  core::num n_x = n.{core::num::-}(x){(core::num) → core::num};
+  core::num n_y = n.{core::num::-}(y){(core::num) → core::num};
+  core::double n_z = n.{core::num::-}(z){(core::num) → core::double};
+  core::num i_n = i.{core::num::-}(n){(core::num) → core::num};
+  core::int i_i = i.{core::num::-}(i){(core::num) → core::int};
+  core::double i_d = i.{core::num::-}(d){(core::num) → core::double};
+  core::num i_x = i.{core::num::-}(x){(core::num) → core::num};
+  core::int i_y = i.{core::num::-}(y){(core::num) → core::int};
+  core::double i_z = i.{core::num::-}(z){(core::num) → core::double};
+  core::double d_n = d.{core::double::-}(n){(core::num) → core::double};
+  core::double d_i = d.{core::double::-}(i){(core::num) → core::double};
+  core::double d_d = d.{core::double::-}(d){(core::num) → core::double};
+  core::double d_x = d.{core::double::-}(x){(core::num) → core::double};
+  core::double d_y = d.{core::double::-}(y){(core::num) → core::double};
+  core::double d_z = d.{core::double::-}(z){(core::num) → core::double};
+  core::num x_n = x.{core::num::-}(n){(core::num) → core::num};
+  core::num x_i = x.{core::num::-}(i){(core::num) → core::num};
+  core::double x_d = x.{core::num::-}(d){(core::num) → core::double};
+  core::num x_x = x.{core::num::-}(x){(core::num) → core::num};
+  core::num x_y = x.{core::num::-}(y){(core::num) → core::num};
+  core::double x_z = x.{core::num::-}(z){(core::num) → core::double};
+  core::num y_n = y.{core::num::-}(n){(core::num) → core::num};
+  core::int y_i = y.{core::num::-}(i){(core::num) → core::int};
+  core::double y_d = y.{core::num::-}(d){(core::num) → core::double};
+  core::num y_x = y.{core::num::-}(x){(core::num) → core::num};
+  core::int y_y = y.{core::num::-}(y){(core::num) → core::int};
+  core::double y_z = y.{core::num::-}(z){(core::num) → core::double};
+  core::double z_n = z.{core::double::-}(n){(core::num) → core::double};
+  core::double z_i = z.{core::double::-}(i){(core::num) → core::double};
+  core::double z_d = z.{core::double::-}(d){(core::num) → core::double};
+  core::double z_x = z.{core::double::-}(x){(core::num) → core::double};
+  core::double z_y = z.{core::double::-}(y){(core::num) → core::double};
+  core::double z_z = z.{core::double::-}(z){(core::num) → core::double};
+}
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(n){(core::num) → core::num};
+  core::num n_i = n.{core::num::*}(i){(core::num) → core::num};
+  core::double n_d = n.{core::num::*}(d){(core::num) → core::double};
+  core::num n_x = n.{core::num::*}(x){(core::num) → core::num};
+  core::num n_y = n.{core::num::*}(y){(core::num) → core::num};
+  core::double n_z = n.{core::num::*}(z){(core::num) → core::double};
+  core::num i_n = i.{core::num::*}(n){(core::num) → core::num};
+  core::int i_i = i.{core::num::*}(i){(core::num) → core::int};
+  core::double i_d = i.{core::num::*}(d){(core::num) → core::double};
+  core::num i_x = i.{core::num::*}(x){(core::num) → core::num};
+  core::int i_y = i.{core::num::*}(y){(core::num) → core::int};
+  core::double i_z = i.{core::num::*}(z){(core::num) → core::double};
+  core::double d_n = d.{core::double::*}(n){(core::num) → core::double};
+  core::double d_i = d.{core::double::*}(i){(core::num) → core::double};
+  core::double d_d = d.{core::double::*}(d){(core::num) → core::double};
+  core::double d_x = d.{core::double::*}(x){(core::num) → core::double};
+  core::double d_y = d.{core::double::*}(y){(core::num) → core::double};
+  core::double d_z = d.{core::double::*}(z){(core::num) → core::double};
+  core::num x_n = x.{core::num::*}(n){(core::num) → core::num};
+  core::num x_i = x.{core::num::*}(i){(core::num) → core::num};
+  core::double x_d = x.{core::num::*}(d){(core::num) → core::double};
+  core::num x_x = x.{core::num::*}(x){(core::num) → core::num};
+  core::num x_y = x.{core::num::*}(y){(core::num) → core::num};
+  core::double x_z = x.{core::num::*}(z){(core::num) → core::double};
+  core::num y_n = y.{core::num::*}(n){(core::num) → core::num};
+  core::int y_i = y.{core::num::*}(i){(core::num) → core::int};
+  core::double y_d = y.{core::num::*}(d){(core::num) → core::double};
+  core::num y_x = y.{core::num::*}(x){(core::num) → core::num};
+  core::int y_y = y.{core::num::*}(y){(core::num) → core::int};
+  core::double y_z = y.{core::num::*}(z){(core::num) → core::double};
+  core::double z_n = z.{core::double::*}(n){(core::num) → core::double};
+  core::double z_i = z.{core::double::*}(i){(core::num) → core::double};
+  core::double z_d = z.{core::double::*}(d){(core::num) → core::double};
+  core::double z_x = z.{core::double::*}(x){(core::num) → core::double};
+  core::double z_y = z.{core::double::*}(y){(core::num) → core::double};
+  core::double z_z = z.{core::double::*}(z){(core::num) → core::double};
+}
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(n){(core::num) → core::num};
+  core::num n_i = n.{core::num::%}(i){(core::num) → core::num};
+  core::double n_d = n.{core::num::%}(d){(core::num) → core::double};
+  core::num n_x = n.{core::num::%}(x){(core::num) → core::num};
+  core::num n_y = n.{core::num::%}(y){(core::num) → core::num};
+  core::double n_z = n.{core::num::%}(z){(core::num) → core::double};
+  core::num i_n = i.{core::num::%}(n){(core::num) → core::num};
+  core::int i_i = i.{core::num::%}(i){(core::num) → core::int};
+  core::double i_d = i.{core::num::%}(d){(core::num) → core::double};
+  core::num i_x = i.{core::num::%}(x){(core::num) → core::num};
+  core::int i_y = i.{core::num::%}(y){(core::num) → core::int};
+  core::double i_z = i.{core::num::%}(z){(core::num) → core::double};
+  core::double d_n = d.{core::double::%}(n){(core::num) → core::double};
+  core::double d_i = d.{core::double::%}(i){(core::num) → core::double};
+  core::double d_d = d.{core::double::%}(d){(core::num) → core::double};
+  core::double d_x = d.{core::double::%}(x){(core::num) → core::double};
+  core::double d_y = d.{core::double::%}(y){(core::num) → core::double};
+  core::double d_z = d.{core::double::%}(z){(core::num) → core::double};
+  core::num x_n = x.{core::num::%}(n){(core::num) → core::num};
+  core::num x_i = x.{core::num::%}(i){(core::num) → core::num};
+  core::double x_d = x.{core::num::%}(d){(core::num) → core::double};
+  core::num x_x = x.{core::num::%}(x){(core::num) → core::num};
+  core::num x_y = x.{core::num::%}(y){(core::num) → core::num};
+  core::double x_z = x.{core::num::%}(z){(core::num) → core::double};
+  core::num y_n = y.{core::num::%}(n){(core::num) → core::num};
+  core::int y_i = y.{core::num::%}(i){(core::num) → core::int};
+  core::double y_d = y.{core::num::%}(d){(core::num) → core::double};
+  core::num y_x = y.{core::num::%}(x){(core::num) → core::num};
+  core::int y_y = y.{core::num::%}(y){(core::num) → core::int};
+  core::double y_z = y.{core::num::%}(z){(core::num) → core::double};
+  core::double z_n = z.{core::double::%}(n){(core::num) → core::double};
+  core::double z_i = z.{core::double::%}(i){(core::num) → core::double};
+  core::double z_d = z.{core::double::%}(d){(core::num) → core::double};
+  core::double z_x = z.{core::double::%}(x){(core::num) → core::double};
+  core::double z_y = z.{core::double::%}(y){(core::num) → core::double};
+  core::double z_z = z.{core::double::%}(z){(core::num) → core::double};
+}
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(n){(core::num) → core::num};
+  core::num n_i = n.{core::num::remainder}(i){(core::num) → core::num};
+  core::double n_d = n.{core::num::remainder}(d){(core::num) → core::double};
+  core::num n_x = n.{core::num::remainder}(x){(core::num) → core::num};
+  core::num n_y = n.{core::num::remainder}(y){(core::num) → core::num};
+  core::double n_z = n.{core::num::remainder}(z){(core::num) → core::double};
+  core::num i_n = i.{core::num::remainder}(n){(core::num) → core::num};
+  core::int i_i = i.{core::num::remainder}(i){(core::num) → core::int};
+  core::double i_d = i.{core::num::remainder}(d){(core::num) → core::double};
+  core::num i_x = i.{core::num::remainder}(x){(core::num) → core::num};
+  core::int i_y = i.{core::num::remainder}(y){(core::num) → core::int};
+  core::double i_z = i.{core::num::remainder}(z){(core::num) → core::double};
+  core::double d_n = d.{core::double::remainder}(n){(core::num) → core::double};
+  core::double d_i = d.{core::double::remainder}(i){(core::num) → core::double};
+  core::double d_d = d.{core::double::remainder}(d){(core::num) → core::double};
+  core::double d_x = d.{core::double::remainder}(x){(core::num) → core::double};
+  core::double d_y = d.{core::double::remainder}(y){(core::num) → core::double};
+  core::double d_z = d.{core::double::remainder}(z){(core::num) → core::double};
+  core::num x_n = x.{core::num::remainder}(n){(core::num) → core::num};
+  core::num x_i = x.{core::num::remainder}(i){(core::num) → core::num};
+  core::double x_d = x.{core::num::remainder}(d){(core::num) → core::double};
+  core::num x_x = x.{core::num::remainder}(x){(core::num) → core::num};
+  core::num x_y = x.{core::num::remainder}(y){(core::num) → core::num};
+  core::double x_z = x.{core::num::remainder}(z){(core::num) → core::double};
+  core::num y_n = y.{core::num::remainder}(n){(core::num) → core::num};
+  core::int y_i = y.{core::num::remainder}(i){(core::num) → core::int};
+  core::double y_d = y.{core::num::remainder}(d){(core::num) → core::double};
+  core::num y_x = y.{core::num::remainder}(x){(core::num) → core::num};
+  core::int y_y = y.{core::num::remainder}(y){(core::num) → core::int};
+  core::double y_z = y.{core::num::remainder}(z){(core::num) → core::double};
+  core::double z_n = z.{core::double::remainder}(n){(core::num) → core::double};
+  core::double z_i = z.{core::double::remainder}(i){(core::num) → core::double};
+  core::double z_d = z.{core::double::remainder}(d){(core::num) → core::double};
+  core::double z_x = z.{core::double::remainder}(x){(core::num) → core::double};
+  core::double z_y = z.{core::double::remainder}(y){(core::num) → core::double};
+  core::double z_z = z.{core::double::remainder}(z){(core::num) → core::double};
+}
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n_n = n.{core::num::clamp}(n, n){(core::num, core::num) → core::num};
+  core::num n_i_n = n.{core::num::clamp}(i, n){(core::num, core::num) → core::num};
+  core::num n_d_n = n.{core::num::clamp}(d, n){(core::num, core::num) → core::num};
+  core::num n_x_n = n.{core::num::clamp}(x, n){(core::num, core::num) → core::num};
+  core::num n_y_n = n.{core::num::clamp}(y, n){(core::num, core::num) → core::num};
+  core::num n_z_n = n.{core::num::clamp}(z, n){(core::num, core::num) → core::num};
+  core::num n_n_i = n.{core::num::clamp}(n, i){(core::num, core::num) → core::num};
+  core::num n_i_i = n.{core::num::clamp}(i, i){(core::num, core::num) → core::num};
+  core::num n_d_i = n.{core::num::clamp}(d, i){(core::num, core::num) → core::num};
+  core::num n_x_i = n.{core::num::clamp}(x, i){(core::num, core::num) → core::num};
+  core::num n_y_i = n.{core::num::clamp}(y, i){(core::num, core::num) → core::num};
+  core::num n_z_i = n.{core::num::clamp}(z, i){(core::num, core::num) → core::num};
+  core::num n_n_d = n.{core::num::clamp}(n, d){(core::num, core::num) → core::num};
+  core::num n_i_d = n.{core::num::clamp}(i, d){(core::num, core::num) → core::num};
+  core::num n_d_d = n.{core::num::clamp}(d, d){(core::num, core::num) → core::num};
+  core::num n_x_d = n.{core::num::clamp}(x, d){(core::num, core::num) → core::num};
+  core::num n_y_d = n.{core::num::clamp}(y, d){(core::num, core::num) → core::num};
+  core::num n_z_d = n.{core::num::clamp}(z, d){(core::num, core::num) → core::num};
+  core::num n_n_x = n.{core::num::clamp}(n, x){(core::num, core::num) → core::num};
+  core::num n_i_x = n.{core::num::clamp}(i, x){(core::num, core::num) → core::num};
+  core::num n_d_x = n.{core::num::clamp}(d, x){(core::num, core::num) → core::num};
+  core::num n_x_x = n.{core::num::clamp}(x, x){(core::num, core::num) → core::num};
+  core::num n_y_x = n.{core::num::clamp}(y, x){(core::num, core::num) → core::num};
+  core::num n_z_x = n.{core::num::clamp}(z, x){(core::num, core::num) → core::num};
+  core::num n_n_y = n.{core::num::clamp}(n, y){(core::num, core::num) → core::num};
+  core::num n_i_y = n.{core::num::clamp}(i, y){(core::num, core::num) → core::num};
+  core::num n_d_y = n.{core::num::clamp}(d, y){(core::num, core::num) → core::num};
+  core::num n_x_y = n.{core::num::clamp}(x, y){(core::num, core::num) → core::num};
+  core::num n_y_y = n.{core::num::clamp}(y, y){(core::num, core::num) → core::num};
+  core::num n_z_y = n.{core::num::clamp}(z, y){(core::num, core::num) → core::num};
+  core::num n_n_z = n.{core::num::clamp}(n, z){(core::num, core::num) → core::num};
+  core::num n_i_z = n.{core::num::clamp}(i, z){(core::num, core::num) → core::num};
+  core::num n_d_z = n.{core::num::clamp}(d, z){(core::num, core::num) → core::num};
+  core::num n_x_z = n.{core::num::clamp}(x, z){(core::num, core::num) → core::num};
+  core::num n_y_z = n.{core::num::clamp}(y, z){(core::num, core::num) → core::num};
+  core::num n_z_z = n.{core::num::clamp}(z, z){(core::num, core::num) → core::num};
+  core::num i_n_n = i.{core::num::clamp}(n, n){(core::num, core::num) → core::num};
+  core::num i_i_n = i.{core::num::clamp}(i, n){(core::num, core::num) → core::num};
+  core::num i_d_n = i.{core::num::clamp}(d, n){(core::num, core::num) → core::num};
+  core::num i_x_n = i.{core::num::clamp}(x, n){(core::num, core::num) → core::num};
+  core::num i_y_n = i.{core::num::clamp}(y, n){(core::num, core::num) → core::num};
+  core::num i_z_n = i.{core::num::clamp}(z, n){(core::num, core::num) → core::num};
+  core::num i_n_i = i.{core::num::clamp}(n, i){(core::num, core::num) → core::num};
+  core::int i_i_i = i.{core::num::clamp}(i, i){(core::num, core::num) → core::int};
+  core::num i_d_i = i.{core::num::clamp}(d, i){(core::num, core::num) → core::num};
+  core::num i_x_i = i.{core::num::clamp}(x, i){(core::num, core::num) → core::num};
+  core::int i_y_i = i.{core::num::clamp}(y, i){(core::num, core::num) → core::int};
+  core::num i_z_i = i.{core::num::clamp}(z, i){(core::num, core::num) → core::num};
+  core::num i_n_d = i.{core::num::clamp}(n, d){(core::num, core::num) → core::num};
+  core::num i_i_d = i.{core::num::clamp}(i, d){(core::num, core::num) → core::num};
+  core::num i_d_d = i.{core::num::clamp}(d, d){(core::num, core::num) → core::num};
+  core::num i_x_d = i.{core::num::clamp}(x, d){(core::num, core::num) → core::num};
+  core::num i_y_d = i.{core::num::clamp}(y, d){(core::num, core::num) → core::num};
+  core::num i_z_d = i.{core::num::clamp}(z, d){(core::num, core::num) → core::num};
+  core::num i_n_x = i.{core::num::clamp}(n, x){(core::num, core::num) → core::num};
+  core::num i_i_x = i.{core::num::clamp}(i, x){(core::num, core::num) → core::num};
+  core::num i_d_x = i.{core::num::clamp}(d, x){(core::num, core::num) → core::num};
+  core::num i_x_x = i.{core::num::clamp}(x, x){(core::num, core::num) → core::num};
+  core::num i_y_x = i.{core::num::clamp}(y, x){(core::num, core::num) → core::num};
+  core::num i_z_x = i.{core::num::clamp}(z, x){(core::num, core::num) → core::num};
+  core::num i_n_y = i.{core::num::clamp}(n, y){(core::num, core::num) → core::num};
+  core::int i_i_y = i.{core::num::clamp}(i, y){(core::num, core::num) → core::int};
+  core::num i_d_y = i.{core::num::clamp}(d, y){(core::num, core::num) → core::num};
+  core::num i_x_y = i.{core::num::clamp}(x, y){(core::num, core::num) → core::num};
+  core::int i_y_y = i.{core::num::clamp}(y, y){(core::num, core::num) → core::int};
+  core::num i_z_y = i.{core::num::clamp}(z, y){(core::num, core::num) → core::num};
+  core::num i_n_z = i.{core::num::clamp}(n, z){(core::num, core::num) → core::num};
+  core::num i_i_z = i.{core::num::clamp}(i, z){(core::num, core::num) → core::num};
+  core::num i_d_z = i.{core::num::clamp}(d, z){(core::num, core::num) → core::num};
+  core::num i_x_z = i.{core::num::clamp}(x, z){(core::num, core::num) → core::num};
+  core::num i_y_z = i.{core::num::clamp}(y, z){(core::num, core::num) → core::num};
+  core::num i_z_z = i.{core::num::clamp}(z, z){(core::num, core::num) → core::num};
+  core::num d_n_n = d.{core::num::clamp}(n, n){(core::num, core::num) → core::num};
+  core::num d_i_n = d.{core::num::clamp}(i, n){(core::num, core::num) → core::num};
+  core::num d_d_n = d.{core::num::clamp}(d, n){(core::num, core::num) → core::num};
+  core::num d_x_n = d.{core::num::clamp}(x, n){(core::num, core::num) → core::num};
+  core::num d_y_n = d.{core::num::clamp}(y, n){(core::num, core::num) → core::num};
+  core::num d_z_n = d.{core::num::clamp}(z, n){(core::num, core::num) → core::num};
+  core::num d_n_i = d.{core::num::clamp}(n, i){(core::num, core::num) → core::num};
+  core::num d_i_i = d.{core::num::clamp}(i, i){(core::num, core::num) → core::num};
+  core::num d_d_i = d.{core::num::clamp}(d, i){(core::num, core::num) → core::num};
+  core::num d_x_i = d.{core::num::clamp}(x, i){(core::num, core::num) → core::num};
+  core::num d_y_i = d.{core::num::clamp}(y, i){(core::num, core::num) → core::num};
+  core::num d_z_i = d.{core::num::clamp}(z, i){(core::num, core::num) → core::num};
+  core::num d_n_d = d.{core::num::clamp}(n, d){(core::num, core::num) → core::num};
+  core::num d_i_d = d.{core::num::clamp}(i, d){(core::num, core::num) → core::num};
+  core::double d_d_d = d.{core::num::clamp}(d, d){(core::num, core::num) → core::double};
+  core::num d_x_d = d.{core::num::clamp}(x, d){(core::num, core::num) → core::num};
+  core::num d_y_d = d.{core::num::clamp}(y, d){(core::num, core::num) → core::num};
+  core::double d_z_d = d.{core::num::clamp}(z, d){(core::num, core::num) → core::double};
+  core::num d_n_x = d.{core::num::clamp}(n, x){(core::num, core::num) → core::num};
+  core::num d_i_x = d.{core::num::clamp}(i, x){(core::num, core::num) → core::num};
+  core::num d_d_x = d.{core::num::clamp}(d, x){(core::num, core::num) → core::num};
+  core::num d_x_x = d.{core::num::clamp}(x, x){(core::num, core::num) → core::num};
+  core::num d_y_x = d.{core::num::clamp}(y, x){(core::num, core::num) → core::num};
+  core::num d_z_x = d.{core::num::clamp}(z, x){(core::num, core::num) → core::num};
+  core::num d_n_y = d.{core::num::clamp}(n, y){(core::num, core::num) → core::num};
+  core::num d_i_y = d.{core::num::clamp}(i, y){(core::num, core::num) → core::num};
+  core::num d_d_y = d.{core::num::clamp}(d, y){(core::num, core::num) → core::num};
+  core::num d_x_y = d.{core::num::clamp}(x, y){(core::num, core::num) → core::num};
+  core::num d_y_y = d.{core::num::clamp}(y, y){(core::num, core::num) → core::num};
+  core::num d_z_y = d.{core::num::clamp}(z, y){(core::num, core::num) → core::num};
+  core::num d_n_z = d.{core::num::clamp}(n, z){(core::num, core::num) → core::num};
+  core::num d_i_z = d.{core::num::clamp}(i, z){(core::num, core::num) → core::num};
+  core::double d_d_z = d.{core::num::clamp}(d, z){(core::num, core::num) → core::double};
+  core::num d_x_z = d.{core::num::clamp}(x, z){(core::num, core::num) → core::num};
+  core::num d_y_z = d.{core::num::clamp}(y, z){(core::num, core::num) → core::num};
+  core::double d_z_z = d.{core::num::clamp}(z, z){(core::num, core::num) → core::double};
+  core::num x_n_n = x.{core::num::clamp}(n, n){(core::num, core::num) → core::num};
+  core::num x_i_n = x.{core::num::clamp}(i, n){(core::num, core::num) → core::num};
+  core::num x_d_n = x.{core::num::clamp}(d, n){(core::num, core::num) → core::num};
+  core::num x_x_n = x.{core::num::clamp}(x, n){(core::num, core::num) → core::num};
+  core::num x_y_n = x.{core::num::clamp}(y, n){(core::num, core::num) → core::num};
+  core::num x_z_n = x.{core::num::clamp}(z, n){(core::num, core::num) → core::num};
+  core::num x_n_i = x.{core::num::clamp}(n, i){(core::num, core::num) → core::num};
+  core::num x_i_i = x.{core::num::clamp}(i, i){(core::num, core::num) → core::num};
+  core::num x_d_i = x.{core::num::clamp}(d, i){(core::num, core::num) → core::num};
+  core::num x_x_i = x.{core::num::clamp}(x, i){(core::num, core::num) → core::num};
+  core::num x_y_i = x.{core::num::clamp}(y, i){(core::num, core::num) → core::num};
+  core::num x_z_i = x.{core::num::clamp}(z, i){(core::num, core::num) → core::num};
+  core::num x_n_d = x.{core::num::clamp}(n, d){(core::num, core::num) → core::num};
+  core::num x_i_d = x.{core::num::clamp}(i, d){(core::num, core::num) → core::num};
+  core::num x_d_d = x.{core::num::clamp}(d, d){(core::num, core::num) → core::num};
+  core::num x_x_d = x.{core::num::clamp}(x, d){(core::num, core::num) → core::num};
+  core::num x_y_d = x.{core::num::clamp}(y, d){(core::num, core::num) → core::num};
+  core::num x_z_d = x.{core::num::clamp}(z, d){(core::num, core::num) → core::num};
+  core::num x_n_x = x.{core::num::clamp}(n, x){(core::num, core::num) → core::num};
+  core::num x_i_x = x.{core::num::clamp}(i, x){(core::num, core::num) → core::num};
+  core::num x_d_x = x.{core::num::clamp}(d, x){(core::num, core::num) → core::num};
+  core::num x_x_x = x.{core::num::clamp}(x, x){(core::num, core::num) → core::num};
+  core::num x_y_x = x.{core::num::clamp}(y, x){(core::num, core::num) → core::num};
+  core::num x_z_x = x.{core::num::clamp}(z, x){(core::num, core::num) → core::num};
+  core::num x_n_y = x.{core::num::clamp}(n, y){(core::num, core::num) → core::num};
+  core::num x_i_y = x.{core::num::clamp}(i, y){(core::num, core::num) → core::num};
+  core::num x_d_y = x.{core::num::clamp}(d, y){(core::num, core::num) → core::num};
+  core::num x_x_y = x.{core::num::clamp}(x, y){(core::num, core::num) → core::num};
+  core::num x_y_y = x.{core::num::clamp}(y, y){(core::num, core::num) → core::num};
+  core::num x_z_y = x.{core::num::clamp}(z, y){(core::num, core::num) → core::num};
+  core::num x_n_z = x.{core::num::clamp}(n, z){(core::num, core::num) → core::num};
+  core::num x_i_z = x.{core::num::clamp}(i, z){(core::num, core::num) → core::num};
+  core::num x_d_z = x.{core::num::clamp}(d, z){(core::num, core::num) → core::num};
+  core::num x_x_z = x.{core::num::clamp}(x, z){(core::num, core::num) → core::num};
+  core::num x_y_z = x.{core::num::clamp}(y, z){(core::num, core::num) → core::num};
+  core::num x_z_z = x.{core::num::clamp}(z, z){(core::num, core::num) → core::num};
+  core::num y_n_n = y.{core::num::clamp}(n, n){(core::num, core::num) → core::num};
+  core::num y_i_n = y.{core::num::clamp}(i, n){(core::num, core::num) → core::num};
+  core::num y_d_n = y.{core::num::clamp}(d, n){(core::num, core::num) → core::num};
+  core::num y_x_n = y.{core::num::clamp}(x, n){(core::num, core::num) → core::num};
+  core::num y_y_n = y.{core::num::clamp}(y, n){(core::num, core::num) → core::num};
+  core::num y_z_n = y.{core::num::clamp}(z, n){(core::num, core::num) → core::num};
+  core::num y_n_i = y.{core::num::clamp}(n, i){(core::num, core::num) → core::num};
+  core::int y_i_i = y.{core::num::clamp}(i, i){(core::num, core::num) → core::int};
+  core::num y_d_i = y.{core::num::clamp}(d, i){(core::num, core::num) → core::num};
+  core::num y_x_i = y.{core::num::clamp}(x, i){(core::num, core::num) → core::num};
+  core::int y_y_i = y.{core::num::clamp}(y, i){(core::num, core::num) → core::int};
+  core::num y_z_i = y.{core::num::clamp}(z, i){(core::num, core::num) → core::num};
+  core::num y_n_d = y.{core::num::clamp}(n, d){(core::num, core::num) → core::num};
+  core::num y_i_d = y.{core::num::clamp}(i, d){(core::num, core::num) → core::num};
+  core::num y_d_d = y.{core::num::clamp}(d, d){(core::num, core::num) → core::num};
+  core::num y_x_d = y.{core::num::clamp}(x, d){(core::num, core::num) → core::num};
+  core::num y_y_d = y.{core::num::clamp}(y, d){(core::num, core::num) → core::num};
+  core::num y_z_d = y.{core::num::clamp}(z, d){(core::num, core::num) → core::num};
+  core::num y_n_x = y.{core::num::clamp}(n, x){(core::num, core::num) → core::num};
+  core::num y_i_x = y.{core::num::clamp}(i, x){(core::num, core::num) → core::num};
+  core::num y_d_x = y.{core::num::clamp}(d, x){(core::num, core::num) → core::num};
+  core::num y_x_x = y.{core::num::clamp}(x, x){(core::num, core::num) → core::num};
+  core::num y_y_x = y.{core::num::clamp}(y, x){(core::num, core::num) → core::num};
+  core::num y_z_x = y.{core::num::clamp}(z, x){(core::num, core::num) → core::num};
+  core::num y_n_y = y.{core::num::clamp}(n, y){(core::num, core::num) → core::num};
+  core::int y_i_y = y.{core::num::clamp}(i, y){(core::num, core::num) → core::int};
+  core::num y_d_y = y.{core::num::clamp}(d, y){(core::num, core::num) → core::num};
+  core::num y_x_y = y.{core::num::clamp}(x, y){(core::num, core::num) → core::num};
+  core::int y_y_y = y.{core::num::clamp}(y, y){(core::num, core::num) → core::int};
+  core::num y_z_y = y.{core::num::clamp}(z, y){(core::num, core::num) → core::num};
+  core::num y_n_z = y.{core::num::clamp}(n, z){(core::num, core::num) → core::num};
+  core::num y_i_z = y.{core::num::clamp}(i, z){(core::num, core::num) → core::num};
+  core::num y_d_z = y.{core::num::clamp}(d, z){(core::num, core::num) → core::num};
+  core::num y_x_z = y.{core::num::clamp}(x, z){(core::num, core::num) → core::num};
+  core::num y_y_z = y.{core::num::clamp}(y, z){(core::num, core::num) → core::num};
+  core::num y_z_z = y.{core::num::clamp}(z, z){(core::num, core::num) → core::num};
+  core::num z_n_n = z.{core::num::clamp}(n, n){(core::num, core::num) → core::num};
+  core::num z_i_n = z.{core::num::clamp}(i, n){(core::num, core::num) → core::num};
+  core::num z_d_n = z.{core::num::clamp}(d, n){(core::num, core::num) → core::num};
+  core::num z_x_n = z.{core::num::clamp}(x, n){(core::num, core::num) → core::num};
+  core::num z_y_n = z.{core::num::clamp}(y, n){(core::num, core::num) → core::num};
+  core::num z_z_n = z.{core::num::clamp}(z, n){(core::num, core::num) → core::num};
+  core::num z_n_i = z.{core::num::clamp}(n, i){(core::num, core::num) → core::num};
+  core::num z_i_i = z.{core::num::clamp}(i, i){(core::num, core::num) → core::num};
+  core::num z_d_i = z.{core::num::clamp}(d, i){(core::num, core::num) → core::num};
+  core::num z_x_i = z.{core::num::clamp}(x, i){(core::num, core::num) → core::num};
+  core::num z_y_i = z.{core::num::clamp}(y, i){(core::num, core::num) → core::num};
+  core::num z_z_i = z.{core::num::clamp}(z, i){(core::num, core::num) → core::num};
+  core::num z_n_d = z.{core::num::clamp}(n, d){(core::num, core::num) → core::num};
+  core::num z_i_d = z.{core::num::clamp}(i, d){(core::num, core::num) → core::num};
+  core::double z_d_d = z.{core::num::clamp}(d, d){(core::num, core::num) → core::double};
+  core::num z_x_d = z.{core::num::clamp}(x, d){(core::num, core::num) → core::num};
+  core::num z_y_d = z.{core::num::clamp}(y, d){(core::num, core::num) → core::num};
+  core::double z_z_d = z.{core::num::clamp}(z, d){(core::num, core::num) → core::double};
+  core::num z_n_x = z.{core::num::clamp}(n, x){(core::num, core::num) → core::num};
+  core::num z_i_x = z.{core::num::clamp}(i, x){(core::num, core::num) → core::num};
+  core::num z_d_x = z.{core::num::clamp}(d, x){(core::num, core::num) → core::num};
+  core::num z_x_x = z.{core::num::clamp}(x, x){(core::num, core::num) → core::num};
+  core::num z_y_x = z.{core::num::clamp}(y, x){(core::num, core::num) → core::num};
+  core::num z_z_x = z.{core::num::clamp}(z, x){(core::num, core::num) → core::num};
+  core::num z_n_y = z.{core::num::clamp}(n, y){(core::num, core::num) → core::num};
+  core::num z_i_y = z.{core::num::clamp}(i, y){(core::num, core::num) → core::num};
+  core::num z_d_y = z.{core::num::clamp}(d, y){(core::num, core::num) → core::num};
+  core::num z_x_y = z.{core::num::clamp}(x, y){(core::num, core::num) → core::num};
+  core::num z_y_y = z.{core::num::clamp}(y, y){(core::num, core::num) → core::num};
+  core::num z_z_y = z.{core::num::clamp}(z, y){(core::num, core::num) → core::num};
+  core::num z_n_z = z.{core::num::clamp}(n, z){(core::num, core::num) → core::num};
+  core::num z_i_z = z.{core::num::clamp}(i, z){(core::num, core::num) → core::num};
+  core::double z_d_z = z.{core::num::clamp}(d, z){(core::num, core::num) → core::double};
+  core::num z_x_z = z.{core::num::clamp}(x, z){(core::num, core::num) → core::num};
+  core::num z_y_z = z.{core::num::clamp}(y, z){(core::num, core::num) → core::num};
+  core::double z_z_z = z.{core::num::clamp}(z, z){(core::num, core::num) → core::double};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.modular.expect
new file mode 100644
index 0000000..7bd9497
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.modular.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z + f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z + f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z - f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z - f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z * f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z * f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z % f();
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z % f();
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int d_i = d.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X d_x = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+//   int z_i = z.remainder(f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+//   X z_x = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.remainder(f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int n_i = n.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double n_d = n.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X n_x = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y n_y = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z n_z = n.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double i_d = i.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X i_x = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y i_y = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z i_z = i.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int d_i = d.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X d_x = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y d_y = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z d_z = d.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int x_i = x.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double x_d = x.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X x_x = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y x_y = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z x_z = x.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+//   double y_d = y.clamp(f(), f());
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X y_x = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y y_y = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z y_z = y.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+//   int z_i = z.clamp(f(), f());
+//               ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+//   X z_x = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+//   Y z_y = z.clamp(f(), f());
+//             ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+//   Z z_z = z.clamp(f(), f());
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+  return throw "Unsupported";
+static method add<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+  core::num n_n = n.{core::num::+}(self::f<core::num>()){(core::num) → core::num};
+  core::int n_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n + f();
+              ^" in n.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::+}(self::f<core::double>()){(core::num) → core::double};
+  self::add::X n_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Y n_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Z n_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n + f();
+            ^" in n.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num i_n = i.{core::num::+}(self::f<core::num>()){(core::num) → core::num};
+  core::int i_i = i.{core::num::+}(self::f<core::int>()){(core::num) → core::int};
+  core::double i_d = i.{core::num::+}(self::f<core::double>()){(core::num) → core::double};
+  self::add::X i_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Y i_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Z i_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i + f();
+            ^" in i.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num d_n = d.{core::double::+}(self::f<core::num>()){(core::num) → core::double};
+  core::int d_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d + f();
+              ^" in d.{core::double::+}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::+}(self::f<core::num>()){(core::num) → core::double};
+  self::add::X d_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Y d_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Z d_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d + f();
+            ^" in d.{core::double::+}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  core::num x_n = x.{core::num::+}(self::f<core::num>()){(core::num) → core::num};
+  core::int x_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x + f();
+              ^" in x.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::+}(self::f<core::double>()){(core::num) → core::double};
+  self::add::X x_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Y x_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Z x_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x + f();
+            ^" in x.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num y_n = y.{core::num::+}(self::f<core::num>()){(core::num) → core::num};
+  core::int y_i = y.{core::num::+}(self::f<core::int>()){(core::num) → core::int};
+  core::double y_d = y.{core::num::+}(self::f<core::double>()){(core::num) → core::double};
+  self::add::X y_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Y y_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Z y_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y + f();
+            ^" in y.{core::num::+}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num z_n = z.{core::double::+}(self::f<core::num>()){(core::num) → core::double};
+  core::int z_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z + f();
+              ^" in z.{core::double::+}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::+}(self::f<core::num>()){(core::num) → core::double};
+  self::add::X z_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Y z_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::add::Z z_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z + f();
+            ^" in z.{core::double::+}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+}
+static method sub<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+  core::num n_n = n.{core::num::-}(self::f<core::num>()){(core::num) → core::num};
+  core::int n_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n - f();
+              ^" in n.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::-}(self::f<core::double>()){(core::num) → core::double};
+  self::sub::X n_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Y n_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Z n_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n - f();
+            ^" in n.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num i_n = i.{core::num::-}(self::f<core::num>()){(core::num) → core::num};
+  core::int i_i = i.{core::num::-}(self::f<core::int>()){(core::num) → core::int};
+  core::double i_d = i.{core::num::-}(self::f<core::double>()){(core::num) → core::double};
+  self::sub::X i_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Y i_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Z i_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i - f();
+            ^" in i.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num d_n = d.{core::double::-}(self::f<core::num>()){(core::num) → core::double};
+  core::int d_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d - f();
+              ^" in d.{core::double::-}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::-}(self::f<core::num>()){(core::num) → core::double};
+  self::sub::X d_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Y d_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Z d_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d - f();
+            ^" in d.{core::double::-}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  core::num x_n = x.{core::num::-}(self::f<core::num>()){(core::num) → core::num};
+  core::int x_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x - f();
+              ^" in x.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::-}(self::f<core::double>()){(core::num) → core::double};
+  self::sub::X x_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Y x_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Z x_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x - f();
+            ^" in x.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num y_n = y.{core::num::-}(self::f<core::num>()){(core::num) → core::num};
+  core::int y_i = y.{core::num::-}(self::f<core::int>()){(core::num) → core::int};
+  core::double y_d = y.{core::num::-}(self::f<core::double>()){(core::num) → core::double};
+  self::sub::X y_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Y y_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Z y_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y - f();
+            ^" in y.{core::num::-}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num z_n = z.{core::double::-}(self::f<core::num>()){(core::num) → core::double};
+  core::int z_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z - f();
+              ^" in z.{core::double::-}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::-}(self::f<core::num>()){(core::num) → core::double};
+  self::sub::X z_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Y z_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::sub::Z z_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z - f();
+            ^" in z.{core::double::-}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+}
+static method mul<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+  core::num n_n = n.{core::num::*}(self::f<core::num>()){(core::num) → core::num};
+  core::int n_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n * f();
+              ^" in n.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::*}(self::f<core::double>()){(core::num) → core::double};
+  self::mul::X n_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Y n_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Z n_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n * f();
+            ^" in n.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num i_n = i.{core::num::*}(self::f<core::num>()){(core::num) → core::num};
+  core::int i_i = i.{core::num::*}(self::f<core::int>()){(core::num) → core::int};
+  core::double i_d = i.{core::num::*}(self::f<core::double>()){(core::num) → core::double};
+  self::mul::X i_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Y i_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Z i_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i * f();
+            ^" in i.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num d_n = d.{core::double::*}(self::f<core::num>()){(core::num) → core::double};
+  core::int d_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d * f();
+              ^" in d.{core::double::*}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::*}(self::f<core::num>()){(core::num) → core::double};
+  self::mul::X d_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Y d_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Z d_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d * f();
+            ^" in d.{core::double::*}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  core::num x_n = x.{core::num::*}(self::f<core::num>()){(core::num) → core::num};
+  core::int x_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x * f();
+              ^" in x.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::*}(self::f<core::double>()){(core::num) → core::double};
+  self::mul::X x_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Y x_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Z x_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x * f();
+            ^" in x.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num y_n = y.{core::num::*}(self::f<core::num>()){(core::num) → core::num};
+  core::int y_i = y.{core::num::*}(self::f<core::int>()){(core::num) → core::int};
+  core::double y_d = y.{core::num::*}(self::f<core::double>()){(core::num) → core::double};
+  self::mul::X y_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Y y_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Z y_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y * f();
+            ^" in y.{core::num::*}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num z_n = z.{core::double::*}(self::f<core::num>()){(core::num) → core::double};
+  core::int z_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z * f();
+              ^" in z.{core::double::*}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::*}(self::f<core::num>()){(core::num) → core::double};
+  self::mul::X z_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Y z_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::mul::Z z_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z * f();
+            ^" in z.{core::double::*}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+}
+static method mod<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+  core::num n_n = n.{core::num::%}(self::f<core::num>()){(core::num) → core::num};
+  core::int n_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n % f();
+              ^" in n.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::%}(self::f<core::double>()){(core::num) → core::double};
+  self::mod::X n_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Y n_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Z n_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n % f();
+            ^" in n.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num i_n = i.{core::num::%}(self::f<core::num>()){(core::num) → core::num};
+  core::int i_i = i.{core::num::%}(self::f<core::int>()){(core::num) → core::int};
+  core::double i_d = i.{core::num::%}(self::f<core::double>()){(core::num) → core::double};
+  self::mod::X i_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Y i_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Z i_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i % f();
+            ^" in i.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num d_n = d.{core::double::%}(self::f<core::num>()){(core::num) → core::double};
+  core::int d_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d % f();
+              ^" in d.{core::double::%}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::%}(self::f<core::num>()){(core::num) → core::double};
+  self::mod::X d_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Y d_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Z d_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d % f();
+            ^" in d.{core::double::%}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  core::num x_n = x.{core::num::%}(self::f<core::num>()){(core::num) → core::num};
+  core::int x_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x % f();
+              ^" in x.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::%}(self::f<core::double>()){(core::num) → core::double};
+  self::mod::X x_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Y x_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Z x_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x % f();
+            ^" in x.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num y_n = y.{core::num::%}(self::f<core::num>()){(core::num) → core::num};
+  core::int y_i = y.{core::num::%}(self::f<core::int>()){(core::num) → core::int};
+  core::double y_d = y.{core::num::%}(self::f<core::double>()){(core::num) → core::double};
+  self::mod::X y_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Y y_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Z y_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y % f();
+            ^" in y.{core::num::%}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num z_n = z.{core::double::%}(self::f<core::num>()){(core::num) → core::double};
+  core::int z_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z % f();
+              ^" in z.{core::double::%}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::%}(self::f<core::num>()){(core::num) → core::double};
+  self::mod::X z_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Y z_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::mod::Z z_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z % f();
+            ^" in z.{core::double::%}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+}
+static method remainder<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+  core::num n_n = n.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num};
+  core::int n_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.remainder(f());
+              ^" in n.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = n.{core::num::remainder}(self::f<core::double>()){(core::num) → core::double};
+  self::remainder::X n_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Y n_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Z n_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.remainder(f());
+            ^" in n.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num i_n = i.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num};
+  core::int i_i = i.{core::num::remainder}(self::f<core::int>()){(core::num) → core::int};
+  core::double i_d = i.{core::num::remainder}(self::f<core::double>()){(core::num) → core::double};
+  self::remainder::X i_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Y i_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Z i_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.remainder(f());
+            ^" in i.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::double d_n = d.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double};
+  core::int d_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int d_i = d.remainder(f());
+              ^" in d.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double};
+  self::remainder::X d_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X d_x = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Y d_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Z d_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.remainder(f());
+            ^" in d.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  core::num x_n = x.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num};
+  core::int x_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.remainder(f());
+              ^" in x.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = x.{core::num::remainder}(self::f<core::double>()){(core::num) → core::double};
+  self::remainder::X x_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Y x_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Z x_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.remainder(f());
+            ^" in x.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num y_n = y.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num};
+  core::int y_i = y.{core::num::remainder}(self::f<core::int>()){(core::num) → core::int};
+  core::double y_d = y.{core::num::remainder}(self::f<core::double>()){(core::num) → core::double};
+  self::remainder::X y_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Y y_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Z y_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.remainder(f());
+            ^" in y.{core::num::remainder}(self::f<core::num>()){(core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::double z_n = z.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double};
+  core::int z_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  int z_i = z.remainder(f());
+              ^" in z.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double};
+  self::remainder::X z_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+  X z_x = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Y z_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+  self::remainder::Z z_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.remainder(f());
+            ^" in z.{core::double::remainder}(self::f<core::num>()){(core::num) → core::double} as{TypeError,ForNonNullableByDefault} Never;
+}
+static method clamp<X extends core::num, Y extends core::int, Z extends core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+  core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num};
+  core::int n_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int n_i = n.clamp(f(), f());
+              ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double n_d = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double n_d = n.clamp(f(), f());
+                 ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X n_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X n_x = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Y n_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y n_y = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Z n_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z n_z = n.clamp(f(), f());
+            ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num};
+  core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>()){(core::num, core::num) → core::int};
+  core::double i_d = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double i_d = i.clamp(f(), f());
+                 ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X i_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X i_x = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Y i_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y i_y = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Z i_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z i_z = i.clamp(f(), f());
+            ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num};
+  core::int d_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int d_i = d.clamp(f(), f());
+              ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>()){(core::num, core::num) → core::double};
+  self::clamp::X d_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X d_x = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Y d_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y d_y = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Z d_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z d_z = d.clamp(f(), f());
+            ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num};
+  core::int x_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int x_i = x.clamp(f(), f());
+              ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double x_d = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double x_d = x.clamp(f(), f());
+                 ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X x_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X x_x = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Y x_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y x_y = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Z x_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z x_z = x.clamp(f(), f());
+            ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num};
+  core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>()){(core::num, core::num) → core::int};
+  core::double y_d = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  double y_d = y.clamp(f(), f());
+                 ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::double;
+  self::clamp::X y_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X y_x = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Y y_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y y_y = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Z y_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z y_z = y.clamp(f(), f());
+            ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num};
+  core::int z_i = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  int z_i = z.clamp(f(), f());
+              ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} core::int;
+  core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>()){(core::num, core::num) → core::double};
+  self::clamp::X z_x = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+  X z_x = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Y z_y = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+  Y z_y = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+  self::clamp::Z z_z = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+  Z z_z = z.clamp(f(), f());
+            ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()){(core::num, core::num) → core::num} as{TypeError,ForNonNullableByDefault} Never;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.modular.expect
new file mode 100644
index 0000000..ba12861
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Error: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
+//   num bar = 3.14; // Error in strong mode and Warning in weak mode.
+//       ^
+// pkg/front_end/testcases/nnbd/override_checks.dart:8:12: Context: This is the overridden method ('bar').
+//   void set bar(num? value) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Error: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
+// Change to a subtype of 'num'.
+//   num? get baz => null; // Error in strong mode and Warning in weak mode.
+//            ^
+// pkg/front_end/testcases/nnbd/override_checks.dart:9:11: Context: This is the overridden method ('baz').
+//   num get baz => 42;
+//           ^
+//
+// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Error: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
+// Change to a supertype of 'num?', or, for a covariant parameter, a subtype.
+//   void hest(num value) {} // Error in strong mode and Warning in weak mode.
+//                 ^
+// pkg/front_end/testcases/nnbd/override_checks.dart:10:8: Context: This is the overridden method ('hest').
+//   void hest(num? value) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
+// Try using a different type as argument.
+//   factory C1() = C2<int?>; // Error in strong mode and Warning in weak mode.
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
+//   factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
+//                           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::num> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class B1 extends core::Object {
+  synthetic constructor •() → self::B1
+    : super core::Object::•()
+    ;
+  set bar(core::num? value) → void {}
+  get baz() → core::num
+    return 42;
+  method hest(core::num? value) → void {}
+}
+class B2 extends self::B1 {
+  field core::num bar = 3.14;
+  synthetic constructor •() → self::B2
+    : super self::B1::•()
+    ;
+  get baz() → core::num?
+    return null;
+  method hest(core::num value) → void {}
+}
+class C1 extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  static factory •() → self::C1
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:20:18: Error: The type 'int?' doesn't extend 'int'.
+Try using a different type as argument.
+  factory C1() = C2<int?>; // Error in strong mode and Warning in weak mode.
+                 ^";
+}
+class C2<X extends core::int> extends core::Object implements self::C1 {
+  synthetic constructor •() → self::C2<self::C2::X>
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor foo(core::num x) → self::D
+    : super core::Object::•()
+    ;
+  static factory bar(core::num? x) → self::D
+    return invalid-expression "pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+ - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
+  factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
+                          ^";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::C1::•
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..83ec6a1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.modular.expect
@@ -0,0 +1,285 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method1c(x); // error
+//                 ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+//   void method1c(int x);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+//   void method1c(String x);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   method1d(); // error
+//   ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+//   String method1d();
+//          ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+//   int method1d();
+//       ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:8: Error: Can't infer types for 'method5a' as the overridden members don't have a combined signature.
+// Try adding explicit types.
+//   void method5a(x, y); // error
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+//   void method5a(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+//   void method5a(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void method5b(num x, num y, [z]); // error
+//                                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+//   void method5b(int x, num y);
+//        ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+//   void method5b(num x, int y);
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   get getter1c; // error
+//       ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+//   String get getter1c;
+//              ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+//   int get getter1c;
+//           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field1c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+//   int? get field1c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+//   double? get field1c;
+//               ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field2c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   final field3c = null; // error
+//         ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+//   int? get field3c;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+//   double? get field3c;
+//               ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+//   void set field3c(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   var field4b = null; // error
+//       ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+//   num? get field4b;
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+//   void set field4b(Object? value);
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+//   void set setter1c(x); // error
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+//   void set setter1c(String x);
+//            ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+//   void set setter1c(int x);
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+//                ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+//   void set field2c(int? value);
+//            ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+//   void set field2c(double? value);
+//            ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::AT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::String x) → core::Object;
+  abstract method method1c(core::int x) → void;
+  abstract method method1d() → core::String;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(dynamic x) → void;
+  abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+  abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+  abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, covariant-by-class self::A::AT% y) → void;
+  abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, covariant-by-class self::A::AT% y) → void;
+  abstract method method5a(core::int x, core::num y) → void;
+  abstract method method5b(core::int x, core::num y) → void;
+  abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+  method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+  abstract get getter1a() → core::Object;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → core::String;
+  abstract set getter1d(core::String x) → void;
+  abstract get getter1e() → core::int;
+  abstract set getter1e(core::int x) → void;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::String x) → void;
+  abstract set setter1c(core::String x) → void;
+  abstract get setter1d() → core::String;
+  abstract get setter1e() → core::int;
+  abstract set setter1e(core::int x) → void;
+  abstract get field1a() → core::int?;
+  abstract get field1b() → core::num?;
+  abstract get field1c() → core::int?;
+  abstract set field2a(core::int? value) → void;
+  abstract set field2b(core::num? value) → void;
+  abstract set field2c(core::int? value) → void;
+  abstract get field3a() → core::int?;
+  abstract get field3b() → core::num?;
+  abstract get field3c() → core::int?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract get field4a() → core::num?;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::BT%>
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::String x) → core::Object;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(core::String x) → void;
+  abstract method method1d() → core::int;
+  abstract method method2a(dynamic x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+  abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+  abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, covariant-by-class self::B::BT% y) → void;
+  abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, covariant-by-class self::B::BT% y) → void;
+  abstract method method5a(core::num x, core::int y) → void;
+  abstract method method5b(core::num x, core::int y) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+  abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::Object;
+  abstract get getter1c() → core::int;
+  abstract set getter1d(core::Object x) → void;
+  abstract get getter1e() → core::num;
+  abstract set getter1e(core::Object x) → void;
+  abstract set setter1a(core::String x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(core::int x) → void;
+  abstract get setter1d() → core::Object;
+  abstract get setter1e() → core::num;
+  abstract set setter1e(core::Object x) → void;
+  abstract get field1a() → core::num?;
+  abstract get field1b() → core::int?;
+  abstract get field1c() → core::double?;
+  abstract set field2a(core::num? value) → void;
+  abstract set field2b(core::int? value) → void;
+  abstract set field2c(core::double? value) → void;
+  abstract get field3a() → core::num?;
+  abstract get field3b() → core::int?;
+  abstract get field3c() → core::double?;
+  abstract set field3a(core::Object? value) → void;
+  abstract set field3b(core::Object? value) → void;
+  abstract set field3c(core::Object? value) → void;
+  abstract set field4a(core::num? value) → void;
+  abstract get field4b() → core::num?;
+  abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+  final field core::int? field1a = null;
+  final field core::int? field1b = null;
+  final field invalid-type field1c = null;
+  final field core::num? field2a = null;
+  final field core::num? field2b = null;
+  final field invalid-type field2c = null;
+  final field core::int? field3a = null;
+  final field core::int? field3b = null;
+  final field invalid-type field3c = null;
+  field core::num? field4a = null;
+  field invalid-type field4b = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method method1a(core::Object x) → core::String;
+  abstract method method1b(core::Object x) → core::String;
+  abstract method method1c(invalid-type x) → void;
+  abstract method method1d() → invalid-type;
+  abstract method method2a(core::Object? x) → void;
+  abstract method method2b(core::Object? x) → void;
+  abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+  abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+  abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, covariant-by-class core::num y) → void;
+  abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, covariant-by-class core::num y, [dynamic z = #C1]) → void;
+  abstract method method5a(invalid-type x, invalid-type y) → void;
+  abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+  abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+  abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+  abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+  abstract get getter1a() → core::String;
+  abstract get getter1b() → core::String;
+  abstract get getter1c() → invalid-type;
+  abstract get getter1d() → core::Object;
+  abstract get getter1e() → core::int;
+  abstract set setter1a(core::Object x) → void;
+  abstract set setter1b(core::Object x) → void;
+  abstract set setter1c(invalid-type x) → void;
+  abstract set setter1d(core::String x) → void;
+  abstract set setter1e(core::Object x) → void;
+  abstract member-signature set getter1d(core::Object x) → void; -> self::B::getter1d
+  abstract member-signature set getter1e(core::Object x) → void; -> self::B::getter1e
+  abstract member-signature set field2a(core::num? value) → void; -> self::B::field2a
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/parenthesized_stop_shorting.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/parenthesized_stop_shorting.dart.weak.modular.expect
new file mode 100644
index 0000000..bb556eb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/parenthesized_stop_shorting.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get foo() → core::int
+    return throw 42;
+}
+static method bar(core::int x) → dynamic {}
+static method test(self::A? a) → dynamic {
+  self::bar((let final self::A? #t1 = a in #t1 == null ?{core::int?} null : #t1{self::A}.{self::A::foo}{core::int})!);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.modular.expect
new file mode 100644
index 0000000..4384943
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.modular.expect
@@ -0,0 +1,124 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+import "dart:core" as core;
+
+import "dart:test";
+
+static method main() → dynamic {
+  test::Class<core::num>? c;
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
+//     k;
+//     ^
+//
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+//     return k;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+//     return k;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+//   return k;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+//   return k;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
+//     k;
+//     ^
+//
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+//     return k;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+//   return k;
+//          ^
+//
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class<T extends core::num> extends core::Object /*hasConstConstructor*/  {
+  final field core::int a;
+  final field test::Class::T b;
+  const constructor constConstructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
+    : test::Class::a = a, test::Class::b = b, super core::Object::•()
+    ;
+  constructor constructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
+    : test::Class::a = a, test::Class::b = b, super core::Object::•() {
+    core::int k;
+    invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    k;
+    ^" in k;
+  }
+  @#C1
+  constructor patchedConstructor(core::int i, test::Class::T j) → test::Class<test::Class::T>
+    : test::Class::a = i, test::Class::b = j, super core::Object::•() {
+    core::int k;
+    invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    k;
+    ^" in k;
+  }
+  method method(core::int a) → core::int {
+    core::int k;
+    core::int j = a;
+    return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return k;
+           ^" in k;
+  }
+  @#C1
+  method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
+    core::int k;
+    core::int j = i;
+    return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return k;
+           ^" in k;
+  }
+  method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
+    core::int k;
+    core::int j = i;
+    return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return k;
+           ^" in k;
+  }
+}
+static method method(core::int a) → core::int {
+  core::int k;
+  core::int j = a;
+  return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return k;
+         ^" in k;
+}
+@#C1
+static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
+  core::int k;
+  core::int j = i;
+  return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return k;
+         ^" in k;
+}
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
+  core::int k;
+  core::int j = i;
+  return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return k;
+         ^" in k;
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+}
diff --git a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.modular.expect
new file mode 100644
index 0000000..8aa11f6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+  test::Class1? c1;
+  test::Class2? c2;
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib2.dart:32:14: Error: Field 'staticField' should be initialized because its type 'int' doesn't allow null.
+//   static int staticField;
+//              ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib2.dart:30:7: Error: Field 'field' should be initialized because its type 'int' doesn't allow null.
+//   int field;
+//       ^^^^^
+//
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/origin_lib.dart:8:3: Error: This constructor should initialize field 'field' because its type 'int' doesn't allow null.
+//   Class2.constructor1();
+//   ^
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib2.dart:37:7: Context: 'field' is defined here.
+//   int field;
+//       ^^^^^
+//
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class1 extends core::Object {
+  field core::int field = null /* from org-dartlang-testcase:///patch_lib2.dart */;
+  static field core::int staticField = null /* from org-dartlang-testcase:///patch_lib2.dart */;
+  synthetic constructor •() → test::Class1
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Class2 extends core::Object {
+  field core::int field /* from org-dartlang-testcase:///patch_lib2.dart */;
+  constructor constructor2(core::int field) → test::Class2
+    : test::Class2::field = field, super core::Object::•()
+    ;
+  constructor constructor1() → test::Class2
+    : test::Class2::field = null, super core::Object::•()
+    ;
+}
+
+constants  {
+  #C1 = _in::_Patch {}
+}
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.modular.expect
new file mode 100644
index 0000000..2d71c44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+  test::Class? c = new test::Class::•();
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   void patchedMethod([int i]) {}
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   void _injectedMethod([int i]) {}
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void patchedMethod([int i]) {}
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void _injectedMethod([int i]) {}
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   void method([int i]) {}
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: The parameter 'i' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// void method([int i]) {}
+//                  ^
+//
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C1
+class Class extends core::Object {
+  synthetic constructor •() → test::Class
+    : super core::Object::•()
+    ;
+  method method([core::int i = #C2]) → void {}
+  @#C1
+  method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod([core::int i = #C2]) → void {}
+  method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod([core::int i = #C2]) → void {}
+}
+static method method([core::int i = #C2]) → void {}
+@#C1
+static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod([core::int i = #C2]) → void {}
+static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod([core::int i = #C2]) → void {}
+
+constants  {
+  #C1 = _in::_Patch {}
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.modular.expect
new file mode 100644
index 0000000..752b8a6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart.weak.modular.expect
@@ -0,0 +1,258 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:65:9: Error: Constant evaluation error:
+//   const Class<num>(''); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:16:46: Context: Expected constant '""' to be of type 'num', but was of type 'String'.
+//   const Class(dynamic value) : field = value as T;
+//                                              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:66:9: Error: Constant evaluation error:
+//   const Class<int>(0.5); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:16:46: Context: Expected constant '0.5' to be of type 'int', but was of type 'double'.
+//   const Class(dynamic value) : field = value as T;
+//                                              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:67:9: Error: Constant evaluation error:
+//   const Class<String>(0); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:16:46: Context: Expected constant '0' to be of type 'String', but was of type 'int'.
+//   const Class(dynamic value) : field = value as T;
+//                                              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:68:9: Error: Constant evaluation error:
+//   const ClassWithBound<double>(); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:22:42: Context: Expected constant '3' to be of type 'double', but was of type 'int'.
+//   const ClassWithBound() : field = three as T;
+//                                          ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:69:9: Error: Constant evaluation error:
+//   const ClassWithBound<double>.withValue(0); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:24:65: Context: Expected constant '0' to be of type 'double', but was of type 'int'.
+//   const ClassWithBound.withValue(dynamic value) : field = value as T;
+//                                                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:70:9: Error: Constant evaluation error:
+//   const ClassWithBound<double>.withValue(three); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:24:65: Context: Expected constant '3' to be of type 'double', but was of type 'int'.
+//   const ClassWithBound.withValue(dynamic value) : field = value as T;
+//                                                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:71:9: Error: Constant evaluation error:
+//   const ClassWithBound<num>.withValue(''); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:24:65: Context: Expected constant '""' to be of type 'num', but was of type 'String'.
+//   const ClassWithBound.withValue(dynamic value) : field = value as T;
+//                                                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:72:9: Error: Constant evaluation error:
+//   const ClassWithList(0); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:30:54: Context: Expected constant '0' to be of type 'List<dynamic>', but was of type 'int'.
+//  - 'List' is from 'dart:core'.
+//   const ClassWithList(dynamic value) : field = value as List<T>;
+//                                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:73:9: Error: Constant evaluation error:
+//   const ClassWithList<num>(<String>['']); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:30:54: Context: Expected constant '<String>[""]' to be of type 'List<num>', but was of type 'List<String>'.
+//  - 'List' is from 'dart:core'.
+//   const ClassWithList(dynamic value) : field = value as List<T>;
+//                                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:74:9: Error: Constant evaluation error:
+//   const ClassWithList<int>(<num>[0]); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:30:54: Context: Expected constant '<num>[0]' to be of type 'List<int>', but was of type 'List<num>'.
+//  - 'List' is from 'dart:core'.
+//   const ClassWithList(dynamic value) : field = value as List<T>;
+//                                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:75:9: Error: Constant evaluation error:
+//   const ClassWithList<String>(<int>[0]); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:30:54: Context: Expected constant '<int>[0]' to be of type 'List<String>', but was of type 'List<int>'.
+//  - 'List' is from 'dart:core'.
+//   const ClassWithList(dynamic value) : field = value as List<T>;
+//                                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:76:9: Error: Constant evaluation error:
+//   const ClassWithFunction(0); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:36:58: Context: Expected constant '0' to be of type 'dynamic Function(dynamic)', but was of type 'int'.
+//   const ClassWithFunction(dynamic value) : field = value as T Function(T);
+//                                                          ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:77:9: Error: Constant evaluation error:
+//   const ClassWithFunction(intFunction); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:36:58: Context: Expected constant 'intFunction' to be of type 'dynamic Function(dynamic)', but was of type 'int Function(int)'.
+//   const ClassWithFunction(dynamic value) : field = value as T Function(T);
+//                                                          ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:78:9: Error: Constant evaluation error:
+//   const ClassWithFunction<Object>(intFunction); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:36:58: Context: Expected constant 'intFunction' to be of type 'Object Function(Object)', but was of type 'int Function(int)'.
+//  - 'Object' is from 'dart:core'.
+//   const ClassWithFunction(dynamic value) : field = value as T Function(T);
+//                                                          ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:79:9: Error: Constant evaluation error:
+//   const ClassWithFunction<void>(intFunction); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:36:58: Context: Expected constant 'intFunction' to be of type 'void Function(void)', but was of type 'int Function(int)'.
+//   const ClassWithFunction(dynamic value) : field = value as T Function(T);
+//                                                          ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:80:9: Error: Constant evaluation error:
+//   const ClassWithFunction<num>(intFunction); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:36:58: Context: Expected constant 'intFunction' to be of type 'num Function(num)', but was of type 'int Function(int)'.
+//   const ClassWithFunction(dynamic value) : field = value as T Function(T);
+//                                                          ^
+//
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:81:9: Error: Constant evaluation error:
+//   const ClassWithFunction<int>(idFunction); // error
+//         ^
+// pkg/front_end/testcases/nnbd/potentially_constant_type_as.dart:36:58: Context: Expected constant 'idFunction' to be of type 'int Function(int)', but was of type 'T Function<T>(T)'.
+//   const ClassWithFunction(dynamic value) : field = value as T Function(T);
+//                                                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field self::Class::T% field;
+  const constructor •(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value as{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
+    ;
+}
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
+  final field self::ClassWithBound::T field;
+  const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
+    : self::ClassWithBound::field = #C1 as{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
+    ;
+  const constructor withValue(dynamic value) → self::ClassWithBound<self::ClassWithBound::T>
+    : self::ClassWithBound::field = value as{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
+    ;
+}
+class ClassWithList<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::List<self::ClassWithList::T%> field;
+  const constructor •(dynamic value) → self::ClassWithList<self::ClassWithList::T%>
+    : self::ClassWithList::field = value as{ForNonNullableByDefault} core::List<self::ClassWithList::T%>, super core::Object::•()
+    ;
+}
+class ClassWithFunction<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field (self::ClassWithFunction::T%) → self::ClassWithFunction::T% field;
+  const constructor •(dynamic value) → self::ClassWithFunction<self::ClassWithFunction::T%>
+    : self::ClassWithFunction::field = value as{ForNonNullableByDefault} (self::ClassWithFunction::T%) → self::ClassWithFunction::T%, super core::Object::•()
+    ;
+}
+static const field core::num three = #C1;
+static const field (core::int) → core::int idAsIntFunction = #C3;
+static method dynamicFunction(dynamic d) → dynamic
+  return d;
+static method objectFunction(core::Object? o) → core::Object?
+  return o;
+static method intFunction(core::int i) → core::int
+  return i;
+static method idFunction<T extends core::Object? = dynamic>(self::idFunction::T% t) → self::idFunction::T%
+  return t;
+static method main() → void {
+  #C5;
+  #C6;
+  #C7;
+  #C9;
+  #C10;
+  #C11;
+  #C10;
+  #C13;
+  #C15;
+  #C17;
+  #C18;
+  #C20;
+  #C22;
+  #C23;
+  #C25;
+  #C26;
+  #C28;
+  #C29;
+}
+static method weakMode() → dynamic {
+  #C30;
+}
+static method errors() → dynamic {
+  invalid-expression "Expected constant '\"\"' to be of type 'num', but was of type 'String'.";
+  invalid-expression "Expected constant '0.5' to be of type 'int', but was of type 'double'.";
+  invalid-expression "Expected constant '0' to be of type 'String', but was of type 'int'.";
+  invalid-expression "Expected constant '3' to be of type 'double', but was of type 'int'.";
+  invalid-expression "Expected constant '0' to be of type 'double', but was of type 'int'.";
+  invalid-expression "Expected constant '3' to be of type 'double', but was of type 'int'.";
+  invalid-expression "Expected constant '\"\"' to be of type 'num', but was of type 'String'.";
+  invalid-expression "Expected constant '0' to be of type 'List<dynamic>', but was of type 'int'.
+ - 'List' is from 'dart:core'.";
+  invalid-expression "Expected constant '<String>[\"\"]' to be of type 'List<num>', but was of type 'List<String>'.
+ - 'List' is from 'dart:core'.";
+  invalid-expression "Expected constant '<num>[0]' to be of type 'List<int>', but was of type 'List<num>'.
+ - 'List' is from 'dart:core'.";
+  invalid-expression "Expected constant '<int>[0]' to be of type 'List<String>', but was of type 'List<int>'.
+ - 'List' is from 'dart:core'.";
+  invalid-expression "Expected constant '0' to be of type 'dynamic Function(dynamic)', but was of type 'int'.";
+  invalid-expression "Expected constant 'intFunction' to be of type 'dynamic Function(dynamic)', but was of type 'int Function(int)'.";
+  invalid-expression "Expected constant 'intFunction' to be of type 'Object Function(Object)', but was of type 'int Function(int)'.
+ - 'Object' is from 'dart:core'.";
+  invalid-expression "Expected constant 'intFunction' to be of type 'void Function(void)', but was of type 'int Function(int)'.";
+  invalid-expression "Expected constant 'intFunction' to be of type 'num Function(num)', but was of type 'int Function(int)'.";
+  invalid-expression "Expected constant 'idFunction' to be of type 'int Function(int)', but was of type 'T Function<T>(T)'.";
+}
+
+constants  {
+  #C1 = 3
+  #C2 = static-tearoff self::idFunction
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = 0
+  #C5 = self::Class<dynamic> {field:#C4}
+  #C6 = self::Class<core::num*> {field:#C4}
+  #C7 = self::Class<core::int*> {field:#C4}
+  #C8 = ""
+  #C9 = self::Class<core::String*> {field:#C8}
+  #C10 = self::ClassWithBound<core::int*> {field:#C1}
+  #C11 = self::ClassWithBound<core::int*> {field:#C4}
+  #C12 = 0.5
+  #C13 = self::ClassWithBound<core::double*> {field:#C12}
+  #C14 = <dynamic>[]
+  #C15 = self::ClassWithList<dynamic> {field:#C14}
+  #C16 = <core::int*>[#C4]
+  #C17 = self::ClassWithList<core::num*> {field:#C16}
+  #C18 = self::ClassWithList<core::int*> {field:#C16}
+  #C19 = <core::String*>[#C8]
+  #C20 = self::ClassWithList<core::String*> {field:#C19}
+  #C21 = static-tearoff self::dynamicFunction
+  #C22 = self::ClassWithFunction<dynamic> {field:#C21}
+  #C23 = self::ClassWithFunction<core::Object?> {field:#C21}
+  #C24 = static-tearoff self::objectFunction
+  #C25 = self::ClassWithFunction<dynamic> {field:#C24}
+  #C26 = self::ClassWithFunction<void> {field:#C24}
+  #C27 = static-tearoff self::intFunction
+  #C28 = self::ClassWithFunction<core::int*> {field:#C27}
+  #C29 = self::ClassWithFunction<core::int*> {field:#C3}
+  #C30 = self::ClassWithFunction<core::Object*> {field:#C24}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///potentially_constant_type_as.dart:
+- Class. (from org-dartlang-testcase:///potentially_constant_type_as.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- ClassWithBound. (from org-dartlang-testcase:///potentially_constant_type_as.dart:22:9)
+- ClassWithBound.withValue (from org-dartlang-testcase:///potentially_constant_type_as.dart:24:9)
+- ClassWithList. (from org-dartlang-testcase:///potentially_constant_type_as.dart:30:9)
+- ClassWithFunction. (from org-dartlang-testcase:///potentially_constant_type_as.dart:36:9)
diff --git a/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.modular.expect
new file mode 100644
index 0000000..3b6c8a8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_constant_type_is.dart.weak.modular.expect
@@ -0,0 +1,126 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool field;
+  const constructor •(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
+    ;
+}
+class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool field;
+  const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
+    : self::ClassWithBound::field = #C1 is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
+    ;
+  const constructor withValue(dynamic value) → self::ClassWithBound<self::ClassWithBound::T>
+    : self::ClassWithBound::field = value is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
+    ;
+}
+class ClassWithList<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool field;
+  const constructor •(dynamic value) → self::ClassWithList<self::ClassWithList::T%>
+    : self::ClassWithList::field = value is{ForNonNullableByDefault} core::List<self::ClassWithList::T%>, super core::Object::•()
+    ;
+}
+class ClassWithFunction<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool field;
+  const constructor •(dynamic value) → self::ClassWithFunction<self::ClassWithFunction::T%>
+    : self::ClassWithFunction::field = value is{ForNonNullableByDefault} (self::ClassWithFunction::T%) → self::ClassWithFunction::T%, super core::Object::•()
+    ;
+}
+static const field core::num three = #C1;
+static const field (core::int) → core::int idAsIntFunction = #C3;
+static method dynamicFunction(dynamic d) → dynamic
+  return d;
+static method objectFunction(core::Object? o) → core::Object?
+  return o;
+static method intFunction(core::int i) → core::int
+  return i;
+static method idFunction<T extends core::Object? = dynamic>(self::idFunction::T% t) → self::idFunction::T%
+  return t;
+static method main() → void {
+  #C5;
+  #C6;
+  #C7;
+  #C8;
+  #C9;
+  #C9;
+  #C9;
+  #C10;
+  #C11;
+  #C12;
+  #C13;
+  #C14;
+  #C15;
+  #C16;
+  #C15;
+  #C17;
+  #C18;
+  #C18;
+  #C19;
+  #C21;
+  #C22;
+  #C23;
+  #C24;
+  #C24;
+  #C24;
+  #C25;
+  #C26;
+  #C27;
+  #C28;
+  #C29;
+  #C30;
+  #C30;
+  #C31;
+  #C32;
+  #C33;
+  #C34;
+}
+
+constants  {
+  #C1 = 3
+  #C2 = static-tearoff self::idFunction
+  #C3 = instantiation #C2 <core::int*>
+  #C4 = true
+  #C5 = self::Class<dynamic> {field:#C4}
+  #C6 = self::Class<core::num*> {field:#C4}
+  #C7 = self::Class<core::int*> {field:#C4}
+  #C8 = self::Class<core::String*> {field:#C4}
+  #C9 = self::ClassWithBound<core::int*> {field:#C4}
+  #C10 = self::ClassWithBound<core::double*> {field:#C4}
+  #C11 = self::ClassWithList<dynamic> {field:#C4}
+  #C12 = self::ClassWithList<core::num*> {field:#C4}
+  #C13 = self::ClassWithList<core::int*> {field:#C4}
+  #C14 = self::ClassWithList<core::String*> {field:#C4}
+  #C15 = self::ClassWithFunction<dynamic> {field:#C4}
+  #C16 = self::ClassWithFunction<core::Object?> {field:#C4}
+  #C17 = self::ClassWithFunction<void> {field:#C4}
+  #C18 = self::ClassWithFunction<core::int*> {field:#C4}
+  #C19 = self::ClassWithFunction<core::Object*> {field:#C4}
+  #C20 = false
+  #C21 = self::Class<core::num*> {field:#C20}
+  #C22 = self::Class<core::int*> {field:#C20}
+  #C23 = self::Class<core::String*> {field:#C20}
+  #C24 = self::ClassWithBound<core::double*> {field:#C20}
+  #C25 = self::ClassWithBound<core::num*> {field:#C20}
+  #C26 = self::ClassWithList<dynamic> {field:#C20}
+  #C27 = self::ClassWithList<core::num*> {field:#C20}
+  #C28 = self::ClassWithList<core::int*> {field:#C20}
+  #C29 = self::ClassWithList<core::String*> {field:#C20}
+  #C30 = self::ClassWithFunction<dynamic> {field:#C20}
+  #C31 = self::ClassWithFunction<core::Object*> {field:#C20}
+  #C32 = self::ClassWithFunction<void> {field:#C20}
+  #C33 = self::ClassWithFunction<core::num*> {field:#C20}
+  #C34 = self::ClassWithFunction<core::int*> {field:#C20}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///potentially_constant_type_is.dart:
+- Class. (from org-dartlang-testcase:///potentially_constant_type_is.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- ClassWithBound. (from org-dartlang-testcase:///potentially_constant_type_is.dart:22:9)
+- ClassWithBound.withValue (from org-dartlang-testcase:///potentially_constant_type_is.dart:24:9)
+- ClassWithList. (from org-dartlang-testcase:///potentially_constant_type_is.dart:30:9)
+- ClassWithFunction. (from org-dartlang-testcase:///potentially_constant_type_is.dart:36:9)
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.modular.expect
new file mode 100644
index 0000000..f8836ef
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
+// int x; // Error.
+//     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
+//   static int x; // Error.
+//              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Error: Field 'lx' should be initialized because its type 'int' doesn't allow null.
+//   int lx; // Error.
+//       ^^
+//
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Error: Field 'lt' should be initialized because its type 'T' doesn't allow null.
+//   T lt; // Error.
+//     ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object?> extends core::Object {
+  static field core::int x = null;
+  static field core::int? y = null;
+  late static field core::int z;
+  field core::int lx = null;
+  field core::int? ly = null;
+  late field core::int? lz;
+  field core::int lv;
+  field core::int lu;
+  covariant-by-class field self::A::T% lt = null;
+  covariant-by-class field self::A::T? ls = null;
+  late covariant-by-class field self::A::T% lr;
+  covariant-by-class field self::A::T% lp;
+  covariant-by-class field self::A::T% lq;
+  constructor •(core::int lv, self::A::T% lp, self::A::T% t) → self::A<self::A::T%>
+    : self::A::lv = lv, self::A::lp = lp, self::A::lu = 42, self::A::lq = t, super core::Object::•()
+    ;
+}
+static field core::int x;
+static field core::int? y;
+late static field core::int z;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.modular.expect
new file mode 100644
index 0000000..939fe87
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.modular.expect
@@ -0,0 +1,828 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// var topLevelBinary = nullableInt + 0;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// var topLevelUnary = -nullableInt;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGet = nullableMap[0];
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:40:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexSet = nullableMap[0] = 1;
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:41:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:41:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+// var topLevelIndexGetSet = nullableMap[0] += 1;
+//                                      ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGet = nullableClass.property;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:43:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertySet = nullableClass.property = 1;
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:44:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelPropertyGetSet = nullableClass.property += 1;
+//                                            ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:45:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+// var topLevelMethodInvocation = nullableClass.method();
+//                                              ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:43: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelMethodTearOff = nullableClass.method;
+//                                           ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:52: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+// var topLevelFunctionImplicitCall = nullableFunction();
+//                                                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+// var topLevelFunctionExplicitCall = nullableFunction.call();
+//                                                     ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+// var topLevelFunctionTearOff = nullableFunction.call;
+//                                                ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:60: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+//                                                            ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+// var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                             ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+// var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+//                                                        ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+// var topLevelFunctionField = nullableClass.functionField();
+//                                           ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:54:47: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+// var topLevelFunctionTypeField = nullableClass.functionTypeField();
+//                                               ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:55:44: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+// var topLevelFunctionGetter = nullableClass.functionGetter();
+//                                            ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:56:48: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+// var topLevelFunctionTypeGetter = nullableClass.functionTypeGetter();
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:58:45: Error: Operator '+' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// var topLevelExtensionBinary = nullableClass + 0;
+//                                             ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:59:30: Error: Operator 'unary-' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// var topLevelExtensionUnary = -nullableClass;
+//                              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:60:46: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// var topLevelExtensionIndexGet = nullableClass[0];
+//                                              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:61:46: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// var topLevelExtensionIndexSet = nullableClass[0] = 1;
+//                                              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:62:49: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// var topLevelExtensionIndexGetSet = nullableClass[0] += 1;
+//                                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:62:49: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// var topLevelExtensionIndexGetSet = nullableClass[0] += 1;
+//                                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:63:50: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelExtensionPropertyGet = nullableClass.extensionProperty;
+//                                                  ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:64:50: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelExtensionPropertySet = nullableClass.extensionProperty = 1;
+//                                                  ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:65:53: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelExtensionPropertyGetSet = nullableClass.extensionProperty += 1;
+//                                                     ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:66:55: Error: Method 'extensionMethod' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+// var topLevelExtensionMethodInvocation = nullableClass.extensionMethod();
+//                                                       ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:67:52: Error: Property 'extensionMethod' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelExtensionMethodTearOff = nullableClass.extensionMethod;
+//                                                    ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:68:62: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+// var topLevelExtensionFunctionTypeImplicitCall = nullableClass();
+//                                                              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:69:63: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+// var topLevelExtensionFunctionTypeExplicitCall = nullableClass.call();
+//                                                               ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:70:58: Error: Property 'call' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+// var topLevelExtensionFunctionTypeTearOff = nullableClass.call;
+//                                                          ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:71:53: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+// var topLevelExtensionFunctionGetter = nullableClass.extensionFunctionGetter();
+//                                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:73:19: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+//     nullableClass.extensionFunctionTypeGetter();
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   var localBinary = nullableInt + 0;
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:77:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+//   var localUnary = -nullableInt;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:78:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGet = nullableMap[0];
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:79:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexSet = nullableMap[0] = 1;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:80:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:80:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+//  - 'Map' is from 'dart:core'.
+//   var localIndexGetSet = nullableMap[0] += 1;
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:81:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGet = nullableClass.property;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:82:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertySet = nullableClass.property = 1;
+//                                        ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:83:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localPropertyGetSet = nullableClass.property += 1;
+//                                           ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:84:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+//   var localMethodInvocation = nullableClass.method();
+//                                             ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:85:42: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localMethodTearOff = nullableClass.method;
+//                                          ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:86:51: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+//   var localFunctionImplicitCall = nullableFunction();
+//                                                   ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:87:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+//   var localFunctionExplicitCall = nullableFunction.call();
+//                                                    ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:88:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try accessing using ?. instead.
+//   var localFunctionTearOff = nullableFunction.call;
+//                                               ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:89:59: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   var localFunctionTypeImplicitCall = nullableFunctionType();
+//                                                           ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:90:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+// Try calling using ?. instead.
+//   var localFunctionTypeExplicitCall = nullableFunctionType.call();
+//                                                            ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:91:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+// Try accessing using ?. instead.
+//   var localFunctionTypeTearOff = nullableFunctionType.call;
+//                                                       ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:92:42: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+//   var localFunctionField = nullableClass.functionField();
+//                                          ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:93:46: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+//   var localFunctionTypeField = nullableClass.functionTypeField();
+//                                              ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:94:43: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+//   var localFunctionGetter = nullableClass.functionGetter();
+//                                           ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:95:47: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+//   var localFunctionTypeGetter = nullableClass.functionTypeGetter();
+//                                               ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:97:44: Error: Operator '+' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+//   var localExtensionBinary = nullableClass + 0;
+//                                            ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:98:29: Error: Operator 'unary-' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+//   var localExtensionUnary = -nullableClass;
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:99:45: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+//   var localExtensionIndexGet = nullableClass[0];
+//                                             ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:100:45: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+//   var localExtensionIndexSet = nullableClass[0] = 1;
+//                                             ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:101:48: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+//   var localExtensionIndexGetSet = nullableClass[0] += 1;
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:101:48: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+//   var localExtensionIndexGetSet = nullableClass[0] += 1;
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:102:49: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localExtensionPropertyGet = nullableClass.extensionProperty;
+//                                                 ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:103:49: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localExtensionPropertySet = nullableClass.extensionProperty = 1;
+//                                                 ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:104:52: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localExtensionPropertyGetSet = nullableClass.extensionProperty += 1;
+//                                                    ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:105:54: Error: Method 'extensionMethod' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+//   var localExtensionMethodInvocation = nullableClass.extensionMethod();
+//                                                      ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:106:51: Error: Property 'extensionMethod' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localExtensionMethodTearOff = nullableClass.extensionMethod;
+//                                                   ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:107:61: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+//   var localExtensionFunctionTypeImplicitCall = nullableClass();
+//                                                             ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:108:62: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?. instead.
+//   var localExtensionFunctionTypeExplicitCall = nullableClass.call();
+//                                                              ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:109:57: Error: Property 'call' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try accessing using ?. instead.
+//   var localExtensionFunctionTypeTearOff = nullableClass.call;
+//                                                         ^^^^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:110:52: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+//   var localExtensionFunctionGetter = nullableClass.extensionFunctionGetter();
+//                                                    ^
+//
+// pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:112:21: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+// Try calling using ?.call instead.
+//       nullableClass.extensionFunctionTypeGetter();
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int property = 0;
+  field core::Function functionField = () → Null {};
+  field () → void functionTypeField = () → void {};
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method() → core::int
+    return 0;
+  get functionGetter() → core::Function
+    return () → Null {};
+  get functionTypeGetter() → () → void
+    return () → void {};
+}
+extension Extension on self::Class {
+  operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+  method call = self::Extension|call;
+  tearoff call = self::Extension|get#call;
+  get extensionProperty = self::Extension|get#extensionProperty;
+  method extensionMethod = self::Extension|extensionMethod;
+  tearoff extensionMethod = self::Extension|get#extensionMethod;
+  get extensionFunctionGetter = self::Extension|get#extensionFunctionGetter;
+  get extensionFunctionTypeGetter = self::Extension|get#extensionFunctionTypeGetter;
+  set extensionProperty = self::Extension|set#extensionProperty;
+}
+static field core::num topLevelBinary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+var topLevelBinary = nullableInt + 0;
+                                 ^" in self::nullableInt.{core::num::+}(0){(core::num) → core::num};
+static field core::int topLevelUnary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+var topLevelUnary = -nullableInt;
+                    ^" in self::nullableInt.{core::int::unary-}(){() → core::int};
+static field dynamic topLevelIndexGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:39:35: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGet = nullableMap[0];
+                                  ^" in self::nullableMap.{core::Map::[]}{<nullable>}.(0){(core::Object?) → dynamic};
+static field core::int topLevelIndexSet = let final core::Map<dynamic, dynamic>? #t1 = self::nullableMap in let final core::int #t2 = 0 in let final core::int #t3 = 1 in let final void #t4 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:40:35: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexSet = nullableMap[0] = 1;
+                                  ^" in #t1.{core::Map::[]=}{<nullable>}.(#t2, #t3){(dynamic, dynamic) → void} in #t3;
+static field dynamic topLevelIndexGetSet = let final core::Map<dynamic, dynamic>? #t5 = self::nullableMap in let final core::int #t6 = 0 in let final dynamic #t7 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:41:38: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^" in #t5.{core::Map::[]}{<nullable>}.(#t6){(core::Object?) → dynamic}{dynamic}.+(1) in let final void #t8 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:41:38: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+var topLevelIndexGetSet = nullableMap[0] += 1;
+                                     ^" in #t5.{core::Map::[]=}{<nullable>}.(#t6, #t7){(dynamic, dynamic) → void} in #t7;
+static field core::int topLevelPropertyGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:42:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGet = nullableClass.property;
+                                        ^^^^^^^^" in self::nullableClass.{self::Class::property}{<nullable>}.{core::int};
+static field core::int topLevelPropertySet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:43:41: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertySet = nullableClass.property = 1;
+                                        ^^^^^^^^" in self::nullableClass.{self::Class::property}{<nullable>}. = 1;
+static field core::int topLevelPropertyGetSet = let final self::Class? #t9 = self::nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:44:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGetSet = nullableClass.property += 1;
+                                           ^^^^^^^^" in #t9.{self::Class::property}{<nullable>}. = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:44:44: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelPropertyGetSet = nullableClass.property += 1;
+                                           ^^^^^^^^" in #t9.{self::Class::property}{<nullable>}.{core::int}.{core::num::+}(1){(core::num) → core::int};
+static field core::int topLevelMethodInvocation = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:45:46: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+var topLevelMethodInvocation = nullableClass.method();
+                                             ^^^^^^" in self::nullableClass.{self::Class::method}{<nullable>}.(){() → core::int};
+static field () → core::int topLevelMethodTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:46:43: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelMethodTearOff = nullableClass.method;
+                                          ^^^^^^" in self::nullableClass.{self::Class::method}{<nullable>}.{() → core::int};
+static field dynamic topLevelFunctionImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:47:52: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+var topLevelFunctionImplicitCall = nullableFunction();
+                                                   ^" in self::nullableFunction{<nullable>}.();
+static field dynamic topLevelFunctionExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:48:53: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+var topLevelFunctionExplicitCall = nullableFunction.call();
+                                                    ^^^^" in self::nullableFunction{<nullable>}.();
+static field core::Function? topLevelFunctionTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:49:48: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+var topLevelFunctionTearOff = nullableFunction.call;
+                                               ^^^^" in self::nullableFunction.call;
+static field void topLevelFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:50:60: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+var topLevelFunctionTypeImplicitCall = nullableFunctionType();
+                                                           ^" in self::nullableFunctionType{<nullable>}.(){() →? void};
+static field void topLevelFunctionTypeExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:51:61: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+var topLevelFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                            ^^^^" in self::nullableFunctionType{<nullable>}.(){() →? void};
+static field () →? void topLevelFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:52:56: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+var topLevelFunctionTypeTearOff = nullableFunctionType.call;
+                                                       ^^^^" in self::nullableFunctionType.call;
+static field dynamic topLevelFunctionField = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:53:43: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+var topLevelFunctionField = nullableClass.functionField();
+                                          ^" in self::nullableClass.{self::Class::functionField}{<nullable>}.{core::Function}();
+static field void topLevelFunctionTypeField = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:54:47: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+var topLevelFunctionTypeField = nullableClass.functionTypeField();
+                                              ^" in self::nullableClass.{self::Class::functionTypeField}{<nullable>}.{() → void}(){() → void};
+static field dynamic topLevelFunctionGetter = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:55:44: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+var topLevelFunctionGetter = nullableClass.functionGetter();
+                                           ^" in self::nullableClass.{self::Class::functionGetter}{<nullable>}.{core::Function}();
+static field void topLevelFunctionTypeGetter = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:56:48: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+var topLevelFunctionTypeGetter = nullableClass.functionTypeGetter();
+                                               ^" in self::nullableClass.{self::Class::functionTypeGetter}{<nullable>}.{() → void}(){() → void};
+static field core::int topLevelExtensionBinary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:58:45: Error: Operator '+' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+var topLevelExtensionBinary = nullableClass + 0;
+                                            ^" in self::Extension|+(self::nullableClass, 0);
+static field core::int topLevelExtensionUnary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:59:30: Error: Operator 'unary-' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+var topLevelExtensionUnary = -nullableClass;
+                             ^" in self::Extension|unary-(self::nullableClass);
+static field core::int topLevelExtensionIndexGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:60:46: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+var topLevelExtensionIndexGet = nullableClass[0];
+                                             ^" in self::Extension|[](self::nullableClass, 0);
+static field core::int topLevelExtensionIndexSet = let final self::Class? #t10 = self::nullableClass in let final core::int #t11 = 0 in let final core::int #t12 = 1 in let final void #t13 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:61:46: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+var topLevelExtensionIndexSet = nullableClass[0] = 1;
+                                             ^" in self::Extension|[]=(#t10, #t11, #t12) in #t12;
+static field core::int topLevelExtensionIndexGetSet = let final self::Class? #t14 = self::nullableClass in let final core::int #t15 = 0 in let final core::int #t16 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:62:49: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+var topLevelExtensionIndexGetSet = nullableClass[0] += 1;
+                                                ^" in self::Extension|[](#t14, #t15).{core::num::+}(1){(core::num) → core::int} in let final void #t17 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:62:49: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+var topLevelExtensionIndexGetSet = nullableClass[0] += 1;
+                                                ^" in self::Extension|[]=(#t14, #t15, #t16) in #t16;
+static field core::int topLevelExtensionPropertyGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:63:50: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelExtensionPropertyGet = nullableClass.extensionProperty;
+                                                 ^^^^^^^^^^^^^^^^^" in self::Extension|get#extensionProperty(self::nullableClass);
+static field core::int topLevelExtensionPropertySet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:64:50: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelExtensionPropertySet = nullableClass.extensionProperty = 1;
+                                                 ^^^^^^^^^^^^^^^^^" in let final core::int #t18 = 1 in let final void #t19 = self::Extension|set#extensionProperty(self::nullableClass, #t18) in #t18;
+static field core::int topLevelExtensionPropertyGetSet = let final self::Class? #t20 = self::nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:65:53: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelExtensionPropertyGetSet = nullableClass.extensionProperty += 1;
+                                                    ^^^^^^^^^^^^^^^^^" in let final core::int #t21 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:65:53: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelExtensionPropertyGetSet = nullableClass.extensionProperty += 1;
+                                                    ^^^^^^^^^^^^^^^^^" in self::Extension|get#extensionProperty(#t20).{core::num::+}(1){(core::num) → core::int} in let final void #t22 = self::Extension|set#extensionProperty(#t20, #t21) in #t21;
+static field core::int topLevelExtensionMethodInvocation = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:66:55: Error: Method 'extensionMethod' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+var topLevelExtensionMethodInvocation = nullableClass.extensionMethod();
+                                                      ^^^^^^^^^^^^^^^" in self::Extension|extensionMethod(self::nullableClass);
+static field () → core::int topLevelExtensionMethodTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:67:52: Error: Property 'extensionMethod' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelExtensionMethodTearOff = nullableClass.extensionMethod;
+                                                   ^^^^^^^^^^^^^^^" in self::Extension|get#extensionMethod(self::nullableClass);
+static field core::int topLevelExtensionFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:68:62: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+var topLevelExtensionFunctionTypeImplicitCall = nullableClass();
+                                                             ^" in self::Extension|call(self::nullableClass);
+static field core::int topLevelExtensionFunctionTypeExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:69:63: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+var topLevelExtensionFunctionTypeExplicitCall = nullableClass.call();
+                                                              ^^^^" in self::Extension|call(self::nullableClass);
+static field () → core::int topLevelExtensionFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:70:58: Error: Property 'call' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+var topLevelExtensionFunctionTypeTearOff = nullableClass.call;
+                                                         ^^^^" in self::Extension|get#call(self::nullableClass);
+static field dynamic topLevelExtensionFunctionGetter = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:71:53: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+var topLevelExtensionFunctionGetter = nullableClass.extensionFunctionGetter();
+                                                    ^" in self::Extension|get#extensionFunctionGetter(self::nullableClass)();
+static field void topLevelExtensionFunctionTypeGetter = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:73:19: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+    nullableClass.extensionFunctionTypeGetter();
+                  ^" in self::Extension|get#extensionFunctionTypeGetter(self::nullableClass)(){() → void};
+static method Extension|+(lowered final self::Class #this, core::int value) → core::int
+  return 0;
+static method Extension|unary-(lowered final self::Class #this) → core::int
+  return 0;
+static method Extension|[](lowered final self::Class #this, core::int index) → core::int
+  return 0;
+static method Extension|[]=(lowered final self::Class #this, core::int index, core::int value) → void {}
+static method Extension|call(lowered final self::Class #this) → core::int
+  return 0;
+static method Extension|get#call(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension|call(#this);
+static method Extension|get#extensionProperty(lowered final self::Class #this) → core::int
+  return 0;
+static method Extension|set#extensionProperty(lowered final self::Class #this, core::int value) → void {}
+static method Extension|extensionMethod(lowered final self::Class #this) → core::int
+  return 0;
+static method Extension|get#extensionMethod(lowered final self::Class #this) → () → core::int
+  return () → core::int => self::Extension|extensionMethod(#this);
+static method Extension|get#extensionFunctionGetter(lowered final self::Class #this) → core::Function
+  return () → Null {};
+static method Extension|get#extensionFunctionTypeGetter(lowered final self::Class #this) → () → void
+  return () → void {};
+static get nullableFunction() → core::Function?
+  return () → Null {};
+static get nullableFunctionType() → () →? void
+  return () → void {};
+static get nullableInt() → core::int?
+  return 0;
+static get nullableMap() → core::Map<dynamic, dynamic>?
+  return <dynamic, dynamic>{};
+static get nullableClass() → self::Class?
+  return new self::Class::•();
+static method test() → dynamic {
+  core::num localBinary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  var localBinary = nullableInt + 0;
+                                ^" in self::nullableInt.{core::num::+}(0){(core::num) → core::num};
+  core::int localUnary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:77:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  var localUnary = -nullableInt;
+                   ^" in self::nullableInt.{core::int::unary-}(){() → core::int};
+  dynamic localIndexGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:78:34: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGet = nullableMap[0];
+                                 ^" in self::nullableMap.{core::Map::[]}{<nullable>}.(0){(core::Object?) → dynamic};
+  core::int localIndexSet = let final core::Map<dynamic, dynamic>? #t23 = self::nullableMap in let final core::int #t24 = 0 in let final core::int #t25 = 1 in let final void #t26 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:79:34: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexSet = nullableMap[0] = 1;
+                                 ^" in #t23.{core::Map::[]=}{<nullable>}.(#t24, #t25){(dynamic, dynamic) → void} in #t25;
+  dynamic localIndexGetSet = let final core::Map<dynamic, dynamic>? #t27 = self::nullableMap in let final core::int #t28 = 0 in let final dynamic #t29 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:80:37: Error: Operator '[]' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^" in #t27.{core::Map::[]}{<nullable>}.(#t28){(core::Object?) → dynamic}{dynamic}.+(1) in let final void #t30 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:80:37: Error: Operator '[]=' cannot be called on 'Map<dynamic, dynamic>?' because it is potentially null.
+ - 'Map' is from 'dart:core'.
+  var localIndexGetSet = nullableMap[0] += 1;
+                                    ^" in #t27.{core::Map::[]=}{<nullable>}.(#t28, #t29){(dynamic, dynamic) → void} in #t29;
+  core::int localPropertyGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:81:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGet = nullableClass.property;
+                                       ^^^^^^^^" in self::nullableClass.{self::Class::property}{<nullable>}.{core::int};
+  core::int localPropertySet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:82:40: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertySet = nullableClass.property = 1;
+                                       ^^^^^^^^" in self::nullableClass.{self::Class::property}{<nullable>}. = 1;
+  core::int localPropertyGetSet = let final self::Class? #t31 = self::nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:83:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGetSet = nullableClass.property += 1;
+                                          ^^^^^^^^" in #t31.{self::Class::property}{<nullable>}. = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:83:43: Error: Property 'property' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localPropertyGetSet = nullableClass.property += 1;
+                                          ^^^^^^^^" in #t31.{self::Class::property}{<nullable>}.{core::int}.{core::num::+}(1){(core::num) → core::int};
+  core::int localMethodInvocation = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:84:45: Error: Method 'method' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+  var localMethodInvocation = nullableClass.method();
+                                            ^^^^^^" in self::nullableClass.{self::Class::method}{<nullable>}.(){() → core::int};
+  () → core::int localMethodTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:85:42: Error: Property 'method' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localMethodTearOff = nullableClass.method;
+                                         ^^^^^^" in self::nullableClass.{self::Class::method}{<nullable>}.{() → core::int};
+  dynamic localFunctionImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:86:51: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+  var localFunctionImplicitCall = nullableFunction();
+                                                  ^" in self::nullableFunction{<nullable>}.();
+  dynamic localFunctionExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:87:52: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+  var localFunctionExplicitCall = nullableFunction.call();
+                                                   ^^^^" in self::nullableFunction{<nullable>}.();
+  core::Function? localFunctionTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:88:47: Error: Property 'call' cannot be accessed on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try accessing using ?. instead.
+  var localFunctionTearOff = nullableFunction.call;
+                                              ^^^^" in self::nullableFunction.call;
+  void localFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:89:59: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  var localFunctionTypeImplicitCall = nullableFunctionType();
+                                                          ^" in self::nullableFunctionType{<nullable>}.(){() →? void};
+  void localFunctionTypeExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:90:60: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
+  var localFunctionTypeExplicitCall = nullableFunctionType.call();
+                                                           ^^^^" in self::nullableFunctionType{<nullable>}.(){() →? void};
+  () →? void localFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:91:55: Error: Property 'call' cannot be accessed on 'void Function()?' because it is potentially null.
+Try accessing using ?. instead.
+  var localFunctionTypeTearOff = nullableFunctionType.call;
+                                                      ^^^^" in self::nullableFunctionType.call;
+  dynamic localFunctionField = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:92:42: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+  var localFunctionField = nullableClass.functionField();
+                                         ^" in self::nullableClass.{self::Class::functionField}{<nullable>}.{core::Function}();
+  void localFunctionTypeField = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:93:46: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+  var localFunctionTypeField = nullableClass.functionTypeField();
+                                             ^" in self::nullableClass.{self::Class::functionTypeField}{<nullable>}.{() → void}(){() → void};
+  dynamic localFunctionGetter = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:94:43: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+  var localFunctionGetter = nullableClass.functionGetter();
+                                          ^" in self::nullableClass.{self::Class::functionGetter}{<nullable>}.{core::Function}();
+  void localFunctionTypeGetter = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:95:47: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+  var localFunctionTypeGetter = nullableClass.functionTypeGetter();
+                                              ^" in self::nullableClass.{self::Class::functionTypeGetter}{<nullable>}.{() → void}(){() → void};
+  core::int localExtensionBinary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:97:44: Error: Operator '+' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+  var localExtensionBinary = nullableClass + 0;
+                                           ^" in self::Extension|+(self::nullableClass, 0);
+  core::int localExtensionUnary = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:98:29: Error: Operator 'unary-' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+  var localExtensionUnary = -nullableClass;
+                            ^" in self::Extension|unary-(self::nullableClass);
+  core::int localExtensionIndexGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:99:45: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+  var localExtensionIndexGet = nullableClass[0];
+                                            ^" in self::Extension|[](self::nullableClass, 0);
+  core::int localExtensionIndexSet = let final self::Class? #t32 = self::nullableClass in let final core::int #t33 = 0 in let final core::int #t34 = 1 in let final void #t35 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:100:45: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+  var localExtensionIndexSet = nullableClass[0] = 1;
+                                            ^" in self::Extension|[]=(#t32, #t33, #t34) in #t34;
+  core::int localExtensionIndexGetSet = let final self::Class? #t36 = self::nullableClass in let final core::int #t37 = 0 in let final core::int #t38 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:101:48: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+  var localExtensionIndexGetSet = nullableClass[0] += 1;
+                                               ^" in self::Extension|[](#t36, #t37).{core::num::+}(1){(core::num) → core::int} in let final void #t39 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:101:48: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+  var localExtensionIndexGetSet = nullableClass[0] += 1;
+                                               ^" in self::Extension|[]=(#t36, #t37, #t38) in #t38;
+  core::int localExtensionPropertyGet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:102:49: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localExtensionPropertyGet = nullableClass.extensionProperty;
+                                                ^^^^^^^^^^^^^^^^^" in self::Extension|get#extensionProperty(self::nullableClass);
+  core::int localExtensionPropertySet = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:103:49: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localExtensionPropertySet = nullableClass.extensionProperty = 1;
+                                                ^^^^^^^^^^^^^^^^^" in let final core::int #t40 = 1 in let final void #t41 = self::Extension|set#extensionProperty(self::nullableClass, #t40) in #t40;
+  core::int localExtensionPropertyGetSet = let final self::Class? #t42 = self::nullableClass in invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:104:52: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localExtensionPropertyGetSet = nullableClass.extensionProperty += 1;
+                                                   ^^^^^^^^^^^^^^^^^" in let final core::int #t43 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:104:52: Error: Property 'extensionProperty' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localExtensionPropertyGetSet = nullableClass.extensionProperty += 1;
+                                                   ^^^^^^^^^^^^^^^^^" in self::Extension|get#extensionProperty(#t42).{core::num::+}(1){(core::num) → core::int} in let final void #t44 = self::Extension|set#extensionProperty(#t42, #t43) in #t43;
+  core::int localExtensionMethodInvocation = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:105:54: Error: Method 'extensionMethod' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+  var localExtensionMethodInvocation = nullableClass.extensionMethod();
+                                                     ^^^^^^^^^^^^^^^" in self::Extension|extensionMethod(self::nullableClass);
+  () → core::int localExtensionMethodTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:106:51: Error: Property 'extensionMethod' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localExtensionMethodTearOff = nullableClass.extensionMethod;
+                                                  ^^^^^^^^^^^^^^^" in self::Extension|get#extensionMethod(self::nullableClass);
+  core::int localExtensionFunctionTypeImplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:107:61: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+  var localExtensionFunctionTypeImplicitCall = nullableClass();
+                                                            ^" in self::Extension|call(self::nullableClass);
+  core::int localExtensionFunctionTypeExplicitCall = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:108:62: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?. instead.
+  var localExtensionFunctionTypeExplicitCall = nullableClass.call();
+                                                             ^^^^" in self::Extension|call(self::nullableClass);
+  () → core::int localExtensionFunctionTypeTearOff = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:109:57: Error: Property 'call' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try accessing using ?. instead.
+  var localExtensionFunctionTypeTearOff = nullableClass.call;
+                                                        ^^^^" in self::Extension|get#call(self::nullableClass);
+  dynamic localExtensionFunctionGetter = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:110:52: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+  var localExtensionFunctionGetter = nullableClass.extensionFunctionGetter();
+                                                   ^" in self::Extension|get#extensionFunctionGetter(self::nullableClass)();
+  void localExtensionFunctionTypeGetter = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:112:21: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/potentially_nullable_access.dart'.
+Try calling using ?.call instead.
+      nullableClass.extensionFunctionTypeGetter();
+                    ^" in self::Extension|get#extensionFunctionTypeGetter(self::nullableClass)(){() → void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/pure_index_expressions.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/pure_index_expressions.dart.weak.modular.expect
new file mode 100644
index 0000000..42b09ab8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/pure_index_expressions.dart.weak.modular.expect
@@ -0,0 +1,334 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:25:8: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     map[this] ??= this;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:26:8: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     map[self] ??= self;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:42:12: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = map[this] ??= this;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:43:12: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = map[self] ??= self;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:58:6: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     i[this] ??= this;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:59:6: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     i[self] ??= self;
+//      ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:75:10: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = i[this] ??= this;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:76:10: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = i[self] ??= self;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:91:17: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     Extension(i)[this] ??= this;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:92:17: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     Extension(i)[self] ??= self;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:108:21: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = Extension(i)[this] ??= this;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:109:21: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = Extension(i)[self] ??= self;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:126:10: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     super[this] ??= this;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:127:10: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     super[self] ??= self;
+//          ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:143:14: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = super[this] ??= this;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:144:14: Warning: Operand of null-aware operation '??=' has type 'Class' which excludes null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = super[self] ??= self;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:168:9: Warning: Operand of null-aware operation '??=' has type 'Class2' which excludes null.
+//  - 'Class2' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     this[this] ??= this;
+//         ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:169:9: Warning: Operand of null-aware operation '??=' has type 'Class2' which excludes null.
+//  - 'Class2' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     self[self] ??= self;
+//         ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:185:13: Warning: Operand of null-aware operation '??=' has type 'Class2' which excludes null.
+//  - 'Class2' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = this[this] ??= this;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:186:13: Warning: Operand of null-aware operation '??=' has type 'Class2' which excludes null.
+//  - 'Class2' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = self[self] ??= self;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:201:21: Warning: Operand of null-aware operation '??=' has type 'Class2' which excludes null.
+//  - 'Class2' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     Extension2(this)[this] ??= this;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:202:21: Warning: Operand of null-aware operation '??=' has type 'Class2' which excludes null.
+//  - 'Class2' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     Extension2(self)[self] ??= self;
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:218:25: Warning: Operand of null-aware operation '??=' has type 'Class2' which excludes null.
+//  - 'Class2' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = Extension2(this)[this] ??= this;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd/pure_index_expressions.dart:219:25: Warning: Operand of null-aware operation '??=' has type 'Class2' which excludes null.
+//  - 'Class2' is from 'pkg/front_end/testcases/nnbd/pure_index_expressions.dart'.
+//     v = Extension2(self)[self] ??= self;
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Map<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Map<self::Map::K%, self::Map::V%>
+    : super core::Object::•()
+    ;
+  abstract operator [](covariant-by-class self::Map::K% index) → self::Map::V%;
+  abstract operator []=(covariant-by-class self::Map::K% index, covariant-by-class self::Map::V% value) → void;
+}
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  operator [](self::Class cls) → self::Class
+    return new self::Class::•();
+  operator []=(self::Class cls, self::Class value) → void {}
+  operator +(self::Class cls) → self::Class
+    return cls;
+  method indexGetSetForEffect(self::Map<self::Class, self::Class> map) → void {
+    late final self::Class self;
+    if(self::b)
+      self = this;
+    let final self::Map<self::Class, self::Class> #t1 = map in #t1.{self::Map::[]}(this){(self::Class) → self::Class} == null ?{self::Class} #t1.{self::Map::[]=}(this, this){(self::Class, self::Class) → void} : null;
+    let final self::Map<self::Class, self::Class> #t2 = map in let final self::Class #t3 = self in #t2.{self::Map::[]}(#t3){(self::Class) → self::Class} == null ?{self::Class} #t2.{self::Map::[]=}(#t3, self){(self::Class, self::Class) → void} : null;
+    map.{self::Map::[]=}(this, this){(self::Class, self::Class) → void};
+    map.{self::Map::[]=}(self, self){(self::Class, self::Class) → void};
+    map.{self::Map::[]}(this){(self::Class) → self::Class};
+    map.{self::Map::[]}(self){(self::Class) → self::Class};
+    let final self::Map<self::Class, self::Class> #t4 = map in #t4.{self::Map::[]=}(this, #t4.{self::Map::[]}(this){(self::Class) → self::Class}.{self::Class::+}(this){(self::Class) → self::Class}){(self::Class, self::Class) → void};
+    let final self::Map<self::Class, self::Class> #t5 = map in let final self::Class #t6 = self in #t5.{self::Map::[]=}(#t6, #t5.{self::Map::[]}(#t6){(self::Class) → self::Class}.{self::Class::+}(self){(self::Class) → self::Class}){(self::Class, self::Class) → void};
+  }
+  method indexGetSetForValue(self::Map<self::Class, self::Class> map) → void {
+    late final self::Class self;
+    if(self::b)
+      self = this;
+    dynamic v;
+    v = let final self::Map<self::Class, self::Class> #t7 = map in let final self::Class #t8 = #t7.{self::Map::[]}(this){(self::Class) → self::Class} in #t8 == null ?{self::Class} let final void #t9 = #t7.{self::Map::[]=}(this, this){(self::Class, self::Class) → void} in this : #t8;
+    v = let final self::Map<self::Class, self::Class> #t10 = map in let final self::Class #t11 = self in let final self::Class #t12 = #t10.{self::Map::[]}(#t11){(self::Class) → self::Class} in #t12 == null ?{self::Class} let final self::Class #t13 = self in let final void #t14 = #t10.{self::Map::[]=}(#t11, #t13){(self::Class, self::Class) → void} in #t13 : #t12;
+    v = let final self::Map<self::Class, self::Class> #t15 = map in let final void #t16 = #t15.{self::Map::[]=}(this, this){(self::Class, self::Class) → void} in this;
+    v = let final self::Map<self::Class, self::Class> #t17 = map in let final self::Class #t18 = self in let final self::Class #t19 = self in let final void #t20 = #t17.{self::Map::[]=}(#t18, #t19){(self::Class, self::Class) → void} in #t19;
+    v = map.{self::Map::[]}(this){(self::Class) → self::Class};
+    v = map.{self::Map::[]}(self){(self::Class) → self::Class};
+    v = let final self::Map<self::Class, self::Class> #t21 = map in let final self::Class #t22 = #t21.{self::Map::[]}(this){(self::Class) → self::Class}.{self::Class::+}(this){(self::Class) → self::Class} in let final void #t23 = #t21.{self::Map::[]=}(this, #t22){(self::Class, self::Class) → void} in #t22;
+    v = let final self::Map<self::Class, self::Class> #t24 = map in let final self::Class #t25 = self in let final self::Class #t26 = #t24.{self::Map::[]}(#t25){(self::Class) → self::Class}.{self::Class::+}(self){(self::Class) → self::Class} in let final void #t27 = #t24.{self::Map::[]=}(#t25, #t26){(self::Class, self::Class) → void} in #t26;
+  }
+  method implicitExtensionGetSetForEffect(core::int i) → void {
+    late final self::Class self;
+    if(self::b)
+      self = this;
+    let final core::int #t28 = i in self::Extension|[](#t28, this) == null ?{self::Class} self::Extension|[]=(#t28, this, this) : null;
+    let final core::int #t29 = i in let final self::Class #t30 = self in self::Extension|[](#t29, #t30) == null ?{self::Class} self::Extension|[]=(#t29, #t30, self) : null;
+    self::Extension|[]=(i, this, this);
+    self::Extension|[]=(i, self, self);
+    self::Extension|[](i, this);
+    self::Extension|[](i, self);
+    let final core::int #t31 = i in self::Extension|[]=(#t31, this, self::Extension|[](#t31, this).{self::Class::+}(this){(self::Class) → self::Class});
+    let final core::int #t32 = i in let final self::Class #t33 = self in self::Extension|[]=(#t32, #t33, self::Extension|[](#t32, #t33).{self::Class::+}(self){(self::Class) → self::Class});
+  }
+  method implicitExtensionGetSetForValue(core::int i) → void {
+    late final self::Class self;
+    if(self::b)
+      self = this;
+    dynamic v;
+    v = let final core::int #t34 = i in let final self::Class #t35 = self::Extension|[](#t34, this) in #t35 == null ?{self::Class} let final void #t36 = self::Extension|[]=(#t34, this, this) in this : #t35;
+    v = let final core::int #t37 = i in let final self::Class #t38 = self in let final self::Class #t39 = self::Extension|[](#t37, #t38) in #t39 == null ?{self::Class} let final self::Class #t40 = self in let final void #t41 = self::Extension|[]=(#t37, #t38, #t40) in #t40 : #t39;
+    v = let final core::int #t42 = i in let final void #t43 = self::Extension|[]=(#t42, this, this) in this;
+    v = let final core::int #t44 = i in let final self::Class #t45 = self in let final self::Class #t46 = self in let final void #t47 = self::Extension|[]=(#t44, #t45, #t46) in #t46;
+    v = self::Extension|[](i, this);
+    v = self::Extension|[](i, self);
+    v = let final core::int #t48 = i in let final self::Class #t49 = self::Extension|[](#t48, this).{self::Class::+}(this){(self::Class) → self::Class} in let final void #t50 = self::Extension|[]=(#t48, this, #t49) in #t49;
+    v = let final core::int #t51 = i in let final self::Class #t52 = self in let final self::Class #t53 = self::Extension|[](#t51, #t52).{self::Class::+}(self){(self::Class) → self::Class} in let final void #t54 = self::Extension|[]=(#t51, #t52, #t53) in #t53;
+  }
+  method explicitExtensionGetSetForEffect(core::int i) → void {
+    late final self::Class self;
+    if(self::b)
+      self = this;
+    let final core::int #t55 = i in self::Extension|[](#t55, this) == null ?{self::Class} self::Extension|[]=(#t55, this, this) : null;
+    let final core::int #t56 = i in let final self::Class #t57 = self in self::Extension|[](#t56, #t57) == null ?{self::Class} self::Extension|[]=(#t56, #t57, self) : null;
+    self::Extension|[]=(i, this, this);
+    self::Extension|[]=(i, self, self);
+    self::Extension|[](i, this);
+    self::Extension|[](i, self);
+    let final core::int #t58 = i in self::Extension|[]=(#t58, this, self::Extension|[](#t58, this).{self::Class::+}(this){(self::Class) → self::Class});
+    let final core::int #t59 = i in let final self::Class #t60 = self in self::Extension|[]=(#t59, #t60, self::Extension|[](#t59, #t60).{self::Class::+}(self){(self::Class) → self::Class});
+  }
+  method explicitExtensionGetSetForValue(core::int i) → void {
+    late final self::Class self;
+    if(self::b)
+      self = this;
+    dynamic v;
+    v = let final core::int #t61 = i in let final self::Class #t62 = self::Extension|[](#t61, this) in #t62 == null ?{self::Class} let final void #t63 = self::Extension|[]=(#t61, this, this) in this : #t62;
+    v = let final core::int #t64 = i in let final self::Class #t65 = self in let final self::Class #t66 = self::Extension|[](#t64, #t65) in #t66 == null ?{self::Class} let final self::Class #t67 = self in let final void #t68 = self::Extension|[]=(#t64, #t65, #t67) in #t67 : #t66;
+    v = let final core::int #t69 = i in let final void #t70 = self::Extension|[]=(#t69, this, this) in this;
+    v = let final core::int #t71 = i in let final self::Class #t72 = self in let final void #t73 = self::Extension|[]=(#t71, self, #t72) in #t72;
+    v = self::Extension|[](i, this);
+    v = self::Extension|[](i, self);
+    v = let final core::int #t74 = i in let final self::Class #t75 = self::Extension|[](#t74, this).{self::Class::+}(this){(self::Class) → self::Class} in let final void #t76 = self::Extension|[]=(#t74, this, #t75) in #t75;
+    v = let final core::int #t77 = i in let final self::Class #t78 = self in let final self::Class #t79 = self::Extension|[](#t77, #t78).{self::Class::+}(self){(self::Class) → self::Class} in let final void #t80 = self::Extension|[]=(#t77, #t78, #t79) in #t79;
+  }
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method superIndexGetSetForEffect() → void {
+    late final self::Class self;
+    if(self::b)
+      self = this;
+    super.{self::Class::[]}(this) == null ?{self::Class} super.{self::Class::[]=}(this, this) : null;
+    let final self::Class #t81 = self in super.{self::Class::[]}(#t81) == null ?{self::Class} super.{self::Class::[]=}(#t81, self) : null;
+    super.{self::Class::[]=}(this, this);
+    super.{self::Class::[]=}(self, self);
+    super.{self::Class::[]}(this);
+    super.{self::Class::[]}(self);
+    super.{self::Class::[]=}(this, super.{self::Class::[]}(this).{self::Class::+}(this){(self::Class) → self::Class});
+    let final self::Class #t82 = self in super.{self::Class::[]=}(#t82, super.{self::Class::[]}(#t82).{self::Class::+}(self){(self::Class) → self::Class});
+  }
+  method superIndexGetSetForValue() → void {
+    late final self::Class self;
+    if(self::b)
+      self = this;
+    dynamic v;
+    v = let final self::Class #t83 = super.{self::Class::[]}(this) in #t83 == null ?{self::Class} let final void #t84 = super.{self::Class::[]=}(this, this) in this : #t83;
+    v = let final self::Class #t85 = self in let final self::Class #t86 = super.{self::Class::[]}(#t85) in #t86 == null ?{self::Class} let final self::Class #t87 = self in let final void #t88 = super.{self::Class::[]=}(#t85, #t87) in #t87 : #t86;
+    v = let final void #t89 = super.{self::Class::[]=}(this, this) in this;
+    v = let final self::Class #t90 = self in let final self::Class #t91 = self in let final void #t92 = super.{self::Class::[]=}(#t90, #t91) in #t91;
+    v = super.{self::Class::[]}(this);
+    v = super.{self::Class::[]}(self);
+    v = let final self::Class #t93 = super.{self::Class::[]}(this).{self::Class::+}(this){(self::Class) → self::Class} in let final void #t94 = super.{self::Class::[]=}(this, #t93) in #t93;
+    v = let final self::Class #t95 = self in let final self::Class #t96 = super.{self::Class::[]}(#t95).{self::Class::+}(self){(self::Class) → self::Class} in let final void #t97 = super.{self::Class::[]=}(#t95, #t96) in #t96;
+  }
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2
+    : super core::Object::•()
+    ;
+  operator +(self::Class2 cls) → self::Class2
+    return cls;
+  method implicitExtensionGetSetForEffect() → void {
+    late final self::Class2 self;
+    if(self::b)
+      self = this;
+    self::Extension2|[](this, this) == null ?{self::Class2} self::Extension2|[]=(this, this, this) : null;
+    let final self::Class2 #t98 = self in let final self::Class2 #t99 = self in self::Extension2|[](#t98, #t99) == null ?{self::Class2} self::Extension2|[]=(#t98, #t99, self) : null;
+    self::Extension2|[]=(this, this, this);
+    self::Extension2|[]=(self, self, self);
+    self::Extension2|[](this, this);
+    self::Extension2|[](self, self);
+    self::Extension2|[]=(this, this, self::Extension2|[](this, this).{self::Class2::+}(this){(self::Class2) → self::Class2});
+    let final self::Class2 #t100 = self in let final self::Class2 #t101 = self in self::Extension2|[]=(#t100, #t101, self::Extension2|[](#t100, #t101).{self::Class2::+}(self){(self::Class2) → self::Class2});
+  }
+  method implicitExtensionGetSetForValue() → void {
+    late final self::Class2 self;
+    if(self::b)
+      self = this;
+    dynamic v;
+    v = let final self::Class2 #t102 = self::Extension2|[](this, this) in #t102 == null ?{self::Class2} let final void #t103 = self::Extension2|[]=(this, this, this) in this : #t102;
+    v = let final self::Class2 #t104 = self in let final self::Class2 #t105 = self in let final self::Class2 #t106 = self::Extension2|[](#t104, #t105) in #t106 == null ?{self::Class2} let final self::Class2 #t107 = self in let final void #t108 = self::Extension2|[]=(#t104, #t105, #t107) in #t107 : #t106;
+    v = let final void #t109 = self::Extension2|[]=(this, this, this) in this;
+    v = let final self::Class2 #t110 = self in let final self::Class2 #t111 = self in let final self::Class2 #t112 = self in let final void #t113 = self::Extension2|[]=(#t110, #t111, #t112) in #t112;
+    v = self::Extension2|[](this, this);
+    v = self::Extension2|[](self, self);
+    v = let final self::Class2 #t114 = self::Extension2|[](this, this).{self::Class2::+}(this){(self::Class2) → self::Class2} in let final void #t115 = self::Extension2|[]=(this, this, #t114) in #t114;
+    v = let final self::Class2 #t116 = self in let final self::Class2 #t117 = self in let final self::Class2 #t118 = self::Extension2|[](#t116, #t117).{self::Class2::+}(self){(self::Class2) → self::Class2} in let final void #t119 = self::Extension2|[]=(#t116, #t117, #t118) in #t118;
+  }
+  method explicitExtensionGetSetForEffect() → void {
+    late final self::Class2 self;
+    if(self::b)
+      self = this;
+    self::Extension2|[](this, this) == null ?{self::Class2} self::Extension2|[]=(this, this, this) : null;
+    let final self::Class2 #t120 = self in let final self::Class2 #t121 = self in self::Extension2|[](#t120, #t121) == null ?{self::Class2} self::Extension2|[]=(#t120, #t121, self) : null;
+    self::Extension2|[]=(this, this, this);
+    self::Extension2|[]=(self, self, self);
+    self::Extension2|[](this, this);
+    self::Extension2|[](self, self);
+    self::Extension2|[]=(this, this, self::Extension2|[](this, this).{self::Class2::+}(this){(self::Class2) → self::Class2});
+    let final self::Class2 #t122 = self in let final self::Class2 #t123 = self in self::Extension2|[]=(#t122, #t123, self::Extension2|[](#t122, #t123).{self::Class2::+}(self){(self::Class2) → self::Class2});
+  }
+  method explicitExtensionGetSetForValue() → void {
+    late final self::Class2 self;
+    if(self::b)
+      self = this;
+    dynamic v;
+    v = let final self::Class2 #t124 = self::Extension2|[](this, this) in #t124 == null ?{self::Class2} let final void #t125 = self::Extension2|[]=(this, this, this) in this : #t124;
+    v = let final self::Class2 #t126 = self in let final self::Class2 #t127 = self in let final self::Class2 #t128 = self::Extension2|[](#t126, #t127) in #t128 == null ?{self::Class2} let final self::Class2 #t129 = self in let final void #t130 = self::Extension2|[]=(#t126, #t127, #t129) in #t129 : #t128;
+    v = let final void #t131 = self::Extension2|[]=(this, this, this) in this;
+    v = let final self::Class2 #t132 = self in let final self::Class2 #t133 = self in let final void #t134 = self::Extension2|[]=(#t132, self, #t133) in #t133;
+    v = self::Extension2|[](this, this);
+    v = self::Extension2|[](self, self);
+    v = let final self::Class2 #t135 = self::Extension2|[](this, this).{self::Class2::+}(this){(self::Class2) → self::Class2} in let final void #t136 = self::Extension2|[]=(this, this, #t135) in #t135;
+    v = let final self::Class2 #t137 = self in let final self::Class2 #t138 = self in let final self::Class2 #t139 = self::Extension2|[](#t137, #t138).{self::Class2::+}(self){(self::Class2) → self::Class2} in let final void #t140 = self::Extension2|[]=(#t137, #t138, #t139) in #t139;
+  }
+}
+extension Extension on core::int {
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+}
+extension Extension2 on self::Class2 {
+  operator [] = self::Extension2|[];
+  operator []= = self::Extension2|[]=;
+}
+static field core::bool b = true;
+static method Extension|[](lowered final core::int #this, self::Class cls) → self::Class
+  return new self::Class::•();
+static method Extension|[]=(lowered final core::int #this, self::Class cls, self::Class value) → void {}
+static method Extension2|[](lowered final self::Class2 #this, self::Class2 cls) → self::Class2
+  return new self::Class2::•();
+static method Extension2|[]=(lowered final self::Class2 #this, self::Class2 cls, self::Class2 value) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/redundant_type_casts.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/redundant_type_casts.dart.weak.modular.expect
new file mode 100644
index 0000000..1062bac
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/redundant_type_casts.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::A::T? _current = null;
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  get current() → self::A::T%
+    return this.{self::A::_current}{self::A::T?} as{ForNonNullableByDefault} self::A::T%;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/required.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/required.dart.weak.modular.expect
new file mode 100644
index 0000000..ccce283
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.modular.expect
@@ -0,0 +1,105 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required.dart:29:8: Error: The parameter 'x' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   foo({x}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:51:18: Error: Non-optional parameters can't have a default value.
+// Try removing the default value or making the parameter optional.
+//   Function(int a = 42, [int b]) f2;
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:52:17: Error: Non-optional parameters can't have a default value.
+// Try removing the default value or making the parameter optional.
+//   void g2(int a = 42, [int b]) {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:53:15: Error: Non-optional parameters can't have a default value.
+// Try removing the default value or making the parameter optional.
+//   f2 = (int a = 42, [int b]) {};
+//               ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:48:15: Error: The parameter 'a' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   void g({int a, required int b = 42}) {}
+//               ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:48:31: Error: Named parameter 'b' is required and can't have a default value.
+//   void g({int a, required int b = 42}) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:49:13: Error: The parameter 'a' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   f = ({int a, required int b = 42}) {};
+//             ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:49:29: Error: Named parameter 'b' is required and can't have a default value.
+//   f = ({int a, required int b = 42}) {};
+//                             ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:52:28: Error: The parameter 'b' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   void g2(int a = 42, [int b]) {}
+//                            ^
+//
+// pkg/front_end/testcases/nnbd/required.dart:53:26: Error: The parameter 'b' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   f2 = (int a = 42, [int b]) {};
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Typedef1 = ({a: core::int, required b: core::int}) → dynamic;
+typedef Typedef2 = ({a: core::int, required b: core::int}) → dynamic;
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2, required covariant-by-declaration final core::int d = #C2}) → dynamic {}
+}
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract method foo({core::int x = #C2}) → dynamic;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method foo({core::int x = #C2}) → dynamic {}
+}
+class C extends self::A {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+  method foo({core::int x = #C1}) → dynamic {}
+}
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
+static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
+static method ok() → dynamic {
+  ({a: core::int, required b: core::int}) → dynamic f;
+  function g({core::int a = #C1, required core::int b = #C2}) → void {}
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
+  (core::int, [core::int]) → dynamic f2;
+  function g2(core::int a, [core::int b = #C1]) → void {}
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
+}
+static method error() → dynamic {
+  ({a: core::int, required b: core::int}) → dynamic f;
+  function g({core::int a = #C2, required core::int b = #C1}) → void {}
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
+  (core::int, [core::int]) → dynamic f2;
+  function g2(core::int a = #C1, [core::int b = #C2]) → void {}
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..0f14fea
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Error: Named parameter 'parameter' is required and can't have a default value.
+// foo({required int parameter = 42}) {}
+//                   ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Error: The parameter 'parameter' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// foo2({int parameter}) {}
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Error: The parameter 'parameter' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+// foo3([int parameter]) {}
+//           ^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo({required core::int parameter = #C1}) → dynamic {}
+static method foo2({core::int parameter = #C2}) → dynamic {}
+static method foo3([core::int parameter = #C2]) → dynamic {}
+static method bar({required core::int parameter = #C2}) → dynamic {}
+static method bar2({core::int parameter = #C1}) → dynamic {}
+static method bar3([core::int parameter = #C1]) → dynamic {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/return_async.dart.weak.modular.expect
new file mode 100644
index 0000000..ce2f50d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method throwSync() → asy::Future<void> {
+  throw "";
+}
+static method allYield() → asy::Future<void> async {
+  await 0;
+  await self::allYield2();
+}
+static method allYield2() → asy::Future<void> async {
+  await 0;
+  await self::allYield3();
+}
+static method allYield3() → asy::Future<void> async {
+  await 0;
+  self::throwSync();
+}
+static method customErrorZone() → asy::Future<void> async {
+  final asy::Completer<void> completer = asy::Completer::•<void>();
+  asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> async {
+    await self::allYield();
+    completer.{asy::Completer::complete}(null){([FutureOr<void>?]) → void};
+  }, (core::Object e, core::StackTrace s) → void {
+    completer.{asy::Completer::completeError}(e, s){(core::Object, [core::StackTrace?]) → void};
+  });
+  return completer.{asy::Completer::future}{asy::Future<void>};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/return_late.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/return_late.dart.weak.modular.expect
new file mode 100644
index 0000000..e58813e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_late.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class<E extends core::Object? = dynamic> extends core::Object {
+  final field self::Class::E% field;
+  constructor •(self::Class::E% field) → self::Class<self::Class::E%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  method returnTypeVariable() → self::Class::E% {
+    late self::Class::E% result = this.{self::Class::field}{self::Class::E%};
+    return result;
+  }
+}
+static method returnNonNullable(core::int value) → core::int {
+  late core::int result = value;
+  return result;
+}
+static method returnNullable(core::int? value) → core::int? {
+  late core::int? result = value;
+  return result;
+}
+static method main() → dynamic {
+  self::expect(42, new self::Class::•<core::int>(42).{self::Class::returnTypeVariable}(){() → core::int});
+  self::expect(87, new self::Class::•<core::int?>(87).{self::Class::returnTypeVariable}(){() → core::int?});
+  self::expect(null, new self::Class::•<core::int?>(null).{self::Class::returnTypeVariable}(){() → core::int?});
+  self::expect(42, self::returnNonNullable(42));
+  self::expect(87, self::returnNullable(87));
+  self::expect(null, self::returnNullable(null));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.modular.expect
new file mode 100644
index 0000000..8c3d6c3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.modular.expect
@@ -0,0 +1,244 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
+//   return null; // error
+//          ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
+//     return null; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnMixed(bool b) /*error*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+//      ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String returnImplicit() /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
+//     return null; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
+//       return null; // error
+//              ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String returnMixed(bool b) /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   FutureOr<int> returnAsync3() async {} // error
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+//   Enum caseReturn2(Enum e) /* error */ {
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+import "dart:_internal" as _in;
+
+import "dart:async";
+
+class Enum extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum> values = #C7;
+  static const field self::Enum a = #C3;
+  static const field self::Enum b = #C6;
+  const constructor •(core::int index, core::String name) → self::Enum
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "Enum.${this.{core::_Enum::_name}{core::String}}";
+}
+static method returnImplicit() → core::String {
+  core::print("foo");
+  return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+       ^" in null;
+}
+static method returnExplicit() → core::String {
+  core::print("foo");
+  return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
+  return null; // error
+         ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+}
+static method returnMixed(core::bool b) → core::String {
+  if(b) {
+    core::print("foo");
+    return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
+    return null; // error
+           ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+  }
+  return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnMixed(bool b) /*error*/ {
+       ^" in null;
+}
+static method returnAsync1() → asy::Future<dynamic> async {}
+static method returnAsync2() → FutureOr<dynamic> async {}
+static method returnAsync3() → FutureOr<core::int> async {
+  return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+              ^" in null;
+}
+static method returnAsync4() → FutureOr<core::int?> async {}
+static method returnAsync5() → dynamic async {}
+static method returnAsync6() → asy::Future<core::int?> async {
+  return null;
+}
+static method returnAsync7() → asy::Future<core::int?> async {}
+static method yieldSync() → core::Iterable<dynamic> sync* {}
+static method yieldAsync() → asy::Stream<dynamic> async* {}
+static method caseReturn1(self::Enum e) → self::Enum {
+  switch(e) {
+    #L1:
+    case #C3:
+      {
+        return e;
+      }
+    #L2:
+    case #C6:
+      {
+        return e;
+      }
+    #L3:
+    default:
+      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
+  }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+  switch(e) {
+    #L4:
+    case #C3:
+      {
+        return e;
+      }
+    #L5:
+    default:
+      {}
+  }
+  return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+     ^" in null;
+}
+static method localFunctions() → dynamic {
+  function returnImplicit() → core::String {
+    core::print("foo");
+    return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String returnImplicit() /* error */ {
+  ^" in null;
+  }
+  function returnExplicit() → core::String {
+    core::print("foo");
+    return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
+    return null; // error
+           ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+  }
+  function returnMixed(core::bool b) → core::String {
+    if(b) {
+      core::print("foo");
+      return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: The value 'null' can't be returned from a function with return type 'String' because 'String' is not nullable.
+      return null; // error
+             ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String returnMixed(bool b) /* error */ {
+  ^" in null;
+  }
+  function returnAsync1() → asy::Future<dynamic> async {}
+  function returnAsync2() → FutureOr<dynamic> async {}
+  function returnAsync3() → FutureOr<core::int> async {
+    return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  FutureOr<int> returnAsync3() async {} // error
+  ^" in null;
+  }
+  function returnAsync4() → FutureOr<core::int?> async {}
+  function returnAsync5() → asy::Future<Null> async {}
+  function returnAsync6() → asy::Future<core::int?> async {
+    return null;
+  }
+  function returnAsync7() → asy::Future<core::int?> async {}
+  function yieldSync() → core::Iterable<dynamic> sync* {}
+  function yieldAsync() → asy::Stream<dynamic> async* {}
+  function caseReturn1(self::Enum e) → self::Enum {
+    switch(e) {
+      #L6:
+      case #C3:
+        {
+          return e;
+        }
+      #L7:
+      case #C6:
+        {
+          return e;
+        }
+      #L8:
+      default:
+        throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
+    }
+  }
+  function caseReturn2(self::Enum e) → self::Enum {
+    switch(e) {
+      #L9:
+      case #C3:
+        {
+          return e;
+        }
+      #L10:
+      default:
+        {}
+    }
+    return invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+  Enum caseReturn2(Enum e) /* error */ {
+  ^" in null;
+  }
+  core::bool b = false;
+  core::int? local1 = (() → core::int? {
+    if(b)
+      return 0;
+  })(){() → core::int?};
+  core::int? local2 = (() → core::int? {
+    if(b)
+      return null;
+    if(!b)
+      return 0;
+  })(){() → core::int?};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::Enum {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "b"
+  #C6 = self::Enum {index:#C4, _name:#C5}
+  #C7 = <self::Enum*>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///return_null.dart:
+- Enum. (from org-dartlang-testcase:///return_null.dart:43:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.modular.expect
new file mode 100644
index 0000000..a02071a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/shorting_null_check.dart.weak.modular.expect
@@ -0,0 +1,107 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/shorting_null_check.dart:12:24: Warning: Operand of null-aware operation '!' has type 'int' which excludes null.
+// int? test1(A? a) => a?.zero!;
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/shorting_null_check.dart:14:25: Warning: Operand of null-aware operation '!' has type 'int' which excludes null.
+// bool? test3(A? a) => a?.zero!.isEven;
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int zero;
+  field core::int? zeroOrNull;
+  constructor •(core::int zero, [core::int? zeroOrNull = #C1]) → self::A
+    : self::A::zero = zero, self::A::zeroOrNull = zeroOrNull, super core::Object::•()
+    ;
+}
+class Foo extends core::Object {
+  field self::Bar? bar;
+  constructor •(self::Bar? bar) → self::Foo
+    : self::Foo::bar = bar, super core::Object::•()
+    ;
+  operator [](core::int? index) → self::Bar?
+    return !(index == null) ?{self::Bar?} new self::Bar::•(index{core::int}) : null;
+}
+class Bar extends core::Object {
+  field core::int baz;
+  constructor •(core::int baz) → self::Bar
+    : self::Bar::baz = baz, super core::Object::•()
+    ;
+  operator [](core::int index) → core::int
+    return index;
+  operator ==(core::Object other) → core::bool
+    return other is{ForNonNullableByDefault} self::Bar && this.{self::Bar::baz}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Bar}.{self::Bar::baz}{core::int};
+}
+static method test1(self::A? a) → core::int?
+  return let final self::A? #t1 = a in #t1 == null ?{core::int?} null : #t1{self::A}.{self::A::zero}{core::int}!;
+static method test2(self::A? a) → core::int?
+  return let final self::A? #t2 = a in #t2 == null ?{core::int?} null : #t2{self::A}.{self::A::zeroOrNull}{core::int?}!;
+static method test3(self::A? a) → core::bool?
+  return let final self::A? #t3 = a in #t3 == null ?{core::bool?} null : #t3{self::A}.{self::A::zero}{core::int}!.{core::int::isEven}{core::bool};
+static method test4(self::A? a) → core::bool?
+  return let final self::A? #t4 = a in #t4 == null ?{core::bool?} null : #t4{self::A}.{self::A::zeroOrNull}{core::int?}!.{core::int::isEven}{core::bool};
+static method test5(self::Foo? foo) → self::Bar?
+  return let final self::Foo? #t5 = foo in #t5 == null ?{self::Bar?} null : #t5{self::Foo}.{self::Foo::bar}{self::Bar?}!;
+static method test6(self::Foo? foo) → core::int?
+  return let final self::Foo? #t6 = foo in #t6 == null ?{core::int?} null : #t6{self::Foo}.{self::Foo::bar}{self::Bar?}!.{self::Bar::baz}{core::int};
+static method test7(self::Foo? foo, core::int baz) → core::int?
+  return let final self::Foo? #t7 = foo in #t7 == null ?{core::int?} null : #t7{self::Foo}.{self::Foo::bar}{self::Bar?}!.{self::Bar::[]}(baz){(core::int) → core::int};
+static method test8(self::Foo? foo, core::int? bar) → self::Bar?
+  return let final self::Foo? #t8 = foo in #t8 == null ?{self::Bar?} null : #t8{self::Foo}.{self::Foo::[]}(bar){(core::int?) → self::Bar?}!;
+static method test9(self::Foo? foo, core::int? bar) → core::int?
+  return let final self::Foo? #t9 = foo in #t9 == null ?{core::int?} null : #t9{self::Foo}.{self::Foo::[]}(bar){(core::int?) → self::Bar?}!.{self::Bar::baz}{core::int};
+static method test10(self::Foo? foo, core::int? bar, core::int baz) → dynamic
+  return let final self::Foo? #t10 = foo in #t10 == null ?{core::int?} null : #t10{self::Foo}.{self::Foo::[]}(bar){(core::int?) → self::Bar?}!.{self::Bar::[]}(baz){(core::int) → core::int};
+static method main() → dynamic {
+  self::expect(0, self::test1(new self::A::•(0)));
+  self::expect(null, self::test1(null));
+  self::expect(0, self::test2(new self::A::•(0, 0)));
+  self::expect(null, self::test2(null));
+  self::throws(() → void => self::test2(new self::A::•(0, null)));
+  self::expect(true, self::test3(new self::A::•(0)));
+  self::expect(null, self::test3(null));
+  self::expect(true, self::test4(new self::A::•(0, 0)));
+  self::expect(null, self::test4(null));
+  self::throws(() → void => self::test4(new self::A::•(0, null)));
+  self::expect(new self::Bar::•(0), self::test5(new self::Foo::•(new self::Bar::•(0))));
+  self::expect(null, self::test5(null));
+  self::throws(() → void => self::test5(new self::Foo::•(null)));
+  self::expect(0, self::test6(new self::Foo::•(new self::Bar::•(0))));
+  self::expect(null, self::test6(null));
+  self::throws(() → void => self::test6(new self::Foo::•(null)));
+  self::expect(42, self::test7(new self::Foo::•(new self::Bar::•(0)), 42));
+  self::expect(null, self::test7(null, 42));
+  self::throws(() → void => self::test7(new self::Foo::•(null), 42));
+  self::expect(new self::Bar::•(42), self::test8(new self::Foo::•(new self::Bar::•(0)), 42));
+  self::expect(null, self::test8(null, 42));
+  self::throws(() → void => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
+  self::expect(42, self::test9(new self::Foo::•(new self::Bar::•(0)), 42));
+  self::expect(null, self::test9(null, 42));
+  self::throws(() → void => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
+  self::expect(87, self::test10(new self::Foo::•(new self::Bar::•(0)), 42, 87));
+  self::expect(null, self::test10(null, 42, 87));
+  self::throws(() → void => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → dynamic {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Missing exception";
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.modular.expect
new file mode 100644
index 0000000..0e34446
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.modular.expect
@@ -0,0 +1,113 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   throwsInStrong(() => c?.field + 2); // error
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
+// Try accessing using ?. instead.
+//   throwsInStrong(() => (c?.next).field); // error
+//                                  ^^^^^
+//
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+//   throwsInStrong(() => -c?.field); // error
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+//   throwsInStrong(() => c?.next[0] + 2); // error
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+//   throwsInStrong(() => (c?.next[0]).isEven); // error
+//                                     ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+//   throwsInStrong(() => -c?.next[0]); // error
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+// Try accessing using ?. instead.
+//     s.length; // This will be an invalid expression in strong mode.
+//       ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int field = 0;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  get next() → self::Class
+    return this;
+  operator [](core::int key) → core::int
+    return key;
+  operator []=(core::int key, core::int value) → void {}
+}
+static final field core::bool inStrongMode = self::_inStrongMode();
+static method main() → dynamic {
+  self::test(new self::Class::•());
+}
+static method test(self::Class? c) → dynamic {
+  let final self::Class? #t1 = c in #t1 == null ?{core::int?} null : #t1{self::Class}.{self::Class::next}{self::Class}.{self::Class::field}{core::int};
+  self::throwsInStrong(() → void => invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  throwsInStrong(() => c?.field + 2); // error
+                                ^" in (let final self::Class? #t2 = c in #t2 == null ?{core::int?} null : #t2{self::Class}.{self::Class::field}{core::int}).{core::num::+}(2){(core::num) → core::num});
+  let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : let final core::int #t4 = #t3.{self::Class::field}{core::int}.{core::num::+}(1){(core::num) → core::int} in let final void #t5 = #t3.{self::Class::field} = #t4 in #t4;
+  let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : #t6.{self::Class::field} = #t6.{self::Class::field}{core::int}.{core::num::+}(1){(core::num) → core::int};
+  self::throwsInStrong(() → void => invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Error: Property 'field' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/shorting_stop.dart'.
+Try accessing using ?. instead.
+  throwsInStrong(() => (c?.next).field); // error
+                                 ^^^^^" in (let final self::Class? #t7 = c in #t7 == null ?{self::Class?} null : #t7{self::Class}.{self::Class::next}{self::Class}).{self::Class::field}{<nullable>}.{core::int});
+  self::throwsInStrong(() → void => invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  throwsInStrong(() => -c?.field); // error
+                       ^" in (let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : #t8{self::Class}.{self::Class::field}{core::int}).{core::int::unary-}(){() → core::int});
+  let final self::Class? #t9 = c in #t9 == null ?{core::bool?} null : #t9{self::Class}.{self::Class::next}{self::Class}.{self::Class::[]}(0){(core::int) → core::int}.{core::int::isEven}{core::bool};
+  self::throwsInStrong(() → void => invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  throwsInStrong(() => c?.next[0] + 2); // error
+                                  ^" in (let final self::Class? #t10 = c in #t10 == null ?{core::int?} null : #t10{self::Class}.{self::Class::next}{self::Class}.{self::Class::[]}(0){(core::int) → core::int}).{core::num::+}(2){(core::num) → core::num});
+  let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final self::Class #t12 = #t11{self::Class}.{self::Class::next}{self::Class} in let final core::int #t13 = 0 in let final core::int #t14 = #t12.{self::Class::[]}(#t13){(core::int) → core::int}.{core::num::+}(1){(core::num) → core::int} in let final void #t15 = #t12.{self::Class::[]=}(#t13, #t14){(core::int, core::int) → void} in #t14;
+  let final self::Class? #t16 = c in #t16 == null ?{core::int?} null : let final self::Class #t17 = #t16{self::Class}.{self::Class::next}{self::Class} in let final core::int #t18 = 0 in #t17.{self::Class::[]=}(#t18, #t17.{self::Class::[]}(#t18){(core::int) → core::int}.{core::num::+}(1){(core::num) → core::int}){(core::int, core::int) → void};
+  self::throwsInStrong(() → void => invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Error: Property 'isEven' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+  throwsInStrong(() => (c?.next[0]).isEven); // error
+                                    ^^^^^^" in (let final self::Class? #t19 = c in #t19 == null ?{core::int?} null : #t19{self::Class}.{self::Class::next}{self::Class}.{self::Class::[]}(0){(core::int) → core::int}).{core::int::isEven}{<nullable>}.{core::bool});
+  self::throwsInStrong(() → void => invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  throwsInStrong(() => -c?.next[0]); // error
+                       ^" in (let final self::Class? #t20 = c in #t20 == null ?{core::int?} null : #t20{self::Class}.{self::Class::next}{self::Class}.{self::Class::[]}(0){(core::int) → core::int}).{core::int::unary-}(){() → core::int});
+}
+static method _inStrongMode() → core::bool {
+  (core::String?) → Null f = (core::String? s) → Null {
+    invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+Try accessing using ?. instead.
+    s.length; // This will be an invalid expression in strong mode.
+      ^^^^^^" in s.{core::String::length}{<nullable>}.{core::int};
+  };
+  try {
+    f("foo"){(core::String?) → Null};
+  }
+  on core::Object catch(final core::Object e) {
+    return true;
+  }
+  return false;
+}
+static method throwsInStrong(() → void f) → void {
+  if(self::inStrongMode) {
+    try {
+      f(){() → void};
+    }
+    on core::Object catch(final core::Object e) {
+      core::print(e);
+      return;
+    }
+    throw "Expected exception.";
+  }
+  else {
+    f(){() → void};
+  }
+}
diff --git a/pkg/front_end/testcases/nnbd/simple_never.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/simple_never.dart.weak.modular.expect
new file mode 100644
index 0000000..7047a3b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/simple_never.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method foo() → Never {
+  while (true) {
+  }
+}
+static method bar() → Never?
+  return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.modular.expect
new file mode 100644
index 0000000..14bef22c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.modular.expect
@@ -0,0 +1,142 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  core::List<core::int>? list = null;
+  core::print( block {
+    final core::List<core::int> #t1 = <core::int>[1, 2];
+    final core::Iterable<core::int>? #t2 = list;
+    if(!(#t2 == null))
+      #t1.{core::List::addAll}{Invariant}(#t2{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t1.{core::List::add}{Invariant}(3){(core::int) → void};
+  } =>#t1);
+  core::print( block {
+    final core::List<core::int> #t3 = <core::int>[1, 2];
+    final core::Iterable<core::int>? #t4 = null;
+    if(!(#t4 == null))
+      #t3.{core::List::addAll}{Invariant}(#t4{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t3.{core::List::add}{Invariant}(3){(core::int) → void};
+  } =>#t3);
+  core::List<core::int> list1 = block {
+    final core::List<core::int> #t5 = <core::int>[];
+    final core::Iterable<core::int>? #t6 = list;
+    if(!(#t6 == null))
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+  } =>#t5;
+  core::List<Never> list2 = block {
+    final core::List<Never> #t7 = <Never>[];
+    final core::Iterable<Never>? #t8 = null;
+    if(!(#t8 == null))
+      #t7.{core::List::addAll}{Invariant}(#t8{core::Iterable<Never>}){(core::Iterable<Never>) → void};
+  } =>#t7;
+  core::List<core::int> list3 = block {
+    final core::List<core::int> #t9 = <core::int>[1, 2];
+    final core::Iterable<core::int>? #t10 = list;
+    if(!(#t10 == null))
+      #t9.{core::List::addAll}{Invariant}(#t10{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t9.{core::List::add}{Invariant}(3){(core::int) → void};
+  } =>#t9;
+  core::List<core::int> list4 = block {
+    final core::List<core::int> #t11 = <core::int>[1, 2];
+    final core::Iterable<core::int>? #t12 = null;
+    if(!(#t12 == null))
+      #t11.{core::List::addAll}{Invariant}(#t12{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t11.{core::List::add}{Invariant}(3){(core::int) → void};
+  } =>#t11;
+  core::Set<core::int>? set = null;
+  core::print( block {
+    final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
+    #t13.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t13.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
+    final core::Iterable<core::int>? #t14 = set;
+    if(!(#t14 == null))
+      #t13.{core::Set::addAll}{Invariant}(#t14{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t13.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
+  } =>#t13);
+  core::print( block {
+    final core::Set<core::int> #t15 = col::LinkedHashSet::•<core::int>();
+    #t15.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t15.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
+    final core::Iterable<core::int>? #t16 = null;
+    if(!(#t16 == null))
+      #t15.{core::Set::addAll}{Invariant}(#t16{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t15.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
+  } =>#t15);
+  core::Set<core::int> set1 = block {
+    final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t18 = set;
+    if(!(#t18 == null))
+      for (final dynamic #t19 in #t18{core::Iterable<dynamic>}) {
+        final core::int #t20 = #t19 as{TypeError,ForNonNullableByDefault} core::int;
+        #t17.{core::Set::add}{Invariant}(#t20){(core::int) → core::bool};
+      }
+  } =>#t17;
+  core::Set<core::int> set3 = block {
+    final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>();
+    #t21.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t21.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
+    final core::Iterable<core::int>? #t22 = set;
+    if(!(#t22 == null))
+      #t21.{core::Set::addAll}{Invariant}(#t22{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t21.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
+  } =>#t21;
+  core::Set<core::int> set4 = block {
+    final core::Set<core::int> #t23 = col::LinkedHashSet::•<core::int>();
+    #t23.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
+    final core::Iterable<core::int>? #t24 = null;
+    if(!(#t24 == null))
+      #t23.{core::Set::addAll}{Invariant}(#t24{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    #t23.{core::Set::add}{Invariant}(3){(core::int) → core::bool};
+  } =>#t23;
+  core::Map<core::int, core::int>? map = null;
+  core::print( block {
+    final core::Map<core::int, core::int> #t25 = <core::int, core::int>{};
+    #t25.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
+    final core::Map<core::int, core::int>? #t26 = map;
+    if(!(#t26 == null))
+      for (final core::MapEntry<core::int, core::int> #t27 in #t26{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+        #t25.{core::Map::[]=}{Invariant}(#t27.{core::MapEntry::key}{core::int}, #t27.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t25.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
+  } =>#t25);
+  core::print( block {
+    final core::Map<core::int, core::int> #t28 = <core::int, core::int>{};
+    #t28.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
+    final core::Map<core::int, core::int>? #t29 = null;
+    if(!(#t29 == null))
+      for (final core::MapEntry<core::int, core::int> #t30 in #t29{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+        #t28.{core::Map::[]=}{Invariant}(#t30.{core::MapEntry::key}{core::int}, #t30.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t28.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
+  } =>#t28);
+  core::Map<core::int, core::int> map1 = block {
+    final core::Map<core::int, core::int> #t31 = <core::int, core::int>{};
+    final core::Map<core::int, core::int>? #t32 = map;
+    if(!(#t32 == null))
+      for (final core::MapEntry<core::int, core::int> #t33 in #t32{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+        #t31.{core::Map::[]=}{Invariant}(#t33.{core::MapEntry::key}{core::int}, #t33.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+  } =>#t31;
+  core::Map<core::int, core::int> map3 = block {
+    final core::Map<core::int, core::int> #t34 = <core::int, core::int>{};
+    #t34.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
+    final core::Map<core::int, core::int>? #t35 = map;
+    if(!(#t35 == null))
+      for (final core::MapEntry<core::int, core::int> #t36 in #t35{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+        #t34.{core::Map::[]=}{Invariant}(#t36.{core::MapEntry::key}{core::int}, #t36.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t34.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
+  } =>#t34;
+  core::Map<core::int, core::int> map4 = block {
+    final core::Map<core::int, core::int> #t37 = <core::int, core::int>{};
+    #t37.{core::Map::[]=}{Invariant}(1, 1){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(2, 2){(core::int, core::int) → void};
+    final core::Map<core::int, core::int>? #t38 = null;
+    if(!(#t38 == null))
+      for (final core::MapEntry<core::int, core::int> #t39 in #t38{core::Map<core::int, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int, core::int>>})
+        #t37.{core::Map::[]=}{Invariant}(#t39.{core::MapEntry::key}{core::int}, #t39.{core::MapEntry::value}{core::int}){(core::int, core::int) → void};
+    #t37.{core::Map::[]=}{Invariant}(3, 3){(core::int, core::int) → void};
+  } =>#t37;
+}
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.modular.expect
new file mode 100644
index 0000000..c211559
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.modular.expect
@@ -0,0 +1,191 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:22:10: Warning: Operand of null-aware operation '??=' has type 'String' which excludes null.
+//     super[42] ??= "bar"; // Warning.
+//          ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:27:3: Warning: Operand of null-aware operation '?.' has type 'String' which excludes null.
+//   s?.length; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:28:3: Warning: Operand of null-aware operation '?..' has type 'String' which excludes null.
+//   s?..length; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:29:3: Warning: Operand of null-aware operation '??' has type 'String' which excludes null.
+//   s ?? "foo"; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:30:3: Warning: Operand of null-aware operation '??=' has type 'String' which excludes null.
+//   s ??= "foo"; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:31:8: Warning: Operand of null-aware operation '...?' has type 'List<String>' which excludes null.
+//  - 'List' is from 'dart:core'.
+//   [...?l]; // Warning.
+//        ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:32:16: Warning: Operand of null-aware operation '...?' has type 'List<String>' which excludes null.
+//  - 'List' is from 'dart:core'.
+//   var a = {...?l}; // Warning.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:33:16: Warning: Operand of null-aware operation '...?' has type 'List<String>' which excludes null.
+//  - 'List' is from 'dart:core'.
+//   <String>{...?l}; // Warning.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:34:16: Warning: Operand of null-aware operation '...?' has type 'Map<String, int>' which excludes null.
+//  - 'Map' is from 'dart:core'.
+//   var b = {...?m}; // Warning.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:35:21: Warning: Operand of null-aware operation '...?' has type 'Map<String, int>' which excludes null.
+//  - 'Map' is from 'dart:core'.
+//   <String, int>{...?m}; // Warning.
+//                     ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:36:3: Warning: Operand of null-aware operation '!' has type 'String' which excludes null.
+//   s!; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:37:3: Warning: Operand of null-aware operation '?.' has type 'String' which excludes null.
+//   s?.substring(0, 0); // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:38:3: Warning: Operand of null-aware operation '?.' has type 'List<String>' which excludes null.
+//  - 'List' is from 'dart:core'.
+//   l?.length = 42; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:39:3: Warning: Operand of null-aware operation '?.' has type 'List<String>' which excludes null.
+//  - 'List' is from 'dart:core'.
+//   l?.length += 42; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:40:3: Warning: Operand of null-aware operation '?.' has type 'List<String>' which excludes null.
+//  - 'List' is from 'dart:core'.
+//   l?.length ??= 42; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:41:3: Warning: Operand of null-aware operation '?.' has type 'String' which excludes null.
+//   s?.foo; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:42:7: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   E(s)[42] ??= 42; // Warning.
+//       ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:43:4: Warning: Operand of null-aware operation '??=' has type 'String' which excludes null.
+//   l[42] ??= "foo"; // Warning.
+//    ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:44:5: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   l.length ??= 42; // Warning.
+//     ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:45:3: Warning: Operand of null-aware operation '?..' has type 'List<String>' which excludes null.
+//  - 'List' is from 'dart:core'.
+//   l?..length = 42; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:46:3: Warning: Operand of null-aware operation '?..' has type 'List<String>' which excludes null.
+//  - 'List' is from 'dart:core'.
+//   l?..length ??= 42; // Warning.
+//   ^
+//
+// pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart:46:7: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   l?..length ??= 42; // Warning.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator [](core::int index) → core::String
+    return "foo";
+  operator []=(core::int index, core::String value) → void {}
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method test() → void {
+    let final core::int #t1 = 42 in super.{self::A::[]}(#t1) == null ?{core::String} super.{self::A::[]=}(#t1, "bar") : null;
+  }
+}
+extension E on core::String {
+  get foo = self::E|get#foo;
+  operator []= = self::E|[]=;
+  operator [] = self::E|[];
+}
+static method E|get#foo(lowered final core::String #this) → core::int
+  return 42;
+static method E|[]=(lowered final core::String #this, core::int index, core::int value) → void {}
+static method E|[](lowered final core::String #this, core::int index) → core::int
+  return 42;
+static method warning(core::String s, core::List<core::String> l, core::Map<core::String, core::int> m) → dynamic {
+  let final core::String #t2 = s in #t2 == null ?{core::int?} null : #t2.{core::String::length}{core::int};
+  let final core::String #t3 = s in #t3 == null ?{core::String} null : block {
+    #t3.{core::String::length}{core::int};
+  } =>#t3;
+  let final core::String #t4 = s in #t4 == null ?{core::String} "foo" : #t4;
+  s == null ?{core::String} s = "foo" : null;
+  block {
+    final core::List<core::String> #t5 = <core::String>[];
+    final core::Iterable<core::String>? #t6 = l;
+    if(!(#t6 == null))
+      #t5.{core::List::addAll}{Invariant}(#t6{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+  } =>#t5;
+  core::Set<core::String> a = block {
+    final core::Set<core::String> #t7 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<dynamic>? #t8 = l;
+    if(!(#t8 == null))
+      for (final dynamic #t9 in #t8{core::Iterable<dynamic>}) {
+        final core::String #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::String;
+        #t7.{core::Set::add}{Invariant}(#t10){(core::String) → core::bool};
+      }
+  } =>#t7;
+  block {
+    final core::Set<core::String> #t11 = col::LinkedHashSet::•<core::String>();
+    final core::Iterable<core::String>? #t12 = l;
+    if(!(#t12 == null))
+      #t11.{core::Set::addAll}{Invariant}(#t12{core::Iterable<core::String>}){(core::Iterable<core::String>) → void};
+  } =>#t11;
+  core::Map<core::String, core::int> b = block {
+    final core::Map<core::String, core::int> #t13 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t14 = m;
+    if(!(#t14 == null))
+      for (final core::MapEntry<core::String, core::int> #t15 in #t14{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>})
+        #t13.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::String}, #t15.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+  } =>#t13;
+  block {
+    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
+    final core::Map<core::String, core::int>? #t17 = m;
+    if(!(#t17 == null))
+      for (final core::MapEntry<core::String, core::int> #t18 in #t17{core::Map<core::String, core::int>}.{core::Map::entries}{core::Iterable<core::MapEntry<core::String, core::int>>})
+        #t16.{core::Map::[]=}{Invariant}(#t18.{core::MapEntry::key}{core::String}, #t18.{core::MapEntry::value}{core::int}){(core::String, core::int) → void};
+  } =>#t16;
+  s!;
+  let final core::String #t19 = s in #t19 == null ?{core::String?} null : #t19.{core::String::substring}(0, 0){(core::int, [core::int?]) → core::String};
+  let final core::List<core::String> #t20 = l in #t20 == null ?{core::int?} null : #t20.{core::List::length} = 42;
+  let final core::List<core::String> #t21 = l in #t21 == null ?{core::int?} null : #t21.{core::List::length} = #t21.{core::List::length}{core::int}.{core::num::+}(42){(core::num) → core::int};
+  let final core::List<core::String> #t22 = l in #t22 == null ?{core::int?} null : #t22.{core::List::length}{core::int} == null ?{core::int} #t22.{core::List::length} = 42 : null;
+  let final core::String #t23 = s in #t23 == null ?{core::int?} null : self::E|get#foo(#t23);
+  let final core::String #t24 = s in let final core::int #t25 = 42 in self::E|[](#t24, #t25) == null ?{core::int} self::E|[]=(#t24, #t25, 42) : null;
+  let final core::List<core::String> #t26 = l in let final core::int #t27 = 42 in #t26.{core::List::[]}(#t27){(core::int) → core::String} == null ?{core::String} #t26.{core::List::[]=}(#t27, "foo"){(core::int, core::String) → void} : null;
+  let final core::List<core::String> #t28 = l in #t28.{core::List::length}{core::int} == null ?{core::int} #t28.{core::List::length} = 42 : null;
+  let final core::List<core::String> #t29 = l in #t29 == null ?{core::List<core::String>} null : block {
+    #t29.{core::List::length} = 42;
+  } =>#t29;
+  let final core::List<core::String> #t30 = l in #t30 == null ?{core::List<core::String>} null : block {
+    let final core::List<core::String> #t31 = #t30 in #t31.{core::List::length}{core::int} == null ?{core::int} #t31.{core::List::length} = 42 : null;
+  } =>#t30;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/strong_lib_not_ok_from_dill/strong.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/strong_lib_not_ok_from_dill/strong.dart.weak.modular.expect
new file mode 100644
index 0000000..cb27086
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/strong_lib_not_ok_from_dill/strong.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "strong_lib.dart" as str;
+
+import "org-dartlang-testcase:///strong_lib.dart";
+
+static method main() → dynamic {
+  str::foo();
+}
diff --git a/pkg/front_end/testcases/nnbd/strong_lib_not_ok_from_source/strong.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/strong_lib_not_ok_from_source/strong.dart.weak.modular.expect
new file mode 100644
index 0000000..c9d352f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/strong_lib_not_ok_from_source/strong.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "strong_lib.dart" as str;
+
+import "org-dartlang-testcase:///strong_lib.dart";
+
+static method main() → dynamic {
+  str::foo();
+}
+
+library;
+import self as str;
+import "dart:core" as core;
+
+static field core::int* x;
+static method foo() → void {
+  core::print("hello");
+}
diff --git a/pkg/front_end/testcases/nnbd/strong_ok_from_dill/strong.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/strong_ok_from_dill/strong.dart.weak.modular.expect
new file mode 100644
index 0000000..cb27086
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/strong_ok_from_dill/strong.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "strong_lib.dart" as str;
+
+import "org-dartlang-testcase:///strong_lib.dart";
+
+static method main() → dynamic {
+  str::foo();
+}
diff --git a/pkg/front_end/testcases/nnbd/strong_ok_from_source/strong.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/strong_ok_from_source/strong.dart.weak.modular.expect
new file mode 100644
index 0000000..385858b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/strong_ok_from_source/strong.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "strong_lib.dart" as str;
+
+import "org-dartlang-testcase:///strong_lib.dart";
+
+static method main() → dynamic {
+  str::foo();
+}
+
+library /*isNonNullableByDefault*/;
+import self as str;
+import "dart:core" as core;
+
+static method foo() → void {
+  core::print("hello");
+}
diff --git a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.weak.modular.expect
new file mode 100644
index 0000000..ba7e12e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_dill/strong.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "package:opt_in_package/opt_in_lib.dart";
+import "package:opt_in_package/opt_out_lib.dart";
+import "package:opt_out_package/regular_lib1.dart";
+import "package:opt_out_package/regular_lib2.dart";
+
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.weak.modular.expect
new file mode 100644
index 0000000..ba7e12e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/strong_package_not_ok_from_source/strong.dart.weak.modular.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "package:opt_in_package/opt_in_lib.dart";
+import "package:opt_in_package/opt_out_lib.dart";
+import "package:opt_out_package/regular_lib1.dart";
+import "package:opt_out_package/regular_lib2.dart";
+
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..b06ed29
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object?, S extends core::Object> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%, self::A::S>
+    : super core::Object::•()
+    ;
+  method hest<covariant-by-class X extends self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+    return null;
+  method fisk<covariant-by-class X extends self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+    return null;
+  method mus<X extends core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+    return null;
+}
+static method foo<T extends core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+  return null;
+static method bar<T extends core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+  return null;
+static method baz(core::int? x, core::int y) → dynamic {
+  self::foo<core::int?, core::List<core::int?>>(x);
+  self::bar<core::int, core::List<core::int?>>(y);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.modular.expect
new file mode 100644
index 0000000..5537cc3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/super_bounded_hint.dart.weak.modular.expect
@@ -0,0 +1,618 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+// foo2b<X extends F>() {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:19:13: Error: Generic type 'F' can't be used without type arguments in a type variable bound.
+// Try providing type arguments to 'F' here.
+// class Foo3b<X extends F> {}
+//             ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: Bound of this variable references variable 'X' from the same declaration.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//                               ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:11:31: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1a(F<A<dynamic>, A<Never>> x) {}
+//                               ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo1b(F x) {}
+//         ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:12:9: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo1b(F x) {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo2a<X extends F<A<dynamic>, A<Never>>>() {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:14:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo2a<X extends F<A<dynamic>, A<Never>>>() {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo2b<X extends F>() {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:15:7: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo2b<X extends F>() {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
+//             ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:17:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// class Foo3a<X extends F<A<dynamic>, A<Never>>> {}
+//             ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+//                              ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:21:30: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F<A<dynamic>, A<Never>> foo4a() => throw 42;
+//                              ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// F foo4b() => throw 42;
+//        ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:22:8: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// F foo4b() => throw 42;
+//        ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                                         ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:24:41: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5a({required F<A<dynamic>, A<Never>> x}) {}
+//                                         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo5b({required F x}) {}
+//                   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:25:19: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo5b({required F x}) {}
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//                                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:47:33: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7a([F<A<dynamic>, A<Never>>? x]) {}
+//                                 ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// foo7b([F? x]) {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:48:11: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+// foo7b([F? x]) {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:54:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar1(B<num> x) {}
+//             ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:56:6: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar2<X extends B<num>>() {}
+//      ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:58:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bar3<X extends B<num>> {}
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:60:12: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+// B<num> bar4() => throw 42;
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:62:23: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar5({required B<num> x}) {}
+//                       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:76:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// bar7([B<num>? x]) {}
+//               ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:78:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the supertype 'B' of class 'Bar8'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bar8 extends B<dynamic> {}
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<A<dynamic>, A<Never>> x;
+//                           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:28:27: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> x;
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//                                ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:32: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//                                ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//                                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:29:37: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F<A<dynamic>, A<Never>> x in []) {}
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//                                   ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:30:35: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F<A<dynamic>, A<Never>> x) {}
+//                                   ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:31:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F<A<dynamic>, A<Never>>>() {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//                                  ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:32:34: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F<A<dynamic>, A<Never>> fooFoo4() => throw 42;
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                                             ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:33:45: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F<A<dynamic>, A<Never>> x}) {}
+//                                             ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//                                     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:34:37: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F<A<dynamic>, A<Never>>? x]) {}
+//                                     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F x;
+//     ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:38:5: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F x;
+//     ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (F x in []) {}
+//          ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:10: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F x in []) {}
+//          ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   for (F x in []) {}
+//               ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:39:15: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   for (F x in []) {}
+//               ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo1(F x) {}
+//             ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:40:13: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo1(F x) {}
+//             ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo2<X extends F>() {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:41:11: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo2<X extends F>() {}
+//           ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Error: Type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F' in the return type.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   F fooFoo4() => throw 42;
+//            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:42:12: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   F fooFoo4() => throw 42;
+//            ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo5({required F x}) {}
+//                       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:43:23: Context: If you want 'F<A<dynamic>, A<Never>>' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo5({required F x}) {}
+//                       ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'F'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   fooFoo7([F? x]) {}
+//               ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef F<X extends A<X>, Y extends A<Y>> = X Function(Y);
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:44:15: Context: If you want 'F<A<dynamic>, A<Never>>?' to be a super-bounded type, note that the inverted type 'F<A<Never>, A<Object?>>?' must then satisfy its bounds, which it does not.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/super_bounded_hint.dart'.
+//  - 'Object' is from 'dart:core'.
+//   fooFoo7([F? x]) {}
+//               ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:65:10: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   B<num> x;
+//          ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   for (B<num> x in []) {}
+//               ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:72:7: Error: Type argument 'dynamic' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   new B<dynamic>();
+//       ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:66:20: Error: Inferred type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   for (B<num> x in []) {}
+//                    ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:67:18: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar1(B<num> x) {}
+//                  ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:68:11: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar2<X extends B<num>>() {}
+//           ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:69:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+//   B<num> barBar4() => throw 42;
+//                 ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:70:28: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar5({required B<num> x}) {}
+//                            ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:71:20: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar7([B<num>? x]) {}
+//                    ^
+// pkg/front_end/testcases/nnbd/super_bounded_hint.dart:52:9: Context: This is the type variable whose bound isn't conformed to.
+// class B<X extends int> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<X extends self::A<X> = self::A<dynamic>, contravariant Y extends self::A<Y> = self::A<Never>> = (Y) → X;
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+}
+class Foo3a<X extends (self::A<Never>) → self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::Foo3a<self::Foo3a::X>
+    : super core::Object::•()
+    ;
+}
+class Foo3b<X extends (self::A<Never>) → self::A<dynamic> = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo3b<self::Foo3b::X>
+    : super core::Object::•()
+    ;
+}
+class B<X extends core::int> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X>
+    : super core::Object::•()
+    ;
+}
+class Bar3<X extends self::B<core::num>> extends core::Object {
+  synthetic constructor •() → self::Bar3<self::Bar3::X>
+    : super core::Object::•()
+    ;
+}
+class Bar8 extends self::B<dynamic> {
+  synthetic constructor •() → self::Bar8
+    : super self::B::•()
+    ;
+}
+static method foo1a((self::A<Never>) → self::A<dynamic> x) → dynamic {}
+static method foo1b((self::A<Never>) → self::A<dynamic> x) → dynamic {}
+static method foo2a<X extends (self::A<Never>) → self::A<dynamic>>() → dynamic {}
+static method foo2b<X extends (self::A<Never>) → self::A<dynamic> = dynamic>() → dynamic {}
+static method foo4a() → (self::A<Never>) → self::A<dynamic>
+  return throw 42;
+static method foo4b() → (self::A<Never>) → self::A<dynamic>
+  return throw 42;
+static method foo5a({required (self::A<Never>) → self::A<dynamic> x = #C1}) → dynamic {}
+static method foo5b({required (self::A<Never>) → self::A<dynamic> x = #C1}) → dynamic {}
+static method foo6a() → dynamic {
+  (self::A<Never>) → self::A<dynamic> x;
+  for ((self::A<Never>) → self::A<dynamic> x in <(self::A<Never>) → self::A<dynamic>>[]) {
+  }
+  function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo4() → (self::A<Never>) → self::A<dynamic>
+    return throw 42;
+  function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
+  function fooFoo7([(self::A<Never>) →? self::A<dynamic> x = #C1]) → Null {}
+}
+static method foo6b() → dynamic {
+  (self::A<Never>) → self::A<dynamic> x;
+  for ((self::A<Never>) → self::A<dynamic> x in <(self::A<Never>) → self::A<dynamic>>[]) {
+  }
+  function fooFoo1((self::A<Never>) → self::A<dynamic> x) → Null {}
+  function fooFoo2<X extends (self::A<Never>) → self::A<dynamic>>() → Null {}
+  function fooFoo4() → (self::A<Never>) → self::A<dynamic>
+    return throw 42;
+  function fooFoo5({required (self::A<Never>) → self::A<dynamic> x = #C1}) → Null {}
+  function fooFoo7([(self::A<Never>) →? self::A<dynamic> x = #C1]) → Null {}
+}
+static method foo7a([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
+static method foo7b([(self::A<Never>) →? self::A<dynamic> x = #C1]) → dynamic {}
+static method bar1(self::B<core::num> x) → dynamic {}
+static method bar2<X extends self::B<core::num>>() → dynamic {}
+static method bar4() → self::B<core::num>
+  return throw 42;
+static method bar5({required self::B<core::num> x = #C1}) → dynamic {}
+static method bar6() → dynamic {
+  self::B<core::num> x;
+  for (self::B<core::num> x in <self::B<core::num>>[]) {
+  }
+  function barBar1(self::B<core::num> x) → Null {}
+  function barBar2<X extends self::B<core::num>>() → Null {}
+  function barBar4() → self::B<core::num>
+    return throw 42;
+  function barBar5({required self::B<core::num> x = #C1}) → Null {}
+  function barBar7([self::B<core::num>? x = #C1]) → Null {}
+  new self::B::•<dynamic>();
+  new self::A::•<self::B<dynamic>>();
+}
+static method bar7([self::B<core::num>? x = #C1]) → dynamic {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.weak.modular.expect
new file mode 100644
index 0000000..da9cc12
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/switch_nullable_enum.dart.weak.modular.expect
@@ -0,0 +1,121 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/switch_nullable_enum.dart:7:5: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// int method1(Enum? e) {
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Enum extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Enum> values = #C7;
+  static const field self::Enum e1 = #C3;
+  static const field self::Enum e2 = #C6;
+  const constructor •(core::int index, core::String name) → self::Enum
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "Enum.${this.{core::_Enum::_name}{core::String}}";
+}
+static method method1(self::Enum? e) → core::int {
+  switch(e) {
+    #L1:
+    case #C3:
+    case #C6:
+      {
+        return 0;
+      }
+  }
+  return invalid-expression "pkg/front_end/testcases/nnbd/switch_nullable_enum.dart:7:5: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+int method1(Enum? e) {
+    ^" in null;
+}
+static method method2(self::Enum? e) → core::int {
+  switch(e) {
+    #L2:
+    case #C3:
+    case #C6:
+      {
+        return 0;
+      }
+    #L3:
+    case #C8:
+      {
+        return 1;
+      }
+    #L4:
+    default:
+      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
+  }
+}
+static method method3(self::Enum? e) → core::int {
+  switch(e) {
+    #L5:
+    case #C3:
+    case #C6:
+      {
+        return 0;
+      }
+    #L6:
+    default:
+      {
+        return 1;
+      }
+  }
+}
+static method method4(self::Enum? e) → core::int {
+  switch(e) {
+    #L7:
+    case #C3:
+    case #C6:
+      {
+        return 0;
+      }
+    #L8:
+    case #C8:
+    default:
+      {
+        return 1;
+      }
+  }
+}
+static method test() → dynamic {
+  self::method1(#C3);
+}
+static method main() → dynamic {
+  self::expect(0, self::method2(#C3));
+  self::expect(0, self::method2(#C6));
+  self::expect(1, self::method2(null));
+  self::expect(0, self::method3(#C3));
+  self::expect(0, self::method3(#C6));
+  self::expect(1, self::method3(null));
+  self::expect(0, self::method4(#C3));
+  self::expect(0, self::method4(#C6));
+  self::expect(1, self::method4(null));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Expected ${expected}, actual ${actual}.";
+  }
+}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = self::Enum {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "e2"
+  #C6 = self::Enum {index:#C4, _name:#C5}
+  #C7 = <self::Enum*>[#C3, #C6]
+  #C8 = null
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///switch_nullable_enum.dart:
+- Enum. (from org-dartlang-testcase:///switch_nullable_enum.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd/switch_redesign_fall_over.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/switch_redesign_fall_over.dart.weak.modular.expect
new file mode 100644
index 0000000..e074f2a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/switch_redesign_fall_over.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/switch_redesign_fall_over.dart:23:5: Error: Switch case may fall through to the next case.
+//     case -42: // Error.
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo(core::int x, core::bool b) → dynamic {
+    switch(x) {
+      #L1:
+      case #C1:
+        {
+          let final Never #t1 = this.{self::A::neverReturn}(){() → Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+        }
+      #L2:
+      default:
+        {
+          self::bar();
+        }
+    }
+  }
+  abstract method neverReturn() → Never;
+}
+static method bar() → dynamic {}
+static method foo(core::int x, core::bool b) → dynamic {
+  switch(x) {
+    #L3:
+    case #C1:
+      {
+        let final Never #t2 = b ?{Never} throw "hest" : throw "fisk" in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+      }
+    #L4:
+    case #C2:
+      {
+        self::bar();
+      }
+    #L5:
+    default:
+      {
+        self::bar();
+      }
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = -42
+}
diff --git a/pkg/front_end/testcases/nnbd/switch_redesign_types.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/switch_redesign_types.dart.weak.modular.expect
new file mode 100644
index 0000000..0d7d320
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/switch_redesign_types.dart.weak.modular.expect
@@ -0,0 +1,110 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:35:16: Error: Type 'A' of the case expression is not a subtype of type 'B' of this switch expression.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
+//     case const A(42): // Error: not a subtype of B.
+//                ^
+// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:30:11: Context: The switch expression is here.
+//   switch (b) {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:39:10: Error: Type 'dynamic' of the case expression is not a subtype of type 'B' of this switch expression.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
+//     case x: // Error: D has custom operator ==.
+//          ^
+// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:30:11: Context: The switch expression is here.
+//   switch (b) {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:37:16: Error: Case expression 'D {}' does not have a primitive operator '=='.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
+//     case const D(42): // Error: D has custom operator ==.
+//                ^
+//
+// pkg/front_end/testcases/nnbd/switch_redesign_types.dart:39:10: Error: Case expression 'D {}' does not have a primitive operator '=='.
+//  - 'D' is from 'pkg/front_end/testcases/nnbd/switch_redesign_types.dart'.
+//     case x: // Error: D has custom operator ==.
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/  {
+  final field core::int foo;
+  const constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •(core::int foo) → self::B
+    : super self::A::•(foo)
+    ;
+}
+class C extends self::B /*hasConstConstructor*/  {
+  const constructor •(core::int foo) → self::C
+    : super self::B::•(foo)
+    ;
+}
+class D extends self::B /*hasConstConstructor*/  {
+  const constructor •(core::int foo) → self::D
+    : super self::B::•(foo)
+    ;
+  operator ==(dynamic other) → core::bool
+    return core::identical(this, other);
+}
+static method bar(self::B b) → dynamic {
+  #L1:
+  switch(b) {
+    #L2:
+    case #C2:
+      {
+        break #L1;
+      }
+    #L3:
+    case #C3:
+      {
+        break #L1;
+      }
+    #L4:
+    case #C4:
+      {
+        break #L1;
+      }
+    #L5:
+    case #C5:
+      {
+        break #L1;
+      }
+    #L6:
+    case #C7:
+      {
+        break #L1;
+      }
+    #L7:
+    default:
+      {}
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = self::B {foo:#C1}
+  #C3 = self::C {foo:#C1}
+  #C4 = self::A {foo:#C1}
+  #C5 = self::D {foo:#C1}
+  #C6 = 123
+  #C7 = self::D {foo:#C6}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///switch_redesign_types.dart:
+- D. (from org-dartlang-testcase:///switch_redesign_types.dart:23:9)
+- B. (from org-dartlang-testcase:///switch_redesign_types.dart:15:9)
+- A. (from org-dartlang-testcase:///switch_redesign_types.dart:11:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- C. (from org-dartlang-testcase:///switch_redesign_types.dart:19:9)
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.modular.expect
new file mode 100644
index 0000000..ad453ca
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.modular.expect
@@ -0,0 +1,93 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
+//   functionContext(null as C?); // Error.
+//                        ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Error: Can't tear off method 'call' from a potentially null value.
+//   nullableFunctionContext(null as C?); // Error.
+//                                ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
+//   functionContext(c); // Error.
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
+//   nullableFunctionContext(c); // Error.
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+//   functionContext(t); // Error.
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+//   nullableFunctionContext(t); // Error.
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
+//   functionContext(nt); // Error.
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
+//   nullableFunctionContext(nt); // Error.
+//                           ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+//   functionContext(t); // Shouldn't result in a compile-time error.
+//                   ^
+//
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+//   nullableFunctionContext(t); // Shouldn't result in a compile-time error.
+//                           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method call() → core::int
+    return 0;
+}
+static method functionContext(() → core::int f) → dynamic {}
+static method nullableFunctionContext(() →? core::int f) → dynamic {}
+static method foo<T extends self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
+  self::functionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
+  functionContext(null as C?); // Error.
+                       ^" in (null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
+  self::nullableFunctionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Error: Can't tear off method 'call' from a potentially null value.
+  nullableFunctionContext(null as C?); // Error.
+                               ^" in (null as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
+  self::functionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
+  functionContext(c); // Error.
+                  ^" in c as{TypeError} () → core::int);
+  self::nullableFunctionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
+  nullableFunctionContext(c); // Error.
+                          ^" in c as{TypeError} () →? core::int);
+  self::functionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+  functionContext(t); // Error.
+                  ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
+  self::nullableFunctionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+  nullableFunctionContext(t); // Error.
+                          ^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
+  self::functionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
+  functionContext(nt); // Error.
+                  ^" in nt as{TypeError,ForNonNullableByDefault} () → core::int);
+  self::nullableFunctionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
+  nullableFunctionContext(nt); // Error.
+                          ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
+}
+static method bar<T extends self::C>(self::C c, self::bar::T t) → dynamic {
+  self::functionContext(let final self::C #t1 = c in #t1 == null ?{() → core::int} null : #t1.{self::C::call}{() → core::int});
+  self::nullableFunctionContext(let final self::C #t2 = c in #t2 == null ?{() → core::int} null : #t2.{self::C::call}{() → core::int});
+  self::functionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+  functionContext(t); // Shouldn't result in a compile-time error.
+                  ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
+  self::nullableFunctionContext(invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+  nullableFunctionContext(t); // Shouldn't result in a compile-time error.
+                          ^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.modular.expect
new file mode 100644
index 0000000..b10539b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart:15:14: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+//   String s = x; // Should be an error, `T` should be int.
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends core::Object? = dynamic> extends core::Object {
+  constructor •((self::C::X%) → void x) → self::C<self::C::X%>
+    : super core::Object::•()
+    ;
+}
+static method check<T extends core::Object? = dynamic>(self::C<core::List<self::check::T%>> f) → self::check::T% {
+  return null as{ForNonNullableByDefault} self::check::T%;
+}
+static method test() → void {
+  core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → void {}));
+  core::String s = invalid-expression "pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart:15:14: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  String s = x; // Should be an error, `T` should be int.
+             ^" in x as{TypeError,ForNonNullableByDefault} core::String;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.modular.expect
new file mode 100644
index 0000000..220ce86
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/type_parameter_types.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class A<X extends core::Object, Y extends core::Object?> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X, self::A::Y%>
+    : super core::Object::•()
+    ;
+  method foo() → self::A::X
+    return let final Never #t1 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  method bar() → self::A::X?
+    return null;
+  method baz() → self::A::Y%
+    return let final Never #t2 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+}
+class B<X extends core::List<self::B::Y%> = core::List<core::Object?>, Y extends core::Object?> extends core::Object {
+  synthetic constructor •() → self::B<self::B::X, self::B::Y%>
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-class self::B::X x, covariant-by-class self::B::Y% y) → dynamic {}
+}
+class C<X extends core::List<self::C::Y%>? = core::List<dynamic>?, Y extends core::List<self::C::X%>? = core::List<dynamic>?> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X%, self::C::Y%>
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-class self::C::X% x, covariant-by-class self::C::Y% y) → dynamic {}
+}
+class D<X extends self::D::Y% = dynamic, Y extends self::D::Z% = dynamic, Z extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X%, self::D::Y%, self::D::Z%>
+    : super core::Object::•()
+    ;
+  method foo(covariant-by-class self::D::X% x, covariant-by-class self::D::Y% y, covariant-by-class self::D::Z% z) → dynamic {}
+}
+static method never() → Never
+  return throw "Never";
+static method main() → dynamic {
+  function fun1<X extends core::Object, Y extends core::Object?>() → X
+    return let final Never #t3 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  function fun2<X extends core::Object, Y extends core::Object?>() → Y%
+    return let final Never #t4 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  function fun3<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → X
+    return let final Never #t5 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  function fun4<X extends core::List<Y%> = core::List<core::Object?>, Y extends core::Object?>() → Y%
+    return let final Never #t6 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  function fun5<X extends core::List<Y%>? = core::List<dynamic>?, Y extends core::List<X%>? = core::List<dynamic>?>() → X%
+    return let final Never #t7 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  function fun6<X extends core::List<Y%>? = core::List<dynamic>?, Y extends core::List<X%>? = core::List<dynamic>?>() → Y%
+    return let final Never #t8 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  function fun7<X extends Y% = dynamic, Y extends Z% = dynamic, Z extends core::Object? = dynamic>() → X%
+    return let final Never #t9 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  function fun8<X extends Y% = dynamic, Y extends Z% = dynamic, Z extends core::Object? = dynamic>() → Y%
+    return let final Never #t10 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  function fun9<X extends Y% = dynamic, Y extends Z% = dynamic, Z extends core::Object? = dynamic>() → Z%
+    return let final Never #t11 = self::never() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+}
diff --git a/pkg/front_end/testcases/nnbd/uninitialized_non_nullable_late_fields.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/uninitialized_non_nullable_late_fields.dart.weak.modular.expect
new file mode 100644
index 0000000..bdb8fdc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/uninitialized_non_nullable_late_fields.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  late field core::int x;
+  constructor foo(core::int x) → self::A
+    : self::A::x = x, super core::Object::•()
+    ;
+  constructor bar() → self::A
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.modular.expect
new file mode 100644
index 0000000..8aa9644
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+  field dynamic bar = null;
+  field dynamic baz = null;
+  synthetic constructor •() → self::Foo<self::Foo::T%>
+    : super core::Object::•()
+    ;
+  method qux() → dynamic {
+    final self::Foo::T? v = this.{self::Foo::bar}{dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+    if(v is{ForNonNullableByDefault} core::num) {
+      this.{self::Foo::baz}{dynamic}{dynamic}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite}{core::bool} ?{core::Object} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}(){() → core::String});
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart.weak.modular.expect
new file mode 100644
index 0000000..7245adf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart.weak.modular.expect
@@ -0,0 +1,698 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart:15:7: Error: 'B with MixinB' can't implement both 'B<num>' and 'B<int>'
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2c extends B<num> with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart:19:7: Error: 'B with MixinB' can't implement both 'B<Object>' and 'B<dynamic>'
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'Object' is from 'dart:core'.
+// class Class2e extends B<Object> with MixinB<dynamic> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart:23:7: Error: 'C with MixinC' can't implement both 'C<num, num>' and 'C<num, int>'
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class3b extends C<num, num> with MixinC<num, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:23:7: Error: 'B with MixinB' can't implement both 'B<int?>' and 'B<int>'
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2b extends B<int?> with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:25:7: Error: 'B with MixinB' can't implement both 'B<num>' and 'B<int>'
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2c extends B<num> with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:29:7: Error: 'B with MixinB' can't implement both 'B<Object>' and 'B<dynamic>'
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'Object' is from 'dart:core'.
+// class Class2e extends B<Object> with MixinB<dynamic> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:35:7: Error: 'C with MixinC' can't implement both 'C<num, num>' and 'C<num, int>'
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class3b extends C<num, num> with MixinC<num, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:37:7: Error: 'C with MixinC' can't implement both 'C<num?, int>' and 'C<num, int>'
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class3c extends C<num?, int> with MixinC<num, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:49:7: Error: 'ClassBa with MixinB' can't implement both 'B<int?>' and 'B<int>'
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class4a extends ClassBa with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:53:7: Error: 'ClassBb with MixinB' can't implement both 'B<int>' and 'B<int?>'
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class4c extends ClassBb with MixinB<int?> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:57:7: Error: 'ClassCa with MixinC' can't implement both 'C<num?, int?>' and 'C<num?, int>'
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class5a extends ClassCa with MixinC<num?, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:61:7: Error: 'ClassCb with MixinC' can't implement both 'C<num?, int>' and 'C<num?, int?>'
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class5c extends ClassCb with MixinC<num?, int?> {} // error
+//       ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart:9:7: Error: 'Object' doesn't implement 'A' so it can't be used with 'MixinA'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinA' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class1a extends Object with MixinA {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart:13:7: Error: 'Object' doesn't implement 'B<int>' so it can't be used with 'MixinB<int>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinB' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2a extends Object with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart:15:7: Error: 'B<num>' doesn't implement 'B<int>' so it can't be used with 'MixinB<int>'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinB' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2c extends B<num> with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart:21:7: Error: 'Object' doesn't implement 'C<num, int>' so it can't be used with 'MixinC<num, int>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinC' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class3a extends Object with MixinC<num, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins.dart:23:7: Error: 'C<num, num>' doesn't implement 'C<num, int>' so it can't be used with 'MixinC<num, int>'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinC' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class3b extends C<num, num> with MixinC<num, int> {} // error
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+import "bad_mixins_lib.dart" as bad;
+
+import "org-dartlang-testcase:///bad_mixins_lib.dart";
+
+abstract class _Class1a&Object&MixinA = core::Object with bad::MixinA /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class1a&Object&MixinA*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class1a extends self::_Class1a&Object&MixinA {
+  synthetic constructor •() → self::Class1a*
+    : super self::_Class1a&Object&MixinA::•()
+    ;
+}
+abstract class _Class1b&A&MixinA = bad::A with bad::MixinA /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class1b&A&MixinA*
+    : super bad::A::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class1b extends self::_Class1b&A&MixinA {
+  synthetic constructor •() → self::Class1b*
+    : super self::_Class1b&A&MixinA::•()
+    ;
+}
+abstract class _Class2a&Object&MixinB = core::Object with bad::MixinB<core::int*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class2a&Object&MixinB*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2a extends self::_Class2a&Object&MixinB {
+  synthetic constructor •() → self::Class2a*
+    : super self::_Class2a&Object&MixinB::•()
+    ;
+}
+abstract class _Class2c&B&MixinB = bad::B<core::num*> with bad::MixinB<core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class2c&B&MixinB*
+    : super bad::B::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2c extends self::_Class2c&B&MixinB {
+  synthetic constructor •() → self::Class2c*
+    : super self::_Class2c&B&MixinB::•()
+    ;
+}
+abstract class _Class2d&B&MixinB = bad::B<core::int*> with bad::MixinB<core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class2d&B&MixinB*
+    : super bad::B::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2d extends self::_Class2d&B&MixinB {
+  synthetic constructor •() → self::Class2d*
+    : super self::_Class2d&B&MixinB::•()
+    ;
+}
+abstract class _Class2e&B&MixinB = bad::B<core::Object*> with bad::MixinB<dynamic> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class2e&B&MixinB*
+    : super bad::B::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2e extends self::_Class2e&B&MixinB {
+  synthetic constructor •() → self::Class2e*
+    : super self::_Class2e&B&MixinB::•()
+    ;
+}
+abstract class _Class3a&Object&MixinC = core::Object with bad::MixinC<core::num*, core::int*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class3a&Object&MixinC*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class3a extends self::_Class3a&Object&MixinC {
+  synthetic constructor •() → self::Class3a*
+    : super self::_Class3a&Object&MixinC::•()
+    ;
+}
+abstract class _Class3b&C&MixinC = bad::C<core::num*, core::num*> with bad::MixinC<core::num*, core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class3b&C&MixinC*
+    : super bad::C::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class3b extends self::_Class3b&C&MixinC {
+  synthetic constructor •() → self::Class3b*
+    : super self::_Class3b&C&MixinC::•()
+    ;
+}
+abstract class _Class3d&C&MixinC = bad::C<core::num*, core::int*> with bad::MixinC<core::num*, core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class3d&C&MixinC*
+    : super bad::C::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class3d extends self::_Class3d&C&MixinC {
+  synthetic constructor •() → self::Class3d*
+    : super self::_Class3d&C&MixinC::•()
+    ;
+}
+abstract class _Class4a&ClassBa&MixinB = bad::ClassBa with bad::MixinB<core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class4a&ClassBa&MixinB*
+    : super bad::ClassBa::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class4a extends self::_Class4a&ClassBa&MixinB {
+  synthetic constructor •() → self::Class4a*
+    : super self::_Class4a&ClassBa&MixinB::•()
+    ;
+}
+abstract class _Class4b&ClassBb&MixinB = bad::ClassBb with bad::MixinB<core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class4b&ClassBb&MixinB*
+    : super bad::ClassBb::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class4b extends self::_Class4b&ClassBb&MixinB {
+  synthetic constructor •() → self::Class4b*
+    : super self::_Class4b&ClassBb&MixinB::•()
+    ;
+}
+abstract class _Class5a&ClassCa&MixinC = bad::ClassCa with bad::MixinC<core::num*, core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class5a&ClassCa&MixinC*
+    : super bad::ClassCa::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class5a extends self::_Class5a&ClassCa&MixinC {
+  synthetic constructor •() → self::Class5a*
+    : super self::_Class5a&ClassCa&MixinC::•()
+    ;
+}
+abstract class _Class5b&ClassCb&MixinC = bad::ClassCb with bad::MixinC<core::num*, core::int*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class5b&ClassCb&MixinC*
+    : super bad::ClassCb::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class5b extends self::_Class5b&ClassCb&MixinC {
+  synthetic constructor •() → self::Class5b*
+    : super self::_Class5b&ClassCb&MixinC::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:17:7: Error: 'Object' doesn't implement 'A' so it can't be used with 'MixinA'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinA' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class1a extends Object with MixinA {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:21:7: Error: 'Object' doesn't implement 'B<int>' so it can't be used with 'MixinB<int>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinB' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2a extends Object with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:23:7: Error: 'B<int?>' doesn't implement 'B<int>' so it can't be used with 'MixinB<int>'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinB' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2b extends B<int?> with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:25:7: Error: 'B<num>' doesn't implement 'B<int>' so it can't be used with 'MixinB<int>'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinB' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2c extends B<num> with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:29:7: Error: 'B<Object>' doesn't implement 'B<dynamic>' so it can't be used with 'MixinB<dynamic>'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'Object' is from 'dart:core'.
+//  - 'MixinB' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class2e extends B<Object> with MixinB<dynamic> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:33:7: Error: 'Object' doesn't implement 'C<num, int>' so it can't be used with 'MixinC<num, int>'.
+//  - 'Object' is from 'dart:core'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinC' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class3a extends Object with MixinC<num, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:35:7: Error: 'C<num, num>' doesn't implement 'C<num, int>' so it can't be used with 'MixinC<num, int>'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinC' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class3b extends C<num, num> with MixinC<num, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:37:7: Error: 'C<num?, int>' doesn't implement 'C<num, int>' so it can't be used with 'MixinC<num, int>'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinC' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class3c extends C<num?, int> with MixinC<num, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:49:7: Error: 'ClassBa' doesn't implement 'B<int>' so it can't be used with 'MixinB<int>'.
+//  - 'ClassBa' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinB' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class4a extends ClassBa with MixinB<int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:53:7: Error: 'ClassBb' doesn't implement 'B<int?>' so it can't be used with 'MixinB<int?>'.
+//  - 'ClassBb' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinB' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class4c extends ClassBb with MixinB<int?> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:57:7: Error: 'ClassCa' doesn't implement 'C<num?, int>' so it can't be used with 'MixinC<num?, int>'.
+//  - 'ClassCa' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinC' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class5a extends ClassCa with MixinC<num?, int> {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart:61:7: Error: 'ClassCb' doesn't implement 'C<num?, int?>' so it can't be used with 'MixinC<num?, int?>'.
+//  - 'ClassCb' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+//  - 'MixinC' is from 'pkg/front_end/testcases/nnbd_mixed/bad_mixins_lib.dart'.
+// class Class5c extends ClassCb with MixinC<num?, int?> {} // error
+//       ^
+//
+import self as bad;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → bad::A
+    : super core::Object::•()
+    ;
+}
+class B<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → bad::B<bad::B::T%>
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object? = dynamic, S extends bad::C::T% = dynamic> extends core::Object {
+  synthetic constructor •() → bad::C<bad::C::T%, bad::C::S%>
+    : super core::Object::•()
+    ;
+}
+abstract class MixinA extends bad::A /*isMixinDeclaration*/  {
+}
+abstract class MixinB<T extends core::Object? = dynamic> extends bad::B<bad::MixinB::T%> /*isMixinDeclaration*/  {
+}
+abstract class MixinC<T extends core::Object? = dynamic, S extends bad::MixinC::T% = dynamic> extends bad::C<bad::MixinC::T%, bad::MixinC::S%> /*isMixinDeclaration*/  {
+}
+abstract class _Class1a&Object&MixinA = core::Object with bad::MixinA /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → bad::_Class1a&Object&MixinA
+    : super core::Object::•()
+    ;
+}
+class Class1a extends bad::_Class1a&Object&MixinA {
+  synthetic constructor •() → bad::Class1a
+    : super bad::_Class1a&Object&MixinA::•()
+    ;
+}
+abstract class _Class1b&A&MixinA = bad::A with bad::MixinA /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class1b&A&MixinA
+    : super bad::A::•()
+    ;
+}
+class Class1b extends bad::_Class1b&A&MixinA {
+  synthetic constructor •() → bad::Class1b
+    : super bad::_Class1b&A&MixinA::•()
+    ;
+}
+abstract class _Class2a&Object&MixinB = core::Object with bad::MixinB<core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → bad::_Class2a&Object&MixinB
+    : super core::Object::•()
+    ;
+}
+class Class2a extends bad::_Class2a&Object&MixinB {
+  synthetic constructor •() → bad::Class2a
+    : super bad::_Class2a&Object&MixinB::•()
+    ;
+}
+abstract class _Class2b&B&MixinB = bad::B<core::int?> with bad::MixinB<core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class2b&B&MixinB
+    : super bad::B::•()
+    ;
+}
+class Class2b extends bad::_Class2b&B&MixinB {
+  synthetic constructor •() → bad::Class2b
+    : super bad::_Class2b&B&MixinB::•()
+    ;
+}
+abstract class _Class2c&B&MixinB = bad::B<core::num> with bad::MixinB<core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class2c&B&MixinB
+    : super bad::B::•()
+    ;
+}
+class Class2c extends bad::_Class2c&B&MixinB {
+  synthetic constructor •() → bad::Class2c
+    : super bad::_Class2c&B&MixinB::•()
+    ;
+}
+abstract class _Class2d&B&MixinB = bad::B<core::int> with bad::MixinB<core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class2d&B&MixinB
+    : super bad::B::•()
+    ;
+}
+class Class2d extends bad::_Class2d&B&MixinB {
+  synthetic constructor •() → bad::Class2d
+    : super bad::_Class2d&B&MixinB::•()
+    ;
+}
+abstract class _Class2e&B&MixinB = bad::B<core::Object> with bad::MixinB<dynamic> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class2e&B&MixinB
+    : super bad::B::•()
+    ;
+}
+class Class2e extends bad::_Class2e&B&MixinB {
+  synthetic constructor •() → bad::Class2e
+    : super bad::_Class2e&B&MixinB::•()
+    ;
+}
+abstract class _Class2f&B&MixinB = bad::B<core::Object?> with bad::MixinB<dynamic> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class2f&B&MixinB
+    : super bad::B::•()
+    ;
+}
+class Class2f extends bad::_Class2f&B&MixinB {
+  synthetic constructor •() → bad::Class2f
+    : super bad::_Class2f&B&MixinB::•()
+    ;
+}
+abstract class _Class3a&Object&MixinC = core::Object with bad::MixinC<core::num, core::int> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → bad::_Class3a&Object&MixinC
+    : super core::Object::•()
+    ;
+}
+class Class3a extends bad::_Class3a&Object&MixinC {
+  synthetic constructor •() → bad::Class3a
+    : super bad::_Class3a&Object&MixinC::•()
+    ;
+}
+abstract class _Class3b&C&MixinC = bad::C<core::num, core::num> with bad::MixinC<core::num, core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class3b&C&MixinC
+    : super bad::C::•()
+    ;
+}
+class Class3b extends bad::_Class3b&C&MixinC {
+  synthetic constructor •() → bad::Class3b
+    : super bad::_Class3b&C&MixinC::•()
+    ;
+}
+abstract class _Class3c&C&MixinC = bad::C<core::num?, core::int> with bad::MixinC<core::num, core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class3c&C&MixinC
+    : super bad::C::•()
+    ;
+}
+class Class3c extends bad::_Class3c&C&MixinC {
+  synthetic constructor •() → bad::Class3c
+    : super bad::_Class3c&C&MixinC::•()
+    ;
+}
+abstract class _Class3d&C&MixinC = bad::C<core::num, core::int> with bad::MixinC<core::num, core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class3d&C&MixinC
+    : super bad::C::•()
+    ;
+}
+class Class3d extends bad::_Class3d&C&MixinC {
+  synthetic constructor •() → bad::Class3d
+    : super bad::_Class3d&C&MixinC::•()
+    ;
+}
+class ClassBa extends bad::B<core::int?> {
+  synthetic constructor •() → bad::ClassBa
+    : super bad::B::•()
+    ;
+}
+class ClassBb extends bad::B<core::int> {
+  synthetic constructor •() → bad::ClassBb
+    : super bad::B::•()
+    ;
+}
+class ClassCa extends bad::C<core::num?, core::int?> {
+  synthetic constructor •() → bad::ClassCa
+    : super bad::C::•()
+    ;
+}
+class ClassCb extends bad::C<core::num?, core::int> {
+  synthetic constructor •() → bad::ClassCb
+    : super bad::C::•()
+    ;
+}
+abstract class _Class4a&ClassBa&MixinB = bad::ClassBa with bad::MixinB<core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class4a&ClassBa&MixinB
+    : super bad::ClassBa::•()
+    ;
+}
+class Class4a extends bad::_Class4a&ClassBa&MixinB {
+  synthetic constructor •() → bad::Class4a
+    : super bad::_Class4a&ClassBa&MixinB::•()
+    ;
+}
+abstract class _Class4b&ClassBa&MixinB = bad::ClassBa with bad::MixinB<core::int?> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class4b&ClassBa&MixinB
+    : super bad::ClassBa::•()
+    ;
+}
+class Class4b extends bad::_Class4b&ClassBa&MixinB {
+  synthetic constructor •() → bad::Class4b
+    : super bad::_Class4b&ClassBa&MixinB::•()
+    ;
+}
+abstract class _Class4c&ClassBb&MixinB = bad::ClassBb with bad::MixinB<core::int?> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class4c&ClassBb&MixinB
+    : super bad::ClassBb::•()
+    ;
+}
+class Class4c extends bad::_Class4c&ClassBb&MixinB {
+  synthetic constructor •() → bad::Class4c
+    : super bad::_Class4c&ClassBb&MixinB::•()
+    ;
+}
+abstract class _Class4d&ClassBb&MixinB = bad::ClassBb with bad::MixinB<core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class4d&ClassBb&MixinB
+    : super bad::ClassBb::•()
+    ;
+}
+class Class4d extends bad::_Class4d&ClassBb&MixinB {
+  synthetic constructor •() → bad::Class4d
+    : super bad::_Class4d&ClassBb&MixinB::•()
+    ;
+}
+abstract class _Class5a&ClassCa&MixinC = bad::ClassCa with bad::MixinC<core::num?, core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class5a&ClassCa&MixinC
+    : super bad::ClassCa::•()
+    ;
+}
+class Class5a extends bad::_Class5a&ClassCa&MixinC {
+  synthetic constructor •() → bad::Class5a
+    : super bad::_Class5a&ClassCa&MixinC::•()
+    ;
+}
+abstract class _Class5b&ClassCa&MixinC = bad::ClassCa with bad::MixinC<core::num?, core::int?> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class5b&ClassCa&MixinC
+    : super bad::ClassCa::•()
+    ;
+}
+class Class5b extends bad::_Class5b&ClassCa&MixinC {
+  synthetic constructor •() → bad::Class5b
+    : super bad::_Class5b&ClassCa&MixinC::•()
+    ;
+}
+abstract class _Class5c&ClassCb&MixinC = bad::ClassCb with bad::MixinC<core::num?, core::int?> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class5c&ClassCb&MixinC
+    : super bad::ClassCb::•()
+    ;
+}
+class Class5c extends bad::_Class5c&ClassCb&MixinC {
+  synthetic constructor •() → bad::Class5c
+    : super bad::_Class5c&ClassCb&MixinC::•()
+    ;
+}
+abstract class _Class5d&ClassCb&MixinC = bad::ClassCb with bad::MixinC<core::num?, core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → bad::_Class5d&ClassCb&MixinC
+    : super bad::ClassCb::•()
+    ;
+}
+class Class5d extends bad::_Class5d&ClassCb&MixinC {
+  synthetic constructor •() → bad::Class5d
+    : super bad::_Class5d&ClassCb&MixinC::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..b07ab07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "bounds_from_opt_in_lib.dart" as bou;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///bounds_from_opt_in_lib.dart";
+
+class LegacyClass<T extends Null> extends bou::Class<self::LegacyClass::T*> {
+  synthetic constructor •() → self::LegacyClass<self::LegacyClass::T*>*
+    : super bou::Class::•()
+    ;
+  method method<T extends Null>() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  bou::Class<Null>* c = new bou::Class::•<Null>();
+  c.{bou::Class::method}<Null>(){() →* dynamic};
+  bou::method<Null>();
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as bou;
+import "dart:core" as core;
+
+class Class<T extends Never> extends core::Object {
+  synthetic constructor •() → bou::Class<bou::Class::T>
+    : super core::Object::•()
+    ;
+  method method<T extends Never>() → dynamic {}
+}
+static method method<T extends Never>() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..524b85c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "call_opt_in_through_opt_out_lib.dart" as cal;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///call_opt_in_through_opt_out_lib.dart";
+
+static method test() → dynamic {
+  cal::applyTakesNever(#C1);
+  cal::applyTakesNever(#C2);
+  cal::applyTakesNull(#C1);
+  cal::applyTakesNull(#C2);
+  cal::applyTakesNeverNamed(f: #C1);
+  cal::applyTakesNeverNamed(f: #C2);
+  cal::applyTakesNullNamed(f: #C1);
+  cal::applyTakesNullNamed(f: #C2);
+  cal::applyTakesNonNullable(#C3);
+  cal::applyTakesNonNullable(#C4);
+  cal::applyTakesNullable(#C3);
+  cal::applyTakesNullable(#C4);
+  cal::applyTakesNonNullableNamed(f: #C3);
+  cal::applyTakesNonNullableNamed(f: #C4);
+  cal::applyTakesNullableNamed(f: #C3);
+  cal::applyTakesNullableNamed(f: #C4);
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as cal;
+import "dart:core" as core;
+
+static method takesNull(Null n) → void {}
+static method takesNever(Never n) → void {}
+static method applyTakesNull((Null) → void f) → dynamic {}
+static method applyTakesNever((Never) → void f) → dynamic {}
+static method applyTakesNullNamed({required (Null) → void f = #C5}) → dynamic {}
+static method applyTakesNeverNamed({required (Never) → void f = #C5}) → dynamic {}
+static method takesNullable(core::int? i) → void {}
+static method takesNonNullable(core::int i) → void {}
+static method applyTakesNullable((core::int?) → void f) → dynamic {}
+static method applyTakesNonNullable((core::int) → void f) → dynamic {}
+static method applyTakesNullableNamed({required (core::int?) → void f = #C5}) → dynamic {}
+static method applyTakesNonNullableNamed({required (core::int) → void f = #C5}) → dynamic {}
+
+constants  {
+  #C1 = static-tearoff cal::takesNever
+  #C2 = static-tearoff cal::takesNull
+  #C3 = static-tearoff cal::takesNonNullable
+  #C4 = static-tearoff cal::takesNullable
+  #C5 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_canonical_type.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/const_canonical_type.dart.weak.modular.expect
new file mode 100644
index 0000000..50d1579
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/const_canonical_type.dart.weak.modular.expect
@@ -0,0 +1,119 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "const_canonical_type_lib.dart" as con;
+import "dart:core" as core;
+
+import "dart:async";
+import "org-dartlang-testcase:///const_canonical_type_lib.dart" as oo;
+
+typedef F1 = () → con::A<FutureOr<dynamic>>;
+typedef F2 = () → con::A<dynamic>;
+typedef F3 = () → con::A<FutureOr<FutureOr<dynamic>?>>;
+typedef F4 = () → con::A<dynamic>;
+class Check extends core::Object /*hasConstConstructor*/  {
+  final field dynamic _ignored;
+  const constructor •(dynamic x, dynamic y) → self::Check
+    : assert(core::identical(x, y)), self::Check::_ignored = core::identical(x, y) ?{core::int} 42 : 1.{core::num::~/}(0){(core::num) → core::int}, super core::Object::•()
+    ;
+}
+static method expectEqual(dynamic x, dynamic y) → void {
+  if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
+    throw "Arguments were supposed to be identical.";
+  }
+}
+static method test1() → dynamic {
+  core::Type v = #C1;
+  self::expectEqual(#C1, v);
+  self::expectEqual(v, #C1);
+  self::expectEqual(#C1, con::v);
+  self::expectEqual(con::v, #C1);
+  self::expectEqual(#C1, #C1);
+  core::Type vf1 = #C2;
+  core::Type vf2 = #C2;
+  core::Type vf3 = #C2;
+  core::Type vf4 = #C2;
+  core::Type oovf1 = #C2;
+  core::Type oovf2 = #C2;
+  core::Type oovf3 = #C2;
+  core::Type oovf4 = #C2;
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, vf1);
+  self::expectEqual(vf1, vf2);
+  self::expectEqual(vf2, vf3);
+  self::expectEqual(vf3, vf4);
+  self::expectEqual(vf4, oovf1);
+  self::expectEqual(oovf1, oovf2);
+  self::expectEqual(oovf2, oovf3);
+  self::expectEqual(oovf3, oovf4);
+  self::expectEqual(oovf4, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  self::expectEqual(#C2, #C2);
+  return #C5;
+}
+static method main() → dynamic {
+  self::test1();
+}
+
+library;
+import self as con;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef F1 = () →* con::A<FutureOr<dynamic>*>*;
+typedef F2 = () →* con::A<dynamic>*;
+typedef F3 = () →* con::A<FutureOr<FutureOr<dynamic>*>*>*;
+typedef F4 = () →* con::A<dynamic>*;
+class A<X extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → con::A<con::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::Type* c = #C1;
+static field core::Type* v = #C1;
+static const field con::A<core::List<() →* con::A<FutureOr<dynamic>*>*>*>* a1 = #C6;
+static const field con::A<core::List<() →* con::A<dynamic>*>*>* a2 = #C6;
+static const field con::A<core::List<() →* con::A<FutureOr<FutureOr<dynamic>*>*>*>*>* a3 = #C6;
+static const field con::A<core::List<() →* con::A<dynamic>*>*>* a4 = #C6;
+
+constants  {
+  #C1 = TypeLiteralConstant(con::A<dynamic>*)
+  #C2 = TypeLiteralConstant(() →* con::A<dynamic>*)
+  #C3 = 42
+  #C4 = self::Check {_ignored:#C3}
+  #C5 = <dynamic>[#C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4]
+  #C6 = con::A<core::List<() →* con::A<dynamic>*>*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///const_canonical_type.dart:
+- A. (from org-dartlang-testcase:///const_canonical_type_lib.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Check. (from org-dartlang-testcase:///const_canonical_type.dart:11:9)
+
+org-dartlang-testcase:///const_canonical_type_lib.dart:
+- A. (from org-dartlang-testcase:///const_canonical_type_lib.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.modular.expect
new file mode 100644
index 0000000..001ca03
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///const_is_lib.dart";
+
+static method main() → dynamic {
+  self::expect(true, #C1 is{ForNonNullableByDefault} <T extends core::Object?>() → void);
+  self::expect(true, #C2);
+  self::expect(true, #C3 is{ForNonNullableByDefault} <T extends Never = dynamic>() → void);
+  self::expect(true, #C2);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+typedef fnTypeWithNullableObjectBound = <T extends core::Object?>() → void;
+typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
+static method fnWithNonNullObjectBound<T extends core::Object>() → void
+  return null;
+static method fnWithNullBound<T extends Null>() → void
+  return null;
+
+constants  {
+  #C1 = static-tearoff self2::fnWithNonNullObjectBound
+  #C2 = true
+  #C3 = static-tearoff self2::fnWithNullBound
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.modular.expect
new file mode 100644
index 0000000..69b11ec
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.modular.expect
@@ -0,0 +1,144 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "constant_null_is_lib.dart" as con;
+
+import "dart:async";
+import "org-dartlang-testcase:///constant_null_is_lib.dart";
+
+class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::bool field;
+  const constructor constructor1(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
+    ;
+  const constructor constructor2(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class::T?, super core::Object::•()
+    ;
+  const constructor constructor3(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class<self::Class::T%>, super core::Object::•()
+    ;
+  const constructor constructor4(dynamic value) → self::Class<self::Class::T%>
+    : self::Class::field = value is{ForNonNullableByDefault} self::Class<self::Class::T%>?, super core::Object::•()
+    ;
+}
+static final field core::bool isWeakMode = #C1 is{ForNonNullableByDefault} core::List<core::Object>;
+static const field core::bool c0 = #C2;
+static const field core::bool c1 = #C3;
+static const field core::bool c2 = #C2;
+static const field core::bool c3 = #C2;
+static const field core::bool c4 = #C3;
+static const field core::bool c5 = #C2;
+static const field core::bool c6 = #C3;
+static const field core::bool c7 = #C2;
+static const field core::bool c8 = #C2;
+static const field core::bool c9 = #C2;
+static const field core::bool c10 = #C3;
+static const field core::bool c11 = #C2;
+static const field core::bool c12 = #C2;
+static const field self::Class<core::int> e1 = #C4;
+static const field self::Class<core::List<core::int>> e2 = #C5;
+static const field self::Class<Null> e3 = #C6;
+static const field self::Class<core::int> e4 = #C7;
+static const field self::Class<core::int?> e5 = #C8;
+static const field self::Class<Null> e6 = #C6;
+static const field self::Class<core::int> e7 = #C4;
+static const field self::Class<core::int?> e8 = #C9;
+static const field self::Class<Null> e9 = #C10;
+static const field self::Class<core::int> e10 = #C7;
+static const field self::Class<core::int?> e11 = #C8;
+static const field self::Class<Null> e12 = #C6;
+static method main() → dynamic {
+  self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
+  self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
+  self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
+  self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}{core::bool}, #C4.{self::Class::field}{core::bool}, "Class<int>.constructor1(null).field");
+  self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}{core::bool}, "new Class<int?>.constructor1(null).field");
+  self::expect(self::isWeakMode, #C5.{self::Class::field}{core::bool}, "const Class<List<int>>.constructor1(<Null>[null]).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}{core::bool}, #C6.{self::Class::field}{core::bool}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}{core::bool}, #C7.{self::Class::field}{core::bool}, "Class<int>.constructor2(null).field");
+  self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}{core::bool}, "new Class<int?>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}{core::bool}, #C8.{self::Class::field}{core::bool}, "Class<int?>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}{core::bool}, #C6.{self::Class::field}{core::bool}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}{core::bool}, #C4.{self::Class::field}{core::bool}, "Class<int>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}{core::bool}, #C9.{self::Class::field}{core::bool}, "Class<int?>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}{core::bool}, #C9.{self::Class::field}{core::bool}, "Class<int?>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}{core::bool}, #C10.{self::Class::field}{core::bool}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}{core::bool}, #C7.{self::Class::field}{core::bool}, "Class<int>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}{core::bool}, #C8.{self::Class::field}{core::bool}, "Class<int?>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}{core::bool}, #C6.{self::Class::field}{core::bool}, "Class<Null>.constructor4(null).field");
+  con::test();
+}
+static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual} for ${message}";
+}
+
+library;
+import self as con;
+import "constant_null_is.dart" as self;
+import "dart:core" as core;
+
+import "dart:async";
+import "org-dartlang-testcase:///constant_null_is.dart";
+
+static const field core::bool* d0 = #C3;
+static const field core::bool* d1 = #C2;
+static const field self::Class<core::int*>* d4 = #C4;
+static const field self::Class<Null>* d5 = #C6;
+static const field self::Class<core::int*>* d6 = #C7;
+static const field self::Class<Null>* d7 = #C6;
+static const field self::Class<core::int*>* d8 = #C4;
+static const field self::Class<Null>* d9 = #C10;
+static const field self::Class<core::int*>* d10 = #C7;
+static const field self::Class<Null>* d11 = #C6;
+static method test() → dynamic {
+  self::expect(null is core::int*, #C3, "null is int (opt-out)");
+  self::expect(null is Null, #C2, "null is Null");
+  self::expect(new self::Class::constructor1<core::int*>(null).{self::Class::field}{core::bool*}, #C4.{self::Class::field}{core::bool*}, "Class<int>.constructor1(null).field (opt-out)");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}{core::bool*}, #C6.{self::Class::field}{core::bool*}, "Class<Null>.constructor1(null).field (opt-out)");
+  self::expect(new self::Class::constructor2<core::int*>(null).{self::Class::field}{core::bool*}, #C7.{self::Class::field}{core::bool*}, "Class<int>.constructor2(null).field (opt-out)");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}{core::bool*}, #C6.{self::Class::field}{core::bool*}, "Class<Null>.constructor2(null).field (opt-out)");
+  self::expect(new self::Class::constructor3<core::int*>(null).{self::Class::field}{core::bool*}, #C4.{self::Class::field}{core::bool*}, "Class<int>.constructor3(null).field (opt-out)");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}{core::bool*}, #C10.{self::Class::field}{core::bool*}, "Class<Null>.constructor3(null).field (opt-out)");
+  self::expect(new self::Class::constructor4<core::int*>(null).{self::Class::field}{core::bool*}, #C7.{self::Class::field}{core::bool*}, "Class<int>.constructor4(null).field (opt-out)");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}{core::bool*}, #C6.{self::Class::field}{core::bool*}, "Class<Null>.constructor4(null).field (opt-out)");
+}
+
+constants  {
+  #C1 = <Null>[]
+  #C2 = true
+  #C3 = false
+  #C4 = self::Class<core::int*> {field:#C3}
+  #C5 = self::Class<core::List<core::int*>*> {field:#C2}
+  #C6 = self::Class<Null> {field:#C2}
+  #C7 = self::Class<core::int*> {field:#C2}
+  #C8 = self::Class<core::int?> {field:#C2}
+  #C9 = self::Class<core::int?> {field:#C3}
+  #C10 = self::Class<Null> {field:#C3}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constant_null_is.dart:
+- Class.constructor1 (from org-dartlang-testcase:///constant_null_is.dart:39:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Class.constructor2 (from org-dartlang-testcase:///constant_null_is.dart:40:9)
+- Class.constructor3 (from org-dartlang-testcase:///constant_null_is.dart:41:9)
+- Class.constructor4 (from org-dartlang-testcase:///constant_null_is.dart:42:9)
+
+org-dartlang-testcase:///constant_null_is_lib.dart:
+- Class.constructor1 (from org-dartlang-testcase:///constant_null_is.dart:39:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Class.constructor2 (from org-dartlang-testcase:///constant_null_is.dart:40:9)
+- Class.constructor3 (from org-dartlang-testcase:///constant_null_is.dart:41:9)
+- Class.constructor4 (from org-dartlang-testcase:///constant_null_is.dart:42:9)
diff --git a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.modular.expect
new file mode 100644
index 0000000..f72fa11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.modular.expect
@@ -0,0 +1,104 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "constants_lib.dart" as con;
+
+import "org-dartlang-testcase:///constants_lib.dart" as lib;
+
+static const field (core::int) → core::int partialInstantiation = #C2;
+static const field con::Class<core::int> instance = #C4;
+static const field core::List<core::int> listLiteral = #C5;
+static const field core::Set<core::int> setLiteral = #C6;
+static const field core::Map<core::int, core::String> mapLiteral = #C8;
+static const field core::List<core::int> listConcatenation = #C5;
+static const field core::Set<core::int> setConcatenation = #C6;
+static const field core::Map<core::int, core::String> mapConcatenation = #C8;
+static const field core::bool partialInstantiationIdentical = #C9;
+static const field core::bool instanceIdentical = #C9;
+static const field core::bool listLiteralIdentical = #C9;
+static const field core::bool setLiteralIdentical = #C9;
+static const field core::bool mapLiteralIdentical = #C9;
+static const field core::bool listConcatenationIdentical = #C9;
+static const field core::bool setConcatenationIdentical = #C9;
+static const field core::bool mapConcatenationIdentical = #C9;
+static method main() → dynamic {
+  self::test(#C2, #C2);
+  self::test(#C4, #C4);
+  self::test(#C5, #C5);
+  self::test(#C6, #C6);
+  self::test(#C8, #C8);
+  self::test(#C5, #C5);
+  self::test(#C6, #C6);
+  self::test(#C8, #C8);
+  self::test(true, #C9);
+  self::test(true, #C9);
+  self::test(true, #C9);
+  self::test(true, #C9);
+  self::test(true, #C9);
+  self::test(true, #C9);
+  self::test(true, #C9);
+  self::test(true, #C9);
+}
+static method test(dynamic expected, dynamic actual) → dynamic {
+  core::print("test(${expected}, ${actual})");
+  if(!core::identical(expected, actual)) {
+    throw "Expected ${expected}, actual ${actual}";
+  }
+}
+
+library;
+import self as con;
+import "dart:core" as core;
+
+typedef F1<invariant T extends core::Object* = dynamic> = (T*) →* T*;
+typedef F2 = <T extends core::Object* = dynamic>(T*) →* T*;
+class Class<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field con::Class::T* field;
+  const constructor •(con::Class::T* field) → con::Class<con::Class::T*>*
+    : con::Class::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C10;
+static const field (core::int*) →* core::int* partialInstantiation = #C2;
+static const field con::Class<core::int*>* instance = #C4;
+static const field core::List<core::int*>* listLiteral = #C5;
+static const field core::Set<core::int*>* setLiteral = #C6;
+static const field core::Map<core::int*, core::String*>* mapLiteral = #C8;
+static const field core::List<core::int*>* listConcatenation = #C5;
+static const field core::Set<core::int*>* setConcatenation = #C6;
+static const field core::Map<core::int*, core::String*>* mapConcatenation = #C8;
+static method id<T extends core::Object* = dynamic>(con::id::T* t) → con::id::T*
+  return t;
+
+constants  {
+  #C1 = static-tearoff con::id
+  #C2 = instantiation #C1 <core::int*>
+  #C3 = 0
+  #C4 = con::Class<core::int*> {field:#C3}
+  #C5 = <core::int*>[#C3]
+  #C6 = <core::int*>{#C3}
+  #C7 = "foo"
+  #C8 = <core::int*, core::String*>{#C3:#C7)
+  #C9 = true
+  #C10 = static-tearoff core::identical
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constants.dart:
+- Class. (from org-dartlang-testcase:///constants_lib.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+
+org-dartlang-testcase:///constants_lib.dart:
+- Class. (from org-dartlang-testcase:///constants_lib.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..a18752a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart:11:27: Error: The parameter 'cls' of the method 'SubClass.invariant' has type 'SubClass', which does not match the corresponding type, 'Class', in the overridden method, 'Class.invariant'.
+//  - 'SubClass' is from 'pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in_lib.dart'.
+// Change to a supertype of 'Class', or, for a covariant parameter, a subtype.
+//   void invariant(SubClass cls) {} // error
+//                           ^
+// pkg/front_end/testcases/nnbd_mixed/covariant_from_opt_in_lib.dart:9:8: Context: This is the overridden method ('invariant').
+//   void invariant(Class cls);
+//        ^
+//
+import self as self;
+import "covariant_from_opt_in_lib.dart" as cov;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///covariant_from_opt_in_lib.dart";
+
+abstract class _SubClass&Class&Mixin = cov::Class with cov::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_SubClass&Class&Mixin*
+    : super cov::Class::•()
+    ;
+  abstract member-signature method covariant(covariant-by-declaration cov::Class* cls) → void; -> cov::Class::covariant
+  abstract member-signature method invariant(cov::Class* cls) → void; -> cov::Class::invariant
+  abstract member-signature method contravariant(cov::Class* cls) → void; -> cov::Class::contravariant
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubClass extends self::_SubClass&Class&Mixin {
+  synthetic constructor •() → self::SubClass*
+    : super self::_SubClass&Class&Mixin::•()
+    ;
+  method covariant(covariant-by-declaration self::SubClass* cls) → void {}
+  method invariant(self::SubClass* cls) → void {}
+  method contravariant(core::Object* cls) → void {}
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as cov;
+import "dart:core" as core;
+
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class Class extends core::Object {
+  synthetic constructor •() → cov::Class
+    : super core::Object::•()
+    ;
+  abstract method covariant(covariant-by-declaration cov::Class cls) → void;
+  abstract method invariant(cov::Class cls) → void;
+  abstract method contravariant(cov::Class cls) → void;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..83322f3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart:12:7: Error: Generic type 'Hest2' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Fisk2'.
+// Try providing type arguments to 'Fisk2' here or to some other raw types in the bounds along the reference chain.
+// class Hest2<TypeX extends Fisk2> {}
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart:12:13: Context: Bound of this variable references raw type 'Fisk2'.
+// class Hest2<TypeX extends Fisk2> {}
+//             ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef_lib.dart:14:31: Context: Bound of this variable references raw type 'Hest2'.
+// typedef Fisk2 = void Function<TypeY extends Hest2>();
+//                               ^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart:14:9: Error: Generic type 'Fisk1' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest1'.
+// Try providing type arguments to 'Hest1' here or to some other raw types in the bounds along the reference chain.
+// typedef Fisk1 = void Function<TypeY extends Hest1>();
+//         ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef.dart:14:31: Context: Bound of this variable references raw type 'Hest1'.
+// typedef Fisk1 = void Function<TypeY extends Hest1>();
+//                               ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef_lib.dart:12:13: Context: Bound of this variable references raw type 'Fisk1'.
+// class Hest1<TypeX extends Fisk1> {}
+//             ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///cyclic_typedef_lib.dart";
+
+typedef Fisk1 = <TypeY extends core::Object? = dynamic>() → void;
+class Hest2<TypeX extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest2<self::Hest2::TypeX%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/cyclic_typedef_lib.dart:12:13: Error: Type variables can't have generic function types in their bounds.
+// class Hest1<TypeX extends Fisk1> {}
+//             ^^^^^
+//
+import self as self2;
+import "cyclic_typedef.dart" as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///cyclic_typedef.dart";
+
+typedef Fisk2 = <TypeY extends self::Hest2<dynamic> = dynamic>() → void;
+class Hest1<TypeX extends <TypeY extends core::Object? = dynamic>() → void = dynamic> extends core::Object {
+  synthetic constructor •() → self2::Hest1<self2::Hest1::TypeX>
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/error_on_recompile_with_no_change/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/error_on_recompile_with_no_change/main.dart.weak.modular.expect
new file mode 100644
index 0000000..ccc539a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/error_on_recompile_with_no_change/main.dart.weak.modular.expect
@@ -0,0 +1,118 @@
+library;
+import self as self;
+import "object_lib.dart" as obj;
+import "main_lib1.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///object_lib.dart";
+import "org-dartlang-testcase:///main_lib1.dart";
+
+class AdaptorElement extends obj::RenderObject {
+  synthetic constructor •() → self::AdaptorElement*
+    : super obj::RenderObject::•()
+    ;
+  get renderObject() → mai::Adaptor*
+    return super.{obj::RenderObject::renderObject} as{TypeError} mai::Adaptor*;
+  method foo() → void {
+    core::print(this.{self::AdaptorElement::renderObject}{mai::Adaptor*}.{mai::_Adaptor&RenderFoo&LibMixin::constraints}{obj::FooConstraints*}.{obj::FooConstraints::axis}{core::String*});
+  }
+  abstract member-signature get constraints() → obj::Constraints*; -> obj::RenderObject::constraints
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as obj;
+import "dart:core" as core;
+
+class RenderFoo extends obj::RenderObject {
+  synthetic constructor •() → obj::RenderFoo
+    : super obj::RenderObject::•()
+    ;
+  get constraints() → obj::FooConstraints
+    return super.{obj::RenderObject::constraints} as{ForNonNullableByDefault} obj::FooConstraints;
+}
+class FooConstraints extends obj::Constraints {
+  synthetic constructor •() → obj::FooConstraints
+    : super obj::Constraints::•()
+    ;
+  get axis() → core::String
+    return "hello";
+}
+class Constraints extends core::Object {
+  synthetic constructor •() → obj::Constraints
+    : super core::Object::•()
+    ;
+}
+class RenderObject extends core::Object {
+  synthetic constructor •() → obj::RenderObject
+    : super core::Object::•()
+    ;
+  get constraints() → obj::Constraints
+    return new obj::Constraints::•();
+  get renderObject() → obj::RenderObject
+    return this;
+}
+
+library;
+import self as mai;
+import "object_lib.dart" as obj;
+import "main_lib2.dart" as mai2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///object_lib.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class _Adaptor&RenderFoo&LibMixin = obj::RenderFoo with mai2::LibMixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → mai::_Adaptor&RenderFoo&LibMixin*
+    : super obj::RenderFoo::•()
+    ;
+  abstract member-signature get constraints() → obj::FooConstraints*; -> obj::RenderFoo::constraints
+  abstract member-signature get renderObject() → obj::RenderObject*; -> obj::RenderObject::renderObject
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Adaptor extends mai::_Adaptor&RenderFoo&LibMixin {
+  synthetic constructor •() → mai::Adaptor*
+    : super mai::_Adaptor&RenderFoo&LibMixin::•()
+    ;
+}
+
+library;
+import self as mai2;
+import "object_lib.dart" as obj;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///object_lib.dart";
+
+abstract class LibMixin extends obj::RenderObject /*isMixinDeclaration*/  {
+  abstract member-signature get constraints() → obj::Constraints*; -> obj::RenderObject::constraints
+  abstract member-signature get renderObject() → obj::RenderObject*; -> obj::RenderObject::renderObject
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/main.dart.weak.modular.expect
new file mode 100644
index 0000000..d4de37b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/experiment_release_version/main.dart.weak.modular.expect
@@ -0,0 +1,95 @@
+//
+// Problems outside component:
+//
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/allowed_package/lib/versioned_2_8_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.9 or higher.
+// int? versioned_2_8_AllowedPackage; // error
+//    ^
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/allowed_package/lib/versioned_2_8_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.8
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/unversioned_lib.dart:5:4: Error: Null safety features are disabled for this library.
+// Try removing the package language version or setting the language version to 2.10 or higher.
+// int? versionedUnallowedPackage; // error
+//    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/versioned_2_8_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_8_AllowedPackage; // error
+//    ^
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/versioned_2_8_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.8
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_9_AllowedPackage; // error
+//    ^
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/not_allowed_package/lib/versioned_2_9_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "package:allowed_package/unversioned_lib.dart";
+import "package:allowed_package/versioned_2_8_lib.dart";
+import "package:allowed_package/versioned_2_9_lib.dart";
+import "package:allowed_package/versioned_2_10_lib.dart";
+import "package:not_allowed_package/unversioned_lib.dart";
+import "package:not_allowed_package/versioned_2_8_lib.dart";
+import "package:not_allowed_package/versioned_2_9_lib.dart";
+import "package:not_allowed_package/versioned_2_10_lib.dart";
+import "org-dartlang-testcase:///unversioned_lib.dart";
+import "org-dartlang-testcase:///versioned_2_8_lib.dart";
+import "org-dartlang-testcase:///versioned_2_9_lib.dart";
+import "org-dartlang-testcase:///versioned_2_10_lib.dart";
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:core" as core;
+
+static field core::int? unversionedLibrary;
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/versioned_2_8_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_8_Library; // error
+//    ^
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/versioned_2_8_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.8
+// ^^^^^^^^^^^^
+//
+import self as self3;
+import "dart:core" as core;
+
+static field core::int? versioned_2_8_Library;
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/versioned_2_9_lib.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.10 or higher.
+// int? versioned_2_9_Library; // error
+//    ^
+// pkg/front_end/testcases/nnbd_mixed/experiment_release_version/versioned_2_9_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+import self as self4;
+import "dart:core" as core;
+
+static field core::int? versioned_2_9_Library;
+
+library /*isNonNullableByDefault*/;
+import self as self5;
+import "dart:core" as core;
+
+static field core::int? versioned_2_10_Library;
diff --git a/pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..a081994
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart.weak.modular.expect
@@ -0,0 +1,164 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart:6:1: Error: Null safe libraries are not allowed to export declarations from of opt-out libraries.
+// export 'export_from_opt_out_lib1.dart';
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart:10:1: Error: Null safe libraries are not allowed to export declarations from of opt-out libraries.
+// export 'export_from_opt_out_lib2.dart' hide legacyMethod2;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart:13:1: Error: Null safe libraries are not allowed to export declarations from of opt-out libraries.
+// export 'export_from_opt_out_lib3.dart' show LegacyClass2;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart:16:1: Error: Null safe libraries are not allowed to export declarations from of opt-out libraries.
+// export 'export_from_opt_out_lib3.dart' show legacyMethod1;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart:19:1: Error: Null safe libraries are not allowed to export declarations from of opt-out libraries.
+// export 'export_from_opt_out_lib3.dart' show LegacyExtension;
+// ^
+//
+// pkg/front_end/testcases/nnbd_mixed/export_from_opt_out.dart:22:1: Error: Null safe libraries are not allowed to export declarations from of opt-out libraries.
+// export 'export_from_opt_out_lib3.dart' show LegacyTypedef;
+// ^
+//
+import self as self;
+import "export_from_opt_out_lib1.dart" as exp;
+import "export_from_opt_out_lib2.dart" as exp2;
+import "export_from_opt_out_lib3.dart" as exp3;
+import "export_from_opt_out_lib5.dart" as exp4;
+additionalExports = (exp::LegacyClass1,
+  exp2::LegacyClass3,
+  exp2::LegacyClass4,
+  exp3::LegacyClass2,
+  exp3::legacyMethod1,
+  exp3::LegacyExtension,
+  exp3::LegacyTypedef,
+  exp4::NnbdClass1,
+  exp4::NnbdClass2)
+
+export "org-dartlang-testcase:///export_from_opt_out_lib1.dart";
+export "org-dartlang-testcase:///export_from_opt_out_lib2.dart" hide legacyMethod2;
+export "org-dartlang-testcase:///export_from_opt_out_lib3.dart" show LegacyClass2;
+export "org-dartlang-testcase:///export_from_opt_out_lib3.dart" show legacyMethod1;
+export "org-dartlang-testcase:///export_from_opt_out_lib3.dart" show LegacyExtension;
+export "org-dartlang-testcase:///export_from_opt_out_lib3.dart" show LegacyTypedef;
+export "org-dartlang-testcase:///export_from_opt_out_lib3.dart" show NnbdClass1;
+export "org-dartlang-testcase:///export_from_opt_out_lib3.dart" hide LegacyClass2, LegacyExtension, LegacyTypedef, legacyMethod1;
+export "org-dartlang-testcase:///export_from_opt_out_lib4.dart";
+export "org-dartlang-testcase:///export_from_opt_out_lib5.dart";
+
+static method main() → dynamic {}
+
+library;
+import self as exp;
+import "dart:core" as core;
+
+class LegacyClass1 extends core::Object {
+  synthetic constructor •() → exp::LegacyClass1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library;
+import self as exp2;
+import "dart:core" as core;
+
+class LegacyClass3 extends core::Object {
+  synthetic constructor •() → exp2::LegacyClass3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass4 extends core::Object {
+  synthetic constructor •() → exp2::LegacyClass4*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method legacyMethod2() → dynamic {}
+
+library;
+import self as exp3;
+import "dart:core" as core;
+import "export_from_opt_out_lib5.dart" as exp4;
+additionalExports = (exp4::NnbdClass1,
+  exp4::NnbdClass2)
+
+export "org-dartlang-testcase:///export_from_opt_out_lib5.dart";
+
+typedef LegacyTypedef = () →* void;
+class LegacyClass2 extends core::Object {
+  synthetic constructor •() → exp3::LegacyClass2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension LegacyExtension on core::String* {
+}
+static method legacyMethod1() → dynamic {}
+
+library;
+import self as self2;
+import "export_from_opt_out_lib5.dart" as exp4;
+additionalExports = (exp4::NnbdClass1,
+  exp4::NnbdClass2)
+
+export "org-dartlang-testcase:///export_from_opt_out_lib5.dart";
+
+
+library /*isNonNullableByDefault*/;
+import self as exp4;
+import "dart:core" as core;
+
+class NnbdClass1 extends core::Object {
+  synthetic constructor •() → exp4::NnbdClass1
+    : super core::Object::•()
+    ;
+}
+class NnbdClass2 extends core::Object {
+  synthetic constructor •() → exp4::NnbdClass2
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.modular.expect
new file mode 100644
index 0000000..ab022ec
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/flutter_issue_63029/flutter_issue_63029.dart.weak.modular.expect
@@ -0,0 +1,76 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "flutter_issue_63029_lib1.dart" as flu;
+import "flutter_issue_63029_lib2.dart" as flu2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///flutter_issue_63029_lib1.dart";
+import "org-dartlang-testcase:///flutter_issue_63029_lib2.dart";
+
+class E extends flu::A {
+  synthetic constructor •() → self::E
+    : super flu::A::•()
+    ;
+}
+abstract class _F&B&D = flu::B<self::E> with flu2::D<self::E> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_F&B&D
+    : super flu::B::•()
+    ;
+  abstract member-signature operator /*isLegacy*/ ==(dynamic other) → core::bool*; -> core::Object::==
+}
+class F extends self::_F&B&D {
+  synthetic constructor •() → self::F
+    : super self::_F&B&D::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as flu;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → flu::A
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends flu::A> extends core::Object {
+  synthetic constructor •() → flu::B<flu::B::T>
+    : super core::Object::•()
+    ;
+}
+
+library;
+import self as flu2;
+import "dart:core" as core;
+import "flutter_issue_63029_lib1.dart" as flu;
+
+import "org-dartlang-testcase:///flutter_issue_63029_lib1.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → flu2::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D<T extends flu::A*> extends flu::B<flu2::D::T*> implements flu2::C /*isMixinDeclaration*/  {
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.modular.expect
new file mode 100644
index 0000000..71759ac
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/generic_override.dart.weak.modular.expect
@@ -0,0 +1,199 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/generic_override.dart:39:8: Error: Declared bound 'Object?' of type variable 'T' of 'Class2.method4b' doesn't match the bound 'Object' on overridden method 'Class1.method4b'.
+//  - 'Object' is from 'dart:core'.
+//   void method4b<T extends Object?>(); // error
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/generic_override.dart:19:8: Context: This is the overridden method ('method4b').
+//   void method4b<T extends Object>();
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/generic_override.dart:40:8: Error: Declared bound 'Object' of type variable 'T' of 'Class2.method4c' doesn't match the bound 'Object?' on overridden method 'Class1.method4c'.
+//  - 'Object' is from 'dart:core'.
+//   void method4c<T extends Object>(); // error
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/generic_override.dart:20:8: Context: This is the overridden method ('method4c').
+//   void method4c<T extends Object?>();
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/generic_override.dart:43:8: Error: Declared bound 'Class1?' of type variable 'T' of 'Class2.method5b' doesn't match the bound 'Class1' on overridden method 'Class1.method5b'.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd_mixed/generic_override.dart'.
+//   void method5b<T extends Class1?>(); // error
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/generic_override.dart:23:8: Context: This is the overridden method ('method5b').
+//   void method5b<T extends Class1>();
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/generic_override.dart:44:8: Error: Declared bound 'Class1' of type variable 'T' of 'Class2.method5c' doesn't match the bound 'Class1?' on overridden method 'Class1.method5c'.
+//  - 'Class1' is from 'pkg/front_end/testcases/nnbd_mixed/generic_override.dart'.
+//   void method5c<T extends Class1>(); // error
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/generic_override.dart:24:8: Context: This is the overridden method ('method5c').
+//   void method5c<T extends Class1?>();
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+import "generic_override_lib.dart" as gen;
+
+import "org-dartlang-testcase:///generic_override_lib.dart";
+
+abstract class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  abstract method method1a<T extends core::Object? = dynamic>() → void;
+  abstract method method1b<T extends core::Object? = dynamic>() → void;
+  abstract method method1c<T extends core::Object? = dynamic>() → void;
+  abstract method method2a<T extends core::Object?>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends core::Object?>() → void;
+  abstract method method3a<T extends dynamic>() → void;
+  abstract method method3b<T extends dynamic>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object>() → void;
+  abstract method method4c<T extends core::Object?>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1>() → void;
+  abstract method method5c<T extends self::Class1?>() → void;
+}
+abstract class Class2 extends self::Class1 {
+  synthetic constructor •() → self::Class2
+    : super self::Class1::•()
+    ;
+  abstract method method1a<T extends core::Object? = dynamic>() → void;
+  abstract method method1b<T extends core::Object?>() → void;
+  abstract method method1c<T extends dynamic>() → void;
+  abstract method method2a<T extends core::Object? = dynamic>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends dynamic>() → void;
+  abstract method method3a<T extends core::Object? = dynamic>() → void;
+  abstract method method3b<T extends core::Object?>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object?>() → void;
+  abstract method method4c<T extends core::Object>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1?>() → void;
+  abstract method method5c<T extends self::Class1>() → void;
+}
+abstract class Class3 extends gen::LegacyClass1 {
+  synthetic constructor •() → self::Class3
+    : super gen::LegacyClass1::•()
+    ;
+  abstract method method1a<T extends core::Object? = dynamic>() → void;
+  abstract method method1b<T extends core::Object?>() → void;
+  abstract method method1c<T extends dynamic>() → void;
+  abstract method method2a<T extends core::Object? = dynamic>() → void;
+  abstract method method2b<T extends core::Object?>() → void;
+  abstract method method2c<T extends dynamic>() → void;
+  abstract method method3a<T extends core::Object? = dynamic>() → void;
+  abstract method method3b<T extends core::Object?>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object>() → void;
+  abstract method method4b<T extends core::Object?>() → void;
+  abstract method method4c<T extends core::Object>() → void;
+  abstract method method5a<T extends self::Class1>() → void;
+  abstract method method5b<T extends self::Class1?>() → void;
+  abstract method method5c<T extends self::Class1>() → void;
+}
+static method main() → dynamic {}
+
+library;
+import self as gen;
+import "dart:core" as core;
+import "generic_override.dart" as self;
+
+import "org-dartlang-testcase:///generic_override.dart";
+
+abstract class LegacyClass1 extends core::Object {
+  synthetic constructor •() → gen::LegacyClass1*
+    : super core::Object::•()
+    ;
+  abstract method method1a<T extends core::Object* = dynamic>() → void;
+  abstract method method1b<T extends core::Object* = dynamic>() → void;
+  abstract method method1c<T extends core::Object* = dynamic>() → void;
+  abstract method method2a<T extends core::Object*>() → void;
+  abstract method method2b<T extends core::Object*>() → void;
+  abstract method method2c<T extends core::Object*>() → void;
+  abstract method method3a<T extends dynamic>() → void;
+  abstract method method3b<T extends dynamic>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object*>() → void;
+  abstract method method4b<T extends core::Object*>() → void;
+  abstract method method4c<T extends core::Object*>() → void;
+  abstract method method5a<T extends self::Class1*>() → void;
+  abstract method method5b<T extends self::Class1*>() → void;
+  abstract method method5c<T extends self::Class1*>() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class LegacyClass2 extends self::Class1 {
+  synthetic constructor •() → gen::LegacyClass2*
+    : super self::Class1::•()
+    ;
+  abstract method method1a<T extends core::Object* = dynamic>() → void;
+  abstract method method1b<T extends core::Object*>() → void;
+  abstract method method1c<T extends dynamic>() → void;
+  abstract method method2a<T extends core::Object* = dynamic>() → void;
+  abstract method method2b<T extends core::Object*>() → void;
+  abstract method method2c<T extends dynamic>() → void;
+  abstract method method3a<T extends core::Object* = dynamic>() → void;
+  abstract method method3b<T extends core::Object*>() → void;
+  abstract method method3c<T extends dynamic>() → void;
+  abstract method method4a<T extends core::Object*>() → void;
+  abstract method method4b<T extends core::Object*>() → void;
+  abstract method method4c<T extends core::Object*>() → void;
+  abstract method method5a<T extends self::Class1*>() → void;
+  abstract method method5b<T extends self::Class1*>() → void;
+  abstract method method5c<T extends self::Class1*>() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class LegacyClass3 extends self::Class1 {
+  synthetic constructor •() → gen::LegacyClass3*
+    : super self::Class1::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method method1a<T extends core::Object* = dynamic>() → void; -> self::Class1::method1a
+  abstract member-signature method method1b<T extends core::Object* = dynamic>() → void; -> self::Class1::method1b
+  abstract member-signature method method1c<T extends core::Object* = dynamic>() → void; -> self::Class1::method1c
+  abstract member-signature method method2a<T extends core::Object*>() → void; -> self::Class1::method2a
+  abstract member-signature method method2b<T extends core::Object*>() → void; -> self::Class1::method2b
+  abstract member-signature method method2c<T extends core::Object*>() → void; -> self::Class1::method2c
+  abstract member-signature method method4a<T extends core::Object*>() → void; -> self::Class1::method4a
+  abstract member-signature method method4b<T extends core::Object*>() → void; -> self::Class1::method4b
+  abstract member-signature method method4c<T extends core::Object*>() → void; -> self::Class1::method4c
+  abstract member-signature method method5a<T extends self::Class1*>() → void; -> self::Class1::method5a
+  abstract member-signature method method5b<T extends self::Class1*>() → void; -> self::Class1::method5b
+  abstract member-signature method method5c<T extends self::Class1*>() → void; -> self::Class1::method5c
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_field.dart.weak.modular.expect
new file mode 100644
index 0000000..bb1a80e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_field.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class AbstractSuper extends core::Object {
+  field core::int extendedConcreteField = 0;
+  field core::int declaredConcreteExtendsConcreteField = 0;
+  field core::int declaredAbstractExtendsConcreteField = 0;
+  synthetic constructor •() → self::AbstractSuper
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractField() → core::int;
+  abstract set extendedAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredConcreteExtendsAbstractField() → core::int;
+  abstract set declaredConcreteExtendsAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractExtendsAbstractField() → core::int;
+  abstract set declaredAbstractExtendsAbstractField(core::int #externalFieldValue) → void;
+}
+abstract class AbstractClass extends self::AbstractSuper {
+  field core::int declaredConcreteField = 0;
+  field core::int declaredConcreteExtendsConcreteField = 0;
+  field core::int declaredConcreteExtendsAbstractField = 0;
+  synthetic constructor •() → self::AbstractClass
+    : super self::AbstractSuper::•()
+    ;
+  abstract get declaredAbstractField() → core::int;
+  abstract set declaredAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractExtendsConcreteField() → core::int;
+  abstract set declaredAbstractExtendsConcreteField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractExtendsAbstractField() → core::int;
+  abstract set declaredAbstractExtendsAbstractField(core::int #externalFieldValue) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_final_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_final_field.dart.weak.modular.expect
new file mode 100644
index 0000000..f4368dd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_final_field.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class AbstractSuper extends core::Object {
+  final field core::int extendedConcreteField = 0;
+  final field core::int declaredConcreteExtendsConcreteField = 0;
+  final field core::int declaredAbstractExtendsConcreteField = 0;
+  synthetic constructor •() → self::AbstractSuper
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractField() → core::int;
+  abstract get declaredConcreteExtendsAbstractField() → core::int;
+  abstract get declaredAbstractExtendsAbstractField() → core::int;
+}
+abstract class AbstractClass extends self::AbstractSuper {
+  final field core::int declaredConcreteField = 0;
+  final field core::int declaredConcreteExtendsConcreteField = 0;
+  final field core::int declaredConcreteExtendsAbstractField = 0;
+  synthetic constructor •() → self::AbstractClass
+    : super self::AbstractSuper::•()
+    ;
+  abstract get declaredAbstractField() → core::int;
+  abstract get declaredAbstractExtendsConcreteField() → core::int;
+  abstract get declaredAbstractExtendsAbstractField() → core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_getter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..bd5fdb7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_getter.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class AbstractSuper extends core::Object {
+  synthetic constructor •() → self::AbstractSuper
+    : super core::Object::•()
+    ;
+  get extendedConcreteGetter() → core::int
+    return 0;
+  abstract get extendedAbstractGetter() → core::int;
+  get declaredConcreteExtendsConcreteGetter() → core::int
+    return 0;
+  get declaredAbstractExtendsConcreteGetter() → core::int
+    return 0;
+  abstract get declaredConcreteExtendsAbstractGetter() → core::int;
+  abstract get declaredAbstractExtendsAbstractGetter() → core::int;
+}
+abstract class AbstractClass extends self::AbstractSuper {
+  synthetic constructor •() → self::AbstractClass
+    : super self::AbstractSuper::•()
+    ;
+  get declaredConcreteGetter() → core::int
+    return 0;
+  abstract get declaredAbstractGetter() → core::int;
+  get declaredConcreteExtendsConcreteGetter() → core::int
+    return 0;
+  abstract get declaredAbstractExtendsConcreteGetter() → core::int;
+  get declaredConcreteExtendsAbstractGetter() → core::int
+    return 0;
+  abstract get declaredAbstractExtendsAbstractGetter() → core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_method.dart.weak.modular.expect
new file mode 100644
index 0000000..4f4c28e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_method.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class AbstractSuper extends core::Object {
+  synthetic constructor •() → self::AbstractSuper
+    : super core::Object::•()
+    ;
+  method extendedConcreteMethod() → void {}
+  abstract method extendedAbstractMethod() → void;
+  method declaredConcreteExtendsConcreteMethod() → void {}
+  method declaredAbstractExtendsConcreteMethod() → void {}
+  abstract method declaredConcreteExtendsAbstractMethod() → void;
+  abstract method declaredAbstractExtendsAbstractMethod() → void;
+}
+abstract class AbstractClass extends self::AbstractSuper {
+  synthetic constructor •() → self::AbstractClass
+    : super self::AbstractSuper::•()
+    ;
+  method declaredConcreteMethod() → void {}
+  abstract method declaredAbstractMethod() → void;
+  method declaredConcreteExtendsConcreteMethod() → void {}
+  abstract method declaredAbstractExtendsConcreteMethod() → void;
+  method declaredConcreteExtendsAbstractMethod() → void {}
+  abstract method declaredAbstractExtendsAbstractMethod() → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..c43f685
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_extends_setter.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class AbstractSuper extends core::Object {
+  synthetic constructor •() → self::AbstractSuper
+    : super core::Object::•()
+    ;
+  set extendedConcreteSetter(core::int value) → void {}
+  abstract set extendedAbstractSetter(core::int value) → void;
+  set declaredConcreteExtendsConcreteSetter(core::int value) → void {}
+  set declaredAbstractExtendsConcreteSetter(core::int value) → void {}
+  abstract set declaredConcreteExtendsAbstractSetter(core::int value) → void;
+  abstract set declaredAbstractExtendsAbstractSetter(core::int value) → void;
+}
+abstract class AbstractClass extends self::AbstractSuper {
+  synthetic constructor •() → self::AbstractClass
+    : super self::AbstractSuper::•()
+    ;
+  set declaredConcreteSetter(core::int value) → void {}
+  abstract set declaredAbstractSetter(core::int value) → void;
+  set declaredConcreteExtendsConcreteSetter(core::int value) → void {}
+  abstract set declaredAbstractExtendsConcreteSetter(core::int value) → void;
+  set declaredConcreteExtendsAbstractSetter(core::int value) → void {}
+  abstract set declaredAbstractExtendsAbstractSetter(core::int value) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_field.dart.weak.modular.expect
new file mode 100644
index 0000000..0cdcd41
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_field.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  field core::int implementedConcreteField = 0;
+  field core::int declaredConcreteImplementsConcreteField = 0;
+  field core::int declaredAbstractImplementsConcreteField = 0;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get implementedAbstractField() → core::int;
+  abstract set implementedAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredConcreteImplementsAbstractField() → core::int;
+  abstract set declaredConcreteImplementsAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractImplementsAbstractField() → core::int;
+  abstract set declaredAbstractImplementsAbstractField(core::int #externalFieldValue) → void;
+}
+abstract class AbstractClass extends core::Object implements self::Interface {
+  field core::int declaredConcreteField = 0;
+  field core::int declaredConcreteImplementsConcreteField = 0;
+  field core::int declaredConcreteImplementsAbstractField = 0;
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  abstract get declaredAbstractField() → core::int;
+  abstract set declaredAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractImplementsConcreteField() → core::int;
+  abstract set declaredAbstractImplementsConcreteField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractImplementsAbstractField() → core::int;
+  abstract set declaredAbstractImplementsAbstractField(core::int #externalFieldValue) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_final_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_final_field.dart.weak.modular.expect
new file mode 100644
index 0000000..e1f92ea
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_final_field.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  final field core::int implementedConcreteField = 0;
+  final field core::int declaredConcreteImplementsConcreteField = 0;
+  final field core::int declaredAbstractImplementsConcreteField = 0;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get implementedAbstractField() → core::int;
+  abstract get declaredConcreteImplementsAbstractField() → core::int;
+  abstract get declaredAbstractImplementsAbstractField() → core::int;
+}
+abstract class AbstractClass extends core::Object implements self::Interface {
+  final field core::int declaredConcreteField = 0;
+  final field core::int declaredConcreteImplementsConcreteField = 0;
+  final field core::int declaredConcreteImplementsAbstractField = 0;
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  abstract get declaredAbstractField() → core::int;
+  abstract get declaredAbstractImplementsConcreteField() → core::int;
+  abstract get declaredAbstractImplementsAbstractField() → core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_getter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..60896ad
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_getter.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  get implementedConcreteGetter() → core::int
+    return 0;
+  abstract get implementedAbstractGetter() → core::int;
+  get declaredConcreteImplementsConcreteGetter() → core::int
+    return 0;
+  get declaredAbstractImplementsConcreteGetter() → core::int
+    return 0;
+  abstract get declaredConcreteImplementsAbstractGetter() → core::int;
+  abstract get declaredAbstractImplementsAbstractGetter() → core::int;
+}
+abstract class AbstractClass extends core::Object implements self::Interface {
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  get declaredConcreteGetter() → core::int
+    return 0;
+  abstract get declaredAbstractGetter() → core::int;
+  get declaredConcreteImplementsConcreteGetter() → core::int
+    return 0;
+  abstract get declaredAbstractImplementsConcreteGetter() → core::int;
+  get declaredConcreteImplementsAbstractGetter() → core::int
+    return 0;
+  abstract get declaredAbstractImplementsAbstractGetter() → core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_method.dart.weak.modular.expect
new file mode 100644
index 0000000..fb0c37a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_method.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  method implementedConcreteMethod() → void {}
+  abstract method implementedAbstractMethod() → void;
+  method declaredConcreteImplementsConcreteMethod() → void {}
+  method declaredAbstractImplementsConcreteMethod() → void {}
+  abstract method declaredConcreteImplementsAbstractMethod() → void;
+  abstract method declaredAbstractImplementsAbstractMethod() → void;
+}
+abstract class AbstractClass extends core::Object implements self::Interface {
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  method declaredConcreteMethod() → void {}
+  abstract method declaredAbstractMethod() → void;
+  method declaredConcreteImplementsConcreteMethod() → void {}
+  abstract method declaredAbstractImplementsConcreteMethod() → void;
+  method declaredConcreteImplementsAbstractMethod() → void {}
+  abstract method declaredAbstractImplementsAbstractMethod() → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..59931d6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_implements_setter.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  set implementedConcreteSetter(core::int value) → void {}
+  abstract set implementedAbstractSetter(core::int value) → void;
+  set declaredConcreteImplementsConcreteSetter(core::int value) → void {}
+  set declaredAbstractImplementsConcreteSetter(core::int value) → void {}
+  abstract set declaredConcreteImplementsAbstractSetter(core::int value) → void;
+  abstract set declaredAbstractImplementsAbstractSetter(core::int value) → void;
+}
+abstract class AbstractClass extends core::Object implements self::Interface {
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  set declaredConcreteSetter(core::int value) → void {}
+  abstract set declaredAbstractSetter(core::int value) → void;
+  set declaredConcreteImplementsConcreteSetter(core::int value) → void {}
+  abstract set declaredAbstractImplementsConcreteSetter(core::int value) → void;
+  set declaredConcreteImplementsAbstractSetter(core::int value) → void {}
+  abstract set declaredAbstractImplementsAbstractSetter(core::int value) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..a86bf71
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedConcreteMixedInAbstractMethod() → void {}
+  method extendedConcreteMixedInConcreteMethod() → void {}
+  method extendedConcreteMixedInAbstractImplementedMethod(core::int i) → void {}
+  method extendedConcreteMixedInConcreteImplementedMethod(core::int i) → void {}
+}
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  method extendedConcreteMixedInAbstractImplementedMethod(covariant-by-declaration core::num i) → void {}
+  method extendedConcreteMixedInConcreteImplementedMethod(covariant-by-declaration core::num i) → void {}
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+  abstract method extendedConcreteMixedInAbstractMethod() → void;
+  method extendedConcreteMixedInConcreteMethod() → void {}
+  abstract method extendedConcreteMixedInAbstractImplementedMethod(core::int i) → void;
+  method extendedConcreteMixedInConcreteImplementedMethod(core::int i) → void {}
+}
+class Class = self::Super with self::Mixin implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  mixin-super-stub method extendedConcreteMixedInConcreteMethod() → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
+  forwarding-stub method extendedConcreteMixedInAbstractImplementedMethod(covariant-by-declaration core::int i) → void
+    return super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(i);
+  forwarding-stub method extendedConcreteMixedInConcreteImplementedMethod(covariant-by-declaration core::int i) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteImplementedMethod}(i);
+}
+class Sub extends self::Class {
+  synthetic constructor •() → self::Sub
+    : super self::Class::•()
+    ;
+  method test() → void {
+    this.{self::Class::extendedConcreteMixedInAbstractMethod}(){() → void};
+    super.{self::Super::extendedConcreteMixedInAbstractMethod}();
+    this.{self::Class::extendedConcreteMixedInConcreteMethod}(){() → void};
+    super.{self::Class::extendedConcreteMixedInConcreteMethod}();
+    this.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0){(core::int) → void};
+    super.{self::Class::extendedConcreteMixedInAbstractImplementedMethod}(0);
+    this.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0){(core::int) → void};
+    super.{self::Class::extendedConcreteMixedInConcreteImplementedMethod}(0);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart.weak.modular.expect
new file mode 100644
index 0000000..2697e8e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart.weak.modular.expect
@@ -0,0 +1,104 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:5:7: Error: The non-abstract class 'ConcreteSuper' is missing implementations for these members:
+//  - ConcreteSuper.declaredAbstractExtendsAbstractField
+//  - ConcreteSuper.declaredAbstractExtendsAbstractField=
+//  - ConcreteSuper.declaredConcreteExtendsAbstractField
+//  - ConcreteSuper.declaredConcreteExtendsAbstractField=
+//  - ConcreteSuper.extendedAbstractField
+//  - ConcreteSuper.extendedAbstractField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:16:16: Context: 'ConcreteSuper.declaredAbstractExtendsAbstractField' is defined here.
+//   abstract int declaredAbstractExtendsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:16:16: Context: 'ConcreteSuper.declaredAbstractExtendsAbstractField=' is defined here.
+//   abstract int declaredAbstractExtendsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:14:16: Context: 'ConcreteSuper.declaredConcreteExtendsAbstractField' is defined here.
+//   abstract int declaredConcreteExtendsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:14:16: Context: 'ConcreteSuper.declaredConcreteExtendsAbstractField=' is defined here.
+//   abstract int declaredConcreteExtendsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:8:16: Context: 'ConcreteSuper.extendedAbstractField' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:8:16: Context: 'ConcreteSuper.extendedAbstractField=' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractExtendsAbstractField
+//  - ConcreteClass.declaredAbstractExtendsAbstractField=
+//  - ConcreteClass.declaredAbstractField
+//  - ConcreteClass.declaredAbstractField=
+//  - ConcreteSuper.extendedAbstractField
+//  - ConcreteSuper.extendedAbstractField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:30:16: Context: 'ConcreteClass.declaredAbstractExtendsAbstractField' is defined here.
+//   abstract int declaredAbstractExtendsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:30:16: Context: 'ConcreteClass.declaredAbstractExtendsAbstractField=' is defined here.
+//   abstract int declaredAbstractExtendsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:22:16: Context: 'ConcreteClass.declaredAbstractField' is defined here.
+//   abstract int declaredAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:22:16: Context: 'ConcreteClass.declaredAbstractField=' is defined here.
+//   abstract int declaredAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:8:16: Context: 'ConcreteSuper.extendedAbstractField' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_field.dart:8:16: Context: 'ConcreteSuper.extendedAbstractField=' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class ConcreteSuper extends core::Object {
+  field core::int extendedConcreteField = 0;
+  field core::int declaredConcreteExtendsConcreteField = 0;
+  field core::int declaredAbstractExtendsConcreteField = 0;
+  synthetic constructor •() → self::ConcreteSuper
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractField() → core::int;
+  abstract set extendedAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredConcreteExtendsAbstractField() → core::int;
+  abstract set declaredConcreteExtendsAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractExtendsAbstractField() → core::int;
+  abstract set declaredAbstractExtendsAbstractField(core::int #externalFieldValue) → void;
+}
+class ConcreteClass extends self::ConcreteSuper {
+  field core::int declaredConcreteField = 0;
+  field core::int declaredConcreteExtendsConcreteField = 0;
+  field core::int declaredConcreteExtendsAbstractField = 0;
+  synthetic constructor •() → self::ConcreteClass
+    : super self::ConcreteSuper::•()
+    ;
+  abstract get declaredAbstractField() → core::int;
+  abstract set declaredAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractExtendsConcreteField() → core::int;
+  abstract set declaredAbstractExtendsConcreteField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractExtendsAbstractField() → core::int;
+  abstract set declaredAbstractExtendsAbstractField(core::int #externalFieldValue) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart.weak.modular.expect
new file mode 100644
index 0000000..4b81a56
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart:5:7: Error: The non-abstract class 'ConcreteSuper' is missing implementations for these members:
+//  - ConcreteSuper.declaredAbstractExtendsAbstractField
+//  - ConcreteSuper.declaredConcreteExtendsAbstractField
+//  - ConcreteSuper.extendedAbstractField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart:16:22: Context: 'ConcreteSuper.declaredAbstractExtendsAbstractField' is defined here.
+//   abstract final int declaredAbstractExtendsAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart:14:22: Context: 'ConcreteSuper.declaredConcreteExtendsAbstractField' is defined here.
+//   abstract final int declaredConcreteExtendsAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart:8:22: Context: 'ConcreteSuper.extendedAbstractField' is defined here.
+//   abstract final int extendedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractExtendsAbstractField
+//  - ConcreteClass.declaredAbstractField
+//  - ConcreteSuper.extendedAbstractField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart:30:22: Context: 'ConcreteClass.declaredAbstractExtendsAbstractField' is defined here.
+//   abstract final int declaredAbstractExtendsAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart:22:22: Context: 'ConcreteClass.declaredAbstractField' is defined here.
+//   abstract final int declaredAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_final_field.dart:8:22: Context: 'ConcreteSuper.extendedAbstractField' is defined here.
+//   abstract final int extendedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class ConcreteSuper extends core::Object {
+  final field core::int extendedConcreteField = 0;
+  final field core::int declaredConcreteExtendsConcreteField = 0;
+  final field core::int declaredAbstractExtendsConcreteField = 0;
+  synthetic constructor •() → self::ConcreteSuper
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractField() → core::int;
+  abstract get declaredConcreteExtendsAbstractField() → core::int;
+  abstract get declaredAbstractExtendsAbstractField() → core::int;
+}
+class ConcreteClass extends self::ConcreteSuper {
+  final field core::int declaredConcreteField = 0;
+  final field core::int declaredConcreteExtendsConcreteField = 0;
+  final field core::int declaredConcreteExtendsAbstractField = 0;
+  synthetic constructor •() → self::ConcreteClass
+    : super self::ConcreteSuper::•()
+    ;
+  abstract get declaredAbstractField() → core::int;
+  abstract get declaredAbstractExtendsConcreteField() → core::int;
+  abstract get declaredAbstractExtendsAbstractField() → core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..626d8af
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart.weak.modular.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart:5:7: Error: The non-abstract class 'ConcreteSuper' is missing implementations for these members:
+//  - ConcreteSuper.declaredAbstractExtendsAbstractGetter
+//  - ConcreteSuper.declaredConcreteExtendsAbstractGetter
+//  - ConcreteSuper.extendedAbstractGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart:16:11: Context: 'ConcreteSuper.declaredAbstractExtendsAbstractGetter' is defined here.
+//   int get declaredAbstractExtendsAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart:14:11: Context: 'ConcreteSuper.declaredConcreteExtendsAbstractGetter' is defined here.
+//   int get declaredConcreteExtendsAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart:8:11: Context: 'ConcreteSuper.extendedAbstractGetter' is defined here.
+//   int get extendedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractExtendsAbstractGetter
+//  - ConcreteClass.declaredAbstractGetter
+//  - ConcreteSuper.extendedAbstractGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart:30:11: Context: 'ConcreteClass.declaredAbstractExtendsAbstractGetter' is defined here.
+//   int get declaredAbstractExtendsAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart:22:11: Context: 'ConcreteClass.declaredAbstractGetter' is defined here.
+//   int get declaredAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_getter.dart:8:11: Context: 'ConcreteSuper.extendedAbstractGetter' is defined here.
+//   int get extendedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class ConcreteSuper extends core::Object {
+  synthetic constructor •() → self::ConcreteSuper
+    : super core::Object::•()
+    ;
+  get extendedConcreteGetter() → core::int
+    return 0;
+  abstract get extendedAbstractGetter() → core::int;
+  get declaredConcreteExtendsConcreteGetter() → core::int
+    return 0;
+  get declaredAbstractExtendsConcreteGetter() → core::int
+    return 0;
+  abstract get declaredConcreteExtendsAbstractGetter() → core::int;
+  abstract get declaredAbstractExtendsAbstractGetter() → core::int;
+}
+class ConcreteClass extends self::ConcreteSuper {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::ConcreteSuper::•()
+    ;
+  get declaredConcreteGetter() → core::int
+    return 0;
+  abstract get declaredAbstractGetter() → core::int;
+  get declaredConcreteExtendsConcreteGetter() → core::int
+    return 0;
+  abstract get declaredAbstractExtendsConcreteGetter() → core::int;
+  get declaredConcreteExtendsAbstractGetter() → core::int
+    return 0;
+  abstract get declaredAbstractExtendsAbstractGetter() → core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart.weak.modular.expect
new file mode 100644
index 0000000..0eba0b9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart:5:7: Error: The non-abstract class 'ConcreteSuper' is missing implementations for these members:
+//  - ConcreteSuper.declaredAbstractExtendsAbstractMethod
+//  - ConcreteSuper.declaredConcreteExtendsAbstractMethod
+//  - ConcreteSuper.extendedAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart:16:8: Context: 'ConcreteSuper.declaredAbstractExtendsAbstractMethod' is defined here.
+//   void declaredAbstractExtendsAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart:14:8: Context: 'ConcreteSuper.declaredConcreteExtendsAbstractMethod' is defined here.
+//   void declaredConcreteExtendsAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart:8:8: Context: 'ConcreteSuper.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractExtendsAbstractMethod
+//  - ConcreteClass.declaredAbstractMethod
+//  - ConcreteSuper.extendedAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart:30:8: Context: 'ConcreteClass.declaredAbstractExtendsAbstractMethod' is defined here.
+//   void declaredAbstractExtendsAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart:22:8: Context: 'ConcreteClass.declaredAbstractMethod' is defined here.
+//   void declaredAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_method.dart:8:8: Context: 'ConcreteSuper.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class ConcreteSuper extends core::Object {
+  synthetic constructor •() → self::ConcreteSuper
+    : super core::Object::•()
+    ;
+  method extendedConcreteMethod() → void {}
+  abstract method extendedAbstractMethod() → void;
+  method declaredConcreteExtendsConcreteMethod() → void {}
+  method declaredAbstractExtendsConcreteMethod() → void {}
+  abstract method declaredConcreteExtendsAbstractMethod() → void;
+  abstract method declaredAbstractExtendsAbstractMethod() → void;
+}
+class ConcreteClass extends self::ConcreteSuper {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::ConcreteSuper::•()
+    ;
+  method declaredConcreteMethod() → void {}
+  abstract method declaredAbstractMethod() → void;
+  method declaredConcreteExtendsConcreteMethod() → void {}
+  abstract method declaredAbstractExtendsConcreteMethod() → void;
+  method declaredConcreteExtendsAbstractMethod() → void {}
+  abstract method declaredAbstractExtendsAbstractMethod() → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..2df220c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart:5:7: Error: The non-abstract class 'ConcreteSuper' is missing implementations for these members:
+//  - ConcreteSuper.declaredAbstractExtendsAbstractSetter=
+//  - ConcreteSuper.declaredConcreteExtendsAbstractSetter=
+//  - ConcreteSuper.extendedAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart:16:12: Context: 'ConcreteSuper.declaredAbstractExtendsAbstractSetter=' is defined here.
+//   void set declaredAbstractExtendsAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart:14:12: Context: 'ConcreteSuper.declaredConcreteExtendsAbstractSetter=' is defined here.
+//   void set declaredConcreteExtendsAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart:8:12: Context: 'ConcreteSuper.extendedAbstractSetter=' is defined here.
+//   void set extendedAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractExtendsAbstractSetter=
+//  - ConcreteClass.declaredAbstractSetter=
+//  - ConcreteSuper.extendedAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends ConcreteSuper {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart:30:12: Context: 'ConcreteClass.declaredAbstractExtendsAbstractSetter=' is defined here.
+//   void set declaredAbstractExtendsAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart:22:12: Context: 'ConcreteClass.declaredAbstractSetter=' is defined here.
+//   void set declaredAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_extends_setter.dart:8:12: Context: 'ConcreteSuper.extendedAbstractSetter=' is defined here.
+//   void set extendedAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class ConcreteSuper extends core::Object {
+  synthetic constructor •() → self::ConcreteSuper
+    : super core::Object::•()
+    ;
+  set extendedConcreteSetter(core::int value) → void {}
+  abstract set extendedAbstractSetter(core::int value) → void;
+  set declaredConcreteExtendsConcreteSetter(core::int value) → void {}
+  set declaredAbstractExtendsConcreteSetter(core::int value) → void {}
+  abstract set declaredConcreteExtendsAbstractSetter(core::int value) → void;
+  abstract set declaredAbstractExtendsAbstractSetter(core::int value) → void;
+}
+class ConcreteClass extends self::ConcreteSuper {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::ConcreteSuper::•()
+    ;
+  set declaredConcreteSetter(core::int value) → void {}
+  abstract set declaredAbstractSetter(core::int value) → void;
+  set declaredConcreteExtendsConcreteSetter(core::int value) → void {}
+  abstract set declaredAbstractExtendsConcreteSetter(core::int value) → void;
+  set declaredConcreteExtendsAbstractSetter(core::int value) → void {}
+  abstract set declaredAbstractExtendsAbstractSetter(core::int value) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart.weak.modular.expect
new file mode 100644
index 0000000..3c9afcd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart.weak.modular.expect
@@ -0,0 +1,116 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:5:7: Error: The non-abstract class 'Interface' is missing implementations for these members:
+//  - Interface.declaredAbstractImplementsAbstractField
+//  - Interface.declaredAbstractImplementsAbstractField=
+//  - Interface.declaredConcreteImplementsAbstractField
+//  - Interface.declaredConcreteImplementsAbstractField=
+//  - Interface.implementedAbstractField
+//  - Interface.implementedAbstractField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Interface {
+//       ^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:16:16: Context: 'Interface.declaredAbstractImplementsAbstractField' is defined here.
+//   abstract int declaredAbstractImplementsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:16:16: Context: 'Interface.declaredAbstractImplementsAbstractField=' is defined here.
+//   abstract int declaredAbstractImplementsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:14:16: Context: 'Interface.declaredConcreteImplementsAbstractField' is defined here.
+//   abstract int declaredConcreteImplementsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:14:16: Context: 'Interface.declaredConcreteImplementsAbstractField=' is defined here.
+//   abstract int declaredConcreteImplementsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:8:16: Context: 'Interface.implementedAbstractField' is defined here.
+//   abstract int implementedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:8:16: Context: 'Interface.implementedAbstractField=' is defined here.
+//   abstract int implementedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractField
+//  - ConcreteClass.declaredAbstractField=
+//  - ConcreteClass.declaredAbstractImplementsAbstractField
+//  - ConcreteClass.declaredAbstractImplementsAbstractField=
+//  - ConcreteClass.declaredAbstractImplementsConcreteField
+//  - ConcreteClass.declaredAbstractImplementsConcreteField=
+//  - Interface.implementedAbstractField
+//  - Interface.implementedAbstractField=
+//  - Interface.implementedConcreteField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:22:16: Context: 'ConcreteClass.declaredAbstractField' is defined here.
+//   abstract int declaredAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:22:16: Context: 'ConcreteClass.declaredAbstractField=' is defined here.
+//   abstract int declaredAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:30:16: Context: 'ConcreteClass.declaredAbstractImplementsAbstractField' is defined here.
+//   abstract int declaredAbstractImplementsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:30:16: Context: 'ConcreteClass.declaredAbstractImplementsAbstractField=' is defined here.
+//   abstract int declaredAbstractImplementsAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:26:16: Context: 'ConcreteClass.declaredAbstractImplementsConcreteField' is defined here.
+//   abstract int declaredAbstractImplementsConcreteField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:26:16: Context: 'ConcreteClass.declaredAbstractImplementsConcreteField=' is defined here.
+//   abstract int declaredAbstractImplementsConcreteField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:8:16: Context: 'Interface.implementedAbstractField' is defined here.
+//   abstract int implementedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:8:16: Context: 'Interface.implementedAbstractField=' is defined here.
+//   abstract int implementedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_field.dart:6:7: Context: 'Interface.implementedConcreteField' is defined here.
+//   int implementedConcreteField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface extends core::Object {
+  field core::int implementedConcreteField = 0;
+  field core::int declaredConcreteImplementsConcreteField = 0;
+  field core::int declaredAbstractImplementsConcreteField = 0;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get implementedAbstractField() → core::int;
+  abstract set implementedAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredConcreteImplementsAbstractField() → core::int;
+  abstract set declaredConcreteImplementsAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractImplementsAbstractField() → core::int;
+  abstract set declaredAbstractImplementsAbstractField(core::int #externalFieldValue) → void;
+}
+class ConcreteClass extends core::Object implements self::Interface {
+  field core::int declaredConcreteField = 0;
+  field core::int declaredConcreteImplementsConcreteField = 0;
+  field core::int declaredConcreteImplementsAbstractField = 0;
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  abstract get declaredAbstractField() → core::int;
+  abstract set declaredAbstractField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractImplementsConcreteField() → core::int;
+  abstract set declaredAbstractImplementsConcreteField(core::int #externalFieldValue) → void;
+  abstract get declaredAbstractImplementsAbstractField() → core::int;
+  abstract set declaredAbstractImplementsAbstractField(core::int #externalFieldValue) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart.weak.modular.expect
new file mode 100644
index 0000000..921aaec
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:5:7: Error: The non-abstract class 'Interface' is missing implementations for these members:
+//  - Interface.declaredAbstractImplementsAbstractField
+//  - Interface.declaredConcreteImplementsAbstractField
+//  - Interface.implementedAbstractField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Interface {
+//       ^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:16:22: Context: 'Interface.declaredAbstractImplementsAbstractField' is defined here.
+//   abstract final int declaredAbstractImplementsAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:14:22: Context: 'Interface.declaredConcreteImplementsAbstractField' is defined here.
+//   abstract final int declaredConcreteImplementsAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:8:22: Context: 'Interface.implementedAbstractField' is defined here.
+//   abstract final int implementedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractField
+//  - ConcreteClass.declaredAbstractImplementsAbstractField
+//  - ConcreteClass.declaredAbstractImplementsConcreteField
+//  - Interface.implementedAbstractField
+//  - Interface.implementedConcreteField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:22:22: Context: 'ConcreteClass.declaredAbstractField' is defined here.
+//   abstract final int declaredAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:30:22: Context: 'ConcreteClass.declaredAbstractImplementsAbstractField' is defined here.
+//   abstract final int declaredAbstractImplementsAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:26:22: Context: 'ConcreteClass.declaredAbstractImplementsConcreteField' is defined here.
+//   abstract final int declaredAbstractImplementsConcreteField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:8:22: Context: 'Interface.implementedAbstractField' is defined here.
+//   abstract final int implementedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_final_field.dart:6:13: Context: 'Interface.implementedConcreteField' is defined here.
+//   final int implementedConcreteField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface extends core::Object {
+  final field core::int implementedConcreteField = 0;
+  final field core::int declaredConcreteImplementsConcreteField = 0;
+  final field core::int declaredAbstractImplementsConcreteField = 0;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get implementedAbstractField() → core::int;
+  abstract get declaredConcreteImplementsAbstractField() → core::int;
+  abstract get declaredAbstractImplementsAbstractField() → core::int;
+}
+class ConcreteClass extends core::Object implements self::Interface {
+  final field core::int declaredConcreteField = 0;
+  final field core::int declaredConcreteImplementsConcreteField = 0;
+  final field core::int declaredConcreteImplementsAbstractField = 0;
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  abstract get declaredAbstractField() → core::int;
+  abstract get declaredAbstractImplementsConcreteField() → core::int;
+  abstract get declaredAbstractImplementsAbstractField() → core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..5c3ce45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart.weak.modular.expect
@@ -0,0 +1,88 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:5:7: Error: The non-abstract class 'Interface' is missing implementations for these members:
+//  - Interface.declaredAbstractImplementsAbstractGetter
+//  - Interface.declaredConcreteImplementsAbstractGetter
+//  - Interface.implementedAbstractGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Interface {
+//       ^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:16:11: Context: 'Interface.declaredAbstractImplementsAbstractGetter' is defined here.
+//   int get declaredAbstractImplementsAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:14:11: Context: 'Interface.declaredConcreteImplementsAbstractGetter' is defined here.
+//   int get declaredConcreteImplementsAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:8:11: Context: 'Interface.implementedAbstractGetter' is defined here.
+//   int get implementedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractGetter
+//  - ConcreteClass.declaredAbstractImplementsAbstractGetter
+//  - ConcreteClass.declaredAbstractImplementsConcreteGetter
+//  - Interface.implementedAbstractGetter
+//  - Interface.implementedConcreteGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:22:11: Context: 'ConcreteClass.declaredAbstractGetter' is defined here.
+//   int get declaredAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:30:11: Context: 'ConcreteClass.declaredAbstractImplementsAbstractGetter' is defined here.
+//   int get declaredAbstractImplementsAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:26:11: Context: 'ConcreteClass.declaredAbstractImplementsConcreteGetter' is defined here.
+//   int get declaredAbstractImplementsConcreteGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:8:11: Context: 'Interface.implementedAbstractGetter' is defined here.
+//   int get implementedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_getter.dart:6:11: Context: 'Interface.implementedConcreteGetter' is defined here.
+//   int get implementedConcreteGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  get implementedConcreteGetter() → core::int
+    return 0;
+  abstract get implementedAbstractGetter() → core::int;
+  get declaredConcreteImplementsConcreteGetter() → core::int
+    return 0;
+  get declaredAbstractImplementsConcreteGetter() → core::int
+    return 0;
+  abstract get declaredConcreteImplementsAbstractGetter() → core::int;
+  abstract get declaredAbstractImplementsAbstractGetter() → core::int;
+}
+class ConcreteClass extends core::Object implements self::Interface {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  get declaredConcreteGetter() → core::int
+    return 0;
+  abstract get declaredAbstractGetter() → core::int;
+  get declaredConcreteImplementsConcreteGetter() → core::int
+    return 0;
+  abstract get declaredAbstractImplementsConcreteGetter() → core::int;
+  get declaredConcreteImplementsAbstractGetter() → core::int
+    return 0;
+  abstract get declaredAbstractImplementsAbstractGetter() → core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart.weak.modular.expect
new file mode 100644
index 0000000..ff9e0ea
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:5:7: Error: The non-abstract class 'Interface' is missing implementations for these members:
+//  - Interface.declaredAbstractImplementsAbstractMethod
+//  - Interface.declaredConcreteImplementsAbstractMethod
+//  - Interface.implementedAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Interface {
+//       ^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:16:8: Context: 'Interface.declaredAbstractImplementsAbstractMethod' is defined here.
+//   void declaredAbstractImplementsAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:14:8: Context: 'Interface.declaredConcreteImplementsAbstractMethod' is defined here.
+//   void declaredConcreteImplementsAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:8:8: Context: 'Interface.implementedAbstractMethod' is defined here.
+//   void implementedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractImplementsAbstractMethod
+//  - ConcreteClass.declaredAbstractImplementsConcreteMethod
+//  - ConcreteClass.declaredAbstractMethod
+//  - Interface.implementedAbstractMethod
+//  - Interface.implementedConcreteMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:30:8: Context: 'ConcreteClass.declaredAbstractImplementsAbstractMethod' is defined here.
+//   void declaredAbstractImplementsAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:26:8: Context: 'ConcreteClass.declaredAbstractImplementsConcreteMethod' is defined here.
+//   void declaredAbstractImplementsConcreteMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:22:8: Context: 'ConcreteClass.declaredAbstractMethod' is defined here.
+//   void declaredAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:8:8: Context: 'Interface.implementedAbstractMethod' is defined here.
+//   void implementedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_method.dart:6:8: Context: 'Interface.implementedConcreteMethod' is defined here.
+//   void implementedConcreteMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  method implementedConcreteMethod() → void {}
+  abstract method implementedAbstractMethod() → void;
+  method declaredConcreteImplementsConcreteMethod() → void {}
+  method declaredAbstractImplementsConcreteMethod() → void {}
+  abstract method declaredConcreteImplementsAbstractMethod() → void;
+  abstract method declaredAbstractImplementsAbstractMethod() → void;
+}
+class ConcreteClass extends core::Object implements self::Interface {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  method declaredConcreteMethod() → void {}
+  abstract method declaredAbstractMethod() → void;
+  method declaredConcreteImplementsConcreteMethod() → void {}
+  abstract method declaredAbstractImplementsConcreteMethod() → void;
+  method declaredConcreteImplementsAbstractMethod() → void {}
+  abstract method declaredAbstractImplementsAbstractMethod() → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..ca9b49b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:5:7: Error: The non-abstract class 'Interface' is missing implementations for these members:
+//  - Interface.declaredAbstractImplementsAbstractSetter=
+//  - Interface.declaredConcreteImplementsAbstractSetter=
+//  - Interface.implementedAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Interface {
+//       ^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:16:12: Context: 'Interface.declaredAbstractImplementsAbstractSetter=' is defined here.
+//   void set declaredAbstractImplementsAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:14:12: Context: 'Interface.declaredConcreteImplementsAbstractSetter=' is defined here.
+//   void set declaredConcreteImplementsAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:8:12: Context: 'Interface.implementedAbstractSetter=' is defined here.
+//   void set implementedAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:19:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declaredAbstractImplementsAbstractSetter=
+//  - ConcreteClass.declaredAbstractImplementsConcreteSetter=
+//  - ConcreteClass.declaredAbstractSetter=
+//  - Interface.implementedAbstractSetter=
+//  - Interface.implementedConcreteSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:30:12: Context: 'ConcreteClass.declaredAbstractImplementsAbstractSetter=' is defined here.
+//   void set declaredAbstractImplementsAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:26:12: Context: 'ConcreteClass.declaredAbstractImplementsConcreteSetter=' is defined here.
+//   void set declaredAbstractImplementsConcreteSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:22:12: Context: 'ConcreteClass.declaredAbstractSetter=' is defined here.
+//   void set declaredAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:8:12: Context: 'Interface.implementedAbstractSetter=' is defined here.
+//   void set implementedAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/concrete_implements_setter.dart:6:12: Context: 'Interface.implementedConcreteSetter=' is defined here.
+//   void set implementedConcreteSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  set implementedConcreteSetter(core::int value) → void {}
+  abstract set implementedAbstractSetter(core::int value) → void;
+  set declaredConcreteImplementsConcreteSetter(core::int value) → void {}
+  set declaredAbstractImplementsConcreteSetter(core::int value) → void {}
+  abstract set declaredConcreteImplementsAbstractSetter(core::int value) → void;
+  abstract set declaredAbstractImplementsAbstractSetter(core::int value) → void;
+}
+class ConcreteClass extends core::Object implements self::Interface {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  set declaredConcreteSetter(core::int value) → void {}
+  abstract set declaredAbstractSetter(core::int value) → void;
+  set declaredConcreteImplementsConcreteSetter(core::int value) → void {}
+  abstract set declaredAbstractImplementsConcreteSetter(core::int value) → void;
+  set declaredConcreteImplementsAbstractSetter(core::int value) → void {}
+  abstract set declaredAbstractImplementsAbstractSetter(core::int value) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.modular.expect
new file mode 100644
index 0000000..f1538ce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart.weak.modular.expect
@@ -0,0 +1,323 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:90:16: Error: Can't inherit members that conflict with each other.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:13:8: Context: This is one inherited member.
+//   void extendedMethodMixedInGetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:43:11: Context: This is the other inherited member.
+//   int get extendedMethodMixedInGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:93:11: Error: Can't declare a member that conflicts with an inherited one.
+//   int get extendedMethodDeclaredGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:6:8: Context: This is the inherited member.
+//   void extendedMethodDeclaredGetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:95:7: Error: Can't declare a member that conflicts with an inherited one.
+//   int extendedMethodDeclaredField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:8:8: Context: This is the inherited member.
+//   void extendedMethodDeclaredField() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:96:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void extendedGetterDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:9:11: Context: This is the inherited member.
+//   int get extendedGetterDeclaredMethod => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:97:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void extendedSetterDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:10:12: Context: This is the inherited member.
+//   void set extendedSetterDeclaredMethod(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:98:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void extendedFieldDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:11:7: Context: This is the inherited member.
+//   int extendedFieldDeclaredMethod = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:100:11: Error: Can't declare a member that conflicts with an inherited one.
+//   int get mixedInMethodDeclaredGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:29:8: Context: This is the inherited member.
+//   void mixedInMethodDeclaredGetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:102:7: Error: Can't declare a member that conflicts with an inherited one.
+//   int mixedInMethodDeclaredField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:31:8: Context: This is the inherited member.
+//   void mixedInMethodDeclaredField() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:103:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void mixedInGetterDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:32:11: Context: This is the inherited member.
+//   int get mixedInGetterDeclaredMethod => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:104:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void mixedInSetterDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:33:12: Context: This is the inherited member.
+//   void set mixedInSetterDeclaredMethod(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:105:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void mixedInFieldDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:34:7: Context: This is the inherited member.
+//   int mixedInFieldDeclaredMethod = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:107:11: Error: Can't declare a member that conflicts with an inherited one.
+//   int get implementedMethodDeclaredGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:52:8: Context: This is the inherited member.
+//   void implementedMethodDeclaredGetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:109:7: Error: Can't declare a member that conflicts with an inherited one.
+//   int implementedMethodDeclaredField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:54:8: Context: This is the inherited member.
+//   void implementedMethodDeclaredField() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:110:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void implementedGetterDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:55:11: Context: This is the inherited member.
+//   int get implementedGetterDeclaredMethod => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:111:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void implementedSetterDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:56:12: Context: This is the inherited member.
+//   void set implementedSetterDeclaredMethod(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:112:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void implementedFieldDeclaredMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:57:7: Context: This is the inherited member.
+//   int implementedFieldDeclaredMethod = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:115:12: Error: 'declaredMethodAndSetter' is already declared in this scope.
+//   void set declaredMethodAndSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:114:8: Context: Previous declaration of 'declaredMethodAndSetter'.
+//   void declaredMethodAndSetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:94:12: Error: Can't declare a member that conflicts with an inherited one.
+//   void set extendedMethodDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:7:8: Context: This is the inherited member.
+//   void extendedMethodDeclaredSetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:101:12: Error: Can't declare a member that conflicts with an inherited one.
+//   void set mixedInMethodDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:30:8: Context: This is the inherited member.
+//   void mixedInMethodDeclaredSetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:108:12: Error: Can't declare a member that conflicts with an inherited one.
+//   void set implementedMethodDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/conflict.dart:53:8: Context: This is the inherited member.
+//   void implementedMethodDeclaredSetter() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int extendedFieldDeclaredMethod = 0;
+  field core::int extendedFieldMixedInMethod = 0;
+  field core::int extendedFieldImplementedMethod = 0;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedMethodDeclaredGetter() → void {}
+  method extendedMethodDeclaredSetter() → void {}
+  method extendedMethodDeclaredField() → void {}
+  get extendedGetterDeclaredMethod() → core::int
+    return 0;
+  set extendedSetterDeclaredMethod(core::int value) → void {}
+  method extendedMethodMixedInGetter() → void {}
+  method extendedMethodMixedInSetter() → void {}
+  method extendedMethodMixedInField() → void {}
+  get extendedGetterMixedInMethod() → core::int
+    return 0;
+  set extendedSetterMixedInMethod(core::int value) → void {}
+  method extendedMethodImplementedGetter() → void {}
+  method extendedMethodImplementedSetter() → void {}
+  method extendedMethodImplementedField() → void {}
+  get extendedGetterImplementedMethod() → core::int
+    return 0;
+  set extendedSetterImplementedMethod(core::int value) → void {}
+}
+class Mixin extends core::Object {
+  field core::int mixedInFieldDeclaredMethod = 0;
+  field core::int mixedInFieldImplementedMethod = 0;
+  field core::int extendedMethodMixedInField = 0;
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method mixedInMethodDeclaredGetter() → void {}
+  method mixedInMethodDeclaredSetter() → void {}
+  method mixedInMethodDeclaredField() → void {}
+  get mixedInGetterDeclaredMethod() → core::int
+    return 0;
+  set mixedInSetterDeclaredMethod(core::int value) → void {}
+  method mixedInMethodImplementedGetter() → void {}
+  method mixedInMethodImplementedSetter() → void {}
+  method mixedInMethodImplementedField() → void {}
+  get mixedInGetterImplementedMethod() → core::int
+    return 0;
+  set mixedInSetterImplementedMethod(core::int value) → void {}
+  get extendedMethodMixedInGetter() → core::int
+    return 0;
+  set extendedMethodMixedInSetter(core::int value) → void {}
+  method extendedGetterMixedInMethod() → void {}
+  method extendedSetterMixedInMethod() → void {}
+  method extendedFieldMixedInMethod() → void {}
+}
+class Interface1 extends core::Object {
+  field core::int implementedFieldDeclaredMethod = 0;
+  field core::int implementedFieldImplementedMethod = 0;
+  field core::int extendedMethodImplementedField = 0;
+  field core::int mixedInMethodImplementedField = 0;
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  method implementedMethodDeclaredGetter() → void {}
+  method implementedMethodDeclaredSetter() → void {}
+  method implementedMethodDeclaredField() → void {}
+  get implementedGetterDeclaredMethod() → core::int
+    return 0;
+  set implementedSetterDeclaredMethod(core::int value) → void {}
+  method implementedMethodImplementedGetter() → void {}
+  method implementedMethodImplementedSetter() → void {}
+  method implementedMethodImplementedField() → void {}
+  get implementedGetterImplementedMethod() → core::int
+    return 0;
+  set implementedSetterImplementedMethod(core::int value) → void {}
+  get extendedMethodImplementedGetter() → core::int
+    return 0;
+  set extendedMethodImplementedSetter(core::int value) → void {}
+  method extendedGetterImplementedMethod() → void {}
+  method extendedSetterImplementedMethod() → void {}
+  method extendedFieldImplementedMethod() → void {}
+  get mixedInMethodImplementedGetter() → core::int
+    return 0;
+  set mixedInMethodImplementedSetter(core::int value) → void {}
+  method mixedInGetterImplementedMethod() → void {}
+  method mixedInSetterImplementedMethod() → void {}
+  method mixedInFieldImplementedMethod() → void {}
+}
+class Interface2 extends core::Object {
+  field core::int implementedMethodImplementedField = 0;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  get implementedMethodImplementedGetter() → core::int
+    return 0;
+  set implementedMethodImplementedSetter(core::int value) → void {}
+  method implementedGetterImplementedMethod() → void {}
+  method implementedSetterImplementedMethod() → void {}
+  method implementedFieldImplementedMethod() → void {}
+}
+abstract class _Class&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInMethodDeclaredSetter() → void
+    return super.{self::Mixin::mixedInMethodDeclaredSetter}();
+  mixin-super-stub get mixedInFieldDeclaredMethod() → core::int
+    return super.{self::Mixin::mixedInFieldDeclaredMethod};
+  mixin-super-stub set mixedInFieldDeclaredMethod(core::int value) → void
+    return super.{self::Mixin::mixedInFieldDeclaredMethod} = value;
+  mixin-super-stub get mixedInFieldImplementedMethod() → core::int
+    return super.{self::Mixin::mixedInFieldImplementedMethod};
+  mixin-super-stub set mixedInFieldImplementedMethod(core::int value) → void
+    return super.{self::Mixin::mixedInFieldImplementedMethod} = value;
+  mixin-super-stub get extendedMethodMixedInField() → core::int
+    return super.{self::Mixin::extendedMethodMixedInField};
+  mixin-super-stub set extendedMethodMixedInField(core::int value) → void
+    return super.{self::Mixin::extendedMethodMixedInField} = value;
+  mixin-super-stub method mixedInMethodDeclaredGetter() → void
+    return super.{self::Mixin::mixedInMethodDeclaredGetter}();
+  mixin-super-stub method mixedInMethodDeclaredField() → void
+    return super.{self::Mixin::mixedInMethodDeclaredField}();
+  mixin-super-stub get mixedInGetterDeclaredMethod() → core::int
+    return super.{self::Mixin::mixedInGetterDeclaredMethod};
+  mixin-super-stub method mixedInMethodImplementedGetter() → void
+    return super.{self::Mixin::mixedInMethodImplementedGetter}();
+  mixin-super-stub method mixedInMethodImplementedSetter() → void
+    return super.{self::Mixin::mixedInMethodImplementedSetter}();
+  mixin-super-stub method mixedInMethodImplementedField() → void
+    return super.{self::Mixin::mixedInMethodImplementedField}();
+  mixin-super-stub get mixedInGetterImplementedMethod() → core::int
+    return super.{self::Mixin::mixedInGetterImplementedMethod};
+  mixin-super-stub get extendedMethodMixedInGetter() → core::int
+    return super.{self::Mixin::extendedMethodMixedInGetter};
+  mixin-super-stub method extendedGetterMixedInMethod() → void
+    return super.{self::Mixin::extendedGetterMixedInMethod}();
+  mixin-super-stub method extendedSetterMixedInMethod() → void
+    return super.{self::Mixin::extendedSetterMixedInMethod}();
+  mixin-super-stub method extendedFieldMixedInMethod() → void
+    return super.{self::Mixin::extendedFieldMixedInMethod}();
+  mixin-super-stub set mixedInSetterDeclaredMethod(core::int value) → void
+    return super.{self::Mixin::mixedInSetterDeclaredMethod} = value;
+  mixin-super-stub set mixedInSetterImplementedMethod(core::int value) → void
+    return super.{self::Mixin::mixedInSetterImplementedMethod} = value;
+  mixin-super-stub set extendedMethodMixedInSetter(core::int value) → void
+    return super.{self::Mixin::extendedMethodMixedInSetter} = value;
+}
+abstract class Class extends self::_Class&Super&Mixin implements self::Interface1, self::Interface2 {
+  field core::int extendedMethodDeclaredField = 0;
+  field core::int mixedInMethodDeclaredField = 0;
+  field core::int implementedMethodDeclaredField = 0;
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&Mixin::•()
+    ;
+  get extendedMethodDeclaredGetter() → core::int
+    return 0;
+  set extendedMethodDeclaredSetter(core::int value) → void {}
+  method extendedGetterDeclaredMethod() → void {}
+  method extendedSetterDeclaredMethod() → void {}
+  method extendedFieldDeclaredMethod() → void {}
+  get mixedInMethodDeclaredGetter() → core::int
+    return 0;
+  set mixedInMethodDeclaredSetter(core::int value) → void {}
+  method mixedInGetterDeclaredMethod() → void {}
+  method mixedInSetterDeclaredMethod() → void {}
+  method mixedInFieldDeclaredMethod() → void {}
+  get implementedMethodDeclaredGetter() → core::int
+    return 0;
+  set implementedMethodDeclaredSetter(core::int value) → void {}
+  method implementedGetterDeclaredMethod() → void {}
+  method implementedSetterDeclaredMethod() → void {}
+  method implementedFieldDeclaredMethod() → void {}
+  method declaredMethodAndSetter() → void {}
+  set declaredMethodAndSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/covariance.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/covariance.dart.weak.modular.expect
new file mode 100644
index 0000000..2e8e69d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/covariance.dart.weak.modular.expect
@@ -0,0 +1,152 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int a, core::int b) → dynamic {}
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+  method method(core::int a, covariant-by-declaration core::int b) → dynamic {}
+}
+abstract class _C&Object&M1 = core::Object with self::M1 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&M1
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(covariant-by-declaration core::int a, core::int b) → dynamic
+    return super.{self::M1::method}(a, b);
+}
+abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&M1&M2
+    : super self::_C&Object&M1::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::int a, covariant-by-declaration core::int b) → dynamic
+    return super.{self::M2::method}(a, b);
+}
+class C extends self::_C&Object&M1&M2 {
+  synthetic constructor •() → self::C
+    : super self::_C&Object&M1&M2::•()
+    ;
+}
+class Direct extends core::Object {
+  synthetic constructor •() → self::Direct
+    : super core::Object::•()
+    ;
+  method positional(covariant-by-declaration core::int a, core::int b, covariant-by-declaration core::int c, core::int d, core::int e) → void {}
+  method optional([covariant-by-declaration core::int a = #C1, core::int b = #C1, covariant-by-declaration core::int c = #C1, core::int d = #C1]) → void {}
+  method named({covariant-by-declaration core::int a = #C1, core::int b = #C1, covariant-by-declaration core::int c = #C1, core::int d = #C1}) → void {}
+}
+class Inherited extends self::Direct {
+  synthetic constructor •() → self::Inherited
+    : super self::Direct::•()
+    ;
+}
+class Override1 extends core::Object {
+  synthetic constructor •() → self::Override1
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int a, core::int b, core::int c, core::int d, core::int e) → void {}
+}
+class Override2 extends self::Override1 {
+  synthetic constructor •() → self::Override2
+    : super self::Override1::•()
+    ;
+  method method(covariant-by-declaration core::int a, core::int b, covariant-by-declaration core::int c, core::int d, core::int e) → void {}
+}
+class Override3 extends self::Override2 {
+  synthetic constructor •() → self::Override3
+    : super self::Override2::•()
+    ;
+  method method(covariant-by-declaration core::int a, core::int b, covariant-by-declaration core::int c, core::int d, core::int e) → void {}
+}
+abstract class Implement1 extends core::Object {
+  synthetic constructor •() → self::Implement1
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int a, core::int b, core::int c, core::int d, core::int e) → void {}
+}
+class Implement2 extends core::Object {
+  synthetic constructor •() → self::Implement2
+    : super core::Object::•()
+    ;
+  method method(core::int a, covariant-by-declaration core::int b, core::int c, core::int d, core::int e) → void {}
+}
+class Implement3 extends core::Object {
+  synthetic constructor •() → self::Implement3
+    : super core::Object::•()
+    ;
+  method method(core::int a, core::int b, covariant-by-declaration core::int c, core::int d, core::int e) → void {}
+}
+class Implement4 extends core::Object implements self::Implement3 {
+  synthetic constructor •() → self::Implement4
+    : super core::Object::•()
+    ;
+  method method(core::int a, core::int b, covariant-by-declaration core::int c, covariant-by-declaration core::int d, core::int e) → void {}
+}
+class Implement5 extends core::Object implements self::Implement1, self::Implement2, self::Implement4 {
+  synthetic constructor •() → self::Implement5
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int a, covariant-by-declaration core::int b, covariant-by-declaration core::int c, covariant-by-declaration core::int d, covariant-by-declaration core::int e) → void {}
+}
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  method method(covariant-by-declaration core::int a, core::int b, core::int c, core::int d, core::int e) → void {}
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  method method(core::int a, covariant-by-declaration core::int b, core::int c, core::int d, core::int e) → void {}
+}
+class Mixin1 extends core::Object {
+  synthetic constructor •() → self::Mixin1
+    : super core::Object::•()
+    ;
+  method method(core::int a, core::int b, covariant-by-declaration core::int c, core::int d, core::int e) → void {}
+}
+class Mixin2 extends core::Object {
+  synthetic constructor •() → self::Mixin2
+    : super core::Object::•()
+    ;
+  method method(core::int a, core::int b, core::int c, covariant-by-declaration core::int d, core::int e) → void {}
+}
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass
+    : super core::Object::•()
+    ;
+  method method(core::int a, core::int b, core::int c, core::int d, covariant-by-declaration core::int e) → void {}
+}
+abstract class _Mixed&Superclass&Mixin1 = self::Superclass with self::Mixin1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Mixed&Superclass&Mixin1
+    : super self::Superclass::•()
+    ;
+  forwarding-stub method method(core::int a, core::int b, covariant-by-declaration core::int c, core::int d, covariant-by-declaration core::int e) → void
+    return super.{self::Mixin1::method}(a, b, c, d, e);
+}
+abstract class _Mixed&Superclass&Mixin1&Mixin2 = self::_Mixed&Superclass&Mixin1 with self::Mixin2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Mixed&Superclass&Mixin1&Mixin2
+    : super self::_Mixed&Superclass&Mixin1::•()
+    ;
+  forwarding-stub method method(core::int a, core::int b, covariant-by-declaration core::int c, covariant-by-declaration core::int d, covariant-by-declaration core::int e) → void
+    return super.{self::Mixin2::method}(a, b, c, d, e);
+}
+class Mixed extends self::_Mixed&Superclass&Mixin1&Mixin2 implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::Mixed
+    : super self::_Mixed&Superclass&Mixin1&Mixin2::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::int a, covariant-by-declaration core::int b, covariant-by-declaration core::int c, covariant-by-declaration core::int d, covariant-by-declaration core::int e) → void
+    return super.{self::Mixin2::method}(a, b, c, d, e);
+}
+static method main() → void {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/covariant_equals.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/covariant_equals.dart.weak.modular.expect
new file mode 100644
index 0000000..42a0eb1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/covariant_equals.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator ==(covariant-by-declaration self::A* other) → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator ==(covariant-by-declaration self::A* other) → core::bool*
+    return true;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  operator ==(covariant-by-declaration covariant-by-class self::C<self::C::T*>* other) → core::bool*
+    return true;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C<core::int*> {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart.weak.modular.expect
new file mode 100644
index 0000000..50391f4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart.weak.modular.expect
@@ -0,0 +1,95 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:5:7: Error: The non-abstract class 'Super' is missing implementations for these members:
+//  - Super.extendedAbstractDeclaredAbstractMethod
+//  - Super.extendedAbstractDeclaredConcreteMethod
+//  - Super.extendedAbstractImplementedDeclaredAbstractMethod
+//  - Super.extendedAbstractImplementedDeclaredConcreteMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:12:8: Context: 'Super.extendedAbstractDeclaredAbstractMethod' is defined here.
+//   void extendedAbstractDeclaredAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:8:8: Context: 'Super.extendedAbstractDeclaredConcreteMethod' is defined here.
+//   void extendedAbstractDeclaredConcreteMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:20:8: Context: 'Super.extendedAbstractImplementedDeclaredAbstractMethod' is defined here.
+//   void extendedAbstractImplementedDeclaredAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:16:8: Context: 'Super.extendedAbstractImplementedDeclaredConcreteMethod' is defined here.
+//   void extendedAbstractImplementedDeclaredConcreteMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:37:7: Error: The non-abstract class 'Class' is missing implementations for these members:
+//  - Class.extendedAbstractDeclaredAbstractMethod
+//  - Class.extendedAbstractImplementedDeclaredAbstractMethod
+//  - Class.implementedDeclaredAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:44:8: Context: 'Class.extendedAbstractDeclaredAbstractMethod' is defined here.
+//   void extendedAbstractDeclaredAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:56:8: Context: 'Class.extendedAbstractImplementedDeclaredAbstractMethod' is defined here.
+//   void extendedAbstractImplementedDeclaredAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/declares.dart:48:8: Context: 'Class.implementedDeclaredAbstractMethod' is defined here.
+//   void implementedDeclaredAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedConcreteDeclaredConcreteMethod() → void {}
+  abstract method extendedAbstractDeclaredConcreteMethod() → void;
+  method extendedConcreteDeclaredAbstractMethod() → void {}
+  abstract method extendedAbstractDeclaredAbstractMethod() → void;
+  method extendedConcreteImplementedDeclaredConcreteMethod() → void {}
+  abstract method extendedAbstractImplementedDeclaredConcreteMethod() → void;
+  method extendedConcreteImplementedDeclaredAbstractMethod() → void {}
+  abstract method extendedAbstractImplementedDeclaredAbstractMethod() → void;
+}
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  method implementedDeclaredConcreteMethod() → void {}
+  method implementedDeclaredAbstractMethod() → void {}
+  method extendedConcreteImplementedDeclaredConcreteMethod() → void {}
+  method extendedAbstractImplementedDeclaredConcreteMethod() → void {}
+  method extendedConcreteImplementedDeclaredAbstractMethod() → void {}
+  method extendedAbstractImplementedDeclaredAbstractMethod() → void {}
+}
+class Class extends self::Super implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  method extendedConcreteDeclaredConcreteMethod() → void {}
+  method extendedAbstractDeclaredConcreteMethod() → void {}
+  abstract method extendedConcreteDeclaredAbstractMethod() → void;
+  abstract method extendedAbstractDeclaredAbstractMethod() → void;
+  method implementedDeclaredConcreteMethod() → void {}
+  abstract method implementedDeclaredAbstractMethod() → void;
+  method extendedConcreteImplementedDeclaredConcreteMethod() → void {}
+  method extendedAbstractImplementedDeclaredConcreteMethod() → void {}
+  abstract method extendedConcreteImplementedDeclaredAbstractMethod() → void;
+  abstract method extendedAbstractImplementedDeclaredAbstractMethod() → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart.weak.modular.expect
new file mode 100644
index 0000000..d51754d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart.weak.modular.expect
@@ -0,0 +1,132 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:7:11: Error: 'superDuplicate1' is already declared in this scope.
+//   int get superDuplicate1 => 42;
+//           ^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:6:8: Context: Previous declaration of 'superDuplicate1'.
+//   void superDuplicate1() {}
+//        ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:10:8: Error: 'superDuplicate2' is already declared in this scope.
+//   void superDuplicate2() {}
+//        ^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:9:11: Context: Previous declaration of 'superDuplicate2'.
+//   int get superDuplicate2 => 42;
+//           ^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:29:11: Error: 'interfaceDuplicate1' is already declared in this scope.
+//   int get interfaceDuplicate1 => 42;
+//           ^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:28:8: Context: Previous declaration of 'interfaceDuplicate1'.
+//   void interfaceDuplicate1() {}
+//        ^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:32:8: Error: 'interfaceDuplicate2' is already declared in this scope.
+//   void interfaceDuplicate2() {}
+//        ^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:31:11: Context: Previous declaration of 'interfaceDuplicate2'.
+//   int get interfaceDuplicate2 => 42;
+//           ^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:43:11: Error: 'extendedDuplicate1' is already declared in this scope.
+//   int get extendedDuplicate1 => 42;
+//           ^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:42:8: Context: Previous declaration of 'extendedDuplicate1'.
+//   void extendedDuplicate1() {}
+//        ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:46:8: Error: 'extendedDuplicate2' is already declared in this scope.
+//   void extendedDuplicate2() {}
+//        ^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:45:11: Context: Previous declaration of 'extendedDuplicate2'.
+//   int get extendedDuplicate2 => 42;
+//           ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:52:11: Error: 'mixedInDuplicate1' is already declared in this scope.
+//   int get mixedInDuplicate1 => 42;
+//           ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:51:8: Context: Previous declaration of 'mixedInDuplicate1'.
+//   void mixedInDuplicate1() {}
+//        ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:55:8: Error: 'mixedInDuplicate2' is already declared in this scope.
+//   void mixedInDuplicate2() {}
+//        ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:54:11: Context: Previous declaration of 'mixedInDuplicate2'.
+//   int get mixedInDuplicate2 => 42;
+//           ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:61:11: Error: 'implementedDuplicate1' is already declared in this scope.
+//   int get implementedDuplicate1 => 42;
+//           ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:60:8: Context: Previous declaration of 'implementedDuplicate1'.
+//   void implementedDuplicate1() {}
+//        ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:64:8: Error: 'implementedDuplicate2' is already declared in this scope.
+//   void implementedDuplicate2() {}
+//        ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/duplicates.dart:63:11: Context: Previous declaration of 'implementedDuplicate2'.
+//   int get implementedDuplicate2 => 42;
+//           ^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method superDuplicate1() → void {}
+  get superDuplicate2() → core::int
+    return 42;
+  method extendedDuplicate1() → void {}
+  method extendedDuplicate2() → void {}
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method mixedInDuplicate1() → void {}
+  method mixedInDuplicate2() → void {}
+}
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  method interfaceDuplicate1() → void {}
+  get interfaceDuplicate2() → core::int
+    return 42;
+  method implementedDuplicate1() → void {}
+  method implementedDuplicate2() → void {}
+}
+abstract class _Class&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInDuplicate1() → void
+    return super.{self::Mixin::mixedInDuplicate1}();
+  mixin-super-stub method mixedInDuplicate2() → void
+    return super.{self::Mixin::mixedInDuplicate2}();
+}
+abstract class Class extends self::_Class&Super&Mixin implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&Mixin::•()
+    ;
+  method superDuplicate1() → void {}
+  method superDuplicate2() → void {}
+  method extendedDuplicate1() → void {}
+  get extendedDuplicate2() → core::int
+    return 42;
+  method mixedInDuplicate1() → void {}
+  get mixedInDuplicate2() → core::int
+    return 42;
+  method interfaceDuplicate1() → void {}
+  method interfaceDuplicate2() → void {}
+  method implementedDuplicate1() → void {}
+  get implementedDuplicate2() → core::int
+    return 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.modular.expect
new file mode 100644
index 0000000..becdaa6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart.weak.modular.expect
@@ -0,0 +1,145 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractField=
+//  - Super.extendedAbstractImplementedField
+//  - Super.extendedAbstractImplementedField=
+//  - Super.extendedAbstractImplementedMultipleField
+//  - Super.extendedAbstractImplementedMultipleField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   int extendedAbstractImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField' is defined here.
+//   abstract int extendedAbstractImplementedField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField=' is defined here.
+//   abstract int extendedAbstractImplementedField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+//   abstract int extendedAbstractImplementedMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField=' is defined here.
+//   abstract int extendedAbstractImplementedMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractField=
+//  - Super.extendedAbstractImplementedField
+//  - Super.extendedAbstractImplementedField=
+//  - Super.extendedAbstractImplementedMultipleField
+//  - Super.extendedAbstractImplementedMultipleField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:22:7: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   int extendedAbstractImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:26:7: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:32:7: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   int extendedAbstractImplementedMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField' is defined here.
+//   abstract int extendedAbstractImplementedField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:12:16: Context: 'Super.extendedAbstractImplementedField=' is defined here.
+//   abstract int extendedAbstractImplementedField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+//   abstract int extendedAbstractImplementedMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_field.dart:16:16: Context: 'Super.extendedAbstractImplementedMultipleField=' is defined here.
+//   abstract int extendedAbstractImplementedMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  field core::int extendedConcreteField = 0;
+  field core::int extendedConcreteImplementedField = 0;
+  field core::int extendedConcreteImplementedMultipleField = 0;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractField() → core::int;
+  abstract set extendedAbstractField(core::int #externalFieldValue) → void;
+  abstract get extendedAbstractImplementedField() → core::int;
+  abstract set extendedAbstractImplementedField(core::int #externalFieldValue) → void;
+  abstract get extendedAbstractImplementedMultipleField() → core::int;
+  abstract set extendedAbstractImplementedMultipleField(core::int #externalFieldValue) → void;
+}
+class Interface1 extends core::Object {
+  field core::int extendedConcreteImplementedField = 0;
+  field core::int extendedAbstractImplementedField = 0;
+  field core::int extendedConcreteImplementedMultipleField = 0;
+  field core::int extendedAbstractImplementedMultipleField = 0;
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+}
+class Interface2 extends core::Object {
+  field core::int extendedConcreteImplementedMultipleField = 0;
+  field core::int extendedAbstractImplementedMultipleField = 0;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super self::Super::•()
+    ;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.modular.expect
new file mode 100644
index 0000000..e65fe64
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart.weak.modular.expect
@@ -0,0 +1,118 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractImplementedField
+//  - Super.extendedAbstractImplementedMultipleField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   final int extendedAbstractImplementedField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract final int extendedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:12:22: Context: 'Super.extendedAbstractImplementedField' is defined here.
+//   abstract final int extendedAbstractImplementedField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:16:22: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+//   abstract final int extendedAbstractImplementedMultipleField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedField
+//  - Interface1.extendedAbstractImplementedMultipleField
+//  - Interface2.extendedAbstractImplementedMultipleField
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractImplementedField
+//  - Super.extendedAbstractImplementedMultipleField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:22:13: Context: 'Interface1.extendedAbstractImplementedField' is defined here.
+//   final int extendedAbstractImplementedField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:26:13: Context: 'Interface1.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:32:13: Context: 'Interface2.extendedAbstractImplementedMultipleField' is defined here.
+//   final int extendedAbstractImplementedMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract final int extendedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:12:22: Context: 'Super.extendedAbstractImplementedField' is defined here.
+//   abstract final int extendedAbstractImplementedField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_final_field.dart:16:22: Context: 'Super.extendedAbstractImplementedMultipleField' is defined here.
+//   abstract final int extendedAbstractImplementedMultipleField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  final field core::int extendedConcreteField = 0;
+  final field core::int extendedConcreteImplementedField = 0;
+  final field core::int extendedConcreteImplementedMultipleField = 0;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractField() → core::int;
+  abstract get extendedAbstractImplementedField() → core::int;
+  abstract get extendedAbstractImplementedMultipleField() → core::int;
+}
+class Interface1 extends core::Object {
+  final field core::int extendedConcreteImplementedField = 0;
+  final field core::int extendedAbstractImplementedField = 0;
+  final field core::int extendedConcreteImplementedMultipleField = 0;
+  final field core::int extendedAbstractImplementedMultipleField = 0;
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+}
+class Interface2 extends core::Object {
+  final field core::int extendedConcreteImplementedMultipleField = 0;
+  final field core::int extendedAbstractImplementedMultipleField = 0;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super self::Super::•()
+    ;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..39f968f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart.weak.modular.expect
@@ -0,0 +1,127 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedGetter
+//  - Interface1.extendedAbstractImplementedMultipleGetter
+//  - Interface2.extendedAbstractImplementedMultipleGetter
+//  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractImplementedGetter
+//  - Super.extendedAbstractImplementedMultipleGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
+//   int get extendedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:12:11: Context: 'Super.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:16:11: Context: 'Super.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedGetter
+//  - Interface1.extendedAbstractImplementedMultipleGetter
+//  - Interface2.extendedAbstractImplementedMultipleGetter
+//  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractImplementedGetter
+//  - Super.extendedAbstractImplementedMultipleGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:22:11: Context: 'Interface1.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:26:11: Context: 'Interface1.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:32:11: Context: 'Interface2.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
+//   int get extendedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:12:11: Context: 'Super.extendedAbstractImplementedGetter' is defined here.
+//   int get extendedAbstractImplementedGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_getter.dart:16:11: Context: 'Super.extendedAbstractImplementedMultipleGetter' is defined here.
+//   int get extendedAbstractImplementedMultipleGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  get extendedConcreteGetter() → core::int
+    return 0;
+  abstract get extendedAbstractGetter() → core::int;
+  get extendedConcreteImplementedGetter() → core::int
+    return 0;
+  abstract get extendedAbstractImplementedGetter() → core::int;
+  get extendedConcreteImplementedMultipleGetter() → core::int
+    return 0;
+  abstract get extendedAbstractImplementedMultipleGetter() → core::int;
+}
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  get extendedConcreteImplementedGetter() → core::int
+    return 0;
+  get extendedAbstractImplementedGetter() → core::int
+    return 0;
+  get extendedConcreteImplementedMultipleGetter() → core::int
+    return 0;
+  get extendedAbstractImplementedMultipleGetter() → core::int
+    return 0;
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  get extendedConcreteImplementedMultipleGetter() → core::int
+    return 0;
+  get extendedAbstractImplementedMultipleGetter() → core::int
+    return 0;
+}
+abstract class AbstractClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super self::Super::•()
+    ;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.modular.expect
new file mode 100644
index 0000000..2bb4d30
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart.weak.modular.expect
@@ -0,0 +1,118 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.extendedAbstractImplementedMultipleMethod
+//  - Interface2.extendedAbstractImplementedMultipleMethod
+//  - Super.extendedAbstractImplementedMethod
+//  - Super.extendedAbstractImplementedMultipleMethod
+//  - Super.extendedAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:16:8: Context: 'Super.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.extendedAbstractImplementedMultipleMethod
+//  - Interface2.extendedAbstractImplementedMultipleMethod
+//  - Super.extendedAbstractImplementedMethod
+//  - Super.extendedAbstractImplementedMultipleMethod
+//  - Super.extendedAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:22:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:32:8: Context: 'Interface2.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:16:8: Context: 'Super.extendedAbstractImplementedMultipleMethod' is defined here.
+//   void extendedAbstractImplementedMultipleMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedConcreteMethod() → void {}
+  abstract method extendedAbstractMethod() → void;
+  method extendedConcreteImplementedMethod() → void {}
+  abstract method extendedAbstractImplementedMethod() → void;
+  method extendedConcreteImplementedMultipleMethod() → void {}
+  abstract method extendedAbstractImplementedMultipleMethod() → void;
+}
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  method extendedConcreteImplementedMethod() → void {}
+  method extendedAbstractImplementedMethod() → void {}
+  method extendedConcreteImplementedMultipleMethod() → void {}
+  method extendedAbstractImplementedMultipleMethod() → void {}
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  method extendedConcreteImplementedMultipleMethod() → void {}
+  method extendedAbstractImplementedMultipleMethod() → void {}
+}
+abstract class AbstractClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super self::Super::•()
+    ;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..e2cfcb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart.weak.modular.expect
@@ -0,0 +1,118 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:37:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMultipleSetter=
+//  - Interface1.extendedAbstractImplementedSetter=
+//  - Interface2.extendedAbstractImplementedMultipleSetter=
+//  - Super.extendedAbstractImplementedMultipleSetter=
+//  - Super.extendedAbstractImplementedSetter=
+//  - Super.extendedAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:12:12: Context: 'Super.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
+//   void set extendedAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:39:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMultipleSetter=
+//  - Interface1.extendedAbstractImplementedSetter=
+//  - Interface2.extendedAbstractImplementedMultipleSetter=
+//  - Super.extendedAbstractImplementedMultipleSetter=
+//  - Super.extendedAbstractImplementedSetter=
+//  - Super.extendedAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:22:12: Context: 'Interface1.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:32:12: Context: 'Interface2.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedMultipleSetter=' is defined here.
+//   void set extendedAbstractImplementedMultipleSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:12:12: Context: 'Super.extendedAbstractImplementedSetter=' is defined here.
+//   void set extendedAbstractImplementedSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/extend_multiple_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
+//   void set extendedAbstractSetter(int value);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  set extendedConcreteSetter(core::int value) → void {}
+  abstract set extendedAbstractSetter(core::int value) → void;
+  set extendedConcreteImplementedSetter(core::int value) → void {}
+  abstract set extendedAbstractImplementedSetter(core::int value) → void;
+  set extendedConcreteImplementedMultipleSetter(core::int value) → void {}
+  abstract set extendedAbstractImplementedMultipleSetter(core::int value) → void;
+}
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  set extendedConcreteImplementedSetter(core::int value) → void {}
+  set extendedAbstractImplementedSetter(core::int value) → void {}
+  set extendedConcreteImplementedMultipleSetter(core::int value) → void {}
+  set extendedAbstractImplementedMultipleSetter(core::int value) → void {}
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  set extendedConcreteImplementedMultipleSetter(core::int value) → void {}
+  set extendedAbstractImplementedMultipleSetter(core::int value) → void {}
+}
+abstract class AbstractClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super self::Super::•()
+    ;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.modular.expect
new file mode 100644
index 0000000..5a2032c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart.weak.modular.expect
@@ -0,0 +1,144 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Error: The return type of the method 'Class.field2' is 'String', which does not match the return type, 'num', of the overridden method, 'Super.field2'.
+// Change to a subtype of 'num'.
+//   abstract String field2;
+//                   ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:7:7: Context: This is the overridden method ('field2').
+//   num field2 = 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Error: The return type of the method 'Class.field2' is 'String', which does not match the return type, 'int', of the overridden method, 'Interface.field2'.
+// Change to a subtype of 'int'.
+//   abstract String field2;
+//                   ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:16:17: Context: This is the overridden method ('field2').
+//   covariant int field2 = 0;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Error: The parameter '#externalFieldValue' of the method 'Class.field2' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'Super.field2'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   abstract String field2;
+//                   ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:7:7: Context: This is the overridden method ('field2').
+//   num field2 = 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Error: The parameter '#externalFieldValue' of the method 'Class.field2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.field2'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   abstract String field2;
+//                   ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:16:17: Context: This is the overridden method ('field2').
+//   covariant int field2 = 0;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:25:16: Error: The parameter '#externalFieldValue' of the method 'Class.field3' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.field3'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   abstract int field3;
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:8:7: Context: This is the overridden method ('field3').
+//   num field3 = 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:28:16: Error: The return type of the method 'Class.field5' is 'num', which does not match the return type, 'int', of the overridden method, 'Super.field5'.
+// Change to a subtype of 'int'.
+//   abstract num field5;
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:11:17: Context: This is the overridden method ('field5').
+//   covariant int field5 = 0;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:28:16: Error: The return type of the method 'Class.field5' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface.field5'.
+// Change to a subtype of 'int'.
+//   abstract num field5;
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:19:7: Context: This is the overridden method ('field5').
+//   int field5 = 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field1' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:6:7: Context: The return type of the method 'Super.field1' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field1'.
+// Change to a subtype of 'int'.
+//   num field1 = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:23:16: Context: This is the overridden method ('field1').
+//   abstract int field1;
+//                ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:7:7: Context: The return type of the method 'Super.field2' is 'num', which does not match the return type, 'String', of the overridden method, 'Class.field2'.
+// Change to a subtype of 'String'.
+//   num field2 = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:24:19: Context: This is the overridden method ('field2').
+//   abstract String field2;
+//                   ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field3' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:8:7: Context: The return type of the method 'Super.field3' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field3'.
+// Change to a subtype of 'int'.
+//   num field3 = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:25:16: Context: This is the overridden method ('field3').
+//   abstract int field3;
+//                ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:22:7: Error: The implementation of 'field4' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:10:17: Context: The return type of the method 'Super.field4' is 'num', which does not match the return type, 'int', of the overridden method, 'Class.field4'.
+// Change to a subtype of 'int'.
+//   covariant num field4 = 0;
+//                 ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_field.dart:27:16: Context: This is the overridden method ('field4').
+//   abstract int field4;
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::num field1 = 0;
+  field core::num field2 = 0;
+  field core::num field3 = 0;
+  covariant-by-declaration field core::num field4 = 0;
+  covariant-by-declaration field core::int field5 = 0;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+class Interface extends core::Object {
+  covariant-by-declaration field core::int field1 = 0;
+  covariant-by-declaration field core::int field2 = 0;
+  field core::int field4 = 0;
+  field core::int field5 = 0;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+}
+class Class extends self::Super implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  abstract get field1() → core::int;
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ field1(covariant-by-declaration core::num #externalFieldValue) → void
+    return super.{self::Super::field1} = #externalFieldValue;
+  abstract get field2() → core::String;
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::String) → void */ field2(covariant-by-declaration core::num #externalFieldValue) → void
+    return super.{self::Super::field2} = #externalFieldValue;
+  abstract get field3() → core::int;
+  abstract set field3(core::int #externalFieldValue) → void;
+  abstract get field4() → core::int;
+  abstract set field4(covariant-by-declaration core::int #externalFieldValue) → void;
+  abstract get field5() → core::num;
+  abstract set field5(covariant-by-declaration core::num #externalFieldValue) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.modular.expect
new file mode 100644
index 0000000..9e7d45a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:23: Error: The parameter 'i' of the method 'Class.method2' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'Super.method2'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void method2(String i);
+//                       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:7:8: Context: This is the overridden method ('method2').
+//   void method2(num n) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:23: Error: The parameter 'i' of the method 'Class.method2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.method2'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   void method2(String i);
+//                       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:16:8: Context: This is the overridden method ('method2').
+//   void method2(covariant int i) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:25:20: Error: The parameter 'i' of the method 'Class.method3' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.method3'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void method3(int i);
+//                    ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:8:8: Context: This is the overridden method ('method3').
+//   void method3(num n) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:22:7: Error: The implementation of 'method2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:7:20: Context: The parameter 'n' of the method 'Super.method2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.method2'.
+// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
+//   void method2(num n) {}
+//                    ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_method.dart:24:8: Context: This is the overridden method ('method2').
+//   void method2(String i);
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method1(core::num n) → void {}
+  method method2(core::num n) → void {}
+  method method3(core::num n) → void {}
+  method method4(covariant-by-declaration core::num i) → void {}
+  method method5(covariant-by-declaration core::int i) → void {}
+}
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  method method1(covariant-by-declaration core::int i) → void {}
+  method method2(covariant-by-declaration core::int i) → void {}
+  method method4(core::int i) → void {}
+  method method5(core::int i) → void {}
+}
+class Class extends self::Super implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::int) → void */ method1(covariant-by-declaration core::num i) → void
+    return super.{self::Super::method1}(i);
+  forwarding-stub forwarding-semi-stub method /* signature-type: (core::String) → void */ method2(covariant-by-declaration core::num i) → void
+    return super.{self::Super::method2}(i);
+  abstract method method3(core::int i) → void;
+  abstract method method4(covariant-by-declaration core::int i) → void;
+  abstract method method5(covariant-by-declaration core::num n) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..a51aa61
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:27: Error: The parameter 'i' of the method 'Class.setter2' has type 'String', which does not match the corresponding type, 'num', in the overridden method, 'Super.setter2'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void set setter2(String i);
+//                           ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:7:12: Context: This is the overridden method ('setter2').
+//   void set setter2(num n) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:27: Error: The parameter 'i' of the method 'Class.setter2' has type 'String', which does not match the corresponding type, 'int', in the overridden method, 'Interface.setter2'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   void set setter2(String i);
+//                           ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:16:12: Context: This is the overridden method ('setter2').
+//   void set setter2(covariant int i) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:25:24: Error: The parameter 'i' of the method 'Class.setter3' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.setter3'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void set setter3(int i);
+//                        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:8:12: Context: This is the overridden method ('setter3').
+//   void set setter3(num n) {}
+//            ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:22:7: Error: The implementation of 'setter2' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super implements Interface {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:7:24: Context: The parameter 'n' of the method 'Super.setter2' has type 'num', which does not match the corresponding type, 'String', in the overridden method, 'Class.setter2'.
+// Change to a supertype of 'String', or, for a covariant parameter, a subtype.
+//   void set setter2(num n) {}
+//                        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_semi_stub_setter.dart:24:12: Context: This is the overridden method ('setter2').
+//   void set setter2(String i);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  set setter1(core::num n) → void {}
+  set setter2(core::num n) → void {}
+  set setter3(core::num n) → void {}
+  set setter4(covariant-by-declaration core::num i) → void {}
+  set setter5(covariant-by-declaration core::int i) → void {}
+}
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  set setter1(covariant-by-declaration core::int i) → void {}
+  set setter2(covariant-by-declaration core::int i) → void {}
+  set setter4(core::int i) → void {}
+  set setter5(core::int i) → void {}
+}
+class Class extends self::Super implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::int) → void */ setter1(covariant-by-declaration core::num i) → void
+    return super.{self::Super::setter1} = i;
+  forwarding-stub forwarding-semi-stub set /* signature-type: (core::String) → void */ setter2(covariant-by-declaration core::num i) → void
+    return super.{self::Super::setter2} = i;
+  abstract set setter3(core::int i) → void;
+  abstract set setter4(covariant-by-declaration core::int i) → void;
+  abstract set setter5(covariant-by-declaration core::num n) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stub_call.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stub_call.dart.weak.modular.expect
new file mode 100644
index 0000000..a15a8cc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stub_call.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::T%>
+    : super core::Object::•()
+    ;
+  method method(covariant-by-class self::Super::T% t) → void {}
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method method(core::int t) → void {}
+}
+class Class = self::Super<core::int> with self::Mixin {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  forwarding-stub method method(covariant-by-class core::int t) → void
+    return super.{self::Mixin::method}(t);
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method test() → void {
+    super.{self::Class::method}(0);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.modular.expect
new file mode 100644
index 0000000..16ebb44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart.weak.modular.expect
@@ -0,0 +1,179 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedField
+//  - Interface1.extendedAbstractImplementedCovariantField
+//  - Interface1.implementsMultipleCovariantField1
+//  - Interface1.implementsMultipleCovariantField2
+//  - Interface2.implementsMultipleCovariantField1
+//  - Interface2.implementsMultipleCovariantField2
+//  - Super.extendedAbstractCovariantField
+//  - Super.extendedAbstractCovariantField=
+//  - Super.extendedAbstractCovariantImplementedField
+//  - Super.extendedAbstractCovariantImplementedField=
+//  - Super.extendedAbstractImplementedCovariantField
+//  - Super.extendedAbstractImplementedCovariantField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+//   int extendedAbstractCovariantImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+//   covariant int extendedAbstractImplementedCovariantField = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
+//   covariant int implementsMultipleCovariantField1 = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:30:7: Context: 'Interface1.implementsMultipleCovariantField2' is defined here.
+//   int implementsMultipleCovariantField2 = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:34:7: Context: 'Interface2.implementsMultipleCovariantField1' is defined here.
+//   int implementsMultipleCovariantField1 = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:36:17: Context: 'Interface2.implementsMultipleCovariantField2' is defined here.
+//   covariant int implementsMultipleCovariantField2 = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField' is defined here.
+//   abstract covariant int extendedAbstractCovariantField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField=' is defined here.
+//   abstract covariant int extendedAbstractCovariantField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField' is defined here.
+//   abstract covariant int extendedAbstractCovariantImplementedField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField=' is defined here.
+//   abstract covariant int extendedAbstractCovariantImplementedField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField' is defined here.
+//   abstract int extendedAbstractImplementedCovariantField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField=' is defined here.
+//   abstract int extendedAbstractImplementedCovariantField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedField
+//  - Interface1.extendedAbstractImplementedCovariantField
+//  - Interface1.implementsMultipleCovariantField1
+//  - Interface1.implementsMultipleCovariantField2
+//  - Interface2.implementsMultipleCovariantField1
+//  - Interface2.implementsMultipleCovariantField2
+//  - Super.extendedAbstractCovariantField
+//  - Super.extendedAbstractCovariantField=
+//  - Super.extendedAbstractCovariantImplementedField
+//  - Super.extendedAbstractCovariantImplementedField=
+//  - Super.extendedAbstractImplementedCovariantField
+//  - Super.extendedAbstractImplementedCovariantField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:22:7: Context: 'Interface1.extendedAbstractCovariantImplementedField' is defined here.
+//   int extendedAbstractCovariantImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:26:17: Context: 'Interface1.extendedAbstractImplementedCovariantField' is defined here.
+//   covariant int extendedAbstractImplementedCovariantField = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:28:17: Context: 'Interface1.implementsMultipleCovariantField1' is defined here.
+//   covariant int implementsMultipleCovariantField1 = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:30:7: Context: 'Interface1.implementsMultipleCovariantField2' is defined here.
+//   int implementsMultipleCovariantField2 = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:34:7: Context: 'Interface2.implementsMultipleCovariantField1' is defined here.
+//   int implementsMultipleCovariantField1 = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:36:17: Context: 'Interface2.implementsMultipleCovariantField2' is defined here.
+//   covariant int implementsMultipleCovariantField2 = 0;
+//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField' is defined here.
+//   abstract covariant int extendedAbstractCovariantField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:8:26: Context: 'Super.extendedAbstractCovariantField=' is defined here.
+//   abstract covariant int extendedAbstractCovariantField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField' is defined here.
+//   abstract covariant int extendedAbstractCovariantImplementedField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:12:26: Context: 'Super.extendedAbstractCovariantImplementedField=' is defined here.
+//   abstract covariant int extendedAbstractCovariantImplementedField;
+//                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField' is defined here.
+//   abstract int extendedAbstractImplementedCovariantField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_field.dart:16:16: Context: 'Super.extendedAbstractImplementedCovariantField=' is defined here.
+//   abstract int extendedAbstractImplementedCovariantField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  covariant-by-declaration field core::int extendedConcreteCovariantField = 0;
+  covariant-by-declaration field core::int extendedConcreteCovariantImplementedField = 0;
+  field core::int extendedConcreteImplementedCovariantField = 0;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractCovariantField() → core::int;
+  abstract set extendedAbstractCovariantField(covariant-by-declaration core::int #externalFieldValue) → void;
+  abstract get extendedAbstractCovariantImplementedField() → core::int;
+  abstract set extendedAbstractCovariantImplementedField(covariant-by-declaration core::int #externalFieldValue) → void;
+  abstract get extendedAbstractImplementedCovariantField() → core::int;
+  abstract set extendedAbstractImplementedCovariantField(core::int #externalFieldValue) → void;
+}
+class Interface1 extends core::Object {
+  field core::int extendedConcreteCovariantImplementedField = 0;
+  field core::int extendedAbstractCovariantImplementedField = 0;
+  covariant-by-declaration field core::int extendedConcreteImplementedCovariantField = 0;
+  covariant-by-declaration field core::int extendedAbstractImplementedCovariantField = 0;
+  covariant-by-declaration field core::int implementsMultipleCovariantField1 = 0;
+  field core::int implementsMultipleCovariantField2 = 0;
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+}
+class Interface2 extends core::Object {
+  field core::int implementsMultipleCovariantField1 = 0;
+  covariant-by-declaration field core::int implementsMultipleCovariantField2 = 0;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super self::Super::•()
+    ;
+  forwarding-stub set extendedConcreteImplementedCovariantField(covariant-by-declaration core::int value) → void
+    return super.{self::Super::extendedConcreteImplementedCovariantField} = value;
+  abstract forwarding-stub set extendedAbstractImplementedCovariantField(covariant-by-declaration core::int #externalFieldValue) → void;
+  abstract forwarding-stub set implementsMultipleCovariantField2(covariant-by-declaration core::int value) → void;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::Super::•()
+    ;
+  forwarding-stub set extendedConcreteImplementedCovariantField(covariant-by-declaration core::int value) → void
+    return super.{self::Super::extendedConcreteImplementedCovariantField} = value;
+  abstract forwarding-stub set extendedAbstractImplementedCovariantField(covariant-by-declaration core::int #externalFieldValue) → void;
+  abstract forwarding-stub set implementsMultipleCovariantField2(covariant-by-declaration core::int value) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.modular.expect
new file mode 100644
index 0000000..c62e3f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart.weak.modular.expect
@@ -0,0 +1,152 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedMethod
+//  - Interface1.extendedAbstractImplementedCovariantMethod
+//  - Interface1.implementsMultipleCovariantMethod1
+//  - Interface1.implementsMultipleCovariantMethod2
+//  - Interface2.implementsMultipleCovariantMethod1
+//  - Interface2.implementsMultipleCovariantMethod2
+//  - Super.extendedAbstractCovariantImplementedMethod
+//  - Super.extendedAbstractCovariantMethod
+//  - Super.extendedAbstractImplementedCovariantMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
+//   void implementsMultipleCovariantMethod1(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:30:8: Context: 'Interface1.implementsMultipleCovariantMethod2' is defined here.
+//   void implementsMultipleCovariantMethod2(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:34:8: Context: 'Interface2.implementsMultipleCovariantMethod1' is defined here.
+//   void implementsMultipleCovariantMethod1(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:36:8: Context: 'Interface2.implementsMultipleCovariantMethod2' is defined here.
+//   void implementsMultipleCovariantMethod2(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:12:8: Context: 'Super.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(covariant int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:8:8: Context: 'Super.extendedAbstractCovariantMethod' is defined here.
+//   void extendedAbstractCovariantMethod(covariant int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:16:8: Context: 'Super.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedMethod
+//  - Interface1.extendedAbstractImplementedCovariantMethod
+//  - Interface1.implementsMultipleCovariantMethod1
+//  - Interface1.implementsMultipleCovariantMethod2
+//  - Interface2.implementsMultipleCovariantMethod1
+//  - Interface2.implementsMultipleCovariantMethod2
+//  - Super.extendedAbstractCovariantImplementedMethod
+//  - Super.extendedAbstractCovariantMethod
+//  - Super.extendedAbstractImplementedCovariantMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:22:8: Context: 'Interface1.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:26:8: Context: 'Interface1.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:28:8: Context: 'Interface1.implementsMultipleCovariantMethod1' is defined here.
+//   void implementsMultipleCovariantMethod1(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:30:8: Context: 'Interface1.implementsMultipleCovariantMethod2' is defined here.
+//   void implementsMultipleCovariantMethod2(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:34:8: Context: 'Interface2.implementsMultipleCovariantMethod1' is defined here.
+//   void implementsMultipleCovariantMethod1(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:36:8: Context: 'Interface2.implementsMultipleCovariantMethod2' is defined here.
+//   void implementsMultipleCovariantMethod2(covariant int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:12:8: Context: 'Super.extendedAbstractCovariantImplementedMethod' is defined here.
+//   void extendedAbstractCovariantImplementedMethod(covariant int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:8:8: Context: 'Super.extendedAbstractCovariantMethod' is defined here.
+//   void extendedAbstractCovariantMethod(covariant int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_method.dart:16:8: Context: 'Super.extendedAbstractImplementedCovariantMethod' is defined here.
+//   void extendedAbstractImplementedCovariantMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedConcreteCovariantMethod(covariant-by-declaration core::int i) → void {}
+  abstract method extendedAbstractCovariantMethod(covariant-by-declaration core::int i) → void;
+  method extendedConcreteCovariantImplementedMethod(covariant-by-declaration core::int i) → void {}
+  abstract method extendedAbstractCovariantImplementedMethod(covariant-by-declaration core::int i) → void;
+  method extendedConcreteImplementedCovariantMethod(core::int i) → void {}
+  abstract method extendedAbstractImplementedCovariantMethod(core::int i) → void;
+}
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  method extendedConcreteCovariantImplementedMethod(core::int i) → void {}
+  method extendedAbstractCovariantImplementedMethod(core::int i) → void {}
+  method extendedConcreteImplementedCovariantMethod(covariant-by-declaration core::int i) → void {}
+  method extendedAbstractImplementedCovariantMethod(covariant-by-declaration core::int i) → void {}
+  method implementsMultipleCovariantMethod1(covariant-by-declaration core::int i) → void {}
+  method implementsMultipleCovariantMethod2(core::int i) → void {}
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  method implementsMultipleCovariantMethod1(core::int i) → void {}
+  method implementsMultipleCovariantMethod2(covariant-by-declaration core::int i) → void {}
+}
+abstract class AbstractClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super self::Super::•()
+    ;
+  forwarding-stub method extendedConcreteImplementedCovariantMethod(covariant-by-declaration core::int i) → void
+    return super.{self::Super::extendedConcreteImplementedCovariantMethod}(i);
+  abstract forwarding-stub method extendedAbstractImplementedCovariantMethod(covariant-by-declaration core::int i) → void;
+  abstract forwarding-stub method implementsMultipleCovariantMethod2(covariant-by-declaration core::int i) → void;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::Super::•()
+    ;
+  forwarding-stub method extendedConcreteImplementedCovariantMethod(covariant-by-declaration core::int i) → void
+    return super.{self::Super::extendedConcreteImplementedCovariantMethod}(i);
+  abstract forwarding-stub method extendedAbstractImplementedCovariantMethod(covariant-by-declaration core::int i) → void;
+  abstract forwarding-stub method implementsMultipleCovariantMethod2(covariant-by-declaration core::int i) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..ac74f0f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart.weak.modular.expect
@@ -0,0 +1,152 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:41:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedSetter=
+//  - Interface1.extendedAbstractImplementedCovariantSetter=
+//  - Interface1.implementsMultipleCovariantSetter1=
+//  - Interface1.implementsMultipleCovariantSetter2=
+//  - Interface2.implementsMultipleCovariantSetter1=
+//  - Interface2.implementsMultipleCovariantSetter2=
+//  - Super.extendedAbstractCovariantImplementedSetter=
+//  - Super.extendedAbstractCovariantSetter=
+//  - Super.extendedAbstractImplementedCovariantSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
+//   void set implementsMultipleCovariantSetter1(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:30:12: Context: 'Interface1.implementsMultipleCovariantSetter2=' is defined here.
+//   void set implementsMultipleCovariantSetter2(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:34:12: Context: 'Interface2.implementsMultipleCovariantSetter1=' is defined here.
+//   void set implementsMultipleCovariantSetter1(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:36:12: Context: 'Interface2.implementsMultipleCovariantSetter2=' is defined here.
+//   void set implementsMultipleCovariantSetter2(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:12:12: Context: 'Super.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(covariant int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:8:12: Context: 'Super.extendedAbstractCovariantSetter=' is defined here.
+//   void set extendedAbstractCovariantSetter(covariant int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:43:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractCovariantImplementedSetter=
+//  - Interface1.extendedAbstractImplementedCovariantSetter=
+//  - Interface1.implementsMultipleCovariantSetter1=
+//  - Interface1.implementsMultipleCovariantSetter2=
+//  - Interface2.implementsMultipleCovariantSetter1=
+//  - Interface2.implementsMultipleCovariantSetter2=
+//  - Super.extendedAbstractCovariantImplementedSetter=
+//  - Super.extendedAbstractCovariantSetter=
+//  - Super.extendedAbstractImplementedCovariantSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:22:12: Context: 'Interface1.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:26:12: Context: 'Interface1.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:28:12: Context: 'Interface1.implementsMultipleCovariantSetter1=' is defined here.
+//   void set implementsMultipleCovariantSetter1(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:30:12: Context: 'Interface1.implementsMultipleCovariantSetter2=' is defined here.
+//   void set implementsMultipleCovariantSetter2(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:34:12: Context: 'Interface2.implementsMultipleCovariantSetter1=' is defined here.
+//   void set implementsMultipleCovariantSetter1(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:36:12: Context: 'Interface2.implementsMultipleCovariantSetter2=' is defined here.
+//   void set implementsMultipleCovariantSetter2(covariant int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:12:12: Context: 'Super.extendedAbstractCovariantImplementedSetter=' is defined here.
+//   void set extendedAbstractCovariantImplementedSetter(covariant int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:8:12: Context: 'Super.extendedAbstractCovariantSetter=' is defined here.
+//   void set extendedAbstractCovariantSetter(covariant int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/forwarding_stubs_setter.dart:16:12: Context: 'Super.extendedAbstractImplementedCovariantSetter=' is defined here.
+//   void set extendedAbstractImplementedCovariantSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  set extendedConcreteCovariantSetter(covariant-by-declaration core::int i) → void {}
+  abstract set extendedAbstractCovariantSetter(covariant-by-declaration core::int i) → void;
+  set extendedConcreteCovariantImplementedSetter(covariant-by-declaration core::int i) → void {}
+  abstract set extendedAbstractCovariantImplementedSetter(covariant-by-declaration core::int i) → void;
+  set extendedConcreteImplementedCovariantSetter(core::int i) → void {}
+  abstract set extendedAbstractImplementedCovariantSetter(core::int i) → void;
+}
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  set extendedConcreteCovariantImplementedSetter(core::int i) → void {}
+  set extendedAbstractCovariantImplementedSetter(core::int i) → void {}
+  set extendedConcreteImplementedCovariantSetter(covariant-by-declaration core::int i) → void {}
+  set extendedAbstractImplementedCovariantSetter(covariant-by-declaration core::int i) → void {}
+  set implementsMultipleCovariantSetter1(covariant-by-declaration core::int i) → void {}
+  set implementsMultipleCovariantSetter2(core::int i) → void {}
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  set implementsMultipleCovariantSetter1(core::int i) → void {}
+  set implementsMultipleCovariantSetter2(covariant-by-declaration core::int i) → void {}
+}
+abstract class AbstractClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super self::Super::•()
+    ;
+  forwarding-stub set extendedConcreteImplementedCovariantSetter(covariant-by-declaration core::int i) → void
+    return super.{self::Super::extendedConcreteImplementedCovariantSetter} = i;
+  abstract forwarding-stub set extendedAbstractImplementedCovariantSetter(covariant-by-declaration core::int i) → void;
+  abstract forwarding-stub set implementsMultipleCovariantSetter2(covariant-by-declaration core::int i) → void;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends self::Super implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super self::Super::•()
+    ;
+  forwarding-stub set extendedConcreteImplementedCovariantSetter(covariant-by-declaration core::int i) → void
+    return super.{self::Super::extendedConcreteImplementedCovariantSetter} = i;
+  abstract forwarding-stub set extendedAbstractImplementedCovariantSetter(covariant-by-declaration core::int i) → void;
+  abstract forwarding-stub set implementsMultipleCovariantSetter2(covariant-by-declaration core::int i) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..894fe23
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart.weak.modular.expect
@@ -0,0 +1,550 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the getter 'Super with Mixin.extendedSetterMixedInField' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterMixedInField'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:19:12: Context: This is the declaration of the setter 'Super.extendedSetterMixedInField'.
+//   void set extendedSetterMixedInField(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the getter 'Super with Mixin.extendedSetterMixedInGetter' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterMixedInGetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:23:12: Context: This is the declaration of the setter 'Super.extendedSetterMixedInGetter'.
+//   void set extendedSetterMixedInGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super.extendedGetterMixedInSetter' is not a subtype of the type 'int' of the setter 'Super with Mixin.extendedGetterMixedInSetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:11:14: Context: This is the declaration of the getter 'Super.extendedGetterMixedInSetter'.
+//   String get extendedGetterMixedInSetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited field 'Super.extendedFieldMixedInSetter' is not a subtype of the type 'int' of the setter 'Super with Mixin.extendedFieldMixedInSetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:15:16: Context: This is the declaration of the field 'Super.extendedFieldMixedInSetter'.
+//   final String extendedFieldMixedInSetter = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedGetterMixedInField'.
+// abstract class Class extends Super
+//                ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:28:7: Context: The return type of the method 'Mixin.extendedGetterMixedInField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterMixedInField'.
+// Change to a subtype of 'String'.
+//   int extendedGetterMixedInField = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:7:14: Context: This is the overridden method ('extendedGetterMixedInField').
+//   String get extendedGetterMixedInField => '';
+//              ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:93:16: Error: The type 'String' of the field 'Class.extendedSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterDeclaredField'.
+//   final String extendedSetterDeclaredField = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:18:12: Context: This is the declaration of the setter 'Super.extendedSetterDeclaredField'.
+//   void set extendedSetterDeclaredField(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:94:14: Error: The type 'String' of the getter 'Class.extendedSetterDeclaredGetter' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterDeclaredGetter'.
+//   String get extendedSetterDeclaredGetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:22:12: Context: This is the declaration of the setter 'Super.extendedSetterDeclaredGetter'.
+//   void set extendedSetterDeclaredGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:99:16: Error: The type 'String' of the field 'Class.mixedInSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Super with Mixin.mixedInSetterDeclaredField'.
+//   final String mixedInSetterDeclaredField = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the setter 'Super with Mixin.mixedInSetterDeclaredField'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:100:14: Error: The type 'String' of the getter 'Class.mixedInSetterDeclaredGetter' is not a subtype of the type 'int' of the inherited setter 'Super with Mixin.mixedInSetterDeclaredGetter'.
+//   String get mixedInSetterDeclaredGetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the setter 'Super with Mixin.mixedInSetterDeclaredGetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:105:16: Error: The type 'String' of the field 'Class.implementedSetterDeclaredField' is not a subtype of the type 'int' of the inherited setter 'Interface1.implementedSetterDeclaredField'.
+//   final String implementedSetterDeclaredField = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:72:12: Context: This is the declaration of the setter 'Interface1.implementedSetterDeclaredField'.
+//   void set implementedSetterDeclaredField(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:106:14: Error: The type 'String' of the getter 'Class.implementedSetterDeclaredGetter' is not a subtype of the type 'int' of the inherited setter 'Interface1.implementedSetterDeclaredGetter'.
+//   String get implementedSetterDeclaredGetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:75:12: Context: This is the declaration of the setter 'Interface1.implementedSetterDeclaredGetter'.
+//   void set implementedSetterDeclaredGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:108:14: Error: The type 'String' of the getter 'Class.declaredGetterDeclaredSetter' is not a subtype of the type 'int' of the setter 'Class.declaredGetterDeclaredSetter'.
+//   String get declaredGetterDeclaredSetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:109:12: Context: This is the declaration of the setter 'Class.declaredGetterDeclaredSetter'.
+//   void set declaredGetterDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:111:16: Error: The type 'String' of the getter 'Class.declaredFieldDeclaredSetter' is not a subtype of the type 'int' of the setter 'Class.declaredFieldDeclaredSetter'.
+//   final String declaredFieldDeclaredSetter = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:112:12: Context: This is the declaration of the setter 'Class.declaredFieldDeclaredSetter'.
+//   void set declaredFieldDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:91:12: Error: The type 'String' of the inherited getter 'Super.extendedGetterDeclaredSetter' is not a subtype of the type 'int' of the setter 'Class.extendedGetterDeclaredSetter'.
+//   void set extendedGetterDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:10:14: Context: This is the declaration of the getter 'Super.extendedGetterDeclaredSetter'.
+//   String get extendedGetterDeclaredSetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:92:12: Error: The type 'String' of the inherited field 'Super.extendedFieldDeclaredSetter' is not a subtype of the type 'int' of the setter 'Class.extendedFieldDeclaredSetter'.
+//   void set extendedFieldDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:14:16: Context: This is the declaration of the field 'Super.extendedFieldDeclaredSetter'.
+//   final String extendedFieldDeclaredSetter = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:97:12: Error: The type 'String' of the inherited getter 'Super with Mixin.mixedInGetterDeclaredSetter' is not a subtype of the type 'int' of the setter 'Class.mixedInGetterDeclaredSetter'.
+//   void set mixedInGetterDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the getter 'Super with Mixin.mixedInGetterDeclaredSetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:98:12: Error: The type 'String' of the inherited getter 'Super with Mixin.mixedInFieldDeclaredSetter' is not a subtype of the type 'int' of the setter 'Class.mixedInFieldDeclaredSetter'.
+//   void set mixedInFieldDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the getter 'Super with Mixin.mixedInFieldDeclaredSetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:103:12: Error: The type 'String' of the inherited getter 'Interface1.implementedGetterDeclaredSetter' is not a subtype of the type 'int' of the setter 'Class.implementedGetterDeclaredSetter'.
+//   void set implementedGetterDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:66:14: Context: This is the declaration of the getter 'Interface1.implementedGetterDeclaredSetter'.
+//   String get implementedGetterDeclaredSetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:104:12: Error: The type 'String' of the inherited field 'Interface1.implementedFieldDeclaredSetter' is not a subtype of the type 'int' of the setter 'Class.implementedFieldDeclaredSetter'.
+//   void set implementedFieldDeclaredSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:69:16: Context: This is the declaration of the field 'Interface1.implementedFieldDeclaredSetter'.
+//   final String implementedFieldDeclaredSetter = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super with Mixin.extendedSetterMixedInField' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterMixedInField'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the getter 'Super with Mixin.extendedSetterMixedInField'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:19:12: Context: This is the declaration of the setter 'Super.extendedSetterMixedInField'.
+//   void set extendedSetterMixedInField(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super with Mixin.extendedSetterMixedInGetter' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterMixedInGetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the getter 'Super with Mixin.extendedSetterMixedInGetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:23:12: Context: This is the declaration of the setter 'Super.extendedSetterMixedInGetter'.
+//   void set extendedSetterMixedInGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Class 'Class' inherits multiple members named 'Mixin.mixedInGetterImplementedField' with incompatible signatures.
+// Try adding a declaration of 'Mixin.mixedInGetterImplementedField' to 'Class'.
+// abstract class Class extends Super
+//                ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:35:14: Context: This is one of the overridden members.
+//   String get mixedInGetterImplementedField => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:57:7: Context: This is one of the overridden members.
+//   int mixedInGetterImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super with Mixin.mixedInGetterImplementedField' is not a subtype of the type 'int' of the inherited setter 'Interface1.mixedInGetterImplementedField'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the getter 'Super with Mixin.mixedInGetterImplementedField'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:57:7: Context: This is the declaration of the setter 'Interface1.mixedInGetterImplementedField'.
+//   int mixedInGetterImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super with Mixin.mixedInGetterImplementedSetter' is not a subtype of the type 'int' of the inherited setter 'Interface1.mixedInGetterImplementedSetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the getter 'Super with Mixin.mixedInGetterImplementedSetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:58:12: Context: This is the declaration of the setter 'Interface1.mixedInGetterImplementedSetter'.
+//   void set mixedInGetterImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super with Mixin.mixedInFieldImplementedSetter' is not a subtype of the type 'int' of the inherited setter 'Interface1.mixedInFieldImplementedSetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the getter 'Super with Mixin.mixedInFieldImplementedSetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:59:12: Context: This is the declaration of the setter 'Interface1.mixedInFieldImplementedSetter'.
+//   void set mixedInFieldImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super.extendedGetterMixedInSetter' is not a subtype of the type 'int' of the inherited setter 'Super with Mixin.extendedGetterMixedInSetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:11:14: Context: This is the declaration of the getter 'Super.extendedGetterMixedInSetter'.
+//   String get extendedGetterMixedInSetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the setter 'Super with Mixin.extendedGetterMixedInSetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited field 'Super.extendedFieldMixedInSetter' is not a subtype of the type 'int' of the inherited setter 'Super with Mixin.extendedFieldMixedInSetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:15:16: Context: This is the declaration of the field 'Super.extendedFieldMixedInSetter'.
+//   final String extendedFieldMixedInSetter = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the setter 'Super with Mixin.extendedFieldMixedInSetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Class 'Class' inherits multiple members named 'extendedGetterImplementedField' with incompatible signatures.
+// Try adding a declaration of 'extendedGetterImplementedField' to 'Class'.
+// abstract class Class extends Super
+//                ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:8:14: Context: This is one of the overridden members.
+//   String get extendedGetterImplementedField => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:51:7: Context: This is one of the overridden members.
+//   int extendedGetterImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super.extendedGetterImplementedField' is not a subtype of the type 'int' of the inherited setter 'Interface1.extendedGetterImplementedField'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:8:14: Context: This is the declaration of the getter 'Super.extendedGetterImplementedField'.
+//   String get extendedGetterImplementedField => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:51:7: Context: This is the declaration of the setter 'Interface1.extendedGetterImplementedField'.
+//   int extendedGetterImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Super.extendedGetterImplementedSetter' is not a subtype of the type 'int' of the inherited setter 'Interface1.extendedGetterImplementedSetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:12:14: Context: This is the declaration of the getter 'Super.extendedGetterImplementedSetter'.
+//   String get extendedGetterImplementedSetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:52:12: Context: This is the declaration of the setter 'Interface1.extendedGetterImplementedSetter'.
+//   void set extendedGetterImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited field 'Super.extendedFieldImplementedSetter' is not a subtype of the type 'int' of the inherited setter 'Interface1.extendedFieldImplementedSetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:16:16: Context: This is the declaration of the field 'Super.extendedFieldImplementedSetter'.
+//   final String extendedFieldImplementedSetter = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:53:12: Context: This is the declaration of the setter 'Interface1.extendedFieldImplementedSetter'.
+//   void set extendedFieldImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited field 'Interface1.mixedInSetterImplementedField' is not a subtype of the type 'int' of the inherited setter 'Super with Mixin.mixedInSetterImplementedField'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:60:16: Context: This is the declaration of the field 'Interface1.mixedInSetterImplementedField'.
+//   final String mixedInSetterImplementedField = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the setter 'Super with Mixin.mixedInSetterImplementedField'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Interface1.mixedInSetterImplementedGetter' is not a subtype of the type 'int' of the inherited setter 'Super with Mixin.mixedInSetterImplementedGetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:61:14: Context: This is the declaration of the getter 'Interface1.mixedInSetterImplementedGetter'.
+//   String get mixedInSetterImplementedGetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the declaration of the setter 'Super with Mixin.mixedInSetterImplementedGetter'.
+// abstract class Class extends Super
+//                ^^^^^^^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited field 'Interface1.extendedSetterImplementedField' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterImplementedField'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:54:16: Context: This is the declaration of the field 'Interface1.extendedSetterImplementedField'.
+//   final String extendedSetterImplementedField = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:20:12: Context: This is the declaration of the setter 'Super.extendedSetterImplementedField'.
+//   void set extendedSetterImplementedField(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Interface1.extendedSetterImplementedGetter' is not a subtype of the type 'int' of the inherited setter 'Super.extendedSetterImplementedGetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:55:14: Context: This is the declaration of the getter 'Interface1.extendedSetterImplementedGetter'.
+//   String get extendedSetterImplementedGetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:24:12: Context: This is the declaration of the setter 'Super.extendedSetterImplementedGetter'.
+//   void set extendedSetterImplementedGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: Class 'Class' inherits multiple members named 'implementedGetterImplementedField' with incompatible signatures.
+// Try adding a declaration of 'implementedGetterImplementedField' to 'Class'.
+// abstract class Class extends Super
+//                ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:64:14: Context: This is one of the overridden members.
+//   String get implementedGetterImplementedField => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:80:7: Context: This is one of the overridden members.
+//   int implementedGetterImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Interface1.implementedGetterImplementedField' is not a subtype of the type 'int' of the inherited setter 'Interface2.implementedGetterImplementedField'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:64:14: Context: This is the declaration of the getter 'Interface1.implementedGetterImplementedField'.
+//   String get implementedGetterImplementedField => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:80:7: Context: This is the declaration of the setter 'Interface2.implementedGetterImplementedField'.
+//   int implementedGetterImplementedField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Interface1.implementedGetterImplementedSetter' is not a subtype of the type 'int' of the inherited setter 'Interface2.implementedGetterImplementedSetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:67:14: Context: This is the declaration of the getter 'Interface1.implementedGetterImplementedSetter'.
+//   String get implementedGetterImplementedSetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:81:12: Context: This is the declaration of the setter 'Interface2.implementedGetterImplementedSetter'.
+//   void set implementedGetterImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited field 'Interface1.implementedFieldImplementedSetter' is not a subtype of the type 'int' of the inherited setter 'Interface2.implementedFieldImplementedSetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:70:16: Context: This is the declaration of the field 'Interface1.implementedFieldImplementedSetter'.
+//   final String implementedFieldImplementedSetter = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:82:12: Context: This is the declaration of the setter 'Interface2.implementedFieldImplementedSetter'.
+//   void set implementedFieldImplementedSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited field 'Interface2.implementedSetterImplementedField' is not a subtype of the type 'int' of the inherited setter 'Interface1.implementedSetterImplementedField'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:83:16: Context: This is the declaration of the field 'Interface2.implementedSetterImplementedField'.
+//   final String implementedSetterImplementedField = '';
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:73:12: Context: This is the declaration of the setter 'Interface1.implementedSetterImplementedField'.
+//   void set implementedSetterImplementedField(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Error: The type 'String' of the inherited getter 'Interface2.implementedSetterImplementedGetter' is not a subtype of the type 'int' of the inherited setter 'Interface1.implementedSetterImplementedGetter'.
+// abstract class Class extends Super
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:84:14: Context: This is the declaration of the getter 'Interface2.implementedSetterImplementedGetter'.
+//   String get implementedSetterImplementedGetter => '';
+//              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:76:12: Context: This is the declaration of the setter 'Interface1.implementedSetterImplementedGetter'.
+//   void set implementedSetterImplementedGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:90:7: Error: The return type of the method 'Class.extendedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super.extendedGetterDeclaredField'.
+// Change to a subtype of 'String'.
+//   int extendedGetterDeclaredField = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:6:14: Context: This is the overridden method ('extendedGetterDeclaredField').
+//   String get extendedGetterDeclaredField => '';
+//              ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:96:7: Error: The return type of the method 'Class.mixedInGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Super with Mixin.mixedInGetterDeclaredField'.
+// Change to a subtype of 'String'.
+//   int mixedInGetterDeclaredField = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:87:16: Context: This is the overridden method ('mixedInGetterDeclaredField').
+// abstract class Class extends Super
+//                ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:102:7: Error: The return type of the method 'Class.implementedGetterDeclaredField' is 'int', which does not match the return type, 'String', of the overridden method, 'Interface1.implementedGetterDeclaredField'.
+// Change to a subtype of 'String'.
+//   int implementedGetterDeclaredField = 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/getter_setter.dart:63:14: Context: This is the overridden method ('implementedGetterDeclaredField').
+//   String get implementedGetterDeclaredField => '';
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  final field core::String extendedFieldDeclaredSetter = "";
+  final field core::String extendedFieldMixedInSetter = "";
+  final field core::String extendedFieldImplementedSetter = "";
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  get extendedGetterDeclaredField() → core::String
+    return "";
+  get extendedGetterMixedInField() → core::String
+    return "";
+  get extendedGetterImplementedField() → core::String
+    return "";
+  get extendedGetterDeclaredSetter() → core::String
+    return "";
+  get extendedGetterMixedInSetter() → core::String
+    return "";
+  get extendedGetterImplementedSetter() → core::String
+    return "";
+  set extendedSetterDeclaredField(core::int value) → void {}
+  set extendedSetterMixedInField(core::int value) → void {}
+  set extendedSetterImplementedField(core::int value) → void {}
+  set extendedSetterDeclaredGetter(core::int value) → void {}
+  set extendedSetterMixedInGetter(core::int value) → void {}
+  set extendedSetterImplementedGetter(core::int value) → void {}
+}
+abstract class Mixin extends core::Object {
+  field core::int extendedGetterMixedInField = 0;
+  final field core::String extendedSetterMixedInField = "";
+  final field core::String mixedInFieldDeclaredSetter = "";
+  final field core::String mixedInFieldImplementedSetter = "";
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  set extendedGetterMixedInSetter(core::int value) → void {}
+  set extendedFieldMixedInSetter(core::int value) → void {}
+  get extendedSetterMixedInGetter() → core::String
+    return "";
+  get mixedInGetterDeclaredField() → core::String
+    return "";
+  get mixedInGetterImplementedField() → core::String
+    return "";
+  get mixedInGetterDeclaredSetter() → core::String
+    return "";
+  get mixedInGetterImplementedSetter() → core::String
+    return "";
+  set mixedInSetterDeclaredField(core::int value) → void {}
+  set mixedInSetterImplementedField(core::int value) → void {}
+  set mixedInSetterDeclaredGetter(core::int value) → void {}
+  set mixedInSetterImplementedGetter(core::int value) → void {}
+}
+abstract class Interface1 extends core::Object {
+  field core::int extendedGetterImplementedField = 0;
+  final field core::String extendedSetterImplementedField = "";
+  field core::int mixedInGetterImplementedField = 0;
+  final field core::String mixedInSetterImplementedField = "";
+  final field core::String implementedFieldDeclaredSetter = "";
+  final field core::String implementedFieldImplementedSetter = "";
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  set extendedGetterImplementedSetter(core::int value) → void {}
+  set extendedFieldImplementedSetter(core::int value) → void {}
+  get extendedSetterImplementedGetter() → core::String
+    return "";
+  set mixedInGetterImplementedSetter(core::int value) → void {}
+  set mixedInFieldImplementedSetter(core::int value) → void {}
+  get mixedInSetterImplementedGetter() → core::String
+    return "";
+  get implementedGetterDeclaredField() → core::String
+    return "";
+  get implementedGetterImplementedField() → core::String
+    return "";
+  get implementedGetterDeclaredSetter() → core::String
+    return "";
+  get implementedGetterImplementedSetter() → core::String
+    return "";
+  set implementedSetterDeclaredField(core::int value) → void {}
+  set implementedSetterImplementedField(core::int value) → void {}
+  set implementedSetterDeclaredGetter(core::int value) → void {}
+  set implementedSetterImplementedGetter(core::int value) → void {}
+}
+abstract class Interface2 extends core::Object {
+  field core::int implementedGetterImplementedField = 0;
+  final field core::String implementedSetterImplementedField = "";
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  set implementedGetterImplementedSetter(core::int value) → void {}
+  set implementedFieldImplementedSetter(core::int value) → void {}
+  get implementedSetterImplementedGetter() → core::String
+    return "";
+}
+abstract class _Class&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get mixedInGetterDeclaredField() → core::String
+    return super.{self::Mixin::mixedInGetterDeclaredField};
+  mixin-super-stub set mixedInSetterDeclaredField(core::int value) → void
+    return super.{self::Mixin::mixedInSetterDeclaredField} = value;
+  mixin-super-stub get mixedInGetterDeclaredSetter() → core::String
+    return super.{self::Mixin::mixedInGetterDeclaredSetter};
+  mixin-super-stub get mixedInFieldDeclaredSetter() → core::String
+    return super.{self::Mixin::mixedInFieldDeclaredSetter};
+  mixin-super-stub get extendedGetterMixedInField() → core::int
+    return super.{self::Mixin::extendedGetterMixedInField};
+  mixin-super-stub set extendedGetterMixedInField(core::int value) → void
+    return super.{self::Mixin::extendedGetterMixedInField} = value;
+  mixin-super-stub get extendedSetterMixedInField() → core::String
+    return super.{self::Mixin::extendedSetterMixedInField};
+  mixin-super-stub get extendedSetterMixedInGetter() → core::String
+    return super.{self::Mixin::extendedSetterMixedInGetter};
+  mixin-super-stub set extendedGetterMixedInSetter(core::int value) → void
+    return super.{self::Mixin::extendedGetterMixedInSetter} = value;
+  mixin-super-stub set extendedFieldMixedInSetter(core::int value) → void
+    return super.{self::Mixin::extendedFieldMixedInSetter} = value;
+  mixin-super-stub set mixedInSetterDeclaredGetter(core::int value) → void
+    return super.{self::Mixin::mixedInSetterDeclaredGetter} = value;
+  mixin-super-stub get mixedInGetterImplementedField() → core::String
+    return super.{self::Mixin::mixedInGetterImplementedField};
+  mixin-super-stub get mixedInGetterImplementedSetter() → core::String
+    return super.{self::Mixin::mixedInGetterImplementedSetter};
+  mixin-super-stub get mixedInFieldImplementedSetter() → core::String
+    return super.{self::Mixin::mixedInFieldImplementedSetter};
+  mixin-super-stub set mixedInSetterImplementedField(core::int value) → void
+    return super.{self::Mixin::mixedInSetterImplementedField} = value;
+  mixin-super-stub set mixedInSetterImplementedGetter(core::int value) → void
+    return super.{self::Mixin::mixedInSetterImplementedGetter} = value;
+}
+abstract class Class extends self::_Class&Super&Mixin implements self::Interface1, self::Interface2 {
+  field core::int extendedGetterDeclaredField = 0;
+  final field core::String extendedSetterDeclaredField = "";
+  field core::int mixedInGetterDeclaredField = 0;
+  final field core::String mixedInSetterDeclaredField = "";
+  field core::int implementedGetterDeclaredField = 0;
+  final field core::String implementedSetterDeclaredField = "";
+  final field core::String declaredFieldDeclaredSetter = "";
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&Mixin::•()
+    ;
+  set extendedGetterDeclaredSetter(core::int value) → void {}
+  set extendedFieldDeclaredSetter(core::int value) → void {}
+  get extendedSetterDeclaredGetter() → core::String
+    return "";
+  set mixedInGetterDeclaredSetter(core::int value) → void {}
+  set mixedInFieldDeclaredSetter(core::int value) → void {}
+  get mixedInSetterDeclaredGetter() → core::String
+    return "";
+  set implementedGetterDeclaredSetter(core::int value) → void {}
+  set implementedFieldDeclaredSetter(core::int value) → void {}
+  get implementedSetterDeclaredGetter() → core::String
+    return "";
+  get declaredGetterDeclaredSetter() → core::String
+    return "";
+  set declaredGetterDeclaredSetter(core::int value) → void {}
+  set declaredFieldDeclaredSetter(core::int value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.modular.expect
new file mode 100644
index 0000000..4701040
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart.weak.modular.expect
@@ -0,0 +1,105 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:21:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declareAbstractImplementMultipleField
+//  - ConcreteClass.declareAbstractImplementMultipleField=
+//  - Interface1.implementMultipleField
+//  - Interface2.implementMultipleField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface1, Interface2 {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:24:16: Context: 'ConcreteClass.declareAbstractImplementMultipleField' is defined here.
+//   abstract int declareAbstractImplementMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:24:16: Context: 'ConcreteClass.declareAbstractImplementMultipleField=' is defined here.
+//   abstract int declareAbstractImplementMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:6:7: Context: 'Interface1.implementMultipleField' is defined here.
+//   int implementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:14:7: Context: 'Interface2.implementMultipleField' is defined here.
+//   int implementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - AbstractClass.declareAbstractImplementMultipleField
+//  - AbstractClass.declareAbstractImplementMultipleField=
+//  - Interface1.declareAbstractImplementMultipleField
+//  - Interface1.implementMultipleField
+//  - Interface2.declareAbstractImplementMultipleField
+//  - Interface2.implementMultipleField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
+//   abstract int declareAbstractImplementMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:30:16: Context: 'AbstractClass.declareAbstractImplementMultipleField=' is defined here.
+//   abstract int declareAbstractImplementMultipleField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:10:7: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+//   int declareAbstractImplementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:6:7: Context: 'Interface1.implementMultipleField' is defined here.
+//   int implementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:18:7: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+//   int declareAbstractImplementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_field.dart:14:7: Context: 'Interface2.implementMultipleField' is defined here.
+//   int implementMultipleField = 0;
+//       ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  field core::int implementMultipleField = 0;
+  field core::int declareConcreteImplementMultipleField = 0;
+  field core::int declareAbstractImplementMultipleField = 0;
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+}
+class Interface2 extends core::Object {
+  field core::int implementMultipleField = 0;
+  field core::int declareConcreteImplementMultipleField = 0;
+  field core::int declareAbstractImplementMultipleField = 0;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Interface1, self::Interface2 {
+  field core::int declareConcreteImplementMultipleField = 0;
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  abstract get declareAbstractImplementMultipleField() → core::int;
+  abstract set declareAbstractImplementMultipleField(core::int #externalFieldValue) → void;
+}
+abstract class AbstractClass extends core::Object implements self::Interface1, self::Interface2 {
+  field core::int declareConcreteImplementMultipleField = 0;
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  abstract get declareAbstractImplementMultipleField() → core::int;
+  abstract set declareAbstractImplementMultipleField(core::int #externalFieldValue) → void;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.modular.expect
new file mode 100644
index 0000000..5ebd497f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart.weak.modular.expect
@@ -0,0 +1,95 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:21:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declareAbstractImplementMultipleField
+//  - Interface1.implementMultipleField
+//  - Interface2.implementMultipleField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface1, Interface2 {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:24:22: Context: 'ConcreteClass.declareAbstractImplementMultipleField' is defined here.
+//   abstract final int declareAbstractImplementMultipleField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:6:13: Context: 'Interface1.implementMultipleField' is defined here.
+//   final int implementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:14:13: Context: 'Interface2.implementMultipleField' is defined here.
+//   final int implementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - AbstractClass.declareAbstractImplementMultipleField
+//  - Interface1.declareAbstractImplementMultipleField
+//  - Interface1.implementMultipleField
+//  - Interface2.declareAbstractImplementMultipleField
+//  - Interface2.implementMultipleField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:30:22: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
+//   abstract final int declareAbstractImplementMultipleField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:10:13: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
+//   final int declareAbstractImplementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:6:13: Context: 'Interface1.implementMultipleField' is defined here.
+//   final int implementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:18:13: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
+//   final int declareAbstractImplementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:14:13: Context: 'Interface2.implementMultipleField' is defined here.
+//   final int implementMultipleField = 0;
+//             ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  final field core::int implementMultipleField = 0;
+  final field core::int declareConcreteImplementMultipleField = 0;
+  final field core::int declareAbstractImplementMultipleField = 0;
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+}
+class Interface2 extends core::Object {
+  final field core::int implementMultipleField = 0;
+  final field core::int declareConcreteImplementMultipleField = 0;
+  final field core::int declareAbstractImplementMultipleField = 0;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+}
+class ConcreteClass extends core::Object implements self::Interface1, self::Interface2 {
+  final field core::int declareConcreteImplementMultipleField = 0;
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  abstract get declareAbstractImplementMultipleField() → core::int;
+}
+abstract class AbstractClass extends core::Object implements self::Interface1, self::Interface2 {
+  final field core::int declareConcreteImplementMultipleField = 0;
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  abstract get declareAbstractImplementMultipleField() → core::int;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..538cee7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart.weak.modular.expect
@@ -0,0 +1,103 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:21:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declareAbstractImplementMultipleGetter
+//  - Interface1.implementMultipleGetter
+//  - Interface2.implementMultipleGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface1, Interface2 {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:24:11: Context: 'ConcreteClass.declareAbstractImplementMultipleGetter' is defined here.
+//   int get declareAbstractImplementMultipleGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:6:11: Context: 'Interface1.implementMultipleGetter' is defined here.
+//   int get implementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:14:11: Context: 'Interface2.implementMultipleGetter' is defined here.
+//   int get implementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - AbstractClass.declareAbstractImplementMultipleGetter
+//  - Interface1.declareAbstractImplementMultipleGetter
+//  - Interface1.implementMultipleGetter
+//  - Interface2.declareAbstractImplementMultipleGetter
+//  - Interface2.implementMultipleGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:30:11: Context: 'AbstractClass.declareAbstractImplementMultipleGetter' is defined here.
+//   int get declareAbstractImplementMultipleGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:10:11: Context: 'Interface1.declareAbstractImplementMultipleGetter' is defined here.
+//   int get declareAbstractImplementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:6:11: Context: 'Interface1.implementMultipleGetter' is defined here.
+//   int get implementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:18:11: Context: 'Interface2.declareAbstractImplementMultipleGetter' is defined here.
+//   int get declareAbstractImplementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_getter.dart:14:11: Context: 'Interface2.implementMultipleGetter' is defined here.
+//   int get implementMultipleGetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  get implementMultipleGetter() → core::int
+    return 0;
+  get declareConcreteImplementMultipleGetter() → core::int
+    return 0;
+  get declareAbstractImplementMultipleGetter() → core::int
+    return 0;
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  get implementMultipleGetter() → core::int
+    return 0;
+  get declareConcreteImplementMultipleGetter() → core::int
+    return 0;
+  get declareAbstractImplementMultipleGetter() → core::int
+    return 0;
+}
+class ConcreteClass extends core::Object implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  get declareConcreteImplementMultipleGetter() → core::int
+    return 0;
+  abstract get declareAbstractImplementMultipleGetter() → core::int;
+}
+abstract class AbstractClass extends core::Object implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  get declareConcreteImplementMultipleGetter() → core::int
+    return 0;
+  abstract get declareAbstractImplementMultipleGetter() → core::int;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.modular.expect
new file mode 100644
index 0000000..66a5d5e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart.weak.modular.expect
@@ -0,0 +1,95 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:21:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declareAbstractImplementMultipleMethod
+//  - Interface1.implementMultipleMethod
+//  - Interface2.implementMultipleMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface1, Interface2 {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:24:8: Context: 'ConcreteClass.declareAbstractImplementMultipleMethod' is defined here.
+//   void declareAbstractImplementMultipleMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:6:8: Context: 'Interface1.implementMultipleMethod' is defined here.
+//   void implementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:14:8: Context: 'Interface2.implementMultipleMethod' is defined here.
+//   void implementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - AbstractClass.declareAbstractImplementMultipleMethod
+//  - Interface1.declareAbstractImplementMultipleMethod
+//  - Interface1.implementMultipleMethod
+//  - Interface2.declareAbstractImplementMultipleMethod
+//  - Interface2.implementMultipleMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:30:8: Context: 'AbstractClass.declareAbstractImplementMultipleMethod' is defined here.
+//   void declareAbstractImplementMultipleMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:10:8: Context: 'Interface1.declareAbstractImplementMultipleMethod' is defined here.
+//   void declareAbstractImplementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:6:8: Context: 'Interface1.implementMultipleMethod' is defined here.
+//   void implementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:18:8: Context: 'Interface2.declareAbstractImplementMultipleMethod' is defined here.
+//   void declareAbstractImplementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_method.dart:14:8: Context: 'Interface2.implementMultipleMethod' is defined here.
+//   void implementMultipleMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  method implementMultipleMethod() → void {}
+  method declareConcreteImplementMultipleMethod() → void {}
+  method declareAbstractImplementMultipleMethod() → void {}
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  method implementMultipleMethod() → void {}
+  method declareConcreteImplementMultipleMethod() → void {}
+  method declareAbstractImplementMultipleMethod() → void {}
+}
+class ConcreteClass extends core::Object implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  method declareConcreteImplementMultipleMethod() → void {}
+  abstract method declareAbstractImplementMultipleMethod() → void;
+}
+abstract class AbstractClass extends core::Object implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  method declareConcreteImplementMultipleMethod() → void {}
+  abstract method declareAbstractImplementMultipleMethod() → void;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..c960de6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart.weak.modular.expect
@@ -0,0 +1,95 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:21:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - ConcreteClass.declareAbstractImplementMultipleSetter=
+//  - Interface1.implementMultipleSetter=
+//  - Interface2.implementMultipleSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass implements Interface1, Interface2 {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:24:12: Context: 'ConcreteClass.declareAbstractImplementMultipleSetter=' is defined here.
+//   void set declareAbstractImplementMultipleSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:6:12: Context: 'Interface1.implementMultipleSetter=' is defined here.
+//   void set implementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:14:12: Context: 'Interface2.implementMultipleSetter=' is defined here.
+//   void set implementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - AbstractClass.declareAbstractImplementMultipleSetter=
+//  - Interface1.declareAbstractImplementMultipleSetter=
+//  - Interface1.implementMultipleSetter=
+//  - Interface2.declareAbstractImplementMultipleSetter=
+//  - Interface2.implementMultipleSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:30:12: Context: 'AbstractClass.declareAbstractImplementMultipleSetter=' is defined here.
+//   void set declareAbstractImplementMultipleSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:10:12: Context: 'Interface1.declareAbstractImplementMultipleSetter=' is defined here.
+//   void set declareAbstractImplementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:6:12: Context: 'Interface1.implementMultipleSetter=' is defined here.
+//   void set implementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:18:12: Context: 'Interface2.declareAbstractImplementMultipleSetter=' is defined here.
+//   void set declareAbstractImplementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_setter.dart:14:12: Context: 'Interface2.implementMultipleSetter=' is defined here.
+//   void set implementMultipleSetter(int i) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  set implementMultipleSetter(core::int i) → void {}
+  set declareConcreteImplementMultipleSetter(core::int i) → void {}
+  set declareAbstractImplementMultipleSetter(core::int i) → void {}
+}
+class Interface2 extends core::Object {
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  set implementMultipleSetter(core::int i) → void {}
+  set declareConcreteImplementMultipleSetter(core::int i) → void {}
+  set declareAbstractImplementMultipleSetter(core::int i) → void {}
+}
+class ConcreteClass extends core::Object implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::ConcreteClass
+    : super core::Object::•()
+    ;
+  set declareConcreteImplementMultipleSetter(core::int i) → void {}
+  abstract set declareAbstractImplementMultipleSetter(core::int i) → void;
+}
+abstract class AbstractClass extends core::Object implements self::Interface1, self::Interface2 {
+  synthetic constructor •() → self::AbstractClass
+    : super core::Object::•()
+    ;
+  set declareConcreteImplementMultipleSetter(core::int i) → void {}
+  abstract set declareAbstractImplementMultipleSetter(core::int i) → void;
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub
+    : super self::AbstractClass::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.modular.expect
new file mode 100644
index 0000000..efdaf3b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart.weak.modular.expect
@@ -0,0 +1,230 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
+// class Class /* error */ extends LegacyClass implements SuperQ {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int optionalArgumentsMethod(int i) => i;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
+// class ClassQ /* error */ extends LegacyClassQ implements Super {
+//       ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int? optionalArgumentsMethod(int? i) => i;
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
+// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:9:7: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int optionalArgumentsMethod(int i) => i;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:59:7: Error: Class 'ClassMixedIn' inherits multiple members named 'nullabilityMethod' with incompatible signatures.
+// Try adding a declaration of 'nullabilityMethod' to 'ClassMixedIn'.
+// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:6:7: Context: This is one of the overridden members.
+//   int nullabilityMethod(int i, {required int j}) => i;
+//       ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:17:8: Context: This is one of the overridden members.
+//   int? nullabilityMethod(int? i, {int? j}) => i;
+//        ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
+// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:20:8: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int? optionalArgumentsMethod(int? i) => i;
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:84:7: Error: Class 'ClassMixedInQ' inherits multiple members named 'nullabilityMethod' with incompatible signatures.
+// Try adding a declaration of 'nullabilityMethod' to 'ClassMixedInQ'.
+// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:17:8: Context: This is one of the overridden members.
+//   int? nullabilityMethod(int? i, {int? j}) => i;
+//        ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in_lib1.dart:6:7: Context: This is one of the overridden members.
+//   int nullabilityMethod(int i, {required int j}) => i;
+//       ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+//     nullabilitySetter = null; // error
+//                         ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:63:31: Error: Required named parameter 'j' must be provided.
+//     var v1 = nullabilityMethod(null); // ok
+//                               ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+import self as self;
+import "in_out_in_lib2.dart" as in_;
+import "in_out_in_lib1.dart" as in_2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///in_out_in_lib1.dart";
+import "org-dartlang-testcase:///in_out_in_lib2.dart";
+
+class Class extends in_::LegacyClass implements in_2::SuperQ {
+  synthetic constructor •() → self::Class
+    : super in_::LegacyClass::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    core::int? v1 = this.{self::Class::nullabilityMethod}(null){(core::int?, {j: core::int?}) → core::int?};
+    i = super.{in_2::Super::nullabilityMethod}(null);
+    i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_2::Super::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
+    core::int? v2 = this.{self::Class::nullabilityGetter}{core::int?};
+    i = super.{in_2::Super::nullabilityGetter};
+    this.{self::Class::nullabilitySetter} = null;
+    super.{in_2::Super::nullabilitySetter} = null;
+  }
+  abstract member-signature method nullabilityMethod(core::int? i, {core::int? j}) → core::int?; -> in_2::Super::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int? value) → void; -> in_2::Super::nullabilitySetter
+}
+class ClassQ extends in_::LegacyClassQ implements in_2::Super {
+  synthetic constructor •() → self::ClassQ
+    : super in_::LegacyClassQ::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    this.{in_::LegacyClassQ::nullabilityMethod}(null){(core::int*, {j: core::int*}) →* core::int*};
+    i = super.{in_2::SuperQ::nullabilityMethod}(null);
+    i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
+    i = this.{self::ClassQ::nullabilityGetter}{core::int};
+    i = super.{in_2::SuperQ::nullabilityGetter};
+    this.{self::ClassQ::nullabilitySetter} = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    nullabilitySetter = null; // error
+                        ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_2::SuperQ::nullabilitySetter} = null;
+  }
+  abstract member-signature get nullabilityGetter() → core::int; -> in_2::SuperQ::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int value) → void; -> in_2::SuperQ::nullabilitySetter
+}
+class ClassMixedIn extends in_::LegacyMixedIn implements in_2::SuperQ {
+  synthetic constructor •() → self::ClassMixedIn
+    : super in_::LegacyMixedIn::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    invalid-type v1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:63:31: Error: Required named parameter 'j' must be provided.
+    var v1 = nullabilityMethod(null); // ok
+                              ^" in this.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}{<inapplicable>}.(null){(invalid-type) → invalid-type};
+    i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
+    i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
+    core::int v2 = this.{in_::_LegacyMixedIn&Object&Super::nullabilityGetter}{core::int};
+    i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityGetter};
+    this.{self::ClassMixedIn::nullabilitySetter} = null;
+    super.{in_::_LegacyMixedIn&Object&Super::nullabilitySetter} = null;
+  }
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int? value) → void; -> in_2::SuperQ::nullabilitySetter
+}
+class ClassMixedInQ extends in_::LegacyMixedInQ implements in_2::Super {
+  synthetic constructor •() → self::ClassMixedInQ
+    : super in_::LegacyMixedInQ::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    this.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null){(core::int?, {j: core::int?}) →* core::int?};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
+    i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_dill_out_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
+    i = this.{self::ClassMixedInQ::nullabilityGetter}{core::int};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
+    this.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
+    super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
+  }
+  abstract member-signature get nullabilityGetter() → core::int; -> in_2::Super::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.modular.expect
new file mode 100644
index 0000000..1f01c40
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart.weak.modular.expect
@@ -0,0 +1,315 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
+// class Class /* error */ extends LegacyClass implements SuperQ {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int optionalArgumentsMethod(int i) => i;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
+// class ClassQ /* error */ extends LegacyClassQ implements Super {
+//       ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int? optionalArgumentsMethod(int? i) => i;
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
+// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib2.dart:13:16: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedIn with Super implements SuperExtra {}
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
+// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib2.dart:15:16: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedInQ with SuperQ implements SuperExtra {}
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+//     nullabilitySetter = null; // error
+//                         ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+//     nullabilitySetter = null; // error
+//                         ^
+//
+import self as self;
+import "in_out_in_lib2.dart" as in_;
+import "in_out_in_lib1.dart" as in_2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///in_out_in_lib1.dart";
+import "org-dartlang-testcase:///in_out_in_lib2.dart";
+
+class Class extends in_::LegacyClass implements in_2::SuperQ {
+  synthetic constructor •() → self::Class
+    : super in_::LegacyClass::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    core::int? v1 = this.{self::Class::nullabilityMethod}(null){(core::int?, {j: core::int?}) → core::int?};
+    i = super.{in_2::Super::nullabilityMethod}(null);
+    i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_2::Super::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
+    core::int? v2 = this.{self::Class::nullabilityGetter}{core::int?};
+    i = super.{in_2::Super::nullabilityGetter};
+    this.{self::Class::nullabilitySetter} = null;
+    super.{in_2::Super::nullabilitySetter} = null;
+  }
+  abstract member-signature method nullabilityMethod(core::int? i, {core::int? j}) → core::int?; -> in_2::Super::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int? value) → void; -> in_2::Super::nullabilitySetter
+}
+class ClassQ extends in_::LegacyClassQ implements in_2::Super {
+  synthetic constructor •() → self::ClassQ
+    : super in_::LegacyClassQ::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    this.{in_::LegacyClassQ::nullabilityMethod}(null){(core::int*, {j: core::int*}) →* core::int*};
+    i = super.{in_2::SuperQ::nullabilityMethod}(null);
+    i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
+    i = this.{self::ClassQ::nullabilityGetter}{core::int};
+    i = super.{in_2::SuperQ::nullabilityGetter};
+    this.{self::ClassQ::nullabilitySetter} = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    nullabilitySetter = null; // error
+                        ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_2::SuperQ::nullabilitySetter} = null;
+  }
+  abstract member-signature get nullabilityGetter() → core::int; -> in_2::SuperQ::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int value) → void; -> in_2::SuperQ::nullabilitySetter
+}
+class ClassMixedIn extends in_::LegacyMixedIn implements in_2::SuperQ {
+  synthetic constructor •() → self::ClassMixedIn
+    : super in_::LegacyMixedIn::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    core::int? v1 = this.{self::ClassMixedIn::nullabilityMethod}(null){(core::int?, {j: core::int?}) → core::int?};
+    i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
+    i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
+    core::int? v2 = this.{self::ClassMixedIn::nullabilityGetter}{core::int?};
+    i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityGetter};
+    this.{self::ClassMixedIn::nullabilitySetter} = null;
+    super.{in_::_LegacyMixedIn&Object&Super::nullabilitySetter} = null;
+  }
+  abstract member-signature method nullabilityMethod(core::int? i, {core::int? j}) → core::int?; -> in_::_LegacyMixedIn&Object&Super::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int?; -> in_::_LegacyMixedIn&Object&Super::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int? value) → void; -> in_::_LegacyMixedIn&Object&Super::nullabilitySetter
+}
+class ClassMixedInQ extends in_::LegacyMixedInQ implements in_2::Super {
+  synthetic constructor •() → self::ClassMixedInQ
+    : super in_::LegacyMixedInQ::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    this.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null){(core::int*, {j: core::int*}) →* core::int*};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
+    i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
+    i = this.{self::ClassMixedInQ::nullabilityGetter}{core::int};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
+    this.{self::ClassMixedInQ::nullabilitySetter} = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_dill_in/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    nullabilitySetter = null; // error
+                        ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
+  }
+  abstract member-signature get nullabilityGetter() → core::int; -> in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int value) → void; -> in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter
+}
+static method main() → dynamic {}
+
+library;
+import self as in_;
+import "in_out_in_lib1.dart" as in_2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///in_out_in_lib1.dart";
+
+abstract class LegacyClass extends in_2::Super implements in_2::SuperExtra {
+  synthetic constructor •() → in_::LegacyClass*
+    : super in_2::Super::•()
+    ;
+  abstract member-signature method nullabilityMethod(core::int* i, {core::int* j}) → core::int*; -> in_2::Super::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int*; -> in_2::Super::nullabilityGetter
+  abstract member-signature method optionalArgumentsMethod(core::int* i, [core::int* j]) → core::int*; -> in_2::SuperExtra::optionalArgumentsMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int* value) → void; -> in_2::Super::nullabilitySetter
+}
+abstract class LegacyClassQ extends in_2::SuperQ implements in_2::SuperExtra {
+  synthetic constructor •() → in_::LegacyClassQ*
+    : super in_2::SuperQ::•()
+    ;
+  abstract member-signature method nullabilityMethod(core::int* i, {core::int* j}) → core::int*; -> in_2::SuperQ::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int*; -> in_2::SuperQ::nullabilityGetter
+  abstract member-signature method optionalArgumentsMethod(core::int* i, [core::int* j]) → core::int*; -> in_2::SuperExtra::optionalArgumentsMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int* value) → void; -> in_2::SuperQ::nullabilitySetter
+}
+abstract class _LegacyMixedIn&Object&Super = core::Object with in_2::Super /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → in_::_LegacyMixedIn&Object&Super*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method nullabilityMethod(core::int* i, {core::int* j}) → core::int*
+    return super.{in_2::Super::nullabilityMethod}(i, j: j);
+  mixin-super-stub get nullabilityGetter() → core::int*
+    return super.{in_2::Super::nullabilityGetter};
+  mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
+    return super.{in_2::Super::optionalArgumentsMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub set nullabilitySetter(core::int* value) → void
+    return super.{in_2::Super::nullabilitySetter} = value;
+}
+abstract class LegacyMixedIn extends in_::_LegacyMixedIn&Object&Super implements in_2::SuperExtra {
+  synthetic constructor •() → in_::LegacyMixedIn*
+    : super in_::_LegacyMixedIn&Object&Super::•()
+    ;
+  abstract member-signature method optionalArgumentsMethod(core::int* i, [core::int* j]) → core::int*; -> in_2::SuperExtra::optionalArgumentsMethod
+}
+abstract class _LegacyMixedInQ&Object&SuperQ = core::Object with in_2::SuperQ /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → in_::_LegacyMixedInQ&Object&SuperQ*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method nullabilityMethod(core::int* i, {core::int* j}) → core::int*
+    return super.{in_2::SuperQ::nullabilityMethod}(i, j: j);
+  mixin-super-stub get nullabilityGetter() → core::int*
+    return super.{in_2::SuperQ::nullabilityGetter};
+  mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
+    return super.{in_2::SuperQ::optionalArgumentsMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub set nullabilitySetter(core::int* value) → void
+    return super.{in_2::SuperQ::nullabilitySetter} = value;
+}
+abstract class LegacyMixedInQ extends in_::_LegacyMixedInQ&Object&SuperQ implements in_2::SuperExtra {
+  synthetic constructor •() → in_::LegacyMixedInQ*
+    : super in_::_LegacyMixedInQ&Object&SuperQ::•()
+    ;
+  abstract member-signature method optionalArgumentsMethod(core::int* i, [core::int* j]) → core::int*; -> in_2::SuperExtra::optionalArgumentsMethod
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.modular.expect
new file mode 100644
index 0000000..a4ccce2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart.weak.modular.expect
@@ -0,0 +1,369 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:9:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'Class' does not conform to its interface.
+// class Class /* error */ extends LegacyClass implements SuperQ {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:9:7: Context: The method 'Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int optionalArgumentsMethod(int i) => i;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:34:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassQ' does not conform to its interface.
+// class ClassQ /* error */ extends LegacyClassQ implements Super {
+//       ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:20:8: Context: The method 'SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+//   int? optionalArgumentsMethod(int? i) => i;
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:59:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedIn' does not conform to its interface.
+// class ClassMixedIn /* error */ extends LegacyMixedIn implements SuperQ {
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib2.dart:13:16: Context: The method 'Object with Super.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedIn with Super implements SuperExtra {}
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:84:7: Error: The implementation of 'optionalArgumentsMethod' in the non-abstract class 'ClassMixedInQ' does not conform to its interface.
+// class ClassMixedInQ /* error */ extends LegacyMixedInQ implements Super {
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib2.dart:15:16: Context: The method 'Object with SuperQ.optionalArgumentsMethod' has fewer positional arguments than those of overridden method 'SuperExtra.optionalArgumentsMethod'.
+// abstract class LegacyMixedInQ with SuperQ implements SuperExtra {}
+//                ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in_lib1.dart:13:7: Context: This is the overridden method ('optionalArgumentsMethod').
+//   int optionalArgumentsMethod(int i, [int? j]) => i;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:38:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+//     nullabilityMethod(null); // error
+//                       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+//     nullabilitySetter = null; // error
+//                         ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:88:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+//     nullabilityMethod(null); // error
+//                       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     super.optionalArgumentsMethod(null, null); // error
+//                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+//     nullabilitySetter = null; // error
+//                         ^
+//
+import self as self;
+import "in_out_in_lib2.dart" as in_;
+import "in_out_in_lib1.dart" as in_2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///in_out_in_lib1.dart";
+import "org-dartlang-testcase:///in_out_in_lib2.dart";
+
+class Class extends in_::LegacyClass implements in_2::SuperQ {
+  synthetic constructor •() → self::Class
+    : super in_::LegacyClass::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    core::int? v1 = this.{self::Class::nullabilityMethod}(null){(core::int?) → core::int?};
+    i = super.{in_2::Super::nullabilityMethod}(null);
+    i = this.{in_::LegacyClass::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_2::Super::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:21:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_2::Super::optionalArgumentsMethod}(null, null);
+    core::int? v2 = this.{self::Class::nullabilityGetter}{core::int?};
+    i = super.{in_2::Super::nullabilityGetter};
+    this.{self::Class::nullabilitySetter} = null;
+    super.{in_2::Super::nullabilitySetter} = null;
+  }
+  abstract member-signature method nullabilityMethod(core::int? i) → core::int?; -> in_2::Super::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int?; -> in_2::Super::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int? value) → void; -> in_2::Super::nullabilitySetter
+}
+class ClassQ extends in_::LegacyClassQ implements in_2::Super {
+  synthetic constructor •() → self::ClassQ
+    : super in_::LegacyClassQ::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    this.{self::ClassQ::nullabilityMethod}(invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:38:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+    nullabilityMethod(null); // error
+                      ^" in null as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::int};
+    i = super.{in_2::SuperQ::nullabilityMethod}(null);
+    i = this.{in_::LegacyClassQ::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_2::SuperQ::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:46:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_2::SuperQ::optionalArgumentsMethod}(null, null);
+    i = this.{self::ClassQ::nullabilityGetter}{core::int};
+    i = super.{in_2::SuperQ::nullabilityGetter};
+    this.{self::ClassQ::nullabilitySetter} = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:52:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    nullabilitySetter = null; // error
+                        ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_2::SuperQ::nullabilitySetter} = null;
+  }
+  abstract member-signature method nullabilityMethod(core::int i) → core::int; -> in_2::SuperQ::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int; -> in_2::SuperQ::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int value) → void; -> in_2::SuperQ::nullabilitySetter
+}
+class ClassMixedIn extends in_::LegacyMixedIn implements in_2::SuperQ {
+  synthetic constructor •() → self::ClassMixedIn
+    : super in_::LegacyMixedIn::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    core::int? v1 = this.{self::ClassMixedIn::nullabilityMethod}(null){(core::int?) → core::int?};
+    i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityMethod}(null);
+    i = this.{in_::LegacyMixedIn::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:71:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_::_LegacyMixedIn&Object&Super::optionalArgumentsMethod}(null, null);
+    core::int? v2 = this.{self::ClassMixedIn::nullabilityGetter}{core::int?};
+    i = super.{in_::_LegacyMixedIn&Object&Super::nullabilityGetter};
+    this.{self::ClassMixedIn::nullabilitySetter} = null;
+    super.{in_::_LegacyMixedIn&Object&Super::nullabilitySetter} = null;
+  }
+  abstract member-signature method nullabilityMethod(core::int? i) → core::int?; -> in_::_LegacyMixedIn&Object&Super::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int?; -> in_::_LegacyMixedIn&Object&Super::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int? value) → void; -> in_::_LegacyMixedIn&Object&Super::nullabilitySetter
+}
+class ClassMixedInQ extends in_::LegacyMixedInQ implements in_2::Super {
+  synthetic constructor •() → self::ClassMixedInQ
+    : super in_::LegacyMixedInQ::•()
+    ;
+  method test() → dynamic {
+    core::int i;
+    this.{self::ClassMixedInQ::nullabilityMethod}(invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:88:23: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+    nullabilityMethod(null); // error
+                      ^" in null as{TypeError,ForNonNullableByDefault} core::int){(core::int) → core::int};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod}(null);
+    i = this.{in_::LegacyMixedInQ::optionalArgumentsMethod}(null, null){(core::int*, [core::int*]) →* core::int*};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null);
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:96:34: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+    super.optionalArgumentsMethod(null, null); // error
+                                 ^" in super.{in_::_LegacyMixedInQ&Object&SuperQ::optionalArgumentsMethod}(null, null);
+    i = this.{self::ClassMixedInQ::nullabilityGetter}{core::int};
+    i = super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter};
+    this.{self::ClassMixedInQ::nullabilitySetter} = invalid-expression "pkg/front_end/testcases/nnbd_mixed/hierarchy/in_out_in.dart:102:25: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
+    nullabilitySetter = null; // error
+                        ^" in null as{TypeError,ForNonNullableByDefault} core::int;
+    super.{in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter} = null;
+  }
+  abstract member-signature method nullabilityMethod(core::int i) → core::int; -> in_::_LegacyMixedInQ&Object&SuperQ::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int; -> in_::_LegacyMixedInQ&Object&SuperQ::nullabilityGetter
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int value) → void; -> in_::_LegacyMixedInQ&Object&SuperQ::nullabilitySetter
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as in_2;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → in_2::Super
+    : super core::Object::•()
+    ;
+  method nullabilityMethod(core::int i) → core::int
+    return i;
+  get nullabilityGetter() → core::int
+    return 0;
+  set nullabilitySetter(core::int value) → void {}
+  method optionalArgumentsMethod(core::int i) → core::int
+    return i;
+}
+abstract class SuperExtra extends core::Object {
+  synthetic constructor •() → in_2::SuperExtra
+    : super core::Object::•()
+    ;
+  method optionalArgumentsMethod(core::int i, [core::int? j = #C1]) → core::int
+    return i;
+}
+abstract class SuperQ extends core::Object {
+  synthetic constructor •() → in_2::SuperQ
+    : super core::Object::•()
+    ;
+  method nullabilityMethod(core::int? i) → core::int?
+    return i;
+  get nullabilityGetter() → core::int?
+    return null;
+  set nullabilitySetter(core::int? value) → void {}
+  method optionalArgumentsMethod(core::int? i) → core::int?
+    return i;
+}
+
+library;
+import self as in_;
+import "in_out_in_lib1.dart" as in_2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///in_out_in_lib1.dart";
+
+abstract class LegacyClass extends in_2::Super implements in_2::SuperExtra {
+  synthetic constructor •() → in_::LegacyClass*
+    : super in_2::Super::•()
+    ;
+  abstract member-signature method nullabilityMethod(core::int* i) → core::int*; -> in_2::Super::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int*; -> in_2::Super::nullabilityGetter
+  abstract member-signature method optionalArgumentsMethod(core::int* i, [core::int* j = #C1]) → core::int*; -> in_2::SuperExtra::optionalArgumentsMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int* value) → void; -> in_2::Super::nullabilitySetter
+}
+abstract class LegacyClassQ extends in_2::SuperQ implements in_2::SuperExtra {
+  synthetic constructor •() → in_::LegacyClassQ*
+    : super in_2::SuperQ::•()
+    ;
+  abstract member-signature method nullabilityMethod(core::int* i) → core::int*; -> in_2::SuperQ::nullabilityMethod
+  abstract member-signature get nullabilityGetter() → core::int*; -> in_2::SuperQ::nullabilityGetter
+  abstract member-signature method optionalArgumentsMethod(core::int* i, [core::int* j = #C1]) → core::int*; -> in_2::SuperExtra::optionalArgumentsMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature set nullabilitySetter(core::int* value) → void; -> in_2::SuperQ::nullabilitySetter
+}
+abstract class _LegacyMixedIn&Object&Super = core::Object with in_2::Super /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → in_::_LegacyMixedIn&Object&Super*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method nullabilityMethod(core::int* i) → core::int*
+    return super.{in_2::Super::nullabilityMethod}(i);
+  mixin-super-stub get nullabilityGetter() → core::int*
+    return super.{in_2::Super::nullabilityGetter};
+  mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
+    return super.{in_2::Super::optionalArgumentsMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub set nullabilitySetter(core::int* value) → void
+    return super.{in_2::Super::nullabilitySetter} = value;
+}
+abstract class LegacyMixedIn extends in_::_LegacyMixedIn&Object&Super implements in_2::SuperExtra {
+  synthetic constructor •() → in_::LegacyMixedIn*
+    : super in_::_LegacyMixedIn&Object&Super::•()
+    ;
+  abstract member-signature method optionalArgumentsMethod(core::int* i, [core::int* j = #C1]) → core::int*; -> in_2::SuperExtra::optionalArgumentsMethod
+}
+abstract class _LegacyMixedInQ&Object&SuperQ = core::Object with in_2::SuperQ /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → in_::_LegacyMixedInQ&Object&SuperQ*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method nullabilityMethod(core::int* i) → core::int*
+    return super.{in_2::SuperQ::nullabilityMethod}(i);
+  mixin-super-stub get nullabilityGetter() → core::int*
+    return super.{in_2::SuperQ::nullabilityGetter};
+  mixin-super-stub method optionalArgumentsMethod(core::int* i) → core::int*
+    return super.{in_2::SuperQ::optionalArgumentsMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub set nullabilitySetter(core::int* value) → void
+    return super.{in_2::SuperQ::nullabilitySetter} = value;
+}
+abstract class LegacyMixedInQ extends in_::_LegacyMixedInQ&Object&SuperQ implements in_2::SuperExtra {
+  synthetic constructor •() → in_::LegacyMixedInQ*
+    : super in_::_LegacyMixedInQ&Object&SuperQ::•()
+    ;
+  abstract member-signature method optionalArgumentsMethod(core::int* i, [core::int* j = #C1]) → core::int*; -> in_2::SuperExtra::optionalArgumentsMethod
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.modular.expect
new file mode 100644
index 0000000..eeb8541
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart.weak.modular.expect
@@ -0,0 +1,265 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:34:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
+//  - Interface2.extendedMethod
+//  - Interface2.mixedInMethod
+//  - Mixin.mixedInMethod
+//  - Super with Mixin.mixedInMethod
+//  - Super.extendedMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ClassImplements implements Interface2 {}
+//       ^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:19:7: Context: 'Interface2.extendedMethod' is defined here.
+//   int extendedMethod();
+//       ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:20:7: Context: 'Interface2.mixedInMethod' is defined here.
+//   int mixedInMethod();
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Mixin.mixedInMethod' is defined here.
+//   num mixedInMethod() => 0;
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:10:7: Context: 'Super with Mixin.mixedInMethod' is defined here.
+//   num mixedInMethod() => 0;
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: 'Super.extendedMethod' is defined here.
+//   num extendedMethod() => 0;
+//       ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+//   int mixedInMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:23:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtends' does not conform to its interface.
+// class ClassExtends extends Super with Mixin implements Interface1 {}
+//       ^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+//   num extendedMethod() => 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+//   int extendedMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:15:7: Context: This is the overridden method ('mixedInMethod').
+//   int mixedInMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:25:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassExtendsWithNoSuchMethod extends Super
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'Interface1.extendedMethod'.
+// Change to a subtype of 'int'.
+//   num extendedMethod() => 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:14:7: Context: This is the overridden method ('extendedMethod').
+//   int extendedMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:43:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassDeclaresExtends' does not conform to its interface.
+// class ClassDeclaresExtends extends Super with Mixin {
+//       ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'ClassDeclaresExtends.extendedMethod'.
+// Change to a subtype of 'int'.
+//   num extendedMethod() => 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:44:7: Context: This is the overridden method ('extendedMethod').
+//   int extendedMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:43:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassDeclaresExtends' does not conform to its interface.
+// class ClassDeclaresExtends extends Super with Mixin {
+//       ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:43:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'ClassDeclaresExtends.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassDeclaresExtends extends Super with Mixin {
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:45:7: Context: This is the overridden method ('mixedInMethod').
+//   int mixedInMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:48:7: Error: The implementation of 'extendedMethod' in the non-abstract class 'ClassDeclaresExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassDeclaresExtendsWithNoSuchMethod extends Super with Mixin {
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:6:7: Context: The return type of the method 'Super.extendedMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'ClassDeclaresExtendsWithNoSuchMethod.extendedMethod'.
+// Change to a subtype of 'int'.
+//   num extendedMethod() => 0;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:54:7: Context: This is the overridden method ('extendedMethod').
+//   int extendedMethod();
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:48:7: Error: The implementation of 'mixedInMethod' in the non-abstract class 'ClassDeclaresExtendsWithNoSuchMethod' does not conform to its interface.
+// class ClassDeclaresExtendsWithNoSuchMethod extends Super with Mixin {
+//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:48:7: Context: The return type of the method 'Super with Mixin.mixedInMethod' is 'num', which does not match the return type, 'int', of the overridden method, 'ClassDeclaresExtendsWithNoSuchMethod.mixedInMethod'.
+// Change to a subtype of 'int'.
+// class ClassDeclaresExtendsWithNoSuchMethod extends Super with Mixin {
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/inherited_implements.dart:55:7: Context: This is the overridden method ('mixedInMethod').
+//   int mixedInMethod();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedMethod() → core::num
+    return 0;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method mixedInMethod() → core::num
+    return 0;
+}
+abstract class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  abstract method extendedMethod() → core::int;
+  abstract method mixedInMethod() → core::int;
+}
+abstract class _Interface2&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Interface2&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInMethod() → core::num
+    return super.{self::Mixin::mixedInMethod}();
+}
+abstract class Interface2 extends self::_Interface2&Super&Mixin {
+  synthetic constructor •() → self::Interface2
+    : super self::_Interface2&Super&Mixin::•()
+    ;
+  abstract method extendedMethod() → core::int;
+  abstract method mixedInMethod() → core::int;
+}
+abstract class _ClassExtends&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassExtends&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInMethod() → core::num
+    return super.{self::Mixin::mixedInMethod}();
+}
+class ClassExtends extends self::_ClassExtends&Super&Mixin implements self::Interface1 {
+  synthetic constructor •() → self::ClassExtends
+    : super self::_ClassExtends&Super&Mixin::•()
+    ;
+  abstract member-signature method mixedInMethod() → core::int; -> self::Interface1::mixedInMethod
+  abstract member-signature method extendedMethod() → core::int; -> self::Interface1::extendedMethod
+}
+abstract class _ClassExtendsWithNoSuchMethod&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassExtendsWithNoSuchMethod&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInMethod() → core::num
+    return super.{self::Mixin::mixedInMethod}();
+}
+class ClassExtendsWithNoSuchMethod extends self::_ClassExtendsWithNoSuchMethod&Super&Mixin implements self::Interface1 {
+  synthetic constructor •() → self::ClassExtendsWithNoSuchMethod
+    : super self::_ClassExtendsWithNoSuchMethod&Super&Mixin::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return super.{core::Object::noSuchMethod}(invocation);
+  }
+  abstract member-signature method mixedInMethod() → core::int; -> self::Interface1::mixedInMethod
+  abstract member-signature method extendedMethod() → core::int; -> self::Interface1::extendedMethod
+}
+class ClassImplements extends core::Object implements self::Interface2 {
+  synthetic constructor •() → self::ClassImplements
+    : super core::Object::•()
+    ;
+}
+class ClassImplementsWithNoSuchMethod extends core::Object implements self::Interface2 {
+  synthetic constructor •() → self::ClassImplementsWithNoSuchMethod
+    : super core::Object::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return super.{core::Object::noSuchMethod}(invocation);
+  }
+  no-such-method-forwarder method mixedInMethod() → core::int
+    return this.{self::ClassImplementsWithNoSuchMethod::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder method extendedMethod() → core::int
+    return this.{self::ClassImplementsWithNoSuchMethod::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+abstract class _ClassDeclaresExtends&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassDeclaresExtends&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInMethod() → core::num
+    return super.{self::Mixin::mixedInMethod}();
+}
+class ClassDeclaresExtends extends self::_ClassDeclaresExtends&Super&Mixin {
+  synthetic constructor •() → self::ClassDeclaresExtends
+    : super self::_ClassDeclaresExtends&Super&Mixin::•()
+    ;
+  abstract method extendedMethod() → core::int;
+  abstract method mixedInMethod() → core::int;
+}
+abstract class _ClassDeclaresExtendsWithNoSuchMethod&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassDeclaresExtendsWithNoSuchMethod&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInMethod() → core::num
+    return super.{self::Mixin::mixedInMethod}();
+}
+class ClassDeclaresExtendsWithNoSuchMethod extends self::_ClassDeclaresExtendsWithNoSuchMethod&Super&Mixin {
+  synthetic constructor •() → self::ClassDeclaresExtendsWithNoSuchMethod
+    : super self::_ClassDeclaresExtendsWithNoSuchMethod&Super&Mixin::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return super.{core::Object::noSuchMethod}(invocation);
+  }
+  abstract method extendedMethod() → core::int;
+  abstract method mixedInMethod() → core::int;
+}
+class ClassDeclaresImplementsWithNoSuchMethod extends core::Object implements self::Super, self::Mixin {
+  synthetic constructor •() → self::ClassDeclaresImplementsWithNoSuchMethod
+    : super core::Object::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return super.{core::Object::noSuchMethod}(invocation);
+  }
+  no-such-method-forwarder method extendedMethod() → core::int
+    return this.{self::ClassDeclaresImplementsWithNoSuchMethod::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder method mixedInMethod() → core::int
+    return this.{self::ClassDeclaresImplementsWithNoSuchMethod::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = #mixedInMethod
+  #C3 = <core::Type*>[]
+  #C4 = <dynamic>[]
+  #C5 = <core::Symbol*, dynamic>{)
+  #C6 = #extendedMethod
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.modular.expect
new file mode 100644
index 0000000..f789cb9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart.weak.modular.expect
@@ -0,0 +1,185 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:11:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.implementedMethod
+//  - Interface1.implementedMultipleMethod
+//  - Interface2.implementedMultipleMethod
+//  - Super.extendedAbstractImplementedMethod
+//  - Super.extendedAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteSub extends AbstractClass {}
+//       ^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
+//   void implementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:22:8: Context: 'Interface1.implementedMultipleMethod' is defined here.
+//   void implementedMultipleMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:26:8: Context: 'Interface2.implementedMultipleMethod' is defined here.
+//   void implementedMultipleMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature.dart:13:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
+//  - Interface1.extendedAbstractImplementedMethod
+//  - Interface1.implementedMethod
+//  - Interface1.implementedMultipleMethod
+//  - Interface2.implementedMultipleMethod
+//  - Super.extendedAbstractImplementedMethod
+//  - Super.extendedAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ConcreteClass extends Super implements Interface1, Interface2 {}
+//       ^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:18:8: Context: 'Interface1.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:20:8: Context: 'Interface1.implementedMethod' is defined here.
+//   void implementedMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:22:8: Context: 'Interface1.implementedMultipleMethod' is defined here.
+//   void implementedMultipleMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:26:8: Context: 'Interface2.implementedMultipleMethod' is defined here.
+//   void implementedMultipleMethod(int i) {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:12:8: Context: 'Super.extendedAbstractImplementedMethod' is defined here.
+//   void extendedAbstractImplementedMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/member_signature_lib.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "member_signature_lib.dart" as mem;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///member_signature_lib.dart";
+
+abstract class AbstractClass extends mem::Super implements mem::Interface1, mem::Interface2 {
+  synthetic constructor •() → self::AbstractClass*
+    : super mem::Super::•()
+    ;
+  abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
+  abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
+  abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
+  abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
+}
+class ConcreteSub extends self::AbstractClass {
+  synthetic constructor •() → self::ConcreteSub*
+    : super self::AbstractClass::•()
+    ;
+}
+class ConcreteClass extends mem::Super implements mem::Interface1, mem::Interface2 {
+  synthetic constructor •() → self::ConcreteClass*
+    : super mem::Super::•()
+    ;
+  abstract member-signature method extendedConcreteMethod(core::int* i) → void; -> mem::Super::extendedConcreteMethod
+  abstract member-signature method extendedConcreteImplementedMethod(core::int* i) → void; -> mem::Super::extendedConcreteImplementedMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method extendedAbstractMethod(core::int* i) → void; -> mem::Super::extendedAbstractMethod
+  abstract member-signature method extendedAbstractImplementedMethod(core::int* i) → void; -> mem::Super::extendedAbstractImplementedMethod
+  abstract member-signature method implementedMethod(core::int* i) → void; -> mem::Interface1::implementedMethod
+  abstract member-signature method implementedMultipleMethod(core::int* i) → void; -> mem::Interface1::implementedMultipleMethod
+}
+abstract class OptOutInterface extends core::Object {
+  synthetic constructor •() → self::OptOutInterface*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class ClassImplementsOptOut extends core::Object implements self::OptOutInterface {
+  synthetic constructor •() → self::ClassImplementsOptOut*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mem;
+import "dart:core" as core;
+
+abstract class Super extends core::Object {
+  synthetic constructor •() → mem::Super
+    : super core::Object::•()
+    ;
+  method extendedConcreteMethod(core::int i) → void {}
+  abstract method extendedAbstractMethod(core::int i) → void;
+  method extendedConcreteImplementedMethod(core::int i) → void {}
+  abstract method extendedAbstractImplementedMethod(core::int i) → void;
+}
+abstract class Interface1 extends core::Object {
+  synthetic constructor •() → mem::Interface1
+    : super core::Object::•()
+    ;
+  method extendedConcreteImplementedMethod(core::int i) → void {}
+  method extendedAbstractImplementedMethod(core::int i) → void {}
+  method implementedMethod(core::int i) → void {}
+  method implementedMultipleMethod(core::int i) → void {}
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → mem::Interface2
+    : super core::Object::•()
+    ;
+  method implementedMultipleMethod(core::int i) → void {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.modular.expect
new file mode 100644
index 0000000..185fc0d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart.weak.modular.expect
@@ -0,0 +1,239 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:5:7: Error: The non-abstract class 'Super' is missing implementations for these members:
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractField=
+//  - Super.extendedAbstractMixedInAbstractField
+//  - Super.extendedAbstractMixedInAbstractField=
+//  - Super.extendedAbstractMixedInConcreteField
+//  - Super.extendedAbstractMixedInConcreteField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:12:16: Context: 'Super.extendedAbstractMixedInConcreteField' is defined here.
+//   abstract int extendedAbstractMixedInConcreteField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:12:16: Context: 'Super.extendedAbstractMixedInConcreteField=' is defined here.
+//   abstract int extendedAbstractMixedInConcreteField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:19:7: Error: The non-abstract class 'Mixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractField
+//  - Mixin.extendedAbstractMixedInAbstractField=
+//  - Mixin.extendedConcreteMixedInAbstractField
+//  - Mixin.extendedConcreteMixedInAbstractField=
+//  - Mixin.mixedInAbstractField
+//  - Mixin.mixedInAbstractField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Mixin {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:30:16: Context: 'Mixin.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:30:16: Context: 'Mixin.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:28:16: Context: 'Mixin.extendedConcreteMixedInAbstractField' is defined here.
+//   abstract int extendedConcreteMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:28:16: Context: 'Mixin.extendedConcreteMixedInAbstractField=' is defined here.
+//   abstract int extendedConcreteMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:22:16: Context: 'Mixin.mixedInAbstractField' is defined here.
+//   abstract int mixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:22:16: Context: 'Mixin.mixedInAbstractField=' is defined here.
+//   abstract int mixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractField
+//  - Mixin.extendedAbstractMixedInAbstractField=
+//  - Mixin.mixedInAbstractField
+//  - Mixin.mixedInAbstractField=
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractField=
+//  - Super.extendedAbstractMixedInAbstractField
+//  - Super.extendedAbstractMixedInAbstractField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:30:16: Context: 'Mixin.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:30:16: Context: 'Mixin.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:22:16: Context: 'Mixin.mixedInAbstractField' is defined here.
+//   abstract int mixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:22:16: Context: 'Mixin.mixedInAbstractField=' is defined here.
+//   abstract int mixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractField
+//  - Mixin.extendedAbstractMixedInAbstractField=
+//  - Mixin.mixedInAbstractField
+//  - Mixin.mixedInAbstractField=
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractField=
+//  - Super.extendedAbstractMixedInAbstractField
+//  - Super.extendedAbstractMixedInAbstractField=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:30:16: Context: 'Mixin.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:30:16: Context: 'Mixin.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:22:16: Context: 'Mixin.mixedInAbstractField' is defined here.
+//   abstract int mixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:22:16: Context: 'Mixin.mixedInAbstractField=' is defined here.
+//   abstract int mixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:8:16: Context: 'Super.extendedAbstractField=' is defined here.
+//   abstract int extendedAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_field.dart:16:16: Context: 'Super.extendedAbstractMixedInAbstractField=' is defined here.
+//   abstract int extendedAbstractMixedInAbstractField;
+//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int extendedConcreteField = 0;
+  field core::int extendedConcreteMixedInConcreteField = 0;
+  field core::int extendedConcreteMixedInAbstractField = 0;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractField() → core::int;
+  abstract set extendedAbstractField(core::int #externalFieldValue) → void;
+  abstract get extendedAbstractMixedInConcreteField() → core::int;
+  abstract set extendedAbstractMixedInConcreteField(core::int #externalFieldValue) → void;
+  abstract get extendedAbstractMixedInAbstractField() → core::int;
+  abstract set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void;
+}
+class Mixin extends core::Object {
+  field core::int mixedInConcreteField = 0;
+  field core::int extendedConcreteMixedInConcreteField = 0;
+  field core::int extendedAbstractMixedInConcreteField = 0;
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  abstract get mixedInAbstractField() → core::int;
+  abstract set mixedInAbstractField(core::int #externalFieldValue) → void;
+  abstract get extendedConcreteMixedInAbstractField() → core::int;
+  abstract set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void;
+  abstract get extendedAbstractMixedInAbstractField() → core::int;
+  abstract set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void;
+}
+abstract class _ClassMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassMixin&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get mixedInConcreteField() → core::int
+    return super.{self::Mixin::mixedInConcreteField};
+  mixin-super-stub set mixedInConcreteField(core::int value) → void
+    return super.{self::Mixin::mixedInConcreteField} = value;
+  abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+  abstract mixin-stub set mixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::mixedInAbstractField
+  mixin-super-stub get extendedConcreteMixedInConcreteField() → core::int
+    return super.{self::Mixin::extendedConcreteMixedInConcreteField};
+  mixin-super-stub set extendedConcreteMixedInConcreteField(core::int value) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteField} = value;
+  mixin-super-stub get extendedAbstractMixedInConcreteField() → core::int
+    return super.{self::Mixin::extendedAbstractMixedInConcreteField};
+  mixin-super-stub set extendedAbstractMixedInConcreteField(core::int value) → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteField} = value;
+  abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
+  abstract mixin-stub set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedAbstractMixedInAbstractField
+}
+class ClassMixin extends self::_ClassMixin&Super&Mixin {
+  synthetic constructor •() → self::ClassMixin
+    : super self::_ClassMixin&Super&Mixin::•()
+    ;
+}
+class NamedMixin = self::Super with self::Mixin {
+  synthetic constructor •() → self::NamedMixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get mixedInConcreteField() → core::int
+    return super.{self::Mixin::mixedInConcreteField};
+  mixin-super-stub set mixedInConcreteField(core::int value) → void
+    return super.{self::Mixin::mixedInConcreteField} = value;
+  abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+  abstract mixin-stub set mixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::mixedInAbstractField
+  mixin-super-stub get extendedConcreteMixedInConcreteField() → core::int
+    return super.{self::Mixin::extendedConcreteMixedInConcreteField};
+  mixin-super-stub set extendedConcreteMixedInConcreteField(core::int value) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteField} = value;
+  mixin-super-stub get extendedAbstractMixedInConcreteField() → core::int
+    return super.{self::Mixin::extendedAbstractMixedInConcreteField};
+  mixin-super-stub set extendedAbstractMixedInConcreteField(core::int value) → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteField} = value;
+  abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub set extendedConcreteMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
+  abstract mixin-stub set extendedAbstractMixedInAbstractField(core::int #externalFieldValue) → void; -> self::Mixin::extendedAbstractMixedInAbstractField
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.modular.expect
new file mode 100644
index 0000000..aa5c0aa6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart.weak.modular.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:5:7: Error: The non-abstract class 'Super' is missing implementations for these members:
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractMixedInAbstractField
+//  - Super.extendedAbstractMixedInConcreteField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract final int extendedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:12:22: Context: 'Super.extendedAbstractMixedInConcreteField' is defined here.
+//   abstract final int extendedAbstractMixedInConcreteField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:19:7: Error: The non-abstract class 'Mixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractField
+//  - Mixin.extendedConcreteMixedInAbstractField
+//  - Mixin.mixedInAbstractField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Mixin {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:30:22: Context: 'Mixin.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:28:22: Context: 'Mixin.extendedConcreteMixedInAbstractField' is defined here.
+//   abstract final int extendedConcreteMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:22:22: Context: 'Mixin.mixedInAbstractField' is defined here.
+//   abstract final int mixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractField
+//  - Mixin.mixedInAbstractField
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractMixedInAbstractField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:30:22: Context: 'Mixin.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:22:22: Context: 'Mixin.mixedInAbstractField' is defined here.
+//   abstract final int mixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract final int extendedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractField
+//  - Mixin.mixedInAbstractField
+//  - Super.extendedAbstractField
+//  - Super.extendedAbstractMixedInAbstractField
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:30:22: Context: 'Mixin.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:22:22: Context: 'Mixin.mixedInAbstractField' is defined here.
+//   abstract final int mixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:8:22: Context: 'Super.extendedAbstractField' is defined here.
+//   abstract final int extendedAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_final_field.dart:16:22: Context: 'Super.extendedAbstractMixedInAbstractField' is defined here.
+//   abstract final int extendedAbstractMixedInAbstractField;
+//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  final field core::int extendedConcreteField = 0;
+  final field core::int extendedConcreteMixedInConcreteField = 0;
+  final field core::int extendedConcreteMixedInAbstractField = 0;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  abstract get extendedAbstractField() → core::int;
+  abstract get extendedAbstractMixedInConcreteField() → core::int;
+  abstract get extendedAbstractMixedInAbstractField() → core::int;
+}
+class Mixin extends core::Object {
+  final field core::int mixedInConcreteField = 0;
+  final field core::int extendedConcreteMixedInConcreteField = 0;
+  final field core::int extendedAbstractMixedInConcreteField = 0;
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  abstract get mixedInAbstractField() → core::int;
+  abstract get extendedConcreteMixedInAbstractField() → core::int;
+  abstract get extendedAbstractMixedInAbstractField() → core::int;
+}
+abstract class _ClassMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassMixin&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get mixedInConcreteField() → core::int
+    return super.{self::Mixin::mixedInConcreteField};
+  mixin-super-stub get extendedConcreteMixedInConcreteField() → core::int
+    return super.{self::Mixin::extendedConcreteMixedInConcreteField};
+  mixin-super-stub get extendedAbstractMixedInConcreteField() → core::int
+    return super.{self::Mixin::extendedAbstractMixedInConcreteField};
+  abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+  abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
+}
+class ClassMixin extends self::_ClassMixin&Super&Mixin {
+  synthetic constructor •() → self::ClassMixin
+    : super self::_ClassMixin&Super&Mixin::•()
+    ;
+}
+class NamedMixin = self::Super with self::Mixin {
+  synthetic constructor •() → self::NamedMixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get mixedInConcreteField() → core::int
+    return super.{self::Mixin::mixedInConcreteField};
+  mixin-super-stub get extendedConcreteMixedInConcreteField() → core::int
+    return super.{self::Mixin::extendedConcreteMixedInConcreteField};
+  mixin-super-stub get extendedAbstractMixedInConcreteField() → core::int
+    return super.{self::Mixin::extendedAbstractMixedInConcreteField};
+  abstract mixin-stub get extendedConcreteMixedInAbstractField() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractField
+  abstract mixin-stub get mixedInAbstractField() → core::int; -> self::Mixin::mixedInAbstractField
+  abstract mixin-stub get extendedAbstractMixedInAbstractField() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractField
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..09d72f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart.weak.modular.expect
@@ -0,0 +1,165 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:5:7: Error: The non-abstract class 'Super' is missing implementations for these members:
+//  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractMixedInAbstractGetter
+//  - Super.extendedAbstractMixedInConcreteGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
+//   int get extendedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:12:11: Context: 'Super.extendedAbstractMixedInConcreteGetter' is defined here.
+//   int get extendedAbstractMixedInConcreteGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:19:7: Error: The non-abstract class 'Mixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractGetter
+//  - Mixin.extendedConcreteMixedInAbstractGetter
+//  - Mixin.mixedInAbstractGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Mixin {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:30:11: Context: 'Mixin.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:28:11: Context: 'Mixin.extendedConcreteMixedInAbstractGetter' is defined here.
+//   int get extendedConcreteMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:22:11: Context: 'Mixin.mixedInAbstractGetter' is defined here.
+//   int get mixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractGetter
+//  - Mixin.mixedInAbstractGetter
+//  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractMixedInAbstractGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:30:11: Context: 'Mixin.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:22:11: Context: 'Mixin.mixedInAbstractGetter' is defined here.
+//   int get mixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
+//   int get extendedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractGetter
+//  - Mixin.mixedInAbstractGetter
+//  - Super.extendedAbstractGetter
+//  - Super.extendedAbstractMixedInAbstractGetter
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:30:11: Context: 'Mixin.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:22:11: Context: 'Mixin.mixedInAbstractGetter' is defined here.
+//   int get mixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:8:11: Context: 'Super.extendedAbstractGetter' is defined here.
+//   int get extendedAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_getter.dart:16:11: Context: 'Super.extendedAbstractMixedInAbstractGetter' is defined here.
+//   int get extendedAbstractMixedInAbstractGetter;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  get extendedConcreteGetter() → core::int
+    return 0;
+  abstract get extendedAbstractGetter() → core::int;
+  get extendedConcreteMixedInConcreteGetter() → core::int
+    return 0;
+  abstract get extendedAbstractMixedInConcreteGetter() → core::int;
+  get extendedConcreteMixedInAbstractGetter() → core::int
+    return 0;
+  abstract get extendedAbstractMixedInAbstractGetter() → core::int;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  get mixedInConcreteGetter() → core::int
+    return 0;
+  abstract get mixedInAbstractGetter() → core::int;
+  get extendedConcreteMixedInConcreteGetter() → core::int
+    return 0;
+  get extendedAbstractMixedInConcreteGetter() → core::int
+    return 0;
+  abstract get extendedConcreteMixedInAbstractGetter() → core::int;
+  abstract get extendedAbstractMixedInAbstractGetter() → core::int;
+}
+abstract class _ClassMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassMixin&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get mixedInConcreteGetter() → core::int
+    return super.{self::Mixin::mixedInConcreteGetter};
+  mixin-super-stub get extendedConcreteMixedInConcreteGetter() → core::int
+    return super.{self::Mixin::extendedConcreteMixedInConcreteGetter};
+  mixin-super-stub get extendedAbstractMixedInConcreteGetter() → core::int
+    return super.{self::Mixin::extendedAbstractMixedInConcreteGetter};
+  abstract mixin-stub get extendedConcreteMixedInAbstractGetter() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractGetter
+  abstract mixin-stub get mixedInAbstractGetter() → core::int; -> self::Mixin::mixedInAbstractGetter
+  abstract mixin-stub get extendedAbstractMixedInAbstractGetter() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractGetter
+}
+class ClassMixin extends self::_ClassMixin&Super&Mixin {
+  synthetic constructor •() → self::ClassMixin
+    : super self::_ClassMixin&Super&Mixin::•()
+    ;
+}
+class NamedMixin = self::Super with self::Mixin {
+  synthetic constructor •() → self::NamedMixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub get mixedInConcreteGetter() → core::int
+    return super.{self::Mixin::mixedInConcreteGetter};
+  mixin-super-stub get extendedConcreteMixedInConcreteGetter() → core::int
+    return super.{self::Mixin::extendedConcreteMixedInConcreteGetter};
+  mixin-super-stub get extendedAbstractMixedInConcreteGetter() → core::int
+    return super.{self::Mixin::extendedAbstractMixedInConcreteGetter};
+  abstract mixin-stub get extendedConcreteMixedInAbstractGetter() → core::int; -> self::Mixin::extendedConcreteMixedInAbstractGetter
+  abstract mixin-stub get mixedInAbstractGetter() → core::int; -> self::Mixin::mixedInAbstractGetter
+  abstract mixin-stub get extendedAbstractMixedInAbstractGetter() → core::int; -> self::Mixin::extendedAbstractMixedInAbstractGetter
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.modular.expect
new file mode 100644
index 0000000..2c5b765
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart.weak.modular.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:5:7: Error: The non-abstract class 'Super' is missing implementations for these members:
+//  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
+//  - Super.extendedAbstractMixedInConcreteMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:12:8: Context: 'Super.extendedAbstractMixedInConcreteMethod' is defined here.
+//   void extendedAbstractMixedInConcreteMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:19:7: Error: The non-abstract class 'Mixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractMethod
+//  - Mixin.extendedConcreteMixedInAbstractMethod
+//  - Mixin.mixedInAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Mixin {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:30:8: Context: 'Mixin.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:28:8: Context: 'Mixin.extendedConcreteMixedInAbstractMethod' is defined here.
+//   void extendedConcreteMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:22:8: Context: 'Mixin.mixedInAbstractMethod' is defined here.
+//   void mixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractMethod
+//  - Mixin.mixedInAbstractMethod
+//  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:30:8: Context: 'Mixin.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:22:8: Context: 'Mixin.mixedInAbstractMethod' is defined here.
+//   void mixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractMethod
+//  - Mixin.mixedInAbstractMethod
+//  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:30:8: Context: 'Mixin.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:22:8: Context: 'Mixin.mixedInAbstractMethod' is defined here.
+//   void mixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_method.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedConcreteMethod() → void {}
+  abstract method extendedAbstractMethod() → void;
+  method extendedConcreteMixedInConcreteMethod() → void {}
+  abstract method extendedAbstractMixedInConcreteMethod() → void;
+  method extendedConcreteMixedInAbstractMethod() → void {}
+  abstract method extendedAbstractMixedInAbstractMethod() → void;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method mixedInConcreteMethod() → void {}
+  abstract method mixedInAbstractMethod() → void;
+  method extendedConcreteMixedInConcreteMethod() → void {}
+  method extendedAbstractMixedInConcreteMethod() → void {}
+  abstract method extendedConcreteMixedInAbstractMethod() → void;
+  abstract method extendedAbstractMixedInAbstractMethod() → void;
+}
+abstract class _ClassMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassMixin&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInConcreteMethod() → void
+    return super.{self::Mixin::mixedInConcreteMethod}();
+  mixin-super-stub method extendedConcreteMixedInConcreteMethod() → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
+  mixin-super-stub method extendedAbstractMixedInConcreteMethod() → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}();
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  abstract mixin-stub method mixedInAbstractMethod() → void; -> self::Mixin::mixedInAbstractMethod
+  abstract mixin-stub method extendedAbstractMixedInAbstractMethod() → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
+}
+class ClassMixin extends self::_ClassMixin&Super&Mixin {
+  synthetic constructor •() → self::ClassMixin
+    : super self::_ClassMixin&Super&Mixin::•()
+    ;
+}
+class NamedMixin = self::Super with self::Mixin {
+  synthetic constructor •() → self::NamedMixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInConcreteMethod() → void
+    return super.{self::Mixin::mixedInConcreteMethod}();
+  mixin-super-stub method extendedConcreteMixedInConcreteMethod() → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}();
+  mixin-super-stub method extendedAbstractMixedInConcreteMethod() → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}();
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod() → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  abstract mixin-stub method mixedInAbstractMethod() → void; -> self::Mixin::mixedInAbstractMethod
+  abstract mixin-stub method extendedAbstractMixedInAbstractMethod() → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.modular.expect
new file mode 100644
index 0000000..77883ed
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart.weak.modular.expect
@@ -0,0 +1,249 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:5:7: Error: The non-abstract class 'Super' is missing implementations for these members:
+//  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
+//  - Super.extendedAbstractMixedInConcreteMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:12:8: Context: 'Super.extendedAbstractMixedInConcreteMethod' is defined here.
+//   void extendedAbstractMixedInConcreteMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:19:7: Error: The non-abstract class 'Mixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractMethod
+//  - Mixin.extendedConcreteMixedInAbstractMethod
+//  - Mixin.mixedInAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Mixin {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:30:8: Context: 'Mixin.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:28:8: Context: 'Mixin.extendedConcreteMixedInAbstractMethod' is defined here.
+//   void extendedConcreteMixedInAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:22:8: Context: 'Mixin.mixedInAbstractMethod' is defined here.
+//   void mixedInAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractMethod
+//  - Mixin.mixedInAbstractMethod
+//  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:30:8: Context: 'Mixin.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:22:8: Context: 'Mixin.mixedInAbstractMethod' is defined here.
+//   void mixedInAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractMethod
+//  - Mixin.mixedInAbstractMethod
+//  - Super.extendedAbstractMethod
+//  - Super.extendedAbstractMixedInAbstractMethod
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:30:8: Context: 'Mixin.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:22:8: Context: 'Mixin.mixedInAbstractMethod' is defined here.
+//   void mixedInAbstractMethod(int i);
+//        ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:8:8: Context: 'Super.extendedAbstractMethod' is defined here.
+//   void extendedAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: 'Super.extendedAbstractMixedInAbstractMethod' is defined here.
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedConcreteMixedInConcreteMethod'.
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:24:8: Context: The method 'Mixin.extendedConcreteMixedInConcreteMethod' has more required arguments than those of overridden method 'Super.extendedConcreteMixedInConcreteMethod'.
+//   void extendedConcreteMixedInConcreteMethod(int i) {}
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:10:8: Context: This is the overridden method ('extendedConcreteMixedInConcreteMethod').
+//   void extendedConcreteMixedInConcreteMethod() {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedAbstractMixedInConcreteMethod'.
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:26:8: Context: The method 'Mixin.extendedAbstractMixedInConcreteMethod' has more required arguments than those of overridden method 'Super.extendedAbstractMixedInConcreteMethod'.
+//   void extendedAbstractMixedInConcreteMethod(int i) {}
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:12:8: Context: This is the overridden method ('extendedAbstractMixedInConcreteMethod').
+//   void extendedAbstractMixedInConcreteMethod();
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedConcreteMixedInAbstractMethod'.
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:28:8: Context: The method 'Mixin.extendedConcreteMixedInAbstractMethod' has more required arguments than those of overridden method 'Super.extendedConcreteMixedInAbstractMethod'.
+//   void extendedConcreteMixedInAbstractMethod(int i);
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:14:8: Context: This is the overridden method ('extendedConcreteMixedInAbstractMethod').
+//   void extendedConcreteMixedInAbstractMethod() {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: Applying the mixin 'Mixin' to 'Super' introduces an erroneous override of 'extendedAbstractMixedInAbstractMethod'.
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:30:8: Context: The method 'Mixin.extendedAbstractMixedInAbstractMethod' has more required arguments than those of overridden method 'Super.extendedAbstractMixedInAbstractMethod'.
+//   void extendedAbstractMixedInAbstractMethod(int i);
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: This is the overridden method ('extendedAbstractMixedInAbstractMethod').
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Error: The implementation of 'extendedConcreteMixedInAbstractMethod' in the non-abstract class 'ClassMixin' does not conform to its interface.
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:14:8: Context: The method 'Super.extendedConcreteMixedInAbstractMethod' has fewer positional arguments than those of overridden method 'Super with Mixin.extendedConcreteMixedInAbstractMethod'.
+//   void extendedConcreteMixedInAbstractMethod() {}
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:33:7: Context: This is the overridden method ('extendedConcreteMixedInAbstractMethod').
+// class ClassMixin extends Super with Mixin {}
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The mixin application class 'NamedMixin' introduces an erroneous override of 'extendedConcreteMixedInConcreteMethod'.
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:24:8: Context: The method 'Mixin.extendedConcreteMixedInConcreteMethod' has more required arguments than those of overridden method 'Super.extendedConcreteMixedInConcreteMethod'.
+//   void extendedConcreteMixedInConcreteMethod(int i) {}
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:10:8: Context: This is the overridden method ('extendedConcreteMixedInConcreteMethod').
+//   void extendedConcreteMixedInConcreteMethod() {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The mixin application class 'NamedMixin' introduces an erroneous override of 'extendedAbstractMixedInConcreteMethod'.
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:26:8: Context: The method 'Mixin.extendedAbstractMixedInConcreteMethod' has more required arguments than those of overridden method 'Super.extendedAbstractMixedInConcreteMethod'.
+//   void extendedAbstractMixedInConcreteMethod(int i) {}
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:12:8: Context: This is the overridden method ('extendedAbstractMixedInConcreteMethod').
+//   void extendedAbstractMixedInConcreteMethod();
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The mixin application class 'NamedMixin' introduces an erroneous override of 'extendedConcreteMixedInAbstractMethod'.
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:28:8: Context: The method 'Mixin.extendedConcreteMixedInAbstractMethod' has more required arguments than those of overridden method 'Super.extendedConcreteMixedInAbstractMethod'.
+//   void extendedConcreteMixedInAbstractMethod(int i);
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:14:8: Context: This is the overridden method ('extendedConcreteMixedInAbstractMethod').
+//   void extendedConcreteMixedInAbstractMethod() {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:35:7: Error: The mixin application class 'NamedMixin' introduces an erroneous override of 'extendedAbstractMixedInAbstractMethod'.
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:30:8: Context: The method 'Mixin.extendedAbstractMixedInAbstractMethod' has more required arguments than those of overridden method 'Super.extendedAbstractMixedInAbstractMethod'.
+//   void extendedAbstractMixedInAbstractMethod(int i);
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_override.dart:16:8: Context: This is the overridden method ('extendedAbstractMixedInAbstractMethod').
+//   void extendedAbstractMixedInAbstractMethod();
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedConcreteMethod() → void {}
+  abstract method extendedAbstractMethod() → void;
+  method extendedConcreteMixedInConcreteMethod() → void {}
+  abstract method extendedAbstractMixedInConcreteMethod() → void;
+  method extendedConcreteMixedInAbstractMethod() → void {}
+  abstract method extendedAbstractMixedInAbstractMethod() → void;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method mixedInConcreteMethod(core::int i) → void {}
+  abstract method mixedInAbstractMethod(core::int i) → void;
+  method extendedConcreteMixedInConcreteMethod(core::int i) → void {}
+  method extendedAbstractMixedInConcreteMethod(core::int i) → void {}
+  abstract method extendedConcreteMixedInAbstractMethod(core::int i) → void;
+  abstract method extendedAbstractMixedInAbstractMethod(core::int i) → void;
+}
+abstract class _ClassMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassMixin&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::mixedInConcreteMethod}(i);
+  mixin-super-stub method extendedConcreteMixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}(i);
+  mixin-super-stub method extendedAbstractMixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}(i);
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  abstract mixin-stub method mixedInAbstractMethod(core::int i) → void; -> self::Mixin::mixedInAbstractMethod
+  abstract mixin-stub method extendedAbstractMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
+}
+class ClassMixin extends self::_ClassMixin&Super&Mixin {
+  synthetic constructor •() → self::ClassMixin
+    : super self::_ClassMixin&Super&Mixin::•()
+    ;
+}
+class NamedMixin = self::Super with self::Mixin {
+  synthetic constructor •() → self::NamedMixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::mixedInConcreteMethod}(i);
+  mixin-super-stub method extendedConcreteMixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteMethod}(i);
+  mixin-super-stub method extendedAbstractMixedInConcreteMethod(core::int i) → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteMethod}(i);
+  abstract mixin-stub method extendedConcreteMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractMethod
+  abstract mixin-stub method mixedInAbstractMethod(core::int i) → void; -> self::Mixin::mixedInAbstractMethod
+  abstract mixin-stub method extendedAbstractMixedInAbstractMethod(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractMethod
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..c9a2f79
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart.weak.modular.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:5:7: Error: The non-abstract class 'Super' is missing implementations for these members:
+//  - Super.extendedAbstractMixedInAbstractSetter=
+//  - Super.extendedAbstractMixedInConcreteSetter=
+//  - Super.extendedAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:12:12: Context: 'Super.extendedAbstractMixedInConcreteSetter=' is defined here.
+//   void set extendedAbstractMixedInConcreteSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
+//   void set extendedAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:19:7: Error: The non-abstract class 'Mixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractSetter=
+//  - Mixin.extendedConcreteMixedInAbstractSetter=
+//  - Mixin.mixedInAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class Mixin {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:30:12: Context: 'Mixin.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:28:12: Context: 'Mixin.extendedConcreteMixedInAbstractSetter=' is defined here.
+//   void set extendedConcreteMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
+//   void set mixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:33:7: Error: The non-abstract class 'ClassMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractSetter=
+//  - Mixin.mixedInAbstractSetter=
+//  - Super.extendedAbstractMixedInAbstractSetter=
+//  - Super.extendedAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class ClassMixin extends Super with Mixin {}
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:30:12: Context: 'Mixin.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
+//   void set mixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
+//   void set extendedAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:35:7: Error: The non-abstract class 'NamedMixin' is missing implementations for these members:
+//  - Mixin.extendedAbstractMixedInAbstractSetter=
+//  - Mixin.mixedInAbstractSetter=
+//  - Super.extendedAbstractMixedInAbstractSetter=
+//  - Super.extendedAbstractSetter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class NamedMixin = Super with Mixin;
+//       ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:30:12: Context: 'Mixin.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:22:12: Context: 'Mixin.mixedInAbstractSetter=' is defined here.
+//   void set mixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:16:12: Context: 'Super.extendedAbstractMixedInAbstractSetter=' is defined here.
+//   void set extendedAbstractMixedInAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/mix_in_setter.dart:8:12: Context: 'Super.extendedAbstractSetter=' is defined here.
+//   void set extendedAbstractSetter(int i);
+//            ^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  set extendedConcreteSetter(core::int i) → void {}
+  abstract set extendedAbstractSetter(core::int i) → void;
+  set extendedConcreteMixedInConcreteSetter(core::int i) → void {}
+  abstract set extendedAbstractMixedInConcreteSetter(core::int i) → void;
+  set extendedConcreteMixedInAbstractSetter(core::int i) → void {}
+  abstract set extendedAbstractMixedInAbstractSetter(core::int i) → void;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  set mixedInConcreteSetter(core::int i) → void {}
+  abstract set mixedInAbstractSetter(core::int i) → void;
+  set extendedConcreteMixedInConcreteSetter(core::int i) → void {}
+  set extendedAbstractMixedInConcreteSetter(core::int i) → void {}
+  abstract set extendedConcreteMixedInAbstractSetter(core::int i) → void;
+  abstract set extendedAbstractMixedInAbstractSetter(core::int i) → void;
+}
+abstract class _ClassMixin&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_ClassMixin&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub set mixedInConcreteSetter(core::int i) → void
+    return super.{self::Mixin::mixedInConcreteSetter} = i;
+  mixin-super-stub set extendedConcreteMixedInConcreteSetter(core::int i) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteSetter} = i;
+  mixin-super-stub set extendedAbstractMixedInConcreteSetter(core::int i) → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteSetter} = i;
+  abstract mixin-stub set extendedConcreteMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractSetter
+  abstract mixin-stub set mixedInAbstractSetter(core::int i) → void; -> self::Mixin::mixedInAbstractSetter
+  abstract mixin-stub set extendedAbstractMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractSetter
+}
+class ClassMixin extends self::_ClassMixin&Super&Mixin {
+  synthetic constructor •() → self::ClassMixin
+    : super self::_ClassMixin&Super&Mixin::•()
+    ;
+}
+class NamedMixin = self::Super with self::Mixin {
+  synthetic constructor •() → self::NamedMixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub set mixedInConcreteSetter(core::int i) → void
+    return super.{self::Mixin::mixedInConcreteSetter} = i;
+  mixin-super-stub set extendedConcreteMixedInConcreteSetter(core::int i) → void
+    return super.{self::Mixin::extendedConcreteMixedInConcreteSetter} = i;
+  mixin-super-stub set extendedAbstractMixedInConcreteSetter(core::int i) → void
+    return super.{self::Mixin::extendedAbstractMixedInConcreteSetter} = i;
+  abstract mixin-stub set extendedConcreteMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedConcreteMixedInAbstractSetter
+  abstract mixin-stub set mixedInAbstractSetter(core::int i) → void; -> self::Mixin::mixedInAbstractSetter
+  abstract mixin-stub set extendedAbstractMixedInAbstractSetter(core::int i) → void; -> self::Mixin::extendedAbstractMixedInAbstractSetter
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.modular.expect
new file mode 100644
index 0000000..d4d8f90
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/mixin_from_dill/main.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "opt_in_lib1.dart" as opt;
+import "opt_out_lib.dart" as opt2;
+import "opt_in_lib2.dart" as opt3;
+
+import "org-dartlang-testcase:///opt_in_lib1.dart";
+import "org-dartlang-testcase:///opt_in_lib2.dart";
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super*
+    : super core::Object::•()
+    ;
+  get getter() → opt::B*
+    return new opt::B::•();
+  set setter(opt::A* a) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class1&Super&Mixin1 = self::Super with opt2::Mixin1 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class1&Super&Mixin1*
+    : super self::Super::•()
+    ;
+}
+class Class1 extends self::_Class1&Super&Mixin1 {
+  synthetic constructor •() → self::Class1*
+    : super self::_Class1&Super&Mixin1::•()
+    ;
+}
+abstract class _Class2&Base&Mixin2 = opt::Base with opt3::Mixin2 /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class2&Base&Mixin2*
+    : super opt::Base::•()
+    ;
+  abstract member-signature get _privateGetter() → opt::B*; -> opt::Base::_privateGetter
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature set _privateSetter(opt::A* a) → void; -> opt::Base::_privateSetter
+}
+class Class2 extends self::_Class2&Base&Mixin2 {
+  synthetic constructor •() → self::Class2*
+    : super self::_Class2&Base&Mixin2::•()
+    ;
+}
+static method main() → dynamic {
+  self::Class1* c = new self::Class1::•();
+  c.{self::Super::getter}{opt::B*}.{opt::B::property}{core::int*};
+  c.{self::Super::setter} = new opt::B::•();
+  opt::testInterface2(new opt3::Mixin2::•());
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.modular.expect
new file mode 100644
index 0000000..524ceff
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart.weak.modular.expect
@@ -0,0 +1,370 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:17:7: Error: The non-abstract class 'FromSuperAbstract' is missing implementations for these members:
+//  - Interface.field
+//  - Interface.finalField
+//  - Interface.getter
+//  - Interface.method
+//  - Interface.setter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class FromSuperAbstract extends SuperAbstract implements Interface {}
+//       ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:9:7: Context: 'Interface.field' is defined here.
+//   int field;
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:10:13: Context: 'Interface.finalField' is defined here.
+//   final int finalField;
+//             ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:7:11: Context: 'Interface.getter' is defined here.
+//   int get getter;
+//           ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:6:8: Context: 'Interface.method' is defined here.
+//   void method();
+//        ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:8:12: Context: 'Interface.setter=' is defined here.
+//   void set setter(int value);
+//            ^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:35:7: Error: The non-abstract class 'FromMixinAbstract' is missing implementations for these members:
+//  - Interface.field
+//  - Interface.finalField
+//  - Interface.getter
+//  - Interface.method
+//  - Interface.setter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class FromMixinAbstract extends MixinAbstract implements Interface {}
+//       ^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:9:7: Context: 'Interface.field' is defined here.
+//   int field;
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:10:13: Context: 'Interface.finalField' is defined here.
+//   final int finalField;
+//             ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:7:11: Context: 'Interface.getter' is defined here.
+//   int get getter;
+//           ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:6:8: Context: 'Interface.method' is defined here.
+//   void method();
+//        ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:8:12: Context: 'Interface.setter=' is defined here.
+//   void set setter(int value);
+//            ^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:54:7: Error: The non-abstract class 'FromInterfaceAbstract' is missing implementations for these members:
+//  - Interface.field
+//  - Interface.finalField
+//  - Interface.getter
+//  - Interface.method
+//  - Interface.setter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class FromInterfaceAbstract implements InterfaceAbstract, Interface {}
+//       ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:9:7: Context: 'Interface.field' is defined here.
+//   int field;
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:10:13: Context: 'Interface.finalField' is defined here.
+//   final int finalField;
+//             ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:7:11: Context: 'Interface.getter' is defined here.
+//   int get getter;
+//           ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:6:8: Context: 'Interface.method' is defined here.
+//   void method();
+//        ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:8:12: Context: 'Interface.setter=' is defined here.
+//   void set setter(int value);
+//            ^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:63:7: Error: The non-abstract class 'FromInterfaceConcrete' is missing implementations for these members:
+//  - Interface.field
+//  - Interface.finalField
+//  - Interface.getter
+//  - Interface.method
+//  - Interface.setter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class FromInterfaceConcrete implements InterfaceConcrete, Interface {}
+//       ^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:9:7: Context: 'Interface.field' is defined here.
+//   int field;
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:10:13: Context: 'Interface.finalField' is defined here.
+//   final int finalField;
+//             ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:7:11: Context: 'Interface.getter' is defined here.
+//   int get getter;
+//           ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:6:8: Context: 'Interface.method' is defined here.
+//   void method();
+//        ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:8:12: Context: 'Interface.setter=' is defined here.
+//   void set setter(int value);
+//            ^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:65:7: Error: The non-abstract class 'DeclaredAbstract' is missing implementations for these members:
+//  - Interface.field
+//  - Interface.finalField
+//  - Interface.getter
+//  - Interface.method
+//  - Interface.setter=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class DeclaredAbstract implements Interface {
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:9:7: Context: 'Interface.field' is defined here.
+//   int field;
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:10:13: Context: 'Interface.finalField' is defined here.
+//   final int finalField;
+//             ^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:7:11: Context: 'Interface.getter' is defined here.
+//   int get getter;
+//           ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:6:8: Context: 'Interface.method' is defined here.
+//   void method();
+//        ^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:8:12: Context: 'Interface.setter=' is defined here.
+//   void set setter(int value);
+//            ^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:9:7: Error: Field 'field' should be initialized because its type 'int' doesn't allow null.
+//   int field;
+//       ^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/no_such_method.dart:10:13: Error: Final field 'finalField' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int finalField;
+//             ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  field core::int field = null;
+  final field core::int finalField = null;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract method method() → void;
+  abstract get getter() → core::int;
+  abstract set setter(core::int value) → void;
+}
+class SuperAbstract extends core::Object {
+  synthetic constructor •() → self::SuperAbstract
+    : super core::Object::•()
+    ;
+  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+}
+class FromSuperAbstract extends self::SuperAbstract implements self::Interface {
+  synthetic constructor •() → self::FromSuperAbstract
+    : super self::SuperAbstract::•()
+    ;
+}
+class SuperConcrete extends core::Object {
+  synthetic constructor •() → self::SuperConcrete
+    : super core::Object::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return null;
+  }
+}
+class FromSuperConcrete extends self::SuperConcrete implements self::Interface {
+  synthetic constructor •() → self::FromSuperConcrete
+    : super self::SuperConcrete::•()
+    ;
+  no-such-method-forwarder get getter() → core::int
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder get field() → core::int
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder method method() → void
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder get finalField() → core::int
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder set setter(core::int value) → void
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder set field(core::int value) → void
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+}
+class FromSuperConcreteAbstract extends self::SuperConcrete implements self::SuperAbstract, self::Interface {
+  synthetic constructor •() → self::FromSuperConcreteAbstract
+    : super self::SuperConcrete::•()
+    ;
+  no-such-method-forwarder get getter() → core::int
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder get field() → core::int
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder method method() → void
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder get finalField() → core::int
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder set setter(core::int value) → void
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder set field(core::int value) → void
+    return this.{self::SuperConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+}
+class MixinAbstract extends core::Object {
+  synthetic constructor •() → self::MixinAbstract
+    : super core::Object::•()
+    ;
+  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+}
+class FromMixinAbstract extends self::MixinAbstract implements self::Interface {
+  synthetic constructor •() → self::FromMixinAbstract
+    : super self::MixinAbstract::•()
+    ;
+}
+class MixinConcrete extends core::Object {
+  synthetic constructor •() → self::MixinConcrete
+    : super core::Object::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return null;
+  }
+}
+abstract class _FromMixinConcrete&Object&MixinConcrete = core::Object with self::MixinConcrete /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_FromMixinConcrete&Object&MixinConcrete
+    : super core::Object::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation invocation) → dynamic
+    return super.{self::MixinConcrete::noSuchMethod}(invocation);
+}
+class FromMixinConcrete extends self::_FromMixinConcrete&Object&MixinConcrete implements self::Interface {
+  synthetic constructor •() → self::FromMixinConcrete
+    : super self::_FromMixinConcrete&Object&MixinConcrete::•()
+    ;
+  no-such-method-forwarder get getter() → core::int
+    return this.{self::_FromMixinConcrete&Object&MixinConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder get field() → core::int
+    return this.{self::_FromMixinConcrete&Object&MixinConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder method method() → void
+    return this.{self::_FromMixinConcrete&Object&MixinConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder get finalField() → core::int
+    return this.{self::_FromMixinConcrete&Object&MixinConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder set setter(core::int value) → void
+    return this.{self::_FromMixinConcrete&Object&MixinConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder set field(core::int value) → void
+    return this.{self::_FromMixinConcrete&Object&MixinConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+}
+abstract class _FromMixinConcreteAbstract&Object&MixinConcrete = core::Object with self::MixinConcrete /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_FromMixinConcreteAbstract&Object&MixinConcrete
+    : super core::Object::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation invocation) → dynamic
+    return super.{self::MixinConcrete::noSuchMethod}(invocation);
+}
+abstract class _FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract = self::_FromMixinConcreteAbstract&Object&MixinConcrete with self::MixinAbstract /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract
+    : super self::_FromMixinConcreteAbstract&Object&MixinConcrete::•()
+    ;
+  abstract mixin-stub method noSuchMethod(core::Invocation invocation) → dynamic; -> self::MixinAbstract::noSuchMethod
+}
+class FromMixinConcreteAbstract extends self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract implements self::Interface {
+  synthetic constructor •() → self::FromMixinConcreteAbstract
+    : super self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::•()
+    ;
+  no-such-method-forwarder get getter() → core::int
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder get field() → core::int
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder method method() → void
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder get finalField() → core::int
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder set setter(core::int value) → void
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder set field(core::int value) → void
+    return this.{self::_FromMixinConcreteAbstract&Object&MixinConcrete&MixinAbstract::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+}
+class InterfaceAbstract extends core::Object {
+  synthetic constructor •() → self::InterfaceAbstract
+    : super core::Object::•()
+    ;
+  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+}
+class FromInterfaceAbstract extends core::Object implements self::InterfaceAbstract, self::Interface {
+  synthetic constructor •() → self::FromInterfaceAbstract
+    : super core::Object::•()
+    ;
+}
+class InterfaceConcrete extends core::Object {
+  synthetic constructor •() → self::InterfaceConcrete
+    : super core::Object::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return null;
+  }
+}
+class FromInterfaceConcrete extends core::Object implements self::InterfaceConcrete, self::Interface {
+  synthetic constructor •() → self::FromInterfaceConcrete
+    : super core::Object::•()
+    ;
+}
+class DeclaredAbstract extends core::Object implements self::Interface {
+  synthetic constructor •() → self::DeclaredAbstract
+    : super core::Object::•()
+    ;
+  abstract method noSuchMethod(core::Invocation invocation) → dynamic;
+}
+class DeclaredConcrete extends core::Object implements self::Interface {
+  synthetic constructor •() → self::DeclaredConcrete
+    : super core::Object::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return null;
+  }
+  no-such-method-forwarder get getter() → core::int
+    return this.{self::DeclaredConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder get field() → core::int
+    return this.{self::DeclaredConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder method method() → void
+    return this.{self::DeclaredConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder get finalField() → core::int
+    return this.{self::DeclaredConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  no-such-method-forwarder set setter(core::int value) → void
+    return this.{self::DeclaredConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder set field(core::int value) → void
+    return this.{self::DeclaredConcrete::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = #getter
+  #C3 = <core::Type*>[]
+  #C4 = <dynamic>[]
+  #C5 = <core::Symbol*, dynamic>{)
+  #C6 = #field
+  #C7 = #method
+  #C8 = #finalField
+  #C9 = #setter=
+  #C10 = #field=
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..2bfc463
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/opt_out.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.modular.expect
new file mode 100644
index 0000000..773c139
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:21:28: Error: The parameter 'i' of the method 'Class.extendedMethod2' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.extendedMethod2'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void extendedMethod2(int i);
+//                            ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:10:8: Context: This is the overridden method ('extendedMethod2').
+//   void extendedMethod2(num i) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:27:30: Error: The parameter 'n' of the method 'Class.overriddenMethod2' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Super.overriddenMethod2'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void overriddenMethod2(int n) {}
+//                              ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:13:8: Context: This is the overridden method ('overriddenMethod2').
+//   void overriddenMethod2(num n) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:16:7: Error: The implementation of 'extendedMethod1' in the non-abstract class 'Class' does not conform to its interface.
+// class Class extends Super {
+//       ^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:7:28: Context: The parameter 'i' of the method 'Super.extendedMethod1' has type 'int', which does not match the corresponding type, 'num', in the overridden method, 'Class.extendedMethod1'.
+// Change to a supertype of 'num', or, for a covariant parameter, a subtype.
+//   void extendedMethod1(int i) {}
+//                            ^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/override.dart:18:8: Context: This is the overridden method ('extendedMethod1').
+//   void extendedMethod1(num n);
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method extendedMethod1(core::int i) → void {}
+  method extendedMethod2(core::num i) → void {}
+  method overriddenMethod1(core::int i) → void {}
+  method overriddenMethod2(core::num n) → void {}
+}
+class Class extends self::Super {
+  synthetic constructor •() → self::Class
+    : super self::Super::•()
+    ;
+  abstract method extendedMethod1(core::num n) → void;
+  abstract method extendedMethod2(core::int i) → void;
+  method overriddenMethod1(core::num n) → void {}
+  method overriddenMethod2(core::int n) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.modular.expect
new file mode 100644
index 0000000..ffdea68
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/redirecting_factory.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static factory redirect() → self::Class
+    return new self::Class::•();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::Class::redirect
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.modular.expect
new file mode 100644
index 0000000..91d4ae2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart.weak.modular.expect
@@ -0,0 +1,158 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:58:15: Error: Can't declare a member that conflicts with an inherited one.
+//   static void extendedInstanceDeclaredStaticMethod() {}
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:7:8: Context: This is the inherited member.
+//   void extendedInstanceDeclaredStaticMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:67:18: Error: Can't declare a member that conflicts with an inherited one.
+//   static int get extendedInstanceSetterDeclaredStaticGetter => 0;
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:16:12: Context: This is the inherited member.
+//   void set extendedInstanceSetterDeclaredStaticGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:70:15: Error: Can't declare a member that conflicts with an inherited one.
+//   static void mixedInInstanceDeclaredStaticMethod() {}
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:27:8: Context: This is the inherited member.
+//   void mixedInInstanceDeclaredStaticMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:73:15: Error: Can't declare a member that conflicts with an inherited one.
+//   static void implementedInstanceDeclaredStaticMethod() {}
+//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:38:8: Context: This is the inherited member.
+//   void implementedInstanceDeclaredStaticMethod() {}
+//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:82:18: Error: Can't declare a member that conflicts with an inherited one.
+//   static int get implementedInstanceSetterDeclaredStaticGetter => 0;
+//                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:47:12: Context: This is the inherited member.
+//   void set implementedInstanceSetterDeclaredStaticGetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:61:19: Error: Can't declare a member that conflicts with an inherited one.
+//   static void set extendedInstanceDeclaredStaticSetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:10:12: Context: This is the inherited member.
+//   void set extendedInstanceDeclaredStaticSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:64:19: Error: Can't declare a member that conflicts with an inherited one.
+//   static void set extendedInstanceGetterDeclaredStaticSetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:13:11: Context: This is the inherited member.
+//   int get extendedInstanceGetterDeclaredStaticSetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:76:19: Error: Can't declare a member that conflicts with an inherited one.
+//   static void set implementedInstanceDeclaredStaticSetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:41:12: Context: This is the inherited member.
+//   void set implementedInstanceDeclaredStaticSetter(int value) {}
+//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:79:19: Error: Can't declare a member that conflicts with an inherited one.
+//   static void set implementedInstanceGetterDeclaredStaticSetter(int value) {}
+//                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/nnbd_mixed/hierarchy/static.dart:44:11: Context: This is the inherited member.
+//   int get implementedInstanceGetterDeclaredStaticSetter => 0;
+//           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  static method extendedStaticDeclaredInstanceMethod() → void {}
+  method extendedInstanceDeclaredStaticMethod() → void {}
+  static set extendedStaticDeclaredInstanceSetter(core::int value) → void {}
+  set extendedInstanceDeclaredStaticSetter(core::int value) → void {}
+  static get extendedStaticGetterDeclaredInstanceSetter() → core::int
+    return 0;
+  get extendedInstanceGetterDeclaredStaticSetter() → core::int
+    return 0;
+  static set extendedStaticSetterDeclaredInstanceGetter(core::int value) → void {}
+  set extendedInstanceSetterDeclaredStaticGetter(core::int value) → void {}
+  static method extendedStaticMixedInInstanceMethod() → void {}
+  method extendedInstanceMixedInStaticMethod() → void {}
+  static method extendedStaticImplementedInstanceMethod() → void {}
+  method extendedInstanceImplementedStaticMethod() → void {}
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  static method mixedInStaticDeclaredInstanceMethod() → void {}
+  method mixedInInstanceDeclaredStaticMethod() → void {}
+  static method mixedInStaticImplementedInstanceMethod() → void {}
+  method mixedInInstanceImplementedStaticMethod() → void {}
+  method extendedStaticMixedInInstanceMethod() → void {}
+  static method extendedInstanceMixedInStaticMethod() → void {}
+}
+class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  static method implementedStaticDeclaredInstanceMethod() → void {}
+  method implementedInstanceDeclaredStaticMethod() → void {}
+  static set implementedStaticDeclaredInstanceSetter(core::int value) → void {}
+  set implementedInstanceDeclaredStaticSetter(core::int value) → void {}
+  static get implementedStaticGetterDeclaredInstanceSetter() → core::int
+    return 0;
+  get implementedInstanceGetterDeclaredStaticSetter() → core::int
+    return 0;
+  static set implementedStaticSetterDeclaredInstanceGetter(core::int value) → void {}
+  set implementedInstanceSetterDeclaredStaticGetter(core::int value) → void {}
+  method extendedStaticImplementedInstanceMethod() → void {}
+  static method extendedInstanceImplementedStaticMethod() → void {}
+  method mixedInStaticImplementedInstanceMethod() → void {}
+  static method mixedInInstanceImplementedStaticMethod() → void {}
+}
+abstract class _Class&Super&Mixin = self::Super with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&Mixin
+    : super self::Super::•()
+    ;
+  mixin-super-stub method mixedInInstanceDeclaredStaticMethod() → void
+    return super.{self::Mixin::mixedInInstanceDeclaredStaticMethod}();
+  mixin-super-stub method mixedInInstanceImplementedStaticMethod() → void
+    return super.{self::Mixin::mixedInInstanceImplementedStaticMethod}();
+  mixin-super-stub method extendedStaticMixedInInstanceMethod() → void
+    return super.{self::Mixin::extendedStaticMixedInInstanceMethod}();
+}
+abstract class Class extends self::_Class&Super&Mixin implements self::Interface {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&Mixin::•()
+    ;
+  method extendedStaticDeclaredInstanceMethod() → void {}
+  static method extendedInstanceDeclaredStaticMethod() → void {}
+  set extendedStaticDeclaredInstanceSetter(core::int value) → void {}
+  static set extendedInstanceDeclaredStaticSetter(core::int value) → void {}
+  set extendedStaticGetterDeclaredInstanceSetter(core::int value) → void {}
+  static set extendedInstanceGetterDeclaredStaticSetter(core::int value) → void {}
+  get extendedStaticSetterDeclaredInstanceGetter() → core::int
+    return 0;
+  static get extendedInstanceSetterDeclaredStaticGetter() → core::int
+    return 0;
+  method mixedInStaticDeclaredInstanceMethod() → void {}
+  static method mixedInInstanceDeclaredStaticMethod() → void {}
+  method implementedStaticDeclaredInstanceMethod() → void {}
+  static method implementedInstanceDeclaredStaticMethod() → void {}
+  set implementedStaticDeclaredInstanceSetter(core::int value) → void {}
+  static set implementedInstanceDeclaredStaticSetter(core::int value) → void {}
+  set implementedStaticGetterDeclaredInstanceSetter(core::int value) → void {}
+  static set implementedInstanceGetterDeclaredStaticSetter(core::int value) → void {}
+  get implementedStaticSetterDeclaredInstanceGetter() → core::int
+    return 0;
+  static get implementedInstanceSetterDeclaredStaticGetter() → core::int
+    return 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..6cfd88a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,248 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_constraints_from_opt_in_lib.dart" as inf;
+import "dart:collection" as col;
+
+import "org-dartlang-testcase:///infer_constraints_from_opt_in_lib.dart";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method baz(inf::B* b) → dynamic {
+    b.{inf::B::foo}(b.{inf::B::bar}<core::List<core::int*>*>(){() →* core::List<core::int*>*}){(core::List<core::int*>*) →* dynamic};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::List<dynamic>* local0 = <dynamic>[];
+  core::List<inf::C<dynamic>*>* local1a = <inf::C<dynamic>*>[inf::field1];
+  core::List<inf::C<dynamic>*>* local1b = <inf::C<dynamic>*>[inf::field2];
+  core::List<inf::C<core::int*>*>* local1c = <inf::C<core::int*>*>[inf::field3];
+  core::List<inf::C<core::int*>*>* local1d = <inf::C<core::int*>*>[inf::field4];
+  core::List<inf::C<core::int*>*>* local1e = <inf::C<core::int*>*>[inf::field5];
+  core::List<inf::C<core::int*>*>* local1f = <inf::C<core::int*>*>[inf::field6];
+  core::List<core::int*>* local1g = <core::int*>[inf::field7];
+  core::List<core::int*>* local1h = <core::int*>[inf::field8];
+  core::List<Null>* local1i = <Null>[null];
+  core::Set<inf::C<dynamic>*>* local2a = block {
+    final core::Set<inf::C<dynamic>*>* #t1 = col::LinkedHashSet::•<inf::C<dynamic>*>();
+    #t1.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
+  } =>#t1;
+  core::Set<inf::C<dynamic>*>* local2b = block {
+    final core::Set<inf::C<dynamic>*>* #t2 = col::LinkedHashSet::•<inf::C<dynamic>*>();
+    #t2.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
+  } =>#t2;
+  core::Set<inf::C<core::int*>*>* local2c = block {
+    final core::Set<inf::C<core::int*>*>* #t3 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t3.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+  } =>#t3;
+  core::Set<inf::C<core::int*>*>* local2d = block {
+    final core::Set<inf::C<core::int*>*>* #t4 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t4.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+  } =>#t4;
+  core::Set<inf::C<core::int*>*>* local2e = block {
+    final core::Set<inf::C<core::int*>*>* #t5 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t5.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+  } =>#t5;
+  core::Set<inf::C<core::int*>*>* local2f = block {
+    final core::Set<inf::C<core::int*>*>* #t6 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t6.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+  } =>#t6;
+  core::Set<core::int*>* local2g = block {
+    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
+    #t7.{core::Set::add}{Invariant}(inf::field7){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t7;
+  core::Set<core::int*>* local2h = block {
+    final core::Set<core::int*>* #t8 = col::LinkedHashSet::•<core::int*>();
+    #t8.{core::Set::add}{Invariant}(inf::field8){(core::int*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+  } =>#t8;
+  core::Set<inf::C<dynamic>*>* local3a = block {
+    final core::Set<inf::C<dynamic>*>* #t9 = col::LinkedHashSet::•<inf::C<dynamic>*>();
+    #t9.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t9.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>*) →* core::bool*};
+  } =>#t9;
+  core::Set<inf::C<dynamic>*>* local3b = block {
+    final core::Set<inf::C<dynamic>*>* #t10 = col::LinkedHashSet::•<inf::C<dynamic>*>();
+    #t10.{core::Set::add}{Invariant}(null){(inf::C<dynamic>*) →* core::bool*};
+    #t10.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>*) →* core::bool*};
+  } =>#t10;
+  core::Set<inf::C<core::int*>*>* local3c = block {
+    final core::Set<inf::C<core::int*>*>* #t11 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t11.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t11.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int*>*) →* core::bool*};
+  } =>#t11;
+  core::Set<inf::C<core::int*>*>* local3d = block {
+    final core::Set<inf::C<core::int*>*>* #t12 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t12.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int*>*) →* core::bool*};
+  } =>#t12;
+  core::Set<inf::C<core::int*>*>* local3e = block {
+    final core::Set<inf::C<core::int*>*>* #t13 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t13.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t13.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int*>*) →* core::bool*};
+  } =>#t13;
+  core::Set<inf::C<core::int*>*>* local3f = block {
+    final core::Set<inf::C<core::int*>*>* #t14 = col::LinkedHashSet::•<inf::C<core::int*>*>();
+    #t14.{core::Set::add}{Invariant}(null){(inf::C<core::int*>*) →* core::bool*};
+    #t14.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int*>*) →* core::bool*};
+  } =>#t14;
+  core::Set<core::int*>* local3g = block {
+    final core::Set<core::int*>* #t15 = col::LinkedHashSet::•<core::int*>();
+    #t15.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+    #t15.{core::Set::add}{Invariant}(inf::field7){(core::int*) →* core::bool*};
+  } =>#t15;
+  core::Set<core::int*>* local3h = block {
+    final core::Set<core::int*>* #t16 = col::LinkedHashSet::•<core::int*>();
+    #t16.{core::Set::add}{Invariant}(null){(core::int*) →* core::bool*};
+    #t16.{core::Set::add}{Invariant}(inf::field8){(core::int*) →* core::bool*};
+  } =>#t16;
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in_lib.dart:11:9: Error: Field 'field5' should be initialized because its type 'C<int?>' doesn't allow null.
+//  - 'C' is from 'pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in_lib.dart'.
+// C<int?> field5;
+//         ^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in_lib.dart:13:5: Error: Field 'field7' should be initialized because its type 'int' doesn't allow null.
+// int field7;
+//     ^^^^^^
+//
+import self as inf;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class C<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → inf::C<inf::C::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → inf::B
+    : super core::Object::•()
+    ;
+  abstract method bar<X extends core::List<core::int?>?>() → inf::B::bar::X%;
+  abstract method foo(core::List<core::int> list) → dynamic;
+}
+static field inf::C<dynamic> field1 = new inf::C::•<dynamic>();
+static field inf::C<dynamic>? field2;
+static field inf::C<core::int> field3 = new inf::C::•<core::int>();
+static field inf::C<core::int>? field4;
+static field inf::C<core::int?> field5;
+static field inf::C<core::int?>? field6;
+static field core::int field7;
+static field core::int? field8;
+static method method() → dynamic {
+  core::List<dynamic> local0 = <dynamic>[];
+  core::List<inf::C<dynamic>> local1a = <inf::C<dynamic>>[inf::field1];
+  core::List<inf::C<dynamic>?> local1b = <inf::C<dynamic>?>[inf::field2];
+  core::List<inf::C<core::int>> local1c = <inf::C<core::int>>[inf::field3];
+  core::List<inf::C<core::int>?> local1d = <inf::C<core::int>?>[inf::field4];
+  core::List<inf::C<core::int?>> local1e = <inf::C<core::int?>>[inf::field5];
+  core::List<inf::C<core::int?>?> local1f = <inf::C<core::int?>?>[inf::field6];
+  core::List<core::int> local1g = <core::int>[inf::field7];
+  core::List<core::int?> local1h = <core::int?>[inf::field8];
+  core::List<Null> local1i = <Null>[null];
+  core::Set<inf::C<dynamic>?> local2a = block {
+    final core::Set<inf::C<dynamic>?> #t17 = col::LinkedHashSet::•<inf::C<dynamic>?>();
+    #t17.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>?) → core::bool};
+    #t17.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
+  } =>#t17;
+  core::Set<inf::C<dynamic>?> local2b = block {
+    final core::Set<inf::C<dynamic>?> #t18 = col::LinkedHashSet::•<inf::C<dynamic>?>();
+    #t18.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>?) → core::bool};
+    #t18.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
+  } =>#t18;
+  core::Set<inf::C<core::int>?> local2c = block {
+    final core::Set<inf::C<core::int>?> #t19 = col::LinkedHashSet::•<inf::C<core::int>?>();
+    #t19.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int>?) → core::bool};
+    #t19.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
+  } =>#t19;
+  core::Set<inf::C<core::int>?> local2d = block {
+    final core::Set<inf::C<core::int>?> #t20 = col::LinkedHashSet::•<inf::C<core::int>?>();
+    #t20.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int>?) → core::bool};
+    #t20.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
+  } =>#t20;
+  core::Set<inf::C<core::int?>?> local2e = block {
+    final core::Set<inf::C<core::int?>?> #t21 = col::LinkedHashSet::•<inf::C<core::int?>?>();
+    #t21.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int?>?) → core::bool};
+    #t21.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
+  } =>#t21;
+  core::Set<inf::C<core::int?>?> local2f = block {
+    final core::Set<inf::C<core::int?>?> #t22 = col::LinkedHashSet::•<inf::C<core::int?>?>();
+    #t22.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int?>?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
+  } =>#t22;
+  core::Set<core::int?> local2g = block {
+    final core::Set<core::int?> #t23 = col::LinkedHashSet::•<core::int?>();
+    #t23.{core::Set::add}{Invariant}(inf::field7){(core::int?) → core::bool};
+    #t23.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
+  } =>#t23;
+  core::Set<core::int?> local2h = block {
+    final core::Set<core::int?> #t24 = col::LinkedHashSet::•<core::int?>();
+    #t24.{core::Set::add}{Invariant}(inf::field8){(core::int?) → core::bool};
+    #t24.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
+  } =>#t24;
+  core::Set<inf::C<dynamic>?> local3a = block {
+    final core::Set<inf::C<dynamic>?> #t25 = col::LinkedHashSet::•<inf::C<dynamic>?>();
+    #t25.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
+    #t25.{core::Set::add}{Invariant}(inf::field1){(inf::C<dynamic>?) → core::bool};
+  } =>#t25;
+  core::Set<inf::C<dynamic>?> local3b = block {
+    final core::Set<inf::C<dynamic>?> #t26 = col::LinkedHashSet::•<inf::C<dynamic>?>();
+    #t26.{core::Set::add}{Invariant}(null){(inf::C<dynamic>?) → core::bool};
+    #t26.{core::Set::add}{Invariant}(inf::field2){(inf::C<dynamic>?) → core::bool};
+  } =>#t26;
+  core::Set<inf::C<core::int>?> local3c = block {
+    final core::Set<inf::C<core::int>?> #t27 = col::LinkedHashSet::•<inf::C<core::int>?>();
+    #t27.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
+    #t27.{core::Set::add}{Invariant}(inf::field3){(inf::C<core::int>?) → core::bool};
+  } =>#t27;
+  core::Set<inf::C<core::int>?> local3d = block {
+    final core::Set<inf::C<core::int>?> #t28 = col::LinkedHashSet::•<inf::C<core::int>?>();
+    #t28.{core::Set::add}{Invariant}(null){(inf::C<core::int>?) → core::bool};
+    #t28.{core::Set::add}{Invariant}(inf::field4){(inf::C<core::int>?) → core::bool};
+  } =>#t28;
+  core::Set<inf::C<core::int?>?> local3e = block {
+    final core::Set<inf::C<core::int?>?> #t29 = col::LinkedHashSet::•<inf::C<core::int?>?>();
+    #t29.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
+    #t29.{core::Set::add}{Invariant}(inf::field5){(inf::C<core::int?>?) → core::bool};
+  } =>#t29;
+  core::Set<inf::C<core::int?>?> local3f = block {
+    final core::Set<inf::C<core::int?>?> #t30 = col::LinkedHashSet::•<inf::C<core::int?>?>();
+    #t30.{core::Set::add}{Invariant}(null){(inf::C<core::int?>?) → core::bool};
+    #t30.{core::Set::add}{Invariant}(inf::field6){(inf::C<core::int?>?) → core::bool};
+  } =>#t30;
+  core::Set<core::int?> local3g = block {
+    final core::Set<core::int?> #t31 = col::LinkedHashSet::•<core::int?>();
+    #t31.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
+    #t31.{core::Set::add}{Invariant}(inf::field7){(core::int?) → core::bool};
+  } =>#t31;
+  core::Set<core::int?> local3h = block {
+    final core::Set<core::int?> #t32 = col::LinkedHashSet::•<core::int?>();
+    #t32.{core::Set::add}{Invariant}(null){(core::int?) → core::bool};
+    #t32.{core::Set::add}{Invariant}(inf::field8){(core::int?) → core::bool};
+  } =>#t32;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/infer_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..ff3f272
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "infer_from_opt_in_lib.dart" as inf;
+
+import "org-dartlang-testcase:///infer_from_opt_in_lib.dart";
+
+static method reify<T extends core::Object? = dynamic>(self::reify::T% arg) → dynamic
+  return self::reify::T%;
+static method main() → dynamic {
+  inf::Foo x = new inf::Foo::•();
+  inf::Foo y = new inf::Foo::•();
+  () → inf::Foo z = () → inf::Foo => inf::createFoo();
+  inf::callback((inf::Foo? x) → inf::Foo? => x);
+  core::print(self::reify<inf::Foo>(x));
+  core::print(self::reify<inf::Foo>(y));
+  core::print(self::reify<() → inf::Foo>(z));
+}
+
+library /*isNonNullableByDefault*/;
+import self as inf;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → inf::Foo
+    : super core::Object::•()
+    ;
+}
+static method createFoo() → inf::Foo
+  return new inf::Foo::•();
+static method callback((inf::Foo?) → inf::Foo? f) → void {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_from_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/infer_from_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..2a1443f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_from_opt_out.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "infer_from_opt_out_lib.dart" as inf;
+
+import "org-dartlang-testcase:///infer_from_opt_out_lib.dart";
+
+static method reify<T extends core::Object? = dynamic>(self::reify::T% arg) → dynamic
+  return self::reify::T%;
+static method main() → dynamic {
+  inf::Foo x = new inf::Foo::•();
+  inf::Foo y = new inf::Foo::•();
+  () → inf::Foo z = () → inf::Foo => inf::createFoo();
+  inf::callback((inf::Foo x) → inf::Foo => x);
+  core::print(self::reify<inf::Foo>(x));
+  core::print(self::reify<inf::Foo>(y));
+  core::print(self::reify<() → inf::Foo>(z));
+}
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → inf::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method createFoo() → inf::Foo*
+  return new inf::Foo::•();
+static method callback((inf::Foo*) →* inf::Foo* f) → void {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.modular.expect
new file mode 100644
index 0000000..2ae2d77
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_in_legacy_from_opted_in.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_in_legacy_from_opted_in_lib.dart" as inf;
+
+import "org-dartlang-testcase:///infer_in_legacy_from_opted_in_lib.dart";
+
+static method bar(core::int* x) → dynamic {
+  inf::baz(inf::foo<core::int*>(x, inf::y));
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as inf;
+import "dart:core" as core;
+
+static field core::int y = 42;
+static method foo<T extends core::num>(inf::foo::T t1, inf::foo::T t2) → inf::foo::T
+  return t1;
+static method baz(core::int? v) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.modular.expect
new file mode 100644
index 0000000..216a6b7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_object_from_dynamic/main.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "opt_out_lib.dart" as opt;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method foo(dynamic d, void v, core::Object? onull, core::Object o, core::String? snull, core::String s) → dynamic {
+  opt::f<dynamic>(d);
+  opt::f<void>(v);
+  opt::f<core::Object?>(onull);
+  opt::f<core::Object>(o);
+  opt::f<core::String?>(snull);
+  opt::f<core::String>(s);
+}
+static method main() → dynamic {}
+
+library;
+import self as opt;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>(opt::f::T* a) → opt::f::T*
+  return a;
diff --git a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..c254d31
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,242 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart:27:7: Error: 'LegacyClass5' can't implement both 'GenericInterface<dynamic>' and 'GenericInterface<Object>'
+//  - 'GenericInterface' is from 'pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in_lib.dart'.
+//  - 'Object' is from 'dart:core'.
+// class LegacyClass5 extends Class5 implements GenericInterface<Object> {}
+//       ^
+//
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart:21:52: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// class LegacyClass4c implements GenericInterface<num?> {}
+//                                                    ^
+// pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_in.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+import self as self;
+import "inheritance_from_opt_in_lib.dart" as inh;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///inheritance_from_opt_in_lib.dart";
+
+class LegacyClass1 extends inh::Class1 {
+  synthetic constructor •() → self::LegacyClass1*
+    : super inh::Class1::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass2<T extends core::Object* = dynamic> extends inh::Class2<self::LegacyClass2::T*> {
+  synthetic constructor •() → self::LegacyClass2<self::LegacyClass2::T*>*
+    : super inh::Class2::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass3a<T extends core::Object* = dynamic> extends inh::Class3<self::LegacyClass3a::T*> {
+  synthetic constructor •() → self::LegacyClass3a<self::LegacyClass3a::T*>*
+    : super inh::Class3::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass3b<T extends core::Object* = dynamic> extends inh::Class3<self::LegacyClass3b::T*> implements inh::GenericInterface<self::LegacyClass3b::T*> {
+  synthetic constructor •() → self::LegacyClass3b<self::LegacyClass3b::T*>*
+    : super inh::Class3::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass4a extends inh::Class4a {
+  synthetic constructor •() → self::LegacyClass4a*
+    : super inh::Class4a::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass4b extends core::Object implements inh::GenericInterface<core::num*> {
+  synthetic constructor •() → self::LegacyClass4b*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass4c extends core::Object implements inh::GenericInterface<core::num*> {
+  synthetic constructor •() → self::LegacyClass4c*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass4d extends inh::Class4a implements inh::GenericInterface<core::num*> {
+  synthetic constructor •() → self::LegacyClass4d*
+    : super inh::Class4a::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass4e extends core::Object implements inh::Class4a, inh::Class4b {
+  synthetic constructor •() → self::LegacyClass4e*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass5 extends inh::Class5 implements inh::GenericInterface<core::Object*> {
+  synthetic constructor •() → self::LegacyClass5*
+    : super inh::Class5::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass6a<T extends core::Object* = dynamic> extends inh::Class3<self::LegacyClass6a::T*> implements inh::GenericSubInterface<self::LegacyClass6a::T*> {
+  synthetic constructor •() → self::LegacyClass6a<self::LegacyClass6a::T*>*
+    : super inh::Class3::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass6b<T extends core::Object* = dynamic> extends self::LegacyClass3a<self::LegacyClass6b::T*> implements inh::GenericSubInterface<self::LegacyClass6b::T*> {
+  synthetic constructor •() → self::LegacyClass6b<self::LegacyClass6b::T*>*
+    : super self::LegacyClass3a::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as inh;
+import "dart:core" as core;
+
+abstract class GenericInterface<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → inh::GenericInterface<inh::GenericInterface::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class GenericSubInterface<T extends core::Object? = dynamic> extends inh::GenericInterface<inh::GenericSubInterface::T%> {
+  synthetic constructor •() → inh::GenericSubInterface<inh::GenericSubInterface::T%>
+    : super inh::GenericInterface::•()
+    ;
+}
+class Class1 extends core::Object {
+  synthetic constructor •() → inh::Class1
+    : super core::Object::•()
+    ;
+}
+class Class2<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → inh::Class2<inh::Class2::T%>
+    : super core::Object::•()
+    ;
+}
+class Class3<T extends core::Object? = dynamic> extends core::Object implements inh::GenericInterface<inh::Class3::T%> {
+  synthetic constructor •() → inh::Class3<inh::Class3::T%>
+    : super core::Object::•()
+    ;
+}
+class Class4a extends core::Object implements inh::GenericInterface<core::num> {
+  synthetic constructor •() → inh::Class4a
+    : super core::Object::•()
+    ;
+}
+class Class4b extends core::Object implements inh::GenericInterface<core::num?> {
+  synthetic constructor •() → inh::Class4b
+    : super core::Object::•()
+    ;
+}
+class Class5 extends core::Object implements inh::GenericInterface<dynamic> {
+  synthetic constructor •() → inh::Class5
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..b2fa606
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/inheritance_from_opt_out.dart.weak.modular.expect
@@ -0,0 +1,195 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "inheritance_from_opt_out_lib.dart" as inh;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///inheritance_from_opt_out_lib.dart";
+
+class Class1 extends inh::LegacyClass1 {
+  synthetic constructor •() → self::Class1
+    : super inh::LegacyClass1::•()
+    ;
+}
+class Class2<T extends core::Object? = dynamic> extends inh::LegacyClass2<self::Class2::T%> {
+  synthetic constructor •() → self::Class2<self::Class2::T%>
+    : super inh::LegacyClass2::•()
+    ;
+}
+class Class3a<T extends core::Object? = dynamic> extends inh::LegacyClass3<self::Class3a::T%> {
+  synthetic constructor •() → self::Class3a<self::Class3a::T%>
+    : super inh::LegacyClass3::•()
+    ;
+}
+class Class3b<T extends core::Object? = dynamic> extends inh::LegacyClass3<self::Class3b::T%> implements inh::GenericInterface<self::Class3b::T%> {
+  synthetic constructor •() → self::Class3b<self::Class3b::T%>
+    : super inh::LegacyClass3::•()
+    ;
+}
+class Class4a extends inh::LegacyClass4 {
+  synthetic constructor •() → self::Class4a
+    : super inh::LegacyClass4::•()
+    ;
+}
+class Class4b extends core::Object implements inh::GenericInterface<core::num> {
+  synthetic constructor •() → self::Class4b
+    : super core::Object::•()
+    ;
+  abstract member-signature operator /*isLegacy*/ ==(dynamic other) → core::bool*; -> core::Object::==
+}
+class Class4c extends core::Object implements inh::GenericInterface<core::num?> {
+  synthetic constructor •() → self::Class4c
+    : super core::Object::•()
+    ;
+  abstract member-signature operator /*isLegacy*/ ==(dynamic other) → core::bool*; -> core::Object::==
+}
+class Class4d extends inh::LegacyClass4 implements inh::GenericInterface<core::num> {
+  synthetic constructor •() → self::Class4d
+    : super inh::LegacyClass4::•()
+    ;
+}
+static method main() → dynamic {}
+
+library;
+import self as inh;
+import "dart:core" as core;
+
+abstract class GenericInterface<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inh::GenericInterface<inh::GenericInterface::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class GenericSubInterface<T extends core::Object* = dynamic> extends core::Object implements inh::GenericInterface<inh::GenericSubInterface::T*> {
+  synthetic constructor •() → inh::GenericSubInterface<inh::GenericSubInterface::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass1 extends core::Object {
+  synthetic constructor •() → inh::LegacyClass1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass2<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inh::LegacyClass2<inh::LegacyClass2::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass3<T extends core::Object* = dynamic> extends core::Object implements inh::GenericInterface<inh::LegacyClass3::T*> {
+  synthetic constructor •() → inh::LegacyClass3<inh::LegacyClass3::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass4 extends core::Object implements inh::GenericInterface<core::num*> {
+  synthetic constructor •() → inh::LegacyClass4*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass5<T extends core::Object* = dynamic> extends inh::LegacyClass3<inh::LegacyClass5::T*> implements inh::GenericInterface<inh::LegacyClass5::T*> {
+  synthetic constructor •() → inh::LegacyClass5<inh::LegacyClass5::T*>*
+    : super inh::LegacyClass3::•()
+    ;
+}
+abstract class _LegacyClass6&Object&LegacyClass3<T extends core::Object* = dynamic> = core::Object with inh::LegacyClass3<inh::_LegacyClass6&Object&LegacyClass3::T*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → inh::_LegacyClass6&Object&LegacyClass3<inh::_LegacyClass6&Object&LegacyClass3::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass6<T extends core::Object* = dynamic> extends inh::_LegacyClass6&Object&LegacyClass3<inh::LegacyClass6::T*> implements inh::GenericInterface<inh::LegacyClass6::T*> {
+  synthetic constructor •() → inh::LegacyClass6<inh::LegacyClass6::T*>*
+    : super inh::_LegacyClass6&Object&LegacyClass3::•()
+    ;
+}
+class LegacyClass7<T extends core::Object* = dynamic> extends inh::LegacyClass3<inh::LegacyClass7::T*> implements inh::GenericSubInterface<inh::LegacyClass7::T*> {
+  synthetic constructor •() → inh::LegacyClass7<inh::LegacyClass7::T*>*
+    : super inh::LegacyClass3::•()
+    ;
+}
+abstract class _LegacyClass8&Object&LegacyClass3<T extends core::Object* = dynamic> = core::Object with inh::LegacyClass3<inh::_LegacyClass8&Object&LegacyClass3::T*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → inh::_LegacyClass8&Object&LegacyClass3<inh::_LegacyClass8&Object&LegacyClass3::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class LegacyClass8<T extends core::Object* = dynamic> extends inh::_LegacyClass8&Object&LegacyClass3<inh::LegacyClass8::T*> implements inh::GenericSubInterface<inh::LegacyClass8::T*> {
+  synthetic constructor •() → inh::LegacyClass8<inh::LegacyClass8::T*>*
+    : super inh::_LegacyClass8&Object&LegacyClass3::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.modular.expect
new file mode 100644
index 0000000..779a4e3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue39666.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+import "org-dartlang-testcase:///issue39666_lib.dart";
+
+class A<X extends FutureOr<core::List<dynamic>>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+import "dart:async";
+
+class A<X extends FutureOr<core::List<dynamic>*>*> extends core::Object {
+  synthetic constructor •() → self2::A<self2::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.modular.expect
new file mode 100644
index 0000000..3ea0d63
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue40512_lib.dart" as baz2;
+
+import "org-dartlang-testcase:///issue40512_lib.dart";
+
+abstract class _C&Object&A = core::Object with baz2::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  mixin-super-stub method toString({core::String* s = #C1}) → core::String*
+    return super.{baz2::A::toString}(s: s);
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B = self::_C&Object&A with baz2::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → void {
+  core::print(new baz2::B::•());
+  core::print(new self::C::•());
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..5ce29b0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue40512/issue40512.no_link.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue40512_lib.dart" as baz2;
+
+import "org-dartlang-testcase:///issue40512_lib.dart";
+
+abstract class _C&Object&A = core::Object with baz2::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method toString({core::String* s = #C1}) → core::String*
+    return super.{baz2::A::toString}(s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B = self::_C&Object&A with baz2::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → void {
+  core::print(new baz2::B::•());
+  core::print(new self::C::•());
+}
+
+library baz2;
+import self as baz2;
+import "dart:core" as core;
+
+abstract class A extends core::Object /*isMixinDeclaration*/  {
+  method toString({core::String* s = #C1}) → core::String*
+    return s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → baz2::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.modular.expect
new file mode 100644
index 0000000..7e095fc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue41180_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41180_lib.dart";
+
+class D<Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::Y*>*
+    : super core::Object::•()
+    ;
+  method method() → iss::C<self::D::Y*>*
+    return new iss::C::•<self::D::Y*>(() → Null => null);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  iss::foo(() → Null => null);
+  iss::bar = () → iss::Map<core::String*, core::String*>* => null;
+  new self::D::•<core::int*>().{self::D::method}(){() →* iss::C<core::int*>*};
+  self::findKey(new iss::Map::•<core::String*, core::String*>("foo", "bar"), "bar");
+}
+static method findKey(iss::Map<core::String*, dynamic>* m, dynamic search) → void {
+  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}{iss::Iterable<core::MapEntry<core::String*, dynamic>*>*}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}{dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} search, orElse: () → Null => null){((core::MapEntry<core::String*, dynamic>*) →* core::bool*, {orElse: () →* core::MapEntry<core::String*, dynamic>*}) →* core::MapEntry<core::String*, dynamic>*} in #t1 == null ?{core::String*} null : #t1.{core::MapEntry::key}{core::String*});
+}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+
+class C<X extends core::Object? = dynamic> extends core::Object {
+  constructor •(() → iss::Map<core::String, core::String> f) → iss::C<iss::C::X%>
+    : super core::Object::•() {
+    core::print(f.{core::Object::runtimeType}{core::Type});
+  }
+}
+class Map<K extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field iss::Map::K% key;
+  final field iss::Map::V% value;
+  constructor •(iss::Map::K% key, iss::Map::V% value) → iss::Map<iss::Map::K%, iss::Map::V%>
+    : iss::Map::key = key, iss::Map::value = value, super core::Object::•()
+    ;
+  get entries() → iss::Iterable<core::MapEntry<iss::Map::K%, iss::Map::V%>>
+    return new iss::Iterable::•<core::MapEntry<iss::Map::K%, iss::Map::V%>>(new core::MapEntry::_<iss::Map::K%, iss::Map::V%>(this.{iss::Map::key}{iss::Map::K%}, this.{iss::Map::value}{iss::Map::V%}));
+}
+class Iterable<E extends core::Object? = dynamic> extends core::Object {
+  final field iss::Iterable::E% element;
+  constructor •(iss::Iterable::E% element) → iss::Iterable<iss::Iterable::E%>
+    : iss::Iterable::element = element, super core::Object::•()
+    ;
+  method singleWhere((iss::Iterable::E%) → core::bool test, {covariant-by-class () →? iss::Iterable::E% orElse = #C1}) → iss::Iterable::E% {
+    if(test(this.{iss::Iterable::element}{iss::Iterable::E%}){(iss::Iterable::E%) → core::bool}) {
+      return this.{iss::Iterable::element}{iss::Iterable::E%};
+    }
+    if(!(orElse == null))
+      return orElse{() → iss::Iterable::E%}(){() → iss::Iterable::E%};
+    throw "error";
+  }
+}
+static method foo(() → iss::Map<core::String, core::String> f) → void {
+  core::print(f.{core::Object::runtimeType}{core::Type});
+}
+static set bar(() → iss::Map<core::String, core::String> f) → void {
+  core::print(f.{core::Object::runtimeType}{core::Type});
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.modular.expect
new file mode 100644
index 0000000..27a93fe
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib1.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib1.dart";
+
+abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  mixin-super-stub method method({core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(s: s);
+}
+abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A::method}(){({s: core::String*}) →* core::String*});
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..7ab45bf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210a/issue41210.no_link.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue41210_lib1.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210_lib1.dart";
+
+abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method({core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A::method}(){({s: core::String*}) →* core::String*});
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+import "issue41210_lib2.dart" as iss2;
+
+import "org-dartlang-testcase:///issue41210_lib2.dart";
+
+abstract class A extends core::Object implements iss2::Interface /*isMixinDeclaration*/  {
+  method method({core::String* s = #C1}) → core::String*
+    return s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements iss2::Interface {
+  synthetic constructor •() → iss::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature method method() → core::String*; -> iss2::Interface::method
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
+
+library /*isNonNullableByDefault*/;
+import self as iss2;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → iss2::Interface
+    : super core::Object::•()
+    ;
+  abstract method method() → core::String;
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.modular.expect
new file mode 100644
index 0000000..2f375fb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41210b.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "issue41210b_lib1.dart" as iss;
+
+import "org-dartlang-testcase:///issue41210b_lib1.dart";
+
+abstract class _C&Object&A = core::Object with iss::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method({core::String* s = #C1}) → core::String*
+    return super.{iss::A::method}(s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Object&A&B = self::_C&Object&A with iss::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&A&B*
+    : super self::_C&Object&A::•()
+    ;
+}
+class C extends self::_C&Object&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&A&B::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::_C&Object&A::method}(){({s: core::String*}) →* core::String*});
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+import "issue41210b_lib2.dart" as iss2;
+
+import "org-dartlang-testcase:///issue41210b_lib2.dart";
+
+abstract class A extends core::Object implements iss2::Interface /*isMixinDeclaration*/  {
+  method method({core::String* s = #C1}) → core::String*
+    return s;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements iss2::Interface {
+  synthetic constructor •() → iss::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature method method() → core::String*; -> iss2::Interface::method
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
+
+library /*isNonNullableByDefault*/;
+import self as iss2;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → iss2::Interface
+    : super core::Object::•()
+    ;
+  abstract method method() → core::String;
+}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.modular.expect
new file mode 100644
index 0000000..5d1e11f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+import "issue41435_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41435_lib.dart";
+
+static method main() → void {
+  Null nil;
+  iss::x = null;
+  iss::x = nil;
+  iss::takesNever(null);
+  iss::takesNever(nil);
+  iss::takesTakesNull(#C1);
+  iss::f = (Null x) → Null {};
+}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+
+static field Never x = throw "Unreachable";
+static field (Null) → void f = (core::Object? n) → void {};
+static method takesNever(Never x) → void {}
+static method takesTakesNull((Null) → void f) → void {}
+
+constants  {
+  #C1 = static-tearoff iss::takesNever
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41496.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41496.dart.weak.modular.expect
new file mode 100644
index 0000000..e3dae37
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41496.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41496.dart:7:11: Error: Field 'f1' should be initialized because its type 'void Function()' doesn't allow null.
+// LegacyFoo f1;
+//           ^^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41496.dart:10:20: Error: Field 'f2' should be initialized because its type 'void Function()' doesn't allow null.
+//   static LegacyFoo f2;
+//                    ^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue41496_lib.dart";
+
+class C extends core::Object {
+  static field () → void f2 = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static field () → void f1;
+static method main() → dynamic {
+  new self::C::•();
+}
+
+library opted_out_lib;
+import self as self2;
+
+typedef LegacyFoo = () →* void;
+static method test(() →* void f) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41496b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41496b.dart.weak.modular.expect
new file mode 100644
index 0000000..0144b18
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41496b.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library opted_out_lib;
+import self as self;
+import "issue41496b_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41496b_lib.dart" as opt_in;
+
+typedef LegacyFoo = () →* void;
+static method test(() →* void f) → dynamic {}
+static method main() → dynamic {
+  iss::main();
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41496b_lib.dart:7:11: Error: Field 'f1' should be initialized because its type 'void Function()' doesn't allow null.
+// LegacyFoo f1;
+//           ^^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41496b_lib.dart:10:20: Error: Field 'f2' should be initialized because its type 'void Function()' doesn't allow null.
+//   static LegacyFoo f2;
+//                    ^^
+//
+import self as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue41496b.dart";
+
+class C extends core::Object {
+  static field () → void f2 = null;
+  synthetic constructor •() → iss::C
+    : super core::Object::•()
+    ;
+}
+static field () → void f1;
+static method main() → dynamic {
+  new iss::C::•();
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.modular.expect
new file mode 100644
index 0000000..ebb0722
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.modular.expect
@@ -0,0 +1,96 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41498.dart:11:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+//     f.toString(); // error
+//     ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41498.dart:17:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+//     f.toString(); // error
+//     ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41498.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
+//   f.toString(); // error
+//   ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41498.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+//     f.toString(); // error
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue41498_lib.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method test() → void {
+    () → void f;
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:11:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+    f.toString(); // error
+    ^" in f.{core::Object::toString}(){() → core::String};
+  }
+  method test2() → void {
+    () → void f;
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:17:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+    f.toString(); // error
+    ^" in f.{core::Object::toString}(){() → core::String};
+  }
+}
+static method test() → dynamic {
+  () → void f;
+  invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
+  f.toString(); // error
+  ^" in f.{core::Object::toString}(){() → core::String};
+  core::Function foo = () → Null {
+    () → void f;
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+    f.toString(); // error
+    ^" in f.{core::Object::toString}(){() → core::String};
+  };
+  self::C::test();
+  new self::C::•().{self::C::test2}(){() → void};
+}
+static method main() → dynamic {}
+
+library opted_out_lib;
+import self as self2;
+import "dart:core" as core;
+
+typedef LegacyFoo = () →* void;
+class C extends core::Object {
+  synthetic constructor •() → self2::C*
+    : super core::Object::•()
+    ;
+  static method test() → void {
+    () →* void f;
+    f.{core::Object::toString}(){() →* core::String*};
+  }
+  method test2() → void {
+    () →* void f;
+    f.{core::Object::toString}(){() →* core::String*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  () →* void f;
+  f.{core::Object::toString}(){() →* core::String*};
+  core::Function* foo = () → Null {
+    () →* void f;
+    f.{core::Object::toString}(){() →* core::String*};
+  };
+  self2::C::test();
+  new self2::C::•().{self2::C::test2}(){() →* void};
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.modular.expect
new file mode 100644
index 0000000..3af3c21
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.modular.expect
@@ -0,0 +1,102 @@
+library opted_out_lib;
+import self as self;
+import "dart:core" as core;
+import "issue41498b_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41498b_lib.dart" as opt_in;
+
+typedef LegacyFoo = () →* void;
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static method test() → void {
+    () →* void f;
+    f.{core::Object::toString}(){() →* core::String*};
+  }
+  method test2() → void {
+    () →* void f;
+    f.{core::Object::toString}(){() →* core::String*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  () →* void f;
+  f.{core::Object::toString}(){() →* core::String*};
+  core::Function* foo = () → Null {
+    () →* void f;
+    f.{core::Object::toString}(){() →* core::String*};
+  };
+  self::C::test();
+  new self::C::•().{self::C::test2}(){() →* void};
+}
+static method main() → dynamic {
+  iss::main();
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:11:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+//     f.toString(); // error
+//     ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:17:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+//     f.toString(); // error
+//     ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
+//   f.toString(); // error
+//   ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+//     f.toString(); // error
+//     ^
+//
+import self as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue41498b.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → iss::C
+    : super core::Object::•()
+    ;
+  static method test() → void {
+    () → void f;
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:11:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+    f.toString(); // error
+    ^" in f.{core::Object::toString}(){() → core::String};
+  }
+  method test2() → void {
+    () → void f;
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:17:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+    f.toString(); // error
+    ^" in f.{core::Object::toString}(){() → core::String};
+  }
+}
+static method test() → dynamic {
+  () → void f;
+  invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
+  f.toString(); // error
+  ^" in f.{core::Object::toString}(){() → core::String};
+  core::Function foo = () → Null {
+    () → void f;
+    invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
+    f.toString(); // error
+    ^" in f.{core::Object::toString}(){() → core::String};
+  };
+  iss::C::test();
+  new iss::C::•().{iss::C::test2}(){() → void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41499.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41499.dart.weak.modular.expect
new file mode 100644
index 0000000..63d713b0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41499.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41499.dart:8:20: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+//   static LegacyFoo sTest() {}
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41499.dart:10:13: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+//   LegacyFoo mTest() {}
+//             ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41499.dart:12:17: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+//   LegacyFoo get gTest {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41499.dart:15:11: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+// LegacyFoo test() {}
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue41499_lib.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method sTest() → () → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41499.dart:8:20: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+  static LegacyFoo sTest() {}
+                   ^" in null;
+  }
+  method mTest() → () → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41499.dart:10:13: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+  LegacyFoo mTest() {}
+            ^" in null;
+  }
+  get gTest() → () → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41499.dart:12:17: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+  LegacyFoo get gTest {}
+                ^" in null;
+  }
+}
+static method test() → () → void {
+  return invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41499.dart:15:11: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+LegacyFoo test() {}
+          ^" in null;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+
+typedef LegacyFoo = () →* void;
+static method test(() →* void f) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41499b.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41499b.dart.weak.modular.expect
new file mode 100644
index 0000000..e46d2e6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41499b.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///issue41499b_lib.dart" as opt_in;
+
+typedef LegacyFoo = () →* void;
+static method test(() →* void f) → dynamic {}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41499b_lib.dart:8:20: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+//   static LegacyFoo sTest() {}
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41499b_lib.dart:10:13: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+//   LegacyFoo mTest() {}
+//             ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41499b_lib.dart:12:17: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+//   LegacyFoo get gTest {}
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41499b_lib.dart:15:11: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+// LegacyFoo test() {}
+//           ^
+//
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue41499b.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → self2::C
+    : super core::Object::•()
+    ;
+  static method sTest() → () → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41499b_lib.dart:8:20: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+  static LegacyFoo sTest() {}
+                   ^" in null;
+  }
+  method mTest() → () → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41499b_lib.dart:10:13: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+  LegacyFoo mTest() {}
+            ^" in null;
+  }
+  get gTest() → () → void {
+    return invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41499b_lib.dart:12:17: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+  LegacyFoo get gTest {}
+                ^" in null;
+  }
+}
+static method test() → () → void {
+  return invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41499b_lib.dart:15:11: Error: A non-null value must be returned since the return type 'void Function()' doesn't allow null.
+LegacyFoo test() {}
+          ^" in null;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41567.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41567.dart.weak.modular.expect
new file mode 100644
index 0000000..810b007
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41567.dart.weak.modular.expect
@@ -0,0 +1,75 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41567.dart:13:7: Error: 'in3' can't implement both 'A<int>' and 'A<dynamic>'
+//  - 'A' is from 'pkg/front_end/testcases/nnbd_mixed/issue41567_lib.dart'.
+// class in3 extends out_int implements B {} // error
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41567.dart:15:7: Error: 'in4' can't implement both 'A<dynamic>' and 'A<int>'
+//  - 'A' is from 'pkg/front_end/testcases/nnbd_mixed/issue41567_lib.dart'.
+// class in4 extends B implements out_int {} // error
+//       ^
+//
+library /*isNonNullableByDefault*/;
+import self as self;
+import "issue41567_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue41567_lib.dart";
+
+class B extends iss::A<dynamic> {
+  synthetic constructor •() → self::B
+    : super iss::A::•()
+    ;
+}
+class in1 extends iss::out_Object implements self::B {
+  synthetic constructor •() → self::in1
+    : super iss::out_Object::•()
+    ;
+}
+class in2 extends self::B implements iss::out_Object {
+  synthetic constructor •() → self::in2
+    : super self::B::•()
+    ;
+}
+class in3 extends iss::out_int implements self::B {
+  synthetic constructor •() → self::in3
+    : super iss::out_int::•()
+    ;
+}
+class in4 extends self::B implements iss::out_int {
+  synthetic constructor •() → self::in4
+    : super self::B::•()
+    ;
+}
+static method main() → dynamic {}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → iss::A<iss::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class out_int extends iss::A<core::int*> {
+  synthetic constructor •() → iss::out_int*
+    : super iss::A::•()
+    ;
+}
+class out_Object extends iss::A<core::Object*> {
+  synthetic constructor •() → iss::out_Object*
+    : super iss::A::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41597.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41597.dart.weak.modular.expect
new file mode 100644
index 0000000..0178674
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41597.dart.weak.modular.expect
@@ -0,0 +1,128 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:8:6: Error: 'x' is already declared in this scope.
+// bool x;
+//      ^
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:7:6: Context: Previous declaration of 'x'.
+// bool x;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:8:6: Error: Field 'x' should be initialized because its type 'bool' doesn't allow null.
+// bool x;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:7:6: Error: Field 'x' should be initialized because its type 'bool' doesn't allow null.
+// bool x;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:11:9: Error: Can't use 'x' because it is declared more than once.
+//   print(x);
+//         ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:12:9: Error: Can't use 'x' because it is declared more than once.
+//   print(x!);
+//         ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:13:10: Error: Can't use 'x' because it is declared more than once.
+//   print(!x);
+//          ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:18:12: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//   C.c1() : super()!;
+//            ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597.dart:18:19: Error: Expected an initializer.
+//   C.c1() : super()!;
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue41597_lib.dart";
+
+class C extends core::Object {
+  constructor c0() → self::C
+    : super core::Object::•()
+    ;
+  constructor c1() → self::C
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41597.dart:18:12: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+  C.c1() : super()!;
+           ^"!
+    ;
+}
+static field core::bool x;
+static method errors() → dynamic {
+  core::print(invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41597.dart:11:9: Error: Can't use 'x' because it is declared more than once.
+  print(x);
+        ^");
+  core::print(invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41597.dart:12:9: Error: Can't use 'x' because it is declared more than once.
+  print(x!);
+        ^"!);
+  core::print(!invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41597.dart:13:10: Error: Can't use 'x' because it is declared more than once.
+  print(!x);
+         ^");
+}
+static method main() → dynamic {}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:8:6: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+//   c?..f;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:8:6: Error: Expected an identifier, but got ''.
+// Try inserting an identifier before ''.
+//   c?..f;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:9:7: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+//   !c?..f;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:9:7: Error: Expected an identifier, but got ''.
+// Try inserting an identifier before ''.
+//   !c?..f;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:10:6: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+//   c?..f!;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:10:6: Error: Expected an identifier, but got ''.
+// Try inserting an identifier before ''.
+//   c?..f!;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:10:8: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+//   c?..f!;
+//        ^
+// pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.6
+// ^^^^^^^^^^^^
+//
+import self as self2;
+
+static method errors(dynamic c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:8:6: Error: Expected an identifier, but got ''.
+Try inserting an identifier before ''.
+  c?..f;
+     ^"{<invalid>}.f;
+  !invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:9:7: Error: Expected an identifier, but got ''.
+Try inserting an identifier before ''.
+  !c?..f;
+      ^"{<invalid>}.f;
+  invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41597_lib.dart:10:6: Error: Expected an identifier, but got ''.
+Try inserting an identifier before ''.
+  c?..f!;
+     ^"{<invalid>}.f!;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41602.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41602.dart.weak.modular.expect
new file mode 100644
index 0000000..fd8e4a3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41602.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:async" as asy;
+
+static method returnFutureOfVoid() → asy::Future<void>* async {}
+static method returnVoid() → void {}
+static method returnVoidAsync() → void async {}
+static method main() → dynamic async {
+  await self::returnVoid();
+  await self::returnFutureOfVoid();
+  await self::returnVoidAsync();
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.modular.expect
new file mode 100644
index 0000000..45aac72
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static final field core::bool isLegacySubtyping1a = #C1 is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool isLegacySubtyping1b = #C2;
+static final field core::bool isLegacySubtyping2a = #C3 is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool isLegacySubtyping2b = #C2;
+static final field core::List<core::int> assertLegacySubtyping1a = #C1 as{ForNonNullableByDefault} core::List<core::int>;
+static const field core::List<core::int> assertLegacySubtyping1b = #C1;
+static final field core::List<core::int> assertLegacySubtyping2a = #C3 as{ForNonNullableByDefault} core::List<core::int>;
+static const field core::List<core::int> assertLegacySubtyping2b = #C3;
+static method main() → void {
+  self::expect(self::isLegacySubtyping1a, #C2);
+  self::expect(self::isLegacySubtyping2a, #C2);
+  self::expect(self::assertLegacySubtyping1a, #C1);
+  self::expect(self::assertLegacySubtyping2a, #C3);
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+constants  {
+  #C1 = <Null>[]
+  #C2 = true
+  #C3 = <core::int?>[]
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42003.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue42003.dart.weak.modular.expect
new file mode 100644
index 0000000..cbd12a1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42003.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "issue42003_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue42003_lib.dart";
+
+static method main() → dynamic {
+  let final core::String* #t1 = iss::returnString() in #t1 == null ?{core::int?} null : #t1{core::String}.{core::String::length}{core::int};
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+static method returnString() → core::String*
+  return "foo";
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.modular.expect
new file mode 100644
index 0000000..8e2527a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: The value 'null' can't be assigned to a variable of type 'int Function(int)' because 'int Function(int)' is not nullable.
+//   F f = null; // Static error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42181_lib.dart";
+
+static method f1(core::int x) → core::int?
+  return x;
+static method test() → void {
+  (core::int*) → core::int* f = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: The value 'null' can't be assigned to a variable of type 'int Function(int)' because 'int Function(int)' is not nullable.
+  F f = null; // Static error
+        ^" in null as{TypeError,ForNonNullableByDefault} (core::int*) → core::int*;
+  f = #C1;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::int*;
+
+constants  {
+  #C1 = static-tearoff self::f1
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.modular.expect
new file mode 100644
index 0000000..35340a8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "foundation_binding_lib.dart" as fou;
+import "scheduler_binding_lib.dart" as sch;
+import "dart:core" as core;
+import "dart:async" as asy;
+import "services_binding_lib.dart" as ser;
+
+import "org-dartlang-testcase:///foundation_lib.dart";
+import "org-dartlang-testcase:///services_lib.dart";
+import "org-dartlang-testcase:///scheduler_lib.dart";
+
+abstract class _TestSchedulerBinding&BindingBase&SchedulerBinding = fou::BindingBase with sch::SchedulerBinding /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding*
+    : super fou::BindingBase::•()
+    ;
+  abstract member-signature method registerSignalServiceExtension({core::String* name, () →* asy::Future<Null>* callback}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding = self::_TestSchedulerBinding&BindingBase&SchedulerBinding with ser::ServicesBinding /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding*
+    : super self::_TestSchedulerBinding&BindingBase&SchedulerBinding::•()
+    ;
+}
+class TestSchedulerBinding extends self::_TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding {
+  synthetic constructor •() → self::TestSchedulerBinding*
+    : super self::_TestSchedulerBinding&BindingBase&SchedulerBinding&ServicesBinding::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42660.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue42660.dart.weak.modular.expect
new file mode 100644
index 0000000..9f4f0a5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42660.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library;
+import self as self;
+import "issue42660_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42660_lib.dart";
+
+static method main() → void {
+  iss::E|m(iss::f());
+  iss::E|m(#C1(){() →* core::int*});
+  iss::E|m(iss::p);
+  iss::Class<dynamic>* c = new iss::Class::•<dynamic>();
+  iss::E|m(c.{iss::Class::f}(){() →* core::int*});
+  iss::E|m(c.{iss::Class::f}{() →* core::int*}(){() →* core::int*});
+  iss::E|m(c.{iss::Class::p}{core::int*});
+  iss::E|m(c.{iss::Class::[]}(0){(core::int*) →* core::int*});
+  iss::E|m(c.{iss::Class::unary-}(){() →* core::int*});
+  iss::E|m(c.{iss::Class::+}(4){(core::Object*) →* core::int*});
+  let final iss::Class<dynamic>* #t1 = c in block {
+    iss::E|m(#t1.{iss::Class::p}{core::int*});
+    iss::E|m(#t1.{iss::Class::f}(){() →* core::int*});
+    iss::E|m(#t1.{iss::Class::[]}(0){(core::int*) →* core::int*});
+  } =>#t1;
+  let final iss::Class<dynamic>* #t2 = new iss::Class::•<dynamic>() in block {
+    iss::E|m(#t2.{iss::Class::p}{core::int*});
+    iss::E|m(#t2.{iss::Class::f}(){() →* core::int*});
+    iss::E|m(#t2.{iss::Class::[]}(0){(core::int*) →* core::int*});
+  } =>#t2;
+}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → iss::Class<iss::Class::T%>
+    : super core::Object::•()
+    ;
+  method f() → core::int?
+    return 4;
+  get p() → core::int?
+    return 4;
+  operator [](core::int index) → core::int?
+    return 4;
+  operator unary-() → core::int?
+    return 4;
+  operator +(core::Object? other) → core::int?
+    return 4;
+}
+extension E on core::int {
+  method m = iss::E|m;
+  tearoff m = iss::E|get#m;
+}
+static method E|m(lowered final core::int #this) → core::String
+  return "m";
+static method E|get#m(lowered final core::int #this) → () → core::String
+  return () → core::String => iss::E|m(#this);
+static method f() → core::int?
+  return 4;
+static get p() → core::int?
+  return 4;
+
+constants  {
+  #C1 = static-tearoff iss::f
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.modular.expect
new file mode 100644
index 0000000..6cabc1e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "issue42792_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue42792_lib.dart";
+
+abstract class M<T extends core::Object? = dynamic> extends iss::A<self::M::T%> /*isMixinDeclaration*/  {
+}
+abstract class _B&A&M = iss::A<core::int> with self::M<core::int> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_B&A&M
+    : super iss::A::•()
+    ;
+}
+class B extends self::_B&A&M {
+  synthetic constructor •() → self::B
+    : super self::_B&A&M::•()
+    ;
+}
+static method main() → void {}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → iss::A<iss::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.modular.expect
new file mode 100644
index 0000000..f87710d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.modular.expect
@@ -0,0 +1,73 @@
+library;
+import self as self;
+import "issue42836_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42836_lib.dart";
+
+class Legacy extends iss::Generic<core::int*> {
+  synthetic constructor •() → self::Legacy*
+    : super iss::Generic::•()
+    ;
+  method legacyMethod() → core::int*
+    return 3;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field self::Legacy* legacyInstance = new self::Legacy::•();
+static method test(core::bool* b) → dynamic {
+  self::Legacy* a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+  iss::Generic<core::int*>* a2 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nonNullableInstance;
+  iss::Generic<core::int*>* a3 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nullableInstance;
+  iss::Generic<core::int*>* b1 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : self::legacyInstance;
+  iss::NonNullable* b2 = b ?{iss::NonNullable*} iss::nonNullableInstance : iss::nonNullableInstance;
+  iss::Generic<core::int*>* b3 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : iss::nullableInstance;
+  iss::Generic<core::int*>* c1 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : self::legacyInstance;
+  iss::Generic<core::int*>* c2 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : iss::nonNullableInstance;
+  iss::Nullable* c3 = b ?{iss::Nullable*} iss::nullableInstance : iss::nullableInstance;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+import "issue42836.dart" as self;
+
+import "org-dartlang-testcase:///issue42836.dart";
+
+class Generic<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → iss::Generic<iss::Generic::T%>
+    : super core::Object::•()
+    ;
+}
+class NonNullable extends iss::Generic<core::int> {
+  synthetic constructor •() → iss::NonNullable
+    : super iss::Generic::•()
+    ;
+}
+class Nullable extends iss::Generic<core::int?> {
+  synthetic constructor •() → iss::Nullable
+    : super iss::Generic::•()
+    ;
+}
+static field iss::NonNullable nonNullableInstance = new iss::NonNullable::•();
+static field iss::Nullable nullableInstance = new iss::Nullable::•();
+static method test(core::bool b) → dynamic {
+  self::Legacy a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+  core::Object a2 = b ?{core::Object*} self::legacyInstance : iss::nonNullableInstance;
+  core::Object a3 = b ?{core::Object*} self::legacyInstance : iss::nullableInstance;
+  core::Object b1 = b ?{core::Object*} iss::nonNullableInstance : self::legacyInstance;
+  iss::NonNullable b2 = b ?{iss::NonNullable} iss::nonNullableInstance : iss::nonNullableInstance;
+  core::Object b3 = b ?{core::Object} iss::nonNullableInstance : iss::nullableInstance;
+  core::Object c1 = b ?{core::Object*} iss::nullableInstance : self::legacyInstance;
+  core::Object c2 = b ?{core::Object} iss::nullableInstance : iss::nonNullableInstance;
+  iss::Nullable c3 = b ?{iss::Nullable} iss::nullableInstance : iss::nullableInstance;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.modular.expect
new file mode 100644
index 0000000..e31e167
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.dart.weak.modular.expect
@@ -0,0 +1,119 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _E1&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E1&Object&A&D = self::_E1&Object&A with mai::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A&D*
+    : super self::_E1&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E1&Object&A::method}(i, s: s);
+}
+class E1 extends self::_E1&Object&A&D {
+  synthetic constructor •() → self::E1*
+    : super self::_E1&Object&A&D::•()
+    ;
+}
+abstract class _E2&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E2&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E2 = self::_E2&Object&A with mai::D /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::E2*
+    : super self::_E2&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E2&Object&A::method}(i, s: s);
+}
+abstract class _E3&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E3&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E3 = self::_E3&Object&A with mai::F /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::E3*
+    : super self::_E3&Object&A::•()
+    ;
+}
+abstract class C6 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → self::C6*
+    : super mai::C3::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method method2([covariant-by-declaration core::String* a]) → dynamic;
+}
+abstract class C8 extends mai::C5 implements mai::C7 {
+  synthetic constructor •() → self::C8*
+    : super mai::C5::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method method2([covariant-by-declaration core::String* a, core::num* b]) → dynamic;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "hello"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..76b963e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue43988/main.no_link.dart.weak.modular.expect
@@ -0,0 +1,188 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class _E1&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _E1&Object&A&D = self::_E1&Object&A with mai::D /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E1&Object&A&D*
+    : super self::_E1&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E1&Object&A::method}(i, s: s);
+}
+class E1 extends self::_E1&Object&A&D {
+  synthetic constructor •() → self::E1*
+    : super self::_E1&Object&A&D::•()
+    ;
+}
+abstract class _E2&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E2&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E2 = self::_E2&Object&A with mai::D /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::E2*
+    : super self::_E2&Object&A::•()
+    ;
+  forwarding-stub method method(covariant-by-declaration core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{self::_E2&Object&A::method}(i, s: s);
+}
+abstract class _E3&Object&A = core::Object with mai::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_E3&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::num* i, {core::String* s = #C1}) → core::String*
+    return super.{mai::A::method}(i, s: s);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E3 = self::_E3&Object&A with mai::F /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::E3*
+    : super self::_E3&Object&A::•()
+    ;
+}
+abstract class C6 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → self::C6*
+    : super mai::C3::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method method2([covariant-by-declaration core::String* a]) → dynamic;
+}
+abstract class C8 extends mai::C5 implements mai::C7 {
+  synthetic constructor •() → self::C8*
+    : super mai::C5::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract forwarding-stub method method2([covariant-by-declaration core::String* a = #C2, core::num* b = #C2]) → dynamic;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mai;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → mai::Interface
+    : super core::Object::•()
+    ;
+  abstract method method(core::num i) → core::String;
+}
+abstract class Interface2 extends core::Object {
+  synthetic constructor •() → mai::Interface2
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-declaration core::int i) → core::String;
+}
+abstract class A extends core::Object implements mai::Interface /*isMixinDeclaration*/  {
+  method method(core::num i, {core::String s = #C1}) → core::String
+    return s;
+}
+abstract class D extends core::Object implements mai::Interface, mai::Interface2 {
+  synthetic constructor •() → mai::D
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method method(covariant-by-declaration core::num i) → core::String;
+}
+abstract class F extends core::Object implements mai::Interface {
+  synthetic constructor •() → mai::F
+    : super core::Object::•()
+    ;
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → mai::C1
+    : super core::Object::•()
+    ;
+  abstract method method2() → dynamic;
+}
+abstract class C2 extends core::Object {
+  synthetic constructor •() → mai::C2
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2]) → dynamic;
+}
+abstract class C3 extends core::Object implements mai::C1, mai::C2 {
+  synthetic constructor •() → mai::C3
+    : super core::Object::•()
+    ;
+  abstract member-signature method method2([core::String a = #C2]) → dynamic; -> mai::C2::method2
+}
+abstract class C4 extends core::Object {
+  synthetic constructor •() → mai::C4
+    : super core::Object::•()
+    ;
+  abstract method method2([covariant-by-declaration core::String a = #C2]) → dynamic;
+}
+abstract class C5 extends mai::C3 implements mai::C4 {
+  synthetic constructor •() → mai::C5
+    : super mai::C3::•()
+    ;
+  abstract forwarding-stub method method2([covariant-by-declaration core::String a = #C2]) → dynamic;
+}
+abstract class C7 extends core::Object {
+  synthetic constructor •() → mai::C7
+    : super core::Object::•()
+    ;
+  abstract method method2([core::String a = #C2, core::num b = #C2]) → dynamic;
+}
+
+constants  {
+  #C1 = "hello"
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue46518.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/issue46518.dart.weak.modular.expect
new file mode 100644
index 0000000..c718f8d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue46518.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "issue46518_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue46518_lib.dart";
+
+static method main() → void {
+  iss::checkOptedIn(#C1);
+}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+
+typedef NullableIntF = () → core::int?;
+static method _check(core::Type t1, core::Type t2) → void {
+  core::print("Opted in: identical(${t1}, ${t2}) == ${core::identical(t1, t2)}");
+  core::print("Opted in: (${t1} == ${t2}) == ${t1 =={core::Type::==}{(core::Object) → core::bool} t2}");
+}
+static method checkOptedIn(core::Type t) → void {
+  iss::_check(t, #C1);
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(() →* core::int?)
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/literal_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/literal_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..6c3539d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/literal_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "literal_from_opt_in_lib.dart" as lit;
+
+import "org-dartlang-testcase:///literal_from_opt_in_lib.dart";
+
+static method main() → dynamic {
+  core::List<lit::Const<core::int*>*>* l1 = #C3;
+  core::List<lit::Const<core::int*>*>* l2 = #C5;
+  core::List<lit::Const<core::int*>*>* l3 = #C8;
+  core::List<lit::Const<core::int*>*>* l4 = #C3;
+  core::List<lit::Const<core::int*>*>* l5 = #C9;
+}
+
+library /*isNonNullableByDefault*/;
+import self as lit;
+import "dart:core" as core;
+
+class Const<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field lit::Const::T% field;
+  const constructor •(lit::Const::T% field) → lit::Const<lit::Const::T%>
+    : lit::Const::field = field, super core::Object::•()
+    ;
+}
+static const field lit::Const<core::int> a = #C2;
+static const field lit::Const<core::int?> b = #C4;
+static const field lit::Const<core::int?> c = #C7;
+static const field lit::Const<core::int>? d = #C2;
+static const field lit::Const<core::int>? e = #C6;
+
+constants  {
+  #C1 = 0
+  #C2 = lit::Const<core::int*> {field:#C1}
+  #C3 = <lit::Const<core::int*>*>[#C2]
+  #C4 = lit::Const<core::int?> {field:#C1}
+  #C5 = <lit::Const<core::int*>*>[#C4]
+  #C6 = null
+  #C7 = lit::Const<core::int?> {field:#C6}
+  #C8 = <lit::Const<core::int*>*>[#C7]
+  #C9 = <lit::Const<core::int*>*>[#C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///literal_from_opt_in_lib.dart:
+- Const. (from org-dartlang-testcase:///literal_from_opt_in_lib.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/nnbd_mixed/main_declaration.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/main_declaration.dart.weak.modular.expect
new file mode 100644
index 0000000..58118e1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/main_declaration.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///main_declaration_lib.dart";
+
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static method main(core::String* args) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..9e000b7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,182 @@
+library;
+import self as self;
+import "member_inheritance_from_opt_in_lib.dart" as mem;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///member_inheritance_from_opt_in_lib.dart";
+
+class LegacyClass extends mem::Class implements mem::Interface {
+  field core::int* field3 = null;
+  field core::int* field4 = null;
+  field core::int* property7 = null;
+  field core::int* property8 = null;
+  synthetic constructor •() → self::LegacyClass*
+    : super mem::Class::•()
+    ;
+  method method3() → core::int*
+    return 0;
+  method method4() → core::int*
+    return 0;
+  method method6a(core::int* a, core::int* b) → core::int*
+    return 0;
+  method method6b(core::int* a, [core::int* b = #C1]) → core::int*
+    return 0;
+  method method6c([core::int* a = #C1, core::int* b = #C1]) → core::int*
+    return 0;
+  method method8a(core::int* a, {core::int* b = #C2}) → core::int*
+    return 0;
+  method method8b({core::int* a = #C1, core::int* b = #C2}) → core::int*
+    return 0;
+  method method10a(core::int* a, {core::int* b = #C1}) → core::int*
+    return 0;
+  method method10b({core::int* a = #C1, core::int* b = #C1}) → core::int*
+    return 0;
+  get getter3() → core::int*
+    return 0;
+  get getter4() → core::int*
+    return 0;
+  set setter3(core::int* value) → void {}
+  set setter4(core::int* value) → void {}
+  get property3() → core::int*
+    return 0;
+  set property3(core::int* value) → void {}
+  get property4() → core::int*
+    return 0;
+  set property4(core::int* value) → void {}
+  abstract member-signature get field1() → core::int*; -> mem::Class::field1
+  abstract member-signature set field1(core::int* value) → void; -> mem::Class::field1
+  abstract member-signature get field2() → core::int*; -> mem::Class::field2
+  abstract member-signature set field2(core::int* value) → void; -> mem::Class::field2
+  abstract member-signature get property1() → core::int*; -> mem::Class::property1
+  abstract member-signature set property1(core::int* value) → void; -> mem::Class::property1
+  abstract member-signature get property2() → core::int*; -> mem::Class::property2
+  abstract member-signature set property2(core::int* value) → void; -> mem::Class::property2
+  abstract member-signature get property5() → core::int*; -> mem::Class::property5
+  abstract member-signature set property5(core::int* value) → void; -> mem::Class::property5
+  abstract member-signature get property6() → core::int*; -> mem::Class::property6
+  abstract member-signature set property6(core::int* value) → void; -> mem::Class::property6
+  abstract member-signature method method1() → core::int*; -> mem::Class::method1
+  abstract member-signature method method2() → core::int*; -> mem::Class::method2
+  abstract member-signature method method5a(core::int* a, core::int* b) → core::int*; -> mem::Class::method5a
+  abstract member-signature method method5b(core::int* a, [core::int* b = #C1]) → core::int*; -> mem::Class::method5b
+  abstract member-signature method method5c([core::int* a = #C2, core::int* b = #C1]) → core::int*; -> mem::Class::method5c
+  abstract member-signature method method7a(core::int* a, {core::int* b = #C1}) → core::int*; -> mem::Class::method7a
+  abstract member-signature method method7b({core::int* a = #C2, core::int* b = #C1}) → core::int*; -> mem::Class::method7b
+  abstract member-signature method method9a(core::int* a, {core::int* b = #C1}) → core::int*; -> mem::Class::method9a
+  abstract member-signature method method9b({core::int* a = #C1, core::int* b = #C1}) → core::int*; -> mem::Class::method9b
+  abstract member-signature get getter1() → core::int*; -> mem::Class::getter1
+  abstract member-signature get getter2() → core::int*; -> mem::Class::getter2
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature set setter1(core::int* value) → void; -> mem::Class::setter1
+  abstract member-signature set setter2(core::int* value) → void; -> mem::Class::setter2
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mem;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  field core::int? field1 = null;
+  field core::int field2 = 0;
+  field core::int field3 = 0;
+  field core::int? field4 = null;
+  synthetic constructor •() → mem::Interface
+    : super core::Object::•()
+    ;
+  abstract method method1() → core::int?;
+  abstract method method2() → core::int;
+  abstract method method3() → core::int;
+  abstract method method4() → core::int?;
+  abstract method method5a(core::int a, core::int? b) → core::int;
+  abstract method method5b(core::int a, [core::int? b = #C1]) → core::int;
+  abstract method method5c([core::int a = #C2, core::int? b = #C1]) → core::int;
+  abstract method method6a(core::int? a, core::int b) → core::int?;
+  abstract method method6b(core::int? a, [core::int b = #C2]) → core::int?;
+  abstract method method6c([core::int? a = #C1, core::int b = #C2]) → core::int?;
+  abstract method method7a(core::int a, {core::int? b = #C1}) → core::int;
+  abstract method method7b({core::int a = #C2, core::int? b = #C1}) → core::int;
+  abstract method method8a(core::int? a, {core::int b = #C2}) → core::int?;
+  abstract method method8b({core::int? a = #C1, core::int b = #C2}) → core::int?;
+  abstract method method9a(core::int a, {required core::int? b = #C1}) → core::int;
+  abstract method method9b({required core::int a = #C1, required core::int? b = #C1}) → core::int;
+  abstract method method10a(core::int? a, {required core::int b = #C1}) → core::int?;
+  abstract method method10b({required core::int? a = #C1, required core::int b = #C1}) → core::int?;
+  abstract get getter1() → core::int?;
+  abstract get getter2() → core::int;
+  abstract get getter3() → core::int;
+  abstract get getter4() → core::int?;
+  abstract set setter1(core::int? value) → void;
+  abstract set setter2(core::int value) → void;
+  abstract set setter3(core::int value) → void;
+  abstract set setter4(core::int? value) → void;
+  abstract get property1() → core::int?;
+  abstract set property1(core::int? value) → void;
+  abstract get property2() → core::int;
+  abstract set property2(core::int value) → void;
+  abstract get property3() → core::int;
+  abstract set property3(core::int value) → void;
+  abstract get property4() → core::int?;
+  abstract set property4(core::int? value) → void;
+  abstract get property5() → core::int?;
+  abstract set property5(core::int? value) → void;
+  abstract get property6() → core::int;
+  abstract set property6(core::int value) → void;
+  abstract get property7() → core::int;
+  abstract set property7(core::int value) → void;
+  abstract get property8() → core::int?;
+  abstract set property8(core::int? value) → void;
+}
+class Class extends core::Object {
+  field core::int field1 = 0;
+  field core::int? field2 = null;
+  field core::int property5 = 0;
+  field core::int? property6 = null;
+  synthetic constructor •() → mem::Class
+    : super core::Object::•()
+    ;
+  method method1() → core::int
+    return 0;
+  method method2() → core::int?
+    return 0;
+  method method5a(core::int a, core::int? b) → core::int
+    return 0;
+  method method5b(core::int a, [core::int? b = #C1]) → core::int
+    return 0;
+  method method5c([core::int a = #C2, core::int? b = #C1]) → core::int
+    return 0;
+  method method7a(core::int a, {core::int? b = #C1}) → core::int
+    return 0;
+  method method7b({core::int a = #C2, core::int? b = #C1}) → core::int
+    return 0;
+  method method9a(core::int a, {required core::int? b = #C1}) → core::int
+    return 0;
+  method method9b({required core::int a = #C1, required core::int? b = #C1}) → core::int
+    return 0;
+  get getter1() → core::int
+    return 0;
+  get getter2() → core::int?
+    return 0;
+  set setter1(core::int value) → void {}
+  set setter2(core::int? value) → void {}
+  get property1() → core::int
+    return 0;
+  set property1(core::int value) → void {}
+  get property2() → core::int?
+    return 0;
+  set property2(core::int? value) → void {}
+}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..fc797ac
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/member_inheritance_from_opt_out.dart.weak.modular.expect
@@ -0,0 +1,266 @@
+library main /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "member_inheritance_from_opt_out_lib.dart" as opt;
+
+import "org-dartlang-testcase:///member_inheritance_from_opt_out_lib.dart";
+
+abstract class Interface extends core::Object {
+  field core::int field1 = 0;
+  field core::int? field2 = null;
+  field core::int property3 = 0;
+  field core::int? property4 = null;
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract method method1() → core::int;
+  abstract method method2() → core::int?;
+  abstract method method3a(core::int a, core::int b) → core::int;
+  abstract method method3b(core::int a, [core::int b = #C1]) → core::int;
+  abstract method method3c([core::int a = #C1, core::int b = #C1]) → core::int;
+  abstract method method4a(core::int? a, core::int? b) → core::int?;
+  abstract method method4b(core::int? a, [core::int? b = #C1]) → core::int?;
+  abstract method method4c([core::int? a = #C1, core::int? b = #C1]) → core::int?;
+  abstract method method5a(core::int a, {core::int b = #C2}) → core::int;
+  abstract method method5b({core::int a = #C2, core::int b = #C2}) → core::int;
+  abstract method method5c({required core::int a = #C1, required core::int b = #C1}) → core::int;
+  abstract method method6a(core::int? a, {core::int? b = #C1}) → core::int?;
+  abstract method method6b({core::int? a = #C1, core::int? b = #C1}) → core::int?;
+  abstract method method6c({required core::int? a = #C1, required core::int? b = #C1}) → core::int?;
+  abstract get getter1() → core::int;
+  abstract get getter2() → core::int?;
+  abstract set setter1(core::int value) → void;
+  abstract set setter2(core::int? value) → void;
+  abstract get field3() → core::int;
+  abstract set field3(core::int value) → void;
+  abstract get field4() → core::int?;
+  abstract set field4(core::int? value) → void;
+  abstract get property1() → core::int;
+  abstract set property1(core::int value) → void;
+  abstract get property2() → core::int?;
+  abstract set property2(core::int? value) → void;
+}
+class Class1 extends opt::LegacyClass {
+  synthetic constructor •() → self::Class1
+    : super opt::LegacyClass::•()
+    ;
+}
+class Class2a extends opt::LegacyClass implements self::Interface {
+  synthetic constructor •() → self::Class2a
+    : super opt::LegacyClass::•()
+    ;
+  abstract member-signature get field1() → core::int; -> opt::LegacyClass::field1
+  abstract member-signature set field1(core::int value) → void; -> opt::LegacyClass::field1
+  abstract member-signature get field2() → core::int?; -> opt::LegacyClass::field2
+  abstract member-signature set field2(core::int? value) → void; -> opt::LegacyClass::field2
+  abstract member-signature get field3() → core::int; -> opt::LegacyClass::field3
+  abstract member-signature set field3(core::int value) → void; -> opt::LegacyClass::field3
+  abstract member-signature get field4() → core::int?; -> opt::LegacyClass::field4
+  abstract member-signature set field4(core::int? value) → void; -> opt::LegacyClass::field4
+  abstract member-signature get property1() → core::int; -> opt::LegacyClass::property1
+  abstract member-signature set property1(core::int value) → void; -> opt::LegacyClass::property1
+  abstract member-signature get property2() → core::int?; -> opt::LegacyClass::property2
+  abstract member-signature set property2(core::int? value) → void; -> opt::LegacyClass::property2
+  abstract member-signature get property3() → core::int; -> opt::LegacyClass::property3
+  abstract member-signature set property3(core::int value) → void; -> opt::LegacyClass::property3
+  abstract member-signature get property4() → core::int?; -> opt::LegacyClass::property4
+  abstract member-signature set property4(core::int? value) → void; -> opt::LegacyClass::property4
+  abstract member-signature method method1() → core::int; -> opt::LegacyClass::method1
+  abstract member-signature method method2() → core::int?; -> opt::LegacyClass::method2
+  abstract member-signature method method3a(core::int a, core::int b) → core::int; -> opt::LegacyClass::method3a
+  abstract member-signature method method3b(core::int a, [core::int b = #C1]) → core::int; -> opt::LegacyClass::method3b
+  abstract member-signature method method3c([core::int a = #C1, core::int b = #C1]) → core::int; -> opt::LegacyClass::method3c
+  abstract member-signature method method4a(core::int? a, core::int? b) → core::int?; -> opt::LegacyClass::method4a
+  abstract member-signature method method4b(core::int? a, [core::int? b = #C1]) → core::int?; -> opt::LegacyClass::method4b
+  abstract member-signature method method4c([core::int? a = #C1, core::int? b = #C1]) → core::int?; -> opt::LegacyClass::method4c
+  abstract member-signature method method5a(core::int a, {core::int b = #C1}) → core::int; -> opt::LegacyClass::method5a
+  abstract member-signature method method5b({core::int a = #C1, core::int b = #C1}) → core::int; -> opt::LegacyClass::method5b
+  abstract member-signature method method6a(core::int? a, {core::int? b = #C1}) → core::int?; -> opt::LegacyClass::method6a
+  abstract member-signature method method6b({core::int? a = #C1, core::int? b = #C1}) → core::int?; -> opt::LegacyClass::method6b
+  abstract member-signature get getter1() → core::int; -> opt::LegacyClass::getter1
+  abstract member-signature get getter2() → core::int?; -> opt::LegacyClass::getter2
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+  abstract member-signature set setter1(core::int value) → void; -> opt::LegacyClass::setter1
+  abstract member-signature set setter2(core::int? value) → void; -> opt::LegacyClass::setter2
+}
+class Class2b extends opt::LegacyClass implements self::Interface {
+  field core::int field1 = 0;
+  field core::int? field2 = null;
+  field core::int property3 = 0;
+  field core::int? property4 = null;
+  synthetic constructor •() → self::Class2b
+    : super opt::LegacyClass::•()
+    ;
+  method method1() → core::int
+    return 0;
+  method method2() → core::int?
+    return 0;
+  method method3a(core::int a, core::int b) → core::int
+    return 0;
+  method method3b(core::int a, [core::int b = #C3]) → core::int
+    return 0;
+  method method3c([core::int a = #C3, core::int b = #C3]) → core::int
+    return 0;
+  method method4a(core::int? a, core::int? b) → core::int?
+    return 0;
+  method method4b(core::int? a, [core::int? b = #C1]) → core::int?
+    return 0;
+  method method4c([core::int? a = #C1, core::int? b = #C1]) → core::int?
+    return 0;
+  method method5a(core::int a, {core::int b = #C2}) → core::int
+    return 0;
+  method method5b({core::int a = #C2, core::int b = #C2}) → core::int
+    return 0;
+  method method5c({required core::int a = #C1, required core::int b = #C1}) → core::int
+    return 0;
+  method method6a(core::int? a, {core::int? b = #C1}) → core::int?
+    return 0;
+  method method6b({core::int? a = #C1, core::int? b = #C1}) → core::int?
+    return 0;
+  method method6c({required core::int? a = #C1, required core::int? b = #C1}) → core::int?
+    return 0;
+  get getter1() → core::int
+    return 0;
+  get getter2() → core::int?
+    return 0;
+  set setter1(core::int value) → void {}
+  set setter2(core::int? value) → void {}
+  get field3() → core::int
+    return 0;
+  set field3(core::int value) → void {}
+  get field4() → core::int?
+    return 0;
+  set field4(core::int? value) → void {}
+  get property1() → core::int
+    return 0;
+  set property1(core::int value) → void {}
+  get property2() → core::int?
+    return 0;
+  set property2(core::int? value) → void {}
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+class Class3a extends opt::GenericLegacyClass<core::int> {
+  synthetic constructor •() → self::Class3a
+    : super opt::GenericLegacyClass::•()
+    ;
+}
+class Class3b extends opt::GenericLegacyClass<core::int?> {
+  synthetic constructor •() → self::Class3b
+    : super opt::GenericLegacyClass::•()
+    ;
+}
+class Class3c<S extends core::Object? = dynamic> extends opt::GenericLegacyClass<self::Class3c::S%> {
+  synthetic constructor •() → self::Class3c<self::Class3c::S%>
+    : super opt::GenericLegacyClass::•()
+    ;
+}
+static method main() → dynamic {}
+
+library opt_out;
+import self as opt;
+import "dart:core" as core;
+
+class LegacyClass extends core::Object {
+  field core::int* field1 = null;
+  field core::int* field2 = null;
+  field core::int* field3 = null;
+  field core::int* field4 = null;
+  synthetic constructor •() → opt::LegacyClass*
+    : super core::Object::•()
+    ;
+  method method1() → core::int*
+    return 0;
+  method method2() → core::int*
+    return 0;
+  method method3a(core::int* a, core::int* b) → core::int*
+    return 0;
+  method method3b(core::int* a, [core::int* b = #C1]) → core::int*
+    return 0;
+  method method3c([core::int* a = #C1, core::int* b = #C1]) → core::int*
+    return 0;
+  method method4a(core::int* a, core::int* b) → core::int*
+    return 0;
+  method method4b(core::int* a, [core::int* b = #C1]) → core::int*
+    return 0;
+  method method4c([core::int* a = #C1, core::int* b = #C1]) → core::int*
+    return 0;
+  method method5a(core::int* a, {core::int* b = #C1}) → core::int*
+    return 0;
+  method method5b({core::int* a = #C1, core::int* b = #C1}) → core::int*
+    return 0;
+  method method5c({core::int* a = #C1, core::int* b = #C1}) → core::int*
+    return 0;
+  method method6a(core::int* a, {core::int* b = #C1}) → core::int*
+    return 0;
+  method method6b({core::int* a = #C1, core::int* b = #C1}) → core::int*
+    return 0;
+  method method6c({core::int* a = #C1, core::int* b = #C1}) → core::int*
+    return 0;
+  get getter1() → core::int*
+    return 0;
+  get getter2() → core::int*
+    return 0;
+  set setter1(core::int* value) → void {}
+  set setter2(core::int* value) → void {}
+  get property1() → core::int*
+    return 0;
+  set property1(core::int* value) → void {}
+  get property2() → core::int*
+    return 0;
+  set property2(core::int* value) → void {}
+  get property3() → core::int*
+    return 0;
+  set property3(core::int* value) → void {}
+  get property4() → core::int*
+    return 0;
+  set property4(core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class GenericLegacyClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → opt::GenericLegacyClass<opt::GenericLegacyClass::T*>*
+    : super core::Object::•()
+    ;
+  method method1() → opt::GenericLegacyClass::T*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = 42
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..33ff672
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart.weak.modular.expect
@@ -0,0 +1,274 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:17:6: Error: The return type of the method 'SubInIn.nullableBad' is 'T?', which does not match the return type, 'int?', of the overridden method, 'SuperIn.nullableBad'.
+// Change to a subtype of 'int?'.
+//   T? nullableBad<T>(T t) => null;
+//      ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:10:8: Context: This is the overridden method ('nullableBad').
+//   int? nullableBad<T>(T t) => 1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:18:5: Error: The return type of the method 'SubInIn.nonNullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperIn.nonNullableBad'.
+// Change to a subtype of 'int'.
+//   T nonNullableBad<T>(T t) => t;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:11:7: Context: This is the overridden method ('nonNullableBad').
+//   int nonNullableBad<T>(T t) => 2;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:24:6: Error: The return type of the method 'SubOutIn.nullableBad' is 'T?', which does not match the return type, 'int', of the overridden method, 'SuperOut.nullableBad'.
+// Change to a subtype of 'int'.
+//   T? nullableBad<T>(T t) => null;
+//      ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:12:7: Context: This is the overridden method ('nullableBad').
+//   int nullableBad<T>(T t) => 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:25:5: Error: The return type of the method 'SubOutIn.nonNullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperOut.nonNullableBad'.
+// Change to a subtype of 'int'.
+//   T nonNullableBad<T>(T t) => t;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:13:7: Context: This is the overridden method ('nonNullableBad').
+//   int nonNullableBad<T>(T t) => 2;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:32:17: Error: A value of type 'double' can't be assigned to a variable of type 'int Function()?'.
+//   nullableVar = nonNullableVar;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:33:20: Error: A value of type 'int Function()?' can't be assigned to a variable of type 'double'.
+//   nonNullableVar = nullableVar;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:34:15: Error: A value of type 'int Function()?' can't be assigned to a variable of type 'String'.
+//   legacyVar = nullableVar;
+//               ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:35:17: Error: A value of type 'String' can't be assigned to a variable of type 'int Function()?'.
+//   nullableVar = legacyVar;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:36:20: Error: A value of type 'String' can't be assigned to a variable of type 'double'.
+//   nonNullableVar = legacyVar;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:37:15: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   legacyVar = nonNullableVar;
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+import "messages_with_types_opt_out.dart" as mes;
+
+import "org-dartlang-testcase:///messages_with_types_opt_out.dart";
+
+class SuperIn extends core::Object {
+  synthetic constructor •() → self::SuperIn
+    : super core::Object::•()
+    ;
+  method nullableSame() → core::String?
+    return "foo";
+  method nonNullableSame() → core::String
+    return "bar";
+  method nullableBad<T extends core::Object? = dynamic>(self::SuperIn::nullableBad::T% t) → core::int?
+    return 1;
+  method nonNullableBad<T extends core::Object? = dynamic>(self::SuperIn::nonNullableBad::T% t) → core::int
+    return 2;
+}
+class SubInIn extends self::SuperIn {
+  synthetic constructor •() → self::SubInIn
+    : super self::SuperIn::•()
+    ;
+  method nullableSame() → core::String?
+    return "foo";
+  method nonNullableSame() → core::String
+    return "bar";
+  method nullableBad<T extends core::Object? = dynamic>(self::SubInIn::nullableBad::T% t) → self::SubInIn::nullableBad::T?
+    return null;
+  method nonNullableBad<T extends core::Object? = dynamic>(self::SubInIn::nonNullableBad::T% t) → self::SubInIn::nonNullableBad::T%
+    return t;
+}
+class SubOutIn extends mes::SuperOut {
+  synthetic constructor •() → self::SubOutIn
+    : super mes::SuperOut::•()
+    ;
+  method nullableSame() → core::String?
+    return "foo";
+  method nonNullableSame() → core::String
+    return "bar";
+  method nullableBad<T extends core::Object? = dynamic>(self::SubOutIn::nullableBad::T% t) → self::SubOutIn::nullableBad::T?
+    return null;
+  method nonNullableBad<T extends core::Object? = dynamic>(self::SubOutIn::nonNullableBad::T% t) → self::SubOutIn::nonNullableBad::T%
+    return t;
+}
+static field () →? core::int nullableVar = () → core::int => 3;
+static field core::double nonNullableVar = 4.0;
+static method testOptIn() → dynamic {
+  self::nullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:32:17: Error: A value of type 'double' can't be assigned to a variable of type 'int Function()?'.
+  nullableVar = nonNullableVar;
+                ^" in self::nonNullableVar as{TypeError,ForNonNullableByDefault} () →? core::int;
+  self::nonNullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:33:20: Error: A value of type 'int Function()?' can't be assigned to a variable of type 'double'.
+  nonNullableVar = nullableVar;
+                   ^" in self::nullableVar as{TypeError,ForNonNullableByDefault} core::double;
+  mes::legacyVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:34:15: Error: A value of type 'int Function()?' can't be assigned to a variable of type 'String'.
+  legacyVar = nullableVar;
+              ^" in self::nullableVar as{TypeError,ForNonNullableByDefault} core::String*;
+  self::nullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:35:17: Error: A value of type 'String' can't be assigned to a variable of type 'int Function()?'.
+  nullableVar = legacyVar;
+                ^" in mes::legacyVar as{TypeError,ForNonNullableByDefault} () →? core::int;
+  self::nonNullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:36:20: Error: A value of type 'String' can't be assigned to a variable of type 'double'.
+  nonNullableVar = legacyVar;
+                   ^" in mes::legacyVar as{TypeError,ForNonNullableByDefault} core::double;
+  mes::legacyVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:37:15: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  legacyVar = nonNullableVar;
+              ^" in self::nonNullableVar as{TypeError,ForNonNullableByDefault} core::String*;
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:19:5: Error: The return type of the method 'SubOutOut.nullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperOut.nullableBad'.
+// Change to a subtype of 'int'.
+//   T nullableBad<T>(T t) => null;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:12:7: Context: This is the overridden method ('nullableBad').
+//   int nullableBad<T>(T t) => 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:20:5: Error: The return type of the method 'SubOutOut.nonNullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperOut.nonNullableBad'.
+// Change to a subtype of 'int'.
+//   T nonNullableBad<T>(T t) => t;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:13:7: Context: This is the overridden method ('nonNullableBad').
+//   int nonNullableBad<T>(T t) => 2;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:26:5: Error: The return type of the method 'SubInOut.nullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperIn.nullableBad'.
+// Change to a subtype of 'int'.
+//   T nullableBad<T>(T t) => null;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:10:8: Context: This is the overridden method ('nullableBad').
+//   int? nullableBad<T>(T t) => 1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:27:5: Error: The return type of the method 'SubInOut.nonNullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperIn.nonNullableBad'.
+// Change to a subtype of 'int'.
+//   T nonNullableBad<T>(T t) => t;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:11:7: Context: This is the overridden method ('nonNullableBad').
+//   int nonNullableBad<T>(T t) => 2;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:33:17: Error: A value of type 'double' can't be assigned to a variable of type 'int Function()'.
+//   nullableVar = nonNullableVar;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:34:20: Error: A value of type 'int Function()' can't be assigned to a variable of type 'double'.
+//   nonNullableVar = nullableVar;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:35:15: Error: A value of type 'int Function()' can't be assigned to a variable of type 'String'.
+//   legacyVar = nullableVar;
+//               ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:36:17: Error: A value of type 'String' can't be assigned to a variable of type 'int Function()'.
+//   nullableVar = legacyVar;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:37:20: Error: A value of type 'String' can't be assigned to a variable of type 'double'.
+//   nonNullableVar = legacyVar;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:38:15: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   legacyVar = nonNullableVar;
+//               ^
+//
+import self as mes;
+import "dart:core" as core;
+import "messages_with_types_opt_in.dart" as self;
+
+import "org-dartlang-testcase:///messages_with_types_opt_in.dart";
+
+class SuperOut extends core::Object {
+  synthetic constructor •() → mes::SuperOut*
+    : super core::Object::•()
+    ;
+  method nullableSame() → core::String*
+    return "foo";
+  method nonNullableSame() → core::String*
+    return "bar";
+  method nullableBad<T extends core::Object* = dynamic>(mes::SuperOut::nullableBad::T* t) → core::int*
+    return 1;
+  method nonNullableBad<T extends core::Object* = dynamic>(mes::SuperOut::nonNullableBad::T* t) → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubOutOut extends mes::SuperOut {
+  synthetic constructor •() → mes::SubOutOut*
+    : super mes::SuperOut::•()
+    ;
+  method nullableSame() → core::String*
+    return "foo";
+  method nonNullableSame() → core::String*
+    return "bar";
+  method nullableBad<T extends core::Object* = dynamic>(mes::SubOutOut::nullableBad::T* t) → mes::SubOutOut::nullableBad::T*
+    return null;
+  method nonNullableBad<T extends core::Object* = dynamic>(mes::SubOutOut::nonNullableBad::T* t) → mes::SubOutOut::nonNullableBad::T*
+    return t;
+}
+class SubInOut extends self::SuperIn {
+  synthetic constructor •() → mes::SubInOut*
+    : super self::SuperIn::•()
+    ;
+  method nullableSame() → core::String*
+    return "foo";
+  method nonNullableSame() → core::String*
+    return "bar";
+  method nullableBad<T extends core::Object* = dynamic>(mes::SubInOut::nullableBad::T* t) → mes::SubInOut::nullableBad::T*
+    return null;
+  method nonNullableBad<T extends core::Object* = dynamic>(mes::SubInOut::nonNullableBad::T* t) → mes::SubInOut::nonNullableBad::T*
+    return t;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::String* legacyVar = "legacy";
+static method testOptOut() → dynamic {
+  self::nullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:33:17: Error: A value of type 'double' can't be assigned to a variable of type 'int Function()'.
+  nullableVar = nonNullableVar;
+                ^" in self::nonNullableVar as{TypeError} () →? core::int;
+  self::nonNullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:34:20: Error: A value of type 'int Function()' can't be assigned to a variable of type 'double'.
+  nonNullableVar = nullableVar;
+                   ^" in self::nullableVar as{TypeError} core::double;
+  mes::legacyVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:35:15: Error: A value of type 'int Function()' can't be assigned to a variable of type 'String'.
+  legacyVar = nullableVar;
+              ^" in self::nullableVar as{TypeError} core::String*;
+  self::nullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:36:17: Error: A value of type 'String' can't be assigned to a variable of type 'int Function()'.
+  nullableVar = legacyVar;
+                ^" in mes::legacyVar as{TypeError} () →? core::int;
+  self::nonNullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:37:20: Error: A value of type 'String' can't be assigned to a variable of type 'double'.
+  nonNullableVar = legacyVar;
+                   ^" in mes::legacyVar as{TypeError} core::double;
+  mes::legacyVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:38:15: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  legacyVar = nonNullableVar;
+              ^" in self::nonNullableVar as{TypeError} core::String*;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..8a877f1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart.weak.modular.expect
@@ -0,0 +1,274 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:19:5: Error: The return type of the method 'SubOutOut.nullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperOut.nullableBad'.
+// Change to a subtype of 'int'.
+//   T nullableBad<T>(T t) => null;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:12:7: Context: This is the overridden method ('nullableBad').
+//   int nullableBad<T>(T t) => 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:20:5: Error: The return type of the method 'SubOutOut.nonNullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperOut.nonNullableBad'.
+// Change to a subtype of 'int'.
+//   T nonNullableBad<T>(T t) => t;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:13:7: Context: This is the overridden method ('nonNullableBad').
+//   int nonNullableBad<T>(T t) => 2;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:26:5: Error: The return type of the method 'SubInOut.nullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperIn.nullableBad'.
+// Change to a subtype of 'int'.
+//   T nullableBad<T>(T t) => null;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:10:8: Context: This is the overridden method ('nullableBad').
+//   int? nullableBad<T>(T t) => 1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:27:5: Error: The return type of the method 'SubInOut.nonNullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperIn.nonNullableBad'.
+// Change to a subtype of 'int'.
+//   T nonNullableBad<T>(T t) => t;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:11:7: Context: This is the overridden method ('nonNullableBad').
+//   int nonNullableBad<T>(T t) => 2;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:33:17: Error: A value of type 'double' can't be assigned to a variable of type 'int Function()'.
+//   nullableVar = nonNullableVar;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:34:20: Error: A value of type 'int Function()' can't be assigned to a variable of type 'double'.
+//   nonNullableVar = nullableVar;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:35:15: Error: A value of type 'int Function()' can't be assigned to a variable of type 'String'.
+//   legacyVar = nullableVar;
+//               ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:36:17: Error: A value of type 'String' can't be assigned to a variable of type 'int Function()'.
+//   nullableVar = legacyVar;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:37:20: Error: A value of type 'String' can't be assigned to a variable of type 'double'.
+//   nonNullableVar = legacyVar;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:38:15: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   legacyVar = nonNullableVar;
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+import "messages_with_types_opt_in.dart" as mes;
+
+import "org-dartlang-testcase:///messages_with_types_opt_in.dart";
+
+class SuperOut extends core::Object {
+  synthetic constructor •() → self::SuperOut*
+    : super core::Object::•()
+    ;
+  method nullableSame() → core::String*
+    return "foo";
+  method nonNullableSame() → core::String*
+    return "bar";
+  method nullableBad<T extends core::Object* = dynamic>(self::SuperOut::nullableBad::T* t) → core::int*
+    return 1;
+  method nonNullableBad<T extends core::Object* = dynamic>(self::SuperOut::nonNullableBad::T* t) → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubOutOut extends self::SuperOut {
+  synthetic constructor •() → self::SubOutOut*
+    : super self::SuperOut::•()
+    ;
+  method nullableSame() → core::String*
+    return "foo";
+  method nonNullableSame() → core::String*
+    return "bar";
+  method nullableBad<T extends core::Object* = dynamic>(self::SubOutOut::nullableBad::T* t) → self::SubOutOut::nullableBad::T*
+    return null;
+  method nonNullableBad<T extends core::Object* = dynamic>(self::SubOutOut::nonNullableBad::T* t) → self::SubOutOut::nonNullableBad::T*
+    return t;
+}
+class SubInOut extends mes::SuperIn {
+  synthetic constructor •() → self::SubInOut*
+    : super mes::SuperIn::•()
+    ;
+  method nullableSame() → core::String*
+    return "foo";
+  method nonNullableSame() → core::String*
+    return "bar";
+  method nullableBad<T extends core::Object* = dynamic>(self::SubInOut::nullableBad::T* t) → self::SubInOut::nullableBad::T*
+    return null;
+  method nonNullableBad<T extends core::Object* = dynamic>(self::SubInOut::nonNullableBad::T* t) → self::SubInOut::nonNullableBad::T*
+    return t;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::String* legacyVar = "legacy";
+static method testOptOut() → dynamic {
+  mes::nullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:33:17: Error: A value of type 'double' can't be assigned to a variable of type 'int Function()'.
+  nullableVar = nonNullableVar;
+                ^" in mes::nonNullableVar as{TypeError} () →? core::int;
+  mes::nonNullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:34:20: Error: A value of type 'int Function()' can't be assigned to a variable of type 'double'.
+  nonNullableVar = nullableVar;
+                   ^" in mes::nullableVar as{TypeError} core::double;
+  self::legacyVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:35:15: Error: A value of type 'int Function()' can't be assigned to a variable of type 'String'.
+  legacyVar = nullableVar;
+              ^" in mes::nullableVar as{TypeError} core::String*;
+  mes::nullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:36:17: Error: A value of type 'String' can't be assigned to a variable of type 'int Function()'.
+  nullableVar = legacyVar;
+                ^" in self::legacyVar as{TypeError} () →? core::int;
+  mes::nonNullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:37:20: Error: A value of type 'String' can't be assigned to a variable of type 'double'.
+  nonNullableVar = legacyVar;
+                   ^" in self::legacyVar as{TypeError} core::double;
+  self::legacyVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:38:15: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  legacyVar = nonNullableVar;
+              ^" in mes::nonNullableVar as{TypeError} core::String*;
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:17:6: Error: The return type of the method 'SubInIn.nullableBad' is 'T?', which does not match the return type, 'int?', of the overridden method, 'SuperIn.nullableBad'.
+// Change to a subtype of 'int?'.
+//   T? nullableBad<T>(T t) => null;
+//      ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:10:8: Context: This is the overridden method ('nullableBad').
+//   int? nullableBad<T>(T t) => 1;
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:18:5: Error: The return type of the method 'SubInIn.nonNullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperIn.nonNullableBad'.
+// Change to a subtype of 'int'.
+//   T nonNullableBad<T>(T t) => t;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:11:7: Context: This is the overridden method ('nonNullableBad').
+//   int nonNullableBad<T>(T t) => 2;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:24:6: Error: The return type of the method 'SubOutIn.nullableBad' is 'T?', which does not match the return type, 'int', of the overridden method, 'SuperOut.nullableBad'.
+// Change to a subtype of 'int'.
+//   T? nullableBad<T>(T t) => null;
+//      ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:12:7: Context: This is the overridden method ('nullableBad').
+//   int nullableBad<T>(T t) => 1;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:25:5: Error: The return type of the method 'SubOutIn.nonNullableBad' is 'T', which does not match the return type, 'int', of the overridden method, 'SuperOut.nonNullableBad'.
+// Change to a subtype of 'int'.
+//   T nonNullableBad<T>(T t) => t;
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_out.dart:13:7: Context: This is the overridden method ('nonNullableBad').
+//   int nonNullableBad<T>(T t) => 2;
+//       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:32:17: Error: A value of type 'double' can't be assigned to a variable of type 'int Function()?'.
+//   nullableVar = nonNullableVar;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:33:20: Error: A value of type 'int Function()?' can't be assigned to a variable of type 'double'.
+//   nonNullableVar = nullableVar;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:34:15: Error: A value of type 'int Function()?' can't be assigned to a variable of type 'String'.
+//   legacyVar = nullableVar;
+//               ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:35:17: Error: A value of type 'String' can't be assigned to a variable of type 'int Function()?'.
+//   nullableVar = legacyVar;
+//                 ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:36:20: Error: A value of type 'String' can't be assigned to a variable of type 'double'.
+//   nonNullableVar = legacyVar;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:37:15: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+//   legacyVar = nonNullableVar;
+//               ^
+//
+import self as mes;
+import "dart:core" as core;
+import "messages_with_types_opt_out.dart" as self;
+
+import "org-dartlang-testcase:///messages_with_types_opt_out.dart";
+
+class SuperIn extends core::Object {
+  synthetic constructor •() → mes::SuperIn
+    : super core::Object::•()
+    ;
+  method nullableSame() → core::String?
+    return "foo";
+  method nonNullableSame() → core::String
+    return "bar";
+  method nullableBad<T extends core::Object? = dynamic>(mes::SuperIn::nullableBad::T% t) → core::int?
+    return 1;
+  method nonNullableBad<T extends core::Object? = dynamic>(mes::SuperIn::nonNullableBad::T% t) → core::int
+    return 2;
+}
+class SubInIn extends mes::SuperIn {
+  synthetic constructor •() → mes::SubInIn
+    : super mes::SuperIn::•()
+    ;
+  method nullableSame() → core::String?
+    return "foo";
+  method nonNullableSame() → core::String
+    return "bar";
+  method nullableBad<T extends core::Object? = dynamic>(mes::SubInIn::nullableBad::T% t) → mes::SubInIn::nullableBad::T?
+    return null;
+  method nonNullableBad<T extends core::Object? = dynamic>(mes::SubInIn::nonNullableBad::T% t) → mes::SubInIn::nonNullableBad::T%
+    return t;
+}
+class SubOutIn extends self::SuperOut {
+  synthetic constructor •() → mes::SubOutIn
+    : super self::SuperOut::•()
+    ;
+  method nullableSame() → core::String?
+    return "foo";
+  method nonNullableSame() → core::String
+    return "bar";
+  method nullableBad<T extends core::Object? = dynamic>(mes::SubOutIn::nullableBad::T% t) → mes::SubOutIn::nullableBad::T?
+    return null;
+  method nonNullableBad<T extends core::Object? = dynamic>(mes::SubOutIn::nonNullableBad::T% t) → mes::SubOutIn::nonNullableBad::T%
+    return t;
+}
+static field () →? core::int nullableVar = () → core::int => 3;
+static field core::double nonNullableVar = 4.0;
+static method testOptIn() → dynamic {
+  mes::nullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:32:17: Error: A value of type 'double' can't be assigned to a variable of type 'int Function()?'.
+  nullableVar = nonNullableVar;
+                ^" in mes::nonNullableVar as{TypeError,ForNonNullableByDefault} () →? core::int;
+  mes::nonNullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:33:20: Error: A value of type 'int Function()?' can't be assigned to a variable of type 'double'.
+  nonNullableVar = nullableVar;
+                   ^" in mes::nullableVar as{TypeError,ForNonNullableByDefault} core::double;
+  self::legacyVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:34:15: Error: A value of type 'int Function()?' can't be assigned to a variable of type 'String'.
+  legacyVar = nullableVar;
+              ^" in mes::nullableVar as{TypeError,ForNonNullableByDefault} core::String*;
+  mes::nullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:35:17: Error: A value of type 'String' can't be assigned to a variable of type 'int Function()?'.
+  nullableVar = legacyVar;
+                ^" in self::legacyVar as{TypeError,ForNonNullableByDefault} () →? core::int;
+  mes::nonNullableVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:36:20: Error: A value of type 'String' can't be assigned to a variable of type 'double'.
+  nonNullableVar = legacyVar;
+                   ^" in self::legacyVar as{TypeError,ForNonNullableByDefault} core::double;
+  self::legacyVar = invalid-expression "pkg/front_end/testcases/nnbd_mixed/messages_with_types_opt_in.dart:37:15: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+  legacyVar = nonNullableVar;
+              ^" in mes::nonNullableVar as{TypeError,ForNonNullableByDefault} core::String*;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixed_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mixed_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..04e3fe5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mixed_mixin.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "mixed_mixin_lib.dart" as mix;
+
+import "org-dartlang-testcase:///mixed_mixin_lib.dart";
+
+abstract class _C1&Object&B = core::Object with mix::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C1&Object&B*
+    : super core::Object::•()
+    ;
+  mixin-super-stub get a() → core::List<(core::int*) →* core::int*>*
+    return super.{mix::B::a};
+  mixin-super-stub set a(core::List<(core::int*) →* core::int*>* _) → void
+    return super.{mix::B::a} = _;
+  mixin-super-stub method m((core::int*) →* core::int* x) → (core::int*) →* core::int*
+    return super.{mix::B::m}(x);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C1 extends self::_C1&Object&B {
+  synthetic constructor •() → self::C1*
+    : super self::_C1&Object&B::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mix;
+import "dart:core" as core;
+import "mixed_mixin.dart" as self;
+
+import "org-dartlang-testcase:///mixed_mixin.dart";
+
+class B extends core::Object {
+  synthetic constructor •() → mix::B
+    : super core::Object::•()
+    ;
+  get a() → core::List<(core::int) → core::int>
+    return <(core::int) → core::int>[];
+  set a(core::List<(core::int) → core::int> _) → void {}
+  method m((core::int) → core::int x) → (core::int) → core::int
+    return x;
+}
+class Bq extends core::Object {
+  synthetic constructor •() → mix::Bq
+    : super core::Object::•()
+    ;
+  get a() → core::List<(core::int?) → core::int?>
+    return <(core::int?) → core::int?>[];
+  set a(core::List<(core::int?) → core::int?> _) → void {}
+  method m((core::int?) → core::int? x) → (core::int?) → core::int?
+    return x;
+}
+class DiBq1 extends self::C1 implements mix::Bq {
+  synthetic constructor •() → mix::DiBq1
+    : super self::C1::•()
+    ;
+  abstract member-signature get a() → core::List<(core::int?) → core::int?>; -> self::_C1&Object&B::a
+  abstract member-signature set a(core::List<(core::int?) → core::int?> _) → void; -> self::_C1&Object&B::a
+  abstract member-signature method m((core::int?) → core::int? x) → (core::int?) → core::int?; -> self::_C1&Object&B::m
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixed_mode_hierarchy_generic_methods.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mixed_mode_hierarchy_generic_methods.dart.weak.modular.expect
new file mode 100644
index 0000000..6a49d2f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mixed_mode_hierarchy_generic_methods.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "mixed_mode_hierarchy_generic_methods_lib.dart" as mix;
+import "dart:async" as asy;
+
+import "org-dartlang-testcase:///mixed_mode_hierarchy_generic_methods_lib.dart";
+import "dart:async";
+
+class B extends core::Object implements mix::A<core::int*> {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method then<B extends core::Object* = dynamic>() → asy::Future<self::B::then::B*>*
+    return asy::Future::value<self::B::then::B*>();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as mix;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A<R extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → mix::A<mix::A::R%>
+    : super core::Object::•()
+    ;
+  method then<T extends core::Object? = dynamic>() → asy::Future<mix::A::then::T%>
+    return asy::Future::value<mix::A::then::T%>();
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.modular.expect
new file mode 100644
index 0000000..f168a4e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_dill2/main.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
+}
+abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin = mai::RenderProxyBox with mai::RenderProxyBoxMixin<mai::RenderBox> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin
+    : super mai::RenderProxyBox::•()
+    ;
+  mixin-super-stub method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position}) → core::bool
+    return super.{mai::RenderProxyBoxMixin::hitTestChildren}(result, position: position);
+}
+abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin = self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin with self::RenderAnimatedOpacityMixin<mai::RenderBox> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin
+    : super self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin::•()
+    ;
+}
+class RenderAnimatedOpacity extends self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin {
+  synthetic constructor •() → self::RenderAnimatedOpacity
+    : super self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin::•()
+    ;
+}
+static method main() → dynamic {
+  new self::RenderAnimatedOpacity::•();
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..9f5295d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "mixin_from_opt_in_lib.dart" as mix;
+
+import "org-dartlang-testcase:///mixin_from_opt_in_lib.dart";
+
+abstract class _Class&Object&Mixin = core::Object with mix::Mixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class&Object&Mixin*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method method(core::int* i) → core::int*
+    return super.{mix::Mixin::method}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class extends self::_Class&Object&Mixin {
+  synthetic constructor •() → self::Class*
+    : super self::_Class&Object&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::Class::•().{self::_Class&Object&Mixin::method}(null){(core::int*) →* core::int*});
+}
+
+library /*isNonNullableByDefault*/;
+import self as mix;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  synthetic constructor •() → mix::Mixin
+    : super core::Object::•()
+    ;
+  method method(core::int? i) → core::int
+    return let final core::int? #t1 = i in #t1 == null ?{core::int} 0 : #t1{core::int};
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/main.dart.weak.modular.expect
new file mode 100644
index 0000000..ca9496c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/main.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "test_lib.dart" as tes;
+
+import "org-dartlang-testcase:///test_lib.dart";
+
+static method main() → dynamic {
+  tes::test();
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/test_lib.dart:10:27: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+//   int j = sub.mixinMethod(null);
+//                           ^
+//
+// pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/test_lib.dart:10:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//   int j = sub.mixinMethod(null);
+//               ^
+//
+// pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/test_lib.dart:12:25: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+//   sub.mixinField2 = sub.mixinField1;
+//                         ^
+//
+import self as tes;
+import "opt_out_lib.dart" as opt;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method test() → dynamic {
+  opt::SubClass sub = new opt::SubClass::•();
+  core::int i = sub.{opt::_SubClass&Class&Mixin::classMethod}(null){(core::int*) →* core::int*};
+  core::int j = invalid-expression "pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/test_lib.dart:10:15: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  int j = sub.mixinMethod(null);
+              ^" in sub.{opt::_SubClass&Class&Mixin::mixinMethod}(invalid-expression "pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/test_lib.dart:10:27: Error: The value 'null' can't be assigned to the parameter type 'int' because 'int' is not nullable.
+  int j = sub.mixinMethod(null);
+                          ^" in null as{TypeError,ForNonNullableByDefault} core::int){(core::int) →* core::int?} as{TypeError,ForNonNullableByDefault} core::int;
+  sub.{opt::_SubClass&Class&Mixin::classField2} = sub.{opt::_SubClass&Class&Mixin::classField1}{core::int*};
+  sub.{opt::_SubClass&Class&Mixin::mixinField2} = invalid-expression "pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/test_lib.dart:12:25: Error: A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  sub.mixinField2 = sub.mixinField1;
+                        ^" in sub.{opt::_SubClass&Class&Mixin::mixinField1}{core::int?} as{TypeError,ForNonNullableByDefault} core::int;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/main.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/main.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..5c88ecc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in/main.no_link.dart.weak.modular.expect
@@ -0,0 +1,85 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "test_lib.dart" as tes;
+
+import "org-dartlang-testcase:///test_lib.dart";
+
+static method main() → dynamic {
+  tes::test();
+}
+
+library /*isNonNullableByDefault*/;
+import self as tes;
+import "opt_out_lib.dart" as opt;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+static method test() → dynamic {
+  opt::SubClass sub = new opt::SubClass::•();
+  core::int i = sub.{opt::_SubClass&Class&Mixin::classMethod}(null){(core::int*) →* core::int*};
+  core::int j = sub.{opt::_SubClass&Class&Mixin::mixinMethod}(null){(core::int*) →* core::int*};
+  sub.{opt::_SubClass&Class&Mixin::classField2} = sub.{opt::_SubClass&Class&Mixin::classField1}{core::int*};
+  sub.{opt::_SubClass&Class&Mixin::mixinField2} = sub.{opt::_SubClass&Class&Mixin::mixinField1}{core::int*};
+}
+
+library;
+import self as opt;
+import "opt_in_lib.dart" as opt2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_in_lib.dart";
+
+abstract class _SubClass&Class&Mixin = opt2::Class with opt2::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → opt::_SubClass&Class&Mixin*
+    : super opt2::Class::•()
+    ;
+  mixin-super-stub get mixinField1() → core::int*
+    return super.{opt2::Mixin::mixinField1};
+  mixin-super-stub set mixinField1(core::int* value) → void
+    return super.{opt2::Mixin::mixinField1} = value;
+  mixin-super-stub get mixinField2() → core::int*
+    return super.{opt2::Mixin::mixinField2};
+  mixin-super-stub set mixinField2(core::int* value) → void
+    return super.{opt2::Mixin::mixinField2} = value;
+  abstract member-signature get classField1() → core::int*; -> opt2::Class::classField1
+  abstract member-signature set classField1(core::int* value) → void; -> opt2::Class::classField1
+  abstract member-signature get classField2() → core::int*; -> opt2::Class::classField2
+  abstract member-signature set classField2(core::int* value) → void; -> opt2::Class::classField2
+  mixin-super-stub method mixinMethod(core::int* i) → core::int*
+    return super.{opt2::Mixin::mixinMethod}(i);
+  abstract member-signature method classMethod(core::int* i) → core::int*; -> opt2::Class::classMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubClass extends opt::_SubClass&Class&Mixin {
+  synthetic constructor •() → opt::SubClass*
+    : super opt::_SubClass&Class&Mixin::•()
+    ;
+}
+
+library /*isNonNullableByDefault*/;
+import self as opt2;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? classField1 = null;
+  field core::int classField2 = 0;
+  synthetic constructor •() → opt2::Class
+    : super core::Object::•()
+    ;
+  method classMethod(core::int i) → core::int? {}
+}
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+  field core::int? mixinField1 = null;
+  field core::int mixinField2 = 0;
+  method mixinMethod(core::int i) → core::int? {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.modular.expect
new file mode 100644
index 0000000..d8ff996
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_in_out_in.dart.weak.modular.expect
@@ -0,0 +1,247 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "mixin_from_opt_in_out_in_lib1.dart" as mix;
+import "mixin_from_opt_in_out_in_lib2.dart" as mix2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///mixin_from_opt_in_out_in_lib1.dart";
+import "org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart";
+
+class DiB0 extends mix::C0 implements mix2::B {
+  synthetic constructor •() → self::DiB0
+    : super mix::C0::•()
+    ;
+  abstract member-signature get a() → core::List<(core::int) → core::int>; -> mix2::B::a
+  abstract member-signature set a(core::List<(core::int) → core::int> _) → void; -> mix2::B::a
+  abstract member-signature method m((core::int) → core::int x) → (core::int) → core::int; -> mix2::B::m
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+class DiBq0 extends mix::C0 implements mix2::Bq {
+  synthetic constructor •() → self::DiBq0
+    : super mix::C0::•()
+    ;
+  abstract member-signature get a() → core::List<(core::int?) → core::int?>; -> mix2::B::a
+  abstract member-signature set a(core::List<(core::int?) → core::int?> _) → void; -> mix2::B::a
+  abstract member-signature method m((core::int?) → core::int? x) → (core::int?) → core::int?; -> mix2::B::m
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+abstract class _DwB0&C0&B = mix::C0 with mix2::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_DwB0&C0&B
+    : super mix::C0::•()
+    ;
+  mixin-super-stub get a() → core::List<(core::int) → core::int>
+    return super.{mix2::B::a};
+  mixin-super-stub set a(core::List<(core::int) → core::int> _) → void
+    return super.{mix2::B::a} = _;
+  mixin-super-stub method m((core::int) → core::int x) → (core::int) → core::int
+    return super.{mix2::B::m}(x);
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+class DwB0 extends self::_DwB0&C0&B {
+  synthetic constructor •() → self::DwB0
+    : super self::_DwB0&C0&B::•()
+    ;
+}
+abstract class _DwBq0&C0&Bq = mix::C0 with mix2::Bq /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_DwBq0&C0&Bq
+    : super mix::C0::•()
+    ;
+  mixin-super-stub get a() → core::List<(core::int?) → core::int?>
+    return super.{mix2::Bq::a};
+  mixin-super-stub set a(core::List<(core::int?) → core::int?> _) → void
+    return super.{mix2::Bq::a} = _;
+  mixin-super-stub method m((core::int?) → core::int? x) → (core::int?) → core::int?
+    return super.{mix2::Bq::m}(x);
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+class DwBq0 extends self::_DwBq0&C0&Bq {
+  synthetic constructor •() → self::DwBq0
+    : super self::_DwBq0&C0&Bq::•()
+    ;
+}
+class DiB3 extends mix::C3 implements mix2::B {
+  synthetic constructor •() → self::DiB3
+    : super mix::C3::•()
+    ;
+  abstract member-signature get a() → core::List<(core::int) → core::int>; -> mix2::Bq::a
+  abstract member-signature set a(core::List<(core::int) → core::int> _) → void; -> mix2::Bq::a
+  abstract member-signature method m((core::int) → core::int x) → (core::int) → core::int; -> mix2::Bq::m
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+class DiBq3 extends mix::C3 implements mix2::Bq {
+  synthetic constructor •() → self::DiBq3
+    : super mix::C3::•()
+    ;
+  abstract member-signature get a() → core::List<(core::int?) → core::int?>; -> mix2::Bq::a
+  abstract member-signature set a(core::List<(core::int?) → core::int?> _) → void; -> mix2::Bq::a
+  abstract member-signature method m((core::int?) → core::int? x) → (core::int?) → core::int?; -> mix2::Bq::m
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+abstract class _DwB3&C3&B = mix::C3 with mix2::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_DwB3&C3&B
+    : super mix::C3::•()
+    ;
+  mixin-super-stub get a() → core::List<(core::int) → core::int>
+    return super.{mix2::B::a};
+  mixin-super-stub set a(core::List<(core::int) → core::int> _) → void
+    return super.{mix2::B::a} = _;
+  mixin-super-stub method m((core::int) → core::int x) → (core::int) → core::int
+    return super.{mix2::B::m}(x);
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+class DwB3 extends self::_DwB3&C3&B {
+  synthetic constructor •() → self::DwB3
+    : super self::_DwB3&C3&B::•()
+    ;
+}
+abstract class _DwBq3&C3&Bq = mix::C3 with mix2::Bq /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_DwBq3&C3&Bq
+    : super mix::C3::•()
+    ;
+  mixin-super-stub get a() → core::List<(core::int?) → core::int?>
+    return super.{mix2::Bq::a};
+  mixin-super-stub set a(core::List<(core::int?) → core::int?> _) → void
+    return super.{mix2::Bq::a} = _;
+  mixin-super-stub method m((core::int?) → core::int? x) → (core::int?) → core::int?
+    return super.{mix2::Bq::m}(x);
+  abstract member-signature get _identityHashCode() → core::int; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type; -> core::Object::runtimeType
+}
+class DwBq3 extends self::_DwBq3&C3&Bq {
+  synthetic constructor •() → self::DwBq3
+    : super self::_DwBq3&C3&Bq::•()
+    ;
+}
+static method main() → dynamic {}
+
+library;
+import self as mix;
+import "mixin_from_opt_in_out_in_lib2.dart" as mix2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart";
+
+class C0 extends mix2::B {
+  synthetic constructor •() → mix::C0*
+    : super mix2::B::•()
+    ;
+  abstract member-signature get a() → core::List<(core::int*) →* core::int*>*; -> mix2::B::a
+  abstract member-signature set a(core::List<(core::int*) →* core::int*>* _) → void; -> mix2::B::a
+  abstract member-signature method m((core::int*) →* core::int* x) → (core::int*) →* core::int*; -> mix2::B::m
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C3 extends mix2::Bq {
+  synthetic constructor •() → mix::C3*
+    : super mix2::Bq::•()
+    ;
+  abstract member-signature get a() → core::List<(core::int*) →* core::int*>*; -> mix2::Bq::a
+  abstract member-signature set a(core::List<(core::int*) →* core::int*>* _) → void; -> mix2::Bq::a
+  abstract member-signature method m((core::int*) →* core::int* x) → (core::int*) →* core::int*; -> mix2::Bq::m
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library /*isNonNullableByDefault*/;
+import self as mix2;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → mix2::B
+    : super core::Object::•()
+    ;
+  get a() → core::List<(core::int) → core::int>
+    return <(core::int) → core::int>[];
+  set a(core::List<(core::int) → core::int> _) → void {}
+  method m((core::int) → core::int x) → (core::int) → core::int
+    return x;
+}
+class Bq extends core::Object {
+  synthetic constructor •() → mix2::Bq
+    : super core::Object::•()
+    ;
+  get a() → core::List<(core::int?) → core::int?>
+    return <(core::int?) → core::int?>[];
+  set a(core::List<(core::int?) → core::int?> _) → void {}
+  method m((core::int?) → core::int? x) → (core::int?) → core::int?
+    return x;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..d267d60
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mixin_from_opt_out.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "mixin_from_opt_out_lib.dart" as mix;
+
+import "org-dartlang-testcase:///mixin_from_opt_out_lib.dart";
+
+abstract class _Class&Object&Mixin = core::Object with mix::Mixin /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class&Object&Mixin
+    : super core::Object::•()
+    ;
+  mixin-super-stub method /*isLegacy*/ method(core::int* i) → core::int*
+    return super.{mix::Mixin::method}(i);
+  abstract member-signature operator /*isLegacy*/ ==(dynamic other) → core::bool*; -> core::Object::==
+}
+class Class extends self::_Class&Object&Mixin {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Object&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::Class::•().{self::_Class&Object&Mixin::method}(null){(core::int*) → core::int*});
+}
+
+library;
+import self as mix;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  synthetic constructor •() → mix::Mixin*
+    : super core::Object::•()
+    ;
+  method method(core::int* i) → core::int*
+    return let final core::int* #t1 = i in #t1 == null ?{core::int*} 0 : #t1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.modular.expect
new file mode 100644
index 0000000..740dfc6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/mock_http_headers.dart.weak.modular.expect
@@ -0,0 +1,118 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:_http" as _ht;
+
+import "dart:io";
+
+class Mock extends core::Object {
+  synthetic constructor •() → self::Mock*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class MockHttpHeaders extends self::Mock implements _ht::HttpHeaders {
+  synthetic constructor •() → self::MockHttpHeaders*
+    : super self::Mock::•()
+    ;
+  no-such-method-forwarder get date() → core::DateTime*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::DateTime*;
+  no-such-method-forwarder set date(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder get expires() → core::DateTime*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::DateTime*;
+  no-such-method-forwarder set expires(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder get ifModifiedSince() → core::DateTime*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::DateTime*;
+  no-such-method-forwarder set ifModifiedSince(core::DateTime* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder get host() → core::String*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::String*;
+  no-such-method-forwarder set host(core::String* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder get port() → core::int*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  no-such-method-forwarder set port(core::int* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder get contentType() → _ht::ContentType*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} _ht::ContentType*;
+  no-such-method-forwarder set contentType(_ht::ContentType* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C15, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder get contentLength() → core::int*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C16, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  no-such-method-forwarder set contentLength(core::int* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C17, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder get persistentConnection() → core::bool*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C18, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::bool*;
+  no-such-method-forwarder set persistentConnection(core::bool* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C19, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder get chunkedTransferEncoding() → core::bool*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C20, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::bool*;
+  no-such-method-forwarder set chunkedTransferEncoding(core::bool* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C21, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder operator [](core::String* name) → core::List<core::String*>*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C22, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::List<core::String*>*;
+  no-such-method-forwarder method value(core::String* name) → core::String*
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C23, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::String*;
+  no-such-method-forwarder method add(core::String* name, core::Object* value, {core::bool* preserveHeaderCase = #C24}) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C25, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name, value]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C26: preserveHeaderCase}))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method set(core::String* name, core::Object* value, {core::bool* preserveHeaderCase = #C24}) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C27, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name, value]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C26: preserveHeaderCase}))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method remove(core::String* name, core::Object* value) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C28, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name, value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method removeAll(core::String* name) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C29, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method forEach((core::String*, core::List<core::String*>*) →* void action) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C30, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method noFolding(core::String* name) → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C31, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[name]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/_http/http.dart */ clear() → void
+    return this.{self::Mock::noSuchMethod}(new core::_InvocationMirror::_withType(#C32, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #date
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #date=
+  #C6 = #expires
+  #C7 = #expires=
+  #C8 = #ifModifiedSince
+  #C9 = #ifModifiedSince=
+  #C10 = #host
+  #C11 = #host=
+  #C12 = #port
+  #C13 = #port=
+  #C14 = #contentType
+  #C15 = #contentType=
+  #C16 = #contentLength
+  #C17 = #contentLength=
+  #C18 = #persistentConnection
+  #C19 = #persistentConnection=
+  #C20 = #chunkedTransferEncoding
+  #C21 = #chunkedTransferEncoding=
+  #C22 = #[]
+  #C23 = #value
+  #C24 = false
+  #C25 = #add
+  #C26 = #preserveHeaderCase
+  #C27 = #set
+  #C28 = #remove
+  #C29 = #removeAll
+  #C30 = #forEach
+  #C31 = #noFolding
+  #C32 = #clear
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..3a15eee
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.modular.expect
@@ -0,0 +1,187 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "never_opt_out_lib.dart" as nev;
+
+import "org-dartlang-testcase:///never_opt_out_lib.dart";
+
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends nev::A {
+  field Null neverField = null;
+  field Null nullField = null;
+  synthetic constructor •() → self::B*
+    : super nev::A::•()
+    ;
+  method neverMethod(Null value) → Null
+    return value;
+  get neverProperty() → Null
+    return null;
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
+    return value;
+  get nullProperty() → Null
+    return null;
+  set nullProperty(Null value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends nev::A {
+  field Never* neverField = null;
+  field Never* nullField = null;
+  synthetic constructor •() → self::C*
+    : super nev::A::•()
+    ;
+  method neverMethod(Null value) → Never*
+    return value;
+  get neverProperty() → Never*
+    return null;
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Never*
+    return value;
+  get nullProperty() → Never*
+    return null;
+  set nullProperty(Null value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field Never* optOutNever;
+static field dynamic inferredOptOutNever = nev::optInNever;
+static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
+static method main() → dynamic {
+  nev::optInNever = self::optOutNever;
+  core::Type* typeNever = #C1;
+  self::genericMethod<Never*>();
+  new self::GenericClass::•<Never*>();
+  Never* localNever = null;
+  Null localNull = null;
+  dynamic inferredLocalNever = nev::optInNever;
+  localNever = localNever;
+  self::optOutNever = localNever;
+  nev::optInNever = localNever;
+  localNull = localNever;
+  self::inferredOptOutNever = localNever;
+  inferredLocalNever = localNever;
+  localNever = self::optOutNever;
+  self::optOutNever = self::optOutNever;
+  nev::optInNever = self::optOutNever;
+  localNull = self::optOutNever;
+  self::inferredOptOutNever = self::optOutNever;
+  inferredLocalNever = self::optOutNever;
+  localNever = nev::optInNever;
+  self::optOutNever = nev::optInNever;
+  nev::optInNever = nev::optInNever;
+  localNull = nev::optInNever;
+  self::inferredOptOutNever = nev::optInNever;
+  inferredLocalNever = nev::optInNever;
+  localNever = localNull;
+  self::optOutNever = localNull;
+  nev::optInNever = localNull;
+  localNull = localNull;
+  self::inferredOptOutNever = localNull;
+  inferredLocalNever = localNull;
+  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
+  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
+  nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
+  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
+  self::inferredOptOutNever = self::inferredOptOutNever;
+  inferredLocalNever = self::inferredOptOutNever;
+  localNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
+  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
+  nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
+  localNull = inferredLocalNever as{TypeError,ForDynamic} Null;
+  self::inferredOptOutNever = inferredLocalNever;
+  inferredLocalNever = inferredLocalNever;
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => localNever = nev::throwing());
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => nev::optInNever = nev::throwing());
+  self::throws(() → Null => self::inferredOptOutNever = nev::throwing());
+  self::throws(() → Null => inferredLocalNever = nev::throwing());
+  nev::BoundedGenericClass<Null>* boundedGenericClass = new nev::BoundedGenericClass::•<Null>();
+  self::throws(() → Null {
+    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<Null>();
+  });
+  core::List<Null>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<Null>();
+  dynamic dyn = null;
+  nev::optInNever = dyn as{TypeError,ForDynamic} Never;
+}
+static method throws(() →* void f) → dynamic {
+  try {
+    f(){() →* void};
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception";
+}
+
+library /*isNonNullableByDefault*/;
+import self as nev;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+import "org-dartlang-testcase:///never_opt_out.dart";
+
+class A extends core::Object {
+  field Never neverField = throw "Should not reach here";
+  field Null nullField = null;
+  synthetic constructor •() → nev::A
+    : super core::Object::•()
+    ;
+  method neverMethod(Never value) → Never
+    return let final Never #t1 = value in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  get neverProperty() → Never
+    return throw "Should not reach here";
+  set neverProperty(Never value) → void {}
+  method nullMethod(Null value) → Null
+    return value;
+  get nullProperty() → Null
+    return null;
+  set nullProperty(Null value) → void {}
+}
+class BoundedGenericClass<T extends Never> extends core::Object {
+  synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
+    : super core::Object::•()
+    ;
+}
+late static field Never optInNever;
+static method throwing() → Never
+  return throw "Never!";
+static method boundedGenericMethod1<T extends Never>() → nev::boundedGenericMethod1::T
+  return throw "Should never return";
+static method boundedGenericMethod2<T extends Never>() → core::List<nev::boundedGenericMethod2::T>
+  return <nev::boundedGenericMethod2::T>[];
+
+constants  {
+  #C1 = TypeLiteralConstant(Never*)
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version.dart.weak.modular.expect
new file mode 100644
index 0000000..f6eb3c3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class late extends core::Object {
+  synthetic constructor •() → self::late*
+    : super core::Object::•()
+    ;
+  get g() → core::int*
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class required extends core::Object {
+  synthetic constructor •() → self::required*
+    : super core::Object::•()
+    ;
+  get g() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::late* l = new self::late::•();
+  field self::required* r = new self::required::•();
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  if(!(new self::C::•().{self::C::l}{self::late*}.{self::late::g}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 1))
+    throw "Expected 1";
+  if(!(new self::C::•().{self::C::r}{self::required*}.{self::required::g}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 2))
+    throw "Expected 2";
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version_try_to_trick.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version_try_to_trick.dart.weak.modular.expect
new file mode 100644
index 0000000..f6eb3c3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/nnbd_opt_out_language_version_try_to_trick.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class late extends core::Object {
+  synthetic constructor •() → self::late*
+    : super core::Object::•()
+    ;
+  get g() → core::int*
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class required extends core::Object {
+  synthetic constructor •() → self::required*
+    : super core::Object::•()
+    ;
+  get g() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::late* l = new self::late::•();
+  field self::required* r = new self::required::•();
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  if(!(new self::C::•().{self::C::l}{self::late*}.{self::late::g}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 1))
+    throw "Expected 1";
+  if(!(new self::C::•().{self::C::r}{self::required*}.{self::required::g}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 2))
+    throw "Expected 2";
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/no_null_shorting.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/no_null_shorting.dart.weak.modular.expect
new file mode 100644
index 0000000..9e9eb03
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/no_null_shorting.dart.weak.modular.expect
@@ -0,0 +1,161 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field self::Class* field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  method method() → self::Class*
+    return this.{self::Class::field}{self::Class*};
+  operator [](self::Class* key) → self::Class*
+    return this.{self::Class::field}{self::Class*};
+  operator []=(self::Class* key, self::Class* value) → void {
+    this.{self::Class::field} = value;
+  }
+  operator +(core::int* value) → self::Class*
+    return this.{self::Class::field}{self::Class*};
+  operator unary-() → self::Class*
+    return this.{self::Class::field}{self::Class*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::propertyAccess(null);
+  self::indexAccess(null);
+  self::operatorAccess(null);
+  self::ifNull(null);
+}
+static method propertyAccess(self::Class* c) → void {
+  let final self::Class* #t1 = c in #t1 == null ?{self::Class*} null : #t1.{self::Class::field}{self::Class*};
+  let final self::Class* #t2 = c in #t2 == null ?{self::Class*} null : #t2.{self::Class::field} = new self::Class::•();
+  c = let final self::Class* #t3 = c in #t3 == null ?{self::Class*} null : #t3.{self::Class::field} = new self::Class::•();
+  let final self::Class* #t4 = c in #t4 == null ?{self::Class*} null : #t4.{self::Class::method}(){() →* self::Class*};
+  self::throws(() → self::Class* => (let final self::Class* #t5 = c in #t5 == null ?{self::Class*} null : #t5.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*});
+  let final self::Class* #t6 = let final self::Class* #t7 = c in #t7 == null ?{self::Class*} null : #t7.{self::Class::field}{self::Class*} in #t6 == null ?{self::Class*} null : #t6.{self::Class::field}{self::Class*};
+  self::throws(() → self::Class* => let final self::Class* #t8 = (let final self::Class* #t9 = c in #t9 == null ?{self::Class*} null : #t9.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*} in #t8 == null ?{self::Class*} null : #t8.{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t10 = c in #t10 == null ?{self::Class*} null : #t10.{self::Class::field}{self::Class*}).{self::Class::field} = new self::Class::•());
+  let final self::Class* #t11 = let final self::Class* #t12 = c in #t12 == null ?{self::Class*} null : #t12.{self::Class::field}{self::Class*} in #t11 == null ?{self::Class*} null : #t11.{self::Class::field} = new self::Class::•();
+  self::throws(() → self::Class* => let final self::Class* #t13 = (let final self::Class* #t14 = c in #t14 == null ?{self::Class*} null : #t14.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*} in #t13 == null ?{self::Class*} null : #t13.{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t15 = c in #t15 == null ?{self::Class*} null : #t15.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t16 = c in #t16 == null ?{self::Class*} null : #t16.{self::Class::field} = new self::Class::•()).{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t17 = c in #t17 == null ?{self::Class*} null : #t17.{self::Class::method}(){() →* self::Class*}).{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => c = (let final self::Class* #t18 = c in #t18 == null ?{self::Class*} null : #t18.{self::Class::field}{self::Class*}).{self::Class::field} = new self::Class::•());
+  c = let final self::Class* #t19 = let final self::Class* #t20 = c in #t20 == null ?{self::Class*} null : #t20.{self::Class::field}{self::Class*} in #t19 == null ?{self::Class*} null : #t19.{self::Class::field} = new self::Class::•();
+  self::throws(() → self::Class* => c = let final self::Class* #t21 = (let final self::Class* #t22 = c in #t22 == null ?{self::Class*} null : #t22.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*} in #t21 == null ?{self::Class*} null : #t21.{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t23 = c in #t23 == null ?{self::Class*} null : #t23.{self::Class::field}{self::Class*}).{self::Class::method}(){() →* self::Class*});
+  let final self::Class* #t24 = c in #t24 == null ?{self::Class*} null : #t24.{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*};
+  c = let final self::Class* #t25 = c in #t25 == null ?{self::Class*} null : #t25.{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*};
+  let final self::Class* #t26 = c in #t26 == null ?{self::Class*} null : #t26.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class* #t27 = c in #t27 == null ?{self::Class*} null : #t27.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class* #t28 = c in #t28 == null ?{self::Class*} null : #t28.{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*};
+  c = let final self::Class* #t29 = c in #t29 == null ?{self::Class*} null : #t29.{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*};
+  self::throws(() → self::Class* => (let final self::Class* #t30 = c in #t30 == null ?{self::Class*} null : #t30.{self::Class::method}(){() →* self::Class*}).{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t31 = c in #t31 == null ?{self::Class*} null : #t31.{self::Class::method}(){() →* self::Class*}).{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t32 = c in #t32 == null ?{self::Class*} null : #t32.{self::Class::method}(){() →* self::Class*}).{self::Class::method}(){() →* self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t33 = c in #t33 == null ?{self::Class*} null : #t33.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*}.{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t34 = c in #t34 == null ?{self::Class*} null : #t34.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*}.{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => c = (let final self::Class* #t35 = c in #t35 == null ?{self::Class*} null : #t35.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*}.{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t36 = c in #t36 == null ?{self::Class*} null : #t36.{self::Class::field}{self::Class*}).{self::Class::field}{self::Class*}.{self::Class::method}(){() →* self::Class*});
+  let final self::Class* #t37 = c in #t37 == null ?{self::Class*} null : #t37.{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*}.{self::Class::field}{self::Class*};
+  c = let final self::Class* #t38 = c in #t38 == null ?{self::Class*} null : #t38.{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*}.{self::Class::field}{self::Class*};
+  let final self::Class* #t39 = c in #t39 == null ?{self::Class*} null : #t39.{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*}.{self::Class::field} = new self::Class::•();
+  c = let final self::Class* #t40 = c in #t40 == null ?{self::Class*} null : #t40.{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*}.{self::Class::field} = new self::Class::•();
+  let final self::Class* #t41 = c in #t41 == null ?{self::Class*} null : #t41.{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*}.{self::Class::method}(){() →* self::Class*};
+  c = let final self::Class* #t42 = c in #t42 == null ?{self::Class*} null : #t42.{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*}.{self::Class::method}(){() →* self::Class*};
+  self::throws(() → self::Class* => (let final self::Class* #t43 = c in #t43 == null ?{self::Class*} null : #t43.{self::Class::method}(){() →* self::Class*}).{self::Class::field}{self::Class*}.{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t44 = c in #t44 == null ?{self::Class*} null : #t44.{self::Class::method}(){() →* self::Class*}).{self::Class::field}{self::Class*}.{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t45 = c in #t45 == null ?{self::Class*} null : #t45.{self::Class::method}(){() →* self::Class*}).{self::Class::field}{self::Class*}.{self::Class::method}(){() →* self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t46 = c in #t46 == null ?{self::Class*} null : #t46.{self::Class::field}{self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => c = (let final self::Class* #t47 = c in #t47 == null ?{self::Class*} null : #t47.{self::Class::field}{self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t48 = c in #t48 == null ?{self::Class*} null : #t48.{self::Class::field}{self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => c = (let final self::Class* #t49 = c in #t49 == null ?{self::Class*} null : #t49.{self::Class::field}{self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t50 = c in #t50 == null ?{self::Class*} null : #t50.{self::Class::field}{self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*});
+  self::throws(() → self::Class* => c = (let final self::Class* #t51 = c in #t51 == null ?{self::Class*} null : #t51.{self::Class::field}{self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*});
+  let final self::Class* #t52 = c in #t52 == null ?{self::Class*} null : #t52.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*};
+  c = let final self::Class* #t53 = c in #t53 == null ?{self::Class*} null : #t53.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*};
+  let final self::Class* #t54 = c in #t54 == null ?{self::Class*} null : #t54.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  c = let final self::Class* #t55 = c in #t55 == null ?{self::Class*} null : #t55.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•();
+  let final self::Class* #t56 = c in #t56 == null ?{self::Class*} null : #t56.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*};
+  c = let final self::Class* #t57 = c in #t57 == null ?{self::Class*} null : #t57.{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*};
+  self::throws(() → self::Class* => (let final self::Class* #t58 = c in #t58 == null ?{self::Class*} null : #t58.{self::Class::method}(){() →* self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => c = (let final self::Class* #t59 = c in #t59 == null ?{self::Class*} null : #t59.{self::Class::method}(){() →* self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t60 = c in #t60 == null ?{self::Class*} null : #t60.{self::Class::method}(){() →* self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => c = (let final self::Class* #t61 = c in #t61 == null ?{self::Class*} null : #t61.{self::Class::method}(){() →* self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t62 = c in #t62 == null ?{self::Class*} null : #t62.{self::Class::method}(){() →* self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*});
+  self::throws(() → self::Class* => c = (let final self::Class* #t63 = c in #t63 == null ?{self::Class*} null : #t63.{self::Class::method}(){() →* self::Class*}).{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t64 = c in #t64 == null ?{self::Class*} null : #t64.{self::Class::field}{self::Class*}).{self::Class::method}(){() →* self::Class*}.{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t65 = c in #t65 == null ?{self::Class*} null : #t65.{self::Class::field}{self::Class*}).{self::Class::method}(){() →* self::Class*}.{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => c = (let final self::Class* #t66 = c in #t66 == null ?{self::Class*} null : #t66.{self::Class::field}{self::Class*}).{self::Class::method}(){() →* self::Class*}.{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t67 = c in #t67 == null ?{self::Class*} null : #t67.{self::Class::field}{self::Class*}).{self::Class::method}(){() →* self::Class*}.{self::Class::method}(){() →* self::Class*});
+  let final self::Class* #t68 = c in #t68 == null ?{self::Class*} null : #t68.{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*}.{self::Class::field}{self::Class*};
+  c = let final self::Class* #t69 = c in #t69 == null ?{self::Class*} null : #t69.{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*}.{self::Class::field}{self::Class*};
+  let final self::Class* #t70 = c in #t70 == null ?{self::Class*} null : #t70.{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*}.{self::Class::field} = new self::Class::•();
+  c = let final self::Class* #t71 = c in #t71 == null ?{self::Class*} null : #t71.{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*}.{self::Class::field} = new self::Class::•();
+  let final self::Class* #t72 = c in #t72 == null ?{self::Class*} null : #t72.{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*}.{self::Class::method}(){() →* self::Class*};
+  c = let final self::Class* #t73 = c in #t73 == null ?{self::Class*} null : #t73.{self::Class::field} = new self::Class::•().{self::Class::method}(){() →* self::Class*}.{self::Class::method}(){() →* self::Class*};
+  self::throws(() → self::Class* => (let final self::Class* #t74 = c in #t74 == null ?{self::Class*} null : #t74.{self::Class::method}(){() →* self::Class*}).{self::Class::method}(){() →* self::Class*}.{self::Class::field}{self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t75 = c in #t75 == null ?{self::Class*} null : #t75.{self::Class::method}(){() →* self::Class*}).{self::Class::method}(){() →* self::Class*}.{self::Class::field} = new self::Class::•());
+  self::throws(() → self::Class* => (let final self::Class* #t76 = c in #t76 == null ?{self::Class*} null : #t76.{self::Class::method}(){() →* self::Class*}).{self::Class::method}(){() →* self::Class*}.{self::Class::method}(){() →* self::Class*});
+  let final self::Class* #t77 = let final self::Class* #t78 = c in #t78 == null ?{self::Class*} null : #t78.{self::Class::method}(){() →* self::Class*} in #t77 == null ?{self::Class*} null : #t77.{self::Class::method}(){() →* self::Class*};
+}
+static method indexAccess(self::Class* c) → void {
+  self::throws(() → self::Class* => (let final self::Class* #t79 = c in #t79 == null ?{self::Class*} null : #t79.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*});
+  self::throws(() → self::Class* => let final self::Class* #t80 = let final self::Class* #t81 = c in #t81 == null ?{self::Class*} null : #t81.{self::Class::field}{self::Class*} in let final self::Class* #t82 = c in let final self::Class* #t83 = new self::Class::•() in let final void #t84 = #t80.{self::Class::[]=}(#t82, #t83){(self::Class*, self::Class*) →* void} in #t83);
+  self::throws(() → self::Class* => c = let final self::Class* #t85 = let final self::Class* #t86 = c in #t86 == null ?{self::Class*} null : #t86.{self::Class::field}{self::Class*} in let final self::Class* #t87 = c in let final self::Class* #t88 = new self::Class::•() in let final void #t89 = #t85.{self::Class::[]=}(#t87, #t88){(self::Class*, self::Class*) →* void} in #t88);
+  self::throws(() → self::Class* => (let final self::Class* #t90 = c in #t90 == null ?{self::Class*} null : #t90.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*}.{self::Class::method}(){() →* self::Class*});
+  self::throws(() → self::Class* => let final self::Class* #t91 = let final self::Class* #t92 = c in #t92 == null ?{self::Class*} null : #t92.{self::Class::field}{self::Class*} in let final self::Class* #t93 = c in let final self::Class* #t94 = #t91.{self::Class::[]}(#t93){(self::Class*) →* self::Class*}.{self::Class::+}(0){(core::int*) →* self::Class*} in let final void #t95 = #t91.{self::Class::[]=}(#t93, #t94){(self::Class*, self::Class*) →* void} in #t94);
+  self::throws(() → self::Class* => c = let final self::Class* #t96 = let final self::Class* #t97 = c in #t97 == null ?{self::Class*} null : #t97.{self::Class::field}{self::Class*} in let final self::Class* #t98 = c in let final self::Class* #t99 = #t96.{self::Class::[]}(#t98){(self::Class*) →* self::Class*}.{self::Class::+}(0){(core::int*) →* self::Class*} in let final void #t100 = #t96.{self::Class::[]=}(#t98, #t99){(self::Class*, self::Class*) →* void} in #t99);
+  self::throws(() → self::Class* => let final self::Class* #t101 = let final self::Class* #t102 = c in #t102 == null ?{self::Class*} null : #t102.{self::Class::field}{self::Class*} in let final self::Class* #t103 = c in let final self::Class* #t104 = #t101.{self::Class::[]}(#t103){(self::Class*) →* self::Class*} in let final void #t105 = #t101.{self::Class::[]=}(#t103, #t104.{self::Class::+}(1){(core::int*) →* self::Class*}){(self::Class*, self::Class*) →* void} in #t104);
+  self::throws(() → self::Class* => c = let final self::Class* #t106 = let final self::Class* #t107 = c in #t107 == null ?{self::Class*} null : #t107.{self::Class::field}{self::Class*} in let final self::Class* #t108 = c in let final self::Class* #t109 = #t106.{self::Class::[]}(#t108){(self::Class*) →* self::Class*} in let final void #t110 = #t106.{self::Class::[]=}(#t108, #t109.{self::Class::+}(1){(core::int*) →* self::Class*}){(self::Class*, self::Class*) →* void} in #t109);
+  self::throws(() → self::Class* => let final self::Class* #t111 = let final self::Class* #t112 = c in #t112 == null ?{self::Class*} null : #t112.{self::Class::field}{self::Class*} in let final self::Class* #t113 = c in let final self::Class* #t114 = #t111.{self::Class::[]}(#t113){(self::Class*) →* self::Class*}.{self::Class::+}(1){(core::int*) →* self::Class*} in let final void #t115 = #t111.{self::Class::[]=}(#t113, #t114){(self::Class*, self::Class*) →* void} in #t114);
+  self::throws(() → self::Class* => c = let final self::Class* #t116 = let final self::Class* #t117 = c in #t117 == null ?{self::Class*} null : #t117.{self::Class::field}{self::Class*} in let final self::Class* #t118 = c in let final self::Class* #t119 = #t116.{self::Class::[]}(#t118){(self::Class*) →* self::Class*}.{self::Class::+}(1){(core::int*) →* self::Class*} in let final void #t120 = #t116.{self::Class::[]=}(#t118, #t119){(self::Class*, self::Class*) →* void} in #t119);
+  self::throws(() → self::Class* => (let final self::Class* #t121 = c in #t121 == null ?{self::Class*} null : #t121.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*}.{self::Class::[]}(c){(self::Class*) →* self::Class*});
+  self::throws(() → self::Class* => let final self::Class* #t122 = (let final self::Class* #t123 = c in #t123 == null ?{self::Class*} null : #t123.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*} in let final self::Class* #t124 = c in let final self::Class* #t125 = new self::Class::•() in let final void #t126 = #t122.{self::Class::[]=}(#t124, #t125){(self::Class*, self::Class*) →* void} in #t125);
+  self::throws(() → self::Class* => c = let final self::Class* #t127 = (let final self::Class* #t128 = c in #t128 == null ?{self::Class*} null : #t128.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*} in let final self::Class* #t129 = c in let final self::Class* #t130 = new self::Class::•() in let final void #t131 = #t127.{self::Class::[]=}(#t129, #t130){(self::Class*, self::Class*) →* void} in #t130);
+  self::throws(() → self::Class* => (let final self::Class* #t132 = c in #t132 == null ?{self::Class*} null : #t132.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*}.{self::Class::[]}(c){(self::Class*) →* self::Class*}.{self::Class::method}(){() →* self::Class*});
+  self::throws(() → self::Class* => let final self::Class* #t133 = (let final self::Class* #t134 = c in #t134 == null ?{self::Class*} null : #t134.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*} in let final self::Class* #t135 = c in let final self::Class* #t136 = #t133.{self::Class::[]}(#t135){(self::Class*) →* self::Class*}.{self::Class::+}(0){(core::int*) →* self::Class*} in let final void #t137 = #t133.{self::Class::[]=}(#t135, #t136){(self::Class*, self::Class*) →* void} in #t136);
+  self::throws(() → self::Class* => c = let final self::Class* #t138 = (let final self::Class* #t139 = c in #t139 == null ?{self::Class*} null : #t139.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*} in let final self::Class* #t140 = c in let final self::Class* #t141 = #t138.{self::Class::[]}(#t140){(self::Class*) →* self::Class*}.{self::Class::+}(0){(core::int*) →* self::Class*} in let final void #t142 = #t138.{self::Class::[]=}(#t140, #t141){(self::Class*, self::Class*) →* void} in #t141);
+  self::throws(() → self::Class* => let final self::Class* #t143 = (let final self::Class* #t144 = c in #t144 == null ?{self::Class*} null : #t144.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*} in let final self::Class* #t145 = c in let final self::Class* #t146 = #t143.{self::Class::[]}(#t145){(self::Class*) →* self::Class*} in let final void #t147 = #t143.{self::Class::[]=}(#t145, #t146.{self::Class::+}(1){(core::int*) →* self::Class*}){(self::Class*, self::Class*) →* void} in #t146);
+  self::throws(() → self::Class* => c = let final self::Class* #t148 = (let final self::Class* #t149 = c in #t149 == null ?{self::Class*} null : #t149.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*} in let final self::Class* #t150 = c in let final self::Class* #t151 = #t148.{self::Class::[]}(#t150){(self::Class*) →* self::Class*} in let final void #t152 = #t148.{self::Class::[]=}(#t150, #t151.{self::Class::+}(1){(core::int*) →* self::Class*}){(self::Class*, self::Class*) →* void} in #t151);
+  self::throws(() → self::Class* => let final self::Class* #t153 = (let final self::Class* #t154 = c in #t154 == null ?{self::Class*} null : #t154.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*} in let final self::Class* #t155 = c in let final self::Class* #t156 = #t153.{self::Class::[]}(#t155){(self::Class*) →* self::Class*}.{self::Class::+}(1){(core::int*) →* self::Class*} in let final void #t157 = #t153.{self::Class::[]=}(#t155, #t156){(self::Class*, self::Class*) →* void} in #t156);
+  self::throws(() → self::Class* => c = let final self::Class* #t158 = (let final self::Class* #t159 = c in #t159 == null ?{self::Class*} null : #t159.{self::Class::field}{self::Class*}).{self::Class::[]}(c){(self::Class*) →* self::Class*} in let final self::Class* #t160 = c in let final self::Class* #t161 = #t158.{self::Class::[]}(#t160){(self::Class*) →* self::Class*}.{self::Class::+}(1){(core::int*) →* self::Class*} in let final void #t162 = #t158.{self::Class::[]=}(#t160, #t161){(self::Class*, self::Class*) →* void} in #t161);
+}
+static method operatorAccess(self::Class* c) → void {
+  self::throws(() → self::Class* => (let final self::Class* #t163 = c in #t163 == null ?{self::Class*} null : #t163.{self::Class::field}{self::Class*}).{self::Class::+}(0){(core::int*) →* self::Class*});
+  self::throws(() → self::Class* => (let final self::Class* #t164 = c in #t164 == null ?{self::Class*} null : #t164.{self::Class::field}{self::Class*}).{self::Class::unary-}(){() →* self::Class*});
+  let final self::Class* #t165 = c in #t165 == null ?{self::Class*} null : #t165.{self::Class::field} = #t165.{self::Class::field}{self::Class*}.{self::Class::+}(0){(core::int*) →* self::Class*};
+  c = let final self::Class* #t166 = c in #t166 == null ?{self::Class*} null : let final self::Class* #t167 = #t166.{self::Class::field}{self::Class*}.{self::Class::+}(0){(core::int*) →* self::Class*} in let final void #t168 = #t166.{self::Class::field} = #t167 in #t167;
+  self::throws(() → self::Class* => let final self::Class* #t169 = let final self::Class* #t170 = c in #t170 == null ?{self::Class*} null : #t170.{self::Class::field}{self::Class*} in #t169.{self::Class::field} = #t169.{self::Class::field}{self::Class*}.{self::Class::+}(0){(core::int*) →* self::Class*});
+  self::throws(() → self::Class* => c = let final self::Class* #t171 = let final self::Class* #t172 = c in #t172 == null ?{self::Class*} null : #t172.{self::Class::field}{self::Class*} in #t171.{self::Class::field} = #t171.{self::Class::field}{self::Class*}.{self::Class::+}(0){(core::int*) →* self::Class*});
+  let final self::Class* #t173 = c in #t173 == null ?{self::Class*} null : #t173.{self::Class::field} = #t173.{self::Class::field}{self::Class*}.{self::Class::+}(1){(core::int*) →* self::Class*};
+  c = let final self::Class* #t174 = c in #t174 == null ?{self::Class*} null : let final self::Class* #t175 = #t174.{self::Class::field}{self::Class*} in let final void #t176 = #t174.{self::Class::field} = #t175.{self::Class::+}(1){(core::int*) →* self::Class*} in #t175;
+  let final self::Class* #t177 = c in #t177 == null ?{self::Class*} null : let final self::Class* #t178 = #t177.{self::Class::field}{self::Class*}.{self::Class::+}(1){(core::int*) →* self::Class*} in let final void #t179 = #t177.{self::Class::field} = #t178 in #t178;
+  c = let final self::Class* #t180 = c in #t180 == null ?{self::Class*} null : let final self::Class* #t181 = #t180.{self::Class::field}{self::Class*}.{self::Class::+}(1){(core::int*) →* self::Class*} in let final void #t182 = #t180.{self::Class::field} = #t181 in #t181;
+}
+static method ifNull(self::Class* c) → void {
+  let final self::Class* #t183 = c in #t183 == null ?{self::Class*} null : #t183.{self::Class::field}{self::Class*} == null ?{self::Class*} #t183.{self::Class::field} = c : null;
+  c = let final self::Class* #t184 = c in #t184 == null ?{self::Class*} null : let final self::Class* #t185 = #t184.{self::Class::field}{self::Class*} in #t185 == null ?{self::Class*} #t184.{self::Class::field} = c : #t185;
+  self::throws(() → self::Class* => let final self::Class* #t186 = let final self::Class* #t187 = c in #t187 == null ?{self::Class*} null : #t187.{self::Class::field}{self::Class*} in let final self::Class* #t188 = #t186.{self::Class::field}{self::Class*} in #t188 == null ?{self::Class*} #t186.{self::Class::field} = c : #t188);
+  self::throws(() → self::Class* => c = let final self::Class* #t189 = let final self::Class* #t190 = c in #t190 == null ?{self::Class*} null : #t190.{self::Class::field}{self::Class*} in let final self::Class* #t191 = #t189.{self::Class::field}{self::Class*} in #t191 == null ?{self::Class*} #t189.{self::Class::field} = c : #t191);
+  self::throws(() → self::Class* => let final self::Class* #t192 = let final self::Class* #t193 = c in #t193 == null ?{self::Class*} null : #t193.{self::Class::field}{self::Class*} in let final self::Class* #t194 = c in let final self::Class* #t195 = #t192.{self::Class::[]}(#t194){(self::Class*) →* self::Class*} in #t195 == null ?{self::Class*} let final self::Class* #t196 = c in let final void #t197 = #t192.{self::Class::[]=}(#t194, #t196){(self::Class*, self::Class*) →* void} in #t196 : #t195);
+  self::throws(() → self::Class* => c = let final self::Class* #t198 = let final self::Class* #t199 = c in #t199 == null ?{self::Class*} null : #t199.{self::Class::field}{self::Class*} in let final self::Class* #t200 = c in let final self::Class* #t201 = #t198.{self::Class::[]}(#t200){(self::Class*) →* self::Class*} in #t201 == null ?{self::Class*} let final self::Class* #t202 = c in let final void #t203 = #t198.{self::Class::[]=}(#t200, #t202){(self::Class*, self::Class*) →* void} in #t202 : #t201);
+}
+static method throws(() →* void f) → void {
+  try {
+    f(){() →* void};
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/no_null_shorting_explicit_extension.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/no_null_shorting_explicit_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..f8fa444
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/no_null_shorting_explicit_extension.dart.weak.modular.expect
@@ -0,0 +1,180 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field self::Class* _field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  get field = self::Extension|get#field;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+  operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
+  set field = self::Extension|set#field;
+}
+static method Extension|get#field(lowered final self::Class* #this) → self::Class*
+  return #this.{self::Class::_field}{self::Class*};
+static method Extension|set#field(lowered final self::Class* #this, self::Class* value) → void {
+  #this.{self::Class::_field} = value;
+}
+static method Extension|method(lowered final self::Class* #this) → self::Class*
+  return self::Extension|get#field(#this);
+static method Extension|get#method(lowered final self::Class* #this) → () →* self::Class*
+  return () → self::Class* => self::Extension|method(#this);
+static method Extension|[](lowered final self::Class* #this, self::Class* key) → self::Class*
+  return self::Extension|get#field(#this);
+static method Extension|[]=(lowered final self::Class* #this, self::Class* key, self::Class* value) → void {
+  self::Extension|set#field(#this, value);
+}
+static method Extension|+(lowered final self::Class* #this, core::int* value) → self::Class*
+  return self::Extension|get#field(#this);
+static method Extension|unary-(lowered final self::Class* #this) → self::Class*
+  return self::Extension|get#field(#this);
+static method main() → dynamic {
+  self::propertyAccess(null);
+  self::indexAccess(null);
+  self::operatorAccess(null);
+  self::ifNull(null);
+}
+static method propertyAccess(self::Class* c) → void {
+  let final self::Class* #t1 = c in #t1 == null ?{self::Class*} null : self::Extension|get#field(#t1);
+  let final self::Class* #t2 = c in #t2 == null ?{self::Class*} null : self::Extension|set#field(#t2, new self::Class::•());
+  c = let final self::Class* #t3 = c in #t3 == null ?{self::Class*} null : let final self::Class* #t4 = new self::Class::•() in let final void #t5 = self::Extension|set#field(#t3, #t4) in #t4;
+  let final self::Class* #t6 = c in #t6 == null ?{self::Class*} null : self::Extension|method(#t6);
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t7 = c in #t7 == null ?{self::Class*} null : self::Extension|get#field(#t7)));
+  let final self::Class* #t8 = let final self::Class* #t9 = c in #t9 == null ?{self::Class*} null : self::Extension|get#field(#t9) in #t8 == null ?{self::Class*} null : self::Extension|get#field(#t8);
+  self::throws(() → self::Class* => let final self::Class* #t10 = self::Extension|get#field(let final self::Class* #t11 = c in #t11 == null ?{self::Class*} null : self::Extension|get#field(#t11)) in #t10 == null ?{self::Class*} null : self::Extension|get#field(#t10));
+  self::throws(() → self::Class* => let final self::Class* #t12 = new self::Class::•() in let final void #t13 = self::Extension|set#field(let final self::Class* #t14 = c in #t14 == null ?{self::Class*} null : self::Extension|get#field(#t14), #t12) in #t12);
+  let final self::Class* #t15 = let final self::Class* #t16 = c in #t16 == null ?{self::Class*} null : self::Extension|get#field(#t16) in #t15 == null ?{self::Class*} null : self::Extension|set#field(#t15, new self::Class::•());
+  self::throws(() → self::Class* => let final self::Class* #t17 = self::Extension|get#field(let final self::Class* #t18 = c in #t18 == null ?{self::Class*} null : self::Extension|get#field(#t18)) in #t17 == null ?{self::Class*} null : let final self::Class* #t19 = new self::Class::•() in let final void #t20 = self::Extension|set#field(#t17, #t19) in #t19);
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t21 = c in #t21 == null ?{self::Class*} null : self::Extension|get#field(#t21)));
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t22 = c in #t22 == null ?{self::Class*} null : let final self::Class* #t23 = new self::Class::•() in let final void #t24 = self::Extension|set#field(#t22, #t23) in #t23));
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t25 = c in #t25 == null ?{self::Class*} null : self::Extension|method(#t25)));
+  self::throws(() → self::Class* => c = let final self::Class* #t26 = new self::Class::•() in let final void #t27 = self::Extension|set#field(let final self::Class* #t28 = c in #t28 == null ?{self::Class*} null : self::Extension|get#field(#t28), #t26) in #t26);
+  c = let final self::Class* #t29 = let final self::Class* #t30 = c in #t30 == null ?{self::Class*} null : self::Extension|get#field(#t30) in #t29 == null ?{self::Class*} null : let final self::Class* #t31 = new self::Class::•() in let final void #t32 = self::Extension|set#field(#t29, #t31) in #t31;
+  self::throws(() → self::Class* => c = let final self::Class* #t33 = self::Extension|get#field(let final self::Class* #t34 = c in #t34 == null ?{self::Class*} null : self::Extension|get#field(#t34)) in #t33 == null ?{self::Class*} null : let final self::Class* #t35 = new self::Class::•() in let final void #t36 = self::Extension|set#field(#t33, #t35) in #t35);
+  self::throws(() → self::Class* => self::Extension|method(let final self::Class* #t37 = c in #t37 == null ?{self::Class*} null : self::Extension|get#field(#t37)));
+  let final self::Class* #t38 = c in #t38 == null ?{self::Class*} null : self::Extension|set#field(#t38, self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class* #t39 = c in #t39 == null ?{self::Class*} null : let final self::Class* #t40 = self::Extension|get#field(new self::Class::•()) in let final void #t41 = self::Extension|set#field(#t39, #t40) in #t40;
+  let final self::Class* #t42 = c in #t42 == null ?{self::Class*} null : self::Extension|set#field(#t42, let final self::Class* #t43 = new self::Class::•() in let final void #t44 = self::Extension|set#field(new self::Class::•(), #t43) in #t43);
+  c = let final self::Class* #t45 = c in #t45 == null ?{self::Class*} null : let final self::Class* #t46 = let final self::Class* #t47 = new self::Class::•() in let final void #t48 = self::Extension|set#field(new self::Class::•(), #t47) in #t47 in let final void #t49 = self::Extension|set#field(#t45, #t46) in #t46;
+  let final self::Class* #t50 = c in #t50 == null ?{self::Class*} null : self::Extension|set#field(#t50, self::Extension|method(new self::Class::•()));
+  c = let final self::Class* #t51 = c in #t51 == null ?{self::Class*} null : let final self::Class* #t52 = self::Extension|method(new self::Class::•()) in let final void #t53 = self::Extension|set#field(#t51, #t52) in #t52;
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t54 = c in #t54 == null ?{self::Class*} null : self::Extension|method(#t54)));
+  self::throws(() → self::Class* => let final self::Class* #t55 = new self::Class::•() in let final void #t56 = self::Extension|set#field(let final self::Class* #t57 = c in #t57 == null ?{self::Class*} null : self::Extension|method(#t57), #t55) in #t55);
+  self::throws(() → self::Class* => self::Extension|method(let final self::Class* #t58 = c in #t58 == null ?{self::Class*} null : self::Extension|method(#t58)));
+  self::throws(() → self::Class* => self::Extension|get#field(self::Extension|get#field(let final self::Class* #t59 = c in #t59 == null ?{self::Class*} null : self::Extension|get#field(#t59))));
+  self::throws(() → self::Class* => let final self::Class* #t60 = new self::Class::•() in let final void #t61 = self::Extension|set#field(self::Extension|get#field(let final self::Class* #t62 = c in #t62 == null ?{self::Class*} null : self::Extension|get#field(#t62)), #t60) in #t60);
+  self::throws(() → self::Class* => c = let final self::Class* #t63 = new self::Class::•() in let final void #t64 = self::Extension|set#field(self::Extension|get#field(let final self::Class* #t65 = c in #t65 == null ?{self::Class*} null : self::Extension|get#field(#t65)), #t63) in #t63);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|get#field(let final self::Class* #t66 = c in #t66 == null ?{self::Class*} null : self::Extension|get#field(#t66))));
+  let final self::Class* #t67 = c in #t67 == null ?{self::Class*} null : self::Extension|set#field(#t67, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class* #t68 = c in #t68 == null ?{self::Class*} null : let final self::Class* #t69 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t70 = self::Extension|set#field(#t68, #t69) in #t69;
+  let final self::Class* #t71 = c in #t71 == null ?{self::Class*} null : self::Extension|set#field(#t71, let final self::Class* #t72 = new self::Class::•() in let final void #t73 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t72) in #t72);
+  c = let final self::Class* #t74 = c in #t74 == null ?{self::Class*} null : let final self::Class* #t75 = let final self::Class* #t76 = new self::Class::•() in let final void #t77 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t76) in #t76 in let final void #t78 = self::Extension|set#field(#t74, #t75) in #t75;
+  let final self::Class* #t79 = c in #t79 == null ?{self::Class*} null : self::Extension|set#field(#t79, self::Extension|method(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class* #t80 = c in #t80 == null ?{self::Class*} null : let final self::Class* #t81 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t82 = self::Extension|set#field(#t80, #t81) in #t81;
+  self::throws(() → self::Class* => self::Extension|get#field(self::Extension|get#field(let final self::Class* #t83 = c in #t83 == null ?{self::Class*} null : self::Extension|method(#t83))));
+  self::throws(() → self::Class* => let final self::Class* #t84 = new self::Class::•() in let final void #t85 = self::Extension|set#field(self::Extension|get#field(let final self::Class* #t86 = c in #t86 == null ?{self::Class*} null : self::Extension|method(#t86)), #t84) in #t84);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|get#field(let final self::Class* #t87 = c in #t87 == null ?{self::Class*} null : self::Extension|method(#t87))));
+  self::throws(() → self::Class* => let final self::Class* #t88 = self::Extension|get#field(new self::Class::•()) in let final void #t89 = self::Extension|set#field(let final self::Class* #t90 = c in #t90 == null ?{self::Class*} null : self::Extension|get#field(#t90), #t88) in #t88);
+  self::throws(() → self::Class* => c = let final self::Class* #t91 = self::Extension|get#field(new self::Class::•()) in let final void #t92 = self::Extension|set#field(let final self::Class* #t93 = c in #t93 == null ?{self::Class*} null : self::Extension|get#field(#t93), #t91) in #t91);
+  self::throws(() → self::Class* => let final self::Class* #t94 = let final self::Class* #t95 = new self::Class::•() in let final void #t96 = self::Extension|set#field(new self::Class::•(), #t95) in #t95 in let final void #t97 = self::Extension|set#field(let final self::Class* #t98 = c in #t98 == null ?{self::Class*} null : self::Extension|get#field(#t98), #t94) in #t94);
+  self::throws(() → self::Class* => c = let final self::Class* #t99 = let final self::Class* #t100 = new self::Class::•() in let final void #t101 = self::Extension|set#field(new self::Class::•(), #t100) in #t100 in let final void #t102 = self::Extension|set#field(let final self::Class* #t103 = c in #t103 == null ?{self::Class*} null : self::Extension|get#field(#t103), #t99) in #t99);
+  self::throws(() → self::Class* => let final self::Class* #t104 = self::Extension|method(new self::Class::•()) in let final void #t105 = self::Extension|set#field(let final self::Class* #t106 = c in #t106 == null ?{self::Class*} null : self::Extension|get#field(#t106), #t104) in #t104);
+  self::throws(() → self::Class* => c = let final self::Class* #t107 = self::Extension|method(new self::Class::•()) in let final void #t108 = self::Extension|set#field(let final self::Class* #t109 = c in #t109 == null ?{self::Class*} null : self::Extension|get#field(#t109), #t107) in #t107);
+  let final self::Class* #t110 = c in #t110 == null ?{self::Class*} null : self::Extension|set#field(#t110, let final self::Class* #t111 = self::Extension|get#field(new self::Class::•()) in let final void #t112 = self::Extension|set#field(new self::Class::•(), #t111) in #t111);
+  c = let final self::Class* #t113 = c in #t113 == null ?{self::Class*} null : let final self::Class* #t114 = let final self::Class* #t115 = self::Extension|get#field(new self::Class::•()) in let final void #t116 = self::Extension|set#field(new self::Class::•(), #t115) in #t115 in let final void #t117 = self::Extension|set#field(#t113, #t114) in #t114;
+  let final self::Class* #t118 = c in #t118 == null ?{self::Class*} null : self::Extension|set#field(#t118, let final self::Class* #t119 = let final self::Class* #t120 = new self::Class::•() in let final void #t121 = self::Extension|set#field(new self::Class::•(), #t120) in #t120 in let final void #t122 = self::Extension|set#field(new self::Class::•(), #t119) in #t119);
+  c = let final self::Class* #t123 = c in #t123 == null ?{self::Class*} null : let final self::Class* #t124 = let final self::Class* #t125 = let final self::Class* #t126 = new self::Class::•() in let final void #t127 = self::Extension|set#field(new self::Class::•(), #t126) in #t126 in let final void #t128 = self::Extension|set#field(new self::Class::•(), #t125) in #t125 in let final void #t129 = self::Extension|set#field(#t123, #t124) in #t124;
+  let final self::Class* #t130 = c in #t130 == null ?{self::Class*} null : self::Extension|set#field(#t130, let final self::Class* #t131 = self::Extension|method(new self::Class::•()) in let final void #t132 = self::Extension|set#field(new self::Class::•(), #t131) in #t131);
+  c = let final self::Class* #t133 = c in #t133 == null ?{self::Class*} null : let final self::Class* #t134 = let final self::Class* #t135 = self::Extension|method(new self::Class::•()) in let final void #t136 = self::Extension|set#field(new self::Class::•(), #t135) in #t135 in let final void #t137 = self::Extension|set#field(#t133, #t134) in #t134;
+  self::throws(() → self::Class* => let final self::Class* #t138 = self::Extension|get#field(new self::Class::•()) in let final void #t139 = self::Extension|set#field(let final self::Class* #t140 = c in #t140 == null ?{self::Class*} null : self::Extension|method(#t140), #t138) in #t138);
+  self::throws(() → self::Class* => c = let final self::Class* #t141 = self::Extension|get#field(new self::Class::•()) in let final void #t142 = self::Extension|set#field(let final self::Class* #t143 = c in #t143 == null ?{self::Class*} null : self::Extension|method(#t143), #t141) in #t141);
+  self::throws(() → self::Class* => let final self::Class* #t144 = let final self::Class* #t145 = new self::Class::•() in let final void #t146 = self::Extension|set#field(new self::Class::•(), #t145) in #t145 in let final void #t147 = self::Extension|set#field(let final self::Class* #t148 = c in #t148 == null ?{self::Class*} null : self::Extension|method(#t148), #t144) in #t144);
+  self::throws(() → self::Class* => c = let final self::Class* #t149 = let final self::Class* #t150 = new self::Class::•() in let final void #t151 = self::Extension|set#field(new self::Class::•(), #t150) in #t150 in let final void #t152 = self::Extension|set#field(let final self::Class* #t153 = c in #t153 == null ?{self::Class*} null : self::Extension|method(#t153), #t149) in #t149);
+  self::throws(() → self::Class* => let final self::Class* #t154 = self::Extension|method(new self::Class::•()) in let final void #t155 = self::Extension|set#field(let final self::Class* #t156 = c in #t156 == null ?{self::Class*} null : self::Extension|method(#t156), #t154) in #t154);
+  self::throws(() → self::Class* => c = let final self::Class* #t157 = self::Extension|method(new self::Class::•()) in let final void #t158 = self::Extension|set#field(let final self::Class* #t159 = c in #t159 == null ?{self::Class*} null : self::Extension|method(#t159), #t157) in #t157);
+  self::throws(() → self::Class* => self::Extension|get#field(self::Extension|method(let final self::Class* #t160 = c in #t160 == null ?{self::Class*} null : self::Extension|get#field(#t160))));
+  self::throws(() → self::Class* => let final self::Class* #t161 = new self::Class::•() in let final void #t162 = self::Extension|set#field(self::Extension|method(let final self::Class* #t163 = c in #t163 == null ?{self::Class*} null : self::Extension|get#field(#t163)), #t161) in #t161);
+  self::throws(() → self::Class* => c = let final self::Class* #t164 = new self::Class::•() in let final void #t165 = self::Extension|set#field(self::Extension|method(let final self::Class* #t166 = c in #t166 == null ?{self::Class*} null : self::Extension|get#field(#t166)), #t164) in #t164);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|method(let final self::Class* #t167 = c in #t167 == null ?{self::Class*} null : self::Extension|get#field(#t167))));
+  let final self::Class* #t168 = c in #t168 == null ?{self::Class*} null : self::Extension|set#field(#t168, self::Extension|get#field(self::Extension|method(new self::Class::•())));
+  c = let final self::Class* #t169 = c in #t169 == null ?{self::Class*} null : let final self::Class* #t170 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t171 = self::Extension|set#field(#t169, #t170) in #t170;
+  let final self::Class* #t172 = c in #t172 == null ?{self::Class*} null : self::Extension|set#field(#t172, let final self::Class* #t173 = new self::Class::•() in let final void #t174 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t173) in #t173);
+  c = let final self::Class* #t175 = c in #t175 == null ?{self::Class*} null : let final self::Class* #t176 = let final self::Class* #t177 = new self::Class::•() in let final void #t178 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t177) in #t177 in let final void #t179 = self::Extension|set#field(#t175, #t176) in #t176;
+  let final self::Class* #t180 = c in #t180 == null ?{self::Class*} null : self::Extension|set#field(#t180, self::Extension|method(self::Extension|method(new self::Class::•())));
+  c = let final self::Class* #t181 = c in #t181 == null ?{self::Class*} null : let final self::Class* #t182 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t183 = self::Extension|set#field(#t181, #t182) in #t182;
+  self::throws(() → self::Class* => self::Extension|get#field(self::Extension|method(let final self::Class* #t184 = c in #t184 == null ?{self::Class*} null : self::Extension|method(#t184))));
+  self::throws(() → self::Class* => let final self::Class* #t185 = new self::Class::•() in let final void #t186 = self::Extension|set#field(self::Extension|method(let final self::Class* #t187 = c in #t187 == null ?{self::Class*} null : self::Extension|method(#t187)), #t185) in #t185);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|method(let final self::Class* #t188 = c in #t188 == null ?{self::Class*} null : self::Extension|method(#t188))));
+  let final self::Class* #t189 = let final self::Class* #t190 = c in #t190 == null ?{self::Class*} null : self::Extension|method(#t190) in #t189 == null ?{self::Class*} null : self::Extension|method(#t189);
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t191 = c in #t191 == null ?{self::Class*} null : self::Extension|get#field(#t191)));
+  let final self::Class* #t192 = let final self::Class* #t193 = c in #t193 == null ?{self::Class*} null : self::Extension|get#field(#t193) in #t192 == null ?{self::Class*} null : self::Extension|get#field(#t192);
+}
+static method indexAccess(self::Class* c) → void {
+  self::throws(() → self::Class* => self::Extension|[](let final self::Class* #t194 = c in #t194 == null ?{self::Class*} null : self::Extension|get#field(#t194), c));
+  self::throws(() → self::Class* => let final self::Class* #t195 = let final self::Class* #t196 = c in #t196 == null ?{self::Class*} null : self::Extension|get#field(#t196) in let final self::Class* #t197 = c in let final self::Class* #t198 = new self::Class::•() in let final void #t199 = self::Extension|[]=(#t195, #t197, #t198) in #t198);
+  self::throws(() → self::Class* => c = let final self::Class* #t200 = let final self::Class* #t201 = c in #t201 == null ?{self::Class*} null : self::Extension|get#field(#t201) in let final self::Class* #t202 = c in let final self::Class* #t203 = new self::Class::•() in let final void #t204 = self::Extension|[]=(#t200, #t202, #t203) in #t203);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|[](let final self::Class* #t205 = c in #t205 == null ?{self::Class*} null : self::Extension|get#field(#t205), c)));
+  self::throws(() → self::Class* => let final self::Class* #t206 = let final self::Class* #t207 = c in #t207 == null ?{self::Class*} null : self::Extension|get#field(#t207) in let final self::Class* #t208 = c in let final self::Class* #t209 = self::Extension|+(self::Extension|[](#t206, #t208), 0) in let final void #t210 = self::Extension|[]=(#t206, #t208, #t209) in #t209);
+  self::throws(() → self::Class* => c = let final self::Class* #t211 = let final self::Class* #t212 = c in #t212 == null ?{self::Class*} null : self::Extension|get#field(#t212) in let final self::Class* #t213 = c in let final self::Class* #t214 = self::Extension|+(self::Extension|[](#t211, #t213), 0) in let final void #t215 = self::Extension|[]=(#t211, #t213, #t214) in #t214);
+  self::throws(() → self::Class* => let final self::Class* #t216 = let final self::Class* #t217 = c in #t217 == null ?{self::Class*} null : self::Extension|get#field(#t217) in let final self::Class* #t218 = c in let final self::Class* #t219 = self::Extension|[](#t216, #t218) in let final void #t220 = self::Extension|[]=(#t216, #t218, self::Extension|+(#t219, 1)) in #t219);
+  self::throws(() → self::Class* => c = let final self::Class* #t221 = let final self::Class* #t222 = c in #t222 == null ?{self::Class*} null : self::Extension|get#field(#t222) in let final self::Class* #t223 = c in let final self::Class* #t224 = self::Extension|[](#t221, #t223) in let final void #t225 = self::Extension|[]=(#t221, #t223, self::Extension|+(#t224, 1)) in #t224);
+  self::throws(() → self::Class* => let final self::Class* #t226 = let final self::Class* #t227 = c in #t227 == null ?{self::Class*} null : self::Extension|get#field(#t227) in let final self::Class* #t228 = c in let final self::Class* #t229 = self::Extension|+(self::Extension|[](#t226, #t228), 1) in let final void #t230 = self::Extension|[]=(#t226, #t228, #t229) in #t229);
+  self::throws(() → self::Class* => c = let final self::Class* #t231 = let final self::Class* #t232 = c in #t232 == null ?{self::Class*} null : self::Extension|get#field(#t232) in let final self::Class* #t233 = c in let final self::Class* #t234 = self::Extension|+(self::Extension|[](#t231, #t233), 1) in let final void #t235 = self::Extension|[]=(#t231, #t233, #t234) in #t234);
+  self::throws(() → self::Class* => self::Extension|[](self::Extension|[](let final self::Class* #t236 = c in #t236 == null ?{self::Class*} null : self::Extension|get#field(#t236), c), c));
+  self::throws(() → self::Class* => let final self::Class* #t237 = self::Extension|[](let final self::Class* #t238 = c in #t238 == null ?{self::Class*} null : self::Extension|get#field(#t238), c) in let final self::Class* #t239 = c in let final self::Class* #t240 = new self::Class::•() in let final void #t241 = self::Extension|[]=(#t237, #t239, #t240) in #t240);
+  self::throws(() → self::Class* => c = let final self::Class* #t242 = self::Extension|[](let final self::Class* #t243 = c in #t243 == null ?{self::Class*} null : self::Extension|get#field(#t243), c) in let final self::Class* #t244 = c in let final self::Class* #t245 = new self::Class::•() in let final void #t246 = self::Extension|[]=(#t242, #t244, #t245) in #t245);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|[](self::Extension|[](let final self::Class* #t247 = c in #t247 == null ?{self::Class*} null : self::Extension|get#field(#t247), c), c)));
+  self::throws(() → self::Class* => let final self::Class* #t248 = self::Extension|[](let final self::Class* #t249 = c in #t249 == null ?{self::Class*} null : self::Extension|get#field(#t249), c) in let final self::Class* #t250 = c in let final self::Class* #t251 = self::Extension|+(self::Extension|[](#t248, #t250), 0) in let final void #t252 = self::Extension|[]=(#t248, #t250, #t251) in #t251);
+  self::throws(() → self::Class* => c = let final self::Class* #t253 = self::Extension|[](let final self::Class* #t254 = c in #t254 == null ?{self::Class*} null : self::Extension|get#field(#t254), c) in let final self::Class* #t255 = c in let final self::Class* #t256 = self::Extension|+(self::Extension|[](#t253, #t255), 0) in let final void #t257 = self::Extension|[]=(#t253, #t255, #t256) in #t256);
+  self::throws(() → self::Class* => let final self::Class* #t258 = self::Extension|[](let final self::Class* #t259 = c in #t259 == null ?{self::Class*} null : self::Extension|get#field(#t259), c) in let final self::Class* #t260 = c in let final self::Class* #t261 = self::Extension|[](#t258, #t260) in let final void #t262 = self::Extension|[]=(#t258, #t260, self::Extension|+(#t261, 1)) in #t261);
+  self::throws(() → self::Class* => c = let final self::Class* #t263 = self::Extension|[](let final self::Class* #t264 = c in #t264 == null ?{self::Class*} null : self::Extension|get#field(#t264), c) in let final self::Class* #t265 = c in let final self::Class* #t266 = self::Extension|[](#t263, #t265) in let final void #t267 = self::Extension|[]=(#t263, #t265, self::Extension|+(#t266, 1)) in #t266);
+  self::throws(() → self::Class* => let final self::Class* #t268 = self::Extension|[](let final self::Class* #t269 = c in #t269 == null ?{self::Class*} null : self::Extension|get#field(#t269), c) in let final self::Class* #t270 = c in let final self::Class* #t271 = self::Extension|+(self::Extension|[](#t268, #t270), 1) in let final void #t272 = self::Extension|[]=(#t268, #t270, #t271) in #t271);
+  self::throws(() → self::Class* => c = let final self::Class* #t273 = self::Extension|[](let final self::Class* #t274 = c in #t274 == null ?{self::Class*} null : self::Extension|get#field(#t274), c) in let final self::Class* #t275 = c in let final self::Class* #t276 = self::Extension|+(self::Extension|[](#t273, #t275), 1) in let final void #t277 = self::Extension|[]=(#t273, #t275, #t276) in #t276);
+}
+static method operatorAccess(self::Class* c) → void {
+  self::throws(() → self::Class* => self::Extension|+(let final self::Class* #t278 = c in #t278 == null ?{self::Class*} null : self::Extension|get#field(#t278), 0));
+  self::throws(() → self::Class* => self::Extension|unary-(let final self::Class* #t279 = c in #t279 == null ?{self::Class*} null : self::Extension|get#field(#t279)));
+  let final self::Class* #t280 = c in #t280 == null ?{self::Class*} null : self::Extension|set#field(#t280, self::Extension|+(self::Extension|get#field(#t280), 0));
+  c = let final self::Class* #t281 = c in #t281 == null ?{self::Class*} null : let final self::Class* #t282 = self::Extension|+(self::Extension|get#field(#t281), 0) in let final void #t283 = self::Extension|set#field(#t281, #t282) in #t282;
+  self::throws(() → self::Class* => let final self::Class* #t284 = let final self::Class* #t285 = c in #t285 == null ?{self::Class*} null : self::Extension|get#field(#t285) in let final self::Class* #t286 = self::Extension|+(self::Extension|get#field(#t284), 0) in let final void #t287 = self::Extension|set#field(#t284, #t286) in #t286);
+  self::throws(() → self::Class* => c = let final self::Class* #t288 = let final self::Class* #t289 = c in #t289 == null ?{self::Class*} null : self::Extension|get#field(#t289) in let final self::Class* #t290 = self::Extension|+(self::Extension|get#field(#t288), 0) in let final void #t291 = self::Extension|set#field(#t288, #t290) in #t290);
+  let final self::Class* #t292 = c in #t292 == null ?{self::Class*} null : self::Extension|set#field(#t292, self::Extension|+(self::Extension|get#field(#t292), 1));
+  c = let final self::Class* #t293 = c in #t293 == null ?{self::Class*} null : let final self::Class* #t294 = self::Extension|get#field(#t293) in let final self::Class* #t295 = let final self::Class* #t296 = self::Extension|+(#t294, 1) in let final void #t297 = self::Extension|set#field(#t293, #t296) in #t296 in #t294;
+  let final self::Class* #t298 = c in #t298 == null ?{self::Class*} null : let final self::Class* #t299 = self::Extension|+(self::Extension|get#field(#t298), 1) in let final void #t300 = self::Extension|set#field(#t298, #t299) in #t299;
+  c = let final self::Class* #t301 = c in #t301 == null ?{self::Class*} null : let final self::Class* #t302 = self::Extension|+(self::Extension|get#field(#t301), 1) in let final void #t303 = self::Extension|set#field(#t301, #t302) in #t302;
+}
+static method ifNull(self::Class* c) → void {
+  let final self::Class* #t304 = c in #t304 == null ?{self::Class*} null : self::Extension|get#field(#t304) == null ?{self::Class*} self::Extension|set#field(#t304, c) : null;
+  c = let final self::Class* #t305 = c in #t305 == null ?{self::Class*} null : let final self::Class* #t306 = self::Extension|get#field(#t305) in #t306 == null ?{self::Class*} let final self::Class* #t307 = c in let final void #t308 = self::Extension|set#field(#t305, #t307) in #t307 : #t306;
+  self::throws(() → self::Class* => let final self::Class* #t309 = let final self::Class* #t310 = c in #t310 == null ?{self::Class*} null : self::Extension|get#field(#t310) in let final self::Class* #t311 = self::Extension|get#field(#t309) in #t311 == null ?{self::Class*} let final self::Class* #t312 = c in let final void #t313 = self::Extension|set#field(#t309, #t312) in #t312 : #t311);
+  self::throws(() → self::Class* => c = let final self::Class* #t314 = let final self::Class* #t315 = c in #t315 == null ?{self::Class*} null : self::Extension|get#field(#t315) in let final self::Class* #t316 = self::Extension|get#field(#t314) in #t316 == null ?{self::Class*} let final self::Class* #t317 = c in let final void #t318 = self::Extension|set#field(#t314, #t317) in #t317 : #t316);
+  self::throws(() → self::Class* => let final self::Class* #t319 = let final self::Class* #t320 = c in #t320 == null ?{self::Class*} null : self::Extension|get#field(#t320) in let final self::Class* #t321 = c in let final self::Class* #t322 = self::Extension|[](#t319, #t321) in #t322 == null ?{self::Class*} let final self::Class* #t323 = c in let final void #t324 = self::Extension|[]=(#t319, #t321, #t323) in #t323 : #t322);
+  self::throws(() → self::Class* => c = let final self::Class* #t325 = let final self::Class* #t326 = c in #t326 == null ?{self::Class*} null : self::Extension|get#field(#t326) in let final self::Class* #t327 = c in let final self::Class* #t328 = self::Extension|[](#t325, #t327) in #t328 == null ?{self::Class*} let final self::Class* #t329 = c in let final void #t330 = self::Extension|[]=(#t325, #t327, #t329) in #t329 : #t328);
+}
+static method throws(() →* void f) → void {
+  try {
+    f(){() →* void};
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/no_null_shorting_extension.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/no_null_shorting_extension.dart.weak.modular.expect
new file mode 100644
index 0000000..ce52b2a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/no_null_shorting_extension.dart.weak.modular.expect
@@ -0,0 +1,178 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field self::Class* _field = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension Extension on self::Class* {
+  get field = self::Extension|get#field;
+  method method = self::Extension|method;
+  tearoff method = self::Extension|get#method;
+  operator [] = self::Extension|[];
+  operator []= = self::Extension|[]=;
+  operator + = self::Extension|+;
+  operator unary- = self::Extension|unary-;
+  set field = self::Extension|set#field;
+}
+static method Extension|get#field(lowered final self::Class* #this) → self::Class*
+  return #this.{self::Class::_field}{self::Class*};
+static method Extension|set#field(lowered final self::Class* #this, self::Class* value) → void {
+  #this.{self::Class::_field} = value;
+}
+static method Extension|method(lowered final self::Class* #this) → self::Class*
+  return self::Extension|get#field(#this);
+static method Extension|get#method(lowered final self::Class* #this) → () →* self::Class*
+  return () → self::Class* => self::Extension|method(#this);
+static method Extension|[](lowered final self::Class* #this, self::Class* key) → self::Class*
+  return self::Extension|get#field(#this);
+static method Extension|[]=(lowered final self::Class* #this, self::Class* key, self::Class* value) → void {
+  self::Extension|set#field(#this, value);
+}
+static method Extension|+(lowered final self::Class* #this, core::int* value) → self::Class*
+  return self::Extension|get#field(#this);
+static method Extension|unary-(lowered final self::Class* #this) → self::Class*
+  return self::Extension|get#field(#this);
+static method main() → dynamic {
+  self::propertyAccess(null);
+  self::indexAccess(null);
+  self::operatorAccess(null);
+  self::ifNull(null);
+}
+static method propertyAccess(self::Class* c) → void {
+  let final self::Class* #t1 = c in #t1 == null ?{self::Class*} null : self::Extension|get#field(#t1);
+  let final self::Class* #t2 = c in #t2 == null ?{self::Class*} null : self::Extension|set#field(#t2, new self::Class::•());
+  c = let final self::Class* #t3 = c in #t3 == null ?{self::Class*} null : let final self::Class* #t4 = new self::Class::•() in let final void #t5 = self::Extension|set#field(#t3, #t4) in #t4;
+  let final self::Class* #t6 = c in #t6 == null ?{self::Class*} null : self::Extension|method(#t6);
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t7 = c in #t7 == null ?{self::Class*} null : self::Extension|get#field(#t7)));
+  let final self::Class* #t8 = let final self::Class* #t9 = c in #t9 == null ?{self::Class*} null : self::Extension|get#field(#t9) in #t8 == null ?{self::Class*} null : self::Extension|get#field(#t8);
+  self::throws(() → self::Class* => let final self::Class* #t10 = self::Extension|get#field(let final self::Class* #t11 = c in #t11 == null ?{self::Class*} null : self::Extension|get#field(#t11)) in #t10 == null ?{self::Class*} null : self::Extension|get#field(#t10));
+  self::throws(() → self::Class* => let final self::Class* #t12 = new self::Class::•() in let final void #t13 = self::Extension|set#field(let final self::Class* #t14 = c in #t14 == null ?{self::Class*} null : self::Extension|get#field(#t14), #t12) in #t12);
+  let final self::Class* #t15 = let final self::Class* #t16 = c in #t16 == null ?{self::Class*} null : self::Extension|get#field(#t16) in #t15 == null ?{self::Class*} null : self::Extension|set#field(#t15, new self::Class::•());
+  self::throws(() → self::Class* => let final self::Class* #t17 = self::Extension|get#field(let final self::Class* #t18 = c in #t18 == null ?{self::Class*} null : self::Extension|get#field(#t18)) in #t17 == null ?{self::Class*} null : let final self::Class* #t19 = new self::Class::•() in let final void #t20 = self::Extension|set#field(#t17, #t19) in #t19);
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t21 = c in #t21 == null ?{self::Class*} null : self::Extension|get#field(#t21)));
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t22 = c in #t22 == null ?{self::Class*} null : let final self::Class* #t23 = new self::Class::•() in let final void #t24 = self::Extension|set#field(#t22, #t23) in #t23));
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t25 = c in #t25 == null ?{self::Class*} null : self::Extension|method(#t25)));
+  self::throws(() → self::Class* => c = let final self::Class* #t26 = new self::Class::•() in let final void #t27 = self::Extension|set#field(let final self::Class* #t28 = c in #t28 == null ?{self::Class*} null : self::Extension|get#field(#t28), #t26) in #t26);
+  c = let final self::Class* #t29 = let final self::Class* #t30 = c in #t30 == null ?{self::Class*} null : self::Extension|get#field(#t30) in #t29 == null ?{self::Class*} null : let final self::Class* #t31 = new self::Class::•() in let final void #t32 = self::Extension|set#field(#t29, #t31) in #t31;
+  self::throws(() → self::Class* => c = let final self::Class* #t33 = self::Extension|get#field(let final self::Class* #t34 = c in #t34 == null ?{self::Class*} null : self::Extension|get#field(#t34)) in #t33 == null ?{self::Class*} null : let final self::Class* #t35 = new self::Class::•() in let final void #t36 = self::Extension|set#field(#t33, #t35) in #t35);
+  self::throws(() → self::Class* => self::Extension|method(let final self::Class* #t37 = c in #t37 == null ?{self::Class*} null : self::Extension|get#field(#t37)));
+  let final self::Class* #t38 = c in #t38 == null ?{self::Class*} null : self::Extension|set#field(#t38, self::Extension|get#field(new self::Class::•()));
+  c = let final self::Class* #t39 = c in #t39 == null ?{self::Class*} null : let final self::Class* #t40 = self::Extension|get#field(new self::Class::•()) in let final void #t41 = self::Extension|set#field(#t39, #t40) in #t40;
+  let final self::Class* #t42 = c in #t42 == null ?{self::Class*} null : self::Extension|set#field(#t42, let final self::Class* #t43 = new self::Class::•() in let final void #t44 = self::Extension|set#field(new self::Class::•(), #t43) in #t43);
+  c = let final self::Class* #t45 = c in #t45 == null ?{self::Class*} null : let final self::Class* #t46 = let final self::Class* #t47 = new self::Class::•() in let final void #t48 = self::Extension|set#field(new self::Class::•(), #t47) in #t47 in let final void #t49 = self::Extension|set#field(#t45, #t46) in #t46;
+  let final self::Class* #t50 = c in #t50 == null ?{self::Class*} null : self::Extension|set#field(#t50, self::Extension|method(new self::Class::•()));
+  c = let final self::Class* #t51 = c in #t51 == null ?{self::Class*} null : let final self::Class* #t52 = self::Extension|method(new self::Class::•()) in let final void #t53 = self::Extension|set#field(#t51, #t52) in #t52;
+  self::throws(() → self::Class* => self::Extension|get#field(let final self::Class* #t54 = c in #t54 == null ?{self::Class*} null : self::Extension|method(#t54)));
+  self::throws(() → self::Class* => let final self::Class* #t55 = new self::Class::•() in let final void #t56 = self::Extension|set#field(let final self::Class* #t57 = c in #t57 == null ?{self::Class*} null : self::Extension|method(#t57), #t55) in #t55);
+  self::throws(() → self::Class* => self::Extension|method(let final self::Class* #t58 = c in #t58 == null ?{self::Class*} null : self::Extension|method(#t58)));
+  self::throws(() → self::Class* => self::Extension|get#field(self::Extension|get#field(let final self::Class* #t59 = c in #t59 == null ?{self::Class*} null : self::Extension|get#field(#t59))));
+  self::throws(() → self::Class* => let final self::Class* #t60 = new self::Class::•() in let final void #t61 = self::Extension|set#field(self::Extension|get#field(let final self::Class* #t62 = c in #t62 == null ?{self::Class*} null : self::Extension|get#field(#t62)), #t60) in #t60);
+  self::throws(() → self::Class* => c = let final self::Class* #t63 = new self::Class::•() in let final void #t64 = self::Extension|set#field(self::Extension|get#field(let final self::Class* #t65 = c in #t65 == null ?{self::Class*} null : self::Extension|get#field(#t65)), #t63) in #t63);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|get#field(let final self::Class* #t66 = c in #t66 == null ?{self::Class*} null : self::Extension|get#field(#t66))));
+  let final self::Class* #t67 = c in #t67 == null ?{self::Class*} null : self::Extension|set#field(#t67, self::Extension|get#field(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class* #t68 = c in #t68 == null ?{self::Class*} null : let final self::Class* #t69 = self::Extension|get#field(self::Extension|get#field(new self::Class::•())) in let final void #t70 = self::Extension|set#field(#t68, #t69) in #t69;
+  let final self::Class* #t71 = c in #t71 == null ?{self::Class*} null : self::Extension|set#field(#t71, let final self::Class* #t72 = new self::Class::•() in let final void #t73 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t72) in #t72);
+  c = let final self::Class* #t74 = c in #t74 == null ?{self::Class*} null : let final self::Class* #t75 = let final self::Class* #t76 = new self::Class::•() in let final void #t77 = self::Extension|set#field(self::Extension|get#field(new self::Class::•()), #t76) in #t76 in let final void #t78 = self::Extension|set#field(#t74, #t75) in #t75;
+  let final self::Class* #t79 = c in #t79 == null ?{self::Class*} null : self::Extension|set#field(#t79, self::Extension|method(self::Extension|get#field(new self::Class::•())));
+  c = let final self::Class* #t80 = c in #t80 == null ?{self::Class*} null : let final self::Class* #t81 = self::Extension|method(self::Extension|get#field(new self::Class::•())) in let final void #t82 = self::Extension|set#field(#t80, #t81) in #t81;
+  self::throws(() → self::Class* => self::Extension|get#field(self::Extension|get#field(let final self::Class* #t83 = c in #t83 == null ?{self::Class*} null : self::Extension|method(#t83))));
+  self::throws(() → self::Class* => let final self::Class* #t84 = new self::Class::•() in let final void #t85 = self::Extension|set#field(self::Extension|get#field(let final self::Class* #t86 = c in #t86 == null ?{self::Class*} null : self::Extension|method(#t86)), #t84) in #t84);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|get#field(let final self::Class* #t87 = c in #t87 == null ?{self::Class*} null : self::Extension|method(#t87))));
+  self::throws(() → self::Class* => let final self::Class* #t88 = self::Extension|get#field(new self::Class::•()) in let final void #t89 = self::Extension|set#field(let final self::Class* #t90 = c in #t90 == null ?{self::Class*} null : self::Extension|get#field(#t90), #t88) in #t88);
+  self::throws(() → self::Class* => c = let final self::Class* #t91 = self::Extension|get#field(new self::Class::•()) in let final void #t92 = self::Extension|set#field(let final self::Class* #t93 = c in #t93 == null ?{self::Class*} null : self::Extension|get#field(#t93), #t91) in #t91);
+  self::throws(() → self::Class* => let final self::Class* #t94 = let final self::Class* #t95 = new self::Class::•() in let final void #t96 = self::Extension|set#field(new self::Class::•(), #t95) in #t95 in let final void #t97 = self::Extension|set#field(let final self::Class* #t98 = c in #t98 == null ?{self::Class*} null : self::Extension|get#field(#t98), #t94) in #t94);
+  self::throws(() → self::Class* => c = let final self::Class* #t99 = let final self::Class* #t100 = new self::Class::•() in let final void #t101 = self::Extension|set#field(new self::Class::•(), #t100) in #t100 in let final void #t102 = self::Extension|set#field(let final self::Class* #t103 = c in #t103 == null ?{self::Class*} null : self::Extension|get#field(#t103), #t99) in #t99);
+  self::throws(() → self::Class* => let final self::Class* #t104 = self::Extension|method(new self::Class::•()) in let final void #t105 = self::Extension|set#field(let final self::Class* #t106 = c in #t106 == null ?{self::Class*} null : self::Extension|get#field(#t106), #t104) in #t104);
+  self::throws(() → self::Class* => c = let final self::Class* #t107 = self::Extension|method(new self::Class::•()) in let final void #t108 = self::Extension|set#field(let final self::Class* #t109 = c in #t109 == null ?{self::Class*} null : self::Extension|get#field(#t109), #t107) in #t107);
+  let final self::Class* #t110 = c in #t110 == null ?{self::Class*} null : self::Extension|set#field(#t110, let final self::Class* #t111 = self::Extension|get#field(new self::Class::•()) in let final void #t112 = self::Extension|set#field(new self::Class::•(), #t111) in #t111);
+  c = let final self::Class* #t113 = c in #t113 == null ?{self::Class*} null : let final self::Class* #t114 = let final self::Class* #t115 = self::Extension|get#field(new self::Class::•()) in let final void #t116 = self::Extension|set#field(new self::Class::•(), #t115) in #t115 in let final void #t117 = self::Extension|set#field(#t113, #t114) in #t114;
+  let final self::Class* #t118 = c in #t118 == null ?{self::Class*} null : self::Extension|set#field(#t118, let final self::Class* #t119 = let final self::Class* #t120 = new self::Class::•() in let final void #t121 = self::Extension|set#field(new self::Class::•(), #t120) in #t120 in let final void #t122 = self::Extension|set#field(new self::Class::•(), #t119) in #t119);
+  c = let final self::Class* #t123 = c in #t123 == null ?{self::Class*} null : let final self::Class* #t124 = let final self::Class* #t125 = let final self::Class* #t126 = new self::Class::•() in let final void #t127 = self::Extension|set#field(new self::Class::•(), #t126) in #t126 in let final void #t128 = self::Extension|set#field(new self::Class::•(), #t125) in #t125 in let final void #t129 = self::Extension|set#field(#t123, #t124) in #t124;
+  let final self::Class* #t130 = c in #t130 == null ?{self::Class*} null : self::Extension|set#field(#t130, let final self::Class* #t131 = self::Extension|method(new self::Class::•()) in let final void #t132 = self::Extension|set#field(new self::Class::•(), #t131) in #t131);
+  c = let final self::Class* #t133 = c in #t133 == null ?{self::Class*} null : let final self::Class* #t134 = let final self::Class* #t135 = self::Extension|method(new self::Class::•()) in let final void #t136 = self::Extension|set#field(new self::Class::•(), #t135) in #t135 in let final void #t137 = self::Extension|set#field(#t133, #t134) in #t134;
+  self::throws(() → self::Class* => let final self::Class* #t138 = self::Extension|get#field(new self::Class::•()) in let final void #t139 = self::Extension|set#field(let final self::Class* #t140 = c in #t140 == null ?{self::Class*} null : self::Extension|method(#t140), #t138) in #t138);
+  self::throws(() → self::Class* => c = let final self::Class* #t141 = self::Extension|get#field(new self::Class::•()) in let final void #t142 = self::Extension|set#field(let final self::Class* #t143 = c in #t143 == null ?{self::Class*} null : self::Extension|method(#t143), #t141) in #t141);
+  self::throws(() → self::Class* => let final self::Class* #t144 = let final self::Class* #t145 = new self::Class::•() in let final void #t146 = self::Extension|set#field(new self::Class::•(), #t145) in #t145 in let final void #t147 = self::Extension|set#field(let final self::Class* #t148 = c in #t148 == null ?{self::Class*} null : self::Extension|method(#t148), #t144) in #t144);
+  self::throws(() → self::Class* => c = let final self::Class* #t149 = let final self::Class* #t150 = new self::Class::•() in let final void #t151 = self::Extension|set#field(new self::Class::•(), #t150) in #t150 in let final void #t152 = self::Extension|set#field(let final self::Class* #t153 = c in #t153 == null ?{self::Class*} null : self::Extension|method(#t153), #t149) in #t149);
+  self::throws(() → self::Class* => let final self::Class* #t154 = self::Extension|method(new self::Class::•()) in let final void #t155 = self::Extension|set#field(let final self::Class* #t156 = c in #t156 == null ?{self::Class*} null : self::Extension|method(#t156), #t154) in #t154);
+  self::throws(() → self::Class* => c = let final self::Class* #t157 = self::Extension|method(new self::Class::•()) in let final void #t158 = self::Extension|set#field(let final self::Class* #t159 = c in #t159 == null ?{self::Class*} null : self::Extension|method(#t159), #t157) in #t157);
+  self::throws(() → self::Class* => self::Extension|get#field(self::Extension|method(let final self::Class* #t160 = c in #t160 == null ?{self::Class*} null : self::Extension|get#field(#t160))));
+  self::throws(() → self::Class* => let final self::Class* #t161 = new self::Class::•() in let final void #t162 = self::Extension|set#field(self::Extension|method(let final self::Class* #t163 = c in #t163 == null ?{self::Class*} null : self::Extension|get#field(#t163)), #t161) in #t161);
+  self::throws(() → self::Class* => c = let final self::Class* #t164 = new self::Class::•() in let final void #t165 = self::Extension|set#field(self::Extension|method(let final self::Class* #t166 = c in #t166 == null ?{self::Class*} null : self::Extension|get#field(#t166)), #t164) in #t164);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|method(let final self::Class* #t167 = c in #t167 == null ?{self::Class*} null : self::Extension|get#field(#t167))));
+  let final self::Class* #t168 = c in #t168 == null ?{self::Class*} null : self::Extension|set#field(#t168, self::Extension|get#field(self::Extension|method(new self::Class::•())));
+  c = let final self::Class* #t169 = c in #t169 == null ?{self::Class*} null : let final self::Class* #t170 = self::Extension|get#field(self::Extension|method(new self::Class::•())) in let final void #t171 = self::Extension|set#field(#t169, #t170) in #t170;
+  let final self::Class* #t172 = c in #t172 == null ?{self::Class*} null : self::Extension|set#field(#t172, let final self::Class* #t173 = new self::Class::•() in let final void #t174 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t173) in #t173);
+  c = let final self::Class* #t175 = c in #t175 == null ?{self::Class*} null : let final self::Class* #t176 = let final self::Class* #t177 = new self::Class::•() in let final void #t178 = self::Extension|set#field(self::Extension|method(new self::Class::•()), #t177) in #t177 in let final void #t179 = self::Extension|set#field(#t175, #t176) in #t176;
+  let final self::Class* #t180 = c in #t180 == null ?{self::Class*} null : self::Extension|set#field(#t180, self::Extension|method(self::Extension|method(new self::Class::•())));
+  c = let final self::Class* #t181 = c in #t181 == null ?{self::Class*} null : let final self::Class* #t182 = self::Extension|method(self::Extension|method(new self::Class::•())) in let final void #t183 = self::Extension|set#field(#t181, #t182) in #t182;
+  self::throws(() → self::Class* => self::Extension|get#field(self::Extension|method(let final self::Class* #t184 = c in #t184 == null ?{self::Class*} null : self::Extension|method(#t184))));
+  self::throws(() → self::Class* => let final self::Class* #t185 = new self::Class::•() in let final void #t186 = self::Extension|set#field(self::Extension|method(let final self::Class* #t187 = c in #t187 == null ?{self::Class*} null : self::Extension|method(#t187)), #t185) in #t185);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|method(let final self::Class* #t188 = c in #t188 == null ?{self::Class*} null : self::Extension|method(#t188))));
+  let final self::Class* #t189 = let final self::Class* #t190 = c in #t190 == null ?{self::Class*} null : self::Extension|method(#t190) in #t189 == null ?{self::Class*} null : self::Extension|method(#t189);
+}
+static method indexAccess(self::Class* c) → void {
+  self::throws(() → self::Class* => self::Extension|[](let final self::Class* #t191 = c in #t191 == null ?{self::Class*} null : self::Extension|get#field(#t191), c));
+  self::throws(() → self::Class* => let final self::Class* #t192 = let final self::Class* #t193 = c in #t193 == null ?{self::Class*} null : self::Extension|get#field(#t193) in let final self::Class* #t194 = c in let final self::Class* #t195 = new self::Class::•() in let final void #t196 = self::Extension|[]=(#t192, #t194, #t195) in #t195);
+  self::throws(() → self::Class* => c = let final self::Class* #t197 = let final self::Class* #t198 = c in #t198 == null ?{self::Class*} null : self::Extension|get#field(#t198) in let final self::Class* #t199 = c in let final self::Class* #t200 = new self::Class::•() in let final void #t201 = self::Extension|[]=(#t197, #t199, #t200) in #t200);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|[](let final self::Class* #t202 = c in #t202 == null ?{self::Class*} null : self::Extension|get#field(#t202), c)));
+  self::throws(() → self::Class* => let final self::Class* #t203 = let final self::Class* #t204 = c in #t204 == null ?{self::Class*} null : self::Extension|get#field(#t204) in let final self::Class* #t205 = c in let final self::Class* #t206 = self::Extension|+(self::Extension|[](#t203, #t205), 0) in let final void #t207 = self::Extension|[]=(#t203, #t205, #t206) in #t206);
+  self::throws(() → self::Class* => c = let final self::Class* #t208 = let final self::Class* #t209 = c in #t209 == null ?{self::Class*} null : self::Extension|get#field(#t209) in let final self::Class* #t210 = c in let final self::Class* #t211 = self::Extension|+(self::Extension|[](#t208, #t210), 0) in let final void #t212 = self::Extension|[]=(#t208, #t210, #t211) in #t211);
+  self::throws(() → self::Class* => let final self::Class* #t213 = let final self::Class* #t214 = c in #t214 == null ?{self::Class*} null : self::Extension|get#field(#t214) in let final self::Class* #t215 = c in let final self::Class* #t216 = self::Extension|[](#t213, #t215) in let final void #t217 = self::Extension|[]=(#t213, #t215, self::Extension|+(#t216, 1)) in #t216);
+  self::throws(() → self::Class* => c = let final self::Class* #t218 = let final self::Class* #t219 = c in #t219 == null ?{self::Class*} null : self::Extension|get#field(#t219) in let final self::Class* #t220 = c in let final self::Class* #t221 = self::Extension|[](#t218, #t220) in let final void #t222 = self::Extension|[]=(#t218, #t220, self::Extension|+(#t221, 1)) in #t221);
+  self::throws(() → self::Class* => let final self::Class* #t223 = let final self::Class* #t224 = c in #t224 == null ?{self::Class*} null : self::Extension|get#field(#t224) in let final self::Class* #t225 = c in let final self::Class* #t226 = self::Extension|+(self::Extension|[](#t223, #t225), 1) in let final void #t227 = self::Extension|[]=(#t223, #t225, #t226) in #t226);
+  self::throws(() → self::Class* => c = let final self::Class* #t228 = let final self::Class* #t229 = c in #t229 == null ?{self::Class*} null : self::Extension|get#field(#t229) in let final self::Class* #t230 = c in let final self::Class* #t231 = self::Extension|+(self::Extension|[](#t228, #t230), 1) in let final void #t232 = self::Extension|[]=(#t228, #t230, #t231) in #t231);
+  self::throws(() → self::Class* => self::Extension|[](self::Extension|[](let final self::Class* #t233 = c in #t233 == null ?{self::Class*} null : self::Extension|get#field(#t233), c), c));
+  self::throws(() → self::Class* => let final self::Class* #t234 = self::Extension|[](let final self::Class* #t235 = c in #t235 == null ?{self::Class*} null : self::Extension|get#field(#t235), c) in let final self::Class* #t236 = c in let final self::Class* #t237 = new self::Class::•() in let final void #t238 = self::Extension|[]=(#t234, #t236, #t237) in #t237);
+  self::throws(() → self::Class* => c = let final self::Class* #t239 = self::Extension|[](let final self::Class* #t240 = c in #t240 == null ?{self::Class*} null : self::Extension|get#field(#t240), c) in let final self::Class* #t241 = c in let final self::Class* #t242 = new self::Class::•() in let final void #t243 = self::Extension|[]=(#t239, #t241, #t242) in #t242);
+  self::throws(() → self::Class* => self::Extension|method(self::Extension|[](self::Extension|[](let final self::Class* #t244 = c in #t244 == null ?{self::Class*} null : self::Extension|get#field(#t244), c), c)));
+  self::throws(() → self::Class* => let final self::Class* #t245 = self::Extension|[](let final self::Class* #t246 = c in #t246 == null ?{self::Class*} null : self::Extension|get#field(#t246), c) in let final self::Class* #t247 = c in let final self::Class* #t248 = self::Extension|+(self::Extension|[](#t245, #t247), 0) in let final void #t249 = self::Extension|[]=(#t245, #t247, #t248) in #t248);
+  self::throws(() → self::Class* => c = let final self::Class* #t250 = self::Extension|[](let final self::Class* #t251 = c in #t251 == null ?{self::Class*} null : self::Extension|get#field(#t251), c) in let final self::Class* #t252 = c in let final self::Class* #t253 = self::Extension|+(self::Extension|[](#t250, #t252), 0) in let final void #t254 = self::Extension|[]=(#t250, #t252, #t253) in #t253);
+  self::throws(() → self::Class* => let final self::Class* #t255 = self::Extension|[](let final self::Class* #t256 = c in #t256 == null ?{self::Class*} null : self::Extension|get#field(#t256), c) in let final self::Class* #t257 = c in let final self::Class* #t258 = self::Extension|[](#t255, #t257) in let final void #t259 = self::Extension|[]=(#t255, #t257, self::Extension|+(#t258, 1)) in #t258);
+  self::throws(() → self::Class* => c = let final self::Class* #t260 = self::Extension|[](let final self::Class* #t261 = c in #t261 == null ?{self::Class*} null : self::Extension|get#field(#t261), c) in let final self::Class* #t262 = c in let final self::Class* #t263 = self::Extension|[](#t260, #t262) in let final void #t264 = self::Extension|[]=(#t260, #t262, self::Extension|+(#t263, 1)) in #t263);
+  self::throws(() → self::Class* => let final self::Class* #t265 = self::Extension|[](let final self::Class* #t266 = c in #t266 == null ?{self::Class*} null : self::Extension|get#field(#t266), c) in let final self::Class* #t267 = c in let final self::Class* #t268 = self::Extension|+(self::Extension|[](#t265, #t267), 1) in let final void #t269 = self::Extension|[]=(#t265, #t267, #t268) in #t268);
+  self::throws(() → self::Class* => c = let final self::Class* #t270 = self::Extension|[](let final self::Class* #t271 = c in #t271 == null ?{self::Class*} null : self::Extension|get#field(#t271), c) in let final self::Class* #t272 = c in let final self::Class* #t273 = self::Extension|+(self::Extension|[](#t270, #t272), 1) in let final void #t274 = self::Extension|[]=(#t270, #t272, #t273) in #t273);
+}
+static method operatorAccess(self::Class* c) → void {
+  self::throws(() → self::Class* => self::Extension|+(let final self::Class* #t275 = c in #t275 == null ?{self::Class*} null : self::Extension|get#field(#t275), 0));
+  self::throws(() → self::Class* => self::Extension|unary-(let final self::Class* #t276 = c in #t276 == null ?{self::Class*} null : self::Extension|get#field(#t276)));
+  let final self::Class* #t277 = c in #t277 == null ?{self::Class*} null : self::Extension|set#field(#t277, self::Extension|+(self::Extension|get#field(#t277), 0));
+  c = let final self::Class* #t278 = c in #t278 == null ?{self::Class*} null : let final self::Class* #t279 = self::Extension|+(self::Extension|get#field(#t278), 0) in let final void #t280 = self::Extension|set#field(#t278, #t279) in #t279;
+  self::throws(() → self::Class* => let final self::Class* #t281 = let final self::Class* #t282 = c in #t282 == null ?{self::Class*} null : self::Extension|get#field(#t282) in let final self::Class* #t283 = self::Extension|+(self::Extension|get#field(#t281), 0) in let final void #t284 = self::Extension|set#field(#t281, #t283) in #t283);
+  self::throws(() → self::Class* => c = let final self::Class* #t285 = let final self::Class* #t286 = c in #t286 == null ?{self::Class*} null : self::Extension|get#field(#t286) in let final self::Class* #t287 = self::Extension|+(self::Extension|get#field(#t285), 0) in let final void #t288 = self::Extension|set#field(#t285, #t287) in #t287);
+  let final self::Class* #t289 = c in #t289 == null ?{self::Class*} null : self::Extension|set#field(#t289, self::Extension|+(self::Extension|get#field(#t289), 1));
+  c = let final self::Class* #t290 = c in #t290 == null ?{self::Class*} null : let final self::Class* #t291 = self::Extension|get#field(#t290) in let final void #t292 = self::Extension|set#field(#t290, self::Extension|+(#t291, 1)) in #t291;
+  let final self::Class* #t293 = c in #t293 == null ?{self::Class*} null : let final self::Class* #t294 = self::Extension|+(self::Extension|get#field(#t293), 1) in let final void #t295 = self::Extension|set#field(#t293, #t294) in #t294;
+  c = let final self::Class* #t296 = c in #t296 == null ?{self::Class*} null : let final self::Class* #t297 = self::Extension|+(self::Extension|get#field(#t296), 1) in let final void #t298 = self::Extension|set#field(#t296, #t297) in #t297;
+}
+static method ifNull(self::Class* c) → void {
+  let final self::Class* #t299 = c in #t299 == null ?{self::Class*} null : self::Extension|get#field(#t299) == null ?{self::Class*} self::Extension|set#field(#t299, c) : null;
+  c = let final self::Class* #t300 = c in #t300 == null ?{self::Class*} null : let final self::Class* #t301 = self::Extension|get#field(#t300) in #t301 == null ?{self::Class*} let final self::Class* #t302 = c in let final void #t303 = self::Extension|set#field(#t300, #t302) in #t302 : #t301;
+  self::throws(() → self::Class* => let final self::Class* #t304 = let final self::Class* #t305 = c in #t305 == null ?{self::Class*} null : self::Extension|get#field(#t305) in let final self::Class* #t306 = self::Extension|get#field(#t304) in #t306 == null ?{self::Class*} let final self::Class* #t307 = c in let final void #t308 = self::Extension|set#field(#t304, #t307) in #t307 : #t306);
+  self::throws(() → self::Class* => c = let final self::Class* #t309 = let final self::Class* #t310 = c in #t310 == null ?{self::Class*} null : self::Extension|get#field(#t310) in let final self::Class* #t311 = self::Extension|get#field(#t309) in #t311 == null ?{self::Class*} let final self::Class* #t312 = c in let final void #t313 = self::Extension|set#field(#t309, #t312) in #t312 : #t311);
+  self::throws(() → self::Class* => let final self::Class* #t314 = let final self::Class* #t315 = c in #t315 == null ?{self::Class*} null : self::Extension|get#field(#t315) in let final self::Class* #t316 = c in let final self::Class* #t317 = self::Extension|[](#t314, #t316) in #t317 == null ?{self::Class*} let final self::Class* #t318 = c in let final void #t319 = self::Extension|[]=(#t314, #t316, #t318) in #t318 : #t317);
+  self::throws(() → self::Class* => c = let final self::Class* #t320 = let final self::Class* #t321 = c in #t321 == null ?{self::Class*} null : self::Extension|get#field(#t321) in let final self::Class* #t322 = c in let final self::Class* #t323 = self::Extension|[](#t320, #t322) in #t323 == null ?{self::Class*} let final self::Class* #t324 = c in let final void #t325 = self::Extension|[]=(#t320, #t322, #t324) in #t324 : #t323);
+}
+static method throws(() →* void f) → void {
+  try {
+    f(){() →* void};
+  }
+  on dynamic catch(final dynamic _) {
+    return;
+  }
+  throw "Expected exception.";
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..9262574
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/nsm_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,113 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "nsm_from_opt_in_lib.dart" as nsm;
+
+import "org-dartlang-testcase:///nsm_from_opt_in_lib.dart";
+
+abstract class A2 extends core::Object implements nsm::A {
+  synthetic constructor •() → self::A2*
+    : super core::Object::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation* invocation) → dynamic {
+    return super.{core::Object::noSuchMethod}(invocation);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  abstract member-signature method method(core::int* i) → core::int*; -> nsm::A::method
+  abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::A2::genericMethod1::T* t) → self::A2::genericMethod1::T*; -> nsm::A::genericMethod1
+  abstract member-signature method genericMethod2<T extends core::Object*>(self::A2::genericMethod2::T* t) → self::A2::genericMethod2::T*; -> nsm::A::genericMethod2
+  abstract member-signature method genericMethod3<T extends core::Object*>(self::A2::genericMethod3::T* t) → self::A2::genericMethod3::T*; -> nsm::A::genericMethod3
+}
+abstract class B2 extends nsm::A implements self::C2 {
+  synthetic constructor •() → self::B2*
+    : super nsm::A::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation* invocation) → dynamic {
+    return super.{core::Object::noSuchMethod}(invocation);
+  }
+  abstract member-signature method method(core::int* i, {dynamic optional = #C2}) → core::int*; -> self::C2::method
+  abstract member-signature method genericMethod1<T extends core::Object* = dynamic>(self::B2::genericMethod1::T* t) → self::B2::genericMethod1::T*; -> nsm::A::genericMethod1
+  abstract member-signature method genericMethod2<T extends core::Object*>(self::B2::genericMethod2::T* t) → self::B2::genericMethod2::T*; -> nsm::A::genericMethod2
+  abstract member-signature method genericMethod3<T extends core::Object*>(self::B2::genericMethod3::T* t) → self::B2::genericMethod3::T*; -> nsm::A::genericMethod3
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C2 extends core::Object {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  abstract method method(core::int* i, {dynamic optional = #C2}) → core::int*;
+  abstract method genericMethod1<T extends core::Object* = dynamic>(self::C2::genericMethod1::T* t) → self::C2::genericMethod1::T*;
+  abstract method genericMethod2<T extends core::Object*>(self::C2::genericMethod2::T* t) → self::C2::genericMethod2::T*;
+  abstract method genericMethod3<T extends core::Object*>(self::C2::genericMethod3::T* t) → self::C2::genericMethod3::T*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as nsm;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → nsm::A
+    : super core::Object::•()
+    ;
+  method method(core::int? i) → core::int
+    return let final core::int? #t1 = i in #t1 == null ?{core::int} 0 : #t1{core::int};
+  method genericMethod1<T extends core::Object? = dynamic>(nsm::A::genericMethod1::T% t) → nsm::A::genericMethod1::T%
+    return t;
+  method genericMethod2<T extends core::Object?>(nsm::A::genericMethod2::T% t) → nsm::A::genericMethod2::T%
+    return t;
+  method genericMethod3<T extends core::Object>(nsm::A::genericMethod3::T t) → nsm::A::genericMethod3::T
+    return t;
+}
+abstract class B1 extends nsm::A implements nsm::C1 {
+  synthetic constructor •() → nsm::B1
+    : super nsm::A::•()
+    ;
+  @#C1
+  method noSuchMethod(core::Invocation invocation) → dynamic {
+    return super.{core::Object::noSuchMethod}(invocation);
+  }
+  abstract member-signature method method(core::int? i, {dynamic optional = #C2}) → core::int; -> nsm::C1::method
+}
+abstract class C1 extends core::Object {
+  synthetic constructor •() → nsm::C1
+    : super core::Object::•()
+    ;
+  abstract method method(core::int? i, {dynamic optional = #C2}) → core::int;
+  abstract method genericMethod1<T extends core::Object? = dynamic>(nsm::C1::genericMethod1::T% t) → nsm::C1::genericMethod1::T%;
+  abstract method genericMethod2<T extends core::Object?>(nsm::C1::genericMethod2::T% t) → nsm::C1::genericMethod2::T%;
+  abstract method genericMethod3<T extends core::Object>(nsm::C1::genericMethod3::T t) → nsm::C1::genericMethod3::T;
+}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.modular.expect
new file mode 100644
index 0000000..46b2806
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart:7:4: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// int? i;
+//    ^
+// pkg/front_end/testcases/nnbd_mixed/null_safety_invalid_language_version.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.7
+// ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int? i;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/nullable_extension_on_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/nullable_extension_on_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..f4ebaa4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/nullable_extension_on_opt_out.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "nullable_extension_on_opt_out_lib.dart" as nul;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///nullable_extension_on_opt_out_lib.dart";
+
+extension _extension#0 on nul::A? {
+  get text = self::_extension#0|get#text;
+}
+static method _extension#0|get#text(lowered final nul::A? #this) → core::String
+  return "Lily was here";
+static method main() → void {
+  nul::A? a = null;
+  self::expect("Lily was here", self::_extension#0|get#text(a));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+
+library;
+import self as nul;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::String* text = "";
+  synthetic constructor •() → nul::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.modular.expect
new file mode 100644
index 0000000..e605bd9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_factory/main.dart.weak.modular.expect
@@ -0,0 +1,154 @@
+library;
+import self as self;
+import "opt_in_lib.dart" as opt;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_in_lib.dart";
+
+static method main() → dynamic {
+  new opt::Class1::_<core::Object*>();
+  new opt::Class1::_<core::Object*>();
+  #C1;
+  opt::Class1::fact<core::Object*>();
+  new opt::Class2::_<core::Object*>();
+  new opt::Class2::_<core::Object*>();
+  #C2;
+  opt::Class2::fact<core::Object*>();
+  new opt::Class3::_<core::String*>();
+  new opt::Class3::_<core::String*>();
+  #C3;
+  opt::Class3::fact<core::String*>();
+  new opt::Class4::_<dynamic>();
+  new opt::Class4::_<dynamic>();
+  #C4;
+  opt::Class4::fact<dynamic>();
+  new opt::Class5::_<dynamic>();
+  new opt::Class5::_<dynamic>();
+  #C5;
+  opt::Class5::fact<dynamic>();
+  opt::testOptIn();
+}
+
+library /*isNonNullableByDefault*/;
+import self as opt;
+import "dart:core" as core;
+
+class Class1<T extends core::Object?> extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C6, #C7]/*isLegacy*/;
+  const constructor _() → opt::Class1<opt::Class1::T%>
+    : super core::Object::•()
+    ;
+  static factory redirect<T extends core::Object?>() → opt::Class1<opt::Class1::redirect::T%>
+    return new opt::Class1::_<opt::Class1::redirect::T%>();
+  static factory constRedirect<T extends core::Object?>() → opt::Class1<opt::Class1::constRedirect::T%>
+    return new opt::Class1::_<opt::Class1::constRedirect::T%>();
+  static factory fact<T extends core::Object?>() → opt::Class1<opt::Class1::fact::T%>
+    return new opt::Class1::_<opt::Class1::fact::T%>();
+}
+class Class2<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C8, #C9]/*isLegacy*/;
+  const constructor _() → opt::Class2<opt::Class2::T>
+    : super core::Object::•()
+    ;
+  static factory redirect<T extends core::Object>() → opt::Class2<opt::Class2::redirect::T>
+    return new opt::Class2::_<opt::Class2::redirect::T>();
+  static factory constRedirect<T extends core::Object>() → opt::Class2<opt::Class2::constRedirect::T>
+    return new opt::Class2::_<opt::Class2::constRedirect::T>();
+  static factory fact<T extends core::Object>() → opt::Class2<opt::Class2::fact::T>
+    return new opt::Class2::_<opt::Class2::fact::T>();
+}
+class Class3<T extends core::String> extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C10, #C11]/*isLegacy*/;
+  const constructor _() → opt::Class3<opt::Class3::T>
+    : super core::Object::•()
+    ;
+  static factory redirect<T extends core::String>() → opt::Class3<opt::Class3::redirect::T>
+    return new opt::Class3::_<opt::Class3::redirect::T>();
+  static factory constRedirect<T extends core::String>() → opt::Class3<opt::Class3::constRedirect::T>
+    return new opt::Class3::_<opt::Class3::constRedirect::T>();
+  static factory fact<T extends core::String>() → opt::Class3<opt::Class3::fact::T>
+    return new opt::Class3::_<opt::Class3::fact::T>();
+}
+class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C12, #C13]/*isLegacy*/;
+  const constructor _() → opt::Class4<opt::Class4::T%>
+    : super core::Object::•()
+    ;
+  static factory redirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::redirect::T%>
+    return new opt::Class4::_<opt::Class4::redirect::T%>();
+  static factory constRedirect<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::constRedirect::T%>
+    return new opt::Class4::_<opt::Class4::constRedirect::T%>();
+  static factory fact<T extends core::Object? = dynamic>() → opt::Class4<opt::Class4::fact::T%>
+    return new opt::Class4::_<opt::Class4::fact::T%>();
+}
+class Class5<T extends dynamic> extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C14, #C15]/*isLegacy*/;
+  const constructor _() → opt::Class5<opt::Class5::T%>
+    : super core::Object::•()
+    ;
+  static factory redirect<T extends dynamic>() → opt::Class5<opt::Class5::redirect::T%>
+    return new opt::Class5::_<opt::Class5::redirect::T%>();
+  static factory constRedirect<T extends dynamic>() → opt::Class5<opt::Class5::constRedirect::T%>
+    return new opt::Class5::_<opt::Class5::constRedirect::T%>();
+  static factory fact<T extends dynamic>() → opt::Class5<opt::Class5::fact::T%>
+    return new opt::Class5::_<opt::Class5::fact::T%>();
+}
+static method testOptIn() → dynamic {
+  new opt::Class1::_<core::Object?>();
+  new opt::Class1::_<core::Object?>();
+  #C16;
+  opt::Class1::fact<core::Object?>();
+  new opt::Class2::_<core::Object>();
+  new opt::Class2::_<core::Object>();
+  #C2;
+  opt::Class2::fact<core::Object>();
+  new opt::Class3::_<core::String>();
+  new opt::Class3::_<core::String>();
+  #C3;
+  opt::Class3::fact<core::String>();
+  new opt::Class4::_<dynamic>();
+  new opt::Class4::_<dynamic>();
+  #C4;
+  opt::Class4::fact<dynamic>();
+  new opt::Class5::_<dynamic>();
+  new opt::Class5::_<dynamic>();
+  #C5;
+  opt::Class5::fact<dynamic>();
+}
+
+constants  {
+  #C1 = opt::Class1<core::Object*> {}
+  #C2 = opt::Class2<core::Object*> {}
+  #C3 = opt::Class3<core::String*> {}
+  #C4 = opt::Class4<dynamic> {}
+  #C5 = opt::Class5<dynamic> {}
+  #C6 = constructor-tearoff opt::Class1::redirect
+  #C7 = constructor-tearoff opt::Class1::constRedirect
+  #C8 = constructor-tearoff opt::Class2::redirect
+  #C9 = constructor-tearoff opt::Class2::constRedirect
+  #C10 = constructor-tearoff opt::Class3::redirect
+  #C11 = constructor-tearoff opt::Class3::constRedirect
+  #C12 = constructor-tearoff opt::Class4::redirect
+  #C13 = constructor-tearoff opt::Class4::constRedirect
+  #C14 = constructor-tearoff opt::Class5::redirect
+  #C15 = constructor-tearoff opt::Class5::constRedirect
+  #C16 = opt::Class1<core::Object?> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- Class1._ (from org-dartlang-testcase:///opt_in_lib.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Class2._ (from org-dartlang-testcase:///opt_in_lib.dart:18:9)
+- Class3._ (from org-dartlang-testcase:///opt_in_lib.dart:26:9)
+- Class4._ (from org-dartlang-testcase:///opt_in_lib.dart:34:9)
+- Class5._ (from org-dartlang-testcase:///opt_in_lib.dart:42:9)
+
+org-dartlang-testcase:///opt_in_lib.dart:
+- Class1._ (from org-dartlang-testcase:///opt_in_lib.dart:10:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- Class2._ (from org-dartlang-testcase:///opt_in_lib.dart:18:9)
+- Class3._ (from org-dartlang-testcase:///opt_in_lib.dart:26:9)
+- Class4._ (from org-dartlang-testcase:///opt_in_lib.dart:34:9)
+- Class5._ (from org-dartlang-testcase:///opt_in_lib.dart:42:9)
diff --git a/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.modular.expect
new file mode 100644
index 0000000..342dcae
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/object_bound_redirecting_factory/main.dart.weak.modular.expect
@@ -0,0 +1,101 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "opt_in_lib.dart" as opt;
+
+import "org-dartlang-testcase:///opt_in_lib.dart";
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class XToken extends opt::Token<core::Object*> /*hasConstConstructor*/  {
+  const constructor •() → self::XToken*
+    : super opt::Token::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static const field core::List<opt::P<core::Object*>*>* list = #C5;
+static const field opt::M* m = #C6;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as opt;
+import "dart:core" as core;
+
+class P<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
+  final field core::Object token;
+  const constructor _(core::Object token) → opt::P<opt::P::T>
+    : opt::P::token = token, super core::Object::•()
+    ;
+}
+class CP<T extends core::Object> extends opt::P<opt::CP::T> /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C7]/*isLegacy*/;
+  const constructor _(core::Object token) → opt::CP<opt::CP::T>
+    : super opt::P::_(token)
+    ;
+  static factory •<T extends core::Object>(core::Type type) → opt::CP<opt::CP::•::T>
+    return new opt::CP::_<opt::CP::•::T>(type);
+}
+class Token<T extends core::Object> extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → opt::Token<opt::Token::T>
+    : super core::Object::•()
+    ;
+}
+class VP<T extends core::Object> extends opt::P<opt::VP::T> /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C8]/*isLegacy*/;
+  const constructor _(core::Object token, opt::VP::T useValue) → opt::VP<opt::VP::T>
+    : super opt::P::_(token)
+    ;
+  static factory forToken<T extends core::Object>(opt::Token<opt::VP::forToken::T> token, opt::VP::forToken::T useValue) → opt::VP<opt::VP::forToken::T>
+    return new opt::VP::_<opt::VP::forToken::T>(token, useValue);
+}
+class M extends core::Object /*hasConstConstructor*/  {
+  final field core::List<opt::P<core::Object>> list;
+  const constructor •({core::List<opt::P<core::Object>> list = #C9}) → opt::M
+    : opt::M::list = list, super core::Object::•()
+    ;
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::Class*)
+  #C2 = opt::CP<core::Object*> {token:#C1}
+  #C3 = self::XToken {}
+  #C4 = opt::VP<core::Object*> {token:#C3}
+  #C5 = <opt::P<core::Object*>*>[#C2, #C4]
+  #C6 = opt::M {list:#C5}
+  #C7 = constructor-tearoff opt::CP::•
+  #C8 = constructor-tearoff opt::VP::forToken
+  #C9 = <opt::P<core::Object*>*>[]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- CP._ (from org-dartlang-testcase:///opt_in_lib.dart:14:9)
+- P._ (from org-dartlang-testcase:///opt_in_lib.dart:8:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- XToken. (from org-dartlang-testcase:///main.dart:12:9)
+- Token. (from org-dartlang-testcase:///opt_in_lib.dart:18:9)
+- VP._ (from org-dartlang-testcase:///opt_in_lib.dart:27:9)
+- M. (from org-dartlang-testcase:///opt_in_lib.dart:36:9)
diff --git a/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..6e0d3ce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/opt_out.dart.weak.modular.expect
@@ -0,0 +1,181 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out.dart:18:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///opt_out_lib.dart";
+
+typedef F = invalid-type;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  late field core::int field = 42;
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class B extends self::A<core::String?> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static field core::List<core::String?> l = <core::String?>[];
+static field core::String? s = null;
+static field core::String t = self::s!;
+late static field core::int field = 42;
+static method method(() →? void f, {required core::int a = #C1}) → void {}
+static method main() → dynamic {}
+static method noErrors() → dynamic {
+  late core::int local = 42;
+  core::String? s = null;
+  dynamic c;
+  let final dynamic #t1 = c in #t1 == null ?{dynamic} null : block {
+    #t1{dynamic}.f;
+  } =>#t1;
+  let final dynamic #t2 = c in #t2 == null ?{dynamic} null : #t2{dynamic}.[](0);
+}
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:18:25: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// class B extends A<String?> {}
+//                         ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:20:28: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// typedef F = void Function()?;
+//                            ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// List<String?> l = [];
+//            ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:23:7: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// String? s = null;
+//       ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:28:21: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// void method(void f()?, {int a}) {}
+//                     ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:24:10: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+// var t = s!;
+//          ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:32:14: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+//   List<String?> l = null;
+//              ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:33:9: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+//   String? s = null;
+//         ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:34:12: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+//   var t = s!;
+//            ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:36:6: Error: Expected an identifier, but got '.'.
+// Try inserting an identifier before '.'.
+//   c?..f;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:36:6: Error: Expected an identifier, but got ''.
+// Try inserting an identifier before ''.
+//   c?..f;
+//      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:37:5: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+//   c?[0];
+//     ^
+// pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:5:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.5
+// ^^^^^^^^^^^^
+//
+import self as self2;
+import "dart:core" as core;
+
+typedef F = () →? void;
+class A<T extends core::Object* = dynamic> extends core::Object {
+  field core::int* field = 42;
+  synthetic constructor •() → self2::A<self2::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self2::A<core::String*> {
+  synthetic constructor •() → self2::B*
+    : super self2::A::•()
+    ;
+}
+static field core::List<core::String?>* l = <core::String*>[];
+static field core::String? s = null;
+static field core::String* t = self2::s!;
+static field core::int* field = 42;
+static method method(() →* void f, {core::int* a = #C1}) → void {}
+static method errors() → dynamic {
+  core::int* local = 42;
+  core::List<core::String?>* l = null;
+  core::String? s = null;
+  core::String* t = s!;
+  dynamic c;
+  invalid-expression "pkg/front_end/testcases/nnbd_mixed/opt_out_lib.dart:36:6: Error: Expected an identifier, but got ''.
+Try inserting an identifier before ''.
+  c?..f;
+     ^"{<invalid>}.f;
+  let final dynamic #t3 = c in #t3 == null ?{dynamic} null : #t3{dynamic}.[](0);
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.modular.expect
new file mode 100644
index 0000000..54456fa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+class Class extends core::Object {
+  field core::Map<core::String*, core::Set<core::String*>*>* map = null;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  method method(core::String* node, core::Set<core::String*>* set) → core::List<core::String*>*
+    return set.{core::Set::add}(node){(core::String*) →* core::bool*} ?{core::List<core::String*>*} block {
+      final core::List<core::String*>* #t1 = <core::String*>[node];
+      final core::Iterable<core::String*>* #t2 = let final core::Iterable<core::String*>* #t3 = let final core::Set<core::String*>* #t4 = this.{self::Class::map}{core::Map<core::String*, core::Set<core::String*>*>*}.{core::Map::[]}(node){(core::Object*) →* core::Set<core::String*>*} in #t4 == null ?{core::Iterable<core::String*>*} null : #t4.{core::Iterable::expand}<core::String*>((core::String* node) → core::List<core::String*>* => this.{self::Class::method}(node, set){(core::String*, core::Set<core::String*>*) →* core::List<core::String*>*}){((core::String*) →* core::Iterable<core::String*>*) →* core::Iterable<core::String*>*} in #t3 == null ?{core::List<core::String*>*} null : #t3.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::String*>*};
+      if(!(#t2 == null))
+        #t1.{core::List::addAll}{Invariant}(#t2){(core::Iterable<core::String*>*) →* void};
+    } =>#t1 : <core::String*>[];
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main(dynamic args) → dynamic {
+  if(false)
+    new self::Class::•().{self::Class::method}("", block {
+      final core::Set<core::String*>* #t5 = col::LinkedHashSet::•<core::String*>();
+    } =>#t5){(core::String*, core::Set<core::String*>*) →* core::List<core::String*>*};
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.modular.expect
new file mode 100644
index 0000000..90a553a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/required_name_override.dart.weak.modular.expect
@@ -0,0 +1,71 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+//   void test_default({required int? i}) {}
+//                                    ^
+// pkg/front_end/testcases/nnbd_mixed/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+//   void test_default({int? i}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd_mixed/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+//   void test_nondefault({required int? i}) {}
+//                                       ^
+// pkg/front_end/testcases/nnbd_mixed/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+//   void test_nondefault({int? i = 1}) {}
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method test_default({core::int? i = #C1}) → void {}
+  method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+  synthetic constructor •() → self::A
+    : super self::B::•()
+    ;
+  method test_default({required core::int? i = #C1}) → void {}
+  method test_nondefault({required core::int? i = #C1}) → void {}
+  method test_legacy({required core::int? i = #C1}) → void {}
+  abstract member-signature operator /*isLegacy*/ ==(dynamic other) → core::bool*; -> core::Object::==
+}
+static method main() → dynamic {
+  new self::A::•().{self::A::test_default}(i: 1){({required i: core::int?}) → void};
+  new self::A::•().{self::A::test_nondefault}(i: 1){({required i: core::int?}) → void};
+  new self::A::•().{self::A::test_legacy}(i: 1){({required i: core::int?}) → void};
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → req::C*
+    : super core::Object::•()
+    ;
+  method test_legacy({core::int* i = #C1}) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = null
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/required_parameter_mixed_from_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/required_parameter_mixed_from_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..1d47863
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/required_parameter_mixed_from_opt_out.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "required_parameter_mixed_from_opt_out_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_parameter_mixed_from_opt_out_lib.dart";
+
+class Super extends core::Object {
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+  method method({required covariant-by-declaration core::int named = #C1}) → void {}
+}
+abstract class _Class&Super&Mixin = self::Super with req::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Super&Mixin
+    : super self::Super::•()
+    ;
+  forwarding-stub method /*isLegacy*/ method({covariant-by-declaration core::int* named = #C1}) → void
+    return super.{req::Mixin::method}(named: named);
+  abstract member-signature operator /*isLegacy*/ ==(dynamic other) → core::bool*; -> core::Object::==
+}
+class Class extends self::_Class&Super&Mixin {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Super&Mixin::•()
+    ;
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass
+    : super self::Class::•()
+    ;
+  method method({required covariant-by-declaration core::int named = #C1}) → void {}
+}
+static method main() → dynamic {}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+abstract class Mixin extends core::Object /*isMixinDeclaration*/  {
+  method method({core::int* named = #C1}) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/sink_hierarchy.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/sink_hierarchy.dart.weak.modular.expect
new file mode 100644
index 0000000..763dc92
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/sink_hierarchy.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class Sink<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Sink<self::Sink::T*>*
+    : super core::Object::•()
+    ;
+  abstract method close() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class EventSink<T extends core::Object* = dynamic> extends core::Object implements self::Sink<self::EventSink::T*> {
+  synthetic constructor •() → self::EventSink<self::EventSink::T*>*
+    : super core::Object::•()
+    ;
+  abstract method close() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class StreamConsumer<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::StreamConsumer<self::StreamConsumer::S*>*
+    : super core::Object::•()
+    ;
+  abstract method close() → asy::Future<dynamic>*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class StreamSink<S extends core::Object* = dynamic> extends core::Object implements self::EventSink<self::StreamSink::S*>, self::StreamConsumer<self::StreamSink::S*> {
+  synthetic constructor •() → self::StreamSink<self::StreamSink::S*>*
+    : super core::Object::•()
+    ;
+  abstract method close() → asy::Future<dynamic>*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.modular.expect
new file mode 100644
index 0000000..864208b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.dart.weak.modular.expect
@@ -0,0 +1,95 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib1.dart" as mai;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class _Class&Object&Mixin1<T extends core::Object* = dynamic> = core::Object with mai::Mixin1<self::_Class&Object&Mixin1::T*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class&Object&Mixin1<self::_Class&Object&Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Object&Mixin1&Mixin2<T extends core::Object* = dynamic> = self::_Class&Object&Mixin1<self::_Class&Object&Mixin1&Mixin2::T*> with mai::Mixin2<self::_Class&Object&Mixin1&Mixin2::T*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
+    : super self::_Class&Object&Mixin1::•()
+    ;
+  mixin-super-stub get field() → (dynamic) →* core::Type*
+    return super.{mai::Mixin2::field};
+  mixin-super-stub set field((dynamic) →* core::Type* value) → void
+    return super.{mai::Mixin2::field} = value;
+  mixin-super-stub method method1() → (dynamic) →* core::Type*
+    return super.{mai::Mixin2::method1}();
+  mixin-super-stub method method2((dynamic) →* core::Type* t) → void
+    return super.{mai::Mixin2::method2}(t);
+}
+class Class<T extends core::Object* = dynamic> extends self::_Class&Object&Mixin1&Mixin2<self::Class::T*> {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super self::_Class&Object&Mixin1&Mixin2::•()
+    ;
+  set field((dynamic) →* core::Type* value) → void {
+    super.{self::_Class&Object&Mixin1&Mixin2::field};
+    super.{self::_Class&Object&Mixin1&Mixin2::field} = value;
+    super.{self::_Class&Object&Mixin1&Mixin2::method1}();
+    super.{self::_Class&Object&Mixin1&Mixin2::method2}(null);
+  }
+}
+static method main() → dynamic {}
+
+library;
+import self as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class Mixin1<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  field (dynamic) →* core::Type* field = null;
+  synthetic constructor •() → mai::Mixin2<mai::Mixin2::T*>*
+    : super core::Object::•()
+    ;
+  method method1() → (dynamic) →* core::Type*
+    return null;
+  method method2((dynamic) →* core::Type* t) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.modular.expect
new file mode 100644
index 0000000..6bf247e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_access/main.no_link.dart.weak.modular.expect
@@ -0,0 +1,115 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "main_lib1.dart" as mai;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib1.dart";
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class _Class&Object&Mixin1<T extends core::Object* = dynamic> = core::Object with mai::Mixin1<self::_Class&Object&Mixin1::T*> /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_Class&Object&Mixin1<self::_Class&Object&Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Class&Object&Mixin1&Mixin2<T extends core::Object* = dynamic> = self::_Class&Object&Mixin1<self::_Class&Object&Mixin1&Mixin2::T*> with mai::Mixin2<self::_Class&Object&Mixin1&Mixin2::T*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Object&Mixin1&Mixin2<self::_Class&Object&Mixin1&Mixin2::T*>*
+    : super self::_Class&Object&Mixin1::•()
+    ;
+  mixin-super-stub get field() → (dynamic) →* core::Type*
+    return super.{mai::Mixin2::field};
+  mixin-super-stub set field((dynamic) →* core::Type* value) → void
+    return super.{mai::Mixin2::field} = value;
+  mixin-super-stub method method1() → (dynamic) →* core::Type*
+    return super.{mai::Mixin2::method1}();
+  mixin-super-stub method method2((dynamic) →* core::Type* t) → void
+    return super.{mai::Mixin2::method2}(t);
+}
+class Class<T extends core::Object* = dynamic> extends self::_Class&Object&Mixin1&Mixin2<self::Class::T*> {
+  synthetic constructor •() → self::Class<self::Class::T*>*
+    : super self::_Class&Object&Mixin1&Mixin2::•()
+    ;
+  set field((dynamic) →* core::Type* value) → void {
+    super.{self::_Class&Object&Mixin1&Mixin2::field};
+    super.{self::_Class&Object&Mixin1&Mixin2::field} = value;
+    super.{self::_Class&Object&Mixin1&Mixin2::method1}();
+    super.{self::_Class&Object&Mixin1&Mixin2::method2}(null);
+  }
+}
+static method main() → dynamic {}
+
+library;
+import self as mai;
+import "dart:core" as core;
+import "main_lib2.dart" as mai2;
+
+import "org-dartlang-testcase:///main_lib2.dart";
+
+abstract class Mixin1<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  synthetic constructor •() → mai::Mixin1<mai::Mixin1::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get field() → (core::Object*) →* core::Type*; -> mai2::Interface::field
+  abstract member-signature set field((core::Object*) →* core::Type* value) → void; -> mai2::Interface::field
+  abstract member-signature method method1() → (core::Object*) →* core::Type*; -> mai2::Interface::method1
+  abstract member-signature method method2((core::Object*) →* core::Type* t) → void; -> mai2::Interface::method2
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class Mixin2<T extends core::Object* = dynamic> extends core::Object implements mai2::Interface<mai2::Value<dynamic>*, core::Object*> {
+  field (dynamic) →* core::Type* field = null;
+  synthetic constructor •() → mai::Mixin2<mai::Mixin2::T*>*
+    : super core::Object::•()
+    ;
+  method method1() → (dynamic) →* core::Type*
+    return null;
+  method method2((dynamic) →* core::Type* t) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+library /*isNonNullableByDefault*/;
+import self as mai2;
+import "dart:core" as core;
+
+typedef Typedef<unrelated T extends mai2::Value<dynamic>, contravariant I extends core::Object? = dynamic> = (I%) → core::Type;
+abstract class Value<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → mai2::Value<mai2::Value::T%>
+    : super core::Object::•()
+    ;
+}
+class Interface<T extends mai2::Value<dynamic>, I extends core::Object? = dynamic> extends core::Object {
+  field (mai2::Interface::I%) →? core::Type field = null;
+  synthetic constructor •() → mai2::Interface<mai2::Interface::T, mai2::Interface::I%>
+    : super core::Object::•()
+    ;
+  method method1() → (mai2::Interface::I%) →? core::Type
+    return null;
+  method method2((mai2::Interface::I%) →? core::Type t) → void {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..c317528
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/super_set_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "super_set_from_opt_in_lib.dart" as sup;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///super_set_from_opt_in_lib.dart";
+
+abstract class Class extends sup::SuperClass<dynamic> {
+  synthetic constructor •() → self::Class*
+    : super sup::SuperClass::•()
+    ;
+  abstract member-signature get property() → core::Object*; -> sup::SuperClass::property
+  abstract member-signature set property(core::Object* value) → void; -> sup::SuperClass::property
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class SubClass extends self::Class {
+  synthetic constructor •() → self::SubClass*
+    : super self::Class::•()
+    ;
+  @#C1
+  set property(core::Object* value) → void {
+    super.{sup::SuperClass::property} = value;
+  }
+}
+static method main() → dynamic {
+  new self::SubClass::•().{self::SubClass::property} = null;
+}
+
+library /*isNonNullableByDefault*/;
+import self as sup;
+import "dart:core" as core;
+
+abstract class SuperClass<T extends core::Object? = dynamic> extends core::Object {
+  @#C1
+  field core::Object? property = null;
+  synthetic constructor •() → sup::SuperClass<sup::SuperClass::T%>
+    : super core::Object::•()
+    ;
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.modular.expect
new file mode 100644
index 0000000..726b3b6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/type_parameter_nullability.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "type_parameter_nullability_lib.dart" as typ;
+
+import "org-dartlang-testcase:///type_parameter_nullability_lib.dart";
+
+class C<T extends core::num?, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T%, self::C::S%, self::C::U%>
+    : super core::Object::•()
+    ;
+  method promoteNullable(covariant-by-class self::C::T? t) → void {
+    if(t is{ForNonNullableByDefault} core::int) {
+      t{self::C::T? & core::int /* '?' & '!' = '!' */};
+    }
+    if(t is{ForNonNullableByDefault} core::int?) {
+      t{self::C::T? & core::int? /* '?' & '?' = '?' */};
+    }
+  }
+  method nullableAsUndetermined(covariant-by-class self::C::S? s) → void {
+    s as{ForNonNullableByDefault} self::C::U%;
+  }
+}
+static method main() → dynamic {
+  self::C<core::num, core::num, core::num> c = new self::C::•<core::num, core::num, core::num>();
+  c.{self::C::promoteNullable}(null){(core::num?) → void};
+  c.{self::C::promoteNullable}(0){(core::num?) → void};
+  c.{self::C::nullableAsUndetermined}(null){(core::num?) → void};
+  c.{self::C::nullableAsUndetermined}(0){(core::num?) → void};
+  typ::D<core::num> d = new typ::D::•<core::num>();
+  d.{typ::D::promoteLegacy}(null){(core::num*) →* void};
+  d.{typ::D::promoteLegacy}(0){(core::num*) →* void};
+}
+
+library;
+import self as typ;
+import "dart:core" as core;
+
+class D<T extends core::num*> extends core::Object {
+  synthetic constructor •() → typ::D<typ::D::T*>*
+    : super core::Object::•()
+    ;
+  method promoteLegacy(covariant-by-class typ::D::T* t) → void {
+    if(t is core::int*) {
+      let final typ::D::T* & core::int* /* '*' & '*' = '*' */ #t1 = t{typ::D::T* & core::int* /* '*' & '*' = '*' */} in #t1 == null ?{core::bool*} null : #t1.{core::int::isEven}{core::bool*};
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/typedef_from_opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/typedef_from_opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..bebc221
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/typedef_from_opt_in.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "typedef_from_opt_in_lib.dart" as typ;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///typedef_from_opt_in_lib.dart";
+
+static method method1() → (typ::Request*) →* FutureOr<typ::Response*>*
+  return (typ::Request* r) → asy::Future<typ::Response*>* async => new typ::Response::•();
+static method method2() → (core::int*) →* core::int*
+  return (core::int* r) → core::int* => 0;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as typ;
+import "dart:core" as core;
+
+import "dart:async";
+
+typedef Handler = (typ::Request) → FutureOr<typ::Response>;
+typedef Typedef = (core::int?) → core::int;
+class Request extends core::Object {
+  synthetic constructor •() → typ::Request
+    : super core::Object::•()
+    ;
+}
+class Response extends core::Object {
+  synthetic constructor •() → typ::Response
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.modular.expect
new file mode 100644
index 0000000..5076108
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.modular.expect
@@ -0,0 +1,626 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "unsound_checks_lib.dart" as uns;
+
+import "org-dartlang-testcase:///unsound_checks_lib.dart";
+
+class OptOutClass1 extends core::Object {
+  synthetic constructor •() → self::OptOutClass1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class OptOutClass2 extends core::Object {
+  synthetic constructor •() → self::OptOutClass2*
+    : super core::Object::•()
+    ;
+  operator [](core::int* index) → core::int*
+    return index;
+  operator []=(core::int* index, core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class OptOutClass3 extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::OptOutClass3*
+    : self::OptOutClass3::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class OptOutSuperClass4 extends core::Object {
+  synthetic constructor •() → self::OptOutSuperClass4*
+    : super core::Object::•()
+    ;
+  operator [](core::int* index) → core::int*
+    return index;
+  operator []=(core::int* index, core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class OptOutClass4 extends self::OptOutSuperClass4 {
+  synthetic constructor •() → self::OptOutClass4*
+    : super self::OptOutSuperClass4::•()
+    ;
+  method method(core::int* i) → dynamic
+    return let final core::int* #t1 = i in let final core::int* #t2 = super.{self::OptOutSuperClass4::[]}(#t1) in #t2 == null ?{core::int*} let final core::int* #t3 = 42 in let final void #t4 = super.{self::OptOutSuperClass4::[]=}(#t1, #t3) in #t3 : #t2;
+  method methodForEffect(core::int* i) → dynamic {
+    let final core::int* #t5 = i in super.{self::OptOutSuperClass4::[]}(#t5) == null ?{core::int*} super.{self::OptOutSuperClass4::[]=}(#t5, 42) : null;
+  }
+}
+class OptOutClass5 extends core::Object {
+  field core::int* field;
+  constructor •(core::int* field) → self::OptOutClass5*
+    : self::OptOutClass5::field = field, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+extension OptOutExtension on self::OptOutClass1* {
+  operator [] = self::OptOutExtension|[];
+  operator []= = self::OptOutExtension|[]=;
+}
+static method isNullOptOut1(core::int* i) → dynamic
+  return i == null;
+static method isNotNullOptOut1(core::int* i) → dynamic
+  return !(i == null);
+static method isNullOptOut2(core::int* i) → dynamic
+  return i == null;
+static method isNotNullOptOut2(core::int* i) → dynamic
+  return !(i == null);
+static method ifNullOptOut(core::int* i) → dynamic
+  return let final core::int* #t6 = i in #t6 == null ?{core::int*} 42 : #t6;
+static method OptOutExtension|[](lowered final self::OptOutClass1* #this, core::int* index) → core::int*
+  return index;
+static method OptOutExtension|[]=(lowered final self::OptOutClass1* #this, core::int* index, core::int* value) → void {}
+static method extensionIfNullOptOut1(core::int* i) → dynamic
+  return let final self::OptOutClass1* #t7 = new self::OptOutClass1::•() in let final core::int* #t8 = i in let final core::int* #t9 = self::OptOutExtension|[](#t7, #t8) in #t9 == null ?{core::int*} let final core::int* #t10 = 42 in let final void #t11 = self::OptOutExtension|[]=(#t7, #t8, #t10) in #t10 : #t9;
+static method extensionIfNullOptOut1ForEffect(core::int* i) → dynamic {
+  let final self::OptOutClass1* #t12 = new self::OptOutClass1::•() in let final core::int* #t13 = i in self::OptOutExtension|[](#t12, #t13) == null ?{core::int*} self::OptOutExtension|[]=(#t12, #t13, 42) : null;
+}
+static method extensionIfNullOptOut2(core::int* i) → dynamic
+  return let final self::OptOutClass1* #t14 = new self::OptOutClass1::•() in let final core::int* #t15 = i in let final core::int* #t16 = self::OptOutExtension|[](#t14, #t15) in #t16 == null ?{core::int*} let final core::int* #t17 = 42 in let final void #t18 = self::OptOutExtension|[]=(#t14, #t15, #t17) in #t17 : #t16;
+static method extensionIfNullOptOut2ForEffect(core::int* i) → dynamic {
+  let final self::OptOutClass1* #t19 = new self::OptOutClass1::•() in let final core::int* #t20 = i in self::OptOutExtension|[](#t19, #t20) == null ?{core::int*} self::OptOutExtension|[]=(#t19, #t20, 42) : null;
+}
+static method ifNullIndexSetOptOut(core::int* i) → dynamic
+  return let final self::OptOutClass2* #t21 = new self::OptOutClass2::•() in let final core::int* #t22 = i in let final core::int* #t23 = #t21.{self::OptOutClass2::[]}(#t22){(core::int*) →* core::int*} in #t23 == null ?{core::int*} let final core::int* #t24 = 42 in let final void #t25 = #t21.{self::OptOutClass2::[]=}(#t22, #t24){(core::int*, core::int*) →* void} in #t24 : #t23;
+static method ifNullIndexSetOptOutForEffect(core::int* i) → dynamic {
+  let final self::OptOutClass2* #t26 = new self::OptOutClass2::•() in let final core::int* #t27 = i in #t26.{self::OptOutClass2::[]}(#t27){(core::int*) →* core::int*} == null ?{core::int*} #t26.{self::OptOutClass2::[]=}(#t27, 42){(core::int*, core::int*) →* void} : null;
+}
+static method ifNullPropertySetOptOut(core::int* i) → dynamic
+  return let final self::OptOutClass3* #t28 = new self::OptOutClass3::•(i) in let final core::int* #t29 = #t28.{self::OptOutClass3::field}{core::int*} in #t29 == null ?{core::int*} #t28.{self::OptOutClass3::field} = 42 : #t29;
+static method ifNullPropertySetOptOutForEffect(core::int* i) → dynamic {
+  let final self::OptOutClass3* #t30 = new self::OptOutClass3::•(i) in #t30.{self::OptOutClass3::field}{core::int*} == null ?{core::int*} #t30.{self::OptOutClass3::field} = 42 : null;
+}
+static method ifNullSetOptOut(core::int* i) → dynamic
+  return let final core::int* #t31 = i in #t31 == null ?{core::int*} i = 42 : #t31;
+static method ifNullSetOptOutForEffect(core::int* i) → dynamic {
+  i == null ?{core::int*} i = 42 : null;
+}
+static method ifNullSuperIndexSetOptOut(core::int* i) → dynamic
+  return new self::OptOutClass4::•().{self::OptOutClass4::method}(i){(core::int*) →* dynamic};
+static method ifNullSuperIndexSetOptOutForEffect(core::int* i) → dynamic {
+  new self::OptOutClass4::•().{self::OptOutClass4::methodForEffect}(i){(core::int*) →* dynamic};
+}
+static method nullAwareIfNullSetOptOut(core::int* i) → dynamic {
+  self::OptOutClass5* o = new self::OptOutClass5::•(i);
+  return let final self::OptOutClass5* #t32 = o in #t32 == null ?{core::int*} null : let final core::int* #t33 = #t32.{self::OptOutClass5::field}{core::int*} in #t33 == null ?{core::int*} #t32.{self::OptOutClass5::field} = 42 : #t33;
+}
+static method nullAwareIfNullSetOptOutForEffect(core::int* i) → dynamic {
+  self::OptOutClass5* o = new self::OptOutClass5::•(i);
+  let final self::OptOutClass5* #t34 = o in #t34 == null ?{core::int*} null : #t34.{self::OptOutClass5::field}{core::int*} == null ?{core::int*} #t34.{self::OptOutClass5::field} = 42 : null;
+}
+static method isTestOptOut(core::int* i) → dynamic
+  return i is core::int*;
+static method isNotTestOptOut(core::int* i) → dynamic
+  return !(i is core::int*);
+static method main() → dynamic {
+  self::expect(false, uns::isNullOptIn1(0));
+  self::expect(false, self::isNullOptOut1(0));
+  self::expect(true, uns::isNullOptIn1(null));
+  self::expect(true, self::isNullOptOut1(null));
+  self::expect(true, uns::isNotNullOptIn1(0));
+  self::expect(true, self::isNotNullOptOut1(0));
+  self::expect(false, uns::isNotNullOptIn1(null));
+  self::expect(false, self::isNotNullOptOut1(null));
+  self::expect(false, uns::isNullOptIn2(0));
+  self::expect(false, self::isNullOptOut2(0));
+  self::expect(true, uns::isNullOptIn2(null));
+  self::expect(true, self::isNullOptOut2(null));
+  self::expect(true, uns::isNotNullOptIn2(0));
+  self::expect(true, self::isNotNullOptOut2(0));
+  self::expect(false, uns::isNotNullOptIn2(null));
+  self::expect(false, self::isNotNullOptOut2(null));
+  self::expect(0, uns::ifNullOptIn(0));
+  self::expect(0, self::ifNullOptOut(0));
+  self::expect(42, uns::ifNullOptIn(null));
+  self::expect(42, self::ifNullOptOut(null));
+  self::expect(0, uns::extensionIfNullOptIn1(0));
+  self::expect(0, self::extensionIfNullOptOut1(0));
+  self::expect(42, uns::extensionIfNullOptIn1(null));
+  self::expect(42, self::extensionIfNullOptOut1(null));
+  uns::extensionIfNullOptIn1ForEffect(0);
+  self::extensionIfNullOptOut1ForEffect(0);
+  uns::extensionIfNullOptIn1ForEffect(null);
+  self::extensionIfNullOptOut1ForEffect(null);
+  self::expect(0, uns::extensionIfNullOptIn2(0));
+  self::expect(0, self::extensionIfNullOptOut2(0));
+  self::expect(42, uns::extensionIfNullOptIn2(null));
+  self::expect(42, self::extensionIfNullOptOut2(null));
+  uns::extensionIfNullOptIn2ForEffect(0);
+  self::extensionIfNullOptOut2ForEffect(0);
+  uns::extensionIfNullOptIn2ForEffect(null);
+  self::extensionIfNullOptOut2ForEffect(null);
+  self::expect(0, uns::ifNullIndexSetOptIn(0));
+  self::expect(0, self::ifNullIndexSetOptOut(0));
+  self::expect(42, uns::ifNullIndexSetOptIn(null));
+  self::expect(42, self::ifNullIndexSetOptOut(null));
+  uns::ifNullIndexSetOptInForEffect(0);
+  self::ifNullIndexSetOptOutForEffect(0);
+  uns::ifNullIndexSetOptInForEffect(null);
+  self::ifNullIndexSetOptOutForEffect(null);
+  self::expect(0, uns::ifNullPropertySetOptIn(0));
+  self::expect(0, self::ifNullPropertySetOptOut(0));
+  self::expect(42, uns::ifNullPropertySetOptIn(null));
+  self::expect(42, self::ifNullPropertySetOptOut(null));
+  uns::ifNullPropertySetOptInForEffect(0);
+  self::ifNullPropertySetOptOutForEffect(0);
+  uns::ifNullPropertySetOptInForEffect(null);
+  self::ifNullPropertySetOptOutForEffect(null);
+  self::expect(0, uns::ifNullSetOptIn(0));
+  self::expect(0, self::ifNullSetOptOut(0));
+  self::expect(42, uns::ifNullSetOptIn(null));
+  self::expect(42, self::ifNullSetOptOut(null));
+  uns::ifNullSetOptInForEffect(0);
+  self::ifNullSetOptOutForEffect(0);
+  uns::ifNullSetOptInForEffect(null);
+  self::ifNullSetOptOutForEffect(null);
+  self::expect(0, uns::ifNullSuperIndexSetOptIn(0));
+  self::expect(0, self::ifNullSuperIndexSetOptOut(0));
+  self::expect(42, uns::ifNullSuperIndexSetOptIn(null));
+  self::expect(42, self::ifNullSuperIndexSetOptOut(null));
+  uns::ifNullSuperIndexSetOptInForEffect(0);
+  self::ifNullSuperIndexSetOptOutForEffect(0);
+  uns::ifNullSuperIndexSetOptInForEffect(null);
+  self::ifNullSuperIndexSetOptOutForEffect(null);
+  self::expect(0, uns::nullAwareIfNullSetOptIn(0));
+  self::expect(0, self::nullAwareIfNullSetOptOut(0));
+  self::expect(42, uns::nullAwareIfNullSetOptIn(null));
+  self::expect(42, self::nullAwareIfNullSetOptOut(null));
+  uns::nullAwareIfNullSetOptInForEffect(0);
+  self::nullAwareIfNullSetOptOutForEffect(0);
+  uns::nullAwareIfNullSetOptInForEffect(null);
+  self::nullAwareIfNullSetOptOutForEffect(null);
+  self::expect(true, uns::isTestOptIn(0));
+  self::expect(true, self::isTestOptOut(0));
+  self::expect(false, uns::isTestOptIn(null));
+  self::expect(false, self::isTestOptOut(null));
+  self::expect(false, uns::isNotTestOptIn(0));
+  self::expect(false, self::isNotTestOptOut(0));
+  self::expect(true, uns::isNotTestOptIn(null));
+  self::expect(true, self::isNotTestOptOut(null));
+  self::expect(true, uns::nullAwareAccess1(0));
+  self::expect(null, uns::nullAwareAccess1(null));
+  uns::promotionToNever(0);
+  uns::promotionToNever(null);
+  uns::unnecessaryNullCheck(() → core::int* => 0);
+  uns::unnecessaryNullCheck(() → Null => null);
+  self::expect(0, uns::unnecessaryIfNull(() → core::int* => 0, () → core::int* => 42));
+  self::expect(42, uns::unnecessaryIfNull(() → Null => null, () → core::int* => 42));
+  uns::unnecessaryIfNullAssign(<core::int*>[0], () → core::int* => 42);
+  uns::unnecessaryIfNullAssign(<core::int*>[null], () → core::int* => 42);
+  uns::unnecessaryNullAwareAccess(() → core::int* => 0);
+  uns::unnecessaryNullAwareAccess(() → Null => null);
+  self::throws(() → dynamic => uns::callReturningNever(() → Null => throw "foo"), (core::Object* e) → core::bool* => e =={core::Object::==}{(core::Object*) →* core::bool*} "foo");
+  () →* Null f = () → Null => null;
+  self::throws(() → dynamic => uns::callReturningNever(f));
+  uns::switchOnEnum(#C3);
+  uns::switchOnEnum(#C6);
+  self::throws(() → dynamic => uns::switchOnEnum(null));
+  uns::switchOnEnumWithBreak(#C3);
+  uns::switchOnEnumWithBreak(#C6);
+  self::throws(() → dynamic => uns::switchOnEnumWithBreak(null));
+  uns::switchOnEnumWithFallThrough1(#C3);
+  uns::switchOnEnumWithFallThrough1(#C6);
+  self::throws(() → dynamic => uns::switchOnEnumWithFallThrough1(null));
+  uns::switchOnEnumWithFallThrough2(#C3);
+  uns::switchOnEnumWithFallThrough2(#C6);
+  self::throws(() → dynamic => uns::switchOnEnumWithFallThrough2(null));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() →* void f, [(core::Object*) →* core::bool* testException = #C7]) → dynamic {
+  try {
+    f(){() →* void};
+  }
+  on dynamic catch(final dynamic e) {
+    if(!(testException == null) && !testException(e){(core::Object*) →* core::bool*}) {
+      throw "Unexpected exception: ${e}";
+    }
+    core::print(e);
+    return;
+  }
+  throw "Missing exception.";
+}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:13:23: Warning: Operand of null-aware operation '??' has type 'int' which excludes null.
+// ifNullOptIn(int i) => i ?? 42;
+//                       ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:22:66: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+// extensionIfNullOptIn1(int i) => OptInExtension(new OptInClass1())[i] ??= 42;
+//                                                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:25:36: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   OptInExtension(new OptInClass1())[i] ??= 42;
+//                                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:28:50: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+// extensionIfNullOptIn2(int i) => new OptInClass1()[i] ??= 42;
+//                                                  ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:31:20: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   new OptInClass1()[i] ??= 42;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:39:48: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+// ifNullIndexSetOptIn(int i) => new OptInClass2()[i] ??= 42;
+//                                                ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:42:20: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   new OptInClass2()[i] ??= 42;
+//                    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:51:53: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+// ifNullPropertySetOptIn(int i) => new OptInClass3(i).field ??= 42;
+//                                                     ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:54:22: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   new OptInClass3(i).field ??= 42;
+//                      ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:57:26: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+// ifNullSetOptIn(int i) => i ??= 42;
+//                          ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:60:3: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   i ??= 42;
+//   ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:69:25: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   method(int i) => super[i] ??= 42;
+//                         ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:71:10: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//     super[i] ??= 42;
+//          ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:113:28: Warning: Operand of null-aware operation '?.' has type 'int' which excludes null.
+// nullAwareAccess1(int i) => i?.isEven;
+//                            ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:116:3: Warning: Operand of null-aware operation '?.' has type 'int' which excludes null.
+//   i?.isEven;
+//   ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:128:11: Warning: Operand of null-aware operation '??' has type 'int' which excludes null.
+//   return f() ??
+//           ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:134:4: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
+//   x[0] ??= f();
+//    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:138:4: Warning: Operand of null-aware operation '?.' has type 'int' which excludes null.
+//   f()?.gcd(0); // Should not throw if `f` returns null
+//    ^
+//
+// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:195:10: Error: Not enough type information to disambiguate between literal set and literal map.
+// Try providing type arguments for the literal explicitly to disambiguate it.
+//   return {...d}; // Should not throw ReachabilityError.
+//          ^
+//
+import self as uns;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class OptInClass1 extends core::Object {
+  synthetic constructor •() → uns::OptInClass1
+    : super core::Object::•()
+    ;
+}
+class OptInClass2 extends core::Object {
+  synthetic constructor •() → uns::OptInClass2
+    : super core::Object::•()
+    ;
+  operator [](core::int index) → core::int
+    return index;
+  operator []=(core::int index, core::int value) → void {}
+}
+class OptInClass3 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → uns::OptInClass3
+    : uns::OptInClass3::field = field, super core::Object::•()
+    ;
+}
+class OptInSuperClass4 extends core::Object {
+  synthetic constructor •() → uns::OptInSuperClass4
+    : super core::Object::•()
+    ;
+  operator [](core::int index) → core::int
+    return index;
+  operator []=(core::int index, core::int value) → void {}
+}
+class OptInClass4 extends uns::OptInSuperClass4 {
+  synthetic constructor •() → uns::OptInClass4
+    : super uns::OptInSuperClass4::•()
+    ;
+  method method(core::int i) → dynamic
+    return let final core::int #t35 = i in let final core::int #t36 = super.{uns::OptInSuperClass4::[]}(#t35) in #t36 == null ?{core::int} let final core::int #t37 = 42 in let final void #t38 = super.{uns::OptInSuperClass4::[]=}(#t35, #t37) in #t37 : #t36;
+  method methodForEffect(core::int i) → dynamic {
+    let final core::int #t39 = i in super.{uns::OptInSuperClass4::[]}(#t39) == null ?{core::int} super.{uns::OptInSuperClass4::[]=}(#t39, 42) : null;
+  }
+}
+class OptInClass5 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → uns::OptInClass5
+    : uns::OptInClass5::field = field, super core::Object::•()
+    ;
+}
+class OptInClass6a extends core::Object {
+  final field uns::OptInClass6b cls;
+  constructor •(uns::OptInClass6b cls) → uns::OptInClass6a
+    : uns::OptInClass6a::cls = cls, super core::Object::•()
+    ;
+}
+class OptInClass6b extends core::Object {
+  final field core::int field;
+  constructor •(core::int field) → uns::OptInClass6b
+    : uns::OptInClass6b::field = field, super core::Object::•()
+    ;
+}
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<uns::E> values = #C8;
+  static const field uns::E e1 = #C3;
+  static const field uns::E e2 = #C6;
+  const constructor •(core::int index, core::String name) → uns::E
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+}
+extension OptInExtension on uns::OptInClass1 {
+  operator [] = uns::OptInExtension|[];
+  operator []= = uns::OptInExtension|[]=;
+}
+static method isNullOptIn1(core::int i) → dynamic
+  return i == null;
+static method isNotNullOptIn1(core::int i) → dynamic
+  return !(i == null);
+static method isNullOptIn2(core::int i) → dynamic
+  return i == null;
+static method isNotNullOptIn2(core::int i) → dynamic
+  return !(i == null);
+static method ifNullOptIn(core::int i) → dynamic
+  return let final core::int #t40 = i in #t40 == null ?{core::int} 42 : #t40;
+static method OptInExtension|[](lowered final uns::OptInClass1 #this, core::int index) → core::int
+  return index;
+static method OptInExtension|[]=(lowered final uns::OptInClass1 #this, core::int index, core::int value) → void {}
+static method extensionIfNullOptIn1(core::int i) → dynamic
+  return let final uns::OptInClass1 #t41 = new uns::OptInClass1::•() in let final core::int #t42 = i in let final core::int #t43 = uns::OptInExtension|[](#t41, #t42) in #t43 == null ?{core::int} let final core::int #t44 = 42 in let final void #t45 = uns::OptInExtension|[]=(#t41, #t42, #t44) in #t44 : #t43;
+static method extensionIfNullOptIn1ForEffect(core::int i) → dynamic {
+  let final uns::OptInClass1 #t46 = new uns::OptInClass1::•() in let final core::int #t47 = i in uns::OptInExtension|[](#t46, #t47) == null ?{core::int} uns::OptInExtension|[]=(#t46, #t47, 42) : null;
+}
+static method extensionIfNullOptIn2(core::int i) → dynamic
+  return let final uns::OptInClass1 #t48 = new uns::OptInClass1::•() in let final core::int #t49 = i in let final core::int #t50 = uns::OptInExtension|[](#t48, #t49) in #t50 == null ?{core::int} let final core::int #t51 = 42 in let final void #t52 = uns::OptInExtension|[]=(#t48, #t49, #t51) in #t51 : #t50;
+static method extensionIfNullOptIn2ForEffect(core::int i) → dynamic {
+  let final uns::OptInClass1 #t53 = new uns::OptInClass1::•() in let final core::int #t54 = i in uns::OptInExtension|[](#t53, #t54) == null ?{core::int} uns::OptInExtension|[]=(#t53, #t54, 42) : null;
+}
+static method ifNullIndexSetOptIn(core::int i) → dynamic
+  return let final uns::OptInClass2 #t55 = new uns::OptInClass2::•() in let final core::int #t56 = i in let final core::int #t57 = #t55.{uns::OptInClass2::[]}(#t56){(core::int) → core::int} in #t57 == null ?{core::int} let final core::int #t58 = 42 in let final void #t59 = #t55.{uns::OptInClass2::[]=}(#t56, #t58){(core::int, core::int) → void} in #t58 : #t57;
+static method ifNullIndexSetOptInForEffect(core::int i) → dynamic {
+  let final uns::OptInClass2 #t60 = new uns::OptInClass2::•() in let final core::int #t61 = i in #t60.{uns::OptInClass2::[]}(#t61){(core::int) → core::int} == null ?{core::int} #t60.{uns::OptInClass2::[]=}(#t61, 42){(core::int, core::int) → void} : null;
+}
+static method ifNullPropertySetOptIn(core::int i) → dynamic
+  return let final uns::OptInClass3 #t62 = new uns::OptInClass3::•(i) in let final core::int #t63 = #t62.{uns::OptInClass3::field}{core::int} in #t63 == null ?{core::int} #t62.{uns::OptInClass3::field} = 42 : #t63;
+static method ifNullPropertySetOptInForEffect(core::int i) → dynamic {
+  let final uns::OptInClass3 #t64 = new uns::OptInClass3::•(i) in #t64.{uns::OptInClass3::field}{core::int} == null ?{core::int} #t64.{uns::OptInClass3::field} = 42 : null;
+}
+static method ifNullSetOptIn(core::int i) → dynamic
+  return let final core::int #t65 = i in #t65 == null ?{core::int} i = 42 : #t65;
+static method ifNullSetOptInForEffect(core::int i) → dynamic {
+  i == null ?{core::int} i = 42 : null;
+}
+static method ifNullSuperIndexSetOptIn(core::int i) → dynamic
+  return new uns::OptInClass4::•().{uns::OptInClass4::method}(i){(core::int) → dynamic};
+static method ifNullSuperIndexSetOptInForEffect(core::int i) → dynamic {
+  new uns::OptInClass4::•().{uns::OptInClass4::methodForEffect}(i){(core::int) → dynamic};
+}
+static method nullAwareIfNullSetOptIn(core::int i) → dynamic {
+  uns::OptInClass5? o = new uns::OptInClass5::•(i) as{ForNonNullableByDefault} uns::OptInClass5?;
+  return let final uns::OptInClass5? #t66 = o in #t66 == null ?{core::int?} null : let final core::int #t67 = #t66.{uns::OptInClass5::field}{core::int} in #t67 == null ?{core::int} #t66.{uns::OptInClass5::field} = 42 : #t67;
+}
+static method nullAwareIfNullSetOptInForEffect(core::int i) → dynamic {
+  uns::OptInClass5? o = new uns::OptInClass5::•(i) as{ForNonNullableByDefault} uns::OptInClass5?;
+  let final uns::OptInClass5? #t68 = o in #t68 == null ?{core::int?} null : #t68.{uns::OptInClass5::field}{core::int} == null ?{core::int} #t68.{uns::OptInClass5::field} = 42 : null;
+}
+static method isTestOptIn(core::int i) → dynamic
+  return i is{ForNonNullableByDefault} core::int;
+static method isNotTestOptIn(core::int i) → dynamic
+  return !(i is{ForNonNullableByDefault} core::int);
+static method nullAwareAccess1(core::int i) → dynamic
+  return let final core::int #t69 = i in #t69 == null ?{core::bool?} null : #t69.{core::int::isEven}{core::bool};
+static method nullAwareAccessForEffect1(core::int i) → dynamic {
+  let final core::int #t70 = i in #t70 == null ?{core::bool?} null : #t70.{core::int::isEven}{core::bool};
+}
+static method promotionToNever(core::int i) → dynamic {
+  if(i is{ForNonNullableByDefault} core::int)
+    return;
+}
+static method unnecessaryNullCheck(() → core::int f) → dynamic {
+  if(!(f(){() → core::int} == null))
+    return;
+}
+static method unnecessaryIfNull(() → core::int f, () → core::int g) → dynamic {
+  return let final core::int #t71 = f(){() → core::int} in #t71 == null ?{core::int} g(){() → core::int} : #t71;
+}
+static method unnecessaryIfNullAssign(core::List<core::int> x, () → core::int f) → dynamic {
+  let final core::List<core::int> #t72 = x in let final core::int #t73 = 0 in #t72.{core::List::[]}(#t73){(core::int) → core::int} == null ?{core::int} #t72.{core::List::[]=}(#t73, f(){() → core::int}){(core::int, core::int) → void} : null;
+}
+static method unnecessaryNullAwareAccess(() → core::int f) → dynamic {
+  let final core::int #t74 = f(){() → core::int} in #t74 == null ?{core::int?} null : #t74.{core::int::gcd}(0){(core::int) → core::int};
+}
+static method callReturningNever(() → Never f) → dynamic {
+  let final Never #t75 = f(){() → Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+}
+static method switchOnEnum(uns::E e) → dynamic {
+  switch(e) {
+    #L1:
+    case #C3:
+      {
+        return;
+      }
+    #L2:
+    case #C6:
+      {
+        return;
+      }
+    #L3:
+    default:
+      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
+  }
+}
+static method switchOnEnumWithBreak(uns::E e) → dynamic {
+  #L4:
+  switch(e) {
+    #L5:
+    case #C3:
+      {
+        break #L4;
+      }
+    #L6:
+    case #C6:
+      {
+        break #L4;
+      }
+    #L7:
+    default:
+      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
+  }
+}
+static method switchOnEnumWithFallThrough1(uns::E e) → dynamic {
+  #L8:
+  switch(e) {
+    #L9:
+    case #C3:
+      {
+        break #L8;
+      }
+    #L10:
+    case #C6:
+      {
+        break #L8;
+      }
+    #L11:
+    default:
+      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
+  }
+}
+static method switchOnEnumWithFallThrough2(uns::E e) → dynamic {
+  #L12:
+  switch(e) {
+    #L13:
+    case #C3:
+    case #C6:
+      {
+        break #L12;
+      }
+    #L14:
+    default:
+      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
+  }
+}
+static method handleThrow() → dynamic {
+  throw "";
+}
+static method handleRethrow() → dynamic {
+  try {
+    uns::handleThrow();
+  }
+  on core::Object catch(final core::Object _) {
+    rethrow;
+  }
+}
+static method handleInvalid(dynamic d) → dynamic {
+  return invalid-expression "pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:195:10: Error: Not enough type information to disambiguate between literal set and literal map.
+Try providing type arguments for the literal explicitly to disambiguate it.
+  return {...d}; // Should not throw ReachabilityError.
+         ^";
+}
+
+constants  {
+  #C1 = 0
+  #C2 = "e1"
+  #C3 = uns::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "e2"
+  #C6 = uns::E {index:#C4, _name:#C5}
+  #C7 = null
+  #C8 = <uns::E*>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unsound_checks_lib.dart:
+- E. (from org-dartlang-testcase:///unsound_checks_lib.dart:145:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.weak.modular.expect
new file mode 100644
index 0000000..8a70236
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  field core::int* foo = null;
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return "bar";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  no-such-method-forwarder set foo(core::int* value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method expectTypeError(() →* dynamic callback) → void {
+  try {
+    callback(){() →* dynamic};
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•();
+  self::expectTypeError(() → core::int* => a.{self::I::foo}{core::int*});
+  self::expectTypeError(() → core::String* => (a as dynamic){dynamic}.foo = "bar");
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.weak.modular.expect
new file mode 100644
index 0000000..c5739de
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.weak.modular.expect
@@ -0,0 +1,85 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    self::count = self::count.{core::num::+}(1){(core::num*) →* core::int*};
+    return null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  no-such-method-forwarder set foo(core::int* value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+abstract class _C&Object&B = core::Object with self::B /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_C&Object&B*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation* i) → dynamic
+    return super.{self::B::noSuchMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&B::•()
+    ;
+  get foo() → core::int*
+    return 42;
+  set foo(core::int* value) → void {}
+}
+static field core::int* count = 0;
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  if(!(c.{self::C::foo}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.{self::C::foo} = 43;
+  if(!(self::count =={core::num::==}{(core::Object*) →* core::bool*} 0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.weak.modular.expect
new file mode 100644
index 0000000..49adc6d
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get foo() → core::int*
+    return 42;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return "bar";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  no-such-method-forwarder set foo(core::int* value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic};
+}
+abstract class D extends core::Object implements self::A {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  set foo(core::int* value) → void {}
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return "bar";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C4, 1, #C2, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+}
+static method expectTypeError(() →* dynamic callback) → void {
+  try {
+    callback(){() →* dynamic};
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  self::expectTypeError(() → core::String* => (c as dynamic){dynamic}.foo = "bar");
+  self::E* e = new self::E::•();
+  self::expectTypeError(() → core::int* => e.{self::A::foo}{core::int*});
+}
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <core::Symbol*, dynamic>{)
+  #C4 = #foo
+  #C5 = <dynamic>[]
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.weak.modular.expect
new file mode 100644
index 0000000..aa77c05
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.weak.modular.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field core::List<self::A::X*>* foo = null;
+  synthetic constructor •() → self::A<self::A::X*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return <dynamic>[];
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder get foo() → core::List<core::int*>*
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::List<core::int*>*;
+  no-such-method-forwarder set foo(covariant-by-class core::List<core::int*>* value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method expectTypeError(() →* dynamic callback) → void {
+  try {
+    callback(){() →* dynamic};
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method main() → dynamic {
+  self::B* b = new self::B::•();
+  self::expectTypeError(() → core::List<core::int*>* => b.{self::A::foo}{core::List<core::int*>*});
+  self::expectTypeError(() → core::List<dynamic>* => (b as dynamic){dynamic}.foo = <dynamic>[]);
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.weak.modular.expect
new file mode 100644
index 0000000..06dbd87
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    return null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A implements self::I {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.weak.modular.expect
new file mode 100644
index 0000000..a135817
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_abstract_different_type.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  no-such-method-forwarder set push(core::int* x) → void
+    return this.{self::Base::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set float(covariant-by-declaration core::int* x) → void
+    return this.{self::Base::noSuchMethod}(new core::_InvocationMirror::_withType(#C4, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic};
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return core::print("${this.{self::Base::runtimeType}{core::Type*}}: ${i.{core::Invocation::positionalArguments}{core::List<dynamic>*}.{core::List::[]}(0){(core::int*) →* dynamic}}");
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Me extends self::Base {
+  synthetic constructor •() → self::Me*
+    : super self::Base::•()
+    ;
+}
+class You extends self::Base {
+  synthetic constructor •() → self::You*
+    : super self::Base::•()
+    ;
+  no-such-method-forwarder set push(core::num* x) → void
+    return this.{self::Base::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set float(covariant-by-declaration core::num* x) → void
+    return this.{self::Base::noSuchMethod}(new core::_InvocationMirror::_withType(#C4, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {
+  core::List<self::Base*>* list = <self::Base*>[new self::Me::•(), new self::You::•()];
+  for (self::Base* baba in list) {
+    baba.{self::Base::push} = 0;
+    baba.{self::Base::float} = 1;
+    if(baba is self::You*) {
+      baba{self::You*}.{self::You::push} = 2.3;
+      baba{self::You*}.{self::You::float} = 4.5;
+    }
+    try {
+      (baba as dynamic){dynamic}.push = 6.7;
+      baba is self::You* || (throw "Fail!");
+    }
+    on core::TypeError* catch(no-exception-var) {
+      baba is self::Me* || (throw "Fail!");
+    }
+    try {
+      (baba as dynamic){dynamic}.float = 8.9;
+      baba is self::You* || (throw "Fail!");
+    }
+    on core::TypeError* catch(no-exception-var) {
+      baba is self::Me* || (throw "Fail!");
+    }
+  }
+}
+
+constants  {
+  #C1 = #push=
+  #C2 = <core::Type*>[]
+  #C3 = <core::Symbol*, dynamic>{)
+  #C4 = #float=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.weak.modular.expect
new file mode 100644
index 0000000..819fb97
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_override_with_different_signature.dart.weak.modular.expect
@@ -0,0 +1,87 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Cat extends core::Object {
+  synthetic constructor •() → self::Cat*
+    : super core::Object::•()
+    ;
+  method eatFood(core::String* food) → core::bool*
+    return true;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class MockCat extends core::Object implements self::Cat {
+  synthetic constructor •() → self::MockCat*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* invocation) → dynamic {
+    dynamic arg = invocation.{core::Invocation::positionalArguments}{core::List<dynamic>*}.{core::List::[]}(0){(core::int*) →* dynamic};
+    return arg is core::String* && arg{core::String*}.{core::String::isNotEmpty}{core::bool*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method eatFood(core::String* food) → core::bool*
+    return this.{self::MockCat::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[food]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::bool*;
+}
+class MockCat2 extends self::MockCat {
+  synthetic constructor •() → self::MockCat2*
+    : super self::MockCat::•()
+    ;
+  abstract method noSuchMethod(core::Invocation* _) → dynamic;
+}
+class MockCat3 extends self::MockCat2 implements self::Cat {
+  synthetic constructor •() → self::MockCat3*
+    : super self::MockCat2::•()
+    ;
+  no-such-method-forwarder method eatFood(core::String* food, {core::double* amount = #C4}) → core::bool*
+    return this.{self::MockCat2::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[food]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C5: amount}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::bool*;
+}
+class MockCat4 extends self::MockCat2 implements self::HungryCat {
+  synthetic constructor •() → self::MockCat4*
+    : super self::MockCat2::•()
+    ;
+  no-such-method-forwarder method eatFood(core::String* food, {core::double* amount = #C4, core::double* yetAnother = #C4}) → core::bool*
+    return this.{self::MockCat2::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[food]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C5: amount, #C6: yetAnother}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::bool*;
+}
+abstract class HungryCat extends core::Object {
+  synthetic constructor •() → self::HungryCat*
+    : super core::Object::•()
+    ;
+  abstract method eatFood(core::String* food, {core::double* amount = #C4, core::double* yetAnother = #C4}) → core::bool*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #eatFood
+  #C2 = <core::Type*>[]
+  #C3 = <core::Symbol*, dynamic>{)
+  #C4 = null
+  #C5 = #amount
+  #C6 = #yetAnother
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.weak.modular.expect
new file mode 100644
index 0000000..701d4d2
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method foo() → dynamic;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::I {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method foo() → dynamic
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} dynamic;
+}
+abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&A&B*
+    : super self::A::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation* _) → dynamic
+    return super.{self::B::noSuchMethod}(_);
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → self::C*
+    : super self::_C&A&B::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.weak.modular.expect
new file mode 100644
index 0000000..bde35bd
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    if(i.{core::Invocation::memberName}{core::Symbol*} =={core::Symbol::==}{(core::Object*) →* core::bool*} #C1) {
+      return i.{core::Invocation::namedArguments}{core::Map<core::Symbol*, dynamic>*}.{core::Map::[]}(#C2){(core::Object*) →* dynamic};
+    }
+    else
+      if(i.{core::Invocation::memberName}{core::Symbol*} =={core::Symbol::==}{(core::Object*) →* core::bool*} #C3) {
+        return i.{core::Invocation::positionalArguments}{core::List<dynamic>*}.{core::List::[]}(0){(core::int*) →* dynamic};
+      }
+    return null;
+  }
+  abstract method foo({core::String* bar = #C4}) → core::String*;
+  abstract method hest([core::int* fisk = #C5]) → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  no-such-method-forwarder method foo({core::String* bar = #C4}) → core::String*
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C6, #C7, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C2: bar}))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::String*;
+  no-such-method-forwarder method hest([core::int* fisk = #C5]) → core::int*
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C3, 0, #C6, core::List::unmodifiable<dynamic>(<dynamic>[fisk]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C8))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {
+  self::B* b = new self::B::•();
+  dynamic value;
+  if(!((value = b.{self::A::foo}(){({bar: core::String*}) →* core::String*}) =={core::String::==}{(core::Object*) →* core::bool*} "baz")) {
+    throw "Unexpected value: '${value}'; expected 'baz'.";
+  }
+  if(!((value = b.{self::A::hest}(){([core::int*]) →* core::int*}) =={core::num::==}{(core::Object*) →* core::bool*} 42)) {
+    throw "Unexpected value: '${value}'; expected '42'.";
+  }
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = #bar
+  #C3 = #hest
+  #C4 = "baz"
+  #C5 = 42
+  #C6 = <core::Type*>[]
+  #C7 = <dynamic>[]
+  #C8 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.weak.modular.expect
new file mode 100644
index 0000000..d8b80bb
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I1 extends core::Object {
+  synthetic constructor •() → self::I1*
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I2 extends core::Object {
+  synthetic constructor •() → self::I2*
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object implements self::I1, self::I2 {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method foo() → void
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.weak.modular.expect
new file mode 100644
index 0000000..9966f87
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarder_propagation.dart.weak.modular.expect
@@ -0,0 +1,123 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "forwarder_propagation_lib.dart" as for;
+
+import "org-dartlang-testcase:///forwarder_propagation_lib.dart";
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int* value) → void;
+  abstract get bar() → core::int*;
+  abstract method baz(core::int* x, {core::String* y = #C1, core::double* z = #C1}) → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder get bar() → core::int*
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  no-such-method-forwarder method baz(core::int* x, {core::String* y = #C1, core::double* z = #C1}) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C7: y, #C8: z}))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set foo(core::int* value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+class E extends core::Object implements for::D {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder get /* from org-dartlang-testcase:///forwarder_propagation_lib.dart */ _privateGetter() → core::int*
+    return this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///forwarder_propagation_lib.dart */ _privateField() → core::int*
+    return this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+  no-such-method-forwarder method /* from org-dartlang-testcase:///forwarder_propagation_lib.dart */ _privateMethod() → void
+    return this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C12, 0, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set /* from org-dartlang-testcase:///forwarder_propagation_lib.dart */ _privateSetter(core::int* value) → void
+    return this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C13, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+  no-such-method-forwarder set /* from org-dartlang-testcase:///forwarder_propagation_lib.dart */ _privateField(core::int* value) → void
+    return this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C14, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation*) →* dynamic};
+}
+class F extends self::E {
+  synthetic constructor •() → self::F*
+    : super self::E::•()
+    ;
+}
+static method main() → dynamic {}
+
+library;
+import self as for;
+import "dart:core" as core;
+
+abstract class D extends core::Object {
+  field core::int* _privateField = null;
+  synthetic constructor •() → for::D*
+    : super core::Object::•()
+    ;
+  abstract get _privateGetter() → core::int*;
+  abstract set _privateSetter(core::int* value) → void;
+  abstract method _privateMethod() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = null
+  #C2 = #bar
+  #C3 = <core::Type*>[]
+  #C4 = <dynamic>[]
+  #C5 = <core::Symbol*, dynamic>{)
+  #C6 = #baz
+  #C7 = #y
+  #C8 = #z
+  #C9 = #foo=
+  #C10 = #org-dartlang-testcase:///forwarder_propagation.dart::_privateGetter
+  #C11 = #org-dartlang-testcase:///forwarder_propagation.dart::_privateField
+  #C12 = #org-dartlang-testcase:///forwarder_propagation.dart::_privateMethod
+  #C13 = #org-dartlang-testcase:///forwarder_propagation.dart::_privateSetter=
+  #C14 = #org-dartlang-testcase:///forwarder_propagation.dart::_privateField=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..ae8492b
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+abstract class _B&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_B&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation* i) → dynamic
+    return super.{self::A::noSuchMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::_B&Object&A {
+  synthetic constructor •() → self::B*
+    : super self::_B&Object&A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::_B&Object&A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.weak.modular.expect
new file mode 100644
index 0000000..fc7e726
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    return null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method foo() → void {}
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A implements self::I {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.weak.modular.expect
new file mode 100644
index 0000000..6d19094
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.weak.modular.expect
@@ -0,0 +1,92 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → void
+    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&M = core::Object with self::M /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation* i) → dynamic
+    return super.{self::M::noSuchMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends self::_A&Object&M implements self::I {
+  synthetic constructor •() → self::A*
+    : super self::_A&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::_A&Object&M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+abstract class _B&Object&M = core::Object with self::M /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_B&Object&M*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation* i) → dynamic
+    return super.{self::M::noSuchMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::_B&Object&M implements self::I {
+  synthetic constructor •() → self::B*
+    : super self::_B&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::_B&Object&M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.weak.modular.expect
new file mode 100644
index 0000000..8c67697
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.weak.modular.expect
@@ -0,0 +1,87 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  set foo(core::int* value) → void {}
+  get bar() → core::int*
+    return null;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  set foo(core::double* value) → void {}
+  get bar() → core::double*
+    return null;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set foo(core::num* value) → void {}
+  get bar() → Null
+    return null;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object implements self::C, self::A, self::B {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+  no-such-method-forwarder get bar() → Null
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} Null;
+  no-such-method-forwarder set foo(core::num* value) → void
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #bar
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.weak.modular.expect
new file mode 100644
index 0000000..d2fa4dd
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return null;
+  abstract method foo() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.weak.modular.expect
new file mode 100644
index 0000000..c2f527e
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return null;
+  abstract method foo() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.weak.modular.expect
new file mode 100644
index 0000000..fadd73d
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends self::M {
+  synthetic constructor •() → self::A*
+    : super self::M::•()
+    ;
+  no-such-method-forwarder method call(core::String* s) → void
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[s]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #call
+  #C2 = <core::Type*>[]
+  #C3 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.weak.modular.expect
new file mode 100644
index 0000000..a59d331
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    return null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _B&Object&A = core::Object with self::A /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_B&Object&A*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation* i) → dynamic
+    return super.{self::A::noSuchMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::_B&Object&A {
+  synthetic constructor •() → self::B*
+    : super self::_B&Object&A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::_B&Object&A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.weak.modular.expect
new file mode 100644
index 0000000..00429c3
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library private;
+import self as self;
+import "dart:core" as core;
+import "private_module.dart" as pri;
+
+import "org-dartlang-testcase:///private_module.dart" show Fisk;
+
+abstract class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return 42;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends self::Foo implements pri::Fisk {
+  synthetic constructor •() → self::Bar*
+    : super self::Foo::•()
+    ;
+  no-such-method-forwarder method /* from org-dartlang-testcase:///private_module.dart */ _hest() → void
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+class Baz extends self::Foo implements pri::Fisk {
+  synthetic constructor •() → self::Baz*
+    : super self::Foo::•()
+    ;
+  method _hest() → dynamic
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-testcase:///private_module.dart */ _hest() → void
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+library private_module;
+import self as pri;
+import "dart:core" as core;
+
+abstract class Fisk extends core::Object {
+  synthetic constructor •() → pri::Fisk*
+    : super core::Object::•()
+    ;
+  abstract method _hest() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private.dart::_hest
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.weak.modular.expect
new file mode 100644
index 0000000..1be321b
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library private_module;
+import self as self;
+import "dart:core" as core;
+
+abstract class Fisk extends core::Object {
+  synthetic constructor •() → self::Fisk*
+    : super core::Object::•()
+    ;
+  abstract method _hest() → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.weak.modular.expect
new file mode 100644
index 0000000..3a2ae93
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract method _foo() → void;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends self::Foo {
+  synthetic constructor •() → self::Bar*
+    : super self::Foo::•()
+    ;
+  method noSuchMethod(core::Invocation* invocation) → dynamic
+    return null;
+  no-such-method-forwarder method _foo() → void
+    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_same.dart::_foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.weak.modular.expect
new file mode 100644
index 0000000..51c933a
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    return null;
+  }
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.weak.modular.expect
new file mode 100644
index 0000000..8a8122f
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: 'foo' is already declared in this scope.
+//   void set foo(int x);
+//            ^^^
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Context: Previous declaration of 'foo'.
+//   void foo(int x) {}
+//        ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo(core::int* x) → void {}
+  no-such-method-forwarder set foo(core::int* x) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3))){(core::Invocation*) →* dynamic};
+  method noSuchMethod(core::Invocation* i) → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.weak.modular.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.weak.modular.expect
new file mode 100644
index 0000000..8314ecf
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method foo() → self::I::T*;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    return null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&M = core::Object with self::M /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_A&Object&M*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method noSuchMethod(core::Invocation* i) → dynamic
+    return super.{self::M::noSuchMethod}(i);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends self::_A&Object&M implements self::I<core::int*> {
+  synthetic constructor •() → self::A*
+    : super self::_A&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → core::int*
+    return this.{self::_A&Object&M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation*) →* dynamic} as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = <core::Symbol*, dynamic>{)
+}
diff --git a/pkg/front_end/testcases/none/equals.dart.weak.modular.expect b/pkg/front_end/testcases/none/equals.dart.weak.modular.expect
new file mode 100644
index 0000000..7950f55
--- /dev/null
+++ b/pkg/front_end/testcases/none/equals.dart.weak.modular.expect
@@ -0,0 +1,483 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/none/equals.dart:115:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass.method() == null;
+//                          ^
+//
+// pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass.method() != null;
+//                          ^
+//
+// pkg/front_end/testcases/none/equals.dart:117:34: Error: Too few positional arguments: 1 required, 0 given.
+//   null == nonNullableClass.method();
+//                                  ^
+//
+// pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
+//   null != nonNullableClass.method();
+//                                  ^
+//
+// pkg/front_end/testcases/none/equals.dart:134:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+//   nonNullableClass == nullValue;
+//                       ^
+//
+// pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+//   nonNullableClass != nullValue;
+//                       ^
+//
+// pkg/front_end/testcases/none/equals.dart:139:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+//   nullableClass == nullValue;
+//                    ^
+//
+// pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+//   nullableClass != nullValue;
+//                    ^
+//
+// pkg/front_end/testcases/none/equals.dart:204:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass.method() == nullValue;
+//                          ^
+//
+// pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass.method() != nullValue;
+//                          ^
+//
+// pkg/front_end/testcases/none/equals.dart:206:39: Error: Too few positional arguments: 1 required, 0 given.
+//   nullValue == nonNullableClass.method();
+//                                       ^
+//
+// pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
+//   nullValue != nonNullableClass.method();
+//                                       ^
+//
+// pkg/front_end/testcases/none/equals.dart:233:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+//   nonNullableClass == o;
+//                       ^
+//
+// pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+//   nonNullableClass != o;
+//                       ^
+//
+// pkg/front_end/testcases/none/equals.dart:242:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+//   nullableClass == o;
+//                    ^
+//
+// pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+//  - 'Object' is from 'dart:core'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+//   nullableClass != o;
+//                    ^
+//
+// pkg/front_end/testcases/none/equals.dart:355:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass.method() == nullTypedValue;
+//                          ^
+//
+// pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass.method() != nullTypedValue;
+//                          ^
+//
+// pkg/front_end/testcases/none/equals.dart:357:44: Error: Too few positional arguments: 1 required, 0 given.
+//   nullTypedValue == nonNullableClass.method();
+//                                            ^
+//
+// pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
+//   nullTypedValue != nonNullableClass.method();
+//                                            ^
+//
+// pkg/front_end/testcases/none/equals.dart:359:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass.method() == o;
+//                          ^
+//
+// pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass.method() != o;
+//                          ^
+//
+// pkg/front_end/testcases/none/equals.dart:361:31: Error: Too few positional arguments: 1 required, 0 given.
+//   o == nonNullableClass.method();
+//                               ^
+//
+// pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
+//   o != nonNullableClass.method();
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  operator ==(covariant-by-declaration covariant-by-class self::Class<self::Class::T%> other) → core::bool
+    return true;
+  method method(dynamic o) → dynamic {}
+}
+static const field core::Object? nullValue = #C1;
+static method test<T1 extends core::Function, T2 extends (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
+  core::print("EqualsNull (literal null)");
+  null == null;
+  !(null == null);
+  nonNullableObject == null;
+  !(nonNullableObject == null);
+  nonNullableObject == null;
+  !(nonNullableObject == null);
+  nullableObject == null;
+  !(nullableObject == null);
+  nullableObject == null;
+  !(nullableObject == null);
+  nullableClass == null;
+  !(nullableClass == null);
+  nullableClass == null;
+  !(nullableClass == null);
+  nonNullableClass == null;
+  !(nonNullableClass == null);
+  nonNullableClass == null;
+  !(nonNullableClass == null);
+  dyn == null;
+  !(dyn == null);
+  dyn == null;
+  !(dyn == null);
+  (let final Never #t1 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
+  !((let final Never #t2 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
+  (let final Never #t3 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
+  !((let final Never #t4 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
+  nullableNever == null;
+  !(nullableNever == null);
+  nullableNever == null;
+  !(nullableNever == null);
+  nullTypedValue == null;
+  !(nullTypedValue == null);
+  nullTypedValue == null;
+  !(nullTypedValue == null);
+  nonNullableFunction == null;
+  !(nonNullableFunction == null);
+  nonNullableFunction == null;
+  !(nonNullableFunction == null);
+  nullableFunction == null;
+  !(nullableFunction == null);
+  nullableFunction == null;
+  !(nullableFunction == null);
+  nonNullableFunctionType == null;
+  !(nonNullableFunctionType == null);
+  nonNullableFunctionType == null;
+  !(nonNullableFunctionType == null);
+  nullableFunctionType == null;
+  !(nullableFunctionType == null);
+  nullableFunctionType == null;
+  !(nullableFunctionType == null);
+  nonNullableTypeVariable1 == null;
+  !(nonNullableTypeVariable1 == null);
+  nonNullableTypeVariable1 == null;
+  !(nonNullableTypeVariable1 == null);
+  nullableTypeVariable1 == null;
+  !(nullableTypeVariable1 == null);
+  nullableTypeVariable1 == null;
+  !(nullableTypeVariable1 == null);
+  nonNullableTypeVariable2 == null;
+  !(nonNullableTypeVariable2 == null);
+  nonNullableTypeVariable2 == null;
+  !(nonNullableTypeVariable2 == null);
+  nullableTypeVariable2 == null;
+  !(nullableTypeVariable2 == null);
+  nullableTypeVariable2 == null;
+  !(nullableTypeVariable2 == null);
+  invalid-expression "pkg/front_end/testcases/none/equals.dart:115:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass.method() == null;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} == null;
+  !(invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass.method() != null;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} == null);
+  invalid-expression "pkg/front_end/testcases/none/equals.dart:117:34: Error: Too few positional arguments: 1 required, 0 given.
+  null == nonNullableClass.method();
+                                 ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} == null;
+  !(invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
+  null != nonNullableClass.method();
+                                 ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} == null);
+  core::print("EqualsNull (constant null)");
+  #C1 == null;
+  !(#C1 == null);
+  nonNullableObject == null;
+  !(nonNullableObject == null);
+  nonNullableObject == null;
+  !(nonNullableObject == null);
+  nullableObject == null;
+  !(nullableObject == null);
+  nullableObject == null;
+  !(nullableObject == null);
+  nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:134:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+ - 'Object' is from 'dart:core'.
+ - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+  nonNullableClass == nullValue;
+                      ^" in #C1 as{TypeError,ForNonNullableByDefault} self::Class<core::String>?;
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+ - 'Object' is from 'dart:core'.
+ - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+  nonNullableClass != nullValue;
+                      ^" in #C1 as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+  nonNullableClass == null;
+  !(nonNullableClass == null);
+  nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:139:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+ - 'Object' is from 'dart:core'.
+ - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+  nullableClass == nullValue;
+                   ^" in #C1 as{TypeError,ForNonNullableByDefault} self::Class<core::String>?;
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+ - 'Object' is from 'dart:core'.
+ - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+  nullableClass != nullValue;
+                   ^" in #C1 as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+  nullableClass == null;
+  !(nullableClass == null);
+  dyn == null;
+  !(dyn == null);
+  dyn == null;
+  !(dyn == null);
+  let final Never #t5 = (let final Never #t6 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t7 = !((let final Never #t8 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  (let final Never #t9 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
+  !((let final Never #t10 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
+  nullableNever == null;
+  !(nullableNever == null);
+  nullableNever == null;
+  !(nullableNever == null);
+  nullTypedValue == null;
+  !(nullTypedValue == null);
+  nullTypedValue == null;
+  !(nullTypedValue == null);
+  nonNullableFunction == null;
+  !(nonNullableFunction == null);
+  nonNullableFunction == null;
+  !(nonNullableFunction == null);
+  nullableFunction == null;
+  !(nullableFunction == null);
+  nullableFunction == null;
+  !(nullableFunction == null);
+  nonNullableFunctionType == null;
+  !(nonNullableFunctionType == null);
+  nonNullableFunctionType == null;
+  !(nonNullableFunctionType == null);
+  nullableFunctionType == null;
+  !(nullableFunctionType == null);
+  nullableFunctionType == null;
+  !(nullableFunctionType == null);
+  nonNullableTypeVariable1 == null;
+  !(nonNullableTypeVariable1 == null);
+  nonNullableTypeVariable1 == null;
+  !(nonNullableTypeVariable1 == null);
+  nullableTypeVariable1 == null;
+  !(nullableTypeVariable1 == null);
+  nullableTypeVariable1 == null;
+  !(nullableTypeVariable1 == null);
+  nonNullableTypeVariable2 == null;
+  !(nonNullableTypeVariable2 == null);
+  nonNullableTypeVariable2 == null;
+  !(nonNullableTypeVariable2 == null);
+  nullableTypeVariable2 == null;
+  !(nullableTypeVariable2 == null);
+  nullableTypeVariable2 == null;
+  !(nullableTypeVariable2 == null);
+  invalid-expression "pkg/front_end/testcases/none/equals.dart:204:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass.method() == nullValue;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} == null;
+  !(invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass.method() != nullValue;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} == null);
+  invalid-expression "pkg/front_end/testcases/none/equals.dart:206:39: Error: Too few positional arguments: 1 required, 0 given.
+  nullValue == nonNullableClass.method();
+                                      ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} == null;
+  !(invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
+  nullValue != nonNullableClass.method();
+                                      ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} == null);
+  core::print("EqualsCall");
+  nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
+  nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
+  nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject);
+  nullableObject =={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableObject =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nullableObject;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableObject);
+  nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
+  nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:233:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+ - 'Object' is from 'dart:core'.
+ - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+  nonNullableClass == o;
+                      ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?;
+  !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+ - 'Object' is from 'dart:core'.
+ - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+  nonNullableClass != o;
+                      ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+  o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
+  nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass);
+  nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:242:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+ - 'Object' is from 'dart:core'.
+ - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+  nullableClass == o;
+                   ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?;
+  !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+ - 'Object' is from 'dart:core'.
+ - 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
+  nullableClass != o;
+                   ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+  o =={core::Object::==}{(core::Object) → core::bool} nullableClass;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableClass);
+  dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn);
+  dyn =={core::Object::==}{(core::Object) → core::bool} o;
+  !(dyn =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} dyn;
+  !(o =={core::Object::==}{(core::Object) → core::bool} dyn);
+  let final Never #t11 = (let final Never #t12 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} nullTypedValue in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t13 = !((let final Never #t14 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} nullTypedValue) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t15 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t16 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")));
+  let final Never #t17 = (let final Never #t18 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} o in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t19 = !((let final Never #t20 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} o) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t21 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+  !(o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t22 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")));
+  nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever);
+  nullableNever =={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableNever =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nullableNever;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableNever);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
+  nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
+  !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
+  nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
+  nullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
+  !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
+  nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
+  nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
+  nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
+  nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
+  nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
+  nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
+  !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
+  nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
+  nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
+  !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
+  nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
+  nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
+  !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
+  nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
+  nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
+  !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+  !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
+  invalid-expression "pkg/front_end/testcases/none/equals.dart:355:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass.method() == nullTypedValue;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+  !(invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass.method() != nullTypedValue;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
+  nullTypedValue =={core::Object::==}{(core::Object) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:357:44: Error: Too few positional arguments: 1 required, 0 given.
+  nullTypedValue == nonNullableClass.method();
+                                           ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type};
+  !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
+  nullTypedValue != nonNullableClass.method();
+                                           ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+  invalid-expression "pkg/front_end/testcases/none/equals.dart:359:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass.method() == o;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} =={core::Object::==}{(core::Object) → core::bool} o;
+  !(invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass.method() != o;
+                         ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type} =={core::Object::==}{(core::Object) → core::bool} o);
+  o =={core::Object::==}{(core::Object) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:361:31: Error: Too few positional arguments: 1 required, 0 given.
+  o == nonNullableClass.method();
+                              ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type};
+  !(o =={core::Object::==}{(core::Object) → core::bool} invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
+  o != nonNullableClass.method();
+                              ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+}
+static method nullEqualsIndexGet(core::Map<core::int, core::String> map) → dynamic {
+  map.{core::Map::[]}(0){(core::Object?) → core::String?} == null;
+  map.{core::Map::[]}(0){(core::Object?) → core::String?} == null;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/none/issue46003.dart.weak.modular.expect b/pkg/front_end/testcases/none/issue46003.dart.weak.modular.expect
new file mode 100644
index 0000000..cbdc1a0
--- /dev/null
+++ b/pkg/front_end/testcases/none/issue46003.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field () → dynamic foo;
+  constructor •(() → dynamic foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  method bar() → void {
+    this.{self::A::foo}{() → dynamic}(){() → dynamic};
+    () → dynamic x = this.{self::A::foo}{() → dynamic};
+    x(){() → dynamic};
+    () → void y = this.{self::A::foo}{() → dynamic};
+    y(){() → void};
+  }
+}
+static method main() → dynamic {
+  new self::A::•(() → Null {}).{self::A::bar}(){() → void};
+}
diff --git a/pkg/front_end/testcases/none/method_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/none/method_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..b20ca89
--- /dev/null
+++ b/pkg/front_end/testcases/none/method_invocation.dart.weak.modular.expect
@@ -0,0 +1,297 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/none/method_invocation.dart:84:24: Error: Not a constant expression.
+//   const int call_dyn = dyn.toString(0);
+//                        ^^^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:84:28: Error: Method invocation is not a constant expression.
+//   const int call_dyn = dyn.toString(0);
+//                            ^^^^^^^^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:147:34: Error: Not a constant expression.
+//   const int call_localFunction = localFunction();
+//                                  ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:152:22: Error: Not a constant expression.
+//   const int call_f = f();
+//                      ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:157:23: Error: Not a constant expression.
+//   const bool equals = i == j;
+//                       ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:68:42: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+//   nonNullableClass2.nullableFunctionField();
+//                                          ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:69:43: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+//   nonNullableClass2.nullableFunctionGetter();
+//                                           ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:70:47: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   nonNullableClass2.nullableFunctionTypedField();
+//                                               ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:71:48: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   nonNullableClass2.nullableFunctionTypedGetter();
+//                                                ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:74:50: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   nonNullableClass2.nonNullableFunctionTypedField(0);
+//                                                  ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:75:51: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   nonNullableClass2.nonNullableFunctionTypedGetter(0);
+//                                                   ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:78:18: Error: Method 'method' cannot be called on 'Class1?' because it is potentially null.
+//  - 'Class1' is from 'pkg/front_end/testcases/none/method_invocation.dart'.
+// Try calling using ?. instead.
+//   nullableClass1.method(0);
+//                  ^^^^^^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:102:21: Error: The method 'unresolved' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/none/method_invocation.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
+//   nonNullableClass1.unresolved();
+//                     ^^^^^^^^^^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:105:27: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass1.method();
+//                           ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:106:26: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableFunctionType();
+//                          ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:132:19: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?.call instead.
+//   nullableFunction(0);
+//                   ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:133:20: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+//  - 'Function' is from 'dart:core'.
+// Try calling using ?. instead.
+//   nullableFunction.call(0);
+//                    ^^^^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:134:23: Error: Can't use an expression of type 'int Function(int)?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+//   nullableFunctionType(0);
+//                       ^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:135:24: Error: Method 'call' cannot be called on 'int Function(int)?' because it is potentially null.
+// Try calling using ?. instead.
+//   nullableFunctionType.call(0);
+//                        ^^^^
+//
+// pkg/front_end/testcases/none/method_invocation.dart:138:27: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass1.method().method(0);
+//                           ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1
+    : super core::Object::•()
+    ;
+  method method(core::int o) → core::double
+    return 0.5;
+}
+class Class2<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::Class2::T% field;
+  field core::Function nonNullableFunctionField;
+  field core::Function? nullableFunctionField = null;
+  field () → void nonNullableFunctionTypedField;
+  field () →? void nullableFunctionTypedField = null;
+  constructor •(self::Class2::T% field, core::Function nonNullableFunctionField, () → void nonNullableFunctionTypedField) → self::Class2<self::Class2::T%>
+    : self::Class2::field = field, self::Class2::nonNullableFunctionField = nonNullableFunctionField, self::Class2::nonNullableFunctionTypedField = nonNullableFunctionTypedField, super core::Object::•()
+    ;
+  method call() → self::Class2::T%
+    return this.{self::Class2::field}{self::Class2::T%};
+  method method(core::int o) → self::Class2::T%
+    return this.{self::Class2::field}{self::Class2::T%};
+  get nonNullableFunctionGetter() → core::Function
+    return this.{self::Class2::nonNullableFunctionTypedField}{() → void};
+  get nullableFunctionGetter() → core::Function?
+    return this.{self::Class2::nonNullableFunctionTypedField}{() → void};
+  get nonNullableFunctionTypedGetter() → () → void
+    return this.{self::Class2::nonNullableFunctionTypedField}{() → void};
+  get nullableFunctionTypedGetter() → () →? void
+    return this.{self::Class2::nonNullableFunctionTypedField}{() → void};
+}
+static const field core::int i = #C1;
+static const field core::int j = #C2;
+static const field core::int k = #C3;
+static method test<T1 extends core::Function, T2 extends (core::int) → core::int, T3 extends core::Object? = dynamic>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, <T extends core::Object? = dynamic>(T%) → T% genericFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2, self::test::T3% undeterminedTypeVariable) → dynamic {
+  core::print("InstanceInvocation");
+  nonNullableClass1.{self::Class1::method}(0){(core::int) → core::double};
+  let final self::Class1? #t1 = nullableClass1 in #t1 == null ?{core::double?} null : #t1{self::Class1}.{self::Class1::method}(0){(core::int) → core::double};
+  core::print("InstanceGet calls");
+  nonNullableClass2.{self::Class2::nonNullableFunctionField}{core::Function}();
+  nonNullableClass2.{self::Class2::nonNullableFunctionGetter}{core::Function}();
+  nonNullableClass2.{self::Class2::nonNullableFunctionTypedField}{() → void}(){() → void};
+  nonNullableClass2.{self::Class2::nonNullableFunctionTypedGetter}{() → void}(){() → void};
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:68:42: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+  nonNullableClass2.nullableFunctionField();
+                                         ^" in nonNullableClass2.{self::Class2::nullableFunctionField}{core::Function?}{<nullable>}.();
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:69:43: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+  nonNullableClass2.nullableFunctionGetter();
+                                          ^" in nonNullableClass2.{self::Class2::nullableFunctionGetter}{core::Function?}{<nullable>}.();
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:70:47: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  nonNullableClass2.nullableFunctionTypedField();
+                                              ^" in nonNullableClass2.{self::Class2::nullableFunctionTypedField}{() →? void}{<nullable>}.(){() →? void};
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:71:48: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  nonNullableClass2.nullableFunctionTypedGetter();
+                                               ^" in nonNullableClass2.{self::Class2::nullableFunctionTypedGetter}{() →? void}{<nullable>}.(){() →? void};
+  let final self::Class2<core::String> #t2 = nonNullableClass2 in let final core::int #t3 = 0 in #t2.{self::Class2::nonNullableFunctionField}{core::Function}(#t3);
+  let final self::Class2<core::String> #t4 = nonNullableClass2 in let final core::int #t5 = 0 in #t4.{self::Class2::nonNullableFunctionGetter}{core::Function}(#t5);
+  let final self::Class2<core::String> #t6 = nonNullableClass2 in let final core::int #t7 = 0 in invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:74:50: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  nonNullableClass2.nonNullableFunctionTypedField(0);
+                                                 ^" in #t6.{self::Class2::nonNullableFunctionTypedField}{() → void}{<inapplicable>}.(#t7);
+  let final self::Class2<core::String> #t8 = nonNullableClass2 in let final core::int #t9 = 0 in invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:75:51: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  nonNullableClass2.nonNullableFunctionTypedGetter(0);
+                                                  ^" in #t8.{self::Class2::nonNullableFunctionTypedGetter}{() → void}{<inapplicable>}.(#t9);
+  core::print("InstanceInvocation (Nullable)");
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:78:18: Error: Method 'method' cannot be called on 'Class1?' because it is potentially null.
+ - 'Class1' is from 'pkg/front_end/testcases/none/method_invocation.dart'.
+Try calling using ?. instead.
+  nullableClass1.method(0);
+                 ^^^^^^" in nullableClass1.{self::Class1::method}{<nullable>}.(0){(core::int) → core::double};
+  core::print("DynamicInvocation");
+  dyn{dynamic}.method(0);
+  let final dynamic #t10 = dyn in #t10 == null ?{dynamic} null : #t10{dynamic}.method(0);
+  dyn{dynamic}.toString(0);
+  const core::int call_dyn = invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:84:28: Error: Method invocation is not a constant expression.
+  const int call_dyn = dyn.toString(0);
+                           ^^^^^^^^";
+  core::print(invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:84:28: Error: Method invocation is not a constant expression.
+  const int call_dyn = dyn.toString(0);
+                           ^^^^^^^^");
+  core::print("InstanceInvocation (Object)");
+  dyn.{core::Object::toString}(){() → core::String};
+  nullableClass1.{core::Object::toString}(){() → core::String};
+  nullableClass2.{core::Object::toString}(){() → core::String};
+  nullableFunction.{core::Object::toString}(){() → core::String};
+  nullableFunctionType.{core::Object::toString}(){() → core::String};
+  nullableTypeVariable1.{core::Object::toString}(){() → core::String};
+  nullableTypeVariable2.{core::Object::toString}(){() → core::String};
+  undeterminedTypeVariable.{core::Object::toString}(){() → core::String};
+  core::print("DynamicInvocation (Never)");
+  let final Never #t11 = (let final Never #t12 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.method(0) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t13 = (let final Never #t14 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.toString() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  core::print("DynamicInvocation (Unresolved)");
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:102:21: Error: The method 'unresolved' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/none/method_invocation.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'unresolved'.
+  nonNullableClass1.unresolved();
+                    ^^^^^^^^^^" in nonNullableClass1{<unresolved>}.unresolved();
+  core::print("DynamicInvocation (Inapplicable)");
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:105:27: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass1.method();
+                          ^" in nonNullableClass1.{self::Class1::method}{<inapplicable>}.(){() → invalid-type};
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:106:26: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableFunctionType();
+                         ^" in nonNullableFunctionType{<inapplicable>}.();
+  core::print("InstanceInvocation (generic)");
+  nonNullableClass2.{self::Class2::method}(0){(core::int) → core::String};
+  let final self::Class2<core::String>? #t15 = nullableClass2 in #t15 == null ?{core::String?} null : #t15{self::Class2<core::String>}.{self::Class2::method}(0){(core::int) → core::String};
+  nonNullableClass2.{self::Class2::call}(){() → core::String};
+  nonNullableClass2.{self::Class2::call}(){() → core::String};
+  core::print("FunctionInvocation");
+  nonNullableFunction(0);
+  nonNullableFunction(0);
+  let final core::Function? #t16 = nullableFunction in #t16 == null ?{dynamic} null : #t16{core::Function}(0);
+  nonNullableFunctionType(0){(core::int) → core::int};
+  nonNullableFunctionType(0){(core::int) → core::int};
+  let final (core::int) →? core::int #t17 = nullableFunctionType in #t17 == null ?{core::int?} null : #t17{(core::int) → core::int}(0){(core::int) → core::int};
+  genericFunctionType<core::int>(0){(core::int) → core::int};
+  genericFunctionType<core::num>(0){(core::num) → core::num};
+  core::num i = genericFunctionType<core::num>(0){(core::num) → core::num};
+  nonNullableTypeVariable1(0);
+  nonNullableTypeVariable1(0);
+  let final self::test::T1? #t18 = nullableTypeVariable1 in #t18 == null ?{dynamic} null : #t18{self::test::T1}(0);
+  nonNullableTypeVariable2(0){(core::int) → core::int};
+  nonNullableTypeVariable2(0){(core::int) → core::int};
+  let final self::test::T2? #t19 = nullableTypeVariable2 in #t19 == null ?{core::int?} null : #t19{self::test::T2}(0){(core::int) → core::int};
+  core::print("FunctionInvocation (Nullable)");
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:132:19: Error: Can't use an expression of type 'Function?' as a function because it's potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?.call instead.
+  nullableFunction(0);
+                  ^" in nullableFunction{<nullable>}.(0);
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:133:20: Error: Method 'call' cannot be called on 'Function?' because it is potentially null.
+ - 'Function' is from 'dart:core'.
+Try calling using ?. instead.
+  nullableFunction.call(0);
+                   ^^^^" in nullableFunction{<nullable>}.(0);
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:134:23: Error: Can't use an expression of type 'int Function(int)?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  nullableFunctionType(0);
+                      ^" in nullableFunctionType{<nullable>}.(0){(core::int) →? core::int};
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:135:24: Error: Method 'call' cannot be called on 'int Function(int)?' because it is potentially null.
+Try calling using ?. instead.
+  nullableFunctionType.call(0);
+                       ^^^^" in nullableFunctionType{<nullable>}.(0){(core::int) →? core::int};
+  core::print("DynamicInvocation (Invalid)");
+  invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:138:27: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass1.method().method(0);
+                          ^" in nonNullableClass1.{self::Class1::method}{<inapplicable>}.(){() → invalid-type}{dynamic}.method(0);
+  core::print("LocalFunctionInvocation");
+  function localFunction() → core::int
+    return 42;
+  function genericLocalFunction<T extends core::Object? = dynamic>(T% t) → T%
+    return t;
+  localFunction(){() → core::int};
+  genericLocalFunction<core::int>(0){(core::int) → core::int};
+  genericLocalFunction<core::num>(0){(core::num) → core::num};
+  const core::int call_localFunction = invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:147:34: Error: Not a constant expression.
+  const int call_localFunction = localFunction();
+                                 ^^^^^^^^^^^^^";
+  core::print(invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:147:34: Error: Not a constant expression.
+  const int call_localFunction = localFunction();
+                                 ^^^^^^^^^^^^^");
+  () → core::int f = () → core::int => 42;
+  const core::int call_f = invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:152:22: Error: Not a constant expression.
+  const int call_f = f();
+                     ^";
+  core::print(invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:152:22: Error: Not a constant expression.
+  const int call_f = f();
+                     ^");
+  core::print(#C4);
+  const core::bool equals = invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:157:23: Error: Not a constant expression.
+  const bool equals = i == j;
+                      ^";
+  core::print(invalid-expression "pkg/front_end/testcases/none/method_invocation.dart:157:23: Error: Not a constant expression.
+  const bool equals = i == j;
+                      ^");
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 4
+  #C2 = 24
+  #C3 = 96
+  #C4 = false
+}
diff --git a/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.modular.expect b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.modular.expect
new file mode 100644
index 0000000..eb12b86
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_application_declares/main.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "main_lib.dart" as mai;
+
+import "org-dartlang-testcase:///main_lib.dart";
+
+class SubClass extends mai::Class {
+  synthetic constructor •() → self::SubClass
+    : super mai::Class::•()
+    ;
+}
+static method main() → dynamic {
+  new self::SubClass::•();
+}
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.modular.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.modular.expect
new file mode 100644
index 0000000..ebd8305
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass
+    : super core::Object::•()
+    ;
+  method method1(core::num argument1, core::num argument2) → core::String
+    return "Superclass";
+  method method2(core::num argument1, core::num argument2) → core::String
+    return "Superclass";
+  method method3(core::num argument1, covariant-by-declaration core::int argument2) → core::String
+    return "Superclass";
+  method method4(core::num argument1, covariant-by-declaration core::num argument2) → core::String
+    return "Superclass";
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method method1(core::num argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method2(covariant-by-declaration core::int argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method3(core::num argument1, core::num argument2) → core::String
+    return "Mixin";
+  method method4(covariant-by-declaration core::int argument1, core::int argument2) → core::String
+    return "Mixin";
+}
+abstract class _Class&Superclass&Mixin = self::Superclass with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Class&Superclass&Mixin
+    : super self::Superclass::•()
+    ;
+  mixin-super-stub method method1(core::num argument1, core::num argument2) → core::String
+    return super.{self::Mixin::method1}(argument1, argument2);
+  mixin-super-stub method method2(covariant-by-declaration core::int argument1, core::num argument2) → core::String
+    return super.{self::Mixin::method2}(argument1, argument2);
+  forwarding-stub method method3(core::num argument1, covariant-by-declaration core::num argument2) → core::String
+    return super.{self::Mixin::method3}(argument1, argument2);
+  forwarding-stub method method4(covariant-by-declaration core::int argument1, covariant-by-declaration core::int argument2) → core::String
+    return super.{self::Mixin::method4}(argument1, argument2);
+}
+class Class extends self::_Class&Superclass&Mixin {
+  synthetic constructor •() → self::Class
+    : super self::_Class&Superclass&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  self::Class c = new self::Class::•();
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method1}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method2}(0, 1){(core::int, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method3}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", c.{self::_Class&Superclass&Mixin::method4}(0, 1){(core::int, core::int) → core::String});
+  self::Superclass s = c;
+  self::expect("Mixin", s.{self::Superclass::method1}(0.5, 1.5){(core::num, core::num) → core::String});
+  self::throws(() → void => s.{self::Superclass::method2}(0.5, 1.5){(core::num, core::num) → core::String});
+  self::expect("Mixin", s.{self::Superclass::method3}(0.5, 1){(core::num, core::int) → core::String});
+  self::throws(() → void => s.{self::Superclass::method4}(0.5, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", s.{self::Superclass::method4}(1, 0.5){(core::num, core::num) → core::String});
+  self::Mixin m = c;
+  self::expect("Mixin", m.{self::Mixin::method1}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", m.{self::Mixin::method2}(0, 1){(core::int, core::num) → core::String});
+  self::expect("Mixin", m.{self::Mixin::method3}(0, 1){(core::num, core::num) → core::String});
+  self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
+}
+static method expect(dynamic expected, dynamic actual) → void {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → void f) → void {
+  try {
+    f(){() → void};
+  }
+  on core::Object catch(final core::Object _) {
+    return;
+  }
+  throw "Expected exception";
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.modular.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.modular.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.modular.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.modular.expect
new file mode 100644
index 0000000..fe8cc3c
--- /dev/null
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/none/new_method_invocation_encodings.dart:7:8: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   int? getter => null;
+//        ^^^^^^
+//
+// pkg/front_end/testcases/none/new_method_invocation_encodings.dart:14:5: Error: The setter 'setter' isn't defined for the class 'Class'.
+//  - 'Class' is from 'pkg/front_end/testcases/none/new_method_invocation_encodings.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'setter'.
+//   c.setter = c.getter;
+//     ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  field core::int? field = null;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method getter() → core::int?
+    return null;
+  method setter(core::int? value) → void {}
+  method method() → void {}
+}
+static method test(self::Class c, dynamic d, core::Function f1, () → void f2) → dynamic {
+  c.{self::Class::field} = c.{self::Class::field}{core::int?};
+  invalid-expression "pkg/front_end/testcases/none/new_method_invocation_encodings.dart:14:5: Error: The setter 'setter' isn't defined for the class 'Class'.
+ - 'Class' is from 'pkg/front_end/testcases/none/new_method_invocation_encodings.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'setter'.
+  c.setter = c.getter;
+    ^^^^^^" in c{<unresolved>}.setter = c.{self::Class::getter}{() → core::int?};
+  c.{self::Class::method}{() → void};
+  c.{self::Class::method}(){() → void};
+  d{dynamic}.field = d{dynamic}.field;
+  d{dynamic}.setter = d{dynamic}.getter;
+  d{dynamic}.method;
+  d{dynamic}.method();
+  f1();
+  f1.call;
+  f2(){() → void};
+  f2.call;
+  function local() → Null {}
+  local(){() → Null};
+  c =={core::Object::==}{(core::Object) → core::bool} d;
+  !(c =={core::Object::==}{(core::Object) → core::bool} d);
+  c == null;
+  !(c == null);
+  d == null;
+  !(d == null);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/operator.dart.weak.modular.expect b/pkg/front_end/testcases/none/operator.dart.weak.modular.expect
new file mode 100644
index 0000000..4de73e4
--- /dev/null
+++ b/pkg/front_end/testcases/none/operator.dart.weak.modular.expect
@@ -0,0 +1,164 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/none/operator.dart:48:10: Error: The operator '-' isn't defined for the class 'String'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
+//   string - 42;
+//          ^
+//
+// pkg/front_end/testcases/none/operator.dart:66:12: Error: Too few positional arguments: 1 required, 0 given.
+//   -c.method();
+//            ^
+//
+// pkg/front_end/testcases/none/operator.dart:69:3: Error: The operator 'unary-' isn't defined for the class 'String'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+//   -string;
+//   ^
+//
+// pkg/front_end/testcases/none/operator.dart:86:11: Error: Too few positional arguments: 1 required, 0 given.
+//   c.method()[0];
+//           ^
+//
+// pkg/front_end/testcases/none/operator.dart:109:3: Error: Undefined name 'string'.
+//   string[0] = 42;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/none/operator.dart:106:11: Error: Too few positional arguments: 1 required, 0 given.
+//   c.method()[0] = 42;
+//           ^
+//
+// pkg/front_end/testcases/none/operator.dart:129:3: Error: Undefined name 'string'.
+//   string[0] += 42;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/none/operator.dart:116:14: Error: Operator '+' cannot be called on 'double?' because it is potentially null.
+//   map['foo'] += 0.5;
+//              ^
+//
+// pkg/front_end/testcases/none/operator.dart:126:11: Error: Too few positional arguments: 1 required, 0 given.
+//   c.method()[0] += 42;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Class<self::Class::T%>
+    : super core::Object::•()
+    ;
+  operator +(covariant-by-class self::Class<self::Class::T%> other) → self::Class<self::Class::T%>
+    return other;
+  operator unary-() → self::Class<self::Class::T%>
+    return this;
+  operator [](core::int index) → self::Class<self::Class::T%>
+    return this;
+  operator []=(core::int index, covariant-by-class self::Class<self::Class::T%> value) → void {}
+  method method(core::double o) → core::int
+    return 42;
+}
+static method add(core::num n, core::int i, core::double d, self::Class<core::String> c, dynamic dyn, Never never, core::String string) → dynamic {
+  core::print("InstanceInvocation");
+  n.{core::num::+}(n){(core::num) → core::num};
+  n.{core::num::+}(i){(core::num) → core::num};
+  n.{core::num::+}(d){(core::num) → core::double};
+  n.{core::num::+}(dyn as{TypeError,ForDynamic,ForNonNullableByDefault} core::num){(core::num) → core::num};
+  core::print("InstanceInvocation");
+  i.{core::num::+}(n){(core::num) → core::num};
+  i.{core::num::+}(i){(core::num) → core::int};
+  i.{core::num::+}(d){(core::num) → core::double};
+  i.{core::num::+}(dyn as{TypeError,ForDynamic,ForNonNullableByDefault} core::num){(core::num) → core::num};
+  core::print("InstanceInvocation");
+  d.{core::double::+}(n){(core::num) → core::double};
+  d.{core::double::+}(i){(core::num) → core::double};
+  d.{core::double::+}(d){(core::num) → core::double};
+  i.{core::num::+}(dyn as{TypeError,ForDynamic,ForNonNullableByDefault} core::num){(core::num) → core::num};
+  core::print("InstanceInvocation");
+  c.{self::Class::+}(c){(self::Class<core::String>) → self::Class<core::String>};
+  c.{self::Class::+}(dyn as{TypeError,ForDynamic,ForNonNullableByDefault} self::Class<core::String>){(self::Class<core::String>) → self::Class<core::String>};
+  core::print("DynamicInvocation");
+  dyn{dynamic}.+(n);
+  core::print("DynamicInvocation (Never)");
+  let final Never #t1 = (let final Never #t2 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.+(n) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  core::print("DynamicInvocation (Invalid)");
+  invalid-expression "pkg/front_end/testcases/none/operator.dart:48:10: Error: The operator '-' isn't defined for the class 'String'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
+  string - 42;
+         ^" in string{<unresolved>}.-(42);
+}
+static method unaryMinus(core::num n, core::int i, core::double d, self::Class<core::String> c, dynamic dyn, Never never, core::String string) → dynamic {
+  core::print("InstanceInvocation");
+  n.{core::num::unary-}(){() → core::num};
+  i.{core::int::unary-}(){() → core::int};
+  d.{core::double::unary-}(){() → core::double};
+  c.{self::Class::unary-}(){() → self::Class<core::String>};
+  core::print("DynamicInvocation");
+  dyn{dynamic}.unary-();
+  core::print("DynamicInvocation (Never)");
+  let final Never #t3 = (let final Never #t4 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.unary-() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  core::print("DynamicInvocation (Invalid)");
+  invalid-expression "pkg/front_end/testcases/none/operator.dart:66:12: Error: Too few positional arguments: 1 required, 0 given.
+  -c.method();
+           ^" in c.{self::Class::method}{<inapplicable>}.(){() → invalid-type}{<invalid>}.unary-();
+  core::print("DynamicInvocation (Unresolved)");
+  invalid-expression "pkg/front_end/testcases/none/operator.dart:69:3: Error: The operator 'unary-' isn't defined for the class 'String'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
+  -string;
+  ^" in string{<unresolved>}.unary-();
+}
+static method indexGet(core::List<core::int> list, core::Map<core::String, core::double> map, self::Class<core::String> c, dynamic dyn, Never never, core::String string) → dynamic {
+  core::print("InstanceInvocation");
+  list.{core::List::[]}(0){(core::int) → core::int};
+  map.{core::Map::[]}("foo"){(core::Object?) → core::double?};
+  c.{self::Class::[]}(0){(core::int) → self::Class<core::String>};
+  core::print("DynamicInvocation");
+  dyn{dynamic}.[](0);
+  core::print("DynamicInvocation (Never)");
+  let final Never #t5 = (let final Never #t6 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[](0) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  core::print("DynamicInvocation (Invalid)");
+  invalid-expression "pkg/front_end/testcases/none/operator.dart:86:11: Error: Too few positional arguments: 1 required, 0 given.
+  c.method()[0];
+          ^" in c.{self::Class::method}{<inapplicable>}.(){() → invalid-type}{<invalid>}.[](0);
+  core::print("DynamicInvocation (Unresolved)");
+  string.{core::String::[]}(0){(core::int) → core::String};
+}
+static method indexSet(core::List<core::int> list, core::Map<core::String, core::double> map, self::Class<core::String> c, dynamic dyn, Never never) → dynamic {
+  core::print("InstanceInvocation");
+  list.{core::List::[]=}(0, 42){(core::int, core::int) → void};
+  map.{core::Map::[]=}("foo", 0.5){(core::String, core::double) → void};
+  c.{self::Class::[]=}(0, c){(core::int, self::Class<core::String>) → void};
+  core::print("DynamicInvocation");
+  dyn{dynamic}.[]=(0, 42);
+  core::print("DynamicInvocation (Never)");
+  (let final Never #t7 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.[]=(0, 42);
+  core::print("DynamicInvocation (Invalid)");
+  invalid-expression "pkg/front_end/testcases/none/operator.dart:106:11: Error: Too few positional arguments: 1 required, 0 given.
+  c.method()[0] = 42;
+          ^" in c.{self::Class::method}{<inapplicable>}.(){() → invalid-type}{<invalid>}.[]=(0, 42);
+  core::print("DynamicInvocation (Unresolved)");
+  invalid-expression "pkg/front_end/testcases/none/operator.dart:109:3: Error: Undefined name 'string'.
+  string[0] = 42;
+  ^^^^^^"{<invalid>}.[]=(0, 42);
+}
+static method compound(core::List<core::int> list, core::Map<core::String, core::double> map, self::Class<core::String> c, dynamic dyn, Never never) → dynamic {
+  core::print("InstanceInvocation");
+  let final core::List<core::int> #t8 = list in let final core::int #t9 = 0 in #t8.{core::List::[]=}(#t9, #t8.{core::List::[]}(#t9){(core::int) → core::int}.{core::num::+}(42){(core::num) → core::int}){(core::int, core::int) → void};
+  let final core::Map<core::String, core::double> #t10 = map in let final core::String #t11 = "foo" in #t10.{core::Map::[]=}(#t11, invalid-expression "pkg/front_end/testcases/none/operator.dart:116:14: Error: Operator '+' cannot be called on 'double?' because it is potentially null.
+  map['foo'] += 0.5;
+             ^" in #t10.{core::Map::[]}(#t11){(core::Object?) → core::double?}.{core::double::+}(0.5){(core::num) → core::double}){(core::String, core::double) → void};
+  let final self::Class<core::String> #t12 = c in let final core::int #t13 = 0 in #t12.{self::Class::[]=}(#t13, #t12.{self::Class::[]}(#t13){(core::int) → self::Class<core::String>}.{self::Class::+}(c){(self::Class<core::String>) → self::Class<core::String>}){(core::int, self::Class<core::String>) → void};
+  core::print("DynamicInvocation");
+  let final dynamic #t14 = dyn in let final core::int #t15 = 0 in #t14{dynamic}.[]=(#t15, #t14{dynamic}.[](#t15){dynamic}.+(42));
+  core::print("DynamicInvocation (Never)");
+  let final Never #t16 = let final Never #t17 = let final Never #t18 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in let final core::int #t19 = 0 in #t17{Never}.[]=(#t19, #t17{Never}.[](#t19){Never}.+(42)) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  core::print("DynamicInvocation (Invalid)");
+  let final invalid-type #t20 = invalid-expression "pkg/front_end/testcases/none/operator.dart:126:11: Error: Too few positional arguments: 1 required, 0 given.
+  c.method()[0] += 42;
+          ^" in c.{self::Class::method}{<inapplicable>}.(){() → invalid-type} in let final core::int #t21 = 0 in #t20{<invalid>}.[]=(#t21, #t20{<invalid>}.[](#t21){<invalid>}.+(42));
+  core::print("DynamicInvocation (Unresolved)");
+  let final invalid-type #t22 = invalid-expression "pkg/front_end/testcases/none/operator.dart:129:3: Error: Undefined name 'string'.
+  string[0] += 42;
+  ^^^^^^" in let final core::int #t23 = 0 in #t22{<invalid>}.[]=(#t23, #t22{<invalid>}.[](#t23){<invalid>}.+(42));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/property_get.dart.weak.modular.expect b/pkg/front_end/testcases/none/property_get.dart.weak.modular.expect
new file mode 100644
index 0000000..20f72b6
--- /dev/null
+++ b/pkg/front_end/testcases/none/property_get.dart.weak.modular.expect
@@ -0,0 +1,150 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/none/property_get.dart:55:32: Error: Not a constant expression.
+//   const dynamic instance_get = nullableClass1.field;
+//                                ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/none/property_get.dart:63:36: Error: Not a constant expression.
+//   const dynamic instance_tearOff = nonNullableClass1.method;
+//                                    ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/none/property_get.dart:82:27: Error: Not a constant expression.
+//   const dynamic dyn_get = dyn.field;
+//                           ^^^
+//
+// pkg/front_end/testcases/none/property_get.dart:106:36: Error: Not a constant expression.
+//   const dynamic function_tearOff = nonNullableFunction.call;
+//                                    ^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/none/property_get.dart:67:18: Error: Can't tear off method 'call' from a potentially null value.
+//   Function? f2 = nullableClass2;
+//                  ^
+//
+// pkg/front_end/testcases/none/property_get.dart:110:27: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass1.method().field;
+//                           ^
+//
+// pkg/front_end/testcases/none/property_get.dart:113:21: Error: The getter 'unresolved' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/none/property_get.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
+//   nonNullableClass1.unresolved;
+//                     ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class1 extends core::Object {
+  field core::int field;
+  static field core::int staticField = 42;
+  constructor •(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  method method(core::double o) → core::int
+    return 0;
+  static method staticMethod(core::double o) → core::int
+    return 0;
+}
+class Class2<T extends core::Object? = dynamic> extends core::Object {
+  covariant-by-class field self::Class2::T% field;
+  constructor •(self::Class2::T% field) → self::Class2<self::Class2::T%>
+    : self::Class2::field = field, super core::Object::•()
+    ;
+  method call() → core::int
+    return 42;
+}
+static field core::int topLevelField = 42;
+static const field core::String string = #C1;
+static const field core::int stringLength = #C2;
+static const field dynamic dynamicString = #C1;
+static const field core::int dynamicStringLength = #C2;
+static method topLevelMethod(core::double o) → core::int
+  return 0;
+static method test<T1 extends core::Function, T2 extends () → core::int>(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never, self::Class2<core::String> nonNullableClass2, self::Class2<core::String>? nullableClass2, core::Function nonNullableFunction, core::Function? nullableFunction, () → core::int nonNullableFunctionType, () →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
+  core::print("InstanceGet");
+  nonNullableClass1.{self::Class1::field}{core::int};
+  let final self::Class1? #t1 = nullableClass1 in #t1 == null ?{core::int?} null : #t1{self::Class1}.{self::Class1::field}{core::int};
+  nonNullableClass2.{self::Class2::field}{core::String};
+  let final self::Class2<core::String>? #t2 = nullableClass2 in #t2 == null ?{core::String?} null : #t2{self::Class2<core::String>}.{self::Class2::field}{core::String};
+  const dynamic instance_get = invalid-expression "pkg/front_end/testcases/none/property_get.dart:55:32: Error: Not a constant expression.
+  const dynamic instance_get = nullableClass1.field;
+                               ^^^^^^^^^^^^^^";
+  core::print(invalid-expression "pkg/front_end/testcases/none/property_get.dart:55:32: Error: Not a constant expression.
+  const dynamic instance_get = nullableClass1.field;
+                               ^^^^^^^^^^^^^^");
+  core::print("InstanceTearOff");
+  nonNullableClass1.{self::Class1::method}{(core::double) → core::int};
+  let final self::Class1? #t3 = nullableClass1 in #t3 == null ?{(core::double) →? core::int} null : #t3{self::Class1}.{self::Class1::method}{(core::double) → core::int};
+  nonNullableClass2.{self::Class2::call}{() → core::int};
+  let final self::Class2<core::String>? #t4 = nullableClass2 in #t4 == null ?{() →? core::int} null : #t4{self::Class2<core::String>}.{self::Class2::call}{() → core::int};
+  const dynamic instance_tearOff = invalid-expression "pkg/front_end/testcases/none/property_get.dart:63:36: Error: Not a constant expression.
+  const dynamic instance_tearOff = nonNullableClass1.method;
+                                   ^^^^^^^^^^^^^^^^^";
+  core::print(invalid-expression "pkg/front_end/testcases/none/property_get.dart:63:36: Error: Not a constant expression.
+  const dynamic instance_tearOff = nonNullableClass1.method;
+                                   ^^^^^^^^^^^^^^^^^");
+  core::Function f1 = let final self::Class2<core::String> #t5 = nonNullableClass2 in #t5 == null ?{() → core::int} null : #t5.{self::Class2::call}{() → core::int};
+  core::Function? f2 = invalid-expression "pkg/front_end/testcases/none/property_get.dart:67:18: Error: Can't tear off method 'call' from a potentially null value.
+  Function? f2 = nullableClass2;
+                 ^" in nullableClass2 as{TypeError} core::Function?;
+  core::print("StaticGet");
+  self::Class1::staticField;
+  self::topLevelField;
+  core::print("StaticTearOff");
+  #C3;
+  #C4;
+  core::print(#C4);
+  core::print("DynamicGet");
+  dyn{dynamic}.field;
+  let final dynamic #t6 = dyn in #t6 == null ?{dynamic} null : #t6{dynamic}.field;
+  const dynamic dyn_get = invalid-expression "pkg/front_end/testcases/none/property_get.dart:82:27: Error: Not a constant expression.
+  const dynamic dyn_get = dyn.field;
+                          ^^^";
+  core::print(invalid-expression "pkg/front_end/testcases/none/property_get.dart:82:27: Error: Not a constant expression.
+  const dynamic dyn_get = dyn.field;
+                          ^^^");
+  core::print("InstanceGet (Object)");
+  dyn.{core::Object::hashCode}{core::int};
+  nullableClass1.{core::Object::hashCode}{core::int};
+  core::print("InstanceGetTearOff (Object)");
+  dyn.{core::Object::toString}{() → core::String};
+  nullableClass1.{core::Object::toString}{() → core::String};
+  core::print("DynamicGet (Never)");
+  let final Never #t7 = (let final Never #t8 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.field in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t9 = (let final Never #t10 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.hashCode in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  core::print("FunctionTearOff");
+  nonNullableFunction.call;
+  let final core::Function? #t11 = nullableFunction in #t11 == null ?{core::Function?} null : #t11{core::Function}.call;
+  nonNullableFunctionType.call;
+  let final () →? core::int #t12 = nullableFunctionType in #t12 == null ?{() →? core::int} null : #t12{() → core::int}.call;
+  nonNullableTypeVariable1.call;
+  let final self::test::T1? #t13 = nullableTypeVariable1 in #t13 == null ?{self::test::T1?} null : #t13{self::test::T1}.call;
+  nonNullableTypeVariable2.call;
+  let final self::test::T2? #t14 = nullableTypeVariable2 in #t14 == null ?{self::test::T2?} null : #t14{self::test::T2}.call;
+  const dynamic function_tearOff = invalid-expression "pkg/front_end/testcases/none/property_get.dart:106:36: Error: Not a constant expression.
+  const dynamic function_tearOff = nonNullableFunction.call;
+                                   ^^^^^^^^^^^^^^^^^^^";
+  core::print(invalid-expression "pkg/front_end/testcases/none/property_get.dart:106:36: Error: Not a constant expression.
+  const dynamic function_tearOff = nonNullableFunction.call;
+                                   ^^^^^^^^^^^^^^^^^^^");
+  core::print("DynamicGet (Invalid)");
+  invalid-expression "pkg/front_end/testcases/none/property_get.dart:110:27: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass1.method().field;
+                          ^" in nonNullableClass1.{self::Class1::method}{<inapplicable>}.(){() → invalid-type}{<invalid>}.field;
+  core::print("DynamicGet (Unresolved)");
+  invalid-expression "pkg/front_end/testcases/none/property_get.dart:113:21: Error: The getter 'unresolved' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/none/property_get.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
+  nonNullableClass1.unresolved;
+                    ^^^^^^^^^^" in nonNullableClass1{<unresolved>}.unresolved;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "foo"
+  #C2 = 3
+  #C3 = static-tearoff self::Class1::staticMethod
+  #C4 = static-tearoff self::topLevelMethod
+}
diff --git a/pkg/front_end/testcases/none/property_set.dart.weak.modular.expect b/pkg/front_end/testcases/none/property_set.dart.weak.modular.expect
new file mode 100644
index 0000000..b7f6716
--- /dev/null
+++ b/pkg/front_end/testcases/none/property_set.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/none/property_set.dart:18:34: Error: Not a constant expression.
+//   const int set_instance_field = nonNullableClass1.field = 42;
+//                                  ^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/none/property_set.dart:18:58: Error: Not a constant expression.
+//   const int set_instance_field = nonNullableClass1.field = 42;
+//                                                          ^
+//
+// pkg/front_end/testcases/none/property_set.dart:23:33: Error: Not a constant expression.
+//   const int set_dynamic_field = dyn.field = 42;
+//                                 ^^^
+//
+// pkg/front_end/testcases/none/property_set.dart:23:43: Error: Not a constant expression.
+//   const int set_dynamic_field = dyn.field = 42;
+//                                           ^
+//
+// pkg/front_end/testcases/none/property_set.dart:29:27: Error: Too few positional arguments: 1 required, 0 given.
+//   nonNullableClass1.method().field = 42;
+//                           ^
+//
+// pkg/front_end/testcases/none/property_set.dart:32:21: Error: The setter 'unresolved' isn't defined for the class 'Class1'.
+//  - 'Class1' is from 'pkg/front_end/testcases/none/property_set.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+//   nonNullableClass1.unresolved = 42;
+//                     ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class1 extends core::Object {
+  field core::int field;
+  constructor •(core::int field) → self::Class1
+    : self::Class1::field = field, super core::Object::•()
+    ;
+  method method(dynamic o) → dynamic {}
+}
+static method test(self::Class1 nonNullableClass1, self::Class1? nullableClass1, dynamic dyn, Never never) → dynamic {
+  core::print("InstanceSet");
+  nonNullableClass1.{self::Class1::field} = 42;
+  let final self::Class1? #t1 = nullableClass1 in #t1 == null ?{core::int?} null : #t1{self::Class1}.{self::Class1::field} = 42;
+  const core::int set_instance_field = invalid-expression "pkg/front_end/testcases/none/property_set.dart:18:58: Error: Not a constant expression.
+  const int set_instance_field = nonNullableClass1.field = 42;
+                                                         ^";
+  core::print("DynamicSet");
+  dyn{dynamic}.field = 42;
+  let final dynamic #t2 = dyn in #t2 == null ?{core::int?} null : #t2{dynamic}.field = 42;
+  const core::int set_dynamic_field = invalid-expression "pkg/front_end/testcases/none/property_set.dart:23:43: Error: Not a constant expression.
+  const int set_dynamic_field = dyn.field = 42;
+                                          ^";
+  core::print("DynamicSet (Never)");
+  (let final Never #t3 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")){Never}.field = 42;
+  core::print("DynamicSet (Invalid)");
+  invalid-expression "pkg/front_end/testcases/none/property_set.dart:29:27: Error: Too few positional arguments: 1 required, 0 given.
+  nonNullableClass1.method().field = 42;
+                          ^" in nonNullableClass1.{self::Class1::method}{<inapplicable>}.(){() → invalid-type}{<invalid>}.field = 42;
+  core::print("DynamicSet (Unresolved)");
+  invalid-expression "pkg/front_end/testcases/none/property_set.dart:32:21: Error: The setter 'unresolved' isn't defined for the class 'Class1'.
+ - 'Class1' is from 'pkg/front_end/testcases/none/property_set.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+  nonNullableClass1.unresolved = 42;
+                    ^^^^^^^^^^" in nonNullableClass1{<unresolved>}.unresolved = 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..3be713b
--- /dev/null
+++ b/pkg/front_end/testcases/none/tearoff_opt_out.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  method call() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::Class* c) → dynamic {
+  core::Function* f = let final self::Class* #t1 = c in #t1 == null ?{() →* void} null : #t1.{self::Class::call}{() →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.modular.expect
new file mode 100644
index 0000000..ebbaed4
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart.weak.modular.expect
@@ -0,0 +1,218 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:20:17: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// bar3a<X extends B<A<int>>>() => throw 42;
+//                 ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:21:19: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// bar3b<X extends A<B<A<int>>>>() => throw 42;
+//                   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:23:22: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bar1<X extends B<A<int>>> {
+//                      ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:26:22: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar13<X extends B<A<int>>>() => throw 42;
+//                      ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:29:24: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bar2<X extends A<B<A<int>>>> {
+//                        ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:32:24: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar23<X extends A<B<A<int>>>>() => throw 42;
+//                        ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:14:1: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// B<A<int>> bar1a() => throw 42;
+// ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:15:3: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<B<A<int>>> bar1b() => throw 42;
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:17:7: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// bar2a(B<A<int>> x) => throw 42;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:18:9: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// bar2b(A<B<A<int>>> x) => throw 42;
+//         ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:24:3: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   B<A<int>> barBar11() => throw 42;
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:25:12: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar12(B<A<int>> x) => throw 42;
+//            ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:30:5: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<B<A<int>>> barBar21() => throw 42;
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:31:14: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   barBar22(A<B<A<int>>> x) => throw 42;
+//              ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:35:16: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef Baz1 = B<A<int>>;
+//                ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:36:18: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef Baz2 = A<B<A<int>>>;
+//                  ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:10:3: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   B<A<int>> x1;
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:11:5: Error: Type argument 'A<int>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<B<A<int>>> x2;
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef B<X extends self::A<X> = self::A<dynamic>> = self::A<X>;
+typedef Baz1 = self::A<self::A<core::int>>;
+typedef Baz2 = self::A<self::A<self::A<core::int>>>;
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+class Bar1<X extends self::A<self::A<core::int>>> extends core::Object {
+  synthetic constructor •() → self::Bar1<self::Bar1::X>
+    : super core::Object::•()
+    ;
+  method barBar11() → self::A<self::A<core::int>>
+    return throw 42;
+  method barBar12(self::A<self::A<core::int>> x) → dynamic
+    return throw 42;
+  method barBar13<X extends self::A<self::A<core::int>>>() → dynamic
+    return throw 42;
+}
+class Bar2<X extends self::A<self::A<self::A<core::int>>>> extends core::Object {
+  synthetic constructor •() → self::Bar2<self::Bar2::X>
+    : super core::Object::•()
+    ;
+  method barBar21() → self::A<self::A<self::A<core::int>>>
+    return throw 42;
+  method barBar22(self::A<self::A<self::A<core::int>>> x) → dynamic
+    return throw 42;
+  method barBar23<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
+    return throw 42;
+}
+static method foo() → dynamic {
+  self::A<self::A<core::int>> x1;
+  self::A<self::A<self::A<core::int>>> x2;
+}
+static method bar1a() → self::A<self::A<core::int>>
+  return throw 42;
+static method bar1b() → self::A<self::A<self::A<core::int>>>
+  return throw 42;
+static method bar2a(self::A<self::A<core::int>> x) → dynamic
+  return throw 42;
+static method bar2b(self::A<self::A<self::A<core::int>>> x) → dynamic
+  return throw 42;
+static method bar3a<X extends self::A<self::A<core::int>>>() → dynamic
+  return throw 42;
+static method bar3b<X extends self::A<self::A<self::A<core::int>>>>() → dynamic
+  return throw 42;
+static method main() → dynamic {}
+static method _#B#new#tearOff<X extends self::A<self::_#B#new#tearOff::X> = self::A<dynamic>>() → self::A<self::_#B#new#tearOff::X>
+  return new self::A::•<self::_#B#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..94e4635
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:10:28: Error: Type argument 'String' doesn't conform to the bound 'int' of the type variable 'X' on 'C'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef B<X extends int> = C<String>;
+//                            ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:11:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef C<X extends int> = X;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:9:28: Error: Type argument 'String' doesn't conform to the bound 'int' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// typedef A<X extends int> = B<String>;
+//                            ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends int> = C<String>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:6:3: Error: Type argument 'String' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   A<String> a;
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_in_typedef.dart:9:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends int> = B<String>;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A<unrelated X extends core::int> = core::String;
+typedef B<unrelated X extends core::int> = core::String;
+typedef C<X extends core::int> = X;
+static method foo() → dynamic {
+  core::String a;
+}
+static method main() → dynamic {}
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+  return core::String::fromCharCodes(charCodes, start, end);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+  return core::String::fromCharCode(charCode);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#A#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+  return core::String::fromEnvironment(name, defaultValue: defaultValue);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCodes#tearOff<unrelated X extends core::int>(core::Iterable<core::int> charCodes, [core::int start = #C1, core::int? end = #C2]) → core::String
+  return core::String::fromCharCodes(charCodes, start, end);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromCharCode#tearOff<unrelated X extends core::int>(core::int charCode) → core::String
+  return core::String::fromCharCode(charCode);
+static method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/string_patch.dart */ _#B#fromEnvironment#tearOff<unrelated X extends core::int>(core::String name, {core::String defaultValue = #C3}) → core::String
+  return core::String::fromEnvironment(name, defaultValue: defaultValue);
+
+constants  {
+  #C1 = 0
+  #C2 = null
+  #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.modular.expect
new file mode 100644
index 0000000..cf0d7b6
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_main.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///aliased_checks_no_bodies_lib.dart";
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_lib.dart:9:19: Error: Type argument 'int' doesn't conform to the bound 'String' of the type variable 'X' on 'B'.
+// Try changing type arguments so that they conform to the bounds.
+// class C<Y extends B<int>> {}
+//                   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/aliased_checks_no_bodies_lib.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends String> = A;
+//           ^
+//
+import self as self2;
+import "dart:core" as core;
+
+typedef B<unrelated X extends core::String> = self2::A;
+class A extends core::Object {
+  synthetic constructor •() → self2::A
+    : super core::Object::•()
+    ;
+}
+class C<Y extends self2::A> extends core::Object {
+  synthetic constructor •() → self2::C<self2::C::Y>
+    : super core::Object::•()
+    ;
+}
+static method _#B#new#tearOff<unrelated X extends core::String>() → self2::A
+  return new self2::A::•();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.modular.expect
new file mode 100644
index 0000000..1527b5e
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A Function()>' because 'FutureOr<A Function()>' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
+//   FutureOr<AAlias> foLegacyNonNullable = null; // error
+//                                          ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
+//   FutureOr<AAliasNonNullable> foNonNullable = null; // error
+//                                               ^
+//
+import self as self;
+import "issue41501_lib.dart" as opt;
+
+import "dart:async";
+import "org-dartlang-testcase:///issue41501_lib.dart";
+
+typedef AAliasNonNullable = opt::A;
+typedef AAliasNullable = opt::A?;
+static method test() → dynamic {
+  FutureOr<() → opt::A*>foLegacyNonNullable = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A Function()>' because 'FutureOr<A Function()>' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
+  FutureOr<AAlias> foLegacyNonNullable = null; // error
+                                         ^" in null as{TypeError,ForNonNullableByDefault} FutureOr<() → opt::A*>;
+  FutureOr<() →? opt::A*>foLegacyNullable = null;
+  FutureOr<opt::A>foNonNullable = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: The value 'null' can't be assigned to a variable of type 'FutureOr<A>' because 'FutureOr<A>' is not nullable.
+ - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
+  FutureOr<AAliasNonNullable> foNonNullable = null; // error
+                                              ^" in null as{TypeError,ForNonNullableByDefault} FutureOr<opt::A>;
+  FutureOr<opt::A?>foNullable = null;
+  FutureOr<opt::A?>foNonNullableNullable = null;
+  FutureOr<opt::A?>foNullableNullable = null;
+}
+static method main() → dynamic {}
+
+library opted_out_lib;
+import self as opt;
+import "dart:core" as core;
+
+import "dart:async";
+import "org-dartlang-testcase:///issue41501.dart";
+
+typedef AAlias = () →* opt::A*;
+class A extends core::Object {
+  synthetic constructor •() → opt::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  FutureOr<() →* opt::A*>* foLegacy = null;
+  FutureOr<opt::A*>* foNonNullable = null;
+  FutureOr<opt::A*>* foNullable = null;
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart.weak.modular.expect
new file mode 100644
index 0000000..99ac769
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart.weak.modular.expect
@@ -0,0 +1,75 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:15:3: Error: Inferred type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   A(); // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:17:3: Error: Inferred type argument 'A2<Object?>' doesn't conform to the bound 'A2<X>' of the type variable 'X' on 'A2'.
+//  - 'A2' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   A2(); // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:8:10: Context: This is the type variable whose bound isn't conformed to.
+// class A2<X extends A2<X>> {
+//          ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:14:3: Error: Inferred type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B(); // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:6:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:16:3: Error: Inferred type argument 'A2<Object?>' doesn't conform to the bound 'A2<X>' of the type variable 'X' on 'B2'.
+//  - 'A2' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B2(); // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:11:12: Context: This is the type variable whose bound isn't conformed to.
+// typedef B2<X extends A2<X>> = A2<X>;
+//            ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:16:3: Error: Inferred type argument 'A2<Object?>' doesn't conform to the bound 'A2<X>' of the type variable 'X' on 'A2'.
+//  - 'A2' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B2(); // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue42446.dart:8:10: Context: This is the type variable whose bound isn't conformed to.
+// class A2<X extends A2<X>> {
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef B<X extends self::A<X> = self::A<dynamic>> = self::A<X>;
+typedef B2<X extends self::A2<X> = self::A2<dynamic>> = self::A2<X>;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class A2<X extends self::A2<self::A2::X> = self::A2<dynamic>> extends core::Object {
+  static factory •<X extends self::A2<self::A2::•::X> = self::A2<dynamic>>() → self::A2<self::A2::•::X>
+    return throw 42;
+}
+static method foo() → dynamic {
+  new self::A::•<self::A<core::Object?>>();
+  new self::A::•<self::A<core::Object?>>();
+  self::A2::•<self::A2<core::Object?>>();
+  self::A2::•<self::A2<core::Object?>>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.modular.expect
new file mode 100644
index 0000000..ae8fcc4
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45051.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef BAlias = self::B;
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2]/*isLegacy*/;
+  static factory •() → self::A
+    return new self::B::•();
+  static factory named() → self::A
+    return new self::B::named();
+}
+class B extends core::Object implements self::A {
+  constructor •() → self::B
+    : super core::Object::•()
+    ;
+  constructor named() → self::B
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = constructor-tearoff self::A::•
+  #C2 = constructor-tearoff self::A::named
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart.weak.modular.expect
new file mode 100644
index 0000000..61ac447
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart.weak.modular.expect
@@ -0,0 +1,160 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:32:9: Error: Inferred type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     new A();
+//         ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:13:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:34:7: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'call'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     f1(() => captureTypeArgument());
+//       ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:35:7: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'call'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     f2(() => captureTypeArgument());
+//       ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:36:11: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'local1'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     local1(() => captureTypeArgument());
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:37:11: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'local2'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     local2(() => captureTypeArgument());
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:38:5: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'topLevel1'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     topLevel1(() => captureTypeArgument());
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:16:16: Context: This is the type variable whose bound isn't conformed to.
+// void topLevel1<X extends A<X>>(A<X> Function() g) => g();
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:39:5: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'topLevel2'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     topLevel2(() => captureTypeArgument());
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:18:16: Context: This is the type variable whose bound isn't conformed to.
+// void topLevel2<X extends C<X>>(C<X> Function() g) => g();
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:40:5: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'Class.instance1'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     instance1(() => captureTypeArgument());
+//     ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:41:5: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'Class.instance2'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+//  - 'Class' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     instance2(() => captureTypeArgument());
+//     ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:33:9: Error: Inferred type argument 'A<Object?>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'C'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     new C();
+//         ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:14:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef C<X extends A<X>> = A<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:47:11: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'Subclass.instance1'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+//  - 'Subclass' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     super.instance1(() => captureTypeArgument());
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart:48:11: Error: Inferred type argument 'Object?' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'Subclass.instance2'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+//  - 'Subclass' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45464.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//     super.instance2(() => captureTypeArgument());
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef C<X extends self::A<X> = self::A<dynamic>> = self::A<X>;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+class Class extends core::Object {
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  method instance1<X extends self::A<self::Class::instance1::X> = self::A<dynamic>>(() → self::A<self::Class::instance1::X> g) → void
+    return g(){() → self::A<self::Class::instance1::X>};
+  method instance2<X extends self::A<self::Class::instance2::X> = self::A<dynamic>>(() → self::A<self::Class::instance2::X> g) → void
+    return g(){() → self::A<self::Class::instance2::X>};
+  method test() → void {
+    function local1<X extends self::A<X> = self::A<dynamic>>(() → self::A<X> g) → void
+      return g(){() → self::A<X>};
+    function local2<X extends self::A<X> = self::A<dynamic>>(() → self::A<X> g) → void
+      return g(){() → self::A<X>};
+    <X extends self::A<X> = self::A<dynamic>>(() → self::A<X>) → void f1 = local1;
+    <X extends self::A<X> = self::A<dynamic>>(() → self::A<X>) → void f2 = local2;
+    new self::A::•<self::A<core::Object?>>();
+    new self::A::•<self::A<core::Object?>>();
+    f1<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>()){(() → self::A<core::Object?>) → void};
+    f2<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>()){(() → self::A<core::Object?>) → void};
+    local1<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>()){(() → self::A<core::Object?>) → void};
+    local2<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>()){(() → self::A<core::Object?>) → void};
+    self::topLevel1<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>());
+    self::topLevel2<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>());
+    this.{self::Class::instance1}<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>()){(() → self::A<core::Object?>) → void};
+    this.{self::Class::instance2}<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>()){(() → self::A<core::Object?>) → void};
+  }
+}
+class Subclass extends self::Class {
+  synthetic constructor •() → self::Subclass
+    : super self::Class::•()
+    ;
+  method test() → void {
+    super.{self::Class::instance1}<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>());
+    super.{self::Class::instance2}<core::Object?>(() → self::A<core::Object?> => self::captureTypeArgument<self::A<core::Object?>>());
+  }
+}
+static field core::Type? _capturedTypeArgument;
+static method captureTypeArgument<X extends core::Object? = dynamic>() → self::captureTypeArgument::X% {
+  self::_capturedTypeArgument = self::captureTypeArgument::X%;
+  core::print("X: ${self::captureTypeArgument::X%}");
+  throw "Error";
+}
+static method topLevel1<X extends self::A<self::topLevel1::X> = self::A<dynamic>>(() → self::A<self::topLevel1::X> g) → void
+  return g(){() → self::A<self::topLevel1::X>};
+static method topLevel2<X extends self::A<self::topLevel2::X> = self::A<dynamic>>(() → self::A<self::topLevel2::X> g) → void
+  return g(){() → self::A<self::topLevel2::X>};
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45491.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45491.dart.weak.modular.expect
new file mode 100644
index 0000000..ada86f5
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45491.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45491.dart:7:21: Error: Inferred type argument 'A<dynamic>' doesn't conform to the bound 'A<X>' of the type variable 'X' on 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45491.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+// typedef AAlias<X> = A;
+//                     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45491.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>> {}
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef AAlias<unrelated X extends core::Object? = dynamic> = self::A<self::A<dynamic>>;
+class A<X extends self::A<self::A::X> = self::A<dynamic>> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
+static method _#AAlias#new#tearOff<unrelated X extends core::Object? = dynamic>() → self::A<self::A<dynamic>>
+  return new self::A::•<self::A<dynamic>>();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.modular.expect
new file mode 100644
index 0000000..0d5fcd0
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:10:3: Error: Inferred type argument 'C<dynamic> Function(C<dynamic>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   A a = throw 42; // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:7:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends G<C<X>>> = C<X>;
+//           ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart:10:3: Context: If you want 'A<C<dynamic> Function(C<dynamic>)>' to be a super-bounded type, note that the inverted type 'A<G<C<Never>>>' must then satisfy its bounds, which it does not.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519.dart'.
+//   A a = throw 42; // Error.
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant X extends core::Object? = dynamic> = (X%) → X%;
+typedef A<X extends (self::C<X>) → self::C<X> = (self::C<dynamic>) → self::C<dynamic>> = self::C<X>;
+class C<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X%>
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  self::C<(self::C<dynamic>) → self::C<dynamic>> a = throw 42;
+}
+static method main() → dynamic {}
+static method _#A#new#tearOff<X extends (self::C<self::_#A#new#tearOff::X>) → self::C<self::_#A#new#tearOff::X> = (self::C<dynamic>) → self::C<dynamic>>() → self::C<self::_#A#new#tearOff::X>
+  return new self::C::•<self::_#A#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.modular.expect
new file mode 100644
index 0000000..14a187b
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart.weak.modular.expect
@@ -0,0 +1,115 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:21:5: Error: Inferred type argument 'C<Object?> Function(C<Never>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   A.foo(); // Error.
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:16:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends G<C<X>>> = C<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:23:3: Error: Inferred type argument 'D<Object?> Function(D<Never>)' doesn't conform to the bound 'D<X> Function(D<X>)' of the type variable 'X' on 'B'.
+//  - 'D' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B(); // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:17:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends G<D<X>>> = D<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:20:3: Error: Inferred type argument 'C<Object?> Function(C<Never>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   A(); // Error.
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:16:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends G<C<X>>> = C<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:22:5: Error: Inferred type argument 'C<Object?> Function(C<Never>)' doesn't conform to the bound 'C<X> Function(C<X>)' of the type variable 'X' on 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   A.bar(); // Error.
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:16:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends G<C<X>>> = C<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:24:5: Error: Inferred type argument 'D<Object?> Function(D<Never>)' doesn't conform to the bound 'D<X> Function(D<X>)' of the type variable 'X' on 'B'.
+//  - 'D' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B.foo(); // Error.
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:17:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends G<D<X>>> = D<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:25:5: Error: Inferred type argument 'D<Object?> Function(D<Never>)' doesn't conform to the bound 'D<X> Function(D<X>)' of the type variable 'X' on 'B'.
+//  - 'D' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   B.bar(); // Error.
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45519_2.dart:17:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef B<X extends G<D<X>>> = D<X>;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef G<invariant X extends core::Object? = dynamic> = (X%) → X%;
+typedef A<X extends (self::C<X>) → self::C<X> = (self::C<dynamic>) → self::C<dynamic>> = self::C<X>;
+typedef B<X extends (self::D<X>) → self::D<X> = (self::D<dynamic>) → self::D<dynamic>> = self::D<X>;
+class C<X extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1]/*isLegacy*/;
+  constructor foo() → self::C<self::C::X%>
+    : super core::Object::•() {}
+  static factory •<X extends core::Object? = dynamic>() → self::C<self::C::•::X%>
+    return new self::C::foo<self::C::•::X%>();
+  static factory bar<X extends core::Object? = dynamic>() → self::C<self::C::bar::X%>
+    return self::C::•<self::C::bar::X%>();
+}
+class D<X extends core::Object? = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C2]/*isLegacy*/;
+  constructor •() → self::D<self::D::X%>
+    : super core::Object::•()
+    ;
+  static factory foo<X extends core::Object? = dynamic>() → self::D<self::D::foo::X%>
+    return new self::D::•<self::D::foo::X%>();
+  static factory bar<X extends core::Object? = dynamic>() → self::D<self::D::bar::X%>
+    return new self::D::•<self::D::bar::X%>();
+}
+static method test() → dynamic {
+  self::C::•<(self::C<Never>) → self::C<core::Object?>>();
+  new self::C::foo<(self::C<Never>) → self::C<core::Object?>>();
+  self::C::•<(self::C<Never>) → self::C<core::Object?>>();
+  new self::D::•<(self::D<Never>) → self::D<core::Object?>>();
+  self::D::foo<(self::D<Never>) → self::D<core::Object?>>();
+  new self::D::•<(self::D<Never>) → self::D<core::Object?>>();
+}
+static method main() → dynamic {}
+static method _#A#new#tearOff<X extends (self::C<self::_#A#new#tearOff::X>) → self::C<self::_#A#new#tearOff::X> = (self::C<dynamic>) → self::C<dynamic>>() → self::C<self::_#A#new#tearOff::X>
+  return self::C::•<self::_#A#new#tearOff::X>();
+static method _#A#foo#tearOff<X extends (self::C<self::_#A#foo#tearOff::X>) → self::C<self::_#A#foo#tearOff::X> = (self::C<dynamic>) → self::C<dynamic>>() → self::C<self::_#A#foo#tearOff::X>
+  return new self::C::foo<self::_#A#foo#tearOff::X>();
+static method _#A#bar#tearOff<X extends (self::C<self::_#A#bar#tearOff::X>) → self::C<self::_#A#bar#tearOff::X> = (self::C<dynamic>) → self::C<dynamic>>() → self::C<self::_#A#bar#tearOff::X>
+  return self::C::bar<self::_#A#bar#tearOff::X>();
+static method _#B#new#tearOff<X extends (self::D<self::_#B#new#tearOff::X>) → self::D<self::_#B#new#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#new#tearOff::X>
+  return new self::D::•<self::_#B#new#tearOff::X>();
+static method _#B#foo#tearOff<X extends (self::D<self::_#B#foo#tearOff::X>) → self::D<self::_#B#foo#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#foo#tearOff::X>
+  return self::D::foo<self::_#B#foo#tearOff::X>();
+static method _#B#bar#tearOff<X extends (self::D<self::_#B#bar#tearOff::X>) → self::D<self::_#B#bar#tearOff::X> = (self::D<dynamic>) → self::D<dynamic>>() → self::D<self::_#B#bar#tearOff::X>
+  return self::D::bar<self::_#B#bar#tearOff::X>();
+
+constants  {
+  #C1 = constructor-tearoff self::C::bar
+  #C2 = constructor-tearoff self::D::bar
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart.weak.modular.expect
new file mode 100644
index 0000000..84c660a
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart.weak.modular.expect
@@ -0,0 +1,126 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:10:23: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// class D implements C, C {}
+//                       ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:11:24: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// class D2 implements C, CAlias {}
+//                        ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:12:29: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// class D3 implements CAlias, C {}
+//                             ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:13:24: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// class D4 implements C, self.C {}
+//                        ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:14:29: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// class D5 implements self.C, C {}
+//                             ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:16:16: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// mixin CM on C, C {}
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:17:17: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// mixin CM2 on C, CAlias {}
+//                 ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:18:22: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// mixin CM3 on CAlias, C {}
+//                      ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:19:22: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// mixin CM4 on self.C, C {}
+//                      ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45626.dart:20:17: Error: 'C' can only be implemented once.
+// Try removing 1 of the occurrences.
+// mixin CM5 on C, self.C {}
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue45626.dart" as self;
+
+typedef CAlias = self::C;
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object implements self::C, self::C {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+class D2 extends core::Object implements self::C, self::C {
+  synthetic constructor •() → self::D2
+    : super core::Object::•()
+    ;
+}
+class D3 extends core::Object implements self::C, self::C {
+  synthetic constructor •() → self::D3
+    : super core::Object::•()
+    ;
+}
+class D4 extends core::Object implements self::C, self::C {
+  synthetic constructor •() → self::D4
+    : super core::Object::•()
+    ;
+}
+class D5 extends core::Object implements self::C, self::C {
+  synthetic constructor •() → self::D5
+    : super core::Object::•()
+    ;
+}
+abstract class _CM&C&C extends core::Object implements self::C, self::C /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_CM&C&C
+    : super core::Object::•()
+    ;
+}
+abstract class CM extends self::_CM&C&C /*isMixinDeclaration*/  {
+}
+abstract class _CM2&C&CAlias extends core::Object implements self::C, self::C /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_CM2&C&CAlias
+    : super core::Object::•()
+    ;
+}
+abstract class CM2 extends self::_CM2&C&CAlias /*isMixinDeclaration*/  {
+}
+abstract class _CM3&CAlias&C extends core::Object implements self::C, self::C /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_CM3&CAlias&C
+    : super core::Object::•()
+    ;
+}
+abstract class CM3 extends self::_CM3&CAlias&C /*isMixinDeclaration*/  {
+}
+abstract class _CM4&C&C extends core::Object implements self::C, self::C /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_CM4&C&C
+    : super core::Object::•()
+    ;
+}
+abstract class CM4 extends self::_CM4&C&C /*isMixinDeclaration*/  {
+}
+abstract class _CM5&C&C extends core::Object implements self::C, self::C /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_CM5&C&C
+    : super core::Object::•()
+    ;
+}
+abstract class CM5 extends self::_CM5&C&C /*isMixinDeclaration*/  {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart.weak.modular.expect
new file mode 100644
index 0000000..0ed8715
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart:13:3: Error: Inferred type argument 'C<Object?>' doesn't conform to the bound 'C<X>' of the type variable 'X' on 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   A();
+//   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends C<X>> = C<X>;
+//           ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart:14:5: Error: Inferred type argument 'C<Object?>' doesn't conform to the bound 'C<X>' of the type variable 'X' on 'A'.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart'.
+//  - 'Object' is from 'dart:core'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   A.foo();
+//     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/issue45658.dart:10:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends C<X>> = C<X>;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A<X extends self::C<X> = self::C<dynamic>> = self::C<X>;
+class C<X extends core::Object? = dynamic> extends core::Object {
+  constructor •() → self::C<self::C::X%>
+    : super core::Object::•()
+    ;
+  static factory foo<X extends core::Object? = dynamic>() → self::C<self::C::foo::X%>
+    return new self::C::•<self::C::foo::X%>();
+}
+static method foo() → dynamic {
+  new self::C::•<self::C<core::Object?>>();
+  self::C::foo<self::C<core::Object?>>();
+}
+static method main() → dynamic {}
+static method _#A#new#tearOff<X extends self::C<self::_#A#new#tearOff::X> = self::C<dynamic>>() → self::C<self::_#A#new#tearOff::X>
+  return new self::C::•<self::_#A#new#tearOff::X>();
+static method _#A#foo#tearOff<X extends self::C<self::_#A#foo#tearOff::X> = self::C<dynamic>>() → self::C<self::_#A#foo#tearOff::X>
+  return self::C::foo<self::_#A#foo#tearOff::X>();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue_43084/issue_43084.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue_43084/issue_43084.dart.weak.modular.expect
new file mode 100644
index 0000000..da53398
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue_43084/issue_43084.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "issue_43084_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue_43084_lib.dart";
+
+static method main() → dynamic {
+  iss::Foo<core::int*>* x = new iss::Foo::•<core::int*>();
+  core::print(x);
+}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.expect
index 1a2fe24..6095355 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.transformed.expect
index 5dac514..62c7762 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.strong.transformed.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.expect
index 1a2fe24..6095355 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.modular.expect
new file mode 100644
index 0000000..6095355
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.modular.expect
@@ -0,0 +1,383 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:32:18: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// class D1 extends TAlias<A> {}
+//                  ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:34:19: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// class D1a extends prefix.TAlias<A> {}
+//                   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:36:19: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// class D1b extends TAlias<prefix.A> {}
+//                   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:38:21: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// class D2 implements TAlias<A> {}
+//                     ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:19: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// class D3 = A with TAlias<B>;
+//                   ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// class D4 = A with B implements TAlias<C>;
+//                                ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:25: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// class D5 extends A with TAlias<B> {}
+//                         ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// mixin N1 on TAlias<A> {}
+//             ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:48:14: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// mixin N1a on prefix.TAlias<A> {}
+//              ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:50:14: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// mixin N1b on TAlias<prefix.A> {}
+//              ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:52:16: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// mixin N2 on A, TAlias<B> {}
+//                ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:54:26: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
+// mixin N3 on A implements TAlias<B> {}
+//                          ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:16: Context: This is the type variable ultimately denoted.
+// typedef TAlias<T> = T?;
+//                ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class C1 extends AAlias {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:11:9: Context: The issue arises via this type alias.
+// typedef AAlias = A?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:18:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class C2 implements AAlias {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:11:9: Context: The issue arises via this type alias.
+// typedef AAlias = A?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:20:7: Error: The type 'BAlias' which is an alias of 'B?' can't be used as supertype because it is nullable.
+//  - 'B' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class C3 = A with BAlias;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:12:9: Context: The issue arises via this type alias.
+// typedef BAlias = B?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:22:7: Error: The type 'CAlias' which is an alias of 'C?' can't be used as supertype because it is nullable.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class C4 = A with B implements CAlias;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:13:9: Context: The issue arises via this type alias.
+// typedef CAlias = C?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:24:7: Error: The type 'BAlias' which is an alias of 'B?' can't be used as supertype because it is nullable.
+//  - 'B' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class C5 extends A with BAlias {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:12:9: Context: The issue arises via this type alias.
+// typedef BAlias = B?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:26:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// mixin M1 on AAlias {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:11:9: Context: The issue arises via this type alias.
+// typedef AAlias = A?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:28:7: Error: The type 'BAlias' which is an alias of 'B?' can't be used as supertype because it is nullable.
+//  - 'B' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// mixin M2 on A, BAlias {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:12:9: Context: The issue arises via this type alias.
+// typedef BAlias = B?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:30:7: Error: The type 'BAlias' which is an alias of 'B?' can't be used as supertype because it is nullable.
+//  - 'B' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// mixin M3 on A implements BAlias {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:12:9: Context: The issue arises via this type alias.
+// typedef BAlias = B?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:32:7: Error: The type 'TAlias<A>' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class D1 extends TAlias<A> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:34:7: Error: The type 'prefix.TAlias<A>' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class D1a extends prefix.TAlias<A> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:36:7: Error: The type 'TAlias<prefix.A>' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class D1b extends TAlias<prefix.A> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:38:7: Error: The type 'TAlias<A>' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class D2 implements TAlias<A> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias<B>' which is an alias of 'B?' can't be used as supertype because it is nullable.
+//  - 'B' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:7: Error: The type 'TAlias<C>' which is an alias of 'C?' can't be used as supertype because it is nullable.
+//  - 'C' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class D4 = A with B implements TAlias<C>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias<B>' which is an alias of 'B?' can't be used as supertype because it is nullable.
+//  - 'B' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:7: Error: The type 'TAlias<A>' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// mixin N1 on TAlias<A> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:48:7: Error: The type 'prefix.TAlias<A>' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// mixin N1a on prefix.TAlias<A> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:50:7: Error: The type 'TAlias<prefix.A>' which is an alias of 'A?' can't be used as supertype because it is nullable.
+//  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// mixin N1b on TAlias<prefix.A> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:52:7: Error: The type 'TAlias<B>' which is an alias of 'B?' can't be used as supertype because it is nullable.
+//  - 'B' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// mixin N2 on A, TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:54:7: Error: The type 'TAlias<B>' which is an alias of 'B?' can't be used as supertype because it is nullable.
+//  - 'B' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
+// mixin N3 on A implements TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///nullable_supertypes.dart" as prefix;
+
+typedef AAlias = self::A?;
+typedef BAlias = self::B?;
+typedef CAlias = self::C?;
+typedef TAlias<T extends core::Object? = dynamic> = T?;
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends self::A {
+  synthetic constructor •() → self::C3
+    : super self::A::•()
+    ;
+}
+class C4 = self::A with self::B {
+  synthetic constructor •() → self::C4
+    : super self::A::•()
+    ;
+}
+abstract class _C5&A&BAlias extends self::A /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C5&A&BAlias
+    : super self::A::•()
+    ;
+}
+class C5 extends self::_C5&A&BAlias {
+  synthetic constructor •() → self::C5
+    : super self::_C5&A&BAlias::•()
+    ;
+}
+abstract class M1 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class _M2&A&BAlias extends core::Object implements self::A /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_M2&A&BAlias
+    : super core::Object::•()
+    ;
+}
+abstract class M2 extends self::_M2&A&BAlias /*isMixinDeclaration*/  {
+}
+abstract class M3 extends self::A /*isMixinDeclaration*/  {
+}
+class D1 extends core::Object {
+  synthetic constructor •() → self::D1
+    : super core::Object::•()
+    ;
+}
+class D1a extends core::Object {
+  synthetic constructor •() → self::D1a
+    : super core::Object::•()
+    ;
+}
+class D1b extends core::Object {
+  synthetic constructor •() → self::D1b
+    : super core::Object::•()
+    ;
+}
+class D2 extends core::Object {
+  synthetic constructor •() → self::D2
+    : super core::Object::•()
+    ;
+}
+class D3 extends self::A {
+  synthetic constructor •() → self::D3
+    : super self::A::•()
+    ;
+}
+class D4 = self::A with self::B {
+  synthetic constructor •() → self::D4
+    : super self::A::•()
+    ;
+}
+abstract class _D5&A&TAlias extends self::A /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D5&A&TAlias
+    : super self::A::•()
+    ;
+}
+class D5 extends self::_D5&A&TAlias {
+  synthetic constructor •() → self::D5
+    : super self::_D5&A&TAlias::•()
+    ;
+}
+abstract class N1 extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class N1a extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class N1b extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class _N2&A&TAlias extends core::Object implements self::A /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_N2&A&TAlias
+    : super core::Object::•()
+    ;
+}
+abstract class N2 extends self::_N2&A&TAlias /*isMixinDeclaration*/  {
+}
+abstract class N3 extends self::A /*isMixinDeclaration*/  {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.outline.expect
index a0cf738..22df973 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.outline.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.transformed.expect
index 5dac514..62c7762 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart.weak.transformed.expect
@@ -37,13 +37,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
-// class D3 = A with TAlias<B>;
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:42:32: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // class D4 = A with B implements TAlias<C>;
 //                                ^
@@ -58,13 +51,6 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
-// class D5 extends A with TAlias<B> {}
-//       ^
-// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
-// typedef TAlias<T> = T?;
-//         ^
-//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:46:13: Error: Can't use a typedef denoting a type variable as a constructor, nor for a static member access.
 // mixin N1 on TAlias<A> {}
 //             ^
@@ -100,6 +86,20 @@
 // typedef TAlias<T> = T?;
 //                ^
 //
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:40:7: Error: The type 'TAlias' can't be mixed in.
+// class D3 = A with TAlias<B>;
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:44:7: Error: The type 'TAlias' can't be mixed in.
+// class D5 extends A with TAlias<B> {}
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:14:9: Context: The issue arises via this type alias.
+// typedef TAlias<T> = T?;
+//         ^
+//
 // pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart:16:7: Error: The type 'AAlias' which is an alias of 'A?' can't be used as supertype because it is nullable.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/nullable_supertypes.dart'.
 // class C1 extends AAlias {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/old_version.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/old_version.dart.weak.modular.expect
new file mode 100644
index 0000000..104aeb2
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/old_version.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/old_version.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef A = int;
+//           ^
+//
+import self as self;
+
+typedef A = invalid-type;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.modular.expect
new file mode 100644
index 0000000..1dd5191
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart:9:7: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   new A<dynamic, String>();
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls.dart:6:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends num, Y> = C<X>;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self::C<X>;
+class C<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X%>
+    : super core::Object::•()
+    ;
+}
+static method foo() → dynamic {
+  new self::C::•<dynamic>();
+}
+static method main() → dynamic {}
+static method _#A#new#tearOff<X extends core::num, unrelated Y extends core::Object? = dynamic>() → self::C<self::_#A#new#tearOff::X>
+  return new self::C::•<self::_#A#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.modular.expect
new file mode 100644
index 0000000..f7eab09
--- /dev/null
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_main.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_lib.dart";
+
+static method main() → dynamic {}
+
+library unaliased_bounds_checks_in_constructor_calls_with_parts_lib /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart:11:7: Error: Type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+//   new A<dynamic, String>();
+//       ^
+// pkg/front_end/testcases/nonfunction_type_aliases/unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart:8:11: Context: This is the type variable whose bound isn't conformed to.
+// typedef A<X extends num, Y> = C<X>;
+//           ^
+//
+import self as self2;
+import "dart:core" as core;
+
+part ./unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart;
+typedef A<X extends core::num, unrelated Y extends core::Object? = dynamic> = self2::C<X>;
+class C<X extends core::Object? = dynamic> extends core::Object { // from org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart
+  synthetic constructor •() → self2::C<self2::C::X%>
+    : super core::Object::•()
+    ;
+}
+static method /* from org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart */ foo() → dynamic {
+  new self2::C::•<dynamic>();
+}
+static method /* from org-dartlang-testcase:///unaliased_bounds_checks_in_constructor_calls_with_parts_part_lib.dart */ _#A#new#tearOff<X extends core::num, unrelated Y extends core::Object? = dynamic>() → self2::C<self2::_#A#new#tearOff::X>
+  return new self2::C::•<self2::_#A#new#tearOff::X>();
diff --git a/pkg/front_end/testcases/rasta/abstract_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/abstract_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..bbfdd17
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/abstract_constructor.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/abstract_constructor.dart:8:7: Error: The class 'C' is abstract and can't be instantiated.
+//   new C();
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  throw new core::AbstractClassInstantiationError::•("C");
+}
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.weak.modular.expect
new file mode 100644
index 0000000..c1d156b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   const C() : this.x(1);
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::C*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  const C() : this.x(1);
+                    ^"
+    ;
+  const constructor x() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•();
+  invalid-expression "pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  const C() : this.x(1);
+                    ^";
+}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bad_constructor_redirection.dart:
+- C. (from org-dartlang-testcase:///bad_constructor_redirection.dart:6:9)
diff --git a/pkg/front_end/testcases/rasta/bad_continue.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_continue.dart.weak.modular.expect
new file mode 100644
index 0000000..755a3f3
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_continue.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:6:3: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   continue here;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:6:12: Error: Can't find label 'here'.
+// Try defining the label, or correcting the name to match an existing label.
+//   continue here;
+//            ^
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:7:10: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   label: continue label;
+//          ^^^^^^^^
+//
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/bad_continue.dart:6:12: Error: Can't find label 'here'.
+Try defining the label, or correcting the name to match an existing label.
+  continue here;
+           ^";
+  #L1:
+  break #L1;
+}
diff --git a/pkg/front_end/testcases/rasta/bad_default_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..864e20e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_default_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_default_constructor.dart:9:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : invalid-initializer
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  invalid-expression "pkg/front_end/testcases/rasta/bad_default_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const B();
+        ^";
+}
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..f42bd18
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
+//   const B() : super();
+//                    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
+  const B() : super();
+                   ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  invalid-expression "pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
+  const B() : super();
+                   ^";
+}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bad_explicit_super_constructor.dart:
+- B. (from org-dartlang-testcase:///bad_explicit_super_constructor.dart:10:9)
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..add2a41
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+//   const B();
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.
+//   A(this.x);
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.
+  A(this.x);
+         ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A /*hasConstConstructor*/  {
+  const constructor •() → self::B*
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  const B();
+        ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  const B();
+        ^";
+}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///bad_implicit_super_constructor.dart:
+- B. (from org-dartlang-testcase:///bad_implicit_super_constructor.dart:10:9)
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.weak.modular.expect
new file mode 100644
index 0000000..e09a8ab
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: String starting with " must end with ".
+//   print(" $x.);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:8: Error: Can't find ')' to match '('.
+//   print(" $x.);
+//        ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Error: Undefined name 'x'.
+//   print(" $x.);
+//            ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: Expected ';' after this.
+//   print(" $x.);
+//             ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(" ${invalid-expression "pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Error: Undefined name 'x'.
+  print(\" \$x.);
+           ^"}.);\"");
+}
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.weak.modular.expect
new file mode 100644
index 0000000..e0af5b5
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   Foo() = Bar;
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   Foo() = Bar;
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:11: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   Foo() = Bar;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •() → self::Foo*
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/rasta/bad_redirection.dart:6:11: Error: Constructors can't have a return type.
+Try removing the return type.
+  Foo() = Bar;
+          ^";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar extends self::Foo {
+  static factory •() → self::Bar*
+    return null;
+}
+static method main() → dynamic {
+  new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..09e385e1
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:9: Error: 'field' isn't an instance field of this class.
+//   C() : field = null;
+//         ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:9: Error: 'field' isn't an instance field of this class.
+  C() : field = null;
+        ^^^^^"
+    ;
+  set field(dynamic value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_unicode.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_unicode.dart.weak.modular.expect
new file mode 100644
index 0000000..749bace
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_unicode.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_unicode.dart:6:10: Error: An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.
+//   print("\u00"); // Bad Unicode escape, must have 4 hex digits.
+//          ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("\\u00");
+}
diff --git a/pkg/front_end/testcases/rasta/breaking_bad.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/breaking_bad.dart.weak.modular.expect
new file mode 100644
index 0000000..b2fb346
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/breaking_bad.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: A break statement can't be used outside of a loop or switch statement.
+// Try removing the break statement.
+//   break;
+//   ^^^^^
+//
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: A break statement can't be used outside of a loop or switch statement.
+Try removing the break statement.
+  break;
+  ^";
+  #L1:
+  break #L1;
+}
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/cascades.dart.weak.modular.expect
new file mode 100644
index 0000000..73ffa41
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/cascades.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method add(dynamic x) → dynamic
+    return x;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•();
+  function f(dynamic x) → dynamic
+    return x;
+  let final self::A* #t1 = a in block {
+    #t1.{self::A::add}(f){(dynamic) →* dynamic}{dynamic}.call("WHAT");
+  } =>#t1;
+}
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.modular.expect
new file mode 100644
index 0000000..b641197
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.weak.modular.expect
@@ -0,0 +1,105 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Error: Type 'Missing' not found.
+// class A extends Missing {}
+//                 ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Error: Type 'Missing' not found.
+// class B implements Missing {}
+//                    ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Error: Type 'Missing' not found.
+// class C = Object with Missing;
+//                       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:7: Error: The type 'Missing' can't be mixed in.
+// class C = Object with Missing;
+//       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Couldn't find constructor 'Missing'.
+//   factory D() = Missing;
+//                 ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
+//   factory D() = Missing;
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  const synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  static factory •() → self::D*
+    return invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
+  factory D() = Missing;
+                ^";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {
+  new self::A::•();
+  new self::B::•();
+  new self::C::•();
+  invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Redirection constructor target not found: 'Missing'
+  factory D() = Missing;
+                ^";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::D::•
+}
diff --git a/pkg/front_end/testcases/rasta/class_member.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/class_member.dart.weak.modular.expect
new file mode 100644
index 0000000..e692877
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/class_member.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic field1 = null;
+  field dynamic field2 = null;
+  field dynamic field3 = null;
+  constructor constructor1() → self::Foo*
+    : super core::Object::•()
+    ;
+  constructor constructor2() → self::Foo*
+    : super core::Object::•()
+    ;
+  constructor constructor3() → self::Foo*
+    : super core::Object::•()
+    ;
+  method a() → dynamic {}
+  method b() → dynamic {}
+  method c() → dynamic {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.weak.modular.expect
new file mode 100644
index 0000000..ada899d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/constant_get_and_invoke.dart:8:4: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   c();
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* c = #C1;
+static method main() → dynamic {
+  #C1;
+  invalid-expression "pkg/front_end/testcases/rasta/constant_get_and_invoke.dart:8:4: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+  c();
+   ^" in #C1{<unresolved>}.call();
+}
+
+constants  {
+  #C1 = 1
+}
diff --git a/pkg/front_end/testcases/rasta/deferred_load.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/deferred_load.dart.weak.modular.expect
new file mode 100644
index 0000000..d01ac3d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/deferred_load.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:async" as asy;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {
+  #C1;
+  LoadLibrary(lib);
+}
+static method _#loadLibrary_lib() → asy::Future<dynamic>*
+  return LoadLibrary(lib);
+
+library deferred_lib;
+import self as self2;
+
+static method foo() → dynamic
+  return null;
+
+constants  {
+  #C1 = static-tearoff self::_#loadLibrary_lib
+}
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..3324351
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Mixin*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&Object&Mixin*
+    : super core::Object::•()
+    ;
+  mixin-super-stub get field() → dynamic
+    return super.{self::Mixin::field};
+  mixin-super-stub set field(dynamic value) → void
+    return super.{self::Mixin::field} = value;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_A&Object&Mixin&Mixin*
+    : super self::_A&Object&Mixin::•()
+    ;
+  mixin-super-stub get field() → dynamic
+    return super.{self::Mixin::field};
+  mixin-super-stub set field(dynamic value) → void
+    return super.{self::Mixin::field} = value;
+}
+class A extends self::_A&Object&Mixin&Mixin {
+  synthetic constructor •() → self::A*
+    : super self::_A&Object&Mixin&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/enum.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/enum.dart.weak.modular.expect
new file mode 100644
index 0000000..71a6850
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/enum.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::Foo*>* values = #C7;
+  static const field self::Foo* ec1 = #C3;
+  static const field self::Foo* ec2 = #C6;
+  const constructor •(core::int* index, core::String* name) → self::Foo*
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String*
+    return "Foo.${this.{core::_Enum::_name}{core::String}}";
+  abstract member-signature get index() → core::int*; -> core::_Enum::index
+  abstract member-signature get _name() → core::String*; -> core::_Enum::_name
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "ec1"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "ec2"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = <self::Foo*>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum.dart:
+- Foo. (from org-dartlang-testcase:///enum.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/rasta/export.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/export.dart.weak.modular.expect
new file mode 100644
index 0000000..6eb1e47
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/export.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library export;
+import self as self;
+import "foo.dart" as foo;
+additionalExports = (foo::foo)
+
+export "org-dartlang-testcase:///foo.dart";
+
+
+library foo;
+import self as foo;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  core::print("Hello, World!");
+}
diff --git a/pkg/front_end/testcases/rasta/external_factory_redirection.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.weak.modular.expect
new file mode 100644
index 0000000..8b7a99d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  "Should redirect to LinkedHashMap constructor.";
+  core::Map::•<core::Symbol*, dynamic>();
+}
diff --git a/pkg/front_end/testcases/rasta/foo.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/foo.dart.weak.modular.expect
new file mode 100644
index 0000000..5f90b5a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/foo.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library foo;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  core::print("Hello, World!");
+}
diff --git a/pkg/front_end/testcases/rasta/for_loop.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/for_loop.dart.weak.modular.expect
new file mode 100644
index 0000000..94b2d41
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/for_loop.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int* c = new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}{core::int*};
+  for (core::int* i = 0; i.{core::num::<}(100){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    core::print(let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::+}(1){(core::num*) →* core::int*} in #t1);
+  }
+  for (core::int* i = 0; i.{core::num::<}(100){(core::num*) →* core::bool*}; c.{core::num::<}(42){(core::num*) →* core::bool*} ?{core::int*} throw "fisk" : let final core::int* #t3 = i in let final core::int* #t4 = i = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3) {
+    core::print(let final core::int* #t5 = i in let final core::int* #t6 = i = #t5.{core::num::+}(1){(core::num*) →* core::int*} in #t5);
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.modular.expect
new file mode 100644
index 0000000..05e4007
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.weak.modular.expect
@@ -0,0 +1,150 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Couldn't find constructor 'Missing'.
+//   factory A.c() = Missing;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
+//   factory A.c() = Missing;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory A.b() = B<C1>.a;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory B.b() = C<C2>;
+//                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1, #C2, #C3];
+  constructor internal() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory a<T extends core::Object* = dynamic>() → self::A<self::A::a::T*>*
+    return self::B::a<self::A::a::T*>();
+  static factory b<T extends core::Object* = dynamic>() → self::A<self::A::b::T*>*
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory A.b() = B<C1>.a;
+                  ^";
+  static factory c<T extends core::Object* = dynamic>() → self::A<self::A::c::T*>*
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
+  factory A.c() = Missing;
+                  ^";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<S extends core::Object* = dynamic> extends self::A<self::B::S*> {
+  static final field dynamic _redirecting# = <dynamic>[#C4, #C5];
+  constructor internal() → self::B<self::B::S*>*
+    : super self::A::internal()
+    ;
+  static factory a<S extends core::Object* = dynamic>() → self::B<self::B::a::S*>*
+    return new self::C::•<self::B::a::S*>();
+  static factory b<S extends core::Object* = dynamic>() → self::B<self::B::b::S*>*
+    return invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory B.b() = C<C2>;
+                  ^";
+}
+class C<U extends core::Object* = dynamic> extends self::B<self::C::U*> {
+  constructor •() → self::C<self::C::U*>*
+    : super self::B::internal()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•<self::C3*>();
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory A.b() = B<C1>.a;
+                  ^";
+  new self::C::•<self::C3*>();
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+ - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+  factory B.b() = C<C2>;
+                  ^";
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Redirection constructor target not found: 'Missing'
+  factory A.c() = Missing;
+                  ^";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::a
+  #C2 = constructor-tearoff self::A::b
+  #C3 = constructor-tearoff self::A::c
+  #C4 = constructor-tearoff self::B::a
+  #C5 = constructor-tearoff self::B::b
+}
diff --git a/pkg/front_end/testcases/rasta/hello.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/hello.dart.weak.modular.expect
new file mode 100644
index 0000000..fea7b39
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/hello.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("Hello, World!");
+}
diff --git a/pkg/front_end/testcases/rasta/import_export.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/import_export.dart.weak.modular.expect
new file mode 100644
index 0000000..18b095f
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/import_export.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "foo.dart" as foo;
+
+import "org-dartlang-testcase:///export.dart";
+
+static method main() → dynamic {
+  foo::foo();
+}
+
+library export;
+import self as self2;
+import "foo.dart" as foo;
+additionalExports = (foo::foo)
+
+export "org-dartlang-testcase:///foo.dart";
+
+
+library foo;
+import self as foo;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  core::print("Hello, World!");
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000001.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000001.dart.weak.modular.expect
new file mode 100644
index 0000000..aa235f1
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000001.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000001.dart:11:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   test0(0, 1);
+//        ^
+// pkg/front_end/testcases/rasta/issue_000001.dart:5:1: Context: Found this candidate, but the arguments don't match.
+// test0(x) {
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test0(dynamic x) → dynamic {
+  core::print("test0");
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000001.dart:11:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  test0(0, 1);
+       ^";
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.weak.modular.expect
new file mode 100644
index 0000000..90a6469
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+import "dart:typed_data" as typ;
+
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+class Foo extends core::Object {
+  final field dynamic value;
+  constructor •(dynamic value) → self::Foo*
+    : self::Foo::value = value, super core::Object::•() {}
+  static factory fac(dynamic value) → self::Foo* {
+    return new self::Foo::•(value);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::List<core::int*>* list = <core::int*>[1, 2, 3];
+static method main() → dynamic {
+  exp::Expect::isTrue(typ::Uint8List::fromList(self::list).{core::List::[]}(1){(core::int*) →* core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 2);
+  exp::Expect::isTrue(self::Foo::fac(10).{self::Foo::value}{dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} 10);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.weak.modular.expect
new file mode 100644
index 0000000..8b66203
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static field dynamic global;
+static method fact4() → dynamic {
+  core::int* f = 1;
+  for (core::int* n in <core::int*>[1, 2, 3, 4]) {
+    f = f.{core::num::*}(n){(core::num*) →* core::int*};
+  }
+  return f;
+}
+static method fact5() → dynamic {
+  core::int* f = 1;
+  dynamic n;
+  for (final dynamic #t1 in <dynamic>[1, 2, 3, 4, 5]) {
+    n = #t1;
+    f = f.{core::num::*}(n as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*} as{TypeError} core::int*;
+  }
+  return f;
+}
+static method fact6() → dynamic {
+  core::int* f = 1;
+  for (final dynamic #t2 in <dynamic>[1, 2, 3, 4, 5, 6]) {
+    self::global = #t2;
+    f = f.{core::num::*}(self::global as{TypeError,ForDynamic} core::num*){(core::num*) →* core::num*} as{TypeError} core::int*;
+  }
+  return f;
+}
+static method main() → dynamic {
+  exp::Expect::isTrue(self::fact4() =={core::Object::==}{(core::Object*) →* core::bool*} 24);
+  exp::Expect::isTrue(self::fact5() =={core::Object::==}{(core::Object*) →* core::bool*} 120);
+  exp::Expect::isTrue(self::fact6() =={core::Object::==}{(core::Object*) →* core::bool*} 720);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000006.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000006.dart.weak.modular.expect
new file mode 100644
index 0000000..d8e5d49
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000006.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* list = <core::int*>[1, 2, 3];
+static method main() → dynamic {
+  self::list.{core::List::add}(1){(core::int*) →* void};
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.weak.modular.expect
new file mode 100644
index 0000000..6cd1688
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return core::print("foo");
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Sub&Base&Mixin = self::Base with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Sub&Base&Mixin*
+    : super self::Base::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::Mixin::foo}();
+}
+class Sub extends self::_Sub&Base&Mixin {
+  synthetic constructor •() → self::Sub*
+    : super self::_Sub&Base&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  new self::Sub::•().{self::_Sub&Base&Mixin::foo}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.weak.modular.expect
new file mode 100644
index 0000000..c1f058b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000008.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic x;
+  constructor •(dynamic x) → self::C*
+    : self::C::x = x, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•(42);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000011.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000011.dart.weak.modular.expect
new file mode 100644
index 0000000..aa88a42
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000011.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  try {
+    core::print(42);
+  }
+  finally {
+    core::print(87);
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.weak.modular.expect
new file mode 100644
index 0000000..e6e3429
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method m() → dynamic {
+    super.{self::A::field} = 42;
+  }
+}
+static method main() → dynamic {
+  new self::B::•().{self::B::m}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000025.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000025.dart.weak.modular.expect
new file mode 100644
index 0000000..3be7ccc
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000025.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static get x() → dynamic
+  return 42;
+static set x(dynamic val) → void {}
+static method main() → dynamic {
+  core::print(self::x);
+  core::print(self::x = 87);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.weak.modular.expect
new file mode 100644
index 0000000..9e127fd
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic a = null;
+  field core::int* b = 0;
+  field core::int* c = 1.{core::num::+}(2){(core::num*) →* core::int*};
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  field dynamic a = null;
+  field core::int* b = 1;
+  field core::int* c = 2.{core::num::-}(3){(core::num*) →* core::int*};
+  constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•();
+  new self::D::•();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000031.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000031.dart.weak.modular.expect
new file mode 100644
index 0000000..5147d08
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000031.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000031.dart:8:3: Error: A prefix can't be used as an expression.
+//   math..toString();
+//   ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:math" as math;
+
+static method main() → dynamic {
+  let final invalid-type #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000031.dart:8:3: Error: A prefix can't be used as an expression.
+  math..toString();
+  ^^^^" in block {
+    #t1.{core::Object::toString}(){() →* core::String*};
+  } =>#t1;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.weak.modular.expect
new file mode 100644
index 0000000..a34f230
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.weak.modular.expect
@@ -0,0 +1,63 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected a type, but got '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:4: Error: Expected ';' after this.
+//   C<
+//    ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:11:1: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: Expected ';' after this.
+//   C<
+//    ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
+//   C<
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
+  C<
+   ^" in #C1{<unresolved>}.<(invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:11:1: Error: This couldn't be parsed.
+}
+^");
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::C*)
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.weak.modular.expect
new file mode 100644
index 0000000..e288dc4
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000033.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Couldn't find constructor 'JS'.
+// @JS()
+//  ^^
+//
+import self as self;
+
+@invalid-expression "pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Couldn't find constructor 'JS'.
+@JS()
+ ^^"
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.weak.modular.expect
new file mode 100644
index 0000000..58227f9
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   const C() : this.x;
+//               ^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: Can't access 'this' in a field initializer.
+//   const C() : this.x;
+//               ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object /*hasConstConstructor*/  {
+  const constructor •() → self::C*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: This couldn't be parsed.
+  const C() : this.x;
+              ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: This couldn't be parsed.
+  const C() : this.x;
+              ^";
+}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue_000034.dart:
+- C. (from org-dartlang-testcase:///issue_000034.dart:6:9)
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.weak.modular.expect
new file mode 100644
index 0000000..d27cbe4
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Error: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:11: Error: The non-ASCII character 'ø' (U+00F8) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//           ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - C.æøC
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C {æøC();}
+//       ^
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Context: 'C.æøC' is defined here.
+// class C {æøC();}
+//          ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract method æøC() → dynamic;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.weak.modular.expect
new file mode 100644
index 0000000..ffef0ea
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:9: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:10: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000036.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000036.dart.weak.modular.expect
new file mode 100644
index 0000000..255d67d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000036.dart.weak.modular.expect
@@ -0,0 +1,21 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got '-'.
+// Try inserting an identifier before '-'.
+// main() => a. - 5;
+//              ^
+//
+// pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got ''.
+// Try inserting an identifier before ''.
+// main() => a. - 5;
+//              ^
+//
+import self as self;
+
+static method main() → dynamic
+  return invalid-expression "pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got ''.
+Try inserting an identifier before ''.
+main() => a. - 5;
+             ^"{<invalid>}.-(5);
diff --git a/pkg/front_end/testcases/rasta/issue_000039.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000039.dart.weak.modular.expect
new file mode 100644
index 0000000..289c890
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000039.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got ''.
+// Try inserting an identifier before ''.
+//   }
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:9:15: Error: Expected ';' after this.
+//     this.a = x.
+//               ^
+//
+// pkg/front_end/testcases/rasta/issue_000039.dart:13:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic a = null;
+  constructor •(dynamic x) → self::A*
+    : super core::Object::•() {
+    this.{self::A::a} = invalid-expression "pkg/front_end/testcases/rasta/issue_000039.dart:10:3: Error: Expected an identifier, but got ''.
+Try inserting an identifier before ''.
+  }
+  ^";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : invalid-initializer
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.weak.modular.expect
new file mode 100644
index 0000000..2026340
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.weak.modular.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     use(+super);
+//          ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method test() → dynamic {
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:9: Error: This couldn't be parsed.
+    use(+super);
+        ^"{<invalid>}.+(invalid-expression "pkg/front_end/testcases/rasta/issue_000041.dart:7:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^"));
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method use(dynamic _) → dynamic
+  return null;
+static method main() → dynamic {
+  new self::C::•().{self::C::test}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.weak.modular.expect
new file mode 100644
index 0000000..2abfb5d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:6:13: Error: Unexpected token ','.
+//   for (var x, y in []) {}
+//             ^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+//   for (var x, y in []) {}
+//        ^^^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:7:8: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   L: { continue L; }
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:8:18: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   L: if (true) { continue L; }
+//                  ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  {
+    invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+  for (var x, y in []) {}
+       ^^^";
+    for (final dynamic #t1 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+  for (var x, y in []) {}
+       ^^^";
+      dynamic x;
+      dynamic y;
+    }
+  }
+  #L1:
+  {
+    break #L1;
+  }
+  #L2:
+  if(true) {
+    break #L2;
+  }
+  #L3:
+  switch(1) {
+    #L4:
+    case #C1:
+      {
+        break #L3;
+      }
+    #L5:
+    case #C2:
+      {
+        break #L3;
+      }
+  }
+  try {
+  }
+  on core::NoSuchMethodError* catch(no-exception-var) {
+  }
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.weak.modular.expect
new file mode 100644
index 0000000..0c2f2cb
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000043.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  get x() → dynamic
+    return "${#C1}".{core::String::hashCode}{core::int*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::C*)
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.modular.expect
new file mode 100644
index 0000000..b0dbf3f
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.weak.modular.expect
@@ -0,0 +1,119 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// a b(c) = d;
+//        ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:1: Error: Type 'a' not found.
+// a b(c) = d;
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Couldn't find constructor 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Undefined name 'd'.
+// a b(c) = d;
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:33: Error: Member not found: 'constant'.
+//   C.missingFactoryKeyword() = C.constant;
+//                                 ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   C.missingFactoryKeyword() = C.constant;
+//                               ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   print(const C.missingFactoryKeyword());
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object /*hasConstConstructor*/  {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  const constructor constant() → self::C*
+    : super core::Object::•()
+    ;
+  constructor missingFactoryKeyword() → self::C*
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Constructors can't have a return type.
+Try removing the return type.
+  C.missingFactoryKeyword() = C.constant;
+                              ^";
+  static factory good() → self::C*
+    return new self::C::constant();
+  method notEvenAConstructor(dynamic a) → self::C*
+    return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'h'.
+  C notEvenAConstructor(a) = h;
+                             ^" in this{<unresolved>}.h as{TypeError,ForDynamic} self::C*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method b(dynamic c) → invalid-type
+  return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Undefined name 'd'.
+a b(c) = d;
+         ^";
+static method main() → dynamic {
+  self::C* c = null;
+  core::print(#C2);
+  core::print(invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  print(const C.missingFactoryKeyword());
+              ^");
+  core::print(#C2);
+  core::print(new self::C::constant().{self::C::notEvenAConstructor}(null){(dynamic) →* self::C*});
+}
+
+constants  {
+  #C1 = constructor-tearoff self::C::good
+  #C2 = self::C {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue_000044.dart:
+- C.constant (from org-dartlang-testcase:///issue_000044.dart:11:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.weak.modular.expect
new file mode 100644
index 0000000..2622c42
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.weak.modular.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: String starting with """ must end with """.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: Expected ';' after this.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:6:1: Error: Unexpected token ''.
+//
+import self as self;
+
+static method main() → dynamic
+  return "${1}
+\"\"\"";
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.weak.modular.expect
new file mode 100644
index 0000000..4625b85
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: Expected '(' after this.
+//   C c = new Object)();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected ';' after this.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected a class member, but got ')'.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:20: Error: Expected an identifier, but got '('.
+// Try inserting an identifier before '('.
+//   C c = new Object)();
+//                    ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: The constructor returns type 'Object' that isn't of expected type 'C'.
+//  - 'Object' is from 'dart:core'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/issue_000046.dart'.
+// Change the type of the object being constructed or the context in which it is used.
+//   C c = new Object)();
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field self::C* c = invalid-expression "pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: The constructor returns type 'Object' that isn't of expected type 'C'.
+ - 'Object' is from 'dart:core'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/issue_000046.dart'.
+Change the type of the object being constructed or the context in which it is used.
+  C c = new Object)();
+            ^" in new core::Object::•();
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000047.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000047.dart.weak.modular.expect
new file mode 100644
index 0000000..2ae0040
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000047.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/issue_000047.dart:5:17: Error: Expected ')' before this.
+// typedef void T(C<C>);
+//                 ^
+//
+import self as self;
+
+typedef T = (dynamic) →* void;
+static method main() → (dynamic) →* void
+  return null;
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.weak.modular.expect
new file mode 100644
index 0000000..a297249
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::bool* v1;
+  field core::num* v2;
+  constructor •(core::bool* v1, core::num* v2) → self::A*
+    : self::A::v1 = v1, self::A::v2 = v2, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M1 extends core::Object {
+  field core::num* v2 = 0;
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C = self::A with self::M1 {
+  synthetic constructor •(core::bool* v1, core::num* v2) → self::C*
+    : super self::A::•(v1, v2)
+    ;
+  mixin-super-stub get v2() → core::num*
+    return super.{self::M1::v2};
+  mixin-super-stub set v2(core::num* value) → void
+    return super.{self::M1::v2} = value;
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•(true, 2);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.weak.modular.expect
new file mode 100644
index 0000000..4c2e652
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.weak.modular.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function f() → Null {
+    core::print("hello");
+  }
+  f(){() →* Null};
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.weak.modular.expect
new file mode 100644
index 0000000..f4841de
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic other) → core::bool*
+    return throw "x";
+  method test() → dynamic {
+    super.{core::Object::==}(null);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.modular.expect
new file mode 100644
index 0000000..66f50c0
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •() → self::A*
+    : super core::Object::•() {}
+  static factory foo() → self::A*
+    return self::C::bar();
+  method m() → core::int* {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A {
+  static final field dynamic _redirecting# = <dynamic>[#C2];
+  constructor •() → self::C*
+    : super self::A::•() {}
+  static factory bar() → self::C*
+    return new self::D::•();
+  method m() → core::int* {
+    return 1;
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method m() → core::int* {
+    return 2;
+  }
+}
+static method main() → dynamic {
+  self::A* a = new self::D::•();
+  exp::Expect::equals(2, a.{self::A::m}(){() →* core::int*});
+}
+
+constants  {
+  #C1 = constructor-tearoff self::A::foo
+  #C2 = constructor-tearoff self::C::bar
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.weak.modular.expect
new file mode 100644
index 0000000..9de7e9e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class G<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method main() → dynamic {
+  exp::Expect::isFalse(new self::G::•<self::B*>() is self::G<self::C*>*);
+  exp::Expect::isFalse(new self::G::•<self::A*>() is self::G<self::B*>*);
+  exp::Expect::isFalse(new self::G::•<self::A*>() is self::G<self::C*>*);
+  exp::Expect::isFalse(new self::G::•<core::Object*>() is self::G<self::B*>*);
+  exp::Expect::isFalse(new self::G::•<core::int*>() is self::G<self::B*>*);
+  exp::Expect::isFalse(new self::G::•<core::int*>() is self::G<core::double*>*);
+  exp::Expect::isFalse(new self::G::•<core::int*>() is self::G<core::String*>*);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000069.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.weak.modular.expect
new file mode 100644
index 0000000..07c2ec1
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000069.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  dynamic x;
+  core::int* i = 0;
+  while ((let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::+}(1){(core::num*) →* core::int*} in #t1).{core::num::<}(5){(core::num*) →* core::bool*}) {
+    core::int* x = i;
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.weak.modular.expect
new file mode 100644
index 0000000..a5f9ac1
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+class A<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  final field core::List<self::A::U*>* field;
+  constructor •(self::A::N* n, self::A::S* s) → self::A<self::A::N*, self::A::S*, self::A::U*>*
+    : self::A::field = <self::A::U*>[], super core::Object::•() {
+    exp::Expect::isTrue(n is self::A::N*);
+    exp::Expect::isTrue(s is self::A::S*);
+  }
+  constructor empty() → self::A<self::A::N*, self::A::S*, self::A::U*>*
+    : self::A::field = null, super core::Object::•() {}
+  const constructor c(self::A::U* u, self::A::S* s) → self::A<self::A::N*, self::A::S*, self::A::U*>*
+    : self::A::field = #C2, super core::Object::•()
+    ;
+  static factory f<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic>(self::A::f::S* s) → self::A<self::A::f::N*, self::A::f::S*, self::A::f::U*>* {
+    exp::Expect::isTrue(s is self::A::f::S*);
+    return new self::A::empty<self::A::f::N*, self::A::f::S*, self::A::f::U*>();
+  }
+  get getter() → core::List<self::A::U*>* {
+    return this.{self::A::field}{core::List<self::A::U*>*};
+  }
+  set setter(covariant-by-class self::A::S* s) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class J<Aa extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::Aa*, self::J::B*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<H extends core::Object* = dynamic, C extends core::Object* = dynamic, K extends core::Object* = dynamic> extends self::J<self::I::C*, self::I::K*> {
+  synthetic constructor •() → self::I<self::I::H*, self::I::C*, self::I::K*>*
+    : super self::J::•()
+    ;
+}
+static method main() → dynamic {
+  new self::A::•<core::num*, core::double*, core::List<dynamic>*>(1, 2.0);
+  self::A<dynamic, dynamic, dynamic>* a = self::A::f<core::int*, core::int*, core::int*>(1);
+  #C3;
+  core::List<dynamic>* z = a.{self::A::getter}{core::List<dynamic>*};
+  a.{self::A::setter} = 1;
+}
+
+constants  {
+  #C1 = null
+  #C2 = <Null>[#C1]
+  #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue_000070.dart:
+- A.c (from org-dartlang-testcase:///issue_000070.dart:22:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.weak.modular.expect
new file mode 100644
index 0000000..e61a3ce
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Mixin*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return 87;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Foo&Object&Mixin = core::Object with self::Mixin /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_Foo&Object&Mixin*
+    : super core::Object::•()
+    ;
+  mixin-super-stub method foo() → dynamic
+    return super.{self::Mixin::foo}();
+  mixin-super-stub get field() → dynamic
+    return super.{self::Mixin::field};
+  mixin-super-stub set field(dynamic value) → void
+    return super.{self::Mixin::field} = value;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Foo extends self::_Foo&Object&Mixin {
+  synthetic constructor •() → self::Foo*
+    : super self::_Foo&Object&Mixin::•()
+    ;
+  method foo() → dynamic
+    return super.{self::_Foo&Object&Mixin::foo}();
+  method bar() → dynamic
+    return super.{self::_Foo&Object&Mixin::field};
+}
+static method main() → dynamic {
+  self::Foo* f = new self::Foo::•();
+  f.{self::_Foo&Object&Mixin::field} = 42;
+  core::print(f.{self::Foo::bar}(){() →* dynamic});
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.weak.modular.expect
new file mode 100644
index 0000000..5549963
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.weak.modular.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  field core::int* hashCode = 42;
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Sub extends self::Base {
+  field core::int* _hashCode = null;
+  synthetic constructor •() → self::Sub*
+    : super self::Base::•()
+    ;
+  get hashCode() → core::int*
+    return let final core::int* #t1 = this.{self::Sub::_hashCode}{core::int*} in #t1 == null ?{core::int*} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : #t1;
+  method foo() → dynamic {
+    this.{self::Sub::_hashCode}{core::int*} == null ?{core::int*} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : null;
+  }
+}
+static method main() → dynamic {
+  core::print(new self::Sub::•().{self::Sub::hashCode}{core::int*});
+  core::List<Null>* l = <Null>[null];
+  let final core::List<Null>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3){(core::int*) →* Null} == null ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} Null){(core::int*, Null) →* void} : null;
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..40bd823
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected '{' before this.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:6:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const A()
+//   ^^^^^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected a class member, but got ':'.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:7: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//     : x = 'foo'
+//       ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const A();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::String* x = "foo";
+  constructor •() → self::A*
+    : self::A::x = "foo", super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/malformed_const_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const A();
+        ^";
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.weak.modular.expect
new file mode 100644
index 0000000..35bc1cd
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_function.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/malformed_function.dart:7:8: Error: Can't assign to a parenthesized expression.
+//   (null) = null;
+//        ^
+//
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:7:8: Error: Can't assign to a parenthesized expression.
+  (null) = null;
+       ^";
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.weak.modular.expect
new file mode 100644
index 0000000..50a886c
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Handle = invalid-type;
+static method main() → dynamic {
+  invalid-type h;
+}
diff --git a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..ac6a230
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:16: Error: Non-optional parameters can't have a default value.
+// Try removing the default value or making the parameter optional.
+// main(arguments = [x]) {
+//                ^
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:18: Error: Constant expression expected.
+// Try inserting 'const'.
+// main(arguments = [x]) {
+//                  ^
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:19: Error: Undefined name 'x'.
+// main(arguments = [x]) {
+//                   ^
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:18: Error: Non-constant list literal is not a constant expression.
+// main(arguments = [x]) {
+//                  ^
+//
+import self as self;
+
+static method main(dynamic arguments = invalid-expression "Non-constant list literal is not a constant expression.") → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/mixin_library.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/mixin_library.dart.weak.modular.expect
new file mode 100644
index 0000000..e6d1af6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library test.mixin_library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
+//   foo() => super.foo() + f();
+//                  ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Mixin<T extends core::Object* = dynamic> extends core::Object {
+  field dynamic x = self::f();
+  field dynamic y = null;
+  field dynamic z = null;
+  covariant-by-class field self::Mixin::T* t = null;
+  synthetic constructor •() → self::Mixin<self::Mixin::T*>*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return super.foo(){dynamic}.+(self::f());
+  method g(covariant-by-class self::Mixin::T* a) → self::Mixin::T*
+    return null;
+  method h() → dynamic
+    return self::V();
+  method l() → dynamic
+    return self::_private();
+  method _privateMethod() → dynamic
+    return 49;
+  method publicMethod() → dynamic
+    return this.{self::Mixin::_privateMethod}(){() →* dynamic};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f() → dynamic
+  return 2;
+static method V() → dynamic
+  return 87;
+static method _private() → dynamic
+  return 117;
+static method foo(dynamic m) → dynamic
+  return m{dynamic}._privateMethod();
diff --git a/pkg/front_end/testcases/rasta/native_is_illegal.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/native_is_illegal.dart.weak.modular.expect
new file mode 100644
index 0000000..7670aed
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/native_is_illegal.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Bar extends core::Object {
+  @#C2
+  external get x() → self::Bar*;
+  @#C4
+  external set x(self::Bar* value) → void;
+  @#C6
+  external method f() → dynamic;
+  @#C8
+  external static factory •() → self::Bar*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+@#C10
+external static method foo() → dynamic;
+
+constants  {
+  #C1 = "Bar_get_x"
+  #C2 = _in::ExternalName {name:#C1}
+  #C3 = "Bar_set_x"
+  #C4 = _in::ExternalName {name:#C3}
+  #C5 = "Bar_f"
+  #C6 = _in::ExternalName {name:#C5}
+  #C7 = "Bar_constructor"
+  #C8 = _in::ExternalName {name:#C7}
+  #C9 = "foo"
+  #C10 = _in::ExternalName {name:#C9}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///native_is_illegal.dart:
+- ExternalName. (from org-dartlang-sdk:///sdk/lib/internal/internal.dart:92:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/rasta/parser_error.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/parser_error.dart.weak.modular.expect
new file mode 100644
index 0000000..b83c501
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/parser_error.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:7: Error: Expected an identifier, but got '?'.
+// Try inserting an identifier before '?'.
+//   if (?b) return b;  /// 01: compile-time error
+//       ^
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: Expected ':' before this.
+//   if (?b) return b;  /// 01: compile-time error
+//         ^
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   if (?b) return b;  /// 01: compile-time error
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static method test(dynamic a, {dynamic b = #C1, dynamic c = #C1}) → core::int* {
+  if(invalid-expression "pkg/front_end/testcases/rasta/parser_error.dart:10:7: Error: This couldn't be parsed.
+  if (?b) return b;  /// 01: compile-time error
+      ^" ?{invalid-type} b : invalid-expression "pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: This couldn't be parsed.
+  if (?b) return b;  /// 01: compile-time error
+        ^")
+    return b as{TypeError,ForDynamic} core::int*;
+  return a{dynamic}.+(b){dynamic}.+(c) as{TypeError,ForDynamic} core::int*;
+}
+static method main() → dynamic {
+  exp::Expect::equals(6, self::test(1, b: 2, c: 3));
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/rasta/previsit_deferred.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/previsit_deferred.dart.weak.modular.expect
new file mode 100644
index 0000000..0a16b0d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/previsit_deferred.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic {
+  let final dynamic #t1 = CheckLibraryIsLoaded(lib) in def::foo();
+}
+
+library deferred_lib;
+import self as def;
+
+static method foo() → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/rasta/static.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/static.dart.weak.modular.expect
new file mode 100644
index 0000000..3be7b62
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/static.dart.weak.modular.expect
@@ -0,0 +1,339 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/static.dart:28:9: Error: Getter not found: 'staticSetter'.
+//     Foo.staticSetter;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:29:13: Error: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:31:9: Error: Setter not found: 'staticConstant'.
+//     Foo.staticConstant++;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:32:13: Error: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant++);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:35:9: Error: Setter not found: 'staticFunction'.
+//     Foo.staticFunction++;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:36:13: Error: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction++);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:37:9: Error: Setter not found: 'staticGetter'.
+//     Foo.staticGetter++;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:38:13: Error: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter++);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:39:9: Error: Getter not found: 'staticSetter'.
+//     Foo.staticSetter++;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:40:13: Error: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter++);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:42:11: Error: Setter not found: 'staticConstant'.
+//     ++Foo.staticConstant;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:43:15: Error: Setter not found: 'staticConstant'.
+//     use(++Foo.staticConstant);
+//               ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:46:11: Error: Setter not found: 'staticFunction'.
+//     ++Foo.staticFunction;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:47:15: Error: Setter not found: 'staticFunction'.
+//     use(++Foo.staticFunction);
+//               ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:48:11: Error: Setter not found: 'staticGetter'.
+//     ++Foo.staticGetter;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:49:15: Error: Setter not found: 'staticGetter'.
+//     use(++Foo.staticGetter);
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:50:11: Error: Getter not found: 'staticSetter'.
+//     ++Foo.staticSetter;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:51:15: Error: Getter not found: 'staticSetter'.
+//     use(++Foo.staticSetter);
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:61:9: Error: Getter not found: 'staticSetter'.
+//     Foo.staticSetter();
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:62:13: Error: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter());
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:64:9: Error: Setter not found: 'staticConstant'.
+//     Foo.staticConstant = 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:65:13: Error: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant = 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:68:9: Error: Setter not found: 'staticFunction'.
+//     Foo.staticFunction = 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:69:13: Error: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction = 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:70:9: Error: Setter not found: 'staticGetter'.
+//     Foo.staticGetter = 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:71:13: Error: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter = 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:75:9: Error: Setter not found: 'staticConstant'.
+//     Foo.staticConstant ??= 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant ??= 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:79:9: Error: Setter not found: 'staticFunction'.
+//     Foo.staticFunction ??= 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction ??= 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:81:9: Error: Setter not found: 'staticGetter'.
+//     Foo.staticGetter ??= 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:82:13: Error: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter ??= 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:83:9: Error: Getter not found: 'staticSetter'.
+//     Foo.staticSetter ??= 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:84:13: Error: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter ??= 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:53:23: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     Foo.staticConstant();
+//                       ^
+//
+// pkg/front_end/testcases/rasta/static.dart:54:27: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     use(Foo.staticConstant());
+//                           ^
+//
+// pkg/front_end/testcases/rasta/static.dart:55:20: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     Foo.staticField();
+//                    ^
+//
+// pkg/front_end/testcases/rasta/static.dart:56:24: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     use(Foo.staticField());
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static const field core::int* staticConstant = #C1;
+  static field core::int* staticField = 42;
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  static method staticFunction() → dynamic {}
+  static get staticGetter() → dynamic
+    return null;
+  static set staticSetter(dynamic _) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method use(dynamic x) → dynamic {
+  if(x =={core::Object::==}{(core::Object*) →* core::bool*} new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}{core::int*})
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  try {
+    #C1;
+    self::use(#C1);
+    self::Foo::staticField;
+    self::use(self::Foo::staticField);
+    #C2;
+    self::use(#C2);
+    self::Foo::staticGetter;
+    self::use(self::Foo::staticGetter);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:28:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter;
+        ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:29:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter);
+            ^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:31:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant++;
+        ^^^^^^^^^^^^^^";
+    self::use(let final core::int* #t1 = #C1 in let final invalid-type #t2 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:32:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant++);
+            ^^^^^^^^^^^^^^" in #t1);
+    self::Foo::staticField = self::Foo::staticField.{core::num::+}(1){(core::num*) →* core::int*};
+    self::use(let final core::int* #t3 = self::Foo::staticField in let final core::int* #t4 = self::Foo::staticField = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:35:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction++;
+        ^^^^^^^^^^^^^^";
+    self::use(let final () →* dynamic #t5 = #C2 in let final invalid-type #t6 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:36:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction++);
+            ^^^^^^^^^^^^^^" in #t5);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:37:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter++;
+        ^^^^^^^^^^^^";
+    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final invalid-type #t8 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:38:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter++);
+            ^^^^^^^^^^^^" in #t7);
+    self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:39:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter++;
+        ^^^^^^^^^^^^"{<invalid>}.+(1);
+    self::use(let final invalid-type #t9 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:40:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter++);
+            ^^^^^^^^^^^^" in let final invalid-type #t10 = self::Foo::staticSetter = #t9{<invalid>}.+(1) in #t9);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:42:11: Error: Setter not found: 'staticConstant'.
+    ++Foo.staticConstant;
+          ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:43:15: Error: Setter not found: 'staticConstant'.
+    use(++Foo.staticConstant);
+              ^^^^^^^^^^^^^^");
+    self::Foo::staticField = self::Foo::staticField.{core::num::+}(1){(core::num*) →* core::int*};
+    self::use(self::Foo::staticField = self::Foo::staticField.{core::num::+}(1){(core::num*) →* core::int*});
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:46:11: Error: Setter not found: 'staticFunction'.
+    ++Foo.staticFunction;
+          ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:47:15: Error: Setter not found: 'staticFunction'.
+    use(++Foo.staticFunction);
+              ^^^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:48:11: Error: Setter not found: 'staticGetter'.
+    ++Foo.staticGetter;
+          ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:49:15: Error: Setter not found: 'staticGetter'.
+    use(++Foo.staticGetter);
+              ^^^^^^^^^^^^");
+    self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:50:11: Error: Getter not found: 'staticSetter'.
+    ++Foo.staticSetter;
+          ^^^^^^^^^^^^"{<invalid>}.+(1);
+    self::use(self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:51:15: Error: Getter not found: 'staticSetter'.
+    use(++Foo.staticSetter);
+              ^^^^^^^^^^^^"{<invalid>}.+(1));
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:53:23: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    Foo.staticConstant();
+                      ^" in #C1{<unresolved>}.call();
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:54:27: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    use(Foo.staticConstant());
+                          ^" in #C1{<unresolved>}.call());
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:55:20: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    Foo.staticField();
+                   ^" in self::Foo::staticField{<unresolved>}.call();
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:56:24: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    use(Foo.staticField());
+                       ^" in self::Foo::staticField{<unresolved>}.call());
+    self::Foo::staticFunction();
+    self::use(self::Foo::staticFunction());
+    self::Foo::staticGetter{dynamic}.call();
+    self::use(self::Foo::staticGetter{dynamic}.call());
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:61:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter();
+        ^^^^^^^^^^^^"{dynamic}.call();
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:62:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter());
+            ^^^^^^^^^^^^"{dynamic}.call());
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:64:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant = 87;
+        ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:65:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant = 87);
+            ^^^^^^^^^^^^^^");
+    self::Foo::staticField = 87;
+    self::use(self::Foo::staticField = 87);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:68:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction = 87;
+        ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:69:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction = 87);
+            ^^^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:70:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter = 87;
+        ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:71:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter = 87);
+            ^^^^^^^^^^^^");
+    self::Foo::staticSetter = 87;
+    self::use(self::Foo::staticSetter = 87);
+    #C1 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/static.dart:75:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant ??= 87;
+        ^^^^^^^^^^^^^^" : null;
+    self::use(let final core::int* #t11 = #C1 in #t11 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant ??= 87);
+            ^^^^^^^^^^^^^^" : #t11);
+    self::Foo::staticField == null ?{core::int*} self::Foo::staticField = 87 : null;
+    self::use(let final core::int* #t12 = self::Foo::staticField in #t12 == null ?{core::int*} self::Foo::staticField = 87 : #t12);
+    #C2 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/static.dart:79:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction ??= 87;
+        ^^^^^^^^^^^^^^" : null;
+    self::use(let final () →* dynamic #t13 = #C2 in #t13 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction ??= 87);
+            ^^^^^^^^^^^^^^" : #t13);
+    self::Foo::staticGetter == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/static.dart:81:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter ??= 87;
+        ^^^^^^^^^^^^" : null;
+    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/static.dart:82:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter ??= 87);
+            ^^^^^^^^^^^^" : #t14);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:83:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter ??= 87;
+        ^^^^^^^^^^^^" == null ?{invalid-type} self::Foo::staticSetter = 87 : null;
+    self::use(let final invalid-type #t15 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:84:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter ??= 87);
+            ^^^^^^^^^^^^" in #t15 == null ?{invalid-type} self::Foo::staticSetter = 87 : #t15);
+  }
+  on core::NoSuchMethodError* catch(no-exception-var) {
+  }
+}
+
+constants  {
+  #C1 = 42
+  #C2 = static-tearoff self::Foo::staticFunction
+}
diff --git a/pkg/front_end/testcases/rasta/super.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/super.dart.weak.modular.expect
new file mode 100644
index 0000000..e24c07d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super.dart.weak.modular.expect
@@ -0,0 +1,687 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/super.dart:27:7: Error: 'n' is already declared in this scope.
+//   set n(_) {}
+//       ^
+// pkg/front_end/testcases/rasta/super.dart:26:8: Context: Previous declaration of 'n'.
+//   void n() {}
+//        ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     +super;
+//      ^^^^^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     use(+super);
+//          ^^^^^
+//
+// pkg/front_end/testcases/rasta/super.dart:62:11: Error: Superclass has no getter named 'g'.
+//     super.g;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:63:15: Error: Superclass has no getter named 'g'.
+//     use(super.g);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:83:11: Error: Superclass has no setter named 'e'.
+//     super.e++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:84:15: Error: Superclass has no setter named 'e'.
+//     use(super.e++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:85:11: Error: Superclass has no setter named 'f'.
+//     super.f++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:86:15: Error: Superclass has no setter named 'f'.
+//     use(super.f++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:87:11: Error: Superclass has no getter named 'g'.
+//     super.g++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:88:15: Error: Superclass has no getter named 'g'.
+//     use(super.g++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:95:11: Error: Superclass has no setter named 'm'.
+//     super.m++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:96:15: Error: Superclass has no setter named 'm'.
+//     use(super.m++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:108:13: Error: Superclass has no setter named 'e'.
+//     ++super.e;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:109:17: Error: Superclass has no setter named 'e'.
+//     use(++super.e);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:110:13: Error: Superclass has no setter named 'f'.
+//     ++super.f;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:111:17: Error: Superclass has no setter named 'f'.
+//     use(++super.f);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:112:13: Error: Superclass has no getter named 'g'.
+//     ++super.g;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:113:17: Error: Superclass has no getter named 'g'.
+//     use(++super.g);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:120:13: Error: Superclass has no setter named 'm'.
+//     ++super.m;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:121:17: Error: Superclass has no setter named 'm'.
+//     use(++super.m);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:137:11: Error: Superclass has no method named 'g'.
+//     super.g();
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:138:15: Error: Superclass has no method named 'g'.
+//     use(super.g());
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:160:11: Error: Superclass has no setter named 'e'.
+//     super.e = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:161:15: Error: Superclass has no setter named 'e'.
+//     use(super.e = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:162:11: Error: Superclass has no setter named 'f'.
+//     super.f = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:163:15: Error: Superclass has no setter named 'f'.
+//     use(super.f = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:172:11: Error: Superclass has no setter named 'm'.
+//     super.m = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:173:15: Error: Superclass has no setter named 'm'.
+//     use(super.m = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:185:11: Error: Superclass has no setter named 'e'.
+//     super.e ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:186:15: Error: Superclass has no setter named 'e'.
+//     use(super.e ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:187:11: Error: Superclass has no setter named 'f'.
+//     super.f ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:188:15: Error: Superclass has no setter named 'f'.
+//     use(super.f ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:189:11: Error: Superclass has no getter named 'g'.
+//     super.g ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:190:15: Error: Superclass has no getter named 'g'.
+//     use(super.g ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:197:11: Error: Superclass has no setter named 'm'.
+//     super.m ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:198:15: Error: Superclass has no setter named 'm'.
+//     use(super.m ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:210:11: Error: Superclass has no setter named 'e'.
+//     super.e += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:211:15: Error: Superclass has no setter named 'e'.
+//     use(super.e += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:212:11: Error: Superclass has no setter named 'f'.
+//     super.f += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:213:15: Error: Superclass has no setter named 'f'.
+//     use(super.f += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:214:11: Error: Superclass has no getter named 'g'.
+//     super.g += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:215:15: Error: Superclass has no getter named 'g'.
+//     use(super.g += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:222:11: Error: Superclass has no setter named 'm'.
+//     super.m += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:223:15: Error: Superclass has no setter named 'm'.
+//     use(super.m += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:235:11: Error: Superclass has no setter named 'e'.
+//     super.e -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:236:15: Error: Superclass has no setter named 'e'.
+//     use(super.e -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:237:11: Error: Superclass has no setter named 'f'.
+//     super.f -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:238:15: Error: Superclass has no setter named 'f'.
+//     use(super.f -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:239:11: Error: Superclass has no getter named 'g'.
+//     super.g -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:240:15: Error: Superclass has no getter named 'g'.
+//     use(super.g -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:247:11: Error: Superclass has no setter named 'm'.
+//     super.m -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:248:15: Error: Superclass has no setter named 'm'.
+//     use(super.m -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:95:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     super.m++;
+//            ^
+//
+// pkg/front_end/testcases/rasta/super.dart:96:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     use(super.m++);
+//                ^
+//
+// pkg/front_end/testcases/rasta/super.dart:97:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     super.n++;
+//            ^
+//
+// pkg/front_end/testcases/rasta/super.dart:98:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     use(super.n++);
+//                ^
+//
+// pkg/front_end/testcases/rasta/super.dart:120:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     ++super.m;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:121:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     use(++super.m);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:122:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     ++super.n;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:123:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     use(++super.n);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:146:15: Error: This expression has type 'void' and can't be used.
+//     use(super.m());
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:147:12: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     super.m(87);
+//            ^
+//
+// pkg/front_end/testcases/rasta/super.dart:148:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     use(super.m(87));
+//                ^
+//
+// pkg/front_end/testcases/rasta/super.dart:149:12: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     super.n(87);
+//            ^
+//
+// pkg/front_end/testcases/rasta/super.dart:150:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     use(super.n(87));
+//                ^
+//
+// pkg/front_end/testcases/rasta/super.dart:222:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     super.m += 42;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:223:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     use(super.m += 42);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:224:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     super.n += 42;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:225:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
+//     use(super.n += 42);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:247:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
+//     super.m -= 42;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:248:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
+//     use(super.m -= 42);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:249:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
+//     super.n -= 42;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:250:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
+//     use(super.n -= 42);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic a = null;
+  field dynamic b = null;
+  field dynamic c = null;
+  field dynamic d = null;
+  final field dynamic f = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  get e() → dynamic
+    return null;
+  set g(dynamic _) → void {}
+  get h() → dynamic
+    return null;
+  set h(dynamic _) → void {}
+  get i() → dynamic
+    return null;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic a, dynamic b) → void {}
+  operator ~() → dynamic
+    return 117;
+  operator unary-() → dynamic
+    return 117;
+  operator ==(dynamic other) → core::bool*
+    return true;
+  method m() → void {}
+  method n() → void {}
+  set n(dynamic _) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  final field dynamic d = null;
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  get b() → dynamic
+    return null;
+  set c(dynamic x) → void {}
+  set i(dynamic x) → void {}
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  method test() → dynamic {
+    super.{self::A::~}();
+    self::use(super.{self::A::~}());
+    super.{self::A::unary-}();
+    self::use(super.{self::A::unary-}());
+    invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:5: Error: This couldn't be parsed.
+    +super;
+    ^"{<invalid>}.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    +super;
+     ^^^^^");
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:9: Error: This couldn't be parsed.
+    use(+super);
+        ^"{<invalid>}.+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^"));
+    super.{self::A::==}(87);
+    self::use(super.{self::A::==}(87));
+    !super.{self::A::==}(87);
+    self::use(!super.{self::A::==}(87));
+    super.{self::A::a};
+    self::use(super.{self::A::a});
+    super.{self::B::b};
+    self::use(super.{self::B::b});
+    super.{self::A::c};
+    self::use(super.{self::A::c});
+    super.{self::B::d};
+    self::use(super.{self::B::d});
+    super.{self::A::e};
+    self::use(super.{self::A::e});
+    super.{self::A::f};
+    self::use(super.{self::A::f});
+    super.g;
+    self::use(super.g);
+    super.{self::A::h};
+    self::use(super.{self::A::h});
+    super.{self::A::i};
+    self::use(super.{self::A::i});
+    super.{self::A::[]}(87);
+    self::use(super.{self::A::[]}(87));
+    super.{self::A::m};
+    self::use(super.{self::A::m});
+    super.{self::A::n};
+    self::use(super.{self::A::n});
+    super.{self::A::a} = super.{self::A::a}{dynamic}.+(1);
+    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1{dynamic}.+(1) in #t1);
+    super.{self::A::b} = super.{self::B::b}{dynamic}.+(1);
+    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3{dynamic}.+(1) in #t3);
+    super.{self::B::c} = super.{self::A::c}{dynamic}.+(1);
+    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5{dynamic}.+(1) in #t5);
+    super.{self::A::d} = super.{self::B::d}{dynamic}.+(1);
+    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7{dynamic}.+(1) in #t7);
+    super.e = super.{self::A::e}{dynamic}.+(1);
+    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9{dynamic}.+(1) in #t9);
+    super.f = super.{self::A::f}{dynamic}.+(1);
+    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11{dynamic}.+(1) in #t11);
+    super.{self::A::g} = super.g{dynamic}.+(1);
+    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13{dynamic}.+(1) in #t13);
+    super.{self::A::h} = super.{self::A::h}{dynamic}.+(1);
+    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15{dynamic}.+(1) in #t15);
+    super.{self::B::i} = super.{self::A::i}{dynamic}.+(1);
+    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17{dynamic}.+(1) in #t17);
+    let final core::int* #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19){dynamic}.+(1));
+    self::use(let final core::int* #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final void #t22 = super.{self::A::[]=}(#t20, #t21{dynamic}.+(1)) in #t21);
+    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    super.m++;
+           ^" in super.{self::A::m}{<unresolved>}.+(1);
+    self::use(let final () →* void #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:96:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    use(super.m++);
+               ^" in #t23{<unresolved>}.+(1) in #t23);
+    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:97:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    super.n++;
+           ^" in super.{self::A::n}{<unresolved>}.+(1);
+    self::use(let final () →* void #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:98:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    use(super.n++);
+               ^" in #t25{<unresolved>}.+(1) in #t25);
+    super.{self::A::a} = super.{self::A::a}{dynamic}.+(1);
+    self::use(super.{self::A::a} = super.{self::A::a}{dynamic}.+(1));
+    super.{self::A::b} = super.{self::B::b}{dynamic}.+(1);
+    self::use(super.{self::A::b} = super.{self::B::b}{dynamic}.+(1));
+    super.{self::B::c} = super.{self::A::c}{dynamic}.+(1);
+    self::use(super.{self::B::c} = super.{self::A::c}{dynamic}.+(1));
+    super.{self::A::d} = super.{self::B::d}{dynamic}.+(1);
+    self::use(super.{self::A::d} = super.{self::B::d}{dynamic}.+(1));
+    super.e = super.{self::A::e}{dynamic}.+(1);
+    self::use(super.e = super.{self::A::e}{dynamic}.+(1));
+    super.f = super.{self::A::f}{dynamic}.+(1);
+    self::use(super.f = super.{self::A::f}{dynamic}.+(1));
+    super.{self::A::g} = super.g{dynamic}.+(1);
+    self::use(super.{self::A::g} = super.g{dynamic}.+(1));
+    super.{self::A::h} = super.{self::A::h}{dynamic}.+(1);
+    self::use(super.{self::A::h} = super.{self::A::h}{dynamic}.+(1));
+    super.{self::B::i} = super.{self::A::i}{dynamic}.+(1);
+    self::use(super.{self::B::i} = super.{self::A::i}{dynamic}.+(1));
+    let final core::int* #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27){dynamic}.+(1) in let final void #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
+    self::use(let final core::int* #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30){dynamic}.+(1) in let final void #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
+    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:120:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    ++super.m;
+    ^" in super.{self::A::m}{<unresolved>}.+(1);
+    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:121:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    use(++super.m);
+        ^" in super.{self::A::m}{<unresolved>}.+(1));
+    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:122:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    ++super.n;
+    ^" in super.{self::A::n}{<unresolved>}.+(1);
+    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:123:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    use(++super.n);
+        ^" in super.{self::A::n}{<unresolved>}.+(1));
+    super.{self::A::a}{dynamic}.call();
+    self::use(super.{self::A::a}{dynamic}.call());
+    super.{self::B::b}{dynamic}.call();
+    self::use(super.{self::B::b}{dynamic}.call());
+    super.{self::A::c}{dynamic}.call();
+    self::use(super.{self::A::c}{dynamic}.call());
+    super.{self::B::d}{dynamic}.call();
+    self::use(super.{self::B::d}{dynamic}.call());
+    super.{self::A::e}{dynamic}.call();
+    self::use(super.{self::A::e}{dynamic}.call());
+    super.{self::A::f}{dynamic}.call();
+    self::use(super.{self::A::f}{dynamic}.call());
+    super.g();
+    self::use(super.g());
+    super.{self::A::h}{dynamic}.call();
+    self::use(super.{self::A::h}{dynamic}.call());
+    super.{self::A::i}{dynamic}.call();
+    self::use(super.{self::A::i}{dynamic}.call());
+    super.{self::A::[]}(87){dynamic}.call();
+    self::use(super.{self::A::[]}(87){dynamic}.call());
+    super.{self::A::m}();
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:146:15: Error: This expression has type 'void' and can't be used.
+    use(super.m());
+              ^" in super.{self::A::m}());
+    invalid-expression "pkg/front_end/testcases/rasta/super.dart:147:12: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    super.m(87);
+           ^" in super.{self::A::m}(87);
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:148:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    use(super.m(87));
+               ^" in super.{self::A::m}(87));
+    invalid-expression "pkg/front_end/testcases/rasta/super.dart:149:12: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    super.n(87);
+           ^" in super.{self::A::n}(87);
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:150:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+    use(super.n(87));
+               ^" in super.{self::A::n}(87));
+    super.{self::A::a} = 42;
+    self::use(super.{self::A::a} = 42);
+    super.{self::A::b} = 42;
+    self::use(super.{self::A::b} = 42);
+    super.{self::B::c} = 42;
+    self::use(super.{self::B::c} = 42);
+    super.{self::A::d} = 42;
+    self::use(super.{self::A::d} = 42);
+    super.e = 42;
+    self::use(super.e = 42);
+    super.f = 42;
+    self::use(super.f = 42);
+    super.{self::A::g} = 42;
+    self::use(super.{self::A::g} = 42);
+    super.{self::A::h} = 42;
+    self::use(super.{self::A::h} = 42);
+    super.{self::B::i} = 42;
+    self::use(super.{self::B::i} = 42);
+    super.{self::A::[]=}(87, 42);
+    self::use(let final core::int* #t33 = 87 in let final core::int* #t34 = 42 in let final void #t35 = super.{self::A::[]=}(#t33, #t34) in #t34);
+    super.m = 42;
+    self::use(super.m = 42);
+    super.{self::A::n} = 42;
+    self::use(super.{self::A::n} = 42);
+    super.{self::A::a} == null ?{dynamic} super.{self::A::a} = 42 : null;
+    self::use(let final dynamic #t36 = super.{self::A::a} in #t36 == null ?{dynamic} super.{self::A::a} = 42 : #t36);
+    super.{self::B::b} == null ?{dynamic} super.{self::A::b} = 42 : null;
+    self::use(let final dynamic #t37 = super.{self::B::b} in #t37 == null ?{dynamic} super.{self::A::b} = 42 : #t37);
+    super.{self::A::c} == null ?{dynamic} super.{self::B::c} = 42 : null;
+    self::use(let final dynamic #t38 = super.{self::A::c} in #t38 == null ?{dynamic} super.{self::B::c} = 42 : #t38);
+    super.{self::B::d} == null ?{dynamic} super.{self::A::d} = 42 : null;
+    self::use(let final dynamic #t39 = super.{self::B::d} in #t39 == null ?{dynamic} super.{self::A::d} = 42 : #t39);
+    super.{self::A::e} == null ?{dynamic} super.e = 42 : null;
+    self::use(let final dynamic #t40 = super.{self::A::e} in #t40 == null ?{dynamic} super.e = 42 : #t40);
+    super.{self::A::f} == null ?{dynamic} super.f = 42 : null;
+    self::use(let final dynamic #t41 = super.{self::A::f} in #t41 == null ?{dynamic} super.f = 42 : #t41);
+    super.g == null ?{dynamic} super.{self::A::g} = 42 : null;
+    self::use(let final dynamic #t42 = super.g in #t42 == null ?{dynamic} super.{self::A::g} = 42 : #t42);
+    super.{self::A::h} == null ?{dynamic} super.{self::A::h} = 42 : null;
+    self::use(let final dynamic #t43 = super.{self::A::h} in #t43 == null ?{dynamic} super.{self::A::h} = 42 : #t43);
+    super.{self::A::i} == null ?{dynamic} super.{self::B::i} = 42 : null;
+    self::use(let final dynamic #t44 = super.{self::A::i} in #t44 == null ?{dynamic} super.{self::B::i} = 42 : #t44);
+    let final core::int* #t45 = 87 in super.{self::A::[]}(#t45) == null ?{dynamic} super.{self::A::[]=}(#t45, 42) : null;
+    self::use(let final core::int* #t46 = 87 in let final dynamic #t47 = super.{self::A::[]}(#t46) in #t47 == null ?{dynamic} let final core::int* #t48 = 42 in let final void #t49 = super.{self::A::[]=}(#t46, #t48) in #t48 : #t47);
+    super.{self::A::m} == null ?{core::Object*} super.m = 42 : null;
+    self::use(let final () →* void #t50 = super.{self::A::m} in #t50 == null ?{core::Object*} super.m = 42 : #t50);
+    super.{self::A::n} == null ?{core::Object*} super.{self::A::n} = 42 : null;
+    self::use(let final () →* void #t51 = super.{self::A::n} in #t51 == null ?{core::Object*} super.{self::A::n} = 42 : #t51);
+    super.{self::A::a} = super.{self::A::a}{dynamic}.+(42);
+    self::use(super.{self::A::a} = super.{self::A::a}{dynamic}.+(42));
+    super.{self::A::b} = super.{self::B::b}{dynamic}.+(42);
+    self::use(super.{self::A::b} = super.{self::B::b}{dynamic}.+(42));
+    super.{self::B::c} = super.{self::A::c}{dynamic}.+(42);
+    self::use(super.{self::B::c} = super.{self::A::c}{dynamic}.+(42));
+    super.{self::A::d} = super.{self::B::d}{dynamic}.+(42);
+    self::use(super.{self::A::d} = super.{self::B::d}{dynamic}.+(42));
+    super.e = super.{self::A::e}{dynamic}.+(42);
+    self::use(super.e = super.{self::A::e}{dynamic}.+(42));
+    super.f = super.{self::A::f}{dynamic}.+(42);
+    self::use(super.f = super.{self::A::f}{dynamic}.+(42));
+    super.{self::A::g} = super.g{dynamic}.+(42);
+    self::use(super.{self::A::g} = super.g{dynamic}.+(42));
+    super.{self::A::h} = super.{self::A::h}{dynamic}.+(42);
+    self::use(super.{self::A::h} = super.{self::A::h}{dynamic}.+(42));
+    super.{self::B::i} = super.{self::A::i}{dynamic}.+(42);
+    self::use(super.{self::B::i} = super.{self::A::i}{dynamic}.+(42));
+    let final core::int* #t52 = 87 in super.{self::A::[]=}(#t52, super.{self::A::[]}(#t52){dynamic}.+(42));
+    self::use(let final core::int* #t53 = 87 in let final dynamic #t54 = super.{self::A::[]}(#t53){dynamic}.+(42) in let final void #t55 = super.{self::A::[]=}(#t53, #t54) in #t54);
+    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    super.m += 42;
+            ^" in super.{self::A::m}{<unresolved>}.+(42);
+    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:223:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    use(super.m += 42);
+                ^" in super.{self::A::m}{<unresolved>}.+(42));
+    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:224:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    super.n += 42;
+            ^" in super.{self::A::n}{<unresolved>}.+(42);
+    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:225:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+    use(super.n += 42);
+                ^" in super.{self::A::n}{<unresolved>}.+(42));
+    super.{self::A::a} = super.{self::A::a}{dynamic}.-(42);
+    self::use(super.{self::A::a} = super.{self::A::a}{dynamic}.-(42));
+    super.{self::A::b} = super.{self::B::b}{dynamic}.-(42);
+    self::use(super.{self::A::b} = super.{self::B::b}{dynamic}.-(42));
+    super.{self::B::c} = super.{self::A::c}{dynamic}.-(42);
+    self::use(super.{self::B::c} = super.{self::A::c}{dynamic}.-(42));
+    super.{self::A::d} = super.{self::B::d}{dynamic}.-(42);
+    self::use(super.{self::A::d} = super.{self::B::d}{dynamic}.-(42));
+    super.e = super.{self::A::e}{dynamic}.-(42);
+    self::use(super.e = super.{self::A::e}{dynamic}.-(42));
+    super.f = super.{self::A::f}{dynamic}.-(42);
+    self::use(super.f = super.{self::A::f}{dynamic}.-(42));
+    super.{self::A::g} = super.g{dynamic}.-(42);
+    self::use(super.{self::A::g} = super.g{dynamic}.-(42));
+    super.{self::A::h} = super.{self::A::h}{dynamic}.-(42);
+    self::use(super.{self::A::h} = super.{self::A::h}{dynamic}.-(42));
+    super.{self::B::i} = super.{self::A::i}{dynamic}.-(42);
+    self::use(super.{self::B::i} = super.{self::A::i}{dynamic}.-(42));
+    let final core::int* #t56 = 87 in super.{self::A::[]=}(#t56, super.{self::A::[]}(#t56){dynamic}.-(42));
+    self::use(let final core::int* #t57 = 87 in let final dynamic #t58 = super.{self::A::[]}(#t57){dynamic}.-(42) in let final void #t59 = super.{self::A::[]=}(#t57, #t58) in #t58);
+    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
+    super.m -= 42;
+            ^" in super.{self::A::m}{<unresolved>}.-(42);
+    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:248:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
+    use(super.m -= 42);
+                ^" in super.{self::A::m}{<unresolved>}.-(42));
+    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:249:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
+    super.n -= 42;
+            ^" in super.{self::A::n}{<unresolved>}.-(42);
+    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
+    use(super.n -= 42);
+                ^" in super.{self::A::n}{<unresolved>}.-(42));
+  }
+}
+static method use(dynamic x) → dynamic {
+  if(x =={core::Object::==}{(core::Object*) →* core::bool*} new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}{core::int*})
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}(){() →* dynamic};
+}
diff --git a/pkg/front_end/testcases/rasta/super_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/super_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..03f043f
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_initializer.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/super_initializer.dart:15:15: Error: Can't have initializers after 'super'.
+//         field = 42;
+//               ^
+//
+// pkg/front_end/testcases/rasta/super_initializer.dart:18:15: Error: Can't have initializers after 'super'.
+//         field = 42;
+//               ^
+//
+// pkg/front_end/testcases/rasta/super_initializer.dart:21:15: Error: Can't have initializers after 'super'.
+//         field = 42;
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor arg0() → self::Super*
+    : super core::Object::•()
+    ;
+  constructor arg1(dynamic a) → self::Super*
+    : super core::Object::•()
+    ;
+  constructor arg2(dynamic a, dynamic b) → self::Super*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Sub extends self::Super {
+  field dynamic field;
+  constructor arg0() → self::Sub*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:15:15: Error: Can't have initializers after 'super'.
+        field = 42;
+              ^", super self::Super::arg0()
+    ;
+  constructor arg1(dynamic a) → self::Sub*
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:18:15: Error: Can't have initializers after 'super'.
+        field = 42;
+              ^", super self::Super::arg1(a)
+    ;
+  constructor arg2(dynamic a, dynamic b) → self::Sub*
+    : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:21:15: Error: Can't have initializers after 'super'.
+        field = 42;
+              ^", super self::Super::arg2(a, b)
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..0327051
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.weak.modular.expect
@@ -0,0 +1,223 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "mixin_library.dart" as mix;
+
+import "org-dartlang-testcase:///mixin_library.dart" show Mixin;
+
+class Super<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::S*>*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return 40;
+  method f() → dynamic
+    return 3;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&Super&Mixin<V extends core::Object* = dynamic> = self::Super<self::_C&Super&Mixin::V*> with mix::Mixin<self::_C&Super&Mixin::V*> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V*>*
+    : super self::Super::•()
+    ;
+  mixin-super-stub get x() → dynamic
+    return super.{mix::Mixin::x};
+  mixin-super-stub set x(dynamic value) → void
+    return super.{mix::Mixin::x} = value;
+  mixin-super-stub get y() → dynamic
+    return super.{mix::Mixin::y};
+  mixin-super-stub set y(dynamic value) → void
+    return super.{mix::Mixin::y} = value;
+  mixin-super-stub get z() → dynamic
+    return super.{mix::Mixin::z};
+  mixin-super-stub set z(dynamic value) → void
+    return super.{mix::Mixin::z} = value;
+  mixin-super-stub get t() → self::_C&Super&Mixin::V*
+    return super.{mix::Mixin::t};
+  mixin-super-stub set t(covariant-by-class self::_C&Super&Mixin::V* value) → void
+    return super.{mix::Mixin::t} = value;
+  mixin-super-stub method foo() → dynamic
+    return super.{mix::Mixin::foo}();
+  mixin-super-stub method g(covariant-by-class self::_C&Super&Mixin::V* a) → self::_C&Super&Mixin::V*
+    return super.{mix::Mixin::g}(a);
+  mixin-super-stub method h() → dynamic
+    return super.{mix::Mixin::h}();
+  mixin-super-stub method l() → dynamic
+    return super.{mix::Mixin::l}();
+  mixin-super-stub method _privateMethod() → dynamic
+    return super.{mix::Mixin::_privateMethod}();
+  mixin-super-stub method publicMethod() → dynamic
+    return super.{mix::Mixin::publicMethod}();
+}
+class C<V extends core::Object* = dynamic> extends self::_C&Super&Mixin<self::C::V*> {
+  synthetic constructor •() → self::C<self::C::V*>*
+    : super self::_C&Super&Mixin::•()
+    ;
+}
+abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&Super&Mixin*
+    : super self::Super::•()
+    ;
+  mixin-super-stub get x() → dynamic
+    return super.{mix::Mixin::x};
+  mixin-super-stub set x(dynamic value) → void
+    return super.{mix::Mixin::x} = value;
+  mixin-super-stub get y() → dynamic
+    return super.{mix::Mixin::y};
+  mixin-super-stub set y(dynamic value) → void
+    return super.{mix::Mixin::y} = value;
+  mixin-super-stub get z() → dynamic
+    return super.{mix::Mixin::z};
+  mixin-super-stub set z(dynamic value) → void
+    return super.{mix::Mixin::z} = value;
+  mixin-super-stub get t() → dynamic
+    return super.{mix::Mixin::t};
+  mixin-super-stub set t(covariant-by-class dynamic value) → void
+    return super.{mix::Mixin::t} = value;
+  mixin-super-stub method foo() → dynamic
+    return super.{mix::Mixin::foo}();
+  mixin-super-stub method g(covariant-by-class dynamic a) → dynamic
+    return super.{mix::Mixin::g}(a);
+  mixin-super-stub method h() → dynamic
+    return super.{mix::Mixin::h}();
+  mixin-super-stub method l() → dynamic
+    return super.{mix::Mixin::l}();
+  mixin-super-stub method _privateMethod() → dynamic
+    return super.{mix::Mixin::_privateMethod}();
+  mixin-super-stub method publicMethod() → dynamic
+    return super.{mix::Mixin::publicMethod}();
+}
+class D extends self::_D&Super&Mixin {
+  synthetic constructor •() → self::D*
+    : super self::_D&Super&Mixin::•()
+    ;
+}
+class C2<V extends core::Object* = dynamic> = self::Super<self::C2::V*> with mix::Mixin<self::C2::V*> {
+  synthetic constructor •() → self::C2<self::C2::V*>*
+    : super self::Super::•()
+    ;
+  mixin-super-stub get x() → dynamic
+    return super.{mix::Mixin::x};
+  mixin-super-stub set x(dynamic value) → void
+    return super.{mix::Mixin::x} = value;
+  mixin-super-stub get y() → dynamic
+    return super.{mix::Mixin::y};
+  mixin-super-stub set y(dynamic value) → void
+    return super.{mix::Mixin::y} = value;
+  mixin-super-stub get z() → dynamic
+    return super.{mix::Mixin::z};
+  mixin-super-stub set z(dynamic value) → void
+    return super.{mix::Mixin::z} = value;
+  mixin-super-stub get t() → self::C2::V*
+    return super.{mix::Mixin::t};
+  mixin-super-stub set t(covariant-by-class self::C2::V* value) → void
+    return super.{mix::Mixin::t} = value;
+  mixin-super-stub method foo() → dynamic
+    return super.{mix::Mixin::foo}();
+  mixin-super-stub method g(covariant-by-class self::C2::V* a) → self::C2::V*
+    return super.{mix::Mixin::g}(a);
+  mixin-super-stub method h() → dynamic
+    return super.{mix::Mixin::h}();
+  mixin-super-stub method l() → dynamic
+    return super.{mix::Mixin::l}();
+  mixin-super-stub method _privateMethod() → dynamic
+    return super.{mix::Mixin::_privateMethod}();
+  mixin-super-stub method publicMethod() → dynamic
+    return super.{mix::Mixin::publicMethod}();
+}
+class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
+  synthetic constructor •() → self::D2*
+    : super self::Super::•()
+    ;
+  mixin-super-stub get x() → dynamic
+    return super.{mix::Mixin::x};
+  mixin-super-stub set x(dynamic value) → void
+    return super.{mix::Mixin::x} = value;
+  mixin-super-stub get y() → dynamic
+    return super.{mix::Mixin::y};
+  mixin-super-stub set y(dynamic value) → void
+    return super.{mix::Mixin::y} = value;
+  mixin-super-stub get z() → dynamic
+    return super.{mix::Mixin::z};
+  mixin-super-stub set z(dynamic value) → void
+    return super.{mix::Mixin::z} = value;
+  mixin-super-stub get t() → dynamic
+    return super.{mix::Mixin::t};
+  mixin-super-stub set t(covariant-by-class dynamic value) → void
+    return super.{mix::Mixin::t} = value;
+  mixin-super-stub method foo() → dynamic
+    return super.{mix::Mixin::foo}();
+  mixin-super-stub method g(covariant-by-class dynamic a) → dynamic
+    return super.{mix::Mixin::g}(a);
+  mixin-super-stub method h() → dynamic
+    return super.{mix::Mixin::h}();
+  mixin-super-stub method l() → dynamic
+    return super.{mix::Mixin::l}();
+  mixin-super-stub method _privateMethod() → dynamic
+    return super.{mix::Mixin::_privateMethod}();
+  mixin-super-stub method publicMethod() → dynamic
+    return super.{mix::Mixin::publicMethod}();
+}
+static method main() → dynamic {
+  core::print(new self::C::•<dynamic>().{self::_C&Super&Mixin::foo}(){() →* dynamic});
+  core::print(new self::C2::•<dynamic>().{self::C2::foo}(){() →* dynamic});
+}
+
+library test.mixin_library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
+//   foo() => super.foo() + f();
+//                  ^^^
+//
+import self as mix;
+import "dart:core" as core;
+
+class Mixin<T extends core::Object* = dynamic> extends core::Object {
+  field dynamic x = mix::f();
+  field dynamic y = null;
+  field dynamic z = null;
+  covariant-by-class field mix::Mixin::T* t = null;
+  synthetic constructor •() → mix::Mixin<mix::Mixin::T*>*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return super.foo(){dynamic}.+(mix::f());
+  method g(covariant-by-class mix::Mixin::T* a) → mix::Mixin::T*
+    return null;
+  method h() → dynamic
+    return mix::V();
+  method l() → dynamic
+    return mix::_private();
+  method _privateMethod() → dynamic
+    return 49;
+  method publicMethod() → dynamic
+    return this.{mix::Mixin::_privateMethod}(){() →* dynamic};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method f() → dynamic
+  return 2;
+static method V() → dynamic
+  return 87;
+static method _private() → dynamic
+  return 117;
+static method foo(dynamic m) → dynamic
+  return m{dynamic}._privateMethod();
diff --git a/pkg/front_end/testcases/rasta/super_operator.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/super_operator.dart.weak.modular.expect
new file mode 100644
index 0000000..8b04b02
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_operator.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/super_operator.dart:22:15: Error: Superclass has no method named '[]'.
+//   g() => super[0];
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(core::String* s) → dynamic
+    return null;
+  operator [](dynamic i) → dynamic
+    return null;
+  operator []=(dynamic i, dynamic val) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  operator +(core::String* s) → dynamic
+    return super.{self::A::+}("${s}${s}");
+  operator [](dynamic i) → dynamic
+    return super.{self::A::[]}(i);
+  operator []=(dynamic i, dynamic val) → void
+    return let final dynamic #t1 = let final dynamic #t2 = i in let final dynamic #t3 = i = #t2{dynamic}.+(1) in #t2 in let final dynamic #t4 = super.{self::A::[]}(#t1){dynamic}.+(val) in let final void #t5 = super.{self::A::[]=}(#t1, #t4) in #t4;
+}
+class Autobianchi extends core::Object {
+  synthetic constructor •() → self::Autobianchi*
+    : super core::Object::•()
+    ;
+  method g() → dynamic
+    return super.[](0);
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/rasta/supports_reflection.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/supports_reflection.dart.weak.modular.expect
new file mode 100644
index 0000000..d2d46a3
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/supports_reflection.dart.weak.modular.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = false
+}
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.weak.modular.expect
new file mode 100644
index 0000000..4a25d3e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.weak.modular.expect
@@ -0,0 +1,85 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:5: Error: Switch case may fall through to the next case.
+//     case 2:  result = 2; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:5: Error: Switch case may fall through to the next case.
+//     case 3:  result = 3; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:46:5: Error: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test(dynamic value) → dynamic {
+  dynamic result;
+  #L1:
+  switch(value) {
+    #L2:
+    case #C1:
+      {
+        result = 1;
+        break #L1;
+      }
+    #L3:
+    case #C2:
+      {
+        result = 2;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 35);
+      }
+    #L4:
+    case #C3:
+      {
+        result = 3;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 36);
+      }
+    #L5:
+    default:
+      {
+        result = 4;
+      }
+  }
+  return result;
+}
+static method testEmptyCases(dynamic value) → dynamic {
+  dynamic result;
+  #L6:
+  switch(value) {
+    #L7:
+    case #C1:
+    case #C2:
+      {
+        result = 1;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 46);
+      }
+    #L8:
+    case #C3:
+    case #C4:
+      {
+        result = 2;
+        break #L6;
+      }
+    #L9:
+    case #C5:
+    case #C6:
+    default:
+      {}
+  }
+  return result;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 3
+  #C4 = 4
+  #C5 = 5
+  #C6 = 6
+}
diff --git a/pkg/front_end/testcases/rasta/switch_fall_through.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.weak.modular.expect
new file mode 100644
index 0000000..c69920c
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/switch_fall_through.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:7:5: Error: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:13:5: Error: Switch case may fall through to the next case.
+//     case 2:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:20:5: Error: Switch case may fall through to the next case.
+//     case 3:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:26:5: Error: Switch case may fall through to the next case.
+//     case 4:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:31:5: Error: Switch case may fall through to the next case.
+//     case 5:
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  #L1:
+  switch(1) {
+    #L2:
+    case #C1:
+      {
+        {
+          "No fall-through error needed.";
+          break #L1;
+          ;
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 7);
+      }
+    #L3:
+    case #C2:
+      {
+        {
+          "Fall-through error needed.";
+          if(true) {
+            break #L1;
+          }
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 13);
+      }
+    #L4:
+    case #C3:
+      {
+        try {
+          "No fall-through error needed.";
+        }
+        finally {
+          break #L1;
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 20);
+      }
+    #L5:
+    case #C4:
+      {
+        try {
+          "No fall-through error needed.";
+          break #L1;
+        }
+        finally {
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 26);
+      }
+    #L6:
+    case #C5:
+      {
+        try {
+          "Fall-through error needed.";
+        }
+        finally {
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 31);
+      }
+    #L7:
+    case #C6:
+      {
+        "Should be last. No fall-through error, falling through allowed here.";
+      }
+  }
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 3
+  #C4 = 4
+  #C5 = 5
+  #C6 = 10000
+}
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.weak.modular.expect
new file mode 100644
index 0000000..37dfbd7
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method m(dynamic x) → dynamic
+    return this.{self::C::call}(x){(dynamic) →* dynamic};
+  method call(dynamic x) → dynamic
+    return 42;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::C::m}(42){(dynamic) →* dynamic});
+}
diff --git a/pkg/front_end/testcases/rasta/try_label.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/try_label.dart.weak.modular.expect
new file mode 100644
index 0000000..14f6249
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/try_label.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/try_label.dart:9:5: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//     continue L;
+//     ^^^^^^^^
+//
+import self as self;
+
+static method main() → dynamic {
+  #L1:
+  try {
+    break #L1;
+  }
+  finally {
+    break #L1;
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/type_literals.dart.weak.modular.expect
new file mode 100644
index 0000000..de13441
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.weak.modular.expect
@@ -0,0 +1,538 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:22:5: Error: Couldn't find constructor 'dynamic'.
+//     dynamic();
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:23:9: Error: Couldn't find constructor 'dynamic'.
+//     use(dynamic());
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:24:5: Error: Couldn't find constructor 'T'.
+//     T();
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:25:9: Error: Couldn't find constructor 'T'.
+//     use(T());
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:26:5: Error: Couldn't find constructor 'Func'.
+//     Func();
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:27:9: Error: Couldn't find constructor 'Func'.
+//     use(Func());
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:29:5: Error: Can't assign to a type literal.
+//     C = 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:30:9: Error: Can't assign to a type literal.
+//     use(C = 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:31:5: Error: Can't assign to a type literal.
+//     dynamic = 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:32:9: Error: Can't assign to a type literal.
+//     use(dynamic = 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:33:5: Error: Can't assign to a type literal.
+//     T = 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:34:9: Error: Can't assign to a type literal.
+//     use(T = 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:35:5: Error: Can't assign to a type literal.
+//     Func = 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:36:9: Error: Can't assign to a type literal.
+//     use(Func = 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:38:5: Error: Can't assign to a type literal.
+//     C++;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:39:9: Error: Can't assign to a type literal.
+//     use(C++);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:40:5: Error: Can't assign to a type literal.
+//     dynamic++;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:41:9: Error: Can't assign to a type literal.
+//     use(dynamic++);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:42:5: Error: Can't assign to a type literal.
+//     T++;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:43:9: Error: Can't assign to a type literal.
+//     use(T++);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:44:5: Error: Can't assign to a type literal.
+//     Func++;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:45:9: Error: Can't assign to a type literal.
+//     use(Func++);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:47:7: Error: Can't assign to a type literal.
+//     ++C;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:48:11: Error: Can't assign to a type literal.
+//     use(++C);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:49:7: Error: Can't assign to a type literal.
+//     ++dynamic;
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:50:11: Error: Can't assign to a type literal.
+//     use(++dynamic);
+//           ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:51:7: Error: Can't assign to a type literal.
+//     ++T;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:52:11: Error: Can't assign to a type literal.
+//     use(++T);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:53:7: Error: Can't assign to a type literal.
+//     ++Func;
+//       ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:54:11: Error: Can't assign to a type literal.
+//     use(++Func);
+//           ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:56:5: Error: Can't assign to a type literal.
+//     C--;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:57:9: Error: Can't assign to a type literal.
+//     use(C--);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:58:5: Error: Can't assign to a type literal.
+//     dynamic--;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:59:9: Error: Can't assign to a type literal.
+//     use(dynamic--);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:60:5: Error: Can't assign to a type literal.
+//     T--;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:61:9: Error: Can't assign to a type literal.
+//     use(T--);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:62:5: Error: Can't assign to a type literal.
+//     Func--;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:63:9: Error: Can't assign to a type literal.
+//     use(Func--);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:65:7: Error: Can't assign to a type literal.
+//     --C;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:66:11: Error: Can't assign to a type literal.
+//     use(--C);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:67:7: Error: Can't assign to a type literal.
+//     --dynamic;
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:68:11: Error: Can't assign to a type literal.
+//     use(--dynamic);
+//           ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:69:7: Error: Can't assign to a type literal.
+//     --T;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:70:11: Error: Can't assign to a type literal.
+//     use(--T);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:71:7: Error: Can't assign to a type literal.
+//     --Func;
+//       ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Can't assign to a type literal.
+//     use(--Func);
+//           ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
+//     C ??= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
+//     use(C ??= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
+//     dynamic ??= 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
+//     use(dynamic ??= 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
+//     T ??= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
+//     use(T ??= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
+//     Func ??= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
+//     use(Func ??= 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Can't assign to a type literal.
+//     C += 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:84:9: Error: Can't assign to a type literal.
+//     use(C += 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:85:5: Error: Can't assign to a type literal.
+//     dynamic += 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:86:9: Error: Can't assign to a type literal.
+//     use(dynamic += 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:87:5: Error: Can't assign to a type literal.
+//     T += 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:88:9: Error: Can't assign to a type literal.
+//     use(T += 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:89:5: Error: Can't assign to a type literal.
+//     Func += 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:90:9: Error: Can't assign to a type literal.
+//     use(Func += 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:92:5: Error: Can't assign to a type literal.
+//     C -= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:93:9: Error: Can't assign to a type literal.
+//     use(C -= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:94:5: Error: Can't assign to a type literal.
+//     dynamic -= 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:95:9: Error: Can't assign to a type literal.
+//     use(dynamic -= 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:96:5: Error: Can't assign to a type literal.
+//     T -= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:97:9: Error: Can't assign to a type literal.
+//     use(T -= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:98:5: Error: Can't assign to a type literal.
+//     Func -= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:99:9: Error: Can't assign to a type literal.
+//     use(Func -= 42);
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Func = () →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method test() → dynamic {
+    #C1;
+    self::use(#C1);
+    #C2;
+    self::use(#C2);
+    self::C::T*;
+    self::use(self::C::T*);
+    #C3;
+    self::use(#C3);
+    new self::C::•<dynamic>();
+    self::use(new self::C::•<dynamic>());
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:22:5: Error: Couldn't find constructor 'dynamic'.
+    dynamic();
+    ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:23:9: Error: Couldn't find constructor 'dynamic'.
+    use(dynamic());
+        ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:24:5: Error: Couldn't find constructor 'T'.
+    T();
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:25:9: Error: Couldn't find constructor 'T'.
+    use(T());
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:26:5: Error: Couldn't find constructor 'Func'.
+    Func();
+    ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:27:9: Error: Couldn't find constructor 'Func'.
+    use(Func());
+        ^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:29:5: Error: Can't assign to a type literal.
+    C = 42;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:30:9: Error: Can't assign to a type literal.
+    use(C = 42);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:31:5: Error: Can't assign to a type literal.
+    dynamic = 42;
+    ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:32:9: Error: Can't assign to a type literal.
+    use(dynamic = 42);
+        ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:33:5: Error: Can't assign to a type literal.
+    T = 42;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:34:9: Error: Can't assign to a type literal.
+    use(T = 42);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:35:5: Error: Can't assign to a type literal.
+    Func = 42;
+    ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:36:9: Error: Can't assign to a type literal.
+    use(Func = 42);
+        ^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:38:5: Error: Can't assign to a type literal.
+    C++;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:39:9: Error: Can't assign to a type literal.
+    use(C++);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:40:5: Error: Can't assign to a type literal.
+    dynamic++;
+    ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:41:9: Error: Can't assign to a type literal.
+    use(dynamic++);
+        ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:42:5: Error: Can't assign to a type literal.
+    T++;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:43:9: Error: Can't assign to a type literal.
+    use(T++);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:44:5: Error: Can't assign to a type literal.
+    Func++;
+    ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:45:9: Error: Can't assign to a type literal.
+    use(Func++);
+        ^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:47:7: Error: Can't assign to a type literal.
+    ++C;
+      ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:48:11: Error: Can't assign to a type literal.
+    use(++C);
+          ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:49:7: Error: Can't assign to a type literal.
+    ++dynamic;
+      ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:50:11: Error: Can't assign to a type literal.
+    use(++dynamic);
+          ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:51:7: Error: Can't assign to a type literal.
+    ++T;
+      ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:52:11: Error: Can't assign to a type literal.
+    use(++T);
+          ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:53:7: Error: Can't assign to a type literal.
+    ++Func;
+      ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:54:11: Error: Can't assign to a type literal.
+    use(++Func);
+          ^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:56:5: Error: Can't assign to a type literal.
+    C--;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:57:9: Error: Can't assign to a type literal.
+    use(C--);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:58:5: Error: Can't assign to a type literal.
+    dynamic--;
+    ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:59:9: Error: Can't assign to a type literal.
+    use(dynamic--);
+        ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:60:5: Error: Can't assign to a type literal.
+    T--;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:61:9: Error: Can't assign to a type literal.
+    use(T--);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:62:5: Error: Can't assign to a type literal.
+    Func--;
+    ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:63:9: Error: Can't assign to a type literal.
+    use(Func--);
+        ^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:65:7: Error: Can't assign to a type literal.
+    --C;
+      ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:66:11: Error: Can't assign to a type literal.
+    use(--C);
+          ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:67:7: Error: Can't assign to a type literal.
+    --dynamic;
+      ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:68:11: Error: Can't assign to a type literal.
+    use(--dynamic);
+          ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:69:7: Error: Can't assign to a type literal.
+    --T;
+      ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:70:11: Error: Can't assign to a type literal.
+    use(--T);
+          ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:71:7: Error: Can't assign to a type literal.
+    --Func;
+      ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Can't assign to a type literal.
+    use(--Func);
+          ^^^^");
+    #C1 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
+    C ??= 42;
+    ^" : null;
+    self::use(let final core::Type* #t1 = #C1 in #t1 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
+    use(C ??= 42);
+        ^" : #t1);
+    #C2 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
+    dynamic ??= 42;
+    ^^^^^^^" : null;
+    self::use(let final core::Type* #t2 = #C2 in #t2 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
+    use(dynamic ??= 42);
+        ^^^^^^^" : #t2);
+    self::C::T* == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
+    T ??= 42;
+    ^" : null;
+    self::use(let final core::Type* #t3 = self::C::T* in #t3 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
+    use(T ??= 42);
+        ^" : #t3);
+    #C3 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
+    Func ??= 42;
+    ^^^^" : null;
+    self::use(let final core::Type* #t4 = #C3 in #t4 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
+    use(Func ??= 42);
+        ^^^^" : #t4);
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Can't assign to a type literal.
+    C += 42;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:84:9: Error: Can't assign to a type literal.
+    use(C += 42);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:85:5: Error: Can't assign to a type literal.
+    dynamic += 42;
+    ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:86:9: Error: Can't assign to a type literal.
+    use(dynamic += 42);
+        ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:87:5: Error: Can't assign to a type literal.
+    T += 42;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:88:9: Error: Can't assign to a type literal.
+    use(T += 42);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:89:5: Error: Can't assign to a type literal.
+    Func += 42;
+    ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:90:9: Error: Can't assign to a type literal.
+    use(Func += 42);
+        ^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:92:5: Error: Can't assign to a type literal.
+    C -= 42;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:93:9: Error: Can't assign to a type literal.
+    use(C -= 42);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:94:5: Error: Can't assign to a type literal.
+    dynamic -= 42;
+    ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:95:9: Error: Can't assign to a type literal.
+    use(dynamic -= 42);
+        ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:96:5: Error: Can't assign to a type literal.
+    T -= 42;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:97:9: Error: Can't assign to a type literal.
+    use(T -= 42);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:98:5: Error: Can't assign to a type literal.
+    Func -= 42;
+    ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:99:9: Error: Can't assign to a type literal.
+    use(Func -= 42);
+        ^^^^");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method use(dynamic x) → dynamic {
+  if(x =={core::Object::==}{(core::Object*) →* core::bool*} new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}{core::int*})
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  new self::C::•<dynamic>().{self::C::test}(){() →* dynamic};
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::C<dynamic>*)
+  #C2 = TypeLiteralConstant(dynamic)
+  #C3 = TypeLiteralConstant(() →* void)
+}
diff --git a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.weak.modular.expect
new file mode 100644
index 0000000..3d3d7f0
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/type_with_parse_error.dart:21:7: Error: Expected ';' after this.
+//   int i
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    new self::B::•<self::A*>();
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  field core::int* i = null;
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::B::•<self::A*>();
+}
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/typedef.dart.weak.modular.expect
new file mode 100644
index 0000000..72932b9
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/typedef.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Can't assign to a type literal.
+//   Foo = null;
+//   ^^^
+//
+// pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
+//   Foo ??= null;
+//   ^^^
+//
+// pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Couldn't find constructor 'Foo'.
+//   Foo();
+//   ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef Foo = () →* void;
+static method main() → dynamic {
+  core::print(#C1);
+  invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Can't assign to a type literal.
+  Foo = null;
+  ^^^";
+  #C1 == null ?{invalid-type} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
+  Foo ??= null;
+  ^^^" : null;
+  invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Couldn't find constructor 'Foo'.
+  Foo();
+  ^^^";
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(() →* void)
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/unresolved.dart.weak.modular.expect
new file mode 100644
index 0000000..39e56f4
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/unresolved.dart:6:7: Error: Couldn't find constructor 'Missing'.
+//   new Missing();
+//       ^^^^^^^
+//
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved.dart:6:7: Error: Couldn't find constructor 'Missing'.
+  new Missing();
+      ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.weak.modular.expect
new file mode 100644
index 0000000..fc47b33
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/unresolved_constructor.dart:10:10: Error: Too few positional arguments: 2 required, 0 given.
+//   new Foo();
+//          ^
+// pkg/front_end/testcases/rasta/unresolved_constructor.dart:6:3: Context: Found this candidate, but the arguments don't match.
+//   Foo(x, y);
+//   ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_constructor.dart:11:11: Error: Couldn't find constructor 'Foo.notHere'.
+//   new Foo.notHere();
+//           ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •(dynamic x, dynamic y) → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved_constructor.dart:10:10: Error: Too few positional arguments: 2 required, 0 given.
+  new Foo();
+         ^";
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved_constructor.dart:11:11: Error: Couldn't find constructor 'Foo.notHere'.
+  new Foo.notHere();
+          ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.weak.modular.expect
new file mode 100644
index 0000000..1600ec3
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.weak.modular.expect
@@ -0,0 +1,209 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Can't assign to a type literal.
+//     for (Fisk in x) {
+//          ^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+//       print(collection);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+//     for (collection in x) {
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Can't assign to a type literal.
+//     for (VoidFunction in x) {
+//          ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+// Try inserting an identifier before '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the class 'Fisk'.
+//  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
+//     for (key in x) {
+//          ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+//  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+//  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Error: Undefined name 'key'.
+//     print(key);
+//           ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Error: Setter not found: 'key'.
+//   for (key in arguments) {
+//        ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Can't assign to a type literal.
+//   for (Fisk in arguments) {
+//        ^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+//     print(collection);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+//   for (collection in arguments) {
+//        ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Can't assign to a type literal.
+//   for (VoidFunction in arguments) {
+//        ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+// Try inserting an identifier before '1'.
+//   for (1 in arguments) {
+//        ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Undefined name 'key'.
+//     print(key);
+//           ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (1 in arguments) {
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:collection" as collection;
+
+typedef VoidFunction = () →* void;
+class Fisk extends core::Object {
+  synthetic constructor •() → self::Fisk*
+    : super core::Object::•()
+    ;
+  method it1(dynamic x) → dynamic {
+    for (final dynamic #t1 in x as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
+    for (key in x) {
+         ^^^" in this{<unresolved>}.key = invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
+    for (key in x) {
+         ^^^";
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+      print(key);
+            ^^^" in this{<unresolved>}.key);
+    }
+    for (final dynamic #t2 in x as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Can't assign to a type literal.
+    for (Fisk in x) {
+         ^^^^";
+      core::print(#C1);
+    }
+    for (final dynamic #t3 in x as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+    for (collection in x) {
+         ^^^^^^^^^^";
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+      print(collection);
+            ^^^^^^^^^^");
+    }
+    for (final dynamic #t4 in x as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Can't assign to a type literal.
+    for (VoidFunction in x) {
+         ^^^^^^^^^^^^";
+      core::print(#C2);
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+      for (final dynamic #t5 in x as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+        1;
+        core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+      print(key);
+            ^^^" in this{<unresolved>}.key);
+      }
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main(dynamic arguments) → dynamic {
+  new self::Fisk::•();
+  for (final dynamic #t6 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Error: Setter not found: 'key'.
+  for (key in arguments) {
+       ^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Error: Undefined name 'key'.
+    print(key);
+          ^^^");
+  }
+  for (final dynamic #t7 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Can't assign to a type literal.
+  for (Fisk in arguments) {
+       ^^^^";
+    core::print(#C1);
+  }
+  for (final dynamic #t8 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+  for (collection in arguments) {
+       ^^^^^^^^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+    print(collection);
+          ^^^^^^^^^^");
+  }
+  for (final dynamic #t9 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Can't assign to a type literal.
+  for (VoidFunction in arguments) {
+       ^^^^^^^^^^^^";
+    core::print(#C2);
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+    for (final dynamic #t10 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+      1;
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Undefined name 'key'.
+    print(key);
+          ^^^");
+    }
+  }
+}
+
+constants  {
+  #C1 = TypeLiteralConstant(self::Fisk*)
+  #C2 = TypeLiteralConstant(() →* void)
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.modular.expect
new file mode 100644
index 0000000..8bd61ac
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.weak.modular.expect
@@ -0,0 +1,81 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:7:10: Error: Superclass has no method named '[]='.
+//     super[4] = 42;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
+//     return super[2];
+//                 ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]'.
+//     super[4] += 5;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
+//     super[4] += 5;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:3: Error: 'on' isn't a type.
+//   on Exception catch (e) { }
+//   ^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:6: Error: Expected ';' after this.
+//   on Exception catch (e) { }
+//      ^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:16: Error: 'catch' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+//   on Exception catch (e) { }
+//                ^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:23: Error: Undefined name 'e'.
+//   on Exception catch (e) { }
+//                       ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:16: Error: Method not found: 'catch'.
+//   on Exception catch (e) { }
+//                ^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:24: Error: Expected ';' after this.
+//   on Exception catch (e) { }
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    super.[]=(4, 42);
+    let final core::int* #t1 = 4 in invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
+    super[4] += 5;
+         ^";
+    return super.[](2);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method beforeTestMissingTry() → dynamic {
+  self::testMissingTry();
+}
+static method testMissingTry() → dynamic {
+  invalid-type Exception;
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:16: Error: Method not found: 'catch'.
+  on Exception catch (e) { }
+               ^^^^^";
+  {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.weak.modular.expect
new file mode 100644
index 0000000..7651a58
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+//
+// Problems outside component:
+//
+// pkg/front_end/testcases/rasta/unsupported_platform_library.dart:5:8: Error: Not found: 'dart:html'
+// import 'dart:html';
+//        ^
+//
+library;
+import self as self;
+
+import "dart:html";
+import "dart:io";
+
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/ambiguous_builder_01.dart.weak.modular.expect b/pkg/front_end/testcases/regress/ambiguous_builder_01.dart.weak.modular.expect
new file mode 100644
index 0000000..d9c6c13
--- /dev/null
+++ b/pkg/front_end/testcases/regress/ambiguous_builder_01.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:5:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// x.y = 42;
+// ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:5:2: Error: Expected '{' before this.
+// x.y = 42;
+//  ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:5:2: Error: Expected a declaration, but got '.'.
+// x.y = 42;
+//  ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:5:3: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// x.y = 42;
+//   ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:6:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// x.z = true;
+// ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:6:2: Error: Expected '{' before this.
+// x.z = true;
+//  ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:6:1: Error: 'x' is already declared in this scope.
+// x.z = true;
+// ^
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:5:1: Context: Previous declaration of 'x'.
+// x.y = 42;
+// ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:6:2: Error: Expected a declaration, but got '.'.
+// x.z = true;
+//  ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:6:3: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// x.z = true;
+//   ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:8:7: Error: Can't use 'x' because it is declared more than once.
+//   if (x != null) {}
+//       ^
+//
+// pkg/front_end/testcases/regress/ambiguous_builder_01.dart:9:15: Error: Can't use 'x' because it is declared more than once.
+//   if (null != x) {}
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int* y = 42;
+static field core::bool* z = true;
+static method x() → dynamic {}
+static method foo() → void {
+  if(!(invalid-expression "pkg/front_end/testcases/regress/ambiguous_builder_01.dart:8:7: Error: Can't use 'x' because it is declared more than once.
+  if (x != null) {}
+      ^" == null)) {
+  }
+  if(!(invalid-expression "pkg/front_end/testcases/regress/ambiguous_builder_01.dart:9:15: Error: Can't use 'x' because it is declared more than once.
+  if (null != x) {}
+              ^" == null)) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29937.dart.weak.modular.expect
new file mode 100644
index 0000000..07a6b9a7
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29937.dart:6:4: Error: A function expression can't have a name.
+//   [f() {}];
+//    ^
+//
+import self as self;
+
+static method main() → dynamic {
+  <() →* Null>[let final () →* Null f = () → Null {} in f];
+}
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29940.dart.weak.modular.expect
new file mode 100644
index 0000000..eee3efe
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29940.dart:7:3: Error: 'a.b' can't be used as a type because 'a' doesn't refer to an import prefix.
+//   a.b c = null;
+//   ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::String* a = "";
+  invalid-type c = null;
+}
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29941.dart.weak.modular.expect
new file mode 100644
index 0000000..82b995b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29941.dart.weak.modular.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '""'.
+// Try inserting an identifier before '""'.
+//   a."";
+//     ^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method bad() → dynamic {
+  core::String* a = "";
+  invalid-expression "pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '\"\"'.
+Try inserting an identifier before '\"\"'.
+  a.\"\";
+    ^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29942.dart.weak.modular.expect
new file mode 100644
index 0000000..f545925
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:8:5: Error: Expected a function body or '=>'.
+// Try adding {}.
+// f() =
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_29942.dart:10:1: Error: A function expression can't have a name.
+// h() => null;
+// ^
+//
+import self as self;
+
+static method main() → dynamic {}
+static method f() → dynamic
+  return let final () →* Null h = () → Null => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29943.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29943.dart.weak.modular.expect
new file mode 100644
index 0000000..cc07a5e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29943.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29943.dart:6:5: Error: Expected an identifier, but got '('.
+// Try inserting an identifier before '('.
+//   x.(null);
+//     ^
+//
+import self as self;
+
+static method bad() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_29943.dart:6:5: Error: Expected an identifier, but got '('.
+Try inserting an identifier before '('.
+  x.(null);
+    ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29944.dart.weak.modular.expect
new file mode 100644
index 0000000..4ad1117
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29944.dart:7:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   var C;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic C = null;
+  constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•();
+}
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29945.dart.weak.modular.expect
new file mode 100644
index 0000000..038a3a7
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29945.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29945.dart:6:3: Error: 's.bool' can't be used as a type because 's' isn't defined.
+//   s.bool x = null;
+//   ^^^^^^
+//
+import self as self;
+
+static method main() → dynamic {
+  invalid-type x = null;
+}
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29975.dart.weak.modular.expect
new file mode 100644
index 0000000..cb75715
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: 'F' is already declared in this scope.
+// typedef void F();
+//              ^
+// pkg/front_end/testcases/regress/issue_29975.dart:5:14: Context: Previous declaration of 'F'.
+// typedef void F();
+//              ^
+//
+import self as self;
+
+typedef F = () →* void;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29976.dart.weak.modular.expect
new file mode 100644
index 0000000..b65bb80
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^^^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:5: Error: String starting with " must end with ".
+//     "x${x*"'"é'}x
+//     ^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
+//   f(
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
+//   )
+//   ^
+//
+import self as self;
+
+static get x() → dynamic
+  return null;
+static method main() → void {
+  invalid-expression "pkg/front_end/testcases/regress/issue_29976.dart:8:3: Error: Method not found: 'f'.
+  f(
+  ^";
+}
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29977.dart.weak.modular.expect
new file mode 100644
index 0000000..b0dc750
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29977.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:19: Error: Couldn't parse URI 'data:async':
+//   Invalid MIME type.
+// import 'data:async';
+//                   ^
+//
+import self as self;
+
+import "org-dartlang-malformed-uri:?data%3Aasync";
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29977.dart:5:8: Error: Expected a URI.
+// import 'data:async';
+//        ^
+//
+import self as self2;
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29978.dart.weak.modular.expect
new file mode 100644
index 0000000..a166dcf
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29978.dart:8:13: Error: A function expression can't have a name.
+//   foo(null, f() {});
+//             ^
+//
+import self as self;
+
+static method foo(dynamic a, dynamic b) → dynamic
+  return null;
+static method main() → dynamic {
+  self::foo(null, let final () →* Null f = () → Null {} in f);
+}
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29979.dart.weak.modular.expect
new file mode 100644
index 0000000..66cb15d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29979.dart:6:4: Error: A function expression can't have a name.
+//   (f() {})();
+//    ^
+//
+import self as self;
+
+static method main() → dynamic {
+  (let final () →* Null f = () → Null {} in f)(){() →* Null};
+}
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29980.dart.weak.modular.expect
new file mode 100644
index 0000000..1e683cf
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29980.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29980.dart:6:3: Error: 'x.y' can't be used as a type because 'x' isn't defined.
+//   x.y z;
+//   ^^^
+//
+import self as self;
+
+static method main() → dynamic {
+  invalid-type z;
+}
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29981.dart.weak.modular.expect
new file mode 100644
index 0000000..d56e571
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29981.dart:6:3: Error: Expected 1 type arguments.
+//   C<String, String> field;
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field invalid-type field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(new self::C::•<dynamic>());
+}
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29982.dart.weak.modular.expect
new file mode 100644
index 0000000..382c715
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:11: Error: String starting with ' must end with '.
+//   print('${eh[éh']}');
+//           ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: Undefined name 'éh'.
+//   print('${eh[éh']}');
+//               ^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Map<core::String*, core::String*>* eh = <core::String*, core::String*>{"\u0233h": "\u0233h"};
+  core::print("${eh.{core::Map::[]}(invalid-expression "pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: Undefined name '\u0233h'.
+  print('\${eh[\u0233h']}');
+              ^^"){(core::Object*) →* core::String*}}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29983.dart.weak.modular.expect
new file mode 100644
index 0000000..990d69c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:7:10: Error: Undefined name 'missing'.
+//   return missing;
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.
+//   return missing;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: Undefined name 'dummy'.
+// g() sync* => dummy;
+//              ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.
+// g() sync* => dummy;
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f() → dynamic sync* {
+  invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.
+  return missing;
+  ^";
+}
+static method g() → dynamic sync* 
+  invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.
+g() sync* => dummy;
+             ^";
+static method h() → dynamic sync* {
+  (() → core::String* => "return")(){() →* core::String*};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29984.dart.weak.modular.expect
new file mode 100644
index 0000000..0c71c56
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Undefined name 'i'.
+//   for (int i = i;; false) {}
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
+//   for (int i = i;; false) {}
+//            ^
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Context: Previous use of 'i'.
+//   for (int i = i;; false) {}
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method bad() → dynamic {
+  for (core::int* i = invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
+  for (int i = i;; false) {}
+           ^" in invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:16: Error: Undefined name 'i'.
+  for (int i = i;; false) {}
+               ^"; ; false) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29985.dart.weak.modular.expect
new file mode 100644
index 0000000..ca444a5
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Undefined name '🔛'.
+//   🔛
+//   ^^
+//
+import self as self;
+
+static method bad() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Undefined name '\u55357\u56603'.
+  \u55357\u56603
+  ^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29986.dart.weak.modular.expect
new file mode 100644
index 0000000..f0b03d5
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29986.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:13: Error: Expected a function body or '=>'.
+// Try adding {}.
+// C(this.name);
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_29986.dart:8:3: Error: Field formal parameters can only be used in a constructor.
+// Try removing 'this.'.
+// C(this.name);
+//   ^^^^
+//
+import self as self;
+
+static method main() → dynamic {}
+static abstract method C(dynamic name) → dynamic;
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_29987.dart.weak.modular.expect
new file mode 100644
index 0000000..bd49b16
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29987.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:13: Error: Couldn't parse URI 'dart_:core':
+//   Illegal scheme character.
+// import "dart_:core";
+//             ^
+//
+import self as self;
+
+import "org-dartlang-malformed-uri:?dart_%3Acore";
+
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_29987.dart:5:8: Error: Expected a URI.
+// import "dart_:core";
+//        ^
+//
+import self as self2;
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_30834.dart.weak.modular.expect
new file mode 100644
index 0000000..6f89ffe
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30834.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   set A(v) {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  set A(dynamic v) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•();
+  a.{self::A::A} = 5;
+}
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_30836.dart.weak.modular.expect
new file mode 100644
index 0000000..422b26c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30836.dart:6:13: Error: Final field 'x' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int x;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* x = null;
+  constructor •() → self::A*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_30838.dart.weak.modular.expect
new file mode 100644
index 0000000..f1431a1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Foo<S extends core::Object* = dynamic> = <T extends core::Object* = dynamic>(T*) →* S*;
+class A extends core::Object {
+  field <T extends core::Object* = dynamic>(T*) →* core::int* f = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method test() → void {
+    let final core::String* #t1 = "hello" in this.{self::A::f}{<T extends core::Object* = dynamic>(T*) →* core::int*}<core::String*>(#t1){(core::String*) →* core::int*};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo<T extends core::Object* = dynamic>(self::foo::T* x) → core::int*
+  return 3;
+static method bar() → <T extends core::Object* = dynamic>(T*) →* core::int*
+  return #C1;
+static method test1() → void {
+  self::bar()<core::String*>("hello"){(core::String*) →* core::int*};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_30981.dart.weak.modular.expect
new file mode 100644
index 0000000..c413ee9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30981.dart:6:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   get A {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  get A() → dynamic {
+    core::print("Actually, I'm a getter, not a constructor.");
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_30994.dart.weak.modular.expect
new file mode 100644
index 0000000..23676b0
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_30994.dart.weak.modular.expect
@@ -0,0 +1,118 @@
+library lib;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:7: Error: Can't use string interpolation in a URI.
+// part '$foo';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:7: Error: Can't use string interpolation in a URI.
+// part '$foo/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:7: Error: Can't use string interpolation in a URI.
+// part '$for/bar';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:7: Error: Can't use string interpolation in a URI.
+// part '${true}';
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:10: Error: Can't use string interpolation in a URI.
+// part 'the${1}thing';
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:12: Error: Can't use string interpolation in a URI.
+// part 'part_$foo${'a'}.dart';
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:12: Error: Can't use string interpolation in a URI.
+// part 'part_${'a'}_$foo.dart';
+//            ^
+//
+import self as self;
+
+part org-dartlang-malformed-uri:bad247;
+part org-dartlang-malformed-uri:bad260;
+part org-dartlang-malformed-uri:bad277;
+part org-dartlang-malformed-uri:bad294;
+part org-dartlang-malformed-uri:bad310;
+part org-dartlang-malformed-uri:bad331;
+part org-dartlang-malformed-uri:bad360;
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:6:6: Error: Expected a URI.
+// part '$foo';
+//      ^
+//
+import self as self2;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:7:6: Error: Expected a URI.
+// part '$foo/bar';
+//      ^
+//
+import self as self3;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:8:6: Error: Expected a URI.
+// part '$for/bar';
+//      ^
+//
+import self as self4;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:9:6: Error: Expected a URI.
+// part '${true}';
+//      ^
+//
+import self as self5;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:10:6: Error: Expected a URI.
+// part 'the${1}thing';
+//      ^
+//
+import self as self6;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:11:6: Error: Expected a URI.
+// part 'part_$foo${'a'}.dart';
+//      ^
+//
+import self as self7;
+
+
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_30994.dart:12:6: Error: Expected a URI.
+// part 'part_${'a'}_$foo.dart';
+//      ^
+//
+import self as self8;
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31155.dart.weak.modular.expect
new file mode 100644
index 0000000..2f83d69
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31155.dart:11:11: Error: A map literal can't be prefixed by 'Map'.
+// Try removing 'Map'
+//   var f = Map<A, B> {};
+//           ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field core::Map<self::A*, self::B*>* f = <self::A*, self::B*>{};
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31157.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31157.dart.weak.modular.expect
new file mode 100644
index 0000000..f999813
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31157.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31157.dart:6:16: Error: Expected an identifier, but got '('.
+// Try inserting an identifier before '('.
+//   return null?.(1);
+//                ^
+//
+import self as self;
+
+static method bad() → dynamic {
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31157.dart:6:16: Error: Expected an identifier, but got '('.
+Try inserting an identifier before '('.
+  return null?.(1);
+               ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
index af8ae54..7b520a3 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.modular.expect
new file mode 100644
index 0000000..7b520a3
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.modular.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Expected ';' after this.
+// typedef T =
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
+// typedef T =
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef T = invalid-type;
+typedef F = () →* core::Map<core::String*, dynamic>*;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
index d0b75ac..1b5d642 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
index af8ae54..7b520a3 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31180.dart.weak.modular.expect
new file mode 100644
index 0000000..3412492
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31180.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31180.dart:6:15: Error: Null safety features are disabled for this library.
+// Try removing the `@dart=` annotation or setting the language version to 2.12 or higher.
+//   return null?[1];
+//               ^
+// pkg/front_end/testcases/regress/issue_31180.dart:4:1: Context: This is the annotation that opts out this library from null safety features.
+// // @dart=2.9
+// ^^^^^^^^^^^^
+//
+import self as self;
+
+static method bad() → dynamic {
+  return let final dynamic #t1 = null in #t1 == null ?{dynamic} null : #t1{dynamic}.[](1);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31181.dart.weak.modular.expect
new file mode 100644
index 0000000..20bc5b5
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.weak.modular.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Foo<unrelated T extends core::Object* = dynamic> = <T extends core::Object* = dynamic>(T*) →* T*;
+static field <T extends core::Object* = dynamic>(T*) →* T* x;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31183.dart.weak.modular.expect
new file mode 100644
index 0000000..3c62f2d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:12: Error: Unexpected token 'unary'.
+//   operator unary- => 0;
+//            ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31183.dart:6:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   operator unary- => 0;
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator unary-() → dynamic
+    return 0;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•();
+}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31184.dart.weak.modular.expect
new file mode 100644
index 0000000..60fc8d2
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
+//   for (int i = 0, i > 10; i++) {}
+//                   ^
+// pkg/front_end/testcases/regress/issue_31184.dart:6:12: Context: Previous declaration of 'i'.
+//   for (int i = 0, i > 10; i++) {}
+//            ^
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: Expected ';' after this.
+//   for (int i = 0, i > 10; i++) {}
+//                   ^
+//
+// pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: Expected an identifier, but got '>'.
+// Try inserting an identifier before '>'.
+//   for (int i = 0, i > 10; i++) {}
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method bad() → dynamic {
+  for (core::int* i = 0, core::int* i = invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:19: Error: 'i' is already declared in this scope.
+  for (int i = 0, i > 10; i++) {}
+                  ^"; invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: This couldn't be parsed.
+  for (int i = 0, i > 10; i++) {}
+                    ^"{<invalid>}.>(10); i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31185.dart.weak.modular.expect
new file mode 100644
index 0000000..ec82b98
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:8:12: Error: Expected ';' after this.
+//   return i ++ (i);
+//            ^^
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:12:14: Error: Expected ';' after this.
+//   return (i) ++ (i);
+//              ^^
+//
+// pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
+//   return (i) ++ (i);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::int* i = 5;
+static method test1() → core::int* {
+  return let final core::int* #t1 = self::i in let final core::int* #t2 = self::i = #t1.{core::num::+}(1){(core::num*) →* core::int*} in #t1;
+  self::i;
+}
+static method test2() → core::int* {
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
+  return (i) ++ (i);
+           ^";
+  self::i;
+}
+static method main() → dynamic {
+  self::test1();
+}
diff --git a/pkg/front_end/testcases/regress/issue_31186.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31186.dart.weak.modular.expect
new file mode 100644
index 0000000..ce4b4c6
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31186.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31186.dart:6:16: Error: Expected an identifier, but got 'true'.
+// Try inserting an identifier before 'true'.
+//   return null?.true;
+//                ^^^^
+//
+import self as self;
+
+static method bad() → dynamic {
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31186.dart:6:16: Error: Expected an identifier, but got 'true'.
+Try inserting an identifier before 'true'.
+  return null?.true;
+               ^^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31187.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31187.dart.weak.modular.expect
new file mode 100644
index 0000000..77462b2
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31187.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31187.dart:6:16: Error: Expected an identifier, but got '1'.
+// Try inserting an identifier before '1'.
+//   return null?.1;
+//                ^
+//
+import self as self;
+
+static method bad() → dynamic {
+  return invalid-expression "pkg/front_end/testcases/regress/issue_31187.dart:6:16: Error: Expected an identifier, but got '1'.
+Try inserting an identifier before '1'.
+  return null?.1;
+               ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31188.dart.weak.modular.expect
new file mode 100644
index 0000000..bc17959
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' after this.
+// type T = Map<A, B>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+// type T = Map<A, B>
+// ^^^^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+// type T = Map<A, B>
+// ^^^^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: 'A' isn't a type.
+// type T = Map<A, B>
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: 'B' isn't a type.
+// type T = Map<A, B>
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+// type T = Map<A, B>
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = TypeLiteralConstant(core::Map<dynamic, dynamic>*)
+}
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31190.dart.weak.modular.expect
new file mode 100644
index 0000000..ba00133
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: Can't use type arguments with type variable 'T'.
+// Try removing the type arguments.
+//   T<U> v;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: Type 'U' not found.
+//   T<U> v;
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:5: Error: 'U' isn't a type.
+//   T<U> v;
+//     ^
+//
+// pkg/front_end/testcases/regress/issue_31190.dart:6:3: Error: Expected 0 type arguments.
+//   T<U> v;
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Typed<T extends core::Object* = dynamic> extends core::Object {
+  field invalid-type v = null;
+  synthetic constructor •() → self::Typed<self::Typed::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31192.dart.weak.modular.expect
new file mode 100644
index 0000000..0640c28
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Expected an assignment after the field name.
+// To initialize a field, use the syntax 'name = value'.
+//   Increment() : x++ {}
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: Can't access 'this' in a field initializer to read 'x'.
+//   Increment() : x++ {}
+//                 ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Increment extends core::Object {
+  field core::int* x = null;
+  constructor •() → self::Increment*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31192.dart:7:17: Error: This couldn't be parsed.
+  Increment() : x++ {}
+                ^" {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31198.dart.weak.modular.expect
new file mode 100644
index 0000000..ecfe034
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:10:24: Error: Expected an identifier, but got ')'.
+// Try inserting an identifier before ')'.
+//   B.named2(): super().() {}
+//                        ^
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//   B(): super().foo() {}
+//        ^
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:8:16: Error: Expected an initializer.
+//   B(): super().foo() {}
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:9:23: Error: Expected identifier, but got 'super'.
+//   B.named1(): super().super() {}
+//                       ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:10:23: Error: Expected an identifier, but got '('.
+// Try inserting an identifier before '('.
+//   B.named2(): super().() {}
+//                       ^
+//
+// pkg/front_end/testcases/regress/issue_31198.dart:10:23: Error: Expected an initializer.
+//   B.named2(): super().() {}
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  constructor •() → self::B*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_31198.dart:8:8: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+  B(): super().foo() {}
+       ^"{dynamic}.foo() {}
+  constructor named1() → self::B*
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/regress/issue_31198.dart:9:23: Error: Expected identifier, but got 'super'.
+  B.named1(): super().super() {}
+                      ^^^^^" {}
+  constructor named2() → self::B*
+    : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/regress/issue_31198.dart:10:23: Error: Expected an identifier, but got '('.
+Try inserting an identifier before '('.
+  B.named2(): super().() {}
+                      ^" {}
+}
+static method bad() → dynamic {
+  new self::B::•();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31213.dart.weak.modular.expect
new file mode 100644
index 0000000..59e271c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef C<contravariant A extends core::Object* = dynamic, contravariant K extends core::Object* = dynamic> = <B extends core::Object* = dynamic>(A*, K*, B*) →* core::int*;
+typedef D<contravariant K extends core::Object* = dynamic> = <A extends core::Object* = dynamic>(core::int*) →* <B extends core::Object* = dynamic>(A*, K*, B*) →* core::int*;
+static method producer<K extends core::Object* = dynamic>() → dynamic {
+  return <A extends core::Object* = dynamic>(core::int* v1) → <B extends core::Object* = dynamic>(A*, self::producer::K*, B*) →* core::int* {
+    return <B extends core::Object* = dynamic>(A* v2, self::producer::K* v3, B* v4) → core::int* => 0;
+  };
+}
+static method main() → dynamic {
+  assert(self::producer<core::String*>() is <A extends core::Object* = dynamic>(core::int*) →* <B extends core::Object* = dynamic>(A*, core::String*, B*) →* core::int*);
+}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31299.dart.weak.modular.expect
new file mode 100644
index 0000000..c1f0dcb
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.weak.modular.expect
@@ -0,0 +1,52 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   new A.foo(1, 2);
+//            ^
+// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Context: Found this candidate, but the arguments don't match.
+//   A.foo() : m = 2;
+//   ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31299.dart:15:14: Error: Too few positional arguments: 2 required, 0 given.
+//   new A().foo();
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* m;
+  constructor •() → self::A*
+    : self::A::m = 1, super core::Object::•()
+    ;
+  constructor foo() → self::A*
+    : self::A::m = 2, super core::Object::•()
+    ;
+  method foo(core::int* a, core::int* b) → core::int*
+    return a.{core::num::+}(b.{core::num::*}(this.{self::A::m}{core::int*}){(core::num*) →* core::int*}){(core::num*) →* core::int*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_31299.dart:15:14: Error: Too few positional arguments: 2 required, 0 given.
+  new A().foo();
+             ^" in new self::A::•().{self::A::foo}{<inapplicable>}.(){() →* invalid-type};
+  new self::A::•().{self::A::foo}(1, 2){(core::int*, core::int*) →* core::int*};
+  new self::A::foo();
+  invalid-expression "pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+  new A.foo(1, 2);
+           ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31766.dart.weak.modular.expect
new file mode 100644
index 0000000..ec4557f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  function bar<T extends self::A*>(T* t) → void {
+    core::print("t.foo()=${t.{self::A::foo}(){() →* dynamic}}");
+  }
+  bar<self::A*>(new self::A::•()){(self::A*) →* void};
+  (<S extends self::A*>(S* s) → Null {
+    core::print("s.foo()=${s.{self::A::foo}(){() →* dynamic}}");
+  })<self::A*>(new self::A::•()){(self::A*) →* Null};
+}
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31846.dart.weak.modular.expect
new file mode 100644
index 0000000..a893a8d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(#C1 is () →* dynamic);
+  core::print((<T extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType}{core::Type*});
+  core::print((<T extends core::num*>(T* x) → T* => x).{core::Object::runtimeType}{core::Type*});
+  core::print((<T extends core::Comparable<T*>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType}{core::Type*});
+  core::print((<T extends core::Comparable<S*>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType}{core::Type*});
+  core::print((<T extends (T*) →* dynamic = (Null) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType}{core::Type*});
+  core::print((<T extends core::List<core::List<T*>*>* = core::List<core::List<dynamic>*>*>(T* x) → T* => x).{core::Object::runtimeType}{core::Type*});
+}
+
+constants  {
+  #C1 = static-tearoff self::main
+}
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_31996.dart.weak.modular.expect
new file mode 100644
index 0000000..6cf6fb4
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Base extends core::Object implements self::B<dynamic> {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Child1 extends self::Base implements self::C<core::int*> {
+  synthetic constructor •() → self::Child1*
+    : super self::Base::•()
+    ;
+}
+class Child2 extends self::Base implements self::C<core::double*> {
+  synthetic constructor •() → self::Child2*
+    : super self::Base::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_32182.dart.weak.modular.expect
new file mode 100644
index 0000000..3b90e8d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue_32182.dart" as self;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return 42;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _C&A&M = self::A<self::A<dynamic>*> with self::M /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&A&M*
+    : super self::A::•()
+    ;
+  mixin-super-stub method m() → dynamic
+    return super.{self::M::m}();
+}
+class C extends self::_C&A&M {
+  synthetic constructor •() → self::C*
+    : super self::_C&A&M::•()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•().{self::_C&A&M::m}(){() →* dynamic}{dynamic}.+(1);
+}
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_32196.dart.weak.modular.expect
new file mode 100644
index 0000000..d1c71d6
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String* name;
+  constructor get(core::String* name) → self::A*
+    : self::A::name = name, super core::Object::•()
+    ;
+  constructor set(core::String* name) → self::A*
+    : self::A::name = name, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::A::get("get");
+  new self::A::set("set");
+}
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_32200.dart.weak.modular.expect
new file mode 100644
index 0000000..d70c7d0
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_32200.dart:8:3: Error: 'self.Foo' can't be used as a type because 'self' doesn't refer to an import prefix.
+//   self.Foo self;
+//   ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue_32200.dart" as self;
+
+class Foo extends core::Object {
+  field invalid-type self = null;
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::Foo* instance = new self::Foo::•();
+  instance.{self::Foo::self} = instance;
+}
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_32660.dart.weak.modular.expect
new file mode 100644
index 0000000..ec03c53
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.weak.modular.expect
@@ -0,0 +1,106 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_32660.dart:13:7: Error: The implementation of 'foo' in the non-abstract class 'C' does not conform to its interface.
+// class C extends A implements B {
+//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Context: The method 'A.foo' has fewer named arguments than those of overridden method 'B.foo'.
+//   foo(int x) => x;
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:10:3: Context: This is the overridden method ('foo').
+//   foo(int x, {int y}) => y;
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_32660.dart:24:7: Error: The implementation of 'foo' in the non-abstract class 'E' does not conform to its interface.
+// class E extends D {
+//       ^
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Context: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
+//   foo(int x) => x;
+//   ^
+// pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
+//   foo(int x, {int y});
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method foo(core::int* x) → dynamic
+    return x;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo(core::int* x, {core::int* y = #C1}) → dynamic
+    return y;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::A implements self::B {
+  synthetic constructor •() → self::C*
+    : super self::A::•()
+    ;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    core::print("No such method!");
+    return 42;
+  }
+  abstract member-signature method foo(core::int* x, {core::int* y = #C1}) → dynamic; -> self::B::foo
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  method foo(core::int* x) → dynamic
+    return x;
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  abstract method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    core::print(i.{core::Invocation::namedArguments}{core::Map<core::Symbol*, dynamic>*});
+    return 42;
+  }
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  self::E* e = new self::E::•();
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_32972.dart.weak.modular.expect
new file mode 100644
index 0000000..660b650
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.weak.modular.expect
@@ -0,0 +1,90 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:22:3: Error: Expected 1 type arguments.
+//   foo<String, String>("hello world");
+//   ^
+// pkg/front_end/testcases/regress/issue_32972.dart:5:6: Context: Found this candidate, but the arguments don't match.
+// void foo<X>(X i) {
+//      ^^^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:24:7: Error: Expected 1 type arguments.
+//   Foo.foo<int, int>(42);
+//       ^
+// pkg/front_end/testcases/regress/issue_32972.dart:10:10: Context: Found this candidate, but the arguments don't match.
+//   static foo<X>(X i) {
+//          ^^^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
+//   new Bar<String>();
+//       ^
+// pkg/front_end/testcases/regress/issue_32972.dart:19:7: Context: The class 'Bar' has a constructor that takes no arguments.
+// class Bar<X, Y> {}
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_32972.dart:27:5: Error: Expected 1 type arguments.
+//   f.bar<double, double>(42.42);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+  static method foo<X extends core::Object* = dynamic>(self::Foo::foo::X* i) → dynamic {
+    core::print(i);
+  }
+  method bar<X extends core::Object* = dynamic>(self::Foo::bar::X* i) → dynamic {
+    core::print(i);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Bar<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::X*, self::Bar::Y*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo<X extends core::Object* = dynamic>(self::foo::X* i) → void {
+  core::print(i);
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:22:3: Error: Expected 1 type arguments.
+  foo<String, String>(\"hello world\");
+  ^";
+  self::foo<core::String*>("hello world");
+  invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:24:7: Error: Expected 1 type arguments.
+  Foo.foo<int, int>(42);
+      ^";
+  self::Foo::foo<core::int*>(42);
+  self::Foo* f = new self::Foo::•();
+  invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:27:5: Error: Expected 1 type arguments.
+  f.bar<double, double>(42.42);
+    ^" in f.{self::Foo::bar}{<inapplicable>}.<core::double*, core::double*>(42.42){(invalid-type) →* invalid-type};
+  f.{self::Foo::bar}<core::double*>(42.42){(core::double*) →* dynamic};
+  invalid-expression "pkg/front_end/testcases/regress/issue_32972.dart:29:7: Error: Expected 2 type arguments.
+  new Bar<String>();
+      ^";
+  new self::Bar::•<core::String*, core::String*>();
+}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_33452.dart.weak.modular.expect
new file mode 100644
index 0000000..0f3ef8d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Couldn't find constructor 'ExistingClass.nonExistingConstructor'.
+//   var x = new ExistingClass.nonExistingConstructor();
+//                             ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:11:11: Error: Couldn't find constructor 'ExistingClass'.
+//   x = new ExistingClass();
+//           ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:12:11: Error: Couldn't find constructor 'ExistingClass'.
+//   x = new ExistingClass<String>();
+//           ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:13:33: Error: Couldn't find constructor 'ExistingClass.nonExistingConstructor'.
+//   x = new ExistingClass<String>.nonExistingConstructor();
+//                                 ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:14:41: Error: Couldn't find constructor 'ExistingClass.nonExistingConstructor'.
+//   x = new ExistingClass<String, String>.nonExistingConstructor();
+//                                         ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:15:11: Error: Couldn't find constructor 'NonExistingClass'.
+//   x = new NonExistingClass();
+//           ^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+  constructor existingConstructor() → self::ExistingClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  invalid-type x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:10:29: Error: Couldn't find constructor 'ExistingClass.nonExistingConstructor'.
+  var x = new ExistingClass.nonExistingConstructor();
+                            ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:11:11: Error: Couldn't find constructor 'ExistingClass'.
+  x = new ExistingClass();
+          ^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:12:11: Error: Couldn't find constructor 'ExistingClass'.
+  x = new ExistingClass<String>();
+          ^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:13:33: Error: Couldn't find constructor 'ExistingClass.nonExistingConstructor'.
+  x = new ExistingClass<String>.nonExistingConstructor();
+                                ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:14:41: Error: Couldn't find constructor 'ExistingClass.nonExistingConstructor'.
+  x = new ExistingClass<String, String>.nonExistingConstructor();
+                                        ^^^^^^^^^^^^^^^^^^^^^^";
+  x = invalid-expression "pkg/front_end/testcases/regress/issue_33452.dart:15:11: Error: Couldn't find constructor 'NonExistingClass'.
+  x = new NonExistingClass();
+          ^^^^^^^^^^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_33672.dart.weak.modular.expect
new file mode 100644
index 0000000..7caa5cb
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int* count = 0;
+  #L1:
+  for (core::int* a = 0; a.{core::num::<}(10){(core::num*) →* core::bool*}; a = a.{core::num::+}(1){(core::num*) →* core::int*}) {
+    for (core::int* b = 0; b.{core::num::<}(10){(core::num*) →* core::bool*}; b = b.{core::num::+}(1){(core::num*) →* core::int*}) {
+      count = count.{core::num::+}(1){(core::num*) →* core::int*};
+      if(count =={core::num::==}{(core::Object*) →* core::bool*} 27)
+        break #L1;
+    }
+    count = count.{core::num::+}(1){(core::num*) →* core::int*};
+  }
+  if(!(count =={core::num::==}{(core::Object*) →* core::bool*} 27))
+    throw "failed: ${count}";
+}
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_34225.dart.weak.modular.expect
new file mode 100644
index 0000000..2a92ec9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.weak.modular.expect
@@ -0,0 +1,65 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:6:14: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   static set C(v) {} //# 01: compile-time error
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:10:7: Error: A class member can't have the same name as the enclosing class.
+// Try renaming the member.
+//   set D(v) {} //# 02: compile-time error
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/regress/issue_34225.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'C'.
+//   c.C = 5;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static set C(dynamic v) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  set D(dynamic v) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  invalid-expression "pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/regress/issue_34225.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'C'.
+  c.C = 5;
+    ^" in c{<unresolved>}.C = 5;
+  self::D* d = new self::D::•();
+  d.{self::D::D} = 5;
+}
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_34291.dart.weak.modular.expect
new file mode 100644
index 0000000..efb5579
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34291.dart:9:1: Error: Expected 0 type arguments.
+// lib.A<B> foo() {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method foo() → invalid-type {}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self2::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_34403.dart.weak.modular.expect
new file mode 100644
index 0000000..cb1b2fd
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.weak.modular.expect
@@ -0,0 +1,216 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:16:14: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   var c1 = C.bar<int>();
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:18:18: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   var c2 = new C.bar<int>();
+//                  ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:20:13: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   var c3 = C<String>.bar<int>();
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:20:22: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   var c3 = C<String>.bar<int>();
+//                      ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:22:26: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   var c4 = new C<String>.bar<int>();
+//                          ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:25:16: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   const d1 = D.foo<int>();
+//                ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:27:22: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   const d2 = const D.foo<int>();
+//                      ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:29:15: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   const d3 = D<String>.foo<int>();
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:29:24: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   const d3 = D<String>.foo<int>();
+//                        ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:31:30: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   const d4 = const D<String>.foo<int>();
+//                              ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:34:16: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   var e1 = p.E.bar<int>();
+//                ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:36:20: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   var e2 = new p.E.bar<int>();
+//                    ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:38:15: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   var e3 = p.E<String>.bar<int>();
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:38:24: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   var e3 = p.E<String>.bar<int>();
+//                        ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:40:28: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   var e4 = new p.E<String>.bar<int>();
+//                            ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:43:18: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   const f1 = p.F.foo<int>();
+//                  ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:45:24: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   const f2 = const p.F.foo<int>();
+//                        ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:47:17: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.15 or higher, and running 'pub get'.
+//   const f3 = p.F<String>.foo<int>();
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:47:26: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   const f3 = p.F<String>.foo<int>();
+//                          ^^^
+//
+// pkg/front_end/testcases/regress/issue_34403.dart:49:32: Error: A constructor invocation can't have type arguments after the constructor name.
+// Try removing the type arguments or placing them after the class name.
+//   const f4 = const p.F<String>.foo<int>();
+//                                ^^^
+//
+import self as self;
+import "dart:core" as core;
+import "issue_34403_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue_34403_lib.dart" as p;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor foo() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C<core::int*>* c1 = new self::C::bar<core::int*>();
+  c1.{self::C::toString}(){() →* core::String*};
+  self::C<core::int*>* c2 = new self::C::bar<core::int*>();
+  c2.{self::C::toString}(){() →* core::String*};
+  self::C<core::int*>* c3 = new self::C::bar<core::int*>();
+  c3.{self::C::toString}(){() →* core::String*};
+  self::C<core::String*>* c4 = new self::C::bar<core::String*>();
+  c4.{self::C::toString}(){() →* core::String*};
+  #C1.{self::D::toString}(){() →* core::String*};
+  #C1.{self::D::toString}(){() →* core::String*};
+  #C1.{self::D::toString}(){() →* core::String*};
+  #C2.{self::D::toString}(){() →* core::String*};
+  iss::E<core::int*>* e1 = new iss::E::bar<core::int*>();
+  e1.{iss::E::toString}(){() →* core::String*};
+  iss::E<dynamic>* e2 = new iss::E::bar<dynamic>();
+  e2.{iss::E::toString}(){() →* core::String*};
+  iss::E<core::int*>* e3 = new iss::E::bar<core::int*>();
+  e3.{iss::E::toString}(){() →* core::String*};
+  iss::E<core::String*>* e4 = new iss::E::bar<core::String*>();
+  e4.{iss::E::toString}(){() →* core::String*};
+  #C3.{iss::F::toString}(){() →* core::String*};
+  #C4.{iss::F::toString}(){() →* core::String*};
+  #C3.{iss::F::toString}(){() →* core::String*};
+  #C5.{iss::F::toString}(){() →* core::String*};
+}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+class E<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → iss::E<iss::E::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class F<T extends core::Object* = dynamic> extends core::Object /*hasConstConstructor*/  {
+  const constructor foo() → iss::F<iss::F::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+
+constants  {
+  #C1 = self::D<core::int*> {}
+  #C2 = self::D<core::String*> {}
+  #C3 = iss::F<core::int*> {}
+  #C4 = iss::F<dynamic> {}
+  #C5 = iss::F<core::String*> {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue_34403.dart:
+- D.foo (from org-dartlang-testcase:///issue_34403.dart:12:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- F.foo (from org-dartlang-testcase:///issue_34403_lib.dart:10:9)
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_34498.dart.weak.modular.expect
new file mode 100644
index 0000000..fa054b4
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34498.dart.weak.modular.expect
@@ -0,0 +1,91 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34498.dart:8:3: Error: 'lib.MyClass' can't be used as a type because 'lib' doesn't refer to an import prefix.
+//   lib.MyClass get lib => null; // (1)
+//   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34498.dart:10:3: Error: 'foo' isn't a type.
+//   foo foo() {}
+//   ^^^
+// pkg/front_end/testcases/regress/issue_34498.dart:10:7: Context: This isn't a type.
+//   foo foo() {}
+//       ^^^
+//
+// pkg/front_end/testcases/regress/issue_34498.dart:20:3: Error: Can't use type arguments with type variable 'T'.
+// Try removing the type arguments.
+//   T<String> foo() {}
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_34498.dart:12:3: Error: Type 'Missing' not found.
+//   Missing bar() {}
+//   ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue_34498_lib.dart" as lib;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  get lib() → invalid-type
+    return null;
+  method foo() → invalid-type {}
+  method bar() → invalid-type {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method foo() → invalid-type {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static final field self::A* a = null;
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class MyClass extends core::Object {
+  synthetic constructor •() → self2::MyClass*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_34563.dart.weak.modular.expect
new file mode 100644
index 0000000..201e0fa
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.weak.modular.expect
@@ -0,0 +1,154 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class 'C2'.
+//  - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+//   c2.m + c2.c;
+//      ^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class 'C2'.
+//  - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
+//   c2.m + c2.c;
+//             ^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class 'C3'.
+//  - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+//   c3.m + c3.c;
+//      ^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class 'C3'.
+//  - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
+//   c3.m + c3.c;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Object /*isMixinDeclaration*/  {
+  get m() → core::int*
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M2 extends core::Object /*isMixinDeclaration*/  {
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class M3 extends core::Object /*isMixinDeclaration*/  {
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1*
+    : super core::Object::•()
+    ;
+  get c() → core::int*
+    return 2;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C2* c2 = new self::C2::•();
+  invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class 'C2'.
+ - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+  c2.m + c2.c;
+     ^" in c2{<unresolved>}.m{dynamic}.+(invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class 'C2'.
+ - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
+  c2.m + c2.c;
+            ^" in c2{<unresolved>}.c);
+  self::C3* c3 = new self::C3::•();
+  invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class 'C3'.
+ - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
+  c3.m + c3.c;
+     ^" in c3{<unresolved>}.m{dynamic}.+(invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class 'C3'.
+ - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
+  c3.m + c3.c;
+            ^" in c3{<unresolved>}.c);
+}
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_34610.dart.weak.modular.expect
new file mode 100644
index 0000000..db6cda1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.weak.modular.expect
@@ -0,0 +1,109 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:15: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class A { get A.named => null; get bar => 1; }
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:11: Error: Constructors can't be a getter.
+// Try removing 'get'.
+// class A { get A.named => null; get bar => 1; }
+//           ^^^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:7:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class B { B.named : super(); get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C.named => null; get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:26: Error: Constructors can't have a return type.
+// Try removing the return type.
+// class A { get A.named => null; get bar => 1; }
+//                          ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:22: Error: Constructors can't have a return type.
+// Try removing the return type.
+// class C { C.named => null; get bar => 1; }
+//                      ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor named() → self::A*
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/regress/issue_34610.dart:5:26: Error: Constructors can't have a return type.
+Try removing the return type.
+class A { get A.named => null; get bar => 1; }
+                         ^";
+  get bar() → dynamic
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object {
+  constructor named() → self::B*
+    : super core::Object::•()
+    ;
+  get bar() → dynamic
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  constructor named() → self::C*
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/regress/issue_34610.dart:9:22: Error: Constructors can't have a return type.
+Try removing the return type.
+class C { C.named => null; get bar => 1; }
+                     ^";
+  get bar() → dynamic
+    return 1;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  try {
+    core::print(new self::A::named().{self::A::bar}{dynamic});
+    throw "expected exception";
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  core::print(new self::B::named().{self::B::bar}{dynamic});
+  try {
+    core::print(new self::C::named().{self::C::bar}{dynamic});
+    throw "expected exception";
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_34614.dart.weak.modular.expect
new file mode 100644
index 0000000..9092aae
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected an identifier, but got '}'.
+// Try inserting an identifier before '}'.
+// class C { C. }
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C. }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34614.dart:5:14: Error: Expected '{' before this.
+// class C { C. }
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  c.{self::C::toString}(){() →* core::String*};
+}
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_34850.dart.weak.modular.expect
new file mode 100644
index 0000000..ad3a1ce
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:1: Error: Expected a declaration, but got '<'.
+// <foo<
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:7:1: Error: Expected '>' after this.
+// int f1() {
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:8: Error: Expected '>' after this.
+// Future<List<int>> f2() async => null;
+//        ^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:19: Error: Expected '{' before this.
+// Future<List<int>> f2() async => null;
+//                   ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:13: Error: Expected a type, but got '>>'.
+// Future<List<>> f3() async {
+//             ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Error: Type 'foo' not found.
+// <foo<
+//  ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Error: Expected 0 type arguments.
+// <foo<
+//  ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:11:1: Error: Type 'foo' not found.
+// foo
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Error: 'Future' isn't a type.
+// Future<List<>> f3() async {
+// ^^^^^^
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Context: This isn't a type.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Error: Expected 0 type arguments.
+// Future<List<>> f3() async {
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f1() → invalid-type {
+  return null;
+}
+static method Future<List extends core::Object* = dynamic>() → invalid-type {}
+static method f2() → dynamic async 
+  return null;
+static method f3() → invalid-type async {
+  return null;
+}
+static method main() → dynamic async {
+  core::print(self::f1());
+  core::print(await self::f2());
+  core::print(await self::f3());
+}
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35151.dart.weak.modular.expect
new file mode 100644
index 0000000..146d622
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.weak.modular.expect
@@ -0,0 +1,74 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in its declaring class
+// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
+//   B() : super.a = 42;
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: Not a valid initializer.
+// To initialize a field, use the syntax 'name = value'.
+//   B() : super.a = 42;
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:14:9: Error: Can't access 'super' in a field initializer.
+//   C() : super = 42;
+//         ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* a = null;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends self::A {
+  constructor •() → self::B*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: Not a valid initializer.
+To initialize a field, use the syntax 'name = value'.
+  B() : super.a = 42;
+              ^"
+    ;
+}
+class C extends core::Object {
+  constructor •() → self::C*
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:14:9: Error: Can't access 'super' in a field initializer.
+  C() : super = 42;
+        ^^^^^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  try {
+    self::B* b = new self::B::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+  try {
+    self::C* c = new self::C::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35177.dart.weak.modular.expect
new file mode 100644
index 0000000..d0eb552
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.weak.modular.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  () →* dynamic f;
+  f(){() →* dynamic}{dynamic}.call<core::int*>();
+}
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35213.dart.weak.modular.expect
new file mode 100644
index 0000000..e97491d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35213.dart:5:9: Error: Expected ',' before this.
+// f(int a int b) { }
+//         ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f(core::int* a, core::int* b) → dynamic {}
+static method main() → dynamic {
+  self::f(2, 3);
+}
diff --git a/pkg/front_end/testcases/regress/issue_35220.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35220.dart.weak.modular.expect
new file mode 100644
index 0000000..cab6aea
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35220.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35220.dart:6:25: Error: A value of type 'bool' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/regress/issue_35220.dart'.
+//   A bad() { return true != 2; }
+//                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  method bad() → self::A* {
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35220.dart:6:25: Error: A value of type 'bool' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/regress/issue_35220.dart'.
+  A bad() { return true != 2; }
+                        ^" in !(true =={core::Object::==}{(core::Object*) →* core::bool*} 2) as{TypeError} self::A*;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35258.dart.weak.modular.expect
new file mode 100644
index 0000000..33c1bb2
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:13:3: Error: 'C' is already declared in this scope.
+//   C(this.d) {}
+//   ^
+// pkg/front_end/testcases/regress/issue_35258.dart:12:3: Context: Previous declaration of 'C'.
+//   C() {}
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:6:7: Error: Can't use 'C' because it is declared more than once.
+//   new C(42);
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:10:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic d = null;
+  constructor •() → self::C*
+    : super core::Object::•() {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_35258.dart:6:7: Error: Can't use 'C' because it is declared more than once.
+  new C(42);
+      ^";
+}
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35259.dart.weak.modular.expect
new file mode 100644
index 0000000..6a366d0
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Context: Previous declaration of 'Supertype'.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Error: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Error: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:11:13: Error: Can't use 'Supertype' because it is declared more than once.
+//   print(new Supertype());
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  static factory •() → self::Supertype*
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Redirection constructor target not found: 'Unresolved'
+  factory Supertype() = Unresolved;
+                        ^";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::print(invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:11:13: Error: Can't use 'Supertype' because it is declared more than once.
+  print(new Supertype());
+            ^");
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Supertype::•
+}
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35260.dart.weak.modular.expect
new file mode 100644
index 0000000..0b4828a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/regress/issue_35260.dart:6:11: Context: Previous declaration of 'Supertype'.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:15:13: Error: Can't use 'Supertype' because it is declared more than once.
+//   X x = new Supertype();
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  static factory •() → self::Supertype*
+    return new self::X::•();
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class X extends core::Object implements self::Supertype {
+  constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  self::X* x = invalid-expression "pkg/front_end/testcases/regress/issue_35260.dart:15:13: Error: Can't use 'Supertype' because it is declared more than once.
+  X x = new Supertype();
+            ^";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::Supertype::•
+}
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35266.dart.weak.modular.expect
new file mode 100644
index 0000000..9885c52
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.weak.modular.expect
@@ -0,0 +1,56 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:8:11: Error: 'B.foo' is already declared in this scope.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+// pkg/front_end/testcases/regress/issue_35266.dart:7:11: Context: Previous declaration of 'B.foo'.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:21: Error: Can't use 'B.foo' because it is declared more than once.
+//   factory C.bar() = B<K>.foo;
+//                     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object* = dynamic> extends self::C<self::B::T*> {
+  static final field dynamic _redirecting# = <dynamic>[#C1];
+  constructor •() → self::B<self::B::T*>*
+    : super self::C::•()
+    ;
+  static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
+    return new self::B::•<self::B::foo::T*>();
+}
+class C<K extends core::Object* = dynamic> extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[#C2];
+  constructor •() → self::C<self::C::K*>*
+    : super core::Object::•()
+    ;
+  static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
+    return invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:21: Error: Can't use 'B.foo' because it is declared more than once.
+  factory C.bar() = B<K>.foo;
+                    ^";
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:21: Error: Can't use 'B.foo' because it is declared more than once.
+  factory C.bar() = B<K>.foo;
+                    ^";
+}
+
+constants  {
+  #C1 = constructor-tearoff self::B::foo
+  #C2 = constructor-tearoff self::C::bar
+}
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_35900.dart.weak.modular.expect
new file mode 100644
index 0000000..c6fc9e6
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:25: Error: Can't find '}' to match '${'.
+// main () { int x; print('${x' '); }
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:24: Error: String starting with ' must end with '.
+// main () { int x; print('${x' '); }
+//                        ^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:6:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:28: Error: Expected '}' before this.
+// main () { int x; print('${x' '); }
+//                            ^^^
+//
+// pkg/front_end/testcases/regress/issue_35900.dart:5:31: Error: Expected a String, but got ')'.
+// main () { int x; print('${x' '); }
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int* x;
+  core::print("${x}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_36400.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_36400.dart.weak.modular.expect
new file mode 100644
index 0000000..3b5a369
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_36400.dart.weak.modular.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36400.dart:6:3: Error: Factory constructors cannot have a return type.
+// Try removing the type appearing before 'factory'.
+//   Test factory Test() {
+//   ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Test extends core::Object {
+  static factory •() → self::Test* {
+    return null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_36647.dart.weak.modular.expect
new file mode 100644
index 0000000..85c932b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.weak.modular.expect
@@ -0,0 +1,85 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///issue_36647_lib1.dart";
+
+
+library;
+import self as self2;
+import "issue_36647_lib2.dart" as iss;
+additionalExports = (iss::xxx,
+  iss::XXX,
+  iss::XXX,
+  iss::extends,
+  iss::extends)
+
+export "org-dartlang-testcase:///issue_36647_lib2.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:7: Error: A class declaration must have a body, even if it is empty.
+// Try adding an empty body.
+// class xxx xx XXX extends XXX {
+//       ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: 'extends' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:18: Error: Expected ';' after this.
+// class xxx xx XXX extends XXX {
+//                  ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:26: Error: 'XXX' is already declared in this scope.
+// class xxx xx XXX extends XXX {
+//                          ^^^
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:14: Context: Previous declaration of 'XXX'.
+// class xxx xx XXX extends XXX {
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: Type 'xx' not found.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+// pkg/front_end/testcases/regress/issue_36647_lib2.dart:5:11: Error: 'xx' isn't a type.
+// class xxx xx XXX extends XXX {
+//           ^^
+//
+import self as iss;
+import "dart:core" as core;
+
+class xxx extends core::Object {
+  synthetic constructor •() → iss::xxx*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field invalid-type XXX;
+static field dynamic extends;
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.weak.modular.expect
new file mode 100644
index 0000000..79c30c6
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "issue_36647_2_lib1.dart" as iss;
+additionalExports = (iss::foo,
+  iss::foo,
+  iss::bar,
+  iss::baz)
+
+export "org-dartlang-testcase:///issue_36647_2_lib1.dart";
+
+
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:6:5: Error: 'foo' is already declared in this scope.
+// int foo = 43;
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:5:5: Context: Previous declaration of 'foo'.
+// int foo = 42;
+//     ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:8:14: Error: 'bar' is already declared in this scope.
+// typedef bool bar();
+//              ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:7:14: Context: Previous declaration of 'bar'.
+// typedef bool bar();
+//              ^^^
+//
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:13:5: Error: 'baz' is already declared in this scope.
+// int baz() {
+//     ^^^
+// pkg/front_end/testcases/regress/issue_36647_2_lib1.dart:9:5: Context: Previous declaration of 'baz'.
+// int baz() {
+//     ^^^
+//
+import self as iss;
+import "dart:core" as core;
+
+typedef bar = () →* core::bool*;
+static field core::int* foo;
+static method baz() → core::int* {
+  return 42;
+}
diff --git a/pkg/front_end/testcases/regress/issue_36669.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_36669.dart.weak.modular.expect
new file mode 100644
index 0000000..0c77dc9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_36669.dart.weak.modular.expect
@@ -0,0 +1,51 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36669.dart:11:7: Error: The superclass, 'NoUnnamedConstuctor with MixMeIn', has no unnamed constructor that takes no arguments.
+// class Foo extends NoUnnamedConstuctor with MixMeIn {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class NoUnnamedConstuctor extends core::Object {
+  constructor _() → self::NoUnnamedConstuctor*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class MixMeIn extends core::Object {
+  synthetic constructor •() → self::MixMeIn*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class _Foo&NoUnnamedConstuctor&MixMeIn = self::NoUnnamedConstuctor with self::MixMeIn /*isAnonymousMixin*/  {
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn*
+    : super self::NoUnnamedConstuctor::_()
+    ;
+}
+class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
+  synthetic constructor •() → self::Foo*
+    : invalid-initializer
+    ;
+}
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_36793.dart.weak.modular.expect
new file mode 100644
index 0000000..ac733f1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.weak.modular.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_36793.dart:10:5: Error: 'x' is already declared in this scope.
+// int x = 2;
+//     ^
+// pkg/front_end/testcases/regress/issue_36793.dart:8:5: Context: Previous declaration of 'x'.
+// int x = 1;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* y = #C1;
+@#C1
+static field core::int* x;
+static method main() → dynamic {
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/regress/issue_37285.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_37285.dart.weak.modular.expect
new file mode 100644
index 0000000..84ceeef
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_37285.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_37285.dart:6:17: Error: Expected an identifier, but got ']'.
+// Try inserting an identifier before ']'.
+//   C() : super()[];
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_37285.dart:6:9: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//   C() : super()[];
+//         ^
+//
+// pkg/front_end/testcases/regress/issue_37285.dart:6:16: Error: Not a valid initializer.
+// To initialize a field, use the syntax 'name = value'.
+//   C() : super()[];
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_37285.dart:6:16: Error: Not a valid initializer.
+To initialize a field, use the syntax 'name = value'.
+  C() : super()[];
+               ^"
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  new self::C::•();
+}
diff --git a/pkg/front_end/testcases/regress/issue_37681.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_37681.dart.weak.modular.expect
new file mode 100644
index 0000000..c92257e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_37681.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:6:7: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+//   int f_async() async { return 42; }
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:9:7: Error: Functions marked 'async*' must have a return type assignable to 'Stream'.
+//   int f_async_star() async* { yield 42; }
+//       ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:14:7: Error: Functions marked 'sync*' must have a return type assignable to 'Iterable'.
+//   int f_sync_star() sync* { yield 42; }
+//       ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+  function f_async() → core::int* async {
+    return 42;
+  }
+  core::print(await f_async(){() →* core::int*});
+  function f_async_star() → core::int* async* {
+    yield 42;
+  }
+  await for (dynamic x in (f_async_star(){() →* core::int*} as dynamic) as{TypeError,ForDynamic} asy::Stream<dynamic>*) {
+    core::print(x);
+  }
+  function f_sync_star() → core::int* sync* {
+    yield 42;
+  }
+  for (dynamic x in (f_sync_star(){() →* core::int*} as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+    core::print(x);
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_39035.crash_dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_39035.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..6b4145e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_39035.crash_dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_39035.crash_dart:5:4: Error: Can't find '}' to match '${'.
+// M("${)=
+//    ^
+//
+// pkg/front_end/testcases/regress/issue_39035.crash_dart:5:6: Error: String starting with " must end with ".
+// M("${)=
+//      ^^
+//
+// pkg/front_end/testcases/regress/issue_39035.crash_dart:5:3: Error: Expected an identifier, but got '"'.
+// Try inserting an identifier before '"'.
+// M("${)=
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_39035.crash_dart:5:4: Error: Expected ')' before this.
+// M("${)=
+//    ^^
+//
+// pkg/front_end/testcases/regress/issue_39035.crash_dart:5:7: Error: Expected a function body or '=>'.
+// Try adding {}.
+// M("${)=
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_39035.crash_dart:5:7: Error: Expected ';' after this.
+// M("${)=
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_39035.crash_dart:5:8: Error: Unexpected token ''.
+// M("${)=
+//        ^...
+//
+import self as self;
+
+static method M() → dynamic
+  return "";
diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_39040.dart.weak.modular.expect
new file mode 100644
index 0000000..ade6db2
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_39040.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → void {
+  core::List<core::String*>* whereWasI = <core::String*>[];
+  core::int* outer = 1;
+  core::int* inner = 0;
+  #L1:
+  switch(outer) {
+    #L2:
+    case #C1:
+      {
+        whereWasI.{core::List::add}("outer 0"){(core::String*) →* void};
+        break #L1;
+      }
+    #L3:
+    case #C2:
+      {
+        (() → Null {
+          switch(inner) {
+            #L4:
+            case #C1:
+              {
+                whereWasI.{core::List::add}("inner 0"){(core::String*) →* void};
+                continue #L5;
+              }
+            #L5:
+            case #C2:
+              {
+                whereWasI.{core::List::add}("inner 1"){(core::String*) →* void};
+              }
+          }
+        })(){() →* Null};
+      }
+  }
+  if(!(whereWasI.{core::List::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} 2) || !(whereWasI.{core::List::[]}(0){(core::int*) →* core::String*} =={core::String::==}{(core::Object*) →* core::bool*} "inner 0") || !(whereWasI.{core::List::[]}(1){(core::int*) →* core::String*} =={core::String::==}{(core::Object*) →* core::bool*} "inner 1")) {
+    throw "Unexpected path.";
+  }
+  core::print(whereWasI);
+}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/regress/issue_39091_1.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_39091_1.dart.weak.modular.expect
new file mode 100644
index 0000000..c414477
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_39091_1.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_39091_1.dart:5:1: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+// hello
+// ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_39091_1.dart:5:1: Error: Expected ';' after this.
+// hello
+// ^^^^^
+//
+import self as self;
+
+static field dynamic hello;
diff --git a/pkg/front_end/testcases/regress/issue_39091_2.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_39091_2.dart.weak.modular.expect
new file mode 100644
index 0000000..0ebcc72
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_39091_2.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_39091_2.dart:1:1: Error: The non-ASCII space character U+FEFF can only be used in strings and comments.
+// // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// ^
+//
+// pkg/front_end/testcases/regress/issue_39091_2.dart:13:1: Error: Expected a declaration, but got '""'.
+// "";
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_39091_2.dart:13:4: Error: Unexpected token ';'.
+// "";
+//    ^
+//
+// pkg/front_end/testcases/regress/issue_39091_2.dart:11:11: Error: Undefined name 'hello'.
+// "";/*æ*/ hello; /*æ*/
+//           ^^^^^
+//
+import self as self;
+
+static method main() → dynamic {
+  "\u65279";
+  "\u65279";
+  "\u65279";
+  "\u65279";
+  "A";
+  "\u65279";
+  "\u65279";
+  invalid-expression "pkg/front_end/testcases/regress/issue_39091_2.dart:11:11: Error: Undefined name 'hello'.
+\"\u65279\";/*\u0230*/ hello; /*\u0230*/
+          ^^^^^";
+}
diff --git a/pkg/front_end/testcases/regress/issue_39682.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_39682.dart.weak.modular.expect
new file mode 100644
index 0000000..9866587
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_39682.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue_39682_lib.dart" deferred as foo;
+
+static method main() → dynamic {
+  () →* asy::Future<dynamic>* f = #C1;
+  f(){() →* asy::Future<dynamic>*};
+  core::print(self::__loadLibrary_foo());
+}
+static method __loadLibrary_foo() → core::String* {
+  return "I'll call my methods what I want!";
+}
+static method _#loadLibrary_foo() → asy::Future<dynamic>*
+  return LoadLibrary(foo);
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  core::print("foo!");
+}
+
+constants  {
+  #C1 = static-tearoff self::_#loadLibrary_foo
+}
diff --git a/pkg/front_end/testcases/regress/issue_41265.crash_dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_41265.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..03c63ac
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_41265.crash_dart.weak.modular.expect
@@ -0,0 +1,73 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_41265.crash_dart:9:53: Error: Unexpected token '>'.
+// class DND1 extends Object with M<dynamic> Function()> {
+//                                                     ^
+//
+// pkg/front_end/testcases/regress/issue_41265.crash_dart:9:7: Error: The type '() -> M<dynamic>' can't be mixed in.
+// class DND1 extends Object with M<dynamic> Function()> {
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_41265.crash_dart:12:7: Error: The type '() -> M<dynamic>' can't be mixed in.
+// class DND2 extends Object with M<dynamic> Function() {
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_41265.crash_dart:9:7: Error: Can't use a function type as supertype.
+// class DND1 extends Object with M<dynamic> Function()> {
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_41265.crash_dart:12:7: Error: Can't use a function type as supertype.
+// class DND2 extends Object with M<dynamic> Function() {
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_41265.crash_dart:15:7: Error: Can't use a function type as supertype.
+// class DND3 extends M<dynamic> Function() {
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_41265.crash_dart:18:7: Error: Can't use a function type as supertype.
+// class DND4 implements M<dynamic> Function() {
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+}
+abstract class M<T extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class _DND1&Object extends core::Object /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_DND1&Object
+    : super core::Object::•()
+    ;
+}
+class DND1 extends self::_DND1&Object {
+  synthetic constructor •() → self::DND1
+    : super self::_DND1&Object::•()
+    ;
+}
+abstract class _DND2&Object extends core::Object /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_DND2&Object
+    : super core::Object::•()
+    ;
+}
+class DND2 extends self::_DND2&Object {
+  synthetic constructor •() → self::DND2
+    : super self::_DND2&Object::•()
+    ;
+}
+class DND3 extends core::Object {
+  synthetic constructor •() → self::DND3
+    : super core::Object::•()
+    ;
+}
+class DND4 extends core::Object {
+  synthetic constructor •() → self::DND4
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_42423.dart.weak.modular.expect b/pkg/front_end/testcases/regress/issue_42423.dart.weak.modular.expect
new file mode 100644
index 0000000..ed0856a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_42423.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "package:expect/expect.dart" as exp;
+
+import "package:expect/expect.dart";
+
+static method test1(dynamic stringList) → dynamic {
+  core::Set<core::int*>* intSet = block {
+    final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+    final core::Iterable<dynamic>* #t2 = stringList as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t2 == null))
+      for (final dynamic #t3 in #t2) {
+        final core::int* #t4 = #t3 as{TypeError} core::int*;
+        #t1.{core::Set::add}{Invariant}(#t4){(core::int*) →* core::bool*};
+      }
+  } =>#t1;
+}
+static method test2(dynamic stringList) → dynamic {
+  core::List<core::int*>* intList = block {
+    final core::List<core::int*>* #t5 = <core::int*>[];
+    final core::Iterable<dynamic>* #t6 = stringList as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t6 == null))
+      for (final dynamic #t7 in #t6) {
+        final core::int* #t8 = #t7 as{TypeError} core::int*;
+        #t5.{core::List::add}{Invariant}(#t8){(core::int*) →* void};
+      }
+  } =>#t5;
+}
+static method test3(dynamic stringMap) → dynamic {
+  core::Map<core::int*, core::int*>* intMap = block {
+    final core::Map<core::int*, core::int*>* #t9 = <core::int*, core::int*>{};
+    final core::Map<dynamic, dynamic>* #t10 = stringMap as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*;
+    if(!(#t10 == null))
+      for (final core::MapEntry<dynamic, dynamic>* #t11 in #t10.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>}) {
+        final core::int* #t12 = #t11.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
+        final core::int* #t13 = #t11.{core::MapEntry::value}{dynamic} as{TypeError} core::int*;
+        #t9.{core::Map::[]=}{Invariant}(#t12, #t13){(core::int*, core::int*) →* void};
+      }
+  } =>#t9;
+}
+static method main() → dynamic {
+  dynamic stringList = <core::String*>["string"];
+  exp::Expect::throwsTypeError(() → Null {
+    self::test1(stringList);
+  });
+  exp::Expect::throwsTypeError(() → Null {
+    self::test2(stringList);
+  });
+  dynamic stringMap = <core::String*, core::String*>{"a": "b"};
+  exp::Expect::throwsTypeError(() → Null {
+    self::test3(stringMap);
+  });
+}
diff --git a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.modular.expect b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.modular.expect
new file mode 100644
index 0000000..bfc33bf
--- /dev/null
+++ b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.modular.expect
Binary files differ
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.weak.modular.expect
new file mode 100644
index 0000000..d6a32ed
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.weak.modular.expect
@@ -0,0 +1,42 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* void;
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f() → void {}
+  get g() → () →* void
+    return null;
+  get h() → dynamic
+    return null;
+  method test() → void {
+    this.{self::C::f}(){() →* void};
+    this.{self::C::f}(){() →* void};
+    this.{self::C::g}{() →* void}(){() →* void};
+    this.{self::C::g}{() →* void}(){() →* void};
+    this.{self::C::h}{dynamic}{dynamic}.call();
+    this.{self::C::h}{dynamic}{dynamic}.call();
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C* c, () →* void f, dynamic d) → void {
+  c.{self::C::f}(){() →* void};
+  f(){() →* void};
+  d{dynamic}.call();
+  d{dynamic}.f();
+  c.{self::C::g}{() →* void}(){() →* void};
+  c.{self::C::h}{dynamic}{dynamic}.call();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.weak.modular.expect
new file mode 100644
index 0000000..96f9b35
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.weak.modular.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic y = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  get x() → dynamic
+    return null;
+  method test() → void {
+    dynamic v1 = this.{self::C::x}{dynamic};
+    dynamic v2 = this.{self::C::x}{dynamic};
+    dynamic v3 = this.{self::C::y}{dynamic};
+    dynamic v4 = this.{self::C::y}{dynamic};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C* c, dynamic d) → void {
+  dynamic v1 = c.{self::C::x}{dynamic};
+  dynamic v2 = c.{self::C::y}{dynamic};
+  dynamic v3 = d{dynamic}.x;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.weak.modular.expect
new file mode 100644
index 0000000..a78157b
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic y = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set x(dynamic value) → void {}
+  method test() → void {
+    this.{self::C::x} = null;
+    this.{self::C::x} = null;
+    this.{self::C::y} = null;
+    this.{self::C::y} = null;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C* c, dynamic d) → void {
+  c.{self::C::x} = null;
+  c.{self::C::y} = null;
+  d{dynamic}.x = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..bffdb53
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.weak.modular.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method call() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  () →* void x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call}{() →* void};
+}
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.modular.expect
new file mode 100644
index 0000000..edf5d5c
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.weak.modular.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method call() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  FutureOr<() →* void>* x = let final self::C* #t1 = new self::C::•() in #t1 == null ?{() →* void} null : #t1.{self::C::call}{() →* void};
+}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.weak.modular.expect
new file mode 100644
index 0000000..2142878
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field (self::C::T*) →* void y = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f() → void {
+    (self::C::T*) →* void x = this.{self::C::y}{(self::C::T*) →* void};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::y}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..3e9cb61
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f<U extends (self::C::T*) →* void>(self::C::f::U* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g(self::C<core::num*>* c) → void {
+  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → Null {}){((core::Object*) →* void) →* void};
+}
+static method test() → void {
+  self::g(new self::C::•<core::int*>());
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.weak.modular.expect
new file mode 100644
index 0000000..a1cb113
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}(){() →* (self::C::T*) →* void}];
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g1(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::f1}(){() →* (core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+  core::print("hello");
+  x(1.5){(core::num*) →* void};
+}
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.{self::C::f1}(){() →* (core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+  x(1){(core::int*) →* void};
+}
+static method g3(self::C<core::num*>* c) → void {
+  core::List<(core::num*) →* void>* x = c.{self::C::f2}(){() →* core::List<(core::num*) →* void>*} as{TypeError,CovarianceCheck} core::List<(core::num*) →* void>*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.weak.modular.expect
new file mode 100644
index 0000000..a8aa298
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}(){() →* (self::C::T*) →* void}];
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g1(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = let final self::C<core::num*>* #t1 = c in #t1 == null ?{(core::num*) →* void} null : #t1.{self::C::f1}(){() →* (core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+  core::print("hello");
+  x(1.5){(core::num*) →* void};
+}
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = let final self::C<core::num*>* #t2 = c in #t2 == null ?{(core::num*) →* void} null : #t2.{self::C::f1}(){() →* (core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+  x(1){(core::int*) →* void};
+}
+static method g3(self::C<core::num*>* c) → void {
+  core::List<(core::num*) →* void>* x = let final self::C<core::num*>* #t3 = c in #t3 == null ?{core::List<(core::num*) →* void>*} null : #t3.{self::C::f2}(){() →* core::List<(core::num*) →* void>*} as{TypeError,CovarianceCheck} core::List<(core::num*) →* void>*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..3f796f1
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<contravariant T extends core::Object* = dynamic> = () →* (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field (self::C::T*) →* void _x;
+  constructor •((self::C::T*) →* void _x) → self::C<self::C::T*>*
+    : self::C::_x = _x, super core::Object::•()
+    ;
+  method f() → (self::C::T*) →* void
+    return this.{self::C::_x}{(self::C::T*) →* void};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g(self::C<core::num*>* c) → () →* (core::num*) →* void {
+  return c.{self::C::f}{() →* (core::num*) →* void} as{TypeError,CovarianceCheck} () →* (core::num*) →* void;
+}
+static method h(core::int* i) → void {
+  core::print("${i}");
+}
+static method test() → void {
+  () →* (core::num*) →* void x = self::g(new self::C::•<core::int*>(#C1));
+}
+static method main() → void {}
+
+constants  {
+  #C1 = static-tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..d641b1f
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field (self::C::T*) →* void y = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f(covariant-by-class self::C::T* value) → void {
+    let final self::C::T* #t1 = value in this.{self::C::y}{(self::C::T*) →* void}(#t1){(self::C::T*) →* void};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g(self::C<core::num*>* c) → void {
+  let final self::C<core::num*>* #t2 = c in let final core::double* #t3 = 1.5 in (#t2.{self::C::y}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void)(#t3){(core::num*) →* void};
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.weak.modular.expect
new file mode 100644
index 0000000..60445df
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  get f1() → (self::C::T*) →* void
+    return null;
+  get f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}{(self::C::T*) →* void}];
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g1(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::f1}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+  core::print("hello");
+  x(1.5){(core::num*) →* void};
+}
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.{self::C::f1}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+  x(1){(core::int*) →* void};
+}
+static method g3(self::C<core::num*>* c) → void {
+  core::List<(core::num*) →* void>* x = c.{self::C::f2}{core::List<(core::num*) →* void>*} as{TypeError,CovarianceCheck} core::List<(core::num*) →* void>*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.weak.modular.expect
new file mode 100644
index 0000000..98e1172
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.weak.modular.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  get f1() → (self::C::T*) →* void
+    return null;
+  get f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}{(self::C::T*) →* void}];
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g1(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = let final self::C<core::num*>* #t1 = c in #t1 == null ?{(core::num*) →* void} null : #t1.{self::C::f1}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+  core::print("hello");
+  x(1.5){(core::num*) →* void};
+}
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = let final self::C<core::num*>* #t2 = c in #t2 == null ?{(core::num*) →* void} null : #t2.{self::C::f1}{(core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+  x(1){(core::int*) →* void};
+}
+static method g3(self::C<core::num*>* c) → void {
+  core::List<(core::num*) →* void>* x = let final self::C<core::num*>* #t3 = c in #t3 == null ?{core::List<(core::num*) →* void>*} null : #t3.{self::C::f2}{core::List<(core::num*) →* void>*} as{TypeError,CovarianceCheck} core::List<(core::num*) →* void>*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..23d142c
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
+//     this.f<U>(1.5);
+//               ^
+//
+// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:20:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'U' on 'C<int>.g1'.
+//  - 'C' is from 'pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart'.
+// Try changing type arguments so that they conform to the bounds.
+//   new C<int>().g1<num>();
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f<covariant-by-class U extends self::C::T*>(self::C::f::U* x) → void {}
+  method g1<covariant-by-class U extends self::C::T*>() → void {
+    this.{self::C::f}<self::C::g1::U*>(invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
+    this.f<U>(1.5);
+              ^" in 1.5 as{TypeError} Never){(self::C::g1::U*) →* void};
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g2(self::C<core::Object*>* c) → void {
+  c.{self::C::f}<core::num*>(1.5){(core::num*) →* void};
+}
+static method test() → void {
+  new self::C::•<core::int*>().{self::C::g1}<core::num*>(){() →* void};
+  self::g2(new self::C::•<core::int*>());
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.weak.modular.expect
new file mode 100644
index 0000000..2794c16
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f(covariant-by-class self::C::T* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g1(self::C<core::num*>* c) → void {
+  c.{self::C::f}(1.5){(core::num*) →* void};
+}
+static method g2(self::C<core::int*>* c) → void {
+  c.{self::C::f}(1){(core::int*) →* void};
+}
+static method g3(self::C<core::num*>* c) → void {
+  c.{self::C::f}(null){(core::num*) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.weak.modular.expect
new file mode 100644
index 0000000..41147c6
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.weak.modular.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f1(covariant-by-class core::List<self::C::T*>* x) → void {}
+  method f2(covariant-by-class () →* self::C::T* callback) → void {}
+  method f3(covariant-by-class (self::C::T*) →* self::C::T* callback) → void {}
+  method f4((self::C::T*) →* void callback) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g1(self::C<core::num*>* c, core::List<core::num*>* l) → void {
+  c.{self::C::f1}(l){(core::List<core::num*>*) →* void};
+}
+static method g2(self::C<core::num*>* c, () →* core::num* callback) → void {
+  c.{self::C::f2}(callback){(() →* core::num*) →* void};
+}
+static method g3(self::C<core::num*>* c, (core::num*) →* core::num* callback) → void {
+  c.{self::C::f3}(callback){((core::num*) →* core::num*) →* void};
+}
+static method g4(self::C<core::num*>* c, (core::num*) →* void callback) → void {
+  c.{self::C::f4}(callback){((core::num*) →* void) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.weak.modular.expect
new file mode 100644
index 0000000..b492a06
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f1(covariant-by-class self::I::T* x) → void;
+  abstract method f2(covariant-by-class self::I::T* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<U extends core::Object* = dynamic> extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::C<self::C::U*>*
+    : super core::Object::•()
+    ;
+  method f1(covariant-by-class core::int* x) → void {}
+  method f2(covariant-by-class core::int* x, [covariant-by-class self::C::U* y = #C1]) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D<U extends core::Object* = dynamic> extends self::C<self::D::U*> {
+  synthetic constructor •() → self::D<self::D::U*>*
+    : super self::C::•()
+    ;
+  method f1(covariant-by-class core::int* x) → void {}
+  method f2(covariant-by-class core::int* x, [covariant-by-class self::D::U* y = #C1]) → void {}
+}
+static method g1(self::C<core::num*>* c) → void {
+  c.{self::C::f1}(1){(core::int*) →* void};
+}
+static method g2(self::I<core::num*>* i) → void {
+  i.{self::I::f1}(1.5){(core::num*) →* void};
+}
+static method g3(self::C<core::num*>* c) → void {
+  c.{self::C::f2}(1, 1.5){(core::int*, [core::num*]) →* void};
+}
+static method g4(self::D<core::num*>* d) → void {
+  d.{self::D::f1}(1){(core::int*) →* void};
+}
+static method g5(self::D<core::num*>* d) → void {
+  d.{self::D::f2}(1, 1.5){(core::int*, [core::num*]) →* void};
+}
+static method test() → void {
+  self::g2(new self::C::•<core::num*>());
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..c7a7694
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.weak.modular.expect
@@ -0,0 +1,69 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-class self::I::T* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method f(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub method f(covariant-by-class core::int* x) → void
+    return super.{self::M::f}(x);
+}
+static method g1(self::C* c) → void {
+  c.{self::C::f}(1){(core::int*) →* void};
+}
+static method g2(self::I<core::num*>* i) → void {
+  i.{self::I::f}(1.5){(core::num*) →* void};
+}
+static method test() → void {
+  self::g2(new self::C::•());
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.weak.modular.expect
new file mode 100644
index 0000000..5e85a90
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-class self::I::T* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub method f(covariant-by-class core::int* x) → void
+    return super.{self::B::f}(x);
+}
+static method g1(self::C* c) → void {
+  c.{self::C::f}(1){(core::int*) →* void};
+}
+static method g2(self::I<core::num*>* i) → void {
+  i.{self::I::f}(1.5){(core::num*) →* void};
+}
+static method test() → void {
+  self::g2(new self::C::•());
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..e69ba31
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-class self::I::T* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub method f(covariant-by-class core::int* x) → void
+    return super.{self::B::f}(x);
+}
+static method g1(self::C* c) → void {
+  c.{self::C::f}(1){(core::int*) →* void};
+}
+static method g2(self::I<core::num*>* i) → void {
+  i.{self::I::f}(1.5){(core::num*) →* void};
+}
+static method test() → void {
+  self::g2(new self::C::•());
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.modular.expect
new file mode 100644
index 0000000..a63dac3
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.weak.modular.expect
@@ -0,0 +1,40 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<contravariant T extends core::Object* = dynamic, U extends core::Object* = dynamic> = (T*) →* U*;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f1(covariant-by-class self::C::T* x) → void {}
+  method f2(covariant-by-class core::List<self::C::T*>* x) → self::C::T*
+    return x.{core::Iterable::first}{self::C::T*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g1(self::C<core::num*>* c) → (core::num*) →* void {
+  return c.{self::C::f1}{(core::num*) →* void};
+}
+static method g2(self::C<core::int*>* c, core::Object* x) → void {
+  (core::Object*) →* void f = self::g1(c) as (core::Object*) →* void;
+  f(x){(core::Object*) →* void};
+}
+static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num* {
+  return c.{self::C::f2}{(core::List<core::num*>*) →* core::num*};
+}
+static method test() → void {
+  (core::num*) →* void x = self::g1(new self::C::•<core::int*>());
+  x(1.5){(core::num*) →* void};
+  self::g3(new self::C::•<core::int*>());
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.weak.modular.expect
new file mode 100644
index 0000000..bf44b39
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method f(core::num* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f(covariant-by-declaration core::int* x) → void {}
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  method f(covariant-by-declaration core::int* x) → void {}
+}
+static method g1(self::C* c) → void {
+  c.{self::C::f}(1.5){(core::num*) →* void};
+}
+static method g2(self::C* c) → (core::num*) →* dynamic {
+  return c.{self::C::f}{(core::num*) →* void};
+}
+static method test() → dynamic {
+  self::g1(new self::D::•());
+  (core::num*) →* dynamic x = self::g2(new self::D::•());
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.weak.modular.expect
new file mode 100644
index 0000000..210c2cb
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.weak.modular.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object implements self::C {
+  covariant-by-declaration field core::int* x = null;
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object implements self::D {
+  covariant-by-declaration field core::int* x = null;
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..2e274f6
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object implements self::C {
+  covariant-by-declaration field core::int* x = null;
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object implements self::D {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return 0;
+  set x(covariant-by-declaration core::int* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..3f5f3e4
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.weak.modular.expect
@@ -0,0 +1,33 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set x(core::num* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x(covariant-by-declaration core::int* value) → void {}
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  set x(covariant-by-declaration core::int* value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.weak.modular.expect
new file mode 100644
index 0000000..8c69a30
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  set x(core::num* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x(covariant-by-declaration core::int* value) → void {}
+}
+class E extends core::Object implements self::D {
+  covariant-by-declaration field core::int* x = null;
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..dee3331
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  set y(covariant-by-class self::C::T* value) → void {}
+  method f(covariant-by-class self::C::T* value) → void {
+    this.{self::C::x} = value;
+    this.{self::C::y} = value;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g(self::C<core::num*>* c) → void {
+  c.{self::C::x} = 1.5;
+  c.{self::C::y} = 1.5;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.weak.modular.expect
new file mode 100644
index 0000000..3d1a3dc
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.weak.modular.expect
@@ -0,0 +1,39 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f1(covariant-by-class self::C::T* x) → void {}
+  method f2(core::int* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C<core::num*> {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f1(covariant-by-declaration covariant-by-class core::int* x) → void {}
+}
+static method g1(dynamic d) → void {
+  d{dynamic}.f1(1.5);
+}
+static method g2(dynamic d) → void {
+  d{dynamic}.f2(1.5);
+}
+static method test() → void {
+  self::g1(new self::C::•<core::int*>());
+  self::g2(new self::C::•<dynamic>());
+  self::g1(new self::D::•());
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.modular.expect
new file mode 100644
index 0000000..bbd989a
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.weak.modular.expect
@@ -0,0 +1,31 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f<covariant-by-class U extends self::C::T*>(self::C::f::U* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g1(dynamic d) → void {
+  d{dynamic}.f<core::num*>(1.5);
+}
+static method g2(dynamic d) → void {
+  d{dynamic}.f(1.5);
+}
+static method test() → void {
+  self::g1(new self::C::•<core::int*>());
+  self::g2(new self::C::•<core::int*>());
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.weak.modular.expect
new file mode 100644
index 0000000..204effc
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic f;
+  constructor •(dynamic f) → self::C*
+    : self::C::f = f, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method g(self::C* c) → void {
+  let final self::C* #t1 = c in let final core::double* #t2 = 1.5 in #t1.{self::C::f}{dynamic}{dynamic}.call(#t2);
+}
+static method h(core::int* i) → void {}
+static method test() → void {
+  self::g(new self::C::•(#C1));
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = static-tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.weak.modular.expect
new file mode 100644
index 0000000..e0143ec
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C implements self::B<core::num*> {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  forwarding-stub set x(covariant-by-class core::num* value) → void
+    return super.{self::C::x} = value;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.weak.modular.expect
new file mode 100644
index 0000000..672eea9
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.weak.modular.expect
@@ -0,0 +1,70 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  field core::Object* _x = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f([core::num* x = #C1]) → void {
+    this.{self::B::_x} = x;
+  }
+  method g({core::num* x = #C2}) → void {
+    this.{self::B::_x} = x;
+  }
+  method check(core::Object* expectedValue) → void {
+    if(!(this.{self::B::_x}{core::Object*} =={core::Object::==}{(core::Object*) →* core::bool*} expectedValue)) {
+      throw "Expected _x == ${expectedValue}; got ${this.{self::B::_x}{core::Object*}}";
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f([covariant-by-class self::I::T* x = #C3]) → void;
+  abstract method g({covariant-by-class self::I::T* x = #C3}) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub method f([covariant-by-class core::num* x = #C1]) → void
+    return super.{self::B::f}(x);
+  forwarding-stub method g({covariant-by-class core::num* x = #C2}) → void
+    return super.{self::B::g}(x: x);
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  c.{self::C::f}(){([core::num*]) →* void};
+  c.{self::B::check}(10){(core::Object*) →* void};
+  c.{self::C::g}(){({x: core::num*}) →* void};
+  c.{self::B::check}(20){(core::Object*) →* void};
+}
+
+constants  {
+  #C1 = 10
+  #C2 = 20
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.weak.modular.expect
new file mode 100644
index 0000000..76facc74
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(core::int* x, core::int* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-class self::I::T* x, core::int* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub method f(covariant-by-class core::int* x, core::int* y) → void
+    return super.{self::B::f}(x, y);
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.weak.modular.expect
new file mode 100644
index 0000000..2fc5b5a
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::C::T* y = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  set x(covariant-by-class self::C::T* t) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object implements self::C<core::num*> {
+  covariant-by-class field core::num* x = null;
+  covariant-by-class field core::num* y = null;
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class E extends core::Object implements self::C<core::num*> {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  set x(covariant-by-class core::num* t) → void {}
+  get y() → core::num*
+    return null;
+  set y(covariant-by-class core::num* t) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.weak.modular.expect
new file mode 100644
index 0000000..3e9000d
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.weak.modular.expect
@@ -0,0 +1,55 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set x(covariant-by-declaration core::Object* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  covariant-by-declaration field core::Object* x = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(covariant-by-declaration core::Object* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends core::Object* = dynamic> extends core::Object implements self::B {
+  covariant-by-declaration covariant-by-class field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f(covariant-by-declaration covariant-by-class self::C::T* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..c72954d
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.weak.modular.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •(core::Object* o) → self::C*
+    : assert(o as{TypeError} core::bool*), super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::Object* o = 1;
+  try {
+    new self::C::•(o);
+    assert(false, "no exception");
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.weak.modular.expect
new file mode 100644
index 0000000..c4e012c
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Object* o = 1;
+  try {
+    assert(o as{TypeError} core::bool*);
+    assert(false, "no exception");
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.weak.modular.expect
new file mode 100644
index 0000000..f33aa41
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.weak.modular.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::bool* b;
+  constructor •(core::Object* o) → self::C*
+    : self::C::b = o as{TypeError} core::bool*, super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {
+  core::Object* o = 1;
+  try {
+    new self::C::•(o);
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.weak.modular.expect
new file mode 100644
index 0000000..21783cf
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.weak.modular.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Object* o = 1;
+  try {
+    do {
+    }
+    while (o as{TypeError} core::bool*)
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.weak.modular.expect
new file mode 100644
index 0000000..40fe0be
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → void {
+  core::Object* o = 1;
+  try {
+    for (core::int* i = 0; o as{TypeError} core::bool*; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    }
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.weak.modular.expect
new file mode 100644
index 0000000..dae4331
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Object* o = 1;
+  try {
+    if(o as{TypeError} core::bool*) {
+    }
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.weak.modular.expect
new file mode 100644
index 0000000..84171e4
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.weak.modular.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → void {
+  core::Object* o = 1;
+  try {
+    !(o as{TypeError} core::bool*);
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.weak.modular.expect
new file mode 100644
index 0000000..f63e717
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.weak.modular.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::Object* o = 1;
+  try {
+    while (o as{TypeError} core::bool*) {
+    }
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.weak.modular.expect
new file mode 100644
index 0000000..761e51b
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(core::num* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-class self::I::T* x) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub forwarding-semi-stub method f(covariant-by-class core::num* x) → void
+    return super.{self::B::f}(x);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.weak.modular.expect
new file mode 100644
index 0000000..1efedac
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.weak.modular.expect
@@ -0,0 +1,49 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* dynamic;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method f(covariant-by-class self::C::T* x) → void {}
+  method g1(covariant-by-class self::C::T* x) → void {
+    this.{self::C::f}(x){(self::C::T*) →* void};
+  }
+  method g2(covariant-by-class self::C::T* x) → void {
+    this.{self::C::f}(x){(self::C::T*) →* void};
+  }
+  method g3(covariant-by-class self::C<self::C::T*>* c, covariant-by-class self::C::T* x) → void {
+    c.{self::C::f}(x){(self::C::T*) →* void};
+  }
+  method g4() → (self::C::T*) →* dynamic
+    return this.{self::C::f}{(self::C::T*) →* void};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C<core::int*> {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class E extends self::C<core::num*> {
+  synthetic constructor •() → self::E*
+    : super self::C::•()
+    ;
+  method f(covariant-by-declaration covariant-by-class core::int* x) → void {}
+}
+static method test() → dynamic {
+  (core::Object*) →* dynamic x = (new self::D::•().{self::C::g4}(){() →* (core::int*) →* dynamic} as{TypeError,CovarianceCheck} (core::int*) →* dynamic) as (core::Object*) →* dynamic;
+  x("hi"){(core::Object*) →* dynamic};
+  new self::E::•().{self::C::g1}(1.5){(core::num*) →* void};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.weak.modular.expect
new file mode 100644
index 0000000..d266b53
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.weak.modular.expect
@@ -0,0 +1,59 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (Null) →* void> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field self::B<core::num*, (core::num*) →* void>* x = null;
+  static field self::B<core::num*, (core::num*) →* void>* y = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator [](core::int* i) → self::B<core::num*, (core::num*) →* void>*
+    return null;
+  operator []=(core::int* i, self::B<core::num*, (core::num*) →* void>* v) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test1(self::B<core::num*, (core::num*) →* void>* b) → void {
+  b = b.{self::B::+}(1){(dynamic) →* self::B<core::num*, (core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>*;
+  self::B<core::num*, (core::num*) →* void>* x = b = b.{self::B::+}(2){(dynamic) →* self::B<core::num*, (core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>*;
+}
+static method test2(self::C* c) → void {
+  let final self::C* #t1 = c in let final core::int* #t2 = 0 in #t1.{self::C::[]=}(#t2, #t1.{self::C::[]}(#t2){(core::int*) →* self::B<core::num*, (core::num*) →* void>*}.{self::B::+}(1){(dynamic) →* self::B<core::num*, (core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>*){(core::int*, self::B<core::num*, (core::num*) →* void>*) →* void};
+  self::B<core::num*, (core::num*) →* void>* x = let final self::C* #t3 = c in let final core::int* #t4 = 0 in let final self::B<core::num*, (core::num*) →* void>* #t5 = #t3.{self::C::[]}(#t4){(core::int*) →* self::B<core::num*, (core::num*) →* void>*}.{self::B::+}(2){(dynamic) →* self::B<core::num*, (core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>* in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5){(core::int*, self::B<core::num*, (core::num*) →* void>*) →* void} in #t5;
+}
+static method test3(self::C* c) → void {
+  let final self::C* #t7 = c in #t7.{self::C::x} = #t7.{self::C::x}{self::B<core::num*, (core::num*) →* void>*}.{self::B::+}(1){(dynamic) →* self::B<core::num*, (core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>*;
+  self::B<core::num*, (core::num*) →* void>* x = let final self::C* #t8 = c in #t8.{self::C::x} = #t8.{self::C::x}{self::B<core::num*, (core::num*) →* void>*}.{self::B::+}(2){(dynamic) →* self::B<core::num*, (core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>*;
+}
+static method test4(self::C* c) → void {
+  self::C::y = self::C::y.{self::B::+}(1){(dynamic) →* self::B<core::num*, (core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>*;
+  self::B<core::num*, (core::num*) →* void>* x = self::C::y = self::C::y.{self::B::+}(2){(dynamic) →* self::B<core::num*, (core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<core::num*, (core::num*) →* void>*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.weak.modular.expect
new file mode 100644
index 0000000..edcb17e
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.weak.modular.expect
@@ -0,0 +1,99 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:30:14: Error: The type 'C<num>' of the getter 'D.value' is not assignable to the type 'int Function(int)' of the setter 'D.value'.
+//  - 'C' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart'.
+//   C<num> get value => getValue;
+//              ^^^^^
+// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:32:12: Context: This is the declaration of the setter 'D.value'.
+//   void set value(int Function(int) value) {
+//            ^^^^^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:46: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+//   d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+//                                              ^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+//     d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+//                                                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  final field (self::C::T*) →* core::num* plusResult;
+  constructor •((self::C::T*) →* core::num* plusResult) → self::C<self::C::T*>*
+    : self::C::plusResult = plusResult, super core::Object::•()
+    ;
+  operator +(core::int* i) → (self::C::T*) →* core::num*
+    return this.{self::C::plusResult}{(self::C::T*) →* core::num*};
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends core::Object {
+  final field self::C<core::num*>* getValue;
+  field (core::int*) →* core::int* setValue = null;
+  constructor •(self::C<core::num*>* getValue) → self::D*
+    : self::D::getValue = getValue, super core::Object::•()
+    ;
+  get value() → self::C<core::num*>*
+    return this.{self::D::getValue}{self::C<core::num*>*};
+  set value((core::int*) →* core::int* value) → void {
+    this.{self::D::setValue} = value;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method expectTypeError(() →* void callback) → void {
+  try {
+    callback(){() →* void};
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method expect(core::Object* value, core::Object* expected) → void {
+  if(!(value =={core::Object::==}{(core::Object*) →* core::bool*} expected)) {
+    throw "Expected ${expected}, got ${value}";
+  }
+}
+static method numToInt(core::num* n) → core::int*
+  return 1;
+static method numToNum(core::num* n) → core::num*
+  return 2;
+static method main() → void {
+  self::D* d = new self::D::•(new self::C::•<core::num*>(#C1));
+  let final self::D* #t1 = d in #t1.{self::D::value} = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:46: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+  d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+                                             ^" in (#t1.{self::D::value}{self::C<core::num*>*}.{self::C::+}(1){(core::int*) →* (core::num*) →* core::num*} as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
+  self::expect(let final self::D* #t2 = d in let final core::int* #t3 = 0 in #t2.{self::D::setValue}{(core::int*) →* core::int*}(#t3){(core::int*) →* core::int*}, 1);
+  d = new self::D::•(new self::C::•<core::num*>(#C2));
+  self::expectTypeError(() → Null {
+    let final self::D* #t4 = d in #t4.{self::D::value} = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+    d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+                                               ^" in (#t4.{self::D::value}{self::C<core::num*>*}.{self::C::+}(1){(core::int*) →* (core::num*) →* core::num*} as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
+  });
+  self::expect(d.{self::D::setValue}{(core::int*) →* core::int*}, null);
+}
+
+constants  {
+  #C1 = static-tearoff self::numToInt
+  #C2 = static-tearoff self::numToNum
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.weak.modular.expect
new file mode 100644
index 0000000..c730f2f
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.weak.modular.expect
@@ -0,0 +1,82 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:54: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+//  - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+//   c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+//                                                      ^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:62: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+//  - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+//   var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+//                                                              ^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:55: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+//  - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+//   c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+//                                                       ^
+//
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:63: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+//  - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+//   var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+//                                                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  operator +(covariant-by-class self::B<self::B::T*>* other) → self::B<self::B::T*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  get x() → self::B<(self::C::T*) →* void>*
+    return null;
+  set x(self::B<(self::C::T*) →* void>* value) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C<core::num*>* c) → void {
+  let final self::C<core::num*>* #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x}{self::B<(core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>*).{self::B::+}(invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:54: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+  c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+                                                     ^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>*){(self::B<(core::num*) →* void>*) →* self::B<(core::num*) →* void>*};
+  self::B<(core::num*) →* void>* y = let final self::C<core::num*>* #t2 = c in #t2.{self::C::x} = (#t2.{self::C::x}{self::B<(core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>*).{self::B::+}(invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:62: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+  var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+                                                             ^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>*){(self::B<(core::num*) →* void>*) →* self::B<(core::num*) →* void>*};
+  let final self::C<core::num*>* #t3 = c in #t3.{self::C::x}{self::B<(core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>* == null ?{self::B<core::Object*>*} #t3.{self::C::x} = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:55: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+  c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+                                                      ^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>* : null;
+  self::B<core::Object*>* z = let final self::C<core::num*>* #t4 = c in let final self::B<(core::num*) →* void>* #t5 = #t4.{self::C::x}{self::B<(core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>* in #t5 == null ?{self::B<core::Object*>*} #t4.{self::C::x} = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:63: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+  var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+                                                              ^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>* : #t5;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.weak.modular.expect
new file mode 100644
index 0000000..3769315
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.weak.modular.expect
@@ -0,0 +1,48 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  operator +(covariant-by-class self::B<self::B::T*>* other) → self::B<self::B::T*>*
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  operator [](core::int* i) → self::B<(self::C::T*) →* void>*
+    return null;
+  operator []=(core::int* i, self::B<(self::C::T*) →* void>* x) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C<core::num*>* c) → void {
+  c.{self::C::[]=}(0, new self::B::•<(core::num*) →* void>()){(core::int*, self::B<(core::num*) →* void>*) →* void};
+  let final self::C<core::num*>* #t1 = c in let final core::int* #t2 = 0 in #t1.{self::C::[]=}(#t2, (#t1.{self::C::[]}(#t2){(core::int*) →* self::B<(core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>*).{self::B::+}(new self::B::•<(core::num*) →* void>()){(self::B<(core::num*) →* void>*) →* self::B<(core::num*) →* void>*}){(core::int*, self::B<(core::num*) →* void>*) →* void};
+  self::B<(core::num*) →* void>* x = let final self::C<core::num*>* #t3 = c in let final core::int* #t4 = 0 in let final self::B<(core::num*) →* void>* #t5 = (#t3.{self::C::[]}(#t4){(core::int*) →* self::B<(core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>*).{self::B::+}(new self::B::•<(core::num*) →* void>()){(self::B<(core::num*) →* void>*) →* self::B<(core::num*) →* void>*} in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5){(core::int*, self::B<(core::num*) →* void>*) →* void} in #t5;
+  let final self::C<core::num*>* #t7 = c in let final core::int* #t8 = 0 in #t7.{self::C::[]}(#t8){(core::int*) →* self::B<(core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>* == null ?{self::B<(core::num*) →* void>*} #t7.{self::C::[]=}(#t8, new self::B::•<(core::num*) →* void>()){(core::int*, self::B<(core::num*) →* void>*) →* void} : null;
+  self::B<(core::num*) →* void>* y = let final self::C<core::num*>* #t9 = c in let final core::int* #t10 = 0 in let final self::B<(core::num*) →* void>* #t11 = #t9.{self::C::[]}(#t10){(core::int*) →* self::B<(core::num*) →* void>*} as{TypeError,CovarianceCheck} self::B<(core::num*) →* void>* in #t11 == null ?{self::B<(core::num*) →* void>*} let final self::B<(core::num*) →* void>* #t12 = new self::B::•<(core::num*) →* void>() in let final void #t13 = #t9.{self::C::[]=}(#t10, #t12){(core::int*, self::B<(core::num*) →* void>*) →* void} in #t12 : #t11;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.weak.modular.expect
new file mode 100644
index 0000000..906d2cb
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  operator [](core::int* i) → (self::C::T*) →* void
+    return null;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method test(self::C<core::num*>* c) → (core::num*) →* void {
+  return c.{self::C::[]}(0){(core::int*) →* (core::num*) →* void} as{TypeError,CovarianceCheck} (core::num*) →* void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.modular.expect
new file mode 100644
index 0000000..80e45ff
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.weak.modular.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method f(covariant-by-class self::B::T* x) → void {}
+  method g({covariant-by-class self::B::T* x = #C1}) → void {}
+  method h<covariant-by-class U extends self::B::T*>() → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B<core::int*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method g1(self::B<core::num*>* b) → void {
+  b.{self::B::f}(1.5){(core::num*) →* void};
+}
+static method g2(self::C* c) → void {
+  c.{self::B::f}(1){(core::int*) →* void};
+}
+static method test() → void {
+  self::g1(new self::C::•());
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.weak.modular.expect
new file mode 100644
index 0000000..985b00d
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.weak.modular.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B<core::num*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.weak.modular.expect
new file mode 100644
index 0000000..ec01d37
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.weak.modular.expect
@@ -0,0 +1,57 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Error: The implementation of 'x' in the non-abstract class 'D' does not conform to its interface.
+// class D extends C implements B {}
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:13:7: Context: The field 'C.x' has type 'int', which does not match the corresponding type, 'num', in the overridden setter, 'D.x'.
+//   int x;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart:16:7: Context: This is the overridden method ('x').
+// class D extends C implements B {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  covariant-by-declaration field core::num* x = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends core::Object {
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class D extends self::C implements self::B {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  forwarding-stub set x(covariant-by-declaration core::num* value) → void
+    return super.{self::C::x} = value as core::int*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.weak.modular.expect
new file mode 100644
index 0000000..05fc7de
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.weak.modular.expect
@@ -0,0 +1,50 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field dynamic staticField = null;
+  field dynamic instanceField = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static set staticSetter(dynamic x) → void {}
+  set instanceSetter(dynamic x) → void {}
+  method test() → void {
+    dynamic localVar;
+    for (final dynamic #t1 in <dynamic>[]) {
+      self::topLevel = #t1;
+    }
+    for (final dynamic #t2 in <dynamic>[]) {
+      self::topLevelSetter = #t2;
+    }
+    for (final dynamic #t3 in <dynamic>[]) {
+      self::C::staticField = #t3;
+    }
+    for (final dynamic #t4 in <dynamic>[]) {
+      self::C::staticSetter = #t4;
+    }
+    for (final dynamic #t5 in <dynamic>[]) {
+      this.{self::C::instanceField} = #t5;
+    }
+    for (final dynamic #t6 in <dynamic>[]) {
+      this.{self::C::instanceSetter} = #t6;
+    }
+    for (final dynamic #t7 in <dynamic>[]) {
+      localVar = #t7;
+    }
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field dynamic topLevel;
+static set topLevelSetter(dynamic x) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..7bfe030
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.weak.modular.expect
@@ -0,0 +1,58 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object* = dynamic> extends core::Object {
+  covariant-by-class field self::B::T* x = null;
+  covariant-by-class field self::B::T* y = null;
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C<T extends core::Object* = dynamic> extends core::Object implements self::B<core::num*> {
+  covariant-by-class field core::num* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  abstract get y() → core::num*;
+  abstract set y(covariant-by-class core::num* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class D<T extends core::Object* = dynamic> extends core::Object implements self::B<self::D::T*> {
+  covariant-by-class field self::D::T* x = null;
+  synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+  abstract get y() → self::D::T*;
+  abstract set y(covariant-by-class self::D::T* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.weak.modular.expect
new file mode 100644
index 0000000..0fdb717
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::bool* staticValue = self::o as{TypeError} core::bool*;
+  field core::bool* instanceValue = self::o as{TypeError} core::bool*;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field core::Object* o = 1;
+static field core::bool* topLevelValue = self::o as{TypeError} core::bool*;
+static method main() → dynamic {
+  try {
+    self::topLevelValue;
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+  try {
+    self::C::staticValue;
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+  try {
+    new self::C::•();
+    throw "no exception";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.weak.modular.expect
new file mode 100644
index 0000000..99c30ab
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.weak.modular.expect
@@ -0,0 +1,122 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:51:7: Error: The mixin application class 'C' introduces an erroneous override of 'y'.
+// class C = B with M implements I<int>;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Context: The field 'M.y' has type 'int', which does not match the corresponding type, 'Object', in the overridden setter, 'I.y'.
+//  - 'Object' is from 'dart:core'.
+//   int y;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:43:12: Context: This is the overridden method ('y').
+//   void set y(covariant Object value);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get x() → core::int* {
+    throw "Should not be reached";
+  }
+  set x(core::int* value) → void {
+    throw "Should not be reached";
+  }
+  get y() → core::int* {
+    throw "Should not be reached";
+  }
+  set y(core::int* value) → void {
+    throw "Should not be reached";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract get x() → self::I::T*;
+  abstract set x(covariant-by-class self::I::T* value) → void;
+  abstract get y() → core::Object*;
+  abstract set y(covariant-by-declaration core::Object* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  field core::int* x = null;
+  field core::int* y = null;
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  mixin-super-stub get x() → core::int*
+    return super.{self::M::x};
+  forwarding-stub set x(covariant-by-class core::int* value) → void
+    return super.{self::M::x} = value;
+  mixin-super-stub get y() → core::int*
+    return super.{self::M::y};
+  forwarding-stub set y(covariant-by-declaration core::int* value) → void
+    return super.{self::M::y} = value;
+}
+static method expectTypeError(() →* void callback) → void {
+  try {
+    callback(){() →* void};
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method expect(core::Object* value, core::Object* expected) → void {
+  if(!(value =={core::Object::==}{(core::Object*) →* core::bool*} expected)) {
+    throw "Expected ${expected}, got ${value}";
+  }
+}
+static method test(self::I<core::Object*>* i) → void {
+  self::expectTypeError(() → Null {
+    i.{self::I::x} = "hello";
+  });
+  i.{self::I::x} = 1;
+  self::expect(i.{self::I::x}{core::Object*}, 1);
+  self::expectTypeError(() → Null {
+    i.{self::I::y} = "hello";
+  });
+  i.{self::I::y} = 2;
+  self::expect(i.{self::I::y}{core::Object*}, 2);
+}
+static method main() → void {
+  self::test(new self::C::•());
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.weak.modular.expect
new file mode 100644
index 0000000..83a8031
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.weak.modular.expect
@@ -0,0 +1,131 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:58:7: Error: The mixin application class 'C' introduces an erroneous override of 'y'.
+// class C = B with M implements I<int>;
+//       ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Context: The parameter 'value' of the method 'M.y' has type 'int', which does not match the corresponding type, 'Object', in the overridden method, 'I.y'.
+//  - 'Object' is from 'dart:core'.
+// Change to a supertype of 'Object', or, for a covariant parameter, a subtype.
+//   void set y(int value) {
+//                  ^
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:43:12: Context: This is the overridden method ('y').
+//   void set y(covariant Object value);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get x() → core::int* {
+    throw "Should not be reached";
+  }
+  set x(core::int* value) → void {
+    throw "Should not be reached";
+  }
+  get y() → core::int* {
+    throw "Should not be reached";
+  }
+  set y(core::int* value) → void {
+    throw "Should not be reached";
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract get x() → self::I::T*;
+  abstract set x(covariant-by-class self::I::T* value) → void;
+  abstract get y() → core::Object*;
+  abstract set y(covariant-by-declaration core::Object* value) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  get x() → core::int*
+    return 1;
+  set x(core::int* value) → void {
+    self::expect(value, 2);
+  }
+  get y() → core::int*
+    return 3;
+  set y(core::int* value) → void {
+    self::expect(value, 4);
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  mixin-super-stub get x() → core::int*
+    return super.{self::M::x};
+  forwarding-stub set x(covariant-by-class core::int* value) → void
+    return super.{self::M::x} = value;
+  mixin-super-stub get y() → core::int*
+    return super.{self::M::y};
+  forwarding-stub set y(covariant-by-declaration core::int* value) → void
+    return super.{self::M::y} = value;
+}
+static method expectTypeError(() →* void callback) → void {
+  try {
+    callback(){() →* void};
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method expect(core::Object* value, core::Object* expected) → void {
+  if(!(value =={core::Object::==}{(core::Object*) →* core::bool*} expected)) {
+    throw "Expected ${expected}, got ${value}";
+  }
+}
+static method test(self::I<core::Object*>* i) → void {
+  self::expectTypeError(() → Null {
+    i.{self::I::x} = "hello";
+  });
+  i.{self::I::x} = 2;
+  self::expect(i.{self::I::x}{core::Object*}, 1);
+  self::expectTypeError(() → Null {
+    i.{self::I::y} = "hello";
+  });
+  i.{self::I::y} = 4;
+  self::expect(i.{self::I::y}{core::Object*}, 3);
+}
+static method main() → void {
+  self::test(new self::C::•());
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.weak.modular.expect
new file mode 100644
index 0000000..0fc6d13
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.weak.modular.expect
@@ -0,0 +1,76 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(core::int* x) → core::int* {
+    self::expect(x, 1);
+    return 2;
+  }
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-declaration core::Object* x) → core::int*;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class C extends self::B implements self::I {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub method f(covariant-by-declaration core::Object* x) → core::int*
+    return super.{self::B::f}(x as core::int*);
+}
+static method expectTypeError(() →* void callback) → void {
+  try {
+    callback(){() →* void};
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError* catch(no-exception-var) {
+  }
+}
+static method expect(core::Object* value, core::Object* expected) → void {
+  if(!(value =={core::Object::==}{(core::Object*) →* core::bool*} expected)) {
+    throw "Expected ${expected}, got ${value}";
+  }
+}
+static method g(self::C* c) → void {
+  c.{self::C::f}("hello"){(core::Object*) →* core::int*};
+}
+static method test(self::C* c, self::I* i) → void {
+  self::expectTypeError(() → Null {
+    i.{self::I::f}("hello"){(core::Object*) →* core::int*};
+  });
+  self::expect(i.{self::I::f}(1){(core::Object*) →* core::int*}, 2);
+  self::expectTypeError(() → Null {
+    c.{self::C::f}("hello"){(core::Object*) →* core::int*};
+  });
+  self::expect(c.{self::C::f}(1){(core::Object*) →* core::int*}, 2);
+}
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  self::test(c, c);
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.weak.modular.expect
new file mode 100644
index 0000000..9aacb53
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(core::int* x, core::int* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-class self::I::T* x, core::Object* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub method f(covariant-by-class core::int* x, core::Object* y) → void
+    return super.{self::B::f}(x, y as core::int*);
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.weak.modular.expect
new file mode 100644
index 0000000..f0e4b8e
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method f(covariant-by-class self::B::T* x, core::int* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method f(core::int* x, core::Object* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends self::B<core::int*> implements self::I {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  abstract forwarding-stub method f(covariant-by-class core::int* x, core::Object* y) → void;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.weak.modular.expect
new file mode 100644
index 0000000..8f7a060
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.weak.modular.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(core::int* x, core::int* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method f(covariant-by-declaration core::int* x, core::Object* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  forwarding-stub method f(covariant-by-declaration core::int* x, core::Object* y) → void
+    return super.{self::B::f}(x, y as core::int*);
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.weak.modular.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.weak.modular.expect
new file mode 100644
index 0000000..d4b9b44
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.weak.modular.expect
@@ -0,0 +1,43 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method f(covariant-by-declaration core::int* x, core::int* y) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  abstract method f(core::int* x, core::Object* y) → void;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+abstract class C extends self::B implements self::I {
+  synthetic constructor •() → self::C*
+    : super self::B::•()
+    ;
+  abstract forwarding-stub method f(covariant-by-declaration core::int* x, core::Object* y) → void;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.weak.modular.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.weak.modular.expect
new file mode 100644
index 0000000..d565d03
--- /dev/null
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.weak.modular.expect
@@ -0,0 +1,139 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:13:28: Error: The set literal type 'Set<dynamic>' isn't of expected type 'LinkedHashSet<int>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'LinkedHashSet' is from 'dart:collection'.
+// Change the type of the set literal or the context in which it is used.
+//   LinkedHashSet<int> lhs = {};
+//                            ^
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'LinkedHashMap' is from 'dart:collection'.
+// Change the type of the map literal or the context in which it is used.
+//   LinkedHashMap<int, bool> lhm = {};
+//                                  ^
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:32:46: Error: The set literal type 'Future<Set<dynamic>>' isn't of expected type 'Future<LinkedHashSet<int>>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'Set' is from 'dart:core'.
+//  - 'LinkedHashSet' is from 'dart:collection'.
+// Change the type of the set literal or the context in which it is used.
+// Future<LinkedHashSet<int>> lhsfun() async => {};
+//                                              ^
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:33:52: Error: The map literal type 'Future<Map<dynamic, dynamic>>' isn't of expected type 'Future<LinkedHashMap<int, bool>>'.
+//  - 'Future' is from 'dart:async'.
+//  - 'Map' is from 'dart:core'.
+//  - 'LinkedHashMap' is from 'dart:collection'.
+// Change the type of the map literal or the context in which it is used.
+// Future<LinkedHashMap<int, bool>> lhmfun() async => {};
+//                                                    ^
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'LinkedHashSet' is from 'dart:collection'.
+// FutureOr<LinkedHashSet<int>> lhsfun2() => {};
+//                                           ^
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'LinkedHashMap' is from 'dart:collection'.
+// FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
+//                                                 ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "dart:async" as asy;
+
+import "dart:async" show FutureOr;
+import "dart:collection" show LinkedHashMap, LinkedHashSet;
+
+static method main() → dynamic async {
+  core::Map<core::int*, core::bool*>* m = <core::int*, core::bool*>{};
+  core::Set<core::int*>* s = block {
+    final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+  } =>#t1;
+  core::Iterable<core::int*>* i = block {
+    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+  } =>#t2;
+  col::LinkedHashSet<core::int*>* lhs = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:13:28: Error: The set literal type 'Set<dynamic>' isn't of expected type 'LinkedHashSet<int>'.
+ - 'Set' is from 'dart:core'.
+ - 'LinkedHashSet' is from 'dart:collection'.
+Change the type of the set literal or the context in which it is used.
+  LinkedHashSet<int> lhs = {};
+                           ^" in block {
+    final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
+  } =>#t3;
+  col::LinkedHashMap<core::int*, core::bool*>* lhm = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
+ - 'Map' is from 'dart:core'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+Change the type of the map literal or the context in which it is used.
+  LinkedHashMap<int, bool> lhm = {};
+                                 ^" in <dynamic, dynamic>{};
+  core::Map<core::int*, core::bool*>* fm = await self::mapfun();
+  core::Set<core::int*>* fs = await self::setfun();
+  core::Iterable<core::int*>* fi = await self::iterablefun();
+  col::LinkedHashSet<core::int*>* flhs = await self::lhsfun();
+  col::LinkedHashMap<core::int*, core::bool*>* flhm = await self::lhmfun();
+  core::Map<core::int*, core::bool*>* fm2 = await self::mapfun2();
+  core::Set<core::int*>* fs2 = await self::setfun2();
+  core::Iterable<core::int*>* fi2 = await self::iterablefun2();
+  col::LinkedHashSet<core::int*>* flhs2 = await self::lhsfun2();
+  col::LinkedHashMap<core::int*, core::bool*>* flhm2 = await self::lhmfun2();
+}
+static method mapfun() → asy::Future<core::Map<core::int*, core::bool*>*>* async 
+  return <core::int*, core::bool*>{};
+static method setfun() → asy::Future<core::Set<core::int*>*>* async 
+  return block {
+    final core::Set<core::int*>* #t4 = col::LinkedHashSet::•<core::int*>();
+  } =>#t4;
+static method iterablefun() → asy::Future<core::Iterable<core::int*>*>* async 
+  return block {
+    final core::Set<core::int*>* #t5 = col::LinkedHashSet::•<core::int*>();
+  } =>#t5;
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int*>*>* async 
+  return invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:32:46: Error: The set literal type 'Future<Set<dynamic>>' isn't of expected type 'Future<LinkedHashSet<int>>'.
+ - 'Future' is from 'dart:async'.
+ - 'Set' is from 'dart:core'.
+ - 'LinkedHashSet' is from 'dart:collection'.
+Change the type of the set literal or the context in which it is used.
+Future<LinkedHashSet<int>> lhsfun() async => {};
+                                             ^" in block {
+    final core::Set<dynamic>* #t6 = col::LinkedHashSet::•<dynamic>();
+  } =>#t6;
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int*, core::bool*>*>* async 
+  return invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:33:52: Error: The map literal type 'Future<Map<dynamic, dynamic>>' isn't of expected type 'Future<LinkedHashMap<int, bool>>'.
+ - 'Future' is from 'dart:async'.
+ - 'Map' is from 'dart:core'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+Change the type of the map literal or the context in which it is used.
+Future<LinkedHashMap<int, bool>> lhmfun() async => {};
+                                                   ^" in <dynamic, dynamic>{};
+static method mapfun2() → FutureOr<core::Map<core::int*, core::bool*>*>*
+  return <core::int*, core::bool*>{};
+static method setfun2() → FutureOr<core::Set<core::int*>*>*
+  return block {
+    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
+  } =>#t7;
+static method iterablefun2() → FutureOr<core::Iterable<core::int*>*>*
+  return block {
+    final core::Set<core::int*>* #t8 = col::LinkedHashSet::•<core::int*>();
+  } =>#t8;
+static method lhsfun2() → FutureOr<col::LinkedHashSet<core::int*>*>*
+  return invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
+ - 'Set' is from 'dart:core'.
+ - 'LinkedHashSet' is from 'dart:collection'.
+FutureOr<LinkedHashSet<int>> lhsfun2() => {};
+                                          ^" in ( block {
+    final core::Set<dynamic>* #t9 = col::LinkedHashSet::•<dynamic>();
+  } =>#t9) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
+static method lhmfun2() → FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
+  return invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
+ - 'Map' is from 'dart:core'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
+                                                ^" in <dynamic, dynamic>{} as{TypeError} FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*;
diff --git a/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.modular.expect b/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.modular.expect
new file mode 100644
index 0000000..4d0ac34
--- /dev/null
+++ b/pkg/front_end/testcases/static_field_lowering/enum.dart.weak.modular.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::A> values = #C7;
+  static const field self::A a = #C3;
+  static const field self::A b = #C6;
+  const constructor •(core::int index, core::String name) → self::A
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "A.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "a"
+  #C3 = self::A {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "b"
+  #C6 = self::A {index:#C4, _name:#C5}
+  #C7 = <self::A*>[#C3, #C6]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///enum.dart:
+- A. (from org-dartlang-testcase:///enum.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.modular.expect b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.modular.expect
new file mode 100644
index 0000000..bae037b
--- /dev/null
+++ b/pkg/front_end/testcases/static_field_lowering/opt_in.dart.weak.modular.expect
@@ -0,0 +1,340 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Class extends core::Object {
+  static const field core::int staticConstField = #C1;
+  static field core::int? staticFieldWithoutInitializer = null;
+  field core::int nonNullableInstanceFieldWithInitializer = self::init<core::int>(55);
+  field core::int? nullableInstanceFieldWithInitializer = self::init<core::int?>(17);
+  static field core::int? _#nonNullableStaticFieldWithInitializer1 = null;
+  static field core::bool _#nonNullableStaticFieldWithInitializer1#isSet = false;
+  static field core::int? _#nullableStaticFieldWithInitializer1 = null;
+  static field core::bool _#nullableStaticFieldWithInitializer1#isSet = false;
+  static field core::int? _#nonNullableStaticFieldWithInitializer2 = null;
+  static field core::bool _#nonNullableStaticFieldWithInitializer2#isSet = false;
+  static field core::int? _#nullableStaticFieldWithInitializer2 = null;
+  static field core::bool _#nullableStaticFieldWithInitializer2#isSet = false;
+  static field core::int? _#nonNullableStaticFinalFieldWithInitializer1 = null;
+  static field core::bool _#nonNullableStaticFinalFieldWithInitializer1#isSet = false;
+  static field core::int? _#nullableStaticFinalFieldWithInitializer1 = null;
+  static field core::bool _#nullableStaticFinalFieldWithInitializer1#isSet = false;
+  static field core::int? _#nonNullableStaticFinalFieldWithInitializer2Init = null;
+  static field core::bool _#nonNullableStaticFinalFieldWithInitializer2Init#isSet = false;
+  static field core::int? _#nonNullableStaticFinalFieldWithInitializer2 = null;
+  static field core::bool _#nonNullableStaticFinalFieldWithInitializer2#isSet = false;
+  static field core::int? _#nullableStaticFinalFieldWithInitializer2Init = null;
+  static field core::bool _#nullableStaticFinalFieldWithInitializer2Init#isSet = false;
+  static field core::int? _#nullableStaticFinalFieldWithInitializer2 = null;
+  static field core::bool _#nullableStaticFinalFieldWithInitializer2#isSet = false;
+  synthetic constructor •() → self::Class
+    : super core::Object::•()
+    ;
+  static get nonNullableStaticFieldWithInitializer1() → core::int {
+    if(!self::Class::_#nonNullableStaticFieldWithInitializer1#isSet) {
+      self::Class::_#nonNullableStaticFieldWithInitializer1 = self::init<core::int>(55);
+      self::Class::_#nonNullableStaticFieldWithInitializer1#isSet = true;
+    }
+    return let final core::int? #t1 = self::Class::_#nonNullableStaticFieldWithInitializer1 in #t1{core::int};
+  }
+  static set nonNullableStaticFieldWithInitializer1(core::int #t2) → void {
+    self::Class::_#nonNullableStaticFieldWithInitializer1#isSet = true;
+    self::Class::_#nonNullableStaticFieldWithInitializer1 = #t2;
+  }
+  static get nullableStaticFieldWithInitializer1() → core::int? {
+    if(!self::Class::_#nullableStaticFieldWithInitializer1#isSet) {
+      self::Class::_#nullableStaticFieldWithInitializer1 = self::init<core::int?>(17);
+      self::Class::_#nullableStaticFieldWithInitializer1#isSet = true;
+    }
+    return self::Class::_#nullableStaticFieldWithInitializer1;
+  }
+  static set nullableStaticFieldWithInitializer1(core::int? #t3) → void {
+    self::Class::_#nullableStaticFieldWithInitializer1#isSet = true;
+    self::Class::_#nullableStaticFieldWithInitializer1 = #t3;
+  }
+  static get nonNullableStaticFieldWithInitializer2() → core::int {
+    if(!self::Class::_#nonNullableStaticFieldWithInitializer2#isSet) {
+      self::Class::_#nonNullableStaticFieldWithInitializer2 = self::init<core::int>(55);
+      self::Class::_#nonNullableStaticFieldWithInitializer2#isSet = true;
+    }
+    return let final core::int? #t4 = self::Class::_#nonNullableStaticFieldWithInitializer2 in #t4{core::int};
+  }
+  static set nonNullableStaticFieldWithInitializer2(core::int #t5) → void {
+    self::Class::_#nonNullableStaticFieldWithInitializer2#isSet = true;
+    self::Class::_#nonNullableStaticFieldWithInitializer2 = #t5;
+  }
+  static get nullableStaticFieldWithInitializer2() → core::int? {
+    if(!self::Class::_#nullableStaticFieldWithInitializer2#isSet) {
+      self::Class::_#nullableStaticFieldWithInitializer2 = self::init<core::int?>(17);
+      self::Class::_#nullableStaticFieldWithInitializer2#isSet = true;
+    }
+    return self::Class::_#nullableStaticFieldWithInitializer2;
+  }
+  static set nullableStaticFieldWithInitializer2(core::int? #t6) → void {
+    self::Class::_#nullableStaticFieldWithInitializer2#isSet = true;
+    self::Class::_#nullableStaticFieldWithInitializer2 = #t6;
+  }
+  static get nonNullableStaticFinalFieldWithInitializer1() → core::int {
+    if(!self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet) {
+      final core::int #t7 = self::init<core::int>(73);
+      if(self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet)
+        throw new _in::LateError::fieldADI("nonNullableStaticFinalFieldWithInitializer1");
+      self::Class::_#nonNullableStaticFinalFieldWithInitializer1 = #t7;
+      self::Class::_#nonNullableStaticFinalFieldWithInitializer1#isSet = true;
+    }
+    return let final core::int? #t8 = self::Class::_#nonNullableStaticFinalFieldWithInitializer1 in #t8{core::int};
+  }
+  static get nullableStaticFinalFieldWithInitializer1() → core::int? {
+    if(!self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet) {
+      final core::int? #t9 = self::init<core::int?>(19);
+      if(self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet)
+        throw new _in::LateError::fieldADI("nullableStaticFinalFieldWithInitializer1");
+      self::Class::_#nullableStaticFinalFieldWithInitializer1 = #t9;
+      self::Class::_#nullableStaticFinalFieldWithInitializer1#isSet = true;
+    }
+    return self::Class::_#nullableStaticFinalFieldWithInitializer1;
+  }
+  static get nonNullableStaticFinalFieldWithInitializer2Init() → core::int {
+    if(!self::Class::_#nonNullableStaticFinalFieldWithInitializer2Init#isSet) {
+      self::Class::_#nonNullableStaticFinalFieldWithInitializer2Init = 0;
+      self::Class::_#nonNullableStaticFinalFieldWithInitializer2Init#isSet = true;
+    }
+    return let final core::int? #t10 = self::Class::_#nonNullableStaticFinalFieldWithInitializer2Init in #t10{core::int};
+  }
+  static set nonNullableStaticFinalFieldWithInitializer2Init(core::int #t11) → void {
+    self::Class::_#nonNullableStaticFinalFieldWithInitializer2Init#isSet = true;
+    self::Class::_#nonNullableStaticFinalFieldWithInitializer2Init = #t11;
+  }
+  static get nonNullableStaticFinalFieldWithInitializer2() → core::int {
+    if(!self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet) {
+      final core::int #t12 = (let final core::int #t13 = self::Class::nonNullableStaticFinalFieldWithInitializer2Init in let final core::int #t14 = self::Class::nonNullableStaticFinalFieldWithInitializer2Init = #t13.{core::num::+}(1){(core::num) → core::int} in #t13) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} self::Class::nonNullableStaticFinalFieldWithInitializer2.{core::num::+}(1){(core::num) → core::int} : 87;
+      if(self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet)
+        throw new _in::LateError::fieldADI("nonNullableStaticFinalFieldWithInitializer2");
+      self::Class::_#nonNullableStaticFinalFieldWithInitializer2 = #t12;
+      self::Class::_#nonNullableStaticFinalFieldWithInitializer2#isSet = true;
+    }
+    return let final core::int? #t15 = self::Class::_#nonNullableStaticFinalFieldWithInitializer2 in #t15{core::int};
+  }
+  static get nullableStaticFinalFieldWithInitializer2Init() → core::int {
+    if(!self::Class::_#nullableStaticFinalFieldWithInitializer2Init#isSet) {
+      self::Class::_#nullableStaticFinalFieldWithInitializer2Init = 0;
+      self::Class::_#nullableStaticFinalFieldWithInitializer2Init#isSet = true;
+    }
+    return let final core::int? #t16 = self::Class::_#nullableStaticFinalFieldWithInitializer2Init in #t16{core::int};
+  }
+  static set nullableStaticFinalFieldWithInitializer2Init(core::int #t17) → void {
+    self::Class::_#nullableStaticFinalFieldWithInitializer2Init#isSet = true;
+    self::Class::_#nullableStaticFinalFieldWithInitializer2Init = #t17;
+  }
+  static get nullableStaticFinalFieldWithInitializer2() → core::int? {
+    if(!self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet) {
+      final core::int? #t18 = (let final core::int #t19 = self::Class::nullableStaticFinalFieldWithInitializer2Init in let final core::int #t20 = self::Class::nullableStaticFinalFieldWithInitializer2Init = #t19.{core::num::+}(1){(core::num) → core::int} in #t19) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} self::Class::nullableStaticFinalFieldWithInitializer2!.{core::num::+}(1){(core::num) → core::int} : 32;
+      if(self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet)
+        throw new _in::LateError::fieldADI("nullableStaticFinalFieldWithInitializer2");
+      self::Class::_#nullableStaticFinalFieldWithInitializer2 = #t18;
+      self::Class::_#nullableStaticFinalFieldWithInitializer2#isSet = true;
+    }
+    return self::Class::_#nullableStaticFinalFieldWithInitializer2;
+  }
+}
+static field dynamic lastInit;
+static const field core::int constTopLevelField = #C2;
+static field core::int? topLevelFieldWithoutInitializer;
+static field core::int? _#nonNullableTopLevelFieldWithInitializer1 = null;
+static field core::bool _#nonNullableTopLevelFieldWithInitializer1#isSet = false;
+static field core::int? _#nullableTopLevelFieldWithInitializer = null;
+static field core::bool _#nullableTopLevelFieldWithInitializer#isSet = false;
+static field core::int? _#nonNullableTopLevelFieldWithInitializer2 = null;
+static field core::bool _#nonNullableTopLevelFieldWithInitializer2#isSet = false;
+static field core::int? _#nullableTopLevelFieldWithInitializer2 = null;
+static field core::bool _#nullableTopLevelFieldWithInitializer2#isSet = false;
+static field core::int? _#nonNullableFinalTopLevelFieldWithInitializer1 = null;
+static field core::bool _#nonNullableFinalTopLevelFieldWithInitializer1#isSet = false;
+static field core::int? _#nullableFinalTopLevelFieldWithInitializer1 = null;
+static field core::bool _#nullableFinalTopLevelFieldWithInitializer1#isSet = false;
+static field core::int? _#nonNullableFinalTopLevelFieldWithInitializer2Init = null;
+static field core::bool _#nonNullableFinalTopLevelFieldWithInitializer2Init#isSet = false;
+static field core::int? _#nonNullableFinalTopLevelFieldWithInitializer2 = null;
+static field core::bool _#nonNullableFinalTopLevelFieldWithInitializer2#isSet = false;
+static field core::int? _#nullableFinalTopLevelFieldWithInitializer2Init = null;
+static field core::bool _#nullableFinalTopLevelFieldWithInitializer2Init#isSet = false;
+static field core::int? _#nullableFinalTopLevelFieldWithInitializer2 = null;
+static field core::bool _#nullableFinalTopLevelFieldWithInitializer2#isSet = false;
+static method init<T extends core::Object? = dynamic>(self::init::T% value) → self::init::T% {
+  self::lastInit = value;
+  return value;
+}
+static get nonNullableTopLevelFieldWithInitializer1() → core::int {
+  if(!self::_#nonNullableTopLevelFieldWithInitializer1#isSet) {
+    self::_#nonNullableTopLevelFieldWithInitializer1 = self::init<core::int>(42);
+    self::_#nonNullableTopLevelFieldWithInitializer1#isSet = true;
+  }
+  return let final core::int? #t21 = self::_#nonNullableTopLevelFieldWithInitializer1 in #t21{core::int};
+}
+static set nonNullableTopLevelFieldWithInitializer1(core::int #t22) → void {
+  self::_#nonNullableTopLevelFieldWithInitializer1#isSet = true;
+  self::_#nonNullableTopLevelFieldWithInitializer1 = #t22;
+}
+static get nullableTopLevelFieldWithInitializer() → core::int? {
+  if(!self::_#nullableTopLevelFieldWithInitializer#isSet) {
+    self::_#nullableTopLevelFieldWithInitializer = self::init<core::int?>(123);
+    self::_#nullableTopLevelFieldWithInitializer#isSet = true;
+  }
+  return self::_#nullableTopLevelFieldWithInitializer;
+}
+static set nullableTopLevelFieldWithInitializer(core::int? #t23) → void {
+  self::_#nullableTopLevelFieldWithInitializer#isSet = true;
+  self::_#nullableTopLevelFieldWithInitializer = #t23;
+}
+static get nonNullableTopLevelFieldWithInitializer2() → core::int {
+  if(!self::_#nonNullableTopLevelFieldWithInitializer2#isSet) {
+    self::_#nonNullableTopLevelFieldWithInitializer2 = self::init<core::int>(42);
+    self::_#nonNullableTopLevelFieldWithInitializer2#isSet = true;
+  }
+  return let final core::int? #t24 = self::_#nonNullableTopLevelFieldWithInitializer2 in #t24{core::int};
+}
+static set nonNullableTopLevelFieldWithInitializer2(core::int #t25) → void {
+  self::_#nonNullableTopLevelFieldWithInitializer2#isSet = true;
+  self::_#nonNullableTopLevelFieldWithInitializer2 = #t25;
+}
+static get nullableTopLevelFieldWithInitializer2() → core::int? {
+  if(!self::_#nullableTopLevelFieldWithInitializer2#isSet) {
+    self::_#nullableTopLevelFieldWithInitializer2 = self::init<core::int?>(123);
+    self::_#nullableTopLevelFieldWithInitializer2#isSet = true;
+  }
+  return self::_#nullableTopLevelFieldWithInitializer2;
+}
+static set nullableTopLevelFieldWithInitializer2(core::int? #t26) → void {
+  self::_#nullableTopLevelFieldWithInitializer2#isSet = true;
+  self::_#nullableTopLevelFieldWithInitializer2 = #t26;
+}
+static get nonNullableFinalTopLevelFieldWithInitializer1() → core::int {
+  if(!self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet) {
+    final core::int #t27 = self::init<core::int>(87);
+    if(self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet)
+      throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer1");
+    self::_#nonNullableFinalTopLevelFieldWithInitializer1 = #t27;
+    self::_#nonNullableFinalTopLevelFieldWithInitializer1#isSet = true;
+  }
+  return let final core::int? #t28 = self::_#nonNullableFinalTopLevelFieldWithInitializer1 in #t28{core::int};
+}
+static get nullableFinalTopLevelFieldWithInitializer1() → core::int? {
+  if(!self::_#nullableFinalTopLevelFieldWithInitializer1#isSet) {
+    final core::int? #t29 = self::init<core::int?>(32);
+    if(self::_#nullableFinalTopLevelFieldWithInitializer1#isSet)
+      throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer1");
+    self::_#nullableFinalTopLevelFieldWithInitializer1 = #t29;
+    self::_#nullableFinalTopLevelFieldWithInitializer1#isSet = true;
+  }
+  return self::_#nullableFinalTopLevelFieldWithInitializer1;
+}
+static get nonNullableFinalTopLevelFieldWithInitializer2Init() → core::int {
+  if(!self::_#nonNullableFinalTopLevelFieldWithInitializer2Init#isSet) {
+    self::_#nonNullableFinalTopLevelFieldWithInitializer2Init = 0;
+    self::_#nonNullableFinalTopLevelFieldWithInitializer2Init#isSet = true;
+  }
+  return let final core::int? #t30 = self::_#nonNullableFinalTopLevelFieldWithInitializer2Init in #t30{core::int};
+}
+static set nonNullableFinalTopLevelFieldWithInitializer2Init(core::int #t31) → void {
+  self::_#nonNullableFinalTopLevelFieldWithInitializer2Init#isSet = true;
+  self::_#nonNullableFinalTopLevelFieldWithInitializer2Init = #t31;
+}
+static get nonNullableFinalTopLevelFieldWithInitializer2() → core::int {
+  if(!self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet) {
+    final core::int #t32 = (let final core::int #t33 = self::nonNullableFinalTopLevelFieldWithInitializer2Init in let final core::int #t34 = self::nonNullableFinalTopLevelFieldWithInitializer2Init = #t33.{core::num::+}(1){(core::num) → core::int} in #t33) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} self::nonNullableFinalTopLevelFieldWithInitializer2.{core::num::+}(1){(core::num) → core::int} : 87;
+    if(self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet)
+      throw new _in::LateError::fieldADI("nonNullableFinalTopLevelFieldWithInitializer2");
+    self::_#nonNullableFinalTopLevelFieldWithInitializer2 = #t32;
+    self::_#nonNullableFinalTopLevelFieldWithInitializer2#isSet = true;
+  }
+  return let final core::int? #t35 = self::_#nonNullableFinalTopLevelFieldWithInitializer2 in #t35{core::int};
+}
+static get nullableFinalTopLevelFieldWithInitializer2Init() → core::int {
+  if(!self::_#nullableFinalTopLevelFieldWithInitializer2Init#isSet) {
+    self::_#nullableFinalTopLevelFieldWithInitializer2Init = 0;
+    self::_#nullableFinalTopLevelFieldWithInitializer2Init#isSet = true;
+  }
+  return let final core::int? #t36 = self::_#nullableFinalTopLevelFieldWithInitializer2Init in #t36{core::int};
+}
+static set nullableFinalTopLevelFieldWithInitializer2Init(core::int #t37) → void {
+  self::_#nullableFinalTopLevelFieldWithInitializer2Init#isSet = true;
+  self::_#nullableFinalTopLevelFieldWithInitializer2Init = #t37;
+}
+static get nullableFinalTopLevelFieldWithInitializer2() → core::int? {
+  if(!self::_#nullableFinalTopLevelFieldWithInitializer2#isSet) {
+    final core::int? #t38 = (let final core::int #t39 = self::nullableFinalTopLevelFieldWithInitializer2Init in let final core::int #t40 = self::nullableFinalTopLevelFieldWithInitializer2Init = #t39.{core::num::+}(1){(core::num) → core::int} in #t39) =={core::num::==}{(core::Object) → core::bool} 0 ?{core::int} self::nullableFinalTopLevelFieldWithInitializer2!.{core::num::+}(1){(core::num) → core::int} : 32;
+    if(self::_#nullableFinalTopLevelFieldWithInitializer2#isSet)
+      throw new _in::LateError::fieldADI("nullableFinalTopLevelFieldWithInitializer2");
+    self::_#nullableFinalTopLevelFieldWithInitializer2 = #t38;
+    self::_#nullableFinalTopLevelFieldWithInitializer2#isSet = true;
+  }
+  return self::_#nullableFinalTopLevelFieldWithInitializer2;
+}
+static method main() → dynamic {
+  self::expect(null, self::lastInit);
+  self::expect(null, self::topLevelFieldWithoutInitializer);
+  self::expect(324, #C2);
+  self::expect(null, self::Class::staticFieldWithoutInitializer);
+  self::expect(123, #C1);
+  self::expect(42, self::nonNullableTopLevelFieldWithInitializer1);
+  self::expect(42, self::lastInit);
+  self::expect(123, self::nullableTopLevelFieldWithInitializer);
+  self::expect(123, self::lastInit);
+  self::nonNullableTopLevelFieldWithInitializer2 = 56;
+  self::expect(123, self::lastInit);
+  self::expect(56, self::nonNullableTopLevelFieldWithInitializer2);
+  self::expect(123, self::lastInit);
+  self::nullableTopLevelFieldWithInitializer2 = 7;
+  self::expect(123, self::lastInit);
+  self::expect(7, self::nullableTopLevelFieldWithInitializer2);
+  self::expect(123, self::lastInit);
+  self::expect(87, self::nonNullableFinalTopLevelFieldWithInitializer1);
+  self::expect(87, self::lastInit);
+  self::expect(32, self::nullableFinalTopLevelFieldWithInitializer1);
+  self::expect(32, self::lastInit);
+  self::throws(() → core::int => self::nonNullableFinalTopLevelFieldWithInitializer2, "Read nonNullableFinalTopLevelFieldWithInitializer2");
+  self::throws(() → core::int? => self::nullableFinalTopLevelFieldWithInitializer2, "Read nullableFinalTopLevelFieldWithInitializer2");
+  self::expect(55, self::Class::nonNullableStaticFieldWithInitializer1);
+  self::expect(55, self::lastInit);
+  self::expect(17, self::Class::nullableStaticFieldWithInitializer1);
+  self::expect(17, self::lastInit);
+  self::Class::nonNullableStaticFieldWithInitializer2 = 63;
+  self::expect(17, self::lastInit);
+  self::expect(63, self::Class::nonNullableStaticFieldWithInitializer2);
+  self::expect(17, self::lastInit);
+  self::Class::nullableStaticFieldWithInitializer2 = 89;
+  self::expect(17, self::lastInit);
+  self::expect(89, self::Class::nullableStaticFieldWithInitializer2);
+  self::expect(17, self::lastInit);
+  self::expect(73, self::Class::nonNullableStaticFinalFieldWithInitializer1);
+  self::expect(73, self::lastInit);
+  self::expect(19, self::Class::nullableStaticFinalFieldWithInitializer1);
+  self::expect(19, self::lastInit);
+  self::throws(() → core::int => self::Class::nonNullableStaticFinalFieldWithInitializer2, "Read nonNullableStaticFinalFieldWithInitializer2");
+  self::throws(() → core::int? => self::Class::nullableStaticFinalFieldWithInitializer2, "Read nullableStaticFinalFieldWithInitializer2");
+  self::Class c = new self::Class::•();
+  self::expect(17, self::lastInit);
+  self::expect(55, c.{self::Class::nonNullableInstanceFieldWithInitializer}{core::int});
+  self::expect(17, c.{self::Class::nullableInstanceFieldWithInitializer}{core::int?});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() → dynamic f, core::String message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() → dynamic};
+  }
+  on core::Error catch(final core::Error e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
+
+constants  {
+  #C1 = 123
+  #C2 = 324
+}
diff --git a/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.modular.expect b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.modular.expect
new file mode 100644
index 0000000..be71725
--- /dev/null
+++ b/pkg/front_end/testcases/static_field_lowering/opt_out.dart.weak.modular.expect
@@ -0,0 +1,87 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class extends core::Object {
+  static const field core::int* staticConstField = #C1;
+  field core::int* instanceFieldWithInitializer = self::init<core::int*>(55);
+  static field core::int* staticFieldWithoutInitializer = null;
+  static field core::int* staticFieldWithInitializer1 = self::init<core::int*>(55);
+  static field core::int* staticFieldWithInitializer2 = self::init<core::int*>(55);
+  static final field core::int* staticFinalFieldWithInitializer1 = self::init<core::int*>(73);
+  static field core::int* staticFinalFieldWithInitializer2Init = 0;
+  static final field core::int* staticFinalFieldWithInitializer2 = (let final core::int* #t1 = self::Class::staticFinalFieldWithInitializer2Init in let final core::int* #t2 = self::Class::staticFinalFieldWithInitializer2Init = #t1.{core::num::+}(1){(core::num*) →* core::int*} in #t1) =={core::num::==}{(core::Object*) →* core::bool*} 0 ?{core::int*} self::Class::staticFinalFieldWithInitializer2.{core::num::+}(1){(core::num*) →* core::int*} : 87;
+  synthetic constructor •() → self::Class*
+    : super core::Object::•()
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static field dynamic lastInit;
+static const field core::int* constTopLevelField = #C2;
+static field core::int* topLevelFieldWithoutInitializer;
+static field core::int* topLevelFieldWithInitializer1 = self::init<core::int*>(42);
+static field core::int* topLevelFieldWithInitializer2 = self::init<core::int*>(42);
+static final field core::int* finalTopLevelFieldWithInitializer1 = self::init<core::int*>(87);
+static field core::int* finalTopLevelFieldWithInitializer2Init = 0;
+static final field core::int* finalTopLevelFieldWithInitializer2 = (let final core::int* #t3 = self::finalTopLevelFieldWithInitializer2Init in let final core::int* #t4 = self::finalTopLevelFieldWithInitializer2Init = #t3.{core::num::+}(1){(core::num*) →* core::int*} in #t3) =={core::num::==}{(core::Object*) →* core::bool*} 0 ?{core::int*} self::finalTopLevelFieldWithInitializer2.{core::num::+}(1){(core::num*) →* core::int*} : 87;
+static method init<T extends core::Object* = dynamic>(self::init::T* value) → self::init::T* {
+  self::lastInit = value;
+  return value;
+}
+static method main() → dynamic {
+  self::expect(null, self::lastInit);
+  self::expect(null, self::topLevelFieldWithoutInitializer);
+  self::expect(324, #C2);
+  self::expect(null, self::Class::staticFieldWithoutInitializer);
+  self::expect(123, #C1);
+  self::expect(42, self::topLevelFieldWithInitializer1);
+  self::expect(42, self::lastInit);
+  self::topLevelFieldWithInitializer2 = 56;
+  self::expect(42, self::lastInit);
+  self::expect(56, self::topLevelFieldWithInitializer2);
+  self::expect(42, self::lastInit);
+  self::expect(87, self::finalTopLevelFieldWithInitializer1);
+  self::expect(87, self::lastInit);
+  self::throws(() → core::int* => self::finalTopLevelFieldWithInitializer2, "Read finalTopLevelFieldWithInitializer2");
+  self::expect(55, self::Class::staticFieldWithInitializer1);
+  self::expect(55, self::lastInit);
+  self::Class::staticFieldWithInitializer2 = 63;
+  self::expect(55, self::lastInit);
+  self::expect(63, self::Class::staticFieldWithInitializer2);
+  self::expect(55, self::lastInit);
+  self::expect(73, self::Class::staticFinalFieldWithInitializer1);
+  self::expect(73, self::lastInit);
+  self::throws(() → core::int* => self::Class::staticFinalFieldWithInitializer2, "Read staticFinalFieldWithInitializer2");
+  self::Class* c = new self::Class::•();
+  self::expect(55, self::lastInit);
+  self::expect(55, c.{self::Class::instanceFieldWithInitializer}{core::int*});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
+static method throws(() →* dynamic f, core::String* message) → dynamic {
+  dynamic value;
+  try {
+    value = f(){() →* dynamic};
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+    return;
+  }
+  throw "${message}: ${value}";
+}
+
+constants  {
+  #C1 = 123
+  #C2 = 324
+}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 3619d46..2aef19d 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -6,6 +6,13 @@
 # Kernel ASTs directly, that is, code in pkg/fasta/lib/src/kernel/ with
 # strong-mode enabled.
 
+dart2js/flutter_issue94561/main: SemiFuzzFailure
+dart2js/flutter_issue94561/main.no_link: SemiFuzzFailure
+dart2js/late_fields: SemiFuzzFailure
+dart2js/late_from_dill/main: SemiFuzzFailure
+dart2js/late_statics: SemiFuzzFailure
+static_field_lowering/opt_in: SemiFuzzFailure
+
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/super_parameters/folder.options b/pkg/front_end/testcases/super_parameters/folder.options
new file mode 100644
index 0000000..b69b691
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/folder.options
@@ -0,0 +1 @@
+--enable-experiment=super-parameters
\ No newline at end of file
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart b/pkg/front_end/testcases/super_parameters/simple.dart
new file mode 100644
index 0000000..fad88d0
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  final int foo;
+  A(this.foo);
+}
+
+class B extends A {
+  B(super.foo);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
new file mode 100644
index 0000000..2738e5e
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : super self::A::•(foo)
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
new file mode 100644
index 0000000..2738e5e
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : super self::A::•(foo)
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple.dart.textual_outline.expect
new file mode 100644
index 0000000..f0bc3ea
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+class A {
+  final int foo;
+  A(this.foo);
+}
+class B extends A {
+  B(super.foo);
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
new file mode 100644
index 0000000..2738e5e
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : super self::A::•(foo)
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect
new file mode 100644
index 0000000..2738e5e
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.modular.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : super self::A::•(foo)
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
new file mode 100644
index 0000000..997a20e
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
new file mode 100644
index 0000000..2738e5e
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple.dart.weak.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic foo) → self::B
+    : super self::A::•(foo)
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart
new file mode 100644
index 0000000..bd5cc28
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A1 {
+  final int foo;
+  A1({required this.foo});
+}
+
+class B1 extends A1 {
+  B1({required super.foo}) : super(); // Ok.
+}
+
+class C1 extends A1 {
+  C1({required super.foo}) : super(foo: foo); // Error.
+}
+
+class A2 {
+  final int foo;
+  final String bar;
+  A2({required this.foo, required this.bar});
+}
+
+class B2 extends A2 {
+  B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+}
+
+class C2 extends A2 {
+  C2({required super.foo}) : super(); // Error.
+  C2.other({required super.foo}) : super(bar: 'bar'); // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..74cac10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..3c4243b
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect
@@ -0,0 +1,23 @@
+class A1 {
+  final int foo;
+  A1({required this.foo});
+}
+class B1 extends A1 {
+  B1({required super.foo}) : super();
+}
+class C1 extends A1 {
+  C1({required super.foo}) : super(foo: foo);
+}
+class A2 {
+  final int foo;
+  final String bar;
+  A2({required this.foo, required this.bar});
+}
+class B2 extends A2 {
+  B2() : super(foo: 42, bar: "bar", baz: false);
+}
+class C2 extends A2 {
+  C2({required super.foo}) : super();
+  C2.other({required super.foo}) : super(bar: 'bar');
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..f3d5bdd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo}) → self::A1
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo}) → self::B1
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo}) → self::C1
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo, required core::String bar}) → self::A2
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo}) → self::C2
+    ;
+  constructor other({required dynamic foo}) → self::C2
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..74cac10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+//   C1({required super.foo}) : super(foo: foo); // Error.
+//                      ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+//   B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+//                                     ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+//   C2({required super.foo}) : super(); // Error.
+//                                   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •({required core::int foo = #C1}) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::B1
+    : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •({required dynamic foo = #C1}) → self::C1
+    : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+  C1({required super.foo}) : super(foo: foo); // Error.
+                     ^^^" in block {
+      foo;
+    } =>foo)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+  B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+                                    ^^^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •({required dynamic foo = #C1}) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+  C2({required super.foo}) : super(); // Error.
+                                  ^"
+    ;
+  constructor other({required dynamic foo = #C1}) → self::C2
+    : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart
new file mode 100644
index 0000000..d34d4a6
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A1 {
+  final int foo;
+  A1(this.foo);
+}
+
+class B1 extends A1 {
+  B1(super.foo) : super(); // Ok.
+}
+
+class C1 extends A1 {
+  C1(super.foo) : super(42); // Error.
+}
+
+class A2 {
+  final int foo;
+  final String bar;
+  A2(this.foo, this.bar);
+}
+
+class B2 extends A2 {
+  B2() : super(0, 1, 2); // Error.
+}
+
+class C2 extends A2 {
+  C2(super.foo) : super(); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
new file mode 100644
index 0000000..228f432
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..228f432
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..a6fc5bc
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect
@@ -0,0 +1,22 @@
+class A1 {
+  final int foo;
+  A1(this.foo);
+}
+class B1 extends A1 {
+  B1(super.foo) : super();
+}
+class C1 extends A1 {
+  C1(super.foo) : super(42);
+}
+class A2 {
+  final int foo;
+  final String bar;
+  A2(this.foo, this.bar);
+}
+class B2 extends A2 {
+  B2() : super(0, 1, 2);
+}
+class C2 extends A2 {
+  C2(super.foo) : super();
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
new file mode 100644
index 0000000..228f432
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..228f432
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..184b3f4
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    ;
+}
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..228f432
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+//   C1(super.foo) : super(42); // Error.
+//                        ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+//   C1(super.foo) : super(42); // Error.
+//            ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+//   B2() : super(0, 1, 2); // Error.
+//               ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+//   C2(super.foo) : super(); // Error.
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  final field core::int foo;
+  constructor •(core::int foo) → self::A1
+    : self::A1::foo = foo, super core::Object::•()
+    ;
+}
+class B1 extends self::A1 {
+  constructor •(dynamic foo) → self::B1
+    : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+    ;
+}
+class C1 extends self::A1 {
+  constructor •(dynamic foo) → self::C1
+    : super self::A1::•(42)
+    ;
+}
+class A2 extends core::Object {
+  final field core::int foo;
+  final field core::String bar;
+  constructor •(core::int foo, core::String bar) → self::A2
+    : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+    ;
+}
+class B2 extends self::A2 {
+  constructor •() → self::B2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+  B2() : super(0, 1, 2); // Error.
+              ^"
+    ;
+}
+class C2 extends self::A2 {
+  constructor •(dynamic foo) → self::C2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+  C2(super.foo) : super(); // Error.
+                       ^"
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 0c51eb2..8d551bb 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -33,6 +33,7 @@
 general/bug31124: RuntimeError
 general/call: RuntimeError
 general/cascade: RuntimeError
+general/conditional_import: RuntimeError # Issue 47814
 general/constructor_initializer_invalid: RuntimeError
 general/covariant_field: TypeCheckError
 general/covariant_generic: RuntimeError
@@ -135,7 +136,7 @@
 inference_new/infer_assign_to_index_this_upwards: TypeCheckError
 inference_new/infer_assign_to_index_upwards: TypeCheckError
 late_lowering/covariant_late_field: TypeCheckError
-named_arguments_anywhere/redirecting_constructor_initializers: Crash # Issue 47524.
+named_arguments_anywhere/redirecting_constructor_initializers: TextSerializationFailure # Issue 47524.
 nnbd/covariant_late_field: TypeCheckError
 nnbd/getter_vs_setter_type: TypeCheckError
 nnbd/issue42603: TypeCheckError
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 260c55f..5ebd7e2 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -28,6 +28,8 @@
 constructor_tearoffs/new_as_selector: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
+enhanced_enums/entries_with_type_arguments: FormatterCrash
+enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
 extension_types/basic_show: FormatterCrash
 extension_types/call_not_get: FormatterCrash
 extension_types/keyword_in_show_hide_element: FormatterCrash
@@ -88,6 +90,9 @@
 general/issue45490: FormatterCrash
 general/issue45700.crash: FormatterCrash
 general/issue47495: FormatterCrash
+general/issue47728_2: FormatterCrash
+general/issue47728_3: FormatterCrash
+general/macro_class: FormatterCrash
 general/many_errors: FormatterCrash
 general/missing_prefix_name: FormatterCrash
 general/new_as_selector: FormatterCrash
@@ -134,6 +139,7 @@
 late_lowering/override_getter_setter: FormatterCrash
 late_lowering/skip_late_final_uninitialized_instance_fields/main: FormatterCrash
 late_lowering/uninitialized_non_nullable_late_fields: FormatterCrash
+macros/macro_class: FormatterCrash
 named_arguments_anywhere/redirecting_constructor_initializers: FormatterCrash
 nnbd/abstract_field_errors: FormatterCrash
 nnbd/covariant_late_field: FormatterCrash
@@ -195,6 +201,10 @@
 regress/issue_39091_1: FormatterCrash
 regress/issue_41265.crash: Crash
 regress/issue_41265.crash: FormatterCrash
+super_parameters/simple: FormatterCrash
+super_parameters/simple_named_super_parameters: FormatterCrash
+super_parameters/simple_positional_super_parameters: FormatterCrash
+super_parameters/typed_super_parameter: FormatterCrash
 triple_shift/invalid_operator: FormatterCrash
 variance/class_type_parameter_modifier: FormatterCrash
 variance/generic_covariance_sound_variance: FormatterCrash
diff --git a/pkg/front_end/testcases/triple_shift/invalid_operator.dart.weak.modular.expect b/pkg/front_end/testcases/triple_shift/invalid_operator.dart.weak.modular.expect
new file mode 100644
index 0000000..86bba08
--- /dev/null
+++ b/pkg/front_end/testcases/triple_shift/invalid_operator.dart.weak.modular.expect
@@ -0,0 +1,90 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/triple_shift/invalid_operator.dart:6:12: Error: Operator '>>>' should have exactly one parameter.
+//   operator >>>() => true;
+//            ^^^
+//
+// pkg/front_end/testcases/triple_shift/invalid_operator.dart:10:12: Error: Operator '>>>' should have exactly one parameter.
+//   operator >>>(a, b) => true;
+//            ^^^
+//
+// pkg/front_end/testcases/triple_shift/invalid_operator.dart:14:17: Error: An operator can't have optional parameters.
+//   operator >>>([a]) => true;
+//                 ^
+//
+// pkg/front_end/testcases/triple_shift/invalid_operator.dart:18:17: Error: An operator can't have optional parameters.
+//   operator >>>({a}) => true;
+//                 ^
+//
+// pkg/front_end/testcases/triple_shift/invalid_operator.dart:22:12: Error: Operator '>>>' should have exactly one parameter.
+//   operator >>>(a, [b]) => true;
+//            ^^^
+//
+// pkg/front_end/testcases/triple_shift/invalid_operator.dart:26:12: Error: Operator '>>>' should have exactly one parameter.
+//   operator >>>(a, {b}) => true;
+//            ^^^
+//
+// pkg/front_end/testcases/triple_shift/invalid_operator.dart:30:16: Error: Types parameters aren't allowed when defining an operator.
+// Try removing the type parameters.
+//   operator >>><T>(a) => true;
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Operators1 extends core::Object {
+  synthetic constructor •() → self::Operators1
+    : super core::Object::•()
+    ;
+  operator >>>() → dynamic
+    return true;
+}
+class Operators2 extends core::Object {
+  synthetic constructor •() → self::Operators2
+    : super core::Object::•()
+    ;
+  operator >>>(dynamic a, dynamic b) → dynamic
+    return true;
+}
+class Operators3 extends core::Object {
+  synthetic constructor •() → self::Operators3
+    : super core::Object::•()
+    ;
+  operator >>>([dynamic a = #C1]) → dynamic
+    return true;
+}
+class Operators4 extends core::Object {
+  synthetic constructor •() → self::Operators4
+    : super core::Object::•()
+    ;
+  operator >>>({dynamic a = #C1}) → dynamic
+    return true;
+}
+class Operators5 extends core::Object {
+  synthetic constructor •() → self::Operators5
+    : super core::Object::•()
+    ;
+  operator >>>(dynamic a, [dynamic b = #C1]) → dynamic
+    return true;
+}
+class Operators6 extends core::Object {
+  synthetic constructor •() → self::Operators6
+    : super core::Object::•()
+    ;
+  operator >>>(dynamic a, {dynamic b = #C1}) → dynamic
+    return true;
+}
+class Operators7 extends core::Object {
+  synthetic constructor •() → self::Operators7
+    : super core::Object::•()
+    ;
+  operator >>><T extends core::Object? = dynamic>(dynamic a) → dynamic
+    return true;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.modular.expect b/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.modular.expect
new file mode 100644
index 0000000..9474a72
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/fold_initial.dart.weak.modular.expect
@@ -0,0 +1,206 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method foldInitialElements() → void {
+  dynamic element0 = 0;
+  core::num* element1 = 1;
+  core::int* element2 = 2;
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t1 = <core::int*>[element0 as{TypeError,ForDynamic} core::int*, element1 as{TypeError} core::int*, element2];
+    if(true)
+      #t1.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t1.{core::List::add}{Invariant}(6){(core::int*) →* void};
+  } =>#t1;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    #t2.{core::Set::add}{Invariant}(element0 as{TypeError,ForDynamic} core::int*){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(element1 as{TypeError} core::int*){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(element2){(core::int*) →* core::bool*};
+    if(true)
+      #t2.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+  } =>#t2;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
+}
+static method foldInitialSpread1() → void {
+  dynamic initial = <core::int*>[0, 1, 2];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t3 = <core::int*>[];
+    for (final dynamic #t4 in initial as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t5 = #t4 as{TypeError} core::int*;
+      #t3.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
+    }
+    if(true)
+      #t3.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t3.{core::List::add}{Invariant}(6){(core::int*) →* void};
+  } =>#t3;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t7 in initial as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t8 = #t7 as{TypeError} core::int*;
+      #t6.{core::Set::add}{Invariant}(#t8){(core::int*) →* core::bool*};
+    }
+    if(true)
+      #t6.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+  } =>#t6;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
+}
+static method foldInitialSpread2() → void {
+  core::Iterable<core::num*>* initial = <core::num*>[0, 1, 2];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t9 = <core::int*>[];
+    for (final dynamic #t10 in initial) {
+      final core::int* #t11 = #t10 as{TypeError} core::int*;
+      #t9.{core::List::add}{Invariant}(#t11){(core::int*) →* void};
+    }
+    if(true)
+      #t9.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t9.{core::List::add}{Invariant}(6){(core::int*) →* void};
+  } =>#t9;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t13 in initial) {
+      final core::int* #t14 = #t13 as{TypeError} core::int*;
+      #t12.{core::Set::add}{Invariant}(#t14){(core::int*) →* core::bool*};
+    }
+    if(true)
+      #t12.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t12.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+  } =>#t12;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
+}
+static method foldInitialSpread3() → void {
+  core::List<core::num*>* initial = <core::num*>[0, 1, 2];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t15 = <core::int*>[];
+    for (final dynamic #t16 in initial) {
+      final core::int* #t17 = #t16 as{TypeError} core::int*;
+      #t15.{core::List::add}{Invariant}(#t17){(core::int*) →* void};
+    }
+    if(true)
+      #t15.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t15.{core::List::add}{Invariant}(6){(core::int*) →* void};
+  } =>#t15;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t18 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t19 in initial) {
+      final core::int* #t20 = #t19 as{TypeError} core::int*;
+      #t18.{core::Set::add}{Invariant}(#t20){(core::int*) →* core::bool*};
+    }
+    if(true)
+      #t18.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t18.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+  } =>#t18;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
+}
+static method foldInitialSpread4() → void {
+  core::Iterable<core::int*>* initial = <core::int*>[0, 1, 2];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t21 = core::List::of<core::int*>(initial);
+    if(true)
+      #t21.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t21.{core::List::add}{Invariant}(6){(core::int*) →* void};
+  } =>#t21;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t22 = col::LinkedHashSet::of<core::int*>(initial);
+    if(true)
+      #t22.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t22.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+  } =>#t22;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
+}
+static method foldInitialSpread5() → void {
+  core::List<core::int*>* initial = <core::int*>[0, 1, 2];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t23 = core::List::of<core::int*>(initial);
+    if(true)
+      #t23.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t23.{core::List::add}{Invariant}(6){(core::int*) →* void};
+  } =>#t23;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t24 = col::LinkedHashSet::of<core::int*>(initial);
+    if(true)
+      #t24.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t24.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+  } =>#t24;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
+}
+static method foldInitialSpread6() → void {
+  core::List<core::int*>* initial = <core::int*>[0, 1, 2];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t25 = <core::int*>[];
+    final core::Iterable<core::int*>* #t26 = initial;
+    if(!(#t26 == null))
+      #t25.{core::List::addAll}{Invariant}(#t26){(core::Iterable<core::int*>*) →* void};
+    if(true)
+      #t25.{core::List::add}{Invariant}(3){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(4){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(5){(core::int*) →* void};
+    #t25.{core::List::add}{Invariant}(6){(core::int*) →* void};
+  } =>#t25;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), list);
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t27 = col::LinkedHashSet::•<core::int*>();
+    final core::Iterable<core::int*>* #t28 = initial;
+    if(!(#t28 == null))
+      #t27.{core::Set::addAll}{Invariant}(#t28){(core::Iterable<core::int*>*) →* void};
+    if(true)
+      #t27.{core::Set::add}{Invariant}(3){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(4){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(5){(core::int*) →* core::bool*};
+    #t27.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+  } =>#t27;
+  self::expect(core::List::generate<core::int*>(7, (core::int* i) → core::int* => i), set.{core::Iterable::toList}(){({growable: core::bool*}) →* core::List<core::int*>*});
+}
+static method main() → dynamic {
+  self::foldInitialElements();
+  self::foldInitialSpread1();
+  self::foldInitialSpread2();
+  self::foldInitialSpread3();
+  self::foldInitialSpread4();
+  self::foldInitialSpread5();
+  self::foldInitialSpread6();
+}
+static method expect(core::List<dynamic>* list1, core::List<dynamic>* list2) → void {
+  if(!(list1.{core::List::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} list2.{core::List::length}{core::int*})) {
+    throw "Unexpected length. Expected ${list1.{core::List::length}{core::int*}}, actual ${list2.{core::List::length}{core::int*}}.";
+  }
+  for (core::int* i = 0; i.{core::num::<}(list1.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    if(!(list1.{core::List::[]}(i){(core::int*) →* dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} list2.{core::List::[]}(i){(core::int*) →* dynamic})) {
+      throw "Unexpected element at index ${i}. Expected ${list1.{core::List::[]}(i){(core::int*) →* dynamic}}, actual ${list2.{core::List::[]}(i){(core::int*) →* dynamic}}.";
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/unified_collections/invariance.dart.weak.modular.expect b/pkg/front_end/testcases/unified_collections/invariance.dart.weak.modular.expect
new file mode 100644
index 0000000..78bb3e0
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/invariance.dart.weak.modular.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic {
+  core::List<core::int*>* list1 = <core::int*>[0];
+  core::List<core::num*>* list2 = <core::num*>[0];
+  dynamic list3 = <core::int*>[0];
+  core::List<core::int*>* list = block {
+    final core::List<core::int*>* #t1 = <core::int*>[0];
+    #t1.{core::List::addAll}{Invariant}(list1){(core::Iterable<core::int*>*) →* void};
+    for (final dynamic #t2 in list2) {
+      final core::int* #t3 = #t2 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t3){(core::int*) →* void};
+    }
+    for (final dynamic #t4 in list3 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t5 = #t4 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
+    }
+    if(true)
+      #t1.{core::List::add}{Invariant}(2){(core::int*) →* void};
+  } =>#t1;
+  core::Set<core::int*>* set1 = block {
+    final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
+    #t6.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
+  } =>#t6;
+  core::Set<core::num*>* set2 = block {
+    final core::Set<core::num*>* #t7 = col::LinkedHashSet::•<core::num*>();
+    #t7.{core::Set::add}{Invariant}(0){(core::num*) →* core::bool*};
+  } =>#t7;
+  dynamic set3 = block {
+    final core::Set<core::int*>* #t8 = col::LinkedHashSet::•<core::int*>();
+    #t8.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
+  } =>#t8;
+  core::Set<core::int*>* set = block {
+    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+    #t9.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
+    #t9.{core::Set::addAll}{Invariant}(set1){(core::Iterable<core::int*>*) →* void};
+    for (final dynamic #t10 in set2) {
+      final core::int* #t11 = #t10 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
+    }
+    for (final dynamic #t12 in set3 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t13 = #t12 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t13){(core::int*) →* core::bool*};
+    }
+    if(true)
+      #t9.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
+  } =>#t9;
+  core::Map<core::int*, core::String*>* map1 = <core::int*, core::String*>{0: "foo"};
+  core::Map<core::num*, core::Object*>* map2 = <core::num*, core::Object*>{0: "bar"};
+  dynamic map3 = <core::int*, core::String*>{0: "baz"};
+  core::Map<core::int*, core::String*>* map = block {
+    final core::Map<core::int*, core::String*>* #t14 = <core::int*, core::String*>{};
+    #t14.{core::Map::[]=}{Invariant}(0, "foo"){(core::int*, core::String*) →* void};
+    for (final core::MapEntry<core::int*, core::String*>* #t15 in map1.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>})
+      #t14.{core::Map::[]=}{Invariant}(#t15.{core::MapEntry::key}{core::int*}, #t15.{core::MapEntry::value}{core::String*}){(core::int*, core::String*) →* void};
+    for (final core::MapEntry<dynamic, dynamic>* #t16 in map2.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>}) {
+      final core::int* #t17 = #t16.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
+      final core::String* #t18 = #t16.{core::MapEntry::value}{dynamic} as{TypeError} core::String*;
+      #t14.{core::Map::[]=}{Invariant}(#t17, #t18){(core::int*, core::String*) →* void};
+    }
+    for (final core::MapEntry<dynamic, dynamic>* #t19 in (map3 as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::String*>>}) {
+      final core::int* #t20 = #t19.{core::MapEntry::key}{dynamic} as{TypeError} core::int*;
+      final core::String* #t21 = #t19.{core::MapEntry::value}{dynamic} as{TypeError} core::String*;
+      #t14.{core::Map::[]=}{Invariant}(#t20, #t21){(core::int*, core::String*) →* void};
+    }
+    if(true)
+      #t14.{core::Map::[]=}{Invariant}(2, "baz"){(core::int*, core::String*) →* void};
+  } =>#t14;
+}
diff --git a/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.modular.expect b/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.modular.expect
new file mode 100644
index 0000000..253e487
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/list_add_all.dart.weak.modular.expect
@@ -0,0 +1,155 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method useAddAll() → void {
+  dynamic dynamicList1 = <core::int*>[0, 1, 2];
+  dynamic dynamicList2 = <core::num*>[3, 4, 5];
+  core::Iterable<core::int*>* iterableIntList = <core::int*>[6, 7, 8];
+  core::Iterable<core::num*>* iterableNumList1 = <core::int*>[9, 10, 11];
+  core::Iterable<core::num*>* iterableNumList2 = <core::num*>[12, 13, 14];
+  core::List<core::int*>* intList = <core::int*>[15, 16, 17];
+  core::List<core::num*>* numList1 = <core::int*>[18, 19, 20];
+  core::List<core::num*>* numList2 = <core::num*>[21, 22, 23];
+  core::List<core::int*>* list1 = block {
+    final core::List<core::int*>* #t1 = <core::int*>[];
+    for (final dynamic #t2 in dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t3 = #t2 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t3){(core::int*) →* void};
+    }
+    for (final dynamic #t4 in dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t5 = #t4 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t5){(core::int*) →* void};
+    }
+    #t1.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::int*>*) →* void};
+    for (final dynamic #t6 in iterableNumList1) {
+      final core::int* #t7 = #t6 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t7){(core::int*) →* void};
+    }
+    for (final dynamic #t8 in iterableNumList2) {
+      final core::int* #t9 = #t8 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t9){(core::int*) →* void};
+    }
+    #t1.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::int*>*) →* void};
+    for (final dynamic #t10 in numList1) {
+      final core::int* #t11 = #t10 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t11){(core::int*) →* void};
+    }
+    for (final dynamic #t12 in numList2) {
+      final core::int* #t13 = #t12 as{TypeError} core::int*;
+      #t1.{core::List::add}{Invariant}(#t13){(core::int*) →* void};
+    }
+  } =>#t1;
+  self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i), list1);
+  core::List<core::num*>* list2 = block {
+    final core::List<core::num*>* #t14 = <core::num*>[];
+    for (final dynamic #t15 in dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::num* #t16 = #t15 as{TypeError} core::num*;
+      #t14.{core::List::add}{Invariant}(#t16){(core::num*) →* void};
+    }
+    for (final dynamic #t17 in dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::num* #t18 = #t17 as{TypeError} core::num*;
+      #t14.{core::List::add}{Invariant}(#t18){(core::num*) →* void};
+    }
+    #t14.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(iterableNumList1){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(iterableNumList2){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(numList1){(core::Iterable<core::num*>*) →* void};
+    #t14.{core::List::addAll}{Invariant}(numList2){(core::Iterable<core::num*>*) →* void};
+  } =>#t14;
+  self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i), list2);
+  core::List<core::int*>* list3 = block {
+    final core::List<core::int*>* #t19 = <core::int*>[];
+    final core::Iterable<dynamic>* #t20 = dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t20 == null))
+      for (final dynamic #t21 in #t20) {
+        final core::int* #t22 = #t21 as{TypeError} core::int*;
+        #t19.{core::List::add}{Invariant}(#t22){(core::int*) →* void};
+      }
+    final core::Iterable<dynamic>* #t23 = dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t23 == null))
+      for (final dynamic #t24 in #t23) {
+        final core::int* #t25 = #t24 as{TypeError} core::int*;
+        #t19.{core::List::add}{Invariant}(#t25){(core::int*) →* void};
+      }
+    final core::Iterable<core::int*>* #t26 = iterableIntList;
+    if(!(#t26 == null))
+      #t19.{core::List::addAll}{Invariant}(#t26){(core::Iterable<core::int*>*) →* void};
+    final core::Iterable<dynamic>* #t27 = iterableNumList1;
+    if(!(#t27 == null))
+      for (final dynamic #t28 in #t27) {
+        final core::int* #t29 = #t28 as{TypeError} core::int*;
+        #t19.{core::List::add}{Invariant}(#t29){(core::int*) →* void};
+      }
+    final core::Iterable<dynamic>* #t30 = iterableNumList2;
+    if(!(#t30 == null))
+      for (final dynamic #t31 in #t30) {
+        final core::int* #t32 = #t31 as{TypeError} core::int*;
+        #t19.{core::List::add}{Invariant}(#t32){(core::int*) →* void};
+      }
+    final core::Iterable<core::int*>* #t33 = intList;
+    if(!(#t33 == null))
+      #t19.{core::List::addAll}{Invariant}(#t33){(core::Iterable<core::int*>*) →* void};
+    final core::Iterable<dynamic>* #t34 = numList1;
+    if(!(#t34 == null))
+      for (final dynamic #t35 in #t34) {
+        final core::int* #t36 = #t35 as{TypeError} core::int*;
+        #t19.{core::List::add}{Invariant}(#t36){(core::int*) →* void};
+      }
+    final core::Iterable<dynamic>* #t37 = numList2;
+    if(!(#t37 == null))
+      for (final dynamic #t38 in #t37) {
+        final core::int* #t39 = #t38 as{TypeError} core::int*;
+        #t19.{core::List::add}{Invariant}(#t39){(core::int*) →* void};
+      }
+  } =>#t19;
+  self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i), list3);
+  core::List<core::num*>* list4 = block {
+    final core::List<core::num*>* #t40 = <core::num*>[];
+    final core::Iterable<dynamic>* #t41 = dynamicList1 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t41 == null))
+      for (final dynamic #t42 in #t41) {
+        final core::num* #t43 = #t42 as{TypeError} core::num*;
+        #t40.{core::List::add}{Invariant}(#t43){(core::num*) →* void};
+      }
+    final core::Iterable<dynamic>* #t44 = dynamicList2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t44 == null))
+      for (final dynamic #t45 in #t44) {
+        final core::num* #t46 = #t45 as{TypeError} core::num*;
+        #t40.{core::List::add}{Invariant}(#t46){(core::num*) →* void};
+      }
+    final core::Iterable<core::num*>* #t47 = iterableIntList;
+    if(!(#t47 == null))
+      #t40.{core::List::addAll}{Invariant}(#t47){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t48 = iterableNumList1;
+    if(!(#t48 == null))
+      #t40.{core::List::addAll}{Invariant}(#t48){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t49 = iterableNumList2;
+    if(!(#t49 == null))
+      #t40.{core::List::addAll}{Invariant}(#t49){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t50 = intList;
+    if(!(#t50 == null))
+      #t40.{core::List::addAll}{Invariant}(#t50){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t51 = numList1;
+    if(!(#t51 == null))
+      #t40.{core::List::addAll}{Invariant}(#t51){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t52 = numList2;
+    if(!(#t52 == null))
+      #t40.{core::List::addAll}{Invariant}(#t52){(core::Iterable<core::num*>*) →* void};
+  } =>#t40;
+  self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i), list4);
+}
+static method main() → dynamic {
+  self::useAddAll();
+}
+static method expect(core::List<dynamic>* list1, core::List<dynamic>* list2) → void {
+  if(!(list1.{core::List::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} list2.{core::List::length}{core::int*})) {
+    throw "Unexpected length. Expected ${list1.{core::List::length}{core::int*}}, actual ${list2.{core::List::length}{core::int*}}.";
+  }
+  for (core::int* i = 0; i.{core::num::<}(list1.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*}) {
+    if(!(list1.{core::List::[]}(i){(core::int*) →* dynamic} =={core::Object::==}{(core::Object*) →* core::bool*} list2.{core::List::[]}(i){(core::int*) →* dynamic})) {
+      throw "Unexpected element at index ${i}. Expected ${list1.{core::List::[]}(i){(core::int*) →* dynamic}}, actual ${list2.{core::List::[]}(i){(core::int*) →* dynamic}}.";
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.modular.expect b/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.modular.expect
new file mode 100644
index 0000000..c6f63bf
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/list_add_all_nnbd.dart.weak.modular.expect
@@ -0,0 +1,124 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method useAddAll() → void {
+  dynamic dynamicList1 = <core::int>[0, 1, 2];
+  dynamic dynamicList2 = <core::num>[3, 4, 5];
+  dynamic dynamicList3 = <core::int?>[6, 7, 8];
+  core::Iterable<core::int> iterableIntList = <core::int>[9, 10, 11];
+  core::List<core::int> intList = <core::int>[12, 13, 14];
+  core::List<core::int> list1 = block {
+    final core::List<core::int> #t1 = <core::int>[];
+    for (final dynamic #t2 in dynamicList1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::int #t3 = #t2 as{TypeError,ForNonNullableByDefault} core::int;
+      #t1.{core::List::add}{Invariant}(#t3){(core::int) → void};
+    }
+    for (final dynamic #t4 in dynamicList2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::int #t5 = #t4 as{TypeError,ForNonNullableByDefault} core::int;
+      #t1.{core::List::add}{Invariant}(#t5){(core::int) → void};
+    }
+    for (final dynamic #t6 in dynamicList3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::int #t7 = #t6 as{TypeError,ForNonNullableByDefault} core::int;
+      #t1.{core::List::add}{Invariant}(#t7){(core::int) → void};
+    }
+    #t1.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::int>) → void};
+    #t1.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::int>) → void};
+  } =>#t1;
+  self::expect(core::List::generate<core::int>(15, (core::int i) → core::int => i), list1);
+  core::List<core::num> list2 = block {
+    final core::List<core::num> #t8 = <core::num>[];
+    for (final dynamic #t9 in dynamicList1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::num #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::num;
+      #t8.{core::List::add}{Invariant}(#t10){(core::num) → void};
+    }
+    for (final dynamic #t11 in dynamicList2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::num #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::num;
+      #t8.{core::List::add}{Invariant}(#t12){(core::num) → void};
+    }
+    for (final dynamic #t13 in dynamicList3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::num #t14 = #t13 as{TypeError,ForNonNullableByDefault} core::num;
+      #t8.{core::List::add}{Invariant}(#t14){(core::num) → void};
+    }
+    #t8.{core::List::addAll}{Invariant}(iterableIntList){(core::Iterable<core::num>) → void};
+    #t8.{core::List::addAll}{Invariant}(intList){(core::Iterable<core::num>) → void};
+  } =>#t8;
+  self::expect(core::List::generate<core::num>(15, (core::int i) → core::int => i), list2);
+}
+static method useAddAllNullable() → void {
+  dynamic dynamicList1 = <core::int>[0, 1, 2];
+  dynamic dynamicList2 = <core::num>[3, 4, 5];
+  dynamic dynamicList3 = <core::int?>[6, 7, 8];
+  core::Iterable<core::int>? iterableIntList = true ?{core::List<core::int>?} <core::int>[9, 10, 11] : null;
+  core::List<core::int>? intList = true ?{core::List<core::int>?} <core::int>[12, 13, 14] : null;
+  core::List<core::int> list1 = block {
+    final core::List<core::int> #t15 = <core::int>[];
+    final core::Iterable<dynamic>? #t16 = dynamicList1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t16 == null))
+      for (final dynamic #t17 in #t16{core::Iterable<dynamic>}) {
+        final core::int #t18 = #t17 as{TypeError,ForNonNullableByDefault} core::int;
+        #t15.{core::List::add}{Invariant}(#t18){(core::int) → void};
+      }
+    final core::Iterable<dynamic>? #t19 = dynamicList2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t19 == null))
+      for (final dynamic #t20 in #t19{core::Iterable<dynamic>}) {
+        final core::int #t21 = #t20 as{TypeError,ForNonNullableByDefault} core::int;
+        #t15.{core::List::add}{Invariant}(#t21){(core::int) → void};
+      }
+    final core::Iterable<dynamic>? #t22 = dynamicList3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t22 == null))
+      for (final dynamic #t23 in #t22{core::Iterable<dynamic>}) {
+        final core::int #t24 = #t23 as{TypeError,ForNonNullableByDefault} core::int;
+        #t15.{core::List::add}{Invariant}(#t24){(core::int) → void};
+      }
+    final core::Iterable<core::int>? #t25 = iterableIntList;
+    if(!(#t25 == null))
+      #t15.{core::List::addAll}{Invariant}(#t25{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    final core::Iterable<core::int>? #t26 = intList;
+    if(!(#t26 == null))
+      #t15.{core::List::addAll}{Invariant}(#t26{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+  } =>#t15;
+  self::expect(core::List::generate<core::int>(15, (core::int i) → core::int => i), list1);
+  core::List<core::num> list2 = block {
+    final core::List<core::num> #t27 = <core::num>[];
+    final core::Iterable<dynamic>? #t28 = dynamicList1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t28 == null))
+      for (final dynamic #t29 in #t28{core::Iterable<dynamic>}) {
+        final core::num #t30 = #t29 as{TypeError,ForNonNullableByDefault} core::num;
+        #t27.{core::List::add}{Invariant}(#t30){(core::num) → void};
+      }
+    final core::Iterable<dynamic>? #t31 = dynamicList2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t31 == null))
+      for (final dynamic #t32 in #t31{core::Iterable<dynamic>}) {
+        final core::num #t33 = #t32 as{TypeError,ForNonNullableByDefault} core::num;
+        #t27.{core::List::add}{Invariant}(#t33){(core::num) → void};
+      }
+    final core::Iterable<dynamic>? #t34 = dynamicList3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t34 == null))
+      for (final dynamic #t35 in #t34{core::Iterable<dynamic>}) {
+        final core::num #t36 = #t35 as{TypeError,ForNonNullableByDefault} core::num;
+        #t27.{core::List::add}{Invariant}(#t36){(core::num) → void};
+      }
+    final core::Iterable<core::num>? #t37 = iterableIntList;
+    if(!(#t37 == null))
+      #t27.{core::List::addAll}{Invariant}(#t37{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+    final core::Iterable<core::num>? #t38 = intList;
+    if(!(#t38 == null))
+      #t27.{core::List::addAll}{Invariant}(#t38{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+  } =>#t27;
+  self::expect(core::List::generate<core::num>(15, (core::int i) → core::int => i), list2);
+}
+static method main() → dynamic {
+  self::useAddAll();
+  self::useAddAllNullable();
+}
+static method expect(core::List<dynamic> list1, core::List<dynamic> list2) → void {
+  if(!(list1.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} list2.{core::List::length}{core::int})) {
+    throw "Unexpected length. Expected ${list1.{core::List::length}{core::int}}, actual ${list2.{core::List::length}{core::int}}.";
+  }
+  for (core::int i = 0; i.{core::num::<}(list1.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    if(!(list1.{core::List::[]}(i){(core::int) → dynamic} =={core::Object::==}{(core::Object) → core::bool} list2.{core::List::[]}(i){(core::int) → dynamic})) {
+      throw "Unexpected element at index ${i}. Expected ${list1.{core::List::[]}(i){(core::int) → dynamic}}, actual ${list2.{core::List::[]}(i){(core::int) → dynamic}}.";
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.modular.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.modular.expect
new file mode 100644
index 0000000..2ccee62
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.weak.modular.expect
@@ -0,0 +1,176 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error4 = {if (b) 0: 1 else for (var a in list) a};
+//                                ^
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:36:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error5 = {if (b) for (var a in list) a else 0: 1};
+//                      ^
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
+//                                ^
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:44:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
+//                      ^
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:37:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error6 = {
+//              ^
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:40:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error7 = {
+//              ^
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:45:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error10 = {
+//               ^
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:48:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error11 = {
+//               ^
+//
+// pkg/front_end/testcases/unified_collections/mixed_entries.dart:51:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+// var error12 = {
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* b = false;
+static field core::List<dynamic>* list = <dynamic>[];
+static field core::Map<dynamic, dynamic>* map0 = <dynamic, dynamic>{};
+static field core::Map<dynamic, dynamic>* map1 = block {
+  final core::Map<dynamic, dynamic>* #t1 = <dynamic, dynamic>{};
+  if(self::b)
+    #t1.{core::Map::[]=}{Invariant}(0, 1){(dynamic, dynamic) →* void};
+  else
+    for (final core::MapEntry<dynamic, dynamic>* #t2 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t1.{core::Map::[]=}{Invariant}(#t2.{core::MapEntry::key}{dynamic}, #t2.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+} =>#t1;
+static field core::Map<dynamic, dynamic>* map2 = block {
+  final core::Map<dynamic, dynamic>* #t3 = <dynamic, dynamic>{};
+  if(self::b)
+    for (final core::MapEntry<dynamic, dynamic>* #t4 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t3.{core::Map::[]=}{Invariant}(#t4.{core::MapEntry::key}{dynamic}, #t4.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+  else
+    #t3.{core::Map::[]=}{Invariant}(0, 1){(dynamic, dynamic) →* void};
+} =>#t3;
+static field core::Map<dynamic, dynamic>* map3 = block {
+  final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
+  if(self::b)
+    for (final core::MapEntry<dynamic, dynamic>* #t6 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t5.{core::Map::[]=}{Invariant}(#t6.{core::MapEntry::key}{dynamic}, #t6.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+  else
+    for (final core::MapEntry<dynamic, dynamic>* #t7 in self::map0.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, dynamic>>})
+      #t5.{core::Map::[]=}{Invariant}(#t7.{core::MapEntry::key}{dynamic}, #t7.{core::MapEntry::value}{dynamic}){(dynamic, dynamic) →* void};
+} =>#t5;
+static field core::Map<dynamic, core::int*>* map4 = block {
+  final core::Map<dynamic, core::int*>* #t8 = <dynamic, core::int*>{};
+  if(self::b)
+    #t8.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
+  else
+    for (dynamic a in self::list)
+      #t8.{core::Map::[]=}{Invariant}(a, 1){(dynamic, core::int*) →* void};
+} =>#t8;
+static field core::Map<dynamic, core::int*>* map5 = block {
+  final core::Map<dynamic, core::int*>* #t9 = <dynamic, core::int*>{};
+  if(self::b)
+    for (dynamic a in self::list)
+      #t9.{core::Map::[]=}{Invariant}(a, 1){(dynamic, core::int*) →* void};
+  else
+    #t9.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
+} =>#t9;
+static field core::Map<dynamic, core::int*>* map6 = block {
+  final core::Map<dynamic, core::int*>* #t10 = <dynamic, core::int*>{};
+  if(self::b)
+    #t10.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
+  else
+    for (dynamic a in self::list)
+      for (final core::MapEntry<dynamic, core::int*>* #t11 in <dynamic, core::int*>{a: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>})
+        #t10.{core::Map::[]=}{Invariant}(#t11.{core::MapEntry::key}{dynamic}, #t11.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+} =>#t10;
+static field core::Map<dynamic, core::int*>* map7 = block {
+  final core::Map<dynamic, core::int*>* #t12 = <dynamic, core::int*>{};
+  if(self::b)
+    for (dynamic a in self::list)
+      for (final core::MapEntry<dynamic, core::int*>* #t13 in <dynamic, core::int*>{a: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>})
+        #t12.{core::Map::[]=}{Invariant}(#t13.{core::MapEntry::key}{dynamic}, #t13.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+  else
+    #t12.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
+} =>#t12;
+static field core::Map<dynamic, core::int*>* map8 = block {
+  final core::Map<dynamic, core::int*>* #t14 = <dynamic, core::int*>{};
+  if(self::b)
+    #t14.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
+  else
+    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t14.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
+} =>#t14;
+static field core::Map<dynamic, core::int*>* map9 = block {
+  final core::Map<dynamic, core::int*>* #t15 = <dynamic, core::int*>{};
+  if(self::b)
+    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      #t15.{core::Map::[]=}{Invariant}(self::list.{core::List::[]}(i){(core::int*) →* dynamic}, 1){(dynamic, core::int*) →* void};
+  else
+    #t15.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
+} =>#t15;
+static field core::Map<dynamic, core::int*>* map10 = block {
+  final core::Map<dynamic, core::int*>* #t16 = <dynamic, core::int*>{};
+  if(self::b)
+    #t16.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
+  else
+    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<dynamic, core::int*>* #t17 in <dynamic, core::int*>{self::list.{core::List::[]}(i){(core::int*) →* dynamic}: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>})
+        #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}{dynamic}, #t17.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+} =>#t16;
+static field core::Map<dynamic, core::int*>* map11 = block {
+  final core::Map<dynamic, core::int*>* #t18 = <dynamic, core::int*>{};
+  if(self::b)
+    for (core::int* i = 0; i.{core::num::<}(self::list.{core::List::length}{core::int*}){(core::num*) →* core::bool*}; i = i.{core::num::+}(1){(core::num*) →* core::int*})
+      for (final core::MapEntry<dynamic, core::int*>* #t19 in <dynamic, core::int*>{self::list.{core::List::[]}(i){(core::int*) →* dynamic}: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<dynamic, core::int*>>})
+        #t18.{core::Map::[]=}{Invariant}(#t19.{core::MapEntry::key}{dynamic}, #t19.{core::MapEntry::value}{core::int*}){(dynamic, core::int*) →* void};
+  else
+    #t18.{core::Map::[]=}{Invariant}(0, 1){(dynamic, core::int*) →* void};
+} =>#t18;
+static field core::Map<core::int*, core::int*>* map12 = block {
+  final core::Map<core::int*, core::int*>* #t20 = <core::int*, core::int*>{};
+  if(self::b)
+    #t20.{core::Map::[]=}{Invariant}(0, 1){(core::int*, core::int*) →* void};
+  else
+    if(self::b)
+      for (final core::MapEntry<core::int*, core::int*>* #t21 in <core::int*, core::int*>{0: 1}.{core::Map::entries}{core::Iterable<core::MapEntry<core::int*, core::int*>>})
+        #t20.{core::Map::[]=}{Invariant}(#t21.{core::MapEntry::key}{core::int*}, #t21.{core::MapEntry::value}{core::int*}){(core::int*, core::int*) →* void};
+} =>#t20;
+static field core::Map<invalid-type, Null>* error4 = <invalid-type, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error4 = {if (b) 0: 1 else for (var a in list) a};
+                               ^": null};
+static field core::Map<invalid-type, Null>* error5 = <invalid-type, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:36:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error5 = {if (b) for (var a in list) a else 0: 1};
+                     ^": null};
+static field Null error6 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:37:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error6 = {
+             ^";
+static field Null error7 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:40:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error7 = {
+             ^";
+static field core::Map<invalid-type, Null>* error8 = <invalid-type, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
+                               ^": null};
+static field core::Map<invalid-type, Null>* error9 = <invalid-type, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:44:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
+                     ^": null};
+static field Null error10 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:45:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error10 = {
+              ^";
+static field Null error11 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:48:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error11 = {
+              ^";
+static field Null error12 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:51:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+var error12 = {
+              ^";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.modular.expect b/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.modular.expect
new file mode 100644
index 0000000..5fe44fb
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/set_add_all.dart.weak.modular.expect
@@ -0,0 +1,197 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "dart:_internal" as _in;
+
+static method useAddAll() → void {
+  dynamic dynamicSet1 = block {
+    final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+    #t1.{core::Set::add}{Invariant}(0){(core::int*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(1){(core::int*) →* core::bool*};
+    #t1.{core::Set::add}{Invariant}(2){(core::int*) →* core::bool*};
+  } =>#t1;
+  dynamic dynamicSet2 = block {
+    final core::Set<core::num*>* #t2 = col::LinkedHashSet::•<core::num*>();
+    #t2.{core::Set::add}{Invariant}(3){(core::num*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(4){(core::num*) →* core::bool*};
+    #t2.{core::Set::add}{Invariant}(5){(core::num*) →* core::bool*};
+  } =>#t2;
+  core::Iterable<core::int*>* iterableIntSet = block {
+    final core::Set<core::int*>* #t3 = col::LinkedHashSet::•<core::int*>();
+    #t3.{core::Set::add}{Invariant}(6){(core::int*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(7){(core::int*) →* core::bool*};
+    #t3.{core::Set::add}{Invariant}(8){(core::int*) →* core::bool*};
+  } =>#t3;
+  core::Iterable<core::num*>* iterableNumSet1 = block {
+    final core::Set<core::int*>* #t4 = col::LinkedHashSet::•<core::int*>();
+    #t4.{core::Set::add}{Invariant}(9){(core::int*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(10){(core::int*) →* core::bool*};
+    #t4.{core::Set::add}{Invariant}(11){(core::int*) →* core::bool*};
+  } =>#t4;
+  core::Iterable<core::num*>* iterableNumSet2 = block {
+    final core::Set<core::num*>* #t5 = col::LinkedHashSet::•<core::num*>();
+    #t5.{core::Set::add}{Invariant}(12){(core::num*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(13){(core::num*) →* core::bool*};
+    #t5.{core::Set::add}{Invariant}(14){(core::num*) →* core::bool*};
+  } =>#t5;
+  core::Set<core::int*>* intSet = block {
+    final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>();
+    #t6.{core::Set::add}{Invariant}(15){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(16){(core::int*) →* core::bool*};
+    #t6.{core::Set::add}{Invariant}(17){(core::int*) →* core::bool*};
+  } =>#t6;
+  core::Set<core::num*>* numSet1 = block {
+    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
+    #t7.{core::Set::add}{Invariant}(18){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(19){(core::int*) →* core::bool*};
+    #t7.{core::Set::add}{Invariant}(20){(core::int*) →* core::bool*};
+  } =>#t7;
+  core::Set<core::num*>* numSet2 = block {
+    final core::Set<core::num*>* #t8 = col::LinkedHashSet::•<core::num*>();
+    #t8.{core::Set::add}{Invariant}(21){(core::num*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(22){(core::num*) →* core::bool*};
+    #t8.{core::Set::add}{Invariant}(23){(core::num*) →* core::bool*};
+  } =>#t8;
+  core::Set<core::int*>* set1 = block {
+    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t10 in dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t11 = #t10 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t11){(core::int*) →* core::bool*};
+    }
+    for (final dynamic #t12 in dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::int* #t13 = #t12 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t13){(core::int*) →* core::bool*};
+    }
+    #t9.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::int*>*) →* void};
+    for (final dynamic #t14 in iterableNumSet1) {
+      final core::int* #t15 = #t14 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t15){(core::int*) →* core::bool*};
+    }
+    for (final dynamic #t16 in iterableNumSet2) {
+      final core::int* #t17 = #t16 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t17){(core::int*) →* core::bool*};
+    }
+    #t9.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::int*>*) →* void};
+    for (final dynamic #t18 in numSet1) {
+      final core::int* #t19 = #t18 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t19){(core::int*) →* core::bool*};
+    }
+    for (final dynamic #t20 in numSet2) {
+      final core::int* #t21 = #t20 as{TypeError} core::int*;
+      #t9.{core::Set::add}{Invariant}(#t21){(core::int*) →* core::bool*};
+    }
+  } =>#t9;
+  self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::int*>*}, set1);
+  core::Set<core::num*>* set2 = block {
+    final core::Set<core::num*>* #t22 = col::LinkedHashSet::•<core::num*>();
+    for (final dynamic #t23 in dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::num* #t24 = #t23 as{TypeError} core::num*;
+      #t22.{core::Set::add}{Invariant}(#t24){(core::num*) →* core::bool*};
+    }
+    for (final dynamic #t25 in dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
+      final core::num* #t26 = #t25 as{TypeError} core::num*;
+      #t22.{core::Set::add}{Invariant}(#t26){(core::num*) →* core::bool*};
+    }
+    #t22.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(iterableNumSet1){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(iterableNumSet2){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(numSet1){(core::Iterable<core::num*>*) →* void};
+    #t22.{core::Set::addAll}{Invariant}(numSet2){(core::Iterable<core::num*>*) →* void};
+  } =>#t22;
+  self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::num*>*}, set2);
+  core::Set<core::int*>* set3 = block {
+    final core::Set<core::int*>* #t27 = col::LinkedHashSet::•<core::int*>();
+    final core::Iterable<dynamic>* #t28 = dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t28 == null))
+      for (final dynamic #t29 in #t28) {
+        final core::int* #t30 = #t29 as{TypeError} core::int*;
+        #t27.{core::Set::add}{Invariant}(#t30){(core::int*) →* core::bool*};
+      }
+    final core::Iterable<dynamic>* #t31 = dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t31 == null))
+      for (final dynamic #t32 in #t31) {
+        final core::int* #t33 = #t32 as{TypeError} core::int*;
+        #t27.{core::Set::add}{Invariant}(#t33){(core::int*) →* core::bool*};
+      }
+    final core::Iterable<core::int*>* #t34 = iterableIntSet;
+    if(!(#t34 == null))
+      #t27.{core::Set::addAll}{Invariant}(#t34){(core::Iterable<core::int*>*) →* void};
+    final core::Iterable<dynamic>* #t35 = iterableNumSet1;
+    if(!(#t35 == null))
+      for (final dynamic #t36 in #t35) {
+        final core::int* #t37 = #t36 as{TypeError} core::int*;
+        #t27.{core::Set::add}{Invariant}(#t37){(core::int*) →* core::bool*};
+      }
+    final core::Iterable<dynamic>* #t38 = iterableNumSet2;
+    if(!(#t38 == null))
+      for (final dynamic #t39 in #t38) {
+        final core::int* #t40 = #t39 as{TypeError} core::int*;
+        #t27.{core::Set::add}{Invariant}(#t40){(core::int*) →* core::bool*};
+      }
+    final core::Iterable<core::int*>* #t41 = intSet;
+    if(!(#t41 == null))
+      #t27.{core::Set::addAll}{Invariant}(#t41){(core::Iterable<core::int*>*) →* void};
+    final core::Iterable<dynamic>* #t42 = numSet1;
+    if(!(#t42 == null))
+      for (final dynamic #t43 in #t42) {
+        final core::int* #t44 = #t43 as{TypeError} core::int*;
+        #t27.{core::Set::add}{Invariant}(#t44){(core::int*) →* core::bool*};
+      }
+    final core::Iterable<dynamic>* #t45 = numSet2;
+    if(!(#t45 == null))
+      for (final dynamic #t46 in #t45) {
+        final core::int* #t47 = #t46 as{TypeError} core::int*;
+        #t27.{core::Set::add}{Invariant}(#t47){(core::int*) →* core::bool*};
+      }
+  } =>#t27;
+  self::expect(core::List::generate<core::int*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::int*>*}, set3);
+  core::Set<core::num*>* set4 = block {
+    final core::Set<core::num*>* #t48 = col::LinkedHashSet::•<core::num*>();
+    final core::Iterable<dynamic>* #t49 = dynamicSet1 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t49 == null))
+      for (final dynamic #t50 in #t49) {
+        final core::num* #t51 = #t50 as{TypeError} core::num*;
+        #t48.{core::Set::add}{Invariant}(#t51){(core::num*) →* core::bool*};
+      }
+    final core::Iterable<dynamic>* #t52 = dynamicSet2 as{TypeError,ForDynamic} core::Iterable<dynamic>*;
+    if(!(#t52 == null))
+      for (final dynamic #t53 in #t52) {
+        final core::num* #t54 = #t53 as{TypeError} core::num*;
+        #t48.{core::Set::add}{Invariant}(#t54){(core::num*) →* core::bool*};
+      }
+    final core::Iterable<core::num*>* #t55 = iterableIntSet;
+    if(!(#t55 == null))
+      #t48.{core::Set::addAll}{Invariant}(#t55){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t56 = iterableNumSet1;
+    if(!(#t56 == null))
+      #t48.{core::Set::addAll}{Invariant}(#t56){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t57 = iterableNumSet2;
+    if(!(#t57 == null))
+      #t48.{core::Set::addAll}{Invariant}(#t57){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t58 = intSet;
+    if(!(#t58 == null))
+      #t48.{core::Set::addAll}{Invariant}(#t58){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t59 = numSet1;
+    if(!(#t59 == null))
+      #t48.{core::Set::addAll}{Invariant}(#t59){(core::Iterable<core::num*>*) →* void};
+    final core::Iterable<core::num*>* #t60 = numSet2;
+    if(!(#t60 == null))
+      #t48.{core::Set::addAll}{Invariant}(#t60){(core::Iterable<core::num*>*) →* void};
+  } =>#t48;
+  self::expect(core::List::generate<core::num*>(24, (core::int* i) → core::int* => i).{core::Iterable::toSet}(){() →* core::Set<core::num*>*}, set4);
+}
+static method main() → dynamic {
+  self::useAddAll();
+}
+static method expect(core::Set<dynamic>* set1, core::Set<dynamic>* set2) → void {
+  if(!(set1.{_in::EfficientLengthIterable::length}{core::int*} =={core::num::==}{(core::Object*) →* core::bool*} set2.{_in::EfficientLengthIterable::length}{core::int*})) {
+    throw "Unexpected length. Expected ${set1.{_in::EfficientLengthIterable::length}{core::int*}}, actual ${set2.{_in::EfficientLengthIterable::length}{core::int*}}.";
+  }
+  for (dynamic element in set1) {
+    if(!set2.{core::Set::contains}(element){(core::Object*) →* core::bool*}) {
+      throw "Element ${element} not found. Expected ${set1}, actual ${set2}.";
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.modular.expect b/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.modular.expect
new file mode 100644
index 0000000..4037509
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/set_add_all_nnbd.dart.weak.modular.expect
@@ -0,0 +1,176 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "dart:_internal" as _in;
+
+static method useAddAll() → void {
+  dynamic dynamicSet1 = block {
+    final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>();
+    #t1.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
+    #t1.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t1.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
+  } =>#t1;
+  dynamic dynamicSet2 = block {
+    final core::Set<core::num> #t2 = col::LinkedHashSet::•<core::num>();
+    #t2.{core::Set::add}{Invariant}(3){(core::num) → core::bool};
+    #t2.{core::Set::add}{Invariant}(4){(core::num) → core::bool};
+    #t2.{core::Set::add}{Invariant}(5){(core::num) → core::bool};
+  } =>#t2;
+  dynamic dynamicSet3 = block {
+    final core::Set<core::int?> #t3 = col::LinkedHashSet::•<core::int?>();
+    #t3.{core::Set::add}{Invariant}(6){(core::int?) → core::bool};
+    #t3.{core::Set::add}{Invariant}(7){(core::int?) → core::bool};
+    #t3.{core::Set::add}{Invariant}(8){(core::int?) → core::bool};
+  } =>#t3;
+  core::Iterable<core::int> iterableIntSet = block {
+    final core::Set<core::int> #t4 = col::LinkedHashSet::•<core::int>();
+    #t4.{core::Set::add}{Invariant}(9){(core::int) → core::bool};
+    #t4.{core::Set::add}{Invariant}(10){(core::int) → core::bool};
+    #t4.{core::Set::add}{Invariant}(11){(core::int) → core::bool};
+  } =>#t4;
+  core::Set<core::int> intSet = block {
+    final core::Set<core::int> #t5 = col::LinkedHashSet::•<core::int>();
+    #t5.{core::Set::add}{Invariant}(12){(core::int) → core::bool};
+    #t5.{core::Set::add}{Invariant}(13){(core::int) → core::bool};
+    #t5.{core::Set::add}{Invariant}(14){(core::int) → core::bool};
+  } =>#t5;
+  core::Set<core::int> set1 = block {
+    final core::Set<core::int> #t6 = col::LinkedHashSet::•<core::int>();
+    for (final dynamic #t7 in dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::int #t8 = #t7 as{TypeError,ForNonNullableByDefault} core::int;
+      #t6.{core::Set::add}{Invariant}(#t8){(core::int) → core::bool};
+    }
+    for (final dynamic #t9 in dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::int #t10 = #t9 as{TypeError,ForNonNullableByDefault} core::int;
+      #t6.{core::Set::add}{Invariant}(#t10){(core::int) → core::bool};
+    }
+    for (final dynamic #t11 in dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::int #t12 = #t11 as{TypeError,ForNonNullableByDefault} core::int;
+      #t6.{core::Set::add}{Invariant}(#t12){(core::int) → core::bool};
+    }
+    #t6.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::int>) → void};
+    #t6.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::int>) → void};
+  } =>#t6;
+  self::expect(core::List::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
+  core::Set<core::num> set2 = block {
+    final core::Set<core::num> #t13 = col::LinkedHashSet::•<core::num>();
+    for (final dynamic #t14 in dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::num #t15 = #t14 as{TypeError,ForNonNullableByDefault} core::num;
+      #t13.{core::Set::add}{Invariant}(#t15){(core::num) → core::bool};
+    }
+    for (final dynamic #t16 in dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::num #t17 = #t16 as{TypeError,ForNonNullableByDefault} core::num;
+      #t13.{core::Set::add}{Invariant}(#t17){(core::num) → core::bool};
+    }
+    for (final dynamic #t18 in dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
+      final core::num #t19 = #t18 as{TypeError,ForNonNullableByDefault} core::num;
+      #t13.{core::Set::add}{Invariant}(#t19){(core::num) → core::bool};
+    }
+    #t13.{core::Set::addAll}{Invariant}(iterableIntSet){(core::Iterable<core::num>) → void};
+    #t13.{core::Set::addAll}{Invariant}(intSet){(core::Iterable<core::num>) → void};
+  } =>#t13;
+  self::expect(core::List::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
+}
+static method useAddAllNullable() → void {
+  dynamic dynamicSet1 = block {
+    final core::Set<core::int> #t20 = col::LinkedHashSet::•<core::int>();
+    #t20.{core::Set::add}{Invariant}(0){(core::int) → core::bool};
+    #t20.{core::Set::add}{Invariant}(1){(core::int) → core::bool};
+    #t20.{core::Set::add}{Invariant}(2){(core::int) → core::bool};
+  } =>#t20;
+  dynamic dynamicSet2 = block {
+    final core::Set<core::num> #t21 = col::LinkedHashSet::•<core::num>();
+    #t21.{core::Set::add}{Invariant}(3){(core::num) → core::bool};
+    #t21.{core::Set::add}{Invariant}(4){(core::num) → core::bool};
+    #t21.{core::Set::add}{Invariant}(5){(core::num) → core::bool};
+  } =>#t21;
+  dynamic dynamicSet3 = block {
+    final core::Set<core::int?> #t22 = col::LinkedHashSet::•<core::int?>();
+    #t22.{core::Set::add}{Invariant}(6){(core::int?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(7){(core::int?) → core::bool};
+    #t22.{core::Set::add}{Invariant}(8){(core::int?) → core::bool};
+  } =>#t22;
+  core::Iterable<core::int>? iterableIntSet = true ?{core::Set<core::int>?} block {
+    final core::Set<core::int> #t23 = col::LinkedHashSet::•<core::int>();
+    #t23.{core::Set::add}{Invariant}(9){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(10){(core::int) → core::bool};
+    #t23.{core::Set::add}{Invariant}(11){(core::int) → core::bool};
+  } =>#t23 : null;
+  core::Set<core::int>? intSet = true ?{core::Set<core::int>?} block {
+    final core::Set<core::int> #t24 = col::LinkedHashSet::•<core::int>();
+    #t24.{core::Set::add}{Invariant}(12){(core::int) → core::bool};
+    #t24.{core::Set::add}{Invariant}(13){(core::int) → core::bool};
+    #t24.{core::Set::add}{Invariant}(14){(core::int) → core::bool};
+  } =>#t24 : null;
+  core::Set<core::int> set1 = block {
+    final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+    final core::Iterable<dynamic>? #t26 = dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t26 == null))
+      for (final dynamic #t27 in #t26{core::Iterable<dynamic>}) {
+        final core::int #t28 = #t27 as{TypeError,ForNonNullableByDefault} core::int;
+        #t25.{core::Set::add}{Invariant}(#t28){(core::int) → core::bool};
+      }
+    final core::Iterable<dynamic>? #t29 = dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t29 == null))
+      for (final dynamic #t30 in #t29{core::Iterable<dynamic>}) {
+        final core::int #t31 = #t30 as{TypeError,ForNonNullableByDefault} core::int;
+        #t25.{core::Set::add}{Invariant}(#t31){(core::int) → core::bool};
+      }
+    final core::Iterable<dynamic>? #t32 = dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t32 == null))
+      for (final dynamic #t33 in #t32{core::Iterable<dynamic>}) {
+        final core::int #t34 = #t33 as{TypeError,ForNonNullableByDefault} core::int;
+        #t25.{core::Set::add}{Invariant}(#t34){(core::int) → core::bool};
+      }
+    final core::Iterable<core::int>? #t35 = iterableIntSet;
+    if(!(#t35 == null))
+      #t25.{core::Set::addAll}{Invariant}(#t35{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+    final core::Iterable<core::int>? #t36 = intSet;
+    if(!(#t36 == null))
+      #t25.{core::Set::addAll}{Invariant}(#t36{core::Iterable<core::int>}){(core::Iterable<core::int>) → void};
+  } =>#t25;
+  self::expect(core::List::generate<core::int>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::int>}, set1);
+  core::Set<core::num> set2 = block {
+    final core::Set<core::num> #t37 = col::LinkedHashSet::•<core::num>();
+    final core::Iterable<dynamic>? #t38 = dynamicSet1 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t38 == null))
+      for (final dynamic #t39 in #t38{core::Iterable<dynamic>}) {
+        final core::num #t40 = #t39 as{TypeError,ForNonNullableByDefault} core::num;
+        #t37.{core::Set::add}{Invariant}(#t40){(core::num) → core::bool};
+      }
+    final core::Iterable<dynamic>? #t41 = dynamicSet2 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t41 == null))
+      for (final dynamic #t42 in #t41{core::Iterable<dynamic>}) {
+        final core::num #t43 = #t42 as{TypeError,ForNonNullableByDefault} core::num;
+        #t37.{core::Set::add}{Invariant}(#t43){(core::num) → core::bool};
+      }
+    final core::Iterable<dynamic>? #t44 = dynamicSet3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>?;
+    if(!(#t44 == null))
+      for (final dynamic #t45 in #t44{core::Iterable<dynamic>}) {
+        final core::num #t46 = #t45 as{TypeError,ForNonNullableByDefault} core::num;
+        #t37.{core::Set::add}{Invariant}(#t46){(core::num) → core::bool};
+      }
+    final core::Iterable<core::num>? #t47 = iterableIntSet;
+    if(!(#t47 == null))
+      #t37.{core::Set::addAll}{Invariant}(#t47{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+    final core::Iterable<core::num>? #t48 = intSet;
+    if(!(#t48 == null))
+      #t37.{core::Set::addAll}{Invariant}(#t48{core::Iterable<core::num>}){(core::Iterable<core::num>) → void};
+  } =>#t37;
+  self::expect(core::List::generate<core::num>(15, (core::int i) → core::int => i).{core::Iterable::toSet}(){() → core::Set<core::num>}, set2);
+}
+static method main() → dynamic {
+  self::useAddAll();
+  self::useAddAllNullable();
+}
+static method expect(core::Set<dynamic> set1, core::Set<dynamic> set2) → void {
+  if(!(set1.{_in::EfficientLengthIterable::length}{core::int} =={core::num::==}{(core::Object) → core::bool} set2.{_in::EfficientLengthIterable::length}{core::int})) {
+    throw "Unexpected length. Expected ${set1.{_in::EfficientLengthIterable::length}{core::int}}, actual ${set2.{_in::EfficientLengthIterable::length}{core::int}}.";
+  }
+  for (dynamic element in set1) {
+    if(!set2.{core::Set::contains}(element){(core::Object?) → core::bool}) {
+      throw "Element ${element} not found. Expected ${set1}, actual ${set2}.";
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.modular.expect b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.modular.expect
new file mode 100644
index 0000000..2263773
--- /dev/null
+++ b/pkg/front_end/testcases/unified_collections/string_concatenation.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::bool* b = false;
+  block {
+    final core::List<core::String*>* #t1 = <core::String*>["ab"];
+    if(b)
+      #t1.{core::List::add}{Invariant}("cd"){(core::String*) →* void};
+  } =>#t1;
+}
diff --git a/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.modular.expect
new file mode 100644
index 0000000..f81b865
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/copy_with_call_sites.dart.weak.modular.expect
@@ -0,0 +1,142 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:21: Error: The parameter 'bar' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   Foo copyWith({int bar, int bar2}) {
+//                     ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:20:30: Error: The parameter 'bar2' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
+// Try adding either an explicit non-'null' default value or the 'required' modifier.
+//   Foo copyWith({int bar, int bar2}) {
+//                              ^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//     return Foo(bar, bar2);
+//               ^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:19:3: Context: Found this candidate, but the arguments don't match.
+//   Foo({this.bar, this.bar2});
+//   ^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
+//  Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
+//                    ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat extends Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+//  Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+//                             ^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+//  A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+//          ^
+//
+// pkg/front_end/testcases/value_class/copy_with_call_sites.dart:14:14: Error: Final field 'numberOfWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int? numberOfWhiskers;
+//              ^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class Animal extends core::Object {
+  final field core::int? numberOfLegs;
+  constructor •({required core::int? numberOfLegs = #C1}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  final field core::int? numberOfWhiskers = null;
+  synthetic constructor •({required core::int? numberOfWhiskers, core::int? numberOfLegs}) → self::Cat
+    : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int?} && this.{self::Cat::numberOfWhiskers}{core::int?} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int?};
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///copy_with_call_sites.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int?}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int?}.{core::num::hashCode}{core::int}));
+  method /*isLegacy*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int?}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int?}.{core::int::toString}(){() → core::String}})";
+  method /*isLegacy*/ copyWith({core::int? numberOfLegs, core::int? numberOfWhiskers}) → dynamic
+    return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
+}
+class Foo extends core::Object {
+  field core::int? bar;
+  field core::int? bar2;
+  constructor •({core::int? bar = #C1, core::int? bar2 = #C1}) → self::Foo
+    : self::Foo::bar = bar, self::Foo::bar2 = bar2, super core::Object::•()
+    ;
+  method copyWith({core::int bar = #C1, core::int bar2 = #C1}) → self::Foo {
+    return invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:21:15: Error: Too many positional arguments: 0 allowed, but 2 found.
+Try removing the extra positional arguments.
+    return Foo(bar, bar2);
+              ^";
+  }
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::A;
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///copy_with_call_sites.dartA".{core::String::hashCode}{core::int});
+  method /*isLegacy*/ toString() → core::String
+    return "A()";
+  method /*isLegacy*/ copyWith() → dynamic
+    return new self::A::•();
+}
+static method main() → dynamic {
+  self::Cat cat = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:29:20: Error: No named parameter with the name 'numberOfWhiskers'.
+ Cat cat = new Cat(numberOfWhiskers: 20, numberOfLegs: 4);
+                   ^^^^^^^^^^^^^^^^";
+  self::Cat cat2 = (cat as{ForNonNullableByDefault} dynamic){dynamic}.copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat3 = (((cat as{ForNonNullableByDefault} dynamic){dynamic}.copyWith(numberOfWhiskers: 4) as{ForNonNullableByDefault} self::Cat) as{ForNonNullableByDefault} dynamic){dynamic}.copyWith(numberOfLegs: 3) as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat4 = invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:35:29: Error: The method 'copyWith' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named 'copyWith'.
+ Cat cat4 = (cat as Object).copyWith(numberOfWhiskers: 4);
+                            ^^^^^^^^" in (cat as{ForNonNullableByDefault} core::Object){<unresolved>}.copyWith(numberOfWhiskers: 4) as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat cat5 = (cat as{ForNonNullableByDefault} dynamic){dynamic}.copyWith() as{ForNonNullableByDefault} self::Cat;
+  self::Cat cat6 = (cat as{ForNonNullableByDefault} dynamic){dynamic}.copyWith(numberOfWhiskers: 4, numberOfHorns: 5) as{ForNonNullableByDefault} self::Cat;
+  self::A a;
+  self::A a2 = (invalid-expression "pkg/front_end/testcases/value_class/copy_with_call_sites.dart:43:10: Error: Non-nullable variable 'a' must be assigned before it can be used.
+ A a2 = (a as dynamic).copyWith(x: 42, y: 42) as A;
+         ^" in a as{ForNonNullableByDefault} dynamic){dynamic}.copyWith(x: 42, y: 42) as{ForNonNullableByDefault} self::A;
+  self::Foo foo = new self::Foo::•(bar: 4, bar2: 5);
+  self::Foo foo2 = (foo as{ForNonNullableByDefault} dynamic){dynamic}.copyWith(bar: 4) as{ForNonNullableByDefault} self::Foo;
+}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C2;
+
+constants  {
+  #C1 = null
+  #C2 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/empty.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.modular.expect
new file mode 100644
index 0000000..d243d4d
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/empty.dart.weak.modular.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class EmptyClass extends core::Object {
+  synthetic constructor •() → self::EmptyClass
+    : super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::EmptyClass;
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///empty.dartEmptyClass".{core::String::hashCode}{core::int});
+  method /*isLegacy*/ toString() → core::String
+    return "EmptyClass()";
+  method /*isLegacy*/ copyWith() → dynamic
+    return new self::EmptyClass::•();
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.modular.expect
new file mode 100644
index 0000000..0509836
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.modular.expect
@@ -0,0 +1,79 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::A;
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartA".{core::String::hashCode}{core::int});
+  method /*isLegacy*/ toString() → core::String
+    return "A()";
+  method /*isLegacy*/ copyWith() → dynamic
+    return new self::A::•();
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D = self::A with self::B {
+  synthetic constructor •() → self::D
+    : super self::A::•()
+    ;
+}
+class E = self::B with self::A {
+  synthetic constructor •() → self::E
+    : super self::B::•()
+    ;
+}
+class F = self::B with self::C {
+  synthetic constructor •() → self::F
+    : super self::B::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::F;
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///explicit_mixin.dartF".{core::String::hashCode}{core::int});
+  method /*isLegacy*/ toString() → core::String
+    return "F()";
+  method /*isLegacy*/ copyWith() → dynamic
+    return new self::F::•();
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.modular.expect
new file mode 100644
index 0000000..a3eef16
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.modular.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class Animal extends core::Object {
+  field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_final_field_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
+  method /*isLegacy*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
+  method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
+    return new self::Animal::•(numberOfLegs: numberOfLegs);
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.modular.expect
new file mode 100644
index 0000000..eca2eeb
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.modular.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class Animal extends core::Object {
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_extends_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
+  method /*isLegacy*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
+  method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
+    return new self::Animal::•(numberOfLegs: numberOfLegs);
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.modular.expect
new file mode 100644
index 0000000..6759904
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.modular.expect
@@ -0,0 +1,66 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class Animal extends core::Object {
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///non_value_implements_value_error.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
+  method /*isLegacy*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
+  method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
+    return new self::Animal::•(numberOfLegs: numberOfLegs);
+}
+class Cat extends core::Object implements self::Animal {
+  final field core::int numberOfLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.modular.expect
new file mode 100644
index 0000000..0144bcf
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.modular.expect
@@ -0,0 +1,94 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal firstAnimal = Animal(numberOfLegs: 4);
+//                               ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal secondAnimal = Animal(numberOfLegs: 4);
+//                                ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+//   Animal thirdAnimal = Animal(numberOfLegs: 3);
+//                               ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numberOfLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class Animal extends core::Object {
+  final field core::int numberOfLegs = null;
+  synthetic constructor •({required core::int numberOfLegs}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Animal && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Animal}.{self::Animal::numberOfLegs}{core::int};
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine("org-dartlang-testcase:///simple.dartAnimal".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}));
+  method /*isLegacy*/ toString() → core::String
+    return "Animal(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}})";
+  method /*isLegacy*/ copyWith({core::int numberOfLegs}) → dynamic
+    return new self::Animal::•(numberOfLegs: numberOfLegs);
+}
+static method main() → dynamic {
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal firstAnimal = Animal(numberOfLegs: 4);
+                              ^^^^^^^^^^^^";
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numberOfLegs'.
+  Animal secondAnimal = Animal(numberOfLegs: 4);
+                               ^^^^^^^^^^^^";
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numberOfLegs'.
+  Animal thirdAnimal = Animal(numberOfLegs: 3);
+                              ^^^^^^^^^^^^";
+  self::expect(true, firstAnimal =={core::Object::==}{(core::Object) → core::bool} secondAnimal);
+  self::expect(false, firstAnimal =={core::Object::==}{(core::Object) → core::bool} thirdAnimal);
+  self::expect(true, firstAnimal.{core::Object::hashCode}{core::int} =={core::num::==}{(core::Object) → core::bool} secondAnimal.{core::Object::hashCode}{core::int});
+  self::expect(false, firstAnimal.{core::Object::hashCode}{core::int} =={core::num::==}{(core::Object) → core::bool} thirdAnimal.{core::Object::hashCode}{core::int});
+}
+static method expect(core::Object? expected, core::Object? actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected=${expected}, actual=${actual}";
+}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.modular.expect
new file mode 100644
index 0000000..955fab2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.modular.expect
@@ -0,0 +1,101 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:18:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                      ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat extends Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:19:23: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                       ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat extends Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:20:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+//                      ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat extends Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class Animal extends core::Object {
+  final field core::int numberOfLegs;
+  constructor •({required core::int numberOfLegs = #C1}) → self::Animal
+    : self::Animal::numberOfLegs = numberOfLegs, super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  final field core::int numberOfWhiskers = null;
+  synthetic constructor •({required core::int numberOfWhiskers, core::int numberOfLegs}) → self::Cat
+    : self::Cat::numberOfWhiskers = numberOfWhiskers, super self::Animal::•(numberOfLegs)
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Cat && this.{self::Animal::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Animal::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_extends_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Animal::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
+  method /*isLegacy*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Animal::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
+  method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+    return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
+}
+static method main() → dynamic {
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_extends_non_value.dart:18:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                     ^^^^^^^^^^^^";
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/value_extends_non_value.dart:19:23: Error: No named parameter with the name 'numberOfLegs'.
+  Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                      ^^^^^^^^^^^^";
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/value_extends_non_value.dart:20:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+                     ^^^^^^^^^^^^";
+  self::expect(true, firstCat =={core::Object::==}{(core::Object) → core::bool} secondCat);
+  self::expect(false, firstCat =={core::Object::==}{(core::Object) → core::bool} thirdCat);
+  self::expect(true, firstCat.{core::Object::hashCode}{core::int} =={core::num::==}{(core::Object) → core::bool} secondCat.{core::Object::hashCode}{core::int});
+  self::expect(false, firstCat.{core::Object::hashCode}{core::int} =={core::num::==}{(core::Object) → core::bool} thirdCat.{core::Object::hashCode}{core::int});
+}
+static method expect(core::Object? expected, core::Object? actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected=${expected}, actual=${actual}";
+}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C2;
+
+constants  {
+  #C1 = null
+  #C2 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.modular.expect
new file mode 100644
index 0000000..068409c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.modular.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numberOfLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numberOfLegs;
+//       ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:15:13: Error: Final field 'numberOfLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class Animal extends core::Object {
+  field core::int numberOfLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Cat;
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat".{core::String::hashCode}{core::int});
+  method /*isLegacy*/ toString() → core::String
+    return "Cat()";
+  method /*isLegacy*/ copyWith() → dynamic
+    return new self::Cat::•();
+}
+class Animal2 extends core::Object {
+  final field core::int numberOfLegs = null;
+  synthetic constructor •() → self::Animal2
+    : super core::Object::•()
+    ;
+}
+class Cat2 extends self::Animal2 {
+  synthetic constructor •() → self::Cat2
+    : super self::Animal2::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Cat2;
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_extends_non_value_error.dartCat2".{core::String::hashCode}{core::int});
+  method /*isLegacy*/ toString() → core::String
+    return "Cat2()";
+  method /*isLegacy*/ copyWith() → dynamic
+    return new self::Cat2::•();
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.modular.expect
new file mode 100644
index 0000000..28477fa
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.modular.expect
@@ -0,0 +1,176 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:29:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                      ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:12:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:30:23: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+//                       ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:12:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:31:22: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+//                      ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:12:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:39:25: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat2 firstCat2 = Cat2(numberOfLegs: 4, numberOfWhiskers: 10);
+//                         ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:22:7: Context: The class 'Cat2' has a constructor that takes no arguments.
+// class Cat2 implements Animal2 {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:40:26: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat2 secondCat2 = Cat2(numberOfLegs: 4, numberOfWhiskers: 10);
+//                          ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:22:7: Context: The class 'Cat2' has a constructor that takes no arguments.
+// class Cat2 implements Animal2 {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:41:25: Error: No named parameter with the name 'numberOfLegs'.
+//   Cat2 thirdCat2 = Cat2(numberOfLegs: 4, numberOfWhiskers: 0);
+//                         ^^^^^^^^^^^^
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:22:7: Context: The class 'Cat2' has a constructor that takes no arguments.
+// class Cat2 implements Animal2 {
+//       ^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numberOfLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numberOfLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:14:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:23:13: Error: Final field 'numberOfLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfLegs;
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:24:13: Error: Final field 'numberOfWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numberOfWhiskers;
+//             ^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class Animal extends core::Object {
+  final field core::int numberOfLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  final field core::int numberOfLegs = null;
+  final field core::int numberOfWhiskers = null;
+  synthetic constructor •({required core::int numberOfLegs, required core::int numberOfWhiskers}) → self::Cat
+    : self::Cat::numberOfLegs = numberOfLegs, self::Cat::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Cat && this.{self::Cat::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfLegs}{core::int} && this.{self::Cat::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat}.{self::Cat::numberOfWhiskers}{core::int};
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat".{core::String::hashCode}{core::int}, this.{self::Cat::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
+  method /*isLegacy*/ toString() → core::String
+    return "Cat(numberOfLegs: ${this.{self::Cat::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
+  method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+    return new self::Cat::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
+}
+abstract class Animal2 extends core::Object {
+  synthetic constructor •() → self::Animal2
+    : super core::Object::•()
+    ;
+  abstract get numberOfLegs() → core::int;
+}
+class Cat2 extends core::Object implements self::Animal2 {
+  final field core::int numberOfLegs = null;
+  final field core::int numberOfWhiskers = null;
+  synthetic constructor •({required core::int numberOfLegs, required core::int numberOfWhiskers}) → self::Cat2
+    : self::Cat2::numberOfLegs = numberOfLegs, self::Cat2::numberOfWhiskers = numberOfWhiskers, super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::Cat2 && this.{self::Cat2::numberOfLegs}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfLegs}{core::int} && this.{self::Cat2::numberOfWhiskers}{core::int} =={core::num::==}{(core::Object) → core::bool} other{self::Cat2}.{self::Cat2::numberOfWhiskers}{core::int};
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish(val::JenkinsSmiHash::combine(val::JenkinsSmiHash::combine("org-dartlang-testcase:///value_implements_non_value.dartCat2".{core::String::hashCode}{core::int}, this.{self::Cat2::numberOfLegs}{core::int}.{core::num::hashCode}{core::int}), this.{self::Cat2::numberOfWhiskers}{core::int}.{core::num::hashCode}{core::int}));
+  method /*isLegacy*/ toString() → core::String
+    return "Cat2(numberOfLegs: ${this.{self::Cat2::numberOfLegs}{core::int}.{core::int::toString}(){() → core::String}}, numberOfWhiskers: ${this.{self::Cat2::numberOfWhiskers}{core::int}.{core::int::toString}(){() → core::String}})";
+  method /*isLegacy*/ copyWith({core::int numberOfLegs, core::int numberOfWhiskers}) → dynamic
+    return new self::Cat2::•(numberOfLegs: numberOfLegs, numberOfWhiskers: numberOfWhiskers);
+}
+static method main() → dynamic {
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:29:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat firstCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                     ^^^^^^^^^^^^";
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:30:23: Error: No named parameter with the name 'numberOfLegs'.
+  Cat secondCat = Cat(numberOfLegs: 4, numberOfWhiskers: 10);
+                      ^^^^^^^^^^^^";
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:31:22: Error: No named parameter with the name 'numberOfLegs'.
+  Cat thirdCat = Cat(numberOfLegs: 4, numberOfWhiskers: 0);
+                     ^^^^^^^^^^^^";
+  self::expect(true, firstCat =={core::Object::==}{(core::Object) → core::bool} secondCat);
+  self::expect(false, firstCat =={core::Object::==}{(core::Object) → core::bool} thirdCat);
+  self::expect(true, firstCat.{core::Object::hashCode}{core::int} =={core::num::==}{(core::Object) → core::bool} secondCat.{core::Object::hashCode}{core::int});
+  self::expect(false, firstCat.{core::Object::hashCode}{core::int} =={core::num::==}{(core::Object) → core::bool} thirdCat.{core::Object::hashCode}{core::int});
+  self::Cat2 firstCat2 = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:39:25: Error: No named parameter with the name 'numberOfLegs'.
+  Cat2 firstCat2 = Cat2(numberOfLegs: 4, numberOfWhiskers: 10);
+                        ^^^^^^^^^^^^";
+  self::Cat2 secondCat2 = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:40:26: Error: No named parameter with the name 'numberOfLegs'.
+  Cat2 secondCat2 = Cat2(numberOfLegs: 4, numberOfWhiskers: 10);
+                         ^^^^^^^^^^^^";
+  self::Cat2 thirdCat2 = invalid-expression "pkg/front_end/testcases/value_class/value_implements_non_value.dart:41:25: Error: No named parameter with the name 'numberOfLegs'.
+  Cat2 thirdCat2 = Cat2(numberOfLegs: 4, numberOfWhiskers: 0);
+                        ^^^^^^^^^^^^";
+  self::expect(true, firstCat2 =={core::Object::==}{(core::Object) → core::bool} secondCat2);
+  self::expect(false, firstCat2 =={core::Object::==}{(core::Object) → core::bool} thirdCat2);
+  self::expect(true, firstCat2.{core::Object::hashCode}{core::int} =={core::num::==}{(core::Object) → core::bool} secondCat2.{core::Object::hashCode}{core::int});
+  self::expect(false, firstCat2.{core::Object::hashCode}{core::int} =={core::num::==}{(core::Object) → core::bool} thirdCat2.{core::Object::hashCode}{core::int});
+}
+static method expect(core::Object? expected, core::Object? actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+    throw "Expected=${expected}, actual=${actual}";
+}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.modular.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.modular.expect
new file mode 100644
index 0000000..391ae35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.modular.expect
@@ -0,0 +1,71 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "value_class_support_lib.dart" as val;
+
+import "org-dartlang-testcase:///value_class_support_lib.dart";
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator /*isLegacy*/ ==(core::Object other) → core::bool
+    return other is self::A;
+  get /*isLegacy*/ hashCode() → core::int
+    return val::JenkinsSmiHash::finish("org-dartlang-testcase:///value_mixin_error.dartA".{core::String::hashCode}{core::int});
+  method /*isLegacy*/ toString() → core::String
+    return "A()";
+  method /*isLegacy*/ copyWith() → dynamic
+    return new self::A::•();
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+abstract class _C&B&A = self::B with self::A /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&B&A
+    : super self::B::•()
+    ;
+}
+class C extends self::_C&B&A {
+  synthetic constructor •() → self::C
+    : super self::_C&B&A::•()
+    ;
+}
+abstract class _D&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_D&A&B
+    : super self::A::•()
+    ;
+}
+class D extends self::_D&A&B {
+  synthetic constructor •() → self::D
+    : super self::_D&A&B::•()
+    ;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as val;
+import "dart:core" as core;
+
+class JenkinsSmiHash extends core::Object {
+  synthetic constructor •() → val::JenkinsSmiHash
+    : super core::Object::•()
+    ;
+  static method combine(core::int hash, core::int value) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(value){(core::num) → core::int}){(core::int) → core::int};
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(524287.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(10){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    return hash.{core::int::^}(hash.{core::int::>>}(6){(core::int) → core::int}){(core::int) → core::int};
+  }
+  static method finish(core::int hash) → core::int {
+    hash = 536870911.{core::int::&}(hash.{core::num::+}(67108863.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(3){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+    hash = hash.{core::int::^}(hash.{core::int::>>}(11){(core::int) → core::int}){(core::int) → core::int};
+    return 536870911.{core::int::&}(hash.{core::num::+}(16383.{core::int::&}(hash){(core::int) → core::int}.{core::int::<<}(15){(core::int) → core::int}){(core::num) → core::int}){(core::int) → core::int};
+  }
+}
+static const field core::String valueClass = #C1;
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/variance/class_type_parameter_modifier.dart.weak.modular.expect b/pkg/front_end/testcases/variance/class_type_parameter_modifier.dart.weak.modular.expect
new file mode 100644
index 0000000..14e8ddf
--- /dev/null
+++ b/pkg/front_end/testcases/variance/class_type_parameter_modifier.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic, contravariant Y extends core::Object? = dynamic, invariant Z extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%, self::A::Y%, self::A::Z%>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::A<dynamic, dynamic, dynamic> a = new self::A::•<dynamic, dynamic, dynamic>();
+}
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.weak.modular.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.weak.modular.expect
new file mode 100644
index 0000000..5153118
--- /dev/null
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.weak.modular.expect
@@ -0,0 +1,128 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef ContraFunction<contravariant T extends core::Object? = dynamic> = (T%) → void;
+typedef InvFunction<invariant T extends core::Object? = dynamic> = (T%) → T%;
+class Contravariant<contravariant T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Contravariant<self::Contravariant::T%>
+    : super core::Object::•()
+    ;
+}
+class Invariant<invariant T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Invariant<self::Invariant::T%>
+    : super core::Object::•()
+    ;
+}
+class A<contravariant T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic> extends core::Object {
+  final field (self::A::T%) →? void field = null;
+  synthetic constructor •() → self::A<self::A::T%, self::A::U%, self::A::V%>
+    : super core::Object::•()
+    ;
+  method method(self::A::T% t, (self::A::U%) → void u, covariant-by-class self::A::V% v) → void {}
+  method method2(self::A::T% x, [self::A::T? y = #C1]) → void {}
+  set x(self::A::T% t) → void {}
+  get mapContra() → core::Map<self::A::U%, self::Contravariant<self::A::V%>>
+    return core::Map::•<self::A::U%, self::Contravariant<self::A::V%>>();
+  get mapContraFn() → core::Map<self::A::U%, (self::A::V%) → void>
+    return core::Map::•<self::A::U%, (self::A::V%) → void>();
+  get mapInv() → core::Map<self::A::U%, self::Invariant<self::A::V%>>
+    return core::Map::•<self::A::U%, self::Invariant<self::A::V%>>();
+  get mapInvFn() → core::Map<self::A::U%, (self::A::V%) → self::A::V%>
+    return core::Map::•<self::A::U%, (self::A::V%) → self::A::V%>();
+}
+class B<invariant T extends core::Object? = dynamic> extends core::Object {
+  field self::B::T? x = null;
+  synthetic constructor •() → self::B<self::B::T%>
+    : super core::Object::•()
+    ;
+  method method(self::B::T% x) → self::B::T%
+    return x;
+  set y(self::B::T% x) → void {}
+}
+class C<contravariant T extends core::Object? = dynamic> extends core::Object {
+  final field (self::C::T%) →? void field = null;
+  synthetic constructor •() → self::C<self::C::T%>
+    : super core::Object::•()
+    ;
+  method method(self::C::T% x, [self::C::T? y = #C1]) → void {}
+  set x(self::C::T% t) → void {}
+}
+abstract class D<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T%>
+    : super core::Object::•()
+    ;
+  abstract method method(covariant-by-class self::D::T% x) → core::int;
+}
+class E<invariant T extends core::Object? = dynamic> extends core::Object {
+  final field (self::E::T%) → void f;
+  constructor •((self::E::T%) → void f) → self::E<self::E::T%>
+    : self::E::f = f, super core::Object::•()
+    ;
+  method method(self::E::T% x) → core::int {
+    let final self::E::T% #t1 = x in this.{self::E::f}{(self::E::T%) → void}(#t1){(self::E::T%) → void};
+    return 0;
+  }
+}
+class F<invariant T extends core::Object? = dynamic> extends self::E<self::F::T%> implements self::D<self::F::T%> {
+  constructor •((self::F::T%) → void f) → self::F<self::F::T%>
+    : super self::E::•(f)
+    ;
+  forwarding-stub method method(covariant-by-class self::F::T% x) → core::int
+    return super.{self::E::method}(x);
+}
+class NoSuchMethod<invariant T extends core::Object? = dynamic> extends core::Object implements self::B<self::NoSuchMethod::T%> {
+  synthetic constructor •() → self::NoSuchMethod<self::NoSuchMethod::T%>
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return 3;
+  no-such-method-forwarder get x() → self::NoSuchMethod::T?
+    return this.{self::NoSuchMethod::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::NoSuchMethod::T?;
+  no-such-method-forwarder method method(self::NoSuchMethod::T% x) → self::NoSuchMethod::T%
+    return this.{self::NoSuchMethod::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} self::NoSuchMethod::T%;
+  no-such-method-forwarder set y(self::NoSuchMethod::T% x) → void
+    return this.{self::NoSuchMethod::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+  no-such-method-forwarder set x(self::NoSuchMethod::T? value) → void
+    return this.{self::NoSuchMethod::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 2, #C3, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))){(core::Invocation) → dynamic};
+}
+static method main() → dynamic {
+  self::A<core::int, core::num, core::String> a = new self::A::•<core::int, core::num, core::String>();
+  self::expect(null, a.{self::A::field}{(core::int) →? void});
+  a.{self::A::method}(3, (core::num num) → void {}, "test"){(core::int, (core::num) → void, core::String) → void};
+  a.{self::A::method2}(3){(core::int, [core::int?]) → void};
+  a.{self::A::x} = 3;
+  core::Map<core::num, self::Contravariant<core::String>> mapContra = a.{self::A::mapContra}{core::Map<core::num, self::Contravariant<core::String>>} as{TypeError,CovarianceCheck,ForNonNullableByDefault} core::Map<core::num, self::Contravariant<core::String>>;
+  core::Map<core::num, (core::String) → void> mapContraFn = a.{self::A::mapContraFn}{core::Map<core::num, (core::String) → void>} as{TypeError,CovarianceCheck,ForNonNullableByDefault} core::Map<core::num, (core::String) → void>;
+  core::Map<core::num, self::Invariant<core::String>> mapInv = a.{self::A::mapInv}{core::Map<core::num, self::Invariant<core::String>>} as{TypeError,CovarianceCheck,ForNonNullableByDefault} core::Map<core::num, self::Invariant<core::String>>;
+  core::Map<core::num, (core::String) → core::String> mapInvFn = a.{self::A::mapInvFn}{core::Map<core::num, (core::String) → core::String>} as{TypeError,CovarianceCheck,ForNonNullableByDefault} core::Map<core::num, (core::String) → core::String>;
+  self::B<core::int> b = new self::B::•<core::int>();
+  b.{self::B::x} = 3;
+  self::expect(3, b.{self::B::x}{core::int?});
+  self::expect(3, b.{self::B::method}(3){(core::int) → core::int});
+  b.{self::B::y} = 3;
+  self::C<core::int> c = new self::C::•<core::int>();
+  self::expect(null, c.{self::C::field}{(core::int) →? void});
+  c.{self::C::method}(3, 2){(core::int, [core::int?]) → void};
+  c.{self::C::x} = 3;
+  self::D<core::Object> d = new self::F::•<core::String>((core::String s) → void {});
+  d.{self::D::method}("test"){(core::Object) → core::int};
+  self::NoSuchMethod<core::num> nsm = new self::NoSuchMethod::•<core::num>();
+  self::expect(3, nsm.{self::B::method}(3){(core::num) → core::num});
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = null
+  #C2 = #x
+  #C3 = <core::Type*>[]
+  #C4 = <dynamic>[]
+  #C5 = <core::Symbol*, dynamic>{)
+  #C6 = #method
+  #C7 = #y=
+  #C8 = #x=
+}
diff --git a/pkg/front_end/testcases/variance/mixin_type_parameter_modifier.dart.weak.modular.expect b/pkg/front_end/testcases/variance/mixin_type_parameter_modifier.dart.weak.modular.expect
new file mode 100644
index 0000000..abd3eea
--- /dev/null
+++ b/pkg/front_end/testcases/variance/mixin_type_parameter_modifier.dart.weak.modular.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+abstract class B<invariant X extends core::Object? = dynamic, Y extends core::Object? = dynamic, contravariant Z extends core::Object? = dynamic> extends self::A /*isMixinDeclaration*/  {
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/variance/unconstrained_inference.dart.weak.modular.expect b/pkg/front_end/testcases/variance/unconstrained_inference.dart.weak.modular.expect
new file mode 100644
index 0000000..0850650
--- /dev/null
+++ b/pkg/front_end/testcases/variance/unconstrained_inference.dart.weak.modular.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Covariant<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Covariant<self::Covariant::T%>
+    : super core::Object::•()
+    ;
+}
+class Contravariant<contravariant T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Contravariant<self::Contravariant::T%>
+    : super core::Object::•()
+    ;
+}
+class Invariant<invariant T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::Invariant<self::Invariant::T%>
+    : super core::Object::•()
+    ;
+}
+static method covariantListInfer<T extends core::Object? = dynamic>(self::Covariant<core::List<self::covariantListInfer::T%>> x) → void {}
+static method contravariantListInfer<T extends core::Object? = dynamic>(self::Contravariant<core::List<self::contravariantListInfer::T%>> x) → void {}
+static method invariantListInfer<T extends core::Object? = dynamic>(self::Invariant<core::List<self::invariantListInfer::T%>> x) → void {}
+static method main() → dynamic {
+  self::Covariant<dynamic> cov = new self::Covariant::•<dynamic>();
+  self::covariantListInfer<core::Object?>(new self::Covariant::•<core::List<core::Object?>>());
+  self::Contravariant<Never> contra = new self::Contravariant::•<Never>();
+  self::contravariantListInfer<core::Object?>(new self::Contravariant::•<core::List<core::Object?>>());
+  self::Invariant<dynamic> inv = new self::Invariant::•<dynamic>();
+  self::invariantListInfer<core::Object?>(new self::Invariant::•<core::List<core::Object?>>());
+}
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 3b2aaee..ae8b870 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -4,11 +4,21 @@
 
 # Status file for the weak_suite.dart test suite.
 
-general/platform_invalid_uris/main: SemiFuzzFailure
+dart2js/flutter_issue94561/main: SemiFuzzFailure
+dart2js/flutter_issue94561/main.no_link: SemiFuzzFailure
+dart2js/late_fields: SemiFuzzFailure
+dart2js/late_from_dill/main: SemiFuzzFailure
+dart2js/late_statics: SemiFuzzFailure
+dart2js/mixin_from_opt_in/main: SemiFuzzFailure
+dart2js/mixin_from_opt_in/main.no_link: SemiFuzzFailure
 general/error_recovery/issue_39058_prime.crash: SemiFuzzFailure
 general/error_recovery/issue_39202.crash: SemiFuzzCrash
 general/error_recovery/issue_39058.crash: SemiFuzzFailure
+general/platform_invalid_uris/main: SemiFuzzFailure
+nnbd_mixed/mixin_from_opt_in/main: SemiFuzzFailure
+nnbd_mixed/mixin_from_opt_in/main.no_link: SemiFuzzFailure
 regress/utf_16_le_content.crash: SemiFuzzCrash
+static_field_lowering/opt_in: SemiFuzzFailure
 
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
@@ -37,6 +47,7 @@
 general/bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
 general/call: RuntimeError
 general/cascade: RuntimeError
+general/conditional_import: RuntimeError # Issue 47814
 general/constructor_initializer_invalid: RuntimeError # Fails execution after recovery
 general/covariant_field: TypeCheckError
 general/covariant_generic: RuntimeError
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index cc90a5b..d0f87bb 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -128,6 +128,23 @@
       ]
     },
     {
+      "name": "modular",
+      "kind": "Chain",
+      "source": "test/fasta/modular_suite.dart",
+      "path": "testcases/",
+      "status": "testcases/modular.status",
+      "pattern": [
+        "\\.dart$",
+        "\\.crash_dart$"
+      ],
+      "exclude": [
+        "/testcases/.*_part[0-9]*\\.dart$",
+        "/testcases/.*_lib[0-9]*\\.dart$",
+        "/testcases/dartino/",
+        "/testcases/expression/"
+      ]
+    },
+    {
       "name": "weak",
       "kind": "Chain",
       "source": "test/fasta/weak_suite.dart",
@@ -229,6 +246,17 @@
       "exclude": []
     },
     {
+      "name": "outline_extractor",
+      "kind": "Chain",
+      "source": "test/outline_extractor_suite.dart",
+      "path": "outline_extraction_testcases/",
+      "status": "outline_extraction_testcases/outline_extractor.status",
+      "pattern": [
+        "main\\.dart$"
+      ],
+      "exclude": []
+    },
+    {
       "name": "parser_equivalence",
       "kind": "Chain",
       "source": "test/parser_equivalence_suite.dart",
@@ -466,6 +494,7 @@
       "test/extensions/data/",
       "test/id_testing/data/",
       "test/language_versioning/data/",
+      "test/macros/data/",
       "test/patching/data",
       "test/predicates/data",
       "test/static_types/data/",
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index 0c8312e..58d7517 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -277,7 +277,7 @@
           ..sdkSummary = Options.platform.read(parsedOptions)
           ..librariesSpecificationUri = resolveInputUri(arguments[1])
           ..setExitCodeOnProblem = true,
-        inputs: <Uri>[Uri.parse(arguments[0])],
+        inputs: arguments[0].split(',').map(Uri.parse).toList(),
         output: resolveInputUri(arguments[3]));
   } else if (arguments.isEmpty) {
     return throw new CommandLineProblem.deprecated("No Dart file specified.");
diff --git a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
index 073dd5f..b7b6fa6 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_legacy_test.dart
@@ -36,6 +36,30 @@
       Expect.isTrue(await new File.fromUri(outlineDill).exists());
     });
   });
+
+  asyncTest(() async {
+    await withTemporaryDirectory("compile_platform_test_", (Uri tmp) async {
+      Uri platformDill = tmp.resolve("dart2js_platform.dill");
+      Uri outlineDill = tmp.resolve("dart2js_outline.dill");
+      ProcessResult result = await Process.run(dartVm.toFilePath(), <String>[
+        compilePlatform.toFilePath(),
+        "--target=dart2js",
+        "--no-deps",
+        "-v",
+        "dart:core,dart:js_util",
+        librariesJson.toFilePath(),
+        outlineDill.toFilePath(),
+        platformDill.toFilePath(),
+        outlineDill.toFilePath(),
+      ]);
+      stdout.write(result.stdout);
+      stderr.write(result.stderr);
+      Expect.equals(
+          0, result.exitCode, "Non-zero exitcode from compile_platform.dart");
+      Expect.isTrue(await new File.fromUri(platformDill).exists());
+      Expect.isTrue(await new File.fromUri(outlineDill).exists());
+    });
+  });
 }
 
 Future<void> withTemporaryDirectory(
diff --git a/pkg/front_end/tool/_fasta/compile_platform_test.dart b/pkg/front_end/tool/_fasta/compile_platform_test.dart
index 073dd5f..b7b6fa6 100644
--- a/pkg/front_end/tool/_fasta/compile_platform_test.dart
+++ b/pkg/front_end/tool/_fasta/compile_platform_test.dart
@@ -36,6 +36,30 @@
       Expect.isTrue(await new File.fromUri(outlineDill).exists());
     });
   });
+
+  asyncTest(() async {
+    await withTemporaryDirectory("compile_platform_test_", (Uri tmp) async {
+      Uri platformDill = tmp.resolve("dart2js_platform.dill");
+      Uri outlineDill = tmp.resolve("dart2js_outline.dill");
+      ProcessResult result = await Process.run(dartVm.toFilePath(), <String>[
+        compilePlatform.toFilePath(),
+        "--target=dart2js",
+        "--no-deps",
+        "-v",
+        "dart:core,dart:js_util",
+        librariesJson.toFilePath(),
+        outlineDill.toFilePath(),
+        platformDill.toFilePath(),
+        outlineDill.toFilePath(),
+      ]);
+      stdout.write(result.stdout);
+      stderr.write(result.stderr);
+      Expect.equals(
+          0, result.exitCode, "Non-zero exitcode from compile_platform.dart");
+      Expect.isTrue(await new File.fromUri(platformDill).exists());
+      Expect.isTrue(await new File.fromUri(outlineDill).exists());
+    });
+  });
 }
 
 Future<void> withTemporaryDirectory(
diff --git a/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart b/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart
deleted file mode 100644
index 301e0cb..0000000
--- a/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io' show File;
-import 'dart:typed_data' show Uint8List;
-
-import 'package:_fe_analyzer_shared/src/parser/parser.dart';
-import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart';
-import 'package:_fe_analyzer_shared/src/scanner/token.dart';
-import 'package:dart_style/dart_style.dart' show DartFormatter;
-import '../../test/utils/io_utils.dart' show computeRepoDirUri;
-
-void main(List<String> args) {
-  final Uri repoDir = computeRepoDirUri();
-  String generated = generateAstHelper(repoDir);
-  new File.fromUri(computeAstHelperUri(repoDir))
-      .writeAsStringSync(generated, flush: true);
-}
-
-Uri computeAstHelperUri(Uri repoDir) {
-  return repoDir.resolve(
-      "pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart");
-}
-
-String generateAstHelper(Uri repoDir) {
-  StringBuffer out = new StringBuffer();
-  File f = new File.fromUri(
-      repoDir.resolve("pkg/_fe_analyzer_shared/lib/src/parser/listener.dart"));
-  List<int> rawBytes = f.readAsBytesSync();
-
-  Uint8List bytes = new Uint8List(rawBytes.length + 1);
-  bytes.setRange(0, rawBytes.length, rawBytes);
-
-  Utf8BytesScanner scanner = new Utf8BytesScanner(bytes, includeComments: true);
-  Token firstToken = scanner.tokenize();
-
-  out.write(r"""
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:_fe_analyzer_shared/src/parser/assert.dart';
-import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/constructor_reference_context.dart';
-import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
-import 'package:_fe_analyzer_shared/src/parser/listener.dart';
-import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
-import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
-import 'package:_fe_analyzer_shared/src/scanner/token.dart';
-import 'package:front_end/src/fasta/messages.dart';
-
-// ignore_for_file: lines_longer_than_80_chars
-
-// THIS FILE IS AUTO GENERATED BY
-// 'tool/_fasta/direct_parser_ast_helper_creator.dart'
-// Run this command to update it:
-// 'dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart'
-
-abstract class DirectParserASTContent {
-  final String what;
-  final DirectParserASTType type;
-  Map<String, Object?> get deprecatedArguments;
-  List<DirectParserASTContent>? children;
-
-  DirectParserASTContent(this.what, this.type);
-
-  // TODO(jensj): Compare two ASTs.
-}
-
-enum DirectParserASTType { BEGIN, END, HANDLE }
-
-abstract class AbstractDirectParserASTListener implements Listener {
-  List<DirectParserASTContent> data = [];
-
-  void seen(DirectParserASTContent entry);
-
-""");
-
-  ParserCreatorListener listener = new ParserCreatorListener(out);
-  ClassMemberParser parser = new ClassMemberParser(listener);
-  parser.parseUnit(firstToken);
-
-  out.writeln("}");
-  out.writeln("");
-  out.write(listener.newClasses.toString());
-
-  return new DartFormatter().format("$out");
-}
-
-class ParserCreatorListener extends Listener {
-  final StringSink out;
-  bool insideListenerClass = false;
-  String? currentMethodName;
-  String? latestSeenParameterTypeToken;
-  String? latestSeenParameterTypeTokenQuestion;
-  final List<Parameter> parameters = <Parameter>[];
-  final StringBuffer newClasses = new StringBuffer();
-
-  ParserCreatorListener(this.out);
-
-  @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
-    if (name.lexeme == "Listener") insideListenerClass = true;
-  }
-
-  @override
-  void endClassDeclaration(Token beginToken, Token endToken) {
-    insideListenerClass = false;
-  }
-
-  @override
-  void beginMethod(
-      DeclarationKind declarationKind,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? varFinalOrConst,
-      Token? getOrSet,
-      Token name) {
-    currentMethodName = name.lexeme;
-  }
-
-  @override
-  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    void end() {
-      parameters.clear();
-      currentMethodName = null;
-    }
-
-    if (insideListenerClass &&
-        (currentMethodName!.startsWith("begin") ||
-            currentMethodName!.startsWith("end") ||
-            currentMethodName!.startsWith("handle"))) {
-      StringBuffer sb = new StringBuffer();
-      sb.writeln("  @override");
-      sb.write("  ");
-      Token token = beginToken;
-      Token? latestToken;
-      while (true) {
-        if (latestToken != null && latestToken.charEnd < token.charOffset) {
-          sb.write(" ");
-        }
-        sb.write(token.lexeme);
-        if ((token is BeginToken &&
-                token.type == TokenType.OPEN_CURLY_BRACKET) ||
-            token is SimpleToken && token.type == TokenType.FUNCTION) {
-          break;
-        }
-        if (token == endToken) {
-          throw token.runtimeType;
-        }
-        latestToken = token;
-        token = token.next!;
-      }
-
-      if (token is SimpleToken && token.type == TokenType.FUNCTION) {
-        return end();
-      } else {
-        sb.write("\n    ");
-        String typeString;
-        String typeStringCamel;
-        String name;
-        if (currentMethodName!.startsWith("begin")) {
-          typeString = "BEGIN";
-          typeStringCamel = "Begin";
-          name = currentMethodName!.substring("begin".length);
-        } else if (currentMethodName!.startsWith("end")) {
-          typeString = "END";
-          typeStringCamel = "End";
-          name = currentMethodName!.substring("end".length);
-        } else if (currentMethodName!.startsWith("handle")) {
-          typeString = "HANDLE";
-          typeStringCamel = "Handle";
-          name = currentMethodName!.substring("handle".length);
-        } else {
-          throw "Unexpected.";
-        }
-
-        String className = "DirectParserASTContent${name}${typeStringCamel}";
-        sb.write("$className data = new $className(");
-        sb.write("DirectParserASTType.");
-        sb.write(typeString);
-        for (int i = 0; i < parameters.length; i++) {
-          Parameter param = parameters[i];
-          sb.write(', ');
-          sb.write(param.name);
-          sb.write(': ');
-          sb.write(param.name);
-        }
-
-        sb.write(");");
-        sb.write("\n    ");
-        sb.write("seen(data);");
-        sb.write("\n  ");
-
-        newClasses
-            .write("class DirectParserASTContent${name}${typeStringCamel} "
-                "extends DirectParserASTContent {\n");
-
-        for (int i = 0; i < parameters.length; i++) {
-          Parameter param = parameters[i];
-          newClasses.write("  final ");
-          newClasses.write(param.type);
-          newClasses.write(param.hasQuestion ? '?' : '');
-          newClasses.write(' ');
-          newClasses.write(param.name);
-          newClasses.write(';\n');
-        }
-        newClasses.write('\n');
-        newClasses.write("  DirectParserASTContent${name}${typeStringCamel}"
-            "(DirectParserASTType type");
-        String separator = ", {";
-        for (int i = 0; i < parameters.length; i++) {
-          Parameter param = parameters[i];
-          newClasses.write(separator);
-          if (!param.hasQuestion) {
-            newClasses.write('required ');
-          }
-          newClasses.write('this.');
-          newClasses.write(param.name);
-          separator = ", ";
-        }
-        if (parameters.isNotEmpty) {
-          newClasses.write('}');
-        }
-        newClasses.write(') : super("$name", type);\n\n');
-        newClasses.writeln("@override");
-        newClasses.write("Map<String, Object?> get deprecatedArguments => {");
-        for (int i = 0; i < parameters.length; i++) {
-          Parameter param = parameters[i];
-          newClasses.write('"');
-          newClasses.write(param.name);
-          newClasses.write('": ');
-          newClasses.write(param.name);
-          newClasses.write(',');
-        }
-        newClasses.write("};\n");
-        newClasses.write("}\n");
-      }
-
-      sb.write("}");
-      sb.write("\n\n");
-
-      out.write(sb.toString());
-    }
-    end();
-  }
-
-  @override
-  void handleNoType(Token lastConsumed) {
-    latestSeenParameterTypeToken = null;
-    latestSeenParameterTypeTokenQuestion = null;
-  }
-
-  @override
-  void handleType(Token beginToken, Token? questionMark) {
-    latestSeenParameterTypeToken = beginToken.lexeme;
-    latestSeenParameterTypeTokenQuestion = questionMark?.lexeme;
-  }
-
-  @override
-  void endFormalParameter(
-      Token? thisKeyword,
-      Token? periodAfterThis,
-      Token nameToken,
-      Token? initializerStart,
-      Token? initializerEnd,
-      FormalParameterKind kind,
-      MemberKind memberKind) {
-    parameters.add(new Parameter(
-        nameToken.lexeme,
-        latestSeenParameterTypeToken ?? 'dynamic',
-        latestSeenParameterTypeTokenQuestion == null ? false : true));
-  }
-}
-
-class Parameter {
-  final String name;
-  final String type;
-  final bool hasQuestion;
-
-  Parameter(this.name, this.type, this.hasQuestion);
-}
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 2aa92c9..70b5606 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -126,7 +126,7 @@
 }
 
 class BatchCompiler {
-  final Stream<String> lines;
+  final Stream<String>? lines;
 
   Uri? platformUri;
 
@@ -137,7 +137,7 @@
   BatchCompiler(this.lines);
 
   Future<void> run() async {
-    await for (String line in lines) {
+    await for (String line in lines!) {
       try {
         if (await batchCompileArguments(
             new List<String>.from(jsonDecode(line)))) {
diff --git a/pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart b/pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart
new file mode 100644
index 0000000..ff1f22e
--- /dev/null
+++ b/pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart
@@ -0,0 +1,289 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' show File;
+import 'dart:typed_data' show Uint8List;
+
+import 'package:_fe_analyzer_shared/src/parser/parser.dart';
+import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart';
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:dart_style/dart_style.dart' show DartFormatter;
+import '../../test/utils/io_utils.dart' show computeRepoDirUri;
+
+void main(List<String> args) {
+  final Uri repoDir = computeRepoDirUri();
+  String generated = generateAstHelper(repoDir);
+  new File.fromUri(computeAstHelperUri(repoDir))
+      .writeAsStringSync(generated, flush: true);
+}
+
+Uri computeAstHelperUri(Uri repoDir) {
+  return repoDir
+      .resolve("pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart");
+}
+
+String generateAstHelper(Uri repoDir) {
+  StringBuffer out = new StringBuffer();
+  File f = new File.fromUri(
+      repoDir.resolve("pkg/_fe_analyzer_shared/lib/src/parser/listener.dart"));
+  List<int> rawBytes = f.readAsBytesSync();
+
+  Uint8List bytes = new Uint8List(rawBytes.length + 1);
+  bytes.setRange(0, rawBytes.length, rawBytes);
+
+  Utf8BytesScanner scanner = new Utf8BytesScanner(bytes, includeComments: true);
+  Token firstToken = scanner.tokenize();
+
+  out.write(r"""
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/parser/assert.dart';
+import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/constructor_reference_context.dart';
+import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+import 'package:_fe_analyzer_shared/src/parser/listener.dart';
+import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
+import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:front_end/src/fasta/messages.dart';
+
+// ignore_for_file: lines_longer_than_80_chars
+
+// THIS FILE IS AUTO GENERATED BY
+// 'tool/_fasta/parser_ast_helper_creator.dart'
+// Run this command to update it:
+// 'dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart'
+
+abstract class ParserAstNode {
+  final String what;
+  final ParserAstType type;
+  Map<String, Object?> get deprecatedArguments;
+  List<ParserAstNode>? children;
+  ParserAstNode? parent;
+
+  ParserAstNode(this.what, this.type);
+
+  // TODO(jensj): Compare two ASTs.
+}
+
+enum ParserAstType { BEGIN, END, HANDLE }
+
+abstract class AbstractParserAstListener implements Listener {
+  List<ParserAstNode> data = [];
+
+  void seen(ParserAstNode entry);
+
+""");
+
+  ParserCreatorListener listener = new ParserCreatorListener(out);
+  ClassMemberParser parser = new ClassMemberParser(listener);
+  parser.parseUnit(firstToken);
+
+  out.writeln("}");
+  out.writeln("");
+  out.write(listener.newClasses.toString());
+
+  return new DartFormatter().format("$out");
+}
+
+class ParserCreatorListener extends Listener {
+  final StringSink out;
+  bool insideListenerClass = false;
+  String? currentMethodName;
+  String? latestSeenParameterTypeToken;
+  String? latestSeenParameterTypeTokenQuestion;
+  final List<Parameter> parameters = <Parameter>[];
+  final StringBuffer newClasses = new StringBuffer();
+
+  ParserCreatorListener(this.out);
+
+  @override
+  void beginClassDeclaration(
+      Token begin, Token? abstractToken, Token? macroToken, Token name) {
+    if (name.lexeme == "Listener") insideListenerClass = true;
+  }
+
+  @override
+  void endClassDeclaration(Token beginToken, Token endToken) {
+    insideListenerClass = false;
+  }
+
+  @override
+  void beginMethod(
+      DeclarationKind declarationKind,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
+      Token name) {
+    currentMethodName = name.lexeme;
+  }
+
+  @override
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    void end() {
+      parameters.clear();
+      currentMethodName = null;
+    }
+
+    if (insideListenerClass &&
+        (currentMethodName!.startsWith("begin") ||
+            currentMethodName!.startsWith("end") ||
+            currentMethodName!.startsWith("handle"))) {
+      StringBuffer sb = new StringBuffer();
+      sb.writeln("  @override");
+      sb.write("  ");
+      Token token = beginToken;
+      Token? latestToken;
+      while (true) {
+        if (latestToken != null && latestToken.charEnd < token.charOffset) {
+          sb.write(" ");
+        }
+        sb.write(token.lexeme);
+        if ((token is BeginToken &&
+                token.type == TokenType.OPEN_CURLY_BRACKET) ||
+            token is SimpleToken && token.type == TokenType.FUNCTION) {
+          break;
+        }
+        if (token == endToken) {
+          throw token.runtimeType;
+        }
+        latestToken = token;
+        token = token.next!;
+      }
+
+      if (token is SimpleToken && token.type == TokenType.FUNCTION) {
+        return end();
+      } else {
+        sb.write("\n    ");
+        String typeString;
+        String typeStringCamel;
+        String name;
+        if (currentMethodName!.startsWith("begin")) {
+          typeString = "BEGIN";
+          typeStringCamel = "Begin";
+          name = currentMethodName!.substring("begin".length);
+        } else if (currentMethodName!.startsWith("end")) {
+          typeString = "END";
+          typeStringCamel = "End";
+          name = currentMethodName!.substring("end".length);
+        } else if (currentMethodName!.startsWith("handle")) {
+          typeString = "HANDLE";
+          typeStringCamel = "Handle";
+          name = currentMethodName!.substring("handle".length);
+        } else {
+          throw "Unexpected.";
+        }
+
+        String className = "${name}${typeStringCamel}";
+        sb.write("$className data = new $className(");
+        sb.write("ParserAstType.");
+        sb.write(typeString);
+        for (int i = 0; i < parameters.length; i++) {
+          Parameter param = parameters[i];
+          sb.write(', ');
+          sb.write(param.name);
+          sb.write(': ');
+          sb.write(param.name);
+        }
+
+        sb.write(");");
+        sb.write("\n    ");
+        sb.write("seen(data);");
+        sb.write("\n  ");
+
+        newClasses.write("class ${name}${typeStringCamel} "
+            "extends ParserAstNode {\n");
+
+        for (int i = 0; i < parameters.length; i++) {
+          Parameter param = parameters[i];
+          newClasses.write("  final ");
+          newClasses.write(param.type);
+          newClasses.write(param.hasQuestion ? '?' : '');
+          newClasses.write(' ');
+          newClasses.write(param.name);
+          newClasses.write(';\n');
+        }
+        newClasses.write('\n');
+        newClasses.write("  ${name}${typeStringCamel}"
+            "(ParserAstType type");
+        String separator = ", {";
+        for (int i = 0; i < parameters.length; i++) {
+          Parameter param = parameters[i];
+          newClasses.write(separator);
+          if (!param.hasQuestion) {
+            newClasses.write('required ');
+          }
+          newClasses.write('this.');
+          newClasses.write(param.name);
+          separator = ", ";
+        }
+        if (parameters.isNotEmpty) {
+          newClasses.write('}');
+        }
+        newClasses.write(') : super("$name", type);\n\n');
+        newClasses.writeln("@override");
+        newClasses.write("Map<String, Object?> get deprecatedArguments => {");
+        for (int i = 0; i < parameters.length; i++) {
+          Parameter param = parameters[i];
+          newClasses.write('"');
+          newClasses.write(param.name);
+          newClasses.write('": ');
+          newClasses.write(param.name);
+          newClasses.write(',');
+        }
+        newClasses.write("};\n");
+        newClasses.write("}\n");
+      }
+
+      sb.write("}");
+      sb.write("\n\n");
+
+      out.write(sb.toString());
+    }
+    end();
+  }
+
+  @override
+  void handleNoType(Token lastConsumed) {
+    latestSeenParameterTypeToken = null;
+    latestSeenParameterTypeTokenQuestion = null;
+  }
+
+  @override
+  void handleType(Token beginToken, Token? questionMark) {
+    latestSeenParameterTypeToken = beginToken.lexeme;
+    latestSeenParameterTypeTokenQuestion = questionMark?.lexeme;
+  }
+
+  @override
+  void endFormalParameter(
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
+      Token nameToken,
+      Token? initializerStart,
+      Token? initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
+    parameters.add(new Parameter(
+        nameToken.lexeme,
+        latestSeenParameterTypeToken ?? 'dynamic',
+        latestSeenParameterTypeTokenQuestion == null ? false : true));
+  }
+}
+
+class Parameter {
+  final String name;
+  final String type;
+  final bool hasQuestion;
+
+  Parameter(this.name, this.type, this.hasQuestion);
+}
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index 1e51b84..b03351a 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -28,6 +28,7 @@
 
 import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:front_end/src/api_prototype/file_system.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/api_prototype/standard_file_system.dart';
 import 'package:front_end/src/base/processed_options.dart';
@@ -160,8 +161,9 @@
     incrementalCompiler!.invalidate(processedOpts.packagesUri);
 
     Stopwatch stopwatch = new Stopwatch()..start();
-    kernel.Component component =
+    IncrementalCompilerResult compilerResult =
         await incrementalCompiler!.computeDelta(entryPoints: [uri]);
+    kernel.Component component = compilerResult.component;
     if (errors) {
       _print("Got errors in ${stopwatch.elapsedMilliseconds} ms.");
       return [
@@ -181,8 +183,9 @@
         .writeAsStringSync(mainFileContent);
 
     incrementalCompiler!.invalidate(dartDocMainUri);
-    kernel.Component componentMain = await incrementalCompiler!
+    IncrementalCompilerResult compilerMainResult = await incrementalCompiler!
         .computeDelta(entryPoints: [dartDocMainUri], fullComponent: true);
+    kernel.Component componentMain = compilerMainResult.component;
     if (errors) {
       _print("Got errors in ${stopwatch.elapsedMilliseconds} ms.");
       return [
@@ -794,38 +797,39 @@
 
   Future<kernel.Component> compileDartDocTestLibrary(
       String dartDocTestCode, Uri libraryUri) async {
-    assert(dillLoadedData != null && userCode != null);
+    assert(dillTargetForTesting != null && kernelTargetForTesting != null);
 
     return await context.runInContext((_) async {
-      LibraryBuilder libraryBuilder = userCode!.loader
-          .read(libraryUri, -1, accessor: userCode!.loader.first);
+      LibraryBuilder libraryBuilder =
+          kernelTargetForTesting!.loader.readAsEntryPoint(libraryUri);
 
-      userCode!.loader.resetSeenMessages();
+      kernelTargetForTesting!.loader.resetSeenMessages();
 
       _dartDocTestLibraryBuilder = libraryBuilder;
       _dartDocTestCode = dartDocTestCode;
 
       invalidate(dartDocTestUri);
-      kernel.Component result = await computeDelta(
+      IncrementalCompilerResult compilerResult = await computeDelta(
           entryPoints: [dartDocTestUri], fullComponent: true);
+      kernel.Component result = compilerResult.component;
       _dartDocTestLibraryBuilder = null;
       _dartDocTestCode = null;
 
-      userCode!.uriToSource.remove(dartDocTestUri);
-      userCode!.loader.sourceBytes.remove(dartDocTestUri);
+      kernelTargetForTesting!.uriToSource.remove(dartDocTestUri);
+      kernelTargetForTesting!.loader.sourceBytes.remove(dartDocTestUri);
 
       return result;
     });
   }
 
-  SourceLibraryBuilder createDartDocTestLibrary(LibraryBuilder libraryBuilder) {
+  SourceLibraryBuilder createDartDocTestLibrary(
+      SourceLoader loader, LibraryBuilder libraryBuilder) {
     SourceLibraryBuilder dartDocTestLibrary = new SourceLibraryBuilder(
-      dartDocTestUri,
-      dartDocTestUri,
-      /*packageUri*/ null,
-      new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
-      userCode!.loader,
-      null,
+      importUri: dartDocTestUri,
+      fileUri: dartDocTestUri,
+      packageLanguageVersion:
+          new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
+      loader: loader,
       scope: libraryBuilder.scope.createNestedScope("dartdoctest"),
       nameOrigin: libraryBuilder,
     );
@@ -893,23 +897,29 @@
 
   @override
   SourceLibraryBuilder createLibraryBuilder(
-      Uri uri,
-      Uri fileUri,
+      {required Uri importUri,
+      required Uri fileUri,
       Uri? packageUri,
-      LanguageVersion packageLanguageVersion,
+      required LanguageVersion packageLanguageVersion,
       SourceLibraryBuilder? origin,
       kernel.Library? referencesFrom,
-      bool? referenceIsPartOwner) {
-    if (uri == DocTestIncrementalCompiler.dartDocTestUri) {
-      HybridFileSystem hfs = compiler.userCode!.fileSystem as HybridFileSystem;
+      bool? referenceIsPartOwner}) {
+    if (importUri == DocTestIncrementalCompiler.dartDocTestUri) {
+      HybridFileSystem hfs = target.fileSystem as HybridFileSystem;
       MemoryFileSystem fs = hfs.memory;
       fs
           .entityForUri(DocTestIncrementalCompiler.dartDocTestUri)
           .writeAsStringSync(compiler._dartDocTestCode!);
-      return compiler
-          .createDartDocTestLibrary(compiler._dartDocTestLibraryBuilder!);
+      return compiler.createDartDocTestLibrary(
+          this, compiler._dartDocTestLibraryBuilder!);
     }
-    return super.createLibraryBuilder(uri, fileUri, packageUri,
-        packageLanguageVersion, origin, referencesFrom, referenceIsPartOwner);
+    return super.createLibraryBuilder(
+        importUri: importUri,
+        fileUri: fileUri,
+        packageUri: packageUri,
+        packageLanguageVersion: packageLanguageVersion,
+        origin: origin,
+        referencesFrom: referencesFrom,
+        referenceIsPartOwner: referenceIsPartOwner);
   }
 }
diff --git a/pkg/front_end/tool/generate_ast_coverage.dart b/pkg/front_end/tool/generate_ast_coverage.dart
index d3a299b..833e707 100644
--- a/pkg/front_end/tool/generate_ast_coverage.dart
+++ b/pkg/front_end/tool/generate_ast_coverage.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 'dart:io';
 
 import 'ast_model.dart';
@@ -21,7 +19,7 @@
   new File.fromUri(output).writeAsStringSync(result);
 }
 
-Future<String> generateAstCoverage(Uri repoDir, [AstModel astModel]) async {
+Future<String> generateAstCoverage(Uri repoDir, [AstModel? astModel]) async {
   astModel ??= await deriveAstModel(repoDir);
   return generateVisitor(astModel, new CoverageVisitorStrategy());
 }
@@ -47,7 +45,7 @@
 
   @override
   void handleVisit(AstModel astModel, AstClass astClass, StringBuffer sb) {
-    AstClass superAstClass = astClass.superclass;
+    AstClass? superAstClass = astClass.superclass;
     while (superAstClass != null && !superAstClass.isInterchangeable) {
       superAstClass = superAstClass.superclass;
     }
@@ -61,13 +59,13 @@
   @override
   void handleVisitReference(
       AstModel astModel, AstClass astClass, StringBuffer sb) {
-    AstClass superAstClass = astClass.superclass;
+    AstClass? superAstClass = astClass.superclass;
     while (superAstClass != null && !superAstClass.isInterchangeable) {
       superAstClass = superAstClass.superclass;
     }
     if (superAstClass == astModel.constantClass) {
       // Constants are only visited as references.
-      String innerName = superAstClass.name;
+      String innerName = superAstClass!.name;
       (nestedClassNames[innerName] ??= {}).add(astClass.name);
       sb.writeln('''
         visited.add(${innerName}Kind.${astClass.name});
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index e3dda75..6b91a96 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -125,7 +125,8 @@
   collector.start("Initial compilation");
   var generator = new IncrementalKernelGenerator(compilerOptions, entryUri);
 
-  var component = await generator.computeDelta();
+  var compilerResult = await generator.computeDelta();
+  var component = compilerResult.component;
   collector.stop("Initial compilation");
   if (verbose) {
     print("Libraries changed: ${component.libraries.length}");
@@ -139,7 +140,8 @@
     await applyEdits(
         changeSet.edits, overlayFs, generator, uriTranslator, verbose);
     collector.start(name);
-    component = await generator.computeDelta();
+    compilerResult = await generator.computeDelta();
+    component = compilerResult.component;
     collector.stop(name);
     if (verbose) {
       print("Change '${changeSet.name}' - "
diff --git a/pkg/front_end/tool/kernel_ast_file_rewriter.dart b/pkg/front_end/tool/kernel_ast_file_rewriter.dart
index 16f15e7..091640d 100644
--- a/pkg/front_end/tool/kernel_ast_file_rewriter.dart
+++ b/pkg/front_end/tool/kernel_ast_file_rewriter.dart
@@ -11,28 +11,27 @@
 import 'package:_fe_analyzer_shared/src/scanner/token.dart'
     show CommentToken, Token;
 
-import "package:front_end/src/fasta/util/direct_parser_ast.dart";
+import "package:front_end/src/fasta/util/parser_ast.dart";
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 void main(List<String> args) {
   Uri uri = Platform.script;
   uri = uri.resolve("../../kernel/lib/ast.dart");
   Uint8List bytes = new File.fromUri(uri).readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast =
+  CompilationUnitEnd ast =
       getAST(bytes, includeBody: true, includeComments: true);
-  Map<String, DirectParserASTContentTopLevelDeclarationEnd> classes = {};
-  for (DirectParserASTContentTopLevelDeclarationEnd cls in ast.getClasses()) {
-    DirectParserASTContentIdentifierHandle identifier = cls.getIdentifier();
+  Map<String, TopLevelDeclarationEnd> classes = {};
+  for (TopLevelDeclarationEnd cls in ast.getClasses()) {
+    IdentifierHandle identifier = cls.getIdentifier();
     assert(classes[identifier.token] == null);
     classes[identifier.token.toString()] = cls;
   }
 
   Set<String?> goodNames = {"TreeNode"};
   Map<Token, Replacement> replacements = {};
-  for (MapEntry<String, DirectParserASTContentTopLevelDeclarationEnd> entry
-      in classes.entries) {
-    DirectParserASTContentTopLevelDeclarationEnd cls = entry.value;
+  for (MapEntry<String, TopLevelDeclarationEnd> entry in classes.entries) {
+    TopLevelDeclarationEnd cls = entry.value;
 
     // Simple "class hierarchy" to only work on TreeNodes.
     if (goodNames.contains(entry.key)) {
@@ -40,7 +39,7 @@
     } else {
       // Check if good.
       String? parent = getExtends(cls);
-      DirectParserASTContentTopLevelDeclarationEnd? parentCls = classes[parent];
+      TopLevelDeclarationEnd? parentCls = classes[parent];
       List<String?> allParents = [parent];
       while (
           parent != null && parentCls != null && !goodNames.contains(parent)) {
@@ -55,18 +54,15 @@
       }
     }
 
-    DirectParserASTContentClassDeclarationEnd classDeclaration =
-        cls.getClassDeclaration();
-    DirectParserASTContentClassOrMixinOrExtensionBodyEnd classOrMixinBody =
+    ClassDeclarationEnd classDeclaration = cls.getClassDeclaration();
+    ClassOrMixinOrExtensionBodyEnd classOrMixinBody =
         classDeclaration.getClassOrMixinOrExtensionBody();
 
     Set<String> namedClassConstructors = {};
     Set<String> namedFields = {};
-    for (DirectParserASTContentMemberEnd member
-        in classOrMixinBody.getMembers()) {
+    for (MemberEnd member in classOrMixinBody.getMembers()) {
       if (member.isClassConstructor()) {
-        DirectParserASTContentClassConstructorEnd constructor =
-            member.getClassConstructor();
+        ClassConstructorEnd constructor = member.getClassConstructor();
         Token nameToken = constructor.beginToken;
         // String name = nameToken.lexeme;
         if (nameToken.next!.lexeme == ".") {
@@ -78,9 +74,8 @@
           throw "Unexpected";
         }
       } else if (member.isClassFields()) {
-        DirectParserASTContentClassFieldsEnd classFields =
-            member.getClassFields();
-        Token identifierToken = classFields.getFieldIdentifiers().single!.token;
+        ClassFieldsEnd classFields = member.getClassFields();
+        Token identifierToken = classFields.getFieldIdentifiers().single.token;
         String identifier = identifierToken.toString();
         namedFields.add(identifier);
       }
@@ -94,8 +89,7 @@
           classBraceToken, classBraceToken, "{\n  bool frozen = false;");
     }
 
-    for (DirectParserASTContentMemberEnd member
-        in classOrMixinBody.getMembers()) {
+    for (MemberEnd member in classOrMixinBody.getMembers()) {
       if (member.isClassConstructor()) {
         processConstructor(
             member, replacements, namedClassConstructors, namedFields);
@@ -143,16 +137,16 @@
 }
 
 void processField(
-    DirectParserASTContentMemberEnd member,
-    MapEntry<String, DirectParserASTContentTopLevelDeclarationEnd> entry,
+    MemberEnd member,
+    MapEntry<String, TopLevelDeclarationEnd> entry,
     Map<Token, Replacement> replacements) {
-  DirectParserASTContentClassFieldsEnd classFields = member.getClassFields();
+  ClassFieldsEnd classFields = member.getClassFields();
 
   if (classFields.count != 1) {
     throw "Notice ${classFields.count}";
   }
 
-  Token identifierToken = classFields.getFieldIdentifiers().single!.token;
+  Token identifierToken = classFields.getFieldIdentifiers().single.token;
   String identifier = identifierToken.toString();
 
   if (identifier == "frozen" && entry.key == "TreeNode") return;
@@ -165,7 +159,7 @@
     isFinal = true;
   }
 
-  DirectParserASTContentTypeHandle? type = classFields.getFirstType();
+  TypeHandle? type = classFields.getFirstType();
   String typeString = "dynamic";
   if (type != null) {
     Token token = type.beginToken;
@@ -177,8 +171,7 @@
     typeString = typeString.trim();
   }
 
-  DirectParserASTContentFieldInitializerEnd? initializer =
-      classFields.getFieldInitializer();
+  FieldInitializerEnd? initializer = classFields.getFieldInitializer();
   String initializerString = "";
   if (initializer != null) {
     Token token = initializer.assignment;
@@ -240,19 +233,13 @@
   }
 }
 
-void processConstructor(
-    DirectParserASTContentMemberEnd member,
-    Map<Token, Replacement> replacements,
-    Set<String> namedClassConstructors,
-    Set<String> namedFields) {
-  DirectParserASTContentClassConstructorEnd constructor =
-      member.getClassConstructor();
-  DirectParserASTContentFormalParametersEnd formalParameters =
-      constructor.getFormalParameters();
-  List<DirectParserASTContentFormalParameterEnd> parameters =
-      formalParameters.getFormalParameters();
+void processConstructor(MemberEnd member, Map<Token, Replacement> replacements,
+    Set<String> namedClassConstructors, Set<String> namedFields) {
+  ClassConstructorEnd constructor = member.getClassConstructor();
+  FormalParametersEnd formalParameters = constructor.getFormalParameters();
+  List<FormalParameterEnd> parameters = formalParameters.getFormalParameters();
 
-  for (DirectParserASTContentFormalParameterEnd parameter in parameters) {
+  for (FormalParameterEnd parameter in parameters) {
     Token token = parameter.getBegin().token;
     if (token.lexeme != "this") {
       continue;
@@ -262,14 +249,14 @@
     replacements[afterDot] = new Replacement(afterDot, afterDot, "_$afterDot");
   }
 
-  DirectParserASTContentOptionalFormalParametersEnd? optionalFormalParameters =
+  OptionalFormalParametersEnd? optionalFormalParameters =
       formalParameters.getOptionalFormalParameters();
   Set<String> addInitializers = {};
   if (optionalFormalParameters != null) {
-    List<DirectParserASTContentFormalParameterEnd> parameters =
+    List<FormalParameterEnd> parameters =
         optionalFormalParameters.getFormalParameters();
 
-    for (DirectParserASTContentFormalParameterEnd parameter in parameters) {
+    for (FormalParameterEnd parameter in parameters) {
       Token token = parameter.getBegin().token;
       if (token.lexeme != "this") {
         continue;
@@ -284,15 +271,12 @@
     }
   }
 
-  DirectParserASTContentInitializersEnd? initializers =
-      constructor.getInitializers();
+  InitializersEnd? initializers = constructor.getInitializers();
 
   // First patch up any existing initializers.
   if (initializers != null) {
-    List<DirectParserASTContentInitializerEnd> actualInitializers =
-        initializers.getInitializers();
-    for (DirectParserASTContentInitializerEnd initializer
-        in actualInitializers) {
+    List<InitializerEnd> actualInitializers = initializers.getInitializers();
+    for (InitializerEnd initializer in actualInitializers) {
       Token token = initializer.getBegin().token;
       // This is only afterDot if there's a dot --- which (probably) is
       // only there if there's a `this`.
@@ -318,8 +302,8 @@
       } else if (token.lexeme == "super") {
         // Don't try to patch this one.
       } else if (token.lexeme == "assert") {
-        List<DirectParserASTContentIdentifierHandle> identifiers = initializer
-            .recursivelyFind<DirectParserASTContentIdentifierHandle>();
+        List<IdentifierHandle> identifiers =
+            initializer.recursivelyFind<IdentifierHandle>();
         for (Token token in identifiers.map((e) => e.token)) {
           if (namedFields.contains(token.lexeme)) {
             replacements[token] = new Replacement(token, token, "_$token");
@@ -345,7 +329,7 @@
   } else if (addInitializers.isNotEmpty) {
     // Add to existing initializer list. We add them as the first one(s)
     // so we don't have to insert before the potential super call.
-    DirectParserASTContentInitializersBegin firstOne = initializers!.getBegin();
+    InitializersBegin firstOne = initializers!.getBegin();
     Token colon = firstOne.token;
     assert(colon.lexeme == ":");
     String initializerString =
@@ -365,13 +349,12 @@
   //    C(this.field1) : field2 = field1 + 1;
   //  }
   if (addInitializers.isNotEmpty) {
-    DirectParserASTContentBlockFunctionBodyEnd? blockFunctionBody =
+    BlockFunctionBodyEnd? blockFunctionBody =
         constructor.getBlockFunctionBody();
     if (blockFunctionBody != null) {
-      List<DirectParserASTContentIdentifierHandle> identifiers =
-          blockFunctionBody
-              .recursivelyFind<DirectParserASTContentIdentifierHandle>();
-      for (DirectParserASTContentIdentifierHandle identifier in identifiers) {
+      List<IdentifierHandle> identifiers =
+          blockFunctionBody.recursivelyFind<IdentifierHandle>();
+      for (IdentifierHandle identifier in identifiers) {
         Token token = identifier.token;
         IdentifierContext context = identifier.context;
         if (namedFields.contains(token.lexeme) &&
@@ -395,12 +378,10 @@
   Replacement(this.beginToken, this.endToken, this.replacement);
 }
 
-String? getExtends(DirectParserASTContentTopLevelDeclarationEnd cls) {
-  DirectParserASTContentClassDeclarationEnd classDeclaration =
-      cls.getClassDeclaration();
+String? getExtends(TopLevelDeclarationEnd cls) {
+  ClassDeclarationEnd classDeclaration = cls.getClassDeclaration();
 
-  DirectParserASTContentClassExtendsHandle classExtends =
-      classDeclaration.getClassExtends();
+  ClassExtendsHandle classExtends = classDeclaration.getClassExtends();
   Token? extendsKeyword = classExtends.extendsKeyword;
   if (extendsKeyword == null) {
     return null;
@@ -409,15 +390,14 @@
   }
 }
 
-void debugDumpNode(DirectParserASTContent node) {
+void debugDumpNode(ParserAstNode node) {
   node.children!.forEach((element) {
     print("${element.what} (${element.deprecatedArguments}) "
         "(${element.children})");
   });
 }
 
-void debugDumpNodeRecursively(DirectParserASTContent node,
-    {String indent = ""}) {
+void debugDumpNodeRecursively(ParserAstNode node, {String indent = ""}) {
   print("$indent${node.what} (${node.deprecatedArguments})");
   if (node.children == null) return;
   node.children!.forEach((element) {
diff --git a/pkg/front_end/tool/parser_direct_ast/viewer.dart b/pkg/front_end/tool/parser_direct_ast/viewer.dart
index aeee1b5..8650f0f 100644
--- a/pkg/front_end/tool/parser_direct_ast/viewer.dart
+++ b/pkg/front_end/tool/parser_direct_ast/viewer.dart
@@ -5,9 +5,9 @@
 import "dart:io" show File, Platform;
 import "dart:typed_data" show Uint8List;
 
-import "package:front_end/src/fasta/util/direct_parser_ast.dart" show getAST;
-import "package:front_end/src/fasta/util/direct_parser_ast_helper.dart"
-    show DirectParserASTContent, DirectParserASTType;
+import "package:front_end/src/fasta/util/parser_ast.dart" show getAST;
+import "package:front_end/src/fasta/util/parser_ast_helper.dart"
+    show ParserAstNode, ParserAstType;
 
 import "console_helper.dart";
 
@@ -17,7 +17,7 @@
     uri = Uri.base.resolve(args.first);
   }
   Uint8List bytes = new File.fromUri(uri).readAsBytesSync();
-  DirectParserASTContent ast = getAST(bytes);
+  ParserAstNode ast = getAST(bytes, enableExtensionMethods: true);
 
   Widget widget = new QuitOnQWidget(
     new WithSingleLineBottomWidget(
@@ -33,7 +33,7 @@
 
 class PrintedLine {
   final String text;
-  final DirectParserASTContent? ast;
+  final ParserAstNode? ast;
   final List<PrintedLine>? parentShown;
   final int? selected;
 
@@ -53,21 +53,21 @@
   late List<PrintedLine> shown;
   int selected = 0;
 
-  AstWidget(DirectParserASTContent ast) {
+  AstWidget(ParserAstNode ast) {
     shown = [new PrintedLine.ast(ast, textualize(ast))];
   }
 
-  String textualize(DirectParserASTContent element,
+  String textualize(ParserAstNode element,
       {bool indent: false, bool withEndHeader: false}) {
     String header;
     switch (element.type) {
-      case DirectParserASTType.BEGIN:
+      case ParserAstType.BEGIN:
         header = "begin";
         break;
-      case DirectParserASTType.HANDLE:
+      case ParserAstType.HANDLE:
         header = "handle";
         break;
-      case DirectParserASTType.END:
+      case ParserAstType.END:
         header = withEndHeader ? "end" : "";
         break;
     }
@@ -114,7 +114,7 @@
       selected = selectedElement.selected!;
     } else {
       shown = [new PrintedLine.parent(shown, selected)];
-      List<DirectParserASTContent>? children = selectedElement.ast!.children;
+      List<ParserAstNode>? children = selectedElement.ast!.children;
       if (children != null) {
         for (int i = 0; i < children.length; i++) {
           shown.add(new PrintedLine.ast(
diff --git a/pkg/front_end/tool/update_expectations.dart b/pkg/front_end/tool/update_expectations.dart
index 45d7ef3..8a99e2e 100644
--- a/pkg/front_end/tool/update_expectations.dart
+++ b/pkg/front_end/tool/update_expectations.dart
@@ -8,6 +8,7 @@
   'weak',
   'outline',
   'strong',
+  'modular',
   'text_serialization',
   'textual_outline',
 ];
diff --git a/pkg/frontend_server/lib/compute_kernel.dart b/pkg/frontend_server/lib/compute_kernel.dart
index a75573e..3fd7f05 100644
--- a/pkg/frontend_server/lib/compute_kernel.dart
+++ b/pkg/frontend_server/lib/compute_kernel.dart
@@ -15,6 +15,7 @@
 import 'package:build_integration/file_system/multi_root.dart';
 import 'package:compiler/src/kernel/dart2js_target.dart';
 import 'package:dev_compiler/src/kernel/target.dart';
+import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_unstable/bazel_worker.dart' as fe;
 import 'package:kernel/ast.dart' show Component, Library, Reference;
 import 'package:kernel/target/targets.dart';
@@ -56,12 +57,17 @@
       defaultsTo: true,
       negatable: true,
       help: 'Whether to only build summary files.')
+  ..addFlag('summary',
+      defaultsTo: true,
+      negatable: true,
+      help: 'Whether or not to build summary files.')
   ..addOption('target',
       allowed: const [
         'vm',
         'flutter',
         'flutter_runner',
         'dart2js',
+        'dart2js_summary',
         'ddc',
       ],
       help: 'Build kernel for the vm, flutter, flutter_runner, dart2js or ddc')
@@ -136,6 +142,10 @@
       ? fe.NnbdMode.Strong
       : fe.NnbdMode.Weak;
   var summaryOnly = parsedArgs['summary-only'] as bool;
+  var summary = parsedArgs['summary'] as bool;
+  if (summaryOnly && !summary) {
+    throw new ArgumentError('--summary-only conflicts with --no-summary');
+  }
   var trackWidgetCreation = parsedArgs['track-widget-creation'] as bool;
 
   // TODO(sigmund,jakemac): make target mandatory. We allow null to be backwards
@@ -174,6 +184,14 @@
             'error: --summary-only not supported for the dart2js target');
       }
       break;
+    case 'dart2js_summary':
+      target = new Dart2jsSummaryTarget(
+          'dart2js', sources, excludeNonSources, targetFlags);
+      if (!summaryOnly) {
+        out.writeln(
+            'error: --no-summary-only not supported for the dart2js summary target');
+      }
+      break;
     case 'ddc':
       // TODO(jakemac):If `generateKernel` changes to return a summary
       // component, process the component instead.
@@ -268,12 +286,16 @@
   bool wroteUsedDills = false;
   if (usingIncrementalCompiler) {
     state.options.onDiagnostic = onDiagnostic;
-    Component incrementalComponent = await state.incrementalCompiler
-        .computeDelta(entryPoints: sources, fullComponent: true);
+    IncrementalCompilerResult incrementalCompilerResult =
+        await state.incrementalCompiler.computeDelta(
+            entryPoints: sources,
+            fullComponent: true,
+            trackNeededDillLibraries: recordUsedInputs);
+    Component incrementalComponent = incrementalCompilerResult.component;
 
     if (recordUsedInputs) {
       Set<Uri> usedOutlines = {};
-      for (Library lib in state.incrementalCompiler.neededDillLibraries) {
+      for (Library lib in incrementalCompilerResult.neededDillLibraries) {
         if (lib.importUri.scheme == "dart") continue;
         Uri uri = state.libraryToInputDill[lib.importUri];
         if (uri == null) {
@@ -312,8 +334,8 @@
     kernel = await fe.compileSummary(state, sources, onDiagnostic,
         includeOffsets: false);
   } else {
-    Component component =
-        await fe.compileComponent(state, sources, onDiagnostic);
+    Component component = await fe
+        .compileComponent(state, sources, onDiagnostic, buildSummary: summary);
     kernel = fe.serializeComponent(component,
         filter: excludeNonSources
             ? (library) => sources.contains(library.importUri)
@@ -358,47 +380,13 @@
   }
 }
 
-/// Extends the DevCompilerTarget to transform outlines to meet the requirements
-/// of summaries in bazel and package-build.
-///
-/// Build systems like package-build may provide the same input file twice to
-/// the summary worker, but only intends to have it in one output summary.  The
-/// convention is that if it is listed as a source, it is intended to be part of
-/// the output, if the source file was loaded as a dependency, then it was
-/// already included in a different summary.  The transformation below ensures
-/// that the output summary doesn't include those implicit inputs.
-///
-/// Note: this transformation is destructive and is only intended to be used
-/// when generating summaries.
-class DevCompilerSummaryTarget extends DevCompilerTarget {
+class DevCompilerSummaryTarget extends DevCompilerTarget with SummaryMixin {
   final List<Uri> sources;
   final bool excludeNonSources;
 
   DevCompilerSummaryTarget(
       this.sources, this.excludeNonSources, TargetFlags targetFlags)
       : super(targetFlags);
-
-  @override
-  void performOutlineTransformations(Component component) {
-    super.performOutlineTransformations(component);
-    if (!excludeNonSources) return;
-
-    List<Library> libraries = new List.from(component.libraries);
-    component.libraries.clear();
-    Set<Uri> include = sources.toSet();
-    for (var lib in libraries) {
-      if (include.contains(lib.importUri)) {
-        component.libraries.add(lib);
-      } else {
-        // Excluding the library also means that their canonical names will not
-        // be computed as part of serialization, so we need to do that
-        // preemtively here to avoid errors when serializing references to
-        // elements of these libraries.
-        component.root.getChildFromUri(lib.importUri).bindTo(lib.reference);
-        lib.computeCanonicalNames();
-      }
-    }
-  }
 }
 
 Uri toUri(String uriString) {
diff --git a/pkg/frontend_server/lib/frontend_server.dart b/pkg/frontend_server/lib/frontend_server.dart
index 9545afb..7563736 100644
--- a/pkg/frontend_server/lib/frontend_server.dart
+++ b/pkg/frontend_server/lib/frontend_server.dart
@@ -55,6 +55,9 @@
       help:
           'Enable global type flow analysis and related transformations in AOT mode.',
       defaultsTo: false)
+  ..addFlag('rta',
+      help: 'Use rapid type analysis for faster compilation in AOT mode.',
+      defaultsTo: true)
   ..addFlag('tree-shake-write-only-fields',
       help: 'Enable tree shaking of fields which are only written in AOT mode.',
       defaultsTo: true)
@@ -111,6 +114,13 @@
           'initialize from, but it can be overwritten here.',
       defaultsTo: null,
       hide: true)
+  ..addFlag('assume-initialize-from-dill-up-to-date',
+      help: 'Normally the dill used for initializing is checked against the '
+          "files it was compiled against. If we somehow know that it's "
+          'up-to-date we can skip it safely. Under normal circumstances this '
+          "isn't safe though.",
+      defaultsTo: false,
+      hide: true)
   ..addMultiOption('define',
       abbr: 'D',
       help: 'The values for the environment constants (e.g. -Dkey=value).',
@@ -357,6 +367,7 @@
   String _kernelBinaryFilenameIncremental;
   String _kernelBinaryFilenameFull;
   String _initializeFromDill;
+  bool _assumeInitializeFromDillUpToDate;
 
   Set<Uri> previouslyReportedDependencies = Set<Uri>();
 
@@ -412,6 +423,8 @@
     _kernelBinaryFilename = _kernelBinaryFilenameFull;
     _initializeFromDill =
         _options['initialize-from-dill'] ?? _kernelBinaryFilenameFull;
+    _assumeInitializeFromDillUpToDate =
+        _options['assume-initialize-from-dill-up-to-date'] ?? false;
     _printIncrementalDependencies = _options['print-incremental-dependencies'];
     final String boundaryKey = Uuid().generateV4();
     _outputStream.writeln('result $boundaryKey');
@@ -517,13 +530,14 @@
       _compilerOptions.omitPlatform = false;
       _generator = generator ?? _createGenerator(Uri.file(_initializeFromDill));
       await invalidateIfInitializingFromDill();
-      Component component =
+      IncrementalCompilerResult compilerResult =
           await _runWithPrintRedirection(() => _generator.compile());
+      Component component = compilerResult.component;
       results = KernelCompilationResults(
           component,
           const {},
-          _generator.getClassHierarchy(),
-          _generator.getCoreTypes(),
+          compilerResult.classHierarchy,
+          compilerResult.coreTypes,
           component.uriToSource.keys);
 
       incrementalSerializer = _generator.incrementalSerializer;
@@ -544,6 +558,7 @@
           deleteToStringPackageUris: options['delete-tostring-package-uri'],
           aot: options['aot'],
           useGlobalTypeFlowAnalysis: options['tfa'],
+          useRapidTypeAnalysis: options['rta'],
           environmentDefines: environmentDefines,
           enableAsserts: options['enable-asserts'],
           useProtobufTreeShakerV2: options['protobuf-tree-shaker-v2'],
@@ -706,6 +721,7 @@
   }
 
   Future<Null> invalidateIfInitializingFromDill() async {
+    if (_assumeInitializeFromDillUpToDate) return null;
     if (_kernelBinaryFilename != _kernelBinaryFilenameFull) return null;
     // If the generator is initialized, it's not going to initialize from dill
     // again anyway, so there's no reason to spend time invalidating what should
@@ -772,7 +788,9 @@
     }
     errors.clear();
 
-    Component deltaProgram = await _generator.compile(entryPoint: _mainSource);
+    IncrementalCompilerResult deltaProgramResult =
+        await _generator.compile(entryPoint: _mainSource);
+    Component deltaProgram = deltaProgramResult.component;
     if (deltaProgram != null && transformer != null) {
       transformer.transform(deltaProgram);
     }
@@ -780,8 +798,8 @@
     KernelCompilationResults results = KernelCompilationResults(
         deltaProgram,
         const {},
-        _generator.getClassHierarchy(),
-        _generator.getCoreTypes(),
+        deltaProgramResult.classHierarchy,
+        deltaProgramResult.coreTypes,
         deltaProgram.uriToSource.keys);
 
     if (_compilerOptions.target.name == 'dartdevc') {
@@ -860,7 +878,8 @@
         .logMs('Compiling expression to JavaScript in $moduleName');
 
     final kernel2jsCompiler = cachedProgramCompilers[moduleName];
-    Component component = _generator.lastKnownGoodComponent;
+    IncrementalCompilerResult compilerResult = _generator.lastKnownGoodResult;
+    Component component = compilerResult.component;
     component.computeCanonicalNames();
 
     _processedOptions.ticker.logMs('Computed component');
@@ -1044,9 +1063,9 @@
     }
     final String singleModifiedClassName =
         _widgetCache.checkSingleWidgetTypeModified(
-      _generator.lastKnownGoodComponent,
+      _generator.lastKnownGoodResult?.component,
       partialComponent,
-      _generator.getClassHierarchy(),
+      _generator.lastKnownGoodResult?.classHierarchy,
     );
     final File outputFile = File('$_kernelBinaryFilename.widget_cache');
     if (singleModifiedClassName != null) {
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index a586bf7..35f6315 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -3,6 +3,7 @@
 import 'dart:io';
 import 'dart:isolate';
 
+import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/ast.dart' show Component;
 import 'package:kernel/kernel.dart' show loadComponentFromBinary;
@@ -420,10 +421,12 @@
 
       final _MockedIncrementalCompiler generator = _MockedIncrementalCompiler();
       when(generator.initialized).thenAnswer((_) => false);
-      when(generator.compile())
-          .thenAnswer((_) => Future<Component>.value(Component()));
-      when(generator.compile(entryPoint: anyNamed("entryPoint")))
-          .thenAnswer((_) => Future<Component>.value(Component()));
+      when(generator.compile()).thenAnswer((_) =>
+          Future<IncrementalCompilerResult>.value(
+              IncrementalCompilerResult(Component())));
+      when(generator.compile(entryPoint: anyNamed("entryPoint"))).thenAnswer(
+          (_) => Future<IncrementalCompilerResult>.value(
+              IncrementalCompilerResult(Component())));
       final _MockedBinaryPrinterFactory printerFactory =
           _MockedBinaryPrinterFactory();
       when(printerFactory.newBinaryPrinter(any))
diff --git a/pkg/js/CHANGELOG.md b/pkg/js/CHANGELOG.md
index 571726d..8c22600 100644
--- a/pkg/js/CHANGELOG.md
+++ b/pkg/js/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.6.4
+
+* Includes `@staticInterop` to allow interop with native types from `dart:html`.
+
 ## 0.6.3
 
 * Stable release for null safety.
diff --git a/pkg/js/README.md b/pkg/js/README.md
index 7279082..4f75675 100644
--- a/pkg/js/README.md
+++ b/pkg/js/README.md
@@ -131,6 +131,48 @@
 }
 ```
 
+## Interop with native types using `@staticInterop`
+
+Previously, you could not use `@JS()` or `@anonymous` types to interface with
+native types that were reserved within `dart:html` e.g. `Window`.
+
+Using `@staticInterop` will now let you do so. However, it requires that there
+be no instance members within the class (constructors are still allowed). You
+can use static extension methods instead to declare these members. For example:
+
+```dart
+@JS()
+library static_interop;
+
+import 'dart:html' as html;
+
+import 'package:js/js.dart';
+
+@JS()
+@staticInterop
+class JSWindow {}
+
+extension JSWindowExtension on JSWindow {
+  external String get name;
+  String get nameAllCaps => name.toUpperCase();
+}
+
+void main() {
+  var jsWindow = html.window as JSWindow;
+  print(jsWindow.name.toUpperCase() == jsWindow.nameAllCaps);
+}
+```
+
+Note that in the above you can have both `external` and non-`external` members
+in the extension. You can have `external` variables, getters/setters, and
+methods within a static extension currently. These `external` members are
+lowered to their respective `js_util` calls under the hood. For example, the
+`external` `name` getter is equivalent to `js_util.getProperty(this, 'name')`.
+
+In general, it's advised to use `@staticInterop` wherever you can over using
+just `@JS()`. There will be fewer surprises and it's aligned with the statically
+typed future planned for JS interop.
+
 ## Reporting issues
 
 Please file bugs and feature requests on the [SDK issue tracker][issues].
diff --git a/pkg/js/analysis_options.yaml b/pkg/js/analysis_options.yaml
index afaa4eb..21a6ace 100644
--- a/pkg/js/analysis_options.yaml
+++ b/pkg/js/analysis_options.yaml
@@ -1,8 +1,8 @@
 include: package:pedantic/analysis_options.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
 
 linter:
   rules:
diff --git a/pkg/js/lib/js.dart b/pkg/js/lib/js.dart
index 1c099c3..5f41532 100644
--- a/pkg/js/lib/js.dart
+++ b/pkg/js/lib/js.dart
@@ -25,9 +25,9 @@
   const _Anonymous();
 }
 
-// class _StaticInterop {
-//   const _StaticInterop();
-// }
+class _StaticInterop {
+  const _StaticInterop();
+}
 
 /// An annotation that indicates a [JS] annotated class is structural and does
 /// not have a known JavaScript prototype.
@@ -44,6 +44,4 @@
 /// These classes allow interop with native types, like the ones in `dart:html`.
 /// These classes should not contain any instance members, inherited or
 /// otherwise, and should instead use static extension members.
-// TODO(47324, 47325): Uncomment these annotations once erasure and subtyping
-// are ready.
-// const _StaticInterop staticInterop = _StaticInterop();
+const _StaticInterop staticInterop = _StaticInterop();
diff --git a/pkg/js/pubspec.yaml b/pkg/js/pubspec.yaml
index 44b80a9..40fde9c 100644
--- a/pkg/js/pubspec.yaml
+++ b/pkg/js/pubspec.yaml
@@ -1,10 +1,10 @@
 name: js
-version: 0.6.3
+version: 0.6.4
 description: Annotations to create static Dart interfaces for JavaScript APIs.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/js
 
 environment:
-  sdk: ">=2.12.0-0 <3.0.0"
+  sdk: ">=2.16.0-100.0.dev <3.0.0"
 
 dev_dependencies:
   pedantic: ^1.9.0
diff --git a/pkg/js_ast/lib/src/nodes.dart b/pkg/js_ast/lib/src/nodes.dart
index b84ef51..56a2b40 100644
--- a/pkg/js_ast/lib/src/nodes.dart
+++ b/pkg/js_ast/lib/src/nodes.dart
@@ -85,13 +85,11 @@
   T visitInterpolatedDeclaration(InterpolatedDeclaration node);
 }
 
-class BaseVisitor<T> implements NodeVisitor<T> {
+abstract class BaseVisitor<T> implements NodeVisitor<T> {
   const BaseVisitor();
 
-  T visitNode(Node node) {
-    node.visitChildren(this);
-    return null;
-  }
+  T visitNode(Node node);
+  T visitComment(Comment node);
 
   T visitProgram(Program node) => visitNode(node);
 
@@ -198,13 +196,19 @@
     return visitInterpolatedNode(node);
   }
 
-  // Ignore comments by default.
-  T visitComment(Comment node) => null;
-
   T visitAwait(Await node) => visitExpression(node);
   T visitDartYield(DartYield node) => visitStatement(node);
 }
 
+class BaseVisitorVoid extends BaseVisitor<void> {
+  void visitNode(Node node) {
+    node.visitChildren(this);
+  }
+
+  // Ignore comments by default.
+  void visitComment(Comment node) {}
+}
+
 abstract class NodeVisitor1<R, A> {
   R visitProgram(Program node, A arg);
 
@@ -286,13 +290,11 @@
   R visitInterpolatedDeclaration(InterpolatedDeclaration node, A arg);
 }
 
-class BaseVisitor1<R, A> implements NodeVisitor1<R, A> {
+abstract class BaseVisitor1<R, A> implements NodeVisitor1<R, A> {
   const BaseVisitor1();
 
-  R visitNode(Node node, A arg) {
-    node.visitChildren1(this, arg);
-    return null;
-  }
+  R visitNode(Node node, A arg);
+  R visitComment(Comment node, A arg);
 
   R visitProgram(Program node, A arg) => visitNode(node, arg);
 
@@ -412,13 +414,19 @@
     return visitInterpolatedNode(node, arg);
   }
 
-  // Ignore comments by default.
-  R visitComment(Comment node, A arg) => null;
-
   R visitAwait(Await node, A arg) => visitExpression(node, arg);
   R visitDartYield(DartYield node, A arg) => visitStatement(node, arg);
 }
 
+class BaseVisitor1Void<A> extends BaseVisitor1<void, A> {
+  void visitNode(Node node, A arg) {
+    node.visitChildren1(this, arg);
+  }
+
+  // Ignore comments by default.
+  void visitComment(Comment node, A arg) {}
+}
+
 /// This tag interface has no behaviour but must be implemented by any class
 /// that is to be stored on a [Node] as source information.
 abstract class JavaScriptNodeSourceInformation {
@@ -436,12 +444,12 @@
   R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg);
   void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg);
 
-  // Shallow clone of node.  Does not clone positions since the only use of this
-  // private method is create a copy with a new position.
+  /// Shallow clone of node.  Does not clone positions since the only use of
+  /// this private method is create a copy with a new position.
   Node _clone();
 
-  // Returns a node equivalent to [this], but with new source position and end
-  // source position.
+  /// Returns a node equivalent to [this], but with new source position and end
+  /// source position.
   Node withSourceInformation(
       JavaScriptNodeSourceInformation sourceInformation) {
     if (sourceInformation == _sourceInformation) {
@@ -456,13 +464,23 @@
 
   bool get isCommaOperator => false;
 
-  bool get isFinalized => true;
-
   Statement toStatement() {
     throw UnsupportedError('toStatement');
   }
 
   String debugPrint() => DebugPrint(this);
+
+  /// Some nodes, e.g. DeferredExpression, become finalized in a 'linking'
+  /// phase.
+  bool get isFinalized => true;
+
+  /// If a node is not finalized, debug printing can print something indicative
+  /// of the node instead of the finalized AST. This method returns the
+  /// replacement text.
+  String nonfinalizedDebugText() {
+    assert(!isFinalized);
+    return '$runtimeType';
+  }
 }
 
 class Program extends Node {
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index 5c5620e..d5eb576 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -45,6 +45,10 @@
   /// [enterNode] is called in post-traversal order.
   void exitNode(
       Node node, int startPosition, int endPosition, int closingPosition) {}
+
+  /// Should return `true` if the printing tolerates unfinalized deferred AST
+  /// nodes.
+  bool get isDebugContext => false;
 }
 
 /// A simple implementation of [JavaScriptPrintingContext] suitable for tests.
@@ -58,9 +62,13 @@
   String getText() => buffer.toString();
 }
 
+class _DebugJavaScriptPrintingContext extends SimpleJavaScriptPrintingContext {
+  bool get isDebugContext => true;
+}
+
 String DebugPrint(Node node, {bool utf8 = false}) {
   JavaScriptPrintingOptions options = JavaScriptPrintingOptions(utf8: utf8);
-  SimpleJavaScriptPrintingContext context = SimpleJavaScriptPrintingContext();
+  SimpleJavaScriptPrintingContext context = _DebugJavaScriptPrintingContext();
   Printer printer = Printer(options, context);
   printer.visit(node);
   return context.getText();
@@ -72,6 +80,7 @@
   final bool shouldCompressOutput;
   final DanglingElseVisitor danglingElseVisitor;
   final LocalNamer localNamer;
+  final bool isDebugContext;
 
   int _charCount = 0;
   bool inForInit = false;
@@ -90,6 +99,7 @@
   Printer(JavaScriptPrintingOptions options, JavaScriptPrintingContext context)
       : options = options,
         context = context,
+        isDebugContext = context.isDebugContext,
         shouldCompressOutput = options.shouldCompressOutput,
         danglingElseVisitor = DanglingElseVisitor(context),
         localNamer = determineRenamer(
@@ -220,7 +230,9 @@
   void startNode(Node node) {
     currentNode = EnterExitNode(currentNode, node);
     if (node is DeferredExpression) {
-      startNode(node.value);
+      if (!isDebugContext || node.isFinalized) {
+        startNode(node.value);
+      }
     }
   }
 
@@ -230,7 +242,9 @@
 
   void endNode(Node node) {
     if (node is DeferredExpression) {
-      endNode(node.value);
+      if (!isDebugContext || node.isFinalized) {
+        endNode(node.value);
+      }
     }
     assert(currentNode.node == node);
     currentNode = currentNode.exitNode(context, _charCount);
@@ -259,6 +273,12 @@
     nodes.forEach(visit);
   }
 
+  Node _undefer(Node node) {
+    if (isDebugContext && !node.isFinalized) return node;
+    if (node is DeferredExpression) return _undefer(node.value);
+    return node;
+  }
+
   @override
   void visitProgram(Program program) {
     if (program.body.isNotEmpty) {
@@ -657,10 +677,12 @@
 
   visitNestedExpression(Expression node, int requiredPrecedence,
       {bool newInForInit, bool newAtStatementBegin}) {
+    int precedenceLevel =
+        (isDebugContext && !node.isFinalized) ? CALL : node.precedenceLevel;
     bool needsParentheses =
         // a - (b + c).
         (requiredPrecedence != EXPRESSION &&
-                node.precedenceLevel < requiredPrecedence) ||
+                precedenceLevel < requiredPrecedence) ||
             // for (a = (x in o); ... ; ... ) { ... }
             (newInForInit && node is Binary && node.op == "in") ||
             // (function() { ... })().
@@ -720,9 +742,10 @@
     }
   }
 
-  static bool _isSmallInitialization(Node node) {
+  bool _isSmallInitialization(Node node) {
     if (node is VariableInitialization) {
-      Node value = undefer(node.value);
+      if (node.value == null) return true;
+      Node value = _undefer(node.value);
       if (value == null) return true;
       if (value is This) return true;
       if (value is LiteralNull) return true;
@@ -755,8 +778,9 @@
     /// `++a` and `a += b` in the face of [DeferredExpression]s we detect the
     /// pattern of the undeferred assignment.
     String op = assignment.op;
-    Node leftHandSide = undefer(assignment.leftHandSide);
-    Node rightHandSide = undefer(assignment.value);
+    Node leftHandSide = _undefer(assignment.leftHandSide);
+    Node value = assignment.value;
+    Node rightHandSide = value == null ? value : _undefer(value);
     if ((op == '+' || op == '-') &&
         leftHandSide is VariableUse &&
         rightHandSide is LiteralNumber &&
@@ -768,8 +792,8 @@
     if (!assignment.isCompound &&
         leftHandSide is VariableUse &&
         rightHandSide is Binary) {
-      Node rLeft = undefer(rightHandSide.left);
-      Node rRight = undefer(rightHandSide.right);
+      Node rLeft = _undefer(rightHandSide.left);
+      Node rRight = _undefer(rightHandSide.right);
       String op = rightHandSide.op;
       if (op == '+' ||
           op == '-' ||
@@ -804,12 +828,12 @@
     }
     visitNestedExpression(assignment.leftHandSide, CALL,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
-    if (assignment.value != null) {
+    if (value != null) {
       spaceOut();
       if (op != null) out(op);
       out("=");
       spaceOut();
-      visitNestedExpression(assignment.value, ASSIGNMENT,
+      visitNestedExpression(value, ASSIGNMENT,
           newInForInit: inForInit, newAtStatementBegin: false);
     }
   }
@@ -1045,15 +1069,23 @@
     visitNestedExpression(access.receiver, CALL,
         newInForInit: inForInit, newAtStatementBegin: atStatementBegin);
 
-    Node selector = undefer(access.selector);
+    Node selector = _undefer(access.selector);
+    if (isDebugContext && !selector.isFinalized) {
+      _dotString(
+          access.selector, access.receiver, selector.nonfinalizedDebugText(),
+          assumeValid: true);
+      return;
+    }
     if (selector is LiteralString) {
       _dotString(access.selector, access.receiver, selector.value);
       return;
-    } else if (selector is StringConcatenation) {
+    }
+    if (selector is StringConcatenation) {
       _dotString(access.selector, access.receiver,
-          _StringContentsCollector().collect(selector));
+          _StringContentsCollector(isDebugContext).collect(selector));
       return;
-    } else if (selector is Name) {
+    }
+    if (selector is Name) {
       _dotString(access.selector, access.receiver, selector.name);
       return;
     }
@@ -1064,9 +1096,10 @@
     out(']');
   }
 
-  void _dotString(Node selector, Node receiver, String selectorValue) {
-    if (isValidJavaScriptId(selectorValue)) {
-      if (undefer(receiver) is LiteralNumber &&
+  void _dotString(Node selector, Node receiver, String selectorValue,
+      {bool assumeValid = false}) {
+    if (assumeValid || isValidJavaScriptId(selectorValue)) {
+      if (_undefer(receiver) is LiteralNumber &&
           lastCharCode != charCodes.$CLOSE_PAREN) {
         out(' ', isWhitespace: true);
       }
@@ -1157,6 +1190,10 @@
 
   @override
   visitDeferredExpression(DeferredExpression node) {
+    if (isDebugContext && !node.isFinalized) {
+      out(node.nonfinalizedDebugText());
+      return;
+    }
     // Continue printing with the expression value.
     assert(node.precedenceLevel == node.value.precedenceLevel);
     node.value.accept(this);
@@ -1194,12 +1231,16 @@
 
   @override
   void visitLiteralString(LiteralString node) {
+    if (isDebugContext && !node.isFinalized) {
+      _handleString(node.nonfinalizedDebugText());
+      return;
+    }
     _handleString(node.value);
   }
 
   @override
   visitStringConcatenation(StringConcatenation node) {
-    _handleString(_StringContentsCollector().collect(node));
+    _handleString(_StringContentsCollector(isDebugContext).collect(node));
   }
 
   void _handleString(String value) {
@@ -1217,6 +1258,10 @@
 
   @override
   visitName(Name node) {
+    if (isDebugContext && !node.isFinalized) {
+      out(node.nonfinalizedDebugText());
+      return;
+    }
     out(node.name);
   }
 
@@ -1342,7 +1387,7 @@
 
   void propertyNameOut(Property node) {
     startNode(node.name);
-    Node name = undefer(node.name);
+    Node name = _undefer(node.name);
     if (name is LiteralString) {
       _outPropertyName(name.value);
     } else if (name is Name) {
@@ -1431,8 +1476,11 @@
   }
 }
 
-class _StringContentsCollector extends BaseVisitor<void> {
+class _StringContentsCollector extends BaseVisitorVoid {
   final StringBuffer _buffer = StringBuffer();
+  final bool isDebugContext;
+
+  _StringContentsCollector(this.isDebugContext);
 
   String collect(Node node) {
     node.accept(this);
@@ -1450,17 +1498,29 @@
 
   @override
   void visitLiteralString(LiteralString node) {
-    _add(node.value);
+    if (isDebugContext && !node.isFinalized) {
+      _add(node.nonfinalizedDebugText());
+    } else {
+      _add(node.value);
+    }
   }
 
   @override
   void visitLiteralNumber(LiteralNumber node) {
-    _add(node.value);
+    if (isDebugContext && !node.isFinalized) {
+      _add(node.nonfinalizedDebugText());
+    } else {
+      _add(node.value);
+    }
   }
 
   @override
   void visitName(Name node) {
-    _add(node.name);
+    if (isDebugContext && !node.isFinalized) {
+      _add(node.nonfinalizedDebugText());
+    } else {
+      _add(node.name);
+    }
   }
 
   @override
@@ -1491,7 +1551,7 @@
 
 // Collects all the var declarations in the function.  We need to do this in a
 // separate pass because JS vars are lifted to the top of the function.
-class VarCollector extends BaseVisitor {
+class VarCollector extends BaseVisitorVoid {
   bool nested;
   bool enableRenaming = true;
   final OrderedSet<String> vars;
@@ -1570,9 +1630,11 @@
 
   bool visitNode(Node node) {
     context.error("Forgot node: $node");
-    return null;
+    return true;
   }
 
+  bool visitComment(Comment node) => true;
+
   bool visitBlock(Block node) => false;
   bool visitExpressionStatement(ExpressionStatement node) => false;
   bool visitEmptyStatement(EmptyStatement node) => false;
@@ -1609,6 +1671,8 @@
   bool visitLabeledStatement(LabeledStatement node) => node.body.accept(this);
   bool visitLiteralStatement(LiteralStatement node) => true;
 
+  bool visitDartYield(DartYield node) => false;
+
   bool visitExpression(Expression node) => false;
 }
 
diff --git a/pkg/js_ast/lib/src/template.dart b/pkg/js_ast/lib/src/template.dart
index 239a717..bdcf3c0 100644
--- a/pkg/js_ast/lib/src/template.dart
+++ b/pkg/js_ast/lib/src/template.dart
@@ -775,7 +775,7 @@
 
 /// InterpolatedNodeAnalysis determines which AST trees contain
 /// [InterpolatedNode]s, and the names of the named interpolated nodes.
-class InterpolatedNodeAnalysis extends BaseVisitor {
+class InterpolatedNodeAnalysis extends BaseVisitorVoid {
   final Set<Node> containsInterpolatedNode = {};
   final Set<String> holeNames = {};
   int count = 0;
diff --git a/pkg/js_ast/test/deferred_expression_test.dart b/pkg/js_ast/test/deferred_expression_test.dart
index afd9805..29fc4d1 100644
--- a/pkg/js_ast/test/deferred_expression_test.dart
+++ b/pkg/js_ast/test/deferred_expression_test.dart
@@ -127,6 +127,9 @@
   Map<Node, _Position> exitPositions = {};
 
   @override
+  bool get isDebugContext => false;
+
+  @override
   void emit(String string) {
     sb.write(string);
   }
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index e710da2..b75aba6 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -147,7 +147,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 74;
+  UInt32 formatVersion = 75;
   Byte[10] shortSdkHash;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
@@ -316,7 +316,7 @@
   FileOffset fileOffset; // Offset of the name of the class.
   FileOffset fileEndOffset;
   Byte flags (isAbstract, isEnum, isAnonymousMixin, isEliminatedMixin,
-              isMixinDeclaration, hasConstConstructor);
+              isMixinDeclaration, hasConstConstructor, isMacro);
   StringReference name;
   List<Expression> annotations;
   List<TypeParameter> typeParameters;
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 38e5cfc..99a2f86 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1013,6 +1013,7 @@
   static const int FlagEliminatedMixin = 1 << 3;
   static const int FlagMixinDeclaration = 1 << 4;
   static const int FlagHasConstConstructor = 1 << 5;
+  static const int FlagMacro = 1 << 6;
 
   int flags = 0;
 
@@ -1029,6 +1030,13 @@
     flags = value ? (flags | FlagEnum) : (flags & ~FlagEnum);
   }
 
+  /// Whether this class is a macro class.
+  bool get isMacro => flags & FlagMacro != 0;
+
+  void set isMacro(bool value) {
+    flags = value ? (flags | FlagMacro) : (flags & ~FlagMacro);
+  }
+
   /// Whether this class is a synthetic implementation created for each
   /// mixed-in class. For example the following code:
   /// class Z extends A with B, C, D {}
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 4cf39b7..dc9ece8 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -2498,6 +2498,8 @@
       writeName(descriptor.name);
       writeByte(descriptor.kind.index);
       writeByte(descriptor.flags);
+      assert(descriptor.member.canonicalName != null,
+          "No canonical name for ${descriptor}.");
       writeNonNullCanonicalNameReference(descriptor.member.canonicalName!);
     }
   }
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 859ed11..ceaae4a 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -176,7 +176,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 74;
+  static const int BinaryFormatVersion = 75;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 43368ec..e231e8f 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -38,17 +38,6 @@
   List<DartType>? getTypeArgumentsAsInstanceOf(
       InterfaceType type, Class superclass);
 
-  /// Returns the possibly abstract interface member of [class_] with the given
-  /// [name].
-  ///
-  /// If [setter] is `false`, only fields, methods, and getters with that name
-  /// will be found.  If [setter] is `true`, only non-final fields and setters
-  /// will be found.
-  ///
-  /// If multiple members with that name are inherited and not overridden, the
-  /// member from the first declared supertype is returned.
-  Member? getInterfaceMember(Class class_, Name name, {bool setter: false});
-
   /// Returns the least upper bound of two interface types, as defined by Dart
   /// 1.0.
   ///
@@ -68,8 +57,22 @@
       InterfaceType type1, InterfaceType type2, Library clientLibrary);
 }
 
+abstract class ClassHierarchyMembers {
+  /// Returns the possibly abstract interface member of [class_] with the given
+  /// [name].
+  ///
+  /// If [setter] is `false`, only fields, methods, and getters with that name
+  /// will be found.  If [setter] is `true`, only non-final fields and setters
+  /// will be found.
+  ///
+  /// If multiple members with that name are inherited and not overridden, the
+  /// member from the first declared supertype is returned.
+  Member? getInterfaceMember(Class class_, Name name, {bool setter: false});
+}
+
 /// Interface for answering various subclassing queries.
-abstract class ClassHierarchy implements ClassHierarchyBase {
+abstract class ClassHierarchy
+    implements ClassHierarchyBase, ClassHierarchyMembers {
   factory ClassHierarchy(Component component, CoreTypes coreTypes,
       {HandleAmbiguousSupertypes? onAmbiguousSupertypes,
       MixinInferrer? mixinInferrer}) {
diff --git a/pkg/kernel/lib/default_language_version.dart b/pkg/kernel/lib/default_language_version.dart
index 96327d4..d4c3163 100644
--- a/pkg/kernel/lib/default_language_version.dart
+++ b/pkg/kernel/lib/default_language_version.dart
@@ -9,4 +9,4 @@
 
 import "ast.dart";
 
-Version defaultLanguageVersion = const Version(2, 15);
+Version defaultLanguageVersion = const Version(2, 16);
diff --git a/pkg/kernel/lib/src/equivalence_helpers.dart b/pkg/kernel/lib/src/equivalence_helpers.dart
index a36ee07..bb7bf62 100644
--- a/pkg/kernel/lib/src/equivalence_helpers.dart
+++ b/pkg/kernel/lib/src/equivalence_helpers.dart
@@ -236,8 +236,20 @@
   /// A reference name of a class or extension.
   Declaration,
 
-  /// A reference name of a typedef or member.
-  Member,
+  /// A reference name of a typedef.
+  Typedef,
+
+  /// A reference name of a method or constructor.
+  Function,
+
+  /// A reference name of a field.
+  Field,
+
+  /// A reference name of a getter.
+  Getter,
+
+  /// A reference name of a setter.
+  Setter,
 }
 
 /// Abstract representation of a [Reference] or [CanonicalName].
@@ -251,25 +263,29 @@
   final String? name;
   final String? uri;
 
-  ReferenceName.internal(this.kind, this.name, [this.parent, this.uri]);
+  ReferenceName.internal(this.kind, this.name, {this.parent, this.uri});
 
-  factory ReferenceName.fromNamedNode(NamedNode node) {
+  factory ReferenceName.fromNamedNode(NamedNode node,
+      [ReferenceNameKind? memberKind]) {
     if (node is Library) {
       return new ReferenceName.internal(
           ReferenceNameKind.Library, node.importUri.toString());
     } else if (node is Extension) {
-      return new ReferenceName.internal(ReferenceNameKind.Declaration,
-          node.name, new ReferenceName.fromNamedNode(node.enclosingLibrary));
+      return new ReferenceName.internal(
+          ReferenceNameKind.Declaration, node.name,
+          parent: new ReferenceName.fromNamedNode(node.enclosingLibrary));
     } else if (node is Class) {
-      return new ReferenceName.internal(ReferenceNameKind.Declaration,
-          node.name, new ReferenceName.fromNamedNode(node.enclosingLibrary));
+      return new ReferenceName.internal(
+          ReferenceNameKind.Declaration, node.name,
+          parent: new ReferenceName.fromNamedNode(node.enclosingLibrary));
     } else if (node is Typedef) {
-      return new ReferenceName.internal(ReferenceNameKind.Member, node.name,
-          new ReferenceName.fromNamedNode(node.enclosingLibrary));
+      return new ReferenceName.internal(ReferenceNameKind.Typedef, node.name,
+          parent: new ReferenceName.fromNamedNode(node.enclosingLibrary));
     } else if (node is Member) {
       TreeNode? parent = node.parent;
       Reference? libraryReference = node.name.libraryName;
       String? uri;
+
       if (libraryReference != null) {
         Library? library = libraryReference.node as Library?;
         if (library != null) {
@@ -278,15 +294,31 @@
           uri = libraryReference.canonicalName?.name;
         }
       }
+
+      String name = node.name.text;
+      if (memberKind == null) {
+        if (node is Procedure) {
+          if (node.isGetter) {
+            memberKind = ReferenceNameKind.Getter;
+          } else if (node.isSetter) {
+            memberKind = ReferenceNameKind.Setter;
+          } else {
+            memberKind = ReferenceNameKind.Function;
+          }
+        } else if (node is Constructor) {
+          memberKind = ReferenceNameKind.Function;
+        } else {
+          memberKind = ReferenceNameKind.Field;
+        }
+      }
       if (parent is Class) {
-        return new ReferenceName.internal(ReferenceNameKind.Member,
-            node.name.text, new ReferenceName.fromNamedNode(parent), uri);
+        return new ReferenceName.internal(memberKind, name,
+            parent: new ReferenceName.fromNamedNode(parent), uri: uri);
       } else if (parent is Library) {
-        return new ReferenceName.internal(ReferenceNameKind.Member,
-            node.name.text, new ReferenceName.fromNamedNode(parent), uri);
+        return new ReferenceName.internal(memberKind, name,
+            parent: new ReferenceName.fromNamedNode(parent), uri: uri);
       } else {
-        return new ReferenceName.internal(
-            ReferenceNameKind.Member, node.name.text, null, uri);
+        return new ReferenceName.internal(memberKind, name, uri: uri);
       }
     } else {
       throw new ArgumentError(
@@ -305,22 +337,24 @@
     ReferenceName? referenceName;
     ReferenceNameKind kind = ReferenceNameKind.Declaration;
     for (int index = 1; index < parents.length; index++) {
+      String name = parents[index].name;
       if (index == 1) {
         // Library reference.
-        referenceName = new ReferenceName.internal(
-            ReferenceNameKind.Library, parents[index].name);
-      } else if (CanonicalName.isSymbolicName(parents[index].name)) {
+        referenceName =
+            new ReferenceName.internal(ReferenceNameKind.Library, name);
+      } else if (CanonicalName.isSymbolicName(name)) {
         // Skip symbolic names
-        kind = ReferenceNameKind.Member;
+        kind = kindFromSymbolicName(name);
       } else {
         if (index + 2 == parents.length) {
           // This is a private name.
-          referenceName = new ReferenceName.internal(ReferenceNameKind.Member,
-              parents[index + 1].name, referenceName, parents[index].name);
+          referenceName = new ReferenceName.internal(
+              kind, parents[index + 1].name,
+              parent: referenceName, uri: name);
           break;
         } else {
-          referenceName = new ReferenceName.internal(
-              kind, parents[index].name, referenceName);
+          referenceName =
+              new ReferenceName.internal(kind, name, parent: referenceName);
         }
       }
     }
@@ -328,6 +362,21 @@
         new ReferenceName.internal(ReferenceNameKind.Unknown, null);
   }
 
+  static ReferenceNameKind kindFromSymbolicName(String name) {
+    assert(CanonicalName.isSymbolicName(name));
+    if (name == CanonicalName.typedefsName) {
+      return ReferenceNameKind.Typedef;
+    } else if (name == CanonicalName.fieldsName) {
+      return ReferenceNameKind.Field;
+    } else if (name == CanonicalName.gettersName) {
+      return ReferenceNameKind.Getter;
+    } else if (name == CanonicalName.settersName) {
+      return ReferenceNameKind.Setter;
+    } else {
+      return ReferenceNameKind.Function;
+    }
+  }
+
   String? get libraryUri {
     if (kind == ReferenceNameKind.Library) {
       return name;
@@ -344,15 +393,30 @@
     }
   }
 
+  bool get isMember {
+    switch (kind) {
+      case ReferenceNameKind.Unknown:
+      case ReferenceNameKind.Library:
+      case ReferenceNameKind.Declaration:
+        return false;
+      case ReferenceNameKind.Typedef:
+      case ReferenceNameKind.Function:
+      case ReferenceNameKind.Field:
+      case ReferenceNameKind.Getter:
+      case ReferenceNameKind.Setter:
+        return true;
+    }
+  }
+
   String? get memberName {
-    if (kind == ReferenceNameKind.Member) {
+    if (isMember) {
       return name;
     }
     return null;
   }
 
   String? get memberUri {
-    if (kind == ReferenceNameKind.Member) {
+    if (isMember) {
       return uri;
     }
     return null;
@@ -364,7 +428,18 @@
     }
     NamedNode? node = reference.node;
     if (node != null) {
-      return new ReferenceName.fromNamedNode(node);
+      ReferenceNameKind? memberKind;
+      if (node is Field) {
+        if (node.getterReference == reference) {
+          memberKind = ReferenceNameKind.Getter;
+        } else if (node.setterReference == reference) {
+          memberKind = ReferenceNameKind.Setter;
+        } else {
+          assert(node.fieldReference == reference);
+          memberKind = ReferenceNameKind.Field;
+        }
+      }
+      return new ReferenceName.fromNamedNode(node, memberKind);
     }
     CanonicalName? canonicalName = reference.canonicalName;
     if (canonicalName != null) {
@@ -375,19 +450,22 @@
 
   @override
   int get hashCode =>
-      name.hashCode * 13 + uri.hashCode * 17 + parent.hashCode * 19;
+      kind.hashCode * 11 +
+      name.hashCode * 13 +
+      uri.hashCode * 17 +
+      parent.hashCode * 19;
 
   @override
   bool operator ==(Object other) {
     if (identical(this, other)) return true;
     return other is ReferenceName &&
+        kind == other.kind &&
         name == other.name &&
         uri == other.uri &&
         parent == other.parent;
   }
 
-  @override
-  String toString() {
+  String _toStringInternal() {
     if (parent != null) {
       return '${parent}/$name';
     } else if (name != null) {
@@ -396,4 +474,15 @@
       return '<null>';
     }
   }
+
+  @override
+  String toString() {
+    if (parent != null) {
+      return '${kind}:${parent!._toStringInternal()}/$name';
+    } else if (name != null) {
+      return '${kind}:/$name';
+    } else {
+      return '<null>';
+    }
+  }
 }
diff --git a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
index 65894ac..15812bf 100644
--- a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
+++ b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
@@ -6,7 +6,7 @@
 
 import '../ast.dart' show Class, DartType, InterfaceType, Library, Member, Name;
 
-import '../class_hierarchy.dart' show ClassHierarchyBase;
+import '../class_hierarchy.dart' show ClassHierarchy;
 
 import '../core_types.dart' show CoreTypes;
 
@@ -14,7 +14,7 @@
 
 class HierarchyBasedTypeEnvironment extends TypeEnvironment {
   @override
-  final ClassHierarchyBase hierarchy;
+  final ClassHierarchy hierarchy;
 
   HierarchyBasedTypeEnvironment(CoreTypes coreTypes, this.hierarchy)
       : super.fromSubclass(coreTypes, hierarchy);
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 1cb1b2c..804f26a 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -268,13 +268,12 @@
   bool mayDefineRestrictedType(Uri uri) =>
       uri.isScheme('dart') && (uri.path == 'core' || uri.path == 'typed_data');
 
-  /// Whether a library is allowed to import a platform private library.
+  /// Whether a library is allowed to import the platform private library
+  /// [imported] from library [importer].
   ///
   /// By default only `dart:*` libraries are allowed. May be overridden for
   /// testing purposes.
   bool allowPlatformPrivateLibraryAccess(Uri importer, Uri imported) =>
-      imported.scheme != "dart" ||
-      !imported.path.startsWith("_") ||
       importer.scheme == "dart" ||
       (importer.scheme == "package" &&
           importer.path.startsWith("dart_internal/"));
@@ -918,3 +917,44 @@
 
   TestTargetWrapper(Target target, this.flags) : super(target);
 }
+
+/// Extends a Target to transform outlines to meet the requirements
+/// of summaries in bazel and package-build.
+///
+/// Build systems like package-build may provide the same input file twice to
+/// the summary worker, but only intends to have it in one output summary.  The
+/// convention is that if it is listed as a source, it is intended to be part of
+/// the output, if the source file was loaded as a dependency, then it was
+/// already included in a different summary.  The transformation below ensures
+/// that the output summary doesn't include those implicit inputs.
+///
+/// Note: this transformation is destructive and is only intended to be used
+/// when generating summaries.
+mixin SummaryMixin on Target {
+  List<Uri> get sources;
+  bool get excludeNonSources;
+
+  @override
+  void performOutlineTransformations(Component component) {
+    super.performOutlineTransformations(component);
+    if (!excludeNonSources) return;
+
+    List<Library> libraries = new List.from(component.libraries);
+    component.libraries.clear();
+    Set<Uri> include = sources.toSet();
+    for (Library library in libraries) {
+      if (include.contains(library.importUri)) {
+        component.libraries.add(library);
+      } else {
+        // Excluding the library also means that their canonical names will not
+        // be computed as part of serialization, so we need to do that
+        // preemptively here to avoid errors when serializing references to
+        // elements of these libraries.
+        component.root
+            .getChildFromUri(library.importUri)
+            .bindTo(library.reference);
+        library.computeCanonicalNames();
+      }
+    }
+  }
+}
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 6a24e52..4f718b9 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1294,6 +1294,7 @@
     writeAnnotationList(node.annotations);
     writeIndentation();
     writeModifier(node.isAbstract, 'abstract');
+    writeModifier(node.isMacro, 'macro');
     writeWord('class');
     writeWord(getClassName(node));
     writeTypeParameterList(node.typeParameters);
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 3c00de0..0a38ec2 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -207,16 +207,17 @@
 }
 
 TextSerializer<Not> notSerializer =
-    new Wrapped(unwrapNot, wrapNot, expressionSerializer);
+    new Wrapped<Expression, Not>(unwrapNot, wrapNot, expressionSerializer);
 
 Expression unwrapNot(Not expression) => expression.operand;
 
 Not wrapNot(Expression operand) => new Not(operand);
 
-TextSerializer<LogicalExpression> logicalAndSerializer = new Wrapped(
-    unwrapLogicalExpression,
-    wrapLogicalAnd,
-    new Tuple2Serializer(expressionSerializer, expressionSerializer));
+TextSerializer<LogicalExpression> logicalAndSerializer =
+    new Wrapped<Tuple2<Expression, Expression>, LogicalExpression>(
+        unwrapLogicalExpression,
+        wrapLogicalAnd,
+        new Tuple2Serializer(expressionSerializer, expressionSerializer));
 
 Tuple2<Expression, Expression> unwrapLogicalExpression(
     LogicalExpression expression) {
@@ -228,20 +229,22 @@
       tuple.first, LogicalExpressionOperator.AND, tuple.second);
 }
 
-TextSerializer<LogicalExpression> logicalOrSerializer = new Wrapped(
-    unwrapLogicalExpression,
-    wrapLogicalOr,
-    new Tuple2Serializer(expressionSerializer, expressionSerializer));
+TextSerializer<LogicalExpression> logicalOrSerializer =
+    new Wrapped<Tuple2<Expression, Expression>, LogicalExpression>(
+        unwrapLogicalExpression,
+        wrapLogicalOr,
+        new Tuple2Serializer(expressionSerializer, expressionSerializer));
 
 LogicalExpression wrapLogicalOr(Tuple2<Expression, Expression> tuple) {
   return new LogicalExpression(
       tuple.first, LogicalExpressionOperator.OR, tuple.second);
 }
 
-TextSerializer<StringConcatenation> stringConcatenationSerializer = new Wrapped(
-    unwrapStringConcatenation,
-    wrapStringConcatenation,
-    new ListSerializer(expressionSerializer));
+TextSerializer<StringConcatenation> stringConcatenationSerializer =
+    new Wrapped<List<Expression>, StringConcatenation>(
+        unwrapStringConcatenation,
+        wrapStringConcatenation,
+        new ListSerializer(expressionSerializer));
 
 List<Expression> unwrapStringConcatenation(StringConcatenation expression) {
   return expression.expressions;
@@ -252,70 +255,78 @@
 }
 
 const TextSerializer<StringLiteral> stringLiteralSerializer =
-    const Wrapped(unwrapStringLiteral, wrapStringLiteral, const DartString());
+    const Wrapped<String, StringLiteral>(
+        unwrapStringLiteral, wrapStringLiteral, const DartString());
 
 String unwrapStringLiteral(StringLiteral literal) => literal.value;
 
 StringLiteral wrapStringLiteral(String value) => new StringLiteral(value);
 
 const TextSerializer<IntLiteral> intLiteralSerializer =
-    const Wrapped(unwrapIntLiteral, wrapIntLiteral, const DartInt());
+    const Wrapped<int, IntLiteral>(
+        unwrapIntLiteral, wrapIntLiteral, const DartInt());
 
 int unwrapIntLiteral(IntLiteral literal) => literal.value;
 
 IntLiteral wrapIntLiteral(int value) => new IntLiteral(value);
 
 const TextSerializer<DoubleLiteral> doubleLiteralSerializer =
-    const Wrapped(unwrapDoubleLiteral, wrapDoubleLiteral, const DartDouble());
+    const Wrapped<double, DoubleLiteral>(
+        unwrapDoubleLiteral, wrapDoubleLiteral, const DartDouble());
 
 double unwrapDoubleLiteral(DoubleLiteral literal) => literal.value;
 
 DoubleLiteral wrapDoubleLiteral(double value) => new DoubleLiteral(value);
 
 const TextSerializer<BoolLiteral> boolLiteralSerializer =
-    const Wrapped(unwrapBoolLiteral, wrapBoolLiteral, const DartBool());
+    const Wrapped<bool, BoolLiteral>(
+        unwrapBoolLiteral, wrapBoolLiteral, const DartBool());
 
 bool unwrapBoolLiteral(BoolLiteral literal) => literal.value;
 
 BoolLiteral wrapBoolLiteral(bool value) => new BoolLiteral(value);
 
 const TextSerializer<NullLiteral> nullLiteralSerializer =
-    const Wrapped(unwrapNullLiteral, wrapNullLiteral, const Nothing());
+    const Wrapped<void, NullLiteral>(
+        unwrapNullLiteral, wrapNullLiteral, const Nothing());
 
 void unwrapNullLiteral(NullLiteral literal) {}
 
 NullLiteral wrapNullLiteral(void ignored) => new NullLiteral();
 
 const TextSerializer<SymbolLiteral> symbolLiteralSerializer =
-    const Wrapped(unwrapSymbolLiteral, wrapSymbolLiteral, const DartString());
+    const Wrapped<String, SymbolLiteral>(
+        unwrapSymbolLiteral, wrapSymbolLiteral, const DartString());
 
 String unwrapSymbolLiteral(SymbolLiteral expression) => expression.value;
 
 SymbolLiteral wrapSymbolLiteral(String value) => new SymbolLiteral(value);
 
 const TextSerializer<ThisExpression> thisExpressionSerializer =
-    const Wrapped(unwrapThisExpression, wrapThisExpression, const Nothing());
+    const Wrapped<void, ThisExpression>(
+        unwrapThisExpression, wrapThisExpression, const Nothing());
 
 void unwrapThisExpression(ThisExpression expression) {}
 
 ThisExpression wrapThisExpression(void ignored) => new ThisExpression();
 
 const TextSerializer<Rethrow> rethrowSerializer =
-    const Wrapped(unwrapRethrow, wrapRethrow, const Nothing());
+    const Wrapped<void, Rethrow>(unwrapRethrow, wrapRethrow, const Nothing());
 
 void unwrapRethrow(Rethrow expression) {}
 
 Rethrow wrapRethrow(void ignored) => new Rethrow();
 
-TextSerializer<Throw> throwSerializer =
-    new Wrapped(unwrapThrow, wrapThrow, expressionSerializer);
+TextSerializer<Throw> throwSerializer = new Wrapped<Expression, Throw>(
+    unwrapThrow, wrapThrow, expressionSerializer);
 
 Expression unwrapThrow(Throw expression) => expression.expression;
 
 Throw wrapThrow(Expression expression) => new Throw(expression);
 
-TextSerializer<AwaitExpression> awaitExpressionSerializer = new Wrapped(
-    unwrapAwaitExpression, wrapAwaitExpression, expressionSerializer);
+TextSerializer<AwaitExpression> awaitExpressionSerializer =
+    new Wrapped<Expression, AwaitExpression>(
+        unwrapAwaitExpression, wrapAwaitExpression, expressionSerializer);
 
 Expression unwrapAwaitExpression(AwaitExpression expression) =>
     expression.operand;
@@ -324,7 +335,8 @@
     new AwaitExpression(operand);
 
 TextSerializer<ConditionalExpression> conditionalExpressionSerializer =
-    new Wrapped(
+    new Wrapped<Tuple4<Expression, DartType, Expression, Expression>,
+            ConditionalExpression>(
         unwrapConditionalExpression,
         wrapConditionalExpression,
         new Tuple4Serializer(expressionSerializer, dartTypeSerializer,
@@ -342,10 +354,11 @@
       tuple.first, tuple.third, tuple.fourth, tuple.second);
 }
 
-TextSerializer<IsExpression> isExpressionSerializer = new Wrapped(
-    unwrapIsExpression,
-    wrapIsExpression,
-    new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
+TextSerializer<IsExpression> isExpressionSerializer =
+    new Wrapped<Tuple2<Expression, DartType>, IsExpression>(
+        unwrapIsExpression,
+        wrapIsExpression,
+        new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
 
 Tuple2<Expression, DartType> unwrapIsExpression(IsExpression expression) {
   return new Tuple2(expression.operand, expression.type);
@@ -355,10 +368,11 @@
   return new IsExpression(tuple.first, tuple.second);
 }
 
-TextSerializer<AsExpression> asExpressionSerializer = new Wrapped(
-    unwrapAsExpression,
-    wrapAsExpression,
-    new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
+TextSerializer<AsExpression> asExpressionSerializer =
+    new Wrapped<Tuple2<Expression, DartType>, AsExpression>(
+        unwrapAsExpression,
+        wrapAsExpression,
+        new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
 
 Tuple2<Expression, DartType> unwrapAsExpression(AsExpression expression) {
   return new Tuple2(expression.operand, expression.type);
@@ -369,17 +383,19 @@
 }
 
 TextSerializer<TypeLiteral> typeLiteralSerializer =
-    new Wrapped(unwrapTypeLiteral, wrapTypeLiteral, dartTypeSerializer);
+    new Wrapped<DartType, TypeLiteral>(
+        unwrapTypeLiteral, wrapTypeLiteral, dartTypeSerializer);
 
 DartType unwrapTypeLiteral(TypeLiteral expression) => expression.type;
 
 TypeLiteral wrapTypeLiteral(DartType type) => new TypeLiteral(type);
 
-TextSerializer<ListLiteral> listLiteralSerializer = new Wrapped(
-    unwrapListLiteral,
-    wrapListLiteral,
-    new Tuple2Serializer(
-        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+TextSerializer<ListLiteral> listLiteralSerializer =
+    new Wrapped<Tuple2<DartType, List<Expression>>, ListLiteral>(
+        unwrapListLiteral,
+        wrapListLiteral,
+        new Tuple2Serializer(
+            dartTypeSerializer, new ListSerializer(expressionSerializer)));
 
 Tuple2<DartType, List<Expression>> unwrapListLiteral(ListLiteral expression) {
   return new Tuple2(expression.typeArgument, expression.expressions);
@@ -390,22 +406,24 @@
       typeArgument: tuple.first, isConst: false);
 }
 
-TextSerializer<ListLiteral> constListLiteralSerializer = new Wrapped(
-    unwrapListLiteral,
-    wrapConstListLiteral,
-    new Tuple2Serializer(
-        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+TextSerializer<ListLiteral> constListLiteralSerializer =
+    new Wrapped<Tuple2<DartType, List<Expression>>, ListLiteral>(
+        unwrapListLiteral,
+        wrapConstListLiteral,
+        new Tuple2Serializer(
+            dartTypeSerializer, new ListSerializer(expressionSerializer)));
 
 ListLiteral wrapConstListLiteral(Tuple2<DartType, List<Expression>> tuple) {
   return new ListLiteral(tuple.second,
       typeArgument: tuple.first, isConst: true);
 }
 
-TextSerializer<SetLiteral> setLiteralSerializer = new Wrapped(
-    unwrapSetLiteral,
-    wrapSetLiteral,
-    new Tuple2Serializer(
-        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+TextSerializer<SetLiteral> setLiteralSerializer =
+    new Wrapped<Tuple2<DartType, List<Expression>>, SetLiteral>(
+        unwrapSetLiteral,
+        wrapSetLiteral,
+        new Tuple2Serializer(
+            dartTypeSerializer, new ListSerializer(expressionSerializer)));
 
 Tuple2<DartType, List<Expression>> unwrapSetLiteral(SetLiteral expression) {
   return new Tuple2(expression.typeArgument, expression.expressions);
@@ -416,21 +434,23 @@
       typeArgument: tuple.first, isConst: false);
 }
 
-TextSerializer<SetLiteral> constSetLiteralSerializer = new Wrapped(
-    unwrapSetLiteral,
-    wrapConstSetLiteral,
-    new Tuple2Serializer(
-        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+TextSerializer<SetLiteral> constSetLiteralSerializer =
+    new Wrapped<Tuple2<DartType, List<Expression>>, SetLiteral>(
+        unwrapSetLiteral,
+        wrapConstSetLiteral,
+        new Tuple2Serializer(
+            dartTypeSerializer, new ListSerializer(expressionSerializer)));
 
 SetLiteral wrapConstSetLiteral(Tuple2<DartType, List<Expression>> tuple) {
   return new SetLiteral(tuple.second, typeArgument: tuple.first, isConst: true);
 }
 
-TextSerializer<MapLiteral> mapLiteralSerializer = new Wrapped(
-    unwrapMapLiteral,
-    wrapMapLiteral,
-    new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
-        new ListSerializer(expressionSerializer)));
+TextSerializer<MapLiteral> mapLiteralSerializer =
+    new Wrapped<Tuple3<DartType, DartType, List<Expression>>, MapLiteral>(
+        unwrapMapLiteral,
+        wrapMapLiteral,
+        new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
+            new ListSerializer(expressionSerializer)));
 
 Tuple3<DartType, DartType, List<Expression>> unwrapMapLiteral(
     MapLiteral expression) {
@@ -454,11 +474,12 @@
       keyType: tuple.first, valueType: tuple.second, isConst: false);
 }
 
-TextSerializer<MapLiteral> constMapLiteralSerializer = new Wrapped(
-    unwrapMapLiteral,
-    wrapConstMapLiteral,
-    new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
-        new ListSerializer(expressionSerializer)));
+TextSerializer<MapLiteral> constMapLiteralSerializer =
+    new Wrapped<Tuple3<DartType, DartType, List<Expression>>, MapLiteral>(
+        unwrapMapLiteral,
+        wrapConstMapLiteral,
+        new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
+            new ListSerializer(expressionSerializer)));
 
 MapLiteral wrapConstMapLiteral(
     Tuple3<DartType, DartType, List<Expression>> tuple) {
@@ -471,8 +492,9 @@
       keyType: tuple.first, valueType: tuple.second, isConst: true);
 }
 
-TextSerializer<Let> letSerializer = new Wrapped(unwrapLet, wrapLet,
-    new Bind(variableDeclarationSerializer, expressionSerializer));
+TextSerializer<Let> letSerializer =
+    new Wrapped<Tuple2<VariableDeclaration, Expression>, Let>(unwrapLet,
+        wrapLet, new Bind(variableDeclarationSerializer, expressionSerializer));
 
 Tuple2<VariableDeclaration, Expression> unwrapLet(Let expression) {
   return new Tuple2(expression.variable, expression.body);
@@ -603,7 +625,8 @@
 }
 
 TextSerializer<SuperPropertyGet> superPropertyGetSerializer =
-    new Wrapped(unwrapSuperPropertyGet, wrapSuperPropertyGet, nameSerializer);
+    new Wrapped<Name, SuperPropertyGet>(
+        unwrapSuperPropertyGet, wrapSuperPropertyGet, nameSerializer);
 
 Name unwrapSuperPropertyGet(SuperPropertyGet expression) {
   return expression.name;
@@ -613,10 +636,11 @@
   return new SuperPropertyGet(name);
 }
 
-TextSerializer<SuperPropertySet> superPropertySetSerializer = new Wrapped(
-    unwrapSuperPropertySet,
-    wrapSuperPropertySet,
-    new Tuple2Serializer(nameSerializer, expressionSerializer));
+TextSerializer<SuperPropertySet> superPropertySetSerializer =
+    new Wrapped<Tuple2<Name, Expression>, SuperPropertySet>(
+        unwrapSuperPropertySet,
+        wrapSuperPropertySet,
+        new Tuple2Serializer(nameSerializer, expressionSerializer));
 
 Tuple2<Name, Expression> unwrapSuperPropertySet(SuperPropertySet expression) {
   return new Tuple2(expression.name, expression.value);
@@ -854,7 +878,9 @@
 }
 
 TextSerializer<SuperMethodInvocation> superMethodInvocationSerializer =
-    new Wrapped(unwrapSuperMethodInvocation, wrapSuperMethodInvocation,
+    new Wrapped<Tuple2<Name, Arguments>, SuperMethodInvocation>(
+        unwrapSuperMethodInvocation,
+        wrapSuperMethodInvocation,
         new Tuple2Serializer(nameSerializer, argumentsSerializer));
 
 Tuple2<Name, Arguments> unwrapSuperMethodInvocation(
@@ -882,11 +908,12 @@
   return new VariableGet(tuple.first, tuple.second);
 }
 
-TextSerializer<VariableSet> variableSetSerializer = new Wrapped(
-    unwrapVariableSet,
-    wrapVariableSet,
-    new Tuple2Serializer(
-        const ScopedUse<VariableDeclaration>(), expressionSerializer));
+TextSerializer<VariableSet> variableSetSerializer =
+    new Wrapped<Tuple2<VariableDeclaration, Expression>, VariableSet>(
+        unwrapVariableSet,
+        wrapVariableSet,
+        new Tuple2Serializer(
+            const ScopedUse<VariableDeclaration>(), expressionSerializer));
 
 Tuple2<VariableDeclaration, Expression> unwrapVariableSet(VariableSet node) {
   return new Tuple2<VariableDeclaration, Expression>(node.variable, node.value);
@@ -949,8 +976,9 @@
   return new StaticGet.byReference(name.reference);
 }
 
-const TextSerializer<StaticTearOff> staticTearOffSerializer = const Wrapped(
-    unwrapStaticTearOff, wrapStaticTearOff, canonicalNameSerializer);
+const TextSerializer<StaticTearOff> staticTearOffSerializer =
+    const Wrapped<CanonicalName, StaticTearOff>(
+        unwrapStaticTearOff, wrapStaticTearOff, canonicalNameSerializer);
 
 CanonicalName unwrapStaticTearOff(StaticTearOff expression) {
   return expression.targetReference.canonicalName!;
@@ -961,8 +989,8 @@
 }
 
 const TextSerializer<ConstructorTearOff> constructorTearOffSerializer =
-    const Wrapped(unwrapConstructorTearOff, wrapConstructorTearOff,
-        canonicalNameSerializer);
+    const Wrapped<CanonicalName, ConstructorTearOff>(unwrapConstructorTearOff,
+        wrapConstructorTearOff, canonicalNameSerializer);
 
 CanonicalName unwrapConstructorTearOff(ConstructorTearOff expression) {
   return expression.targetReference.canonicalName!;
@@ -973,7 +1001,8 @@
 }
 
 const TextSerializer<RedirectingFactoryTearOff>
-    redirectingFactoryTearOffSerializer = const Wrapped(
+    redirectingFactoryTearOffSerializer =
+    const Wrapped<CanonicalName, RedirectingFactoryTearOff>(
         unwrapRedirectingFactoryTearOff,
         wrapRedirectingFactoryTearOff,
         canonicalNameSerializer);
@@ -1009,10 +1038,11 @@
       tuple.first, tuple.second.first, tuple.second.second);
 }
 
-TextSerializer<StaticSet> staticSetSerializer = new Wrapped(
-    unwrapStaticSet,
-    wrapStaticSet,
-    new Tuple2Serializer(canonicalNameSerializer, expressionSerializer));
+TextSerializer<StaticSet> staticSetSerializer =
+    new Wrapped<Tuple2<CanonicalName, Expression>, StaticSet>(
+        unwrapStaticSet,
+        wrapStaticSet,
+        new Tuple2Serializer(canonicalNameSerializer, expressionSerializer));
 
 Tuple2<CanonicalName, Expression> unwrapStaticSet(StaticSet expression) {
   return new Tuple2(
@@ -1023,10 +1053,11 @@
   return new StaticSet.byReference(tuple.first.reference, tuple.second);
 }
 
-TextSerializer<StaticInvocation> staticInvocationSerializer = new Wrapped(
-    unwrapStaticInvocation,
-    wrapStaticInvocation,
-    new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
+TextSerializer<StaticInvocation> staticInvocationSerializer =
+    new Wrapped<Tuple2<CanonicalName, Arguments>, StaticInvocation>(
+        unwrapStaticInvocation,
+        wrapStaticInvocation,
+        new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
 
 Tuple2<CanonicalName, Arguments> unwrapStaticInvocation(
     StaticInvocation expression) {
@@ -1039,10 +1070,11 @@
       isConst: false);
 }
 
-TextSerializer<StaticInvocation> constStaticInvocationSerializer = new Wrapped(
-    unwrapStaticInvocation,
-    wrapConstStaticInvocation,
-    new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
+TextSerializer<StaticInvocation> constStaticInvocationSerializer =
+    new Wrapped<Tuple2<CanonicalName, Arguments>, StaticInvocation>(
+        unwrapStaticInvocation,
+        wrapConstStaticInvocation,
+        new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
 
 StaticInvocation wrapConstStaticInvocation(
     Tuple2<CanonicalName, Arguments> tuple) {
@@ -1051,7 +1083,9 @@
 }
 
 TextSerializer<ConstructorInvocation> constructorInvocationSerializer =
-    new Wrapped(unwrapConstructorInvocation, wrapConstructorInvocation,
+    new Wrapped<Tuple2<CanonicalName, Arguments>, ConstructorInvocation>(
+        unwrapConstructorInvocation,
+        wrapConstructorInvocation,
         new Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
 
 Tuple2<CanonicalName, Arguments> unwrapConstructorInvocation(
@@ -1068,7 +1102,9 @@
 }
 
 TextSerializer<ConstructorInvocation> constConstructorInvocationSerializer =
-    new Wrapped(unwrapConstructorInvocation, wrapConstConstructorInvocation,
+    new Wrapped<Tuple2<CanonicalName, Arguments>, ConstructorInvocation>(
+        unwrapConstructorInvocation,
+        wrapConstConstructorInvocation,
         Tuple2Serializer(canonicalNameSerializer, argumentsSerializer));
 
 ConstructorInvocation wrapConstConstructorInvocation(
@@ -1078,8 +1114,9 @@
       isConst: true);
 }
 
-TextSerializer<FunctionExpression> functionExpressionSerializer = new Wrapped(
-    unwrapFunctionExpression, wrapFunctionExpression, functionNodeSerializer);
+TextSerializer<FunctionExpression> functionExpressionSerializer =
+    new Wrapped<FunctionNode, FunctionExpression>(unwrapFunctionExpression,
+        wrapFunctionExpression, functionNodeSerializer);
 
 FunctionNode unwrapFunctionExpression(FunctionExpression expression) {
   return expression.function;
@@ -1177,10 +1214,11 @@
 TextSerializer<Expression?> nullableExpressionSerializer =
     new Optional(expressionSerializer);
 
-TextSerializer<NamedExpression> namedExpressionSerializer = new Wrapped(
-    unwrapNamedExpression,
-    wrapNamedExpression,
-    new Tuple2Serializer(const DartString(), expressionSerializer));
+TextSerializer<NamedExpression> namedExpressionSerializer =
+    new Wrapped<Tuple2<String, Expression>, NamedExpression>(
+        unwrapNamedExpression,
+        wrapNamedExpression,
+        new Tuple2Serializer(const DartString(), expressionSerializer));
 
 Tuple2<String, Expression> unwrapNamedExpression(NamedExpression expression) {
   return new Tuple2(expression.name, expression.value);
@@ -1190,7 +1228,9 @@
   return new NamedExpression(tuple.first, tuple.second);
 }
 
-TextSerializer<Arguments> argumentsSerializer = new Wrapped(
+TextSerializer<Arguments> argumentsSerializer = new Wrapped<
+        Tuple3<List<DartType>, List<Expression>, List<NamedExpression>>,
+        Arguments>(
     unwrapArguments,
     wrapArguments,
     Tuple3Serializer(
@@ -1259,7 +1299,8 @@
     Wrapped<Tuple2<String?, TypeParameter>, TypeParameter>(
         (p) => Tuple2(p.name, p),
         (t) => t.second..name = t.first,
-        Binder(Wrapped((_) => null, (_) => TypeParameter(), const Nothing())));
+        Binder<TypeParameter>(Wrapped<void, TypeParameter>(
+            (_) => null, (_) => TypeParameter(), const Nothing())));
 
 TextSerializer<List<TypeParameter>> typeParametersSerializer = new Zip(
     new Rebind(
@@ -1325,35 +1366,42 @@
 }
 
 const TextSerializer<InvalidType> invalidTypeSerializer =
-    const Wrapped(unwrapInvalidType, wrapInvalidType, const Nothing());
+    const Wrapped<void, InvalidType>(
+        unwrapInvalidType, wrapInvalidType, const Nothing());
 
 void unwrapInvalidType(InvalidType type) {}
 
 InvalidType wrapInvalidType(void ignored) => const InvalidType();
 
 const TextSerializer<DynamicType> dynamicTypeSerializer =
-    const Wrapped(unwrapDynamicType, wrapDynamicType, const Nothing());
+    const Wrapped<void, DynamicType>(
+        unwrapDynamicType, wrapDynamicType, const Nothing());
 
 void unwrapDynamicType(DynamicType type) {}
 
 DynamicType wrapDynamicType(void ignored) => const DynamicType();
 
 const TextSerializer<VoidType> voidTypeSerializer =
-    const Wrapped(unwrapVoidType, wrapVoidType, const Nothing());
+    const Wrapped<void, VoidType>(
+        unwrapVoidType, wrapVoidType, const Nothing());
 
 void unwrapVoidType(VoidType type) {}
 
 VoidType wrapVoidType(void ignored) => const VoidType();
 
 const TextSerializer<NeverType> neverTypeSerializer =
-    const Wrapped(unwrapNeverType, wrapNeverType, const Nothing());
+    const Wrapped<void, NeverType>(
+        unwrapNeverType, wrapNeverType, const Nothing());
 
 void unwrapNeverType(NeverType type) {}
 
 NeverType wrapNeverType(void ignored) => const NeverType.legacy();
 
 // TODO(dmitryas):  Also handle nameParameters, and typedefType.
-TextSerializer<FunctionType> functionTypeSerializer = new Wrapped(
+TextSerializer<FunctionType> functionTypeSerializer = new Wrapped<
+        Tuple2<List<TypeParameter>,
+            Tuple4<List<DartType>, List<DartType>, List<NamedType>, DartType>>,
+        FunctionType>(
     unwrapFunctionType,
     wrapFunctionType,
     new Bind(
@@ -1387,8 +1435,11 @@
       namedParameters: tuple.second.third);
 }
 
-TextSerializer<NamedType> namedTypeSerializer = new Wrapped(unwrapNamedType,
-    wrapNamedType, Tuple2Serializer(const DartString(), dartTypeSerializer));
+TextSerializer<NamedType> namedTypeSerializer =
+    new Wrapped<Tuple2<String, DartType>, NamedType>(
+        unwrapNamedType,
+        wrapNamedType,
+        Tuple2Serializer(const DartString(), dartTypeSerializer));
 
 Tuple2<String, DartType> unwrapNamedType(NamedType namedType) {
   return new Tuple2(namedType.name, namedType.type);
@@ -1398,11 +1449,12 @@
   return new NamedType(tuple.first, tuple.second);
 }
 
-TextSerializer<TypeParameterType> typeParameterTypeSerializer = new Wrapped(
-    unwrapTypeParameterType,
-    wrapTypeParameterType,
-    Tuple2Serializer(
-        new ScopedUse<TypeParameter>(), new Optional(dartTypeSerializer)));
+TextSerializer<TypeParameterType> typeParameterTypeSerializer =
+    new Wrapped<Tuple2<TypeParameter, DartType?>, TypeParameterType>(
+        unwrapTypeParameterType,
+        wrapTypeParameterType,
+        Tuple2Serializer(
+            new ScopedUse<TypeParameter>(), new Optional(dartTypeSerializer)));
 
 Tuple2<TypeParameter, DartType?> unwrapTypeParameterType(
     TypeParameterType node) {
@@ -1414,11 +1466,12 @@
   return new TypeParameterType(tuple.first, Nullability.legacy, tuple.second);
 }
 
-TextSerializer<InterfaceType> interfaceTypeSerializer = new Wrapped(
-    unwrapInterfaceType,
-    wrapInterfaceType,
-    Tuple2Serializer(
-        canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
+TextSerializer<InterfaceType> interfaceTypeSerializer =
+    new Wrapped<Tuple2<CanonicalName, List<DartType>>, InterfaceType>(
+        unwrapInterfaceType,
+        wrapInterfaceType,
+        Tuple2Serializer(
+            canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
 
 Tuple2<CanonicalName, List<DartType>> unwrapInterfaceType(InterfaceType node) {
   return new Tuple2(node.className.canonicalName!, node.typeArguments);
@@ -1429,11 +1482,12 @@
       tuple.first.reference, Nullability.legacy, tuple.second);
 }
 
-TextSerializer<TypedefType> typedefTypeSerializer = new Wrapped(
-    unwrapTypedefType,
-    wrapTypedefType,
-    Tuple2Serializer(
-        canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
+TextSerializer<TypedefType> typedefTypeSerializer =
+    new Wrapped<Tuple2<CanonicalName, List<DartType>>, TypedefType>(
+        unwrapTypedefType,
+        wrapTypedefType,
+        Tuple2Serializer(
+            canonicalNameSerializer, new ListSerializer(dartTypeSerializer)));
 
 Tuple2<CanonicalName, List<DartType>> unwrapTypedefType(TypedefType node) {
   return new Tuple2(node.typedefReference.canonicalName!, node.typeArguments);
@@ -1445,7 +1499,8 @@
 }
 
 TextSerializer<FutureOrType> futureOrTypeSerializer =
-    new Wrapped(unwrapFutureOrType, wrapFutureOrType, dartTypeSerializer);
+    new Wrapped<DartType, FutureOrType>(
+        unwrapFutureOrType, wrapFutureOrType, dartTypeSerializer);
 
 DartType unwrapFutureOrType(FutureOrType node) {
   return node.typeArgument;
@@ -1456,7 +1511,7 @@
 }
 
 TextSerializer<NullType> nullTypeSerializer =
-    new Wrapped(unwrapNullType, wrapNullType, const Nothing());
+    new Wrapped<void, NullType>(unwrapNullType, wrapNullType, const Nothing());
 
 void unwrapNullType(NullType type) {}
 
@@ -1530,8 +1585,9 @@
   }
 }
 
-TextSerializer<ExpressionStatement> expressionStatementSerializer = new Wrapped(
-    unwrapExpressionStatement, wrapExpressionStatement, expressionSerializer);
+TextSerializer<ExpressionStatement> expressionStatementSerializer =
+    new Wrapped<Expression, ExpressionStatement>(unwrapExpressionStatement,
+        wrapExpressionStatement, expressionSerializer);
 
 Expression unwrapExpressionStatement(ExpressionStatement statement) {
   return statement.expression;
@@ -1553,15 +1609,17 @@
   return new ReturnStatement(expression);
 }
 
-TextSerializer<ReturnStatement> returnVoidStatementSerializer = new Wrapped(
-    unwrapReturnVoidStatement, wrapReturnVoidStatement, const Nothing());
+TextSerializer<ReturnStatement> returnVoidStatementSerializer =
+    new Wrapped<void, ReturnStatement>(
+        unwrapReturnVoidStatement, wrapReturnVoidStatement, const Nothing());
 
 void unwrapReturnVoidStatement(void ignored) {}
 
 ReturnStatement wrapReturnVoidStatement(void ignored) => new ReturnStatement();
 
 TextSerializer<YieldStatement> yieldStatementSerializer =
-    new Wrapped(unwrapYieldStatement, wrapYieldStatement, expressionSerializer);
+    new Wrapped<Expression, YieldStatement>(
+        unwrapYieldStatement, wrapYieldStatement, expressionSerializer);
 
 Expression unwrapYieldStatement(YieldStatement node) => node.expression;
 
@@ -1657,10 +1715,11 @@
   }
 }
 
-TextSerializer<IfStatement> ifStatementSerializer = new Wrapped(
-    unwrapIfStatement,
-    wrapIfStatement,
-    Tuple2Serializer(expressionSerializer, statementSerializer));
+TextSerializer<IfStatement> ifStatementSerializer =
+    new Wrapped<Tuple2<Expression, Statement>, IfStatement>(
+        unwrapIfStatement,
+        wrapIfStatement,
+        Tuple2Serializer(expressionSerializer, statementSerializer));
 
 Tuple2<Expression, Statement> unwrapIfStatement(IfStatement node) {
   return new Tuple2(node.condition, node.then);
@@ -1670,11 +1729,12 @@
   return new IfStatement(tuple.first, tuple.second, null);
 }
 
-TextSerializer<IfStatement> ifElseStatementSerializer = new Wrapped(
-    unwrapIfElseStatement,
-    wrapIfElseStatement,
-    Tuple3Serializer(
-        expressionSerializer, statementSerializer, statementSerializer));
+TextSerializer<IfStatement> ifElseStatementSerializer =
+    new Wrapped<Tuple3<Expression, Statement, Statement?>, IfStatement>(
+        unwrapIfElseStatement,
+        wrapIfElseStatement,
+        Tuple3Serializer<Expression, Statement, Statement?>(
+            expressionSerializer, statementSerializer, statementSerializer));
 
 Tuple3<Expression, Statement, Statement?> unwrapIfElseStatement(
     IfStatement node) {
@@ -1687,16 +1747,18 @@
 }
 
 TextSerializer<EmptyStatement> emptyStatementSerializer =
-    new Wrapped(unwrapEmptyStatement, wrapEmptyStatement, const Nothing());
+    new Wrapped<void, EmptyStatement>(
+        unwrapEmptyStatement, wrapEmptyStatement, const Nothing());
 
 void unwrapEmptyStatement(EmptyStatement node) {}
 
 EmptyStatement wrapEmptyStatement(void ignored) => new EmptyStatement();
 
-TextSerializer<WhileStatement> whileStatementSerializer = new Wrapped(
-    unwrapWhileStatement,
-    wrapWhileStatement,
-    new Tuple2Serializer(expressionSerializer, statementSerializer));
+TextSerializer<WhileStatement> whileStatementSerializer =
+    new Wrapped<Tuple2<Expression, Statement>, WhileStatement>(
+        unwrapWhileStatement,
+        wrapWhileStatement,
+        new Tuple2Serializer(expressionSerializer, statementSerializer));
 
 Tuple2<Expression, Statement> unwrapWhileStatement(WhileStatement node) {
   return new Tuple2(node.condition, node.body);
@@ -1706,10 +1768,11 @@
   return new WhileStatement(tuple.first, tuple.second);
 }
 
-TextSerializer<DoStatement> doStatementSerializer = new Wrapped(
-    unwrapDoStatement,
-    wrapDoStatement,
-    new Tuple2Serializer(statementSerializer, expressionSerializer));
+TextSerializer<DoStatement> doStatementSerializer =
+    new Wrapped<Tuple2<Statement, Expression>, DoStatement>(
+        unwrapDoStatement,
+        wrapDoStatement,
+        new Tuple2Serializer(statementSerializer, expressionSerializer));
 
 Tuple2<Statement, Expression> unwrapDoStatement(DoStatement node) {
   return new Tuple2(node.body, node.condition);
@@ -1731,7 +1794,9 @@
         new Tuple3Serializer(Optional(expressionSerializer),
             new ListSerializer(expressionSerializer), statementSerializer)));
 
-TextSerializer<ForInStatement> forInStatementSerializer = new Wrapped(
+TextSerializer<ForInStatement> forInStatementSerializer = new Wrapped<
+        Tuple2<Expression, Tuple2<VariableDeclaration, Statement>>,
+        ForInStatement>(
     unwrapForInStatement,
     wrapForInStatement,
     new Tuple2Serializer(expressionSerializer,
@@ -1748,7 +1813,9 @@
       tuple.second.first, tuple.first, tuple.second.second);
 }
 
-TextSerializer<ForInStatement> awaitForInStatementSerializer = new Wrapped(
+TextSerializer<ForInStatement> awaitForInStatementSerializer = new Wrapped<
+        Tuple2<Expression, Tuple2<VariableDeclaration, Statement>>,
+        ForInStatement>(
     unwrapForInStatement,
     wrapAwaitForInStatement,
     new Tuple2Serializer(expressionSerializer,
@@ -1769,14 +1836,13 @@
             Wrapped<Tuple2<String?, LabeledStatement>, LabeledStatement>(
                 (ls) => Tuple2("L", ls),
                 (t) => t.second,
-                Binder(Wrapped(
+                Binder(Wrapped<void, LabeledStatement>(
                     (_) => null, (_) => LabeledStatement(null), Nothing()))),
             statementSerializer));
 
-TextSerializer<BreakStatement> breakSerializer = new Wrapped(
-    unwrapBreakStatement,
-    wrapBreakStatement,
-    const ScopedUse<LabeledStatement>());
+TextSerializer<BreakStatement> breakSerializer =
+    new Wrapped<LabeledStatement, BreakStatement>(unwrapBreakStatement,
+        wrapBreakStatement, const ScopedUse<LabeledStatement>());
 
 LabeledStatement unwrapBreakStatement(BreakStatement node) {
   return node.target;
@@ -1844,12 +1910,12 @@
             (u) => SwitchCase(u, List.filled(u.length, 0), null),
             ListSerializer(expressionSerializer))));
 
-TextSerializer<SwitchCase> switchCaseDefaultSerializer = Wrapped<
-        Tuple2<String?, SwitchCase>, SwitchCase>(
-    (w) => Tuple2("L", w),
-    (u) => u.second,
-    Binder(
-        Wrapped((w) => null, (u) => SwitchCase.defaultCase(null), Nothing())));
+TextSerializer<SwitchCase> switchCaseDefaultSerializer =
+    Wrapped<Tuple2<String?, SwitchCase>, SwitchCase>(
+        (w) => Tuple2("L", w),
+        (u) => u.second,
+        Binder(Wrapped<void, SwitchCase>(
+            (w) => null, (u) => SwitchCase.defaultCase(null), Nothing())));
 
 TextSerializer<SwitchCase> switchCaseSerializer = Case(SwitchCaseTagger(), {
   "case": switchCaseCaseSerializer,
@@ -2535,6 +2601,7 @@
   Class.FlagEliminatedMixin: "eliminated-mixin",
   Class.FlagMixinDeclaration: "mixin-declaration",
   Class.FlagHasConstConstructor: "has-const-constructor",
+  Class.FlagMacro: "macro",
 };
 
 class ClassFlagTagger implements Tagger<int> {
@@ -2837,7 +2904,7 @@
 Map<String, Wrapped<void, T>> convertFlagsMap<T>(Map<T, String> map) {
   return map.entries.toMap(
       key: (e) => e.value,
-      value: (e) => Wrapped((_) => null, (_) => e.key, Nothing()));
+      value: (e) => Wrapped<void, T>((_) => null, (_) => e.key, Nothing()));
 }
 
 extension MapFromIterable<E> on Iterable<E> {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index e9d5c3c..d6ef537 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -442,7 +442,8 @@
         type: FunctionType([], syncOpType, staticTypeContext.nonNullable));
 
     final syncOpVariable = VariableDeclaration(ContinuationVariables.syncOp);
-    final syncOpDecl = FunctionDeclaration(syncOpVariable, syncOpFN);
+    final syncOpDecl = FunctionDeclaration(syncOpVariable, syncOpFN)
+      ..fileOffset = enclosingFunction.fileOffset;
 
     enclosingFunction.body = Block([
       // :sync_op_gen() {
@@ -466,7 +467,8 @@
                 // return sync_op;
                 ReturnStatement(VariableGet(syncOpVariable)),
               ]),
-              returnType: syncOpType)),
+              returnType: syncOpType))
+        ..fileOffset = enclosingFunction.fileOffset,
 
       // return _SyncIterable<T>(:sync_op_gen);
       ReturnStatement(ConstructorInvocation(
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 5320daf..a67f7ea 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -26,6 +26,9 @@
     return new HierarchyBasedTypeEnvironment(coreTypes, hierarchy);
   }
 
+  @override
+  ClassHierarchy get hierarchy;
+
   Class get intClass => coreTypes.intClass;
   Class get numClass => coreTypes.numClass;
   Class get functionClass => coreTypes.functionClass;
diff --git a/pkg/kernel/lib/util/graph.dart b/pkg/kernel/lib/util/graph.dart
index 4119f1b..105b170b 100644
--- a/pkg/kernel/lib/util/graph.dart
+++ b/pkg/kernel/lib/util/graph.dart
@@ -4,12 +4,42 @@
 
 library fasta.graph;
 
+import 'dart:math';
+
+import '../ast.dart';
+
 abstract class Graph<T> {
   Iterable<T> get vertices;
 
   Iterable<T> neighborsOf(T vertex);
 }
 
+/// [Graph] implementation using a collection of [Library] nodes as the graph
+/// vertices and using library dependencies to compute neighbors.
+///
+/// If [coreLibrary] is provided, it will be included in the neighbor of all
+/// vertices. Otherwise, `dart:core` will only be neighboring libraries that
+/// explicitly dependent on it.
+class LibraryGraph implements Graph<Library> {
+  final Iterable<Library> libraries;
+  final Library? coreLibrary;
+
+  LibraryGraph(this.libraries, {this.coreLibrary});
+
+  @override
+  Iterable<Library> get vertices => libraries;
+
+  @override
+  Iterable<Library> neighborsOf(Library library) sync* {
+    if (coreLibrary != null && library != coreLibrary) {
+      yield coreLibrary!;
+    }
+    for (LibraryDependency dependency in library.dependencies) {
+      yield dependency.targetLibrary;
+    }
+  }
+}
+
 /// Computes the strongly connected components of [graph].
 ///
 /// This implementation is based on [Dijkstra's path-based strong component
@@ -77,3 +107,104 @@
 
   return result;
 }
+
+/// A [Graph] using strongly connected components, as computed by
+/// [computeStrongComponents], as vertices. Neighbors are computed using the
+/// neighbors of the provided [subgraph] which was used to compute the strongly
+/// connected components.
+class StrongComponentGraph<T> implements Graph<List<T>> {
+  final Graph<T> subgraph;
+  final List<List<T>> components;
+  final Map<T, List<T>> _elementToComponentMap = {};
+  final Map<List<T>, Set<List<T>>> _neighborsMap = {};
+
+  StrongComponentGraph(this.subgraph, this.components) {
+    for (List<T> component in components) {
+      for (T element in component) {
+        _elementToComponentMap[element] = component;
+      }
+    }
+  }
+
+  Set<List<T>> _computeNeighborsOf(List<T> component) {
+    Set<List<T>> neighbors = {};
+    for (T element in component) {
+      for (T neighborElement in subgraph.neighborsOf(element)) {
+        List<T> neighborComponent = _elementToComponentMap[neighborElement]!;
+        if (component != neighborComponent) {
+          neighbors.add(neighborComponent);
+        }
+      }
+    }
+    return neighbors;
+  }
+
+  @override
+  Iterable<List<T>> neighborsOf(List<T> vertex) {
+    return _neighborsMap[vertex] ??= _computeNeighborsOf(vertex);
+  }
+
+  @override
+  Iterable<List<T>> get vertices => components;
+}
+
+const int cyclicMarker = -1;
+
+int _topologicalSortInternal<T>(
+    Graph<T> graph, TopologicalSortResult<T> result, T vertex) {
+  int? index = result.indexMap[vertex];
+  if (index == null) {
+    result.indexMap[vertex] = cyclicMarker;
+    int index = 0;
+    for (T neighbor in graph.neighborsOf(vertex)) {
+      int neighborIndex = _topologicalSortInternal(graph, result, neighbor);
+      if (neighborIndex == cyclicMarker) {
+        result.cyclicVertices.add(vertex);
+        return cyclicMarker;
+      } else {
+        index = max(index, neighborIndex + 1);
+      }
+    }
+    result.sortedVertices.add(vertex);
+    if (index >= result.layers.length) {
+      assert(index == result.layers.length);
+      result.layers.add([vertex]);
+    } else {
+      result.layers[index].add(vertex);
+    }
+    return result.indexMap[vertex] = index;
+  }
+  return index;
+}
+
+/// Perform a topological sorting of the vertices in [graph], returning a
+/// [TopologicalSortResult] object with the result.
+TopologicalSortResult<T> topologicalSort<T>(Graph<T> graph) {
+  TopologicalSortResult<T> result = new TopologicalSortResult();
+
+  for (T vertex in graph.vertices) {
+    _topologicalSortInternal(graph, result, vertex);
+  }
+  return result;
+}
+
+/// The result of computing the [topologicalSort] on a [Graph].
+class TopologicalSortResult<T> {
+  /// The non-cyclic vertices of the graph sorted in topological order.
+  final List<T> sortedVertices = [];
+
+  /// The cyclic vertices of graph, including vertices that have a path to
+  /// a vertex.
+  final List<T> cyclicVertices = [];
+
+  /// The topological index of all non-cyclic vertices of the graph.
+  ///
+  /// The "topological index" of a vertex is the length of the longest path
+  /// through neighbors. For vertices with no neighbors, the index is 0.
+  /// For any other vertex, it is 1 plus max of the index of its neighbors.
+  final Map<T, int> indexMap = {};
+
+  /// The non-cyclic vertices in layers according to their topological index.
+  /// That is, `layers[i]` contain the list of vertices with index `i`.
+  final List<List<T>> layers = [];
+}
diff --git a/pkg/kernel/test/clone_test.dart b/pkg/kernel/test/clone_test.dart
index 5501551..51ee518 100644
--- a/pkg/kernel/test/clone_test.dart
+++ b/pkg/kernel/test/clone_test.dart
@@ -155,7 +155,8 @@
     if (reference1 != null && reference2 != null) {
       ReferenceName referenceName1 = ReferenceName.fromNamedNode(member1);
       ReferenceName referenceName2 = ReferenceName.fromNamedNode(member2);
-      if (referenceName1.memberName == referenceName2.memberName &&
+      if (referenceName1.kind == referenceName2.kind &&
+              referenceName1.memberName == referenceName2.memberName &&
               referenceName1.memberUri == referenceName2.memberUri &&
               referenceName2.declarationName == null ||
           referenceName2.libraryUri == null) {
diff --git a/pkg/kernel/test/graph_test.dart b/pkg/kernel/test/graph_test.dart
index 143ab01..83827be 100644
--- a/pkg/kernel/test/graph_test.dart
+++ b/pkg/kernel/test/graph_test.dart
@@ -8,6 +8,13 @@
 
 import 'package:kernel/util/graph.dart';
 
+const String A = 'A';
+const String B = 'B';
+const String C = 'C';
+const String D = 'D';
+const String E = 'E';
+const String F = 'F';
+
 class TestGraph implements Graph<String> {
   final Map<String, List<String>> graph;
 
@@ -20,185 +27,533 @@
   Iterable<String> neighborsOf(String vertex) => graph[vertex]!;
 }
 
-void test(String expected, Map<String, List<String>> graph) {
-  List<List<String>> result = computeStrongComponents(new TestGraph(graph));
-  Expect.stringEquals(expected, "$result");
-}
+void test(
+    {required List<List<String>> expectedStrongComponents,
+    List<String> expectedSortedVertices = const [],
+    List<String> expectedCyclicVertices = const [],
+    List<List<String>> expectedLayers = const [],
+    List<List<List<String>>> expectedStrongLayers = const [],
+    required Map<String, List<String>> graphData}) {
+  Graph<String> graph = new TestGraph(graphData);
 
-void checkGraph(Map<String, List<String>> graph, String startingNodeName,
-    List<List<String>> expectedEvaluations, List<bool> expectedSccFlags) {
-  List<List<String>> result = computeStrongComponents(new TestGraph(graph));
-  List<List<String>> expectedReversed = <List<String>>[];
-  for (List<String> list in expectedEvaluations) {
-    expectedReversed.add(list.reversed.toList());
+  List<List<String>> strongComponentResult = computeStrongComponents(graph);
+  Expect.equals(
+      expectedStrongComponents.length,
+      strongComponentResult.length,
+      "Unexpected strongly connected components count. "
+      "Expected ${expectedStrongComponents}, "
+      "actual ${strongComponentResult}");
+  for (int index = 0; index < expectedStrongComponents.length; index++) {
+    Expect.listEquals(
+        expectedStrongComponents[index],
+        strongComponentResult[index],
+        "Unexpected strongly connected components. "
+        "Expected $expectedStrongComponents, actual $strongComponentResult.");
   }
-  Expect.stringEquals(expectedReversed.join(", "), result.join(", "));
+
+  TopologicalSortResult<String> topologicalResult = topologicalSort(graph);
+  Set<String> sortedAndCyclicVertices = topologicalResult.sortedVertices
+      .toSet()
+      .intersection(topologicalResult.cyclicVertices.toSet());
+  Expect.isTrue(sortedAndCyclicVertices.isEmpty,
+      "Found vertices both sorted and cyclic: $sortedAndCyclicVertices");
+  List<String> sortedOrCyclicVertices = [
+    ...topologicalResult.sortedVertices,
+    ...topologicalResult.cyclicVertices
+  ];
+  Expect.equals(
+      graphData.length,
+      sortedOrCyclicVertices.length,
+      "Unexpected vertex count. Expected ${graphData.length}, "
+      "found ${sortedOrCyclicVertices.length}.");
+  Expect.listEquals(
+      expectedSortedVertices,
+      topologicalResult.sortedVertices,
+      "Unexpected sorted vertices. "
+      "Expected $expectedSortedVertices, "
+      "actual ${topologicalResult.sortedVertices}.");
+  Expect.listEquals(
+      expectedCyclicVertices,
+      topologicalResult.cyclicVertices,
+      "Unexpected cyclic vertices. "
+      "Expected $expectedCyclicVertices, "
+      "actual ${topologicalResult.cyclicVertices}.");
+  Expect.equals(
+      expectedLayers.length,
+      topologicalResult.layers.length,
+      "Unexpected topological layer count. "
+      "Expected ${expectedLayers}, "
+      "actual ${topologicalResult.layers}");
+  for (int index = 0; index < expectedLayers.length; index++) {
+    Expect.listEquals(
+        expectedLayers[index],
+        topologicalResult.layers[index],
+        "Unexpected topological layers. "
+        "Expected $expectedLayers, "
+        "actual ${topologicalResult.layers}.");
+    for (String vertex in topologicalResult.layers[index]) {
+      int actualIndex = topologicalResult.indexMap[vertex]!;
+      Expect.equals(
+          index,
+          actualIndex,
+          "Unexpected topological index for $vertex. "
+          "Expected $index, found $actualIndex.");
+    }
+  }
+
+  StrongComponentGraph<String> strongComponentGraph =
+      new StrongComponentGraph(graph, strongComponentResult);
+  TopologicalSortResult<List<String>> strongTopologicalResult =
+      topologicalSort(strongComponentGraph);
+  Expect.equals(
+      expectedStrongLayers.length,
+      strongTopologicalResult.layers.length,
+      "Unexpected strong topological layer count. "
+      "Expected ${expectedStrongLayers}, "
+      "actual ${strongTopologicalResult.layers}");
+  for (int index = 0; index < expectedStrongLayers.length; index++) {
+    List<List<String>> expectedStrongLayer = expectedStrongLayers[index];
+    List<List<String>> strongLayer = strongTopologicalResult.layers[index];
+    Expect.equals(
+        expectedStrongLayer.length,
+        strongLayer.length,
+        "Unexpected strong topological layer $index count. "
+        "Expected ${expectedStrongLayers}, "
+        "actual ${strongTopologicalResult.layers}");
+
+    for (int subIndex = 0; subIndex < expectedStrongLayer.length; subIndex++) {
+      Expect.listEquals(
+          expectedStrongLayer[subIndex],
+          strongLayer[subIndex],
+          "Unexpected strong topological layer $index. "
+          "Expected $expectedStrongLayer, "
+          "actual $strongLayer.");
+    }
+    for (List<String> vertex in strongTopologicalResult.layers[index]) {
+      int actualIndex = strongTopologicalResult.indexMap[vertex]!;
+      Expect.equals(
+          index,
+          actualIndex,
+          "Unexpected strong topological index for $vertex. "
+          "Expected $index, found $actualIndex.");
+    }
+  }
 }
 
 void main() {
-  test("[[B, A], [C], [D]]", {
-    "A": ["B"],
-    "B": ["A"],
-    "C": ["A"],
-    "D": ["C"],
-  });
+  test(graphData: {
+    A: [B],
+    B: [A],
+    C: [A],
+    D: [C],
+  }, expectedStrongComponents: [
+    [B, A],
+    [C],
+    [D]
+  ], expectedCyclicVertices: [
+    B,
+    A,
+    C,
+    D
+  ], expectedStrongLayers: [
+    [
+      [B, A]
+    ],
+    [
+      [C]
+    ],
+    [
+      [D]
+    ]
+  ]);
 
-  test("[]", {});
+  test(graphData: {}, expectedStrongComponents: []);
 
-  test("[[A], [B], [C], [D]]", {
-    "A": [],
-    "B": [],
-    "C": [],
-    "D": [],
-  });
+  test(graphData: {
+    A: [],
+    B: [],
+    C: [],
+    D: [],
+  }, expectedStrongComponents: [
+    [A],
+    [B],
+    [C],
+    [D]
+  ], expectedSortedVertices: [
+    A,
+    B,
+    C,
+    D
+  ], expectedLayers: [
+    [A, B, C, D]
+  ], expectedStrongLayers: [
+    [
+      [A],
+      [B],
+      [C],
+      [D]
+    ]
+  ]);
 
-  test("[[B, A], [C], [D]]", {
-    "D": ["C"],
-    "C": ["A"],
-    "B": ["A"],
-    "A": ["B"],
-  });
+  test(graphData: {
+    D: [C],
+    C: [A],
+    B: [A],
+    A: [B],
+  }, expectedStrongComponents: [
+    [B, A],
+    [C],
+    [D]
+  ], expectedCyclicVertices: [
+    B,
+    A,
+    C,
+    D
+  ], expectedStrongLayers: [
+    [
+      [B, A]
+    ],
+    [
+      [C]
+    ],
+    [
+      [D]
+    ]
+  ]);
 
-  test("[[D], [C], [B], [A]]", {
-    "A": ["B"],
-    "B": ["C"],
-    "C": ["D"],
-    "D": [],
-  });
+  test(graphData: {
+    A: [B],
+    B: [C],
+    C: [D],
+    D: [],
+  }, expectedStrongComponents: [
+    [D],
+    [C],
+    [B],
+    [A]
+  ], expectedSortedVertices: [
+    D,
+    C,
+    B,
+    A
+  ], expectedLayers: [
+    [D],
+    [C],
+    [B],
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [D]
+    ],
+    [
+      [C]
+    ],
+    [
+      [B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
-  test("[[D], [C], [B], [A]]", {
-    "D": [],
-    "C": ["D"],
-    "B": ["C"],
-    "A": ["B"],
-  });
+  test(graphData: {
+    D: [],
+    C: [D],
+    B: [C],
+    A: [B],
+  }, expectedStrongComponents: [
+    [D],
+    [C],
+    [B],
+    [A]
+  ], expectedSortedVertices: [
+    D,
+    C,
+    B,
+    A
+  ], expectedLayers: [
+    [D],
+    [C],
+    [B],
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [D]
+    ],
+    [
+      [C]
+    ],
+    [
+      [B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
-  test("[[A], [B], [C], [D]]", {
-    "A": [],
-    "B": ["A"],
-    "C": ["A"],
-    "D": ["B", "C"],
-  });
+  test(graphData: {
+    A: [],
+    B: [A],
+    C: [A],
+    D: [B, C],
+  }, expectedStrongComponents: [
+    [A],
+    [B],
+    [C],
+    [D]
+  ], expectedSortedVertices: [
+    A,
+    B,
+    C,
+    D
+  ], expectedLayers: [
+    [A],
+    [B, C],
+    [D]
+  ], expectedStrongLayers: [
+    [
+      [A]
+    ],
+    [
+      [B],
+      [C]
+    ],
+    [
+      [D]
+    ]
+  ]);
 
   // Test a complex graph.
-  checkGraph(
-      {
-        'a': ['b', 'c'],
-        'b': ['c', 'd'],
-        'c': [],
-        'd': ['c', 'e'],
-        'e': ['b', 'f'],
-        'f': ['c', 'd']
-      },
-      'a',
-      [
-        ['c'],
-        ['b', 'd', 'e', 'f'],
-        ['a']
-      ],
-      [false, true, false]);
+  test(graphData: {
+    A: [B, C],
+    B: [C, D],
+    C: [],
+    D: [C, E],
+    E: [B, F],
+    F: [C, D]
+  }, expectedStrongComponents: [
+    [C],
+    [F, E, D, B],
+    [A],
+  ], expectedSortedVertices: [
+    C
+  ], expectedCyclicVertices: [
+    E,
+    D,
+    B,
+    A,
+    F
+  ], expectedLayers: [
+    [C]
+  ], expectedStrongLayers: [
+    [
+      [C]
+    ],
+    [
+      [F, E, D, B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
   // Test a diamond-shaped graph.
-  checkGraph(
-      {
-        'a': ['b', 'c'],
-        'b': ['d'],
-        'c': ['d'],
-        'd': []
-      },
-      'a',
-      [
-        ['d'],
-        ['b'],
-        ['c'],
-        ['a']
-      ],
-      [false, false, false, false]);
+  test(graphData: {
+    A: [B, C],
+    B: [D],
+    C: [D],
+    D: []
+  }, expectedStrongComponents: [
+    [D],
+    [B],
+    [C],
+    [A],
+  ], expectedSortedVertices: [
+    D,
+    B,
+    C,
+    A
+  ], expectedLayers: [
+    [D],
+    [B, C],
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [D]
+    ],
+    [
+      [B],
+      [C]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph with a single node.
-  checkGraph(
-      {'a': []},
-      'a',
-      [
-        ['a']
-      ],
-      [false]);
+  test(graphData: {
+    A: []
+  }, expectedStrongComponents: [
+    [A]
+  ], expectedSortedVertices: [
+    A
+  ], expectedLayers: [
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph with a single node and a trivial cycle.
-  checkGraph(
-      {
-        'a': ['a']
-      },
-      'a',
-      [
-        ['a']
-      ],
-      [true]);
+  test(graphData: {
+    A: [A]
+  }, expectedStrongComponents: [
+    [A]
+  ], expectedCyclicVertices: [
+    A
+  ], expectedStrongLayers: [
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph with three nodes with circular dependencies.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': ['c'],
-        'c': ['a'],
-      },
-      'a',
-      [
-        ['a', 'b', 'c']
-      ],
-      [true]);
+  test(graphData: {
+    A: [B],
+    B: [C],
+    C: [A],
+  }, expectedStrongComponents: [
+    [C, B, A]
+  ], expectedCyclicVertices: [
+    C,
+    B,
+    A
+  ], expectedStrongLayers: [
+    [
+      [C, B, A]
+    ]
+  ]);
+
   // Test a graph A->B->C->D, where D points back to B and then C.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': ['c'],
-        'c': ['d'],
-        'd': ['b', 'c']
-      },
-      'a',
-      [
-        ['b', 'c', 'd'],
-        ['a']
-      ],
-      [true, false]);
+  test(graphData: {
+    A: [B],
+    B: [C],
+    C: [D],
+    D: [B, C]
+  }, expectedStrongComponents: [
+    [D, C, B],
+    [A]
+  ], expectedCyclicVertices: [
+    D,
+    C,
+    B,
+    A
+  ], expectedStrongLayers: [
+    [
+      [D, C, B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph A->B->C->D, where D points back to C and then B.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': ['c'],
-        'c': ['d'],
-        'd': ['c', 'b']
-      },
-      'a',
-      [
-        ['b', 'c', 'd'],
-        ['a']
-      ],
-      [true, false]);
+  test(graphData: {
+    A: [B],
+    B: [C],
+    C: [D],
+    D: [C, B]
+  }, expectedStrongComponents: [
+    [D, C, B],
+    [A]
+  ], expectedCyclicVertices: [
+    D,
+    C,
+    B,
+    A
+  ], expectedStrongLayers: [
+    [
+      [D, C, B]
+    ],
+    [
+      [A]
+    ]
+  ]);
 
   // Test a graph with two nodes with circular dependencies.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': ['a']
-      },
-      'a',
-      [
-        ['a', 'b']
-      ],
-      [true]);
+  test(graphData: {
+    A: [B],
+    B: [A]
+  }, expectedStrongComponents: [
+    [B, A]
+  ], expectedCyclicVertices: [
+    B,
+    A
+  ], expectedStrongLayers: [
+    [
+      [B, A]
+    ]
+  ]);
 
   // Test a graph with two nodes and a single dependency.
-  checkGraph(
-      {
-        'a': ['b'],
-        'b': []
-      },
-      'a',
-      [
-        ['b'],
-        ['a']
-      ],
-      [false, false]);
+  test(graphData: {
+    A: [B],
+    B: []
+  }, expectedStrongComponents: [
+    [B],
+    [A]
+  ], expectedSortedVertices: [
+    B,
+    A
+  ], expectedLayers: [
+    [B],
+    [A]
+  ], expectedStrongLayers: [
+    [
+      [B]
+    ],
+    [
+      [A]
+    ]
+  ]);
+
+  test(graphData: {
+    A: [],
+    B: [A],
+    C: [B, D],
+    D: [C],
+    E: [A],
+    F: [B],
+  }, expectedStrongComponents: [
+    [A],
+    [B],
+    [D, C],
+    [E],
+    [F],
+  ], expectedSortedVertices: [
+    A,
+    B,
+    E,
+    F,
+  ], expectedCyclicVertices: [
+    D,
+    C,
+  ], expectedLayers: [
+    [A],
+    [B, E],
+    [F],
+  ], expectedStrongLayers: [
+    [
+      [A]
+    ],
+    [
+      [B],
+      [E]
+    ],
+    [
+      [D, C],
+      [F]
+    ]
+  ]);
 }
diff --git a/pkg/kernel/test/reference_name_test.dart b/pkg/kernel/test/reference_name_test.dart
new file mode 100644
index 0000000..23c7b97
--- /dev/null
+++ b/pkg/kernel/test/reference_name_test.dart
@@ -0,0 +1,333 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/src/equivalence.dart';
+
+void testReferenceNames(Map<ReferenceNameKind, List<ReferenceNameObject>> map1,
+    Map<ReferenceNameKind, List<ReferenceNameObject>> map2) {
+  Expect.setEquals(map1.keys, map2.keys);
+  map1.forEach((ReferenceNameKind kind1, List<ReferenceNameObject> list1) {
+    map1.forEach((ReferenceNameKind kind2, List<ReferenceNameObject> list2) {
+      for (int index1 = 0; index1 < list1.length; index1++) {
+        for (int index2 = 0; index2 < list2.length; index2++) {
+          ReferenceName name1 = list1[index1].referenceName;
+          Object object1 = list1[index1].object;
+          ReferenceName name2 = list2[index2].referenceName;
+          Object object2 = list2[index2].object;
+          if (kind1 == kind2 && index1 == index2) {
+            Expect.equals(
+                name1,
+                name2,
+                "Expected $name1 for ${object1} (${object1.runtimeType}) and "
+                "$name2 for $object2 (${object2.runtimeType}) to be equal.");
+          } else {
+            Expect.notEquals(
+                name1,
+                name2,
+                "Expected $name1 for ${object1} (${object1.runtimeType}) and "
+                "$name2 for $object2 (${object2.runtimeType}) to be unequal.");
+          }
+        }
+      }
+    });
+  });
+}
+
+void main() {
+  Component component1 = createComponent();
+  Map<ReferenceNameKind, List<ReferenceNameObject>> referenceNames1 =
+      computeReferenceNamesFromComponent(component1);
+
+  Component component2 = createComponent();
+  Map<ReferenceNameKind, List<ReferenceNameObject>> referenceNames2 =
+      computeReferenceNamesFromComponent(component2);
+
+  Component component3 = createComponent();
+  component3.computeCanonicalNames();
+  CanonicalName root3 = component3.root;
+  Map<ReferenceNameKind, List<ReferenceNameObject>> referenceNames3 =
+      computeReferenceNamesFromCanonicalName(root3);
+
+  Component component4 = createComponent();
+  component4.computeCanonicalNames();
+  CanonicalName root4 = component3.root;
+  Map<ReferenceNameKind, List<ReferenceNameObject>> referenceNames4 =
+      computeReferenceNamesFromCanonicalName(root4);
+
+  testReferenceNames(referenceNames1, referenceNames2);
+  testReferenceNames(referenceNames1, referenceNames3);
+  testReferenceNames(referenceNames3, referenceNames4);
+}
+
+Component createComponent() {
+  Component component = new Component();
+  Library library1 = new Library(Uri.parse('test:library1'), fileUri: dummyUri);
+  component.libraries.add(library1);
+  Library library2 = new Library(Uri.parse('test:library2'), fileUri: dummyUri);
+  component.libraries.add(library2);
+
+  library1.addProcedure(new Procedure(
+      new Name('foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri));
+  library1.addProcedure(new Procedure(
+      new Name('bar'), ProcedureKind.Operator, new FunctionNode(null),
+      fileUri: dummyUri));
+  library1.addProcedure(new Procedure(
+      new Name('baz'), ProcedureKind.Factory, new FunctionNode(null),
+      fileUri: dummyUri));
+  library1.addProcedure(new Procedure(
+      new Name('boz'), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri));
+  // The setter should be distinct from the getter even when they have the same
+  // name.
+  library1.addProcedure(new Procedure(
+      new Name('boz'), ProcedureKind.Setter, new FunctionNode(null),
+      fileUri: dummyUri));
+
+  library1.addProcedure(new Procedure(
+      new Name('_boz', library2), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri));
+  // The setter should be distinct from the getter even when they have the same
+  // name.
+  library1.addProcedure(new Procedure(
+      new Name('_boz', library2), ProcedureKind.Setter, new FunctionNode(null),
+      fileUri: dummyUri));
+
+  library1.addField(
+      new Field.immutable(new Name('_foo', library1), fileUri: dummyUri));
+  library1.addField(
+      new Field.mutable(new Name('_bar', library2), fileUri: dummyUri));
+
+  Class class1 = new Class(name: 'Foo', fileUri: dummyUri);
+  library2.addClass(class1);
+  Class class2 = new Class(name: 'Bar', fileUri: dummyUri);
+  library2.addClass(class2);
+
+  class2.addConstructor(new Constructor(new FunctionNode(null),
+      name: new Name(''), fileUri: dummyUri));
+  class2.addConstructor(new Constructor(new FunctionNode(null),
+      name: new Name('_', library1), fileUri: dummyUri));
+
+  class2.addProcedure(new Procedure(
+      new Name('foo'), ProcedureKind.Method, new FunctionNode(null),
+      fileUri: dummyUri));
+  class2.addProcedure(new Procedure(
+      new Name('bar'), ProcedureKind.Operator, new FunctionNode(null),
+      fileUri: dummyUri));
+  class2.addProcedure(new Procedure(
+      new Name('baz'), ProcedureKind.Factory, new FunctionNode(null),
+      fileUri: dummyUri));
+  class2.addProcedure(new Procedure(
+      new Name('boz'), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri));
+  // The setter should be distinct from the getter even when they have the same
+  // name.
+  class2.addProcedure(new Procedure(
+      new Name('boz'), ProcedureKind.Setter, new FunctionNode(null),
+      fileUri: dummyUri));
+
+  class2.addProcedure(new Procedure(
+      new Name('_boz', library2), ProcedureKind.Getter, new FunctionNode(null),
+      fileUri: dummyUri));
+  // The setter should be distinct from the getter even when they have the same
+  // name.
+  class2.addProcedure(new Procedure(
+      new Name('_boz', library2), ProcedureKind.Setter, new FunctionNode(null),
+      fileUri: dummyUri));
+
+  class2.addField(
+      new Field.immutable(new Name('_foo', library1), fileUri: dummyUri));
+  class2.addField(
+      new Field.mutable(new Name('_bar', library2), fileUri: dummyUri));
+
+  class2.addRedirectingFactory(new RedirectingFactory(null,
+      name: new Name('_boz', library1),
+      function: new FunctionNode(null),
+      fileUri: dummyUri));
+
+  library1.addExtension(new Extension(name: 'Baz', fileUri: dummyUri));
+
+  library1.addTypedef(new Typedef('Boz', dummyDartType, fileUri: dummyUri));
+
+  return component;
+}
+
+void sortReferenceNames(Map<ReferenceNameKind, List<ReferenceNameObject>> map) {
+  map.forEach((key, value) {
+    value.sort(
+        (n1, n2) => n1.referenceName.name!.compareTo(n2.referenceName.name!));
+  });
+}
+
+Map<ReferenceNameKind, List<ReferenceNameObject>>
+    computeReferenceNamesFromComponent(Component component) {
+  Map<ReferenceNameKind, List<ReferenceNameObject>> map = {};
+  void add(ReferenceNameKind kind, ReferenceNameObject object) {
+    (map[kind] ??= []).add(object);
+  }
+
+  for (Library library in component.libraries) {
+    add(ReferenceNameKind.Library,
+        new ReferenceNameObject(ReferenceName.fromNamedNode(library), library));
+    for (Typedef typedef in library.typedefs) {
+      add(
+          ReferenceNameKind.Typedef,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(typedef), typedef));
+    }
+    for (Field field in library.fields) {
+      add(
+          ReferenceNameKind.Field,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(field, ReferenceNameKind.Field),
+              field));
+      add(
+          ReferenceNameKind.Getter,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(field, ReferenceNameKind.Getter),
+              field));
+      if (field.hasSetter) {
+        add(
+            ReferenceNameKind.Setter,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(field, ReferenceNameKind.Setter),
+                field));
+      }
+    }
+    for (Procedure procedure in library.procedures) {
+      ReferenceNameKind kind;
+      if (procedure.isGetter) {
+        kind = ReferenceNameKind.Getter;
+      } else if (procedure.isSetter) {
+        kind = ReferenceNameKind.Setter;
+      } else {
+        kind = ReferenceNameKind.Function;
+      }
+      add(
+          kind,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(procedure), procedure));
+    }
+    for (Class cls in library.classes) {
+      add(ReferenceNameKind.Declaration,
+          new ReferenceNameObject(ReferenceName.fromNamedNode(cls), cls));
+
+      for (Constructor constructor in cls.constructors) {
+        add(
+            ReferenceNameKind.Function,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(constructor), constructor));
+      }
+      for (Procedure procedure in cls.procedures) {
+        ReferenceNameKind kind;
+        if (procedure.isGetter) {
+          kind = ReferenceNameKind.Getter;
+        } else if (procedure.isSetter) {
+          kind = ReferenceNameKind.Setter;
+        } else {
+          kind = ReferenceNameKind.Function;
+        }
+        add(
+            kind,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(procedure), procedure));
+      }
+      for (Field field in cls.fields) {
+        add(ReferenceNameKind.Field,
+            new ReferenceNameObject(ReferenceName.fromNamedNode(field), field));
+        add(
+            ReferenceNameKind.Getter,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(field, ReferenceNameKind.Getter),
+                field));
+        if (field.hasSetter) {
+          add(
+              ReferenceNameKind.Setter,
+              new ReferenceNameObject(
+                  ReferenceName.fromNamedNode(field, ReferenceNameKind.Setter),
+                  field));
+        }
+      }
+      for (RedirectingFactory redirectingFactory in cls.redirectingFactories) {
+        add(
+            ReferenceNameKind.Function,
+            new ReferenceNameObject(
+                ReferenceName.fromNamedNode(redirectingFactory),
+                redirectingFactory));
+      }
+    }
+    for (Extension extension in library.extensions) {
+      add(
+          ReferenceNameKind.Declaration,
+          new ReferenceNameObject(
+              ReferenceName.fromNamedNode(extension), extension));
+    }
+  }
+  sortReferenceNames(map);
+  return map;
+}
+
+Map<ReferenceNameKind, List<ReferenceNameObject>>
+    computeReferenceNamesFromCanonicalName(CanonicalName root) {
+  Map<ReferenceNameKind, List<ReferenceNameObject>> map = {};
+
+  void visit(CanonicalName canonicalName, ReferenceNameKind kind) {
+    void addObject() {
+      (map[kind] ??= []).add(new ReferenceNameObject(
+          ReferenceName.fromCanonicalName(canonicalName), canonicalName));
+    }
+
+    switch (kind) {
+      case ReferenceNameKind.Unknown:
+        for (CanonicalName child in canonicalName.children) {
+          visit(child, ReferenceNameKind.Library);
+        }
+        break;
+      case ReferenceNameKind.Library:
+        addObject();
+        for (CanonicalName child in canonicalName.children) {
+          ReferenceNameKind childKind = ReferenceNameKind.Declaration;
+          if (CanonicalName.isSymbolicName(child.name)) {
+            childKind = ReferenceName.kindFromSymbolicName(child.name);
+          }
+          visit(child, childKind);
+        }
+        break;
+      case ReferenceNameKind.Declaration:
+        addObject();
+        for (CanonicalName child in canonicalName.children) {
+          visit(child, ReferenceName.kindFromSymbolicName(child.name));
+        }
+        break;
+      case ReferenceNameKind.Typedef:
+      case ReferenceNameKind.Function:
+      case ReferenceNameKind.Field:
+      case ReferenceNameKind.Getter:
+      case ReferenceNameKind.Setter:
+        if (canonicalName.childrenOrNull != null) {
+          // Private name
+          for (CanonicalName child in canonicalName.children) {
+            visit(child, kind);
+          }
+        } else {
+          addObject();
+        }
+        break;
+    }
+  }
+
+  visit(root, ReferenceNameKind.Unknown);
+
+  sortReferenceNames(map);
+  return map;
+}
+
+class ReferenceNameObject {
+  final ReferenceName referenceName;
+  final Object object;
+
+  ReferenceNameObject(this.referenceName, this.object);
+}
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 584fe42..ba14be9 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -274,7 +274,7 @@
 
 /// Used to annotate a method, field, or getter within a class, mixin, or
 /// extension, or a or top-level getter, variable or function to indicate that
-/// the value obtained by invoking it should be use. A value is considered used
+/// the value obtained by invoking it should be used. A value is considered used
 /// if it is assigned to a variable, passed to a function, or used as the target
 /// of an invocation, or invoked (if the result is itself a function).
 ///
diff --git a/pkg/nnbd_migration/analysis_options.yaml b/pkg/nnbd_migration/analysis_options.yaml
index d38c130..7f93d4a 100644
--- a/pkg/nnbd_migration/analysis_options.yaml
+++ b/pkg/nnbd_migration/analysis_options.yaml
@@ -11,8 +11,8 @@
     # There are currently 20 violations.
     unawaited_futures: ignore
 
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
 
 linter:
   rules:
diff --git a/pkg/nnbd_migration/lib/migration_cli.dart b/pkg/nnbd_migration/lib/migration_cli.dart
index 9a0a6ec..93691b6 100644
--- a/pkg/nnbd_migration/lib/migration_cli.dart
+++ b/pkg/nnbd_migration/lib/migration_cli.dart
@@ -358,6 +358,7 @@
           logger: isVerbose! ? loggerFactory(true) : null);
     } on Object catch (exception) {
       handleArgParsingException(exception);
+      return null;
     }
   }
 
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 030f06f..0fc0c32 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -84,6 +84,9 @@
   }
 
   @override
+  DecoratedType? _getCallMethodType(DecoratedType type) => null;
+
+  @override
   DecoratedType _getTypeParameterTypeBound(DecoratedType type) {
     return bounds[(type.type as TypeParameterType).element] ??
         (throw StateError('Unknown bound for $type'));
@@ -241,8 +244,10 @@
   /// assigned to so far inside it.  Otherwise `null`.
   Set<Element>? _elementsWrittenToInLocalFunction;
 
+  final LibraryElement _library;
+
   EdgeBuilder(this.typeProvider, this._typeSystem, this._variables, this._graph,
-      this.source, this.listener, this._decoratedClassHierarchy,
+      this.source, this.listener, this._decoratedClassHierarchy, this._library,
       {this.instrumentation})
       : _inheritanceManager = InheritanceManager3(),
         _whereOrNullTransformer =
@@ -490,7 +495,9 @@
   DecoratedType visitAwaitExpression(AwaitExpression node) {
     var expressionType = _dispatch(node.expression)!;
     var type = expressionType.type!;
-    if (_typeSystem.isSubtypeOf(type, typeProvider.futureDynamicType)) {
+    if (type.isDartCoreNull) {
+      // Nothing to do; awaiting `null` produces `null`.
+    } else if (_typeSystem.isSubtypeOf(type, typeProvider.futureDynamicType)) {
       expressionType = _decoratedClassHierarchy!
           .asInstanceOf(expressionType, typeProvider.futureElement)
           .typeArguments[0]!;
@@ -2363,6 +2370,20 @@
           typeArguments: [type]);
 
   @override
+  DecoratedType? _getCallMethodType(DecoratedType type) {
+    var typeType = type.type;
+    if (typeType is InterfaceType) {
+      var callMethod = typeType.lookUpMethod2('call', _library);
+      if (callMethod != null) {
+        return _variables!
+            .decoratedElementType(callMethod.declaration)
+            .substitute(type.asSubstitution);
+      }
+    }
+    return null;
+  }
+
+  @override
   DecoratedType? _getTypeParameterTypeBound(DecoratedType type) {
     // TODO(paulberry): once we've wired up flow analysis, return promoted
     // bounds if applicable.
@@ -3526,6 +3547,19 @@
             source: source, destination: destination, hard: hard);
         return;
       }
+      if (destinationType is FunctionType) {
+        var callMethodType = _getCallMethodType(source);
+        if (callMethodType != null) {
+          // Handle implicit `.call` coercion
+          _checkAssignment(origin, edgeTarget,
+              source: callMethodType,
+              destination: destination,
+              hard: false,
+              checkable: false,
+              sourceIsFunctionLiteral: sourceIsFunctionLiteral);
+          return;
+        }
+      }
       // A side cast. This may be an explicit side cast, or illegal code. There
       // is no nullability we can infer here.
       assert(
@@ -3796,6 +3830,11 @@
       EdgeOrigin origin, FixReasonTarget edgeTarget,
       {bool hard = false, bool checkable = true});
 
+  /// If [type] represents a class containing a `call` method, returns the
+  /// decorated type of the `call` method, with appropriate substitutions.
+  /// Otherwise returns `null`.
+  DecoratedType? _getCallMethodType(DecoratedType type);
+
   /// Given a [type] representing a type parameter, retrieves the type's bound.
   DecoratedType? _getTypeParameterTypeBound(DecoratedType type);
 }
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 5e57c8b..0caee26 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -292,6 +292,7 @@
     return TypeSystemImpl(
         implicitCasts: typeSystem.implicitCasts,
         isNonNullableByDefault: true,
+        strictCasts: typeSystem.strictCasts,
         strictInference: typeSystem.strictInference,
         typeProvider: nnbdTypeProvider);
   }
@@ -671,6 +672,31 @@
     return null;
   }
 
+  bool _isSubtypeOrCoercible(DartType type, DartType context) {
+    var fixBuilder = _fixBuilder!;
+    var typeSystem = fixBuilder._typeSystem;
+    if (typeSystem.isSubtypeOf(type, context)) {
+      return true;
+    }
+    if (context is FunctionType && type is InterfaceType) {
+      var callMethod =
+          type.lookUpMethod2('call', fixBuilder.unit!.declaredElement!.library);
+      if (callMethod != null) {
+        var variables = fixBuilder._variables!;
+        var callMethodType = variables.toFinalType(
+            variables.decoratedElementType(callMethod.declaration));
+        if (callMethod is MethodMember) {
+          callMethodType =
+              callMethod.substitution.substituteType(callMethodType);
+        }
+        if (typeSystem.isSubtypeOf(callMethodType, context)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   DartType _modifyRValueType(Expression node, DartType type,
       {DartType? context}) {
     if (node is MethodInvocation) {
@@ -696,7 +722,7 @@
     var ancestor = _findNullabilityContextAncestor(node);
     context ??=
         InferenceContext.getContext(ancestor) ?? DynamicTypeImpl.instance;
-    if (!_fixBuilder!._typeSystem.isSubtypeOf(type, context)) {
+    if (!_isSubtypeOrCoercible(type, context)) {
       var transformationInfo =
           _fixBuilder!._whereOrNullTransformer.tryTransformOrElseArgument(node);
       if (transformationInfo != null) {
@@ -1029,8 +1055,22 @@
       if (explicitTypeNeeded) {
         var firstNeededType = neededTypes[0];
         if (neededTypes.any((t) => t != firstNeededType)) {
-          throw UnimplementedError(
-              'Different explicit types needed in multi-variable declaration');
+          // Different variables need different types.  We handle this by
+          // introducing casts, which is not great but gets the job done.
+          for (int i = 0; i < node.variables.length; i++) {
+            if (neededTypes[i] != inferredTypes[i]) {
+              // We only have to worry about variables with initializers because
+              // variables without initializers will get the type `dynamic`.
+              var initializer = node.variables[i].initializer;
+              if (initializer != null) {
+                (_fixBuilder._getChange(initializer) as NodeChangeForExpression)
+                    .addExpressionChange(
+                        IntroduceAsChange(neededTypes[i], isDowncast: false),
+                        AtomicEditInfo(
+                            NullabilityFixDescription.otherCastExpression, {}));
+              }
+            }
+          }
         } else {
           (_fixBuilder._getChange(node) as NodeChangeForVariableDeclarationList)
               .addExplicitType = firstNeededType;
diff --git a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
index 53dc64a..2616d26 100644
--- a/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/resources/resources.g.dart
@@ -7708,7 +7708,7 @@
 ''';
 
 String? _migration_js;
-// migration_dart md5 is 'b415a0a8e74e830025f1153f10871ddd'
+// migration_dart md5 is '14d25a61d6f2ddb7ec83f7e257afa33d'
 String _migration_js_base64 = '''
 KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgcz1P
 YmplY3Qua2V5cyhhKQpmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIHE9c1tyXQpiW3FdPWFb
@@ -7787,7 +7787,7 @@
 JCl9dmFyIEI9ewp3Uigpe3JldHVybiBuZXcgQi5xcCgiIiwiIiwiIixDLkR4KX0sCllmKGEpe3ZhciBz
 LHIscSxwLG8sbixtLGwsaz1ILmsoYS5xKDAsInJlZ2lvbnMiKSksaj1ILmsoYS5xKDAsIm5hdmlnYXRp
 b25Db250ZW50IikpLGk9SC5rKGEucSgwLCJzb3VyY2VDb2RlIikpLGg9UC5GbCh0Lk4sdC5mNCkKZm9y
-KHM9dC5HLmEoYS5xKDAsImVkaXRzIikpLHM9cy5nUHUocykscz1zLmdtKHMpLHI9dC5SLHE9dC5naTtz
+KHM9dC5HLmEoYS5xKDAsImVkaXRzIikpLHM9cy5nUHUocykscz1zLmdtKHMpLHI9dC5hLHE9dC5naTtz
 LkYoKTspe3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1KLklUKHIuYShwLmIpKTtwLkYo
 KTspe209cC5nbCgpCmw9Si5VNihtKQpuLnB1c2gobmV3IEIuajgoSC5VYyhsLnEobSwibGluZSIpKSxI
 LmsobC5xKG0sImV4cGxhbmF0aW9uIikpLEguVWMobC5xKG0sIm9mZnNldCIpKSkpfWguWTUoMCxvLG4p
@@ -7812,9 +7812,9 @@
 biBzLTg3CnJldHVybi0xfSwKY2IoYSxiLGMpe3JldHVybiBhfSwKcUMoYSxiLGMsZCl7UC5rMShiLCJz
 dGFydCIpCmlmKGMhPW51bGwpe1AuazEoYywiZW5kIikKaWYoYj5jKUgudihQLlRFKGIsMCxjLCJzdGFy
 dCIsbnVsbCkpfXJldHVybiBuZXcgSC5uSChhLGIsYyxkLkMoIm5IPDA+IikpfSwKSzEoYSxiLGMsZCl7
-aWYodC5XLmIoYSkpcmV0dXJuIG5ldyBILnh5KGEsYixjLkMoIkA8MD4iKS5LcShkKS5DKCJ4eTwxLDI+
+aWYodC5VLmIoYSkpcmV0dXJuIG5ldyBILnh5KGEsYixjLkMoIkA8MD4iKS5LcShkKS5DKCJ4eTwxLDI+
 IikpCnJldHVybiBuZXcgSC5pMShhLGIsYy5DKCJAPDA+IikuS3EoZCkuQygiaTE8MSwyPiIpKX0sCmJL
-KGEsYixjKXtpZih0LlcuYihhKSl7UC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNShhLGIsYy5D
+KGEsYixjKXtpZih0LlUuYihhKSl7UC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNShhLGIsYy5D
 KCJkNTwwPiIpKX1QLmsxKGIsImNvdW50IikKcmV0dXJuIG5ldyBILkFNKGEsYixjLkMoIkFNPDA+Iikp
 fSwKV3AoKXtyZXR1cm4gbmV3IFAubGooIk5vIGVsZW1lbnQiKX0sCkFtKCl7cmV0dXJuIG5ldyBQLmxq
 KCJUb28gbWFueSBlbGVtZW50cyIpfSwKYXIoKXtyZXR1cm4gbmV3IFAubGooIlRvbyBmZXcgZWxlbWVu
@@ -7926,7 +7926,7 @@
 IG5ldyBILmF6KGEscixzP251bGw6Yi5yZWNlaXZlcil9LApSdShhKXtpZihhPT1udWxsKXJldHVybiBu
 ZXcgSC50ZShhKQppZihhIGluc3RhbmNlb2YgSC5icSlyZXR1cm4gSC50VyhhLHQuSy5hKGEuYSkpCmlm
 KHR5cGVvZiBhIT09Im9iamVjdCIpcmV0dXJuIGEKaWYoImRhcnRFeGNlcHRpb24iIGluIGEpcmV0dXJu
-IEgudFcoYSxhLmRhcnRFeGNlcHRpb24pCnJldHVybiBILnRsKGEpfSwKdFcoYSxiKXtpZih0Lm0uYihi
+IEgudFcoYSxhLmRhcnRFeGNlcHRpb24pCnJldHVybiBILnRsKGEpfSwKdFcoYSxiKXtpZih0LnIuYihi
 KSlpZihiLiR0aHJvd25Kc0Vycm9yPT1udWxsKWIuJHRocm93bkpzRXJyb3I9YQpyZXR1cm4gYn0sCnRs
 KGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsCmlmKCEoIm1lc3NhZ2UiIGlu
 IGEpKXJldHVybiBhCnM9YS5tZXNzYWdlCmlmKCJudW1iZXIiIGluIGEmJnR5cGVvZiBhLm51bWJlcj09
@@ -8355,11 +8355,11 @@
 cyYmSC5XZShhLGIueixjLGQsZSl9aWYocD09PTgpe2lmKEguV2UoYSxiLGMsZC56LGUpKXJldHVybiEw
 CnJldHVybiBILldlKGEsYixjLEgueFooYSxkKSxlKX1pZihwPT09Nyl7cz1ILldlKGEsYixjLHQuUCxl
 KQpyZXR1cm4gc3x8SC5XZShhLGIsYyxkLnosZSl9aWYocSlyZXR1cm4hMQpzPXIhPT0xMQppZigoIXN8
-fHI9PT0xMikmJmQ9PT10LlkpcmV0dXJuITAKaWYocD09PTEyKXtpZihiPT09dC51KXJldHVybiEwCmlm
+fHI9PT0xMikmJmQ9PT10LlkpcmV0dXJuITAKaWYocD09PTEyKXtpZihiPT09dC54KXJldHVybiEwCmlm
 KHIhPT0xMilyZXR1cm4hMQpvPWIuUQpuPWQuUQptPW8ubGVuZ3RoCmlmKG0hPT1uLmxlbmd0aClyZXR1
 cm4hMQpjPWM9PW51bGw/bzpvLmNvbmNhdChjKQplPWU9PW51bGw/bjpuLmNvbmNhdChlKQpmb3IobD0w
 O2w8bTsrK2wpe2s9b1tsXQpqPW5bbF0KaWYoIUguV2UoYSxrLGMsaixlKXx8IUguV2UoYSxqLGUsayxj
-KSlyZXR1cm4hMX1yZXR1cm4gSC5iTyhhLGIueixjLGQueixlKX1pZihwPT09MTEpe2lmKGI9PT10LnUp
+KSlyZXR1cm4hMX1yZXR1cm4gSC5iTyhhLGIueixjLGQueixlKX1pZihwPT09MTEpe2lmKGI9PT10Lngp
 cmV0dXJuITAKaWYocylyZXR1cm4hMQpyZXR1cm4gSC5iTyhhLGIsYyxkLGUpfWlmKHI9PT05KXtpZihw
 IT09OSlyZXR1cm4hMQpyZXR1cm4gSC5wRyhhLGIsYyxkLGUpfXJldHVybiExfSwKYk8oYTMsYTQsYTUs
 YTYsYTcpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyCmlm
@@ -8473,7 +8473,7 @@
 CnM9cC5DKCJ+KDEpPyIpLmEobmV3IEwuV3gocixhKSkKdC5aLmEobnVsbCkKVy5KRShxLmEscS5iLHMs
 ITEscC5jKX0sCnlYKGEsYil7dmFyIHMscixxLHAsbyxuLG09InF1ZXJ5U2VsZWN0b3JBbGwiLGw9ZG9j
 dW1lbnQucXVlcnlTZWxlY3RvcihhKQpsLnRvU3RyaW5nCnM9dC5oCkguRGgocyxzLCJUIixtKQpyPXQu
-VQpxPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1saW5rIikscikKcS5LKHEsbmV3IEwu
+UgpxPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1saW5rIikscikKcS5LKHEsbmV3IEwu
 SG8oYikpCkguRGgocyxzLCJUIixtKQpwPW5ldyBXLnd6KGwucXVlcnlTZWxlY3RvckFsbCgiLnJlZ2lv
 biIpLHIpCmlmKCFwLmdsMChwKSl7bz1sLnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0iKQpv
 LnRvU3RyaW5nCnAuSyhwLG5ldyBMLklDKG8uZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3
@@ -8564,3073 +8564,3074 @@
 KSxxLkMoImxKPGxELkUscVU+IikpLmsoMCwiXG4iKQpxPXAucXVlcnlTZWxlY3RvcigiYS5ib3R0b20i
 KS5zdHlsZQpxLmRpc3BsYXk9Im5vbmUiCnM9cC5zdHlsZQpzLmRpc3BsYXk9ImluaXRpYWwifSwKR2co
 KXt2YXIgcz1kb2N1bWVudCxyPXQuaApILkRoKHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5l
-dyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLmNvZGUiKSx0LlUpCnMuSyhzLG5ldyBMLkdIKCkpfSwK
+dyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLmNvZGUiKSx0LlIpCnMuSyhzLG5ldyBMLkdIKCkpfSwK
 aFgoYSxiLGMpe3JldHVybiBMLll3KGEsYixjKX0sCll3KGEsYixjKXt2YXIgcz0wLHI9UC5GWCh0Lnop
-LHE9MSxwLG89W10sbixtLGwsayxqLGksaCxnCnZhciAkYXN5bmMkaFg9UC5seihmdW5jdGlvbihkLGUp
-e2lmKGQ9PT0xKXtwPWUKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMKaj10Lk4Kcz02
-CnJldHVybiBQLmpRKEwuUTYoYSxQLkVGKFsicmVnaW9uIiwicmVnaW9uIiwib2Zmc2V0IixILkVqKGIp
-XSxqLGopLHQuRyksJGFzeW5jJGhYKQpjYXNlIDY6bj1lCmo9bgppPUouVTYoaikKbT1uZXcgVS5kMihV
-LmpmKGkucShqLCJlZGl0cyIpKSxILmsoaS5xKGosImV4cGxhbmF0aW9uIikpLEguVWMoaS5xKGosImxp
-bmUiKSksSC5rKGkucShqLCJkaXNwbGF5UGF0aCIpKSxILmsoaS5xKGosInVyaVBhdGgiKSksVS5OZChp
-LnEoaiwidHJhY2VzIikpKQpMLlQxKG0pCkwuRnIoYSxiLGMpCkwueVgoIi5lZGl0LXBhbmVsIC5wYW5l
-bC1jb250ZW50IiwhMSkKcT0xCnM9NQpicmVhawpjYXNlIDM6cT0yCmc9cApsPUguUnUoZykKaz1ILnRz
-KGcpCkwuQzIoImNvdWxkbid0IGxvYWQgZWRpdCBkZXRhaWxzIixsLGspCnM9NQpicmVhawpjYXNlIDI6
-cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIp
-fX0pCnJldHVybiBQLkRJKCRhc3luYyRoWCxyKX0sCkc3KGEsYixjLGQsZSl7cmV0dXJuIEwuTDUoYSxi
-LGMsZCxlKX0sCkw1KGEsYixjLGQsZSl7dmFyIHM9MCxyPVAuRlgodC5IKSxxLHA9MixvLG49W10sbSxs
-LGssaixpLGgsZwp2YXIgJGFzeW5jJEc3PVAubHooZnVuY3Rpb24oZixhMCl7aWYoZj09PTEpe289YTAK
-cz1wfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDppZighQy54Qi5UYyhhLCIuZGFydCIpKXtMLkJF
-KGEsQi53UigpLGQpCkwuQlgoYSxudWxsKQppZihlIT1udWxsKWUuJDAoKQpzPTEKYnJlYWt9cD00Cmk9
-dC5OCnM9NwpyZXR1cm4gUC5qUShMLlE2KGEsUC5FRihbImlubGluZSIsInRydWUiXSxpLGkpLHQuRyks
-JGFzeW5jJEc3KQpjYXNlIDc6bT1hMApMLkJFKGEsQi5ZZihtKSxkKQpMLmZHKGIsYykKbD1MLlVzKGEp
-CkwuQlgobCxiKQppZihlIT1udWxsKWUuJDAoKQpwPTIKcz02CmJyZWFrCmNhc2UgNDpwPTMKZz1vCms9
-SC5SdShnKQpqPUgudHMoZykKTC5DMigiY291bGRuJ3QgbG9hZCBkYXJ0IGZpbGUgIithLGssaikKcz02
-CmJyZWFrCmNhc2UgMzpzPTIKYnJlYWsKY2FzZSA2OmNhc2UgMTpyZXR1cm4gUC55QyhxLHIpCmNhc2Ug
-MjpyZXR1cm4gUC5mMyhvLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyRHNyxyKX0sCkdlKCl7dmFyIHM9
-MCxyPVAuRlgodC56KSxxPTEscCxvPVtdLG4sbSxsLGssaixpLGgsZwp2YXIgJGFzeW5jJEdlPVAubHoo
-ZnVuY3Rpb24oYSxiKXtpZihhPT09MSl7cD1iCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6
-aD0iL19wcmV2aWV3L25hdmlnYXRpb25UcmVlLmpzb24iCnE9MwpzPTYKcmV0dXJuIFAualEoTC5RNiho
-LEMuQ00sdC5lZSksJGFzeW5jJEdlKQpjYXNlIDY6bj1iCmo9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigi
-Lm5hdi10cmVlIikKai50b1N0cmluZwptPWoKSi5sNShtLCIiKQpqPUwubUsobikKJC5JUj1qCkwudFgo
-bSxqLCEwKQpxPTEKcz01CmJyZWFrCmNhc2UgMzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5D
-MigiY291bGRuJ3QgbG9hZCBuYXZpZ2F0aW9uIHRyZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEK
-YnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkK
-cmV0dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwKcU8oYSl7dmFyIHMscixxPWEuZ2V0Qm91bmRpbmdDbGll
-bnRSZWN0KCkscD1DLkNELnpRKCQuZmkoKS5vZmZzZXRIZWlnaHQpLG89d2luZG93LmlubmVySGVpZ2h0
-Cm8udG9TdHJpbmcKcz1DLkNELnpRKCQuRFcoKS5vZmZzZXRIZWlnaHQpCnI9cS5ib3R0b20Kci50b1N0
-cmluZwppZihyPm8tKHMrMTQpKUouZGgoYSkKZWxzZXtvPXEudG9wCm8udG9TdHJpbmcKaWYobzxwKzE0
-KUouZGgoYSl9fSwKZkcoYSxiKXt2YXIgcyxyLHEscCxvCmlmKGEhPW51bGwpe3M9ZG9jdW1lbnQKcj1z
-LmdldEVsZW1lbnRCeUlkKCJvIitILkVqKGEpKQpxPXMucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILkVq
-KGIpKQppZihyIT1udWxsKXtMLnFPKHIpCkouZFIocikuaSgwLCJ0YXJnZXQiKX1lbHNlIGlmKHEhPW51
-bGwpe3M9cS5wYXJlbnRFbGVtZW50CnMudG9TdHJpbmcKTC5xTyhzKX1pZihxIT1udWxsKUouZFIodC5o
-LmEocS5wYXJlbnROb2RlKSkuaSgwLCJoaWdobGlnaHQiKX1lbHNle3M9ZG9jdW1lbnQKcD10LmgKSC5E
-aChwLHAsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikKcz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saW5lLW5v
-IikKbz1uZXcgVy53eihzLHQuVSkKaWYoby5nQShvKT09PTApcmV0dXJuCkwucU8ocC5hKEMudDUuZ3RI
-KHMpKSl9fSwKYWYoYSxiLGMsZCxlKXt2YXIgcyxyLHEscD10LkYsbz1MLkc2KHAuYSh3aW5kb3cubG9j
-YXRpb24pLmhyZWYpLG49TC5hSyhwLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQppZihvIT1udWxsKXtz
-PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitILkVqKG8pKQppZihzIT1udWxsKUouZFIocykuUigw
-LCJ0YXJnZXQiKX1pZihuIT1udWxsKXtyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5F
-aihuKSkKaWYociE9bnVsbCl7cT1yLnBhcmVudEVsZW1lbnQKcS50b1N0cmluZwpKLmRSKHEpLlIoMCwi
-aGlnaGxpZ2h0Iil9fWlmKGE9PXAuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lKXtMLmZHKGIsYykK
-ZS4kMCgpfWVsc2V7YS50b1N0cmluZwpMLkc3KGEsYixjLGQsZSl9fSwKUTQoYSxiKXt2YXIgcyxyLHE9
-UC5oSyhhKSxwPVAuRmwodC5OLHQuZGspCmZvcihzPXEuZ2hZKCkscz1zLmdQdShzKSxzPXMuZ20ocyk7
-cy5GKCk7KXtyPXMuZ2woKQpwLlk1KDAsci5hLHIuYil9Zm9yKHM9Yi5nUHUoYikscz1zLmdtKHMpO3Mu
-RigpOyl7cj1zLmdsKCkKcC5ZNSgwLHIuYSxyLmIpfXAuWTUoMCwiYXV0aFRva2VuIiwkLlVFKCkpCnJl
-dHVybiBxLm5tKDAscCkuZ25EKCl9LApUMShhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPSQuaEwo
-KQppLnRvU3RyaW5nCkoubDUoaSwiIikKaWYoYT09bnVsbCl7cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50
-KCJwIikKQy5MdC5zYTQocywiU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0LiIpCkMuTHQu
-c1AocyxILlFJKFsicGxhY2Vob2xkZXIiXSx0LnMpKQppLmFwcGVuZENoaWxkKHMpCkMuTHQuRkYocykK
-cmV0dXJufXI9YS5kCnIudG9TdHJpbmcKcT0kLm5VKCkKcD1xLnpmKHIpCm89YS5iCm49ZG9jdW1lbnQK
-bT1uLnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQKbS50b1N0cmluZwpsPXEuSFAocixD
-LnhCLmJTKG0pKQprPWEuYwpqPW4uY3JlYXRlRWxlbWVudCgicCIpCmkuYXBwZW5kQ2hpbGQoaikKai5h
-cHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKEguRWoobykrIiBhdCAiKSkKcj1hLmUKci50b1N0cmlu
-ZwpxPXQuTgpxPVcuSjYoTC5RNChyLFAuRUYoWyJsaW5lIixKLncoayldLHEscSkpKQpxLmFwcGVuZENo
-aWxkKG4uY3JlYXRlVGV4dE5vZGUobCsiOiIrSC5FaihrKSsiLiIpKQpqLmFwcGVuZENoaWxkKHEpCkou
-ZGgoaikKTC5DQyhhLGkscCkKTC5GeihhLGkpfSwKTEgoYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGws
-ayxqLGksaCxnLGYsZSxkPSQueVAoKQpkLnRvU3RyaW5nCkoubDUoZCwiIikKaWYoYi5nQShiKT09PTAp
-e3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1lbnQoInAiKQpkLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5k
-Q2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZD1iLmdQ
-dShiKSxkPWQuZ20oZCkscz10LkYscT10Lk4scD10LlEsbz1wLkMoIn4oMSk/Iiksbj10LloscD1wLmM7
-ZC5GKCk7KXttPWQuZ2woKQpsPWRvY3VtZW50CnI9bC5jcmVhdGVFbGVtZW50KCJwIikKaz0kLnlQKCkK
-ay5hcHBlbmRDaGlsZChyKQpyLmFwcGVuZENoaWxkKGwuY3JlYXRlVGV4dE5vZGUoSC5FaihtLmEpKyI6
-IikpCmo9bC5jcmVhdGVFbGVtZW50KCJ1bCIpCmsuYXBwZW5kQ2hpbGQoaikKZm9yKG09Si5JVChtLmIp
-O20uRigpOyl7az1tLmdsKCkKaT1sLmNyZWF0ZUVsZW1lbnQoImxpIikKai5hcHBlbmRDaGlsZChpKQpK
-LmRSKGkpLmkoMCwiZWRpdCIpCmg9bC5jcmVhdGVFbGVtZW50KCJhIikKaS5hcHBlbmRDaGlsZChoKQpo
-LmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmc9ay5jCmY9SC5FaihnKQpoLnNldEF0dHJpYnV0ZSgi
-ZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGgpKS5PVSgib2Zmc2V0IiksZikKZT1rLmEKZj1ILkVqKGUp
-Cmguc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoaCkpLk9VKCJsaW5lIiksZikK
-aC5hcHBlbmRDaGlsZChsLmNyZWF0ZVRleHROb2RlKCJsaW5lICIrSC5FaihlKSkpCmY9cy5hKHdpbmRv
-dy5sb2NhdGlvbikucGF0aG5hbWUKZi50b1N0cmluZwpoLnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNChm
-LFAuRUYoWyJsaW5lIixILkVqKGUpLCJvZmZzZXQiLEguRWooZyldLHEscSkpKQpmPW8uYShuZXcgTC5F
-RShnLGUsYSkpCm4uYShudWxsKQpXLkpFKGgsImNsaWNrIixmLCExLHApCmkuYXBwZW5kQ2hpbGQobC5j
-cmVhdGVUZXh0Tm9kZSgiOiAiK0guRWooay5iKSkpfX1pZihjKUwuVDEobnVsbCl9LApGcihhLGIsYyl7
-dmFyIHMscixxPVAuaEsoQy5FeC5nRHIodC5GLmEod2luZG93LmxvY2F0aW9uKSkrSC5FaihhKSkscD1Q
-LkZsKHQuTix0LmRrKQppZihiIT1udWxsKXAuWTUoMCwib2Zmc2V0IixILkVqKGIpKQppZihjIT1udWxs
-KXAuWTUoMCwibGluZSIsSC5FaihjKSkKcC5ZNSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcT1xLm5tKDAs
-cCkKcD13aW5kb3cuaGlzdG9yeQpzPXQuegpyPXEuZ25EKCkKcC5wdXNoU3RhdGUobmV3IFAuQmYoW10s
-W10pLlB2KFAuRmwocyxzKSksIiIscil9LApFbihhKXt2YXIgcyxyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0
-b3IoIi5yb290IikudGV4dENvbnRlbnQKci50b1N0cmluZwpzPXIrIi8iCmlmKEMueEIubihhLHMpKXJl
-dHVybiBDLnhCLnluKGEscy5sZW5ndGgpCmVsc2UgcmV0dXJuIGF9LApPdChhKXtzd2l0Y2goYS5yKXtj
-YXNlIEMuY3c6YnJlYWsKY2FzZSBDLldEOmEucj1DLlhqCmJyZWFrCmNhc2UgQy5YajphLnI9Qy5XRApi
-cmVhawpjYXNlIEMuZGM6dGhyb3cgSC5iKFAuUFYoIkZpbGUgIitILkVqKGEuYykrIiBzaG91bGQgbm90
-IGhhdmUgaW5kZXRlcm1pbmF0ZSBtaWdyYXRpb24gc3RhdHVzIikpCmRlZmF1bHQ6YnJlYWt9fSwKdGEo
-YSxiKXt2YXIgcyxyPSJjaGVja19ib3giLHE9InRpdGxlIixwPSJvcHRlZC1vdXQiLG89Im1pZ3JhdGlu
-ZyIKc3dpdGNoKGIpe2Nhc2UgQy5jdzphLmlubmVyVGV4dD1yCnM9Si5ZRShhKQpzLmdQKGEpLmkoMCwi
-YWxyZWFkeS1taWdyYXRlZCIpCnMuZ1AoYSkuaSgwLCJkaXNhYmxlZCIpCmEuc2V0QXR0cmlidXRlKHEs
-IkFscmVhZHkgbWlncmF0ZWQiKQpicmVhawpjYXNlIEMuV0Q6YS5pbm5lclRleHQ9cgpzPUouWUUoYSkK
-cy5nUChhKS5SKDAscCkKcy5nUChhKS5pKDAsbykKYS5zZXRBdHRyaWJ1dGUocSwiTWlncmF0aW5nIHRv
-IG51bGwgc2FmZXR5IikKYnJlYWsKY2FzZSBDLlhqOmEuaW5uZXJUZXh0PSJjaGVja19ib3hfb3V0bGlu
-ZV9ibGFuayIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSkuaSgwLHApCmEuc2V0QXR0cmli
-dXRlKHEsIk9wdGluZyBvdXQgb2YgbnVsbCBzYWZldHkiKQpicmVhawpkZWZhdWx0OmEuaW5uZXJUZXh0
-PSJpbmRldGVybWluYXRlX2NoZWNrX2JveCIKcz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSku
-aSgwLHApCmEuc2V0QXR0cmlidXRlKHEsIk1peGVkIHN0YXR1c2VzIG9mICdtaWdyYXRpbmcnIGFuZCAn
-b3B0aW5nIG91dCciKQpicmVha319LAp4bihhLGIpe3ZhciBzLHI9ImRpc2FibGVkIixxPWIuZ0woKQpM
-LnRhKGEscSkKaWYoYi5jPT09JC5EOSgpLmlubmVyVGV4dCl7aWYoYiBpbnN0YW5jZW9mIEwuY0Qpe3M9
-Yi54CnMudG9TdHJpbmcKcz0hc31lbHNlIHM9ITEKaWYocyl7YS50b1N0cmluZwpKLmRSKGEpLmkoMCxy
-KX1lbHNle2EudG9TdHJpbmcKSi5kUihhKS5SKDAscil9TC50YSgkLmMwKCkscSl9fSwKQlgoYSxiKXt2
-YXIgcyxyLHEscD17fQpwLmE9YQphPUwuRW4oYSkKcC5hPWEKcz0kLkQ5KCkKcy50b1N0cmluZwpKLmRy
-KHMsYSkKcz1kb2N1bWVudApyPXQuaApILkRoKHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5l
-dyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgiLm5hdi1wYW5lbCAubmF2LWxpbmsiKSx0LlUpCnMuSyhz
-LG5ldyBMLlZTKHApKQpzPSQuSVIKcT1zPT1udWxsP251bGw6TC55dyhzLHAuYSkKaWYocT09bnVsbCl7
-cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHApLlIoMCwidmlzaWJsZSIpfWVsc2V7cD0kLmJOKCkKcC50
-b1N0cmluZwpKLmRSKHApLmkoMCwidmlzaWJsZSIpCkwudGEoJC5jMCgpLHEuZ0woKSl9fSwKQVIoYSxi
-KXt2YXIgcyxyLHE9Yi5iCmlmKHE9PT0kKXE9SC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBu
-b3QgYmVlbiBpbml0aWFsaXplZC4iKSkKcz10LmgKcj1zLmEocy5hKGEucGFyZW50Tm9kZSkucGFyZW50
-Tm9kZSkKTC54bihyLnF1ZXJ5U2VsZWN0b3IoIjpzY29wZSA+IC5zdGF0dXMtaWNvbiIpLHEpCkwuQVIo
-cixxKX0sCmJMKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbD0iOnNjb3BlID4gLnN0YXR1cy1pY29uIgpm
-b3Iocz1iLmQscj1zLmxlbmd0aCxxPXQuaCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgu
-bGspKHMpLCsrcCl7bz1zW3BdCmEudG9TdHJpbmcKbj1vLmMKbi50b1N0cmluZwptPWEucXVlcnlTZWxl
-Y3RvcignW2RhdGEtbmFtZSo9IicrVy5MaihuKSsnIl0nKQppZihvIGluc3RhbmNlb2YgTC52dCl7TC5i
-TChtLG8pCkwueG4obS5xdWVyeVNlbGVjdG9yKGwpLGIpfWVsc2UgTC54bihxLmEobS5wYXJlbnROb2Rl
-KS5xdWVyeVNlbGVjdG9yKGwpLG8pfX0sCkJFKGEsYixjKXt2YXIgcz0iLnJlZ2lvbnMiLHI9ZG9jdW1l
-bnQscT1yLnF1ZXJ5U2VsZWN0b3IocykKcS50b1N0cmluZwpyPXIucXVlcnlTZWxlY3RvcigiLmNvZGUi
-KQpyLnRvU3RyaW5nCkoudEgocSxiLmEsJC5LRygpKQpKLnRIKHIsYi5iLCQuS0coKSkKTC5MSChhLGIu
-ZCxjKQppZihiLmMubGVuZ3RoPDJlNSlMLkdnKCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHMsITApfSwK
-dFgoYTAsYTEsYTIpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPSJtYXRlcmlhbC1p
-Y29ucyIsYz0ic3RhdHVzLWljb24iLGI9ZG9jdW1lbnQsYT1iLmNyZWF0ZUVsZW1lbnQoInVsIikKYTAu
-YXBwZW5kQ2hpbGQoYSkKZm9yKHM9YTEubGVuZ3RoLHI9dC5OLHE9dC5aLHA9MDtwPGExLmxlbmd0aDth
-MS5sZW5ndGg9PT1zfHwoMCxILmxrKShhMSksKytwKXtvPWExW3BdCm49Yi5jcmVhdGVFbGVtZW50KCJs
-aSIpCmEuYXBwZW5kQ2hpbGQobikKaWYobyBpbnN0YW5jZW9mIEwudnQpe209Si5ZRShuKQptLmdQKG4p
-LmkoMCwiZGlyIikKbD1vLmMKbC50b1N0cmluZwpuLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5
-KG5ldyBXLmk3KG4pKS5PVSgibmFtZSIpLGwpCms9Yi5jcmVhdGVFbGVtZW50KCJzcGFuIikKbi5hcHBl
-bmRDaGlsZChrKQpsPUouWUUoaykKbC5nUChrKS5pKDAsImFycm93IikKbC5zaGYoaywiJiN4MjVCQzsi
-KQpqPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCkouZFIoaikuaSgwLGQpCmouaW5uZXJUZXh0PSJmb2xk
-ZXJfb3BlbiIKbi5hcHBlbmRDaGlsZChqKQpsPW8uYQpsLnRvU3RyaW5nCm4uYXBwZW5kQ2hpbGQoYi5j
-cmVhdGVUZXh0Tm9kZShsKSkKbD1vLmQKbC50b1N0cmluZwpMLnRYKG4sbCwhMCkKaT1iLmNyZWF0ZUVs
-ZW1lbnQoInNwYW4iKQpsPUouWUUoaSkKbC5nUChpKS5pKDAsZCkKaS5pbm5lclRleHQ9ImluZGV0ZXJt
-aW5hdGVfY2hlY2tfYm94IgpsLmdQKGkpLmkoMCxjKQpMLnhuKGksbykKbD1sLmdWbChpKQpoPWwuJHRp
-Cmc9aC5DKCJ+KDEpPyIpLmEobmV3IEwuVEQobyxuLGkpKQpxLmEobnVsbCkKVy5KRShsLmEsbC5iLGcs
-ITEsaC5jKQptLm1LKG4saSxqKQpMLmt6KGspfWVsc2UgaWYobyBpbnN0YW5jZW9mIEwuY0Qpe2k9Yi5j
-cmVhdGVFbGVtZW50KCJzcGFuIikKbT1KLllFKGkpCm0uZ1AoaSkuaSgwLGQpCmkuaW5uZXJUZXh0PSIi
-Cm0uZ1AoaSkuaSgwLGMpCmw9by54CmwudG9TdHJpbmcKaWYoIWwpbS5nUChpKS5pKDAsImRpc2FibGVk
-IikKTC54bihpLG8pCmlmKGwpe209bS5nVmwoaSkKbD1tLiR0aQpoPWwuQygifigxKT8iKS5hKG5ldyBM
-LklmKG8saSxuKSkKcS5hKG51bGwpClcuSkUobS5hLG0uYixoLCExLGwuYyl9bi5hcHBlbmRDaGlsZChp
-KQptPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCkouZFIobSkuaSgwLGQpCm0uaW5uZXJUZXh0PSJpbnNl
-cnRfZHJpdmVfZmlsZSIKbi5hcHBlbmRDaGlsZChtKQpmPWIuY3JlYXRlRWxlbWVudCgiYSIpCm4uYXBw
-ZW5kQ2hpbGQoZikKbT1KLllFKGYpCm0uZ1AoZikuaSgwLCJuYXYtbGluayIpCmw9by5jCmwudG9TdHJp
-bmcKZi5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhmKSkuT1UoIm5hbWUiKSxs
-KQpsPW8uZApsLnRvU3RyaW5nCmYuc2V0QXR0cmlidXRlKCJocmVmIixMLlE0KGwsUC5GbChyLHIpKSkK
-bD1vLmEKbC50b1N0cmluZwpmLmFwcGVuZENoaWxkKGIuY3JlYXRlVGV4dE5vZGUobCkpCm09bS5nVmwo
-ZikKbD1tLiR0aQpoPWwuQygifigxKT8iKS5hKG5ldyBMLnRCKCkpCnEuYShudWxsKQpXLkpFKG0uYSxt
-LmIsaCwhMSxsLmMpCmw9by5lCmwudG9TdHJpbmcKaWYobD4wKXtlPWIuY3JlYXRlRWxlbWVudCgic3Bh
-biIpCm4uYXBwZW5kQ2hpbGQoZSkKSi5kUihlKS5pKDAsImVkaXQtY291bnQiKQptPSIiK2wrIiAiCmlm
-KGw9PT0xKWg9InByb3Bvc2VkIGVkaXQiCmVsc2UgaD0icHJvcG9zZWQgZWRpdHMiCmUuc2V0QXR0cmli
-dXRlKCJ0aXRsZSIsbStoKQplLmFwcGVuZENoaWxkKGIuY3JlYXRlVGV4dE5vZGUoQy5qbi53KGwpKSl9
-fX19LAp1eihhLGIsYyl7dmFyIHM9ZG9jdW1lbnQscj1zLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpLHE9
-dC5RLHA9cS5DKCJ+KDEpPyIpLmEobmV3IEwubTIoYSxjKSkKdC5aLmEobnVsbCkKVy5KRShyLCJjbGlj
-ayIscCwhMSxxLmMpCnE9Ui5PWChhLmEpCnEudG9TdHJpbmcKci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRl
-eHROb2RlKHEpKQpiLmFwcGVuZENoaWxkKHIpfSwKRnooYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
-aixpLGg9YS5hCmlmKGg9PW51bGwpcmV0dXJuCmIudG9TdHJpbmcKcz1kb2N1bWVudApyPXMuY3JlYXRl
-RWxlbWVudCgicCIpCnE9Yi5hcHBlbmRDaGlsZChyKQpyPXMuY3JlYXRlRWxlbWVudCgic3BhbiIpCnA9
-dC5zCkouTXUocixILlFJKFsidHlwZS1kZXNjcmlwdGlvbiJdLHApKQpyLmFwcGVuZENoaWxkKHMuY3Jl
-YXRlVGV4dE5vZGUoIkFjdGlvbnMiKSkKcS5hcHBlbmRDaGlsZChyKQpxLmFwcGVuZENoaWxkKHMuY3Jl
-YXRlVGV4dE5vZGUoIjoiKSkKbz1zLmNyZWF0ZUVsZW1lbnQoInAiKQpiLmFwcGVuZENoaWxkKG8pCmZv
-cihyPWgubGVuZ3RoLG49dC5PLG09MDttPGgubGVuZ3RoO2gubGVuZ3RoPT09cnx8KDAsSC5saykoaCks
-KyttKXtsPWhbbV0Kaz1zLmNyZWF0ZUVsZW1lbnQoImEiKQpvLmFwcGVuZENoaWxkKGspCmo9bC5hCmou
-dG9TdHJpbmcKay5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKGopKQpqPWwuYgpqLnRvU3RyaW5n
-Cmsuc2V0QXR0cmlidXRlKCJocmVmIixqKQpqPW4uYShILlFJKFsiYWRkLWhpbnQtbGluayIsImJlZm9y
-ZS1hcHBseSIsImJ1dHRvbiJdLHApKQppPUouZFIoaykKaS5WMSgwKQppLkZWKDAsail9fSwKQ0MoYTQs
-YTUsYTYpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEz
-CmZvcihzPWE0LmYscj1zLmxlbmd0aCxxPXQucyxwPXQuTyxvPTA7bzxzLmxlbmd0aDtzLmxlbmd0aD09
-PXJ8fCgwLEgubGspKHMpLCsrbyl7bj1zW29dCmE1LnRvU3RyaW5nCm09ZG9jdW1lbnQKbD1tLmNyZWF0
-ZUVsZW1lbnQoInAiKQprPXAuYShILlFJKFsidHJhY2UiXSxxKSkKaj1KLmRSKGwpCmouVjEoMCkKai5G
-VigwLGspCmk9YTUuYXBwZW5kQ2hpbGQobCkKbD1tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQprPXAuYShI
-LlFJKFsidHlwZS1kZXNjcmlwdGlvbiJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaz1u
-LmEKay50b1N0cmluZwpsLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoaykpCmkuYXBwZW5kQ2hp
-bGQobCkKaS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCI6IikpCmw9bS5jcmVhdGVFbGVtZW50
-KCJ1bCIpCms9cC5hKEguUUkoWyJ0cmFjZSJdLHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykK
-aD1pLmFwcGVuZENoaWxkKGwpCmZvcihsPW4uYixrPWwubGVuZ3RoLGc9MDtnPGwubGVuZ3RoO2wubGVu
-Z3RoPT09a3x8KDAsSC5saykobCksKytnKXtmPWxbZ10KZT1tLmNyZWF0ZUVsZW1lbnQoImxpIikKaC5h
-cHBlbmRDaGlsZChlKQpkPW0uY3JlYXRlRWxlbWVudCgic3BhbiIpCmM9cC5hKEguUUkoWyJmdW5jdGlv
-biJdLHEpKQpqPUouZFIoZCkKai5WMSgwKQpqLkZWKDAsYykKYz1mLmIKTC5XaihkLGM9PW51bGw/InVu
-a25vd24iOmMpCmUuYXBwZW5kQ2hpbGQoZCkKYj1mLmMKaWYoYiE9bnVsbCl7ZS5hcHBlbmRDaGlsZCht
-LmNyZWF0ZVRleHROb2RlKCIgKCIpKQphPWIuYgphMD1tLmNyZWF0ZUVsZW1lbnQoImEiKQphMC5hcHBl
-bmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKEguRWooYi5jKSsiOiIrSC5FaihhKSkpCmQ9Yi5hCmQudG9T
-dHJpbmcKYTAuc2V0QXR0cmlidXRlKCJocmVmIixkKQphMC5jbGFzc0xpc3QuYWRkKCJuYXYtbGluayIp
-CmUuYXBwZW5kQ2hpbGQoYTApCmUuYXBwZW5kQ2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiKSIpKX1lLmFw
-cGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUoIjogIikpCmQ9Zi5hCkwuV2ooZSxkPT1udWxsPyJ1bmtu
-b3duIjpkKQpkPWYuZAppZihkLmxlbmd0aCE9PTApe2M9bS5jcmVhdGVFbGVtZW50KCJwIikKYTE9cC5h
-KEguUUkoWyJkcmF3ZXIiLCJiZWZvcmUtYXBwbHkiXSxxKSkKaj1KLmRSKGMpCmouVjEoMCkKai5GVigw
-LGExKQphMj1lLmFwcGVuZENoaWxkKGMpCmZvcihjPWQubGVuZ3RoLGEzPTA7YTM8ZC5sZW5ndGg7ZC5s
-ZW5ndGg9PT1jfHwoMCxILmxrKShkKSwrK2EzKUwudXooZFthM10sYTIsYil9fX19LApVcyhhKXtyZXR1
-cm4gQy54Qi50ZyhhLCI/Iik/Qy54Qi5OaihhLDAsQy54Qi5PWShhLCI/IikpOmF9LApURyhhLGIpe3Jl
-dHVybiBuZXcgTC5RVyhhLGIpfSwKeXcoYSxiKXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9
-MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSksKytyKXtxPWFbcl0KaWYocSBpbnN0
-YW5jZW9mIEwudnQpe3A9cS5kCnAudG9TdHJpbmcKbz1MLnl3KHAsYikKaWYobyE9bnVsbClyZXR1cm4g
-b31lbHNlIGlmKHEuYz09PWIpcmV0dXJuIHF9cmV0dXJuIG51bGx9LApXaihhLGIpe3ZhciBzLHIscSxw
-PUguUUkoYi5zcGxpdCgiLiIpLHQucyksbz1DLk5tLmd0SChwKSxuPWRvY3VtZW50CmEuYXBwZW5kQ2hp
-bGQobi5jcmVhdGVUZXh0Tm9kZShvKSkKZm9yKG89SC5xQyhwLDEsbnVsbCx0Lk4pLHM9by4kdGksbz1u
-ZXcgSC5hNyhvLG8uZ0Eobykscy5DKCJhNzxhTC5FPiIpKSxzPXMuQygiYUwuRSIpLHI9Si5ZRShhKTtv
-LkYoKTspe3E9cy5hKG8uZCkKci5ueihhLCJiZWZvcmVlbmQiLCImIzgyMDM7LiIsbnVsbCxudWxsKQph
-LmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUocSkpfX0sCmU6ZnVuY3Rpb24gZSgpe30sClZXOmZ1
-bmN0aW9uIFZXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm9aOmZ1bmN0aW9uIG9a
-KCl7fSwKanI6ZnVuY3Rpb24ganIoKXt9LApxbDpmdW5jdGlvbiBxbCgpe30sCnk4OmZ1bmN0aW9uIHk4
-KCl7fSwKSGk6ZnVuY3Rpb24gSGkoKXt9LApCVDpmdW5jdGlvbiBCVCgpe30sClBZOmZ1bmN0aW9uIFBZ
-KCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwKV3g6ZnVuY3Rpb24gV3goYSxiKXt0aGlzLmE9YQp0aGlzLmI9
-Yn0sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMuYT1hfSwKZE46ZnVuY3Rpb24gZE4oYSl7dGhpcy5hPWF9
-LApJQzpmdW5jdGlvbiBJQyhhKXt0aGlzLmE9YX0sCnh6OmZ1bmN0aW9uIHh6KGEsYil7dGhpcy5hPWEK
-dGhpcy5iPWJ9LApCTjpmdW5jdGlvbiBCTigpe30sCmZDOmZ1bmN0aW9uIGZDKGEsYil7dGhpcy5hPWEK
-dGhpcy5iPWJ9LApUbTpmdW5jdGlvbiBUbSgpe30sCm5UOmZ1bmN0aW9uIG5UKGEsYixjKXt0aGlzLmE9
-YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKdWU6ZnVuY3Rp
-b24gdWUoKXt9LApHSDpmdW5jdGlvbiBHSCgpe30sCkVFOmZ1bmN0aW9uIEVFKGEsYixjKXt0aGlzLmE9
-YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1bmN0aW9uIFFMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
-LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9YX0sClREOmZ1bmN0aW9uIFREKGEsYixjKXt0aGlzLmE9
-YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCklmOmZ1bmN0aW9uIElmKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLmM9Y30sCnRCOmZ1bmN0aW9uIHRCKCl7fSwKbTI6ZnVuY3Rpb24gbTIoYSxiKXt0aGlzLmE9
-YQp0aGlzLmI9Yn0sClFXOmZ1bmN0aW9uIFFXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApYQTpmdW5j
-dGlvbiBYQSgpe30sClpzKGEpe3ZhciBzLHIscT1KLlU2KGEpCmlmKEwucDIoSC5rKHEucShhLCJ0eXBl
-IikpKT09PUMuWTIpe3M9SC5rKHEucShhLCJuYW1lIikpCnI9SC5rKHEucShhLCJwYXRoIikpCnE9cS5x
-KGEsInN1YnRyZWUiKQpxPW5ldyBMLnZ0KHE9PW51bGw/bnVsbDpMLm1LKHEpLHMscikKcS5MVigpCnJl
-dHVybiBxfWVsc2V7cz1ILmsocS5xKGEsIm5hbWUiKSkKcj1ILmsocS5xKGEsInBhdGgiKSkKcmV0dXJu
-IG5ldyBMLmNEKEguayhxLnEoYSwiaHJlZiIpKSxILlVjKHEucShhLCJlZGl0Q291bnQiKSksSC5NNChx
-LnEoYSwid2FzRXhwbGljaXRseU9wdGVkT3V0IikpLEwudkIoSC5VYyhxLnEoYSwibWlncmF0aW9uU3Rh
-dHVzIikpKSxILk00KHEucShhLCJtaWdyYXRpb25TdGF0dXNDYW5CZUNoYW5nZWQiKSkscyxyKX19LApt
-SyhhKXt2YXIgcyxyPUguUUkoW10sdC5maCkKZm9yKHM9Si5JVCh0LlIuYShhKSk7cy5GKCk7KXIucHVz
-aChMLlpzKHMuZ2woKSkpCnJldHVybiByfSwKVkQoYSl7dmFyIHMscixxPUguUUkoW10sdC5kKQpmb3Io
-cz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDthLmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilxLnB1
-c2goYVtyXS5MdCgpKQpyZXR1cm4gcX0sCnZCKGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoYT4+
-PjAhPT1hfHxhPj00KXJldHVybiBILk9IKEMubDAsYSkKcmV0dXJuIEMubDBbYV19LApwMihhKXtzd2l0
-Y2goYSl7Y2FzZSJkaXJlY3RvcnkiOnJldHVybiBDLlkyCmNhc2UiZmlsZSI6cmV0dXJuIEMucmYKZGVm
-YXVsdDp0aHJvdyBILmIoUC5QVigiVW5yZWNvZ25pemVkIG5hdmlnYXRpb24gdHJlZSBub2RlIHR5cGU6
-ICIrSC5FaihhKSkpfX0sCnZ0OmZ1bmN0aW9uIHZ0KGEsYixjKXt2YXIgXz10aGlzCl8uZD1hCl8uYT1i
-Cl8uYj0kCl8uYz1jfSwKY0Q6ZnVuY3Rpb24gY0QoYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmQ9
-YQpfLmU9YgpfLmY9YwpfLnI9ZApfLng9ZQpfLmE9ZgpfLmI9JApfLmM9Z30sCkQ4OmZ1bmN0aW9uIEQ4
-KCl7fSwKTzk6ZnVuY3Rpb24gTzkoYSl7dGhpcy5iPWF9LApHYjpmdW5jdGlvbiBHYihhLGIpe3RoaXMu
-YT1hCnRoaXMuYj1ifSwKSVY6ZnVuY3Rpb24gSVYoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9
-YgpfLmY9YwpfLnI9ZH19LE09ewpZRihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGwKZm9yKHM9Yi5sZW5n
-dGgscj0xO3I8czsrK3Ipe2lmKGJbcl09PW51bGx8fGJbci0xXSE9bnVsbCljb250aW51ZQpmb3IoO3M+
-PTE7cz1xKXtxPXMtMQppZihiW3FdIT1udWxsKWJyZWFrfXA9bmV3IFAuTSgiIikKbz0iIisoYSsiKCIp
-CnAuYT1vCm49SC50NihiKQptPW4uQygibkg8MT4iKQpsPW5ldyBILm5IKGIsMCxzLG0pCmwuSGQoYiww
-LHMsbi5jKQptPW8rbmV3IEgubEoobCxtLkMoInFVKGFMLkUpIikuYShuZXcgTS5ObygpKSxtLkMoImxK
-PGFMLkUscVU+IikpLmsoMCwiLCAiKQpwLmE9bQpwLmE9bSsoIik6IHBhcnQgIisoci0xKSsiIHdhcyBu
-dWxsLCBidXQgcGFydCAiK3IrIiB3YXMgbm90LiIpCnRocm93IEguYihQLnhZKHAudygwKSxudWxsKSl9
-fSwKbEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5hPWF9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0
-aW9uIE5vKCl7fX0sTz17ClJoKCl7dmFyIHMscj1udWxsCmlmKFAudW8oKS5nRmkoKSE9PSJmaWxlIily
-ZXR1cm4gJC5FYigpCnM9UC51bygpCmlmKCFDLnhCLlRjKHMuZ0lpKHMpLCIvIikpcmV0dXJuICQuRWIo
-KQppZihQLktMKHIsImEvYiIscixyLHIscixyKS50NCgpPT09ImFcXGIiKXJldHVybiAkLktrKCkKcmV0
-dXJuICQuYkQoKX0sCnpMOmZ1bmN0aW9uIHpMKCl7fX0sUD17Ck9qKCl7dmFyIHMscixxPXt9CmlmKHNl
-bGYuc2NoZWR1bGVJbW1lZGlhdGUhPW51bGwpcmV0dXJuIFAuRVgoKQppZihzZWxmLk11dGF0aW9uT2Jz
-ZXJ2ZXIhPW51bGwmJnNlbGYuZG9jdW1lbnQhPW51bGwpe3M9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVt
-ZW50KCJkaXYiKQpyPXNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpCnEuYT1udWxsCm5l
-dyBzZWxmLk11dGF0aW9uT2JzZXJ2ZXIoSC50UihuZXcgUC50aChxKSwxKSkub2JzZXJ2ZShzLHtjaGls
-ZExpc3Q6dHJ1ZX0pCnJldHVybiBuZXcgUC5oYShxLHMscil9ZWxzZSBpZihzZWxmLnNldEltbWVkaWF0
-ZSE9bnVsbClyZXR1cm4gUC55dCgpCnJldHVybiBQLnFXKCl9LApaVihhKXtzZWxmLnNjaGVkdWxlSW1t
-ZWRpYXRlKEgudFIobmV3IFAuVnModC5NLmEoYSkpLDApKX0sCm9BKGEpe3NlbGYuc2V0SW1tZWRpYXRl
-KEgudFIobmV3IFAuRnQodC5NLmEoYSkpLDApKX0sCkJ6KGEpe3QuTS5hKGEpClAuUU4oMCxhKX0sClFO
-KGEsYil7dmFyIHM9bmV3IFAuVzMoKQpzLkNZKGEsYikKcmV0dXJuIHN9LApGWChhKXtyZXR1cm4gbmV3
-IFAuaWgobmV3IFAudnMoJC5YMyxhLkMoInZzPDA+IikpLGEuQygiaWg8MD4iKSl9LApESShhLGIpe2Eu
-JDIoMCxudWxsKQpiLmI9ITAKcmV0dXJuIGIuYX0sCmpRKGEsYil7UC5KZShhLGIpfSwKeUMoYSxiKXti
-LmFNKDAsYSl9LApmMyhhLGIpe2IudzAoSC5SdShhKSxILnRzKGEpKX0sCkplKGEsYil7dmFyIHMscixx
-PW5ldyBQLldNKGIpLHA9bmV3IFAuU1goYikKaWYoYSBpbnN0YW5jZW9mIFAudnMpYS5RZChxLHAsdC56
-KQplbHNle3M9dC56CmlmKHQuaS5iKGEpKWEuU3EocSxwLHMpCmVsc2V7cj1uZXcgUC52cygkLlgzLHQu
-YykKci5hPTgKci5jPWEKci5RZChxLHAscyl9fX0sCmx6KGEpe3ZhciBzPWZ1bmN0aW9uKGIsYyl7cmV0
-dXJuIGZ1bmN0aW9uKGQsZSl7d2hpbGUodHJ1ZSl0cnl7YihkLGUpCmJyZWFrfWNhdGNoKHIpe2U9cgpk
-PWN9fX0oYSwxKQpyZXR1cm4gJC5YMy5MaihuZXcgUC5HcyhzKSx0LkgsdC5TLHQueil9LApHUShhKXty
-ZXR1cm4gbmV3IFAuRnkoYSwxKX0sClRoKCl7cmV0dXJuIEMud1F9LApZbShhKXtyZXR1cm4gbmV3IFAu
-RnkoYSwzKX0sCmwwKGEsYil7cmV0dXJuIG5ldyBQLnE0KGEsYi5DKCJxNDwwPiIpKX0sClRsKGEsYil7
-dmFyIHM9SC5jYihhLCJlcnJvciIsdC5LKQpyZXR1cm4gbmV3IFAuQ3cocyxiPT1udWxsP1AudjAoYSk6
-Yil9LAp2MChhKXt2YXIgcwppZih0Lm0uYihhKSl7cz1hLmdJSSgpCmlmKHMhPW51bGwpcmV0dXJuIHN9
-cmV0dXJuIEMucGR9LApBOShhLGIpe3ZhciBzLHIscQpmb3Iocz10LmM7cj1hLmEsKHImNCkhPT0wOylh
-PXMuYShhLmMpCmlmKChyJjI0KSE9PTApe3E9Yi5haCgpCmIudWcoYSkKUC5IWihiLHEpfWVsc2V7cT10
-LmUuYShiLmMpCmIuYT1iLmEmMXw0CmIuYz1hCmEualEocSl9fSwKSFooYSxhMCl7dmFyIHMscixxLHAs
-byxuLG0sbCxrLGosaSxoLGcsZixlLGQsYz17fSxiPWMuYT1hCmZvcihzPXQubixyPXQuZSxxPXQuaTsh
-MDspe3A9e30Kbz1iLmEKbj0obyYxNik9PT0wCm09IW4KaWYoYTA9PW51bGwpe2lmKG0mJihvJjEpPT09
-MCl7bD1zLmEoYi5jKQpQLlNpKGwuYSxsLmIpfXJldHVybn1wLmE9YTAKaz1hMC5hCmZvcihiPWEwO2sh
-PW51bGw7Yj1rLGs9ail7Yi5hPW51bGwKUC5IWihjLmEsYikKcC5hPWsKaj1rLmF9bz1jLmEKaT1vLmMK
-cC5iPW0KcC5jPWkKaWYobil7aD1iLmMKaD0oaCYxKSE9PTB8fChoJjE1KT09PTh9ZWxzZSBoPSEwCmlm
-KGgpe2c9Yi5iLmIKaWYobSl7bz1vLmI9PT1nCm89IShvfHxvKX1lbHNlIG89ITEKaWYobyl7cy5hKGkp
-ClAuU2koaS5hLGkuYikKcmV0dXJufWY9JC5YMwppZihmIT09ZykkLlgzPWcKZWxzZSBmPW51bGwKYj1i
-LmMKaWYoKGImMTUpPT09OCluZXcgUC5SVChwLGMsbSkuJDAoKQplbHNlIGlmKG4pe2lmKChiJjEpIT09
-MCluZXcgUC5ycShwLGkpLiQwKCl9ZWxzZSBpZigoYiYyKSE9PTApbmV3IFAuUlcoYyxwKS4kMCgpCmlm
-KGYhPW51bGwpJC5YMz1mCmI9cC5jCmlmKHEuYihiKSl7bz1wLmEuJHRpCm89by5DKCJiODwyPiIpLmIo
-Yil8fCFvLlFbMV0uYihiKX1lbHNlIG89ITEKaWYobyl7cS5hKGIpCmU9cC5hLmIKaWYoKGIuYSYyNCkh
-PT0wKXtkPXIuYShlLmMpCmUuYz1udWxsCmEwPWUuTjgoZCkKZS5hPWIuYSYzMHxlLmEmMQplLmM9Yi5j
-CmMuYT1iCmNvbnRpbnVlfWVsc2UgUC5BOShiLGUpCnJldHVybn19ZT1wLmEuYgpkPXIuYShlLmMpCmUu
-Yz1udWxsCmEwPWUuTjgoZCkKYj1wLmIKbz1wLmMKaWYoIWIpe2UuJHRpLmMuYShvKQplLmE9OAplLmM9
-b31lbHNle3MuYShvKQplLmE9ZS5hJjF8MTYKZS5jPW99Yy5hPWUKYj1lfX0sClZIKGEsYil7dmFyIHMK
-aWYodC5hLmIoYSkpcmV0dXJuIGIuTGooYSx0LnosdC5LLHQubCkKcz10LnYKaWYocy5iKGEpKXJldHVy
-biBzLmEoYSkKdGhyb3cgSC5iKFAuTDMoYSwib25FcnJvciIsdS5jKSl9LApwdSgpe3ZhciBzLHIKZm9y
-KHM9JC5TNjtzIT1udWxsO3M9JC5TNil7JC5tZz1udWxsCnI9cy5iCiQuUzY9cgppZihyPT1udWxsKSQu
-azg9bnVsbApzLmEuJDAoKX19LAplTigpeyQuVUQ9ITAKdHJ5e1AucHUoKX1maW5hbGx5eyQubWc9bnVs
-bAokLlVEPSExCmlmKCQuUzYhPW51bGwpJC51dCgpLiQxKFAuVUkoKSl9fSwKZVcoYSl7dmFyIHM9bmV3
-IFAuT00oYSkscj0kLms4CmlmKHI9PW51bGwpeyQuUzY9JC5rOD1zCmlmKCEkLlVEKSQudXQoKS4kMShQ
-LlVJKCkpfWVsc2UgJC5rOD1yLmI9c30sCnJSKGEpe3ZhciBzLHIscSxwPSQuUzYKaWYocD09bnVsbCl7
-UC5lVyhhKQokLm1nPSQuazgKcmV0dXJufXM9bmV3IFAuT00oYSkKcj0kLm1nCmlmKHI9PW51bGwpe3Mu
-Yj1wCiQuUzY9JC5tZz1zfWVsc2V7cT1yLmIKcy5iPXEKJC5tZz1yLmI9cwppZihxPT1udWxsKSQuazg9
-c319LApyYihhKXt2YXIgcz1udWxsLHI9JC5YMwppZihDLk5VPT09cil7UC5UayhzLHMsQy5OVSxhKQpy
-ZXR1cm59UC5UayhzLHMscix0Lk0uYShyLkdZKGEpKSl9LApRdyhhLGIpe0guY2IoYSwic3RyZWFtIix0
-LkspCnJldHVybiBuZXcgUC54SShiLkMoInhJPDA+IikpfSwKU2koYSxiKXtQLnJSKG5ldyBQLkV2KGEs
-YikpfSwKVDgoYSxiLGMsZCxlKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDAoKQokLlgz
-PWMKcz1yCnRyeXtyPWQuJDAoKQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LAp5dihhLGIsYyxkLGUs
-ZixnKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDEoZSkKJC5YMz1jCnM9cgp0cnl7cj1k
-LiQxKGUpCnJldHVybiByfWZpbmFsbHl7JC5YMz1zfX0sClF4KGEsYixjLGQsZSxmLGcsaCxpKXt2YXIg
-cyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDIoZSxmKQokLlgzPWMKcz1yCnRyeXtyPWQuJDIoZSxm
-KQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319LApUayhhLGIsYyxkKXt0Lk0uYShkKQppZihDLk5VIT09
-YylkPWMuR1koZCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rp
-b24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7
-dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwK
-eUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7
-dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0s
-ClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApG
-eTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKR1Y6ZnVuY3Rpb24gR1YoYSxiKXt2
-YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5iPW51bGwKXy4kdGk9Yn0sCnE0OmZ1bmN0aW9uIHE0KGEs
-Yil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkN3OmZ1bmN0aW9uIEN3KGEsYil7dGhpcy5hPWEKdGhpcy5i
-PWJ9LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4k
-dGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpf
-LmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8u
-YT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRo
-aXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9u
-IHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2
-cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApydDpmdW5jdGlvbiBydChhLGIpe3Ro
-aXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpM
-OmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9u
-IFJUKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCmpaOmZ1bmN0aW9uIGpaKGEpe3Ro
-aXMuYT1hfSwKcnE6ZnVuY3Rpb24gcnEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClJXOmZ1bmN0aW9u
-IFJXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApPTTpmdW5jdGlvbiBPTShhKXt0aGlzLmE9YQp0aGlz
-LmI9bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7fSwKQjU6ZnVuY3Rpb24gQjUoYSxiKXt0aGlzLmE9YQp0
-aGlzLmI9Yn0sCnVPOmZ1bmN0aW9uIHVPKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNTzpmdW5jdGlv
-biBNTygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7fSwKeEk6ZnVuY3Rpb24geEkoYSl7dGhpcy4kdGk9YX0s
-Cm0wOmZ1bmN0aW9uIG0wKCl7fSwKRXY6ZnVuY3Rpb24gRXYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-CkppOmZ1bmN0aW9uIEppKCl7fSwKVnA6ZnVuY3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-Ck9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGKGEsYixj
-KXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuQygiRm88MSwyPiIpLmEoSC5CNyhhLG5ldyBILk41KGIu
-QygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4iKSkpKX0sCkZsKGEsYil7cmV0dXJuIG5ldyBILk41KGEu
-QygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4iKSl9LApMcyhhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJi
-NjwwPiIpKX0sClQyKCl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKQpzWyI8bm9uLWlkZW50aWZpZXIt
-a2V5PiJdPXMKZGVsZXRlIHNbIjxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHN9LApyaihhLGIs
-Yyl7dmFyIHM9bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKcy5jPWEuZQpyZXR1cm4gc30sCkVQKGEs
-YixjKXt2YXIgcyxyCmlmKFAuaEIoYSkpe2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpy
-ZXR1cm4gYisiLi4uIitjfXM9SC5RSShbXSx0LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEscyl9
-ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9
-UC5sKGIsdC5SLmEocyksIiwgIikrYwpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCngoYSxi
-LGMpe3ZhciBzLHIKaWYoUC5oQihhKSlyZXR1cm4gYisiLi4uIitjCnM9bmV3IFAuTShiKQpDLk5tLmko
-JC54ZyxhKQp0cnl7cj1zCnIuYT1QLmwoci5hLGEsIiwgIil9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0
-aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXMuYSs9YwpyPXMuYQpyZXR1cm4gci5jaGFy
-Q29kZUF0KDApPT0wP3I6cn0sCmhCKGEpe3ZhciBzLHIKZm9yKHM9JC54Zy5sZW5ndGgscj0wO3I8czsr
-K3IpaWYoYT09PSQueGdbcl0pcmV0dXJuITAKcmV0dXJuITF9LApWcihhLGIpe3ZhciBzLHIscSxwLG8s
-bixtLGw9YS5nbShhKSxrPTAsaj0wCndoaWxlKCEwKXtpZighKGs8ODB8fGo8MykpYnJlYWsKaWYoIWwu
-RigpKXJldHVybgpzPUguRWoobC5nbCgpKQpDLk5tLmkoYixzKQprKz1zLmxlbmd0aCsyOysran1pZigh
-bC5GKCkpe2lmKGo8PTUpcmV0dXJuCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnI9Yi5w
-b3AoKQppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpxPWIucG9wKCl9ZWxzZXtwPWwuZ2wo
-KTsrK2oKaWYoIWwuRigpKXtpZihqPD00KXtDLk5tLmkoYixILkVqKHApKQpyZXR1cm59cj1ILkVqKHAp
-CmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnE9Yi5wb3AoKQprKz1yLmxlbmd0aCsyfWVs
-c2V7bz1sLmdsKCk7KytqCmZvcig7bC5GKCk7cD1vLG89bil7bj1sLmdsKCk7KytqCmlmKGo+MTAwKXt3
-aGlsZSghMCl7aWYoIShrPjc1JiZqPjMpKWJyZWFrCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIs
-LTEpCmstPWIucG9wKCkubGVuZ3RoKzI7LS1qfUMuTm0uaShiLCIuLi4iKQpyZXR1cm59fXE9SC5Faihw
-KQpyPUguRWoobykKays9ci5sZW5ndGgrcS5sZW5ndGgrNH19aWYoaj5iLmxlbmd0aCsyKXtrKz01Cm09
-Ii4uLiJ9ZWxzZSBtPW51bGwKd2hpbGUoITApe2lmKCEoaz44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYo
-MD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKay09Yi5wb3AoKS5sZW5ndGgrMgppZihtPT1udWxs
-KXtrKz01Cm09Ii4uLiJ9fWlmKG0hPW51bGwpQy5ObS5pKGIsbSkKQy5ObS5pKGIscSkKQy5ObS5pKGIs
-cil9LAp0TShhLGIpe3ZhciBzLHIscT1QLkxzKGIpCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3Ro
-O2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSksKytyKXEuaSgwLGIuYShhW3JdKSkKcmV0dXJuIHF9LApu
-TyhhKXt2YXIgcyxyPXt9CmlmKFAuaEIoYSkpcmV0dXJuInsuLi59IgpzPW5ldyBQLk0oIiIpCnRyeXtD
-Lk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9ITAKYS5LKDAsbmV3IFAucmEocixzKSkKcy5hKz0ifSJ9
-ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9
-cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfSwKYjY6ZnVuY3Rpb24gYjYoYSl7dmFyIF89
-dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCmJuOmZ1bmN0
-aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10aGlzLmI9bnVsbH0sCmxtOmZ1bmN0aW9uIGxtKGEsYixj
-KXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbApfLiR0aT1jfSwKbVc6ZnVuY3Rpb24g
-bVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30sCmxEOmZ1bmN0aW9uIGxEKCl7fSwKaWw6ZnVuY3Rpb24g
-aWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKWWs6ZnVuY3Rpb24g
-WWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0aGlzLmE9YX0sCktQOmZ1bmN0aW9uIEtQKCl7fSwKUG46
-ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlvbiBHaihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LAps
-ZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0aW9uIFZqKCl7fSwKWHY6ZnVuY3Rpb24gWHYoKXt9LApu
-WTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0aW9uIFdZKCl7fSwKUlU6ZnVuY3Rpb24gUlUoKXt9LApw
-UjpmdW5jdGlvbiBwUigpe30sCkJTKGEsYil7dmFyIHMscixxLHA9bnVsbAp0cnl7cD1KU09OLnBhcnNl
-KGEpfWNhdGNoKHIpe3M9SC5SdShyKQpxPVAucnIoU3RyaW5nKHMpLG51bGwsbnVsbCkKdGhyb3cgSC5i
-KHEpfXE9UC5RZShwKQpyZXR1cm4gcX0sClFlKGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwK
-aWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCmlmKE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSE9
-PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3IFAudXcoYSxPYmplY3QuY3JlYXRlKG51bGwpKQpmb3Io
-cz0wO3M8YS5sZW5ndGg7KytzKWFbc109UC5RZShhW3NdKQpyZXR1cm4gYX0sCmt5KGEsYixjLGQpe3Zh
-ciBzLHIKaWYoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe3M9YgpkPXMubGVuZ3RoCmlmKGQtYzwxNSly
-ZXR1cm4gbnVsbApyPVAuUlAoYSxzLGMsZCkKaWYociE9bnVsbCYmYSlpZihyLmluZGV4T2YoIlx1ZmZm
-ZCIpPj0wKXJldHVybiBudWxsCnJldHVybiByfXJldHVybiBudWxsfSwKUlAoYSxiLGMsZCl7dmFyIHM9
-YT8kLkhHKCk6JC5yZigpCmlmKHM9PW51bGwpcmV0dXJuIG51bGwKaWYoMD09PWMmJmQ9PT1iLmxlbmd0
-aClyZXR1cm4gUC5SYihzLGIpCnJldHVybiBQLlJiKHMsYi5zdWJhcnJheShjLFAuakIoYyxkLGIubGVu
-Z3RoKSkpfSwKUmIoYSxiKXt2YXIgcyxyCnRyeXtzPWEuZGVjb2RlKGIpCnJldHVybiBzfWNhdGNoKHIp
-e0guUnUocil9cmV0dXJuIG51bGx9LAp4TShhLGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09MCl0
-aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJl
-IG11bHRpcGxlIG9mIGZvdXIsIGlzICIrZixhLGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJyKCJJ
-bnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScgbm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0aHJv
-dyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFj
-dGVycyIsYSxiKSl9LApHeShhLGIsYyl7cmV0dXJuIG5ldyBQLlVkKGEsYil9LApOQyhhKXtyZXR1cm4g
-YS5MdCgpfSwKVWcoYSxiKXtyZXR1cm4gbmV3IFAudHUoYSxbXSxQLkN5KCkpfSwKdVgoYSxiLGMpe3Zh
-ciBzLHI9bmV3IFAuTSgiIikscT1QLlVnKHIsYikKcS5pVShhKQpzPXIuYQpyZXR1cm4gcy5jaGFyQ29k
-ZUF0KDApPT0wP3M6c30sCmo0KGEpe3N3aXRjaChhKXtjYXNlIDY1OnJldHVybiJNaXNzaW5nIGV4dGVu
-c2lvbiBieXRlIgpjYXNlIDY3OnJldHVybiJVbmV4cGVjdGVkIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY5
-OnJldHVybiJJbnZhbGlkIFVURi04IGJ5dGUiCmNhc2UgNzE6cmV0dXJuIk92ZXJsb25nIGVuY29kaW5n
-IgpjYXNlIDczOnJldHVybiJPdXQgb2YgdW5pY29kZSByYW5nZSIKY2FzZSA3NTpyZXR1cm4iRW5jb2Rl
-ZCBzdXJyb2dhdGUiCmNhc2UgNzc6cmV0dXJuIlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2Ui
-CmRlZmF1bHQ6cmV0dXJuIiJ9fSwKankoYSxiLGMpe3ZhciBzLHIscSxwPWMtYixvPW5ldyBVaW50OEFy
-cmF5KHApCmZvcihzPUouVTYoYSkscj0wO3I8cDsrK3Ipe3E9cy5xKGEsYityKQppZigocSY0Mjk0OTY3
-MDQwKT4+PjAhPT0wKXE9MjU1CmlmKHI+PXApcmV0dXJuIEguT0gobyxyKQpvW3JdPXF9cmV0dXJuIG99
-LAp1dzpmdW5jdGlvbiB1dyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1udWxsfSwKaTg6ZnVu
-Y3Rpb24gaTgoYSl7dGhpcy5hPWF9LAp4cjpmdW5jdGlvbiB4cigpe30sCk56OmZ1bmN0aW9uIE56KCl7
-fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgpe30sClVrOmZ1bmN0aW9uIFVrKCl7
-fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgpe30sClVkOmZ1bmN0aW9uIFVkKGEs
-Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLODpmdW5jdGlvbiBLOChhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApvajpmdW5jdGlvbiBvaihhKXt0aGlzLmI9YX0sCk14OmZ1bmN0
-aW9uIE14KGEpe3RoaXMuYT1hfSwKU2g6ZnVuY3Rpb24gU2goKXt9LAp0aTpmdW5jdGlvbiB0aShhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1ifSwKdHU6ZnVuY3Rpb24gdHUoYSxiLGMpe3RoaXMuYz1hCnRoaXMuYT1i
-CnRoaXMuYj1jfSwKdTU6ZnVuY3Rpb24gdTUoKXt9LApFMzpmdW5jdGlvbiBFMygpe30sClJ3OmZ1bmN0
-aW9uIFJ3KGEpe3RoaXMuYj0wCnRoaXMuYz1hfSwKR1k6ZnVuY3Rpb24gR1koYSl7dGhpcy5hPWF9LApi
-ejpmdW5jdGlvbiBieihhKXt0aGlzLmE9YQp0aGlzLmI9MTYKdGhpcy5jPTB9LApRQShhLGIpe3ZhciBz
-PUguSHAoYSxiKQppZihzIT1udWxsKXJldHVybiBzCnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9
-LApvcyhhKXtpZihhIGluc3RhbmNlb2YgSC5UcClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBv
-ZiAnIitILmxoKGEpKyInIn0sCk84KGEsYixjLGQpe3ZhciBzLHI9Yz9KLktoKGEsZCk6Si5RaShhLGQp
-CmlmKGEhPT0wJiZiIT1udWxsKWZvcihzPTA7czxyLmxlbmd0aDsrK3MpcltzXT1iCnJldHVybiByfSwK
-UFcoYSxiLGMpe3ZhciBzLHI9SC5RSShbXSxjLkMoImpkPDA+IikpCmZvcihzPUouSVQoYSk7cy5GKCk7
-KUMuTm0uaShyLGMuYShzLmdsKCkpKQppZihiKXJldHVybiByCnJldHVybiBKLkVwKHIsYyl9LApZMShh
-LGIsYyl7dmFyIHMKaWYoYilyZXR1cm4gUC5ldihhLGMpCnM9Si5FcChQLmV2KGEsYyksYykKcmV0dXJu
-IHN9LApldihhLGIpe3ZhciBzLHIKaWYoQXJyYXkuaXNBcnJheShhKSlyZXR1cm4gSC5RSShhLnNsaWNl
-KDApLGIuQygiamQ8MD4iKSkKcz1ILlFJKFtdLGIuQygiamQ8MD4iKSkKZm9yKHI9Si5JVChhKTtyLkYo
-KTspQy5ObS5pKHMsci5nbCgpKQpyZXR1cm4gc30sCkFGKGEsYil7cmV0dXJuIEouekMoUC5QVyhhLCEx
-LGIpKX0sCkhNKGEsYixjKXt2YXIgcz1ILmZ3KGEsYixQLmpCKGIsYyxhLmxlbmd0aCkpCnJldHVybiBz
-fSwKT28oYSl7cmV0dXJuIEguTHcoYSl9LApudShhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEs
-ITAsITEsITEsITEpKX0sCmwoYSxiLGMpe3ZhciBzPUouSVQoYikKaWYoIXMuRigpKXJldHVybiBhCmlm
-KGMubGVuZ3RoPT09MCl7ZG8gYSs9SC5FaihzLmdsKCkpCndoaWxlKHMuRigpKX1lbHNle2ErPUguRWoo
-cy5nbCgpKQpmb3IoO3MuRigpOylhPWErYytILkVqKHMuZ2woKSl9cmV0dXJuIGF9LApscihhLGIsYyxk
-KXtyZXR1cm4gbmV3IFAubXAoYSxiLGMsZCl9LAp1bygpe3ZhciBzPUguTTAoKQppZihzIT1udWxsKXJl
-dHVybiBQLmhLKHMpCnRocm93IEguYihQLkw0KCInVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWQiKSl9
-LAplUChhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbT0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYz09PUMu
-eE0pe3M9JC56NCgpLmIKcz1zLnRlc3QoYil9ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChjKS5D
-KCJVay5TIikuYShiKQpyPWMuZ1pFKCkuV0ooYikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxzOysr
-cSl7bz1yW3FdCmlmKG88MTI4KXtuPW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShhW25d
-JjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0zMj9w
-KyIrIjpwKyIlIittW28+Pj40JjE1XSttW28mMTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpw
-fSwKR3EoYSl7dmFyIHM9TWF0aC5hYnMoYSkscj1hPDA/Ii0iOiIiCmlmKHM+PTEwMDApcmV0dXJuIiIr
-YQppZihzPj0xMDApcmV0dXJuIHIrIjAiK3MKaWYocz49MTApcmV0dXJuIHIrIjAwIitzCnJldHVybiBy
-KyIwMDAiK3N9LApWeChhKXtpZihhPj0xMDApcmV0dXJuIiIrYQppZihhPj0xMClyZXR1cm4iMCIrYQpy
-ZXR1cm4iMDAiK2F9LApoMChhKXtpZihhPj0xMClyZXR1cm4iIithCnJldHVybiIwIithfSwKaGwoYSl7
-aWYodHlwZW9mIGE9PSJudW1iZXIifHxILnJRKGEpfHxhPT1udWxsKXJldHVybiBKLncoYSkKaWYodHlw
-ZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09OLnN0cmluZ2lmeShhKQpyZXR1cm4gUC5vcyhhKX0sCmhW
-KGEpe3JldHVybiBuZXcgUC5DNihhKX0sCnhZKGEsYil7cmV0dXJuIG5ldyBQLkFUKCExLG51bGwsYixh
-KX0sCkwzKGEsYixjKXtyZXR1cm4gbmV3IFAuQVQoITAsYSxiLGMpfSwKTzcoYSxiKXtyZXR1cm4gbmV3
-IFAuYkoobnVsbCxudWxsLCEwLGEsYiwiVmFsdWUgbm90IGluIHJhbmdlIil9LApURShhLGIsYyxkLGUp
-e3JldHVybiBuZXcgUC5iSihiLGMsITAsYSxkLCJJbnZhbGlkIHZhbHVlIil9LAp3QShhLGIsYyxkKXtp
-ZihhPGJ8fGE+Yyl0aHJvdyBILmIoUC5URShhLGIsYyxkLG51bGwpKQpyZXR1cm4gYX0sCmpCKGEsYixj
-KXtpZigwPmF8fGE+Yyl0aHJvdyBILmIoUC5URShhLDAsYywic3RhcnQiLG51bGwpKQppZihiIT1udWxs
-KXtpZihhPmJ8fGI+Yyl0aHJvdyBILmIoUC5URShiLGEsYywiZW5kIixudWxsKSkKcmV0dXJuIGJ9cmV0
-dXJuIGN9LAprMShhLGIpe2lmKGE8MCl0aHJvdyBILmIoUC5URShhLDAsbnVsbCxiLG51bGwpKQpyZXR1
-cm4gYX0sCkNmKGEsYixjLGQsZSl7dmFyIHM9SC5JWihlPT1udWxsP0ouSG0oYik6ZSkKcmV0dXJuIG5l
-dyBQLmVZKHMsITAsYSxjLCJJbmRleCBvdXQgb2YgcmFuZ2UiKX0sCkw0KGEpe3JldHVybiBuZXcgUC51
-YihhKX0sClNZKGEpe3JldHVybiBuZXcgUC5kcyhhKX0sClBWKGEpe3JldHVybiBuZXcgUC5saihhKX0s
-CmE0KGEpe3JldHVybiBuZXcgUC5VVihhKX0sCnJyKGEsYixjKXtyZXR1cm4gbmV3IFAuYUUoYSxiLGMp
-fSwKaEsoYTUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEy
-LGEzPW51bGwsYTQ9YTUubGVuZ3RoCmlmKGE0Pj01KXtzPSgoQy54Qi5XKGE1LDQpXjU4KSozfEMueEIu
-VyhhNSwwKV4xMDB8Qy54Qi5XKGE1LDEpXjk3fEMueEIuVyhhNSwyKV4xMTZ8Qy54Qi5XKGE1LDMpXjk3
-KT4+PjAKaWYocz09PTApcmV0dXJuIFAuS0QoYTQ8YTQ/Qy54Qi5OaihhNSwwLGE0KTphNSw1LGEzKS5n
-bFIoKQplbHNlIGlmKHM9PT0zMilyZXR1cm4gUC5LRChDLnhCLk5qKGE1LDUsYTQpLDAsYTMpLmdsUigp
-fXI9UC5POCg4LDAsITEsdC5TKQpDLk5tLlk1KHIsMCwwKQpDLk5tLlk1KHIsMSwtMSkKQy5ObS5ZNShy
-LDIsLTEpCkMuTm0uWTUociw3LC0xKQpDLk5tLlk1KHIsMywwKQpDLk5tLlk1KHIsNCwwKQpDLk5tLlk1
-KHIsNSxhNCkKQy5ObS5ZNShyLDYsYTQpCmlmKFAuVUIoYTUsMCxhNCwwLHIpPj0xNClDLk5tLlk1KHIs
-NyxhNCkKcT1yWzFdCmlmKHE+PTApaWYoUC5VQihhNSwwLHEsMjAscik9PT0yMClyWzddPXEKcD1yWzJd
-KzEKbz1yWzNdCm49cls0XQptPXJbNV0KbD1yWzZdCmlmKGw8bSltPWwKaWYobjxwKW49bQplbHNlIGlm
-KG48PXEpbj1xKzEKaWYobzxwKW89bgprPXJbN108MAppZihrKWlmKHA+cSszKXtqPWEzCms9ITF9ZWxz
-ZXtpPW8+MAppZihpJiZvKzE9PT1uKXtqPWEzCms9ITF9ZWxzZXtpZighKG08YTQmJm09PT1uKzImJkMu
-eEIuUWkoYTUsIi4uIixuKSkpaD1tPm4rMiYmQy54Qi5RaShhNSwiLy4uIixtLTMpCmVsc2UgaD0hMApp
-ZihoKXtqPWEzCms9ITF9ZWxzZXtpZihxPT09NClpZihDLnhCLlFpKGE1LCJmaWxlIiwwKSl7aWYocDw9
-MCl7aWYoIUMueEIuUWkoYTUsIi8iLG4pKXtnPSJmaWxlOi8vLyIKcz0zfWVsc2V7Zz0iZmlsZTovLyIK
-cz0yfWE1PWcrQy54Qi5OaihhNSxuLGE0KQpxLT0wCmk9cy0wCm0rPWkKbCs9aQphND1hNS5sZW5ndGgK
-cD03Cm89NwpuPTd9ZWxzZSBpZihuPT09bSl7KytsCmY9bSsxCmE1PUMueEIuaTcoYTUsbixtLCIvIik7
-KythNAptPWZ9aj0iZmlsZSJ9ZWxzZSBpZihDLnhCLlFpKGE1LCJodHRwIiwwKSl7aWYoaSYmbyszPT09
-biYmQy54Qi5RaShhNSwiODAiLG8rMSkpe2wtPTMKZT1uLTMKbS09MwphNT1DLnhCLmk3KGE1LG8sbiwi
-IikKYTQtPTMKbj1lfWo9Imh0dHAifWVsc2Ugaj1hMwplbHNlIGlmKHE9PT01JiZDLnhCLlFpKGE1LCJo
-dHRwcyIsMCkpe2lmKGkmJm8rND09PW4mJkMueEIuUWkoYTUsIjQ0MyIsbysxKSl7bC09NAplPW4tNApt
-LT00CmE1PUMueEIuaTcoYTUsbyxuLCIiKQphNC09MwpuPWV9aj0iaHR0cHMifWVsc2Ugaj1hMwprPSEw
-fX19ZWxzZSBqPWEzCmlmKGspe2lmKGE0PGE1Lmxlbmd0aCl7YTU9Qy54Qi5OaihhNSwwLGE0KQpxLT0w
-CnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYTUscSxwLG8sbixtLGwsail9
-aWYoaj09bnVsbClpZihxPjApaj1QLlBpKGE1LDAscSkKZWxzZXtpZihxPT09MClQLlIzKGE1LDAsIklu
-dmFsaWQgZW1wdHkgc2NoZW1lIikKaj0iIn1pZihwPjApe2Q9cSszCmM9ZDxwP1AuelIoYTUsZCxwLTEp
-OiIiCmI9UC5PZShhNSxwLG8sITEpCmk9bysxCmlmKGk8bil7YT1ILkhwKEMueEIuTmooYTUsaSxuKSxh
-MykKYTA9UC53QihhPT1udWxsP0gudihQLnJyKCJJbnZhbGlkIHBvcnQiLGE1LGkpKTphLGopfWVsc2Ug
-YTA9YTN9ZWxzZXthMD1hMwpiPWEwCmM9IiJ9YTE9UC5rYShhNSxuLG0sYTMsaixiIT1udWxsKQphMj1t
-PGw/UC5sZShhNSxtKzEsbCxhMyk6YTMKcmV0dXJuIG5ldyBQLkRuKGosYyxiLGEwLGExLGEyLGw8YTQ/
-UC50RyhhNSxsKzEsYTQpOmEzKX0sCk10KGEpe0gubihhKQpyZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgs
-Qy54TSwhMSl9LApXWChhKXt2YXIgcz10Lk4KcmV0dXJuIEMuTm0uTjAoSC5RSShhLnNwbGl0KCImIiks
-dC5zKSxQLkZsKHMscyksbmV3IFAubjEoQy54TSksdC5FKX0sCkhoKGEsYixjKXt2YXIgcyxyLHEscCxv
-LG4sbT0iSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsbD0iZWFjaCBw
-YXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAuLjI1NSIsaz1uZXcgUC5jUyhhKSxqPW5ldyBVaW50OEFy
-cmF5KDQpCmZvcihzPWIscj1zLHE9MDtzPGM7KytzKXtwPUMueEIuTyhhLHMpCmlmKHAhPT00Nil7aWYo
-KHBeNDgpPjkpay4kMigiaW52YWxpZCBjaGFyYWN0ZXIiLHMpfWVsc2V7aWYocT09PTMpay4kMihtLHMp
-Cm89UC5RQShDLnhCLk5qKGEscixzKSxudWxsKQppZihvPjI1NSlrLiQyKGwscikKbj1xKzEKaWYocT49
-NClyZXR1cm4gSC5PSChqLHEpCmpbcV09bwpyPXMrMQpxPW59fWlmKHEhPT0zKWsuJDIobSxjKQpvPVAu
-UUEoQy54Qi5OaihhLHIsYyksbnVsbCkKaWYobz4yNTUpay4kMihsLHIpCmlmKHE+PTQpcmV0dXJuIEgu
-T0goaixxKQpqW3FdPW8KcmV0dXJuIGp9LAplZyhhLGIsYTApe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
-LGksaCxnLGYsZSxkPW5ldyBQLlZDKGEpLGM9bmV3IFAuSlQoZCxhKQppZihhLmxlbmd0aDwyKWQuJDEo
-ImFkZHJlc3MgaXMgdG9vIHNob3J0IikKcz1ILlFJKFtdLHQudCkKZm9yKHI9YixxPXIscD0hMSxvPSEx
-O3I8YTA7KytyKXtuPUMueEIuTyhhLHIpCmlmKG49PT01OCl7aWYocj09PWIpeysrcgppZihDLnhCLk8o
-YSxyKSE9PTU4KWQuJDIoImludmFsaWQgc3RhcnQgY29sb24uIixyKQpxPXJ9aWYocj09PXEpe2lmKHAp
-ZC4kMigib25seSBvbmUgd2lsZGNhcmQgYDo6YCBpcyBhbGxvd2VkIixyKQpDLk5tLmkocywtMSkKcD0h
-MH1lbHNlIEMuTm0uaShzLGMuJDIocSxyKSkKcT1yKzF9ZWxzZSBpZihuPT09NDYpbz0hMH1pZihzLmxl
-bmd0aD09PTApZC4kMSgidG9vIGZldyBwYXJ0cyIpCm09cT09PWEwCmw9Qy5ObS5ncloocykKaWYobSYm
-bCE9PS0xKWQuJDIoImV4cGVjdGVkIGEgcGFydCBhZnRlciBsYXN0IGA6YCIsYTApCmlmKCFtKWlmKCFv
-KUMuTm0uaShzLGMuJDIocSxhMCkpCmVsc2V7az1QLkhoKGEscSxhMCkKQy5ObS5pKHMsKGtbMF08PDh8
-a1sxXSk+Pj4wKQpDLk5tLmkocywoa1syXTw8OHxrWzNdKT4+PjApfWlmKHApe2lmKHMubGVuZ3RoPjcp
-ZC4kMSgiYW4gYWRkcmVzcyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRz
-Iil9ZWxzZSBpZihzLmxlbmd0aCE9PTgpZC4kMSgiYW4gYWRkcmVzcyB3aXRob3V0IGEgd2lsZGNhcmQg
-bXVzdCBjb250YWluIGV4YWN0bHkgOCBwYXJ0cyIpCmo9bmV3IFVpbnQ4QXJyYXkoMTYpCmZvcihsPXMu
-bGVuZ3RoLGk9OS1sLHI9MCxoPTA7cjxsOysrcil7Zz1zW3JdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsr
-K2Ype2lmKGg8MHx8aD49MTYpcmV0dXJuIEguT0goaixoKQpqW2hdPTAKZT1oKzEKaWYoZT49MTYpcmV0
-dXJuIEguT0goaixlKQpqW2VdPTAKaCs9Mn1lbHNle2U9Qy5qbi53RyhnLDgpCmlmKGg8MHx8aD49MTYp
-cmV0dXJuIEguT0goaixoKQpqW2hdPWUKZT1oKzEKaWYoZT49MTYpcmV0dXJuIEguT0goaixlKQpqW2Vd
-PWcmMjU1CmgrPTJ9fXJldHVybiBqfSwKS0woYSxiLGMsZCxlLGYsZyl7dmFyIHMscixxLHAsbyxuCmY9
-Zj09bnVsbD8iIjpQLlBpKGYsMCxmLmxlbmd0aCkKZz1QLnpSKGcsMCxnPT1udWxsPzA6Zy5sZW5ndGgp
-CmE9UC5PZShhLDAsYT09bnVsbD8wOmEubGVuZ3RoLCExKQpzPVAubGUobnVsbCwwLDAsZSkKcj1QLnRH
-KG51bGwsMCwwKQpkPVAud0IoZCxmKQpxPWY9PT0iZmlsZSIKaWYoYT09bnVsbClwPWcubGVuZ3RoIT09
-MHx8ZCE9bnVsbHx8cQplbHNlIHA9ITEKaWYocClhPSIiCnA9YT09bnVsbApvPSFwCmI9UC5rYShiLDAs
-Yj09bnVsbD8wOmIubGVuZ3RoLGMsZixvKQpuPWYubGVuZ3RoPT09MAppZihuJiZwJiYhQy54Qi5uKGIs
-Ii8iKSliPVAud0YoYiwhbnx8bykKZWxzZSBiPVAueGUoYikKcmV0dXJuIG5ldyBQLkRuKGYsZyxwJiZD
-LnhCLm4oYiwiLy8iKT8iIjphLGQsYixzLHIpfSwKd0soYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAK
-aWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sCk5SKGEsYil7dmFyIHMscixxLHAsbyxu
-CmZvcihzPWEubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhhLHIpCnA9Qy54Qi5XKGIscikKbz1x
-XnAKaWYobyE9PTApe2lmKG89PT0zMil7bj1wfG8KaWYoOTc8PW4mJm48PTEyMiljb250aW51ZX1yZXR1
-cm4hMX19cmV0dXJuITB9LApSMyhhLGIsYyl7dGhyb3cgSC5iKFAucnIoYyxhLGIpKX0sClhkKGEsYixj
-LGQpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaD1udWxsLGc9Yi5sZW5ndGgKaWYoZyE9PTApe3E9
-MAp3aGlsZSghMCl7aWYoIShxPGcpKXtzPSIiCnI9MApicmVha31pZihDLnhCLlcoYixxKT09PTY0KXtz
-PUMueEIuTmooYiwwLHEpCnI9cSsxCmJyZWFrfSsrcX1pZihyPGcmJkMueEIuVyhiLHIpPT09OTEpe2Zv
-cihwPXIsbz0tMTtwPGc7KytwKXtuPUMueEIuVyhiLHApCmlmKG49PT0zNyYmbzwwKXttPUMueEIuUWko
-YiwiMjUiLHArMSk/cCsyOnAKbz1wCnA9bX1lbHNlIGlmKG49PT05MylicmVha31pZihwPT09Zyl0aHJv
-dyBILmIoUC5ycigiSW52YWxpZCBJUHY2IGhvc3QgZW50cnkuIixiLHIpKQpsPW88MD9wOm8KUC5lZyhi
-LHIrMSxsKTsrK3AKaWYocCE9PWcmJkMueEIuVyhiLHApIT09NTgpdGhyb3cgSC5iKFAucnIoIkludmFs
-aWQgZW5kIG9mIGF1dGhvcml0eSIsYixwKSl9ZWxzZSBwPXIKd2hpbGUoITApe2lmKCEocDxnKSl7az1o
-CmJyZWFrfWlmKEMueEIuVyhiLHApPT09NTgpe2o9Qy54Qi55bihiLHArMSkKaz1qLmxlbmd0aCE9PTA/
-UC5RQShqLGgpOmgKYnJlYWt9KytwfWk9Qy54Qi5OaihiLHIscCl9ZWxzZXtrPWgKaT1rCnM9IiJ9cmV0
-dXJuIFAuS0woaSxoLEguUUkoYy5zcGxpdCgiLyIpLHQucyksayxkLGEscyl9LAprRShhLGIpe3ZhciBz
-LHIscSxwLG8KZm9yKHM9YS5sZW5ndGgscj0wO3I8czsrK3Ipe3E9YVtyXQpwPUouVTYocSkKbz1wLmdB
-KHEpCmlmKDA+bylILnYoUC5URSgwLDAscC5nQShxKSxudWxsLG51bGwpKQppZihILlNRKHEsIi8iLDAp
-KXtzPVAuTDQoIklsbGVnYWwgcGF0aCBjaGFyYWN0ZXIgIitILkVqKHEpKQp0aHJvdyBILmIocyl9fX0s
-CkhOKGEsYixjKXt2YXIgcyxyLHEscApmb3Iocz1ILnFDKGEsYyxudWxsLEgudDYoYSkuYykscj1zLiR0
-aSxzPW5ldyBILmE3KHMscy5nQShzKSxyLkMoImE3PGFMLkU+IikpLHI9ci5DKCJhTC5FIik7cy5GKCk7
-KXtxPXIuYShzLmQpCnA9UC5udSgnWyIqLzo8Pj9cXFxcfF0nKQppZihILlNRKHEscCwwKSl7cz1QLkw0
-KCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRoOiAiK3EpCnRocm93IEguYihzKX19fSwKcmcoYSxiKXt2
-YXIgcwppZighKDY1PD1hJiZhPD05MCkpcz05Nzw9YSYmYTw9MTIyCmVsc2Ugcz0hMAppZihzKXJldHVy
-bgpzPVAuTDQoIklsbGVnYWwgZHJpdmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHMpfSwKd0Io
-YSxiKXtpZihhIT1udWxsJiZhPT09UC53SyhiKSlyZXR1cm4gbnVsbApyZXR1cm4gYX0sCk9lKGEsYixj
-LGQpe3ZhciBzLHIscSxwLG8sbgppZihhPT1udWxsKXJldHVybiBudWxsCmlmKGI9PT1jKXJldHVybiIi
-CmlmKEMueEIuTyhhLGIpPT09OTEpe3M9Yy0xCmlmKEMueEIuTyhhLHMpIT09OTMpUC5SMyhhLGIsIk1p
-c3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9zdCIpCnI9YisxCnE9UC50byhhLHIscykKaWYo
-cTxzKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxzLCIlMjUiKX1lbHNlIG89
-IiIKUC5lZyhhLHIscSkKcmV0dXJuIEMueEIuTmooYSxiLHEpLnRvTG93ZXJDYXNlKCkrbysiXSJ9Zm9y
-KG49YjtuPGM7KytuKWlmKEMueEIuTyhhLG4pPT09NTgpe3E9Qy54Qi5YVShhLCIlIixiKQpxPXE+PWIm
-JnE8Yz9xOmMKaWYocTxjKXtwPXErMQpvPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixwKT9xKzM6cCxjLCIl
-MjUiKX1lbHNlIG89IiIKUC5lZyhhLGIscSkKcmV0dXJuIlsiK0MueEIuTmooYSxiLHEpK28rIl0ifXJl
-dHVybiBQLk9MKGEsYixjKX0sCnRvKGEsYixjKXt2YXIgcz1DLnhCLlhVKGEsIiUiLGIpCnJldHVybiBz
-Pj1iJiZzPGM/czpjfSwKT0EoYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT1kIT09IiI/
-bmV3IFAuTShkKTpudWxsCmZvcihzPWIscj1zLHE9ITA7czxjOyl7cD1DLnhCLk8oYSxzKQppZihwPT09
-Mzcpe289UC5ydihhLHMsITApCm49bz09bnVsbAppZihuJiZxKXtzKz0zCmNvbnRpbnVlfWlmKGk9PW51
-bGwpaT1uZXcgUC5NKCIiKQptPWkuYSs9Qy54Qi5OaihhLHIscykKaWYobilvPUMueEIuTmooYSxzLHMr
-MykKZWxzZSBpZihvPT09IiUiKVAuUjMoYSxzLCJab25lSUQgc2hvdWxkIG5vdCBjb250YWluICUgYW55
-bW9yZSIpCmkuYT1tK28Kcys9MwpyPXMKcT0hMH1lbHNle2lmKHA8MTI3KXtuPXA+Pj40CmlmKG4+PTgp
-cmV0dXJuIEguT0goQy5GMyxuKQpuPShDLkYzW25dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihu
-KXtpZihxJiY2NTw9cCYmOTA+PXApe2lmKGk9PW51bGwpaT1uZXcgUC5NKCIiKQppZihyPHMpe2kuYSs9
-Qy54Qi5OaihhLHIscykKcj1zfXE9ITF9KytzfWVsc2V7aWYoKHAmNjQ1MTIpPT09NTUyOTYmJnMrMTxj
-KXtsPUMueEIuTyhhLHMrMSkKaWYoKGwmNjQ1MTIpPT09NTYzMjApe3A9KHAmMTAyMyk8PDEwfGwmMTAy
-M3w2NTUzNgprPTJ9ZWxzZSBrPTF9ZWxzZSBrPTEKaj1DLnhCLk5qKGEscixzKQppZihpPT1udWxsKXtp
-PW5ldyBQLk0oIiIpCm49aX1lbHNlIG49aQpuLmErPWoKbi5hKz1QLnpYKHApCnMrPWsKcj1zfX19aWYo
-aT09bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYocjxjKWkuYSs9Qy54Qi5OaihhLHIsYykKbj1p
-LmEKcmV0dXJuIG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApPTChhLGIsYyl7dmFyIHMscixxLHAsbyxu
-LG0sbCxrLGosaQpmb3Iocz1iLHI9cyxxPW51bGwscD0hMDtzPGM7KXtvPUMueEIuTyhhLHMpCmlmKG89
-PT0zNyl7bj1QLnJ2KGEscywhMCkKbT1uPT1udWxsCmlmKG0mJnApe3MrPTMKY29udGludWV9aWYocT09
-bnVsbClxPW5ldyBQLk0oIiIpCmw9Qy54Qi5OaihhLHIscykKaz1xLmErPSFwP2wudG9Mb3dlckNhc2Uo
-KTpsCmlmKG0pe249Qy54Qi5OaihhLHMscyszKQpqPTN9ZWxzZSBpZihuPT09IiUiKXtuPSIlMjUiCmo9
-MX1lbHNlIGo9MwpxLmE9aytuCnMrPWoKcj1zCnA9ITB9ZWxzZXtpZihvPDEyNyl7bT1vPj4+NAppZiht
-Pj04KXJldHVybiBILk9IKEMuZWEsbSkKbT0oQy5lYVttXSYxPDwobyYxNSkpIT09MH1lbHNlIG09ITEK
-aWYobSl7aWYocCYmNjU8PW8mJjkwPj1vKXtpZihxPT1udWxsKXE9bmV3IFAuTSgiIikKaWYocjxzKXtx
-LmErPUMueEIuTmooYSxyLHMpCnI9c31wPSExfSsrc31lbHNle2lmKG88PTkzKXttPW8+Pj40CmlmKG0+
-PTgpcmV0dXJuIEguT0goQy5hayxtKQptPShDLmFrW21dJjE8PChvJjE1KSkhPT0wfWVsc2UgbT0hMQpp
-ZihtKVAuUjMoYSxzLCJJbnZhbGlkIGNoYXJhY3RlciIpCmVsc2V7aWYoKG8mNjQ1MTIpPT09NTUyOTYm
-JnMrMTxjKXtpPUMueEIuTyhhLHMrMSkKaWYoKGkmNjQ1MTIpPT09NTYzMjApe289KG8mMTAyMyk8PDEw
-fGkmMTAyM3w2NTUzNgpqPTJ9ZWxzZSBqPTF9ZWxzZSBqPTEKbD1DLnhCLk5qKGEscixzKQppZighcCls
-PWwudG9Mb3dlckNhc2UoKQppZihxPT1udWxsKXtxPW5ldyBQLk0oIiIpCm09cX1lbHNlIG09cQptLmEr
-PWwKbS5hKz1QLnpYKG8pCnMrPWoKcj1zfX19fWlmKHE9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMp
-CmlmKHI8Yyl7bD1DLnhCLk5qKGEscixjKQpxLmErPSFwP2wudG9Mb3dlckNhc2UoKTpsfW09cS5hCnJl
-dHVybiBtLmNoYXJDb2RlQXQoMCk9PTA/bTptfSwKUGkoYSxiLGMpe3ZhciBzLHIscSxwCmlmKGI9PT1j
-KXJldHVybiIiCmlmKCFQLkV0KEMueEIuVyhhLGIpKSlQLlIzKGEsYiwiU2NoZW1lIG5vdCBzdGFydGlu
-ZyB3aXRoIGFscGhhYmV0aWMgY2hhcmFjdGVyIikKZm9yKHM9YixyPSExO3M8YzsrK3Mpe3E9Qy54Qi5X
-KGEscykKaWYocTwxMjgpe3A9cT4+PjQKaWYocD49OClyZXR1cm4gSC5PSChDLm1LLHApCnA9KEMubUtb
-cF0mMTw8KHEmMTUpKSE9PTB9ZWxzZSBwPSExCmlmKCFwKVAuUjMoYSxzLCJJbGxlZ2FsIHNjaGVtZSBj
-aGFyYWN0ZXIiKQppZig2NTw9cSYmcTw9OTApcj0hMH1hPUMueEIuTmooYSxiLGMpCnJldHVybiBQLllh
-KHI/YS50b0xvd2VyQ2FzZSgpOmEpfSwKWWEoYSl7aWYoYT09PSJodHRwIilyZXR1cm4iaHR0cCIKaWYo
-YT09PSJmaWxlIilyZXR1cm4iZmlsZSIKaWYoYT09PSJodHRwcyIpcmV0dXJuImh0dHBzIgppZihhPT09
-InBhY2thZ2UiKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gYX0sCnpSKGEsYixjKXtpZihhPT1udWxsKXJl
-dHVybiIiCnJldHVybiBQLlBJKGEsYixjLEMudG8sITEpfSwKa2EoYSxiLGMsZCxlLGYpe3ZhciBzLHIs
-cT1lPT09ImZpbGUiLHA9cXx8ZgppZihhPT1udWxsKXtpZihkPT1udWxsKXJldHVybiBxPyIvIjoiIgpz
-PUgudDYoZCkKcj1uZXcgSC5sSihkLHMuQygicVUoMSkiKS5hKG5ldyBQLlJaKCkpLHMuQygibEo8MSxx
-VT4iKSkuaygwLCIvIil9ZWxzZSBpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJCb3RoIHBhdGggYW5k
-IHBhdGhTZWdtZW50cyBzcGVjaWZpZWQiLG51bGwpKQplbHNlIHI9UC5QSShhLGIsYyxDLldkLCEwKQpp
-ZihyLmxlbmd0aD09PTApe2lmKHEpcmV0dXJuIi8ifWVsc2UgaWYocCYmIUMueEIubihyLCIvIikpcj0i
-LyIrcgpyZXR1cm4gUC5KcihyLGUsZil9LApKcihhLGIsYyl7dmFyIHM9Yi5sZW5ndGg9PT0wCmlmKHMm
-JiFjJiYhQy54Qi5uKGEsIi8iKSlyZXR1cm4gUC53RihhLCFzfHxjKQpyZXR1cm4gUC54ZShhKX0sCmxl
-KGEsYixjLGQpe3ZhciBzLHI9e30KaWYoYSE9bnVsbCl7aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgi
-Qm90aCBxdWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZCIsbnVsbCkpCnJldHVybiBQLlBJ
-KGEsYixjLEMuVkMsITApfWlmKGQ9PW51bGwpcmV0dXJuIG51bGwKcz1uZXcgUC5NKCIiKQpyLmE9IiIK
-ZC5LKDAsbmV3IFAueTUobmV3IFAuTUUocixzKSkpCnI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9
-PTA/cjpyfSwKdEcoYSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIFAuUEkoYSxiLGMs
-Qy5WQywhMCl9LApydihhLGIsYyl7dmFyIHMscixxLHAsbyxuPWIrMgppZihuPj1hLmxlbmd0aClyZXR1
-cm4iJSIKcz1DLnhCLk8oYSxiKzEpCnI9Qy54Qi5PKGEsbikKcT1ILm9vKHMpCnA9SC5vbyhyKQppZihx
-PDB8fHA8MClyZXR1cm4iJSIKbz1xKjE2K3AKaWYobzwxMjcpe249Qy5qbi53RyhvLDQpCmlmKG4+PTgp
-cmV0dXJuIEguT0goQy5GMyxuKQpuPShDLkYzW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQppZihu
-KXJldHVybiBILkx3KGMmJjY1PD1vJiY5MD49bz8ob3wzMik+Pj4wOm8pCmlmKHM+PTk3fHxyPj05Nyly
-ZXR1cm4gQy54Qi5OaihhLGIsYiszKS50b1VwcGVyQ2FzZSgpCnJldHVybiBudWxsfSwKelgoYSl7dmFy
-IHMscixxLHAsbyxuLG0sbCxrPSIwMTIzNDU2Nzg5QUJDREVGIgppZihhPDEyOCl7cz1uZXcgVWludDhB
-cnJheSgzKQpzWzBdPTM3CnNbMV09Qy54Qi5XKGssYT4+PjQpCnNbMl09Qy54Qi5XKGssYSYxNSl9ZWxz
-ZXtpZihhPjIwNDcpaWYoYT42NTUzNSl7cj0yNDAKcT00fWVsc2V7cj0yMjQKcT0zfWVsc2V7cj0xOTIK
-cT0yfXA9MypxCnM9bmV3IFVpbnQ4QXJyYXkocCkKZm9yKG89MDstLXEscT49MDtyPTEyOCl7bj1DLmpu
-LmJmKGEsNipxKSY2M3xyCmlmKG8+PXApcmV0dXJuIEguT0gocyxvKQpzW29dPTM3Cm09bysxCmw9Qy54
-Qi5XKGssbj4+PjQpCmlmKG0+PXApcmV0dXJuIEguT0gocyxtKQpzW21dPWwKbD1vKzIKbT1DLnhCLlco
-ayxuJjE1KQppZihsPj1wKXJldHVybiBILk9IKHMsbCkKc1tsXT1tCm8rPTN9fXJldHVybiBQLkhNKHMs
-MCxudWxsKX0sClBJKGEsYixjLGQsZSl7dmFyIHM9UC5VbChhLGIsYyxkLGUpCnJldHVybiBzPT1udWxs
-P0MueEIuTmooYSxiLGMpOnN9LApVbChhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqPW51
-bGwKZm9yKHM9IWUscj1iLHE9cixwPWo7cjxjOyl7bz1DLnhCLk8oYSxyKQppZihvPDEyNyl7bj1vPj4+
-NAppZihuPj04KXJldHVybiBILk9IKGQsbikKbj0oZFtuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEK
-aWYobikrK3IKZWxzZXtpZihvPT09Mzcpe209UC5ydihhLHIsITEpCmlmKG09PW51bGwpe3IrPTMKY29u
-dGludWV9aWYoIiUiPT09bSl7bT0iJTI1IgpsPTF9ZWxzZSBsPTN9ZWxzZXtpZihzKWlmKG88PTkzKXtu
-PW8+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5hayxuKQpuPShDLmFrW25dJjE8PChvJjE1KSkhPT0w
-fWVsc2Ugbj0hMQplbHNlIG49ITEKaWYobil7UC5SMyhhLHIsIkludmFsaWQgY2hhcmFjdGVyIikKbD1q
-Cm09bH1lbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2KXtuPXIrMQppZihuPGMpe2s9Qy54Qi5PKGEsbikK
-aWYoKGsmNjQ1MTIpPT09NTYzMjApe289KG8mMTAyMyk8PDEwfGsmMTAyM3w2NTUzNgpsPTJ9ZWxzZSBs
-PTF9ZWxzZSBsPTF9ZWxzZSBsPTEKbT1QLnpYKG8pfX1pZihwPT1udWxsKXtwPW5ldyBQLk0oIiIpCm49
-cH1lbHNlIG49cApuLmErPUMueEIuTmooYSxxLHIpCm4uYSs9SC5FaihtKQppZih0eXBlb2YgbCE9PSJu
-dW1iZXIiKXJldHVybiBILnBZKGwpCnIrPWwKcT1yfX1pZihwPT1udWxsKXJldHVybiBqCmlmKHE8Yylw
-LmErPUMueEIuTmooYSxxLGMpCnM9cC5hCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKeUIo
-YSl7aWYoQy54Qi5uKGEsIi4iKSlyZXR1cm4hMApyZXR1cm4gQy54Qi5PWShhLCIvLiIpIT09LTF9LAp4
-ZShhKXt2YXIgcyxyLHEscCxvLG4sbQppZighUC55QihhKSlyZXR1cm4gYQpzPUguUUkoW10sdC5zKQpm
-b3Iocj1hLnNwbGl0KCIvIikscT1yLmxlbmd0aCxwPSExLG89MDtvPHE7KytvKXtuPXJbb10KaWYoSi5S
-TShuLCIuLiIpKXttPXMubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1tKXJldHVybiBILk9IKHMsLTEpCnMu
-cG9wKCkKaWYocy5sZW5ndGg9PT0wKUMuTm0uaShzLCIiKX1wPSEwfWVsc2UgaWYoIi4iPT09bilwPSEw
-CmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19aWYocClDLk5tLmkocywiIikKcmV0dXJuIEMuTm0uayhzLCIv
-Iil9LAp3RihhLGIpe3ZhciBzLHIscSxwLG8sbgppZighUC55QihhKSlyZXR1cm4hYj9QLkMxKGEpOmEK
-cz1ILlFJKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5ndGgscD0hMSxvPTA7bzxxOysr
-byl7bj1yW29dCmlmKCIuLiI9PT1uKWlmKHMubGVuZ3RoIT09MCYmQy5ObS5ncloocykhPT0iLi4iKXtp
-ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnA9ITB9ZWxzZXtDLk5tLmkocywi
-Li4iKQpwPSExfWVsc2UgaWYoIi4iPT09bilwPSEwCmVsc2V7Qy5ObS5pKHMsbikKcD0hMX19cj1zLmxl
-bmd0aAppZihyIT09MClpZihyPT09MSl7aWYoMD49cilyZXR1cm4gSC5PSChzLDApCnI9c1swXS5sZW5n
-dGg9PT0wfWVsc2Ugcj0hMQplbHNlIHI9ITAKaWYocilyZXR1cm4iLi8iCmlmKHB8fEMuTm0uZ3JaKHMp
-PT09Ii4uIilDLk5tLmkocywiIikKaWYoIWIpe2lmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsMCkK
-Qy5ObS5ZNShzLDAsUC5DMShzWzBdKSl9cmV0dXJuIEMuTm0uayhzLCIvIil9LApDMShhKXt2YXIgcyxy
-LHEscD1hLmxlbmd0aAppZihwPj0yJiZQLkV0KEMueEIuVyhhLDApKSlmb3Iocz0xO3M8cDsrK3Mpe3I9
-Qy54Qi5XKGEscykKaWYocj09PTU4KXJldHVybiBDLnhCLk5qKGEsMCxzKSsiJTNBIitDLnhCLnluKGEs
-cysxKQppZihyPD0xMjcpe3E9cj4+PjQKaWYocT49OClyZXR1cm4gSC5PSChDLm1LLHEpCnE9KEMubUtb
-cV0mMTw8KHImMTUpKT09PTB9ZWxzZSBxPSEwCmlmKHEpYnJlYWt9cmV0dXJuIGF9LAp1aihhLGIpe2lm
-KGEuaEIoInBhY2thZ2UiKSYmYS5jPT1udWxsKXJldHVybiBQLmZGKGIsMCxiLmxlbmd0aCkKcmV0dXJu
-LTF9LAptbihhKXt2YXIgcyxyLHEscD1hLmdGaigpLG89cC5sZW5ndGgKaWYobz4wJiZKLkhtKHBbMF0p
-PT09MiYmSi5hNihwWzBdLDEpPT09NTgpe2lmKDA+PW8pcmV0dXJuIEguT0gocCwwKQpQLnJnKEouYTYo
-cFswXSwwKSwhMSkKUC5ITihwLCExLDEpCnM9ITB9ZWxzZXtQLkhOKHAsITEsMCkKcz0hMX1yPWEuZ3RU
-KCkmJiFzPyIiKyJcXCI6IiIKaWYoYS5nY2ooKSl7cT1hLmdKZihhKQppZihxLmxlbmd0aCE9PTApcj1y
-KyJcXCIrcSsiXFwifXI9UC5sKHIscCwiXFwiKQpvPXMmJm89PT0xP3IrIlxcIjpyCnJldHVybiBvLmNo
-YXJDb2RlQXQoMCk9PTA/bzpvfSwKSWgoYSxiKXt2YXIgcyxyLHEKZm9yKHM9MCxyPTA7cjwyOysrcil7
-cT1DLnhCLlcoYSxiK3IpCmlmKDQ4PD1xJiZxPD01NylzPXMqMTYrcS00OAplbHNle3F8PTMyCmlmKDk3
-PD1xJiZxPD0xMDIpcz1zKjE2K3EtODcKZWxzZSB0aHJvdyBILmIoUC54WSgiSW52YWxpZCBVUkwgZW5j
-b2RpbmciLG51bGwpKX19cmV0dXJuIHN9LAprdShhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG89Ygp3aGls
-ZSghMCl7aWYoIShvPGMpKXtzPSEwCmJyZWFrfXI9Qy54Qi5XKGEsbykKaWYocjw9MTI3KWlmKHIhPT0z
-NylxPWUmJnI9PT00MwplbHNlIHE9ITAKZWxzZSBxPSEwCmlmKHEpe3M9ITEKYnJlYWt9KytvfWlmKHMp
-e2lmKEMueE0hPT1kKXE9ITEKZWxzZSBxPSEwCmlmKHEpcmV0dXJuIEMueEIuTmooYSxiLGMpCmVsc2Ug
-cD1uZXcgSC5xaihDLnhCLk5qKGEsYixjKSl9ZWxzZXtwPUguUUkoW10sdC50KQpmb3IocT1hLmxlbmd0
-aCxvPWI7bzxjOysrbyl7cj1DLnhCLlcoYSxvKQppZihyPjEyNyl0aHJvdyBILmIoUC54WSgiSWxsZWdh
-bCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSIsbnVsbCkpCmlmKHI9PT0zNyl7aWYobyszPnEpdGhyb3cg
-SC5iKFAueFkoIlRydW5jYXRlZCBVUkkiLG51bGwpKQpDLk5tLmkocCxQLkloKGEsbysxKSkKbys9Mn1l
-bHNlIGlmKGUmJnI9PT00MylDLk5tLmkocCwzMikKZWxzZSBDLk5tLmkocCxyKX19dC5MLmEocCkKcmV0
-dXJuIEMub0UuV0oocCl9LApFdChhKXt2YXIgcz1hfDMyCnJldHVybiA5Nzw9cyYmczw9MTIyfSwKS0Qo
-YSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iSW52YWxpZCBNSU1FIHR5cGUiLGo9SC5RSShbYi0x
-XSx0LnQpCmZvcihzPWEubGVuZ3RoLHI9YixxPS0xLHA9bnVsbDtyPHM7KytyKXtwPUMueEIuVyhhLHIp
-CmlmKHA9PT00NHx8cD09PTU5KWJyZWFrCmlmKHA9PT00Nyl7aWYocTwwKXtxPXIKY29udGludWV9dGhy
-b3cgSC5iKFAucnIoayxhLHIpKX19aWYocTwwJiZyPmIpdGhyb3cgSC5iKFAucnIoayxhLHIpKQpmb3Io
-O3AhPT00NDspe0MuTm0uaShqLHIpOysrcgpmb3Iobz0tMTtyPHM7KytyKXtwPUMueEIuVyhhLHIpCmlm
-KHA9PT02MSl7aWYobzwwKW89cn1lbHNlIGlmKHA9PT01OXx8cD09PTQ0KWJyZWFrfWlmKG8+PTApQy5O
-bS5pKGosbykKZWxzZXtuPUMuTm0uZ3JaKGopCmlmKHAhPT00NHx8ciE9PW4rN3x8IUMueEIuUWkoYSwi
-YmFzZTY0IixuKzEpKXRocm93IEguYihQLnJyKCJFeHBlY3RpbmcgJz0nIixhLHIpKQpicmVha319Qy5O
-bS5pKGoscikKbT1yKzEKaWYoKGoubGVuZ3RoJjEpPT09MSlhPUMuaDkueXIoYSxtLHMpCmVsc2V7bD1Q
-LlVsKGEsbSxzLEMuVkMsITApCmlmKGwhPW51bGwpYT1DLnhCLmk3KGEsbSxzLGwpfXJldHVybiBuZXcg
-UC5QRShhLGosYyl9LApLTigpe3ZhciBzLHIscSxwLG8sbixtPSIwMTIzNDU2Nzg5QUJDREVGR0hJSktM
-TU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34hJCYnKCkqKyw7PSIsbD0i
-LiIsaz0iOiIsaj0iLyIsaT0iPyIsaD0iIyIsZz1ILlFJKG5ldyBBcnJheSgyMiksdC5nTikKZm9yKHM9
-MDtzPDIyOysrcylnW3NdPW5ldyBVaW50OEFycmF5KDk2KQpyPW5ldyBQLnlJKGcpCnE9bmV3IFAuYzYo
-KQpwPW5ldyBQLnFkKCkKbz10LmdjCm49by5hKHIuJDIoMCwyMjUpKQpxLiQzKG4sbSwxKQpxLiQzKG4s
-bCwxNCkKcS4kMyhuLGssMzQpCnEuJDMobixqLDMpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
-PW8uYShyLiQyKDE0LDIyNSkpCnEuJDMobixtLDEpCnEuJDMobixsLDE1KQpxLiQzKG4saywzNCkKcS4k
-MyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNSwyMjUpKQpx
-LiQzKG4sbSwxKQpxLiQzKG4sIiUiLDIyNSkKcS4kMyhuLGssMzQpCnEuJDMobixqLDkpCnEuJDMobixp
-LDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDEsMjI1KSkKcS4kMyhuLG0sMSkKcS4kMyhuLGss
-MzQpCnEuJDMobixqLDEwKQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigyLDIz
-NSkpCnEuJDMobixtLDEzOSkKcS4kMyhuLGosMTMxKQpxLiQzKG4sbCwxNDYpCnEuJDMobixpLDE3MikK
-cS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDMsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDY4KQpx
-LiQzKG4sbCwxOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNCwyMjkpKQpx
-LiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixrLDEwMikKcS4kMyhuLCJAIiw2OCkKcS4k
-MyhuLCJbIiwyMzIpCnEuJDMobixqLDEzOCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5h
-KHIuJDIoNSwyMjkpKQpxLiQzKG4sbSw1KQpwLiQzKG4sIkFaIiwyMjkpCnEuJDMobixrLDEwMikKcS4k
-MyhuLCJAIiw2OCkKcS4kMyhuLGosMTM4KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEo
-ci4kMig2LDIzMSkpCnAuJDMobiwiMTkiLDcpCnEuJDMobiwiQCIsNjgpCnEuJDMobixqLDEzOCkKcS4k
-MyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNywyMzEpKQpwLiQzKG4sIjA5Iiw3KQpx
-LiQzKG4sIkAiLDY4KQpxLiQzKG4saiwxMzgpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpxLiQz
-KG8uYShyLiQyKDgsOCkpLCJdIiw1KQpuPW8uYShyLiQyKDksMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMo
-bixsLDE2KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQy
-KDE2LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxNykKcS4kMyhuLGosMjM0KQpxLiQzKG4saSwx
-NzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNywyMzUpKQpxLiQzKG4sbSwxMSkKcS4kMyhuLGos
-OSkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoMTAsMjM1KSkKcS4kMyhuLG0s
-MTEpCnEuJDMobixsLDE4KQpxLiQzKG4saiwyMzQpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
-PW8uYShyLiQyKDE4LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxOSkKcS4kMyhuLGosMjM0KQpx
-LiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxOSwyMzUpKQpxLiQzKG4sbSwxMSkK
-cS4kMyhuLGosMjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxMSwyMzUp
-KQpxLiQzKG4sbSwxMSkKcS4kMyhuLGosMTApCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8u
-YShyLiQyKDEyLDIzNikpCnEuJDMobixtLDEyKQpxLiQzKG4saSwxMikKcS4kMyhuLGgsMjA1KQpuPW8u
-YShyLiQyKDEzLDIzNykpCnEuJDMobixtLDEzKQpxLiQzKG4saSwxMykKcC4kMyhvLmEoci4kMigyMCwy
-NDUpKSwiYXoiLDIxKQpyPW8uYShyLiQyKDIxLDI0NSkpCnAuJDMociwiYXoiLDIxKQpwLiQzKHIsIjA5
-IiwyMSkKcS4kMyhyLCIrLS4iLDIxKQpyZXR1cm4gZ30sClVCKGEsYixjLGQsZSl7dmFyIHMscixxLHAs
-bz0kLnZaKCkKZm9yKHM9YjtzPGM7KytzKXtpZihkPDB8fGQ+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8s
-ZCkKcj1vW2RdCnE9Qy54Qi5XKGEscyleOTYKcD1yW3E+OTU/MzE6cV0KZD1wJjMxCkMuTm0uWTUoZSxw
-Pj4+NSxzKX1yZXR1cm4gZH0sClJ4KGEpe2lmKGEuYj09PTcmJkMueEIubihhLmEsInBhY2thZ2UiKSYm
-YS5jPD0wKXJldHVybiBQLmZGKGEuYSxhLmUsYS5mKQpyZXR1cm4tMX0sCmZGKGEsYixjKXt2YXIgcyxy
-LHEKZm9yKHM9YixyPTA7czxjOysrcyl7cT1DLnhCLk8oYSxzKQppZihxPT09NDcpcmV0dXJuIHIhPT0w
-P3M6LTEKaWYocT09PTM3fHxxPT09NTgpcmV0dXJuLTEKcnw9cV40Nn1yZXR1cm4tMX0sCldGOmZ1bmN0
-aW9uIFdGKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAppUDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1h
-CnRoaXMuYj1ifSwKWFM6ZnVuY3Rpb24gWFMoKXt9LApDNjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0s
-CkV6OmZ1bmN0aW9uIEV6KCl7fSwKRjpmdW5jdGlvbiBGKCl7fSwKQVQ6ZnVuY3Rpb24gQVQoYSxiLGMs
-ZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmJKOmZ1bmN0aW9uIGJKKGEsYixj
-LGQsZSxmKXt2YXIgXz10aGlzCl8uZT1hCl8uZj1iCl8uYT1jCl8uYj1kCl8uYz1lCl8uZD1mfSwKZVk6
-ZnVuY3Rpb24gZVkoYSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uZj1hCl8uYT1iCl8uYj1jCl8uYz1kCl8u
-ZD1lfSwKbXA6ZnVuY3Rpb24gbXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
-LmQ9ZH0sCnViOmZ1bmN0aW9uIHViKGEpe3RoaXMuYT1hfSwKZHM6ZnVuY3Rpb24gZHMoYSl7dGhpcy5h
-PWF9LApsajpmdW5jdGlvbiBsaihhKXt0aGlzLmE9YX0sClVWOmZ1bmN0aW9uIFVWKGEpe3RoaXMuYT1h
-fSwKazU6ZnVuY3Rpb24gazUoKXt9LApLWTpmdW5jdGlvbiBLWSgpe30sCnA6ZnVuY3Rpb24gcChhKXt0
-aGlzLmE9YX0sCkNEOmZ1bmN0aW9uIENEKGEpe3RoaXMuYT1hfSwKYUU6ZnVuY3Rpb24gYUUoYSxiLGMp
-e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKY1g6ZnVuY3Rpb24gY1goKXt9LApBbjpmdW5jdGlv
-biBBbigpe30sCk4zOmZ1bmN0aW9uIE4zKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLiR0aT1j
-fSwKYzg6ZnVuY3Rpb24gYzgoKXt9LApNaDpmdW5jdGlvbiBNaCgpe30sClpkOmZ1bmN0aW9uIFpkKCl7
-fSwKTTpmdW5jdGlvbiBNKGEpe3RoaXMuYT1hfSwKbjE6ZnVuY3Rpb24gbjEoYSl7dGhpcy5hPWF9LApj
-UzpmdW5jdGlvbiBjUyhhKXt0aGlzLmE9YX0sClZDOmZ1bmN0aW9uIFZDKGEpe3RoaXMuYT1hfSwKSlQ6
-ZnVuY3Rpb24gSlQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkRuOmZ1bmN0aW9uIERuKGEsYixjLGQs
-ZSxmLGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcK
-Xy5RPV8uej1fLnk9Xy54PW51bGx9LApSWjpmdW5jdGlvbiBSWigpe30sCk1FOmZ1bmN0aW9uIE1FKGEs
-Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp5NTpmdW5jdGlvbiB5NShhKXt0aGlzLmE9YX0sClBFOmZ1bmN0
-aW9uIFBFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnlJOmZ1bmN0aW9uIHlJKGEp
-e3RoaXMuYT1hfSwKYzY6ZnVuY3Rpb24gYzYoKXt9LApxZDpmdW5jdGlvbiBxZCgpe30sClVmOmZ1bmN0
-aW9uIFVmKGEsYixjLGQsZSxmLGcsaCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApf
-LmU9ZQpfLmY9ZgpfLnI9ZwpfLng9aApfLnk9bnVsbH0sCnFlOmZ1bmN0aW9uIHFlKGEsYixjLGQsZSxm
-LGcpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy5R
-PV8uej1fLnk9Xy54PW51bGx9LAppSjpmdW5jdGlvbiBpSigpe30sCkUyOmZ1bmN0aW9uIEUyKGEsYil7
-dGhpcy5hPWEKdGhpcy5iPWJ9LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
-QmY6ZnVuY3Rpb24gQmYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFzOmZ1bmN0aW9uIEFzKCl7fSwK
-R0U6ZnVuY3Rpb24gR0UoYSl7dGhpcy5hPWF9LApONzpmdW5jdGlvbiBONyhhLGIpe3RoaXMuYT1hCnRo
-aXMuYj1ifSwKdVE6ZnVuY3Rpb24gdVEoKXt9LApoRjpmdW5jdGlvbiBoRigpe30sClI0KGEsYixjLGQp
-e3ZhciBzLHIscQpILnA4KGIpCnQuai5hKGQpCmlmKGIpe3M9W2NdCkMuTm0uRlYocyxkKQpkPXN9cj10
-LnoKcT1QLlBXKEouTTEoZCxQLncwKCksciksITAscikKdC5ZLmEoYSkKcmV0dXJuIFAud1koSC5Fayhh
-LHEsbnVsbCkpfSwKRG0oYSxiLGMpe3ZhciBzCnRyeXtpZihPYmplY3QuaXNFeHRlbnNpYmxlKGEpJiYh
-T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVjdC5kZWZpbmVQcm9w
-ZXJ0eShhLGIse3ZhbHVlOmN9KQpyZXR1cm4hMH19Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4hMX0sCk9t
-KGEsYil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpcmV0dXJuIGFb
-Yl0KcmV0dXJuIG51bGx9LAp3WShhKXtpZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVv
-ZiBhPT0ibnVtYmVyInx8SC5yUShhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5FNClyZXR1cm4g
-YS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodC5hay5iKGEpKXJldHVybiBhCmlmKGEgaW5zdGFuY2Vv
-ZiBQLmlQKXJldHVybiBILm8yKGEpCmlmKHQuWS5iKGEpKXJldHVybiBQLmhFKGEsIiRkYXJ0X2pzRnVu
-Y3Rpb24iLG5ldyBQLkRWKCkpCnJldHVybiBQLmhFKGEsIl8kZGFydF9qc09iamVjdCIsbmV3IFAuUEMo
-JC5rSSgpKSl9LApoRShhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51bGwpe3M9Yy4kMShhKQpQ
-LkRtKGEsYixzKX1yZXR1cm4gc30sCmRVKGEpe3ZhciBzLHIKaWYoYT09bnVsbHx8dHlwZW9mIGE9PSJz
-dHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiIpcmV0dXJuIGEKZWxz
-ZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZILlI5KGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5j
-ZW9mIE9iamVjdCYmdC5hay5iKGEpKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIERhdGUpe3M9
-SC5JWihhLmdldFRpbWUoKSkKaWYoTWF0aC5hYnMocyk8PTg2NGUxMylyPSExCmVsc2Ugcj0hMAppZihy
-KUgudihQLnhZKCJEYXRlVGltZSBpcyBvdXRzaWRlIHZhbGlkIHJhbmdlOiAiK3MsbnVsbCkpCkguY2Io
-ITEsImlzVXRjIix0LnkpCnJldHVybiBuZXcgUC5pUChzLCExKX1lbHNlIGlmKGEuY29uc3RydWN0b3I9
-PT0kLmtJKCkpcmV0dXJuIGEubwplbHNlIHJldHVybiBQLk5EKGEpfSwKTkQoYSl7aWYodHlwZW9mIGE9
-PSJmdW5jdGlvbiIpcmV0dXJuIFAuaVEoYSwkLnooKSxuZXcgUC5RUygpKQppZihhIGluc3RhbmNlb2Yg
-QXJyYXkpcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSkKcmV0dXJuIFAuaVEoYSwkLlI4KCks
-bmV3IFAuVXQoKSl9LAppUShhLGIsYyl7dmFyIHM9UC5PbShhLGIpCmlmKHM9PW51bGx8fCEoYSBpbnN0
-YW5jZW9mIE9iamVjdCkpe3M9Yy4kMShhKQpQLkRtKGEsYixzKX1yZXR1cm4gc30sCkRWOmZ1bmN0aW9u
-IERWKCl7fSwKUEM6ZnVuY3Rpb24gUEMoYSl7dGhpcy5hPWF9LApRUzpmdW5jdGlvbiBRUygpe30sCm5w
-OmZ1bmN0aW9uIG5wKCl7fSwKVXQ6ZnVuY3Rpb24gVXQoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlz
-LmE9YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3RoaXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlz
-LmE9YQp0aGlzLiR0aT1ifSwKdmc6ZnVuY3Rpb24gdmcoKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktl
-OmZ1bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwKaGk6ZnVuY3Rpb24gaGkoKXt9fSxSPXsKbnooYSl7dmFy
-IHM9SC5VYyhhLnEoMCwibm9kZUlkIikpCnJldHVybiBuZXcgUi5MTChDLk5tLkh0KEMucmssbmV3IFIu
-TUQoYSkpLHMpfSwKT1goYSl7c3dpdGNoKGEpe2Nhc2UgQy5BZDpyZXR1cm4iQWRkIC8qPyovIGhpbnQi
-CmNhc2UgQy5uZTpyZXR1cm4iQWRkIC8qISovIGhpbnQiCmNhc2UgQy53VjpyZXR1cm4iUmVtb3ZlIC8q
-PyovIGhpbnQiCmNhc2UgQy5mUjpyZXR1cm4iUmVtb3ZlIC8qISovIGhpbnQiCmNhc2UgQy5teTpyZXR1
-cm4iQ2hhbmdlIHRvIC8qPyovIGhpbnQiCmNhc2UgQy5yeDpyZXR1cm4iQ2hhbmdlIHRvIC8qISovIGhp
-bnQifX0sCkxMOmZ1bmN0aW9uIExMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNRDpmdW5jdGlvbiBN
-RChhKXt0aGlzLmE9YX0sCkg3OmZ1bmN0aW9uIEg3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9fSxUPXtt
-UTpmdW5jdGlvbiBtUSgpe319LFU9ewpqZihhKXt2YXIgcyxyLHEscAppZihhPT1udWxsKXM9bnVsbApl
-bHNle3M9SC5RSShbXSx0LmZBKQpmb3Iocj1KLklUKHQuUi5hKGEpKTtyLkYoKTspe3E9ci5nbCgpCnA9
-Si5VNihxKQpzLnB1c2gobmV3IFUuU2UoSC5rKHAucShxLCJkZXNjcmlwdGlvbiIpKSxILmsocC5xKHEs
-ImhyZWYiKSkpKX19cmV0dXJuIHN9LApOZChhKXt2YXIgcyxyCmlmKGE9PW51bGwpcz1udWxsCmVsc2V7
-cz1ILlFJKFtdLHQuaGgpCmZvcihyPUouSVQodC5SLmEoYSkpO3IuRigpOylzLnB1c2goVS5OZihyLmds
-KCkpKX1yZXR1cm4gc30sCk5mKGEpe3ZhciBzPUouVTYoYSkscj1ILmsocy5xKGEsImRlc2NyaXB0aW9u
-IikpLHE9SC5RSShbXSx0LmFKKQpmb3Iocz1KLklUKHQuUi5hKHMucShhLCJlbnRyaWVzIikpKTtzLkYo
-KTspcS5wdXNoKFUuUmoocy5nbCgpKSkKcmV0dXJuIG5ldyBVLnlEKHIscSl9LApSaihhKXt2YXIgcyxy
-PUouVTYoYSkscT1ILmsoci5xKGEsImRlc2NyaXB0aW9uIikpLHA9SC5rKHIucShhLCJmdW5jdGlvbiIp
-KSxvPXIucShhLCJsaW5rIikKaWYobz09bnVsbClvPW51bGwKZWxzZXtzPUouVTYobykKbz1uZXcgVS5N
-bChILmsocy5xKG8sImhyZWYiKSksSC5VYyhzLnEobywibGluZSIpKSxILmsocy5xKG8sInBhdGgiKSkp
-fXI9dC5iTS5hKHIucShhLCJoaW50QWN0aW9ucyIpKQpyPXI9PW51bGw/bnVsbDpKLk0xKHIsbmV3IFUu
-YU4oKSx0LkopLmJyKDApCnJldHVybiBuZXcgVS53YihxLHAsbyxyPT1udWxsP0MuZG46cil9LApkMjpm
-dW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApf
-LmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNlKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNbDpmdW5j
-dGlvbiBNbChhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp5RDpmdW5jdGlvbiB5RChh
-LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2I6ZnVuY3Rpb24gd2IoYSxiLGMsZCl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCmFOOmZ1bmN0aW9uIGFOKCl7fSwKYjA6ZnVuY3Rpb24gYjAo
-KXt9fSxXPXsKeDMoKXtyZXR1cm4gd2luZG93fSwKWnIoKXtyZXR1cm4gZG9jdW1lbnR9LApKNihhKXt2
-YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKaWYoYSE9bnVsbClDLnhuLnNMVShzLGEpCnJl
-dHVybiBzfSwKTGooYSl7cmV0dXJuIENTUy5lc2NhcGUoYSl9LApVOShhLGIsYyl7dmFyIHMscj1kb2N1
-bWVudC5ib2R5CnIudG9TdHJpbmcKcz10LmFjCnM9bmV3IEguVTUobmV3IFcuZTcoQy5SWS5yNihyLGEs
-YixjKSkscy5DKCJhMihsRC5FKSIpLmEobmV3IFcuQ3YoKSkscy5DKCJVNTxsRC5FPiIpKQpyZXR1cm4g
-dC5oLmEocy5ncjgocykpfSwKclMoYSl7dmFyIHMscixxPSJlbGVtZW50IHRhZyB1bmF2YWlsYWJsZSIK
-dHJ5e3M9Si5ZRShhKQpzLmducyhhKQpxPXMuZ25zKGEpfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIHF9
-LApDMChhLGIpe2E9YStiJjUzNjg3MDkxMQphPWErKChhJjUyNDI4Nyk8PDEwKSY1MzY4NzA5MTEKcmV0
-dXJuIGFeYT4+PjZ9LApyRShhLGIsYyxkKXt2YXIgcz1XLkMwKFcuQzAoVy5DMChXLkMwKDAsYSksYiks
-YyksZCkscj1zKygocyY2NzEwODg2Myk8PDMpJjUzNjg3MDkxMQpyXj1yPj4+MTEKcmV0dXJuIHIrKChy
-JjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sClROKGEsYil7dmFyIHMscixxPWEuY2xhc3NMaXN0CmZvcihz
-PWIubGVuZ3RoLHI9MDtyPGIubGVuZ3RoO2IubGVuZ3RoPT09c3x8KDAsSC5saykoYiksKytyKXEuYWRk
-KGJbcl0pfSwKSkUoYSxiLGMsZCxlKXt2YXIgcz1XLmFGKG5ldyBXLnZOKGMpLHQuQikKaWYocyE9bnVs
-bCYmITApSi5kWihhLGIscywhMSkKcmV0dXJuIG5ldyBXLnhDKGEsYixzLCExLGUuQygieEM8MD4iKSl9
-LApUdyhhKXt2YXIgcz1XLko2KG51bGwpLHI9dC5GLmEod2luZG93LmxvY2F0aW9uKQpzPW5ldyBXLkpR
-KG5ldyBXLm1rKHMscikpCnMuQ1koYSkKcmV0dXJuIHN9LApxRChhLGIsYyxkKXt0LmguYShhKQpILm4o
-YikKSC5uKGMpCnQuY3IuYShkKQpyZXR1cm4hMH0sCm5aKGEsYixjLGQpe3ZhciBzLHIscQp0LmguYShh
-KQpILm4oYikKSC5uKGMpCnM9dC5jci5hKGQpLmEKcj1zLmEKQy54bi5zTFUocixjKQpxPXIuaG9zdG5h
-bWUKcz1zLmIKaWYoIShxPT1zLmhvc3RuYW1lJiZyLnBvcnQ9PT1zLnBvcnQmJnIucHJvdG9jb2w9PT1z
-LnByb3RvY29sKSlpZihxPT09IiIpaWYoci5wb3J0PT09IiIpe3M9ci5wcm90b2NvbApzPXM9PT0iOiJ8
-fHM9PT0iIn1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMApyZXR1cm4gc30sCkJsKCl7dmFyIHM9
-dC5OLHI9UC50TShDLlF4LHMpLHE9dC5kRy5hKG5ldyBXLklBKCkpLHA9SC5RSShbIlRFTVBMQVRFIl0s
-dC5zKQpzPW5ldyBXLmN0KHIsUC5McyhzKSxQLkxzKHMpLFAuTHMocyksbnVsbCkKcy5DWShudWxsLG5l
-dyBILmxKKEMuUXgscSx0LmR2KSxwLG51bGwpCnJldHVybiBzfSwKcWMoYSl7dmFyIHMKaWYoYT09bnVs
-bClyZXR1cm4gbnVsbAppZigicG9zdE1lc3NhZ2UiIGluIGEpe3M9Vy5QMShhKQpyZXR1cm4gc31lbHNl
-IHJldHVybiB0LmNoLmEoYSl9LApQMShhKXtpZihhPT09d2luZG93KXJldHVybiB0LmNpLmEoYSkKZWxz
-ZSByZXR1cm4gbmV3IFcuZFcoKX0sCmFGKGEsYil7dmFyIHM9JC5YMwppZihzPT09Qy5OVSlyZXR1cm4g
-YQpyZXR1cm4gcy5QeShhLGIpfSwKcUU6ZnVuY3Rpb24gcUUoKXt9LApHaDpmdW5jdGlvbiBHaCgpe30s
-CmZZOmZ1bmN0aW9uIGZZKCl7fSwKclo6ZnVuY3Rpb24gclooKXt9LApBejpmdW5jdGlvbiBBeigpe30s
-ClFQOmZ1bmN0aW9uIFFQKCl7fSwKbng6ZnVuY3Rpb24gbngoKXt9LApvSjpmdW5jdGlvbiBvSigpe30s
-CmlkOmZ1bmN0aW9uIGlkKCl7fSwKUUY6ZnVuY3Rpb24gUUYoKXt9LApOaDpmdW5jdGlvbiBOaCgpe30s
-CmFlOmZ1bmN0aW9uIGFlKCl7fSwKSUI6ZnVuY3Rpb24gSUIoKXt9LApuNzpmdW5jdGlvbiBuNygpe30s
-Cnd6OmZ1bmN0aW9uIHd6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmN2OmZ1bmN0aW9uIGN2KCl7
-fSwKQ3Y6ZnVuY3Rpb24gQ3YoKXt9LAplYTpmdW5jdGlvbiBlYSgpe30sCkQwOmZ1bmN0aW9uIEQwKCl7
-fSwKaEg6ZnVuY3Rpb24gaEgoKXt9LApoNDpmdW5jdGlvbiBoNCgpe30sCmJyOmZ1bmN0aW9uIGJyKCl7
-fSwKVmI6ZnVuY3Rpb24gVmIoKXt9LApmSjpmdW5jdGlvbiBmSigpe30sCndhOmZ1bmN0aW9uIHdhKCl7
-fSwKU2c6ZnVuY3Rpb24gU2coKXt9LAp1ODpmdW5jdGlvbiB1OCgpe30sCkFqOmZ1bmN0aW9uIEFqKCl7
-fSwKZTc6ZnVuY3Rpb24gZTcoYSl7dGhpcy5hPWF9LApLVjpmdW5jdGlvbiBLVigpe30sCkJIOmZ1bmN0
-aW9uIEJIKCl7fSwKU046ZnVuY3Rpb24gU04oKXt9LApldzpmdW5jdGlvbiBldygpe30sCmxwOmZ1bmN0
-aW9uIGxwKCl7fSwKVGI6ZnVuY3Rpb24gVGIoKXt9LApJdjpmdW5jdGlvbiBJdigpe30sCldQOmZ1bmN0
-aW9uIFdQKCl7fSwKeVk6ZnVuY3Rpb24geVkoKXt9LAp3NjpmdW5jdGlvbiB3Nigpe30sCks1OmZ1bmN0
-aW9uIEs1KCl7fSwKQ206ZnVuY3Rpb24gQ20oKXt9LApDUTpmdW5jdGlvbiBDUSgpe30sCnc0OmZ1bmN0
-aW9uIHc0KCl7fSwKcmg6ZnVuY3Rpb24gcmgoKXt9LApjZjpmdW5jdGlvbiBjZigpe30sCmk3OmZ1bmN0
-aW9uIGk3KGEpe3RoaXMuYT1hfSwKU3k6ZnVuY3Rpb24gU3koYSl7dGhpcy5hPWF9LApLUzpmdW5jdGlv
-biBLUyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQTM6ZnVuY3Rpb24gQTMoYSxiKXt0aGlzLmE9YQp0
-aGlzLmI9Yn0sCkk0OmZ1bmN0aW9uIEk0KGEpe3RoaXMuYT1hfSwKRms6ZnVuY3Rpb24gRmsoYSxiKXt0
-aGlzLmE9YQp0aGlzLiR0aT1ifSwKUk86ZnVuY3Rpb24gUk8oYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
-YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKQ3E6ZnVuY3Rpb24gQ3EoYSxiLGMsZCl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmM9YwpfLiR0aT1kfSwKeEM6ZnVuY3Rpb24geEMoYSxiLGMsZCxlKXt2YXIgXz10
-aGlzCl8uYj1hCl8uYz1iCl8uZD1jCl8uZT1kCl8uJHRpPWV9LAp2TjpmdW5jdGlvbiB2TihhKXt0aGlz
-LmE9YX0sCkpROmZ1bmN0aW9uIEpRKGEpe3RoaXMuYT1hfSwKR206ZnVuY3Rpb24gR20oKXt9LAp2RDpm
-dW5jdGlvbiB2RChhKXt0aGlzLmE9YX0sClV2OmZ1bmN0aW9uIFV2KGEpe3RoaXMuYT1hfSwKRWc6ZnVu
-Y3Rpb24gRWcoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKbTY6ZnVuY3Rpb24gbTYo
-KXt9LApFbzpmdW5jdGlvbiBFbygpe30sCldrOmZ1bmN0aW9uIFdrKCl7fSwKY3Q6ZnVuY3Rpb24gY3Qo
-YSxiLGMsZCxlKXt2YXIgXz10aGlzCl8uZT1hCl8uYT1iCl8uYj1jCl8uYz1kCl8uZD1lfSwKSUE6ZnVu
-Y3Rpb24gSUEoKXt9LApPdzpmdW5jdGlvbiBPdygpe30sClc5OmZ1bmN0aW9uIFc5KGEsYixjKXt2YXIg
-Xz10aGlzCl8uYT1hCl8uYj1iCl8uYz0tMQpfLmQ9bnVsbApfLiR0aT1jfSwKZFc6ZnVuY3Rpb24gZFco
-KXt9LAptazpmdW5jdGlvbiBtayhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28o
-YSl7dGhpcy5hPWEKdGhpcy5iPTB9LApmbTpmdW5jdGlvbiBmbShhKXt0aGlzLmE9YX0sCkxlOmZ1bmN0
-aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9LApyQjpmdW5jdGlvbiByQigpe30sClhXOmZ1bmN0
-aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9fSxYPXsKQ0woYSxiKXt2YXIgcyxyLHEscCxvLG49
-Yi54WihhKQpiLmhLKGEpCmlmKG4hPW51bGwpYT1DLnhCLnluKGEsbi5sZW5ndGgpCnM9dC5zCnI9SC5R
-SShbXSxzKQpxPUguUUkoW10scykKcz1hLmxlbmd0aAppZihzIT09MCYmYi5yNChDLnhCLlcoYSwwKSkp
-e2lmKDA+PXMpcmV0dXJuIEguT0goYSwwKQpDLk5tLmkocSxhWzBdKQpwPTF9ZWxzZXtDLk5tLmkocSwi
-IikKcD0wfWZvcihvPXA7bzxzOysrbylpZihiLnI0KEMueEIuVyhhLG8pKSl7Qy5ObS5pKHIsQy54Qi5O
-aihhLHAsbykpCkMuTm0uaShxLGFbb10pCnA9bysxfWlmKHA8cyl7Qy5ObS5pKHIsQy54Qi55bihhLHAp
-KQpDLk5tLmkocSwiIil9cmV0dXJuIG5ldyBYLldEKGIsbixyLHEpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxi
-LGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9YwpfLmU9ZH0sCkk3KGEpe3JldHVybiBuZXcg
-WC5kdihhKX0sCmR2OmZ1bmN0aW9uIGR2KGEpe3RoaXMuYT1hfX0KdmFyIHc9W0IsQyxELEUsRixILEos
-TCxNLE8sUCxSLFQsVSxXLFhdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeSh3
-KQp2YXIgJD17fQpILkZLLnByb3RvdHlwZT17fQpKLkd2LnByb3RvdHlwZT17CkROKGEsYil7cmV0dXJu
-IGE9PT1ifSwKZ2lPKGEpe3JldHVybiBILmVRKGEpfSwKdyhhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIr
-SC5saChhKSsiJyJ9LAplNyhhLGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKGEsYi5nV2EoKSxiLmdu
-ZCgpLGIuZ1ZtKCkpKX19CkoueUUucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4gU3RyaW5nKGEpfSwKZ2lP
-KGEpe3JldHVybiBhPzUxOTAxODoyMTgxNTl9LAokaWEyOjF9Ckoud2UucHJvdG90eXBlPXsKRE4oYSxi
-KXtyZXR1cm4gbnVsbD09Yn0sCncoYSl7cmV0dXJuIm51bGwifSwKZ2lPKGEpe3JldHVybiAwfSwKJGlj
-ODoxfQpKLk1GLnByb3RvdHlwZT17CmdpTyhhKXtyZXR1cm4gMH0sCncoYSl7cmV0dXJuIFN0cmluZyhh
-KX0sCiRpdm06MX0KSi5pQy5wcm90b3R5cGU9e30KSi5rZC5wcm90b3R5cGU9e30KSi5jNS5wcm90b3R5
-cGU9ewp3KGEpe3ZhciBzPWFbJC56KCldCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMudChhKQpyZXR1cm4i
-SmF2YVNjcmlwdCBmdW5jdGlvbiBmb3IgIitILkVqKEoudyhzKSl9LAokaUVIOjF9CkouamQucHJvdG90
-eXBlPXsKZHIoYSxiKXtyZXR1cm4gbmV3IEgualYoYSxILnQ2KGEpLkMoIkA8MT4iKS5LcShiKS5DKCJq
-VjwxLDI+IikpfSwKaShhLGIpe0gudDYoYSkuYy5hKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAu
-TDQoImFkZCIpKQphLnB1c2goYil9LApXNChhLGIpe3ZhciBzCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52
-KFAuTDQoInJlbW92ZUF0IikpCnM9YS5sZW5ndGgKaWYoYj49cyl0aHJvdyBILmIoUC5PNyhiLG51bGwp
-KQpyZXR1cm4gYS5zcGxpY2UoYiwxKVswXX0sClVHKGEsYixjKXt2YXIgcyxyCkgudDYoYSkuQygiY1g8
-MT4iKS5hKGMpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52KFAuTDQoImluc2VydEFsbCIpKQpQLndBKGIs
-MCxhLmxlbmd0aCwiaW5kZXgiKQppZighdC5XLmIoYykpYz1KLlJYKGMpCnM9Si5IbShjKQphLmxlbmd0
-aD1hLmxlbmd0aCtzCnI9YitzCnRoaXMuWVcoYSxyLGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixj
-KX0sCkZWKGEsYil7dmFyIHMKSC50NihhKS5DKCJjWDwxPiIpLmEoYikKaWYoISFhLmZpeGVkJGxlbmd0
-aClILnYoUC5MNCgiYWRkQWxsIikpCmlmKEFycmF5LmlzQXJyYXkoYikpe3RoaXMuS2goYSxiKQpyZXR1
-cm59Zm9yKHM9Si5JVChiKTtzLkYoKTspYS5wdXNoKHMuZ2woKSl9LApLaChhLGIpe3ZhciBzLHIKdC5i
-LmEoYikKcz1iLmxlbmd0aAppZihzPT09MClyZXR1cm4KaWYoYT09PWIpdGhyb3cgSC5iKFAuYTQoYSkp
-CmZvcihyPTA7cjxzOysrcilhLnB1c2goYltyXSl9LApFMihhLGIsYyl7dmFyIHM9SC50NihhKQpyZXR1
-cm4gbmV3IEgubEooYSxzLktxKGMpLkMoIjEoMikiKS5hKGIpLHMuQygiQDwxPiIpLktxKGMpLkMoImxK
-PDEsMj4iKSl9LAprKGEsYil7dmFyIHMscj1QLk84KGEubGVuZ3RoLCIiLCExLHQuTikKZm9yKHM9MDtz
-PGEubGVuZ3RoOysrcyl0aGlzLlk1KHIscyxILkVqKGFbc10pKQpyZXR1cm4gci5qb2luKGIpfSwKZVIo
-YSxiKXtyZXR1cm4gSC5xQyhhLGIsbnVsbCxILnQ2KGEpLmMpfSwKTjAoYSxiLGMsZCl7dmFyIHMscixx
-CmQuYShiKQpILnQ2KGEpLktxKGQpLkMoIjEoMSwyKSIpLmEoYykKcz1hLmxlbmd0aApmb3Iocj1iLHE9
-MDtxPHM7KytxKXtyPWMuJDIocixhW3FdKQppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkp
-fXJldHVybiByfSwKSHQoYSxiKXt2YXIgcyxyLHEscCxvLG49SC50NihhKQpuLkMoImEyKDEpIikuYShi
-KQpzPWEubGVuZ3RoCmZvcihyPW51bGwscT0hMSxwPTA7cDxzOysrcCl7bz1hW3BdCmlmKEgub1QoYi4k
-MShvKSkpe2lmKHEpdGhyb3cgSC5iKEguQW0oKSkKcj1vCnE9ITB9aWYocyE9PWEubGVuZ3RoKXRocm93
-IEguYihQLmE0KGEpKX1pZihxKXJldHVybiBuLmMuYShyKQp0aHJvdyBILmIoSC5XcCgpKX0sCkUoYSxi
-KXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LApndEgoYSl7
-aWYoYS5sZW5ndGg+MClyZXR1cm4gYVswXQp0aHJvdyBILmIoSC5XcCgpKX0sCmdyWihhKXt2YXIgcz1h
-Lmxlbmd0aAppZihzPjApcmV0dXJuIGFbcy0xXQp0aHJvdyBILmIoSC5XcCgpKX0sCllXKGEsYixjLGQs
-ZSl7dmFyIHMscixxLHAsbwpILnQ2KGEpLkMoImNYPDE+IikuYShkKQppZighIWEuaW1tdXRhYmxlJGxp
-c3QpSC52KFAuTDQoInNldFJhbmdlIikpClAuakIoYixjLGEubGVuZ3RoKQpzPWMtYgppZihzPT09MCly
-ZXR1cm4KUC5rMShlLCJza2lwQ291bnQiKQppZih0LmouYihkKSl7cj1kCnE9ZX1lbHNle3I9Si5BNShk
-LGUpLnR0KDAsITEpCnE9MH1wPUouVTYocikKaWYocStzPnAuZ0EocikpdGhyb3cgSC5iKEguYXIoKSkK
-aWYocTxiKWZvcihvPXMtMTtvPj0wOy0tbylhW2Irb109cC5xKHIscStvKQplbHNlIGZvcihvPTA7bzxz
-OysrbylhW2Irb109cC5xKHIscStvKX0sCnZnKGEsYixjLGQpe3JldHVybiB0aGlzLllXKGEsYixjLGQs
-MCl9LApWcihhLGIpe3ZhciBzLHIKSC50NihhKS5DKCJhMigxKSIpLmEoYikKcz1hLmxlbmd0aApmb3Io
-cj0wO3I8czsrK3Ipe2lmKEgub1QoYi4kMShhW3JdKSkpcmV0dXJuITAKaWYoYS5sZW5ndGghPT1zKXRo
-cm93IEguYihQLmE0KGEpKX1yZXR1cm4hMX0sCnRnKGEsYil7dmFyIHMKZm9yKHM9MDtzPGEubGVuZ3Ro
-OysrcylpZihKLlJNKGFbc10sYikpcmV0dXJuITAKcmV0dXJuITF9LApnbDAoYSl7cmV0dXJuIGEubGVu
-Z3RoPT09MH0sCmdvcihhKXtyZXR1cm4gYS5sZW5ndGghPT0wfSwKdyhhKXtyZXR1cm4gUC54KGEsIlsi
-LCJdIil9LAp0dChhLGIpe3ZhciBzPUguUUkoYS5zbGljZSgwKSxILnQ2KGEpKQpyZXR1cm4gc30sCmJy
-KGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKZ20oYSl7cmV0dXJuIG5ldyBKLm0xKGEsYS5sZW5ndGgs
-SC50NihhKS5DKCJtMTwxPiIpKX0sCmdpTyhhKXtyZXR1cm4gSC5lUShhKX0sCmdBKGEpe3JldHVybiBh
-Lmxlbmd0aH0sCnNBKGEsYil7aWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgic2V0IGxlbmd0aCIp
-KQppZihiPDApdGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmlmKGI+YS5s
-ZW5ndGgpSC50NihhKS5jLmEobnVsbCkKYS5sZW5ndGg9Yn0sCnEoYSxiKXtILklaKGIpCmlmKGI+PWEu
-bGVuZ3RofHxiPDApdGhyb3cgSC5iKEgudShhLGIpKQpyZXR1cm4gYVtiXX0sClk1KGEsYixjKXtILnQ2
-KGEpLmMuYShjKQppZighIWEuaW1tdXRhYmxlJGxpc3QpSC52KFAuTDQoImluZGV4ZWQgc2V0IikpCmlm
-KGI+PWEubGVuZ3RofHxiPDApdGhyb3cgSC5iKEgudShhLGIpKQphW2JdPWN9LAokaWJROjEsCiRpY1g6
-MSwKJGl6TToxfQpKLlBvLnByb3RvdHlwZT17fQpKLm0xLnByb3RvdHlwZT17CmdsKCl7cmV0dXJuIHRo
-aXMuJHRpLmMuYSh0aGlzLmQpfSwKRigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPXEubGVuZ3RoCmlmKHIu
-YiE9PXApdGhyb3cgSC5iKEgubGsocSkpCnM9ci5jCmlmKHM+PXApe3Iuc00obnVsbCkKcmV0dXJuITF9
-ci5zTShxW3NdKTsrK3IuYwpyZXR1cm4hMH0sCnNNKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEo
-YSl9LAokaUFuOjF9CkoucUkucHJvdG90eXBlPXsKelEoYSl7aWYoYT4wKXtpZihhIT09MS8wKXJldHVy
-biBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1hdGgucm91bmQoMC1hKQp0aHJv
-dyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sCncoYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiIt
-MC4wIgplbHNlIHJldHVybiIiK2F9LApnaU8oYSl7dmFyIHMscixxLHAsbz1hfDAKaWYoYT09PW8pcmV0
-dXJuIG8mNTM2ODcwOTExCnM9TWF0aC5hYnMoYSkKcj1NYXRoLmxvZyhzKS8wLjY5MzE0NzE4MDU1OTk0
-NTN8MApxPU1hdGgucG93KDIscikKcD1zPDE/cy9xOnEvcwpyZXR1cm4oKHAqOTAwNzE5OTI1NDc0MDk5
-MnwwKSsocCozNTQyMjQzMTgxMTc2NTIxfDApKSo1OTkxOTcrcioxMjU5JjUzNjg3MDkxMX0sCnpZKGEs
-Yil7dmFyIHM9YSViCmlmKHM9PT0wKXJldHVybiAwCmlmKHM+MClyZXR1cm4gcwpyZXR1cm4gcytifSwK
-QlUoYSxiKXtyZXR1cm4oYXwwKT09PWE/YS9ifDA6dGhpcy5ESihhLGIpfSwKREooYSxiKXt2YXIgcz1h
-L2IKaWYocz49LTIxNDc0ODM2NDgmJnM8PTIxNDc0ODM2NDcpcmV0dXJuIHN8MAppZihzPjApe2lmKHMh
-PT0xLzApcmV0dXJuIE1hdGguZmxvb3Iocyl9ZWxzZSBpZihzPi0xLzApcmV0dXJuIE1hdGguY2VpbChz
-KQp0aHJvdyBILmIoUC5MNCgiUmVzdWx0IG9mIHRydW5jYXRpbmcgZGl2aXNpb24gaXMgIitILkVqKHMp
-KyI6ICIrSC5FaihhKSsiIH4vICIrYikpfSwKd0coYSxiKXt2YXIgcwppZihhPjApcz10aGlzLnAzKGEs
-YikKZWxzZXtzPWI+MzE/MzE6YgpzPWE+PnM+Pj4wfXJldHVybiBzfSwKYmYoYSxiKXtpZigwPmIpdGhy
-b3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAzKGEsYil9LApwMyhhLGIpe3JldHVybiBiPjMxPzA6
-YT4+PmJ9LAokaUNQOjEsCiRpWlo6MX0KSi5iVS5wcm90b3R5cGU9eyRpSWo6MX0KSi5rRC5wcm90b3R5
-cGU9e30KSi5Eci5wcm90b3R5cGU9ewpPKGEsYil7aWYoYjwwKXRocm93IEguYihILnUoYSxiKSkKaWYo
-Yj49YS5sZW5ndGgpSC52KEgudShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKVyhhLGIpe2lm
-KGI+PWEubGVuZ3RoKXRocm93IEguYihILnUoYSxiKSkKcmV0dXJuIGEuY2hhckNvZGVBdChiKX0sCmRk
-KGEsYil7cmV0dXJuIG5ldyBILnVuKGIsYSwwKX0sCmgoYSxiKXtyZXR1cm4gYStifSwKVGMoYSxiKXt2
-YXIgcz1iLmxlbmd0aCxyPWEubGVuZ3RoCmlmKHM+cilyZXR1cm4hMQpyZXR1cm4gYj09PXRoaXMueW4o
-YSxyLXMpfSwKaTcoYSxiLGMsZCl7dmFyIHM9UC5qQihiLGMsYS5sZW5ndGgpLHI9YS5zdWJzdHJpbmco
-MCxiKSxxPWEuc3Vic3RyaW5nKHMpCnJldHVybiByK2QrcX0sClFpKGEsYixjKXt2YXIgcwppZihjPDB8
-fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9YytiLmxl
-bmd0aAppZihzPmEubGVuZ3RoKXJldHVybiExCnJldHVybiBiPT09YS5zdWJzdHJpbmcoYyxzKX0sCm4o
-YSxiKXtyZXR1cm4gdGhpcy5RaShhLGIsMCl9LApOaihhLGIsYyl7cmV0dXJuIGEuc3Vic3RyaW5nKGIs
-UC5qQihiLGMsYS5sZW5ndGgpKX0sCnluKGEsYil7cmV0dXJuIHRoaXMuTmooYSxiLG51bGwpfSwKaGMo
-YSl7cmV0dXJuIGEudG9Mb3dlckNhc2UoKX0sCmJTKGEpe3ZhciBzLHIscSxwPWEudHJpbSgpLG89cC5s
-ZW5ndGgKaWYobz09PTApcmV0dXJuIHAKaWYodGhpcy5XKHAsMCk9PT0xMzMpe3M9Si5tbShwLDEpCmlm
-KHM9PT1vKXJldHVybiIifWVsc2Ugcz0wCnI9by0xCnE9dGhpcy5PKHAscik9PT0xMzM/Si5jMShwLHIp
-Om8KaWYocz09PTAmJnE9PT1vKXJldHVybiBwCnJldHVybiBwLnN1YnN0cmluZyhzLHEpfSwKVChhLGIp
-e3ZhciBzLHIKaWYoMD49YilyZXR1cm4iIgppZihiPT09MXx8YS5sZW5ndGg9PT0wKXJldHVybiBhCmlm
-KGIhPT1iPj4+MCl0aHJvdyBILmIoQy5FcSkKZm9yKHM9YSxyPSIiOyEwOyl7aWYoKGImMSk9PT0xKXI9
-cytyCmI9Yj4+PjEKaWYoYj09PTApYnJlYWsKcys9c31yZXR1cm4gcn0sClhVKGEsYixjKXt2YXIgcwpp
-ZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnM9
-YS5pbmRleE9mKGIsYykKcmV0dXJuIHN9LApPWShhLGIpe3JldHVybiB0aGlzLlhVKGEsYiwwKX0sClBr
-KGEsYixjKXt2YXIgcyxyCmlmKGM9PW51bGwpYz1hLmxlbmd0aAplbHNlIGlmKGM8MHx8Yz5hLmxlbmd0
-aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKcz1iLmxlbmd0aApyPWEubGVu
-Z3RoCmlmKGMrcz5yKWM9ci1zCnJldHVybiBhLmxhc3RJbmRleE9mKGIsYyl9LApjbihhLGIpe3JldHVy
-biB0aGlzLlBrKGEsYixudWxsKX0sCklzKGEsYixjKXt2YXIgcz1hLmxlbmd0aAppZihjPnMpdGhyb3cg
-SC5iKFAuVEUoYywwLHMsbnVsbCxudWxsKSkKcmV0dXJuIEguU1EoYSxiLGMpfSwKdGcoYSxiKXtyZXR1
-cm4gdGhpcy5JcyhhLGIsMCl9LAp3KGEpe3JldHVybiBhfSwKZ2lPKGEpe3ZhciBzLHIscQpmb3Iocz1h
-Lmxlbmd0aCxyPTAscT0wO3E8czsrK3Epe3I9cithLmNoYXJDb2RlQXQocSkmNTM2ODcwOTExCnI9ciso
-KHImNTI0Mjg3KTw8MTApJjUzNjg3MDkxMQpyXj1yPj42fXI9cisoKHImNjcxMDg4NjMpPDwzKSY1MzY4
-NzA5MTEKcl49cj4+MTEKcmV0dXJuIHIrKChyJjE2MzgzKTw8MTUpJjUzNjg3MDkxMX0sCmdBKGEpe3Jl
-dHVybiBhLmxlbmd0aH0sCnEoYSxiKXtILklaKGIpCmlmKGI+PWEubGVuZ3RofHwhMSl0aHJvdyBILmIo
-SC51KGEsYikpCnJldHVybiBhW2JdfSwKJGl2WDoxLAokaXFVOjF9CkguQlIucHJvdG90eXBlPXsKZ20o
-YSl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gbmV3IEguZVQoSi5JVCh0aGlzLmdPTigpKSxzLkMoIkA8
-MT4iKS5LcShzLlFbMV0pLkMoImVUPDEsMj4iKSl9LApnQShhKXtyZXR1cm4gSi5IbSh0aGlzLmdPTigp
-KX0sCmdsMChhKXtyZXR1cm4gSi51VSh0aGlzLmdPTigpKX0sCmdvcihhKXtyZXR1cm4gSi5GNyh0aGlz
-LmdPTigpKX0sCmVSKGEsYil7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gSC5HSihKLkE1KHRoaXMuZ09O
-KCksYikscy5jLHMuUVsxXSl9LApFKGEsYil7cmV0dXJuIEguTGgodGhpcykuUVsxXS5hKEouR0EodGhp
-cy5nT04oKSxiKSl9LAp3KGEpe3JldHVybiBKLncodGhpcy5nT04oKSl9fQpILmVULnByb3RvdHlwZT17
-CkYoKXtyZXR1cm4gdGhpcy5hLkYoKX0sCmdsKCl7cmV0dXJuIHRoaXMuJHRpLlFbMV0uYSh0aGlzLmEu
-Z2woKSl9LAokaUFuOjF9CkguWnkucHJvdG90eXBlPXsKZ09OKCl7cmV0dXJuIHRoaXMuYX19Ckgub2wu
-cHJvdG90eXBlPXskaWJROjF9CkguVXEucHJvdG90eXBlPXsKcShhLGIpe3JldHVybiB0aGlzLiR0aS5R
-WzFdLmEoSi54OSh0aGlzLmEsSC5JWihiKSkpfSwKWTUoYSxiLGMpe3ZhciBzPXRoaXMuJHRpCkoudTko
-dGhpcy5hLGIscy5jLmEocy5RWzFdLmEoYykpKX0sCiRpYlE6MSwKJGl6TToxfQpILmpWLnByb3RvdHlw
-ZT17CmRyKGEsYil7cmV0dXJuIG5ldyBILmpWKHRoaXMuYSx0aGlzLiR0aS5DKCJAPDE+IikuS3EoYiku
-QygialY8MSwyPiIpKX0sCmdPTigpe3JldHVybiB0aGlzLmF9fQpILmMucHJvdG90eXBlPXsKdyhhKXt2
-YXIgcz0iTGF0ZUluaXRpYWxpemF0aW9uRXJyb3I6ICIrdGhpcy5hCnJldHVybiBzfX0KSC5xai5wcm90
-b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnEoYSxiKXtyZXR1cm4gQy54Qi5PKHRo
-aXMuYSxILklaKGIpKX19CkguYlEucHJvdG90eXBlPXt9CkguYUwucHJvdG90eXBlPXsKZ20oYSl7dmFy
-IHM9dGhpcwpyZXR1cm4gbmV3IEguYTcocyxzLmdBKHMpLEguTGgocykuQygiYTc8YUwuRT4iKSl9LApn
-bDAoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKayhhLGIpe3ZhciBzLHIscSxwPXRoaXMsbz1w
-LmdBKHApCmlmKGIubGVuZ3RoIT09MCl7aWYobz09PTApcmV0dXJuIiIKcz1ILkVqKHAuRSgwLDApKQpp
-ZihvIT09cC5nQShwKSl0aHJvdyBILmIoUC5hNChwKSkKZm9yKHI9cyxxPTE7cTxvOysrcSl7cj1yK2Ir
-SC5FaihwLkUoMCxxKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cgSC5iKFAuYTQocCkpfXJldHVybiByLmNo
-YXJDb2RlQXQoMCk9PTA/cjpyfWVsc2V7Zm9yKHE9MCxyPSIiO3E8bzsrK3Epe3IrPUguRWoocC5FKDAs
-cSkpCmlmKG8hPT1wLmdBKHApKXRocm93IEguYihQLmE0KHApKX1yZXR1cm4gci5jaGFyQ29kZUF0KDAp
-PT0wP3I6cn19LApldihhLGIpe3JldHVybiB0aGlzLkdHKDAsSC5MaCh0aGlzKS5DKCJhMihhTC5FKSIp
-LmEoYikpfSwKRTIoYSxiLGMpe3ZhciBzPUguTGgodGhpcykKcmV0dXJuIG5ldyBILmxKKHRoaXMscy5L
-cShjKS5DKCIxKGFMLkUpIikuYShiKSxzLkMoIkA8YUwuRT4iKS5LcShjKS5DKCJsSjwxLDI+IikpfSwK
-ZVIoYSxiKXtyZXR1cm4gSC5xQyh0aGlzLGIsbnVsbCxILkxoKHRoaXMpLkMoImFMLkUiKSl9LAp0dChh
-LGIpe3JldHVybiBQLlkxKHRoaXMsITAsSC5MaCh0aGlzKS5DKCJhTC5FIikpfSwKYnIoYSl7cmV0dXJu
-IHRoaXMudHQoYSwhMCl9fQpILm5ILnByb3RvdHlwZT17CkhkKGEsYixjLGQpe3ZhciBzLHI9dGhpcy5i
-ClAuazEociwic3RhcnQiKQpzPXRoaXMuYwppZihzIT1udWxsKXtQLmsxKHMsImVuZCIpCmlmKHI+cyl0
-aHJvdyBILmIoUC5URShyLDAscywic3RhcnQiLG51bGwpKX19LApnVUQoKXt2YXIgcz1KLkhtKHRoaXMu
-YSkscj10aGlzLmMKaWYocj09bnVsbHx8cj5zKXJldHVybiBzCnJldHVybiByfSwKZ0FzKCl7dmFyIHM9
-Si5IbSh0aGlzLmEpLHI9dGhpcy5iCmlmKHI+cylyZXR1cm4gcwpyZXR1cm4gcn0sCmdBKGEpe3ZhciBz
-LHI9Si5IbSh0aGlzLmEpLHE9dGhpcy5iCmlmKHE+PXIpcmV0dXJuIDAKcz10aGlzLmMKaWYocz09bnVs
-bHx8cz49cilyZXR1cm4gci1xCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSE4oKQpyZXR1
-cm4gcy1xfSwKRShhLGIpe3ZhciBzPXRoaXMscj1zLmdBcygpK2IKaWYoYjwwfHxyPj1zLmdVRCgpKXRo
-cm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBKLkdBKHMuYSxyKX0sCmVS
-KGEsYil7dmFyIHMscixxPXRoaXMKUC5rMShiLCJjb3VudCIpCnM9cS5iK2IKcj1xLmMKaWYociE9bnVs
-bCYmcz49cilyZXR1cm4gbmV3IEguTUIocS4kdGkuQygiTUI8MT4iKSkKcmV0dXJuIEgucUMocS5hLHMs
-cixxLiR0aS5jKX0sCnR0KGEsYil7dmFyIHMscixxLHA9dGhpcyxvPXAuYixuPXAuYSxtPUouVTYobiks
-bD1tLmdBKG4pLGs9cC5jCmlmKGshPW51bGwmJms8bClsPWsKcz1sLW8KaWYoczw9MCl7bj1KLlFpKDAs
-cC4kdGkuYykKcmV0dXJuIG59cj1QLk84KHMsbS5FKG4sbyksITEscC4kdGkuYykKZm9yKHE9MTtxPHM7
-KytxKXtDLk5tLlk1KHIscSxtLkUobixvK3EpKQppZihtLmdBKG4pPGwpdGhyb3cgSC5iKFAuYTQocCkp
-fXJldHVybiByfX0KSC5hNy5wcm90b3R5cGU9ewpnbCgpe3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5k
-KX0sCkYoKXt2YXIgcyxyPXRoaXMscT1yLmEscD1KLlU2KHEpLG89cC5nQShxKQppZihyLmIhPT1vKXRo
-cm93IEguYihQLmE0KHEpKQpzPXIuYwppZihzPj1vKXtyLnNJKG51bGwpCnJldHVybiExfXIuc0kocC5F
-KHEscykpOysrci5jCnJldHVybiEwfSwKc0koYSl7dGhpcy5kPXRoaXMuJHRpLkMoIjE/IikuYShhKX0s
-CiRpQW46MX0KSC5pMS5wcm90b3R5cGU9ewpnbShhKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcg
-SC5NSChKLklUKHRoaXMuYSksdGhpcy5iLHMuQygiQDwxPiIpLktxKHMuUVsxXSkuQygiTUg8MSwyPiIp
-KX0sCmdBKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApnbDAoYSl7cmV0dXJuIEoudVUodGhpcy5hKX0s
-CkUoYSxiKXtyZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIpKX19CkgueHkucHJvdG90eXBlPXsk
-aWJROjF9CkguTUgucHJvdG90eXBlPXsKRigpe3ZhciBzPXRoaXMscj1zLmIKaWYoci5GKCkpe3Muc0ko
-cy5jLiQxKHIuZ2woKSkpCnJldHVybiEwfXMuc0kobnVsbCkKcmV0dXJuITF9LApnbCgpe3JldHVybiB0
-aGlzLiR0aS5RWzFdLmEodGhpcy5hKX0sCnNJKGEpe3RoaXMuYT10aGlzLiR0aS5DKCIyPyIpLmEoYSl9
-fQpILmxKLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApFKGEsYil7cmV0dXJu
-IHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILlU1LnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBu
-ZXcgSC5TTyhKLklUKHRoaXMuYSksdGhpcy5iLHRoaXMuJHRpLkMoIlNPPDE+IikpfX0KSC5TTy5wcm90
-b3R5cGU9ewpGKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj10aGlzLmI7cy5GKCk7KWlmKEgub1Qoci4k
-MShzLmdsKCkpKSlyZXR1cm4hMApyZXR1cm4hMX0sCmdsKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0KSC5B
-TS5wcm90b3R5cGU9ewplUihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguQU0odGhpcy5h
-LHRoaXMuYitiLEguTGgodGhpcykuQygiQU08MT4iKSl9LApnbShhKXtyZXR1cm4gbmV3IEguVTEoSi5J
-VCh0aGlzLmEpLHRoaXMuYixILkxoKHRoaXMpLkMoIlUxPDE+IikpfX0KSC5kNS5wcm90b3R5cGU9ewpn
-QShhKXt2YXIgcz1KLkhtKHRoaXMuYSktdGhpcy5iCmlmKHM+PTApcmV0dXJuIHMKcmV0dXJuIDB9LApl
-UihhLGIpe1AuazEoYiwiY291bnQiKQpyZXR1cm4gbmV3IEguZDUodGhpcy5hLHRoaXMuYitiLHRoaXMu
-JHRpKX0sCiRpYlE6MX0KSC5VMS5wcm90b3R5cGU9ewpGKCl7dmFyIHMscgpmb3Iocz10aGlzLmEscj0w
-O3I8dGhpcy5iOysrcilzLkYoKQp0aGlzLmI9MApyZXR1cm4gcy5GKCl9LApnbCgpe3JldHVybiB0aGlz
-LmEuZ2woKX19CkguTUIucHJvdG90eXBlPXsKZ20oYSl7cmV0dXJuIEMuR3d9LApnbDAoYSl7cmV0dXJu
-ITB9LApnQShhKXtyZXR1cm4gMH0sCkUoYSxiKXt0aHJvdyBILmIoUC5URShiLDAsMCwiaW5kZXgiLG51
-bGwpKX0sCmVSKGEsYil7UC5rMShiLCJjb3VudCIpCnJldHVybiB0aGlzfX0KSC5GdS5wcm90b3R5cGU9
-ewpGKCl7cmV0dXJuITF9LApnbCgpe3Rocm93IEguYihILldwKCkpfSwKJGlBbjoxfQpILnU2LnByb3Rv
-dHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5KQihKLklUKHRoaXMuYSksdGhpcy4kdGkuQygiSkI8MT4i
-KSl9fQpILkpCLnByb3RvdHlwZT17CkYoKXt2YXIgcyxyCmZvcihzPXRoaXMuYSxyPXRoaXMuJHRpLmM7
-cy5GKCk7KWlmKHIuYihzLmdsKCkpKXJldHVybiEwCnJldHVybiExfSwKZ2woKXtyZXR1cm4gdGhpcy4k
-dGkuYy5hKHRoaXMuYS5nbCgpKX0sCiRpQW46MX0KSC5TVS5wcm90b3R5cGU9e30KSC5SZS5wcm90b3R5
-cGU9ewpZNShhLGIsYyl7SC5MaCh0aGlzKS5DKCJSZS5FIikuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fu
-bm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpKX19CkgudzIucHJvdG90eXBlPXt9Ckgud3Yu
-cHJvdG90eXBlPXsKZ2lPKGEpe3ZhciBzPXRoaXMuX2hhc2hDb2RlCmlmKHMhPW51bGwpcmV0dXJuIHMK
-cz02NjQ1OTcqSi5oZih0aGlzLmEpJjUzNjg3MDkxMQp0aGlzLl9oYXNoQ29kZT1zCnJldHVybiBzfSwK
-dyhhKXtyZXR1cm4nU3ltYm9sKCInK0guRWoodGhpcy5hKSsnIiknfSwKRE4oYSxiKXtpZihiPT1udWxs
-KXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgSC53diYmdGhpcy5hPT1iLmF9LAokaUdEOjF9Ckgu
-UUMucHJvdG90eXBlPXt9CkguUEQucHJvdG90eXBlPXt9CkguV1UucHJvdG90eXBlPXsKZ2wwKGEpe3Jl
-dHVybiB0aGlzLmdBKHRoaXMpPT09MH0sCncoYSl7cmV0dXJuIFAubk8odGhpcyl9LApZNShhLGIsYyl7
-dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpzLlFbMV0uYShjKQpILmRjKCl9LApnUHUoYSl7cmV0dXJu
-IHRoaXMucTQoMCxILkxoKHRoaXMpLkMoIk4zPDEsMj4iKSl9LApxNChhLGIpe3ZhciBzPXRoaXMKcmV0
-dXJuIFAubDAoZnVuY3Rpb24oKXt2YXIgcj1hCnZhciBxPTAscD0xLG8sbixtLGwsawpyZXR1cm4gZnVu
-Y3Rpb24gJGFzeW5jJGdQdShjLGQpe2lmKGM9PT0xKXtvPWQKcT1wfXdoaWxlKHRydWUpc3dpdGNoKHEp
-e2Nhc2UgMDpuPXMuZ3ZjKCksbj1uLmdtKG4pLG09SC5MaChzKSxsPW0uUVsxXSxtPW0uQygiQDwxPiIp
-LktxKGwpLkMoIk4zPDEsMj4iKQpjYXNlIDI6aWYoIW4uRigpKXtxPTMKYnJlYWt9az1uLmdsKCkKcT00
-CnJldHVybiBuZXcgUC5OMyhrLGwuYShzLnEoMCxrKSksbSkKY2FzZSA0OnE9MgpicmVhawpjYXNlIDM6
-cmV0dXJuIFAuVGgoKQpjYXNlIDE6cmV0dXJuIFAuWW0obyl9fX0sYil9LAokaVowOjF9CkguTFAucHJv
-dG90eXBlPXsKZ0EoYSl7cmV0dXJuIHRoaXMuYX0sCng0KGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIily
-ZXR1cm4hMQppZigiX19wcm90b19fIj09PWEpcmV0dXJuITEKcmV0dXJuIHRoaXMuYi5oYXNPd25Qcm9w
-ZXJ0eShhKX0sCnEoYSxiKXtpZighdGhpcy54NChiKSlyZXR1cm4gbnVsbApyZXR1cm4gdGhpcy5iW0gu
-bihiKV19LApLKGEsYil7dmFyIHMscixxLHAsbyxuPXRoaXMuJHRpCm4uQygifigxLDIpIikuYShiKQpz
-PXRoaXMuYwpmb3Iocj1zLmxlbmd0aCxxPXRoaXMuYixuPW4uUVsxXSxwPTA7cDxyOysrcCl7bz1ILm4o
-c1twXSkKYi4kMihvLG4uYShxW29dKSl9fSwKZ3ZjKCl7cmV0dXJuIG5ldyBILlhSKHRoaXMsdGhpcy4k
-dGkuQygiWFI8MT4iKSl9fQpILlhSLnByb3RvdHlwZT17CmdtKGEpe3ZhciBzPXRoaXMuYS5jCnJldHVy
-biBuZXcgSi5tMShzLHMubGVuZ3RoLEgudDYocykuQygibTE8MT4iKSl9LApnQShhKXtyZXR1cm4gdGhp
-cy5hLmMubGVuZ3RofX0KSC5MSS5wcm90b3R5cGU9ewpnV2EoKXt2YXIgcz10aGlzLmEKcmV0dXJuIHN9
-LApnbmQoKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby5jPT09MSlyZXR1cm4gQy5oVQpzPW8uZApyPXMu
-bGVuZ3RoLW8uZS5sZW5ndGgtby5mCmlmKHI9PT0wKXJldHVybiBDLmhVCnE9W10KZm9yKHA9MDtwPHI7
-KytwKXtpZihwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHApCnEucHVzaChzW3BdKX1yZXR1cm4gSi56
-QyhxKX0sCmdWbSgpe3ZhciBzLHIscSxwLG8sbixtLGwsaz10aGlzCmlmKGsuYyE9PTApcmV0dXJuIEMu
-V08Kcz1rLmUKcj1zLmxlbmd0aApxPWsuZApwPXEubGVuZ3RoLXItay5mCmlmKHI9PT0wKXJldHVybiBD
-LldPCm89bmV3IEguTjUodC5lbykKZm9yKG49MDtuPHI7KytuKXtpZihuPj1zLmxlbmd0aClyZXR1cm4g
-SC5PSChzLG4pCm09c1tuXQpsPXArbgppZihsPDB8fGw+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsbCkK
-by5ZNSgwLG5ldyBILnd2KG0pLHFbbF0pfXJldHVybiBuZXcgSC5QRChvLHQuZ0YpfSwKJGl2UToxfQpI
-LkNqLnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMKSC5uKGEpCnM9dGhpcy5hCnMuYj1zLmIrIiQiK2EK
-Qy5ObS5pKHRoaXMuYixhKQpDLk5tLmkodGhpcy5jLGIpOysrcy5hfSwKJFM6MTF9CkguZjkucHJvdG90
-eXBlPXsKcVMoYSl7dmFyIHMscixxPXRoaXMscD1uZXcgUmVnRXhwKHEuYSkuZXhlYyhhKQppZihwPT1u
-dWxsKXJldHVybiBudWxsCnM9T2JqZWN0LmNyZWF0ZShudWxsKQpyPXEuYgppZihyIT09LTEpcy5hcmd1
-bWVudHM9cFtyKzFdCnI9cS5jCmlmKHIhPT0tMSlzLmFyZ3VtZW50c0V4cHI9cFtyKzFdCnI9cS5kCmlm
-KHIhPT0tMSlzLmV4cHI9cFtyKzFdCnI9cS5lCmlmKHIhPT0tMSlzLm1ldGhvZD1wW3IrMV0Kcj1xLmYK
-aWYociE9PS0xKXMucmVjZWl2ZXI9cFtyKzFdCnJldHVybiBzfX0KSC5XMC5wcm90b3R5cGU9ewp3KGEp
-e3ZhciBzPXRoaXMuYgppZihzPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIit0aGlzLmEK
-cmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIitzKyInIG9uIG51bGwi
-fX0KSC5hei5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHI9dGhpcyxxPSJOb1N1Y2hNZXRob2RFcnJvcjog
-bWV0aG9kIG5vdCBmb3VuZDogJyIscD1yLmIKaWYocD09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJy
-b3I6ICIrci5hCnM9ci5jCmlmKHM9PW51bGwpcmV0dXJuIHErcCsiJyAoIityLmErIikiCnJldHVybiBx
-K3ArIicgb24gJyIrcysiJyAoIityLmErIikifX0KSC52Vi5wcm90b3R5cGU9ewp3KGEpe3ZhciBzPXRo
-aXMuYQpyZXR1cm4gcy5sZW5ndGg9PT0wPyJFcnJvciI6IkVycm9yOiAiK3N9fQpILnRlLnByb3RvdHlw
-ZT17CncoYSl7cmV0dXJuIlRocm93IG9mIG51bGwgKCciKyh0aGlzLmE9PT1udWxsPyJudWxsIjoidW5k
-ZWZpbmVkIikrIicgZnJvbSBKYXZhU2NyaXB0KSJ9LAokaVJ6OjF9CkguYnEucHJvdG90eXBlPXt9Ckgu
-WE8ucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyPXRoaXMuYgppZihyIT1udWxsKXJldHVybiByCnI9dGhp
-cy5hCnM9ciE9PW51bGwmJnR5cGVvZiByPT09Im9iamVjdCI/ci5zdGFjazpudWxsCnJldHVybiB0aGlz
-LmI9cz09bnVsbD8iIjpzfSwKJGlHejoxfQpILlRwLnByb3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy5j
-b25zdHJ1Y3RvcixyPXM9PW51bGw/bnVsbDpzLm5hbWUKcmV0dXJuIkNsb3N1cmUgJyIrSC5OUShyPT1u
-dWxsPyJ1bmtub3duIjpyKSsiJyJ9LAokaUVIOjEsCmdLdSgpe3JldHVybiB0aGlzfSwKJEM6IiQxIiwK
-JFI6MSwKJEQ6bnVsbH0KSC5BeS5wcm90b3R5cGU9eyRDOiIkMCIsJFI6MH0KSC5FMS5wcm90b3R5cGU9
-eyRDOiIkMiIsJFI6Mn0KSC5sYy5wcm90b3R5cGU9e30KSC56eC5wcm90b3R5cGU9ewp3KGEpe3ZhciBz
-PXRoaXMuJHN0YXRpY19uYW1lCmlmKHM9PW51bGwpcmV0dXJuIkNsb3N1cmUgb2YgdW5rbm93biBzdGF0
-aWMgbWV0aG9kIgpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHMpKyInIn19CkguclQucHJvdG90eXBlPXsK
-RE4oYSxiKXtpZihiPT1udWxsKXJldHVybiExCmlmKHRoaXM9PT1iKXJldHVybiEwCmlmKCEoYiBpbnN0
-YW5jZW9mIEguclQpKXJldHVybiExCnJldHVybiB0aGlzLiRfdGFyZ2V0PT09Yi4kX3RhcmdldCYmdGhp
-cy5hPT09Yi5hfSwKZ2lPKGEpe3JldHVybihILkNVKHRoaXMuYSleSC5lUSh0aGlzLiRfdGFyZ2V0KSk+
-Pj4wfSwKdyhhKXtyZXR1cm4iQ2xvc3VyZSAnIit0aGlzLiRfbmFtZSsiJyBvZiAiKygiSW5zdGFuY2Ug
-b2YgJyIrSC5saCh0LksuYSh0aGlzLmEpKSsiJyIpfX0KSC5FcS5wcm90b3R5cGU9ewp3KGEpe3JldHVy
-biJSdW50aW1lRXJyb3I6ICIrdGhpcy5hfX0KSC5rWS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJBc3Nl
-cnRpb24gZmFpbGVkOiAiK1AuaGwodGhpcy5hKX19Ckgua3IucHJvdG90eXBlPXt9CkguTjUucHJvdG90
-eXBlPXsKZ0EoYSl7cmV0dXJuIHRoaXMuYX0sCmdsMChhKXtyZXR1cm4gdGhpcy5hPT09MH0sCmdvcihh
-KXtyZXR1cm4hdGhpcy5nbDAodGhpcyl9LApndmMoKXtyZXR1cm4gbmV3IEguaTUodGhpcyxILkxoKHRo
-aXMpLkMoImk1PDE+IikpfSwKeDQoYSl7dmFyIHM9dGhpcy5iCmlmKHM9PW51bGwpcmV0dXJuITEKcmV0
-dXJuIHRoaXMuWHUocyxhKX0sCnEoYSxiKXt2YXIgcyxyLHEscCxvPXRoaXMsbj1udWxsCmlmKHR5cGVv
-ZiBiPT0ic3RyaW5nIil7cz1vLmIKaWYocz09bnVsbClyZXR1cm4gbgpyPW8uajIocyxiKQpxPXI9PW51
-bGw/bjpyLmIKcmV0dXJuIHF9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2ZmZmZmZik9
-PT1iKXtwPW8uYwppZihwPT1udWxsKXJldHVybiBuCnI9by5qMihwLGIpCnE9cj09bnVsbD9uOnIuYgpy
-ZXR1cm4gcX1lbHNlIHJldHVybiBvLmFhKGIpfSwKYWEoYSl7dmFyIHMscixxPXRoaXMscD1xLmQKaWYo
-cD09bnVsbClyZXR1cm4gbnVsbApzPXEuQnQocCxxLnhpKGEpKQpyPXEuRmgocyxhKQppZihyPDApcmV0
-dXJuIG51bGwKcmV0dXJuIHNbcl0uYn0sClk1KGEsYixjKXt2YXIgcyxyLHE9dGhpcyxwPUguTGgocSkK
-cC5jLmEoYikKcC5RWzFdLmEoYykKaWYodHlwZW9mIGI9PSJzdHJpbmciKXtzPXEuYgpxLkVIKHM9PW51
-bGw/cS5iPXEueksoKTpzLGIsYyl9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2ZmZmZm
-Zik9PT1iKXtyPXEuYwpxLkVIKHI9PW51bGw/cS5jPXEueksoKTpyLGIsYyl9ZWxzZSBxLnh3KGIsYyl9
-LAp4dyhhLGIpe3ZhciBzLHIscSxwLG89dGhpcyxuPUguTGgobykKbi5jLmEoYSkKbi5RWzFdLmEoYikK
-cz1vLmQKaWYocz09bnVsbClzPW8uZD1vLnpLKCkKcj1vLnhpKGEpCnE9by5CdChzLHIpCmlmKHE9PW51
-bGwpby5FSShzLHIsW28uSG4oYSxiKV0pCmVsc2V7cD1vLkZoKHEsYSkKaWYocD49MClxW3BdLmI9Ygpl
-bHNlIHEucHVzaChvLkhuKGEsYikpfX0sCksoYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLkMoIn4o
-MSwyKSIpLmEoYikKcz1xLmUKcj1xLnIKZm9yKDtzIT1udWxsOyl7Yi4kMihzLmEscy5iKQppZihyIT09
-cS5yKXRocm93IEguYihQLmE0KHEpKQpzPXMuY319LApFSChhLGIsYyl7dmFyIHMscj10aGlzLHE9SC5M
-aChyKQpxLmMuYShiKQpxLlFbMV0uYShjKQpzPXIuajIoYSxiKQppZihzPT1udWxsKXIuRUkoYSxiLHIu
-SG4oYixjKSkKZWxzZSBzLmI9Y30sCmtzKCl7dGhpcy5yPXRoaXMucisxJjY3MTA4ODYzfSwKSG4oYSxi
-KXt2YXIgcz10aGlzLHI9SC5MaChzKSxxPW5ldyBILnZoKHIuYy5hKGEpLHIuUVsxXS5hKGIpKQppZihz
-LmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7cj1zLmYKci50b1N0cmluZwpxLmQ9cgpzLmY9ci5jPXF9Kytz
-LmEKcy5rcygpCnJldHVybiBxfSwKeGkoYSl7cmV0dXJuIEouaGYoYSkmMHgzZmZmZmZmfSwKRmgoYSxi
-KXt2YXIgcyxyCmlmKGE9PW51bGwpcmV0dXJuLTEKcz1hLmxlbmd0aApmb3Iocj0wO3I8czsrK3IpaWYo
-Si5STShhW3JdLmEsYikpcmV0dXJuIHIKcmV0dXJuLTF9LAp3KGEpe3JldHVybiBQLm5PKHRoaXMpfSwK
-ajIoYSxiKXtyZXR1cm4gYVtiXX0sCkJ0KGEsYil7cmV0dXJuIGFbYl19LApFSShhLGIsYyl7YVtiXT1j
-fSwKcm4oYSxiKXtkZWxldGUgYVtiXX0sClh1KGEsYil7cmV0dXJuIHRoaXMuajIoYSxiKSE9bnVsbH0s
-CnpLKCl7dmFyIHM9Ijxub24taWRlbnRpZmllci1rZXk+IixyPU9iamVjdC5jcmVhdGUobnVsbCkKdGhp
-cy5FSShyLHMscikKdGhpcy5ybihyLHMpCnJldHVybiByfSwKJGlGbzoxfQpILnZoLnByb3RvdHlwZT17
-fQpILmk1LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlzLmEuYX0sCmdsMChhKXtyZXR1cm4gdGhp
-cy5hLmE9PT0wfSwKZ20oYSl7dmFyIHM9dGhpcy5hLHI9bmV3IEguTjYocyxzLnIsdGhpcy4kdGkuQygi
-TjY8MT4iKSkKci5jPXMuZQpyZXR1cm4gcn0sCnRnKGEsYil7cmV0dXJuIHRoaXMuYS54NChiKX19Ckgu
-TjYucHJvdG90eXBlPXsKZ2woKXtyZXR1cm4gdGhpcy5kfSwKRigpe3ZhciBzLHI9dGhpcyxxPXIuYQpp
-ZihyLmIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM9PW51bGwpe3Iuc3FZKG51bGwp
-CnJldHVybiExfWVsc2V7ci5zcVkocy5hKQpyLmM9cy5jCnJldHVybiEwfX0sCnNxWShhKXt0aGlzLmQ9
-dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmRDLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
-biB0aGlzLmEoYSl9LAokUzo0fQpILndOLnByb3RvdHlwZT17CiQyKGEsYil7cmV0dXJuIHRoaXMuYShh
-LGIpfSwKJFM6NTB9CkguVlgucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIHRoaXMuYShILm4oYSkpfSwK
-JFM6MjF9CkguVlIucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0aGlz
-LmIuZmxhZ3N9LApnSGMoKXt2YXIgcz10aGlzLHI9cy5jCmlmKHIhPW51bGwpcmV0dXJuIHIKcj1zLmIK
-cmV0dXJuIHMuYz1ILnY0KHMuYSxyLm11bHRpbGluZSwhci5pZ25vcmVDYXNlLHIudW5pY29kZSxyLmRv
-dEFsbCwhMCl9LApkZChhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlzLGIsMCl9LApVWihhLGIpe3ZhciBz
-LHI9dC5LLmEodGhpcy5nSGMoKSkKci5sYXN0SW5kZXg9YgpzPXIuZXhlYyhhKQppZihzPT1udWxsKXJl
-dHVybiBudWxsCnJldHVybiBuZXcgSC5FSyhzKX0sCiRpdlg6MSwKJGl3TDoxfQpILkVLLnByb3RvdHlw
-ZT17CnEoYSxiKXt2YXIgcwpILklaKGIpCnM9dGhpcy5iCmlmKGI+PXMubGVuZ3RoKXJldHVybiBILk9I
-KHMsYikKcmV0dXJuIHNbYl19LAokaU9kOjEsCiRpaWI6MX0KSC5LVy5wcm90b3R5cGU9ewpnbShhKXty
-ZXR1cm4gbmV3IEguUGIodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5QYi5wcm90b3R5cGU9ewpnbCgp
-e3JldHVybiB0LmN6LmEodGhpcy5kKX0sCkYoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bS5iCmlm
-KGw9PW51bGwpcmV0dXJuITEKcz1tLmMKcj1sLmxlbmd0aAppZihzPD1yKXtxPW0uYQpwPXEuVVoobCxz
-KQppZihwIT1udWxsKXttLmQ9cApzPXAuYgpvPXMuaW5kZXgKbj1vK3NbMF0ubGVuZ3RoCmlmKG89PT1u
-KXtpZihxLmIudW5pY29kZSl7cz1tLmMKcT1zKzEKaWYocTxyKXtzPUMueEIuTyhsLHMpCmlmKHM+PTU1
-Mjk2JiZzPD01NjMxOSl7cz1DLnhCLk8obCxxKQpzPXM+PTU2MzIwJiZzPD01NzM0M31lbHNlIHM9ITF9
-ZWxzZSBzPSExfWVsc2Ugcz0hMQpuPShzP24rMTpuKSsxfW0uYz1uCnJldHVybiEwfX1tLmI9bS5kPW51
-bGwKcmV0dXJuITF9LAokaUFuOjF9CkgudFEucHJvdG90eXBlPXsKcShhLGIpe0guSVooYikKaWYoYiE9
-PTApSC52KFAuTzcoYixudWxsKSkKcmV0dXJuIHRoaXMuY30sCiRpT2Q6MX0KSC51bi5wcm90b3R5cGU9
-ewpnbShhKXtyZXR1cm4gbmV3IEguU2QodGhpcy5hLHRoaXMuYix0aGlzLmMpfX0KSC5TZC5wcm90b3R5
-cGU9ewpGKCl7dmFyIHMscixxPXRoaXMscD1xLmMsbz1xLmIsbj1vLmxlbmd0aCxtPXEuYSxsPW0ubGVu
-Z3RoCmlmKHArbj5sKXtxLmQ9bnVsbApyZXR1cm4hMX1zPW0uaW5kZXhPZihvLHApCmlmKHM8MCl7cS5j
-PWwrMQpxLmQ9bnVsbApyZXR1cm4hMX1yPXMrbgpxLmQ9bmV3IEgudFEocyxvKQpxLmM9cj09PXEuYz9y
-KzE6cgpyZXR1cm4hMH0sCmdsKCl7dmFyIHM9dGhpcy5kCnMudG9TdHJpbmcKcmV0dXJuIHN9LAokaUFu
-OjF9CkguRVQucHJvdG90eXBlPXskaUVUOjEsJGlBUzoxfQpILkxaLnByb3RvdHlwZT17CmdBKGEpe3Jl
-dHVybiBhLmxlbmd0aH0sCiRpWGo6MX0KSC5EZy5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9k
-KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LApZNShhLGIsYyl7SC5yVihjKQpILm9kKGIsYSxhLmxl
-bmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KSC5QZy5wcm90b3R5cGU9ewpZNShh
-LGIsYyl7SC5JWihjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGliUToxLAokaWNYOjEsCiRp
-ek06MX0KSC54ai5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0
-dXJuIGFbYl19fQpILmRFLnByb3RvdHlwZT17CnEoYSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3Ro
-KQpyZXR1cm4gYVtiXX19CkguWkEucHJvdG90eXBlPXsKcShhLGIpe0guSVooYikKSC5vZChiLGEsYS5s
-ZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kVC5wcm90b3R5cGU9ewpxKGEsYil7SC5JWihiKQpILm9kKGIs
-YSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlBxLnByb3RvdHlwZT17CnEoYSxiKXtILklaKGIpCkgu
-b2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZUUucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJu
-IGEubGVuZ3RofSwKcShhLGIpe0guSVooYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0K
-SC5WNi5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9LApxKGEsYil7SC5JWihiKQpILm9k
-KGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19LAokaW42OjF9CkguUkcucHJvdG90eXBlPXt9CkguVlAu
-cHJvdG90eXBlPXt9CkguV0IucHJvdG90eXBlPXt9CkguWkcucHJvdG90eXBlPXt9CkguSmMucHJvdG90
-eXBlPXsKQyhhKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfSwKS3EoYSl7cmV0dXJu
-IEgudjUodi50eXBlVW5pdmVyc2UsdGhpcyxhKX19CkguRy5wcm90b3R5cGU9e30KSC5rUy5wcm90b3R5
-cGU9ewp3KGEpe3JldHVybiB0aGlzLmF9fQpILmlNLnByb3RvdHlwZT17JGlFejoxfQpQLnRoLnByb3Rv
-dHlwZT17CiQxKGEpe3ZhciBzPXRoaXMuYSxyPXMuYQpzLmE9bnVsbApyLiQwKCl9LAokUzoxM30KUC5o
-YS5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyCnRoaXMuYS5hPXQuTS5hKGEpCnM9dGhpcy5iCnI9dGhp
-cy5jCnMuZmlyc3RDaGlsZD9zLnJlbW92ZUNoaWxkKHIpOnMuYXBwZW5kQ2hpbGQocil9LAokUzo0MX0K
-UC5Wcy5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS4kMCgpfSwKJFM6MTV9ClAuRnQucHJvdG90eXBlPXsK
-JDAoKXt0aGlzLmEuJDAoKX0sCiRTOjE1fQpQLlczLnByb3RvdHlwZT17CkNZKGEsYil7aWYoc2VsZi5z
-ZXRUaW1lb3V0IT1udWxsKXNlbGYuc2V0VGltZW91dChILnRSKG5ldyBQLnlIKHRoaXMsYiksMCksYSkK
-ZWxzZSB0aHJvdyBILmIoUC5MNCgiYHNldFRpbWVvdXQoKWAgbm90IGZvdW5kLiIpKX19ClAueUgucHJv
-dG90eXBlPXsKJDAoKXt0aGlzLmIuJDAoKX0sCiRTOjB9ClAuaWgucHJvdG90eXBlPXsKYU0oYSxiKXt2
-YXIgcyxyPXRoaXMscT1yLiR0aQpxLkMoIjEvPyIpLmEoYikKaWYoYj09bnVsbCliPXEuYy5hKGIpCmlm
-KCFyLmIpci5hLlhmKGIpCmVsc2V7cz1yLmEKaWYocS5DKCJiODwxPiIpLmIoYikpcy5jVShiKQplbHNl
-IHMuWDIocS5jLmEoYikpfX0sCncwKGEsYil7dmFyIHM9dGhpcy5hCmlmKHRoaXMuYilzLlpMKGEsYikK
-ZWxzZSBzLk5rKGEsYil9fQpQLldNLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0aGlzLmEuJDIoMCxh
-KX0sCiRTOjUxfQpQLlNYLnByb3RvdHlwZT17CiQyKGEsYil7dGhpcy5hLiQyKDEsbmV3IEguYnEoYSx0
-LmwuYShiKSkpfSwKJFM6NTN9ClAuR3MucHJvdG90eXBlPXsKJDIoYSxiKXt0aGlzLmEoSC5JWihhKSxi
-KX0sCiRTOjQ1fQpQLkZ5LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIkl0ZXJhdGlvbk1hcmtlcigiK3Ro
-aXMuYisiLCAiK0guRWoodGhpcy5hKSsiKSJ9fQpQLkdWLnByb3RvdHlwZT17CmdsKCl7dmFyIHM9dGhp
-cy5jCmlmKHM9PW51bGwpcmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLmIpCnJldHVybiBzLmdsKCl9LApG
-KCl7dmFyIHMscixxLHAsbyxuLG09dGhpcwpmb3Iocz1tLiR0aS5DKCJBbjwxPiIpOyEwOyl7cj1tLmMK
-aWYociE9bnVsbClpZihyLkYoKSlyZXR1cm4hMAplbHNlIG0uc1g5KG51bGwpCnE9ZnVuY3Rpb24oYSxi
-LGMpe3ZhciBsLGs9Ygp3aGlsZSh0cnVlKXRyeXtyZXR1cm4gYShrLGwpfWNhdGNoKGope2w9agprPWN9
-fShtLmEsMCwxKQppZihxIGluc3RhbmNlb2YgUC5GeSl7cD1xLmIKaWYocD09PTIpe289bS5kCmlmKG89
-PW51bGx8fG8ubGVuZ3RoPT09MCl7bS5zRUMobnVsbCkKcmV0dXJuITF9aWYoMD49by5sZW5ndGgpcmV0
-dXJuIEguT0gobywtMSkKbS5hPW8ucG9wKCkKY29udGludWV9ZWxzZXtyPXEuYQppZihwPT09Myl0aHJv
-dyByCmVsc2V7bj1zLmEoSi5JVChyKSkKaWYobiBpbnN0YW5jZW9mIFAuR1Ype3I9bS5kCmlmKHI9PW51
-bGwpcj1tLmQ9W10KQy5ObS5pKHIsbS5hKQptLmE9bi5hCmNvbnRpbnVlfWVsc2V7bS5zWDkobikKY29u
-dGludWV9fX19ZWxzZXttLnNFQyhxKQpyZXR1cm4hMH19cmV0dXJuITF9LApzRUMoYSl7dGhpcy5iPXRo
-aXMuJHRpLkMoIjE/IikuYShhKX0sCnNYOShhKXt0aGlzLmM9dGhpcy4kdGkuQygiQW48MT4/IikuYShh
-KX0sCiRpQW46MX0KUC5xNC5wcm90b3R5cGU9ewpnbShhKXtyZXR1cm4gbmV3IFAuR1YodGhpcy5hKCks
-dGhpcy4kdGkuQygiR1Y8MT4iKSl9fQpQLkN3LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIEguRWoodGhp
-cy5hKX0sCiRpWFM6MSwKZ0lJKCl7cmV0dXJuIHRoaXMuYn19ClAuUGYucHJvdG90eXBlPXsKdzAoYSxi
-KXt2YXIgcwpILmNiKGEsImVycm9yIix0LkspCnM9dGhpcy5hCmlmKChzLmEmMzApIT09MCl0aHJvdyBI
-LmIoUC5QVigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCmlmKGI9PW51bGwpYj1QLnYwKGEpCnMu
-TmsoYSxiKX0sCnBtKGEpe3JldHVybiB0aGlzLncwKGEsbnVsbCl9fQpQLlpmLnByb3RvdHlwZT17CmFN
-KGEsYil7dmFyIHMscj10aGlzLiR0aQpyLkMoIjEvPyIpLmEoYikKcz10aGlzLmEKaWYoKHMuYSYzMCkh
-PT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKcy5YZihyLkMoIjEv
-IikuYShiKSl9fQpQLkZlLnByb3RvdHlwZT17CkhSKGEpe2lmKCh0aGlzLmMmMTUpIT09NilyZXR1cm4h
-MApyZXR1cm4gdGhpcy5iLmIuYnYodC5hbC5hKHRoaXMuZCksYS5hLHQueSx0LkspfSwKS3coYSl7dmFy
-IHMscj10aGlzLHE9ci5lLHA9bnVsbCxvPXQueixuPXQuSyxtPWEuYSxsPXIuYi5iCmlmKHQuYS5iKHEp
-KXA9bC5ycChxLG0sYS5iLG8sbix0LmwpCmVsc2UgcD1sLmJ2KHQudi5hKHEpLG0sbyxuKQp0cnl7bz1y
-LiR0aS5DKCIyLyIpLmEocCkKcmV0dXJuIG99Y2F0Y2gocyl7aWYodC5lSy5iKEguUnUocykpKXtpZigo
-ci5jJjEpIT09MCl0aHJvdyBILmIoUC54WSgiVGhlIGVycm9yIGhhbmRsZXIgb2YgRnV0dXJlLnRoZW4g
-bXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgcmV0dXJuZWQgZnV0dXJlJ3MgdHlwZSIsIm9uRXJyb3Ii
-KSkKdGhyb3cgSC5iKFAueFkoIlRoZSBlcnJvciBoYW5kbGVyIG9mIEZ1dHVyZS5jYXRjaEVycm9yIG11
-c3QgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGZ1dHVyZSdzIHR5cGUiLCJvbkVycm9yIikpfWVsc2UgdGhy
-b3cgc319fQpQLnZzLnByb3RvdHlwZT17ClNxKGEsYixjKXt2YXIgcyxyLHEscD10aGlzLiR0aQpwLktx
-KGMpLkMoIjEvKDIpIikuYShhKQpzPSQuWDMKaWYocz09PUMuTlUpe2lmKGIhPW51bGwmJiF0LmEuYihi
-KSYmIXQudi5iKGIpKXRocm93IEguYihQLkwzKGIsIm9uRXJyb3IiLHUuYykpfWVsc2V7Yy5DKCJAPDAv
-PiIpLktxKHAuYykuQygiMSgyKSIpLmEoYSkKaWYoYiE9bnVsbCliPVAuVkgoYixzKX1yPW5ldyBQLnZz
-KHMsYy5DKCJ2czwwPiIpKQpxPWI9PW51bGw/MTozCnRoaXMueGYobmV3IFAuRmUocixxLGEsYixwLkMo
-IkA8MT4iKS5LcShjKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gcn0sClc3KGEsYil7cmV0dXJuIHRoaXMu
-U3EoYSxudWxsLGIpfSwKUWQoYSxiLGMpe3ZhciBzLHI9dGhpcy4kdGkKci5LcShjKS5DKCIxLygyKSIp
-LmEoYSkKcz1uZXcgUC52cygkLlgzLGMuQygidnM8MD4iKSkKdGhpcy54ZihuZXcgUC5GZShzLDE5LGEs
-YixyLkMoIkA8MT4iKS5LcShjKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gc30sClA5KGEpe3RoaXMuYT10
-aGlzLmEmMXwxNgp0aGlzLmM9YX0sCnVnKGEpe3RoaXMuYT1hLmEmMzB8dGhpcy5hJjEKdGhpcy5jPWEu
-Y30sCnhmKGEpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihxPD0zKXthLmE9dC5lLmEoci5jKQpyLmM9YX1l
-bHNle2lmKChxJjQpIT09MCl7cz10LmMuYShyLmMpCmlmKChzLmEmMjQpPT09MCl7cy54ZihhKQpyZXR1
-cm59ci51ZyhzKX1QLlRrKG51bGwsbnVsbCxyLmIsdC5NLmEobmV3IFAuZGEocixhKSkpfX0sCmpRKGEp
-e3ZhciBzLHIscSxwLG8sbixtPXRoaXMsbD17fQpsLmE9YQppZihhPT1udWxsKXJldHVybgpzPW0uYQpp
-ZihzPD0zKXtyPXQuZS5hKG0uYykKbS5jPWEKaWYociE9bnVsbCl7cT1hLmEKZm9yKHA9YTtxIT1udWxs
-O3A9cSxxPW8pbz1xLmEKcC5hPXJ9fWVsc2V7aWYoKHMmNCkhPT0wKXtuPXQuYy5hKG0uYykKaWYoKG4u
-YSYyNCk9PT0wKXtuLmpRKGEpCnJldHVybn1tLnVnKG4pfWwuYT1tLk44KGEpClAuVGsobnVsbCxudWxs
-LG0uYix0Lk0uYShuZXcgUC5vUShsLG0pKSl9fSwKYWgoKXt2YXIgcz10LmUuYSh0aGlzLmMpCnRoaXMu
-Yz1udWxsCnJldHVybiB0aGlzLk44KHMpfSwKTjgoYSl7dmFyIHMscixxCmZvcihzPWEscj1udWxsO3Mh
-PW51bGw7cj1zLHM9cSl7cT1zLmEKcy5hPXJ9cmV0dXJuIHJ9LAplYyhhKXt2YXIgcyxyLHEscD10aGlz
-CnAuYV49Mgp0cnl7YS5TcShuZXcgUC5wVihwKSxuZXcgUC5VNyhwKSx0LlApfWNhdGNoKHEpe3M9SC5S
-dShxKQpyPUgudHMocSkKUC5yYihuZXcgUC52cihwLHMscikpfX0sClgyKGEpe3ZhciBzLHI9dGhpcwpy
-LiR0aS5jLmEoYSkKcz1yLmFoKCkKci5hPTgKci5jPWEKUC5IWihyLHMpfSwKWkwoYSxiKXt2YXIgcwp0
-LmwuYShiKQpzPXRoaXMuYWgoKQp0aGlzLlA5KFAuVGwoYSxiKSkKUC5IWih0aGlzLHMpfSwKWGYoYSl7
-dmFyIHM9dGhpcy4kdGkKcy5DKCIxLyIpLmEoYSkKaWYocy5DKCJiODwxPiIpLmIoYSkpe3RoaXMuY1Uo
-YSkKcmV0dXJufXRoaXMud1Uocy5jLmEoYSkpfSwKd1UoYSl7dmFyIHM9dGhpcwpzLiR0aS5jLmEoYSkK
-cy5hXj0yClAuVGsobnVsbCxudWxsLHMuYix0Lk0uYShuZXcgUC5ydChzLGEpKSl9LApjVShhKXt2YXIg
-cz10aGlzLHI9cy4kdGkKci5DKCJiODwxPiIpLmEoYSkKaWYoci5iKGEpKXtpZigoYS5hJjE2KSE9PTAp
-e3MuYV49MgpQLlRrKG51bGwsbnVsbCxzLmIsdC5NLmEobmV3IFAuS0YocyxhKSkpfWVsc2UgUC5BOShh
-LHMpCnJldHVybn1zLmVjKGEpfSwKTmsoYSxiKXt0aGlzLmFePTIKUC5UayhudWxsLG51bGwsdGhpcy5i
-LHQuTS5hKG5ldyBQLlpMKHRoaXMsYSxiKSkpfSwKJGliODoxfQpQLmRhLnByb3RvdHlwZT17CiQwKCl7
-UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRTOjB9ClAub1EucHJvdG90eXBlPXsKJDAoKXtQLkhaKHRoaXMu
-Yix0aGlzLmEuYSl9LAokUzowfQpQLnBWLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwPXRoaXMu
-YQpwLmFePTIKdHJ5e3AuWDIocC4kdGkuYy5hKGEpKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEp
-CnAuWkwocyxyKX19LAokUzoxM30KUC5VNy5wcm90b3R5cGU9ewokMihhLGIpe3RoaXMuYS5aTCh0Lksu
-YShhKSx0LmwuYShiKSl9LAokUzozNH0KUC52ci5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS5aTCh0aGlz
-LmIsdGhpcy5jKX0sCiRTOjB9ClAucnQucHJvdG90eXBlPXsKJDAoKXt0aGlzLmEuWDIodGhpcy5iKX0s
-CiRTOjB9ClAuS0YucHJvdG90eXBlPXsKJDAoKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5a
-TC5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9ClAuUlQucHJv
-dG90eXBlPXsKJDAoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9bnVsbAp0cnl7cT1tLmEuYQpsPXEu
-Yi5iLnp6KHQuZk8uYShxLmQpLHQueil9Y2F0Y2gocCl7cz1ILlJ1KHApCnI9SC50cyhwKQpxPW0uYyYm
-dC5uLmEobS5iLmEuYykuYT09PXMKbz1tLmEKaWYocSlvLmM9dC5uLmEobS5iLmEuYykKZWxzZSBvLmM9
-UC5UbChzLHIpCm8uYj0hMApyZXR1cm59aWYobCBpbnN0YW5jZW9mIFAudnMmJihsLmEmMjQpIT09MCl7
-aWYoKGwuYSYxNikhPT0wKXtxPW0uYQpxLmM9dC5uLmEobC5jKQpxLmI9ITB9cmV0dXJufWlmKHQuaS5i
-KGwpKXtuPW0uYi5hCnE9bS5hCnEuYz1sLlc3KG5ldyBQLmpaKG4pLHQueikKcS5iPSExfX0sCiRTOjB9
-ClAualoucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIHRoaXMuYX0sCiRTOjI5fQpQLnJxLnByb3RvdHlw
-ZT17CiQwKCl7dmFyIHMscixxLHAsbyxuLG0sbAp0cnl7cT10aGlzLmEKcD1xLmEKbz1wLiR0aQpuPW8u
-YwptPW4uYSh0aGlzLmIpCnEuYz1wLmIuYi5idihvLkMoIjIvKDEpIikuYShwLmQpLG0sby5DKCIyLyIp
-LG4pfWNhdGNoKGwpe3M9SC5SdShsKQpyPUgudHMobCkKcT10aGlzLmEKcS5jPVAuVGwocyxyKQpxLmI9
-ITB9fSwKJFM6MH0KUC5SVy5wcm90b3R5cGU9ewokMCgpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMKdHJ5
-e3M9dC5uLmEobS5hLmEuYykKcD1tLmIKaWYocC5hLkhSKHMpJiZwLmEuZSE9bnVsbCl7cC5jPXAuYS5L
-dyhzKQpwLmI9ITF9fWNhdGNoKG8pe3I9SC5SdShvKQpxPUgudHMobykKcD10Lm4uYShtLmEuYS5jKQpu
-PW0uYgppZihwLmE9PT1yKW4uYz1wCmVsc2Ugbi5jPVAuVGwocixxKQpuLmI9ITB9fSwKJFM6MH0KUC5P
-TS5wcm90b3R5cGU9e30KUC5xaC5wcm90b3R5cGU9ewpnQShhKXt2YXIgcyxyLHE9dGhpcyxwPXt9LG89
-bmV3IFAudnMoJC5YMyx0LmZKKQpwLmE9MApzPUguTGgocSkKcj1zLkMoIn4oMSk/IikuYShuZXcgUC5C
-NShwLHEpKQp0LlouYShuZXcgUC51TyhwLG8pKQpXLkpFKHEuYSxxLmIsciwhMSxzLmMpCnJldHVybiBv
-fX0KUC5CNS5wcm90b3R5cGU9ewokMShhKXtILkxoKHRoaXMuYikuYy5hKGEpOysrdGhpcy5hLmF9LAok
-Uygpe3JldHVybiBILkxoKHRoaXMuYikuQygifigxKSIpfX0KUC51Ty5wcm90b3R5cGU9ewokMCgpe3Zh
-ciBzPXRoaXMuYixyPXMuJHRpLHE9ci5DKCIxLyIpLmEodGhpcy5hLmEpLHA9cy5haCgpCnIuYy5hKHEp
-CnMuYT04CnMuYz1xClAuSFoocyxwKX0sCiRTOjB9ClAuTU8ucHJvdG90eXBlPXt9ClAua1QucHJvdG90
-eXBlPXt9ClAueEkucHJvdG90eXBlPXt9ClAubTAucHJvdG90eXBlPXskaVFtOjF9ClAuRXYucHJvdG90
-eXBlPXsKJDAoKXt2YXIgcz10LksuYShILmIodGhpcy5hKSkKcy5zdGFjaz10aGlzLmIudygwKQp0aHJv
-dyBzfSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpiSChhKXt2YXIgcyxyLHEscCxvCnQuTS5hKGEpCnRy
-eXtpZihDLk5VPT09JC5YMyl7YS4kMCgpCnJldHVybn1QLlQ4KG51bGwsbnVsbCx0aGlzLGEsdC5IKX1j
-YXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEpCnA9dC5LLmEocykKbz10LmwuYShyKQpQLlNpKHAsbyl9
-fSwKRGwoYSxiLGMpe3ZhciBzLHIscSxwLG8KYy5DKCJ+KDApIikuYShhKQpjLmEoYikKdHJ5e2lmKEMu
-TlU9PT0kLlgzKXthLiQxKGIpCnJldHVybn1QLnl2KG51bGwsbnVsbCx0aGlzLGEsYix0LkgsYyl9Y2F0
-Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpwPXQuSy5hKHMpCm89dC5sLmEocikKUC5TaShwLG8pfX0s
-CkdZKGEpe3JldHVybiBuZXcgUC5WcCh0aGlzLHQuTS5hKGEpKX0sClB5KGEsYil7cmV0dXJuIG5ldyBQ
-Lk9SKHRoaXMsYi5DKCJ+KDApIikuYShhKSxiKX0sCnEoYSxiKXtyZXR1cm4gbnVsbH0sCnp6KGEsYil7
-Yi5DKCIwKCkiKS5hKGEpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQwKCkKcmV0dXJuIFAuVDgobnVs
-bCxudWxsLHRoaXMsYSxiKX0sCmJ2KGEsYixjLGQpe2MuQygiQDwwPiIpLktxKGQpLkMoIjEoMikiKS5h
-KGEpCmQuYShiKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMShiKQpyZXR1cm4gUC55dihudWxsLG51
-bGwsdGhpcyxhLGIsYyxkKX0sCnJwKGEsYixjLGQsZSxmKXtkLkMoIkA8MD4iKS5LcShlKS5LcShmKS5D
-KCIxKDIsMykiKS5hKGEpCmUuYShiKQpmLmEoYykKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEuJDIoYixj
-KQpyZXR1cm4gUC5ReChudWxsLG51bGwsdGhpcyxhLGIsYyxkLGUsZil9LApMaihhLGIsYyxkKXtyZXR1
-cm4gYi5DKCJAPDA+IikuS3EoYykuS3EoZCkuQygiMSgyLDMpIikuYShhKX19ClAuVnAucHJvdG90eXBl
-PXsKJDAoKXtyZXR1cm4gdGhpcy5hLmJIKHRoaXMuYil9LAokUzowfQpQLk9SLnByb3RvdHlwZT17CiQx
-KGEpe3ZhciBzPXRoaXMuYwpyZXR1cm4gdGhpcy5hLkRsKHRoaXMuYixzLmEoYSkscyl9LAokUygpe3Jl
-dHVybiB0aGlzLmMuQygifigwKSIpfX0KUC5iNi5wcm90b3R5cGU9ewpnbShhKXt2YXIgcz10aGlzLHI9
-bmV3IFAubG0ocyxzLnIsSC5MaChzKS5DKCJsbTwxPiIpKQpyLmM9cy5lCnJldHVybiByfSwKZ0EoYSl7
-cmV0dXJuIHRoaXMuYX0sCmdsMChhKXtyZXR1cm4gdGhpcy5hPT09MH0sCmdvcihhKXtyZXR1cm4gdGhp
-cy5hIT09MH0sCnRnKGEsYil7dmFyIHMscgppZihiIT09Il9fcHJvdG9fXyIpe3M9dGhpcy5iCmlmKHM9
-PW51bGwpcmV0dXJuITEKcmV0dXJuIHQuZy5hKHNbYl0pIT1udWxsfWVsc2V7cj10aGlzLlBSKGIpCnJl
-dHVybiByfX0sClBSKGEpe3ZhciBzPXRoaXMuZAppZihzPT1udWxsKXJldHVybiExCnJldHVybiB0aGlz
-LkRGKHNbdGhpcy5OKGEpXSxhKT49MH0sCmkoYSxiKXt2YXIgcyxyLHE9dGhpcwpILkxoKHEpLmMuYShi
-KQppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7cz1xLmIKcmV0dXJuIHEuSihz
-PT1udWxsP3EuYj1QLlQyKCk6cyxiKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0
-MTgyMyk9PT1iKXtyPXEuYwpyZXR1cm4gcS5KKHI9PW51bGw/cS5jPVAuVDIoKTpyLGIpfWVsc2UgcmV0
-dXJuIHEuWShiKX0sClkoYSl7dmFyIHMscixxLHA9dGhpcwpILkxoKHApLmMuYShhKQpzPXAuZAppZihz
-PT1udWxsKXM9cC5kPVAuVDIoKQpyPXAuTihhKQpxPXNbcl0KaWYocT09bnVsbClzW3JdPVtwLnlvKGEp
-XQplbHNle2lmKHAuREYocSxhKT49MClyZXR1cm4hMQpxLnB1c2gocC55byhhKSl9cmV0dXJuITB9LApS
-KGEsYil7dmFyIHM9dGhpcwppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19wcm90b19fIilyZXR1
-cm4gcy5IKHMuYixiKQplbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1i
-KXJldHVybiBzLkgocy5jLGIpCmVsc2UgcmV0dXJuIHMucWcoYil9LApxZyhhKXt2YXIgcyxyLHEscCxv
-PXRoaXMsbj1vLmQKaWYobj09bnVsbClyZXR1cm4hMQpzPW8uTihhKQpyPW5bc10KcT1vLkRGKHIsYSkK
-aWYocTwwKXJldHVybiExCnA9ci5zcGxpY2UocSwxKVswXQppZigwPT09ci5sZW5ndGgpZGVsZXRlIG5b
-c10Kby5HKHApCnJldHVybiEwfSwKSihhLGIpe0guTGgodGhpcykuYy5hKGIpCmlmKHQuZy5hKGFbYl0p
-IT1udWxsKXJldHVybiExCmFbYl09dGhpcy55byhiKQpyZXR1cm4hMH0sCkgoYSxiKXt2YXIgcwppZihh
-PT1udWxsKXJldHVybiExCnM9dC5nLmEoYVtiXSkKaWYocz09bnVsbClyZXR1cm4hMQp0aGlzLkcocykK
-ZGVsZXRlIGFbYl0KcmV0dXJuITB9LApTKCl7dGhpcy5yPXRoaXMucisxJjEwNzM3NDE4MjN9LAp5byhh
-KXt2YXIgcyxyPXRoaXMscT1uZXcgUC5ibihILkxoKHIpLmMuYShhKSkKaWYoci5lPT1udWxsKXIuZT1y
-LmY9cQplbHNle3M9ci5mCnMudG9TdHJpbmcKcS5jPXMKci5mPXMuYj1xfSsrci5hCnIuUygpCnJldHVy
-biBxfSwKRyhhKXt2YXIgcz10aGlzLHI9YS5jLHE9YS5iCmlmKHI9PW51bGwpcy5lPXEKZWxzZSByLmI9
-cQppZihxPT1udWxsKXMuZj1yCmVsc2UgcS5jPXI7LS1zLmEKcy5TKCl9LApOKGEpe3JldHVybiBKLmhm
-KGEpJjEwNzM3NDE4MjN9LApERihhLGIpe3ZhciBzLHIKaWYoYT09bnVsbClyZXR1cm4tMQpzPWEubGVu
-Z3RoCmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxiKSlyZXR1cm4gcgpyZXR1cm4tMX19ClAu
-Ym4ucHJvdG90eXBlPXt9ClAubG0ucHJvdG90eXBlPXsKZ2woKXtyZXR1cm4gdGhpcy4kdGkuYy5hKHRo
-aXMuZCl9LApGKCl7dmFyIHM9dGhpcyxyPXMuYyxxPXMuYQppZihzLmIhPT1xLnIpdGhyb3cgSC5iKFAu
-YTQocSkpCmVsc2UgaWYocj09bnVsbCl7cy5zaihudWxsKQpyZXR1cm4hMX1lbHNle3Muc2oocy4kdGku
-QygiMT8iKS5hKHIuYSkpCnMuYz1yLmIKcmV0dXJuITB9fSwKc2ooYSl7dGhpcy5kPXRoaXMuJHRpLkMo
-IjE/IikuYShhKX0sCiRpQW46MX0KUC5tVy5wcm90b3R5cGU9e30KUC51eS5wcm90b3R5cGU9eyRpYlE6
-MSwkaWNYOjEsJGl6TToxfQpQLmxELnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5hNyhhLHRo
-aXMuZ0EoYSksSC56SyhhKS5DKCJhNzxsRC5FPiIpKX0sCkUoYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9
-LApLKGEsYil7dmFyIHMscgpILnpLKGEpLkMoIn4obEQuRSkiKS5hKGIpCnM9dGhpcy5nQShhKQpmb3Io
-cj0wO3I8czsrK3Ipe2IuJDEodGhpcy5xKGEscikpCmlmKHMhPT10aGlzLmdBKGEpKXRocm93IEguYihQ
-LmE0KGEpKX19LApnbDAoYSl7cmV0dXJuIHRoaXMuZ0EoYSk9PT0wfSwKZ29yKGEpe3JldHVybiF0aGlz
-LmdsMChhKX0sCkUyKGEsYixjKXt2YXIgcz1ILnpLKGEpCnJldHVybiBuZXcgSC5sSihhLHMuS3EoYyku
-QygiMShsRC5FKSIpLmEoYikscy5DKCJAPGxELkU+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCmVSKGEs
-Yil7cmV0dXJuIEgucUMoYSxiLG51bGwsSC56SyhhKS5DKCJsRC5FIikpfSwKZHIoYSxiKXtyZXR1cm4g
-bmV3IEgualYoYSxILnpLKGEpLkMoIkA8bEQuRT4iKS5LcShiKS5DKCJqVjwxLDI+IikpfSwKZHUoYSxi
-LGMsZCl7dmFyIHMscj1ILnpLKGEpCmQ9ci5DKCJsRC5FIikuYShyLkMoImxELkU/IikuYShkKSkKUC5q
-QihiLGMsdGhpcy5nQShhKSkKZm9yKHM9YjtzPGM7KytzKXRoaXMuWTUoYSxzLGQpfSwKdyhhKXtyZXR1
-cm4gUC54KGEsIlsiLCJdIil9fQpQLmlsLnByb3RvdHlwZT17fQpQLnJhLnByb3RvdHlwZT17CiQyKGEs
-Yil7dmFyIHMscj10aGlzLmEKaWYoIXIuYSl0aGlzLmIuYSs9IiwgIgpyLmE9ITEKcj10aGlzLmIKcz1y
-LmErPUguRWooYSkKci5hPXMrIjogIgpyLmErPUguRWooYil9LAokUzo5fQpQLllrLnByb3RvdHlwZT17
-CksoYSxiKXt2YXIgcyxyLHE9SC5MaCh0aGlzKQpxLkMoIn4oWWsuSyxZay5WKSIpLmEoYikKZm9yKHM9
-Si5JVCh0aGlzLmd2YygpKSxxPXEuQygiWWsuViIpO3MuRigpOyl7cj1zLmdsKCkKYi4kMihyLHEuYSh0
-aGlzLnEoMCxyKSkpfX0sCmdQdShhKXtyZXR1cm4gSi5NMSh0aGlzLmd2YygpLG5ldyBQLnlRKHRoaXMp
-LEguTGgodGhpcykuQygiTjM8WWsuSyxZay5WPiIpKX0sCng0KGEpe3JldHVybiBKLnpsKHRoaXMuZ3Zj
-KCksYSl9LApnQShhKXtyZXR1cm4gSi5IbSh0aGlzLmd2YygpKX0sCmdsMChhKXtyZXR1cm4gSi51VSh0
-aGlzLmd2YygpKX0sCncoYSl7cmV0dXJuIFAubk8odGhpcyl9LAokaVowOjF9ClAueVEucHJvdG90eXBl
-PXsKJDEoYSl7dmFyIHMscj10aGlzLmEscT1ILkxoKHIpCnEuQygiWWsuSyIpLmEoYSkKcz1xLkMoIllr
-LlYiKQpyZXR1cm4gbmV3IFAuTjMoYSxzLmEoci5xKDAsYSkpLHEuQygiQDxZay5LPiIpLktxKHMpLkMo
-Ik4zPDEsMj4iKSl9LAokUygpe3JldHVybiBILkxoKHRoaXMuYSkuQygiTjM8WWsuSyxZay5WPihZay5L
-KSIpfX0KUC5LUC5wcm90b3R5cGU9ewpZNShhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpzLmMuYShiKQpz
-LlFbMV0uYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIikp
-fX0KUC5Qbi5wcm90b3R5cGU9ewpxKGEsYil7cmV0dXJuIHRoaXMuYS5xKDAsYil9LApZNShhLGIsYyl7
-dmFyIHM9SC5MaCh0aGlzKQp0aGlzLmEuWTUoMCxzLmMuYShiKSxzLlFbMV0uYShjKSl9LAp4NChhKXty
-ZXR1cm4gdGhpcy5hLng0KGEpfSwKSyhhLGIpe3RoaXMuYS5LKDAsSC5MaCh0aGlzKS5DKCJ+KDEsMiki
-KS5hKGIpKX0sCmdsMChhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ2wwKHMpfSwKZ0EoYSl7dmFyIHM9
-dGhpcy5hCnJldHVybiBzLmdBKHMpfSwKdyhhKXtyZXR1cm4gdGhpcy5hLncoMCl9LApnUHUoYSl7dmFy
-IHM9dGhpcy5hCnJldHVybiBzLmdQdShzKX0sCiRpWjA6MX0KUC5Hai5wcm90b3R5cGU9e30KUC5sZi5w
-cm90b3R5cGU9ewpnbDAoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ29yKGEpe3JldHVybiB0
-aGlzLmdBKHRoaXMpIT09MH0sCkZWKGEsYil7dmFyIHMKZm9yKHM9Si5JVChILkxoKHRoaXMpLkMoImNY
-PGxmLkU+IikuYShiKSk7cy5GKCk7KXRoaXMuaSgwLHMuZ2woKSl9LAp3KGEpe3JldHVybiBQLngodGhp
-cywieyIsIn0iKX0sCmsoYSxiKXt2YXIgcyxyLHE9dGhpcy5nbSh0aGlzKQppZighcS5GKCkpcmV0dXJu
-IiIKcz1xLiR0aS5jCmlmKGI9PT0iIil7cj0iIgpkbyByKz1ILkVqKHMuYShxLmQpKQp3aGlsZShxLkYo
-KSkKcz1yfWVsc2V7cj0iIitILkVqKHMuYShxLmQpKQpmb3IoO3EuRigpOylyPXIrYitILkVqKHMuYShx
-LmQpKQpzPXJ9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAplUihhLGIpe3JldHVybiBILmJL
-KHRoaXMsYixILkxoKHRoaXMpLkMoImxmLkUiKSl9LApFKGEsYil7dmFyIHMscixxLHAsbz0iaW5kZXgi
-CkguY2IoYixvLHQuUykKUC5rMShiLG8pCmZvcihzPXRoaXMuZ20odGhpcykscj1zLiR0aS5jLHE9MDtz
-LkYoKTspe3A9ci5hKHMuZCkKaWYoYj09PXEpcmV0dXJuIHA7KytxfXRocm93IEguYihQLkNmKGIsdGhp
-cyxvLG51bGwscSkpfX0KUC5Wai5wcm90b3R5cGU9eyRpYlE6MSwkaWNYOjEsJGl4dToxfQpQLlh2LnBy
-b3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXh1OjF9ClAublkucHJvdG90eXBlPXt9ClAuV1kucHJvdG90
-eXBlPXt9ClAuUlUucHJvdG90eXBlPXt9ClAucFIucHJvdG90eXBlPXt9ClAudXcucHJvdG90eXBlPXsK
-cShhLGIpe3ZhciBzLHI9dGhpcy5iCmlmKHI9PW51bGwpcmV0dXJuIHRoaXMuYy5xKDAsYikKZWxzZSBp
-Zih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuIG51bGwKZWxzZXtzPXJbYl0KcmV0dXJuIHR5cGVvZiBz
-PT0idW5kZWZpbmVkIj90aGlzLmZiKGIpOnN9fSwKZ0EoYSl7dmFyIHMKaWYodGhpcy5iPT1udWxsKXtz
-PXRoaXMuYwpzPXMuZ0Eocyl9ZWxzZSBzPXRoaXMuQ2YoKS5sZW5ndGgKcmV0dXJuIHN9LApnbDAoYSl7
-cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKZ3ZjKCl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlz
-LmMuZ3ZjKCkKcmV0dXJuIG5ldyBQLmk4KHRoaXMpfSwKWTUoYSxiLGMpe3ZhciBzLHIscT10aGlzCmlm
-KHEuYj09bnVsbClxLmMuWTUoMCxiLGMpCmVsc2UgaWYocS54NChiKSl7cz1xLmIKc1tiXT1jCnI9cS5h
-CmlmKHI9PW51bGw/cyE9bnVsbDpyIT09cylyW2JdPW51bGx9ZWxzZSBxLlhLKCkuWTUoMCxiLGMpfSwK
-eDQoYSl7aWYodGhpcy5iPT1udWxsKXJldHVybiB0aGlzLmMueDQoYSkKcmV0dXJuIE9iamVjdC5wcm90
-b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSl9LApLKGEsYil7dmFyIHMscixxLHAsbz10
-aGlzCnQuY0EuYShiKQppZihvLmI9PW51bGwpcmV0dXJuIG8uYy5LKDAsYikKcz1vLkNmKCkKZm9yKHI9
-MDtyPHMubGVuZ3RoOysrcil7cT1zW3JdCnA9by5iW3FdCmlmKHR5cGVvZiBwPT0idW5kZWZpbmVkIil7
-cD1QLlFlKG8uYVtxXSkKby5iW3FdPXB9Yi4kMihxLHApCmlmKHMhPT1vLmMpdGhyb3cgSC5iKFAuYTQo
-bykpfX0sCkNmKCl7dmFyIHM9dC5iTS5hKHRoaXMuYykKaWYocz09bnVsbClzPXRoaXMuYz1ILlFJKE9i
-amVjdC5rZXlzKHRoaXMuYSksdC5zKQpyZXR1cm4gc30sClhLKCl7dmFyIHMscixxLHAsbyxuPXRoaXMK
-aWYobi5iPT1udWxsKXJldHVybiBuLmMKcz1QLkZsKHQuTix0LnopCnI9bi5DZigpCmZvcihxPTA7cD1y
-Lmxlbmd0aCxxPHA7KytxKXtvPXJbcV0Kcy5ZNSgwLG8sbi5xKDAsbykpfWlmKHA9PT0wKUMuTm0uaShy
-LCIiKQplbHNlIEMuTm0uc0EociwwKQpuLmE9bi5iPW51bGwKcmV0dXJuIG4uYz1zfSwKZmIoYSl7dmFy
-IHMKaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmEsYSkpcmV0dXJu
-IG51bGwKcz1QLlFlKHRoaXMuYVthXSkKcmV0dXJuIHRoaXMuYlthXT1zfX0KUC5pOC5wcm90b3R5cGU9
-ewpnQShhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LApFKGEsYil7dmFyIHM9dGhpcy5hCmlm
-KHMuYj09bnVsbClzPXMuZ3ZjKCkuRSgwLGIpCmVsc2V7cz1zLkNmKCkKaWYoYjwwfHxiPj1zLmxlbmd0
-aClyZXR1cm4gSC5PSChzLGIpCnM9c1tiXX1yZXR1cm4gc30sCmdtKGEpe3ZhciBzPXRoaXMuYQppZihz
-LmI9PW51bGwpe3M9cy5ndmMoKQpzPXMuZ20ocyl9ZWxzZXtzPXMuQ2YoKQpzPW5ldyBKLm0xKHMscy5s
-ZW5ndGgsSC50NihzKS5DKCJtMTwxPiIpKX1yZXR1cm4gc30sCnRnKGEsYil7cmV0dXJuIHRoaXMuYS54
-NChiKX19ClAueHIucHJvdG90eXBlPXsKJDAoKXt2YXIgcyxyCnRyeXtzPW5ldyBUZXh0RGVjb2Rlcigi
-dXRmLTgiLHtmYXRhbDp0cnVlfSkKcmV0dXJuIHN9Y2F0Y2gocil7SC5SdShyKX1yZXR1cm4gbnVsbH0s
-CiRTOjEwfQpQLk56LnByb3RvdHlwZT17CiQwKCl7dmFyIHMscgp0cnl7cz1uZXcgVGV4dERlY29kZXIo
-InV0Zi04Iix7ZmF0YWw6ZmFsc2V9KQpyZXR1cm4gc31jYXRjaChyKXtILlJ1KHIpfXJldHVybiBudWxs
-fSwKJFM6MTB9ClAuQ1YucHJvdG90eXBlPXsKeXIoYTEsYTIsYTMpe3ZhciBzLHIscSxwLG8sbixtLGws
-ayxqLGksaCxnLGYsZSxkLGMsYixhLGEwPSJJbnZhbGlkIGJhc2U2NCBlbmNvZGluZyBsZW5ndGggIgph
-Mz1QLmpCKGEyLGEzLGExLmxlbmd0aCkKcz0kLlY3KCkKZm9yKHI9cy5sZW5ndGgscT1hMixwPXEsbz1u
-dWxsLG49LTEsbT0tMSxsPTA7cTxhMztxPWspe2s9cSsxCmo9Qy54Qi5XKGExLHEpCmlmKGo9PT0zNyl7
-aT1rKzIKaWYoaTw9YTMpe2g9SC5vbyhDLnhCLlcoYTEsaykpCmc9SC5vbyhDLnhCLlcoYTEsaysxKSkK
-Zj1oKjE2K2ctKGcmMjU2KQppZihmPT09MzcpZj0tMQprPWl9ZWxzZSBmPS0xfWVsc2UgZj1qCmlmKDA8
-PWYmJmY8PTEyNyl7aWYoZjwwfHxmPj1yKXJldHVybiBILk9IKHMsZikKZT1zW2ZdCmlmKGU+PTApe2Y9
-Qy54Qi5PKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6
-MDEyMzQ1Njc4OSsvIixlKQppZihmPT09ailjb250aW51ZQpqPWZ9ZWxzZXtpZihlPT09LTEpe2lmKG48
-MCl7ZD1vPT1udWxsP251bGw6by5hLmxlbmd0aAppZihkPT1udWxsKWQ9MApuPWQrKHEtcCkKbT1xfSsr
-bAppZihqPT09NjEpY29udGludWV9aj1mfWlmKGUhPT0tMil7aWYobz09bnVsbCl7bz1uZXcgUC5NKCIi
-KQpkPW99ZWxzZSBkPW8KYz1kLmErPUMueEIuTmooYTEscCxxKQpkLmE9YytILkx3KGopCnA9awpjb250
-aW51ZX19dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IGRhdGEiLGExLHEpKX1pZihvIT1udWxs
-KXtyPW8uYSs9Qy54Qi5OaihhMSxwLGEzKQpkPXIubGVuZ3RoCmlmKG4+PTApUC54TShhMSxtLGEzLG4s
-bCxkKQplbHNle2I9Qy5qbi56WShkLTEsNCkrMQppZihiPT09MSl0aHJvdyBILmIoUC5ycihhMCxhMSxh
-MykpCmZvcig7Yjw0Oyl7cis9Ij0iCm8uYT1yOysrYn19cj1vLmEKcmV0dXJuIEMueEIuaTcoYTEsYTIs
-YTMsci5jaGFyQ29kZUF0KDApPT0wP3I6cil9YT1hMy1hMgppZihuPj0wKVAueE0oYTEsbSxhMyxuLGws
-YSkKZWxzZXtiPUMuam4uelkoYSw0KQppZihiPT09MSl0aHJvdyBILmIoUC5ycihhMCxhMSxhMykpCmlm
-KGI+MSlhMT1DLnhCLmk3KGExLGEzLGEzLGI9PT0yPyI9PSI6Ij0iKX1yZXR1cm4gYTF9fQpQLlU4LnBy
-b3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnByb3RvdHlwZT17fQpQLlppLnByb3RvdHlw
-ZT17fQpQLlVkLnByb3RvdHlwZT17CncoYSl7dmFyIHM9UC5obCh0aGlzLmEpCnJldHVybih0aGlzLmIh
-PW51bGw/IkNvbnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBvYmplY3QgZmFpbGVkOiI6IkNv
-bnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3Q6IikrIiAiK3N9
-fQpQLks4LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIkN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lm
-eSJ9fQpQLmJ5LnByb3RvdHlwZT17CnBXKGEsYixjKXt2YXIgcwp0LmZWLmEoYykKcz1QLkJTKGIsdGhp
-cy5nSGUoKS5hKQpyZXR1cm4gc30sCk9CKGEsYil7dmFyIHMKdC5kQS5hKGIpCnM9UC51WChhLHRoaXMu
-Z1pFKCkuYixudWxsKQpyZXR1cm4gc30sCmdaRSgpe3JldHVybiBDLm5YfSwKZ0hlKCl7cmV0dXJuIEMu
-QTN9fQpQLm9qLnByb3RvdHlwZT17fQpQLk14LnByb3RvdHlwZT17fQpQLlNoLnByb3RvdHlwZT17ClJU
-KGEpe3ZhciBzLHIscSxwLG8sbixtPWEubGVuZ3RoCmZvcihzPXRoaXMuYyxyPTAscT0wO3E8bTsrK3Ep
-e3A9Qy54Qi5XKGEscSkKaWYocD45Mil7aWYocD49NTUyOTYpe289cCY2NDUxMgppZihvPT09NTUyOTYp
-e249cSsxCm49IShuPG0mJihDLnhCLlcoYSxuKSY2NDUxMik9PT01NjMyMCl9ZWxzZSBuPSExCmlmKCFu
-KWlmKG89PT01NjMyMCl7bz1xLTEKbz0hKG8+PTAmJihDLnhCLk8oYSxvKSY2NDUxMik9PT01NTI5Nil9
-ZWxzZSBvPSExCmVsc2Ugbz0hMAppZihvKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpv
-PXMuYSs9SC5Mdyg5MikKbys9SC5MdygxMTcpCnMuYT1vCm8rPUguTHcoMTAwKQpzLmE9bwpuPXA+Pj44
-JjE1Cm8rPUguTHcobjwxMD80OCtuOjg3K24pCnMuYT1vCm49cD4+PjQmMTUKbys9SC5MdyhuPDEwPzQ4
-K246ODcrbikKcy5hPW8Kbj1wJjE1CnMuYT1vK0guTHcobjwxMD80OCtuOjg3K24pfX1jb250aW51ZX1p
-ZihwPDMyKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpvPXMuYSs9SC5Mdyg5MikKc3dp
-dGNoKHApe2Nhc2UgODpzLmE9bytILkx3KDk4KQpicmVhawpjYXNlIDk6cy5hPW8rSC5MdygxMTYpCmJy
-ZWFrCmNhc2UgMTA6cy5hPW8rSC5MdygxMTApCmJyZWFrCmNhc2UgMTI6cy5hPW8rSC5MdygxMDIpCmJy
-ZWFrCmNhc2UgMTM6cy5hPW8rSC5MdygxMTQpCmJyZWFrCmRlZmF1bHQ6bys9SC5MdygxMTcpCnMuYT1v
-Cm8rPUguTHcoNDgpCnMuYT1vCm8rPUguTHcoNDgpCnMuYT1vCm49cD4+PjQmMTUKbys9SC5MdyhuPDEw
-PzQ4K246ODcrbikKcy5hPW8Kbj1wJjE1CnMuYT1vK0guTHcobjwxMD80OCtuOjg3K24pCmJyZWFrfX1l
-bHNlIGlmKHA9PT0zNHx8cD09PTkyKXtpZihxPnIpcy5hKz1DLnhCLk5qKGEscixxKQpyPXErMQpvPXMu
-YSs9SC5Mdyg5MikKcy5hPW8rSC5MdyhwKX19aWYocj09PTApcy5hKz1hCmVsc2UgaWYocjxtKXMuYSs9
-Qy54Qi5OaihhLHIsbSl9LApKbihhKXt2YXIgcyxyLHEscApmb3Iocz10aGlzLmEscj1zLmxlbmd0aCxx
-PTA7cTxyOysrcSl7cD1zW3FdCmlmKGE9PW51bGw/cD09bnVsbDphPT09cCl0aHJvdyBILmIobmV3IFAu
-SzgoYSxudWxsKSl9Qy5ObS5pKHMsYSl9LAppVShhKXt2YXIgcyxyLHEscCxvPXRoaXMKaWYoby50TShh
-KSlyZXR1cm4Kby5KbihhKQp0cnl7cz1vLmIuJDEoYSkKaWYoIW8udE0ocykpe3E9UC5HeShhLG51bGws
-by5nVksoKSkKdGhyb3cgSC5iKHEpfXE9by5hCmlmKDA+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsLTEp
-CnEucG9wKCl9Y2F0Y2gocCl7cj1ILlJ1KHApCnE9UC5HeShhLHIsby5nVksoKSkKdGhyb3cgSC5iKHEp
-fX0sCnRNKGEpe3ZhciBzLHIscT10aGlzCmlmKHR5cGVvZiBhPT0ibnVtYmVyIil7aWYoIWlzRmluaXRl
-KGEpKXJldHVybiExCnEuYy5hKz1DLkNELncoYSkKcmV0dXJuITB9ZWxzZSBpZihhPT09ITApe3EuYy5h
-Kz0idHJ1ZSIKcmV0dXJuITB9ZWxzZSBpZihhPT09ITEpe3EuYy5hKz0iZmFsc2UiCnJldHVybiEwfWVs
-c2UgaWYoYT09bnVsbCl7cS5jLmErPSJudWxsIgpyZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBhPT0ic3Ry
-aW5nIil7cz1xLmMKcy5hKz0nIicKcS5SVChhKQpzLmErPSciJwpyZXR1cm4hMH1lbHNlIGlmKHQuai5i
-KGEpKXtxLkpuKGEpCnEubEsoYSkKcz1xLmEKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkK
-cy5wb3AoKQpyZXR1cm4hMH1lbHNlIGlmKHQuZi5iKGEpKXtxLkpuKGEpCnI9cS5qdyhhKQpzPXEuYQpp
-ZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiByfWVsc2UgcmV0dXJu
-ITF9LApsSyhhKXt2YXIgcyxyLHE9dGhpcy5jCnEuYSs9IlsiCnM9Si5VNihhKQppZihzLmdvcihhKSl7
-dGhpcy5pVShzLnEoYSwwKSkKZm9yKHI9MTtyPHMuZ0EoYSk7KytyKXtxLmErPSIsIgp0aGlzLmlVKHMu
-cShhLHIpKX19cS5hKz0iXSJ9LApqdyhhKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9e30KaWYoYS5n
-bDAoYSkpe20uYy5hKz0ie30iCnJldHVybiEwfXM9YS5nQShhKSoyCnI9UC5POChzLG51bGwsITEsdC5Y
-KQpxPWwuYT0wCmwuYj0hMAphLksoMCxuZXcgUC50aShsLHIpKQppZighbC5iKXJldHVybiExCnA9bS5j
-CnAuYSs9InsiCmZvcihvPSciJztxPHM7cSs9MixvPScsIicpe3AuYSs9bwptLlJUKEgubihyW3FdKSkK
-cC5hKz0nIjonCm49cSsxCmlmKG4+PXMpcmV0dXJuIEguT0gocixuKQptLmlVKHJbbl0pfXAuYSs9In0i
-CnJldHVybiEwfX0KUC50aS5wcm90b3R5cGU9ewokMihhLGIpe3ZhciBzLHIKaWYodHlwZW9mIGEhPSJz
-dHJpbmciKXRoaXMuYS5iPSExCnM9dGhpcy5iCnI9dGhpcy5hCkMuTm0uWTUocyxyLmErKyxhKQpDLk5t
-Llk1KHMsci5hKyssYil9LAokUzo5fQpQLnR1LnByb3RvdHlwZT17CmdWSygpe3ZhciBzPXRoaXMuYy5h
-CnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfX0KUC51NS5wcm90b3R5cGU9ewpnWkUoKXtyZXR1
-cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsKV0ooYSl7dmFyIHMscixxLHA9UC5qQigwLG51bGwsYS5s
-ZW5ndGgpLG89cC0wCmlmKG89PT0wKXJldHVybiBuZXcgVWludDhBcnJheSgwKQpzPW8qMwpyPW5ldyBV
-aW50OEFycmF5KHMpCnE9bmV3IFAuUncocikKaWYocS5HeChhLDAscCkhPT1wKXtDLnhCLk8oYSxwLTEp
-CnEuUk8oKX1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoci5zdWJhcnJheSgwLEguck0oMCxxLmIscykpKX19
-ClAuUncucHJvdG90eXBlPXsKUk8oKXt2YXIgcz10aGlzLHI9cy5jLHE9cy5iLHA9cy5iPXErMSxvPXIu
-bGVuZ3RoCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIzOQpxPXMuYj1wKzEKaWYocD49byly
-ZXR1cm4gSC5PSChyLHApCnJbcF09MTkxCnMuYj1xKzEKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJb
-cV09MTg5fSwKTzYoYSxiKXt2YXIgcyxyLHEscCxvLG49dGhpcwppZigoYiY2NDUxMik9PT01NjMyMCl7
-cz02NTUzNisoKGEmMTAyMyk8PDEwKXxiJjEwMjMKcj1uLmMKcT1uLmIKcD1uLmI9cSsxCm89ci5sZW5n
-dGgKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09cz4+PjE4fDI0MApxPW4uYj1wKzEKaWYocD49
-bylyZXR1cm4gSC5PSChyLHApCnJbcF09cz4+PjEyJjYzfDEyOApwPW4uYj1xKzEKaWYocT49bylyZXR1
-cm4gSC5PSChyLHEpCnJbcV09cz4+PjYmNjN8MTI4Cm4uYj1wKzEKaWYocD49bylyZXR1cm4gSC5PSChy
-LHApCnJbcF09cyY2M3wxMjgKcmV0dXJuITB9ZWxzZXtuLlJPKCkKcmV0dXJuITF9fSwKR3goYSxiLGMp
-e3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcwppZihiIT09YyYmKEMueEIuTyhhLGMtMSkmNjQ1MTIpPT09
-NTUyOTYpLS1jCmZvcihzPWwuYyxyPXMubGVuZ3RoLHE9YjtxPGM7KytxKXtwPUMueEIuVyhhLHEpCmlm
-KHA8PTEyNyl7bz1sLmIKaWYobz49cilicmVhawpsLmI9bysxCnNbb109cH1lbHNle289cCY2NDUxMgpp
-ZihvPT09NTUyOTYpe2lmKGwuYis0PnIpYnJlYWsKbj1xKzEKaWYobC5PNihwLEMueEIuVyhhLG4pKSlx
-PW59ZWxzZSBpZihvPT09NTYzMjApe2lmKGwuYiszPnIpYnJlYWsKbC5STygpfWVsc2UgaWYocDw9MjA0
-Nyl7bz1sLmIKbT1vKzEKaWYobT49cilicmVhawpsLmI9bQppZihvPj1yKXJldHVybiBILk9IKHMsbykK
-c1tvXT1wPj4+NnwxOTIKbC5iPW0rMQpzW21dPXAmNjN8MTI4fWVsc2V7bz1sLmIKaWYobysyPj1yKWJy
-ZWFrCm09bC5iPW8rMQppZihvPj1yKXJldHVybiBILk9IKHMsbykKc1tvXT1wPj4+MTJ8MjI0Cm89bC5i
-PW0rMQppZihtPj1yKXJldHVybiBILk9IKHMsbSkKc1ttXT1wPj4+NiY2M3wxMjgKbC5iPW8rMQppZihv
-Pj1yKXJldHVybiBILk9IKHMsbykKc1tvXT1wJjYzfDEyOH19fXJldHVybiBxfX0KUC5HWS5wcm90b3R5
-cGU9ewpXSihhKXt2YXIgcyxyCnQuTC5hKGEpCnM9dGhpcy5hCnI9UC5reShzLGEsMCxudWxsKQppZihy
-IT1udWxsKXJldHVybiByCnJldHVybiBuZXcgUC5ieihzKS5OZShhLDAsbnVsbCwhMCl9fQpQLmJ6LnBy
-b3RvdHlwZT17Ck5lKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbj10aGlzCnQuTC5hKGEpCnM9UC5qQihi
-LGMsSi5IbShhKSkKaWYoYj09PXMpcmV0dXJuIiIKcj1QLmp5KGEsYixzKQpxPW4uaE8ociwwLHMtYiwh
-MCkKcD1uLmIKaWYoKHAmMSkhPT0wKXtvPVAuajQocCkKbi5iPTAKdGhyb3cgSC5iKFAucnIobyxhLGIr
-bi5jKSl9cmV0dXJuIHF9LApoTyhhLGIsYyxkKXt2YXIgcyxyLHE9dGhpcwppZihjLWI+MTAwMCl7cz1D
-LmpuLkJVKGIrYywyKQpyPXEuaE8oYSxiLHMsITEpCmlmKChxLmImMSkhPT0wKXJldHVybiByCnJldHVy
-biByK3EuaE8oYSxzLGMsZCl9cmV0dXJuIHEuRWgoYSxiLGMsZCl9LApFaChhLGIsYyxkKXt2YXIgcyxy
-LHEscCxvLG4sbSxsLGs9dGhpcyxqPTY1NTMzLGk9ay5iLGg9ay5jLGc9bmV3IFAuTSgiIiksZj1iKzEs
-ZT1hLmxlbmd0aAppZihiPDB8fGI+PWUpcmV0dXJuIEguT0goYSxiKQpzPWFbYl0KJGxhYmVsMCQwOmZv
-cihyPWsuYTshMDspe2Zvcig7ITA7Zj1vKXtxPUMueEIuVygiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
+LHE9MSxwLG89W10sbixtLGwsayxqLGksaCxnLGYKdmFyICRhc3luYyRoWD1QLmx6KGZ1bmN0aW9uKGQs
+ZSl7aWYoZD09PTEpe3A9ZQpzPXF9d2hpbGUodHJ1ZSlzd2l0Y2gocyl7Y2FzZSAwOnE9MwpqPXQuTgpz
+PTYKcmV0dXJuIFAualEoTC5RNihhLFAuRUYoWyJyZWdpb24iLCJyZWdpb24iLCJvZmZzZXQiLEguRWoo
+YildLGosaiksdC5HKSwkYXN5bmMkaFgpCmNhc2UgNjpuPWUKaj1uCmk9Si5VNihqKQpoPXQuZ3EKbT1u
+ZXcgVS5kMihVLmpmKGguYShpLnEoaiwiZWRpdHMiKSkpLEguayhpLnEoaiwiZXhwbGFuYXRpb24iKSks
+SC5VYyhpLnEoaiwibGluZSIpKSxILmsoaS5xKGosImRpc3BsYXlQYXRoIikpLEguayhpLnEoaiwidXJp
+UGF0aCIpKSxVLk5kKGguYShpLnEoaiwidHJhY2VzIikpKSkKTC5UMShtKQpMLkZyKGEsYixjKQpMLnlY
+KCIuZWRpdC1wYW5lbCAucGFuZWwtY29udGVudCIsITEpCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9Mgpm
+PXAKbD1ILlJ1KGYpCms9SC50cyhmKQpMLkMyKCJjb3VsZG4ndCBsb2FkIGVkaXQgZGV0YWlscyIsbCxr
+KQpzPTUKYnJlYWsKY2FzZSAyOnM9MQpicmVhawpjYXNlIDU6cmV0dXJuIFAueUMobnVsbCxyKQpjYXNl
+IDE6cmV0dXJuIFAuZjMocCxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMkaFgscil9LApHNyhhLGIsYyxk
+LGUpe3JldHVybiBMLkw1KGEsYixjLGQsZSl9LApMNShhLGIsYyxkLGUpe3ZhciBzPTAscj1QLkZYKHQu
+SCkscSxwPTIsbyxuPVtdLG0sbCxrLGosaSxoLGcKdmFyICRhc3luYyRHNz1QLmx6KGZ1bmN0aW9uKGYs
+YTApe2lmKGY9PT0xKXtvPWEwCnM9cH13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6aWYoIUMueEIu
+VGMoYSwiLmRhcnQiKSl7TC5CRShhLEIud1IoKSxkKQpMLkJYKGEsbnVsbCkKaWYoZSE9bnVsbCllLiQw
+KCkKcz0xCmJyZWFrfXA9NAppPXQuTgpzPTcKcmV0dXJuIFAualEoTC5RNihhLFAuRUYoWyJpbmxpbmUi
+LCJ0cnVlIl0saSxpKSx0LkcpLCRhc3luYyRHNykKY2FzZSA3Om09YTAKTC5CRShhLEIuWWYobSksZCkK
+TC5mRyhiLGMpCmw9TC5VcyhhKQpMLkJYKGwsYikKaWYoZSE9bnVsbCllLiQwKCkKcD0yCnM9NgpicmVh
+awpjYXNlIDQ6cD0zCmc9bwprPUguUnUoZykKaj1ILnRzKGcpCkwuQzIoImNvdWxkbid0IGxvYWQgZGFy
+dCBmaWxlICIrYSxrLGopCnM9NgpicmVhawpjYXNlIDM6cz0yCmJyZWFrCmNhc2UgNjpjYXNlIDE6cmV0
+dXJuIFAueUMocSxyKQpjYXNlIDI6cmV0dXJuIFAuZjMobyxyKX19KQpyZXR1cm4gUC5ESSgkYXN5bmMk
+Rzcscil9LApHZSgpe3ZhciBzPTAscj1QLkZYKHQueikscT0xLHAsbz1bXSxuLG0sbCxrLGosaSxoLGcK
+dmFyICRhc3luYyRHZT1QLmx6KGZ1bmN0aW9uKGEsYil7aWYoYT09PTEpe3A9YgpzPXF9d2hpbGUodHJ1
+ZSlzd2l0Y2gocyl7Y2FzZSAwOmg9Ii9fcHJldmlldy9uYXZpZ2F0aW9uVHJlZS5qc29uIgpxPTMKcz02
+CnJldHVybiBQLmpRKEwuUTYoaCxDLkNNLHQuVyksJGFzeW5jJEdlKQpjYXNlIDY6aj1iCmoudG9TdHJp
+bmcKbj1qCmo9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5hdi10cmVlIikKai50b1N0cmluZwptPWoK
+Si5sNShtLCIiKQpqPUwubUsobikKJC5JUj1qCkwudFgobSxqLCEwKQpxPTEKcz01CmJyZWFrCmNhc2Ug
+MzpxPTIKZz1wCmw9SC5SdShnKQprPUgudHMoZykKTC5DMigiY291bGRuJ3QgbG9hZCBuYXZpZ2F0aW9u
+IHRyZWUiLGwsaykKcz01CmJyZWFrCmNhc2UgMjpzPTEKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51
+bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJEdlLHIpfSwK
+cU8oYSl7dmFyIHMscixxPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscD1DLkNELnpRKCQuZmkoKS5v
+ZmZzZXRIZWlnaHQpLG89d2luZG93LmlubmVySGVpZ2h0Cm8udG9TdHJpbmcKcz1DLkNELnpRKCQuRFco
+KS5vZmZzZXRIZWlnaHQpCnI9cS5ib3R0b20Kci50b1N0cmluZwppZihyPm8tKHMrMTQpKUouZGgoYSkK
+ZWxzZXtvPXEudG9wCm8udG9TdHJpbmcKaWYobzxwKzE0KUouZGgoYSl9fSwKZkcoYSxiKXt2YXIgcyxy
+LHEscCxvCmlmKGEhPW51bGwpe3M9ZG9jdW1lbnQKcj1zLmdldEVsZW1lbnRCeUlkKCJvIitILkVqKGEp
+KQpxPXMucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILkVqKGIpKQppZihyIT1udWxsKXtMLnFPKHIpCkou
+ZFIocikuaSgwLCJ0YXJnZXQiKX1lbHNlIGlmKHEhPW51bGwpe3M9cS5wYXJlbnRFbGVtZW50CnMudG9T
+dHJpbmcKTC5xTyhzKX1pZihxIT1udWxsKUouZFIodC5oLmEocS5wYXJlbnROb2RlKSkuaSgwLCJoaWdo
+bGlnaHQiKX1lbHNle3M9ZG9jdW1lbnQKcD10LmgKSC5EaChwLHAsIlQiLCJxdWVyeVNlbGVjdG9yQWxs
+IikKcz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi5saW5lLW5vIikKbz1uZXcgVy53eihzLHQuUikKaWYoby5n
+QShvKT09PTApcmV0dXJuCkwucU8ocC5hKEMudDUuZ3RIKHMpKSl9fSwKYWYoYSxiLGMsZCxlKXt2YXIg
+cyxyLHEscD10LkYsbz1MLkc2KHAuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYpLG49TC5hSyhwLmEod2lu
+ZG93LmxvY2F0aW9uKS5ocmVmKQppZihvIT1udWxsKXtzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJv
+IitILkVqKG8pKQppZihzIT1udWxsKUouZFIocykuUigwLCJ0YXJnZXQiKX1pZihuIT1udWxsKXtyPWRv
+Y3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5FaihuKSkKaWYociE9bnVsbCl7cT1yLnBhcmVu
+dEVsZW1lbnQKcS50b1N0cmluZwpKLmRSKHEpLlIoMCwiaGlnaGxpZ2h0Iil9fWlmKGE9PXAuYSh3aW5k
+b3cubG9jYXRpb24pLnBhdGhuYW1lKXtMLmZHKGIsYykKZS4kMCgpfWVsc2V7YS50b1N0cmluZwpMLkc3
+KGEsYixjLGQsZSl9fSwKUTQoYSxiKXt2YXIgcyxyLHE9UC5oSyhhKSxwPVAuRmwodC5OLHQuZGspCmZv
+cihzPXEuZ2hZKCkscz1zLmdQdShzKSxzPXMuZ20ocyk7cy5GKCk7KXtyPXMuZ2woKQpwLlk1KDAsci5h
+LHIuYil9Zm9yKHM9Yi5nUHUoYikscz1zLmdtKHMpO3MuRigpOyl7cj1zLmdsKCkKcC5ZNSgwLHIuYSxy
+LmIpfXAuWTUoMCwiYXV0aFRva2VuIiwkLlVFKCkpCnJldHVybiBxLm5tKDAscCkuZ25EKCl9LApUMShh
+KXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPSQuaEwoKQppLnRvU3RyaW5nCkoubDUoaSwiIikKaWYo
+YT09bnVsbCl7cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIikKQy5MdC5zYTQocywiU2VlIGRldGFp
+bHMgYWJvdXQgYSBwcm9wb3NlZCBlZGl0LiIpCkMuTHQuc1AocyxILlFJKFsicGxhY2Vob2xkZXIiXSx0
+LnMpKQppLmFwcGVuZENoaWxkKHMpCkMuTHQuRkYocykKcmV0dXJufXI9YS5kCnIudG9TdHJpbmcKcT0k
+Lm5VKCkKcD1xLnpmKHIpCm89YS5iCm49ZG9jdW1lbnQKbT1uLnF1ZXJ5U2VsZWN0b3IoIi5yb290Iiku
+dGV4dENvbnRlbnQKbS50b1N0cmluZwpsPXEuSFAocixDLnhCLmJTKG0pKQprPWEuYwpqPW4uY3JlYXRl
+RWxlbWVudCgicCIpCmkuYXBwZW5kQ2hpbGQoaikKai5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2Rl
+KEguRWoobykrIiBhdCAiKSkKcj1hLmUKci50b1N0cmluZwpxPXQuTgpxPVcuSjYoTC5RNChyLFAuRUYo
+WyJsaW5lIixKLncoayldLHEscSkpKQpxLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUobCsiOiIr
+SC5FaihrKSsiLiIpKQpqLmFwcGVuZENoaWxkKHEpCkouZGgoaikKTC5DQyhhLGkscCkKTC5GeihhLGkp
+fSwKTEgoYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkPSQueVAoKQpkLnRv
+U3RyaW5nCkoubDUoZCwiIikKaWYoYi5nQShiKT09PTApe3M9ZG9jdW1lbnQKcj1zLmNyZWF0ZUVsZW1l
+bnQoInAiKQpkLmFwcGVuZENoaWxkKHIpCnIuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgiTm8g
+cHJvcG9zZWQgZWRpdHMiKSl9ZWxzZSBmb3IoZD1iLmdQdShiKSxkPWQuZ20oZCkscz10LkYscT10Lk4s
+cD10LlEsbz1wLkMoIn4oMSk/Iiksbj10LloscD1wLmM7ZC5GKCk7KXttPWQuZ2woKQpsPWRvY3VtZW50
+CnI9bC5jcmVhdGVFbGVtZW50KCJwIikKaz0kLnlQKCkKay5hcHBlbmRDaGlsZChyKQpyLmFwcGVuZENo
+aWxkKGwuY3JlYXRlVGV4dE5vZGUoSC5FaihtLmEpKyI6IikpCmo9bC5jcmVhdGVFbGVtZW50KCJ1bCIp
+CmsuYXBwZW5kQ2hpbGQoaikKZm9yKG09Si5JVChtLmIpO20uRigpOyl7az1tLmdsKCkKaT1sLmNyZWF0
+ZUVsZW1lbnQoImxpIikKai5hcHBlbmRDaGlsZChpKQpKLmRSKGkpLmkoMCwiZWRpdCIpCmg9bC5jcmVh
+dGVFbGVtZW50KCJhIikKaS5hcHBlbmRDaGlsZChoKQpoLmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIp
+Cmc9ay5jCmY9SC5FaihnKQpoLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGgp
+KS5PVSgib2Zmc2V0IiksZikKZT1rLmEKZj1ILkVqKGUpCmguc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3
+IFcuU3kobmV3IFcuaTcoaCkpLk9VKCJsaW5lIiksZikKaC5hcHBlbmRDaGlsZChsLmNyZWF0ZVRleHRO
+b2RlKCJsaW5lICIrSC5FaihlKSkpCmY9cy5hKHdpbmRvdy5sb2NhdGlvbikucGF0aG5hbWUKZi50b1N0
+cmluZwpoLnNldEF0dHJpYnV0ZSgiaHJlZiIsTC5RNChmLFAuRUYoWyJsaW5lIixILkVqKGUpLCJvZmZz
+ZXQiLEguRWooZyldLHEscSkpKQpmPW8uYShuZXcgTC5FRShnLGUsYSkpCm4uYShudWxsKQpXLkpFKGgs
+ImNsaWNrIixmLCExLHApCmkuYXBwZW5kQ2hpbGQobC5jcmVhdGVUZXh0Tm9kZSgiOiAiK0guRWooay5i
+KSkpfX1pZihjKUwuVDEobnVsbCl9LApGcihhLGIsYyl7dmFyIHMscixxPVAuaEsoQy5FeC5nRHIodC5G
+LmEod2luZG93LmxvY2F0aW9uKSkrSC5FaihhKSkscD1QLkZsKHQuTix0LmRrKQppZihiIT1udWxsKXAu
+WTUoMCwib2Zmc2V0IixILkVqKGIpKQppZihjIT1udWxsKXAuWTUoMCwibGluZSIsSC5FaihjKSkKcC5Z
+NSgwLCJhdXRoVG9rZW4iLCQuVUUoKSkKcT1xLm5tKDAscCkKcD13aW5kb3cuaGlzdG9yeQpzPXQuegpy
+PXEuZ25EKCkKcC5wdXNoU3RhdGUobmV3IFAuQmYoW10sW10pLlB2KFAuRmwocyxzKSksIiIscil9LApF
+bihhKXt2YXIgcyxyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQKci50
+b1N0cmluZwpzPXIrIi8iCmlmKEMueEIubihhLHMpKXJldHVybiBDLnhCLnluKGEscy5sZW5ndGgpCmVs
+c2UgcmV0dXJuIGF9LApPdChhKXtzd2l0Y2goYS5yKXtjYXNlIEMuY3c6YnJlYWsKY2FzZSBDLldEOmEu
+cj1DLlhqCmJyZWFrCmNhc2UgQy5YajphLnI9Qy5XRApicmVhawpjYXNlIEMuZGM6dGhyb3cgSC5iKFAu
+UFYoIkZpbGUgIitILkVqKGEuYykrIiBzaG91bGQgbm90IGhhdmUgaW5kZXRlcm1pbmF0ZSBtaWdyYXRp
+b24gc3RhdHVzIikpCmRlZmF1bHQ6YnJlYWt9fSwKdGEoYSxiKXt2YXIgcyxyPSJjaGVja19ib3giLHE9
+InRpdGxlIixwPSJvcHRlZC1vdXQiLG89Im1pZ3JhdGluZyIKc3dpdGNoKGIpe2Nhc2UgQy5jdzphLmlu
+bmVyVGV4dD1yCnM9Si5ZRShhKQpzLmdQKGEpLmkoMCwiYWxyZWFkeS1taWdyYXRlZCIpCnMuZ1AoYSku
+aSgwLCJkaXNhYmxlZCIpCmEuc2V0QXR0cmlidXRlKHEsIkFscmVhZHkgbWlncmF0ZWQiKQpicmVhawpj
+YXNlIEMuV0Q6YS5pbm5lclRleHQ9cgpzPUouWUUoYSkKcy5nUChhKS5SKDAscCkKcy5nUChhKS5pKDAs
+bykKYS5zZXRBdHRyaWJ1dGUocSwiTWlncmF0aW5nIHRvIG51bGwgc2FmZXR5IikKYnJlYWsKY2FzZSBD
+LlhqOmEuaW5uZXJUZXh0PSJjaGVja19ib3hfb3V0bGluZV9ibGFuayIKcz1KLllFKGEpCnMuZ1AoYSku
+UigwLG8pCnMuZ1AoYSkuaSgwLHApCmEuc2V0QXR0cmlidXRlKHEsIk9wdGluZyBvdXQgb2YgbnVsbCBz
+YWZldHkiKQpicmVhawpkZWZhdWx0OmEuaW5uZXJUZXh0PSJpbmRldGVybWluYXRlX2NoZWNrX2JveCIK
+cz1KLllFKGEpCnMuZ1AoYSkuUigwLG8pCnMuZ1AoYSkuaSgwLHApCmEuc2V0QXR0cmlidXRlKHEsIk1p
+eGVkIHN0YXR1c2VzIG9mICdtaWdyYXRpbmcnIGFuZCAnb3B0aW5nIG91dCciKQpicmVha319LAp4bihh
+LGIpe3ZhciBzLHI9ImRpc2FibGVkIixxPWIuZ0woKQpMLnRhKGEscSkKaWYoYi5jPT09JC5EOSgpLmlu
+bmVyVGV4dCl7aWYoYiBpbnN0YW5jZW9mIEwuY0Qpe3M9Yi54CnMudG9TdHJpbmcKcz0hc31lbHNlIHM9
+ITEKaWYocyl7YS50b1N0cmluZwpKLmRSKGEpLmkoMCxyKX1lbHNle2EudG9TdHJpbmcKSi5kUihhKS5S
+KDAscil9TC50YSgkLmMwKCkscSl9fSwKQlgoYSxiKXt2YXIgcyxyLHEscD17fQpwLmE9YQphPUwuRW4o
+YSkKcC5hPWEKcz0kLkQ5KCkKcy50b1N0cmluZwpKLmRyKHMsYSkKcz1kb2N1bWVudApyPXQuaApILkRo
+KHIsciwiVCIsInF1ZXJ5U2VsZWN0b3JBbGwiKQpzPW5ldyBXLnd6KHMucXVlcnlTZWxlY3RvckFsbCgi
+Lm5hdi1wYW5lbCAubmF2LWxpbmsiKSx0LlIpCnMuSyhzLG5ldyBMLlZTKHApKQpzPSQuSVIKcT1zPT1u
+dWxsP251bGw6TC55dyhzLHAuYSkKaWYocT09bnVsbCl7cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHAp
+LlIoMCwidmlzaWJsZSIpfWVsc2V7cD0kLmJOKCkKcC50b1N0cmluZwpKLmRSKHApLmkoMCwidmlzaWJs
+ZSIpCkwudGEoJC5jMCgpLHEuZ0woKSl9fSwKQVIoYSxiKXt2YXIgcyxyLHE9Yi5iCmlmKHE9PT0kKXE9
+SC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4iKSkKcz10
+LmgKcj1zLmEocy5hKGEucGFyZW50Tm9kZSkucGFyZW50Tm9kZSkKTC54bihyLnF1ZXJ5U2VsZWN0b3Io
+IjpzY29wZSA+IC5zdGF0dXMtaWNvbiIpLHEpCkwuQVIocixxKX0sCmJMKGEsYil7dmFyIHMscixxLHAs
+byxuLG0sbD0iOnNjb3BlID4gLnN0YXR1cy1pY29uIgpmb3Iocz1iLmQscj1zLmxlbmd0aCxxPXQuaCxw
+PTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3BdCmEudG9TdHJp
+bmcKbj1vLmMKbi50b1N0cmluZwptPWEucXVlcnlTZWxlY3RvcignW2RhdGEtbmFtZSo9IicrVy5Maihu
+KSsnIl0nKQppZihvIGluc3RhbmNlb2YgTC52dCl7TC5iTChtLG8pCkwueG4obS5xdWVyeVNlbGVjdG9y
+KGwpLGIpfWVsc2UgTC54bihxLmEobS5wYXJlbnROb2RlKS5xdWVyeVNlbGVjdG9yKGwpLG8pfX0sCkJF
+KGEsYixjKXt2YXIgcz0iLnJlZ2lvbnMiLHI9ZG9jdW1lbnQscT1yLnF1ZXJ5U2VsZWN0b3IocykKcS50
+b1N0cmluZwpyPXIucXVlcnlTZWxlY3RvcigiLmNvZGUiKQpyLnRvU3RyaW5nCkoudEgocSxiLmEsJC5L
+RygpKQpKLnRIKHIsYi5iLCQuS0coKSkKTC5MSChhLGIuZCxjKQppZihiLmMubGVuZ3RoPDJlNSlMLkdn
+KCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHMsITApfSwKdFgoYTAsYTEsYTIpe3ZhciBzLHIscSxwLG8s
+bixtLGwsayxqLGksaCxnLGYsZSxkPSJtYXRlcmlhbC1pY29ucyIsYz0ic3RhdHVzLWljb24iLGI9ZG9j
+dW1lbnQsYT1iLmNyZWF0ZUVsZW1lbnQoInVsIikKYTAuYXBwZW5kQ2hpbGQoYSkKZm9yKHM9YTEubGVu
+Z3RoLHI9dC5OLHE9dC5aLHA9MDtwPGExLmxlbmd0aDthMS5sZW5ndGg9PT1zfHwoMCxILmxrKShhMSks
+KytwKXtvPWExW3BdCm49Yi5jcmVhdGVFbGVtZW50KCJsaSIpCmEuYXBwZW5kQ2hpbGQobikKaWYobyBp
+bnN0YW5jZW9mIEwudnQpe209Si5ZRShuKQptLmdQKG4pLmkoMCwiZGlyIikKbD1vLmMKbC50b1N0cmlu
+ZwpuLnNldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG4pKS5PVSgibmFtZSIpLGwp
+Cms9Yi5jcmVhdGVFbGVtZW50KCJzcGFuIikKbi5hcHBlbmRDaGlsZChrKQpsPUouWUUoaykKbC5nUChr
+KS5pKDAsImFycm93IikKbC5zaGYoaywiJiN4MjVCQzsiKQpqPWIuY3JlYXRlRWxlbWVudCgic3BhbiIp
+CkouZFIoaikuaSgwLGQpCmouaW5uZXJUZXh0PSJmb2xkZXJfb3BlbiIKbi5hcHBlbmRDaGlsZChqKQps
+PW8uYQpsLnRvU3RyaW5nCm4uYXBwZW5kQ2hpbGQoYi5jcmVhdGVUZXh0Tm9kZShsKSkKbD1vLmQKbC50
+b1N0cmluZwpMLnRYKG4sbCwhMCkKaT1iLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpsPUouWUUoaSkKbC5n
+UChpKS5pKDAsZCkKaS5pbm5lclRleHQ9ImluZGV0ZXJtaW5hdGVfY2hlY2tfYm94IgpsLmdQKGkpLmko
+MCxjKQpMLnhuKGksbykKbD1sLmdWbChpKQpoPWwuJHRpCmc9aC5DKCJ+KDEpPyIpLmEobmV3IEwuVEQo
+byxuLGkpKQpxLmEobnVsbCkKVy5KRShsLmEsbC5iLGcsITEsaC5jKQptLm1LKG4saSxqKQpMLmt6KGsp
+fWVsc2UgaWYobyBpbnN0YW5jZW9mIEwuY0Qpe2k9Yi5jcmVhdGVFbGVtZW50KCJzcGFuIikKbT1KLllF
+KGkpCm0uZ1AoaSkuaSgwLGQpCmkuaW5uZXJUZXh0PSIiCm0uZ1AoaSkuaSgwLGMpCmw9by54CmwudG9T
+dHJpbmcKaWYoIWwpbS5nUChpKS5pKDAsImRpc2FibGVkIikKTC54bihpLG8pCmlmKGwpe209bS5nVmwo
+aSkKbD1tLiR0aQpoPWwuQygifigxKT8iKS5hKG5ldyBMLklmKG8saSxuKSkKcS5hKG51bGwpClcuSkUo
+bS5hLG0uYixoLCExLGwuYyl9bi5hcHBlbmRDaGlsZChpKQptPWIuY3JlYXRlRWxlbWVudCgic3BhbiIp
+CkouZFIobSkuaSgwLGQpCm0uaW5uZXJUZXh0PSJpbnNlcnRfZHJpdmVfZmlsZSIKbi5hcHBlbmRDaGls
+ZChtKQpmPWIuY3JlYXRlRWxlbWVudCgiYSIpCm4uYXBwZW5kQ2hpbGQoZikKbT1KLllFKGYpCm0uZ1Ao
+ZikuaSgwLCJuYXYtbGluayIpCmw9by5jCmwudG9TdHJpbmcKZi5zZXRBdHRyaWJ1dGUoImRhdGEtIitu
+ZXcgVy5TeShuZXcgVy5pNyhmKSkuT1UoIm5hbWUiKSxsKQpsPW8uZApsLnRvU3RyaW5nCmYuc2V0QXR0
+cmlidXRlKCJocmVmIixMLlE0KGwsUC5GbChyLHIpKSkKbD1vLmEKbC50b1N0cmluZwpmLmFwcGVuZENo
+aWxkKGIuY3JlYXRlVGV4dE5vZGUobCkpCm09bS5nVmwoZikKbD1tLiR0aQpoPWwuQygifigxKT8iKS5h
+KG5ldyBMLnRCKCkpCnEuYShudWxsKQpXLkpFKG0uYSxtLmIsaCwhMSxsLmMpCmw9by5lCmwudG9TdHJp
+bmcKaWYobD4wKXtlPWIuY3JlYXRlRWxlbWVudCgic3BhbiIpCm4uYXBwZW5kQ2hpbGQoZSkKSi5kUihl
+KS5pKDAsImVkaXQtY291bnQiKQptPSIiK2wrIiAiCmlmKGw9PT0xKWg9InByb3Bvc2VkIGVkaXQiCmVs
+c2UgaD0icHJvcG9zZWQgZWRpdHMiCmUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsbStoKQplLmFwcGVuZENo
+aWxkKGIuY3JlYXRlVGV4dE5vZGUoQy5qbi53KGwpKSl9fX19LAp1eihhLGIsYyl7dmFyIHM9ZG9jdW1l
+bnQscj1zLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpLHE9dC5RLHA9cS5DKCJ+KDEpPyIpLmEobmV3IEwu
+bTIoYSxjKSkKdC5aLmEobnVsbCkKVy5KRShyLCJjbGljayIscCwhMSxxLmMpCnE9Ui5PWChhLmEpCnEu
+dG9TdHJpbmcKci5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKHEpKQpiLmFwcGVuZENoaWxkKHIp
+fSwKRnooYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGg9YS5hCmlmKGg9PW51bGwpcmV0dXJu
+CmIudG9TdHJpbmcKcz1kb2N1bWVudApyPXMuY3JlYXRlRWxlbWVudCgicCIpCnE9Yi5hcHBlbmRDaGls
+ZChyKQpyPXMuY3JlYXRlRWxlbWVudCgic3BhbiIpCnA9dC5zCkouTXUocixILlFJKFsidHlwZS1kZXNj
+cmlwdGlvbiJdLHApKQpyLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoIkFjdGlvbnMiKSkKcS5h
+cHBlbmRDaGlsZChyKQpxLmFwcGVuZENoaWxkKHMuY3JlYXRlVGV4dE5vZGUoIjoiKSkKbz1zLmNyZWF0
+ZUVsZW1lbnQoInAiKQpiLmFwcGVuZENoaWxkKG8pCmZvcihyPWgubGVuZ3RoLG49dC5PLG09MDttPGgu
+bGVuZ3RoO2gubGVuZ3RoPT09cnx8KDAsSC5saykoaCksKyttKXtsPWhbbV0Kaz1zLmNyZWF0ZUVsZW1l
+bnQoImEiKQpvLmFwcGVuZENoaWxkKGspCmo9bC5hCmoudG9TdHJpbmcKay5hcHBlbmRDaGlsZChzLmNy
+ZWF0ZVRleHROb2RlKGopKQpqPWwuYgpqLnRvU3RyaW5nCmsuc2V0QXR0cmlidXRlKCJocmVmIixqKQpq
+PW4uYShILlFJKFsiYWRkLWhpbnQtbGluayIsImJlZm9yZS1hcHBseSIsImJ1dHRvbiJdLHApKQppPUou
+ZFIoaykKaS5WMSgwKQppLkZWKDAsail9fSwKQ0MoYTQsYTUsYTYpe3ZhciBzLHIscSxwLG8sbixtLGws
+ayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEzCmZvcihzPWE0LmYscj1zLmxlbmd0aCxxPXQu
+cyxwPXQuTyxvPTA7bzxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrbyl7bj1zW29d
+CmE1LnRvU3RyaW5nCm09ZG9jdW1lbnQKbD1tLmNyZWF0ZUVsZW1lbnQoInAiKQprPXAuYShILlFJKFsi
+dHJhY2UiXSxxKSkKaj1KLmRSKGwpCmouVjEoMCkKai5GVigwLGspCmk9YTUuYXBwZW5kQ2hpbGQobCkK
+bD1tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQprPXAuYShILlFJKFsidHlwZS1kZXNjcmlwdGlvbiJdLHEp
+KQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaz1uLmEKay50b1N0cmluZwpsLmFwcGVuZENoaWxk
+KG0uY3JlYXRlVGV4dE5vZGUoaykpCmkuYXBwZW5kQ2hpbGQobCkKaS5hcHBlbmRDaGlsZChtLmNyZWF0
+ZVRleHROb2RlKCI6IikpCmw9bS5jcmVhdGVFbGVtZW50KCJ1bCIpCms9cC5hKEguUUkoWyJ0cmFjZSJd
+LHEpKQpqPUouZFIobCkKai5WMSgwKQpqLkZWKDAsaykKaD1pLmFwcGVuZENoaWxkKGwpCmZvcihsPW4u
+YixrPWwubGVuZ3RoLGc9MDtnPGwubGVuZ3RoO2wubGVuZ3RoPT09a3x8KDAsSC5saykobCksKytnKXtm
+PWxbZ10KZT1tLmNyZWF0ZUVsZW1lbnQoImxpIikKaC5hcHBlbmRDaGlsZChlKQpkPW0uY3JlYXRlRWxl
+bWVudCgic3BhbiIpCmM9cC5hKEguUUkoWyJmdW5jdGlvbiJdLHEpKQpqPUouZFIoZCkKai5WMSgwKQpq
+LkZWKDAsYykKYz1mLmIKTC5XaihkLGM9PW51bGw/InVua25vd24iOmMpCmUuYXBwZW5kQ2hpbGQoZCkK
+Yj1mLmMKaWYoYiE9bnVsbCl7ZS5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKCIgKCIpKQphPWIu
+YgphMD1tLmNyZWF0ZUVsZW1lbnQoImEiKQphMC5hcHBlbmRDaGlsZChtLmNyZWF0ZVRleHROb2RlKEgu
+RWooYi5jKSsiOiIrSC5FaihhKSkpCmQ9Yi5hCmQudG9TdHJpbmcKYTAuc2V0QXR0cmlidXRlKCJocmVm
+IixkKQphMC5jbGFzc0xpc3QuYWRkKCJuYXYtbGluayIpCmUuYXBwZW5kQ2hpbGQoYTApCmUuYXBwZW5k
+Q2hpbGQobS5jcmVhdGVUZXh0Tm9kZSgiKSIpKX1lLmFwcGVuZENoaWxkKG0uY3JlYXRlVGV4dE5vZGUo
+IjogIikpCmQ9Zi5hCkwuV2ooZSxkPT1udWxsPyJ1bmtub3duIjpkKQpkPWYuZAppZihkLmxlbmd0aCE9
+PTApe2M9bS5jcmVhdGVFbGVtZW50KCJwIikKYTE9cC5hKEguUUkoWyJkcmF3ZXIiLCJiZWZvcmUtYXBw
+bHkiXSxxKSkKaj1KLmRSKGMpCmouVjEoMCkKai5GVigwLGExKQphMj1lLmFwcGVuZENoaWxkKGMpCmZv
+cihjPWQubGVuZ3RoLGEzPTA7YTM8ZC5sZW5ndGg7ZC5sZW5ndGg9PT1jfHwoMCxILmxrKShkKSwrK2Ez
+KUwudXooZFthM10sYTIsYil9fX19LApVcyhhKXtyZXR1cm4gQy54Qi50ZyhhLCI/Iik/Qy54Qi5Oaihh
+LDAsQy54Qi5PWShhLCI/IikpOmF9LApURyhhLGIpe3JldHVybiBuZXcgTC5RVyhhLGIpfSwKeXcoYSxi
+KXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8
+KDAsSC5saykoYSksKytyKXtxPWFbcl0KaWYocSBpbnN0YW5jZW9mIEwudnQpe3A9cS5kCnAudG9TdHJp
+bmcKbz1MLnl3KHAsYikKaWYobyE9bnVsbClyZXR1cm4gb31lbHNlIGlmKHEuYz09PWIpcmV0dXJuIHF9
+cmV0dXJuIG51bGx9LApXaihhLGIpe3ZhciBzLHIscSxwPUguUUkoYi5zcGxpdCgiLiIpLHQucyksbz1D
+Lk5tLmd0SChwKSxuPWRvY3VtZW50CmEuYXBwZW5kQ2hpbGQobi5jcmVhdGVUZXh0Tm9kZShvKSkKZm9y
+KG89SC5xQyhwLDEsbnVsbCx0Lk4pLHM9by4kdGksbz1uZXcgSC5hNyhvLG8uZ0Eobykscy5DKCJhNzxh
+TC5FPiIpKSxzPXMuQygiYUwuRSIpLHI9Si5ZRShhKTtvLkYoKTspe3E9cy5hKG8uZCkKci5ueihhLCJi
+ZWZvcmVlbmQiLCImIzgyMDM7LiIsbnVsbCxudWxsKQphLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5v
+ZGUocSkpfX0sCmU6ZnVuY3Rpb24gZSgpe30sClZXOmZ1bmN0aW9uIFZXKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y30sCm9aOmZ1bmN0aW9uIG9aKCl7fSwKanI6ZnVuY3Rpb24ganIoKXt9LApx
+bDpmdW5jdGlvbiBxbCgpe30sCnk4OmZ1bmN0aW9uIHk4KCl7fSwKSGk6ZnVuY3Rpb24gSGkoKXt9LApC
+VDpmdW5jdGlvbiBCVCgpe30sClBZOmZ1bmN0aW9uIFBZKCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwKV3g6
+ZnVuY3Rpb24gV3goYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkhvOmZ1bmN0aW9uIEhvKGEpe3RoaXMu
+YT1hfSwKZE46ZnVuY3Rpb24gZE4oYSl7dGhpcy5hPWF9LApJQzpmdW5jdGlvbiBJQyhhKXt0aGlzLmE9
+YX0sCnh6OmZ1bmN0aW9uIHh6KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApCTjpmdW5jdGlvbiBCTigp
+e30sCmZDOmZ1bmN0aW9uIGZDKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApUbTpmdW5jdGlvbiBUbSgp
+e30sCm5UOmZ1bmN0aW9uIG5UKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk5ZOmZ1
+bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKdWU6ZnVuY3Rpb24gdWUoKXt9LApHSDpmdW5jdGlvbiBHSCgp
+e30sCkVFOmZ1bmN0aW9uIEVFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1
+bmN0aW9uIFFMKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9
+YX0sClREOmZ1bmN0aW9uIFREKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCklmOmZ1
+bmN0aW9uIElmKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCnRCOmZ1bmN0aW9uIHRC
+KCl7fSwKbTI6ZnVuY3Rpb24gbTIoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClFXOmZ1bmN0aW9uIFFX
+KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApYQTpmdW5jdGlvbiBYQSgpe30sClpzKGEpe3ZhciBzLHIs
+cT1KLlU2KGEpCmlmKEwucDIoSC5rKHEucShhLCJ0eXBlIikpKT09PUMuWTIpe3M9SC5rKHEucShhLCJu
+YW1lIikpCnI9SC5rKHEucShhLCJwYXRoIikpCnE9cS5xKGEsInN1YnRyZWUiKQpxPW5ldyBMLnZ0KHE9
+PW51bGw/bnVsbDpMLm1LKHQuVy5hKHEpKSxzLHIpCnEuTFYoKQpyZXR1cm4gcX1lbHNle3M9SC5rKHEu
+cShhLCJuYW1lIikpCnI9SC5rKHEucShhLCJwYXRoIikpCnJldHVybiBuZXcgTC5jRChILmsocS5xKGEs
+ImhyZWYiKSksSC5VYyhxLnEoYSwiZWRpdENvdW50IikpLEguTTQocS5xKGEsIndhc0V4cGxpY2l0bHlP
+cHRlZE91dCIpKSxMLnZCKEguVWMocS5xKGEsIm1pZ3JhdGlvblN0YXR1cyIpKSksSC5NNChxLnEoYSwi
+bWlncmF0aW9uU3RhdHVzQ2FuQmVDaGFuZ2VkIikpLHMscil9fSwKbUsoYSl7dmFyIHMscj1ILlFJKFtd
+LHQuZmgpCmZvcihzPUouSVQoYSk7cy5GKCk7KXIucHVzaChMLlpzKHMuZ2woKSkpCnJldHVybiByfSwK
+VkQoYSl7dmFyIHMscixxPUguUUkoW10sdC5kKQpmb3Iocz1hLmxlbmd0aCxyPTA7cjxhLmxlbmd0aDth
+Lmxlbmd0aD09PXN8fCgwLEgubGspKGEpLCsrcilxLnB1c2goYVtyXS5MdCgpKQpyZXR1cm4gcX0sCnZC
+KGEpe2lmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYoYT4+PjAhPT1hfHxhPj00KXJldHVybiBILk9IKEMu
+bDAsYSkKcmV0dXJuIEMubDBbYV19LApwMihhKXtzd2l0Y2goYSl7Y2FzZSJkaXJlY3RvcnkiOnJldHVy
+biBDLlkyCmNhc2UiZmlsZSI6cmV0dXJuIEMucmYKZGVmYXVsdDp0aHJvdyBILmIoUC5QVigiVW5yZWNv
+Z25pemVkIG5hdmlnYXRpb24gdHJlZSBub2RlIHR5cGU6ICIrSC5FaihhKSkpfX0sCnZ0OmZ1bmN0aW9u
+IHZ0KGEsYixjKXt2YXIgXz10aGlzCl8uZD1hCl8uYT1iCl8uYj0kCl8uYz1jfSwKY0Q6ZnVuY3Rpb24g
+Y0QoYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZApfLng9ZQpf
+LmE9ZgpfLmI9JApfLmM9Z30sCkQ4OmZ1bmN0aW9uIEQ4KCl7fSwKTzk6ZnVuY3Rpb24gTzkoYSl7dGhp
+cy5iPWF9LApHYjpmdW5jdGlvbiBHYihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSVY6ZnVuY3Rpb24g
+SVYoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmQ9YQpfLmU9YgpfLmY9YwpfLnI9ZH19LE09ewpZRihhLGIp
+e3ZhciBzLHIscSxwLG8sbixtLGwKZm9yKHM9Yi5sZW5ndGgscj0xO3I8czsrK3Ipe2lmKGJbcl09PW51
+bGx8fGJbci0xXSE9bnVsbCljb250aW51ZQpmb3IoO3M+PTE7cz1xKXtxPXMtMQppZihiW3FdIT1udWxs
+KWJyZWFrfXA9bmV3IFAuTSgiIikKbz0iIisoYSsiKCIpCnAuYT1vCm49SC50NihiKQptPW4uQygibkg8
+MT4iKQpsPW5ldyBILm5IKGIsMCxzLG0pCmwuSGQoYiwwLHMsbi5jKQptPW8rbmV3IEgubEoobCxtLkMo
+InFVKGFMLkUpIikuYShuZXcgTS5ObygpKSxtLkMoImxKPGFMLkUscVU+IikpLmsoMCwiLCAiKQpwLmE9
+bQpwLmE9bSsoIik6IHBhcnQgIisoci0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAiK3IrIiB3YXMgbm90
+LiIpCnRocm93IEguYihQLnhZKHAudygwKSxudWxsKSl9fSwKbEk6ZnVuY3Rpb24gbEkoYSl7dGhpcy5h
+PWF9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0aW9uIE5vKCl7fX0sTz17ClJoKCl7dmFyIHMs
+cj1udWxsCmlmKFAudW8oKS5nRmkoKSE9PSJmaWxlIilyZXR1cm4gJC5FYigpCnM9UC51bygpCmlmKCFD
+LnhCLlRjKHMuZ0lpKHMpLCIvIikpcmV0dXJuICQuRWIoKQppZihQLktMKHIsImEvYiIscixyLHIscixy
+KS50NCgpPT09ImFcXGIiKXJldHVybiAkLktrKCkKcmV0dXJuICQuYkQoKX0sCnpMOmZ1bmN0aW9uIHpM
+KCl7fX0sUD17Ck9qKCl7dmFyIHMscixxPXt9CmlmKHNlbGYuc2NoZWR1bGVJbW1lZGlhdGUhPW51bGwp
+cmV0dXJuIFAuRVgoKQppZihzZWxmLk11dGF0aW9uT2JzZXJ2ZXIhPW51bGwmJnNlbGYuZG9jdW1lbnQh
+PW51bGwpe3M9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQpyPXNlbGYuZG9jdW1lbnQu
+Y3JlYXRlRWxlbWVudCgic3BhbiIpCnEuYT1udWxsCm5ldyBzZWxmLk11dGF0aW9uT2JzZXJ2ZXIoSC50
+UihuZXcgUC50aChxKSwxKSkub2JzZXJ2ZShzLHtjaGlsZExpc3Q6dHJ1ZX0pCnJldHVybiBuZXcgUC5o
+YShxLHMscil9ZWxzZSBpZihzZWxmLnNldEltbWVkaWF0ZSE9bnVsbClyZXR1cm4gUC55dCgpCnJldHVy
+biBQLnFXKCl9LApaVihhKXtzZWxmLnNjaGVkdWxlSW1tZWRpYXRlKEgudFIobmV3IFAuVnModC5NLmEo
+YSkpLDApKX0sCm9BKGEpe3NlbGYuc2V0SW1tZWRpYXRlKEgudFIobmV3IFAuRnQodC5NLmEoYSkpLDAp
+KX0sCkJ6KGEpe3QuTS5hKGEpClAuUU4oMCxhKX0sClFOKGEsYil7dmFyIHM9bmV3IFAuVzMoKQpzLkNZ
+KGEsYikKcmV0dXJuIHN9LApGWChhKXtyZXR1cm4gbmV3IFAuaWgobmV3IFAudnMoJC5YMyxhLkMoInZz
+PDA+IikpLGEuQygiaWg8MD4iKSl9LApESShhLGIpe2EuJDIoMCxudWxsKQpiLmI9ITAKcmV0dXJuIGIu
+YX0sCmpRKGEsYil7UC5KZShhLGIpfSwKeUMoYSxiKXtiLmFNKDAsYSl9LApmMyhhLGIpe2IudzAoSC5S
+dShhKSxILnRzKGEpKX0sCkplKGEsYil7dmFyIHMscixxPW5ldyBQLldNKGIpLHA9bmV3IFAuU1goYikK
+aWYoYSBpbnN0YW5jZW9mIFAudnMpYS5RZChxLHAsdC56KQplbHNle3M9dC56CmlmKHQuaS5iKGEpKWEu
+U3EocSxwLHMpCmVsc2V7cj1uZXcgUC52cygkLlgzLHQuYykKci5hPTgKci5jPWEKci5RZChxLHAscyl9
+fX0sCmx6KGEpe3ZhciBzPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7d2hpbGUodHJ1
+ZSl0cnl7YihkLGUpCmJyZWFrfWNhdGNoKHIpe2U9cgpkPWN9fX0oYSwxKQpyZXR1cm4gJC5YMy5Maihu
+ZXcgUC5HcyhzKSx0LkgsdC5TLHQueil9LApHUShhKXtyZXR1cm4gbmV3IFAuRnkoYSwxKX0sClRoKCl7
+cmV0dXJuIEMud1F9LApZbShhKXtyZXR1cm4gbmV3IFAuRnkoYSwzKX0sCmwwKGEsYil7cmV0dXJuIG5l
+dyBQLnE0KGEsYi5DKCJxNDwwPiIpKX0sClRsKGEsYil7dmFyIHM9SC5jYihhLCJlcnJvciIsdC5LKQpy
+ZXR1cm4gbmV3IFAuQ3cocyxiPT1udWxsP1AudjAoYSk6Yil9LAp2MChhKXt2YXIgcwppZih0LnIuYihh
+KSl7cz1hLmdJSSgpCmlmKHMhPW51bGwpcmV0dXJuIHN9cmV0dXJuIEMucGR9LApBOShhLGIpe3ZhciBz
+LHIscQpmb3Iocz10LmM7cj1hLmEsKHImNCkhPT0wOylhPXMuYShhLmMpCmlmKChyJjI0KSE9PTApe3E9
+Yi5haCgpCmIudWcoYSkKUC5IWihiLHEpfWVsc2V7cT10LmUuYShiLmMpCmIuYT1iLmEmMXw0CmIuYz1h
+CmEualEocSl9fSwKSFooYSxhMCl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYz17
+fSxiPWMuYT1hCmZvcihzPXQubixyPXQuZSxxPXQuaTshMDspe3A9e30Kbz1iLmEKbj0obyYxNik9PT0w
+Cm09IW4KaWYoYTA9PW51bGwpe2lmKG0mJihvJjEpPT09MCl7bD1zLmEoYi5jKQpQLlNpKGwuYSxsLmIp
+fXJldHVybn1wLmE9YTAKaz1hMC5hCmZvcihiPWEwO2shPW51bGw7Yj1rLGs9ail7Yi5hPW51bGwKUC5I
+WihjLmEsYikKcC5hPWsKaj1rLmF9bz1jLmEKaT1vLmMKcC5iPW0KcC5jPWkKaWYobil7aD1iLmMKaD0o
+aCYxKSE9PTB8fChoJjE1KT09PTh9ZWxzZSBoPSEwCmlmKGgpe2c9Yi5iLmIKaWYobSl7bz1vLmI9PT1n
+Cm89IShvfHxvKX1lbHNlIG89ITEKaWYobyl7cy5hKGkpClAuU2koaS5hLGkuYikKcmV0dXJufWY9JC5Y
+MwppZihmIT09ZykkLlgzPWcKZWxzZSBmPW51bGwKYj1iLmMKaWYoKGImMTUpPT09OCluZXcgUC5SVChw
+LGMsbSkuJDAoKQplbHNlIGlmKG4pe2lmKChiJjEpIT09MCluZXcgUC5ycShwLGkpLiQwKCl9ZWxzZSBp
+ZigoYiYyKSE9PTApbmV3IFAuUlcoYyxwKS4kMCgpCmlmKGYhPW51bGwpJC5YMz1mCmI9cC5jCmlmKHEu
+YihiKSl7bz1wLmEuJHRpCm89by5DKCJiODwyPiIpLmIoYil8fCFvLlFbMV0uYihiKX1lbHNlIG89ITEK
+aWYobyl7cS5hKGIpCmU9cC5hLmIKaWYoKGIuYSYyNCkhPT0wKXtkPXIuYShlLmMpCmUuYz1udWxsCmEw
+PWUuTjgoZCkKZS5hPWIuYSYzMHxlLmEmMQplLmM9Yi5jCmMuYT1iCmNvbnRpbnVlfWVsc2UgUC5BOShi
+LGUpCnJldHVybn19ZT1wLmEuYgpkPXIuYShlLmMpCmUuYz1udWxsCmEwPWUuTjgoZCkKYj1wLmIKbz1w
+LmMKaWYoIWIpe2UuJHRpLmMuYShvKQplLmE9OAplLmM9b31lbHNle3MuYShvKQplLmE9ZS5hJjF8MTYK
+ZS5jPW99Yy5hPWUKYj1lfX0sClZIKGEsYil7dmFyIHMKaWYodC5rLmIoYSkpcmV0dXJuIGIuTGooYSx0
+LnosdC5LLHQubCkKcz10LnYKaWYocy5iKGEpKXJldHVybiBzLmEoYSkKdGhyb3cgSC5iKFAuTDMoYSwi
+b25FcnJvciIsdS5jKSl9LApwdSgpe3ZhciBzLHIKZm9yKHM9JC5TNjtzIT1udWxsO3M9JC5TNil7JC5t
+Zz1udWxsCnI9cy5iCiQuUzY9cgppZihyPT1udWxsKSQuazg9bnVsbApzLmEuJDAoKX19LAplTigpeyQu
+VUQ9ITAKdHJ5e1AucHUoKX1maW5hbGx5eyQubWc9bnVsbAokLlVEPSExCmlmKCQuUzYhPW51bGwpJC51
+dCgpLiQxKFAuVUkoKSl9fSwKZVcoYSl7dmFyIHM9bmV3IFAuT00oYSkscj0kLms4CmlmKHI9PW51bGwp
+eyQuUzY9JC5rOD1zCmlmKCEkLlVEKSQudXQoKS4kMShQLlVJKCkpfWVsc2UgJC5rOD1yLmI9c30sCnJS
+KGEpe3ZhciBzLHIscSxwPSQuUzYKaWYocD09bnVsbCl7UC5lVyhhKQokLm1nPSQuazgKcmV0dXJufXM9
+bmV3IFAuT00oYSkKcj0kLm1nCmlmKHI9PW51bGwpe3MuYj1wCiQuUzY9JC5tZz1zfWVsc2V7cT1yLmIK
+cy5iPXEKJC5tZz1yLmI9cwppZihxPT1udWxsKSQuazg9c319LApyYihhKXt2YXIgcz1udWxsLHI9JC5Y
+MwppZihDLk5VPT09cil7UC5UayhzLHMsQy5OVSxhKQpyZXR1cm59UC5UayhzLHMscix0Lk0uYShyLkdZ
+KGEpKSl9LApRdyhhLGIpe0guY2IoYSwic3RyZWFtIix0LkspCnJldHVybiBuZXcgUC54SShiLkMoInhJ
+PDA+IikpfSwKU2koYSxiKXtQLnJSKG5ldyBQLkV2KGEsYikpfSwKVDgoYSxiLGMsZCxlKXt2YXIgcyxy
+PSQuWDMKaWYocj09PWMpcmV0dXJuIGQuJDAoKQokLlgzPWMKcz1yCnRyeXtyPWQuJDAoKQpyZXR1cm4g
+cn1maW5hbGx5eyQuWDM9c319LAp5dihhLGIsYyxkLGUsZixnKXt2YXIgcyxyPSQuWDMKaWYocj09PWMp
+cmV0dXJuIGQuJDEoZSkKJC5YMz1jCnM9cgp0cnl7cj1kLiQxKGUpCnJldHVybiByfWZpbmFsbHl7JC5Y
+Mz1zfX0sClF4KGEsYixjLGQsZSxmLGcsaCxpKXt2YXIgcyxyPSQuWDMKaWYocj09PWMpcmV0dXJuIGQu
+JDIoZSxmKQokLlgzPWMKcz1yCnRyeXtyPWQuJDIoZSxmKQpyZXR1cm4gcn1maW5hbGx5eyQuWDM9c319
+LApUayhhLGIsYyxkKXt0Lk0uYShkKQppZihDLk5VIT09YylkPWMuR1koZCkKUC5lVyhkKX0sCnRoOmZ1
+bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMu
+Yj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChh
+KXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9
+YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRp
+PWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1h
+fSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApGeTpmdW5jdGlvbiBGeShhLGIpe3RoaXMuYT1h
+CnRoaXMuYj1ifSwKR1Y6ZnVuY3Rpb24gR1YoYSxiKXt2YXIgXz10aGlzCl8uYT1hCl8uZD1fLmM9Xy5i
+PW51bGwKXy4kdGk9Yn0sCnE0OmZ1bmN0aW9uIHE0KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkN3
+OmZ1bmN0aW9uIEN3KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApQZjpmdW5jdGlvbiBQZigpe30sClpm
+OmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixj
+LGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwK
+dnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8uYT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9
+LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxi
+KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9uIHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rp
+b24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIK
+dGhpcy5jPWN9LApydDpmdW5jdGlvbiBydChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rp
+b24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpMOmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9
+YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9uIFJUKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
+Ygp0aGlzLmM9Y30sCmpaOmZ1bmN0aW9uIGpaKGEpe3RoaXMuYT1hfSwKcnE6ZnVuY3Rpb24gcnEoYSxi
+KXt0aGlzLmE9YQp0aGlzLmI9Yn0sClJXOmZ1bmN0aW9uIFJXKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9
+LApPTTpmdW5jdGlvbiBPTShhKXt0aGlzLmE9YQp0aGlzLmI9bnVsbH0sCnFoOmZ1bmN0aW9uIHFoKCl7
+fSwKQjU6ZnVuY3Rpb24gQjUoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnVPOmZ1bmN0aW9uIHVPKGEs
+Yil7dGhpcy5hPWEKdGhpcy5iPWJ9LApNTzpmdW5jdGlvbiBNTygpe30sCmtUOmZ1bmN0aW9uIGtUKCl7
+fSwKeEk6ZnVuY3Rpb24geEkoYSl7dGhpcy4kdGk9YX0sCm0wOmZ1bmN0aW9uIG0wKCl7fSwKRXY6ZnVu
+Y3Rpb24gRXYoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7fSwKVnA6ZnVu
+Y3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlz
+LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYyku
+QygiRm88MSwyPiIpLmEoSC5CNyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4i
+KSkpKX0sCkZsKGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4i
+KSl9LApMcyhhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJiNjwwPiIpKX0sClQyKCl7dmFyIHM9T2JqZWN0
+LmNyZWF0ZShudWxsKQpzWyI8bm9uLWlkZW50aWZpZXIta2V5PiJdPXMKZGVsZXRlIHNbIjxub24taWRl
+bnRpZmllci1rZXk+Il0KcmV0dXJuIHN9LApyaihhLGIsYyl7dmFyIHM9bmV3IFAubG0oYSxiLGMuQygi
+bG08MD4iKSkKcy5jPWEuZQpyZXR1cm4gc30sCkVQKGEsYixjKXt2YXIgcyxyCmlmKFAuaEIoYSkpe2lm
+KGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpyZXR1cm4gYisiLi4uIitjfXM9SC5RSShbXSx0
+LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEscyl9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aCly
+ZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9UC5sKGIsdC5hLmEocyksIiwgIikrYwpyZXR1
+cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCngoYSxiLGMpe3ZhciBzLHIKaWYoUC5oQihhKSlyZXR1
+cm4gYisiLi4uIitjCnM9bmV3IFAuTShiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cj1zCnIuYT1QLmwoci5h
+LGEsIiwgIil9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhn
+LnBvcCgpfXMuYSs9YwpyPXMuYQpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCmhCKGEpe3Zh
+ciBzLHIKZm9yKHM9JC54Zy5sZW5ndGgscj0wO3I8czsrK3IpaWYoYT09PSQueGdbcl0pcmV0dXJuITAK
+cmV0dXJuITF9LApWcihhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9YS5nbShhKSxrPTAsaj0wCndoaWxl
+KCEwKXtpZighKGs8ODB8fGo8MykpYnJlYWsKaWYoIWwuRigpKXJldHVybgpzPUguRWoobC5nbCgpKQpD
+Lk5tLmkoYixzKQprKz1zLmxlbmd0aCsyOysran1pZighbC5GKCkpe2lmKGo8PTUpcmV0dXJuCmlmKDA+
+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCnI9Yi5wb3AoKQppZigwPj1iLmxlbmd0aClyZXR1cm4g
+SC5PSChiLC0xKQpxPWIucG9wKCl9ZWxzZXtwPWwuZ2woKTsrK2oKaWYoIWwuRigpKXtpZihqPD00KXtD
+Lk5tLmkoYixILkVqKHApKQpyZXR1cm59cj1ILkVqKHApCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9I
+KGIsLTEpCnE9Yi5wb3AoKQprKz1yLmxlbmd0aCsyfWVsc2V7bz1sLmdsKCk7KytqCmZvcig7bC5GKCk7
+cD1vLG89bil7bj1sLmdsKCk7KytqCmlmKGo+MTAwKXt3aGlsZSghMCl7aWYoIShrPjc1JiZqPjMpKWJy
+ZWFrCmlmKDA+PWIubGVuZ3RoKXJldHVybiBILk9IKGIsLTEpCmstPWIucG9wKCkubGVuZ3RoKzI7LS1q
+fUMuTm0uaShiLCIuLi4iKQpyZXR1cm59fXE9SC5FaihwKQpyPUguRWoobykKays9ci5sZW5ndGgrcS5s
+ZW5ndGgrNH19aWYoaj5iLmxlbmd0aCsyKXtrKz01Cm09Ii4uLiJ9ZWxzZSBtPW51bGwKd2hpbGUoITAp
+e2lmKCEoaz44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwt
+MSkKay09Yi5wb3AoKS5sZW5ndGgrMgppZihtPT1udWxsKXtrKz01Cm09Ii4uLiJ9fWlmKG0hPW51bGwp
+Qy5ObS5pKGIsbSkKQy5ObS5pKGIscSkKQy5ObS5pKGIscil9LAp0TShhLGIpe3ZhciBzLHIscT1QLkxz
+KGIpCmZvcihzPWEubGVuZ3RoLHI9MDtyPGEubGVuZ3RoO2EubGVuZ3RoPT09c3x8KDAsSC5saykoYSks
+KytyKXEuaSgwLGIuYShhW3JdKSkKcmV0dXJuIHF9LApuTyhhKXt2YXIgcyxyPXt9CmlmKFAuaEIoYSkp
+cmV0dXJuInsuLi59IgpzPW5ldyBQLk0oIiIpCnRyeXtDLk5tLmkoJC54ZyxhKQpzLmErPSJ7IgpyLmE9
+ITAKYS5LKDAsbmV3IFAucmEocixzKSkKcy5hKz0ifSJ9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aCly
+ZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXI9cy5hCnJldHVybiByLmNoYXJDb2RlQXQoMCk9
+PTA/cjpyfSwKYjY6ZnVuY3Rpb24gYjYoYSl7dmFyIF89dGhpcwpfLmE9MApfLmY9Xy5lPV8uZD1fLmM9
+Xy5iPW51bGwKXy5yPTAKXy4kdGk9YX0sCmJuOmZ1bmN0aW9uIGJuKGEpe3RoaXMuYT1hCnRoaXMuYz10
+aGlzLmI9bnVsbH0sCmxtOmZ1bmN0aW9uIGxtKGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8u
+ZD1fLmM9bnVsbApfLiR0aT1jfSwKbVc6ZnVuY3Rpb24gbVcoKXt9LAp1eTpmdW5jdGlvbiB1eSgpe30s
+CmxEOmZ1bmN0aW9uIGxEKCl7fSwKaWw6ZnVuY3Rpb24gaWwoKXt9LApyYTpmdW5jdGlvbiByYShhLGIp
+e3RoaXMuYT1hCnRoaXMuYj1ifSwKWWs6ZnVuY3Rpb24gWWsoKXt9LAp5UTpmdW5jdGlvbiB5UShhKXt0
+aGlzLmE9YX0sCktQOmZ1bmN0aW9uIEtQKCl7fSwKUG46ZnVuY3Rpb24gUG4oKXt9LApHajpmdW5jdGlv
+biBHaihhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApsZjpmdW5jdGlvbiBsZigpe30sClZqOmZ1bmN0
+aW9uIFZqKCl7fSwKWHY6ZnVuY3Rpb24gWHYoKXt9LApuWTpmdW5jdGlvbiBuWSgpe30sCldZOmZ1bmN0
+aW9uIFdZKCl7fSwKUlU6ZnVuY3Rpb24gUlUoKXt9LApwUjpmdW5jdGlvbiBwUigpe30sCkJTKGEsYil7
+dmFyIHMscixxLHA9bnVsbAp0cnl7cD1KU09OLnBhcnNlKGEpfWNhdGNoKHIpe3M9SC5SdShyKQpxPVAu
+cnIoU3RyaW5nKHMpLG51bGwsbnVsbCkKdGhyb3cgSC5iKHEpfXE9UC5RZShwKQpyZXR1cm4gcX0sClFl
+KGEpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuIG51bGwKaWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVy
+biBhCmlmKE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSE9PUFycmF5LnByb3RvdHlwZSlyZXR1cm4gbmV3
+IFAudXcoYSxPYmplY3QuY3JlYXRlKG51bGwpKQpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWFbc109UC5R
+ZShhW3NdKQpyZXR1cm4gYX0sCmt5KGEsYixjLGQpe3ZhciBzLHIKaWYoYiBpbnN0YW5jZW9mIFVpbnQ4
+QXJyYXkpe3M9YgpkPXMubGVuZ3RoCmlmKGQtYzwxNSlyZXR1cm4gbnVsbApyPVAuUlAoYSxzLGMsZCkK
+aWYociE9bnVsbCYmYSlpZihyLmluZGV4T2YoIlx1ZmZmZCIpPj0wKXJldHVybiBudWxsCnJldHVybiBy
+fXJldHVybiBudWxsfSwKUlAoYSxiLGMsZCl7dmFyIHM9YT8kLkhHKCk6JC5yZigpCmlmKHM9PW51bGwp
+cmV0dXJuIG51bGwKaWYoMD09PWMmJmQ9PT1iLmxlbmd0aClyZXR1cm4gUC5SYihzLGIpCnJldHVybiBQ
+LlJiKHMsYi5zdWJhcnJheShjLFAuakIoYyxkLGIubGVuZ3RoKSkpfSwKUmIoYSxiKXt2YXIgcyxyCnRy
+eXtzPWEuZGVjb2RlKGIpCnJldHVybiBzfWNhdGNoKHIpe0guUnUocil9cmV0dXJuIG51bGx9LAp4TShh
+LGIsYyxkLGUsZil7aWYoQy5qbi56WShmLDQpIT09MCl0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNl
+NjQgcGFkZGluZywgcGFkZGVkIGxlbmd0aCBtdXN0IGJlIG11bHRpcGxlIG9mIGZvdXIsIGlzICIrZixh
+LGMpKQppZihkK2UhPT1mKXRocm93IEguYihQLnJyKCJJbnZhbGlkIGJhc2U2NCBwYWRkaW5nLCAnPScg
+bm90IGF0IHRoZSBlbmQiLGEsYikpCmlmKGU+Mil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQg
+cGFkZGluZywgbW9yZSB0aGFuIHR3byAnPScgY2hhcmFjdGVycyIsYSxiKSl9LApHeShhLGIsYyl7cmV0
+dXJuIG5ldyBQLlVkKGEsYil9LApOQyhhKXtyZXR1cm4gYS5MdCgpfSwKVWcoYSxiKXtyZXR1cm4gbmV3
+IFAudHUoYSxbXSxQLkN5KCkpfSwKdVgoYSxiLGMpe3ZhciBzLHI9bmV3IFAuTSgiIikscT1QLlVnKHIs
+YikKcS5pVShhKQpzPXIuYQpyZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCmo0KGEpe3N3aXRj
+aChhKXtjYXNlIDY1OnJldHVybiJNaXNzaW5nIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY3OnJldHVybiJV
+bmV4cGVjdGVkIGV4dGVuc2lvbiBieXRlIgpjYXNlIDY5OnJldHVybiJJbnZhbGlkIFVURi04IGJ5dGUi
+CmNhc2UgNzE6cmV0dXJuIk92ZXJsb25nIGVuY29kaW5nIgpjYXNlIDczOnJldHVybiJPdXQgb2YgdW5p
+Y29kZSByYW5nZSIKY2FzZSA3NTpyZXR1cm4iRW5jb2RlZCBzdXJyb2dhdGUiCmNhc2UgNzc6cmV0dXJu
+IlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2UiCmRlZmF1bHQ6cmV0dXJuIiJ9fSwKankoYSxi
+LGMpe3ZhciBzLHIscSxwPWMtYixvPW5ldyBVaW50OEFycmF5KHApCmZvcihzPUouVTYoYSkscj0wO3I8
+cDsrK3Ipe3E9cy5xKGEsYityKQppZigocSY0Mjk0OTY3MDQwKT4+PjAhPT0wKXE9MjU1CmlmKHI+PXAp
+cmV0dXJuIEguT0gobyxyKQpvW3JdPXF9cmV0dXJuIG99LAp1dzpmdW5jdGlvbiB1dyhhLGIpe3RoaXMu
+YT1hCnRoaXMuYj1iCnRoaXMuYz1udWxsfSwKaTg6ZnVuY3Rpb24gaTgoYSl7dGhpcy5hPWF9LAp4cjpm
+dW5jdGlvbiB4cigpe30sCk56OmZ1bmN0aW9uIE56KCl7fSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpm
+dW5jdGlvbiBVOCgpe30sClVrOmZ1bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpm
+dW5jdGlvbiBaaSgpe30sClVkOmZ1bmN0aW9uIFVkKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApLODpm
+dW5jdGlvbiBLOChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKYnk6ZnVuY3Rpb24gYnkoKXt9LApvajpm
+dW5jdGlvbiBvaihhKXt0aGlzLmI9YX0sCk14OmZ1bmN0aW9uIE14KGEpe3RoaXMuYT1hfSwKU2g6ZnVu
+Y3Rpb24gU2goKXt9LAp0aTpmdW5jdGlvbiB0aShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdHU6ZnVu
+Y3Rpb24gdHUoYSxiLGMpe3RoaXMuYz1hCnRoaXMuYT1iCnRoaXMuYj1jfSwKdTU6ZnVuY3Rpb24gdTUo
+KXt9LApFMzpmdW5jdGlvbiBFMygpe30sClJ3OmZ1bmN0aW9uIFJ3KGEpe3RoaXMuYj0wCnRoaXMuYz1h
+fSwKR1k6ZnVuY3Rpb24gR1koYSl7dGhpcy5hPWF9LApiejpmdW5jdGlvbiBieihhKXt0aGlzLmE9YQp0
+aGlzLmI9MTYKdGhpcy5jPTB9LApRQShhLGIpe3ZhciBzPUguSHAoYSxiKQppZihzIT1udWxsKXJldHVy
+biBzCnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApvcyhhKXtpZihhIGluc3RhbmNlb2YgSC5U
+cClyZXR1cm4gYS53KDApCnJldHVybiJJbnN0YW5jZSBvZiAnIitILmxoKGEpKyInIn0sCk84KGEsYixj
+LGQpe3ZhciBzLHI9Yz9KLktoKGEsZCk6Si5RaShhLGQpCmlmKGEhPT0wJiZiIT1udWxsKWZvcihzPTA7
+czxyLmxlbmd0aDsrK3MpcltzXT1iCnJldHVybiByfSwKUFcoYSxiLGMpe3ZhciBzLHI9SC5RSShbXSxj
+LkMoImpkPDA+IikpCmZvcihzPUouSVQoYSk7cy5GKCk7KUMuTm0uaShyLGMuYShzLmdsKCkpKQppZihi
+KXJldHVybiByCnJldHVybiBKLkVwKHIsYyl9LApZMShhLGIsYyl7dmFyIHMKaWYoYilyZXR1cm4gUC5l
+dihhLGMpCnM9Si5FcChQLmV2KGEsYyksYykKcmV0dXJuIHN9LApldihhLGIpe3ZhciBzLHIKaWYoQXJy
+YXkuaXNBcnJheShhKSlyZXR1cm4gSC5RSShhLnNsaWNlKDApLGIuQygiamQ8MD4iKSkKcz1ILlFJKFtd
+LGIuQygiamQ8MD4iKSkKZm9yKHI9Si5JVChhKTtyLkYoKTspQy5ObS5pKHMsci5nbCgpKQpyZXR1cm4g
+c30sCkFGKGEsYil7cmV0dXJuIEouekMoUC5QVyhhLCExLGIpKX0sCkhNKGEsYixjKXt2YXIgcz1ILmZ3
+KGEsYixQLmpCKGIsYyxhLmxlbmd0aCkpCnJldHVybiBzfSwKT28oYSl7cmV0dXJuIEguTHcoYSl9LApu
+dShhKXtyZXR1cm4gbmV3IEguVlIoYSxILnY0KGEsITEsITAsITEsITEsITEpKX0sCmwoYSxiLGMpe3Zh
+ciBzPUouSVQoYikKaWYoIXMuRigpKXJldHVybiBhCmlmKGMubGVuZ3RoPT09MCl7ZG8gYSs9SC5Faihz
+LmdsKCkpCndoaWxlKHMuRigpKX1lbHNle2ErPUguRWoocy5nbCgpKQpmb3IoO3MuRigpOylhPWErYytI
+LkVqKHMuZ2woKSl9cmV0dXJuIGF9LApscihhLGIsYyxkKXtyZXR1cm4gbmV3IFAubXAoYSxiLGMsZCl9
+LAp1bygpe3ZhciBzPUguTTAoKQppZihzIT1udWxsKXJldHVybiBQLmhLKHMpCnRocm93IEguYihQLkw0
+KCInVXJpLmJhc2UnIGlzIG5vdCBzdXBwb3J0ZWQiKSl9LAplUChhLGIsYyxkKXt2YXIgcyxyLHEscCxv
+LG4sbT0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYz09PUMueE0pe3M9JC56NCgpLmIKcz1zLnRlc3QoYil9
+ZWxzZSBzPSExCmlmKHMpcmV0dXJuIGIKSC5MaChjKS5DKCJVay5TIikuYShiKQpyPWMuZ1pFKCkuV0oo
+YikKZm9yKHM9ci5sZW5ndGgscT0wLHA9IiI7cTxzOysrcSl7bz1yW3FdCmlmKG88MTI4KXtuPW8+Pj40
+CmlmKG4+PTgpcmV0dXJuIEguT0goYSxuKQpuPShhW25dJjE8PChvJjE1KSkhPT0wfWVsc2Ugbj0hMQpp
+ZihuKXArPUguTHcobykKZWxzZSBwPWQmJm89PT0zMj9wKyIrIjpwKyIlIittW28+Pj40JjE1XSttW28m
+MTVdfXJldHVybiBwLmNoYXJDb2RlQXQoMCk9PTA/cDpwfSwKR3EoYSl7dmFyIHM9TWF0aC5hYnMoYSks
+cj1hPDA/Ii0iOiIiCmlmKHM+PTEwMDApcmV0dXJuIiIrYQppZihzPj0xMDApcmV0dXJuIHIrIjAiK3MK
+aWYocz49MTApcmV0dXJuIHIrIjAwIitzCnJldHVybiByKyIwMDAiK3N9LApWeChhKXtpZihhPj0xMDAp
+cmV0dXJuIiIrYQppZihhPj0xMClyZXR1cm4iMCIrYQpyZXR1cm4iMDAiK2F9LApoMChhKXtpZihhPj0x
+MClyZXR1cm4iIithCnJldHVybiIwIithfSwKaGwoYSl7aWYodHlwZW9mIGE9PSJudW1iZXIifHxILnJR
+KGEpfHxhPT1udWxsKXJldHVybiBKLncoYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09O
+LnN0cmluZ2lmeShhKQpyZXR1cm4gUC5vcyhhKX0sCmhWKGEpe3JldHVybiBuZXcgUC5DNihhKX0sCnhZ
+KGEsYil7cmV0dXJuIG5ldyBQLkFUKCExLG51bGwsYixhKX0sCkwzKGEsYixjKXtyZXR1cm4gbmV3IFAu
+QVQoITAsYSxiLGMpfSwKTzcoYSxiKXtyZXR1cm4gbmV3IFAuYkoobnVsbCxudWxsLCEwLGEsYiwiVmFs
+dWUgbm90IGluIHJhbmdlIil9LApURShhLGIsYyxkLGUpe3JldHVybiBuZXcgUC5iSihiLGMsITAsYSxk
+LCJJbnZhbGlkIHZhbHVlIil9LAp3QShhLGIsYyxkKXtpZihhPGJ8fGE+Yyl0aHJvdyBILmIoUC5URShh
+LGIsYyxkLG51bGwpKQpyZXR1cm4gYX0sCmpCKGEsYixjKXtpZigwPmF8fGE+Yyl0aHJvdyBILmIoUC5U
+RShhLDAsYywic3RhcnQiLG51bGwpKQppZihiIT1udWxsKXtpZihhPmJ8fGI+Yyl0aHJvdyBILmIoUC5U
+RShiLGEsYywiZW5kIixudWxsKSkKcmV0dXJuIGJ9cmV0dXJuIGN9LAprMShhLGIpe2lmKGE8MCl0aHJv
+dyBILmIoUC5URShhLDAsbnVsbCxiLG51bGwpKQpyZXR1cm4gYX0sCkNmKGEsYixjLGQsZSl7dmFyIHM9
+SC5JWihlPT1udWxsP0ouSG0oYik6ZSkKcmV0dXJuIG5ldyBQLmVZKHMsITAsYSxjLCJJbmRleCBvdXQg
+b2YgcmFuZ2UiKX0sCkw0KGEpe3JldHVybiBuZXcgUC51YihhKX0sClNZKGEpe3JldHVybiBuZXcgUC5k
+cyhhKX0sClBWKGEpe3JldHVybiBuZXcgUC5saihhKX0sCmE0KGEpe3JldHVybiBuZXcgUC5VVihhKX0s
+CnJyKGEsYixjKXtyZXR1cm4gbmV3IFAuYUUoYSxiLGMpfSwKaEsoYTUpe3ZhciBzLHIscSxwLG8sbixt
+LGwsayxqLGksaCxnLGYsZSxkLGMsYixhLGEwLGExLGEyLGEzPW51bGwsYTQ9YTUubGVuZ3RoCmlmKGE0
+Pj01KXtzPSgoQy54Qi5XKGE1LDQpXjU4KSozfEMueEIuVyhhNSwwKV4xMDB8Qy54Qi5XKGE1LDEpXjk3
+fEMueEIuVyhhNSwyKV4xMTZ8Qy54Qi5XKGE1LDMpXjk3KT4+PjAKaWYocz09PTApcmV0dXJuIFAuS0Qo
+YTQ8YTQ/Qy54Qi5OaihhNSwwLGE0KTphNSw1LGEzKS5nbFIoKQplbHNlIGlmKHM9PT0zMilyZXR1cm4g
+UC5LRChDLnhCLk5qKGE1LDUsYTQpLDAsYTMpLmdsUigpfXI9UC5POCg4LDAsITEsdC5TKQpDLk5tLlk1
+KHIsMCwwKQpDLk5tLlk1KHIsMSwtMSkKQy5ObS5ZNShyLDIsLTEpCkMuTm0uWTUociw3LC0xKQpDLk5t
+Llk1KHIsMywwKQpDLk5tLlk1KHIsNCwwKQpDLk5tLlk1KHIsNSxhNCkKQy5ObS5ZNShyLDYsYTQpCmlm
+KFAuVUIoYTUsMCxhNCwwLHIpPj0xNClDLk5tLlk1KHIsNyxhNCkKcT1yWzFdCmlmKHE+PTApaWYoUC5V
+QihhNSwwLHEsMjAscik9PT0yMClyWzddPXEKcD1yWzJdKzEKbz1yWzNdCm49cls0XQptPXJbNV0KbD1y
+WzZdCmlmKGw8bSltPWwKaWYobjxwKW49bQplbHNlIGlmKG48PXEpbj1xKzEKaWYobzxwKW89bgprPXJb
+N108MAppZihrKWlmKHA+cSszKXtqPWEzCms9ITF9ZWxzZXtpPW8+MAppZihpJiZvKzE9PT1uKXtqPWEz
+Cms9ITF9ZWxzZXtpZighKG08YTQmJm09PT1uKzImJkMueEIuUWkoYTUsIi4uIixuKSkpaD1tPm4rMiYm
+Qy54Qi5RaShhNSwiLy4uIixtLTMpCmVsc2UgaD0hMAppZihoKXtqPWEzCms9ITF9ZWxzZXtpZihxPT09
+NClpZihDLnhCLlFpKGE1LCJmaWxlIiwwKSl7aWYocDw9MCl7aWYoIUMueEIuUWkoYTUsIi8iLG4pKXtn
+PSJmaWxlOi8vLyIKcz0zfWVsc2V7Zz0iZmlsZTovLyIKcz0yfWE1PWcrQy54Qi5OaihhNSxuLGE0KQpx
+LT0wCmk9cy0wCm0rPWkKbCs9aQphND1hNS5sZW5ndGgKcD03Cm89NwpuPTd9ZWxzZSBpZihuPT09bSl7
+KytsCmY9bSsxCmE1PUMueEIuaTcoYTUsbixtLCIvIik7KythNAptPWZ9aj0iZmlsZSJ9ZWxzZSBpZihD
+LnhCLlFpKGE1LCJodHRwIiwwKSl7aWYoaSYmbyszPT09biYmQy54Qi5RaShhNSwiODAiLG8rMSkpe2wt
+PTMKZT1uLTMKbS09MwphNT1DLnhCLmk3KGE1LG8sbiwiIikKYTQtPTMKbj1lfWo9Imh0dHAifWVsc2Ug
+aj1hMwplbHNlIGlmKHE9PT01JiZDLnhCLlFpKGE1LCJodHRwcyIsMCkpe2lmKGkmJm8rND09PW4mJkMu
+eEIuUWkoYTUsIjQ0MyIsbysxKSl7bC09NAplPW4tNAptLT00CmE1PUMueEIuaTcoYTUsbyxuLCIiKQph
+NC09MwpuPWV9aj0iaHR0cHMifWVsc2Ugaj1hMwprPSEwfX19ZWxzZSBqPWEzCmlmKGspe2lmKGE0PGE1
+Lmxlbmd0aCl7YTU9Qy54Qi5OaihhNSwwLGE0KQpxLT0wCnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1y
+ZXR1cm4gbmV3IFAuVWYoYTUscSxwLG8sbixtLGwsail9aWYoaj09bnVsbClpZihxPjApaj1QLlBpKGE1
+LDAscSkKZWxzZXtpZihxPT09MClQLlIzKGE1LDAsIkludmFsaWQgZW1wdHkgc2NoZW1lIikKaj0iIn1p
+ZihwPjApe2Q9cSszCmM9ZDxwP1AuelIoYTUsZCxwLTEpOiIiCmI9UC5PZShhNSxwLG8sITEpCmk9bysx
+CmlmKGk8bil7YT1ILkhwKEMueEIuTmooYTUsaSxuKSxhMykKYTA9UC53QihhPT1udWxsP0gudihQLnJy
+KCJJbnZhbGlkIHBvcnQiLGE1LGkpKTphLGopfWVsc2UgYTA9YTN9ZWxzZXthMD1hMwpiPWEwCmM9IiJ9
+YTE9UC5rYShhNSxuLG0sYTMsaixiIT1udWxsKQphMj1tPGw/UC5sZShhNSxtKzEsbCxhMyk6YTMKcmV0
+dXJuIG5ldyBQLkRuKGosYyxiLGEwLGExLGEyLGw8YTQ/UC50RyhhNSxsKzEsYTQpOmEzKX0sCk10KGEp
+e0gubihhKQpyZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWChhKXt2YXIgcz10Lk4K
+cmV0dXJuIEMuTm0uTjAoSC5RSShhLnNwbGl0KCImIiksdC5zKSxQLkZsKHMscyksbmV3IFAubjEoQy54
+TSksdC5jayl9LApIaChhLGIsYyl7dmFyIHMscixxLHAsbyxuLG09IklQdjQgYWRkcmVzcyBzaG91bGQg
+Y29udGFpbiBleGFjdGx5IDQgcGFydHMiLGw9ImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSAw
+Li4yNTUiLGs9bmV3IFAuY1MoYSksaj1uZXcgVWludDhBcnJheSg0KQpmb3Iocz1iLHI9cyxxPTA7czxj
+Oysrcyl7cD1DLnhCLk8oYSxzKQppZihwIT09NDYpe2lmKChwXjQ4KT45KWsuJDIoImludmFsaWQgY2hh
+cmFjdGVyIixzKX1lbHNle2lmKHE9PT0zKWsuJDIobSxzKQpvPVAuUUEoQy54Qi5OaihhLHIscyksbnVs
+bCkKaWYobz4yNTUpay4kMihsLHIpCm49cSsxCmlmKHE+PTQpcmV0dXJuIEguT0goaixxKQpqW3FdPW8K
+cj1zKzEKcT1ufX1pZihxIT09MylrLiQyKG0sYykKbz1QLlFBKEMueEIuTmooYSxyLGMpLG51bGwpCmlm
+KG8+MjU1KWsuJDIobCxyKQppZihxPj00KXJldHVybiBILk9IKGoscSkKaltxXT1vCnJldHVybiBqfSwK
+ZWcoYSxiLGEwKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcgUC5WQyhhKSxj
+PW5ldyBQLkpUKGQsYSkKaWYoYS5sZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBzaG9ydCIpCnM9
+SC5RSShbXSx0LnQpCmZvcihyPWIscT1yLHA9ITEsbz0hMTtyPGEwOysrcil7bj1DLnhCLk8oYSxyKQpp
+ZihuPT09NTgpe2lmKHI9PT1iKXsrK3IKaWYoQy54Qi5PKGEscikhPT01OClkLiQyKCJpbnZhbGlkIHN0
+YXJ0IGNvbG9uLiIscikKcT1yfWlmKHI9PT1xKXtpZihwKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6
+OmAgaXMgYWxsb3dlZCIscikKQy5ObS5pKHMsLTEpCnA9ITB9ZWxzZSBDLk5tLmkocyxjLiQyKHEscikp
+CnE9cisxfWVsc2UgaWYobj09PTQ2KW89ITB9aWYocy5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFy
+dHMiKQptPXE9PT1hMApsPUMuTm0uZ3JaKHMpCmlmKG0mJmwhPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBh
+cnQgYWZ0ZXIgbGFzdCBgOmAiLGEwKQppZighbSlpZighbylDLk5tLmkocyxjLiQyKHEsYTApKQplbHNl
+e2s9UC5IaChhLHEsYTApCkMuTm0uaShzLChrWzBdPDw4fGtbMV0pPj4+MCkKQy5ObS5pKHMsKGtbMl08
+PDh8a1szXSk+Pj4wKX1pZihwKXtpZihzLmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdp
+bGRjYXJkIG11c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYocy5sZW5ndGghPT04KWQu
+JDEoImFuIGFkZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFy
+dHMiKQpqPW5ldyBVaW50OEFycmF5KDE2KQpmb3IobD1zLmxlbmd0aCxpPTktbCxyPTAsaD0wO3I8bDsr
+K3Ipe2c9c1tyXQppZihnPT09LTEpZm9yKGY9MDtmPGk7KytmKXtpZihoPDB8fGg+PTE2KXJldHVybiBI
+Lk9IKGosaCkKaltoXT0wCmU9aCsxCmlmKGU+PTE2KXJldHVybiBILk9IKGosZSkKaltlXT0wCmgrPTJ9
+ZWxzZXtlPUMuam4ud0coZyw4KQppZihoPDB8fGg+PTE2KXJldHVybiBILk9IKGosaCkKaltoXT1lCmU9
+aCsxCmlmKGU+PTE2KXJldHVybiBILk9IKGosZSkKaltlXT1nJjI1NQpoKz0yfX1yZXR1cm4gan0sCktM
+KGEsYixjLGQsZSxmLGcpe3ZhciBzLHIscSxwLG8sbgpmPWY9PW51bGw/IiI6UC5QaShmLDAsZi5sZW5n
+dGgpCmc9UC56UihnLDAsZz09bnVsbD8wOmcubGVuZ3RoKQphPVAuT2UoYSwwLGE9PW51bGw/MDphLmxl
+bmd0aCwhMSkKcz1QLmxlKG51bGwsMCwwLGUpCnI9UC50RyhudWxsLDAsMCkKZD1QLndCKGQsZikKcT1m
+PT09ImZpbGUiCmlmKGE9PW51bGwpcD1nLmxlbmd0aCE9PTB8fGQhPW51bGx8fHEKZWxzZSBwPSExCmlm
+KHApYT0iIgpwPWE9PW51bGwKbz0hcApiPVAua2EoYiwwLGI9PW51bGw/MDpiLmxlbmd0aCxjLGYsbykK
+bj1mLmxlbmd0aD09PTAKaWYobiYmcCYmIUMueEIubihiLCIvIikpYj1QLndGKGIsIW58fG8pCmVsc2Ug
+Yj1QLnhlKGIpCnJldHVybiBuZXcgUC5EbihmLGcscCYmQy54Qi5uKGIsIi8vIik/IiI6YSxkLGIscyxy
+KX0sCndLKGEpe2lmKGE9PT0iaHR0cCIpcmV0dXJuIDgwCmlmKGE9PT0iaHR0cHMiKXJldHVybiA0NDMK
+cmV0dXJuIDB9LApOUihhLGIpe3ZhciBzLHIscSxwLG8sbgpmb3Iocz1hLmxlbmd0aCxyPTA7cjxzOysr
+cil7cT1DLnhCLlcoYSxyKQpwPUMueEIuVyhiLHIpCm89cV5wCmlmKG8hPT0wKXtpZihvPT09MzIpe249
+cHxvCmlmKDk3PD1uJiZuPD0xMjIpY29udGludWV9cmV0dXJuITF9fXJldHVybiEwfSwKUjMoYSxiLGMp
+e3Rocm93IEguYihQLnJyKGMsYSxiKSl9LApYZChhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4sbSxsLGss
+aixpLGg9bnVsbCxnPWIubGVuZ3RoCmlmKGchPT0wKXtxPTAKd2hpbGUoITApe2lmKCEocTxnKSl7cz0i
+IgpyPTAKYnJlYWt9aWYoQy54Qi5XKGIscSk9PT02NCl7cz1DLnhCLk5qKGIsMCxxKQpyPXErMQpicmVh
+a30rK3F9aWYocjxnJiZDLnhCLlcoYixyKT09PTkxKXtmb3IocD1yLG89LTE7cDxnOysrcCl7bj1DLnhC
+LlcoYixwKQppZihuPT09MzcmJm88MCl7bT1DLnhCLlFpKGIsIjI1IixwKzEpP3ArMjpwCm89cApwPW19
+ZWxzZSBpZihuPT09OTMpYnJlYWt9aWYocD09PWcpdGhyb3cgSC5iKFAucnIoIkludmFsaWQgSVB2NiBo
+b3N0IGVudHJ5LiIsYixyKSkKbD1vPDA/cDpvClAuZWcoYixyKzEsbCk7KytwCmlmKHAhPT1nJiZDLnhC
+LlcoYixwKSE9PTU4KXRocm93IEguYihQLnJyKCJJbnZhbGlkIGVuZCBvZiBhdXRob3JpdHkiLGIscCkp
+fWVsc2UgcD1yCndoaWxlKCEwKXtpZighKHA8Zykpe2s9aApicmVha31pZihDLnhCLlcoYixwKT09PTU4
+KXtqPUMueEIueW4oYixwKzEpCms9ai5sZW5ndGghPT0wP1AuUUEoaixoKTpoCmJyZWFrfSsrcH1pPUMu
+eEIuTmooYixyLHApfWVsc2V7az1oCmk9awpzPSIifXJldHVybiBQLktMKGksaCxILlFJKGMuc3BsaXQo
+Ii8iKSx0LnMpLGssZCxhLHMpfSwKa0UoYSxiKXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9
+MDtyPHM7KytyKXtxPWFbcl0KcD1KLlU2KHEpCm89cC5nQShxKQppZigwPm8pSC52KFAuVEUoMCwwLHAu
+Z0EocSksbnVsbCxudWxsKSkKaWYoSC5TUShxLCIvIiwwKSl7cz1QLkw0KCJJbGxlZ2FsIHBhdGggY2hh
+cmFjdGVyICIrSC5FaihxKSkKdGhyb3cgSC5iKHMpfX19LApITihhLGIsYyl7dmFyIHMscixxLHAKZm9y
+KHM9SC5xQyhhLGMsbnVsbCxILnQ2KGEpLmMpLHI9cy4kdGkscz1uZXcgSC5hNyhzLHMuZ0Eocyksci5D
+KCJhNzxhTC5FPiIpKSxyPXIuQygiYUwuRSIpO3MuRigpOyl7cT1yLmEocy5kKQpwPVAubnUoJ1siKi86
+PD4/XFxcXHxdJykKaWYoSC5TUShxLHAsMCkpe3M9UC5MNCgiSWxsZWdhbCBjaGFyYWN0ZXIgaW4gcGF0
+aDogIitxKQp0aHJvdyBILmIocyl9fX0sCnJnKGEsYil7dmFyIHMKaWYoISg2NTw9YSYmYTw9OTApKXM9
+OTc8PWEmJmE8PTEyMgplbHNlIHM9ITAKaWYocylyZXR1cm4Kcz1QLkw0KCJJbGxlZ2FsIGRyaXZlIGxl
+dHRlciAiK1AuT28oYSkpCnRocm93IEguYihzKX0sCndCKGEsYil7aWYoYSE9bnVsbCYmYT09PVAud0so
+YikpcmV0dXJuIG51bGwKcmV0dXJuIGF9LApPZShhLGIsYyxkKXt2YXIgcyxyLHEscCxvLG4KaWYoYT09
+bnVsbClyZXR1cm4gbnVsbAppZihiPT09YylyZXR1cm4iIgppZihDLnhCLk8oYSxiKT09PTkxKXtzPWMt
+MQppZihDLnhCLk8oYSxzKSE9PTkzKVAuUjMoYSxiLCJNaXNzaW5nIGVuZCBgXWAgdG8gbWF0Y2ggYFtg
+IGluIGhvc3QiKQpyPWIrMQpxPVAudG8oYSxyLHMpCmlmKHE8cyl7cD1xKzEKbz1QLk9BKGEsQy54Qi5R
+aShhLCIyNSIscCk/cSszOnAscywiJTI1Iil9ZWxzZSBvPSIiClAuZWcoYSxyLHEpCnJldHVybiBDLnhC
+Lk5qKGEsYixxKS50b0xvd2VyQ2FzZSgpK28rIl0ifWZvcihuPWI7bjxjOysrbilpZihDLnhCLk8oYSxu
+KT09PTU4KXtxPUMueEIuWFUoYSwiJSIsYikKcT1xPj1iJiZxPGM/cTpjCmlmKHE8Yyl7cD1xKzEKbz1Q
+Lk9BKGEsQy54Qi5RaShhLCIyNSIscCk/cSszOnAsYywiJTI1Iil9ZWxzZSBvPSIiClAuZWcoYSxiLHEp
+CnJldHVybiJbIitDLnhCLk5qKGEsYixxKStvKyJdIn1yZXR1cm4gUC5PTChhLGIsYyl9LAp0byhhLGIs
+Yyl7dmFyIHM9Qy54Qi5YVShhLCIlIixiKQpyZXR1cm4gcz49YiYmczxjP3M6Y30sCk9BKGEsYixjLGQp
+e3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGk9ZCE9PSIiP25ldyBQLk0oZCk6bnVsbApmb3Iocz1iLHI9
+cyxxPSEwO3M8Yzspe3A9Qy54Qi5PKGEscykKaWYocD09PTM3KXtvPVAucnYoYSxzLCEwKQpuPW89PW51
+bGwKaWYobiYmcSl7cys9Mwpjb250aW51ZX1pZihpPT1udWxsKWk9bmV3IFAuTSgiIikKbT1pLmErPUMu
+eEIuTmooYSxyLHMpCmlmKG4pbz1DLnhCLk5qKGEscyxzKzMpCmVsc2UgaWYobz09PSIlIilQLlIzKGEs
+cywiWm9uZUlEIHNob3VsZCBub3QgY29udGFpbiAlIGFueW1vcmUiKQppLmE9bStvCnMrPTMKcj1zCnE9
+ITB9ZWxzZXtpZihwPDEyNyl7bj1wPj4+NAppZihuPj04KXJldHVybiBILk9IKEMuRjMsbikKbj0oQy5G
+M1tuXSYxPDwocCYxNSkpIT09MH1lbHNlIG49ITEKaWYobil7aWYocSYmNjU8PXAmJjkwPj1wKXtpZihp
+PT1udWxsKWk9bmV3IFAuTSgiIikKaWYocjxzKXtpLmErPUMueEIuTmooYSxyLHMpCnI9c31xPSExfSsr
+c31lbHNle2lmKChwJjY0NTEyKT09PTU1Mjk2JiZzKzE8Yyl7bD1DLnhCLk8oYSxzKzEpCmlmKChsJjY0
+NTEyKT09PTU2MzIwKXtwPShwJjEwMjMpPDwxMHxsJjEwMjN8NjU1MzYKaz0yfWVsc2Ugaz0xfWVsc2Ug
+az0xCmo9Qy54Qi5OaihhLHIscykKaWYoaT09bnVsbCl7aT1uZXcgUC5NKCIiKQpuPWl9ZWxzZSBuPWkK
+bi5hKz1qCm4uYSs9UC56WChwKQpzKz1rCnI9c319fWlmKGk9PW51bGwpcmV0dXJuIEMueEIuTmooYSxi
+LGMpCmlmKHI8YylpLmErPUMueEIuTmooYSxyLGMpCm49aS5hCnJldHVybiBuLmNoYXJDb2RlQXQoMCk9
+PTA/bjpufSwKT0woYSxiLGMpe3ZhciBzLHIscSxwLG8sbixtLGwsayxqLGkKZm9yKHM9YixyPXMscT1u
+dWxsLHA9ITA7czxjOyl7bz1DLnhCLk8oYSxzKQppZihvPT09Mzcpe249UC5ydihhLHMsITApCm09bj09
+bnVsbAppZihtJiZwKXtzKz0zCmNvbnRpbnVlfWlmKHE9PW51bGwpcT1uZXcgUC5NKCIiKQpsPUMueEIu
+TmooYSxyLHMpCms9cS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6bAppZihtKXtuPUMueEIuTmooYSxzLHMr
+MykKaj0zfWVsc2UgaWYobj09PSIlIil7bj0iJTI1IgpqPTF9ZWxzZSBqPTMKcS5hPWsrbgpzKz1qCnI9
+cwpwPSEwfWVsc2V7aWYobzwxMjcpe209bz4+PjQKaWYobT49OClyZXR1cm4gSC5PSChDLmVhLG0pCm09
+KEMuZWFbbV0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBtPSExCmlmKG0pe2lmKHAmJjY1PD1vJiY5MD49byl7
+aWYocT09bnVsbClxPW5ldyBQLk0oIiIpCmlmKHI8cyl7cS5hKz1DLnhCLk5qKGEscixzKQpyPXN9cD0h
+MX0rK3N9ZWxzZXtpZihvPD05Myl7bT1vPj4+NAppZihtPj04KXJldHVybiBILk9IKEMuYWssbSkKbT0o
+Qy5ha1ttXSYxPDwobyYxNSkpIT09MH1lbHNlIG09ITEKaWYobSlQLlIzKGEscywiSW52YWxpZCBjaGFy
+YWN0ZXIiKQplbHNle2lmKChvJjY0NTEyKT09PTU1Mjk2JiZzKzE8Yyl7aT1DLnhCLk8oYSxzKzEpCmlm
+KChpJjY0NTEyKT09PTU2MzIwKXtvPShvJjEwMjMpPDwxMHxpJjEwMjN8NjU1MzYKaj0yfWVsc2Ugaj0x
+fWVsc2Ugaj0xCmw9Qy54Qi5OaihhLHIscykKaWYoIXApbD1sLnRvTG93ZXJDYXNlKCkKaWYocT09bnVs
+bCl7cT1uZXcgUC5NKCIiKQptPXF9ZWxzZSBtPXEKbS5hKz1sCm0uYSs9UC56WChvKQpzKz1qCnI9c319
+fX1pZihxPT1udWxsKXJldHVybiBDLnhCLk5qKGEsYixjKQppZihyPGMpe2w9Qy54Qi5OaihhLHIsYykK
+cS5hKz0hcD9sLnRvTG93ZXJDYXNlKCk6bH1tPXEuYQpyZXR1cm4gbS5jaGFyQ29kZUF0KDApPT0wP206
+bX0sClBpKGEsYixjKXt2YXIgcyxyLHEscAppZihiPT09YylyZXR1cm4iIgppZighUC5FdChDLnhCLlco
+YSxiKSkpUC5SMyhhLGIsIlNjaGVtZSBub3Qgc3RhcnRpbmcgd2l0aCBhbHBoYWJldGljIGNoYXJhY3Rl
+ciIpCmZvcihzPWIscj0hMTtzPGM7KytzKXtxPUMueEIuVyhhLHMpCmlmKHE8MTI4KXtwPXE+Pj40Cmlm
+KHA+PTgpcmV0dXJuIEguT0goQy5tSyxwKQpwPShDLm1LW3BdJjE8PChxJjE1KSkhPT0wfWVsc2UgcD0h
+MQppZighcClQLlIzKGEscywiSWxsZWdhbCBzY2hlbWUgY2hhcmFjdGVyIikKaWYoNjU8PXEmJnE8PTkw
+KXI9ITB9YT1DLnhCLk5qKGEsYixjKQpyZXR1cm4gUC5ZYShyP2EudG9Mb3dlckNhc2UoKTphKX0sCllh
+KGEpe2lmKGE9PT0iaHR0cCIpcmV0dXJuImh0dHAiCmlmKGE9PT0iZmlsZSIpcmV0dXJuImZpbGUiCmlm
+KGE9PT0iaHR0cHMiKXJldHVybiJodHRwcyIKaWYoYT09PSJwYWNrYWdlIilyZXR1cm4icGFja2FnZSIK
+cmV0dXJuIGF9LAp6UihhLGIsYyl7aWYoYT09bnVsbClyZXR1cm4iIgpyZXR1cm4gUC5QSShhLGIsYyxD
+LnRvLCExKX0sCmthKGEsYixjLGQsZSxmKXt2YXIgcyxyLHE9ZT09PSJmaWxlIixwPXF8fGYKaWYoYT09
+bnVsbCl7aWYoZD09bnVsbClyZXR1cm4gcT8iLyI6IiIKcz1ILnQ2KGQpCnI9bmV3IEgubEooZCxzLkMo
+InFVKDEpIikuYShuZXcgUC5SWigpKSxzLkMoImxKPDEscVU+IikpLmsoMCwiLyIpfWVsc2UgaWYoZCE9
+bnVsbCl0aHJvdyBILmIoUC54WSgiQm90aCBwYXRoIGFuZCBwYXRoU2VnbWVudHMgc3BlY2lmaWVkIixu
+dWxsKSkKZWxzZSByPVAuUEkoYSxiLGMsQy5XZCwhMCkKaWYoci5sZW5ndGg9PT0wKXtpZihxKXJldHVy
+biIvIn1lbHNlIGlmKHAmJiFDLnhCLm4ociwiLyIpKXI9Ii8iK3IKcmV0dXJuIFAuSnIocixlLGYpfSwK
+SnIoYSxiLGMpe3ZhciBzPWIubGVuZ3RoPT09MAppZihzJiYhYyYmIUMueEIubihhLCIvIikpcmV0dXJu
+IFAud0YoYSwhc3x8YykKcmV0dXJuIFAueGUoYSl9LApsZShhLGIsYyxkKXt2YXIgcyxyPXt9CmlmKGEh
+PW51bGwpe2lmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoIkJvdGggcXVlcnkgYW5kIHF1ZXJ5UGFyYW1l
+dGVycyBzcGVjaWZpZWQiLG51bGwpKQpyZXR1cm4gUC5QSShhLGIsYyxDLlZDLCEwKX1pZihkPT1udWxs
+KXJldHVybiBudWxsCnM9bmV3IFAuTSgiIikKci5hPSIiCmQuSygwLG5ldyBQLnk1KG5ldyBQLk1FKHIs
+cykpKQpyPXMuYQpyZXR1cm4gci5jaGFyQ29kZUF0KDApPT0wP3I6cn0sCnRHKGEsYixjKXtpZihhPT1u
+dWxsKXJldHVybiBudWxsCnJldHVybiBQLlBJKGEsYixjLEMuVkMsITApfSwKcnYoYSxiLGMpe3ZhciBz
+LHIscSxwLG8sbj1iKzIKaWYobj49YS5sZW5ndGgpcmV0dXJuIiUiCnM9Qy54Qi5PKGEsYisxKQpyPUMu
+eEIuTyhhLG4pCnE9SC5vbyhzKQpwPUgub28ocikKaWYocTwwfHxwPDApcmV0dXJuIiUiCm89cSoxNitw
+CmlmKG88MTI3KXtuPUMuam4ud0cobyw0KQppZihuPj04KXJldHVybiBILk9IKEMuRjMsbikKbj0oQy5G
+M1tuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKaWYobilyZXR1cm4gSC5MdyhjJiY2NTw9byYmOTA+
+PW8/KG98MzIpPj4+MDpvKQppZihzPj05N3x8cj49OTcpcmV0dXJuIEMueEIuTmooYSxiLGIrMykudG9V
+cHBlckNhc2UoKQpyZXR1cm4gbnVsbH0sCnpYKGEpe3ZhciBzLHIscSxwLG8sbixtLGwsaz0iMDEyMzQ1
+Njc4OUFCQ0RFRiIKaWYoYTwxMjgpe3M9bmV3IFVpbnQ4QXJyYXkoMykKc1swXT0zNwpzWzFdPUMueEIu
+VyhrLGE+Pj40KQpzWzJdPUMueEIuVyhrLGEmMTUpfWVsc2V7aWYoYT4yMDQ3KWlmKGE+NjU1MzUpe3I9
+MjQwCnE9NH1lbHNle3I9MjI0CnE9M31lbHNle3I9MTkyCnE9Mn1wPTMqcQpzPW5ldyBVaW50OEFycmF5
+KHApCmZvcihvPTA7LS1xLHE+PTA7cj0xMjgpe249Qy5qbi5iZihhLDYqcSkmNjN8cgppZihvPj1wKXJl
+dHVybiBILk9IKHMsbykKc1tvXT0zNwptPW8rMQpsPUMueEIuVyhrLG4+Pj40KQppZihtPj1wKXJldHVy
+biBILk9IKHMsbSkKc1ttXT1sCmw9bysyCm09Qy54Qi5XKGssbiYxNSkKaWYobD49cClyZXR1cm4gSC5P
+SChzLGwpCnNbbF09bQpvKz0zfX1yZXR1cm4gUC5ITShzLDAsbnVsbCl9LApQSShhLGIsYyxkLGUpe3Zh
+ciBzPVAuVWwoYSxiLGMsZCxlKQpyZXR1cm4gcz09bnVsbD9DLnhCLk5qKGEsYixjKTpzfSwKVWwoYSxi
+LGMsZCxlKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaj1udWxsCmZvcihzPSFlLHI9YixxPXIscD1qO3I8
+Yzspe289Qy54Qi5PKGEscikKaWYobzwxMjcpe249bz4+PjQKaWYobj49OClyZXR1cm4gSC5PSChkLG4p
+Cm49KGRbbl0mMTw8KG8mMTUpKSE9PTB9ZWxzZSBuPSExCmlmKG4pKytyCmVsc2V7aWYobz09PTM3KXtt
+PVAucnYoYSxyLCExKQppZihtPT1udWxsKXtyKz0zCmNvbnRpbnVlfWlmKCIlIj09PW0pe209IiUyNSIK
+bD0xfWVsc2UgbD0zfWVsc2V7aWYocylpZihvPD05Myl7bj1vPj4+NAppZihuPj04KXJldHVybiBILk9I
+KEMuYWssbikKbj0oQy5ha1tuXSYxPDwobyYxNSkpIT09MH1lbHNlIG49ITEKZWxzZSBuPSExCmlmKG4p
+e1AuUjMoYSxyLCJJbnZhbGlkIGNoYXJhY3RlciIpCmw9agptPWx9ZWxzZXtpZigobyY2NDUxMik9PT01
+NTI5Nil7bj1yKzEKaWYobjxjKXtrPUMueEIuTyhhLG4pCmlmKChrJjY0NTEyKT09PTU2MzIwKXtvPShv
+JjEwMjMpPDwxMHxrJjEwMjN8NjU1MzYKbD0yfWVsc2UgbD0xfWVsc2UgbD0xfWVsc2UgbD0xCm09UC56
+WChvKX19aWYocD09bnVsbCl7cD1uZXcgUC5NKCIiKQpuPXB9ZWxzZSBuPXAKbi5hKz1DLnhCLk5qKGEs
+cSxyKQpuLmErPUguRWoobSkKaWYodHlwZW9mIGwhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShsKQpyKz1s
+CnE9cn19aWYocD09bnVsbClyZXR1cm4gagppZihxPGMpcC5hKz1DLnhCLk5qKGEscSxjKQpzPXAuYQpy
+ZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCnlCKGEpe2lmKEMueEIubihhLCIuIikpcmV0dXJu
+ITAKcmV0dXJuIEMueEIuT1koYSwiLy4iKSE9PS0xfSwKeGUoYSl7dmFyIHMscixxLHAsbyxuLG0KaWYo
+IVAueUIoYSkpcmV0dXJuIGEKcz1ILlFJKFtdLHQucykKZm9yKHI9YS5zcGxpdCgiLyIpLHE9ci5sZW5n
+dGgscD0hMSxvPTA7bzxxOysrbyl7bj1yW29dCmlmKEouUk0obiwiLi4iKSl7bT1zLmxlbmd0aAppZiht
+IT09MCl7aWYoMD49bSlyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCmlmKHMubGVuZ3RoPT09MClDLk5t
+LmkocywiIil9cD0hMH1lbHNlIGlmKCIuIj09PW4pcD0hMAplbHNle0MuTm0uaShzLG4pCnA9ITF9fWlm
+KHApQy5ObS5pKHMsIiIpCnJldHVybiBDLk5tLmsocywiLyIpfSwKd0YoYSxiKXt2YXIgcyxyLHEscCxv
+LG4KaWYoIVAueUIoYSkpcmV0dXJuIWI/UC5DMShhKTphCnM9SC5RSShbXSx0LnMpCmZvcihyPWEuc3Bs
+aXQoIi8iKSxxPXIubGVuZ3RoLHA9ITEsbz0wO288cTsrK28pe249cltvXQppZigiLi4iPT09bilpZihz
+Lmxlbmd0aCE9PTAmJkMuTm0uZ3JaKHMpIT09Ii4uIil7aWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0go
+cywtMSkKcy5wb3AoKQpwPSEwfWVsc2V7Qy5ObS5pKHMsIi4uIikKcD0hMX1lbHNlIGlmKCIuIj09PW4p
+cD0hMAplbHNle0MuTm0uaShzLG4pCnA9ITF9fXI9cy5sZW5ndGgKaWYociE9PTApaWYocj09PTEpe2lm
+KDA+PXIpcmV0dXJuIEguT0gocywwKQpyPXNbMF0ubGVuZ3RoPT09MH1lbHNlIHI9ITEKZWxzZSByPSEw
+CmlmKHIpcmV0dXJuIi4vIgppZihwfHxDLk5tLmdyWihzKT09PSIuLiIpQy5ObS5pKHMsIiIpCmlmKCFi
+KXtpZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDApCkMuTm0uWTUocywwLFAuQzEoc1swXSkpfXJl
+dHVybiBDLk5tLmsocywiLyIpfSwKQzEoYSl7dmFyIHMscixxLHA9YS5sZW5ndGgKaWYocD49MiYmUC5F
+dChDLnhCLlcoYSwwKSkpZm9yKHM9MTtzPHA7KytzKXtyPUMueEIuVyhhLHMpCmlmKHI9PT01OClyZXR1
+cm4gQy54Qi5OaihhLDAscykrIiUzQSIrQy54Qi55bihhLHMrMSkKaWYocjw9MTI3KXtxPXI+Pj40Cmlm
+KHE+PTgpcmV0dXJuIEguT0goQy5tSyxxKQpxPShDLm1LW3FdJjE8PChyJjE1KSk9PT0wfWVsc2UgcT0h
+MAppZihxKWJyZWFrfXJldHVybiBhfSwKdWooYSxiKXtpZihhLmhCKCJwYWNrYWdlIikmJmEuYz09bnVs
+bClyZXR1cm4gUC5mRihiLDAsYi5sZW5ndGgpCnJldHVybi0xfSwKbW4oYSl7dmFyIHMscixxLHA9YS5n
+RmooKSxvPXAubGVuZ3RoCmlmKG8+MCYmSi5IbShwWzBdKT09PTImJkouYTYocFswXSwxKT09PTU4KXtp
+ZigwPj1vKXJldHVybiBILk9IKHAsMCkKUC5yZyhKLmE2KHBbMF0sMCksITEpClAuSE4ocCwhMSwxKQpz
+PSEwfWVsc2V7UC5ITihwLCExLDApCnM9ITF9cj1hLmd0VCgpJiYhcz8iIisiXFwiOiIiCmlmKGEuZ2Nq
+KCkpe3E9YS5nSmYoYSkKaWYocS5sZW5ndGghPT0wKXI9cisiXFwiK3ErIlxcIn1yPVAubChyLHAsIlxc
+IikKbz1zJiZvPT09MT9yKyJcXCI6cgpyZXR1cm4gby5jaGFyQ29kZUF0KDApPT0wP286b30sCkloKGEs
+Yil7dmFyIHMscixxCmZvcihzPTAscj0wO3I8MjsrK3Ipe3E9Qy54Qi5XKGEsYityKQppZig0ODw9cSYm
+cTw9NTcpcz1zKjE2K3EtNDgKZWxzZXtxfD0zMgppZig5Nzw9cSYmcTw9MTAyKXM9cyoxNitxLTg3CmVs
+c2UgdGhyb3cgSC5iKFAueFkoIkludmFsaWQgVVJMIGVuY29kaW5nIixudWxsKSl9fXJldHVybiBzfSwK
+a3UoYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvPWIKd2hpbGUoITApe2lmKCEobzxjKSl7cz0hMApicmVh
+a31yPUMueEIuVyhhLG8pCmlmKHI8PTEyNylpZihyIT09MzcpcT1lJiZyPT09NDMKZWxzZSBxPSEwCmVs
+c2UgcT0hMAppZihxKXtzPSExCmJyZWFrfSsrb31pZihzKXtpZihDLnhNIT09ZClxPSExCmVsc2UgcT0h
+MAppZihxKXJldHVybiBDLnhCLk5qKGEsYixjKQplbHNlIHA9bmV3IEgucWooQy54Qi5OaihhLGIsYykp
+fWVsc2V7cD1ILlFJKFtdLHQudCkKZm9yKHE9YS5sZW5ndGgsbz1iO288YzsrK28pe3I9Qy54Qi5XKGEs
+bykKaWYocj4xMjcpdGhyb3cgSC5iKFAueFkoIklsbGVnYWwgcGVyY2VudCBlbmNvZGluZyBpbiBVUkki
+LG51bGwpKQppZihyPT09Mzcpe2lmKG8rMz5xKXRocm93IEguYihQLnhZKCJUcnVuY2F0ZWQgVVJJIixu
+dWxsKSkKQy5ObS5pKHAsUC5JaChhLG8rMSkpCm8rPTJ9ZWxzZSBpZihlJiZyPT09NDMpQy5ObS5pKHAs
+MzIpCmVsc2UgQy5ObS5pKHAscil9fXQuTC5hKHApCnJldHVybiBDLm9FLldKKHApfSwKRXQoYSl7dmFy
+IHM9YXwzMgpyZXR1cm4gOTc8PXMmJnM8PTEyMn0sCktEKGEsYixjKXt2YXIgcyxyLHEscCxvLG4sbSxs
+LGs9IkludmFsaWQgTUlNRSB0eXBlIixqPUguUUkoW2ItMV0sdC50KQpmb3Iocz1hLmxlbmd0aCxyPWIs
+cT0tMSxwPW51bGw7cjxzOysrcil7cD1DLnhCLlcoYSxyKQppZihwPT09NDR8fHA9PT01OSlicmVhawpp
+ZihwPT09NDcpe2lmKHE8MCl7cT1yCmNvbnRpbnVlfXRocm93IEguYihQLnJyKGssYSxyKSl9fWlmKHE8
+MCYmcj5iKXRocm93IEguYihQLnJyKGssYSxyKSkKZm9yKDtwIT09NDQ7KXtDLk5tLmkoaixyKTsrK3IK
+Zm9yKG89LTE7cjxzOysrcil7cD1DLnhCLlcoYSxyKQppZihwPT09NjEpe2lmKG88MClvPXJ9ZWxzZSBp
+ZihwPT09NTl8fHA9PT00NClicmVha31pZihvPj0wKUMuTm0uaShqLG8pCmVsc2V7bj1DLk5tLmdyWihq
+KQppZihwIT09NDR8fHIhPT1uKzd8fCFDLnhCLlFpKGEsImJhc2U2NCIsbisxKSl0aHJvdyBILmIoUC5y
+cigiRXhwZWN0aW5nICc9JyIsYSxyKSkKYnJlYWt9fUMuTm0uaShqLHIpCm09cisxCmlmKChqLmxlbmd0
+aCYxKT09PTEpYT1DLmg5LnlyKGEsbSxzKQplbHNle2w9UC5VbChhLG0scyxDLlZDLCEwKQppZihsIT1u
+dWxsKWE9Qy54Qi5pNyhhLG0scyxsKX1yZXR1cm4gbmV3IFAuUEUoYSxqLGMpfSwKS04oKXt2YXIgcyxy
+LHEscCxvLG4sbT0iMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamts
+bW5vcHFyc3R1dnd4eXotLl9+ISQmJygpKissOz0iLGw9Ii4iLGs9IjoiLGo9Ii8iLGk9Ij8iLGg9IiMi
+LGc9SC5RSShuZXcgQXJyYXkoMjIpLHQuZ04pCmZvcihzPTA7czwyMjsrK3MpZ1tzXT1uZXcgVWludDhB
+cnJheSg5NikKcj1uZXcgUC55SShnKQpxPW5ldyBQLmM2KCkKcD1uZXcgUC5xZCgpCm89dC5nYwpuPW8u
+YShyLiQyKDAsMjI1KSkKcS4kMyhuLG0sMSkKcS4kMyhuLGwsMTQpCnEuJDMobixrLDM0KQpxLiQzKG4s
+aiwzKQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNCwyMjUpKQpxLiQzKG4s
+bSwxKQpxLiQzKG4sbCwxNSkKcS4kMyhuLGssMzQpCnEuJDMobixqLDIzNCkKcS4kMyhuLGksMTcyKQpx
+LiQzKG4saCwyMDUpCm49by5hKHIuJDIoMTUsMjI1KSkKcS4kMyhuLG0sMSkKcS4kMyhuLCIlIiwyMjUp
+CnEuJDMobixrLDM0KQpxLiQzKG4saiw5KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEo
+ci4kMigxLDIyNSkpCnEuJDMobixtLDEpCnEuJDMobixrLDM0KQpxLiQzKG4saiwxMCkKcS4kMyhuLGks
+MTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoMiwyMzUpKQpxLiQzKG4sbSwxMzkpCnEuJDMobixq
+LDEzMSkKcS4kMyhuLGwsMTQ2KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigz
+LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4saiw2OCkKcS4kMyhuLGwsMTgpCnEuJDMobixpLDE3MikK
+cS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDQsMjI5KSkKcS4kMyhuLG0sNSkKcC4kMyhuLCJBWiIsMjI5
+KQpxLiQzKG4saywxMDIpCnEuJDMobiwiQCIsNjgpCnEuJDMobiwiWyIsMjMyKQpxLiQzKG4saiwxMzgp
+CnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpuPW8uYShyLiQyKDUsMjI5KSkKcS4kMyhuLG0sNSkK
+cC4kMyhuLCJBWiIsMjI5KQpxLiQzKG4saywxMDIpCnEuJDMobiwiQCIsNjgpCnEuJDMobixqLDEzOCkK
+cS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoNiwyMzEpKQpwLiQzKG4sIjE5Iiw3
+KQpxLiQzKG4sIkAiLDY4KQpxLiQzKG4saiwxMzgpCnEuJDMobixpLDE3MikKcS4kMyhuLGgsMjA1KQpu
+PW8uYShyLiQyKDcsMjMxKSkKcC4kMyhuLCIwOSIsNykKcS4kMyhuLCJAIiw2OCkKcS4kMyhuLGosMTM4
+KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKcS4kMyhvLmEoci4kMig4LDgpKSwiXSIsNSkKbj1v
+LmEoci4kMig5LDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxNikKcS4kMyhuLGosMjM0KQpxLiQz
+KG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxNiwyMzUpKQpxLiQzKG4sbSwxMSkKcS4k
+MyhuLGwsMTcpCnEuJDMobixqLDIzNCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUpCm49by5hKHIu
+JDIoMTcsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDkpCnEuJDMobixpLDE3MikKcS4kMyhuLGgs
+MjA1KQpuPW8uYShyLiQyKDEwLDIzNSkpCnEuJDMobixtLDExKQpxLiQzKG4sbCwxOCkKcS4kMyhuLGos
+MjM0KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxOCwyMzUpKQpxLiQzKG4s
+bSwxMSkKcS4kMyhuLGwsMTkpCnEuJDMobixqLDIzNCkKcS4kMyhuLGksMTcyKQpxLiQzKG4saCwyMDUp
+Cm49by5hKHIuJDIoMTksMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDIzNCkKcS4kMyhuLGksMTcy
+KQpxLiQzKG4saCwyMDUpCm49by5hKHIuJDIoMTEsMjM1KSkKcS4kMyhuLG0sMTEpCnEuJDMobixqLDEw
+KQpxLiQzKG4saSwxNzIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxMiwyMzYpKQpxLiQzKG4sbSwx
+MikKcS4kMyhuLGksMTIpCnEuJDMobixoLDIwNSkKbj1vLmEoci4kMigxMywyMzcpKQpxLiQzKG4sbSwx
+MykKcS4kMyhuLGksMTMpCnAuJDMoby5hKHIuJDIoMjAsMjQ1KSksImF6IiwyMSkKcj1vLmEoci4kMigy
+MSwyNDUpKQpwLiQzKHIsImF6IiwyMSkKcC4kMyhyLCIwOSIsMjEpCnEuJDMociwiKy0uIiwyMSkKcmV0
+dXJuIGd9LApVQihhLGIsYyxkLGUpe3ZhciBzLHIscSxwLG89JC52WigpCmZvcihzPWI7czxjOysrcyl7
+aWYoZDwwfHxkPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLGQpCnI9b1tkXQpxPUMueEIuVyhhLHMpXjk2
+CnA9cltxPjk1PzMxOnFdCmQ9cCYzMQpDLk5tLlk1KGUscD4+PjUscyl9cmV0dXJuIGR9LApSeChhKXtp
+ZihhLmI9PT03JiZDLnhCLm4oYS5hLCJwYWNrYWdlIikmJmEuYzw9MClyZXR1cm4gUC5mRihhLmEsYS5l
+LGEuZikKcmV0dXJuLTF9LApmRihhLGIsYyl7dmFyIHMscixxCmZvcihzPWIscj0wO3M8YzsrK3Mpe3E9
+Qy54Qi5PKGEscykKaWYocT09PTQ3KXJldHVybiByIT09MD9zOi0xCmlmKHE9PT0zN3x8cT09PTU4KXJl
+dHVybi0xCnJ8PXFeNDZ9cmV0dXJuLTF9LApXRjpmdW5jdGlvbiBXRihhLGIpe3RoaXMuYT1hCnRoaXMu
+Yj1ifSwKaVA6ZnVuY3Rpb24gaVAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClhTOmZ1bmN0aW9uIFhT
+KCl7fSwKQzY6ZnVuY3Rpb24gQzYoYSl7dGhpcy5hPWF9LApFejpmdW5jdGlvbiBFeigpe30sCkY6ZnVu
+Y3Rpb24gRigpe30sCkFUOmZ1bmN0aW9uIEFUKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
+Xy5jPWMKXy5kPWR9LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmU9YQpf
+LmY9YgpfLmE9YwpfLmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9uIGVZKGEsYixjLGQsZSl7dmFy
+IF89dGhpcwpfLmY9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1wOmZ1bmN0aW9uIG1wKGEsYixj
+LGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1YjpmdW5jdGlvbiB1YihhKXt0
+aGlzLmE9YX0sCmRzOmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6ZnVuY3Rpb24gbGooYSl7dGhp
+cy5hPWF9LApVVjpmdW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1bmN0aW9uIGs1KCl7fSwKS1k6
+ZnVuY3Rpb24gS1koKXt9LApwOmZ1bmN0aW9uIHAoYSl7dGhpcy5hPWF9LApDRDpmdW5jdGlvbiBDRChh
+KXt0aGlzLmE9YX0sCmFFOmZ1bmN0aW9uIGFFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
+Y30sCmNYOmZ1bmN0aW9uIGNYKCl7fSwKQW46ZnVuY3Rpb24gQW4oKXt9LApOMzpmdW5jdGlvbiBOMyhh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy4kdGk9Y30sCmM4OmZ1bmN0aW9uIGM4KCl7fSwKTWg6
+ZnVuY3Rpb24gTWgoKXt9LApaZDpmdW5jdGlvbiBaZCgpe30sCk06ZnVuY3Rpb24gTShhKXt0aGlzLmE9
+YX0sCm4xOmZ1bmN0aW9uIG4xKGEpe3RoaXMuYT1hfSwKY1M6ZnVuY3Rpb24gY1MoYSl7dGhpcy5hPWF9
+LApWQzpmdW5jdGlvbiBWQyhhKXt0aGlzLmE9YX0sCkpUOmZ1bmN0aW9uIEpUKGEsYil7dGhpcy5hPWEK
+dGhpcy5iPWJ9LApEbjpmdW5jdGlvbiBEbihhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8u
+Yj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKUlo6
+ZnVuY3Rpb24gUlooKXt9LApNRTpmdW5jdGlvbiBNRShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKeTU6
+ZnVuY3Rpb24geTUoYSl7dGhpcy5hPWF9LApQRTpmdW5jdGlvbiBQRShhLGIsYyl7dGhpcy5hPWEKdGhp
+cy5iPWIKdGhpcy5jPWN9LAp5STpmdW5jdGlvbiB5SShhKXt0aGlzLmE9YX0sCmM2OmZ1bmN0aW9uIGM2
+KCl7fSwKcWQ6ZnVuY3Rpb24gcWQoKXt9LApVZjpmdW5jdGlvbiBVZihhLGIsYyxkLGUsZixnLGgpe3Zh
+ciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PWgKXy55
+PW51bGx9LApxZTpmdW5jdGlvbiBxZShhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1i
+Cl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8ucj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKaUo6ZnVu
+Y3Rpb24gaUooKXt9LApFMjpmdW5jdGlvbiBFMihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKamc6ZnVu
+Y3Rpb24gamcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkJmOmZ1bmN0aW9uIEJmKGEsYil7dGhpcy5h
+PWEKdGhpcy5iPWJ9LApBczpmdW5jdGlvbiBBcygpe30sCkdFOmZ1bmN0aW9uIEdFKGEpe3RoaXMuYT1h
+fSwKTjc6ZnVuY3Rpb24gTjcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnVROmZ1bmN0aW9uIHVRKCl7
+fSwKaEY6ZnVuY3Rpb24gaEYoKXt9LApSNChhLGIsYyxkKXt2YXIgcyxyLHEKSC5wOChiKQp0LmouYShk
+KQppZihiKXtzPVtjXQpDLk5tLkZWKHMsZCkKZD1zfXI9dC56CnE9UC5QVyhKLk0xKGQsUC53MCgpLHIp
+LCEwLHIpCnQuWS5hKGEpCnJldHVybiBQLndZKEguRWsoYSxxLG51bGwpKX0sCkRtKGEsYixjKXt2YXIg
+cwp0cnl7aWYoT2JqZWN0LmlzRXh0ZW5zaWJsZShhKSYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJv
+cGVydHkuY2FsbChhLGIpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjfSkKcmV0dXJu
+ITB9fWNhdGNoKHMpe0guUnUocyl9cmV0dXJuITF9LApPbShhLGIpe2lmKE9iamVjdC5wcm90b3R5cGUu
+aGFzT3duUHJvcGVydHkuY2FsbChhLGIpKXJldHVybiBhW2JdCnJldHVybiBudWxsfSwKd1koYSl7aWYo
+YT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fEguclEoYSkpcmV0
+dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAuRTQpcmV0dXJuIGEuYQppZihILlI5KGEpKXJldHVybiBhCmlm
+KHQuYWsuYihhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gSC5vMihhKQppZih0
+LlkuYihhKSlyZXR1cm4gUC5oRShhLCIkZGFydF9qc0Z1bmN0aW9uIixuZXcgUC5EVigpKQpyZXR1cm4g
+UC5oRShhLCJfJGRhcnRfanNPYmplY3QiLG5ldyBQLlBDKCQua0koKSkpfSwKaEUoYSxiLGMpe3ZhciBz
+PVAuT20oYSxiKQppZihzPT1udWxsKXtzPWMuJDEoYSkKUC5EbShhLGIscyl9cmV0dXJuIHN9LApkVShh
+KXt2YXIgcyxyCmlmKGE9PW51bGx8fHR5cGVvZiBhPT0ic3RyaW5nInx8dHlwZW9mIGE9PSJudW1iZXIi
+fHx0eXBlb2YgYT09ImJvb2xlYW4iKXJldHVybiBhCmVsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCYm
+SC5SOShhKSlyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3QmJnQuYWsuYihhKSlyZXR1
+cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBEYXRlKXtzPUguSVooYS5nZXRUaW1lKCkpCmlmKE1hdGgu
+YWJzKHMpPD04NjRlMTMpcj0hMQplbHNlIHI9ITAKaWYocilILnYoUC54WSgiRGF0ZVRpbWUgaXMgb3V0
+c2lkZSB2YWxpZCByYW5nZTogIitzLG51bGwpKQpILmNiKCExLCJpc1V0YyIsdC55KQpyZXR1cm4gbmV3
+IFAuaVAocywhMSl9ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09JC5rSSgpKXJldHVybiBhLm8KZWxzZSBy
+ZXR1cm4gUC5ORChhKX0sCk5EKGEpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBQLmlRKGEs
+JC56KCksbmV3IFAuUVMoKSkKaWYoYSBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBQLmlRKGEsJC5SOCgp
+LG5ldyBQLm5wKCkpCnJldHVybiBQLmlRKGEsJC5SOCgpLG5ldyBQLlV0KCkpfSwKaVEoYSxiLGMpe3Zh
+ciBzPVAuT20oYSxiKQppZihzPT1udWxsfHwhKGEgaW5zdGFuY2VvZiBPYmplY3QpKXtzPWMuJDEoYSkK
+UC5EbShhLGIscyl9cmV0dXJuIHN9LApEVjpmdW5jdGlvbiBEVigpe30sClBDOmZ1bmN0aW9uIFBDKGEp
+e3RoaXMuYT1hfSwKUVM6ZnVuY3Rpb24gUVMoKXt9LApucDpmdW5jdGlvbiBucCgpe30sClV0OmZ1bmN0
+aW9uIFV0KCl7fSwKRTQ6ZnVuY3Rpb24gRTQoYSl7dGhpcy5hPWF9LApyNzpmdW5jdGlvbiByNyhhKXt0
+aGlzLmE9YX0sClR6OmZ1bmN0aW9uIFR6KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCnZnOmZ1bmN0
+aW9uIHZnKCl7fSwKbmQ6ZnVuY3Rpb24gbmQoKXt9LApLZTpmdW5jdGlvbiBLZShhKXt0aGlzLmE9YX0s
+CmhpOmZ1bmN0aW9uIGhpKCl7fX0sUj17Cm56KGEpe3ZhciBzPUguVWMoYS5xKDAsIm5vZGVJZCIpKQpy
+ZXR1cm4gbmV3IFIuTEwoQy5ObS5IdChDLnJrLG5ldyBSLk1EKGEpKSxzKX0sCk9YKGEpe3N3aXRjaChh
+KXtjYXNlIEMuQWQ6cmV0dXJuIkFkZCAvKj8qLyBoaW50IgpjYXNlIEMubmU6cmV0dXJuIkFkZCAvKiEq
+LyBoaW50IgpjYXNlIEMud1Y6cmV0dXJuIlJlbW92ZSAvKj8qLyBoaW50IgpjYXNlIEMuZlI6cmV0dXJu
+IlJlbW92ZSAvKiEqLyBoaW50IgpjYXNlIEMubXk6cmV0dXJuIkNoYW5nZSB0byAvKj8qLyBoaW50Igpj
+YXNlIEMucng6cmV0dXJuIkNoYW5nZSB0byAvKiEqLyBoaW50In19LApMTDpmdW5jdGlvbiBMTChhLGIp
+e3RoaXMuYT1hCnRoaXMuYj1ifSwKTUQ6ZnVuY3Rpb24gTUQoYSl7dGhpcy5hPWF9LApINzpmdW5jdGlv
+biBINyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifX0sVD17bVE6ZnVuY3Rpb24gbVEoKXt9fSxVPXsKamYo
+YSl7dmFyIHMscixxLHAKaWYoYT09bnVsbClzPW51bGwKZWxzZXtzPUguUUkoW10sdC5mQSkKZm9yKHI9
+Si5JVChhKTtyLkYoKTspe3E9ci5nbCgpCnA9Si5VNihxKQpzLnB1c2gobmV3IFUuU2UoSC5rKHAucShx
+LCJkZXNjcmlwdGlvbiIpKSxILmsocC5xKHEsImhyZWYiKSkpKX19cmV0dXJuIHN9LApOZChhKXt2YXIg
+cyxyCmlmKGE9PW51bGwpcz1udWxsCmVsc2V7cz1ILlFJKFtdLHQuaGgpCmZvcihyPUouSVQoYSk7ci5G
+KCk7KXMucHVzaChVLk5mKHIuZ2woKSkpfXJldHVybiBzfSwKTmYoYSl7dmFyIHM9Si5VNihhKSxyPUgu
+ayhzLnEoYSwiZGVzY3JpcHRpb24iKSkscT1ILlFJKFtdLHQuYUopCmZvcihzPUouSVQodC5XLmEocy5x
+KGEsImVudHJpZXMiKSkpO3MuRigpOylxLnB1c2goVS5SaihzLmdsKCkpKQpyZXR1cm4gbmV3IFUueUQo
+cixxKX0sClJqKGEpe3ZhciBzLHI9Si5VNihhKSxxPUguayhyLnEoYSwiZGVzY3JpcHRpb24iKSkscD1I
+Lmsoci5xKGEsImZ1bmN0aW9uIikpLG89ci5xKGEsImxpbmsiKQppZihvPT1udWxsKW89bnVsbAplbHNl
+e3M9Si5VNihvKQpvPW5ldyBVLk1sKEguayhzLnEobywiaHJlZiIpKSxILlVjKHMucShvLCJsaW5lIikp
+LEguayhzLnEobywicGF0aCIpKSl9cj10LmJNLmEoci5xKGEsImhpbnRBY3Rpb25zIikpCnI9cj09bnVs
+bD9udWxsOkouTTEocixuZXcgVS5hTigpLHQuSikuYnIoMCkKcmV0dXJuIG5ldyBVLndiKHEscCxvLHI9
+PW51bGw/Qy5kbjpyKX0sCmQyOmZ1bmN0aW9uIGQyKGEsYixjLGQsZSxmKXt2YXIgXz10aGlzCl8uYT1h
+Cl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKU2U6ZnVuY3Rpb24gU2UoYSxiKXt0aGlzLmE9
+YQp0aGlzLmI9Yn0sCk1sOmZ1bmN0aW9uIE1sKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
+Y30sCnlEOmZ1bmN0aW9uIHlEKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAp3YjpmdW5jdGlvbiB3Yihh
+LGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKYU46ZnVuY3Rpb24gYU4o
+KXt9LApiMDpmdW5jdGlvbiBiMCgpe319LFc9ewp4Mygpe3JldHVybiB3aW5kb3d9LApacigpe3JldHVy
+biBkb2N1bWVudH0sCko2KGEpe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQppZihhIT1u
+dWxsKUMueG4uc0xVKHMsYSkKcmV0dXJuIHN9LApMaihhKXtyZXR1cm4gQ1NTLmVzY2FwZShhKX0sClU5
+KGEsYixjKXt2YXIgcyxyPWRvY3VtZW50LmJvZHkKci50b1N0cmluZwpzPXQuYWMKcz1uZXcgSC5VNShu
+ZXcgVy5lNyhDLlJZLnI2KHIsYSxiLGMpKSxzLkMoImEyKGxELkUpIikuYShuZXcgVy5DdigpKSxzLkMo
+IlU1PGxELkU+IikpCnJldHVybiB0LmguYShzLmdyOChzKSl9LApyUyhhKXt2YXIgcyxyLHE9ImVsZW1l
+bnQgdGFnIHVuYXZhaWxhYmxlIgp0cnl7cz1KLllFKGEpCnMuZ25zKGEpCnE9cy5nbnMoYSl9Y2F0Y2go
+cil7SC5SdShyKX1yZXR1cm4gcX0sCkMwKGEsYil7YT1hK2ImNTM2ODcwOTExCmE9YSsoKGEmNTI0Mjg3
+KTw8MTApJjUzNjg3MDkxMQpyZXR1cm4gYV5hPj4+Nn0sCnJFKGEsYixjLGQpe3ZhciBzPVcuQzAoVy5D
+MChXLkMwKFcuQzAoMCxhKSxiKSxjKSxkKSxyPXMrKChzJjY3MTA4ODYzKTw8MykmNTM2ODcwOTExCnJe
+PXI+Pj4xMQpyZXR1cm4gcisoKHImMTYzODMpPDwxNSkmNTM2ODcwOTExfSwKVE4oYSxiKXt2YXIgcyxy
+LHE9YS5jbGFzc0xpc3QKZm9yKHM9Yi5sZW5ndGgscj0wO3I8Yi5sZW5ndGg7Yi5sZW5ndGg9PT1zfHwo
+MCxILmxrKShiKSwrK3IpcS5hZGQoYltyXSl9LApKRShhLGIsYyxkLGUpe3ZhciBzPVcuYUYobmV3IFcu
+dk4oYyksdC5CKQppZihzIT1udWxsJiYhMClKLmRaKGEsYixzLCExKQpyZXR1cm4gbmV3IFcueEMoYSxi
+LHMsITEsZS5DKCJ4QzwwPiIpKX0sClR3KGEpe3ZhciBzPVcuSjYobnVsbCkscj10LkYuYSh3aW5kb3cu
+bG9jYXRpb24pCnM9bmV3IFcuSlEobmV3IFcubWsocyxyKSkKcy5DWShhKQpyZXR1cm4gc30sCnFEKGEs
+YixjLGQpe3QuaC5hKGEpCkgubihiKQpILm4oYykKdC5jci5hKGQpCnJldHVybiEwfSwKblooYSxiLGMs
+ZCl7dmFyIHMscixxCnQuaC5hKGEpCkgubihiKQpILm4oYykKcz10LmNyLmEoZCkuYQpyPXMuYQpDLnhu
+LnNMVShyLGMpCnE9ci5ob3N0bmFtZQpzPXMuYgppZighKHE9PXMuaG9zdG5hbWUmJnIucG9ydD09PXMu
+cG9ydCYmci5wcm90b2NvbD09PXMucHJvdG9jb2wpKWlmKHE9PT0iIilpZihyLnBvcnQ9PT0iIil7cz1y
+LnByb3RvY29sCnM9cz09PSI6Inx8cz09PSIifWVsc2Ugcz0hMQplbHNlIHM9ITEKZWxzZSBzPSEwCnJl
+dHVybiBzfSwKQmwoKXt2YXIgcz10Lk4scj1QLnRNKEMuUXgscykscT10LmRHLmEobmV3IFcuSUEoKSks
+cD1ILlFJKFsiVEVNUExBVEUiXSx0LnMpCnM9bmV3IFcuY3QocixQLkxzKHMpLFAuTHMocyksUC5Mcyhz
+KSxudWxsKQpzLkNZKG51bGwsbmV3IEgubEooQy5ReCxxLHQuZHYpLHAsbnVsbCkKcmV0dXJuIHN9LApx
+YyhhKXt2YXIgcwppZihhPT1udWxsKXJldHVybiBudWxsCmlmKCJwb3N0TWVzc2FnZSIgaW4gYSl7cz1X
+LlAxKGEpCnJldHVybiBzfWVsc2UgcmV0dXJuIHQuY2guYShhKX0sClAxKGEpe2lmKGE9PT13aW5kb3cp
+cmV0dXJuIHQuY2kuYShhKQplbHNlIHJldHVybiBuZXcgVy5kVygpfSwKYUYoYSxiKXt2YXIgcz0kLlgz
+CmlmKHM9PT1DLk5VKXJldHVybiBhCnJldHVybiBzLlB5KGEsYil9LApxRTpmdW5jdGlvbiBxRSgpe30s
+CkdoOmZ1bmN0aW9uIEdoKCl7fSwKZlk6ZnVuY3Rpb24gZlkoKXt9LApyWjpmdW5jdGlvbiByWigpe30s
+CkF6OmZ1bmN0aW9uIEF6KCl7fSwKUVA6ZnVuY3Rpb24gUVAoKXt9LApueDpmdW5jdGlvbiBueCgpe30s
+Cm9KOmZ1bmN0aW9uIG9KKCl7fSwKaWQ6ZnVuY3Rpb24gaWQoKXt9LApRRjpmdW5jdGlvbiBRRigpe30s
+Ck5oOmZ1bmN0aW9uIE5oKCl7fSwKYWU6ZnVuY3Rpb24gYWUoKXt9LApJQjpmdW5jdGlvbiBJQigpe30s
+Cm43OmZ1bmN0aW9uIG43KCl7fSwKd3o6ZnVuY3Rpb24gd3ooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1i
+fSwKY3Y6ZnVuY3Rpb24gY3YoKXt9LApDdjpmdW5jdGlvbiBDdigpe30sCmVhOmZ1bmN0aW9uIGVhKCl7
+fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApoSDpmdW5jdGlvbiBoSCgpe30sCmg0OmZ1bmN0aW9uIGg0KCl7
+fSwKYnI6ZnVuY3Rpb24gYnIoKXt9LApWYjpmdW5jdGlvbiBWYigpe30sCmZKOmZ1bmN0aW9uIGZKKCl7
+fSwKd2E6ZnVuY3Rpb24gd2EoKXt9LApTZzpmdW5jdGlvbiBTZygpe30sCnU4OmZ1bmN0aW9uIHU4KCl7
+fSwKQWo6ZnVuY3Rpb24gQWooKXt9LAplNzpmdW5jdGlvbiBlNyhhKXt0aGlzLmE9YX0sCktWOmZ1bmN0
+aW9uIEtWKCl7fSwKQkg6ZnVuY3Rpb24gQkgoKXt9LApTTjpmdW5jdGlvbiBTTigpe30sCmV3OmZ1bmN0
+aW9uIGV3KCl7fSwKbHA6ZnVuY3Rpb24gbHAoKXt9LApUYjpmdW5jdGlvbiBUYigpe30sCkl2OmZ1bmN0
+aW9uIEl2KCl7fSwKV1A6ZnVuY3Rpb24gV1AoKXt9LAp5WTpmdW5jdGlvbiB5WSgpe30sCnc2OmZ1bmN0
+aW9uIHc2KCl7fSwKSzU6ZnVuY3Rpb24gSzUoKXt9LApDbTpmdW5jdGlvbiBDbSgpe30sCkNROmZ1bmN0
+aW9uIENRKCl7fSwKdzQ6ZnVuY3Rpb24gdzQoKXt9LApyaDpmdW5jdGlvbiByaCgpe30sCmNmOmZ1bmN0
+aW9uIGNmKCl7fSwKaTc6ZnVuY3Rpb24gaTcoYSl7dGhpcy5hPWF9LApTeTpmdW5jdGlvbiBTeShhKXt0
+aGlzLmE9YX0sCktTOmZ1bmN0aW9uIEtTKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBMzpmdW5jdGlv
+biBBMyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSTQ6ZnVuY3Rpb24gSTQoYSl7dGhpcy5hPWF9LApG
+azpmdW5jdGlvbiBGayhhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9LApSTzpmdW5jdGlvbiBSTyhhLGIs
+YyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LApDcTpmdW5jdGlvbiBDcShh
+LGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9LAp4QzpmdW5jdGlvbiB4
+QyhhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5iPWEKXy5jPWIKXy5kPWMKXy5lPWQKXy4kdGk9ZX0sCnZO
+OmZ1bmN0aW9uIHZOKGEpe3RoaXMuYT1hfSwKSlE6ZnVuY3Rpb24gSlEoYSl7dGhpcy5hPWF9LApHbTpm
+dW5jdGlvbiBHbSgpe30sCnZEOmZ1bmN0aW9uIHZEKGEpe3RoaXMuYT1hfSwKVXY6ZnVuY3Rpb24gVXYo
+YSl7dGhpcy5hPWF9LApFZzpmdW5jdGlvbiBFZyhhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5j
+PWN9LAptNjpmdW5jdGlvbiBtNigpe30sCkVvOmZ1bmN0aW9uIEVvKCl7fSwKV2s6ZnVuY3Rpb24gV2so
+KXt9LApjdDpmdW5jdGlvbiBjdChhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5lPWEKXy5hPWIKXy5iPWMK
+Xy5jPWQKXy5kPWV9LApJQTpmdW5jdGlvbiBJQSgpe30sCk93OmZ1bmN0aW9uIE93KCl7fSwKVzk6ZnVu
+Y3Rpb24gVzkoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPS0xCl8uZD1udWxsCl8uJHRp
+PWN9LApkVzpmdW5jdGlvbiBkVygpe30sCm1rOmZ1bmN0aW9uIG1rKGEsYil7dGhpcy5hPWEKdGhpcy5i
+PWJ9LApLbzpmdW5jdGlvbiBLbyhhKXt0aGlzLmE9YQp0aGlzLmI9MH0sCmZtOmZ1bmN0aW9uIGZtKGEp
+e3RoaXMuYT1hfSwKTGU6ZnVuY3Rpb24gTGUoKXt9LApLNzpmdW5jdGlvbiBLNygpe30sCnJCOmZ1bmN0
+aW9uIHJCKCl7fSwKWFc6ZnVuY3Rpb24gWFcoKXt9LApvYTpmdW5jdGlvbiBvYSgpe319LFg9ewpDTChh
+LGIpe3ZhciBzLHIscSxwLG8sbj1iLnhaKGEpCmIuaEsoYSkKaWYobiE9bnVsbClhPUMueEIueW4oYSxu
+Lmxlbmd0aCkKcz10LnMKcj1ILlFJKFtdLHMpCnE9SC5RSShbXSxzKQpzPWEubGVuZ3RoCmlmKHMhPT0w
+JiZiLnI0KEMueEIuVyhhLDApKSl7aWYoMD49cylyZXR1cm4gSC5PSChhLDApCkMuTm0uaShxLGFbMF0p
+CnA9MX1lbHNle0MuTm0uaShxLCIiKQpwPTB9Zm9yKG89cDtvPHM7KytvKWlmKGIucjQoQy54Qi5XKGEs
+bykpKXtDLk5tLmkocixDLnhCLk5qKGEscCxvKSkKQy5ObS5pKHEsYVtvXSkKcD1vKzF9aWYocDxzKXtD
+Lk5tLmkocixDLnhCLnluKGEscCkpCkMuTm0uaShxLCIiKX1yZXR1cm4gbmV3IFguV0QoYixuLHIscSl9
+LApXRDpmdW5jdGlvbiBXRChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1jCl8uZT1k
+fSwKSTcoYSl7cmV0dXJuIG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fQp2
+YXIgdz1bQixDLEQsRSxGLEgsSixMLE0sTyxQLFIsVCxVLFcsWF0KaHVua0hlbHBlcnMuc2V0RnVuY3Rp
+b25OYW1lc0lmTmVjZXNzYXJ5KHcpCnZhciAkPXt9CkguRksucHJvdG90eXBlPXt9CkouR3YucHJvdG90
+eXBlPXsKRE4oYSxiKXtyZXR1cm4gYT09PWJ9LApnaU8oYSl7cmV0dXJuIEguZVEoYSl9LAp3KGEpe3Jl
+dHVybiJJbnN0YW5jZSBvZiAnIitILmxoKGEpKyInIn0sCmU3KGEsYil7dC5vLmEoYikKdGhyb3cgSC5i
+KFAubHIoYSxiLmdXYSgpLGIuZ25kKCksYi5nVm0oKSkpfX0KSi55RS5wcm90b3R5cGU9ewp3KGEpe3Jl
+dHVybiBTdHJpbmcoYSl9LApnaU8oYSl7cmV0dXJuIGE/NTE5MDE4OjIxODE1OX0sCiRpYTI6MX0KSi53
+ZS5wcm90b3R5cGU9ewpETihhLGIpe3JldHVybiBudWxsPT1ifSwKdyhhKXtyZXR1cm4ibnVsbCJ9LApn
+aU8oYSl7cmV0dXJuIDB9LAokaWM4OjF9CkouTUYucHJvdG90eXBlPXsKZ2lPKGEpe3JldHVybiAwfSwK
+dyhhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnByb3RvdHlwZT17fQpKLmtkLnByb3Rv
+dHlwZT17fQpKLmM1LnByb3RvdHlwZT17CncoYSl7dmFyIHM9YVskLnooKV0KaWYocz09bnVsbClyZXR1
+cm4gdGhpcy50KGEpCnJldHVybiJKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciAiK0guRWooSi53KHMpKX0s
+CiRpRUg6MX0KSi5qZC5wcm90b3R5cGU9ewpkcihhLGIpe3JldHVybiBuZXcgSC5qVihhLEgudDYoYSku
+QygiQDwxPiIpLktxKGIpLkMoImpWPDEsMj4iKSl9LAppKGEsYil7SC50NihhKS5jLmEoYikKaWYoISFh
+LmZpeGVkJGxlbmd0aClILnYoUC5MNCgiYWRkIikpCmEucHVzaChiKX0sClc0KGEsYil7dmFyIHMKaWYo
+ISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgicmVtb3ZlQXQiKSkKcz1hLmxlbmd0aAppZihiPj1zKXRo
+cm93IEguYihQLk83KGIsbnVsbCkpCnJldHVybiBhLnNwbGljZShiLDEpWzBdfSwKVUcoYSxiLGMpe3Zh
+ciBzLHIKSC50NihhKS5DKCJjWDwxPiIpLmEoYykKaWYoISFhLmZpeGVkJGxlbmd0aClILnYoUC5MNCgi
+aW5zZXJ0QWxsIikpClAud0EoYiwwLGEubGVuZ3RoLCJpbmRleCIpCmlmKCF0LlUuYihjKSljPUouUlgo
+YykKcz1KLkhtKGMpCmEubGVuZ3RoPWEubGVuZ3RoK3MKcj1iK3MKdGhpcy5ZVyhhLHIsYS5sZW5ndGgs
+YSxiKQp0aGlzLnZnKGEsYixyLGMpfSwKRlYoYSxiKXt2YXIgcwpILnQ2KGEpLkMoImNYPDE+IikuYShi
+KQppZighIWEuZml4ZWQkbGVuZ3RoKUgudihQLkw0KCJhZGRBbGwiKSkKaWYoQXJyYXkuaXNBcnJheShi
+KSl7dGhpcy5LaChhLGIpCnJldHVybn1mb3Iocz1KLklUKGIpO3MuRigpOylhLnB1c2gocy5nbCgpKX0s
+CktoKGEsYil7dmFyIHMscgp0LmIuYShiKQpzPWIubGVuZ3RoCmlmKHM9PT0wKXJldHVybgppZihhPT09
+Yil0aHJvdyBILmIoUC5hNChhKSkKZm9yKHI9MDtyPHM7KytyKWEucHVzaChiW3JdKX0sCkUyKGEsYixj
+KXt2YXIgcz1ILnQ2KGEpCnJldHVybiBuZXcgSC5sSihhLHMuS3EoYykuQygiMSgyKSIpLmEoYikscy5D
+KCJAPDE+IikuS3EoYykuQygibEo8MSwyPiIpKX0sCmsoYSxiKXt2YXIgcyxyPVAuTzgoYS5sZW5ndGgs
+IiIsITEsdC5OKQpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKXRoaXMuWTUocixzLEguRWooYVtzXSkpCnJl
+dHVybiByLmpvaW4oYil9LAplUihhLGIpe3JldHVybiBILnFDKGEsYixudWxsLEgudDYoYSkuYyl9LApO
+MChhLGIsYyxkKXt2YXIgcyxyLHEKZC5hKGIpCkgudDYoYSkuS3EoZCkuQygiMSgxLDIpIikuYShjKQpz
+PWEubGVuZ3RoCmZvcihyPWIscT0wO3E8czsrK3Epe3I9Yy4kMihyLGFbcV0pCmlmKGEubGVuZ3RoIT09
+cyl0aHJvdyBILmIoUC5hNChhKSl9cmV0dXJuIHJ9LApIdChhLGIpe3ZhciBzLHIscSxwLG8sbj1ILnQ2
+KGEpCm4uQygiYTIoMSkiKS5hKGIpCnM9YS5sZW5ndGgKZm9yKHI9bnVsbCxxPSExLHA9MDtwPHM7Kytw
+KXtvPWFbcF0KaWYoSC5vVChiLiQxKG8pKSl7aWYocSl0aHJvdyBILmIoSC5BbSgpKQpyPW8KcT0hMH1p
+ZihzIT09YS5sZW5ndGgpdGhyb3cgSC5iKFAuYTQoYSkpfWlmKHEpcmV0dXJuIG4uYy5hKHIpCnRocm93
+IEguYihILldwKCkpfSwKRShhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpy
+ZXR1cm4gYVtiXX0sCmd0SChhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBdCnRocm93IEguYihILldw
+KCkpfSwKZ3JaKGEpe3ZhciBzPWEubGVuZ3RoCmlmKHM+MClyZXR1cm4gYVtzLTFdCnRocm93IEguYihI
+LldwKCkpfSwKWVcoYSxiLGMsZCxlKXt2YXIgcyxyLHEscCxvCkgudDYoYSkuQygiY1g8MT4iKS5hKGQp
+CmlmKCEhYS5pbW11dGFibGUkbGlzdClILnYoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMsYS5sZW5n
+dGgpCnM9Yy1iCmlmKHM9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCmlmKHQuai5iKGQpKXty
+PWQKcT1lfWVsc2V7cj1KLkE1KGQsZSkudHQoMCwhMSkKcT0wfXA9Si5VNihyKQppZihxK3M+cC5nQShy
+KSl0aHJvdyBILmIoSC5hcigpKQppZihxPGIpZm9yKG89cy0xO28+PTA7LS1vKWFbYitvXT1wLnEocixx
+K28pCmVsc2UgZm9yKG89MDtvPHM7KytvKWFbYitvXT1wLnEocixxK28pfSwKdmcoYSxiLGMsZCl7cmV0
+dXJuIHRoaXMuWVcoYSxiLGMsZCwwKX0sClZyKGEsYil7dmFyIHMscgpILnQ2KGEpLkMoImEyKDEpIiku
+YShiKQpzPWEubGVuZ3RoCmZvcihyPTA7cjxzOysrcil7aWYoSC5vVChiLiQxKGFbcl0pKSlyZXR1cm4h
+MAppZihhLmxlbmd0aCE9PXMpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGcoYSxiKXt2YXIg
+cwpmb3Iocz0wO3M8YS5sZW5ndGg7KytzKWlmKEouUk0oYVtzXSxiKSlyZXR1cm4hMApyZXR1cm4hMX0s
+CmdsMChhKXtyZXR1cm4gYS5sZW5ndGg9PT0wfSwKZ29yKGEpe3JldHVybiBhLmxlbmd0aCE9PTB9LAp3
+KGEpe3JldHVybiBQLngoYSwiWyIsIl0iKX0sCnR0KGEsYil7dmFyIHM9SC5RSShhLnNsaWNlKDApLEgu
+dDYoYSkpCnJldHVybiBzfSwKYnIoYSl7cmV0dXJuIHRoaXMudHQoYSwhMCl9LApnbShhKXtyZXR1cm4g
+bmV3IEoubTEoYSxhLmxlbmd0aCxILnQ2KGEpLkMoIm0xPDE+IikpfSwKZ2lPKGEpe3JldHVybiBILmVR
+KGEpfSwKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKc0EoYSxiKXtpZighIWEuZml4ZWQkbGVuZ3RoKUgu
+dihQLkw0KCJzZXQgbGVuZ3RoIikpCmlmKGI8MCl0aHJvdyBILmIoUC5URShiLDAsbnVsbCwibmV3TGVu
+Z3RoIixudWxsKSkKaWYoYj5hLmxlbmd0aClILnQ2KGEpLmMuYShudWxsKQphLmxlbmd0aD1ifSwKcShh
+LGIpe0guSVooYikKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC51KGEsYikpCnJldHVybiBh
+W2JdfSwKWTUoYSxiLGMpe0gudDYoYSkuYy5hKGMpCmlmKCEhYS5pbW11dGFibGUkbGlzdClILnYoUC5M
+NCgiaW5kZXhlZCBzZXQiKSkKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC51KGEsYikpCmFb
+Yl09Y30sCiRpYlE6MSwKJGljWDoxLAokaXpNOjF9CkouUG8ucHJvdG90eXBlPXt9CkoubTEucHJvdG90
+eXBlPXsKZ2woKXtyZXR1cm4gdGhpcy4kdGkuYy5hKHRoaXMuZCl9LApGKCl7dmFyIHMscj10aGlzLHE9
+ci5hLHA9cS5sZW5ndGgKaWYoci5iIT09cCl0aHJvdyBILmIoSC5sayhxKSkKcz1yLmMKaWYocz49cCl7
+ci5zTShudWxsKQpyZXR1cm4hMX1yLnNNKHFbc10pOysrci5jCnJldHVybiEwfSwKc00oYSl7dGhpcy5k
+PXRoaXMuJHRpLkMoIjE/IikuYShhKX0sCiRpQW46MX0KSi5xSS5wcm90b3R5cGU9ewp6UShhKXtpZihh
+PjApe2lmKGEhPT0xLzApcmV0dXJuIE1hdGgucm91bmQoYSl9ZWxzZSBpZihhPi0xLzApcmV0dXJuIDAt
+TWF0aC5yb3VuZCgwLWEpCnRocm93IEguYihQLkw0KCIiK2ErIi5yb3VuZCgpIikpfSwKdyhhKXtpZihh
+PT09MCYmMS9hPDApcmV0dXJuIi0wLjAiCmVsc2UgcmV0dXJuIiIrYX0sCmdpTyhhKXt2YXIgcyxyLHEs
+cCxvPWF8MAppZihhPT09bylyZXR1cm4gbyY1MzY4NzA5MTEKcz1NYXRoLmFicyhhKQpyPU1hdGgubG9n
+KHMpLzAuNjkzMTQ3MTgwNTU5OTQ1M3wwCnE9TWF0aC5wb3coMixyKQpwPXM8MT9zL3E6cS9zCnJldHVy
+bigocCo5MDA3MTk5MjU0NzQwOTkyfDApKyhwKjM1NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytyKjEy
+NTkmNTM2ODcwOTExfSwKelkoYSxiKXt2YXIgcz1hJWIKaWYocz09PTApcmV0dXJuIDAKaWYocz4wKXJl
+dHVybiBzCnJldHVybiBzK2J9LApCVShhLGIpe3JldHVybihhfDApPT09YT9hL2J8MDp0aGlzLkRKKGEs
+Yil9LApESihhLGIpe3ZhciBzPWEvYgppZihzPj0tMjE0NzQ4MzY0OCYmczw9MjE0NzQ4MzY0NylyZXR1
+cm4gc3wwCmlmKHM+MCl7aWYocyE9PTEvMClyZXR1cm4gTWF0aC5mbG9vcihzKX1lbHNlIGlmKHM+LTEv
+MClyZXR1cm4gTWF0aC5jZWlsKHMpCnRocm93IEguYihQLkw0KCJSZXN1bHQgb2YgdHJ1bmNhdGluZyBk
+aXZpc2lvbiBpcyAiK0guRWoocykrIjogIitILkVqKGEpKyIgfi8gIitiKSl9LAp3RyhhLGIpe3ZhciBz
+CmlmKGE+MClzPXRoaXMucDMoYSxiKQplbHNle3M9Yj4zMT8zMTpiCnM9YT4+cz4+PjB9cmV0dXJuIHN9
+LApiZihhLGIpe2lmKDA+Yil0aHJvdyBILmIoSC50TChiKSkKcmV0dXJuIHRoaXMucDMoYSxiKX0sCnAz
+KGEsYil7cmV0dXJuIGI+MzE/MDphPj4+Yn0sCiRpQ1A6MSwKJGlaWjoxfQpKLmJVLnByb3RvdHlwZT17
+JGlJajoxfQpKLmtELnByb3RvdHlwZT17fQpKLkRyLnByb3RvdHlwZT17Ck8oYSxiKXtpZihiPDApdGhy
+b3cgSC5iKEgudShhLGIpKQppZihiPj1hLmxlbmd0aClILnYoSC51KGEsYikpCnJldHVybiBhLmNoYXJD
+b2RlQXQoYil9LApXKGEsYil7aWYoYj49YS5sZW5ndGgpdGhyb3cgSC5iKEgudShhLGIpKQpyZXR1cm4g
+YS5jaGFyQ29kZUF0KGIpfSwKZGQoYSxiKXtyZXR1cm4gbmV3IEgudW4oYixhLDApfSwKaChhLGIpe3Jl
+dHVybiBhK2J9LApUYyhhLGIpe3ZhciBzPWIubGVuZ3RoLHI9YS5sZW5ndGgKaWYocz5yKXJldHVybiEx
+CnJldHVybiBiPT09dGhpcy55bihhLHItcyl9LAppNyhhLGIsYyxkKXt2YXIgcz1QLmpCKGIsYyxhLmxl
+bmd0aCkscj1hLnN1YnN0cmluZygwLGIpLHE9YS5zdWJzdHJpbmcocykKcmV0dXJuIHIrZCtxfSwKUWko
+YSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgs
+bnVsbCxudWxsKSkKcz1jK2IubGVuZ3RoCmlmKHM+YS5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIGI9PT1h
+LnN1YnN0cmluZyhjLHMpfSwKbihhLGIpe3JldHVybiB0aGlzLlFpKGEsYiwwKX0sCk5qKGEsYixjKXty
+ZXR1cm4gYS5zdWJzdHJpbmcoYixQLmpCKGIsYyxhLmxlbmd0aCkpfSwKeW4oYSxiKXtyZXR1cm4gdGhp
+cy5OaihhLGIsbnVsbCl9LApoYyhhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpfSwKYlMoYSl7dmFyIHMs
+cixxLHA9YS50cmltKCksbz1wLmxlbmd0aAppZihvPT09MClyZXR1cm4gcAppZih0aGlzLlcocCwwKT09
+PTEzMyl7cz1KLm1tKHAsMSkKaWYocz09PW8pcmV0dXJuIiJ9ZWxzZSBzPTAKcj1vLTEKcT10aGlzLk8o
+cCxyKT09PTEzMz9KLmMxKHAscik6bwppZihzPT09MCYmcT09PW8pcmV0dXJuIHAKcmV0dXJuIHAuc3Vi
+c3RyaW5nKHMscSl9LApUKGEsYil7dmFyIHMscgppZigwPj1iKXJldHVybiIiCmlmKGI9PT0xfHxhLmxl
+bmd0aD09PTApcmV0dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEguYihDLkVxKQpmb3Iocz1hLHI9IiI7
+ITA7KXtpZigoYiYxKT09PTEpcj1zK3IKYj1iPj4+MQppZihiPT09MClicmVhawpzKz1zfXJldHVybiBy
+fSwKWFUoYSxiLGMpe3ZhciBzCmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5s
+ZW5ndGgsbnVsbCxudWxsKSkKcz1hLmluZGV4T2YoYixjKQpyZXR1cm4gc30sCk9ZKGEsYil7cmV0dXJu
+IHRoaXMuWFUoYSxiLDApfSwKUGsoYSxiLGMpe3ZhciBzLHIKaWYoYz09bnVsbCljPWEubGVuZ3RoCmVs
+c2UgaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsMCxhLmxlbmd0aCxudWxsLG51bGwp
+KQpzPWIubGVuZ3RoCnI9YS5sZW5ndGgKaWYoYytzPnIpYz1yLXMKcmV0dXJuIGEubGFzdEluZGV4T2Yo
+YixjKX0sCmNuKGEsYil7cmV0dXJuIHRoaXMuUGsoYSxiLG51bGwpfSwKSXMoYSxiLGMpe3ZhciBzPWEu
+bGVuZ3RoCmlmKGM+cyl0aHJvdyBILmIoUC5URShjLDAscyxudWxsLG51bGwpKQpyZXR1cm4gSC5TUShh
+LGIsYyl9LAp0ZyhhLGIpe3JldHVybiB0aGlzLklzKGEsYiwwKX0sCncoYSl7cmV0dXJuIGF9LApnaU8o
+YSl7dmFyIHMscixxCmZvcihzPWEubGVuZ3RoLHI9MCxxPTA7cTxzOysrcSl7cj1yK2EuY2hhckNvZGVB
+dChxKSY1MzY4NzA5MTEKcj1yKygociY1MjQyODcpPDwxMCkmNTM2ODcwOTExCnJePXI+PjZ9cj1yKygo
+ciY2NzEwODg2Myk8PDMpJjUzNjg3MDkxMQpyXj1yPj4xMQpyZXR1cm4gcisoKHImMTYzODMpPDwxNSkm
+NTM2ODcwOTExfSwKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKcShhLGIpe0guSVooYikKaWYoYj49YS5s
+ZW5ndGh8fCExKXRocm93IEguYihILnUoYSxiKSkKcmV0dXJuIGFbYl19LAokaXZYOjEsCiRpcVU6MX0K
+SC5CUi5wcm90b3R5cGU9ewpnbShhKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5lVChKLklU
+KHRoaXMuZ09OKCkpLHMuQygiQDwxPiIpLktxKHMuUVsxXSkuQygiZVQ8MSwyPiIpKX0sCmdBKGEpe3Jl
+dHVybiBKLkhtKHRoaXMuZ09OKCkpfSwKZ2wwKGEpe3JldHVybiBKLnVVKHRoaXMuZ09OKCkpfSwKZ29y
+KGEpe3JldHVybiBKLkY3KHRoaXMuZ09OKCkpfSwKZVIoYSxiKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVy
+biBILkdKKEouQTUodGhpcy5nT04oKSxiKSxzLmMscy5RWzFdKX0sCkUoYSxiKXtyZXR1cm4gSC5MaCh0
+aGlzKS5RWzFdLmEoSi5HQSh0aGlzLmdPTigpLGIpKX0sCncoYSl7cmV0dXJuIEoudyh0aGlzLmdPTigp
+KX19CkguZVQucHJvdG90eXBlPXsKRigpe3JldHVybiB0aGlzLmEuRigpfSwKZ2woKXtyZXR1cm4gdGhp
+cy4kdGkuUVsxXS5hKHRoaXMuYS5nbCgpKX0sCiRpQW46MX0KSC5aeS5wcm90b3R5cGU9ewpnT04oKXty
+ZXR1cm4gdGhpcy5hfX0KSC5vbC5wcm90b3R5cGU9eyRpYlE6MX0KSC5VcS5wcm90b3R5cGU9ewpxKGEs
+Yil7cmV0dXJuIHRoaXMuJHRpLlFbMV0uYShKLng5KHRoaXMuYSxILklaKGIpKSl9LApZNShhLGIsYyl7
+dmFyIHM9dGhpcy4kdGkKSi51OSh0aGlzLmEsYixzLmMuYShzLlFbMV0uYShjKSkpfSwKJGliUToxLAok
+aXpNOjF9CkgualYucHJvdG90eXBlPXsKZHIoYSxiKXtyZXR1cm4gbmV3IEgualYodGhpcy5hLHRoaXMu
+JHRpLkMoIkA8MT4iKS5LcShiKS5DKCJqVjwxLDI+IikpfSwKZ09OKCl7cmV0dXJuIHRoaXMuYX19Ckgu
+Yy5wcm90b3R5cGU9ewp3KGEpe3ZhciBzPSJMYXRlSW5pdGlhbGl6YXRpb25FcnJvcjogIit0aGlzLmEK
+cmV0dXJuIHN9fQpILnFqLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKcShh
+LGIpe3JldHVybiBDLnhCLk8odGhpcy5hLEguSVooYikpfX0KSC5iUS5wcm90b3R5cGU9e30KSC5hTC5w
+cm90b3R5cGU9ewpnbShhKXt2YXIgcz10aGlzCnJldHVybiBuZXcgSC5hNyhzLHMuZ0EocyksSC5MaChz
+KS5DKCJhNzxhTC5FPiIpKX0sCmdsMChhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LAprKGEsYil7
+dmFyIHMscixxLHA9dGhpcyxvPXAuZ0EocCkKaWYoYi5sZW5ndGghPT0wKXtpZihvPT09MClyZXR1cm4i
+IgpzPUguRWoocC5FKDAsMCkpCmlmKG8hPT1wLmdBKHApKXRocm93IEguYihQLmE0KHApKQpmb3Iocj1z
+LHE9MTtxPG87KytxKXtyPXIrYitILkVqKHAuRSgwLHEpKQppZihvIT09cC5nQShwKSl0aHJvdyBILmIo
+UC5hNChwKSl9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9ZWxzZXtmb3IocT0wLHI9IiI7cTxv
+OysrcSl7cis9SC5FaihwLkUoMCxxKSkKaWYobyE9PXAuZ0EocCkpdGhyb3cgSC5iKFAuYTQocCkpfXJl
+dHVybiByLmNoYXJDb2RlQXQoMCk9PTA/cjpyfX0sCmV2KGEsYil7cmV0dXJuIHRoaXMuR0coMCxILkxo
+KHRoaXMpLkMoImEyKGFMLkUpIikuYShiKSl9LApFMihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1
+cm4gbmV3IEgubEoodGhpcyxzLktxKGMpLkMoIjEoYUwuRSkiKS5hKGIpLHMuQygiQDxhTC5FPiIpLktx
+KGMpLkMoImxKPDEsMj4iKSl9LAplUihhLGIpe3JldHVybiBILnFDKHRoaXMsYixudWxsLEguTGgodGhp
+cykuQygiYUwuRSIpKX0sCnR0KGEsYil7cmV0dXJuIFAuWTEodGhpcywhMCxILkxoKHRoaXMpLkMoImFM
+LkUiKSl9LApicihhKXtyZXR1cm4gdGhpcy50dChhLCEwKX19CkgubkgucHJvdG90eXBlPXsKSGQoYSxi
+LGMsZCl7dmFyIHMscj10aGlzLmIKUC5rMShyLCJzdGFydCIpCnM9dGhpcy5jCmlmKHMhPW51bGwpe1Au
+azEocywiZW5kIikKaWYocj5zKXRocm93IEguYihQLlRFKHIsMCxzLCJzdGFydCIsbnVsbCkpfX0sCmdV
+RCgpe3ZhciBzPUouSG0odGhpcy5hKSxyPXRoaXMuYwppZihyPT1udWxsfHxyPnMpcmV0dXJuIHMKcmV0
+dXJuIHJ9LApnQXMoKXt2YXIgcz1KLkhtKHRoaXMuYSkscj10aGlzLmIKaWYocj5zKXJldHVybiBzCnJl
+dHVybiByfSwKZ0EoYSl7dmFyIHMscj1KLkhtKHRoaXMuYSkscT10aGlzLmIKaWYocT49cilyZXR1cm4g
+MApzPXRoaXMuYwppZihzPT1udWxsfHxzPj1yKXJldHVybiByLXEKaWYodHlwZW9mIHMhPT0ibnVtYmVy
+IilyZXR1cm4gcy5ITigpCnJldHVybiBzLXF9LApFKGEsYil7dmFyIHM9dGhpcyxyPXMuZ0FzKCkrYgpp
+ZihiPDB8fHI+PXMuZ1VEKCkpdGhyb3cgSC5iKFAuQ2YoYixzLCJpbmRleCIsbnVsbCxudWxsKSkKcmV0
+dXJuIEouR0Eocy5hLHIpfSwKZVIoYSxiKXt2YXIgcyxyLHE9dGhpcwpQLmsxKGIsImNvdW50IikKcz1x
+LmIrYgpyPXEuYwppZihyIT1udWxsJiZzPj1yKXJldHVybiBuZXcgSC5NQihxLiR0aS5DKCJNQjwxPiIp
+KQpyZXR1cm4gSC5xQyhxLmEscyxyLHEuJHRpLmMpfSwKdHQoYSxiKXt2YXIgcyxyLHEscD10aGlzLG89
+cC5iLG49cC5hLG09Si5VNihuKSxsPW0uZ0Eobiksaz1wLmMKaWYoayE9bnVsbCYmazxsKWw9awpzPWwt
+bwppZihzPD0wKXtuPUouUWkoMCxwLiR0aS5jKQpyZXR1cm4gbn1yPVAuTzgocyxtLkUobixvKSwhMSxw
+LiR0aS5jKQpmb3IocT0xO3E8czsrK3Epe0MuTm0uWTUocixxLG0uRShuLG8rcSkpCmlmKG0uZ0Eobik8
+bCl0aHJvdyBILmIoUC5hNChwKSl9cmV0dXJuIHJ9fQpILmE3LnByb3RvdHlwZT17CmdsKCl7cmV0dXJu
+IHRoaXMuJHRpLmMuYSh0aGlzLmQpfSwKRigpe3ZhciBzLHI9dGhpcyxxPXIuYSxwPUouVTYocSksbz1w
+LmdBKHEpCmlmKHIuYiE9PW8pdGhyb3cgSC5iKFAuYTQocSkpCnM9ci5jCmlmKHM+PW8pe3Iuc0kobnVs
+bCkKcmV0dXJuITF9ci5zSShwLkUocSxzKSk7KytyLmMKcmV0dXJuITB9LApzSShhKXt0aGlzLmQ9dGhp
+cy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpILmkxLnByb3RvdHlwZT17CmdtKGEpe3ZhciBzPUgu
+TGgodGhpcykKcmV0dXJuIG5ldyBILk1IKEouSVQodGhpcy5hKSx0aGlzLmIscy5DKCJAPDE+IikuS3Eo
+cy5RWzFdKS5DKCJNSDwxLDI+IikpfSwKZ0EoYSl7cmV0dXJuIEouSG0odGhpcy5hKX0sCmdsMChhKXty
+ZXR1cm4gSi51VSh0aGlzLmEpfSwKRShhLGIpe3JldHVybiB0aGlzLmIuJDEoSi5HQSh0aGlzLmEsYikp
+fX0KSC54eS5wcm90b3R5cGU9eyRpYlE6MX0KSC5NSC5wcm90b3R5cGU9ewpGKCl7dmFyIHM9dGhpcyxy
+PXMuYgppZihyLkYoKSl7cy5zSShzLmMuJDEoci5nbCgpKSkKcmV0dXJuITB9cy5zSShudWxsKQpyZXR1
+cm4hMX0sCmdsKCl7cmV0dXJuIHRoaXMuJHRpLlFbMV0uYSh0aGlzLmEpfSwKc0koYSl7dGhpcy5hPXRo
+aXMuJHRpLkMoIjI/IikuYShhKX19CkgubEoucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIEouSG0odGhp
+cy5hKX0sCkUoYSxiKXtyZXR1cm4gdGhpcy5iLiQxKEouR0EodGhpcy5hLGIpKX19CkguVTUucHJvdG90
+eXBlPXsKZ20oYSl7cmV0dXJuIG5ldyBILlNPKEouSVQodGhpcy5hKSx0aGlzLmIsdGhpcy4kdGkuQygi
+U088MT4iKSl9fQpILlNPLnByb3RvdHlwZT17CkYoKXt2YXIgcyxyCmZvcihzPXRoaXMuYSxyPXRoaXMu
+YjtzLkYoKTspaWYoSC5vVChyLiQxKHMuZ2woKSkpKXJldHVybiEwCnJldHVybiExfSwKZ2woKXtyZXR1
+cm4gdGhpcy5hLmdsKCl9fQpILkFNLnByb3RvdHlwZT17CmVSKGEsYil7UC5rMShiLCJjb3VudCIpCnJl
+dHVybiBuZXcgSC5BTSh0aGlzLmEsdGhpcy5iK2IsSC5MaCh0aGlzKS5DKCJBTTwxPiIpKX0sCmdtKGEp
+e3JldHVybiBuZXcgSC5VMShKLklUKHRoaXMuYSksdGhpcy5iLEguTGgodGhpcykuQygiVTE8MT4iKSl9
+fQpILmQ1LnByb3RvdHlwZT17CmdBKGEpe3ZhciBzPUouSG0odGhpcy5hKS10aGlzLmIKaWYocz49MCly
+ZXR1cm4gcwpyZXR1cm4gMH0sCmVSKGEsYil7UC5rMShiLCJjb3VudCIpCnJldHVybiBuZXcgSC5kNSh0
+aGlzLmEsdGhpcy5iK2IsdGhpcy4kdGkpfSwKJGliUToxfQpILlUxLnByb3RvdHlwZT17CkYoKXt2YXIg
+cyxyCmZvcihzPXRoaXMuYSxyPTA7cjx0aGlzLmI7KytyKXMuRigpCnRoaXMuYj0wCnJldHVybiBzLkYo
+KX0sCmdsKCl7cmV0dXJuIHRoaXMuYS5nbCgpfX0KSC5NQi5wcm90b3R5cGU9ewpnbShhKXtyZXR1cm4g
+Qy5Hd30sCmdsMChhKXtyZXR1cm4hMH0sCmdBKGEpe3JldHVybiAwfSwKRShhLGIpe3Rocm93IEguYihQ
+LlRFKGIsMCwwLCJpbmRleCIsbnVsbCkpfSwKZVIoYSxiKXtQLmsxKGIsImNvdW50IikKcmV0dXJuIHRo
+aXN9fQpILkZ1LnByb3RvdHlwZT17CkYoKXtyZXR1cm4hMX0sCmdsKCl7dGhyb3cgSC5iKEguV3AoKSl9
+LAokaUFuOjF9CkgudTYucHJvdG90eXBlPXsKZ20oYSl7cmV0dXJuIG5ldyBILkpCKEouSVQodGhpcy5h
+KSx0aGlzLiR0aS5DKCJKQjwxPiIpKX19CkguSkIucHJvdG90eXBlPXsKRigpe3ZhciBzLHIKZm9yKHM9
+dGhpcy5hLHI9dGhpcy4kdGkuYztzLkYoKTspaWYoci5iKHMuZ2woKSkpcmV0dXJuITAKcmV0dXJuITF9
+LApnbCgpe3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5hLmdsKCkpfSwKJGlBbjoxfQpILlNVLnByb3Rv
+dHlwZT17fQpILlJlLnByb3RvdHlwZT17Clk1KGEsYixjKXtILkxoKHRoaXMpLkMoIlJlLkUiKS5hKGMp
+CnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IGFuIHVubW9kaWZpYWJsZSBsaXN0IikpfX0KSC53
+Mi5wcm90b3R5cGU9e30KSC53di5wcm90b3R5cGU9ewpnaU8oYSl7dmFyIHM9dGhpcy5faGFzaENvZGUK
+aWYocyE9bnVsbClyZXR1cm4gcwpzPTY2NDU5NypKLmhmKHRoaXMuYSkmNTM2ODcwOTExCnRoaXMuX2hh
+c2hDb2RlPXMKcmV0dXJuIHN9LAp3KGEpe3JldHVybidTeW1ib2woIicrSC5Faih0aGlzLmEpKyciKSd9
+LApETihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBILnd2JiZ0aGlz
+LmE9PWIuYX0sCiRpR0Q6MX0KSC5RQy5wcm90b3R5cGU9e30KSC5QRC5wcm90b3R5cGU9e30KSC5XVS5w
+cm90b3R5cGU9ewpnbDAoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcyk9PT0wfSwKdyhhKXtyZXR1cm4gUC5u
+Tyh0aGlzKX0sClk1KGEsYixjKXt2YXIgcz1ILkxoKHRoaXMpCnMuYy5hKGIpCnMuUVsxXS5hKGMpCkgu
+ZGMoKX0sCmdQdShhKXtyZXR1cm4gdGhpcy5xNCgwLEguTGgodGhpcykuQygiTjM8MSwyPiIpKX0sCnE0
+KGEsYil7dmFyIHM9dGhpcwpyZXR1cm4gUC5sMChmdW5jdGlvbigpe3ZhciByPWEKdmFyIHE9MCxwPTEs
+byxuLG0sbCxrCnJldHVybiBmdW5jdGlvbiAkYXN5bmMkZ1B1KGMsZCl7aWYoYz09PTEpe289ZApxPXB9
+d2hpbGUodHJ1ZSlzd2l0Y2gocSl7Y2FzZSAwOm49cy5ndmMoKSxuPW4uZ20obiksbT1ILkxoKHMpLGw9
+bS5RWzFdLG09bS5DKCJAPDE+IikuS3EobCkuQygiTjM8MSwyPiIpCmNhc2UgMjppZighbi5GKCkpe3E9
+MwpicmVha31rPW4uZ2woKQpxPTQKcmV0dXJuIG5ldyBQLk4zKGssbC5hKHMucSgwLGspKSxtKQpjYXNl
+IDQ6cT0yCmJyZWFrCmNhc2UgMzpyZXR1cm4gUC5UaCgpCmNhc2UgMTpyZXR1cm4gUC5ZbShvKX19fSxi
+KX0sCiRpWjA6MX0KSC5MUC5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hfSwKeDQoYSl7aWYo
+dHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiExCmlmKCJfX3Byb3RvX18iPT09YSlyZXR1cm4hMQpyZXR1
+cm4gdGhpcy5iLmhhc093blByb3BlcnR5KGEpfSwKcShhLGIpe2lmKCF0aGlzLng0KGIpKXJldHVybiBu
+dWxsCnJldHVybiB0aGlzLmJbSC5uKGIpXX0sCksoYSxiKXt2YXIgcyxyLHEscCxvLG49dGhpcy4kdGkK
+bi5DKCJ+KDEsMikiKS5hKGIpCnM9dGhpcy5jCmZvcihyPXMubGVuZ3RoLHE9dGhpcy5iLG49bi5RWzFd
+LHA9MDtwPHI7KytwKXtvPUgubihzW3BdKQpiLiQyKG8sbi5hKHFbb10pKX19LApndmMoKXtyZXR1cm4g
+bmV3IEguWFIodGhpcyx0aGlzLiR0aS5DKCJYUjwxPiIpKX19CkguWFIucHJvdG90eXBlPXsKZ20oYSl7
+dmFyIHM9dGhpcy5hLmMKcmV0dXJuIG5ldyBKLm0xKHMscy5sZW5ndGgsSC50NihzKS5DKCJtMTwxPiIp
+KX0sCmdBKGEpe3JldHVybiB0aGlzLmEuYy5sZW5ndGh9fQpILkxJLnByb3RvdHlwZT17CmdXYSgpe3Zh
+ciBzPXRoaXMuYQpyZXR1cm4gc30sCmduZCgpe3ZhciBzLHIscSxwLG89dGhpcwppZihvLmM9PT0xKXJl
+dHVybiBDLmhVCnM9by5kCnI9cy5sZW5ndGgtby5lLmxlbmd0aC1vLmYKaWYocj09PTApcmV0dXJuIEMu
+aFUKcT1bXQpmb3IocD0wO3A8cjsrK3Ape2lmKHA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscCkKcS5w
+dXNoKHNbcF0pfXJldHVybiBKLnpDKHEpfSwKZ1ZtKCl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMK
+aWYoay5jIT09MClyZXR1cm4gQy5XTwpzPWsuZQpyPXMubGVuZ3RoCnE9ay5kCnA9cS5sZW5ndGgtci1r
+LmYKaWYocj09PTApcmV0dXJuIEMuV08Kbz1uZXcgSC5ONSh0LmVvKQpmb3Iobj0wO248cjsrK24pe2lm
+KG4+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsbikKbT1zW25dCmw9cCtuCmlmKGw8MHx8bD49cS5sZW5n
+dGgpcmV0dXJuIEguT0gocSxsKQpvLlk1KDAsbmV3IEgud3YobSkscVtsXSl9cmV0dXJuIG5ldyBILlBE
+KG8sdC5nRil9LAokaXZROjF9CkguQ2oucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcwpILm4oYSkKcz10
+aGlzLmEKcy5iPXMuYisiJCIrYQpDLk5tLmkodGhpcy5iLGEpCkMuTm0uaSh0aGlzLmMsYik7KytzLmF9
+LAokUzoxMX0KSC5mOS5wcm90b3R5cGU9ewpxUyhhKXt2YXIgcyxyLHE9dGhpcyxwPW5ldyBSZWdFeHAo
+cS5hKS5leGVjKGEpCmlmKHA9PW51bGwpcmV0dXJuIG51bGwKcz1PYmplY3QuY3JlYXRlKG51bGwpCnI9
+cS5iCmlmKHIhPT0tMSlzLmFyZ3VtZW50cz1wW3IrMV0Kcj1xLmMKaWYociE9PS0xKXMuYXJndW1lbnRz
+RXhwcj1wW3IrMV0Kcj1xLmQKaWYociE9PS0xKXMuZXhwcj1wW3IrMV0Kcj1xLmUKaWYociE9PS0xKXMu
+bWV0aG9kPXBbcisxXQpyPXEuZgppZihyIT09LTEpcy5yZWNlaXZlcj1wW3IrMV0KcmV0dXJuIHN9fQpI
+LlcwLnByb3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy5iCmlmKHM9PW51bGwpcmV0dXJuIk5vU3VjaE1l
+dGhvZEVycm9yOiAiK3RoaXMuYQpyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91
+bmQ6ICciK3MrIicgb24gbnVsbCJ9fQpILmF6LnByb3RvdHlwZT17CncoYSl7dmFyIHMscj10aGlzLHE9
+Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIixwPXIuYgppZihwPT1udWxsKXJl
+dHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIityLmEKcz1yLmMKaWYocz09bnVsbClyZXR1cm4gcStwKyIn
+ICgiK3IuYSsiKSIKcmV0dXJuIHErcCsiJyBvbiAnIitzKyInICgiK3IuYSsiKSJ9fQpILnZWLnByb3Rv
+dHlwZT17CncoYSl7dmFyIHM9dGhpcy5hCnJldHVybiBzLmxlbmd0aD09PTA/IkVycm9yIjoiRXJyb3I6
+ICIrc319CkgudGUucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iVGhyb3cgb2YgbnVsbCAoJyIrKHRoaXMu
+YT09PW51bGw/Im51bGwiOiJ1bmRlZmluZWQiKSsiJyBmcm9tIEphdmFTY3JpcHQpIn0sCiRpUno6MX0K
+SC5icS5wcm90b3R5cGU9e30KSC5YTy5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHI9dGhpcy5iCmlmKHIh
+PW51bGwpcmV0dXJuIHIKcj10aGlzLmEKcz1yIT09bnVsbCYmdHlwZW9mIHI9PT0ib2JqZWN0Ij9yLnN0
+YWNrOm51bGwKcmV0dXJuIHRoaXMuYj1zPT1udWxsPyIiOnN9LAokaUd6OjF9CkguVHAucHJvdG90eXBl
+PXsKdyhhKXt2YXIgcz10aGlzLmNvbnN0cnVjdG9yLHI9cz09bnVsbD9udWxsOnMubmFtZQpyZXR1cm4i
+Q2xvc3VyZSAnIitILk5RKHI9PW51bGw/InVua25vd24iOnIpKyInIn0sCiRpRUg6MSwKZ0t1KCl7cmV0
+dXJuIHRoaXN9LAokQzoiJDEiLAokUjoxLAokRDpudWxsfQpILkF5LnByb3RvdHlwZT17JEM6IiQwIiwk
+UjowfQpILkUxLnByb3RvdHlwZT17JEM6IiQyIiwkUjoyfQpILmxjLnByb3RvdHlwZT17fQpILnp4LnBy
+b3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy4kc3RhdGljX25hbWUKaWYocz09bnVsbClyZXR1cm4iQ2xv
+c3VyZSBvZiB1bmtub3duIHN0YXRpYyBtZXRob2QiCnJldHVybiJDbG9zdXJlICciK0guTlEocykrIici
+fX0KSC5yVC5wcm90b3R5cGU9ewpETihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKaWYodGhpcz09PWIp
+cmV0dXJuITAKaWYoIShiIGluc3RhbmNlb2YgSC5yVCkpcmV0dXJuITEKcmV0dXJuIHRoaXMuJF90YXJn
+ZXQ9PT1iLiRfdGFyZ2V0JiZ0aGlzLmE9PT1iLmF9LApnaU8oYSl7cmV0dXJuKEguQ1UodGhpcy5hKV5I
+LmVRKHRoaXMuJF90YXJnZXQpKT4+PjB9LAp3KGEpe3JldHVybiJDbG9zdXJlICciK3RoaXMuJF9uYW1l
+KyInIG9mICIrKCJJbnN0YW5jZSBvZiAnIitILmxoKHQuSy5hKHRoaXMuYSkpKyInIil9fQpILkVxLnBy
+b3RvdHlwZT17CncoYSl7cmV0dXJuIlJ1bnRpbWVFcnJvcjogIit0aGlzLmF9fQpILmtZLnByb3RvdHlw
+ZT17CncoYSl7cmV0dXJuIkFzc2VydGlvbiBmYWlsZWQ6ICIrUC5obCh0aGlzLmEpfX0KSC5rci5wcm90
+b3R5cGU9e30KSC5ONS5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hfSwKZ2wwKGEpe3JldHVy
+biB0aGlzLmE9PT0wfSwKZ29yKGEpe3JldHVybiF0aGlzLmdsMCh0aGlzKX0sCmd2Yygpe3JldHVybiBu
+ZXcgSC5pNSh0aGlzLEguTGgodGhpcykuQygiaTU8MT4iKSl9LAp4NChhKXt2YXIgcz10aGlzLmIKaWYo
+cz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhpcy5YdShzLGEpfSwKcShhLGIpe3ZhciBzLHIscSxwLG89
+dGhpcyxuPW51bGwKaWYodHlwZW9mIGI9PSJzdHJpbmciKXtzPW8uYgppZihzPT1udWxsKXJldHVybiBu
+CnI9by5qMihzLGIpCnE9cj09bnVsbD9uOnIuYgpyZXR1cm4gcX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVt
+YmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3A9by5jCmlmKHA9PW51bGwpcmV0dXJuIG4Kcj1vLmoyKHAs
+YikKcT1yPT1udWxsP246ci5iCnJldHVybiBxfWVsc2UgcmV0dXJuIG8uYWEoYil9LAphYShhKXt2YXIg
+cyxyLHE9dGhpcyxwPXEuZAppZihwPT1udWxsKXJldHVybiBudWxsCnM9cS5CdChwLHEueGkoYSkpCnI9
+cS5GaChzLGEpCmlmKHI8MClyZXR1cm4gbnVsbApyZXR1cm4gc1tyXS5ifSwKWTUoYSxiLGMpe3ZhciBz
+LHIscT10aGlzLHA9SC5MaChxKQpwLmMuYShiKQpwLlFbMV0uYShjKQppZih0eXBlb2YgYj09InN0cmlu
+ZyIpe3M9cS5iCnEuRUgocz09bnVsbD9xLmI9cS56SygpOnMsYixjKX1lbHNlIGlmKHR5cGVvZiBiPT0i
+bnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3I9cS5jCnEuRUgocj09bnVsbD9xLmM9cS56SygpOnIs
+YixjKX1lbHNlIHEueHcoYixjKX0sCnh3KGEsYil7dmFyIHMscixxLHAsbz10aGlzLG49SC5MaChvKQpu
+LmMuYShhKQpuLlFbMV0uYShiKQpzPW8uZAppZihzPT1udWxsKXM9by5kPW8ueksoKQpyPW8ueGkoYSkK
+cT1vLkJ0KHMscikKaWYocT09bnVsbClvLkVJKHMscixbby5IbihhLGIpXSkKZWxzZXtwPW8uRmgocSxh
+KQppZihwPj0wKXFbcF0uYj1iCmVsc2UgcS5wdXNoKG8uSG4oYSxiKSl9fSwKSyhhLGIpe3ZhciBzLHIs
+cT10aGlzCkguTGgocSkuQygifigxLDIpIikuYShiKQpzPXEuZQpyPXEucgpmb3IoO3MhPW51bGw7KXti
+LiQyKHMuYSxzLmIpCmlmKHIhPT1xLnIpdGhyb3cgSC5iKFAuYTQocSkpCnM9cy5jfX0sCkVIKGEsYixj
+KXt2YXIgcyxyPXRoaXMscT1ILkxoKHIpCnEuYy5hKGIpCnEuUVsxXS5hKGMpCnM9ci5qMihhLGIpCmlm
+KHM9PW51bGwpci5FSShhLGIsci5IbihiLGMpKQplbHNlIHMuYj1jfSwKa3MoKXt0aGlzLnI9dGhpcy5y
+KzEmNjcxMDg4NjN9LApIbihhLGIpe3ZhciBzPXRoaXMscj1ILkxoKHMpLHE9bmV3IEgudmgoci5jLmEo
+YSksci5RWzFdLmEoYikpCmlmKHMuZT09bnVsbClzLmU9cy5mPXEKZWxzZXtyPXMuZgpyLnRvU3RyaW5n
+CnEuZD1yCnMuZj1yLmM9cX0rK3MuYQpzLmtzKCkKcmV0dXJuIHF9LAp4aShhKXtyZXR1cm4gSi5oZihh
+KSYweDNmZmZmZmZ9LApGaChhLGIpe3ZhciBzLHIKaWYoYT09bnVsbClyZXR1cm4tMQpzPWEubGVuZ3Ro
+CmZvcihyPTA7cjxzOysrcilpZihKLlJNKGFbcl0uYSxiKSlyZXR1cm4gcgpyZXR1cm4tMX0sCncoYSl7
+cmV0dXJuIFAubk8odGhpcyl9LApqMihhLGIpe3JldHVybiBhW2JdfSwKQnQoYSxiKXtyZXR1cm4gYVti
+XX0sCkVJKGEsYixjKXthW2JdPWN9LApybihhLGIpe2RlbGV0ZSBhW2JdfSwKWHUoYSxiKXtyZXR1cm4g
+dGhpcy5qMihhLGIpIT1udWxsfSwKeksoKXt2YXIgcz0iPG5vbi1pZGVudGlmaWVyLWtleT4iLHI9T2Jq
+ZWN0LmNyZWF0ZShudWxsKQp0aGlzLkVJKHIscyxyKQp0aGlzLnJuKHIscykKcmV0dXJuIHJ9LAokaUZv
+OjF9CkgudmgucHJvdG90eXBlPXt9CkguaTUucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIHRoaXMuYS5h
+fSwKZ2wwKGEpe3JldHVybiB0aGlzLmEuYT09PTB9LApnbShhKXt2YXIgcz10aGlzLmEscj1uZXcgSC5O
+NihzLHMucix0aGlzLiR0aS5DKCJONjwxPiIpKQpyLmM9cy5lCnJldHVybiByfSwKdGcoYSxiKXtyZXR1
+cm4gdGhpcy5hLng0KGIpfX0KSC5ONi5wcm90b3R5cGU9ewpnbCgpe3JldHVybiB0aGlzLmR9LApGKCl7
+dmFyIHMscj10aGlzLHE9ci5hCmlmKHIuYiE9PXEucil0aHJvdyBILmIoUC5hNChxKSkKcz1yLmMKaWYo
+cz09bnVsbCl7ci5zcVkobnVsbCkKcmV0dXJuITF9ZWxzZXtyLnNxWShzLmEpCnIuYz1zLmMKcmV0dXJu
+ITB9fSwKc3FZKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9CkguZEMucHJv
+dG90eXBlPXsKJDEoYSl7cmV0dXJuIHRoaXMuYShhKX0sCiRTOjR9Ckgud04ucHJvdG90eXBlPXsKJDIo
+YSxiKXtyZXR1cm4gdGhpcy5hKGEsYil9LAokUzo1MH0KSC5WWC5wcm90b3R5cGU9ewokMShhKXtyZXR1
+cm4gdGhpcy5hKEgubihhKSl9LAokUzoyMX0KSC5WUi5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJSZWdF
+eHAvIit0aGlzLmErIi8iK3RoaXMuYi5mbGFnc30sCmdIYygpe3ZhciBzPXRoaXMscj1zLmMKaWYociE9
+bnVsbClyZXR1cm4gcgpyPXMuYgpyZXR1cm4gcy5jPUgudjQocy5hLHIubXVsdGlsaW5lLCFyLmlnbm9y
+ZUNhc2Usci51bmljb2RlLHIuZG90QWxsLCEwKX0sCmRkKGEsYil7cmV0dXJuIG5ldyBILktXKHRoaXMs
+YiwwKX0sClVaKGEsYil7dmFyIHMscj10LksuYSh0aGlzLmdIYygpKQpyLmxhc3RJbmRleD1iCnM9ci5l
+eGVjKGEpCmlmKHM9PW51bGwpcmV0dXJuIG51bGwKcmV0dXJuIG5ldyBILkVLKHMpfSwKJGl2WDoxLAok
+aXdMOjF9CkguRUsucHJvdG90eXBlPXsKcShhLGIpe3ZhciBzCkguSVooYikKcz10aGlzLmIKaWYoYj49
+cy5sZW5ndGgpcmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX0sCiRpT2Q6MSwKJGlpYjoxfQpILktX
+LnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5QYih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9fQpI
+LlBiLnByb3RvdHlwZT17CmdsKCl7cmV0dXJuIHQuY3ouYSh0aGlzLmQpfSwKRigpe3ZhciBzLHIscSxw
+LG8sbixtPXRoaXMsbD1tLmIKaWYobD09bnVsbClyZXR1cm4hMQpzPW0uYwpyPWwubGVuZ3RoCmlmKHM8
+PXIpe3E9bS5hCnA9cS5VWihsLHMpCmlmKHAhPW51bGwpe20uZD1wCnM9cC5iCm89cy5pbmRleApuPW8r
+c1swXS5sZW5ndGgKaWYobz09PW4pe2lmKHEuYi51bmljb2RlKXtzPW0uYwpxPXMrMQppZihxPHIpe3M9
+Qy54Qi5PKGwscykKaWYocz49NTUyOTYmJnM8PTU2MzE5KXtzPUMueEIuTyhsLHEpCnM9cz49NTYzMjAm
+JnM8PTU3MzQzfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExCm49KHM/bisxOm4pKzF9bS5jPW4K
+cmV0dXJuITB9fW0uYj1tLmQ9bnVsbApyZXR1cm4hMX0sCiRpQW46MX0KSC50US5wcm90b3R5cGU9ewpx
+KGEsYil7SC5JWihiKQppZihiIT09MClILnYoUC5PNyhiLG51bGwpKQpyZXR1cm4gdGhpcy5jfSwKJGlP
+ZDoxfQpILnVuLnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRo
+aXMuYyl9fQpILlNkLnByb3RvdHlwZT17CkYoKXt2YXIgcyxyLHE9dGhpcyxwPXEuYyxvPXEuYixuPW8u
+bGVuZ3RoLG09cS5hLGw9bS5sZW5ndGgKaWYocCtuPmwpe3EuZD1udWxsCnJldHVybiExfXM9bS5pbmRl
+eE9mKG8scCkKaWYoczwwKXtxLmM9bCsxCnEuZD1udWxsCnJldHVybiExfXI9cytuCnEuZD1uZXcgSC50
+UShzLG8pCnEuYz1yPT09cS5jP3IrMTpyCnJldHVybiEwfSwKZ2woKXt2YXIgcz10aGlzLmQKcy50b1N0
+cmluZwpyZXR1cm4gc30sCiRpQW46MX0KSC5FVC5wcm90b3R5cGU9eyRpRVQ6MSwkaUFTOjF9CkguTFou
+cHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKJGlYajoxfQpILkRnLnByb3RvdHlwZT17
+CnEoYSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sClk1KGEsYixjKXtI
+LnJWKGMpCkgub2QoYixhLGEubGVuZ3RoKQphW2JdPWN9LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpI
+LlBnLnByb3RvdHlwZT17Clk1KGEsYixjKXtILklaKGMpCkgub2QoYixhLGEubGVuZ3RoKQphW2JdPWN9
+LAokaWJROjEsCiRpY1g6MSwKJGl6TToxfQpILnhqLnByb3RvdHlwZT17CnEoYSxiKXtILklaKGIpCkgu
+b2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguZEUucHJvdG90eXBlPXsKcShhLGIpe0guSVoo
+YikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5aQS5wcm90b3R5cGU9ewpxKGEsYil7
+SC5JWihiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmRULnByb3RvdHlwZT17CnEo
+YSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguUHEucHJvdG90eXBl
+PXsKcShhLGIpe0guSVooYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5lRS5wcm90
+b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9LApxKGEsYil7SC5JWihiKQpILm9kKGIsYSxhLmxl
+bmd0aCkKcmV0dXJuIGFbYl19fQpILlY2LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH0s
+CnEoYSxiKXtILklaKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX0sCiRpbjY6MX0KSC5S
+Ry5wcm90b3R5cGU9e30KSC5WUC5wcm90b3R5cGU9e30KSC5XQi5wcm90b3R5cGU9e30KSC5aRy5wcm90
+b3R5cGU9e30KSC5KYy5wcm90b3R5cGU9ewpDKGEpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLHRo
+aXMsYSl9LApLcShhKXtyZXR1cm4gSC52NSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfX0KSC5HLnByb3Rv
+dHlwZT17fQpILmtTLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIHRoaXMuYX19CkguaU0ucHJvdG90eXBl
+PXskaUV6OjF9ClAudGgucHJvdG90eXBlPXsKJDEoYSl7dmFyIHM9dGhpcy5hLHI9cy5hCnMuYT1udWxs
+CnIuJDAoKX0sCiRTOjEzfQpQLmhhLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIKdGhpcy5hLmE9dC5N
+LmEoYSkKcz10aGlzLmIKcj10aGlzLmMKcy5maXJzdENoaWxkP3MucmVtb3ZlQ2hpbGQocik6cy5hcHBl
+bmRDaGlsZChyKX0sCiRTOjQxfQpQLlZzLnByb3RvdHlwZT17CiQwKCl7dGhpcy5hLiQwKCl9LAokUzox
+NX0KUC5GdC5wcm90b3R5cGU9ewokMCgpe3RoaXMuYS4kMCgpfSwKJFM6MTV9ClAuVzMucHJvdG90eXBl
+PXsKQ1koYSxiKXtpZihzZWxmLnNldFRpbWVvdXQhPW51bGwpc2VsZi5zZXRUaW1lb3V0KEgudFIobmV3
+IFAueUgodGhpcyxiKSwwKSxhKQplbHNlIHRocm93IEguYihQLkw0KCJgc2V0VGltZW91dCgpYCBub3Qg
+Zm91bmQuIikpfX0KUC55SC5wcm90b3R5cGU9ewokMCgpe3RoaXMuYi4kMCgpfSwKJFM6MH0KUC5paC5w
+cm90b3R5cGU9ewphTShhLGIpe3ZhciBzLHI9dGhpcyxxPXIuJHRpCnEuQygiMS8/IikuYShiKQppZihi
+PT1udWxsKWI9cS5jLmEoYikKaWYoIXIuYilyLmEuWGYoYikKZWxzZXtzPXIuYQppZihxLkMoImI4PDE+
+IikuYihiKSlzLmNVKGIpCmVsc2Ugcy5YMihxLmMuYShiKSl9fSwKdzAoYSxiKXt2YXIgcz10aGlzLmEK
+aWYodGhpcy5iKXMuWkwoYSxiKQplbHNlIHMuTmsoYSxiKX19ClAuV00ucHJvdG90eXBlPXsKJDEoYSl7
+cmV0dXJuIHRoaXMuYS4kMigwLGEpfSwKJFM6NTF9ClAuU1gucHJvdG90eXBlPXsKJDIoYSxiKXt0aGlz
+LmEuJDIoMSxuZXcgSC5icShhLHQubC5hKGIpKSl9LAokUzo1M30KUC5Hcy5wcm90b3R5cGU9ewokMihh
+LGIpe3RoaXMuYShILklaKGEpLGIpfSwKJFM6NDV9ClAuRnkucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4i
+SXRlcmF0aW9uTWFya2VyKCIrdGhpcy5iKyIsICIrSC5Faih0aGlzLmEpKyIpIn19ClAuR1YucHJvdG90
+eXBlPXsKZ2woKXt2YXIgcz10aGlzLmMKaWYocz09bnVsbClyZXR1cm4gdGhpcy4kdGkuYy5hKHRoaXMu
+YikKcmV0dXJuIHMuZ2woKX0sCkYoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzCmZvcihzPW0uJHRpLkMo
+IkFuPDE+Iik7ITA7KXtyPW0uYwppZihyIT1udWxsKWlmKHIuRigpKXJldHVybiEwCmVsc2UgbS5zWDko
+bnVsbCkKcT1mdW5jdGlvbihhLGIsYyl7dmFyIGwsaz1iCndoaWxlKHRydWUpdHJ5e3JldHVybiBhKGss
+bCl9Y2F0Y2goail7bD1qCms9Y319KG0uYSwwLDEpCmlmKHEgaW5zdGFuY2VvZiBQLkZ5KXtwPXEuYgpp
+ZihwPT09Mil7bz1tLmQKaWYobz09bnVsbHx8by5sZW5ndGg9PT0wKXttLnNFQyhudWxsKQpyZXR1cm4h
+MX1pZigwPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLC0xKQptLmE9by5wb3AoKQpjb250aW51ZX1lbHNl
+e3I9cS5hCmlmKHA9PT0zKXRocm93IHIKZWxzZXtuPXMuYShKLklUKHIpKQppZihuIGluc3RhbmNlb2Yg
+UC5HVil7cj1tLmQKaWYocj09bnVsbClyPW0uZD1bXQpDLk5tLmkocixtLmEpCm0uYT1uLmEKY29udGlu
+dWV9ZWxzZXttLnNYOShuKQpjb250aW51ZX19fX1lbHNle20uc0VDKHEpCnJldHVybiEwfX1yZXR1cm4h
+MX0sCnNFQyhhKXt0aGlzLmI9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKc1g5KGEpe3RoaXMuYz10aGlz
+LiR0aS5DKCJBbjwxPj8iKS5hKGEpfSwKJGlBbjoxfQpQLnE0LnByb3RvdHlwZT17CmdtKGEpe3JldHVy
+biBuZXcgUC5HVih0aGlzLmEoKSx0aGlzLiR0aS5DKCJHVjwxPiIpKX19ClAuQ3cucHJvdG90eXBlPXsK
+dyhhKXtyZXR1cm4gSC5Faih0aGlzLmEpfSwKJGlYUzoxLApnSUkoKXtyZXR1cm4gdGhpcy5ifX0KUC5Q
+Zi5wcm90b3R5cGU9ewp3MChhLGIpe3ZhciBzCkguY2IoYSwiZXJyb3IiLHQuSykKcz10aGlzLmEKaWYo
+KHMuYSYzMCkhPT0wKXRocm93IEguYihQLlBWKCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKaWYo
+Yj09bnVsbCliPVAudjAoYSkKcy5OayhhLGIpfSwKcG0oYSl7cmV0dXJuIHRoaXMudzAoYSxudWxsKX19
+ClAuWmYucHJvdG90eXBlPXsKYU0oYSxiKXt2YXIgcyxyPXRoaXMuJHRpCnIuQygiMS8/IikuYShiKQpz
+PXRoaXMuYQppZigocy5hJjMwKSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBhbHJlYWR5IGNvbXBs
+ZXRlZCIpKQpzLlhmKHIuQygiMS8iKS5hKGIpKX19ClAuRmUucHJvdG90eXBlPXsKSFIoYSl7aWYoKHRo
+aXMuYyYxNSkhPT02KXJldHVybiEwCnJldHVybiB0aGlzLmIuYi5idih0LmFsLmEodGhpcy5kKSxhLmEs
+dC55LHQuSyl9LApLdyhhKXt2YXIgcyxyPXRoaXMscT1yLmUscD1udWxsLG89dC56LG49dC5LLG09YS5h
+LGw9ci5iLmIKaWYodC5rLmIocSkpcD1sLnJwKHEsbSxhLmIsbyxuLHQubCkKZWxzZSBwPWwuYnYodC52
+LmEocSksbSxvLG4pCnRyeXtvPXIuJHRpLkMoIjIvIikuYShwKQpyZXR1cm4gb31jYXRjaChzKXtpZih0
+LmVLLmIoSC5SdShzKSkpe2lmKChyLmMmMSkhPT0wKXRocm93IEguYihQLnhZKCJUaGUgZXJyb3IgaGFu
+ZGxlciBvZiBGdXR1cmUudGhlbiBtdXN0IHJldHVybiBhIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBmdXR1
+cmUncyB0eXBlIiwib25FcnJvciIpKQp0aHJvdyBILmIoUC54WSgiVGhlIGVycm9yIGhhbmRsZXIgb2Yg
+RnV0dXJlLmNhdGNoRXJyb3IgbXVzdCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgZnV0dXJlJ3MgdHlwZSIs
+Im9uRXJyb3IiKSl9ZWxzZSB0aHJvdyBzfX19ClAudnMucHJvdG90eXBlPXsKU3EoYSxiLGMpe3ZhciBz
+LHIscSxwPXRoaXMuJHRpCnAuS3EoYykuQygiMS8oMikiKS5hKGEpCnM9JC5YMwppZihzPT09Qy5OVSl7
+aWYoYiE9bnVsbCYmIXQuay5iKGIpJiYhdC52LmIoYikpdGhyb3cgSC5iKFAuTDMoYiwib25FcnJvciIs
+dS5jKSl9ZWxzZXtjLkMoIkA8MC8+IikuS3EocC5jKS5DKCIxKDIpIikuYShhKQppZihiIT1udWxsKWI9
+UC5WSChiLHMpfXI9bmV3IFAudnMocyxjLkMoInZzPDA+IikpCnE9Yj09bnVsbD8xOjMKdGhpcy54Zihu
+ZXcgUC5GZShyLHEsYSxiLHAuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiByfSwK
+VzcoYSxiKXtyZXR1cm4gdGhpcy5TcShhLG51bGwsYil9LApRZChhLGIsYyl7dmFyIHMscj10aGlzLiR0
+aQpyLktxKGMpLkMoIjEvKDIpIikuYShhKQpzPW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0aGlz
+LnhmKG5ldyBQLkZlKHMsMTksYSxiLHIuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkpCnJldHVy
+biBzfSwKUDkoYSl7dGhpcy5hPXRoaXMuYSYxfDE2CnRoaXMuYz1hfSwKdWcoYSl7dGhpcy5hPWEuYSYz
+MHx0aGlzLmEmMQp0aGlzLmM9YS5jfSwKeGYoYSl7dmFyIHMscj10aGlzLHE9ci5hCmlmKHE8PTMpe2Eu
+YT10LmUuYShyLmMpCnIuYz1hfWVsc2V7aWYoKHEmNCkhPT0wKXtzPXQuYy5hKHIuYykKaWYoKHMuYSYy
+NCk9PT0wKXtzLnhmKGEpCnJldHVybn1yLnVnKHMpfVAuVGsobnVsbCxudWxsLHIuYix0Lk0uYShuZXcg
+UC5kYShyLGEpKSl9fSwKalEoYSl7dmFyIHMscixxLHAsbyxuLG09dGhpcyxsPXt9CmwuYT1hCmlmKGE9
+PW51bGwpcmV0dXJuCnM9bS5hCmlmKHM8PTMpe3I9dC5lLmEobS5jKQptLmM9YQppZihyIT1udWxsKXtx
+PWEuYQpmb3IocD1hO3EhPW51bGw7cD1xLHE9bylvPXEuYQpwLmE9cn19ZWxzZXtpZigocyY0KSE9PTAp
+e249dC5jLmEobS5jKQppZigobi5hJjI0KT09PTApe24ualEoYSkKcmV0dXJufW0udWcobil9bC5hPW0u
+TjgoYSkKUC5UayhudWxsLG51bGwsbS5iLHQuTS5hKG5ldyBQLm9RKGwsbSkpKX19LAphaCgpe3ZhciBz
+PXQuZS5hKHRoaXMuYykKdGhpcy5jPW51bGwKcmV0dXJuIHRoaXMuTjgocyl9LApOOChhKXt2YXIgcyxy
+LHEKZm9yKHM9YSxyPW51bGw7cyE9bnVsbDtyPXMscz1xKXtxPXMuYQpzLmE9cn1yZXR1cm4gcn0sCmVj
+KGEpe3ZhciBzLHIscSxwPXRoaXMKcC5hXj0yCnRyeXthLlNxKG5ldyBQLnBWKHApLG5ldyBQLlU3KHAp
+LHQuUCl9Y2F0Y2gocSl7cz1ILlJ1KHEpCnI9SC50cyhxKQpQLnJiKG5ldyBQLnZyKHAscyxyKSl9fSwK
+WDIoYSl7dmFyIHMscj10aGlzCnIuJHRpLmMuYShhKQpzPXIuYWgoKQpyLmE9OApyLmM9YQpQLkhaKHIs
+cyl9LApaTChhLGIpe3ZhciBzCnQubC5hKGIpCnM9dGhpcy5haCgpCnRoaXMuUDkoUC5UbChhLGIpKQpQ
+LkhaKHRoaXMscyl9LApYZihhKXt2YXIgcz10aGlzLiR0aQpzLkMoIjEvIikuYShhKQppZihzLkMoImI4
+PDE+IikuYihhKSl7dGhpcy5jVShhKQpyZXR1cm59dGhpcy53VShzLmMuYShhKSl9LAp3VShhKXt2YXIg
+cz10aGlzCnMuJHRpLmMuYShhKQpzLmFePTIKUC5UayhudWxsLG51bGwscy5iLHQuTS5hKG5ldyBQLnJ0
+KHMsYSkpKX0sCmNVKGEpe3ZhciBzPXRoaXMscj1zLiR0aQpyLkMoImI4PDE+IikuYShhKQppZihyLmIo
+YSkpe2lmKChhLmEmMTYpIT09MCl7cy5hXj0yClAuVGsobnVsbCxudWxsLHMuYix0Lk0uYShuZXcgUC5L
+RihzLGEpKSl9ZWxzZSBQLkE5KGEscykKcmV0dXJufXMuZWMoYSl9LApOayhhLGIpe3RoaXMuYV49MgpQ
+LlRrKG51bGwsbnVsbCx0aGlzLmIsdC5NLmEobmV3IFAuWkwodGhpcyxhLGIpKSl9LAokaWI4OjF9ClAu
+ZGEucHJvdG90eXBlPXsKJDAoKXtQLkhaKHRoaXMuYSx0aGlzLmIpfSwKJFM6MH0KUC5vUS5wcm90b3R5
+cGU9ewokMCgpe1AuSFoodGhpcy5iLHRoaXMuYS5hKX0sCiRTOjB9ClAucFYucHJvdG90eXBlPXsKJDEo
+YSl7dmFyIHMscixxLHA9dGhpcy5hCnAuYV49Mgp0cnl7cC5YMihwLiR0aS5jLmEoYSkpfWNhdGNoKHEp
+e3M9SC5SdShxKQpyPUgudHMocSkKcC5aTChzLHIpfX0sCiRTOjEzfQpQLlU3LnByb3RvdHlwZT17CiQy
+KGEsYil7dGhpcy5hLlpMKHQuSy5hKGEpLHQubC5hKGIpKX0sCiRTOjM0fQpQLnZyLnByb3RvdHlwZT17
+CiQwKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KUC5ydC5wcm90b3R5cGU9ewokMCgp
+e3RoaXMuYS5YMih0aGlzLmIpfSwKJFM6MH0KUC5LRi5wcm90b3R5cGU9ewokMCgpe1AuQTkodGhpcy5i
+LHRoaXMuYSl9LAokUzowfQpQLlpMLnByb3RvdHlwZT17CiQwKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlz
+LmMpfSwKJFM6MH0KUC5SVC5wcm90b3R5cGU9ewokMCgpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMsbD1u
+dWxsCnRyeXtxPW0uYS5hCmw9cS5iLmIuenoodC5mTy5hKHEuZCksdC56KX1jYXRjaChwKXtzPUguUnUo
+cCkKcj1ILnRzKHApCnE9bS5jJiZ0Lm4uYShtLmIuYS5jKS5hPT09cwpvPW0uYQppZihxKW8uYz10Lm4u
+YShtLmIuYS5jKQplbHNlIG8uYz1QLlRsKHMscikKby5iPSEwCnJldHVybn1pZihsIGluc3RhbmNlb2Yg
+UC52cyYmKGwuYSYyNCkhPT0wKXtpZigobC5hJjE2KSE9PTApe3E9bS5hCnEuYz10Lm4uYShsLmMpCnEu
+Yj0hMH1yZXR1cm59aWYodC5pLmIobCkpe249bS5iLmEKcT1tLmEKcS5jPWwuVzcobmV3IFAualoobiks
+dC56KQpxLmI9ITF9fSwKJFM6MH0KUC5qWi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5hfSwK
+JFM6Mjl9ClAucnEucHJvdG90eXBlPXsKJDAoKXt2YXIgcyxyLHEscCxvLG4sbSxsCnRyeXtxPXRoaXMu
+YQpwPXEuYQpvPXAuJHRpCm49by5jCm09bi5hKHRoaXMuYikKcS5jPXAuYi5iLmJ2KG8uQygiMi8oMSki
+KS5hKHAuZCksbSxvLkMoIjIvIiksbil9Y2F0Y2gobCl7cz1ILlJ1KGwpCnI9SC50cyhsKQpxPXRoaXMu
+YQpxLmM9UC5UbChzLHIpCnEuYj0hMH19LAokUzowfQpQLlJXLnByb3RvdHlwZT17CiQwKCl7dmFyIHMs
+cixxLHAsbyxuLG09dGhpcwp0cnl7cz10Lm4uYShtLmEuYS5jKQpwPW0uYgppZihwLmEuSFIocykmJnAu
+YS5lIT1udWxsKXtwLmM9cC5hLkt3KHMpCnAuYj0hMX19Y2F0Y2gobyl7cj1ILlJ1KG8pCnE9SC50cyhv
+KQpwPXQubi5hKG0uYS5hLmMpCm49bS5iCmlmKHAuYT09PXIpbi5jPXAKZWxzZSBuLmM9UC5UbChyLHEp
+Cm4uYj0hMH19LAokUzowfQpQLk9NLnByb3RvdHlwZT17fQpQLnFoLnByb3RvdHlwZT17CmdBKGEpe3Zh
+ciBzLHIscT10aGlzLHA9e30sbz1uZXcgUC52cygkLlgzLHQuZkopCnAuYT0wCnM9SC5MaChxKQpyPXMu
+QygifigxKT8iKS5hKG5ldyBQLkI1KHAscSkpCnQuWi5hKG5ldyBQLnVPKHAsbykpClcuSkUocS5hLHEu
+YixyLCExLHMuYykKcmV0dXJuIG99fQpQLkI1LnByb3RvdHlwZT17CiQxKGEpe0guTGgodGhpcy5iKS5j
+LmEoYSk7Kyt0aGlzLmEuYX0sCiRTKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJ+KDEpIil9fQpQLnVP
+LnByb3RvdHlwZT17CiQwKCl7dmFyIHM9dGhpcy5iLHI9cy4kdGkscT1yLkMoIjEvIikuYSh0aGlzLmEu
+YSkscD1zLmFoKCkKci5jLmEocSkKcy5hPTgKcy5jPXEKUC5IWihzLHApfSwKJFM6MH0KUC5NTy5wcm90
+b3R5cGU9e30KUC5rVC5wcm90b3R5cGU9e30KUC54SS5wcm90b3R5cGU9e30KUC5tMC5wcm90b3R5cGU9
+eyRpUW06MX0KUC5Fdi5wcm90b3R5cGU9ewokMCgpe3ZhciBzPXQuSy5hKEguYih0aGlzLmEpKQpzLnN0
+YWNrPXRoaXMuYi53KDApCnRocm93IHN9LAokUzowfQpQLkppLnByb3RvdHlwZT17CmJIKGEpe3ZhciBz
+LHIscSxwLG8KdC5NLmEoYSkKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQwKCkKcmV0dXJufVAuVDgobnVs
+bCxudWxsLHRoaXMsYSx0LkgpfWNhdGNoKHEpe3M9SC5SdShxKQpyPUgudHMocSkKcD10LksuYShzKQpv
+PXQubC5hKHIpClAuU2kocCxvKX19LApEbChhLGIsYyl7dmFyIHMscixxLHAsbwpjLkMoIn4oMCkiKS5h
+KGEpCmMuYShiKQp0cnl7aWYoQy5OVT09PSQuWDMpe2EuJDEoYikKcmV0dXJufVAueXYobnVsbCxudWxs
+LHRoaXMsYSxiLHQuSCxjKX1jYXRjaChxKXtzPUguUnUocSkKcj1ILnRzKHEpCnA9dC5LLmEocykKbz10
+LmwuYShyKQpQLlNpKHAsbyl9fSwKR1koYSl7cmV0dXJuIG5ldyBQLlZwKHRoaXMsdC5NLmEoYSkpfSwK
+UHkoYSxiKXtyZXR1cm4gbmV3IFAuT1IodGhpcyxiLkMoIn4oMCkiKS5hKGEpLGIpfSwKcShhLGIpe3Jl
+dHVybiBudWxsfSwKenooYSxiKXtiLkMoIjAoKSIpLmEoYSkKaWYoJC5YMz09PUMuTlUpcmV0dXJuIGEu
+JDAoKQpyZXR1cm4gUC5UOChudWxsLG51bGwsdGhpcyxhLGIpfSwKYnYoYSxiLGMsZCl7Yy5DKCJAPDA+
+IikuS3EoZCkuQygiMSgyKSIpLmEoYSkKZC5hKGIpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQxKGIp
+CnJldHVybiBQLnl2KG51bGwsbnVsbCx0aGlzLGEsYixjLGQpfSwKcnAoYSxiLGMsZCxlLGYpe2QuQygi
+QDwwPiIpLktxKGUpLktxKGYpLkMoIjEoMiwzKSIpLmEoYSkKZS5hKGIpCmYuYShjKQppZigkLlgzPT09
+Qy5OVSlyZXR1cm4gYS4kMihiLGMpCnJldHVybiBQLlF4KG51bGwsbnVsbCx0aGlzLGEsYixjLGQsZSxm
+KX0sCkxqKGEsYixjLGQpe3JldHVybiBiLkMoIkA8MD4iKS5LcShjKS5LcShkKS5DKCIxKDIsMykiKS5h
+KGEpfX0KUC5WcC5wcm90b3R5cGU9ewokMCgpe3JldHVybiB0aGlzLmEuYkgodGhpcy5iKX0sCiRTOjB9
+ClAuT1IucHJvdG90eXBlPXsKJDEoYSl7dmFyIHM9dGhpcy5jCnJldHVybiB0aGlzLmEuRGwodGhpcy5i
+LHMuYShhKSxzKX0sCiRTKCl7cmV0dXJuIHRoaXMuYy5DKCJ+KDApIil9fQpQLmI2LnByb3RvdHlwZT17
+CmdtKGEpe3ZhciBzPXRoaXMscj1uZXcgUC5sbShzLHMucixILkxoKHMpLkMoImxtPDE+IikpCnIuYz1z
+LmUKcmV0dXJuIHJ9LApnQShhKXtyZXR1cm4gdGhpcy5hfSwKZ2wwKGEpe3JldHVybiB0aGlzLmE9PT0w
+fSwKZ29yKGEpe3JldHVybiB0aGlzLmEhPT0wfSwKdGcoYSxiKXt2YXIgcyxyCmlmKGIhPT0iX19wcm90
+b19fIil7cz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4hMQpyZXR1cm4gdC5nLmEoc1tiXSkhPW51bGx9
+ZWxzZXtyPXRoaXMuUFIoYikKcmV0dXJuIHJ9fSwKUFIoYSl7dmFyIHM9dGhpcy5kCmlmKHM9PW51bGwp
+cmV0dXJuITEKcmV0dXJuIHRoaXMuREYoc1t0aGlzLk4oYSldLGEpPj0wfSwKaShhLGIpe3ZhciBzLHIs
+cT10aGlzCkguTGgocSkuYy5hKGIpCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18i
+KXtzPXEuYgpyZXR1cm4gcS5KKHM9PW51bGw/cS5iPVAuVDIoKTpzLGIpfWVsc2UgaWYodHlwZW9mIGI9
+PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpe3I9cS5jCnJldHVybiBxLkoocj09bnVsbD9xLmM9
+UC5UMigpOnIsYil9ZWxzZSByZXR1cm4gcS5ZKGIpfSwKWShhKXt2YXIgcyxyLHEscD10aGlzCkguTGgo
+cCkuYy5hKGEpCnM9cC5kCmlmKHM9PW51bGwpcz1wLmQ9UC5UMigpCnI9cC5OKGEpCnE9c1tyXQppZihx
+PT1udWxsKXNbcl09W3AueW8oYSldCmVsc2V7aWYocC5ERihxLGEpPj0wKXJldHVybiExCnEucHVzaChw
+LnlvKGEpKX1yZXR1cm4hMH0sClIoYSxiKXt2YXIgcz10aGlzCmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYm
+YiE9PSJfX3Byb3RvX18iKXJldHVybiBzLkgocy5iLGIpCmVsc2UgaWYodHlwZW9mIGI9PSJudW1iZXIi
+JiYoYiYxMDczNzQxODIzKT09PWIpcmV0dXJuIHMuSChzLmMsYikKZWxzZSByZXR1cm4gcy5xZyhiKX0s
+CnFnKGEpe3ZhciBzLHIscSxwLG89dGhpcyxuPW8uZAppZihuPT1udWxsKXJldHVybiExCnM9by5OKGEp
+CnI9bltzXQpxPW8uREYocixhKQppZihxPDApcmV0dXJuITEKcD1yLnNwbGljZShxLDEpWzBdCmlmKDA9
+PT1yLmxlbmd0aClkZWxldGUgbltzXQpvLkcocCkKcmV0dXJuITB9LApKKGEsYil7SC5MaCh0aGlzKS5j
+LmEoYikKaWYodC5nLmEoYVtiXSkhPW51bGwpcmV0dXJuITEKYVtiXT10aGlzLnlvKGIpCnJldHVybiEw
+fSwKSChhLGIpe3ZhciBzCmlmKGE9PW51bGwpcmV0dXJuITEKcz10LmcuYShhW2JdKQppZihzPT1udWxs
+KXJldHVybiExCnRoaXMuRyhzKQpkZWxldGUgYVtiXQpyZXR1cm4hMH0sClMoKXt0aGlzLnI9dGhpcy5y
+KzEmMTA3Mzc0MTgyM30sCnlvKGEpe3ZhciBzLHI9dGhpcyxxPW5ldyBQLmJuKEguTGgocikuYy5hKGEp
+KQppZihyLmU9PW51bGwpci5lPXIuZj1xCmVsc2V7cz1yLmYKcy50b1N0cmluZwpxLmM9cwpyLmY9cy5i
+PXF9KytyLmEKci5TKCkKcmV0dXJuIHF9LApHKGEpe3ZhciBzPXRoaXMscj1hLmMscT1hLmIKaWYocj09
+bnVsbClzLmU9cQplbHNlIHIuYj1xCmlmKHE9PW51bGwpcy5mPXIKZWxzZSBxLmM9cjstLXMuYQpzLlMo
+KX0sCk4oYSl7cmV0dXJuIEouaGYoYSkmMTA3Mzc0MTgyM30sCkRGKGEsYil7dmFyIHMscgppZihhPT1u
+dWxsKXJldHVybi0xCnM9YS5sZW5ndGgKZm9yKHI9MDtyPHM7KytyKWlmKEouUk0oYVtyXS5hLGIpKXJl
+dHVybiByCnJldHVybi0xfX0KUC5ibi5wcm90b3R5cGU9e30KUC5sbS5wcm90b3R5cGU9ewpnbCgpe3Jl
+dHVybiB0aGlzLiR0aS5jLmEodGhpcy5kKX0sCkYoKXt2YXIgcz10aGlzLHI9cy5jLHE9cy5hCmlmKHMu
+YiE9PXEucil0aHJvdyBILmIoUC5hNChxKSkKZWxzZSBpZihyPT1udWxsKXtzLnNqKG51bGwpCnJldHVy
+biExfWVsc2V7cy5zaihzLiR0aS5DKCIxPyIpLmEoci5hKSkKcy5jPXIuYgpyZXR1cm4hMH19LApzaihh
+KXt0aGlzLmQ9dGhpcy4kdGkuQygiMT8iKS5hKGEpfSwKJGlBbjoxfQpQLm1XLnByb3RvdHlwZT17fQpQ
+LnV5LnByb3RvdHlwZT17JGliUToxLCRpY1g6MSwkaXpNOjF9ClAubEQucHJvdG90eXBlPXsKZ20oYSl7
+cmV0dXJuIG5ldyBILmE3KGEsdGhpcy5nQShhKSxILnpLKGEpLkMoImE3PGxELkU+IikpfSwKRShhLGIp
+e3JldHVybiB0aGlzLnEoYSxiKX0sCksoYSxiKXt2YXIgcyxyCkgueksoYSkuQygifihsRC5FKSIpLmEo
+YikKcz10aGlzLmdBKGEpCmZvcihyPTA7cjxzOysrcil7Yi4kMSh0aGlzLnEoYSxyKSkKaWYocyE9PXRo
+aXMuZ0EoYSkpdGhyb3cgSC5iKFAuYTQoYSkpfX0sCmdsMChhKXtyZXR1cm4gdGhpcy5nQShhKT09PTB9
+LApnb3IoYSl7cmV0dXJuIXRoaXMuZ2wwKGEpfSwKRTIoYSxiLGMpe3ZhciBzPUgueksoYSkKcmV0dXJu
+IG5ldyBILmxKKGEscy5LcShjKS5DKCIxKGxELkUpIikuYShiKSxzLkMoIkA8bEQuRT4iKS5LcShjKS5D
+KCJsSjwxLDI+IikpfSwKZVIoYSxiKXtyZXR1cm4gSC5xQyhhLGIsbnVsbCxILnpLKGEpLkMoImxELkUi
+KSl9LApkcihhLGIpe3JldHVybiBuZXcgSC5qVihhLEgueksoYSkuQygiQDxsRC5FPiIpLktxKGIpLkMo
+ImpWPDEsMj4iKSl9LApkdShhLGIsYyxkKXt2YXIgcyxyPUgueksoYSkKZD1yLkMoImxELkUiKS5hKHIu
+QygibEQuRT8iKS5hKGQpKQpQLmpCKGIsYyx0aGlzLmdBKGEpKQpmb3Iocz1iO3M8YzsrK3MpdGhpcy5Z
+NShhLHMsZCl9LAp3KGEpe3JldHVybiBQLngoYSwiWyIsIl0iKX19ClAuaWwucHJvdG90eXBlPXt9ClAu
+cmEucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyPXRoaXMuYQppZighci5hKXRoaXMuYi5hKz0iLCAi
+CnIuYT0hMQpyPXRoaXMuYgpzPXIuYSs9SC5FaihhKQpyLmE9cysiOiAiCnIuYSs9SC5FaihiKX0sCiRT
+Ojl9ClAuWWsucHJvdG90eXBlPXsKSyhhLGIpe3ZhciBzLHIscT1ILkxoKHRoaXMpCnEuQygifihZay5L
+LFlrLlYpIikuYShiKQpmb3Iocz1KLklUKHRoaXMuZ3ZjKCkpLHE9cS5DKCJZay5WIik7cy5GKCk7KXty
+PXMuZ2woKQpiLiQyKHIscS5hKHRoaXMucSgwLHIpKSl9fSwKZ1B1KGEpe3JldHVybiBKLk0xKHRoaXMu
+Z3ZjKCksbmV3IFAueVEodGhpcyksSC5MaCh0aGlzKS5DKCJOMzxZay5LLFlrLlY+IikpfSwKeDQoYSl7
+cmV0dXJuIEouemwodGhpcy5ndmMoKSxhKX0sCmdBKGEpe3JldHVybiBKLkhtKHRoaXMuZ3ZjKCkpfSwK
+Z2wwKGEpe3JldHVybiBKLnVVKHRoaXMuZ3ZjKCkpfSwKdyhhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCiRp
+WjA6MX0KUC55US5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyPXRoaXMuYSxxPUguTGgocikKcS5DKCJZ
+ay5LIikuYShhKQpzPXEuQygiWWsuViIpCnJldHVybiBuZXcgUC5OMyhhLHMuYShyLnEoMCxhKSkscS5D
+KCJAPFlrLks+IikuS3EocykuQygiTjM8MSwyPiIpKX0sCiRTKCl7cmV0dXJuIEguTGgodGhpcy5hKS5D
+KCJOMzxZay5LLFlrLlY+KFlrLkspIil9fQpQLktQLnByb3RvdHlwZT17Clk1KGEsYixjKXt2YXIgcz1I
+LkxoKHRoaXMpCnMuYy5hKGIpCnMuUVsxXS5hKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5
+IHVubW9kaWZpYWJsZSBtYXAiKSl9fQpQLlBuLnByb3RvdHlwZT17CnEoYSxiKXtyZXR1cm4gdGhpcy5h
+LnEoMCxiKX0sClk1KGEsYixjKXt2YXIgcz1ILkxoKHRoaXMpCnRoaXMuYS5ZNSgwLHMuYy5hKGIpLHMu
+UVsxXS5hKGMpKX0sCng0KGEpe3JldHVybiB0aGlzLmEueDQoYSl9LApLKGEsYil7dGhpcy5hLksoMCxI
+LkxoKHRoaXMpLkMoIn4oMSwyKSIpLmEoYikpfSwKZ2wwKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5n
+bDAocyl9LApnQShhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ0Eocyl9LAp3KGEpe3JldHVybiB0aGlz
+LmEudygwKX0sCmdQdShhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuZ1B1KHMpfSwKJGlaMDoxfQpQLkdq
+LnByb3RvdHlwZT17fQpQLmxmLnByb3RvdHlwZT17CmdsMChhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09
+PTB9LApnb3IoYSl7cmV0dXJuIHRoaXMuZ0EodGhpcykhPT0wfSwKRlYoYSxiKXt2YXIgcwpmb3Iocz1K
+LklUKEguTGgodGhpcykuQygiY1g8bGYuRT4iKS5hKGIpKTtzLkYoKTspdGhpcy5pKDAscy5nbCgpKX0s
+CncoYSl7cmV0dXJuIFAueCh0aGlzLCJ7IiwifSIpfSwKayhhLGIpe3ZhciBzLHIscT10aGlzLmdtKHRo
+aXMpCmlmKCFxLkYoKSlyZXR1cm4iIgpzPXEuJHRpLmMKaWYoYj09PSIiKXtyPSIiCmRvIHIrPUguRWoo
+cy5hKHEuZCkpCndoaWxlKHEuRigpKQpzPXJ9ZWxzZXtyPSIiK0guRWoocy5hKHEuZCkpCmZvcig7cS5G
+KCk7KXI9citiK0guRWoocy5hKHEuZCkpCnM9cn1yZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30s
+CmVSKGEsYil7cmV0dXJuIEguYksodGhpcyxiLEguTGgodGhpcykuQygibGYuRSIpKX0sCkUoYSxiKXt2
+YXIgcyxyLHEscCxvPSJpbmRleCIKSC5jYihiLG8sdC5TKQpQLmsxKGIsbykKZm9yKHM9dGhpcy5nbSh0
+aGlzKSxyPXMuJHRpLmMscT0wO3MuRigpOyl7cD1yLmEocy5kKQppZihiPT09cSlyZXR1cm4gcDsrK3F9
+dGhyb3cgSC5iKFAuQ2YoYix0aGlzLG8sbnVsbCxxKSl9fQpQLlZqLnByb3RvdHlwZT17JGliUToxLCRp
+Y1g6MSwkaXh1OjF9ClAuWHYucHJvdG90eXBlPXskaWJROjEsJGljWDoxLCRpeHU6MX0KUC5uWS5wcm90
+b3R5cGU9e30KUC5XWS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC5wUi5wcm90b3R5cGU9
+e30KUC51dy5wcm90b3R5cGU9ewpxKGEsYil7dmFyIHMscj10aGlzLmIKaWYocj09bnVsbClyZXR1cm4g
+dGhpcy5jLnEoMCxiKQplbHNlIGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbAplbHNle3M9
+cltiXQpyZXR1cm4gdHlwZW9mIHM9PSJ1bmRlZmluZWQiP3RoaXMuZmIoYik6c319LApnQShhKXt2YXIg
+cwppZih0aGlzLmI9PW51bGwpe3M9dGhpcy5jCnM9cy5nQShzKX1lbHNlIHM9dGhpcy5DZigpLmxlbmd0
+aApyZXR1cm4gc30sCmdsMChhKXtyZXR1cm4gdGhpcy5nQSh0aGlzKT09PTB9LApndmMoKXtpZih0aGlz
+LmI9PW51bGwpcmV0dXJuIHRoaXMuYy5ndmMoKQpyZXR1cm4gbmV3IFAuaTgodGhpcyl9LApZNShhLGIs
+Yyl7dmFyIHMscixxPXRoaXMKaWYocS5iPT1udWxsKXEuYy5ZNSgwLGIsYykKZWxzZSBpZihxLng0KGIp
+KXtzPXEuYgpzW2JdPWMKcj1xLmEKaWYocj09bnVsbD9zIT1udWxsOnIhPT1zKXJbYl09bnVsbH1lbHNl
+IHEuWEsoKS5ZNSgwLGIsYyl9LAp4NChhKXtpZih0aGlzLmI9PW51bGwpcmV0dXJuIHRoaXMuYy54NChh
+KQpyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxhKX0sCkso
+YSxiKXt2YXIgcyxyLHEscCxvPXRoaXMKdC5jQS5hKGIpCmlmKG8uYj09bnVsbClyZXR1cm4gby5jLkso
+MCxiKQpzPW8uQ2YoKQpmb3Iocj0wO3I8cy5sZW5ndGg7KytyKXtxPXNbcl0KcD1vLmJbcV0KaWYodHlw
+ZW9mIHA9PSJ1bmRlZmluZWQiKXtwPVAuUWUoby5hW3FdKQpvLmJbcV09cH1iLiQyKHEscCkKaWYocyE9
+PW8uYyl0aHJvdyBILmIoUC5hNChvKSl9fSwKQ2YoKXt2YXIgcz10LmJNLmEodGhpcy5jKQppZihzPT1u
+dWxsKXM9dGhpcy5jPUguUUkoT2JqZWN0LmtleXModGhpcy5hKSx0LnMpCnJldHVybiBzfSwKWEsoKXt2
+YXIgcyxyLHEscCxvLG49dGhpcwppZihuLmI9PW51bGwpcmV0dXJuIG4uYwpzPVAuRmwodC5OLHQueikK
+cj1uLkNmKCkKZm9yKHE9MDtwPXIubGVuZ3RoLHE8cDsrK3Epe289cltxXQpzLlk1KDAsbyxuLnEoMCxv
+KSl9aWYocD09PTApQy5ObS5pKHIsIiIpCmVsc2UgQy5ObS5zQShyLDApCm4uYT1uLmI9bnVsbApyZXR1
+cm4gbi5jPXN9LApmYihhKXt2YXIgcwppZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5j
+YWxsKHRoaXMuYSxhKSlyZXR1cm4gbnVsbApzPVAuUWUodGhpcy5hW2FdKQpyZXR1cm4gdGhpcy5iW2Fd
+PXN9fQpQLmk4LnByb3RvdHlwZT17CmdBKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4gcy5nQShzKX0sCkUo
+YSxiKXt2YXIgcz10aGlzLmEKaWYocy5iPT1udWxsKXM9cy5ndmMoKS5FKDAsYikKZWxzZXtzPXMuQ2Yo
+KQppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKcz1zW2JdfXJldHVybiBzfSwKZ20o
+YSl7dmFyIHM9dGhpcy5hCmlmKHMuYj09bnVsbCl7cz1zLmd2YygpCnM9cy5nbShzKX1lbHNle3M9cy5D
+ZigpCnM9bmV3IEoubTEocyxzLmxlbmd0aCxILnQ2KHMpLkMoIm0xPDE+IikpfXJldHVybiBzfSwKdGco
+YSxiKXtyZXR1cm4gdGhpcy5hLng0KGIpfX0KUC54ci5wcm90b3R5cGU9ewokMCgpe3ZhciBzLHIKdHJ5
+e3M9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOnRydWV9KQpyZXR1cm4gc31jYXRjaChyKXtI
+LlJ1KHIpfXJldHVybiBudWxsfSwKJFM6MTB9ClAuTnoucHJvdG90eXBlPXsKJDAoKXt2YXIgcyxyCnRy
+eXtzPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtmYXRhbDpmYWxzZX0pCnJldHVybiBzfWNhdGNoKHIp
+e0guUnUocil9cmV0dXJuIG51bGx9LAokUzoxMH0KUC5DVi5wcm90b3R5cGU9ewp5cihhMSxhMixhMyl7
+dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGEsYTA9IkludmFsaWQgYmFzZTY0
+IGVuY29kaW5nIGxlbmd0aCAiCmEzPVAuakIoYTIsYTMsYTEubGVuZ3RoKQpzPSQuVjcoKQpmb3Iocj1z
+Lmxlbmd0aCxxPWEyLHA9cSxvPW51bGwsbj0tMSxtPS0xLGw9MDtxPGEzO3E9ayl7az1xKzEKaj1DLnhC
+LlcoYTEscSkKaWYoaj09PTM3KXtpPWsrMgppZihpPD1hMyl7aD1ILm9vKEMueEIuVyhhMSxrKSkKZz1I
+Lm9vKEMueEIuVyhhMSxrKzEpKQpmPWgqMTYrZy0oZyYyNTYpCmlmKGY9PT0zNylmPS0xCms9aX1lbHNl
+IGY9LTF9ZWxzZSBmPWoKaWYoMDw9ZiYmZjw9MTI3KXtpZihmPDB8fGY+PXIpcmV0dXJuIEguT0gocyxm
+KQplPXNbZl0KaWYoZT49MCl7Zj1DLnhCLk8oIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVm
+Z2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGUpCmlmKGY9PT1qKWNvbnRpbnVlCmo9Zn1l
+bHNle2lmKGU9PT0tMSl7aWYobjwwKXtkPW89PW51bGw/bnVsbDpvLmEubGVuZ3RoCmlmKGQ9PW51bGwp
+ZD0wCm49ZCsocS1wKQptPXF9KytsCmlmKGo9PT02MSljb250aW51ZX1qPWZ9aWYoZSE9PS0yKXtpZihv
+PT1udWxsKXtvPW5ldyBQLk0oIiIpCmQ9b31lbHNlIGQ9bwpjPWQuYSs9Qy54Qi5OaihhMSxwLHEpCmQu
+YT1jK0guTHcoaikKcD1rCmNvbnRpbnVlfX10aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgZGF0
+YSIsYTEscSkpfWlmKG8hPW51bGwpe3I9by5hKz1DLnhCLk5qKGExLHAsYTMpCmQ9ci5sZW5ndGgKaWYo
+bj49MClQLnhNKGExLG0sYTMsbixsLGQpCmVsc2V7Yj1DLmpuLnpZKGQtMSw0KSsxCmlmKGI9PT0xKXRo
+cm93IEguYihQLnJyKGEwLGExLGEzKSkKZm9yKDtiPDQ7KXtyKz0iPSIKby5hPXI7KytifX1yPW8uYQpy
+ZXR1cm4gQy54Qi5pNyhhMSxhMixhMyxyLmNoYXJDb2RlQXQoMCk9PTA/cjpyKX1hPWEzLWEyCmlmKG4+
+PTApUC54TShhMSxtLGEzLG4sbCxhKQplbHNle2I9Qy5qbi56WShhLDQpCmlmKGI9PT0xKXRocm93IEgu
+YihQLnJyKGEwLGExLGEzKSkKaWYoYj4xKWExPUMueEIuaTcoYTEsYTMsYTMsYj09PTI/Ij09IjoiPSIp
+fXJldHVybiBhMX19ClAuVTgucHJvdG90eXBlPXt9ClAuVWsucHJvdG90eXBlPXt9ClAud0kucHJvdG90
+eXBlPXt9ClAuWmkucHJvdG90eXBlPXt9ClAuVWQucHJvdG90eXBlPXsKdyhhKXt2YXIgcz1QLmhsKHRo
+aXMuYSkKcmV0dXJuKHRoaXMuYiE9bnVsbD8iQ29udmVydGluZyBvYmplY3QgdG8gYW4gZW5jb2RhYmxl
+IG9iamVjdCBmYWlsZWQ6IjoiQ29udmVydGluZyBvYmplY3QgZGlkIG5vdCByZXR1cm4gYW4gZW5jb2Rh
+YmxlIG9iamVjdDoiKSsiICIrc319ClAuSzgucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iQ3ljbGljIGVy
+cm9yIGluIEpTT04gc3RyaW5naWZ5In19ClAuYnkucHJvdG90eXBlPXsKcFcoYSxiLGMpe3ZhciBzCnQu
+ZlYuYShjKQpzPVAuQlMoYix0aGlzLmdIZSgpLmEpCnJldHVybiBzfSwKT0IoYSxiKXt2YXIgcwp0LmRB
+LmEoYikKcz1QLnVYKGEsdGhpcy5nWkUoKS5iLG51bGwpCnJldHVybiBzfSwKZ1pFKCl7cmV0dXJuIEMu
+blh9LApnSGUoKXtyZXR1cm4gQy5BM319ClAub2oucHJvdG90eXBlPXt9ClAuTXgucHJvdG90eXBlPXt9
+ClAuU2gucHJvdG90eXBlPXsKUlQoYSl7dmFyIHMscixxLHAsbyxuLG09YS5sZW5ndGgKZm9yKHM9dGhp
+cy5jLHI9MCxxPTA7cTxtOysrcSl7cD1DLnhCLlcoYSxxKQppZihwPjkyKXtpZihwPj01NTI5Nil7bz1w
+JjY0NTEyCmlmKG89PT01NTI5Nil7bj1xKzEKbj0hKG48bSYmKEMueEIuVyhhLG4pJjY0NTEyKT09PTU2
+MzIwKX1lbHNlIG49ITEKaWYoIW4paWYobz09PTU2MzIwKXtvPXEtMQpvPSEobz49MCYmKEMueEIuTyhh
+LG8pJjY0NTEyKT09PTU1Mjk2KX1lbHNlIG89ITEKZWxzZSBvPSEwCmlmKG8pe2lmKHE+cilzLmErPUMu
+eEIuTmooYSxyLHEpCnI9cSsxCm89cy5hKz1ILkx3KDkyKQpvKz1ILkx3KDExNykKcy5hPW8Kbys9SC5M
+dygxMDApCnMuYT1vCm49cD4+PjgmMTUKbys9SC5MdyhuPDEwPzQ4K246ODcrbikKcy5hPW8Kbj1wPj4+
+NCYxNQpvKz1ILkx3KG48MTA/NDgrbjo4NytuKQpzLmE9bwpuPXAmMTUKcy5hPW8rSC5MdyhuPDEwPzQ4
+K246ODcrbil9fWNvbnRpbnVlfWlmKHA8MzIpe2lmKHE+cilzLmErPUMueEIuTmooYSxyLHEpCnI9cSsx
+Cm89cy5hKz1ILkx3KDkyKQpzd2l0Y2gocCl7Y2FzZSA4OnMuYT1vK0guTHcoOTgpCmJyZWFrCmNhc2Ug
+OTpzLmE9bytILkx3KDExNikKYnJlYWsKY2FzZSAxMDpzLmE9bytILkx3KDExMCkKYnJlYWsKY2FzZSAx
+MjpzLmE9bytILkx3KDEwMikKYnJlYWsKY2FzZSAxMzpzLmE9bytILkx3KDExNCkKYnJlYWsKZGVmYXVs
+dDpvKz1ILkx3KDExNykKcy5hPW8Kbys9SC5Mdyg0OCkKcy5hPW8Kbys9SC5Mdyg0OCkKcy5hPW8Kbj1w
+Pj4+NCYxNQpvKz1ILkx3KG48MTA/NDgrbjo4NytuKQpzLmE9bwpuPXAmMTUKcy5hPW8rSC5MdyhuPDEw
+PzQ4K246ODcrbikKYnJlYWt9fWVsc2UgaWYocD09PTM0fHxwPT09OTIpe2lmKHE+cilzLmErPUMueEIu
+TmooYSxyLHEpCnI9cSsxCm89cy5hKz1ILkx3KDkyKQpzLmE9bytILkx3KHApfX1pZihyPT09MClzLmEr
+PWEKZWxzZSBpZihyPG0pcy5hKz1DLnhCLk5qKGEscixtKX0sCkpuKGEpe3ZhciBzLHIscSxwCmZvcihz
+PXRoaXMuYSxyPXMubGVuZ3RoLHE9MDtxPHI7KytxKXtwPXNbcV0KaWYoYT09bnVsbD9wPT1udWxsOmE9
+PT1wKXRocm93IEguYihuZXcgUC5LOChhLG51bGwpKX1DLk5tLmkocyxhKX0sCmlVKGEpe3ZhciBzLHIs
+cSxwLG89dGhpcwppZihvLnRNKGEpKXJldHVybgpvLkpuKGEpCnRyeXtzPW8uYi4kMShhKQppZighby50
+TShzKSl7cT1QLkd5KGEsbnVsbCxvLmdWSygpKQp0aHJvdyBILmIocSl9cT1vLmEKaWYoMD49cS5sZW5n
+dGgpcmV0dXJuIEguT0gocSwtMSkKcS5wb3AoKX1jYXRjaChwKXtyPUguUnUocCkKcT1QLkd5KGEscixv
+LmdWSygpKQp0aHJvdyBILmIocSl9fSwKdE0oYSl7dmFyIHMscixxPXRoaXMKaWYodHlwZW9mIGE9PSJu
+dW1iZXIiKXtpZighaXNGaW5pdGUoYSkpcmV0dXJuITEKcS5jLmErPUMuQ0QudyhhKQpyZXR1cm4hMH1l
+bHNlIGlmKGE9PT0hMCl7cS5jLmErPSJ0cnVlIgpyZXR1cm4hMH1lbHNlIGlmKGE9PT0hMSl7cS5jLmEr
+PSJmYWxzZSIKcmV0dXJuITB9ZWxzZSBpZihhPT1udWxsKXtxLmMuYSs9Im51bGwiCnJldHVybiEwfWVs
+c2UgaWYodHlwZW9mIGE9PSJzdHJpbmciKXtzPXEuYwpzLmErPSciJwpxLlJUKGEpCnMuYSs9JyInCnJl
+dHVybiEwfWVsc2UgaWYodC5qLmIoYSkpe3EuSm4oYSkKcS5sSyhhKQpzPXEuYQppZigwPj1zLmxlbmd0
+aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnJldHVybiEwfWVsc2UgaWYodC5mLmIoYSkpe3EuSm4o
+YSkKcj1xLmp3KGEpCnM9cS5hCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkK
+cmV0dXJuIHJ9ZWxzZSByZXR1cm4hMX0sCmxLKGEpe3ZhciBzLHIscT10aGlzLmMKcS5hKz0iWyIKcz1K
+LlU2KGEpCmlmKHMuZ29yKGEpKXt0aGlzLmlVKHMucShhLDApKQpmb3Iocj0xO3I8cy5nQShhKTsrK3Ip
+e3EuYSs9IiwiCnRoaXMuaVUocy5xKGEscikpfX1xLmErPSJdIn0sCmp3KGEpe3ZhciBzLHIscSxwLG8s
+bixtPXRoaXMsbD17fQppZihhLmdsMChhKSl7bS5jLmErPSJ7fSIKcmV0dXJuITB9cz1hLmdBKGEpKjIK
+cj1QLk84KHMsbnVsbCwhMSx0LlgpCnE9bC5hPTAKbC5iPSEwCmEuSygwLG5ldyBQLnRpKGwscikpCmlm
+KCFsLmIpcmV0dXJuITEKcD1tLmMKcC5hKz0ieyIKZm9yKG89JyInO3E8cztxKz0yLG89JywiJyl7cC5h
+Kz1vCm0uUlQoSC5uKHJbcV0pKQpwLmErPSciOicKbj1xKzEKaWYobj49cylyZXR1cm4gSC5PSChyLG4p
+Cm0uaVUocltuXSl9cC5hKz0ifSIKcmV0dXJuITB9fQpQLnRpLnByb3RvdHlwZT17CiQyKGEsYil7dmFy
+IHMscgppZih0eXBlb2YgYSE9InN0cmluZyIpdGhpcy5hLmI9ITEKcz10aGlzLmIKcj10aGlzLmEKQy5O
+bS5ZNShzLHIuYSsrLGEpCkMuTm0uWTUocyxyLmErKyxiKX0sCiRTOjl9ClAudHUucHJvdG90eXBlPXsK
+Z1ZLKCl7dmFyIHM9dGhpcy5jLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fQpQLnU1LnBy
+b3RvdHlwZT17CmdaRSgpe3JldHVybiBDLlFrfX0KUC5FMy5wcm90b3R5cGU9ewpXSihhKXt2YXIgcyxy
+LHEscD1QLmpCKDAsbnVsbCxhLmxlbmd0aCksbz1wLTAKaWYobz09PTApcmV0dXJuIG5ldyBVaW50OEFy
+cmF5KDApCnM9byozCnI9bmV3IFVpbnQ4QXJyYXkocykKcT1uZXcgUC5SdyhyKQppZihxLkd4KGEsMCxw
+KSE9PXApe0MueEIuTyhhLHAtMSkKcS5STygpfXJldHVybiBuZXcgVWludDhBcnJheShyLnN1YmFycmF5
+KDAsSC5yTSgwLHEuYixzKSkpfX0KUC5Sdy5wcm90b3R5cGU9ewpSTygpe3ZhciBzPXRoaXMscj1zLmMs
+cT1zLmIscD1zLmI9cSsxLG89ci5sZW5ndGgKaWYocT49bylyZXR1cm4gSC5PSChyLHEpCnJbcV09MjM5
+CnE9cy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xOTEKcy5iPXErMQppZihxPj1v
+KXJldHVybiBILk9IKHIscSkKcltxXT0xODl9LApPNihhLGIpe3ZhciBzLHIscSxwLG8sbj10aGlzCmlm
+KChiJjY0NTEyKT09PTU2MzIwKXtzPTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAyMwpyPW4uYwpxPW4u
+YgpwPW4uYj1xKzEKbz1yLmxlbmd0aAppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT1zPj4+MTh8
+MjQwCnE9bi5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT1zPj4+MTImNjN8MTI4CnA9
+bi5iPXErMQppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT1zPj4+NiY2M3wxMjgKbi5iPXArMQpp
+ZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT1zJjYzfDEyOApyZXR1cm4hMH1lbHNle24uUk8oKQpy
+ZXR1cm4hMX19LApHeChhLGIsYyl7dmFyIHMscixxLHAsbyxuLG0sbD10aGlzCmlmKGIhPT1jJiYoQy54
+Qi5PKGEsYy0xKSY2NDUxMik9PT01NTI5NiktLWMKZm9yKHM9bC5jLHI9cy5sZW5ndGgscT1iO3E8Yzsr
+K3Epe3A9Qy54Qi5XKGEscSkKaWYocDw9MTI3KXtvPWwuYgppZihvPj1yKWJyZWFrCmwuYj1vKzEKc1tv
+XT1wfWVsc2V7bz1wJjY0NTEyCmlmKG89PT01NTI5Nil7aWYobC5iKzQ+cilicmVhawpuPXErMQppZihs
+Lk82KHAsQy54Qi5XKGEsbikpKXE9bn1lbHNlIGlmKG89PT01NjMyMCl7aWYobC5iKzM+cilicmVhawps
+LlJPKCl9ZWxzZSBpZihwPD0yMDQ3KXtvPWwuYgptPW8rMQppZihtPj1yKWJyZWFrCmwuYj1tCmlmKG8+
+PXIpcmV0dXJuIEguT0gocyxvKQpzW29dPXA+Pj42fDE5MgpsLmI9bSsxCnNbbV09cCY2M3wxMjh9ZWxz
+ZXtvPWwuYgppZihvKzI+PXIpYnJlYWsKbT1sLmI9bysxCmlmKG8+PXIpcmV0dXJuIEguT0gocyxvKQpz
+W29dPXA+Pj4xMnwyMjQKbz1sLmI9bSsxCmlmKG0+PXIpcmV0dXJuIEguT0gocyxtKQpzW21dPXA+Pj42
+JjYzfDEyOApsLmI9bysxCmlmKG8+PXIpcmV0dXJuIEguT0gocyxvKQpzW29dPXAmNjN8MTI4fX19cmV0
+dXJuIHF9fQpQLkdZLnByb3RvdHlwZT17CldKKGEpe3ZhciBzLHIKdC5MLmEoYSkKcz10aGlzLmEKcj1Q
+Lmt5KHMsYSwwLG51bGwpCmlmKHIhPW51bGwpcmV0dXJuIHIKcmV0dXJuIG5ldyBQLmJ6KHMpLk5lKGEs
+MCxudWxsLCEwKX19ClAuYnoucHJvdG90eXBlPXsKTmUoYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuPXRo
+aXMKdC5MLmEoYSkKcz1QLmpCKGIsYyxKLkhtKGEpKQppZihiPT09cylyZXR1cm4iIgpyPVAuankoYSxi
+LHMpCnE9bi5oTyhyLDAscy1iLCEwKQpwPW4uYgppZigocCYxKSE9PTApe289UC5qNChwKQpuLmI9MAp0
+aHJvdyBILmIoUC5ycihvLGEsYituLmMpKX1yZXR1cm4gcX0sCmhPKGEsYixjLGQpe3ZhciBzLHIscT10
+aGlzCmlmKGMtYj4xMDAwKXtzPUMuam4uQlUoYitjLDIpCnI9cS5oTyhhLGIscywhMSkKaWYoKHEuYiYx
+KSE9PTApcmV0dXJuIHIKcmV0dXJuIHIrcS5oTyhhLHMsYyxkKX1yZXR1cm4gcS5FaChhLGIsYyxkKX0s
+CkVoKGEsYixjLGQpe3ZhciBzLHIscSxwLG8sbixtLGwsaz10aGlzLGo9NjU1MzMsaT1rLmIsaD1rLmMs
+Zz1uZXcgUC5NKCIiKSxmPWIrMSxlPWEubGVuZ3RoCmlmKGI8MHx8Yj49ZSlyZXR1cm4gSC5PSChhLGIp
+CnM9YVtiXQokbGFiZWwwJDA6Zm9yKHI9ay5hOyEwOyl7Zm9yKDshMDtmPW8pe3E9Qy54Qi5XKCJBQUFB
 QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
-QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFGRkZGRkZGRkZGRkZGRkZG
-R0dHR0dHR0dHR0dHR0dHR0hISEhISEhISEhISEhISEhISEhISEhISEhISElISEhKRUVCQkJCQkJCQkJC
-QkJCQkJCQkJCQkJCQkJCQkJCQkJLQ0NDQ0NDQ0NDQ0NDRENMT05OTk1FRUVFRUVFRUVFRSIscykmMzEK
-aD1pPD0zMj9zJjYxNjk0Pj4+cToocyY2M3xoPDw2KT4+PjAKaT1DLnhCLlcoIiBceDAwMDpYRUNDQ0ND
-TjpsRGIgXHgwMDA6WEVDQ0NDQ052bERiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBBQUFBQVx4MDBceDAwXHgw
-MFx4MDBceDAwQUFBQUEwMDAwMEFBQUFBOjo6OjpBQUFBQUdHMDAwQUFBQUEwMEtLS0FBQUFBRzo6OjpB
-QUFBQTpJSUlJQUFBQUEwMDBceDgwMEFBQUFBXHgwMFx4MDBceDAwXHgwMCBBQUFBQSIsaStxKQppZihp
-PT09MCl7Zy5hKz1ILkx3KGgpCmlmKGY9PT1jKWJyZWFrICRsYWJlbDAkMApicmVha31lbHNlIGlmKChp
-JjEpIT09MCl7aWYocilzd2l0Y2goaSl7Y2FzZSA2OTpjYXNlIDY3OmcuYSs9SC5MdyhqKQpicmVhawpj
-YXNlIDY1OmcuYSs9SC5MdyhqKTstLWYKYnJlYWsKZGVmYXVsdDpwPWcuYSs9SC5MdyhqKQpnLmE9cCtI
-Lkx3KGopCmJyZWFrfWVsc2V7ay5iPWkKay5jPWYtMQpyZXR1cm4iIn1pPTB9aWYoZj09PWMpYnJlYWsg
-JGxhYmVsMCQwCm89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChhLGYpCnM9YVtmXX1vPWYrMQpp
-ZihmPDB8fGY+PWUpcmV0dXJuIEguT0goYSxmKQpzPWFbZl0KaWYoczwxMjgpe3doaWxlKCEwKXtpZigh
-KG88Yykpe249YwpicmVha31tPW8rMQppZihvPDB8fG8+PWUpcmV0dXJuIEguT0goYSxvKQpzPWFbb10K
-aWYocz49MTI4KXtuPW0tMQpvPW0KYnJlYWt9bz1tfWlmKG4tZjwyMClmb3IobD1mO2w8bjsrK2wpe2lm
-KGw+PWUpcmV0dXJuIEguT0goYSxsKQpnLmErPUguTHcoYVtsXSl9ZWxzZSBnLmErPVAuSE0oYSxmLG4p
-CmlmKG49PT1jKWJyZWFrICRsYWJlbDAkMApmPW99ZWxzZSBmPW99aWYoZCYmaT4zMilpZihyKWcuYSs9
-SC5MdyhqKQplbHNle2suYj03NwprLmM9YwpyZXR1cm4iIn1rLmI9aQprLmM9aAplPWcuYQpyZXR1cm4g
-ZS5jaGFyQ29kZUF0KDApPT0wP2U6ZX19ClAuV0YucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEK
-dC5mby5hKGEpCnM9dGhpcy5iCnI9dGhpcy5hCnE9cy5hKz1yLmEKcSs9YS5hCnMuYT1xCnMuYT1xKyI6
-ICIKcy5hKz1QLmhsKGIpCnIuYT0iLCAifSwKJFM6Mjh9ClAuaVAucHJvdG90eXBlPXsKRE4oYSxiKXtp
-ZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgUC5pUCYmdGhpcy5hPT09Yi5hJiYh
-MH0sCmdpTyhhKXt2YXIgcz10aGlzLmEKcmV0dXJuKHNeQy5qbi53RyhzLDMwKSkmMTA3Mzc0MTgyM30s
-CncoYSl7dmFyIHM9dGhpcyxyPVAuR3EoSC50SihzKSkscT1QLmgwKEguTlMocykpLHA9UC5oMChILmpB
-KHMpKSxvPVAuaDAoSC5JWChzKSksbj1QLmgwKEguY2gocykpLG09UC5oMChILkpkKHMpKSxsPVAuVngo
-SC5vMShzKSksaz1yKyItIitxKyItIitwKyIgIitvKyI6IituKyI6IittKyIuIitsCnJldHVybiBrfX0K
-UC5YUy5wcm90b3R5cGU9ewpnSUkoKXtyZXR1cm4gSC50cyh0aGlzLiR0aHJvd25Kc0Vycm9yKX19ClAu
-QzYucHJvdG90eXBlPXsKdyhhKXt2YXIgcz10aGlzLmEKaWYocyE9bnVsbClyZXR1cm4iQXNzZXJ0aW9u
-IGZhaWxlZDogIitQLmhsKHMpCnJldHVybiJBc3NlcnRpb24gZmFpbGVkIn19ClAuRXoucHJvdG90eXBl
-PXt9ClAuRi5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJUaHJvdyBvZiBudWxsLiJ9fQpQLkFULnByb3Rv
-dHlwZT17CmdaKCl7cmV0dXJuIkludmFsaWQgYXJndW1lbnQiKyghdGhpcy5hPyIocykiOiIiKX0sCmd1
-KCl7cmV0dXJuIiJ9LAp3KGEpe3ZhciBzLHIscT10aGlzLHA9cS5jLG89cD09bnVsbD8iIjoiICgiK3Ar
-IikiLG49cS5kLG09bj09bnVsbD8iIjoiOiAiK0guRWoobiksbD1xLmdaKCkrbyttCmlmKCFxLmEpcmV0
-dXJuIGwKcz1xLmd1KCkKcj1QLmhsKHEuYikKcmV0dXJuIGwrcysiOiAiK3J9fQpQLmJKLnByb3RvdHlw
-ZT17CmdaKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3UoKXt2YXIgcyxyPXRoaXMuZSxxPXRoaXMuZgpp
-ZihyPT1udWxsKXM9cSE9bnVsbD8iOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5FaihxKToi
-IgplbHNlIGlmKHE9PW51bGwpcz0iOiBOb3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIrSC5Faihy
-KQplbHNlIGlmKHE+cilzPSI6IE5vdCBpbiBpbmNsdXNpdmUgcmFuZ2UgIitILkVqKHIpKyIuLiIrSC5F
-aihxKQplbHNlIHM9cTxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlk
-IHZhbHVlIGlzICIrSC5FaihyKQpyZXR1cm4gc319ClAuZVkucHJvdG90eXBlPXsKZ1ooKXtyZXR1cm4i
-UmFuZ2VFcnJvciJ9LApndSgpe2lmKEguSVoodGhpcy5iKTwwKXJldHVybiI6IGluZGV4IG11c3Qgbm90
-IGJlIG5lZ2F0aXZlIgp2YXIgcz10aGlzLmYKaWYocz09PTApcmV0dXJuIjogbm8gaW5kaWNlcyBhcmUg
-dmFsaWQiCnJldHVybiI6IGluZGV4IHNob3VsZCBiZSBsZXNzIHRoYW4gIitzfSwKZ0EoYSl7cmV0dXJu
-IHRoaXMuZn19ClAubXAucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyLHEscCxvLG4sbSxsLGs9dGhpcyxq
-PXt9LGk9bmV3IFAuTSgiIikKai5hPSIiCnM9ay5jCmZvcihyPXMubGVuZ3RoLHE9MCxwPSIiLG89IiI7
-cTxyOysrcSxvPSIsICIpe249c1txXQppLmE9cCtvCnA9aS5hKz1QLmhsKG4pCmouYT0iLCAifWsuZC5L
-KDAsbmV3IFAuV0YoaixpKSkKbT1QLmhsKGsuYSkKbD1pLncoMCkKcj0iTm9TdWNoTWV0aG9kRXJyb3I6
-IG1ldGhvZCBub3QgZm91bmQ6ICciK2suYi5hKyInXG5SZWNlaXZlcjogIittKyJcbkFyZ3VtZW50czog
-WyIrbCsiXSIKcmV0dXJuIHJ9fQpQLnViLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIlVuc3VwcG9ydGVk
-IG9wZXJhdGlvbjogIit0aGlzLmF9fQpQLmRzLnByb3RvdHlwZT17CncoYSl7dmFyIHM9IlVuaW1wbGVt
-ZW50ZWRFcnJvcjogIit0aGlzLmEKcmV0dXJuIHN9fQpQLmxqLnByb3RvdHlwZT17CncoYSl7cmV0dXJu
-IkJhZCBzdGF0ZTogIit0aGlzLmF9fQpQLlVWLnByb3RvdHlwZT17CncoYSl7dmFyIHM9dGhpcy5hCmlm
-KHM9PW51bGwpcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIgpy
-ZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogIitQLmhsKHMpKyIu
-In19ClAuazUucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LApnSUkoKXtyZXR1
-cm4gbnVsbH0sCiRpWFM6MX0KUC5LWS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJTdGFjayBPdmVyZmxv
-dyJ9LApnSUkoKXtyZXR1cm4gbnVsbH0sCiRpWFM6MX0KUC5wLnByb3RvdHlwZT17CncoYSl7dmFyIHM9
-IlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlICciK3RoaXMuYSsiJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0
-aW9uIgpyZXR1cm4gc319ClAuQ0QucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iRXhjZXB0aW9uOiAiK3Ro
-aXMuYX0sCiRpUno6MX0KUC5hRS5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHIscSxwLG8sbixtLGwsayxq
-LGksaCxnPXRoaXMuYSxmPSIiIT09Zz8iRm9ybWF0RXhjZXB0aW9uOiAiK2c6IkZvcm1hdEV4Y2VwdGlv
-biIsZT10aGlzLmMsZD10aGlzLmIKaWYodHlwZW9mIGQ9PSJzdHJpbmciKXtpZihlIT1udWxsKXM9ZTww
-fHxlPmQubGVuZ3RoCmVsc2Ugcz0hMQppZihzKWU9bnVsbAppZihlPT1udWxsKXtpZihkLmxlbmd0aD43
-OClkPUMueEIuTmooZCwwLDc1KSsiLi4uIgpyZXR1cm4gZisiXG4iK2R9Zm9yKHI9MSxxPTAscD0hMSxv
-PTA7bzxlOysrbyl7bj1DLnhCLlcoZCxvKQppZihuPT09MTApe2lmKHEhPT1vfHwhcCkrK3IKcT1vKzEK
-cD0hMX1lbHNlIGlmKG49PT0xMyl7KytyCnE9bysxCnA9ITB9fWY9cj4xP2YrKCIgKGF0IGxpbmUgIity
-KyIsIGNoYXJhY3RlciAiKyhlLXErMSkrIilcbiIpOmYrKCIgKGF0IGNoYXJhY3RlciAiKyhlKzEpKyIp
-XG4iKQptPWQubGVuZ3RoCmZvcihvPWU7bzxtOysrbyl7bj1DLnhCLk8oZCxvKQppZihuPT09MTB8fG49
-PT0xMyl7bT1vCmJyZWFrfX1pZihtLXE+NzgpaWYoZS1xPDc1KXtsPXErNzUKaz1xCmo9IiIKaT0iLi4u
-In1lbHNle2lmKG0tZTw3NSl7az1tLTc1Cmw9bQppPSIifWVsc2V7az1lLTM2Cmw9ZSszNgppPSIuLi4i
-fWo9Ii4uLiJ9ZWxzZXtsPW0Kaz1xCmo9IiIKaT0iIn1oPUMueEIuTmooZCxrLGwpCnJldHVybiBmK2or
-aCtpKyJcbiIrQy54Qi5UKCIgIixlLWsrai5sZW5ndGgpKyJeXG4ifWVsc2UgcmV0dXJuIGUhPW51bGw/
-ZisoIiAoYXQgb2Zmc2V0ICIrSC5FaihlKSsiKSIpOmZ9LAokaVJ6OjF9ClAuY1gucHJvdG90eXBlPXsK
-ZHIoYSxiKXtyZXR1cm4gSC5HSih0aGlzLEguTGgodGhpcykuQygiY1guRSIpLGIpfSwKRTIoYSxiLGMp
-e3ZhciBzPUguTGgodGhpcykKcmV0dXJuIEguSzEodGhpcyxzLktxKGMpLkMoIjEoY1guRSkiKS5hKGIp
-LHMuQygiY1guRSIpLGMpfSwKZXYoYSxiKXt2YXIgcz1ILkxoKHRoaXMpCnJldHVybiBuZXcgSC5VNSh0
-aGlzLHMuQygiYTIoY1guRSkiKS5hKGIpLHMuQygiVTU8Y1guRT4iKSl9LAp0dChhLGIpe3JldHVybiBQ
-LlkxKHRoaXMsYixILkxoKHRoaXMpLkMoImNYLkUiKSl9LApicihhKXtyZXR1cm4gdGhpcy50dChhLCEw
-KX0sCmdBKGEpe3ZhciBzLHI9dGhpcy5nbSh0aGlzKQpmb3Iocz0wO3IuRigpOykrK3MKcmV0dXJuIHN9
-LApnbDAoYSl7cmV0dXJuIXRoaXMuZ20odGhpcykuRigpfSwKZ29yKGEpe3JldHVybiF0aGlzLmdsMCh0
-aGlzKX0sCmVSKGEsYil7cmV0dXJuIEguYksodGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmdy
-OChhKXt2YXIgcyxyPXRoaXMuZ20odGhpcykKaWYoIXIuRigpKXRocm93IEguYihILldwKCkpCnM9ci5n
-bCgpCmlmKHIuRigpKXRocm93IEguYihILkFtKCkpCnJldHVybiBzfSwKRShhLGIpe3ZhciBzLHIscQpQ
-LmsxKGIsImluZGV4IikKZm9yKHM9dGhpcy5nbSh0aGlzKSxyPTA7cy5GKCk7KXtxPXMuZ2woKQppZihi
-PT09cilyZXR1cm4gcTsrK3J9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIsbnVsbCxyKSl9LAp3
-KGEpe3JldHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnByb3RvdHlwZT17fQpQLk4zLnByb3Rv
-dHlwZT17CncoYSl7cmV0dXJuIk1hcEVudHJ5KCIrSC5Faih0aGlzLmEpKyI6ICIrSC5Faih0aGlzLmIp
-KyIpIn19ClAuYzgucHJvdG90eXBlPXsKZ2lPKGEpe3JldHVybiBQLk1oLnByb3RvdHlwZS5naU8uY2Fs
-bCh0aGlzLHRoaXMpfSwKdyhhKXtyZXR1cm4ibnVsbCJ9fQpQLk1oLnByb3RvdHlwZT17JGlNaDoxLApE
-TihhLGIpe3JldHVybiB0aGlzPT09Yn0sCmdpTyhhKXtyZXR1cm4gSC5lUSh0aGlzKX0sCncoYSl7cmV0
-dXJuIkluc3RhbmNlIG9mICciK0gubGgodGhpcykrIicifSwKZTcoYSxiKXt0Lm8uYShiKQp0aHJvdyBI
-LmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0cmluZygpe3JldHVybiB0
-aGlzLncodGhpcyl9fQpQLlpkLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIiJ9LAokaUd6OjF9ClAuTS5w
-cm90b3R5cGU9ewpnQShhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCncoYSl7dmFyIHM9dGhpcy5hCnJl
-dHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfSwKJGlCTDoxfQpQLm4xLnByb3RvdHlwZT17CiQyKGEs
-Yil7dmFyIHMscixxLHAKdC5FLmEoYSkKSC5uKGIpCnM9Qy54Qi5PWShiLCI9IikKaWYocz09PS0xKXtp
-ZihiIT09IiIpYS5ZNSgwLFAua3UoYiwwLGIubGVuZ3RoLHRoaXMuYSwhMCksIiIpfWVsc2UgaWYocyE9
-PTApe3I9Qy54Qi5OaihiLDAscykKcT1DLnhCLnluKGIscysxKQpwPXRoaXMuYQphLlk1KDAsUC5rdShy
-LDAsci5sZW5ndGgscCwhMCksUC5rdShxLDAscS5sZW5ndGgscCwhMCkpfXJldHVybiBhfSwKJFM6MjZ9
-ClAuY1MucHJvdG90eXBlPXsKJDIoYSxiKXt0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBJUHY0IGFkZHJl
-c3MsICIrYSx0aGlzLmEsYikpfSwKJFM6MjR9ClAuVkMucHJvdG90eXBlPXsKJDIoYSxiKXt0aHJvdyBI
-LmIoUC5ycigiSWxsZWdhbCBJUHY2IGFkZHJlc3MsICIrYSx0aGlzLmEsYikpfSwKJDEoYSl7cmV0dXJu
-IHRoaXMuJDIoYSxudWxsKX0sCiRTOjE5fQpQLkpULnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMKaWYo
-Yi1hPjQpdGhpcy5hLiQyKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1heGltdW0gb2Yg
-NCBoZXggZGlnaXRzIixhKQpzPVAuUUEoQy54Qi5Oaih0aGlzLmIsYSxiKSwxNikKaWYoczwwfHxzPjY1
-NTM1KXRoaXMuYS4kMigiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZG
-RmAiLGEpCnJldHVybiBzfSwKJFM6MjB9ClAuRG4ucHJvdG90eXBlPXsKZ25EKCl7dmFyIHMscixxLHA9
-dGhpcyxvPXAueAppZihvPT1udWxsKXtvPXAuYQpzPW8ubGVuZ3RoIT09MD8iIitvKyI6IjoiIgpyPXAu
-YwpxPXI9PW51bGwKaWYoIXF8fG89PT0iZmlsZSIpe289cysiLy8iCnM9cC5iCmlmKHMubGVuZ3RoIT09
-MClvPW8rcysiQCIKaWYoIXEpbys9cgpzPXAuZAppZihzIT1udWxsKW89bysiOiIrSC5FaihzKX1lbHNl
-IG89cwpvKz1wLmUKcz1wLmYKaWYocyE9bnVsbClvPW8rIj8iK3MKcz1wLnIKaWYocyE9bnVsbClvPW8r
-IiMiK3MKbz1vLmNoYXJDb2RlQXQoMCk9PTA/bzpvCmlmKHAueD09bnVsbClwLng9bwplbHNlIG89SC52
-KEguaigiX3RleHQiKSl9cmV0dXJuIG99LApnRmooKXt2YXIgcyxyPXRoaXMscT1yLnkKaWYocT09bnVs
-bCl7cz1yLmUKaWYocy5sZW5ndGghPT0wJiZDLnhCLlcocywwKT09PTQ3KXM9Qy54Qi55bihzLDEpCnE9
-cy5sZW5ndGg9PT0wP0MueEQ6UC5BRihuZXcgSC5sSihILlFJKHMuc3BsaXQoIi8iKSx0LnMpLHQuZE8u
-YShQLlBIKCkpLHQuZG8pLHQuTikKaWYoci55PT1udWxsKXIuc0twKHEpCmVsc2UgcT1ILnYoSC5qKCJw
-YXRoU2VnbWVudHMiKSl9cmV0dXJuIHF9LApnaU8oYSl7dmFyIHM9dGhpcyxyPXMuegppZihyPT1udWxs
-KXtyPUMueEIuZ2lPKHMuZ25EKCkpCmlmKHMuej09bnVsbClzLno9cgplbHNlIHI9SC52KEguaigiaGFz
-aENvZGUiKSl9cmV0dXJuIHJ9LApnaFkoKXt2YXIgcz10aGlzLHI9cy5RCmlmKHI9PW51bGwpe3I9cy5m
-CnI9bmV3IFAuR2ooUC5XWChyPT1udWxsPyIiOnIpLHQuZHcpCmlmKHMuUT09bnVsbClzLnNOTShyKQpl
-bHNlIHI9SC52KEguaigicXVlcnlQYXJhbWV0ZXJzIikpfXJldHVybiByfSwKZ2t1KCl7cmV0dXJuIHRo
-aXMuYn0sCmdKZihhKXt2YXIgcz10aGlzLmMKaWYocz09bnVsbClyZXR1cm4iIgppZihDLnhCLm4ocywi
-WyIpKXJldHVybiBDLnhCLk5qKHMsMSxzLmxlbmd0aC0xKQpyZXR1cm4gc30sCmd0cChhKXt2YXIgcz10
-aGlzLmQKcmV0dXJuIHM9PW51bGw/UC53Syh0aGlzLmEpOnN9LApndFAoKXt2YXIgcz10aGlzLmYKcmV0
-dXJuIHM9PW51bGw/IiI6c30sCmdLYSgpe3ZhciBzPXRoaXMucgpyZXR1cm4gcz09bnVsbD8iIjpzfSwK
-aEIoYSl7dmFyIHM9dGhpcy5hCmlmKGEubGVuZ3RoIT09cy5sZW5ndGgpcmV0dXJuITEKcmV0dXJuIFAu
-TlIoYSxzKX0sCm5tKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxrLGo9dGhpcwp0LmM5LmEoYikKcz1q
-LmEKcj1zPT09ImZpbGUiCnE9ai5iCnA9ai5kCm89ai5jCmlmKCEobyE9bnVsbCkpbz1xLmxlbmd0aCE9
-PTB8fHAhPW51bGx8fHI/IiI6bnVsbApuPWouZQppZighciltPW8hPW51bGwmJm4ubGVuZ3RoIT09MApl
-bHNlIG09ITAKaWYobSYmIUMueEIubihuLCIvIikpbj0iLyIrbgpsPW4Kaz1QLmxlKG51bGwsMCwwLGIp
-CnJldHVybiBuZXcgUC5EbihzLHEsbyxwLGwsayxqLnIpfSwKSmgoYSxiKXt2YXIgcyxyLHEscCxvLG4K
-Zm9yKHM9MCxyPTA7Qy54Qi5RaShiLCIuLi8iLHIpOyl7cis9MzsrK3N9cT1DLnhCLmNuKGEsIi8iKQp3
-aGlsZSghMCl7aWYoIShxPjAmJnM+MCkpYnJlYWsKcD1DLnhCLlBrKGEsIi8iLHEtMSkKaWYocDwwKWJy
-ZWFrCm89cS1wCm49byE9PTIKaWYoIW58fG89PT0zKWlmKEMueEIuTyhhLHArMSk9PT00NiluPSFufHxD
-LnhCLk8oYSxwKzIpPT09NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQppZihuKWJyZWFrOy0tcwpxPXB9cmV0
-dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxDLnhCLnluKGIsci0zKnMpKX0sClpJKGEpe3JldHVybiB0aGlz
-Lm1TKFAuaEsoYSkpfSwKbVMoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGosaT10aGlzLGg9bnVsbApp
-ZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5nRmkoKQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdK
-ZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aH1lbHNle3A9aApxPXAKcj0iIn1vPVAueGUoYS5nSWkoYSkp
-Cm49YS5nUUQoKT9hLmd0UCgpOmh9ZWxzZXtzPWkuYQppZihhLmdjaigpKXtyPWEuZ2t1KCkKcT1hLmdK
-ZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChhKTpoLHMpCm89UC54ZShhLmdJaShhKSkKbj1hLmdRRCgp
-P2EuZ3RQKCk6aH1lbHNle3I9aS5iCnE9aS5jCnA9aS5kCm89aS5lCmlmKGEuZ0lpKGEpPT09IiIpbj1h
-LmdRRCgpP2EuZ3RQKCk6aS5mCmVsc2V7bT1QLnVqKGksbykKaWYobT4wKXtsPUMueEIuTmoobywwLG0p
-Cm89YS5ndFQoKT9sK1AueGUoYS5nSWkoYSkpOmwrUC54ZShpLkpoKEMueEIueW4obyxsLmxlbmd0aCks
-YS5nSWkoYSkpKX1lbHNlIGlmKGEuZ3RUKCkpbz1QLnhlKGEuZ0lpKGEpKQplbHNlIGlmKG8ubGVuZ3Ro
-PT09MClpZihxPT1udWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2Ug
-bz1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtrPWkuSmgobyxhLmdJaShhKSkKaj1zLmxlbmd0aD09PTAK
-aWYoIWp8fHEhPW51bGx8fEMueEIubihvLCIvIikpbz1QLnhlKGspCmVsc2Ugbz1QLndGKGssIWp8fHEh
-PW51bGwpfW49YS5nUUQoKT9hLmd0UCgpOmh9fX1yZXR1cm4gbmV3IFAuRG4ocyxyLHEscCxvLG4sYS5n
-WjgoKT9hLmdLYSgpOmgpfSwKZ2NqKCl7cmV0dXJuIHRoaXMuYyE9bnVsbH0sCmd4QSgpe3JldHVybiB0
-aGlzLmQhPW51bGx9LApnUUQoKXtyZXR1cm4gdGhpcy5mIT1udWxsfSwKZ1o4KCl7cmV0dXJuIHRoaXMu
-ciE9bnVsbH0sCmd0VCgpe3JldHVybiBDLnhCLm4odGhpcy5lLCIvIil9LAp0NCgpe3ZhciBzLHI9dGhp
-cyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0
-IGEgZmlsZSBwYXRoIGZyb20gYSAiK3ErIiBVUkkiKSkKcT1yLmYKaWYoKHE9PW51bGw/IiI6cSkhPT0i
-Iil0aHJvdyBILmIoUC5MNCh1LmkpKQpxPXIucgppZigocT09bnVsbD8iIjpxKSE9PSIiKXRocm93IEgu
-YihQLkw0KHUubCkpCnE9JC53USgpCmlmKHEpcT1QLm1uKHIpCmVsc2V7aWYoci5jIT1udWxsJiZyLmdK
-ZihyKSE9PSIiKUgudihQLkw0KHUuaikpCnM9ci5nRmooKQpQLmtFKHMsITEpCnE9UC5sKEMueEIubihy
-LmUsIi8iKT8iIisiLyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0KDApPT0wP3E6cX1yZXR1cm4gcX0s
-CncoYSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETihhLGIpe3ZhciBzLHIscT10aGlzCmlmKGI9PW51bGwp
-cmV0dXJuITEKaWYocT09PWIpcmV0dXJuITAKaWYodC5kRC5iKGIpKWlmKHEuYT09PWIuZ0ZpKCkpaWYo
-cS5jIT1udWxsPT09Yi5nY2ooKSlpZihxLmI9PT1iLmdrdSgpKWlmKHEuZ0pmKHEpPT09Yi5nSmYoYikp
-aWYocS5ndHAocSk9PT1iLmd0cChiKSlpZihxLmU9PT1iLmdJaShiKSl7cz1xLmYKcj1zPT1udWxsCmlm
-KCFyPT09Yi5nUUQoKSl7aWYocilzPSIiCmlmKHM9PT1iLmd0UCgpKXtzPXEucgpyPXM9PW51bGwKaWYo
-IXI9PT1iLmdaOCgpKXtpZihyKXM9IiIKcz1zPT09Yi5nS2EoKX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVs
-c2Ugcz0hMX1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9ITEKZWxzZSBzPSExCmVs
-c2Ugcz0hMQplbHNlIHM9ITEKcmV0dXJuIHN9LApzS3AoYSl7dGhpcy55PXQuYmsuYShhKX0sCnNOTShh
-KXt0aGlzLlE9dC5jWi5hKGEpfSwKJGlpRDoxLApnRmkoKXtyZXR1cm4gdGhpcy5hfSwKZ0lpKGEpe3Jl
-dHVybiB0aGlzLmV9fQpQLlJaLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBQLmVQKEMuWkosSC5uKGEp
-LEMueE0sITEpfSwKJFM6Mn0KUC5NRS5wcm90b3R5cGU9ewokMihhLGIpe3ZhciBzPXRoaXMuYixyPXRo
-aXMuYQpzLmErPXIuYQpyLmE9IiYiCnI9cy5hKz1QLmVQKEMuRjMsYSxDLnhNLCEwKQppZihiIT1udWxs
-JiZiLmxlbmd0aCE9PTApe3MuYT1yKyI9IgpzLmErPVAuZVAoQy5GMyxiLEMueE0sITApfX0sCiRTOjIy
-fQpQLnk1LnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMscgpILm4oYSkKaWYoYj09bnVsbHx8dHlwZW9m
-IGI9PSJzdHJpbmciKXRoaXMuYS4kMihhLEguayhiKSkKZWxzZSBmb3Iocz1KLklUKHQuUi5hKGIpKSxy
-PXRoaXMuYTtzLkYoKTspci4kMihhLEgubihzLmdsKCkpKX0sCiRTOjExfQpQLlBFLnByb3RvdHlwZT17
-CmdsUigpe3ZhciBzLHIscSxwLG89dGhpcyxuPW51bGwsbT1vLmMKaWYobT09bnVsbCl7bT1vLmIKaWYo
-MD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSwwKQpzPW8uYQptPW1bMF0rMQpyPUMueEIuWFUocywiPyIs
-bSkKcT1zLmxlbmd0aAppZihyPj0wKXtwPVAuUEkocyxyKzEscSxDLlZDLCExKQpxPXJ9ZWxzZSBwPW4K
-bT1vLmM9bmV3IFAucWUoImRhdGEiLCIiLG4sbixQLlBJKHMsbSxxLEMuV2QsITEpLHAsbil9cmV0dXJu
-IG19LAp3KGEpe3ZhciBzLHI9dGhpcy5iCmlmKDA+PXIubGVuZ3RoKXJldHVybiBILk9IKHIsMCkKcz10
-aGlzLmEKcmV0dXJuIHJbMF09PT0tMT8iZGF0YToiK3M6c319ClAueUkucHJvdG90eXBlPXsKJDIoYSxi
-KXt2YXIgcz10aGlzLmEKaWYoYT49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxhKQpzPXNbYV0KQy5OQS5k
-dShzLDAsOTYsYikKcmV0dXJuIHN9LAokUzoyM30KUC5jNi5wcm90b3R5cGU9ewokMyhhLGIsYyl7dmFy
-IHMscixxCmZvcihzPWIubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PTk2
-KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLnFkLnByb3RvdHlwZT17CiQzKGEsYixj
-KXt2YXIgcyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlcoYiwxKTtzPD1yOysrcyl7cT0oc145
-Nik+Pj4wCmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLlVmLnByb3Rv
-dHlwZT17Cmdjaigpe3JldHVybiB0aGlzLmM+MH0sCmd4QSgpe3JldHVybiB0aGlzLmM+MCYmdGhpcy5k
-KzE8dGhpcy5lfSwKZ1FEKCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9LApnWjgoKXtyZXR1cm4gdGhpcy5y
-PHRoaXMuYS5sZW5ndGh9LApndFQoKXtyZXR1cm4gQy54Qi5RaSh0aGlzLmEsIi8iLHRoaXMuZSl9LApn
-RmkoKXt2YXIgcz10aGlzLngKcmV0dXJuIHM9PW51bGw/dGhpcy54PXRoaXMuVTIoKTpzfSwKVTIoKXt2
-YXIgcyxyPXRoaXMscT1yLmIKaWYocTw9MClyZXR1cm4iIgpzPXE9PT00CmlmKHMmJkMueEIubihyLmEs
-Imh0dHAiKSlyZXR1cm4iaHR0cCIKaWYocT09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJuImh0
-dHBzIgppZihzJiZDLnhCLm4oci5hLCJmaWxlIikpcmV0dXJuImZpbGUiCmlmKHE9PT03JiZDLnhCLm4o
-ci5hLCJwYWNrYWdlIikpcmV0dXJuInBhY2thZ2UiCnJldHVybiBDLnhCLk5qKHIuYSwwLHEpfSwKZ2t1
-KCl7dmFyIHM9dGhpcy5jLHI9dGhpcy5iKzMKcmV0dXJuIHM+cj9DLnhCLk5qKHRoaXMuYSxyLHMtMSk6
-IiJ9LApnSmYoYSl7dmFyIHM9dGhpcy5jCnJldHVybiBzPjA/Qy54Qi5Oaih0aGlzLmEscyx0aGlzLmQp
-OiIifSwKZ3RwKGEpe3ZhciBzLHI9dGhpcwppZihyLmd4QSgpKXJldHVybiBQLlFBKEMueEIuTmooci5h
-LHIuZCsxLHIuZSksbnVsbCkKcz1yLmIKaWYocz09PTQmJkMueEIubihyLmEsImh0dHAiKSlyZXR1cm4g
-ODAKaWYocz09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJuIDQ0MwpyZXR1cm4gMH0sCmdJaShh
-KXtyZXR1cm4gQy54Qi5Oaih0aGlzLmEsdGhpcy5lLHRoaXMuZil9LApndFAoKXt2YXIgcz10aGlzLmYs
-cj10aGlzLnIKcmV0dXJuIHM8cj9DLnhCLk5qKHRoaXMuYSxzKzEscik6IiJ9LApnS2EoKXt2YXIgcz10
-aGlzLnIscj10aGlzLmEKcmV0dXJuIHM8ci5sZW5ndGg/Qy54Qi55bihyLHMrMSk6IiJ9LApnRmooKXt2
-YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5mLG89dGhpcy5hCmlmKEMueEIuUWkobywiLyIscSkpKytxCmlm
-KHE9PT1wKXJldHVybiBDLnhECnM9SC5RSShbXSx0LnMpCmZvcihyPXE7cjxwOysrcilpZihDLnhCLk8o
-byxyKT09PTQ3KXtDLk5tLmkocyxDLnhCLk5qKG8scSxyKSkKcT1yKzF9Qy5ObS5pKHMsQy54Qi5Oaihv
-LHEscCkpCnJldHVybiBQLkFGKHMsdC5OKX0sCmdoWSgpe2lmKHRoaXMuZj49dGhpcy5yKXJldHVybiBD
-LkNNCnJldHVybiBuZXcgUC5HaihQLldYKHRoaXMuZ3RQKCkpLHQuZHcpfSwKa1goYSl7dmFyIHM9dGhp
-cy5kKzEKcmV0dXJuIHMrYS5sZW5ndGg9PT10aGlzLmUmJkMueEIuUWkodGhpcy5hLGEscyl9LApOOSgp
-e3ZhciBzPXRoaXMscj1zLnIscT1zLmEKaWYocj49cS5sZW5ndGgpcmV0dXJuIHMKcmV0dXJuIG5ldyBQ
-LlVmKEMueEIuTmoocSwwLHIpLHMuYixzLmMscy5kLHMuZSxzLmYscixzLngpfSwKbm0oYSxiKXt2YXIg
-cyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnQuYzkuYShiKQpzPWkuZ0ZpKCkKcj1zPT09
-ImZpbGUiCnE9aS5jCnA9cT4wP0MueEIuTmooaS5hLGkuYiszLHEpOiIiCm89aS5neEEoKT9pLmd0cChp
-KTpoCnE9aS5jCmlmKHE+MCluPUMueEIuTmooaS5hLHEsaS5kKQplbHNlIG49cC5sZW5ndGghPT0wfHxv
-IT1udWxsfHxyPyIiOmgKcT1pLmEKbT1DLnhCLk5qKHEsaS5lLGkuZikKaWYoIXIpbD1uIT1udWxsJiZt
-Lmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhCLm4obSwiLyIpKW09Ii8iK20Kaz1QLmxlKGgs
-MCwwLGIpCmw9aS5yCmo9bDxxLmxlbmd0aD9DLnhCLnluKHEsbCsxKTpoCnJldHVybiBuZXcgUC5Ebihz
-LHAsbixvLG0sayxqKX0sClpJKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVMoYSl7aWYoYSBp
-bnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpyZXR1cm4gdGhpcy5SZSgpLm1TKGEp
-fSwKdTEoYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjPWIuYgppZihjPjAp
-cmV0dXJuIGIKcz1iLmMKaWYocz4wKXtyPWEuYgppZihyPD0wKXJldHVybiBiCnE9cj09PTQKaWYocSYm
-Qy54Qi5uKGEuYSwiZmlsZSIpKXA9Yi5lIT09Yi5mCmVsc2UgaWYocSYmQy54Qi5uKGEuYSwiaHR0cCIp
-KXA9IWIua1goIjgwIikKZWxzZSBwPSEocj09PTUmJkMueEIubihhLmEsImh0dHBzIikpfHwhYi5rWCgi
-NDQzIikKaWYocCl7bz1yKzEKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsbykrQy54Qi55bihi
-LmEsYysxKSxyLHMrbyxiLmQrbyxiLmUrbyxiLmYrbyxiLnIrbyxhLngpfWVsc2UgcmV0dXJuIHRoaXMu
-UmUoKS5tUyhiKX1uPWIuZQpjPWIuZgppZihuPT09Yyl7cz1iLnIKaWYoYzxzKXtyPWEuZgpvPXItYwpy
-ZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLnluKGIuYSxjKSxhLmIsYS5jLGEuZCxh
-LmUsYytvLHMrbyxhLngpfWM9Yi5hCmlmKHM8Yy5sZW5ndGgpe3I9YS5yCnJldHVybiBuZXcgUC5VZihD
-LnhCLk5qKGEuYSwwLHIpK0MueEIueW4oYyxzKSxhLmIsYS5jLGEuZCxhLmUsYS5mLHMrKHItcyksYS54
-KX1yZXR1cm4gYS5OOSgpfXM9Yi5hCmlmKEMueEIuUWkocywiLyIsbikpe209YS5lCmw9UC5SeCh0aGlz
-KQprPWw+MD9sOm0Kbz1rLW4KcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAsaykrQy54Qi55bihz
-LG4pLGEuYixhLmMsYS5kLG0sYytvLGIucitvLGEueCl9aj1hLmUKaT1hLmYKaWYoaj09PWkmJmEuYz4w
-KXtmb3IoO0MueEIuUWkocywiLi4vIixuKTspbis9MwpvPWotbisxCnJldHVybiBuZXcgUC5VZihDLnhC
-Lk5qKGEuYSwwLGopKyIvIitDLnhCLnluKHMsbiksYS5iLGEuYyxhLmQsaixjK28sYi5yK28sYS54KX1o
-PWEuYQpsPVAuUngodGhpcykKaWYobD49MClnPWwKZWxzZSBmb3IoZz1qO0MueEIuUWkoaCwiLi4vIixn
-KTspZys9MwpmPTAKd2hpbGUoITApe2U9biszCmlmKCEoZTw9YyYmQy54Qi5RaShzLCIuLi8iLG4pKSli
-cmVhazsrK2YKbj1lfWZvcihkPSIiO2k+Zzspey0taQppZihDLnhCLk8oaCxpKT09PTQ3KXtpZihmPT09
-MCl7ZD0iLyIKYnJlYWt9LS1mCmQ9Ii8ifX1pZihpPT09ZyYmYS5iPD0wJiYhQy54Qi5RaShoLCIvIixq
-KSl7bi09ZiozCmQ9IiJ9bz1pLW4rZC5sZW5ndGgKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooaCwwLGkp
-K2QrQy54Qi55bihzLG4pLGEuYixhLmMsYS5kLGosYytvLGIucitvLGEueCl9LAp0NCgpe3ZhciBzLHIs
-cT10aGlzLHA9cS5iCmlmKHA+PTApe3M9IShwPT09NCYmQy54Qi5uKHEuYSwiZmlsZSIpKQpwPXN9ZWxz
-ZSBwPSExCmlmKHApdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20g
-YSAiK3EuZ0ZpKCkrIiBVUkkiKSkKcD1xLmYKcz1xLmEKaWYocDxzLmxlbmd0aCl7aWYocDxxLnIpdGhy
-b3cgSC5iKFAuTDQodS5pKSkKdGhyb3cgSC5iKFAuTDQodS5sKSl9cj0kLndRKCkKaWYocilwPVAubW4o
-cSkKZWxzZXtpZihxLmM8cS5kKUgudihQLkw0KHUuaikpCnA9Qy54Qi5OaihzLHEuZSxwKX1yZXR1cm4g
-cH0sCmdpTyhhKXt2YXIgcz10aGlzLnkKcmV0dXJuIHM9PW51bGw/dGhpcy55PUMueEIuZ2lPKHRoaXMu
-YSk6c30sCkROKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQppZih0aGlzPT09YilyZXR1cm4hMApyZXR1
-cm4gdC5kRC5iKGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZSgpe3ZhciBzPXRoaXMscj1udWxsLHE9cy5n
-RmkoKSxwPXMuZ2t1KCksbz1zLmM+MD9zLmdKZihzKTpyLG49cy5neEEoKT9zLmd0cChzKTpyLG09cy5h
-LGw9cy5mLGs9Qy54Qi5OaihtLHMuZSxsKSxqPXMucgpsPWw8aj9zLmd0UCgpOnIKcmV0dXJuIG5ldyBQ
-LkRuKHEscCxvLG4sayxsLGo8bS5sZW5ndGg/cy5nS2EoKTpyKX0sCncoYSl7cmV0dXJuIHRoaXMuYX0s
-CiRpaUQ6MX0KUC5xZS5wcm90b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5HaC5wcm90b3R5cGU9
-ewpzTFUoYSxiKXthLmhyZWY9Yn0sCncoYSl7cmV0dXJuIFN0cmluZyhhKX0sCiRpR2g6MX0KVy5mWS5w
-cm90b3R5cGU9ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLnJaLnByb3RvdHlwZT17JGlyWjoxfQpX
-LkF6LnByb3RvdHlwZT17JGlBejoxfQpXLlFQLnByb3RvdHlwZT17JGlRUDoxfQpXLm54LnByb3RvdHlw
-ZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19Clcub0oucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEu
-bGVuZ3RofX0KVy5pZC5wcm90b3R5cGU9e30KVy5RRi5wcm90b3R5cGU9e30KVy5OaC5wcm90b3R5cGU9
-ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLmFlLnByb3RvdHlwZT17CkRjKGEsYil7cmV0dXJuIGEu
-Y3JlYXRlSFRNTERvY3VtZW50KGIpfX0KVy5JQi5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHI9YS5sZWZ0
-CnIudG9TdHJpbmcKcj0iUmVjdGFuZ2xlICgiK0guRWoocikrIiwgIgpzPWEudG9wCnMudG9TdHJpbmcK
-cz1yK0guRWoocykrIikgIgpyPWEud2lkdGgKci50b1N0cmluZwpyPXMrSC5FaihyKSsiIHggIgpzPWEu
-aGVpZ2h0CnMudG9TdHJpbmcKcmV0dXJuIHIrSC5FaihzKX0sCkROKGEsYil7dmFyIHMscgppZihiPT1u
-dWxsKXJldHVybiExCmlmKHQucS5iKGIpKXtzPWEubGVmdApzLnRvU3RyaW5nCnI9Yi5sZWZ0CnIudG9T
-dHJpbmcKaWYocz09PXIpe3M9YS50b3AKcy50b1N0cmluZwpyPWIudG9wCnIudG9TdHJpbmcKaWYocz09
-PXIpe3M9YS53aWR0aApzLnRvU3RyaW5nCnI9Yi53aWR0aApyLnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEu
-aGVpZ2h0CnMudG9TdHJpbmcKcj1iLmhlaWdodApyLnRvU3RyaW5nCnI9cz09PXIKcz1yfWVsc2Ugcz0h
-MX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMQpyZXR1cm4gc30sCmdpTyhhKXt2YXIgcyxyLHEs
-cD1hLmxlZnQKcC50b1N0cmluZwpwPUMuQ0QuZ2lPKHApCnM9YS50b3AKcy50b1N0cmluZwpzPUMuQ0Qu
-Z2lPKHMpCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9Qy5DRC5naU8ocikKcT1hLmhlaWdodApxLnRvU3Ry
-aW5nCnJldHVybiBXLnJFKHAscyxyLEMuQ0QuZ2lPKHEpKX0sCiRpdG46MX0KVy5uNy5wcm90b3R5cGU9
-ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLnd6LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlz
-LmEubGVuZ3RofSwKcShhLGIpe3ZhciBzCkguSVooYikKcz10aGlzLmEKaWYoYjwwfHxiPj1zLmxlbmd0
-aClyZXR1cm4gSC5PSChzLGIpCnJldHVybiB0aGlzLiR0aS5jLmEoc1tiXSl9LApZNShhLGIsYyl7dGhp
-cy4kdGkuYy5hKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IGxpc3QiKSl9fQpXLmN2LnBy
-b3RvdHlwZT17CmdRZyhhKXtyZXR1cm4gbmV3IFcuaTcoYSl9LApnUChhKXtyZXR1cm4gbmV3IFcuSTQo
-YSl9LApzUChhLGIpe3ZhciBzCnQuTy5hKGIpCnM9dGhpcy5nUChhKQpzLlYxKDApCnMuRlYoMCxiKX0s
-CncoYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKRkYoYSl7dmFyIHM9ISFhLnNjcm9sbEludG9WaWV3SWZO
-ZWVkZWQKaWYocylhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKQplbHNlIGEuc2Nyb2xsSW50b1ZpZXco
-KX0sCm56KGEsYixjLGQsZSl7dmFyIHMscj10aGlzLnI2KGEsYyxkLGUpCnN3aXRjaChiLnRvTG93ZXJD
-YXNlKCkpe2Nhc2UiYmVmb3JlYmVnaW4iOnM9YS5wYXJlbnROb2RlCnMudG9TdHJpbmcKSi5FaChzLHIs
-YSkKYnJlYWsKY2FzZSJhZnRlcmJlZ2luIjpzPWEuY2hpbGROb2Rlcwp0aGlzLm1LKGEscixzLmxlbmd0
-aD4wP3NbMF06bnVsbCkKYnJlYWsKY2FzZSJiZWZvcmVlbmQiOmEuYXBwZW5kQ2hpbGQocikKYnJlYWsK
-Y2FzZSJhZnRlcmVuZCI6cz1hLnBhcmVudE5vZGUKcy50b1N0cmluZwpKLkVoKHMscixhLm5leHRTaWJs
-aW5nKQpicmVhawpkZWZhdWx0OkgudihQLnhZKCJJbnZhbGlkIHBvc2l0aW9uICIrYixudWxsKSl9fSwK
-cjYoYSxiLGMsZCl7dmFyIHMscixxLHAKaWYoYz09bnVsbCl7aWYoZD09bnVsbCl7cz0kLmx0CmlmKHM9
-PW51bGwpe3M9SC5RSShbXSx0LnIpCnI9bmV3IFcudkQocykKQy5ObS5pKHMsVy5UdyhudWxsKSkKQy5O
-bS5pKHMsVy5CbCgpKQokLmx0PXIKZD1yfWVsc2UgZD1zfXM9JC5FVQppZihzPT1udWxsKXtzPW5ldyBX
-LktvKGQpCiQuRVU9cwpjPXN9ZWxzZXtzLmE9ZApjPXN9fWVsc2UgaWYoZCE9bnVsbCl0aHJvdyBILmIo
-UC54WSgidmFsaWRhdG9yIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiB0cmVlU2FuaXRpemVyIGlzIG51bGwi
-LG51bGwpKQppZigkLnhvPT1udWxsKXtzPWRvY3VtZW50CnI9cy5pbXBsZW1lbnRhdGlvbgpyLnRvU3Ry
-aW5nCnI9Qy5tSC5EYyhyLCIiKQokLnhvPXIKJC5CTz1yLmNyZWF0ZVJhbmdlKCkKcj0kLnhvLmNyZWF0
-ZUVsZW1lbnQoImJhc2UiKQp0LmNSLmEocikKcz1zLmJhc2VVUkkKcy50b1N0cmluZwpyLmhyZWY9cwok
-LnhvLmhlYWQuYXBwZW5kQ2hpbGQocil9cz0kLnhvCmlmKHMuYm9keT09bnVsbCl7cj1zLmNyZWF0ZUVs
-ZW1lbnQoImJvZHkiKQpDLkJaLnNHUyhzLHQuay5hKHIpKX1zPSQueG8KaWYodC5rLmIoYSkpe3M9cy5i
-b2R5CnMudG9TdHJpbmcKcT1zfWVsc2V7cy50b1N0cmluZwpxPXMuY3JlYXRlRWxlbWVudChhLnRhZ05h
-bWUpCiQueG8uYm9keS5hcHBlbmRDaGlsZChxKX1pZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBp
-biB3aW5kb3cuUmFuZ2UucHJvdG90eXBlJiYhQy5ObS50ZyhDLlNxLGEudGFnTmFtZSkpeyQuQk8uc2Vs
-ZWN0Tm9kZUNvbnRlbnRzKHEpCnM9JC5CTwpzLnRvU3RyaW5nCnA9cy5jcmVhdGVDb250ZXh0dWFsRnJh
-Z21lbnQoYj09bnVsbD8ibnVsbCI6Yil9ZWxzZXtKLndmKHEsYikKcD0kLnhvLmNyZWF0ZURvY3VtZW50
-RnJhZ21lbnQoKQpmb3IoO3M9cS5maXJzdENoaWxkLHMhPW51bGw7KXAuYXBwZW5kQ2hpbGQocyl9aWYo
-cSE9PSQueG8uYm9keSlKLkx0KHEpCmMuUG4ocCkKZG9jdW1lbnQuYWRvcHROb2RlKHApCnJldHVybiBw
-fSwKQUgoYSxiLGMpe3JldHVybiB0aGlzLnI2KGEsYixjLG51bGwpfSwKc2hmKGEsYil7dGhpcy5ZQyhh
-LGIpfSwKcGsoYSxiLGMpe3RoaXMuc2E0KGEsbnVsbCkKYS5hcHBlbmRDaGlsZCh0aGlzLnI2KGEsYixu
-dWxsLGMpKX0sCllDKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKc1JOKGEsYil7YS5pbm5l
-ckhUTUw9Yn0sCmducyhhKXtyZXR1cm4gYS50YWdOYW1lfSwKZ1ZsKGEpe3JldHVybiBuZXcgVy5DcShh
-LCJjbGljayIsITEsdC5RKX0sCiRpY3Y6MX0KVy5Ddi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5o
-LmIodC5BLmEoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBl
-PXsKT24oYSxiLGMsZCl7dC5idy5hKGMpCmlmKGMhPW51bGwpdGhpcy52KGEsYixjLGQpfSwKQihhLGIs
-Yyl7cmV0dXJuIHRoaXMuT24oYSxiLGMsbnVsbCl9LAp2KGEsYixjLGQpe3JldHVybiBhLmFkZEV2ZW50
-TGlzdGVuZXIoYixILnRSKHQuYncuYShjKSwxKSxkKX0sCiRpRDA6MX0KVy5oSC5wcm90b3R5cGU9eyRp
-aEg6MX0KVy5oNC5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLmJyLnByb3RvdHlw
-ZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVmIucHJvdG90eXBlPXsKc0dTKGEsYil7YS5ib2R5
-PWJ9fQpXLmZKLnByb3RvdHlwZT17CmVvKGEsYixjLGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRp
-Zko6MX0KVy53YS5wcm90b3R5cGU9e30KVy5TZy5wcm90b3R5cGU9eyRpU2c6MX0KVy51OC5wcm90b3R5
-cGU9ewpnRHIoYSl7aWYoIm9yaWdpbiIgaW4gYSlyZXR1cm4gYS5vcmlnaW4KcmV0dXJuIGEucHJvdG9j
-b2wrIi8vIithLmhvc3R9LAp3KGEpe3JldHVybiBTdHJpbmcoYSl9LAokaXU4OjF9ClcuQWoucHJvdG90
-eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4KGEpe3ZhciBzPXRoaXMuYSxyPXMuY2hpbGRO
-b2Rlcy5sZW5ndGgKaWYocj09PTApdGhyb3cgSC5iKFAuUFYoIk5vIGVsZW1lbnRzIikpCmlmKHI+MSl0
-aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50IikpCnM9cy5maXJzdENoaWxkCnMudG9T
-dHJpbmcKcmV0dXJuIHN9LApGVihhLGIpe3ZhciBzLHIscSxwLG8KdC5laC5hKGIpCmlmKGIgaW5zdGFu
-Y2VvZiBXLmU3KXtzPWIuYQpyPXRoaXMuYQppZihzIT09cilmb3IocT1zLmNoaWxkTm9kZXMubGVuZ3Ro
-LHA9MDtwPHE7KytwKXtvPXMuZmlyc3RDaGlsZApvLnRvU3RyaW5nCnIuYXBwZW5kQ2hpbGQobyl9cmV0
-dXJufWZvcihzPWIuZ20oYikscj10aGlzLmE7cy5GKCk7KXIuYXBwZW5kQ2hpbGQocy5nbCgpKX0sClk1
-KGEsYixjKXt2YXIgcyxyCnQuQS5hKGMpCnM9dGhpcy5hCnI9cy5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49
-ci5sZW5ndGgpcmV0dXJuIEguT0gocixiKQpzLnJlcGxhY2VDaGlsZChjLHJbYl0pfSwKZ20oYSl7dmFy
-IHM9dGhpcy5hLmNoaWxkTm9kZXMKcmV0dXJuIG5ldyBXLlc5KHMscy5sZW5ndGgsSC56SyhzKS5DKCJX
-OTxHbS5FPiIpKX0sCmdBKGEpe3JldHVybiB0aGlzLmEuY2hpbGROb2Rlcy5sZW5ndGh9LApxKGEsYil7
-dmFyIHMKSC5JWihiKQpzPXRoaXMuYS5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49cy5sZW5ndGgpcmV0dXJu
-IEguT0gocyxiKQpyZXR1cm4gc1tiXX19ClcuS1YucHJvdG90eXBlPXsKd2coYSl7dmFyIHM9YS5wYXJl
-bnROb2RlCmlmKHMhPW51bGwpcy5yZW1vdmVDaGlsZChhKX0sCkQ0KGEpe3ZhciBzCmZvcig7cz1hLmZp
-cnN0Q2hpbGQscyE9bnVsbDspYS5yZW1vdmVDaGlsZChzKX0sCncoYSl7dmFyIHM9YS5ub2RlVmFsdWUK
-cmV0dXJuIHM9PW51bGw/dGhpcy5VKGEpOnN9LApzYTQoYSxiKXthLnRleHRDb250ZW50PWJ9LAptSyhh
-LGIsYyl7cmV0dXJuIGEuaW5zZXJ0QmVmb3JlKGIsYyl9LAokaUtWOjF9ClcuQkgucHJvdG90eXBlPXsK
-Z0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKcShhLGIpe0guSVooYikKaWYoYj4+PjAhPT1ifHxiPj1hLmxl
-bmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpyZXR1cm4gYVtiXX0sClk1KGEs
-YixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVtZW50IG9mIGltbXV0
-YWJsZSBMaXN0LiIpKX0sCmd0SChhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBdCnRocm93IEguYihQ
-LlBWKCJObyBlbGVtZW50cyIpKX0sCkUoYSxiKXtpZihiPDB8fGI+PWEubGVuZ3RoKXJldHVybiBILk9I
-KGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGljWDoxLAokaXpNOjF9ClcuU04ucHJv
-dG90eXBlPXt9ClcuZXcucHJvdG90eXBlPXskaWV3OjF9ClcubHAucHJvdG90eXBlPXsKZ0EoYSl7cmV0
-dXJuIGEubGVuZ3RofX0KVy5UYi5wcm90b3R5cGU9ewpyNihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVh
-dGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMu
-RFcoYSxiLGMsZCkKcz1XLlU5KCI8dGFibGU+IitILkVqKGIpKyI8L3RhYmxlPiIsYyxkKQpyPWRvY3Vt
-ZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHMpKQpy
-ZXR1cm4gcn19ClcuSXYucHJvdG90eXBlPXsKcjYoYSxiLGMsZCl7dmFyIHMscgppZigiY3JlYXRlQ29u
-dGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEs
-YixjLGQpCnM9ZG9jdW1lbnQKcj1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpzPW5ldyBXLmU3KEMu
-SWUucjYocy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxkKSkKcz1uZXcgVy5lNyhzLmdyOChzKSkK
-bmV3IFcuZTcocikuRlYoMCxuZXcgVy5lNyhzLmdyOChzKSkpCnJldHVybiByfX0KVy5XUC5wcm90b3R5
-cGU9ewpyNihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdp
-bmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1kb2N1bWVudApyPXMu
-Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9bmV3IFcuZTcoQy5JZS5yNihzLmNyZWF0ZUVsZW1lbnQo
-InRhYmxlIiksYixjLGQpKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBXLmU3KHMuZ3I4KHMpKSkKcmV0dXJu
-IHJ9fQpXLnlZLnByb3RvdHlwZT17CnBrKGEsYixjKXt2YXIgcyxyCnRoaXMuc2E0KGEsbnVsbCkKcz1h
-LmNvbnRlbnQKcy50b1N0cmluZwpKLmJUKHMpCnI9dGhpcy5yNihhLGIsbnVsbCxjKQphLmNvbnRlbnQu
-YXBwZW5kQ2hpbGQocil9LApZQyhhLGIpe3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0sCiRpeVk6MX0K
-Vy53Ni5wcm90b3R5cGU9e30KVy5LNS5wcm90b3R5cGU9ewpQbyhhLGIsYyl7dmFyIHM9Vy5QMShhLm9w
-ZW4oYixjKSkKcmV0dXJuIHN9LApnbVcoYSl7cmV0dXJuIHQuRi5hKGEubG9jYXRpb24pfSwKdXMoYSxi
-KXtyZXR1cm4gYS5jb25maXJtKGIpfSwKJGlLNToxLAokaXY2OjF9ClcuQ20ucHJvdG90eXBlPXskaUNt
-OjF9ClcuQ1EucHJvdG90eXBlPXskaUNROjF9ClcudzQucHJvdG90eXBlPXsKdyhhKXt2YXIgcyxyPWEu
-bGVmdApyLnRvU3RyaW5nCnI9IlJlY3RhbmdsZSAoIitILkVqKHIpKyIsICIKcz1hLnRvcApzLnRvU3Ry
-aW5nCnM9citILkVqKHMpKyIpICIKcj1hLndpZHRoCnIudG9TdHJpbmcKcj1zK0guRWoocikrIiB4ICIK
-cz1hLmhlaWdodApzLnRvU3RyaW5nCnJldHVybiByK0guRWoocyl9LApETihhLGIpe3ZhciBzLHIKaWYo
-Yj09bnVsbClyZXR1cm4hMQppZih0LnEuYihiKSl7cz1hLmxlZnQKcy50b1N0cmluZwpyPWIubGVmdApy
-LnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEudG9wCnMudG9TdHJpbmcKcj1iLnRvcApyLnRvU3RyaW5nCmlm
-KHM9PT1yKXtzPWEud2lkdGgKcy50b1N0cmluZwpyPWIud2lkdGgKci50b1N0cmluZwppZihzPT09cil7
-cz1hLmhlaWdodApzLnRvU3RyaW5nCnI9Yi5oZWlnaHQKci50b1N0cmluZwpyPXM9PT1yCnM9cn1lbHNl
-IHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKcmV0dXJuIHN9LApnaU8oYSl7dmFyIHMs
-cixxLHA9YS5sZWZ0CnAudG9TdHJpbmcKcD1DLkNELmdpTyhwKQpzPWEudG9wCnMudG9TdHJpbmcKcz1D
-LkNELmdpTyhzKQpyPWEud2lkdGgKci50b1N0cmluZwpyPUMuQ0QuZ2lPKHIpCnE9YS5oZWlnaHQKcS50
-b1N0cmluZwpyZXR1cm4gVy5yRShwLHMscixDLkNELmdpTyhxKSl9fQpXLnJoLnByb3RvdHlwZT17CmdB
-KGEpe3JldHVybiBhLmxlbmd0aH0sCnEoYSxiKXtILklaKGIpCmlmKGI+Pj4wIT09Ynx8Yj49YS5sZW5n
-dGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZNShhLGIs
-Yyl7dC5BLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFi
-bGUgTGlzdC4iKSl9LApFKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJl
-dHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpXLmNmLnByb3RvdHlwZT17
-CksoYSxiKXt2YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10aGlzLmd2YygpLHI9cy5sZW5ndGgs
-cT10aGlzLmEscD0wO3A8cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwoMCxILmxrKShzKSwrK3Ape289c1tw
-XQpiLiQyKG8sSC5uKHEuZ2V0QXR0cmlidXRlKG8pKSl9fSwKZ3ZjKCl7dmFyIHMscixxLHAsbyxuLG09
-dGhpcy5hLmF0dHJpYnV0ZXMKbS50b1N0cmluZwpzPUguUUkoW10sdC5zKQpmb3Iocj1tLmxlbmd0aCxx
-PXQuaDkscD0wO3A8cjsrK3Ape2lmKHA+PW0ubGVuZ3RoKXJldHVybiBILk9IKG0scCkKbz1xLmEobVtw
-XSkKaWYoby5uYW1lc3BhY2VVUkk9PW51bGwpe249by5uYW1lCm4udG9TdHJpbmcKQy5ObS5pKHMsbil9
-fXJldHVybiBzfSwKZ2wwKGEpe3JldHVybiB0aGlzLmd2YygpLmxlbmd0aD09PTB9fQpXLmk3LnByb3Rv
-dHlwZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5oYXNBdHRyaWJ1dGUoYSkKcmV0dXJuIHN9LApxKGEsYil7
-cmV0dXJuIHRoaXMuYS5nZXRBdHRyaWJ1dGUoSC5uKGIpKX0sClk1KGEsYixjKXt0aGlzLmEuc2V0QXR0
-cmlidXRlKGIsYyl9LApnQShhKXtyZXR1cm4gdGhpcy5ndmMoKS5sZW5ndGh9fQpXLlN5LnByb3RvdHlw
-ZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5hLmhhc0F0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuT1UoYSkpCnJl
-dHVybiBzfSwKcShhLGIpe3JldHVybiB0aGlzLmEuYS5nZXRBdHRyaWJ1dGUoImRhdGEtIit0aGlzLk9V
-KEgubihiKSkpfSwKWTUoYSxiLGMpe3RoaXMuYS5hLnNldEF0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuT1Uo
-YiksYyl9LApLKGEsYil7dGhpcy5hLksoMCxuZXcgVy5LUyh0aGlzLHQuZUEuYShiKSkpfSwKZ3ZjKCl7
-dmFyIHM9SC5RSShbXSx0LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTModGhpcyxzKSkKcmV0dXJuIHN9LApn
-QShhKXtyZXR1cm4gdGhpcy5ndmMoKS5sZW5ndGh9LApnbDAoYSl7cmV0dXJuIHRoaXMuZ3ZjKCkubGVu
-Z3RoPT09MH0sCnhxKGEpe3ZhciBzLHIscT1ILlFJKGEuc3BsaXQoIi0iKSx0LnMpCmZvcihzPTE7czxx
-Lmxlbmd0aDsrK3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0uWTUocSxzLHJbMF0udG9VcHBlckNh
-c2UoKStDLnhCLnluKHIsMSkpfXJldHVybiBDLk5tLmsocSwiIil9LApPVShhKXt2YXIgcyxyLHEscCxv
-CmZvcihzPWEubGVuZ3RoLHI9MCxxPSIiO3I8czsrK3Ipe3A9YVtyXQpvPXAudG9Mb3dlckNhc2UoKQpx
-PShwIT09byYmcj4wP3ErIi0iOnEpK299cmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9fQpXLktT
-LnByb3RvdHlwZT17CiQyKGEsYil7aWYoQy54Qi5uKGEsImRhdGEtIikpdGhpcy5iLiQyKHRoaXMuYS54
-cShDLnhCLnluKGEsNSkpLGIpfSwKJFM6OH0KVy5BMy5wcm90b3R5cGU9ewokMihhLGIpe2lmKEMueEIu
-bihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhpcy5hLnhxKEMueEIueW4oYSw1KSkpfSwKJFM6OH0K
-Vy5JNC5wcm90b3R5cGU9ewpEKCl7dmFyIHMscixxLHAsbz1QLkxzKHQuTikKZm9yKHM9dGhpcy5hLmNs
-YXNzTmFtZS5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9Si5UMChzW3FdKQppZihw
-Lmxlbmd0aCE9PTApby5pKDAscCl9cmV0dXJuIG99LApYKGEpe3RoaXMuYS5jbGFzc05hbWU9dC5DLmEo
-YSkuaygwLCIgIil9LApnQShhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGh9LApnbDAoYSl7
-cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3QubGVuZ3RoPT09MH0sCmdvcihhKXtyZXR1cm4gdGhpcy5hLmNs
-YXNzTGlzdC5sZW5ndGghPT0wfSwKVjEoYSl7dGhpcy5hLmNsYXNzTmFtZT0iIn0sCnRnKGEsYil7dmFy
-IHM9dGhpcy5hLmNsYXNzTGlzdC5jb250YWlucyhiKQpyZXR1cm4gc30sCmkoYSxiKXt2YXIgcyxyCkgu
-bihiKQpzPXRoaXMuYS5jbGFzc0xpc3QKcj1zLmNvbnRhaW5zKGIpCnMuYWRkKGIpCnJldHVybiFyfSwK
-UihhLGIpe3ZhciBzLHIscQppZih0eXBlb2YgYj09InN0cmluZyIpe3M9dGhpcy5hLmNsYXNzTGlzdApy
-PXMuY29udGFpbnMoYikKcy5yZW1vdmUoYikKcT1yfWVsc2UgcT0hMQpyZXR1cm4gcX0sCkZWKGEsYil7
-Vy5UTih0aGlzLmEsdC5PLmEoYikpfX0KVy5Gay5wcm90b3R5cGU9e30KVy5STy5wcm90b3R5cGU9e30K
-Vy5DcS5wcm90b3R5cGU9e30KVy54Qy5wcm90b3R5cGU9e30KVy52Ti5wcm90b3R5cGU9ewokMShhKXty
-ZXR1cm4gdGhpcy5hLiQxKHQuQi5hKGEpKX0sCiRTOjI3fQpXLkpRLnByb3RvdHlwZT17CkNZKGEpe3Zh
-ciBzCmlmKCQub3IuZ2wwKCQub3IpKXtmb3Iocz0wO3M8MjYyOysrcykkLm9yLlk1KDAsQy5jbVtzXSxX
-LnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5vci5ZNSgwLEMuQklbc10sVy5WNCgpKX19LAppMChhKXty
-ZXR1cm4gJC5BTigpLnRnKDAsVy5yUyhhKSl9LApFYihhLGIsYyl7dmFyIHM9JC5vci5xKDAsVy5yUyhh
-KSsiOjoiK2IpCmlmKHM9PW51bGwpcz0kLm9yLnEoMCwiKjo6IitiKQppZihzPT1udWxsKXJldHVybiEx
-CnJldHVybiBILnA4KHMuJDQoYSxiLGMsdGhpcykpfSwKJGlrRjoxfQpXLkdtLnByb3RvdHlwZT17Cmdt
-KGEpe3JldHVybiBuZXcgVy5XOShhLHRoaXMuZ0EoYSksSC56SyhhKS5DKCJXOTxHbS5FPiIpKX19Clcu
-dkQucHJvdG90eXBlPXsKaTAoYSl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLlV2KGEpKX0sCkVi
-KGEsYixjKXtyZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3IFcuRWcoYSxiLGMpKX0sCiRpa0Y6MX0KVy5V
-di5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLmkwKHRoaXMuYSl9LAokUzoxNn0KVy5F
-Zy5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLkViKHRoaXMuYSx0aGlzLmIsdGhpcy5j
-KX0sCiRTOjE2fQpXLm02LnByb3RvdHlwZT17CkNZKGEsYixjLGQpe3ZhciBzLHIscQp0aGlzLmEuRlYo
-MCxjKQpzPWIuZXYoMCxuZXcgVy5FbygpKQpyPWIuZXYoMCxuZXcgVy5XaygpKQp0aGlzLmIuRlYoMCxz
-KQpxPXRoaXMuYwpxLkZWKDAsQy54RCkKcS5GVigwLHIpfSwKaTAoYSl7cmV0dXJuIHRoaXMuYS50Zygw
-LFcuclMoYSkpfSwKRWIoYSxiLGMpe3ZhciBzPXRoaXMscj1XLnJTKGEpLHE9cy5jCmlmKHEudGcoMCxy
-KyI6OiIrYikpcmV0dXJuIHMuZC5EdChjKQplbHNlIGlmKHEudGcoMCwiKjo6IitiKSlyZXR1cm4gcy5k
-LkR0KGMpCmVsc2V7cT1zLmIKaWYocS50ZygwLHIrIjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGco
-MCwiKjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCxyKyI6OioiKSlyZXR1cm4hMAplbHNlIGlm
-KHEudGcoMCwiKjo6KiIpKXJldHVybiEwfXJldHVybiExfSwKJGlrRjoxfQpXLkVvLnByb3RvdHlwZT17
-CiQxKGEpe3JldHVybiFDLk5tLnRnKEMuQkksSC5uKGEpKX0sCiRTOjZ9ClcuV2sucHJvdG90eXBlPXsK
-JDEoYSl7cmV0dXJuIEMuTm0udGcoQy5CSSxILm4oYSkpfSwKJFM6Nn0KVy5jdC5wcm90b3R5cGU9ewpF
-YihhLGIsYyl7aWYodGhpcy5qRihhLGIsYykpcmV0dXJuITAKaWYoYj09PSJ0ZW1wbGF0ZSImJmM9PT0i
-IilyZXR1cm4hMAppZihhLmdldEF0dHJpYnV0ZSgidGVtcGxhdGUiKT09PSIiKXJldHVybiB0aGlzLmUu
-dGcoMCxiKQpyZXR1cm4hMX19ClcuSUEucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIlRFTVBMQVRFOjoi
-K0gubihhKX0sCiRTOjJ9ClcuT3cucHJvdG90eXBlPXsKaTAoYSl7dmFyIHMKaWYodC5hTy5iKGEpKXJl
-dHVybiExCnM9dC5nNy5iKGEpCmlmKHMmJlcuclMoYSk9PT0iZm9yZWlnbk9iamVjdCIpcmV0dXJuITEK
-aWYocylyZXR1cm4hMApyZXR1cm4hMX0sCkViKGEsYixjKXtpZihiPT09ImlzInx8Qy54Qi5uKGIsIm9u
-IikpcmV0dXJuITEKcmV0dXJuIHRoaXMuaTAoYSl9LAokaWtGOjF9ClcuVzkucHJvdG90eXBlPXsKRigp
-e3ZhciBzPXRoaXMscj1zLmMrMSxxPXMuYgppZihyPHEpe3Muc3AoSi54OShzLmEscikpCnMuYz1yCnJl
-dHVybiEwfXMuc3AobnVsbCkKcy5jPXEKcmV0dXJuITF9LApnbCgpe3JldHVybiB0aGlzLiR0aS5jLmEo
-dGhpcy5kKX0sCnNwKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIpLmEoYSl9LAokaUFuOjF9ClcuZFcu
-cHJvdG90eXBlPXskaUQwOjEsJGl2NjoxfQpXLm1rLnByb3RvdHlwZT17JGl5MDoxfQpXLktvLnByb3Rv
-dHlwZT17ClBuKGEpe3ZhciBzLHI9bmV3IFcuZm0odGhpcykKZG97cz10aGlzLmIKci4kMihhLG51bGwp
-fXdoaWxlKHMhPT10aGlzLmIpfSwKRVAoYSxiKXsrK3RoaXMuYgppZihiPT1udWxsfHxiIT09YS5wYXJl
-bnROb2RlKUouTHQoYSkKZWxzZSBiLnJlbW92ZUNoaWxkKGEpfSwKSTQoYSxiKXt2YXIgcyxyLHEscCxv
-LG49ITAsbT1udWxsLGw9bnVsbAp0cnl7bT1KLmlnKGEpCmw9bS5hLmdldEF0dHJpYnV0ZSgiaXMiKQp0
-LmguYShhKQpzPWZ1bmN0aW9uKGMpe2lmKCEoYy5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWROb2Rl
-TWFwKSlyZXR1cm4gdHJ1ZQppZihjLmlkPT0ibGFzdENoaWxkInx8Yy5uYW1lPT0ibGFzdENoaWxkInx8
-Yy5pZD09InByZXZpb3VzU2libGluZyJ8fGMubmFtZT09InByZXZpb3VzU2libGluZyJ8fGMuaWQ9PSJj
-aGlsZHJlbiJ8fGMubmFtZT09ImNoaWxkcmVuIilyZXR1cm4gdHJ1ZQp2YXIgaz1jLmNoaWxkTm9kZXMK
-aWYoYy5sYXN0Q2hpbGQmJmMubGFzdENoaWxkIT09a1trLmxlbmd0aC0xXSlyZXR1cm4gdHJ1ZQppZihj
-LmNoaWxkcmVuKWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9ufHxjLmNoaWxk
-cmVuIGluc3RhbmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZhciBqPTAKaWYoYy5jaGlsZHJlbilq
-PWMuY2hpbGRyZW4ubGVuZ3RoCmZvcih2YXIgaT0wO2k8ajtpKyspe3ZhciBoPWMuY2hpbGRyZW5baV0K
-aWYoaC5pZD09ImF0dHJpYnV0ZXMifHxoLm5hbWU9PSJhdHRyaWJ1dGVzInx8aC5pZD09Imxhc3RDaGls
-ZCJ8fGgubmFtZT09Imxhc3RDaGlsZCJ8fGguaWQ9PSJwcmV2aW91c1NpYmxpbmcifHxoLm5hbWU9PSJw
-cmV2aW91c1NpYmxpbmcifHxoLmlkPT0iY2hpbGRyZW4ifHxoLm5hbWU9PSJjaGlsZHJlbiIpcmV0dXJu
-IHRydWV9cmV0dXJuIGZhbHNlfShhKQpuPUgub1Qocyk/ITA6IShhLmF0dHJpYnV0ZXMgaW5zdGFuY2Vv
-ZiBOYW1lZE5vZGVNYXApfWNhdGNoKHApe0guUnUocCl9cj0iZWxlbWVudCB1bnByaW50YWJsZSIKdHJ5
-e3I9Si53KGEpfWNhdGNoKHApe0guUnUocCl9dHJ5e3E9Vy5yUyhhKQp0aGlzLmtSKHQuaC5hKGEpLGIs
-bixyLHEsdC5mLmEobSksSC5rKGwpKX1jYXRjaChwKXtpZihILlJ1KHApIGluc3RhbmNlb2YgUC5BVCl0
-aHJvdyBwCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpvPSJSZW1vdmluZyBjb3JydXB0ZWQgZWxlbWVu
-dCAiK0guRWoocikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndh
-cm4obyl9fX0sCmtSKGEsYixjLGQsZSxmLGcpe3ZhciBzLHIscSxwLG8sbixtPXRoaXMKaWYoYyl7bS5F
-UChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBlbGVtZW50IGR1ZSB0byBjb3JydXB0ZWQgYXR0cmlidXRl
-cyBvbiA8IitkKyI+IgppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
-d2FybihzKQpyZXR1cm59aWYoIW0uYS5pMChhKSl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBk
-aXNhbGxvd2VkIGVsZW1lbnQgPCIrZSsiPiBmcm9tICIrSC5FaihiKQppZih0eXBlb2YgY29uc29sZSE9
-InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59aWYoZyE9bnVsbClpZighbS5h
-LkViKGEsImlzIixnKSl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBkaXNhbGxvd2VkIHR5cGUg
-ZXh0ZW5zaW9uIDwiK2UrJyBpcz0iJytnKyciPicKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQi
-KXdpbmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufXM9Zi5ndmMoKQpyPUguUUkocy5zbGljZSgwKSxI
-LnQ2KHMpKQpmb3IocT1mLmd2YygpLmxlbmd0aC0xLHM9Zi5hO3E+PTA7LS1xKXtpZihxPj1yLmxlbmd0
-aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpvPW0uYQpuPUouY0gocCkKSC5uKHApCmlmKCFvLkViKGEs
-bixILm4ocy5nZXRBdHRyaWJ1dGUocCkpKSl7d2luZG93Cm89IlJlbW92aW5nIGRpc2FsbG93ZWQgYXR0
-cmlidXRlIDwiK2UrIiAiK3ArJz0iJytILkVqKHMuZ2V0QXR0cmlidXRlKHApKSsnIj4nCmlmKHR5cGVv
-ZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKG8pCnMucmVtb3ZlQXR0cmli
-dXRlKHApfX1pZih0LmFXLmIoYSkpe3M9YS5jb250ZW50CnMudG9TdHJpbmcKbS5QbihzKX19LAokaW9u
-OjF9ClcuZm0ucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLmEKc3dpdGNo
-KGEubm9kZVR5cGUpe2Nhc2UgMTptLkk0KGEsYikKYnJlYWsKY2FzZSA4OmNhc2UgMTE6Y2FzZSAzOmNh
-c2UgNDpicmVhawpkZWZhdWx0Om0uRVAoYSxiKX1zPWEubGFzdENoaWxkCmZvcihxPXQuQTtzIT1udWxs
-Oyl7cj1udWxsCnRyeXtyPXMucHJldmlvdXNTaWJsaW5nCmlmKHIhPW51bGwpe3A9ci5uZXh0U2libGlu
-ZwpvPXMKbz1wPT1udWxsP28hPW51bGw6cCE9PW8KcD1vfWVsc2UgcD0hMQppZihwKXtwPVAuUFYoIkNv
-cnJ1cHQgSFRNTCIpCnRocm93IEguYihwKX19Y2F0Y2gobil7SC5SdShuKQpwPXEuYShzKTsrK20uYgpv
-PXAucGFyZW50Tm9kZQppZihhIT09byl7aWYobyE9bnVsbClvLnJlbW92ZUNoaWxkKHApfWVsc2UgYS5y
-ZW1vdmVDaGlsZChwKQpzPW51bGwKcj1hLmxhc3RDaGlsZH1pZihzIT1udWxsKXRoaXMuJDIocyxhKQpz
-PXJ9fSwKJFM6MzB9ClcuTGUucHJvdG90eXBlPXt9ClcuSzcucHJvdG90eXBlPXt9ClcuckIucHJvdG90
-eXBlPXt9ClcuWFcucHJvdG90eXBlPXt9Clcub2EucHJvdG90eXBlPXt9ClAuaUoucHJvdG90eXBlPXsK
-VkgoYSl7dmFyIHMscj10aGlzLmEscT1yLmxlbmd0aApmb3Iocz0wO3M8cTsrK3MpaWYocltzXT09PWEp
-cmV0dXJuIHMKQy5ObS5pKHIsYSkKQy5ObS5pKHRoaXMuYixudWxsKQpyZXR1cm4gcX0sClB2KGEpe3Zh
-ciBzLHIscSxwPXRoaXMsbz17fQppZihhPT1udWxsKXJldHVybiBhCmlmKEguclEoYSkpcmV0dXJuIGEK
-aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4g
-YQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gbmV3IERhdGUoYS5hKQppZih0LmZ2LmIoYSkpdGhy
-b3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2YgUmVnRXhwIikpCmlmKHQuYzguYihhKSlyZXR1
-cm4gYQppZih0LncuYihhKSlyZXR1cm4gYQppZih0LkkuYihhKSlyZXR1cm4gYQpzPXQuZEUuYihhKXx8
-ITEKaWYocylyZXR1cm4gYQppZih0LmYuYihhKSl7cj1wLlZIKGEpCnM9cC5iCmlmKHI+PXMubGVuZ3Ro
-KXJldHVybiBILk9IKHMscikKcT1vLmE9c1tyXQppZihxIT1udWxsKXJldHVybiBxCnE9e30Kby5hPXEK
-Qy5ObS5ZNShzLHIscSkKYS5LKDAsbmV3IFAuRTIobyxwKSkKcmV0dXJuIG8uYX1pZih0LmouYihhKSl7
-cj1wLlZIKGEpCm89cC5iCmlmKHI+PW8ubGVuZ3RoKXJldHVybiBILk9IKG8scikKcT1vW3JdCmlmKHEh
-PW51bGwpcmV0dXJuIHEKcmV0dXJuIHAuZWsoYSxyKX1pZih0LmVILmIoYSkpe3I9cC5WSChhKQpzPXAu
-YgppZihyPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHIpCnE9by5iPXNbcl0KaWYocSE9bnVsbClyZXR1
-cm4gcQpxPXt9Cm8uYj1xCkMuTm0uWTUocyxyLHEpCnAuaW0oYSxuZXcgUC5qZyhvLHApKQpyZXR1cm4g
-by5ifXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LAplayhh
-LGIpe3ZhciBzLHI9Si5VNihhKSxxPXIuZ0EoYSkscD1uZXcgQXJyYXkocSkKQy5ObS5ZNSh0aGlzLmIs
-YixwKQpmb3Iocz0wO3M8cTsrK3MpQy5ObS5ZNShwLHMsdGhpcy5QdihyLnEoYSxzKSkpCnJldHVybiBw
-fX0KUC5FMi5wcm90b3R5cGU9ewokMihhLGIpe3RoaXMuYS5hW2FdPXRoaXMuYi5QdihiKX0sCiRTOjMx
-fQpQLmpnLnByb3RvdHlwZT17CiQyKGEsYil7dGhpcy5hLmJbYV09dGhpcy5iLlB2KGIpfSwKJFM6MzJ9
-ClAuQmYucHJvdG90eXBlPXsKaW0oYSxiKXt2YXIgcyxyLHEscAp0LmI4LmEoYikKZm9yKHM9T2JqZWN0
-LmtleXMoYSkscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1zW3FdCmIuJDIocCxhW3BdKX19fQpQLkFz
-LnByb3RvdHlwZT17ClYoYSl7dmFyIHMKSC5uKGEpCnM9JC5oRygpLmIKaWYocy50ZXN0KGEpKXJldHVy
-biBhCnRocm93IEguYihQLkwzKGEsInZhbHVlIiwiTm90IGEgdmFsaWQgY2xhc3MgdG9rZW4iKSl9LAp3
-KGEpe3JldHVybiB0aGlzLkQoKS5rKDAsIiAiKX0sCmdtKGEpe3ZhciBzPXRoaXMuRCgpCnJldHVybiBQ
-LnJqKHMscy5yLEguTGgocykuYyl9LApnbDAoYSl7cmV0dXJuIHRoaXMuRCgpLmE9PT0wfSwKZ29yKGEp
-e3JldHVybiB0aGlzLkQoKS5hIT09MH0sCmdBKGEpe3JldHVybiB0aGlzLkQoKS5hfSwKdGcoYSxiKXt0
-aGlzLlYoYikKcmV0dXJuIHRoaXMuRCgpLnRnKDAsYil9LAppKGEsYil7dmFyIHMKSC5uKGIpCnRoaXMu
-VihiKQpzPXRoaXMuT1MobmV3IFAuR0UoYikpCnJldHVybiBILnA4KHM9PW51bGw/ITE6cyl9LApSKGEs
-Yil7dmFyIHMscgppZih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuITEKdGhpcy5WKGIpCnM9dGhpcy5E
-KCkKcj1zLlIoMCxiKQp0aGlzLlgocykKcmV0dXJuIHJ9LApGVihhLGIpe3RoaXMuT1MobmV3IFAuTjco
-dGhpcyx0Lk8uYShiKSkpfSwKZVIoYSxiKXt2YXIgcz10aGlzLkQoKQpyZXR1cm4gSC5iSyhzLGIsSC5M
-aChzKS5DKCJsZi5FIikpfSwKRShhLGIpe3JldHVybiB0aGlzLkQoKS5FKDAsYil9LApWMShhKXt0aGlz
-Lk9TKG5ldyBQLnVRKCkpfSwKT1MoYSl7dmFyIHMscgp0LmJVLmEoYSkKcz10aGlzLkQoKQpyPWEuJDEo
-cykKdGhpcy5YKHMpCnJldHVybiByfX0KUC5HRS5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5DLmEo
-YSkuaSgwLHRoaXMuYSl9LAokUzozM30KUC5ONy5wcm90b3R5cGU9ewokMShhKXt2YXIgcz10aGlzLmIs
-cj1ILnQ2KHMpCnJldHVybiB0LkMuYShhKS5GVigwLG5ldyBILmxKKHMsci5DKCJxVSgxKSIpLmEodGhp
-cy5hLmd1TSgpKSxyLkMoImxKPDEscVU+IikpKX0sCiRTOjEyfQpQLnVRLnByb3RvdHlwZT17CiQxKGEp
-e3QuQy5hKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5TKCl9cmV0
-dXJuIG51bGx9LAokUzoxMn0KUC5oRi5wcm90b3R5cGU9eyRpaEY6MX0KUC5EVi5wcm90b3R5cGU9ewok
-MShhKXt2YXIgcwp0LlkuYShhKQpzPWZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1
-cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKSl9fShQLlI0
-LGEsITEpClAuRG0ocywkLnooKSxhKQpyZXR1cm4gc30sCiRTOjR9ClAuUEMucHJvdG90eXBlPXsKJDEo
-YSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0fQpQLlFTLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
-biBuZXcgUC5yNyh0LksuYShhKSl9LAokUzo0NH0KUC5ucC5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4g
-bmV3IFAuVHoodC5LLmEoYSksdC5hbSl9LAokUzozNn0KUC5VdC5wcm90b3R5cGU9ewokMShhKXtyZXR1
-cm4gbmV3IFAuRTQodC5LLmEoYSkpfSwKJFM6Mzd9ClAuRTQucHJvdG90eXBlPXsKcShhLGIpe2lmKHR5
-cGVvZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJudW1iZXIiKXRocm93IEguYihQLnhZKCJwcm9wZXJ0
-eSBpcyBub3QgYSBTdHJpbmcgb3IgbnVtIixudWxsKSkKcmV0dXJuIFAuZFUodGhpcy5hW2JdKX0sClk1
-KGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIo
-UC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIsbnVsbCkpCnRoaXMuYVtiXT1QLndZ
-KGMpfSwKRE4oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVybiBiIGluc3RhbmNlb2YgUC5FNCYm
-dGhpcy5hPT09Yi5hfSwKdyhhKXt2YXIgcyxyCnRyeXtzPVN0cmluZyh0aGlzLmEpCnJldHVybiBzfWNh
-dGNoKHIpe0guUnUocikKcz10aGlzLnhiKDApCnJldHVybiBzfX0sClY3KGEsYil7dmFyIHMscj10aGlz
-LmEKaWYoYj09bnVsbClzPW51bGwKZWxzZXtzPUgudDYoYikKcz1QLlBXKG5ldyBILmxKKGIscy5DKCJA
-KDEpIikuYShQLmlHKCkpLHMuQygibEo8MSxAPiIpKSwhMCx0LnopfXJldHVybiBQLmRVKHJbYV0uYXBw
-bHkocixzKSl9LApnaU8oYSl7cmV0dXJuIDB9fQpQLnI3LnByb3RvdHlwZT17fQpQLlR6LnByb3RvdHlw
-ZT17CmNQKGEpe3ZhciBzPXRoaXMscj1hPDB8fGE+PXMuZ0EocykKaWYocil0aHJvdyBILmIoUC5URShh
-LDAscy5nQShzKSxudWxsLG51bGwpKX0sCnEoYSxiKXtpZihILm9rKGIpKXRoaXMuY1AoYikKcmV0dXJu
-IHRoaXMuJHRpLmMuYSh0aGlzLlVyKDAsYikpfSwKWTUoYSxiLGMpe3RoaXMuY1AoYikKdGhpcy5iaCgw
-LGIsYyl9LApnQShhKXt2YXIgcz10aGlzLmEubGVuZ3RoCmlmKHR5cGVvZiBzPT09Im51bWJlciImJnM+
-Pj4wPT09cylyZXR1cm4gcwp0aHJvdyBILmIoUC5QVigiQmFkIEpzQXJyYXkgbGVuZ3RoIikpfSwKJGli
-UToxLAokaWNYOjEsCiRpek06MX0KUC52Zy5wcm90b3R5cGU9ewpZNShhLGIsYyl7cmV0dXJuIHRoaXMu
-ZTQoMCxiLGMpfX0KUC5uZC5wcm90b3R5cGU9eyRpbmQ6MX0KUC5LZS5wcm90b3R5cGU9ewpEKCl7dmFy
-IHMscixxLHAsbz10aGlzLmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLG49UC5Mcyh0Lk4pCmlmKG89PW51
-bGwpcmV0dXJuIG4KZm9yKHM9by5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsrK3Epe3A9Si5U
-MChzW3FdKQppZihwLmxlbmd0aCE9PTApbi5pKDAscCl9cmV0dXJuIG59LApYKGEpe3RoaXMuYS5zZXRB
-dHRyaWJ1dGUoImNsYXNzIixhLmsoMCwiICIpKX19ClAuaGkucHJvdG90eXBlPXsKZ1AoYSl7cmV0dXJu
-IG5ldyBQLktlKGEpfSwKc2hmKGEsYil7dGhpcy5ZQyhhLGIpfSwKcjYoYSxiLGMsZCl7dmFyIHMscixx
-LHAsbyxuCmlmKGQ9PW51bGwpe3M9SC5RSShbXSx0LnIpCmQ9bmV3IFcudkQocykKQy5ObS5pKHMsVy5U
-dyhudWxsKSkKQy5ObS5pKHMsVy5CbCgpKQpDLk5tLmkocyxuZXcgVy5PdygpKX1jPW5ldyBXLktvKGQp
-CnI9JzxzdmcgdmVyc2lvbj0iMS4xIj4nK0guRWooYikrIjwvc3ZnPiIKcz1kb2N1bWVudApxPXMuYm9k
-eQpxLnRvU3RyaW5nCnA9Qy5SWS5BSChxLHIsYykKbz1zLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpz
-PW5ldyBXLmU3KHApCm49cy5ncjgocykKZm9yKDtzPW4uZmlyc3RDaGlsZCxzIT1udWxsOylvLmFwcGVu
-ZENoaWxkKHMpCnJldHVybiBvfSwKbnooYSxiLGMsZCxlKXt0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGlu
-dm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdWbChhKXtyZXR1cm4gbmV3IFcuQ3Eo
-YSwiY2xpY2siLCExLHQuUSl9LAokaWhpOjF9ClUuZDIucHJvdG90eXBlPXsKTHQoKXt2YXIgcyxyLHEs
-cCxvPXRoaXMsbj10Lk4sbT10LlgsbD1QLkZsKG4sbSksaz1vLmEKaWYoayE9bnVsbCl7cz1ILlFJKFtd
-LHQuZCkKZm9yKHI9ay5sZW5ndGgscT0wO3E8ay5sZW5ndGg7ay5sZW5ndGg9PT1yfHwoMCxILmxrKShr
-KSwrK3Epe3A9a1txXQpzLnB1c2goUC5FRihbImRlc2NyaXB0aW9uIixwLmEsImhyZWYiLHAuYl0sbixt
-KSl9bC5ZNSgwLCJlZGl0cyIscyl9bC5ZNSgwLCJleHBsYW5hdGlvbiIsby5iKQpsLlk1KDAsImxpbmUi
-LG8uYykKbC5ZNSgwLCJkaXNwbGF5UGF0aCIsby5kKQpsLlk1KDAsInVyaVBhdGgiLG8uZSkKbj1vLmYK
-aWYobiE9bnVsbCl7bT1ILlFJKFtdLHQuZCkKZm9yKGs9bi5sZW5ndGgscT0wO3E8bi5sZW5ndGg7bi5s
-ZW5ndGg9PT1rfHwoMCxILmxrKShuKSwrK3EpbS5wdXNoKG5bcV0uTHQoKSkKbC5ZNSgwLCJ0cmFjZXMi
-LG0pfXJldHVybiBsfX0KVS5TZS5wcm90b3R5cGU9ewpMdCgpe3JldHVybiBQLkVGKFsiZGVzY3JpcHRp
-b24iLHRoaXMuYSwiaHJlZiIsdGhpcy5iXSx0Lk4sdC5YKX19ClUuTWwucHJvdG90eXBlPXsKTHQoKXty
-ZXR1cm4gUC5FRihbImhyZWYiLHRoaXMuYSwibGluZSIsdGhpcy5iLCJwYXRoIix0aGlzLmNdLHQuTix0
-LlgpfX0KVS55RC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwPUguUUkoW10sdC5kKQpmb3Iocz10
-aGlzLmIscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsr
-cSlwLnB1c2goc1txXS5MdCgpKQpyZXR1cm4gUC5FRihbImRlc2NyaXB0aW9uIix0aGlzLmEsImVudHJp
-ZXMiLHBdLHQuTix0LlgpfX0KVS53Yi5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwPXRoaXMsbz1Q
-LkZsKHQuTix0LlgpCm8uWTUoMCwiZGVzY3JpcHRpb24iLHAuYSkKcz1wLmIKaWYocyE9bnVsbClvLlk1
-KDAsImZ1bmN0aW9uIixzKQpzPXAuYwppZihzIT1udWxsKW8uWTUoMCwibGluayIscy5MdCgpKQpzPXAu
-ZAppZihzLmxlbmd0aCE9PTApe3I9SC50NihzKQpxPXIuQygibEo8MSxaMDxxVSxNaD8+PiIpCm8uWTUo
-MCwiaGludEFjdGlvbnMiLFAuWTEobmV3IEgubEoocyxyLkMoIlowPHFVLE1oPz4oMSkiKS5hKG5ldyBV
-LmIwKCkpLHEpLCEwLHEuQygiYUwuRSIpKSl9cmV0dXJuIG99fQpVLmFOLnByb3RvdHlwZT17CiQxKGEp
-e3JldHVybiBSLm56KHQuRy5hKGEpKX0sCiRTOjM4fQpVLmIwLnByb3RvdHlwZT17CiQxKGEpe3JldHVy
-biB0LkouYShhKS5MdCgpfSwKJFM6Mzl9CkIuajgucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihb
-ImxpbmUiLHRoaXMuYSwiZXhwbGFuYXRpb24iLHRoaXMuYiwib2Zmc2V0Iix0aGlzLmNdLHQuTix0Llgp
-fX0KQi5xcC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPXQuTixqPVAu
-Rmwoayx0LngpCmZvcihzPWwuZCxzPXMuZ1B1KHMpLHM9cy5nbShzKSxyPXQuWCxxPXQuZDtzLkYoKTsp
-e3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1KLklUKHAuYik7cC5GKCk7KXttPXAuZ2wo
-KQpuLnB1c2goUC5FRihbImxpbmUiLG0uYSwiZXhwbGFuYXRpb24iLG0uYiwib2Zmc2V0IixtLmNdLGss
-cikpfWouWTUoMCxvLG4pfXJldHVybiBQLkVGKFsicmVnaW9ucyIsbC5hLCJuYXZpZ2F0aW9uQ29udGVu
-dCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixqXSxrLHIpfX0KVC5tUS5wcm90b3R5cGU9e30K
-TC5lLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG8sbixtCnQuQi5hKGEpCnM9dC5GCnI9cy5h
-KHdpbmRvdy5sb2NhdGlvbikucGF0aG5hbWUKcT1MLkc2KHMuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYp
-CnA9TC5hSyhzLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQpMLkdlKCkKaWYociE9PSIvIil7cz1kb2N1
-bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50CnMudG9TdHJpbmcKcz1yIT09Qy54
-Qi5iUyhzKX1lbHNlIHM9ITEKaWYocyl7ci50b1N0cmluZwpMLkc3KHIscSxwLCEwLG5ldyBMLlZXKHIs
-cSxwKSl9cz1kb2N1bWVudApvPXMucXVlcnlTZWxlY3RvcigiLmFwcGx5LW1pZ3JhdGlvbiIpCm8udG9T
-dHJpbmcKbz1KLnFGKG8pCm49by4kdGkKbT1uLkMoIn4oMSk/IikuYShuZXcgTC5vWigpKQp0LlouYShu
-dWxsKQpXLkpFKG8uYSxvLmIsbSwhMSxuLmMpCm49cy5xdWVyeVNlbGVjdG9yKCIucmVydW4tbWlncmF0
-aW9uIikKbi50b1N0cmluZwpuPUoucUYobikKbT1uLiR0aQpXLkpFKG4uYSxuLmIsbS5DKCJ+KDEpPyIp
-LmEobmV3IEwueTgoKSksITEsbS5jKQptPXMucXVlcnlTZWxlY3RvcigiLnJlcG9ydC1wcm9ibGVtIikK
-bS50b1N0cmluZwptPUoucUYobSkKbj1tLiR0aQpXLkpFKG0uYSxtLmIsbi5DKCJ+KDEpPyIpLmEobmV3
-IEwuSGkoKSksITEsbi5jKQpzPXMucXVlcnlTZWxlY3RvcigiLnBvcHVwLXBhbmUgLmNsb3NlIikKcy50
-b1N0cmluZwpzPUoucUYocykKbj1zLiR0aQpXLkpFKHMuYSxzLmIsbi5DKCJ+KDEpPyIpLmEobmV3IEwu
-QlQoKSksITEsbi5jKQpuPSQuYzAoKQpuLnRvU3RyaW5nCm49Si5xRihuKQpzPW4uJHRpClcuSkUobi5h
-LG4uYixzLkMoIn4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxzLmMpfSwKJFM6MTd9CkwuVlcucHJvdG90
-eXBlPXsKJDAoKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjB9Ckwub1oucHJvdG90eXBl
-PXsKJDEoYSl7dmFyIHMscixxLHAsbwp0LlYuYShhKQppZihDLm9sLnVzKHdpbmRvdywiVGhpcyB3aWxs
-IGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQgdG8geW91ciB3b3JraW5nIGRpcmVjdG9y
-eS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkgY2hhbmdlcyB5b3UgbWFkZSBiZWZvcmUg
-ZG9pbmcgdGhpcy4iKSl7cz1ILlFJKFtdLHQuZCkKZm9yKHI9JC5JUixxPXIubGVuZ3RoLHA9MDtwPHIu
-bGVuZ3RoO3IubGVuZ3RoPT09cXx8KDAsSC5saykociksKytwKXMucHVzaChyW3BdLkx0KCkpCnM9TC50
-eSgiL2FwcGx5LW1pZ3JhdGlvbiIsUC5FRihbIm5hdmlnYXRpb25UcmVlIixzXSx0Lk4sdC54KSkuVzco
-bmV3IEwuanIoKSx0LlApCm89bmV3IEwucWwoKQp0LmI3LmEobnVsbCkKcj1zLiR0aQpxPSQuWDMKaWYo
-cSE9PUMuTlUpbz1QLlZIKG8scSkKcy54ZihuZXcgUC5GZShuZXcgUC52cyhxLHIpLDIsbnVsbCxvLHIu
-QygiQDwxPiIpLktxKHIuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6MX0KTC5qci5wcm90b3R5cGU9ewok
-MShhKXt2YXIgcwp0LmZuLmEoYSkKcz1kb2N1bWVudC5ib2R5CnMuY2xhc3NMaXN0LnJlbW92ZSgicHJv
-cG9zZWQiKQpzLmNsYXNzTGlzdC5hZGQoImFwcGxpZWQiKX0sCiRTOjQyfQpMLnFsLnByb3RvdHlwZT17
-CiQyKGEsYil7TC5DMigiQ291bGRuJ3QgYXBwbHkgbWlncmF0aW9uIix0LksuYShhKSxiKX0sCiRTOjQz
-fQpMLnk4LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0aGlzLnhuKHQuVi5hKGEpKX0sCnhuKGEpe3Zh
-ciBzPTAscj1QLkZYKHQuSCkscT0xLHAsbz1bXSxuLG0sbCxrLGosaQp2YXIgJGFzeW5jJCQxPVAubHoo
-ZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0cnVlKXN3aXRjaChzKXtjYXNlIDA6
-cT0zCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5uaW5nIikKcz02CnJldHVybiBQLmpR
-KEwudHkoIi9yZXJ1bi1taWdyYXRpb24iLG51bGwpLCRhc3luYyQkMSkKY2FzZSA2Om49YwprPW4Kay50
-b1N0cmluZwppZihILnA4KEoueDkoaywic3VjY2VzcyIpKSl0LkYuYSh3aW5kb3cubG9jYXRpb24pLnJl
-bG9hZCgpCmVsc2UgTC5LMCh0LmV3LmEoSi54OShuLCJlcnJvcnMiKSkpCm8ucHVzaCg1KQpzPTQKYnJl
-YWsKY2FzZSAzOnE9MgppPXAKbT1ILlJ1KGkpCmw9SC50cyhpKQpMLkMyKCJGYWlsZWQgdG8gcmVydW4g
-bWlncmF0aW9uIixtLGwpCm8ucHVzaCg1KQpzPTQKYnJlYWsKY2FzZSAyOm89WzFdCmNhc2UgNDpxPTEK
-ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJyZXJ1bm5pbmciKQpzPW8ucG9wKCkKYnJlYWsK
-Y2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVybiBQLmYzKHAscil9fSkKcmV0dXJu
-IFAuREkoJGFzeW5jJCQxLHIpfSwKJFM6N30KTC5IaS5wcm90b3R5cGU9ewokMShhKXt0LlYuYShhKQpD
-Lm9sLlBvKHdpbmRvdyxQLlhkKCJodHRwcyIsImdpdGh1Yi5jb20iLCJkYXJ0LWxhbmcvc2RrL2lzc3Vl
-cy9uZXciLFAuRUYoWyJ0aXRsZSIsIkN1c3RvbWVyLXJlcG9ydGVkIGlzc3VlIHdpdGggTk5CRCBtaWdy
-YXRpb24gdG9vbCIsImxhYmVscyIsdS5kLCJib2R5IiwiIyMjIyBTdGVwcyB0byByZXByb2R1Y2Vcblxu
-IyMjIyBXaGF0IGRpZCB5b3UgZXhwZWN0IHRvIGhhcHBlbj9cblxuIyMjIyBXaGF0IGFjdHVhbGx5IGhh
-cHBlbmVkP1xuXG5fU2NyZWVuc2hvdHMgYXJlIGFwcHJlY2lhdGVkX1xuXG4qKkRhcnQgU0RLIHZlcnNp
-b24qKjogIitILkVqKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZGstdmVyc2lvbiIpLnRleHRDb250
-ZW50KSsiXG5cblRoYW5rcyBmb3IgZmlsaW5nIVxuIl0sdC5OLHQueikpLmduRCgpLCJyZXBvcnQtcHJv
-YmxlbSIpfSwKJFM6MX0KTC5CVC5wcm90b3R5cGU9ewokMShhKXt2YXIgcwp0LlYuYShhKQpzPWRvY3Vt
-ZW50LnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikuc3R5bGUKcy5kaXNwbGF5PSJub25lIgpyZXR1
-cm4ibm9uZSJ9LAokUzoxfQpMLlBZLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG8KdC5WLmEo
-YSkKcz0kLkQ5KCkuaW5uZXJUZXh0CnI9dC5oLmEoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1w
-YW5lbCBbZGF0YS1uYW1lKj0iJytXLkxqKHMpKyciXScpLnBhcmVudE5vZGUpCnE9ci5xdWVyeVNlbGVj
-dG9yKCIuc3RhdHVzLWljb24iKQpwPSQuSVIKcC50b1N0cmluZwpvPUwueXcocCxzKQppZihvIGluc3Rh
-bmNlb2YgTC5jRCl7cD1vLngKcC50b1N0cmluZ31lbHNlIHA9ITEKaWYocCl7TC5PdChvKQpMLnhuKHEs
-bykKTC5BUihyLG8pfX0sCiRTOjF9CkwuTC5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyLHEscAp0LkIu
-YShhKQpzPXQuRgpyPXMuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lCnIudG9TdHJpbmcKcT1MLkc2
-KHMuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYpCnA9TC5hSyhzLmEod2luZG93LmxvY2F0aW9uKS5ocmVm
-KQppZihyLmxlbmd0aD4xKUwuRzcocixxLHAsITEsbnVsbCkKZWxzZXtMLkJFKHIsQi53UigpLCEwKQpM
-LkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE3fQpMLld4LnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIs
-cSxwLG89ImNvbGxhcHNlZCIKdC5WLmEoYSkKcz10aGlzLmEKcj1KLllFKHMpCnE9dGhpcy5iCnA9Si5Z
-RShxKQppZighci5nUChzKS50ZygwLG8pKXtyLmdQKHMpLmkoMCxvKQpwLmdQKHEpLmkoMCxvKX1lbHNl
-e3IuZ1AocykuUigwLG8pCnAuZ1AocSkuUigwLG8pfX0sCiRTOjF9CkwuSG8ucHJvdG90eXBlPXsKJDEo
-YSl7dmFyIHM9Si5xRih0LmguYShhKSkscj1zLiR0aSxxPXIuQygifigxKT8iKS5hKG5ldyBMLmROKHRo
-aXMuYSkpCnQuWi5hKG51bGwpClcuSkUocy5hLHMuYixxLCExLHIuYyl9LAokUzozfQpMLmROLnByb3Rv
-dHlwZT17CiQxKGEpe3JldHVybiBMLnQyKHQuVi5hKGEpLHRoaXMuYSl9LAokUzoxfQpMLklDLnByb3Rv
-dHlwZT17CiQxKGEpe3ZhciBzLHIscQp0LmguYShhKQpzPUoucUYoYSkKcj1zLiR0aQpxPXIuQygifigx
-KT8iKS5hKG5ldyBMLnh6KGEsdGhpcy5hKSkKdC5aLmEobnVsbCkKVy5KRShzLmEscy5iLHEsITEsci5j
-KX0sCiRTOjN9CkwueHoucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscixxLHAKdC5WLmEoYSkKcz10aGlz
-LmEKcj1zLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KHMpKS5PVSgib2Zmc2V0
-IikpCnIudG9TdHJpbmcKcT1QLlFBKHIsbnVsbCkKcz1zLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBX
-LlN5KG5ldyBXLmk3KHMpKS5PVSgibGluZSIpKQpzLnRvU3RyaW5nCnA9UC5RQShzLG51bGwpCnM9dGhp
-cy5iCnMudG9TdHJpbmcKTC5oWChzLHEscCl9LAokUzoxfQpMLkJOLnByb3RvdHlwZT17CiQxKGEpe3Zh
-ciBzPUoucUYodC5oLmEoYSkpLHI9cy4kdGkKci5DKCJ+KDEpPyIpLmEoTC5pUygpKQp0LlouYShudWxs
-KQpXLkpFKHMuYSxzLmIsTC5pUygpLCExLHIuYyl9LAokUzozfQpMLmZDLnByb3RvdHlwZT17CiQxKGEp
-e3QucC5hKGEpCnRoaXMuYS5hTSgwLHRoaXMuYil9LAokUzo0Nn0KTC5UbS5wcm90b3R5cGU9ewokMShh
-KXtILm4oYSkKcmV0dXJuIGEubGVuZ3RoPjQwP0MueEIuTmooYSwwLDQwKSsiLi4uIjphfSwKJFM6Mn0K
-TC5uVC5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5O
-WS5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLG51bGwsbnVsbCl9LAokUzowfQpMLnVlLnByb3Rv
-dHlwZT17CiQxKGEpe3QuZi5hKGEpCnJldHVybiBILkVqKGEucSgwLCJzZXZlcml0eSIpKSsiIC0gIitI
-LkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitILkVqKGEucSgwLCJsb2NhdGlvbiIpKSsiIC0gKCIr
-SC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0N30KTC5HSC5wcm90b3R5cGU9ewokMShhKXt0Lmgu
-YShhKQokLnpCKCkKdC5lcy5hKCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixb
-YV0pfSwKJFM6M30KTC5FRS5wcm90b3R5cGU9ewokMShhKXt2YXIgcyxyCnQuVi5hKGEpLnByZXZlbnRE
-ZWZhdWx0KCkKcz10aGlzLmEKcj10aGlzLmIKTC5hZih0LkYuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhu
-YW1lLHMsciwhMCxuZXcgTC5RTChzLHIpKQpMLmhYKHRoaXMuYyxzLHIpfSwKJFM6MX0KTC5RTC5wcm90
-b3R5cGU9ewokMCgpe0wuRnIodC5GLmEod2luZG93LmxvY2F0aW9uKS5wYXRobmFtZSx0aGlzLmEsdGhp
-cy5iKX0sCiRTOjB9CkwuVlMucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscj0ic2VsZWN0ZWQtZmlsZSIK
-dC5oLmEoYSkKcz1KLllFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcu
-aTcoYSkpLk9VKCJuYW1lIikpPT09dGhpcy5hLmEpcy5nUChhKS5pKDAscikKZWxzZSBzLmdQKGEpLlIo
-MCxyKX0sCiRTOjN9CkwuVEQucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscgp0LlYuYShhKQpzPXRoaXMu
-YQpzd2l0Y2gocy5nTCgpKXtjYXNlIEMuY3c6YnJlYWsKY2FzZSBDLldEOnMubkcoKQpicmVhawpjYXNl
-IEMuWGo6cy5jMigpCmJyZWFrCmNhc2UgQy5kYzpzLmMyKCkKYnJlYWt9cj10aGlzLmIKTC5iTChyLHMp
-CkwueG4odGhpcy5jLHMpCkwuQVIocixzKX0sCiRTOjF9CkwuSWYucHJvdG90eXBlPXsKJDEoYSl7dmFy
-IHMKdC5WLmEoYSkKcz10aGlzLmEKTC5PdChzKQpMLnhuKHRoaXMuYixzKQpMLkFSKHRoaXMuYyxzKX0s
-CiRTOjF9CkwudEIucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIEwudDIodC5WLmEoYSksITApfSwKJFM6
-MX0KTC5tMi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5SSSh0LlYuYShhKSl9LApSSShhKXt2
-YXIgcz0wLHI9UC5GWCh0LkgpLHE9MSxwLG89W10sbj10aGlzLG0sbCxrLGosaSxoLGcsZixlCnZhciAk
-YXN5bmMkJDE9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtwPWMKcz1xfXdoaWxlKHRydWUpc3dp
-dGNoKHMpe2Nhc2UgMDpxPTMKaT1kb2N1bWVudAptPUMuQ0QuelEoaS5xdWVyeVNlbGVjdG9yKCIuY29u
-dGVudCIpLnNjcm9sbFRvcCkKaD10Lk4Kcz02CnJldHVybiBQLmpRKEwudHkoTC5RNCgiL2FwcGx5LWhp
-bnQiLFAuRmwoaCxoKSksbi5hLkx0KCkpLCRhc3luYyQkMSkKY2FzZSA2Omg9bi5iCmc9aC5hCmcudG9T
-dHJpbmcKbD1MLlVzKGcpCnM9NwpyZXR1cm4gUC5qUShMLkc3KGwsbnVsbCxoLmIsITEsbnVsbCksJGFz
-eW5jJCQxKQpjYXNlIDc6aS5ib2R5LmNsYXNzTGlzdC5hZGQoIm5lZWRzLXJlcnVuIikKaT1pLnF1ZXJ5
-U2VsZWN0b3IoIi5jb250ZW50IikKaS50b1N0cmluZwppLnNjcm9sbFRvcD1DLmpuLnpRKG0pCnE9MQpz
-PTUKYnJlYWsKY2FzZSAzOnE9MgplPXAKaz1ILlJ1KGUpCmo9SC50cyhlKQpMLkMyKCJjb3VsZG4ndCBh
-cHBseSBoaW50IixrLGopCnM9NQpicmVhawpjYXNlIDI6cz0xCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55
-QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJldHVybiBQLkRJKCRhc3luYyQkMSxy
-KX0sCiRTOjd9CkwuUVcucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4gdGhpcy5hKyI6XG4iK3RoaXMuYn0s
-CiRpUno6MX0KTC5YQS5wcm90b3R5cGU9ewpFYihhLGIsYyl7cmV0dXJuITB9LAppMChhKXtyZXR1cm4h
-MH0sCiRpa0Y6MX0KTC52dC5wcm90b3R5cGU9ewpnTCgpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcy5k
-CmlmKGwubGVuZ3RoPT09MClyZXR1cm4gQy5jdwpzPUMuTm0uZ3RIKGwpLmdMKCkKZm9yKHI9bC5sZW5n
-dGgscT0hMCxwPSEwLG89MDtvPGwubGVuZ3RoO2wubGVuZ3RoPT09cnx8KDAsSC5saykobCksKytvKXtu
-PWxbb10uZ0woKQppZihuIT1zKXM9bnVsbAptPW4hPT1DLmN3CmlmKG0mJm4hPT1DLldEKXE9ITEKaWYo
-bSYmbiE9PUMuWGopcD0hMX1pZihzIT1udWxsKXJldHVybiBzCmlmKHEpcmV0dXJuIEMuV0QKaWYocCly
-ZXR1cm4gQy5YagpyZXR1cm4gQy5kY30sCkxWKCl7dmFyIHMscixxLHA9dGhpcy5kCmlmKHAhPW51bGwp
-Zm9yKHM9cC5sZW5ndGgscj0wO3I8czsrK3Ipe3E9cFtyXQppZihxLmI9PT0kKXEuYj10aGlzCmVsc2Ug
-SC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIikp
-fX0sCmMyKCl7dmFyIHMscixxLHAsbwpmb3Iocz10aGlzLmQscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0
-aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcSl7cD1zW3FdCmlmKHAgaW5zdGFuY2VvZiBMLnZ0
-KXAuYzIoKQplbHNle2lmKHAgaW5zdGFuY2VvZiBMLmNEKXtvPXAueApvLnRvU3RyaW5nCm89byYmcC5y
-PT09Qy5Yan1lbHNlIG89ITEKaWYobylwLnI9Qy5XRH19fSwKbkcoKXt2YXIgcyxyLHEscCxvCmZvcihz
-PXRoaXMuZCxyPXMubGVuZ3RoLHE9MDtxPHMubGVuZ3RoO3MubGVuZ3RoPT09cnx8KDAsSC5saykocyks
-KytxKXtwPXNbcV0KaWYocCBpbnN0YW5jZW9mIEwudnQpcC5uRygpCmVsc2V7aWYocCBpbnN0YW5jZW9m
-IEwuY0Qpe289cC54Cm8udG9TdHJpbmcKbz1vJiZwLnI9PT1DLldEfWVsc2Ugbz0hMQppZihvKXAucj1D
-LlhqfX19LApMdCgpe3ZhciBzLHI9UC5GbCh0Lk4sdC5YKQpyLlk1KDAsInR5cGUiLCJkaXJlY3Rvcnki
-KQpyLlk1KDAsIm5hbWUiLHRoaXMuYSkKcz10aGlzLmQKcy50b1N0cmluZwpyLlk1KDAsInN1YnRyZWUi
-LEwuVkQocykpCnM9dGhpcy5jCmlmKHMhPW51bGwpci5ZNSgwLCJwYXRoIixzKQpyZXR1cm4gcn19Ckwu
-Y0QucHJvdG90eXBlPXsKTHQoKXt2YXIgcyxyPXRoaXMscT1QLkZsKHQuTix0LlgpCnEuWTUoMCwidHlw
-ZSIsImZpbGUiKQpxLlk1KDAsIm5hbWUiLHIuYSkKcz1yLmMKaWYocyE9bnVsbClxLlk1KDAsInBhdGgi
-LHMpCnM9ci5kCmlmKHMhPW51bGwpcS5ZNSgwLCJocmVmIixzKQpzPXIuZQppZihzIT1udWxsKXEuWTUo
-MCwiZWRpdENvdW50IixzKQpzPXIuZgppZihzIT1udWxsKXEuWTUoMCwid2FzRXhwbGljaXRseU9wdGVk
-T3V0IixzKQpzPXIucgppZihzIT1udWxsKXEuWTUoMCwibWlncmF0aW9uU3RhdHVzIixzLmEpCnM9ci54
-CmlmKHMhPW51bGwpcS5ZNSgwLCJtaWdyYXRpb25TdGF0dXNDYW5CZUNoYW5nZWQiLHMpCnJldHVybiBx
-fSwKZ0woKXtyZXR1cm4gdGhpcy5yfX0KTC5EOC5wcm90b3R5cGU9e30KTC5POS5wcm90b3R5cGU9ewp3
-KGEpe3JldHVybiB0aGlzLmJ9fQpMLkdiLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIHRoaXMuYn19ClIu
-TEwucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihbIm5vZGVJZCIsdGhpcy5iLCJraW5kIix0aGlz
-LmEuYV0sdC5OLHQuWCl9fQpSLk1ELnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0LmdwLmEoYSkuYT09
-PXRoaXMuYS5xKDAsImtpbmQiKX0sCiRTOjQ4fQpSLkg3LnByb3RvdHlwZT17CncoYSl7cmV0dXJuIHRo
-aXMuYn19Ck0ubEkucHJvdG90eXBlPXsKV08oYSxiKXt2YXIgcyxyLHE9dC5kNApNLllGKCJhYnNvbHV0
-ZSIsSC5RSShbYixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0scSkpCnM9dGhpcy5hCnM9cy5Z
-cihiKT4wJiYhcy5oSyhiKQppZihzKXJldHVybiBiCnM9RC5hYigpCnI9SC5RSShbcyxiLG51bGwsbnVs
-bCxudWxsLG51bGwsbnVsbCxudWxsXSxxKQpNLllGKCJqb2luIixyKQpyZXR1cm4gdGhpcy5JUChuZXcg
-SC51NihyLHQuZUopKX0sCnpmKGEpe3ZhciBzLHIscT1YLkNMKGEsdGhpcy5hKQpxLkl4KCkKcz1xLmQK
-cj1zLmxlbmd0aAppZihyPT09MCl7cz1xLmIKcmV0dXJuIHM9PW51bGw/Ii4iOnN9aWYocj09PTEpe3M9
-cS5iCnJldHVybiBzPT1udWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQpz
-PXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCnEuSXgoKQpyZXR1cm4g
-cS53KDApfSwKSVAoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoKdC5PLmEoYSkKZm9yKHM9YS4kdGks
-cj1zLkMoImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxxPWEuZ20oYSkscz1uZXcgSC5TTyhxLHIscy5D
-KCJTTzxjWC5FPiIpKSxyPXRoaXMuYSxwPSExLG89ITEsbj0iIjtzLkYoKTspe209cS5nbCgpCmlmKHIu
-aEsobSkmJm8pe2w9WC5DTChtLHIpCms9bi5jaGFyQ29kZUF0KDApPT0wP246bgpuPUMueEIuTmooayww
-LHIuU3AoaywhMCkpCmwuYj1uCmlmKHIuZHMobikpQy5ObS5ZNShsLmUsMCxyLmdtSSgpKQpuPSIiK2wu
-dygwKX1lbHNlIGlmKHIuWXIobSk+MCl7bz0hci5oSyhtKQpuPSIiK219ZWxzZXtqPW0ubGVuZ3RoCmlm
-KGohPT0wKXtpZigwPj1qKXJldHVybiBILk9IKG0sMCkKaj1yLlVkKG1bMF0pfWVsc2Ugaj0hMQppZigh
-ailpZihwKW4rPXIuZ21JKCkKbis9bX1wPXIuZHMobSl9cmV0dXJuIG4uY2hhckNvZGVBdCgwKT09MD9u
-Om59LApvNShhKXt2YXIgcwppZighdGhpcy55MyhhKSlyZXR1cm4gYQpzPVguQ0woYSx0aGlzLmEpCnMu
-clIoKQpyZXR1cm4gcy53KDApfSwKeTMoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrPXRoaXMuYSxqPWsu
-WXIoYSkKaWYoaiE9PTApe2lmKGs9PT0kLktrKCkpZm9yKHM9MDtzPGo7KytzKWlmKEMueEIuVyhhLHMp
-PT09NDcpcmV0dXJuITAKcj1qCnE9NDd9ZWxzZXtyPTAKcT1udWxsfWZvcihwPW5ldyBILnFqKGEpLmEs
-bz1wLmxlbmd0aCxzPXIsbj1udWxsO3M8bzsrK3Msbj1xLHE9bSl7bT1DLnhCLk8ocCxzKQppZihrLnI0
-KG0pKXtpZihrPT09JC5LaygpJiZtPT09NDcpcmV0dXJuITAKaWYocSE9bnVsbCYmay5yNChxKSlyZXR1
-cm4hMAppZihxPT09NDYpbD1uPT1udWxsfHxuPT09NDZ8fGsucjQobikKZWxzZSBsPSExCmlmKGwpcmV0
-dXJuITB9fWlmKHE9PW51bGwpcmV0dXJuITAKaWYoay5yNChxKSlyZXR1cm4hMAppZihxPT09NDYpaz1u
-PT1udWxsfHxrLnI0KG4pfHxuPT09NDYKZWxzZSBrPSExCmlmKGspcmV0dXJuITAKcmV0dXJuITF9LApI
-UChhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPSdVbmFibGUgdG8gZmluZCBhIHBhdGggdG8g
-IicKYj1sLldPKDAsYikKcz1sLmEKaWYocy5ZcihiKTw9MCYmcy5ZcihhKT4wKXJldHVybiBsLm81KGEp
-CmlmKHMuWXIoYSk8PTB8fHMuaEsoYSkpYT1sLldPKDAsYSkKaWYocy5ZcihhKTw9MCYmcy5ZcihiKT4w
-KXRocm93IEguYihYLkk3KGsrYSsnIiBmcm9tICInK2IrJyIuJykpCnI9WC5DTChiLHMpCnIuclIoKQpx
-PVguQ0woYSxzKQpxLnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihvIT09MCl7aWYoMD49bylyZXR1cm4g
-SC5PSChwLDApCnA9Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlmKHApcmV0dXJuIHEudygwKQpwPXIu
-YgpvPXEuYgppZihwIT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMuTmMocCxvKQplbHNlIHA9ITEKaWYo
-cClyZXR1cm4gcS53KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtuPXEuZApt
-PW4ubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkKcD1wWzBdCmlmKDA+PW0p
-cmV0dXJuIEguT0gobiwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxzZSBwPSExfWVsc2UgcD0hMQppZigh
-cClicmVhawpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpDLk5tLlc0KHEuZCwwKQpDLk5tLlc0
-KHEuZSwxKX1wPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigwPj1vKXJldHVybiBILk9IKHAsMCkK
-cD1KLlJNKHBbMF0sIi4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFguSTcoaythKyciIGZyb20g
-IicrYisnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIuZC5sZW5ndGgsIi4uIiwhMSxwKSkK
-Qy5ObS5ZNShxLmUsMCwiIikKQy5ObS5VRyhxLmUsMSxQLk84KHIuZC5sZW5ndGgscy5nbUkoKSwhMSxw
-KSkKcz1xLmQKcD1zLmxlbmd0aAppZihwPT09MClyZXR1cm4iLiIKaWYocD4xJiZKLlJNKEMuTm0uZ3Ja
-KHMpLCIuIikpe3M9cS5kCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1x
-LmUKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKQppZigwPj1zLmxlbmd0aCly
-ZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCkMuTm0uaShzLCIiKX1xLmI9IiIKcS5JeCgpCnJldHVybiBx
-LncoMCl9fQpNLnE3LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBILm4oYSkhPT0iIn0sCiRTOjZ9Ck0u
-Tm8ucHJvdG90eXBlPXsKJDEoYSl7SC5rKGEpCnJldHVybiBhPT1udWxsPyJudWxsIjonIicrYSsnIid9
-LAokUzo0OX0KQi5mdi5wcm90b3R5cGU9ewp4WihhKXt2YXIgcyxyPXRoaXMuWXIoYSkKaWYocj4wKXJl
-dHVybiBDLnhCLk5qKGEsMCxyKQppZih0aGlzLmhLKGEpKXtpZigwPj1hLmxlbmd0aClyZXR1cm4gSC5P
-SChhLDApCnM9YVswXX1lbHNlIHM9bnVsbApyZXR1cm4gc30sCk5jKGEsYil7cmV0dXJuIGE9PT1ifX0K
-WC5XRC5wcm90b3R5cGU9ewpJeCgpe3ZhciBzLHIscT10aGlzCndoaWxlKCEwKXtzPXEuZAppZighKHMu
-bGVuZ3RoIT09MCYmSi5STShDLk5tLmdyWihzKSwiIikpKWJyZWFrCnM9cS5kCmlmKDA+PXMubGVuZ3Ro
-KXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1xLmUKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0go
-cywtMSkKcy5wb3AoKX1zPXEuZQpyPXMubGVuZ3RoCmlmKHIhPT0wKUMuTm0uWTUocyxyLTEsIiIpfSwK
-clIoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5RSShbXSx0LnMpCmZvcihzPW0uZCxyPXMubGVu
-Z3RoLHE9MCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcCl7bz1zW3Bd
-Cm49Si5pYShvKQppZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIpKSlpZihuLkROKG8sIi4uIikpe249
-bC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0gobCwtMSkKbC5wb3AoKX1lbHNlICsr
-cX1lbHNlIEMuTm0uaShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVHKGwsMCxQLk84KHEsIi4uIiwhMSx0
-Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmkobCwiLiIpCm0uc25KKGwpCnM9bS5h
-Cm0uc1BoKFAuTzgobC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikpCnI9bS5iCmlmKHI9PW51bGx8fGwu
-bGVuZ3RoPT09MHx8IXMuZHMocikpQy5ObS5ZNShtLmUsMCwiIikKcj1tLmIKaWYociE9bnVsbCYmcz09
-PSQuS2soKSl7ci50b1N0cmluZwptLmI9SC55cyhyLCIvIiwiXFwiKX1tLkl4KCl9LAp3KGEpe3ZhciBz
-LHIscT10aGlzLHA9cS5iCnA9cCE9bnVsbD8iIitwOiIiCmZvcihzPTA7czxxLmQubGVuZ3RoOysrcyl7
-cj1xLmUKaWYocz49ci5sZW5ndGgpcmV0dXJuIEguT0gocixzKQpyPXArSC5FaihyW3NdKQpwPXEuZApp
-ZihzPj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnA9citILkVqKHBbc10pfXArPUguRWooQy5ObS5n
-cloocS5lKSkKcmV0dXJuIHAuY2hhckNvZGVBdCgwKT09MD9wOnB9LApzbkooYSl7dGhpcy5kPXQuRC5h
-KGEpfSwKc1BoKGEpe3RoaXMuZT10LkQuYShhKX19ClguZHYucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4i
-UGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9LAokaVJ6OjF9Ck8uekwucHJvdG90eXBlPXsKdyhhKXtyZXR1
-cm4gdGhpcy5nb2ModGhpcyl9fQpFLk9GLnByb3RvdHlwZT17ClVkKGEpe3JldHVybiBDLnhCLnRnKGEs
-Ii8iKX0sCnI0KGEpe3JldHVybiBhPT09NDd9LApkcyhhKXt2YXIgcz1hLmxlbmd0aApyZXR1cm4gcyE9
-PTAmJkMueEIuTyhhLHMtMSkhPT00N30sClNwKGEsYil7aWYoYS5sZW5ndGghPT0wJiZDLnhCLlcoYSww
-KT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXIoYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSyhh
-KXtyZXR1cm4hMX0sCmdvYygpe3JldHVybiJwb3NpeCJ9LApnbUkoKXtyZXR1cm4iLyJ9fQpGLnJ1LnBy
-b3RvdHlwZT17ClVkKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0KGEpe3JldHVybiBhPT09NDd9
-LApkcyhhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4hMQppZihDLnhCLk8oYSxzLTEpIT09
-NDcpcmV0dXJuITAKcmV0dXJuIEMueEIuVGMoYSwiOi8vIikmJnRoaXMuWXIoYSk9PT1zfSwKU3AoYSxi
-KXt2YXIgcyxyLHEscCxvPWEubGVuZ3RoCmlmKG89PT0wKXJldHVybiAwCmlmKEMueEIuVyhhLDApPT09
-NDcpcmV0dXJuIDEKZm9yKHM9MDtzPG87KytzKXtyPUMueEIuVyhhLHMpCmlmKHI9PT00NylyZXR1cm4g
-MAppZihyPT09NTgpe2lmKHM9PT0wKXJldHVybiAwCnE9Qy54Qi5YVShhLCIvIixDLnhCLlFpKGEsIi8v
-IixzKzEpP3MrMzpzKQppZihxPD0wKXJldHVybiBvCmlmKCFifHxvPHErMylyZXR1cm4gcQppZighQy54
-Qi5uKGEsImZpbGU6Ly8iKSlyZXR1cm4gcQppZighQi5ZdShhLHErMSkpcmV0dXJuIHEKcD1xKzMKcmV0
-dXJuIG89PT1wP3A6cSs0fX1yZXR1cm4gMH0sCllyKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEso
-YSl7cmV0dXJuIGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00N30sCmdvYygpe3JldHVybiJ1cmwi
-fSwKZ21JKCl7cmV0dXJuIi8ifX0KTC5JVi5wcm90b3R5cGU9ewpVZChhKXtyZXR1cm4gQy54Qi50Zyhh
-LCIvIil9LApyNChhKXtyZXR1cm4gYT09PTQ3fHxhPT09OTJ9LApkcyhhKXt2YXIgcz1hLmxlbmd0aApp
-ZihzPT09MClyZXR1cm4hMQpzPUMueEIuTyhhLHMtMSkKcmV0dXJuIShzPT09NDd8fHM9PT05Mil9LApT
-cChhLGIpe3ZhciBzLHIscT1hLmxlbmd0aAppZihxPT09MClyZXR1cm4gMApzPUMueEIuVyhhLDApCmlm
-KHM9PT00NylyZXR1cm4gMQppZihzPT09OTIpe2lmKHE8Mnx8Qy54Qi5XKGEsMSkhPT05MilyZXR1cm4g
-MQpyPUMueEIuWFUoYSwiXFwiLDIpCmlmKHI+MCl7cj1DLnhCLlhVKGEsIlxcIixyKzEpCmlmKHI+MCly
-ZXR1cm4gcn1yZXR1cm4gcX1pZihxPDMpcmV0dXJuIDAKaWYoIUIuT1MocykpcmV0dXJuIDAKaWYoQy54
-Qi5XKGEsMSkhPT01OClyZXR1cm4gMApxPUMueEIuVyhhLDIpCmlmKCEocT09PTQ3fHxxPT09OTIpKXJl
-dHVybiAwCnJldHVybiAzfSwKWXIoYSl7cmV0dXJuIHRoaXMuU3AoYSwhMSl9LApoSyhhKXtyZXR1cm4g
-dGhpcy5ZcihhKT09PTF9LApPdChhLGIpe3ZhciBzCmlmKGE9PT1iKXJldHVybiEwCmlmKGE9PT00Nyly
-ZXR1cm4gYj09PTkyCmlmKGE9PT05MilyZXR1cm4gYj09PTQ3CmlmKChhXmIpIT09MzIpcmV0dXJuITEK
-cz1hfDMyCnJldHVybiBzPj05NyYmczw9MTIyfSwKTmMoYSxiKXt2YXIgcyxyCmlmKGE9PT1iKXJldHVy
-biEwCnM9YS5sZW5ndGgKaWYocyE9PWIubGVuZ3RoKXJldHVybiExCmZvcihyPTA7cjxzOysrcilpZigh
-dGhpcy5PdChDLnhCLlcoYSxyKSxDLnhCLlcoYixyKSkpcmV0dXJuITEKcmV0dXJuITB9LApnb2MoKXty
-ZXR1cm4id2luZG93cyJ9LApnbUkoKXtyZXR1cm4iXFwifX07KGZ1bmN0aW9uIGFsaWFzZXMoKXt2YXIg
-cz1KLkd2LnByb3RvdHlwZQpzLlU9cy53CnM9Si5NRi5wcm90b3R5cGUKcy50PXMudwpzPVAuY1gucHJv
-dG90eXBlCnMuR0c9cy5ldgpzPVAuTWgucHJvdG90eXBlCnMueGI9cy53CnM9Vy5jdi5wcm90b3R5cGUK
-cy5EVz1zLnI2CnM9Vy5tNi5wcm90b3R5cGUKcy5qRj1zLkViCnM9UC5FNC5wcm90b3R5cGUKcy5Vcj1z
-LnEKcy5lND1zLlk1CnM9UC52Zy5wcm90b3R5cGUKcy5iaD1zLlk1fSkoKTsoZnVuY3Rpb24gaW5zdGFs
-bFRlYXJPZmZzKCl7dmFyIHM9aHVua0hlbHBlcnMuX3N0YXRpY18xLHI9aHVua0hlbHBlcnMuX3N0YXRp
-Y18wLHE9aHVua0hlbHBlcnMuaW5zdGFsbEluc3RhbmNlVGVhck9mZixwPWh1bmtIZWxwZXJzLmluc3Rh
-bGxTdGF0aWNUZWFyT2ZmLG89aHVua0hlbHBlcnMuX2luc3RhbmNlXzF1CnMoUCwiRVgiLCJaViIsNSkK
-cyhQLCJ5dCIsIm9BIiw1KQpzKFAsInFXIiwiQnoiLDUpCnIoUCwiVUkiLCJlTiIsMCkKcShQLlBmLnBy
-b3RvdHlwZSwiZ1lKIiwwLDEsbnVsbCxbIiQyIiwiJDEiXSxbIncwIiwicG0iXSw0MCwwLDApCnMoUCwi
-Q3kiLCJOQyIsNCkKcyhQLCJQSCIsIk10IiwyKQpwKFcsInBTIiw0LG51bGwsWyIkNCJdLFsicUQiXSwx
-NCwwKQpwKFcsIlY0Iiw0LG51bGwsWyIkNCJdLFsibloiXSwxNCwwKQpvKFAuQXMucHJvdG90eXBlLCJn
-dU0iLCJWIiwyKQpzKFAsImlHIiwid1kiLDUyKQpzKFAsIncwIiwiZFUiLDM1KQpzKEwsImlTIiwiaTYi
-LDEpfSkoKTsoZnVuY3Rpb24gaW5oZXJpdGFuY2UoKXt2YXIgcz1odW5rSGVscGVycy5taXhpbixyPWh1
-bmtIZWxwZXJzLmluaGVyaXQscT1odW5rSGVscGVycy5pbmhlcml0TWFueQpyKFAuTWgsbnVsbCkKcShQ
-Lk1oLFtILkZLLEouR3YsSi5tMSxQLmNYLEguZVQsUC5YUyxQLm5ZLEguYTcsUC5BbixILkZ1LEguSkIs
-SC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5UcCxILmY5LEgudGUsSC5icSxILlhPLEgua3Is
-UC5ZayxILnZoLEguTjYsSC5WUixILkVLLEguUGIsSC50USxILlNkLEguSmMsSC5HLFAuVzMsUC5paCxQ
-LkZ5LFAuR1YsUC5DdyxQLlBmLFAuRmUsUC52cyxQLk9NLFAucWgsUC5NTyxQLmtULFAueEksUC5tMCxQ
-LnBSLFAuYm4sUC5sbSxQLmxELFAuS1AsUC5sZixQLldZLFAuVWssUC5TaCxQLlJ3LFAuYnosUC5pUCxQ
-Lms1LFAuS1ksUC5DRCxQLmFFLFAuTjMsUC5jOCxQLlpkLFAuTSxQLkRuLFAuUEUsUC5VZixXLmlkLFcu
-RmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzksVy5kVyxXLm1rLFcuS28sUC5pSixQLkU0LFUu
-ZDIsVS5TZSxVLk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5tUSxMLlhBLEwuRDgsTC5POSxMLkdiLFIu
-TEwsUi5INyxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcShKLkd2LFtKLnlFLEoud2UsSi5NRixKLmpkLEou
-cUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5hZSxXLklCLFcubjcsVy5lYSxXLmJyLFcu
-U2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnEoSi5NRixbSi5pQyxKLmtkLEouYzVdKQpyKEouUG8sSi5q
-ZCkKcShKLnFJLFtKLmJVLEoua0RdKQpxKFAuY1gsW0guQlIsSC5iUSxILmkxLEguVTUsSC5BTSxILnU2
-LEguWFIsUC5tVyxILnVuXSkKcShILkJSLFtILlp5LEguUUNdKQpyKEgub2wsSC5aeSkKcihILlVxLEgu
-UUMpCnIoSC5qVixILlVxKQpxKFAuWFMsW0guYyxQLkV6LEguYXosSC52VixILkVxLFAuQzYsSC5rUyxQ
-LlVkLFAuRixQLkFULFAubXAsUC51YixQLmRzLFAubGosUC5VVixQLnAsTC5RV10pCnIoUC51eSxQLm5Z
-KQpxKFAudXksW0gudzIsVy53eixXLmU3XSkKcihILnFqLEgudzIpCnEoSC5iUSxbSC5hTCxILk1CLEgu
-aTVdKQpxKEguYUwsW0gubkgsSC5sSixQLmk4XSkKcihILnh5LEguaTEpCnEoUC5BbixbSC5NSCxILlNP
-LEguVTFdKQpyKEguZDUsSC5BTSkKcihQLlJVLFAuUG4pCnIoUC5HaixQLlJVKQpyKEguUEQsUC5HaikK
-cihILkxQLEguV1UpCnEoSC5UcCxbSC5FMSxILkF5LEgubGMsSC5kQyxILlZYLFAudGgsUC5oYSxQLldN
-LFAucFYsUC5qWixQLkI1LFAuT1IsUC55USxQLlZDLFAuUlosUC5jNixQLnFkLFcuQ3YsVy52TixXLlV2
-LFcuRWcsVy5FbyxXLldrLFcuSUEsUC5HRSxQLk43LFAudVEsUC5EVixQLlBDLFAuUVMsUC5ucCxQLlV0
-LFUuYU4sVS5iMCxMLmUsTC5vWixMLmpyLEwueTgsTC5IaSxMLkJULEwuUFksTC5MLEwuV3gsTC5IbyxM
-LmROLEwuSUMsTC54eixMLkJOLEwuZkMsTC5UbSxMLnVlLEwuR0gsTC5FRSxMLlZTLEwuVEQsTC5JZixM
-LnRCLEwubTIsUi5NRCxNLnE3LE0uTm9dKQpxKEguRTEsW0guQ2osSC53TixQLlNYLFAuR3MsUC5VNyxQ
-LnJhLFAudGksUC5XRixQLm4xLFAuY1MsUC5KVCxQLk1FLFAueTUsUC55SSxXLktTLFcuQTMsVy5mbSxQ
-LkUyLFAuamcsTC5xbF0pCnIoSC5XMCxQLkV6KQpxKEgubGMsW0guengsSC5yVF0pCnIoSC5rWSxQLkM2
-KQpyKFAuaWwsUC5ZaykKcShQLmlsLFtILk41LFAudXcsVy5jZixXLlN5XSkKcShQLm1XLFtILktXLFAu
-cTRdKQpyKEguTFosSC5FVCkKcShILkxaLFtILlJHLEguV0JdKQpyKEguVlAsSC5SRykKcihILkRnLEgu
-VlApCnIoSC5aRyxILldCKQpyKEguUGcsSC5aRykKcShILlBnLFtILnhqLEguZEUsSC5aQSxILmRULEgu
-UHEsSC5lRSxILlY2XSkKcihILmlNLEgua1MpCnEoSC5BeSxbUC5WcyxQLkZ0LFAueUgsUC5kYSxQLm9R
-LFAudnIsUC5ydCxQLktGLFAuWkwsUC5SVCxQLnJxLFAuUlcsUC51TyxQLkV2LFAuVnAsUC54cixQLk56
-LEwuVlcsTC5uVCxMLk5ZLEwuUUxdKQpyKFAuWmYsUC5QZikKcihQLkppLFAubTApCnIoUC5YdixQLnBS
-KQpyKFAuYjYsUC5YdikKcihQLlZqLFAuV1kpCnEoUC5VayxbUC5DVixQLlppLFAuYnldKQpyKFAud0ks
-UC5rVCkKcShQLndJLFtQLlU4LFAub2osUC5NeCxQLkUzLFAuR1ldKQpyKFAuSzgsUC5VZCkKcihQLnR1
-LFAuU2gpCnIoUC51NSxQLlppKQpxKFAuQVQsW1AuYkosUC5lWV0pCnIoUC5xZSxQLkRuKQpxKFcuRDAs
-W1cuS1YsVy53YSxXLks1LFcuQ21dKQpxKFcuS1YsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpxKFcuY3Ys
-W1cucUUsUC5oaV0pCnEoVy5xRSxbVy5HaCxXLmZZLFcuclosVy5RUCxXLmg0LFcuU04sVy5scCxXLlRi
-LFcuSXYsVy5XUCxXLnlZXSkKcihXLm9KLFcuTGUpCnIoVy5oSCxXLkF6KQpyKFcuVmIsVy5RRikKcihX
-LmZKLFcud2EpCnEoVy5lYSxbVy53NixXLmV3XSkKcihXLkFqLFcudzYpCnIoVy5yQixXLks3KQpyKFcu
-QkgsVy5yQikKcihXLnc0LFcuSUIpCnIoVy5vYSxXLlhXKQpyKFcucmgsVy5vYSkKcihXLmk3LFcuY2Yp
-CnIoUC5BcyxQLlZqKQpxKFAuQXMsW1cuSTQsUC5LZV0pCnIoVy5STyxQLnFoKQpyKFcuQ3EsVy5STykK
-cihXLnhDLFAuTU8pCnIoVy5jdCxXLm02KQpyKFAuQmYsUC5pSikKcShQLkU0LFtQLnI3LFAudmddKQpy
-KFAuVHosUC52ZykKcihQLm5kLFAuaGkpCnEoTC5EOCxbTC52dCxMLmNEXSkKcihCLmZ2LE8uekwpCnEo
-Qi5mdixbRS5PRixGLnJ1LEwuSVZdKQpzKEgudzIsSC5SZSkKcyhILlFDLFAubEQpCnMoSC5SRyxQLmxE
-KQpzKEguVlAsSC5TVSkKcyhILldCLFAubEQpCnMoSC5aRyxILlNVKQpzKFAublksUC5sRCkKcyhQLldZ
-LFAubGYpCnMoUC5SVSxQLktQKQpzKFAucFIsUC5sZikKcyhXLkxlLFcuaWQpCnMoVy5LNyxQLmxEKQpz
-KFcuckIsVy5HbSkKcyhXLlhXLFAubEQpCnMoVy5vYSxXLkdtKQpzKFAudmcsUC5sRCl9KSgpCnZhciB2
-PXt0eXBlVW5pdmVyc2U6e2VDOm5ldyBNYXAoKSx0Ujp7fSxlVDp7fSx0UFY6e30sc0VBOltdfSxtYW5n
-bGVkR2xvYmFsTmFtZXM6e0lqOiJpbnQiLENQOiJkb3VibGUiLFpaOiJudW0iLHFVOiJTdHJpbmciLGEy
-OiJib29sIixjODoiTnVsbCIsek06Ikxpc3QifSxtYW5nbGVkTmFtZXM6e30sdHlwZXM6WyJ+KCkiLCJ+
-KEFqKSIsInFVKHFVKSIsIn4oY3YpIiwiQChAKSIsIn4ofigpKSIsImEyKHFVKSIsImI4PH4+KEFqKSIs
-In4ocVUscVUpIiwifihNaD8sTWg/KSIsIkAoKSIsIn4ocVUsQCkiLCJ+KHh1PHFVPikiLCJjOChAKSIs
-ImEyKGN2LHFVLHFVLEpRKSIsImM4KCkiLCJhMihrRikiLCJjOChlYSkiLCJ+KG42LHFVLElqKSIsIn4o
-cVVbQF0pIiwiSWooSWosSWopIiwiQChxVSkiLCJ+KHFVLHFVPykiLCJuNihALEApIiwifihxVSxJaiki
-LCJhMihLVikiLCJaMDxxVSxxVT4oWjA8cVUscVU+LHFVKSIsIn4oZWEpIiwifihHRCxAKSIsInZzPEA+
-KEApIiwifihLVixLVj8pIiwifihALEApIiwiYzgoQCxAKSIsImEyKHh1PHFVPikiLCJjOChNaCxHeiki
-LCJNaD8oQCkiLCJUejxAPihAKSIsIkU0KEApIiwiTEwoQCkiLCJaMDxxVSxNaD8+KExMKSIsIn4oTWhb
-R3o/XSkiLCJjOCh+KCkpIiwiYzgoWjA8cVUsTWg/Pj8pIiwiYzgoTWgsQCkiLCJyNyhAKSIsIn4oSWos
-QCkiLCJ+KGV3KSIsInFVKFowPEAsQD4pIiwiYTIoSDcpIiwicVUocVU/KSIsIkAoQCxxVSkiLCJ+KEAp
-IiwiTWg/KE1oPykiLCJjOChALEd6KSJdLGludGVyY2VwdG9yc0J5VGFnOm51bGwsbGVhZlRhZ3M6bnVs
-bCxhcnJheVJ0aTpTeW1ib2woIiR0aSIpfQpILnhiKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3si
-aUMiOiJNRiIsImtkIjoiTUYiLCJjNSI6Ik1GIiwicngiOiJlYSIsImU1IjoiZWEiLCJZMCI6ImhpIiwi
-dHAiOiJoaSIsIkc4IjoiZXciLCJNciI6InFFIiwiZUwiOiJxRSIsIkkwIjoiS1YiLCJocyI6IktWIiwi
-WGciOiJRRiIsIm5yIjoiQWoiLCJ5NCI6Inc2IiwiYVAiOiJDbSIsInhjIjoibngiLCJrSiI6Im54Iiwi
-elUiOiJEZyIsImRmIjoiRVQiLCJ5RSI6eyJhMiI6W119LCJ3ZSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6
-W119LCJqZCI6eyJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwiUG8iOnsiamQiOlsiMSJd
-LCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibTEiOnsiQW4iOlsiMSJdfSwicUkiOnsi
-Q1AiOltdLCJaWiI6W119LCJiVSI6eyJDUCI6W10sIklqIjpbXSwiWloiOltdfSwia0QiOnsiQ1AiOltd
-LCJaWiI6W119LCJEciI6eyJxVSI6W10sInZYIjpbXX0sIkJSIjp7ImNYIjpbIjIiXX0sImVUIjp7IkFu
-IjpbIjIiXX0sIlp5Ijp7IkJSIjpbIjEiLCIyIl0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwib2wiOnsi
-WnkiOlsiMSIsIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJdLCJjWCI6WyIyIl0sImNYLkUiOiIy
-In0sIlVxIjp7ImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNY
-IjpbIjIiXX0sImpWIjp7IlVxIjpbIjEiLCIyIl0sImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIx
-IiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwibEQuRSI6IjIiLCJjWC5FIjoiMiJ9LCJjIjp7IlhT
-IjpbXX0sInFqIjp7ImxEIjpbIklqIl0sIlJlIjpbIklqIl0sInpNIjpbIklqIl0sImJRIjpbIklqIl0s
-ImNYIjpbIklqIl0sImxELkUiOiJJaiIsIlJlLkUiOiJJaiJ9LCJiUSI6eyJjWCI6WyIxIl19LCJhTCI6
-eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm5IIjp7ImFMIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIx
-Il0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsiMSJdfSwiaTEiOnsiY1giOlsiMiJd
-LCJjWC5FIjoiMiJ9LCJ4eSI6eyJpMSI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwiY1gu
-RSI6IjIifSwiTUgiOnsiQW4iOlsiMiJdfSwibEoiOnsiYUwiOlsiMiJdLCJiUSI6WyIyIl0sImNYIjpb
-IjIiXSwiYUwuRSI6IjIiLCJjWC5FIjoiMiJ9LCJVNSI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlNP
-Ijp7IkFuIjpbIjEiXX0sIkFNIjp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiZDUiOnsiQU0iOlsiMSJd
-LCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiVTEiOnsiQW4iOlsiMSJdfSwiTUIiOnsi
-YlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkZ1Ijp7IkFuIjpbIjEiXX0sInU2Ijp7ImNY
-IjpbIjEiXSwiY1guRSI6IjEifSwiSkIiOnsiQW4iOlsiMSJdfSwidzIiOnsibEQiOlsiMSJdLCJSZSI6
-WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119LCJQRCI6
-eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIxIiwiMiJd
-LCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEiLCIyIl0s
-IlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkxJIjp7InZRIjpbXX0s
-IlcwIjp7IkV6IjpbXSwiWFMiOltdfSwiYXoiOnsiWFMiOltdfSwidlYiOnsiWFMiOltdfSwidGUiOnsi
-UnoiOltdfSwiWE8iOnsiR3oiOltdfSwiVHAiOnsiRUgiOltdfSwiQXkiOnsiRUgiOltdfSwiRTEiOnsi
-RUgiOltdfSwibGMiOnsiRUgiOltdfSwiengiOnsiRUgiOltdfSwiclQiOnsiRUgiOltdfSwiRXEiOnsi
-WFMiOltdfSwia1kiOnsiWFMiOltdfSwiTjUiOnsiWWsiOlsiMSIsIjIiXSwiRm8iOlsiMSIsIjIiXSwi
-WjAiOlsiMSIsIjIiXSwiWWsuSyI6IjEiLCJZay5WIjoiMiJ9LCJpNSI6eyJiUSI6WyIxIl0sImNYIjpb
-IjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4iOlsiMSJdfSwiVlIiOnsid0wiOltdLCJ2WCI6W119LCJF
-SyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7ImNYIjpbImliIl0sImNYLkUiOiJpYiJ9LCJQYiI6eyJB
-biI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwidW4iOnsiY1giOlsiT2QiXSwiY1guRSI6Ik9kIn0sIlNk
-Ijp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6W119LCJMWiI6eyJYaiI6WyIxIl0sIkVUIjpbXSwiQVMi
-OltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoiOlsiQ1AiXSwiek0iOlsiQ1AiXSwiRVQiOltdLCJiUSI6
-WyJDUCJdLCJBUyI6W10sImNYIjpbIkNQIl0sIlNVIjpbIkNQIl0sImxELkUiOiJDUCJ9LCJQZyI6eyJs
-RCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpb
-XSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXX0sInhqIjp7ImxEIjpbIklqIl0sIlhqIjpbIklqIl0sInpN
-IjpbIklqIl0sIkVUIjpbXSwiYlEiOlsiSWoiXSwiQVMiOltdLCJjWCI6WyJJaiJdLCJTVSI6WyJJaiJd
-LCJsRC5FIjoiSWoifSwiZEUiOnsibEQiOlsiSWoiXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwiRVQi
-OltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJaiJ9
-LCJaQSI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklq
-Il0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXSwibEQuRSI6IklqIn0sImRUIjp7ImxEIjpb
+QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
+QUFBQUZGRkZGRkZGRkZGRkZGRkZHR0dHR0dHR0dHR0dHR0dHSEhISEhISEhISEhISEhISEhISEhISEhI
+SEhISUhISEpFRUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQktDQ0NDQ0NDQ0NDQ0NEQ0xPTk5O
+TUVFRUVFRUVFRUVFIixzKSYzMQpoPWk8PTMyP3MmNjE2OTQ+Pj5xOihzJjYzfGg8PDYpPj4+MAppPUMu
+eEIuVygiIFx4MDAwOlhFQ0NDQ0NOOmxEYiBceDAwMDpYRUNDQ0NDTnZsRGIgXHgwMDA6WEVDQ0NDQ046
+bERiIEFBQUFBXHgwMFx4MDBceDAwXHgwMFx4MDBBQUFBQTAwMDAwQUFBQUE6Ojo6OkFBQUFBR0cwMDBB
+QUFBQTAwS0tLQUFBQUFHOjo6OkFBQUFBOklJSUlBQUFBQTAwMFx4ODAwQUFBQUFceDAwXHgwMFx4MDBc
+eDAwIEFBQUFBIixpK3EpCmlmKGk9PT0wKXtnLmErPUguTHcoaCkKaWYoZj09PWMpYnJlYWsgJGxhYmVs
+MCQwCmJyZWFrfWVsc2UgaWYoKGkmMSkhPT0wKXtpZihyKXN3aXRjaChpKXtjYXNlIDY5OmNhc2UgNjc6
+Zy5hKz1ILkx3KGopCmJyZWFrCmNhc2UgNjU6Zy5hKz1ILkx3KGopOy0tZgpicmVhawpkZWZhdWx0OnA9
+Zy5hKz1ILkx3KGopCmcuYT1wK0guTHcoaikKYnJlYWt9ZWxzZXtrLmI9aQprLmM9Zi0xCnJldHVybiIi
+fWk9MH1pZihmPT09YylicmVhayAkbGFiZWwwJDAKbz1mKzEKaWYoZjwwfHxmPj1lKXJldHVybiBILk9I
+KGEsZikKcz1hW2ZdfW89ZisxCmlmKGY8MHx8Zj49ZSlyZXR1cm4gSC5PSChhLGYpCnM9YVtmXQppZihz
+PDEyOCl7d2hpbGUoITApe2lmKCEobzxjKSl7bj1jCmJyZWFrfW09bysxCmlmKG88MHx8bz49ZSlyZXR1
+cm4gSC5PSChhLG8pCnM9YVtvXQppZihzPj0xMjgpe249bS0xCm89bQpicmVha31vPW19aWYobi1mPDIw
+KWZvcihsPWY7bDxuOysrbCl7aWYobD49ZSlyZXR1cm4gSC5PSChhLGwpCmcuYSs9SC5MdyhhW2xdKX1l
+bHNlIGcuYSs9UC5ITShhLGYsbikKaWYobj09PWMpYnJlYWsgJGxhYmVsMCQwCmY9b31lbHNlIGY9b31p
+ZihkJiZpPjMyKWlmKHIpZy5hKz1ILkx3KGopCmVsc2V7ay5iPTc3CmsuYz1jCnJldHVybiIifWsuYj1p
+CmsuYz1oCmU9Zy5hCnJldHVybiBlLmNoYXJDb2RlQXQoMCk9PTA/ZTplfX0KUC5XRi5wcm90b3R5cGU9
+ewokMihhLGIpe3ZhciBzLHIscQp0LmZvLmEoYSkKcz10aGlzLmIKcj10aGlzLmEKcT1zLmErPXIuYQpx
+Kz1hLmEKcy5hPXEKcy5hPXErIjogIgpzLmErPVAuaGwoYikKci5hPSIsICJ9LAokUzoyOH0KUC5pUC5w
+cm90b3R5cGU9ewpETihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBQ
+LmlQJiZ0aGlzLmE9PT1iLmEmJiEwfSwKZ2lPKGEpe3ZhciBzPXRoaXMuYQpyZXR1cm4oc15DLmpuLndH
+KHMsMzApKSYxMDczNzQxODIzfSwKdyhhKXt2YXIgcz10aGlzLHI9UC5HcShILnRKKHMpKSxxPVAuaDAo
+SC5OUyhzKSkscD1QLmgwKEguakEocykpLG89UC5oMChILklYKHMpKSxuPVAuaDAoSC5jaChzKSksbT1Q
+LmgwKEguSmQocykpLGw9UC5WeChILm8xKHMpKSxrPXIrIi0iK3ErIi0iK3ArIiAiK28rIjoiK24rIjoi
+K20rIi4iK2wKcmV0dXJuIGt9fQpQLlhTLnByb3RvdHlwZT17CmdJSSgpe3JldHVybiBILnRzKHRoaXMu
+JHRocm93bkpzRXJyb3IpfX0KUC5DNi5wcm90b3R5cGU9ewp3KGEpe3ZhciBzPXRoaXMuYQppZihzIT1u
+dWxsKXJldHVybiJBc3NlcnRpb24gZmFpbGVkOiAiK1AuaGwocykKcmV0dXJuIkFzc2VydGlvbiBmYWls
+ZWQifX0KUC5Fei5wcm90b3R5cGU9e30KUC5GLnByb3RvdHlwZT17CncoYSl7cmV0dXJuIlRocm93IG9m
+IG51bGwuIn19ClAuQVQucHJvdG90eXBlPXsKZ1ooKXtyZXR1cm4iSW52YWxpZCBhcmd1bWVudCIrKCF0
+aGlzLmE/IihzKSI6IiIpfSwKZ3UoKXtyZXR1cm4iIn0sCncoYSl7dmFyIHMscixxPXRoaXMscD1xLmMs
+bz1wPT1udWxsPyIiOiIgKCIrcCsiKSIsbj1xLmQsbT1uPT1udWxsPyIiOiI6ICIrSC5FaihuKSxsPXEu
+Z1ooKStvK20KaWYoIXEuYSlyZXR1cm4gbApzPXEuZ3UoKQpyPVAuaGwocS5iKQpyZXR1cm4gbCtzKyI6
+ICIrcn19ClAuYkoucHJvdG90eXBlPXsKZ1ooKXtyZXR1cm4iUmFuZ2VFcnJvciJ9LApndSgpe3ZhciBz
+LHI9dGhpcy5lLHE9dGhpcy5mCmlmKHI9PW51bGwpcz1xIT1udWxsPyI6IE5vdCBsZXNzIHRoYW4gb3Ig
+ZXF1YWwgdG8gIitILkVqKHEpOiIiCmVsc2UgaWYocT09bnVsbClzPSI6IE5vdCBncmVhdGVyIHRoYW4g
+b3IgZXF1YWwgdG8gIitILkVqKHIpCmVsc2UgaWYocT5yKXM9IjogTm90IGluIGluY2x1c2l2ZSByYW5n
+ZSAiK0guRWoocikrIi4uIitILkVqKHEpCmVsc2Ugcz1xPHI/IjogVmFsaWQgdmFsdWUgcmFuZ2UgaXMg
+ZW1wdHkiOiI6IE9ubHkgdmFsaWQgdmFsdWUgaXMgIitILkVqKHIpCnJldHVybiBzfX0KUC5lWS5wcm90
+b3R5cGU9ewpnWigpe3JldHVybiJSYW5nZUVycm9yIn0sCmd1KCl7aWYoSC5JWih0aGlzLmIpPDApcmV0
+dXJuIjogaW5kZXggbXVzdCBub3QgYmUgbmVnYXRpdmUiCnZhciBzPXRoaXMuZgppZihzPT09MClyZXR1
+cm4iOiBubyBpbmRpY2VzIGFyZSB2YWxpZCIKcmV0dXJuIjogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhh
+biAiK3N9LApnQShhKXtyZXR1cm4gdGhpcy5mfX0KUC5tcC5wcm90b3R5cGU9ewp3KGEpe3ZhciBzLHIs
+cSxwLG8sbixtLGwsaz10aGlzLGo9e30saT1uZXcgUC5NKCIiKQpqLmE9IiIKcz1rLmMKZm9yKHI9cy5s
+ZW5ndGgscT0wLHA9IiIsbz0iIjtxPHI7KytxLG89IiwgIil7bj1zW3FdCmkuYT1wK28KcD1pLmErPVAu
+aGwobikKai5hPSIsICJ9ay5kLksoMCxuZXcgUC5XRihqLGkpKQptPVAuaGwoay5hKQpsPWkudygwKQpy
+PSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9kIG5vdCBmb3VuZDogJyIray5iLmErIidcblJlY2VpdmVy
+OiAiK20rIlxuQXJndW1lbnRzOiBbIitsKyJdIgpyZXR1cm4gcn19ClAudWIucHJvdG90eXBlPXsKdyhh
+KXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBlPXsK
+dyhhKXt2YXIgcz0iVW5pbXBsZW1lbnRlZEVycm9yOiAiK3RoaXMuYQpyZXR1cm4gc319ClAubGoucHJv
+dG90eXBlPXsKdyhhKXtyZXR1cm4iQmFkIHN0YXRlOiAiK3RoaXMuYX19ClAuVVYucHJvdG90eXBlPXsK
+dyhhKXt2YXIgcz10aGlzLmEKaWYocz09bnVsbClyZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24g
+ZHVyaW5nIGl0ZXJhdGlvbi4iCnJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRl
+cmF0aW9uOiAiK1AuaGwocykrIi4ifX0KUC5rNS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiJPdXQgb2Yg
+TWVtb3J5In0sCmdJSSgpe3JldHVybiBudWxsfSwKJGlYUzoxfQpQLktZLnByb3RvdHlwZT17CncoYSl7
+cmV0dXJuIlN0YWNrIE92ZXJmbG93In0sCmdJSSgpe3JldHVybiBudWxsfSwKJGlYUzoxfQpQLnAucHJv
+dG90eXBlPXsKdyhhKXt2YXIgcz0iUmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJyIrdGhpcy5hKyInIGR1
+cmluZyBpdHMgaW5pdGlhbGl6YXRpb24iCnJldHVybiBzfX0KUC5DRC5wcm90b3R5cGU9ewp3KGEpe3Jl
+dHVybiJFeGNlcHRpb246ICIrdGhpcy5hfSwKJGlSejoxfQpQLmFFLnByb3RvdHlwZT17CncoYSl7dmFy
+IHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGc9dGhpcy5hLGY9IiIhPT1nPyJGb3JtYXRFeGNlcHRpb246
+ICIrZzoiRm9ybWF0RXhjZXB0aW9uIixlPXRoaXMuYyxkPXRoaXMuYgppZih0eXBlb2YgZD09InN0cmlu
+ZyIpe2lmKGUhPW51bGwpcz1lPDB8fGU+ZC5sZW5ndGgKZWxzZSBzPSExCmlmKHMpZT1udWxsCmlmKGU9
+PW51bGwpe2lmKGQubGVuZ3RoPjc4KWQ9Qy54Qi5OaihkLDAsNzUpKyIuLi4iCnJldHVybiBmKyJcbiIr
+ZH1mb3Iocj0xLHE9MCxwPSExLG89MDtvPGU7KytvKXtuPUMueEIuVyhkLG8pCmlmKG49PT0xMCl7aWYo
+cSE9PW98fCFwKSsrcgpxPW8rMQpwPSExfWVsc2UgaWYobj09PTEzKXsrK3IKcT1vKzEKcD0hMH19Zj1y
+PjE/ZisoIiAoYXQgbGluZSAiK3IrIiwgY2hhcmFjdGVyICIrKGUtcSsxKSsiKVxuIik6ZisoIiAoYXQg
+Y2hhcmFjdGVyICIrKGUrMSkrIilcbiIpCm09ZC5sZW5ndGgKZm9yKG89ZTtvPG07KytvKXtuPUMueEIu
+TyhkLG8pCmlmKG49PT0xMHx8bj09PTEzKXttPW8KYnJlYWt9fWlmKG0tcT43OClpZihlLXE8NzUpe2w9
+cSs3NQprPXEKaj0iIgppPSIuLi4ifWVsc2V7aWYobS1lPDc1KXtrPW0tNzUKbD1tCmk9IiJ9ZWxzZXtr
+PWUtMzYKbD1lKzM2Cmk9Ii4uLiJ9aj0iLi4uIn1lbHNle2w9bQprPXEKaj0iIgppPSIifWg9Qy54Qi5O
+aihkLGssbCkKcmV0dXJuIGYraitoK2krIlxuIitDLnhCLlQoIiAiLGUtaytqLmxlbmd0aCkrIl5cbiJ9
+ZWxzZSByZXR1cm4gZSE9bnVsbD9mKygiIChhdCBvZmZzZXQgIitILkVqKGUpKyIpIik6Zn0sCiRpUno6
+MX0KUC5jWC5wcm90b3R5cGU9ewpkcihhLGIpe3JldHVybiBILkdKKHRoaXMsSC5MaCh0aGlzKS5DKCJj
+WC5FIiksYil9LApFMihhLGIsYyl7dmFyIHM9SC5MaCh0aGlzKQpyZXR1cm4gSC5LMSh0aGlzLHMuS3Eo
+YykuQygiMShjWC5FKSIpLmEoYikscy5DKCJjWC5FIiksYyl9LApldihhLGIpe3ZhciBzPUguTGgodGhp
+cykKcmV0dXJuIG5ldyBILlU1KHRoaXMscy5DKCJhMihjWC5FKSIpLmEoYikscy5DKCJVNTxjWC5FPiIp
+KX0sCnR0KGEsYil7cmV0dXJuIFAuWTEodGhpcyxiLEguTGgodGhpcykuQygiY1guRSIpKX0sCmJyKGEp
+e3JldHVybiB0aGlzLnR0KGEsITApfSwKZ0EoYSl7dmFyIHMscj10aGlzLmdtKHRoaXMpCmZvcihzPTA7
+ci5GKCk7KSsrcwpyZXR1cm4gc30sCmdsMChhKXtyZXR1cm4hdGhpcy5nbSh0aGlzKS5GKCl9LApnb3Io
+YSl7cmV0dXJuIXRoaXMuZ2wwKHRoaXMpfSwKZVIoYSxiKXtyZXR1cm4gSC5iSyh0aGlzLGIsSC5MaCh0
+aGlzKS5DKCJjWC5FIikpfSwKZ3I4KGEpe3ZhciBzLHI9dGhpcy5nbSh0aGlzKQppZighci5GKCkpdGhy
+b3cgSC5iKEguV3AoKSkKcz1yLmdsKCkKaWYoci5GKCkpdGhyb3cgSC5iKEguQW0oKSkKcmV0dXJuIHN9
+LApFKGEsYil7dmFyIHMscixxClAuazEoYiwiaW5kZXgiKQpmb3Iocz10aGlzLmdtKHRoaXMpLHI9MDtz
+LkYoKTspe3E9cy5nbCgpCmlmKGI9PT1yKXJldHVybiBxOysrcn10aHJvdyBILmIoUC5DZihiLHRoaXMs
+ImluZGV4IixudWxsLHIpKX0sCncoYSl7cmV0dXJuIFAuRVAodGhpcywiKCIsIikiKX19ClAuQW4ucHJv
+dG90eXBlPXt9ClAuTjMucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4iTWFwRW50cnkoIitILkVqKHRoaXMu
+YSkrIjogIitILkVqKHRoaXMuYikrIikifX0KUC5jOC5wcm90b3R5cGU9ewpnaU8oYSl7cmV0dXJuIFAu
+TWgucHJvdG90eXBlLmdpTy5jYWxsKHRoaXMsdGhpcyl9LAp3KGEpe3JldHVybiJudWxsIn19ClAuTWgu
+cHJvdG90eXBlPXskaU1oOjEsCkROKGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKZ2lPKGEpe3JldHVybiBI
+LmVRKHRoaXMpfSwKdyhhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5saCh0aGlzKSsiJyJ9LAplNyhh
+LGIpe3Quby5hKGIpCnRocm93IEguYihQLmxyKHRoaXMsYi5nV2EoKSxiLmduZCgpLGIuZ1ZtKCkpKX0s
+CnRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudyh0aGlzKX19ClAuWmQucHJvdG90eXBlPXsKdyhhKXtyZXR1
+cm4iIn0sCiRpR3o6MX0KUC5NLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwK
+dyhhKXt2YXIgcz10aGlzLmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAokaUJMOjF9ClAu
+bjEucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEscAp0LmNrLmEoYSkKSC5uKGIpCnM9Qy54Qi5P
+WShiLCI9IikKaWYocz09PS0xKXtpZihiIT09IiIpYS5ZNSgwLFAua3UoYiwwLGIubGVuZ3RoLHRoaXMu
+YSwhMCksIiIpfWVsc2UgaWYocyE9PTApe3I9Qy54Qi5OaihiLDAscykKcT1DLnhCLnluKGIscysxKQpw
+PXRoaXMuYQphLlk1KDAsUC5rdShyLDAsci5sZW5ndGgscCwhMCksUC5rdShxLDAscS5sZW5ndGgscCwh
+MCkpfXJldHVybiBhfSwKJFM6MjZ9ClAuY1MucHJvdG90eXBlPXsKJDIoYSxiKXt0aHJvdyBILmIoUC5y
+cigiSWxsZWdhbCBJUHY0IGFkZHJlc3MsICIrYSx0aGlzLmEsYikpfSwKJFM6MjR9ClAuVkMucHJvdG90
+eXBlPXsKJDIoYSxiKXt0aHJvdyBILmIoUC5ycigiSWxsZWdhbCBJUHY2IGFkZHJlc3MsICIrYSx0aGlz
+LmEsYikpfSwKJDEoYSl7cmV0dXJuIHRoaXMuJDIoYSxudWxsKX0sCiRTOjE5fQpQLkpULnByb3RvdHlw
+ZT17CiQyKGEsYil7dmFyIHMKaWYoYi1hPjQpdGhpcy5hLiQyKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkg
+Y29udGFpbiBhIG1heGltdW0gb2YgNCBoZXggZGlnaXRzIixhKQpzPVAuUUEoQy54Qi5Oaih0aGlzLmIs
+YSxiKSwxNikKaWYoczwwfHxzPjY1NTM1KXRoaXMuYS4kMigiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhl
+IHJhbmdlIG9mIGAweDAuLjB4RkZGRmAiLGEpCnJldHVybiBzfSwKJFM6MjB9ClAuRG4ucHJvdG90eXBl
+PXsKZ25EKCl7dmFyIHMscixxLHA9dGhpcyxvPXAueAppZihvPT1udWxsKXtvPXAuYQpzPW8ubGVuZ3Ro
+IT09MD8iIitvKyI6IjoiIgpyPXAuYwpxPXI9PW51bGwKaWYoIXF8fG89PT0iZmlsZSIpe289cysiLy8i
+CnM9cC5iCmlmKHMubGVuZ3RoIT09MClvPW8rcysiQCIKaWYoIXEpbys9cgpzPXAuZAppZihzIT1udWxs
+KW89bysiOiIrSC5FaihzKX1lbHNlIG89cwpvKz1wLmUKcz1wLmYKaWYocyE9bnVsbClvPW8rIj8iK3MK
+cz1wLnIKaWYocyE9bnVsbClvPW8rIiMiK3MKbz1vLmNoYXJDb2RlQXQoMCk9PTA/bzpvCmlmKHAueD09
+bnVsbClwLng9bwplbHNlIG89SC52KEguaigiX3RleHQiKSl9cmV0dXJuIG99LApnRmooKXt2YXIgcyxy
+PXRoaXMscT1yLnkKaWYocT09bnVsbCl7cz1yLmUKaWYocy5sZW5ndGghPT0wJiZDLnhCLlcocywwKT09
+PTQ3KXM9Qy54Qi55bihzLDEpCnE9cy5sZW5ndGg9PT0wP0MueEQ6UC5BRihuZXcgSC5sSihILlFJKHMu
+c3BsaXQoIi8iKSx0LnMpLHQuZE8uYShQLlBIKCkpLHQuZG8pLHQuTikKaWYoci55PT1udWxsKXIuc0tw
+KHEpCmVsc2UgcT1ILnYoSC5qKCJwYXRoU2VnbWVudHMiKSl9cmV0dXJuIHF9LApnaU8oYSl7dmFyIHM9
+dGhpcyxyPXMuegppZihyPT1udWxsKXtyPUMueEIuZ2lPKHMuZ25EKCkpCmlmKHMuej09bnVsbClzLno9
+cgplbHNlIHI9SC52KEguaigiaGFzaENvZGUiKSl9cmV0dXJuIHJ9LApnaFkoKXt2YXIgcz10aGlzLHI9
+cy5RCmlmKHI9PW51bGwpe3I9cy5mCnI9bmV3IFAuR2ooUC5XWChyPT1udWxsPyIiOnIpLHQuZHcpCmlm
+KHMuUT09bnVsbClzLnNOTShyKQplbHNlIHI9SC52KEguaigicXVlcnlQYXJhbWV0ZXJzIikpfXJldHVy
+biByfSwKZ2t1KCl7cmV0dXJuIHRoaXMuYn0sCmdKZihhKXt2YXIgcz10aGlzLmMKaWYocz09bnVsbCly
+ZXR1cm4iIgppZihDLnhCLm4ocywiWyIpKXJldHVybiBDLnhCLk5qKHMsMSxzLmxlbmd0aC0xKQpyZXR1
+cm4gc30sCmd0cChhKXt2YXIgcz10aGlzLmQKcmV0dXJuIHM9PW51bGw/UC53Syh0aGlzLmEpOnN9LApn
+dFAoKXt2YXIgcz10aGlzLmYKcmV0dXJuIHM9PW51bGw/IiI6c30sCmdLYSgpe3ZhciBzPXRoaXMucgpy
+ZXR1cm4gcz09bnVsbD8iIjpzfSwKaEIoYSl7dmFyIHM9dGhpcy5hCmlmKGEubGVuZ3RoIT09cy5sZW5n
+dGgpcmV0dXJuITEKcmV0dXJuIFAuTlIoYSxzKX0sCm5tKGEsYil7dmFyIHMscixxLHAsbyxuLG0sbCxr
+LGo9dGhpcwp0LmM5LmEoYikKcz1qLmEKcj1zPT09ImZpbGUiCnE9ai5iCnA9ai5kCm89ai5jCmlmKCEo
+byE9bnVsbCkpbz1xLmxlbmd0aCE9PTB8fHAhPW51bGx8fHI/IiI6bnVsbApuPWouZQppZighciltPW8h
+PW51bGwmJm4ubGVuZ3RoIT09MAplbHNlIG09ITAKaWYobSYmIUMueEIubihuLCIvIikpbj0iLyIrbgps
+PW4Kaz1QLmxlKG51bGwsMCwwLGIpCnJldHVybiBuZXcgUC5EbihzLHEsbyxwLGwsayxqLnIpfSwKSmgo
+YSxiKXt2YXIgcyxyLHEscCxvLG4KZm9yKHM9MCxyPTA7Qy54Qi5RaShiLCIuLi8iLHIpOyl7cis9Mzsr
+K3N9cT1DLnhCLmNuKGEsIi8iKQp3aGlsZSghMCl7aWYoIShxPjAmJnM+MCkpYnJlYWsKcD1DLnhCLlBr
+KGEsIi8iLHEtMSkKaWYocDwwKWJyZWFrCm89cS1wCm49byE9PTIKaWYoIW58fG89PT0zKWlmKEMueEIu
+TyhhLHArMSk9PT00NiluPSFufHxDLnhCLk8oYSxwKzIpPT09NDYKZWxzZSBuPSExCmVsc2Ugbj0hMQpp
+ZihuKWJyZWFrOy0tcwpxPXB9cmV0dXJuIEMueEIuaTcoYSxxKzEsbnVsbCxDLnhCLnluKGIsci0zKnMp
+KX0sClpJKGEpe3JldHVybiB0aGlzLm1TKFAuaEsoYSkpfSwKbVMoYSl7dmFyIHMscixxLHAsbyxuLG0s
+bCxrLGosaT10aGlzLGg9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3M9YS5nRmkoKQppZihhLmdj
+aigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpwPWEuZ3hBKCk/YS5ndHAoYSk6aH1lbHNle3A9aApxPXAK
+cj0iIn1vPVAueGUoYS5nSWkoYSkpCm49YS5nUUQoKT9hLmd0UCgpOmh9ZWxzZXtzPWkuYQppZihhLmdj
+aigpKXtyPWEuZ2t1KCkKcT1hLmdKZihhKQpwPVAud0IoYS5neEEoKT9hLmd0cChhKTpoLHMpCm89UC54
+ZShhLmdJaShhKSkKbj1hLmdRRCgpP2EuZ3RQKCk6aH1lbHNle3I9aS5iCnE9aS5jCnA9aS5kCm89aS5l
+CmlmKGEuZ0lpKGEpPT09IiIpbj1hLmdRRCgpP2EuZ3RQKCk6aS5mCmVsc2V7bT1QLnVqKGksbykKaWYo
+bT4wKXtsPUMueEIuTmoobywwLG0pCm89YS5ndFQoKT9sK1AueGUoYS5nSWkoYSkpOmwrUC54ZShpLkpo
+KEMueEIueW4obyxsLmxlbmd0aCksYS5nSWkoYSkpKX1lbHNlIGlmKGEuZ3RUKCkpbz1QLnhlKGEuZ0lp
+KGEpKQplbHNlIGlmKG8ubGVuZ3RoPT09MClpZihxPT1udWxsKW89cy5sZW5ndGg9PT0wP2EuZ0lpKGEp
+OlAueGUoYS5nSWkoYSkpCmVsc2Ugbz1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtrPWkuSmgobyxhLmdJ
+aShhKSkKaj1zLmxlbmd0aD09PTAKaWYoIWp8fHEhPW51bGx8fEMueEIubihvLCIvIikpbz1QLnhlKGsp
+CmVsc2Ugbz1QLndGKGssIWp8fHEhPW51bGwpfW49YS5nUUQoKT9hLmd0UCgpOmh9fX1yZXR1cm4gbmV3
+IFAuRG4ocyxyLHEscCxvLG4sYS5nWjgoKT9hLmdLYSgpOmgpfSwKZ2NqKCl7cmV0dXJuIHRoaXMuYyE9
+bnVsbH0sCmd4QSgpe3JldHVybiB0aGlzLmQhPW51bGx9LApnUUQoKXtyZXR1cm4gdGhpcy5mIT1udWxs
+fSwKZ1o4KCl7cmV0dXJuIHRoaXMuciE9bnVsbH0sCmd0VCgpe3JldHVybiBDLnhCLm4odGhpcy5lLCIv
+Iil9LAp0NCgpe3ZhciBzLHI9dGhpcyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5i
+KFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK3ErIiBVUkkiKSkKcT1yLmYK
+aWYoKHE9PW51bGw/IiI6cSkhPT0iIil0aHJvdyBILmIoUC5MNCh1LmkpKQpxPXIucgppZigocT09bnVs
+bD8iIjpxKSE9PSIiKXRocm93IEguYihQLkw0KHUubCkpCnE9JC53USgpCmlmKHEpcT1QLm1uKHIpCmVs
+c2V7aWYoci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgudihQLkw0KHUuaikpCnM9ci5nRmooKQpQLmtF
+KHMsITEpCnE9UC5sKEMueEIubihyLmUsIi8iKT8iIisiLyI6IiIscywiLyIpCnE9cS5jaGFyQ29kZUF0
+KDApPT0wP3E6cX1yZXR1cm4gcX0sCncoYSl7cmV0dXJuIHRoaXMuZ25EKCl9LApETihhLGIpe3ZhciBz
+LHIscT10aGlzCmlmKGI9PW51bGwpcmV0dXJuITEKaWYocT09PWIpcmV0dXJuITAKaWYodC5kRC5iKGIp
+KWlmKHEuYT09PWIuZ0ZpKCkpaWYocS5jIT1udWxsPT09Yi5nY2ooKSlpZihxLmI9PT1iLmdrdSgpKWlm
+KHEuZ0pmKHEpPT09Yi5nSmYoYikpaWYocS5ndHAocSk9PT1iLmd0cChiKSlpZihxLmU9PT1iLmdJaShi
+KSl7cz1xLmYKcj1zPT1udWxsCmlmKCFyPT09Yi5nUUQoKSl7aWYocilzPSIiCmlmKHM9PT1iLmd0UCgp
+KXtzPXEucgpyPXM9PW51bGwKaWYoIXI9PT1iLmdaOCgpKXtpZihyKXM9IiIKcz1zPT09Yi5nS2EoKX1l
+bHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMQpl
+bHNlIHM9ITEKZWxzZSBzPSExCmVsc2Ugcz0hMQplbHNlIHM9ITEKcmV0dXJuIHN9LApzS3AoYSl7dGhp
+cy55PXQuYmsuYShhKX0sCnNOTShhKXt0aGlzLlE9dC5jWi5hKGEpfSwKJGlpRDoxLApnRmkoKXtyZXR1
+cm4gdGhpcy5hfSwKZ0lpKGEpe3JldHVybiB0aGlzLmV9fQpQLlJaLnByb3RvdHlwZT17CiQxKGEpe3Jl
+dHVybiBQLmVQKEMuWkosSC5uKGEpLEMueE0sITEpfSwKJFM6Mn0KUC5NRS5wcm90b3R5cGU9ewokMihh
+LGIpe3ZhciBzPXRoaXMuYixyPXRoaXMuYQpzLmErPXIuYQpyLmE9IiYiCnI9cy5hKz1QLmVQKEMuRjMs
+YSxDLnhNLCEwKQppZihiIT1udWxsJiZiLmxlbmd0aCE9PTApe3MuYT1yKyI9IgpzLmErPVAuZVAoQy5G
+MyxiLEMueE0sITApfX0sCiRTOjIyfQpQLnk1LnByb3RvdHlwZT17CiQyKGEsYil7dmFyIHMscgpILm4o
+YSkKaWYoYj09bnVsbHx8dHlwZW9mIGI9PSJzdHJpbmciKXRoaXMuYS4kMihhLEguayhiKSkKZWxzZSBm
+b3Iocz1KLklUKHQuYS5hKGIpKSxyPXRoaXMuYTtzLkYoKTspci4kMihhLEgubihzLmdsKCkpKX0sCiRT
+OjExfQpQLlBFLnByb3RvdHlwZT17CmdsUigpe3ZhciBzLHIscSxwLG89dGhpcyxuPW51bGwsbT1vLmMK
+aWYobT09bnVsbCl7bT1vLmIKaWYoMD49bS5sZW5ndGgpcmV0dXJuIEguT0gobSwwKQpzPW8uYQptPW1b
+MF0rMQpyPUMueEIuWFUocywiPyIsbSkKcT1zLmxlbmd0aAppZihyPj0wKXtwPVAuUEkocyxyKzEscSxD
+LlZDLCExKQpxPXJ9ZWxzZSBwPW4KbT1vLmM9bmV3IFAucWUoImRhdGEiLCIiLG4sbixQLlBJKHMsbSxx
+LEMuV2QsITEpLHAsbil9cmV0dXJuIG19LAp3KGEpe3ZhciBzLHI9dGhpcy5iCmlmKDA+PXIubGVuZ3Ro
+KXJldHVybiBILk9IKHIsMCkKcz10aGlzLmEKcmV0dXJuIHJbMF09PT0tMT8iZGF0YToiK3M6c319ClAu
+eUkucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcz10aGlzLmEKaWYoYT49cy5sZW5ndGgpcmV0dXJuIEgu
+T0gocyxhKQpzPXNbYV0KQy5OQS5kdShzLDAsOTYsYikKcmV0dXJuIHN9LAokUzoyM30KUC5jNi5wcm90
+b3R5cGU9ewokMyhhLGIsYyl7dmFyIHMscixxCmZvcihzPWIubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUMu
+eEIuVyhiLHIpXjk2CmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1jfX0sCiRTOjE4fQpQLnFk
+LnByb3RvdHlwZT17CiQzKGEsYixjKXt2YXIgcyxyLHEKZm9yKHM9Qy54Qi5XKGIsMCkscj1DLnhCLlco
+YiwxKTtzPD1yOysrcyl7cT0oc145Nik+Pj4wCmlmKHE+PTk2KXJldHVybiBILk9IKGEscSkKYVtxXT1j
+fX0sCiRTOjE4fQpQLlVmLnByb3RvdHlwZT17Cmdjaigpe3JldHVybiB0aGlzLmM+MH0sCmd4QSgpe3Jl
+dHVybiB0aGlzLmM+MCYmdGhpcy5kKzE8dGhpcy5lfSwKZ1FEKCl7cmV0dXJuIHRoaXMuZjx0aGlzLnJ9
+LApnWjgoKXtyZXR1cm4gdGhpcy5yPHRoaXMuYS5sZW5ndGh9LApndFQoKXtyZXR1cm4gQy54Qi5RaSh0
+aGlzLmEsIi8iLHRoaXMuZSl9LApnRmkoKXt2YXIgcz10aGlzLngKcmV0dXJuIHM9PW51bGw/dGhpcy54
+PXRoaXMuVTIoKTpzfSwKVTIoKXt2YXIgcyxyPXRoaXMscT1yLmIKaWYocTw9MClyZXR1cm4iIgpzPXE9
+PT00CmlmKHMmJkMueEIubihyLmEsImh0dHAiKSlyZXR1cm4iaHR0cCIKaWYocT09PTUmJkMueEIubihy
+LmEsImh0dHBzIikpcmV0dXJuImh0dHBzIgppZihzJiZDLnhCLm4oci5hLCJmaWxlIikpcmV0dXJuImZp
+bGUiCmlmKHE9PT03JiZDLnhCLm4oci5hLCJwYWNrYWdlIikpcmV0dXJuInBhY2thZ2UiCnJldHVybiBD
+LnhCLk5qKHIuYSwwLHEpfSwKZ2t1KCl7dmFyIHM9dGhpcy5jLHI9dGhpcy5iKzMKcmV0dXJuIHM+cj9D
+LnhCLk5qKHRoaXMuYSxyLHMtMSk6IiJ9LApnSmYoYSl7dmFyIHM9dGhpcy5jCnJldHVybiBzPjA/Qy54
+Qi5Oaih0aGlzLmEscyx0aGlzLmQpOiIifSwKZ3RwKGEpe3ZhciBzLHI9dGhpcwppZihyLmd4QSgpKXJl
+dHVybiBQLlFBKEMueEIuTmooci5hLHIuZCsxLHIuZSksbnVsbCkKcz1yLmIKaWYocz09PTQmJkMueEIu
+bihyLmEsImh0dHAiKSlyZXR1cm4gODAKaWYocz09PTUmJkMueEIubihyLmEsImh0dHBzIikpcmV0dXJu
+IDQ0MwpyZXR1cm4gMH0sCmdJaShhKXtyZXR1cm4gQy54Qi5Oaih0aGlzLmEsdGhpcy5lLHRoaXMuZil9
+LApndFAoKXt2YXIgcz10aGlzLmYscj10aGlzLnIKcmV0dXJuIHM8cj9DLnhCLk5qKHRoaXMuYSxzKzEs
+cik6IiJ9LApnS2EoKXt2YXIgcz10aGlzLnIscj10aGlzLmEKcmV0dXJuIHM8ci5sZW5ndGg/Qy54Qi55
+bihyLHMrMSk6IiJ9LApnRmooKXt2YXIgcyxyLHE9dGhpcy5lLHA9dGhpcy5mLG89dGhpcy5hCmlmKEMu
+eEIuUWkobywiLyIscSkpKytxCmlmKHE9PT1wKXJldHVybiBDLnhECnM9SC5RSShbXSx0LnMpCmZvcihy
+PXE7cjxwOysrcilpZihDLnhCLk8obyxyKT09PTQ3KXtDLk5tLmkocyxDLnhCLk5qKG8scSxyKSkKcT1y
+KzF9Qy5ObS5pKHMsQy54Qi5OaihvLHEscCkpCnJldHVybiBQLkFGKHMsdC5OKX0sCmdoWSgpe2lmKHRo
+aXMuZj49dGhpcy5yKXJldHVybiBDLkNNCnJldHVybiBuZXcgUC5HaihQLldYKHRoaXMuZ3RQKCkpLHQu
+ZHcpfSwKa1goYSl7dmFyIHM9dGhpcy5kKzEKcmV0dXJuIHMrYS5sZW5ndGg9PT10aGlzLmUmJkMueEIu
+UWkodGhpcy5hLGEscyl9LApOOSgpe3ZhciBzPXRoaXMscj1zLnIscT1zLmEKaWYocj49cS5sZW5ndGgp
+cmV0dXJuIHMKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmoocSwwLHIpLHMuYixzLmMscy5kLHMuZSxzLmYs
+cixzLngpfSwKbm0oYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnQuYzku
+YShiKQpzPWkuZ0ZpKCkKcj1zPT09ImZpbGUiCnE9aS5jCnA9cT4wP0MueEIuTmooaS5hLGkuYiszLHEp
+OiIiCm89aS5neEEoKT9pLmd0cChpKTpoCnE9aS5jCmlmKHE+MCluPUMueEIuTmooaS5hLHEsaS5kKQpl
+bHNlIG49cC5sZW5ndGghPT0wfHxvIT1udWxsfHxyPyIiOmgKcT1pLmEKbT1DLnhCLk5qKHEsaS5lLGku
+ZikKaWYoIXIpbD1uIT1udWxsJiZtLmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhCLm4obSwi
+LyIpKW09Ii8iK20Kaz1QLmxlKGgsMCwwLGIpCmw9aS5yCmo9bDxxLmxlbmd0aD9DLnhCLnluKHEsbCsx
+KTpoCnJldHVybiBuZXcgUC5EbihzLHAsbixvLG0sayxqKX0sClpJKGEpe3JldHVybiB0aGlzLm1TKFAu
+aEsoYSkpfSwKbVMoYSl7aWYoYSBpbnN0YW5jZW9mIFAuVWYpcmV0dXJuIHRoaXMudTEodGhpcyxhKQpy
+ZXR1cm4gdGhpcy5SZSgpLm1TKGEpfSwKdTEoYSxiKXt2YXIgcyxyLHEscCxvLG4sbSxsLGssaixpLGgs
+ZyxmLGUsZCxjPWIuYgppZihjPjApcmV0dXJuIGIKcz1iLmMKaWYocz4wKXtyPWEuYgppZihyPD0wKXJl
+dHVybiBiCnE9cj09PTQKaWYocSYmQy54Qi5uKGEuYSwiZmlsZSIpKXA9Yi5lIT09Yi5mCmVsc2UgaWYo
+cSYmQy54Qi5uKGEuYSwiaHR0cCIpKXA9IWIua1goIjgwIikKZWxzZSBwPSEocj09PTUmJkMueEIubihh
+LmEsImh0dHBzIikpfHwhYi5rWCgiNDQzIikKaWYocCl7bz1yKzEKcmV0dXJuIG5ldyBQLlVmKEMueEIu
+TmooYS5hLDAsbykrQy54Qi55bihiLmEsYysxKSxyLHMrbyxiLmQrbyxiLmUrbyxiLmYrbyxiLnIrbyxh
+LngpfWVsc2UgcmV0dXJuIHRoaXMuUmUoKS5tUyhiKX1uPWIuZQpjPWIuZgppZihuPT09Yyl7cz1iLnIK
+aWYoYzxzKXtyPWEuZgpvPXItYwpyZXR1cm4gbmV3IFAuVWYoQy54Qi5OaihhLmEsMCxyKStDLnhCLnlu
+KGIuYSxjKSxhLmIsYS5jLGEuZCxhLmUsYytvLHMrbyxhLngpfWM9Yi5hCmlmKHM8Yy5sZW5ndGgpe3I9
+YS5yCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHIpK0MueEIueW4oYyxzKSxhLmIsYS5jLGEu
+ZCxhLmUsYS5mLHMrKHItcyksYS54KX1yZXR1cm4gYS5OOSgpfXM9Yi5hCmlmKEMueEIuUWkocywiLyIs
+bikpe209YS5lCmw9UC5SeCh0aGlzKQprPWw+MD9sOm0Kbz1rLW4KcmV0dXJuIG5ldyBQLlVmKEMueEIu
+TmooYS5hLDAsaykrQy54Qi55bihzLG4pLGEuYixhLmMsYS5kLG0sYytvLGIucitvLGEueCl9aj1hLmUK
+aT1hLmYKaWYoaj09PWkmJmEuYz4wKXtmb3IoO0MueEIuUWkocywiLi4vIixuKTspbis9MwpvPWotbisx
+CnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLGopKyIvIitDLnhCLnluKHMsbiksYS5iLGEuYyxh
+LmQsaixjK28sYi5yK28sYS54KX1oPWEuYQpsPVAuUngodGhpcykKaWYobD49MClnPWwKZWxzZSBmb3Io
+Zz1qO0MueEIuUWkoaCwiLi4vIixnKTspZys9MwpmPTAKd2hpbGUoITApe2U9biszCmlmKCEoZTw9YyYm
+Qy54Qi5RaShzLCIuLi8iLG4pKSlicmVhazsrK2YKbj1lfWZvcihkPSIiO2k+Zzspey0taQppZihDLnhC
+Lk8oaCxpKT09PTQ3KXtpZihmPT09MCl7ZD0iLyIKYnJlYWt9LS1mCmQ9Ii8ifX1pZihpPT09ZyYmYS5i
+PD0wJiYhQy54Qi5RaShoLCIvIixqKSl7bi09ZiozCmQ9IiJ9bz1pLW4rZC5sZW5ndGgKcmV0dXJuIG5l
+dyBQLlVmKEMueEIuTmooaCwwLGkpK2QrQy54Qi55bihzLG4pLGEuYixhLmMsYS5kLGosYytvLGIucitv
+LGEueCl9LAp0NCgpe3ZhciBzLHIscT10aGlzLHA9cS5iCmlmKHA+PTApe3M9IShwPT09NCYmQy54Qi5u
+KHEuYSwiZmlsZSIpKQpwPXN9ZWxzZSBwPSExCmlmKHApdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRy
+YWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK3EuZ0ZpKCkrIiBVUkkiKSkKcD1xLmYKcz1xLmEKaWYocDxz
+Lmxlbmd0aCl7aWYocDxxLnIpdGhyb3cgSC5iKFAuTDQodS5pKSkKdGhyb3cgSC5iKFAuTDQodS5sKSl9
+cj0kLndRKCkKaWYocilwPVAubW4ocSkKZWxzZXtpZihxLmM8cS5kKUgudihQLkw0KHUuaikpCnA9Qy54
+Qi5OaihzLHEuZSxwKX1yZXR1cm4gcH0sCmdpTyhhKXt2YXIgcz10aGlzLnkKcmV0dXJuIHM9PW51bGw/
+dGhpcy55PUMueEIuZ2lPKHRoaXMuYSk6c30sCkROKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQppZih0
+aGlzPT09YilyZXR1cm4hMApyZXR1cm4gdC5kRC5iKGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZSgpe3Zh
+ciBzPXRoaXMscj1udWxsLHE9cy5nRmkoKSxwPXMuZ2t1KCksbz1zLmM+MD9zLmdKZihzKTpyLG49cy5n
+eEEoKT9zLmd0cChzKTpyLG09cy5hLGw9cy5mLGs9Qy54Qi5OaihtLHMuZSxsKSxqPXMucgpsPWw8aj9z
+Lmd0UCgpOnIKcmV0dXJuIG5ldyBQLkRuKHEscCxvLG4sayxsLGo8bS5sZW5ndGg/cy5nS2EoKTpyKX0s
+CncoYSl7cmV0dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5xZS5wcm90b3R5cGU9e30KVy5xRS5wcm90b3R5
+cGU9e30KVy5HaC5wcm90b3R5cGU9ewpzTFUoYSxiKXthLmhyZWY9Yn0sCncoYSl7cmV0dXJuIFN0cmlu
+ZyhhKX0sCiRpR2g6MX0KVy5mWS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLnJa
+LnByb3RvdHlwZT17JGlyWjoxfQpXLkF6LnByb3RvdHlwZT17JGlBejoxfQpXLlFQLnByb3RvdHlwZT17
+JGlRUDoxfQpXLm54LnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19Clcub0oucHJvdG90
+eXBlPXsKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5pZC5wcm90b3R5cGU9e30KVy5RRi5wcm90b3R5
+cGU9e30KVy5OaC5wcm90b3R5cGU9ewp3KGEpe3JldHVybiBTdHJpbmcoYSl9fQpXLmFlLnByb3RvdHlw
+ZT17CkRjKGEsYil7cmV0dXJuIGEuY3JlYXRlSFRNTERvY3VtZW50KGIpfX0KVy5JQi5wcm90b3R5cGU9
+ewp3KGEpe3ZhciBzLHI9YS5sZWZ0CnIudG9TdHJpbmcKcj0iUmVjdGFuZ2xlICgiK0guRWoocikrIiwg
+IgpzPWEudG9wCnMudG9TdHJpbmcKcz1yK0guRWoocykrIikgIgpyPWEud2lkdGgKci50b1N0cmluZwpy
+PXMrSC5FaihyKSsiIHggIgpzPWEuaGVpZ2h0CnMudG9TdHJpbmcKcmV0dXJuIHIrSC5FaihzKX0sCkRO
+KGEsYil7dmFyIHMscgppZihiPT1udWxsKXJldHVybiExCmlmKHQucS5iKGIpKXtzPWEubGVmdApzLnRv
+U3RyaW5nCnI9Yi5sZWZ0CnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS50b3AKcy50b1N0cmluZwpyPWIu
+dG9wCnIudG9TdHJpbmcKaWYocz09PXIpe3M9YS53aWR0aApzLnRvU3RyaW5nCnI9Yi53aWR0aApyLnRv
+U3RyaW5nCmlmKHM9PT1yKXtzPWEuaGVpZ2h0CnMudG9TdHJpbmcKcj1iLmhlaWdodApyLnRvU3RyaW5n
+CnI9cz09PXIKcz1yfWVsc2Ugcz0hMX1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMQpyZXR1cm4g
+c30sCmdpTyhhKXt2YXIgcyxyLHEscD1hLmxlZnQKcC50b1N0cmluZwpwPUMuQ0QuZ2lPKHApCnM9YS50
+b3AKcy50b1N0cmluZwpzPUMuQ0QuZ2lPKHMpCnI9YS53aWR0aApyLnRvU3RyaW5nCnI9Qy5DRC5naU8o
+cikKcT1hLmhlaWdodApxLnRvU3RyaW5nCnJldHVybiBXLnJFKHAscyxyLEMuQ0QuZ2lPKHEpKX0sCiRp
+dG46MX0KVy5uNy5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLnd6LnByb3RvdHlw
+ZT17CmdBKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKcShhLGIpe3ZhciBzCkguSVooYikKcz10aGlz
+LmEKaWYoYjwwfHxiPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLGIpCnJldHVybiB0aGlzLiR0aS5jLmEo
+c1tiXSl9LApZNShhLGIsYyl7dGhpcy4kdGkuYy5hKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9k
+aWZ5IGxpc3QiKSl9fQpXLmN2LnByb3RvdHlwZT17CmdRZyhhKXtyZXR1cm4gbmV3IFcuaTcoYSl9LApn
+UChhKXtyZXR1cm4gbmV3IFcuSTQoYSl9LApzUChhLGIpe3ZhciBzCnQuTy5hKGIpCnM9dGhpcy5nUChh
+KQpzLlYxKDApCnMuRlYoMCxiKX0sCncoYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKRkYoYSl7dmFyIHM9
+ISFhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQKaWYocylhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKQpl
+bHNlIGEuc2Nyb2xsSW50b1ZpZXcoKX0sCm56KGEsYixjLGQsZSl7dmFyIHMscj10aGlzLnI2KGEsYyxk
+LGUpCnN3aXRjaChiLnRvTG93ZXJDYXNlKCkpe2Nhc2UiYmVmb3JlYmVnaW4iOnM9YS5wYXJlbnROb2Rl
+CnMudG9TdHJpbmcKSi5FaChzLHIsYSkKYnJlYWsKY2FzZSJhZnRlcmJlZ2luIjpzPWEuY2hpbGROb2Rl
+cwp0aGlzLm1LKGEscixzLmxlbmd0aD4wP3NbMF06bnVsbCkKYnJlYWsKY2FzZSJiZWZvcmVlbmQiOmEu
+YXBwZW5kQ2hpbGQocikKYnJlYWsKY2FzZSJhZnRlcmVuZCI6cz1hLnBhcmVudE5vZGUKcy50b1N0cmlu
+ZwpKLkVoKHMscixhLm5leHRTaWJsaW5nKQpicmVhawpkZWZhdWx0OkgudihQLnhZKCJJbnZhbGlkIHBv
+c2l0aW9uICIrYixudWxsKSl9fSwKcjYoYSxiLGMsZCl7dmFyIHMscixxLHAKaWYoYz09bnVsbCl7aWYo
+ZD09bnVsbCl7cz0kLmx0CmlmKHM9PW51bGwpe3M9SC5RSShbXSx0LnUpCnI9bmV3IFcudkQocykKQy5O
+bS5pKHMsVy5UdyhudWxsKSkKQy5ObS5pKHMsVy5CbCgpKQokLmx0PXIKZD1yfWVsc2UgZD1zfXM9JC5F
+VQppZihzPT1udWxsKXtzPW5ldyBXLktvKGQpCiQuRVU9cwpjPXN9ZWxzZXtzLmE9ZApjPXN9fWVsc2Ug
+aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgidmFsaWRhdG9yIGNhbiBvbmx5IGJlIHBhc3NlZCBpZiB0
+cmVlU2FuaXRpemVyIGlzIG51bGwiLG51bGwpKQppZigkLnhvPT1udWxsKXtzPWRvY3VtZW50CnI9cy5p
+bXBsZW1lbnRhdGlvbgpyLnRvU3RyaW5nCnI9Qy5tSC5EYyhyLCIiKQokLnhvPXIKJC5CTz1yLmNyZWF0
+ZVJhbmdlKCkKcj0kLnhvLmNyZWF0ZUVsZW1lbnQoImJhc2UiKQp0LmNSLmEocikKcz1zLmJhc2VVUkkK
+cy50b1N0cmluZwpyLmhyZWY9cwokLnhvLmhlYWQuYXBwZW5kQ2hpbGQocil9cz0kLnhvCmlmKHMuYm9k
+eT09bnVsbCl7cj1zLmNyZWF0ZUVsZW1lbnQoImJvZHkiKQpDLkJaLnNHUyhzLHQubS5hKHIpKX1zPSQu
+eG8KaWYodC5tLmIoYSkpe3M9cy5ib2R5CnMudG9TdHJpbmcKcT1zfWVsc2V7cy50b1N0cmluZwpxPXMu
+Y3JlYXRlRWxlbWVudChhLnRhZ05hbWUpCiQueG8uYm9keS5hcHBlbmRDaGlsZChxKX1pZigiY3JlYXRl
+Q29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBlJiYhQy5ObS50ZyhDLlNx
+LGEudGFnTmFtZSkpeyQuQk8uc2VsZWN0Tm9kZUNvbnRlbnRzKHEpCnM9JC5CTwpzLnRvU3RyaW5nCnA9
+cy5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoYj09bnVsbD8ibnVsbCI6Yil9ZWxzZXtKLndmKHEsYikK
+cD0kLnhvLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpmb3IoO3M9cS5maXJzdENoaWxkLHMhPW51bGw7
+KXAuYXBwZW5kQ2hpbGQocyl9aWYocSE9PSQueG8uYm9keSlKLkx0KHEpCmMuUG4ocCkKZG9jdW1lbnQu
+YWRvcHROb2RlKHApCnJldHVybiBwfSwKQUgoYSxiLGMpe3JldHVybiB0aGlzLnI2KGEsYixjLG51bGwp
+fSwKc2hmKGEsYil7dGhpcy5ZQyhhLGIpfSwKcGsoYSxiLGMpe3RoaXMuc2E0KGEsbnVsbCkKYS5hcHBl
+bmRDaGlsZCh0aGlzLnI2KGEsYixudWxsLGMpKX0sCllDKGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51
+bGwpfSwKc1JOKGEsYil7YS5pbm5lckhUTUw9Yn0sCmducyhhKXtyZXR1cm4gYS50YWdOYW1lfSwKZ1Zs
+KGEpe3JldHVybiBuZXcgVy5DcShhLCJjbGljayIsITEsdC5RKX0sCiRpY3Y6MX0KVy5Ddi5wcm90b3R5
+cGU9ewokMShhKXtyZXR1cm4gdC5oLmIodC5BLmEoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBlPXsk
+aWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT24oYSxiLGMsZCl7dC5idy5hKGMpCmlmKGMhPW51bGwpdGhp
+cy52KGEsYixjLGQpfSwKQihhLGIsYyl7cmV0dXJuIHRoaXMuT24oYSxiLGMsbnVsbCl9LAp2KGEsYixj
+LGQpe3JldHVybiBhLmFkZEV2ZW50TGlzdGVuZXIoYixILnRSKHQuYncuYShjKSwxKSxkKX0sCiRpRDA6
+MX0KVy5oSC5wcm90b3R5cGU9eyRpaEg6MX0KVy5oNC5wcm90b3R5cGU9ewpnQShhKXtyZXR1cm4gYS5s
+ZW5ndGh9fQpXLmJyLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVmIucHJvdG90
+eXBlPXsKc0dTKGEsYil7YS5ib2R5PWJ9fQpXLmZKLnByb3RvdHlwZT17CmVvKGEsYixjLGQpe3JldHVy
+biBhLm9wZW4oYixjLCEwKX0sCiRpZko6MX0KVy53YS5wcm90b3R5cGU9e30KVy5TZy5wcm90b3R5cGU9
+eyRpU2c6MX0KVy51OC5wcm90b3R5cGU9ewpnRHIoYSl7aWYoIm9yaWdpbiIgaW4gYSlyZXR1cm4gYS5v
+cmlnaW4KcmV0dXJuIGEucHJvdG9jb2wrIi8vIithLmhvc3R9LAp3KGEpe3JldHVybiBTdHJpbmcoYSl9
+LAokaXU4OjF9ClcuQWoucHJvdG90eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4KGEpe3Zh
+ciBzPXRoaXMuYSxyPXMuY2hpbGROb2Rlcy5sZW5ndGgKaWYocj09PTApdGhyb3cgSC5iKFAuUFYoIk5v
+IGVsZW1lbnRzIikpCmlmKHI+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVtZW50Iikp
+CnM9cy5maXJzdENoaWxkCnMudG9TdHJpbmcKcmV0dXJuIHN9LApGVihhLGIpe3ZhciBzLHIscSxwLG8K
+dC5laC5hKGIpCmlmKGIgaW5zdGFuY2VvZiBXLmU3KXtzPWIuYQpyPXRoaXMuYQppZihzIT09cilmb3Io
+cT1zLmNoaWxkTm9kZXMubGVuZ3RoLHA9MDtwPHE7KytwKXtvPXMuZmlyc3RDaGlsZApvLnRvU3RyaW5n
+CnIuYXBwZW5kQ2hpbGQobyl9cmV0dXJufWZvcihzPWIuZ20oYikscj10aGlzLmE7cy5GKCk7KXIuYXBw
+ZW5kQ2hpbGQocy5nbCgpKX0sClk1KGEsYixjKXt2YXIgcyxyCnQuQS5hKGMpCnM9dGhpcy5hCnI9cy5j
+aGlsZE5vZGVzCmlmKGI8MHx8Yj49ci5sZW5ndGgpcmV0dXJuIEguT0gocixiKQpzLnJlcGxhY2VDaGls
+ZChjLHJbYl0pfSwKZ20oYSl7dmFyIHM9dGhpcy5hLmNoaWxkTm9kZXMKcmV0dXJuIG5ldyBXLlc5KHMs
+cy5sZW5ndGgsSC56SyhzKS5DKCJXOTxHbS5FPiIpKX0sCmdBKGEpe3JldHVybiB0aGlzLmEuY2hpbGRO
+b2Rlcy5sZW5ndGh9LApxKGEsYil7dmFyIHMKSC5JWihiKQpzPXRoaXMuYS5jaGlsZE5vZGVzCmlmKGI8
+MHx8Yj49cy5sZW5ndGgpcmV0dXJuIEguT0gocyxiKQpyZXR1cm4gc1tiXX19ClcuS1YucHJvdG90eXBl
+PXsKd2coYSl7dmFyIHM9YS5wYXJlbnROb2RlCmlmKHMhPW51bGwpcy5yZW1vdmVDaGlsZChhKX0sCkQ0
+KGEpe3ZhciBzCmZvcig7cz1hLmZpcnN0Q2hpbGQscyE9bnVsbDspYS5yZW1vdmVDaGlsZChzKX0sCnco
+YSl7dmFyIHM9YS5ub2RlVmFsdWUKcmV0dXJuIHM9PW51bGw/dGhpcy5VKGEpOnN9LApzYTQoYSxiKXth
+LnRleHRDb250ZW50PWJ9LAptSyhhLGIsYyl7cmV0dXJuIGEuaW5zZXJ0QmVmb3JlKGIsYyl9LAokaUtW
+OjF9ClcuQkgucHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofSwKcShhLGIpe0guSVooYikK
+aWYoYj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwp
+KQpyZXR1cm4gYVtiXX0sClk1KGEsYixjKXt0LkEuYShjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFz
+c2lnbiBlbGVtZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sCmd0SChhKXtpZihhLmxlbmd0aD4wKXJl
+dHVybiBhWzBdCnRocm93IEguYihQLlBWKCJObyBlbGVtZW50cyIpKX0sCkUoYSxiKXtpZihiPDB8fGI+
+PWEubGVuZ3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaWJROjEsCiRpWGo6MSwKJGlj
+WDoxLAokaXpNOjF9ClcuU04ucHJvdG90eXBlPXt9ClcuZXcucHJvdG90eXBlPXskaWV3OjF9ClcubHAu
+cHJvdG90eXBlPXsKZ0EoYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5UYi5wcm90b3R5cGU9ewpyNihhLGIs
+YyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5w
+cm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKcz1XLlU5KCI8dGFibGU+IitILkVqKGIpKyI8
+L3RhYmxlPiIsYyxkKQpyPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpuZXcgVy5lNyhy
+KS5GVigwLG5ldyBXLmU3KHMpKQpyZXR1cm4gcn19ClcuSXYucHJvdG90eXBlPXsKcjYoYSxiLGMsZCl7
+dmFyIHMscgppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90
+eXBlKXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnM9ZG9jdW1lbnQKcj1zLmNyZWF0ZURvY3VtZW50RnJh
+Z21lbnQoKQpzPW5ldyBXLmU3KEMuSWUucjYocy5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxkKSkK
+cz1uZXcgVy5lNyhzLmdyOChzKSkKbmV3IFcuZTcocikuRlYoMCxuZXcgVy5lNyhzLmdyOChzKSkpCnJl
+dHVybiByfX0KVy5XUC5wcm90b3R5cGU9ewpyNihhLGIsYyxkKXt2YXIgcyxyCmlmKCJjcmVhdGVDb250
+ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxi
+LGMsZCkKcz1kb2N1bWVudApyPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnM9bmV3IFcuZTcoQy5J
+ZS5yNihzLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpKQpuZXcgVy5lNyhyKS5GVigwLG5ldyBX
+LmU3KHMuZ3I4KHMpKSkKcmV0dXJuIHJ9fQpXLnlZLnByb3RvdHlwZT17CnBrKGEsYixjKXt2YXIgcyxy
+CnRoaXMuc2E0KGEsbnVsbCkKcz1hLmNvbnRlbnQKcy50b1N0cmluZwpKLmJUKHMpCnI9dGhpcy5yNihh
+LGIsbnVsbCxjKQphLmNvbnRlbnQuYXBwZW5kQ2hpbGQocil9LApZQyhhLGIpe3JldHVybiB0aGlzLnBr
+KGEsYixudWxsKX0sCiRpeVk6MX0KVy53Ni5wcm90b3R5cGU9e30KVy5LNS5wcm90b3R5cGU9ewpQbyhh
+LGIsYyl7dmFyIHM9Vy5QMShhLm9wZW4oYixjKSkKcmV0dXJuIHN9LApnbVcoYSl7cmV0dXJuIHQuRi5h
+KGEubG9jYXRpb24pfSwKdXMoYSxiKXtyZXR1cm4gYS5jb25maXJtKGIpfSwKJGlLNToxLAokaXY2OjF9
+ClcuQ20ucHJvdG90eXBlPXskaUNtOjF9ClcuQ1EucHJvdG90eXBlPXskaUNROjF9ClcudzQucHJvdG90
+eXBlPXsKdyhhKXt2YXIgcyxyPWEubGVmdApyLnRvU3RyaW5nCnI9IlJlY3RhbmdsZSAoIitILkVqKHIp
+KyIsICIKcz1hLnRvcApzLnRvU3RyaW5nCnM9citILkVqKHMpKyIpICIKcj1hLndpZHRoCnIudG9TdHJp
+bmcKcj1zK0guRWoocikrIiB4ICIKcz1hLmhlaWdodApzLnRvU3RyaW5nCnJldHVybiByK0guRWoocyl9
+LApETihhLGIpe3ZhciBzLHIKaWYoYj09bnVsbClyZXR1cm4hMQppZih0LnEuYihiKSl7cz1hLmxlZnQK
+cy50b1N0cmluZwpyPWIubGVmdApyLnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEudG9wCnMudG9TdHJpbmcK
+cj1iLnRvcApyLnRvU3RyaW5nCmlmKHM9PT1yKXtzPWEud2lkdGgKcy50b1N0cmluZwpyPWIud2lkdGgK
+ci50b1N0cmluZwppZihzPT09cil7cz1hLmhlaWdodApzLnRvU3RyaW5nCnI9Yi5oZWlnaHQKci50b1N0
+cmluZwpyPXM9PT1yCnM9cn1lbHNlIHM9ITF9ZWxzZSBzPSExfWVsc2Ugcz0hMX1lbHNlIHM9ITEKcmV0
+dXJuIHN9LApnaU8oYSl7dmFyIHMscixxLHA9YS5sZWZ0CnAudG9TdHJpbmcKcD1DLkNELmdpTyhwKQpz
+PWEudG9wCnMudG9TdHJpbmcKcz1DLkNELmdpTyhzKQpyPWEud2lkdGgKci50b1N0cmluZwpyPUMuQ0Qu
+Z2lPKHIpCnE9YS5oZWlnaHQKcS50b1N0cmluZwpyZXR1cm4gVy5yRShwLHMscixDLkNELmdpTyhxKSl9
+fQpXLnJoLnByb3RvdHlwZT17CmdBKGEpe3JldHVybiBhLmxlbmd0aH0sCnEoYSxiKXtILklaKGIpCmlm
+KGI+Pj4wIT09Ynx8Yj49YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkK
+cmV0dXJuIGFbYl19LApZNShhLGIsYyl7dC5BLmEoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3Np
+Z24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9LApFKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0
+aClyZXR1cm4gSC5PSChhLGIpCnJldHVybiBhW2JdfSwKJGliUToxLAokaVhqOjEsCiRpY1g6MSwKJGl6
+TToxfQpXLmNmLnByb3RvdHlwZT17CksoYSxiKXt2YXIgcyxyLHEscCxvCnQuZUEuYShiKQpmb3Iocz10
+aGlzLmd2YygpLHI9cy5sZW5ndGgscT10aGlzLmEscD0wO3A8cy5sZW5ndGg7cy5sZW5ndGg9PT1yfHwo
+MCxILmxrKShzKSwrK3Ape289c1twXQpiLiQyKG8sSC5uKHEuZ2V0QXR0cmlidXRlKG8pKSl9fSwKZ3Zj
+KCl7dmFyIHMscixxLHAsbyxuLG09dGhpcy5hLmF0dHJpYnV0ZXMKbS50b1N0cmluZwpzPUguUUkoW10s
+dC5zKQpmb3Iocj1tLmxlbmd0aCxxPXQuaDkscD0wO3A8cjsrK3Ape2lmKHA+PW0ubGVuZ3RoKXJldHVy
+biBILk9IKG0scCkKbz1xLmEobVtwXSkKaWYoby5uYW1lc3BhY2VVUkk9PW51bGwpe249by5uYW1lCm4u
+dG9TdHJpbmcKQy5ObS5pKHMsbil9fXJldHVybiBzfSwKZ2wwKGEpe3JldHVybiB0aGlzLmd2YygpLmxl
+bmd0aD09PTB9fQpXLmk3LnByb3RvdHlwZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5oYXNBdHRyaWJ1dGUo
+YSkKcmV0dXJuIHN9LApxKGEsYil7cmV0dXJuIHRoaXMuYS5nZXRBdHRyaWJ1dGUoSC5uKGIpKX0sClk1
+KGEsYixjKXt0aGlzLmEuc2V0QXR0cmlidXRlKGIsYyl9LApnQShhKXtyZXR1cm4gdGhpcy5ndmMoKS5s
+ZW5ndGh9fQpXLlN5LnByb3RvdHlwZT17Cng0KGEpe3ZhciBzPXRoaXMuYS5hLmhhc0F0dHJpYnV0ZSgi
+ZGF0YS0iK3RoaXMuT1UoYSkpCnJldHVybiBzfSwKcShhLGIpe3JldHVybiB0aGlzLmEuYS5nZXRBdHRy
+aWJ1dGUoImRhdGEtIit0aGlzLk9VKEgubihiKSkpfSwKWTUoYSxiLGMpe3RoaXMuYS5hLnNldEF0dHJp
+YnV0ZSgiZGF0YS0iK3RoaXMuT1UoYiksYyl9LApLKGEsYil7dGhpcy5hLksoMCxuZXcgVy5LUyh0aGlz
+LHQuZUEuYShiKSkpfSwKZ3ZjKCl7dmFyIHM9SC5RSShbXSx0LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTMo
+dGhpcyxzKSkKcmV0dXJuIHN9LApnQShhKXtyZXR1cm4gdGhpcy5ndmMoKS5sZW5ndGh9LApnbDAoYSl7
+cmV0dXJuIHRoaXMuZ3ZjKCkubGVuZ3RoPT09MH0sCnhxKGEpe3ZhciBzLHIscT1ILlFJKGEuc3BsaXQo
+Ii0iKSx0LnMpCmZvcihzPTE7czxxLmxlbmd0aDsrK3Mpe3I9cVtzXQppZihyLmxlbmd0aD4wKUMuTm0u
+WTUocSxzLHJbMF0udG9VcHBlckNhc2UoKStDLnhCLnluKHIsMSkpfXJldHVybiBDLk5tLmsocSwiIil9
+LApPVShhKXt2YXIgcyxyLHEscCxvCmZvcihzPWEubGVuZ3RoLHI9MCxxPSIiO3I8czsrK3Ipe3A9YVty
+XQpvPXAudG9Mb3dlckNhc2UoKQpxPShwIT09byYmcj4wP3ErIi0iOnEpK299cmV0dXJuIHEuY2hhckNv
+ZGVBdCgwKT09MD9xOnF9fQpXLktTLnByb3RvdHlwZT17CiQyKGEsYil7aWYoQy54Qi5uKGEsImRhdGEt
+IikpdGhpcy5iLiQyKHRoaXMuYS54cShDLnhCLnluKGEsNSkpLGIpfSwKJFM6OH0KVy5BMy5wcm90b3R5
+cGU9ewokMihhLGIpe2lmKEMueEIubihhLCJkYXRhLSIpKUMuTm0uaSh0aGlzLmIsdGhpcy5hLnhxKEMu
+eEIueW4oYSw1KSkpfSwKJFM6OH0KVy5JNC5wcm90b3R5cGU9ewpEKCl7dmFyIHMscixxLHAsbz1QLkxz
+KHQuTikKZm9yKHM9dGhpcy5hLmNsYXNzTmFtZS5zcGxpdCgiICIpLHI9cy5sZW5ndGgscT0wO3E8cjsr
+K3Epe3A9Si5UMChzW3FdKQppZihwLmxlbmd0aCE9PTApby5pKDAscCl9cmV0dXJuIG99LApYKGEpe3Ro
+aXMuYS5jbGFzc05hbWU9dC5DLmEoYSkuaygwLCIgIil9LApnQShhKXtyZXR1cm4gdGhpcy5hLmNsYXNz
+TGlzdC5sZW5ndGh9LApnbDAoYSl7cmV0dXJuIHRoaXMuYS5jbGFzc0xpc3QubGVuZ3RoPT09MH0sCmdv
+cihhKXtyZXR1cm4gdGhpcy5hLmNsYXNzTGlzdC5sZW5ndGghPT0wfSwKVjEoYSl7dGhpcy5hLmNsYXNz
+TmFtZT0iIn0sCnRnKGEsYil7dmFyIHM9dGhpcy5hLmNsYXNzTGlzdC5jb250YWlucyhiKQpyZXR1cm4g
+c30sCmkoYSxiKXt2YXIgcyxyCkgubihiKQpzPXRoaXMuYS5jbGFzc0xpc3QKcj1zLmNvbnRhaW5zKGIp
+CnMuYWRkKGIpCnJldHVybiFyfSwKUihhLGIpe3ZhciBzLHIscQppZih0eXBlb2YgYj09InN0cmluZyIp
+e3M9dGhpcy5hLmNsYXNzTGlzdApyPXMuY29udGFpbnMoYikKcy5yZW1vdmUoYikKcT1yfWVsc2UgcT0h
+MQpyZXR1cm4gcX0sCkZWKGEsYil7Vy5UTih0aGlzLmEsdC5PLmEoYikpfX0KVy5Gay5wcm90b3R5cGU9
+e30KVy5STy5wcm90b3R5cGU9e30KVy5DcS5wcm90b3R5cGU9e30KVy54Qy5wcm90b3R5cGU9e30KVy52
+Ti5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5hLiQxKHQuQi5hKGEpKX0sCiRTOjI3fQpXLkpR
+LnByb3RvdHlwZT17CkNZKGEpe3ZhciBzCmlmKCQub3IuZ2wwKCQub3IpKXtmb3Iocz0wO3M8MjYyOysr
+cykkLm9yLlk1KDAsQy5jbVtzXSxXLnBTKCkpCmZvcihzPTA7czwxMjsrK3MpJC5vci5ZNSgwLEMuQklb
+c10sVy5WNCgpKX19LAppMChhKXtyZXR1cm4gJC5BTigpLnRnKDAsVy5yUyhhKSl9LApFYihhLGIsYyl7
+dmFyIHM9JC5vci5xKDAsVy5yUyhhKSsiOjoiK2IpCmlmKHM9PW51bGwpcz0kLm9yLnEoMCwiKjo6Iiti
+KQppZihzPT1udWxsKXJldHVybiExCnJldHVybiBILnA4KHMuJDQoYSxiLGMsdGhpcykpfSwKJGlrRjox
+fQpXLkdtLnByb3RvdHlwZT17CmdtKGEpe3JldHVybiBuZXcgVy5XOShhLHRoaXMuZ0EoYSksSC56Syhh
+KS5DKCJXOTxHbS5FPiIpKX19ClcudkQucHJvdG90eXBlPXsKaTAoYSl7cmV0dXJuIEMuTm0uVnIodGhp
+cy5hLG5ldyBXLlV2KGEpKX0sCkViKGEsYixjKXtyZXR1cm4gQy5ObS5Wcih0aGlzLmEsbmV3IFcuRWco
+YSxiLGMpKX0sCiRpa0Y6MX0KVy5Vdi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLmkw
+KHRoaXMuYSl9LAokUzoxNn0KVy5FZy5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdC5mNi5hKGEpLkVi
+KHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0sCiRTOjE2fQpXLm02LnByb3RvdHlwZT17CkNZKGEsYixjLGQp
+e3ZhciBzLHIscQp0aGlzLmEuRlYoMCxjKQpzPWIuZXYoMCxuZXcgVy5FbygpKQpyPWIuZXYoMCxuZXcg
+Vy5XaygpKQp0aGlzLmIuRlYoMCxzKQpxPXRoaXMuYwpxLkZWKDAsQy54RCkKcS5GVigwLHIpfSwKaTAo
+YSl7cmV0dXJuIHRoaXMuYS50ZygwLFcuclMoYSkpfSwKRWIoYSxiLGMpe3ZhciBzPXRoaXMscj1XLnJT
+KGEpLHE9cy5jCmlmKHEudGcoMCxyKyI6OiIrYikpcmV0dXJuIHMuZC5EdChjKQplbHNlIGlmKHEudGco
+MCwiKjo6IitiKSlyZXR1cm4gcy5kLkR0KGMpCmVsc2V7cT1zLmIKaWYocS50ZygwLHIrIjo6IitiKSly
+ZXR1cm4hMAplbHNlIGlmKHEudGcoMCwiKjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCxyKyI6
+OioiKSlyZXR1cm4hMAplbHNlIGlmKHEudGcoMCwiKjo6KiIpKXJldHVybiEwfXJldHVybiExfSwKJGlr
+RjoxfQpXLkVvLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiFDLk5tLnRnKEMuQkksSC5uKGEpKX0sCiRT
+OjZ9ClcuV2sucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIEMuTm0udGcoQy5CSSxILm4oYSkpfSwKJFM6
+Nn0KVy5jdC5wcm90b3R5cGU9ewpFYihhLGIsYyl7aWYodGhpcy5qRihhLGIsYykpcmV0dXJuITAKaWYo
+Yj09PSJ0ZW1wbGF0ZSImJmM9PT0iIilyZXR1cm4hMAppZihhLmdldEF0dHJpYnV0ZSgidGVtcGxhdGUi
+KT09PSIiKXJldHVybiB0aGlzLmUudGcoMCxiKQpyZXR1cm4hMX19ClcuSUEucHJvdG90eXBlPXsKJDEo
+YSl7cmV0dXJuIlRFTVBMQVRFOjoiK0gubihhKX0sCiRTOjJ9ClcuT3cucHJvdG90eXBlPXsKaTAoYSl7
+dmFyIHMKaWYodC5hTy5iKGEpKXJldHVybiExCnM9dC5nNy5iKGEpCmlmKHMmJlcuclMoYSk9PT0iZm9y
+ZWlnbk9iamVjdCIpcmV0dXJuITEKaWYocylyZXR1cm4hMApyZXR1cm4hMX0sCkViKGEsYixjKXtpZihi
+PT09ImlzInx8Qy54Qi5uKGIsIm9uIikpcmV0dXJuITEKcmV0dXJuIHRoaXMuaTAoYSl9LAokaWtGOjF9
+ClcuVzkucHJvdG90eXBlPXsKRigpe3ZhciBzPXRoaXMscj1zLmMrMSxxPXMuYgppZihyPHEpe3Muc3Ao
+Si54OShzLmEscikpCnMuYz1yCnJldHVybiEwfXMuc3AobnVsbCkKcy5jPXEKcmV0dXJuITF9LApnbCgp
+e3JldHVybiB0aGlzLiR0aS5jLmEodGhpcy5kKX0sCnNwKGEpe3RoaXMuZD10aGlzLiR0aS5DKCIxPyIp
+LmEoYSl9LAokaUFuOjF9ClcuZFcucHJvdG90eXBlPXskaUQwOjEsJGl2NjoxfQpXLm1rLnByb3RvdHlw
+ZT17JGl5MDoxfQpXLktvLnByb3RvdHlwZT17ClBuKGEpe3ZhciBzLHI9bmV3IFcuZm0odGhpcykKZG97
+cz10aGlzLmIKci4kMihhLG51bGwpfXdoaWxlKHMhPT10aGlzLmIpfSwKRVAoYSxiKXsrK3RoaXMuYgpp
+ZihiPT1udWxsfHxiIT09YS5wYXJlbnROb2RlKUouTHQoYSkKZWxzZSBiLnJlbW92ZUNoaWxkKGEpfSwK
+STQoYSxiKXt2YXIgcyxyLHEscCxvLG49ITAsbT1udWxsLGw9bnVsbAp0cnl7bT1KLmlnKGEpCmw9bS5h
+LmdldEF0dHJpYnV0ZSgiaXMiKQp0LmguYShhKQpzPWZ1bmN0aW9uKGMpe2lmKCEoYy5hdHRyaWJ1dGVz
+IGluc3RhbmNlb2YgTmFtZWROb2RlTWFwKSlyZXR1cm4gdHJ1ZQppZihjLmlkPT0ibGFzdENoaWxkInx8
+Yy5uYW1lPT0ibGFzdENoaWxkInx8Yy5pZD09InByZXZpb3VzU2libGluZyJ8fGMubmFtZT09InByZXZp
+b3VzU2libGluZyJ8fGMuaWQ9PSJjaGlsZHJlbiJ8fGMubmFtZT09ImNoaWxkcmVuIilyZXR1cm4gdHJ1
+ZQp2YXIgaz1jLmNoaWxkTm9kZXMKaWYoYy5sYXN0Q2hpbGQmJmMubGFzdENoaWxkIT09a1trLmxlbmd0
+aC0xXSlyZXR1cm4gdHJ1ZQppZihjLmNoaWxkcmVuKWlmKCEoYy5jaGlsZHJlbiBpbnN0YW5jZW9mIEhU
+TUxDb2xsZWN0aW9ufHxjLmNoaWxkcmVuIGluc3RhbmNlb2YgTm9kZUxpc3QpKXJldHVybiB0cnVlCnZh
+ciBqPTAKaWYoYy5jaGlsZHJlbilqPWMuY2hpbGRyZW4ubGVuZ3RoCmZvcih2YXIgaT0wO2k8ajtpKysp
+e3ZhciBoPWMuY2hpbGRyZW5baV0KaWYoaC5pZD09ImF0dHJpYnV0ZXMifHxoLm5hbWU9PSJhdHRyaWJ1
+dGVzInx8aC5pZD09Imxhc3RDaGlsZCJ8fGgubmFtZT09Imxhc3RDaGlsZCJ8fGguaWQ9PSJwcmV2aW91
+c1NpYmxpbmcifHxoLm5hbWU9PSJwcmV2aW91c1NpYmxpbmcifHxoLmlkPT0iY2hpbGRyZW4ifHxoLm5h
+bWU9PSJjaGlsZHJlbiIpcmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfShhKQpuPUgub1Qocyk/ITA6IShh
+LmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApfWNhdGNoKHApe0guUnUocCl9cj0iZWxl
+bWVudCB1bnByaW50YWJsZSIKdHJ5e3I9Si53KGEpfWNhdGNoKHApe0guUnUocCl9dHJ5e3E9Vy5yUyhh
+KQp0aGlzLmtSKHQuaC5hKGEpLGIsbixyLHEsdC5mLmEobSksSC5rKGwpKX1jYXRjaChwKXtpZihILlJ1
+KHApIGluc3RhbmNlb2YgUC5BVCl0aHJvdyBwCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpvPSJSZW1v
+dmluZyBjb3JydXB0ZWQgZWxlbWVudCAiK0guRWoocikKaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmlu
+ZWQiKXdpbmRvdy5jb25zb2xlLndhcm4obyl9fX0sCmtSKGEsYixjLGQsZSxmLGcpe3ZhciBzLHIscSxw
+LG8sbixtPXRoaXMKaWYoYyl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1vdmluZyBlbGVtZW50IGR1ZSB0
+byBjb3JydXB0ZWQgYXR0cmlidXRlcyBvbiA8IitkKyI+IgppZih0eXBlb2YgY29uc29sZSE9InVuZGVm
+aW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1cm59aWYoIW0uYS5pMChhKSl7bS5FUChhLGIp
+CndpbmRvdwpzPSJSZW1vdmluZyBkaXNhbGxvd2VkIGVsZW1lbnQgPCIrZSsiPiBmcm9tICIrSC5Faihi
+KQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihzKQpyZXR1
+cm59aWYoZyE9bnVsbClpZighbS5hLkViKGEsImlzIixnKSl7bS5FUChhLGIpCndpbmRvdwpzPSJSZW1v
+dmluZyBkaXNhbGxvd2VkIHR5cGUgZXh0ZW5zaW9uIDwiK2UrJyBpcz0iJytnKyciPicKaWYodHlwZW9m
+IGNvbnNvbGUhPSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLndhcm4ocykKcmV0dXJufXM9Zi5ndmMo
+KQpyPUguUUkocy5zbGljZSgwKSxILnQ2KHMpKQpmb3IocT1mLmd2YygpLmxlbmd0aC0xLHM9Zi5hO3E+
+PTA7LS1xKXtpZihxPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpvPW0uYQpuPUouY0go
+cCkKSC5uKHApCmlmKCFvLkViKGEsbixILm4ocy5nZXRBdHRyaWJ1dGUocCkpKSl7d2luZG93Cm89IlJl
+bW92aW5nIGRpc2FsbG93ZWQgYXR0cmlidXRlIDwiK2UrIiAiK3ArJz0iJytILkVqKHMuZ2V0QXR0cmli
+dXRlKHApKSsnIj4nCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53
+YXJuKG8pCnMucmVtb3ZlQXR0cmlidXRlKHApfX1pZih0LmFXLmIoYSkpe3M9YS5jb250ZW50CnMudG9T
+dHJpbmcKbS5QbihzKX19LAokaW9uOjF9ClcuZm0ucHJvdG90eXBlPXsKJDIoYSxiKXt2YXIgcyxyLHEs
+cCxvLG4sbT10aGlzLmEKc3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTptLkk0KGEsYikKYnJlYWsKY2Fz
+ZSA4OmNhc2UgMTE6Y2FzZSAzOmNhc2UgNDpicmVhawpkZWZhdWx0Om0uRVAoYSxiKX1zPWEubGFzdENo
+aWxkCmZvcihxPXQuQTtzIT1udWxsOyl7cj1udWxsCnRyeXtyPXMucHJldmlvdXNTaWJsaW5nCmlmKHIh
+PW51bGwpe3A9ci5uZXh0U2libGluZwpvPXMKbz1wPT1udWxsP28hPW51bGw6cCE9PW8KcD1vfWVsc2Ug
+cD0hMQppZihwKXtwPVAuUFYoIkNvcnJ1cHQgSFRNTCIpCnRocm93IEguYihwKX19Y2F0Y2gobil7SC5S
+dShuKQpwPXEuYShzKTsrK20uYgpvPXAucGFyZW50Tm9kZQppZihhIT09byl7aWYobyE9bnVsbClvLnJl
+bW92ZUNoaWxkKHApfWVsc2UgYS5yZW1vdmVDaGlsZChwKQpzPW51bGwKcj1hLmxhc3RDaGlsZH1pZihz
+IT1udWxsKXRoaXMuJDIocyxhKQpzPXJ9fSwKJFM6MzB9ClcuTGUucHJvdG90eXBlPXt9ClcuSzcucHJv
+dG90eXBlPXt9ClcuckIucHJvdG90eXBlPXt9ClcuWFcucHJvdG90eXBlPXt9Clcub2EucHJvdG90eXBl
+PXt9ClAuaUoucHJvdG90eXBlPXsKVkgoYSl7dmFyIHMscj10aGlzLmEscT1yLmxlbmd0aApmb3Iocz0w
+O3M8cTsrK3MpaWYocltzXT09PWEpcmV0dXJuIHMKQy5ObS5pKHIsYSkKQy5ObS5pKHRoaXMuYixudWxs
+KQpyZXR1cm4gcX0sClB2KGEpe3ZhciBzLHIscSxwPXRoaXMsbz17fQppZihhPT1udWxsKXJldHVybiBh
+CmlmKEguclEoYSkpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKHR5cGVv
+ZiBhPT0ic3RyaW5nIilyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5pUClyZXR1cm4gbmV3IERhdGUo
+YS5hKQppZih0LmZ2LmIoYSkpdGhyb3cgSC5iKFAuU1koInN0cnVjdHVyZWQgY2xvbmUgb2YgUmVnRXhw
+IikpCmlmKHQuYzguYihhKSlyZXR1cm4gYQppZih0LncuYihhKSlyZXR1cm4gYQppZih0LkkuYihhKSly
+ZXR1cm4gYQpzPXQuZEUuYihhKXx8ITEKaWYocylyZXR1cm4gYQppZih0LmYuYihhKSl7cj1wLlZIKGEp
+CnM9cC5iCmlmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1vLmE9c1tyXQppZihxIT1udWxs
+KXJldHVybiBxCnE9e30Kby5hPXEKQy5ObS5ZNShzLHIscSkKYS5LKDAsbmV3IFAuRTIobyxwKSkKcmV0
+dXJuIG8uYX1pZih0LmouYihhKSl7cj1wLlZIKGEpCm89cC5iCmlmKHI+PW8ubGVuZ3RoKXJldHVybiBI
+Lk9IKG8scikKcT1vW3JdCmlmKHEhPW51bGwpcmV0dXJuIHEKcmV0dXJuIHAuZWsoYSxyKX1pZih0LmVI
+LmIoYSkpe3I9cC5WSChhKQpzPXAuYgppZihyPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLHIpCnE9by5i
+PXNbcl0KaWYocSE9bnVsbClyZXR1cm4gcQpxPXt9Cm8uYj1xCkMuTm0uWTUocyxyLHEpCnAuaW0oYSxu
+ZXcgUC5qZyhvLHApKQpyZXR1cm4gby5ifXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9m
+IG90aGVyIHR5cGUiKSl9LAplayhhLGIpe3ZhciBzLHI9Si5VNihhKSxxPXIuZ0EoYSkscD1uZXcgQXJy
+YXkocSkKQy5ObS5ZNSh0aGlzLmIsYixwKQpmb3Iocz0wO3M8cTsrK3MpQy5ObS5ZNShwLHMsdGhpcy5Q
+dihyLnEoYSxzKSkpCnJldHVybiBwfX0KUC5FMi5wcm90b3R5cGU9ewokMihhLGIpe3RoaXMuYS5hW2Fd
+PXRoaXMuYi5QdihiKX0sCiRTOjMxfQpQLmpnLnByb3RvdHlwZT17CiQyKGEsYil7dGhpcy5hLmJbYV09
+dGhpcy5iLlB2KGIpfSwKJFM6MzJ9ClAuQmYucHJvdG90eXBlPXsKaW0oYSxiKXt2YXIgcyxyLHEscAp0
+LmI4LmEoYikKZm9yKHM9T2JqZWN0LmtleXMoYSkscj1zLmxlbmd0aCxxPTA7cTxyOysrcSl7cD1zW3Fd
+CmIuJDIocCxhW3BdKX19fQpQLkFzLnByb3RvdHlwZT17ClYoYSl7dmFyIHMKSC5uKGEpCnM9JC5oRygp
+LmIKaWYocy50ZXN0KGEpKXJldHVybiBhCnRocm93IEguYihQLkwzKGEsInZhbHVlIiwiTm90IGEgdmFs
+aWQgY2xhc3MgdG9rZW4iKSl9LAp3KGEpe3JldHVybiB0aGlzLkQoKS5rKDAsIiAiKX0sCmdtKGEpe3Zh
+ciBzPXRoaXMuRCgpCnJldHVybiBQLnJqKHMscy5yLEguTGgocykuYyl9LApnbDAoYSl7cmV0dXJuIHRo
+aXMuRCgpLmE9PT0wfSwKZ29yKGEpe3JldHVybiB0aGlzLkQoKS5hIT09MH0sCmdBKGEpe3JldHVybiB0
+aGlzLkQoKS5hfSwKdGcoYSxiKXt0aGlzLlYoYikKcmV0dXJuIHRoaXMuRCgpLnRnKDAsYil9LAppKGEs
+Yil7dmFyIHMKSC5uKGIpCnRoaXMuVihiKQpzPXRoaXMuT1MobmV3IFAuR0UoYikpCnJldHVybiBILnA4
+KHM9PW51bGw/ITE6cyl9LApSKGEsYil7dmFyIHMscgppZih0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJu
+ITEKdGhpcy5WKGIpCnM9dGhpcy5EKCkKcj1zLlIoMCxiKQp0aGlzLlgocykKcmV0dXJuIHJ9LApGVihh
+LGIpe3RoaXMuT1MobmV3IFAuTjcodGhpcyx0Lk8uYShiKSkpfSwKZVIoYSxiKXt2YXIgcz10aGlzLkQo
+KQpyZXR1cm4gSC5iSyhzLGIsSC5MaChzKS5DKCJsZi5FIikpfSwKRShhLGIpe3JldHVybiB0aGlzLkQo
+KS5FKDAsYil9LApWMShhKXt0aGlzLk9TKG5ldyBQLnVRKCkpfSwKT1MoYSl7dmFyIHMscgp0LmJVLmEo
+YSkKcz10aGlzLkQoKQpyPWEuJDEocykKdGhpcy5YKHMpCnJldHVybiByfX0KUC5HRS5wcm90b3R5cGU9
+ewokMShhKXtyZXR1cm4gdC5DLmEoYSkuaSgwLHRoaXMuYSl9LAokUzozM30KUC5ONy5wcm90b3R5cGU9
+ewokMShhKXt2YXIgcz10aGlzLmIscj1ILnQ2KHMpCnJldHVybiB0LkMuYShhKS5GVigwLG5ldyBILmxK
+KHMsci5DKCJxVSgxKSIpLmEodGhpcy5hLmd1TSgpKSxyLkMoImxKPDEscVU+IikpKX0sCiRTOjEyfQpQ
+LnVRLnByb3RvdHlwZT17CiQxKGEpe3QuQy5hKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5m
+PW51bGwKYS5hPTAKYS5TKCl9cmV0dXJuIG51bGx9LAokUzoxMn0KUC5oRi5wcm90b3R5cGU9eyRpaEY6
+MX0KUC5EVi5wcm90b3R5cGU9ewokMShhKXt2YXIgcwp0LlkuYShhKQpzPWZ1bmN0aW9uKGIsYyxkKXty
+ZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBw
+bHkoYXJndW1lbnRzKSl9fShQLlI0LGEsITEpClAuRG0ocywkLnooKSxhKQpyZXR1cm4gc30sCiRTOjR9
+ClAuUEMucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0fQpQLlFTLnBy
+b3RvdHlwZT17CiQxKGEpe3JldHVybiBuZXcgUC5yNyh0LksuYShhKSl9LAokUzo0NH0KUC5ucC5wcm90
+b3R5cGU9ewokMShhKXtyZXR1cm4gbmV3IFAuVHoodC5LLmEoYSksdC5hbSl9LAokUzozNn0KUC5VdC5w
+cm90b3R5cGU9ewokMShhKXtyZXR1cm4gbmV3IFAuRTQodC5LLmEoYSkpfSwKJFM6Mzd9ClAuRTQucHJv
+dG90eXBlPXsKcShhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nIiYmdHlwZW9mIGIhPSJudW1iZXIiKXRo
+cm93IEguYihQLnhZKCJwcm9wZXJ0eSBpcyBub3QgYSBTdHJpbmcgb3IgbnVtIixudWxsKSkKcmV0dXJu
+IFAuZFUodGhpcy5hW2JdKX0sClk1KGEsYixjKXtpZih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBi
+IT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIs
+bnVsbCkpCnRoaXMuYVtiXT1QLndZKGMpfSwKRE4oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJldHVy
+biBiIGluc3RhbmNlb2YgUC5FNCYmdGhpcy5hPT09Yi5hfSwKdyhhKXt2YXIgcyxyCnRyeXtzPVN0cmlu
+Zyh0aGlzLmEpCnJldHVybiBzfWNhdGNoKHIpe0guUnUocikKcz10aGlzLnhiKDApCnJldHVybiBzfX0s
+ClY3KGEsYil7dmFyIHMscj10aGlzLmEKaWYoYj09bnVsbClzPW51bGwKZWxzZXtzPUgudDYoYikKcz1Q
+LlBXKG5ldyBILmxKKGIscy5DKCJAKDEpIikuYShQLmlHKCkpLHMuQygibEo8MSxAPiIpKSwhMCx0Lnop
+fXJldHVybiBQLmRVKHJbYV0uYXBwbHkocixzKSl9LApnaU8oYSl7cmV0dXJuIDB9fQpQLnI3LnByb3Rv
+dHlwZT17fQpQLlR6LnByb3RvdHlwZT17CmNQKGEpe3ZhciBzPXRoaXMscj1hPDB8fGE+PXMuZ0EocykK
+aWYocil0aHJvdyBILmIoUC5URShhLDAscy5nQShzKSxudWxsLG51bGwpKX0sCnEoYSxiKXtpZihILm9r
+KGIpKXRoaXMuY1AoYikKcmV0dXJuIHRoaXMuJHRpLmMuYSh0aGlzLlVyKDAsYikpfSwKWTUoYSxiLGMp
+e3RoaXMuY1AoYikKdGhpcy5iaCgwLGIsYyl9LApnQShhKXt2YXIgcz10aGlzLmEubGVuZ3RoCmlmKHR5
+cGVvZiBzPT09Im51bWJlciImJnM+Pj4wPT09cylyZXR1cm4gcwp0aHJvdyBILmIoUC5QVigiQmFkIEpz
+QXJyYXkgbGVuZ3RoIikpfSwKJGliUToxLAokaWNYOjEsCiRpek06MX0KUC52Zy5wcm90b3R5cGU9ewpZ
+NShhLGIsYyl7cmV0dXJuIHRoaXMuZTQoMCxiLGMpfX0KUC5uZC5wcm90b3R5cGU9eyRpbmQ6MX0KUC5L
+ZS5wcm90b3R5cGU9ewpEKCl7dmFyIHMscixxLHAsbz10aGlzLmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIp
+LG49UC5Mcyh0Lk4pCmlmKG89PW51bGwpcmV0dXJuIG4KZm9yKHM9by5zcGxpdCgiICIpLHI9cy5sZW5n
+dGgscT0wO3E8cjsrK3Epe3A9Si5UMChzW3FdKQppZihwLmxlbmd0aCE9PTApbi5pKDAscCl9cmV0dXJu
+IG59LApYKGEpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoImNsYXNzIixhLmsoMCwiICIpKX19ClAuaGkucHJv
+dG90eXBlPXsKZ1AoYSl7cmV0dXJuIG5ldyBQLktlKGEpfSwKc2hmKGEsYil7dGhpcy5ZQyhhLGIpfSwK
+cjYoYSxiLGMsZCl7dmFyIHMscixxLHAsbyxuCmlmKGQ9PW51bGwpe3M9SC5RSShbXSx0LnUpCmQ9bmV3
+IFcudkQocykKQy5ObS5pKHMsVy5UdyhudWxsKSkKQy5ObS5pKHMsVy5CbCgpKQpDLk5tLmkocyxuZXcg
+Vy5PdygpKX1jPW5ldyBXLktvKGQpCnI9JzxzdmcgdmVyc2lvbj0iMS4xIj4nK0guRWooYikrIjwvc3Zn
+PiIKcz1kb2N1bWVudApxPXMuYm9keQpxLnRvU3RyaW5nCnA9Qy5SWS5BSChxLHIsYykKbz1zLmNyZWF0
+ZURvY3VtZW50RnJhZ21lbnQoKQpzPW5ldyBXLmU3KHApCm49cy5ncjgocykKZm9yKDtzPW4uZmlyc3RD
+aGlsZCxzIT1udWxsOylvLmFwcGVuZENoaWxkKHMpCnJldHVybiBvfSwKbnooYSxiLGMsZCxlKXt0aHJv
+dyBILmIoUC5MNCgiQ2Fubm90IGludm9rZSBpbnNlcnRBZGphY2VudEh0bWwgb24gU1ZHLiIpKX0sCmdW
+bChhKXtyZXR1cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHQuUSl9LAokaWhpOjF9ClUuZDIucHJvdG90
+eXBlPXsKTHQoKXt2YXIgcyxyLHEscCxvPXRoaXMsbj10Lk4sbT10LlgsbD1QLkZsKG4sbSksaz1vLmEK
+aWYoayE9bnVsbCl7cz1ILlFJKFtdLHQuZCkKZm9yKHI9ay5sZW5ndGgscT0wO3E8ay5sZW5ndGg7ay5s
+ZW5ndGg9PT1yfHwoMCxILmxrKShrKSwrK3Epe3A9a1txXQpzLnB1c2goUC5FRihbImRlc2NyaXB0aW9u
+IixwLmEsImhyZWYiLHAuYl0sbixtKSl9bC5ZNSgwLCJlZGl0cyIscyl9bC5ZNSgwLCJleHBsYW5hdGlv
+biIsby5iKQpsLlk1KDAsImxpbmUiLG8uYykKbC5ZNSgwLCJkaXNwbGF5UGF0aCIsby5kKQpsLlk1KDAs
+InVyaVBhdGgiLG8uZSkKbj1vLmYKaWYobiE9bnVsbCl7bT1ILlFJKFtdLHQuZCkKZm9yKGs9bi5sZW5n
+dGgscT0wO3E8bi5sZW5ndGg7bi5sZW5ndGg9PT1rfHwoMCxILmxrKShuKSwrK3EpbS5wdXNoKG5bcV0u
+THQoKSkKbC5ZNSgwLCJ0cmFjZXMiLG0pfXJldHVybiBsfX0KVS5TZS5wcm90b3R5cGU9ewpMdCgpe3Jl
+dHVybiBQLkVGKFsiZGVzY3JpcHRpb24iLHRoaXMuYSwiaHJlZiIsdGhpcy5iXSx0Lk4sdC5YKX19ClUu
+TWwucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihbImhyZWYiLHRoaXMuYSwibGluZSIsdGhpcy5i
+LCJwYXRoIix0aGlzLmNdLHQuTix0LlgpfX0KVS55RC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxw
+PUguUUkoW10sdC5kKQpmb3Iocz10aGlzLmIscj1zLmxlbmd0aCxxPTA7cTxzLmxlbmd0aDtzLmxlbmd0
+aD09PXJ8fCgwLEgubGspKHMpLCsrcSlwLnB1c2goc1txXS5MdCgpKQpyZXR1cm4gUC5FRihbImRlc2Ny
+aXB0aW9uIix0aGlzLmEsImVudHJpZXMiLHBdLHQuTix0LlgpfX0KVS53Yi5wcm90b3R5cGU9ewpMdCgp
+e3ZhciBzLHIscSxwPXRoaXMsbz1QLkZsKHQuTix0LlgpCm8uWTUoMCwiZGVzY3JpcHRpb24iLHAuYSkK
+cz1wLmIKaWYocyE9bnVsbClvLlk1KDAsImZ1bmN0aW9uIixzKQpzPXAuYwppZihzIT1udWxsKW8uWTUo
+MCwibGluayIscy5MdCgpKQpzPXAuZAppZihzLmxlbmd0aCE9PTApe3I9SC50NihzKQpxPXIuQygibEo8
+MSxaMDxxVSxNaD8+PiIpCm8uWTUoMCwiaGludEFjdGlvbnMiLFAuWTEobmV3IEgubEoocyxyLkMoIlow
+PHFVLE1oPz4oMSkiKS5hKG5ldyBVLmIwKCkpLHEpLCEwLHEuQygiYUwuRSIpKSl9cmV0dXJuIG99fQpV
+LmFOLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBSLm56KHQuRy5hKGEpKX0sCiRTOjM4fQpVLmIwLnBy
+b3RvdHlwZT17CiQxKGEpe3JldHVybiB0LkouYShhKS5MdCgpfSwKJFM6Mzl9CkIuajgucHJvdG90eXBl
+PXsKTHQoKXtyZXR1cm4gUC5FRihbImxpbmUiLHRoaXMuYSwiZXhwbGFuYXRpb24iLHRoaXMuYiwib2Zm
+c2V0Iix0aGlzLmNdLHQuTix0LlgpfX0KQi5xcC5wcm90b3R5cGU9ewpMdCgpe3ZhciBzLHIscSxwLG8s
+bixtLGw9dGhpcyxrPXQuTixqPVAuRmwoayx0LkQpCmZvcihzPWwuZCxzPXMuZ1B1KHMpLHM9cy5nbShz
+KSxyPXQuWCxxPXQuZDtzLkYoKTspe3A9cy5nbCgpCm89cC5hCm49SC5RSShbXSxxKQpmb3IocD1KLklU
+KHAuYik7cC5GKCk7KXttPXAuZ2woKQpuLnB1c2goUC5FRihbImxpbmUiLG0uYSwiZXhwbGFuYXRpb24i
+LG0uYiwib2Zmc2V0IixtLmNdLGsscikpfWouWTUoMCxvLG4pfXJldHVybiBQLkVGKFsicmVnaW9ucyIs
+bC5hLCJuYXZpZ2F0aW9uQ29udGVudCIsbC5iLCJzb3VyY2VDb2RlIixsLmMsImVkaXRzIixqXSxrLHIp
+fX0KVC5tUS5wcm90b3R5cGU9e30KTC5lLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG8sbixt
+CnQuQi5hKGEpCnM9dC5GCnI9cy5hKHdpbmRvdy5sb2NhdGlvbikucGF0aG5hbWUKcT1MLkc2KHMuYSh3
+aW5kb3cubG9jYXRpb24pLmhyZWYpCnA9TC5hSyhzLmEod2luZG93LmxvY2F0aW9uKS5ocmVmKQpMLkdl
+KCkKaWYociE9PSIvIil7cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50
+CnMudG9TdHJpbmcKcz1yIT09Qy54Qi5iUyhzKX1lbHNlIHM9ITEKaWYocyl7ci50b1N0cmluZwpMLkc3
+KHIscSxwLCEwLG5ldyBMLlZXKHIscSxwKSl9cz1kb2N1bWVudApvPXMucXVlcnlTZWxlY3RvcigiLmFw
+cGx5LW1pZ3JhdGlvbiIpCm8udG9TdHJpbmcKbz1KLnFGKG8pCm49by4kdGkKbT1uLkMoIn4oMSk/Iiku
+YShuZXcgTC5vWigpKQp0LlouYShudWxsKQpXLkpFKG8uYSxvLmIsbSwhMSxuLmMpCm49cy5xdWVyeVNl
+bGVjdG9yKCIucmVydW4tbWlncmF0aW9uIikKbi50b1N0cmluZwpuPUoucUYobikKbT1uLiR0aQpXLkpF
+KG4uYSxuLmIsbS5DKCJ+KDEpPyIpLmEobmV3IEwueTgoKSksITEsbS5jKQptPXMucXVlcnlTZWxlY3Rv
+cigiLnJlcG9ydC1wcm9ibGVtIikKbS50b1N0cmluZwptPUoucUYobSkKbj1tLiR0aQpXLkpFKG0uYSxt
+LmIsbi5DKCJ+KDEpPyIpLmEobmV3IEwuSGkoKSksITEsbi5jKQpzPXMucXVlcnlTZWxlY3RvcigiLnBv
+cHVwLXBhbmUgLmNsb3NlIikKcy50b1N0cmluZwpzPUoucUYocykKbj1zLiR0aQpXLkpFKHMuYSxzLmIs
+bi5DKCJ+KDEpPyIpLmEobmV3IEwuQlQoKSksITEsbi5jKQpuPSQuYzAoKQpuLnRvU3RyaW5nCm49Si5x
+RihuKQpzPW4uJHRpClcuSkUobi5hLG4uYixzLkMoIn4oMSk/IikuYShuZXcgTC5QWSgpKSwhMSxzLmMp
+fSwKJFM6MTd9CkwuVlcucHJvdG90eXBlPXsKJDAoKXtMLkZyKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0s
+CiRTOjB9Ckwub1oucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMscixxLHAsbwp0LlYuYShhKQppZihDLm9s
+LnVzKHdpbmRvdywiVGhpcyB3aWxsIGFwcGx5IHRoZSBjaGFuZ2VzIHlvdSd2ZSBwcmV2aWV3ZWQgdG8g
+eW91ciB3b3JraW5nIGRpcmVjdG9yeS4gSXQgaXMgcmVjb21tZW5kZWQgeW91IGNvbW1pdCBhbnkgY2hh
+bmdlcyB5b3UgbWFkZSBiZWZvcmUgZG9pbmcgdGhpcy4iKSl7cz1ILlFJKFtdLHQuZCkKZm9yKHI9JC5J
+UixxPXIubGVuZ3RoLHA9MDtwPHIubGVuZ3RoO3IubGVuZ3RoPT09cXx8KDAsSC5saykociksKytwKXMu
+cHVzaChyW3BdLkx0KCkpCnM9TC50eSgiL2FwcGx5LW1pZ3JhdGlvbiIsUC5FRihbIm5hdmlnYXRpb25U
+cmVlIixzXSx0Lk4sdC5EKSkuVzcobmV3IEwuanIoKSx0LlApCm89bmV3IEwucWwoKQp0LmI3LmEobnVs
+bCkKcj1zLiR0aQpxPSQuWDMKaWYocSE9PUMuTlUpbz1QLlZIKG8scSkKcy54ZihuZXcgUC5GZShuZXcg
+UC52cyhxLHIpLDIsbnVsbCxvLHIuQygiQDwxPiIpLktxKHIuYykuQygiRmU8MSwyPiIpKSl9fSwKJFM6
+MX0KTC5qci5wcm90b3R5cGU9ewokMShhKXt2YXIgcwp0LmZuLmEoYSkKcz1kb2N1bWVudC5ib2R5CnMu
+Y2xhc3NMaXN0LnJlbW92ZSgicHJvcG9zZWQiKQpzLmNsYXNzTGlzdC5hZGQoImFwcGxpZWQiKX0sCiRT
+OjQyfQpMLnFsLnByb3RvdHlwZT17CiQyKGEsYil7TC5DMigiQ291bGRuJ3QgYXBwbHkgbWlncmF0aW9u
+Iix0LksuYShhKSxiKX0sCiRTOjQzfQpMLnk4LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiB0aGlzLnhu
+KHQuVi5hKGEpKX0sCnhuKGEpe3ZhciBzPTAscj1QLkZYKHQuSCkscT0xLHAsbz1bXSxuLG0sbCxrLGos
+aQp2YXIgJGFzeW5jJCQxPVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cD1jCnM9cX13aGlsZSh0
+cnVlKXN3aXRjaChzKXtjYXNlIDA6cT0zCmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgicmVydW5u
+aW5nIikKcz02CnJldHVybiBQLmpRKEwudHkoIi9yZXJ1bi1taWdyYXRpb24iLG51bGwpLCRhc3luYyQk
+MSkKY2FzZSA2Om49YwprPW4Kay50b1N0cmluZwppZihILnA4KEoueDkoaywic3VjY2VzcyIpKSl0LkYu
+YSh3aW5kb3cubG9jYXRpb24pLnJlbG9hZCgpCmVsc2UgTC5LMCh0LmV3LmEoSi54OShuLCJlcnJvcnMi
+KSkpCm8ucHVzaCg1KQpzPTQKYnJlYWsKY2FzZSAzOnE9MgppPXAKbT1ILlJ1KGkpCmw9SC50cyhpKQpM
+LkMyKCJGYWlsZWQgdG8gcmVydW4gbWlncmF0aW9uIixtLGwpCm8ucHVzaCg1KQpzPTQKYnJlYWsKY2Fz
+ZSAyOm89WzFdCmNhc2UgNDpxPTEKZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJyZXJ1bm5p
+bmciKQpzPW8ucG9wKCkKYnJlYWsKY2FzZSA1OnJldHVybiBQLnlDKG51bGwscikKY2FzZSAxOnJldHVy
+biBQLmYzKHAscil9fSkKcmV0dXJuIFAuREkoJGFzeW5jJCQxLHIpfSwKJFM6N30KTC5IaS5wcm90b3R5
+cGU9ewokMShhKXt0LlYuYShhKQpDLm9sLlBvKHdpbmRvdyxQLlhkKCJodHRwcyIsImdpdGh1Yi5jb20i
+LCJkYXJ0LWxhbmcvc2RrL2lzc3Vlcy9uZXciLFAuRUYoWyJ0aXRsZSIsIkN1c3RvbWVyLXJlcG9ydGVk
+IGlzc3VlIHdpdGggTk5CRCBtaWdyYXRpb24gdG9vbCIsImxhYmVscyIsdS5kLCJib2R5IiwiIyMjIyBT
+dGVwcyB0byByZXByb2R1Y2VcblxuIyMjIyBXaGF0IGRpZCB5b3UgZXhwZWN0IHRvIGhhcHBlbj9cblxu
+IyMjIyBXaGF0IGFjdHVhbGx5IGhhcHBlbmVkP1xuXG5fU2NyZWVuc2hvdHMgYXJlIGFwcHJlY2lhdGVk
+X1xuXG4qKkRhcnQgU0RLIHZlcnNpb24qKjogIitILkVqKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJz
+ZGstdmVyc2lvbiIpLnRleHRDb250ZW50KSsiXG5cblRoYW5rcyBmb3IgZmlsaW5nIVxuIl0sdC5OLHQu
+eikpLmduRCgpLCJyZXBvcnQtcHJvYmxlbSIpfSwKJFM6MX0KTC5CVC5wcm90b3R5cGU9ewokMShhKXt2
+YXIgcwp0LlYuYShhKQpzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wb3B1cC1wYW5lIikuc3R5bGUK
+cy5kaXNwbGF5PSJub25lIgpyZXR1cm4ibm9uZSJ9LAokUzoxfQpMLlBZLnByb3RvdHlwZT17CiQxKGEp
+e3ZhciBzLHIscSxwLG8KdC5WLmEoYSkKcz0kLkQ5KCkuaW5uZXJUZXh0CnI9dC5oLmEoZG9jdW1lbnQu
+cXVlcnlTZWxlY3RvcignLm5hdi1wYW5lbCBbZGF0YS1uYW1lKj0iJytXLkxqKHMpKyciXScpLnBhcmVu
+dE5vZGUpCnE9ci5xdWVyeVNlbGVjdG9yKCIuc3RhdHVzLWljb24iKQpwPSQuSVIKcC50b1N0cmluZwpv
+PUwueXcocCxzKQppZihvIGluc3RhbmNlb2YgTC5jRCl7cD1vLngKcC50b1N0cmluZ31lbHNlIHA9ITEK
+aWYocCl7TC5PdChvKQpMLnhuKHEsbykKTC5BUihyLG8pfX0sCiRTOjF9CkwuTC5wcm90b3R5cGU9ewok
+MShhKXt2YXIgcyxyLHEscAp0LkIuYShhKQpzPXQuRgpyPXMuYSh3aW5kb3cubG9jYXRpb24pLnBhdGhu
+YW1lCnIudG9TdHJpbmcKcT1MLkc2KHMuYSh3aW5kb3cubG9jYXRpb24pLmhyZWYpCnA9TC5hSyhzLmEo
+d2luZG93LmxvY2F0aW9uKS5ocmVmKQppZihyLmxlbmd0aD4xKUwuRzcocixxLHAsITEsbnVsbCkKZWxz
+ZXtMLkJFKHIsQi53UigpLCEwKQpMLkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE3fQpMLld4LnByb3Rv
+dHlwZT17CiQxKGEpe3ZhciBzLHIscSxwLG89ImNvbGxhcHNlZCIKdC5WLmEoYSkKcz10aGlzLmEKcj1K
+LllFKHMpCnE9dGhpcy5iCnA9Si5ZRShxKQppZighci5nUChzKS50ZygwLG8pKXtyLmdQKHMpLmkoMCxv
+KQpwLmdQKHEpLmkoMCxvKX1lbHNle3IuZ1AocykuUigwLG8pCnAuZ1AocSkuUigwLG8pfX0sCiRTOjF9
+CkwuSG8ucHJvdG90eXBlPXsKJDEoYSl7dmFyIHM9Si5xRih0LmguYShhKSkscj1zLiR0aSxxPXIuQygi
+figxKT8iKS5hKG5ldyBMLmROKHRoaXMuYSkpCnQuWi5hKG51bGwpClcuSkUocy5hLHMuYixxLCExLHIu
+Yyl9LAokUzozfQpMLmROLnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBMLnQyKHQuVi5hKGEpLHRoaXMu
+YSl9LAokUzoxfQpMLklDLnByb3RvdHlwZT17CiQxKGEpe3ZhciBzLHIscQp0LmguYShhKQpzPUoucUYo
+YSkKcj1zLiR0aQpxPXIuQygifigxKT8iKS5hKG5ldyBMLnh6KGEsdGhpcy5hKSkKdC5aLmEobnVsbCkK
+Vy5KRShzLmEscy5iLHEsITEsci5jKX0sCiRTOjN9CkwueHoucHJvdG90eXBlPXsKJDEoYSl7dmFyIHMs
+cixxLHAKdC5WLmEoYSkKcz10aGlzLmEKcj1zLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5l
+dyBXLmk3KHMpKS5PVSgib2Zmc2V0IikpCnIudG9TdHJpbmcKcT1QLlFBKHIsbnVsbCkKcz1zLmdldEF0
+dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KHMpKS5PVSgibGluZSIpKQpzLnRvU3RyaW5n
+CnA9UC5RQShzLG51bGwpCnM9dGhpcy5iCnMudG9TdHJpbmcKTC5oWChzLHEscCl9LAokUzoxfQpMLkJO
+LnByb3RvdHlwZT17CiQxKGEpe3ZhciBzPUoucUYodC5oLmEoYSkpLHI9cy4kdGkKci5DKCJ+KDEpPyIp
+LmEoTC5pUygpKQp0LlouYShudWxsKQpXLkpFKHMuYSxzLmIsTC5pUygpLCExLHIuYyl9LAokUzozfQpM
+LmZDLnByb3RvdHlwZT17CiQxKGEpe3QucC5hKGEpCnRoaXMuYS5hTSgwLHRoaXMuYil9LAokUzo0Nn0K
+TC5UbS5wcm90b3R5cGU9ewokMShhKXtILm4oYSkKcmV0dXJuIGEubGVuZ3RoPjQwP0MueEIuTmooYSww
+LDQwKSsiLi4uIjphfSwKJFM6Mn0KTC5uVC5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLHRoaXMu
+Yix0aGlzLmMpfSwKJFM6MH0KTC5OWS5wcm90b3R5cGU9ewokMCgpe0wuRnIodGhpcy5hLG51bGwsbnVs
+bCl9LAokUzowfQpMLnVlLnByb3RvdHlwZT17CiQxKGEpe3QuZi5hKGEpCnJldHVybiBILkVqKGEucSgw
+LCJzZXZlcml0eSIpKSsiIC0gIitILkVqKGEucSgwLCJtZXNzYWdlIikpKyIgYXQgIitILkVqKGEucSgw
+LCJsb2NhdGlvbiIpKSsiIC0gKCIrSC5FaihhLnEoMCwiY29kZSIpKSsiKSJ9LAokUzo0N30KTC5HSC5w
+cm90b3R5cGU9ewokMShhKXt0LmguYShhKQokLnpCKCkKdC5lcy5hKCQub3coKS5xKDAsImhsanMiKSku
+VjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6M30KTC5FRS5wcm90b3R5cGU9ewokMShhKXt2YXIg
+cyxyCnQuVi5hKGEpLnByZXZlbnREZWZhdWx0KCkKcz10aGlzLmEKcj10aGlzLmIKTC5hZih0LkYuYSh3
+aW5kb3cubG9jYXRpb24pLnBhdGhuYW1lLHMsciwhMCxuZXcgTC5RTChzLHIpKQpMLmhYKHRoaXMuYyxz
+LHIpfSwKJFM6MX0KTC5RTC5wcm90b3R5cGU9ewokMCgpe0wuRnIodC5GLmEod2luZG93LmxvY2F0aW9u
+KS5wYXRobmFtZSx0aGlzLmEsdGhpcy5iKX0sCiRTOjB9CkwuVlMucHJvdG90eXBlPXsKJDEoYSl7dmFy
+IHMscj0ic2VsZWN0ZWQtZmlsZSIKdC5oLmEoYSkKcz1KLllFKGEpCmlmKGEuZ2V0QXR0cmlidXRlKCJk
+YXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoYSkpLk9VKCJuYW1lIikpPT09dGhpcy5hLmEpcy5nUChhKS5p
+KDAscikKZWxzZSBzLmdQKGEpLlIoMCxyKX0sCiRTOjN9CkwuVEQucHJvdG90eXBlPXsKJDEoYSl7dmFy
+IHMscgp0LlYuYShhKQpzPXRoaXMuYQpzd2l0Y2gocy5nTCgpKXtjYXNlIEMuY3c6YnJlYWsKY2FzZSBD
+LldEOnMubkcoKQpicmVhawpjYXNlIEMuWGo6cy5jMigpCmJyZWFrCmNhc2UgQy5kYzpzLmMyKCkKYnJl
+YWt9cj10aGlzLmIKTC5iTChyLHMpCkwueG4odGhpcy5jLHMpCkwuQVIocixzKX0sCiRTOjF9CkwuSWYu
+cHJvdG90eXBlPXsKJDEoYSl7dmFyIHMKdC5WLmEoYSkKcz10aGlzLmEKTC5PdChzKQpMLnhuKHRoaXMu
+YixzKQpMLkFSKHRoaXMuYyxzKX0sCiRTOjF9CkwudEIucHJvdG90eXBlPXsKJDEoYSl7cmV0dXJuIEwu
+dDIodC5WLmEoYSksITApfSwKJFM6MX0KTC5tMi5wcm90b3R5cGU9ewokMShhKXtyZXR1cm4gdGhpcy5S
+SSh0LlYuYShhKSl9LApSSShhKXt2YXIgcz0wLHI9UC5GWCh0LkgpLHE9MSxwLG89W10sbj10aGlzLG0s
+bCxrLGosaSxoLGcsZixlCnZhciAkYXN5bmMkJDE9UC5seihmdW5jdGlvbihiLGMpe2lmKGI9PT0xKXtw
+PWMKcz1xfXdoaWxlKHRydWUpc3dpdGNoKHMpe2Nhc2UgMDpxPTMKaT1kb2N1bWVudAptPUMuQ0QuelEo
+aS5xdWVyeVNlbGVjdG9yKCIuY29udGVudCIpLnNjcm9sbFRvcCkKaD10Lk4Kcz02CnJldHVybiBQLmpR
+KEwudHkoTC5RNCgiL2FwcGx5LWhpbnQiLFAuRmwoaCxoKSksbi5hLkx0KCkpLCRhc3luYyQkMSkKY2Fz
+ZSA2Omg9bi5iCmc9aC5hCmcudG9TdHJpbmcKbD1MLlVzKGcpCnM9NwpyZXR1cm4gUC5qUShMLkc3KGws
+bnVsbCxoLmIsITEsbnVsbCksJGFzeW5jJCQxKQpjYXNlIDc6aS5ib2R5LmNsYXNzTGlzdC5hZGQoIm5l
+ZWRzLXJlcnVuIikKaT1pLnF1ZXJ5U2VsZWN0b3IoIi5jb250ZW50IikKaS50b1N0cmluZwppLnNjcm9s
+bFRvcD1DLmpuLnpRKG0pCnE9MQpzPTUKYnJlYWsKY2FzZSAzOnE9MgplPXAKaz1ILlJ1KGUpCmo9SC50
+cyhlKQpMLkMyKCJjb3VsZG4ndCBhcHBseSBoaW50IixrLGopCnM9NQpicmVhawpjYXNlIDI6cz0xCmJy
+ZWFrCmNhc2UgNTpyZXR1cm4gUC55QyhudWxsLHIpCmNhc2UgMTpyZXR1cm4gUC5mMyhwLHIpfX0pCnJl
+dHVybiBQLkRJKCRhc3luYyQkMSxyKX0sCiRTOjd9CkwuUVcucHJvdG90eXBlPXsKdyhhKXtyZXR1cm4g
+dGhpcy5hKyI6XG4iK3RoaXMuYn0sCiRpUno6MX0KTC5YQS5wcm90b3R5cGU9ewpFYihhLGIsYyl7cmV0
+dXJuITB9LAppMChhKXtyZXR1cm4hMH0sCiRpa0Y6MX0KTC52dC5wcm90b3R5cGU9ewpnTCgpe3ZhciBz
+LHIscSxwLG8sbixtLGw9dGhpcy5kCmlmKGwubGVuZ3RoPT09MClyZXR1cm4gQy5jdwpzPUMuTm0uZ3RI
+KGwpLmdMKCkKZm9yKHI9bC5sZW5ndGgscT0hMCxwPSEwLG89MDtvPGwubGVuZ3RoO2wubGVuZ3RoPT09
+cnx8KDAsSC5saykobCksKytvKXtuPWxbb10uZ0woKQppZihuIT1zKXM9bnVsbAptPW4hPT1DLmN3Cmlm
+KG0mJm4hPT1DLldEKXE9ITEKaWYobSYmbiE9PUMuWGopcD0hMX1pZihzIT1udWxsKXJldHVybiBzCmlm
+KHEpcmV0dXJuIEMuV0QKaWYocClyZXR1cm4gQy5YagpyZXR1cm4gQy5kY30sCkxWKCl7dmFyIHMscixx
+LHA9dGhpcy5kCmlmKHAhPW51bGwpZm9yKHM9cC5sZW5ndGgscj0wO3I8czsrK3Ipe3E9cFtyXQppZihx
+LmI9PT0kKXEuYj10aGlzCmVsc2UgSC52KG5ldyBILmMoIkZpZWxkICdwYXJlbnQnIGhhcyBhbHJlYWR5
+IGJlZW4gaW5pdGlhbGl6ZWQuIikpfX0sCmMyKCl7dmFyIHMscixxLHAsbwpmb3Iocz10aGlzLmQscj1z
+Lmxlbmd0aCxxPTA7cTxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgwLEgubGspKHMpLCsrcSl7cD1zW3Fd
+CmlmKHAgaW5zdGFuY2VvZiBMLnZ0KXAuYzIoKQplbHNle2lmKHAgaW5zdGFuY2VvZiBMLmNEKXtvPXAu
+eApvLnRvU3RyaW5nCm89byYmcC5yPT09Qy5Yan1lbHNlIG89ITEKaWYobylwLnI9Qy5XRH19fSwKbkco
+KXt2YXIgcyxyLHEscCxvCmZvcihzPXRoaXMuZCxyPXMubGVuZ3RoLHE9MDtxPHMubGVuZ3RoO3MubGVu
+Z3RoPT09cnx8KDAsSC5saykocyksKytxKXtwPXNbcV0KaWYocCBpbnN0YW5jZW9mIEwudnQpcC5uRygp
+CmVsc2V7aWYocCBpbnN0YW5jZW9mIEwuY0Qpe289cC54Cm8udG9TdHJpbmcKbz1vJiZwLnI9PT1DLldE
+fWVsc2Ugbz0hMQppZihvKXAucj1DLlhqfX19LApMdCgpe3ZhciBzLHI9UC5GbCh0Lk4sdC5YKQpyLlk1
+KDAsInR5cGUiLCJkaXJlY3RvcnkiKQpyLlk1KDAsIm5hbWUiLHRoaXMuYSkKcz10aGlzLmQKcy50b1N0
+cmluZwpyLlk1KDAsInN1YnRyZWUiLEwuVkQocykpCnM9dGhpcy5jCmlmKHMhPW51bGwpci5ZNSgwLCJw
+YXRoIixzKQpyZXR1cm4gcn19CkwuY0QucHJvdG90eXBlPXsKTHQoKXt2YXIgcyxyPXRoaXMscT1QLkZs
+KHQuTix0LlgpCnEuWTUoMCwidHlwZSIsImZpbGUiKQpxLlk1KDAsIm5hbWUiLHIuYSkKcz1yLmMKaWYo
+cyE9bnVsbClxLlk1KDAsInBhdGgiLHMpCnM9ci5kCmlmKHMhPW51bGwpcS5ZNSgwLCJocmVmIixzKQpz
+PXIuZQppZihzIT1udWxsKXEuWTUoMCwiZWRpdENvdW50IixzKQpzPXIuZgppZihzIT1udWxsKXEuWTUo
+MCwid2FzRXhwbGljaXRseU9wdGVkT3V0IixzKQpzPXIucgppZihzIT1udWxsKXEuWTUoMCwibWlncmF0
+aW9uU3RhdHVzIixzLmEpCnM9ci54CmlmKHMhPW51bGwpcS5ZNSgwLCJtaWdyYXRpb25TdGF0dXNDYW5C
+ZUNoYW5nZWQiLHMpCnJldHVybiBxfSwKZ0woKXtyZXR1cm4gdGhpcy5yfX0KTC5EOC5wcm90b3R5cGU9
+e30KTC5POS5wcm90b3R5cGU9ewp3KGEpe3JldHVybiB0aGlzLmJ9fQpMLkdiLnByb3RvdHlwZT17Cnco
+YSl7cmV0dXJuIHRoaXMuYn19ClIuTEwucHJvdG90eXBlPXsKTHQoKXtyZXR1cm4gUC5FRihbIm5vZGVJ
+ZCIsdGhpcy5iLCJraW5kIix0aGlzLmEuYV0sdC5OLHQuWCl9fQpSLk1ELnByb3RvdHlwZT17CiQxKGEp
+e3JldHVybiB0LmdwLmEoYSkuYT09PXRoaXMuYS5xKDAsImtpbmQiKX0sCiRTOjQ4fQpSLkg3LnByb3Rv
+dHlwZT17CncoYSl7cmV0dXJuIHRoaXMuYn19Ck0ubEkucHJvdG90eXBlPXsKV08oYSxiKXt2YXIgcyxy
+LHE9dC5kNApNLllGKCJhYnNvbHV0ZSIsSC5RSShbYixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVs
+bF0scSkpCnM9dGhpcy5hCnM9cy5ZcihiKT4wJiYhcy5oSyhiKQppZihzKXJldHVybiBiCnM9RC5hYigp
+CnI9SC5RSShbcyxiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxxKQpNLllGKCJqb2luIixy
+KQpyZXR1cm4gdGhpcy5JUChuZXcgSC51NihyLHQuZUopKX0sCnpmKGEpe3ZhciBzLHIscT1YLkNMKGEs
+dGhpcy5hKQpxLkl4KCkKcz1xLmQKcj1zLmxlbmd0aAppZihyPT09MCl7cz1xLmIKcmV0dXJuIHM9PW51
+bGw/Ii4iOnN9aWYocj09PTEpe3M9cS5iCnJldHVybiBzPT1udWxsPyIuIjpzfWlmKDA+PXIpcmV0dXJu
+IEguT0gocywtMSkKcy5wb3AoKQpzPXEuZQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpz
+LnBvcCgpCnEuSXgoKQpyZXR1cm4gcS53KDApfSwKSVAoYSl7dmFyIHMscixxLHAsbyxuLG0sbCxrLGoK
+dC5PLmEoYSkKZm9yKHM9YS4kdGkscj1zLkMoImEyKGNYLkUpIikuYShuZXcgTS5xNygpKSxxPWEuZ20o
+YSkscz1uZXcgSC5TTyhxLHIscy5DKCJTTzxjWC5FPiIpKSxyPXRoaXMuYSxwPSExLG89ITEsbj0iIjtz
+LkYoKTspe209cS5nbCgpCmlmKHIuaEsobSkmJm8pe2w9WC5DTChtLHIpCms9bi5jaGFyQ29kZUF0KDAp
+PT0wP246bgpuPUMueEIuTmooaywwLHIuU3AoaywhMCkpCmwuYj1uCmlmKHIuZHMobikpQy5ObS5ZNShs
+LmUsMCxyLmdtSSgpKQpuPSIiK2wudygwKX1lbHNlIGlmKHIuWXIobSk+MCl7bz0hci5oSyhtKQpuPSIi
+K219ZWxzZXtqPW0ubGVuZ3RoCmlmKGohPT0wKXtpZigwPj1qKXJldHVybiBILk9IKG0sMCkKaj1yLlVk
+KG1bMF0pfWVsc2Ugaj0hMQppZighailpZihwKW4rPXIuZ21JKCkKbis9bX1wPXIuZHMobSl9cmV0dXJu
+IG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApvNShhKXt2YXIgcwppZighdGhpcy55MyhhKSlyZXR1cm4g
+YQpzPVguQ0woYSx0aGlzLmEpCnMuclIoKQpyZXR1cm4gcy53KDApfSwKeTMoYSl7dmFyIHMscixxLHAs
+byxuLG0sbCxrPXRoaXMuYSxqPWsuWXIoYSkKaWYoaiE9PTApe2lmKGs9PT0kLktrKCkpZm9yKHM9MDtz
+PGo7KytzKWlmKEMueEIuVyhhLHMpPT09NDcpcmV0dXJuITAKcj1qCnE9NDd9ZWxzZXtyPTAKcT1udWxs
+fWZvcihwPW5ldyBILnFqKGEpLmEsbz1wLmxlbmd0aCxzPXIsbj1udWxsO3M8bzsrK3Msbj1xLHE9bSl7
+bT1DLnhCLk8ocCxzKQppZihrLnI0KG0pKXtpZihrPT09JC5LaygpJiZtPT09NDcpcmV0dXJuITAKaWYo
+cSE9bnVsbCYmay5yNChxKSlyZXR1cm4hMAppZihxPT09NDYpbD1uPT1udWxsfHxuPT09NDZ8fGsucjQo
+bikKZWxzZSBsPSExCmlmKGwpcmV0dXJuITB9fWlmKHE9PW51bGwpcmV0dXJuITAKaWYoay5yNChxKSly
+ZXR1cm4hMAppZihxPT09NDYpaz1uPT1udWxsfHxrLnI0KG4pfHxuPT09NDYKZWxzZSBrPSExCmlmKGsp
+cmV0dXJuITAKcmV0dXJuITF9LApIUChhLGIpe3ZhciBzLHIscSxwLG8sbixtLGw9dGhpcyxrPSdVbmFi
+bGUgdG8gZmluZCBhIHBhdGggdG8gIicKYj1sLldPKDAsYikKcz1sLmEKaWYocy5ZcihiKTw9MCYmcy5Z
+cihhKT4wKXJldHVybiBsLm81KGEpCmlmKHMuWXIoYSk8PTB8fHMuaEsoYSkpYT1sLldPKDAsYSkKaWYo
+cy5ZcihhKTw9MCYmcy5ZcihiKT4wKXRocm93IEguYihYLkk3KGsrYSsnIiBmcm9tICInK2IrJyIuJykp
+CnI9WC5DTChiLHMpCnIuclIoKQpxPVguQ0woYSxzKQpxLnJSKCkKcD1yLmQKbz1wLmxlbmd0aAppZihv
+IT09MCl7aWYoMD49bylyZXR1cm4gSC5PSChwLDApCnA9Si5STShwWzBdLCIuIil9ZWxzZSBwPSExCmlm
+KHApcmV0dXJuIHEudygwKQpwPXIuYgpvPXEuYgppZihwIT1vKXA9cD09bnVsbHx8bz09bnVsbHx8IXMu
+TmMocCxvKQplbHNlIHA9ITEKaWYocClyZXR1cm4gcS53KDApCndoaWxlKCEwKXtwPXIuZApvPXAubGVu
+Z3RoCmlmKG8hPT0wKXtuPXEuZAptPW4ubGVuZ3RoCmlmKG0hPT0wKXtpZigwPj1vKXJldHVybiBILk9I
+KHAsMCkKcD1wWzBdCmlmKDA+PW0pcmV0dXJuIEguT0gobiwwKQpuPXMuTmMocCxuWzBdKQpwPW59ZWxz
+ZSBwPSExfWVsc2UgcD0hMQppZighcClicmVhawpDLk5tLlc0KHIuZCwwKQpDLk5tLlc0KHIuZSwxKQpD
+Lk5tLlc0KHEuZCwwKQpDLk5tLlc0KHEuZSwxKX1wPXIuZApvPXAubGVuZ3RoCmlmKG8hPT0wKXtpZigw
+Pj1vKXJldHVybiBILk9IKHAsMCkKcD1KLlJNKHBbMF0sIi4uIil9ZWxzZSBwPSExCmlmKHApdGhyb3cg
+SC5iKFguSTcoaythKyciIGZyb20gIicrYisnIi4nKSkKcD10Lk4KQy5ObS5VRyhxLmQsMCxQLk84KHIu
+ZC5sZW5ndGgsIi4uIiwhMSxwKSkKQy5ObS5ZNShxLmUsMCwiIikKQy5ObS5VRyhxLmUsMSxQLk84KHIu
+ZC5sZW5ndGgscy5nbUkoKSwhMSxwKSkKcz1xLmQKcD1zLmxlbmd0aAppZihwPT09MClyZXR1cm4iLiIK
+aWYocD4xJiZKLlJNKEMuTm0uZ3JaKHMpLCIuIikpe3M9cS5kCmlmKDA+PXMubGVuZ3RoKXJldHVybiBI
+Lk9IKHMsLTEpCnMucG9wKCkKcz1xLmUKaWYoMD49cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5w
+b3AoKQppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLC0xKQpzLnBvcCgpCkMuTm0uaShzLCIiKX1x
+LmI9IiIKcS5JeCgpCnJldHVybiBxLncoMCl9fQpNLnE3LnByb3RvdHlwZT17CiQxKGEpe3JldHVybiBI
+Lm4oYSkhPT0iIn0sCiRTOjZ9Ck0uTm8ucHJvdG90eXBlPXsKJDEoYSl7SC5rKGEpCnJldHVybiBhPT1u
+dWxsPyJudWxsIjonIicrYSsnIid9LAokUzo0OX0KQi5mdi5wcm90b3R5cGU9ewp4WihhKXt2YXIgcyxy
+PXRoaXMuWXIoYSkKaWYocj4wKXJldHVybiBDLnhCLk5qKGEsMCxyKQppZih0aGlzLmhLKGEpKXtpZigw
+Pj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLDApCnM9YVswXX1lbHNlIHM9bnVsbApyZXR1cm4gc30sCk5j
+KGEsYil7cmV0dXJuIGE9PT1ifX0KWC5XRC5wcm90b3R5cGU9ewpJeCgpe3ZhciBzLHIscT10aGlzCndo
+aWxlKCEwKXtzPXEuZAppZighKHMubGVuZ3RoIT09MCYmSi5STShDLk5tLmdyWihzKSwiIikpKWJyZWFr
+CnM9cS5kCmlmKDA+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsLTEpCnMucG9wKCkKcz1xLmUKaWYoMD49
+cy5sZW5ndGgpcmV0dXJuIEguT0gocywtMSkKcy5wb3AoKX1zPXEuZQpyPXMubGVuZ3RoCmlmKHIhPT0w
+KUMuTm0uWTUocyxyLTEsIiIpfSwKclIoKXt2YXIgcyxyLHEscCxvLG4sbT10aGlzLGw9SC5RSShbXSx0
+LnMpCmZvcihzPW0uZCxyPXMubGVuZ3RoLHE9MCxwPTA7cDxzLmxlbmd0aDtzLmxlbmd0aD09PXJ8fCgw
+LEgubGspKHMpLCsrcCl7bz1zW3BdCm49Si5pYShvKQppZighKG4uRE4obywiLiIpfHxuLkROKG8sIiIp
+KSlpZihuLkROKG8sIi4uIikpe249bC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0go
+bCwtMSkKbC5wb3AoKX1lbHNlICsrcX1lbHNlIEMuTm0uaShsLG8pfWlmKG0uYj09bnVsbClDLk5tLlVH
+KGwsMCxQLk84KHEsIi4uIiwhMSx0Lk4pKQppZihsLmxlbmd0aD09PTAmJm0uYj09bnVsbClDLk5tLmko
+bCwiLiIpCm0uc25KKGwpCnM9bS5hCm0uc1BoKFAuTzgobC5sZW5ndGgrMSxzLmdtSSgpLCEwLHQuTikp
+CnI9bS5iCmlmKHI9PW51bGx8fGwubGVuZ3RoPT09MHx8IXMuZHMocikpQy5ObS5ZNShtLmUsMCwiIikK
+cj1tLmIKaWYociE9bnVsbCYmcz09PSQuS2soKSl7ci50b1N0cmluZwptLmI9SC55cyhyLCIvIiwiXFwi
+KX1tLkl4KCl9LAp3KGEpe3ZhciBzLHIscT10aGlzLHA9cS5iCnA9cCE9bnVsbD8iIitwOiIiCmZvcihz
+PTA7czxxLmQubGVuZ3RoOysrcyl7cj1xLmUKaWYocz49ci5sZW5ndGgpcmV0dXJuIEguT0gocixzKQpy
+PXArSC5FaihyW3NdKQpwPXEuZAppZihzPj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnA9citILkVq
+KHBbc10pfXArPUguRWooQy5ObS5ncloocS5lKSkKcmV0dXJuIHAuY2hhckNvZGVBdCgwKT09MD9wOnB9
+LApzbkooYSl7dGhpcy5kPXQuRS5hKGEpfSwKc1BoKGEpe3RoaXMuZT10LkUuYShhKX19ClguZHYucHJv
+dG90eXBlPXsKdyhhKXtyZXR1cm4iUGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9LAokaVJ6OjF9Ck8uekwu
+cHJvdG90eXBlPXsKdyhhKXtyZXR1cm4gdGhpcy5nb2ModGhpcyl9fQpFLk9GLnByb3RvdHlwZT17ClVk
+KGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0sCnI0KGEpe3JldHVybiBhPT09NDd9LApkcyhhKXt2YXIg
+cz1hLmxlbmd0aApyZXR1cm4gcyE9PTAmJkMueEIuTyhhLHMtMSkhPT00N30sClNwKGEsYil7aWYoYS5s
+ZW5ndGghPT0wJiZDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCnJldHVybiAwfSwKWXIoYSl7cmV0dXJu
+IHRoaXMuU3AoYSwhMSl9LApoSyhhKXtyZXR1cm4hMX0sCmdvYygpe3JldHVybiJwb3NpeCJ9LApnbUko
+KXtyZXR1cm4iLyJ9fQpGLnJ1LnByb3RvdHlwZT17ClVkKGEpe3JldHVybiBDLnhCLnRnKGEsIi8iKX0s
+CnI0KGEpe3JldHVybiBhPT09NDd9LApkcyhhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4h
+MQppZihDLnhCLk8oYSxzLTEpIT09NDcpcmV0dXJuITAKcmV0dXJuIEMueEIuVGMoYSwiOi8vIikmJnRo
+aXMuWXIoYSk9PT1zfSwKU3AoYSxiKXt2YXIgcyxyLHEscCxvPWEubGVuZ3RoCmlmKG89PT0wKXJldHVy
+biAwCmlmKEMueEIuVyhhLDApPT09NDcpcmV0dXJuIDEKZm9yKHM9MDtzPG87KytzKXtyPUMueEIuVyhh
+LHMpCmlmKHI9PT00NylyZXR1cm4gMAppZihyPT09NTgpe2lmKHM9PT0wKXJldHVybiAwCnE9Qy54Qi5Y
+VShhLCIvIixDLnhCLlFpKGEsIi8vIixzKzEpP3MrMzpzKQppZihxPD0wKXJldHVybiBvCmlmKCFifHxv
+PHErMylyZXR1cm4gcQppZighQy54Qi5uKGEsImZpbGU6Ly8iKSlyZXR1cm4gcQppZighQi5ZdShhLHEr
+MSkpcmV0dXJuIHEKcD1xKzMKcmV0dXJuIG89PT1wP3A6cSs0fX1yZXR1cm4gMH0sCllyKGEpe3JldHVy
+biB0aGlzLlNwKGEsITEpfSwKaEsoYSl7cmV0dXJuIGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00
+N30sCmdvYygpe3JldHVybiJ1cmwifSwKZ21JKCl7cmV0dXJuIi8ifX0KTC5JVi5wcm90b3R5cGU9ewpV
+ZChhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNChhKXtyZXR1cm4gYT09PTQ3fHxhPT09OTJ9LApk
+cyhhKXt2YXIgcz1hLmxlbmd0aAppZihzPT09MClyZXR1cm4hMQpzPUMueEIuTyhhLHMtMSkKcmV0dXJu
+IShzPT09NDd8fHM9PT05Mil9LApTcChhLGIpe3ZhciBzLHIscT1hLmxlbmd0aAppZihxPT09MClyZXR1
+cm4gMApzPUMueEIuVyhhLDApCmlmKHM9PT00NylyZXR1cm4gMQppZihzPT09OTIpe2lmKHE8Mnx8Qy54
+Qi5XKGEsMSkhPT05MilyZXR1cm4gMQpyPUMueEIuWFUoYSwiXFwiLDIpCmlmKHI+MCl7cj1DLnhCLlhV
+KGEsIlxcIixyKzEpCmlmKHI+MClyZXR1cm4gcn1yZXR1cm4gcX1pZihxPDMpcmV0dXJuIDAKaWYoIUIu
+T1MocykpcmV0dXJuIDAKaWYoQy54Qi5XKGEsMSkhPT01OClyZXR1cm4gMApxPUMueEIuVyhhLDIpCmlm
+KCEocT09PTQ3fHxxPT09OTIpKXJldHVybiAwCnJldHVybiAzfSwKWXIoYSl7cmV0dXJuIHRoaXMuU3Ao
+YSwhMSl9LApoSyhhKXtyZXR1cm4gdGhpcy5ZcihhKT09PTF9LApPdChhLGIpe3ZhciBzCmlmKGE9PT1i
+KXJldHVybiEwCmlmKGE9PT00NylyZXR1cm4gYj09PTkyCmlmKGE9PT05MilyZXR1cm4gYj09PTQ3Cmlm
+KChhXmIpIT09MzIpcmV0dXJuITEKcz1hfDMyCnJldHVybiBzPj05NyYmczw9MTIyfSwKTmMoYSxiKXt2
+YXIgcyxyCmlmKGE9PT1iKXJldHVybiEwCnM9YS5sZW5ndGgKaWYocyE9PWIubGVuZ3RoKXJldHVybiEx
+CmZvcihyPTA7cjxzOysrcilpZighdGhpcy5PdChDLnhCLlcoYSxyKSxDLnhCLlcoYixyKSkpcmV0dXJu
+ITEKcmV0dXJuITB9LApnb2MoKXtyZXR1cm4id2luZG93cyJ9LApnbUkoKXtyZXR1cm4iXFwifX07KGZ1
+bmN0aW9uIGFsaWFzZXMoKXt2YXIgcz1KLkd2LnByb3RvdHlwZQpzLlU9cy53CnM9Si5NRi5wcm90b3R5
+cGUKcy50PXMudwpzPVAuY1gucHJvdG90eXBlCnMuR0c9cy5ldgpzPVAuTWgucHJvdG90eXBlCnMueGI9
+cy53CnM9Vy5jdi5wcm90b3R5cGUKcy5EVz1zLnI2CnM9Vy5tNi5wcm90b3R5cGUKcy5qRj1zLkViCnM9
+UC5FNC5wcm90b3R5cGUKcy5Vcj1zLnEKcy5lND1zLlk1CnM9UC52Zy5wcm90b3R5cGUKcy5iaD1zLlk1
+fSkoKTsoZnVuY3Rpb24gaW5zdGFsbFRlYXJPZmZzKCl7dmFyIHM9aHVua0hlbHBlcnMuX3N0YXRpY18x
+LHI9aHVua0hlbHBlcnMuX3N0YXRpY18wLHE9aHVua0hlbHBlcnMuaW5zdGFsbEluc3RhbmNlVGVhck9m
+ZixwPWh1bmtIZWxwZXJzLmluc3RhbGxTdGF0aWNUZWFyT2ZmLG89aHVua0hlbHBlcnMuX2luc3RhbmNl
+XzF1CnMoUCwiRVgiLCJaViIsNSkKcyhQLCJ5dCIsIm9BIiw1KQpzKFAsInFXIiwiQnoiLDUpCnIoUCwi
+VUkiLCJlTiIsMCkKcShQLlBmLnByb3RvdHlwZSwiZ1lKIiwwLDEsbnVsbCxbIiQyIiwiJDEiXSxbIncw
+IiwicG0iXSw0MCwwLDApCnMoUCwiQ3kiLCJOQyIsNCkKcyhQLCJQSCIsIk10IiwyKQpwKFcsInBTIiw0
+LG51bGwsWyIkNCJdLFsicUQiXSwxNCwwKQpwKFcsIlY0Iiw0LG51bGwsWyIkNCJdLFsibloiXSwxNCww
+KQpvKFAuQXMucHJvdG90eXBlLCJndU0iLCJWIiwyKQpzKFAsImlHIiwid1kiLDUyKQpzKFAsIncwIiwi
+ZFUiLDM1KQpzKEwsImlTIiwiaTYiLDEpfSkoKTsoZnVuY3Rpb24gaW5oZXJpdGFuY2UoKXt2YXIgcz1o
+dW5rSGVscGVycy5taXhpbixyPWh1bmtIZWxwZXJzLmluaGVyaXQscT1odW5rSGVscGVycy5pbmhlcml0
+TWFueQpyKFAuTWgsbnVsbCkKcShQLk1oLFtILkZLLEouR3YsSi5tMSxQLmNYLEguZVQsUC5YUyxQLm5Z
+LEguYTcsUC5BbixILkZ1LEguSkIsSC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5UcCxILmY5
+LEgudGUsSC5icSxILlhPLEgua3IsUC5ZayxILnZoLEguTjYsSC5WUixILkVLLEguUGIsSC50USxILlNk
+LEguSmMsSC5HLFAuVzMsUC5paCxQLkZ5LFAuR1YsUC5DdyxQLlBmLFAuRmUsUC52cyxQLk9NLFAucWgs
+UC5NTyxQLmtULFAueEksUC5tMCxQLnBSLFAuYm4sUC5sbSxQLmxELFAuS1AsUC5sZixQLldZLFAuVWss
+UC5TaCxQLlJ3LFAuYnosUC5pUCxQLms1LFAuS1ksUC5DRCxQLmFFLFAuTjMsUC5jOCxQLlpkLFAuTSxQ
+LkRuLFAuUEUsUC5VZixXLmlkLFcuRmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzksVy5kVyxX
+Lm1rLFcuS28sUC5pSixQLkU0LFUuZDIsVS5TZSxVLk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5tUSxM
+LlhBLEwuRDgsTC5POSxMLkdiLFIuTEwsUi5INyxNLmxJLE8uekwsWC5XRCxYLmR2XSkKcShKLkd2LFtK
+LnlFLEoud2UsSi5NRixKLmpkLEoucUksSi5EcixILkVULFcuRDAsVy5BeixXLkxlLFcuTmgsVy5hZSxX
+LklCLFcubjcsVy5lYSxXLmJyLFcuU2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnEoSi5NRixbSi5pQyxK
+LmtkLEouYzVdKQpyKEouUG8sSi5qZCkKcShKLnFJLFtKLmJVLEoua0RdKQpxKFAuY1gsW0guQlIsSC5i
+USxILmkxLEguVTUsSC5BTSxILnU2LEguWFIsUC5tVyxILnVuXSkKcShILkJSLFtILlp5LEguUUNdKQpy
+KEgub2wsSC5aeSkKcihILlVxLEguUUMpCnIoSC5qVixILlVxKQpxKFAuWFMsW0guYyxQLkV6LEguYXos
+SC52VixILkVxLFAuQzYsSC5rUyxQLlVkLFAuRixQLkFULFAubXAsUC51YixQLmRzLFAubGosUC5VVixQ
+LnAsTC5RV10pCnIoUC51eSxQLm5ZKQpxKFAudXksW0gudzIsVy53eixXLmU3XSkKcihILnFqLEgudzIp
+CnEoSC5iUSxbSC5hTCxILk1CLEguaTVdKQpxKEguYUwsW0gubkgsSC5sSixQLmk4XSkKcihILnh5LEgu
+aTEpCnEoUC5BbixbSC5NSCxILlNPLEguVTFdKQpyKEguZDUsSC5BTSkKcihQLlJVLFAuUG4pCnIoUC5H
+aixQLlJVKQpyKEguUEQsUC5HaikKcihILkxQLEguV1UpCnEoSC5UcCxbSC5FMSxILkF5LEgubGMsSC5k
+QyxILlZYLFAudGgsUC5oYSxQLldNLFAucFYsUC5qWixQLkI1LFAuT1IsUC55USxQLlZDLFAuUlosUC5j
+NixQLnFkLFcuQ3YsVy52TixXLlV2LFcuRWcsVy5FbyxXLldrLFcuSUEsUC5HRSxQLk43LFAudVEsUC5E
+VixQLlBDLFAuUVMsUC5ucCxQLlV0LFUuYU4sVS5iMCxMLmUsTC5vWixMLmpyLEwueTgsTC5IaSxMLkJU
+LEwuUFksTC5MLEwuV3gsTC5IbyxMLmROLEwuSUMsTC54eixMLkJOLEwuZkMsTC5UbSxMLnVlLEwuR0gs
+TC5FRSxMLlZTLEwuVEQsTC5JZixMLnRCLEwubTIsUi5NRCxNLnE3LE0uTm9dKQpxKEguRTEsW0guQ2os
+SC53TixQLlNYLFAuR3MsUC5VNyxQLnJhLFAudGksUC5XRixQLm4xLFAuY1MsUC5KVCxQLk1FLFAueTUs
+UC55SSxXLktTLFcuQTMsVy5mbSxQLkUyLFAuamcsTC5xbF0pCnIoSC5XMCxQLkV6KQpxKEgubGMsW0gu
+engsSC5yVF0pCnIoSC5rWSxQLkM2KQpyKFAuaWwsUC5ZaykKcShQLmlsLFtILk41LFAudXcsVy5jZixX
+LlN5XSkKcShQLm1XLFtILktXLFAucTRdKQpyKEguTFosSC5FVCkKcShILkxaLFtILlJHLEguV0JdKQpy
+KEguVlAsSC5SRykKcihILkRnLEguVlApCnIoSC5aRyxILldCKQpyKEguUGcsSC5aRykKcShILlBnLFtI
+LnhqLEguZEUsSC5aQSxILmRULEguUHEsSC5lRSxILlY2XSkKcihILmlNLEgua1MpCnEoSC5BeSxbUC5W
+cyxQLkZ0LFAueUgsUC5kYSxQLm9RLFAudnIsUC5ydCxQLktGLFAuWkwsUC5SVCxQLnJxLFAuUlcsUC51
+TyxQLkV2LFAuVnAsUC54cixQLk56LEwuVlcsTC5uVCxMLk5ZLEwuUUxdKQpyKFAuWmYsUC5QZikKcihQ
+LkppLFAubTApCnIoUC5YdixQLnBSKQpyKFAuYjYsUC5YdikKcihQLlZqLFAuV1kpCnEoUC5VayxbUC5D
+VixQLlppLFAuYnldKQpyKFAud0ksUC5rVCkKcShQLndJLFtQLlU4LFAub2osUC5NeCxQLkUzLFAuR1ld
+KQpyKFAuSzgsUC5VZCkKcihQLnR1LFAuU2gpCnIoUC51NSxQLlppKQpxKFAuQVQsW1AuYkosUC5lWV0p
+CnIoUC5xZSxQLkRuKQpxKFcuRDAsW1cuS1YsVy53YSxXLks1LFcuQ21dKQpxKFcuS1YsW1cuY3YsVy5u
+eCxXLlFGLFcuQ1FdKQpxKFcuY3YsW1cucUUsUC5oaV0pCnEoVy5xRSxbVy5HaCxXLmZZLFcuclosVy5R
+UCxXLmg0LFcuU04sVy5scCxXLlRiLFcuSXYsVy5XUCxXLnlZXSkKcihXLm9KLFcuTGUpCnIoVy5oSCxX
+LkF6KQpyKFcuVmIsVy5RRikKcihXLmZKLFcud2EpCnEoVy5lYSxbVy53NixXLmV3XSkKcihXLkFqLFcu
+dzYpCnIoVy5yQixXLks3KQpyKFcuQkgsVy5yQikKcihXLnc0LFcuSUIpCnIoVy5vYSxXLlhXKQpyKFcu
+cmgsVy5vYSkKcihXLmk3LFcuY2YpCnIoUC5BcyxQLlZqKQpxKFAuQXMsW1cuSTQsUC5LZV0pCnIoVy5S
+TyxQLnFoKQpyKFcuQ3EsVy5STykKcihXLnhDLFAuTU8pCnIoVy5jdCxXLm02KQpyKFAuQmYsUC5pSikK
+cShQLkU0LFtQLnI3LFAudmddKQpyKFAuVHosUC52ZykKcihQLm5kLFAuaGkpCnEoTC5EOCxbTC52dCxM
+LmNEXSkKcihCLmZ2LE8uekwpCnEoQi5mdixbRS5PRixGLnJ1LEwuSVZdKQpzKEgudzIsSC5SZSkKcyhI
+LlFDLFAubEQpCnMoSC5SRyxQLmxEKQpzKEguVlAsSC5TVSkKcyhILldCLFAubEQpCnMoSC5aRyxILlNV
+KQpzKFAublksUC5sRCkKcyhQLldZLFAubGYpCnMoUC5SVSxQLktQKQpzKFAucFIsUC5sZikKcyhXLkxl
+LFcuaWQpCnMoVy5LNyxQLmxEKQpzKFcuckIsVy5HbSkKcyhXLlhXLFAubEQpCnMoVy5vYSxXLkdtKQpz
+KFAudmcsUC5sRCl9KSgpCnZhciB2PXt0eXBlVW5pdmVyc2U6e2VDOm5ldyBNYXAoKSx0Ujp7fSxlVDp7
+fSx0UFY6e30sc0VBOltdfSxtYW5nbGVkR2xvYmFsTmFtZXM6e0lqOiJpbnQiLENQOiJkb3VibGUiLFpa
+OiJudW0iLHFVOiJTdHJpbmciLGEyOiJib29sIixjODoiTnVsbCIsek06Ikxpc3QifSxtYW5nbGVkTmFt
+ZXM6e30sdHlwZXM6WyJ+KCkiLCJ+KEFqKSIsInFVKHFVKSIsIn4oY3YpIiwiQChAKSIsIn4ofigpKSIs
+ImEyKHFVKSIsImI4PH4+KEFqKSIsIn4ocVUscVUpIiwifihNaD8sTWg/KSIsIkAoKSIsIn4ocVUsQCki
+LCJ+KHh1PHFVPikiLCJjOChAKSIsImEyKGN2LHFVLHFVLEpRKSIsImM4KCkiLCJhMihrRikiLCJjOChl
+YSkiLCJ+KG42LHFVLElqKSIsIn4ocVVbQF0pIiwiSWooSWosSWopIiwiQChxVSkiLCJ+KHFVLHFVPyki
+LCJuNihALEApIiwifihxVSxJaikiLCJhMihLVikiLCJaMDxxVSxxVT4oWjA8cVUscVU+LHFVKSIsIn4o
+ZWEpIiwifihHRCxAKSIsInZzPEA+KEApIiwifihLVixLVj8pIiwifihALEApIiwiYzgoQCxAKSIsImEy
+KHh1PHFVPikiLCJjOChNaCxHeikiLCJNaD8oQCkiLCJUejxAPihAKSIsIkU0KEApIiwiTEwoQCkiLCJa
+MDxxVSxNaD8+KExMKSIsIn4oTWhbR3o/XSkiLCJjOCh+KCkpIiwiYzgoWjA8cVUsTWg/Pj8pIiwiYzgo
+TWgsQCkiLCJyNyhAKSIsIn4oSWosQCkiLCJ+KGV3KSIsInFVKFowPEAsQD4pIiwiYTIoSDcpIiwicVUo
+cVU/KSIsIkAoQCxxVSkiLCJ+KEApIiwiTWg/KE1oPykiLCJjOChALEd6KSJdLGludGVyY2VwdG9yc0J5
+VGFnOm51bGwsbGVhZlRhZ3M6bnVsbCxhcnJheVJ0aTpTeW1ib2woIiR0aSIpfQpILnhiKHYudHlwZVVu
+aXZlcnNlLEpTT04ucGFyc2UoJ3siaUMiOiJNRiIsImtkIjoiTUYiLCJjNSI6Ik1GIiwicngiOiJlYSIs
+ImU1IjoiZWEiLCJZMCI6ImhpIiwidHAiOiJoaSIsIkc4IjoiZXciLCJNciI6InFFIiwiZUwiOiJxRSIs
+IkkwIjoiS1YiLCJocyI6IktWIiwiWGciOiJRRiIsIm5yIjoiQWoiLCJ5NCI6Inc2IiwiYVAiOiJDbSIs
+InhjIjoibngiLCJrSiI6Im54IiwielUiOiJEZyIsImRmIjoiRVQiLCJ5RSI6eyJhMiI6W119LCJ3ZSI6
+eyJjOCI6W119LCJNRiI6eyJ2bSI6W119LCJqZCI6eyJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsi
+MSJdfSwiUG8iOnsiamQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiY1giOlsiMSJdfSwibTEi
+OnsiQW4iOlsiMSJdfSwicUkiOnsiQ1AiOltdLCJaWiI6W119LCJiVSI6eyJDUCI6W10sIklqIjpbXSwi
+WloiOltdfSwia0QiOnsiQ1AiOltdLCJaWiI6W119LCJEciI6eyJxVSI6W10sInZYIjpbXX0sIkJSIjp7
+ImNYIjpbIjIiXX0sImVUIjp7IkFuIjpbIjIiXX0sIlp5Ijp7IkJSIjpbIjEiLCIyIl0sImNYIjpbIjIi
+XSwiY1guRSI6IjIifSwib2wiOnsiWnkiOlsiMSIsIjIiXSwiQlIiOlsiMSIsIjIiXSwiYlEiOlsiMiJd
+LCJjWCI6WyIyIl0sImNYLkUiOiIyIn0sIlVxIjp7ImxEIjpbIjIiXSwiek0iOlsiMiJdLCJCUiI6WyIx
+IiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXX0sImpWIjp7IlVxIjpbIjEiLCIyIl0sImxEIjpbIjIi
+XSwiek0iOlsiMiJdLCJCUiI6WyIxIiwiMiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwibEQuRSI6IjIi
+LCJjWC5FIjoiMiJ9LCJjIjp7IlhTIjpbXX0sInFqIjp7ImxEIjpbIklqIl0sIlJlIjpbIklqIl0sInpN
+IjpbIklqIl0sImJRIjpbIklqIl0sImNYIjpbIklqIl0sImxELkUiOiJJaiIsIlJlLkUiOiJJaiJ9LCJi
+USI6eyJjWCI6WyIxIl19LCJhTCI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXX0sIm5IIjp7ImFMIjpbIjEi
+XSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsi
+MSJdfSwiaTEiOnsiY1giOlsiMiJdLCJjWC5FIjoiMiJ9LCJ4eSI6eyJpMSI6WyIxIiwiMiJdLCJiUSI6
+WyIyIl0sImNYIjpbIjIiXSwiY1guRSI6IjIifSwiTUgiOnsiQW4iOlsiMiJdfSwibEoiOnsiYUwiOlsi
+MiJdLCJiUSI6WyIyIl0sImNYIjpbIjIiXSwiYUwuRSI6IjIiLCJjWC5FIjoiMiJ9LCJVNSI6eyJjWCI6
+WyIxIl0sImNYLkUiOiIxIn0sIlNPIjp7IkFuIjpbIjEiXX0sIkFNIjp7ImNYIjpbIjEiXSwiY1guRSI6
+IjEifSwiZDUiOnsiQU0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiVTEi
+OnsiQW4iOlsiMSJdfSwiTUIiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIkZ1Ijp7
+IkFuIjpbIjEiXX0sInU2Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiSkIiOnsiQW4iOlsiMSJdfSwi
+dzIiOnsibEQiOlsiMSJdLCJSZSI6WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19
+LCJ3diI6eyJHRCI6W119LCJQRCI6eyJHaiI6WyIxIiwiMiJdLCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIx
+IiwiMiJdLCJLUCI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdfSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0s
+IkxQIjp7IldVIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJYUiI6eyJjWCI6WyIxIl0sImNYLkUi
+OiIxIn0sIkxJIjp7InZRIjpbXX0sIlcwIjp7IkV6IjpbXSwiWFMiOltdfSwiYXoiOnsiWFMiOltdfSwi
+dlYiOnsiWFMiOltdfSwidGUiOnsiUnoiOltdfSwiWE8iOnsiR3oiOltdfSwiVHAiOnsiRUgiOltdfSwi
+QXkiOnsiRUgiOltdfSwiRTEiOnsiRUgiOltdfSwibGMiOnsiRUgiOltdfSwiengiOnsiRUgiOltdfSwi
+clQiOnsiRUgiOltdfSwiRXEiOnsiWFMiOltdfSwia1kiOnsiWFMiOltdfSwiTjUiOnsiWWsiOlsiMSIs
+IjIiXSwiRm8iOlsiMSIsIjIiXSwiWjAiOlsiMSIsIjIiXSwiWWsuSyI6IjEiLCJZay5WIjoiMiJ9LCJp
+NSI6eyJiUSI6WyIxIl0sImNYIjpbIjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4iOlsiMSJdfSwiVlIi
+Onsid0wiOltdLCJ2WCI6W119LCJFSyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7ImNYIjpbImliIl0s
+ImNYLkUiOiJpYiJ9LCJQYiI6eyJBbiI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwidW4iOnsiY1giOlsi
+T2QiXSwiY1guRSI6Ik9kIn0sIlNkIjp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6W119LCJMWiI6eyJY
+aiI6WyIxIl0sIkVUIjpbXSwiQVMiOltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoiOlsiQ1AiXSwiek0i
+OlsiQ1AiXSwiRVQiOltdLCJiUSI6WyJDUCJdLCJBUyI6W10sImNYIjpbIkNQIl0sIlNVIjpbIkNQIl0s
+ImxELkUiOiJDUCJ9LCJQZyI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6
+W10sImJRIjpbIklqIl0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXX0sInhqIjp7ImxEIjpb
 IklqIl0sIlhqIjpbIklqIl0sInpNIjpbIklqIl0sIkVUIjpbXSwiYlEiOlsiSWoiXSwiQVMiOltdLCJj
-WCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwiUHEiOnsibEQiOlsiSWoiXSwiWGoiOlsi
+WCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwiZEUiOnsibEQiOlsiSWoiXSwiWGoiOlsi
 SWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNV
-IjpbIklqIl0sImxELkUiOiJJaiJ9LCJlRSI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJ
+IjpbIklqIl0sImxELkUiOiJJaiJ9LCJaQSI6eyJsRCI6WyJJaiJdLCJYaiI6WyJJaiJdLCJ6TSI6WyJJ
 aiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpbXSwiY1giOlsiSWoiXSwiU1UiOlsiSWoiXSwibEQu
-RSI6IklqIn0sIlY2Ijp7ImxEIjpbIklqIl0sIm42IjpbXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwi
-RVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJ
-aiJ9LCJrUyI6eyJYUyI6W119LCJpTSI6eyJFeiI6W10sIlhTIjpbXX0sInZzIjp7ImI4IjpbIjEiXX0s
-IkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiQ3ciOnsiWFMiOltd
-fSwiWmYiOnsiUGYiOlsiMSJdfSwibTAiOnsiUW0iOltdfSwiSmkiOnsibTAiOltdLCJRbSI6W119LCJi
-NiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImxmLkUiOiIxIn0s
-ImxtIjp7IkFuIjpbIjEiXX0sIm1XIjp7ImNYIjpbIjEiXX0sInV5Ijp7ImxEIjpbIjEiXSwiek0iOlsi
-MSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIy
-Il19LCJZayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIsIjIiXX0sIkdqIjp7IlJVIjpb
-IjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJWaiI6
-eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJYdiI6eyJsZiI6WyIx
-Il0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1dyI6eyJZayI6WyJxVSIsIkAiXSwi
-WjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0sImk4Ijp7ImFMIjpbInFVIl0sImJR
-IjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJDViI6eyJVayI6WyJ6
-TTxJaj4iLCJxVSJdLCJVay5TIjoiek08SWo+In0sIlU4Ijp7IndJIjpbInpNPElqPiIsInFVIl19LCJa
-aSI6eyJVayI6WyJxVSIsInpNPElqPiJdfSwiVWQiOnsiWFMiOltdfSwiSzgiOnsiWFMiOltdfSwiYnki
-OnsiVWsiOlsiTWg/IiwicVUiXSwiVWsuUyI6Ik1oPyJ9LCJvaiI6eyJ3SSI6WyJNaD8iLCJxVSJdfSwi
-TXgiOnsid0kiOlsicVUiLCJNaD8iXX0sInU1Ijp7IlVrIjpbInFVIiwiek08SWo+Il0sIlVrLlMiOiJx
-VSJ9LCJFMyI6eyJ3SSI6WyJxVSIsInpNPElqPiJdfSwiR1kiOnsid0kiOlsiek08SWo+IiwicVUiXX0s
-IkNQIjp7IlpaIjpbXX0sIklqIjp7IlpaIjpbXX0sInpNIjp7ImJRIjpbIjEiXSwiY1giOlsiMSJdfSwi
-aWIiOnsiT2QiOltdfSwieHUiOnsiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJxVSI6eyJ2WCI6W119LCJD
-NiI6eyJYUyI6W119LCJFeiI6eyJYUyI6W119LCJGIjp7IlhTIjpbXX0sIkFUIjp7IlhTIjpbXX0sImJK
-Ijp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpbXX0sInViIjp7IlhTIjpbXX0sImRz
-Ijp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpbXX0sIms1Ijp7IlhTIjpbXX0sIktZ
-Ijp7IlhTIjpbXX0sInAiOnsiWFMiOltdfSwiQ0QiOnsiUnoiOltdfSwiYUUiOnsiUnoiOltdfSwiWmQi
-OnsiR3oiOltdfSwiTSI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJVZiI6eyJpRCI6W119LCJxZSI6
-eyJpRCI6W119LCJjdiI6eyJLViI6W10sIkQwIjpbXX0sImZKIjp7IkQwIjpbXX0sIkFqIjp7ImVhIjpb
-XX0sIktWIjp7IkQwIjpbXX0sImV3Ijp7ImVhIjpbXX0sIkpRIjp7ImtGIjpbXX0sInFFIjp7ImN2Ijpb
-XSwiS1YiOltdLCJEMCI6W119LCJHaCI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwiZlkiOnsiY3Yi
-OltdLCJLViI6W10sIkQwIjpbXX0sInJaIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJRUCI6eyJj
-diI6W10sIktWIjpbXSwiRDAiOltdfSwibngiOnsiS1YiOltdLCJEMCI6W119LCJRRiI6eyJLViI6W10s
-IkQwIjpbXX0sIklCIjp7InRuIjpbIlpaIl19LCJ3eiI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiYlEi
-OlsiMSJdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sImhIIjp7IkF6IjpbXX0sImg0Ijp7ImN2IjpbXSwi
-S1YiOltdLCJEMCI6W119LCJWYiI6eyJLViI6W10sIkQwIjpbXX0sIndhIjp7IkQwIjpbXX0sImU3Ijp7
-ImxEIjpbIktWIl0sInpNIjpbIktWIl0sImJRIjpbIktWIl0sImNYIjpbIktWIl0sImxELkUiOiJLViJ9
-LCJCSCI6eyJsRCI6WyJLViJdLCJHbSI6WyJLViJdLCJ6TSI6WyJLViJdLCJYaiI6WyJLViJdLCJiUSI6
-WyJLViJdLCJjWCI6WyJLViJdLCJsRC5FIjoiS1YiLCJHbS5FIjoiS1YifSwiU04iOnsiY3YiOltdLCJL
-ViI6W10sIkQwIjpbXX0sImxwIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJUYiI6eyJjdiI6W10s
-IktWIjpbXSwiRDAiOltdfSwiSXYiOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sIldQIjp7ImN2Ijpb
-XSwiS1YiOltdLCJEMCI6W119LCJ5WSI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwidzYiOnsiZWEi
-OltdfSwiSzUiOnsidjYiOltdLCJEMCI6W119LCJDbSI6eyJEMCI6W119LCJDUSI6eyJLViI6W10sIkQw
-IjpbXX0sInc0Ijp7InRuIjpbIlpaIl19LCJyaCI6eyJsRCI6WyJLViJdLCJHbSI6WyJLViJdLCJ6TSI6
-WyJLViJdLCJYaiI6WyJLViJdLCJiUSI6WyJLViJdLCJjWCI6WyJLViJdLCJsRC5FIjoiS1YiLCJHbS5F
-IjoiS1YifSwiY2YiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl19LCJpNyI6eyJZayI6
-WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6InFVIn0sIlN5Ijp7
-IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwi
-STQiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUiXSwiY1giOlsicVUiXSwibGYuRSI6
-InFVIn0sIlJPIjp7InFoIjpbIjEiXX0sIkNxIjp7IlJPIjpbIjEiXSwicWgiOlsiMSJdfSwieEMiOnsi
-TU8iOlsiMSJdfSwidkQiOnsia0YiOltdfSwibTYiOnsia0YiOltdfSwiY3QiOnsia0YiOltdfSwiT3ci
-Onsia0YiOltdfSwiVzkiOnsiQW4iOlsiMSJdfSwiZFciOnsidjYiOltdLCJEMCI6W119LCJtayI6eyJ5
-MCI6W119LCJLbyI6eyJvbiI6W119LCJBcyI6eyJsZiI6WyJxVSJdLCJ4dSI6WyJxVSJdLCJiUSI6WyJx
-VSJdLCJjWCI6WyJxVSJdfSwicjciOnsiRTQiOltdfSwiVHoiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0s
-ImJRIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sIm5kIjp7ImhpIjpbXSwiY3Yi
-OltdLCJLViI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImJRIjpbInFV
-Il0sImNYIjpbInFVIl0sImxmLkUiOiJxVSJ9LCJoaSI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwi
-UVciOnsiWFMiOltdLCJSeiI6W119LCJYQSI6eyJrRiI6W119LCJ2dCI6eyJEOCI6W119LCJjRCI6eyJE
-OCI6W119LCJkdiI6eyJSeiI6W119LCJPRiI6eyJmdiI6W119LCJydSI6eyJmdiI6W119LCJJViI6eyJm
-diI6W119LCJuNiI6eyJ6TSI6WyJJaiJdLCJiUSI6WyJJaiJdLCJjWCI6WyJJaiJdLCJBUyI6W119fScp
-KQpILkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3sidzIiOjEsIlFDIjoyLCJMWiI6MSwia1Qi
-OjIsIm1XIjoxLCJ1eSI6MSwiaWwiOjIsIlZqIjoxLCJYdiI6MSwiblkiOjEsIldZIjoxLCJwUiI6MSwi
-dmciOjF9JykpCnZhciB1PXtsOiJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdp
-dGggYSBmcmFnbWVudCBjb21wb25lbnQiLGk6IkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20g
-YSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIsajoiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93
-cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IixjOiJFcnJvciBoYW5k
-bGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Igb25lIE9iamVjdCBhbmQgYSBTdGFja1RyYWNlIGFz
-IGFyZ3VtZW50cywgYW5kIHJldHVybiBhIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBmdXR1cmUncyB0eXBl
-IixkOiJhcmVhLWFuYWx5emVyLGFuYWx5emVyLW5uYmQtbWlncmF0aW9uLHR5cGUtYnVnIn0KdmFyIHQ9
-KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgcz1ILk4wCnJldHVybnticTpzKCJHaCIpLG46cygiQ3ciKSxjUjpz
-KCJyWiIpLHc6cygiQXoiKSxrOnMoIlFQIiksZ0Y6cygiUEQ8R0QsQD4iKSxXOnMoImJRPEA+IiksaDpz
-KCJjdiIpLG06cygiWFMiKSxCOnMoImVhIiksZzg6cygiUnoiKSxjODpzKCJoSCIpLFk6cygiRUgiKSxp
-OnMoImI4PEA+IiksSjpzKCJMTCIpLGdwOnMoIkg3IiksSTpzKCJTZyIpLG86cygidlEiKSxlaDpzKCJj
-WDxLVj4iKSxPOnMoImNYPHFVPiIpLFI6cygiY1g8QD4iKSxmQTpzKCJqZDxTZT4iKSxnaTpzKCJqZDxq
-OD4iKSxkOnMoImpkPFowPHFVLE1oPz4+IiksZmg6cygiamQ8RDg+IikscjpzKCJqZDxrRj4iKSxzOnMo
-ImpkPHFVPiIpLGhoOnMoImpkPHlEPiIpLGFKOnMoImpkPHdiPiIpLGdOOnMoImpkPG42PiIpLGI6cygi
-amQ8QD4iKSx0OnMoImpkPElqPiIpLGQ0OnMoImpkPHFVPz4iKSxUOnMoIndlIiksZUg6cygidm0iKSx1
-OnMoImM1IiksYVU6cygiWGo8QD4iKSxhbTpzKCJUejxAPiIpLGVvOnMoIk41PEdELEA+IiksZHo6cygi
-aEYiKSxmNDpzKCJ6TTxqOD4iKSx4OnMoInpNPFowPHFVLE1oPz4+IiksZXc6cygiek08TWg+IiksRDpz
-KCJ6TTxxVT4iKSxqOnMoInpNPEA+IiksTDpzKCJ6TTxJaj4iKSxlZTpzKCJ6TTxNaD8+IiksRjpzKCJ1
-OCIpLGg2OnMoIlowPHFVLE1oPiIpLEU6cygiWjA8cVUscVU+IiksZjpzKCJaMDxALEA+IiksRzpzKCJa
-MDxxVSxNaD8+IiksZHY6cygibEo8cVUscVU+IiksZG86cygibEo8cVUsQD4iKSxWOnMoIkFqIiksZEU6
-cygiRVQiKSxBOnMoIktWIiksZjY6cygia0YiKSxQOnMoImM4IiksSzpzKCJNaCIpLHA6cygiZXciKSxx
-OnMoInRuPFpaPiIpLGZ2OnMoIndMIiksY3o6cygiaWIiKSxhTzpzKCJuZCIpLEM6cygieHU8cVU+Iiks
-bDpzKCJHeiIpLE46cygicVUiKSxkRzpzKCJxVShxVSkiKSxnNzpzKCJoaSIpLGZvOnMoIkdEIiksYVc6
-cygieVkiKSxlSzpzKCJFeiIpLGFrOnMoIkFTIiksZ2M6cygibjYiKSxiSTpzKCJrZCIpLGR3OnMoIkdq
-PHFVLHFVPiIpLGREOnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6cygiSzUiKSxjaTpzKCJ2NiIpLGcy
-OnMoIkNtIiksYmo6cygiWmY8Zko+IiksaDk6cygiQ1EiKSxhYzpzKCJlNyIpLFE6cygiQ3E8QWo+Iiks
-VTpzKCJ3ejxjdj4iKSxhbzpzKCJ2czxmSj4iKSxjOnMoInZzPEA+IiksZko6cygidnM8SWo+IiksY3I6
-cygiSlEiKSx5OnMoImEyIiksYWw6cygiYTIoTWgpIiksZ1I6cygiQ1AiKSx6OnMoIkAiKSxmTzpzKCJA
-KCkiKSx2OnMoIkAoTWgpIiksYTpzKCJAKE1oLEd6KSIpLGJVOnMoIkAoeHU8cVU+KSIpLGRPOnMoIkAo
-cVUpIiksYjg6cygiQChALEApIiksUzpzKCJJaiIpLGF3OnMoIjAmKiIpLF86cygiTWgqIiksY2g6cygi
-RDA/IiksYkc6cygiYjg8Yzg+PyIpLGVzOnMoIkU0PyIpLGJrOnMoInpNPHFVPj8iKSxiTTpzKCJ6TTxA
-Pj8iKSxjWjpzKCJaMDxxVSxxVT4/IiksYzk6cygiWjA8cVUsQD4/IiksZm46cygiWjA8cVUsTWg/Pj8i
-KSxYOnMoIk1oPyIpLGRrOnMoInFVPyIpLGU6cygiRmU8QCxAPj8iKSxnOnMoImJuPyIpLGI3OnMoImEy
-KE1oKT8iKSxidzpzKCJAKGVhKT8iKSxmVjpzKCJNaD8oTWg/LE1oPyk/IiksZEE6cygiTWg/KEApPyIp
-LFo6cygifigpPyIpLGd4OnMoIn4oZXcpPyIpLGRpOnMoIlpaIiksSDpzKCJ+IiksTTpzKCJ+KCkiKSxl
-QTpzKCJ+KHFVLHFVKSIpLGNBOnMoIn4ocVUsQCkiKX19KSgpOyhmdW5jdGlvbiBjb25zdGFudHMoKXt2
-YXIgcz1odW5rSGVscGVycy5tYWtlQ29uc3RMaXN0CkMueG49Vy5HaC5wcm90b3R5cGUKQy5SWT1XLlFQ
-LnByb3RvdHlwZQpDLm1IPVcuYWUucHJvdG90eXBlCkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5EdD1XLmZK
-LnByb3RvdHlwZQpDLk9rPUouR3YucHJvdG90eXBlCkMuTm09Si5qZC5wcm90b3R5cGUKQy5qbj1KLmJV
-LnByb3RvdHlwZQpDLkNEPUoucUkucHJvdG90eXBlCkMueEI9Si5Eci5wcm90b3R5cGUKQy5ERz1KLmM1
-LnByb3RvdHlwZQpDLkV4PVcudTgucHJvdG90eXBlCkMuTkE9SC5WNi5wcm90b3R5cGUKQy50NT1XLkJI
-LnByb3RvdHlwZQpDLkx0PVcuU04ucHJvdG90eXBlCkMuWlE9Si5pQy5wcm90b3R5cGUKQy5JZT1XLlRi
-LnByb3RvdHlwZQpDLnZCPUoua2QucHJvdG90eXBlCkMub2w9Vy5LNS5wcm90b3R5cGUKQy55OD1uZXcg
-UC5VOCgpCkMuaDk9bmV3IFAuQ1YoKQpDLkd3PW5ldyBILkZ1KEguTjAoIkZ1PDAmPiIpKQpDLk80PWZ1
-bmN0aW9uIGdldFRhZ0ZhbGxiYWNrKG8pIHsKICB2YXIgcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJp
-bmcuY2FsbChvKTsKICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKfQpDLllxPWZ1
-bmN0aW9uKCkgewogIHZhciB0b1N0cmluZ0Z1bmN0aW9uID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmlu
-ZzsKICBmdW5jdGlvbiBnZXRUYWcobykgewogICAgdmFyIHMgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwo
-byk7CiAgICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKTsKICB9CiAgZnVuY3Rpb24g
-Z2V0VW5rbm93blRhZyhvYmplY3QsIHRhZykgewogICAgaWYgKC9eSFRNTFtBLVpdLipFbGVtZW50JC8u
-dGVzdCh0YWcpKSB7CiAgICAgIHZhciBuYW1lID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxsKG9iamVjdCk7
-CiAgICAgIGlmIChuYW1lID09ICJbb2JqZWN0IE9iamVjdF0iKSByZXR1cm4gbnVsbDsKICAgICAgcmV0
-dXJuICJIVE1MRWxlbWVudCI7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldFVua25vd25UYWdHZW5lcmlj
-QnJvd3NlcihvYmplY3QsIHRhZykgewogICAgaWYgKHNlbGYuSFRNTEVsZW1lbnQgJiYgb2JqZWN0IGlu
-c3RhbmNlb2YgSFRNTEVsZW1lbnQpIHJldHVybiAiSFRNTEVsZW1lbnQiOwogICAgcmV0dXJuIGdldFVu
-a25vd25UYWcob2JqZWN0LCB0YWcpOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWcodGFnKSB7
-CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICBpZiAo
-dHlwZW9mIHdpbmRvd1t0YWddID09ICJ1bmRlZmluZWQiKSByZXR1cm4gbnVsbDsKICAgIHZhciBjb25z
-dHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPSAiZnVuY3Rp
-b24iKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGZ1
-bmN0aW9uIGRpc2NyaW1pbmF0b3IodGFnKSB7IHJldHVybiBudWxsOyB9CiAgdmFyIGlzQnJvd3NlciA9
-IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCI7CiAgcmV0dXJuIHsKICAgIGdldFRhZzogZ2V0VGFn
-LAogICAgZ2V0VW5rbm93blRhZzogaXNCcm93c2VyID8gZ2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2Vy
-IDogZ2V0VW5rbm93blRhZywKICAgIHByb3RvdHlwZUZvclRhZzogcHJvdG90eXBlRm9yVGFnLAogICAg
-ZGlzY3JpbWluYXRvcjogZGlzY3JpbWluYXRvciB9Owp9CkMud2I9ZnVuY3Rpb24oZ2V0VGFnRmFsbGJh
-Y2spIHsKICByZXR1cm4gZnVuY3Rpb24oaG9va3MpIHsKICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9
-ICJvYmplY3QiKSByZXR1cm4gaG9va3M7CiAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50Owog
-ICAgaWYgKHVhLmluZGV4T2YoIkR1bXBSZW5kZXJUcmVlIikgPj0gMCkgcmV0dXJuIGhvb2tzOwogICAg
-aWYgKHVhLmluZGV4T2YoIkNocm9tZSIpID49IDApIHsKICAgICAgZnVuY3Rpb24gY29uZmlybShwKSB7
-CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT0gIm9iamVjdCIgJiYgd2luZG93W3BdICYmIHdp
-bmRvd1twXS5uYW1lID09IHA7CiAgICAgIH0KICAgICAgaWYgKGNvbmZpcm0oIldpbmRvdyIpICYmIGNv
-bmZpcm0oIkhUTUxFbGVtZW50IikpIHJldHVybiBob29rczsKICAgIH0KICAgIGhvb2tzLmdldFRhZyA9
-IGdldFRhZ0ZhbGxiYWNrOwogIH07Cn0KQy5LVT1mdW5jdGlvbihob29rcykgewogIGlmICh0eXBlb2Yg
-ZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnICE9ICJmdW5jdGlvbiIpIHJldHVybiBob29rczsKICBo
-b29rcy5nZXRUYWcgPSBkYXJ0RXhwZXJpbWVudGFsRml4dXBHZXRUYWcoaG9va3MuZ2V0VGFnKTsKfQpD
-LmZRPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcHJv
-dG90eXBlRm9yVGFnID0gaG9va3MucHJvdG90eXBlRm9yVGFnOwogIGZ1bmN0aW9uIGdldFRhZ0ZpeGVk
-KG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHsK
-ICAgICAgaWYgKCEhby54bWxWZXJzaW9uKSByZXR1cm4gIiFEb2N1bWVudCI7CiAgICAgIHJldHVybiAi
-IUhUTUxEb2N1bWVudCI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5
-cGVGb3JUYWdGaXhlZCh0YWcpIHsKICAgIGlmICh0YWcgPT0gIkRvY3VtZW50IikgcmV0dXJuIG51bGw7
-CiAgICByZXR1cm4gcHJvdG90eXBlRm9yVGFnKHRhZyk7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRh
-Z0ZpeGVkOwogIGhvb2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0ZpeGVkOwp9CkMu
-ZGs9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAi
-b2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2Yo
-IkZpcmVmb3giKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7
-CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJE
-YXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJHZW9HZW9sb2NhdGlvbiI6ICJHZW9sb2NhdGlv
-biIsCiAgICAiTG9jYXRpb24iOiAiIUxvY2F0aW9uIiwKICAgICJXb3JrZXJNZXNzYWdlRXZlbnQiOiAi
-TWVzc2FnZUV2ZW50IiwKICAgICJYTUxEb2N1bWVudCI6ICIhRG9jdW1lbnQifTsKICBmdW5jdGlvbiBn
-ZXRUYWdGaXJlZm94KG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAgICByZXR1cm4gcXVpY2tN
-YXBbdGFnXSB8fCB0YWc7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpcmVmb3g7Cn0KQy54aT1m
-dW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmpl
-Y3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwogIGlmICh1c2VyQWdlbnQuaW5kZXhPZigiVHJp
-ZGVudC8iKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAg
-dmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRh
-VHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJIVE1MRERFbGVtZW50IjogIkhUTUxFbGVtZW50IiwK
-ICAgICJIVE1MRFRFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJIVE1MUGhyYXNlRWxlbWVudCI6
-ICJIVE1MRWxlbWVudCIsCiAgICAiUG9zaXRpb24iOiAiR2VvcG9zaXRpb24iCiAgfTsKICBmdW5jdGlv
-biBnZXRUYWdJRShvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgdmFyIG5ld1RhZyA9IHF1
-aWNrTWFwW3RhZ107CiAgICBpZiAobmV3VGFnKSByZXR1cm4gbmV3VGFnOwogICAgaWYgKHRhZyA9PSAi
-T2JqZWN0IikgewogICAgICBpZiAod2luZG93LkRhdGFWaWV3ICYmIChvIGluc3RhbmNlb2Ygd2luZG93
-LkRhdGFWaWV3KSkgcmV0dXJuICJEYXRhVmlldyI7CiAgICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBm
-dW5jdGlvbiBwcm90b3R5cGVGb3JUYWdJRSh0YWcpIHsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRv
-d1t0YWddOwogICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJu
-IGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnSUU7CiAgaG9v
-a3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90eXBlRm9yVGFnSUU7Cn0KQy5pNz1mdW5jdGlvbihob29r
-cykgeyByZXR1cm4gaG9va3M7IH0KCkMuQ3Q9bmV3IFAuYnkoKQpDLkVxPW5ldyBQLms1KCkKQy54TT1u
-ZXcgUC51NSgpCkMuUWs9bmV3IFAuRTMoKQpDLk52PW5ldyBILmtyKCkKQy5OVT1uZXcgUC5KaSgpCkMu
-cGQ9bmV3IFAuWmQoKQpDLkFkPW5ldyBSLkg3KDAsIkhpbnRBY3Rpb25LaW5kLmFkZE51bGxhYmxlSGlu
-dCIpCkMubmU9bmV3IFIuSDcoMSwiSGludEFjdGlvbktpbmQuYWRkTm9uTnVsbGFibGVIaW50IikKQy5t
-eT1uZXcgUi5INygyLCJIaW50QWN0aW9uS2luZC5jaGFuZ2VUb051bGxhYmxlSGludCIpCkMucng9bmV3
-IFIuSDcoMywiSGludEFjdGlvbktpbmQuY2hhbmdlVG9Ob25OdWxsYWJsZUhpbnQiKQpDLndWPW5ldyBS
-Lkg3KDQsIkhpbnRBY3Rpb25LaW5kLnJlbW92ZU51bGxhYmxlSGludCIpCkMuZlI9bmV3IFIuSDcoNSwi
-SGludEFjdGlvbktpbmQucmVtb3ZlTm9uTnVsbGFibGVIaW50IikKQy5BMz1uZXcgUC5NeChudWxsKQpD
-Lm5YPW5ldyBQLm9qKG51bGwpCkMuY3c9bmV3IEwuR2IoMCwiVW5pdE1pZ3JhdGlvblN0YXR1cy5hbHJl
-YWR5TWlncmF0ZWQiKQpDLmRjPW5ldyBMLkdiKDEsIlVuaXRNaWdyYXRpb25TdGF0dXMuaW5kZXRlcm1p
-bmF0ZSIpCkMuV0Q9bmV3IEwuR2IoMiwiVW5pdE1pZ3JhdGlvblN0YXR1cy5taWdyYXRpbmciKQpDLlhq
-PW5ldyBMLkdiKDMsIlVuaXRNaWdyYXRpb25TdGF0dXMub3B0aW5nT3V0IikKQy5sMD1ILlFJKHMoW0Mu
-Y3csQy5kYyxDLldELEMuWGpdKSxILk4wKCJqZDxHYj4iKSkKQy5haz1ILlFJKHMoWzAsMCwzMjc3Niwz
-Mzc5MiwxLDEwMjQwLDAsMF0pLHQudCkKQy5jbT1ILlFJKHMoWyIqOjpjbGFzcyIsIio6OmRpciIsIio6
-OmRyYWdnYWJsZSIsIio6OmhpZGRlbiIsIio6OmlkIiwiKjo6aW5lcnQiLCIqOjppdGVtcHJvcCIsIio6
-Oml0ZW1yZWYiLCIqOjppdGVtc2NvcGUiLCIqOjpsYW5nIiwiKjo6c3BlbGxjaGVjayIsIio6OnRpdGxl
-IiwiKjo6dHJhbnNsYXRlIiwiQTo6YWNjZXNza2V5IiwiQTo6Y29vcmRzIiwiQTo6aHJlZmxhbmciLCJB
-OjpuYW1lIiwiQTo6c2hhcGUiLCJBOjp0YWJpbmRleCIsIkE6OnRhcmdldCIsIkE6OnR5cGUiLCJBUkVB
-OjphY2Nlc3NrZXkiLCJBUkVBOjphbHQiLCJBUkVBOjpjb29yZHMiLCJBUkVBOjpub2hyZWYiLCJBUkVB
-OjpzaGFwZSIsIkFSRUE6OnRhYmluZGV4IiwiQVJFQTo6dGFyZ2V0IiwiQVVESU86OmNvbnRyb2xzIiwi
-QVVESU86Omxvb3AiLCJBVURJTzo6bWVkaWFncm91cCIsIkFVRElPOjptdXRlZCIsIkFVRElPOjpwcmVs
-b2FkIiwiQkRPOjpkaXIiLCJCT0RZOjphbGluayIsIkJPRFk6OmJnY29sb3IiLCJCT0RZOjpsaW5rIiwi
-Qk9EWTo6dGV4dCIsIkJPRFk6OnZsaW5rIiwiQlI6OmNsZWFyIiwiQlVUVE9OOjphY2Nlc3NrZXkiLCJC
-VVRUT046OmRpc2FibGVkIiwiQlVUVE9OOjpuYW1lIiwiQlVUVE9OOjp0YWJpbmRleCIsIkJVVFRPTjo6
-dHlwZSIsIkJVVFRPTjo6dmFsdWUiLCJDQU5WQVM6OmhlaWdodCIsIkNBTlZBUzo6d2lkdGgiLCJDQVBU
-SU9OOjphbGlnbiIsIkNPTDo6YWxpZ24iLCJDT0w6OmNoYXIiLCJDT0w6OmNoYXJvZmYiLCJDT0w6OnNw
-YW4iLCJDT0w6OnZhbGlnbiIsIkNPTDo6d2lkdGgiLCJDT0xHUk9VUDo6YWxpZ24iLCJDT0xHUk9VUDo6
-Y2hhciIsIkNPTEdST1VQOjpjaGFyb2ZmIiwiQ09MR1JPVVA6OnNwYW4iLCJDT0xHUk9VUDo6dmFsaWdu
-IiwiQ09MR1JPVVA6OndpZHRoIiwiQ09NTUFORDo6Y2hlY2tlZCIsIkNPTU1BTkQ6OmNvbW1hbmQiLCJD
-T01NQU5EOjpkaXNhYmxlZCIsIkNPTU1BTkQ6OmxhYmVsIiwiQ09NTUFORDo6cmFkaW9ncm91cCIsIkNP
-TU1BTkQ6OnR5cGUiLCJEQVRBOjp2YWx1ZSIsIkRFTDo6ZGF0ZXRpbWUiLCJERVRBSUxTOjpvcGVuIiwi
-RElSOjpjb21wYWN0IiwiRElWOjphbGlnbiIsIkRMOjpjb21wYWN0IiwiRklFTERTRVQ6OmRpc2FibGVk
-IiwiRk9OVDo6Y29sb3IiLCJGT05UOjpmYWNlIiwiRk9OVDo6c2l6ZSIsIkZPUk06OmFjY2VwdCIsIkZP
-Uk06OmF1dG9jb21wbGV0ZSIsIkZPUk06OmVuY3R5cGUiLCJGT1JNOjptZXRob2QiLCJGT1JNOjpuYW1l
-IiwiRk9STTo6bm92YWxpZGF0ZSIsIkZPUk06OnRhcmdldCIsIkZSQU1FOjpuYW1lIiwiSDE6OmFsaWdu
-IiwiSDI6OmFsaWduIiwiSDM6OmFsaWduIiwiSDQ6OmFsaWduIiwiSDU6OmFsaWduIiwiSDY6OmFsaWdu
-IiwiSFI6OmFsaWduIiwiSFI6Om5vc2hhZGUiLCJIUjo6c2l6ZSIsIkhSOjp3aWR0aCIsIkhUTUw6OnZl
-cnNpb24iLCJJRlJBTUU6OmFsaWduIiwiSUZSQU1FOjpmcmFtZWJvcmRlciIsIklGUkFNRTo6aGVpZ2h0
-IiwiSUZSQU1FOjptYXJnaW5oZWlnaHQiLCJJRlJBTUU6Om1hcmdpbndpZHRoIiwiSUZSQU1FOjp3aWR0
-aCIsIklNRzo6YWxpZ24iLCJJTUc6OmFsdCIsIklNRzo6Ym9yZGVyIiwiSU1HOjpoZWlnaHQiLCJJTUc6
-OmhzcGFjZSIsIklNRzo6aXNtYXAiLCJJTUc6Om5hbWUiLCJJTUc6OnVzZW1hcCIsIklNRzo6dnNwYWNl
-IiwiSU1HOjp3aWR0aCIsIklOUFVUOjphY2NlcHQiLCJJTlBVVDo6YWNjZXNza2V5IiwiSU5QVVQ6OmFs
-aWduIiwiSU5QVVQ6OmFsdCIsIklOUFVUOjphdXRvY29tcGxldGUiLCJJTlBVVDo6YXV0b2ZvY3VzIiwi
-SU5QVVQ6OmNoZWNrZWQiLCJJTlBVVDo6ZGlzYWJsZWQiLCJJTlBVVDo6aW5wdXRtb2RlIiwiSU5QVVQ6
-OmlzbWFwIiwiSU5QVVQ6Omxpc3QiLCJJTlBVVDo6bWF4IiwiSU5QVVQ6Om1heGxlbmd0aCIsIklOUFVU
-OjptaW4iLCJJTlBVVDo6bXVsdGlwbGUiLCJJTlBVVDo6bmFtZSIsIklOUFVUOjpwbGFjZWhvbGRlciIs
-IklOUFVUOjpyZWFkb25seSIsIklOUFVUOjpyZXF1aXJlZCIsIklOUFVUOjpzaXplIiwiSU5QVVQ6OnN0
-ZXAiLCJJTlBVVDo6dGFiaW5kZXgiLCJJTlBVVDo6dHlwZSIsIklOUFVUOjp1c2VtYXAiLCJJTlBVVDo6
-dmFsdWUiLCJJTlM6OmRhdGV0aW1lIiwiS0VZR0VOOjpkaXNhYmxlZCIsIktFWUdFTjo6a2V5dHlwZSIs
-IktFWUdFTjo6bmFtZSIsIkxBQkVMOjphY2Nlc3NrZXkiLCJMQUJFTDo6Zm9yIiwiTEVHRU5EOjphY2Nl
-c3NrZXkiLCJMRUdFTkQ6OmFsaWduIiwiTEk6OnR5cGUiLCJMSTo6dmFsdWUiLCJMSU5LOjpzaXplcyIs
-Ik1BUDo6bmFtZSIsIk1FTlU6OmNvbXBhY3QiLCJNRU5VOjpsYWJlbCIsIk1FTlU6OnR5cGUiLCJNRVRF
-Ujo6aGlnaCIsIk1FVEVSOjpsb3ciLCJNRVRFUjo6bWF4IiwiTUVURVI6Om1pbiIsIk1FVEVSOjp2YWx1
-ZSIsIk9CSkVDVDo6dHlwZW11c3RtYXRjaCIsIk9MOjpjb21wYWN0IiwiT0w6OnJldmVyc2VkIiwiT0w6
-OnN0YXJ0IiwiT0w6OnR5cGUiLCJPUFRHUk9VUDo6ZGlzYWJsZWQiLCJPUFRHUk9VUDo6bGFiZWwiLCJP
-UFRJT046OmRpc2FibGVkIiwiT1BUSU9OOjpsYWJlbCIsIk9QVElPTjo6c2VsZWN0ZWQiLCJPUFRJT046
-OnZhbHVlIiwiT1VUUFVUOjpmb3IiLCJPVVRQVVQ6Om5hbWUiLCJQOjphbGlnbiIsIlBSRTo6d2lkdGgi
-LCJQUk9HUkVTUzo6bWF4IiwiUFJPR1JFU1M6Om1pbiIsIlBST0dSRVNTOjp2YWx1ZSIsIlNFTEVDVDo6
-YXV0b2NvbXBsZXRlIiwiU0VMRUNUOjpkaXNhYmxlZCIsIlNFTEVDVDo6bXVsdGlwbGUiLCJTRUxFQ1Q6
-Om5hbWUiLCJTRUxFQ1Q6OnJlcXVpcmVkIiwiU0VMRUNUOjpzaXplIiwiU0VMRUNUOjp0YWJpbmRleCIs
-IlNPVVJDRTo6dHlwZSIsIlRBQkxFOjphbGlnbiIsIlRBQkxFOjpiZ2NvbG9yIiwiVEFCTEU6OmJvcmRl
-ciIsIlRBQkxFOjpjZWxscGFkZGluZyIsIlRBQkxFOjpjZWxsc3BhY2luZyIsIlRBQkxFOjpmcmFtZSIs
-IlRBQkxFOjpydWxlcyIsIlRBQkxFOjpzdW1tYXJ5IiwiVEFCTEU6OndpZHRoIiwiVEJPRFk6OmFsaWdu
-IiwiVEJPRFk6OmNoYXIiLCJUQk9EWTo6Y2hhcm9mZiIsIlRCT0RZOjp2YWxpZ24iLCJURDo6YWJiciIs
-IlREOjphbGlnbiIsIlREOjpheGlzIiwiVEQ6OmJnY29sb3IiLCJURDo6Y2hhciIsIlREOjpjaGFyb2Zm
-IiwiVEQ6OmNvbHNwYW4iLCJURDo6aGVhZGVycyIsIlREOjpoZWlnaHQiLCJURDo6bm93cmFwIiwiVEQ6
-OnJvd3NwYW4iLCJURDo6c2NvcGUiLCJURDo6dmFsaWduIiwiVEQ6OndpZHRoIiwiVEVYVEFSRUE6OmFj
-Y2Vzc2tleSIsIlRFWFRBUkVBOjphdXRvY29tcGxldGUiLCJURVhUQVJFQTo6Y29scyIsIlRFWFRBUkVB
-OjpkaXNhYmxlZCIsIlRFWFRBUkVBOjppbnB1dG1vZGUiLCJURVhUQVJFQTo6bmFtZSIsIlRFWFRBUkVB
-OjpwbGFjZWhvbGRlciIsIlRFWFRBUkVBOjpyZWFkb25seSIsIlRFWFRBUkVBOjpyZXF1aXJlZCIsIlRF
-WFRBUkVBOjpyb3dzIiwiVEVYVEFSRUE6OnRhYmluZGV4IiwiVEVYVEFSRUE6OndyYXAiLCJURk9PVDo6
-YWxpZ24iLCJURk9PVDo6Y2hhciIsIlRGT09UOjpjaGFyb2ZmIiwiVEZPT1Q6OnZhbGlnbiIsIlRIOjph
-YmJyIiwiVEg6OmFsaWduIiwiVEg6OmF4aXMiLCJUSDo6Ymdjb2xvciIsIlRIOjpjaGFyIiwiVEg6OmNo
-YXJvZmYiLCJUSDo6Y29sc3BhbiIsIlRIOjpoZWFkZXJzIiwiVEg6OmhlaWdodCIsIlRIOjpub3dyYXAi
-LCJUSDo6cm93c3BhbiIsIlRIOjpzY29wZSIsIlRIOjp2YWxpZ24iLCJUSDo6d2lkdGgiLCJUSEVBRDo6
-YWxpZ24iLCJUSEVBRDo6Y2hhciIsIlRIRUFEOjpjaGFyb2ZmIiwiVEhFQUQ6OnZhbGlnbiIsIlRSOjph
-bGlnbiIsIlRSOjpiZ2NvbG9yIiwiVFI6OmNoYXIiLCJUUjo6Y2hhcm9mZiIsIlRSOjp2YWxpZ24iLCJU
-UkFDSzo6ZGVmYXVsdCIsIlRSQUNLOjpraW5kIiwiVFJBQ0s6OmxhYmVsIiwiVFJBQ0s6OnNyY2xhbmci
-LCJVTDo6Y29tcGFjdCIsIlVMOjp0eXBlIiwiVklERU86OmNvbnRyb2xzIiwiVklERU86OmhlaWdodCIs
-IlZJREVPOjpsb29wIiwiVklERU86Om1lZGlhZ3JvdXAiLCJWSURFTzo6bXV0ZWQiLCJWSURFTzo6cHJl
-bG9hZCIsIlZJREVPOjp3aWR0aCJdKSx0LnMpCkMuVkM9SC5RSShzKFswLDAsNjU0OTAsNDUwNTUsNjU1
-MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMubUs9SC5RSShzKFswLDAsMjY2MjQsMTAyMyw2NTUz
-NCwyMDQ3LDY1NTM0LDIwNDddKSx0LnQpCkMuU3E9SC5RSShzKFsiSEVBRCIsIkFSRUEiLCJCQVNFIiwi
-QkFTRUZPTlQiLCJCUiIsIkNPTCIsIkNPTEdST1VQIiwiRU1CRUQiLCJGUkFNRSIsIkZSQU1FU0VUIiwi
-SFIiLCJJTUFHRSIsIklNRyIsIklOUFVUIiwiSVNJTkRFWCIsIkxJTksiLCJNRVRBIiwiUEFSQU0iLCJT
-T1VSQ0UiLCJTVFlMRSIsIlRJVExFIiwiV0JSIl0pLHQucykKQy5kbj1ILlFJKHMoW10pLEguTjAoImpk
-PExMPiIpKQpDLnhEPUguUUkocyhbXSksdC5zKQpDLmhVPUguUUkocyhbXSksdC5iKQpDLnRvPUguUUko
-cyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLnJrPUguUUko
-cyhbQy5BZCxDLm5lLEMubXksQy5yeCxDLndWLEMuZlJdKSxILk4wKCJqZDxINz4iKSkKQy5GMz1ILlFJ
-KHMoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLmVhPUguUUko
-cyhbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLlpKPUguUUko
-cyhbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLldkPUguUUko
-cyhbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdC50KQpDLlF4PUguUUko
-cyhbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRheCJdKSx0LnMpCkMuQkk9SC5RSShzKFsi
-QTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpjaXRlIiwiQk9EWTo6YmFja2dyb3VuZCIs
-IkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjphY3Rpb24iLCJJTUc6OnNyYyIsIklOUFVU
-OjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86OnBvc3RlciJdKSx0LnMpCkMuRHg9bmV3
-IEguTFAoMCx7fSxDLnhELEguTjAoIkxQPHFVLHpNPGo4Pj4iKSkKQy5DTT1uZXcgSC5MUCgwLHt9LEMu
-eEQsSC5OMCgiTFA8cVUscVU+IikpCkMuaUg9SC5RSShzKFtdKSxILk4wKCJqZDxHRD4iKSkKQy5XTz1u
-ZXcgSC5MUCgwLHt9LEMuaUgsSC5OMCgiTFA8R0QsQD4iKSkKQy5ZMj1uZXcgTC5POSgiTmF2aWdhdGlv
-blRyZWVOb2RlVHlwZS5kaXJlY3RvcnkiKQpDLnJmPW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJlZU5vZGVU
-eXBlLmZpbGUiKQpDLlRlPW5ldyBILnd2KCJjYWxsIikKQy5vRT1uZXcgUC5HWSghMSkKQy53UT1uZXcg
-UC5GeShudWxsLDIpfSkoKTsoZnVuY3Rpb24gc3RhdGljRmllbGRzKCl7JC56bT1udWxsCiQueWo9MAok
-LmkwPW51bGwKJC5BbD1udWxsCiQuTkY9bnVsbAokLlRYPW51bGwKJC54Nz1udWxsCiQubnc9bnVsbAok
-LnZ2PW51bGwKJC5Cdj1udWxsCiQuUzY9bnVsbAokLms4PW51bGwKJC5tZz1udWxsCiQuVUQ9ITEKJC5Y
-Mz1DLk5VCiQueGc9SC5RSShbXSxILk4wKCJqZDxNaD4iKSkKJC54bz1udWxsCiQuQk89bnVsbAokLmx0
-PW51bGwKJC5FVT1udWxsCiQub3I9UC5GbCh0Lk4sdC5ZKQokLklSPW51bGwKJC5JNj1udWxsCiQuRmY9
-bnVsbH0pKCk7KGZ1bmN0aW9uIGxhenlJbml0aWFsaXplcnMoKXt2YXIgcz1odW5rSGVscGVycy5sYXp5
-RmluYWwscj1odW5rSGVscGVycy5sYXp5CnMoJCwiZmEiLCJ6IixmdW5jdGlvbigpe3JldHVybiBILlln
-KCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCnMoJCwiS3EiLCJTbiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5j
-TShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2VpdmVyJCJ9fSkpfSkKcygkLCJ4
-cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRob2QkOm51bGwsCnRvU3RyaW5n
-OmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnMoJCwiUjEiLCJOOSIsZnVuY3Rpb24o
-KXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnMoJCwiZk4iLCJpSSIsZnVuY3Rpb24oKXtyZXR1cm4g
-SC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9IiRhcmd1bWVudHMkIgp0cnl7bnVsbC4k
-bWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMo
-JCwicWkiLCJVTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZvaWQgMCkpfSkKcygkLCJwdiIs
-IlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRhcmd1bWVudHNFeHByJD0i
-JGFyZ3VtZW50cyQiCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHEp
-e3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwia3EiLCJyTiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5j
-TShILk1qKG51bGwpKX0pCnMoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlv
-bigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwi
-ZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQgMCkpfSkKcygkLCJBNyIsInIx
-IixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRob2QkfWNh
-dGNoKHEpe3JldHVybiBxLm1lc3NhZ2V9fSgpKX0pCnMoJCwiV2MiLCJ1dCIsZnVuY3Rpb24oKXtyZXR1
-cm4gUC5PaigpfSkKcygkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVybiBuZXcgUC54cigpLiQwKCl9
-KQpzKCQsImRIIiwiSEciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLk56KCkuJDAoKX0pCnMoJCwiaGoi
-LCJWNyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEludDhBcnJheShILlhGKEguUUkoWy0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0xLC0yLC0yLC0yLC0yLC0yLDYy
-LC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0yLC0yLC0yLC0xLC0yLC0y
-LC0yLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEs
-MjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIsNjMsLTIsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUs
-MzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTIsLTIsLTIsLTIs
-LTJdLHQudCkpKX0pCnMoJCwiWWUiLCJ3USIsZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHByb2Nlc3Mh
-PSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PSJbb2Jq
-ZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5wbGF0Zm9ybT09IndpbjMyIn0pCnMoJCwibWYiLCJ6NCIsZnVu
-Y3Rpb24oKXtyZXR1cm4gUC5udSgiXltcXC1cXC4wLTlBLVpfYS16fl0qJCIpfSkKcygkLCJPUSIsInZa
-IixmdW5jdGlvbigpe3JldHVybiBQLktOKCl9KQpzKCQsIlNDIiwiQU4iLGZ1bmN0aW9uKCl7cmV0dXJu
-IFAudE0oWyJBIiwiQUJCUiIsIkFDUk9OWU0iLCJBRERSRVNTIiwiQVJFQSIsIkFSVElDTEUiLCJBU0lE
-RSIsIkFVRElPIiwiQiIsIkJESSIsIkJETyIsIkJJRyIsIkJMT0NLUVVPVEUiLCJCUiIsIkJVVFRPTiIs
-IkNBTlZBUyIsIkNBUFRJT04iLCJDRU5URVIiLCJDSVRFIiwiQ09ERSIsIkNPTCIsIkNPTEdST1VQIiwi
-Q09NTUFORCIsIkRBVEEiLCJEQVRBTElTVCIsIkREIiwiREVMIiwiREVUQUlMUyIsIkRGTiIsIkRJUiIs
-IkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJRUxEU0VUIiwiRklHQ0FQVElPTiIsIkZJR1VSRSIsIkZPTlQi
-LCJGT09URVIiLCJGT1JNIiwiSDEiLCJIMiIsIkgzIiwiSDQiLCJINSIsIkg2IiwiSEVBREVSIiwiSEdS
-T1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwiSU1HIiwiSU5QVVQiLCJJTlMiLCJLQkQiLCJMQUJFTCIsIkxF
-R0VORCIsIkxJIiwiTUFQIiwiTUFSSyIsIk1FTlUiLCJNRVRFUiIsIk5BViIsIk5PQlIiLCJPTCIsIk9Q
-VEdST1VQIiwiT1BUSU9OIiwiT1VUUFVUIiwiUCIsIlBSRSIsIlBST0dSRVNTIiwiUSIsIlMiLCJTQU1Q
-IiwiU0VDVElPTiIsIlNFTEVDVCIsIlNNQUxMIiwiU09VUkNFIiwiU1BBTiIsIlNUUklLRSIsIlNUUk9O
-RyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAiLCJUQUJMRSIsIlRCT0RZIiwiVEQiLCJURVhUQVJFQSIsIlRG
-T09UIiwiVEgiLCJUSEVBRCIsIlRJTUUiLCJUUiIsIlRSQUNLIiwiVFQiLCJVIiwiVUwiLCJWQVIiLCJW
-SURFTyIsIldCUiJdLHQuTil9KQpzKCQsIlg0IiwiaEciLGZ1bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5c
-XFMrJCIpfSkKcygkLCJ3TyIsIm93IixmdW5jdGlvbigpe3JldHVybiBQLk5EKHNlbGYpfSkKcygkLCJr
-dCIsIlI4IixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfZGFydE9iamVjdCIpfSkKcygkLCJm
-SyIsImtJIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBEYXJ0T2JqZWN0KGEpe3RoaXMubz1hfX0p
-CnMoJCwicXQiLCJ6QiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFQubVEoKX0pCnMoJCwiT2wiLCJVRSIs
-ZnVuY3Rpb24oKXtyZXR1cm4gUC5oSyhDLm9sLmdtVyhXLngzKCkpLmhyZWYpLmdoWSgpLnEoMCwiYXV0
-aFRva2VuIil9KQpzKCQsImhUIiwieVAiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVj
-dG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50Iil9KQpzKCQsIlc2IiwiaEwiLGZ1bmN0aW9uKCl7
-cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1wYW5lbCAucGFuZWwtY29udGVudCIpfSkK
-cygkLCJUUiIsIkRXIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiZm9vdGVy
-Iil9KQpzKCQsIkVZIiwiZmkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCJo
-ZWFkZXIiKX0pCnMoJCwiYkEiLCJjMCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0
-b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24iKX0pCnMoJCwidDAiLCJiTiIsZnVuY3Rpb24oKXty
-ZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiNtaWdyYXRlLXVuaXQtc3RhdHVzLWljb24tbGFiZWwi
-KX0pCnMoJCwiYXYiLCJEOSIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIiN1
-bml0LW5hbWUiKX0pCnIoJCwiZmUiLCJLRyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuWEEoKX0pCnMo
-JCwiZW8iLCJuVSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0ubEkoSC5OMCgiZnYiKS5hKCQuSGsoKSkp
-fSkKcygkLCJ5ciIsImJEIixmdW5jdGlvbigpe3JldHVybiBuZXcgRS5PRihQLm51KCIvIiksUC5udSgi
-W14vXSQiKSxQLm51KCJeLyIpKX0pCnMoJCwiTWsiLCJLayIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwu
-SVYoUC5udSgiWy9cXFxcXSIpLFAubnUoIlteL1xcXFxdJCIpLFAubnUoIl4oXFxcXFxcXFxbXlxcXFxd
-K1xcXFxbXlxcXFwvXSt8W2EtekEtWl06Wy9cXFxcXSkiKSxQLm51KCJeWy9cXFxcXSg/IVsvXFxcXF0p
-IikpfSkKcygkLCJhayIsIkViIixmdW5jdGlvbigpe3JldHVybiBuZXcgRi5ydShQLm51KCIvIiksUC5u
-dSgiKF5bYS16QS1aXVstKy5hLXpBLVpcXGRdKjovL3xbXi9dKSQiKSxQLm51KCJbYS16QS1aXVstKy5h
-LXpBLVpcXGRdKjovL1teL10qIiksUC5udSgiXi8iKSl9KQpzKCQsImxzIiwiSGsiLGZ1bmN0aW9uKCl7
-cmV0dXJuIE8uUmgoKX0pfSkoKTsoZnVuY3Rpb24gbmF0aXZlU3VwcG9ydCgpeyFmdW5jdGlvbigpe3Zh
-ciBzPWZ1bmN0aW9uKGEpe3ZhciBtPXt9Cm1bYV09MQpyZXR1cm4gT2JqZWN0LmtleXMoaHVua0hlbHBl
-cnMuY29udmVydFRvRmFzdE9iamVjdChtKSlbMF19CnYuZ2V0SXNvbGF0ZVRhZz1mdW5jdGlvbihhKXty
-ZXR1cm4gcygiX19fZGFydF8iK2Erdi5pc29sYXRlVGFnKX0KdmFyIHI9Il9fX2RhcnRfaXNvbGF0ZV90
-YWdzXyIKdmFyIHE9T2JqZWN0W3JdfHwoT2JqZWN0W3JdPU9iamVjdC5jcmVhdGUobnVsbCkpCnZhciBw
-PSJfWnhZeFgiCmZvcih2YXIgbz0wOztvKyspe3ZhciBuPXMocCsiXyIrbysiXyIpCmlmKCEobiBpbiBx
-KSl7cVtuXT0xCnYuaXNvbGF0ZVRhZz1uCmJyZWFrfX12LmRpc3BhdGNoUHJvcGVydHlOYW1lPXYuZ2V0
-SXNvbGF0ZVRhZygiZGlzcGF0Y2hfcmVjb3JkIil9KCkKaHVua0hlbHBlcnMuc2V0T3JVcGRhdGVJbnRl
-cmNlcHRvcnNCeVRhZyh7RE9NRXJyb3I6Si5HdixNZWRpYUVycm9yOkouR3YsTmF2aWdhdG9yOkouR3Ys
-TmF2aWdhdG9yQ29uY3VycmVudEhhcmR3YXJlOkouR3YsTmF2aWdhdG9yVXNlck1lZGlhRXJyb3I6Si5H
-dixPdmVyY29uc3RyYWluZWRFcnJvcjpKLkd2LFBvc2l0aW9uRXJyb3I6Si5HdixHZW9sb2NhdGlvblBv
-c2l0aW9uRXJyb3I6Si5HdixSYW5nZTpKLkd2LFNRTEVycm9yOkouR3YsRGF0YVZpZXc6SC5FVCxBcnJh
-eUJ1ZmZlclZpZXc6SC5FVCxGbG9hdDMyQXJyYXk6SC5EZyxGbG9hdDY0QXJyYXk6SC5EZyxJbnQxNkFy
-cmF5OkgueGosSW50MzJBcnJheTpILmRFLEludDhBcnJheTpILlpBLFVpbnQxNkFycmF5OkguZFQsVWlu
-dDMyQXJyYXk6SC5QcSxVaW50OENsYW1wZWRBcnJheTpILmVFLENhbnZhc1BpeGVsQXJyYXk6SC5lRSxV
-aW50OEFycmF5OkguVjYsSFRNTEF1ZGlvRWxlbWVudDpXLnFFLEhUTUxCUkVsZW1lbnQ6Vy5xRSxIVE1M
-QnV0dG9uRWxlbWVudDpXLnFFLEhUTUxDYW52YXNFbGVtZW50OlcucUUsSFRNTENvbnRlbnRFbGVtZW50
-OlcucUUsSFRNTERMaXN0RWxlbWVudDpXLnFFLEhUTUxEYXRhRWxlbWVudDpXLnFFLEhUTUxEYXRhTGlz
-dEVsZW1lbnQ6Vy5xRSxIVE1MRGV0YWlsc0VsZW1lbnQ6Vy5xRSxIVE1MRGlhbG9nRWxlbWVudDpXLnFF
-LEhUTUxEaXZFbGVtZW50OlcucUUsSFRNTEVtYmVkRWxlbWVudDpXLnFFLEhUTUxGaWVsZFNldEVsZW1l
-bnQ6Vy5xRSxIVE1MSFJFbGVtZW50OlcucUUsSFRNTEhlYWRFbGVtZW50OlcucUUsSFRNTEhlYWRpbmdF
-bGVtZW50OlcucUUsSFRNTEh0bWxFbGVtZW50OlcucUUsSFRNTElGcmFtZUVsZW1lbnQ6Vy5xRSxIVE1M
-SW1hZ2VFbGVtZW50OlcucUUsSFRNTElucHV0RWxlbWVudDpXLnFFLEhUTUxMSUVsZW1lbnQ6Vy5xRSxI
-VE1MTGFiZWxFbGVtZW50OlcucUUsSFRNTExlZ2VuZEVsZW1lbnQ6Vy5xRSxIVE1MTGlua0VsZW1lbnQ6
-Vy5xRSxIVE1MTWFwRWxlbWVudDpXLnFFLEhUTUxNZWRpYUVsZW1lbnQ6Vy5xRSxIVE1MTWVudUVsZW1l
-bnQ6Vy5xRSxIVE1MTWV0YUVsZW1lbnQ6Vy5xRSxIVE1MTWV0ZXJFbGVtZW50OlcucUUsSFRNTE1vZEVs
-ZW1lbnQ6Vy5xRSxIVE1MT0xpc3RFbGVtZW50OlcucUUsSFRNTE9iamVjdEVsZW1lbnQ6Vy5xRSxIVE1M
-T3B0R3JvdXBFbGVtZW50OlcucUUsSFRNTE9wdGlvbkVsZW1lbnQ6Vy5xRSxIVE1MT3V0cHV0RWxlbWVu
-dDpXLnFFLEhUTUxQYXJhbUVsZW1lbnQ6Vy5xRSxIVE1MUGljdHVyZUVsZW1lbnQ6Vy5xRSxIVE1MUHJl
-RWxlbWVudDpXLnFFLEhUTUxQcm9ncmVzc0VsZW1lbnQ6Vy5xRSxIVE1MUXVvdGVFbGVtZW50OlcucUUs
-SFRNTFNjcmlwdEVsZW1lbnQ6Vy5xRSxIVE1MU2hhZG93RWxlbWVudDpXLnFFLEhUTUxTbG90RWxlbWVu
-dDpXLnFFLEhUTUxTb3VyY2VFbGVtZW50OlcucUUsSFRNTFNwYW5FbGVtZW50OlcucUUsSFRNTFN0eWxl
-RWxlbWVudDpXLnFFLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OlcucUUsSFRNTFRhYmxlQ2VsbEVsZW1l
-bnQ6Vy5xRSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVIZWFkZXJDZWxsRWxl
-bWVudDpXLnFFLEhUTUxUYWJsZUNvbEVsZW1lbnQ6Vy5xRSxIVE1MVGV4dEFyZWFFbGVtZW50OlcucUUs
-SFRNTFRpbWVFbGVtZW50OlcucUUsSFRNTFRpdGxlRWxlbWVudDpXLnFFLEhUTUxUcmFja0VsZW1lbnQ6
-Vy5xRSxIVE1MVUxpc3RFbGVtZW50OlcucUUsSFRNTFVua25vd25FbGVtZW50OlcucUUsSFRNTFZpZGVv
-RWxlbWVudDpXLnFFLEhUTUxEaXJlY3RvcnlFbGVtZW50OlcucUUsSFRNTEZvbnRFbGVtZW50OlcucUUs
-SFRNTEZyYW1lRWxlbWVudDpXLnFFLEhUTUxGcmFtZVNldEVsZW1lbnQ6Vy5xRSxIVE1MTWFycXVlZUVs
-ZW1lbnQ6Vy5xRSxIVE1MRWxlbWVudDpXLnFFLEhUTUxBbmNob3JFbGVtZW50OlcuR2gsSFRNTEFyZWFF
-bGVtZW50OlcuZlksSFRNTEJhc2VFbGVtZW50OlcuclosQmxvYjpXLkF6LEhUTUxCb2R5RWxlbWVudDpX
-LlFQLENEQVRBU2VjdGlvbjpXLm54LENoYXJhY3RlckRhdGE6Vy5ueCxDb21tZW50OlcubngsUHJvY2Vz
-c2luZ0luc3RydWN0aW9uOlcubngsVGV4dDpXLm54LENTU1N0eWxlRGVjbGFyYXRpb246Vy5vSixNU1N0
-eWxlQ1NTUHJvcGVydGllczpXLm9KLENTUzJQcm9wZXJ0aWVzOlcub0osWE1MRG9jdW1lbnQ6Vy5RRixE
-b2N1bWVudDpXLlFGLERPTUV4Y2VwdGlvbjpXLk5oLERPTUltcGxlbWVudGF0aW9uOlcuYWUsRE9NUmVj
-dFJlYWRPbmx5OlcuSUIsRE9NVG9rZW5MaXN0OlcubjcsRWxlbWVudDpXLmN2LEFib3J0UGF5bWVudEV2
-ZW50OlcuZWEsQW5pbWF0aW9uRXZlbnQ6Vy5lYSxBbmltYXRpb25QbGF5YmFja0V2ZW50OlcuZWEsQXBw
-bGljYXRpb25DYWNoZUVycm9yRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OlcuZWEs
-QmFja2dyb3VuZEZldGNoRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6Vy5lYSxCYWNr
-Z3JvdW5kRmV0Y2hlZEV2ZW50OlcuZWEsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OlcuZWEsQmVmb3Jl
-VW5sb2FkRXZlbnQ6Vy5lYSxCbG9iRXZlbnQ6Vy5lYSxDYW5NYWtlUGF5bWVudEV2ZW50OlcuZWEsQ2xp
-cGJvYXJkRXZlbnQ6Vy5lYSxDbG9zZUV2ZW50OlcuZWEsQ3VzdG9tRXZlbnQ6Vy5lYSxEZXZpY2VNb3Rp
-b25FdmVudDpXLmVhLERldmljZU9yaWVudGF0aW9uRXZlbnQ6Vy5lYSxFcnJvckV2ZW50OlcuZWEsRXh0
-ZW5kYWJsZUV2ZW50OlcuZWEsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDpXLmVhLEZldGNoRXZlbnQ6Vy5l
-YSxGb250RmFjZVNldExvYWRFdmVudDpXLmVhLEZvcmVpZ25GZXRjaEV2ZW50OlcuZWEsR2FtZXBhZEV2
-ZW50OlcuZWEsSGFzaENoYW5nZUV2ZW50OlcuZWEsSW5zdGFsbEV2ZW50OlcuZWEsTWVkaWFFbmNyeXB0
-ZWRFdmVudDpXLmVhLE1lZGlhS2V5TWVzc2FnZUV2ZW50OlcuZWEsTWVkaWFRdWVyeUxpc3RFdmVudDpX
-LmVhLE1lZGlhU3RyZWFtRXZlbnQ6Vy5lYSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6Vy5lYSxNZXNzYWdl
-RXZlbnQ6Vy5lYSxNSURJQ29ubmVjdGlvbkV2ZW50OlcuZWEsTUlESU1lc3NhZ2VFdmVudDpXLmVhLE11
-dGF0aW9uRXZlbnQ6Vy5lYSxOb3RpZmljYXRpb25FdmVudDpXLmVhLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6
-Vy5lYSxQYXltZW50UmVxdWVzdEV2ZW50OlcuZWEsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDpXLmVh
-LFBvcFN0YXRlRXZlbnQ6Vy5lYSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6Vy5l
-YSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDpXLmVhLFByb21pc2VSZWplY3Rpb25FdmVu
-dDpXLmVhLFB1c2hFdmVudDpXLmVhLFJUQ0RhdGFDaGFubmVsRXZlbnQ6Vy5lYSxSVENEVE1GVG9uZUNo
-YW5nZUV2ZW50OlcuZWEsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDpXLmVhLFJUQ1RyYWNrRXZlbnQ6
-Vy5lYSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OlcuZWEsU2Vuc29yRXJyb3JFdmVudDpXLmVh
-LFNwZWVjaFJlY29nbml0aW9uRXJyb3I6Vy5lYSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OlcuZWEsU3Bl
-ZWNoU3ludGhlc2lzRXZlbnQ6Vy5lYSxTdG9yYWdlRXZlbnQ6Vy5lYSxTeW5jRXZlbnQ6Vy5lYSxUcmFj
-a0V2ZW50OlcuZWEsVHJhbnNpdGlvbkV2ZW50OlcuZWEsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OlcuZWEs
-VlJEZXZpY2VFdmVudDpXLmVhLFZSRGlzcGxheUV2ZW50OlcuZWEsVlJTZXNzaW9uRXZlbnQ6Vy5lYSxN
-b2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OlcuZWEsVVNCQ29ubmVjdGlvbkV2ZW50OlcuZWEsSURCVmVy
-c2lvbkNoYW5nZUV2ZW50OlcuZWEsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6Vy5lYSxPZmZsaW5lQXVkaW9D
-b21wbGV0aW9uRXZlbnQ6Vy5lYSxXZWJHTENvbnRleHRFdmVudDpXLmVhLEV2ZW50OlcuZWEsSW5wdXRF
-dmVudDpXLmVhLFN1Ym1pdEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuaEgsSFRNTEZv
-cm1FbGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBSZXF1ZXN0
-OlcuZkosWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExvY2F0aW9u
-OlcudTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJFdmVudDpXLkFqLFdoZWVs
-RXZlbnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcuS1YsU2hhZG93Um9vdDpXLktWLERvY3VtZW50VHlw
-ZTpXLktWLE5vZGU6Vy5LVixOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1MUGFyYWdy
-YXBoRWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6Vy5l
-dyxIVE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFibGVSb3dF
-bGVtZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5XUCxIVE1MVGVtcGxhdGVFbGVtZW50
-OlcueVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2ZW50Olcu
-dzYsVGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6Vy5LNSxE
-T01XaW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VXb3JrZXJH
-bG9iYWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xvYmFsU2Nv
-cGU6Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5vZGVNYXA6
-Vy5yaCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVsZW1lbnQ6
-UC5uZCxTVkdBRWxlbWVudDpQLmhpLFNWR0FuaW1hdGVFbGVtZW50OlAuaGksU1ZHQW5pbWF0ZU1vdGlv
-bkVsZW1lbnQ6UC5oaSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmhpLFNWR0FuaW1hdGlvbkVs
-ZW1lbnQ6UC5oaSxTVkdDaXJjbGVFbGVtZW50OlAuaGksU1ZHQ2xpcFBhdGhFbGVtZW50OlAuaGksU1ZH
-RGVmc0VsZW1lbnQ6UC5oaSxTVkdEZXNjRWxlbWVudDpQLmhpLFNWR0Rpc2NhcmRFbGVtZW50OlAuaGks
-U1ZHRWxsaXBzZUVsZW1lbnQ6UC5oaSxTVkdGRUJsZW5kRWxlbWVudDpQLmhpLFNWR0ZFQ29sb3JNYXRy
-aXhFbGVtZW50OlAuaGksU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5oaSxTVkdGRUNvbXBv
-c2l0ZUVsZW1lbnQ6UC5oaSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmhpLFNWR0ZFRGlmZnVz
-ZUxpZ2h0aW5nRWxlbWVudDpQLmhpLFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmhpLFNWR0ZF
-RGlzdGFudExpZ2h0RWxlbWVudDpQLmhpLFNWR0ZFRmxvb2RFbGVtZW50OlAuaGksU1ZHRkVGdW5jQUVs
-ZW1lbnQ6UC5oaSxTVkdGRUZ1bmNCRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0dFbGVtZW50OlAuaGksU1ZH
-RkVGdW5jUkVsZW1lbnQ6UC5oaSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5oaSxTVkdGRUltYWdl
-RWxlbWVudDpQLmhpLFNWR0ZFTWVyZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJnZU5vZGVFbGVtZW50OlAu
-aGksU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmhpLFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmhpLFNWR0ZF
-UG9pbnRMaWdodEVsZW1lbnQ6UC5oaSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAuaGksU1ZH
-RkVTcG90TGlnaHRFbGVtZW50OlAuaGksU1ZHRkVUaWxlRWxlbWVudDpQLmhpLFNWR0ZFVHVyYnVsZW5j
-ZUVsZW1lbnQ6UC5oaSxTVkdGaWx0ZXJFbGVtZW50OlAuaGksU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6
-UC5oaSxTVkdHRWxlbWVudDpQLmhpLFNWR0dlb21ldHJ5RWxlbWVudDpQLmhpLFNWR0dyYXBoaWNzRWxl
-bWVudDpQLmhpLFNWR0ltYWdlRWxlbWVudDpQLmhpLFNWR0xpbmVFbGVtZW50OlAuaGksU1ZHTGluZWFy
-R3JhZGllbnRFbGVtZW50OlAuaGksU1ZHTWFya2VyRWxlbWVudDpQLmhpLFNWR01hc2tFbGVtZW50OlAu
-aGksU1ZHTWV0YWRhdGFFbGVtZW50OlAuaGksU1ZHUGF0aEVsZW1lbnQ6UC5oaSxTVkdQYXR0ZXJuRWxl
-bWVudDpQLmhpLFNWR1BvbHlnb25FbGVtZW50OlAuaGksU1ZHUG9seWxpbmVFbGVtZW50OlAuaGksU1ZH
-UmFkaWFsR3JhZGllbnRFbGVtZW50OlAuaGksU1ZHUmVjdEVsZW1lbnQ6UC5oaSxTVkdTZXRFbGVtZW50
-OlAuaGksU1ZHU3RvcEVsZW1lbnQ6UC5oaSxTVkdTdHlsZUVsZW1lbnQ6UC5oaSxTVkdTVkdFbGVtZW50
-OlAuaGksU1ZHU3dpdGNoRWxlbWVudDpQLmhpLFNWR1N5bWJvbEVsZW1lbnQ6UC5oaSxTVkdUU3BhbkVs
-ZW1lbnQ6UC5oaSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5oaSxTVkdUZXh0RWxlbWVudDpQLmhpLFNW
-R1RleHRQYXRoRWxlbWVudDpQLmhpLFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5oaSxTVkdUaXRs
-ZUVsZW1lbnQ6UC5oaSxTVkdVc2VFbGVtZW50OlAuaGksU1ZHVmlld0VsZW1lbnQ6UC5oaSxTVkdHcmFk
-aWVudEVsZW1lbnQ6UC5oaSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQLmhpLFNW
-R0ZFRHJvcFNoYWRvd0VsZW1lbnQ6UC5oaSxTVkdNUGF0aEVsZW1lbnQ6UC5oaSxTVkdFbGVtZW50OlAu
-aGl9KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLE1lZGlhRXJy
-b3I6dHJ1ZSxOYXZpZ2F0b3I6dHJ1ZSxOYXZpZ2F0b3JDb25jdXJyZW50SGFyZHdhcmU6dHJ1ZSxOYXZp
-Z2F0b3JVc2VyTWVkaWFFcnJvcjp0cnVlLE92ZXJjb25zdHJhaW5lZEVycm9yOnRydWUsUG9zaXRpb25F
-cnJvcjp0cnVlLEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcjp0cnVlLFJhbmdlOnRydWUsU1FMRXJyb3I6
-dHJ1ZSxEYXRhVmlldzp0cnVlLEFycmF5QnVmZmVyVmlldzpmYWxzZSxGbG9hdDMyQXJyYXk6dHJ1ZSxG
-bG9hdDY0QXJyYXk6dHJ1ZSxJbnQxNkFycmF5OnRydWUsSW50MzJBcnJheTp0cnVlLEludDhBcnJheTp0
-cnVlLFVpbnQxNkFycmF5OnRydWUsVWludDMyQXJyYXk6dHJ1ZSxVaW50OENsYW1wZWRBcnJheTp0cnVl
-LENhbnZhc1BpeGVsQXJyYXk6dHJ1ZSxVaW50OEFycmF5OmZhbHNlLEhUTUxBdWRpb0VsZW1lbnQ6dHJ1
-ZSxIVE1MQlJFbGVtZW50OnRydWUsSFRNTEJ1dHRvbkVsZW1lbnQ6dHJ1ZSxIVE1MQ2FudmFzRWxlbWVu
-dDp0cnVlLEhUTUxDb250ZW50RWxlbWVudDp0cnVlLEhUTUxETGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGF0
-YUVsZW1lbnQ6dHJ1ZSxIVE1MRGF0YUxpc3RFbGVtZW50OnRydWUsSFRNTERldGFpbHNFbGVtZW50OnRy
-dWUsSFRNTERpYWxvZ0VsZW1lbnQ6dHJ1ZSxIVE1MRGl2RWxlbWVudDp0cnVlLEhUTUxFbWJlZEVsZW1l
-bnQ6dHJ1ZSxIVE1MRmllbGRTZXRFbGVtZW50OnRydWUsSFRNTEhSRWxlbWVudDp0cnVlLEhUTUxIZWFk
-RWxlbWVudDp0cnVlLEhUTUxIZWFkaW5nRWxlbWVudDp0cnVlLEhUTUxIdG1sRWxlbWVudDp0cnVlLEhU
-TUxJRnJhbWVFbGVtZW50OnRydWUsSFRNTEltYWdlRWxlbWVudDp0cnVlLEhUTUxJbnB1dEVsZW1lbnQ6
-dHJ1ZSxIVE1MTElFbGVtZW50OnRydWUsSFRNTExhYmVsRWxlbWVudDp0cnVlLEhUTUxMZWdlbmRFbGVt
-ZW50OnRydWUsSFRNTExpbmtFbGVtZW50OnRydWUsSFRNTE1hcEVsZW1lbnQ6dHJ1ZSxIVE1MTWVkaWFF
-bGVtZW50OnRydWUsSFRNTE1lbnVFbGVtZW50OnRydWUsSFRNTE1ldGFFbGVtZW50OnRydWUsSFRNTE1l
-dGVyRWxlbWVudDp0cnVlLEhUTUxNb2RFbGVtZW50OnRydWUsSFRNTE9MaXN0RWxlbWVudDp0cnVlLEhU
-TUxPYmplY3RFbGVtZW50OnRydWUsSFRNTE9wdEdyb3VwRWxlbWVudDp0cnVlLEhUTUxPcHRpb25FbGVt
-ZW50OnRydWUsSFRNTE91dHB1dEVsZW1lbnQ6dHJ1ZSxIVE1MUGFyYW1FbGVtZW50OnRydWUsSFRNTFBp
-Y3R1cmVFbGVtZW50OnRydWUsSFRNTFByZUVsZW1lbnQ6dHJ1ZSxIVE1MUHJvZ3Jlc3NFbGVtZW50OnRy
-dWUsSFRNTFF1b3RlRWxlbWVudDp0cnVlLEhUTUxTY3JpcHRFbGVtZW50OnRydWUsSFRNTFNoYWRvd0Vs
-ZW1lbnQ6dHJ1ZSxIVE1MU2xvdEVsZW1lbnQ6dHJ1ZSxIVE1MU291cmNlRWxlbWVudDp0cnVlLEhUTUxT
-cGFuRWxlbWVudDp0cnVlLEhUTUxTdHlsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDYXB0aW9uRWxlbWVu
-dDp0cnVlLEhUTUxUYWJsZUNlbGxFbGVtZW50OnRydWUsSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50OnRy
-dWUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVDb2xFbGVtZW50OnRydWUs
-SFRNTFRleHRBcmVhRWxlbWVudDp0cnVlLEhUTUxUaW1lRWxlbWVudDp0cnVlLEhUTUxUaXRsZUVsZW1l
-bnQ6dHJ1ZSxIVE1MVHJhY2tFbGVtZW50OnRydWUsSFRNTFVMaXN0RWxlbWVudDp0cnVlLEhUTUxVbmtu
-b3duRWxlbWVudDp0cnVlLEhUTUxWaWRlb0VsZW1lbnQ6dHJ1ZSxIVE1MRGlyZWN0b3J5RWxlbWVudDp0
-cnVlLEhUTUxGb250RWxlbWVudDp0cnVlLEhUTUxGcmFtZUVsZW1lbnQ6dHJ1ZSxIVE1MRnJhbWVTZXRF
-bGVtZW50OnRydWUsSFRNTE1hcnF1ZWVFbGVtZW50OnRydWUsSFRNTEVsZW1lbnQ6ZmFsc2UsSFRNTEFu
-Y2hvckVsZW1lbnQ6dHJ1ZSxIVE1MQXJlYUVsZW1lbnQ6dHJ1ZSxIVE1MQmFzZUVsZW1lbnQ6dHJ1ZSxC
-bG9iOmZhbHNlLEhUTUxCb2R5RWxlbWVudDp0cnVlLENEQVRBU2VjdGlvbjp0cnVlLENoYXJhY3RlckRh
-dGE6dHJ1ZSxDb21tZW50OnRydWUsUHJvY2Vzc2luZ0luc3RydWN0aW9uOnRydWUsVGV4dDp0cnVlLENT
-U1N0eWxlRGVjbGFyYXRpb246dHJ1ZSxNU1N0eWxlQ1NTUHJvcGVydGllczp0cnVlLENTUzJQcm9wZXJ0
-aWVzOnRydWUsWE1MRG9jdW1lbnQ6dHJ1ZSxEb2N1bWVudDpmYWxzZSxET01FeGNlcHRpb246dHJ1ZSxE
-T01JbXBsZW1lbnRhdGlvbjp0cnVlLERPTVJlY3RSZWFkT25seTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1
-ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVudEV2ZW50OnRydWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxB
-bmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUsQXBwbGljYXRpb25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxC
-YWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNr
-Z3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hlZEV2ZW50OnRydWUsQmVmb3Jl
-SW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVmb3JlVW5sb2FkRXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1
-ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUsQ2xpcGJvYXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRy
-dWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VNb3Rpb25FdmVudDp0cnVlLERldmljZU9yaWVudGF0aW9u
-RXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUsRXh0ZW5kYWJsZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1l
-c3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6dHJ1ZSxGb250RmFjZVNldExvYWRFdmVudDp0cnVlLEZv
-cmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBhZEV2ZW50OnRydWUsSGFzaENoYW5nZUV2ZW50OnRydWUs
-SW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNyeXB0ZWRFdmVudDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2
-ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVudDp0cnVlLE1lZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRp
-YVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNzYWdlRXZlbnQ6dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50
-OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVlLE11dGF0aW9uRXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25F
-dmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdEV2ZW50OnRydWUs
-UGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0cnVlLFBvcFN0YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRp
-b25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VF
-dmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25FdmVudDp0cnVlLFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFD
-aGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9uZUNoYW5nZUV2ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rp
-b25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZlbnQ6dHJ1ZSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2
-ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxT
-cGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUsU3BlZWNoU3ludGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdl
-RXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxUcmFja0V2ZW50OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRy
-dWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRydWUsVlJEZXZpY2VFdmVudDp0cnVlLFZSRGlzcGxheUV2
-ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1ZSxNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUs
-VVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURCVmVyc2lvbkNoYW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9j
-ZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVkaW9Db21wbGV0aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRl
-eHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElucHV0RXZlbnQ6ZmFsc2UsU3VibWl0RXZlbnQ6ZmFsc2Us
-RXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3JtRWxlbWVudDp0cnVlLEhpc3Rvcnk6dHJ1
-ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0dHBSZXF1ZXN0RXZlbnRU
-YXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246dHJ1ZSxNb3VzZUV2ZW50OnRydWUsRHJh
-Z0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxFdmVudDp0cnVlLERvY3VtZW50RnJhZ21l
-bnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBlOnRydWUsTm9kZTpmYWxzZSxOb2RlTGlz
-dDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdyYXBoRWxlbWVudDp0cnVlLFByb2dyZXNz
-RXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1ZSxIVE1MU2VsZWN0RWxlbWVudDp0cnVl
-LEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dFbGVtZW50OnRydWUsSFRNTFRhYmxlU2Vj
-dGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50OnRydWUsQ29tcG9zaXRpb25FdmVudDp0
-cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRydWUsVGV4dEV2ZW50OnRydWUsVG91Y2hF
-dmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUsRE9NV2luZG93OnRydWUsRGVkaWNhdGVk
-V29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTaGFyZWRX
-b3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3BlOnRydWUsQXR0cjp0cnVlLENsaWVu
-dFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFwOnRydWUsTW96TmFtZWRBdHRyTWFwOnRy
-dWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50OnRydWUsU1ZHQUVsZW1lbnQ6dHJ1ZSxT
-VkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OnRydWUsU1ZHQW5pbWF0
-ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25FbGVtZW50OnRydWUsU1ZHQ2lyY2xlRWxl
-bWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNWR0RlZnNFbGVtZW50OnRydWUsU1ZHRGVz
-Y0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVlLFNWR0VsbGlwc2VFbGVtZW50OnRydWUs
-U1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDp0cnVlLFNWR0ZFQ29t
-cG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21wb3NpdGVFbGVtZW50OnRydWUsU1ZHRkVD
-b252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxT
-VkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdGRURpc3RhbnRMaWdodEVsZW1lbnQ6dHJ1
-ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FFbGVtZW50OnRydWUsU1ZHRkVGdW5jQkVs
-ZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNWR0ZFRnVuY1JFbGVtZW50OnRydWUsU1ZH
-RkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdl
-RWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0cnVlLFNWR0ZFTW9ycGhvbG9neUVsZW1l
-bnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdGRVBvaW50TGlnaHRFbGVtZW50OnRydWUs
-U1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFU3BvdExpZ2h0RWxlbWVudDp0cnVl
-LFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OnRydWUsU1ZHRmlsdGVy
-RWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OnRydWUsU1ZHR0VsZW1lbnQ6dHJ1ZSxT
-VkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0VsZW1lbnQ6dHJ1ZSxTVkdJbWFnZUVsZW1l
-bnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVhckdyYWRpZW50RWxlbWVudDp0cnVlLFNW
-R01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0cnVlLFNWR01ldGFkYXRhRWxlbWVudDp0
-cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5Z29uRWxl
-bWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNWR1JhZGlhbEdyYWRpZW50RWxlbWVudDp0
-cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVudDp0cnVlLFNWR1N0b3BFbGVtZW50OnRy
-dWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVudDp0cnVlLFNWR1N3aXRjaEVsZW1lbnQ6
-dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5FbGVtZW50OnRydWUsU1ZHVGV4dENvbnRl
-bnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UGF0aEVsZW1lbnQ6dHJ1ZSxT
-VkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0bGVFbGVtZW50OnRydWUsU1ZHVXNlRWxl
-bWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHQ29t
-cG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdGRURyb3BTaGFkb3dFbGVtZW50OnRy
-dWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpmYWxzZX0pCkguTFouJG5hdGl2ZVN1cGVy
-Y2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlC
-dWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguRGcu
-JG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5XQi4kbmF0aXZlU3VwZXJjbGFz
-c1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZl
-clZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyJ9KSgpCmNvbnZl
-cnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9iamVjdCgkKTsoZnVuY3Rpb24oYSl7aWYo
-dHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVsbCkKcmV0dXJufWlmKHR5cGVvZiBkb2N1
-bWVudC5jdXJyZW50U2NyaXB0IT0idW5kZWZpbmVkIil7YShkb2N1bWVudC5jdXJyZW50U2NyaXB0KQpy
-ZXR1cm59dmFyIHM9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlvbiBvbkxvYWQoYil7Zm9yKHZhciBxPTA7
-cTxzLmxlbmd0aDsrK3Epc1txXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2Up
-CmEoYi50YXJnZXQpfWZvcih2YXIgcj0wO3I8cy5sZW5ndGg7KytyKXNbcl0uYWRkRXZlbnRMaXN0ZW5l
-cigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEpe3YuY3VycmVudFNjcmlwdD1hCnZhciBz
-PUwuSXEKaWYodHlwZW9mIGRhcnRNYWluUnVubmVyPT09ImZ1bmN0aW9uIilkYXJ0TWFpblJ1bm5lcihz
-LFtdKQplbHNlIHMoW10pfSl9KSgpCi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pZ3JhdGlvbi5qcy5tYXAK
+RSI6IklqIn0sImRUIjp7ImxEIjpbIklqIl0sIlhqIjpbIklqIl0sInpNIjpbIklqIl0sIkVUIjpbXSwi
+YlEiOlsiSWoiXSwiQVMiOltdLCJjWCI6WyJJaiJdLCJTVSI6WyJJaiJdLCJsRC5FIjoiSWoifSwiUHEi
+OnsibEQiOlsiSWoiXSwiWGoiOlsiSWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJB
+UyI6W10sImNYIjpbIklqIl0sIlNVIjpbIklqIl0sImxELkUiOiJJaiJ9LCJlRSI6eyJsRCI6WyJJaiJd
+LCJYaiI6WyJJaiJdLCJ6TSI6WyJJaiJdLCJFVCI6W10sImJRIjpbIklqIl0sIkFTIjpbXSwiY1giOlsi
+SWoiXSwiU1UiOlsiSWoiXSwibEQuRSI6IklqIn0sIlY2Ijp7ImxEIjpbIklqIl0sIm42IjpbXSwiWGoi
+OlsiSWoiXSwiek0iOlsiSWoiXSwiRVQiOltdLCJiUSI6WyJJaiJdLCJBUyI6W10sImNYIjpbIklqIl0s
+IlNVIjpbIklqIl0sImxELkUiOiJJaiJ9LCJrUyI6eyJYUyI6W119LCJpTSI6eyJFeiI6W10sIlhTIjpb
+XX0sInZzIjp7ImI4IjpbIjEiXX0sIkdWIjp7IkFuIjpbIjEiXX0sInE0Ijp7ImNYIjpbIjEiXSwiY1gu
+RSI6IjEifSwiQ3ciOnsiWFMiOltdfSwiWmYiOnsiUGYiOlsiMSJdfSwibTAiOnsiUW0iOltdfSwiSmki
+OnsibTAiOltdLCJRbSI6W119LCJiNiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJj
+WCI6WyIxIl0sImxmLkUiOiIxIn0sImxtIjp7IkFuIjpbIjEiXX0sIm1XIjp7ImNYIjpbIjEiXX0sInV5
+Ijp7ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJiUSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpb
+IjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJZayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsi
+MSIsIjIiXX0sIkdqIjp7IlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0s
+IlowIjpbIjEiLCIyIl19LCJWaiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6
+WyIxIl19LCJYdiI6eyJsZiI6WyIxIl0sInh1IjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl19LCJ1
+dyI6eyJZayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0s
+Imk4Ijp7ImFMIjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUi
+OiJxVSJ9LCJDViI6eyJVayI6WyJ6TTxJaj4iLCJxVSJdLCJVay5TIjoiek08SWo+In0sIlU4Ijp7IndJ
+IjpbInpNPElqPiIsInFVIl19LCJaaSI6eyJVayI6WyJxVSIsInpNPElqPiJdfSwiVWQiOnsiWFMiOltd
+fSwiSzgiOnsiWFMiOltdfSwiYnkiOnsiVWsiOlsiTWg/IiwicVUiXSwiVWsuUyI6Ik1oPyJ9LCJvaiI6
+eyJ3SSI6WyJNaD8iLCJxVSJdfSwiTXgiOnsid0kiOlsicVUiLCJNaD8iXX0sInU1Ijp7IlVrIjpbInFV
+Iiwiek08SWo+Il0sIlVrLlMiOiJxVSJ9LCJFMyI6eyJ3SSI6WyJxVSIsInpNPElqPiJdfSwiR1kiOnsi
+d0kiOlsiek08SWo+IiwicVUiXX0sIkNQIjp7IlpaIjpbXX0sIklqIjp7IlpaIjpbXX0sInpNIjp7ImJR
+IjpbIjEiXSwiY1giOlsiMSJdfSwiaWIiOnsiT2QiOltdfSwieHUiOnsiYlEiOlsiMSJdLCJjWCI6WyIx
+Il19LCJxVSI6eyJ2WCI6W119LCJDNiI6eyJYUyI6W119LCJFeiI6eyJYUyI6W119LCJGIjp7IlhTIjpb
+XX0sIkFUIjp7IlhTIjpbXX0sImJKIjp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpb
+XX0sInViIjp7IlhTIjpbXX0sImRzIjp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpb
+XX0sIms1Ijp7IlhTIjpbXX0sIktZIjp7IlhTIjpbXX0sInAiOnsiWFMiOltdfSwiQ0QiOnsiUnoiOltd
+fSwiYUUiOnsiUnoiOltdfSwiWmQiOnsiR3oiOltdfSwiTSI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119
+LCJVZiI6eyJpRCI6W119LCJxZSI6eyJpRCI6W119LCJjdiI6eyJLViI6W10sIkQwIjpbXX0sImZKIjp7
+IkQwIjpbXX0sIkFqIjp7ImVhIjpbXX0sIktWIjp7IkQwIjpbXX0sImV3Ijp7ImVhIjpbXX0sIkpRIjp7
+ImtGIjpbXX0sInFFIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJHaCI6eyJjdiI6W10sIktWIjpb
+XSwiRDAiOltdfSwiZlkiOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sInJaIjp7ImN2IjpbXSwiS1Yi
+OltdLCJEMCI6W119LCJRUCI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwibngiOnsiS1YiOltdLCJE
+MCI6W119LCJRRiI6eyJLViI6W10sIkQwIjpbXX0sIklCIjp7InRuIjpbIlpaIl19LCJ3eiI6eyJsRCI6
+WyIxIl0sInpNIjpbIjEiXSwiYlEiOlsiMSJdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sImhIIjp7IkF6
+IjpbXX0sImg0Ijp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJWYiI6eyJLViI6W10sIkQwIjpbXX0s
+IndhIjp7IkQwIjpbXX0sImU3Ijp7ImxEIjpbIktWIl0sInpNIjpbIktWIl0sImJRIjpbIktWIl0sImNY
+IjpbIktWIl0sImxELkUiOiJLViJ9LCJCSCI6eyJsRCI6WyJLViJdLCJHbSI6WyJLViJdLCJ6TSI6WyJL
+ViJdLCJYaiI6WyJLViJdLCJiUSI6WyJLViJdLCJjWCI6WyJLViJdLCJsRC5FIjoiS1YiLCJHbS5FIjoi
+S1YifSwiU04iOnsiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sImxwIjp7ImN2IjpbXSwiS1YiOltdLCJE
+MCI6W119LCJUYiI6eyJjdiI6W10sIktWIjpbXSwiRDAiOltdfSwiSXYiOnsiY3YiOltdLCJLViI6W10s
+IkQwIjpbXX0sIldQIjp7ImN2IjpbXSwiS1YiOltdLCJEMCI6W119LCJ5WSI6eyJjdiI6W10sIktWIjpb
+XSwiRDAiOltdfSwidzYiOnsiZWEiOltdfSwiSzUiOnsidjYiOltdLCJEMCI6W119LCJDbSI6eyJEMCI6
+W119LCJDUSI6eyJLViI6W10sIkQwIjpbXX0sInc0Ijp7InRuIjpbIlpaIl19LCJyaCI6eyJsRCI6WyJL
+ViJdLCJHbSI6WyJLViJdLCJ6TSI6WyJLViJdLCJYaiI6WyJLViJdLCJiUSI6WyJLViJdLCJjWCI6WyJL
+ViJdLCJsRC5FIjoiS1YiLCJHbS5FIjoiS1YifSwiY2YiOnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJx
+VSIsInFVIl19LCJpNyI6eyJZayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFV
+IiwiWWsuViI6InFVIn0sIlN5Ijp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdLCJZay5L
+IjoicVUiLCJZay5WIjoicVUifSwiSTQiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiYlEiOlsicVUi
+XSwiY1giOlsicVUiXSwibGYuRSI6InFVIn0sIlJPIjp7InFoIjpbIjEiXX0sIkNxIjp7IlJPIjpbIjEi
+XSwicWgiOlsiMSJdfSwieEMiOnsiTU8iOlsiMSJdfSwidkQiOnsia0YiOltdfSwibTYiOnsia0YiOltd
+fSwiY3QiOnsia0YiOltdfSwiT3ciOnsia0YiOltdfSwiVzkiOnsiQW4iOlsiMSJdfSwiZFciOnsidjYi
+OltdLCJEMCI6W119LCJtayI6eyJ5MCI6W119LCJLbyI6eyJvbiI6W119LCJBcyI6eyJsZiI6WyJxVSJd
+LCJ4dSI6WyJxVSJdLCJiUSI6WyJxVSJdLCJjWCI6WyJxVSJdfSwicjciOnsiRTQiOltdfSwiVHoiOnsi
+bEQiOlsiMSJdLCJ6TSI6WyIxIl0sImJRIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIx
+In0sIm5kIjp7ImhpIjpbXSwiY3YiOltdLCJLViI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0s
+Inh1IjpbInFVIl0sImJRIjpbInFVIl0sImNYIjpbInFVIl0sImxmLkUiOiJxVSJ9LCJoaSI6eyJjdiI6
+W10sIktWIjpbXSwiRDAiOltdfSwiUVciOnsiWFMiOltdLCJSeiI6W119LCJYQSI6eyJrRiI6W119LCJ2
+dCI6eyJEOCI6W119LCJjRCI6eyJEOCI6W119LCJkdiI6eyJSeiI6W119LCJPRiI6eyJmdiI6W119LCJy
+dSI6eyJmdiI6W119LCJJViI6eyJmdiI6W119LCJuNiI6eyJ6TSI6WyJJaiJdLCJiUSI6WyJJaiJdLCJj
+WCI6WyJJaiJdLCJBUyI6W119fScpKQpILkZGKHYudHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3sidzIi
+OjEsIlFDIjoyLCJMWiI6MSwia1QiOjIsIm1XIjoxLCJ1eSI6MSwiaWwiOjIsIlZqIjoxLCJYdiI6MSwi
+blkiOjEsIldZIjoxLCJwUiI6MSwidmciOjF9JykpCnZhciB1PXtsOiJDYW5ub3QgZXh0cmFjdCBhIGZp
+bGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBmcmFnbWVudCBjb21wb25lbnQiLGk6IkNhbm5vdCBleHRy
+YWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIsajoiQ2Fubm90
+IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0
+aG9yaXR5IixjOiJFcnJvciBoYW5kbGVyIG11c3QgYWNjZXB0IG9uZSBPYmplY3Qgb3Igb25lIE9iamVj
+dCBhbmQgYSBTdGFja1RyYWNlIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiBhIHZhbHVlIG9mIHRoZSBy
+ZXR1cm5lZCBmdXR1cmUncyB0eXBlIixkOiJhcmVhLWFuYWx5emVyLGFuYWx5emVyLW5uYmQtbWlncmF0
+aW9uLHR5cGUtYnVnIn0KdmFyIHQ9KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgcz1ILk4wCnJldHVybnticTpz
+KCJHaCIpLG46cygiQ3ciKSxjUjpzKCJyWiIpLHc6cygiQXoiKSxtOnMoIlFQIiksZ0Y6cygiUEQ8R0Qs
+QD4iKSxVOnMoImJRPEA+IiksaDpzKCJjdiIpLHI6cygiWFMiKSxCOnMoImVhIiksZzg6cygiUnoiKSxj
+ODpzKCJoSCIpLFk6cygiRUgiKSxpOnMoImI4PEA+IiksSjpzKCJMTCIpLGdwOnMoIkg3IiksSTpzKCJT
+ZyIpLG86cygidlEiKSxlaDpzKCJjWDxLVj4iKSxPOnMoImNYPHFVPiIpLGE6cygiY1g8QD4iKSxmQTpz
+KCJqZDxTZT4iKSxnaTpzKCJqZDxqOD4iKSxkOnMoImpkPFowPHFVLE1oPz4+IiksZmg6cygiamQ8RDg+
+IiksdTpzKCJqZDxrRj4iKSxzOnMoImpkPHFVPiIpLGhoOnMoImpkPHlEPiIpLGFKOnMoImpkPHdiPiIp
+LGdOOnMoImpkPG42PiIpLGI6cygiamQ8QD4iKSx0OnMoImpkPElqPiIpLGQ0OnMoImpkPHFVPz4iKSxU
+OnMoIndlIiksZUg6cygidm0iKSx4OnMoImM1IiksYVU6cygiWGo8QD4iKSxhbTpzKCJUejxAPiIpLGVv
+OnMoIk41PEdELEA+IiksZHo6cygiaEYiKSxmNDpzKCJ6TTxqOD4iKSxEOnMoInpNPFowPHFVLE1oPz4+
+IiksZXc6cygiek08TWg+IiksRTpzKCJ6TTxxVT4iKSxqOnMoInpNPEA+IiksTDpzKCJ6TTxJaj4iKSxX
+OnMoInpNPE1oPz4iKSxGOnMoInU4IiksaDY6cygiWjA8cVUsTWg+IiksY2s6cygiWjA8cVUscVU+Iiks
+ZjpzKCJaMDxALEA+IiksRzpzKCJaMDxxVSxNaD8+IiksZHY6cygibEo8cVUscVU+IiksZG86cygibEo8
+cVUsQD4iKSxWOnMoIkFqIiksZEU6cygiRVQiKSxBOnMoIktWIiksZjY6cygia0YiKSxQOnMoImM4Iiks
+SzpzKCJNaCIpLHA6cygiZXciKSxxOnMoInRuPFpaPiIpLGZ2OnMoIndMIiksY3o6cygiaWIiKSxhTzpz
+KCJuZCIpLEM6cygieHU8cVU+IiksbDpzKCJHeiIpLE46cygicVUiKSxkRzpzKCJxVShxVSkiKSxnNzpz
+KCJoaSIpLGZvOnMoIkdEIiksYVc6cygieVkiKSxlSzpzKCJFeiIpLGFrOnMoIkFTIiksZ2M6cygibjYi
+KSxiSTpzKCJrZCIpLGR3OnMoIkdqPHFVLHFVPiIpLGREOnMoImlEIiksZUo6cygidTY8cVU+IiksZzQ6
+cygiSzUiKSxjaTpzKCJ2NiIpLGcyOnMoIkNtIiksYmo6cygiWmY8Zko+IiksaDk6cygiQ1EiKSxhYzpz
+KCJlNyIpLFE6cygiQ3E8QWo+IiksUjpzKCJ3ejxjdj4iKSxhbzpzKCJ2czxmSj4iKSxjOnMoInZzPEA+
+IiksZko6cygidnM8SWo+IiksY3I6cygiSlEiKSx5OnMoImEyIiksYWw6cygiYTIoTWgpIiksZ1I6cygi
+Q1AiKSx6OnMoIkAiKSxmTzpzKCJAKCkiKSx2OnMoIkAoTWgpIiksazpzKCJAKE1oLEd6KSIpLGJVOnMo
+IkAoeHU8cVU+KSIpLGRPOnMoIkAocVUpIiksYjg6cygiQChALEApIiksUzpzKCJJaiIpLGF3OnMoIjAm
+KiIpLF86cygiTWgqIiksY2g6cygiRDA/IiksYkc6cygiYjg8Yzg+PyIpLGVzOnMoIkU0PyIpLGJrOnMo
+InpNPHFVPj8iKSxiTTpzKCJ6TTxAPj8iKSxncTpzKCJ6TTxNaD8+PyIpLGNaOnMoIlowPHFVLHFVPj8i
+KSxjOTpzKCJaMDxxVSxAPj8iKSxmbjpzKCJaMDxxVSxNaD8+PyIpLFg6cygiTWg/IiksZGs6cygicVU/
+IiksZTpzKCJGZTxALEA+PyIpLGc6cygiYm4/IiksYjc6cygiYTIoTWgpPyIpLGJ3OnMoIkAoZWEpPyIp
+LGZWOnMoIk1oPyhNaD8sTWg/KT8iKSxkQTpzKCJNaD8oQCk/IiksWjpzKCJ+KCk/IiksZ3g6cygifihl
+dyk/IiksZGk6cygiWloiKSxIOnMoIn4iKSxNOnMoIn4oKSIpLGVBOnMoIn4ocVUscVUpIiksY0E6cygi
+fihxVSxAKSIpfX0pKCk7KGZ1bmN0aW9uIGNvbnN0YW50cygpe3ZhciBzPWh1bmtIZWxwZXJzLm1ha2VD
+b25zdExpc3QKQy54bj1XLkdoLnByb3RvdHlwZQpDLlJZPVcuUVAucHJvdG90eXBlCkMubUg9Vy5hZS5w
+cm90b3R5cGUKQy5CWj1XLlZiLnByb3RvdHlwZQpDLkR0PVcuZkoucHJvdG90eXBlCkMuT2s9Si5Hdi5w
+cm90b3R5cGUKQy5ObT1KLmpkLnByb3RvdHlwZQpDLmpuPUouYlUucHJvdG90eXBlCkMuQ0Q9Si5xSS5w
+cm90b3R5cGUKQy54Qj1KLkRyLnByb3RvdHlwZQpDLkRHPUouYzUucHJvdG90eXBlCkMuRXg9Vy51OC5w
+cm90b3R5cGUKQy5OQT1ILlY2LnByb3RvdHlwZQpDLnQ1PVcuQkgucHJvdG90eXBlCkMuTHQ9Vy5TTi5w
+cm90b3R5cGUKQy5aUT1KLmlDLnByb3RvdHlwZQpDLkllPVcuVGIucHJvdG90eXBlCkMudkI9Si5rZC5w
+cm90b3R5cGUKQy5vbD1XLks1LnByb3RvdHlwZQpDLnk4PW5ldyBQLlU4KCkKQy5oOT1uZXcgUC5DVigp
+CkMuR3c9bmV3IEguRnUoSC5OMCgiRnU8MCY+IikpCkMuTzQ9ZnVuY3Rpb24gZ2V0VGFnRmFsbGJhY2so
+bykgewogIHZhciBzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pOwogIHJldHVybiBz
+LnN1YnN0cmluZyg4LCBzLmxlbmd0aCAtIDEpOwp9CkMuWXE9ZnVuY3Rpb24oKSB7CiAgdmFyIHRvU3Ry
+aW5nRnVuY3Rpb24gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogIGZ1bmN0aW9uIGdldFRhZyhv
+KSB7CiAgICB2YXIgcyA9IHRvU3RyaW5nRnVuY3Rpb24uY2FsbChvKTsKICAgIHJldHVybiBzLnN1YnN0
+cmluZyg4LCBzLmxlbmd0aCAtIDEpOwogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnKG9iamVjdCwg
+dGFnKSB7CiAgICBpZiAoL15IVE1MW0EtWl0uKkVsZW1lbnQkLy50ZXN0KHRhZykpIHsKICAgICAgdmFy
+IG5hbWUgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwob2JqZWN0KTsKICAgICAgaWYgKG5hbWUgPT0gIltv
+YmplY3QgT2JqZWN0XSIpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAg
+IH0KICB9CiAgZnVuY3Rpb24gZ2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2VyKG9iamVjdCwgdGFnKSB7
+CiAgICBpZiAoc2VsZi5IVE1MRWxlbWVudCAmJiBvYmplY3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkg
+cmV0dXJuICJIVE1MRWxlbWVudCI7CiAgICByZXR1cm4gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZyk7
+CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZyh0YWcpIHsKICAgIGlmICh0eXBlb2Ygd2luZG93
+ID09ICJ1bmRlZmluZWQiKSByZXR1cm4gbnVsbDsKICAgIGlmICh0eXBlb2Ygd2luZG93W3RhZ10gPT0g
+InVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgdmFyIGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107
+CiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yICE9ICJmdW5jdGlvbiIpIHJldHVybiBudWxsOwogICAg
+cmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9CiAgZnVuY3Rpb24gZGlzY3JpbWluYXRvcih0
+YWcpIHsgcmV0dXJuIG51bGw7IH0KICB2YXIgaXNCcm93c2VyID0gdHlwZW9mIG5hdmlnYXRvciA9PSAi
+b2JqZWN0IjsKICByZXR1cm4gewogICAgZ2V0VGFnOiBnZXRUYWcsCiAgICBnZXRVbmtub3duVGFnOiBp
+c0Jyb3dzZXIgPyBnZXRVbmtub3duVGFnR2VuZXJpY0Jyb3dzZXIgOiBnZXRVbmtub3duVGFnLAogICAg
+cHJvdG90eXBlRm9yVGFnOiBwcm90b3R5cGVGb3JUYWcsCiAgICBkaXNjcmltaW5hdG9yOiBkaXNjcmlt
+aW5hdG9yIH07Cn0KQy53Yj1mdW5jdGlvbihnZXRUYWdGYWxsYmFjaykgewogIHJldHVybiBmdW5jdGlv
+bihob29rcykgewogICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT0gIm9iamVjdCIpIHJldHVybiBob29r
+czsKICAgIHZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICBpZiAodWEuaW5kZXhPZigiRHVt
+cFJlbmRlclRyZWUiKSA+PSAwKSByZXR1cm4gaG9va3M7CiAgICBpZiAodWEuaW5kZXhPZigiQ2hyb21l
+IikgPj0gMCkgewogICAgICBmdW5jdGlvbiBjb25maXJtKHApIHsKICAgICAgICByZXR1cm4gdHlwZW9m
+IHdpbmRvdyA9PSAib2JqZWN0IiAmJiB3aW5kb3dbcF0gJiYgd2luZG93W3BdLm5hbWUgPT0gcDsKICAg
+ICAgfQogICAgICBpZiAoY29uZmlybSgiV2luZG93IikgJiYgY29uZmlybSgiSFRNTEVsZW1lbnQiKSkg
+cmV0dXJuIGhvb2tzOwogICAgfQogICAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnRmFsbGJhY2s7CiAgfTsK
+fQpDLktVPWZ1bmN0aW9uKGhvb2tzKSB7CiAgaWYgKHR5cGVvZiBkYXJ0RXhwZXJpbWVudGFsRml4dXBH
+ZXRUYWcgIT0gImZ1bmN0aW9uIikgcmV0dXJuIGhvb2tzOwogIGhvb2tzLmdldFRhZyA9IGRhcnRFeHBl
+cmltZW50YWxGaXh1cEdldFRhZyhob29rcy5nZXRUYWcpOwp9CkMuZlE9ZnVuY3Rpb24oaG9va3MpIHsK
+ICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwogIHZhciBwcm90b3R5cGVGb3JUYWcgPSBob29rcy5w
+cm90b3R5cGVGb3JUYWc7CiAgZnVuY3Rpb24gZ2V0VGFnRml4ZWQobykgewogICAgdmFyIHRhZyA9IGdl
+dFRhZyhvKTsKICAgIGlmICh0YWcgPT0gIkRvY3VtZW50IikgewogICAgICBpZiAoISFvLnhtbFZlcnNp
+b24pIHJldHVybiAiIURvY3VtZW50IjsKICAgICAgcmV0dXJuICIhSFRNTERvY3VtZW50IjsKICAgIH0K
+ICAgIHJldHVybiB0YWc7CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRhZ0ZpeGVkKHRhZykgewog
+ICAgaWYgKHRhZyA9PSAiRG9jdW1lbnQiKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBwcm90b3R5cGVG
+b3JUYWcodGFnKTsKICB9CiAgaG9va3MuZ2V0VGFnID0gZ2V0VGFnRml4ZWQ7CiAgaG9va3MucHJvdG90
+eXBlRm9yVGFnID0gcHJvdG90eXBlRm9yVGFnRml4ZWQ7Cn0KQy5kaz1mdW5jdGlvbihob29rcykgewog
+IHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVz
+ZXJBZ2VudCA6ICIiOwogIGlmICh1c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpID09IC0xKSByZXR1
+cm4gaG9va3M7CiAgdmFyIGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAg
+ICAiQmVmb3JlVW5sb2FkRXZlbnQiOiAiRXZlbnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9h
+cmQiLAogICAgIkdlb0dlb2xvY2F0aW9uIjogIkdlb2xvY2F0aW9uIiwKICAgICJMb2NhdGlvbiI6ICIh
+TG9jYXRpb24iLAogICAgIldvcmtlck1lc3NhZ2VFdmVudCI6ICJNZXNzYWdlRXZlbnQiLAogICAgIlhN
+TERvY3VtZW50IjogIiFEb2N1bWVudCJ9OwogIGZ1bmN0aW9uIGdldFRhZ0ZpcmVmb3gobykgewogICAg
+dmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHJldHVybiBxdWlja01hcFt0YWddIHx8IHRhZzsKICB9CiAg
+aG9va3MuZ2V0VGFnID0gZ2V0VGFnRmlyZWZveDsKfQpDLnhpPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFy
+IHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFn
+ZW50IDogIiI7CiAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKCJUcmlkZW50LyIpID09IC0xKSByZXR1cm4g
+aG9va3M7CiAgdmFyIGdldFRhZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcXVpY2tNYXAgPSB7CiAgICAi
+QmVmb3JlVW5sb2FkRXZlbnQiOiAiRXZlbnQiLAogICAgIkRhdGFUcmFuc2ZlciI6ICJDbGlwYm9hcmQi
+LAogICAgIkhUTUxEREVsZW1lbnQiOiAiSFRNTEVsZW1lbnQiLAogICAgIkhUTUxEVEVsZW1lbnQiOiAi
+SFRNTEVsZW1lbnQiLAogICAgIkhUTUxQaHJhc2VFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJQ
+b3NpdGlvbiI6ICJHZW9wb3NpdGlvbiIKICB9OwogIGZ1bmN0aW9uIGdldFRhZ0lFKG8pIHsKICAgIHZh
+ciB0YWcgPSBnZXRUYWcobyk7CiAgICB2YXIgbmV3VGFnID0gcXVpY2tNYXBbdGFnXTsKICAgIGlmIChu
+ZXdUYWcpIHJldHVybiBuZXdUYWc7CiAgICBpZiAodGFnID09ICJPYmplY3QiKSB7CiAgICAgIGlmICh3
+aW5kb3cuRGF0YVZpZXcgJiYgKG8gaW5zdGFuY2VvZiB3aW5kb3cuRGF0YVZpZXcpKSByZXR1cm4gIkRh
+dGFWaWV3IjsKICAgIH0KICAgIHJldHVybiB0YWc7CiAgfQogIGZ1bmN0aW9uIHByb3RvdHlwZUZvclRh
+Z0lFKHRhZykgewogICAgdmFyIGNvbnN0cnVjdG9yID0gd2luZG93W3RhZ107CiAgICBpZiAoY29uc3Ry
+dWN0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBl
+OwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdJRTsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBw
+cm90b3R5cGVGb3JUYWdJRTsKfQpDLmk3PWZ1bmN0aW9uKGhvb2tzKSB7IHJldHVybiBob29rczsgfQoK
+Qy5DdD1uZXcgUC5ieSgpCkMuRXE9bmV3IFAuazUoKQpDLnhNPW5ldyBQLnU1KCkKQy5Raz1uZXcgUC5F
+MygpCkMuTnY9bmV3IEgua3IoKQpDLk5VPW5ldyBQLkppKCkKQy5wZD1uZXcgUC5aZCgpCkMuQWQ9bmV3
+IFIuSDcoMCwiSGludEFjdGlvbktpbmQuYWRkTnVsbGFibGVIaW50IikKQy5uZT1uZXcgUi5INygxLCJI
+aW50QWN0aW9uS2luZC5hZGROb25OdWxsYWJsZUhpbnQiKQpDLm15PW5ldyBSLkg3KDIsIkhpbnRBY3Rp
+b25LaW5kLmNoYW5nZVRvTnVsbGFibGVIaW50IikKQy5yeD1uZXcgUi5INygzLCJIaW50QWN0aW9uS2lu
+ZC5jaGFuZ2VUb05vbk51bGxhYmxlSGludCIpCkMud1Y9bmV3IFIuSDcoNCwiSGludEFjdGlvbktpbmQu
+cmVtb3ZlTnVsbGFibGVIaW50IikKQy5mUj1uZXcgUi5INyg1LCJIaW50QWN0aW9uS2luZC5yZW1vdmVO
+b25OdWxsYWJsZUhpbnQiKQpDLkEzPW5ldyBQLk14KG51bGwpCkMublg9bmV3IFAub2oobnVsbCkKQy5j
+dz1uZXcgTC5HYigwLCJVbml0TWlncmF0aW9uU3RhdHVzLmFscmVhZHlNaWdyYXRlZCIpCkMuZGM9bmV3
+IEwuR2IoMSwiVW5pdE1pZ3JhdGlvblN0YXR1cy5pbmRldGVybWluYXRlIikKQy5XRD1uZXcgTC5HYigy
+LCJVbml0TWlncmF0aW9uU3RhdHVzLm1pZ3JhdGluZyIpCkMuWGo9bmV3IEwuR2IoMywiVW5pdE1pZ3Jh
+dGlvblN0YXR1cy5vcHRpbmdPdXQiKQpDLmwwPUguUUkocyhbQy5jdyxDLmRjLEMuV0QsQy5Yal0pLEgu
+TjAoImpkPEdiPiIpKQpDLmFrPUguUUkocyhbMCwwLDMyNzc2LDMzNzkyLDEsMTAyNDAsMCwwXSksdC50
+KQpDLmNtPUguUUkocyhbIio6OmNsYXNzIiwiKjo6ZGlyIiwiKjo6ZHJhZ2dhYmxlIiwiKjo6aGlkZGVu
+IiwiKjo6aWQiLCIqOjppbmVydCIsIio6Oml0ZW1wcm9wIiwiKjo6aXRlbXJlZiIsIio6Oml0ZW1zY29w
+ZSIsIio6OmxhbmciLCIqOjpzcGVsbGNoZWNrIiwiKjo6dGl0bGUiLCIqOjp0cmFuc2xhdGUiLCJBOjph
+Y2Nlc3NrZXkiLCJBOjpjb29yZHMiLCJBOjpocmVmbGFuZyIsIkE6Om5hbWUiLCJBOjpzaGFwZSIsIkE6
+OnRhYmluZGV4IiwiQTo6dGFyZ2V0IiwiQTo6dHlwZSIsIkFSRUE6OmFjY2Vzc2tleSIsIkFSRUE6OmFs
+dCIsIkFSRUE6OmNvb3JkcyIsIkFSRUE6Om5vaHJlZiIsIkFSRUE6OnNoYXBlIiwiQVJFQTo6dGFiaW5k
+ZXgiLCJBUkVBOjp0YXJnZXQiLCJBVURJTzo6Y29udHJvbHMiLCJBVURJTzo6bG9vcCIsIkFVRElPOjpt
+ZWRpYWdyb3VwIiwiQVVESU86Om11dGVkIiwiQVVESU86OnByZWxvYWQiLCJCRE86OmRpciIsIkJPRFk6
+OmFsaW5rIiwiQk9EWTo6Ymdjb2xvciIsIkJPRFk6OmxpbmsiLCJCT0RZOjp0ZXh0IiwiQk9EWTo6dmxp
+bmsiLCJCUjo6Y2xlYXIiLCJCVVRUT046OmFjY2Vzc2tleSIsIkJVVFRPTjo6ZGlzYWJsZWQiLCJCVVRU
+T046Om5hbWUiLCJCVVRUT046OnRhYmluZGV4IiwiQlVUVE9OOjp0eXBlIiwiQlVUVE9OOjp2YWx1ZSIs
+IkNBTlZBUzo6aGVpZ2h0IiwiQ0FOVkFTOjp3aWR0aCIsIkNBUFRJT046OmFsaWduIiwiQ09MOjphbGln
+biIsIkNPTDo6Y2hhciIsIkNPTDo6Y2hhcm9mZiIsIkNPTDo6c3BhbiIsIkNPTDo6dmFsaWduIiwiQ09M
+Ojp3aWR0aCIsIkNPTEdST1VQOjphbGlnbiIsIkNPTEdST1VQOjpjaGFyIiwiQ09MR1JPVVA6OmNoYXJv
+ZmYiLCJDT0xHUk9VUDo6c3BhbiIsIkNPTEdST1VQOjp2YWxpZ24iLCJDT0xHUk9VUDo6d2lkdGgiLCJD
+T01NQU5EOjpjaGVja2VkIiwiQ09NTUFORDo6Y29tbWFuZCIsIkNPTU1BTkQ6OmRpc2FibGVkIiwiQ09N
+TUFORDo6bGFiZWwiLCJDT01NQU5EOjpyYWRpb2dyb3VwIiwiQ09NTUFORDo6dHlwZSIsIkRBVEE6OnZh
+bHVlIiwiREVMOjpkYXRldGltZSIsIkRFVEFJTFM6Om9wZW4iLCJESVI6OmNvbXBhY3QiLCJESVY6OmFs
+aWduIiwiREw6OmNvbXBhY3QiLCJGSUVMRFNFVDo6ZGlzYWJsZWQiLCJGT05UOjpjb2xvciIsIkZPTlQ6
+OmZhY2UiLCJGT05UOjpzaXplIiwiRk9STTo6YWNjZXB0IiwiRk9STTo6YXV0b2NvbXBsZXRlIiwiRk9S
+TTo6ZW5jdHlwZSIsIkZPUk06Om1ldGhvZCIsIkZPUk06Om5hbWUiLCJGT1JNOjpub3ZhbGlkYXRlIiwi
+Rk9STTo6dGFyZ2V0IiwiRlJBTUU6Om5hbWUiLCJIMTo6YWxpZ24iLCJIMjo6YWxpZ24iLCJIMzo6YWxp
+Z24iLCJINDo6YWxpZ24iLCJINTo6YWxpZ24iLCJINjo6YWxpZ24iLCJIUjo6YWxpZ24iLCJIUjo6bm9z
+aGFkZSIsIkhSOjpzaXplIiwiSFI6OndpZHRoIiwiSFRNTDo6dmVyc2lvbiIsIklGUkFNRTo6YWxpZ24i
+LCJJRlJBTUU6OmZyYW1lYm9yZGVyIiwiSUZSQU1FOjpoZWlnaHQiLCJJRlJBTUU6Om1hcmdpbmhlaWdo
+dCIsIklGUkFNRTo6bWFyZ2lud2lkdGgiLCJJRlJBTUU6OndpZHRoIiwiSU1HOjphbGlnbiIsIklNRzo6
+YWx0IiwiSU1HOjpib3JkZXIiLCJJTUc6OmhlaWdodCIsIklNRzo6aHNwYWNlIiwiSU1HOjppc21hcCIs
+IklNRzo6bmFtZSIsIklNRzo6dXNlbWFwIiwiSU1HOjp2c3BhY2UiLCJJTUc6OndpZHRoIiwiSU5QVVQ6
+OmFjY2VwdCIsIklOUFVUOjphY2Nlc3NrZXkiLCJJTlBVVDo6YWxpZ24iLCJJTlBVVDo6YWx0IiwiSU5Q
+VVQ6OmF1dG9jb21wbGV0ZSIsIklOUFVUOjphdXRvZm9jdXMiLCJJTlBVVDo6Y2hlY2tlZCIsIklOUFVU
+OjpkaXNhYmxlZCIsIklOUFVUOjppbnB1dG1vZGUiLCJJTlBVVDo6aXNtYXAiLCJJTlBVVDo6bGlzdCIs
+IklOUFVUOjptYXgiLCJJTlBVVDo6bWF4bGVuZ3RoIiwiSU5QVVQ6Om1pbiIsIklOUFVUOjptdWx0aXBs
+ZSIsIklOUFVUOjpuYW1lIiwiSU5QVVQ6OnBsYWNlaG9sZGVyIiwiSU5QVVQ6OnJlYWRvbmx5IiwiSU5Q
+VVQ6OnJlcXVpcmVkIiwiSU5QVVQ6OnNpemUiLCJJTlBVVDo6c3RlcCIsIklOUFVUOjp0YWJpbmRleCIs
+IklOUFVUOjp0eXBlIiwiSU5QVVQ6OnVzZW1hcCIsIklOUFVUOjp2YWx1ZSIsIklOUzo6ZGF0ZXRpbWUi
+LCJLRVlHRU46OmRpc2FibGVkIiwiS0VZR0VOOjprZXl0eXBlIiwiS0VZR0VOOjpuYW1lIiwiTEFCRUw6
+OmFjY2Vzc2tleSIsIkxBQkVMOjpmb3IiLCJMRUdFTkQ6OmFjY2Vzc2tleSIsIkxFR0VORDo6YWxpZ24i
+LCJMSTo6dHlwZSIsIkxJOjp2YWx1ZSIsIkxJTks6OnNpemVzIiwiTUFQOjpuYW1lIiwiTUVOVTo6Y29t
+cGFjdCIsIk1FTlU6OmxhYmVsIiwiTUVOVTo6dHlwZSIsIk1FVEVSOjpoaWdoIiwiTUVURVI6OmxvdyIs
+Ik1FVEVSOjptYXgiLCJNRVRFUjo6bWluIiwiTUVURVI6OnZhbHVlIiwiT0JKRUNUOjp0eXBlbXVzdG1h
+dGNoIiwiT0w6OmNvbXBhY3QiLCJPTDo6cmV2ZXJzZWQiLCJPTDo6c3RhcnQiLCJPTDo6dHlwZSIsIk9Q
+VEdST1VQOjpkaXNhYmxlZCIsIk9QVEdST1VQOjpsYWJlbCIsIk9QVElPTjo6ZGlzYWJsZWQiLCJPUFRJ
+T046OmxhYmVsIiwiT1BUSU9OOjpzZWxlY3RlZCIsIk9QVElPTjo6dmFsdWUiLCJPVVRQVVQ6OmZvciIs
+Ik9VVFBVVDo6bmFtZSIsIlA6OmFsaWduIiwiUFJFOjp3aWR0aCIsIlBST0dSRVNTOjptYXgiLCJQUk9H
+UkVTUzo6bWluIiwiUFJPR1JFU1M6OnZhbHVlIiwiU0VMRUNUOjphdXRvY29tcGxldGUiLCJTRUxFQ1Q6
+OmRpc2FibGVkIiwiU0VMRUNUOjptdWx0aXBsZSIsIlNFTEVDVDo6bmFtZSIsIlNFTEVDVDo6cmVxdWly
+ZWQiLCJTRUxFQ1Q6OnNpemUiLCJTRUxFQ1Q6OnRhYmluZGV4IiwiU09VUkNFOjp0eXBlIiwiVEFCTEU6
+OmFsaWduIiwiVEFCTEU6OmJnY29sb3IiLCJUQUJMRTo6Ym9yZGVyIiwiVEFCTEU6OmNlbGxwYWRkaW5n
+IiwiVEFCTEU6OmNlbGxzcGFjaW5nIiwiVEFCTEU6OmZyYW1lIiwiVEFCTEU6OnJ1bGVzIiwiVEFCTEU6
+OnN1bW1hcnkiLCJUQUJMRTo6d2lkdGgiLCJUQk9EWTo6YWxpZ24iLCJUQk9EWTo6Y2hhciIsIlRCT0RZ
+OjpjaGFyb2ZmIiwiVEJPRFk6OnZhbGlnbiIsIlREOjphYmJyIiwiVEQ6OmFsaWduIiwiVEQ6OmF4aXMi
+LCJURDo6Ymdjb2xvciIsIlREOjpjaGFyIiwiVEQ6OmNoYXJvZmYiLCJURDo6Y29sc3BhbiIsIlREOjpo
+ZWFkZXJzIiwiVEQ6OmhlaWdodCIsIlREOjpub3dyYXAiLCJURDo6cm93c3BhbiIsIlREOjpzY29wZSIs
+IlREOjp2YWxpZ24iLCJURDo6d2lkdGgiLCJURVhUQVJFQTo6YWNjZXNza2V5IiwiVEVYVEFSRUE6OmF1
+dG9jb21wbGV0ZSIsIlRFWFRBUkVBOjpjb2xzIiwiVEVYVEFSRUE6OmRpc2FibGVkIiwiVEVYVEFSRUE6
+OmlucHV0bW9kZSIsIlRFWFRBUkVBOjpuYW1lIiwiVEVYVEFSRUE6OnBsYWNlaG9sZGVyIiwiVEVYVEFS
+RUE6OnJlYWRvbmx5IiwiVEVYVEFSRUE6OnJlcXVpcmVkIiwiVEVYVEFSRUE6OnJvd3MiLCJURVhUQVJF
+QTo6dGFiaW5kZXgiLCJURVhUQVJFQTo6d3JhcCIsIlRGT09UOjphbGlnbiIsIlRGT09UOjpjaGFyIiwi
+VEZPT1Q6OmNoYXJvZmYiLCJURk9PVDo6dmFsaWduIiwiVEg6OmFiYnIiLCJUSDo6YWxpZ24iLCJUSDo6
+YXhpcyIsIlRIOjpiZ2NvbG9yIiwiVEg6OmNoYXIiLCJUSDo6Y2hhcm9mZiIsIlRIOjpjb2xzcGFuIiwi
+VEg6OmhlYWRlcnMiLCJUSDo6aGVpZ2h0IiwiVEg6Om5vd3JhcCIsIlRIOjpyb3dzcGFuIiwiVEg6OnNj
+b3BlIiwiVEg6OnZhbGlnbiIsIlRIOjp3aWR0aCIsIlRIRUFEOjphbGlnbiIsIlRIRUFEOjpjaGFyIiwi
+VEhFQUQ6OmNoYXJvZmYiLCJUSEVBRDo6dmFsaWduIiwiVFI6OmFsaWduIiwiVFI6OmJnY29sb3IiLCJU
+Ujo6Y2hhciIsIlRSOjpjaGFyb2ZmIiwiVFI6OnZhbGlnbiIsIlRSQUNLOjpkZWZhdWx0IiwiVFJBQ0s6
+OmtpbmQiLCJUUkFDSzo6bGFiZWwiLCJUUkFDSzo6c3JjbGFuZyIsIlVMOjpjb21wYWN0IiwiVUw6OnR5
+cGUiLCJWSURFTzo6Y29udHJvbHMiLCJWSURFTzo6aGVpZ2h0IiwiVklERU86Omxvb3AiLCJWSURFTzo6
+bWVkaWFncm91cCIsIlZJREVPOjptdXRlZCIsIlZJREVPOjpwcmVsb2FkIiwiVklERU86OndpZHRoIl0p
+LHQucykKQy5WQz1ILlFJKHMoWzAsMCw2NTQ5MCw0NTA1NSw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0p
+LHQudCkKQy5tSz1ILlFJKHMoWzAsMCwyNjYyNCwxMDIzLDY1NTM0LDIwNDcsNjU1MzQsMjA0N10pLHQu
+dCkKQy5TcT1ILlFJKHMoWyJIRUFEIiwiQVJFQSIsIkJBU0UiLCJCQVNFRk9OVCIsIkJSIiwiQ09MIiwi
+Q09MR1JPVVAiLCJFTUJFRCIsIkZSQU1FIiwiRlJBTUVTRVQiLCJIUiIsIklNQUdFIiwiSU1HIiwiSU5Q
+VVQiLCJJU0lOREVYIiwiTElOSyIsIk1FVEEiLCJQQVJBTSIsIlNPVVJDRSIsIlNUWUxFIiwiVElUTEUi
+LCJXQlIiXSksdC5zKQpDLmRuPUguUUkocyhbXSksSC5OMCgiamQ8TEw+IikpCkMueEQ9SC5RSShzKFtd
+KSx0LnMpCkMuaFU9SC5RSShzKFtdKSx0LmIpCkMudG89SC5RSShzKFswLDAsMzI3MjIsMTIyODcsNjU1
+MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMucms9SC5RSShzKFtDLkFkLEMubmUsQy5teSxDLnJ4
+LEMud1YsQy5mUl0pLEguTjAoImpkPEg3PiIpKQpDLkYzPUguUUkocyhbMCwwLDI0NTc2LDEwMjMsNjU1
+MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMuZWE9SC5RSShzKFswLDAsMzI3NTQsMTEyNjMsNjU1
+MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMuWko9SC5RSShzKFswLDAsMzI3MjIsMTIyODcsNjU1
+MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMuV2Q9SC5RSShzKFswLDAsNjU0OTAsMTIyODcsNjU1
+MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx0LnQpCkMuUXg9SC5RSShzKFsiYmluZCIsImlmIiwicmVmIiwi
+cmVwZWF0Iiwic3ludGF4Il0pLHQucykKQy5CST1ILlFJKHMoWyJBOjpocmVmIiwiQVJFQTo6aHJlZiIs
+IkJMT0NLUVVPVEU6OmNpdGUiLCJCT0RZOjpiYWNrZ3JvdW5kIiwiQ09NTUFORDo6aWNvbiIsIkRFTDo6
+Y2l0ZSIsIkZPUk06OmFjdGlvbiIsIklNRzo6c3JjIiwiSU5QVVQ6OnNyYyIsIklOUzo6Y2l0ZSIsIlE6
+OmNpdGUiLCJWSURFTzo6cG9zdGVyIl0pLHQucykKQy5EeD1uZXcgSC5MUCgwLHt9LEMueEQsSC5OMCgi
+TFA8cVUsek08ajg+PiIpKQpDLkNNPW5ldyBILkxQKDAse30sQy54RCxILk4wKCJMUDxxVSxxVT4iKSkK
+Qy5pSD1ILlFJKHMoW10pLEguTjAoImpkPEdEPiIpKQpDLldPPW5ldyBILkxQKDAse30sQy5pSCxILk4w
+KCJMUDxHRCxAPiIpKQpDLlkyPW5ldyBMLk85KCJOYXZpZ2F0aW9uVHJlZU5vZGVUeXBlLmRpcmVjdG9y
+eSIpCkMucmY9bmV3IEwuTzkoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZmlsZSIpCkMuVGU9bmV3IEgu
+d3YoImNhbGwiKQpDLm9FPW5ldyBQLkdZKCExKQpDLndRPW5ldyBQLkZ5KG51bGwsMil9KSgpOyhmdW5j
+dGlvbiBzdGF0aWNGaWVsZHMoKXskLnptPW51bGwKJC55aj0wCiQuaTA9bnVsbAokLkFsPW51bGwKJC5O
+Rj1udWxsCiQuVFg9bnVsbAokLng3PW51bGwKJC5udz1udWxsCiQudnY9bnVsbAokLkJ2PW51bGwKJC5T
+Nj1udWxsCiQuazg9bnVsbAokLm1nPW51bGwKJC5VRD0hMQokLlgzPUMuTlUKJC54Zz1ILlFJKFtdLEgu
+TjAoImpkPE1oPiIpKQokLnhvPW51bGwKJC5CTz1udWxsCiQubHQ9bnVsbAokLkVVPW51bGwKJC5vcj1Q
+LkZsKHQuTix0LlkpCiQuSVI9bnVsbAokLkk2PW51bGwKJC5GZj1udWxsfSkoKTsoZnVuY3Rpb24gbGF6
+eUluaXRpYWxpemVycygpe3ZhciBzPWh1bmtIZWxwZXJzLmxhenlGaW5hbCxyPWh1bmtIZWxwZXJzLmxh
+enkKcygkLCJmYSIsInoiLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0Q2xvc3VyZSIp
+fSkKcygkLCJLcSIsIlNuIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoewp0b1N0cmluZzpmdW5j
+dGlvbigpe3JldHVybiIkcmVjZWl2ZXIkIn19KSl9KQpzKCQsInhxIiwibHEiLGZ1bmN0aW9uKCl7cmV0
+dXJuIEguY00oSC5TNyh7JG1ldGhvZCQ6bnVsbCwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJl
+Y2VpdmVyJCJ9fSkpfSkKcygkLCJSMSIsIk45IixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcobnVs
+bCkpfSkKcygkLCJmTiIsImlJIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFyICRh
+cmd1bWVudHNFeHByJD0iJGFyZ3VtZW50cyQiCnRyeXtudWxsLiRtZXRob2QkKCRhcmd1bWVudHNFeHBy
+JCl9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkpfSkKcygkLCJxaSIsIlVOIixmdW5jdGlvbigp
+e3JldHVybiBILmNNKEguUzcodm9pZCAwKSl9KQpzKCQsInB2IiwiWmgiLGZ1bmN0aW9uKCl7cmV0dXJu
+IEguY00oZnVuY3Rpb24oKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSIkYXJndW1lbnRzJCIKdHJ5eyh2b2lk
+IDApLiRtZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkp
+fSkKcygkLCJrcSIsInJOIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguTWoobnVsbCkpfSkKcygkLCJ0
+dCIsImMzIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5e251bGwuJG1ldGhvZCR9
+Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2FnZX19KCkpfSkKcygkLCJkdCIsIkhLIixmdW5jdGlvbigpe3Jl
+dHVybiBILmNNKEguTWoodm9pZCAwKSl9KQpzKCQsIkE3IiwicjEiLGZ1bmN0aW9uKCl7cmV0dXJuIEgu
+Y00oZnVuY3Rpb24oKXt0cnl7KHZvaWQgMCkuJG1ldGhvZCR9Y2F0Y2gocSl7cmV0dXJuIHEubWVzc2Fn
+ZX19KCkpfSkKcygkLCJXYyIsInV0IixmdW5jdGlvbigpe3JldHVybiBQLk9qKCl9KQpzKCQsImtoIiwi
+cmYiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLnhyKCkuJDAoKX0pCnMoJCwiZEgiLCJIRyIsZnVuY3Rp
+b24oKXtyZXR1cm4gbmV3IFAuTnooKS4kMCgpfSkKcygkLCJoaiIsIlY3IixmdW5jdGlvbigpe3JldHVy
+biBuZXcgSW50OEFycmF5KEguWEYoSC5RSShbLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIs
+LTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIs
+LTIsLTIsLTIsLTIsLTIsLTIsLTEsLTIsLTIsLTIsLTIsLTIsNjIsLTIsNjIsLTIsNjMsNTIsNTMsNTQs
+NTUsNTYsNTcsNTgsNTksNjAsNjEsLTIsLTIsLTIsLTEsLTIsLTIsLTIsMCwxLDIsMyw0LDUsNiw3LDgs
+OSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMiwtMiwtMiwt
+Miw2MywtMiwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0
+Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMiwtMiwtMiwtMiwtMl0sdC50KSkpfSkKcygkLCJZZSIs
+IndRIixmdW5jdGlvbigpe3JldHVybiB0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5w
+cm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09IltvYmplY3QgcHJvY2Vzc10iJiZwcm9jZXNz
+LnBsYXRmb3JtPT0id2luMzIifSkKcygkLCJtZiIsIno0IixmdW5jdGlvbigpe3JldHVybiBQLm51KCJe
+W1xcLVxcLjAtOUEtWl9hLXp+XSokIil9KQpzKCQsIk9RIiwidloiLGZ1bmN0aW9uKCl7cmV0dXJuIFAu
+S04oKX0pCnMoJCwiU0MiLCJBTiIsZnVuY3Rpb24oKXtyZXR1cm4gUC50TShbIkEiLCJBQkJSIiwiQUNS
+T05ZTSIsIkFERFJFU1MiLCJBUkVBIiwiQVJUSUNMRSIsIkFTSURFIiwiQVVESU8iLCJCIiwiQkRJIiwi
+QkRPIiwiQklHIiwiQkxPQ0tRVU9URSIsIkJSIiwiQlVUVE9OIiwiQ0FOVkFTIiwiQ0FQVElPTiIsIkNF
+TlRFUiIsIkNJVEUiLCJDT0RFIiwiQ09MIiwiQ09MR1JPVVAiLCJDT01NQU5EIiwiREFUQSIsIkRBVEFM
+SVNUIiwiREQiLCJERUwiLCJERVRBSUxTIiwiREZOIiwiRElSIiwiRElWIiwiREwiLCJEVCIsIkVNIiwi
+RklFTERTRVQiLCJGSUdDQVBUSU9OIiwiRklHVVJFIiwiRk9OVCIsIkZPT1RFUiIsIkZPUk0iLCJIMSIs
+IkgyIiwiSDMiLCJINCIsIkg1IiwiSDYiLCJIRUFERVIiLCJIR1JPVVAiLCJIUiIsIkkiLCJJRlJBTUUi
+LCJJTUciLCJJTlBVVCIsIklOUyIsIktCRCIsIkxBQkVMIiwiTEVHRU5EIiwiTEkiLCJNQVAiLCJNQVJL
+IiwiTUVOVSIsIk1FVEVSIiwiTkFWIiwiTk9CUiIsIk9MIiwiT1BUR1JPVVAiLCJPUFRJT04iLCJPVVRQ
+VVQiLCJQIiwiUFJFIiwiUFJPR1JFU1MiLCJRIiwiUyIsIlNBTVAiLCJTRUNUSU9OIiwiU0VMRUNUIiwi
+U01BTEwiLCJTT1VSQ0UiLCJTUEFOIiwiU1RSSUtFIiwiU1RST05HIiwiU1VCIiwiU1VNTUFSWSIsIlNV
+UCIsIlRBQkxFIiwiVEJPRFkiLCJURCIsIlRFWFRBUkVBIiwiVEZPT1QiLCJUSCIsIlRIRUFEIiwiVElN
+RSIsIlRSIiwiVFJBQ0siLCJUVCIsIlUiLCJVTCIsIlZBUiIsIlZJREVPIiwiV0JSIl0sdC5OKX0pCnMo
+JCwiWDQiLCJoRyIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXlxcUyskIil9KQpzKCQsIndPIiwib3ci
+LGZ1bmN0aW9uKCl7cmV0dXJuIFAuTkQoc2VsZil9KQpzKCQsImt0IiwiUjgiLGZ1bmN0aW9uKCl7cmV0
+dXJuIEguWWcoIl8kZGFydF9kYXJ0T2JqZWN0Iil9KQpzKCQsImZLIiwia0kiLGZ1bmN0aW9uKCl7cmV0
+dXJuIGZ1bmN0aW9uIERhcnRPYmplY3QoYSl7dGhpcy5vPWF9fSkKcygkLCJxdCIsInpCIixmdW5jdGlv
+bigpe3JldHVybiBuZXcgVC5tUSgpfSkKcygkLCJPbCIsIlVFIixmdW5jdGlvbigpe3JldHVybiBQLmhL
+KEMub2wuZ21XKFcueDMoKSkuaHJlZikuZ2hZKCkucSgwLCJhdXRoVG9rZW4iKX0pCnMoJCwiaFQiLCJ5
+UCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoIi5lZGl0LWxpc3QgLnBhbmVs
+LWNvbnRlbnQiKX0pCnMoJCwiVzYiLCJoTCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2Vs
+ZWN0b3IoIi5lZGl0LXBhbmVsIC5wYW5lbC1jb250ZW50Iil9KQpzKCQsIlRSIiwiRFciLGZ1bmN0aW9u
+KCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCJmb290ZXIiKX0pCnMoJCwiRVkiLCJmaSIsZnVu
+Y3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2VsZWN0b3IoImhlYWRlciIpfSkKcygkLCJiQSIsImMw
+IixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiI21pZ3JhdGUtdW5pdC1zdGF0
+dXMtaWNvbiIpfSkKcygkLCJ0MCIsImJOIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxl
+Y3RvcigiI21pZ3JhdGUtdW5pdC1zdGF0dXMtaWNvbi1sYWJlbCIpfSkKcygkLCJhdiIsIkQ5IixmdW5j
+dGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiI3VuaXQtbmFtZSIpfSkKcigkLCJmZSIs
+IktHIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5YQSgpfSkKcygkLCJlbyIsIm5VIixmdW5jdGlvbigp
+e3JldHVybiBuZXcgTS5sSShILk4wKCJmdiIpLmEoJC5IaygpKSl9KQpzKCQsInlyIiwiYkQiLGZ1bmN0
+aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51KCJbXi9dJCIpLFAubnUoIl4vIikpfSkK
+cygkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5JVihQLm51KCJbL1xcXFxdIiksUC5u
+dSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxcXF0rXFxcXFteXFxcXC9dK3xbYS16QS1a
+XTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxcXSkiKSl9KQpzKCQsImFrIiwiRWIiLGZ1
+bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQLm51KCIoXlthLXpBLVpdWy0rLmEtekEt
+WlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8vW14vXSoiKSxQ
+Lm51KCJeLyIpKX0pCnMoJCwibHMiLCJIayIsZnVuY3Rpb24oKXtyZXR1cm4gTy5SaCgpfSl9KSgpOyhm
+dW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7dmFyIHM9ZnVuY3Rpb24oYSl7dmFyIG09
+e30KbVthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0VG9GYXN0T2JqZWN0
+KG0pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiBzKCJfX19kYXJ0XyIrYSt2
+Lmlzb2xhdGVUYWcpfQp2YXIgcj0iX19fZGFydF9pc29sYXRlX3RhZ3NfIgp2YXIgcT1PYmplY3Rbcl18
+fChPYmplY3Rbcl09T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFyIHA9Il9aeFl4WCIKZm9yKHZhciBvPTA7
+O28rKyl7dmFyIG49cyhwKyJfIitvKyJfIikKaWYoIShuIGluIHEpKXtxW25dPTEKdi5pc29sYXRlVGFn
+PW4KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5nZXRJc29sYXRlVGFnKCJkaXNwYXRjaF9y
+ZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnKHtET01FcnJv
+cjpKLkd2LE1lZGlhRXJyb3I6Si5HdixOYXZpZ2F0b3I6Si5HdixOYXZpZ2F0b3JDb25jdXJyZW50SGFy
+ZHdhcmU6Si5HdixOYXZpZ2F0b3JVc2VyTWVkaWFFcnJvcjpKLkd2LE92ZXJjb25zdHJhaW5lZEVycm9y
+OkouR3YsUG9zaXRpb25FcnJvcjpKLkd2LEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvcjpKLkd2LFJhbmdl
+OkouR3YsU1FMRXJyb3I6Si5HdixEYXRhVmlldzpILkVULEFycmF5QnVmZmVyVmlldzpILkVULEZsb2F0
+MzJBcnJheTpILkRnLEZsb2F0NjRBcnJheTpILkRnLEludDE2QXJyYXk6SC54aixJbnQzMkFycmF5Okgu
+ZEUsSW50OEFycmF5OkguWkEsVWludDE2QXJyYXk6SC5kVCxVaW50MzJBcnJheTpILlBxLFVpbnQ4Q2xh
+bXBlZEFycmF5OkguZUUsQ2FudmFzUGl4ZWxBcnJheTpILmVFLFVpbnQ4QXJyYXk6SC5WNixIVE1MQXVk
+aW9FbGVtZW50OlcucUUsSFRNTEJSRWxlbWVudDpXLnFFLEhUTUxCdXR0b25FbGVtZW50OlcucUUsSFRN
+TENhbnZhc0VsZW1lbnQ6Vy5xRSxIVE1MQ29udGVudEVsZW1lbnQ6Vy5xRSxIVE1MRExpc3RFbGVtZW50
+OlcucUUsSFRNTERhdGFFbGVtZW50OlcucUUsSFRNTERhdGFMaXN0RWxlbWVudDpXLnFFLEhUTUxEZXRh
+aWxzRWxlbWVudDpXLnFFLEhUTUxEaWFsb2dFbGVtZW50OlcucUUsSFRNTERpdkVsZW1lbnQ6Vy5xRSxI
+VE1MRW1iZWRFbGVtZW50OlcucUUsSFRNTEZpZWxkU2V0RWxlbWVudDpXLnFFLEhUTUxIUkVsZW1lbnQ6
+Vy5xRSxIVE1MSGVhZEVsZW1lbnQ6Vy5xRSxIVE1MSGVhZGluZ0VsZW1lbnQ6Vy5xRSxIVE1MSHRtbEVs
+ZW1lbnQ6Vy5xRSxIVE1MSUZyYW1lRWxlbWVudDpXLnFFLEhUTUxJbWFnZUVsZW1lbnQ6Vy5xRSxIVE1M
+SW5wdXRFbGVtZW50OlcucUUsSFRNTExJRWxlbWVudDpXLnFFLEhUTUxMYWJlbEVsZW1lbnQ6Vy5xRSxI
+VE1MTGVnZW5kRWxlbWVudDpXLnFFLEhUTUxMaW5rRWxlbWVudDpXLnFFLEhUTUxNYXBFbGVtZW50Olcu
+cUUsSFRNTE1lZGlhRWxlbWVudDpXLnFFLEhUTUxNZW51RWxlbWVudDpXLnFFLEhUTUxNZXRhRWxlbWVu
+dDpXLnFFLEhUTUxNZXRlckVsZW1lbnQ6Vy5xRSxIVE1MTW9kRWxlbWVudDpXLnFFLEhUTUxPTGlzdEVs
+ZW1lbnQ6Vy5xRSxIVE1MT2JqZWN0RWxlbWVudDpXLnFFLEhUTUxPcHRHcm91cEVsZW1lbnQ6Vy5xRSxI
+VE1MT3B0aW9uRWxlbWVudDpXLnFFLEhUTUxPdXRwdXRFbGVtZW50OlcucUUsSFRNTFBhcmFtRWxlbWVu
+dDpXLnFFLEhUTUxQaWN0dXJlRWxlbWVudDpXLnFFLEhUTUxQcmVFbGVtZW50OlcucUUsSFRNTFByb2dy
+ZXNzRWxlbWVudDpXLnFFLEhUTUxRdW90ZUVsZW1lbnQ6Vy5xRSxIVE1MU2NyaXB0RWxlbWVudDpXLnFF
+LEhUTUxTaGFkb3dFbGVtZW50OlcucUUsSFRNTFNsb3RFbGVtZW50OlcucUUsSFRNTFNvdXJjZUVsZW1l
+bnQ6Vy5xRSxIVE1MU3BhbkVsZW1lbnQ6Vy5xRSxIVE1MU3R5bGVFbGVtZW50OlcucUUsSFRNTFRhYmxl
+Q2FwdGlvbkVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVDZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZURhdGFD
+ZWxsRWxlbWVudDpXLnFFLEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlQ29s
+RWxlbWVudDpXLnFFLEhUTUxUZXh0QXJlYUVsZW1lbnQ6Vy5xRSxIVE1MVGltZUVsZW1lbnQ6Vy5xRSxI
+VE1MVGl0bGVFbGVtZW50OlcucUUsSFRNTFRyYWNrRWxlbWVudDpXLnFFLEhUTUxVTGlzdEVsZW1lbnQ6
+Vy5xRSxIVE1MVW5rbm93bkVsZW1lbnQ6Vy5xRSxIVE1MVmlkZW9FbGVtZW50OlcucUUsSFRNTERpcmVj
+dG9yeUVsZW1lbnQ6Vy5xRSxIVE1MRm9udEVsZW1lbnQ6Vy5xRSxIVE1MRnJhbWVFbGVtZW50OlcucUUs
+SFRNTEZyYW1lU2V0RWxlbWVudDpXLnFFLEhUTUxNYXJxdWVlRWxlbWVudDpXLnFFLEhUTUxFbGVtZW50
+OlcucUUsSFRNTEFuY2hvckVsZW1lbnQ6Vy5HaCxIVE1MQXJlYUVsZW1lbnQ6Vy5mWSxIVE1MQmFzZUVs
+ZW1lbnQ6Vy5yWixCbG9iOlcuQXosSFRNTEJvZHlFbGVtZW50OlcuUVAsQ0RBVEFTZWN0aW9uOlcubngs
+Q2hhcmFjdGVyRGF0YTpXLm54LENvbW1lbnQ6Vy5ueCxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246Vy5ueCxU
+ZXh0OlcubngsQ1NTU3R5bGVEZWNsYXJhdGlvbjpXLm9KLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOlcub0os
+Q1NTMlByb3BlcnRpZXM6Vy5vSixYTUxEb2N1bWVudDpXLlFGLERvY3VtZW50OlcuUUYsRE9NRXhjZXB0
+aW9uOlcuTmgsRE9NSW1wbGVtZW50YXRpb246Vy5hZSxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tl
+bkxpc3Q6Vy5uNyxFbGVtZW50OlcuY3YsQWJvcnRQYXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVu
+dDpXLmVhLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVu
+dDpXLmVhLEJhY2tncm91bmRGZXRjaENsaWNrRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpX
+LmVhLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5l
+YSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6Vy5lYSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JF
+dmVudDpXLmVhLENhbk1ha2VQYXltZW50RXZlbnQ6Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3Nl
+RXZlbnQ6Vy5lYSxDdXN0b21FdmVudDpXLmVhLERldmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3Jp
+ZW50YXRpb25FdmVudDpXLmVhLEVycm9yRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRl
+bmRhYmxlTWVzc2FnZUV2ZW50OlcuZWEsRmV0Y2hFdmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50
+OlcuZWEsRm9yZWlnbkZldGNoRXZlbnQ6Vy5lYSxHYW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZl
+bnQ6Vy5lYSxJbnN0YWxsRXZlbnQ6Vy5lYSxNZWRpYUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlN
+ZXNzYWdlRXZlbnQ6Vy5lYSxNZWRpYVF1ZXJ5TGlzdEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpX
+LmVhLE1lZGlhU3RyZWFtVHJhY2tFdmVudDpXLmVhLE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0
+aW9uRXZlbnQ6Vy5lYSxNSURJTWVzc2FnZUV2ZW50OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlm
+aWNhdGlvbkV2ZW50OlcuZWEsUGFnZVRyYW5zaXRpb25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZl
+bnQ6Vy5lYSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFBy
+ZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rp
+b25DbG9zZUV2ZW50OlcuZWEsUHJvbWlzZVJlamVjdGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEs
+UlRDRGF0YUNoYW5uZWxFdmVudDpXLmVhLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVy
+Q29ubmVjdGlvbkljZUV2ZW50OlcuZWEsUlRDVHJhY2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5Vmlv
+bGF0aW9uRXZlbnQ6Vy5lYSxTZW5zb3JFcnJvckV2ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJv
+cjpXLmVhLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVh
+LFN0b3JhZ2VFdmVudDpXLmVhLFN5bmNFdmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9u
+RXZlbnQ6Vy5lYSxXZWJLaXRUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJE
+aXNwbGF5RXZlbnQ6Vy5lYSxWUlNlc3Npb25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZl
+bnQ6Vy5lYSxVU0JDb25uZWN0aW9uRXZlbnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxB
+dWRpb1Byb2Nlc3NpbmdFdmVudDpXLmVhLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdl
+YkdMQ29udGV4dEV2ZW50OlcuZWEsRXZlbnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsU3VibWl0RXZlbnQ6
+Vy5lYSxFdmVudFRhcmdldDpXLkQwLEZpbGU6Vy5oSCxIVE1MRm9ybUVsZW1lbnQ6Vy5oNCxIaXN0b3J5
+OlcuYnIsSFRNTERvY3VtZW50OlcuVmIsWE1MSHR0cFJlcXVlc3Q6Vy5mSixYTUxIdHRwUmVxdWVzdEV2
+ZW50VGFyZ2V0Olcud2EsSW1hZ2VEYXRhOlcuU2csTG9jYXRpb246Vy51OCxNb3VzZUV2ZW50OlcuQWos
+RHJhZ0V2ZW50OlcuQWosUG9pbnRlckV2ZW50OlcuQWosV2hlZWxFdmVudDpXLkFqLERvY3VtZW50RnJh
+Z21lbnQ6Vy5LVixTaGFkb3dSb290OlcuS1YsRG9jdW1lbnRUeXBlOlcuS1YsTm9kZTpXLktWLE5vZGVM
+aXN0OlcuQkgsUmFkaW9Ob2RlTGlzdDpXLkJILEhUTUxQYXJhZ3JhcGhFbGVtZW50OlcuU04sUHJvZ3Jl
+c3NFdmVudDpXLmV3LFJlc291cmNlUHJvZ3Jlc3NFdmVudDpXLmV3LEhUTUxTZWxlY3RFbGVtZW50Olcu
+bHAsSFRNTFRhYmxlRWxlbWVudDpXLlRiLEhUTUxUYWJsZVJvd0VsZW1lbnQ6Vy5JdixIVE1MVGFibGVT
+ZWN0aW9uRWxlbWVudDpXLldQLEhUTUxUZW1wbGF0ZUVsZW1lbnQ6Vy55WSxDb21wb3NpdGlvbkV2ZW50
+OlcudzYsRm9jdXNFdmVudDpXLnc2LEtleWJvYXJkRXZlbnQ6Vy53NixUZXh0RXZlbnQ6Vy53NixUb3Vj
+aEV2ZW50OlcudzYsVUlFdmVudDpXLnc2LFdpbmRvdzpXLks1LERPTVdpbmRvdzpXLks1LERlZGljYXRl
+ZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2VydmljZVdvcmtlckdsb2JhbFNjb3BlOlcuQ20sU2hhcmVk
+V29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxXb3JrZXJHbG9iYWxTY29wZTpXLkNtLEF0dHI6Vy5DUSxDbGll
+bnRSZWN0OlcudzQsRE9NUmVjdDpXLnc0LE5hbWVkTm9kZU1hcDpXLnJoLE1vek5hbWVkQXR0ck1hcDpX
+LnJoLElEQktleVJhbmdlOlAuaEYsU1ZHU2NyaXB0RWxlbWVudDpQLm5kLFNWR0FFbGVtZW50OlAuaGks
+U1ZHQW5pbWF0ZUVsZW1lbnQ6UC5oaSxTVkdBbmltYXRlTW90aW9uRWxlbWVudDpQLmhpLFNWR0FuaW1h
+dGVUcmFuc2Zvcm1FbGVtZW50OlAuaGksU1ZHQW5pbWF0aW9uRWxlbWVudDpQLmhpLFNWR0NpcmNsZUVs
+ZW1lbnQ6UC5oaSxTVkdDbGlwUGF0aEVsZW1lbnQ6UC5oaSxTVkdEZWZzRWxlbWVudDpQLmhpLFNWR0Rl
+c2NFbGVtZW50OlAuaGksU1ZHRGlzY2FyZEVsZW1lbnQ6UC5oaSxTVkdFbGxpcHNlRWxlbWVudDpQLmhp
+LFNWR0ZFQmxlbmRFbGVtZW50OlAuaGksU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQ6UC5oaSxTVkdGRUNv
+bXBvbmVudFRyYW5zZmVyRWxlbWVudDpQLmhpLFNWR0ZFQ29tcG9zaXRlRWxlbWVudDpQLmhpLFNWR0ZF
+Q29udm9sdmVNYXRyaXhFbGVtZW50OlAuaGksU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50OlAuaGks
+U1ZHRkVEaXNwbGFjZW1lbnRNYXBFbGVtZW50OlAuaGksU1ZHRkVEaXN0YW50TGlnaHRFbGVtZW50OlAu
+aGksU1ZHRkVGbG9vZEVsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNBRWxlbWVudDpQLmhpLFNWR0ZFRnVuY0JF
+bGVtZW50OlAuaGksU1ZHRkVGdW5jR0VsZW1lbnQ6UC5oaSxTVkdGRUZ1bmNSRWxlbWVudDpQLmhpLFNW
+R0ZFR2F1c3NpYW5CbHVyRWxlbWVudDpQLmhpLFNWR0ZFSW1hZ2VFbGVtZW50OlAuaGksU1ZHRkVNZXJn
+ZUVsZW1lbnQ6UC5oaSxTVkdGRU1lcmdlTm9kZUVsZW1lbnQ6UC5oaSxTVkdGRU1vcnBob2xvZ3lFbGVt
+ZW50OlAuaGksU1ZHRkVPZmZzZXRFbGVtZW50OlAuaGksU1ZHRkVQb2ludExpZ2h0RWxlbWVudDpQLmhp
+LFNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQ6UC5oaSxTVkdGRVNwb3RMaWdodEVsZW1lbnQ6UC5o
+aSxTVkdGRVRpbGVFbGVtZW50OlAuaGksU1ZHRkVUdXJidWxlbmNlRWxlbWVudDpQLmhpLFNWR0ZpbHRl
+ckVsZW1lbnQ6UC5oaSxTVkdGb3JlaWduT2JqZWN0RWxlbWVudDpQLmhpLFNWR0dFbGVtZW50OlAuaGks
+U1ZHR2VvbWV0cnlFbGVtZW50OlAuaGksU1ZHR3JhcGhpY3NFbGVtZW50OlAuaGksU1ZHSW1hZ2VFbGVt
+ZW50OlAuaGksU1ZHTGluZUVsZW1lbnQ6UC5oaSxTVkdMaW5lYXJHcmFkaWVudEVsZW1lbnQ6UC5oaSxT
+VkdNYXJrZXJFbGVtZW50OlAuaGksU1ZHTWFza0VsZW1lbnQ6UC5oaSxTVkdNZXRhZGF0YUVsZW1lbnQ6
+UC5oaSxTVkdQYXRoRWxlbWVudDpQLmhpLFNWR1BhdHRlcm5FbGVtZW50OlAuaGksU1ZHUG9seWdvbkVs
+ZW1lbnQ6UC5oaSxTVkdQb2x5bGluZUVsZW1lbnQ6UC5oaSxTVkdSYWRpYWxHcmFkaWVudEVsZW1lbnQ6
+UC5oaSxTVkdSZWN0RWxlbWVudDpQLmhpLFNWR1NldEVsZW1lbnQ6UC5oaSxTVkdTdG9wRWxlbWVudDpQ
+LmhpLFNWR1N0eWxlRWxlbWVudDpQLmhpLFNWR1NWR0VsZW1lbnQ6UC5oaSxTVkdTd2l0Y2hFbGVtZW50
+OlAuaGksU1ZHU3ltYm9sRWxlbWVudDpQLmhpLFNWR1RTcGFuRWxlbWVudDpQLmhpLFNWR1RleHRDb250
+ZW50RWxlbWVudDpQLmhpLFNWR1RleHRFbGVtZW50OlAuaGksU1ZHVGV4dFBhdGhFbGVtZW50OlAuaGks
+U1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudDpQLmhpLFNWR1RpdGxlRWxlbWVudDpQLmhpLFNWR1VzZUVs
+ZW1lbnQ6UC5oaSxTVkdWaWV3RWxlbWVudDpQLmhpLFNWR0dyYWRpZW50RWxlbWVudDpQLmhpLFNWR0Nv
+bXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50OlAuaGksU1ZHRkVEcm9wU2hhZG93RWxlbWVudDpQ
+LmhpLFNWR01QYXRoRWxlbWVudDpQLmhpLFNWR0VsZW1lbnQ6UC5oaX0pCmh1bmtIZWxwZXJzLnNldE9y
+VXBkYXRlTGVhZlRhZ3Moe0RPTUVycm9yOnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVl
+LE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRy
+dWUsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsR2VvbG9jYXRpb25Q
+b3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxTUUxFcnJvcjp0cnVlLERhdGFWaWV3OnRydWUsQXJy
+YXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJheTp0cnVlLEZsb2F0NjRBcnJheTp0cnVlLEludDE2
+QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50OEFycmF5OnRydWUsVWludDE2QXJyYXk6dHJ1ZSxV
+aW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFycmF5OnRydWUsQ2FudmFzUGl4ZWxBcnJheTp0cnVl
+LFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxlbWVudDp0cnVlLEhUTUxCUkVsZW1lbnQ6dHJ1ZSxI
+VE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52YXNFbGVtZW50OnRydWUsSFRNTENvbnRlbnRFbGVt
+ZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVlLEhUTUxEYXRhRWxlbWVudDp0cnVlLEhUTUxEYXRh
+TGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0VsZW1lbnQ6dHJ1ZSxIVE1MRGlhbG9nRWxlbWVudDp0
+cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVtYmVkRWxlbWVudDp0cnVlLEhUTUxGaWVsZFNldEVs
+ZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUsSFRNTEhlYWRFbGVtZW50OnRydWUsSFRNTEhlYWRp
+bmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50OnRydWUsSFRNTElGcmFtZUVsZW1lbnQ6dHJ1ZSxI
+VE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0RWxlbWVudDp0cnVlLEhUTUxMSUVsZW1lbnQ6dHJ1
+ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVsZW1lbnQ6dHJ1ZSxIVE1MTGlua0VsZW1l
+bnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRpYUVsZW1lbnQ6dHJ1ZSxIVE1MTWVudUVs
+ZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0ZXJFbGVtZW50OnRydWUsSFRNTE1v
+ZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50OnRydWUsSFRNTE9iamVjdEVsZW1lbnQ6dHJ1ZSxI
+VE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9wdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MT3V0cHV0RWxl
+bWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVyZUVsZW1lbnQ6dHJ1ZSxIVE1M
+UHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0VsZW1lbnQ6dHJ1ZSxIVE1MUXVvdGVFbGVtZW50OnRy
+dWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1MU2hhZG93RWxlbWVudDp0cnVlLEhUTUxTbG90RWxl
+bWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRydWUsSFRNTFNwYW5FbGVtZW50OnRydWUsSFRNTFN0
+eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OnRydWUsSFRNTFRhYmxlQ2VsbEVs
+ZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVIZWFkZXJDZWxs
+RWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1lbnQ6dHJ1ZSxIVE1MVGV4dEFyZWFFbGVtZW50OnRy
+dWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRpdGxlRWxlbWVudDp0cnVlLEhUTUxUcmFja0VsZW1l
+bnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUsSFRNTFVua25vd25FbGVtZW50OnRydWUsSFRNTFZp
+ZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlFbGVtZW50OnRydWUsSFRNTEZvbnRFbGVtZW50OnRy
+dWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxGcmFtZVNldEVsZW1lbnQ6dHJ1ZSxIVE1MTWFycXVl
+ZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxzZSxIVE1MQW5jaG9yRWxlbWVudDp0cnVlLEhUTUxB
+cmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVudDp0cnVlLEJsb2I6ZmFsc2UsSFRNTEJvZHlFbGVt
+ZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hhcmFjdGVyRGF0YTp0cnVlLENvbW1lbnQ6dHJ1ZSxQ
+cm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0OnRydWUsQ1NTU3R5bGVEZWNsYXJhdGlvbjp0cnVl
+LE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NTMlByb3BlcnRpZXM6dHJ1ZSxYTUxEb2N1bWVudDp0
+cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlvbjp0cnVlLERPTUltcGxlbWVudGF0aW9uOnRydWUs
+RE9NUmVjdFJlYWRPbmx5OmZhbHNlLERPTVRva2VuTGlzdDp0cnVlLEVsZW1lbnQ6ZmFsc2UsQWJvcnRQ
+YXltZW50RXZlbnQ6dHJ1ZSxBbmltYXRpb25FdmVudDp0cnVlLEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6
+dHJ1ZSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaENsaWNrRXZl
+bnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDp0cnVlLEJhY2tncm91bmRGZXRjaEZhaWxFdmVudDp0
+cnVlLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6dHJ1ZSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZlbnQ6dHJ1
+ZSxCZWZvcmVVbmxvYWRFdmVudDp0cnVlLEJsb2JFdmVudDp0cnVlLENhbk1ha2VQYXltZW50RXZlbnQ6
+dHJ1ZSxDbGlwYm9hcmRFdmVudDp0cnVlLENsb3NlRXZlbnQ6dHJ1ZSxDdXN0b21FdmVudDp0cnVlLERl
+dmljZU1vdGlvbkV2ZW50OnRydWUsRGV2aWNlT3JpZW50YXRpb25FdmVudDp0cnVlLEVycm9yRXZlbnQ6
+dHJ1ZSxFeHRlbmRhYmxlRXZlbnQ6dHJ1ZSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OnRydWUsRmV0Y2hF
+dmVudDp0cnVlLEZvbnRGYWNlU2V0TG9hZEV2ZW50OnRydWUsRm9yZWlnbkZldGNoRXZlbnQ6dHJ1ZSxH
+YW1lcGFkRXZlbnQ6dHJ1ZSxIYXNoQ2hhbmdlRXZlbnQ6dHJ1ZSxJbnN0YWxsRXZlbnQ6dHJ1ZSxNZWRp
+YUVuY3J5cHRlZEV2ZW50OnRydWUsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6dHJ1ZSxNZWRpYVF1ZXJ5TGlz
+dEV2ZW50OnRydWUsTWVkaWFTdHJlYW1FdmVudDp0cnVlLE1lZGlhU3RyZWFtVHJhY2tFdmVudDp0cnVl
+LE1lc3NhZ2VFdmVudDp0cnVlLE1JRElDb25uZWN0aW9uRXZlbnQ6dHJ1ZSxNSURJTWVzc2FnZUV2ZW50
+OnRydWUsTXV0YXRpb25FdmVudDp0cnVlLE5vdGlmaWNhdGlvbkV2ZW50OnRydWUsUGFnZVRyYW5zaXRp
+b25FdmVudDp0cnVlLFBheW1lbnRSZXF1ZXN0RXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2
+ZW50OnRydWUsUG9wU3RhdGVFdmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFpbGFibGVF
+dmVudDp0cnVlLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OnRydWUsUHJvbWlzZVJlamVj
+dGlvbkV2ZW50OnRydWUsUHVzaEV2ZW50OnRydWUsUlRDRGF0YUNoYW5uZWxFdmVudDp0cnVlLFJUQ0RU
+TUZUb25lQ2hhbmdlRXZlbnQ6dHJ1ZSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OnRydWUsUlRDVHJh
+Y2tFdmVudDp0cnVlLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6dHJ1ZSxTZW5zb3JFcnJvckV2
+ZW50OnRydWUsU3BlZWNoUmVjb2duaXRpb25FcnJvcjp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6
+dHJ1ZSxTcGVlY2hTeW50aGVzaXNFdmVudDp0cnVlLFN0b3JhZ2VFdmVudDp0cnVlLFN5bmNFdmVudDp0
+cnVlLFRyYWNrRXZlbnQ6dHJ1ZSxUcmFuc2l0aW9uRXZlbnQ6dHJ1ZSxXZWJLaXRUcmFuc2l0aW9uRXZl
+bnQ6dHJ1ZSxWUkRldmljZUV2ZW50OnRydWUsVlJEaXNwbGF5RXZlbnQ6dHJ1ZSxWUlNlc3Npb25FdmVu
+dDp0cnVlLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6dHJ1ZSxVU0JDb25uZWN0aW9uRXZlbnQ6dHJ1
+ZSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6dHJ1ZSxBdWRpb1Byb2Nlc3NpbmdFdmVudDp0cnVlLE9mZmxp
+bmVBdWRpb0NvbXBsZXRpb25FdmVudDp0cnVlLFdlYkdMQ29udGV4dEV2ZW50OnRydWUsRXZlbnQ6ZmFs
+c2UsSW5wdXRFdmVudDpmYWxzZSxTdWJtaXRFdmVudDpmYWxzZSxFdmVudFRhcmdldDpmYWxzZSxGaWxl
+OnRydWUsSFRNTEZvcm1FbGVtZW50OnRydWUsSGlzdG9yeTp0cnVlLEhUTUxEb2N1bWVudDp0cnVlLFhN
+TEh0dHBSZXF1ZXN0OnRydWUsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpmYWxzZSxJbWFnZURhdGE6
+dHJ1ZSxMb2NhdGlvbjp0cnVlLE1vdXNlRXZlbnQ6dHJ1ZSxEcmFnRXZlbnQ6dHJ1ZSxQb2ludGVyRXZl
+bnQ6dHJ1ZSxXaGVlbEV2ZW50OnRydWUsRG9jdW1lbnRGcmFnbWVudDp0cnVlLFNoYWRvd1Jvb3Q6dHJ1
+ZSxEb2N1bWVudFR5cGU6dHJ1ZSxOb2RlOmZhbHNlLE5vZGVMaXN0OnRydWUsUmFkaW9Ob2RlTGlzdDp0
+cnVlLEhUTUxQYXJhZ3JhcGhFbGVtZW50OnRydWUsUHJvZ3Jlc3NFdmVudDp0cnVlLFJlc291cmNlUHJv
+Z3Jlc3NFdmVudDp0cnVlLEhUTUxTZWxlY3RFbGVtZW50OnRydWUsSFRNTFRhYmxlRWxlbWVudDp0cnVl
+LEhUTUxUYWJsZVJvd0VsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVTZWN0aW9uRWxlbWVudDp0cnVlLEhUTUxU
+ZW1wbGF0ZUVsZW1lbnQ6dHJ1ZSxDb21wb3NpdGlvbkV2ZW50OnRydWUsRm9jdXNFdmVudDp0cnVlLEtl
+eWJvYXJkRXZlbnQ6dHJ1ZSxUZXh0RXZlbnQ6dHJ1ZSxUb3VjaEV2ZW50OnRydWUsVUlFdmVudDpmYWxz
+ZSxXaW5kb3c6dHJ1ZSxET01XaW5kb3c6dHJ1ZSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVl
+LFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOnRydWUs
+V29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxBdHRyOnRydWUsQ2xpZW50UmVjdDp0cnVlLERPTVJlY3Q6dHJ1
+ZSxOYW1lZE5vZGVNYXA6dHJ1ZSxNb3pOYW1lZEF0dHJNYXA6dHJ1ZSxJREJLZXlSYW5nZTp0cnVlLFNW
+R1NjcmlwdEVsZW1lbnQ6dHJ1ZSxTVkdBRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVFbGVtZW50OnRydWUs
+U1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDp0cnVl
+LFNWR0FuaW1hdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdDaXJjbGVFbGVtZW50OnRydWUsU1ZHQ2xpcFBhdGhF
+bGVtZW50OnRydWUsU1ZHRGVmc0VsZW1lbnQ6dHJ1ZSxTVkdEZXNjRWxlbWVudDp0cnVlLFNWR0Rpc2Nh
+cmRFbGVtZW50OnRydWUsU1ZHRWxsaXBzZUVsZW1lbnQ6dHJ1ZSxTVkdGRUJsZW5kRWxlbWVudDp0cnVl
+LFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50OnRydWUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6
+dHJ1ZSxTVkdGRUNvbXBvc2l0ZUVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDp0
+cnVlLFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxl
+bWVudDp0cnVlLFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFRmxvb2RFbGVtZW50OnRy
+dWUsU1ZHRkVGdW5jQUVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNCRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0dF
+bGVtZW50OnRydWUsU1ZHRkVGdW5jUkVsZW1lbnQ6dHJ1ZSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6
+dHJ1ZSxTVkdGRUltYWdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VFbGVtZW50OnRydWUsU1ZHRkVNZXJn
+ZU5vZGVFbGVtZW50OnRydWUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDp0cnVlLFNWR0ZFT2Zmc2V0RWxl
+bWVudDp0cnVlLFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdF
+bGVtZW50OnRydWUsU1ZHRkVTcG90TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVUaWxlRWxlbWVudDp0cnVl
+LFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6dHJ1ZSxTVkdGaWx0ZXJFbGVtZW50OnRydWUsU1ZHRm9yZWln
+bk9iamVjdEVsZW1lbnQ6dHJ1ZSxTVkdHRWxlbWVudDp0cnVlLFNWR0dlb21ldHJ5RWxlbWVudDp0cnVl
+LFNWR0dyYXBoaWNzRWxlbWVudDp0cnVlLFNWR0ltYWdlRWxlbWVudDp0cnVlLFNWR0xpbmVFbGVtZW50
+OnRydWUsU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHTWFya2VyRWxlbWVudDp0cnVlLFNW
+R01hc2tFbGVtZW50OnRydWUsU1ZHTWV0YWRhdGFFbGVtZW50OnRydWUsU1ZHUGF0aEVsZW1lbnQ6dHJ1
+ZSxTVkdQYXR0ZXJuRWxlbWVudDp0cnVlLFNWR1BvbHlnb25FbGVtZW50OnRydWUsU1ZHUG9seWxpbmVF
+bGVtZW50OnRydWUsU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OnRydWUsU1ZHUmVjdEVsZW1lbnQ6dHJ1
+ZSxTVkdTZXRFbGVtZW50OnRydWUsU1ZHU3RvcEVsZW1lbnQ6dHJ1ZSxTVkdTdHlsZUVsZW1lbnQ6dHJ1
+ZSxTVkdTVkdFbGVtZW50OnRydWUsU1ZHU3dpdGNoRWxlbWVudDp0cnVlLFNWR1N5bWJvbEVsZW1lbnQ6
+dHJ1ZSxTVkdUU3BhbkVsZW1lbnQ6dHJ1ZSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0
+RWxlbWVudDp0cnVlLFNWR1RleHRQYXRoRWxlbWVudDp0cnVlLFNWR1RleHRQb3NpdGlvbmluZ0VsZW1l
+bnQ6dHJ1ZSxTVkdUaXRsZUVsZW1lbnQ6dHJ1ZSxTVkdVc2VFbGVtZW50OnRydWUsU1ZHVmlld0VsZW1l
+bnQ6dHJ1ZSxTVkdHcmFkaWVudEVsZW1lbnQ6dHJ1ZSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9u
+RWxlbWVudDp0cnVlLFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6dHJ1ZSxTVkdNUGF0aEVsZW1lbnQ6dHJ1
+ZSxTVkdFbGVtZW50OmZhbHNlfSkKSC5MWi4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJW
+aWV3IgpILlJHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguVlAuJG5hdGl2
+ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5EZy4kbmF0aXZlU3VwZXJjbGFzc1RhZz0i
+QXJyYXlCdWZmZXJWaWV3IgpILldCLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXci
+CkguWkcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5QZy4kbmF0aXZlU3Vw
+ZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3In0pKCkKY29udmVydEFsbFRvRmFzdE9iamVjdCh3KQpj
+b252ZXJ0VG9GYXN0T2JqZWN0KCQpOyhmdW5jdGlvbihhKXtpZih0eXBlb2YgZG9jdW1lbnQ9PT0idW5k
+ZWZpbmVkIil7YShudWxsKQpyZXR1cm59aWYodHlwZW9mIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQhPSJ1
+bmRlZmluZWQiKXthKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpCnJldHVybn12YXIgcz1kb2N1bWVudC5z
+Y3JpcHRzCmZ1bmN0aW9uIG9uTG9hZChiKXtmb3IodmFyIHE9MDtxPHMubGVuZ3RoOysrcSlzW3FdLnJl
+bW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSkKYShiLnRhcmdldCl9Zm9yKHZhciBy
+PTA7cjxzLmxlbmd0aDsrK3Ipc1tyXS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2Up
+fSkoZnVuY3Rpb24oYSl7di5jdXJyZW50U2NyaXB0PWEKdmFyIHM9TC5JcQppZih0eXBlb2YgZGFydE1h
+aW5SdW5uZXI9PT0iZnVuY3Rpb24iKWRhcnRNYWluUnVubmVyKHMsW10pCmVsc2UgcyhbXSl9KX0pKCkK
+Ly8jIHNvdXJjZU1hcHBpbmdVUkw9bWlncmF0aW9uLmpzLm1hcAo=
 ''';
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart b/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
index 53a17bf..4699bed 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/edit_details.dart
@@ -37,12 +37,12 @@
       this.traces = const []});
 
   EditDetails.fromJson(dynamic json)
-      : edits = _decodeEdits(json['edits']),
+      : edits = _decodeEdits(json['edits'] as List<Object?>?),
         explanation = json['explanation'] as String?,
         line = json['line'] as int?,
         displayPath = json['displayPath'] as String?,
         uriPath = json['uriPath'] as String?,
-        traces = _decodeTraces(json['traces']);
+        traces = _decodeTraces(json['traces'] as List<Object?>?);
 
   Map<String, Object?> toJson() => {
         if (edits != null) 'edits': [for (var edit in edits!) edit.toJson()],
@@ -54,10 +54,10 @@
           'traces': [for (var trace in traces!) trace.toJson()],
       };
 
-  static List<EditLink>? _decodeEdits(dynamic json) =>
+  static List<EditLink>? _decodeEdits(List<Object?>? json) =>
       json == null ? null : [for (var edit in json) EditLink.fromJson(edit)];
 
-  static List<Trace>? _decodeTraces(dynamic json) =>
+  static List<Trace>? _decodeTraces(List<Object?>? json) =>
       json == null ? null : [for (var trace in json) Trace.fromJson(trace)];
 }
 
@@ -125,7 +125,8 @@
   Trace.fromJson(dynamic json)
       : description = json['description'] as String?,
         entries = [
-          for (var entry in json['entries']) TraceEntry.fromJson(entry)
+          for (var entry in json['entries'] as List<Object?>)
+            TraceEntry.fromJson(entry)
         ];
 
   Map<String, Object?> toJson() => {
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
index 9be3101..0ca93ca 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/migration.dart
@@ -492,7 +492,7 @@
 
   // Request the navigation tree, then do work with the response.
   try {
-    final response = await doGet<List<Object?>>(path);
+    final response = (await doGet<List<Object?>>(path))!;
     var navTree = document.querySelector('.nav-tree')!;
     navTree.innerHtml = '';
     navigationTree = NavigationTreeNode.listFromJson(response);
diff --git a/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart b/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
index 16ff587..7bc708a 100644
--- a/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/web/navigation_tree.dart
@@ -190,13 +190,13 @@
   Map<String, Object?> toJson();
 
   /// Deserializes a list of navigation tree nodes from a JSON list.
-  static List<NavigationTreeNode> listFromJson(dynamic json) =>
+  static List<NavigationTreeNode> listFromJson(List<Object?> json) =>
       [for (var node in json) NavigationTreeNode.fromJson(node)];
 
   /// Deserializes a list of navigation tree nodes from a possibly null JSON
   /// list.  If the argument is `null`, `null` is returned.
   static List<NavigationTreeNode>? listFromJsonOrNull(dynamic json) =>
-      json == null ? null : listFromJson(json);
+      json == null ? null : listFromJson(json as List<Object?>);
 
   /// Serializes a list of navigation tree nodes into JSON.
   static List<Map<String, Object?>> listToJson(
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 653d36b..2dad8d1 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -660,7 +660,7 @@
   DecoratedType? visitVariableDeclarationList(VariableDeclarationList node) {
     node.metadata.accept(this);
     var typeAnnotation = node.type;
-    var type = _pushNullabilityNodeTarget(
+    var declaredType = _pushNullabilityNodeTarget(
         NullabilityNodeTarget.element(
             node.variables.first.declaredElement!, _getLineInfo),
         () => typeAnnotation?.accept(this));
@@ -671,9 +671,11 @@
     if (hint != null && hint.kind == HintCommentKind.lateFinal) {
       _variables!.recordLateHint(source, node, hint);
     }
+    var parent = node.parent;
     for (var variable in node.variables) {
       variable.metadata.accept(this);
       var declaredElement = variable.declaredElement;
+      var type = declaredType;
       if (type == null) {
         var target =
             NullabilityNodeTarget.element(declaredElement!, _getLineInfo);
@@ -683,11 +685,11 @@
       }
       _variables!.recordDecoratedElementType(declaredElement, type);
       variable.initializer?.accept(this);
-    }
-    var parent = node.parent;
-    if (parent is FieldDeclaration) {
-      if (_hasAngularChildAnnotation(parent.metadata)) {
-        _graph.makeNullable(type!.node!, AngularAnnotationOrigin(source, node));
+      if (parent is FieldDeclaration) {
+        if (_hasAngularChildAnnotation(parent.metadata)) {
+          _graph.makeNullable(
+              type.node!, AngularAnnotationOrigin(source, node));
+        }
       }
     }
     return null;
diff --git a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
index 867f72a..a9d155e 100644
--- a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
@@ -236,6 +236,7 @@
           unit.declaredElement!.source,
           _permissive! ? listener : null,
           _decoratedClassHierarchy,
+          result.libraryElement,
           instrumentation: _instrumentation));
     } finally {
       DecoratedTypeParameterBounds.current = null;
diff --git a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
index abc2788..7eeea96 100644
--- a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
+++ b/pkg/nnbd_migration/test/already_migrated_code_decorator_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.
 
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -9,9 +11,11 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/testing/element_factory.dart';
-import 'package:analyzer/src/generated/testing/test_type_provider.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:analyzer/src/test_utilities/find_element.dart';
+import 'package:analyzer/src/test_utilities/find_node.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/already_migrated_code_decorator.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
@@ -29,35 +33,475 @@
   });
 }
 
-class _AlreadyMigratedCodeDecoratorTestBase extends Object with EdgeTester {
-  final TypeProvider typeProvider;
-
-  final AlreadyMigratedCodeDecorator decorator;
-
-  final NullabilityGraphForTesting graph;
-
+class _AlreadyMigratedCodeDecoratorTestBase {
   final NullabilitySuffix suffix;
 
-  Element element = _MockElement();
-
   final decoratedTypeParameterBounds = DecoratedTypeParameterBounds();
 
-  _AlreadyMigratedCodeDecoratorTestBase(NullabilitySuffix nullabilitySuffix)
-      : this._(
-          nullabilitySuffix,
-          NullabilityGraphForTesting(),
-          TestTypeProvider(),
-        );
+  _AlreadyMigratedCodeDecoratorTestBase(this.suffix);
 
-  _AlreadyMigratedCodeDecoratorTestBase._(
-      this.suffix, this.graph, this.typeProvider)
-      : decorator =
-            AlreadyMigratedCodeDecorator(graph, typeProvider, _getLineInfo);
+  DecoratedType? getDecoratedBound(TypeParameterElement element) =>
+      decoratedTypeParameterBounds.get(element);
+
+  void setUp() {
+    DecoratedTypeParameterBounds.current = decoratedTypeParameterBounds;
+  }
+
+  void tearDown() {
+    DecoratedTypeParameterBounds.current = null;
+  }
+
+  Future<void> test_decorate_dynamic() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+    withElement.checkDynamic(
+        withElement.decorate(withElement.typeProvider.dynamicType),
+        'test type');
+  }
+
+  Future<void> test_decorate_functionType_generic_bounded() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class A<T extends num> {}',
+    );
+    var typeFormal = withUnit.findElement.typeParameter('T');
+    var withElement = withUnit.withElement(typeFormal);
+
+    var decoratedType = withElement.decorate(
+      FunctionTypeImpl(
+        typeFormals: [typeFormal],
+        parameters: const [],
+        returnType: TypeParameterTypeImpl(
+          element: typeFormal,
+          nullabilitySuffix: NullabilitySuffix.star,
+        ),
+        nullabilitySuffix: suffix,
+      ),
+    );
+    withElement.checkNum(
+        getDecoratedBound(typeFormal)!,
+        withElement.checkExplicitlyNonNullable,
+        'bound of type formal T of test type');
+    withElement.checkTypeParameter(
+        decoratedType.returnType!,
+        withElement.checkExplicitlyNonNullable,
+        typeFormal,
+        'return type of test type');
+  }
+
+  Future<void> test_decorate_functionType_generic_no_explicit_bound() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class A<T> {}',
+    );
+    var typeFormal = withUnit.findElement.typeParameter('T');
+    var withElement = withUnit.withElement(typeFormal);
+
+    var decoratedType = withElement.decorate(
+      FunctionTypeImpl(
+        typeFormals: [typeFormal],
+        parameters: const [],
+        returnType: TypeParameterTypeImpl(
+          element: typeFormal,
+          nullabilitySuffix: NullabilitySuffix.star,
+        ),
+        nullabilitySuffix: suffix,
+      ),
+    );
+    withElement.checkObject(
+        getDecoratedBound(typeFormal)!,
+        withElement.checkExplicitlyNullable,
+        'bound of type formal T of test type');
+    withElement.checkTypeParameter(
+        decoratedType.returnType!,
+        withElement.checkExplicitlyNonNullable,
+        typeFormal,
+        'return type of test type');
+  }
+
+  Future<void> test_decorate_functionType_named_parameter() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkDynamic(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: [
+                  ParameterElementImpl.synthetic(
+                    'x',
+                    withElement.typeProvider.dynamicType,
+                    ParameterKind.NAMED,
+                  )
+                ],
+                returnType: withElement.typeProvider.voidType,
+                nullabilitySuffix: suffix,
+              ),
+            )
+            .namedParameters!['x'],
+        'parameter x of test type');
+  }
+
+  Future<void> test_decorate_functionType_ordinary_parameters() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    var decoratedType = withElement.decorate(
+      FunctionTypeImpl(
+        typeFormals: const [],
+        parameters: [
+          ParameterElementImpl.synthetic(
+            'x',
+            withElement.typeProvider.dynamicType,
+            ParameterKind.REQUIRED,
+          ),
+          ParameterElementImpl.synthetic(
+            'y',
+            withElement.typeProvider.dynamicType,
+            ParameterKind.REQUIRED,
+          )
+        ],
+        returnType: withElement.typeProvider.voidType,
+        nullabilitySuffix: suffix,
+      ),
+    );
+    withElement.checkDynamic(
+        decoratedType.positionalParameters![0], 'parameter 0 of test type');
+    withElement.checkDynamic(
+        decoratedType.positionalParameters![1], 'parameter 1 of test type');
+  }
+
+  Future<void> test_decorate_functionType_positional_parameter() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkDynamic(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: [
+                  ParameterElementImpl.synthetic(
+                    'x',
+                    withElement.typeProvider.dynamicType,
+                    ParameterKind.POSITIONAL,
+                  )
+                ],
+                returnType: withElement.typeProvider.voidType,
+                nullabilitySuffix: suffix,
+              ),
+            )
+            .positionalParameters![0],
+        'parameter 0 of test type');
+  }
+
+  Future<void> test_decorate_functionType_question() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkExplicitlyNullable(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: const [],
+                returnType: withElement.typeProvider.voidType,
+                nullabilitySuffix: NullabilitySuffix.question,
+              ),
+            )
+            .node,
+        'test type');
+  }
+
+  Future<void> test_decorate_functionType_returnType() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkDynamic(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: const [],
+                returnType: withElement.typeProvider.dynamicType,
+                nullabilitySuffix: suffix,
+              ),
+            )
+            .returnType,
+        'return type of test type');
+  }
+
+  Future<void> test_decorate_functionType_star() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkExplicitlyNonNullable(
+        withElement
+            .decorate(
+              FunctionTypeImpl(
+                typeFormals: const [],
+                parameters: const [],
+                returnType: withElement.typeProvider.voidType,
+                nullabilitySuffix: suffix,
+              ),
+            )
+            .node,
+        'test type');
+  }
+
+  Future<void> test_decorate_interfaceType_parameters() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    var decoratedType = withElement.decorate(InterfaceTypeImpl(
+        element: withElement.typeProvider.mapElement,
+        typeArguments: [
+          withElement.typeProvider.intType,
+          withElement.typeProvider.numType
+        ],
+        nullabilitySuffix: suffix));
+    withElement.checkInt(decoratedType.typeArguments[0]!,
+        withElement.checkExplicitlyNonNullable, 'type argument 0 of test type');
+    withElement.checkNum(decoratedType.typeArguments[1]!,
+        withElement.checkExplicitlyNonNullable, 'type argument 1 of test type');
+  }
+
+  Future<void> test_decorate_interfaceType_simple_question() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkInt(
+        withElement.decorate(
+          InterfaceTypeImpl(
+            element: withElement.typeProvider.intElement,
+            typeArguments: const [],
+            nullabilitySuffix: NullabilitySuffix.question,
+          ),
+        ),
+        withElement.checkExplicitlyNullable,
+        'test type');
+  }
+
+  Future<void> test_decorate_interfaceType_simple_star() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkInt(
+        withElement.decorate(
+          InterfaceTypeImpl(
+            element: withElement.typeProvider.intElement,
+            typeArguments: const [],
+            nullabilitySuffix: suffix,
+          ),
+        ),
+        withElement.checkExplicitlyNonNullable,
+        'test type');
+  }
+
+  Future<void> test_decorate_iterable_dynamic() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    var decorated =
+        withElement.decorate(withElement.typeProvider.iterableDynamicType);
+    withElement.checkIterable(decorated, withElement.checkExplicitlyNonNullable,
+        withElement.checkDynamic, 'test type');
+  }
+
+  Future<void> test_decorate_never() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkNever(
+        withElement.decorate(withElement.typeProvider.neverType), 'test type');
+  }
+
+  Future<void> test_decorate_typeParameterType_question() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class A<T> {}',
+    );
+    var element = withUnit.findElement.typeParameter('T');
+    var withElement = withUnit.withElement(element);
+
+    withElement.checkTypeParameter(
+        withElement.decorate(TypeParameterTypeImpl(
+            element: element, nullabilitySuffix: NullabilitySuffix.question)),
+        withElement.checkExplicitlyNullable,
+        element,
+        'test type');
+  }
+
+  Future<void> test_decorate_typeParameterType_star() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class A<T> {}',
+    );
+    var element = withUnit.findElement.typeParameter('T');
+    var withElement = withUnit.withElement(element);
+
+    withElement.checkTypeParameter(
+        withElement.decorate(
+            TypeParameterTypeImpl(element: element, nullabilitySuffix: suffix)),
+        withElement.checkExplicitlyNonNullable,
+        element,
+        'test type');
+  }
+
+  Future<void> test_decorate_void() async {
+    var withElement = await _ContextWithFiles().withEmptyUnit();
+
+    withElement.checkVoid(
+        withElement.decorate(withElement.typeProvider.voidType), 'test type');
+  }
+
+  Future<void> test_getImmediateSupertypes_future() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement('');
+    var element = withUnit.typeProvider.futureElement;
+    var withElement = withUnit.withElement(element);
+
+    // var class_ = element = typeProvider.futureElement;
+    var class_ = withElement.typeProvider.futureElement;
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    var typeParam = class_.typeParameters[0];
+    expect(decoratedSupertypes, hasLength(2));
+    // TODO(scheglov) Use location matcher.
+    withElement.checkObject(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'Future (async.dart:1:79)');
+    // Since Future<T> is a subtype of FutureOr<T>, we consider FutureOr<T> to
+    // be an immediate supertype, even though the class declaration for Future
+    // doesn't mention FutureOr.
+    // TODO(scheglov) Use location matcher.
+    withElement.checkFutureOr(
+        decoratedSupertypes[1],
+        withElement.checkExplicitlyNonNullable,
+        (t, displayName) => withElement.checkTypeParameter(
+            t!, withElement.checkExplicitlyNonNullable, typeParam, displayName),
+        'Future (async.dart:1:79)');
+  }
+
+  Future<void> test_getImmediateSupertypes_generic() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class C<T> extends Iterable<T> {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var class_ = unitElement.classes.single;
+    var t = class_.typeParameters.single;
+
+    var withElement = withUnit.withElement(class_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    expect(decoratedSupertypes, hasLength(1));
+    withElement.checkIterable(
+        decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable,
+        (type, displayName) => withElement.checkTypeParameter(
+            type!, withElement.checkExplicitlyNonNullable, t, displayName),
+        'C (test.dart:1:7)');
+  }
+
+  Future<void> test_getImmediateSupertypes_interface() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class C implements num {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var class_ = unitElement.classes.single;
+
+    var withElement = withUnit.withElement(class_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    expect(decoratedSupertypes, hasLength(2));
+    withElement.checkObject(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+    withElement.checkNum(decoratedSupertypes[1],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+  }
+
+  Future<void> test_getImmediateSupertypes_mixin() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class C with num {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var class_ = unitElement.classes.single;
+
+    var withElement = withUnit.withElement(class_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    expect(decoratedSupertypes, hasLength(2));
+    withElement.checkObject(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+    withElement.checkNum(decoratedSupertypes[1],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+  }
+
+  Future<void> test_getImmediateSupertypes_superclassConstraint() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'mixin C on num {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var mixin_ = unitElement.mixins.single;
+
+    var withElement = withUnit.withElement(mixin_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(mixin_).toList();
+    expect(decoratedSupertypes, hasLength(1));
+    withElement.checkNum(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+  }
+
+  Future<void> test_getImmediateSupertypes_supertype() async {
+    var withUnit = await _ContextWithFiles().buildUnitElement(
+      'class C {}',
+    );
+    var unitElement = withUnit.unitElement;
+    var class_ = unitElement.classes.single;
+
+    var withElement = withUnit.withElement(class_);
+
+    var decoratedSupertypes =
+        withElement.decorator.getImmediateSupertypes(class_).toList();
+    expect(decoratedSupertypes, hasLength(1));
+    // TODO(paulberry): displayName should be 'Object supertype of C'
+    withElement.checkObject(decoratedSupertypes[0],
+        withElement.checkExplicitlyNonNullable, 'C (test.dart:1:7)');
+  }
+}
+
+/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
+/// situation where the already migrated code does not contain star types.  In
+/// the final product, by definition all already-migrated code will be free of
+/// star types.  However, since we do not yet migrate using a fully NNBD-aware
+/// SDK, we need to handle both star and non-star variants on a short term
+/// basis.
+@reflectiveTest
+class _AlreadyMigratedCodeDecoratorTestNormal
+    extends _AlreadyMigratedCodeDecoratorTestBase {
+  _AlreadyMigratedCodeDecoratorTestNormal() : super(NullabilitySuffix.none);
+}
+
+/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
+/// situation where the already migrated code contains star types.  In the final
+/// product, this will never happen.  However, since we do not yet migrate using
+/// a fully NNBD-aware SDK, we need to handle both star and non-star variants on
+/// a short term basis.
+@reflectiveTest
+class _AlreadyMigratedCodeDecoratorTestProvisional
+    extends _AlreadyMigratedCodeDecoratorTestBase {
+  _AlreadyMigratedCodeDecoratorTestProvisional()
+      : super(NullabilitySuffix.star);
+}
+
+class _ContextWithElement with EdgeTester {
+  final _ContextWithUnitElement _withUnit;
+  final Element element;
+
+  final NullabilityGraphForTesting graph = NullabilityGraphForTesting();
+
+  _ContextWithElement(this._withUnit, this.element);
 
   NullabilityNode get always => graph.always;
 
+  AlreadyMigratedCodeDecorator get decorator {
+    return AlreadyMigratedCodeDecorator(
+        graph, typeProvider, (_) => LineInfo([0]));
+  }
+
   NullabilityNode get never => graph.never;
 
+  TypeProvider get typeProvider {
+    return _withUnit.typeProvider;
+  }
+
   void checkAlwaysNullable(NullabilityNode node, String displayName) {
     var edge = assertEdge(always, node, hard: true, checkable: false);
     var origin = graph.getEdgeOrigin(edge)!;
@@ -88,10 +532,11 @@
   }
 
   void checkFutureOr(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      void Function(DecoratedType?, String) checkArgument,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    void Function(DecoratedType?, String) checkArgument,
+    String displayName,
+  ) {
     expect(decoratedType.type!.element, typeProvider.futureOrElement);
     checkNullability(decoratedType.node, displayName);
     checkArgument(
@@ -99,18 +544,20 @@
   }
 
   void checkInt(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    String displayName,
+  ) {
     expect(decoratedType.type!.element, typeProvider.intType.element);
     checkNullability(decoratedType.node, displayName);
   }
 
   void checkIterable(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      void Function(DecoratedType?, String) checkArgument,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    void Function(DecoratedType?, String) checkArgument,
+    String displayName,
+  ) {
     expect(
         decoratedType.type!.element, typeProvider.iterableDynamicType.element);
     checkNullability(decoratedType.node, displayName);
@@ -124,26 +571,29 @@
   }
 
   void checkNum(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    String displayName,
+  ) {
     expect(decoratedType.type!.element, typeProvider.numType.element);
     checkNullability(decoratedType.node, displayName);
   }
 
   void checkObject(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    String displayName,
+  ) {
     expect(decoratedType.type!.element, typeProvider.objectType.element);
     checkNullability(decoratedType.node, displayName);
   }
 
   void checkTypeParameter(
-      DecoratedType decoratedType,
-      void Function(NullabilityNode?, String) checkNullability,
-      TypeParameterElement expectedElement,
-      String displayName) {
+    DecoratedType decoratedType,
+    void Function(NullabilityNode?, String) checkNullability,
+    TypeParameterElement expectedElement,
+    String displayName,
+  ) {
     var type = decoratedType.type as TypeParameterTypeImpl;
     expect(type.element, same(expectedElement));
     checkNullability(decoratedType.node, displayName);
@@ -160,397 +610,57 @@
     expect(decoratedType.type, same(type));
     return decoratedType;
   }
+}
 
-  DecoratedType? getDecoratedBound(TypeParameterElement element) =>
-      decoratedTypeParameterBounds.get(element);
+class _ContextWithFiles with ResourceProviderMixin {
+  Future<_ContextWithUnitElement> buildUnitElement(String content) async {
+    var file = newFile('/home/test/lib/test.dart', content: content);
 
-  void setUp() {
-    DecoratedTypeParameterBounds.current = decoratedTypeParameterBounds;
-  }
-
-  void tearDown() {
-    DecoratedTypeParameterBounds.current = null;
-  }
-
-  void test_decorate_dynamic() {
-    checkDynamic(decorate(typeProvider.dynamicType), 'test type');
-  }
-
-  void test_decorate_functionType_generic_bounded() {
-    var typeFormal = element = TypeParameterElementImpl.synthetic('T')
-      ..bound = typeProvider.numType;
-    var decoratedType = decorate(
-      FunctionTypeImpl(
-        typeFormals: [typeFormal],
-        parameters: const [],
-        returnType: TypeParameterTypeImpl(
-          element: typeFormal,
-          nullabilitySuffix: NullabilitySuffix.star,
-        ),
-        nullabilitySuffix: suffix,
-      ),
+    var sdkRoot = newFolder('/sdk');
+    createMockSdk(
+      resourceProvider: resourceProvider,
+      root: sdkRoot,
     );
-    checkNum(getDecoratedBound(typeFormal)!, checkExplicitlyNonNullable,
-        'bound of type formal T of test type');
-    checkTypeParameter(decoratedType.returnType!, checkExplicitlyNonNullable,
-        typeFormal, 'return type of test type');
-  }
 
-  void test_decorate_functionType_generic_no_explicit_bound() {
-    var typeFormal = element = TypeParameterElementImpl.synthetic('T');
-    var decoratedType = decorate(
-      FunctionTypeImpl(
-        typeFormals: [typeFormal],
-        parameters: const [],
-        returnType: TypeParameterTypeImpl(
-          element: typeFormal,
-          nullabilitySuffix: NullabilitySuffix.star,
-        ),
-        nullabilitySuffix: suffix,
-      ),
+    var contextCollection = AnalysisContextCollection(
+      resourceProvider: resourceProvider,
+      includedPaths: [file.path],
+      sdkPath: sdkRoot.path,
     );
-    checkObject(getDecoratedBound(typeFormal)!, checkExplicitlyNullable,
-        'bound of type formal T of test type');
-    checkTypeParameter(decoratedType.returnType!, checkExplicitlyNonNullable,
-        typeFormal, 'return type of test type');
+    var analysisContext = contextCollection.contextFor(file.path);
+    var analysisSession = analysisContext.currentSession;
+    var result = await analysisSession.getResolvedUnit(file.path);
+    return _ContextWithUnitElement(result as ResolvedUnitResult);
   }
 
-  void test_decorate_functionType_named_parameter() {
-    checkDynamic(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: [
-              ParameterElementImpl.synthetic(
-                'x',
-                typeProvider.dynamicType,
-                ParameterKind.NAMED,
-              )
-            ],
-            returnType: typeProvider.voidType,
-            nullabilitySuffix: suffix,
-          ),
-        ).namedParameters!['x'],
-        'parameter x of test type');
+  Future<_ContextWithElement> withEmptyUnit() async {
+    var withUnit = await buildUnitElement('');
+    return withUnit.withElement(withUnit.unitElement);
   }
-
-  void test_decorate_functionType_ordinary_parameters() {
-    var decoratedType = decorate(
-      FunctionTypeImpl(
-        typeFormals: const [],
-        parameters: [
-          ParameterElementImpl.synthetic(
-            'x',
-            typeProvider.dynamicType,
-            ParameterKind.REQUIRED,
-          ),
-          ParameterElementImpl.synthetic(
-            'y',
-            typeProvider.dynamicType,
-            ParameterKind.REQUIRED,
-          )
-        ],
-        returnType: typeProvider.voidType,
-        nullabilitySuffix: suffix,
-      ),
-    );
-    checkDynamic(
-        decoratedType.positionalParameters![0], 'parameter 0 of test type');
-    checkDynamic(
-        decoratedType.positionalParameters![1], 'parameter 1 of test type');
-  }
-
-  void test_decorate_functionType_positional_parameter() {
-    checkDynamic(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: [
-              ParameterElementImpl.synthetic(
-                'x',
-                typeProvider.dynamicType,
-                ParameterKind.POSITIONAL,
-              )
-            ],
-            returnType: typeProvider.voidType,
-            nullabilitySuffix: suffix,
-          ),
-        ).positionalParameters![0],
-        'parameter 0 of test type');
-  }
-
-  void test_decorate_functionType_question() {
-    checkExplicitlyNullable(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: const [],
-            returnType: typeProvider.voidType,
-            nullabilitySuffix: NullabilitySuffix.question,
-          ),
-        ).node,
-        'test type');
-  }
-
-  void test_decorate_functionType_returnType() {
-    checkDynamic(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: const [],
-            returnType: typeProvider.dynamicType,
-            nullabilitySuffix: suffix,
-          ),
-        ).returnType,
-        'return type of test type');
-  }
-
-  void test_decorate_functionType_star() {
-    checkExplicitlyNonNullable(
-        decorate(
-          FunctionTypeImpl(
-            typeFormals: const [],
-            parameters: const [],
-            returnType: typeProvider.voidType,
-            nullabilitySuffix: suffix,
-          ),
-        ).node,
-        'test type');
-  }
-
-  void test_decorate_interfaceType_parameters() {
-    var decoratedType = decorate(InterfaceTypeImpl(
-        element: typeProvider.mapElement,
-        typeArguments: [typeProvider.intType, typeProvider.numType],
-        nullabilitySuffix: suffix));
-    checkInt(decoratedType.typeArguments[0]!, checkExplicitlyNonNullable,
-        'type argument 0 of test type');
-    checkNum(decoratedType.typeArguments[1]!, checkExplicitlyNonNullable,
-        'type argument 1 of test type');
-  }
-
-  void test_decorate_interfaceType_simple_question() {
-    checkInt(
-        decorate(
-          InterfaceTypeImpl(
-            element: typeProvider.intElement,
-            typeArguments: const [],
-            nullabilitySuffix: NullabilitySuffix.question,
-          ),
-        ),
-        checkExplicitlyNullable,
-        'test type');
-  }
-
-  void test_decorate_interfaceType_simple_star() {
-    checkInt(
-        decorate(
-          InterfaceTypeImpl(
-            element: typeProvider.intElement,
-            typeArguments: const [],
-            nullabilitySuffix: suffix,
-          ),
-        ),
-        checkExplicitlyNonNullable,
-        'test type');
-  }
-
-  void test_decorate_iterable_dynamic() {
-    var decorated = decorate(typeProvider.iterableDynamicType);
-    checkIterable(
-        decorated, checkExplicitlyNonNullable, checkDynamic, 'test type');
-  }
-
-  void test_decorate_never() {
-    checkNever(decorate(typeProvider.neverType), 'test type');
-  }
-
-  void test_decorate_typeParameterType_question() {
-    var element = TypeParameterElementImpl.synthetic('T');
-    checkTypeParameter(
-        decorate(TypeParameterTypeImpl(
-            element: element, nullabilitySuffix: NullabilitySuffix.question)),
-        checkExplicitlyNullable,
-        element,
-        'test type');
-  }
-
-  void test_decorate_typeParameterType_star() {
-    var element = TypeParameterElementImpl.synthetic('T');
-    checkTypeParameter(
-        decorate(
-            TypeParameterTypeImpl(element: element, nullabilitySuffix: suffix)),
-        checkExplicitlyNonNullable,
-        element,
-        'test type');
-  }
-
-  void test_decorate_void() {
-    checkVoid(decorate(typeProvider.voidType), 'test type');
-  }
-
-  void test_getImmediateSupertypes_future() {
-    var class_ = element = typeProvider.futureElement;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    var typeParam = class_.typeParameters[0];
-    expect(decoratedSupertypes, hasLength(2));
-    // Note: the bogus location `async:1:1` is because we're using a
-    // TestTypeProvider.
-    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'Future (async:1:1)');
-    // Since Future<T> is a subtype of FutureOr<T>, we consider FutureOr<T> to
-    // be an immediate supertype, even though the class declaration for Future
-    // doesn't mention FutureOr.
-    // Note: the bogus location `async:1:1` is because we're using a
-    // TestTypeProvider.
-    checkFutureOr(
-        decoratedSupertypes[1],
-        checkExplicitlyNonNullable,
-        (t, displayName) => checkTypeParameter(
-            t!, checkExplicitlyNonNullable, typeParam, displayName),
-        'Future (async:1:1)');
-  }
-
-  void test_getImmediateSupertypes_generic() {
-    var library = _LibraryElementMock();
-    var t = ElementFactory.typeParameterElement('T');
-    var class_ = element = ElementFactory.classElement3(
-      name: 'C',
-      typeParameters: [t],
-      supertype: typeProvider.iterableType(
-        t.instantiate(nullabilitySuffix: suffix),
-      ),
-    );
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(1));
-    checkIterable(
-        decoratedSupertypes[0],
-        checkExplicitlyNonNullable,
-        (type, displayName) => checkTypeParameter(
-            type!, checkExplicitlyNonNullable, t, displayName),
-        'C (test.dart:1:1)');
-  }
-
-  void test_getImmediateSupertypes_interface() {
-    var library = _LibraryElementMock();
-    var class_ =
-        element = ElementFactory.classElement('C', typeProvider.objectType);
-    class_.interfaces = [typeProvider.numType];
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(2));
-    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-    checkNum(decoratedSupertypes[1], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-  }
-
-  void test_getImmediateSupertypes_mixin() {
-    var library = _LibraryElementMock();
-    var class_ =
-        element = ElementFactory.classElement('C', typeProvider.objectType);
-    class_.mixins = [typeProvider.numType];
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(2));
-    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-    checkNum(decoratedSupertypes[1], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-  }
-
-  void test_getImmediateSupertypes_superclassConstraint() {
-    var library = _LibraryElementMock();
-    var class_ = element = ElementFactory.mixinElement(
-        name: 'C', constraints: [typeProvider.numType]);
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(1));
-    checkNum(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-  }
-
-  void test_getImmediateSupertypes_supertype() {
-    var library = _LibraryElementMock();
-    var class_ =
-        element = ElementFactory.classElement('C', typeProvider.objectType);
-    class_.enclosingElement = library.definingCompilationUnit;
-    var decoratedSupertypes = decorator.getImmediateSupertypes(class_).toList();
-    expect(decoratedSupertypes, hasLength(1));
-    // TODO(paulberry): displayName should be 'Object supertype of C'
-    checkObject(decoratedSupertypes[0], checkExplicitlyNonNullable,
-        'C (test.dart:1:1)');
-  }
-
-  static LineInfo _getLineInfo(String path) => LineInfo([0]);
 }
 
-/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
-/// situation where the already migrated code does not contain star types.  In
-/// the final product, by definition all already-migrated code will be free of
-/// star types.  However, since we do not yet migrate using a fully NNBD-aware
-/// SDK, we need to handle both star and non-star variants on a short term
-/// basis.
-@reflectiveTest
-class _AlreadyMigratedCodeDecoratorTestNormal
-    extends _AlreadyMigratedCodeDecoratorTestBase {
-  _AlreadyMigratedCodeDecoratorTestNormal() : super(NullabilitySuffix.none);
-}
+class _ContextWithUnitElement {
+  final ResolvedUnitResult _unitResult;
 
-/// Specialization of [_AlreadyMigratedCodeDecoratorTestBase] for testing the
-/// situation where the already migrated code contains star types.  In the final
-/// product, this will never happen.  However, since we do not yet migrate using
-/// a fully NNBD-aware SDK, we need to handle both star and non-star variants on
-/// a short term basis.
-@reflectiveTest
-class _AlreadyMigratedCodeDecoratorTestProvisional
-    extends _AlreadyMigratedCodeDecoratorTestBase {
-  _AlreadyMigratedCodeDecoratorTestProvisional()
-      : super(NullabilitySuffix.star);
-}
+  _ContextWithUnitElement(this._unitResult);
 
-class _CompilationUnitElementMock implements CompilationUnitElementImpl {
-  @override
-  final LibraryElement enclosingElement;
-
-  @override
-  final Source source;
-
-  _CompilationUnitElementMock(this.enclosingElement, this.source);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-class _LibraryElementMock implements LibraryElementImpl {
-  @override
-  late CompilationUnitElement definingCompilationUnit;
-
-  @override
-  late Source source;
-
-  _LibraryElementMock() {
-    source = _SourceMock();
-    definingCompilationUnit = _CompilationUnitElementMock(this, source);
+  FindElement get findElement {
+    return FindElement(_unitResult.unit);
   }
 
-  @override
-  Element? get enclosingElement => null;
+  FindNode get findNode {
+    return FindNode(_unitResult.content, _unitResult.unit);
+  }
 
-  @override
-  bool get isNonNullableByDefault => false;
+  TypeProvider get typeProvider {
+    return unitElement.library.typeProvider;
+  }
 
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
+  CompilationUnitElement get unitElement {
+    return _unitResult.unit.declaredElement!;
+  }
 
-class _MockElement implements Element {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-class _SourceMock implements Source {
-  String get fullName => '/test.dart';
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+  _ContextWithElement withElement(Element element) {
+    return _ContextWithElement(this, element);
+  }
 }
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index a13964d..a2bbb70 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -639,6 +639,20 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_await_null() async {
+    var content = '''
+Future<int> test() async {
+  return await null;
+}
+''';
+    var expected = '''
+Future<int?> test() async {
+  return await null;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void>
       test_back_propagation_stops_at_implicitly_typed_variables() async {
     var content = '''
@@ -863,6 +877,171 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_call_tearoff() async {
+    var content = '''
+class C {
+  void call() {}
+}
+void Function() f(C c) => c;
+''';
+    var expected = '''
+class C {
+  void call() {}
+}
+void Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_call_tearoff_already_migrated() async {
+    var content = '''
+import 'already_migrated.dart';
+void Function() f(C c) => c;
+''';
+    var alreadyMigrated = '''
+// @dart=2.12
+class C {
+  void call() {}
+}
+''';
+    var expected = '''
+import 'already_migrated.dart';
+void Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected, migratedInput: {
+      '$projectPath/lib/already_migrated.dart': alreadyMigrated
+    });
+  }
+
+  Future<void>
+      test_call_tearoff_already_migrated_propagate_nullability() async {
+    var content = '''
+import 'already_migrated.dart';
+Map<int, String> Function() f(C c) => c;
+''';
+    var alreadyMigrated = '''
+// @dart=2.12
+class C {
+  Map<int, String?> call() => {};
+}
+''';
+    var expected = '''
+import 'already_migrated.dart';
+Map<int, String?> Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected, migratedInput: {
+      '$projectPath/lib/already_migrated.dart': alreadyMigrated
+    });
+  }
+
+  Future<void> test_call_tearoff_already_migrated_with_substitution() async {
+    var content = '''
+import 'already_migrated.dart';
+Map<int, String> Function() f(C<String/*?*/> c) => c;
+''';
+    var alreadyMigrated = '''
+// @dart=2.12
+class C<T> {
+  Map<int, T> call() => {};
+}
+''';
+    var expected = '''
+import 'already_migrated.dart';
+Map<int, String?> Function() f(C<String?> c) => c;
+''';
+    await _checkSingleFileChanges(content, expected, migratedInput: {
+      '$projectPath/lib/already_migrated.dart': alreadyMigrated
+    });
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47848')
+  Future<void> test_call_tearoff_futureOr() async {
+    var content = '''
+import 'dart:async';
+class C {
+  void call() {}
+}
+FutureOr<void Function()> f(C c) => c;
+''';
+    var expected = '''
+import 'dart:async';
+class C {
+  void call() {}
+}
+FutureOr<void Function()> f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_call_tearoff_inherited() async {
+    var content = '''
+class B {
+  void call() {}
+}
+class C extends B {}
+void Function() f(C c) => c;
+''';
+    var expected = '''
+class B {
+  void call() {}
+}
+class C extends B {}
+void Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_call_tearoff_inherited_propagate_nullability() async {
+    var content = '''
+class B {
+  Map<int, String> call() => {1: null};
+}
+class C extends B {}
+Map<int, String> Function() f(C c) => c;
+''';
+    var expected = '''
+class B {
+  Map<int, String?> call() => {1: null};
+}
+class C extends B {}
+Map<int, String?> Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_call_tearoff_propagate_nullability() async {
+    var content = '''
+class C {
+  Map<int, String> call() => {1: null};
+}
+Map<int, String> Function() f(C c) => c;
+''';
+    var expected = '''
+class C {
+  Map<int, String?> call() => {1: null};
+}
+Map<int, String?> Function() f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/47848')
+  Future<void> test_call_tearoff_raw_function() async {
+    var content = '''
+class C {
+  void call() {}
+}
+Function f(C c) => c;
+''';
+    var expected = '''
+class C {
+  void call() {}
+}
+Function f(C c) => c;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_catch_simple() async {
     var content = '''
 void f() {
@@ -4924,6 +5103,18 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_implicit_tearoff_type_arguments() async {
+    var content = '''
+T f<T>(T t) => t;
+int Function(int) g() => f;
+''';
+    var expected = '''
+T f<T>(T t) => t;
+int Function(int) g() => f;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_implicit_type_parameter_bound_nullable() async {
     var content = '''
 class C<T> {
@@ -5169,6 +5360,16 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_int_double_coercion() async {
+    var content = '''
+double f() => 0;
+''';
+    var expected = '''
+double f() => 0;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_is_promotion_implies_non_nullable() async {
     var content = '''
 bool f(Object o) => o is int && o.isEven;
@@ -8913,6 +9114,49 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_var_with_different_types() async {
+    // Based on https://github.com/dart-lang/sdk/issues/47669
+    var content = '''
+class C<T> {
+  T m() => throw 'foo';
+}
+f(bool b, List<C<int>> cs) {
+  var x = !b,
+      y = cs.first,
+      z = y.m();
+}
+''';
+    var expected = '''
+class C<T> {
+  T m() => throw 'foo';
+}
+f(bool b, List<C<int>> cs) {
+  var x = !b,
+      y = cs.first,
+      z = y.m();
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_var_with_different_types_becoming_explicit() async {
+    // When types need to be added to some variables in a declaration but not
+    // others, we handle it by introducing `as` casts.
+    var content = '''
+f(int i, String s) {
+  var x = i, y = s;
+  x = null;
+}
+''';
+    var expected = '''
+f(int i, String s) {
+  var x = i as int?, y = s;
+  x = null;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_weak_if_visit_weak_subexpression() async {
     var content = '''
 int f(int x, int/*?*/ y) {
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index fcec048..2be4a72 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -70,6 +70,7 @@
         TypeSystemImpl(
           implicitCasts: true,
           isNonNullableByDefault: false,
+          strictCasts: false,
           strictInference: false,
           typeProvider: typeProvider,
         ),
@@ -500,6 +501,7 @@
     var typeSystem = TypeSystemImpl(
       isNonNullableByDefault: false,
       implicitCasts: true,
+      strictCasts: false,
       strictInference: false,
       typeProvider: typeProvider,
     );
diff --git a/pkg/nnbd_migration/test/migration_cli_test.dart b/pkg/nnbd_migration/test/migration_cli_test.dart
index 08b16bc..48c7c49 100644
--- a/pkg/nnbd_migration/test/migration_cli_test.dart
+++ b/pkg/nnbd_migration/test/migration_cli_test.dart
@@ -1114,7 +1114,7 @@
               path: '/_preview/navigationTree.json',
               queryParameters: {'authToken': authToken}),
           headers: {'Content-Type': 'application/json; charset=UTF-8'});
-      var navRoots = jsonDecode(treeResponse.body);
+      var navRoots = jsonDecode(treeResponse.body) as List<Object?>;
       for (final root in navRoots) {
         var navTree =
             NavigationTreeNode.fromJson(root) as NavigationTreeDirectoryNode;
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index 9a4294b..85448d0 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -147,8 +147,15 @@
   Future<CompilationUnit> analyze(String code) async {
     var unit = await super.analyze(code);
     decoratedClassHierarchy = DecoratedClassHierarchy(variables, graph);
-    unit.accept(EdgeBuilder(typeProvider, typeSystem, variables, graph,
-        testSource, null, decoratedClassHierarchy));
+    unit.accept(EdgeBuilder(
+        typeProvider,
+        typeSystem,
+        variables,
+        graph,
+        testSource,
+        null,
+        decoratedClassHierarchy,
+        unit.declaredElement!.library));
     return unit;
   }
 }
diff --git a/pkg/smith/analysis_options.yaml b/pkg/smith/analysis_options.yaml
index 1a46de2..55af634 100644
--- a/pkg/smith/analysis_options.yaml
+++ b/pkg/smith/analysis_options.yaml
@@ -1,3 +1,3 @@
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
diff --git a/pkg/smith/lib/builder.dart b/pkg/smith/lib/builder.dart
index ebe550c..6f27730 100644
--- a/pkg/smith/lib/builder.dart
+++ b/pkg/smith/lib/builder.dart
@@ -73,11 +73,12 @@
         throw FormatException("Step tests multiple configurations: $arguments");
       }
     }
+    var environment = map["environment"] as Map<Object?, Object?>?;
     return Step(
         map["name"] as String,
         script,
         arguments,
-        <String, String>{...?map["environment"]},
+        {...?environment?.cast<String, String>()},
         map["fileset"] as String?,
         map["shards"] as int?,
         isTestRunner,
@@ -192,14 +193,17 @@
   var names = <String>{};
   for (var builderConfiguration in builderConfigurations) {
     var meta = builderConfiguration["meta"] as Map? ?? <String, String>{};
-    var builderNames = <String>[...?builderConfiguration["builders"]];
-    var steps = <Map>[...?builderConfiguration["steps"]];
-    for (var builderName in builderNames) {
-      if (!names.add(builderName)) {
-        throw FormatException('Duplicate builder name: "$builderName"');
+    var builderNames = builderConfiguration["builders"] as List<Object?>?;
+    if (builderNames != null) {
+      var steps = ((builderConfiguration["steps"] ?? []) as List<Object?>)
+          .cast<Map<Object?, Object?>>();
+      for (var builderName in builderNames.cast<String>()) {
+        if (!names.add(builderName)) {
+          throw FormatException('Duplicate builder name: "$builderName"');
+        }
+        builders.add(Builder.parse(builderName, steps, configurations,
+            meta["description"] as String?));
       }
-      builders.add(Builder.parse(
-          builderName, steps, configurations, meta["description"] as String?));
     }
   }
   return builders;
diff --git a/pkg/smith/lib/test_matrix.dart b/pkg/smith/lib/test_matrix.dart
index 0af1ca8..a81a0e3 100644
--- a/pkg/smith/lib/test_matrix.dart
+++ b/pkg/smith/lib/test_matrix.dart
@@ -52,9 +52,13 @@
       }
     });
 
-    var builderConfigurations = <Map>[...?json["builder_configurations"]];
+    var builderConfigurations = [
+      ...?(json["builder_configurations"] as List<Object?>?)
+          ?.cast<Map<Object?, Object?>>()
+    ];
     var builders = parseBuilders(builderConfigurations, configurations);
-    var branches = <String>[...?json["branches"]];
+    var branchesValue = json["branches"] as List?;
+    var branches = [...?branchesValue?.cast<String>()];
 
     // Check that each configuration is tested on at most one builder.
     var testedOn = <Configuration, Builder>{};
diff --git a/pkg/telemetry/analysis_options.yaml b/pkg/telemetry/analysis_options.yaml
index 0fcad72..bb2ae44 100644
--- a/pkg/telemetry/analysis_options.yaml
+++ b/pkg/telemetry/analysis_options.yaml
@@ -1,8 +1,8 @@
 include: package:lints/recommended.yaml
 
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
 linter:
   rules:
     - unawaited_futures
diff --git a/pkg/test_runner/analysis_options.yaml b/pkg/test_runner/analysis_options.yaml
index 406b0a1..e6a5912 100644
--- a/pkg/test_runner/analysis_options.yaml
+++ b/pkg/test_runner/analysis_options.yaml
@@ -1,6 +1,6 @@
 analyzer:
-  strong-mode:
-    implicit-casts: false
+  language:
+    strict-casts: true
 linter:
   rules:
     # TODO: Enable these once the existing violations have been fixed.
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index 579b10e..cc65097 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -174,10 +174,12 @@
       var events = jsonDecode(content);
       if (events != null) {
         validate("Message must be a List", events is List);
+        // TODO(srawlins): This will promote `events` in null safety.
+        var eventList = events as List<dynamic>;
 
         var messagesByType = {for (var type in _allowedTypes) type: <String>[]};
 
-        for (var entry in events) {
+        for (var entry in eventList) {
           validate("Entry must be a Map", entry is Map);
 
           var type = entry['type'];
@@ -207,7 +209,7 @@
         }
 
         return BrowserTestJsonResult(
-            _getOutcome(messagesByType), dom, events as List<dynamic>);
+            _getOutcome(messagesByType), dom, eventList);
       }
     } catch (error) {
       // If something goes wrong, we know the content was not in the correct
@@ -684,8 +686,10 @@
   @override
   void describe(TestCase testCase, Progress progress, OutputWriter output) {
     if (invalidJsonStdout != null) {
+      output.subsection("analyzer json parse result");
+      output.write("- parse failed");
       output.subsection("invalid analyzer json");
-      output.write(invalidJsonStdout);
+      super.describe(testCase, progress, output);
       return;
     }
 
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index cb968a9..a32b394 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -828,6 +828,9 @@
       if (_configuration.useQemu) '--no-use-integer-division',
       if (arguments.contains('--print-flow-graph-optimized'))
         '--redirect-isolate-log-to=$tempDir/out.il',
+      if (arguments.contains('--print-flow-graph-optimized') &&
+          (_configuration.isMinified || arguments.contains('--obfuscate')))
+        '--save-obfuscation_map=$tempDir/renames.json',
       ..._replaceDartFiles(arguments, tempKernelFile(tempDir)),
     ];
 
@@ -844,6 +847,7 @@
     var args = [
       arguments.firstWhere((arg) => arg.endsWith('_il_test.dart')),
       '$tempDir/out.il',
+      if (arguments.contains('--obfuscate')) '$tempDir/renames.json',
     ];
 
     return CompilationCommand('compare_il', tempDir, bootstrapDependencies(),
@@ -965,9 +969,10 @@
   List<String> computeCompilerArguments(
       TestFile testFile, List<String> vmOptions, List<String> args) {
     return [
-      if (testFile.ilMatches.isNotEmpty) ...[
+      if (testFile.isVmIntermediateLanguageTest) ...[
         '--print-flow-graph-optimized',
-        '--print-flow-graph-filter=${testFile.ilMatches.join(',')}'
+        '--print-flow-graph-as-json',
+        '--print-flow-graph-filter=@pragma',
       ],
       if (_enableAsserts) '--enable_asserts',
       ...filterVmOptions(vmOptions),
diff --git a/pkg/test_runner/lib/src/fuchsia.dart b/pkg/test_runner/lib/src/fuchsia.dart
index a3880c5..aeeab96 100644
--- a/pkg/test_runner/lib/src/fuchsia.dart
+++ b/pkg/test_runner/lib/src/fuchsia.dart
@@ -11,11 +11,13 @@
 
 class FuchsiaEmulator {
   static final Uri toolsDir =
+      Repository.uri.resolve('third_party/fuchsia/sdk/linux/tools/x64/');
+  static final Uri scriptsDir =
       Repository.uri.resolve('third_party/fuchsia/sdk/linux/bin/');
-  static final String femuTool = toolsDir.resolve('femu.sh').toFilePath();
-  static final String fserveTool = toolsDir.resolve('fserve.sh').toFilePath();
-  static final String fpubTool = toolsDir.resolve('fpublish.sh').toFilePath();
-  static final String fsshTool = toolsDir.resolve('fssh.sh').toFilePath();
+  static final String femuTool = scriptsDir.resolve('femu.sh').toFilePath();
+  static final String fserveTool = toolsDir.resolve('fserve').toFilePath();
+  static final String fpubTool = toolsDir.resolve('fpublish').toFilePath();
+  static final String fsshTool = toolsDir.resolve('fssh').toFilePath();
   static final RegExp emulatorReadyPattern =
       RegExp(r'Using unique host name (.+)\.local\.');
   static final RegExp emulatorPidPattern =
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index bfe16f6..dccb5f4 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -896,7 +896,7 @@
       }
 
       var excludeSuites = configuration['exclude_suite'] != null
-          ? configuration['exclude_suite'].split(',')
+          ? (configuration['exclude_suite'] as String).split(',')
           : [];
       for (var exclude in excludeSuites) {
         if ((selectors as List).contains(exclude)) {
diff --git a/pkg/test_runner/lib/src/test_file.dart b/pkg/test_runner/lib/src/test_file.dart
index 8b61d68..3c71e5b 100644
--- a/pkg/test_runner/lib/src/test_file.dart
+++ b/pkg/test_runner/lib/src/test_file.dart
@@ -211,10 +211,7 @@
       throw FormatException('Unknown feature "$name" in test $filePath');
     });
 
-    var ilMatches = filePath.endsWith('_il_test.dart')
-        ? _parseStringOption(filePath, contents, r'MatchIL\[AOT\]',
-            allowMultiple: true)
-        : const <String>[];
+    final isVmIntermediateLanguageTest = filePath.endsWith('_il_test.dart');
 
     // VM options.
     var vmOptions = <List<String>>[];
@@ -341,7 +338,7 @@
         sharedObjects: sharedObjects,
         otherResources: otherResources,
         experiments: experiments,
-        ilMatches: ilMatches);
+        isVmIntermediateLanguageTest: isVmIntermediateLanguageTest);
   }
 
   /// A special fake test file for representing a VM unit test written in C++.
@@ -363,7 +360,7 @@
         sharedObjects = [],
         otherResources = [],
         experiments = [],
-        ilMatches = [],
+        isVmIntermediateLanguageTest = false,
         super(null, null, []);
 
   TestFile._(Path suiteDirectory, Path path, List<StaticError> expectedErrors,
@@ -384,7 +381,7 @@
       this.sharedObjects,
       this.otherResources,
       this.experiments,
-      this.ilMatches = const <String>[]})
+      this.isVmIntermediateLanguageTest = false})
       : super(suiteDirectory, path, expectedErrors) {
     assert(!isMultitest || dartOptions.isEmpty);
   }
@@ -403,6 +400,7 @@
   final bool hasRuntimeError;
   final bool hasStaticWarning;
   final bool hasCrash;
+  final bool isVmIntermediateLanguageTest;
 
   /// The features that a test configuration must support in order to run this
   /// test.
@@ -411,9 +409,6 @@
   /// requirements, the test is implicitly skipped.
   final List<Feature> requirements;
 
-  /// List of functions which will have their IL verified (in AOT mode).
-  final List<String> ilMatches;
-
   final List<String> sharedOptions;
   final List<String> dartOptions;
   final List<String> dart2jsOptions;
@@ -479,6 +474,7 @@
   final bool hasStaticWarning;
   final bool hasSyntaxError;
   bool get hasCrash => _origin.hasCrash;
+  bool get isVmIntermediateLanguageTest => _origin.isVmIntermediateLanguageTest;
 
   _MultitestFile(this._origin, Path path, this.multitestKey,
       List<StaticError> expectedErrors,
@@ -493,7 +489,6 @@
   String get packages => _origin.packages;
 
   List<Feature> get requirements => _origin.requirements;
-  List<String> get ilMatches => _origin.ilMatches;
   List<String> get dart2jsOptions => _origin.dart2jsOptions;
   List<String> get dartOptions => _origin.dartOptions;
   List<String> get ddcOptions => _origin.ddcOptions;
diff --git a/pkg/test_runner/lib/src/testing_servers.dart b/pkg/test_runner/lib/src/testing_servers.dart
index 984f83c..ca69031 100644
--- a/pkg/test_runner/lib/src/testing_servers.dart
+++ b/pkg/test_runner/lib/src/testing_servers.dart
@@ -166,6 +166,7 @@
       server.addHandler('/$prefixBuildDir', fileHandler);
       server.addHandler('/$prefixDartDir', fileHandler);
       server.addHandler('/packages', fileHandler);
+      server.addHandler('/upload', _handleUploadRequest);
       _serverList.add(httpServer);
       return server;
     });
@@ -237,6 +238,23 @@
     });
   }
 
+  void _handleUploadRequest(HttpRequest request) async {
+    try {
+      var builder = await request.fold(BytesBuilder(), (var b, var d) {
+        b.add(d);
+        return b;
+      });
+      var data = builder.takeBytes();
+      DebugLogger.info(
+          'Uploaded data: ${String.fromCharCodes(data as Iterable<int>)}');
+      request.response.headers.set("Access-Control-Allow-Origin", "*");
+      request.response.close();
+    } catch (e) {
+      DebugLogger.warning(
+          'HttpServer: error while processing upload request', e);
+    }
+  }
+
   Uri _getFileUriFromRequestUri(Uri request) {
     // Go to the top of the file to see an explanation of the URL path scheme.
     var pathSegments = request.normalizePath().pathSegments;
diff --git a/pkg/vm/bin/compare_il.dart b/pkg/vm/bin/compare_il.dart
index 9d9febd..5b9caa3 100644
--- a/pkg/vm/bin/compare_il.dart
+++ b/pkg/vm/bin/compare_il.dart
@@ -5,185 +5,157 @@
 // This is a helper script which performs IL matching for AOT IL tests.
 // See runtime/docs/infra/il_tests.md for more information.
 
+import 'dart:collection';
+import 'dart:convert';
 import 'dart:io';
+import 'dart:mirrors';
 
-void main(List<String> args) {
-  if (args.length != 2) {
-    throw 'Usage: compare_il <*_il_test.dart> <output.il>';
+import 'package:collection/collection.dart';
+
+import 'package:vm/testing/il_matchers.dart';
+
+void main(List<String> args) async {
+  getName = MirrorSystem.getName;
+
+  if (args.length < 2 || args.length > 3) {
+    throw 'Usage: compare_il <*_il_test.dart> <output.il> [<renames.json>]';
   }
 
   final testFile = args[0];
   final ilFile = args[1];
+  final renamesFile = args.length == 3 ? args[2] : null;
 
-  final graphs = _extractGraphs(ilFile);
+  final rename = _loadRenames(renamesFile);
+  final graphs = _loadGraphs(ilFile, rename);
+  final tests = await _loadTestCases(testFile);
 
-  final expectations = _extractExpectations(testFile);
+  Map<String, FlowGraph> findMatchingGraphs(String name) {
+    final suffix = '_${rename(name)}';
+    return graphs.entries.firstWhere((f) => f.key.contains(suffix)).value;
+  }
 
-  for (var expectation in expectations.entries) {
-    // Find a graph for this expectation. We expect that function names are
-    // unique enough to identify a specific graph.
-    final graph =
-        graphs.entries.singleWhere((e) => e.key.contains(expectation.key));
-
-    // Extract the list of opcodes, ignoring irrelevant things like
-    // ParallelMove.
-    final gotOpcodesIgnoringMoves = graph.value
-        .where((instr) => instr.opcode != 'ParallelMove')
-        .map((instr) => instr.opcode)
-        .toList();
-
-    // Check that expectations are the prefix of gotOpcodesIgnoringMoves.
-    print('Matching ${graph.key}');
-    for (var i = 0; i < expectation.value.length; i++) {
-      final gotOpcode = gotOpcodesIgnoringMoves[i];
-      final expectedOpcode = expectation.value[i];
-      if (gotOpcode != expectedOpcode) {
-        throw 'Failed to match graph of ${graph.key} to '
-            'expectations for ${expectation.key} at instruction ${i}: '
-            'got ${gotOpcode} expected ${expectedOpcode}';
-      }
-    }
-    print('... ok');
+  for (var test in tests) {
+    test.run(findMatchingGraphs(test.name));
   }
 
   exit(0); // Success.
 }
 
-// IL instruction extracted from flow graph dump.
-class Instruction {
-  final String raw;
+class TestCase {
+  final String name;
+  final String phasesFilter;
+  final LibraryMirror library;
 
-  Instruction(this.raw);
+  late final phases =
+      phasesFilter.split(',').expand(_expandPhasePattern).toList();
 
-  String get opcode {
-    final match = instructionPattern.firstMatch(raw)!;
-    final op = match.namedGroup('opcode')!;
-    final blockType = match.namedGroup('block_type');
+  TestCase({
+    required this.name,
+    required this.phasesFilter,
+    required this.library,
+  });
 
-    // Handle blocks which look like "B%d[%s]".
-    if (blockType != null) {
-      return blockTypes[blockType]!;
-    }
-
-    // Handle parallel moves specially.
-    if (op.startsWith('ParallelMove')) {
-      return 'ParallelMove';
-    }
-
-    // Handle branches.
-    if (op.startsWith(branchIfPrefix)) {
-      return 'Branch(${op.substring(branchIfPrefix.length)})';
-    }
-
-    // Normal instruction.
-    return op;
+  void run(Map<String, FlowGraph> graphs) {
+    print('matching IL (${phases.join(', ')}) for $name');
+    library.invoke(MirrorSystem.getSymbol('matchIL\$$name'),
+        phases.map((phase) => graphs[phase]!).toList());
+    print('... ok');
   }
 
-  @override
-  String toString() => 'Instruction($opcode)';
+  /// Parses phase filter components (same format as --compiler-passes flag).
+  static List<String> _expandPhasePattern(String pattern) {
+    bool printBefore = false, printAfter = false;
+    switch (pattern[0]) {
+      case '[':
+        printBefore = true;
+        break;
+      case ']':
+        printAfter = true;
+        break;
+      case '*':
+        printBefore = printAfter = true;
+        break;
+    }
 
-  static final instructionPattern = RegExp(
-      r'^\s*\d+:\s+(v\d+ <- )?(?<opcode>[^:[(]+(?<block_type>\[[\w ]+\])?)');
+    final phaseName =
+        (printBefore || printAfter) ? pattern.substring(1) : pattern;
 
-  static const blockTypes = {
-    '[join]': 'JoinEntry',
-    '[target]': 'TargetEntry',
-    '[graph]': 'GraphEntry',
-    '[function entry]': 'FunctionEntry'
-  };
+    if (!printBefore && !printAfter) {
+      printAfter = true;
+    }
 
-  static const branchIfPrefix = 'Branch if ';
+    return [
+      if (printBefore) 'Before $phaseName',
+      if (printAfter) 'After $phaseName',
+    ];
+  }
 }
 
-Map<String, List<Instruction>> _extractGraphs(String ilFile) {
-  final graphs = <String, List<Instruction>>{};
+/// Extracts test cases from the given file by looking for functions
+/// marked with @pragma('vm:testing:print-flow-graph', ...).
+Future<Set<TestCase>> _loadTestCases(String testFile) async {
+  final mirrorSystem = currentMirrorSystem();
+  final library =
+      await mirrorSystem.isolate.loadUri(File(testFile).absolute.uri);
 
-  final reader = LineReader(ilFile);
+  pragma? getPragma(DeclarationMirror decl, String name) => decl.metadata
+      .map((m) => m.reflectee)
+      .whereType<pragma>()
+      .firstWhereOrNull((p) => p.name == name);
 
-  var instructions = <Instruction>[];
-  while (reader.hasMore) {
-    if (reader.testNext('*** BEGIN CFG')) {
-      reader.next(); // Skip phase name.
-      final functionName = reader.next();
-      while (!reader.testNext('*** END CFG')) {
-        var curr = reader.next();
+  final cases = LinkedHashSet<TestCase>(
+    equals: (a, b) => a.name == b.name,
+    hashCode: (a) => a.name.hashCode,
+  );
 
-        // If instruction line ends with '{' search for a matching '}' (it will
-        // be on its own line).
-        if (curr.endsWith('{')) {
-          do {
-            curr += '\n' + reader.current;
-          } while (reader.next() != '}');
-        }
-
-        instructions.add(Instruction(curr));
-      }
-
-      graphs[functionName] = instructions;
-      instructions = <Instruction>[];
-    } else {
-      reader.next();
+  void processDeclaration(DeclarationMirror decl) {
+    final p = getPragma(decl, 'vm:testing:print-flow-graph');
+    if (p != null) {
+      final name = MirrorSystem.getName(decl.simpleName);
+      final added = cases.add(TestCase(
+        name: name,
+        phasesFilter: (p.options as String?) ?? 'AllocateRegisters',
+        library: library,
+      ));
+      if (!added) throw 'duplicate test case with name $name';
     }
   }
 
+  for (var decl in library.declarations.values) {
+    if (decl is ClassMirror) {
+      decl.declarations.values.forEach(processDeclaration);
+    } else {
+      processDeclaration(decl);
+    }
+  }
+
+  return cases;
+}
+
+Map<String, Map<String, FlowGraph>> _loadGraphs(String ilFile, Renamer rename) {
+  final graphs = <String, Map<String, FlowGraph>>{};
+
+  for (var graph in File(ilFile).readAsLinesSync()) {
+    final m = jsonDecode(graph) as Map<String, dynamic>;
+    graphs.putIfAbsent(m['f'], () => {})[m['p']] =
+        FlowGraph(m['b'], m['desc'], m['flags'], rename: rename);
+  }
+
   return graphs;
 }
 
-Map<String, List<String>> _extractExpectations(String testFile) {
-  final expectations = <String, List<String>>{};
-
-  final reader = LineReader(testFile);
-
-  final matchILPattern = RegExp(r'^// MatchIL\[AOT\]=(?<value>.*)$');
-  final matcherPattern = RegExp(r'^// __ (?<value>.*)$');
-
-  var matchers = <String>[];
-  while (reader.hasMore) {
-    var functionName = reader.matchNext(matchILPattern);
-    if (functionName != null) {
-      // Read comment block which follows `// MatchIL[AOT]=...`.
-      while (reader.hasMore && reader.current.startsWith('//')) {
-        final match = matcherPattern.firstMatch(reader.next());
-        if (match != null) {
-          matchers.add(match.namedGroup('value')!);
-        }
-      }
-      expectations[functionName] = matchers;
-      matchers = <String>[];
-    } else {
-      reader.next();
-    }
+Renamer _loadRenames(String? renamesFile) {
+  // Load renames map if present.
+  if (renamesFile == null) {
+    return (v) => v;
   }
 
-  return expectations;
-}
+  final list =
+      (jsonDecode(File(renamesFile).readAsStringSync()) as List).cast<String>();
 
-class LineReader {
-  final List<String> lines;
-  int lineno = 0;
+  final renamesMap = <String, String>{
+    for (var i = 0; i < list.length; i += 2) list[i]: list[i + 1],
+  };
 
-  LineReader(String path) : lines = File(path).readAsLinesSync();
-
-  String get current => lines[lineno];
-
-  bool get hasMore => lineno < lines.length;
-
-  String next() {
-    final curr = current;
-    lineno++;
-    return curr;
-  }
-
-  bool testNext(String expected) {
-    if (current == expected) {
-      next();
-      return true;
-    }
-    return false;
-  }
-
-  String? matchNext(RegExp pattern) {
-    final m = pattern.firstMatch(current);
-    return m?.namedGroup('value');
-  }
+  return (v) => renamesMap[v] ?? v;
 }
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 8854910..f18f0d2 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -333,9 +333,10 @@
     final generator = this.generator ??= IncrementalCompiler(options, script);
     errorsPlain.clear();
     errorsColorized.clear();
-    final component = await generator.compile(entryPoint: script);
+    final compilerResult = await generator.compile(entryPoint: script);
+    final component = compilerResult.component;
     return new CompilerResult(component, const {},
-        generator.getClassHierarchy(), generator.getCoreTypes());
+        compilerResult.classHierarchy, compilerResult.coreTypes);
   }
 
   void accept() => generator!.accept();
@@ -353,7 +354,8 @@
     // TODO(VM TEAM): This does not seem safe. What if cloning while having
     // pending deltas for instance?
     generator.resetDeltaState();
-    Component fullComponent = await generator.compile();
+    IncrementalCompilerResult compilerResult = await generator.compile();
+    Component fullComponent = compilerResult.component;
 
     // Assume fileSystem is HybridFileSystem because that is the setup where
     // clone should be used for.
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index 3ad1270..08b00e7 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -23,8 +23,8 @@
 
   // Component that reflect the state that was most recently accepted by the
   // client. Is [null], if no compilation results were accepted by the client.
-  Component? _lastKnownGood;
-  late List<Component> _pendingDeltas;
+  IncrementalCompilerResult? _lastKnownGood;
+  late List<IncrementalCompilerResult> _pendingDeltas;
   CompilerOptions _compilerOptions;
   bool initialized = false;
   bool fullComponent = false;
@@ -34,7 +34,7 @@
 
   Uri get entryPoint => _entryPoint;
   IncrementalKernelGenerator get generator => _generator;
-  Component? get lastKnownGoodComponent => _lastKnownGood;
+  IncrementalCompilerResult? get lastKnownGoodResult => _lastKnownGood;
 
   IncrementalCompiler(this._compilerOptions, this._entryPoint,
       {this.initializeFromDillUri, bool incrementalSerialization: true})
@@ -44,7 +44,7 @@
     }
     _generator = new IncrementalKernelGenerator(_compilerOptions, _entryPoint,
         initializeFromDillUri, false, incrementalSerializer);
-    _pendingDeltas = <Component>[];
+    _pendingDeltas = <IncrementalCompilerResult>[];
   }
 
   IncrementalCompiler.forExpressionCompilationOnly(
@@ -52,41 +52,46 @@
       : forExpressionCompilationOnly = true {
     _generator = new IncrementalKernelGenerator.forExpressionCompilationOnly(
         _compilerOptions, _entryPoint, component);
-    _pendingDeltas = <Component>[];
+    _pendingDeltas = <IncrementalCompilerResult>[];
   }
 
   /// Recompiles invalidated files, produces incremental component.
   ///
   /// If [entryPoint] is specified, that points to new entry point for the
   /// compilation. Otherwise, previously set entryPoint is used.
-  Future<Component> compile({Uri? entryPoint}) async {
+  Future<IncrementalCompilerResult> compile({Uri? entryPoint}) async {
     final task = new TimelineTask();
     try {
       task.start("IncrementalCompiler.compile");
       _entryPoint = entryPoint ?? _entryPoint;
       List<Uri>? entryPoints;
       if (entryPoint != null) entryPoints = [entryPoint];
-      Component component = await _generator.computeDelta(
+      IncrementalCompilerResult compilerResult = await _generator.computeDelta(
           entryPoints: entryPoints, fullComponent: fullComponent);
       initialized = true;
       fullComponent = false;
-      _pendingDeltas.add(component);
+      _pendingDeltas.add(compilerResult);
       return _combinePendingDeltas(false);
     } finally {
       task.finish();
     }
   }
 
-  _combinePendingDeltas(bool includePlatform) {
+  IncrementalCompilerResult _combinePendingDeltas(bool includePlatform) {
     Procedure? mainMethod;
     NonNullableByDefaultCompiledMode compilationMode =
         NonNullableByDefaultCompiledMode.Invalid;
     Map<Uri, Library> combined = <Uri, Library>{};
     Map<Uri, Source> uriToSource = new Map<Uri, Source>();
-    for (Component delta in _pendingDeltas) {
+    ClassHierarchy? classHierarchy;
+    CoreTypes? coreTypes;
+    for (IncrementalCompilerResult deltaResult in _pendingDeltas) {
+      Component delta = deltaResult.component;
       if (delta.mainMethod != null) {
         mainMethod = delta.mainMethod;
       }
+      classHierarchy ??= deltaResult.classHierarchy;
+      coreTypes ??= deltaResult.coreTypes;
       compilationMode = delta.mode;
       uriToSource.addAll(delta.uriToSource);
       for (Library library in delta.libraries) {
@@ -98,14 +103,14 @@
     }
 
     // TODO(vegorov) this needs to merge metadata repositories from deltas.
-    return new Component(
-        libraries: combined.values.toList(), uriToSource: uriToSource)
-      ..setMainMethodAndMode(mainMethod?.reference, true, compilationMode);
+    return new IncrementalCompilerResult(
+        new Component(
+            libraries: combined.values.toList(), uriToSource: uriToSource)
+          ..setMainMethodAndMode(mainMethod?.reference, true, compilationMode),
+        classHierarchy: classHierarchy,
+        coreTypes: coreTypes);
   }
 
-  CoreTypes? getCoreTypes() => _generator.getCoreTypes();
-  ClassHierarchy? getClassHierarchy() => _generator.getClassHierarchy();
-
   /// This lets incremental compiler know that results of last [compile] call
   /// were accepted, don't need to be included into subsequent [compile] calls
   /// results.
@@ -117,29 +122,33 @@
     Map<Uri, Library> combined = <Uri, Library>{};
     Map<Uri, Source> uriToSource = <Uri, Source>{};
 
-    Component? lastKnownGood = _lastKnownGood;
+    IncrementalCompilerResult? lastKnownGood = _lastKnownGood;
     if (lastKnownGood != null) {
       // TODO(aam): Figure out how to skip no-longer-used libraries from
       // [_lastKnownGood] libraries.
-      for (Library library in lastKnownGood.libraries) {
+      for (Library library in lastKnownGood.component.libraries) {
         combined[library.importUri] = library;
       }
-      uriToSource.addAll(lastKnownGood.uriToSource);
+      uriToSource.addAll(lastKnownGood.component.uriToSource);
     }
 
-    Component candidate = _combinePendingDeltas(true);
+    IncrementalCompilerResult result = _combinePendingDeltas(true);
+    Component candidate = result.component;
     for (Library library in candidate.libraries) {
       combined[library.importUri] = library;
     }
     uriToSource.addAll(candidate.uriToSource);
 
-    _lastKnownGood = lastKnownGood = new Component(
-      libraries: combined.values.toList(),
-      uriToSource: uriToSource,
-    )..setMainMethodAndMode(
-        candidate.mainMethod?.reference, true, candidate.mode);
+    _lastKnownGood = lastKnownGood = new IncrementalCompilerResult(
+        new Component(
+          libraries: combined.values.toList(),
+          uriToSource: uriToSource,
+        )..setMainMethodAndMode(
+            candidate.mainMethod?.reference, true, candidate.mode),
+        classHierarchy: result.classHierarchy,
+        coreTypes: result.coreTypes);
     for (final repo in candidate.metadata.values) {
-      lastKnownGood.addMetadataRepository(repo);
+      lastKnownGood.component.addMetadataRepository(repo);
     }
     _pendingDeltas.clear();
   }
@@ -164,10 +173,10 @@
     // sure it's "updated back".
     // Note that if accept was never called [_lastKnownGood] is null (and
     // loading from it below is basically nonsense, it will just start over).
-    _lastKnownGood?.relink();
+    _lastKnownGood?.component.relink();
 
     _generator = new IncrementalKernelGenerator.fromComponent(_compilerOptions,
-        _entryPoint, _lastKnownGood, false, incrementalSerializer);
+        _entryPoint, _lastKnownGood?.component, false, incrementalSerializer);
     await _generator.computeDelta(entryPoints: [_entryPoint]);
   }
 
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 51ed004..871ee7d 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -101,6 +101,9 @@
       help:
           'Enable global type flow analysis and related transformations in AOT mode.',
       defaultsTo: true);
+  args.addFlag('rta',
+      help: 'Use rapid type analysis for faster compilation in AOT mode.',
+      defaultsTo: true);
   args.addFlag('tree-shake-write-only-fields',
       help: 'Enable tree shaking of fields which are only written in AOT mode.',
       defaultsTo: true);
@@ -181,6 +184,7 @@
   final List<String>? fileSystemRoots = options['filesystem-root'];
   final bool aot = options['aot'];
   final bool tfa = options['tfa'];
+  final bool rta = options['rta'];
   final bool linkPlatform = options['link-platform'];
   final bool embedSources = options['embed-sources'];
   final bool enableAsserts = options['enable-asserts'];
@@ -269,6 +273,7 @@
       deleteToStringPackageUris: options['delete-tostring-package-uri'],
       aot: aot,
       useGlobalTypeFlowAnalysis: tfa,
+      useRapidTypeAnalysis: rta,
       environmentDefines: environmentDefines,
       enableAsserts: enableAsserts,
       useProtobufTreeShakerV2: useProtobufTreeShakerV2,
@@ -337,6 +342,7 @@
     List<String> deleteToStringPackageUris: const <String>[],
     bool aot: false,
     bool useGlobalTypeFlowAnalysis: false,
+    bool useRapidTypeAnalysis: true,
     required Map<String, String> environmentDefines,
     bool enableAsserts: true,
     bool useProtobufTreeShakerV2: false,
@@ -376,7 +382,8 @@
     await runGlobalTransformations(target, component, useGlobalTypeFlowAnalysis,
         enableAsserts, useProtobufTreeShakerV2, errorDetector,
         minimalKernel: minimalKernel,
-        treeShakeWriteOnlyFields: treeShakeWriteOnlyFields);
+        treeShakeWriteOnlyFields: treeShakeWriteOnlyFields,
+        useRapidTypeAnalysis: useRapidTypeAnalysis);
 
     if (minimalKernel) {
       // compiledSources is component.uriToSource.keys.
@@ -433,7 +440,8 @@
     bool useProtobufTreeShakerV2,
     ErrorDetector errorDetector,
     {bool minimalKernel: false,
-    bool treeShakeWriteOnlyFields: false}) async {
+    bool treeShakeWriteOnlyFields: false,
+    bool useRapidTypeAnalysis: true}) async {
   if (errorDetector.hasCompilationErrors) return;
 
   final coreTypes = new CoreTypes(component);
@@ -454,7 +462,8 @@
     globalTypeFlow.transformComponent(target, coreTypes, component,
         treeShakeSignatures: !minimalKernel,
         treeShakeWriteOnlyFields: treeShakeWriteOnlyFields,
-        treeShakeProtobufs: useProtobufTreeShakerV2);
+        treeShakeProtobufs: useProtobufTreeShakerV2,
+        useRapidTypeAnalysis: useRapidTypeAnalysis);
   } else {
     devirtualization.transformComponent(coreTypes, component);
     no_dynamic_invocations_annotator.transformComponent(component);
diff --git a/pkg/vm/lib/testing/il_matchers.dart b/pkg/vm/lib/testing/il_matchers.dart
new file mode 100644
index 0000000..1c2f883
--- /dev/null
+++ b/pkg/vm/lib/testing/il_matchers.dart
@@ -0,0 +1,462 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A library to facilitate programmatic matching against flow graphs
+/// collected during IL tests. See runtime/docs/infra/il_tests.md for more
+/// info.
+
+typedef Renamer = String Function(String);
+
+/// Flow graph parsed from --print-flow-graph-as-json output.
+class FlowGraph {
+  final List<dynamic> blocks;
+  final Map<String, InstructionDescriptor> descriptors;
+  final Map<String, dynamic> flags;
+  final Renamer rename;
+
+  FlowGraph(this.blocks, Map<String, dynamic> desc, this.flags,
+      {required this.rename})
+      : descriptors = {
+          for (var e in desc.entries)
+            e.key: InstructionDescriptor.fromJson(e.value)
+        };
+
+  bool get soundNullSafety => flags['nnbd'];
+
+  /// Match the sequence of blocks in this flow graph against the given
+  /// sequence of matchers: `expected[i]` is expected to match `blocks[i]`,
+  /// but there can be more blocks in the graph than matchers (the suffix is
+  /// ignored).
+  ///
+  /// If [env] is provided it will be used as matching environment, otherwise
+  /// a fresh instance of [Env] will be created and used.
+  ///
+  /// This function returns the populated matching environment.
+  Env match(List<Matcher> expected, {Env? env}) {
+    env ??= Env(rename: rename, descriptors: descriptors);
+
+    for (var i = 0; i < expected.length; i++) {
+      final result = expected[i].match(env, blocks[i]);
+      if (result.isFail) {
+        print('Failed to match: ${result.message}');
+        dump();
+        throw 'Failed to match';
+      }
+    }
+
+    return env;
+  }
+
+  void dump() {
+    for (var block in blocks) {
+      print('B${block['b']}[${block['o']}]');
+      for (var instr in [...?block['d'], ...?block['is']]) {
+        final v = instr['v'] ?? -1;
+        final prefix = v != -1 ? 'v$v <- ' : '';
+        final inputs = instr['i']?.map((v) => 'v$v').join(', ') ?? '';
+        final attrs = descriptors[instr['o']]
+            ?.attributeIndex
+            .entries
+            .map((e) => '${e.key}: ${instr['d'][e.value]}')
+            .join(',');
+        final attrsWrapped = attrs != null ? '[$attrs]' : '';
+        print('  ${prefix}${instr['o']}$attrsWrapped($inputs)');
+      }
+    }
+  }
+}
+
+class InstructionDescriptor {
+  final List<String> attributes;
+  final Map<String, int> attributeIndex;
+
+  InstructionDescriptor.fromJson(List<dynamic> attrs)
+      : this._(attrs.map((v) => _demangle(v)).toList());
+
+  InstructionDescriptor._(List<String> attrs)
+      : attributes = attrs.cast<String>(),
+        attributeIndex = {for (var i = 0; i < attrs.length; i++) attrs[i]: i};
+
+  static String _demangle(String v) {
+    final prefixLen = v.startsWith('&') ? 1 : 0;
+    final suffixLen = v.endsWith('()') ? 2 : 0;
+    return v.substring(prefixLen, v.length - suffixLen);
+  }
+}
+
+/// Matching environment.
+///
+/// This is fundamentally just a name to id mapping which allows to track
+/// correspondence between names given to some matchers and blocks/instructions
+/// which matched those matchers.
+///
+/// This object is also used to carry around auxiliary information which might
+/// be needed for matching, e.g. [Renamer].
+class Env {
+  final Map<String, InstructionDescriptor> descriptors;
+  final Renamer rename;
+  final Map<String, int> nameToId = {};
+
+  Env({required this.rename, required this.descriptors});
+
+  void bind(String name, Map<String, dynamic> instrOrBlock) {
+    final id = instrOrBlock['v'] ?? instrOrBlock['b'];
+
+    if (nameToId.containsKey(name) && nameToId[name] != id) {
+      throw 'Binding mismatch for $name: got ${nameToId[name]} and $id';
+    }
+
+    nameToId[name] = id;
+  }
+}
+
+abstract class Matcher {
+  /// Try matching this matcher against the given value. Returns
+  /// [MatchStatus.matched] if match succeeded and an instance of
+  /// [MatchStatus.fail] otherwise.
+  MatchStatus match(Env e, dynamic v);
+}
+
+class MatchStatus {
+  final String? message;
+
+  const MatchStatus._matched() : message = null;
+  const MatchStatus.fail(String message) : message = message;
+
+  bool get isMatch => message == null;
+  bool get isFail => message != null;
+
+  static const MatchStatus matched = MatchStatus._matched();
+
+  void expectMatched(String s) {
+    if (message != null) {
+      throw 'Failed to match: $message';
+    }
+  }
+}
+
+/// Matcher which always succeeds.
+class _AnyMatcher implements Matcher {
+  const _AnyMatcher();
+
+  @override
+  MatchStatus match(Env e, v) => MatchStatus.matched;
+
+  @override
+  String toString() {
+    return '*';
+  }
+}
+
+/// Matcher which updates matching environment when it succeeds.
+class _BoundMatcher implements Matcher {
+  final String name;
+  final Matcher nested;
+
+  _BoundMatcher(this.name, this.nested);
+
+  @override
+  MatchStatus match(Env e, dynamic v) {
+    final result = nested.match(e, v);
+    if (result.isMatch) {
+      e.bind(name, v);
+    }
+    return result;
+  }
+
+  @override
+  String toString() {
+    return '$name <- $nested';
+  }
+}
+
+/// Matcher which matches a specified value [v].
+class _EqualsMatcher implements Matcher {
+  final dynamic v;
+
+  _EqualsMatcher(this.v);
+
+  @override
+  MatchStatus match(Env e, v) {
+    if (this.v == v) {
+      return MatchStatus.matched;
+    }
+
+    // Some instructions refer to obfuscated names, try to rename
+    // the expectation and try again.
+    if (this.v is String && v is String && e.rename(this.v) == v) {
+      return MatchStatus.matched;
+    }
+
+    return this.v == v
+        ? MatchStatus.matched
+        : MatchStatus.fail('expected ${this.v} got $v');
+  }
+
+  @override
+  String toString() => '$v';
+}
+
+/// Matcher which matches the value which is equivalent to the binding
+/// with the given [name] in the matching environment.
+///
+/// If this matcher is [binding] then it will populate the binding in the
+/// matching environment if the [name] is not bound yet on the first call
+/// to [match]. Otherwise if the [name] is not bound when [match] is called
+/// an exception will be thrown.
+///
+/// Binding matchers are used when we might see the use of a value before its
+/// definition (e.g. we usually use the name of the block in the `Goto` or
+/// `Branch` before we see the block itself).
+class _RefMatcher implements Matcher {
+  final String name;
+  final bool binding;
+
+  _RefMatcher(this.name, {this.binding = false});
+
+  @override
+  MatchStatus match(Env e, v) {
+    if (e.nameToId.containsKey(name)) {
+      return e.nameToId[name] == v
+          ? MatchStatus.matched
+          : MatchStatus.fail(
+              'expected $name to bind to ${e.nameToId[name]} but got $v');
+    }
+
+    if (!binding) {
+      throw UnimplementedError('Unbound reference to ${name}');
+    }
+
+    e.nameToId[name] = v;
+    return MatchStatus.matched;
+  }
+
+  @override
+  String toString() {
+    return name;
+  }
+}
+
+/// A wrapper which matches a list of matchers against a list of values.
+class _ListMatcher implements Matcher {
+  final List<Matcher> expected;
+
+  _ListMatcher(this.expected);
+
+  @override
+  MatchStatus match(Env e, dynamic got) {
+    if (got is! List) {
+      return MatchStatus.fail('expected List, got ${got.runtimeType}');
+    }
+
+    if (expected.length > got.length) {
+      return MatchStatus.fail(
+          'expected at least ${expected.length} elements got ${got.length}');
+    }
+
+    for (var i = 0; i < expected.length; i++) {
+      final result = expected[i].match(e, got[i]);
+      if (result.isFail) {
+        return MatchStatus.fail(
+            'mismatch at index ${i}, expected ${expected[i]} '
+            'got ${got[i]}: ${result.message}');
+      }
+    }
+
+    if (expected.last is _AnyMatcher || expected.length == got.length) {
+      return MatchStatus.matched;
+    }
+
+    return MatchStatus.fail(
+        'expected exactly ${expected.length} elements got ${got.length}');
+  }
+
+  @override
+  String toString() => '[${expected.join(',')}]';
+}
+
+/// A matcher which matches a block of the specified [kind] and contents.
+///
+/// Contents are specified as a sequence of matchers ([body]). For each of
+/// those matchers a matching block is expected to contain at least one
+/// instruction that matches it. Matching is done in order: first we scan
+/// the block until we find the match for the first matcher in body, then
+/// we continue scanning until we find the match for the second and so on.
+class _BlockMatcher implements Matcher {
+  final String kind;
+  final List<Matcher> body;
+
+  _BlockMatcher(this.kind, [this.body = const []]);
+
+  @override
+  MatchStatus match(Env e, covariant Map<String, dynamic> block) {
+    if (block['o'] != '${kind}Entry') {
+      return MatchStatus.fail(
+          'Expected block of kind ${kind} got ${block['o']} '
+          'when matching B${block['b']}');
+    }
+
+    final gotBody = [...?block['d'], ...?block['is']];
+
+    var matcherIndex = 0;
+    for (int i = 0; i < gotBody.length && matcherIndex < body.length; i++) {
+      if (body[matcherIndex].match(e, gotBody[i]).isMatch) {
+        matcherIndex++;
+      }
+    }
+    if (matcherIndex != body.length) {
+      return MatchStatus.fail('Unmatched instruction: ${body[matcherIndex]} '
+          'in block B${block['b']}');
+    }
+    return MatchStatus.matched;
+  }
+}
+
+/// A matcher for instruction's named attributes.
+///
+/// Attributes are resolved to their indices through [Env.descriptors].
+class _AttributesMatcher implements Matcher {
+  final String op;
+  final Map<String, Matcher> matchers;
+
+  _ListMatcher? impl;
+
+  _AttributesMatcher(this.op, this.matchers);
+
+  @override
+  MatchStatus match(Env e, dynamic v) {
+    impl ??= _ListMatcher(e.descriptors[op]!.attributes
+        .map((name) => matchers[name] ?? const _AnyMatcher())
+        .toList());
+    return impl!.match(e, v);
+  }
+
+  @override
+  String toString() {
+    return matchers.toString();
+  }
+}
+
+/// Matcher which matches an instruction with opcode [op] and properties
+/// specified in [matchers] map.
+class InstructionMatcher implements Matcher {
+  final String op;
+  final Map<String, Matcher> matchers;
+
+  InstructionMatcher(
+      {required String op, List<Matcher>? data, List<Matcher>? inputs})
+      : this._(op: op, matchers: {
+          if (data != null) 'd': _ListMatcher(data),
+          if (inputs != null) 'i': _ListMatcher(inputs),
+        });
+
+  InstructionMatcher._({
+    required this.op,
+    required this.matchers,
+  });
+
+  @override
+  MatchStatus match(Env e, covariant Map<String, dynamic> instr) {
+    if (instr['o'] != op) {
+      return MatchStatus.fail('expected instruction ${op} got ${instr['o']}');
+    }
+
+    for (var entry in matchers.entries) {
+      final result = entry.value.match(e, instr[entry.key]);
+      if (result.isFail) {
+        return result;
+      }
+    }
+
+    return MatchStatus.matched;
+  }
+
+  @override
+  String toString() {
+    return '$op($matchers)';
+  }
+}
+
+/// This class uses `noSuchMethod` to allow writing code like
+///
+/// ```
+/// match.Op(in0, ..., inN, attr0: a0, ..., attrK: aK)
+/// ```
+///
+/// This will produce an instruction matcher which matches opcode `Op` and
+/// expects `in0, ..., inN` to match instructions inputs, while `a0, ...`
+/// matchers are expected to match attributes with names `attr0, ...`.
+class Matchers {
+  _BlockMatcher block(String kind, [List<dynamic> body = const []]) {
+    return _BlockMatcher(kind, List<Matcher>.from(body));
+  }
+
+  final _AnyMatcher any = const _AnyMatcher();
+
+  InstructionMatcher Goto(String dest) =>
+      InstructionMatcher._(op: 'Goto', matchers: {
+        's': _ListMatcher([_blockRef(dest)])
+      });
+
+  InstructionMatcher Branch(InstructionMatcher compare,
+          {String? ifTrue, String? ifFalse}) =>
+      InstructionMatcher._(op: 'Branch', matchers: {
+        'cc': compare,
+        's': _ListMatcher([
+          ifTrue != null ? _blockRef(ifTrue) : any,
+          ifFalse != null ? _blockRef(ifFalse) : any,
+        ]),
+      });
+
+  @override
+  Object? noSuchMethod(Invocation invocation) {
+    final data = {
+      for (var e in invocation.namedArguments.entries)
+        getName(e.key): Matchers._toAttributeMatcher(e.value),
+    };
+    final inputs =
+        invocation.positionalArguments.map(Matchers._toInputMatcher).toList();
+    final op = getName(invocation.memberName);
+    return InstructionMatcher._(op: op, matchers: {
+      if (data.isNotEmpty) 'd': _AttributesMatcher(op, data),
+      if (inputs.isNotEmpty) 'i': _ListMatcher(inputs),
+    });
+  }
+
+  static Matcher _blockRef(String name) => _RefMatcher(name, binding: true);
+
+  static Matcher _toAttributeMatcher(dynamic v) {
+    if (v is Matcher) {
+      return v;
+    } else {
+      return _EqualsMatcher(v);
+    }
+  }
+
+  static Matcher _toInputMatcher(dynamic v) {
+    if (v is Matcher) {
+      return v;
+    } else if (v is String) {
+      return _RefMatcher(v);
+    } else {
+      throw ArgumentError.value(
+          v, 'v', 'Expected either a Matcher or a String (binding name)');
+    }
+  }
+}
+
+/// Extension which enables `'name' << matcher` syntax for creating bound
+/// matchers.
+extension BindingExtension on String {
+  Matcher operator <<(Matcher matcher) {
+    return _BoundMatcher(this, matcher);
+  }
+}
+
+final dynamic match = Matchers();
+
+/// This file should not depend on dart:mirrors because it is imported into
+/// tests, which are compiled in AOT mode. So instead we let compare_il driver
+/// set this field.
+late String Function(Symbol) getName;
diff --git a/pkg/vm/lib/transformations/ffi/abi.dart b/pkg/vm/lib/transformations/ffi/abi.dart
new file mode 100644
index 0000000..04bc8e2
--- /dev/null
+++ b/pkg/vm/lib/transformations/ffi/abi.dart
@@ -0,0 +1,278 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'common.dart';
+
+// TODO(http://dartbug.com/47823): Remove this copy of `Abi`.
+
+/// The hardware architectures the Dart VM runs on.
+enum _Architecture {
+  arm,
+  arm64,
+  ia32,
+  x64,
+}
+
+extension on _Architecture {
+  /// The size of integer registers and memory addresses in bytes.
+  int get wordSize {
+    switch (this) {
+      case _Architecture.arm:
+      case _Architecture.ia32:
+        return 4;
+      case _Architecture.arm64:
+      case _Architecture.x64:
+        return 8;
+    }
+  }
+}
+
+/// The operating systems the Dart VM runs on.
+enum _OS {
+  android,
+  fuchsia,
+  ios,
+  linux,
+  macos,
+  windows,
+}
+
+/// An application binary interface (ABI).
+///
+/// An ABI defines the memory layout of data
+/// and the function call protocol for native code.
+/// It is usually defined by the an operating system for each
+/// architecture that operating system runs on.
+///
+/// The Dart VM can run on a variety of operating systems and architectures.
+/// Supported ABIs are represented by `Abi` objects.
+/// See [values] for all the supported ABIs.
+class Abi {
+  /// The application binary interface for Android on the Arm architecture.
+  static const androidArm = _androidArm;
+
+  /// The application binary interface for Android on the Arm64 architecture.
+  static const androidArm64 = _androidArm64;
+
+  /// The application binary interface for Android on the IA32 architecture.
+  static const androidIA32 = _androidIA32;
+
+  /// The application binary interface for android on the X64 architecture.
+  static const androidX64 = _androidX64;
+
+  /// The application binary interface for Fuchsia on the Arm64 architecture.
+  static const fuchsiaArm64 = _fuchsiaArm64;
+
+  /// The application binary interface for Fuchsia on the X64 architecture.
+  static const fuchsiaX64 = _fuchsiaX64;
+
+  /// The application binary interface for iOS on the Arm architecture.
+  static const iosArm = _iosArm;
+
+  /// The application binary interface for iOS on the Arm64 architecture.
+  static const iosArm64 = _iosArm64;
+
+  /// The application binary interface for iOS on the X64 architecture.
+  static const iosX64 = _iosX64;
+
+  /// The application binary interface for Linux on the Arm architecture.
+  ///
+  /// Does not distinguish between hard and soft fp. Currently, no uses of Abi
+  /// require this distinction.
+  static const linuxArm = _linuxArm;
+
+  /// The application binary interface for linux on the Arm64 architecture.
+  static const linuxArm64 = _linuxArm64;
+
+  /// The application binary interface for linux on the IA32 architecture.
+  static const linuxIA32 = _linuxIA32;
+
+  /// The application binary interface for linux on the X64 architecture.
+  static const linuxX64 = _linuxX64;
+
+  /// The application binary interface for MacOS on the Arm64 architecture.
+  static const macosArm64 = _macosArm64;
+
+  /// The application binary interface for MacOS on the X64 architecture.
+  static const macosX64 = _macosX64;
+
+  /// The application binary interface for Windows on the Arm64 architecture.
+  static const windowsArm64 = _windowsArm64;
+
+  /// The application binary interface for Windows on the IA32 architecture.
+  static const windowsIA32 = _windowsIA32;
+
+  /// The application binary interface for Windows on the X64 architecture.
+  static const windowsX64 = _windowsX64;
+
+  /// The ABIs that the DartVM can run on, sorted alphabetically.
+  ///
+  /// Does not contain macosIA32, we stopped supporting it.
+  /// https://github.com/dart-lang/sdk/issues/39810
+  ///
+  /// Includes [windowsArm64], even though it is currently not supported.
+  /// Support has been requested for Flutter.
+  /// https://github.com/flutter/flutter/issues/53120
+  static const values = [
+    androidArm,
+    androidArm64,
+    androidIA32,
+    androidX64,
+    fuchsiaArm64,
+    fuchsiaX64,
+    iosArm,
+    iosArm64,
+    iosX64,
+    linuxArm,
+    linuxArm64,
+    linuxIA32,
+    linuxX64,
+    macosArm64,
+    macosX64,
+    windowsArm64,
+    windowsIA32,
+    windowsX64,
+  ];
+
+  /// The ABI the Dart VM is currently running on.
+  external factory Abi.current();
+
+  /// A string representation of this ABI.
+  ///
+  /// The string is equal to the 'on' part from `Platform.version` and
+  /// `dart --version`.
+  @override
+  String toString() => '${_os.name}_${_architecture.name}';
+
+  /// The size of both integer registers and memory addresses in bytes.
+  int get wordSize => _architecture.wordSize;
+
+  /// The operating system of this [Abi].
+  final _OS _os;
+
+  /// The architecture of this [Abi].
+  final _Architecture _architecture;
+
+  /// The constructor is private so that we can use [Abi.values] as opaque
+  /// tokens.
+  const Abi._(this._architecture, this._os);
+
+  static const _androidArm = Abi._(_Architecture.arm, _OS.android);
+  static const _androidArm64 = Abi._(_Architecture.arm64, _OS.android);
+  static const _androidIA32 = Abi._(_Architecture.ia32, _OS.android);
+  static const _androidX64 = Abi._(_Architecture.x64, _OS.android);
+  static const _fuchsiaArm64 = Abi._(_Architecture.arm64, _OS.fuchsia);
+  static const _fuchsiaX64 = Abi._(_Architecture.x64, _OS.fuchsia);
+  static const _iosArm = Abi._(_Architecture.arm, _OS.ios);
+  static const _iosArm64 = Abi._(_Architecture.arm64, _OS.ios);
+  static const _iosX64 = Abi._(_Architecture.x64, _OS.ios);
+  static const _linuxArm = Abi._(_Architecture.arm, _OS.linux);
+  static const _linuxArm64 = Abi._(_Architecture.arm64, _OS.linux);
+  static const _linuxIA32 = Abi._(_Architecture.ia32, _OS.linux);
+  static const _linuxX64 = Abi._(_Architecture.x64, _OS.linux);
+  static const _macosArm64 = Abi._(_Architecture.arm64, _OS.macos);
+  static const _macosX64 = Abi._(_Architecture.x64, _OS.macos);
+  static const _windowsArm64 = Abi._(_Architecture.arm64, _OS.windows);
+  static const _windowsIA32 = Abi._(_Architecture.ia32, _OS.windows);
+  static const _windowsX64 = Abi._(_Architecture.x64, _OS.windows);
+}
+
+// Keep consistent with sdk/lib/ffi/abi.dart.
+const Map<Abi, String> abiNames = {
+  Abi.androidArm: 'androidArm',
+  Abi.androidArm64: 'androidArm64',
+  Abi.androidIA32: 'androidIA32',
+  Abi.androidX64: 'androidX64',
+  Abi.fuchsiaArm64: 'fuchsiaArm64',
+  Abi.fuchsiaX64: 'fuchsiaX64',
+  Abi.iosArm: 'iosArm',
+  Abi.iosArm64: 'iosArm64',
+  Abi.iosX64: 'iosX64',
+  Abi.linuxArm: 'linuxArm',
+  Abi.linuxArm64: 'linuxArm64',
+  Abi.linuxIA32: 'linuxIA32',
+  Abi.linuxX64: 'linuxX64',
+  Abi.macosArm64: 'macosArm64',
+  Abi.macosX64: 'macosX64',
+  Abi.windowsArm64: 'windowsArm64',
+  Abi.windowsIA32: 'windowsIA32',
+  Abi.windowsX64: 'windowsX64',
+};
+
+/// The size of integer registers and memory addresses in bytes per [Abi].
+// Keep consistent with sdk/lib/_internal/vm/lib/ffi_patch.dart
+final Map<Abi, int> wordSize =
+    Map.unmodifiable({for (final abi in Abi.values) abi: abi.wordSize});
+
+/// Alignment for types that are not aligned to a multiple of their size.
+///
+/// When a type occurs in a struct or union, it's usually aligned
+/// to a multiple of its own size.
+/// Some ABIs have types which are not aligned to their own size,
+/// but to a smaller size.
+///
+/// This map maps each [Abi] to a mapping from types that are not
+/// aligned by their size, to their actual alignment.
+/// If such a map is empty, which many are,
+/// it means that all types are aligned to their own size in that ABI.
+///
+/// See runtime/vm/compiler/ffi/abi.cc for asserts in the VM that verify these
+/// alignments.
+const Map<Abi, Map<NativeType, int>> nonSizeAlignment = {
+  // _wordSize64
+  Abi.androidArm64: _wordSize64,
+  Abi.androidX64: _wordSize64,
+  Abi.fuchsiaArm64: _wordSize64,
+  Abi.fuchsiaX64: _wordSize64,
+  Abi.iosArm64: _wordSize64,
+  Abi.iosX64: _wordSize64,
+  Abi.linuxArm64: _wordSize64,
+  Abi.linuxX64: _wordSize64,
+  Abi.macosArm64: _wordSize64,
+  Abi.macosX64: _wordSize64,
+  Abi.windowsArm64: _wordSize64,
+  Abi.windowsX64: _wordSize64,
+  // _wordSize32Align32
+  Abi.androidIA32: _wordSize32Align32,
+  Abi.iosArm: _wordSize32Align32,
+  Abi.linuxIA32: _wordSize32Align32,
+  // _wordSize32Align64
+  Abi.androidArm: _wordSize32Align64,
+  Abi.linuxArm: _wordSize32Align64,
+  Abi.windowsIA32: _wordSize32Align64,
+};
+
+// All 64 bit ABIs align struct fields to their size.
+const Map<NativeType, int> _wordSize64 = {};
+
+// x86 System V ABI:
+// > uint64_t | size 8 | alignment 4
+// > double   | size 8 | alignment 4
+// https://github.com/hjl-tools/x86-psABI/wiki/intel386-psABI-1.1.pdf page 8.
+//
+// ios 32 bit alignment:
+// https://developer.apple.com/documentation/uikit/app_and_environment/updating_your_app_from_32-bit_to_64-bit_architecture/updating_data_structures
+const Map<NativeType, int> _wordSize32Align32 = {
+  NativeType.kDouble: 4,
+  NativeType.kInt64: 4,
+  NativeType.kUint64: 4
+};
+
+// The default for MSVC x86:
+// > The alignment-requirement for all data except structures, unions, and
+// > arrays is either the size of the object or the current packing size
+// > (specified with either /Zp or the pack pragma, whichever is less).
+// https://docs.microsoft.com/en-us/cpp/c-language/padding-and-alignment-of-structure-members?view=vs-2019
+//
+// GCC _can_ compile on Linux to this alignment with -malign-double, but does
+// not do so by default:
+// > Warning: if you use the -malign-double switch, structures containing the
+// > above types are aligned differently than the published application
+// > binary interface specifications for the x86-32 and are not binary
+// > compatible with structures in code compiled without that switch.
+// https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
+//
+// Arm always requires 8 byte alignment for 8 byte values:
+// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf 4.1 Fundamental Data Types
+const Map<NativeType, int> _wordSize32Align64 = {};
diff --git a/pkg/vm/lib/transformations/ffi/common.dart b/pkg/vm/lib/transformations/ffi/common.dart
index dc51195..b50d0a2 100644
--- a/pkg/vm/lib/transformations/ffi/common.dart
+++ b/pkg/vm/lib/transformations/ffi/common.dart
@@ -17,6 +17,9 @@
 import 'package:kernel/type_environment.dart'
     show TypeEnvironment, SubtypeCheckMode;
 
+import 'abi.dart';
+import 'native_type_cfe.dart';
+
 /// Represents the (instantiated) ffi.NativeType.
 enum NativeType {
   kNativeType,
@@ -42,7 +45,7 @@
   kBool,
 }
 
-const Set<NativeType> nativeIntTypes = <NativeType>{
+const Set<NativeType> nativeIntTypesFixedSize = <NativeType>{
   NativeType.kInt8,
   NativeType.kInt16,
   NativeType.kInt32,
@@ -51,6 +54,10 @@
   NativeType.kUint16,
   NativeType.kUint32,
   NativeType.kUint64,
+};
+
+const Set<NativeType> nativeIntTypes = <NativeType>{
+  ...nativeIntTypesFixedSize,
   NativeType.kIntptr,
 };
 
@@ -107,78 +114,6 @@
   NativeType.kBool: 1,
 };
 
-/// The struct layout in various ABIs.
-///
-/// ABIs differ per architectures and with different compilers.
-/// We pick the default struct layout based on the architecture and OS.
-///
-/// Compilers _can_ deviate from the default layout, but this prevents
-/// executables from making system calls. So this seems rather uncommon.
-///
-/// In the future, we might support custom struct layouts. For more info see
-/// https://github.com/dart-lang/sdk/issues/35768.
-enum Abi {
-  /// Layout in all 64bit ABIs (x64 and arm64).
-  wordSize64,
-
-  /// Layout in System V ABI for x386 (ia32 on Linux) and in iOS Arm 32 bit.
-  wordSize32Align32,
-
-  /// Layout in both the Arm 32 bit ABI and the Windows ia32 ABI.
-  wordSize32Align64,
-}
-
-/// WORD_SIZE in bytes.
-const wordSize = <Abi, int>{
-  Abi.wordSize64: 8,
-  Abi.wordSize32Align32: 4,
-  Abi.wordSize32Align64: 4,
-};
-
-/// Elements that are not aligned to their size.
-///
-/// Has an entry for all Abis. Empty entries document that every native
-/// type is aligned to it's own size in this ABI.
-///
-/// See runtime/vm/ffi/abi.cc for asserts in the VM that verify these
-/// alignments.
-///
-/// TODO(37470): Add uncommon primitive data types when we want to support them.
-const nonSizeAlignment = <Abi, Map<NativeType, int>>{
-  Abi.wordSize64: {},
-
-  // x86 System V ABI:
-  // > uint64_t | size 8 | alignment 4
-  // > double   | size 8 | alignment 4
-  // https://github.com/hjl-tools/x86-psABI/wiki/intel386-psABI-1.1.pdf page 8.
-  //
-  // iOS 32 bit alignment:
-  // https://developer.apple.com/documentation/uikit/app_and_environment/updating_your_app_from_32-bit_to_64-bit_architecture/updating_data_structures
-  Abi.wordSize32Align32: {
-    NativeType.kDouble: 4,
-    NativeType.kInt64: 4,
-    NativeType.kUint64: 4
-  },
-
-  // The default for MSVC x86:
-  // > The alignment-requirement for all data except structures, unions, and
-  // > arrays is either the size of the object or the current packing size
-  // > (specified with either /Zp or the pack pragma, whichever is less).
-  // https://docs.microsoft.com/en-us/cpp/c-language/padding-and-alignment-of-structure-members?view=vs-2019
-  //
-  // GCC _can_ compile on Linux to this alignment with -malign-double, but does
-  // not do so by default:
-  // > Warning: if you use the -malign-double switch, structures containing the
-  // > above types are aligned differently than the published application
-  // > binary interface specifications for the x86-32 and are not binary
-  // > compatible with structures in code compiled without that switch.
-  // https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
-  //
-  // Arm always requires 8 byte alignment for 8 byte values:
-  // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf 4.1 Fundamental Data Types
-  Abi.wordSize32Align64: {},
-};
-
 /// Load, store, and elementAt are rewired to their static type for these types.
 const List<NativeType> optimizedTypes = [
   NativeType.kBool,
@@ -248,11 +183,15 @@
   final Class compoundClass;
   final Class structClass;
   final Class unionClass;
+  final Class abiSpecificIntegerClass;
+  final Class abiSpecificIntegerMappingClass;
   final Class ffiNativeClass;
   final Class nativeFieldWrapperClass1Class;
   final Class ffiStructLayoutClass;
   final Field ffiStructLayoutTypesField;
   final Field ffiStructLayoutPackingField;
+  final Class ffiAbiSpecificMappingClass;
+  final Field ffiAbiSpecificMappingNativeTypesField;
   final Class ffiInlineArrayClass;
   final Field ffiInlineArrayElementTypeField;
   final Field ffiInlineArrayLengthField;
@@ -272,6 +211,12 @@
   final Procedure unionArrayElemAt;
   final Procedure arrayArrayElemAt;
   final Procedure arrayArrayAssignAt;
+  final Procedure abiSpecificIntegerPointerGetValue;
+  final Procedure abiSpecificIntegerPointerSetValue;
+  final Procedure abiSpecificIntegerPointerElemAt;
+  final Procedure abiSpecificIntegerPointerSetElemAt;
+  final Procedure abiSpecificIntegerArrayElemAt;
+  final Procedure abiSpecificIntegerArraySetElemAt;
   final Procedure asFunctionMethod;
   final Procedure asFunctionInternal;
   final Procedure sizeOfMethod;
@@ -298,12 +243,19 @@
   final Map<NativeType, Procedure> storeMethods;
   final Map<NativeType, Procedure> storeUnalignedMethods;
   final Map<NativeType, Procedure> elementAtMethods;
+  final Procedure loadAbiSpecificIntMethod;
+  final Procedure loadAbiSpecificIntAtIndexMethod;
+  final Procedure storeAbiSpecificIntMethod;
+  final Procedure storeAbiSpecificIntAtIndexMethod;
+  final Procedure abiCurrentMethod;
+  final Map<Constant, Abi> constantAbis;
   final Procedure memCopy;
   final Procedure allocationTearoff;
   final Procedure asFunctionTearoff;
   final Procedure lookupFunctionTearoff;
   final Procedure getNativeFieldFunction;
   final Procedure reachabilityFenceFunction;
+  final Procedure checkAbiSpecificIntegerMappingFunction;
 
   late final InterfaceType nativeFieldWrapperClass1Type;
   late final InterfaceType voidType;
@@ -370,6 +322,10 @@
         compoundClass = index.getClass('dart:ffi', '_Compound'),
         structClass = index.getClass('dart:ffi', 'Struct'),
         unionClass = index.getClass('dart:ffi', 'Union'),
+        abiSpecificIntegerClass =
+            index.getClass('dart:ffi', 'AbiSpecificInteger'),
+        abiSpecificIntegerMappingClass =
+            index.getClass('dart:ffi', 'AbiSpecificIntegerMapping'),
         ffiNativeClass = index.getClass('dart:ffi', 'FfiNative'),
         nativeFieldWrapperClass1Class =
             index.getClass('dart:nativewrappers', 'NativeFieldWrapperClass1'),
@@ -378,6 +334,10 @@
             index.getField('dart:ffi', '_FfiStructLayout', 'fieldTypes'),
         ffiStructLayoutPackingField =
             index.getField('dart:ffi', '_FfiStructLayout', 'packing'),
+        ffiAbiSpecificMappingClass =
+            index.getClass('dart:ffi', '_FfiAbiSpecificMapping'),
+        ffiAbiSpecificMappingNativeTypesField =
+            index.getField('dart:ffi', '_FfiAbiSpecificMapping', 'nativeTypes'),
         ffiInlineArrayClass = index.getClass('dart:ffi', '_FfiInlineArray'),
         ffiInlineArrayElementTypeField =
             index.getField('dart:ffi', '_FfiInlineArray', 'elementType'),
@@ -431,6 +391,18 @@
         arrayArrayElemAt = index.getProcedure('dart:ffi', 'ArrayArray', '[]'),
         arrayArrayAssignAt =
             index.getProcedure('dart:ffi', 'ArrayArray', '[]='),
+        abiSpecificIntegerPointerGetValue = index.getProcedure(
+            'dart:ffi', 'AbiSpecificIntegerPointer', 'get:value'),
+        abiSpecificIntegerPointerSetValue = index.getProcedure(
+            'dart:ffi', 'AbiSpecificIntegerPointer', 'set:value'),
+        abiSpecificIntegerPointerElemAt =
+            index.getProcedure('dart:ffi', 'AbiSpecificIntegerPointer', '[]'),
+        abiSpecificIntegerPointerSetElemAt =
+            index.getProcedure('dart:ffi', 'AbiSpecificIntegerPointer', '[]='),
+        abiSpecificIntegerArrayElemAt =
+            index.getProcedure('dart:ffi', 'AbiSpecificIntegerArray', '[]'),
+        abiSpecificIntegerArraySetElemAt =
+            index.getProcedure('dart:ffi', 'AbiSpecificIntegerArray', '[]='),
         asFunctionMethod = index.getProcedure(
             'dart:ffi', 'NativeFunctionPointer', 'asFunction'),
         asFunctionInternal =
@@ -475,6 +447,20 @@
           final name = nativeTypeClassNames[t];
           return index.getTopLevelProcedure('dart:ffi', "_elementAt$name");
         }),
+        loadAbiSpecificIntMethod =
+            index.getTopLevelProcedure('dart:ffi', "_loadAbiSpecificInt"),
+        loadAbiSpecificIntAtIndexMethod = index.getTopLevelProcedure(
+            'dart:ffi', "_loadAbiSpecificIntAtIndex"),
+        storeAbiSpecificIntMethod =
+            index.getTopLevelProcedure('dart:ffi', "_storeAbiSpecificInt"),
+        storeAbiSpecificIntAtIndexMethod = index.getTopLevelProcedure(
+            'dart:ffi', "_storeAbiSpecificIntAtIndex"),
+        abiCurrentMethod = index.getProcedure('dart:ffi', 'Abi', 'current'),
+        constantAbis = abiNames.map((abi, name) => MapEntry(
+            (index.getField('dart:ffi', 'Abi', name).initializer
+                    as ConstantExpression)
+                .constant,
+            abi)),
         memCopy = index.getTopLevelProcedure('dart:ffi', '_memCopy'),
         allocationTearoff = index.getProcedure(
             'dart:ffi', 'AllocatorAlloc', LibraryIndex.tearoffPrefix + 'call'),
@@ -487,7 +473,9 @@
         getNativeFieldFunction = index.getTopLevelProcedure(
             'dart:nativewrappers', '_getNativeField'),
         reachabilityFenceFunction =
-            index.getTopLevelProcedure('dart:_internal', 'reachabilityFence') {
+            index.getTopLevelProcedure('dart:_internal', 'reachabilityFence'),
+        checkAbiSpecificIntegerMappingFunction = index.getTopLevelProcedure(
+            'dart:ffi', "_checkAbiSpecificIntegerMapping") {
     nativeFieldWrapperClass1Type = nativeFieldWrapperClass1Class.getThisType(
         coreTypes, Nullability.nonNullable);
     voidType = nativeTypesClasses[NativeType.kVoid]!
@@ -518,12 +506,13 @@
   /// [Uint32]                             -> [int]
   /// [Uint64]                             -> [int]
   /// [IntPtr]                             -> [int]
+  /// T extends [AbiSpecificInteger]       -> [int]
   /// [Double]                             -> [double]
   /// [Float]                              -> [double]
   /// [Bool]                               -> [bool]
   /// [Void]                               -> [void]
   /// [Pointer]<T>                         -> [Pointer]<T>
-  /// T extends [Pointer]                  -> T
+  /// T extends [Compound]                 -> T
   /// [Handle]                             -> [Object]
   /// [NativeFunction]<T1 Function(T2, T3) -> S1 Function(S2, S3)
   ///    where DartRepresentationOf(Tn) -> Sn
@@ -544,6 +533,9 @@
       }
       return nativeType;
     }
+    if (hierarchy.isSubclassOf(nativeClass, abiSpecificIntegerClass)) {
+      return InterfaceType(intClass, Nullability.legacy);
+    }
     if (hierarchy.isSubclassOf(nativeClass, compoundClass)) {
       if (nativeClass == structClass || nativeClass == unionClass) {
         return null;
@@ -605,29 +597,42 @@
   InterfaceType _listOfIntType() => InterfaceType(
       listClass, Nullability.legacy, [coreTypes.intLegacyRawType]);
 
-  ConstantExpression intListConstantExpression(List<int> values) =>
+  ConstantExpression intListConstantExpression(List<int?> values) =>
       ConstantExpression(
-          ListConstant(coreTypes.intLegacyRawType,
-              [for (var v in values) IntConstant(v)]),
+          ListConstant(coreTypes.intLegacyRawType, [
+            for (var v in values)
+              if (v != null) IntConstant(v) else NullConstant()
+          ]),
           _listOfIntType());
 
   /// Expression that queries VM internals at runtime to figure out on which ABI
   /// we are.
-  Expression runtimeBranchOnLayout(Map<Abi, int> values) {
-    return InstanceInvocation(
+  Expression runtimeBranchOnLayout(Map<Abi, int?> values) {
+    final result = InstanceInvocation(
         InstanceAccessKind.Instance,
         intListConstantExpression([
-          values[Abi.wordSize64]!,
-          values[Abi.wordSize32Align32]!,
-          values[Abi.wordSize32Align64]!
+          for (final abi in Abi.values) values[abi],
         ]),
         listElementAt.name,
         Arguments([StaticInvocation(abiMethod, Arguments([]))]),
         interfaceTarget: listElementAt,
         functionType: Substitution.fromInterfaceType(_listOfIntType())
             .substituteType(listElementAt.getterType) as FunctionType);
+    if (values.isPartial) {
+      return checkAbiSpecificIntegerMapping(result);
+    }
+    return result;
   }
 
+  Expression checkAbiSpecificIntegerMapping(Expression nullableExpression) =>
+      StaticInvocation(
+        checkAbiSpecificIntegerMappingFunction,
+        Arguments(
+          [nullableExpression],
+          types: [InterfaceType(intClass, Nullability.nonNullable)],
+        ),
+      );
+
   /// Generates an expression that returns a new `Pointer<dartType>` offset
   /// by [offset] from [pointer].
   ///
@@ -797,10 +802,16 @@
   /// Returns the single element type nested type argument of `Array`.
   ///
   /// `Array<Array<Array<Int8>>>` -> `Int8`.
+  ///
+  /// `Array<Array<Array<Unknown>>>` -> [InvalidType].
   DartType arraySingleElementType(DartType dartType) {
     InterfaceType elementType = dartType as InterfaceType;
     while (elementType.classNode == arrayClass) {
-      elementType = elementType.typeArguments[0] as InterfaceType;
+      final elementTypeAny = elementType.typeArguments[0];
+      if (elementTypeAny is InvalidType) {
+        return elementTypeAny;
+      }
+      elementType = elementTypeAny as InterfaceType;
     }
     return elementType;
   }
@@ -808,16 +819,37 @@
   /// Returns the number of dimensions of `Array`.
   ///
   /// `Array<Array<Array<Int8>>>` -> 3.
+  ///
+  /// `Array<Array<Array<Unknown>>>` -> 3.
   int arrayDimensions(DartType dartType) {
-    InterfaceType elementType = dartType as InterfaceType;
+    DartType elementType = dartType;
     int dimensions = 0;
-    while (elementType.classNode == arrayClass) {
-      elementType = elementType.typeArguments[0] as InterfaceType;
+    while (
+        elementType is InterfaceType && elementType.classNode == arrayClass) {
+      elementType = elementType.typeArguments[0];
       dimensions++;
     }
     return dimensions;
   }
 
+  bool isAbiSpecificIntegerSubtype(DartType type) {
+    if (type is InvalidType) {
+      return false;
+    }
+    if (type is NullType) {
+      return false;
+    }
+    if (type is InterfaceType) {
+      if (type.classNode == abiSpecificIntegerClass) {
+        return false;
+      }
+    }
+    return env.isSubtypeOf(
+        type,
+        InterfaceType(abiSpecificIntegerClass, Nullability.legacy),
+        SubtypeCheckMode.ignoringNullabilities);
+  }
+
   bool isCompoundSubtype(DartType type) {
     if (type is InvalidType) {
       return false;
@@ -867,6 +899,76 @@
         interfaceTarget: numMultiplication,
         functionType: numMultiplication.getterType as FunctionType);
   }
+
+  Iterable<MapConstant> getAbiSpecificIntegerMappingAnnotations(Class node) {
+    return node.annotations
+        .whereType<ConstantExpression>()
+        .map((e) => e.constant)
+        .whereType<InstanceConstant>()
+        .where((e) => e.classNode == abiSpecificIntegerMappingClass)
+        .map((instanceConstant) =>
+            instanceConstant.fieldValues.values.single as MapConstant);
+  }
+
+  /// Generates an expression performing an Abi specific integer load or store.
+  ///
+  /// If [value] is provided, it is a store, otherwise a load.
+  ///
+  /// Provide either [index], or [offsetInBytes], or none for an offset of 0.
+  ///
+  /// Generates an expression:
+  ///
+  /// ```dart
+  /// _storeAbiSpecificInt(
+  ///   [8, 8, 4][_abi()],
+  ///   typedDataBase,
+  ///   index * [8, 8, 4][_abi()],
+  ///   value,
+  /// )
+  /// ```
+  Expression abiSpecificLoadOrStoreExpression(
+    AbiSpecificNativeTypeCfe nativeTypeCfe, {
+    required Expression typedDataBase,
+    Expression? offsetInBytes,
+    Expression? index,
+    Expression? value,
+    required fileOffset,
+  }) {
+    assert(index == null || offsetInBytes == null);
+    final method = () {
+      if (value != null) {
+        if (index != null) {
+          return storeAbiSpecificIntAtIndexMethod;
+        }
+        return storeAbiSpecificIntMethod;
+      }
+      if (index != null) {
+        return loadAbiSpecificIntAtIndexMethod;
+      }
+      return loadAbiSpecificIntMethod;
+    }();
+
+    final Expression offsetOrIndex = () {
+      if (offsetInBytes != null) {
+        return offsetInBytes;
+      }
+      if (index != null) {
+        return index;
+      }
+      return ConstantExpression(IntConstant(0));
+    }();
+
+    return StaticInvocation(
+      method,
+      Arguments([
+        typedDataBase,
+        offsetOrIndex,
+        if (value != null) value,
+      ], types: [
+        InterfaceType(nativeTypeCfe.clazz, Nullability.nonNullable)
+      ]),
+    )..fileOffset = fileOffset;
+  }
 }
 
 /// Checks if any library depends on dart:ffi.
@@ -882,3 +984,8 @@
   }
   return false;
 }
+
+extension on Map<Abi, Object?> {
+  bool get isPartial =>
+      [for (final abi in Abi.values) this[abi]].contains(null);
+}
diff --git a/pkg/vm/lib/transformations/ffi/definitions.dart b/pkg/vm/lib/transformations/ffi/definitions.dart
index 49a4b8d..fe38da0 100644
--- a/pkg/vm/lib/transformations/ffi/definitions.dart
+++ b/pkg/vm/lib/transformations/ffi/definitions.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:math' as math;
-
 import 'package:front_end/src/api_unstable/vm.dart'
     show
+        messageFfiAbiSpecificIntegerInvalid,
+        messageFfiAbiSpecificIntegerMappingInvalid,
         messageFfiPackedAnnotationAlignment,
         messageNonPositiveArrayDimensions,
         templateFfiEmptyStruct,
@@ -31,7 +31,9 @@
 import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
 import 'package:kernel/util/graph.dart';
 
+import 'abi.dart';
 import 'common.dart';
+import 'native_type_cfe.dart';
 
 /// Checks and elaborates the dart:ffi compounds and their fields.
 ///
@@ -145,8 +147,9 @@
         final sizeAnnotations = _getArraySizeAnnotations(f);
         if (sizeAnnotations.length == 1) {
           final singleElementType = arraySingleElementType(type);
-          if (isCompoundSubtype(singleElementType)) {
-            final clazz = (singleElementType as InterfaceType).classNode;
+          if (singleElementType is InterfaceType &&
+              isCompoundSubtype(singleElementType)) {
+            final clazz = singleElementType.classNode;
             dependencies.add(clazz);
           }
         }
@@ -247,8 +250,36 @@
     return true;
   }
 
+  bool _isUserAbiSpecificInteger(Class node) =>
+      hierarchy.isSubclassOf(node, abiSpecificIntegerClass) &&
+      node != abiSpecificIntegerClass;
+
   @override
   visitClass(Class node) {
+    if (_isUserAbiSpecificInteger(node)) {
+      final nativeTypeCfe = NativeTypeCfe(
+              this, node.getThisType(coreTypes, Nullability.nonNullable))
+          as AbiSpecificNativeTypeCfe;
+      if (nativeTypeCfe.abiSpecificTypes.length == 0) {
+        // Annotation missing, multiple annotations, or invalid mapping.
+        diagnosticReporter.report(messageFfiAbiSpecificIntegerMappingInvalid,
+            node.fileOffset, node.name.length, node.location!.file);
+      }
+      if (node.typeParameters.length != 0 ||
+          node.procedures.where((Procedure e) => !e.isSynthetic).length != 0 ||
+          node.fields.length != 0 ||
+          node.redirectingFactories.length != 0 ||
+          node.constructors.length != 1 ||
+          !node.constructors.single.isConst) {
+        // We want exactly one constructor, no other members and no type arguments.
+        diagnosticReporter.report(messageFfiAbiSpecificIntegerInvalid,
+            node.fileOffset, node.name.length, node.location!.file);
+      }
+      final IndexedClass? indexedClass =
+          currentLibraryIndex?.lookupIndexedClass(node.name);
+      _addSizeOfField(node, indexedClass, nativeTypeCfe.size);
+      _annotateAbiSpecificTypeWithMapping(node, nativeTypeCfe);
+    }
     if (!_isUserCompound(node)) {
       return node;
     }
@@ -402,24 +433,31 @@
           final sizeAnnotations = _getArraySizeAnnotations(f);
           if (sizeAnnotations.length == 1) {
             final singleElementType = arraySingleElementType(type);
-            if (isCompoundSubtype(singleElementType)) {
-              final clazz = (singleElementType as InterfaceType).classNode;
-              _checkPacking(node, packing, clazz, f);
-            }
-            final dimensions = sizeAnnotations.single;
-            if (arrayDimensions(type) != dimensions.length) {
-              diagnosticReporter.report(
-                  templateFfiSizeAnnotationDimensions
-                      .withArguments(f.name.text),
-                  f.fileOffset,
-                  f.name.text.length,
-                  f.fileUri);
-            }
-            for (var dimension in dimensions) {
-              if (dimension < 0) {
-                diagnosticReporter.report(messageNonPositiveArrayDimensions,
-                    f.fileOffset, f.name.text.length, f.fileUri);
-                success = false;
+            if (singleElementType is! InterfaceType) {
+              assert(singleElementType is InvalidType);
+              // This class is invalid, but continue reporting other errors on it.
+              // An error on the type will already have been reported.
+              success = false;
+            } else {
+              if (isCompoundSubtype(singleElementType)) {
+                final clazz = singleElementType.classNode;
+                _checkPacking(node, packing, clazz, f);
+              }
+              final dimensions = sizeAnnotations.single;
+              if (arrayDimensions(type) != dimensions.length) {
+                diagnosticReporter.report(
+                    templateFfiSizeAnnotationDimensions
+                        .withArguments(f.name.text),
+                    f.fileOffset,
+                    f.name.text.length,
+                    f.fileUri);
+              }
+              for (var dimension in dimensions) {
+                if (dimension < 0) {
+                  diagnosticReporter.report(messageNonPositiveArrayDimensions,
+                      f.fileOffset, f.name.text.length, f.fileUri);
+                  success = false;
+                }
               }
             }
           } else {
@@ -440,9 +478,8 @@
         // This class is invalid, but continue reporting other errors on it.
         success = false;
       } else {
-        final DartType nativeType = InterfaceType(
-            nativeTypesClasses[_getFieldType(nativeTypeAnnos.first)!]!,
-            Nullability.legacy);
+        final DartType nativeType =
+            InterfaceType(nativeTypeAnnos.first, Nullability.legacy);
         final DartType? shouldBeDartType = convertNativeTypeToDartType(
             nativeType,
             allowCompounds: true,
@@ -567,8 +604,15 @@
         if (sizeAnnotations.length == 1) {
           final arrayDimensions = sizeAnnotations.single;
           if (this.arrayDimensions(dartType) == arrayDimensions.length) {
-            type = NativeTypeCfe(this, dartType,
-                compoundCache: compoundCache, arrayDimensions: arrayDimensions);
+            final elementType = arraySingleElementType(dartType);
+            if (elementType is! InterfaceType) {
+              assert(elementType is InvalidType);
+              type = InvalidNativeTypeCfe("Invalid element type.");
+            } else {
+              type = NativeTypeCfe(this, dartType,
+                  compoundCache: compoundCache,
+                  arrayDimensions: arrayDimensions);
+            }
           } else {
             type = InvalidNativeTypeCfe("Invalid array dimensions.");
           }
@@ -580,8 +624,13 @@
         final nativeTypeAnnos = _getNativeTypeAnnotations(m).toList();
         if (nativeTypeAnnos.length == 1) {
           final clazz = nativeTypeAnnos.first;
-          final nativeType = _getFieldType(clazz)!;
-          type = PrimitiveNativeTypeCfe(nativeType, clazz);
+          if (_isUserAbiSpecificInteger(clazz)) {
+            type = NativeTypeCfe(
+                this, clazz.getThisType(coreTypes, Nullability.nonNullable));
+          } else {
+            final nativeType = _getFieldType(clazz)!;
+            type = PrimitiveNativeTypeCfe(nativeType, clazz);
+          }
         }
       }
 
@@ -689,7 +738,6 @@
 
   static const vmFfiStructFields = "vm:ffi:struct-fields";
 
-  // return value is nullable.
   InstanceConstant? _compoundAnnotatedFields(Class node) {
     for (final annotation in node.annotations) {
       if (annotation is ConstantExpression) {
@@ -759,7 +807,6 @@
     return UnionNativeTypeCfe(compoundClass, members);
   }
 
-  // packing is `int?`.
   void _annoteCompoundWithFields(
       Class node, List<NativeTypeCfe> types, int? packing) {
     List<Constant> constants =
@@ -779,8 +826,40 @@
         InterfaceType(pragmaClass, Nullability.nonNullable, [])));
   }
 
-  void _generateMethodsForField(Class node, Field field, NativeTypeCfe type,
-      Map<Abi, int> offsets, bool unalignedAccess, IndexedClass? indexedClass) {
+  static const vmFfiAbiSpecificIntMapping = 'vm:ffi:abi-specific-mapping';
+
+  void _annotateAbiSpecificTypeWithMapping(
+      Class node, AbiSpecificNativeTypeCfe nativeTypeCfe) {
+    final constants = [
+      for (final abi in Abi.values)
+        nativeTypeCfe.abiSpecificTypes[abi]?.generateConstant(this) ??
+            NullConstant()
+    ];
+    node.addAnnotation(ConstantExpression(
+        InstanceConstant(pragmaClass.reference, [], {
+          pragmaName.fieldReference: StringConstant(vmFfiAbiSpecificIntMapping),
+          pragmaOptions.fieldReference: InstanceConstant(
+            ffiAbiSpecificMappingClass.reference,
+            [],
+            {
+              ffiAbiSpecificMappingNativeTypesField.fieldReference:
+                  ListConstant(
+                InterfaceType(typeClass, Nullability.nullable),
+                constants,
+              ),
+            },
+          )
+        }),
+        InterfaceType(pragmaClass, Nullability.nonNullable, [])));
+  }
+
+  void _generateMethodsForField(
+      Class node,
+      Field field,
+      NativeTypeCfe type,
+      Map<Abi, int?> offsets,
+      bool unalignedAccess,
+      IndexedClass? indexedClass) {
     // TODO(johnniwinther): Avoid passing [indexedClass]. When compiling
     // incrementally, [field] should already carry the references from
     // [indexedClass].
@@ -831,9 +910,9 @@
   /// If sizes are not supplied still emits a field so that the use site
   /// transformer can still rewrite to it.
   void _addSizeOfField(Class compound, IndexedClass? indexedClass,
-      [Map<Abi, int>? sizes = null]) {
+      [Map<Abi, int?>? sizes = null]) {
     if (sizes == null) {
-      sizes = Map.fromEntries(Abi.values.map((abi) => MapEntry(abi, 0)));
+      sizes = {for (var abi in Abi.values) abi: 0};
     }
     final name = Name("#sizeOf");
     final getterReference = indexedClass?.lookupGetterReference(name);
@@ -873,7 +952,8 @@
         .map((expr) => expr.constant)
         .whereType<InstanceConstant>()
         .map((constant) => constant.classNode)
-        .where((klass) => _getFieldType(klass) != null);
+        .where((klass) =>
+            _getFieldType(klass) != null || _isUserAbiSpecificInteger(klass));
   }
 
   Iterable<List<int>> _getArraySizeAnnotations(Member node) {
@@ -940,542 +1020,3 @@
 
   CompoundField(this.type, this.field, this.getter, this.setter);
 }
-
-/// The layout of a `Struct` or `Union` in one [Abi].
-class CompoundLayout {
-  /// Size of the entire struct or union.
-  final int size;
-
-  /// Alignment of struct or union when nested in a struct.
-  final int alignment;
-
-  /// Offset in bytes for each field, indexed by field number.
-  ///
-  /// Always 0 for unions.
-  final List<int> offsets;
-
-  CompoundLayout(this.size, this.alignment, this.offsets);
-}
-
-/// AST node wrapper for native types.
-///
-/// This algebraic data structure does not stand on its own but refers
-/// intimately to AST nodes such as [Class].
-abstract class NativeTypeCfe {
-  factory NativeTypeCfe(FfiTransformer transformer, DartType dartType,
-      {List<int>? arrayDimensions,
-      Map<Class, NativeTypeCfe> compoundCache = const {}}) {
-    if (transformer.isPrimitiveType(dartType)) {
-      final clazz = (dartType as InterfaceType).classNode;
-      final nativeType = transformer.getType(clazz)!;
-      return PrimitiveNativeTypeCfe(nativeType, clazz);
-    }
-    if (transformer.isPointerType(dartType)) {
-      return PointerNativeTypeCfe();
-    }
-    if (transformer.isCompoundSubtype(dartType)) {
-      final clazz = (dartType as InterfaceType).classNode;
-      if (compoundCache.containsKey(clazz)) {
-        return compoundCache[clazz]!;
-      } else {
-        throw "Class '$clazz' not found in compoundCache.";
-      }
-    }
-    if (transformer.isArrayType(dartType)) {
-      if (arrayDimensions == null) {
-        throw "Must have array dimensions for ArrayType.";
-      }
-      if (arrayDimensions.length == 0) {
-        throw "Must have a size for this array dimension.";
-      }
-      final elementType = transformer.arraySingleElementType(dartType);
-      final elementCfeType =
-          NativeTypeCfe(transformer, elementType, compoundCache: compoundCache);
-      if (elementCfeType is InvalidNativeTypeCfe) {
-        return elementCfeType;
-      }
-      return ArrayNativeTypeCfe.multi(elementCfeType, arrayDimensions);
-    }
-    throw "Invalid type $dartType";
-  }
-
-  /// The size in bytes per [Abi].
-  Map<Abi, int> get size;
-
-  /// The alignment inside structs in bytes per [Abi].
-  ///
-  /// This is not the alignment on stack, this is only calculated in the VM.
-  Map<Abi, int> get alignment;
-
-  /// Generates a Constant representing the type which is consumed by the VM.
-  ///
-  /// Takes [transformer] to be able to lookup classes and methods.
-  ///
-  /// See runtime/vm/compiler/ffi/native_type.cc:NativeType::FromAbstractType.
-  Constant generateConstant(FfiTransformer transformer);
-
-  /// Generates the return statement for a compound field getter with this type.
-  ///
-  /// Takes [transformer] to be able to lookup classes and methods.
-  ReturnStatement generateGetterStatement(DartType dartType, int fileOffset,
-      Map<Abi, int> offsets, bool unalignedAccess, FfiTransformer transformer);
-
-  /// Generates the return statement for a compound field setter with this type.
-  ///
-  /// Takes [transformer] to be able to lookup classes and methods.
-  ReturnStatement generateSetterStatement(
-      DartType dartType,
-      int fileOffset,
-      Map<Abi, int> offsets,
-      bool unalignedAccess,
-      VariableDeclaration argument,
-      FfiTransformer transformer);
-}
-
-class InvalidNativeTypeCfe implements NativeTypeCfe {
-  final String reason;
-
-  InvalidNativeTypeCfe(this.reason);
-
-  @override
-  Map<Abi, int> get alignment => throw reason;
-
-  @override
-  Constant generateConstant(FfiTransformer transformer) => throw reason;
-
-  @override
-  ReturnStatement generateGetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          FfiTransformer transformer) =>
-      throw reason;
-
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      throw reason;
-
-  @override
-  Map<Abi, int> get size => throw reason;
-}
-
-class PrimitiveNativeTypeCfe implements NativeTypeCfe {
-  final NativeType nativeType;
-
-  final Class clazz;
-
-  PrimitiveNativeTypeCfe(this.nativeType, this.clazz);
-
-  @override
-  Map<Abi, int> get size {
-    final int size = nativeTypeSizes[nativeType]!;
-    if (size == WORD_SIZE) {
-      return wordSize;
-    }
-    return Map.fromEntries(Abi.values.map((abi) => MapEntry(abi, size)));
-  }
-
-  @override
-  Map<Abi, int> get alignment => Map.fromEntries(Abi.values.map((abi) =>
-      MapEntry(abi, nonSizeAlignment[abi]![nativeType] ?? size[abi]!)));
-
-  @override
-  Constant generateConstant(FfiTransformer transformer) =>
-      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
-
-  bool get isFloat =>
-      nativeType == NativeType.kFloat || nativeType == NativeType.kDouble;
-
-  bool isUnaligned(Map<Abi, int> offsets) {
-    final alignments = alignment;
-    for (final abi in offsets.keys) {
-      final offset = offsets[abi]!;
-      final alignment = alignments[abi]!;
-      if (offset % alignment != 0) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /// Sample output for `int get x =>`:
-  ///
-  /// ```
-  /// _loadInt8(_typedDataBase, offset);
-  /// ```
-  @override
-  ReturnStatement generateGetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          (unalignedAccess && isFloat
-              ? transformer.loadUnalignedMethods
-              : transformer.loadMethods)[nativeType]!,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets)
-          ]))
-        ..fileOffset = fileOffset);
-
-  /// Sample output for `set x(int #v) =>`:
-  ///
-  /// ```
-  /// _storeInt8(_typedDataBase, offset, #v);
-  /// ```
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          (unalignedAccess && isFloat
-              ? transformer.storeUnalignedMethods
-              : transformer.storeMethods)[nativeType]!,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            VariableGet(argument)
-          ]))
-        ..fileOffset = fileOffset);
-}
-
-class PointerNativeTypeCfe implements NativeTypeCfe {
-  @override
-  Map<Abi, int> get size => wordSize;
-
-  @override
-  Map<Abi, int> get alignment => wordSize;
-
-  @override
-  Constant generateConstant(FfiTransformer transformer) => TypeLiteralConstant(
-          InterfaceType(transformer.pointerClass, Nullability.nonNullable, [
-        InterfaceType(
-            transformer.pointerClass.superclass!, Nullability.nonNullable)
-      ]));
-
-  /// Sample output for `Pointer<Int8> get x =>`:
-  ///
-  /// ```
-  /// _fromAddress<Int8>(_loadIntPtr(_typedDataBase, offset));
-  /// ```
-  @override
-  ReturnStatement generateGetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.fromAddressInternal,
-          Arguments([
-            StaticInvocation(
-                transformer.loadMethods[NativeType.kIntptr]!,
-                Arguments([
-                  transformer.getCompoundTypedDataBaseField(
-                      ThisExpression(), fileOffset),
-                  transformer.runtimeBranchOnLayout(offsets)
-                ]))
-              ..fileOffset = fileOffset
-          ], types: [
-            (dartType as InterfaceType).typeArguments.single
-          ]))
-        ..fileOffset = fileOffset);
-
-  /// Sample output for `set x(Pointer<Int8> #v) =>`:
-  ///
-  /// ```
-  /// _storeIntPtr(_typedDataBase, offset, (#v as Pointer<Int8>).address);
-  /// ```
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.storeMethods[NativeType.kIntptr]!,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            InstanceGet(InstanceAccessKind.Instance, VariableGet(argument),
-                transformer.addressGetter.name,
-                interfaceTarget: transformer.addressGetter,
-                resultType: transformer.addressGetter.getterType)
-              ..fileOffset = fileOffset
-          ]))
-        ..fileOffset = fileOffset);
-}
-
-abstract class CompoundNativeTypeCfe implements NativeTypeCfe {
-  final Class clazz;
-
-  final List<NativeTypeCfe> members;
-
-  final Map<Abi, CompoundLayout> layout;
-
-  CompoundNativeTypeCfe._(this.clazz, this.members, this.layout);
-
-  @override
-  Map<Abi, int> get size =>
-      layout.map((abi, layout) => MapEntry(abi, layout.size));
-
-  @override
-  Map<Abi, int> get alignment =>
-      layout.map((abi, layout) => MapEntry(abi, layout.alignment));
-
-  @override
-  Constant generateConstant(FfiTransformer transformer) =>
-      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
-
-  /// Sample output for `MyStruct get x =>`:
-  ///
-  /// ```
-  /// MyStruct.#fromTypedDataBase(
-  ///   typedDataBaseOffset(_typedDataBase, offset, size, dartType)
-  /// );
-  /// ```
-  @override
-  ReturnStatement generateGetterStatement(DartType dartType, int fileOffset,
-      Map<Abi, int> offsets, bool unalignedAccess, FfiTransformer transformer) {
-    final constructor = clazz.constructors
-        .firstWhere((c) => c.name == Name("#fromTypedDataBase"));
-
-    return ReturnStatement(ConstructorInvocation(
-        constructor,
-        Arguments([
-          transformer.typedDataBaseOffset(
-              transformer.getCompoundTypedDataBaseField(
-                  ThisExpression(), fileOffset),
-              transformer.runtimeBranchOnLayout(offsets),
-              transformer.runtimeBranchOnLayout(size),
-              dartType,
-              fileOffset)
-        ]))
-      ..fileOffset = fileOffset);
-  }
-
-  /// Sample output for `set x(MyStruct #v) =>`:
-  ///
-  /// ```
-  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
-  /// ```
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.memCopy,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            transformer.getCompoundTypedDataBaseField(
-                VariableGet(argument), fileOffset),
-            ConstantExpression(IntConstant(0)),
-            transformer.runtimeBranchOnLayout(size),
-          ]))
-        ..fileOffset = fileOffset);
-}
-
-class StructNativeTypeCfe extends CompoundNativeTypeCfe {
-  // Nullable int.
-  final int? packing;
-
-  factory StructNativeTypeCfe(Class clazz, List<NativeTypeCfe> members,
-      {int? packing}) {
-    final layout = Map.fromEntries(Abi.values
-        .map((abi) => MapEntry(abi, _calculateLayout(members, packing, abi))));
-    return StructNativeTypeCfe._(clazz, members, packing, layout);
-  }
-
-  StructNativeTypeCfe._(Class clazz, List<NativeTypeCfe> members, this.packing,
-      Map<Abi, CompoundLayout> layout)
-      : super._(clazz, members, layout);
-
-  // Keep consistent with runtime/vm/compiler/ffi/native_type.cc
-  // NativeStructType::FromNativeTypes.
-  static CompoundLayout _calculateLayout(
-      List<NativeTypeCfe> types, int? packing, Abi abi) {
-    int offset = 0;
-    final offsets = <int>[];
-    int structAlignment = 1;
-    for (int i = 0; i < types.length; i++) {
-      final int size = types[i].size[abi]!;
-      int alignment = types[i].alignment[abi]!;
-      if (packing != null && packing < alignment) {
-        alignment = packing;
-      }
-      if (alignment > 0) {
-        offset = _alignOffset(offset, alignment);
-      }
-      offsets.add(offset);
-      offset += size;
-      structAlignment = math.max(structAlignment, alignment);
-    }
-    final int size = _alignOffset(offset, structAlignment);
-    return CompoundLayout(size, structAlignment, offsets);
-  }
-}
-
-class UnionNativeTypeCfe extends CompoundNativeTypeCfe {
-  factory UnionNativeTypeCfe(Class clazz, List<NativeTypeCfe> members) {
-    final layout = Map.fromEntries(
-        Abi.values.map((abi) => MapEntry(abi, _calculateLayout(members, abi))));
-    return UnionNativeTypeCfe._(clazz, members, layout);
-  }
-
-  UnionNativeTypeCfe._(
-      Class clazz, List<NativeTypeCfe> members, Map<Abi, CompoundLayout> layout)
-      : super._(clazz, members, layout);
-
-  // Keep consistent with runtime/vm/compiler/ffi/native_type.cc
-  // NativeUnionType::FromNativeTypes.
-  static CompoundLayout _calculateLayout(List<NativeTypeCfe> types, Abi abi) {
-    int unionSize = 1;
-    int unionAlignment = 1;
-    for (int i = 0; i < types.length; i++) {
-      final int size = types[i].size[abi]!;
-      int alignment = types[i].alignment[abi]!;
-      unionSize = math.max(unionSize, size);
-      unionAlignment = math.max(unionAlignment, alignment);
-    }
-    final int size = _alignOffset(unionSize, unionAlignment);
-    return CompoundLayout(size, unionAlignment, List.filled(types.length, 0));
-  }
-}
-
-class ArrayNativeTypeCfe implements NativeTypeCfe {
-  final NativeTypeCfe elementType;
-  final int length;
-
-  ArrayNativeTypeCfe(this.elementType, this.length);
-
-  factory ArrayNativeTypeCfe.multi(
-      NativeTypeCfe elementType, List<int> dimensions) {
-    if (dimensions.length == 1) {
-      return ArrayNativeTypeCfe(elementType, dimensions.single);
-    }
-    return ArrayNativeTypeCfe(
-        ArrayNativeTypeCfe.multi(elementType, dimensions.sublist(1)),
-        dimensions.first);
-  }
-
-  List<int> get dimensions {
-    final elementType = this.elementType;
-    if (elementType is ArrayNativeTypeCfe) {
-      return [length, ...elementType.dimensions];
-    }
-    return [length];
-  }
-
-  List<int> get nestedDimensions => dimensions.sublist(1);
-
-  int get dimensionsFlattened =>
-      dimensions.fold(1, (accumulator, element) => accumulator * element);
-
-  NativeTypeCfe get singleElementType {
-    final elementType = this.elementType;
-    if (elementType is ArrayNativeTypeCfe) {
-      return elementType.singleElementType;
-    }
-    return elementType;
-  }
-
-  @override
-  Map<Abi, int> get size =>
-      elementType.size.map((abi, size) => MapEntry(abi, size * length));
-
-  @override
-  Map<Abi, int> get alignment => elementType.alignment;
-
-  // Note that we flatten multi dimensional arrays.
-  @override
-  Constant generateConstant(FfiTransformer transformer) =>
-      InstanceConstant(transformer.ffiInlineArrayClass.reference, [], {
-        transformer.ffiInlineArrayElementTypeField.fieldReference:
-            singleElementType.generateConstant(transformer),
-        transformer.ffiInlineArrayLengthField.fieldReference:
-            IntConstant(dimensionsFlattened)
-      });
-
-  /// Sample output for `Array<Int8> get x =>`:
-  ///
-  /// ```
-  /// Array<Int8>._(
-  ///   typedDataBaseOffset(_typedDataBase, offset, size, typeArgument)
-  /// );
-  /// ```
-  @override
-  ReturnStatement generateGetterStatement(DartType dartType, int fileOffset,
-      Map<Abi, int> offsets, bool unalignedAccess, FfiTransformer transformer) {
-    InterfaceType typeArgument =
-        (dartType as InterfaceType).typeArguments.single as InterfaceType;
-    return ReturnStatement(ConstructorInvocation(
-        transformer.arrayConstructor,
-        Arguments([
-          transformer.typedDataBaseOffset(
-              transformer.getCompoundTypedDataBaseField(
-                  ThisExpression(), fileOffset),
-              transformer.runtimeBranchOnLayout(offsets),
-              transformer.runtimeBranchOnLayout(size),
-              typeArgument,
-              fileOffset),
-          ConstantExpression(IntConstant(length)),
-          transformer.intListConstantExpression(nestedDimensions)
-        ], types: [
-          typeArgument
-        ]))
-      ..fileOffset = fileOffset);
-  }
-
-  /// Sample output for `set x(Array #v) =>`:
-  ///
-  /// ```
-  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
-  /// ```
-  @override
-  ReturnStatement generateSetterStatement(
-          DartType dartType,
-          int fileOffset,
-          Map<Abi, int> offsets,
-          bool unalignedAccess,
-          VariableDeclaration argument,
-          FfiTransformer transformer) =>
-      ReturnStatement(StaticInvocation(
-          transformer.memCopy,
-          Arguments([
-            transformer.getCompoundTypedDataBaseField(
-                ThisExpression(), fileOffset),
-            transformer.runtimeBranchOnLayout(offsets),
-            transformer.getArrayTypedDataBaseField(
-                VariableGet(argument), fileOffset),
-            ConstantExpression(IntConstant(0)),
-            transformer.runtimeBranchOnLayout(size),
-          ]))
-        ..fileOffset = fileOffset);
-}
-
-int _alignOffset(int offset, int alignment) =>
-    ((offset + alignment - 1) ~/ alignment) * alignment;
diff --git a/pkg/vm/lib/transformations/ffi/native_type_cfe.dart b/pkg/vm/lib/transformations/ffi/native_type_cfe.dart
new file mode 100644
index 0000000..bb73a94
--- /dev/null
+++ b/pkg/vm/lib/transformations/ffi/native_type_cfe.dart
@@ -0,0 +1,714 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math' as math;
+
+import 'package:kernel/ast.dart';
+
+import 'abi.dart';
+import 'common.dart';
+
+/// AST node wrapper for native types.
+///
+/// This algebraic data structure does not stand on its own but refers
+/// intimately to AST nodes such as [Class].
+abstract class NativeTypeCfe {
+  factory NativeTypeCfe(FfiTransformer transformer, DartType dartType,
+      {List<int>? arrayDimensions,
+      Map<Class, NativeTypeCfe> compoundCache = const {},
+      alreadyInAbiSpecificType = false}) {
+    if (transformer.isPrimitiveType(dartType)) {
+      final clazz = (dartType as InterfaceType).classNode;
+      final nativeType = transformer.getType(clazz)!;
+      return PrimitiveNativeTypeCfe(nativeType, clazz);
+    }
+    if (transformer.isPointerType(dartType)) {
+      return PointerNativeTypeCfe();
+    }
+    if (transformer.isCompoundSubtype(dartType)) {
+      final clazz = (dartType as InterfaceType).classNode;
+      if (compoundCache.containsKey(clazz)) {
+        return compoundCache[clazz]!;
+      } else {
+        throw "Class '$clazz' not found in compoundCache.";
+      }
+    }
+    if (transformer.isArrayType(dartType)) {
+      if (arrayDimensions == null) {
+        throw "Must have array dimensions for ArrayType.";
+      }
+      if (arrayDimensions.length == 0) {
+        throw "Must have a size for this array dimension.";
+      }
+      final elementType = transformer.arraySingleElementType(dartType);
+      final elementCfeType =
+          NativeTypeCfe(transformer, elementType, compoundCache: compoundCache);
+      if (elementCfeType is InvalidNativeTypeCfe) {
+        return elementCfeType;
+      }
+      return ArrayNativeTypeCfe.multi(elementCfeType, arrayDimensions);
+    }
+    if (transformer.isAbiSpecificIntegerSubtype(dartType)) {
+      final clazz = (dartType as InterfaceType).classNode;
+      final mappingConstants =
+          transformer.getAbiSpecificIntegerMappingAnnotations(clazz);
+      if (alreadyInAbiSpecificType || mappingConstants.length != 1) {
+        // Unsupported mapping.
+        return AbiSpecificNativeTypeCfe({}, clazz);
+      }
+      final mapping =
+          Map.fromEntries(mappingConstants.first.entries.map((e) => MapEntry(
+              transformer.constantAbis[e.key]!,
+              NativeTypeCfe(
+                transformer,
+                (e.value as InstanceConstant).classNode.getThisType(
+                    transformer.coreTypes, Nullability.nonNullable),
+                alreadyInAbiSpecificType: true,
+              ))));
+      for (final value in mapping.values) {
+        if (value is! PrimitiveNativeTypeCfe ||
+            !nativeIntTypesFixedSize.contains(value.nativeType)) {
+          // Unsupported mapping.
+          return AbiSpecificNativeTypeCfe({}, clazz);
+        }
+      }
+      return AbiSpecificNativeTypeCfe(mapping, clazz);
+    }
+    throw "Invalid type $dartType";
+  }
+
+  /// The size in bytes per [Abi].
+  Map<Abi, int?> get size;
+
+  /// The alignment inside structs in bytes per [Abi].
+  ///
+  /// This is not the alignment on stack, this is only calculated in the VM.
+  Map<Abi, int?> get alignment;
+
+  /// Generates a Constant representing the type which is consumed by the VM.
+  ///
+  /// Takes [transformer] to be able to lookup classes and methods.
+  ///
+  /// See runtime/vm/compiler/ffi/native_type.cc:NativeType::FromAbstractType.
+  Constant generateConstant(FfiTransformer transformer);
+
+  /// Generates the return statement for a compound field getter with this type.
+  ///
+  /// Takes [transformer] to be able to lookup classes and methods.
+  ReturnStatement generateGetterStatement(DartType dartType, int fileOffset,
+      Map<Abi, int?> offsets, bool unalignedAccess, FfiTransformer transformer);
+
+  /// Generates the return statement for a compound field setter with this type.
+  ///
+  /// Takes [transformer] to be able to lookup classes and methods.
+  ReturnStatement generateSetterStatement(
+      DartType dartType,
+      int fileOffset,
+      Map<Abi, int?> offsets,
+      bool unalignedAccess,
+      VariableDeclaration argument,
+      FfiTransformer transformer);
+}
+
+class InvalidNativeTypeCfe implements NativeTypeCfe {
+  final String reason;
+
+  InvalidNativeTypeCfe(this.reason);
+
+  @override
+  Map<Abi, int?> get alignment => throw reason;
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) => throw reason;
+
+  @override
+  ReturnStatement generateGetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          FfiTransformer transformer) =>
+      throw reason;
+
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      throw reason;
+
+  @override
+  Map<Abi, int?> get size => throw reason;
+}
+
+class PrimitiveNativeTypeCfe implements NativeTypeCfe {
+  final NativeType nativeType;
+
+  final Class clazz;
+
+  PrimitiveNativeTypeCfe(this.nativeType, this.clazz);
+
+  @override
+  Map<Abi, int?> get size {
+    final int size = nativeTypeSizes[nativeType]!;
+    if (size == WORD_SIZE) {
+      return wordSize;
+    }
+    return {for (var abi in Abi.values) abi: size};
+  }
+
+  @override
+  Map<Abi, int> get alignment => {
+        for (var abi in Abi.values)
+          abi: nonSizeAlignment[abi]![nativeType] ?? size[abi]!
+      };
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) =>
+      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
+
+  bool get isFloat =>
+      nativeType == NativeType.kFloat || nativeType == NativeType.kDouble;
+
+  bool isUnaligned(Map<Abi, int?> offsets) {
+    final alignments = alignment;
+    for (final abi in offsets.keys) {
+      final offset = offsets[abi]!;
+      final alignment = alignments[abi]!;
+      if (offset % alignment != 0) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /// Sample output for `int get x =>`:
+  ///
+  /// ```
+  /// _loadInt8(_typedDataBase, offset);
+  /// ```
+  @override
+  ReturnStatement generateGetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          (unalignedAccess && isFloat
+              ? transformer.loadUnalignedMethods
+              : transformer.loadMethods)[nativeType]!,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets)
+          ]))
+        ..fileOffset = fileOffset);
+
+  /// Sample output for `set x(int #v) =>`:
+  ///
+  /// ```
+  /// _storeInt8(_typedDataBase, offset, #v);
+  /// ```
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          (unalignedAccess && isFloat
+              ? transformer.storeUnalignedMethods
+              : transformer.storeMethods)[nativeType]!,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets),
+            VariableGet(argument)
+          ]))
+        ..fileOffset = fileOffset);
+}
+
+class PointerNativeTypeCfe implements NativeTypeCfe {
+  @override
+  Map<Abi, int?> get size => wordSize;
+
+  @override
+  Map<Abi, int?> get alignment => wordSize;
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) => TypeLiteralConstant(
+          InterfaceType(transformer.pointerClass, Nullability.nonNullable, [
+        InterfaceType(
+            transformer.pointerClass.superclass!, Nullability.nonNullable)
+      ]));
+
+  /// Sample output for `Pointer<Int8> get x =>`:
+  ///
+  /// ```
+  /// _fromAddress<Int8>(_loadIntPtr(_typedDataBase, offset));
+  /// ```
+  @override
+  ReturnStatement generateGetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          transformer.fromAddressInternal,
+          Arguments([
+            StaticInvocation(
+                transformer.loadMethods[NativeType.kIntptr]!,
+                Arguments([
+                  transformer.getCompoundTypedDataBaseField(
+                      ThisExpression(), fileOffset),
+                  transformer.runtimeBranchOnLayout(offsets)
+                ]))
+              ..fileOffset = fileOffset
+          ], types: [
+            (dartType as InterfaceType).typeArguments.single
+          ]))
+        ..fileOffset = fileOffset);
+
+  /// Sample output for `set x(Pointer<Int8> #v) =>`:
+  ///
+  /// ```
+  /// _storeIntPtr(_typedDataBase, offset, (#v as Pointer<Int8>).address);
+  /// ```
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          transformer.storeMethods[NativeType.kIntptr]!,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets),
+            InstanceGet(InstanceAccessKind.Instance, VariableGet(argument),
+                transformer.addressGetter.name,
+                interfaceTarget: transformer.addressGetter,
+                resultType: transformer.addressGetter.getterType)
+              ..fileOffset = fileOffset
+          ]))
+        ..fileOffset = fileOffset);
+}
+
+/// The layout of a `Struct` or `Union` in one [Abi].
+class CompoundLayout {
+  /// Size of the entire struct or union.
+  final int? size;
+
+  /// Alignment of struct or union when nested in a struct.
+  final int? alignment;
+
+  /// Offset in bytes for each field, indexed by field number.
+  ///
+  /// Always 0 for unions.
+  final List<int?> offsets;
+
+  CompoundLayout(this.size, this.alignment, this.offsets);
+}
+
+abstract class CompoundNativeTypeCfe implements NativeTypeCfe {
+  final Class clazz;
+
+  final List<NativeTypeCfe> members;
+
+  final Map<Abi, CompoundLayout> layout;
+
+  CompoundNativeTypeCfe._(this.clazz, this.members, this.layout);
+
+  @override
+  Map<Abi, int?> get size =>
+      layout.map((abi, layout) => MapEntry(abi, layout.size));
+
+  @override
+  Map<Abi, int?> get alignment =>
+      layout.map((abi, layout) => MapEntry(abi, layout.alignment));
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) =>
+      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
+
+  /// Sample output for `MyStruct get x =>`:
+  ///
+  /// ```
+  /// MyStruct.#fromTypedDataBase(
+  ///   typedDataBaseOffset(_typedDataBase, offset, size, dartType)
+  /// );
+  /// ```
+  @override
+  ReturnStatement generateGetterStatement(
+      DartType dartType,
+      int fileOffset,
+      Map<Abi, int?> offsets,
+      bool unalignedAccess,
+      FfiTransformer transformer) {
+    final constructor = clazz.constructors
+        .firstWhere((c) => c.name == Name("#fromTypedDataBase"));
+
+    return ReturnStatement(ConstructorInvocation(
+        constructor,
+        Arguments([
+          transformer.typedDataBaseOffset(
+              transformer.getCompoundTypedDataBaseField(
+                  ThisExpression(), fileOffset),
+              transformer.runtimeBranchOnLayout(offsets),
+              transformer.runtimeBranchOnLayout(size),
+              dartType,
+              fileOffset)
+        ]))
+      ..fileOffset = fileOffset);
+  }
+
+  /// Sample output for `set x(MyStruct #v) =>`:
+  ///
+  /// ```
+  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
+  /// ```
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          transformer.memCopy,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets),
+            transformer.getCompoundTypedDataBaseField(
+                VariableGet(argument), fileOffset),
+            ConstantExpression(IntConstant(0)),
+            transformer.runtimeBranchOnLayout(size),
+          ]))
+        ..fileOffset = fileOffset);
+}
+
+class StructNativeTypeCfe extends CompoundNativeTypeCfe {
+  // Nullable int.
+  final int? packing;
+
+  factory StructNativeTypeCfe(Class clazz, List<NativeTypeCfe> members,
+      {int? packing}) {
+    final layout = {
+      for (var abi in Abi.values) abi: _calculateLayout(members, packing, abi)
+    };
+    return StructNativeTypeCfe._(clazz, members, packing, layout);
+  }
+
+  StructNativeTypeCfe._(Class clazz, List<NativeTypeCfe> members, this.packing,
+      Map<Abi, CompoundLayout> layout)
+      : super._(clazz, members, layout);
+
+  // Keep consistent with runtime/vm/compiler/ffi/native_type.cc
+  // NativeStructType::FromNativeTypes.
+  static CompoundLayout _calculateLayout(
+      List<NativeTypeCfe> types, int? packing, Abi abi) {
+    int? offset = 0;
+    final offsets = <int?>[];
+    int? structAlignment = 1;
+    for (int i = 0; i < types.length; i++) {
+      final int? size = types[i].size[abi];
+      int? alignment = types[i].alignment[abi];
+      if (packing != null) {
+        alignment = min(packing, alignment);
+      }
+      if (alignment != null && alignment > 0) {
+        offset = offset.align(alignment);
+      }
+      offsets.add(offset);
+      offset += size;
+      structAlignment = max(structAlignment, alignment);
+    }
+    final int? size = offset.align(structAlignment);
+    return CompoundLayout(size, structAlignment, offsets);
+  }
+}
+
+class UnionNativeTypeCfe extends CompoundNativeTypeCfe {
+  factory UnionNativeTypeCfe(Class clazz, List<NativeTypeCfe> members) {
+    final layout = {
+      for (var abi in Abi.values) abi: _calculateLayout(members, abi)
+    };
+    return UnionNativeTypeCfe._(clazz, members, layout);
+  }
+
+  UnionNativeTypeCfe._(
+      Class clazz, List<NativeTypeCfe> members, Map<Abi, CompoundLayout> layout)
+      : super._(clazz, members, layout);
+
+  // Keep consistent with runtime/vm/compiler/ffi/native_type.cc
+  // NativeUnionType::FromNativeTypes.
+  static CompoundLayout _calculateLayout(List<NativeTypeCfe> types, Abi abi) {
+    int? unionSize = 1;
+    int? unionAlignment = 1;
+    for (int i = 0; i < types.length; i++) {
+      final int? size = types[i].size[abi];
+      int? alignment = types[i].alignment[abi];
+      unionSize = max(unionSize, size);
+      unionAlignment = max(unionAlignment, alignment);
+    }
+    final int? size = unionSize.align(unionAlignment);
+    return CompoundLayout(size, unionAlignment, List.filled(types.length, 0));
+  }
+}
+
+class ArrayNativeTypeCfe implements NativeTypeCfe {
+  final NativeTypeCfe elementType;
+  final int length;
+
+  ArrayNativeTypeCfe(this.elementType, this.length);
+
+  factory ArrayNativeTypeCfe.multi(
+      NativeTypeCfe elementType, List<int> dimensions) {
+    if (dimensions.length == 1) {
+      return ArrayNativeTypeCfe(elementType, dimensions.single);
+    }
+    return ArrayNativeTypeCfe(
+        ArrayNativeTypeCfe.multi(elementType, dimensions.sublist(1)),
+        dimensions.first);
+  }
+
+  List<int> get dimensions {
+    final elementType = this.elementType;
+    if (elementType is ArrayNativeTypeCfe) {
+      return [length, ...elementType.dimensions];
+    }
+    return [length];
+  }
+
+  List<int> get nestedDimensions => dimensions.sublist(1);
+
+  int get dimensionsFlattened =>
+      dimensions.fold(1, (accumulator, element) => accumulator * element);
+
+  NativeTypeCfe get singleElementType {
+    final elementType = this.elementType;
+    if (elementType is ArrayNativeTypeCfe) {
+      return elementType.singleElementType;
+    }
+    return elementType;
+  }
+
+  @override
+  Map<Abi, int?> get size =>
+      elementType.size.map((abi, size) => MapEntry(abi, size * length));
+
+  @override
+  Map<Abi, int?> get alignment => elementType.alignment;
+
+  // Note that we flatten multi dimensional arrays.
+  @override
+  Constant generateConstant(FfiTransformer transformer) =>
+      InstanceConstant(transformer.ffiInlineArrayClass.reference, [], {
+        transformer.ffiInlineArrayElementTypeField.fieldReference:
+            singleElementType.generateConstant(transformer),
+        transformer.ffiInlineArrayLengthField.fieldReference:
+            IntConstant(dimensionsFlattened)
+      });
+
+  /// Sample output for `Array<Int8> get x =>`:
+  ///
+  /// ```
+  /// Array<Int8>._(
+  ///   typedDataBaseOffset(_typedDataBase, offset, size, typeArgument)
+  /// );
+  /// ```
+  @override
+  ReturnStatement generateGetterStatement(
+      DartType dartType,
+      int fileOffset,
+      Map<Abi, int?> offsets,
+      bool unalignedAccess,
+      FfiTransformer transformer) {
+    InterfaceType typeArgument =
+        (dartType as InterfaceType).typeArguments.single as InterfaceType;
+    return ReturnStatement(ConstructorInvocation(
+        transformer.arrayConstructor,
+        Arguments([
+          transformer.typedDataBaseOffset(
+              transformer.getCompoundTypedDataBaseField(
+                  ThisExpression(), fileOffset),
+              transformer.runtimeBranchOnLayout(offsets),
+              transformer.runtimeBranchOnLayout(size),
+              typeArgument,
+              fileOffset),
+          ConstantExpression(IntConstant(length)),
+          transformer.intListConstantExpression(nestedDimensions)
+        ], types: [
+          typeArgument
+        ]))
+      ..fileOffset = fileOffset);
+  }
+
+  /// Sample output for `set x(Array #v) =>`:
+  ///
+  /// ```
+  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
+  /// ```
+  @override
+  ReturnStatement generateSetterStatement(
+          DartType dartType,
+          int fileOffset,
+          Map<Abi, int?> offsets,
+          bool unalignedAccess,
+          VariableDeclaration argument,
+          FfiTransformer transformer) =>
+      ReturnStatement(StaticInvocation(
+          transformer.memCopy,
+          Arguments([
+            transformer.getCompoundTypedDataBaseField(
+                ThisExpression(), fileOffset),
+            transformer.runtimeBranchOnLayout(offsets),
+            transformer.getArrayTypedDataBaseField(
+                VariableGet(argument), fileOffset),
+            ConstantExpression(IntConstant(0)),
+            transformer.runtimeBranchOnLayout(size),
+          ]))
+        ..fileOffset = fileOffset);
+}
+
+class AbiSpecificNativeTypeCfe implements NativeTypeCfe {
+  final Map<Abi, NativeTypeCfe> abiSpecificTypes;
+
+  final Class clazz;
+
+  AbiSpecificNativeTypeCfe(this.abiSpecificTypes, this.clazz);
+
+  @override
+  Map<Abi, int?> get size => abiSpecificTypes
+      .map((abi, nativeTypeCfe) => MapEntry(abi, nativeTypeCfe.size[abi]));
+
+  @override
+  Map<Abi, int?> get alignment => abiSpecificTypes
+      .map((abi, nativeTypeCfe) => MapEntry(abi, nativeTypeCfe.alignment[abi]));
+
+  @override
+  Constant generateConstant(FfiTransformer transformer) =>
+      TypeLiteralConstant(InterfaceType(clazz, Nullability.nonNullable));
+
+  @override
+  ReturnStatement generateGetterStatement(
+    DartType dartType,
+    int fileOffset,
+    Map<Abi, int?> offsets,
+    bool unalignedAccess,
+    FfiTransformer transformer,
+  ) {
+    return ReturnStatement(
+      transformer.abiSpecificLoadOrStoreExpression(
+        this,
+        typedDataBase: transformer.getCompoundTypedDataBaseField(
+            ThisExpression(), fileOffset),
+        offsetInBytes: transformer.runtimeBranchOnLayout(offsets),
+        fileOffset: fileOffset,
+      ),
+    );
+  }
+
+  @override
+  ReturnStatement generateSetterStatement(
+    DartType dartType,
+    int fileOffset,
+    Map<Abi, int?> offsets,
+    bool unalignedAccess,
+    VariableDeclaration argument,
+    FfiTransformer transformer,
+  ) {
+    return ReturnStatement(
+      transformer.abiSpecificLoadOrStoreExpression(
+        this,
+        typedDataBase: transformer.getCompoundTypedDataBaseField(
+            ThisExpression(), fileOffset),
+        offsetInBytes: transformer.runtimeBranchOnLayout(offsets),
+        value: VariableGet(argument),
+        fileOffset: fileOffset,
+      ),
+    );
+  }
+}
+
+extension on int? {
+  int? align(int? alignment) =>
+      ((this + alignment - 1) ~/ alignment) * alignment;
+
+  int? operator *(int? other) {
+    final this_ = this;
+    if (this_ == null) {
+      return null;
+    }
+    if (other == null) {
+      return null;
+    }
+    return this_ * other;
+  }
+
+  int? operator +(int? other) {
+    final this_ = this;
+    if (this_ == null) {
+      return null;
+    }
+    if (other == null) {
+      return null;
+    }
+    return this_ + other;
+  }
+
+  int? operator -(int? other) {
+    final this_ = this;
+    if (this_ == null) {
+      return null;
+    }
+    if (other == null) {
+      return null;
+    }
+    return this_ - other;
+  }
+
+  int? operator ~/(int? other) {
+    final this_ = this;
+    if (this_ == null) {
+      return null;
+    }
+    if (other == null) {
+      return null;
+    }
+    return this_ ~/ other;
+  }
+}
+
+int? max(int? a, int? b) {
+  if (a == null) {
+    return null;
+  }
+  if (b == null) {
+    return null;
+  }
+  return math.max(a, b);
+}
+
+int? min(int? a, int? b) {
+  if (a == null) {
+    return null;
+  }
+  if (b == null) {
+    return null;
+  }
+  return math.min(a, b);
+}
diff --git a/pkg/vm/lib/transformations/ffi/use_sites.dart b/pkg/vm/lib/transformations/ffi/use_sites.dart
index 744bc00..d0e44333 100644
--- a/pkg/vm/lib/transformations/ffi/use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi/use_sites.dart
@@ -26,14 +26,10 @@
 import 'package:kernel/type_algebra.dart' show Substitution;
 import 'package:kernel/type_environment.dart';
 
+import 'abi.dart' show wordSize;
+import 'native_type_cfe.dart';
 import 'common.dart'
-    show
-        NativeType,
-        FfiTransformer,
-        nativeTypeSizes,
-        WORD_SIZE,
-        UNKNOWN,
-        wordSize;
+    show NativeType, FfiTransformer, nativeTypeSizes, WORD_SIZE, UNKNOWN;
 
 /// Checks and replaces calls to dart:ffi compound fields and methods.
 void transformLibraries(
@@ -137,6 +133,42 @@
 
     final Member target = node.target;
     try {
+      if (target == abiSpecificIntegerPointerGetValue ||
+          target == abiSpecificIntegerPointerSetValue ||
+          target == abiSpecificIntegerPointerElemAt ||
+          target == abiSpecificIntegerPointerSetElemAt ||
+          target == abiSpecificIntegerArrayElemAt ||
+          target == abiSpecificIntegerArraySetElemAt) {
+        final pointer = node.arguments.positional[0];
+        final pointerType =
+            pointer.getStaticType(_staticTypeContext!) as InterfaceType;
+        _ensureNativeTypeValid(pointerType, pointer,
+            allowCompounds: true, allowInlineArray: true);
+
+        final typeArg = pointerType.typeArguments.single;
+        final nativeTypeCfe =
+            NativeTypeCfe(this, typeArg) as AbiSpecificNativeTypeCfe;
+
+        return abiSpecificLoadOrStoreExpression(
+          nativeTypeCfe,
+          typedDataBase: (target == abiSpecificIntegerArrayElemAt ||
+                  target == abiSpecificIntegerArraySetElemAt)
+              ? getArrayTypedDataBaseField(node.arguments.positional[0])
+              : node.arguments.positional[0],
+          index: (target == abiSpecificIntegerPointerElemAt ||
+                  target == abiSpecificIntegerPointerSetElemAt ||
+                  target == abiSpecificIntegerArrayElemAt ||
+                  target == abiSpecificIntegerArraySetElemAt)
+              ? node.arguments.positional[1]
+              : null,
+          value: (target == abiSpecificIntegerPointerSetValue ||
+                  target == abiSpecificIntegerPointerSetElemAt ||
+                  target == abiSpecificIntegerArraySetElemAt)
+              ? node.arguments.positional.last
+              : null,
+          fileOffset: node.fileOffset,
+        );
+      }
       if (target == structPointerRef ||
           target == structPointerElemAt ||
           target == unionPointerRef ||
@@ -790,13 +822,19 @@
         klass == opaqueClass ||
         klass == structClass ||
         klass == unionClass ||
+        klass == abiSpecificIntegerClass ||
         classNativeTypes[klass] != null) {
       return null;
     }
 
     // The Opaque and Struct classes can be extended, but subclasses
     // cannot be (nor implemented).
-    final onlyDirectExtendsClasses = [opaqueClass, structClass, unionClass];
+    final onlyDirectExtendsClasses = [
+      opaqueClass,
+      structClass,
+      unionClass,
+      abiSpecificIntegerClass,
+    ];
     final superClass = klass.superclass;
     for (final onlyDirectExtendsClass in onlyDirectExtendsClasses) {
       if (hierarchy.isSubtypeOf(klass, onlyDirectExtendsClass)) {
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index 61870d6..7cdec21 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -764,6 +764,16 @@
   /// different arguments reaches this limit.
   static const int maxInvocationsPerSelector = 5000;
 
+  /// [_DirectInvocation] can be approximated with raw arguments
+  /// if number of operations in its summary exceeds this threshold.
+  static const int largeSummarySize = 300;
+
+  /// If summary exceeds [largeSummarySize] and number of
+  /// [_DirectInvocation] objects with same selector but
+  /// different arguments exceeds this limit, then approximate
+  /// [_DirectInvocation] with raw arguments is created and used.
+  static const int maxDirectInvocationsPerSelector = 10;
+
   int count = 0;
   _Invocation? approximation;
 }
@@ -773,14 +783,19 @@
 class _InvocationsCache {
   final TypeFlowAnalysis _typeFlowAnalysis;
   final Set<_Invocation> _invocations = new Set<_Invocation>();
-  final Map<Selector, _SelectorApproximation> _approximations =
-      <Selector, _SelectorApproximation>{};
+  final Map<InterfaceSelector, _SelectorApproximation>
+      _interfaceSelectorApproximations =
+      <InterfaceSelector, _SelectorApproximation>{};
+  final Map<DirectSelector, _SelectorApproximation>
+      _directSelectorApproximations =
+      <DirectSelector, _SelectorApproximation>{};
 
   _InvocationsCache(this._typeFlowAnalysis);
 
   _Invocation getInvocation(Selector selector, Args<Type> args) {
     ++Statistics.invocationsQueriedInCache;
-    _Invocation invocation = (selector is DirectSelector)
+    final bool isDirectSelector = (selector is DirectSelector);
+    _Invocation invocation = isDirectSelector
         ? new _DirectInvocation(selector, args)
         : new _DispatchableInvocation(selector, args);
     _Invocation? result = _invocations.lookup(invocation);
@@ -788,12 +803,36 @@
       return result;
     }
 
-    if (selector is InterfaceSelector) {
+    if (isDirectSelector) {
+      // If there is a selector approximation (meaning the summary is large)
+      // then number of distinct invocations per selector should be limited
+      // in order to bound analysis time.
+
+      final sa = _directSelectorApproximations[selector];
+      if (sa != null) {
+        if (sa.count >=
+            _SelectorApproximation.maxDirectInvocationsPerSelector) {
+          _Invocation? approximation = sa.approximation;
+          if (approximation == null) {
+            final rawArgs =
+                _typeFlowAnalysis.summaryCollector.rawArguments(selector);
+            sa.approximation =
+                approximation = _DirectInvocation(selector, rawArgs);
+            approximation.init();
+            Statistics.approximateDirectInvocationsCreated++;
+          }
+          Statistics.approximateDirectInvocationsUsed++;
+          return approximation;
+        }
+        ++sa.count;
+      }
+    } else if (selector is InterfaceSelector) {
       // Detect if there are too many invocations per selector. In such case,
       // approximate extra invocations with a single invocation with raw
       // arguments.
 
-      final sa = (_approximations[selector] ??= new _SelectorApproximation());
+      final sa = (_interfaceSelectorApproximations[selector] ??=
+          new _SelectorApproximation());
 
       if (sa.count >= _SelectorApproximation.maxInvocationsPerSelector) {
         _Invocation? approximation = sa.approximation;
@@ -803,9 +842,9 @@
           sa.approximation =
               approximation = _DispatchableInvocation(selector, rawArgs);
           approximation.init();
-          Statistics.approximateInvocationsCreated++;
+          Statistics.approximateInterfaceInvocationsCreated++;
         }
-        Statistics.approximateInvocationsUsed++;
+        Statistics.approximateInterfaceInvocationsUsed++;
         return approximation;
       }
 
@@ -820,6 +859,10 @@
     ++Statistics.invocationsAddedToCache;
     return invocation;
   }
+
+  void addDirectSelectorApproximation(DirectSelector selector) {
+    _directSelectorApproximations[selector] ??= new _SelectorApproximation();
+  }
 }
 
 class _FieldValue extends _DependencyTracker {
@@ -1530,7 +1573,17 @@
   _Invocation get currentInvocation => workList.callStack.last;
 
   Summary getSummary(Member member) {
-    return _summaries[member] ??= summaryCollector.createSummary(member);
+    Summary? summary = _summaries[member];
+    if (summary == null) {
+      _summaries[member] = summary = summaryCollector.createSummary(member);
+      if (summary.statements.length >=
+          _SelectorApproximation.largeSummarySize) {
+        final DirectSelector selector =
+            currentInvocation.selector as DirectSelector;
+        _invocationsCache.addDirectSelectorApproximation(selector);
+      }
+    }
+    return summary;
   }
 
   _FieldValue getFieldValue(Field field) {
diff --git a/pkg/vm/lib/transformations/type_flow/rta.dart b/pkg/vm/lib/transformations/type_flow/rta.dart
new file mode 100644
index 0000000..df987e1
--- /dev/null
+++ b/pkg/vm/lib/transformations/type_flow/rta.dart
@@ -0,0 +1,528 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Rapid type analysis on kernel AST.
+
+import 'dart:core' hide Type;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/library_index.dart' show LibraryIndex;
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import 'calls.dart' as calls
+    show Selector, DirectSelector, InterfaceSelector, VirtualSelector;
+import 'native_code.dart'
+    show EntryPointsListener, NativeCodeOracle, PragmaEntryPointsVisitor;
+import 'protobuf_handler.dart' show ProtobufHandler;
+import 'types.dart' show TFClass, Type, ConcreteType;
+import '../pragma.dart' show ConstantPragmaAnnotationParser;
+
+class Selector {
+  final Name name;
+  final bool setter;
+
+  Selector(this.name, this.setter);
+
+  @override
+  int get hashCode => name.hashCode ^ setter.hashCode;
+
+  @override
+  bool operator ==(Object other) =>
+      other is Selector &&
+      this.name == other.name &&
+      this.setter == other.setter;
+}
+
+class ClassInfo extends TFClass {
+  final ClassInfo? superclass;
+  final Set<ClassInfo> supertypes; // All super-types including this.
+  final Set<ClassInfo> subclasses = Set<ClassInfo>();
+  final Set<ClassInfo> subtypes = Set<ClassInfo>();
+
+  final Set<Selector>
+      calledDynamicSelectors; // Selectors called with dynamic and interface calls.
+  final Set<Selector> calledVirtualSelectors;
+
+  bool isAllocated = false;
+
+  late final Map<Name, Member> _dispatchTargetsSetters =
+      _initDispatchTargets(true);
+  late final Map<Name, Member> _dispatchTargetsNonSetters =
+      _initDispatchTargets(false);
+
+  ClassInfo(int id, Class classNode, this.superclass, this.supertypes,
+      this.calledDynamicSelectors, this.calledVirtualSelectors)
+      : super(id, classNode) {
+    supertypes.add(this);
+    for (var sup in supertypes) {
+      sup.subtypes.add(this);
+    }
+    for (ClassInfo? sup = this; sup != null; sup = sup.superclass) {
+      sup.subclasses.add(this);
+    }
+  }
+
+  late final ConcreteType concreteType = ConcreteType(this, null);
+
+  Map<Name, Member> _initDispatchTargets(bool setters) {
+    Map<Name, Member> targets;
+    final superclass = this.superclass;
+    if (superclass != null) {
+      targets = Map.from(setters
+          ? superclass._dispatchTargetsSetters
+          : superclass._dispatchTargetsNonSetters);
+    } else {
+      targets = {};
+    }
+    for (Field f in classNode.fields) {
+      if (!f.isStatic && !f.isAbstract) {
+        if (!setters || f.hasSetter) {
+          targets[f.name] = f;
+        }
+      }
+    }
+    for (Procedure p in classNode.procedures) {
+      if (!p.isStatic && !p.isAbstract) {
+        if (p.isSetter == setters) {
+          targets[p.name] = p;
+        }
+      }
+    }
+    return targets;
+  }
+
+  Member? getDispatchTarget(Selector selector) {
+    return (selector.setter
+        ? _dispatchTargetsSetters
+        : _dispatchTargetsNonSetters)[selector.name];
+  }
+}
+
+class _ClassHierarchyCache {
+  final Map<Class, ClassInfo> classes = <Class, ClassInfo>{};
+  int _classIdCounter = 0;
+
+  _ClassHierarchyCache();
+
+  ClassInfo getClassInfo(Class c) {
+    return classes[c] ??= _createClassInfo(c);
+  }
+
+  ClassInfo _createClassInfo(Class c) {
+    final supertypes = Set<ClassInfo>();
+    final dynSel = Set<Selector>();
+    for (var sup in c.supers) {
+      final supInfo = getClassInfo(sup.classNode);
+      supertypes.addAll(supInfo.supertypes);
+      dynSel.addAll(supInfo.calledDynamicSelectors);
+    }
+    Class? superclassNode = c.superclass;
+    ClassInfo? superclass;
+    final virtSel = Set<Selector>();
+    if (superclassNode != null) {
+      superclass = getClassInfo(superclassNode);
+      virtSel.addAll(superclass.calledVirtualSelectors);
+    }
+    return ClassInfo(
+        ++_classIdCounter, c, superclass, supertypes, dynSel, virtSel);
+  }
+
+  ConcreteType addAllocatedClass(Class cl, RapidTypeAnalysis rta) {
+    assert(!cl.isAbstract);
+    final ClassInfo classInfo = getClassInfo(cl);
+    if (!classInfo.isAllocated) {
+      classInfo.isAllocated = true;
+      for (var sel in classInfo.calledDynamicSelectors) {
+        final member = classInfo.getDispatchTarget(sel);
+        if (member != null) {
+          rta.addMember(member);
+        }
+      }
+      for (var sel in classInfo.calledVirtualSelectors) {
+        final member = classInfo.getDispatchTarget(sel);
+        if (member != null) {
+          rta.addMember(member);
+        }
+      }
+    }
+    return classInfo.concreteType;
+  }
+
+  void addDynamicCall(Selector selector, Class cl, RapidTypeAnalysis rta) {
+    final ClassInfo classInfo = getClassInfo(cl);
+    for (var sub in classInfo.subtypes) {
+      if (sub.calledDynamicSelectors.add(selector) && sub.isAllocated) {
+        final member = sub.getDispatchTarget(selector);
+        if (member != null) {
+          rta.addMember(member);
+        }
+      }
+    }
+  }
+
+  void addVirtualCall(Selector selector, Class cl, RapidTypeAnalysis rta) {
+    final ClassInfo classInfo = getClassInfo(cl);
+    for (var sub in classInfo.subclasses) {
+      if (sub.calledVirtualSelectors.add(selector) && sub.isAllocated) {
+        final member = sub.getDispatchTarget(selector);
+        if (member != null) {
+          rta.addMember(member);
+        }
+      }
+    }
+  }
+}
+
+class RapidTypeAnalysis {
+  final CoreTypes coreTypes;
+  final ClassHierarchy hierarchy;
+  final _ClassHierarchyCache hierarchyCache = _ClassHierarchyCache();
+  final ProtobufHandler? protobufHandler;
+
+  final Set<Member> visited = {};
+  final List<Member> workList = [];
+
+  RapidTypeAnalysis(Component component, this.coreTypes, this.hierarchy,
+      LibraryIndex libraryIndex, this.protobufHandler) {
+    Procedure? main = component.mainMethod;
+    if (main != null) {
+      addMember(main);
+    }
+    final annotationMatcher = ConstantPragmaAnnotationParser(coreTypes);
+    final nativeCodeOracle = NativeCodeOracle(libraryIndex, annotationMatcher);
+    component.accept(PragmaEntryPointsVisitor(
+        _EntryPointsListenerImpl(this), nativeCodeOracle, annotationMatcher));
+    run();
+  }
+
+  List<Class> get allocatedClasses {
+    return <Class>[
+      for (var entry in hierarchyCache.classes.entries)
+        if (entry.value.isAllocated) entry.key
+    ];
+  }
+
+  bool isAllocatedClass(Class cl) =>
+      hierarchyCache.classes[cl]?.isAllocated ?? false;
+
+  ConcreteType addAllocatedClass(Class cl) =>
+      hierarchyCache.addAllocatedClass(cl, this);
+
+  void addMember(Member member) {
+    if (visited.add(member)) {
+      workList.add(member);
+    }
+  }
+
+  void addCall(Class? currentClass, Member? interfaceTarget, Name name,
+      bool isVirtual, bool isSetter) {
+    final Class cl = isVirtual
+        ? currentClass!
+        : (interfaceTarget != null
+            ? interfaceTarget.enclosingClass!
+            : coreTypes.objectClass);
+    final Selector selector = Selector(name, isSetter);
+    if (isVirtual) {
+      hierarchyCache.addVirtualCall(selector, cl, this);
+    } else {
+      hierarchyCache.addDynamicCall(selector, cl, this);
+    }
+  }
+
+  void run() {
+    final memberVisitor = _MemberVisitor(this);
+    while (workList.isNotEmpty || invalidateProtobufFields()) {
+      final member = workList.removeLast();
+      protobufHandler?.beforeSummaryCreation(member);
+      member.accept(memberVisitor);
+    }
+  }
+
+  bool invalidateProtobufFields() {
+    final protobufHandler = this.protobufHandler;
+    if (protobufHandler == null) {
+      return false;
+    }
+    final fields = protobufHandler.getInvalidatedFields();
+    if (fields.isEmpty) {
+      return false;
+    }
+    // Protobuf handler replaced contents of static field initializers.
+    bool invalidated = false;
+    for (var field in fields) {
+      assert(field.isStatic);
+      if (visited.contains(field)) {
+        workList.add(field);
+        invalidated = true;
+      }
+    }
+    return invalidated;
+  }
+}
+
+class _MemberVisitor extends RecursiveVisitor {
+  final RapidTypeAnalysis rta;
+  final _ConstantVisitor _constantVisitor;
+
+  Class? _currentClass;
+  ClassInfo? _superclassInfo;
+
+  _MemberVisitor(this.rta) : _constantVisitor = _ConstantVisitor(rta);
+
+  ClassInfo get superclassInfo => _superclassInfo ??=
+      rta.hierarchyCache.getClassInfo(_currentClass!.superclass!);
+
+  @override
+  void defaultMember(Member node) {
+    _superclassInfo = null;
+    _currentClass = node.enclosingClass;
+    node.visitChildren(this);
+    if (node is Constructor) {
+      // Make sure instance field initializers are visited.
+      for (var f in _currentClass!.members) {
+        if (f is Field && !f.isStatic) {
+          f.initializer?.accept(this);
+        }
+      }
+    }
+    _superclassInfo = null;
+    _currentClass = null;
+  }
+
+  @override
+  void visitConstructorInvocation(ConstructorInvocation node) {
+    rta.addAllocatedClass(node.constructedType.classNode);
+    rta.addMember(node.target);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitInstanceInvocation(InstanceInvocation node) {
+    rta.addCall(_currentClass, node.interfaceTarget, node.name,
+        node.receiver is ThisExpression, false);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitDynamicInvocation(DynamicInvocation node) {
+    rta.addCall(null, null, node.name, false, false);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitEqualsCall(EqualsCall node) {
+    rta.addCall(_currentClass, node.interfaceTarget, node.interfaceTarget.name,
+        node.left is ThisExpression, false);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitInstanceGet(InstanceGet node) {
+    rta.addCall(_currentClass, node.interfaceTarget, node.name,
+        node.receiver is ThisExpression, false);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitInstanceTearOff(InstanceTearOff node) {
+    rta.addCall(_currentClass, node.interfaceTarget, node.name,
+        node.receiver is ThisExpression, false);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitDynamicGet(DynamicGet node) {
+    rta.addCall(null, null, node.name, false, false);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitInstanceSet(InstanceSet node) {
+    rta.addCall(_currentClass, node.interfaceTarget, node.name,
+        node.receiver is ThisExpression, true);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitDynamicSet(DynamicSet node) {
+    rta.addCall(null, null, node.name, false, true);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSuperMethodInvocation(SuperMethodInvocation node) {
+    final target = superclassInfo.getDispatchTarget(Selector(node.name, false));
+    if (target != null) {
+      rta.addMember(target);
+    }
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSuperPropertyGet(SuperPropertyGet node) {
+    final target = superclassInfo.getDispatchTarget(Selector(node.name, false));
+    if (target != null) {
+      rta.addMember(target);
+    }
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSuperPropertySet(SuperPropertySet node) {
+    final target = superclassInfo.getDispatchTarget(Selector(node.name, true));
+    if (target != null) {
+      rta.addMember(target);
+    }
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitStaticGet(StaticGet node) {
+    rta.addMember(node.target);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitStaticInvocation(StaticInvocation node) {
+    rta.addMember(node.target);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitStaticSet(StaticSet node) {
+    rta.addMember(node.target);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitRedirectingInitializer(RedirectingInitializer node) {
+    rta.addMember(node.target);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSuperInitializer(SuperInitializer node) {
+    // Re-resolve target due to partial mixin resolution.
+    for (var replacement in _currentClass!.superclass!.constructors) {
+      if (node.target.name == replacement.name) {
+        rta.addMember(replacement);
+        break;
+      }
+    }
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitConstantExpression(ConstantExpression node) {
+    _constantVisitor.visit(node.constant);
+  }
+}
+
+class _ConstantVisitor extends ConstantVisitor<void> {
+  final RapidTypeAnalysis rta;
+  final Set<Constant> visited = {};
+
+  _ConstantVisitor(this.rta);
+
+  void visit(Constant constant) {
+    if (visited.add(constant)) {
+      constant.accept(this);
+    }
+  }
+
+  @override
+  void defaultConstant(Constant node) {}
+
+  @override
+  void visitListConstant(ListConstant constant) {
+    for (final entry in constant.entries) {
+      visit(entry);
+    }
+  }
+
+  @override
+  void visitMapConstant(MapConstant constant) {
+    for (final entry in constant.entries) {
+      visit(entry.key);
+      visit(entry.value);
+    }
+  }
+
+  @override
+  void visitSetConstant(SetConstant constant) {
+    for (final entry in constant.entries) {
+      visit(entry);
+    }
+  }
+
+  @override
+  void visitInstanceConstant(InstanceConstant constant) {
+    rta.addAllocatedClass(constant.classNode);
+    for (var value in constant.fieldValues.values) {
+      visit(value);
+    }
+  }
+
+  void _visitTearOffConstant(TearOffConstant constant) {
+    final Member member = constant.target;
+    rta.addMember(member);
+    if (member is Constructor) {
+      rta.addAllocatedClass(member.enclosingClass);
+    }
+  }
+
+  @override
+  void visitStaticTearOffConstant(StaticTearOffConstant constant) =>
+      _visitTearOffConstant(constant);
+
+  @override
+  void visitConstructorTearOffConstant(ConstructorTearOffConstant constant) =>
+      _visitTearOffConstant(constant);
+
+  @override
+  void visitRedirectingFactoryTearOffConstant(
+          RedirectingFactoryTearOffConstant constant) =>
+      _visitTearOffConstant(constant);
+
+  @override
+  void visitInstantiationConstant(InstantiationConstant constant) {
+    visit(constant.tearOffConstant);
+  }
+}
+
+class _EntryPointsListenerImpl implements EntryPointsListener {
+  final RapidTypeAnalysis rta;
+
+  _EntryPointsListenerImpl(this.rta);
+
+  @override
+  void addFieldUsedInConstant(Field field, Type instance, Type value) {}
+
+  @override
+  void addRawCall(calls.Selector selector) {
+    if (selector is calls.DirectSelector) {
+      rta.addMember(selector.member);
+    } else if (selector is calls.InterfaceSelector) {
+      rta.addCall(selector.member.enclosingClass!, selector.member,
+          selector.name, selector is calls.VirtualSelector, selector.isSetter);
+    } else {
+      throw 'Unexpected selector ${selector.runtimeType} $selector';
+    }
+  }
+
+  @override
+  ConcreteType addAllocatedClass(Class c) => rta.addAllocatedClass(c);
+
+  @override
+  void recordMemberCalledViaInterfaceSelector(Member target) =>
+      throw 'Unsupported operation';
+
+  @override
+  void recordMemberCalledViaThis(Member target) =>
+      throw 'Unsupported operation';
+
+  @override
+  void recordTearOff(Member target) => throw 'Unsupported operation';
+}
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index 72b0b68..a309138 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -682,8 +682,8 @@
       if (staticTypeForNarrowing != null) {
         types[i] = argType.intersection(staticTypeForNarrowing, typeHierarchy);
       } else {
-        // TODO(sjindel/tfa): Narrowing is performed inside a [TypeCheck] later.
-        types[i] = args[i];
+        // Narrowing is performed inside a [TypeCheck] later.
+        types[i] = argType;
       }
     }
 
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 00efc64..d82925a 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -20,6 +20,7 @@
 import 'calls.dart';
 import 'signature_shaking.dart';
 import 'protobuf_handler.dart' show ProtobufHandler;
+import 'rta.dart' show RapidTypeAnalysis;
 import 'summary.dart';
 import 'table_selector_assigner.dart';
 import 'types.dart';
@@ -44,7 +45,8 @@
     {PragmaAnnotationParser? matcher,
     bool treeShakeSignatures: true,
     bool treeShakeWriteOnlyFields: true,
-    bool treeShakeProtobufs: false}) {
+    bool treeShakeProtobufs: false,
+    bool useRapidTypeAnalysis: true}) {
   void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
   final hierarchy = new ClassHierarchy(component, coreTypes,
           onAmbiguousSupertypes: ignoreAmbiguousSupertypes)
@@ -58,6 +60,25 @@
       : null;
 
   Statistics.reset();
+
+  CleanupAnnotations(coreTypes, libraryIndex, protobufHandler)
+      .visitComponent(component);
+
+  Stopwatch? rtaStopWatch;
+  RapidTypeAnalysis? rta;
+  if (useRapidTypeAnalysis) {
+    // Rapid type analysis (RTA) is used to quickly calculate
+    // the set of allocated classes to make the subsequent
+    // type flow analysis converge much faster.
+    rtaStopWatch = new Stopwatch()..start();
+    final protobufHandlerRta = treeShakeProtobufs
+        ? ProtobufHandler.forComponent(component, coreTypes)
+        : null;
+    rta = RapidTypeAnalysis(
+        component, coreTypes, hierarchy, libraryIndex, protobufHandlerRta);
+    rtaStopWatch.stop();
+  }
+
   final analysisStopWatch = new Stopwatch()..start();
 
   MoveFieldInitializers().transformComponent(component);
@@ -81,8 +102,11 @@
     typeFlowAnalysis.addRawCall(mainSelector);
   }
 
-  CleanupAnnotations(coreTypes, libraryIndex, protobufHandler)
-      .visitComponent(component);
+  if (useRapidTypeAnalysis) {
+    for (Class c in rta!.allocatedClasses) {
+      typeFlowAnalysis.addAllocatedClass(c);
+    }
+  }
 
   typeFlowAnalysis.process();
 
@@ -119,6 +143,9 @@
 
   transformsStopWatch.stop();
 
+  if (useRapidTypeAnalysis) {
+    statPrint("RTA took ${rtaStopWatch!.elapsedMilliseconds}ms");
+  }
   statPrint("TF analysis took ${analysisStopWatch.elapsedMilliseconds}ms");
   statPrint("TF transforms took ${transformsStopWatch.elapsedMilliseconds}ms");
 
@@ -160,7 +187,7 @@
         if (!_isRedirectingConstructor(c)) c
     ];
 
-    assert(constructors.isNotEmpty);
+    assert(constructors.isNotEmpty || cls.isMixinDeclaration);
 
     // Move field initializers to constructors.
     // Clone AST for all constructors except the first.
@@ -315,13 +342,7 @@
     Constant? constantValue;
     bool isInt = false;
 
-    // Note: the explicit type `bool` is needed because the checked-in version
-    // of the CFE that we use for bootstrapping doesn't yet have constructor
-    // tearoffs enabled, and the fix for bug
-    // https://github.com/dart-lang/language/issues/1785 only takes effect when
-    // constructor tearoffs are enabled.  TODO(paulberry): remove the type after
-    // the bootstrap CFE enables constructor tearoffs.
-    final bool nullable = type is NullableType;
+    final nullable = type is NullableType;
     if (nullable) {
       type = type.baseType;
     }
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index c85dfc7..42f54c0 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -188,8 +188,10 @@
   static int invocationsQueriedInCache = 0;
   static int invocationsAddedToCache = 0;
   static int maxInvocationsCachedPerSelector = 0;
-  static int approximateInvocationsCreated = 0;
-  static int approximateInvocationsUsed = 0;
+  static int approximateDirectInvocationsCreated = 0;
+  static int approximateDirectInvocationsUsed = 0;
+  static int approximateInterfaceInvocationsCreated = 0;
+  static int approximateInterfaceInvocationsUsed = 0;
   static int deepInvocationsDeferred = 0;
   static int classesDropped = 0;
   static int membersDropped = 0;
@@ -222,8 +224,10 @@
     invocationsQueriedInCache = 0;
     invocationsAddedToCache = 0;
     maxInvocationsCachedPerSelector = 0;
-    approximateInvocationsCreated = 0;
-    approximateInvocationsUsed = 0;
+    approximateDirectInvocationsCreated = 0;
+    approximateDirectInvocationsUsed = 0;
+    approximateInterfaceInvocationsCreated = 0;
+    approximateInterfaceInvocationsUsed = 0;
     deepInvocationsDeferred = 0;
     classesDropped = 0;
     membersDropped = 0;
@@ -267,8 +271,10 @@
     ${invocationsQueriedInCache} invocations queried in cache
     ${invocationsAddedToCache} invocations added to cache
     ${maxInvocationsCachedPerSelector} maximum invocations cached per selector
-    ${approximateInvocationsCreated} approximate invocations created
-    ${approximateInvocationsUsed} times approximate invocation is used
+    ${approximateDirectInvocationsCreated} approximate direct invocations created
+    ${approximateDirectInvocationsUsed} times direct interface invocation is used
+    ${approximateInterfaceInvocationsCreated} approximate interface invocations created
+    ${approximateInterfaceInvocationsUsed} times approximate interface invocation is used
     ${deepInvocationsDeferred} times invocation processing was deferred due to deep call stack
     ${classesDropped} classes dropped
     ${membersDropped} members dropped
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index 3ae9534..4086172 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -4,7 +4,7 @@
 publish_to: none
 
 environment:
-  sdk: '>=2.12.0 <3.0.0'
+  sdk: '>=2.15.0 <3.0.0'
 
 dependencies:
   args: ^2.0.0
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index b24cb9e..62a66f4 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -12,6 +12,7 @@
         CompilerOptions,
         DiagnosticMessage,
         ExperimentalFlag,
+        IncrementalCompilerResult,
         computePlatformBinariesLocation;
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 import 'package:kernel/binary/ast_to_binary.dart';
@@ -65,7 +66,8 @@
 
     test('compile', () async {
       IncrementalCompiler compiler = new IncrementalCompiler(options, main.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
 
       final StringBuffer buffer = new StringBuffer();
       new Printer(buffer, showMetadata: true)
@@ -83,7 +85,8 @@
         ..embedSourceText = false;
       IncrementalCompiler compiler =
           new IncrementalCompiler(optionsExcludeSources, main.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
 
       for (Source source in component.uriToSource.values) {
         expect(source.source.length, equals(0));
@@ -319,7 +322,8 @@
 
     compileAndSerialize(
         File mainDill, File libDill, IncrementalCompiler compiler) async {
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       new BinaryPrinter(new DevNullSink<List<int>>())
           .writeComponentFile(component);
       IOSink sink = mainDill.openWrite();
@@ -621,7 +625,8 @@
       // collector helper in this file.
       File libDill = File(p.join(dir.path, p.basename(lib1.path + ".dill")));
       IncrementalCompiler compiler = new IncrementalCompiler(options, lib1.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       expect(component.libraries.length, equals(1));
       expect(component.libraries.single.fileUri, equals(lib1.uri));
       IOSink sink = libDill.openWrite();
@@ -649,7 +654,8 @@
       // Then compile lib, run and verify coverage (un-named constructor
       // covered, and the named constructor coveraged too).
       File mainDill = File(p.join(dir.path, p.basename(main.path + ".dill")));
-      component = await compiler.compile(entryPoint: main.uri);
+      compilerResult = await compiler.compile(entryPoint: main.uri);
+      component = compilerResult.component;
       expect(component.libraries.length, equals(1));
       expect(component.libraries.single.fileUri, equals(main.uri));
       sink = mainDill.openWrite();
@@ -706,7 +712,8 @@
       int newLineForUnnamedConstructor = 8;
       int newLineForNamedConstructor = 9;
       compiler.invalidate(lib1.uri);
-      component = await compiler.compile(entryPoint: lib1.uri);
+      compilerResult = await compiler.compile(entryPoint: lib1.uri);
+      component = compilerResult.component;
       expect(component.libraries.length, equals(1));
       expect(component.libraries.single.fileUri, equals(lib1.uri));
       sink = libDill.openWrite();
@@ -794,7 +801,8 @@
 
     compileAndSerialize(File mainDill, File lib1Dill, File lib2Dill,
         IncrementalCompiler compiler) async {
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       new BinaryPrinter(new DevNullSink<List<int>>())
           .writeComponentFile(component);
       IOSink sink = mainDill.openWrite();
@@ -901,7 +909,8 @@
           "openReceivePortSoWeWontDie() { new RawReceivePort(); }\n");
 
       IncrementalCompiler compiler = new IncrementalCompiler(options, file.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
 
       File outputFile = new File('${mytest.path}/foo.dart.dill');
       await _writeProgramToFile(component, outputFile);
@@ -948,7 +957,8 @@
       compiler.accept();
 
       // Confirm that without changes VM reloads nothing.
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       await _writeProgramToFile(component, outputFile);
       var reloadResult = await remoteVm.reload(new Uri.file(outputFile.path));
       expect(reloadResult['success'], isTrue);
@@ -957,7 +967,8 @@
       // Introduce a change that force VM to reject the change.
       fileBar.writeAsStringSync("class A<T,U> { int _a = 0; }\n");
       compiler.invalidate(fileBar.uri);
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       await _writeProgramToFile(component, outputFile);
       reloadResult = await remoteVm.reload(new Uri.file(outputFile.path));
       expect(reloadResult['success'], isFalse);
@@ -965,7 +976,8 @@
       // Fix a change so VM is happy to accept the change.
       fileBar.writeAsStringSync("class A<T> { int _a = 0; hi() => _a; }\n");
       compiler.invalidate(fileBar.uri);
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       await _writeProgramToFile(component, outputFile);
       reloadResult = await remoteVm.reload(new Uri.file(outputFile.path));
       expect(reloadResult['success'], isTrue);
@@ -1018,7 +1030,9 @@
       IncrementalCompiler compiler =
           new IncrementalCompiler(optionsModified, packageEntry);
       {
-        Component component = await compiler.compile(entryPoint: packageEntry);
+        IncrementalCompilerResult compilerResult =
+            await compiler.compile(entryPoint: packageEntry);
+        Component component = compilerResult.component;
         File outputFile = new File('${mytest.path}/foo.dart.dill');
         await _writeProgramToFile(component, outputFile);
       }
@@ -1033,7 +1047,9 @@
           .writeAsStringSync("class A { static int b; }\n");
       compiler.invalidate(barUri);
       {
-        Component component = await compiler.compile(entryPoint: packageEntry);
+        IncrementalCompilerResult compilerResult =
+            await compiler.compile(entryPoint: packageEntry);
+        Component component = compilerResult.component;
         File outputFile = new File('${mytest.path}/foo1.dart.dill');
         await _writeProgramToFile(component, outputFile);
       }
@@ -1076,7 +1092,9 @@
       Library fooLib;
       Library barLib;
       {
-        final Component component = await compiler.compile(entryPoint: fooUri);
+        final IncrementalCompilerResult compilerResult =
+            await compiler.compile(entryPoint: fooUri);
+        final Component component = compilerResult.component;
         expect(component.libraries.length, equals(2));
         fooLib = component.libraries.firstWhere((lib) => lib.fileUri == fooUri);
         barLib = component.libraries.firstWhere((lib) => lib.fileUri == barUri);
@@ -1104,7 +1122,9 @@
         """);
       compiler.invalidate(barUri);
       {
-        final Component component = await compiler.compile(entryPoint: fooUri);
+        final IncrementalCompilerResult compilerResult =
+            await compiler.compile(entryPoint: fooUri);
+        final Component component = compilerResult.component;
         final Library? fooLib2 = component.libraries
             .firstWhereOrNull((lib) => lib.fileUri == fooUri);
         expect(fooLib2, isNull);
@@ -1125,10 +1145,10 @@
         expect(lrc.librariesReferenced, equals(<Library>{barLib}));
       }
       {
-        // Verify that the saved "last known good" compnent only contains links
+        // Verify that the saved "last known good" component only contains links
         // to the original 'foo' and 'bar' libraries.
         final LibraryReferenceCollector lrc = new LibraryReferenceCollector();
-        compiler.lastKnownGoodComponent!.accept(lrc);
+        compiler.lastKnownGoodResult!.component.accept(lrc);
         expect(lrc.librariesReferenced, equals(<Library>{fooLib, barLib}));
       }
       {
@@ -1272,7 +1292,8 @@
       """);
       IncrementalCompiler compiler =
           new IncrementalCompiler(options, mainFile.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
       IOSink sink = mainDill.openWrite();
       new BinaryPrinter(sink).writeComponentFile(component);
@@ -1345,7 +1366,8 @@
       """);
       IncrementalCompiler compiler =
           new IncrementalCompiler(options, mainFile.uri);
-      Component component = await compiler.compile();
+      IncrementalCompilerResult compilerResult = await compiler.compile();
+      Component component = compilerResult.component;
       File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
       IOSink sink = mainDill.openWrite();
       new BinaryPrinter(sink).writeComponentFile(component);
@@ -1367,7 +1389,8 @@
         }
       """);
       compiler.invalidate(helperFile.uri);
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       File partial1Dill =
           new File.fromUri(mainFile.uri.resolve("partial1.dill"));
       sink = partial1Dill.openWrite();
@@ -1393,7 +1416,8 @@
         }
       """);
       compiler.invalidate(helperFile.uri);
-      component = await compiler.compile();
+      compilerResult = await compiler.compile();
+      component = compilerResult.component;
       File partial2Dill =
           new File.fromUri(mainFile.uri.resolve("partial2.dill"));
       sink = partial2Dill.openWrite();
@@ -1519,7 +1543,8 @@
         IncrementalCompiler compiler =
             new IncrementalCompiler(optionsModified, mainUri);
 
-        Component component = await compiler.compile();
+        IncrementalCompilerResult compilerResult = await compiler.compile();
+        Component component = compilerResult.component;
         File mainDill = new File.fromUri(mainFile.uri.resolve("main.dill"));
         IOSink sink = mainDill.openWrite();
         new BinaryPrinter(sink).writeComponentFile(component);
diff --git a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
index 741c2b9..4febdf9 100644
--- a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
+++ b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
@@ -92,17 +92,19 @@
   );
 }
 
-main() async {
-  final testCases = Directory(path.join(
-    pkgVmDir,
-    'testcases',
-    'transformations',
-    'type_flow',
-    'transformer',
-    'protobuf_handler',
-    'lib',
-  )).listSync().where((f) => f.path.endsWith('_test.dart'));
-  for (final entry in testCases) {
-    test(entry.path, () => runTestCase(entry.uri));
-  }
+main() {
+  group('protobuf-aware-treeshaker', () {
+    final testCases = Directory(path.join(
+      pkgVmDir,
+      'testcases',
+      'transformations',
+      'type_flow',
+      'transformer',
+      'protobuf_handler',
+      'lib',
+    )).listSync().where((f) => f.path.endsWith('_test.dart'));
+    for (final entry in testCases) {
+      test(entry.path, () => runTestCase(entry.uri));
+    }
+  }, timeout: Timeout.none);
 }
diff --git a/pkg/vm/testcases/transformations/ffi/abi_specific_int.dart b/pkg/vm/testcases/transformations/ffi/abi_specific_int.dart
new file mode 100644
index 0000000..50266bd
--- /dev/null
+++ b/pkg/vm/testcases/transformations/ffi/abi_specific_int.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint32(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint32(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint32(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint32(),
+  Abi.iosX64: Uint32(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint32(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint32(),
+  Abi.macosArm64: Uint32(),
+  Abi.macosX64: Uint32(),
+  Abi.windowsArm64: Uint16(),
+  Abi.windowsIA32: Uint16(),
+  Abi.windowsX64: Uint16(),
+})
+class WChar extends AbiSpecificInteger {
+  const WChar();
+}
+
+void main() {
+  testSizeOf();
+  testStoreLoad();
+  testStoreLoadIndexed();
+  testStruct();
+  testInlineArray();
+}
+
+void testSizeOf() {
+  final size = sizeOf<WChar>();
+  print(size);
+}
+
+void testStoreLoad() {
+  final p = noAlloc<WChar>();
+  p.value = 10;
+  print(p.value);
+  noAlloc.free(p);
+}
+
+void testStoreLoadIndexed() {
+  final p = noAlloc<WChar>(2);
+  p[0] = 10;
+  p[1] = 3;
+  print(p[0]);
+  print(p[1]);
+  noAlloc.free(p);
+}
+
+class WCharStruct extends Struct {
+  @WChar()
+  external int a0;
+
+  @WChar()
+  external int a1;
+}
+
+void testStruct() {
+  final p = noAlloc<WCharStruct>();
+  p.ref.a0 = 1;
+  print(p.ref.a0);
+  p.ref.a0 = 2;
+  print(p.ref.a0);
+  noAlloc.free(p);
+}
+
+class WCharArrayStruct extends Struct {
+  @Array(100)
+  external Array<WChar> a0;
+}
+
+void testInlineArray() {
+  final p = noAlloc<WCharArrayStruct>();
+  final array = p.ref.a0;
+  for (int i = 0; i < 100; i++) {
+    array[i] = i;
+  }
+  for (int i = 0; i < 100; i++) {
+    print(array[i]);
+  }
+  noAlloc.free(p);
+}
+
+const noAlloc = _DummyAllocator();
+
+class _DummyAllocator implements Allocator {
+  const _DummyAllocator();
+
+  @override
+  Pointer<T> allocate<T extends NativeType>(int byteCount, {int? alignment}) {
+    return Pointer.fromAddress(0);
+  }
+
+  @override
+  void free(Pointer pointer) {}
+}
diff --git a/pkg/vm/testcases/transformations/ffi/abi_specific_int.dart.expect b/pkg/vm/testcases/transformations/ffi/abi_specific_int.dart.expect
new file mode 100644
index 0000000..d8ba7e5
--- /dev/null
+++ b/pkg/vm/testcases/transformations/ffi/abi_specific_int.dart.expect
@@ -0,0 +1,205 @@
+library #lib /*isNonNullableByDefault*/;
+import self as self;
+import "dart:ffi" as ffi;
+import "dart:core" as core;
+import "dart:typed_data" as typ;
+import "dart:_internal" as _in;
+
+import "dart:ffi";
+
+@#C49
+@#C56
+class WChar extends ffi::AbiSpecificInteger /*hasConstConstructor*/  {
+  const constructor •() → self::WChar
+    : super ffi::AbiSpecificInteger::•()
+    ;
+  @#C59
+  static get #sizeOf() → core::int*
+    return #C61.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
+}
+@#C66
+class WCharStruct extends ffi::Struct {
+  synthetic constructor •() → self::WCharStruct
+    : super ffi::Struct::•()
+    ;
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::WCharStruct
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+  @#C67
+  get a0() → core::int
+    return ffi::_loadAbiSpecificInt<self::WChar>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C68.{core::List::[]}(ffi::_abi()){(core::int) → core::int*});
+  @#C67
+  set a0(core::int #externalFieldValue) → void
+    return ffi::_storeAbiSpecificInt<self::WChar>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C68.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue);
+  @#C67
+  get a1() → core::int
+    return ffi::_loadAbiSpecificInt<self::WChar>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C61.{core::List::[]}(ffi::_abi()){(core::int) → core::int*});
+  @#C67
+  set a1(core::int #externalFieldValue) → void
+    return ffi::_storeAbiSpecificInt<self::WChar>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C61.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue);
+  @#C59
+  static get #sizeOf() → core::int*
+    return #C70.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
+}
+@#C75
+class WCharArrayStruct extends ffi::Struct {
+  synthetic constructor •() → self::WCharArrayStruct
+    : super ffi::Struct::•()
+    ;
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::WCharArrayStruct
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+  @#C76
+  get a0() → ffi::Array<self::WChar>
+    return new ffi::Array::_<self::WChar>( block {
+      core::Object #typedDataBase = this.{ffi::_Compound::_typedDataBase}{core::Object};
+      core::int #offset = #C68.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<self::WChar>(#typedDataBase.{ffi::Pointer::address}{core::int}.{core::num::+}(#offset){(core::num) → core::num}) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}{typ::ByteBuffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}{core::int}.{core::num::+}(#offset){(core::num) → core::num}, #C80.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}){([core::int, core::int?]) → typ::Uint8List}, #C71, #C81);
+  @#C76
+  set a0(ffi::Array<self::WChar> #externalFieldValue) → void
+    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C68.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue.{ffi::Array::_typedDataBase}{core::Object}, #C1, #C80.{core::List::[]}(ffi::_abi()){(core::int) → core::int*});
+  @#C59
+  static get #sizeOf() → core::int*
+    return #C80.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
+}
+class _DummyAllocator extends core::Object implements ffi::Allocator /*hasConstConstructor*/  {
+  const constructor •() → self::_DummyAllocator
+    : super core::Object::•()
+    ;
+  @#C82
+  method allocate<T extends ffi::NativeType>(core::int byteCount, {core::int? alignment = #C58}) → ffi::Pointer<self::_DummyAllocator::allocate::T> {
+    return ffi::Pointer::fromAddress<self::_DummyAllocator::allocate::T>(0);
+  }
+  @#C82
+  method free(ffi::Pointer<ffi::NativeType> pointer) → void {}
+}
+static const field self::_DummyAllocator noAlloc = #C83;
+static method main() → void {
+  self::testSizeOf();
+  self::testStoreLoad();
+  self::testStoreLoadIndexed();
+  self::testStruct();
+  self::testInlineArray();
+}
+static method testSizeOf() → void {
+  final core::int size = self::WChar::#sizeOf;
+  core::print(size);
+}
+static method testStoreLoad() → void {
+  final ffi::Pointer<self::WChar> p = #C83.{ffi::Allocator::allocate}<self::WChar>(self::WChar::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::WChar>};
+  ffi::_storeAbiSpecificInt<self::WChar>(p, #C1, 10);
+  core::print(ffi::_loadAbiSpecificInt<self::WChar>(p, #C1));
+  #C83.{self::_DummyAllocator::free}(p){(ffi::Pointer<ffi::NativeType>) → void};
+}
+static method testStoreLoadIndexed() → void {
+  final ffi::Pointer<self::WChar> p = #C83.{ffi::Allocator::allocate}<self::WChar>(2.{core::num::*}(self::WChar::#sizeOf){(core::num) → core::num}){(core::int, {alignment: core::int?}) → ffi::Pointer<self::WChar>};
+  ffi::_storeAbiSpecificIntAtIndex<self::WChar>(p, 0, 10);
+  ffi::_storeAbiSpecificIntAtIndex<self::WChar>(p, 1, 3);
+  core::print(ffi::_loadAbiSpecificIntAtIndex<self::WChar>(p, 0));
+  core::print(ffi::_loadAbiSpecificIntAtIndex<self::WChar>(p, 1));
+  #C83.{self::_DummyAllocator::free}(p){(ffi::Pointer<ffi::NativeType>) → void};
+}
+static method testStruct() → void {
+  final ffi::Pointer<self::WCharStruct> p = #C83.{ffi::Allocator::allocate}<self::WCharStruct>(self::WCharStruct::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::WCharStruct>};
+  new self::WCharStruct::#fromTypedDataBase(p!).{self::WCharStruct::a0} = 1;
+  core::print(new self::WCharStruct::#fromTypedDataBase(p!).{self::WCharStruct::a0}{core::int});
+  new self::WCharStruct::#fromTypedDataBase(p!).{self::WCharStruct::a0} = 2;
+  core::print(new self::WCharStruct::#fromTypedDataBase(p!).{self::WCharStruct::a0}{core::int});
+  #C83.{self::_DummyAllocator::free}(p){(ffi::Pointer<ffi::NativeType>) → void};
+}
+static method testInlineArray() → void {
+  final ffi::Pointer<self::WCharArrayStruct> p = #C83.{ffi::Allocator::allocate}<self::WCharArrayStruct>(self::WCharArrayStruct::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::WCharArrayStruct>};
+  final ffi::Array<self::WChar> array = new self::WCharArrayStruct::#fromTypedDataBase(p!).{self::WCharArrayStruct::a0}{ffi::Array<self::WChar>};
+  for (core::int i = 0; i.{core::num::<}(100){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    ffi::_storeAbiSpecificIntAtIndex<self::WChar>(array.{ffi::Array::_typedDataBase}{core::Object}, i, i);
+  }
+  for (core::int i = 0; i.{core::num::<}(100){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    core::print(ffi::_loadAbiSpecificIntAtIndex<self::WChar>(array.{ffi::Array::_typedDataBase}{core::Object}, i));
+  }
+  #C83.{self::_DummyAllocator::free}(p){(ffi::Pointer<ffi::NativeType>) → void};
+}
+constants  {
+  #C1 = 0
+  #C2 = "android"
+  #C3 = ffi::_OS {index:#C1, _name:#C2}
+  #C4 = "arm"
+  #C5 = ffi::_Architecture {index:#C1, _name:#C4}
+  #C6 = ffi::Abi {_os:#C3, _architecture:#C5}
+  #C7 = ffi::Uint32 {}
+  #C8 = 1
+  #C9 = "arm64"
+  #C10 = ffi::_Architecture {index:#C8, _name:#C9}
+  #C11 = ffi::Abi {_os:#C3, _architecture:#C10}
+  #C12 = 2
+  #C13 = "ia32"
+  #C14 = ffi::_Architecture {index:#C12, _name:#C13}
+  #C15 = ffi::Abi {_os:#C3, _architecture:#C14}
+  #C16 = 3
+  #C17 = "x64"
+  #C18 = ffi::_Architecture {index:#C16, _name:#C17}
+  #C19 = ffi::Abi {_os:#C3, _architecture:#C18}
+  #C20 = "fuchsia"
+  #C21 = ffi::_OS {index:#C8, _name:#C20}
+  #C22 = ffi::Abi {_os:#C21, _architecture:#C10}
+  #C23 = ffi::Uint64 {}
+  #C24 = ffi::Abi {_os:#C21, _architecture:#C18}
+  #C25 = "ios"
+  #C26 = ffi::_OS {index:#C12, _name:#C25}
+  #C27 = ffi::Abi {_os:#C26, _architecture:#C5}
+  #C28 = ffi::Abi {_os:#C26, _architecture:#C10}
+  #C29 = ffi::Abi {_os:#C26, _architecture:#C18}
+  #C30 = "linux"
+  #C31 = ffi::_OS {index:#C16, _name:#C30}
+  #C32 = ffi::Abi {_os:#C31, _architecture:#C5}
+  #C33 = ffi::Abi {_os:#C31, _architecture:#C10}
+  #C34 = ffi::Abi {_os:#C31, _architecture:#C14}
+  #C35 = ffi::Abi {_os:#C31, _architecture:#C18}
+  #C36 = 4
+  #C37 = "macos"
+  #C38 = ffi::_OS {index:#C36, _name:#C37}
+  #C39 = ffi::Abi {_os:#C38, _architecture:#C10}
+  #C40 = ffi::Abi {_os:#C38, _architecture:#C18}
+  #C41 = 5
+  #C42 = "windows"
+  #C43 = ffi::_OS {index:#C41, _name:#C42}
+  #C44 = ffi::Abi {_os:#C43, _architecture:#C10}
+  #C45 = ffi::Uint16 {}
+  #C46 = ffi::Abi {_os:#C43, _architecture:#C14}
+  #C47 = ffi::Abi {_os:#C43, _architecture:#C18}
+  #C48 = <ffi::Abi*, ffi::NativeType*>{#C6:#C7, #C11:#C7, #C15:#C7, #C19:#C7, #C22:#C23, #C24:#C7, #C27:#C7, #C28:#C7, #C29:#C7, #C32:#C7, #C33:#C7, #C34:#C7, #C35:#C7, #C39:#C7, #C40:#C7, #C44:#C45, #C46:#C45, #C47:#C45)
+  #C49 = ffi::AbiSpecificIntegerMapping {mapping:#C48}
+  #C50 = "vm:ffi:abi-specific-mapping"
+  #C51 = TypeLiteralConstant(ffi::Uint32)
+  #C52 = TypeLiteralConstant(ffi::Uint64)
+  #C53 = TypeLiteralConstant(ffi::Uint16)
+  #C54 = <core::Type?>[#C51, #C51, #C51, #C51, #C52, #C51, #C51, #C51, #C51, #C51, #C51, #C51, #C51, #C51, #C51, #C53, #C53, #C53]
+  #C55 = ffi::_FfiAbiSpecificMapping {nativeTypes:#C54}
+  #C56 = core::pragma {name:#C50, options:#C55}
+  #C57 = "vm:prefer-inline"
+  #C58 = null
+  #C59 = core::pragma {name:#C57, options:#C58}
+  #C60 = 8
+  #C61 = <core::int*>[#C36, #C36, #C36, #C36, #C60, #C36, #C36, #C36, #C36, #C36, #C36, #C36, #C36, #C36, #C36, #C12, #C12, #C12]
+  #C62 = "vm:ffi:struct-fields"
+  #C63 = TypeLiteralConstant(self::WChar)
+  #C64 = <core::Type>[#C63, #C63]
+  #C65 = ffi::_FfiStructLayout {fieldTypes:#C64, packing:#C58}
+  #C66 = core::pragma {name:#C62, options:#C65}
+  #C67 = self::WChar {}
+  #C68 = <core::int*>[#C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1, #C1]
+  #C69 = 16
+  #C70 = <core::int*>[#C60, #C60, #C60, #C60, #C69, #C60, #C60, #C60, #C60, #C60, #C60, #C60, #C60, #C60, #C60, #C36, #C36, #C36]
+  #C71 = 100
+  #C72 = ffi::_FfiInlineArray {elementType:#C63, length:#C71}
+  #C73 = <core::Type>[#C72]
+  #C74 = ffi::_FfiStructLayout {fieldTypes:#C73, packing:#C58}
+  #C75 = core::pragma {name:#C62, options:#C74}
+  #C76 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C71, dimension2:#C58, dimension3:#C58, dimension4:#C58, dimension5:#C58, dimensions:#C58}
+  #C77 = 400
+  #C78 = 800
+  #C79 = 200
+  #C80 = <core::int*>[#C77, #C77, #C77, #C77, #C78, #C77, #C77, #C77, #C77, #C77, #C77, #C77, #C77, #C77, #C77, #C79, #C79, #C79]
+  #C81 = <core::int*>[]
+  #C82 = core::_Override {}
+  #C83 = self::_DummyAllocator {}
+}
diff --git a/pkg/vm/testcases/transformations/ffi/abi_specific_int_incomplete.dart b/pkg/vm/testcases/transformations/ffi/abi_specific_int_incomplete.dart
new file mode 100644
index 0000000..b9759e0
--- /dev/null
+++ b/pkg/vm/testcases/transformations/ffi/abi_specific_int_incomplete.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+
+@AbiSpecificIntegerMapping({
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint32(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint32(),
+})
+class Incomplete extends AbiSpecificInteger {
+  const Incomplete();
+}
+
+void main() {
+  testSizeOf();
+  testStoreLoad();
+  testStoreLoadIndexed();
+  testStruct();
+  testInlineArray();
+}
+
+void testSizeOf() {
+  final size = sizeOf<Incomplete>();
+  print(size);
+}
+
+void testStoreLoad() {
+  final p = noAlloc<Incomplete>();
+  p.value = 10;
+  print(p.value);
+  noAlloc.free(p);
+}
+
+void testStoreLoadIndexed() {
+  final p = noAlloc<Incomplete>(2);
+  p[0] = 10;
+  p[1] = 3;
+  print(p[0]);
+  print(p[1]);
+  noAlloc.free(p);
+}
+
+class IncompleteStruct extends Struct {
+  @Incomplete()
+  external int a0;
+
+  @Incomplete()
+  external int a1;
+}
+
+void testStruct() {
+  final p = noAlloc<IncompleteStruct>();
+  p.ref.a0 = 1;
+  print(p.ref.a0);
+  p.ref.a0 = 2;
+  print(p.ref.a0);
+  noAlloc.free(p);
+}
+
+class IncompleteArrayStruct extends Struct {
+  @Array(100)
+  external Array<Incomplete> a0;
+}
+
+void testInlineArray() {
+  final p = noAlloc<IncompleteArrayStruct>();
+  final array = p.ref.a0;
+  for (int i = 0; i < 100; i++) {
+    array[i] = i;
+  }
+  for (int i = 0; i < 100; i++) {
+    print(array[i]);
+  }
+  noAlloc.free(p);
+}
+
+const noAlloc = _DummyAllocator();
+
+class _DummyAllocator implements Allocator {
+  const _DummyAllocator();
+
+  @override
+  Pointer<T> allocate<T extends NativeType>(int byteCount, {int? alignment}) {
+    return Pointer.fromAddress(0);
+  }
+
+  @override
+  void free(Pointer pointer) {}
+}
diff --git a/pkg/vm/testcases/transformations/ffi/abi_specific_int_incomplete.dart.expect b/pkg/vm/testcases/transformations/ffi/abi_specific_int_incomplete.dart.expect
new file mode 100644
index 0000000..2acfbf6
--- /dev/null
+++ b/pkg/vm/testcases/transformations/ffi/abi_specific_int_incomplete.dart.expect
@@ -0,0 +1,173 @@
+library #lib /*isNonNullableByDefault*/;
+import self as self;
+import "dart:ffi" as ffi;
+import "dart:core" as core;
+import "dart:typed_data" as typ;
+import "dart:_internal" as _in;
+
+import "dart:ffi";
+
+@#C21
+@#C27
+class Incomplete extends ffi::AbiSpecificInteger /*hasConstConstructor*/  {
+  const constructor •() → self::Incomplete
+    : super ffi::AbiSpecificInteger::•()
+    ;
+  @#C29
+  static get #sizeOf() → core::int*
+    return ffi::_checkAbiSpecificIntegerMapping<core::int>(#C31.{core::List::[]}(ffi::_abi()){(core::int) → core::int*});
+}
+@#C36
+class IncompleteStruct extends ffi::Struct {
+  synthetic constructor •() → self::IncompleteStruct
+    : super ffi::Struct::•()
+    ;
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::IncompleteStruct
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+  @#C37
+  get a0() → core::int
+    return ffi::_loadAbiSpecificInt<self::Incomplete>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C38.{core::List::[]}(ffi::_abi()){(core::int) → core::int*});
+  @#C37
+  set a0(core::int #externalFieldValue) → void
+    return ffi::_storeAbiSpecificInt<self::Incomplete>(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C38.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue);
+  @#C37
+  get a1() → core::int
+    return ffi::_loadAbiSpecificInt<self::Incomplete>(this.{ffi::_Compound::_typedDataBase}{core::Object}, ffi::_checkAbiSpecificIntegerMapping<core::int>(#C31.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}));
+  @#C37
+  set a1(core::int #externalFieldValue) → void
+    return ffi::_storeAbiSpecificInt<self::Incomplete>(this.{ffi::_Compound::_typedDataBase}{core::Object}, ffi::_checkAbiSpecificIntegerMapping<core::int>(#C31.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}), #externalFieldValue);
+  @#C29
+  static get #sizeOf() → core::int*
+    return ffi::_checkAbiSpecificIntegerMapping<core::int>(#C40.{core::List::[]}(ffi::_abi()){(core::int) → core::int*});
+}
+@#C45
+class IncompleteArrayStruct extends ffi::Struct {
+  synthetic constructor •() → self::IncompleteArrayStruct
+    : super ffi::Struct::•()
+    ;
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::IncompleteArrayStruct
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+  @#C46
+  get a0() → ffi::Array<self::Incomplete>
+    return new ffi::Array::_<self::Incomplete>( block {
+      core::Object #typedDataBase = this.{ffi::_Compound::_typedDataBase}{core::Object};
+      core::int #offset = #C38.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<self::Incomplete>(#typedDataBase.{ffi::Pointer::address}{core::int}.{core::num::+}(#offset){(core::num) → core::num}) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}{typ::ByteBuffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}{core::int}.{core::num::+}(#offset){(core::num) → core::num}, ffi::_checkAbiSpecificIntegerMapping<core::int>(#C48.{core::List::[]}(ffi::_abi()){(core::int) → core::int*})){([core::int, core::int?]) → typ::Uint8List}, #C41, #C49);
+  @#C46
+  set a0(ffi::Array<self::Incomplete> #externalFieldValue) → void
+    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}{core::Object}, #C38.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue.{ffi::Array::_typedDataBase}{core::Object}, #C4, ffi::_checkAbiSpecificIntegerMapping<core::int>(#C48.{core::List::[]}(ffi::_abi()){(core::int) → core::int*}));
+  @#C29
+  static get #sizeOf() → core::int*
+    return ffi::_checkAbiSpecificIntegerMapping<core::int>(#C48.{core::List::[]}(ffi::_abi()){(core::int) → core::int*});
+}
+class _DummyAllocator extends core::Object implements ffi::Allocator /*hasConstConstructor*/  {
+  const constructor •() → self::_DummyAllocator
+    : super core::Object::•()
+    ;
+  @#C50
+  method allocate<T extends ffi::NativeType>(core::int byteCount, {core::int? alignment = #C23}) → ffi::Pointer<self::_DummyAllocator::allocate::T> {
+    return ffi::Pointer::fromAddress<self::_DummyAllocator::allocate::T>(0);
+  }
+  @#C50
+  method free(ffi::Pointer<ffi::NativeType> pointer) → void {}
+}
+static const field self::_DummyAllocator noAlloc = #C51;
+static method main() → void {
+  self::testSizeOf();
+  self::testStoreLoad();
+  self::testStoreLoadIndexed();
+  self::testStruct();
+  self::testInlineArray();
+}
+static method testSizeOf() → void {
+  final core::int size = self::Incomplete::#sizeOf;
+  core::print(size);
+}
+static method testStoreLoad() → void {
+  final ffi::Pointer<self::Incomplete> p = #C51.{ffi::Allocator::allocate}<self::Incomplete>(self::Incomplete::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::Incomplete>};
+  ffi::_storeAbiSpecificInt<self::Incomplete>(p, #C4, 10);
+  core::print(ffi::_loadAbiSpecificInt<self::Incomplete>(p, #C4));
+  #C51.{self::_DummyAllocator::free}(p){(ffi::Pointer<ffi::NativeType>) → void};
+}
+static method testStoreLoadIndexed() → void {
+  final ffi::Pointer<self::Incomplete> p = #C51.{ffi::Allocator::allocate}<self::Incomplete>(2.{core::num::*}(self::Incomplete::#sizeOf){(core::num) → core::num}){(core::int, {alignment: core::int?}) → ffi::Pointer<self::Incomplete>};
+  ffi::_storeAbiSpecificIntAtIndex<self::Incomplete>(p, 0, 10);
+  ffi::_storeAbiSpecificIntAtIndex<self::Incomplete>(p, 1, 3);
+  core::print(ffi::_loadAbiSpecificIntAtIndex<self::Incomplete>(p, 0));
+  core::print(ffi::_loadAbiSpecificIntAtIndex<self::Incomplete>(p, 1));
+  #C51.{self::_DummyAllocator::free}(p){(ffi::Pointer<ffi::NativeType>) → void};
+}
+static method testStruct() → void {
+  final ffi::Pointer<self::IncompleteStruct> p = #C51.{ffi::Allocator::allocate}<self::IncompleteStruct>(self::IncompleteStruct::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::IncompleteStruct>};
+  new self::IncompleteStruct::#fromTypedDataBase(p!).{self::IncompleteStruct::a0} = 1;
+  core::print(new self::IncompleteStruct::#fromTypedDataBase(p!).{self::IncompleteStruct::a0}{core::int});
+  new self::IncompleteStruct::#fromTypedDataBase(p!).{self::IncompleteStruct::a0} = 2;
+  core::print(new self::IncompleteStruct::#fromTypedDataBase(p!).{self::IncompleteStruct::a0}{core::int});
+  #C51.{self::_DummyAllocator::free}(p){(ffi::Pointer<ffi::NativeType>) → void};
+}
+static method testInlineArray() → void {
+  final ffi::Pointer<self::IncompleteArrayStruct> p = #C51.{ffi::Allocator::allocate}<self::IncompleteArrayStruct>(self::IncompleteArrayStruct::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::IncompleteArrayStruct>};
+  final ffi::Array<self::Incomplete> array = new self::IncompleteArrayStruct::#fromTypedDataBase(p!).{self::IncompleteArrayStruct::a0}{ffi::Array<self::Incomplete>};
+  for (core::int i = 0; i.{core::num::<}(100){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    ffi::_storeAbiSpecificIntAtIndex<self::Incomplete>(array.{ffi::Array::_typedDataBase}{core::Object}, i, i);
+  }
+  for (core::int i = 0; i.{core::num::<}(100){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
+    core::print(ffi::_loadAbiSpecificIntAtIndex<self::Incomplete>(array.{ffi::Array::_typedDataBase}{core::Object}, i));
+  }
+  #C51.{self::_DummyAllocator::free}(p){(ffi::Pointer<ffi::NativeType>) → void};
+}
+constants  {
+  #C1 = 3
+  #C2 = "linux"
+  #C3 = ffi::_OS {index:#C1, _name:#C2}
+  #C4 = 0
+  #C5 = "arm"
+  #C6 = ffi::_Architecture {index:#C4, _name:#C5}
+  #C7 = ffi::Abi {_os:#C3, _architecture:#C6}
+  #C8 = ffi::Uint32 {}
+  #C9 = 1
+  #C10 = "arm64"
+  #C11 = ffi::_Architecture {index:#C9, _name:#C10}
+  #C12 = ffi::Abi {_os:#C3, _architecture:#C11}
+  #C13 = 2
+  #C14 = "ia32"
+  #C15 = ffi::_Architecture {index:#C13, _name:#C14}
+  #C16 = ffi::Abi {_os:#C3, _architecture:#C15}
+  #C17 = "x64"
+  #C18 = ffi::_Architecture {index:#C1, _name:#C17}
+  #C19 = ffi::Abi {_os:#C3, _architecture:#C18}
+  #C20 = <ffi::Abi*, ffi::NativeType*>{#C7:#C8, #C12:#C8, #C16:#C8, #C19:#C8)
+  #C21 = ffi::AbiSpecificIntegerMapping {mapping:#C20}
+  #C22 = "vm:ffi:abi-specific-mapping"
+  #C23 = null
+  #C24 = TypeLiteralConstant(ffi::Uint32)
+  #C25 = <core::Type?>[#C23, #C23, #C23, #C23, #C23, #C23, #C23, #C23, #C23, #C24, #C24, #C24, #C24, #C23, #C23, #C23, #C23, #C23]
+  #C26 = ffi::_FfiAbiSpecificMapping {nativeTypes:#C25}
+  #C27 = core::pragma {name:#C22, options:#C26}
+  #C28 = "vm:prefer-inline"
+  #C29 = core::pragma {name:#C28, options:#C23}
+  #C30 = 4
+  #C31 = <core::int*>[#C23, #C23, #C23, #C23, #C23, #C23, #C23, #C23, #C23, #C30, #C30, #C30, #C30, #C23, #C23, #C23, #C23, #C23]
+  #C32 = "vm:ffi:struct-fields"
+  #C33 = TypeLiteralConstant(self::Incomplete)
+  #C34 = <core::Type>[#C33, #C33]
+  #C35 = ffi::_FfiStructLayout {fieldTypes:#C34, packing:#C23}
+  #C36 = core::pragma {name:#C32, options:#C35}
+  #C37 = self::Incomplete {}
+  #C38 = <core::int*>[#C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4]
+  #C39 = 8
+  #C40 = <core::int*>[#C23, #C23, #C23, #C23, #C23, #C23, #C23, #C23, #C23, #C39, #C39, #C39, #C39, #C23, #C23, #C23, #C23, #C23]
+  #C41 = 100
+  #C42 = ffi::_FfiInlineArray {elementType:#C33, length:#C41}
+  #C43 = <core::Type>[#C42]
+  #C44 = ffi::_FfiStructLayout {fieldTypes:#C43, packing:#C23}
+  #C45 = core::pragma {name:#C32, options:#C44}
+  #C46 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C41, dimension2:#C23, dimension3:#C23, dimension4:#C23, dimension5:#C23, dimensions:#C23}
+  #C47 = 400
+  #C48 = <core::int*>[#C23, #C23, #C23, #C23, #C23, #C23, #C23, #C23, #C23, #C47, #C47, #C47, #C47, #C23, #C23, #C23, #C23, #C23]
+  #C49 = <core::int*>[]
+  #C50 = core::_Override {}
+  #C51 = self::_DummyAllocator {}
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect
index 463adf9..aca8022 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/enum_from_lib_used_as_type.dart.expect
@@ -22,6 +22,6 @@
   synthetic constructor •() → self::Class
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3252,getterSelectorId:3253]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::Enum e) → core::int
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3380,getterSelectorId:3381]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::Enum e) → core::int
     return [@vm.inferred-type.metadata=!] e.{core::_Enum::index}{core::int};
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect
index f449731..c2c6faa 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect
@@ -128,10 +128,10 @@
   #C9 = ffi::_FfiStructLayout {fieldTypes:#C8, packing:#C4}
   #C10 = core::pragma {name:#C1, options:#C9}
   #C11 = 0
-  #C12 = <core::int*>[#C11, #C11, #C11]
-  #C13 = 8
-  #C14 = 4
-  #C15 = <core::int*>[#C13, #C14, #C14]
+  #C12 = <core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
+  #C13 = 4
+  #C14 = 8
+  #C15 = <core::int*>[#C13, #C14, #C13, #C14, #C14, #C14, #C13, #C14, #C14, #C13, #C14, #C13, #C14, #C14, #C14, #C14, #C13, #C14]
   #C16 = static-tearoff self::useStruct3
   #C17 = static-tearoff self::returnStruct7
   #C18 = 1
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/mixin_with_field_test.dart b/pkg/vm/testcases/transformations/type_flow/transformer/mixin_with_field_test.dart
new file mode 100644
index 0000000..bca77d0
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/mixin_with_field_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for dartbug.com/47822
+
+mixin M {
+  int x = (() => 7)();
+}
+
+class C with M {}
+
+main() {
+  print(C().x);
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/mixin_with_field_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/mixin_with_field_test.dart.expect
new file mode 100644
index 0000000..14d7ff0
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/mixin_with_field_test.dart.expect
@@ -0,0 +1,20 @@
+library #lib /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+abstract class _C&Object&M extends core::Object implements self::M /*isAnonymousMixin,isEliminatedMixin*/  {
+[@vm.inferred-type.metadata=int?] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  field core::int x;
+  synthetic constructor •() → self::_C&Object&M
+    : self::_C&Object&M::x = (() → core::int => 7)(){() → core::int}, super core::Object::•()
+    ;
+}
+class C extends self::_C&Object&M {
+  synthetic constructor •() → self::C
+    : super self::_C&Object&M::•()
+    ;
+}
+static method main() → dynamic {
+  core::print([@vm.direct-call.metadata=#lib::_C&Object&M.x] [@vm.inferred-type.metadata=int?] new self::C::•().{self::_C&Object&M::x}{core::int});
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index 1212909..f5fb218 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -13,6 +13,8 @@
     : super core::Object::•()
     ;
 }
+class T3 extends core::Object {
+}
 class T4 extends core::Object {
   synthetic constructor •() → self::T4
     : super core::Object::•()
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
index 0e44dd5..86ad485 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
@@ -16,6 +16,8 @@
 [@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] [@vm.unboxing-info.metadata=()->i]  method foo() → core::int
     return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B.foo] [@vm.inferred-type.metadata=int? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult(){dynamic}.foo())){(core::num) → core::num});
 }
+class C extends core::Object implements self::A {
+}
 abstract class Base extends core::Object {
   synthetic constructor •() → self::Base
     : super core::Object::•()
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect
index 3a69351..446a1e7 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tree_shake_enum_from_lib.dart.expect
@@ -51,6 +51,6 @@
   synthetic constructor •() → self::ConstClass
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3256,getterSelectorId:3257]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::ConstEnum e) → core::int
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3384,getterSelectorId:3385]  method method([@vm.inferred-type.metadata=dart.core::Null? (value: null)] self::ConstEnum e) → core::int
     return [@vm.inferred-type.metadata=!] e.{core::_Enum::index}{core::int};
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect
index e544ddf..1d30a71 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect
@@ -2,6 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
+class A extends core::Object {
+}
 class B extends core::Object {
   constructor •() → self::B
     : super core::Object::•() {
diff --git a/pkg/vm/tool/compare_il b/pkg/vm/tool/compare_il
index 65ad55e..4973042 100755
--- a/pkg/vm/tool/compare_il
+++ b/pkg/vm/tool/compare_il
@@ -26,10 +26,6 @@
 
 # TODO(kustermann): For windows as well as for hosts running on arm, our
 # checked-in dart binaries must be adjusted.
-if [[ `uname` == 'Darwin' ]]; then
-  DART="$SDK_DIR/tools/sdks/dart-sdk/bin/dart"
-else
-  DART="$SDK_DIR/tools/sdks/dart-sdk/bin/dart"
-fi
+DART="$SDK_DIR/tools/sdks/dart-sdk/bin/dart"
 
 exec "$DART" $DART_VM_FLAGS "${SDK_DIR}/pkg/vm/bin/compare_il.dart" $@
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 6b3803c..e096691 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,5 +1,25 @@
 # Changelog
 
+## 8.1.0
+- Update to version `3.55` of the spec.
+- Added `streamCpuSamplesWithUserTag` RPC.
+
+## 8.0.0
+- Update to version `3.54` of the spec.
+- *breaking* Updated type of `Event.cpuSamples` from `CpuSamples` to
+  `CpuSamplesEvent`, which is less expensive to generate and serialize.
+- Added `CpuSamplesEvent` object.
+
+## 7.5.0
+- Update to version `3.53` of the spec.
+- Added `setIsolatePauseMode` RPC.
+- Deprecated `setExceptionPauseMode` in favor of `setIsolatePauseMode`.
+
+## 7.4.0
+- Update to version `3.52` of the spec.
+- Added `lookupResolvedPackageUris` and `lookupPackageUris` RPCs and `UriList`
+  type.
+
 ## 7.3.0
 - Update to version `3.51` of the spec.
 - Added optional `reportLines` parameter to `getSourceReport` RPC.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index f30e794..aa1b7c7 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -453,6 +453,20 @@
   return obj;
 }
 
+vms.CpuSamplesEvent assertCpuSamplesEvent(vms.CpuSamplesEvent obj) {
+  assertNotNull(obj);
+  assertInt(obj.samplePeriod!);
+  assertInt(obj.maxStackDepth!);
+  assertInt(obj.sampleCount!);
+  assertInt(obj.timeSpan!);
+  assertInt(obj.timeOriginMicros!);
+  assertInt(obj.timeExtentMicros!);
+  assertInt(obj.pid!);
+  assertListOfDynamic(obj.functions!);
+  assertListOfCpuSample(obj.samples!);
+  return obj;
+}
+
 vms.CpuSample assertCpuSample(vms.CpuSample obj) {
   assertNotNull(obj);
   assertInt(obj.tid!);
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index 817e983..5fe823e 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -36,6 +36,7 @@
 src/org/dartlang/vm/service/consumer/ResumeConsumer.java
 src/org/dartlang/vm/service/consumer/SetExceptionPauseModeConsumer.java
 src/org/dartlang/vm/service/consumer/SetFlagConsumer.java
+src/org/dartlang/vm/service/consumer/SetIsolatePauseModeConsumer.java
 src/org/dartlang/vm/service/consumer/SetLibraryDebuggableConsumer.java
 src/org/dartlang/vm/service/consumer/SetNameConsumer.java
 src/org/dartlang/vm/service/consumer/SetTraceClassAllocationConsumer.java
@@ -62,6 +63,7 @@
 src/org/dartlang/vm/service/element/ContextRef.java
 src/org/dartlang/vm/service/element/CpuSample.java
 src/org/dartlang/vm/service/element/CpuSamples.java
+src/org/dartlang/vm/service/element/CpuSamplesEvent.java
 src/org/dartlang/vm/service/element/ErrorKind.java
 src/org/dartlang/vm/service/element/ErrorObj.java
 src/org/dartlang/vm/service/element/ErrorRef.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index 8ae6998..e465dc5 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.52
+version=3.55
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 51958bd..968a41f 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -26,7 +26,7 @@
         HeapSnapshotObjectNoData,
         HeapSnapshotObjectNullData;
 
-const String vmServiceVersion = '3.52.0';
+const String vmServiceVersion = '3.55.0';
 
 /// @optional
 const String optional = 'optional';
@@ -123,6 +123,7 @@
   'Context': Context.parse,
   'ContextElement': ContextElement.parse,
   'CpuSamples': CpuSamples.parse,
+  'CpuSamplesEvent': CpuSamplesEvent.parse,
   'CpuSample': CpuSample.parse,
   '@Error': ErrorRef.parse,
   'Error': Error.parse,
@@ -236,6 +237,7 @@
   'resume': const ['Success'],
   'setBreakpointState': const ['Breakpoint'],
   'setExceptionPauseMode': const ['Success'],
+  'setIsolatePauseMode': const ['Success'],
   'setFlag': const ['Success', 'Error'],
   'setLibraryDebuggable': const ['Success'],
   'setName': const ['Success'],
@@ -243,6 +245,7 @@
   'setVMName': const ['Success'],
   'setVMTimelineFlags': const ['Success'],
   'streamCancel': const ['Success'],
+  'streamCpuSamplesWithUserTag': const ['Success'],
   'streamListen': const ['Success'],
 };
 
@@ -1078,9 +1081,34 @@
   ///
   /// This method will throw a [SentinelException] in the case a [Sentinel] is
   /// returned.
+  @Deprecated('Use setIsolatePauseMode instead')
   Future<Success> setExceptionPauseMode(
       String isolateId, /*ExceptionPauseMode*/ String mode);
 
+  /// The `setIsolatePauseMode` RPC is used to control if or when an isolate
+  /// will pause due to a change in execution state.
+  ///
+  /// The `shouldPauseOnExit` parameter specify whether the target isolate
+  /// should pause on exit.
+  ///
+  /// The `setExceptionPauseMode` RPC is used to control if an isolate pauses
+  /// when an exception is thrown.
+  ///
+  /// mode | meaning
+  /// ---- | -------
+  /// None | Do not pause isolate on thrown exceptions
+  /// Unhandled | Pause isolate on unhandled exceptions
+  /// All  | Pause isolate on all thrown exceptions
+  ///
+  /// If `isolateId` refers to an isolate which has exited, then the `Collected`
+  /// [Sentinel] is returned.
+  ///
+  /// This method will throw a [SentinelException] in the case a [Sentinel] is
+  /// returned.
+  Future<Success> setIsolatePauseMode(String isolateId,
+      {/*ExceptionPauseMode*/ String? exceptionPauseMode,
+      bool? shouldPauseOnExit});
+
   /// The `setFlag` RPC is used to set a VM flag at runtime. Returns an error if
   /// the named flag does not exist, the flag may not be set at runtime, or the
   /// value is of the wrong type for the flag.
@@ -1101,6 +1129,7 @@
   /// provided value. If set to false when the profiler is already running, the
   /// profiler will be stopped but may not free its sample buffer depending on
   /// platform limitations.
+  /// - Isolate pause settings will only be applied to newly spawned isolates.
   ///
   /// See [Success].
   ///
@@ -1177,6 +1206,15 @@
   /// See [Success].
   Future<Success> streamCancel(String streamId);
 
+  /// The `streamCpuSamplesWithUserTag` RPC allows for clients to specify which
+  /// CPU samples collected by the profiler should be sent over the `Profiler`
+  /// stream. When called, the VM will stream `CpuSamples` events containing
+  /// `CpuSample`'s collected while a user tag contained in `userTags` was
+  /// active.
+  ///
+  /// See [Success].
+  Future<Success> streamCpuSamplesWithUserTag(List<String> userTags);
+
   /// The `streamListen` RPC subscribes to a stream in the VM. Once subscribed,
   /// the client will begin receiving events from the stream.
   ///
@@ -1549,11 +1587,19 @@
           );
           break;
         case 'setExceptionPauseMode':
+          // ignore: deprecated_member_use_from_same_package
           response = await _serviceImplementation.setExceptionPauseMode(
             params!['isolateId'],
             params['mode'],
           );
           break;
+        case 'setIsolatePauseMode':
+          response = await _serviceImplementation.setIsolatePauseMode(
+            params!['isolateId'],
+            exceptionPauseMode: params['exceptionPauseMode'],
+            shouldPauseOnExit: params['shouldPauseOnExit'],
+          );
+          break;
         case 'setFlag':
           response = await _serviceImplementation.setFlag(
             params!['name'],
@@ -1604,6 +1650,11 @@
           await existing.cancel();
           response = Success();
           break;
+        case 'streamCpuSamplesWithUserTag':
+          response = await _serviceImplementation.streamCpuSamplesWithUserTag(
+            List<String>.from(params!['userTags'] ?? []),
+          );
+          break;
         case 'streamListen':
           var id = params!['streamId'];
           if (_streamSubscriptions.containsKey(id)) {
@@ -2081,12 +2132,24 @@
         'enable': enable
       });
 
+  @Deprecated('Use setIsolatePauseMode instead')
   @override
   Future<Success> setExceptionPauseMode(
           String isolateId, /*ExceptionPauseMode*/ String mode) =>
       _call('setExceptionPauseMode', {'isolateId': isolateId, 'mode': mode});
 
   @override
+  Future<Success> setIsolatePauseMode(String isolateId,
+          {/*ExceptionPauseMode*/ String? exceptionPauseMode,
+          bool? shouldPauseOnExit}) =>
+      _call('setIsolatePauseMode', {
+        'isolateId': isolateId,
+        if (exceptionPauseMode != null)
+          'exceptionPauseMode': exceptionPauseMode,
+        if (shouldPauseOnExit != null) 'shouldPauseOnExit': shouldPauseOnExit,
+      });
+
+  @override
   Future<Response> setFlag(String name, String value) =>
       _call('setFlag', {'name': name, 'value': value});
 
@@ -2121,6 +2184,10 @@
       _call('streamCancel', {'streamId': streamId});
 
   @override
+  Future<Success> streamCpuSamplesWithUserTag(List<String> userTags) =>
+      _call('streamCpuSamplesWithUserTag', {'userTags': userTags});
+
+  @override
   Future<Success> streamListen(String streamId) =>
       _call('streamListen', {'streamId': streamId});
 
@@ -3611,6 +3678,92 @@
   String toString() => '[CpuSamples]';
 }
 
+class CpuSamplesEvent {
+  static CpuSamplesEvent? parse(Map<String, dynamic>? json) =>
+      json == null ? null : CpuSamplesEvent._fromJson(json);
+
+  /// The sampling rate for the profiler in microseconds.
+  int? samplePeriod;
+
+  /// The maximum possible stack depth for samples.
+  int? maxStackDepth;
+
+  /// The number of samples returned.
+  int? sampleCount;
+
+  /// The timespan the set of returned samples covers, in microseconds
+  /// (deprecated).
+  ///
+  /// Note: this property is deprecated and will always return -1. Use
+  /// `timeExtentMicros` instead.
+  int? timeSpan;
+
+  /// The start of the period of time in which the returned samples were
+  /// collected.
+  int? timeOriginMicros;
+
+  /// The duration of time covered by the returned samples.
+  int? timeExtentMicros;
+
+  /// The process ID for the VM.
+  int? pid;
+
+  /// A list of references to functions seen in the relevant samples. These
+  /// references can be looked up using the indicies provided in a `CpuSample`
+  /// `stack` to determine which function was on the stack.
+  List<dynamic>? functions;
+
+  /// A list of samples collected in the range `[timeOriginMicros,
+  /// timeOriginMicros + timeExtentMicros]`
+  List<CpuSample>? samples;
+
+  CpuSamplesEvent({
+    required this.samplePeriod,
+    required this.maxStackDepth,
+    required this.sampleCount,
+    required this.timeSpan,
+    required this.timeOriginMicros,
+    required this.timeExtentMicros,
+    required this.pid,
+    required this.functions,
+    required this.samples,
+  });
+
+  CpuSamplesEvent._fromJson(Map<String, dynamic> json) {
+    samplePeriod = json['samplePeriod'] ?? -1;
+    maxStackDepth = json['maxStackDepth'] ?? -1;
+    sampleCount = json['sampleCount'] ?? -1;
+    timeSpan = json['timeSpan'] ?? -1;
+    timeOriginMicros = json['timeOriginMicros'] ?? -1;
+    timeExtentMicros = json['timeExtentMicros'] ?? -1;
+    pid = json['pid'] ?? -1;
+    functions = List<dynamic>.from(
+        createServiceObject(json['functions'], const ['dynamic']) as List? ??
+            []);
+    samples = List<CpuSample>.from(
+        createServiceObject(json['samples'], const ['CpuSample']) as List? ??
+            []);
+  }
+
+  Map<String, dynamic> toJson() {
+    final json = <String, dynamic>{};
+    json.addAll({
+      'samplePeriod': samplePeriod,
+      'maxStackDepth': maxStackDepth,
+      'sampleCount': sampleCount,
+      'timeSpan': timeSpan,
+      'timeOriginMicros': timeOriginMicros,
+      'timeExtentMicros': timeExtentMicros,
+      'pid': pid,
+      'functions': functions?.map((f) => f.toJson()).toList(),
+      'samples': samples?.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[CpuSamplesEvent]';
+}
+
 /// See [getCpuSamples] and [CpuSamples].
 class CpuSample {
   static CpuSample? parse(Map<String, dynamic>? json) =>
@@ -4004,7 +4157,7 @@
 
   /// A CPU profile containing recent samples.
   @optional
-  CpuSamples? cpuSamples;
+  CpuSamplesEvent? cpuSamples;
 
   /// Binary data associated with the event.
   ///
@@ -4085,8 +4238,9 @@
     last = json['last'];
     updatedTag = json['updatedTag'];
     previousTag = json['previousTag'];
-    cpuSamples = createServiceObject(json['cpuSamples'], const ['CpuSamples'])
-        as CpuSamples?;
+    cpuSamples =
+        createServiceObject(json['cpuSamples'], const ['CpuSamplesEvent'])
+            as CpuSamplesEvent?;
     data = json['data'];
   }
 
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 85b7cad..a01b273 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -3,7 +3,7 @@
   A library to communicate with a service implementing the Dart VM
   service protocol.
 
-version: 7.3.0
+version: 8.1.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
 
@@ -21,3 +21,5 @@
   process: ^4.0.0
   pub_semver: ^2.0.0-nullsafety.0
   test: ^1.16.0-nullsafety.13
+  test_package:
+    path: 'test/test_package'
diff --git a/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart b/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart
new file mode 100644
index 0000000..bead75c
--- /dev/null
+++ b/pkg/vm_service/test/add_breakpoint_rpc_kernel_test.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE_A = 24;
+const int LINE_B = 26;
+
+int value = 0;
+
+int incValue(int amount) {
+  value += amount;
+  return amount;
+}
+
+Future testMain() async {
+  incValue(incValue(1)); // line A.
+
+  incValue(incValue(1)); // line B.
+}
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+
+  // Test future breakpoints.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    final rootLib =
+        await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
+    final rootLibId = rootLib.id!;
+    final scriptId = rootLib.scripts![0].id!;
+    final script = await service.getObject(isolateId, scriptId) as Script;
+
+    // Future breakpoint.
+    var futureBpt1 = await service.addBreakpoint(isolateId, scriptId, LINE_A);
+    expect(futureBpt1.breakpointNumber, 1);
+    expect(futureBpt1.resolved, isFalse);
+    expect(await futureBpt1.location!.line!, LINE_A);
+    expect(await futureBpt1.location!.column, null);
+
+    // Future breakpoint with specific column.
+    var futureBpt2 =
+        await service.addBreakpoint(isolateId, scriptId, LINE_A, column: 3);
+    expect(futureBpt2.breakpointNumber, 2);
+    expect(futureBpt2.resolved, isFalse);
+    expect(await futureBpt2.location!.line!, LINE_A);
+    expect(await futureBpt2.location!.column!, 3);
+
+    int resolvedCount = await resumeAndCountResolvedBreakpointsUntilPause(
+      service,
+      isolate,
+    );
+
+    // After resolution the breakpoints have assigned line & column.
+    expect(resolvedCount, 2);
+
+    // Refresh objects
+    futureBpt1 =
+        await service.getObject(isolateId, futureBpt1.id!) as Breakpoint;
+    futureBpt2 =
+        await service.getObject(isolateId, futureBpt2.id!) as Breakpoint;
+
+    expect(futureBpt1.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(futureBpt1.location!.tokenPos!),
+        LINE_A);
+    expect(
+        script.getColumnNumberFromTokenPos(futureBpt1.location!.tokenPos!), 12);
+    expect(futureBpt2.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(futureBpt2.location!.tokenPos!),
+        LINE_A);
+    expect(
+        script.getColumnNumberFromTokenPos(futureBpt2.location!.tokenPos!), 3);
+
+    // The first breakpoint hits before value is modified.
+    InstanceRef result =
+        await service.evaluate(isolateId, rootLibId, 'value') as InstanceRef;
+    expect(result.valueAsString, '0');
+
+    await service.resume(isolateId);
+    await hasStoppedAtBreakpoint(service, isolate);
+
+    // The second breakpoint hits after value has been modified once.
+    result =
+        await service.evaluate(isolateId, rootLibId, 'value') as InstanceRef;
+    expect(result.valueAsString, '1');
+
+    // Remove the breakpoints.
+    expect((await service.removeBreakpoint(isolateId, futureBpt1.id!)).type,
+        'Success');
+    expect((await service.removeBreakpoint(isolateId, futureBpt2.id!)).type,
+        'Success');
+  },
+
+  // Test resolution of column breakpoints.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    final rootLibId = isolate.rootLib!.id!;
+    final rootLib = await service.getObject(isolateId, rootLibId) as Library;
+
+    final scriptId = rootLib.scripts![0].id!;
+    final script = await service.getObject(isolateId, scriptId) as Script;
+
+    // Try all columns, including some columns that are too big.
+    for (int col = 1; col <= 50; col++) {
+      final bpt =
+          await service.addBreakpoint(isolateId, scriptId, LINE_A, column: col);
+      expect(bpt.resolved, isTrue);
+      int resolvedLine =
+          script.getLineNumberFromTokenPos(bpt.location!.tokenPos!)!;
+      int resolvedCol =
+          script.getColumnNumberFromTokenPos(bpt.location!.tokenPos!)!;
+      print('$LINE_A:${col} -> ${resolvedLine}:${resolvedCol}');
+      if (col <= 12) {
+        expect(resolvedLine, LINE_A);
+        expect(resolvedCol, 3);
+      } else if (col <= 36) {
+        expect(resolvedLine, LINE_A);
+        expect(resolvedCol, 12);
+      } else {
+        expect(resolvedLine, LINE_B);
+        expect(resolvedCol, 12);
+      }
+      expect(
+          (await service.removeBreakpoint(isolateId, bpt.id!)).type, 'Success');
+    }
+
+    // Make sure that a zero column is an error.
+    var caughtException = false;
+    try {
+      await service.addBreakpoint(isolateId, scriptId, 20, column: 0);
+      expect(false, isTrue, reason: 'Unreachable');
+    } on RPCError catch (e) {
+      caughtException = true;
+      expect(e.code, RPCError.kInvalidParams);
+      expect(e.details, "addBreakpoint: invalid 'column' parameter: 0");
+    }
+    expect(caughtException, isTrue);
+  },
+];
+
+Future<int> resumeAndCountResolvedBreakpointsUntilPause(
+    VmService service, Isolate isolate) async {
+  final completer = Completer<void>();
+  late StreamSubscription subscription;
+  int resolvedCount = 0;
+
+  subscription = service.onDebugEvent.listen((event) {
+    if (event.kind == EventKind.kBreakpointResolved) {
+      resolvedCount++;
+    } else if (event.kind == EventKind.kPauseBreakpoint) {
+      subscription.cancel();
+      service.streamCancel(EventStreams.kDebug);
+      completer.complete();
+    }
+  });
+  await service.streamListen(EventStreams.kDebug);
+
+  await service.resume(isolate.id!);
+  await completer.future;
+  return resolvedCount;
+}
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'add_breakpoint_rpc_kernel_test.dart',
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+    );
diff --git a/pkg/vm_service/test/allocations_test.dart b/pkg/vm_service/test/allocations_test.dart
new file mode 100644
index 0000000..9e38e57
--- /dev/null
+++ b/pkg/vm_service/test/allocations_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+class Foo {}
+
+// Prevent TFA from removing this static field to ensure the objects are kept
+// alive, so the allocation stats will report them via the service api.
+@pragma('vm:entry-point')
+List<Foo>? foos;
+
+void script() {
+  foos = [
+    Foo(),
+    Foo(),
+    Foo(),
+  ];
+}
+
+var tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    var profile = await service.callMethod('_getAllocationProfile',
+        isolateId: isolateRef.id!) as AllocationProfile;
+    print(profile.runtimeType);
+    var classHeapStats = profile.members!.singleWhere((stats) {
+      return stats.classRef!.name == 'Foo';
+    });
+    expect(classHeapStats.instancesCurrent, 3);
+    expect(classHeapStats.instancesAccumulated, 3);
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'allocations_test.dart',
+      testeeBefore: script,
+    );
diff --git a/pkg/vm_service/test/async_next_regression_18877_test.dart b/pkg/vm_service/test/async_next_regression_18877_test.dart
new file mode 100644
index 0000000..6912a67
--- /dev/null
+++ b/pkg/vm_service/test/async_next_regression_18877_test.dart
@@ -0,0 +1,59 @@
+// 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.
+// VMOptions=--verbose_debug
+
+import 'dart:developer';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE_A = 24;
+const int LINE_B = 25;
+const int LINE_C = 26;
+
+foo() async {}
+
+doAsync(stop) async {
+  // Flutter issue 18877:
+  // If a closure is defined in the context of an async method, stepping over
+  // an await causes the implicit breakpoint to be set for that closure instead
+  // of the async_op, resulting in the debugger falling through.
+  final baz = () => print('doAsync($stop) done!');
+  if (stop) debugger();
+  await foo(); // Line A.
+  await foo(); // Line B.
+  await foo(); // Line C.
+  baz();
+  return null;
+}
+
+testMain() {
+  // With two runs of doAsync floating around, async step should only cause
+  // us to stop in the run we started in.
+  doAsync(false);
+  doAsync(true);
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_A),
+  stepOver, // foo()
+  stoppedAtLine(LINE_A),
+  asyncNext,
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_B),
+  stepOver, // foo()
+  stoppedAtLine(LINE_B),
+  asyncNext,
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_C),
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'async_next_regression_18877_test.dart',
+      testeeConcurrent: testMain,
+    );
diff --git a/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart b/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart
new file mode 100644
index 0000000..88d17d0a
--- /dev/null
+++ b/pkg/vm_service/test/awaiter_async_stack_contents_2_test.dart
@@ -0,0 +1,64 @@
+// 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.
+//
+// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+
+import 'dart:developer';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const LINE_A = 28;
+const LINE_B = 34;
+const LINE_C = 38;
+
+notCalled() async {
+  await null;
+  await null;
+  await null;
+  await null;
+}
+
+foobar() async {
+  await null;
+  debugger();
+  print('foobar'); // LINE_A.
+}
+
+helper() async {
+  await null;
+  print('helper');
+  await foobar(); // LINE_B.
+}
+
+testMain() async {
+  helper(); // LINE_C.
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_A),
+  (VmService service, IsolateRef isolate) async {
+    final isolateId = isolate.id!;
+    // Verify awaiter stack trace is the current frame + the awaiter.
+    Stack stack = await service.getStack(isolateId);
+    expect(stack.awaiterFrames, isNotNull);
+    List<Frame> awaiterFrames = stack.awaiterFrames!;
+    expect(awaiterFrames.length, greaterThanOrEqualTo(2));
+    // Awaiter frame.
+    expect(awaiterFrames[0].function!.owner.name, 'foobar');
+    // Awaiter frame.
+    expect(awaiterFrames[1].function!.owner.name, 'helper');
+  },
+];
+
+main(args) => runIsolateTestsSynchronous(
+      args,
+      tests,
+      'awaiter_async_stack_contents_2_test.dart',
+      testeeConcurrent: testMain,
+      extraArgs: extraDebuggingArgs,
+    );
diff --git a/pkg/vm_service/test/awaiter_async_stack_contents_test.dart b/pkg/vm_service/test/awaiter_async_stack_contents_test.dart
new file mode 100644
index 0000000..0fea350
--- /dev/null
+++ b/pkg/vm_service/test/awaiter_async_stack_contents_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--async-debugger --verbose-debug --lazy-async-stacks
+
+import 'dart:developer';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const LINE_C = 22;
+const LINE_A = 28;
+const LINE_B = 34;
+const LINE_D = 29;
+
+foobar() async {
+  await null;
+  debugger();
+  print('foobar'); // LINE_C.
+}
+
+helper() async {
+  await null;
+  debugger();
+  print('helper'); // LINE_A.
+  await foobar(); // LINE_D
+}
+
+testMain() {
+  debugger();
+  helper(); // LINE_B.
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_B),
+  (VmService service, IsolateRef isolateRef) async {
+    Stack stack = await service.getStack(isolateRef.id!);
+    // No awaiter frames because we are in a completely synchronous stack.
+    expect(stack.awaiterFrames, isNull);
+  },
+  resumeIsolate,
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_A),
+  resumeIsolate,
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_C),
+  (VmService service, IsolateRef isolateRef) async {
+    // Verify awaiter stack trace is the current frame + the awaiter.
+    Stack stack = await service.getStack(isolateRef.id!);
+    expect(stack.awaiterFrames, isNotNull);
+    List<Frame> awaiterFrames = stack.awaiterFrames!;
+
+    expect(awaiterFrames.length, greaterThanOrEqualTo(2));
+    // Awaiter frame.
+    expect(await awaiterFrames[0].function!.owner.name, 'foobar');
+    // Awaiter frame.
+    expect(await awaiterFrames[1].function!.owner.name, 'helper');
+    // "helper" is not await'ed.
+  },
+];
+
+main(args) => runIsolateTestsSynchronous(
+      args,
+      tests,
+      'awaiter_async_stack_contents_test.dart',
+      testeeConcurrent: testMain,
+      extraArgs: extraDebuggingArgs,
+    );
diff --git a/pkg/vm_service/test/breakpoint_async_break_test.dart b/pkg/vm_service/test/breakpoint_async_break_test.dart
new file mode 100644
index 0000000..d0c2443
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_async_break_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 18;
+
+// Issue: https://github.com/dart-lang/sdk/issues/36622
+Future<void> testMain() async {
+  for (int i = 0; i < 2; i++) {
+    if (i > 0) {
+      break; // breakpoint here
+    }
+    await Future.delayed(Duration(seconds: 1));
+  }
+}
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  // Test future breakpoints.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    final rootLib =
+        await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
+    final scriptId = rootLib.scripts![0].id!;
+    final script = await service.getObject(isolateId, scriptId) as Script;
+
+    // Future breakpoint.
+    var futureBpt = await service.addBreakpoint(isolateId, scriptId, LINE);
+    expect(futureBpt.breakpointNumber, 1);
+    expect(futureBpt.resolved, isFalse);
+    expect(await futureBpt.location!.line, LINE);
+    expect(await futureBpt.location!.column, null);
+
+    final completer = Completer<void>();
+    int resolvedCount = 0;
+    late StreamSubscription subscription;
+    subscription = service.onDebugEvent.listen((event) {
+      if (event.kind == EventKind.kBreakpointResolved) {
+        resolvedCount++;
+      } else if (event.kind == EventKind.kPauseBreakpoint) {
+        subscription.cancel();
+        service.streamCancel(EventStreams.kDebug);
+        completer.complete();
+      }
+    });
+
+    await service.streamListen(EventStreams.kDebug);
+    await service.resume(isolateId);
+    await hasStoppedAtBreakpoint(service, isolate);
+
+    // After resolution the breakpoints have assigned line & column.
+    expect(resolvedCount, 1);
+    futureBpt = await service.getObject(isolateId, futureBpt.id!) as Breakpoint;
+    expect(futureBpt.resolved, isTrue);
+    expect(
+        script.getLineNumberFromTokenPos(futureBpt.location!.tokenPos), LINE);
+    expect(script.getColumnNumberFromTokenPos(futureBpt.location!.tokenPos), 7);
+
+    // Remove the breakpoints.
+    expect((await service.removeBreakpoint(isolateId, futureBpt.id!)).type,
+        'Success');
+  },
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'breakpoint_async_break_test.dart',
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+    );
diff --git a/pkg/vm_service/test/breakpoint_in_package_parts_class_file_uri_test.dart b/pkg/vm_service/test/breakpoint_in_package_parts_class_file_uri_test.dart
new file mode 100644
index 0000000..70cd0fd
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_in_package_parts_class_file_uri_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' show Platform;
+
+import 'package:path/path.dart' as path;
+import 'package:test_package/has_part.dart' as has_part;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+// Chop off the file name.
+String baseDirectory = path.dirname(Platform.script.path) + '/';
+Uri baseUri = Platform.script.replace(path: baseDirectory);
+Uri breakpointFile = baseUri.resolve('test_package/the_part.dart');
+const String shortFile = "the_part.dart";
+
+const int LINE = 87;
+
+code() {
+  has_part.main();
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$shortFile:${LINE + 0}:5", // on 'print'
+  "$shortFile:${LINE + 1}:3" // on class ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(breakpointFile.toString(), LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main([args = const <String>[]]) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_in_package_parts_class_file_uri_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_in_package_parts_class_test.dart b/pkg/vm_service/test/breakpoint_in_package_parts_class_test.dart
new file mode 100644
index 0000000..2dcf30f
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_in_package_parts_class_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library breakpoint_in_parts_class;
+
+import 'package:test_package/has_part.dart' as has_part;
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 87;
+const String breakpointFile = "package:test_package/the_part.dart";
+const String shortFile = "the_part.dart";
+
+code() {
+  has_part.main();
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$shortFile:${LINE + 0}:5", // on 'print'
+  "$shortFile:${LINE + 1}:3" // on class ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(breakpointFile, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_in_package_parts_class_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_in_parts_class_part.dart b/pkg/vm_service/test/breakpoint_in_parts_class_part.dart
new file mode 100644
index 0000000..4855332
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_in_parts_class_part.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of breakpoint_in_parts_class;
+
+void foo() {
+  print("lalala");
+}
+
+class Foo1 {
+  final foo;
+
+  Foo1(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo2 {
+  final foo;
+
+  Foo2(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo3 {
+  final foo;
+
+  Foo3(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo4 {
+  final foo;
+
+  Foo4(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo5 {
+  final foo;
+
+  Foo5(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo6 {
+  final foo;
+
+  Foo6(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo7 {
+  final foo;
+
+  Foo7(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo8 {
+  final foo;
+
+  Foo8(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo9 {
+  final foo;
+
+  Foo9(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo10 {
+  final foo;
+
+  Foo10(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+var foo2 = foo() as dynamic;
diff --git a/pkg/vm_service/test/breakpoint_in_parts_class_test.dart b/pkg/vm_service/test/breakpoint_in_parts_class_test.dart
new file mode 100644
index 0000000..89f4e7f
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_in_parts_class_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+part 'breakpoint_in_parts_class_part.dart';
+
+const int LINE = 87;
+const String file = "breakpoint_in_parts_class_part.dart";
+
+code() {
+  final foo = Foo10("Foo!");
+  print(foo);
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:5", // on 'print'
+  "$file:${LINE + 1}:3" // on class ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_in_parts_class_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_non_debuggable_library_test.dart b/pkg/vm_service/test/breakpoint_non_debuggable_library_test.dart
new file mode 100644
index 0000000..4ecd5c4
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_non_debuggable_library_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_package/has_part.dart' as test_pkg;
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const String file = 'package:test_package/has_part.dart';
+// print() within fooz()
+const int LINE_A = 15;
+// print() within barz()
+const int LINE_B = 11;
+
+testMain() {
+  test_pkg.fooz();
+}
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  (VmService service, IsolateRef isolateRef) async {
+    // Mark 'package:observatory_test_package/has_part.dart' as not debuggable.
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+
+    LibraryRef has_part_ref = isolate.libraries!.firstWhere(
+      (LibraryRef library) => library.uri == file,
+    );
+
+    Library has_part =
+        await service.getObject(isolateId, has_part_ref.id!) as Library;
+    expect(has_part.debuggable, true);
+    // SetBreakpoint before setting library to non-debuggable.
+    // Breakpoints are allowed to be set (before marking library as
+    // non-debuggable) but are not hit when running (after marking library
+    // as non-debuggable).
+    ScriptRef script = has_part.scripts!.firstWhere(
+      (ScriptRef script) => script.uri == file,
+    );
+    Breakpoint bpt = await service.addBreakpoint(isolateId, script.id!, LINE_A);
+    print("Breakpoint is $bpt");
+    expect(bpt, isNotNull);
+
+    // Set breakpoint and check later that this breakpoint won't be added if
+    // the library is non-debuggable.
+    bpt = await service.addBreakpoint(isolateId, script.id!, LINE_B);
+    print("Breakpoint is $bpt");
+    expect(bpt, isNotNull);
+
+    // Remove breakpoint.
+    final res = await service.removeBreakpoint(isolateId, bpt.id!);
+    expect(res.type, 'Success');
+
+    await service.setLibraryDebuggable(isolateId, has_part.id!, false);
+    has_part = await service.getObject(isolateId, has_part.id!) as Library;
+    expect(has_part.debuggable, false);
+    print('$has_part is debuggable: ${has_part.debuggable}');
+
+    // Breakpoints are not allowed to set on non-debuggable libraries.
+    try {
+      await service.addBreakpoint(isolateId, script.id!, LINE_B);
+    } on RPCError catch (e) {
+      // Cannot add breakpoint error code
+      expect(e.code, 102);
+      expect(e.details, contains("Cannot add breakpoint at line '11'"));
+      print("Set Breakpoint to non-debuggable library is not allowed");
+    }
+  },
+  resumeIsolate,
+  hasStoppedAtExit,
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'breakpoint_non_debuggable_library_test.dart',
+      testeeConcurrent: testMain,
+      pause_on_start: true,
+      pause_on_exit: true,
+    );
diff --git a/pkg/vm_service/test/breakpoint_on_if_null_1_test.dart b/pkg/vm_service/test/breakpoint_on_if_null_1_test.dart
new file mode 100644
index 0000000..c46cabe
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_on_if_null_1_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 18;
+const String file = "breakpoint_on_if_null_1_test.dart";
+
+code() {
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == null) {
+    print("was null");
+  }
+  if (args != null) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:12", // on '=='
+  "$file:${LINE + 3}:12", // on '!='
+  "$file:${LINE + 4}:5", // on 'print'
+  "$file:${LINE + 6}:12", // on '=='
+  "$file:${LINE + 7}:5", // on 'print'
+  "$file:${LINE + 9}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_on_if_null_1_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_on_if_null_2_test.dart b/pkg/vm_service/test/breakpoint_on_if_null_2_test.dart
new file mode 100644
index 0000000..69bee59
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_on_if_null_2_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 21;
+const String file = "breakpoint_on_if_null_2_test.dart";
+
+dynamic compareWithMe = 43;
+
+code() {
+  compareWithMe = null;
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == compareWithMe) {
+    print("was null");
+  }
+  if (args != compareWithMe) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:12", // on '=='
+  "$file:${LINE + 3}:12", // on '!='
+  "$file:${LINE + 4}:5", // on 'print'
+  "$file:${LINE + 6}:12", // on '=='
+  "$file:${LINE + 7}:5", // on 'print'
+  "$file:${LINE + 9}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_on_if_null_2_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_on_if_null_3_test.dart b/pkg/vm_service/test/breakpoint_on_if_null_3_test.dart
new file mode 100644
index 0000000..9211410
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_on_if_null_3_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 17;
+const String file = "breakpoint_on_if_null_3_test.dart";
+
+code() {
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == null) {
+    print("was null");
+  }
+  if (args != null) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:13", // on 'args'
+  "$file:${LINE + 1}:12", // on '=='
+  "$file:${LINE + 4}:12", // on '!='
+  "$file:${LINE + 5}:5", // on 'print'
+  "$file:${LINE + 7}:12", // on '=='
+  "$file:${LINE + 8}:5", // on 'print'
+  "$file:${LINE + 10}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_on_if_null_3_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_on_if_null_4_test.dart b/pkg/vm_service/test/breakpoint_on_if_null_4_test.dart
new file mode 100644
index 0000000..08b7760
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_on_if_null_4_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library breakpoint_in_parts_class;
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 20;
+const String file = "breakpoint_on_if_null_4_test.dart";
+
+dynamic compareWithMe = 43;
+
+code() {
+  compareWithMe = null;
+  foo(42);
+}
+
+foo(dynamic args) {
+  if (args == compareWithMe) {
+    print("was null");
+  }
+  if (args != compareWithMe) {
+    print("was not null");
+  }
+  if (args == 42) {
+    print("was 42!");
+  }
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$file:${LINE + 0}:13", // on 'args'
+  "$file:${LINE + 1}:12", // on '=='
+  "$file:${LINE + 4}:12", // on '!='
+  "$file:${LINE + 5}:5", // on 'print'
+  "$file:${LINE + 7}:12", // on '=='
+  "$file:${LINE + 8}:5", // on 'print'
+  "$file:${LINE + 10}:1", // on ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(file, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_on_if_null_4_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_partfile_test.dart b/pkg/vm_service/test/breakpoint_partfile_test.dart
new file mode 100644
index 0000000..a3c5fd1
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_partfile_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library breakpoint_in_parts_class;
+
+import 'package:test_package/has_part.dart' as has_part;
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE = 8;
+const String breakpointFile = "package:test_package/the_part_2.dart";
+const String shortFile = "the_part_2.dart";
+
+code() {
+  has_part.bar();
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$shortFile:${LINE + 0}:3", // on 'print'
+  "$shortFile:${LINE + 1}:1" // on class ending '}'
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(breakpointFile, LINE),
+  runStepThroughProgramRecordingStops(stops),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoint_partfile_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/breakpoint_two_args_checked_test.dart b/pkg/vm_service/test/breakpoint_two_args_checked_test.dart
new file mode 100644
index 0000000..40d0dc6
--- /dev/null
+++ b/pkg/vm_service/test/breakpoint_two_args_checked_test.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--verbose_debug
+
+// TODO(bkonyi): consider deleting now that DBC is no more.
+// This test was mostly interesting for DBC, which needed to patch two bytecodes
+// to create a breakpoint for fast Smi ops.
+
+import 'dart:developer';
+
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const int LINE_A = 29;
+const int LINE_B = 30;
+const int LINE_C = 31;
+
+class NotGeneric {}
+
+testeeMain() {
+  final x = List<dynamic>.filled(1, null);
+  final y = 7;
+  debugger();
+  print("Statement");
+  x[0] = 3; // Line A.
+  x is NotGeneric; // Line B.
+  y & 4; // Line C.
+}
+
+final tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+
+// Add breakpoints.
+  (VmService service, IsolateRef isolateRef) async {
+    final isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    Library rootLib =
+        await service.getObject(isolateId, isolate.rootLib!.id!) as Library;
+
+    final script =
+        await service.getObject(isolateId, rootLib.scripts![0].id!) as Script;
+    final scriptId = script.id!;
+
+    final bpt1 = await service.addBreakpoint(isolateId, scriptId, LINE_A);
+    print(bpt1);
+    expect(bpt1.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(bpt1.location!.tokenPos),
+        equals(LINE_A));
+
+    final bpt2 = await service.addBreakpoint(isolateId, scriptId, LINE_B);
+    print(bpt2);
+    expect(bpt2.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(bpt2.location!.tokenPos),
+        equals(LINE_B));
+
+    final bpt3 = await service.addBreakpoint(isolateId, scriptId, LINE_C);
+    print(bpt3);
+    expect(bpt3.resolved, isTrue);
+    expect(script.getLineNumberFromTokenPos(bpt3.location!.tokenPos),
+        equals(LINE_C));
+  },
+
+  resumeIsolate,
+
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_A),
+  resumeIsolate,
+
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_B),
+  resumeIsolate,
+
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_C),
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(
+      args,
+      tests,
+      'breakpoint_two_args_checked_test.dart',
+      testeeConcurrent: testeeMain,
+    );
diff --git a/pkg/vm_service/test/breakpoints_with_mixin_lib1.dart b/pkg/vm_service/test/breakpoints_with_mixin_lib1.dart
new file mode 100644
index 0000000..3c43715
--- /dev/null
+++ b/pkg/vm_service/test/breakpoints_with_mixin_lib1.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "breakpoints_with_mixin_lib3.dart";
+
+class Test1 extends Object with Foo {}
diff --git a/pkg/vm_service/test/breakpoints_with_mixin_lib2.dart b/pkg/vm_service/test/breakpoints_with_mixin_lib2.dart
new file mode 100644
index 0000000..c054176
--- /dev/null
+++ b/pkg/vm_service/test/breakpoints_with_mixin_lib2.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "breakpoints_with_mixin_lib3.dart";
+
+class Test2 extends Object with Foo {}
diff --git a/pkg/vm_service/test/breakpoints_with_mixin_lib3.dart b/pkg/vm_service/test/breakpoints_with_mixin_lib3.dart
new file mode 100644
index 0000000..a7329de
--- /dev/null
+++ b/pkg/vm_service/test/breakpoints_with_mixin_lib3.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Foo {
+  foo() {
+    print("I should be breakable!");
+  }
+}
+
+class Bar {
+  bar() {
+    print("I should be breakable too!");
+  }
+}
diff --git a/pkg/vm_service/test/breakpoints_with_mixin_test.dart b/pkg/vm_service/test/breakpoints_with_mixin_test.dart
new file mode 100644
index 0000000..f382628
--- /dev/null
+++ b/pkg/vm_service/test/breakpoints_with_mixin_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "breakpoints_with_mixin_lib1.dart";
+import "breakpoints_with_mixin_lib2.dart";
+import "breakpoints_with_mixin_lib3.dart";
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+const String testFilename = "breakpoints_with_mixin_test.dart";
+const int testCodeLineStart = 17;
+const String lib3Filename = "breakpoints_with_mixin_lib3.dart";
+const int lib3Bp1 = 7;
+const int lib3Bp2 = 13;
+
+void code() {
+  Test1 test1 = Test1();
+  test1.foo();
+  Test2 test2 = Test2();
+  test2.foo();
+  Foo foo = Foo();
+  foo.foo();
+  Bar bar = Bar();
+  bar.bar();
+  test1.foo();
+  test2.foo();
+  foo.foo();
+  bar.bar();
+}
+
+List<String> stops = [];
+
+List<String> expected = [
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 2}:9)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 4}:9)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 6}:7)",
+  "$lib3Filename:$lib3Bp2:5 ($testFilename:${testCodeLineStart + 8}:7)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 9}:9)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 10}:9)",
+  "$lib3Filename:$lib3Bp1:5 ($testFilename:${testCodeLineStart + 11}:7)",
+  "$lib3Filename:$lib3Bp2:5 ($testFilename:${testCodeLineStart + 12}:7)",
+];
+
+var tests = <IsolateTest>[
+  hasPausedAtStart,
+  setBreakpointAtUriAndLine(lib3Filename, lib3Bp1),
+  setBreakpointAtUriAndLine(lib3Filename, lib3Bp2),
+  resumeProgramRecordingStops(stops, true),
+  checkRecordedStops(stops, expected)
+];
+
+main(args) {
+  runIsolateTestsSynchronous(
+    args,
+    tests,
+    'breakpoints_with_mixin_test.dart',
+    testeeConcurrent: code,
+    pause_on_start: true,
+    pause_on_exit: true,
+  );
+}
diff --git a/pkg/vm_service/test/common/service_test_common.dart b/pkg/vm_service/test/common/service_test_common.dart
index 4f616ab..6e84d16 100644
--- a/pkg/vm_service/test/common/service_test_common.dart
+++ b/pkg/vm_service/test/common/service_test_common.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 
+import 'package:path/path.dart';
 import 'package:test/test.dart';
 import 'package:vm_service/vm_service.dart';
 
@@ -131,6 +132,16 @@
   };
 }
 
+IsolateTest setBreakpointAtUriAndLine(String uri, int line) {
+  return (VmService service, IsolateRef isolateRef) async {
+    print("Setting breakpoint for line $line in $uri");
+    Breakpoint bpt =
+        await service.addBreakpointWithScriptUri(isolateRef.id!, uri, line);
+    print("Breakpoint is $bpt");
+    expect(bpt, isNotNull);
+  };
+}
+
 IsolateTest stoppedAtLine(int line) {
   return (VmService service, IsolateRef isolateRef) async {
     print("Checking we are at line $line");
@@ -221,3 +232,154 @@
   await hasStoppedAtBreakpoint(service, isolateRef);
   await _unsubscribeDebugStream(service);
 }
+
+IsolateTest resumeProgramRecordingStops(
+    List<String> recordStops, bool includeCaller) {
+  return (VmService service, IsolateRef isolateRef) async {
+    final completer = Completer<void>();
+
+    late StreamSubscription subscription;
+    subscription = service.onDebugEvent.listen((event) async {
+      if (event.kind == EventKind.kPauseBreakpoint) {
+        final stack = await service.getStack(isolateRef.id!);
+        final frames = stack.frames!;
+        expect(frames.length, greaterThanOrEqualTo(2));
+
+        String brokeAt =
+            await _locationToString(service, isolateRef, frames[0]);
+        if (includeCaller) {
+          brokeAt =
+              '$brokeAt (${await _locationToString(service, isolateRef, frames[1])})';
+        }
+        recordStops.add(brokeAt);
+        await service.resume(isolateRef.id!);
+      } else if (event.kind == EventKind.kPauseExit) {
+        await subscription.cancel();
+        await service.streamCancel(EventStreams.kDebug);
+        completer.complete();
+      }
+    });
+
+    await service.streamListen(EventStreams.kDebug);
+    await service.resume(isolateRef.id!);
+    return completer.future;
+  };
+}
+
+Future<String> _locationToString(
+  VmService service,
+  IsolateRef isolateRef,
+  Frame frame,
+) async {
+  final location = frame.location!;
+  Script script =
+      await service.getObject(isolateRef.id!, location.script!.id!) as Script;
+  final scriptName = basename(script.uri!);
+  final tokenPos = location.tokenPos!;
+  final line = script.getLineNumberFromTokenPos(tokenPos);
+  final column = script.getColumnNumberFromTokenPos(tokenPos);
+  return '$scriptName:$line:$column';
+}
+
+IsolateTest runStepThroughProgramRecordingStops(List<String> recordStops) {
+  return (VmService service, IsolateRef isolateRef) async {
+    final completer = Completer<void>();
+
+    late StreamSubscription subscription;
+    subscription = service.onDebugEvent.listen((event) async {
+      if (event.kind == EventKind.kPauseBreakpoint) {
+        final isolate = await service.getIsolate(isolateRef.id!);
+        final frame = isolate.pauseEvent!.topFrame!;
+        recordStops.add(await _locationToString(service, isolateRef, frame));
+        if (event.atAsyncSuspension ?? false) {
+          await service.resume(isolateRef.id!,
+              step: StepOption.kOverAsyncSuspension);
+        } else {
+          await service.resume(isolateRef.id!, step: StepOption.kOver);
+        }
+      } else if (event.kind == EventKind.kPauseExit) {
+        await subscription.cancel();
+        await service.streamCancel(EventStreams.kDebug);
+        completer.complete();
+      }
+    });
+
+    await service.streamListen(EventStreams.kDebug);
+    await service.resume(isolateRef.id!);
+    return completer.future;
+  };
+}
+
+IsolateTest checkRecordedStops(
+    List<String> recordStops, List<String> expectedStops,
+    {bool removeDuplicates = false,
+    bool debugPrint = false,
+    String? debugPrintFile,
+    int? debugPrintLine}) {
+  return (VmService service, IsolateRef isolate) async {
+    if (debugPrint) {
+      for (int i = 0; i < recordStops.length; i++) {
+        String line = recordStops[i];
+        String output = line;
+        int firstColon = line.indexOf(":");
+        int lastColon = line.lastIndexOf(":");
+        if (debugPrintFile != null &&
+            debugPrintLine != null &&
+            firstColon > 0 &&
+            lastColon > 0) {
+          int lineNumber = int.parse(line.substring(firstColon + 1, lastColon));
+          int relativeLineNumber = lineNumber - debugPrintLine;
+          var columnNumber = line.substring(lastColon + 1);
+          var file = line.substring(0, firstColon);
+          if (file == debugPrintFile) {
+            output = '\$file:\${LINE+$relativeLineNumber}:$columnNumber';
+          }
+        }
+        String comma = i == recordStops.length - 1 ? "" : ",";
+        print('"$output"$comma');
+      }
+    }
+    if (removeDuplicates) {
+      recordStops = removeAdjacentDuplicates(recordStops);
+      expectedStops = removeAdjacentDuplicates(expectedStops);
+    }
+
+    // Single stepping may record extra stops.
+    // Allow the extra ones as long as the expected ones are recorded.
+    int i = 0;
+    int j = 0;
+    while (i < recordStops.length && j < expectedStops.length) {
+      if (recordStops[i] != expectedStops[j]) {
+        // Check if recordStops[i] is an extra stop.
+        int k = i + 1;
+        while (k < recordStops.length && recordStops[k] != expectedStops[j]) {
+          k++;
+        }
+        if (k < recordStops.length) {
+          // Allow and ignore extra recorded stops from i to k-1.
+          i = k;
+        } else {
+          // This will report an error.
+          expect(recordStops[i], expectedStops[j]);
+        }
+      }
+      i++;
+      j++;
+    }
+
+    expect(recordStops.length >= expectedStops.length, true,
+        reason: "Expects at least ${expectedStops.length} breaks, "
+            "got ${recordStops.length}.");
+  };
+}
+
+List<String> removeAdjacentDuplicates(List<String> fromList) {
+  List<String> result = <String>[];
+  String? latestLine;
+  for (String s in fromList) {
+    if (s == latestLine) continue;
+    latestLine = s;
+    result.add(s);
+  }
+  return result;
+}
diff --git a/pkg/vm_service/test/common/test_helper.dart b/pkg/vm_service/test/common/test_helper.dart
index 45ce97b..e16e307d 100644
--- a/pkg/vm_service/test/common/test_helper.dart
+++ b/pkg/vm_service/test/common/test_helper.dart
@@ -277,6 +277,7 @@
         vm = await vmServiceConnectUri(serviceWebsocketAddress);
         print('Done loading VM');
         isolate = await getFirstIsolate(vm);
+        print('Got first isolate');
       });
     });
 
@@ -326,18 +327,23 @@
     Completer<dynamic>? completer = Completer();
     late StreamSubscription subscription;
     subscription = service.onIsolateEvent.listen((Event event) async {
+      print('Isolate event: $event');
       if (completer == null) {
         await subscription.cancel();
         return;
       }
       if (event.kind == EventKind.kIsolateRunnable) {
+        print(event.isolate!.name);
         vm = await service.getVM();
-        assert(vmIsolates.isNotEmpty);
         await subscription.cancel();
-        completer!.complete(vmIsolates.first);
+        await service.streamCancel(EventStreams.kIsolate);
+        completer!.complete(event.isolate!);
         completer = null;
       }
     });
+    await service.streamListen(EventStreams.kIsolate);
+
+    await service.streamListen(EventStreams.kIsolate);
 
     // The isolate may have started before we subscribed.
     vm = await service.getVM();
diff --git a/pkg/vm_service/test/mark_main_isolate_as_system_isolate_test.dart b/pkg/vm_service/test/mark_main_isolate_as_system_isolate_test.dart
index fb97b82..6219ebf 100644
--- a/pkg/vm_service/test/mark_main_isolate_as_system_isolate_test.dart
+++ b/pkg/vm_service/test/mark_main_isolate_as_system_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:developer';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/pkg/vm_service/test/pause_on_exceptions_legacy_test.dart b/pkg/vm_service/test/pause_on_exceptions_legacy_test.dart
new file mode 100644
index 0000000..21ff3a8
--- /dev/null
+++ b/pkg/vm_service/test/pause_on_exceptions_legacy_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+doThrow() {
+  throw "TheException"; // Line 13.
+}
+
+doCaught() {
+  try {
+    doThrow();
+  } catch (e) {
+    return "end of doCaught";
+  }
+}
+
+doUncaught() {
+  doThrow();
+  return "end of doUncaught";
+}
+
+final tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    final isolate = await service.getIsolate(isolateRef.id!);
+    final lib = await service.getObject(isolateRef.id!, isolate.rootLib!.id!);
+
+    Completer? onPaused;
+    Completer? onResume;
+
+    final stream = service.onDebugEvent;
+    final subscription = stream.listen((Event event) {
+      print("Event $event");
+      if (event.kind == EventKind.kPauseException) {
+        if (onPaused == null) throw "Unexpected pause event $event";
+        final t = onPaused;
+        onPaused = null;
+        t!.complete(event);
+      }
+      if (event.kind == EventKind.kResume) {
+        if (onResume == null) throw "Unexpected resume event $event";
+        final t = onResume;
+        onResume = null;
+        t!.complete(event);
+      }
+    });
+    await service.streamListen(EventStreams.kDebug);
+
+    test(String pauseMode, String expression, bool shouldPause,
+        bool shouldBeCaught) async {
+      print("Evaluating $expression with pause on $pauseMode exception");
+
+      // ignore: deprecated_member_use_from_same_package
+      await service.setExceptionPauseMode(isolate.id!, pauseMode);
+
+      late Completer t;
+      if (shouldPause) {
+        t = Completer();
+        onPaused = t;
+      }
+      final fres = service.evaluate(isolate.id!, lib.id!, expression);
+      if (shouldPause) {
+        await t.future;
+
+        final stack = await service.getStack(isolate.id!);
+        expect(stack.frames![0].function!.name, 'doThrow');
+
+        t = Completer();
+        onResume = t;
+        await service.resume(isolate.id!);
+        await t.future;
+      }
+
+      dynamic res = await fres;
+      if (shouldBeCaught) {
+        expect(res is InstanceRef, true);
+        expect(res.kind, 'String');
+        expect(res.valueAsString, equals("end of doCaught"));
+      } else {
+        print(res.json);
+        expect(res is ErrorRef, true);
+        res = await service.getObject(isolate.id!, res.id!);
+        expect(res is Error, true);
+        expect(res.exception.kind, 'String');
+        expect(res.exception.valueAsString, equals("TheException"));
+      }
+    }
+
+    await test("All", "doCaught()", true, true);
+    await test("All", "doUncaught()", true, false);
+
+    await test("Unhandled", "doCaught()", false, true);
+    await test("Unhandled", "doUncaught()", true, false);
+
+    await test("None", "doCaught()", false, true);
+    await test("None", "doUncaught()", false, false);
+
+    await subscription.cancel();
+  },
+];
+
+main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'pause_on_exceptions_test.dart',
+    );
diff --git a/pkg/vm_service/test/pause_on_exceptions_test.dart b/pkg/vm_service/test/pause_on_exceptions_test.dart
new file mode 100644
index 0000000..9da7dfc
--- /dev/null
+++ b/pkg/vm_service/test/pause_on_exceptions_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+doThrow() {
+  throw "TheException"; // Line 13.
+}
+
+doCaught() {
+  try {
+    doThrow();
+  } catch (e) {
+    return "end of doCaught";
+  }
+}
+
+doUncaught() {
+  doThrow();
+  return "end of doUncaught";
+}
+
+final tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    final isolate = await service.getIsolate(isolateRef.id!);
+    final lib = await service.getObject(isolateRef.id!, isolate.rootLib!.id!);
+
+    Completer? onPaused;
+    Completer? onResume;
+
+    final stream = service.onDebugEvent;
+    final subscription = stream.listen((Event event) {
+      print("Event $event");
+      if (event.kind == EventKind.kPauseException) {
+        if (onPaused == null) throw "Unexpected pause event $event";
+        final t = onPaused;
+        onPaused = null;
+        t!.complete(event);
+      }
+      if (event.kind == EventKind.kResume) {
+        if (onResume == null) throw "Unexpected resume event $event";
+        final t = onResume;
+        onResume = null;
+        t!.complete(event);
+      }
+    });
+    await service.streamListen(EventStreams.kDebug);
+
+    test(String pauseMode, String expression, bool shouldPause,
+        bool shouldBeCaught) async {
+      print("Evaluating $expression with pause on $pauseMode exception");
+
+      await service.setIsolatePauseMode(isolate.id!,
+          exceptionPauseMode: pauseMode);
+
+      late Completer t;
+      if (shouldPause) {
+        t = Completer();
+        onPaused = t;
+      }
+      final fres = service.evaluate(isolate.id!, lib.id!, expression);
+      if (shouldPause) {
+        await t.future;
+
+        final stack = await service.getStack(isolate.id!);
+        expect(stack.frames![0].function!.name, 'doThrow');
+
+        t = Completer();
+        onResume = t;
+        await service.resume(isolate.id!);
+        await t.future;
+      }
+
+      dynamic res = await fres;
+      if (shouldBeCaught) {
+        expect(res is InstanceRef, true);
+        expect(res.kind, 'String');
+        expect(res.valueAsString, equals("end of doCaught"));
+      } else {
+        print(res.json);
+        expect(res is ErrorRef, true);
+        res = await service.getObject(isolate.id!, res.id!);
+        expect(res is Error, true);
+        expect(res.exception.kind, 'String');
+        expect(res.exception.valueAsString, equals("TheException"));
+      }
+    }
+
+    await test("All", "doCaught()", true, true);
+    await test("All", "doUncaught()", true, false);
+
+    await test("Unhandled", "doCaught()", false, true);
+    await test("Unhandled", "doUncaught()", true, false);
+
+    await test("None", "doCaught()", false, true);
+    await test("None", "doUncaught()", false, false);
+
+    await subscription.cancel();
+  },
+];
+
+main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'pause_on_exceptions_test.dart',
+    );
diff --git a/pkg/vm_service/test/should_pause_on_exit_test.dart b/pkg/vm_service/test/should_pause_on_exit_test.dart
new file mode 100644
index 0000000..575530c
--- /dev/null
+++ b/pkg/vm_service/test/should_pause_on_exit_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/test_helper.dart';
+
+void testMain() {
+  print('Hello world!');
+}
+
+Future<bool> shouldPauseOnExit(VmService service, IsolateRef isolateRef) async {
+  final isolate = await service.getIsolate(isolateRef.id!);
+  return isolate.pauseOnExit!;
+}
+
+final tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    await service.setIsolatePauseMode(isolateRef.id!, shouldPauseOnExit: false);
+    expect(await shouldPauseOnExit(service, isolateRef), false);
+    final completer = Completer<void>();
+
+    final stream = service.onDebugEvent;
+    final subscription = stream.listen((Event event) {
+      if (event.kind == EventKind.kPauseExit) {
+        completer.complete();
+      }
+    });
+    await service.streamListen(EventStreams.kDebug);
+
+    await service.setIsolatePauseMode(isolateRef.id!, shouldPauseOnExit: true);
+    expect(await shouldPauseOnExit(service, isolateRef), true);
+    await service.resume(isolateRef.id!);
+    await completer.future;
+    await service.resume(isolateRef.id!);
+    await subscription.cancel();
+  },
+];
+
+void main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'should_pause_on_exit_test.dart',
+      pause_on_start: true,
+      pause_on_exit: true,
+      testeeConcurrent: testMain,
+    );
diff --git a/pkg/vm_service/test/test_package/has_part.dart b/pkg/vm_service/test/test_package/has_part.dart
new file mode 100644
index 0000000..fb68ee7
--- /dev/null
+++ b/pkg/vm_service/test/test_package/has_part.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library has_part;
+
+part 'the_part.dart';
+part 'the_part_2.dart';
+
+barz() {
+  print('in bar!');
+}
+
+fooz() {
+  print('in foo!');
+  bar();
+}
+
+main() {
+  Foo10 foo = Foo10("Foo!");
+  print(foo);
+}
diff --git a/pkg/vm_service/test/test_package/pubspec.yaml b/pkg/vm_service/test/test_package/pubspec.yaml
new file mode 100644
index 0000000..b5bc9d7
--- /dev/null
+++ b/pkg/vm_service/test/test_package/pubspec.yaml
@@ -0,0 +1,4 @@
+name: test_package
+publish_to: none
+environment:
+  sdk: '>=2.12.0-0 <3.0.0'
diff --git a/pkg/vm_service/test/test_package/the_part.dart b/pkg/vm_service/test/test_package/the_part.dart
new file mode 100644
index 0000000..d8545f8
--- /dev/null
+++ b/pkg/vm_service/test/test_package/the_part.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of has_part;
+
+void foo() {
+  print("lalala");
+}
+
+class Foo1 {
+  final foo;
+
+  Foo1(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo2 {
+  final foo;
+
+  Foo2(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo3 {
+  final foo;
+
+  Foo3(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo4 {
+  final foo;
+
+  Foo4(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo5 {
+  final foo;
+
+  Foo5(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo6 {
+  final foo;
+
+  Foo6(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo7 {
+  final foo;
+
+  Foo7(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo8 {
+  final foo;
+
+  Foo8(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo9 {
+  final foo;
+
+  Foo9(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+class Foo10 {
+  final foo;
+
+  Foo10(this.foo) {
+    print("hello from foo!");
+  }
+}
+
+var foo2 = foo() as dynamic;
diff --git a/pkg/vm_service/test/test_package/the_part_2.dart b/pkg/vm_service/test/test_package/the_part_2.dart
new file mode 100644
index 0000000..c38df9c
--- /dev/null
+++ b/pkg/vm_service/test/test_package/the_part_2.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of has_part;
+
+void bar() {
+  print('Should break here');
+}
diff --git a/pkg/vm_service/tool/common/parser.dart b/pkg/vm_service/tool/common/parser.dart
index 08d3709..233320a 100644
--- a/pkg/vm_service/tool/common/parser.dart
+++ b/pkg/vm_service/tool/common/parser.dart
@@ -167,6 +167,23 @@
         .trim();
   }
 
+  String? consumeString() {
+    StringBuffer buf = StringBuffer();
+    String startQuotation = advance()!.text!;
+    if (startQuotation != '"' && startQuotation != "'") {
+      return null;
+    }
+    while (peek()!.text != startQuotation) {
+      Token t = advance()!;
+      if (t.text == null) {
+        throw FormatException('Reached EOF');
+      }
+      buf.write('${t.text} ');
+    }
+    advance();
+    return buf.toString().trim();
+  }
+
   void validate(bool result, String message) {
     if (!result) throw 'expected ${message}';
   }
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 844b1ff..d59b1e7 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -725,6 +725,9 @@
             }
             return result;
           };
+          if (m.deprecated) {
+            gen.writeln("// ignore: deprecated_member_use_from_same_package");
+          }
           gen.write("response = await _serviceImplementation.${m.name}(");
           // Positional args
           m.args.where((arg) => !arg.optional).forEach((MethodArg arg) {
@@ -932,6 +935,10 @@
   return obj;
 }
 
+List<dynamic> assertListOfDynamic(List<dynamic> list) {
+  return list;
+}
+
 List<int> assertListOfInt(List<int> list) {
   for (int elem in list) {
     assertInt(elem);
@@ -1130,6 +1137,8 @@
   final String? docs;
 
   MemberType returnType = MemberType();
+  bool get deprecated => deprecationMessage != null;
+  String? deprecationMessage;
   List<MethodArg> args = [];
 
   Method(this.name, String definition, [this.docs]) {
@@ -1196,6 +1205,9 @@
       }
       if (_docs.isNotEmpty) gen.writeDocs(_docs);
     }
+    if (deprecated) {
+      gen.writeln("@Deprecated('$deprecationMessage')");
+    }
     if (withOverrides) gen.writeln('@override');
     gen.write('Future<${returnType.name}> ${name}(');
     bool startedOptional = false;
@@ -2128,7 +2140,12 @@
   void parseInto(Method method) {
     // method is return type, name, (, args )
     // args is type name, [optional], comma
-
+    if (peek()?.text?.startsWith('@deprecated') ?? false) {
+      advance();
+      expect('(');
+      method.deprecationMessage = consumeString()!;
+      expect(')');
+    }
     method.returnType.parse(this, isReturnType: true);
 
     Token t = expectName();
diff --git a/pkg/vm_service/tool/java/generate_java.dart b/pkg/vm_service/tool/java/generate_java.dart
index 9ef243d..c80a481 100644
--- a/pkg/vm_service/tool/java/generate_java.dart
+++ b/pkg/vm_service/tool/java/generate_java.dart
@@ -496,6 +496,7 @@
   final String? docs;
 
   MemberType returnType = MemberType();
+  bool deprecated = false;
   List<MethodArg> args = [];
 
   Method(this.name, String definition, [this.docs]) {
@@ -606,7 +607,7 @@
         }
       }
       writer.addLine('request("$name", params, consumer);');
-    }, javadoc: javadoc.toString());
+    }, javadoc: javadoc.toString(), isDeprecated: deprecated);
   }
 
   void _parse(Token? token) {
@@ -647,6 +648,13 @@
     // method is return type, name, (, args )
     // args is type name, [optional], comma
 
+    if (peek()?.text?.startsWith('@deprecated') ?? false) {
+      advance();
+      expect('(');
+      consumeString();
+      expect(')');
+      method.deprecated = true;
+    }
     method.returnType.parse(this);
 
     Token t = expectName();
diff --git a/pkg/vm_service/tool/java/src_gen_java.dart b/pkg/vm_service/tool/java/src_gen_java.dart
index b67c203..a2e62e5 100644
--- a/pkg/vm_service/tool/java/src_gen_java.dart
+++ b/pkg/vm_service/tool/java/src_gen_java.dart
@@ -214,6 +214,7 @@
     String? modifiers = 'public',
     String? returnType = 'void',
     bool isOverride = false,
+    bool isDeprecated = false,
   }) {
     var methodDecl = StringBuffer();
     if (javadoc != null && javadoc.isNotEmpty) {
@@ -223,6 +224,9 @@
           .forEach((line) => methodDecl.writeln('   * $line'.trimRight()));
       methodDecl.writeln('   */');
     }
+    if (isDeprecated) {
+      methodDecl.writeln('  @Deprecated');
+    }
     if (isOverride) {
       methodDecl.writeln('  @Override');
     }
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index dd25e81..8b3999a 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -132,6 +132,9 @@
     defines += [ "DART_USE_TCMALLOC" ]
     include_dirs += [ "../third_party/tcmalloc/gperftools/src" ]
   }
+  if (dart_use_mallinfo2) {
+    defines += [ "DART_USE_MALLINFO2" ]
+  }
 
   if (dart_use_compressed_pointers) {
     defines += [ "DART_COMPRESSED_POINTERS" ]
diff --git a/runtime/bin/dart_embedder_api_impl.cc b/runtime/bin/dart_embedder_api_impl.cc
index 88c641f..9ba84e9 100644
--- a/runtime/bin/dart_embedder_api_impl.cc
+++ b/runtime/bin/dart_embedder_api_impl.cc
@@ -17,17 +17,17 @@
 namespace embedder {
 
 static char* MallocFormatedString(const char* format, ...) {
-  va_list args;
-  va_start(args, format);
-  intptr_t len = vsnprintf(NULL, 0, format, args);
-  va_end(args);
+  va_list measure_args;
+  va_start(measure_args, format);
+  intptr_t len = vsnprintf(NULL, 0, format, measure_args);
+  va_end(measure_args);
 
   char* buffer = reinterpret_cast<char*>(malloc(len + 1));
   MSAN_UNPOISON(buffer, (len + 1));
-  va_list args2;
-  va_start(args2, format);
-  vsnprintf(buffer, (len + 1), format, args2);
-  va_end(args2);
+  va_list print_args;
+  va_start(print_args, format);
+  vsnprintf(buffer, (len + 1), format, print_args);
+  va_end(print_args);
   return buffer;
 }
 
diff --git a/runtime/bin/dartdev_isolate.cc b/runtime/bin/dartdev_isolate.cc
index 0f75c8e..4b9fe69 100644
--- a/runtime/bin/dartdev_isolate.cc
+++ b/runtime/bin/dartdev_isolate.cc
@@ -210,6 +210,7 @@
   flags.use_field_guards = true;
   flags.use_osr = true;
   flags.is_system_isolate = true;
+  flags.branch_coverage = false;
 
   char* error;
   Dart_Isolate dartdev_isolate = runner->create_isolate_(
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 565753d..05a500e 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -729,17 +729,17 @@
 }
 
 Dart_Handle DartUtils::NewError(const char* format, ...) {
-  va_list args;
-  va_start(args, format);
-  intptr_t len = vsnprintf(NULL, 0, format, args);
-  va_end(args);
+  va_list measure_args;
+  va_start(measure_args, format);
+  intptr_t len = vsnprintf(NULL, 0, format, measure_args);
+  va_end(measure_args);
 
   char* buffer = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 1));
   MSAN_UNPOISON(buffer, (len + 1));
-  va_list args2;
-  va_start(args2, format);
-  vsnprintf(buffer, (len + 1), format, args2);
-  va_end(args2);
+  va_list print_args;
+  va_start(print_args, format);
+  vsnprintf(buffer, (len + 1), format, print_args);
+  va_end(print_args);
 
   return Dart_NewApiError(buffer);
 }
@@ -749,17 +749,17 @@
 }
 
 Dart_Handle DartUtils::NewStringFormatted(const char* format, ...) {
-  va_list args;
-  va_start(args, format);
-  intptr_t len = vsnprintf(NULL, 0, format, args);
-  va_end(args);
+  va_list measure_args;
+  va_start(measure_args, format);
+  intptr_t len = vsnprintf(NULL, 0, format, measure_args);
+  va_end(measure_args);
 
   char* buffer = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 1));
   MSAN_UNPOISON(buffer, (len + 1));
-  va_list args2;
-  va_start(args2, format);
-  vsnprintf(buffer, (len + 1), format, args2);
-  va_end(args2);
+  va_list print_args;
+  va_start(print_args, format);
+  vsnprintf(buffer, (len + 1), format, print_args);
+  va_end(print_args);
 
   return NewString(buffer);
 }
diff --git a/runtime/bin/directory_win.cc b/runtime/bin/directory_win.cc
index 804bfff..3e199239 100644
--- a/runtime/bin/directory_win.cc
+++ b/runtime/bin/directory_win.cc
@@ -512,16 +512,6 @@
   }
   const char* prefixed_new_dir = PrefixLongDirectoryPath(new_path);
   Utf8ToWideScope system_new_path(prefixed_new_dir);
-  ExistsResult new_exists = ExistsHelper(system_new_path.wide());
-  // MoveFile does not allow replacing existing directories. Therefore,
-  // if the new_path is currently a directory we need to delete it
-  // first.
-  if (new_exists == EXISTS) {
-    bool success = Delete(namespc, prefixed_new_dir, true);
-    if (!success) {
-      return false;
-    }
-  }
   DWORD flags = MOVEFILE_WRITE_THROUGH;
   int move_status =
       MoveFileExW(system_path.wide(), system_new_path.wide(), flags);
diff --git a/runtime/bin/ffi_test/ffi_test_functions.cc b/runtime/bin/ffi_test/ffi_test_functions.cc
index 1784af3..dd5e41f 100644
--- a/runtime/bin/ffi_test/ffi_test_functions.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions.cc
@@ -1133,4 +1133,38 @@
   return sizeof(Struct3BytesPackedIntCopy);
 }
 
+// Define ssize_t for Windows as intptr_t.
+#if defined(_WIN32)
+typedef intptr_t ssize_t;
+#endif
+
+#define DEFINE_SIZE_OF(type_modifier, type)                                    \
+  DART_EXPORT uint64_t FfiSizeOf_##type_modifier##_##type() {                  \
+    return sizeof(type_modifier type);                                         \
+  }
+
+#define SIZES(F)                                                               \
+  F(, intptr_t)                                                                \
+  F(, uintptr_t)                                                               \
+  F(, int)                                                                     \
+  F(unsigned, int)                                                             \
+  F(, long)         /* NOLINT */                                               \
+  F(unsigned, long) /* NOLINT */                                               \
+  F(, wchar_t)                                                                 \
+  F(, size_t)                                                                  \
+  F(, ssize_t)                                                                 \
+  F(, off_t)
+
+SIZES(DEFINE_SIZE_OF)
+
+#undef DEFINE_SIZE_OF
+#undef SIZES
+
+DART_EXPORT int64_t WCharMinValue() {
+  return WCHAR_MIN;
+}
+DART_EXPORT int64_t WCharMaxValue() {
+  return WCHAR_MAX;
+}
+
 }  // namespace dart
diff --git a/runtime/bin/ffi_test/ffi_test_functions_generated.cc b/runtime/bin/ffi_test/ffi_test_functions_generated.cc
index dc17bb0..724fe55 100644
--- a/runtime/bin/ffi_test/ffi_test_functions_generated.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions_generated.cc
@@ -566,6 +566,10 @@
   Struct16BytesHomogeneousFloat a2;
 };
 
+struct StructInlineArrayInt {
+  wchar_t a0[10];
+};
+
 // Used for testing structs and unions by value.
 // Smallest struct with data.
 // 10 struct arguments will exhaust available registers.
@@ -4895,6 +4899,46 @@
 }
 
 // Used for testing structs and unions by value.
+// Returning a wchar.
+DART_EXPORT wchar_t PassWCharStructInlineArrayIntUintPtrx2LongUnsigned(
+    wchar_t a0,
+    StructInlineArrayInt a1,
+    uintptr_t a2,
+    uintptr_t a3,
+    /* NOLINT(runtime/int) */ long a4,
+    /* NOLINT(runtime/int) */ unsigned long a5) {
+  std::cout << "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned"
+            << "(" << a0 << ", ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
+            << a1.a0[2] << ", " << a1.a0[3] << ", " << a1.a0[4] << ", "
+            << a1.a0[5] << ", " << a1.a0[6] << ", " << a1.a0[7] << ", "
+            << a1.a0[8] << ", " << a1.a0[9] << "]), " << a2 << ", " << a3
+            << ", " << a4 << ", " << a5 << ")"
+            << "\n";
+
+  wchar_t result = 0;
+
+  result += a0;
+  result += a1.a0[0];
+  result += a1.a0[1];
+  result += a1.a0[2];
+  result += a1.a0[3];
+  result += a1.a0[4];
+  result += a1.a0[5];
+  result += a1.a0[6];
+  result += a1.a0[7];
+  result += a1.a0[8];
+  result += a1.a0[9];
+  result += a2;
+  result += a3;
+  result += a4;
+  result += a5;
+
+  std::cout << "result = " << result << "\n";
+
+  return result;
+}
+
+// Used for testing structs and unions by value.
 // Smallest struct with data.
 DART_EXPORT Struct1ByteInt ReturnStruct1ByteInt(int8_t a0) {
   std::cout << "ReturnStruct1ByteInt"
@@ -12599,21 +12643,85 @@
 
   std::cout << "result = " << result << "\n";
 
-  CHECK_APPROX(1, result);
+  CHECK_EQ(1, result);
 
   // Pass argument that will make the Dart callback throw.
   a0 = 42;
 
   result = f(a0, a1);
 
-  CHECK_APPROX(0.0, result);
+  CHECK_EQ(0, result);
 
   // Pass argument that will make the Dart callback return null.
   a0 = 84;
 
   result = f(a0, a1);
 
-  CHECK_APPROX(0.0, result);
+  CHECK_EQ(0, result);
+
+  return 0;
+}
+
+// Used for testing structs and unions by value.
+// Returning a wchar.
+DART_EXPORT intptr_t TestPassWCharStructInlineArrayIntUintPtrx2LongUnsigned(
+    // NOLINTNEXTLINE(whitespace/parens)
+    wchar_t (*f)(wchar_t a0,
+                 StructInlineArrayInt a1,
+                 uintptr_t a2,
+                 uintptr_t a3,
+                 /* NOLINT(runtime/int) */ long a4,
+                 /* NOLINT(runtime/int) */ unsigned long a5)) {
+  wchar_t a0;
+  StructInlineArrayInt a1 = {};
+  uintptr_t a2;
+  uintptr_t a3;
+  /* NOLINT(runtime/int) */ long a4;
+  /* NOLINT(runtime/int) */ unsigned long a5;
+
+  a0 = 1;
+  a1.a0[0] = 2;
+  a1.a0[1] = 3;
+  a1.a0[2] = 4;
+  a1.a0[3] = 5;
+  a1.a0[4] = 6;
+  a1.a0[5] = 7;
+  a1.a0[6] = 8;
+  a1.a0[7] = 9;
+  a1.a0[8] = 10;
+  a1.a0[9] = 11;
+  a2 = 12;
+  a3 = 13;
+  a4 = 14;
+  a5 = 15;
+
+  std::cout << "Calling TestPassWCharStructInlineArrayIntUintPtrx2LongUnsigned("
+            << "(" << a0 << ", ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
+            << a1.a0[2] << ", " << a1.a0[3] << ", " << a1.a0[4] << ", "
+            << a1.a0[5] << ", " << a1.a0[6] << ", " << a1.a0[7] << ", "
+            << a1.a0[8] << ", " << a1.a0[9] << "]), " << a2 << ", " << a3
+            << ", " << a4 << ", " << a5 << ")"
+            << ")\n";
+
+  wchar_t result = f(a0, a1, a2, a3, a4, a5);
+
+  std::cout << "result = " << result << "\n";
+
+  CHECK_EQ(120, result);
+
+  // Pass argument that will make the Dart callback throw.
+  a0 = 42;
+
+  result = f(a0, a1, a2, a3, a4, a5);
+
+  CHECK_EQ(0, result);
+
+  // Pass argument that will make the Dart callback return null.
+  a0 = 84;
+
+  result = f(a0, a1, a2, a3, a4, a5);
+
+  CHECK_EQ(0, result);
 
   return 0;
 }
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index bb24d00..6cb8860 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -896,7 +896,7 @@
 
 void File::Stat(Namespace* namespc, const char* name, int64_t* data) {
   const char* prefixed_name = PrefixLongFilePath(name);
-  File::Type type = GetType(namespc, prefixed_name, false);
+  File::Type type = GetType(namespc, prefixed_name, true);
   data[kType] = type;
   if (type != kDoesNotExist) {
     struct _stat64 st;
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index df755a73..6a24139 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -879,7 +879,10 @@
   if (IsSnapshottingForPrecompilation()) {
     vm_options.AddArgument("--precompilation");
   } else if ((snapshot_kind == kCoreJIT) || (snapshot_kind == kAppJIT)) {
-    vm_options.AddArgument("--fields_may_be_reset");
+    // Core-jit and app-jit snapshot can be deployed to another machine,
+    // so  generated code should not depend on the CPU features
+    // of the system where snapshot was generated.
+    vm_options.AddArgument("--target-unknown-cpu");
 #if !defined(TARGET_ARCH_IA32)
     vm_options.AddArgument("--link_natives_lazily");
 #endif
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index efa37c8..17b9404 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -144,7 +144,7 @@
   V(SocketBase_IsBindError, 2)                                                 \
   V(Socket_Available, 1)                                                       \
   V(Socket_AvailableDatagram, 1)                                               \
-  V(Socket_CreateBindConnect, 5)                                               \
+  V(Socket_CreateBindConnect, 6)                                               \
   V(Socket_CreateUnixDomainBindConnect, 4)                                     \
   V(Socket_CreateBindDatagram, 6)                                              \
   V(Socket_CreateConnect, 4)                                                   \
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 4193965..d03555a 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -222,7 +222,7 @@
     if (Dart_IsError(result)) goto failed;
   } else {
     result = DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri));
-    if (Dart_IsError(result)) return result != nullptr;
+    if (Dart_IsError(result)) goto failed;
 
     if (isolate_group_data->kernel_buffer().get() != nullptr) {
       // Various core-library parts will send requests to the Loader to resolve
@@ -637,36 +637,36 @@
       delete app_snapshot;
     }
 
-    if (dartdev_path.get() != nullptr) {
-      isolate_group_data =
-          new IsolateGroupData(DART_DEV_ISOLATE_NAME, packages_config, nullptr,
-                               isolate_run_app_snapshot);
-      uint8_t* application_kernel_buffer = NULL;
-      intptr_t application_kernel_buffer_size = 0;
-      dfe.ReadScript(dartdev_path.get(), &application_kernel_buffer,
-                     &application_kernel_buffer_size, /*decode_uri=*/false);
-      isolate_group_data->SetKernelBufferNewlyOwned(
-          application_kernel_buffer, application_kernel_buffer_size);
-
-      isolate_data = new IsolateData(isolate_group_data);
-      isolate = Dart_CreateIsolateGroup(
-          DART_DEV_ISOLATE_NAME, DART_DEV_ISOLATE_NAME, isolate_snapshot_data,
-          isolate_snapshot_instructions, flags, isolate_group_data,
-          isolate_data, error);
+    if (dartdev_path.get() == nullptr) {
+      Syslog::PrintErr(
+          "Failed to start the Dart CLI isolate. Could not resolve DartDev "
+          "snapshot or kernel.\n");
+      delete isolate_data;
+      delete isolate_group_data;
+      return nullptr;
     }
+
+    isolate_group_data =
+        new IsolateGroupData(DART_DEV_ISOLATE_NAME, packages_config, nullptr,
+                             isolate_run_app_snapshot);
+    uint8_t* application_kernel_buffer = NULL;
+    intptr_t application_kernel_buffer_size = 0;
+    dfe.ReadScript(dartdev_path.get(), &application_kernel_buffer,
+                   &application_kernel_buffer_size, /*decode_uri=*/false);
+    isolate_group_data->SetKernelBufferNewlyOwned(
+        application_kernel_buffer, application_kernel_buffer_size);
+
+    isolate_data = new IsolateData(isolate_group_data);
+    isolate = Dart_CreateIsolateGroup(
+        DART_DEV_ISOLATE_NAME, DART_DEV_ISOLATE_NAME, isolate_snapshot_data,
+        isolate_snapshot_instructions, flags, isolate_group_data, isolate_data,
+        error);
   }
 
-  Dart_Isolate created_isolate = nullptr;
-  if (isolate == nullptr) {
-    Syslog::PrintErr("Failed to start the Dart CLI isolate\n");
-    delete isolate_data;
-    delete isolate_group_data;
-    return nullptr;
-  } else {
-    created_isolate = IsolateSetupHelper(
-        isolate, false, DART_DEV_ISOLATE_NAME, packages_config,
-        isolate_run_app_snapshot, flags, error, exit_code);
-  }
+  Dart_Isolate created_isolate =
+      IsolateSetupHelper(isolate, false, DART_DEV_ISOLATE_NAME, packages_config,
+                         isolate_run_app_snapshot, flags, error, exit_code);
+
   int64_t end = Dart_TimelineGetMicros();
   Dart_TimelineEvent("CreateAndSetupDartDevIsolate", start, end,
                      Dart_Timeline_Event_Duration, 0, NULL, NULL);
@@ -827,6 +827,20 @@
   ASSERT(flags != NULL);
   ASSERT(flags->version == DART_FLAGS_CURRENT_VERSION);
   ASSERT(package_root == nullptr);
+
+  bool dontneed_safe = true;
+#if defined(DART_HOST_OS_LINUX)
+  // This would also be true in Linux, except that Google3 overrides the default
+  // ELF interpreter to one that apparently doesn't create proper mappings.
+  dontneed_safe = false;
+#elif defined(DEBUG)
+  // If the snapshot isn't file-backed, madvise(DONT_NEED) is destructive.
+  if (Options::force_load_elf_from_memory()) {
+    dontneed_safe = false;
+  }
+#endif
+  flags->snapshot_is_dontneed_safe = dontneed_safe;
+
   int exit_code = 0;
 #if !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
   if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) {
@@ -946,6 +960,18 @@
   Dart_IsolateFlags flags;
   Dart_IsolateFlagsInitialize(&flags);
   flags.is_system_isolate = Options::mark_main_isolate_as_system_isolate();
+  bool dontneed_safe = true;
+#if defined(DART_HOST_OS_LINUX)
+  // This would also be true in Linux, except that Google3 overrides the default
+  // ELF interpreter to one that apparently doesn't create proper mappings.
+  dontneed_safe = false;
+#elif defined(DEBUG)
+  // If the snapshot isn't file-backed, madvise(DONT_NEED) is destructive.
+  if (Options::force_load_elf_from_memory()) {
+    dontneed_safe = false;
+  }
+#endif
+  flags.snapshot_is_dontneed_safe = dontneed_safe;
 
   Dart_Isolate isolate = CreateIsolateGroupAndSetupHelper(
       /* is_main_isolate */ true, script_name, "main",
@@ -1213,12 +1239,15 @@
     try_load_snapshots_lambda();
   }
 
-  if (Options::gen_snapshot_kind() == kAppJIT) {
-    vm_options.AddArgument("--fields_may_be_reset");
-  }
 #if defined(DART_PRECOMPILED_RUNTIME)
   vm_options.AddArgument("--precompilation");
 #endif
+  if (Options::gen_snapshot_kind() == kAppJIT) {
+    // App-jit snapshot can be deployed to another machine,
+    // so generated code should not depend on the CPU features
+    // of the system where snapshot was generated.
+    vm_options.AddArgument("--target-unknown-cpu");
+  }
   // If we need to write an app-jit snapshot or a depfile, then add an exit
   // hook that writes the snapshot and/or depfile as appropriate.
   if ((Options::gen_snapshot_kind() == kAppJIT) ||
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index ccd8144..d560dab 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -384,7 +384,8 @@
       dart::bin::DartUtils::ReadFile, dart::bin::DartUtils::WriteFile,
       dart::bin::DartUtils::CloseFile, /*entropy_source=*/nullptr,
       /*get_service_assets=*/nullptr, start_kernel_isolate,
-      /*code_observer=*/nullptr);
+      /*code_observer=*/nullptr, /*post_task=*/nullptr,
+      /*post_task_data*/ nullptr);
   if (error != nullptr) {
     Syslog::PrintErr("Failed to initialize VM: %s\n", error);
     free(error);
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 62cc613..21bfadf 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -396,8 +396,13 @@
   SocketAddress::SetAddrPort(&addr, static_cast<intptr_t>(port));
   RawAddr sourceAddr;
   SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 3), &sourceAddr);
+  Dart_Handle source_port_arg = Dart_GetNativeArgument(args, 4);
+  int64_t source_port =
+      DartUtils::GetInt64ValueCheckRange(source_port_arg, 0, 65535);
+  SocketAddress::SetAddrPort(&sourceAddr, static_cast<intptr_t>(source_port));
+
   if (addr.addr.sa_family == AF_INET6) {
-    Dart_Handle scope_id_arg = Dart_GetNativeArgument(args, 4);
+    Dart_Handle scope_id_arg = Dart_GetNativeArgument(args, 5);
     int64_t scope_id =
         DartUtils::GetInt64ValueCheckRange(scope_id_arg, 0, 65535);
     SocketAddress::SetAddrScope(&addr, scope_id);
diff --git a/runtime/docs/infra/il_tests.md b/runtime/docs/infra/il_tests.md
index 8400b6e..94c4500 100644
--- a/runtime/docs/infra/il_tests.md
+++ b/runtime/docs/infra/il_tests.md
@@ -11,76 +11,47 @@
 
 IL tests are placed in files ending with `_il_test.dart`.
 
-Each IL test should contain one or more _IL matching blocks_, which have the
-following format:
+Each IL test should contain one or more of the functions marked with a
+`@pragma('vm:testing:print-flow-graph'[, 'phases filter'])`.
+
+These functions will have their IL dumped at points specified by the
+_phases filter_ (if present, `]AllocateRegisters` by default), which follows
+the same syntax as `--compiler-passes=` flag and dumped IL will be compared
+against the expectations, which are specified programmatically using
+`package:vm/testing/il_matchers.dart` helpers. A function named `foo` has
+its IL expectations in the function called `matchIL$foo` in the same file.
 
 ```dart
-// MatchIL[AOT]=functionName
-//   comment
-// __ op
-//   comment
-// __ op
-// __ op
-// __ op
+import 'package:vm/testing/il_matchers.dart';
+
+@pragma('vm:testing:print-flow-graph')
+void foo() {
+}
+
+/// Expectations for [foo].
+void matchIL$foo(FlowGraph graph) {
+  graph.match([/* expectations */]);
+}
 ```
 
-Each section starts with a `// MatchIL[AOT]=functionName` line which contains
-the name (or a substring of a name) of the function for which IL should be
-matched.
-
-`// MatchIL[AOT]=...` line is followed by some number of comment lines `//`,
-where lines starting with `// __ ` specify _an instruction matcher_ and the rest
-are ignored (they just act as normal comments).
-
-`gen_snapshot` will be instructed (via `--print-flow-graph-optimized` and
-`--print-flow-graph-filter=functionName,...` flags) to dump IL for all
-functions names specified in IL matching blocks.
-
-After that `pkg/vm/tool/compare_il` script will be used to compare the dumps
-to actual expectations: by checking that dumped flow graph starts with the
-expected sequence of commands (ignoring some instructions like `ParallelMove`).
+Actual matching is done by the `pkg/vm/tool/compare_il` script.
 
 ## Example
 
 ```dart
-// MatchIL[AOT]=factorial
-// __ GraphEntry
-// __ FunctionEntry
-// __ CheckStackOverflow
-// __ Branch(EqualityCompare)
 @pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph')
 int factorial(int value) => value == 1 ? value : value * factorial(value - 1);
-```
 
-This test specifies that the graph for `factorial` should start with a sequence
-`GraphEntry`, `FunctionEntry`, `CheckStackOverflow`, `Branch(EqualityCompare)`.
-
-If the graph has a different shape the test will fail, e.g. given the graph
-
-```
-*** BEGIN CFG
-After AllocateRegisters
-==== file:///.../src/dart/sdk/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart_::_factorial (RegularFunction)
-  0: B0[graph]:0 {
-      v3 <- Constant(#1) [1, 1] T{_Smi}
-      v19 <- UnboxedConstant(#1 int64) T{_Smi}
+void matchIL$factorial(FlowGraph graph) {
+  // Expected a graph which starts with GraphEntry block followed by a
+  // FunctionEntry block. FunctionEntry block should contain a Branch()
+  // instruction, with EqualityCompare as a comparison.
+  graph.match([
+    match.block('Graph'),
+    match.block('Function', [
+      match.Branch(match.EqualityCompare(match.any, match.any, kind: '==')),
+    ]),
+  ]);
 }
-  2: B1[function entry]:2 {
-      v2 <- Parameter(0) [-9223372036854775808, 9223372036854775807] T{int}
-}
-  4:     CheckStackOverflow:8(stack=0, loop=0)
-  5:     ParallelMove rcx <- S+2
-  6:     v17 <- BoxInt64(v2) [-9223372036854775808, 9223372036854775807] T{int}
-  7:     ParallelMove rax <- rax
-  8:     Branch if StrictCompare(===, v17 T{int}, v3) T{bool} goto (3, 4)
-```
-
-we will get:
-
-```
-Unhandled exception:
-Failed to match graph of ==== file:///.../src/dart/sdk/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart_::_factorial (RegularFunction) to expectations for factorial at instruction 3: got BoxInt64 expected Branch(EqualityCompare)
-#0      main (file:///.../src/dart/sdk/pkg/vm/bin/compare_il.dart:37:9)
-#1      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:285:32)
-#2      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:187:12)
-```
+```
\ No newline at end of file
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index b62c1a7..f37de2b 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -381,9 +381,9 @@
  * See the additional discussion under "Propagating Errors" at the
  * beginning of this file.
  *
- * \param An error handle (See Dart_IsError)
+ * \param handle An error handle (See Dart_IsError)
  *
- * \return On success, this function does not return.  On failure, the
+ * On success, this function does not return.  On failure, the
  * process is terminated.
  */
 DART_EXPORT void Dart_PropagateError(Dart_Handle handle);
@@ -443,9 +443,6 @@
  *
  * \param obj1 A persistent handle whose value needs to be set.
  * \param obj2 An object whose value needs to be set to the persistent handle.
- *
- * \return Success if the persistent handle was set
- *   Otherwise, returns an error.
  */
 DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1,
                                           Dart_Handle obj2);
@@ -586,7 +583,7 @@
  *
  * \return The version string for the embedded Dart VM.
  */
-DART_EXPORT const char* Dart_VersionString();
+DART_EXPORT const char* Dart_VersionString(void);
 
 /**
  * Isolate specific flags are set when creating a new isolate using the
@@ -609,6 +606,7 @@
   bool null_safety;
   bool is_system_isolate;
   bool snapshot_is_dontneed_safe;
+  bool branch_coverage;
 } Dart_IsolateFlags;
 
 /**
@@ -772,45 +770,63 @@
  * This function could be used to dispose of native resources that
  * are associated and attached to the thread, in order to avoid leaks.
  */
-typedef void (*Dart_ThreadExitCallback)();
+typedef void (*Dart_ThreadExitCallback)(void);
 
 /**
- * Callbacks provided by the embedder for file operations. If the
- * embedder does not allow file operations these callbacks can be
+ * Opens a file for reading or writing.
+ *
+ * Callback provided by the embedder for file operations. If the
+ * embedder does not allow file operations this callback can be
  * NULL.
  *
- * Dart_FileOpenCallback - opens a file for reading or writing.
  * \param name The name of the file to open.
  * \param write A boolean variable which indicates if the file is to
  *   opened for writing. If there is an existing file it needs to truncated.
+ */
+typedef void* (*Dart_FileOpenCallback)(const char* name, bool write);
+
+/**
+ * Read contents of file.
  *
- * Dart_FileReadCallback - Read contents of file.
+ * Callback provided by the embedder for file operations. If the
+ * embedder does not allow file operations this callback can be
+ * NULL.
+ *
  * \param data Buffer allocated in the callback into which the contents
  *   of the file are read into. It is the responsibility of the caller to
  *   free this buffer.
  * \param file_length A variable into which the length of the file is returned.
  *   In the case of an error this value would be -1.
  * \param stream Handle to the opened file.
- *
- * Dart_FileWriteCallback - Write data into file.
- * \param data Buffer which needs to be written into the file.
- * \param length Length of the buffer.
- * \param stream Handle to the opened file.
- *
- * Dart_FileCloseCallback - Closes the opened file.
- * \param stream Handle to the opened file.
- *
  */
-typedef void* (*Dart_FileOpenCallback)(const char* name, bool write);
-
 typedef void (*Dart_FileReadCallback)(uint8_t** data,
                                       intptr_t* file_length,
                                       void* stream);
 
+/**
+ * Write data into file.
+ *
+ * Callback provided by the embedder for file operations. If the
+ * embedder does not allow file operations this callback can be
+ * NULL.
+ *
+ * \param data Buffer which needs to be written into the file.
+ * \param length Length of the buffer.
+ * \param stream Handle to the opened file.
+ */
 typedef void (*Dart_FileWriteCallback)(const void* data,
                                        intptr_t length,
                                        void* stream);
 
+/**
+ * Closes the opened file.
+ *
+ * Callback provided by the embedder for file operations. If the
+ * embedder does not allow file operations this callback can be
+ * NULL.
+ *
+ * \param stream Handle to the opened file.
+ */
 typedef void (*Dart_FileCloseCallback)(void* stream);
 
 typedef bool (*Dart_EntropySource)(uint8_t* buffer, intptr_t length);
@@ -825,13 +841,13 @@
  * \return The embedder must return a handle to a Uint8List containing an
  *   uncompressed tar archive or null.
  */
-typedef Dart_Handle (*Dart_GetVMServiceAssetsArchive)();
+typedef Dart_Handle (*Dart_GetVMServiceAssetsArchive)(void);
 
 /**
  * The current version of the Dart_InitializeFlags. Should be incremented every
  * time Dart_InitializeFlags changes in a binary incompatible way.
  */
-#define DART_INITIALIZE_PARAMS_CURRENT_VERSION (0x00000004)
+#define DART_INITIALIZE_PARAMS_CURRENT_VERSION (0x00000005)
 
 /** Forward declaration */
 struct Dart_CodeObserver;
@@ -857,52 +873,133 @@
   Dart_OnNewCodeCallback on_new_code;
 } Dart_CodeObserver;
 
+typedef struct _Dart_Task* Dart_Task;
+typedef enum {
+  Dart_TaskPriority_Default,
+} Dart_TaskPriority;
+typedef struct {
+  /**
+   * Placeholder.
+   */
+  Dart_TaskPriority priority;
+  /**
+   * Time after which the task should run according to the clock of
+   * Dart_TimelineGetMicros.
+   */
+  int64_t time_point;
+} Dart_TaskData;
+/**
+ * Callback provided by the embedder that is used by the VM to eventually run
+ * various tasks. If no callback is provided, these tasks will run on a
+ * VM-internal thread pool. This callback allows the embedder to make its own
+ * choices around the scheduling of these tasks: when they run, how many threads
+ * are servicing these tasks, the priorities of said threads, etc.
+ * The callback can be invoked as early as during the Dart_Initialize call.
+ *
+ * \param post_task_data
+ *     The data provided to Dart_InitializeParams.post_task_data.
+ * \param task
+ *     A task that should eventually be passed to Dart_RunTask.
+ * \param task_data
+ *     Hints about when the task should run.
+ */
+typedef void (*Dart_PostTaskCallback)(void* post_task_data,
+                                      Dart_Task task,
+                                      Dart_TaskData task_data);
+
+/**
+ * Runs a task given to the Dart_PostTaskCallback. Must not be called
+ * synchronously in response to any callback from the VM. In particular, must
+ * not be called synchronously by the implemention of a Dart native function
+ * or Dart_Post_TaskCallback.
+ *
+ * Requires there to be no current isolate or isolate group.
+ */
+DART_EXPORT void Dart_RunTask(Dart_Task task);
+
 /**
  * Describes how to initialize the VM. Used with Dart_Initialize.
- *
- * \param version Identifies the version of the struct used by the client.
- *   should be initialized to DART_INITIALIZE_PARAMS_CURRENT_VERSION.
- * \param vm_isolate_snapshot A buffer containing a snapshot of the VM isolate
- *   or NULL if no snapshot is provided. If provided, the buffer must remain
- *   valid until Dart_Cleanup returns.
- * \param instructions_snapshot A buffer containing a snapshot of precompiled
- *   instructions, or NULL if no snapshot is provided. If provided, the buffer
- *   must remain valid until Dart_Cleanup returns.
- * \param initialize_isolate A function to be called during isolate
- *   initialization inside an existing isolate group.
- *   See Dart_InitializeIsolateCallback.
- * \param create_group A function to be called during isolate group creation.
- *   See Dart_IsolateGroupCreateCallback.
- * \param shutdown A function to be called right before an isolate is shutdown.
- *   See Dart_IsolateShutdownCallback.
- * \param cleanup A function to be called after an isolate was shutdown.
- *   See Dart_IsolateCleanupCallback.
- * \param cleanup_group A function to be called after an isolate group is shutdown.
- *   See Dart_IsolateGroupCleanupCallback.
- * \param get_service_assets A function to be called by the service isolate when
- *    it requires the vmservice assets archive.
- *    See Dart_GetVMServiceAssetsArchive.
- * \param code_observer An external code observer callback function.
- *    The observer can be invoked as early as during the Dart_Initialize() call.
  */
 typedef struct {
+  /**
+   * Identifies the version of the struct used by the client.
+   * should be initialized to DART_INITIALIZE_PARAMS_CURRENT_VERSION.
+   */
   int32_t version;
+
+  /**
+   * A buffer containing snapshot data, or NULL if no snapshot is provided.
+   *
+   * If provided, the buffer must remain valid until Dart_Cleanup returns.
+   */
   const uint8_t* vm_snapshot_data;
+
+  /**
+   * A buffer containing a snapshot of precompiled instructions, or NULL if
+   * no snapshot is provided.
+   *
+   * If provided, the buffer must remain valid until Dart_Cleanup returns.
+   */
   const uint8_t* vm_snapshot_instructions;
+
+  /**
+   * A function to be called during isolate group creation.
+   * See Dart_IsolateGroupCreateCallback.
+   */
   Dart_IsolateGroupCreateCallback create_group;
+
+  /**
+   * A function to be called during isolate
+   * initialization inside an existing isolate group.
+   * See Dart_InitializeIsolateCallback.
+   */
   Dart_InitializeIsolateCallback initialize_isolate;
+
+  /**
+   * A function to be called right before an isolate is shutdown.
+   * See Dart_IsolateShutdownCallback.
+   */
   Dart_IsolateShutdownCallback shutdown_isolate;
+
+  /**
+   * A function to be called after an isolate was shutdown.
+   * See Dart_IsolateCleanupCallback.
+   */
   Dart_IsolateCleanupCallback cleanup_isolate;
+
+  /**
+   * A function to be called after an isolate group is
+   * shutdown. See Dart_IsolateGroupCleanupCallback.
+   */
   Dart_IsolateGroupCleanupCallback cleanup_group;
+
   Dart_ThreadExitCallback thread_exit;
   Dart_FileOpenCallback file_open;
   Dart_FileReadCallback file_read;
   Dart_FileWriteCallback file_write;
   Dart_FileCloseCallback file_close;
   Dart_EntropySource entropy_source;
+
+  /**
+   * A function to be called by the service isolate when it requires the
+   * vmservice assets archive. See Dart_GetVMServiceAssetsArchive.
+   */
   Dart_GetVMServiceAssetsArchive get_service_assets;
+
   bool start_kernel_isolate;
+
+  /**
+   * An external code observer callback function. The observer can be invoked
+   * as early as during the Dart_Initialize() call.
+   */
   Dart_CodeObserver* code_observer;
+
+  /**
+   * A task scheduling callback function. See Dart_PostTaskCallback.
+   */
+  Dart_PostTaskCallback post_task;
+
+  void* post_task_data;
 } Dart_InitializeParams;
 
 /**
@@ -926,7 +1023,7 @@
  * NOTE: This function must not be called on a thread that was created by the VM
  * itself.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_Cleanup();
+DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_Cleanup(void);
 
 /**
  * Sets command line flags. Should be called before Dart_Initialize.
@@ -969,15 +1066,17 @@
  * Requires there to be no current isolate.
  *
  * \param script_uri The main source file or snapshot this isolate will load.
- *   The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a child
- *   isolate is created by Isolate.spawn. The embedder should use a URI that
- *   allows it to load the same program into such a child isolate.
+ *   The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a
+ *   child isolate is created by Isolate.spawn. The embedder should use a URI
+ *   that allows it to load the same program into such a child isolate.
  * \param name A short name for the isolate to improve debugging messages.
  *   Typically of the format 'foo.dart:main()'.
- * \param isolate_snapshot_data
- * \param isolate_snapshot_instructions Buffers containing a snapshot of the
- *   isolate or NULL if no snapshot is provided. If provided, the buffers must
+ * \param isolate_snapshot_data Buffer containing the snapshot data of the
+ *   isolate or NULL if no snapshot is provided. If provided, the buffer must
  *   remain valid until the isolate shuts down.
+ * \param isolate_snapshot_instructions Buffer containing the snapshot
+ *   instructions of the isolate or NULL if no snapshot is provided. If
+ *   provided, the buffer must remain valid until the isolate shuts down.
  * \param flags Pointer to VM specific flags or NULL for default flags.
  * \param isolate_group_data Embedder group data. This data can be obtained
  *   by calling Dart_IsolateGroupData and will be passed to the
@@ -1042,14 +1141,14 @@
  * Requires there to be no current isolate.
  *
  * \param script_uri The main source file or snapshot this isolate will load.
- *   The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a child
- *   isolate is created by Isolate.spawn. The embedder should use a URI that
+ *   The VM will provide this URI to the Dart_IsolateGroupCreateCallback when a
+ * child isolate is created by Isolate.spawn. The embedder should use a URI that
  *   allows it to load the same program into such a child isolate.
  * \param name A short name for the isolate to improve debugging messages.
  *   Typically of the format 'foo.dart:main()'.
- * \param kernel_buffer
- * \param kernel_buffer_size A buffer which contains a kernel/DIL program. Must
+ * \param kernel_buffer A buffer which contains a kernel/DIL program. Must
  *   remain valid until isolate shutdown.
+ * \param kernel_buffer_size The size of `kernel_buffer`.
  * \param flags Pointer to VM specific flags or NULL for default flags.
  * \param isolate_group_data Embedder group data. This data can be obtained
  *   by calling Dart_IsolateGroupData and will be passed to the
@@ -1080,20 +1179,20 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_ShutdownIsolate();
+DART_EXPORT void Dart_ShutdownIsolate(void);
 /* TODO(turnidge): Document behavior when there is no current isolate. */
 
 /**
  * Returns the current isolate. Will return NULL if there is no
  * current isolate.
  */
-DART_EXPORT Dart_Isolate Dart_CurrentIsolate();
+DART_EXPORT Dart_Isolate Dart_CurrentIsolate(void);
 
 /**
  * Returns the callback data associated with the current isolate. This
  * data was set when the isolate got created or initialized.
  */
-DART_EXPORT void* Dart_CurrentIsolateData();
+DART_EXPORT void* Dart_CurrentIsolateData(void);
 
 /**
  * Returns the callback data associated with the given isolate. This
@@ -1105,13 +1204,13 @@
  * Returns the current isolate group. Will return NULL if there is no
  * current isolate group.
  */
-DART_EXPORT Dart_IsolateGroup Dart_CurrentIsolateGroup();
+DART_EXPORT Dart_IsolateGroup Dart_CurrentIsolateGroup(void);
 
 /**
  * Returns the callback data associated with the current isolate group. This
  * data was passed to the isolate group when it was created.
  */
-DART_EXPORT void* Dart_CurrentIsolateGroupData();
+DART_EXPORT void* Dart_CurrentIsolateGroupData(void);
 
 /**
  * Returns the callback data associated with the specified isolate group. This
@@ -1127,7 +1226,7 @@
  * This name is unique to each isolate and should only be used to make
  * debugging messages more comprehensible.
  */
-DART_EXPORT Dart_Handle Dart_DebugName();
+DART_EXPORT Dart_Handle Dart_DebugName(void);
 
 /**
  * Returns the ID for an isolate which is used to query the service protocol.
@@ -1188,12 +1287,12 @@
  *
  * Does not require a current isolate. Only valid after calling Dart_Initialize.
  */
-DART_EXPORT void Dart_NotifyLowMemory();
+DART_EXPORT void Dart_NotifyLowMemory(void);
 
 /**
  * Starts the CPU sampling profiler.
  */
-DART_EXPORT void Dart_StartProfiling();
+DART_EXPORT void Dart_StartProfiling(void);
 
 /**
  * Stops the CPU sampling profiler.
@@ -1202,7 +1301,7 @@
  * returns due to the asynchronous nature of the implementation on some
  * platforms.
  */
-DART_EXPORT void Dart_StopProfiling();
+DART_EXPORT void Dart_StopProfiling(void);
 
 /**
  * Notifies the VM that the current thread should not be profiled until a
@@ -1213,7 +1312,7 @@
  * to make a blocking call and wants to avoid unnecessary interrupts by
  * the profiler.
  */
-DART_EXPORT void Dart_ThreadDisableProfiling();
+DART_EXPORT void Dart_ThreadDisableProfiling(void);
 
 /**
  * Notifies the VM that the current thread should be profiled.
@@ -1223,7 +1322,7 @@
  *
  * NOTE: By default, if a thread has entered an isolate it will be profiled.
  */
-DART_EXPORT void Dart_ThreadEnableProfiling();
+DART_EXPORT void Dart_ThreadEnableProfiling(void);
 
 /**
  * Register symbol information for the Dart VM's profiler and crash dumps.
@@ -1241,7 +1340,7 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_ExitIsolate();
+DART_EXPORT void Dart_ExitIsolate(void);
 /* TODO(turnidge): We don't want users of the api to be able to exit a
  * "pure" dart isolate. Implement and document. */
 
@@ -1256,12 +1355,17 @@
  * Requires there to be a current isolate. Not available in the precompiled
  * runtime (check Dart_IsPrecompiledRuntime).
  *
- * \param buffer Returns a pointer to a buffer containing the
- *   snapshot. This buffer is scope allocated and is only valid
+ * \param vm_snapshot_data_buffer Returns a pointer to a buffer containing the
+ *   vm snapshot. This buffer is scope allocated and is only valid
  *   until the next call to Dart_ExitScope.
- * \param size Returns the size of the buffer.
+ * \param vm_snapshot_data_size Returns the size of vm_snapshot_data_buffer.
+ * \param isolate_snapshot_data_buffer Returns a pointer to a buffer containing
+ *   the isolate snapshot. This buffer is scope allocated and is only valid
+ *   until the next call to Dart_ExitScope.
+ * \param isolate_snapshot_data_size Returns the size of
+ *   isolate_snapshot_data_buffer.
  * \param is_core Create a snapshot containing core libraries.
- *                Such snapshot should be agnostic to null safety mode.
+ *   Such snapshot should be agnostic to null safety mode.
  *
  * \return A valid handle if no error occurs during the operation.
  */
@@ -1344,7 +1448,7 @@
  *
  * \return The current message notify callback for the isolate.
  */
-DART_EXPORT Dart_MessageNotifyCallback Dart_GetMessageNotifyCallback();
+DART_EXPORT Dart_MessageNotifyCallback Dart_GetMessageNotifyCallback(void);
 
 /**
  * The VM's default message handler supports pausing an isolate before it
@@ -1370,7 +1474,7 @@
  *
  * \return A boolean value indicating if pause on start was requested.
  */
-DART_EXPORT bool Dart_ShouldPauseOnStart();
+DART_EXPORT bool Dart_ShouldPauseOnStart(void);
 
 /**
  * Override the VM flag `--pause-isolates-on-start` for the current isolate.
@@ -1386,7 +1490,7 @@
  *
  * \return A boolean value indicating if the isolate is paused on start.
  */
-DART_EXPORT bool Dart_IsPausedOnStart();
+DART_EXPORT bool Dart_IsPausedOnStart(void);
 
 /**
  * Called when the embedder has paused the current isolate on start and when
@@ -1401,7 +1505,7 @@
  *
  * \return A boolean value indicating if pause on exit was requested.
  */
-DART_EXPORT bool Dart_ShouldPauseOnExit();
+DART_EXPORT bool Dart_ShouldPauseOnExit(void);
 
 /**
  * Override the VM flag `--pause-isolates-on-exit` for the current isolate.
@@ -1416,7 +1520,7 @@
  *
  * \return A boolean value indicating if the isolate is paused on exit.
  */
-DART_EXPORT bool Dart_IsPausedOnExit();
+DART_EXPORT bool Dart_IsPausedOnExit(void);
 
 /**
  * Called when the embedder has paused the current isolate on exit and when
@@ -1440,14 +1544,14 @@
 /**
  * Does the current isolate have a sticky error?
  */
-DART_EXPORT bool Dart_HasStickyError();
+DART_EXPORT bool Dart_HasStickyError(void);
 
 /**
  * Gets the sticky error for the current isolate.
  *
  * \return A handle to the sticky error object or null.
  */
-DART_EXPORT Dart_Handle Dart_GetStickyError();
+DART_EXPORT Dart_Handle Dart_GetStickyError(void);
 
 /**
  * Handles the next pending message for the current isolate.
@@ -1456,7 +1560,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_HandleMessage();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_HandleMessage(void);
 
 /**
  * Drains the microtask queue, then blocks the calling thread until the current
@@ -1482,14 +1586,14 @@
  * \return true if the vm service requests the program resume
  * execution, false otherwise
  */
-DART_EXPORT bool Dart_HandleServiceMessages();
+DART_EXPORT bool Dart_HandleServiceMessages(void);
 
 /**
  * Does the current isolate have pending service messages?
  *
  * \return true if the isolate has pending service messages, false otherwise.
  */
-DART_EXPORT bool Dart_HasServiceMessages();
+DART_EXPORT bool Dart_HasServiceMessages(void);
 
 /**
  * Processes any incoming messages for the current isolate.
@@ -1507,7 +1611,7 @@
  *   exception or other error occurs while processing messages, an
  *   error handle is returned.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_RunLoop();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_RunLoop(void);
 
 /**
  * Lets the VM run message processing for the isolate.
@@ -1538,14 +1642,14 @@
 /**
  * Gets the main port id for the current isolate.
  */
-DART_EXPORT Dart_Port Dart_GetMainPortId();
+DART_EXPORT Dart_Port Dart_GetMainPortId(void);
 
 /**
  * Does the current isolate have live ReceivePorts?
  *
  * A ReceivePort is live when it has not been closed.
  */
-DART_EXPORT bool Dart_HasLivePorts();
+DART_EXPORT bool Dart_HasLivePorts(void);
 
 /**
  * Posts a message for some isolate. The message is a serialized
@@ -1553,7 +1657,7 @@
  *
  * Requires there to be a current isolate.
  *
- * \param port The destination port.
+ * \param port_id The destination port.
  * \param object An object from the current isolate.
  *
  * \return True if the message was posted.
@@ -1595,7 +1699,7 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_EnterScope();
+DART_EXPORT void Dart_EnterScope(void);
 
 /**
  * Exits a scope.
@@ -1604,7 +1708,7 @@
  *
  * Requires there to be a current isolate.
  */
-DART_EXPORT void Dart_ExitScope();
+DART_EXPORT void Dart_ExitScope(void);
 
 /**
  * The Dart VM uses "zone allocation" for temporary structures. Zones
@@ -1641,7 +1745,7 @@
  *
  * \return A handle to the null object.
  */
-DART_EXPORT Dart_Handle Dart_Null();
+DART_EXPORT Dart_Handle Dart_Null(void);
 
 /**
  * Is this object null?
@@ -1653,7 +1757,7 @@
  *
  * \return A handle to the empty string object.
  */
-DART_EXPORT Dart_Handle Dart_EmptyString();
+DART_EXPORT Dart_Handle Dart_EmptyString(void);
 
 /**
  * Returns types that are not classes, and which therefore cannot be looked up
@@ -1661,9 +1765,9 @@
  *
  * \return A handle to the dynamic, void or Never type.
  */
-DART_EXPORT Dart_Handle Dart_TypeDynamic();
-DART_EXPORT Dart_Handle Dart_TypeVoid();
-DART_EXPORT Dart_Handle Dart_TypeNever();
+DART_EXPORT Dart_Handle Dart_TypeDynamic(void);
+DART_EXPORT Dart_Handle Dart_TypeVoid(void);
+DART_EXPORT Dart_Handle Dart_TypeNever(void);
 
 /**
  * Checks if the two objects are equal.
@@ -1972,7 +2076,7 @@
  *
  * \return A handle to the True object.
  */
-DART_EXPORT Dart_Handle Dart_True();
+DART_EXPORT Dart_Handle Dart_True(void);
 
 /**
  * Returns the False object.
@@ -1981,7 +2085,7 @@
  *
  * \return A handle to the False object.
  */
-DART_EXPORT Dart_Handle Dart_False();
+DART_EXPORT Dart_Handle Dart_False(void);
 
 /**
  * Returns a Boolean with the provided value.
@@ -2025,7 +2129,7 @@
  *  UTF-8 encoded characters and '\0' is considered as a termination
  *  character).
  *
- * \param value A C String
+ * \param str A C String
  *
  * \return The String object if no error occurs. Otherwise returns
  *   an error handle.
@@ -2182,7 +2286,7 @@
  * Gets the storage size in bytes of a String.
  *
  * \param str A String.
- * \param length Returns the storage size in bytes of the String.
+ * \param size Returns the storage size in bytes of the String.
  *  This is the size in bytes needed to store the String.
  *
  * \return A valid handle if no error occurs during the operation.
@@ -2329,7 +2433,7 @@
  *
  * May generate an unhandled exception error.
  *
- * \param array A List.
+ * \param list A List.
  * \param index A valid index into the List.
  * \param value The Object to put in the List.
  *
@@ -2494,7 +2598,7 @@
 /**
  * Returns a ByteBuffer object for the typed data.
  *
- * \param type_data The TypedData object.
+ * \param typed_data The TypedData object.
  *
  * \return The ByteBuffer object if no error occurs. Otherwise returns
  *   an error handle.
@@ -2653,13 +2757,13 @@
  * Invokes a Generative Constructor on an object that was previously
  * allocated using Dart_Allocate/Dart_AllocateWithNativeFields.
  *
- * The 'target' parameter must be an object.
+ * The 'object' parameter must be an object.
  *
  * This function ignores visibility (leading underscores in names).
  *
  * May generate an unhandled exception error.
  *
- * \param target An object.
+ * \param object An object.
  * \param name The name of the constructor to invoke.
  *   Use Dart_Null() or Dart_EmptyString() to invoke the unnamed constructor.
  * \param number_of_arguments Size of the arguments array.
@@ -2937,7 +3041,7 @@
 /**
  * Gets an integer native argument at some index.
  * \param args Native arguments structure.
- * \param arg_index Index of the desired argument in the structure above.
+ * \param index Index of the desired argument in the structure above.
  * \param value Returns the integer value if the argument is an Integer.
  * \return Success if no error occurs. Otherwise returns an error handle.
  */
@@ -2948,7 +3052,7 @@
 /**
  * Gets a boolean native argument at some index.
  * \param args Native arguments structure.
- * \param arg_index Index of the desired argument in the structure above.
+ * \param index Index of the desired argument in the structure above.
  * \param value Returns the boolean value if the argument is a Boolean.
  * \return Success if no error occurs. Otherwise returns an error handle.
  */
@@ -2959,7 +3063,7 @@
 /**
  * Gets a double native argument at some index.
  * \param args Native arguments structure.
- * \param arg_index Index of the desired argument in the structure above.
+ * \param index Index of the desired argument in the structure above.
  * \param value Returns the double value if the argument is a double.
  * \return Success if no error occurs. Otherwise returns an error handle.
  */
@@ -3271,9 +3375,9 @@
  *
  * Requires there to be no current root library.
  *
- * \param buffer A buffer which contains a kernel binary (see
+ * \param kernel_buffer A buffer which contains a kernel binary (see
  *     pkg/kernel/binary.md). Must remain valid until isolate group shutdown.
- * \param buffer_size Length of the passed in buffer.
+ * \param kernel_size Length of the passed in buffer.
  *
  * \return A handle to the root library, or an error.
  */
@@ -3289,7 +3393,7 @@
  *
  * \return Returns the root Library for the current isolate or Dart_Null().
  */
-DART_EXPORT Dart_Handle Dart_RootLibrary();
+DART_EXPORT Dart_Handle Dart_RootLibrary(void);
 
 /**
  * Sets the root library for the current isolate.
@@ -3417,7 +3521,7 @@
 /**
  * \return An array of libraries.
  */
-DART_EXPORT Dart_Handle Dart_GetLoadedLibraries();
+DART_EXPORT Dart_Handle Dart_GetLoadedLibraries(void);
 
 DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url);
 /* TODO(turnidge): Consider returning Dart_Null() when the library is
@@ -3440,9 +3544,9 @@
  * Called by the embedder to load a partial program. Does not set the root
  * library.
  *
- * \param buffer A buffer which contains a kernel binary (see
+ * \param kernel_buffer A buffer which contains a kernel binary (see
  *     pkg/kernel/binary.md). Must remain valid until isolate shutdown.
- * \param buffer_size Length of the passed in buffer.
+ * \param kernel_buffer_size Length of the passed in buffer.
  *
  * \return A handle to the main library of the compilation unit, or an error.
  */
@@ -3542,8 +3646,8 @@
 } Dart_KernelCompilationVerbosityLevel;
 
 DART_EXPORT bool Dart_IsKernelIsolate(Dart_Isolate isolate);
-DART_EXPORT bool Dart_KernelIsolateIsRunning();
-DART_EXPORT Dart_Port Dart_KernelPort();
+DART_EXPORT bool Dart_KernelIsolateIsRunning(void);
+DART_EXPORT Dart_Port Dart_KernelPort(void);
 
 /**
  * Compiles the given `script_uri` to a kernel file.
@@ -3586,7 +3690,7 @@
   const char* source;
 } Dart_SourceFile;
 
-DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies();
+DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies(void);
 
 /**
  * Sets the kernel buffer which will be used to load Dart SDK sources
@@ -3621,17 +3725,19 @@
  *   process was launched, this is used to correctly resolve the path specified
  *   for package_config.
  *
- * \param snapshot_data
- *
- * \param snapshot_instructions Buffers containing a snapshot of the
+ * \param snapshot_data Buffer containing the snapshot data of the
  *   isolate or NULL if no snapshot is provided. If provided, the buffers must
  *   remain valid until the isolate shuts down.
  *
- * \param kernel_buffer
+ * \param snapshot_instructions Buffer containing the snapshot instructions of
+ *   the isolate or NULL if no snapshot is provided. If provided, the buffers
+ *   must remain valid until the isolate shuts down.
  *
- * \param kernel_buffer_size A buffer which contains a kernel/DIL program. Must
+ * \param kernel_buffer A buffer which contains a kernel/DIL program. Must
  *   remain valid until isolate shutdown.
  *
+ * \param kernel_buffer_size The size of `kernel_buffer`.
+ *
  * \return Returns true if the null safety is opted in by the input being
  *   run `script_uri`, `snapshot_data` or `kernel_buffer`.
  *
@@ -3692,7 +3798,7 @@
  * \return An error handle if a compilation error or runtime error running const
  * constructors was encountered.
  */
-DART_EXPORT Dart_Handle Dart_Precompile();
+DART_EXPORT Dart_Handle Dart_Precompile(void);
 
 typedef void (*Dart_CreateLoadingUnitCallback)(
     void* callback_data,
@@ -3830,7 +3936,7 @@
  *
  * \return A valid handle if no error occurs during the operation.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_SortClasses();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_SortClasses(void);
 
 /**
  *  Creates a snapshot that caches compiled code and type feedback for faster
@@ -3890,7 +3996,7 @@
  *  not from any other kind of snapshot or from source (that is, the VM was
  *  compiled with DART_PRECOMPILED_RUNTIME).
  */
-DART_EXPORT bool Dart_IsPrecompiledRuntime();
+DART_EXPORT bool Dart_IsPrecompiledRuntime(void);
 
 /**
  *  Print a native stack trace. Used for crash handling.
@@ -3905,6 +4011,6 @@
  *  Indicate that the process is about to abort, and the Dart VM should not
  *  attempt to cleanup resources.
  */
-DART_EXPORT void Dart_PrepareToAbort();
+DART_EXPORT void Dart_PrepareToAbort(void);
 
 #endif /* INCLUDE_DART_API_H_ */ /* NOLINT */
diff --git a/runtime/include/dart_api_dl.h b/runtime/include/dart_api_dl.h
index 1521df2..804b281 100644
--- a/runtime/include/dart_api_dl.h
+++ b/runtime/include/dart_api_dl.h
@@ -96,8 +96,8 @@
   F(Dart_SendPortGetId, Dart_Handle,                                           \
     (Dart_Handle port, Dart_Port_DL * port_id))                                \
   /* Scopes */                                                                 \
-  F(Dart_EnterScope, void, ())                                                 \
-  F(Dart_ExitScope, void, ())
+  F(Dart_EnterScope, void, (void))                                             \
+  F(Dart_ExitScope, void, (void))
 
 #define DART_API_ALL_DL_SYMBOLS(F)                                             \
   DART_NATIVE_API_DL_SYMBOLS(F)                                                \
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index f99fff1..66e5f93 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -181,12 +181,12 @@
  *
  * TODO(turnidge): Document.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll(void);
 
 /**
  * Finalizes all classes.
  */
-DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_FinalizeAllClasses();
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_FinalizeAllClasses(void);
 
 /*  This function is intentionally undocumented.
  *
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index f36ec6b..1a2d9bb 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -222,25 +222,6 @@
     Dart_ServiceStreamCancelCallback cancel_callback);
 
 /**
- * A callback invoked when the VM service receives an event.
- */
-typedef void (*Dart_NativeStreamConsumer)(const uint8_t* event_json,
-                                          intptr_t event_json_length);
-
-/**
- * Sets the native VM service stream callbacks for a particular stream.
- * Note: The function may be called on multiple threads concurrently.
- *
- * \param consumer A function pointer to an event handler callback function.
- *   A NULL value removes the existing listen callback function if any.
- *
- * \param stream_id The ID of the stream on which to set the callback.
- */
-DART_EXPORT void Dart_SetNativeServiceStreamCallback(
-    Dart_NativeStreamConsumer consumer,
-    const char* stream_id);
-
-/**
  * Sends a data event to clients of the VM Service.
  *
  * A data event is used to pass an array of bytes to subscribed VM
@@ -363,6 +344,37 @@
  */
 
 /**
+ * Enable tracking of specified timeline category. This is operational
+ * only when systrace timeline functionality is turned on.
+ *
+ * \param categories A comma seperated list of categories that need to
+ *   be enabled, the categories are
+ *   "all" : All categories
+ *   "API" - Execution of Dart C API functions
+ *   "Compiler" - Execution of Dart JIT compiler
+ *   "CompilerVerbose" - More detailed Execution of Dart JIT compiler
+ *   "Dart" - Execution of Dart code
+ *   "Debugger" - Execution of Dart debugger
+ *   "Embedder" - Execution of Dart embedder code
+ *   "GC" - Execution of Dart Garbage Collector
+ *   "Isolate" - Dart Isolate lifecycle execution
+ *   "VM" - Excution in Dart VM runtime code
+ *   "" - None
+ *
+ *  When "all" is specified all the categories are enabled.
+ *  When a comma seperated list of categories is specified, the categories
+ *   that are specified will be enabled and the rest will be disabled. 
+ *  When "" is specified all the categories are disabled.
+ *  The category names are case sensitive.
+ *  eg:  Dart_EnableTimelineCategory("all");
+ *       Dart_EnableTimelineCategory("GC,API,Isolate");
+ *       Dart_EnableTimelineCategory("GC,Debugger,Dart");
+ *
+ * \return True if the categories were successfully enabled, False otherwise.
+ */
+DART_EXPORT bool Dart_SetEnabledTimelineCategory(const char* categories);
+
+/**
  * Returns a timestamp in microseconds. This timestamp is suitable for
  * passing into the timeline system, and uses the same monotonic clock
  * as dart:developer's Timeline.now.
diff --git a/runtime/include/internal/dart_api_dl_impl.h b/runtime/include/internal/dart_api_dl_impl.h
index ad13a4b..e4a5689 100644
--- a/runtime/include/internal/dart_api_dl_impl.h
+++ b/runtime/include/internal/dart_api_dl_impl.h
@@ -9,7 +9,7 @@
 
 typedef struct {
   const char* name;
-  void (*function)();
+  void (*function)(void);
 } DartApiEntry;
 
 typedef struct {
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index 42c0acc..7a3415a 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -220,10 +220,10 @@
 }
 
 // Rethrow an error with a stacktrace.
-DEFINE_NATIVE_ENTRY(Async_rethrow, 0, 2) {
+DEFINE_NATIVE_ENTRY(Error_throwWithStackTrace, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, error, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, stacktrace, arguments->NativeArgAt(1));
-  Exceptions::ReThrow(thread, error, stacktrace);
+  Exceptions::ThrowWithStackTrace(thread, error, stacktrace);
   return Object::null();
 }
 
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 239f758..2c54160 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -26,6 +26,7 @@
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/ffi/call.h"
 #include "vm/compiler/ffi/callback.h"
+#include "vm/compiler/ffi/marshaller.h"
 #include "vm/compiler/jit/compiler.h"
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -68,91 +69,10 @@
   UNREACHABLE();
 }
 
-DEFINE_NATIVE_ENTRY(Ffi_asExternalTypedData, 0, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, count, arguments->NativeArgAt(1));
-  const auto& pointer_type_arg = AbstractType::Handle(pointer.type_argument());
-  const classid_t type_cid = pointer_type_arg.type_class_id();
-  classid_t cid = 0;
-
-  switch (type_cid) {
-    case kFfiInt8Cid:
-      cid = kExternalTypedDataInt8ArrayCid;
-      break;
-    case kFfiUint8Cid:
-      cid = kExternalTypedDataUint8ArrayCid;
-      break;
-    case kFfiInt16Cid:
-      cid = kExternalTypedDataInt16ArrayCid;
-      break;
-    case kFfiUint16Cid:
-      cid = kExternalTypedDataUint16ArrayCid;
-      break;
-    case kFfiInt32Cid:
-      cid = kExternalTypedDataInt32ArrayCid;
-      break;
-    case kFfiUint32Cid:
-      cid = kExternalTypedDataUint32ArrayCid;
-      break;
-    case kFfiInt64Cid:
-      cid = kExternalTypedDataInt64ArrayCid;
-      break;
-    case kFfiUint64Cid:
-      cid = kExternalTypedDataUint64ArrayCid;
-      break;
-    case kFfiIntPtrCid:
-      cid = kWordSize == 4 ? kExternalTypedDataInt32ArrayCid
-                           : kExternalTypedDataInt64ArrayCid;
-      break;
-    case kFfiFloatCid:
-      cid = kExternalTypedDataFloat32ArrayCid;
-      break;
-    case kFfiDoubleCid:
-      cid = kExternalTypedDataFloat64ArrayCid;
-      break;
-    default: {
-      const String& error = String::Handle(
-          String::NewFormatted("Cannot create a TypedData from a Pointer to %s",
-                               pointer_type_arg.ToCString()));
-      Exceptions::ThrowArgumentError(error);
-      UNREACHABLE();
-    }
-  }
-
-  const intptr_t element_count = count.AsInt64Value();
-
-  if (element_count < 0 ||
-      element_count > ExternalTypedData::MaxElements(cid)) {
-    const String& error = String::Handle(
-        String::NewFormatted("Count must be in the range [0, %" Pd "].",
-                             ExternalTypedData::MaxElements(cid)));
-    Exceptions::ThrowArgumentError(error);
-  }
-
-  // The address must be aligned by the element size.
-  const intptr_t element_size = ExternalTypedData::ElementSizeFor(cid);
-  if (!Utils::IsAligned(pointer.NativeAddress(), element_size)) {
-    const String& error = String::Handle(
-        String::NewFormatted("Pointer address must be aligned to a multiple of"
-                             "the element size (%" Pd ").",
-                             element_size));
-    Exceptions::ThrowArgumentError(error);
-  }
-
-  const auto& typed_data_class =
-      Class::Handle(zone, isolate->group()->class_table()->At(cid));
-  const auto& error =
-      Error::Handle(zone, typed_data_class.EnsureIsAllocateFinalized(thread));
-  if (!error.IsNull()) {
-    Exceptions::PropagateError(error);
-  }
-
-  // We disable msan initialization check because the memory may not be
-  // initialized yet - dart code might do that later on.
-  return ExternalTypedData::New(
-      cid, reinterpret_cast<uint8_t*>(pointer.NativeAddress()), element_count,
-      Heap::kNew, /*perform_eager_msan_initialization_check=*/false);
-}
+#define DEFINE_NATIVE_ENTRY_AS_EXTERNAL_TYPED_DATA(type)                       \
+  DEFINE_NATIVE_ENTRY(Ffi_asExternalTypedData##type, 0, 2) { UNREACHABLE(); }
+CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(DEFINE_NATIVE_ENTRY_AS_EXTERNAL_TYPED_DATA)
+#undef DEFINE_NATIVE_ENTRY_AS_EXTERNAL_TYPED_DATA
 
 DEFINE_NATIVE_ENTRY(Ffi_nativeCallbackFunction, 1, 2) {
 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
@@ -179,6 +99,15 @@
   func = func.parent_function();
   ASSERT(func.is_static());
 
+  // AbiSpecificTypes can have an incomplete mapping.
+  const char* error = nullptr;
+  compiler::ffi::NativeFunctionTypeFromFunctionType(zone, native_signature,
+                                                    &error);
+  if (error != nullptr) {
+    Exceptions::ThrowCompileTimeError(LanguageError::Handle(
+        zone, LanguageError::New(String::Handle(zone, String::New(error)))));
+  }
+
   // We are returning an object which is not an Instance here. This is only OK
   // because we know that the result will be passed directly to
   // _pointerFromFunction and will not leak out into user code.
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 21b66a2..f57a6c4 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -111,9 +111,8 @@
   // We have to check whether the receiver has the same isolate group (e.g.
   // native message handlers such as an IOService handler does not but does
   // share the same origin port).
-  const bool same_group =
-      FLAG_enable_isolate_groups && PortMap::IsReceiverInThisIsolateGroup(
-                                        destination_port_id, isolate->group());
+  const bool same_group = PortMap::IsReceiverInThisIsolateGroup(
+      destination_port_id, isolate->group());
   // TODO(turnidge): Throw an exception when the return value is false?
   PortMap::PostMessage(WriteMessage(can_send_any_object, same_group, obj,
                                     destination_port_id,
@@ -639,7 +638,7 @@
     ASSERT(name != nullptr);
 
     auto group = state_->isolate_group();
-    if (!FLAG_enable_isolate_groups || group == nullptr) {
+    if (group == nullptr) {
       RunHeavyweight(name);
     } else {
       RunLightweight(name);
@@ -676,8 +675,7 @@
   }
 
   void RunLightweight(const char* name) {
-    // The create isolate initialize callback is mandatory if
-    // --enable-isolate-groups was passed.
+    // The create isolate initialize callback is mandatory.
     auto initialize_callback = Isolate::InitializeCallback();
     if (initialize_callback == nullptr) {
       FailedSpawn(
@@ -938,22 +936,16 @@
   const auto& func = Function::Handle(zone, GetTopLevelFunction(zone, closure));
   PersistentHandle* closure_tuple_handle = nullptr;
   if (func.IsNull()) {
-    if (!FLAG_enable_isolate_groups) {
-      const String& msg = String::Handle(String::New(
-          "Isolate.spawn expects to be passed a static or top-level function"));
-      Exceptions::ThrowArgumentError(msg);
-    } else {
-      // We have a non-toplevel closure that we might need to copy.
-      // Result will be [<closure-copy>, <objects-in-msg-to-rehash>]
-      const auto& closure_copy_tuple = Object::Handle(
-          zone, CopyMutableObjectGraph(closure));  // Throws if it fails.
-      ASSERT(closure_copy_tuple.IsArray());
-      ASSERT(Object::Handle(zone, Array::Cast(closure_copy_tuple).At(0))
-                 .IsClosure());
-      closure_tuple_handle =
-          isolate->group()->api_state()->AllocatePersistentHandle();
-      closure_tuple_handle->set_ptr(closure_copy_tuple.ptr());
-    }
+    // We have a non-toplevel closure that we might need to copy.
+    // Result will be [<closure-copy>, <objects-in-msg-to-rehash>]
+    const auto& closure_copy_tuple = Object::Handle(
+        zone, CopyMutableObjectGraph(closure));  // Throws if it fails.
+    ASSERT(closure_copy_tuple.IsArray());
+    ASSERT(Object::Handle(zone, Array::Cast(closure_copy_tuple).At(0))
+               .IsClosure());
+    closure_tuple_handle =
+        isolate->group()->api_state()->AllocatePersistentHandle();
+    closure_tuple_handle->set_ptr(closure_copy_tuple.ptr());
   }
 
   bool fatal_errors = fatalErrors.IsNull() ? true : fatalErrors.value();
@@ -964,9 +956,8 @@
   // serializable this will throw an exception.
   SerializedObjectBuffer message_buffer;
   message_buffer.set_message(WriteMessage(
-      /* can_send_any_object */ true,
-      /* same_group */ FLAG_enable_isolate_groups, message, ILLEGAL_PORT,
-      Message::kNormalPriority));
+      /*can_send_any_object=*/true,
+      /*same_group=*/true, message, ILLEGAL_PORT, Message::kNormalPriority));
 
   const char* utf8_package_config =
       packageConfig.IsNull() ? NULL : String2UTF8(packageConfig);
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index f8e903e..2b7a470 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -48,20 +48,14 @@
   // Please note that no handle is created for the argument.
   // This is safe since the argument is only used in a tail call.
   // The performance benefit is more than 5% when using hashCode.
-  return Smi::New(GetHash(isolate, arguments->NativeArgAt(0)));
-}
+  intptr_t hash = GetHash(isolate, arguments->NativeArgAt(0));
+  if (LIKELY(hash != 0)) {
+    return Smi::New(hash);
+  }
 
-DEFINE_NATIVE_ENTRY(Object_setHashIfNotSetYet, 0, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Smi, hash, arguments->NativeArgAt(1));
-#if defined(HASH_IN_OBJECT_HEADER)
-  return Smi::New(
-      Object::SetCachedHashIfNotSet(arguments->NativeArgAt(0), hash.Value()));
-#else
   const Instance& instance =
       Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
-  Heap* heap = thread->heap();
-  return Smi::New(heap->SetHashIfNotSet(instance.ptr(), hash.Value()));
-#endif
+  return instance.IdentityHashCode(arguments->thread());
 }
 
 DEFINE_NATIVE_ENTRY(Object_toString, 0, 1) {
diff --git a/runtime/lib/vmservice.cc b/runtime/lib/vmservice.cc
index f3dba9a..1f0744a 100644
--- a/runtime/lib/vmservice.cc
+++ b/runtime/lib/vmservice.cc
@@ -384,4 +384,72 @@
 #endif
 }
 
+#ifndef PRODUCT
+class UserTagIsolatesVisitor : public IsolateVisitor {
+ public:
+  UserTagIsolatesVisitor(Thread* thread,
+                         const GrowableObjectArray* user_tags,
+                         bool set_streamable)
+      : IsolateVisitor(),
+        thread_(thread),
+        user_tags_(user_tags),
+        set_streamable_(set_streamable) {}
+
+  virtual void VisitIsolate(Isolate* isolate) {
+    if (Isolate::IsVMInternalIsolate(isolate)) {
+      return;
+    }
+    Zone* zone = thread_->zone();
+    UserTag& tag = UserTag::Handle(zone);
+    String& label = String::Handle(zone);
+    for (intptr_t i = 0; i < user_tags_->Length(); ++i) {
+      label ^= user_tags_->At(i);
+      tag ^= UserTag::FindTagInIsolate(isolate, thread_, label);
+      if (!tag.IsNull()) {
+        tag.set_streamable(set_streamable_);
+      }
+    }
+  }
+
+ private:
+  Thread* thread_;
+  const GrowableObjectArray* user_tags_;
+  bool set_streamable_;
+
+  DISALLOW_COPY_AND_ASSIGN(UserTagIsolatesVisitor);
+};
+#endif  // !PRODUCT
+
+DEFINE_NATIVE_ENTRY(VMService_AddUserTagsToStreamableSampleList, 0, 1) {
+#ifndef PRODUCT
+  GET_NON_NULL_NATIVE_ARGUMENT(GrowableObjectArray, user_tags,
+                               arguments->NativeArgAt(0));
+
+  Object& obj = Object::Handle();
+  for (intptr_t i = 0; i < user_tags.Length(); ++i) {
+    obj = user_tags.At(i);
+    UserTags::AddStreamableTagName(obj.ToCString());
+  }
+  UserTagIsolatesVisitor visitor(thread, &user_tags, true);
+  Isolate::VisitIsolates(&visitor);
+#endif
+  return Object::null();
+}
+
+DEFINE_NATIVE_ENTRY(VMService_RemoveUserTagsFromStreamableSampleList, 0, 1) {
+#ifndef PRODUCT
+  GET_NON_NULL_NATIVE_ARGUMENT(GrowableObjectArray, user_tags,
+                               arguments->NativeArgAt(0));
+
+  Object& obj = Object::Handle();
+  for (intptr_t i = 0; i < user_tags.Length(); ++i) {
+    obj = user_tags.At(i);
+    UserTags::RemoveStreamableTagName(obj.ToCString());
+  }
+  UserTagIsolatesVisitor visitor(thread, &user_tags, false);
+  Isolate::VisitIsolates(&visitor);
+#endif
+  return Object::null();
+}
+
 }  // namespace dart
diff --git a/runtime/observatory/tests/service/break_on_function_child_isolate_test.dart b/runtime/observatory/tests/service/break_on_function_child_isolate_test.dart
index 3922aa6..f1ebfd3 100644
--- a/runtime/observatory/tests/service/break_on_function_child_isolate_test.dart
+++ b/runtime/observatory/tests/service/break_on_function_child_isolate_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--verbose_debug --enable-isolate-groups
+// VMOptions=--verbose_debug
 
 import 'break_on_function_many_child_isolates_test.dart';
 
diff --git a/runtime/observatory/tests/service/break_on_function_many_child_isolates_test.dart b/runtime/observatory/tests/service/break_on_function_many_child_isolates_test.dart
index b0e75a8..0b162ae 100644
--- a/runtime/observatory/tests/service/break_on_function_many_child_isolates_test.dart
+++ b/runtime/observatory/tests/service/break_on_function_many_child_isolates_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--verbose_debug --enable-isolate-groups
+// VMOptions=--verbose_debug
 //
 // Tests breakpoint pausing and resuming with many isolates running and pausing
 // simultaneously.
diff --git a/runtime/observatory/tests/service/get_object_rpc_test.dart b/runtime/observatory/tests/service/get_object_rpc_test.dart
index d553138..a1f0582 100644
--- a/runtime/observatory/tests/service/get_object_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_rpc_test.dart
@@ -14,8 +14,12 @@
 class _DummyClass {
   static var dummyVar = 11;
   final List<String> dummyList = new List<String>.filled(20, '');
+  static var dummyVarWithInit = foo();
+  late String dummyLateVarWithInit = 'bar';
+  late String dummyLateVar;
   void dummyFunction(int a, [bool b = false]) {}
   void dummyGenericFunction<K, V>(K a, {required V param}) {}
+  static List foo() => List<String>.filled(20, '');
 }
 
 class _DummySubClass extends _DummyClass {}
@@ -982,6 +986,83 @@
     expect(result['_guardLength'], isNotNull);
   },
 
+  // static field initializer
+  (Isolate isolate) async {
+    // Call eval to get a class id.
+    var evalResult = await invoke(isolate, 'getDummyClass');
+    var id = "${evalResult['class']['id']}/field_inits/dummyVarWithInit";
+    var params = {
+      'objectId': id,
+    };
+    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
+    expect(result['type'], equals('Function'));
+    expect(result['id'], equals(id));
+    expect(result['name'], equals('dummyVarWithInit'));
+    expect(result['_kind'], equals('FieldInitializer'));
+    expect(result['static'], equals(true));
+    expect(result['const'], equals(false));
+    expect(result['implicit'], equals(false));
+    expect(result['signature']['typeParameters'], isNull);
+    expect(result['signature']['returnType'], isNotNull);
+    expect(result['signature']['parameters'].length, 0);
+    expect(result['location']['type'], equals('SourceLocation'));
+    expect(result['code']['type'], equals('@Code'));
+    expect(result['_optimizable'], equals(true));
+    expect(result['_inlinable'], equals(false));
+    expect(result['_usageCounter'], isZero);
+    expect(result['_optimizedCallSiteCount'], isZero);
+    expect(result['_deoptimizations'], isZero);
+  },
+
+  // late field initializer
+  (Isolate isolate) async {
+    // Call eval to get a class id.
+    var evalResult = await invoke(isolate, 'getDummyClass');
+    var id = "${evalResult['class']['id']}/field_inits/dummyLateVarWithInit";
+    var params = {
+      'objectId': id,
+    };
+    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
+    expect(result['type'], equals('Function'));
+    expect(result['id'], equals(id));
+    expect(result['name'], equals('dummyLateVarWithInit'));
+    expect(result['_kind'], equals('FieldInitializer'));
+    expect(result['static'], equals(false));
+    expect(result['const'], equals(false));
+    expect(result['implicit'], equals(false));
+    expect(result['signature']['typeParameters'], isNull);
+    expect(result['signature']['returnType'], isNotNull);
+    expect(result['signature']['parameters'].length, 1);
+    expect(result['location']['type'], equals('SourceLocation'));
+    expect(result['code']['type'], equals('@Code'));
+    expect(result['_optimizable'], equals(true));
+    expect(result['_inlinable'], equals(false));
+    expect(result['_usageCounter'], isZero);
+    expect(result['_optimizedCallSiteCount'], isZero);
+    expect(result['_deoptimizations'], isZero);
+  },
+
+  // invalid late field initialize.
+  (Isolate isolate) async {
+    // Call eval to get a class id.
+    var evalResult = await invoke(isolate, 'getDummyClass');
+    var id = "${evalResult['class']['id']}/field_inits/dummyLateVar";
+    var params = {
+      'objectId': id,
+    };
+    bool caughtException = false;
+    try {
+      await isolate.invokeRpcNoUpgrade('getObject', params);
+      expect(false, isTrue, reason: 'Unreachable');
+    } on ServerRpcException catch (e) {
+      caughtException = true;
+      expect(e.code, equals(ServerRpcException.kInvalidParams));
+      expect(
+          e.message, startsWith("getObject: invalid 'objectId' parameter: "));
+    }
+    expect(caughtException, isTrue);
+  },
+
   // field with guards
   (Isolate isolate) async {
     var result = await isolate.vm.invokeRpcNoUpgrade('getFlagList', {});
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 4ad1d93..048b1e4 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], 'Version');
     expect(result['major'], 3);
-    expect(result['minor'], 52);
+    expect(result['minor'], 55);
     expect(result['_privateMajor'], 0);
     expect(result['_privateMinor'], 0);
   },
diff --git a/runtime/observatory/tests/service/object_graph_isolate_group_test.dart b/runtime/observatory/tests/service/object_graph_isolate_group_test.dart
index d325f75..b2580bb 100644
--- a/runtime/observatory/tests/service/object_graph_isolate_group_test.dart
+++ b/runtime/observatory/tests/service/object_graph_isolate_group_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.
 
-// VMOptions=--enable_isolate_groups
-
 import 'dart:isolate' as isolate;
 import 'package:observatory/object_graph.dart';
 import 'package:observatory/service_io.dart';
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 412cfbc..ee4f627 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -212,6 +212,7 @@
 rewind_optimized_out_test: SkipSlow # Timeout
 
 [ $arch == ia32 && $compiler == dartk ]
+*: Slow # Issue 47920, service tests are slow on IA32
 valid_source_locations_test: Skip # Issue 34736, too slow.
 
 [ $compiler == app_jitk && $system == linux ]
diff --git a/runtime/observatory_2/tests/service_2/break_on_function_child_isolate_test.dart b/runtime/observatory_2/tests/service_2/break_on_function_child_isolate_test.dart
index 3922aa6..f1ebfd3 100644
--- a/runtime/observatory_2/tests/service_2/break_on_function_child_isolate_test.dart
+++ b/runtime/observatory_2/tests/service_2/break_on_function_child_isolate_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--verbose_debug --enable-isolate-groups
+// VMOptions=--verbose_debug
 
 import 'break_on_function_many_child_isolates_test.dart';
 
diff --git a/runtime/observatory_2/tests/service_2/break_on_function_many_child_isolates_test.dart b/runtime/observatory_2/tests/service_2/break_on_function_many_child_isolates_test.dart
index e5b6b56..77eb09d 100644
--- a/runtime/observatory_2/tests/service_2/break_on_function_many_child_isolates_test.dart
+++ b/runtime/observatory_2/tests/service_2/break_on_function_many_child_isolates_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--verbose_debug --enable-isolate-groups
+// VMOptions=--verbose_debug
 //
 // Tests breakpoint pausing and resuming with many isolates running and pausing
 // simultaneously.
diff --git a/runtime/observatory_2/tests/service_2/get_object_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_object_rpc_test.dart
index 44912b3..9c45a9e 100644
--- a/runtime/observatory_2/tests/service_2/get_object_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_object_rpc_test.dart
@@ -14,8 +14,10 @@
 class _DummyClass {
   static var dummyVar = 11;
   final List<String> dummyList = new List<String>.filled(20, null);
+  static var dummyVarWithInit = foo();
   void dummyFunction(int a, [bool b = false]) {}
   void dummyGenericFunction<K, V>(K a, {V param}) {}
+  static List foo() => List<String>.filled(20, '');
 }
 
 class _DummySubClass extends _DummyClass {}
@@ -1014,6 +1016,34 @@
     expect(result['_guardLength'], equals('20'));
   },
 
+  // static field initializer
+  (Isolate isolate) async {
+    // Call eval to get a class id.
+    var evalResult = await invoke(isolate, 'getDummyClass');
+    var id = "${evalResult['class']['id']}/field_inits/dummyVarWithInit";
+    var params = {
+      'objectId': id,
+    };
+    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
+    expect(result['type'], equals('Function'));
+    expect(result['id'], equals(id));
+    expect(result['name'], equals('dummyVarWithInit'));
+    expect(result['_kind'], equals('FieldInitializer'));
+    expect(result['static'], equals(true));
+    expect(result['const'], equals(false));
+    expect(result['implicit'], equals(false));
+    expect(result['signature']['typeParameters'], isNull);
+    expect(result['signature']['returnType'], isNotNull);
+    expect(result['signature']['parameters'].length, 0);
+    expect(result['location']['type'], equals('SourceLocation'));
+    expect(result['code']['type'], equals('@Code'));
+    expect(result['_optimizable'], equals(true));
+    expect(result['_inlinable'], equals(false));
+    expect(result['_usageCounter'], isZero);
+    expect(result['_optimizedCallSiteCount'], isZero);
+    expect(result['_deoptimizations'], isZero);
+  },
+
   // invalid field.
   (Isolate isolate) async {
     // Call eval to get a class id.
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index 12ffc1c..a3c7061 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     final result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(52));
+    expect(result['minor'], equals(55));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory_2/tests/service_2/object_graph_isolate_group_test.dart b/runtime/observatory_2/tests/service_2/object_graph_isolate_group_test.dart
index b9ddf82..93bfb77 100644
--- a/runtime/observatory_2/tests/service_2/object_graph_isolate_group_test.dart
+++ b/runtime/observatory_2/tests/service_2/object_graph_isolate_group_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.
 
-// VMOptions=--enable_isolate_groups
-
 // @dart = 2.7
 
 import 'dart:isolate' as isolate;
diff --git a/runtime/observatory_2/tests/service_2/service_2_kernel.status b/runtime/observatory_2/tests/service_2/service_2_kernel.status
index ac51da2..914b102 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -212,6 +212,7 @@
 rewind_optimized_out_test: SkipSlow # Timeout
 
 [ $arch == ia32 && $compiler == dartk ]
+*: Slow # Issue 47920, service tests are slow on IA32
 valid_source_locations_test: Skip # Issue 34736, too slow.
 
 [ $compiler == app_jitk && $system == linux ]
diff --git a/runtime/platform/assert.h b/runtime/platform/assert.h
index ce4d0cc..53079e3 100644
--- a/runtime/platform/assert.h
+++ b/runtime/platform/assert.h
@@ -140,13 +140,33 @@
        tols.c_str());
 }
 
+static void Escape(std::string& dst, const char* src) {
+  char c;
+  while ((c = *src++) != '\0') {
+    if (c == '\n') {
+      dst += "\\n\"\n\"";
+    } else if (c == '\'') {
+      dst += "\\\'";
+    } else if (c == '\"') {
+      dst += "\\\"";
+    } else if (c == '\\') {
+      dst += "\\\\";
+    } else {
+      dst += c;
+    }
+  }
+}
+
 inline void Expect::StringEquals(const char* expected, const char* actual) {
   if (strcmp(expected, actual) == 0) return;
   if (actual == nullptr) {
     Fail("expected:\n<\"%s\">\nbut was nullptr", expected);
   } else {
     if (strcmp(expected, actual) == 0) return;
-    Fail("expected:\n<\"%s\">\nbut was:\n<\"%s\">", expected, actual);
+    std::string es, as;
+    Escape(es, expected);
+    Escape(as, actual);
+    Fail("expected:\n<\"%s\">\nbut was:\n<\"%s\">", es.c_str(), as.c_str());
   }
 }
 
diff --git a/runtime/platform/syslog_android.cc b/runtime/platform/syslog_android.cc
index 46930e9..e3d4599 100644
--- a/runtime/platform/syslog_android.cc
+++ b/runtime/platform/syslog_android.cc
@@ -19,18 +19,32 @@
   // If we launch the DartVM inside "adb shell" we will only get messages
   // (critical ones or not) if we print them to stdout/stderr.
   // We also log using android's logging system.
-  vprintf(format, args);
+  va_list stdio_args;
+  va_copy(stdio_args, args);
+  vprintf(format, stdio_args);
   fflush(stdout);
-  __android_log_vprint(ANDROID_LOG_INFO, "Dart", format, args);
+  va_end(stdio_args);
+
+  va_list log_args;
+  va_copy(log_args, args);
+  __android_log_vprint(ANDROID_LOG_INFO, "Dart", format, log_args);
+  va_end(log_args);
 }
 
 void Syslog::VPrintErr(const char* format, va_list args) {
   // If we launch the DartVM inside "adb shell" we will only get messages
   // (critical ones or not) if we print them to stdout/stderr.
   // We also log using android's logging system.
-  vfprintf(stderr, format, args);
+  va_list stdio_args;
+  va_copy(stdio_args, args);
+  vfprintf(stderr, format, stdio_args);
   fflush(stderr);
-  __android_log_vprint(ANDROID_LOG_ERROR, "Dart", format, args);
+  va_end(stdio_args);
+
+  va_list log_args;
+  va_copy(log_args, args);
+  __android_log_vprint(ANDROID_LOG_ERROR, "Dart", format, log_args);
+  va_end(log_args);
 }
 
 }  // namespace dart
diff --git a/runtime/platform/thread_sanitizer.h b/runtime/platform/thread_sanitizer.h
index baff130..b82fde9 100644
--- a/runtime/platform/thread_sanitizer.h
+++ b/runtime/platform/thread_sanitizer.h
@@ -21,4 +21,16 @@
 #define NO_SANITIZE_THREAD
 #endif
 
+#if defined(USING_THREAD_SANITIZER)
+#define DO_IF_TSAN(CODE) CODE
+#else
+#define DO_IF_TSAN(CODE)
+#endif
+
+#if defined(USING_THREAD_SANITIZER)
+#define DO_IF_NOT_TSAN(CODE)
+#else
+#define DO_IF_NOT_TSAN(CODE) CODE
+#endif
+
 #endif  // RUNTIME_PLATFORM_THREAD_SANITIZER_H_
diff --git a/runtime/platform/utils.cc b/runtime/platform/utils.cc
index c93c84b..eb833e7 100644
--- a/runtime/platform/utils.cc
+++ b/runtime/platform/utils.cc
@@ -361,7 +361,7 @@
   *error = status != nullptr ? strdup(status) : nullptr;
 #elif defined(DART_HOST_OS_WINDOWS)
   const int status = GetLastError();
-  *error = status != 0 ? Utils::SCreate("error code %i", error) : nullptr;
+  *error = status != 0 ? Utils::SCreate("error code %i", status) : nullptr;
 #else
   *error = Utils::StrDup("loading dynamic libraries is not supported");
 #endif
diff --git a/runtime/runtime_args.gni b/runtime/runtime_args.gni
index ae564be..8219c51 100644
--- a/runtime/runtime_args.gni
+++ b/runtime/runtime_args.gni
@@ -46,6 +46,10 @@
   # the VM enables this only for Linux builds.
   dart_use_tcmalloc = false
 
+  # Whether to use mallinfo2 instead of mallinfo which is deprecated starting
+  # with libc 2.33
+  dart_use_mallinfo2 = false
+
   # Whether to link Crashpad library for crash handling. Only supported on
   # Windows for now.
   dart_use_crashpad = false
diff --git a/runtime/tests/concurrency/run_stress_test_shards.dart b/runtime/tests/concurrency/run_stress_test_shards.dart
index 5f29e01..bae35d6 100644
--- a/runtime/tests/concurrency/run_stress_test_shards.dart
+++ b/runtime/tests/concurrency/run_stress_test_shards.dart
@@ -146,13 +146,11 @@
   JitTestRunner('out/DebugX64', [
     '--disable-dart-dev',
     '--no-sound-null-safety',
-    '--enable-isolate-groups',
     'runtime/tests/concurrency/generated_stress_test.dart.jit.dill',
   ]),
   JitTestRunner('out/ReleaseX64', [
     '--disable-dart-dev',
     '--no-sound-null-safety',
-    '--enable-isolate-groups',
     '--no-inline-alloc',
     '--use-slow-path',
     '--deoptimize-on-runtime-call-every=3',
@@ -165,7 +163,6 @@
       '-Dshard=$i',
       '-Dshards=$tsanShards',
       '--no-sound-null-safety',
-      '--enable-isolate-groups',
       'runtime/tests/concurrency/generated_stress_test.dart.jit.dill',
     ]),
   AotTestRunner('out/ReleaseX64', [
@@ -173,14 +170,12 @@
     'runtime/tests/concurrency/generated_stress_test.dart.aot.dill',
   ], [
     '--no-sound-null-safety',
-    '--enable-isolate-groups',
   ]),
   AotTestRunner('out/DebugX64', [
     '--no-sound-null-safety',
     'runtime/tests/concurrency/generated_stress_test.dart.aot.dill',
   ], [
     '--no-sound-null-safety',
-    '--enable-isolate-groups',
   ]),
 ];
 
diff --git a/runtime/tests/concurrency/stress_test_list.json b/runtime/tests/concurrency/stress_test_list.json
index f851825..a3073eb 100644
--- a/runtime/tests/concurrency/stress_test_list.json
+++ b/runtime/tests/concurrency/stress_test_list.json
@@ -340,7 +340,6 @@
     "../../../tests/corelib/regexp/backreferences_test.dart",
     "../../../tests/corelib/regexp/bol-with-multiline_test.dart",
     "../../../tests/corelib/regexp/bol_test.dart",
-    "../../../tests/corelib/regexp/capture-3_test.dart",
     "../../../tests/corelib/regexp/capture_test.dart",
     "../../../tests/corelib/regexp/captures_test.dart",
     "../../../tests/corelib/regexp/char-insensitive_test.dart",
@@ -3230,7 +3229,6 @@
     "../../../tests/standalone/double_smi_comparison_test.dart",
     "../../../tests/standalone/double_temp_test.dart",
     "../../../tests/standalone/double_to_int_test.dart",
-    "../../../tests/standalone/fields_may_be_reset_test.dart",
     "../../../tests/standalone/float_array_test.dart",
     "../../../tests/standalone/fragmentation_typed_data_test.dart",
     "../../../tests/standalone/int_array_load_elimination_test.dart",
@@ -3753,7 +3751,6 @@
     "../../../tests/corelib_2/regexp/backreferences_test.dart",
     "../../../tests/corelib_2/regexp/bol-with-multiline_test.dart",
     "../../../tests/corelib_2/regexp/bol_test.dart",
-    "../../../tests/corelib_2/regexp/capture-3_test.dart",
     "../../../tests/corelib_2/regexp/capture_test.dart",
     "../../../tests/corelib_2/regexp/captures_test.dart",
     "../../../tests/corelib_2/regexp/char-insensitive_test.dart",
@@ -6560,7 +6557,6 @@
     "../../../tests/standalone_2/double_smi_comparison_test.dart",
     "../../../tests/standalone_2/double_temp_test.dart",
     "../../../tests/standalone_2/double_to_int_test.dart",
-    "../../../tests/standalone_2/fields_may_be_reset_test.dart",
     "../../../tests/standalone_2/float_array_test.dart",
     "../../../tests/standalone_2/int_array_load_elimination_test.dart",
     "../../../tests/standalone_2/int_array_test.dart",
diff --git a/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart b/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart
index 9baf000..8447554 100644
--- a/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart
+++ b/runtime/tests/vm/dart/aot_prefer_equality_comparison_il_test.dart
@@ -5,14 +5,21 @@
 // Test that we emit EqualityCompare rather than StrictCompare+BoxInt64
 // when comparing non-nullable integer to a Smi.
 
-// MatchIL[AOT]=factorial
-// __ GraphEntry
-// __ FunctionEntry
-// __ CheckStackOverflow
-// __ Branch(EqualityCompare)
+import 'package:vm/testing/il_matchers.dart';
+
 @pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph')
 int factorial(int value) => value == 1 ? value : value * factorial(value - 1);
 
+void matchIL$factorial(FlowGraph graph) {
+  graph.match([
+    match.block('Graph'),
+    match.block('Function', [
+      match.Branch(match.EqualityCompare(match.any, match.any, kind: '==')),
+    ]),
+  ]);
+}
+
 void main() {
   print(factorial(4));
 }
diff --git a/runtime/tests/vm/dart/bare_instructions_trampolines_test.dart b/runtime/tests/vm/dart/bare_instructions_trampolines_test.dart
index b7d734d..12201d2 100644
--- a/runtime/tests/vm/dart/bare_instructions_trampolines_test.dart
+++ b/runtime/tests/vm/dart/bare_instructions_trampolines_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--always-generate-trampolines-for-testing --use-bare-instructions
+// VMOptions=--always-generate-trampolines-for-testing
 
 // We use a reasonable sized test and run it with the above options.
 import 'hello_fuchsia_test.dart' as test;
diff --git a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
index 5f18af8..d131340 100644
--- a/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
+++ b/runtime/tests/vm/dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks --no-use-bare-instructions
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks
 
 import 'dart:async';
 import 'dart:io';
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index c8b3774..077e9bd 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -850,7 +850,7 @@
       r'^<asynchronous suspension>$',
       r'^#1      asyncStarThrowAsync \(.*/utils.dart:126(:5)?\)$',
       r'^<asynchronous suspension>$',
-      r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
+      r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart:132(:56)?\)$',
       r'^<asynchronous suspension>$',
     ];
     await doTestAwait(
diff --git a/runtime/tests/vm/dart/deferred_isolate_test.dart b/runtime/tests/vm/dart/deferred_isolate_test.dart
index 94be755..7afc208 100644
--- a/runtime/tests/vm/dart/deferred_isolate_test.dart
+++ b/runtime/tests/vm/dart/deferred_isolate_test.dart
@@ -4,8 +4,6 @@
 
 // Verify deferred library status is per-isolate, not per-isolate-group.
 
-// VMOptions=--enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'package:expect/expect.dart';
diff --git a/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart b/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart
index 8fa1e45..954a3d9 100644
--- a/runtime/tests/vm/dart/deferred_loading_call_modes_test.dart
+++ b/runtime/tests/vm/dart/deferred_loading_call_modes_test.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.
 
-// VMOptions=--use_bare_instructions=false
-// VMOptions=--use_bare_instructions=true --use_table_dispatch=false
-// VMOptions=--use_bare_instructions=true --use_table_dispatch=true
+// VMOptions=--use_table_dispatch=false
+// VMOptions=--use_table_dispatch=true
 
 import "splay_test.dart" deferred as splay; // Some non-trivial code.
 
diff --git a/runtime/tests/vm/dart/flutter_regress_91370_il_test.dart b/runtime/tests/vm/dart/flutter_regress_91370_il_test.dart
new file mode 100644
index 0000000..afa6bcf
--- /dev/null
+++ b/runtime/tests/vm/dart/flutter_regress_91370_il_test.dart
@@ -0,0 +1,730 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:vm/testing/il_matchers.dart';
+
+bool shouldPrint = false;
+
+@pragma('vm:never-inline')
+void blackhole(Object v) {
+  if (shouldPrint) {
+    print(v);
+  }
+}
+
+class A {}
+
+class A0 extends A {
+  final double x;
+  final String str;
+
+  A0(this.x, this.str);
+
+  // Use [x] to prevent the field from being shaken out. We would like
+  // [x] to occupy the same location that [A1.str] takes so that
+  // type confusion / incorrect LICM would cause a crash when we load
+  // `o.[A1.str].length` on an object of type [A0]
+  String toString() => 'A0($x)';
+}
+
+class A1 extends A {
+  final String str;
+
+  A1(this.str);
+}
+
+class H<T> {
+  final T data;
+  H(this.data);
+}
+
+abstract class B<T extends A> {
+  final T v;
+
+  B(this.v);
+
+  int load(H<T> h);
+  int loadWithNamedParam({required H<T> h});
+
+  @pragma('vm:never-inline')
+  @pragma('vm:testing:print-flow-graph', '*LICM')
+  int testNarrowingThroughThisCallWithPositionalParam(H<T> h) {
+    var result = 0;
+    for (var i = 0; i < 10; i++) {
+      // We will perform polymorphic inlining of `load` because `this`
+      // is known to be either B0 or B1. In both cases we will have
+      // v.str.length loads fully inlined because inlined bodies
+      // have precise type information for v.
+      // Then we will hoist v.str.length out of the loop past
+      // class-id comparisons generated by the inlining leading
+      // to incorrect code which will crash.
+      result += load(h);
+    }
+    return result;
+  }
+
+  @pragma('vm:never-inline')
+  @pragma('vm:testing:print-flow-graph', '*LICM')
+  int testNarrowingThroughThisCallWithNamedParams(H<T> h) {
+    var result = 0;
+    for (var i = 0; i < 10; i++) {
+      // We will perform polymorphic inlining of `load` because `this`
+      // is known to be either B0 or B1. In both cases we will have
+      // v.str.length loads fully inlined because inlined bodies
+      // have precise type information for v.
+      // Then we will hoist v.str.length out of the loop past
+      // class-id comparisons generated by the inlining leading
+      // to incorrect code which will crash.
+      result += loadWithNamedParam(h: h);
+    }
+    return result;
+  }
+}
+
+class BImpl<T extends A> extends B<T> {
+  BImpl(T v) : super(v);
+
+  // These methods do not matter. They can just return 0.
+  int load(H<T> h) => 0;
+  int loadWithNamedParam({required H<T> h}) => 0;
+}
+
+class B0 extends B<A0> {
+  B0(A0 a) : super(a);
+
+  int load(H<A0> h) {
+    return h.data.str.length;
+  }
+
+  int loadWithNamedParam({String? a, required H<A0> h, String? z}) {
+    return h.data.str.length;
+  }
+}
+
+class B1 extends B<A1> {
+  B1(A1 a) : super(a);
+
+  int load(H<A1> h) {
+    return h.data.str.length;
+  }
+
+  int loadWithNamedParam({String? a, required H<A1> h, String? z}) {
+    return h.data.str.length;
+  }
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckOnSubclass(B b) {
+  int sum = 0;
+  b.v.toString();
+  for (var i = 0; i < 2; i++) {
+    if (b is B1) {
+      sum += b.v.str.length;
+    }
+  }
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    if (b is B<A1>) {
+      sum += b.v.str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckWithTypeArgMonomorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    if (b is B<A1>) {
+      sum += b.v.str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughAsCheckWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    // Branch with a side-effect to avoid b as B<A1> hoisting.
+    if (sum == 42) throw '42';
+    sum += (b as B<A1>).v.str.length;
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    // Branch with a side-effect to avoid b as B<A1> hoisting.
+    if (sum == 42) throw '42';
+    sum += (sum == 22 ? b as B<A1> : b as B<A1>).v.str.length;
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIndexedLoadFromGrowableArray(List<A> l) {
+  int sum = 0;
+  final v = l[0];
+  for (var i = 0; i < 2; i++) {
+    if (l is List<A1>) {
+      sum += l[0].str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIndexedLoadFromFixedArray(List<A> l) {
+  int sum = 0;
+  final v = l[0];
+  for (var i = 0; i < 2; i++) {
+    if (l is List<A1>) {
+      sum += l[0].str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+void main(List<String> args) {
+  shouldPrint = args.contains("shouldPrint");
+
+  // Prevent shaking of BImpl.load and BImpl.loadWithNamed, if these methods
+  // are shaked (because they are not used) that would inhibit polymorphic
+  // inlining at testNarrowingThroughThisCall{,WithNamedParams}
+  BImpl(A1("")).load(H(A1("")));
+  BImpl(A1("")).loadWithNamedParam(h: H(A1("")));
+
+  for (var i = 0; i < 2; i++) {
+    final a1 = A1("$i");
+    final a0 = A0(i.toDouble(), "$i");
+    B1(a1).testNarrowingThroughThisCallWithPositionalParam(H(a1));
+    B0(a0).testNarrowingThroughThisCallWithPositionalParam(H(a0));
+    B1(a1).testNarrowingThroughThisCallWithNamedParams(H(a1));
+    B0(a0).testNarrowingThroughThisCallWithNamedParams(H(a0));
+    testNarrowingThroughIsCheckOnSubclass(B1(a1));
+    testNarrowingThroughIsCheckOnSubclass(B0(a0));
+    testNarrowingThroughIsCheckWithTypeArgPolymorphic(B1(a1));
+    testNarrowingThroughIsCheckWithTypeArgPolymorphic(B0(a0));
+    testNarrowingThroughIsCheckWithTypeArgMonomorphic(BImpl<A1>(a1));
+    testNarrowingThroughIsCheckWithTypeArgMonomorphic(BImpl<A0>(a0));
+    testNarrowingThroughAsCheckWithTypeArgPolymorphic(B1(a1));
+    try {
+      testNarrowingThroughAsCheckWithTypeArgPolymorphic(B0(a0));
+      throw "Should be unreachable";
+    } on TypeError catch (e) {}
+    testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B1(a1));
+    try {
+      testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B0(a0));
+      throw "Should be unreachable";
+    } on TypeError catch (e) {}
+    testNarrowingThroughIndexedLoadFromGrowableArray([a1]);
+    testNarrowingThroughIndexedLoadFromGrowableArray([a0]);
+    testNarrowingThroughIndexedLoadFromFixedArray(
+        List<A1>.filled(1, a1, growable: false));
+    testNarrowingThroughIndexedLoadFromFixedArray(
+        List<A0>.filled(1, a0, growable: false));
+  }
+}
+
+void matchIL$testNarrowingThroughThisCallWithPositionalParam(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'h_raw' << match.Parameter(index: 1),
+      'h' << match.AssertAssignable('h_raw', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_cid' << match.LoadClassId('this'),
+          match.Branch(match.StrictCompare('this_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by inlining.
+          'h_' << match.Redefinition('h'),
+          'v0' << match.LoadField('h_', slot: 'data'),
+          'v1' << match.LoadField('v0', slot: 'str'),
+          'v2' << match.LoadField('v1', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'h_raw' << match.Parameter(index: 1),
+      'h' << match.AssertAssignable('h_raw', match.any),
+      'this_cid' << match.LoadClassId('this'), // Hoisted.
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.StrictCompare('this_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          // After LICM redefinitions are removed.
+          'v0' << match.LoadField('h', slot: 'data'),
+          'v1' << match.LoadField('v0', slot: 'str'),
+          'v2' << match.LoadField('v1', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughThisCallWithNamedParams(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  // Graph shape is basically the same.
+  matchIL$testNarrowingThroughThisCallWithPositionalParam(
+      beforeLICM, afterLICM);
+}
+
+void matchIL$testNarrowingThroughIsCheckOnSubclass(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_cid' << match.LoadClassId('b'),
+          match.Branch(match.StrictCompare('b_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      'b_cid' << match.LoadClassId('b'), // Hoisted.
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.StrictCompare('b_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIsCheckWithTypeArgMonomorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_is_B<A1>' << match.InstanceOf('b', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('b_is_B<A1>', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_is_B<A1>' << match.InstanceOf('b', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('b_is_B<A1>', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughAsCheckWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B5', ifFalse: 'B6'),
+        ]),
+    'B5' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B6' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B7' <<
+        match.block('Join', [
+          // This redefinition was inserted by PhiInstr::Canonicalize
+          // which removed Phi of two AssertAssignables above.
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B5', ifFalse: 'B6'),
+        ]),
+    'B5' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B6' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B7' <<
+        match.block('Join', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIndexedLoadFromGrowableArray(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a.data' << match.LoadField('this', slot: 'GrowableObjectArray.data'),
+      'a.data[0]' << match.LoadIndexed('a.data', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by load forwarding.
+          'a.data[0]*' << match.Redefinition('a.data[0]'),
+          if (!beforeLICM.soundNullSafety)
+            'a.data[0]*!' << match.CheckNull('a.data[0]*'),
+          'a.data[0].str' <<
+              match.LoadField(
+                  beforeLICM.soundNullSafety ? 'a.data[0]*' : 'a.data[0]*!',
+                  slot: 'str'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a.data' << match.LoadField('this', slot: 'GrowableObjectArray.data'),
+      'a.data[0]' << match.LoadIndexed('a.data', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          if (!beforeLICM.soundNullSafety)
+            'a.data[0]!' << match.CheckNull('a.data[0]'),
+          'a.data[0].str' <<
+              match.LoadField(
+                  beforeLICM.soundNullSafety ? 'a.data[0]' : 'a.data[0]!',
+                  slot: 'str'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIsCheckWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  matchIL$testNarrowingThroughIsCheckWithTypeArgMonomorphic(
+      beforeLICM, afterLICM);
+}
+
+void matchIL$testNarrowingThroughIndexedLoadFromFixedArray(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a[0]' << match.LoadIndexed('this', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by load forwarding.
+          'a[0]*' << match.Redefinition('a[0]'),
+          if (!beforeLICM.soundNullSafety) 'a[0]*!' << match.CheckNull('a[0]*'),
+          'a[0].str' <<
+              match.LoadField(beforeLICM.soundNullSafety ? 'a[0]*' : 'a[0]*!',
+                  slot: 'str'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a[0]' << match.LoadIndexed('this', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          if (!beforeLICM.soundNullSafety) 'a[0]!' << match.CheckNull('a[0]'),
+          'a[0].str' <<
+              match.LoadField(beforeLICM.soundNullSafety ? 'a[0]' : 'a[0]!',
+                  slot: 'str'),
+        ]),
+  ], env: env);
+}
diff --git a/runtime/tests/vm/dart/isolates/closure_entrypoint_test.dart b/runtime/tests/vm/dart/isolates/closure_entrypoint_test.dart
index b855c4f..7b8450e 100644
--- a/runtime/tests/vm/dart/isolates/closure_entrypoint_test.dart
+++ b/runtime/tests/vm/dart/isolates/closure_entrypoint_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
diff --git a/runtime/tests/vm/dart/isolates/closures_without_captured_variables_test.dart b/runtime/tests/vm/dart/isolates/closures_without_captured_variables_test.dart
index d7970cc..386d73e 100644
--- a/runtime/tests/vm/dart/isolates/closures_without_captured_variables_test.dart
+++ b/runtime/tests/vm/dart/isolates/closures_without_captured_variables_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.
 
-// VMOptions=--enable-isolate-groups
-
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
 
diff --git a/runtime/tests/vm/dart/isolates/dart_api_create_lightweight_isolate_test.dart b/runtime/tests/vm/dart/isolates/dart_api_create_lightweight_isolate_test.dart
index f4005be..d4734b8 100644
--- a/runtime/tests/vm/dart/isolates/dart_api_create_lightweight_isolate_test.dart
+++ b/runtime/tests/vm/dart/isolates/dart_api_create_lightweight_isolate_test.dart
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // SharedObjects=ffi_test_functions
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:ffi';
@@ -17,8 +16,6 @@
 import 'test_utils.dart' show isArtificialReloadMode;
 import '../../../../../tests/ffi/dylib_utils.dart';
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
 final bool usesDwarfStackTraces = Platform.executableArguments
     .any((entry) => RegExp('--dwarf[-_]stack[-_]traces').hasMatch(entry));
 final bool hasSymbolicStackTraces = !usesDwarfStackTraces;
@@ -223,25 +220,7 @@
   await testFatalError();
 }
 
-Future testNotSupported() async {
-  dynamic exception;
-  try {
-    FfiBindings.createLightweightIsolate('debug-name', Pointer.fromAddress(0));
-  } catch (e) {
-    exception = e;
-  }
-  Expect.contains(
-      'Lightweight isolates need to be explicitly enabled by passing '
-      '--enable-isolate-groups.',
-      exception.toString());
-}
-
 Future main(args) async {
-  if (!isolateGroupsEnabled) {
-    await testNotSupported();
-    return;
-  }
-
   // This test should not run in hot-reload because of the way it is written
   // (embedder related code written in Dart instead of C)
   if (isArtificialReloadMode) return;
diff --git a/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart b/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
index 3977179..4a2a72f 100644
--- a/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
+++ b/runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
diff --git a/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart b/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
index 169a1b9..955e13d 100644
--- a/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
+++ b/runtime/tests/vm/dart/isolates/fast_object_copy_test.dart
@@ -2,11 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
 
 // The tests in this file are particularly for an implementation that tries to
 // allocate the entire graph in BFS order using a fast new space allocation
diff --git a/runtime/tests/vm/dart/isolates/fibonacci_call_test.dart b/runtime/tests/vm/dart/isolates/fibonacci_call_test.dart
index daf66e0..04e8684 100644
--- a/runtime/tests/vm/dart/isolates/fibonacci_call_test.dart
+++ b/runtime/tests/vm/dart/isolates/fibonacci_call_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart/isolates/limited_active_mutator_test.dart b/runtime/tests/vm/dart/isolates/limited_active_mutator_test.dart
index f56e9ee..1fc5a31 100644
--- a/runtime/tests/vm/dart/isolates/limited_active_mutator_test.dart
+++ b/runtime/tests/vm/dart/isolates/limited_active_mutator_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification --disable-thread-pool-limit
+// VMOptions=--disable-heap-verification --disable-thread-pool-limit
 
 import 'dart:async';
 import 'dart:math' as math;
diff --git a/runtime/tests/vm/dart/isolates/regress_46539_test.dart b/runtime/tests/vm/dart/isolates/regress_46539_test.dart
index 0814f0d..148280d 100644
--- a/runtime/tests/vm/dart/isolates/regress_46539_test.dart
+++ b/runtime/tests/vm/dart/isolates/regress_46539_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--optimization-filter=foo --enable-isolate-groups --no-use-osr --optimization-counter-threshold=1 --deterministic
+// VMOptions=--optimization-filter=foo --no-use-osr --optimization-counter-threshold=1 --deterministic
 
 // Important: This is a regression test for a concurrency issue, if this test
 // is flaky it is essentially failing!
diff --git a/runtime/tests/vm/dart/isolates/ring_gc_sendAndExit_test.dart b/runtime/tests/vm/dart/isolates/ring_gc_sendAndExit_test.dart
index a50d9e8..0f9c559 100644
--- a/runtime/tests/vm/dart/isolates/ring_gc_sendAndExit_test.dart
+++ b/runtime/tests/vm/dart/isolates/ring_gc_sendAndExit_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:math' as math;
 
diff --git a/runtime/tests/vm/dart/isolates/ring_gc_test.dart b/runtime/tests/vm/dart/isolates/ring_gc_test.dart
index c27cd6c..ff74f7d 100644
--- a/runtime/tests/vm/dart/isolates/ring_gc_test.dart
+++ b/runtime/tests/vm/dart/isolates/ring_gc_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:math' as math;
diff --git a/runtime/tests/vm/dart/isolates/spawn_function_test.dart b/runtime/tests/vm/dart/isolates/spawn_function_test.dart
index f2a85ea..d1f4b7b 100644
--- a/runtime/tests/vm/dart/isolates/spawn_function_test.dart
+++ b/runtime/tests/vm/dart/isolates/spawn_function_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:async';
 
diff --git a/runtime/tests/vm/dart/isolates/sum_recursive_call_test.dart b/runtime/tests/vm/dart/isolates/sum_recursive_call_test.dart
index 89bcc58..81beb3d 100644
--- a/runtime/tests/vm/dart/isolates/sum_recursive_call_test.dart
+++ b/runtime/tests/vm/dart/isolates/sum_recursive_call_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart/isolates/sum_recursive_tail_call_test.dart b/runtime/tests/vm/dart/isolates/sum_recursive_tail_call_test.dart
index 866b8f3..9148bcd 100644
--- a/runtime/tests/vm/dart/isolates/sum_recursive_tail_call_test.dart
+++ b/runtime/tests/vm/dart/isolates/sum_recursive_tail_call_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart/isolates/thread_pool_test.dart b/runtime/tests/vm/dart/isolates/thread_pool_test.dart
index 3d689ca..d12e272 100644
--- a/runtime/tests/vm/dart/isolates/thread_pool_test.dart
+++ b/runtime/tests/vm/dart/isolates/thread_pool_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // SharedObjects=ffi_test_functions
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:ffi';
diff --git a/runtime/tests/vm/dart/issue_31959_31960_test.dart b/runtime/tests/vm/dart/issue_31959_31960_test.dart
index 3ca1be2..6a3a3e5 100644
--- a/runtime/tests/vm/dart/issue_31959_31960_test.dart
+++ b/runtime/tests/vm/dart/issue_31959_31960_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:math';
diff --git a/runtime/tests/vm/dart/print_object_layout_script.dart b/runtime/tests/vm/dart/print_object_layout_script.dart
new file mode 100644
index 0000000..d063d6a
--- /dev/null
+++ b/runtime/tests/vm/dart/print_object_layout_script.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test script for print_object_layout_test.dart
+
+class ClassA {
+  String fieldA1 = 'a';
+  int fieldA2 = 1;
+}
+
+class ClassB extends ClassA {
+  String fieldB1 = 'b';
+  int fieldB2 = 2;
+  int unusedB3 = 3;
+  static int staticB4 = 4;
+}
+
+@pragma('vm:never-inline')
+useFields(ClassB obj) =>
+    "${obj.fieldA1}${obj.fieldA2}${obj.fieldB1}${obj.fieldB2}${ClassB.staticB4}";
+
+main() {
+  useFields(ClassB());
+}
diff --git a/runtime/tests/vm/dart/print_object_layout_test.dart b/runtime/tests/vm/dart/print_object_layout_test.dart
new file mode 100644
index 0000000..36620d6
--- /dev/null
+++ b/runtime/tests/vm/dart/print_object_layout_test.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// OtherResources=print_object_layout_script.dart
+
+// Test for --print-object-layout-to option of gen_snapshot.
+
+import 'dart:convert' show jsonDecode;
+import 'dart:math' show max;
+import 'dart:io' show File, Platform;
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+import 'use_flag_test_helper.dart';
+
+verifyObjectLayout(String path) {
+  final classes = jsonDecode(File(path).readAsStringSync());
+  var sizeA, fieldsA;
+  var sizeB, fieldsB;
+  for (var cls in classes) {
+    if (cls['class'] == 'ClassA') {
+      sizeA = cls['size'].toInt();
+      fieldsA = cls['fields'];
+      print(cls);
+    } else if (cls['class'] == 'ClassB') {
+      sizeB = cls['size'].toInt();
+      fieldsB = cls['fields'];
+      print(cls);
+    }
+  }
+  Expect.isNotNull(sizeA);
+  Expect.isTrue(sizeA > 0);
+  Expect.isTrue(fieldsA.length == 2);
+  int maxOffsetA = 0;
+  for (var field in fieldsA) {
+    String fieldName = field['field'];
+    Expect.isTrue(fieldName == 'fieldA1' || fieldName == 'fieldA2');
+    int offset = field['offset'].toInt();
+    Expect.isTrue((offset > 0) && (offset < sizeA));
+    maxOffsetA = max(offset, maxOffsetA);
+  }
+
+  Expect.isNotNull(sizeB);
+  Expect.isTrue(sizeB > 0);
+  Expect.isTrue(sizeA <= sizeB);
+  Expect.isTrue(fieldsB.length == 3);
+  for (var field in fieldsB) {
+    String fieldName = field['field'];
+    if (fieldName == 'staticB4') {
+      Expect.isTrue(field['static']);
+    } else {
+      Expect.isTrue(fieldName == 'fieldB1' || fieldName == 'fieldB2');
+      int offset = field['offset'].toInt();
+      Expect.isTrue((offset > 0) && (offset < sizeB));
+      Expect.isTrue(offset > maxOffsetA);
+    }
+  }
+}
+
+main() async {
+  if (!isAOTRuntime) {
+    return; // Running in JIT: AOT binaries not available.
+  }
+
+  if (Platform.isAndroid) {
+    return; // SDK tree not available on the test device.
+  }
+
+  // These are the tools we need to be available to run on a given platform:
+  if (!File(platformDill).existsSync()) {
+    throw "Cannot run test as $platformDill does not exist";
+  }
+  if (!await testExecutable(genSnapshot)) {
+    throw "Cannot run test as $genSnapshot not available";
+  }
+
+  final testScriptUri =
+      Platform.script.resolve('print_object_layout_script.dart');
+
+  await withTempDir('print-object-layout-test', (String temp) async {
+    final appDillPath = path.join(temp, 'app.dill');
+    final snapshotPath = path.join(temp, 'aot.snapshot');
+    final objectLayoutPath = path.join(temp, 'layout.json');
+
+    await run(genKernel, <String>[
+      '--aot',
+      '--platform=$platformDill',
+      '--output=$appDillPath',
+      testScriptUri.toFilePath(),
+    ]);
+
+    await run(genSnapshot, <String>[
+      '--snapshot-kind=app-aot-elf',
+      '--elf=$snapshotPath',
+      '--print-object-layout-to=$objectLayoutPath',
+      appDillPath,
+    ]);
+
+    verifyObjectLayout(objectLayoutPath);
+  });
+}
diff --git a/runtime/tests/vm/dart/regress47472_test.dart b/runtime/tests/vm/dart/regress47472_test.dart
new file mode 100644
index 0000000..a3f8f8b
--- /dev/null
+++ b/runtime/tests/vm/dart/regress47472_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  for (int i = 0; i < 1000000; ++i) {
+    try {
+      throw 'a';
+    } catch (e, s) {}
+  }
+}
diff --git a/runtime/tests/vm/dart/regress_36636_test.dart b/runtime/tests/vm/dart/regress_36636_test.dart
index 1daf616..2fee620 100644
--- a/runtime/tests/vm/dart/regress_36636_test.dart
+++ b/runtime/tests/vm/dart/regress_36636_test.dart
@@ -2,6 +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.
 
-// VMOptions=--intrinsify=false --no-use-vfp
+// VMOptions=--intrinsify=false
 
 main() {}
diff --git a/runtime/tests/vm/dart/regress_46878_test.dart b/runtime/tests/vm/dart/regress_46878_test.dart
index 6ef37bc..ad59a65 100644
--- a/runtime/tests/vm/dart/regress_46878_test.dart
+++ b/runtime/tests/vm/dart/regress_46878_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 
 import 'package:expect/expect.dart';
diff --git a/runtime/tests/vm/dart/regress_47468_test.dart b/runtime/tests/vm/dart/regress_47468_test.dart
deleted file mode 100644
index 1ff1bbe..0000000
--- a/runtime/tests/vm/dart/regress_47468_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Regression test for https://github.com/dart-lang/sdk/issues/47468.
-// Verifies that the sending empty non-const maps works
-
-// VMOptions=--no-enable-isolate-groups
-
-import 'dart:isolate';
-
-void main() async {
-  final nonConstMap = <int, Object>{};
-  final receivePort = ReceivePort();
-  final sendPort = receivePort.sendPort;
-  sendPort.send(nonConstMap);
-  await receivePort.first;
-}
diff --git a/runtime/tests/vm/dart/regress_47704_test.dart b/runtime/tests/vm/dart/regress_47704_test.dart
new file mode 100644
index 0000000..fca9648
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_47704_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for https://github.com/dart-lang/sdk/issues/47704.
+// Verifies that compiler doesn't crash with compressed pointers when
+// generating code involving as 32-bit Smi constant which is not
+// sign-extended to 64 bits.
+
+// VMOptions=--deterministic --optimization_counter_threshold=80
+
+import 'dart:typed_data';
+import "package:expect/expect.dart";
+
+const int minLevel = -1;
+
+void foo() {
+  // Make sure this method is compiled.
+  for (int i = 0; i < 100; i++) {}
+
+  bool ok = false;
+  try {
+    for (int loc0 in ((Uint16List(40)).sublist(minLevel, 42))) {
+      print(loc0);
+    }
+  } catch (e) {
+    ok = true;
+  }
+  Expect.isTrue(ok);
+}
+
+void main() {
+  foo();
+  foo();
+}
diff --git a/runtime/tests/vm/dart/regress_flutter66765_test.dart b/runtime/tests/vm/dart/regress_flutter66765_test.dart
new file mode 100644
index 0000000..c47c966
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_flutter66765_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for https://github.com/flutter/flutter/issues/66765
+// Verifies that AOT compiler doesn't crash on a particular flow graph.
+
+class TutorialBloc {
+  TutorialBloc();
+
+  Stream<TutorialStates> mapEventToState(TutorialEvents event) async* {
+    switch (event.action) {
+      default:
+        yield TutorialInitState();
+    }
+  }
+}
+
+enum TutorialAction { dummyData }
+
+class TutorialEvents {
+  final TutorialAction action;
+  const TutorialEvents(this.action);
+}
+
+abstract class TutorialStates {}
+
+class TutorialInitState extends TutorialStates {}
+
+List<dynamic> l = [TutorialBloc()];
+
+void main() async {
+  if (l.length > 1) {
+    l[0].mapEventToState(42);
+  }
+}
diff --git a/runtime/tests/vm/dart/sendandexit_test.dart b/runtime/tests/vm/dart/sendandexit_test.dart
index a48ec13..90c4e8a 100644
--- a/runtime/tests/vm/dart/sendandexit_test.dart
+++ b/runtime/tests/vm/dart/sendandexit_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.
 //
-// VMOptions=--enable-isolate-groups
-//
 // Validates functionality of Isolate.exit().
 
 import 'dart:async';
diff --git a/runtime/tests/vm/dart/slow_path_shared_stub_test.dart b/runtime/tests/vm/dart/slow_path_shared_stub_test.dart
index fb4c4d1..6aabfed 100644
--- a/runtime/tests/vm/dart/slow_path_shared_stub_test.dart
+++ b/runtime/tests/vm/dart/slow_path_shared_stub_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // VMOptions=--optimization_counter_threshold=10 --no-background-compilation --shared-slow-path-triggers-gc
-// VMOptions=--optimization_counter_threshold=10 --no-background-compilation --shared-slow-path-triggers-gc --no-use-vfp
 
 // This tests the stackmaps and environments for safepoints corresponding to
 // slow-path code which uses shared runtime stubs.
diff --git a/runtime/tests/vm/dart/spawn_infinite_loop_test.dart b/runtime/tests/vm/dart/spawn_infinite_loop_test.dart
index 3a89e80..cc0fb42 100644
--- a/runtime/tests/vm/dart/spawn_infinite_loop_test.dart
+++ b/runtime/tests/vm/dart/spawn_infinite_loop_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 
 // This test ensures that the VM can kill the spawned isolate during VM
diff --git a/runtime/tests/vm/dart/spawn_shutdown_test.dart b/runtime/tests/vm/dart/spawn_shutdown_test.dart
index d47db32..d1e96925 100644
--- a/runtime/tests/vm/dart/spawn_shutdown_test.dart
+++ b/runtime/tests/vm/dart/spawn_shutdown_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-asserts --enable-isolate-groups
-// VMOptions=--enable-asserts --no-enable-isolate-groups
+// VMOptions=--enable-asserts
 
 import 'dart:io';
 import 'dart:isolate';
diff --git a/runtime/tests/vm/dart/split_literals_test.dart b/runtime/tests/vm/dart/split_literals_test.dart
index 076e27a..a5391b1 100644
--- a/runtime/tests/vm/dart/split_literals_test.dart
+++ b/runtime/tests/vm/dart/split_literals_test.dart
@@ -65,8 +65,6 @@
 
     // Compile kernel to ELF.
     await run(genSnapshot, <String>[
-      "--use_bare_instructions=false", //# object: ok
-      "--use_bare_instructions=true", //# bare: ok
       "--snapshot-kind=app-aot-elf",
       "--elf=$snapshot",
       "--loading-unit-manifest=$manifest",
diff --git a/runtime/tests/vm/dart/transferable_test.dart b/runtime/tests/vm/dart/transferable_test.dart
index 2f5155a..9d76575 100644
--- a/runtime/tests/vm/dart/transferable_test.dart
+++ b/runtime/tests/vm/dart/transferable_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that validates that transferables are faster than regular typed data.
 
 import 'dart:async';
diff --git a/runtime/tests/vm/dart/transferable_throws_test.dart b/runtime/tests/vm/dart/transferable_throws_test.dart
index 201c020..1c3aadf 100644
--- a/runtime/tests/vm/dart/transferable_throws_test.dart
+++ b/runtime/tests/vm/dart/transferable_throws_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that ensures correct exceptions are thrown when misusing
 // [TransferableTypedData].
 
diff --git a/runtime/tests/vm/dart/typed_data_vfp_regress_42745_test.dart b/runtime/tests/vm/dart/typed_data_vfp_regress_42745_test.dart
index 294f0ea..f61edad 100644
--- a/runtime/tests/vm/dart/typed_data_vfp_regress_42745_test.dart
+++ b/runtime/tests/vm/dart/typed_data_vfp_regress_42745_test.dart
@@ -1,7 +1,6 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--no-use-vfp
 
 import 'dart:typed_data';
 
diff --git a/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart b/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart
deleted file mode 100644
index eead3b6..0000000
--- a/runtime/tests/vm/dart/use_bare_instructions_flag_test.dart
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This test is ensuring that the flag for --use-bare-instructions given at
-// AOT compile-time will be used at runtime (irrespective if other values were
-// passed to the runtime).
-
-import "dart:async";
-import "dart:io";
-
-import 'package:expect/expect.dart';
-import 'package:path/path.dart' as path;
-
-import 'use_flag_test_helper.dart';
-
-main(List<String> args) async {
-  if (!isAOTRuntime) {
-    return; // Running in JIT: AOT binaries not available.
-  }
-
-  if (Platform.isAndroid) {
-    return; // SDK tree and dart_bootstrap not available on the test device.
-  }
-
-  await withTempDir('bare-flag-test', (String tempDir) async {
-    final script = path.join(sdkDir, 'pkg/kernel/bin/dump.dart');
-    final scriptDill = path.join(tempDir, 'kernel_dump.dill');
-
-    // Compile script to Kernel IR.
-    await run(genKernel, <String>[
-      '--aot',
-      '--platform=$platformDill',
-      '-o',
-      scriptDill,
-      script,
-    ]);
-
-    // Run the AOT compiler with/without bare instructions.
-    final scriptBareSnapshot = path.join(tempDir, 'bare.snapshot');
-    final scriptNonBareSnapshot = path.join(tempDir, 'non_bare.snapshot');
-    await Future.wait(<Future>[
-      run(genSnapshot, <String>[
-        '--use-bare-instructions',
-        '--snapshot-kind=app-aot-elf',
-        '--elf=$scriptBareSnapshot',
-        scriptDill,
-      ]),
-      run(genSnapshot, <String>[
-        '--no-use-bare-instructions',
-        '--snapshot-kind=app-aot-elf',
-        '--elf=$scriptNonBareSnapshot',
-        scriptDill,
-      ]),
-    ]);
-
-    // Run the resulting bare-AOT compiled script.
-    final bareOut1 = path.join(tempDir, 'bare-out1.txt');
-    final bareOut2 = path.join(tempDir, 'bare-out2.txt');
-    await Future.wait(<Future>[
-      run(aotRuntime, <String>[
-        '--use-bare-instructions',
-        scriptBareSnapshot,
-        scriptDill,
-        bareOut1,
-      ]),
-      run(aotRuntime, <String>[
-        '--no-use-bare-instructions',
-        scriptBareSnapshot,
-        scriptDill,
-        bareOut2,
-      ]),
-    ]);
-
-    // Run the resulting non-bare-AOT compiled script.
-    final nonBareOut1 = path.join(tempDir, 'non-bare-out1.txt');
-    final nonBareOut2 = path.join(tempDir, 'non-bare-out2.txt');
-    await Future.wait(<Future>[
-      run(aotRuntime, <String>[
-        '--use-bare-instructions',
-        scriptNonBareSnapshot,
-        scriptDill,
-        nonBareOut1,
-      ]),
-      run(aotRuntime, <String>[
-        '--no-use-bare-instructions',
-        scriptNonBareSnapshot,
-        scriptDill,
-        nonBareOut2,
-      ]),
-    ]);
-
-    // Ensure we got 4 times the same result.
-    final output = await readFile(bareOut1);
-    Expect.equals(output, await readFile(bareOut2));
-    Expect.equals(output, await readFile(nonBareOut1));
-    Expect.equals(output, await readFile(nonBareOut2));
-  });
-}
-
-Future<String> readFile(String file) {
-  return new File(file).readAsString();
-}
diff --git a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
index 526c449..26cc7c7 100644
--- a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
+++ b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
@@ -107,7 +107,6 @@
 
 Future<void> testAOT(String dillPath,
     {bool useAsm = false,
-    bool useBare = true,
     bool forceDrops = false,
     bool useDispatch = true,
     bool stripUtil = false, // Note: forced true if useAsm.
@@ -127,9 +126,6 @@
   }
 
   final descriptionBuilder = StringBuffer()..write(useAsm ? 'assembly' : 'elf');
-  if (!useBare) {
-    descriptionBuilder.write('-nonbare');
-  }
   if (forceDrops) {
     descriptionBuilder.write('-dropped');
   }
@@ -156,7 +152,6 @@
     final snapshotPath = path.join(tempDir, 'test.snap');
     final commonSnapshotArgs = [
       if (stripFlag) '--strip', //  gen_snapshot specific and not a VM flag.
-      useBare ? '--use-bare-instructions' : '--no-use-bare-instructions',
       "--write-v8-snapshot-profile-to=$profilePath",
       if (forceDrops) ...[
         '--dwarf-stack-traces',
@@ -438,24 +433,11 @@
 
     // Test unstripped ELF generation directly.
     await testAOT(aotDillPath);
-    await testAOT(aotDillPath, useBare: false);
     await testAOT(aotDillPath, forceDrops: true);
-    await testAOT(aotDillPath, forceDrops: true, useBare: false);
     await testAOT(aotDillPath, forceDrops: true, useDispatch: false);
-    await testAOT(aotDillPath,
-        forceDrops: true, useDispatch: false, useBare: false);
 
     // Test flag-stripped ELF generation.
     await testAOT(aotDillPath, stripFlag: true);
-    await testAOT(aotDillPath, useBare: false, stripFlag: true);
-
-    // Since we can't force disassembler support after the fact when running
-    // in PRODUCT mode, skip any --disassemble tests. Do these tests last as
-    // they have lots of output and so the log will be truncated.
-    if (!const bool.fromEnvironment('dart.vm.product')) {
-      // Regression test for dartbug.com/41149.
-      await testAOT(aotDillPath, useBare: false, disassemble: true);
-    }
 
     // We neither generate assembly nor have a stripping utility on Windows.
     if (Platform.isWindows) {
@@ -469,7 +451,6 @@
     } else {
       // Test unstripped ELF generation that is then externally stripped.
       await testAOT(aotDillPath, stripUtil: true);
-      await testAOT(aotDillPath, stripUtil: true, useBare: false);
     }
 
     // TODO(sstrickl): Currently we can't assemble for SIMARM64 on MacOSX.
@@ -482,9 +463,7 @@
     }
     // Test unstripped assembly generation that is then externally stripped.
     await testAOT(aotDillPath, useAsm: true);
-    await testAOT(aotDillPath, useAsm: true, useBare: false);
     // Test stripped assembly generation that is then externally stripped.
     await testAOT(aotDillPath, useAsm: true, stripFlag: true);
-    await testAOT(aotDillPath, useAsm: true, stripFlag: true, useBare: false);
   });
 }
diff --git a/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart b/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart
new file mode 100644
index 0000000..548a2d4
--- /dev/null
+++ b/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test attempts to verify that the slow path for late static and
+// instance field initialization appropriately restores the write barrier
+// invariant.
+
+import 'dart:_internal';
+
+class Box {
+  var field;
+}
+
+late var global = (() {
+  VMInternalsForTesting.collectAllGarbage();
+  return 10;
+})();
+
+@pragma('vm:never-inline')
+foo() {
+  final kTrue = int.parse('1') == 1;
+  final box = Box(); // Ensure this box is allocated new
+  if (kTrue) {
+    global; // Will not block write-barrier elimination (GC in here should restore invariants)
+    box.field = Box()..field = 42; // Runtime should've made `box` remembered.
+    VMInternalsForTesting.collectAllGarbage();
+  }
+  return box;
+}
+
+main() {
+  if (foo().field.field != 42) throw 'a';
+}
diff --git a/runtime/tests/vm/dart_2/aot_prefer_equality_comparison_il_test.dart b/runtime/tests/vm/dart_2/aot_prefer_equality_comparison_il_test.dart
index 9baf000..8447554 100644
--- a/runtime/tests/vm/dart_2/aot_prefer_equality_comparison_il_test.dart
+++ b/runtime/tests/vm/dart_2/aot_prefer_equality_comparison_il_test.dart
@@ -5,14 +5,21 @@
 // Test that we emit EqualityCompare rather than StrictCompare+BoxInt64
 // when comparing non-nullable integer to a Smi.
 
-// MatchIL[AOT]=factorial
-// __ GraphEntry
-// __ FunctionEntry
-// __ CheckStackOverflow
-// __ Branch(EqualityCompare)
+import 'package:vm/testing/il_matchers.dart';
+
 @pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph')
 int factorial(int value) => value == 1 ? value : value * factorial(value - 1);
 
+void matchIL$factorial(FlowGraph graph) {
+  graph.match([
+    match.block('Graph'),
+    match.block('Function', [
+      match.Branch(match.EqualityCompare(match.any, match.any, kind: '==')),
+    ]),
+  ]);
+}
+
 void main() {
   print(factorial(4));
 }
diff --git a/runtime/tests/vm/dart_2/bare_instructions_trampolines_test.dart b/runtime/tests/vm/dart_2/bare_instructions_trampolines_test.dart
index fee9478..9c70a11 100644
--- a/runtime/tests/vm/dart_2/bare_instructions_trampolines_test.dart
+++ b/runtime/tests/vm/dart_2/bare_instructions_trampolines_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--always-generate-trampolines-for-testing --use-bare-instructions
+// VMOptions=--always-generate-trampolines-for-testing
 
 // We use a reasonable sized test and run it with the above options.
 import 'hello_fuchsia_test.dart' as test;
diff --git a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
index 228e1b5..d4d9e46 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 //
-// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks --no-use-bare-instructions
+// VMOptions=--dwarf-stack-traces --save-debugging-info=async_lazy_debug.so --lazy-async-stacks
 
 // @dart = 2.9
 
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index cd46b03..0d1489c 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -131,7 +131,7 @@
 
 Future listenAsyncStarThrowAsync() async {
   // Listening to an async* doesn't create the usual await-for StreamIterator.
-  StreamSubscription ss = asyncStarThrowAsync().listen((Future f) {});
+  StreamSubscription ss = asyncStarThrowAsync().listen((Future f) => 42);
   await ss.asFuture();
 }
 
@@ -852,7 +852,7 @@
       r'^<asynchronous suspension>$',
       r'^#1      asyncStarThrowAsync \(.*/utils.dart:128(:5)?\)$',
       r'^<asynchronous suspension>$',
-      r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart(:0)?\)$',
+      r'^#2      listenAsyncStarThrowAsync.<anonymous closure> \(.+/utils.dart:134(:56)?\)$',
       r'^<asynchronous suspension>$',
     ];
     await doTestAwait(
diff --git a/runtime/tests/vm/dart_2/deferred_isolate_test.dart b/runtime/tests/vm/dart_2/deferred_isolate_test.dart
index ccfcbba..c6283a7 100644
--- a/runtime/tests/vm/dart_2/deferred_isolate_test.dart
+++ b/runtime/tests/vm/dart_2/deferred_isolate_test.dart
@@ -6,9 +6,6 @@
 
 // Verify deferred library status is per-isolate, not per-isolate-group.
 
-// VMOptions=--enable-isolate-groups
-
-import 'dart:async';
 import 'dart:isolate';
 import 'package:expect/expect.dart';
 
diff --git a/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart b/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart
index e513770..5efc2bd 100644
--- a/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart
+++ b/runtime/tests/vm/dart_2/deferred_loading_call_modes_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--use_bare_instructions=false
-// VMOptions=--use_bare_instructions=true --use_table_dispatch=false
-// VMOptions=--use_bare_instructions=true --use_table_dispatch=true
+// VMOptions=--use_table_dispatch=false
+// VMOptions=--use_table_dispatch=true
 
 import "splay_test.dart" deferred as splay; // Some non-trivial code.
 
diff --git a/runtime/tests/vm/dart_2/flutter_regress_91370_il_test.dart b/runtime/tests/vm/dart_2/flutter_regress_91370_il_test.dart
new file mode 100644
index 0000000..afa6bcf
--- /dev/null
+++ b/runtime/tests/vm/dart_2/flutter_regress_91370_il_test.dart
@@ -0,0 +1,730 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:vm/testing/il_matchers.dart';
+
+bool shouldPrint = false;
+
+@pragma('vm:never-inline')
+void blackhole(Object v) {
+  if (shouldPrint) {
+    print(v);
+  }
+}
+
+class A {}
+
+class A0 extends A {
+  final double x;
+  final String str;
+
+  A0(this.x, this.str);
+
+  // Use [x] to prevent the field from being shaken out. We would like
+  // [x] to occupy the same location that [A1.str] takes so that
+  // type confusion / incorrect LICM would cause a crash when we load
+  // `o.[A1.str].length` on an object of type [A0]
+  String toString() => 'A0($x)';
+}
+
+class A1 extends A {
+  final String str;
+
+  A1(this.str);
+}
+
+class H<T> {
+  final T data;
+  H(this.data);
+}
+
+abstract class B<T extends A> {
+  final T v;
+
+  B(this.v);
+
+  int load(H<T> h);
+  int loadWithNamedParam({required H<T> h});
+
+  @pragma('vm:never-inline')
+  @pragma('vm:testing:print-flow-graph', '*LICM')
+  int testNarrowingThroughThisCallWithPositionalParam(H<T> h) {
+    var result = 0;
+    for (var i = 0; i < 10; i++) {
+      // We will perform polymorphic inlining of `load` because `this`
+      // is known to be either B0 or B1. In both cases we will have
+      // v.str.length loads fully inlined because inlined bodies
+      // have precise type information for v.
+      // Then we will hoist v.str.length out of the loop past
+      // class-id comparisons generated by the inlining leading
+      // to incorrect code which will crash.
+      result += load(h);
+    }
+    return result;
+  }
+
+  @pragma('vm:never-inline')
+  @pragma('vm:testing:print-flow-graph', '*LICM')
+  int testNarrowingThroughThisCallWithNamedParams(H<T> h) {
+    var result = 0;
+    for (var i = 0; i < 10; i++) {
+      // We will perform polymorphic inlining of `load` because `this`
+      // is known to be either B0 or B1. In both cases we will have
+      // v.str.length loads fully inlined because inlined bodies
+      // have precise type information for v.
+      // Then we will hoist v.str.length out of the loop past
+      // class-id comparisons generated by the inlining leading
+      // to incorrect code which will crash.
+      result += loadWithNamedParam(h: h);
+    }
+    return result;
+  }
+}
+
+class BImpl<T extends A> extends B<T> {
+  BImpl(T v) : super(v);
+
+  // These methods do not matter. They can just return 0.
+  int load(H<T> h) => 0;
+  int loadWithNamedParam({required H<T> h}) => 0;
+}
+
+class B0 extends B<A0> {
+  B0(A0 a) : super(a);
+
+  int load(H<A0> h) {
+    return h.data.str.length;
+  }
+
+  int loadWithNamedParam({String? a, required H<A0> h, String? z}) {
+    return h.data.str.length;
+  }
+}
+
+class B1 extends B<A1> {
+  B1(A1 a) : super(a);
+
+  int load(H<A1> h) {
+    return h.data.str.length;
+  }
+
+  int loadWithNamedParam({String? a, required H<A1> h, String? z}) {
+    return h.data.str.length;
+  }
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckOnSubclass(B b) {
+  int sum = 0;
+  b.v.toString();
+  for (var i = 0; i < 2; i++) {
+    if (b is B1) {
+      sum += b.v.str.length;
+    }
+  }
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    if (b is B<A1>) {
+      sum += b.v.str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIsCheckWithTypeArgMonomorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    if (b is B<A1>) {
+      sum += b.v.str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughAsCheckWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    // Branch with a side-effect to avoid b as B<A1> hoisting.
+    if (sum == 42) throw '42';
+    sum += (b as B<A1>).v.str.length;
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B b) {
+  int sum = 0;
+  final v = b.v;
+  for (var i = 0; i < 2; i++) {
+    // Branch with a side-effect to avoid b as B<A1> hoisting.
+    if (sum == 42) throw '42';
+    sum += (sum == 22 ? b as B<A1> : b as B<A1>).v.str.length;
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIndexedLoadFromGrowableArray(List<A> l) {
+  int sum = 0;
+  final v = l[0];
+  for (var i = 0; i < 2; i++) {
+    if (l is List<A1>) {
+      sum += l[0].str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+@pragma('vm:never-inline')
+@pragma('vm:testing:print-flow-graph', '*LICM')
+int testNarrowingThroughIndexedLoadFromFixedArray(List<A> l) {
+  int sum = 0;
+  final v = l[0];
+  for (var i = 0; i < 2; i++) {
+    if (l is List<A1>) {
+      sum += l[0].str.length;
+    }
+  }
+  blackhole(v);
+  return sum;
+}
+
+void main(List<String> args) {
+  shouldPrint = args.contains("shouldPrint");
+
+  // Prevent shaking of BImpl.load and BImpl.loadWithNamed, if these methods
+  // are shaked (because they are not used) that would inhibit polymorphic
+  // inlining at testNarrowingThroughThisCall{,WithNamedParams}
+  BImpl(A1("")).load(H(A1("")));
+  BImpl(A1("")).loadWithNamedParam(h: H(A1("")));
+
+  for (var i = 0; i < 2; i++) {
+    final a1 = A1("$i");
+    final a0 = A0(i.toDouble(), "$i");
+    B1(a1).testNarrowingThroughThisCallWithPositionalParam(H(a1));
+    B0(a0).testNarrowingThroughThisCallWithPositionalParam(H(a0));
+    B1(a1).testNarrowingThroughThisCallWithNamedParams(H(a1));
+    B0(a0).testNarrowingThroughThisCallWithNamedParams(H(a0));
+    testNarrowingThroughIsCheckOnSubclass(B1(a1));
+    testNarrowingThroughIsCheckOnSubclass(B0(a0));
+    testNarrowingThroughIsCheckWithTypeArgPolymorphic(B1(a1));
+    testNarrowingThroughIsCheckWithTypeArgPolymorphic(B0(a0));
+    testNarrowingThroughIsCheckWithTypeArgMonomorphic(BImpl<A1>(a1));
+    testNarrowingThroughIsCheckWithTypeArgMonomorphic(BImpl<A0>(a0));
+    testNarrowingThroughAsCheckWithTypeArgPolymorphic(B1(a1));
+    try {
+      testNarrowingThroughAsCheckWithTypeArgPolymorphic(B0(a0));
+      throw "Should be unreachable";
+    } on TypeError catch (e) {}
+    testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B1(a1));
+    try {
+      testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(B0(a0));
+      throw "Should be unreachable";
+    } on TypeError catch (e) {}
+    testNarrowingThroughIndexedLoadFromGrowableArray([a1]);
+    testNarrowingThroughIndexedLoadFromGrowableArray([a0]);
+    testNarrowingThroughIndexedLoadFromFixedArray(
+        List<A1>.filled(1, a1, growable: false));
+    testNarrowingThroughIndexedLoadFromFixedArray(
+        List<A0>.filled(1, a0, growable: false));
+  }
+}
+
+void matchIL$testNarrowingThroughThisCallWithPositionalParam(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'h_raw' << match.Parameter(index: 1),
+      'h' << match.AssertAssignable('h_raw', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_cid' << match.LoadClassId('this'),
+          match.Branch(match.StrictCompare('this_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by inlining.
+          'h_' << match.Redefinition('h'),
+          'v0' << match.LoadField('h_', slot: 'data'),
+          'v1' << match.LoadField('v0', slot: 'str'),
+          'v2' << match.LoadField('v1', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'h_raw' << match.Parameter(index: 1),
+      'h' << match.AssertAssignable('h_raw', match.any),
+      'this_cid' << match.LoadClassId('this'), // Hoisted.
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.StrictCompare('this_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          // After LICM redefinitions are removed.
+          'v0' << match.LoadField('h', slot: 'data'),
+          'v1' << match.LoadField('v0', slot: 'str'),
+          'v2' << match.LoadField('v1', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughThisCallWithNamedParams(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  // Graph shape is basically the same.
+  matchIL$testNarrowingThroughThisCallWithPositionalParam(
+      beforeLICM, afterLICM);
+}
+
+void matchIL$testNarrowingThroughIsCheckOnSubclass(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_cid' << match.LoadClassId('b'),
+          match.Branch(match.StrictCompare('b_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      'b_cid' << match.LoadClassId('b'), // Hoisted.
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.StrictCompare('b_cid', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIsCheckWithTypeArgMonomorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_is_B<A1>' << match.InstanceOf('b', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('b_is_B<A1>', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'b_is_B<A1>' << match.InstanceOf('b', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('b_is_B<A1>', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughAsCheckWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughPhiOfAsChecksWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B5', ifFalse: 'B6'),
+        ]),
+    'B5' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B6' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B7' <<
+        match.block('Join', [
+          // This redefinition was inserted by PhiInstr::Canonicalize
+          // which removed Phi of two AssertAssignables above.
+          match.Redefinition('b'),
+          // This redefinition was inserted by load forwarding.
+          'b.v*' << match.Redefinition('b.v'),
+          'v0' << match.LoadField('b.v*', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'b' << match.Parameter(index: 0),
+      'b.v' << match.LoadField('b', slot: 'v'),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B3', ifFalse: 'B4'),
+        ]),
+    'B3' << match.block('Target', [match.Throw(match.any)]),
+    'B4' <<
+        match.block('Target', [
+          match.Branch(match.EqualityCompare(match.any, match.any, kind: '=='),
+              ifTrue: 'B5', ifFalse: 'B6'),
+        ]),
+    'B5' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B6' <<
+        match.block('Target', [
+          match.AssertAssignable('b', match.any, match.any, match.any),
+          match.Goto('B7'),
+        ]),
+    'B7' <<
+        match.block('Join', [
+          'v0' << match.LoadField('b.v', slot: 'str'),
+          'v1' << match.LoadField('v0', slot: 'String.length'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIndexedLoadFromGrowableArray(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a.data' << match.LoadField('this', slot: 'GrowableObjectArray.data'),
+      'a.data[0]' << match.LoadIndexed('a.data', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by load forwarding.
+          'a.data[0]*' << match.Redefinition('a.data[0]'),
+          if (!beforeLICM.soundNullSafety)
+            'a.data[0]*!' << match.CheckNull('a.data[0]*'),
+          'a.data[0].str' <<
+              match.LoadField(
+                  beforeLICM.soundNullSafety ? 'a.data[0]*' : 'a.data[0]*!',
+                  slot: 'str'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a.data' << match.LoadField('this', slot: 'GrowableObjectArray.data'),
+      'a.data[0]' << match.LoadIndexed('a.data', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          if (!beforeLICM.soundNullSafety)
+            'a.data[0]!' << match.CheckNull('a.data[0]'),
+          'a.data[0].str' <<
+              match.LoadField(
+                  beforeLICM.soundNullSafety ? 'a.data[0]' : 'a.data[0]!',
+                  slot: 'str'),
+        ]),
+  ], env: env);
+}
+
+void matchIL$testNarrowingThroughIsCheckWithTypeArgPolymorphic(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  matchIL$testNarrowingThroughIsCheckWithTypeArgMonomorphic(
+      beforeLICM, afterLICM);
+}
+
+void matchIL$testNarrowingThroughIndexedLoadFromFixedArray(
+    FlowGraph beforeLICM, FlowGraph afterLICM) {
+  final env = beforeLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a[0]' << match.LoadIndexed('this', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          match.Redefinition('this'),
+          // This redefinition was inserted by load forwarding.
+          'a[0]*' << match.Redefinition('a[0]'),
+          if (!beforeLICM.soundNullSafety) 'a[0]*!' << match.CheckNull('a[0]*'),
+          'a[0].str' <<
+              match.LoadField(beforeLICM.soundNullSafety ? 'a[0]*' : 'a[0]*!',
+                  slot: 'str'),
+        ]),
+  ]);
+
+  afterLICM.match([
+    match.block('Graph'),
+    match.block('Function', [
+      'this' << match.Parameter(index: 0),
+      'a[0]' << match.LoadIndexed('this', match.any),
+      match.Goto('B1'),
+    ]),
+    'B1' <<
+        match.block('Join', [
+          match.CheckStackOverflow(),
+          match.Branch(match.RelationalOp(match.any, match.any, kind: '<'),
+              ifTrue: 'B2'),
+        ]),
+    'B2' <<
+        match.block('Target', [
+          'this_is_List' << match.InstanceOf('this', match.any, match.any),
+          match.Branch(
+              match.StrictCompare('this_is_List', match.any, kind: '==='),
+              ifTrue: 'B3'),
+        ]),
+    'B3' <<
+        match.block('Target', [
+          if (!beforeLICM.soundNullSafety) 'a[0]!' << match.CheckNull('a[0]'),
+          'a[0].str' <<
+              match.LoadField(beforeLICM.soundNullSafety ? 'a[0]' : 'a[0]!',
+                  slot: 'str'),
+        ]),
+  ], env: env);
+}
diff --git a/runtime/tests/vm/dart_2/isolates/closure_entrypoint_test.dart b/runtime/tests/vm/dart_2/isolates/closure_entrypoint_test.dart
index 4fa05c9..7249cee 100644
--- a/runtime/tests/vm/dart_2/isolates/closure_entrypoint_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/closure_entrypoint_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
diff --git a/runtime/tests/vm/dart_2/isolates/closures_without_captured_variables_test.dart b/runtime/tests/vm/dart_2/isolates/closures_without_captured_variables_test.dart
index 3f714b6..ebe5474 100644
--- a/runtime/tests/vm/dart_2/isolates/closures_without_captured_variables_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/closures_without_captured_variables_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.
 
-// VMOptions=--enable-isolate-groups
-
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
 
diff --git a/runtime/tests/vm/dart_2/isolates/dart_api_create_lightweight_isolate_test.dart b/runtime/tests/vm/dart_2/isolates/dart_api_create_lightweight_isolate_test.dart
index 0a2fd1c..23ffcd0 100644
--- a/runtime/tests/vm/dart_2/isolates/dart_api_create_lightweight_isolate_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/dart_api_create_lightweight_isolate_test.dart
@@ -5,8 +5,7 @@
 // @dart = 2.9
 
 // SharedObjects=ffi_test_functions
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:ffi';
@@ -19,8 +18,6 @@
 import 'test_utils.dart' show isArtificialReloadMode;
 import '../../../../../tests/ffi/dylib_utils.dart';
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
 final bool usesDwarfStackTraces = Platform.executableArguments
     .any((entry) => RegExp('--dwarf[-_]stack[-_]traces').hasMatch(entry));
 final bool hasSymbolicStackTraces = !usesDwarfStackTraces;
@@ -225,25 +222,7 @@
   await testFatalError();
 }
 
-Future testNotSupported() async {
-  dynamic exception;
-  try {
-    FfiBindings.createLightweightIsolate('debug-name', Pointer.fromAddress(0));
-  } catch (e) {
-    exception = e;
-  }
-  Expect.contains(
-      'Lightweight isolates need to be explicitly enabled by passing '
-      '--enable-isolate-groups.',
-      exception.toString());
-}
-
 Future main(args) async {
-  if (!isolateGroupsEnabled) {
-    await testNotSupported();
-    return;
-  }
-
   // This test should not run in hot-reload because of the way it is written
   // (embedder related code written in Dart instead of C)
   if (isArtificialReloadMode) return;
diff --git a/runtime/tests/vm/dart_2/isolates/fast_object_copy2_test.dart b/runtime/tests/vm/dart_2/isolates/fast_object_copy2_test.dart
index 9b8c1f0..99d8e26 100644
--- a/runtime/tests/vm/dart_2/isolates/fast_object_copy2_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/fast_object_copy2_test.dart
@@ -4,10 +4,10 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation
 
 // The tests in this file will only succeed when isolate groups are enabled
 // (hence the VMOptions above).
diff --git a/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart b/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
index 1a1512d..09aa46f 100644
--- a/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/fast_object_copy_test.dart
@@ -4,11 +4,10 @@
 
 // @dart = 2.9
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
+// VMOptions=--no-enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
+// VMOptions=--enable-fast-object-copy --gc-on-foc-slow-path --force-evacuation --verify-store-buffer
 
 // The tests in this file are particularly for an implementation that tries to
 // allocate the entire graph in BFS order using a fast new space allocation
diff --git a/runtime/tests/vm/dart_2/isolates/fibonacci_call_test.dart b/runtime/tests/vm/dart_2/isolates/fibonacci_call_test.dart
index 7a097a2..97d9b13 100644
--- a/runtime/tests/vm/dart_2/isolates/fibonacci_call_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/fibonacci_call_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart_2/isolates/limited_active_mutator_test.dart b/runtime/tests/vm/dart_2/isolates/limited_active_mutator_test.dart
index a99e4ee..b01ac77 100644
--- a/runtime/tests/vm/dart_2/isolates/limited_active_mutator_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/limited_active_mutator_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification --disable-thread-pool-limit
+// VMOptions=--disable-heap-verification --disable-thread-pool-limit
 
 import 'dart:async';
 import 'dart:math' as math;
diff --git a/runtime/tests/vm/dart_2/isolates/regress_46539_test.dart b/runtime/tests/vm/dart_2/isolates/regress_46539_test.dart
index 0f16901..6990bd0 100644
--- a/runtime/tests/vm/dart_2/isolates/regress_46539_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/regress_46539_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--optimization-filter=foo --enable-isolate-groups --no-use-osr --optimization-counter-threshold=1 --deterministic
+// VMOptions=--optimization-filter=foo --no-use-osr --optimization-counter-threshold=1 --deterministic
 
 // Important: This is a regression test for a concurrency issue, if this test
 // is flaky it is essentially failing!
diff --git a/runtime/tests/vm/dart_2/isolates/reload_utils.dart b/runtime/tests/vm/dart_2/isolates/reload_utils.dart
index f9ba12f..c973017 100644
--- a/runtime/tests/vm/dart_2/isolates/reload_utils.dart
+++ b/runtime/tests/vm/dart_2/isolates/reload_utils.dart
@@ -125,7 +125,6 @@
     '--enable-vm-service:0',
     '--disable-dart-dev',
     '--disable-service-auth-codes',
-    '--enable-isolate-groups',
     file
   ];
   final env = Platform.environment;
diff --git a/runtime/tests/vm/dart_2/isolates/ring_gc_sendAndExit_test.dart b/runtime/tests/vm/dart_2/isolates/ring_gc_sendAndExit_test.dart
index 2c7011c..d12ebf6 100644
--- a/runtime/tests/vm/dart_2/isolates/ring_gc_sendAndExit_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/ring_gc_sendAndExit_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:math' as math;
 
diff --git a/runtime/tests/vm/dart_2/isolates/ring_gc_test.dart b/runtime/tests/vm/dart_2/isolates/ring_gc_test.dart
index 908d1a3..46af3c4 100644
--- a/runtime/tests/vm/dart_2/isolates/ring_gc_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/ring_gc_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:math' as math;
diff --git a/runtime/tests/vm/dart_2/isolates/spawn_function_test.dart b/runtime/tests/vm/dart_2/isolates/spawn_function_test.dart
index 4474a3f..24977d6 100644
--- a/runtime/tests/vm/dart_2/isolates/spawn_function_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/spawn_function_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:async';
 
diff --git a/runtime/tests/vm/dart_2/isolates/sum_recursive_call_test.dart b/runtime/tests/vm/dart_2/isolates/sum_recursive_call_test.dart
index 0aba961..39baabc 100644
--- a/runtime/tests/vm/dart_2/isolates/sum_recursive_call_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/sum_recursive_call_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart_2/isolates/sum_recursive_tail_call_test.dart b/runtime/tests/vm/dart_2/isolates/sum_recursive_tail_call_test.dart
index 85b6f0e..989e1cd 100644
--- a/runtime/tests/vm/dart_2/isolates/sum_recursive_tail_call_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/sum_recursive_tail_call_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:isolate';
 
diff --git a/runtime/tests/vm/dart_2/isolates/thread_pool_test.dart b/runtime/tests/vm/dart_2/isolates/thread_pool_test.dart
index f54a9ce..667bec3 100644
--- a/runtime/tests/vm/dart_2/isolates/thread_pool_test.dart
+++ b/runtime/tests/vm/dart_2/isolates/thread_pool_test.dart
@@ -5,7 +5,7 @@
 // @dart = 2.9
 
 // SharedObjects=ffi_test_functions
-// VMOptions=--enable-isolate-groups --disable-heap-verification
+// VMOptions=--disable-heap-verification
 
 import 'dart:async';
 import 'dart:ffi';
diff --git a/runtime/tests/vm/dart_2/issue_31959_31960_test.dart b/runtime/tests/vm/dart_2/issue_31959_31960_test.dart
index 9f79c7c..cc2d8e6 100644
--- a/runtime/tests/vm/dart_2/issue_31959_31960_test.dart
+++ b/runtime/tests/vm/dart_2/issue_31959_31960_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:math';
diff --git a/runtime/tests/vm/dart_2/print_object_layout_script.dart b/runtime/tests/vm/dart_2/print_object_layout_script.dart
new file mode 100644
index 0000000..397fd1c
--- /dev/null
+++ b/runtime/tests/vm/dart_2/print_object_layout_script.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+// Test script for print_object_layout_test.dart
+
+class ClassA {
+  String fieldA1 = 'a';
+  int fieldA2 = 1;
+}
+
+class ClassB extends ClassA {
+  String fieldB1 = 'b';
+  int fieldB2 = 2;
+  int unusedB3 = 3;
+  static int staticB4 = 4;
+}
+
+@pragma('vm:never-inline')
+useFields(ClassB obj) =>
+    "${obj.fieldA1}${obj.fieldA2}${obj.fieldB1}${obj.fieldB2}${ClassB.staticB4}";
+
+main() {
+  useFields(ClassB());
+}
diff --git a/runtime/tests/vm/dart_2/print_object_layout_test.dart b/runtime/tests/vm/dart_2/print_object_layout_test.dart
new file mode 100644
index 0000000..e082bea
--- /dev/null
+++ b/runtime/tests/vm/dart_2/print_object_layout_test.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+// OtherResources=print_object_layout_script.dart
+
+// Test for --print-object-layout-to option of gen_snapshot.
+
+import 'dart:convert' show jsonDecode;
+import 'dart:math' show max;
+import 'dart:io' show File, Platform;
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+import 'use_flag_test_helper.dart';
+
+verifyObjectLayout(String path) {
+  final classes = jsonDecode(File(path).readAsStringSync());
+  var sizeA, fieldsA;
+  var sizeB, fieldsB;
+  for (var cls in classes) {
+    if (cls['class'] == 'ClassA') {
+      sizeA = cls['size'].toInt();
+      fieldsA = cls['fields'];
+      print(cls);
+    } else if (cls['class'] == 'ClassB') {
+      sizeB = cls['size'].toInt();
+      fieldsB = cls['fields'];
+      print(cls);
+    }
+  }
+  Expect.isNotNull(sizeA);
+  Expect.isTrue(sizeA > 0);
+  Expect.isTrue(fieldsA.length == 2);
+  int maxOffsetA = 0;
+  for (var field in fieldsA) {
+    String fieldName = field['field'];
+    Expect.isTrue(fieldName == 'fieldA1' || fieldName == 'fieldA2');
+    int offset = field['offset'].toInt();
+    Expect.isTrue((offset > 0) && (offset < sizeA));
+    maxOffsetA = max(offset, maxOffsetA);
+  }
+
+  Expect.isNotNull(sizeB);
+  Expect.isTrue(sizeB > 0);
+  Expect.isTrue(sizeA <= sizeB);
+  Expect.isTrue(fieldsB.length == 3);
+  for (var field in fieldsB) {
+    String fieldName = field['field'];
+    if (fieldName == 'staticB4') {
+      Expect.isTrue(field['static']);
+    } else {
+      Expect.isTrue(fieldName == 'fieldB1' || fieldName == 'fieldB2');
+      int offset = field['offset'].toInt();
+      Expect.isTrue((offset > 0) && (offset < sizeB));
+      Expect.isTrue(offset > maxOffsetA);
+    }
+  }
+}
+
+main() async {
+  if (!isAOTRuntime) {
+    return; // Running in JIT: AOT binaries not available.
+  }
+
+  if (Platform.isAndroid) {
+    return; // SDK tree not available on the test device.
+  }
+
+  // These are the tools we need to be available to run on a given platform:
+  if (!File(platformDill).existsSync()) {
+    throw "Cannot run test as $platformDill does not exist";
+  }
+  if (!await testExecutable(genSnapshot)) {
+    throw "Cannot run test as $genSnapshot not available";
+  }
+
+  final testScriptUri =
+      Platform.script.resolve('print_object_layout_script.dart');
+
+  await withTempDir('print-object-layout-test', (String temp) async {
+    final appDillPath = path.join(temp, 'app.dill');
+    final snapshotPath = path.join(temp, 'aot.snapshot');
+    final objectLayoutPath = path.join(temp, 'layout.json');
+
+    await run(genKernel, <String>[
+      '--aot',
+      '--platform=$platformDill',
+      '--output=$appDillPath',
+      testScriptUri.toFilePath(),
+    ]);
+
+    await run(genSnapshot, <String>[
+      '--snapshot-kind=app-aot-elf',
+      '--elf=$snapshotPath',
+      '--print-object-layout-to=$objectLayoutPath',
+      appDillPath,
+    ]);
+
+    verifyObjectLayout(objectLayoutPath);
+  });
+}
diff --git a/runtime/tests/vm/dart_2/regress47472_test.dart b/runtime/tests/vm/dart_2/regress47472_test.dart
new file mode 100644
index 0000000..a3f8f8b
--- /dev/null
+++ b/runtime/tests/vm/dart_2/regress47472_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  for (int i = 0; i < 1000000; ++i) {
+    try {
+      throw 'a';
+    } catch (e, s) {}
+  }
+}
diff --git a/runtime/tests/vm/dart_2/regress_36636_test.dart b/runtime/tests/vm/dart_2/regress_36636_test.dart
index 1c41d17..5040d1f 100644
--- a/runtime/tests/vm/dart_2/regress_36636_test.dart
+++ b/runtime/tests/vm/dart_2/regress_36636_test.dart
@@ -4,6 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--intrinsify=false --no-use-vfp
+// VMOptions=--intrinsify=false
 
 main() {}
diff --git a/runtime/tests/vm/dart_2/regress_46878_test.dart b/runtime/tests/vm/dart_2/regress_46878_test.dart
index 6ef37bc..ad59a65 100644
--- a/runtime/tests/vm/dart_2/regress_46878_test.dart
+++ b/runtime/tests/vm/dart_2/regress_46878_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 
 import 'package:expect/expect.dart';
diff --git a/runtime/tests/vm/dart_2/regress_47468_test.dart b/runtime/tests/vm/dart_2/regress_47468_test.dart
deleted file mode 100644
index b1ccb10..0000000
--- a/runtime/tests/vm/dart_2/regress_47468_test.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Regression test for https://github.com/dart-lang/sdk/issues/47468.
-// Verifies that the sending empty non-const maps works
-
-// VMOptions=--no-enable-isolate-groups
-
-// @dart = 2.9
-
-import 'dart:isolate';
-
-void main() async {
-  final nonConstMap = <int, Object>{};
-  final receivePort = ReceivePort();
-  final sendPort = receivePort.sendPort;
-  sendPort.send(nonConstMap);
-  await receivePort.first;
-}
diff --git a/runtime/tests/vm/dart_2/regress_47704_test.dart b/runtime/tests/vm/dart_2/regress_47704_test.dart
new file mode 100644
index 0000000..a0c2335
--- /dev/null
+++ b/runtime/tests/vm/dart_2/regress_47704_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for https://github.com/dart-lang/sdk/issues/47704.
+// Verifies that compiler doesn't crash with compressed pointers when
+// generating code involving as 32-bit Smi constant which is not
+// sign-extended to 64 bits.
+
+// VMOptions=--deterministic --optimization_counter_threshold=80
+
+// @dart = 2.9
+
+import 'dart:typed_data';
+import "package:expect/expect.dart";
+
+const int minLevel = -1;
+
+void foo() {
+  // Make sure this method is compiled.
+  for (int i = 0; i < 100; i++) {}
+
+  bool ok = false;
+  try {
+    for (int loc0 in ((Uint16List(40)).sublist(minLevel, 42))) {
+      print(loc0);
+    }
+  } catch (e) {
+    ok = true;
+  }
+  Expect.isTrue(ok);
+}
+
+void main() {
+  foo();
+  foo();
+}
diff --git a/runtime/tests/vm/dart_2/regress_flutter66765_test.dart b/runtime/tests/vm/dart_2/regress_flutter66765_test.dart
new file mode 100644
index 0000000..af3337c
--- /dev/null
+++ b/runtime/tests/vm/dart_2/regress_flutter66765_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+// Regression test for https://github.com/flutter/flutter/issues/66765
+// Verifies that AOT compiler doesn't crash on a particular flow graph.
+
+class TutorialBloc {
+  TutorialBloc();
+
+  Stream<TutorialStates> mapEventToState(TutorialEvents event) async* {
+    switch (event.action) {
+      default:
+        yield TutorialInitState();
+    }
+  }
+}
+
+enum TutorialAction { dummyData }
+
+class TutorialEvents {
+  final TutorialAction action;
+  const TutorialEvents(this.action);
+}
+
+abstract class TutorialStates {}
+
+class TutorialInitState extends TutorialStates {}
+
+List<dynamic> l = [TutorialBloc()];
+
+void main() async {
+  if (l.length > 1) {
+    l[0].mapEventToState(42);
+  }
+}
diff --git a/runtime/tests/vm/dart_2/sendandexit_test.dart b/runtime/tests/vm/dart_2/sendandexit_test.dart
index bf2ffe2..f64ac6a 100644
--- a/runtime/tests/vm/dart_2/sendandexit_test.dart
+++ b/runtime/tests/vm/dart_2/sendandexit_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.
 //
-// VMOptions=--enable-isolate-groups
-//
 // Validates functionality of Isolate.exit().
 
 // @dart = 2.9
diff --git a/runtime/tests/vm/dart_2/slow_path_shared_stub_test.dart b/runtime/tests/vm/dart_2/slow_path_shared_stub_test.dart
index be7b675..9f6cc16 100644
--- a/runtime/tests/vm/dart_2/slow_path_shared_stub_test.dart
+++ b/runtime/tests/vm/dart_2/slow_path_shared_stub_test.dart
@@ -5,7 +5,6 @@
 // @dart = 2.9
 
 // VMOptions=--optimization_counter_threshold=10 --no-background-compilation --shared-slow-path-triggers-gc
-// VMOptions=--optimization_counter_threshold=10 --no-background-compilation --shared-slow-path-triggers-gc --no-use-vfp
 
 // This tests the stackmaps and environments for safepoints corresponding to
 // slow-path code which uses shared runtime stubs.
diff --git a/runtime/tests/vm/dart_2/spawn_infinite_loop_test.dart b/runtime/tests/vm/dart_2/spawn_infinite_loop_test.dart
index c87cf77..1d66659 100644
--- a/runtime/tests/vm/dart_2/spawn_infinite_loop_test.dart
+++ b/runtime/tests/vm/dart_2/spawn_infinite_loop_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 
 // This test ensures that the VM can kill the spawned isolate during VM
diff --git a/runtime/tests/vm/dart_2/spawn_shutdown_test.dart b/runtime/tests/vm/dart_2/spawn_shutdown_test.dart
index 4c4eb86..5b30f4f 100644
--- a/runtime/tests/vm/dart_2/spawn_shutdown_test.dart
+++ b/runtime/tests/vm/dart_2/spawn_shutdown_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-asserts --enable-isolate-groups
-// VMOptions=--enable-asserts --no-enable-isolate-groups
+// VMOptions=--enable-asserts
 
 // @dart = 2.9
 
diff --git a/runtime/tests/vm/dart_2/split_literals_test.dart b/runtime/tests/vm/dart_2/split_literals_test.dart
index 05fcff2..4fa9c1a 100644
--- a/runtime/tests/vm/dart_2/split_literals_test.dart
+++ b/runtime/tests/vm/dart_2/split_literals_test.dart
@@ -67,8 +67,6 @@
 
     // Compile kernel to ELF.
     await run(genSnapshot, <String>[
-      "--use_bare_instructions=false", //# object: ok
-      "--use_bare_instructions=true", //# bare: ok
       "--snapshot-kind=app-aot-elf",
       "--elf=$snapshot",
       "--loading-unit-manifest=$manifest",
diff --git a/runtime/tests/vm/dart_2/transferable_test.dart b/runtime/tests/vm/dart_2/transferable_test.dart
index e08040e..1a38483 100644
--- a/runtime/tests/vm/dart_2/transferable_test.dart
+++ b/runtime/tests/vm/dart_2/transferable_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that validates that transferables are faster than regular typed data.
 
 import 'dart:async';
diff --git a/runtime/tests/vm/dart_2/transferable_throws_test.dart b/runtime/tests/vm/dart_2/transferable_throws_test.dart
index 320ec01..d985cbc 100644
--- a/runtime/tests/vm/dart_2/transferable_throws_test.dart
+++ b/runtime/tests/vm/dart_2/transferable_throws_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that ensures correct exceptions are thrown when misusing
 // [TransferableTypedData].
 
diff --git a/runtime/tests/vm/dart_2/typed_data_vfp_regress_42745_test.dart b/runtime/tests/vm/dart_2/typed_data_vfp_regress_42745_test.dart
index 77ad067..27f1b23 100644
--- a/runtime/tests/vm/dart_2/typed_data_vfp_regress_42745_test.dart
+++ b/runtime/tests/vm/dart_2/typed_data_vfp_regress_42745_test.dart
@@ -1,7 +1,6 @@
 // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--no-use-vfp
 
 // @dart = 2.9
 
diff --git a/runtime/tests/vm/dart_2/use_bare_instructions_flag_test.dart b/runtime/tests/vm/dart_2/use_bare_instructions_flag_test.dart
deleted file mode 100644
index 52b958f..0000000
--- a/runtime/tests/vm/dart_2/use_bare_instructions_flag_test.dart
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-// This test is ensuring that the flag for --use-bare-instructions given at
-// AOT compile-time will be used at runtime (irrespective if other values were
-// passed to the runtime).
-
-import "dart:async";
-import "dart:io";
-
-import 'package:expect/expect.dart';
-import 'package:path/path.dart' as path;
-
-import 'use_flag_test_helper.dart';
-
-main(List<String> args) async {
-  if (!isAOTRuntime) {
-    return; // Running in JIT: AOT binaries not available.
-  }
-
-  if (Platform.isAndroid) {
-    return; // SDK tree and dart_bootstrap not available on the test device.
-  }
-
-  await withTempDir('bare-flag-test', (String tempDir) async {
-    final script = path.join(sdkDir, 'pkg/kernel/bin/dump.dart');
-    final scriptDill = path.join(tempDir, 'kernel_dump.dill');
-
-    // Compile script to Kernel IR.
-    await run(genKernel, <String>[
-      '--aot',
-      '--platform=$platformDill',
-      '-o',
-      scriptDill,
-      script,
-    ]);
-
-    // Run the AOT compiler with/without bare instructions.
-    final scriptBareSnapshot = path.join(tempDir, 'bare.snapshot');
-    final scriptNonBareSnapshot = path.join(tempDir, 'non_bare.snapshot');
-    await Future.wait(<Future>[
-      run(genSnapshot, <String>[
-        '--use-bare-instructions',
-        '--snapshot-kind=app-aot-elf',
-        '--elf=$scriptBareSnapshot',
-        scriptDill,
-      ]),
-      run(genSnapshot, <String>[
-        '--no-use-bare-instructions',
-        '--snapshot-kind=app-aot-elf',
-        '--elf=$scriptNonBareSnapshot',
-        scriptDill,
-      ]),
-    ]);
-
-    // Run the resulting bare-AOT compiled script.
-    final bareOut1 = path.join(tempDir, 'bare-out1.txt');
-    final bareOut2 = path.join(tempDir, 'bare-out2.txt');
-    await Future.wait(<Future>[
-      run(aotRuntime, <String>[
-        '--use-bare-instructions',
-        scriptBareSnapshot,
-        scriptDill,
-        bareOut1,
-      ]),
-      run(aotRuntime, <String>[
-        '--no-use-bare-instructions',
-        scriptBareSnapshot,
-        scriptDill,
-        bareOut2,
-      ]),
-    ]);
-
-    // Run the resulting non-bare-AOT compiled script.
-    final nonBareOut1 = path.join(tempDir, 'non-bare-out1.txt');
-    final nonBareOut2 = path.join(tempDir, 'non-bare-out2.txt');
-    await Future.wait(<Future>[
-      run(aotRuntime, <String>[
-        '--use-bare-instructions',
-        scriptNonBareSnapshot,
-        scriptDill,
-        nonBareOut1,
-      ]),
-      run(aotRuntime, <String>[
-        '--no-use-bare-instructions',
-        scriptNonBareSnapshot,
-        scriptDill,
-        nonBareOut2,
-      ]),
-    ]);
-
-    // Ensure we got 4 times the same result.
-    final output = await readFile(bareOut1);
-    Expect.equals(output, await readFile(bareOut2));
-    Expect.equals(output, await readFile(nonBareOut1));
-    Expect.equals(output, await readFile(nonBareOut2));
-  });
-}
-
-Future<String> readFile(String file) {
-  return new File(file).readAsString();
-}
diff --git a/runtime/tests/vm/dart_2/v8_snapshot_profile_writer_test.dart b/runtime/tests/vm/dart_2/v8_snapshot_profile_writer_test.dart
index a4d23af..cf3e581 100644
--- a/runtime/tests/vm/dart_2/v8_snapshot_profile_writer_test.dart
+++ b/runtime/tests/vm/dart_2/v8_snapshot_profile_writer_test.dart
@@ -109,7 +109,6 @@
 
 Future<void> testAOT(String dillPath,
     {bool useAsm = false,
-    bool useBare = true,
     bool forceDrops = false,
     bool useDispatch = true,
     bool stripUtil = false, // Note: forced true if useAsm.
@@ -129,9 +128,6 @@
   }
 
   final descriptionBuilder = StringBuffer()..write(useAsm ? 'assembly' : 'elf');
-  if (!useBare) {
-    descriptionBuilder.write('-nonbare');
-  }
   if (forceDrops) {
     descriptionBuilder.write('-dropped');
   }
@@ -158,7 +154,6 @@
     final snapshotPath = path.join(tempDir, 'test.snap');
     final commonSnapshotArgs = [
       if (stripFlag) '--strip', //  gen_snapshot specific and not a VM flag.
-      useBare ? '--use-bare-instructions' : '--no-use-bare-instructions',
       "--write-v8-snapshot-profile-to=$profilePath",
       if (forceDrops) ...[
         '--dwarf-stack-traces',
@@ -432,24 +427,11 @@
 
     // Test unstripped ELF generation directly.
     await testAOT(aotDillPath);
-    await testAOT(aotDillPath, useBare: false);
     await testAOT(aotDillPath, forceDrops: true);
-    await testAOT(aotDillPath, forceDrops: true, useBare: false);
     await testAOT(aotDillPath, forceDrops: true, useDispatch: false);
-    await testAOT(aotDillPath,
-        forceDrops: true, useDispatch: false, useBare: false);
 
     // Test flag-stripped ELF generation.
     await testAOT(aotDillPath, stripFlag: true);
-    await testAOT(aotDillPath, useBare: false, stripFlag: true);
-
-    // Since we can't force disassembler support after the fact when running
-    // in PRODUCT mode, skip any --disassemble tests. Do these tests last as
-    // they have lots of output and so the log will be truncated.
-    if (!const bool.fromEnvironment('dart.vm.product')) {
-      // Regression test for dartbug.com/41149.
-      await testAOT(aotDillPath, useBare: false, disassemble: true);
-    }
 
     // We neither generate assembly nor have a stripping utility on Windows.
     if (Platform.isWindows) {
@@ -463,7 +445,6 @@
     } else {
       // Test unstripped ELF generation that is then externally stripped.
       await testAOT(aotDillPath, stripUtil: true);
-      await testAOT(aotDillPath, stripUtil: true, useBare: false);
     }
 
     // TODO(sstrickl): Currently we can't assemble for SIMARM64 on MacOSX.
@@ -476,9 +457,7 @@
     }
     // Test unstripped assembly generation that is then externally stripped.
     await testAOT(aotDillPath, useAsm: true);
-    await testAOT(aotDillPath, useAsm: true, useBare: false);
     // Test stripped assembly generation that is then externally stripped.
     await testAOT(aotDillPath, useAsm: true, stripFlag: true);
-    await testAOT(aotDillPath, useAsm: true, stripFlag: true, useBare: false);
   });
 }
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 9f7c51c..0685477 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -20,10 +20,10 @@
 dart/isolates/fast_object_copy_test: Pass, Slow # Slow due to doing a lot of transitive object copies.
 dart/minimal_kernel_test: Pass, Slow # Spawns several subprocesses
 dart/null_safety_autodetection_in_kernel_compiler_test: Pass, Slow # Spawns several subprocesses
+dart/print_object_layout_test: Pass, Slow # Spawns several subprocesses
 dart/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
 dart/snapshot_version_test: Skip # This test is a Dart1 test (script snapshot)
 dart/stack_overflow_shared_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
-dart/use_bare_instructions_flag_test: Pass, Slow # Spawns several subprocesses
 dart_2/boxmint_test: Pass, Slow # Uses slow path
 dart_2/byte_array_optimized_test: Pass, Slow
 dart_2/data_uri_import_test/none: SkipByDesign
@@ -33,10 +33,10 @@
 dart_2/isolates/fast_object_copy_test: Pass, Slow # Slow due to doing a lot of transitive object copies.
 dart_2/minimal_kernel_test: Pass, Slow # Spawns several subprocesses
 dart_2/null_safety_autodetection_in_kernel_compiler_test: Pass, Slow # Spawns several subprocesses
+dart_2/print_object_layout_test: Pass, Slow # Spawns several subprocesses
 dart_2/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
 dart_2/snapshot_version_test: Skip # This test is a Dart1 test (script snapshot)
 dart_2/stack_overflow_shared_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
-dart_2/use_bare_instructions_flag_test: Pass, Slow # Spawns several subprocesses
 
 [ $arch == ia32 ]
 dart/disassemble_aot_test: SkipByDesign # IA32 does not support AOT.
@@ -403,11 +403,9 @@
 dart/emit_aot_size_info_flag_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart/split_aot_kernel_generation2_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart/split_aot_kernel_generation_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
-dart/use_bare_instructions_flag_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart_2/emit_aot_size_info_flag_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart_2/split_aot_kernel_generation2_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 dart_2/split_aot_kernel_generation_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
-dart_2/use_bare_instructions_flag_test: SkipByDesign # This test is for VM AOT only and is quite slow (so we don't run it in debug mode).
 
 [ $mode != debug || $runtime != dart_precompiled ]
 in_memory_elf_test: Skip # Tests a debug-mode flag to dart_precompiled_runtime.
@@ -427,10 +425,6 @@
 dart_2/isolates/send_object_to_spawn_uri_isolate_test: SkipByDesign # uses spawnUri
 dart_2/issue32950_test: SkipByDesign # uses spawnUri.
 
-[ $runtime != dart_precompiled || $system == android ]
-dart/bare_instructions_trampolines_test: SkipByDesign # This test is for VM AOT only (android fails due to listing interfaces).
-dart_2/bare_instructions_trampolines_test: SkipByDesign # This test is for VM AOT only (android fails due to listing interfaces).
-
 [ $hot_reload || $hot_reload_rollback ]
 dart/appjit*: SkipByDesign # Cannot reload with URI pointing to app snapshot.
 dart/disassemble_determinism_test: SkipSlow # Runs expensive fibonacci(32) computation in 2 subprocesses
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index 7ba2f79..b6e32b7 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -78,11 +78,6 @@
         extraFlags += ['--optimization_counter_threshold=1'];
       }
     }
-    // Every once in a while, disable VFP on arm32.
-    if (mode.contains('arm32') && rand.nextInt(4) == 0) {
-      prefix += '-noVFP';
-      extraFlags += ['--no-use-vfp'];
-    }
     // Every once in a while, use -O3 compiler.
     if (!mode.startsWith('djs') && rand.nextInt(4) == 0) {
       prefix += '-O3';
diff --git a/runtime/tools/dartfuzz/gen_api_table.dart b/runtime/tools/dartfuzz/gen_api_table.dart
index 365a50a..2eb9f52 100644
--- a/runtime/tools/dartfuzz/gen_api_table.dart
+++ b/runtime/tools/dartfuzz/gen_api_table.dart
@@ -346,7 +346,7 @@
 
 Future<void> visitLibraryAtUri(AnalysisSession session, String uri) async {
   final libPath = session.uriConverter.uriToPath(Uri.parse(uri));
-  var result = await session.getResolvedLibrary2(libPath!);
+  var result = await session.getResolvedLibrary(libPath!);
   if (result is ResolvedLibraryResult) {
     visitLibrary(result.element);
   } else {
diff --git a/runtime/tools/dartfuzz/gen_type_table.dart b/runtime/tools/dartfuzz/gen_type_table.dart
index 6bd642e..a8e0868 100644
--- a/runtime/tools/dartfuzz/gen_type_table.dart
+++ b/runtime/tools/dartfuzz/gen_type_table.dart
@@ -1340,7 +1340,7 @@
 Future<void> visitLibraryAtUri(
     AnalysisSession session, String uri, Set<InterfaceType> allTypes) async {
   var libPath = session.uriConverter.uriToPath(Uri.parse(uri));
-  var result = await session.getResolvedLibrary2(libPath!);
+  var result = await session.getResolvedLibrary(libPath!);
   if (result is ResolvedLibraryResult) {
     visitLibrary(result.element, allTypes);
   } else {
diff --git a/runtime/tools/ffi/sdk_lib_ffi_generator.dart b/runtime/tools/ffi/sdk_lib_ffi_generator.dart
index d44c2ec..d32b0a1 100644
--- a/runtime/tools/ffi/sdk_lib_ffi_generator.dart
+++ b/runtime/tools/ffi/sdk_lib_ffi_generator.dart
@@ -223,7 +223,13 @@
       ? ""
       : """
   @patch
-  $typedListType asTypedList(int elements) => _asExternalTypedData(this, elements);
+  $typedListType asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<$nativeType>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, $elementSize);
+    _checkPointerAlignment(address, $elementSize);
+    return _asExternalTypedData$nativeType(this, length);
+  }
 """;
 
   if (container == "Pointer") {
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 69dfc4b..9abd6ee 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -56,6 +56,12 @@
     if (!is_android) {
       libs += [ "pthread" ]
     }
+
+    # Clang with libc++ does not require an explicit atomic library reference.
+    # (similar to https://github.com/flutter/buildroot/blob/master/build/config/compiler/BUILD.gn#L562)
+    if (!is_clang) {
+      libs += [ "atomic" ]
+    }
   }
 }
 
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index 11fe806..de02c85 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -997,7 +997,14 @@
       AutoTraceObjectName(func, MakeDisambiguatedFunctionName(s, func));
       WriteFromTo(func);
       if (kind == Snapshot::kFullAOT) {
-        WriteCompressedField(func, code);
+#if defined(DART_PRECOMPILER)
+        CodePtr code = func->untag()->code();
+        const auto code_index = s->GetCodeIndex(code);
+        s->WriteUnsigned(code_index);
+        s->AttributePropertyRef(code, "code_");
+#else
+        UNREACHABLE();
+#endif
       } else if (s->kind() == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(WriteCompressedField(func, unoptimized_code));
         WriteCompressedField(func, code);
@@ -1038,6 +1045,87 @@
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
+template <bool need_entry_point_for_non_discarded>
+DART_FORCE_INLINE static CodePtr GetCodeAndEntryPointByIndex(
+    const Deserializer* d,
+    intptr_t code_index,
+    uword* entry_point) {
+  code_index -= 1;  // 0 is reserved for LazyCompile stub.
+
+  // In root unit and VM isolate snapshot code_indices are self-contained
+  // they point into instruction table and/or into the code cluster.
+  // In non-root units we might also refer to code objects from the
+  // parent unit which means code_index is biased by num_base_objects_
+  const intptr_t base = d->is_non_root_unit() ? d->num_base_objects() : 0;
+  if (code_index < base) {
+    CodePtr code = static_cast<CodePtr>(d->Ref(code_index));
+    if (need_entry_point_for_non_discarded) {
+      *entry_point = Code::EntryPointOf(code);
+    }
+    return code;
+  }
+  code_index -= base;
+
+  // At this point code_index is refering to a code object which is either
+  // discarded or exists in the Code cluster. Non-discarded Code objects
+  // are associated with the tail of the instruction table and have the
+  // same order there and in the Code cluster. This means that
+  // subtracting first_entry_with_code yields index into the Code cluster.
+  // This also works for deferred code objects in root unit's snapshot
+  // due to the choice of encoding (see Serializer::GetCodeIndex).
+  const intptr_t first_entry_with_code =
+      d->instructions_table().rodata()->first_entry_with_code;
+  if (code_index < first_entry_with_code) {
+    *entry_point = d->instructions_table().EntryPointAt(code_index);
+    return StubCode::UnknownDartCode().ptr();
+  } else {
+    const intptr_t cluster_index = code_index - first_entry_with_code;
+    CodePtr code =
+        static_cast<CodePtr>(d->Ref(d->code_start_index() + cluster_index));
+    if (need_entry_point_for_non_discarded) {
+      *entry_point = Code::EntryPointOf(code);
+    }
+    return code;
+  }
+}
+
+CodePtr Deserializer::GetCodeByIndex(intptr_t code_index,
+                                     uword* entry_point) const {
+  // See Serializer::GetCodeIndex for how code_index is encoded.
+  if (code_index == 0) {
+    return StubCode::LazyCompile().ptr();
+  } else if (FLAG_precompiled_mode) {
+    return GetCodeAndEntryPointByIndex<
+        /*need_entry_point_for_non_discarded=*/false>(this, code_index,
+                                                      entry_point);
+  } else {
+    // -1 below because 0 is reserved for LazyCompile stub.
+    const intptr_t ref = code_start_index_ + code_index - 1;
+    ASSERT(code_start_index_ <= ref && ref < code_stop_index_);
+    return static_cast<CodePtr>(Ref(ref));
+  }
+}
+
+intptr_t Deserializer::CodeIndexToClusterIndex(const InstructionsTable& table,
+                                               intptr_t code_index) {
+  // Note: code indices we are interpreting here originate from the root
+  // loading unit which means base is equal to 0.
+  // See comments which clarify the connection between code_index and
+  // index into the Code cluster.
+  ASSERT(FLAG_precompiled_mode);
+  const intptr_t first_entry_with_code = table.rodata()->first_entry_with_code;
+  return code_index - 1 - first_entry_with_code;
+}
+
+uword Deserializer::GetEntryPointByCodeIndex(intptr_t code_index) const {
+  // See Deserializer::GetCodeByIndex which this code repeats.
+  ASSERT(FLAG_precompiled_mode);
+  uword entry_point = 0;
+  GetCodeAndEntryPointByIndex</*need_entry_point_for_non_discarded=*/true>(
+      this, code_index, &entry_point);
+  return entry_point;
+}
+
 class FunctionDeserializationCluster : public DeserializationCluster {
  public:
   FunctionDeserializationCluster() : DeserializationCluster("Function") {}
@@ -1064,11 +1152,10 @@
 
       if (kind == Snapshot::kFullAOT) {
         const intptr_t code_index = d->ReadUnsigned();
-        CodePtr code = static_cast<CodePtr>(d->Ref(code_index));
+        uword entry_point = 0;
+        CodePtr code = d->GetCodeByIndex(code_index, &entry_point);
         func->untag()->code_ = code;
-        if (Code::IsUnknownDartCode(code)) {
-          const uword entry_point = d->instructions_table().EntryPointAt(
-              code_index - d->code_start_index());
+        if (entry_point != 0) {
           func->untag()->entry_point_ = entry_point;
           func->untag()->unchecked_entry_point_ = entry_point;
         }
@@ -1775,7 +1862,7 @@
     // the pool for references to other code objects (which might reside
     // in the current loading unit).
     ObjectPoolPtr pool = code->untag()->object_pool_;
-    if (s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions) {
+    if (s->kind() == Snapshot::kFullAOT) {
       TracePool(s, pool, /*only_code=*/is_deferred);
     } else {
       if (s->InCurrentLoadingUnitOrRoot(pool)) {
@@ -1788,7 +1875,11 @@
     if (s->kind() == Snapshot::kFullJIT) {
       s->Push(code->untag()->deopt_info_array_);
       s->Push(code->untag()->static_calls_target_table_);
+      s->Push(code->untag()->compressed_stackmaps_);
     } else if (s->kind() == Snapshot::kFullAOT) {
+      // Note: we don't trace compressed_stackmaps_ because we are going to emit
+      // a separate mapping table into RO data which is not going to be a real
+      // heap object.
 #if defined(DART_PRECOMPILER)
       auto const calls_array = code->untag()->static_calls_target_table_;
       if (calls_array != Array::null()) {
@@ -1819,13 +1910,9 @@
 #endif
     }
 
-    if (s->InCurrentLoadingUnitOrRoot(code->untag()->compressed_stackmaps_)) {
-      s->Push(code->untag()->compressed_stackmaps_);
-    }
-
     if (Code::IsDiscarded(code)) {
-      ASSERT(s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions &&
-             FLAG_dwarf_stack_traces_mode && !FLAG_retain_code_objects);
+      ASSERT(s->kind() == Snapshot::kFullAOT && FLAG_dwarf_stack_traces_mode &&
+             !FLAG_retain_code_objects);
       // Only object pool and static call table entries and the compressed
       // stack maps should be pushed.
       return;
@@ -1869,50 +1956,60 @@
 
   struct CodeOrderInfo {
     CodePtr code;
-    intptr_t order;
-    intptr_t original_index;
+    intptr_t not_discarded;  // 1 if this code was not discarded and
+                             // 0 otherwise.
+    intptr_t instructions_id;
   };
 
   // We sort code objects in such a way that code objects with the same
-  // instructions are grouped together. To make sorting more stable between
-  // similar programs we also sort them further by their original indices -
-  // this helps to stabilize output of --print-instructions-sizes-to which uses
-  // the name of the first code object (among those pointing to the same
-  // instruction objects).
+  // instructions are grouped together and ensure that all instructions
+  // without associated code objects are grouped together at the beginning of
+  // the code section. InstructionsTable encoding assumes that all
+  // instructions with non-discarded Code objects are grouped at the end.
+  //
+  // Note that in AOT mode we expect that all Code objects pointing to
+  // the same instructions are deduplicated, as in bare instructions mode
+  // there is no way to identify which specific Code object (out of those
+  // which point to the specific instructions range) actually corresponds
+  // to a particular frame.
   static int CompareCodeOrderInfo(CodeOrderInfo const* a,
                                   CodeOrderInfo const* b) {
-    if (a->order < b->order) return -1;
-    if (a->order > b->order) return 1;
-    if (a->original_index < b->original_index) return -1;
-    if (a->original_index > b->original_index) return 1;
+    if (a->not_discarded < b->not_discarded) return -1;
+    if (a->not_discarded > b->not_discarded) return 1;
+    if (a->instructions_id < b->instructions_id) return -1;
+    if (a->instructions_id > b->instructions_id) return 1;
     return 0;
   }
 
-  static void Insert(GrowableArray<CodeOrderInfo>* order_list,
+  static void Insert(Serializer* s,
+                     GrowableArray<CodeOrderInfo>* order_list,
                      IntMap<intptr_t>* order_map,
-                     CodePtr code,
-                     intptr_t original_index) {
+                     CodePtr code) {
     InstructionsPtr instr = code->untag()->instructions_;
     intptr_t key = static_cast<intptr_t>(instr);
-    intptr_t order;
+    intptr_t instructions_id = 0;
+
     if (order_map->HasKey(key)) {
-      order = order_map->Lookup(key);
+      // We are expected to merge code objects which point to the same
+      // instructions in the precompiled mode.
+      RELEASE_ASSERT(!FLAG_precompiled_mode);
+      instructions_id = order_map->Lookup(key);
     } else {
-      order = order_list->length() + 1;
-      order_map->Insert(key, order);
+      instructions_id = order_map->Length() + 1;
+      order_map->Insert(key, instructions_id);
     }
     CodeOrderInfo info;
     info.code = code;
-    info.order = order;
-    info.original_index = original_index;
+    info.instructions_id = instructions_id;
+    info.not_discarded = Code::IsDiscarded(code) ? 0 : 1;
     order_list->Add(info);
   }
 
-  static void Sort(GrowableArray<CodePtr>* codes) {
+  static void Sort(Serializer* s, GrowableArray<CodePtr>* codes) {
     GrowableArray<CodeOrderInfo> order_list;
     IntMap<intptr_t> order_map;
     for (intptr_t i = 0; i < codes->length(); i++) {
-      Insert(&order_list, &order_map, (*codes)[i], i);
+      Insert(s, &order_list, &order_map, (*codes)[i]);
     }
     order_list.Sort(CompareCodeOrderInfo);
     ASSERT(order_list.length() == codes->length());
@@ -1921,11 +2018,11 @@
     }
   }
 
-  static void Sort(GrowableArray<Code*>* codes) {
+  static void Sort(Serializer* s, GrowableArray<Code*>* codes) {
     GrowableArray<CodeOrderInfo> order_list;
     IntMap<intptr_t> order_map;
     for (intptr_t i = 0; i < codes->length(); i++) {
-      Insert(&order_list, &order_map, (*codes)[i]->ptr(), i);
+      Insert(s, &order_list, &order_map, (*codes)[i]->ptr());
     }
     order_list.Sort(CompareCodeOrderInfo);
     ASSERT(order_list.length() == codes->length());
@@ -1934,27 +2031,49 @@
     }
   }
 
+  intptr_t NonDiscardedCodeCount() {
+    intptr_t count = 0;
+    for (auto code : objects_) {
+      if (!Code::IsDiscarded(code)) {
+        count++;
+      }
+    }
+    return count;
+  }
+
   void WriteAlloc(Serializer* s) {
+    const intptr_t non_discarded_count = NonDiscardedCodeCount();
     const intptr_t count = objects_.length();
-    s->WriteUnsigned(count);
-    for (intptr_t i = 0; i < count; i++) {
-      WriteAlloc(s, objects_[i]);
+    ASSERT(count == non_discarded_count || (s->kind() == Snapshot::kFullAOT));
+
+    first_ref_ = s->next_ref_index();
+    s->WriteUnsigned(non_discarded_count);
+    for (auto code : objects_) {
+      if (!Code::IsDiscarded(code)) {
+        WriteAlloc(s, code);
+      } else {
+        // Mark discarded code unreachable, so that we could later
+        // assign artificial references to it.
+        s->heap()->SetObjectId(code, kUnreachableReference);
+      }
     }
-    const intptr_t deferred_count = deferred_objects_.length();
-    s->WriteUnsigned(deferred_count);
-    for (intptr_t i = 0; i < deferred_count; i++) {
-      WriteAlloc(s, deferred_objects_[i]);
+
+    s->WriteUnsigned(deferred_objects_.length());
+    first_deferred_ref_ = s->next_ref_index();
+    for (auto code : deferred_objects_) {
+      ASSERT(!Code::IsDiscarded(code));
+      WriteAlloc(s, code);
     }
+    last_ref_ = s->next_ref_index() - 1;
   }
 
   void WriteAlloc(Serializer* s, CodePtr code) {
+    ASSERT(!Code::IsDiscarded(code));
     s->AssignRef(code);
     AutoTraceObjectName(code, MakeDisambiguatedCodeName(s, code));
     const int32_t state_bits = code->untag()->state_bits_;
     s->Write<int32_t>(state_bits);
-    if (!Code::DiscardedBit::decode(state_bits)) {
-      target_memory_size_ += compiler::target::Code::InstanceSize(0);
-    }
+    target_memory_size_ += compiler::target::Code::InstanceSize(0);
   }
 
   void WriteFill(Serializer* s) {
@@ -1962,12 +2081,20 @@
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       CodePtr code = objects_[i];
-      WriteFill(s, kind, code, false);
+#if defined(DART_PRECOMPILER)
+      if (FLAG_write_v8_snapshot_profile_to != nullptr &&
+          Code::IsDiscarded(code)) {
+        s->CreateArtificialNodeIfNeeded(code);
+      }
+#endif
+      // Note: for discarded code this function will not write anything out
+      // it is only called to produce information into snapshot profile.
+      WriteFill(s, kind, code, /*deferred=*/false);
     }
     const intptr_t deferred_count = deferred_objects_.length();
     for (intptr_t i = 0; i < deferred_count; i++) {
       CodePtr code = deferred_objects_[i];
-      WriteFill(s, kind, code, true);
+      WriteFill(s, kind, code, /*deferred=*/true);
     }
   }
 
@@ -1975,6 +2102,7 @@
                  Snapshot::Kind kind,
                  CodePtr code,
                  bool deferred) {
+    const intptr_t bytes_written = s->bytes_written();
     AutoTraceObjectName(code, MakeDisambiguatedCodeName(s, code));
 
     intptr_t pointer_offsets_length =
@@ -2003,7 +2131,7 @@
     if (FLAG_write_v8_snapshot_profile_to != nullptr) {
       // If we are writing V8 snapshot profile then attribute references going
       // through the object pool and static calls to the code object itself.
-      if (kind == Snapshot::kFullAOT && FLAG_use_bare_instructions &&
+      if (kind == Snapshot::kFullAOT &&
           code->untag()->object_pool_ != ObjectPool::null()) {
         ObjectPoolPtr pool = code->untag()->object_pool_;
         // Non-empty per-code object pools should not be reachable in this mode.
@@ -2024,10 +2152,12 @@
 #endif  // defined(DART_PRECOMPILER)
 
     if (Code::IsDiscarded(code)) {
+      // No bytes should be written to represent this code.
+      ASSERT(s->bytes_written() == bytes_written);
       // Only write instructions, compressed stackmaps and state bits
       // for the discarded Code objects.
-      ASSERT(kind == Snapshot::kFullAOT && FLAG_use_bare_instructions &&
-             FLAG_dwarf_stack_traces_mode && !FLAG_retain_code_objects);
+      ASSERT(kind == Snapshot::kFullAOT && FLAG_dwarf_stack_traces_mode &&
+             !FLAG_retain_code_objects);
 #if defined(DART_PRECOMPILER)
       if (FLAG_write_v8_snapshot_profile_to != nullptr) {
         // Keep the owner as a (possibly artificial) node for snapshot analysis.
@@ -2036,13 +2166,12 @@
         s->AttributePropertyRef(owner, "owner_");
       }
 #endif
-
       return;
     }
 
     // No need to write object pool out if we are producing full AOT
     // snapshot with bare instructions.
-    if (!(kind == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
+    if (kind != Snapshot::kFullAOT) {
       if (s->InCurrentLoadingUnitOrRoot(code->untag()->object_pool_)) {
         WriteField(code, object_pool_);
       } else {
@@ -2053,10 +2182,8 @@
     WriteField(code, exception_handlers_);
     WriteField(code, pc_descriptors_);
     WriteField(code, catch_entry_);
-    if (s->InCurrentLoadingUnitOrRoot(code->untag()->compressed_stackmaps_)) {
+    if (s->kind() == Snapshot::kFullJIT) {
       WriteField(code, compressed_stackmaps_);
-    } else {
-      WriteFieldValue(compressed_stackmaps_, CompressedStackMaps::null());
     }
     if (FLAG_precompiled_mode && FLAG_dwarf_stack_traces_mode) {
       WriteFieldValue(inlined_id_to_function_, Array::null());
@@ -2098,7 +2225,14 @@
             Object::NameVisibility::kInternalName));
   }
 
+  intptr_t first_ref() const { return first_ref_; }
+  intptr_t first_deferred_ref() const { return first_deferred_ref_; }
+  intptr_t last_ref() const { return last_ref_; }
+
  private:
+  intptr_t first_ref_;
+  intptr_t first_deferred_ref_;
+  intptr_t last_ref_;
   GrowableArray<CodePtr> objects_;
   GrowableArray<CodePtr> deferred_objects_;
   Array& array_;
@@ -2119,6 +2253,7 @@
       ReadAllocOneCode(d, old_space);
     }
     stop_index_ = d->next_index();
+    d->set_code_stop_index(stop_index_);
     deferred_start_index_ = d->next_index();
     const intptr_t deferred_count = d->ReadUnsigned();
     for (intptr_t i = 0; i < deferred_count; i++) {
@@ -2129,15 +2264,11 @@
 
   void ReadAllocOneCode(Deserializer* d, PageSpace* old_space) {
     const int32_t state_bits = d->Read<int32_t>();
-    if (Code::DiscardedBit::decode(state_bits)) {
-      ASSERT(StubCode::HasBeenInitialized());
-      d->AssignRef(StubCode::UnknownDartCode().ptr());
-    } else {
-      auto code = static_cast<CodePtr>(
-          old_space->AllocateSnapshot(Code::InstanceSize(0)));
-      d->AssignRef(code);
-      code->untag()->state_bits_ = state_bits;
-    }
+    ASSERT(!Code::DiscardedBit::decode(state_bits));
+    auto code = static_cast<CodePtr>(
+        old_space->AllocateSnapshot(Code::InstanceSize(0)));
+    d->AssignRef(code);
+    code->untag()->state_bits_ = state_bits;
   }
 
   void ReadFill(Deserializer* d, bool primary) {
@@ -2153,21 +2284,16 @@
   void ReadFill(Deserializer* d, intptr_t id, bool deferred) {
     auto const code = static_cast<CodePtr>(d->Ref(id));
 
-#if defined(DART_PRECOMPILED_RUNTIME)
-    if (Code::IsUnknownDartCode(code)) {
-      d->ReadInstructions(code, deferred, /*discarded=*/true);
-      return;
-    }
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
+    ASSERT(!Code::IsUnknownDartCode(code));
 
     Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0));
     ASSERT(!Code::IsDiscarded(code));
 
-    d->ReadInstructions(code, deferred, /*discarded=*/false);
+    d->ReadInstructions(code, deferred);
 
     // There would be a single global pool if this is a full AOT snapshot
     // with bare instructions.
-    if (!(d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
+    if (d->kind() != Snapshot::kFullAOT) {
       code->untag()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
     } else {
       code->untag()->object_pool_ = ObjectPool::null();
@@ -2178,8 +2304,12 @@
     code->untag()->pc_descriptors_ =
         static_cast<PcDescriptorsPtr>(d->ReadRef());
     code->untag()->catch_entry_ = d->ReadRef();
-    code->untag()->compressed_stackmaps_ =
-        static_cast<CompressedStackMapsPtr>(d->ReadRef());
+    if (d->kind() == Snapshot::kFullJIT) {
+      code->untag()->compressed_stackmaps_ =
+          static_cast<CompressedStackMapsPtr>(d->ReadRef());
+    } else if (d->kind() == Snapshot::kFullAOT) {
+      code->untag()->compressed_stackmaps_ = CompressedStackMaps::null();
+    }
     code->untag()->inlined_id_to_function_ =
         static_cast<ArrayPtr>(d->ReadRef());
     code->untag()->code_source_map_ =
@@ -2252,9 +2382,7 @@
     ObjectPoolPtr pool = ObjectPool::RawCast(object);
     objects_.Add(pool);
 
-    if (s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions) {
-      // Treat pool as weak.
-    } else {
+    if (s->kind() != Snapshot::kFullAOT) {
       const intptr_t length = pool->untag()->length_;
       uint8_t* entry_bits = pool->untag()->entry_bits();
       for (intptr_t i = 0; i < length; i++) {
@@ -2280,7 +2408,7 @@
   }
 
   void WriteFill(Serializer* s) {
-    bool weak = s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions;
+    bool weak = s->kind() == Snapshot::kFullAOT;
 
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
@@ -2387,12 +2515,10 @@
                                ObjectPool::Patchability::kPatchable);
     uword switchable_call_miss_entry_point = 0;
     uword megamorphic_call_entry_point = 0;
-    if (FLAG_use_bare_instructions) {
-      switchable_call_miss_entry_point =
-          StubCode::SwitchableCallMiss().MonomorphicEntryPoint();
-      megamorphic_call_entry_point =
-          StubCode::MegamorphicCall().MonomorphicEntryPoint();
-    }
+    switchable_call_miss_entry_point =
+        StubCode::SwitchableCallMiss().MonomorphicEntryPoint();
+    megamorphic_call_entry_point =
+        StubCode::MegamorphicCall().MonomorphicEntryPoint();
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
@@ -2420,13 +2546,11 @@
           }
 #if defined(DART_PRECOMPILED_RUNTIME)
           case ObjectPool::EntryType::kSwitchableCallMissEntryPoint:
-            ASSERT(FLAG_use_bare_instructions);
             pool->untag()->entry_bits()[j] = immediate_bits;
             entry.raw_value_ =
                 static_cast<intptr_t>(switchable_call_miss_entry_point);
             break;
           case ObjectPool::EntryType::kMegamorphicCallEntryPoint:
-            ASSERT(FLAG_use_bare_instructions);
             pool->untag()->entry_bits()[j] = immediate_bits;
             entry.raw_value_ =
                 static_cast<intptr_t>(megamorphic_call_entry_point);
@@ -2696,7 +2820,7 @@
       s->AssignRef(map);
       AutoTraceObject(map);
       const intptr_t length = UntaggedCompressedStackMaps::SizeField::decode(
-          map->untag()->flags_and_size_);
+          map->untag()->payload()->flags_and_size);
       s->WriteUnsigned(length);
       target_memory_size_ +=
           compiler::target::CompressedStackMaps::InstanceSize(length);
@@ -2708,10 +2832,11 @@
     for (intptr_t i = 0; i < count; i++) {
       CompressedStackMapsPtr map = objects_[i];
       AutoTraceObject(map);
-      s->WriteUnsigned(map->untag()->flags_and_size_);
+      s->WriteUnsigned(map->untag()->payload()->flags_and_size);
       const intptr_t length = UntaggedCompressedStackMaps::SizeField::decode(
-          map->untag()->flags_and_size_);
-      uint8_t* cdata = reinterpret_cast<uint8_t*>(map->untag()->data());
+          map->untag()->payload()->flags_and_size);
+      uint8_t* cdata =
+          reinterpret_cast<uint8_t*>(map->untag()->payload()->data());
       s->WriteBytes(cdata, length);
     }
   }
@@ -2749,8 +2874,9 @@
           static_cast<CompressedStackMapsPtr>(d->Ref(id));
       Deserializer::InitializeHeader(map, kCompressedStackMapsCid,
                                      CompressedStackMaps::InstanceSize(length));
-      map->untag()->flags_and_size_ = flags_and_size;
-      uint8_t* cdata = reinterpret_cast<uint8_t*>(map->untag()->data());
+      map->untag()->payload()->flags_and_size = flags_and_size;
+      uint8_t* cdata =
+          reinterpret_cast<uint8_t*>(map->untag()->payload()->data());
       d->ReadBytes(cdata, length);
     }
   }
@@ -4377,7 +4503,7 @@
   void PostLoad(Deserializer* d, const Array& refs, bool primary) {
     // We only cache the entry point in bare instructions mode (as we need
     // to load the function anyway otherwise).
-    if (d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions) {
+    if (d->kind() == Snapshot::kFullAOT) {
       auto& closure = Closure::Handle(d->zone());
       auto& func = Function::Handle(d->zone());
       for (intptr_t i = start_index_; i < stop_index_; i++) {
@@ -5686,43 +5812,50 @@
 
 class ProgramSerializationRoots : public SerializationRoots {
  public:
+#define RESET_ROOT_LIST(V)                                                     \
+  V(symbol_table, Array, HashTables::New<CanonicalStringSet>(4))               \
+  V(canonical_types, Array, HashTables::New<CanonicalTypeSet>(4))              \
+  V(canonical_function_types, Array,                                           \
+    HashTables::New<CanonicalFunctionTypeSet>(4))                              \
+  V(canonical_type_arguments, Array,                                           \
+    HashTables::New<CanonicalTypeArgumentsSet>(4))                             \
+  V(canonical_type_parameters, Array,                                          \
+    HashTables::New<CanonicalTypeParameterSet>(4))                             \
+  ONLY_IN_PRODUCT(ONLY_IN_AOT(                                                 \
+      V(closure_functions, GrowableObjectArray, GrowableObjectArray::null()))) \
+  ONLY_IN_AOT(V(canonicalized_stack_map_entries, CompressedStackMaps,          \
+                CompressedStackMaps::null()))
+
   ProgramSerializationRoots(ZoneGrowableArray<Object*>* base_objects,
                             ObjectStore* object_store,
                             Snapshot::Kind snapshot_kind)
       : base_objects_(base_objects),
         object_store_(object_store),
-        dispatch_table_entries_(Array::Handle()),
-        saved_symbol_table_(Array::Handle()),
-        saved_canonical_types_(Array::Handle()),
-        saved_canonical_function_types_(Array::Handle()),
-        saved_canonical_type_arguments_(Array::Handle()),
-        saved_canonical_type_parameters_(Array::Handle()) {
-    saved_symbol_table_ = object_store->symbol_table();
-    object_store->set_symbol_table(
-        Array::Handle(HashTables::New<CanonicalStringSet>(4)));
-    saved_canonical_types_ = object_store->canonical_types();
-    object_store->set_canonical_types(
-        Array::Handle(HashTables::New<CanonicalTypeSet>(4)));
-    saved_canonical_function_types_ = object_store->canonical_function_types();
-    object_store->set_canonical_function_types(
-        Array::Handle(HashTables::New<CanonicalFunctionTypeSet>(4)));
-    saved_canonical_type_arguments_ = object_store->canonical_type_arguments();
-    object_store->set_canonical_type_arguments(
-        Array::Handle(HashTables::New<CanonicalTypeArgumentsSet>(4)));
-    saved_canonical_type_parameters_ =
-        object_store->canonical_type_parameters();
-    object_store->set_canonical_type_parameters(
-        Array::Handle(HashTables::New<CanonicalTypeParameterSet>(4)));
+        snapshot_kind_(snapshot_kind) {
+#define ONLY_IN_AOT(code)                                                      \
+  if (snapshot_kind_ == Snapshot::kFullAOT) {                                  \
+    code                                                                       \
+  }
+#define SAVE_AND_RESET_ROOT(name, Type, init)                                  \
+  do {                                                                         \
+    saved_##name##_ = object_store->name();                                    \
+    object_store->set_##name(Type::Handle(init));                              \
+  } while (0);
+
+    RESET_ROOT_LIST(SAVE_AND_RESET_ROOT)
+#undef SAVE_AND_RESET_ROOT
+#undef ONLY_IN_AOT
   }
   ~ProgramSerializationRoots() {
-    object_store_->set_symbol_table(saved_symbol_table_);
-    object_store_->set_canonical_types(saved_canonical_types_);
-    object_store_->set_canonical_function_types(
-        saved_canonical_function_types_);
-    object_store_->set_canonical_type_arguments(
-        saved_canonical_type_arguments_);
-    object_store_->set_canonical_type_parameters(
-        saved_canonical_type_parameters_);
+#define ONLY_IN_AOT(code)                                                      \
+  if (snapshot_kind_ == Snapshot::kFullAOT) {                                  \
+    code                                                                       \
+  }
+#define RESTORE_ROOT(name, Type, init)                                         \
+  object_store_->set_##name(saved_##name##_);
+    RESET_ROOT_LIST(RESTORE_ROOT)
+#undef RESTORE_ROOT
+#undef ONLY_IN_AOT
   }
 
   void AddBaseObjects(Serializer* s) {
@@ -5775,15 +5908,21 @@
     s->WriteDispatchTable(dispatch_table_entries_);
   }
 
+  virtual const CompressedStackMaps& canonicalized_stack_map_entries() const {
+    return saved_canonicalized_stack_map_entries_;
+  }
+
  private:
-  ZoneGrowableArray<Object*>* base_objects_;
-  ObjectStore* object_store_;
-  Array& dispatch_table_entries_;
-  Array& saved_symbol_table_;
-  Array& saved_canonical_types_;
-  Array& saved_canonical_function_types_;
-  Array& saved_canonical_type_arguments_;
-  Array& saved_canonical_type_parameters_;
+  ZoneGrowableArray<Object*>* const base_objects_;
+  ObjectStore* const object_store_;
+  const Snapshot::Kind snapshot_kind_;
+  Array& dispatch_table_entries_ = Array::Handle();
+
+#define ONLY_IN_AOT(code) code
+#define DECLARE_FIELD(name, Type, init) Type& saved_##name##_ = Type::Handle();
+  RESET_ROOT_LIST(DECLARE_FIELD)
+#undef DECLARE_FIELD
+#undef ONLY_IN_AOT
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -5851,27 +5990,20 @@
   }
 
   void PushRoots(Serializer* s) {
-    intptr_t num_deferred_objects = unit_->deferred_objects()->length();
-    for (intptr_t i = 0; i < num_deferred_objects; i++) {
-      const Object* deferred_object = (*unit_->deferred_objects())[i];
+    for (auto deferred_object : *unit_->deferred_objects()) {
       ASSERT(deferred_object->IsCode());
       CodePtr code = static_cast<CodePtr>(deferred_object->ptr());
-      if (FLAG_use_bare_instructions) {
-        ObjectPoolPtr pool = code->untag()->object_pool_;
-        if (pool != ObjectPool::null()) {
-          const intptr_t length = pool->untag()->length_;
-          uint8_t* entry_bits = pool->untag()->entry_bits();
-          for (intptr_t i = 0; i < length; i++) {
-            auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-            if (entry_type == ObjectPool::EntryType::kTaggedObject) {
-              s->Push(pool->untag()->data()[i].raw_obj_);
-            }
+      ObjectPoolPtr pool = code->untag()->object_pool_;
+      if (pool != ObjectPool::null()) {
+        const intptr_t length = pool->untag()->length_;
+        uint8_t* entry_bits = pool->untag()->entry_bits();
+        for (intptr_t i = 0; i < length; i++) {
+          auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
+          if (entry_type == ObjectPool::EntryType::kTaggedObject) {
+            s->Push(pool->untag()->data()[i].raw_obj_);
           }
         }
-      } else {
-        s->Push(code->untag()->object_pool_);
       }
-      s->Push(code->untag()->compressed_stackmaps_);
       s->Push(code->untag()->code_source_map_);
     }
   }
@@ -5894,33 +6026,27 @@
       ASSERT(!Code::IsDiscarded(code));
       s->WriteInstructions(code->untag()->instructions_,
                            code->untag()->unchecked_offset_, code, false);
-      if (!FLAG_use_bare_instructions) {
-        s->WriteRootRef(code->untag()->object_pool_, "deferred-code");
-      }
-      s->WriteRootRef(code->untag()->compressed_stackmaps_, "deferred-code");
       s->WriteRootRef(code->untag()->code_source_map_, "deferred-code");
     }
 
-    if (FLAG_use_bare_instructions) {
-      ObjectPoolPtr pool =
-          s->isolate_group()->object_store()->global_object_pool();
-      const intptr_t length = pool->untag()->length_;
-      uint8_t* entry_bits = pool->untag()->entry_bits();
-      intptr_t last_write = 0;
-      for (intptr_t i = 0; i < length; i++) {
-        auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-        if (entry_type == ObjectPool::EntryType::kTaggedObject) {
-          if (s->IsWritten(pool->untag()->data()[i].raw_obj_)) {
-            intptr_t skip = i - last_write;
-            s->WriteUnsigned(skip);
-            s->WriteRootRef(pool->untag()->data()[i].raw_obj_,
-                            "deferred-literal");
-            last_write = i;
-          }
+    ObjectPoolPtr pool =
+        s->isolate_group()->object_store()->global_object_pool();
+    const intptr_t length = pool->untag()->length_;
+    uint8_t* entry_bits = pool->untag()->entry_bits();
+    intptr_t last_write = 0;
+    for (intptr_t i = 0; i < length; i++) {
+      auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
+      if (entry_type == ObjectPool::EntryType::kTaggedObject) {
+        if (s->IsWritten(pool->untag()->data()[i].raw_obj_)) {
+          intptr_t skip = i - last_write;
+          s->WriteUnsigned(skip);
+          s->WriteRootRef(pool->untag()->data()[i].raw_obj_,
+                          "deferred-literal");
+          last_write = i;
         }
       }
-      s->WriteUnsigned(length - last_write);
     }
+    s->WriteUnsigned(length - last_write);
 #endif
   }
 
@@ -5948,7 +6074,7 @@
     for (intptr_t id = deferred_start_index_; id < deferred_stop_index_; id++) {
       CodePtr code = static_cast<CodePtr>(d->Ref(id));
       ASSERT(!Code::IsUnknownDartCode(code));
-      d->ReadInstructions(code, /*deferred=*/false, /*discarded=*/false);
+      d->ReadInstructions(code, /*deferred=*/false);
       if (code->untag()->owner_->IsHeapObject() &&
           code->untag()->owner_->IsFunction()) {
         FunctionPtr func = static_cast<FunctionPtr>(code->untag()->owner_);
@@ -5959,8 +6085,7 @@
         ASSERT(unchecked_entry_point != 0);
         func->untag()->unchecked_entry_point_ = unchecked_entry_point;
 #if defined(DART_PRECOMPILED_RUNTIME)
-        if (FLAG_use_bare_instructions &&
-            func->untag()->data()->IsHeapObject() &&
+        if (func->untag()->data()->IsHeapObject() &&
             func->untag()->data()->IsClosureData()) {
           // For closure functions in bare instructions mode, also update the
           // cache inside the static implicit closure object, if any.
@@ -5973,27 +6098,20 @@
         }
 #endif
       }
-      if (!FLAG_use_bare_instructions) {
-        code->untag()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
-      }
-      code->untag()->compressed_stackmaps_ =
-          static_cast<CompressedStackMapsPtr>(d->ReadRef());
       code->untag()->code_source_map_ =
           static_cast<CodeSourceMapPtr>(d->ReadRef());
     }
 
-    if (FLAG_use_bare_instructions) {
-      ObjectPoolPtr pool =
-          d->isolate_group()->object_store()->global_object_pool();
-      const intptr_t length = pool->untag()->length_;
-      uint8_t* entry_bits = pool->untag()->entry_bits();
-      for (intptr_t i = d->ReadUnsigned(); i < length; i += d->ReadUnsigned()) {
-        auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
-        ASSERT(entry_type == ObjectPool::EntryType::kTaggedObject);
-        // The existing entry will usually be null, but it might also be an
-        // equivalent object that was duplicated in another loading unit.
-        pool->untag()->data()[i].raw_obj_ = d->ReadRef();
-      }
+    ObjectPoolPtr pool =
+        d->isolate_group()->object_store()->global_object_pool();
+    const intptr_t length = pool->untag()->length_;
+    uint8_t* entry_bits = pool->untag()->entry_bits();
+    for (intptr_t i = d->ReadUnsigned(); i < length; i += d->ReadUnsigned()) {
+      auto entry_type = ObjectPool::TypeBits::decode(entry_bits[i]);
+      ASSERT(entry_type == ObjectPool::EntryType::kTaggedObject);
+      // The existing entry will usually be null, but it might also be an
+      // equivalent object that was duplicated in another loading unit.
+      pool->untag()->data()[i].raw_obj_ = d->ReadRef();
     }
 
     // Reinitialize the dispatch table by rereading the table's serialization
@@ -6002,8 +6120,12 @@
     if (isolate_group->dispatch_table_snapshot() != nullptr) {
       ReadStream stream(isolate_group->dispatch_table_snapshot(),
                         isolate_group->dispatch_table_snapshot_size());
-      d->ReadDispatchTable(&stream, /*deferred=*/true, deferred_start_index_,
-                           deferred_stop_index_);
+      const GrowableObjectArray& tables = GrowableObjectArray::Handle(
+          isolate_group->object_store()->instructions_tables());
+      InstructionsTable& root_table = InstructionsTable::Handle();
+      root_table ^= tables.At(0);
+      d->ReadDispatchTable(&stream, /*deferred=*/true, root_table,
+                           deferred_start_index_, deferred_stop_index_);
     }
   }
 
@@ -6042,7 +6164,6 @@
       num_base_objects_(0),
       num_written_objects_(0),
       next_ref_index_(kFirstReference),
-      previous_text_offset_(0),
       initial_field_table_(thread->isolate_group()->initial_field_table()),
       vm_(vm),
       profile_writer_(profile_writer)
@@ -6079,7 +6200,13 @@
 void Serializer::AddBaseObject(ObjectPtr base_object,
                                const char* type,
                                const char* name) {
-  AssignRef(base_object);
+  // Don't assign references to the discarded code.
+  const bool is_discarded_code = base_object->IsHeapObject() &&
+                                 base_object->IsCode() &&
+                                 Code::IsDiscarded(Code::RawCast(base_object));
+  if (!is_discarded_code) {
+    AssignRef(base_object);
+  }
   num_base_objects_++;
 
   if ((profile_writer_ != nullptr) && (type != nullptr)) {
@@ -6568,6 +6695,10 @@
     case kStringCid:
       return new (Z) StringSerializationCluster(
           is_canonical, cluster_represents_canonical_set && !vm_);
+#define CASE_FFI_CID(name) case kFfi##name##Cid:
+      CLASS_LIST_FFI_TYPE_MARKER(CASE_FFI_CID)
+#undef CASE_FFI_CID
+      return new (Z) InstanceSerializationCluster(is_canonical, cid);
     case kWeakSerializationReferenceCid:
 #if defined(DART_PRECOMPILER)
       ASSERT(kind_ == Snapshot::kFullAOT);
@@ -6603,8 +6734,100 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-intptr_t Serializer::PrepareInstructions() {
-  if (!Snapshot::IncludesCode(kind())) return 0;
+#if defined(DART_PRECOMPILER)
+// We use the following encoding schemes when encoding references to Code
+// objects.
+//
+// In AOT mode:
+//
+// 0        --  LazyCompile stub
+// 1        -+
+//           |  for non-root-unit/non-VM snapshots
+// ...        > reference into parent snapshot objects
+//           |  (base is num_base_objects_ in this case, 0 otherwise).
+// base     -+
+// base + 1 -+
+//           |  for non-deferred Code objects (those with instructions)
+//            > index in into the instructions table (code_index_).
+//           |  (L is code_index_.Length()).
+// base + L -+
+// ...      -+
+//           |  for deferred Code objects (those without instructions)
+//            > index of this Code object in the deferred part of the
+//           |  Code cluster.
+//
+// Note that this encoding has the following property: non-discarded
+// non-deferred Code objects form the tail of the instruction table
+// which makes indices assigned to non-discarded non-deferred Code objects
+// and deferred Code objects continuous. This means when decoding
+// code_index - (base + 1) - first_entry_with_code yields an index of the
+// Code object in the Code cluster both for non-deferred and deferred
+// Code objects.
+//
+// For JIT snapshots we do:
+//
+// 0        --  LazyCompile stub
+// 1        -+
+//           |
+// ...        > index of the Code object in the Code cluster.
+//           |
+//
+intptr_t Serializer::GetCodeIndex(CodePtr code) {
+  // In the precompiled mode Code object is uniquely identified by its
+  // instructions (because ProgramVisitor::DedupInstructions will dedup Code
+  // objects with the same instructions).
+  if (code == StubCode::LazyCompile().ptr() && !vm_) {
+    return 0;
+  } else if (FLAG_precompiled_mode) {
+    const intptr_t ref = heap_->GetObjectId(code);
+    ASSERT(!IsReachableReference(ref) == Code::IsDiscarded(code));
+
+    const intptr_t base =
+        (vm_ || current_loading_unit_id() == LoadingUnit::kRootId)
+            ? 0
+            : num_base_objects_;
+
+    // Check if we are referring to the Code object which originates from the
+    // parent loading unit. In this case we write out the reference of this
+    // object.
+    if (!Code::IsDiscarded(code) && ref < base) {
+      RELEASE_ASSERT(current_loading_unit_id() != LoadingUnit::kRootId);
+      return 1 + ref;
+    }
+
+    // Otherwise the code object must either be discarded or originate from
+    // the Code cluster.
+    ASSERT(Code::IsDiscarded(code) || (code_cluster_->first_ref() <= ref &&
+                                       ref <= code_cluster_->last_ref()));
+
+    // If Code object is non-deferred then simply write out the index of the
+    // entry point, otherwise write out the index of the deferred code object.
+    if (ref < code_cluster_->first_deferred_ref()) {
+      const intptr_t key = static_cast<intptr_t>(code->untag()->instructions_);
+      ASSERT(code_index_.HasKey(key));
+      const intptr_t result = code_index_.Lookup(key);
+      ASSERT(0 < result && result <= code_index_.Length());
+      // Note: result already has + 1.
+      return base + result;
+    } else {
+      // Note: only root snapshot can have deferred Code objects in the
+      // cluster.
+      const intptr_t cluster_index = ref - code_cluster_->first_deferred_ref();
+      return 1 + base + code_index_.Length() + cluster_index;
+    }
+  } else {
+    const intptr_t ref = heap_->GetObjectId(code);
+    ASSERT(IsAllocatedReference(ref));
+    ASSERT(code_cluster_->first_ref() <= ref &&
+           ref <= code_cluster_->last_ref());
+    return 1 + (ref - code_cluster_->first_ref());
+  }
+}
+#endif  // defined(DART_PRECOMPILER)
+
+void Serializer::PrepareInstructions(
+    const CompressedStackMaps& canonical_stack_map_entries) {
+  if (!Snapshot::IncludesCode(kind())) return;
 
   // Code objects that have identical/duplicate instructions must be adjacent in
   // the order that Code objects are written because the encoding of the
@@ -6613,14 +6836,14 @@
   // that allows for mapping return addresses back to Code objects depends on
   // this sorting.
   if (code_cluster_ != nullptr) {
-    CodeSerializationCluster::Sort(code_cluster_->objects());
+    CodeSerializationCluster::Sort(this, code_cluster_->objects());
   }
   if ((loading_units_ != nullptr) &&
       (current_loading_unit_id_ == LoadingUnit::kRootId)) {
     for (intptr_t i = LoadingUnit::kRootId + 1; i < loading_units_->length();
          i++) {
       auto unit_objects = loading_units_->At(i)->deferred_objects();
-      CodeSerializationCluster::Sort(unit_objects);
+      CodeSerializationCluster::Sort(this, unit_objects);
       ASSERT(unit_objects->length() == 0 || code_cluster_ != nullptr);
       for (intptr_t j = 0; j < unit_objects->length(); j++) {
         code_cluster_->deferred_objects()->Add(unit_objects->At(j)->ptr());
@@ -6629,7 +6852,7 @@
   }
 
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
-  if ((kind() == Snapshot::kFullAOT) && FLAG_use_bare_instructions) {
+  if (kind() == Snapshot::kFullAOT) {
     // Group the code objects whose instructions are not being deferred in this
     // snapshot unit in the order they will be written: first the code objects
     // encountered for this first time in this unit being written by the
@@ -6654,10 +6877,165 @@
     GrowableArray<ImageWriterCommand> writer_commands;
     RelocateCodeObjects(vm_, &code_objects, &writer_commands);
     image_writer_->PrepareForSerialization(&writer_commands);
-    return code_objects.length();
+
+    if (code_objects.length() == 0) {
+      return;
+    }
+
+    // Build UntaggedInstructionsTable::Data object to be added to the
+    // read-only data section of the snapshot. It contains:
+    //
+    //    - a binary search table mapping an Instructions entry point to its
+    //      stack maps (by offset from the beginning of the Data object);
+    //    - followed by stack maps bytes;
+    //    - followed by canonical stack map entries.
+    //
+    struct StackMapInfo : public ZoneAllocated {
+      CompressedStackMapsPtr map;
+      intptr_t use_count;
+      uint32_t offset;
+    };
+
+    GrowableArray<StackMapInfo*> stack_maps;
+    IntMap<StackMapInfo*> stack_maps_info;
+
+    // Build code_index_ (which maps Instructions object to the order in
+    // which they appear in the code section in the end) and collect all
+    // stack maps.
+    // We also find the first Instructions object which is going to have
+    // Code object associated with it. This will allow to reduce the binary
+    // search space when searching specifically for the code object in runtime.
+    uint32_t total = 0;
+    intptr_t not_discarded_count = 0;
+    uint32_t first_entry_with_code = 0;
+    for (auto& cmd : writer_commands) {
+      if (cmd.op == ImageWriterCommand::InsertInstructionOfCode) {
+        RELEASE_ASSERT(code_objects[total] ==
+                       cmd.insert_instruction_of_code.code);
+        ASSERT(!Code::IsDiscarded(cmd.insert_instruction_of_code.code) ||
+               (not_discarded_count == 0));
+        if (!Code::IsDiscarded(cmd.insert_instruction_of_code.code)) {
+          if (not_discarded_count == 0) {
+            first_entry_with_code = total;
+          }
+          not_discarded_count++;
+        }
+        total++;
+
+        // Update code_index_.
+        {
+          const intptr_t instr = static_cast<intptr_t>(
+              cmd.insert_instruction_of_code.code->untag()->instructions_);
+          ASSERT(!code_index_.HasKey(instr));
+          code_index_.Insert(instr, total);
+        }
+
+        // Collect stack maps.
+        CompressedStackMapsPtr stack_map =
+            cmd.insert_instruction_of_code.code->untag()->compressed_stackmaps_;
+        const intptr_t key = static_cast<intptr_t>(stack_map);
+
+        if (stack_maps_info.HasKey(key)) {
+          stack_maps_info.Lookup(key)->use_count++;
+        } else {
+          auto info = new StackMapInfo();
+          info->map = stack_map;
+          info->use_count = 1;
+          stack_maps.Add(info);
+          stack_maps_info.Insert(key, info);
+        }
+      }
+    }
+    ASSERT(static_cast<intptr_t>(total) == code_index_.Length());
+    instructions_table_len_ = not_discarded_count;
+
+    // Sort stack maps by usage so that most commonly used stack maps are
+    // together at the start of the Data object.
+    stack_maps.Sort([](StackMapInfo* const* a, StackMapInfo* const* b) {
+      if ((*a)->use_count < (*b)->use_count) return 1;
+      if ((*a)->use_count > (*b)->use_count) return -1;
+      return 0;
+    });
+
+    // Build Data object.
+    MallocWriteStream pc_mapping(4 * KB);
+
+    // Write the header out.
+    {
+      UntaggedInstructionsTable::Data header;
+      memset(&header, 0, sizeof(header));
+      header.length = total;
+      header.first_entry_with_code = first_entry_with_code;
+      pc_mapping.WriteFixed<UntaggedInstructionsTable::Data>(header);
+    }
+
+    // Reserve space for the binary search table.
+    for (auto& cmd : writer_commands) {
+      if (cmd.op == ImageWriterCommand::InsertInstructionOfCode) {
+        pc_mapping.WriteFixed<UntaggedInstructionsTable::DataEntry>({0, 0});
+      }
+    }
+
+    // Now write collected stack maps after the binary search table.
+    auto write_stack_map = [&](CompressedStackMapsPtr smap) {
+      const auto flags_and_size = smap->untag()->payload()->flags_and_size;
+      const auto payload_size =
+          UntaggedCompressedStackMaps::SizeField::decode(flags_and_size);
+      pc_mapping.WriteFixed<uint32_t>(flags_and_size);
+      pc_mapping.WriteBytes(smap->untag()->payload()->data(), payload_size);
+    };
+
+    for (auto sm : stack_maps) {
+      sm->offset = pc_mapping.bytes_written();
+      write_stack_map(sm->map);
+    }
+
+    // Write canonical entries (if any).
+    if (!canonical_stack_map_entries.IsNull()) {
+      auto header = reinterpret_cast<UntaggedInstructionsTable::Data*>(
+          pc_mapping.buffer());
+      header->canonical_stack_map_entries_offset = pc_mapping.bytes_written();
+      write_stack_map(canonical_stack_map_entries.ptr());
+    }
+    const auto total_bytes = pc_mapping.bytes_written();
+
+    // Now that we have offsets to all stack maps we can write binary
+    // search table.
+    pc_mapping.SetPosition(
+        sizeof(UntaggedInstructionsTable::Data));  // Skip the header.
+    for (auto& cmd : writer_commands) {
+      if (cmd.op == ImageWriterCommand::InsertInstructionOfCode) {
+        CompressedStackMapsPtr smap =
+            cmd.insert_instruction_of_code.code->untag()->compressed_stackmaps_;
+        const auto offset =
+            stack_maps_info.Lookup(static_cast<intptr_t>(smap))->offset;
+        const auto entry = image_writer_->GetTextOffsetFor(
+            Code::InstructionsOf(cmd.insert_instruction_of_code.code),
+            cmd.insert_instruction_of_code.code);
+
+        pc_mapping.WriteFixed<UntaggedInstructionsTable::DataEntry>(
+            {static_cast<uint32_t>(entry), offset});
+      }
+    }
+    // Restore position so that Steal does not truncate the buffer.
+    pc_mapping.SetPosition(total_bytes);
+
+    intptr_t length = 0;
+    uint8_t* bytes = pc_mapping.Steal(&length);
+
+    instructions_table_rodata_offset_ =
+        image_writer_->AddBytesToData(bytes, length);
+    // Attribute all bytes in this object to the root for simplicity.
+    if (profile_writer_ != nullptr) {
+      const auto offset_space = vm_ ? IdSpace::kVmData : IdSpace::kIsolateData;
+      profile_writer_->AttributeReferenceTo(
+          V8SnapshotProfileWriter::kArtificialRootId,
+          V8SnapshotProfileWriter::Reference::Property(
+              "<instructions-table-rodata>"),
+          {offset_space, instructions_table_rodata_offset_});
+    }
   }
 #endif  // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
-  return 0;
 }
 
 void Serializer::WriteInstructions(InstructionsPtr instr,
@@ -6683,25 +7061,16 @@
         {offset_space, offset});
   }
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    ASSERT(offset != 0);
-    RELEASE_ASSERT(offset >= previous_text_offset_);
-    const uint32_t delta = offset - previous_text_offset_;
-    WriteUnsigned(delta);
+  if (Code::IsDiscarded(code)) {
+    // Discarded Code objects are not supported in the vm isolate snapshot.
+    ASSERT(!vm_);
+    return;
+  }
+
+  if (FLAG_precompiled_mode) {
     const uint32_t payload_info =
         (unchecked_offset << 1) | (Code::HasMonomorphicEntry(code) ? 0x1 : 0x0);
     WriteUnsigned(payload_info);
-    previous_text_offset_ = offset;
-
-    if (Code::IsDiscarded(code)) {
-      // Discarded Code objects are not supported in the vm isolate snapshot.
-      ASSERT(!vm_);
-      // Stack maps of discarded Code objects are written along with
-      // instructions so they can be added to instructions table during
-      // deserialization.
-      WritePropertyRef(code->untag()->compressed_stackmaps_,
-                       "compressed_stackmaps_");
-    }
     return;
   }
 #endif
@@ -6732,11 +7101,11 @@
   }
   return image_writer_->data_size();
 }
-#endif
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 void Serializer::Push(ObjectPtr object) {
-  if (object->IsHeapObject() && object->IsCode() &&
-      !Snapshot::IncludesCode(kind_)) {
+  const bool is_code = object->IsHeapObject() && object->IsCode();
+  if (is_code && !Snapshot::IncludesCode(kind_)) {
     return;  // Do not trace, will write null.
   }
 
@@ -6754,7 +7123,9 @@
     heap_->SetObjectId(object, kUnallocatedReference);
     ASSERT(IsReachableReference(heap_->GetObjectId(object)));
     stack_.Add(object);
-    num_written_objects_++;
+    if (!(is_code && Code::IsDiscarded(Code::RawCast(object)))) {
+      num_written_objects_++;
+    }
 #if defined(SNAPSHOT_BACKTRACE)
     parent_pairs_.Add(&Object::Handle(zone_, object));
     parent_pairs_.Add(&Object::Handle(zone_, current_parent_));
@@ -6866,6 +7237,11 @@
 #define CID_CLUSTER(Type)                                                      \
   reinterpret_cast<Type##SerializationCluster*>(clusters_by_cid_[k##Type##Cid])
 
+const CompressedStackMaps& SerializationRoots::canonicalized_stack_map_entries()
+    const {
+  return CompressedStackMaps::Handle();
+}
+
 ZoneGrowableArray<Object*>* Serializer::Serialize(SerializationRoots* roots) {
   // While object_currently_writing_ is initialized to the artificial root, we
   // set up a scope to ensure proper flushing to the profile.
@@ -6981,7 +7357,7 @@
     cid_clusters[cid] = cluster;
   }
 
-  instructions_table_len_ = PrepareInstructions();
+  PrepareInstructions(roots->canonicalized_stack_map_entries());
 
   intptr_t num_objects = num_base_objects_ + num_written_objects_;
 #if defined(ARCH_IS_64_BIT)
@@ -6999,9 +7375,9 @@
   } else {
     WriteUnsigned(0);
   }
-  ASSERT((instructions_table_len_ == 0) ||
-         (FLAG_precompiled_mode && FLAG_use_bare_instructions));
+  ASSERT((instructions_table_len_ == 0) || FLAG_precompiled_mode);
   WriteUnsigned(instructions_table_len_);
+  WriteUnsigned(instructions_table_rodata_offset_);
 
   for (SerializationCluster* cluster : clusters) {
     cluster->WriteAndMeasureAlloc(this);
@@ -7045,6 +7421,7 @@
   PrintSnapshotSizes();
 
   heap()->ResetObjectIdTable();
+
   return objects_;
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -7107,12 +7484,6 @@
   }
 
   ASSERT(code_cluster_ != nullptr);
-  // Reference IDs in a cluster are allocated sequentially, so we can use the
-  // first code object's reference ID to calculate the cluster index.
-  const intptr_t first_code_id = RefId(code_cluster_->objects()->At(0));
-  // The first object in the code cluster must have its reference ID allocated.
-  ASSERT(IsAllocatedReference(first_code_id));
-
   // If instructions can be deduped, the code order table in the deserializer
   // may not contain all Code objects in the snapshot. Thus, we write the ID
   // for the first code object here so we can retrieve it during deserialization
@@ -7127,8 +7498,7 @@
   // We could also map Code objects to the first Code object in the cluster with
   // the same entry point and serialize that ID instead, but that loses
   // information about which Code object was originally referenced.
-  ASSERT(first_code_id <= compiler::target::kWordMax);
-  WriteUnsigned(first_code_id);
+  WriteUnsigned(code_cluster_->first_ref());
 
   CodePtr previous_code = nullptr;
   CodePtr recent[kDispatchTableRecentCount] = {nullptr};
@@ -7169,11 +7539,9 @@
     }
     // We have a non-repeated, non-recent entry, so encode the reference ID of
     // the code object and emit that.
-    auto const object_id = RefId(code);
-    // Make sure that this code object has an allocated reference ID.
-    ASSERT(IsAllocatedReference(object_id));
+    auto const code_index = GetCodeIndex(code);
     // Use the index in the code cluster, not in the snapshot..
-    auto const encoded = kDispatchTableIndexBase + (object_id - first_code_id);
+    auto const encoded = kDispatchTableIndexBase + code_index;
     ASSERT(encoded <= compiler::target::kWordMax);
     Write(encoded);
     recent[recent_index] = code;
@@ -7240,8 +7608,7 @@
     }
     if (instructions_table_len_ > 0) {
       const intptr_t memory_size =
-          compiler::target::InstructionsTable::InstanceSize(
-              instructions_table_len_) +
+          compiler::target::InstructionsTable::InstanceSize() +
           compiler::target::Array::InstanceSize(instructions_table_len_);
       clusters_by_size.Add(new (zone_) FakeSerializationCluster(
           "InstructionsTable", instructions_table_len_, 0, memory_size));
@@ -7293,7 +7660,6 @@
       image_reader_(nullptr),
       refs_(nullptr),
       next_ref_index_(kFirstReference),
-      previous_text_offset_(0),
       clusters_(nullptr),
       initial_field_table_(thread->isolate_group()->initial_field_table()),
       is_non_root_unit_(is_non_root_unit),
@@ -7488,6 +7854,10 @@
       return new (Z) StringDeserializationCluster(
           is_canonical,
           !is_non_root_unit_ && isolate_group() != Dart::vm_isolate_group());
+#define CASE_FFI_CID(name) case kFfi##name##Cid:
+      CLASS_LIST_FFI_TYPE_MARKER(CASE_FFI_CID)
+#undef CASE_FFI_CID
+      return new (Z) InstanceDeserializationCluster(cid, is_canonical);
     default:
       break;
   }
@@ -7495,25 +7865,25 @@
   return NULL;
 }
 
-void Deserializer::ReadDispatchTable(ReadStream* stream,
-                                     bool deferred,
-                                     intptr_t deferred_code_start_index,
-                                     intptr_t deferred_code_end_index) {
+void Deserializer::ReadDispatchTable(
+    ReadStream* stream,
+    bool deferred,
+    const InstructionsTable& root_instruction_table,
+    intptr_t deferred_code_start_index,
+    intptr_t deferred_code_end_index) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   const uint8_t* table_snapshot_start = stream->AddressOfCurrentPosition();
   const intptr_t length = stream->ReadUnsigned();
   if (length == 0) return;
 
-  // Not all Code objects may be in the code_order_table when instructions can
-  // be deduplicated. Thus, we serialize the reference ID of the first code
-  // object, from which we can get the reference ID for any code object.
   const intptr_t first_code_id = stream->ReadUnsigned();
+  deferred_code_start_index -= first_code_id;
+  deferred_code_end_index -= first_code_id;
 
   auto const IG = isolate_group();
   auto code = IG->object_store()->dispatch_table_null_error_stub();
   ASSERT(code != Code::null());
   uword null_entry = Code::EntryPointOf(code);
-  uword not_loaded_entry = StubCode::NotLoaded().EntryPoint();
 
   DispatchTable* table;
   if (deferred) {
@@ -7544,24 +7914,20 @@
     } else if (encoded <= kDispatchTableMaxRepeat) {
       repeat_count = encoded - 1;
     } else {
-      intptr_t cluster_index = encoded - kDispatchTableIndexBase;
+      const intptr_t code_index = encoded - kDispatchTableIndexBase;
       if (deferred) {
-        intptr_t id = first_code_id + cluster_index;
-        if ((deferred_code_start_index <= id) &&
-            (id < deferred_code_end_index)) {
-          // Deferred instructions are at the end of the instructions table.
-          value = instructions_table().EntryPointAt(
-              instructions_table().length() - deferred_code_end_index + id);
+        const intptr_t code_id =
+            CodeIndexToClusterIndex(root_instruction_table, code_index);
+        if ((deferred_code_start_index <= code_id) &&
+            (code_id < deferred_code_end_index)) {
+          auto code = static_cast<CodePtr>(Ref(first_code_id + code_id));
+          value = Code::EntryPointOf(code);
         } else {
           // Reuse old value from the dispatch table.
           value = array[i];
         }
       } else {
-        if (cluster_index < instructions_table().length()) {
-          value = instructions_table().EntryPointAt(cluster_index);
-        } else {
-          value = not_loaded_entry;
-        }
+        value = GetEntryPointByCodeIndex(code_index);
       }
       recent[recent_index] = value;
       recent_index = (recent_index + 1) & kDispatchTableRecentMask;
@@ -7697,81 +8063,51 @@
   return ApiError::New(msg, Heap::kOld);
 }
 
-void Deserializer::ReadInstructions(CodePtr code,
-                                    bool deferred,
-                                    bool discarded) {
+void Deserializer::ReadInstructions(CodePtr code, bool deferred) {
   if (deferred) {
-    ASSERT(!discarded);
 #if defined(DART_PRECOMPILED_RUNTIME)
-    if (FLAG_use_bare_instructions) {
-      uword entry_point = StubCode::NotLoaded().EntryPoint();
-      code->untag()->entry_point_ = entry_point;
-      code->untag()->unchecked_entry_point_ = entry_point;
-      code->untag()->monomorphic_entry_point_ = entry_point;
-      code->untag()->monomorphic_unchecked_entry_point_ = entry_point;
-      code->untag()->instructions_length_ = 0;
-      return;
-    }
-#endif
-    InstructionsPtr instr = StubCode::NotLoaded().instructions();
-    uint32_t unchecked_offset = 0;
-    code->untag()->instructions_ = instr;
-#if defined(DART_PRECOMPILED_RUNTIME)
-    code->untag()->instructions_length_ = Instructions::Size(instr);
+    uword entry_point = StubCode::NotLoaded().EntryPoint();
+    code->untag()->entry_point_ = entry_point;
+    code->untag()->unchecked_entry_point_ = entry_point;
+    code->untag()->monomorphic_entry_point_ = entry_point;
+    code->untag()->monomorphic_unchecked_entry_point_ = entry_point;
+    code->untag()->instructions_length_ = 0;
+    return;
 #else
-    code->untag()->unchecked_offset_ = unchecked_offset;
+    UNREACHABLE();
 #endif
-    Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
-    return;
   }
 
 #if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_use_bare_instructions) {
-    previous_text_offset_ += ReadUnsigned();
-    const uword payload_start =
-        image_reader_->GetBareInstructionsAt(previous_text_offset_);
-    const uint32_t payload_info = ReadUnsigned();
-    const uint32_t unchecked_offset = payload_info >> 1;
-    const bool has_monomorphic_entrypoint = (payload_info & 0x1) == 0x1;
+  const uword payload_start = instructions_table_.EntryPointAt(
+      instructions_table_.rodata()->first_entry_with_code +
+      instructions_index_);
+  const uint32_t payload_info = ReadUnsigned();
+  const uint32_t unchecked_offset = payload_info >> 1;
+  const bool has_monomorphic_entrypoint = (payload_info & 0x1) == 0x1;
 
-    const uword entry_offset = has_monomorphic_entrypoint
-                                   ? Instructions::kPolymorphicEntryOffsetAOT
-                                   : 0;
-    const uword monomorphic_entry_offset =
-        has_monomorphic_entrypoint ? Instructions::kMonomorphicEntryOffsetAOT
-                                   : 0;
+  const uword entry_offset =
+      has_monomorphic_entrypoint ? Instructions::kPolymorphicEntryOffsetAOT : 0;
+  const uword monomorphic_entry_offset =
+      has_monomorphic_entrypoint ? Instructions::kMonomorphicEntryOffsetAOT : 0;
 
-    const uword entry_point = payload_start + entry_offset;
-    const uword monomorphic_entry_point =
-        payload_start + monomorphic_entry_offset;
+  const uword entry_point = payload_start + entry_offset;
+  const uword monomorphic_entry_point =
+      payload_start + monomorphic_entry_offset;
 
-    ObjectPtr code_descriptor = code;
-    if (discarded) {
-      code_descriptor = static_cast<CompressedStackMapsPtr>(ReadRef());
-    }
+  instructions_table_.SetCodeAt(instructions_index_++, code);
 
-    instructions_table_.SetEntryAt(instructions_index_++, payload_start,
-                                   has_monomorphic_entrypoint, code_descriptor);
-
-    if (!discarded) {
-      // There are no serialized RawInstructions objects in this mode.
-      code->untag()->instructions_ = Instructions::null();
-      code->untag()->entry_point_ = entry_point;
-      code->untag()->unchecked_entry_point_ = entry_point + unchecked_offset;
-      code->untag()->monomorphic_entry_point_ = monomorphic_entry_point;
-      code->untag()->monomorphic_unchecked_entry_point_ =
-          monomorphic_entry_point + unchecked_offset;
-    }
-    return;
-  }
-#endif
-
+  // There are no serialized RawInstructions objects in this mode.
+  code->untag()->instructions_ = Instructions::null();
+  code->untag()->entry_point_ = entry_point;
+  code->untag()->unchecked_entry_point_ = entry_point + unchecked_offset;
+  code->untag()->monomorphic_entry_point_ = monomorphic_entry_point;
+  code->untag()->monomorphic_unchecked_entry_point_ =
+      monomorphic_entry_point + unchecked_offset;
+#else
   InstructionsPtr instr = image_reader_->GetInstructionsAt(Read<uint32_t>());
   uint32_t unchecked_offset = ReadUnsigned();
   code->untag()->instructions_ = instr;
-#if defined(DART_PRECOMPILED_RUNTIME)
-  code->untag()->instructions_length_ = Instructions::Size(instr);
-#else
   code->untag()->unchecked_offset_ = unchecked_offset;
   if (kind() == Snapshot::kFullJIT) {
     const uint32_t active_offset = Read<uint32_t>();
@@ -7779,36 +8115,42 @@
     unchecked_offset = ReadUnsigned();
   }
   code->untag()->active_instructions_ = instr;
-#endif
   Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
 void Deserializer::EndInstructions() {
 #if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_use_bare_instructions) {
-    uword previous_end = image_reader_->GetBareInstructionsEnd();
-    for (intptr_t i = instructions_index_ - 1; i >= 0; --i) {
-      ObjectPtr descriptor = instructions_table_.DescriptorAt(i);
-      uword start = instructions_table_.PayloadStartAt(i);
-      ASSERT(start <= previous_end);
-      if (descriptor->IsCode()) {
-        CodePtr code = static_cast<CodePtr>(descriptor);
-        code->untag()->instructions_length_ = previous_end - start;
-      }
-      previous_end = start;
-    }
+  if (instructions_table_.IsNull()) {
+    ASSERT(instructions_index_ == 0);
+    return;
+  }
 
-    ObjectStore* object_store = IsolateGroup::Current()->object_store();
-    GrowableObjectArray& tables =
-        GrowableObjectArray::Handle(zone_, object_store->instructions_tables());
-    if (tables.IsNull()) {
-      tables = GrowableObjectArray::New(Heap::kOld);
-      object_store->set_instructions_tables(tables);
-    }
-    if ((tables.Length() == 0) ||
-        (tables.At(tables.Length() - 1) != instructions_table_.ptr())) {
-      tables.Add(instructions_table_, Heap::kOld);
-    }
+  const auto& code_objects =
+      Array::Handle(instructions_table_.ptr()->untag()->code_objects());
+  ASSERT(code_objects.Length() == instructions_index_);
+
+  uword previous_end = image_reader_->GetBareInstructionsEnd();
+  for (intptr_t i = instructions_index_ - 1; i >= 0; --i) {
+    CodePtr code = Code::RawCast(code_objects.At(i));
+    uword start = Code::PayloadStartOf(code);
+    ASSERT(start <= previous_end);
+    code->untag()->instructions_length_ = previous_end - start;
+    previous_end = start;
+  }
+
+  ObjectStore* object_store = IsolateGroup::Current()->object_store();
+  GrowableObjectArray& tables =
+      GrowableObjectArray::Handle(zone_, object_store->instructions_tables());
+  if (tables.IsNull()) {
+    tables = GrowableObjectArray::New(Heap::kOld);
+    object_store->set_instructions_tables(tables);
+  }
+  if ((tables.Length() == 0) ||
+      (tables.At(tables.Length() - 1) != instructions_table_.ptr())) {
+    ASSERT((!is_non_root_unit_ && tables.Length() == 0) ||
+           (is_non_root_unit_ && tables.Length() > 0));
+    tables.Add(instructions_table_, Heap::kOld);
   }
 #endif
 }
@@ -7841,6 +8183,8 @@
   num_clusters_ = ReadUnsigned();
   const intptr_t initial_field_table_len = ReadUnsigned();
   const intptr_t instructions_table_len = ReadUnsigned();
+  const uint32_t instruction_table_data_offset = ReadUnsigned();
+  USE(instruction_table_data_offset);
 
   clusters_ = new DeserializationCluster*[num_clusters_];
   refs = Array::New(num_objects_ + kFirstReference, Heap::kOld);
@@ -7851,11 +8195,21 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
   if (instructions_table_len > 0) {
-    ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+    ASSERT(FLAG_precompiled_mode);
     const uword start_pc = image_reader_->GetBareInstructionsAt(0);
     const uword end_pc = image_reader_->GetBareInstructionsEnd();
-    instructions_table_ =
-        InstructionsTable::New(instructions_table_len, start_pc, end_pc);
+    uword instruction_table_data = 0;
+    if (instruction_table_data_offset != 0) {
+      // NoSafepointScope to satisfy assertion in DataStart. InstructionsTable
+      // data resides in RO memory and is immovable and immortal making it
+      // safe to use DataStart result outside of NoSafepointScope.
+      NoSafepointScope no_safepoint;
+      instruction_table_data = reinterpret_cast<uword>(
+          OneByteString::DataStart(String::Handle(static_cast<StringPtr>(
+              image_reader_->GetObjectAt(instruction_table_data_offset)))));
+    }
+    instructions_table_ = InstructionsTable::New(
+        instructions_table_len, start_pc, end_pc, instruction_table_data);
   }
 #else
   ASSERT(instructions_table_len == 0);
diff --git a/runtime/vm/app_snapshot.h b/runtime/vm/app_snapshot.h
index 7bc3032..ce084c0 100644
--- a/runtime/vm/app_snapshot.h
+++ b/runtime/vm/app_snapshot.h
@@ -176,6 +176,8 @@
   virtual void AddBaseObjects(Serializer* serializer) = 0;
   virtual void PushRoots(Serializer* serializer) = 0;
   virtual void WriteRoots(Serializer* serializer) = 0;
+
+  virtual const CompressedStackMaps& canonicalized_stack_map_entries() const;
 };
 
 class DeserializationRoots {
@@ -228,9 +230,12 @@
   void AddBaseObject(ObjectPtr base_object,
                      const char* type = nullptr,
                      const char* name = nullptr);
+
   intptr_t AssignRef(ObjectPtr object);
   intptr_t AssignArtificialRef(ObjectPtr object = nullptr);
 
+  intptr_t GetCodeIndex(CodePtr code);
+
   void Push(ObjectPtr object);
 
   void AddUntracedRef() { num_written_objects_++; }
@@ -418,8 +423,8 @@
   }
 
   // Sorts Code objects and reorders instructions before writing snapshot.
-  // Returns length of instructions table (in bare instructions mode).
-  intptr_t PrepareInstructions();
+  // Builds binary search table for stack maps.
+  void PrepareInstructions(const CompressedStackMaps& canonical_smap);
 
   void WriteInstructions(InstructionsPtr instr,
                          uint32_t unchecked_offset,
@@ -508,12 +513,12 @@
   intptr_t num_base_objects_;
   intptr_t num_written_objects_;
   intptr_t next_ref_index_;
-  intptr_t previous_text_offset_;
   FieldTable* initial_field_table_;
 
   intptr_t dispatch_table_size_ = 0;
   intptr_t bytes_heap_allocated_ = 0;
   intptr_t instructions_table_len_ = 0;
+  intptr_t instructions_table_rodata_offset_ = 0;
 
   // True if writing VM snapshot, false for Isolate snapshot.
   bool vm_;
@@ -537,6 +542,7 @@
 
 #if defined(DART_PRECOMPILER)
   IntMap<intptr_t> deduped_instructions_sources_;
+  IntMap<intptr_t> code_index_;
 #endif
 
   intptr_t current_loading_unit_id_ = 0;
@@ -657,6 +663,16 @@
     return refs_->untag()->element(index);
   }
 
+  CodePtr GetCodeByIndex(intptr_t code_index, uword* entry_point) const;
+  uword GetEntryPointByCodeIndex(intptr_t code_index) const;
+
+  // If |code_index| corresponds to a non-discarded Code object returns
+  // index within the code cluster that corresponds to this Code object.
+  // Otherwise, if |code_index| corresponds to the discarded Code then
+  // returns -1.
+  static intptr_t CodeIndexToClusterIndex(const InstructionsTable& table,
+                                          intptr_t code_index);
+
   ObjectPtr ReadRef() { return Ref(ReadUnsigned()); }
 
   template <typename T, typename... P>
@@ -685,7 +701,7 @@
     return Read<int32_t>();
   }
 
-  void ReadInstructions(CodePtr code, bool deferred, bool discarded);
+  void ReadInstructions(CodePtr code, bool deferred);
   void EndInstructions();
   ObjectPtr GetObjectAt(uint32_t offset) const;
 
@@ -694,10 +710,12 @@
   DeserializationCluster* ReadCluster();
 
   void ReadDispatchTable() {
-    ReadDispatchTable(&stream_, /*deferred=*/false, -1, -1);
+    ReadDispatchTable(&stream_, /*deferred=*/false, InstructionsTable::Handle(),
+                      -1, -1);
   }
   void ReadDispatchTable(ReadStream* stream,
                          bool deferred,
+                         const InstructionsTable& root_instruction_table,
                          intptr_t deferred_code_start_index,
                          intptr_t deferred_code_end_index);
 
@@ -708,10 +726,13 @@
   FieldTable* initial_field_table() const { return initial_field_table_; }
   bool is_non_root_unit() const { return is_non_root_unit_; }
   void set_code_start_index(intptr_t value) { code_start_index_ = value; }
-  intptr_t code_start_index() { return code_start_index_; }
+  intptr_t code_start_index() const { return code_start_index_; }
+  void set_code_stop_index(intptr_t value) { code_stop_index_ = value; }
+  intptr_t code_stop_index() const { return code_stop_index_; }
   const InstructionsTable& instructions_table() const {
     return instructions_table_;
   }
+  intptr_t num_base_objects() const { return num_base_objects_; }
 
  private:
   Heap* heap_;
@@ -724,8 +745,8 @@
   intptr_t num_clusters_;
   ArrayPtr refs_;
   intptr_t next_ref_index_;
-  intptr_t previous_text_offset_;
   intptr_t code_start_index_ = 0;
+  intptr_t code_stop_index_ = 0;
   intptr_t instructions_index_ = 0;
   DeserializationCluster** clusters_;
   FieldTable* initial_field_table_;
diff --git a/runtime/vm/bitmap_test.cc b/runtime/vm/bitmap_test.cc
index 2fdab17..0e7837f 100644
--- a/runtime/vm/bitmap_test.cc
+++ b/runtime/vm/bitmap_test.cc
@@ -53,7 +53,7 @@
   // Create a CompressedStackMaps object and verify its contents.
   const auto& maps1 = CompressedStackMaps::Handle(
       thread->zone(), MapsFromBuilder(thread->zone(), builder1));
-  CompressedStackMaps::Iterator it1(thread, maps1);
+  auto it1 = maps1.iterator(thread);
   EXPECT(it1.MoveNext());
 
   EXPECT_EQ(kTestPcOffset, it1.pc_offset());
@@ -86,7 +86,7 @@
 
   const auto& maps2 = CompressedStackMaps::Handle(
       thread->zone(), MapsFromBuilder(thread->zone(), builder1));
-  CompressedStackMaps::Iterator it2(thread, maps2);
+  auto it2 = maps2.iterator(thread);
   EXPECT(it2.MoveNext());
 
   EXPECT_EQ(kTestPcOffset, it2.pc_offset());
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 6f6d67d..ca3d03c 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -18,7 +18,6 @@
   V(DartAsync_fatal, 1)                                                        \
   V(Object_equals, 2)                                                          \
   V(Object_getHash, 1)                                                         \
-  V(Object_setHashIfNotSetYet, 2)                                              \
   V(Object_toString, 1)                                                        \
   V(Object_runtimeType, 1)                                                     \
   V(Object_haveSameRuntimeType, 2)                                             \
@@ -160,7 +159,7 @@
   V(DateTime_localTimeZoneAdjustmentInSeconds, 0)                              \
   V(AssertionError_throwNew, 3)                                                \
   V(AssertionError_throwNewSource, 4)                                          \
-  V(Async_rethrow, 2)                                                          \
+  V(Error_throwWithStackTrace, 2)                                              \
   V(StackTrace_current, 0)                                                     \
   V(TypeError_throwNew, 4)                                                     \
   V(FallThroughError_throwNew, 1)                                              \
@@ -366,6 +365,8 @@
   V(VMService_CancelStream, 1)                                                 \
   V(VMService_RequestAssets, 0)                                                \
   V(VMService_DecodeAssets, 1)                                                 \
+  V(VMService_AddUserTagsToStreamableSampleList, 1)                            \
+  V(VMService_RemoveUserTagsFromStreamableSampleList, 1)                       \
   V(Ffi_loadInt8, 2)                                                           \
   V(Ffi_loadInt16, 2)                                                          \
   V(Ffi_loadInt32, 2)                                                          \
@@ -400,7 +401,16 @@
   V(Ffi_dl_lookup, 2)                                                          \
   V(Ffi_dl_getHandle, 1)                                                       \
   V(Ffi_dl_providesSymbol, 2)                                                  \
-  V(Ffi_asExternalTypedData, 2)                                                \
+  V(Ffi_asExternalTypedDataInt8, 2)                                            \
+  V(Ffi_asExternalTypedDataInt16, 2)                                           \
+  V(Ffi_asExternalTypedDataInt32, 2)                                           \
+  V(Ffi_asExternalTypedDataInt64, 2)                                           \
+  V(Ffi_asExternalTypedDataUint8, 2)                                           \
+  V(Ffi_asExternalTypedDataUint16, 2)                                          \
+  V(Ffi_asExternalTypedDataUint32, 2)                                          \
+  V(Ffi_asExternalTypedDataUint64, 2)                                          \
+  V(Ffi_asExternalTypedDataFloat, 2)                                           \
+  V(Ffi_asExternalTypedDataDouble, 2)                                          \
   V(Ffi_dl_processLibrary, 0)                                                  \
   V(Ffi_dl_executableLibrary, 0)                                               \
   V(Ffi_GetFfiNativeResolver, 0)                                               \
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index bc52316..9b647b3 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -140,7 +140,7 @@
   V(Int32x4Array)                                                              \
   V(Float64x2Array)
 
-#define CLASS_LIST_FFI_NUMERIC(V)                                              \
+#define CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(V)                                   \
   V(Int8)                                                                      \
   V(Int16)                                                                     \
   V(Int32)                                                                     \
@@ -149,10 +149,13 @@
   V(Uint16)                                                                    \
   V(Uint32)                                                                    \
   V(Uint64)                                                                    \
-  V(IntPtr)                                                                    \
   V(Float)                                                                     \
   V(Double)
 
+#define CLASS_LIST_FFI_NUMERIC(V)                                              \
+  CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(V)                                         \
+  V(IntPtr)
+
 #define CLASS_LIST_FFI_TYPE_MARKER(V)                                          \
   CLASS_LIST_FFI_NUMERIC(V)                                                    \
   V(Void)                                                                      \
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index a1c58c0..edec756 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -534,6 +534,70 @@
   shared_class_table_->SetSizeAt(cid, size);
 }
 
+#if defined(DART_PRECOMPILER)
+void ClassTable::PrintObjectLayout(const char* filename) {
+  Class& cls = Class::Handle();
+  Array& fields = Array::Handle();
+  Field& field = Field::Handle();
+
+  JSONWriter js;
+  js.OpenArray();
+  for (intptr_t i = ClassId::kObjectCid; i < top_; i++) {
+    if (!HasValidClassAt(i)) {
+      continue;
+    }
+    cls = At(i);
+    ASSERT(!cls.IsNull());
+    ASSERT(cls.id() != kIllegalCid);
+    ASSERT(cls.is_finalized());  // Precompiler already finalized all classes.
+    ASSERT(!cls.IsTopLevel());
+    js.OpenObject();
+    js.PrintProperty("class", cls.UserVisibleNameCString());
+    js.PrintProperty("size", cls.target_instance_size());
+    js.OpenArray("fields");
+    fields = cls.fields();
+    if (!fields.IsNull()) {
+      for (intptr_t i = 0, n = fields.Length(); i < n; ++i) {
+        field ^= fields.At(i);
+        js.OpenObject();
+        js.PrintProperty("field", field.UserVisibleNameCString());
+        if (field.is_static()) {
+          js.PrintPropertyBool("static", true);
+        } else {
+          js.PrintProperty("offset", field.TargetOffset());
+        }
+        js.CloseObject();
+      }
+    }
+    js.CloseArray();
+    js.CloseObject();
+  }
+  js.CloseArray();
+
+  auto file_open = Dart::file_open_callback();
+  auto file_write = Dart::file_write_callback();
+  auto file_close = Dart::file_close_callback();
+  if ((file_open == nullptr) || (file_write == nullptr) ||
+      (file_close == nullptr)) {
+    OS::PrintErr("warning: Could not access file callbacks.");
+    return;
+  }
+
+  void* file = file_open(filename, /*write=*/true);
+  if (file == nullptr) {
+    OS::PrintErr("warning: Failed to write object layout: %s\n", filename);
+    return;
+  }
+
+  char* output = nullptr;
+  intptr_t output_length = 0;
+  js.Steal(&output, &output_length);
+  file_write(output, output_length, file);
+  free(output);
+  file_close(file);
+}
+#endif  // defined(DART_PRECOMPILER)
+
 #ifndef PRODUCT
 void ClassTable::PrintToJSONObject(JSONObject* object) {
   Class& cls = Class::Handle();
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index e89b978..1e6ca5f 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -394,6 +394,10 @@
 
   void Print();
 
+#if defined(DART_PRECOMPILER)
+  void PrintObjectLayout(const char* filename);
+#endif
+
 #ifndef PRODUCT
   // Describes layout of heap stats for code generation. See offset_extractor.cc
   struct ArrayTraits {
diff --git a/runtime/vm/closure_functions_cache.cc b/runtime/vm/closure_functions_cache.cc
index ff62680..49badbb 100644
--- a/runtime/vm/closure_functions_cache.cc
+++ b/runtime/vm/closure_functions_cache.cc
@@ -73,7 +73,9 @@
   return Function::null();
 }
 
-void ClosureFunctionsCache::AddClosureFunctionLocked(const Function& function) {
+void ClosureFunctionsCache::AddClosureFunctionLocked(
+    const Function& function,
+    bool allow_implicit_closure_functions /* = false */) {
   ASSERT(!Compiler::IsBackgroundCompilation());
 
   auto thread = Thread::Current();
@@ -86,7 +88,8 @@
   const auto& closures =
       GrowableObjectArray::Handle(zone, object_store->closure_functions());
   ASSERT(!closures.IsNull());
-  ASSERT(function.IsNonImplicitClosureFunction());
+  ASSERT(allow_implicit_closure_functions ||
+         function.IsNonImplicitClosureFunction());
   closures.Add(function, Heap::kOld);
 }
 
diff --git a/runtime/vm/closure_functions_cache.h b/runtime/vm/closure_functions_cache.h
index 019c12b..c52c2e6 100644
--- a/runtime/vm/closure_functions_cache.h
+++ b/runtime/vm/closure_functions_cache.h
@@ -49,7 +49,13 @@
   static FunctionPtr LookupClosureFunctionLocked(const Function& parent,
                                                  TokenPosition token_pos);
 
-  static void AddClosureFunctionLocked(const Function& function);
+  // Normally implicit closure functions are not added to this cache, however
+  // during AOT compilation we might add those implicit closure functions
+  // that have their original functions shaken to allow ProgramWalker to
+  // discover them.
+  static void AddClosureFunctionLocked(
+      const Function& function,
+      bool allow_implicit_closure_functions = false);
 
   static intptr_t FindClosureIndex(const Function& needle);
   static FunctionPtr ClosureFunctionFromIndex(intptr_t idx);
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index dd8bc1d..87625f3 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -417,6 +417,14 @@
   }
 }
 
+void CodeSourceMapBuilder::WriteFunctionEntrySourcePosition(
+    const InstructionSource& source) {
+  ASSERT(written_pc_offset_ == 0 && buffered_pc_offset_ == 0);
+  ASSERT(stream_.bytes_written() == 0);
+  WriteChangePosition(source.token_pos);
+  WriteAdvancePC(0);
+}
+
 void CodeSourceMapBuilder::BeginCodeSourceRange(
     int32_t pc_offset,
     const InstructionSource& source) {
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index ac29be7..bd0d358 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -246,6 +246,7 @@
   void NoteNullCheck(int32_t pc_offset,
                      const InstructionSource& source,
                      intptr_t name_index);
+  void WriteFunctionEntrySourcePosition(const InstructionSource& source);
 
   // If source is from an inlined call, returns the token position of the
   // original call in the root function, otherwise the source's token position.
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 2fc5361..11d15ea 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -96,7 +96,7 @@
     const Code& caller_code,
     const Object& data,
     const Code& target) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     call.SetData(data);
     call.SetTarget(target);
@@ -109,7 +109,7 @@
 
 uword CodePatcher::GetSwitchableCallTargetEntryAt(uword return_address,
                                                   const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     return call.target_entry();
   } else {
@@ -120,7 +120,7 @@
 
 ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     return call.data();
   } else {
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index c399fd1..e8217b6 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -132,7 +132,7 @@
     const Code& caller_code,
     const Object& data,
     const Code& target) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     call.SetData(data);
     call.SetTarget(target);
@@ -145,7 +145,7 @@
 
 uword CodePatcher::GetSwitchableCallTargetEntryAt(uword return_address,
                                                   const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     return call.target_entry();
   } else {
@@ -156,7 +156,7 @@
 
 ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCallPattern call(return_address);
     return call.data();
   } else {
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index ce1d9f2..7a846f4 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -486,7 +486,7 @@
     const Code& caller_code,
     const Object& data,
     const Code& target) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCall call(return_address);
     call.SetData(data);
     call.SetTarget(target);
@@ -499,7 +499,7 @@
 
 uword CodePatcher::GetSwitchableCallTargetEntryAt(uword return_address,
                                                   const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCall call(return_address);
     return call.target_entry();
   } else {
@@ -510,7 +510,7 @@
 
 ObjectPtr CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                const Code& caller_code) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     BareSwitchableCall call(return_address);
     return call.data();
   } else {
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index a013cb2..a8e2f04 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -646,10 +646,6 @@
       case Token::kMUL:
         FALL_THROUGH;
       case Token::kDIV: {
-        if (op_kind == Token::kDIV &&
-            !FlowGraphCompiler::SupportsHardwareDivision()) {
-          return false;
-        }
         left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
         right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
         replacement = new (Z) BinaryDoubleOpInstr(
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 6c373a5..930e8ad 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -67,6 +67,10 @@
             "Print per-phase breakdown of time spent precompiling");
 DEFINE_FLAG(bool, print_unique_targets, false, "Print unique dynamic targets");
 DEFINE_FLAG(bool, print_gop, false, "Print global object pool");
+DEFINE_FLAG(charp,
+            print_object_layout_to,
+            nullptr,
+            "Print layout of Dart objects to the given file");
 DEFINE_FLAG(bool, trace_precompiler, false, "Trace precompiler.");
 DEFINE_FLAG(
     int,
@@ -141,12 +145,11 @@
   // The object is a function and symbolic stack traces are enabled.
   static constexpr const char* kSymbolicStackTraces =
       "needed for symbolic stack traces";
-  // The object is a function that is only used via its implicit closure
-  // function, into which it was inlined.
-  static constexpr const char* kInlinedIntoICF =
-      "inlined into implicit closure function";
   // The object is a parent function function of a non-inlined local function.
   static constexpr const char* kLocalParent = "parent of a local function";
+  // The object is a main function of the root library.
+  static constexpr const char* kMainFunction =
+      "this is main function of the root library";
   // The object has an entry point pragma that requires it be retained.
   static constexpr const char* kEntryPointPragma = "entry point pragma";
   // The function is a target of FFI callback.
@@ -456,12 +459,10 @@
       retained_reasons_writer_ = &reasons_writer;
     }
 
-    if (FLAG_use_bare_instructions) {
-      // Since we keep the object pool until the end of AOT compilation, it
-      // will hang on to its entries until the very end. Therefore we have
-      // to use handles which survive that long, so we use [zone_] here.
-      global_object_pool_builder_.InitializeWithZone(zone_);
-    }
+    // Since we keep the object pool until the end of AOT compilation, it
+    // will hang on to its entries until the very end. Therefore we have
+    // to use handles which survive that long, so we use [zone_] here.
+    global_object_pool_builder_.InitializeWithZone(zone_);
 
     {
       HANDLESCOPE(T);
@@ -472,6 +473,10 @@
       FinalizeAllClasses();
       ASSERT(Error::Handle(Z, T->sticky_error()).IsNull());
 
+      if (FLAG_print_object_layout_to != nullptr) {
+        IG->class_table()->PrintObjectLayout(FLAG_print_object_layout_to);
+      }
+
       ClassFinalizer::SortClasses();
 
       // Collects type usage information which allows us to decide when/how to
@@ -482,7 +487,7 @@
       // as well as other type checks.
       HierarchyInfo hierarchy_info(T);
 
-      if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
+      if (FLAG_use_table_dispatch) {
         dispatch_table_generator_ = new compiler::DispatchTableGenerator(Z);
         dispatch_table_generator_->Initialize(IG->class_table());
       }
@@ -490,7 +495,7 @@
       // Precompile constructors to compute information such as
       // optimized instruction count (used in inlining heuristics).
       ClassFinalizer::ClearAllCode(
-          /*including_nonchanging_cids=*/FLAG_use_bare_instructions);
+          /*including_nonchanging_cids=*/true);
 
       {
         CompilerState state(thread_, /*is_aot=*/true, /*is_optimizing=*/true);
@@ -498,14 +503,14 @@
       }
 
       ClassFinalizer::ClearAllCode(
-          /*including_nonchanging_cids=*/FLAG_use_bare_instructions);
+          /*including_nonchanging_cids=*/true);
 
       tracer_ = PrecompilerTracer::StartTracingIfRequested(this);
 
       // All stubs have already been generated, all of them share the same pool.
       // We use that pool to initialize our global object pool, to guarantee
       // stubs as well as code compiled from here on will have the same pool.
-      if (FLAG_use_bare_instructions) {
+      {
         // We use any stub here to get it's object pool (all stubs share the
         // same object pool in bare instructions mode).
         const Code& code = StubCode::LazyCompile();
@@ -572,7 +577,7 @@
       // [Type]-specialized stubs.
       AttachOptimizedTypeTestingStub();
 
-      if (FLAG_use_bare_instructions) {
+      {
         // Now we generate the actual object pool instance and attach it to the
         // object store. The AOT runtime will use it from there in the enter
         // dart code stub.
@@ -724,13 +729,10 @@
 
 void Precompiler::AddRoots() {
   HANDLESCOPE(T);
-  // Note that <rootlibrary>.main is not a root. The appropriate main will be
-  // discovered through _getMainClosure.
-
   AddSelector(Symbols::NoSuchMethod());
-
   AddSelector(Symbols::Call());  // For speed, not correctness.
 
+  // Add main as an entry point.
   const Library& lib = Library::Handle(IG->object_store()->root_library());
   if (lib.IsNull()) {
     const String& msg = String::Handle(
@@ -740,22 +742,26 @@
   }
 
   const String& name = String::Handle(String::New("main"));
-  const Object& main_closure = Object::Handle(lib.GetFunctionClosure(name));
-  if (main_closure.IsClosure()) {
-    if (lib.LookupLocalFunction(name) == Function::null()) {
-      // Check whether the function is in exported namespace of library, in
-      // this case we have to retain the root library caches.
-      if (lib.LookupFunctionAllowPrivate(name) != Function::null() ||
-          lib.LookupReExport(name) != Object::null()) {
-        retain_root_library_caches_ = true;
-      }
+  Function& main = Function::Handle(lib.LookupFunctionAllowPrivate(name));
+  if (main.IsNull()) {
+    const Object& obj = Object::Handle(lib.LookupReExport(name));
+    if (obj.IsFunction()) {
+      main ^= obj.ptr();
     }
-    AddConstObject(Closure::Cast(main_closure));
-  } else if (main_closure.IsError()) {
-    const Error& error = Error::Cast(main_closure);
-    String& msg =
-        String::Handle(Z, String::NewFormatted("Cannot find main closure %s\n",
-                                               error.ToErrorCString()));
+  }
+  if (!main.IsNull()) {
+    if (lib.LookupLocalFunction(name) == Function::null()) {
+      retain_root_library_caches_ = true;
+    }
+    AddRetainReason(main, RetainReasons::kMainFunction);
+    AddTypesOf(main);
+    // Create closure object from main.
+    main = main.ImplicitClosureFunction();
+    AddConstObject(Closure::Handle(main.ImplicitStaticClosure()));
+  } else {
+    String& msg = String::Handle(
+        Z, String::NewFormatted("Cannot find main in library %s\n",
+                                lib.ToCString()));
     Jump(Error::Handle(Z, ApiError::New(msg)));
     UNREACHABLE();
   }
@@ -853,9 +859,7 @@
 
 void Precompiler::ProcessFunction(const Function& function) {
   HANDLESCOPE(T);
-  const intptr_t gop_offset =
-      FLAG_use_bare_instructions ? global_object_pool_builder()->CurrentLength()
-                                 : 0;
+  const intptr_t gop_offset = global_object_pool_builder()->CurrentLength();
   RELEASE_ASSERT(!function.HasCode());
   // Ffi trampoline functions have no signature.
   ASSERT(function.kind() == UntaggedFunction::kFfiTrampoline ||
@@ -949,7 +953,7 @@
   // rather than scanning global object pool - because we want to include
   // *all* outgoing references into the trace. Scanning GOP would exclude
   // references that have been deduplicated.
-  if (FLAG_use_bare_instructions && !is_tracing()) {
+  if (!is_tracing()) {
     for (intptr_t i = gop_offset;
          i < global_object_pool_builder()->CurrentLength(); i++) {
       const auto& wrapper_entry = global_object_pool_builder()->EntryAt(i);
@@ -1442,7 +1446,7 @@
 }
 
 void Precompiler::AddTableSelector(const compiler::TableSelector* selector) {
-  ASSERT(FLAG_use_bare_instructions && FLAG_use_table_dispatch);
+  ASSERT(FLAG_use_table_dispatch);
 
   if (is_tracing()) {
     tracer_->WriteTableSelectorRef(selector->id);
@@ -1455,7 +1459,7 @@
 }
 
 bool Precompiler::IsHitByTableSelector(const Function& function) {
-  if (!(FLAG_use_bare_instructions && FLAG_use_table_dispatch)) {
+  if (!FLAG_use_table_dispatch) {
     return false;
   }
 
@@ -1930,25 +1934,25 @@
       for (intptr_t j = 0; j < functions.Length(); j++) {
         SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
         function ^= functions.At(j);
-        bool retain = possibly_retained_functions_.ContainsKey(function);
-        if (!retain && function.HasImplicitClosureFunction()) {
-          // It can happen that all uses of an implicit closure inline their
-          // target function, leaving the target function uncompiled. Keep
-          // the target function anyway so we can enumerate it to bind its
-          // static calls, etc.
-          function2 = function.ImplicitClosureFunction();
-          retain = function2.HasCode();
-          if (retain) {
-            AddRetainReason(function, RetainReasons::kInlinedIntoICF);
-          }
-        }
-        if (retain) {
-          function.DropUncompiledImplicitClosureFunction();
+        function.DropUncompiledImplicitClosureFunction();
+
+        const bool retained =
+            possibly_retained_functions_.ContainsKey(function);
+        if (retained) {
           AddTypesOf(function);
-          if (function.HasImplicitClosureFunction()) {
-            function2 = function.ImplicitClosureFunction();
-            if (possibly_retained_functions_.ContainsKey(function2)) {
-              AddTypesOf(function2);
+        }
+        if (function.HasImplicitClosureFunction()) {
+          function2 = function.ImplicitClosureFunction();
+
+          if (possibly_retained_functions_.ContainsKey(function2)) {
+            AddTypesOf(function2);
+            // If function has @pragma('vm:entry-point', 'get') we need to keep
+            // the function itself around so that runtime could find it and
+            // get to the implicit closure through it.
+            if (!retained &&
+                functions_with_entry_point_pragmas_.ContainsKey(function2)) {
+              AddRetainReason(function, RetainReasons::kEntryPointPragma);
+              AddTypesOf(function);
             }
           }
         }
@@ -2007,7 +2011,7 @@
 
 void Precompiler::FinalizeDispatchTable() {
   PRECOMPILER_TIMER_SCOPE(this, FinalizeDispatchTable);
-  if (!FLAG_use_bare_instructions || !FLAG_use_table_dispatch) return;
+  if (!FLAG_use_table_dispatch) return;
   HANDLESCOPE(T);
   // Build the entries used to serialize the dispatch table before
   // dropping functions, as we may clear references to Code objects.
@@ -2066,11 +2070,8 @@
       // the old references to the CallStaticFunction stub, but it is sufficient
       // for the local pool to include the actual call target.
       compiler::ObjectPoolBuilder builder;
-      bool append_to_pool = FLAG_use_bare_instructions;
-      if (append_to_pool) {
-        pool_ = code.object_pool();
-        pool_.CopyInto(&builder);
-      }
+      pool_ = code.object_pool();
+      pool_.CopyInto(&builder);
 
       for (auto& view : static_calls) {
         kind_and_offset_ = view.Get<Code::kSCallTableKindAndOffset>();
@@ -2093,9 +2094,7 @@
               Code::OffsetField::decode(kind_and_offset_.Value());
           const uword pc = pc_offset + code.PayloadStart();
           CodePatcher::PatchStaticCallAt(pc, code, target_code_);
-          if (append_to_pool) {
-            builder.AddObject(Object::ZoneHandle(target_code_.ptr()));
-          }
+          builder.AddObject(Object::ZoneHandle(target_code_.ptr()));
         }
         if (FLAG_trace_precompiler) {
           THR_Print("Updated static call entry to %s in \"%s\"\n",
@@ -2104,9 +2103,7 @@
         }
       }
 
-      if (append_to_pool) {
-        code.set_object_pool(ObjectPool::NewFromBuilder(builder));
-      }
+      code.set_object_pool(ObjectPool::NewFromBuilder(builder));
     }
 
    private:
@@ -2129,6 +2126,7 @@
   Array& functions = Array::Handle(Z);
   Function& function = Function::Handle(Z);
   Function& target = Function::Handle(Z);
+  Function& implicit_closure = Function::Handle(Z);
   Code& code = Code::Handle(Z);
   Object& owner = Object::Handle(Z);
   GrowableObjectArray& retained_functions = GrowableObjectArray::Handle(Z);
@@ -2207,6 +2205,17 @@
           owner, Smi::Handle(Smi::New(owner.GetClassId())));
       code.set_owner(owner);
     }
+    if (function.HasImplicitClosureFunction()) {
+      // If we are going to drop the function which has a compiled
+      // implicit closure move the closure itself to the list of closures
+      // attached to the object store so that ProgramVisitor could find it.
+      // The list of closures is going to be dropped during PRODUCT snapshotting
+      // so there is no overhead in doing so.
+      implicit_closure = function.ImplicitClosureFunction();
+      RELEASE_ASSERT(functions_to_retain_.ContainsKey(implicit_closure));
+      ClosureFunctionsCache::AddClosureFunctionLocked(
+          implicit_closure, /*allow_implicit_closure_functions=*/true);
+    }
     dropped_function_count_++;
     if (FLAG_trace_precompiler) {
       THR_Print("Dropping function %s\n",
@@ -2289,6 +2298,9 @@
     }
     return true;  // Continue iteration.
   });
+
+  // Note: in PRODUCT mode snapshotter will drop this field when serializing.
+  // This is done in ProgramSerializationRoots.
   IG->object_store()->set_closure_functions(retained_functions);
 }
 
@@ -2887,11 +2899,9 @@
     intptr_t discarded_codes_ = 0;
   };
 
-  // Code objects are stored in stack frames if not use_bare_instructions.
   // Code objects are used by stack traces if not dwarf_stack_traces.
   // Code objects are used by profiler in non-PRODUCT mode.
-  if (!FLAG_use_bare_instructions || !FLAG_dwarf_stack_traces_mode ||
-      FLAG_retain_code_objects) {
+  if (!FLAG_dwarf_stack_traces_mode || FLAG_retain_code_objects) {
     return;
   }
 
@@ -3050,9 +3060,7 @@
       Array::Handle(zone, graph_compiler->CreateDeoptInfo(assembler));
   // Allocates instruction object. Since this occurs only at safepoint,
   // there can be no concurrent access to the instruction page.
-  const auto pool_attachment = FLAG_use_bare_instructions
-                                   ? Code::PoolAttachment::kNotAttachPool
-                                   : Code::PoolAttachment::kAttachPool;
+  const auto pool_attachment = Code::PoolAttachment::kNotAttachPool;
 
   SafepointWriteRwLocker ml(T, T->isolate_group()->program_lock());
   const Code& code = Code::Handle(
@@ -3130,6 +3138,7 @@
 
       CompilerState compiler_state(thread(), /*is_aot=*/true, optimized(),
                                    CompilerState::ShouldTrace(function));
+      compiler_state.set_function(function);
 
       {
         ic_data_array = new (zone) ZoneGrowableArray<const ICData*>();
@@ -3177,19 +3186,17 @@
       ASSERT(pass_state.inline_id_to_function.length() ==
              pass_state.caller_inline_id.length());
 
-      ASSERT(!FLAG_use_bare_instructions || precompiler_ != nullptr);
+      ASSERT(precompiler_ != nullptr);
 
-      if (FLAG_use_bare_instructions) {
-        // When generating code in bare instruction mode all code objects
-        // share the same global object pool. To reduce interleaving of
-        // unrelated object pool entries from different code objects
-        // we attempt to pregenerate stubs referenced by the code
-        // we are going to generate.
-        //
-        // Reducing interleaving means reducing recompilations triggered by
-        // failure to commit object pool into the global object pool.
-        GenerateNecessaryAllocationStubs(flow_graph);
-      }
+      // When generating code in bare instruction mode all code objects
+      // share the same global object pool. To reduce interleaving of
+      // unrelated object pool entries from different code objects
+      // we attempt to pregenerate stubs referenced by the code
+      // we are going to generate.
+      //
+      // Reducing interleaving means reducing recompilations triggered by
+      // failure to commit object pool into the global object pool.
+      GenerateNecessaryAllocationStubs(flow_graph);
 
       // Even in bare instructions mode we don't directly add objects into
       // the global object pool because code generation can bail out
@@ -3204,9 +3211,7 @@
       // some stubs). If this indeed happens we retry the compilation.
       // (See TryCommitToParent invocation below).
       compiler::ObjectPoolBuilder object_pool_builder(
-          FLAG_use_bare_instructions
-              ? precompiler_->global_object_pool_builder()
-              : nullptr);
+          precompiler_->global_object_pool_builder());
       compiler::Assembler assembler(&object_pool_builder, use_far_branches);
 
       CodeStatistics* function_stats = NULL;
@@ -3267,8 +3272,7 @@
       // method will lead to the same IR due to instability of inlining
       // heuristics (under some conditions we might end up inlining
       // more aggressively on the second attempt).
-      if (FLAG_use_bare_instructions &&
-          !object_pool_builder.TryCommitToParent()) {
+      if (!object_pool_builder.TryCommitToParent()) {
         done = false;
         continue;
       }
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index 303fbc4..678905c 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -243,12 +243,11 @@
   }
 
   compiler::ObjectPoolBuilder* global_object_pool_builder() {
-    ASSERT(FLAG_use_bare_instructions);
     return &global_object_pool_builder_;
   }
 
   compiler::SelectorMap* selector_map() {
-    ASSERT(FLAG_use_bare_instructions && FLAG_use_table_dispatch);
+    ASSERT(FLAG_use_table_dispatch);
     return dispatch_table_generator_->selector_map();
   }
 
diff --git a/runtime/vm/compiler/aot/precompiler_tracer.cc b/runtime/vm/compiler/aot/precompiler_tracer.cc
index 72fcfdd..d0a2e5f 100644
--- a/runtime/vm/compiler/aot/precompiler_tracer.cc
+++ b/runtime/vm/compiler/aot/precompiler_tracer.cc
@@ -90,7 +90,7 @@
       const auto& fun = Function::Cast(obj);
       cls_ = fun.Owner();
       const intptr_t selector_id =
-          FLAG_use_bare_instructions && FLAG_use_table_dispatch
+          FLAG_use_table_dispatch
               ? precompiler_->selector_map()->SelectorId(fun)
               : -1;
       Write("\"%c\",%" Pd ",%" Pd ",%" Pd "",
diff --git a/runtime/vm/compiler/api/print_filter.cc b/runtime/vm/compiler/api/print_filter.cc
index be9762c..4abe1e9 100644
--- a/runtime/vm/compiler/api/print_filter.cc
+++ b/runtime/vm/compiler/api/print_filter.cc
@@ -7,24 +7,46 @@
 #include "vm/compiler/api/print_filter.h"
 
 #include "vm/flags.h"
+#if !defined(DART_PRECOMPILED_RUNTIME)
+#include "vm/compiler/compiler_pass.h"
 #include "vm/object.h"
+#endif
+#include "vm/symbols.h"
 
 namespace dart {
 
 DEFINE_FLAG(charp,
             print_flow_graph_filter,
-            NULL,
+            nullptr,
             "Print only IR of functions with matching names");
 
 namespace compiler {
 
 // Checks whether function's name matches the given filter, which is
 // a comma-separated list of strings.
-static bool PassesFilter(const char* filter, const Function& function) {
-  if (filter == NULL) {
+static bool PassesFilter(const char* filter,
+                         const Function& function,
+                         uint8_t** compiler_pass_filter) {
+  if (filter == nullptr) {
     return true;
   }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (strcmp(filter, "@pragma") == 0) {
+    Object& pass_filter = Object::Handle();
+    const auto has_pragma =
+        Library::FindPragma(dart::Thread::Current(), /*only_core=*/false,
+                            function, Symbols::vm_testing_print_flow_graph(),
+                            /*multiple=*/false, &pass_filter);
+    if (has_pragma && !pass_filter.IsNull() &&
+        compiler_pass_filter != nullptr) {
+      *compiler_pass_filter = dart::CompilerPass::ParseFiltersFromPragma(
+          String::Cast(pass_filter).ToCString());
+    }
+    return has_pragma;
+  }
+#endif
+
   char* save_ptr;  // Needed for strtok_r.
   const char* scrubbed_name =
       String::Handle(function.QualifiedScrubbedName()).ToCString();
@@ -36,9 +58,9 @@
   strncpy(filter_buffer, filter, len);  // strtok modifies arg 1.
   char* token = strtok_r(filter_buffer, ",", &save_ptr);
   bool found = false;
-  while (token != NULL) {
-    if ((strstr(function_name, token) != NULL) ||
-        (strstr(scrubbed_name, token) != NULL)) {
+  while (token != nullptr) {
+    if ((strstr(function_name, token) != nullptr) ||
+        (strstr(scrubbed_name, token) != nullptr)) {
       found = true;
       break;
     }
@@ -53,15 +75,17 @@
         }
       }
     }
-    token = strtok_r(NULL, ",", &save_ptr);
+    token = strtok_r(nullptr, ",", &save_ptr);
   }
   delete[] filter_buffer;
 
   return found;
 }
 
-bool PrintFilter::ShouldPrint(const Function& function) {
-  return PassesFilter(FLAG_print_flow_graph_filter, function);
+bool PrintFilter::ShouldPrint(const Function& function,
+                              uint8_t** compiler_pass_filter /* = nullptr */) {
+  return PassesFilter(FLAG_print_flow_graph_filter, function,
+                      compiler_pass_filter);
 }
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/api/print_filter.h b/runtime/vm/compiler/api/print_filter.h
index 604fa9c..95d7a39 100644
--- a/runtime/vm/compiler/api/print_filter.h
+++ b/runtime/vm/compiler/api/print_filter.h
@@ -19,7 +19,8 @@
 
 class PrintFilter : public AllStatic {
  public:
-  static bool ShouldPrint(const Function& function);
+  static bool ShouldPrint(const Function& function,
+                          uint8_t** compiler_pass_filter = nullptr);
 };
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm.cc b/runtime/vm/compiler/asm_intrinsifier_arm.cc
index b61046d..3b8931c 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm.cc
@@ -765,32 +765,30 @@
 static void CompareDoubles(Assembler* assembler,
                            Label* normal_ir_body,
                            Condition true_condition) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    Label is_smi, double_op;
+  Label is_smi, double_op;
 
-    TestLastArgumentIsDouble(assembler, &is_smi, normal_ir_body);
-    // Both arguments are double, right operand is in R0.
+  TestLastArgumentIsDouble(assembler, &is_smi, normal_ir_body);
+  // Both arguments are double, right operand is in R0.
 
-    __ LoadDFromOffset(D1, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ Bind(&double_op);
-    __ ldr(R0, Address(SP, 1 * target::kWordSize));  // Left argument.
-    __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ LoadDFromOffset(D1, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ Bind(&double_op);
+  __ ldr(R0, Address(SP, 1 * target::kWordSize));  // Left argument.
+  __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
 
-    __ vcmpd(D0, D1);
-    __ vmstat();
-    __ LoadObject(R0, CastHandle<Object>(FalseObject()));
-    // Return false if D0 or D1 was NaN before checking true condition.
-    READS_RETURN_ADDRESS_FROM_LR(__ bx(LR, VS));
-    __ LoadObject(R0, CastHandle<Object>(TrueObject()), true_condition);
-    __ Ret();
+  __ vcmpd(D0, D1);
+  __ vmstat();
+  __ LoadObject(R0, CastHandle<Object>(FalseObject()));
+  // Return false if D0 or D1 was NaN before checking true condition.
+  READS_RETURN_ADDRESS_FROM_LR(__ bx(LR, VS));
+  __ LoadObject(R0, CastHandle<Object>(TrueObject()), true_condition);
+  __ Ret();
 
-    __ Bind(&is_smi);  // Convert R0 to a double.
-    __ SmiUntag(R0);
-    __ vmovsr(S0, R0);
-    __ vcvtdi(D1, S0);
-    __ b(&double_op);  // Then do the comparison.
-    __ Bind(normal_ir_body);
-  }
+  __ Bind(&is_smi);  // Convert R0 to a double.
+  __ SmiUntag(R0);
+  __ vmovsr(S0, R0);
+  __ vcvtdi(D1, S0);
+  __ b(&double_op);  // Then do the comparison.
+  __ Bind(normal_ir_body);
 }
 
 void AsmIntrinsifier::Double_greaterThan(Assembler* assembler,
@@ -823,43 +821,41 @@
 static void DoubleArithmeticOperations(Assembler* assembler,
                                        Label* normal_ir_body,
                                        Token::Kind kind) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    Label is_smi, double_op;
+  Label is_smi, double_op;
 
-    TestLastArgumentIsDouble(assembler, &is_smi, normal_ir_body);
-    // Both arguments are double, right operand is in R0.
-    __ LoadDFromOffset(D1, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ Bind(&double_op);
-    __ ldr(R0, Address(SP, 1 * target::kWordSize));  // Left argument.
-    __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
-    switch (kind) {
-      case Token::kADD:
-        __ vaddd(D0, D0, D1);
-        break;
-      case Token::kSUB:
-        __ vsubd(D0, D0, D1);
-        break;
-      case Token::kMUL:
-        __ vmuld(D0, D0, D1);
-        break;
-      case Token::kDIV:
-        __ vdivd(D0, D0, D1);
-        break;
-      default:
-        UNREACHABLE();
-    }
-    const Class& double_class = DoubleClass();
-    __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump, R0,
-                   R1);  // Result register.
-    __ StoreDToOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ Ret();
-    __ Bind(&is_smi);  // Convert R0 to a double.
-    __ SmiUntag(R0);
-    __ vmovsr(S0, R0);
-    __ vcvtdi(D1, S0);
-    __ b(&double_op);
-    __ Bind(normal_ir_body);
+  TestLastArgumentIsDouble(assembler, &is_smi, normal_ir_body);
+  // Both arguments are double, right operand is in R0.
+  __ LoadDFromOffset(D1, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ Bind(&double_op);
+  __ ldr(R0, Address(SP, 1 * target::kWordSize));  // Left argument.
+  __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
+  switch (kind) {
+    case Token::kADD:
+      __ vaddd(D0, D0, D1);
+      break;
+    case Token::kSUB:
+      __ vsubd(D0, D0, D1);
+      break;
+    case Token::kMUL:
+      __ vmuld(D0, D0, D1);
+      break;
+    case Token::kDIV:
+      __ vdivd(D0, D0, D1);
+      break;
+    default:
+      UNREACHABLE();
   }
+  const Class& double_class = DoubleClass();
+  __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump, R0,
+                 R1);  // Result register.
+  __ StoreDToOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ Ret();
+  __ Bind(&is_smi);  // Convert R0 to a double.
+  __ SmiUntag(R0);
+  __ vmovsr(S0, R0);
+  __ vcvtdi(D1, S0);
+  __ b(&double_op);
+  __ Bind(normal_ir_body);
 }
 
 void AsmIntrinsifier::Double_add(Assembler* assembler, Label* normal_ir_body) {
@@ -881,123 +877,111 @@
 // Left is double, right is integer (Mint or Smi)
 void AsmIntrinsifier::Double_mulFromInteger(Assembler* assembler,
                                             Label* normal_ir_body) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    Label fall_through;
-    // Only smis allowed.
-    __ ldr(R0, Address(SP, 0 * target::kWordSize));
-    __ tst(R0, Operand(kSmiTagMask));
-    __ b(normal_ir_body, NE);
-    // Is Smi.
-    __ SmiUntag(R0);
-    __ vmovsr(S0, R0);
-    __ vcvtdi(D1, S0);
-    __ ldr(R0, Address(SP, 1 * target::kWordSize));
-    __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ vmuld(D0, D0, D1);
-    const Class& double_class = DoubleClass();
-    __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump, R0,
-                   R1);  // Result register.
-    __ StoreDToOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ Ret();
-    __ Bind(normal_ir_body);
-  }
+  Label fall_through;
+  // Only smis allowed.
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));
+  __ tst(R0, Operand(kSmiTagMask));
+  __ b(normal_ir_body, NE);
+  // Is Smi.
+  __ SmiUntag(R0);
+  __ vmovsr(S0, R0);
+  __ vcvtdi(D1, S0);
+  __ ldr(R0, Address(SP, 1 * target::kWordSize));
+  __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ vmuld(D0, D0, D1);
+  const Class& double_class = DoubleClass();
+  __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump, R0,
+                 R1);  // Result register.
+  __ StoreDToOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ Ret();
+  __ Bind(normal_ir_body);
 }
 
 void AsmIntrinsifier::DoubleFromInteger(Assembler* assembler,
                                         Label* normal_ir_body) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    Label fall_through;
+  Label fall_through;
 
-    __ ldr(R0, Address(SP, 0 * target::kWordSize));
-    __ tst(R0, Operand(kSmiTagMask));
-    __ b(normal_ir_body, NE);
-    // Is Smi.
-    __ SmiUntag(R0);
-    __ vmovsr(S0, R0);
-    __ vcvtdi(D0, S0);
-    const Class& double_class = DoubleClass();
-    __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump, R0,
-                   R1);  // Result register.
-    __ StoreDToOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ Ret();
-    __ Bind(normal_ir_body);
-  }
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));
+  __ tst(R0, Operand(kSmiTagMask));
+  __ b(normal_ir_body, NE);
+  // Is Smi.
+  __ SmiUntag(R0);
+  __ vmovsr(S0, R0);
+  __ vcvtdi(D0, S0);
+  const Class& double_class = DoubleClass();
+  __ TryAllocate(double_class, normal_ir_body, Assembler::kFarJump, R0,
+                 R1);  // Result register.
+  __ StoreDToOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ Ret();
+  __ Bind(normal_ir_body);
 }
 
 void AsmIntrinsifier::Double_getIsNaN(Assembler* assembler,
                                       Label* normal_ir_body) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ ldr(R0, Address(SP, 0 * target::kWordSize));
-    __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ vcmpd(D0, D0);
-    __ vmstat();
-    __ LoadObject(R0, CastHandle<Object>(FalseObject()), VC);
-    __ LoadObject(R0, CastHandle<Object>(TrueObject()), VS);
-    __ Ret();
-  }
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));
+  __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ vcmpd(D0, D0);
+  __ vmstat();
+  __ LoadObject(R0, CastHandle<Object>(FalseObject()), VC);
+  __ LoadObject(R0, CastHandle<Object>(TrueObject()), VS);
+  __ Ret();
 }
 
 void AsmIntrinsifier::Double_getIsInfinite(Assembler* assembler,
                                            Label* normal_ir_body) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ ldr(R0, Address(SP, 0 * target::kWordSize));
-    // R1 <- value[0:31], R2 <- value[32:63]
-    __ LoadFieldFromOffset(R1, R0, target::Double::value_offset());
-    __ LoadFieldFromOffset(R2, R0,
-                           target::Double::value_offset() + target::kWordSize);
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));
+  // R1 <- value[0:31], R2 <- value[32:63]
+  __ LoadFieldFromOffset(R1, R0, target::Double::value_offset());
+  __ LoadFieldFromOffset(R2, R0,
+                         target::Double::value_offset() + target::kWordSize);
 
-    // If the low word isn't 0, then it isn't infinity.
-    __ cmp(R1, Operand(0));
-    __ LoadObject(R0, CastHandle<Object>(FalseObject()), NE);
-    READS_RETURN_ADDRESS_FROM_LR(__ bx(LR, NE));  // Return if NE.
+  // If the low word isn't 0, then it isn't infinity.
+  __ cmp(R1, Operand(0));
+  __ LoadObject(R0, CastHandle<Object>(FalseObject()), NE);
+  READS_RETURN_ADDRESS_FROM_LR(__ bx(LR, NE));  // Return if NE.
 
-    // Mask off the sign bit.
-    __ AndImmediate(R2, R2, 0x7FFFFFFF);
-    // Compare with +infinity.
-    __ CompareImmediate(R2, 0x7FF00000);
-    __ LoadObject(R0, CastHandle<Object>(FalseObject()), NE);
-    READS_RETURN_ADDRESS_FROM_LR(__ bx(LR, NE));
-    __ LoadObject(R0, CastHandle<Object>(TrueObject()));
-    __ Ret();
-  }
+  // Mask off the sign bit.
+  __ AndImmediate(R2, R2, 0x7FFFFFFF);
+  // Compare with +infinity.
+  __ CompareImmediate(R2, 0x7FF00000);
+  __ LoadObject(R0, CastHandle<Object>(FalseObject()), NE);
+  READS_RETURN_ADDRESS_FROM_LR(__ bx(LR, NE));
+  __ LoadObject(R0, CastHandle<Object>(TrueObject()));
+  __ Ret();
 }
 
 void AsmIntrinsifier::Double_getIsNegative(Assembler* assembler,
                                            Label* normal_ir_body) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    Label is_false, is_true, is_zero;
-    __ ldr(R0, Address(SP, 0 * target::kWordSize));
-    __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
-    __ vcmpdz(D0);
-    __ vmstat();
-    __ b(&is_false, VS);  // NaN -> false.
-    __ b(&is_zero, EQ);   // Check for negative zero.
-    __ b(&is_false, CS);  // >= 0 -> false.
+  Label is_false, is_true, is_zero;
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));
+  __ LoadDFromOffset(D0, R0, target::Double::value_offset() - kHeapObjectTag);
+  __ vcmpdz(D0);
+  __ vmstat();
+  __ b(&is_false, VS);  // NaN -> false.
+  __ b(&is_zero, EQ);   // Check for negative zero.
+  __ b(&is_false, CS);  // >= 0 -> false.
 
-    __ Bind(&is_true);
-    __ LoadObject(R0, CastHandle<Object>(TrueObject()));
-    __ Ret();
+  __ Bind(&is_true);
+  __ LoadObject(R0, CastHandle<Object>(TrueObject()));
+  __ Ret();
 
-    __ Bind(&is_false);
-    __ LoadObject(R0, CastHandle<Object>(FalseObject()));
-    __ Ret();
+  __ Bind(&is_false);
+  __ LoadObject(R0, CastHandle<Object>(FalseObject()));
+  __ Ret();
 
-    __ Bind(&is_zero);
-    // Check for negative zero by looking at the sign bit.
-    __ vmovrrd(R0, R1, D0);  // R1:R0 <- D0, so sign bit is in bit 31 of R1.
-    __ mov(R1, Operand(R1, LSR, 31));
-    __ tst(R1, Operand(1));
-    __ b(&is_true, NE);  // Sign bit set.
-    __ b(&is_false);
-  }
+  __ Bind(&is_zero);
+  // Check for negative zero by looking at the sign bit.
+  __ vmovrrd(R0, R1, D0);  // R1:R0 <- D0, so sign bit is in bit 31 of R1.
+  __ mov(R1, Operand(R1, LSR, 31));
+  __ tst(R1, Operand(1));
+  __ b(&is_true, NE);  // Sign bit set.
+  __ b(&is_false);
 }
 
 void AsmIntrinsifier::Double_hashCode(Assembler* assembler,
                                       Label* normal_ir_body) {
   // TODO(dartbug.com/31174): Convert this to a graph intrinsic.
 
-  if (!TargetCPUFeatures::vfp_supported()) return;
-
   // Load double value and check that it isn't NaN, since ARM gives an
   // FPU exception if you try to convert NaN to an int.
   Label double_hash;
@@ -1548,11 +1532,6 @@
   UNREACHABLE();
 }
 
-void AsmIntrinsifier::Object_setHashIfNotSetYet(Assembler* assembler,
-                                                Label* normal_ir_body) {
-  UNREACHABLE();
-}
-
 void AsmIntrinsifier::StringBaseCharAt(Assembler* assembler,
                                        Label* normal_ir_body) {
   Label try_two_byte_string;
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index b6796b5..f9c178a 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -1578,21 +1578,37 @@
   __ Bind(normal_ir_body);
 }
 
+// Keep in sync with Instance::IdentityHashCode.
+// Note int and double never reach here because they override _identityHashCode.
+// Special cases are also not needed for null or bool because they were pre-set
+// during VM isolate finalization.
 void AsmIntrinsifier::Object_getHash(Assembler* assembler,
                                      Label* normal_ir_body) {
-  __ ldr(R0, Address(SP, 0 * target::kWordSize));
-  __ ldr(R0, FieldAddress(R0, target::String::hash_offset(), kFourBytes),
+  Label not_yet_computed;
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));  // Object.
+  __ ldr(R0,
+         FieldAddress(R0,
+                      target::Object::tags_offset() +
+                          target::UntaggedObject::kHashTagPos / kBitsPerByte,
+                      kFourBytes),
          kUnsignedFourBytes);
+  __ cbz(&not_yet_computed, R0);
   __ SmiTag(R0);
   __ ret();
-}
 
-void AsmIntrinsifier::Object_setHashIfNotSetYet(Assembler* assembler,
-                                                Label* normal_ir_body) {
-  __ ldp(/*Value=*/R1, /*Object=*/R0, Address(SP, 0, Address::PairOffset));
-  // R0: Untagged address of header word (ldxr/stxr do not support offsets).
+  __ Bind(&not_yet_computed);
+  __ LoadFromOffset(R1, THR, target::Thread::random_offset());
+  __ AndImmediate(R2, R1, 0xffffffff);  // state_lo
+  __ LsrImmediate(R3, R1, 32);          // state_hi
+  __ LoadImmediate(R1, 0xffffda61);     // A
+  __ mul(R1, R1, R2);
+  __ add(R1, R1, Operand(R3));  // new_state = (A * state_lo) + state_hi
+  __ StoreToOffset(R1, THR, target::Thread::random_offset());
+  __ AndImmediate(R1, R1, 0x3fffffff);
+  __ cbz(&not_yet_computed, R1);
+
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));  // Object.
   __ sub(R0, R0, Operand(kHeapObjectTag));
-  __ SmiUntag(R1);
   __ LslImmediate(R3, R1, target::UntaggedObject::kHashTagPos);
 
   Label retry, already_set_in_r4;
diff --git a/runtime/vm/compiler/asm_intrinsifier_ia32.cc b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
index 0c58ca7..341c285 100644
--- a/runtime/vm/compiler/asm_intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
@@ -1555,11 +1555,6 @@
   UNREACHABLE();
 }
 
-void AsmIntrinsifier::Object_setHashIfNotSetYet(Assembler* assembler,
-                                                Label* normal_ir_body) {
-  UNREACHABLE();
-}
-
 void AsmIntrinsifier::StringBaseCharAt(Assembler* assembler,
                                        Label* normal_ir_body) {
   Label try_two_byte_string;
diff --git a/runtime/vm/compiler/asm_intrinsifier_test.cc b/runtime/vm/compiler/asm_intrinsifier_test.cc
index e5678ee..fb112f1 100644
--- a/runtime/vm/compiler/asm_intrinsifier_test.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_test.cc
@@ -10,78 +10,4 @@
 
 namespace dart {
 
-static intptr_t GetHash(Isolate* isolate, const ObjectPtr obj) {
-#if defined(HASH_IN_OBJECT_HEADER)
-  return Object::GetCachedHash(obj);
-#else
-  Heap* heap = isolate->group()->heap();
-  ASSERT(obj->IsDartInstance());
-  return heap->GetHash(obj);
-#endif
-}
-
-ISOLATE_UNIT_TEST_CASE(AsmIntrinsifier_SetHashIfNotSetYet) {
-  auto I = Isolate::Current();
-  const auto& corelib = Library::Handle(Library::CoreLibrary());
-  const auto& name = String::Handle(String::New("_setHashIfNotSetYet"));
-  const auto& symbol = String::Handle(Symbols::New(thread, name));
-
-  const auto& function =
-      Function::Handle(corelib.LookupFunctionAllowPrivate(symbol));
-  const auto& object_class =
-      Class::Handle(corelib.LookupClass(Symbols::Object()));
-
-  auto& smi0 = Smi::Handle(Smi::New(0));
-  auto& smi21 = Smi::Handle(Smi::New(21));
-  auto& smi42 = Smi::Handle(Smi::New(42));
-  const auto& obj = Object::Handle(Instance::New(object_class));
-  const auto& args = Array::Handle(Array::New(2));
-
-  const auto& args_descriptor_array =
-      Array::Handle(ArgumentsDescriptor::NewBoxed(0, 2, Array::empty_array()));
-
-  // Initialized to 0
-  EXPECT_EQ(smi0.ptr(), Smi::New(GetHash(I, obj.ptr())));
-
-  // Lazily set to 42 on first call.
-  args.SetAt(0, obj);
-  args.SetAt(1, smi42);
-  EXPECT_EQ(smi42.ptr(),
-            DartEntry::InvokeFunction(function, args, args_descriptor_array));
-  EXPECT_EQ(smi42.ptr(), Smi::New(GetHash(I, obj.ptr())));
-
-  // Stays at 42 on subsequent calls.
-  args.SetAt(0, obj);
-  args.SetAt(1, smi21);
-  EXPECT_EQ(smi42.ptr(),
-            DartEntry::InvokeFunction(function, args, args_descriptor_array));
-  EXPECT_EQ(smi42.ptr(), Smi::New(GetHash(I, obj.ptr())));
-
-  // We test setting the maximum value our core libraries would use when
-  // installing an identity hash code (see
-  // sdk/lib/_internal/vm/lib/object_patch.dart:Object._objectHashCode)
-  //
-  // This value is representable as a positive Smi on all architectures (even
-  // compressed pointers).
-  const auto& smiMax = Smi::Handle(Smi::New(0x40000000 - 1));
-  const auto& obj2 = Object::Handle(Instance::New(object_class));
-
-  // Initialized to 0
-  EXPECT_EQ(smi0.ptr(), Smi::New(GetHash(I, obj2.ptr())));
-
-  // Lazily set to smiMax first call.
-  args.SetAt(0, obj2);
-  args.SetAt(1, smiMax);
-  EXPECT_EQ(smiMax.ptr(),
-            DartEntry::InvokeFunction(function, args, args_descriptor_array));
-  EXPECT_EQ(smiMax.ptr(), Smi::New(GetHash(I, obj2.ptr())));
-
-  // Stays at smiMax on subsequent calls.
-  args.SetAt(0, obj2);
-  args.SetAt(1, smi21);
-  EXPECT_EQ(smiMax.ptr(),
-            DartEntry::InvokeFunction(function, args, args_descriptor_array));
-  EXPECT_EQ(smiMax.ptr(), Smi::New(GetHash(I, obj2.ptr())));
-}
-
 }  // namespace dart
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index c4e02a9..e2f7b24 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -1452,21 +1452,35 @@
   __ Bind(normal_ir_body);
 }
 
+// Keep in sync with Instance::IdentityHashCode.
+// Note int and double never reach here because they override _identityHashCode.
+// Special cases are also not needed for null or bool because they were pre-set
+// during VM isolate finalization.
 void AsmIntrinsifier::Object_getHash(Assembler* assembler,
                                      Label* normal_ir_body) {
+  Label not_yet_computed;
   __ movq(RAX, Address(RSP, +1 * target::kWordSize));  // Object.
-  __ movl(RAX, FieldAddress(RAX, target::String::hash_offset()));
+  __ movl(RAX, FieldAddress(RAX, target::Object::tags_offset() +
+                                     target::UntaggedObject::kHashTagPos /
+                                         kBitsPerByte));
+  __ cmpl(RAX, Immediate(0));
+  __ j(EQUAL, &not_yet_computed, Assembler::kNearJump);
   __ SmiTag(RAX);
   __ ret();
-}
 
-void AsmIntrinsifier::Object_setHashIfNotSetYet(Assembler* assembler,
-                                                Label* normal_ir_body) {
-  ASSERT(target::String::hash_offset() == 4);
+  __ Bind(&not_yet_computed);
+  __ movq(RCX, Address(THR, target::Thread::random_offset()));
+  __ movq(RBX, RCX);
+  __ andq(RCX, Immediate(0xffffffff));   // state_lo
+  __ shrq(RBX, Immediate(32));           // state_hi
+  __ imulq(RCX, Immediate(0xffffda61));  // A
+  __ addq(RCX, RBX);                     // new_state = (A* state_lo) + state_hi
+  __ movq(Address(THR, target::Thread::random_offset()), RCX);
+  __ andq(RCX, Immediate(0x3fffffff));
+  __ cmpl(RCX, Immediate(0));
+  __ j(EQUAL, &not_yet_computed);
 
-  __ movq(RBX, Address(RSP, +2 * target::kWordSize));  // Object.
-  __ movq(RCX, Address(RSP, +1 * target::kWordSize));  // Value.
-  __ SmiUntag(RCX);
+  __ movq(RBX, Address(RSP, +1 * target::kWordSize));  // Object.
   __ MoveRegister(RDX, RCX);
   __ shlq(RDX, Immediate(32));
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index c17b697..a9a71ee 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -702,7 +702,6 @@
 }
 
 void Assembler::vmovsr(SRegister sn, Register rt, Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sn != kNoSRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -716,7 +715,6 @@
 }
 
 void Assembler::vmovrs(Register rt, SRegister sn, Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sn != kNoSRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -733,7 +731,6 @@
                         Register rt,
                         Register rt2,
                         Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sm != kNoSRegister);
   ASSERT(sm != S31);
   ASSERT(rt != kNoRegister);
@@ -755,7 +752,6 @@
                         Register rt2,
                         SRegister sm,
                         Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sm != kNoSRegister);
   ASSERT(sm != S31);
   ASSERT(rt != kNoRegister);
@@ -775,7 +771,6 @@
 }
 
 void Assembler::vmovdr(DRegister dn, int i, Register rt, Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((i == 0) || (i == 1));
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -793,7 +788,6 @@
                         Register rt,
                         Register rt2,
                         Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dm != kNoDRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -814,7 +808,6 @@
                         Register rt2,
                         DRegister dm,
                         Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dm != kNoDRegister);
   ASSERT(rt != kNoRegister);
   ASSERT(rt != SP);
@@ -833,7 +826,6 @@
 }
 
 void Assembler::vldrs(SRegister sd, Address ad, Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(cond != kNoCondition);
   int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
@@ -844,7 +836,6 @@
 }
 
 void Assembler::vstrs(SRegister sd, Address ad, Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(static_cast<Register>(ad.encoding_ & (0xf << kRnShift)) != PC);
   ASSERT(sd != kNoSRegister);
   ASSERT(cond != kNoCondition);
@@ -856,7 +847,6 @@
 }
 
 void Assembler::vldrd(DRegister dd, Address ad, Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(cond != kNoCondition);
   int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
@@ -867,7 +857,6 @@
 }
 
 void Assembler::vstrd(DRegister dd, Address ad, Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(static_cast<Register>(ad.encoding_ & (0xf << kRnShift)) != PC);
   ASSERT(dd != kNoDRegister);
   ASSERT(cond != kNoCondition);
@@ -884,7 +873,6 @@
                                  Register base,
                                  SRegister start,
                                  uint32_t count) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(base != kNoRegister);
   ASSERT(cond != kNoCondition);
   ASSERT(start != kNoSRegister);
@@ -904,7 +892,6 @@
                                  Register base,
                                  DRegister start,
                                  int32_t count) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(base != kNoRegister);
   ASSERT(cond != kNoCondition);
   ASSERT(start != kNoDRegister);
@@ -966,7 +953,6 @@
                            SRegister sd,
                            SRegister sn,
                            SRegister sm) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(sn != kNoSRegister);
   ASSERT(sm != kNoSRegister);
@@ -986,7 +972,6 @@
                            DRegister dd,
                            DRegister dn,
                            DRegister dm) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(dn != kNoDRegister);
   ASSERT(dm != kNoDRegister);
@@ -1149,7 +1134,6 @@
                           int32_t opcode,
                           SRegister sd,
                           DRegister dm) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(sd != kNoSRegister);
   ASSERT(dm != kNoDRegister);
   ASSERT(cond != kNoCondition);
@@ -1165,7 +1149,6 @@
                           int32_t opcode,
                           DRegister dd,
                           SRegister sm) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(dd != kNoDRegister);
   ASSERT(sm != kNoSRegister);
   ASSERT(cond != kNoCondition);
@@ -1234,7 +1217,6 @@
 }
 
 void Assembler::vmrs(Register rd, Condition cond) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT(cond != kNoCondition);
   int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B27 |
                      B26 | B25 | B23 | B22 | B21 | B20 | B16 |
@@ -1620,7 +1602,7 @@
 }
 
 void Assembler::SetupGlobalPoolAndDispatchTable() {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+  ASSERT(FLAG_precompiled_mode);
   ldr(PP, Address(THR, target::Thread::global_object_pool_offset()));
   if (FLAG_use_table_dispatch) {
     ldr(DISPATCH_TABLE_REG,
@@ -2526,24 +2508,16 @@
   PushList(kAbiPreservedCpuRegs);
 
   const DRegister firstd = EvenDRegisterOf(kAbiFirstPreservedFpuReg);
-  if (TargetCPUFeatures::vfp_supported()) {
     ASSERT(2 * kAbiPreservedFpuRegCount < 16);
     // Save FPU registers. 2 D registers per Q register.
     vstmd(DB_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
-  } else {
-    sub(SP, SP, Operand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
-  }
 }
 
 void Assembler::PopNativeCalleeSavedRegisters() {
   const DRegister firstd = EvenDRegisterOf(kAbiFirstPreservedFpuReg);
   // Restore C++ ABI callee-saved registers.
-  if (TargetCPUFeatures::vfp_supported()) {
-    // Restore FPU registers. 2 D registers per Q register.
-    vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
-  } else {
-    AddImmediate(SP, kAbiPreservedFpuRegCount * kFpuRegisterSize);
-  }
+  // Restore FPU registers. 2 D registers per Q register.
+  vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
   // Restore CPU registers.
   PopList(kAbiPreservedCpuRegs);
 }
@@ -3000,17 +2974,8 @@
                                 Register tmp1,
                                 Register tmp2,
                                 DRegister dtmp) {
-  if (TargetCPUFeatures::vfp_supported()) {
     LoadDFromOffset(dtmp, src, target::Double::value_offset() - kHeapObjectTag);
     StoreDToOffset(dtmp, dst, target::Double::value_offset() - kHeapObjectTag);
-  } else {
-    LoadFieldFromOffset(tmp1, src, target::Double::value_offset());
-    LoadFieldFromOffset(tmp2, src,
-                        target::Double::value_offset() + target::kWordSize);
-    StoreFieldToOffset(tmp1, dst, target::Double::value_offset());
-    StoreFieldToOffset(tmp2, dst,
-                       target::Double::value_offset() + target::kWordSize);
-  }
 }
 
 void Assembler::CopyFloat32x4Field(Register dst,
@@ -3215,7 +3180,6 @@
   if (TargetCPUFeatures::integer_division_supported()) {
     sdiv(result, left, right);
   } else {
-    ASSERT(TargetCPUFeatures::vfp_supported());
     SRegister stmpl = EvenSRegisterOf(tmpl);
     SRegister stmpr = EvenSRegisterOf(tmpr);
     vmovsr(stmpl, left);
@@ -3298,7 +3262,6 @@
   COMPILE_ASSERT((kDartVolatileCpuRegs & (1 << PP)) == 0);
 
   // Preserve all volatile FPU registers.
-  if (TargetCPUFeatures::vfp_supported()) {
     DRegister firstv = EvenDRegisterOf(kDartFirstVolatileFpuReg);
     DRegister lastv = OddDRegisterOf(kDartLastVolatileFpuReg);
     if ((lastv - firstv + 1) >= 16) {
@@ -3308,7 +3271,6 @@
     } else {
       vstmd(DB_W, SP, firstv, lastv - firstv + 1);
     }
-  }
 
   ReserveAlignedFrameSpace(frame_space);
 }
@@ -3318,9 +3280,7 @@
   // and ensure proper alignment of the stack frame.
   // We need to restore it before restoring registers.
   const intptr_t kPushedFpuRegisterSize =
-      TargetCPUFeatures::vfp_supported()
-          ? kDartVolatileFpuRegCount * kFpuRegisterSize
-          : 0;
+      kDartVolatileFpuRegCount * kFpuRegisterSize;
 
   COMPILE_ASSERT(PP < FP);
   COMPILE_ASSERT((kDartVolatileCpuRegs & (1 << PP)) == 0);
@@ -3331,7 +3291,6 @@
   AddImmediate(SP, FP, -kPushedRegistersSize);
 
   // Restore all volatile FPU registers.
-  if (TargetCPUFeatures::vfp_supported()) {
     DRegister firstv = EvenDRegisterOf(kDartFirstVolatileFpuReg);
     DRegister lastv = OddDRegisterOf(kDartLastVolatileFpuReg);
     if ((lastv - firstv + 1) >= 16) {
@@ -3341,7 +3300,6 @@
     } else {
       vldmd(IA_W, SP, firstv, lastv - firstv + 1);
     }
-  }
 
   // Restore volatile CPU registers.
   RESTORES_LR_FROM_FRAME(
@@ -3361,7 +3319,7 @@
   COMPILE_ASSERT(CODE_REG < FP);
   COMPILE_ASSERT(FP < LINK_REGISTER.code);
 
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     SPILLS_LR_TO_FRAME(
         EnterFrame((1 << PP) | (1 << CODE_REG) | (1 << FP) | (1 << LR), 0));
 
@@ -3391,7 +3349,7 @@
 }
 
 void Assembler::LeaveDartFrame() {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     ldr(PP, Address(FP, target::frame_layout.saved_caller_pp_from_fp *
                             target::kWordSize));
   }
@@ -3403,7 +3361,7 @@
 }
 
 void Assembler::LeaveDartFrameAndReturn() {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     ldr(PP, Address(FP, target::frame_layout.saved_caller_pp_from_fp *
                             target::kWordSize));
   }
@@ -3747,6 +3705,18 @@
   }
 }
 
+void Assembler::LoadStaticFieldAddress(Register address,
+                                       Register field,
+                                       Register scratch) {
+  LoadCompressedFieldFromOffset(
+      scratch, field, target::Field::host_offset_or_field_id_offset());
+  const intptr_t field_table_offset =
+      compiler::target::Thread::field_table_values_offset();
+  LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));
+  add(address, address,
+      Operand(scratch, LSL, target::kWordSizeLog2 - kSmiTagShift));
+}
+
 void Assembler::LoadFieldAddressForRegOffset(Register address,
                                              Register instance,
                                              Register offset_in_words_as_smi) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index e98eef8..457b1da 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -1346,6 +1346,10 @@
                                      Register array,
                                      Register index);
 
+  void LoadStaticFieldAddress(Register address,
+                              Register field,
+                              Register scratch);
+
   void LoadCompressedFieldAddressForRegOffset(Register address,
                                               Register instance,
                                               Register offset_in_words_as_smi) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 8aed5c6..3bfb9a8 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -1565,7 +1565,7 @@
 }
 
 void Assembler::SetupGlobalPoolAndDispatchTable() {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+  ASSERT(FLAG_precompiled_mode);
   ldr(PP, Address(THR, target::Thread::global_object_pool_offset()));
   sub(PP, PP, Operand(kHeapObjectTag));  // Pool in PP is untagged!
   if (FLAG_use_table_dispatch) {
@@ -1648,7 +1648,7 @@
   // Setup the frame.
   EnterFrame(0);
 
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     TagAndPushPPAndPcMarker();  // Save PP and PC marker.
 
     // Load the pool pointer.
@@ -1683,7 +1683,7 @@
 }
 
 void Assembler::LeaveDartFrame(RestorePP restore_pp) {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     if (restore_pp == kRestoreCallerPP) {
       // Restore and untag PP.
       LoadFromOffset(
@@ -1820,7 +1820,7 @@
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_size, bool is_leaf) {
   Comment("EnterCallRuntimeFrame");
   EnterFrame(0);
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     TagAndPushPPAndPcMarker();  // Save PP and PC marker.
   }
 
@@ -2263,6 +2263,18 @@
   }
 }
 
+void Assembler::LoadStaticFieldAddress(Register address,
+                                       Register field,
+                                       Register scratch) {
+  LoadCompressedSmiFieldFromOffset(
+      scratch, field, target::Field::host_offset_or_field_id_offset());
+  const intptr_t field_table_offset =
+      compiler::target::Thread::field_table_values_offset();
+  LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));
+  add(address, address,
+      Operand(scratch, LSL, target::kWordSizeLog2 - kSmiTagShift));
+}
+
 void Assembler::LoadCompressedFieldAddressForRegOffset(
     Register address,
     Register instance,
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index d2432b5..886ab74 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -2212,6 +2212,10 @@
                                         Register array,
                                         Register index);
 
+  void LoadStaticFieldAddress(Register address,
+                              Register field,
+                              Register scratch);
+
   void LoadCompressedFieldAddressForRegOffset(Register address,
                                               Register instance,
                                               Register offset_in_words_as_smi);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index a54fe57..97ce2ab 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -15,6 +15,13 @@
 namespace compiler {
 #define __ assembler->
 
+#if defined(PRODUCT)
+#define EXPECT_DISASSEMBLY(expected)
+#else
+#define EXPECT_DISASSEMBLY(expected)                                           \
+  EXPECT_STREQ(expected, test->RelativeDisassembly())
+#endif
+
 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
   __ add(R0, ZR, Operand(ZR));
   __ add(R0, R0, Operand(42));
@@ -24,6 +31,10 @@
 ASSEMBLER_TEST_RUN(Simple, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "add r0, zr, zr\n"
+      "add r0, r0, #0x2a\n"
+      "ret\n");
 }
 
 // Move wide immediate tests.
@@ -36,6 +47,9 @@
 ASSEMBLER_TEST_RUN(Movz0, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movz1, assembler) {
@@ -47,6 +61,10 @@
 ASSEMBLER_TEST_RUN(Movz1, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r0, #0x2a lsl 16\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movz2, assembler) {
@@ -57,6 +75,9 @@
 ASSEMBLER_TEST_RUN(Movz2, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a lsl 32\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movz3, assembler) {
@@ -67,6 +88,9 @@
 ASSEMBLER_TEST_RUN(Movz3, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a lsl 48\n"
+      "ret\n");
 }
 
 // movn
@@ -78,6 +102,9 @@
 ASSEMBLER_TEST_RUN(Movn0, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movn1, assembler) {
@@ -88,6 +115,9 @@
 ASSEMBLER_TEST_RUN(Movn1, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x2a lsl 16\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movn2, assembler) {
@@ -98,6 +128,9 @@
 ASSEMBLER_TEST_RUN(Movn2, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x2a lsl 32\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movn3, assembler) {
@@ -108,6 +141,9 @@
 ASSEMBLER_TEST_RUN(Movn3, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x2a lsl 48\n"
+      "ret\n");
 }
 
 // movk
@@ -121,6 +157,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42LL | (1LL << 48),
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x1 lsl 48\n"
+      "movk r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movk1, assembler) {
@@ -133,6 +173,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ((42LL << 16) | 1,
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x1\n"
+      "movk r0, #0x2a lsl 16\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movk2, assembler) {
@@ -145,6 +189,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ((42LL << 32) | 1,
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x1\n"
+      "movk r0, #0x2a lsl 32\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Movk3, assembler) {
@@ -157,6 +205,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ((42LL << 48) | 1,
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x1\n"
+      "movk r0, #0x2a lsl 48\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(MovzBig, assembler) {
@@ -167,6 +219,9 @@
 ASSEMBLER_TEST_RUN(MovzBig, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x8000\n"
+      "ret\n");
 }
 
 // add tests.
@@ -180,6 +235,11 @@
 ASSEMBLER_TEST_RUN(AddReg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x14\n"
+      "movz r1, #0x16\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) {
@@ -192,6 +252,11 @@
 ASSEMBLER_TEST_RUN(AddLSLReg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x14\n"
+      "movz r1, #0xb\n"
+      "add r0, r0, r1 lsl #1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) {
@@ -204,6 +269,11 @@
 ASSEMBLER_TEST_RUN(AddLSRReg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x14\n"
+      "movz r1, #0x2c\n"
+      "add r0, r0, r1 lsr #1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) {
@@ -216,6 +286,11 @@
 ASSEMBLER_TEST_RUN(AddASRReg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x14\n"
+      "movz r1, #0x2c\n"
+      "add r0, r0, r1 asr #1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) {
@@ -229,6 +304,12 @@
 ASSEMBLER_TEST_RUN(AddASRNegReg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2b\n"
+      "movn r1, #0x0\n"
+      "add r1, zr, r1 lsl #3\n"
+      "add r0, r0, r1 asr #3\n"
+      "ret\n");
 }
 
 // TODO(zra): test other sign extension modes.
@@ -243,6 +324,12 @@
 ASSEMBLER_TEST_RUN(AddExtReg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2b\n"
+      "movz r1, #0xffff\n"
+      "movk r1, #0xffff lsl 16\n"
+      "add r0, r0, r1 sxtw\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AddCarryInOut, assembler) {
@@ -258,6 +345,14 @@
 ASSEMBLER_TEST_RUN(AddCarryInOut, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r2, #0x0\n"
+      "movz r1, #0x1\n"
+      "movz r0, #0x0\n"
+      "adds ip0, r2, r1\n"
+      "adcs ip0, r2, r0\n"
+      "adc r0, r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(SubCarryInOut, assembler) {
@@ -272,6 +367,13 @@
 ASSEMBLER_TEST_RUN(SubCarryInOut, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x1\n"
+      "movz r0, #0x0\n"
+      "subs ip0, r0, r1\n"
+      "sbcs ip0, r0, r0\n"
+      "sbc r0, r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Overflow, assembler) {
@@ -288,6 +390,15 @@
 ASSEMBLER_TEST_RUN(Overflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0x1\n"
+      "movn r2, #0x0\n"
+      "mov r3, 0x7fffffffffffffff\n"
+      "adds ip0, r2, r1\n"
+      "adcs ip0, r3, r0\n"
+      "csinc r0, r0, r0, vs\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(WordAddCarryInOut, assembler) {
@@ -303,6 +414,14 @@
 ASSEMBLER_TEST_RUN(WordAddCarryInOut, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r2, #0x0\n"
+      "movz r1, #0x1\n"
+      "movz r0, #0x0\n"
+      "addws ip0, r2, r1\n"
+      "adcws ip0, r2, r0\n"
+      "adcw r0, r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(WordSubCarryInOut, assembler) {
@@ -317,6 +436,13 @@
 ASSEMBLER_TEST_RUN(WordSubCarryInOut, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x0FFFFFFFF, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x1\n"
+      "movz r0, #0x0\n"
+      "subws ip0, r0, r1\n"
+      "sbcws ip0, r0, r0\n"
+      "sbcw r0, r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(WordOverflow, assembler) {
@@ -333,6 +459,15 @@
 ASSEMBLER_TEST_RUN(WordOverflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0x1\n"
+      "mov r2, 0xffffffff\n"
+      "mov r3, 0x7fffffff\n"
+      "addws ip0, r2, r1\n"
+      "adcws ip0, r3, r0\n"
+      "csinc r0, r0, r0, vs\n"
+      "ret\n");
 }
 
 // Loads and Stores.
@@ -353,6 +488,16 @@
 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "sub csp, csp, #0x10\n"
+      "movz r0, #0x2b\n"
+      "movz r1, #0x2a\n"
+      "str r1, [r15, #-8]!\n"
+      "ldr r0, [r15], #8 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) {
@@ -369,6 +514,16 @@
 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r0, #0x2b\n"
+      "movz r1, #0x2a\n"
+      "add r2, r15, #0x1\n"
+      "str r1, [r2, #-1]\n"
+      "ldr r0, [r2, #-1]\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) {
@@ -392,6 +547,17 @@
 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "sub csp, csp, #0x100\n"
+      "movz r0, #0x2b\n"
+      "movz r1, #0x2a\n"
+      "str r1, [r15, #-256]!\n"
+      "ldr r0, [r15], #248 !\n"
+      "add r15, r15, #0x8\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) {
@@ -410,6 +576,18 @@
 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r0, #0x2b\n"
+      "movz r1, #0x2a\n"
+      "sub r15, r15, #0x1000\n"
+      "and csp, r15, 0xfffffffffffffff0\n"
+      "str r1, [r15, #4096]\n"
+      "add r15, r15, #0x1000\n"
+      "ldr r0, [r15]\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) {
@@ -432,6 +610,20 @@
 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r0, #0x2b\n"
+      "movz r1, #0x2a\n"
+      "movz r2, #0xfff8\n"
+      "movk r2, #0xffff lsl 16\n"
+      "str r1, [r15, r2 sxtw]\n"
+      "sub r15, r15, #0x8\n"
+      "and csp, r15, 0xfffffffffffffff0\n"
+      "ldr r0, [r15]\n"
+      "add r15, r15, #0x8\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) {
@@ -452,6 +644,19 @@
 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r0, #0x2b\n"
+      "movz r1, #0x2a\n"
+      "movz r2, #0xa\n"
+      "sub r15, r15, #0x50\n"
+      "and csp, r15, 0xfffffffffffffff0\n"
+      "str r1, [r15, r2 uxtx scaled]\n"
+      "ldr r0, [r15, r2 uxtx scaled]\n"
+      "add r15, r15, #0x50\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) {
@@ -471,6 +676,16 @@
 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "sub csp, csp, #0x10\n"
+      "mov r1, 0xffffffff\n"
+      "strw r1, [r15, #-4]!\n"
+      "ldrsw r0, [r15]\n"
+      "ldrsw r1, [r15], #4 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(SimpleLoadStorePair, assembler) {
@@ -491,6 +706,17 @@
 ASSEMBLER_TEST_RUN(SimpleLoadStorePair, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "sub csp, csp, #0x10\n"
+      "movz r2, #0x2b\n"
+      "movz r3, #0x2a\n"
+      "stp r2, r3, [r15, #-16]!\n"
+      "ldp r0, r1, [r15], #16 !\n"
+      "sub r0, r0, r1\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadStorePairOffset, assembler) {
@@ -510,6 +736,19 @@
 ASSEMBLER_TEST_RUN(LoadStorePairOffset, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r2, #0x2b\n"
+      "movz r3, #0x2a\n"
+      "sub r15, r15, #0x20\n"
+      "and csp, r15, 0xfffffffffffffff0\n"
+      "stp r2, r3, [r15, #16]\n"
+      "ldp r0, r1, [r15, #16]\n"
+      "add r15, r15, #0x20\n"
+      "sub r0, r0, r1\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(PushRegisterPair, assembler) {
@@ -527,6 +766,16 @@
   EXPECT(test != NULL);
   typedef int (*PushRegisterPair)() DART_UNUSED;
   EXPECT_EQ(12, EXECUTE_TEST_CODE_INT64(PushRegisterPair, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r2, #0xc\n"
+      "movz r3, #0x15\n"
+      "stp r2, r3, [r15, #-16]!\n"
+      "ldr r0, [r15], #8 !\n"
+      "ldr r1, [r15], #8 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(PushRegisterPairReversed, assembler) {
@@ -545,6 +794,16 @@
   typedef int (*PushRegisterPairReversed)() DART_UNUSED;
   EXPECT_EQ(12,
             EXECUTE_TEST_CODE_INT64(PushRegisterPairReversed, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r3, #0xc\n"
+      "movz r2, #0x15\n"
+      "stp r3, r2, [r15, #-16]!\n"
+      "ldr r0, [r15], #8 !\n"
+      "ldr r1, [r15], #8 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(PopRegisterPair, assembler) {
@@ -562,6 +821,16 @@
   EXPECT(test != NULL);
   typedef int (*PopRegisterPair)() DART_UNUSED;
   EXPECT_EQ(12, EXECUTE_TEST_CODE_INT64(PopRegisterPair, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r2, #0xc\n"
+      "movz r3, #0x15\n"
+      "str r3, [r15, #-8]!\n"
+      "str r2, [r15, #-8]!\n"
+      "ldp r0, r1, [r15], #16 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(PopRegisterPairReversed, assembler) {
@@ -580,6 +849,16 @@
   typedef int (*PopRegisterPairReversed)() DART_UNUSED;
   EXPECT_EQ(12,
             EXECUTE_TEST_CODE_INT64(PopRegisterPairReversed, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r3, #0xc\n"
+      "movz r2, #0x15\n"
+      "str r3, [r15, #-8]!\n"
+      "str r2, [r15, #-8]!\n"
+      "ldp r1, r0, [r15], #16 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) {
@@ -602,6 +881,19 @@
   EXPECT(test != NULL);
   typedef intptr_t (*Semaphore)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r0, #0x28\n"
+      "movz r1, #0x2a\n"
+      "str r0, [r15, #-8]!\n"
+      "ldxr r0, r15\n"
+      "stxr ip0, r1, r15\n"
+      "cmp ip0, #0x0\n"
+      "bne -12\n"
+      "ldr r0, [r15], #8 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) {
@@ -622,6 +914,19 @@
   EXPECT(test != NULL);
   typedef intptr_t (*FailedSemaphore)() DART_UNUSED;
   EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r0, #0x28\n"
+      "movz r1, #0x2a\n"
+      "str r0, [r15, #-8]!\n"
+      "ldxr r0, r15\n"
+      "clrex\n"
+      "stxr ip0, r1, r15\n"
+      "ldr r0, [r15], #8 !\n"
+      "add r0, r0, ip0\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Semaphore32, assembler) {
@@ -653,6 +958,21 @@
   // is unchanged at 40.
   EXPECT_EQ(42 + (DART_INT64_C(40) << 32),
             EXECUTE_TEST_CODE_INT64(Semaphore32, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r0, #0x28\n"
+      "add r0, r0, r0 lsl #32\n"
+      "str r0, [r15, #-8]!\n"
+      "movz r0, #0x28\n"
+      "movz r1, #0x2a\n"
+      "ldxrw r0, r15\n"
+      "stxrw ip0, r1, r15\n"
+      "cmp ip0, #0x0\n"
+      "bne -12\n"
+      "ldr r0, [r15], #8 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FailedSemaphore32, assembler) {
@@ -680,6 +1000,21 @@
   // unchanged at 40.
   EXPECT_EQ(41 + (DART_INT64_C(40) << 32),
             EXECUTE_TEST_CODE_INT64(FailedSemaphore32, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz r0, #0x28\n"
+      "add r0, r0, r0 lsl #32\n"
+      "str r0, [r15, #-8]!\n"
+      "movz r0, #0x28\n"
+      "movz r1, #0x2a\n"
+      "ldxrw r0, r15\n"
+      "clrex\n"
+      "stxrw ip0, r1, r15\n"
+      "ldr r0, [r15], #8 !\n"
+      "add r0, r0, ip0\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadAcquireStoreRelease, assembler) {
@@ -736,6 +1071,68 @@
   typedef intptr_t (*LoadAcquireStoreRelease)() DART_UNUSED;
   EXPECT_EQ(0x42,
             EXECUTE_TEST_CODE_INT64(LoadAcquireStoreRelease, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "stp fp, lr, [r15, #-16]!\n"
+      "mov fp, r15\n"
+      "movz ip0, #0x7788\n"
+      "movk ip0, #0x5566 lsl 16\n"
+      "movk ip0, #0x3344 lsl 32\n"
+      "movk ip0, #0x1122 lsl 48\n"
+      "str ip0, [r15, #-8]!\n"
+      "ldar r1, r15\n"
+      "movz ip1, #0x7788\n"
+      "movk ip1, #0x5566 lsl 16\n"
+      "movk ip1, #0x3344 lsl 32\n"
+      "movk ip1, #0x1122 lsl 48\n"
+      "cmp r1, ip1\n"
+      "bne +164\n"
+      "add r15, r15, #0x8\n"
+      "movz ip0, #0x7788\n"
+      "movk ip0, #0x5566 lsl 16\n"
+      "movk ip0, #0x3344 lsl 32\n"
+      "movk ip0, #0x1122 lsl 48\n"
+      "str ip0, [r15, #-8]!\n"
+      "ldarw r1, r15\n"
+      "movz ip1, #0x7788\n"
+      "movk ip1, #0x5566 lsl 16\n"
+      "cmp r1, ip1\n"
+      "bne +120\n"
+      "add r15, r15, #0x8\n"
+      "movz ip0, #0x0\n"
+      "str ip0, [r15, #-8]!\n"
+      "movz r1, #0x7788\n"
+      "movk r1, #0x5566 lsl 16\n"
+      "movk r1, #0x3344 lsl 32\n"
+      "movk r1, #0x1122 lsl 48\n"
+      "stlr r1, r15\n"
+      "ldr r1, [r15], #8 !\n"
+      "movz ip1, #0x7788\n"
+      "movk ip1, #0x5566 lsl 16\n"
+      "movk ip1, #0x3344 lsl 32\n"
+      "movk ip1, #0x1122 lsl 48\n"
+      "cmp r1, ip1\n"
+      "bne +60\n"
+      "movz ip0, #0x0\n"
+      "str ip0, [r15, #-8]!\n"
+      "movz r1, #0x7788\n"
+      "movk r1, #0x5566 lsl 16\n"
+      "movk r1, #0x3344 lsl 32\n"
+      "movk r1, #0x1122 lsl 48\n"
+      "stlrw r1, r15\n"
+      "ldr r1, [r15], #8 !\n"
+      "movz ip1, #0x7788\n"
+      "movk ip1, #0x5566 lsl 16\n"
+      "cmp r1, ip1\n"
+      "bne +12\n"
+      "movz r0, #0x42\n"
+      "b +8\n"
+      "movz r0, #0x84\n"
+      "mov r15, fp\n"
+      "ldp fp, lr, [r15], #16 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 // Logical register operations.
@@ -749,6 +1146,11 @@
 ASSEMBLER_TEST_RUN(AndRegs, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2b\n"
+      "movz r2, #0x2a\n"
+      "and r0, r1, r2\n"
+      "ret\n");
 }
 
 constexpr uint64_t kU64MinusOne = 0xffffffffffffffffull;
@@ -1108,6 +1510,123 @@
 #undef FOR_EACH_LSR_32_TESTS_LIST
 #undef FOR_EACH_ASR_32_TESTS_LIST
 
+ASSEMBLER_TEST_GENERATE(LslImmediate, assembler) {
+  __ LslImmediate(R0, R0, 1);
+  __ LslImmediate(R0, R0, 2);
+  __ LslImmediate(R0, R0, 3);
+  __ LslImmediate(R0, R0, 4);
+  __ LslImmediate(R0, R0, 60);
+  __ LslImmediate(R0, R0, 61);
+  __ LslImmediate(R0, R0, 62);
+  __ LslImmediate(R0, R0, 63);
+  __ LslImmediate(R0, R0, 1, kFourBytes);
+  __ LslImmediate(R0, R0, 2, kFourBytes);
+  __ LslImmediate(R0, R0, 3, kFourBytes);
+  __ LslImmediate(R0, R0, 4, kFourBytes);
+  __ LslImmediate(R0, R0, 28, kFourBytes);
+  __ LslImmediate(R0, R0, 29, kFourBytes);
+  __ LslImmediate(R0, R0, 30, kFourBytes);
+  __ LslImmediate(R0, R0, 31, kFourBytes);
+}
+
+ASSEMBLER_TEST_RUN(LslImmediate, test) {
+  EXPECT_DISASSEMBLY(
+      "lsl r0, r0, #1\n"
+      "lsl r0, r0, #2\n"
+      "lsl r0, r0, #3\n"
+      "lsl r0, r0, #4\n"
+      "lsl r0, r0, #60\n"
+      "lsl r0, r0, #61\n"
+      "lsl r0, r0, #62\n"
+      "lsl r0, r0, #63\n"
+      "lslw r0, r0, #1\n"
+      "lslw r0, r0, #2\n"
+      "lslw r0, r0, #3\n"
+      "lslw r0, r0, #4\n"
+      "lslw r0, r0, #28\n"
+      "lslw r0, r0, #29\n"
+      "lslw r0, r0, #30\n"
+      "lslw r0, r0, #31\n");
+}
+
+ASSEMBLER_TEST_GENERATE(LsrImmediate, assembler) {
+  __ LsrImmediate(R0, R0, 1);
+  __ LsrImmediate(R0, R0, 2);
+  __ LsrImmediate(R0, R0, 3);
+  __ LsrImmediate(R0, R0, 4);
+  __ LsrImmediate(R0, R0, 60);
+  __ LsrImmediate(R0, R0, 61);
+  __ LsrImmediate(R0, R0, 62);
+  __ LsrImmediate(R0, R0, 63);
+  __ LsrImmediate(R0, R0, 1, kFourBytes);
+  __ LsrImmediate(R0, R0, 2, kFourBytes);
+  __ LsrImmediate(R0, R0, 3, kFourBytes);
+  __ LsrImmediate(R0, R0, 4, kFourBytes);
+  __ LsrImmediate(R0, R0, 28, kFourBytes);
+  __ LsrImmediate(R0, R0, 29, kFourBytes);
+  __ LsrImmediate(R0, R0, 30, kFourBytes);
+  __ LsrImmediate(R0, R0, 31, kFourBytes);
+}
+
+ASSEMBLER_TEST_RUN(LsrImmediate, test) {
+  EXPECT_DISASSEMBLY(
+      "lsr r0, r0, #1\n"
+      "lsr r0, r0, #2\n"
+      "lsr r0, r0, #3\n"
+      "lsr r0, r0, #4\n"
+      "lsr r0, r0, #60\n"
+      "lsr r0, r0, #61\n"
+      "lsr r0, r0, #62\n"
+      "lsr r0, r0, #63\n"
+      "lsrw r0, r0, #1\n"
+      "lsrw r0, r0, #2\n"
+      "lsrw r0, r0, #3\n"
+      "lsrw r0, r0, #4\n"
+      "lsrw r0, r0, #28\n"
+      "lsrw r0, r0, #29\n"
+      "lsrw r0, r0, #30\n"
+      "lsrw r0, r0, #31\n");
+}
+
+ASSEMBLER_TEST_GENERATE(AsrImmediate, assembler) {
+  __ AsrImmediate(R0, R0, 1);
+  __ AsrImmediate(R0, R0, 2);
+  __ AsrImmediate(R0, R0, 3);
+  __ AsrImmediate(R0, R0, 4);
+  __ AsrImmediate(R0, R0, 60);
+  __ AsrImmediate(R0, R0, 61);
+  __ AsrImmediate(R0, R0, 62);
+  __ AsrImmediate(R0, R0, 63);
+  __ AsrImmediate(R0, R0, 1, kFourBytes);
+  __ AsrImmediate(R0, R0, 2, kFourBytes);
+  __ AsrImmediate(R0, R0, 3, kFourBytes);
+  __ AsrImmediate(R0, R0, 4, kFourBytes);
+  __ AsrImmediate(R0, R0, 28, kFourBytes);
+  __ AsrImmediate(R0, R0, 29, kFourBytes);
+  __ AsrImmediate(R0, R0, 30, kFourBytes);
+  __ AsrImmediate(R0, R0, 31, kFourBytes);
+}
+
+ASSEMBLER_TEST_RUN(AsrImmediate, test) {
+  EXPECT_DISASSEMBLY(
+      "asr r0, r0, #1\n"
+      "asr r0, r0, #2\n"
+      "asr r0, r0, #3\n"
+      "asr r0, r0, #4\n"
+      "asr r0, r0, #60\n"
+      "asr r0, r0, #61\n"
+      "asr r0, r0, #62\n"
+      "asr r0, r0, #63\n"
+      "asrw r0, r0, #1\n"
+      "asrw r0, r0, #2\n"
+      "asrw r0, r0, #3\n"
+      "asrw r0, r0, #4\n"
+      "asrw r0, r0, #28\n"
+      "asrw r0, r0, #29\n"
+      "asrw r0, r0, #30\n"
+      "asrw r0, r0, #31\n");
+}
+
 ASSEMBLER_TEST_GENERATE(AndShiftRegs, assembler) {
   __ movz(R1, Immediate(42), 0);
   __ movz(R2, Immediate(21), 0);
@@ -1118,6 +1637,11 @@
 ASSEMBLER_TEST_RUN(AndShiftRegs, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x15\n"
+      "and r0, r1, r2 lsl #1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(BicRegs, assembler) {
@@ -1130,6 +1654,11 @@
 ASSEMBLER_TEST_RUN(BicRegs, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x5\n"
+      "bic r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(OrrRegs, assembler) {
@@ -1142,6 +1671,11 @@
 ASSEMBLER_TEST_RUN(OrrRegs, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x20\n"
+      "movz r2, #0xa\n"
+      "orr r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(OrnRegs, assembler) {
@@ -1155,6 +1689,12 @@
 ASSEMBLER_TEST_RUN(OrnRegs, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x20\n"
+      "movn r2, #0x0\n"
+      "movk r2, #0xffd5\n"
+      "orn r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(EorRegs, assembler) {
@@ -1167,6 +1707,11 @@
 ASSEMBLER_TEST_RUN(EorRegs, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0xffd5\n"
+      "movz r2, #0xffff\n"
+      "eor r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(EonRegs, assembler) {
@@ -1179,6 +1724,11 @@
 ASSEMBLER_TEST_RUN(EonRegs, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0xffd5\n"
+      "movn r2, #0xffff\n"
+      "eon r0, r1, r2\n"
+      "ret\n");
 }
 
 // Logical immediate operations.
@@ -1191,6 +1741,10 @@
 ASSEMBLER_TEST_RUN(AndImm, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "and r0, r1, 0xaaaaaaaaaaaaaaaa\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AndImmCsp, assembler) {
@@ -1207,6 +1761,14 @@
 ASSEMBLER_TEST_RUN(AndImmCsp, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov ip0, csp\n"
+      "sub ip1, csp, #0x1f\n"
+      "and csp, ip1, 0xfffffffffffffff0\n"
+      "mov r0, csp\n"
+      "sub r0, ip0, r0\n"
+      "mov csp, ip0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) {
@@ -1218,6 +1780,10 @@
 ASSEMBLER_TEST_RUN(AndOneImm, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2b\n"
+      "and r0, r1, 0x1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(OrrImm, assembler) {
@@ -1233,6 +1799,14 @@
 ASSEMBLER_TEST_RUN(OrrImm, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x0\n"
+      "movz r2, #0x3f\n"
+      "movz r3, #0xa\n"
+      "orr r1, r1, 0x20002000200020\n"
+      "orr r1, r1, r3\n"
+      "and r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(EorImm, assembler) {
@@ -1247,6 +1821,13 @@
 ASSEMBLER_TEST_RUN(EorImm, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x0\n"
+      "movk r0, #0xffd5\n"
+      "movz r1, #0x3f\n"
+      "eor r0, r0, 0x3f3f3f3f3f3f3f3f\n"
+      "and r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Clz, assembler) {
@@ -1277,6 +1858,26 @@
 ASSEMBLER_TEST_RUN(Clz, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "clz r1, zr\n"
+      "cmp r1, #0x40\n"
+      "bne +60\n"
+      "movz r2, #0x2a\n"
+      "clz r2, r2\n"
+      "cmp r2, #0x3a\n"
+      "bne +44\n"
+      "movn r0, #0x0\n"
+      "clz r1, r0\n"
+      "cmp r1, #0x0\n"
+      "bne +28\n"
+      "add r0, zr, r0 lsr #3\n"
+      "clz r1, r0\n"
+      "cmp r1, #0x3\n"
+      "bne +12\n"
+      "mov r0, zr\n"
+      "ret\n"
+      "movz r0, #0x1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Clzw, assembler) {
@@ -1315,6 +1916,34 @@
 ASSEMBLER_TEST_RUN(Clzw, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "clzw r1, zr\n"
+      "cmp r1, #0x20\n"
+      "bne +92\n"
+      "movz r2, #0x2a\n"
+      "clzw r2, r2\n"
+      "cmp r2, #0x1a\n"
+      "bne +76\n"
+      "movn r0, #0x0\n"
+      "clzw r1, r0\n"
+      "cmp r1, #0x0\n"
+      "bne +60\n"
+      "add r0, zr, r0 lsr #35\n"
+      "clzw r1, r0\n"
+      "cmp r1, #0x3\n"
+      "bne +44\n"
+      "mov r0, 0xffffffff0fffffff\n"
+      "clzw r1, r0\n"
+      "cmp r1, #0x4\n"
+      "bne +28\n"
+      "mov r0, 0xffffffff\n"
+      "clzw r1, r0\n"
+      "cmp r1, #0x0\n"
+      "bne +12\n"
+      "mov r0, zr\n"
+      "ret\n"
+      "movz r0, #0x1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Rbit, assembler) {
@@ -1328,6 +1957,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   const int64_t expected = 0xa800000000000000;
   EXPECT_EQ(expected, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x15\n"
+      "rbit r0, r0\n"
+      "ret\n");
 }
 
 // Comparisons, branching.
@@ -1343,6 +1976,11 @@
 ASSEMBLER_TEST_RUN(BranchALForward, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "b +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(BranchALBackwards, assembler) {
@@ -1364,6 +2002,15 @@
 ASSEMBLER_TEST_RUN(BranchALBackwards, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "b +16\n"
+      "movz r0, #0x0\n"
+      "ret\n"
+      "movz r0, #0x0\n"
+      "b -8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpEqBranch, assembler) {
@@ -1383,6 +2030,14 @@
 ASSEMBLER_TEST_RUN(CmpEqBranch, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0xea\n"
+      "movz r2, #0xea\n"
+      "cmp r1, r2\n"
+      "beq +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpEqBranchNotTaken, assembler) {
@@ -1402,6 +2057,14 @@
 ASSEMBLER_TEST_RUN(CmpEqBranchNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0xe9\n"
+      "movz r2, #0xea\n"
+      "cmp r1, r2\n"
+      "beq +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpEq1Branch, assembler) {
@@ -1420,6 +2083,13 @@
 ASSEMBLER_TEST_RUN(CmpEq1Branch, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x1\n"
+      "cmp r1, #0x1\n"
+      "beq +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmnEq1Branch, assembler) {
@@ -1438,6 +2108,13 @@
 ASSEMBLER_TEST_RUN(CmnEq1Branch, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movn r1, #0x0\n"
+      "cmn r1, #0x1\n"
+      "beq +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpLtBranch, assembler) {
@@ -1457,6 +2134,14 @@
 ASSEMBLER_TEST_RUN(CmpLtBranch, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0xe9\n"
+      "movz r2, #0xea\n"
+      "cmp r1, r2\n"
+      "blt +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpLtBranchNotTaken, assembler) {
@@ -1476,6 +2161,14 @@
 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0xeb\n"
+      "movz r2, #0xea\n"
+      "cmp r1, r2\n"
+      "blt +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpBranchIfZero, assembler) {
@@ -1493,6 +2186,12 @@
 ASSEMBLER_TEST_RUN(CmpBranchIfZero, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x0\n"
+      "cbz r1, +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpBranchIfZeroNotTaken, assembler) {
@@ -1510,6 +2209,12 @@
 ASSEMBLER_TEST_RUN(CmpBranchIfZeroNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0x1\n"
+      "cbz r1, +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpBranchIfNotZero, assembler) {
@@ -1527,6 +2232,12 @@
 ASSEMBLER_TEST_RUN(CmpBranchIfNotZero, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x1\n"
+      "cbnz r1, +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CmpBranchIfNotZeroNotTaken, assembler) {
@@ -1544,6 +2255,12 @@
 ASSEMBLER_TEST_RUN(CmpBranchIfNotZeroNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0x0\n"
+      "cbnz r1, +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 static const int64_t kBits5And35 = (1 << 5) | (1ll << 35);
@@ -1568,6 +2285,15 @@
 ASSEMBLER_TEST_RUN(TstBranchIfZero, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movn r1, #0x8 lsl 32\n"
+      "movk r1, #0xffdf\n"
+      "tbzw r1, #5, +8\n"
+      "movz r0, #0x0\n"
+      "tbz r1, #35, +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(TstBranchIfZeroNotTaken, assembler) {
@@ -1585,6 +2311,13 @@
 ASSEMBLER_TEST_RUN(TstBranchIfZeroNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0x20\n"
+      "movk r1, #0x8 lsl 32\n"
+      "tbzw r1, #5, +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(TstBranchIfNotZero, assembler) {
@@ -1607,6 +2340,15 @@
 ASSEMBLER_TEST_RUN(TstBranchIfNotZero, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x20\n"
+      "movk r1, #0x8 lsl 32\n"
+      "tbnzw r1, #5, +8\n"
+      "movz r0, #0x0\n"
+      "tbnz r1, #35, +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(TstBranchIfNotZeroNotTaken, assembler) {
@@ -1624,6 +2366,13 @@
 ASSEMBLER_TEST_RUN(TstBranchIfNotZeroNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movn r1, #0x8 lsl 32\n"
+      "movk r1, #0xffdf\n"
+      "tbnzw r1, #5, +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(TstBranchIfZeroFar, assembler) {
@@ -1689,6 +2438,20 @@
 ASSEMBLER_TEST_RUN(FcmpEqBranch, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0x406d lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0x406d lsl 48\n"
+      "fmovdr v2, ip0\n"
+      "fcmpd v1, v2\n"
+      "beq +12\n"
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(TstBranchIfZeroFar1, assembler) {
@@ -1782,6 +2545,20 @@
 ASSEMBLER_TEST_RUN(FcmpEqBranchNotTaken, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x2000 lsl 32\n"
+      "movk ip0, #0x406d lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0x406d lsl 48\n"
+      "fmovdr v2, ip0\n"
+      "fcmpd v1, v2\n"
+      "beq +12\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FcmpLtBranch, assembler) {
@@ -1820,6 +2597,20 @@
 ASSEMBLER_TEST_RUN(FcmpLtBranchNotTaken, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x6000 lsl 32\n"
+      "movk ip0, #0x406d lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0x406d lsl 48\n"
+      "fmovdr v2, ip0\n"
+      "fcmpd v1, v2\n"
+      "blt +12\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FcmpzGtBranch, assembler) {
@@ -1840,6 +2631,21 @@
 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x6000 lsl 32\n"
+      "movk ip0, #0x406d lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x2000 lsl 32\n"
+      "movk ip0, #0x406d lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcmpd v1, #0.0\n"
+      "bgt +16\n"
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "ret\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) {
@@ -1859,6 +2665,14 @@
 ASSEMBLER_TEST_RUN(AndsBranch, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x2\n"
+      "movz r2, #0x1\n"
+      "ands r3, r1, r2\n"
+      "beq +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AndsBranchNotTaken, assembler) {
@@ -1878,6 +2692,14 @@
 ASSEMBLER_TEST_RUN(AndsBranchNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0x2\n"
+      "movz r2, #0x2\n"
+      "ands r3, r1, r2\n"
+      "beq +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(BicsBranch, assembler) {
@@ -1897,6 +2719,14 @@
 ASSEMBLER_TEST_RUN(BicsBranch, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x2\n"
+      "movz r2, #0x2\n"
+      "bics r3, r1, r2\n"
+      "beq +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(BicsBranchNotTaken, assembler) {
@@ -1916,6 +2746,14 @@
 ASSEMBLER_TEST_RUN(BicsBranchNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0x2\n"
+      "movz r2, #0x1\n"
+      "bics r3, r1, r2\n"
+      "beq +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AndisBranch, assembler) {
@@ -1934,6 +2772,13 @@
 ASSEMBLER_TEST_RUN(AndisBranch, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x2\n"
+      "ands r3, r1, 0x1\n"
+      "beq +8\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(AndisBranchNotTaken, assembler) {
@@ -1952,6 +2797,13 @@
 ASSEMBLER_TEST_RUN(AndisBranchNotTaken, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x0\n"
+      "movz r1, #0x2\n"
+      "ands r3, r1, 0x2\n"
+      "beq +8\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 // Address of PC-rel offset, br, blr.
@@ -2005,6 +2857,12 @@
   EXPECT(test != NULL);
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x1b\n"
+      "movz r1, #0x9\n"
+      "udiv r2, r0, r1\n"
+      "mov r0, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) {
@@ -2020,6 +2878,13 @@
   EXPECT(test != NULL);
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x1b\n"
+      "movz r1, #0x9\n"
+      "neg r1, r1\n"
+      "sdiv r2, r0, r1\n"
+      "mov r0, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) {
@@ -2034,6 +2899,12 @@
   EXPECT(test != NULL);
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x1b\n"
+      "movz r1, #0x0\n"
+      "udiv r2, r0, r1\n"
+      "mov r0, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) {
@@ -2048,6 +2919,12 @@
   EXPECT(test != NULL);
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x1b\n"
+      "movz r1, #0x0\n"
+      "sdiv r2, r0, r1\n"
+      "mov r0, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) {
@@ -2062,6 +2939,12 @@
   EXPECT(test != NULL);
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x8000 lsl 48\n"
+      "movn r1, #0x0\n"
+      "udiv r2, r0, r1\n"
+      "mov r0, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) {
@@ -2077,6 +2960,12 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(static_cast<int64_t>(0x8000000000000000),
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r3, #0x8000 lsl 48\n"
+      "movn r1, #0x0\n"
+      "sdiv r2, r3, r1\n"
+      "mov r0, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Lslv, assembler) {
@@ -2089,6 +2978,11 @@
 ASSEMBLER_TEST_RUN(Lslv, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x15\n"
+      "movz r2, #0x1\n"
+      "lsl r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Lsrv, assembler) {
@@ -2101,6 +2995,11 @@
 ASSEMBLER_TEST_RUN(Lsrv, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x54\n"
+      "movz r2, #0x1\n"
+      "lsr r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LShiftingV, assembler) {
@@ -2114,6 +3013,12 @@
 ASSEMBLER_TEST_RUN(LShiftingV, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x1\n"
+      "movz r2, #0x3f\n"
+      "lsl r1, r1, r2\n"
+      "lsr r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(RShiftingV, assembler) {
@@ -2127,6 +3032,12 @@
 ASSEMBLER_TEST_RUN(RShiftingV, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x1\n"
+      "movz r2, #0x3f\n"
+      "lsl r1, r1, r2\n"
+      "asr r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Mult_pos, assembler) {
@@ -2139,6 +3050,11 @@
 ASSEMBLER_TEST_RUN(Mult_pos, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x6\n"
+      "movz r2, #0x7\n"
+      "mul r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Mult_neg, assembler) {
@@ -2152,6 +3068,12 @@
 ASSEMBLER_TEST_RUN(Mult_neg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x6\n"
+      "movz r2, #0x7\n"
+      "neg r2, r2\n"
+      "mul r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) {
@@ -2164,6 +3086,11 @@
 ASSEMBLER_TEST_RUN(Smulh_pos, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x6\n"
+      "movz r2, #0x7\n"
+      "smulh r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) {
@@ -2177,6 +3104,12 @@
 ASSEMBLER_TEST_RUN(Smulh_neg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x6\n"
+      "movz r2, #0x7\n"
+      "neg r2, r2\n"
+      "smulh r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Umulh, assembler) {
@@ -2190,6 +3123,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(static_cast<int64_t>(0x6fff900000000),
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0xffff lsl 48\n"
+      "movz r2, #0x7 lsl 48\n"
+      "umulh r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Umaddl, assembler) {
@@ -2203,6 +3141,12 @@
 ASSEMBLER_TEST_RUN(Umaddl, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x700000001, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r1, #0x0\n"
+      "movz r2, #0x7\n"
+      "movz r3, #0x8\n"
+      "umaddl r0, r1, r2, r3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Smaddl, assembler) {
@@ -2216,6 +3160,12 @@
 ASSEMBLER_TEST_RUN(Smaddl, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(6, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r1, #0x1\n"
+      "movz r2, #0x7\n"
+      "movz r3, #0x14\n"
+      "smaddl r0, r1, r2, r3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Smaddl2, assembler) {
@@ -2228,6 +3178,11 @@
 ASSEMBLER_TEST_RUN(Smaddl2, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r1, #0x1\n"
+      "movn r2, #0x0\n"
+      "smull r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Smaddl3, assembler) {
@@ -2241,6 +3196,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xffffl * 0xffffl,
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0xffff\n"
+      "movz r2, #0xffff\n"
+      "smull r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(SmaddlOverflow, assembler) {
@@ -2261,6 +3221,17 @@
 ASSEMBLER_TEST_RUN(SmaddlOverflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0xffff\n"
+      "add r1, r1, #0x4\n"
+      "movz r2, #0x7fff\n"
+      "smull r0, r1, r2\n"
+      "asr r3, r0, #31\n"
+      "cmp r3, r0 asr #63\n"
+      "bne +8\n"
+      "ret\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(SmaddlOverflow2, assembler) {
@@ -2281,6 +3252,17 @@
 ASSEMBLER_TEST_RUN(SmaddlOverflow2, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0xffff\n"
+      "movn r2, #0xffff\n"
+      "sub r2, r2, #0x3\n"
+      "smull r0, r1, r2\n"
+      "asr r3, r0, #31\n"
+      "cmp r3, r0 asr #63\n"
+      "bne +8\n"
+      "ret\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(SmaddlOverflow3, assembler) {
@@ -2300,12 +3282,24 @@
 ASSEMBLER_TEST_RUN(SmaddlOverflow3, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x7fff\n"
+      "movk r1, #0x100 lsl 16\n"
+      "movz r2, #0x7fff\n"
+      "movk r2, #0x100 lsl 16\n"
+      "smull r0, r1, r2\n"
+      "asr r3, r0, #31\n"
+      "cmp r3, r0 asr #63\n"
+      "bne +8\n"
+      "ret\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(NegNoOverflow, assembler) {
   Label return_ltuae;
   __ LoadImmediate(R1, 0x7fffffff);
-  __ negsw(R0, R1);  // X0 = W1*W2, alias of smaddl.
+  __ negsw(R0, R1);
   __ sxtw(R0, R0);
   __ b(&return_ltuae, VS);  // Branch on overflow set.
   __ ret();
@@ -2317,12 +3311,20 @@
 ASSEMBLER_TEST_RUN(NegNoOverflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-0x7fffffff, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r1, 0x7fffffff\n"
+      "negws r0, r1\n"
+      "sxtw r0, r0\n"
+      "bvs +8\n"
+      "ret\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(NegNoOverflow2, assembler) {
   Label return_ltuae;
   __ LoadImmediate(R1, 0x7123);
-  __ negsw(R0, R1);  // X0 = W1*W2, alias of smaddl.
+  __ negsw(R0, R1);
   __ sxtw(R0, R0);
   __ b(&return_ltuae, VS);  // Branch on overflow set.
   __ ret();
@@ -2334,6 +3336,14 @@
 ASSEMBLER_TEST_RUN(NegNoOverflow2, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-0x7123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x7123\n"
+      "negws r0, r1\n"
+      "sxtw r0, r0\n"
+      "bvs +8\n"
+      "ret\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(NegOverflow, assembler) {
@@ -2351,6 +3361,14 @@
 ASSEMBLER_TEST_RUN(NegOverflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r1, 0xffffffff80000000\n"
+      "negws r0, r1\n"
+      "sxtw r0, r0\n"
+      "bvs +8\n"
+      "ret\n"
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 // Loading immediate values without the object pool.
@@ -2362,6 +3380,9 @@
 ASSEMBLER_TEST_RUN(LoadImmediateSmall, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadImmediateMed, assembler) {
@@ -2372,6 +3393,10 @@
 ASSEMBLER_TEST_RUN(LoadImmediateMed, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xf1234123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x4123\n"
+      "movk r0, #0xf123 lsl 16\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadImmediateMed2, assembler) {
@@ -2383,6 +3408,11 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x4321f1234123,
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x4123\n"
+      "movk r0, #0xf123 lsl 16\n"
+      "movk r0, #0x4321 lsl 32\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadImmediateLarge, assembler) {
@@ -2394,6 +3424,12 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(static_cast<int64_t>(0x9287436598237465),
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x7465\n"
+      "movk r0, #0x9823 lsl 16\n"
+      "movk r0, #0x4365 lsl 32\n"
+      "movk r0, #0x9287 lsl 48\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadImmediateSmallNeg, assembler) {
@@ -2404,6 +3440,9 @@
 ASSEMBLER_TEST_RUN(LoadImmediateSmallNeg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x29\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg, assembler) {
@@ -2414,6 +3453,11 @@
 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-0x1212341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x12 lsl 32\n"
+      "movk r0, #0xedcb lsl 16\n"
+      "movk r0, #0xedcc\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg2, assembler) {
@@ -2424,6 +3468,11 @@
 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg2, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-0x1212340000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x12 lsl 32\n"
+      "movk r0, #0xedcc lsl 16\n"
+      "movk r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg3, assembler) {
@@ -2434,6 +3483,10 @@
 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg3, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-0x1200001234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x12 lsl 32\n"
+      "movk r0, #0xedcc\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg4, assembler) {
@@ -2444,6 +3497,10 @@
 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r0, #0x1234 lsl 16\n"
+      "movk r0, #0xedcc\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnaligned, assembler) {
@@ -2467,6 +3524,10 @@
       static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)),
       EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(),
                                       reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_DISASSEMBLY(
+      "ldrsh r1, [r0]\n"
+      "mov r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnsignedUnaligned, assembler) {
@@ -2488,6 +3549,10 @@
   EXPECT_EQ(0xCDAB, EXECUTE_TEST_CODE_INTPTR_INTPTR(
                         LoadHalfWordUnsignedUnaligned, test->entry(),
                         reinterpret_cast<intptr_t>(&buffer[1])));
+  EXPECT_DISASSEMBLY(
+      "ldrh r1, [r0]\n"
+      "mov r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(StoreHalfWordUnaligned, assembler) {
@@ -2517,6 +3582,11 @@
   EXPECT_EQ(0xCD, buffer[1]);
   EXPECT_EQ(0xAB, buffer[2]);
   EXPECT_EQ(0, buffer[3]);
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0xabcd\n"
+      "strh r1, [r0]\n"
+      "mov r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(LoadWordUnaligned, assembler) {
@@ -2546,6 +3616,10 @@
       static_cast<int32_t>(0xDEBC9A78),
       EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(),
                                      reinterpret_cast<intptr_t>(&buffer[3])));
+  EXPECT_DISASSEMBLY(
+      "ldrw r1, [r0]\n"
+      "mov r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(StoreWordUnaligned, assembler) {
@@ -2591,6 +3665,13 @@
   EXPECT_EQ(0x56, buffer[4]);
   EXPECT_EQ(0x34, buffer[5]);
   EXPECT_EQ(0x12, buffer[6]);
+
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x5678\n"
+      "movk r1, #0x1234 lsl 16\n"
+      "strw r1, [r0]\n"
+      "mov r0, r1\n"
+      "ret\n");
 }
 
 static void EnterTestFrame(Assembler* assembler) {
@@ -2758,6 +3839,12 @@
 ASSEMBLER_TEST_RUN(CSelTrue, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x4d2\n"
+      "cmp r1, r2\n"
+      "csel r0, r1, r2, lt\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CSelFalse, assembler) {
@@ -2771,6 +3858,12 @@
 ASSEMBLER_TEST_RUN(CSelFalse, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x4d2\n"
+      "cmp r1, r2\n"
+      "csel r0, r1, r2, ge\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CsincFalse, assembler) {
@@ -2797,6 +3890,12 @@
 ASSEMBLER_TEST_RUN(CsincTrue, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x4d2\n"
+      "cmp r1, r2\n"
+      "cinc r0, r2, ge\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CsinvFalse, assembler) {
@@ -2810,6 +3909,12 @@
 ASSEMBLER_TEST_RUN(CsinvFalse, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(~42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x4d2\n"
+      "cmp r1, r2\n"
+      "csinv r0, r2, r1, ge\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CsinvTrue, assembler) {
@@ -2823,6 +3928,12 @@
 ASSEMBLER_TEST_RUN(CsinvTrue, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x4d2\n"
+      "cmp r1, r2\n"
+      "csinv r0, r2, r1, lt\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CsnegFalse, assembler) {
@@ -2836,6 +3947,12 @@
 ASSEMBLER_TEST_RUN(CsnegFalse, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x4d2\n"
+      "cmp r1, r2\n"
+      "csneg r0, r2, r1, ge\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CsnegTrue, assembler) {
@@ -2849,6 +3966,12 @@
 ASSEMBLER_TEST_RUN(CsnegTrue, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x2a\n"
+      "movz r2, #0x4d2\n"
+      "cmp r1, r2\n"
+      "csneg r0, r2, r1, lt\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Ubfx, assembler) {
@@ -2861,6 +3984,12 @@
 ASSEMBLER_TEST_RUN(Ubfx, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x81, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x819\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "ubfm r0, r1, #4, #11\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Sbfx, assembler) {
@@ -2873,6 +4002,12 @@
 ASSEMBLER_TEST_RUN(Sbfx, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-0x7f, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x819\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "sbfm r0, r1, #4, #11\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Bfi, assembler) {
@@ -2885,6 +4020,12 @@
 ASSEMBLER_TEST_RUN(Bfi, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x5a5b9a5a, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x819\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "bfm r0, r1, #52, #4\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Ubfiz, assembler) {
@@ -2898,6 +4039,13 @@
 ASSEMBLER_TEST_RUN(Ubfiz, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x7e2491fe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x48ff\n"
+      "movk r1, #0xff12 lsl 16\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "ubfm r0, r1, #63, #29\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Bfxil, assembler) {
@@ -2910,6 +4058,12 @@
 ASSEMBLER_TEST_RUN(Bfxil, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x5a5a5a81, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x819\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "bfm r0, r1, #4, #11\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Sbfiz, assembler) {
@@ -2922,6 +4076,12 @@
 ASSEMBLER_TEST_RUN(Sbfiz, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-0x7e70, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0x819\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "sbfm r0, r1, #60, #11\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Sxtb, assembler) {
@@ -2938,6 +4098,17 @@
 ASSEMBLER_TEST_RUN(Sxtb, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x29, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r1, #0xff\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "sxtb r0, r1\n"
+      "movz r2, #0x2a\n"
+      "movz r1, #0x5a5a\n"
+      "movk r1, #0x5a5a lsl 16\n"
+      "sxtb r1, r2\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Sxth, assembler) {
@@ -2954,6 +4125,18 @@
 ASSEMBLER_TEST_RUN(Sxth, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x29, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r1, 0xffff\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "sxth r0, r1\n"
+      "movz r2, #0x2a\n"
+      "movk r2, #0x1 lsl 16\n"
+      "movz r1, #0x5a5a\n"
+      "movk r1, #0x5a5a lsl 16\n"
+      "sxth r1, r2\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Sxtw, assembler) {
@@ -2970,6 +4153,18 @@
 ASSEMBLER_TEST_RUN(Sxtw, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0x29, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r1, 0xffffffff\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "sxtw r0, r1\n"
+      "movz r2, #0x2a\n"
+      "movk r2, #0x1 lsl 32\n"
+      "movz r1, #0x5a5a\n"
+      "movk r1, #0x5a5a lsl 16\n"
+      "sxtw r1, r2\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Uxtw, assembler) {
@@ -2987,6 +4182,18 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xffffffffll + 42,
             EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r1, 0xffffffff\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "ubfm r0, r1, #0, #31\n"
+      "movz r2, #0x2a\n"
+      "movk r2, #0x1 lsl 32\n"
+      "movz r1, #0x5a5a\n"
+      "movk r1, #0x5a5a lsl 16\n"
+      "ubfm r1, r2, #0, #31\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Uxtb, assembler) {
@@ -3003,6 +4210,17 @@
 ASSEMBLER_TEST_RUN(Uxtb, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xff + 0x2a, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r1, #0x0\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "uxtb r0, r1\n"
+      "movz r2, #0x12a\n"
+      "movz r1, #0x5a5a\n"
+      "movk r1, #0x5a5a lsl 16\n"
+      "uxtb r1, r2\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Uxth, assembler) {
@@ -3019,6 +4237,18 @@
 ASSEMBLER_TEST_RUN(Uxth, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xffff + 0x2a, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movn r1, #0x0\n"
+      "movz r0, #0x5a5a\n"
+      "movk r0, #0x5a5a lsl 16\n"
+      "uxth r0, r1\n"
+      "movz r2, #0x2a\n"
+      "movk r2, #0x1 lsl 16\n"
+      "movz r1, #0x5a5a\n"
+      "movk r1, #0x5a5a lsl 16\n"
+      "uxth r1, r2\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 // Floating point move immediate, to/from integer register.
@@ -3030,6 +4260,9 @@
 ASSEMBLER_TEST_RUN(Fmovdi, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v0, 1.000000\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fmovdi2, assembler) {
@@ -3042,6 +4275,13 @@
   EXPECT_FLOAT_EQ(123412983.1324524315,
                   EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()),
                   0.0001f);
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0xa19c\n"
+      "movk ip0, #0xdc87 lsl 16\n"
+      "movk ip0, #0x6c87 lsl 32\n"
+      "movk ip0, #0x419d lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fmovrd, assembler) {
@@ -3054,6 +4294,10 @@
   typedef int64_t (*Int64Return)() DART_UNUSED;
   const int64_t one = bit_cast<int64_t, double>(1.0);
   EXPECT_EQ(one, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v1, 1.000000\n"
+      "fmovrd r0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fmovdr, assembler) {
@@ -3066,6 +4310,11 @@
 ASSEMBLER_TEST_RUN(Fmovdr, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v1, 1.000000\n"
+      "fmovrd r1, v1\n"
+      "fmovdr v0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fmovrs, assembler) {
@@ -3080,6 +4329,11 @@
   int64_t result = EXECUTE_TEST_CODE_INT64(Int64Return, test->entry());
   const uint32_t one = bit_cast<uint32_t, float>(1.0f);
   EXPECT_EQ(one, static_cast<uint32_t>(result));
+  EXPECT_DISASSEMBLY(
+      "fmovd v2, 1.000000\n"
+      "fcvtsd v1, v2\n"
+      "fmovrsw r0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fmovsr, assembler) {
@@ -3094,6 +4348,11 @@
   int64_t result = EXECUTE_TEST_CODE_INT64(Int64Return, test->entry());
   const uint32_t one = bit_cast<uint32_t, float>(1.0f);
   EXPECT_EQ(one, static_cast<uint32_t>(result));
+  EXPECT_DISASSEMBLY(
+      "mov r2, 0x3f800000\n"
+      "fmovsrw v1, r2\n"
+      "fmovrsw r0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) {
@@ -3112,6 +4371,16 @@
 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "sub csp, csp, #0x10\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fstrd v1, [r15, #-8]!\n"
+      "fldrd v0, [r15], #8 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) {
@@ -3132,6 +4401,18 @@
 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "sub csp, csp, #0x10\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcvtsd v2, v1\n"
+      "fstrs v2, [r15, #-8]!\n"
+      "fldrs v3, [r15], #8 !\n"
+      "fcvtds v0, v3\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) {
@@ -3159,6 +4440,24 @@
 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "sub csp, csp, #0x10\n"
+      "fmovd v1, 21.000000\n"
+      "fmovd v2, 21.000000\n"
+      "movz r1, #0x2a\n"
+      "str r1, [r15, #-8]!\n"
+      "fstrd v1, [r15, #-8]!\n"
+      "fstrd v2, [r15, #-8]!\n"
+      "fldrq v3, [r15], #16 !\n"
+      "ldr r0, [r15], #8 !\n"
+      "fstrq v3, [r15, #-16]!\n"
+      "fldrd v0, [r15], #8 !\n"
+      "fldrd v1, [r15], #8 !\n"
+      "faddd v0, v0, v1\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtzsxd, assembler) {
@@ -3170,6 +4469,12 @@
 ASSEMBLER_TEST_RUN(Fcvtzsxd, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtzs r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtzswd, assembler) {
@@ -3182,6 +4487,13 @@
 ASSEMBLER_TEST_RUN(Fcvtzswd, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0xc045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtzsw r0, v0\n"
+      "sxtw r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtzsxd_overflow, assembler) {
@@ -3204,6 +4516,14 @@
 ASSEMBLER_TEST_RUN(Fcvtzsxd_overflow_negative, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x8c40\n"
+      "movk ip0, #0x78b5 lsl 16\n"
+      "movk ip0, #0xaf1d lsl 32\n"
+      "movk ip0, #0xc415 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtzs r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtzswd_overflow, assembler) {
@@ -3215,6 +4535,13 @@
 ASSEMBLER_TEST_RUN(Fcvtzswd_overflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x2000 lsl 16\n"
+      "movk ip0, #0xa05f lsl 32\n"
+      "movk ip0, #0x4202 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtzsw r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtzswd_overflow_negative, assembler) {
@@ -3227,6 +4554,14 @@
 ASSEMBLER_TEST_RUN(Fcvtzswd_overflow_negative, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x2000 lsl 16\n"
+      "movk ip0, #0xa05f lsl 32\n"
+      "movk ip0, #0xc202 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtzsw r0, v0\n"
+      "sxtw r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtpsxd, assembler) {
@@ -3238,6 +4573,12 @@
 ASSEMBLER_TEST_RUN(Fcvtpsxd, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtps r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtpswd, assembler) {
@@ -3250,6 +4591,13 @@
 ASSEMBLER_TEST_RUN(Fcvtpswd, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0xc045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtpsw r0, v0\n"
+      "sxtw r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtpsxd_overflow, assembler) {
@@ -3261,6 +4609,14 @@
 ASSEMBLER_TEST_RUN(Fcvtpsxd_overflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x8c40\n"
+      "movk ip0, #0x78b5 lsl 16\n"
+      "movk ip0, #0xaf1d lsl 32\n"
+      "movk ip0, #0x4415 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtps r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtpsxd_overflow_negative, assembler) {
@@ -3272,6 +4628,14 @@
 ASSEMBLER_TEST_RUN(Fcvtpsxd_overflow_negative, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x8c40\n"
+      "movk ip0, #0x78b5 lsl 16\n"
+      "movk ip0, #0xaf1d lsl 32\n"
+      "movk ip0, #0xc415 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtps r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtpswd_overflow, assembler) {
@@ -3283,6 +4647,13 @@
 ASSEMBLER_TEST_RUN(Fcvtpswd_overflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x2000 lsl 16\n"
+      "movk ip0, #0xa05f lsl 32\n"
+      "movk ip0, #0x4202 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtpsw r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtpswd_overflow_negative, assembler) {
@@ -3295,6 +4666,14 @@
 ASSEMBLER_TEST_RUN(Fcvtpswd_overflow_negative, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x2000 lsl 16\n"
+      "movk ip0, #0xa05f lsl 32\n"
+      "movk ip0, #0xc202 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtpsw r0, v0\n"
+      "sxtw r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtmsxd, assembler) {
@@ -3306,6 +4685,12 @@
 ASSEMBLER_TEST_RUN(Fcvtmsxd, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtms r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtmswd, assembler) {
@@ -3318,6 +4703,13 @@
 ASSEMBLER_TEST_RUN(Fcvtmswd, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-43, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0xc045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtmsw r0, v0\n"
+      "sxtw r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtmsxd_overflow, assembler) {
@@ -3329,6 +4721,14 @@
 ASSEMBLER_TEST_RUN(Fcvtmsxd_overflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x8c40\n"
+      "movk ip0, #0x78b5 lsl 16\n"
+      "movk ip0, #0xaf1d lsl 32\n"
+      "movk ip0, #0x4415 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtms r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtmsxd_overflow_negative, assembler) {
@@ -3340,6 +4740,14 @@
 ASSEMBLER_TEST_RUN(Fcvtmsxd_overflow_negative, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt64, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x8c40\n"
+      "movk ip0, #0x78b5 lsl 16\n"
+      "movk ip0, #0xaf1d lsl 32\n"
+      "movk ip0, #0xc415 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtms r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtmswd_overflow, assembler) {
@@ -3351,6 +4759,13 @@
 ASSEMBLER_TEST_RUN(Fcvtmswd_overflow, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMaxInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x2000 lsl 16\n"
+      "movk ip0, #0xa05f lsl 32\n"
+      "movk ip0, #0x4202 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtmsw r0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fcvtmswd_overflow_negative, assembler) {
@@ -3363,6 +4778,14 @@
 ASSEMBLER_TEST_RUN(Fcvtmswd_overflow_negative, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(kMinInt32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x2000 lsl 16\n"
+      "movk ip0, #0xa05f lsl 32\n"
+      "movk ip0, #0xc202 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtmsw r0, v0\n"
+      "sxtw r0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Scvtfdx, assembler) {
@@ -3374,6 +4797,10 @@
 ASSEMBLER_TEST_RUN(Scvtfdx, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "scvtfd v0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Scvtfdw, assembler) {
@@ -3386,6 +4813,12 @@
 ASSEMBLER_TEST_RUN(Scvtfdw, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movk r0, #0x1111 lsl 32\n"
+      "movk r0, #0x1111 lsl 48\n"
+      "scvtfdw v0, r0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FabsdPos, assembler) {
@@ -3397,6 +4830,11 @@
 ASSEMBLER_TEST_RUN(FabsdPos, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fabsd v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FabsdNeg, assembler) {
@@ -3408,6 +4846,11 @@
 ASSEMBLER_TEST_RUN(FabsdNeg, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0xc045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fabsd v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FnegdPos, assembler) {
@@ -3419,6 +4862,11 @@
 ASSEMBLER_TEST_RUN(FnegdPos, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(-42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fnegd v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FnegdNeg, assembler) {
@@ -3430,6 +4878,11 @@
 ASSEMBLER_TEST_RUN(FnegdNeg, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0xc045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fnegd v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fsqrtd, assembler) {
@@ -3441,6 +4894,11 @@
 ASSEMBLER_TEST_RUN(Fsqrtd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(8.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4050 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fsqrtd v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fmuld, assembler) {
@@ -3453,6 +4911,12 @@
 ASSEMBLER_TEST_RUN(Fmuld, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4055 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fmovd v2, 0.500000\n"
+      "fmuld v0, v1, v2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fdivd, assembler) {
@@ -3465,6 +4929,12 @@
 ASSEMBLER_TEST_RUN(Fdivd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4055 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fmovd v2, 2.000000\n"
+      "fdivd v0, v1, v2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Faddd, assembler) {
@@ -3477,6 +4947,13 @@
 ASSEMBLER_TEST_RUN(Faddd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0xc000 lsl 32\n"
+      "movk ip0, #0x4044 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fmovd v2, 0.500000\n"
+      "faddd v0, v1, v2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Fsubd, assembler) {
@@ -3489,6 +4966,13 @@
 ASSEMBLER_TEST_RUN(Fsubd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fmovd v2, 0.500000\n"
+      "fsubd v0, v1, v2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) {
@@ -3507,6 +4991,21 @@
 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "sub r15, r15, #0x8\n"
+      "add r2, r15, #0x1\n"
+      "fstrd v1, [r2, #-1]\n"
+      "fldrd v0, [r2, #-1]\n"
+      "add r15, r15, #0x8\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) {
@@ -3530,6 +5029,20 @@
 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "sub csp, csp, #0x100\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fstrd v1, [r15, #-256]!\n"
+      "fldrd v0, [r15], #248 !\n"
+      "add r15, r15, #0x8\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) {
@@ -3548,6 +5061,21 @@
 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "sub r15, r15, #0x1000\n"
+      "and csp, r15, 0xfffffffffffffff0\n"
+      "fstrd v1, [r15, #4096]\n"
+      "add r15, r15, #0x1000\n"
+      "fldrd v0, [r15]\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) {
@@ -3570,6 +5098,23 @@
 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "movz r2, #0xfff8\n"
+      "movk r2, #0xffff lsl 16\n"
+      "fstrd v1, [r15, r2 sxtw]\n"
+      "sub r15, r15, #0x8\n"
+      "and csp, r15, 0xfffffffffffffff0\n"
+      "fldrd v0, [r15]\n"
+      "add r15, r15, #0x8\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) {
@@ -3590,6 +5135,22 @@
 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "movz r2, #0xa\n"
+      "sub r15, r15, #0x50\n"
+      "and csp, r15, 0xfffffffffffffff0\n"
+      "fstrd v1, [r15, r2 uxtx scaled]\n"
+      "fldrd v0, [r15, r2 uxtx scaled]\n"
+      "add r15, r15, #0x50\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(VinswVmovrs, assembler) {
@@ -3618,6 +5179,23 @@
   EXPECT(test != NULL);
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(174, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x2b\n"
+      "movz r2, #0x2c\n"
+      "movz r3, #0x2d\n"
+      "vinss v0[0], r0\n"
+      "vinss v0[1], r1\n"
+      "vinss v0[2], r2\n"
+      "vinss v0[3], r3\n"
+      "vmovrs r4, v0[0]\n"
+      "vmovrs r5, v0[1]\n"
+      "vmovrs r6, v0[2]\n"
+      "vmovrs r7, v0[3]\n"
+      "add r0, r4, r5\n"
+      "add r0, r0, r6\n"
+      "add r0, r0, r7\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(VinsxVmovrd, assembler) {
@@ -3638,6 +5216,15 @@
   EXPECT(test != NULL);
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(85, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r0, #0x2a\n"
+      "movz r1, #0x2b\n"
+      "vinsd v0[0], r0\n"
+      "vinsd v0[1], r1\n"
+      "vmovrd r2, v0[0]\n"
+      "vmovrd r3, v0[1]\n"
+      "add r0, r2, r3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vnot, assembler) {
@@ -3664,6 +5251,22 @@
   EXPECT(test != NULL);
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r0, 0xfffffffe\n"
+      "mov r1, 0xffffffff\n"
+      "vinss v1[0], r1\n"
+      "vinss v1[1], r0\n"
+      "vinss v1[2], r1\n"
+      "vinss v1[3], r0\n"
+      "vnot v0, v1\n"
+      "vmovrs r2, v0[0]\n"
+      "vmovrs r3, v0[1]\n"
+      "vmovrs r4, v0[2]\n"
+      "vmovrs r5, v0[3]\n"
+      "add r0, r2, r3\n"
+      "add r0, r0, r4\n"
+      "add r0, r0, r5\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vabss, assembler) {
@@ -3692,6 +5295,21 @@
 ASSEMBLER_TEST_RUN(Vabss, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v1, 21.000000\n"
+      "fmovd v2, -21.000000\n"
+      "fcvtsd v1, v1\n"
+      "fcvtsd v2, v2\n"
+      "veor v3, v3, v3\n"
+      "vinss v3[1], v1[0]\n"
+      "vinss v3[3], v2[0]\n"
+      "vabss v4, v3\n"
+      "vinss v5[0], v4[1]\n"
+      "vinss v6[0], v4[3]\n"
+      "fcvtds v5, v5\n"
+      "fcvtds v6, v6\n"
+      "faddd v0, v5, v6\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vabsd, assembler) {
@@ -3713,6 +5331,16 @@
 ASSEMBLER_TEST_RUN(Vabsd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v1, 21.000000\n"
+      "fmovd v2, -21.000000\n"
+      "vinsd v3[0], v1[0]\n"
+      "vinsd v3[1], v2[0]\n"
+      "vabsd v4, v3\n"
+      "vinsd v5[0], v4[0]\n"
+      "vinsd v6[0], v4[1]\n"
+      "faddd v0, v5, v6\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vnegs, assembler) {
@@ -3740,6 +5368,23 @@
 ASSEMBLER_TEST_RUN(Vnegs, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "movz ip0, #0xc055 lsl 48\n"
+      "fmovdr v2, ip0\n"
+      "fcvtsd v1, v1\n"
+      "fcvtsd v2, v2\n"
+      "veor v3, v3, v3\n"
+      "vinss v3[1], v1[0]\n"
+      "vinss v3[3], v2[0]\n"
+      "vnegs v4, v3\n"
+      "vinss v5[0], v4[1]\n"
+      "vinss v6[0], v4[3]\n"
+      "fcvtds v5, v5\n"
+      "fcvtds v6, v6\n"
+      "faddd v0, v5, v6\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vnegd, assembler) {
@@ -3761,6 +5406,19 @@
 ASSEMBLER_TEST_RUN(Vnegd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "movz ip0, #0xc055 lsl 48\n"
+      "fmovdr v2, ip0\n"
+      "vinsd v3[0], v1[0]\n"
+      "vinsd v3[1], v2[0]\n"
+      "vnegd v4, v3\n"
+      "vinsd v5[0], v4[0]\n"
+      "vinsd v6[0], v4[1]\n"
+      "faddd v0, v5, v6\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vadds, assembler) {
@@ -3800,6 +5458,33 @@
 ASSEMBLER_TEST_RUN(Vadds, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(12.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "fmovd v1, 1.000000\n"
+      "fmovd v2, 2.000000\n"
+      "fmovd v3, 3.000000\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "fcvtsd v2, v2\n"
+      "fcvtsd v3, v3\n"
+      "vinss v4[0], v0[0]\n"
+      "vinss v4[1], v1[0]\n"
+      "vinss v4[2], v2[0]\n"
+      "vinss v4[3], v3[0]\n"
+      "vadds v5, v4, v4\n"
+      "vinss v0[0], v5[0]\n"
+      "vinss v1[0], v5[1]\n"
+      "vinss v2[0], v5[2]\n"
+      "vinss v3[0], v5[3]\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v0, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vsubs, assembler) {
@@ -3840,6 +5525,36 @@
 ASSEMBLER_TEST_RUN(Vsubs, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(-6.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "fmovd v1, 1.000000\n"
+      "fmovd v2, 2.000000\n"
+      "fmovd v3, 3.000000\n"
+      "movz ip0, #0x0\n"
+      "fmovdr v5, ip0\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "fcvtsd v2, v2\n"
+      "fcvtsd v3, v3\n"
+      "vinss v4[0], v0[0]\n"
+      "vinss v4[1], v1[0]\n"
+      "vinss v4[2], v2[0]\n"
+      "vinss v4[3], v3[0]\n"
+      "vsubs v5, v5, v4\n"
+      "vinss v0[0], v5[0]\n"
+      "vinss v1[0], v5[1]\n"
+      "vinss v2[0], v5[2]\n"
+      "vinss v3[0], v5[3]\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v0, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vmuls, assembler) {
@@ -3879,6 +5594,34 @@
 ASSEMBLER_TEST_RUN(Vmuls, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(14.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "fmovd v1, 1.000000\n"
+      "fmovd v2, 2.000000\n"
+      "fmovd v3, 3.000000\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "fcvtsd v2, v2\n"
+      "fcvtsd v3, v3\n"
+      "vinss v4[0], v0[0]\n"
+      "vinss v4[1], v1[0]\n"
+      "vinss v4[2], v2[0]\n"
+      "vinss v4[3], v3[0]\n"
+      "vmuls v5, v4, v4\n"
+      "vinss v0[0], v5[0]\n"
+      "vinss v1[0], v5[1]\n"
+      "vinss v2[0], v5[2]\n"
+      "vinss v3[0], v5[3]\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v0, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vdivs, assembler) {
@@ -3918,6 +5661,34 @@
 ASSEMBLER_TEST_RUN(Vdivs, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(4.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "fmovd v1, 1.000000\n"
+      "fmovd v2, 2.000000\n"
+      "fmovd v3, 3.000000\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "fcvtsd v2, v2\n"
+      "fcvtsd v3, v3\n"
+      "vinss v4[0], v0[0]\n"
+      "vinss v4[1], v1[0]\n"
+      "vinss v4[2], v2[0]\n"
+      "vinss v4[3], v3[0]\n"
+      "vdivs v5, v4, v4\n"
+      "vinss v0[0], v5[0]\n"
+      "vinss v1[0], v5[1]\n"
+      "vinss v2[0], v5[2]\n"
+      "vinss v3[0], v5[3]\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v1, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vaddd, assembler) {
@@ -3939,6 +5710,17 @@
 ASSEMBLER_TEST_RUN(Vaddd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(10.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "fmovd v0, 2.000000\n"
+      "fmovd v1, 3.000000\n"
+      "vinsd v4[0], v0[0]\n"
+      "vinsd v4[1], v1[0]\n"
+      "vaddd v5, v4, v4\n"
+      "vinsd v0[0], v5[0]\n"
+      "vinsd v1[0], v5[1]\n"
+      "faddd v0, v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vsubd, assembler) {
@@ -3961,6 +5743,18 @@
 ASSEMBLER_TEST_RUN(Vsubd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(-5.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v0, 2.000000\n"
+      "fmovd v1, 3.000000\n"
+      "movz ip0, #0x0\n"
+      "fmovdr v5, ip0\n"
+      "vinsd v4[0], v0[0]\n"
+      "vinsd v4[1], v1[0]\n"
+      "vsubd v5, v5, v4\n"
+      "vinsd v0[0], v5[0]\n"
+      "vinsd v1[0], v5[1]\n"
+      "faddd v0, v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vmuld, assembler) {
@@ -3982,6 +5776,17 @@
 ASSEMBLER_TEST_RUN(Vmuld, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(13.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "fmovd v0, 2.000000\n"
+      "fmovd v1, 3.000000\n"
+      "vinsd v4[0], v0[0]\n"
+      "vinsd v4[1], v1[0]\n"
+      "vmuld v5, v4, v4\n"
+      "vinsd v0[0], v5[0]\n"
+      "vinsd v1[0], v5[1]\n"
+      "faddd v0, v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vdivd, assembler) {
@@ -4003,6 +5808,16 @@
 ASSEMBLER_TEST_RUN(Vdivd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v0, 2.000000\n"
+      "fmovd v1, 3.000000\n"
+      "vinsd v4[0], v0[0]\n"
+      "vinsd v4[1], v1[0]\n"
+      "vdivd v5, v4, v4\n"
+      "vinsd v0[0], v5[0]\n"
+      "vinsd v1[0], v5[1]\n"
+      "faddd v0, v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) {
@@ -4028,6 +5843,19 @@
 ASSEMBLER_TEST_RUN(Vdupd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "fmovd v0, 21.000000\n"
+      "vdupd v1, v0[0]\n"
+      "sub csp, csp, #0x10\n"
+      "fstrq v1, [r15, #-16]!\n"
+      "fldrd v2, [r15], #8 !\n"
+      "fldrd v3, [r15], #8 !\n"
+      "faddd v0, v2, v3\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vdups, assembler) {
@@ -4063,6 +5891,28 @@
 ASSEMBLER_TEST_RUN(Vdups, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "fmovd v0, 21.000000\n"
+      "fcvtsd v0, v0\n"
+      "vdups v1, v0[0]\n"
+      "sub csp, csp, #0x10\n"
+      "fstrq v1, [r15, #-16]!\n"
+      "fldrs v3, [r15], #4 !\n"
+      "fldrs v2, [r15], #4 !\n"
+      "fldrs v1, [r15], #4 !\n"
+      "fldrs v0, [r15], #4 !\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v1, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) {
@@ -4088,6 +5938,20 @@
 ASSEMBLER_TEST_RUN(Vinsd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      ""
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v5, ip0\n"
+      "vinsd v1[1], v5[0]\n"
+      "sub csp, csp, #0x10\n"
+      "fstrq v1, [r15, #-16]!\n"
+      "fldrd v2, [r15], #8 !\n"
+      "fldrd v3, [r15], #8 !\n"
+      "fmovdd v0, v3\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vinss, assembler) {
@@ -4131,6 +5995,33 @@
 ASSEMBLER_TEST_RUN(Vinss, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "fmovd v0, 21.000000\n"
+      "fcvtsd v0, v0\n"
+      "vinss v1[3], v0[0]\n"
+      "vinss v1[1], v0[0]\n"
+      "movz ip0, #0x0\n"
+      "fmovdr v0, ip0\n"
+      "fcvtsd v0, v0\n"
+      "vinss v1[2], v0[0]\n"
+      "vinss v1[0], v0[0]\n"
+      "sub csp, csp, #0x10\n"
+      "fstrq v1, [r15, #-16]!\n"
+      "fldrs v3, [r15], #4 !\n"
+      "fldrs v2, [r15], #4 !\n"
+      "fldrs v1, [r15], #4 !\n"
+      "fldrs v0, [r15], #4 !\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v0, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vand, assembler) {
@@ -4166,6 +6057,26 @@
 ASSEMBLER_TEST_RUN(Vand, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v1, 21.000000\n"
+      "mov r0, 0xffffffff\n"
+      "fmovdr v0, r0\n"
+      "vinss v0[2], v0[0]\n"
+      "fcvtsd v1, v1\n"
+      "vdups v1, v1[0]\n"
+      "vand v2, v1, v0\n"
+      "vinss v3[0], v2[0]\n"
+      "vinss v4[0], v2[1]\n"
+      "vinss v5[0], v2[2]\n"
+      "vinss v6[0], v2[3]\n"
+      "fcvtds v3, v3\n"
+      "fcvtds v4, v4\n"
+      "fcvtds v5, v5\n"
+      "fcvtds v6, v6\n"
+      "vaddd v0, v3, v4\n"
+      "vaddd v0, v0, v5\n"
+      "vaddd v0, v0, v6\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vorr, assembler) {
@@ -4202,6 +6113,27 @@
 ASSEMBLER_TEST_RUN(Vorr, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v1, 10.500000\n"
+      "fcvtsd v1, v1\n"
+      "fmovdd v0, v1\n"
+      "vinss v0[2], v0[0]\n"
+      "veor v1, v1, v1\n"
+      "vinss v1[1], v0[0]\n"
+      "vinss v1[3], v0[0]\n"
+      "vorr v2, v1, v0\n"
+      "vinss v3[0], v2[0]\n"
+      "vinss v4[0], v2[1]\n"
+      "vinss v5[0], v2[2]\n"
+      "vinss v6[0], v2[3]\n"
+      "fcvtds v3, v3\n"
+      "fcvtds v4, v4\n"
+      "fcvtds v5, v5\n"
+      "fcvtds v6, v6\n"
+      "vaddd v0, v3, v4\n"
+      "vaddd v0, v0, v5\n"
+      "vaddd v0, v0, v6\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Veor, assembler) {
@@ -4234,6 +6166,26 @@
 ASSEMBLER_TEST_RUN(Veor, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov r1, 0xffffffff\n"
+      "movn r2, #0x15\n"
+      "vinss v1[0], r1\n"
+      "vinss v1[1], r2\n"
+      "vinss v1[2], r1\n"
+      "vinss v1[3], r2\n"
+      "vinss v2[0], r1\n"
+      "vinss v2[1], r1\n"
+      "vinss v2[2], r1\n"
+      "vinss v2[3], r1\n"
+      "veor v0, v1, v2\n"
+      "vmovrs r3, v0[0]\n"
+      "vmovrs r4, v0[1]\n"
+      "vmovrs r5, v0[2]\n"
+      "vmovrs r6, v0[3]\n"
+      "add r0, r3, r4\n"
+      "add r0, r0, r5\n"
+      "add r0, r0, r6\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vaddw, assembler) {
@@ -4257,6 +6209,19 @@
 ASSEMBLER_TEST_RUN(Vaddw, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(168, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r4, #0x15\n"
+      "vdups v1, r4\n"
+      "vdups v2, r4\n"
+      "vaddw v0, v1, v2\n"
+      "vmovrs r0, v0[0]\n"
+      "vmovrs r1, v0[1]\n"
+      "vmovrs r2, v0[2]\n"
+      "vmovrs r3, v0[3]\n"
+      "add r0, r0, r1\n"
+      "add r0, r0, r2\n"
+      "add r0, r0, r3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vsubw, assembler) {
@@ -4281,6 +6246,20 @@
 ASSEMBLER_TEST_RUN(Vsubw, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r4, #0x1f\n"
+      "movz r5, #0xa\n"
+      "vdups v1, r4\n"
+      "vdups v2, r5\n"
+      "vsubw v0, v1, v2\n"
+      "vmovrs r0, v0[0]\n"
+      "vmovrs r1, v0[1]\n"
+      "vmovrs r2, v0[2]\n"
+      "vmovrs r3, v0[3]\n"
+      "add r0, r0, r1\n"
+      "add r0, r0, r2\n"
+      "add r0, r0, r3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vaddx, assembler) {
@@ -4300,6 +6279,15 @@
 ASSEMBLER_TEST_RUN(Vaddx, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r4, #0x15\n"
+      "vdupd v1, r4\n"
+      "vdupd v2, r4\n"
+      "vaddx v0, v1, v2\n"
+      "vmovrd r0, v0[0]\n"
+      "vmovrd r1, v0[1]\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vsubx, assembler) {
@@ -4320,6 +6308,16 @@
 ASSEMBLER_TEST_RUN(Vsubx, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz r4, #0x1f\n"
+      "movz r5, #0xa\n"
+      "vdupd v1, r4\n"
+      "vdupd v2, r5\n"
+      "vsubx v0, v1, v2\n"
+      "vmovrd r0, v0[0]\n"
+      "vmovrd r1, v0[1]\n"
+      "add r0, r0, r1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vceqs, assembler) {
@@ -4351,6 +6349,27 @@
 ASSEMBLER_TEST_RUN(Vceqs, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0xc045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "vdups v2, v0[0]\n"
+      "vinss v3[0], v0[0]\n"
+      "vinss v3[1], v1[0]\n"
+      "vinss v3[2], v0[0]\n"
+      "vinss v3[3], v1[0]\n"
+      "vceqs v4, v2, v3\n"
+      "vmovrs r1, v4[0]\n"
+      "vmovrs r2, v4[1]\n"
+      "vmovrs r3, v4[2]\n"
+      "vmovrs r4, v4[3]\n"
+      "addw r0, r1, r2\n"
+      "addw r0, r0, r3\n"
+      "addw r0, r0, r4\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vceqd, assembler) {
@@ -4373,6 +6392,19 @@
 ASSEMBLER_TEST_RUN(Vceqd, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0xc045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "vdupd v2, v0[0]\n"
+      "vinsd v3[0], v0[0]\n"
+      "vinsd v3[1], v1[0]\n"
+      "vceqd v4, v2, v3\n"
+      "vmovrd r1, v4[0]\n"
+      "vmovrd r2, v4[1]\n"
+      "add r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vcgts, assembler) {
@@ -4404,6 +6436,27 @@
 ASSEMBLER_TEST_RUN(Vcgts, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0xc045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "vdups v2, v0[0]\n"
+      "vinss v3[0], v0[0]\n"
+      "vinss v3[1], v1[0]\n"
+      "vinss v3[2], v0[0]\n"
+      "vinss v3[3], v1[0]\n"
+      "vcgts v4, v2, v3\n"
+      "vmovrs r1, v4[0]\n"
+      "vmovrs r2, v4[1]\n"
+      "vmovrs r3, v4[2]\n"
+      "vmovrs r4, v4[3]\n"
+      "addw r0, r1, r2\n"
+      "addw r0, r0, r3\n"
+      "addw r0, r0, r4\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vcgtd, assembler) {
@@ -4426,6 +6479,19 @@
 ASSEMBLER_TEST_RUN(Vcgtd, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0xc045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "vdupd v2, v0[0]\n"
+      "vinsd v3[0], v0[0]\n"
+      "vinsd v3[1], v1[0]\n"
+      "vcgtd v4, v2, v3\n"
+      "vmovrd r1, v4[0]\n"
+      "vmovrd r2, v4[1]\n"
+      "add r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vcges, assembler) {
@@ -4457,6 +6523,28 @@
 ASSEMBLER_TEST_RUN(Vcges, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "vdups v2, v0[0]\n"
+      "vinss v3[0], v0[0]\n"
+      "vinss v3[1], v1[0]\n"
+      "vinss v3[2], v0[0]\n"
+      "vinss v3[3], v1[0]\n"
+      "vcges v4, v2, v3\n"
+      "vmovrs r1, v4[0]\n"
+      "vmovrs r2, v4[1]\n"
+      "vmovrs r3, v4[2]\n"
+      "vmovrs r4, v4[3]\n"
+      "addw r0, r1, r2\n"
+      "addw r0, r0, r3\n"
+      "addw r0, r0, r4\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vcged, assembler) {
@@ -4479,6 +6567,20 @@
 ASSEMBLER_TEST_RUN(Vcged, test) {
   typedef int64_t (*Int64Return)() DART_UNUSED;
   EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4045 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4045 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "vdupd v2, v0[0]\n"
+      "vinsd v3[0], v0[0]\n"
+      "vinsd v3[1], v1[0]\n"
+      "vcged v4, v2, v3\n"
+      "vmovrd r1, v4[0]\n"
+      "vmovrd r2, v4[1]\n"
+      "add r0, r1, r2\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vmaxs, assembler) {
@@ -4515,6 +6617,29 @@
 ASSEMBLER_TEST_RUN(Vmaxs, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v0, 10.500000\n"
+      "fmovd v1, 10.000000\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "vdups v2, v0[0]\n"
+      "vinss v3[0], v0[0]\n"
+      "vinss v3[1], v1[0]\n"
+      "vinss v3[2], v0[0]\n"
+      "vinss v3[3], v1[0]\n"
+      "vmaxs v4, v2, v3\n"
+      "vinss v0[0], v4[0]\n"
+      "vinss v1[0], v4[1]\n"
+      "vinss v2[0], v4[2]\n"
+      "vinss v3[0], v4[3]\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v0, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vmaxd, assembler) {
@@ -4537,6 +6662,19 @@
 ASSEMBLER_TEST_RUN(Vmaxd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v0, 21.000000\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4034 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "vdupd v2, v0[0]\n"
+      "vinsd v3[0], v0[0]\n"
+      "vinsd v3[1], v1[0]\n"
+      "vmaxd v4, v2, v3\n"
+      "vinsd v0[0], v4[0]\n"
+      "vinsd v1[0], v4[1]\n"
+      "faddd v0, v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vmins, assembler) {
@@ -4573,6 +6711,29 @@
 ASSEMBLER_TEST_RUN(Vmins, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v0, 10.500000\n"
+      "fmovd v1, 11.000000\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "vdups v2, v0[0]\n"
+      "vinss v3[0], v0[0]\n"
+      "vinss v3[1], v1[0]\n"
+      "vinss v3[2], v0[0]\n"
+      "vinss v3[3], v1[0]\n"
+      "vmins v4, v2, v3\n"
+      "vinss v0[0], v4[0]\n"
+      "vinss v1[0], v4[1]\n"
+      "vinss v2[0], v4[2]\n"
+      "vinss v3[0], v4[3]\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v0, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vmind, assembler) {
@@ -4595,6 +6756,19 @@
 ASSEMBLER_TEST_RUN(Vmind, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "fmovd v0, 21.000000\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4035 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "vdupd v2, v0[0]\n"
+      "vinsd v3[0], v0[0]\n"
+      "vinsd v3[1], v1[0]\n"
+      "vmind v4, v2, v3\n"
+      "vinsd v0[0], v4[0]\n"
+      "vinsd v1[0], v4[1]\n"
+      "faddd v0, v0, v1\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vsqrts, assembler) {
@@ -4623,6 +6797,24 @@
 ASSEMBLER_TEST_RUN(Vsqrts, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4050 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4048 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcvtsd v0, v0\n"
+      "fcvtsd v1, v1\n"
+      "veor v3, v3, v3\n"
+      "vinss v3[1], v0[0]\n"
+      "vinss v3[3], v1[0]\n"
+      "vsqrts v4, v3\n"
+      "vinss v5[0], v4[1]\n"
+      "vinss v6[0], v4[3]\n"
+      "fcvtds v5, v5\n"
+      "fcvtds v6, v6\n"
+      "faddd v0, v5, v6\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vsqrtd, assembler) {
@@ -4644,6 +6836,19 @@
 ASSEMBLER_TEST_RUN(Vsqrtd, test) {
   typedef double (*DoubleReturn)() DART_UNUSED;
   EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x4050 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "movz ip0, #0x8000 lsl 32\n"
+      "movk ip0, #0x4048 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "vinsd v3[0], v0[0]\n"
+      "vinsd v3[1], v1[0]\n"
+      "vsqrtd v4, v3\n"
+      "vinsd v5[0], v4[0]\n"
+      "vinsd v6[0], v4[1]\n"
+      "faddd v0, v5, v6\n"
+      "ret\n");
 }
 
 // This is the same function as in the Simulator.
@@ -4700,6 +6905,18 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   float res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(arm_recip_estimate(147.0), res, 0.0001);
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x6000 lsl 32\n"
+      "movk ip0, #0x4062 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcvtsd v1, v1\n"
+      "vinss v2[0], v1[0]\n"
+      "vinss v2[1], v1[0]\n"
+      "vinss v2[2], v1[0]\n"
+      "vinss v2[3], v1[0]\n"
+      "vrecpes v0, v2\n"
+      "fcvtds v0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vrecpss, assembler) {
@@ -4720,6 +6937,14 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(2.0 - 10.0 * 5.0, res, 0.0001);
+  EXPECT_DISASSEMBLY(
+      "fmovd v1, 5.000000\n"
+      "fmovd v2, 10.000000\n"
+      "fcvtsd v1, v1\n"
+      "fcvtsd v2, v2\n"
+      "vrecpss v0, v1, v2\n"
+      "fcvtds v0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(VRecps, assembler) {
@@ -4750,6 +6975,31 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(42.0, res, 0.0001);
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x8618\n"
+      "movk ip0, #0x1861 lsl 16\n"
+      "movk ip0, #0x6186 lsl 32\n"
+      "movk ip0, #0x3fb8 lsl 48\n"
+      "fmovdr v0, ip0\n"
+      "fcvtsd v0, v0\n"
+      "vdups v1, v0[0]\n"
+      "vrecpes v2, v1\n"
+      "vrecpss v31, v1, v2\n"
+      "vmuls v2, v2, v31\n"
+      "vrecpss v31, v1, v2\n"
+      "vmuls v2, v2, v31\n"
+      "vinss v0[0], v2[0]\n"
+      "vinss v1[0], v2[1]\n"
+      "vinss v2[0], v2[2]\n"
+      "vinss v3[0], v2[3]\n"
+      "fcvtds v0, v0\n"
+      "fcvtds v1, v1\n"
+      "fcvtds v2, v2\n"
+      "fcvtds v3, v3\n"
+      "faddd v0, v0, v1\n"
+      "faddd v0, v0, v2\n"
+      "faddd v0, v0, v3\n"
+      "ret\n");
 }
 
 static float arm_reciprocal_sqrt_estimate(float a) {
@@ -4821,6 +7071,14 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(arm_reciprocal_sqrt_estimate(147.0), res, 0.0001);
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0x6000 lsl 32\n"
+      "movk ip0, #0x4062 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcvtsd v1, v1\n"
+      "vrsqrtes v0, v1\n"
+      "fcvtds v0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(Vrsqrtss, assembler) {
@@ -4841,6 +7099,14 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0) / 2.0, res, 0.0001);
+  EXPECT_DISASSEMBLY(
+      "fmovd v1, 5.000000\n"
+      "fmovd v2, 10.000000\n"
+      "fcvtsd v1, v1\n"
+      "fcvtsd v2, v2\n"
+      "vrsqrts v0, v1, v2\n"
+      "fcvtds v0, v0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(ReciprocalSqrt, assembler) {
@@ -4858,6 +7124,20 @@
   typedef double (*DoubleReturn)() DART_UNUSED;
   double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry());
   EXPECT_FLOAT_EQ(1.0 / sqrt(147000.0), res, 0.0001);
+  EXPECT_DISASSEMBLY(
+      "movz ip0, #0xf1c0 lsl 32\n"
+      "movk ip0, #0x4101 lsl 48\n"
+      "fmovdr v1, ip0\n"
+      "fcvtsd v1, v1\n"
+      "vrsqrtes v0, v1\n"
+      "vmuls v31, v0, v0\n"
+      "vrsqrts v31, v1, v31\n"
+      "vmuls v0, v0, v31\n"
+      "vmuls v31, v0, v0\n"
+      "vrsqrts v31, v1, v31\n"
+      "vmuls v0, v0, v31\n"
+      "fcvtds v0, v0\n"
+      "ret\n");
 }
 
 // Called from assembler_test.cc.
@@ -4919,6 +7199,9 @@
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), 0));
   EXPECT_EQ(0,
             EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), 42));
+  EXPECT_DISASSEMBLY(
+      "andw r0, r0, 0xfffffe00\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(OrImmediate32Negative, assembler) {
@@ -4934,6 +7217,9 @@
             EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), 0));
   EXPECT_EQ(0xfffffe2a,
             EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), 42));
+  EXPECT_DISASSEMBLY(
+      "orrw r0, r0, 0xfffffe00\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(XorImmediate32Negative, assembler) {
@@ -4949,6 +7235,9 @@
             EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), 0));
   EXPECT_EQ(0xfffffe2a,
             EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), 42));
+  EXPECT_DISASSEMBLY(
+      "eorw r0, r0, 0xfffffe00\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(TestImmediate32Negative, assembler) {
@@ -4969,6 +7258,13 @@
   EXPECT_EQ(0, EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), 0));
   EXPECT_EQ(0,
             EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), 42));
+  EXPECT_DISASSEMBLY(
+      "tstw r0, 0xfffffe00\n"
+      "beq +12\n"
+      "movz r0, #0x1\n"
+      "ret\n"
+      "movz r0, #0x0\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(CompareImmediate32Negative, assembler) {
@@ -4990,6 +7286,13 @@
             EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), -512));
   EXPECT_EQ(0,
             EXECUTE_TEST_CODE_INTPTR_INTPTR(IntPtrReturn, test->entry(), -511));
+  EXPECT_DISASSEMBLY(
+      "cmnw r0, #0x200\n"
+      "blt +12\n"
+      "movz r0, #0x0\n"
+      "ret\n"
+      "movz r0, #0x1\n"
+      "ret\n");
 }
 
 #if !defined(USING_THREAD_SANITIZER)
@@ -5014,6 +7317,20 @@
   typedef intptr_t (*StoreReleaseLoadAcquire)(intptr_t) DART_UNUSED;
   EXPECT_EQ(123, EXECUTE_TEST_CODE_INTPTR_INTPTR(StoreReleaseLoadAcquire,
                                                  test->entry(), 123));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "str r1, [r15, #-8]!\n"
+      "movz r1, #0x0\n"
+      "str r1, [r15, #-8]!\n"
+      "mov r1, r0\n"
+      "movz r0, #0x0\n"
+      "stlr r1, r15\n"
+      "ldar r0, r15\n"
+      "ldr r1, [r15], #8 !\n"
+      "ldr r1, [r15], #8 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 
 ASSEMBLER_TEST_GENERATE(StoreReleaseLoadAcquire1024, assembler) {
@@ -5037,6 +7354,24 @@
   typedef intptr_t (*StoreReleaseLoadAcquire1024)(intptr_t) DART_UNUSED;
   EXPECT_EQ(123, EXECUTE_TEST_CODE_INTPTR_INTPTR(StoreReleaseLoadAcquire1024,
                                                  test->entry(), 123));
+  EXPECT_DISASSEMBLY(
+      "mov r15, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "str r1, [r15, #-8]!\n"
+      "movz r1, #0x0\n"
+      "str r1, [r15, #-8]!\n"
+      "mov r1, r0\n"
+      "movz r0, #0x0\n"
+      "sub r15, r15, #0x2000\n"
+      "add ip0, r15, #0x400\n"
+      "stlr r1, ip0\n"
+      "add ip1, r15, #0x400\n"
+      "ldar r0, ip1\n"
+      "add r15, r15, #0x2000\n"
+      "ldr r1, [r15], #8 !\n"
+      "ldr r1, [r15], #8 !\n"
+      "mov csp, r15\n"
+      "ret\n");
 }
 #endif
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm_test.cc b/runtime/vm/compiler/assembler/assembler_arm_test.cc
index f925d7c..64db0ae 100644
--- a/runtime/vm/compiler/assembler/assembler_arm_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm_test.cc
@@ -273,81 +273,68 @@
 }
 
 ASSEMBLER_TEST_GENERATE(Vmov, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ mov(R3, Operand(43));
-    __ mov(R1, Operand(41));
-    __ vmovsrr(S1, R1, R3);       // S1:S2 = 41:43
-    __ vmovs(S0, S2);             // S0 = S2, S0:S1 == 43:41
-    __ vmovd(D2, D0);             // D2 = D0, S4:S5 == 43:41
-    __ vmovrs(R3, S5);            // R3 = S5, R3 == 41
-    __ vmovrrs(R1, R2, S4);       // R1:R2 = S4:S5, R1:R2 == 43:41
-    __ vmovdrr(D3, R3, R2);       // D3 = R3:R2, S6:S7 == 41:41
-    __ vmovdr(D3, 1, R1);         // D3[1] == S7 = R1, S6:S7 == 41:43
-    __ vmovrrd(R0, R1, D3);       // R0:R1 = D3, R0:R1 == 41:43
-    __ sub(R0, R1, Operand(R0));  // 43-41
-  }
+  __ mov(R3, Operand(43));
+  __ mov(R1, Operand(41));
+  __ vmovsrr(S1, R1, R3);       // S1:S2 = 41:43
+  __ vmovs(S0, S2);             // S0 = S2, S0:S1 == 43:41
+  __ vmovd(D2, D0);             // D2 = D0, S4:S5 == 43:41
+  __ vmovrs(R3, S5);            // R3 = S5, R3 == 41
+  __ vmovrrs(R1, R2, S4);       // R1:R2 = S4:S5, R1:R2 == 43:41
+  __ vmovdrr(D3, R3, R2);       // D3 = R3:R2, S6:S7 == 41:41
+  __ vmovdr(D3, 1, R1);         // D3[1] == S7 = R1, S6:S7 == 41:43
+  __ vmovrrd(R0, R1, D3);       // R0:R1 = D3, R0:R1 == 41:43
+  __ sub(R0, R1, Operand(R0));  // 43-41
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(Vmov, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*Vmov)() DART_UNUSED;
-    EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(Vmov, test->entry()));
-  }
+  typedef int (*Vmov)() DART_UNUSED;
+  EXPECT_EQ(2, EXECUTE_TEST_CODE_INT32(Vmov, test->entry()));
 }
 
 ASSEMBLER_TEST_GENERATE(SingleVLoadStore, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
-    __ mov(R2, Operand(SP));
-    __ str(R0, Address(SP, (-target::kWordSize * 30), Address::PreIndex));
-    __ vldrs(S0, Address(R2, (-target::kWordSize * 30)));
-    __ vadds(S0, S0, S0);
-    __ vstrs(S0, Address(R2, (-target::kWordSize * 30)));
-    __ ldr(R0, Address(SP, (target::kWordSize * 30), Address::PostIndex));
-  }
+  __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
+  __ mov(R2, Operand(SP));
+  __ str(R0, Address(SP, (-target::kWordSize * 30), Address::PreIndex));
+  __ vldrs(S0, Address(R2, (-target::kWordSize * 30)));
+  __ vadds(S0, S0, S0);
+  __ vstrs(S0, Address(R2, (-target::kWordSize * 30)));
+  __ ldr(R0, Address(SP, (target::kWordSize * 30), Address::PostIndex));
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(SingleVLoadStore, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef float (*SingleVLoadStore)() DART_UNUSED;
-    float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
-    EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
-  }
+  typedef float (*SingleVLoadStore)() DART_UNUSED;
+  float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
+  EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
 }
 
 ASSEMBLER_TEST_GENERATE(SingleVShiftLoadStore, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
-    __ mov(R2, Operand(SP));
-    // Expressing __str(R0, Address(SP, (-kWordSize * 32), Address::PreIndex));
-    // as:
-    __ mov(R1, Operand(target::kWordSize));
-    __ str(R0, Address(SP, R1, LSL, 5, Address::NegPreIndex));
-    __ vldrs(S0, Address(R2, (-target::kWordSize * 32)));
-    __ vadds(S0, S0, S0);
-    __ vstrs(S0, Address(R2, (-target::kWordSize * 32)));
-    // Expressing __ldr(R0, Address(SP, (kWordSize * 32), Address::PostIndex));
-    // as:
-    __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex));
-  }
+  __ LoadImmediate(R0, bit_cast<int32_t, float>(12.3f));
+  __ mov(R2, Operand(SP));
+  // Expressing __str(R0, Address(SP, (-kWordSize * 32), Address::PreIndex));
+  // as:
+  __ mov(R1, Operand(target::kWordSize));
+  __ str(R0, Address(SP, R1, LSL, 5, Address::NegPreIndex));
+  __ vldrs(S0, Address(R2, (-target::kWordSize * 32)));
+  __ vadds(S0, S0, S0);
+  __ vstrs(S0, Address(R2, (-target::kWordSize * 32)));
+  // Expressing __ldr(R0, Address(SP, (kWordSize * 32), Address::PostIndex));
+  // as:
+  __ ldr(R0, Address(SP, R1, LSL, 5, Address::PostIndex));
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(SingleVShiftLoadStore, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef float (*SingleVLoadStore)() DART_UNUSED;
-    float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
-    EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
-  }
+  typedef float (*SingleVLoadStore)() DART_UNUSED;
+  float res = EXECUTE_TEST_CODE_FLOAT(SingleVLoadStore, test->entry());
+  EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
 }
 
 ASSEMBLER_TEST_GENERATE(DoubleVLoadStore, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
     int64_t value = bit_cast<int64_t, double>(12.3);
     __ LoadImmediate(R0, Utils::Low32Bits(value));
     __ LoadImmediate(R1, Utils::High32Bits(value));
@@ -359,69 +346,57 @@
     __ vstrd(D0, Address(R2, (-target::kWordSize * 30)));
     __ ldr(R1, Address(R2, (-target::kWordSize * 29)));
     __ ldr(R0, Address(SP, (target::kWordSize * 30), Address::PostIndex));
-  }
-  __ Ret();
+    __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(DoubleVLoadStore, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef double (*DoubleVLoadStore)() DART_UNUSED;
-    float res = EXECUTE_TEST_CODE_DOUBLE(DoubleVLoadStore, test->entry());
-    EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
-  }
+  typedef double (*DoubleVLoadStore)() DART_UNUSED;
+  float res = EXECUTE_TEST_CODE_DOUBLE(DoubleVLoadStore, test->entry());
+  EXPECT_FLOAT_EQ(2 * 12.3f, res, 0.001f);
 }
 
 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadSImmediate(S0, 12.3f);
-    __ LoadSImmediate(S1, 3.4f);
-    __ vnegs(S0, S0);      // -12.3f
-    __ vabss(S0, S0);      // 12.3f
-    __ vadds(S0, S0, S1);  // 15.7f
-    __ vmuls(S0, S0, S1);  // 53.38f
-    __ vsubs(S0, S0, S1);  // 49.98f
-    __ vdivs(S0, S0, S1);  // 14.7f
-    __ vsqrts(S0, S0);     // 3.8340579f
-  }
+  __ LoadSImmediate(S0, 12.3f);
+  __ LoadSImmediate(S1, 3.4f);
+  __ vnegs(S0, S0);      // -12.3f
+  __ vabss(S0, S0);      // 12.3f
+  __ vadds(S0, S0, S1);  // 15.7f
+  __ vmuls(S0, S0, S1);  // 53.38f
+  __ vsubs(S0, S0, S1);  // 49.98f
+  __ vdivs(S0, S0, S1);  // 14.7f
+  __ vsqrts(S0, S0);     // 3.8340579f
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(SingleFPOperations, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef float (*SingleFPOperations)() DART_UNUSED;
-    float res = EXECUTE_TEST_CODE_FLOAT(SingleFPOperations, test->entry());
-    EXPECT_FLOAT_EQ(3.8340579f, res, 0.001f);
-  }
+  typedef float (*SingleFPOperations)() DART_UNUSED;
+  float res = EXECUTE_TEST_CODE_FLOAT(SingleFPOperations, test->entry());
+  EXPECT_FLOAT_EQ(3.8340579f, res, 0.001f);
 }
 
 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadDImmediate(D0, 12.3, R0);
-    __ LoadDImmediate(D1, 3.4, R0);
-    __ vnegd(D0, D0);      // -12.3
-    __ vabsd(D0, D0);      // 12.3
-    __ vaddd(D0, D0, D1);  // 15.7
-    __ vmuld(D0, D0, D1);  // 53.38
-    __ vsubd(D0, D0, D1);  // 49.98
-    __ vdivd(D0, D0, D1);  // 14.7
-    __ vsqrtd(D0, D0);     // 3.8340579
-  }
+  __ LoadDImmediate(D0, 12.3, R0);
+  __ LoadDImmediate(D1, 3.4, R0);
+  __ vnegd(D0, D0);      // -12.3
+  __ vabsd(D0, D0);      // 12.3
+  __ vaddd(D0, D0, D1);  // 15.7
+  __ vmuld(D0, D0, D1);  // 53.38
+  __ vsubd(D0, D0, D1);  // 49.98
+  __ vdivd(D0, D0, D1);  // 14.7
+  __ vsqrtd(D0, D0);     // 3.8340579
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef double (*DoubleFPOperations)() DART_UNUSED;
-    double res = EXECUTE_TEST_CODE_DOUBLE(DoubleFPOperations, test->entry());
-    EXPECT_FLOAT_EQ(3.8340579, res, 0.001);
-  }
+  typedef double (*DoubleFPOperations)() DART_UNUSED;
+  double res = EXECUTE_TEST_CODE_DOUBLE(DoubleFPOperations, test->entry());
+  EXPECT_FLOAT_EQ(3.8340579, res, 0.001);
 }
 
 ASSEMBLER_TEST_GENERATE(DoubleSqrtNeg, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
     // Check that sqrt of a negative double gives NaN.
     __ LoadDImmediate(D1, -1.0, R0);
     __ vsqrtd(D0, D1);
@@ -429,161 +404,128 @@
     __ vmstat();
     __ mov(R0, Operand(1), VS);
     __ mov(R0, Operand(0), VC);
-  }
-  __ Ret();
+    __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(DoubleSqrtNeg, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*DoubleSqrtNeg)() DART_UNUSED;
-    EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(DoubleSqrtNeg, test->entry()));
-  }
+  typedef int (*DoubleSqrtNeg)() DART_UNUSED;
+  EXPECT_EQ(1, EXECUTE_TEST_CODE_INT32(DoubleSqrtNeg, test->entry()));
 }
 
 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ mov(R3, Operand(6));
-    __ vmovsr(S3, R3);
-    __ vcvtdi(D0, S3);
-  }
+  __ mov(R3, Operand(6));
+  __ vmovsr(S3, R3);
+  __ vcvtdi(D0, S3);
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef double (*IntToDoubleConversionCode)() DART_UNUSED;
-    double res =
-        EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode, test->entry());
-    EXPECT_FLOAT_EQ(6.0, res, 0.001);
-  }
+  typedef double (*IntToDoubleConversionCode)() DART_UNUSED;
+  double res =
+      EXECUTE_TEST_CODE_DOUBLE(IntToDoubleConversionCode, test->entry());
+  EXPECT_FLOAT_EQ(6.0, res, 0.001);
 }
 
 ASSEMBLER_TEST_GENERATE(LongToDoubleConversion, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    int64_t value = 60000000000LL;
-    __ LoadImmediate(R0, Utils::Low32Bits(value));
-    __ LoadImmediate(R1, Utils::High32Bits(value));
-    __ vmovsr(S0, R0);
-    __ vmovsr(S2, R1);
-    __ vcvtdu(D0, S0);
-    __ vcvtdi(D1, S2);
-    __ LoadDImmediate(D2, 1.0 * (1LL << 32), R0);
-    __ vmlad(D0, D1, D2);
-  }
+  int64_t value = 60000000000LL;
+  __ LoadImmediate(R0, Utils::Low32Bits(value));
+  __ LoadImmediate(R1, Utils::High32Bits(value));
+  __ vmovsr(S0, R0);
+  __ vmovsr(S2, R1);
+  __ vcvtdu(D0, S0);
+  __ vcvtdi(D1, S2);
+  __ LoadDImmediate(D2, 1.0 * (1LL << 32), R0);
+  __ vmlad(D0, D1, D2);
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(LongToDoubleConversion, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef double (*LongToDoubleConversionCode)() DART_UNUSED;
-    double res =
-        EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode, test->entry());
-    EXPECT_FLOAT_EQ(60000000000.0, res, 0.001);
-  }
+  typedef double (*LongToDoubleConversionCode)() DART_UNUSED;
+  double res =
+      EXECUTE_TEST_CODE_DOUBLE(LongToDoubleConversionCode, test->entry());
+  EXPECT_FLOAT_EQ(60000000000.0, res, 0.001);
 }
 
 ASSEMBLER_TEST_GENERATE(IntToFloatConversion, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ mov(R3, Operand(6));
-    __ vmovsr(S3, R3);
-    __ vcvtsi(S0, S3);
-  }
+  __ mov(R3, Operand(6));
+  __ vmovsr(S3, R3);
+  __ vcvtsi(S0, S3);
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(IntToFloatConversion, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef float (*IntToFloatConversionCode)() DART_UNUSED;
-    float res =
-        EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode, test->entry());
-    EXPECT_FLOAT_EQ(6.0, res, 0.001);
-  }
+  typedef float (*IntToFloatConversionCode)() DART_UNUSED;
+  float res = EXECUTE_TEST_CODE_FLOAT(IntToFloatConversionCode, test->entry());
+  EXPECT_FLOAT_EQ(6.0, res, 0.001);
 }
 
 ASSEMBLER_TEST_GENERATE(FloatToIntConversion, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ vcvtis(S1, S0);
-    __ vmovrs(R0, S1);
-  }
+  __ vcvtis(S1, S0);
+  __ vmovrs(R0, S1);
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(FloatToIntConversion, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*FloatToIntConversion)(float arg) DART_UNUSED;
-    EXPECT_EQ(12, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
-                                            12.8f));
-    EXPECT_EQ(INT32_MIN, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion,
-                                                   test->entry(), -FLT_MAX));
-    EXPECT_EQ(INT32_MAX, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion,
-                                                   test->entry(), FLT_MAX));
-  }
+  typedef int (*FloatToIntConversion)(float arg) DART_UNUSED;
+  EXPECT_EQ(12, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion, test->entry(),
+                                          12.8f));
+  EXPECT_EQ(INT32_MIN, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion,
+                                                 test->entry(), -FLT_MAX));
+  EXPECT_EQ(INT32_MAX, EXECUTE_TEST_CODE_INT32_F(FloatToIntConversion,
+                                                 test->entry(), FLT_MAX));
 }
 
 ASSEMBLER_TEST_GENERATE(DoubleToIntConversion, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ vcvtid(S0, D0);
-    __ vmovrs(R0, S0);
-  }
+  __ vcvtid(S0, D0);
+  __ vmovrs(R0, S0);
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(DoubleToIntConversion, test) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*DoubleToIntConversion)(double arg) DART_UNUSED;
-    EXPECT(test != NULL);
-    EXPECT_EQ(12, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion,
-                                            test->entry(), 12.8));
-    EXPECT_EQ(INT32_MIN, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion,
-                                                   test->entry(), -DBL_MAX));
-    EXPECT_EQ(INT32_MAX, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion,
-                                                   test->entry(), DBL_MAX));
-  }
+  typedef int (*DoubleToIntConversion)(double arg) DART_UNUSED;
+  EXPECT(test != NULL);
+  EXPECT_EQ(12, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion, test->entry(),
+                                          12.8));
+  EXPECT_EQ(INT32_MIN, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion,
+                                                 test->entry(), -DBL_MAX));
+  EXPECT_EQ(INT32_MAX, EXECUTE_TEST_CODE_INT32_D(DoubleToIntConversion,
+                                                 test->entry(), DBL_MAX));
 }
 
 ASSEMBLER_TEST_GENERATE(FloatToDoubleConversion, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadSImmediate(S2, 12.8f);
-    __ vcvtds(D0, S2);
-  }
+  __ LoadSImmediate(S2, 12.8f);
+  __ vcvtds(D0, S2);
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(FloatToDoubleConversion, test) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef double (*FloatToDoubleConversionCode)() DART_UNUSED;
-    EXPECT(test != NULL);
-    double res =
-        EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode, test->entry());
-    EXPECT_FLOAT_EQ(12.8, res, 0.001);
-  }
+  typedef double (*FloatToDoubleConversionCode)() DART_UNUSED;
+  EXPECT(test != NULL);
+  double res =
+      EXECUTE_TEST_CODE_DOUBLE(FloatToDoubleConversionCode, test->entry());
+  EXPECT_FLOAT_EQ(12.8, res, 0.001);
 }
 
 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadDImmediate(D1, 12.8, R0);
-    __ vcvtsd(S0, D1);
-  }
+  __ LoadDImmediate(D1, 12.8, R0);
+  __ vcvtsd(S0, D1);
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(DoubleToFloatConversion, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef float (*DoubleToFloatConversionCode)() DART_UNUSED;
-    float res =
-        EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode, test->entry());
-    EXPECT_FLOAT_EQ(12.8, res, 0.001);
-  }
+  typedef float (*DoubleToFloatConversionCode)() DART_UNUSED;
+  float res =
+      EXECUTE_TEST_CODE_FLOAT(DoubleToFloatConversionCode, test->entry());
+  EXPECT_FLOAT_EQ(12.8, res, 0.001);
 }
 
 ASSEMBLER_TEST_GENERATE(FloatCompare, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
     // Test 12.3f vs 12.5f.
     __ LoadSImmediate(S0, 12.3f);
     __ LoadSImmediate(S1, 12.5f);
@@ -605,21 +547,17 @@
     __ vmstat();
     // Error if not unordered (not Nan).
     __ add(R0, R0, Operand(16), VC);
-  }
-  // R0 is 0 if all tests passed.
-  __ Ret();
+    // R0 is 0 if all tests passed.
+    __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(FloatCompare, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*FloatCompare)() DART_UNUSED;
-    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(FloatCompare, test->entry()));
-  }
+  typedef int (*FloatCompare)() DART_UNUSED;
+  EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(FloatCompare, test->entry()));
 }
 
 ASSEMBLER_TEST_GENERATE(DoubleCompare, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
     // Test 12.3 vs 12.5.
     __ LoadDImmediate(D0, 12.3, R1);
     __ LoadDImmediate(D1, 12.5, R1);
@@ -641,17 +579,14 @@
     __ vmstat();
     // Error if not unordered (not Nan).
     __ add(R0, R0, Operand(16), VC);
-  }
-  // R0 is 0 if all tests passed.
-  __ Ret();
+    // R0 is 0 if all tests passed.
+    __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(DoubleCompare, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*DoubleCompare)() DART_UNUSED;
-    EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(DoubleCompare, test->entry()));
-  }
+  typedef int (*DoubleCompare)() DART_UNUSED;
+  EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(DoubleCompare, test->entry()));
 }
 
 ASSEMBLER_TEST_GENERATE(Loop, assembler) {
@@ -976,28 +911,24 @@
 }
 
 ASSEMBLER_TEST_GENERATE(QuotientRemainder, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ vmovsr(S2, R0);
-    __ vmovsr(S4, R2);
-    __ vcvtdi(D1, S2);
-    __ vcvtdi(D2, S4);
-    __ vdivd(D0, D1, D2);
-    __ vcvtid(S0, D0);
-    __ vmovrs(R1, S0);       // r1 = r0/r2
-    __ mls(R0, R1, R2, R0);  // r0 = r0 - r1*r2
-  }
+  __ vmovsr(S2, R0);
+  __ vmovsr(S4, R2);
+  __ vcvtdi(D1, S2);
+  __ vcvtdi(D2, S4);
+  __ vdivd(D0, D1, D2);
+  __ vcvtid(S0, D0);
+  __ vmovrs(R1, S0);       // r1 = r0/r2
+  __ mls(R0, R1, R2, R0);  // r0 = r0 - r1*r2
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(QuotientRemainder, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor)
-        DART_UNUSED;
-    EXPECT_EQ(0x1000400000da8LL,
-              EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(),
-                                         0x12345678, 0x1234));
-  }
+  typedef int64_t (*QuotientRemainder)(int64_t dividend, int64_t divisor)
+      DART_UNUSED;
+  EXPECT_EQ(0x1000400000da8LL,
+            EXECUTE_TEST_CODE_INT64_LL(QuotientRemainder, test->entry(),
+                                       0x12345678, 0x1234));
 }
 
 ASSEMBLER_TEST_GENERATE(Multiply64To64, assembler) {
@@ -1437,332 +1368,308 @@
 
 // Make sure we can store and reload the D registers using vstmd and vldmd
 ASSEMBLER_TEST_GENERATE(VstmdVldmd, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadDImmediate(D0, 0.0, R0);
-    __ LoadDImmediate(D1, 1.0, R0);
-    __ LoadDImmediate(D2, 2.0, R0);
-    __ LoadDImmediate(D3, 3.0, R0);
-    __ LoadDImmediate(D4, 4.0, R0);
-    __ vstmd(DB_W, SP, D0, 5);  // Push D0 - D4 onto the stack, dec SP
-    __ LoadDImmediate(D0, 0.0, R0);
-    __ LoadDImmediate(D1, 0.0, R0);
-    __ LoadDImmediate(D2, 0.0, R0);
-    __ LoadDImmediate(D3, 0.0, R0);
-    __ LoadDImmediate(D4, 0.0, R0);
-    __ vldmd(IA_W, SP, D0, 5);  // Pop stack into D0 - D4, inc SP
+  __ LoadDImmediate(D0, 0.0, R0);
+  __ LoadDImmediate(D1, 1.0, R0);
+  __ LoadDImmediate(D2, 2.0, R0);
+  __ LoadDImmediate(D3, 3.0, R0);
+  __ LoadDImmediate(D4, 4.0, R0);
+  __ vstmd(DB_W, SP, D0, 5);  // Push D0 - D4 onto the stack, dec SP
+  __ LoadDImmediate(D0, 0.0, R0);
+  __ LoadDImmediate(D1, 0.0, R0);
+  __ LoadDImmediate(D2, 0.0, R0);
+  __ LoadDImmediate(D3, 0.0, R0);
+  __ LoadDImmediate(D4, 0.0, R0);
+  __ vldmd(IA_W, SP, D0, 5);  // Pop stack into D0 - D4, inc SP
 
-    // Load success value into R0
-    __ mov(R0, Operand(42));
+  // Load success value into R0
+  __ mov(R0, Operand(42));
 
-    // Check that 4.0 is back in D4
-    __ LoadDImmediate(D5, 4.0, R1);
-    __ vcmpd(D4, D5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 4.0 is back in D4
+  __ LoadDImmediate(D5, 4.0, R1);
+  __ vcmpd(D4, D5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 3.0 is back in D3
-    __ LoadDImmediate(D5, 3.0, R1);
-    __ vcmpd(D3, D5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 3.0 is back in D3
+  __ LoadDImmediate(D5, 3.0, R1);
+  __ vcmpd(D3, D5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 2.0 is back in D2
-    __ LoadDImmediate(D5, 2.0, R1);
-    __ vcmpd(D2, D5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 2.0 is back in D2
+  __ LoadDImmediate(D5, 2.0, R1);
+  __ vcmpd(D2, D5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 1.0 is back in D1
-    __ LoadDImmediate(D5, 1.0, R1);
-    __ vcmpd(D1, D5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
-  }
+  // Check that 1.0 is back in D1
+  __ LoadDImmediate(D5, 1.0, R1);
+  __ vcmpd(D1, D5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(VstmdVldmd, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
 }
 
 // Make sure we can store and reload the S registers using vstms and vldms
 ASSEMBLER_TEST_GENERATE(VstmsVldms, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadSImmediate(S0, 0.0);
-    __ LoadSImmediate(S1, 1.0);
-    __ LoadSImmediate(S2, 2.0);
-    __ LoadSImmediate(S3, 3.0);
-    __ LoadSImmediate(S4, 4.0);
-    __ vstms(DB_W, SP, S0, S4);  // Push S0 - S4 onto the stack, dec SP
-    __ LoadSImmediate(S0, 0.0);
-    __ LoadSImmediate(S1, 0.0);
-    __ LoadSImmediate(S2, 0.0);
-    __ LoadSImmediate(S3, 0.0);
-    __ LoadSImmediate(S4, 0.0);
-    __ vldms(IA_W, SP, S0, S4);  // Pop stack into S0 - S4, inc SP
+  __ LoadSImmediate(S0, 0.0);
+  __ LoadSImmediate(S1, 1.0);
+  __ LoadSImmediate(S2, 2.0);
+  __ LoadSImmediate(S3, 3.0);
+  __ LoadSImmediate(S4, 4.0);
+  __ vstms(DB_W, SP, S0, S4);  // Push S0 - S4 onto the stack, dec SP
+  __ LoadSImmediate(S0, 0.0);
+  __ LoadSImmediate(S1, 0.0);
+  __ LoadSImmediate(S2, 0.0);
+  __ LoadSImmediate(S3, 0.0);
+  __ LoadSImmediate(S4, 0.0);
+  __ vldms(IA_W, SP, S0, S4);  // Pop stack into S0 - S4, inc SP
 
-    // Load success value into R0
-    __ mov(R0, Operand(42));
+  // Load success value into R0
+  __ mov(R0, Operand(42));
 
-    // Check that 4.0 is back in S4
-    __ LoadSImmediate(S5, 4.0);
-    __ vcmps(S4, S5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 4.0 is back in S4
+  __ LoadSImmediate(S5, 4.0);
+  __ vcmps(S4, S5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 3.0 is back in S3
-    __ LoadSImmediate(S5, 3.0);
-    __ vcmps(S3, S5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 3.0 is back in S3
+  __ LoadSImmediate(S5, 3.0);
+  __ vcmps(S3, S5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 2.0 is back in S2
-    __ LoadSImmediate(S5, 2.0);
-    __ vcmps(S2, S5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 2.0 is back in S2
+  __ LoadSImmediate(S5, 2.0);
+  __ vcmps(S2, S5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 1.0 is back in S1
-    __ LoadSImmediate(S5, 1.0);
-    __ vcmps(S1, S5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
-  }
+  // Check that 1.0 is back in S1
+  __ LoadSImmediate(S5, 1.0);
+  __ vcmps(S1, S5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(VstmsVldms, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
 }
 
 // Make sure we can start somewhere other than D0
 ASSEMBLER_TEST_GENERATE(VstmdVldmd1, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadDImmediate(D1, 1.0, R0);
-    __ LoadDImmediate(D2, 2.0, R0);
-    __ LoadDImmediate(D3, 3.0, R0);
-    __ LoadDImmediate(D4, 4.0, R0);
-    __ vstmd(DB_W, SP, D1, 4);  // Push D1 - D4 onto the stack, dec SP
-    __ LoadDImmediate(D1, 0.0, R0);
-    __ LoadDImmediate(D2, 0.0, R0);
-    __ LoadDImmediate(D3, 0.0, R0);
-    __ LoadDImmediate(D4, 0.0, R0);
-    __ vldmd(IA_W, SP, D1, 4);  // Pop stack into D1 - D4, inc SP
+  __ LoadDImmediate(D1, 1.0, R0);
+  __ LoadDImmediate(D2, 2.0, R0);
+  __ LoadDImmediate(D3, 3.0, R0);
+  __ LoadDImmediate(D4, 4.0, R0);
+  __ vstmd(DB_W, SP, D1, 4);  // Push D1 - D4 onto the stack, dec SP
+  __ LoadDImmediate(D1, 0.0, R0);
+  __ LoadDImmediate(D2, 0.0, R0);
+  __ LoadDImmediate(D3, 0.0, R0);
+  __ LoadDImmediate(D4, 0.0, R0);
+  __ vldmd(IA_W, SP, D1, 4);  // Pop stack into D1 - D4, inc SP
 
-    // Load success value into R0
-    __ mov(R0, Operand(42));
+  // Load success value into R0
+  __ mov(R0, Operand(42));
 
-    // Check that 4.0 is back in D4
-    __ LoadDImmediate(D5, 4.0, R1);
-    __ vcmpd(D4, D5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 4.0 is back in D4
+  __ LoadDImmediate(D5, 4.0, R1);
+  __ vcmpd(D4, D5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 3.0 is back in D3
-    __ LoadDImmediate(D5, 3.0, R1);
-    __ vcmpd(D3, D5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 3.0 is back in D3
+  __ LoadDImmediate(D5, 3.0, R1);
+  __ vcmpd(D3, D5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 2.0 is back in D2
-    __ LoadDImmediate(D5, 2.0, R1);
-    __ vcmpd(D2, D5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 2.0 is back in D2
+  __ LoadDImmediate(D5, 2.0, R1);
+  __ vcmpd(D2, D5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 1.0 is back in D1
-    __ LoadDImmediate(D5, 1.0, R1);
-    __ vcmpd(D1, D5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
-  }
+  // Check that 1.0 is back in D1
+  __ LoadDImmediate(D5, 1.0, R1);
+  __ vcmpd(D1, D5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(VstmdVldmd1, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
 }
 
 // Make sure we can start somewhere other than S0
 ASSEMBLER_TEST_GENERATE(VstmsVldms1, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadSImmediate(S1, 1.0);
-    __ LoadSImmediate(S2, 2.0);
-    __ LoadSImmediate(S3, 3.0);
-    __ LoadSImmediate(S4, 4.0);
-    __ vstms(DB_W, SP, S1, S4);  // Push S0 - S4 onto the stack, dec SP
-    __ LoadSImmediate(S1, 0.0);
-    __ LoadSImmediate(S2, 0.0);
-    __ LoadSImmediate(S3, 0.0);
-    __ LoadSImmediate(S4, 0.0);
-    __ vldms(IA_W, SP, S1, S4);  // Pop stack into S0 - S4, inc SP
+  __ LoadSImmediate(S1, 1.0);
+  __ LoadSImmediate(S2, 2.0);
+  __ LoadSImmediate(S3, 3.0);
+  __ LoadSImmediate(S4, 4.0);
+  __ vstms(DB_W, SP, S1, S4);  // Push S0 - S4 onto the stack, dec SP
+  __ LoadSImmediate(S1, 0.0);
+  __ LoadSImmediate(S2, 0.0);
+  __ LoadSImmediate(S3, 0.0);
+  __ LoadSImmediate(S4, 0.0);
+  __ vldms(IA_W, SP, S1, S4);  // Pop stack into S0 - S4, inc SP
 
-    // Load success value into R0
-    __ mov(R0, Operand(42));
+  // Load success value into R0
+  __ mov(R0, Operand(42));
 
-    // Check that 4.0 is back in S4
-    __ LoadSImmediate(S5, 4.0);
-    __ vcmps(S4, S5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 4.0 is back in S4
+  __ LoadSImmediate(S5, 4.0);
+  __ vcmps(S4, S5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 3.0 is back in S3
-    __ LoadSImmediate(S5, 3.0);
-    __ vcmps(S3, S5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 3.0 is back in S3
+  __ LoadSImmediate(S5, 3.0);
+  __ vcmps(S3, S5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 2.0 is back in S2
-    __ LoadSImmediate(S5, 2.0);
-    __ vcmps(S2, S5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 2.0 is back in S2
+  __ LoadSImmediate(S5, 2.0);
+  __ vcmps(S2, S5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 1.0 is back in S1
-    __ LoadSImmediate(S5, 1.0);
-    __ vcmps(S1, S5);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
-  }
+  // Check that 1.0 is back in S1
+  __ LoadSImmediate(S5, 1.0);
+  __ vcmps(S1, S5);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(VstmsVldms1, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
 }
 
 // Make sure we can store the D registers using vstmd and
 // load them into a different set using vldmd
 ASSEMBLER_TEST_GENERATE(VstmdVldmd_off, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    // Save used callee-saved FPU registers.
-    __ vstmd(DB_W, SP, D8, 3);
-    __ LoadDImmediate(D0, 0.0, R0);
-    __ LoadDImmediate(D1, 1.0, R0);
-    __ LoadDImmediate(D2, 2.0, R0);
-    __ LoadDImmediate(D3, 3.0, R0);
-    __ LoadDImmediate(D4, 4.0, R0);
-    __ LoadDImmediate(D5, 5.0, R0);
-    __ vstmd(DB_W, SP, D0, 5);  // Push D0 - D4 onto the stack, dec SP
-    __ vldmd(IA_W, SP, D5, 5);  // Pop stack into D5 - D9, inc SP
+  // Save used callee-saved FPU registers.
+  __ vstmd(DB_W, SP, D8, 3);
+  __ LoadDImmediate(D0, 0.0, R0);
+  __ LoadDImmediate(D1, 1.0, R0);
+  __ LoadDImmediate(D2, 2.0, R0);
+  __ LoadDImmediate(D3, 3.0, R0);
+  __ LoadDImmediate(D4, 4.0, R0);
+  __ LoadDImmediate(D5, 5.0, R0);
+  __ vstmd(DB_W, SP, D0, 5);  // Push D0 - D4 onto the stack, dec SP
+  __ vldmd(IA_W, SP, D5, 5);  // Pop stack into D5 - D9, inc SP
 
-    // Load success value into R0
-    __ mov(R0, Operand(42));
+  // Load success value into R0
+  __ mov(R0, Operand(42));
 
-    // Check that 4.0 is in D9
-    __ LoadDImmediate(D10, 4.0, R1);
-    __ vcmpd(D9, D10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 4.0 is in D9
+  __ LoadDImmediate(D10, 4.0, R1);
+  __ vcmpd(D9, D10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 3.0 is in D8
-    __ LoadDImmediate(D10, 3.0, R1);
-    __ vcmpd(D8, D10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 3.0 is in D8
+  __ LoadDImmediate(D10, 3.0, R1);
+  __ vcmpd(D8, D10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 2.0 is in D7
-    __ LoadDImmediate(D10, 2.0, R1);
-    __ vcmpd(D7, D10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 2.0 is in D7
+  __ LoadDImmediate(D10, 2.0, R1);
+  __ vcmpd(D7, D10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 1.0 is in D6
-    __ LoadDImmediate(D10, 1.0, R1);
-    __ vcmpd(D6, D10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 1.0 is in D6
+  __ LoadDImmediate(D10, 1.0, R1);
+  __ vcmpd(D6, D10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Check that 0.0 is in D5
-    __ LoadDImmediate(D10, 0.0, R1);
-    __ vcmpd(D5, D10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
+  // Check that 0.0 is in D5
+  __ LoadDImmediate(D10, 0.0, R1);
+  __ vcmpd(D5, D10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure into R0 if NE
 
-    // Restore used callee-saved FPU registers.
-    __ vldmd(IA_W, SP, D8, 3);
-  }
+  // Restore used callee-saved FPU registers.
+  __ vldmd(IA_W, SP, D8, 3);
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(VstmdVldmd_off, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
 }
 
 // Make sure we can start somewhere other than S0
 ASSEMBLER_TEST_GENERATE(VstmsVldms_off, assembler) {
-  if (TargetCPUFeatures::vfp_supported()) {
-    __ LoadSImmediate(S0, 0.0);
-    __ LoadSImmediate(S1, 1.0);
-    __ LoadSImmediate(S2, 2.0);
-    __ LoadSImmediate(S3, 3.0);
-    __ LoadSImmediate(S4, 4.0);
-    __ LoadSImmediate(S5, 5.0);
-    __ vstms(DB_W, SP, S0, S4);  // Push S0 - S4 onto the stack, dec SP
-    __ vldms(IA_W, SP, S5, S9);  // Pop stack into S5 - S9, inc SP
+  __ LoadSImmediate(S0, 0.0);
+  __ LoadSImmediate(S1, 1.0);
+  __ LoadSImmediate(S2, 2.0);
+  __ LoadSImmediate(S3, 3.0);
+  __ LoadSImmediate(S4, 4.0);
+  __ LoadSImmediate(S5, 5.0);
+  __ vstms(DB_W, SP, S0, S4);  // Push S0 - S4 onto the stack, dec SP
+  __ vldms(IA_W, SP, S5, S9);  // Pop stack into S5 - S9, inc SP
 
-    // Load success value into R0
-    __ mov(R0, Operand(42));
+  // Load success value into R0
+  __ mov(R0, Operand(42));
 
-    // Check that 4.0 is in S9
-    __ LoadSImmediate(S10, 4.0);
-    __ vcmps(S9, S10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 4.0 is in S9
+  __ LoadSImmediate(S10, 4.0);
+  __ vcmps(S9, S10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 3.0 is in S8
-    __ LoadSImmediate(S10, 3.0);
-    __ vcmps(S8, S10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 3.0 is in S8
+  __ LoadSImmediate(S10, 3.0);
+  __ vcmps(S8, S10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 2.0 is in S7
-    __ LoadSImmediate(S10, 2.0);
-    __ vcmps(S7, S10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 2.0 is in S7
+  __ LoadSImmediate(S10, 2.0);
+  __ vcmps(S7, S10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 1.0 is back in S6
-    __ LoadSImmediate(S10, 1.0);
-    __ vcmps(S6, S10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
+  // Check that 1.0 is back in S6
+  __ LoadSImmediate(S10, 1.0);
+  __ vcmps(S6, S10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
 
-    // Check that 0.0 is back in S5
-    __ LoadSImmediate(S10, 0.0);
-    __ vcmps(S5, S10);
-    __ vmstat();
-    __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
-  }
+  // Check that 0.0 is back in S5
+  __ LoadSImmediate(S10, 0.0);
+  __ vcmps(S5, S10);
+  __ vmstat();
+  __ mov(R0, Operand(0), NE);  // Put failure value into R0 if NE
   __ Ret();
 }
 
 ASSEMBLER_TEST_RUN(VstmsVldms_off, test) {
   EXPECT(test != NULL);
-  if (TargetCPUFeatures::vfp_supported()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
 }
 
 //                                          3         2         1         0
@@ -1942,11 +1849,9 @@
   HostCPUFeatures::set_integer_division_supported(orig);
   __ Ret();
 #else
-  if (TargetCPUFeatures::can_divide()) {
-    __ mov(R0, Operand(27));
-    __ mov(R1, Operand(9));
-    __ IntegerDivide(R0, R0, R1, D0, D1);
-  }
+  __ mov(R0, Operand(27));
+  __ mov(R1, Operand(9));
+  __ IntegerDivide(R0, R0, R1, D0, D1);
   __ Ret();
 #endif
 }
@@ -1956,36 +1861,28 @@
 #if defined(USING_SIMULATOR)
   bool orig = TargetCPUFeatures::integer_division_supported();
   HostCPUFeatures::set_integer_division_supported(true);
-  if (TargetCPUFeatures::can_divide()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
   HostCPUFeatures::set_integer_division_supported(orig);
 #else
-  if (TargetCPUFeatures::can_divide()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
 #endif
 }
 
 ASSEMBLER_TEST_GENERATE(IntDiv_unsupported, assembler) {
 #if defined(USING_SIMULATOR)
-  if (TargetCPUFeatures::can_divide()) {
     bool orig = TargetCPUFeatures::integer_division_supported();
     HostCPUFeatures::set_integer_division_supported(false);
     __ mov(R0, Operand(27));
     __ mov(R1, Operand(9));
     __ IntegerDivide(R0, R0, R1, D0, D1);
     HostCPUFeatures::set_integer_division_supported(orig);
-  }
   __ Ret();
 #else
-  if (TargetCPUFeatures::can_divide()) {
-    __ mov(R0, Operand(27));
-    __ mov(R1, Operand(9));
-    __ IntegerDivide(R0, R0, R1, D0, D1);
-  }
+  __ mov(R0, Operand(27));
+  __ mov(R1, Operand(9));
+  __ IntegerDivide(R0, R0, R1, D0, D1);
   __ Ret();
 #endif
 }
@@ -1995,16 +1892,12 @@
 #if defined(USING_SIMULATOR)
   bool orig = TargetCPUFeatures::integer_division_supported();
   HostCPUFeatures::set_integer_division_supported(false);
-  if (TargetCPUFeatures::can_divide()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
   HostCPUFeatures::set_integer_division_supported(orig);
 #else
-  if (TargetCPUFeatures::can_divide()) {
-    typedef int (*Tst)() DART_UNUSED;
-    EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
-  }
+  typedef int (*Tst)() DART_UNUSED;
+  EXPECT_EQ(3, EXECUTE_TEST_CODE_INT32(Tst, test->entry()));
 #endif
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index 6bd5f28..e5b2b1a 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -882,6 +882,18 @@
                                            Register index,
                                            intptr_t extra_disp = 0);
 
+  void LoadStaticFieldAddress(Register address,
+                              Register field,
+                              Register scratch) {
+    LoadCompressedFieldFromOffset(
+        scratch, field, target::Field::host_offset_or_field_id_offset());
+    const intptr_t field_table_offset =
+        compiler::target::Thread::field_table_values_offset();
+    LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));
+    static_assert(kSmiTagShift == 1, "adjust scale factor");
+    leal(address, Address(address, scratch, TIMES_HALF_WORD_SIZE, 0));
+  }
+
   void LoadCompressedFieldAddressForRegOffset(Register address,
                                               Register instance,
                                               Register offset_in_words_as_smi) {
diff --git a/runtime/vm/compiler/assembler/assembler_ia32_test.cc b/runtime/vm/compiler/assembler/assembler_ia32_test.cc
index 4f98613..43c4818 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32_test.cc
@@ -15,7 +15,7 @@
 #define EXPECT_DISASSEMBLY(expected)
 #else
 #define EXPECT_DISASSEMBLY(expected)                                           \
-  EXPECT_STREQ(expected, test->BlankedDisassembly())
+  EXPECT_STREQ(expected, test->RelativeDisassembly())
 #endif
 
 namespace dart {
@@ -119,12 +119,12 @@
       "mov eax,[esp-0x4]\n"
       "mov eax,[ebp-0x4]\n"
       "mov eax,[eax-0x4]\n"
-      "mov eax,[esp+0x...]\n"
-      "mov eax,[ebp+0x...]\n"
-      "mov eax,[eax+0x...]\n"
-      "mov eax,[esp-0x...]\n"
-      "mov eax,[ebp-0x...]\n"
-      "mov eax,[eax-0x...]\n"
+      "mov eax,[esp+0x400]\n"
+      "mov eax,[ebp+0x400]\n"
+      "mov eax,[eax+0x400]\n"
+      "mov eax,[esp-0x400]\n"
+      "mov eax,[ebp-0x400]\n"
+      "mov eax,[eax-0x400]\n"
       "mov eax,[eax]\n"
       "mov eax,[eax+0x1]\n"
       "mov eax,[eax+0x2]\n"
@@ -133,8 +133,8 @@
       "mov eax,[eax+0x1]\n"
       "mov eax,[ebp*2+0x4]\n"
       "mov eax,[eax*2+0x4]\n"
-      "mov eax,[ebp*2+0x...]\n"
-      "mov eax,[eax*2+0x...]\n"
+      "mov eax,[ebp*2+0x400]\n"
+      "mov eax,[eax*2+0x400]\n"
       "mov eax,[eax+ebp*2]\n"
       "mov eax,[eax+eax*2]\n"
       "mov eax,[ebp+ebp*2+0]\n"
@@ -147,12 +147,12 @@
       "mov eax,[ebp+eax*2+0x4]\n"
       "mov eax,[esp+ebp*2+0x4]\n"
       "mov eax,[esp+eax*2+0x4]\n"
-      "mov eax,[eax+ebp*2+0x...]\n"
-      "mov eax,[eax+eax*2+0x...]\n"
-      "mov eax,[ebp+ebp*2+0x...]\n"
-      "mov eax,[ebp+eax*2+0x...]\n"
-      "mov eax,[esp+ebp*2+0x...]\n"
-      "mov eax,[esp+eax*2+0x...]\n");
+      "mov eax,[eax+ebp*2+0x400]\n"
+      "mov eax,[eax+eax*2+0x400]\n"
+      "mov eax,[ebp+ebp*2+0x400]\n"
+      "mov eax,[ebp+eax*2+0x400]\n"
+      "mov eax,[esp+ebp*2+0x400]\n"
+      "mov eax,[esp+eax*2+0x400]\n");
 }
 
 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) {
@@ -180,23 +180,23 @@
   typedef void (*JumpAroundCrashCode)();
   reinterpret_cast<JumpAroundCrashCode>(test->entry())();
   EXPECT_DISASSEMBLY(
-      "jo 0x........\n"
-      "jno 0x........\n"
-      "jc 0x........\n"
-      "jnc 0x........\n"
-      "jz 0x........\n"
-      "jnz 0x........\n"
-      "jna 0x........\n"
-      "ja 0x........\n"
-      "js 0x........\n"
-      "jns 0x........\n"
-      "jpe 0x........\n"
-      "jpo 0x........\n"
-      "jl 0x........\n"
-      "jge 0x........\n"
-      "jle 0x........\n"
-      "jg 0x........\n"
-      "jmp 0x........\n"
+      "jo +108\n"
+      "jno +102\n"
+      "jc +96\n"
+      "jnc +90\n"
+      "jz +84\n"
+      "jnz +78\n"
+      "jna +72\n"
+      "ja +66\n"
+      "js +60\n"
+      "jns +54\n"
+      "jpe +48\n"
+      "jpo +42\n"
+      "jl +36\n"
+      "jge +30\n"
+      "jle +24\n"
+      "jg +18\n"
+      "jmp +12\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "ret\n");
@@ -225,23 +225,23 @@
   typedef void (*NearJumpAroundCrashCode)();
   reinterpret_cast<NearJumpAroundCrashCode>(test->entry())();
   EXPECT_DISASSEMBLY(
-      "jo 0x........\n"
-      "jno 0x........\n"
-      "jc 0x........\n"
-      "jnc 0x........\n"
-      "jz 0x........\n"
-      "jnz 0x........\n"
-      "jna 0x........\n"
-      "ja 0x........\n"
-      "js 0x........\n"
-      "jns 0x........\n"
-      "jpe 0x........\n"
-      "jpo 0x........\n"
-      "jl 0x........\n"
-      "jge 0x........\n"
-      "jle 0x........\n"
-      "jg 0x........\n"
-      "jmp 0x........\n"
+      "jo +41\n"
+      "jno +39\n"
+      "jc +37\n"
+      "jnc +35\n"
+      "jz +33\n"
+      "jnz +31\n"
+      "jna +29\n"
+      "ja +27\n"
+      "js +25\n"
+      "jns +23\n"
+      "jpe +21\n"
+      "jpo +19\n"
+      "jl +17\n"
+      "jge +15\n"
+      "jle +13\n"
+      "jg +11\n"
+      "jmp +9\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "ret\n");
@@ -268,7 +268,7 @@
       "add eax,2\n"
       "inc ecx\n"
       "cmp ecx,0x57\n"
-      "jl 0x........\n"
+      "jl -7\n"
       "ret\n");
 }
 
@@ -289,9 +289,9 @@
   EXPECT_EQ(1, reinterpret_cast<CmpbCode>(test->entry())());
   EXPECT_DISASSEMBLY(
       "mov eax,1\n"
-      "push 0x........\n"
+      "push 0xffffff11\n"
       "cmpb [esp],0x11\n"
-      "jz 0x........\n"
+      "jz +7\n"
       "mov eax,0\n"
       "pop ecx\n"
       "ret\n");
@@ -317,7 +317,7 @@
   EXPECT_DISASSEMBLY(
       "mov eax,1\n"
       "mov ecx,0\n"
-      "push 0x........\n"
+      "push 0xffffff11\n"
       "testb [esp],0x10\n"
       "cmovz eax,ecx\n"
       "testb [esp],0x20\n"
@@ -372,7 +372,7 @@
   typedef int (*PopcntCode)();
   EXPECT_EQ(36, reinterpret_cast<PopcntCode>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "mov ecx,0x........\n"
+      "mov ecx,0xffffffff\n"
       "popcnt eax,ecx\n"
       "mov ecx,0xf\n"
       "popcnt ecx,ecx\n"
@@ -396,7 +396,7 @@
   typedef int (*LzcntCode)();
   EXPECT_EQ(44, reinterpret_cast<LzcntCode>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "mov ecx,0x...\n"
+      "mov ecx,0xf00\n"
       "lzcnt eax,ecx\n"
       "mov ecx,0xf0\n"
       "lzcnt ecx,ecx\n"
@@ -536,7 +536,7 @@
       "mov eax,2\n"
       "mov ecx,4\n"
       "imul eax,ecx\n"
-      "imul eax,eax,0x...\n"
+      "imul eax,eax,0x3e8\n"
       "ret\n");
 }
 
@@ -554,8 +554,8 @@
   EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(test->entry())());
   EXPECT_DISASSEMBLY(
       "mov edx,0\n"
-      "mov eax,0x........\n"
-      "mov ecx,0x........\n"
+      "mov eax,0x0fffffff\n"
+      "mov ecx,0x0fffffff\n"
       "imul eax,ecx\n"
       "imul eax,edx\n"
       "ret\n");
@@ -580,7 +580,7 @@
       "mov ebx,2\n"
       "mov ecx,4\n"
       "imul ebx,ecx\n"
-      "imul ebx,ebx,0x...\n"
+      "imul ebx,ebx,0x3e8\n"
       "mov eax,ebx\n"
       "pop ebx\n"
       "ret\n");
@@ -622,7 +622,7 @@
   EXPECT_EQ(31, call(-1));
   EXPECT_DISASSEMBLY(
       "mov ecx,[esp+0x4]\n"
-      "mov eax,0x...\n"
+      "mov eax,0x29a\n"
       "bsr eax,ecx\n"
       "ret\n");
 }
@@ -644,7 +644,7 @@
   EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(test->entry())());
   EXPECT_DISASSEMBLY(
       "push ebx\n"
-      "mov edx,0x........\n"
+      "mov edx,0x1234ffff\n"
       "movzxb eax,edx\n"
       "movsxw ebx,edx\n"
       "movzxw ecx,edx\n"
@@ -676,7 +676,7 @@
             reinterpret_cast<MoveExtendMemory>(test->entry())());
   EXPECT_DISASSEMBLY(
       "push ebx\n"
-      "mov edx,0x........\n"
+      "mov edx,0x1234ffff\n"
       "push edx\n"
       "movzxb eax,[esp]\n"
       "movsxw ebx,[esp]\n"
@@ -724,12 +724,12 @@
   EXPECT_DISASSEMBLY(
       "mov ecx,0x2a\n"
       "xor ecx,ecx\n"
-      "or ecx,0x...\n"
-      "mov eax,0x...\n"
+      "or ecx,0x100\n"
+      "mov eax,0x648\n"
       "or ecx,eax\n"
-      "mov eax,0x....\n"
+      "mov eax,0xfff0\n"
       "and ecx,eax\n"
-      "push 0x....\n"
+      "push 0xf6ff\n"
       "and ecx,[esp]\n"
       "pop eax\n"
       "mov eax,1\n"
@@ -943,121 +943,121 @@
       "mov eax,4\n"
       "and eax,2\n"
       "cmp eax,0\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov ecx,4\n"
       "and ecx,4\n"
       "cmp ecx,0\n"
-      "jnz 0x........\n"
+      "jnz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,0\n"
       "or eax,0\n"
       "cmp eax,0\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,4\n"
       "or eax,0\n"
       "cmp eax,0\n"
-      "jnz 0x........\n"
+      "jnz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,1\n"
       "shl eax,1\n"
       "cmp eax,2\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,1\n"
       "shl eax,3\n"
       "cmp eax,8\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,2\n"
       "shr eax,1\n"
       "cmp eax,1\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,8\n"
       "shr eax,3\n"
       "cmp eax,1\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,1\n"
       "mov ecx,3\n"
       "shl eax,cl\n"
       "cmp eax,8\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,8\n"
       "mov ecx,3\n"
       "shr eax,cl\n"
       "cmp eax,1\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,1\n"
       "shl eax,31\n"
       "shr eax,3\n"
-      "cmp eax,0x........\n"
-      "jz 0x........\n"
+      "cmp eax,0x10000000\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,1\n"
       "shl eax,31\n"
       "sar eax,3\n"
-      "cmp eax,0x........\n"
-      "jz 0x........\n"
+      "cmp eax,0xf0000000\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,1\n"
       "mov ecx,3\n"
       "shl eax,31\n"
       "sar eax,cl\n"
-      "cmp eax,0x........\n"
-      "jz 0x........\n"
+      "cmp eax,0xf0000000\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "sub esp,4\n"
-      "mov [esp],-0x........\n"
+      "mov [esp],-0x80000000\n"
       "mov eax,0\n"
       "mov ecx,3\n"
       "sar [esp],cl\n"
       "shrd [esp],eax,cl\n"
-      "cmp [esp],0x........\n"
-      "jz 0x........\n"
+      "cmp [esp],0x1e000000\n"
+      "jz +7\n"
       "int3\n"
       "add esp,4\n"
       "sub esp,4\n"
-      "mov [esp],-0x........\n"
-      "mov eax,0x........\n"
+      "mov [esp],-0x01000000\n"
+      "mov eax,0xffffffff\n"
       "mov ecx,2\n"
       "shl [esp],cl\n"
       "shld [esp],eax,cl\n"
-      "cmp [esp],0x........\n"
-      "jz 0x........\n"
+      "cmp [esp],0xf0000003\n"
+      "jz +7\n"
       "int3\n"
       "add esp,4\n"
-      "mov edx,0x........\n"
+      "mov edx,0x80000000\n"
       "mov eax,0\n"
       "mov ecx,3\n"
       "sar edx,3\n"
       "shrd edx,eax,3\n"
-      "cmp edx,0x........\n"
-      "jz 0x........\n"
+      "cmp edx,0x1e000000\n"
+      "jz +7\n"
       "int3\n"
-      "mov edx,0x........\n"
-      "mov eax,0x........\n"
+      "mov edx,0xff000000\n"
+      "mov eax,0xffffffff\n"
       "shl edx,2\n"
       "shld edx,eax,2\n"
-      "cmp edx,0x........\n"
-      "jz 0x........\n"
+      "cmp edx,0xf0000003\n"
+      "jz +7\n"
       "int3\n"
       "mov eax,0\n"
       "ret\n");
@@ -1125,28 +1125,28 @@
       "mov eax,4\n"
       "mov ecx,2\n"
       "test eax,ecx\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov edx,4\n"
       "mov ecx,4\n"
       "test edx,ecx\n"
-      "jnz 0x........\n"
+      "jnz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,0\n"
       "test al,0\n"
-      "jz 0x........\n"
+      "jz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov ebx,4\n"
       "testb ebx,4\n"
-      "jnz 0x........\n"
+      "jnz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov ebx,0xff\n"
       "testb ebx,0xff\n"
-      "jnz 0x........\n"
+      "jnz +13\n"
       "mov eax,0\n"
       "mov [eax],eax\n"
       "mov eax,0\n"
@@ -1217,7 +1217,7 @@
   typedef int (*SignedDivide)();
   EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0xffffffa9\n"
       "mov edx,0x7b\n"
       "cdq\n"
       "mov ecx,0x2a\n"
@@ -1237,9 +1237,9 @@
   typedef int (*UnsignedDivide)();
   EXPECT_EQ(0x42, reinterpret_cast<UnsignedDivide>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0xffffffbe\n"
       "mov edx,0x41\n"
-      "mov ecx,0x........\n"
+      "mov ecx,0xffffffff\n"
       "div (eax,edx),ecx\n"
       "ret\n");
 }
@@ -1256,8 +1256,8 @@
   typedef int (*Exchange)();
   EXPECT_EQ(987654321 - 123456789, reinterpret_cast<Exchange>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
-      "mov edx,0x........\n"
+      "mov eax,0x075bcd15\n"
+      "mov edx,0x3ade68b1\n"
       "xchg eax,edx\n"
       "sub eax,edx\n"
       "ret\n");
@@ -1358,7 +1358,7 @@
   float res = reinterpret_cast<SingleFPMovesCode>(test->entry())();
   EXPECT_EQ(234.0f, res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x436a0000\n"
       "movd xmm0,eax\n"
       "movss ecx,xmm0\n"
       "movss edx,xmm1\n"
@@ -1397,7 +1397,7 @@
   EXPECT_DISASSEMBLY(
       "push ebx\n"
       "push ecx\n"
-      "mov ebx,0x........\n"
+      "mov ebx,0x436a0000\n"
       "movd xmm0,ebx\n"
       "movss ecx,xmm0\n"
       "movd ecx,xmm1\n"
@@ -1426,7 +1426,7 @@
   int res = reinterpret_cast<SingleFPUStackMovesCode>(test->entry())();
   EXPECT_EQ(234.0f, (bit_cast<float, int>(res)));
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x436a0000\n"
       "push eax\n"
       "fld_s [esp]\n"
       "xor ecx,ecx\n"
@@ -1458,9 +1458,9 @@
   float res = reinterpret_cast<SingleFPOperationsCode>(test->entry())();
   EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x4144cccd\n"
       "movd xmm0,eax\n"
-      "mov eax,0x........\n"
+      "mov eax,0x4059999a\n"
       "movd xmm1,eax\n"
       "addss xmm0,xmm1\n"
       "mulss xmm0,xmm1\n"
@@ -1498,10 +1498,10 @@
   float res = reinterpret_cast<PackedFPOperationsCode>(test->entry())();
   EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x4144cccd\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x4059999a\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "addps xmm0,xmm1\n"
@@ -1577,7 +1577,7 @@
   float res = reinterpret_cast<PackedFPOperations2Code>(test->entry())();
   EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
       "movaps xmm1,xmm0\n"
@@ -1610,10 +1610,10 @@
   uint32_t res = reinterpret_cast<PackedCompareEQCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40000000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [eq]\n"
@@ -1641,10 +1641,10 @@
   uint32_t res = reinterpret_cast<PackedCompareNEQCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40000000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [neq]\n"
@@ -1672,10 +1672,10 @@
   uint32_t res = reinterpret_cast<PackedCompareLTCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40000000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [lt]\n"
@@ -1703,10 +1703,10 @@
   uint32_t res = reinterpret_cast<PackedCompareLECode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40000000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [le]\n"
@@ -1734,10 +1734,10 @@
   uint32_t res = reinterpret_cast<PackedCompareNLTCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40000000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [nlt]\n"
@@ -1765,10 +1765,10 @@
   uint32_t res = reinterpret_cast<PackedCompareNLECode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40000000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [nle]\n"
@@ -1798,10 +1798,10 @@
   float res = reinterpret_cast<PackedNegateCode>(test->entry())();
   EXPECT_FLOAT_EQ(-12.3f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x4144cccd\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "xorps xmm0,[rip+0x.......]\n"
+      "xorps xmm0,[0x.......]\n"
       "shufps xmm0,xmm0 [aa]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -1829,10 +1829,10 @@
   float res = reinterpret_cast<PackedAbsoluteCode>(test->entry())();
   EXPECT_FLOAT_EQ(15.3f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0xc174cccd\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "andps xmm0,[rip+0x.......]\n"
+      "andps xmm0,[0x.......]\n"
       "shufps xmm0,xmm0 [aa]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -1858,10 +1858,10 @@
   float res = reinterpret_cast<PackedSetWZeroCode>(test->entry())();
   EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x4144cccd\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "andps xmm0,[rip+0x.......]\n"
+      "andps xmm0,[0x.......]\n"
       "shufps xmm0,xmm0 [ff]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -1887,10 +1887,10 @@
   float res = reinterpret_cast<PackedMinCode>(test->entry())();
   EXPECT_FLOAT_EQ(2.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40000000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "minps xmm0,xmm1\n"
@@ -1918,10 +1918,10 @@
   float res = reinterpret_cast<PackedMaxCode>(test->entry())();
   EXPECT_FLOAT_EQ(4.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40000000\n"
       "movd xmm0,eax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "mov eax,0x........\n"
+      "mov eax,0x40800000\n"
       "movd xmm1,eax\n"
       "shufps xmm1,xmm1 [0]\n"
       "maxps xmm0,xmm1\n"
@@ -1961,8 +1961,8 @@
   uint32_t res = reinterpret_cast<PackedLogicalOrCode>(test->entry())();
   EXPECT_EQ(0xFFFFFFFF, res);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "orps xmm0,xmm1\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -1999,8 +1999,8 @@
   uint32_t res = reinterpret_cast<PackedLogicalAndCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0000F000), res);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "andps xmm0,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "andps xmm0,[0x.......]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -2030,8 +2030,8 @@
   uint32_t res = reinterpret_cast<PackedLogicalNotCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "xorps xmm0,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "xorps xmm0,[0x.......]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -2076,8 +2076,8 @@
   float res = reinterpret_cast<PackedMoveHighLow>(test->entry())();
   EXPECT_FLOAT_EQ(15.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "movhlps xmm0,xmm1\n"
       "xorps xmm1,xmm1\n"
       "movaps xmm1,xmm0\n"
@@ -2128,8 +2128,8 @@
   float res = reinterpret_cast<PackedMoveLowHigh>(test->entry())();
   EXPECT_FLOAT_EQ(11.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "movlhps xmm0,xmm1\n"
       "xorps xmm1,xmm1\n"
       "movaps xmm1,xmm0\n"
@@ -2179,8 +2179,8 @@
   float res = reinterpret_cast<PackedUnpackLow>(test->entry())();
   EXPECT_FLOAT_EQ(11.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "unpcklps xmm0,xmm1\n"
       "movaps xmm1,xmm0\n"
       "shufps xmm0,xmm0 [55]\n"
@@ -2229,8 +2229,8 @@
   float res = reinterpret_cast<PackedUnpackHigh>(test->entry())();
   EXPECT_FLOAT_EQ(7.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "unpckhps xmm0,xmm1\n"
       "movaps xmm1,xmm0\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -2279,8 +2279,8 @@
   float res = reinterpret_cast<PackedUnpackLowPair>(test->entry())();
   EXPECT_FLOAT_EQ(6.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "unpcklpd xmm0,xmm1\n"
       "movaps xmm1,xmm0\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -2329,8 +2329,8 @@
   float res = reinterpret_cast<PackedUnpackHighPair>(test->entry())();
   EXPECT_FLOAT_EQ(12.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "unpckhpd xmm0,xmm1\n"
       "movaps xmm1,xmm0\n"
       "shufps xmm0,xmm0 [55]\n"
@@ -2369,8 +2369,8 @@
   double res = reinterpret_cast<PackedDoubleAdd>(test->entry())();
   EXPECT_FLOAT_EQ(4.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "addpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2407,8 +2407,8 @@
   double res = reinterpret_cast<PackedDoubleSub>(test->entry())();
   EXPECT_FLOAT_EQ(-2.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "subpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2440,8 +2440,8 @@
   double res = reinterpret_cast<PackedDoubleNegate>(test->entry())();
   EXPECT_FLOAT_EQ(-1.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "xorpd xmm0,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "xorpd xmm0,[0x.......]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -2472,8 +2472,8 @@
   double res = reinterpret_cast<PackedDoubleAbsolute>(test->entry())();
   EXPECT_FLOAT_EQ(1.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "andpd xmm0,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "andpd xmm0,[0x.......]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -2509,8 +2509,8 @@
   double res = reinterpret_cast<PackedDoubleMul>(test->entry())();
   EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "mulpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2547,8 +2547,8 @@
   double res = reinterpret_cast<PackedDoubleDiv>(test->entry())();
   EXPECT_FLOAT_EQ(3.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "divpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2580,7 +2580,7 @@
   double res = reinterpret_cast<PackedDoubleSqrt>(test->entry())();
   EXPECT_FLOAT_EQ(4.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
       "sqrtpd xmm0,xmm0\n"
       "push eax\n"
       "push eax\n"
@@ -2617,8 +2617,8 @@
   double res = reinterpret_cast<PackedDoubleMin>(test->entry())();
   EXPECT_FLOAT_EQ(3.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "minpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2655,8 +2655,8 @@
   double res = reinterpret_cast<PackedDoubleMax>(test->entry())();
   EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "maxpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2692,7 +2692,7 @@
   double res = reinterpret_cast<PackedDoubleShuffle>(test->entry())();
   EXPECT_FLOAT_EQ(9.0, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm0,[rip+0x.......]\n"
+      "movups xmm0,[0x.......]\n"
       "shufpd xmm0, xmm0 [33]\n"
       "shufpd xmm0, xmm0 [0]\n"
       "push eax\n"
@@ -2723,7 +2723,7 @@
   float res = reinterpret_cast<PackedDoubleToSingle>(test->entry())();
   EXPECT_FLOAT_EQ(9.0f, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "cvtpd2ps xmm0,xmm1\n"
       "push eax\n"
       "movss [esp],xmm0\n"
@@ -2755,7 +2755,7 @@
   double res = reinterpret_cast<PackedSingleToDouble>(test->entry())();
   EXPECT_FLOAT_EQ(9.0f, res, 0.000001f);
   EXPECT_DISASSEMBLY(
-      "movups xmm1,[rip+0x.......]\n"
+      "movups xmm1,[0x.......]\n"
       "cvtps2pd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -2785,7 +2785,7 @@
   float res = reinterpret_cast<SingleFPOperationsStackCode>(test->entry())(3.4);
   EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x4144cccd\n"
       "movd xmm0,eax\n"
       "addss xmm0,[esp+0x4]\n"
       "mulss xmm0,[esp+0x4]\n"
@@ -2838,9 +2838,9 @@
   double res = reinterpret_cast<DoubleFPMovesCode>(test->entry())();
   EXPECT_FLOAT_EQ(1024.67, res, 0.0001);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x409002ae\n"
       "push eax\n"
-      "mov eax,0x........\n"
+      "mov eax,0x147ae148\n"
       "push eax\n"
       "movsd xmm0,[esp]\n"
       "movsd xmm1,xmm0\n"
@@ -2891,9 +2891,9 @@
   int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(test->entry())();
   EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x409002ae\n"
       "push eax\n"
-      "mov eax,0x........\n"
+      "mov eax,0x147ae148\n"
       "push eax\n"
       "fld_d [esp]\n"
       "mov [esp],0\n"
@@ -2935,16 +2935,16 @@
   double res = reinterpret_cast<DoubleFPOperationsCode>(test->entry())();
   EXPECT_FLOAT_EQ(14.7, res, 0.001);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40289999\n"
       "push eax\n"
-      "mov eax,0x........\n"
+      "mov eax,0x9999999a\n"
       "push eax\n"
       "movsd xmm0,[esp]\n"
       "pop eax\n"
       "pop eax\n"
-      "mov eax,0x........\n"
+      "mov eax,0x400b3333\n"
       "push eax\n"
-      "mov eax,0x........\n"
+      "mov eax,0x33333333\n"
       "push eax\n"
       "movsd xmm1,[esp]\n"
       "addsd xmm0,xmm1\n"
@@ -2988,9 +2988,9 @@
       reinterpret_cast<DoubleFPOperationsStackCode>(test->entry())(3.4);
   EXPECT_FLOAT_EQ(14.7, res, 0.001);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40289999\n"
       "push eax\n"
-      "mov eax,0x........\n"
+      "mov eax,0x9999999a\n"
       "push eax\n"
       "movsd xmm0,[esp]\n"
       "pop eax\n"
@@ -3093,8 +3093,8 @@
       reinterpret_cast<NegativeInt64ToDoubleConversionCode>(test->entry())();
   EXPECT_EQ(-6.0, res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
-      "mov edx,0x........\n"
+      "mov eax,0xffffffff\n"
+      "mov edx,0xfffffffa\n"
       "push eax\n"
       "push edx\n"
       "fild_d [esp]\n"
@@ -3188,7 +3188,7 @@
   double res = reinterpret_cast<FloatToDoubleConversionCode>(test->entry())();
   EXPECT_FLOAT_EQ(12.3, res, 0.001);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x4144cccd\n"
       "movd xmm1,eax\n"
       "xor eax,eax\n"
       "cvtss2sd xmm2,xmm1\n"
@@ -3248,26 +3248,26 @@
   EXPECT_EQ(0, res);
   EXPECT_DISASSEMBLY(
       "xor eax,eax\n"
-      "mov edx,0x........\n"
+      "mov edx,0x4144cccd\n"
       "movd xmm0,edx\n"
-      "mov edx,0x........\n"
+      "mov edx,0x41480000\n"
       "movd xmm1,edx\n"
       "comiss xmm0,xmm1\n"
-      "jpe 0x........\n"
-      "ja 0x........\n"
-      "jc 0x........\n"
+      "jpe +43\n"
+      "ja +40\n"
+      "jc +7\n"
       "inc eax\n"
       "mov edx,0\n"
       "movd xmm1,edx\n"
       "divss xmm1,xmm1\n"
       "comiss xmm1,xmm1\n"
-      "jpe 0x........\n"
+      "jpe +7\n"
       "inc eax\n"
       "ret\n"
       "inc eax\n"
-      "jmp 0x........\n"
+      "jmp -38\n"
       "inc eax\n"
-      "jmp 0x........\n");
+      "jmp -35\n");
 }
 
 ASSEMBLER_TEST_GENERATE(DoubleCompare, assembler) {
@@ -3338,14 +3338,14 @@
   int res = reinterpret_cast<DoubleCompareCode>(test->entry())();
   EXPECT_EQ(0, res);
   EXPECT_DISASSEMBLY(
-      "mov edx,0x........\n"
+      "mov edx,0x40289999\n"
       "push edx\n"
-      "mov edx,0x........\n"
+      "mov edx,0x9999999a\n"
       "push edx\n"
       "movsd xmm0,[esp]\n"
       "pop edx\n"
       "pop edx\n"
-      "mov edx,0x........\n"
+      "mov edx,0x40290000\n"
       "push edx\n"
       "mov edx,0\n"
       "push edx\n"
@@ -3354,9 +3354,9 @@
       "pop edx\n"
       "xor eax,eax\n"
       "comisd xmm0,xmm1\n"
-      "jpe 0x........\n"
-      "ja 0x........\n"
-      "jc 0x........\n"
+      "jpe +54\n"
+      "ja +51\n"
+      "jc +7\n"
       "inc eax\n"
       "mov edx,0\n"
       "push edx\n"
@@ -3367,13 +3367,13 @@
       "pop edx\n"
       "divsd xmm1,xmm1\n"
       "comisd xmm1,xmm1\n"
-      "jpe 0x........\n"
+      "jpe +7\n"
       "inc eax\n"
       "ret\n"
       "inc eax\n"
-      "jmp 0x........\n"
+      "jmp -49\n"
       "inc eax\n"
-      "jmp 0x........\n");
+      "jmp -46\n");
 }
 
 ASSEMBLER_TEST_GENERATE(DoubleToFloatConversion, assembler) {
@@ -3396,9 +3396,9 @@
   float res = reinterpret_cast<DoubleToFloatConversionCode>(test->entry())();
   EXPECT_FLOAT_EQ(12.3f, res, 0.001);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0x40289999\n"
       "push eax\n"
-      "mov eax,0x........\n"
+      "mov eax,0x9999999a\n"
       "push eax\n"
       "movsd xmm0,[esp]\n"
       "cvtsd2ss xmm1,xmm0\n"
@@ -3499,7 +3499,7 @@
   double res = reinterpret_cast<GlobalAddressCode>(test->entry())();
   EXPECT_FLOAT_EQ(kDoubleConst, res, 0.000001);
   EXPECT_DISASSEMBLY(
-      "movsd xmm0,[rip+0x.......]\n"
+      "movsd xmm0,[0x.......]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -3703,7 +3703,7 @@
   EXPECT_FLOAT_EQ(-kFloatConst, res, 0.0001);
   EXPECT_DISASSEMBLY(
       "movss xmm0,[esp+0x4]\n"
-      "xorps xmm0,[rip+0x.......]\n"
+      "xorps xmm0,[0x.......]\n"
       "push eax\n"
       "movss [esp],xmm0\n"
       "fld_s [esp]\n"
@@ -3730,7 +3730,7 @@
   EXPECT_FLOAT_EQ(-kDoubleConst, res, 0.0001);
   EXPECT_DISASSEMBLY(
       "movsd xmm0,[esp+0x4]\n"
-      "xorpd xmm0,[rip+0x.......]\n"
+      "xorpd xmm0,[0x.......]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -4124,7 +4124,7 @@
       "push eax\n"
       "fnstcw [esp]\n"
       "movzxw eax,[esp]\n"
-      "or eax,0x...\n"
+      "or eax,0xc00\n"
       "movw [esp+0x4],eax\n"
       "fldcw [esp+0x4]\n"
       "push eax\n"
@@ -4214,7 +4214,7 @@
   EXPECT_DISASSEMBLY(
       "movsd xmm0,[esp+0x4]\n"
       "xorpd xmm1,xmm1\n"
-      "xorpd xmm1,[rip+0x.......]\n"
+      "xorpd xmm1,[0x.......]\n"
       "orpd xmm0,xmm1\n"
       "push eax\n"
       "push eax\n"
@@ -4383,7 +4383,7 @@
   EXPECT_FLOAT_EQ(val, res, 0.001);
   EXPECT_DISASSEMBLY(
       "movsd xmm0,[esp+0x4]\n"
-      "andpd xmm0,[rip+0x.......]\n"
+      "andpd xmm0,[0x.......]\n"
       "push eax\n"
       "push eax\n"
       "movsd [esp],xmm0\n"
@@ -4445,7 +4445,7 @@
       "mov edx,[esp+0x8]\n"
       "xor eax,eax\n"
       "mov ebx,1\n"
-      "mov ecx,0x........\n"
+      "mov ecx,0xffffffff\n"
       "test edx,edx\n"
       "cmovs eax,ecx\n"
       "test edx,edx\n"
@@ -4500,7 +4500,7 @@
       "xor eax,eax\n"
       "mov ecx,1\n"
       "mov edx,[esp+0x4]\n"
-      "cmp edx,0x...\n"
+      "cmp edx,0x311\n"
       "cmovz eax,ecx\n"
       "ret\n");
 }
@@ -4525,7 +4525,7 @@
       "xor eax,eax\n"
       "mov ecx,1\n"
       "mov edx,[esp+0x4]\n"
-      "cmp edx,0x...\n"
+      "cmp edx,0x311\n"
       "cmovnz eax,ecx\n"
       "ret\n");
 }
@@ -4550,7 +4550,7 @@
   EXPECT_EQ(-1, res);  // Less.
   EXPECT_DISASSEMBLY(
       "mov edx,1\n"
-      "mov ecx,0x........\n"
+      "mov ecx,0xffffffff\n"
       "mov eax,[esp+0x4]\n"
       "cmp eax,[esp+0x8]\n"
       "cmovl eax,ecx\n"
@@ -4574,8 +4574,8 @@
   double res = reinterpret_cast<TestLoadDoubleConstantCode>(test->entry())();
   EXPECT_FLOAT_EQ(-12.34, res, 0.0001);
   EXPECT_DISASSEMBLY(
-      "push 0x........\n"
-      "push 0x........\n"
+      "push 0xc028ae14\n"
+      "push 0x7ae147ae\n"
       "movsd xmm3,[esp]\n"
       "add esp,8\n"
       "push eax\n"
@@ -4608,17 +4608,7 @@
   typedef bool (*TestObjectCompare)();
   bool res = reinterpret_cast<TestObjectCompare>(test->entry())();
   EXPECT_EQ(true, res);
-  EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
-      "cmp eax,0x........\n"
-      "jnz 0x........\n"
-      "mov ecx,0x........\n"
-      "cmp ecx,0x........\n"
-      "jnz 0x........\n"
-      "mov eax,1\n"
-      "ret\n"
-      "mov eax,0\n"
-      "ret\n");
+  // Disassembly contains absolute addresses of objects that vary between runs.
 }
 
 ASSEMBLER_TEST_GENERATE(TestSetCC, assembler) {
@@ -4633,7 +4623,7 @@
   uword res = reinterpret_cast<TestSetCC>(test->entry())();
   EXPECT_EQ(0xFFFFFF00, res);
   EXPECT_DISASSEMBLY(
-      "mov eax,0x........\n"
+      "mov eax,0xffffffff\n"
       "cmp eax,eax\n"
       "setnz eax\n"
       "ret\n");
@@ -4900,7 +4890,7 @@
       "mov eax,4\n"
       "mov ecx,2\n"
       "bt eax,ecx\n"
-      "jc 0x........\n"
+      "jc +7\n"
       "int3\n"
       "mov eax,1\n"
       "ret\n");
@@ -4923,7 +4913,7 @@
   EXPECT_DISASSEMBLY(
       "mov ecx,0x20\n"
       "bt ecx,5\n"
-      "jc 0x........\n"
+      "jc +7\n"
       "int3\n"
       "mov eax,1\n"
       "ret\n");
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index d2dc30c..0c396e7 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -1845,7 +1845,7 @@
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
   Comment("EnterCallRuntimeFrame");
   EnterFrame(0);
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     pushq(CODE_REG);
     pushq(PP);
   }
@@ -1939,7 +1939,7 @@
 void Assembler::EnterDartFrame(intptr_t frame_size, Register new_pp) {
   ASSERT(!constant_pool_allowed());
   EnterFrame(0);
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     pushq(CODE_REG);
     pushq(PP);
     if (new_pp == kNoRegister) {
@@ -1956,7 +1956,7 @@
 
 void Assembler::LeaveDartFrame(RestorePP restore_pp) {
   // Restore caller's PP register that was pushed in EnterDartFrame.
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     if (restore_pp == kRestoreCallerPP) {
       movq(PP, Address(RBP, (target::frame_layout.saved_caller_pp_from_fp *
                              target::kWordSize)));
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 237bd61..5312859 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -1228,6 +1228,19 @@
                                            Register array,
                                            Register index);
 
+  void LoadStaticFieldAddress(Register address,
+                              Register field,
+                              Register scratch) {
+    LoadCompressedSmi(
+        scratch, compiler::FieldAddress(
+                     field, target::Field::host_offset_or_field_id_offset()));
+    const intptr_t field_table_offset =
+        compiler::target::Thread::field_table_values_offset();
+    LoadMemoryValue(address, THR, static_cast<int32_t>(field_table_offset));
+    static_assert(kSmiTagShift == 1, "adjust scale factor");
+    leaq(address, Address(address, scratch, TIMES_HALF_WORD_SIZE, 0));
+  }
+
   void LoadFieldAddressForRegOffset(Register address,
                                     Register instance,
                                     Register offset_in_words_as_smi) {
diff --git a/runtime/vm/compiler/assembler/assembler_x64_test.cc b/runtime/vm/compiler/assembler/assembler_x64_test.cc
index 3d2deb2..1dded0f 100644
--- a/runtime/vm/compiler/assembler/assembler_x64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64_test.cc
@@ -24,9 +24,9 @@
 #define EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(expected)
 #else
 #define EXPECT_DISASSEMBLY(expected)                                           \
-  EXPECT_STREQ(expected, test->BlankedDisassembly())
+  EXPECT_STREQ(expected, test->RelativeDisassembly())
 #define EXPECT_DISASSEMBLY_ENDS_WITH(expected_arg)                             \
-  char* disassembly = test->BlankedDisassembly();                              \
+  char* disassembly = test->RelativeDisassembly();                             \
   const char* expected = expected_arg;                                         \
   intptr_t dis_len = strlen(disassembly);                                      \
   intptr_t exp_len = strlen(expected);                                         \
@@ -279,18 +279,18 @@
       "movq rax,[r10-0x8]\n"
       "movq rax,[r12-0x8]\n"
       "movq rax,[r13-0x8]\n"
-      "movq rax,[rsp+0x...]\n"
-      "movq rax,[rbp+0x...]\n"
-      "movq rax,[rax+0x...]\n"
-      "movq rax,[r10+0x...]\n"
-      "movq rax,[r12+0x...]\n"
-      "movq rax,[r13+0x...]\n"
-      "movq rax,[rsp-0x...]\n"
-      "movq rax,[rbp-0x...]\n"
-      "movq rax,[rax-0x...]\n"
-      "movq rax,[r10-0x...]\n"
-      "movq rax,[r12-0x...]\n"
-      "movq rax,[r13-0x...]\n"
+      "movq rax,[rsp+0x800]\n"
+      "movq rax,[rbp+0x800]\n"
+      "movq rax,[rax+0x800]\n"
+      "movq rax,[r10+0x800]\n"
+      "movq rax,[r12+0x800]\n"
+      "movq rax,[r13+0x800]\n"
+      "movq rax,[rsp-0x800]\n"
+      "movq rax,[rbp-0x800]\n"
+      "movq rax,[rax-0x800]\n"
+      "movq rax,[r10-0x800]\n"
+      "movq rax,[r12-0x800]\n"
+      "movq rax,[r13-0x800]\n"
       "movq rax,[rax*1+0]\n"
       "movq rax,[rax*2+0]\n"
       "movq rax,[rax*4+0]\n"
@@ -305,11 +305,11 @@
       "movq rax,[r10*2+0x8]\n"
       "movq rax,[r12*2+0x8]\n"
       "movq rax,[r13*2+0x8]\n"
-      "movq rax,[rbp*2+0x...]\n"
-      "movq rax,[rax*2+0x...]\n"
-      "movq rax,[r10*2+0x...]\n"
-      "movq rax,[r12*2+0x...]\n"
-      "movq rax,[r13*2+0x...]\n"
+      "movq rax,[rbp*2+0x800]\n"
+      "movq rax,[rax*2+0x800]\n"
+      "movq rax,[r10*2+0x800]\n"
+      "movq rax,[r12*2+0x800]\n"
+      "movq rax,[r13*2+0x800]\n"
       "movq rax,[rax+rbp*2]\n"
       "movq rax,[rax+rax*2]\n"
       "movq rax,[rax+r10*2]\n"
@@ -370,36 +370,36 @@
       "movq rax,[r13+r10*2+0x8]\n"
       "movq rax,[r13+r12*2+0x8]\n"
       "movq rax,[r13+r13*2+0x8]\n"
-      "movq rax,[rax+rbp*2+0x...]\n"
-      "movq rax,[rax+rax*2+0x...]\n"
-      "movq rax,[rax+r10*2+0x...]\n"
-      "movq rax,[rax+r12*2+0x...]\n"
-      "movq rax,[rax+r13*2+0x...]\n"
-      "movq rax,[rbp+rbp*2+0x...]\n"
-      "movq rax,[rbp+rax*2+0x...]\n"
-      "movq rax,[rbp+r10*2+0x...]\n"
-      "movq rax,[rbp+r12*2+0x...]\n"
-      "movq rax,[rbp+r13*2+0x...]\n"
-      "movq rax,[rsp+rbp*2+0x...]\n"
-      "movq rax,[rsp+rax*2+0x...]\n"
-      "movq rax,[rsp+r10*2+0x...]\n"
-      "movq rax,[rsp+r12*2+0x...]\n"
-      "movq rax,[rsp+r13*2+0x...]\n"
-      "movq rax,[r10+rbp*2+0x...]\n"
-      "movq rax,[r10+rax*2+0x...]\n"
-      "movq rax,[r10+r10*2+0x...]\n"
-      "movq rax,[r10+r12*2+0x...]\n"
-      "movq rax,[r10+r13*2+0x...]\n"
-      "movq rax,[r12+rbp*2+0x...]\n"
-      "movq rax,[r12+rax*2+0x...]\n"
-      "movq rax,[r12+r10*2+0x...]\n"
-      "movq rax,[r12+r12*2+0x...]\n"
-      "movq rax,[r12+r13*2+0x...]\n"
-      "movq rax,[r13+rbp*2+0x...]\n"
-      "movq rax,[r13+rax*2+0x...]\n"
-      "movq rax,[r13+r10*2+0x...]\n"
-      "movq rax,[r13+r12*2+0x...]\n"
-      "movq rax,[r13+r13*2+0x...]\n"
+      "movq rax,[rax+rbp*2+0x800]\n"
+      "movq rax,[rax+rax*2+0x800]\n"
+      "movq rax,[rax+r10*2+0x800]\n"
+      "movq rax,[rax+r12*2+0x800]\n"
+      "movq rax,[rax+r13*2+0x800]\n"
+      "movq rax,[rbp+rbp*2+0x800]\n"
+      "movq rax,[rbp+rax*2+0x800]\n"
+      "movq rax,[rbp+r10*2+0x800]\n"
+      "movq rax,[rbp+r12*2+0x800]\n"
+      "movq rax,[rbp+r13*2+0x800]\n"
+      "movq rax,[rsp+rbp*2+0x800]\n"
+      "movq rax,[rsp+rax*2+0x800]\n"
+      "movq rax,[rsp+r10*2+0x800]\n"
+      "movq rax,[rsp+r12*2+0x800]\n"
+      "movq rax,[rsp+r13*2+0x800]\n"
+      "movq rax,[r10+rbp*2+0x800]\n"
+      "movq rax,[r10+rax*2+0x800]\n"
+      "movq rax,[r10+r10*2+0x800]\n"
+      "movq rax,[r10+r12*2+0x800]\n"
+      "movq rax,[r10+r13*2+0x800]\n"
+      "movq rax,[r12+rbp*2+0x800]\n"
+      "movq rax,[r12+rax*2+0x800]\n"
+      "movq rax,[r12+r10*2+0x800]\n"
+      "movq rax,[r12+r12*2+0x800]\n"
+      "movq rax,[r12+r13*2+0x800]\n"
+      "movq rax,[r13+rbp*2+0x800]\n"
+      "movq rax,[r13+rax*2+0x800]\n"
+      "movq rax,[r13+r10*2+0x800]\n"
+      "movq rax,[r13+r12*2+0x800]\n"
+      "movq rax,[r13+r13*2+0x800]\n"
       "movq rax,[rsp+0]\n"
       "movq rax,[rbp+0]\n"
       "movq rax,[rax+0]\n"
@@ -446,23 +446,23 @@
   typedef void (*JumpAroundCrashCode)();
   reinterpret_cast<JumpAroundCrashCode>(test->entry())();
   EXPECT_DISASSEMBLY(
-      "jo 0x................\n"
-      "jno 0x................\n"
-      "jc 0x................\n"
-      "jnc 0x................\n"
-      "jz 0x................\n"
-      "jnz 0x................\n"
-      "jna 0x................\n"
-      "ja 0x................\n"
-      "js 0x................\n"
-      "jns 0x................\n"
-      "jpe 0x................\n"
-      "jpo 0x................\n"
-      "jl 0x................\n"
-      "jge 0x................\n"
-      "jle 0x................\n"
-      "jg 0x................\n"
-      "jmp 0x................\n"
+      "jo +109\n"
+      "jno +103\n"
+      "jc +97\n"
+      "jnc +91\n"
+      "jz +85\n"
+      "jnz +79\n"
+      "jna +73\n"
+      "ja +67\n"
+      "js +61\n"
+      "jns +55\n"
+      "jpe +49\n"
+      "jpo +43\n"
+      "jl +37\n"
+      "jge +31\n"
+      "jle +25\n"
+      "jg +19\n"
+      "jmp +13\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "ret\n");
@@ -489,7 +489,7 @@
       "addq rax,2\n"
       "incq rcx\n"
       "cmpq rcx,0x57\n"
-      "jl 0x................\n"
+      "jl -11\n"
       "ret\n");
 }
 
@@ -510,10 +510,10 @@
   EXPECT_EQ(1, reinterpret_cast<CmpbCode>(test->entry())());
   EXPECT_DISASSEMBLY(
       "movl rax,1\n"
-      "movl r11,0x........\n"
+      "movl r11,0xffffff11\n"
       "push r11\n"
       "cmpb [rsp],0x11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "movl rax,0\n"
       "pop rcx\n"
       "ret\n");
@@ -542,12 +542,12 @@
   EXPECT_DISASSEMBLY(
       "movl rax,1\n"
       "movl rcx,0\n"
-      "movl r11,0x........\n"
+      "movl r11,0xffffff11\n"
       "push r11\n"
       "testb [rsp],0x10\n"
       "cmovzq rax,rcx\n"
       "testb [rsp],0x20\n"
-      "jz 0x................\n"
+      "jz +11\n"
       "movl rax,0\n"
       "pop rcx\n"
       "ret\n");
@@ -610,43 +610,43 @@
   typedef int64_t (*Testb2Code)();
   EXPECT_EQ(42, reinterpret_cast<Testb2Code>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0xffffefff\n"
       "bsrq rcx,rax\n"
       "cmpq rcx,0x1f\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
 
       "sarq rax,1\n"
-      "cmpq rax,0x........\n"
-      "jz 0x................\n"
+      "cmpq rax,0x7ffff7ff\n"
+      "jz +7\n"
       "int3\n"
 
-      "movl rax,0x........\n"
+      "movl rax,0x7fffffff\n"
       "bsrq rcx,rax\n"
       "cmpq rcx,0x1e\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
 
-      "cmpq rax,0x........\n"
-      "jz 0x................\n"
+      "cmpq rax,0x7fffffff\n"
+      "jz +7\n"
       "int3\n"
 
-      "movq rax,0x................\n"
-      "andl rax,0x........\n"
-      "cmpq rax,0x........\n"
-      "jz 0x................\n"
+      "movq rax,0x0000000101020408\n"
+      "andl rax,0xffffffff\n"
+      "cmpq rax,0x01020408\n"
+      "jz +7\n"
       "int3\n"
 
-      "movq rcx,0x................\n"
-      "andl rcx,0x........\n"
-      "cmpq rcx,0x........\n"
-      "jz 0x................\n"
+      "movq rcx,0x0000000101020408\n"
+      "andl rcx,0xffffffff\n"
+      "cmpq rcx,0x01020408\n"
+      "jz +7\n"
       "int3\n"
 
-      "movl rax,0x........\n"
+      "movl rax,0x0fffeff0\n"
       "bsfq rcx,rax\n"
       "cmpq rcx,4\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
 
       "movl rax,0x2a\n"
@@ -676,7 +676,7 @@
       "push rdi\n"
       "movl rdx,0x10\n"
       "testb rdx,[rsp]\n"
-      "jz 0x................\n"
+      "jz +13\n"
       "movl rax,1\n"
       "pop rcx\n"
       "ret\n"
@@ -725,7 +725,7 @@
   typedef int64_t (*LzcntCode)();
   EXPECT_EQ(108, reinterpret_cast<LzcntCode>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rcx,0x...\n"
+      "movl rcx,0xf00\n"
       "lzcntq rax,rcx\n"
       "movl rcx,0xf0\n"
       "lzcntq rcx,rcx\n"
@@ -818,7 +818,7 @@
   typedef int64_t (*IncrementCodeLong)();
   EXPECT_EQ(0x100000001, reinterpret_cast<IncrementCodeLong>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0xffffffff\n"
       "push rax\n"
       "incq [rsp]\n"
       "movq rcx,[rsp]\n"
@@ -870,7 +870,7 @@
   typedef int64_t (*DecrementCodeLong)();
   EXPECT_EQ(0xffffffff, reinterpret_cast<DecrementCodeLong>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x0000000100000001\n"
       "push rax\n"
       "decq [rsp]\n"
       "movq rcx,[rsp]\n"
@@ -895,7 +895,7 @@
       "movl rax,2\n"
       "movl rcx,4\n"
       "imull rax,rcx\n"
-      "imull rax,rax,0x...\n"
+      "imull rax,rax,0x3e8\n"
       "ret\n");
 }
 
@@ -1009,13 +1009,13 @@
   EXPECT_EQ(kProductLargeConstants,
             reinterpret_cast<SignedMultiplyLong>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
-      "movq rcx,0x................\n"
+      "movq rax,0x1234567887654321\n"
+      "movq rcx,0x0db4da5f7ef412b1\n"
       "imulq rax,rcx\n"
-      "movq r11,0x................\n"
+      "movq r11,0x1234567887654321\n"
       "imulq rcx,r11\n"
       "cmpq rax,rcx\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "ret\n");
 }
@@ -1034,8 +1034,8 @@
   EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(test->entry())());
   EXPECT_DISASSEMBLY(
       "movl rdx,0\n"
-      "movl rax,0x........\n"
-      "movl rcx,0x........\n"
+      "movl rax,0x0fffffff\n"
+      "movl rcx,0x0fffffff\n"
       "imull rax,rcx\n"
       "imull rax,rdx\n"
       "ret\n");
@@ -1057,7 +1057,7 @@
       "movl rdx,2\n"
       "movl rcx,4\n"
       "imull rdx,rcx\n"
-      "imull rdx,rdx,0x...\n"
+      "imull rdx,rdx,0x3e8\n"
       "movl rax,rdx\n"
       "ret\n");
 }
@@ -1077,7 +1077,7 @@
   EXPECT_DISASSEMBLY(
       "push pp\n"
       "movl pp,2\n"
-      "imull pp,pp,0x...\n"
+      "imull pp,pp,0x3e8\n"
       "movl rax,pp\n"
       "pop pp\n"
       "ret\n");
@@ -1115,7 +1115,7 @@
   typedef int32_t (*SignedDivide)();
   EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rax,-0x........\n"
+      "movl rax,-0x00000057\n"
       "movl rdx,0x7b\n"
       "cdq\n"
       "movl rcx,0x2a\n"
@@ -1140,7 +1140,7 @@
   EXPECT_EQ(0xf0000000, reinterpret_cast<UnsignedDivide>(test->entry())());
   EXPECT_DISASSEMBLY(
       "movl rax,0\n"
-      "movl rdx,-0x........\n"
+      "movl rdx,-0x10000000\n"
       "movl rcx,-1\n"
       "divl (rax,rdx),rcx\n"
       "ret\n");
@@ -1160,7 +1160,7 @@
   EXPECT_EQ(kLargeConstant / 42,
             reinterpret_cast<SignedDivideLong>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x1234567887654321\n"
       "movl rdx,0x7b\n"
       "cqo\n"
       "movl rcx,0x2a\n"
@@ -1187,7 +1187,7 @@
             reinterpret_cast<UnsignedDivideLong>(test->entry())());
   EXPECT_DISASSEMBLY(
       "movl rax,0\n"
-      "movq rdx,0x................\n"
+      "movq rdx,0xf000000000000000\n"
       "movq rcx,-1\n"
       "divq (rax,rdx),rcx\n"
       "ret\n");
@@ -1232,7 +1232,7 @@
   EXPECT_DISASSEMBLY_NOT_WINDOWS(
       "push rdi\n"
       "movq rcx,[rsp]\n"
-      "movl rax,0x...\n"
+      "movl rax,0x29a\n"
       "bsrq rax,rcx\n"
       "pop rcx\n"
       "ret\n");
@@ -1252,7 +1252,7 @@
   typedef int (*MoveExtend)();
   EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rdx,0x....\n"
+      "movl rdx,0xffff\n"
       "movzxbq rax,rdx\n"
       "movsxwq r8,rdx\n"
       "movzxwq rcx,rdx\n"
@@ -1274,9 +1274,9 @@
   typedef intptr_t (*MoveExtend)();
   EXPECT_EQ(0x7ffffffe, reinterpret_cast<MoveExtend>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rdx,0x........\n"
+      "movl rdx,0xffffffff\n"
       "movsxdq rdx,rdx\n"
-      "movl rax,0x........\n"
+      "movl rax,0x7fffffff\n"
       "movsxdq rax,rax\n"
       "addq rax,rdx\n"
       "ret\n");
@@ -1301,7 +1301,7 @@
   EXPECT_EQ(0xff - 1 + 0xffff,
             reinterpret_cast<MoveExtendMemory>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rdx,0x................\n"
+      "movq rdx,0x123456781234ffff\n"
       "push rdx\n"
       "movzxbq rax,[rsp]\n"
       "movsxwq r8,[rsp]\n"
@@ -1327,9 +1327,9 @@
   typedef intptr_t (*MoveExtend)();
   EXPECT_EQ(0x7ffffffe, reinterpret_cast<MoveExtend>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl r11,0x........\n"
+      "movl r11,0xffffffff\n"
       "push r11\n"
-      "push 0x........\n"
+      "push 0x7fffffff\n"
       "movsxdq rdx,[rsp+0x8]\n"
       "movsxdq rax,[rsp]\n"
       "addq rsp,0x10\n"
@@ -1378,12 +1378,12 @@
   typedef int64_t (*WordOps)();
   EXPECT_EQ(0x0100010503050507, reinterpret_cast<WordOps>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x0102030405060708\n"
       "push rax\n"
-      "addw [rsp],0x....\n"
-      "subw [rsp+0x2],0x...\n"
-      "xorw [rsp+0x4],0x...\n"
-      "andw [rsp+0x6],0x...\n"
+      "addw [rsp],0xfdff\n"
+      "subw [rsp+0x2],0x201\n"
+      "xorw [rsp+0x4],0x201\n"
+      "andw [rsp+0x6],0x301\n"
       "andw [rsp],-1\n"
       "pop rax\n"
       "ret\n");
@@ -1405,7 +1405,7 @@
   typedef int64_t (*ByteOps)();
   EXPECT_EQ(0x0100030505050707, reinterpret_cast<ByteOps>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x0102030405060708\n"
       "push rax\n"
       "addb [rsp],-1\n"
       "subb [rsp+0x2],1\n"
@@ -1904,10 +1904,10 @@
       "orl [rsi],r10\n"
       "movl rcx,0x2a\n"
       "xorl rcx,rcx\n"
-      "orl rcx,0x...\n"
+      "orl rcx,0x100\n"
       "movl rax,4\n"
       "orl rcx,rax\n"
-      "movl rax,0x....\n"
+      "movl rax,0xfff0\n"
       "andl rcx,rax\n"
       "movl rax,1\n"
       "orl rcx,rax\n"
@@ -1961,23 +1961,23 @@
       "xorq rax,[rsp]\n"
       "pop rcx\n"
       "cmpq rax,0\n"
-      "jnz 0x................\n"
+      "jnz +105\n"
       "movl rcx,0xff\n"
       "movl rax,5\n"
       "xorq rcx,rax\n"
       "cmpq rcx,0xfa\n"
-      "jnz 0x................\n"
+      "jnz +79\n"
       "push 0xff\n"
       "movl rcx,5\n"
       "xorq [rsp],rcx\n"
       "pop rcx\n"
       "cmpq rcx,0xfa\n"
-      "jnz 0x................\n"
+      "jnz +51\n"
       "xorq rcx,rcx\n"
-      "orq rcx,0x...\n"
+      "orq rcx,0x100\n"
       "movl rax,4\n"
       "orq rcx,rax\n"
-      "movl rax,0x....\n"
+      "movl rax,0xfff0\n"
       "andq rcx,rax\n"
       "movl rax,1\n"
       "push rax\n"
@@ -2263,155 +2263,155 @@
       "movl rax,4\n"
       "andl rax,2\n"
       "cmpl rax,0\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rcx,4\n"
       "andl rcx,4\n"
       "cmpl rcx,0\n"
-      "jnz 0x................\n"
+      "jnz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,0\n"
       "orl rax,0\n"
       "cmpl rax,0\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,4\n"
       "orl rax,0\n"
       "cmpl rax,0\n"
-      "jnz 0x................\n"
+      "jnz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "push rax\n"
       "movl rax,0xff\n"
       "movl [rsp],rax\n"
       "cmpl [rsp],0xff\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "pop rax\n"
       "movl rax,1\n"
       "shll rax,3\n"
       "cmpl rax,8\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,2\n"
       "shrl rax,1\n"
       "cmpl rax,1\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,8\n"
       "shrl rax,3\n"
       "cmpl rax,1\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,1\n"
       "movl rcx,3\n"
       "shll rax,cl\n"
       "cmpl rax,8\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,8\n"
       "movl rcx,3\n"
       "shrl rax,cl\n"
       "cmpl rax,1\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,1\n"
       "shlq rax,3\n"
       "cmpl rax,8\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,2\n"
       "shrq rax,1\n"
       "cmpl rax,1\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,8\n"
       "shrq rax,3\n"
       "cmpl rax,1\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,1\n"
       "movl rcx,3\n"
       "shlq rax,cl\n"
       "cmpl rax,8\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,8\n"
       "movl rcx,3\n"
       "shrq rax,cl\n"
       "cmpl rax,1\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,1\n"
       "shlq rax,31\n"
       "shrq rax,3\n"
-      "cmpq rax,0x........\n"
-      "jz 0x................\n"
+      "cmpq rax,0x10000000\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,1\n"
       "shlq rax,31\n"
       "sarl rax,3\n"
-      "cmpl rax,0x........\n"
-      "jz 0x................\n"
+      "cmpl rax,0xf0000000\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,1\n"
       "movl rcx,3\n"
       "shlq rax,31\n"
       "sarl rax,cl\n"
-      "cmpl rax,0x........\n"
-      "jz 0x................\n"
+      "cmpl rax,0xf0000000\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
-      "movl rdx,-0x........\n"
+      "movl rdx,-0x01000000\n"
       "movl r8,-1\n"
       "movl rcx,2\n"
       "shll rdx,cl\n"
       "shldl rdx,r8,2\n"
-      "cmpl rdx,0x........\n"
-      "jz 0x................\n"
+      "cmpl rdx,0xf0000003\n"
+      "jz +7\n"
       "int3\n"
-      "movq rdx,0x................\n"
+      "movq rdx,0xff00000000000000\n"
       "movq r8,-1\n"
       "movl rcx,2\n"
       "shlq rdx,cl\n"
       "shldq rdx,r8,2\n"
-      "movq r11,0x................\n"
+      "movq r11,0xf000000000000003\n"
       "cmpq rdx,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movq rdx,0x................\n"
+      "movq rdx,0xff00000000000000\n"
       "movq r8,-1\n"
       "movl rcx,2\n"
       "shlq rdx,cl\n"
       "shldq rdx,r8,cl\n"
-      "movq r11,0x................\n"
+      "movq r11,0xf000000000000003\n"
       "cmpq rdx,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movq rdx,0x................\n"
+      "movq rdx,0xff00000000000000\n"
       "movq r8,-1\n"
       "movl rcx,2\n"
       "shrq rdx,cl\n"
       "shrdq rdx,r8,cl\n"
-      "movq r11,0x................\n"
+      "movq r11,0xcff0000000000000\n"
       "cmpq rdx,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,0\n"
       "ret\n");
@@ -2607,126 +2607,126 @@
       "movl rax,4\n"
       "andl rax,2\n"
       "cmpq rax,0\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rcx,4\n"
       "push rcx\n"
       "andq rcx,[rsp]\n"
       "pop rax\n"
       "cmpq rcx,0\n"
-      "jnz 0x................\n"
+      "jnz +7\n"
       "int3\n"
       "movl rax,0\n"
       "orq rax,0\n"
       "cmpq rax,0\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,4\n"
       "orq rax,0\n"
       "cmpq rax,0\n"
-      "jnz 0x................\n"
+      "jnz +7\n"
       "int3\n"
       "push rax\n"
       "movl rax,0xff\n"
       "movq [rsp],rax\n"
       "cmpq [rsp],0xff\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "pop rax\n"
       "movl rax,1\n"
       "shlq rax,3\n"
       "cmpq rax,8\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,2\n"
       "shrq rax,1\n"
       "cmpq rax,1\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,8\n"
       "shrq rax,3\n"
       "cmpq rax,1\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,1\n"
       "movl rcx,3\n"
       "shlq rax,cl\n"
       "cmpq rax,8\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,8\n"
       "movl rcx,3\n"
       "shrq rax,cl\n"
       "cmpq rax,1\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,1\n"
       "shlq rax,3\n"
       "cmpq rax,8\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "movl rax,2\n"
       "shrq rax,1\n"
       "cmpq rax,1\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,8\n"
       "shrq rax,3\n"
       "cmpq rax,1\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,1\n"
       "movl rcx,3\n"
       "shlq rax,cl\n"
       "cmpq rax,8\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,8\n"
       "movl rcx,3\n"
       "shrq rax,cl\n"
       "cmpq rax,1\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,1\n"
       "shlq rax,31\n"
       "shrq rax,3\n"
-      "cmpq rax,0x........\n"
-      "jz 0x................\n"
+      "cmpq rax,0x10000000\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,1\n"
       "shlq rax,63\n"
       "sarq rax,3\n"
-      "movq r11,0x................\n"
+      "movq r11,0xf000000000000000\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,1\n"
       "movl rcx,3\n"
       "shlq rax,63\n"
       "sarq rax,cl\n"
-      "movq r11,0x................\n"
+      "movq r11,0xf000000000000000\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "push pp\n"
-      "movq pp,0x................\n"
+      "movq pp,0xf000000000000001\n"
       "andq pp,-1\n"
-      "movq r11,0x................\n"
+      "movq r11,0x8000000000000001\n"
       "andq pp,r11\n"
       "orq pp,2\n"
-      "movq r11,0x................\n"
+      "movq r11,0xf800000000000000\n"
       "orq pp,r11\n"
       "xorq pp,1\n"
-      "movq r11,0x................\n"
+      "movq r11,0x0800000000000000\n"
       "xorq pp,r11\n"
-      "movq r11,0x................\n"
+      "movq r11,0xf000000000000002\n"
       "cmpq pp,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "andl pp,2\n"
       "cmpq pp,2\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "pop pp\n"
       "movl rax,0\n"
@@ -2783,23 +2783,23 @@
       "movl rax,4\n"
       "movl rcx,2\n"
       "testl rax,rcx\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rdx,4\n"
       "movl rcx,4\n"
       "testl rdx,rcx\n"
-      "jnz 0x................\n"
+      "jnz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,0\n"
       "test al,0\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rcx,4\n"
       "testb rcx,4\n"
-      "jnz 0x................\n"
+      "jnz +14\n"
       "movl rax,0\n"
       "movl [rax],rax\n"
       "movl rax,0\n"
@@ -2874,33 +2874,33 @@
       "movl rax,4\n"
       "movl rcx,2\n"
       "testq rax,rcx\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "movl rdx,4\n"
       "movl rcx,4\n"
       "testq rdx,rcx\n"
-      "jnz 0x................\n"
+      "jnz +14\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "movl rax,0\n"
       "test al,0\n"
-      "jz 0x................\n"
+      "jz +14\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "movl rcx,4\n"
       "testb rcx,4\n"
-      "jnz 0x................\n"
+      "jnz +14\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "movl rcx,0xff\n"
       "testb rcx,0xff\n"
-      "jnz 0x................\n"
+      "jnz +14\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "movl rax,0xff\n"
       "test al,0xff\n"
-      "jnz 0x................\n"
+      "jnz +14\n"
       "movl rax,0\n"
       "movq [rax],rax\n"
       "movl rax,0\n"
@@ -2976,7 +2976,7 @@
   EXPECT_EQ(0x100000000,
             reinterpret_cast<CompareSwapEQ32Code>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x0000000100000000\n"
       "push rax\n"
       "movl rax,4\n"
       "movl rcx,0\n"
@@ -3002,7 +3002,7 @@
   EXPECT_EQ(0x100000004l,
             reinterpret_cast<CompareSwapNEQ32Code>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x0000000100000000\n"
       "push rax\n"
       "movl rax,2\n"
       "movl rcx,4\n"
@@ -3025,8 +3025,8 @@
   EXPECT_EQ(kAnotherLargeConstant - kLargeConstant,
             reinterpret_cast<Exchange>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
-      "movq rdx,0x................\n"
+      "movq rax,0x1234567887654321\n"
+      "movq rdx,0x0db4da5f7ef412b1\n"
       "xchgq rax,rdx\n"
       "subq rax,rdx\n"
       "ret\n");
@@ -3042,7 +3042,7 @@
   EXPECT_EQ(kLargeConstant,
             reinterpret_cast<LargeConstantCode>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x1234567887654321\n"
       "ret\n");
 }
 
@@ -3173,7 +3173,7 @@
   typedef float (*SingleFPMovesCode)();
   EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x436a0000\n"
       "movd xmm0,rax\n"
       "movss rcx,xmm0\n"
       "movss rdx,xmm1\n"
@@ -3249,7 +3249,7 @@
   typedef float (*SingleFPMoves2Code)();
   EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x436a0000\n"
       "movd xmm0,rax\n"
       "movd xmm8,rax\n"
       "movss rcx,xmm8\n"
@@ -3280,7 +3280,7 @@
   EXPECT_EQ((bit_cast<uint64_t, double>(234.5f)),
             reinterpret_cast<MovqXmmToCpuCode>(test->entry())());
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x436a8000\n"
       "movd xmm0,rax\n"
       "cvtss2sd xmm0,xmm0\n"
       "movq rax,xmm0\n"
@@ -3384,7 +3384,7 @@
   EXPECT_FLOAT_EQ(-1.0, res, 0.000001f);
   EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(
       "movups xmm10,[rax]\n"
-      "movq r11,[thr+0x...]\n"
+      "movq r11,[thr+0x2b0]\n"
       "xorpd xmm10,[r11]\n"
       "movaps xmm0,xmm10\n"
       "pop thr\n"
@@ -3413,7 +3413,7 @@
   EXPECT_FLOAT_EQ(1.0, res, 0.000001f);
   EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(
       "movups xmm10,[rax]\n"
-      "movq r11,[thr+0x...]\n"
+      "movq r11,[thr+0x2b8]\n"
       "movups xmm0,[r11]\n"
       "andpd xmm0,xmm10\n"
       "pop thr\n"
@@ -3669,10 +3669,10 @@
   EXPECT_DISASSEMBLY(
       "push rbx\n"
       "push rcx\n"
-      "movl rbx,0x........\n"
+      "movl rbx,0x4144cccd\n"
       "movd xmm0,rbx\n"
       "movd xmm8,rbx\n"
-      "movl rcx,0x........\n"
+      "movl rcx,0x4059999a\n"
       "movd xmm1,rcx\n"
       "movd xmm9,rcx\n"
       "addss xmm0,xmm1\n"
@@ -3710,10 +3710,10 @@
   float res = reinterpret_cast<PackedFPOperationsCode>(test->entry())();
   EXPECT_FLOAT_EQ(14.7f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x4144cccd\n"
       "movd xmm10,rax\n"
       "shufps xmm10,xmm10 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x4059999a\n"
       "movd xmm9,rax\n"
       "shufps xmm9,xmm9 [0]\n"
       "addps xmm10,xmm9\n"
@@ -3829,7 +3829,7 @@
   float res = reinterpret_cast<PackedFPOperations2Code>(test->entry())();
   EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
       "movaps xmm11,xmm0\n"
@@ -3856,10 +3856,10 @@
   uint32_t res = reinterpret_cast<PackedCompareEQCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40000000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [eq]\n"
@@ -3915,10 +3915,10 @@
   uint32_t res = reinterpret_cast<PackedCompareNEQCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40000000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [neq]\n"
@@ -3943,10 +3943,10 @@
   uint32_t res = reinterpret_cast<PackedCompareLTCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40000000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [lt]\n"
@@ -3971,10 +3971,10 @@
   uint32_t res = reinterpret_cast<PackedCompareLECode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40000000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [le]\n"
@@ -3999,10 +3999,10 @@
   uint32_t res = reinterpret_cast<PackedCompareNLTCode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40000000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [nlt]\n"
@@ -4027,10 +4027,10 @@
   uint32_t res = reinterpret_cast<PackedCompareNLECode>(test->entry())();
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40000000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
       "cmpps xmm0,xmm1 [nle]\n"
@@ -4063,10 +4063,10 @@
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
       "movq pp,[r12+0x27]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x4144cccd\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movq r11,[thr+0x...]\n"
+      "movq r11,[thr+0x2c8]\n"
       "xorps xmm0,[r11]\n"
       "shufps xmm0,xmm0 [aa]\n"
       "pop thr\n"
@@ -4100,10 +4100,10 @@
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
       "movq pp,[r12+0x27]\n"
-      "movl rax,-0x........\n"
+      "movl rax,-0x3e8b3333\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movq r11,[thr+0x...]\n"
+      "movq r11,[thr+0x2d0]\n"
       "andps xmm0,[r11]\n"
       "shufps xmm0,xmm0 [aa]\n"
       "pop thr\n"
@@ -4135,10 +4135,10 @@
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
       "movq pp,[r12+0x27]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x4144cccd\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movq r11,[thr+0x...]\n"
+      "movq r11,[thr+0x2d8]\n"
       "andps xmm0,[r11]\n"
       "shufps xmm0,xmm0 [ff]\n"
       "pop thr\n"
@@ -4161,10 +4161,10 @@
   float res = reinterpret_cast<PackedMinCode>(test->entry())();
   EXPECT_FLOAT_EQ(2.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40000000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
       "minps xmm0,xmm1\n"
@@ -4183,10 +4183,10 @@
   float res = reinterpret_cast<PackedMaxCode>(test->entry())();
   EXPECT_FLOAT_EQ(4.0f, res, 0.001f);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0x40000000\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
-      "movl rax,0x........\n"
+      "movl rax,0x40800000\n"
       "movd xmm1,rax\n"
       "shufps xmm1,xmm1 [0]\n"
       "maxps xmm0,xmm1\n"
@@ -4288,7 +4288,7 @@
   EXPECT_EQ(static_cast<uword>(0x0), res);
   EXPECT_DISASSEMBLY_NOT_WINDOWS_ENDS_WITH(
       "movups xmm9,[rax]\n"
-      "movq r11,[thr+0x...]\n"
+      "movq r11,[thr+0x2c0]\n"
       "movups xmm0,[r11]\n"
       "xorps xmm0,xmm9\n"
       "push rax\n"
@@ -4635,7 +4635,7 @@
   EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(test->entry())(),
                   0.001);
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x409002ae147ae148\n"
       "push pp\n"
       "push rax\n"
       "movsd xmm0,[rsp]\n"
@@ -4717,11 +4717,11 @@
   double res = reinterpret_cast<SingleFPOperationsCode>(test->entry())();
   EXPECT_FLOAT_EQ(7.668, res, 0.001);
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x402899999999999a\n"
       "push rax\n"
       "movsd xmm0,[rsp]\n"
       "movsd xmm8,[rsp]\n"
-      "movq rax,0x................\n"
+      "movq rax,0x400b333333333333\n"
       "movq [rsp],rax\n"
       "movsd xmm12,[rsp]\n"
       "addsd xmm8,xmm12\n"
@@ -4756,9 +4756,9 @@
   double res = reinterpret_cast<Int32ToDoubleConversion>(test->entry())();
   EXPECT_FLOAT_EQ(-2.0, res, 0.001);
   EXPECT_DISASSEMBLY(
-      "movq r11,0x................\n"
+      "movq r11,0x1111111100000006\n"
       "cvtsi2sd xmm0,r11\n"
-      "movq r11,0x................\n"
+      "movq r11,0x2222222200000008\n"
       "cvtsi2sd xmm8,r11\n"
       "subsd xmm0,xmm8\n"
       "ret\n");
@@ -4778,7 +4778,7 @@
   double res = reinterpret_cast<Int64ToDoubleConversionCode>(test->entry())();
   EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001);
   EXPECT_DISASSEMBLY(
-      "movq rdx,0x................\n"
+      "movq rdx,0x0000000c00000000\n"
       "cvtsi2sd xmm0,rdx\n"
       "movsd xmm15,xmm0\n"
       "addsd xmm0,xmm0\n"
@@ -4818,16 +4818,16 @@
   int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(test->entry())();
   EXPECT_EQ(420000000000l, res);
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x44a1c9a62d04ed0c\n"
       "push rax\n"
       "movsd xmm9,[rsp]\n"
       "pop rax\n"
       "cvttsd2siq rax,xmm9\n"
-      "movq r11,0x................\n"
+      "movq r11,0x8000000000000000\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movq rax,0x................\n"
+      "movq rax,0x4258727cda000000\n"
       "push rax\n"
       "movsd xmm9,[rsp]\n"
       "movsd xmm6,[rsp]\n"
@@ -4899,26 +4899,26 @@
   int64_t res = reinterpret_cast<DoubleToInt32ConversionCode>(test->entry())();
   EXPECT_EQ(42, res);
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x4258727cda000000\n"
       "push rax\n"
       "movsd xmm9,[rsp]\n"
       "pop rax\n"
       "cvttsd2sil rax,xmm9\n"
-      "movl r11,0x........\n"
+      "movl r11,0x80000000\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movq rax,0x................\n"
+      "movq rax,0xc045000000000000\n"
       "push rax\n"
       "movsd xmm9,[rsp]\n"
       "pop rax\n"
       "movq r10,-1\n"
       "cvttsd2sil r10,xmm9\n"
-      "movl r11,0x........\n"
+      "movl r11,0xffffffd6\n"
       "cmpq r10,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movq rax,0x................\n"
+      "movq rax,0x4045000000000000\n"
       "push rax\n"
       "movsd xmm9,[rsp]\n"
       "movsd xmm6,[rsp]\n"
@@ -4983,24 +4983,24 @@
       "movq pp,[r12+0x27]\n"
       "movq rax,[pp+0xf]\n"
       "cmpq rax,[pp+0xf]\n"
-      "jnz 0x................\n"
+      "jnz +92\n"
       "movq rcx,[pp+0xf]\n"
       "cmpq rcx,[pp+0xf]\n"
-      "jnz 0x................\n"
+      "jnz +78\n"
       "movl rcx,0x1e\n"
       "cmpq rcx,0x1e\n"
-      "jnz 0x................\n"
+      "jnz +63\n"
       "push rax\n"
       "movq r11,[pp+0xf]\n"
       "movq [rsp],r11\n"
       "pop rcx\n"
       "cmpq rcx,[pp+0xf]\n"
-      "jnz 0x................\n"
+      "jnz +43\n"
       "push rax\n"
       "movq [rsp],0x1e\n"
       "pop rcx\n"
       "cmpq rcx,0x1e\n"
-      "jnz 0x................\n"
+      "jnz +23\n"
       "movl rax,1\n"
       "pop thr\n"
       "pop pp\n"
@@ -5027,24 +5027,24 @@
       "movq pp,[r12+0x27]\n"
       "movq rax,[pp+0xf]\n"
       "cmpl rax,[pp+0xf]\n"
-      "jnz 0x................\n"
+      "jnz +90\n"
       "movq rcx,[pp+0xf]\n"
       "cmpl rcx,[pp+0xf]\n"
-      "jnz 0x................\n"
+      "jnz +76\n"
       "movl rcx,0x1e\n"
       "cmpl rcx,0x1e\n"
-      "jnz 0x................\n"
+      "jnz +62\n"
       "push rax\n"
       "movq r11,[pp+0xf]\n"
       "movq [rsp],r11\n"
       "pop rcx\n"
       "cmpl rcx,[pp+0xf]\n"
-      "jnz 0x................\n"
+      "jnz +42\n"
       "push rax\n"
       "movq [rsp],0x1e\n"
       "pop rcx\n"
       "cmpl rcx,0x1e\n"
-      "jnz 0x................\n"
+      "jnz +23\n"
       "movl rax,1\n"
       "pop thr\n"
       "pop pp\n"
@@ -5207,7 +5207,7 @@
   unsigned int res = reinterpret_cast<TestNot>(test->entry())();
   EXPECT_EQ(0xFFFFFFFF, res);
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0xffffffff00000000\n"
       "notq rax\n"
       "ret\n");
 }
@@ -5269,7 +5269,7 @@
       "xorpd xmm0,xmm0\n"
       "xorpd xmm0,xmm15\n"
       "comisd xmm0,xmm15\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "ret\n");
 }
@@ -5334,7 +5334,7 @@
   int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(test->entry())();
   EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001);
   EXPECT_DISASSEMBLY(
-      "movq rax,0x................\n"
+      "movq rax,0x409002ae147ae148\n"
       "push rax\n"
       "fld_d [rsp]\n"
       "movq [rsp],0\n"
@@ -5464,7 +5464,7 @@
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
       "movq pp,[r12+0x27]\n"
-      "movq r11,[thr+0x...]\n"
+      "movq r11,[thr+0x2b8]\n"
       "andpd xmm0,[r11]\n"
       "pop thr\n"
       "pop pp\n"
@@ -5506,7 +5506,7 @@
   uword res = reinterpret_cast<TestSetCC>(test->entry())();
   EXPECT_EQ(0xFFFFFF00, res);
   EXPECT_DISASSEMBLY(
-      "movl rax,0x........\n"
+      "movl rax,0xffffffff\n"
       "cmpq rax,rax\n"
       "setnzl rax\n"
       "ret\n");
@@ -5528,7 +5528,7 @@
   EXPECT_EQ(0xFFFF01FF, res);
   EXPECT_DISASSEMBLY(
       "push rbx\n"
-      "movl rbx,0x........\n"
+      "movl rbx,0xffffffff\n"
       "cmpq rbx,rbx\n"
       "setzl rdi\n"
       "movq rax,rbx\n"
@@ -5552,7 +5552,7 @@
   EXPECT_EQ(0xFFFFFF00, res);
   EXPECT_DISASSEMBLY(
       "push r10\n"
-      "movl r10,0x........\n"
+      "movl r10,0xffffffff\n"
       "cmpq r10,r10\n"
       "setnzl r10\n"
       "movq rax,r10\n"
@@ -5576,7 +5576,7 @@
   EXPECT_EQ(0xFFFFFF01, res);
   EXPECT_DISASSEMBLY(
       "push rsi\n"
-      "movl rsi,0x........\n"
+      "movl rsi,0xffffffff\n"
       "cmpq rsi,rsi\n"
       "setzl rsi\n"
       "movq rax,rsi\n"
@@ -5834,7 +5834,7 @@
       "movl rax,4\n"
       "movl r11,2\n"
       "btq rax,r11\n"
-      "jc 0x................\n"
+      "jc +7\n"
       "int3\n"
       "movl rax,1\n"
       "ret\n");
@@ -5857,7 +5857,7 @@
   EXPECT_DISASSEMBLY(
       "movl r11,0x20\n"
       "bt r11,5\n"
-      "jc 0x................\n"
+      "jc +7\n"
       "int3\n"
       "movl rax,1\n"
       "ret\n");
@@ -5882,7 +5882,7 @@
   EXPECT_DISASSEMBLY_ENDS_WITH(
       "xorq rax,rax\n"
       "movl rcx,1\n"
-      "cmpq rdx,0x...\n"
+      "cmpq rdx,0x311\n"
       "cmovzq rax,rcx\n"
       "ret\n");
 }
@@ -6006,61 +6006,61 @@
   EXPECT_EQ(42, res);
   EXPECT_DISASSEMBLY(
       "movl rax,0x2a\n"
-      "imulq rax,rax,0x........\n"
-      "movq r11,0x................\n"
+      "imulq rax,rax,0x3b9aca00\n"
+      "movq r11,0x00000009c7652400\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,0x2a\n"
-      "imull rax,rax,0x........\n"
-      "movl r11,0x........\n"
+      "imull rax,rax,0x3b9aca00\n"
+      "movl r11,0xc7652400\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movl rax,0x........\n"
-      "movq r11,0x................\n"
+      "movl rax,0x3b9aca00\n"
+      "movq r11,0x000000098bca5a00\n"
       "addq rax,r11\n"
-      "movq r11,0x................\n"
+      "movq r11,0x00000009c7652400\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movl rax,0x........\n"
-      "addl rax,0x........\n"
-      "addl rax,0x........\n"
-      "addl rax,0x........\n"
-      "movl r11,0x........\n"
+      "movl rax,0x3b9aca00\n"
+      "addl rax,0x3b9aca00\n"
+      "addl rax,0x3b9aca00\n"
+      "addl rax,0x3b9aca00\n"
+      "movl r11,0xee6b2800\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movl rax,0x........\n"
-      "subl rax,0x........\n"
-      "addl rax,0x........\n"
-      "subl rax,0x........\n"
-      "movl r11,0x........\n"
+      "movl rax,0x3b9aca00\n"
+      "subl rax,0x4d2fa200\n"
+      "addl rax,0x3b9aca00\n"
+      "subl rax,0x3b9aca00\n"
+      "movl r11,0xee6b2800\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movl rax,0x........\n"
-      "movq r11,0x................\n"
+      "movl rax,0x3b9aca00\n"
+      "movq r11,0x0000000a02ffee00\n"
       "subq rax,r11\n"
-      "movq r11,0x................\n"
+      "movq r11,0xfffffff6389adc00\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
-      "movq rax,-0x........\n"
-      "subl rax,0x........\n"
-      "subl rax,0x........\n"
-      "subl rax,0x........\n"
-      "cmpq rax,0x........\n"
-      "jz 0x................\n"
+      "movq rax,-0x3b9aca00\n"
+      "subl rax,0x3b9aca00\n"
+      "subl rax,0x3b9aca00\n"
+      "subl rax,0x3b9aca00\n"
+      "cmpq rax,0x1194d800\n"
+      "jz +7\n"
       "int3\n"
-      "movl rax,0x........\n"
-      "subl rax,0x........\n"
-      "subl rax,0x........\n"
-      "addl rax,0x........\n"
-      "movl r11,0x........\n"
+      "movl rax,0x3b9aca00\n"
+      "subl rax,0x4d2fa200\n"
+      "subl rax,0x3b9aca00\n"
+      "addl rax,0x3b9aca00\n"
+      "movl r11,0xee6b2800\n"
       "cmpq rax,r11\n"
-      "jz 0x................\n"
+      "jz +7\n"
       "int3\n"
       "movl rax,0x2a\n"
       "ret\n");
@@ -6261,10 +6261,10 @@
       "push rcx\n"
       "xorq rcx,rcx\n"
       "push rcx\n"
-      "subq rsp,0x...\n"
-      "movq [rsp+0x...],rdx\n"
-      "movq rax,[rsp+0x...]\n"
-      "addq rsp,0x...\n"
+      "subq rsp,0x400\n"
+      "movq [rsp+0x400],rdx\n"
+      "movq rax,[rsp+0x400]\n"
+      "addq rsp,0x400\n"
       "pop rcx\n"
       "pop rcx\n"
       "ret\n");
diff --git a/runtime/vm/compiler/assembler/disassembler.cc b/runtime/vm/compiler/assembler/disassembler.cc
index e950867..2777ccd 100644
--- a/runtime/vm/compiler/assembler/disassembler.cc
+++ b/runtime/vm/compiler/assembler/disassembler.cc
@@ -80,14 +80,16 @@
 }
 
 void DisassembleToJSONStream::Print(const char* format, ...) {
-  va_list args;
-  va_start(args, format);
-  intptr_t len = Utils::VSNPrint(NULL, 0, format, args);
-  va_end(args);
+  va_list measure_args;
+  va_start(measure_args, format);
+  intptr_t len = Utils::VSNPrint(NULL, 0, format, measure_args);
+  va_end(measure_args);
+
   char* p = reinterpret_cast<char*>(malloc(len + 1));
-  va_start(args, format);
-  intptr_t len2 = Utils::VSNPrint(p, len, format, args);
-  va_end(args);
+  va_list print_args;
+  va_start(print_args, format);
+  intptr_t len2 = Utils::VSNPrint(p, len, format, print_args);
+  va_end(print_args);
   ASSERT(len == len2);
   for (intptr_t i = 0; i < len; i++) {
     if (p[i] == '\n' || p[i] == '\r') {
@@ -134,10 +136,10 @@
   if (overflowed_) {
     return;
   }
-  va_list args;
-  va_start(args, format);
-  intptr_t len = Utils::VSNPrint(NULL, 0, format, args);
-  va_end(args);
+  va_list measure_args;
+  va_start(measure_args, format);
+  intptr_t len = Utils::VSNPrint(NULL, 0, format, measure_args);
+  va_end(measure_args);
   if (remaining_ < len + 100) {
     *buffer_++ = '.';
     *buffer_++ = '.';
@@ -147,9 +149,10 @@
     overflowed_ = true;
     return;
   }
-  va_start(args, format);
-  intptr_t len2 = Utils::VSNPrint(buffer_, len, format, args);
-  va_end(args);
+  va_list print_args;
+  va_start(print_args, format);
+  intptr_t len2 = Utils::VSNPrint(buffer_, len, format, print_args);
+  va_end(print_args);
   ASSERT(len == len2);
   buffer_ += len;
   remaining_ -= len;
@@ -245,7 +248,7 @@
   ASSERT(code.pointer_offsets_length() == 0);
 #endif
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     THR_Print("(No object pool for bare instructions.)\n");
   } else {
     const ObjectPool& object_pool =
@@ -293,10 +296,9 @@
   {
     const auto& stackmaps =
         CompressedStackMaps::Handle(zone, code.compressed_stackmaps());
-    CompressedStackMaps::Iterator it(thread, stackmaps);
     TextBuffer buffer(100);
     buffer.Printf("StackMaps for function '%s' {\n", function_fullname);
-    it.WriteToBuffer(&buffer, "\n");
+    stackmaps.WriteToBuffer(&buffer, "\n");
     buffer.AddString("}\n");
     THR_Print("%s", buffer.buffer());
   }
@@ -480,7 +482,7 @@
   code.Disassemble(&formatter);
   THR_Print("}\n");
   const ObjectPool& object_pool = ObjectPool::Handle(code.object_pool());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     THR_Print("(No object pool for bare instructions.)\n");
   } else if (!object_pool.IsNull()) {
     object_pool.DebugPrint();
diff --git a/runtime/vm/compiler/assembler/disassembler_arm64.cc b/runtime/vm/compiler/assembler/disassembler_arm64.cc
index 8f441ef..490569d 100644
--- a/runtime/vm/compiler/assembler/disassembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/disassembler_arm64.cc
@@ -244,7 +244,7 @@
         buffer_pos_ +=
             Utils::SNPrint(current_position_in_buffer(),
                            remaining_size_in_buffer(), ", #%d", imm9);
-        Print("] !");
+        Print("]!");
         break;
       }
       default: { Print("???"); }
@@ -269,13 +269,13 @@
       // rn + (imm7 << (2 + B31)), pre-index, no writeback.
       buffer_pos_ +=
           Utils::SNPrint(current_position_in_buffer(),
-                         remaining_size_in_buffer(), ", #%d ]", offset);
+                         remaining_size_in_buffer(), ", #%d]", offset);
       break;
     case 3:
       // rn + (imm7 << (2 + B31)), pre-index, writeback.
       buffer_pos_ +=
           Utils::SNPrint(current_position_in_buffer(),
-                         remaining_size_in_buffer(), ", #%d ]!", offset);
+                         remaining_size_in_buffer(), ", #%d]!", offset);
       break;
     default:
       Print(", ???]");
@@ -453,7 +453,7 @@
       if (shift != 0) {
         buffer_pos_ +=
             Utils::SNPrint(current_position_in_buffer(),
-                           remaining_size_in_buffer(), "lsl %d", shift);
+                           remaining_size_in_buffer(), " lsl %d", shift);
       }
       return 2;
     }
@@ -505,7 +505,7 @@
         }
         buffer_pos_ +=
             Utils::SNPrint(current_position_in_buffer(),
-                           remaining_size_in_buffer(), "0x%" Px64, imm);
+                           remaining_size_in_buffer(), "#0x%" Px64, imm);
         return ret;
       } else {
         ASSERT(STRING_STARTS_WITH(format, "imm"));
@@ -631,7 +631,8 @@
             sz_str = "w";
             break;
           case 3:
-            sz_str = "x";
+            // 64-bit width is most commonly used, no need to print "x".
+            sz_str = "";
             break;
           default:
             sz_str = "?";
@@ -683,13 +684,13 @@
 void ARM64Decoder::DecodeMoveWide(Instr* instr) {
   switch (instr->Bits(29, 2)) {
     case 0:
-      Format(instr, "movn'sf 'rd, 'imm16 'hw");
+      Format(instr, "movn'sf 'rd, 'imm16'hw");
       break;
     case 2:
-      Format(instr, "movz'sf 'rd, 'imm16 'hw");
+      Format(instr, "movz'sf 'rd, 'imm16'hw");
       break;
     case 3:
-      Format(instr, "movk'sf 'rd, 'imm16 'hw");
+      Format(instr, "movk'sf 'rd, 'imm16'hw");
       break;
     default:
       Unknown(instr);
@@ -740,11 +741,8 @@
 }
 
 void ARM64Decoder::DecodeLoadStoreExclusive(Instr* instr) {
-  if (instr->Bit(21) != 0 || instr->Bit(23) != instr->Bit(15)) {
-    Unknown(instr);
-  }
-  const int32_t size = instr->Bits(30, 2);
-  if (size != 3) {
+  if (instr->Bit(32) != 1 || instr->Bit(21) != 0 ||
+      instr->Bit(23) != instr->Bit(15)) {
     Unknown(instr);
   }
 
@@ -754,16 +752,16 @@
   if (is_load) {
     const bool is_load_acquire = !is_exclusive && is_ordered;
     if (is_load_acquire) {
-      Format(instr, "ldar 'rt, 'rn");
+      Format(instr, "ldar'sz 'rt, 'rn");
     } else {
-      Format(instr, "ldxr 'rt, 'rn");
+      Format(instr, "ldxr'sz 'rt, 'rn");
     }
   } else {
     const bool is_store_release = !is_exclusive && is_ordered;
     if (is_store_release) {
-      Format(instr, "stlr 'rt, 'rn");
+      Format(instr, "stlr'sz 'rt, 'rn");
     } else {
-      Format(instr, "stxr 'rs, 'rt, 'rn");
+      Format(instr, "stxr'sz 'rs, 'rt, 'rn");
     }
   }
 }
@@ -772,22 +770,22 @@
   switch (instr->Bit(30)) {
     case 0: {
       if ((instr->RdField() == R31) && (instr->SField() == 1)) {
-        Format(instr, "cmni'sf 'rn, 'imm12s");
+        Format(instr, "cmn'sf 'rn, 'imm12s");
       } else {
         if (((instr->RdField() == R31) || (instr->RnField() == R31)) &&
             (instr->Imm12Field() == 0) && (instr->Bit(29) == 0)) {
           Format(instr, "mov'sf 'rd, 'rn");
         } else {
-          Format(instr, "addi'sf's 'rd, 'rn, 'imm12s");
+          Format(instr, "add'sf's 'rd, 'rn, 'imm12s");
         }
       }
       break;
     }
     case 1: {
       if ((instr->RdField() == R31) && (instr->SField() == 1)) {
-        Format(instr, "cmpi'sf 'rn, 'imm12s");
+        Format(instr, "cmp'sf 'rn, 'imm12s");
       } else {
-        Format(instr, "subi'sf's 'rd, 'rn, 'imm12s");
+        Format(instr, "sub'sf's 'rd, 'rn, 'imm12s");
       }
       break;
     }
@@ -836,8 +834,8 @@
         }
       }
       if ((s_imm != (reg_size - 1)) && ((s_imm + 1) == r_imm)) {
-        int shift = reg_size - s_imm;
-        Format(instr, "lsl'sf 'rd, 'rn, ");
+        int shift = reg_size - s_imm - 1;
+        Format(instr, "lsl'sf 'rd, 'rn, #");
         PrintInt(shift);
         break;
       } else if (s_imm == (reg_size - 1)) {
@@ -856,21 +854,25 @@
   int op = instr->Bits(29, 2);
   switch (op) {
     case 0:
-      Format(instr, "andi'sf 'rd, 'rn, 'bitimm");
+      Format(instr, "and'sf 'rd, 'rn, 'bitimm");
       break;
     case 1: {
       if (instr->RnField() == R31) {
         Format(instr, "mov'sf 'rd, 'bitimm");
       } else {
-        Format(instr, "orri'sf 'rd, 'rn, 'bitimm");
+        Format(instr, "orr'sf 'rd, 'rn, 'bitimm");
       }
       break;
     }
     case 2:
-      Format(instr, "eori'sf 'rd, 'rn, 'bitimm");
+      Format(instr, "eor'sf 'rd, 'rn, 'bitimm");
       break;
     case 3:
-      Format(instr, "andi'sfs 'rd, 'rn, 'bitimm");
+      if (instr->RdField() == R31) {
+        Format(instr, "tst'sf 'rn, 'bitimm");
+      } else {
+        Format(instr, "and'sfs 'rd, 'rn, 'bitimm");
+      }
       break;
     default:
       Unknown(instr);
@@ -948,7 +950,11 @@
         Format(instr, "blr 'rn");
         break;
       case 2:
-        Format(instr, "ret 'rn");
+        if (instr->RnField() == LINK_REGISTER) {
+          Format(instr, "ret");
+        } else {
+          Format(instr, "ret 'rn");
+        }
         break;
       default:
         Unknown(instr);
@@ -1040,7 +1046,11 @@
       if ((instr->RdField() == R31) && (instr->SFField())) {
         Format(instr, "cmp'sf 'rn, 'shift_op");
       } else {
-        Format(instr, "sub'sf's 'rd, 'rn, 'shift_op");
+        if (instr->RnField() == R31) {
+          Format(instr, "neg'sf's 'rd, 'shift_op");
+        } else {
+          Format(instr, "sub'sf's 'rd, 'rn, 'shift_op");
+        }
       }
       break;
     }
@@ -1116,6 +1126,9 @@
 
   const int op = instr->Bits(10, 10);
   switch (op) {
+    case 0:
+      Format(instr, "rbit'sf 'rd, 'rn");
+      break;
     case 4:
       Format(instr, "clz'sf 'rd, 'rn");
       break;
@@ -1208,24 +1221,24 @@
   bool non_select =
       (instr->RnField() == instr->RmField()) && ((cond & 0xe) != 0xe);
   if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 0)) {
-    Format(instr, "mov'sf'cond 'rd, 'rn, 'rm");
+    Format(instr, "csel'sf 'rd, 'rn, 'rm, 'cond");
   } else if ((instr->Bits(29, 2) == 0) && (instr->Bits(10, 2) == 1)) {
     if (non_select) {
-      Format(instr, "csinc'sf'cond 'rd, 'rn, 'rm");
+      Format(instr, "csinc'sf 'rd, 'rn, 'rm, 'cond");
     } else {
-      Format(instr, "cinc'sf'condinverted 'rd, 'rn");
+      Format(instr, "cinc'sf 'rd, 'rn, 'condinverted");
     }
   } else if ((instr->Bits(29, 2) == 2) && (instr->Bits(10, 2) == 0)) {
     if (non_select) {
-      Format(instr, "cinv'sf'condinverted 'rd, 'rn");
+      Format(instr, "cinv'sf 'rd, 'rn, 'condinverted");
     } else {
-      Format(instr, "csinv'sf'cond 'rd, 'rn, 'rm");
+      Format(instr, "csinv'sf 'rd, 'rn, 'rm, 'cond");
     }
   } else if ((instr->Bits(29, 2) == 2) && (instr->Bits(10, 2) == 1)) {
     if (non_select) {
-      Format(instr, "cneg'sf'condinverted 'rd, 'rn");
+      Format(instr, "cneg'sf 'rd, 'rn, 'condinverted");
     } else {
-      Format(instr, "csneg'sf'cond 'rd, 'rn, 'rm");
+      Format(instr, "csneg'sf 'rd, 'rn, 'rm, 'cond");
     }
   } else {
     Unknown(instr);
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index 77021e4..fb4c917 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -404,9 +404,14 @@
   switch (mod) {
     case 0:
       if ((rm & 7) == 5) {
+#if defined(TARGET_ARCH_IA32)
+        int32_t abs = LoadUnaligned(reinterpret_cast<int32_t*>(modrmp + 1));
+        Print("[%#x]", abs);
+#else
         int32_t disp = LoadUnaligned(reinterpret_cast<int32_t*>(modrmp + 1));
         Print("[rip");
         PrintDisp(disp, "]");
+#endif
         return 5;
       } else if ((rm & 7) == 4) {
         // Codes for SIB byte.
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 50418b8..eed551a 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -588,9 +588,17 @@
   const Object& left = left_defn->constant_value();
   const Object& right = right_defn->constant_value();
   if (IsNonConstant(left) || IsNonConstant(right)) {
-    // TODO(vegorov): incorporate nullability information into the lattice.
-    if ((left.IsNull() && instr->right()->Type()->HasDecidableNullability()) ||
-        (right.IsNull() && instr->left()->Type()->HasDecidableNullability())) {
+    if ((left.ptr() == Object::sentinel().ptr() &&
+         !instr->right()->Type()->can_be_sentinel()) ||
+        (right.ptr() == Object::sentinel().ptr() &&
+         !instr->left()->Type()->can_be_sentinel())) {
+      // Handle provably false (EQ_STRICT) or true (NE_STRICT) sentinel checks.
+      SetValue(instr, Bool::Get(instr->kind() != Token::kEQ_STRICT));
+    } else if ((left.IsNull() &&
+                instr->right()->Type()->HasDecidableNullability()) ||
+               (right.IsNull() &&
+                instr->left()->Type()->HasDecidableNullability())) {
+      // TODO(vegorov): incorporate nullability information into the lattice.
       bool result = left.IsNull() ? instr->right()->Type()->IsNull()
                                   : instr->left()->Type()->IsNull();
       if (instr->kind() == Token::kNE_STRICT) {
@@ -845,17 +853,9 @@
 }
 
 void ConstantPropagator::VisitLoadStaticField(LoadStaticFieldInstr* instr) {
-  if (!FLAG_fields_may_be_reset) {
-    const Field& field = instr->field();
-    ASSERT(field.is_static());
-    auto& obj = Object::Handle(Z);
-    if (field.is_final() && instr->IsFieldInitialized(&obj)) {
-      if (obj.IsSmi() || (obj.IsOld() && obj.IsCanonical())) {
-        SetValue(instr, obj);
-        return;
-      }
-    }
-  }
+  // Cannot treat an initialized field as constant because the same code will be
+  // used when the AppAOT or AppJIT starts over with everything uninitialized or
+  // another isolate in the isolate group starts with everything uninitialized.
   SetValue(instr, non_constant_);
 }
 
diff --git a/runtime/vm/compiler/backend/constant_propagator_test.cc b/runtime/vm/compiler/backend/constant_propagator_test.cc
index de14881..1ee3b6d 100644
--- a/runtime/vm/compiler/backend/constant_propagator_test.cc
+++ b/runtime/vm/compiler/backend/constant_propagator_test.cc
@@ -295,4 +295,85 @@
 }
 #endif
 
+void StrictCompareSentinel(Thread* thread,
+                           bool negate,
+                           bool non_sentinel_on_left) {
+  const char* kScript = R"(
+    late final int x = 4;
+  )";
+  Zone* const Z = Thread::Current()->zone();
+  const auto& root_library = Library::CheckedHandle(Z, LoadTestScript(kScript));
+  const auto& toplevel = Class::Handle(Z, root_library.toplevel_class());
+  const auto& field_x = Field::Handle(
+      Z, toplevel.LookupStaticField(String::Handle(Z, String::New("x"))));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread, /*is_aot=*/false, /*is_optimizing=*/true);
+  FlowGraphBuilderHelper H;
+
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    auto v_load = builder.AddDefinition(new LoadStaticFieldInstr(
+        field_x, {},
+        /*calls_initializer=*/true, S.GetNextDeoptId()));
+    auto v_sentinel = H.flow_graph()->GetConstant(Object::sentinel());
+    Value* const left_value =
+        non_sentinel_on_left ? new Value(v_load) : new Value(v_sentinel);
+    Value* const right_value =
+        non_sentinel_on_left ? new Value(v_sentinel) : new Value(v_load);
+    auto v_compare = builder.AddDefinition(new StrictCompareInstr(
+        {}, negate ? Token::kNE_STRICT : Token::kEQ_STRICT, left_value,
+        right_value,
+        /*needs_number_check=*/false, S.GetNextDeoptId()));
+    builder.AddReturn(new Value(v_compare));
+  }
+
+  H.FinishGraph();
+
+  FlowGraphPrinter::PrintGraph("Before TypePropagator", H.flow_graph());
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
+  FlowGraphPrinter::PrintGraph("After TypePropagator", H.flow_graph());
+  GrowableArray<BlockEntryInstr*> ignored;
+  ConstantPropagator::Optimize(H.flow_graph());
+  FlowGraphPrinter::PrintGraph("After ConstantPropagator", H.flow_graph());
+
+  ReturnInstr* ret = nullptr;
+
+  ILMatcher cursor(H.flow_graph(),
+                   H.flow_graph()->graph_entry()->normal_entry(), true);
+  RELEASE_ASSERT(cursor.TryMatch({
+      kMatchAndMoveFunctionEntry,
+      kMatchAndMoveLoadStaticField,
+      // The StrictCompare instruction should be removed.
+      {kMatchReturn, &ret},
+  }));
+
+  EXPECT_PROPERTY(ret, it.value()->BindsToConstant());
+  EXPECT_PROPERTY(&ret->value()->BoundConstant(), it.IsBool());
+  EXPECT_PROPERTY(&ret->value()->BoundConstant(),
+                  Bool::Cast(it).value() == negate);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareEqualsSentinelLeft) {
+  StrictCompareSentinel(thread, /*negate=*/false,
+                        /*non_sentinel_on_left=*/true);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareEqualsSentinelRightt) {
+  StrictCompareSentinel(thread, /*negate=*/false,
+                        /*non_sentinel_on_left=*/false);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareNotEqualsSentinelLeft) {
+  StrictCompareSentinel(thread, /*negate=*/true,
+                        /*non_sentinel_on_left=*/true);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareNotEqualsSentinelRight) {
+  StrictCompareSentinel(thread, /*negate=*/true,
+                        /*non_sentinel_on_left=*/false);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 27ab909..1dbf213 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -56,7 +56,10 @@
       loop_invariant_loads_(nullptr),
       captured_parameters_(new (zone()) BitVector(zone(), variable_count())),
       inlining_id_(-1),
-      should_print_(FlowGraphPrinter::ShouldPrint(parsed_function.function())) {
+      should_print_(false) {
+  should_print_ = FlowGraphPrinter::ShouldPrint(parsed_function.function(),
+                                                &compiler_pass_filters_);
+
   direct_parameters_size_ = ParameterOffsetAt(
       function(), num_direct_parameters_, /*last_slot*/ false);
   DiscoverBlocks();
@@ -129,20 +132,6 @@
   }
 }
 
-Representation FlowGraph::UnboxedFieldRepresentationOf(const Field& field) {
-  switch (field.UnboxedFieldCid()) {
-    case kDoubleCid:
-      return kUnboxedDouble;
-    case kFloat32x4Cid:
-      return kUnboxedFloat32x4;
-    case kFloat64x2Cid:
-      return kUnboxedFloat64x2;
-    default:
-      RELEASE_ASSERT(field.is_non_nullable_integer());
-      return kUnboxedInt64;
-  }
-}
-
 void FlowGraph::ReplaceCurrentInstruction(ForwardInstructionIterator* iterator,
                                           Instruction* current,
                                           Instruction* replacement) {
@@ -2880,4 +2869,8 @@
   }
 }
 
+void FlowGraph::Print(const char* phase) {
+  FlowGraphPrinter::PrintGraph(phase, this);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index 5aeec58..2c82c13 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -119,6 +119,8 @@
   const ParsedFunction& parsed_function() const { return parsed_function_; }
   const Function& function() const { return parsed_function_.function(); }
 
+  void Print(const char* phase = "unknown");
+
   // The number of directly accessable parameters (above the frame pointer).
   // All other parameters can only be indirectly loaded via metadata found in
   // the arguments descriptor.
@@ -155,8 +157,6 @@
 
   static Representation ReturnRepresentationOf(const Function& function);
 
-  static Representation UnboxedFieldRepresentationOf(const Field& field);
-
   // The number of variables (or boxes) inside the functions frame - meaning
   // below the frame pointer.  This does not include the expression stack.
   intptr_t num_stack_locals() const {
@@ -469,6 +469,9 @@
   void RenameUsesDominatedByRedefinitions();
 
   bool should_print() const { return should_print_; }
+  const uint8_t* compiler_pass_filters() const {
+    return compiler_pass_filters_;
+  }
 
   //
   // High-level utilities.
@@ -632,6 +635,7 @@
 
   intptr_t inlining_id_;
   bool should_print_;
+  uint8_t* compiler_pass_filters_ = nullptr;
 
   const Array* coverage_array_ = &Array::empty_array();
 };
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index a421fe8..a6d5418 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -203,30 +203,6 @@
   ArchSpecificInitialization();
 }
 
-bool FlowGraphCompiler::IsUnboxedField(const Field& field) {
-  // The `field.is_non_nullable_integer()` is set in the kernel loader and can
-  // only be set if we consume a AOT kernel (annotated with inferred types).
-  ASSERT(!field.is_non_nullable_integer() || FLAG_precompiled_mode);
-  const bool valid_class =
-      ((SupportsUnboxedDoubles() && (field.guarded_cid() == kDoubleCid)) ||
-       (SupportsUnboxedSimd128() && (field.guarded_cid() == kFloat32x4Cid)) ||
-       (SupportsUnboxedSimd128() && (field.guarded_cid() == kFloat64x2Cid)) ||
-       field.is_non_nullable_integer());
-  return field.is_unboxing_candidate() && !field.is_nullable() && valid_class;
-}
-
-bool FlowGraphCompiler::IsPotentialUnboxedField(const Field& field) {
-  if (FLAG_precompiled_mode) {
-    // kernel_loader.cc:ReadInferredType sets the guarded cid for fields based
-    // on inferred types from TFA (if available). The guarded cid is therefore
-    // proven to be correct.
-    return IsUnboxedField(field);
-  }
-  return field.is_unboxing_candidate() &&
-         (FlowGraphCompiler::IsUnboxedField(field) ||
-          (field.guarded_cid() == kIllegalCid));
-}
-
 void FlowGraphCompiler::InitCompiler() {
   compressed_stackmaps_builder_ =
       new (zone()) CompressedStackMapsBuilder(zone());
@@ -247,16 +223,14 @@
       BlockEntryInstr* entry = block_order_[i];
       for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
         Instruction* current = it.Current();
-        if (current->IsBranch()) {
-          current = current->AsBranch()->comparison();
+        if (auto* branch = current->AsBranch()) {
+          current = branch->comparison();
         }
-        // In optimized code, ICData is always set in the instructions.
-        const ICData* ic_data = NULL;
-        if (current->IsInstanceCall()) {
-          ic_data = current->AsInstanceCall()->ic_data();
-        }
-        if ((ic_data != NULL) && (ic_data->NumberOfUsedChecks() == 0)) {
-          may_reoptimize_ = true;
+        if (auto* instance_call = current->AsInstanceCall()) {
+          const ICData* ic_data = instance_call->ic_data();
+          if ((ic_data == nullptr) || (ic_data->NumberOfUsedChecks() == 0)) {
+            may_reoptimize_ = true;
+          }
         }
       }
     }
@@ -584,6 +558,53 @@
   return false;
 }
 
+void FlowGraphCompiler::EmitFunctionEntrySourcePositionDescriptorIfNeeded() {
+  // When unwinding async stacks we might produce frames which correspond
+  // to future listeners which are going to be called when the future completes.
+  // These listeners are not yet called and thus their frame pc_offset is set
+  // to 0 - which does not actually correspond to any call- or yield- site
+  // inside the code object. Nevertheless we would like to be able to
+  // produce proper position information for it when symbolizing the stack.
+  // To achieve that in AOT mode (where we don't actually have
+  // |Function::token_pos| available) we instead emit an artificial descriptor
+  // at the very beginning of the function.
+  if (FLAG_precompiled_mode && flow_graph().function().IsClosureFunction()) {
+    code_source_map_builder_->WriteFunctionEntrySourcePosition(
+        InstructionSource(flow_graph().function().token_pos()));
+  }
+}
+
+void FlowGraphCompiler::CompileGraph() {
+  InitCompiler();
+
+#if !defined(TARGET_ARCH_IA32)
+  // For JIT we have multiple entrypoints functionality which moved the frame
+  // setup into the [TargetEntryInstr] (which will set the constant pool
+  // allowed bit to true).  Despite this we still have to set the
+  // constant pool allowed bit to true here as well, because we can generate
+  // code for [CatchEntryInstr]s, which need the pool.
+  assembler()->set_constant_pool_allowed(true);
+#endif
+
+  EmitFunctionEntrySourcePositionDescriptorIfNeeded();
+  VisitBlocks();
+
+#if defined(DEBUG)
+  assembler()->Breakpoint();
+#endif
+
+  if (!skip_body_compilation()) {
+#if !defined(TARGET_ARCH_IA32)
+    ASSERT(assembler()->constant_pool_allowed());
+#endif
+    GenerateDeferredCode();
+  }
+
+  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
+    indirect_gotos_[i]->ComputeOffsetTable(this);
+  }
+}
+
 void FlowGraphCompiler::VisitBlocks() {
   CompactBlocks();
   if (compiler::Assembler::EmittingComments()) {
@@ -3242,7 +3263,6 @@
 #define __ compiler->assembler()->
 
 void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) {
-  RELEASE_ASSERT(try_index_ == compiler->CurrentTryIndex());
   if (compiler::Assembler::EmittingComments()) {
     __ Comment("slow path %s operation", name());
   }
@@ -3359,9 +3379,7 @@
 
 void LateInitializationErrorSlowPath::PushArgumentsForRuntimeCall(
     FlowGraphCompiler* compiler) {
-  const Field& original_field = Field::ZoneHandle(
-      instruction()->AsLoadField()->slot().field().Original());
-  __ PushObject(original_field);
+  __ PushObject(Field::ZoneHandle(OriginalField()));
 }
 
 void LateInitializationErrorSlowPath::EmitSharedStubCall(
@@ -3372,9 +3390,8 @@
 #else
   ASSERT(instruction()->locs()->temp(0).reg() ==
          LateInitializationErrorABI::kFieldReg);
-  const Field& original_field = Field::ZoneHandle(
-      instruction()->AsLoadField()->slot().field().Original());
-  __ LoadObject(LateInitializationErrorABI::kFieldReg, original_field);
+  __ LoadObject(LateInitializationErrorABI::kFieldReg,
+                Field::ZoneHandle(OriginalField()));
   auto object_store = compiler->isolate_group()->object_store();
   const auto& stub = Code::ZoneHandle(
       compiler->zone(),
@@ -3641,19 +3658,17 @@
 }
 
 bool FlowGraphCompiler::CanPcRelativeCall(const Function& target) const {
-  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+  return FLAG_precompiled_mode &&
          (LoadingUnitOf(zone_, function()) == LoadingUnitOf(zone_, target));
 }
 
 bool FlowGraphCompiler::CanPcRelativeCall(const Code& target) const {
-  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-         !target.InVMIsolateHeap() &&
+  return FLAG_precompiled_mode && !target.InVMIsolateHeap() &&
          (LoadingUnitOf(zone_, function()) == LoadingUnitOf(zone_, target));
 }
 
 bool FlowGraphCompiler::CanPcRelativeCall(const AbstractType& target) const {
-  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-         !target.InVMIsolateHeap() &&
+  return FLAG_precompiled_mode && !target.InVMIsolateHeap() &&
          (LoadingUnitOf(zone_, function()) == LoadingUnit::kRootId);
 }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index c6cda87..975e431 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -315,11 +315,8 @@
 class ThrowErrorSlowPathCode : public TemplateSlowPathCode<Instruction> {
  public:
   ThrowErrorSlowPathCode(Instruction* instruction,
-                         const RuntimeEntry& runtime_entry,
-                         intptr_t try_index)
-      : TemplateSlowPathCode(instruction),
-        runtime_entry_(runtime_entry),
-        try_index_(try_index) {}
+                         const RuntimeEntry& runtime_entry)
+      : TemplateSlowPathCode(instruction), runtime_entry_(runtime_entry) {}
 
   // This name appears in disassembly.
   virtual const char* name() = 0;
@@ -341,15 +338,14 @@
 
  private:
   const RuntimeEntry& runtime_entry_;
-  const intptr_t try_index_;
 };
 
 class NullErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  NullErrorSlowPath(CheckNullInstr* instruction, intptr_t try_index)
+  explicit NullErrorSlowPath(CheckNullInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               GetRuntimeEntry(instruction->exception_type()),
-                               try_index) {}
+                               GetRuntimeEntry(instruction->exception_type())) {
+  }
 
   CheckNullInstr::ExceptionType exception_type() const {
     return instruction()->AsCheckNull()->exception_type();
@@ -376,10 +372,8 @@
 
 class RangeErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
-      : ThrowErrorSlowPathCode(instruction,
-                               kRangeErrorRuntimeEntry,
-                               try_index) {}
+  explicit RangeErrorSlowPath(GenericCheckBoundInstr* instruction)
+      : ThrowErrorSlowPathCode(instruction, kRangeErrorRuntimeEntry) {}
   virtual const char* name() { return "check bound"; }
 
   virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
@@ -394,11 +388,11 @@
 
 class LateInitializationErrorSlowPath : public ThrowErrorSlowPathCode {
  public:
-  LateInitializationErrorSlowPath(LoadFieldInstr* instruction,
-                                  intptr_t try_index)
+  explicit LateInitializationErrorSlowPath(Instruction* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kLateFieldNotInitializedErrorRuntimeEntry,
-                               try_index) {}
+                               kLateFieldNotInitializedErrorRuntimeEntry) {
+    ASSERT(instruction->IsLoadField() || instruction->IsLoadStaticField());
+  }
   virtual const char* name() { return "late initialization error"; }
 
   virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
@@ -409,6 +403,13 @@
 
   virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
                                   bool save_fpu_registers);
+
+ private:
+  FieldPtr OriginalField() const {
+    return instruction()->IsLoadField()
+               ? instruction()->AsLoadField()->slot().field().Original()
+               : instruction()->AsLoadStaticField()->field().Original();
+  }
 };
 
 class FlowGraphCompiler : public ValueObject {
@@ -470,12 +471,8 @@
 
   static bool SupportsUnboxedDoubles();
   static bool SupportsUnboxedSimd128();
-  static bool SupportsHardwareDivision();
   static bool CanConvertInt64ToDouble();
 
-  static bool IsUnboxedField(const Field& field);
-  static bool IsPotentialUnboxedField(const Field& field);
-
   // Accessors.
   compiler::Assembler* assembler() const { return assembler_; }
   const ParsedFunction& parsed_function() const { return parsed_function_; }
@@ -499,6 +496,9 @@
 
   BlockEntryInstr* current_block() const { return current_block_; }
   void set_current_block(BlockEntryInstr* value) { current_block_ = value; }
+
+  Instruction* current_instruction() const { return current_instruction_; }
+
   static bool CanOptimize();
   bool CanOptimizeFunction() const;
   bool CanOSRFunction() const;
@@ -570,6 +570,8 @@
 
   void VisitBlocks();
 
+  void EmitFunctionEntrySourcePositionDescriptorIfNeeded();
+
   // Bail out of the flow graph compiler. Does not return to the caller.
   void Bailout(const char* reason);
 
@@ -1152,8 +1154,6 @@
     current_instruction_ = current_instruction;
   }
 
-  Instruction* current_instruction() { return current_instruction_; }
-
   void CompactBlock(BlockEntryInstr* block);
   void CompactBlocks();
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index fbe3e61..d95dd98 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -29,7 +29,7 @@
 DECLARE_FLAG(bool, enable_simd_inline);
 
 void FlowGraphCompiler::ArchSpecificInitialization() {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     auto object_store = isolate_group()->object_store();
 
     const auto& stub =
@@ -66,17 +66,13 @@
 }
 
 bool FlowGraphCompiler::SupportsUnboxedDoubles() {
-  return TargetCPUFeatures::vfp_supported() && FLAG_unbox_doubles;
+  return FLAG_unbox_doubles;
 }
 
 bool FlowGraphCompiler::SupportsUnboxedSimd128() {
   return TargetCPUFeatures::neon_supported() && FLAG_enable_simd_inline;
 }
 
-bool FlowGraphCompiler::SupportsHardwareDivision() {
-  return TargetCPUFeatures::can_divide();
-}
-
 bool FlowGraphCompiler::CanConvertInt64ToDouble() {
   // ARM does not have a short instruction sequence for converting int64 to
   // double.
@@ -286,7 +282,7 @@
 
   // R1 = extracted function
   // R4 = offset of type argument vector (or 0 if class is not generic)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     kPoolReg = PP;
   } else {
     __ LoadFieldFromOffset(kPoolReg, CODE_REG,
@@ -340,7 +336,7 @@
       ASSERT(StackSize() >= 0);
       __ EnterDartFrame(StackSize() * compiler::target::kWordSize);
     }
-  } else if (FLAG_use_bare_instructions) {
+  } else if (FLAG_precompiled_mode) {
     assembler()->set_constant_pool_allowed(true);
   }
 }
@@ -382,38 +378,6 @@
   EndCodeSourceRange(PrologueSource());
 }
 
-// Input parameters:
-//   LR: return address.
-//   SP: address of last argument.
-//   FP: caller's frame pointer.
-//   PP: caller's pool pointer.
-//   R4: arguments descriptor array.
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-
-  // For JIT we have multiple entrypoints functionality which moved the frame
-  // setup into the [TargetEntryInstr] (which will set the constant pool
-  // allowed bit to true).  Despite this we still have to set the
-  // constant pool allowed bit to true here as well, because we can generate
-  // code for [CatchEntryInstr]s, which need the pool.
-  __ set_constant_pool_allowed(true);
-
-  VisitBlocks();
-
-#if defined(DEBUG)
-  __ bkpt(0);
-#endif
-
-  if (!skip_body_compilation()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    GenerateDeferredCode();
-  }
-
-  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
-    indirect_gotos_[i]->ComputeOffsetTable(this);
-  }
-}
-
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
   if (CanPcRelativeCall(stub)) {
@@ -580,20 +544,11 @@
                     (args_desc.Count() - 1) * compiler::target::kWordSize);
   // Use same code pattern as instance call so it can be parsed by code patcher.
   if (FLAG_precompiled_mode) {
-    if (FLAG_use_bare_instructions) {
-      // The AOT runtime will replace the slot in the object pool with the
-      // entrypoint address - see app_snapshot.cc.
-      CLOBBERS_LR(__ LoadUniqueObject(LR, StubCode::MegamorphicCall()));
-    } else {
-      __ LoadUniqueObject(CODE_REG, StubCode::MegamorphicCall());
-      CLOBBERS_LR(
-          __ ldr(LR, compiler::FieldAddress(
-                         CODE_REG, compiler::target::Code::entry_point_offset(
-                                       Code::EntryKind::kMonomorphic))));
-    }
+    // The AOT runtime will replace the slot in the object pool with the
+    // entrypoint address - see app_snapshot.cc.
+    CLOBBERS_LR(__ LoadUniqueObject(LR, StubCode::MegamorphicCall()));
     __ LoadUniqueObject(R9, cache);
     CLOBBERS_LR(__ blx(LR));
-
   } else {
     __ LoadUniqueObject(R9, cache);
     __ LoadUniqueObject(CODE_REG, StubCode::MegamorphicCall());
@@ -641,7 +596,7 @@
   __ LoadFromOffset(
       R0, SP,
       (ic_data.SizeWithoutTypeArgs() - 1) * compiler::target::kWordSize);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see app_snapshot.cc.
     CLOBBERS_LR(__ LoadUniqueObject(LR, initial_stub));
@@ -693,7 +648,7 @@
   if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R4, arguments_descriptor);
   } else {
-    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    if (!FLAG_precompiled_mode) {
       __ LoadImmediate(R4, 0);  // GC safe smi zero because of stub.
     }
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index da37d86..abad72a 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -28,7 +28,7 @@
 DECLARE_FLAG(bool, enable_simd_inline);
 
 void FlowGraphCompiler::ArchSpecificInitialization() {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     auto object_store = isolate_group()->object_store();
 
     const auto& stub =
@@ -73,10 +73,6 @@
   return true;
 }
 
-bool FlowGraphCompiler::SupportsHardwareDivision() {
-  return true;
-}
-
 void FlowGraphCompiler::EnterIntrinsicMode() {
   ASSERT(!intrinsic_mode());
   intrinsic_mode_ = true;
@@ -278,7 +274,7 @@
   // R1 = extracted function
   // R4 = offset of type argument vector (or 0 if class is not generic)
   intptr_t pp_offset = 0;
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // PP is not tagged on arm64.
     kPoolReg = PP;
     pp_offset = kHeapObjectTag;
@@ -332,7 +328,7 @@
       ASSERT(StackSize() >= 0);
       __ EnterDartFrame(StackSize() * kWordSize);
     }
-  } else if (FLAG_use_bare_instructions) {
+  } else if (FLAG_precompiled_mode) {
     assembler()->set_constant_pool_allowed(true);
   }
 }
@@ -360,13 +356,11 @@
     }
 
     __ Comment("Initialize spill slots");
-    if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
-      __ LoadObject(R0, Object::null_object());
-    }
     for (intptr_t i = 0; i < num_locals; ++i) {
       const intptr_t slot_index =
           compiler::target::frame_layout.FrameSlotForVariableIndex(-i);
-      Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : R0;
+      Register value_reg =
+          slot_index == args_desc_slot ? ARGS_DESC_REG : NULL_REG;
       __ StoreToOffset(value_reg, FP, slot_index * kWordSize);
     }
   }
@@ -374,38 +368,6 @@
   EndCodeSourceRange(PrologueSource());
 }
 
-// Input parameters:
-//   LR: return address.
-//   SP: address of last argument.
-//   FP: caller's frame pointer.
-//   PP: caller's pool pointer.
-//   R4: arguments descriptor array.
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-
-  // For JIT we have multiple entrypoints functionality which moved the frame
-  // setup into the [TargetEntryInstr] (which will set the constant pool
-  // allowed bit to true).  Despite this we still have to set the
-  // constant pool allowed bit to true here as well, because we can generate
-  // code for [CatchEntryInstr]s, which need the pool.
-  __ set_constant_pool_allowed(true);
-
-  VisitBlocks();
-
-#if defined(DEBUG)
-  __ brk(0);
-#endif
-
-  if (!skip_body_compilation()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    GenerateDeferredCode();
-  }
-
-  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
-    indirect_gotos_[i]->ComputeOffsetTable(this);
-  }
-}
-
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
   if (CanPcRelativeCall(stub)) {
@@ -576,7 +538,7 @@
   const intptr_t stub_index = op.AddObject(
       StubCode::MegamorphicCall(), ObjectPool::Patchability::kPatchable);
   ASSERT((data_index + 1) == stub_index);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see app_snapshot.cc.
     CLOBBERS_LR(__ LoadDoubleWordFromPoolIndex(R5, LR, data_index));
@@ -636,7 +598,7 @@
       op.AddObject(initial_stub, ObjectPool::Patchability::kPatchable);
   ASSERT((data_index + 1) == initial_stub_index);
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see app_snapshot.cc.
     CLOBBERS_LR(__ LoadDoubleWordFromPoolIndex(R5, LR, data_index));
@@ -687,7 +649,7 @@
   if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R4, arguments_descriptor);
   } else {
-    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    if (!FLAG_precompiled_mode) {
       __ LoadImmediate(R4, 0);  // GC safe smi zero because of stub.
     }
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 0b232dd..1daf4c0 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -48,10 +48,6 @@
   return FLAG_enable_simd_inline;
 }
 
-bool FlowGraphCompiler::SupportsHardwareDivision() {
-  return true;
-}
-
 bool FlowGraphCompiler::CanConvertInt64ToDouble() {
   return true;
 }
@@ -459,24 +455,6 @@
   EndCodeSourceRange(PrologueSource());
 }
 
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-
-  ASSERT(!block_order().is_empty());
-  VisitBlocks();
-
-  if (!skip_body_compilation()) {
-#if defined(DEBUG)
-    __ int3();
-#endif
-    GenerateDeferredCode();
-  }
-
-  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
-    indirect_gotos_[i]->ComputeOffsetTable(this);
-  }
-}
-
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   if (stub.InVMIsolateHeap()) {
     __ CallVmStub(stub);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 573add6..91cc786 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -28,7 +28,7 @@
 DECLARE_FLAG(bool, enable_simd_inline);
 
 void FlowGraphCompiler::ArchSpecificInitialization() {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     auto object_store = isolate_group()->object_store();
 
     const auto& stub =
@@ -70,10 +70,6 @@
   return FLAG_enable_simd_inline;
 }
 
-bool FlowGraphCompiler::SupportsHardwareDivision() {
-  return true;
-}
-
 bool FlowGraphCompiler::CanConvertInt64ToDouble() {
   return true;
 }
@@ -282,7 +278,7 @@
 
   // RBX = extracted function
   // RDX = offset of type argument vector (or 0 if class is not generic)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     kPoolReg = PP;
   } else {
     __ movq(kPoolReg,
@@ -301,7 +297,7 @@
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
   if (!flow_graph().graph_entry()->NeedsFrame()) {
-    if (FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       assembler()->set_constant_pool_allowed(true);
     }
     return;
@@ -378,33 +374,6 @@
   EndCodeSourceRange(PrologueSource());
 }
 
-void FlowGraphCompiler::CompileGraph() {
-  InitCompiler();
-
-  // We have multiple entrypoints functionality which moved the frame
-  // setup into the [FunctionEntryInstr] (which will set the constant pool
-  // allowed bit to true).  Despite this we still have to set the
-  // constant pool allowed bit to true here as well, because we can generate
-  // code for [CatchEntryInstr]s, which need the pool.
-  __ set_constant_pool_allowed(true);
-
-  ASSERT(!block_order().is_empty());
-  VisitBlocks();
-
-#if defined(DEBUG)
-  __ int3();
-#endif
-
-  if (!skip_body_compilation()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    GenerateDeferredCode();
-  }
-
-  for (intptr_t i = 0; i < indirect_gotos_.length(); ++i) {
-    indirect_gotos_[i]->ComputeOffsetTable(this);
-  }
-}
-
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
   if (CanPcRelativeCall(stub)) {
@@ -579,16 +548,9 @@
 
   // Use same code pattern as instance call so it can be parsed by code patcher.
   if (FLAG_precompiled_mode) {
-    if (FLAG_use_bare_instructions) {
-      // The AOT runtime will replace the slot in the object pool with the
-      // entrypoint address - see app_snapshot.cc.
-      __ LoadUniqueObject(RCX, StubCode::MegamorphicCall());
-    } else {
-      __ LoadUniqueObject(CODE_REG, StubCode::MegamorphicCall());
-      __ movq(RCX, compiler::FieldAddress(CODE_REG,
-                                          Code::entry_point_offset(
-                                              Code::EntryKind::kMonomorphic)));
-    }
+    // The AOT runtime will replace the slot in the object pool with the
+    // entrypoint address - see app_snapshot.cc.
+    __ LoadUniqueObject(RCX, StubCode::MegamorphicCall());
     __ LoadUniqueObject(RBX, cache);
     __ call(RCX);
   } else {
@@ -637,7 +599,7 @@
   __ Comment("InstanceCallAOT (%s)", switchable_call_mode);
   __ movq(RDX, compiler::Address(
                    RSP, (ic_data.SizeWithoutTypeArgs() - 1) * kWordSize));
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see app_snapshot.cc.
     __ LoadUniqueObject(RCX, initial_stub);
@@ -670,7 +632,7 @@
   if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R10, arguments_descriptor);
   } else {
-    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    if (!FLAG_precompiled_mode) {
       __ xorl(R10, R10);  // GC safe smi zero because of stub.
     }
   }
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 8e7e24d..878bcec 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -894,17 +894,17 @@
 
 bool LoadFieldInstr::IsUnboxedDartFieldLoad() const {
   return slot().representation() == kTagged && slot().IsDartField() &&
-         FlowGraphCompiler::IsUnboxedField(slot().field());
+         slot().IsUnboxed();
 }
 
 bool LoadFieldInstr::IsPotentialUnboxedDartFieldLoad() const {
   return slot().representation() == kTagged && slot().IsDartField() &&
-         FlowGraphCompiler::IsPotentialUnboxedField(slot().field());
+         slot().IsPotentialUnboxed();
 }
 
 Representation LoadFieldInstr::representation() const {
   if (IsUnboxedDartFieldLoad() && CompilerState::Current().is_optimizing()) {
-    return FlowGraph::UnboxedFieldRepresentationOf(slot().field());
+    return slot().UnboxedRepresentation();
   }
   return slot().representation();
 }
@@ -963,12 +963,12 @@
 
 bool StoreInstanceFieldInstr::IsUnboxedDartFieldStore() const {
   return slot().representation() == kTagged && slot().IsDartField() &&
-         FlowGraphCompiler::IsUnboxedField(slot().field());
+         slot().IsUnboxed();
 }
 
 bool StoreInstanceFieldInstr::IsPotentialUnboxedDartFieldStore() const {
   return slot().representation() == kTagged && slot().IsDartField() &&
-         FlowGraphCompiler::IsPotentialUnboxedField(slot().field());
+         slot().IsPotentialUnboxed();
 }
 
 Representation StoreInstanceFieldInstr::RequiredInputRepresentation(
@@ -979,7 +979,7 @@
     return kTagged;
   }
   if (IsUnboxedDartFieldStore() && CompilerState::Current().is_optimizing()) {
-    return FlowGraph::UnboxedFieldRepresentationOf(slot().field());
+    return slot().UnboxedRepresentation();
   }
   return slot().representation();
 }
@@ -1077,45 +1077,6 @@
   return field().ptr() == other.AsLoadStaticField()->field().ptr();
 }
 
-bool LoadStaticFieldInstr::IsFieldInitialized(Object* field_value) const {
-  if (FLAG_fields_may_be_reset) {
-    return false;
-  }
-
-  // Since new isolates will be spawned, the JITed code cannot depend on whether
-  // global field was initialized when running with --enable-isolate-groups.
-  if (FLAG_enable_isolate_groups) return false;
-
-  const Field& field = this->field();
-  Isolate* only_isolate = IsolateGroup::Current()->FirstIsolate();
-  if (only_isolate == nullptr) {
-    // This can happen if background compiler executes this code but the mutator
-    // is being shutdown and the isolate was already unregistered from the group
-    // (and is trying to stop this BG compiler).
-    if (field_value != nullptr) {
-      *field_value = Object::sentinel().ptr();
-    }
-    return false;
-  }
-  if (field_value == nullptr) {
-    field_value = &Object::Handle();
-  }
-  *field_value = only_isolate->field_table()->At(field.field_id());
-  return (field_value->ptr() != Object::sentinel().ptr()) &&
-         (field_value->ptr() != Object::transition_sentinel().ptr());
-}
-
-Definition* LoadStaticFieldInstr::Canonicalize(FlowGraph* flow_graph) {
-  // When precompiling, the fact that a field is currently initialized does not
-  // make it safe to omit code that checks if the field needs initialization
-  // because the field will be reset so it starts uninitialized in the process
-  // running the precompiled code. We must be prepared to reinitialize fields.
-  if (calls_initializer() && IsFieldInitialized()) {
-    set_calls_initializer(false);
-  }
-  return this;
-}
-
 ConstantInstr::ConstantInstr(const Object& value,
                              const InstructionSource& source)
     : TemplateDefinition(source), value_(value), token_pos_(source.token_pos) {
@@ -1174,18 +1135,18 @@
 
 // Returns true if the value represents a constant.
 bool Value::BindsToConstant() const {
-  return definition()->IsConstant();
+  return definition()->OriginalDefinition()->IsConstant();
 }
 
 // Returns true if the value represents constant null.
 bool Value::BindsToConstantNull() const {
-  ConstantInstr* constant = definition()->AsConstant();
+  ConstantInstr* constant = definition()->OriginalDefinition()->AsConstant();
   return (constant != NULL) && constant->value().IsNull();
 }
 
 const Object& Value::BoundConstant() const {
   ASSERT(BindsToConstant());
-  ConstantInstr* constant = definition()->AsConstant();
+  ConstantInstr* constant = definition()->OriginalDefinition()->AsConstant();
   ASSERT(constant != NULL);
   return constant->value();
 }
@@ -1246,7 +1207,7 @@
 // ==== Support for visiting flow graphs.
 
 #define DEFINE_ACCEPT(ShortName, Attrs)                                        \
-  void ShortName##Instr::Accept(FlowGraphVisitor* visitor) {                   \
+  void ShortName##Instr::Accept(InstructionVisitor* visitor) {                 \
     visitor->Visit##ShortName(this);                                           \
   }
 
@@ -1338,12 +1299,15 @@
   // TODO(fschneider): Implement a faster way to get the block of an
   // instruction.
   Instruction* result = previous();
-  ASSERT(result != nullptr);
-  while (!result->IsBlockEntry()) {
+  while ((result != nullptr) && !result->IsBlockEntry()) {
     result = result->previous();
-    ASSERT(result != nullptr);
   }
-  return result->AsBlockEntry();
+  // InlineExitCollector::RemoveUnreachableExits may call
+  // Instruction::GetBlock on instructions which are not properly linked
+  // to the flow graph (as collected exits may belong to unreachable
+  // fragments), so this code should gracefully handle the absence of
+  // BlockEntry.
+  return (result != nullptr) ? result->AsBlockEntry() : nullptr;
 }
 
 void ForwardInstructionIterator::RemoveCurrentFromGraph() {
@@ -2584,7 +2548,8 @@
   if (!HasUses() && !flow_graph->is_licm_allowed()) {
     return NULL;
   }
-  if ((constrained_type() != nullptr) && Type()->IsEqualTo(value()->Type())) {
+  if (constrained_type() != nullptr &&
+      constrained_type()->IsEqualTo(value()->Type())) {
     return value()->definition();
   }
   return this;
@@ -4178,10 +4143,25 @@
 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
                                                            bool opt) const {
   const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps = 0;
+  const bool use_shared_stub = UseSharedSlowPathStub(opt);
+  const intptr_t kNumTemps = calls_initializer() &&
+                                     throw_exception_on_initialization() &&
+                                     use_shared_stub
+                                 ? 1
+                                 : 0;
   LocationSummary* locs = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
-      calls_initializer() ? LocationSummary::kCall : LocationSummary::kNoCall);
+      calls_initializer()
+          ? (throw_exception_on_initialization()
+                 ? (use_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                                    : LocationSummary::kCallOnSlowPath)
+                 : LocationSummary::kCall)
+          : LocationSummary::kNoCall);
+  if (calls_initializer() && throw_exception_on_initialization() &&
+      use_shared_stub) {
+    locs->set_temp(
+        0, Location::RegisterLocation(LateInitializationErrorABI::kFieldReg));
+  }
   locs->set_out(0, calls_initializer() ? Location::RegisterLocation(
                                              InitStaticFieldABI::kResultReg)
                                        : Location::RequiresRegister());
@@ -4202,26 +4182,50 @@
   __ LoadMemoryValue(result, result, static_cast<int32_t>(field_offset));
 
   if (calls_initializer()) {
-    compiler::Label call_runtime, no_call;
-    __ CompareObject(result, Object::sentinel());
+    if (throw_exception_on_initialization()) {
+      ThrowErrorSlowPathCode* slow_path =
+          new LateInitializationErrorSlowPath(this);
+      compiler->AddSlowPathCode(slow_path);
 
+      __ CompareObject(result, Object::sentinel());
+      __ BranchIf(EQUAL, slow_path->entry_label());
+      return;
+    }
+    ASSERT(field().has_initializer());
+    auto object_store = compiler->isolate_group()->object_store();
+    const Field& original_field = Field::ZoneHandle(field().Original());
+
+    compiler::Label no_call, call_initializer;
+    __ CompareObject(result, Object::sentinel());
     if (!field().is_late()) {
-      __ BranchIf(EQUAL, &call_runtime);
+      __ BranchIf(EQUAL, &call_initializer);
       __ CompareObject(result, Object::transition_sentinel());
     }
-
     __ BranchIf(NOT_EQUAL, &no_call);
 
-    __ Bind(&call_runtime);
-    __ LoadObject(InitStaticFieldABI::kFieldReg,
-                  Field::ZoneHandle(field().Original()));
+    auto& stub = Code::ZoneHandle(compiler->zone());
+    __ Bind(&call_initializer);
+    if (field().needs_load_guard()) {
+      stub = object_store->init_static_field_stub();
+    } else if (field().is_late()) {
+      // The stubs below call the initializer function directly, so make sure
+      // one is created.
+      original_field.EnsureInitializerFunction();
+      stub = field().is_final()
+                 ? object_store->init_late_final_static_field_stub()
+                 : object_store->init_late_static_field_stub();
+    } else {
+      // We call to runtime for non-late fields because the stub would need to
+      // catch any exception generated by the initialization function to change
+      // the value of the static field from the transition sentinel to null.
+      stub = object_store->init_static_field_stub();
+    }
 
-    auto object_store = compiler->isolate_group()->object_store();
-    const auto& init_static_field_stub = Code::ZoneHandle(
-        compiler->zone(), object_store->init_static_field_stub());
-    compiler->GenerateStubCall(source(), init_static_field_stub,
+    __ LoadObject(InitStaticFieldABI::kFieldReg, original_field);
+    compiler->GenerateStubCall(source(), stub,
                                /*kind=*/UntaggedPcDescriptors::kOther, locs(),
                                deopt_id(), env());
+
     __ Bind(&no_call);
   }
 }
@@ -4232,7 +4236,7 @@
 
   if (throw_exception_on_initialization()) {
     ThrowErrorSlowPathCode* slow_path =
-        new LateInitializationErrorSlowPath(this, compiler->CurrentTryIndex());
+        new LateInitializationErrorSlowPath(this);
     compiler->AddSlowPathCode(slow_path);
 
     const Register result_reg = locs()->out(0).reg();
@@ -4259,7 +4263,6 @@
     stub = object_store->init_instance_field_stub();
   } else if (field.is_late()) {
     if (!field.has_nontrivial_initializer()) {
-      // Common stub calls runtime which will throw an exception.
       stub = object_store->init_instance_field_stub();
     } else {
       // Stubs for late field initialization call initializer
@@ -5521,8 +5524,7 @@
   ASSERT(representation() == RequiredInputRepresentation(kIndexPos));
   ASSERT(representation() == RequiredInputRepresentation(kLengthPos));
 
-  RangeErrorSlowPath* slow_path =
-      new RangeErrorSlowPath(this, compiler->CurrentTryIndex());
+  RangeErrorSlowPath* slow_path = new RangeErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
   Location length_loc = locs()->in(kLengthPos);
   Location index_loc = locs()->in(kIndexPos);
@@ -5959,8 +5961,43 @@
   }
 }
 
+static bool AllInputsAreRedefinitions(PhiInstr* phi) {
+  for (intptr_t i = 0; i < phi->InputCount(); i++) {
+    if (phi->InputAt(i)->definition()->RedefinedValue() == nullptr) {
+      return false;
+    }
+  }
+  return true;
+}
+
 Definition* PhiInstr::Canonicalize(FlowGraph* flow_graph) {
   Definition* replacement = GetReplacementForRedundantPhi();
+  if (replacement != nullptr && flow_graph->is_licm_allowed() &&
+      AllInputsAreRedefinitions(this)) {
+    // If we are replacing a Phi which has redefinitions as all of its inputs
+    // then to maintain the redefinition chain we are going to insert a
+    // redefinition. If any input is *not* a redefinition that means that
+    // whatever properties were infered for a Phi also hold on a path
+    // that does not pass through any redefinitions so there is no need
+    // to redefine this value.
+    auto zone = flow_graph->zone();
+    auto redef = new (zone) RedefinitionInstr(new (zone) Value(replacement));
+    flow_graph->InsertAfter(block(), redef, /*env=*/nullptr, FlowGraph::kValue);
+
+    // Redefinition is not going to dominate the block entry itself, so we
+    // have to handle environment uses at the block entry specially.
+    Value* next_use;
+    for (Value* use = env_use_list(); use != nullptr; use = next_use) {
+      next_use = use->next_use();
+      if (use->instruction() == block()) {
+        use->RemoveFromUseList();
+        use->set_definition(replacement);
+        replacement->AddEnvUse(use);
+      }
+    }
+    return redef;
+  }
+
   return (replacement != nullptr) ? replacement : this;
 }
 
@@ -6185,7 +6222,7 @@
 }
 
 bool Utf8ScanInstr::IsScanFlagsUnboxed() const {
-  return FlowGraphCompiler::IsUnboxedField(scan_flags_field_.field());
+  return scan_flags_field_.IsUnboxed();
 }
 
 InvokeMathCFunctionInstr::InvokeMathCFunctionInstr(
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 745412a..c261131 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -11,6 +11,7 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
 #include <memory>
+#include <tuple>
 #include <utility>
 
 #include "vm/allocation.h"
@@ -54,6 +55,7 @@
 class FlowGraphVisitor;
 class ForwardInstructionIterator;
 class Instruction;
+class InstructionVisitor;
 class LocalVariable;
 class LoopInfo;
 class ParsedFunction;
@@ -235,6 +237,10 @@
     return cid_start == kIllegalCid && cid_end == kIllegalCid;
   }
 
+  bool Equals(const CidRangeValue& other) const {
+    return cid_start == other.cid_start && cid_end == other.cid_end;
+  }
+
   intptr_t cid_start;
   intptr_t cid_end;
 };
@@ -537,7 +543,7 @@
 // Functions required in all concrete instruction classes.
 #define DECLARE_INSTRUCTION_NO_BACKEND(type)                                   \
   virtual Tag tag() const { return k##type; }                                  \
-  virtual void Accept(FlowGraphVisitor* visitor);                              \
+  virtual void Accept(InstructionVisitor* visitor);                            \
   DEFINE_INSTRUCTION_TYPE_CHECK(type)
 
 #define DECLARE_INSTRUCTION_BACKEND()                                          \
@@ -564,9 +570,13 @@
 #define PRINT_TO_SUPPORT virtual void PrintTo(BaseTextBuffer* f) const;
 #define PRINT_OPERANDS_TO_SUPPORT                                              \
   virtual void PrintOperandsTo(BaseTextBuffer* f) const;
+#define DECLARE_ATTRIBUTES(...)                                                \
+  auto GetAttributes() const { return std::make_tuple(__VA_ARGS__); }          \
+  static auto GetAttributeNames() { return std::make_tuple(#__VA_ARGS__); }
 #else
 #define PRINT_TO_SUPPORT
 #define PRINT_OPERANDS_TO_SUPPORT
+#define DECLARE_ATTRIBUTES(...)
 #endif  // defined(INCLUDE_IL_PRINTER)
 
 // Together with CidRange, this represents a mapping from a range of class-ids
@@ -867,7 +877,7 @@
   }
 
   // Visiting support.
-  virtual void Accept(FlowGraphVisitor* visitor) = 0;
+  virtual void Accept(InstructionVisitor* visitor) = 0;
 
   Instruction* previous() const { return previous_; }
   void set_previous(Instruction* instr) {
@@ -953,6 +963,11 @@
     return static_cast<T*>(this);
   }
 
+  template <typename T>
+  const T* Cast() const {
+    return static_cast<const T*>(this);
+  }
+
   // Returns structure describing location constraints required
   // to emit native code for this instruction.
   LocationSummary* locs() {
@@ -2566,6 +2581,7 @@
         block_(block) {}
 
   DECLARE_INSTRUCTION(Parameter)
+  DECLARE_ATTRIBUTES(index())
 
   intptr_t index() const { return index_; }
   intptr_t param_offset() const { return param_offset_; }
@@ -3254,6 +3270,7 @@
 
   virtual TokenPosition token_pos() const { return token_pos_; }
   Token::Kind kind() const { return kind_; }
+  DECLARE_ATTRIBUTES(kind())
 
   virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right) = 0;
 
@@ -3762,6 +3779,8 @@
 
   virtual Value* RedefinedValue() const;
 
+  virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
@@ -4098,6 +4117,9 @@
   Code::EntryKind entry_kind() const { return entry_kind_; }
   void set_entry_kind(Code::EntryKind value) { entry_kind_ = value; }
 
+  void mark_as_call_on_this() { is_call_on_this_ = true; }
+  bool is_call_on_this() const { return is_call_on_this_; }
+
   DEFINE_INSTRUCTION_TYPE_CHECK(InstanceCallBase);
 
   bool receiver_is_not_smi() const { return receiver_is_not_smi_; }
@@ -4144,6 +4166,7 @@
   bool has_unique_selector_;
   Code::EntryKind entry_kind_ = Code::EntryKind::kNormal;
   bool receiver_is_not_smi_ = false;
+  bool is_call_on_this_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(InstanceCallBaseInstr);
 };
@@ -4254,6 +4277,9 @@
     new_call->set_result_type(call->result_type());
     new_call->set_entry_kind(call->entry_kind());
     new_call->set_has_unique_selector(call->has_unique_selector());
+    if (call->is_call_on_this()) {
+      new_call->mark_as_call_on_this();
+    }
     return new_call;
   }
 
@@ -5559,28 +5585,82 @@
   DISALLOW_COPY_AND_ASSIGN(GuardFieldTypeInstr);
 };
 
-class LoadStaticFieldInstr : public TemplateDefinition<0, Throws> {
+template <intptr_t N>
+class TemplateLoadField : public TemplateDefinition<N, Throws> {
+  using Base = TemplateDefinition<N, Throws>;
+
+ public:
+  TemplateLoadField(const InstructionSource& source,
+                    bool calls_initializer = false,
+                    intptr_t deopt_id = DeoptId::kNone,
+                    const Field* field = nullptr)
+      : Base(source, deopt_id),
+        token_pos_(source.token_pos),
+        throw_exception_on_initialization_(
+            field != nullptr && !field->has_initializer() && field->is_late()),
+        calls_initializer_(calls_initializer) {
+    ASSERT(!calls_initializer || field != nullptr);
+    ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
+  }
+
+  virtual TokenPosition token_pos() const { return token_pos_; }
+  bool calls_initializer() const { return calls_initializer_; }
+  void set_calls_initializer(bool value) { calls_initializer_ = value; }
+
+  bool throw_exception_on_initialization() const {
+    return throw_exception_on_initialization_;
+  }
+
+  // Slow path is used if load throws exception on initialization.
+  virtual bool UseSharedSlowPathStub(bool is_optimizing) const {
+    return Base::SlowPathSharingSupported(is_optimizing);
+  }
+
+  virtual intptr_t DeoptimizationTarget() const { return Base::GetDeoptId(); }
+  virtual bool ComputeCanDeoptimize() const { return false; }
+  virtual bool ComputeCanDeoptimizeAfterCall() const {
+    return calls_initializer() && !CompilerState::Current().is_aot();
+  }
+  virtual intptr_t NumberOfInputsConsumedBeforeCall() const {
+    return Base::InputCount();
+  }
+
+  virtual bool HasUnknownSideEffects() const {
+    return calls_initializer() && !throw_exception_on_initialization();
+  }
+
+  virtual bool CanCallDart() const {
+    // The slow path (running the field initializer) always calls one of a
+    // specific set of stubs. For those stubs that do not simply call the
+    // runtime, the GC recognizes their frames and restores write barriers
+    // automatically (see Thread::RestoreWriteBarrierInvariant).
+    return false;
+  }
+  virtual bool CanTriggerGC() const { return calls_initializer(); }
+  virtual bool MayThrow() const { return calls_initializer(); }
+
+ private:
+  const TokenPosition token_pos_;
+  const bool throw_exception_on_initialization_;
+  bool calls_initializer_;
+
+  DISALLOW_COPY_AND_ASSIGN(TemplateLoadField);
+};
+
+class LoadStaticFieldInstr : public TemplateLoadField<0> {
  public:
   LoadStaticFieldInstr(const Field& field,
                        const InstructionSource& source,
                        bool calls_initializer = false,
                        intptr_t deopt_id = DeoptId::kNone)
-      : TemplateDefinition(source, deopt_id),
-        field_(field),
-        token_pos_(source.token_pos),
-        calls_initializer_(calls_initializer) {
-    ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
-  }
+      : TemplateLoadField<0>(source, calls_initializer, deopt_id, &field),
+        field_(field) {}
 
   DECLARE_INSTRUCTION(LoadStaticField)
 
   virtual CompileType ComputeType() const;
 
   const Field& field() const { return field_; }
-  bool IsFieldInitialized(Object* field_value = nullptr) const;
-
-  bool calls_initializer() const { return calls_initializer_; }
-  void set_calls_initializer(bool value) { calls_initializer_ = value; }
 
   virtual bool AllowsCSE() const {
     // If two loads of a static-final-late field call the initializer and one
@@ -5594,25 +5674,12 @@
            (!field().is_late() || field().has_initializer());
   }
 
-  virtual bool ComputeCanDeoptimize() const {
-    return calls_initializer() && !CompilerState::Current().is_aot();
-  }
-  virtual bool HasUnknownSideEffects() const { return calls_initializer(); }
-  virtual bool CanTriggerGC() const { return calls_initializer(); }
-  virtual bool MayThrow() const { return calls_initializer(); }
-
-  virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
   virtual bool AttributesEqual(const Instruction& other) const;
 
-  virtual TokenPosition token_pos() const { return token_pos_; }
-
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
   const Field& field_;
-  const TokenPosition token_pos_;
-  bool calls_initializer_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr);
 };
@@ -6625,46 +6692,24 @@
 // Note: if slot was a subject of the field unboxing optimization then this load
 // would both load the box stored in the field and then load the content of
 // the box.
-class LoadFieldInstr : public TemplateDefinition<1, Throws> {
+class LoadFieldInstr : public TemplateLoadField<1> {
  public:
   LoadFieldInstr(Value* instance,
                  const Slot& slot,
                  const InstructionSource& source,
                  bool calls_initializer = false,
                  intptr_t deopt_id = DeoptId::kNone)
-      : TemplateDefinition(source, deopt_id),
-        slot_(slot),
-        token_pos_(source.token_pos),
-        calls_initializer_(calls_initializer),
-        throw_exception_on_initialization_(false) {
-    ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
-    ASSERT(!calls_initializer || slot.IsDartField());
+      : TemplateLoadField(source,
+                          calls_initializer,
+                          deopt_id,
+                          slot.IsDartField() ? &slot.field() : nullptr),
+        slot_(slot) {
     SetInputAt(0, instance);
-    if (calls_initializer_) {
-      const Field& field = slot.field();
-      throw_exception_on_initialization_ = !field.needs_load_guard() &&
-                                           field.is_late() &&
-                                           !field.has_initializer();
-    }
   }
 
   Value* instance() const { return inputs_[0]; }
   const Slot& slot() const { return slot_; }
 
-  virtual TokenPosition token_pos() const { return token_pos_; }
-
-  bool calls_initializer() const { return calls_initializer_; }
-  void set_calls_initializer(bool value) { calls_initializer_ = value; }
-
-  bool throw_exception_on_initialization() const {
-    return throw_exception_on_initialization_;
-  }
-
-  // Slow path is used if load throws exception on initialization.
-  virtual bool UseSharedSlowPathStub(bool is_optimizing) const {
-    return SlowPathSharingSupported(is_optimizing);
-  }
-
   virtual Representation representation() const;
 
   // Returns whether this instruction is an unboxed load from a _boxed_ Dart
@@ -6677,27 +6722,10 @@
   bool IsPotentialUnboxedDartFieldLoad() const;
 
   DECLARE_INSTRUCTION(LoadField)
+  DECLARE_ATTRIBUTES(&slot())
+
   virtual CompileType ComputeType() const;
 
-  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
-  virtual bool ComputeCanDeoptimize() const { return false; }
-  virtual bool ComputeCanDeoptimizeAfterCall() const {
-    return calls_initializer() && !CompilerState::Current().is_aot();
-  }
-  virtual intptr_t NumberOfInputsConsumedBeforeCall() const {
-    return InputCount();
-  }
-
-  virtual bool HasUnknownSideEffects() const {
-    return calls_initializer() && !throw_exception_on_initialization();
-  }
-
-  virtual bool CanCallDart() const {
-    return calls_initializer() && !throw_exception_on_initialization();
-  }
-  virtual bool CanTriggerGC() const { return calls_initializer(); }
-  virtual bool MayThrow() const { return calls_initializer(); }
-
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   bool IsImmutableLengthLoad() const { return slot().IsImmutableLengthSlot(); }
@@ -6736,9 +6764,6 @@
   void EmitNativeCodeForInitializerCall(FlowGraphCompiler* compiler);
 
   const Slot& slot_;
-  const TokenPosition token_pos_;
-  bool calls_initializer_;
-  bool throw_exception_on_initialization_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
 };
@@ -8877,7 +8902,9 @@
   virtual bool AllowsCSE() const { return true; }
   virtual bool HasUnknownSideEffects() const { return false; }
 
-  virtual bool AttributesEqual(const Instruction& other) const { return true; }
+  virtual bool AttributesEqual(const Instruction& other) const {
+    return other.Cast<CheckClassIdInstr>()->cids().Equals(cids_);
+  }
 
   PRINT_OPERANDS_TO_SUPPORT
 
@@ -9667,9 +9694,27 @@
   DISALLOW_COPY_AND_ASSIGN(Environment);
 };
 
+class InstructionVisitor : public ValueObject {
+ public:
+  InstructionVisitor() {}
+  virtual ~InstructionVisitor() {}
+
+// Visit functions for instruction classes, with an empty default
+// implementation.
+#define DECLARE_VISIT_INSTRUCTION(ShortName, Attrs)                            \
+  virtual void Visit##ShortName(ShortName##Instr* instr) {}
+
+  FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
+
+#undef DECLARE_VISIT_INSTRUCTION
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(InstructionVisitor);
+};
+
 // Visitor base class to visit each instruction and computation in a flow
 // graph as defined by a reversed list of basic blocks.
-class FlowGraphVisitor : public ValueObject {
+class FlowGraphVisitor : public InstructionVisitor {
  public:
   explicit FlowGraphVisitor(const GrowableArray<BlockEntryInstr*>& block_order)
       : current_iterator_(NULL), block_order_(&block_order) {}
@@ -9683,15 +9728,6 @@
   // instructions in order from the block entry to exit.
   virtual void VisitBlocks();
 
-// Visit functions for instruction classes, with an empty default
-// implementation.
-#define DECLARE_VISIT_INSTRUCTION(ShortName, Attrs)                            \
-  virtual void Visit##ShortName(ShortName##Instr* instr) {}
-
-  FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
-
-#undef DECLARE_VISIT_INSTRUCTION
-
  protected:
   void set_block_order(const GrowableArray<BlockEntryInstr*>& block_order) {
     block_order_ = &block_order;
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 30015fa..d15b079 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -599,7 +599,7 @@
   __ LoadObject(R4, arguments_descriptor);
 
   ASSERT(locs()->in(0).reg() == R0);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // R0: Closure with a cached entry point.
     __ ldr(R2, compiler::FieldAddress(
                    R0, compiler::target::Closure::entry_point_offset()));
@@ -1448,7 +1448,23 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ StoreToOffset(FPREG, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+    __ StoreToOffset(branch, THR, compiler::target::Thread::vm_tag_offset());
+#endif
+
     __ blx(branch);
+
+#if !defined(PRODUCT)
+    __ LoadImmediate(temp1, compiler::target::Thread::vm_tag_dart_id());
+    __ StoreToOffset(temp1, THR, compiler::target::Thread::vm_tag_offset());
+    __ LoadImmediate(temp1, 0);
+    __ StoreToOffset(temp1, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+#endif
   } else {
     // We need to copy the return address up into the dummy stack frame so the
     // stack walker will know which safepoint to use.
@@ -1493,7 +1509,7 @@
 
     // Restore the global object pool after returning from runtime (old space is
     // moving, so the GOP could have been relocated).
-    if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       __ SetupGlobalPoolAndDispatchTable();
     }
   }
@@ -1660,7 +1676,7 @@
   // Put the code object in the reserved slot.
   __ StoreToOffset(CODE_REG, FPREG,
                    kPcMarkerSlotFromFp * compiler::target::kWordSize);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   } else {
     __ LoadImmediate(PP, 0);  // GC safe value into PP.
@@ -4123,7 +4139,6 @@
       break;
     }
     case Token::kTRUNCDIV: {
-      ASSERT(TargetCPUFeatures::can_divide());
       if (RangeUtils::CanBeZero(right_range())) {
         // Handle divide by zero in runtime.
         __ cmp(right, compiler::Operand(0));
@@ -4145,7 +4160,6 @@
       break;
     }
     case Token::kMOD: {
-      ASSERT(TargetCPUFeatures::can_divide());
       if (RangeUtils::CanBeZero(right_range())) {
         // Handle divide by zero in runtime.
         __ cmp(right, compiler::Operand(0));
@@ -4768,7 +4782,7 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
-  // FLAG_use_bare_instructions mode and only after VM isolate stubs where
+  // precompiled mode and only after VM isolate stubs where
   // replaced with isolate-specific stubs.
   auto object_store = IsolateGroup::Current()->object_store();
   const bool stubs_in_vm_isolate =
@@ -4779,7 +4793,6 @@
           ->untag()
           ->InVMIsolateHeap();
   const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
-                                     FLAG_use_bare_instructions &&
                                      !stubs_in_vm_isolate;
   LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
@@ -6214,7 +6227,6 @@
   compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
 
-  ASSERT(TargetCPUFeatures::can_divide());
   const Register left = locs()->in(0).reg();
   const Register right = locs()->in(1).reg();
   ASSERT(locs()->out(0).IsPairLocation());
@@ -6388,8 +6400,7 @@
     return;
   }
 
-  ThrowErrorSlowPathCode* slow_path =
-      new NullErrorSlowPath(this, compiler->CurrentTryIndex());
+  ThrowErrorSlowPathCode* slow_path = new NullErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
   __ BranchIf(EQUAL, slow_path->entry_label());
@@ -6724,10 +6735,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+  explicit ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "int64 shift"; }
 
@@ -6818,8 +6828,7 @@
     // Jump to a slow path if shift is larger than 63 or less than 0.
     ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      slow_path =
-          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftInt64OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
       __ CompareImmediate(right_hi, 0);
       __ b(slow_path->entry_label(), NE);
@@ -6885,10 +6894,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+  explicit ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "uint32 shift"; }
 
@@ -6954,8 +6962,7 @@
     // Jump to a slow path if shift count is > 31 or negative.
     ShiftUint32OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
-      slow_path =
-          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftUint32OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ CompareImmediate(right_hi, 0);
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index ce64f09..1c5673c 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -523,7 +523,7 @@
   __ LoadObject(R4, arguments_descriptor);
 
   ASSERT(locs()->in(0).reg() == R0);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // R0: Closure with a cached entry point.
     __ LoadFieldFromOffset(R2, R0,
                            compiler::target::Closure::entry_point_offset());
@@ -1071,7 +1071,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int64_t imm = static_cast<int64_t>(right.constant().ptr());
+    const int64_t imm = Smi::RawValue(Smi::Cast(right.constant()).Value());
     __ TestImmediate(left, imm, compiler::kObjectBytes);
   } else {
     __ tst(left, compiler::Operand(right.reg()), compiler::kObjectBytes);
@@ -1270,6 +1270,14 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ StoreToOffset(FPREG, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+    __ StoreToOffset(branch, THR, compiler::target::Thread::vm_tag_offset());
+#endif
+
     // We are entering runtime code, so the C stack pointer must be restored
     // from the stack limit to the top of the stack.
     __ mov(R25, CSP);
@@ -1280,6 +1288,13 @@
     // Restore the Dart stack pointer.
     __ mov(SP, CSP);
     __ mov(CSP, R25);
+
+#if !defined(PRODUCT)
+    __ LoadImmediate(temp1, compiler::target::Thread::vm_tag_dart_id());
+    __ StoreToOffset(temp1, THR, compiler::target::Thread::vm_tag_offset());
+    __ StoreToOffset(ZR, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use.
@@ -1343,7 +1358,7 @@
 
     // Restore the global object pool after returning from runtime (old space is
     // moving, so the GOP could have been relocated).
-    if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       __ SetupGlobalPoolAndDispatchTable();
     }
 
@@ -1506,7 +1521,7 @@
   // Put the code object in the reserved slot.
   __ StoreToOffset(CODE_REG, FPREG,
                    kPcMarkerSlotFromFp * compiler::target::kWordSize);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   } else {
     // We now load the pool pointer (PP) with a GC safe value as we are about to
@@ -2300,7 +2315,7 @@
            compiler::FieldAddress(
                field_reg, Field::guarded_list_length_in_object_offset_offset()),
            compiler::kByte);
-    __ LoadCompressed(
+    __ LoadCompressedSmi(
         length_reg,
         compiler::FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
@@ -2311,7 +2326,7 @@
     // value's class matches guarded class id of the field.
     // offset_reg contains offset already corrected by -kHeapObjectTag that is
     // why we use Address instead of FieldAddress.
-    __ ldr(TMP, compiler::Address(value_reg, offset_reg));
+    __ LoadCompressedSmi(TMP, compiler::Address(value_reg, offset_reg));
     __ CompareObjectRegisters(length_reg, TMP);
 
     if (deopt == NULL) {
@@ -2705,10 +2720,8 @@
   // R3: new object end address.
   // R8: iterator which initially points to the start of the variable
   // data area to be initialized.
-  // R6: null
   if (num_elements > 0) {
     const intptr_t array_size = instance_size - sizeof(UntaggedArray);
-    __ LoadObject(R6, Object::null_object());
     __ AddImmediate(R8, AllocateArrayABI::kResultReg,
                     sizeof(UntaggedArray) - kHeapObjectTag);
     if (array_size < (kInlineArraySize * kCompressedWordSize)) {
@@ -2718,7 +2731,7 @@
             AllocateArrayABI::kResultReg,
             compiler::Address(R8, current_offset, compiler::Address::Offset,
                               compiler::kObjectBytes),
-            R6);
+            NULL_REG);
         current_offset += kCompressedWordSize;
       }
     } else {
@@ -2730,7 +2743,7 @@
           AllocateArrayABI::kResultReg,
           compiler::Address(R8, 0, compiler::Address::Offset,
                             compiler::kObjectBytes),
-          R6);
+          NULL_REG);
       __ AddImmediate(R8, kCompressedWordSize);
       __ b(&init_loop);
       __ Bind(&end_loop);
@@ -3440,7 +3453,7 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int64_t imm = static_cast<int64_t>(constant.ptr());
+    const int64_t imm = Smi::RawValue(Smi::Cast(constant).Value());
     switch (op_kind()) {
       case Token::kADD: {
         if (deopt == NULL) {
@@ -3996,7 +4009,7 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
-  // FLAG_use_bare_instructions mode and only after VM isolate stubs where
+  // precompiled mode and only after VM isolate stubs where
   // replaced with isolate-specific stubs.
   auto object_store = IsolateGroup::Current()->object_store();
   const bool stubs_in_vm_isolate =
@@ -4007,7 +4020,6 @@
           ->untag()
           ->InVMIsolateHeap();
   const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
-                                     FLAG_use_bare_instructions &&
                                      !stubs_in_vm_isolate;
   LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
@@ -5408,8 +5420,7 @@
 }
 
 void CheckNullInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ThrowErrorSlowPathCode* slow_path =
-      new NullErrorSlowPath(this, compiler->CurrentTryIndex());
+  ThrowErrorSlowPathCode* slow_path = new NullErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
   Register value_reg = locs()->in(0).reg();
@@ -5492,11 +5503,9 @@
                       Register divisor,
                       Range* divisor_range,
                       Register tmp,
-                      Register out,
-                      intptr_t try_index)
+                      Register out)
       : ThrowErrorSlowPathCode(instruction,
-                               kIntegerDivisionByZeroExceptionRuntimeEntry,
-                               try_index),
+                               kIntegerDivisionByZeroExceptionRuntimeEntry),
         is_mod_(instruction->op_kind() == Token::kMOD),
         divisor_(divisor),
         divisor_range_(divisor_range),
@@ -5620,8 +5629,8 @@
 
   // Prepare a slow path.
   Range* right_range = instruction->right()->definition()->range();
-  Int64DivideSlowPath* slow_path = new (Z) Int64DivideSlowPath(
-      instruction, right, right_range, tmp, out, compiler->CurrentTryIndex());
+  Int64DivideSlowPath* slow_path =
+      new (Z) Int64DivideSlowPath(instruction, right, right_range, tmp, out);
 
   // Handle modulo/division by zero exception on slow path.
   if (slow_path->has_divide_by_zero()) {
@@ -5850,10 +5859,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+  explicit ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "int64 shift"; }
 
@@ -5920,8 +5928,7 @@
     // Jump to a slow path if shift is larger than 63 or less than 0.
     ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      slow_path =
-          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftInt64OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
       __ CompareImmediate(shift, kShiftCountLimit);
       __ b(slow_path->entry_label(), HI);
@@ -5980,10 +5987,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+  explicit ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "uint32 shift"; }
 
@@ -6029,8 +6035,7 @@
 
     // Jump to a slow path if shift count is negative.
     if (!shift_count_in_range) {
-      ShiftUint32OpSlowPath* slow_path =
-          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      ShiftUint32OpSlowPath* slow_path = new (Z) ShiftUint32OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ tbnz(slow_path->entry_label(), right, kBitsPerWord - 1);
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 198e2d4..60dd46e 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1052,7 +1052,24 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ movl(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            FPREG);
+    __ movl(compiler::Assembler::VMTagAddress(), branch);
+#endif
+
     __ call(branch);
+
+#if !defined(PRODUCT)
+    __ movl(compiler::Assembler::VMTagAddress(),
+            compiler::Immediate(compiler::target::Thread::vm_tag_dart_id()));
+    __ movl(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            compiler::Immediate(0));
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use. Unlike X64, there's no
@@ -5534,8 +5551,7 @@
 }
 
 void CheckNullInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ThrowErrorSlowPathCode* slow_path =
-      new NullErrorSlowPath(this, compiler->CurrentTryIndex());
+  ThrowErrorSlowPathCode* slow_path = new NullErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
   Register value_reg = locs()->in(0).reg();
@@ -5906,10 +5922,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+  explicit ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "int64 shift"; }
 
@@ -6005,8 +6020,7 @@
     // Jump to a slow path if shift count is > 63 or negative.
     ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      slow_path =
-          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftInt64OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
       __ testl(right_hi, right_hi);
       __ j(NOT_ZERO, slow_path->entry_label());
@@ -6069,10 +6083,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+  explicit ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "uint32 shift"; }
 
@@ -6140,8 +6153,7 @@
     // Jump to a slow path if shift count is > 31 or negative.
     ShiftUint32OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
-      slow_path =
-          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftUint32OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ testl(right_hi, right_hi);
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index 1c8b3f8..cc6770b 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -4,6 +4,8 @@
 
 #include "vm/compiler/backend/il_printer.h"
 
+#include <tuple>
+
 #include "vm/compiler/api/print_filter.h"
 #include "vm/compiler/backend/il.h"
 #include "vm/compiler/backend/linearscan.h"
@@ -20,19 +22,198 @@
             false,
             "Calls display a unary, sorted-by count form of ICData");
 DEFINE_FLAG(bool, print_environments, false, "Print SSA environments.");
+DEFINE_FLAG(bool,
+            print_flow_graph_as_json,
+            false,
+            "Use machine readable output when printing IL graphs.");
 
 DECLARE_FLAG(bool, trace_inlining_intervals);
 
-bool FlowGraphPrinter::ShouldPrint(const Function& function) {
-  return compiler::PrintFilter::ShouldPrint(function);
+class IlTestPrinter : public AllStatic {
+ public:
+  static void PrintGraph(const char* phase, FlowGraph* flow_graph) {
+    JSONWriter writer;
+    writer.OpenObject();
+    writer.PrintProperty("p", phase);
+    writer.PrintProperty("f", flow_graph->function().ToFullyQualifiedCString());
+    writer.OpenArray("b");
+    for (auto block : flow_graph->reverse_postorder()) {
+      PrintBlock(&writer, block);
+    }
+    writer.CloseArray();
+    writer.OpenObject("desc");
+    AttributesSerializer(&writer).WriteDescriptors();
+    writer.CloseObject();
+    writer.OpenObject("flags");
+    writer.PrintPropertyBool("nnbd", IsolateGroup::Current()->null_safety());
+    writer.CloseObject();
+    writer.CloseObject();
+    THR_Print("%s\n", writer.ToCString());
+  }
+
+  static void PrintBlock(JSONWriter* writer, BlockEntryInstr* block) {
+    writer->OpenObject();
+    writer->PrintProperty64("b", block->block_id());
+    writer->PrintProperty("o", block->DebugName());
+    if (auto block_with_defs = block->AsBlockEntryWithInitialDefs()) {
+      if (block_with_defs->initial_definitions() != nullptr &&
+          block_with_defs->initial_definitions()->length() > 0) {
+        writer->OpenArray("d");
+        for (auto defn : *block_with_defs->initial_definitions()) {
+          if (defn->IsConstant() && !defn->HasUses()) continue;
+          PrintInstruction(writer, defn);
+        }
+        writer->CloseArray();
+      }
+    }
+    writer->OpenArray("is");
+    if (auto join = block->AsJoinEntry()) {
+      for (PhiIterator it(join); !it.Done(); it.Advance()) {
+        PrintInstruction(writer, it.Current());
+      }
+    }
+    for (auto instr : block->instructions()) {
+      PrintInstruction(writer, instr);
+    }
+    writer->CloseArray();
+    writer->CloseObject();
+  }
+
+  static void PrintInstruction(JSONWriter* writer,
+                               Instruction* instr,
+                               const char* name = nullptr) {
+    writer->OpenObject(name);
+    if (auto defn = instr->AsDefinition()) {
+      if (defn->ssa_temp_index() != -1) {
+        writer->PrintProperty("v", defn->ssa_temp_index());
+      }
+    }
+    writer->PrintProperty("o", instr->DebugName());
+    if (auto branch = instr->AsBranch()) {
+      PrintInstruction(writer, branch->comparison(), "cc");
+    } else {
+      if (instr->InputCount() != 0) {
+        writer->OpenArray("i");
+        for (intptr_t i = 0; i < instr->InputCount(); i++) {
+          writer->PrintValue(instr->InputAt(i)->definition()->ssa_temp_index());
+        }
+        writer->CloseArray();
+      } else if (instr->ArgumentCount() != 0 &&
+                 instr->GetPushArguments() != nullptr) {
+        writer->OpenArray("i");
+        for (intptr_t i = 0; i < instr->ArgumentCount(); i++) {
+          writer->PrintValue(
+              instr->ArgumentValueAt(i)->definition()->ssa_temp_index());
+        }
+        writer->CloseArray();
+      }
+      AttributesSerializer serializer(writer);
+      instr->Accept(&serializer);
+    }
+    if (instr->SuccessorCount() > 0) {
+      writer->OpenArray("s");
+      for (auto succ : instr->successors()) {
+        writer->PrintValue(succ->block_id());
+      }
+      writer->CloseArray();
+    }
+    writer->CloseObject();
+  }
+
+  template <typename T>
+  class HasGetAttributes {
+    template <typename U>
+    static std::true_type test(decltype(&U::GetAttributes));
+    template <typename U>
+    static std::false_type test(...);
+
+   public:
+    static constexpr bool value = decltype(test<T>(0))::value;
+  };
+
+  class AttributesSerializer : public InstructionVisitor {
+   public:
+    explicit AttributesSerializer(JSONWriter* writer) : writer_(writer) {}
+
+    void WriteDescriptors() {
+#define DECLARE_VISIT_INSTRUCTION(ShortName, Attrs)                            \
+  WriteDescriptor<ShortName##Instr>(#ShortName);
+
+      FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
+
+#undef DECLARE_VISIT_INSTRUCTION
+    }
+
+#define DECLARE_VISIT_INSTRUCTION(ShortName, Attrs)                            \
+  virtual void Visit##ShortName(ShortName##Instr* instr) { Write(instr); }
+
+    FOR_EACH_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
+
+#undef DECLARE_VISIT_INSTRUCTION
+
+   private:
+    void WriteAttribute(const char* value) { writer_->PrintValue(value); }
+
+    void WriteAttribute(intptr_t value) { writer_->PrintValue(value); }
+
+    void WriteAttribute(Token::Kind kind) {
+      writer_->PrintValue(Token::Str(kind));
+    }
+
+    void WriteAttribute(const Slot* slot) { writer_->PrintValue(slot->Name()); }
+
+    template <typename... Ts>
+    void WriteTuple(const std::tuple<Ts...>& tuple) {
+      std::apply([&](Ts const&... elements) { WriteAttribute(elements...); },
+                 tuple);
+    }
+
+    template <typename T,
+              typename = typename std::enable_if_t<HasGetAttributes<T>::value>>
+    void Write(T* instr) {
+      writer_->OpenArray("d");
+      WriteTuple(instr->GetAttributes());
+      writer_->CloseArray();
+    }
+
+    void Write(Instruction* instr) {
+      // Default, do nothing.
+    }
+
+    template <typename T>
+    void WriteDescriptor(
+        const char* name,
+        typename std::enable_if_t<HasGetAttributes<T>::value>* = 0) {
+      writer_->OpenArray(name);
+      WriteTuple(T::GetAttributeNames());
+      writer_->CloseArray();
+    }
+
+    template <typename T>
+    void WriteDescriptor(
+        const char* name,
+        typename std::enable_if_t<!HasGetAttributes<T>::value>* = 0) {}
+
+    JSONWriter* writer_;
+  };
+};
+
+bool FlowGraphPrinter::ShouldPrint(
+    const Function& function,
+    uint8_t** compiler_pass_filter /* = nullptr */) {
+  return compiler::PrintFilter::ShouldPrint(function, compiler_pass_filter);
 }
 
 void FlowGraphPrinter::PrintGraph(const char* phase, FlowGraph* flow_graph) {
   LogBlock lb;
-  THR_Print("*** BEGIN CFG\n%s\n", phase);
-  FlowGraphPrinter printer(*flow_graph);
-  printer.PrintBlocks();
-  THR_Print("*** END CFG\n");
+  if (FLAG_print_flow_graph_as_json) {
+    IlTestPrinter::PrintGraph(phase, flow_graph);
+  } else {
+    THR_Print("*** BEGIN CFG\n%s\n", phase);
+    FlowGraphPrinter printer(*flow_graph);
+    printer.PrintBlocks();
+    THR_Print("*** END CFG\n");
+  }
   fflush(stdout);
 }
 
@@ -475,7 +656,7 @@
 }
 
 void ClosureCallInstr::PrintOperandsTo(BaseTextBuffer* f) const {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     f->AddString(" closure=");
   } else {
     f->AddString(" function=");
@@ -1286,7 +1467,9 @@
   UNREACHABLE();
 }
 
-bool FlowGraphPrinter::ShouldPrint(const Function& function) {
+bool FlowGraphPrinter::ShouldPrint(
+    const Function& function,
+    uint8_t** compiler_pass_filter /* = nullptr */) {
   return false;
 }
 
diff --git a/runtime/vm/compiler/backend/il_printer.h b/runtime/vm/compiler/backend/il_printer.h
index 96268c8..3784083 100644
--- a/runtime/vm/compiler/backend/il_printer.h
+++ b/runtime/vm/compiler/backend/il_printer.h
@@ -56,7 +56,8 @@
   static void PrintCidRangeData(const CallTargets& ic_data,
                                 intptr_t num_checks_to_print = kPrintAll);
 
-  static bool ShouldPrint(const Function& function);
+  static bool ShouldPrint(const Function& function,
+                          uint8_t** compiler_pass_filter = nullptr);
 
  private:
   const Function& function_;
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 2ad4305..378537a 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1037,7 +1037,7 @@
   Location right = locs()->in(1);
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
-    const int64_t imm = static_cast<int64_t>(right.constant().ptr());
+    const int64_t imm = Smi::RawValue(Smi::Cast(right.constant()).Value());
     __ TestImmediate(left_reg, compiler::Immediate(imm),
                      compiler::kObjectBytes);
   } else {
@@ -1154,8 +1154,9 @@
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
 
-  // Pass a pointer to the first argument in RAX.
-  __ leaq(RAX, compiler::Address(RSP, ArgumentCount() * kWordSize));
+  // Pass a pointer to the first argument in R13 (we avoid using RAX here to
+  // simplify the stub code that will call native code).
+  __ leaq(R13, compiler::Address(RSP, ArgumentCount() * kWordSize));
 
   __ LoadImmediate(R10, compiler::Immediate(argc_tag));
   const Code* stub;
@@ -1240,7 +1241,24 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ movq(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            FPREG);
+    __ movq(compiler::Assembler::VMTagAddress(), target_address);
+#endif
+
     __ CallCFunction(target_address, /*restore_rsp=*/true);
+
+#if !defined(PRODUCT)
+    __ movq(compiler::Assembler::VMTagAddress(),
+            compiler::Immediate(compiler::target::Thread::vm_tag_dart_id()));
+    __ movq(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            compiler::Immediate(0));
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use. RIP points to the
@@ -1292,7 +1310,7 @@
     __ LeaveDartFrame(compiler::kRestoreCallerPP);
     // Restore the global object pool after returning from runtime (old space is
     // moving, so the GOP could have been relocated).
-    if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
     }
     __ set_constant_pool_allowed(true);
@@ -1401,7 +1419,7 @@
                             kPcMarkerSlotFromFp * compiler::target::kWordSize),
           CODE_REG);
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ movq(PP,
             compiler::Address(
                 THR, compiler::target::Thread::global_object_pool_offset()));
@@ -2288,7 +2306,7 @@
         offset_reg,
         compiler::FieldAddress(
             field_reg, Field::guarded_list_length_in_object_offset_offset()));
-    __ LoadCompressed(
+    __ LoadCompressedSmi(
         length_reg,
         compiler::FieldAddress(field_reg, Field::guarded_list_length_offset()));
 
@@ -3487,7 +3505,8 @@
 
 static bool CanBeImmediate(const Object& constant) {
   return constant.IsSmi() &&
-         compiler::Immediate(static_cast<int64_t>(constant.ptr())).is_int32();
+         compiler::Immediate(Smi::RawValue(Smi::Cast(constant).Value()))
+             .is_int32();
 }
 
 static bool IsSmiValue(const Object& constant, intptr_t value) {
@@ -3620,7 +3639,7 @@
   if (locs()->in(1).IsConstant()) {
     const Object& constant = locs()->in(1).constant();
     ASSERT(constant.IsSmi());
-    const int64_t imm = static_cast<int64_t>(constant.ptr());
+    const int64_t imm = Smi::RawValue(Smi::Cast(constant).Value());
     switch (op_kind()) {
       case Token::kADD: {
         __ AddImmediate(left, compiler::Immediate(imm), compiler::kObjectBytes);
@@ -4395,7 +4414,7 @@
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
   // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
-  // FLAG_use_bare_instructions mode and only after VM isolate stubs where
+  // precompiled mode and only after VM isolate stubs where
   // replaced with isolate-specific stubs.
   auto object_store = IsolateGroup::Current()->object_store();
   const bool stubs_in_vm_isolate =
@@ -4406,7 +4425,6 @@
           ->untag()
           ->InVMIsolateHeap();
   const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
-                                     FLAG_use_bare_instructions &&
                                      !stubs_in_vm_isolate;
   LocationSummary* summary = new (zone) LocationSummary(
       zone, kNumInputs, kNumTemps,
@@ -5223,11 +5241,12 @@
   compiler->AddSlowPathCode(slow_path);
 
   if (recognized_kind() != MethodRecognizer::kDoubleToInteger) {
-    // In JIT mode VM knows target CPU features at compile time
-    // and can pick more optimal representation for DoubleToDouble
-    // conversion. In AOT mode we test if roundsd instruction is
-    // available at run time and fall back to stub if it isn't.
-    ASSERT(CompilerState::Current().is_aot());
+    // In JIT mode without --target-unknown-cpu VM knows target CPU features
+    // at compile time and can pick more optimal representation
+    // for DoubleToDouble conversion. In AOT mode and with
+    // --target-unknown-cpu we test if roundsd instruction is available
+    // at run time and fall back to stub if it isn't.
+    ASSERT(CompilerState::Current().is_aot() || FLAG_target_unknown_cpu);
     if (FLAG_use_slow_path) {
       __ jmp(slow_path->entry_label());
       __ Bind(slow_path->exit_label());
@@ -5823,8 +5842,7 @@
 }
 
 void CheckNullInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ThrowErrorSlowPathCode* slow_path =
-      new NullErrorSlowPath(this, compiler->CurrentTryIndex());
+  ThrowErrorSlowPathCode* slow_path = new NullErrorSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
   Register value_reg = locs()->in(0).reg();
@@ -5944,11 +5962,9 @@
  public:
   Int64DivideSlowPath(BinaryInt64OpInstr* instruction,
                       Register divisor,
-                      Range* divisor_range,
-                      intptr_t try_index)
+                      Range* divisor_range)
       : ThrowErrorSlowPathCode(instruction,
-                               kIntegerDivisionByZeroExceptionRuntimeEntry,
-                               try_index),
+                               kIntegerDivisionByZeroExceptionRuntimeEntry),
         is_mod_(instruction->op_kind() == Token::kMOD),
         divisor_(divisor),
         divisor_range_(divisor_range),
@@ -6105,8 +6121,8 @@
 
   // Prepare a slow path.
   Range* right_range = instruction->right()->definition()->range();
-  Int64DivideSlowPath* slow_path = new (Z) Int64DivideSlowPath(
-      instruction, right, right_range, compiler->CurrentTryIndex());
+  Int64DivideSlowPath* slow_path =
+      new (Z) Int64DivideSlowPath(instruction, right, right_range);
 
   // Handle modulo/division by zero exception on slow path.
   if (slow_path->has_divide_by_zero()) {
@@ -6372,10 +6388,9 @@
 
 class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+  explicit ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "int64 shift"; }
 
@@ -6442,8 +6457,7 @@
     // Jump to a slow path if shift count is > 63 or negative.
     ShiftInt64OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange()) {
-      slow_path =
-          new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftInt64OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ cmpq(RCX, compiler::Immediate(kShiftCountLimit));
@@ -6500,10 +6514,9 @@
 
 class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
  public:
-  ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+  explicit ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction)
       : ThrowErrorSlowPathCode(instruction,
-                               kArgumentErrorUnboxedInt64RuntimeEntry,
-                               try_index) {}
+                               kArgumentErrorUnboxedInt64RuntimeEntry) {}
 
   const char* name() override { return "uint32 shift"; }
 
@@ -6559,8 +6572,7 @@
     // Jump to a slow path if shift count is > 31 or negative.
     ShiftUint32OpSlowPath* slow_path = NULL;
     if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
-      slow_path =
-          new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+      slow_path = new (Z) ShiftUint32OpSlowPath(this);
       compiler->AddSlowPathCode(slow_path);
 
       __ cmpq(RCX, compiler::Immediate(kUint32ShiftCountLimit));
@@ -6924,7 +6936,7 @@
   __ LoadObject(R10, arguments_descriptor);
 
   ASSERT(locs()->in(0).reg() == RAX);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     // RAX: Closure with cached entry point.
     __ movq(RCX, compiler::FieldAddress(
                      RAX, compiler::target::Closure::entry_point_offset()));
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index 2523166..38de868 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -629,18 +629,128 @@
   const Function& caller_function_;
 };
 
+static bool IsAThisCallThroughAnUncheckedEntryPoint(Definition* call) {
+  if (auto instance_call = call->AsInstanceCallBase()) {
+    return (instance_call->entry_kind() == Code::EntryKind::kUnchecked) &&
+           instance_call->is_call_on_this();
+  }
+  return false;
+}
+
+// Helper which returns true if callee potentially has a more specific
+// parameter type and thus a redefinition needs to be inserted.
+static bool CalleeParameterTypeMightBeMoreSpecific(
+    BitVector* is_generic_covariant_impl,
+    const FunctionType& interface_target_signature,
+    const FunctionType& callee_signature,
+    intptr_t first_arg_index,
+    intptr_t arg_index) {
+  if (arg_index > first_arg_index && is_generic_covariant_impl != nullptr &&
+      is_generic_covariant_impl->Contains(arg_index - first_arg_index)) {
+    const intptr_t param_index = arg_index - first_arg_index;
+    const intptr_t num_named_params =
+        callee_signature.NumOptionalNamedParameters();
+    const intptr_t num_params = callee_signature.NumParameters();
+    if (num_named_params == 0 &&
+        param_index >= interface_target_signature.NumParameters()) {
+      // An optional positional parameter which was added in the callee but
+      // not present in the interface target.
+      return false;
+    }
+
+    // Check if this argument corresponds to a named parameter. In this case
+    // we need to find correct index based on the name.
+    intptr_t interface_target_param_index = param_index;
+    if (num_named_params > 0 &&
+        (num_params - num_named_params) <= param_index) {
+      // This is a named parameter.
+      const String& name =
+          String::Handle(callee_signature.ParameterNameAt(param_index));
+      interface_target_param_index = -1;
+      for (intptr_t i = interface_target_signature.NumParameters() -
+                        interface_target_signature.NumOptionalNamedParameters(),
+                    n = interface_target_signature.NumParameters();
+           i < n; i++) {
+        if (interface_target_signature.ParameterNameAt(i) == name.ptr()) {
+          interface_target_param_index = i;
+          break;
+        }
+      }
+
+      // This is a named parameter which was added in the callee.
+      if (interface_target_param_index == -1) {
+        return false;
+      }
+    }
+    const AbstractType& callee_parameter_type =
+        AbstractType::Handle(callee_signature.ParameterTypeAt(param_index));
+    const AbstractType& interface_target_parameter_type =
+        AbstractType::Handle(interface_target_signature.ParameterTypeAt(
+            interface_target_param_index));
+    if (interface_target_parameter_type.ptr() != callee_parameter_type.ptr()) {
+      // This a conservative approximation.
+      return true;
+    }
+  }
+  return false;
+}
+
 static void ReplaceParameterStubs(Zone* zone,
                                   FlowGraph* caller_graph,
                                   InlinedCallData* call_data,
                                   const TargetInfo* target_info) {
   const bool is_polymorphic = call_data->call->IsPolymorphicInstanceCall();
+  const bool no_checks =
+      IsAThisCallThroughAnUncheckedEntryPoint(call_data->call);
   ASSERT(is_polymorphic == (target_info != NULL));
   FlowGraph* callee_graph = call_data->callee_graph;
   auto callee_entry = callee_graph->graph_entry()->normal_entry();
+  const Function& callee = callee_graph->function();
+
+  FunctionType& interface_target_signature = FunctionType::Handle();
+  FunctionType& callee_signature = FunctionType::Handle(callee.signature());
+
+  // If we are inlining a call on this and we are going to skip parameter checks
+  // then a situation can arise when parameter type in the callee has a narrower
+  // type than what interface target specifies, e.g.
+  //
+  //    class A<T> {
+  //      void f(T v);
+  //      void g(T v) { f(v); }
+  //    }
+  //    class B extends A<X> { void f(X v) { ... } }
+  //
+  // Conside when B.f is inlined into a callsite in A.g (e.g. due to polymorphic
+  // inlining). v is known to be X within the body of B.f, but not guaranteed to
+  // be X outside of it. Thus we must ensure that all operations with v that
+  // depend on its type being X are pinned to stay within the inlined body.
+  //
+  // We achieve that by inserting redefinitions for parameters which potentially
+  // have narrower types in callee compared to those in the interface target of
+  // the call.
+  BitVector* is_generic_covariant_impl = nullptr;
+  if (no_checks && callee.IsRegularFunction()) {
+    const Function& interface_target =
+        call_data->call->AsInstanceCallBase()->interface_target();
+
+    callee_signature = callee.signature();
+    interface_target_signature = interface_target.signature();
+
+    // If signatures match then there is nothing to do.
+    if (interface_target.signature() != callee.signature()) {
+      const intptr_t num_params = callee.NumParameters();
+      BitVector is_covariant(zone, num_params);
+      is_generic_covariant_impl = new (zone) BitVector(zone, num_params);
+
+      kernel::ReadParameterCovariance(callee_graph->function(), &is_covariant,
+                                      is_generic_covariant_impl);
+    }
+  }
 
   // Replace each stub with the actual argument or the caller's constant.
   // Nulls denote optional parameters for which no actual was given.
   const intptr_t first_arg_index = call_data->first_arg_index;
+
   // When first_arg_index > 0, the stub and actual argument processed in the
   // first loop iteration represent a passed-in type argument vector.
   GrowableArray<Value*>* arguments = call_data->arguments;
@@ -654,17 +764,29 @@
   }
   for (intptr_t i = 0; i < arguments->length(); ++i) {
     Value* actual = (*arguments)[i];
-    Definition* defn = NULL;
-    if (is_polymorphic && (i == first_arg_index)) {
-      // Replace the receiver argument with a redefinition to prevent code from
-      // the inlined body from being hoisted above the inlined entry.
+    Definition* defn = nullptr;
+
+    // Replace the receiver argument with a redefinition to prevent code from
+    // the inlined body from being hoisted above the inlined entry.
+    const bool is_polymorphic_receiver =
+        (is_polymorphic && (i == first_arg_index));
+
+    if (actual == nullptr) {
+      ASSERT(!is_polymorphic_receiver);
+      continue;
+    }
+
+    if (is_polymorphic_receiver ||
+        CalleeParameterTypeMightBeMoreSpecific(
+            is_generic_covariant_impl, interface_target_signature,
+            callee_signature, first_arg_index, i)) {
       RedefinitionInstr* redefinition =
           new (zone) RedefinitionInstr(actual->Copy(zone));
       redefinition->set_ssa_temp_index(caller_graph->alloc_ssa_temp_index());
       if (FlowGraph::NeedsPairLocation(redefinition->representation())) {
         caller_graph->alloc_ssa_temp_index();
       }
-      if (target_info->IsSingleCid()) {
+      if (is_polymorphic_receiver && target_info->IsSingleCid()) {
         redefinition->UpdateType(CompileType::FromCid(target_info->cid_start));
       }
       redefinition->InsertAfter(callee_entry);
@@ -674,13 +796,12 @@
       callee_entry->ReplaceInEnvironment(
           call_data->parameter_stubs->At(first_arg_stub_index + i),
           actual->definition());
-    } else if (actual != NULL) {
+    } else {
       defn = actual->definition();
     }
-    if (defn != NULL) {
-      call_data->parameter_stubs->At(first_arg_stub_index + i)
-          ->ReplaceUsesWith(defn);
-    }
+
+    call_data->parameter_stubs->At(first_arg_stub_index + i)
+        ->ReplaceUsesWith(defn);
   }
 
   // Replace remaining constants with uses by constants in the caller's
@@ -688,7 +809,7 @@
   auto defns = callee_graph->graph_entry()->initial_definitions();
   for (intptr_t i = 0; i < defns->length(); ++i) {
     ConstantInstr* constant = (*defns)[i]->AsConstant();
-    if (constant != NULL && constant->HasUses()) {
+    if (constant != nullptr && constant->HasUses()) {
       constant->ReplaceUsesWith(caller_graph->GetConstant(constant->value()));
     }
   }
@@ -696,12 +817,12 @@
   defns = callee_graph->graph_entry()->normal_entry()->initial_definitions();
   for (intptr_t i = 0; i < defns->length(); ++i) {
     ConstantInstr* constant = (*defns)[i]->AsConstant();
-    if (constant != NULL && constant->HasUses()) {
+    if (constant != nullptr && constant->HasUses()) {
       constant->ReplaceUsesWith(caller_graph->GetConstant(constant->value()));
     }
 
     SpecialParameterInstr* param = (*defns)[i]->AsSpecialParameter();
-    if (param != NULL && param->HasUses()) {
+    if (param != nullptr && param->HasUses()) {
       switch (param->kind()) {
         case SpecialParameterInstr::kContext: {
           ASSERT(!is_polymorphic);
@@ -1422,9 +1543,8 @@
     // Plug result in the caller graph.
     InlineExitCollector* exit_collector = call_data->exit_collector;
     exit_collector->PrepareGraphs(callee_graph);
-    exit_collector->ReplaceCall(callee_function_entry);
-
     ReplaceParameterStubs(zone(), caller_graph_, call_data, NULL);
+    exit_collector->ReplaceCall(callee_function_entry);
 
     ASSERT(!call_data->call->HasPushArguments());
   }
diff --git a/runtime/vm/compiler/backend/inliner_test.cc b/runtime/vm/compiler/backend/inliner_test.cc
index f5c59aa..4760a70 100644
--- a/runtime/vm/compiler/backend/inliner_test.cc
+++ b/runtime/vm/compiler/backend/inliner_test.cc
@@ -188,7 +188,8 @@
       {kMatchAndMoveStoreIndexed, &store_instr},
   }));
 
-  RELEASE_ASSERT(unbox_instr->InputAt(0)->definition() == value_param);
+  RELEASE_ASSERT(unbox_instr->InputAt(0)->definition()->OriginalDefinition() ==
+                 value_param);
   RELEASE_ASSERT(store_instr->InputAt(0)->definition() == list_param);
   RELEASE_ASSERT(store_instr->InputAt(2)->definition() == unbox_instr);
   RELEASE_ASSERT(unbox_instr->is_truncating());
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index d923216..c6767a5 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -3053,7 +3053,7 @@
   // frameless functions. Outside of bare instructions mode we need to preserve
   // caller PP - so all functions need a frame if they have their own pool which
   // is hard to determine at this stage.
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     return;
   }
 
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index dd01b09..56c5604 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -597,15 +597,9 @@
       Add(Location::RegisterLocation(reg));
     }
 
-#if defined(TARGET_ARCH_ARM)
-    if (TargetCPUFeatures::vfp_supported()) {
-#endif
       for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
         Add(Location::FpuRegisterLocation(static_cast<FpuRegister>(i)));
       }
-#if defined(TARGET_ARCH_ARM)
-    }
-#endif
   }
 
   void AddAllArgumentRegisters() {
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 74a7257..7d02f87 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -3091,7 +3091,22 @@
   }
 }
 
+void AssertAssignableInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+  const Range* value_range = value()->definition()->range();
+  if (!Range::IsUnknown(value_range)) {
+    *range = *value_range;
+  } else {
+    *range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
+  }
+}
+
 static bool IsRedundantBasedOnRangeInformation(Value* index, Value* length) {
+  if (index->BindsToSmiConstant() && length->BindsToSmiConstant()) {
+    const auto index_val = index->BoundSmiConstant();
+    const auto length_val = length->BoundSmiConstant();
+    return (0 <= index_val && index_val < length_val);
+  }
+
   // Range of the index is unknown can't decide if the check is redundant.
   Range* index_range = index->definition()->range();
   if (index_range == nullptr) {
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index 6f13e1f..e356875 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -29,10 +29,15 @@
 // Quick access to the current zone.
 #define Z (zone())
 
-class CSEInstructionMap : public ValueObject {
+// A set of Instructions used by CSE pass.
+//
+// Instructions are compared as if all redefinitions were removed from the
+// graph, with the exception of LoadField instruction which gets special
+// treatment.
+class CSEInstructionSet : public ValueObject {
  public:
-  CSEInstructionMap() : map_() {}
-  explicit CSEInstructionMap(const CSEInstructionMap& other)
+  CSEInstructionSet() : map_() {}
+  explicit CSEInstructionSet(const CSEInstructionSet& other)
       : ValueObject(), map_(other.map_) {}
 
   Instruction* Lookup(Instruction* other) const {
@@ -46,7 +51,59 @@
   }
 
  private:
-  PointerSet<Instruction> map_;
+  static Definition* OriginalDefinition(Value* value) {
+    return value->definition()->OriginalDefinition();
+  }
+
+  static bool EqualsIgnoringRedefinitions(const Instruction& a,
+                                          const Instruction& b) {
+    const auto tag = a.tag();
+    if (tag != b.tag()) return false;
+    const auto input_count = a.InputCount();
+    if (input_count != b.InputCount()) return false;
+
+    // We would like to avoid replacing a load from a redefinition with a
+    // load from an original definition because that breaks the dependency
+    // on the redefinition and enables potentially incorrect code motion.
+    if (tag != Instruction::kLoadField) {
+      for (intptr_t i = 0; i < input_count; ++i) {
+        if (OriginalDefinition(a.InputAt(i)) !=
+            OriginalDefinition(b.InputAt(i))) {
+          return false;
+        }
+      }
+    } else {
+      for (intptr_t i = 0; i < input_count; ++i) {
+        if (!a.InputAt(i)->Equals(*b.InputAt(i))) return false;
+      }
+    }
+    return a.AttributesEqual(b);
+  }
+
+  class Trait {
+   public:
+    typedef Instruction* Value;
+    typedef Instruction* Key;
+    typedef Instruction* Pair;
+
+    static Key KeyOf(Pair kv) { return kv; }
+    static Value ValueOf(Pair kv) { return kv; }
+
+    static inline uword Hash(Key key) {
+      uword result = key->tag();
+      for (intptr_t i = 0; i < key->InputCount(); ++i) {
+        result = CombineHashes(
+            result, OriginalDefinition(key->InputAt(i))->ssa_temp_index());
+      }
+      return FinalizeHash(result, kBitsPerInt32 - 1);
+    }
+
+    static inline bool IsKeyEqual(Pair kv, Key key) {
+      return EqualsIgnoringRedefinitions(*kv, *key);
+    }
+  };
+
+  DirectChainedHashMap<Trait> map_;
 };
 
 // Place describes an abstract location (e.g. field) that IR can load
@@ -432,8 +489,6 @@
     switch (kind()) {
       case kInstanceField:
         return instance_field().is_immutable();
-      case kStaticField:
-        return static_field().is_final() && !FLAG_fields_may_be_reset;
       default:
         return false;
     }
@@ -1542,7 +1597,7 @@
         // we should not move them around unless the field is initialized.
         // Otherwise we might move load past the initialization.
         if (LoadStaticFieldInstr* load = current->AsLoadStaticField()) {
-          if (load->AllowsCSE() && !load->IsFieldInitialized()) {
+          if (load->AllowsCSE()) {
             seen_visible_effect = true;
             continue;
           }
@@ -1923,6 +1978,72 @@
             (array_store->class_id() == kTypedDataFloat32x4ArrayCid));
   }
 
+  static bool AlreadyPinnedByRedefinition(Definition* replacement,
+                                          Definition* redefinition) {
+    Definition* defn = replacement;
+    if (auto load_field = replacement->AsLoadField()) {
+      defn = load_field->instance()->definition();
+    } else if (auto load_indexed = replacement->AsLoadIndexed()) {
+      defn = load_indexed->array()->definition();
+    }
+
+    Value* unwrapped;
+    while ((unwrapped = defn->RedefinedValue()) != nullptr) {
+      if (defn == redefinition) {
+        return true;
+      }
+      defn = unwrapped->definition();
+    }
+
+    return false;
+  }
+
+  Definition* ReplaceLoad(Definition* load, Definition* replacement) {
+    // When replacing a load from a generic field or from an array element
+    // check if instance we are loading from is redefined. If it is then
+    // we need to ensure that replacement is not going to break the
+    // dependency chain.
+    Definition* redef = nullptr;
+    if (auto load_field = load->AsLoadField()) {
+      auto instance = load_field->instance()->definition();
+      if (instance->RedefinedValue() != nullptr) {
+        if ((load_field->slot().kind() ==
+                 Slot::Kind::kGrowableObjectArray_data ||
+             (load_field->slot().IsDartField() &&
+              !AbstractType::Handle(load_field->slot().field().type())
+                   .IsInstantiated()))) {
+          redef = instance;
+        }
+      }
+    } else if (auto load_indexed = load->AsLoadIndexed()) {
+      if (load_indexed->class_id() == kArrayCid ||
+          load_indexed->class_id() == kImmutableArrayCid) {
+        auto instance = load_indexed->array()->definition();
+        if (instance->RedefinedValue() != nullptr) {
+          redef = instance;
+        }
+      }
+    }
+    if (redef != nullptr && !AlreadyPinnedByRedefinition(replacement, redef)) {
+      // Original load had a redefined instance and replacement does not
+      // depend on the same redefinition. Create a redefinition
+      // of the replacement to keep the dependency chain.
+      auto replacement_redefinition =
+          new (zone()) RedefinitionInstr(new (zone()) Value(replacement));
+      if (redef->IsDominatedBy(replacement)) {
+        graph_->InsertAfter(redef, replacement_redefinition, /*env=*/nullptr,
+                            FlowGraph::kValue);
+      } else {
+        graph_->InsertBefore(load, replacement_redefinition, /*env=*/nullptr,
+                             FlowGraph::kValue);
+      }
+      replacement = replacement_redefinition;
+    }
+
+    load->ReplaceUsesWith(replacement);
+    return replacement;
+  }
+
   // Compute sets of loads generated and killed by each block.
   // Additionally compute upwards exposed and generated loads for each block.
   // Exposed loads are those that can be replaced if a corresponding
@@ -2144,7 +2265,7 @@
                       defn->ssa_temp_index(), replacement->ssa_temp_index());
           }
 
-          defn->ReplaceUsesWith(replacement);
+          ReplaceLoad(defn, replacement);
           instr_it.RemoveCurrentFromGraph();
           forwarded_ = true;
           continue;
@@ -2517,7 +2638,7 @@
                       load->ssa_temp_index(), replacement->ssa_temp_index());
           }
 
-          load->ReplaceUsesWith(replacement);
+          replacement = ReplaceLoad(load, replacement);
           load->RemoveFromGraph();
           load->SetReplacement(replacement);
           forwarded_ = true;
@@ -2806,13 +2927,14 @@
   DISALLOW_COPY_AND_ASSIGN(LoadOptimizer);
 };
 
-bool DominatorBasedCSE::Optimize(FlowGraph* graph) {
+bool DominatorBasedCSE::Optimize(FlowGraph* graph,
+                                 bool run_load_optimization /* = true */) {
   bool changed = false;
-  if (FLAG_load_cse) {
+  if (FLAG_load_cse && run_load_optimization) {
     changed = LoadOptimizer::OptimizeGraph(graph) || changed;
   }
 
-  CSEInstructionMap map;
+  CSEInstructionSet map;
   changed = OptimizeRecursive(graph, graph->graph_entry(), &map) || changed;
 
   return changed;
@@ -2820,7 +2942,7 @@
 
 bool DominatorBasedCSE::OptimizeRecursive(FlowGraph* graph,
                                           BlockEntryInstr* block,
-                                          CSEInstructionMap* map) {
+                                          CSEInstructionSet* map) {
   bool changed = false;
   for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
     Instruction* current = it.Current();
@@ -2848,7 +2970,7 @@
     BlockEntryInstr* child = block->dominated_blocks()[i];
     if (i < num_children - 1) {
       // Copy map.
-      CSEInstructionMap child_map(*map);
+      CSEInstructionSet child_map(*map);
       changed = OptimizeRecursive(graph, child, &child_map) || changed;
     } else {
       // Reuse map for the last child.
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.h b/runtime/vm/compiler/backend/redundancy_elimination.h
index 877223b..6042147 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.h
+++ b/runtime/vm/compiler/backend/redundancy_elimination.h
@@ -14,7 +14,7 @@
 
 namespace dart {
 
-class CSEInstructionMap;
+class CSEInstructionSet;
 
 class AllocationSinking : public ZoneAllocated {
  public:
@@ -88,12 +88,12 @@
  public:
   // Return true, if the optimization changed the flow graph.
   // False, if nothing changed.
-  static bool Optimize(FlowGraph* graph);
+  static bool Optimize(FlowGraph* graph, bool run_load_optimization = true);
 
  private:
   static bool OptimizeRecursive(FlowGraph* graph,
                                 BlockEntryInstr* entry,
-                                CSEInstructionMap* map);
+                                CSEInstructionSet* map);
 };
 
 class DeadStoreElimination : public AllStatic {
diff --git a/runtime/vm/compiler/backend/redundancy_elimination_test.cc b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
index 4e0a257..1dd76e6 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination_test.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination_test.cc
@@ -930,10 +930,6 @@
     }
   )";
 
-  // Make sure static field initialization is not removed because
-  // field is already initialized.
-  SetFlagScope<bool> sfs(&FLAG_fields_may_be_reset, true);
-
   const auto& root_library = Library::Handle(LoadTestScript(kScript));
   Invoke(root_library, "main");
   const auto& function = Function::Handle(GetFunction(root_library, "foo"));
@@ -979,10 +975,6 @@
     }
   )";
 
-  // Make sure static field initialization is not removed because
-  // field is already initialized.
-  SetFlagScope<bool> sfs(&FLAG_fields_may_be_reset, true);
-
   const auto& root_library = Library::Handle(LoadTestScript(kScript));
   Invoke(root_library, "main");
   const auto& function = Function::Handle(GetFunction(root_library, "foo"));
@@ -1360,6 +1352,116 @@
   }
 }
 
+// This test checks that CSE unwraps redefinitions when comparing all
+// instructions except loads, which are handled specially.
+ISOLATE_UNIT_TEST_CASE(CSE_Redefinitions) {
+  const char* script_chars = R"(
+    @pragma("vm:external-name", "BlackholeNative")
+    external dynamic blackhole([a, b, c, d, e, f]);
+    class K<T> {
+      final T field;
+      K(this.field);
+    }
+  )";
+  const Library& lib =
+      Library::Handle(LoadTestScript(script_chars, NoopNativeLookup));
+
+  const Class& cls = Class::ZoneHandle(
+      lib.LookupLocalClass(String::Handle(Symbols::New(thread, "K"))));
+  const Error& err = Error::Handle(cls.EnsureIsFinalized(thread));
+  EXPECT(err.IsNull());
+
+  const Field& original_field = Field::Handle(
+      cls.LookupField(String::Handle(Symbols::New(thread, "field"))));
+  EXPECT(!original_field.IsNull());
+  const Field& field = Field::Handle(original_field.CloneFromOriginal());
+
+  const Function& blackhole =
+      Function::ZoneHandle(GetFunction(lib, "blackhole"));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread, /*is_aot=*/false, /*is_optimizing=*/true);
+  FlowGraphBuilderHelper H;
+
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+
+  BoxInstr* box0;
+  BoxInstr* box1;
+  LoadFieldInstr* load0;
+  LoadFieldInstr* load1;
+  LoadFieldInstr* load2;
+  StaticCallInstr* call;
+  ReturnInstr* ret;
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    auto& slot = Slot::Get(field, &H.flow_graph()->parsed_function());
+    auto param0 =
+        builder.AddParameter(0, 0, /*with_frame=*/true, kUnboxedDouble);
+    auto param1 = builder.AddParameter(1, 2, /*with_frame=*/true, kTagged);
+    auto redef0 =
+        builder.AddDefinition(new RedefinitionInstr(new Value(param0)));
+    auto redef1 =
+        builder.AddDefinition(new RedefinitionInstr(new Value(param0)));
+    box0 = builder.AddDefinition(
+        BoxInstr::Create(kUnboxedDouble, new Value(redef0)));
+    box1 = builder.AddDefinition(
+        BoxInstr::Create(kUnboxedDouble, new Value(redef1)));
+
+    auto redef2 =
+        builder.AddDefinition(new RedefinitionInstr(new Value(param1)));
+    auto redef3 =
+        builder.AddDefinition(new RedefinitionInstr(new Value(param1)));
+    load0 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(redef2), slot, InstructionSource()));
+    load1 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(redef3), slot, InstructionSource()));
+    load2 = builder.AddDefinition(
+        new LoadFieldInstr(new Value(redef3), slot, InstructionSource()));
+
+    auto args = new InputsArray(3);
+    args->Add(new Value(load0));
+    args->Add(new Value(load1));
+    args->Add(new Value(load2));
+    call = builder.AddInstruction(new StaticCallInstr(
+        InstructionSource(), blackhole, 0, Array::empty_array(), args,
+        S.GetNextDeoptId(), 0, ICData::RebindRule::kStatic));
+
+    ret = builder.AddReturn(new Value(box1));
+  }
+  H.FinishGraph();
+
+  // Running CSE without load optimization should eliminate redundant boxing
+  // but keep loads intact if they don't  have exactly matching inputs.
+  DominatorBasedCSE::Optimize(H.flow_graph(), /*run_load_optimization=*/false);
+
+  EXPECT_PROPERTY(box1, it.WasEliminated());
+  EXPECT_PROPERTY(ret, it.value()->definition() == box0);
+
+  EXPECT_PROPERTY(load0, !it.WasEliminated());
+  EXPECT_PROPERTY(load1, !it.WasEliminated());
+  EXPECT_PROPERTY(load2, it.WasEliminated());
+
+  EXPECT_PROPERTY(call, it.ArgumentAt(0) == load0);
+  EXPECT_PROPERTY(call, it.ArgumentAt(1) == load1);
+  EXPECT_PROPERTY(call, it.ArgumentAt(2) == load1);
+
+  // Running load optimization pass should remove the second load but
+  // insert a redefinition to prevent code motion because the field
+  // has a generic type.
+  DominatorBasedCSE::Optimize(H.flow_graph(), /*run_load_optimization=*/true);
+
+  EXPECT_PROPERTY(load0, !it.WasEliminated());
+  EXPECT_PROPERTY(load1, it.WasEliminated());
+  EXPECT_PROPERTY(load2, it.WasEliminated());
+
+  EXPECT_PROPERTY(call, it.ArgumentAt(0) == load0);
+  EXPECT_PROPERTY(call, it.ArgumentAt(1)->IsRedefinition() &&
+                            it.ArgumentAt(1)->OriginalDefinition() == load0);
+  EXPECT_PROPERTY(call, it.ArgumentAt(2)->IsRedefinition() &&
+                            it.ArgumentAt(2)->OriginalDefinition() == load0);
+}
+
 #endif  // !defined(TARGET_ARCH_IA32)
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index b4b9920..75afb9a 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -331,6 +331,58 @@
   return SlotCache::Instance(thread).Canonicalize(slot);
 }
 
+FieldGuardState::FieldGuardState(const Field& field)
+    : state_(GuardedCidBits::encode(field.guarded_cid()) |
+             IsNonNullableIntegerBit::encode(field.is_non_nullable_integer()) |
+             IsUnboxingCandidateBit::encode(field.is_unboxing_candidate()) |
+             IsNullableBit::encode(field.is_nullable())) {}
+
+bool FieldGuardState::IsUnboxed() const {
+  ASSERT(!is_non_nullable_integer() || FLAG_precompiled_mode);
+  const bool valid_class = ((FlowGraphCompiler::SupportsUnboxedDoubles() &&
+                             (guarded_cid() == kDoubleCid)) ||
+                            (FlowGraphCompiler::SupportsUnboxedSimd128() &&
+                             (guarded_cid() == kFloat32x4Cid)) ||
+                            (FlowGraphCompiler::SupportsUnboxedSimd128() &&
+                             (guarded_cid() == kFloat64x2Cid)) ||
+                            is_non_nullable_integer());
+  return is_unboxing_candidate() && !is_nullable() && valid_class;
+}
+
+bool FieldGuardState::IsPotentialUnboxed() const {
+  if (FLAG_precompiled_mode) {
+    // kernel_loader.cc:ReadInferredType sets the guarded cid for fields based
+    // on inferred types from TFA (if available). The guarded cid is therefore
+    // proven to be correct.
+    return IsUnboxed();
+  }
+
+  return is_unboxing_candidate() &&
+         (IsUnboxed() || (guarded_cid() == kIllegalCid));
+}
+
+bool Slot::IsUnboxed() const {
+  return field_guard_state().IsUnboxed();
+}
+
+bool Slot::IsPotentialUnboxed() const {
+  return field_guard_state().IsPotentialUnboxed();
+}
+
+Representation Slot::UnboxedRepresentation() const {
+  switch (field_guard_state().guarded_cid()) {
+    case kDoubleCid:
+      return kUnboxedDouble;
+    case kFloat32x4Cid:
+      return kUnboxedFloat32x4;
+    case kFloat64x2Cid:
+      return kUnboxedFloat64x2;
+    default:
+      RELEASE_ASSERT(field_guard_state().is_non_nullable_integer());
+      return kUnboxedInt64;
+  }
+}
+
 const Slot& Slot::Get(const Field& field,
                       const ParsedFunction* parsed_function) {
   Thread* thread = Thread::Current();
@@ -354,16 +406,18 @@
     is_nullable = false;
   }
 
+  FieldGuardState field_guard_state(field);
+
   bool used_guarded_state = false;
-  if (field.guarded_cid() != kIllegalCid &&
-      field.guarded_cid() != kDynamicCid) {
+  if (field_guard_state.guarded_cid() != kIllegalCid &&
+      field_guard_state.guarded_cid() != kDynamicCid) {
     // Use guarded state if it is more precise then what we already have.
     if (nullable_cid == kDynamicCid) {
-      nullable_cid = field.guarded_cid();
+      nullable_cid = field_guard_state.guarded_cid();
       used_guarded_state = true;
     }
 
-    if (is_nullable && !field.is_nullable()) {
+    if (is_nullable && !field_guard_state.is_nullable()) {
       is_nullable = false;
       used_guarded_state = true;
     }
@@ -377,10 +431,10 @@
     used_guarded_state = false;
   }
 
-  if (field.is_non_nullable_integer()) {
+  if (field_guard_state.is_non_nullable_integer()) {
     ASSERT(FLAG_precompiled_mode);
     is_nullable = false;
-    if (FlowGraphCompiler::IsUnboxedField(field)) {
+    if (field_guard_state.IsUnboxed()) {
       rep = kUnboxedInt64;
     }
   }
@@ -397,7 +451,7 @@
           IsSentinelVisibleBit::encode(field.is_late() && field.is_final() &&
                                        !field.has_initializer()),
       nullable_cid, compiler::target::Field::OffsetOf(field), &field, &type,
-      rep));
+      rep, field_guard_state));
 
   // If properties of this slot were based on the guarded state make sure
   // to add the field to the list of guarded fields. Note that during background
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index a31e9a9..88c1dd8 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -166,6 +166,35 @@
   NONNULLABLE_BOXED_NATIVE_SLOTS_LIST(V)                                       \
   UNBOXED_NATIVE_SLOTS_LIST(V)
 
+class FieldGuardState {
+ public:
+  FieldGuardState() : state_(0) {}
+  explicit FieldGuardState(const Field& field);
+
+  intptr_t guarded_cid() const { return GuardedCidBits::decode(state_); }
+  bool is_non_nullable_integer() const {
+    return IsNonNullableIntegerBit::decode(state_);
+  }
+  bool is_unboxing_candidate() const {
+    return IsUnboxingCandidateBit::decode(state_);
+  }
+  bool is_nullable() const { return IsNullableBit::decode(state_); }
+
+  bool IsUnboxed() const;
+  bool IsPotentialUnboxed() const;
+
+ private:
+  using GuardedCidBits = BitField<int32_t, ClassIdTagType, 0, 16>;
+  using IsNonNullableIntegerBit =
+      BitField<int32_t, bool, GuardedCidBits::kNextBit, 1>;
+  using IsUnboxingCandidateBit =
+      BitField<int32_t, bool, IsNonNullableIntegerBit::kNextBit, 1>;
+  using IsNullableBit =
+      BitField<int32_t, bool, IsUnboxingCandidateBit::kNextBit, 1>;
+
+  const int32_t state_;
+};
+
 // Slot is an abstraction that describes an readable (and possibly writeable)
 // location within an object.
 //
@@ -298,6 +327,10 @@
     return kind() == Kind::kCapturedVariable || kind() == Kind::kContext_parent;
   }
 
+  bool IsUnboxed() const;
+  bool IsPotentialUnboxed() const;
+  Representation UnboxedRepresentation() const;
+
  private:
   friend class FlowGraphDeserializer;  // For GetNativeSlot.
 
@@ -307,12 +340,14 @@
        intptr_t offset_in_bytes,
        const void* data,
        const AbstractType* static_type,
-       Representation representation)
+       Representation representation,
+       const FieldGuardState& field_guard_state = FieldGuardState())
       : kind_(kind),
         flags_(bits),
         cid_(cid),
         offset_in_bytes_(offset_in_bytes),
         representation_(representation),
+        field_guard_state_(field_guard_state),
         data_(data),
         static_type_(static_type) {}
 
@@ -323,7 +358,8 @@
              other.offset_in_bytes_,
              other.data_,
              other.static_type_,
-             other.representation_) {}
+             other.representation_,
+             other.field_guard_state_) {}
 
   using IsImmutableBit = BitField<int8_t, bool, 0, 1>;
   using IsNullableBit = BitField<int8_t, bool, IsImmutableBit::kNextBit, 1>;
@@ -342,6 +378,10 @@
   static AcqRelAtomic<Slot*> native_fields_;
   static const Slot& GetNativeSlot(Kind kind);
 
+  const FieldGuardState& field_guard_state() const {
+    return field_guard_state_;
+  }
+
   const Kind kind_;
   const int8_t flags_;        // is_immutable, is_nullable
   const ClassIdTagType cid_;  // Concrete cid of a value or kDynamicCid.
@@ -349,6 +389,8 @@
   const intptr_t offset_in_bytes_;
   const Representation representation_;
 
+  const FieldGuardState field_guard_state_;
+
   // Kind dependent data:
   //   - name as a Dart String object for local variables;
   //   - name as a C string for native slots;
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 2faa89c..859fa3f 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -366,9 +366,14 @@
 }
 
 void FlowGraphTypePropagator::VisitAssertAssignable(
-    AssertAssignableInstr* instr) {
-  SetTypeOf(instr->value()->definition(),
-            new (zone()) CompileType(instr->ComputeType()));
+    AssertAssignableInstr* check) {
+  auto defn = check->value()->definition();
+  SetTypeOf(defn, new (zone()) CompileType(check->ComputeType()));
+  if (check->ssa_temp_index() == -1) {
+    flow_graph_->AllocateSSAIndexes(check);
+    GrowTypes(check->ssa_temp_index() + 1);
+  }
+  FlowGraph::RenameDominatedUses(defn, check, check);
 }
 
 void FlowGraphTypePropagator::VisitAssertBoolean(AssertBooleanInstr* instr) {
@@ -1020,6 +1025,7 @@
     // If either type is non-nullable, the resulting type is non-nullable.
     const bool is_nullable =
         value()->Type()->is_nullable() && constrained_type_->is_nullable();
+    // The resulting type can be the sentinel value only if both types can be.
     const bool can_be_sentinel = value()->Type()->can_be_sentinel() &&
                                  constrained_type_->can_be_sentinel();
 
@@ -1032,13 +1038,18 @@
       return CompileType(is_nullable, can_be_sentinel,
                          constrained_type_->ToNullableCid(), nullptr);
     }
-    if (value()->Type()->IsSubtypeOf(*constrained_type_->ToAbstractType())) {
-      return is_nullable ? *value()->Type()
-                         : value()->Type()->CopyNonNullable();
-    } else {
-      return is_nullable ? *constrained_type_
-                         : constrained_type_->CopyNonNullable();
+
+    CompileType result(
+        value()->Type()->IsSubtypeOf(*constrained_type_->ToAbstractType())
+            ? *value()->Type()
+            : *constrained_type_);
+    if (!is_nullable) {
+      result = result.CopyNonNullable();
     }
+    if (!can_be_sentinel) {
+      result = result.CopyNonSentinel();
+    }
+    return result;
   }
   return *value()->Type();
 }
@@ -1541,16 +1552,6 @@
     is_nullable = false;
   }
 
-  auto& obj = Object::Handle();
-  const bool is_initialized = IsFieldInitialized(&obj);
-  if (field.is_final() && is_initialized) {
-    if (!obj.IsNull()) {
-      is_nullable = false;
-      cid = obj.GetClassId();
-      abstract_type = nullptr;  // Cid is known, calculate abstract type lazily.
-    }
-  }
-
   if ((field.guarded_cid() != kIllegalCid) &&
       (field.guarded_cid() != kDynamicCid)) {
     cid = field.guarded_cid();
diff --git a/runtime/vm/compiler/backend/type_propagator_test.cc b/runtime/vm/compiler/backend/type_propagator_test.cc
index 96c3ac0..2f18be4 100644
--- a/runtime/vm/compiler/backend/type_propagator_test.cc
+++ b/runtime/vm/compiler/backend/type_propagator_test.cc
@@ -590,6 +590,127 @@
   EXPECT_PROPERTY(load->AsLoadStaticField()->Type(), !it.is_nullable());
 }
 
+ISOLATE_UNIT_TEST_CASE(TypePropagator_RedefineCanBeSentinelWithCannotBe) {
+  const char* kScript = R"(
+    late final int x;
+  )";
+  Zone* const Z = Thread::Current()->zone();
+  const auto& root_library = Library::CheckedHandle(Z, LoadTestScript(kScript));
+  const auto& toplevel = Class::Handle(Z, root_library.toplevel_class());
+  const auto& field_x = Field::Handle(
+      Z, toplevel.LookupStaticField(String::Handle(Z, String::New("x"))));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread, /*is_aot=*/false, /*is_optimizing=*/true);
+  FlowGraphBuilderHelper H;
+
+  // We are going to build the following graph:
+  //
+  // B0[graph]:0 {
+  //     v2 <- Constant(#3)
+  // }
+  // B1[function entry]:2
+  //     v3 <- LoadStaticField:10(x, ThrowIfSentinel)
+  //     v5 <- Constant(#sentinel)
+  //     Branch if StrictCompare:12(===, v3, v5) goto (2, 3)
+  // B2[target]:4
+  //     goto:16 B4
+  // B3[target]:6
+  //     v7 <- Redefinition(v3 ^ T{int?})
+  //     goto:18 B4
+  // B4[join]:8 pred(B2, B3) {
+  //       v9 <- phi(v2, v7) alive
+  // }
+  //     Return:20(v9)
+
+  Definition* v2 = H.IntConstant(3);
+  Definition* v3;
+  Definition* v7;
+  PhiInstr* v9;
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+  auto b2 = H.TargetEntry();
+  auto b3 = H.TargetEntry();
+  auto b4 = H.JoinEntry();
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    v3 = builder.AddDefinition(new LoadStaticFieldInstr(
+        field_x, {},
+        /*calls_initializer=*/false, S.GetNextDeoptId()));
+    auto v5 = builder.AddDefinition(new ConstantInstr(Object::sentinel()));
+    builder.AddBranch(new StrictCompareInstr(
+                          {}, Token::kEQ_STRICT, new Value(v3), new Value(v5),
+                          /*needs_number_check=*/false, S.GetNextDeoptId()),
+                      b2, b3);
+  }
+
+  {
+    BlockBuilder builder(H.flow_graph(), b2);
+    builder.AddInstruction(new GotoInstr(b4, S.GetNextDeoptId()));
+  }
+
+  {
+    BlockBuilder builder(H.flow_graph(), b3);
+    v7 = builder.AddDefinition(new RedefinitionInstr(new Value(v3)));
+    CompileType int_type = CompileType::FromAbstractType(
+        Type::Handle(Type::IntType()),
+        /*can_be_null=*/
+        !IsolateGroup::Current()->use_strict_null_safety_checks(),
+        /*can_be_sentinel=*/false);
+    v7->AsRedefinition()->set_constrained_type(new CompileType(int_type));
+    builder.AddInstruction(new GotoInstr(b4, S.GetNextDeoptId()));
+  }
+
+  {
+    BlockBuilder builder(H.flow_graph(), b4);
+    v9 = H.Phi(b4, {{b2, v2}, {b3, v7}});
+    builder.AddPhi(v9);
+    builder.AddReturn(new Value(v9));
+  }
+
+  H.FinishGraph();
+
+  FlowGraphPrinter::PrintGraph("Before TypePropagator", H.flow_graph());
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
+  FlowGraphPrinter::PrintGraph("After TypePropagator", H.flow_graph());
+
+  auto& blocks = H.flow_graph()->reverse_postorder();
+  EXPECT_EQ(5, blocks.length());
+  EXPECT_PROPERTY(blocks[0], it.IsGraphEntry());
+
+  // We expect the following types:
+  //
+  // B1[function entry]:2
+  //     v3 <- LoadStaticField:10(x) T{int?~}  // T{int~} in null safe mode
+  //     v5 <- Constant(#sentinel) T{Sentinel~}
+  //     Branch if StrictCompare:12(===, v3, v5) goto (2, 3)
+
+  EXPECT_PROPERTY(blocks[1], it.IsFunctionEntry());
+  EXPECT_PROPERTY(blocks[1]->next(), it.IsLoadStaticField());
+  EXPECT_PROPERTY(blocks[1]->next()->AsLoadStaticField(), it.HasType());
+  EXPECT_PROPERTY(blocks[1]->next()->AsLoadStaticField()->Type(),
+                  it.can_be_sentinel());
+
+  // B3[target]:6
+  //     v7 <- Redefinition(v3 ^ T{int?}) T{int?}  // T{int} in null safe mode
+  //     goto:18 B4
+  EXPECT_PROPERTY(blocks[3], it.IsTargetEntry());
+  EXPECT_PROPERTY(blocks[3]->next(), it.IsRedefinition());
+  EXPECT_PROPERTY(blocks[3]->next()->AsRedefinition(), it.HasType());
+  EXPECT_PROPERTY(blocks[3]->next()->AsRedefinition()->Type(),
+                  !it.can_be_sentinel());
+
+  // B4[join]:8 pred(B2, B3) {
+  //       v9 <- phi(v2, v7) alive T{int?}  // T{int} in null safe mode
+  // }
+  //     Return:20(v9)
+  EXPECT_PROPERTY(blocks[4], it.IsJoinEntry());
+  EXPECT_PROPERTY(blocks[4], it.AsJoinEntry()->phis() != nullptr);
+  EXPECT_PROPERTY(blocks[4]->AsJoinEntry()->phis()->At(0), it.HasType());
+  EXPECT_PROPERTY(blocks[4]->AsJoinEntry()->phis()->At(0)->Type(),
+                  !it.can_be_sentinel());
+}
+
 #endif  // defined(DART_PRECOMPILER)
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 90d1657..c6325a5 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -539,7 +539,6 @@
       }
       break;
     case Token::kDIV:
-      if (!FlowGraphCompiler::SupportsHardwareDivision()) return false;
       if (ShouldSpecializeForDouble(binary_feedback) ||
           binary_feedback.OperandsAre(kSmiCid)) {
         operands_type = kDoubleCid;
@@ -593,7 +592,6 @@
       break;
     case Token::kMOD:
     case Token::kTRUNCDIV:
-      if (!FlowGraphCompiler::SupportsHardwareDivision()) return false;
       if (binary_feedback.OperandsAre(kSmiCid)) {
         if (call->ic_data()->HasDeoptReason(ICData::kDeoptBinarySmiOp)) {
           return false;
diff --git a/runtime/vm/compiler/compiler_pass.cc b/runtime/vm/compiler/compiler_pass.cc
index d6071ee..0f9e5ea 100644
--- a/runtime/vm/compiler/compiler_pass.cc
+++ b/runtime/vm/compiler/compiler_pass.cc
@@ -8,6 +8,7 @@
 #include "vm/compiler/backend/branch_optimizer.h"
 #include "vm/compiler/backend/constant_propagator.h"
 #include "vm/compiler/backend/flow_graph_checker.h"
+#include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/backend/inliner.h"
 #include "vm/compiler/backend/linearscan.h"
@@ -74,8 +75,9 @@
 }
 
 CompilerPass* CompilerPass::passes_[CompilerPass::kNumPasses] = {NULL};
+uint8_t CompilerPass::flags_[CompilerPass::kNumPasses] = {0};
 
-DEFINE_OPTION_HANDLER(CompilerPass::ParseFilters,
+DEFINE_OPTION_HANDLER(CompilerPass::ParseFiltersFromFlag,
                       compiler_passes,
                       "List of comma separated compilation passes flags. "
                       "Use -Name to disable a pass, Name to print IL after it. "
@@ -109,7 +111,18 @@
     "\n"
     "List of compiler passes:\n";
 
-void CompilerPass::ParseFilters(const char* filter) {
+void CompilerPass::ParseFiltersFromFlag(const char* filter) {
+  ParseFilters(filter, flags_);
+}
+
+uint8_t* CompilerPass::ParseFiltersFromPragma(const char* filter) {
+  auto flags =
+      ThreadState::Current()->zone()->Alloc<uint8_t>(CompilerPass::kNumPasses);
+  ParseFilters(filter, flags);
+  return flags;
+}
+
+void CompilerPass::ParseFilters(const char* filter, uint8_t* pass_flags) {
   if (filter == NULL || *filter == 0) {
     return;
   }
@@ -125,11 +138,7 @@
   }
 
   // Clear all flags.
-  for (intptr_t i = 0; i < kNumPasses; i++) {
-    if (passes_[i] != NULL) {
-      passes_[i]->flags_ = 0;
-    }
-  }
+  memset(pass_flags, 0, CompilerPass::kNumPasses);
 
   for (const char *start = filter, *end = filter; *end != 0;
        start = (end + 1)) {
@@ -143,54 +152,58 @@
       continue;
     }
 
-    uint8_t flags = 0;
-    if (*start == '-') {
-      flags = kDisabled;
-    } else if (*start == ']') {
-      flags = kTraceAfter;
-    } else if (*start == '[') {
-      flags = kTraceBefore;
-    } else if (*start == '*') {
-      flags = kTraceBeforeOrAfter;
+    ParseOneFilter(start, end, pass_flags);
+  }
+}
+
+void CompilerPass::ParseOneFilter(const char* start,
+                                  const char* end,
+                                  uint8_t* pass_flags) {
+  uint8_t flags = 0;
+  if (*start == '-') {
+    flags = kDisabled;
+  } else if (*start == ']') {
+    flags = kTraceAfter;
+  } else if (*start == '[') {
+    flags = kTraceBefore;
+  } else if (*start == '*') {
+    flags = kTraceBeforeOrAfter;
+  }
+  if (flags == 0) {
+    flags |= kTraceAfter;
+  } else {
+    start++;  // Skip the modifier
+  }
+
+  size_t suffix = 0;
+  if (end[-1] == '+') {
+    if (start == (end - 1)) {
+      OS::PrintErr("Sticky modifier '+' should follow pass name\n");
+      return;
     }
-    if (flags == 0) {
-      flags |= kTraceAfter;
+    flags |= kSticky;
+    suffix = 1;
+  }
+
+  size_t length = (end - start) - suffix;
+  if (length != 0) {
+    char* pass_name = Utils::StrNDup(start, length);
+    CompilerPass* pass = FindPassByName(pass_name);
+    if (pass != NULL) {
+      pass_flags[pass->id()] |= flags;
     } else {
-      start++;  // Skip the modifier
+      OS::PrintErr("Unknown compiler pass: %s\n", pass_name);
     }
-
-    size_t suffix = 0;
-    if (end[-1] == '+') {
-      if (start == (end - 1)) {
-        OS::PrintErr("Sticky modifier '+' should follow pass name\n");
-        continue;
-      }
-      flags |= kSticky;
-      suffix = 1;
-    }
-
-    size_t length = (end - start) - suffix;
-    if (length != 0) {
-      char* pass_name = Utils::StrNDup(start, length);
-      CompilerPass* pass = FindPassByName(pass_name);
-      if (pass != NULL) {
-        pass->flags_ |= flags;
-      } else {
-        OS::PrintErr("Unknown compiler pass: %s\n", pass_name);
-      }
-      free(pass_name);
-    } else if (flags == kTraceBeforeOrAfter) {
-      for (intptr_t i = 0; i < kNumPasses; i++) {
-        if (passes_[i] != NULL) {
-          passes_[i]->flags_ = kTraceAfter;
-        }
-      }
+    free(pass_name);
+  } else if (flags == kTraceBeforeOrAfter) {
+    for (intptr_t i = 0; i < kNumPasses; i++) {
+      pass_flags[i] = kTraceAfter;
     }
   }
 }
 
 void CompilerPass::Run(CompilerPassState* state) const {
-  if (IsFlagSet(kDisabled)) {
+  if ((flags() & kDisabled) != 0) {
     return;
   }
 
@@ -206,6 +219,7 @@
       Get(kCanonicalize)->Run(state);
     }
 
+    CompilerState::Current().set_current_pass(this, state);
     PrintGraph(state, kTraceBefore, round);
     {
       TIMELINE_DURATION(thread, CompilerVerbose, name());
@@ -217,17 +231,23 @@
     }
     PrintGraph(state, kTraceAfter, round);
 #if defined(DEBUG)
-    FlowGraphChecker(state->flow_graph(), state->inline_id_to_function)
-        .Check(name());
+    if (CompilerState::Current().is_optimizing()) {
+      FlowGraphChecker(state->flow_graph(), state->inline_id_to_function)
+          .Check(name());
+    }
 #endif
+    CompilerState::Current().set_current_pass(nullptr, nullptr);
   }
 }
 
 void CompilerPass::PrintGraph(CompilerPassState* state,
                               Flag mask,
                               intptr_t round) const {
-  const intptr_t current_flags = flags() | state->sticky_flags;
   FlowGraph* flow_graph = state->flow_graph();
+  const uint8_t* graph_flags = flow_graph->compiler_pass_filters();
+  const uint8_t current_flags =
+      (graph_flags != nullptr ? graph_flags[id()] : flags()) |
+      state->sticky_flags;
 
   if ((FLAG_print_flow_graph || FLAG_print_flow_graph_optimized) &&
       flow_graph->should_print() && ((current_flags & mask) != 0)) {
@@ -337,6 +357,7 @@
   INVOKE_PASS(WidenSmiToInt32);
   INVOKE_PASS(SelectRepresentations);
   INVOKE_PASS(CSE);
+  INVOKE_PASS(Canonicalize);
   INVOKE_PASS(LICM);
   INVOKE_PASS(TryOptimizePatterns);
   INVOKE_PASS(DSE);
@@ -367,6 +388,7 @@
   INVOKE_PASS(AllocationSinking_DetachMaterializations);
   INVOKE_PASS(EliminateWriteBarriers);
   INVOKE_PASS(FinalizeGraph);
+  INVOKE_PASS(Canonicalize);
   INVOKE_PASS(AllocateRegisters);
   INVOKE_PASS(ReorderBlocks);
   return pass_state->flow_graph();
@@ -448,7 +470,7 @@
 });
 
 COMPILER_PASS(UseTableDispatch, {
-  if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
+  if (FLAG_use_table_dispatch) {
     state->call_specializer->ReplaceInstanceCallsWithDispatchTableCalls();
   }
 });
@@ -555,4 +577,6 @@
   flow_graph->RemoveRedefinitions();
 });
 
+COMPILER_PASS(GenerateCode, { state->graph_compiler->CompileGraph(); });
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/compiler_pass.h b/runtime/vm/compiler/compiler_pass.h
index 1438db8..01a7194 100644
--- a/runtime/vm/compiler/compiler_pass.h
+++ b/runtime/vm/compiler/compiler_pass.h
@@ -52,12 +52,14 @@
   V(TypePropagation)                                                           \
   V(UseTableDispatch)                                                          \
   V(WidenSmiToInt32)                                                           \
-  V(EliminateWriteBarriers)
+  V(EliminateWriteBarriers)                                                    \
+  V(GenerateCode)
 
 class AllocationSinking;
 class BlockScheduler;
 class CallSpecializer;
 class FlowGraph;
+class FlowGraphCompiler;
 class Function;
 class Precompiler;
 class SpeculativeInliningPolicy;
@@ -95,6 +97,8 @@
 
   intptr_t sticky_flags;
 
+  FlowGraphCompiler* graph_compiler = nullptr;
+
  private:
   FlowGraph* flow_graph_;
 };
@@ -111,13 +115,15 @@
   static constexpr intptr_t kNumPasses = 0 COMPILER_PASS_LIST(ADD_ONE);
 #undef ADD_ONE
 
-  CompilerPass(Id id, const char* name) : id_(id), name_(name), flags_(0) {
+  CompilerPass(Id id, const char* name) : id_(id), name_(name) {
     ASSERT(passes_[id] == NULL);
     passes_[id] = this;
 
     // By default print the final flow-graph after the register allocation.
     if (id == kAllocateRegisters) {
-      flags_ = kTraceAfter;
+      flags_[id] = kTraceAfter;
+    } else {
+      flags_[id] = 0;
     }
   }
   virtual ~CompilerPass() {}
@@ -132,18 +138,25 @@
 
   void Run(CompilerPassState* state) const;
 
-  intptr_t flags() const { return flags_; }
+  uint8_t flags() const { return flags_[id()]; }
   const char* name() const { return name_; }
   Id id() const { return id_; }
 
-  bool IsFlagSet(Flag flag) const { return (flags() & flag) != 0; }
-
   static CompilerPass* Get(Id id) { return passes_[id]; }
 
-  static void ParseFilters(const char* filter);
+  static void ParseFiltersFromFlag(const char* filter);
+  static uint8_t* ParseFiltersFromPragma(const char* filter);
+  static void ParseFilters(const char* filter, uint8_t* flags);
+  static void ParseOneFilter(const char* start,
+                             const char* end,
+                             uint8_t* flags);
 
   enum PipelineMode { kJIT, kAOT };
 
+  static void GenerateCode(CompilerPassState* state) {
+    CompilerPass::Get(CompilerPass::kGenerateCode)->Run(state);
+  }
+
   static void RunGraphIntrinsicPipeline(CompilerPassState* state);
 
   static void RunInliningPipeline(PipelineMode mode, CompilerPassState* state);
@@ -188,10 +201,10 @@
   void PrintGraph(CompilerPassState* state, Flag mask, intptr_t round) const;
 
   static CompilerPass* passes_[];
+  static uint8_t flags_[];
 
   Id id_;
   const char* name_;
-  intptr_t flags_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/compiler_state.cc b/runtime/vm/compiler/compiler_state.cc
index b886b6f..dde29ec 100644
--- a/runtime/vm/compiler/compiler_state.cc
+++ b/runtime/vm/compiler/compiler_state.cc
@@ -7,6 +7,7 @@
 #include <functional>
 
 #include "vm/compiler/aot/precompiler.h"
+#include "vm/compiler/backend/flow_graph_compiler.h"
 #include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/backend/slot.h"
 #include "vm/growable_array.h"
@@ -128,4 +129,30 @@
   return *interpolate_;
 }
 
+void CompilerState::ReportCrash() {
+  OS::PrintErr("=== Crash occured when compiling %s in %s mode in %s pass\n",
+               function() != nullptr ? function()->ToFullyQualifiedCString()
+                                     : "unknown function",
+               is_aot()          ? "AOT"
+               : is_optimizing() ? "optimizing JIT"
+                                 : "unoptimized JIT",
+               pass() != nullptr ? pass()->name() : "unknown");
+  if (pass_state() != nullptr && pass()->id() == CompilerPass::kGenerateCode) {
+    if (pass_state()->graph_compiler->current_block() != nullptr) {
+      OS::PrintErr("=== When compiling block %s\n",
+                   pass_state()->graph_compiler->current_block()->ToCString());
+    }
+    if (pass_state()->graph_compiler->current_instruction() != nullptr) {
+      OS::PrintErr(
+          "=== When compiling instruction %s\n",
+          pass_state()->graph_compiler->current_instruction()->ToCString());
+    }
+  }
+  if (pass_state() != nullptr && pass_state()->flow_graph() != nullptr) {
+    pass_state()->flow_graph()->Print(pass()->name());
+  } else {
+    OS::PrintErr("=== Flow Graph not available\n");
+  }
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/compiler_state.h b/runtime/vm/compiler/compiler_state.h
index 1520b40..ff3ac87 100644
--- a/runtime/vm/compiler/compiler_state.h
+++ b/runtime/vm/compiler/compiler_state.h
@@ -17,6 +17,8 @@
 
 namespace dart {
 
+class CompilerPass;
+struct CompilerPassState;
 class Function;
 class LocalScope;
 class LocalVariable;
@@ -105,6 +107,20 @@
   // Returns _StringBase._interpolateSingle
   const Function& StringBaseInterpolateSingle();
 
+  const Function* function() const { return function_; }
+
+  void set_function(const Function& function) { function_ = &function; }
+  void set_current_pass(const CompilerPass* pass,
+                        const CompilerPassState* pass_state) {
+    pass_ = pass;
+    pass_state_ = pass_state;
+  }
+
+  const CompilerPass* pass() const { return pass_; }
+  const CompilerPassState* pass_state() const { return pass_state_; }
+
+  void ReportCrash();
+
  private:
   CHA cha_;
   intptr_t deopt_id_ = 0;
@@ -127,6 +143,10 @@
   const Function* interpolate_ = nullptr;
   const Function* interpolate_single_ = nullptr;
 
+  const Function* function_ = nullptr;
+  const CompilerPass* pass_ = nullptr;
+  const CompilerPassState* pass_state_ = nullptr;
+
   CompilerState* previous_;
 };
 
diff --git a/runtime/vm/compiler/ffi/abi.cc b/runtime/vm/compiler/ffi/abi.cc
index d71ad34..c902a89 100644
--- a/runtime/vm/compiler/ffi/abi.cc
+++ b/runtime/vm/compiler/ffi/abi.cc
@@ -12,7 +12,7 @@
 
 namespace ffi {
 
-// See pkg/vm/lib/transformations/ffi.dart, which makes these assumptions.
+// See pkg/vm/lib/transformations/ffi/abi.dart, which makes these assumptions.
 struct AbiAlignmentDouble {
   int8_t use_one_byte;
   double d;
@@ -45,22 +45,60 @@
 #error "Unknown platform. Please add alignment requirements for ABI."
 #endif
 
-Abi TargetAbi() {
-#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM64)
-  return Abi::kWordSize64;
-#elif (defined(TARGET_ARCH_IA32) && /* NOLINT(whitespace/parens) */            \
-       (defined(DART_TARGET_OS_LINUX) || defined(DART_TARGET_OS_MACOS) ||      \
-        defined(DART_TARGET_OS_ANDROID))) ||                                   \
-    (defined(TARGET_ARCH_ARM) && defined(DART_TARGET_OS_MACOS_IOS))
-  return Abi::kWordSize32Align32;
-#elif defined(TARGET_ARCH_IA32) && defined(DART_TARGET_OS_WINDOWS) ||          \
-    defined(TARGET_ARCH_ARM)
-  return Abi::kWordSize32Align64;
+#if defined(DART_TARGET_OS_ANDROID)
+#define DART_TARGET_OS_NAME Android
+#define DART_TARGET_OS_NAME_LC android
+#elif defined(DART_TARGET_OS_FUCHSIA)
+#define DART_TARGET_OS_NAME Fuchsia
+#define DART_TARGET_OS_NAME_LC fuchsia
+#elif defined(DART_TARGET_OS_LINUX)
+#define DART_TARGET_OS_NAME Linux
+#define DART_TARGET_OS_NAME_LC linux
+#elif defined(DART_TARGET_OS_MACOS)
+#if DART_TARGET_OS_MACOS_IOS
+#define DART_TARGET_OS_NAME IOS
+#define DART_TARGET_OS_NAME_LC ios
 #else
-#error "Unknown platform. Please add alignment requirements for ABI."
+#define DART_TARGET_OS_NAME MacOS
+#define DART_TARGET_OS_NAME_LC macos
 #endif
+#elif defined(DART_TARGET_OS_WINDOWS)
+#define DART_TARGET_OS_NAME Windows
+#define DART_TARGET_OS_NAME_LC windows
+#else
+#error Unknown OS
+#endif
+
+#if defined(TARGET_ARCH_IA32)
+#define TARGET_ARCH_NAME IA32
+#define TARGET_ARCH_NAME_LC ia32
+#elif defined(TARGET_ARCH_X64)
+#define TARGET_ARCH_NAME X64
+#define TARGET_ARCH_NAME_LC x64
+#elif defined(TARGET_ARCH_ARM)
+#define TARGET_ARCH_NAME Arm
+#define TARGET_ARCH_NAME_LC arm
+#elif defined(TARGET_ARCH_ARM64)
+#define TARGET_ARCH_NAME Arm64
+#define TARGET_ARCH_NAME_LC arm64
+#else
+#error Unknown arch
+#endif
+
+#define ABI_ENUM_VALUE1(os, arch) k##os##arch
+#define ABI_ENUM_VALUE2(os, arch) ABI_ENUM_VALUE1(os, arch)
+#define ABI_ENUM_VALUE3 ABI_ENUM_VALUE2(DART_TARGET_OS_NAME, TARGET_ARCH_NAME)
+
+Abi TargetAbi() {
+  return Abi::ABI_ENUM_VALUE3;
 }
 
+#define STRINGIFY2(s) STRINGIFY(s)
+#define STRINGIFY(s) #s
+
+const char* target_abi_name =
+    STRINGIFY2(DART_TARGET_OS_NAME_LC) "_" STRINGIFY2(TARGET_ARCH_NAME_LC);
+
 }  // namespace ffi
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/ffi/abi.h b/runtime/vm/compiler/ffi/abi.h
index fb6f937..81b76d9 100644
--- a/runtime/vm/compiler/ffi/abi.h
+++ b/runtime/vm/compiler/ffi/abi.h
@@ -17,16 +17,45 @@
 
 namespace ffi {
 
-// These ABIs should be kept in sync with pkg/vm/lib/transformations/ffi.dart.
+// These ABIs should be kept in sync with
+// pkg/vm/lib/transformations/ffi/abi.dart.
 enum class Abi {
-  kWordSize64 = 0,
-  kWordSize32Align32 = 1,
-  kWordSize32Align64 = 2
+  kAndroidArm,
+  kAndroidArm64,
+  kAndroidIA32,
+  kAndroidX64,
+  kFuchsiaArm64,
+  kFuchsiaX64,
+  kIOSArm,
+  kIOSArm64,
+  kIOSX64,
+  kLinuxArm,
+  kLinuxArm64,
+  kLinuxIA32,
+  kLinuxX64,
+  kMacOSArm64,
+  kMacOSX64,
+  kWindowsArm64,
+  kWindowsIA32,
+  kWindowsX64,
 };
 
+const int64_t num_abis = static_cast<int64_t>(Abi::kWindowsX64) + 1;
+
+// We use the integer values of this enum in
+// - runtime/vm/compiler/ffi/native_type.cc
+// - runtime/vm/compiler/frontend/kernel_to_il.cc
+static_assert(static_cast<int64_t>(Abi::kAndroidArm) == 0,
+              "Enum value unexpected.");
+static_assert(static_cast<int64_t>(Abi::kWindowsX64) == 17,
+              "Enum value unexpected.");
+static_assert(num_abis == 18, "Enum value unexpected.");
+
 // The target ABI. Defines sizes and alignment of native types.
 Abi TargetAbi();
 
+extern const char* target_abi_name;
+
 }  // namespace ffi
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/ffi/marshaller.cc b/runtime/vm/compiler/ffi/marshaller.cc
index dbaff91..ca4f6d6 100644
--- a/runtime/vm/compiler/ffi/marshaller.cc
+++ b/runtime/vm/compiler/ffi/marshaller.cc
@@ -25,9 +25,10 @@
 const intptr_t kNativeParamsStartAt = 1;
 
 // Representations of the arguments and return value of a C signature function.
-static const NativeFunctionType& NativeFunctionSignature(
+const NativeFunctionType* NativeFunctionTypeFromFunctionType(
     Zone* zone,
-    const FunctionType& c_signature) {
+    const FunctionType& c_signature,
+    const char** error) {
   ASSERT(c_signature.NumOptionalParameters() == 0);
   ASSERT(c_signature.NumOptionalPositionalParameters() == 0);
 
@@ -38,29 +39,41 @@
   for (intptr_t i = 0; i < num_arguments; i++) {
     AbstractType& arg_type = AbstractType::Handle(
         zone, c_signature.ParameterTypeAt(i + kNativeParamsStartAt));
-    const auto& rep = NativeType::FromAbstractType(zone, arg_type);
-    argument_representations.Add(&rep);
+    const auto rep = NativeType::FromAbstractType(zone, arg_type, error);
+    if (*error != nullptr) {
+      return nullptr;
+    }
+    argument_representations.Add(rep);
   }
 
   const auto& result_type =
       AbstractType::Handle(zone, c_signature.result_type());
-  const auto& result_representation =
-      NativeType::FromAbstractType(zone, result_type);
+  const auto result_representation =
+      NativeType::FromAbstractType(zone, result_type, error);
+  if (*error != nullptr) {
+    return nullptr;
+  }
 
-  const auto& result = *new (zone) NativeFunctionType(argument_representations,
-                                                      result_representation);
+  const auto result = new (zone)
+      NativeFunctionType(argument_representations, *result_representation);
   return result;
 }
 
-BaseMarshaller::BaseMarshaller(Zone* zone, const Function& dart_signature)
-    : zone_(zone),
-      dart_signature_(dart_signature),
-      c_signature_(
-          FunctionType::ZoneHandle(zone, dart_signature.FfiCSignature())),
-      native_calling_convention_(NativeCallingConvention::FromSignature(
-          zone,
-          NativeFunctionSignature(zone_, c_signature_))) {
-  ASSERT(dart_signature_.IsZoneHandle());
+CallMarshaller* CallMarshaller::FromFunction(Zone* zone,
+                                             const Function& function,
+                                             const char** error) {
+  ASSERT(function.IsZoneHandle());
+  const auto& c_signature =
+      FunctionType::ZoneHandle(zone, function.FfiCSignature());
+  const auto native_function_signature =
+      NativeFunctionTypeFromFunctionType(zone, c_signature, error);
+  if (*error != nullptr) {
+    return nullptr;
+  }
+  const auto& native_calling_convention =
+      NativeCallingConvention::FromSignature(zone, *native_function_signature);
+  return new (zone)
+      CallMarshaller(zone, function, c_signature, native_calling_convention);
 }
 
 AbstractTypePtr BaseMarshaller::CType(intptr_t arg_index) const {
@@ -72,6 +85,32 @@
   return c_signature_.ParameterTypeAt(arg_index + kNativeParamsStartAt);
 }
 
+// Keep consistent with Function::FfiCSignatureReturnsStruct.
+bool BaseMarshaller::IsCompound(intptr_t arg_index) const {
+  const auto& type = AbstractType::Handle(zone_, CType(arg_index));
+  if (IsFfiTypeClassId(type.type_class_id())) {
+    return false;
+  }
+  const auto& cls = Class::Handle(this->zone_, type.type_class());
+  const auto& superClass = Class::Handle(this->zone_, cls.SuperClass());
+  const bool is_abi_specific_int =
+      String::Handle(this->zone_, superClass.UserVisibleName())
+          .Equals(Symbols::AbiSpecificInteger());
+  if (is_abi_specific_int) {
+    return false;
+  }
+#ifdef DEBUG
+  const bool is_struct =
+      String::Handle(this->zone_, superClass.UserVisibleName())
+          .Equals(Symbols::Struct());
+  const bool is_union =
+      String::Handle(this->zone_, superClass.UserVisibleName())
+          .Equals(Symbols::Union());
+  ASSERT(is_struct || is_union);
+#endif
+  return true;
+}
+
 bool BaseMarshaller::ContainsHandles() const {
   return dart_signature_.FfiCSignatureContainsHandles();
 }
@@ -574,13 +613,26 @@
   intptr_t argument_slots_required_ = 0;
 };
 
-CallbackMarshaller::CallbackMarshaller(Zone* zone,
-                                       const Function& dart_signature)
-    : BaseMarshaller(zone, dart_signature),
-      callback_locs_(CallbackArgumentTranslator::TranslateArgumentLocations(
-          zone_,
-          native_calling_convention_.argument_locations(),
-          native_calling_convention_.return_location())) {}
+CallbackMarshaller* CallbackMarshaller::FromFunction(Zone* zone,
+                                                     const Function& function,
+                                                     const char** error) {
+  ASSERT(function.IsZoneHandle());
+  const auto& c_signature =
+      FunctionType::ZoneHandle(zone, function.FfiCSignature());
+  const auto native_function_signature =
+      NativeFunctionTypeFromFunctionType(zone, c_signature, error);
+  if (*error != nullptr) {
+    return nullptr;
+  }
+  const auto& native_calling_convention =
+      NativeCallingConvention::FromSignature(zone, *native_function_signature);
+  const auto& callback_locs =
+      CallbackArgumentTranslator::TranslateArgumentLocations(
+          zone, native_calling_convention.argument_locations(),
+          native_calling_convention.return_location());
+  return new (zone) CallbackMarshaller(
+      zone, function, c_signature, native_calling_convention, callback_locs);
+}
 
 const NativeLocation& CallbackMarshaller::NativeLocationOfNativeParameter(
     intptr_t def_index) const {
diff --git a/runtime/vm/compiler/ffi/marshaller.h b/runtime/vm/compiler/ffi/marshaller.h
index fc29f67..b7607e9 100644
--- a/runtime/vm/compiler/ffi/marshaller.h
+++ b/runtime/vm/compiler/ffi/marshaller.h
@@ -28,6 +28,13 @@
 // Values below 0 index result (result might be multiple if composite).
 const intptr_t kResultIndex = -1;
 
+// Inspects the function signature and transitively any class and field
+// definitions and annotations.
+const NativeFunctionType* NativeFunctionTypeFromFunctionType(
+    Zone* zone,
+    const FunctionType& c_signature,
+    const char** error);
+
 // Provides the mapping from the native calling convention to the Dart calling
 // convention.
 //
@@ -114,11 +121,7 @@
            kFfiBoolCid;
   }
 
-  bool IsCompound(intptr_t arg_index) const {
-    const auto& type = AbstractType::Handle(zone_, CType(arg_index));
-    const bool predefined = IsFfiTypeClassId(type.type_class_id());
-    return !predefined;
-  }
+  bool IsCompound(intptr_t arg_index) const;
 
   // Treated as a null constant in Dart.
   bool IsVoid(intptr_t arg_index) const {
@@ -131,7 +134,14 @@
   StringPtr function_name() const { return dart_signature_.name(); }
 
  protected:
-  BaseMarshaller(Zone* zone, const Function& dart_signature);
+  BaseMarshaller(Zone* zone,
+                 const Function& dart_signature,
+                 const FunctionType& c_signature,
+                 const NativeCallingConvention& native_calling_convention)
+      : zone_(zone),
+        dart_signature_(dart_signature),
+        c_signature_(c_signature),
+        native_calling_convention_(native_calling_convention) {}
 
   ~BaseMarshaller() {}
 
@@ -145,8 +155,18 @@
 
 class CallMarshaller : public BaseMarshaller {
  public:
-  CallMarshaller(Zone* zone, const Function& dart_signature)
-      : BaseMarshaller(zone, dart_signature) {}
+  static CallMarshaller* FromFunction(Zone* zone,
+                                      const Function& function,
+                                      const char** error);
+
+  CallMarshaller(Zone* zone,
+                 const Function& dart_signature,
+                 const FunctionType& c_signature,
+                 const NativeCallingConvention& native_calling_convention)
+      : BaseMarshaller(zone,
+                       dart_signature,
+                       c_signature,
+                       native_calling_convention) {}
 
   virtual Representation RepInFfiCall(intptr_t def_index_global) const;
 
@@ -173,7 +193,20 @@
 
 class CallbackMarshaller : public BaseMarshaller {
  public:
-  CallbackMarshaller(Zone* zone, const Function& dart_signature);
+  static CallbackMarshaller* FromFunction(Zone* zone,
+                                          const Function& function,
+                                          const char** error);
+
+  CallbackMarshaller(Zone* zone,
+                     const Function& dart_signature,
+                     const FunctionType& c_signature,
+                     const NativeCallingConvention& native_calling_convention,
+                     const NativeLocations& callback_locs)
+      : BaseMarshaller(zone,
+                       dart_signature,
+                       c_signature,
+                       native_calling_convention),
+        callback_locs_(callback_locs) {}
 
   virtual Representation RepInFfiCall(intptr_t def_index_global) const;
 
diff --git a/runtime/vm/compiler/ffi/native_type.cc b/runtime/vm/compiler/ffi/native_type.cc
index 6dfaeb7..ac49f39 100644
--- a/runtime/vm/compiler/ffi/native_type.cc
+++ b/runtime/vm/compiler/ffi/native_type.cc
@@ -7,6 +7,7 @@
 #include "platform/assert.h"
 #include "platform/globals.h"
 #include "vm/class_id.h"
+#include "vm/compiler/ffi/abi.h"
 #include "vm/constants.h"
 #include "vm/zone_text_buffer.h"
 
@@ -386,53 +387,22 @@
   }
 }
 
-NativeType& NativeType::FromTypedDataClassId(Zone* zone, classid_t class_id) {
+const NativeType& NativeType::FromTypedDataClassId(Zone* zone,
+                                                   classid_t class_id) {
   ASSERT(IsFfiPredefinedClassId(class_id));
   const auto fundamental_rep = TypeRepresentation(class_id);
   return *new (zone) NativePrimitiveType(fundamental_rep);
 }
 
 #if !defined(FFI_UNIT_TESTS)
-NativeType& NativeType::FromAbstractType(Zone* zone, const AbstractType& type) {
-  const classid_t class_id = type.type_class_id();
-  if (IsFfiPredefinedClassId(class_id)) {
-    return NativeType::FromTypedDataClassId(zone, class_id);
-  }
-
-  // User-defined structs.
-  const auto& cls = Class::Handle(zone, type.type_class());
-  const auto& superClass = Class::Handle(zone, cls.SuperClass());
-  const bool is_struct = String::Handle(zone, superClass.UserVisibleName())
-                             .Equals(Symbols::Struct());
-  ASSERT(is_struct || String::Handle(zone, superClass.UserVisibleName())
-                          .Equals(Symbols::Union()));
-
-  auto& pragmas = Object::Handle(zone);
-  Library::FindPragma(dart::Thread::Current(), /*only_core=*/false, cls,
-                      Symbols::vm_ffi_struct_fields(), /*multiple=*/true,
-                      &pragmas);
-  ASSERT(!pragmas.IsNull());
-  ASSERT(pragmas.IsGrowableObjectArray());
-  const auto& pragmas_array = GrowableObjectArray::Cast(pragmas);
-  auto& pragma = Instance::Handle(zone);
-  auto& clazz = Class::Handle(zone);
-  auto& library = Library::Handle(zone);
-  for (intptr_t i = 0; i < pragmas_array.Length(); i++) {
-    pragma ^= pragmas_array.At(i);
-    clazz ^= pragma.clazz();
-    library ^= clazz.library();
-    if (String::Handle(zone, clazz.UserVisibleName())
-            .Equals(Symbols::FfiStructLayout()) &&
-        String::Handle(zone, library.url()).Equals(Symbols::DartFfi())) {
-      break;
-    }
-  }
-
+static const NativeType* CompoundFromPragma(Zone* zone,
+                                            const Instance& pragma,
+                                            bool is_struct,
+                                            const char** error) {
   const auto& struct_layout = pragma;
-  const auto& struct_layout_class = clazz;
-  ASSERT(String::Handle(zone, struct_layout_class.UserVisibleName())
+  const auto& clazz = Class::Handle(zone, struct_layout.clazz());
+  ASSERT(String::Handle(zone, clazz.UserVisibleName())
              .Equals(Symbols::FfiStructLayout()));
-  ASSERT(String::Handle(zone, library.url()).Equals(Symbols::DartFfi()));
   const auto& struct_layout_fields = Array::Handle(zone, clazz.fields());
   ASSERT(struct_layout_fields.Length() == 2);
   const auto& types_field =
@@ -460,8 +430,11 @@
       // Subtype of NativeType: Struct, native integer or native float.
       field_type ^= field_types.At(i);
       const auto& field_native_type =
-          NativeType::FromAbstractType(zone, field_type);
-      field_native_types.Add(&field_native_type);
+          NativeType::FromAbstractType(zone, field_type, error);
+      if (*error != nullptr) {
+        return nullptr;
+      }
+      field_native_types.Add(field_native_type);
     } else {
       // Inline array.
       const auto& struct_layout_array_class =
@@ -482,20 +455,111 @@
                  .Equals(Symbols::Length()));
       const auto& length = Smi::Handle(
           zone, Smi::RawCast(field_instance.GetField(length_field)));
-      const auto& element_type = NativeType::FromAbstractType(zone, field_type);
-      const auto& field_native_type =
-          *new (zone) NativeArrayType(element_type, length.AsInt64Value());
-      field_native_types.Add(&field_native_type);
+      const auto element_type =
+          NativeType::FromAbstractType(zone, field_type, error);
+      if (*error != nullptr) {
+        return nullptr;
+      }
+      const auto field_native_type =
+          new (zone) NativeArrayType(*element_type, length.AsInt64Value());
+      field_native_types.Add(field_native_type);
     }
   }
 
   if (is_struct) {
-    return NativeStructType::FromNativeTypes(zone, field_native_types,
-                                             member_packing);
+    return &NativeStructType::FromNativeTypes(zone, field_native_types,
+                                              member_packing);
   } else {
-    return NativeUnionType::FromNativeTypes(zone, field_native_types);
+    return &NativeUnionType::FromNativeTypes(zone, field_native_types);
   }
 }
+
+static const NativeType* AbiSpecificFromPragma(Zone* zone,
+                                               const Instance& pragma,
+                                               const Class& abi_specific_int,
+                                               const char** error) {
+  const auto& clazz = Class::Handle(zone, pragma.clazz());
+  const auto& fields = Array::Handle(zone, clazz.fields());
+  ASSERT(fields.Length() == 1);
+  const auto& native_types_field =
+      Field::Handle(zone, Field::RawCast(fields.At(0)));
+  ASSERT(String::Handle(zone, native_types_field.name())
+             .Equals(Symbols::FfiNativeTypes()));
+  const auto& native_types =
+      Array::Handle(zone, Array::RawCast(pragma.GetField(native_types_field)));
+
+  ASSERT(native_types.Length() == num_abis);
+  const int64_t abi_index = static_cast<int64_t>(TargetAbi());
+  const auto& abi_abstract_type = AbstractType::Handle(
+      zone, AbstractType::RawCast(native_types.At(abi_index)));
+  if (abi_abstract_type.IsNull()) {
+    *error = zone->PrintToString(
+        "AbiSpecificInteger '%s' is missing mapping for '%s'.",
+        abi_specific_int.UserVisibleNameCString(), target_abi_name);
+    return nullptr;
+  }
+  return NativeType::FromAbstractType(zone, abi_abstract_type, error);
+}
+
+const NativeType* NativeType::FromAbstractType(Zone* zone,
+                                               const AbstractType& type,
+                                               const char** error) {
+  const classid_t class_id = type.type_class_id();
+  if (IsFfiPredefinedClassId(class_id)) {
+    return &NativeType::FromTypedDataClassId(zone, class_id);
+  }
+
+  // User-defined structs, unions, or Abi-specific integers.
+  const auto& cls = Class::Handle(zone, type.type_class());
+  const auto& superClass = Class::Handle(zone, cls.SuperClass());
+  const bool is_struct = String::Handle(zone, superClass.UserVisibleName())
+                             .Equals(Symbols::Struct());
+  const bool is_union = String::Handle(zone, superClass.UserVisibleName())
+                            .Equals(Symbols::Union());
+  const bool is_abi_specific_int =
+      String::Handle(zone, superClass.UserVisibleName())
+          .Equals(Symbols::AbiSpecificInteger());
+  RELEASE_ASSERT(is_struct || is_union || is_abi_specific_int);
+
+  auto& pragmas = Object::Handle(zone);
+  String& pragma_name = String::Handle(zone);
+  if (is_struct || is_union) {
+    pragma_name = Symbols::vm_ffi_struct_fields().ptr();
+  } else {
+    ASSERT(is_abi_specific_int);
+    pragma_name = Symbols::vm_ffi_abi_specific_mapping().ptr();
+  }
+  Library::FindPragma(dart::Thread::Current(), /*only_core=*/false, cls,
+                      pragma_name, /*multiple=*/true, &pragmas);
+  ASSERT(!pragmas.IsNull());
+  ASSERT(pragmas.IsGrowableObjectArray());
+  const auto& pragmas_array = GrowableObjectArray::Cast(pragmas);
+  auto& pragma = Instance::Handle(zone);
+  auto& clazz = Class::Handle(zone);
+  auto& library = Library::Handle(zone);
+  String& class_symbol = String::Handle(zone);
+  if (is_struct || is_union) {
+    class_symbol = Symbols::FfiStructLayout().ptr();
+  } else {
+    ASSERT(is_abi_specific_int);
+    class_symbol = Symbols::FfiAbiSpecificMapping().ptr();
+  }
+  for (intptr_t i = 0; i < pragmas_array.Length(); i++) {
+    pragma ^= pragmas_array.At(i);
+    clazz ^= pragma.clazz();
+    library ^= clazz.library();
+    if (String::Handle(zone, clazz.UserVisibleName()).Equals(class_symbol) &&
+        String::Handle(zone, library.url()).Equals(Symbols::DartFfi())) {
+      break;
+    }
+  }
+
+  if (is_struct || is_union) {
+    return CompoundFromPragma(zone, pragma, is_struct, error);
+  }
+  ASSERT(is_abi_specific_int);
+  return AbiSpecificFromPragma(zone, pragma, cls, error);
+}
 #endif
 
 #if !defined(DART_PRECOMPILED_RUNTIME) && !defined(FFI_UNIT_TESTS)
diff --git a/runtime/vm/compiler/ffi/native_type.h b/runtime/vm/compiler/ffi/native_type.h
index 2ee284a..f60fea6 100644
--- a/runtime/vm/compiler/ffi/native_type.h
+++ b/runtime/vm/compiler/ffi/native_type.h
@@ -57,9 +57,11 @@
 class NativeType : public ZoneAllocated {
  public:
 #if !defined(FFI_UNIT_TESTS)
-  static NativeType& FromAbstractType(Zone* zone, const AbstractType& type);
+  static const NativeType* FromAbstractType(Zone* zone,
+                                            const AbstractType& type,
+                                            const char** error);
 #endif
-  static NativeType& FromTypedDataClassId(Zone* zone, classid_t class_id);
+  static const NativeType& FromTypedDataClassId(Zone* zone, classid_t class_id);
 
 #if !defined(DART_PRECOMPILED_RUNTIME) && !defined(FFI_UNIT_TESTS)
   static NativePrimitiveType& FromUnboxedRepresentation(Zone* zone,
diff --git a/runtime/vm/compiler/ffi/native_type_vm_test.cc b/runtime/vm/compiler/ffi/native_type_vm_test.cc
index 196ae4c..50a1e07 100644
--- a/runtime/vm/compiler/ffi/native_type_vm_test.cc
+++ b/runtime/vm/compiler/ffi/native_type_vm_test.cc
@@ -17,7 +17,9 @@
   const auto& ffi_library = Library::Handle(Library::FfiLibrary());
   const auto& int8_class = Class::Handle(GetClass(ffi_library, "Int8"));
   const auto& int8_type = Type::Handle(int8_class.DeclarationType());
-  const auto& native_type = NativeType::FromAbstractType(Z, int8_type);
+  const char* error = nullptr;
+  const auto& native_type = *NativeType::FromAbstractType(Z, int8_type, &error);
+  EXPECT_NULLPTR(error);
 
   EXPECT_EQ(1, native_type.SizeInBytes());
   EXPECT_STREQ("int8", native_type.ToCString());
@@ -36,7 +38,10 @@
   const auto& ffi_library = Library::Handle(Library::FfiLibrary());
   const auto& bool_class = Class::Handle(GetClass(ffi_library, "Bool"));
   const auto& bool_type = Type::Handle(bool_class.DeclarationType());
-  const auto& bool_native_type = NativeType::FromAbstractType(Z, bool_type);
+  const char* error = nullptr;
+  const auto& bool_native_type =
+      *NativeType::FromAbstractType(Z, bool_type, &error);
+  EXPECT_NULLPTR(error);
 
   const auto& uint8_native_type = *new (Z) NativePrimitiveType(kUint8);
 
@@ -67,8 +72,10 @@
   const auto& struct_class = Class::Handle(GetClass(root_library, "MyStruct"));
   const auto& struct_type = Type::Handle(struct_class.DeclarationType());
 
+  const char* error = nullptr;
   const auto& native_type =
-      NativeType::FromAbstractType(Z, struct_type).AsCompound();
+      NativeType::FromAbstractType(Z, struct_type, &error)->AsCompound();
+  EXPECT_NULLPTR(error);
 
   EXPECT_EQ(2, native_type.members().length());
 
diff --git a/runtime/vm/compiler/ffi/recognized_method.cc b/runtime/vm/compiler/ffi/recognized_method.cc
index fa93dd3..323fcc8 100644
--- a/runtime/vm/compiler/ffi/recognized_method.cc
+++ b/runtime/vm/compiler/ffi/recognized_method.cc
@@ -45,6 +45,33 @@
   }
 }
 
+classid_t ElementExternalTypedDataCid(classid_t class_id) {
+  switch (class_id) {
+    case kFfiInt8Cid:
+      return kExternalTypedDataInt8ArrayCid;
+    case kFfiUint8Cid:
+      return kExternalTypedDataUint8ArrayCid;
+    case kFfiInt16Cid:
+      return kExternalTypedDataInt16ArrayCid;
+    case kFfiUint16Cid:
+      return kExternalTypedDataUint16ArrayCid;
+    case kFfiInt32Cid:
+      return kExternalTypedDataInt32ArrayCid;
+    case kFfiUint32Cid:
+      return kExternalTypedDataUint32ArrayCid;
+    case kFfiInt64Cid:
+      return kExternalTypedDataInt64ArrayCid;
+    case kFfiUint64Cid:
+      return kExternalTypedDataUint64ArrayCid;
+    case kFfiFloatCid:
+      return kExternalTypedDataFloat32ArrayCid;
+    case kFfiDoubleCid:
+      return kExternalTypedDataFloat64ArrayCid;
+    default:
+      UNREACHABLE();
+  }
+}
+
 classid_t RecognizedMethodTypeArgCid(MethodRecognizer::Kind kind) {
   switch (kind) {
 #define LOAD_STORE(type)                                                       \
@@ -62,6 +89,11 @@
     case MethodRecognizer::kFfiLoadPointer:
     case MethodRecognizer::kFfiStorePointer:
       return kPointerCid;
+#define AS_EXTERNAL_TYPED_DATA(type)                                           \
+  case MethodRecognizer::kFfiAsExternalTypedData##type:                        \
+    return kFfi##type##Cid;
+    CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(AS_EXTERNAL_TYPED_DATA)
+#undef AS_EXTERNAL_TYPED_DATA
     default:
       UNREACHABLE();
   }
@@ -86,6 +118,36 @@
   }
 }
 
+MethodRecognizer::Kind FfiLoad(const NativeType& native_type) {
+  if (native_type.IsPrimitive()) {
+    switch (native_type.AsPrimitive().representation()) {
+#define CASE(type)                                                             \
+  case k##type:                                                                \
+    return MethodRecognizer::kFfiLoad##type;
+      CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(CASE)
+#undef CASE
+      default:
+        break;
+    }
+  }
+  UNIMPLEMENTED();
+}
+
+MethodRecognizer::Kind FfiStore(const NativeType& native_type) {
+  if (native_type.IsPrimitive()) {
+    switch (native_type.AsPrimitive().representation()) {
+#define CASE(type)                                                             \
+  case k##type:                                                                \
+    return MethodRecognizer::kFfiStore##type;
+      CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(CASE)
+#undef CASE
+      default:
+        break;
+    }
+  }
+  UNIMPLEMENTED();
+}
+
 }  // namespace ffi
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/ffi/recognized_method.h b/runtime/vm/compiler/ffi/recognized_method.h
index 993306e..ebb02a15 100644
--- a/runtime/vm/compiler/ffi/recognized_method.h
+++ b/runtime/vm/compiler/ffi/recognized_method.h
@@ -23,11 +23,18 @@
 // TypedData class id for a NativeType type, except for Void and NativeFunction.
 classid_t ElementTypedDataCid(classid_t class_id);
 
+// ExternalTypedData class id for a NativeType type, except for Void,
+// NativeFunction, IntPtr and Pointer.
+classid_t ElementExternalTypedDataCid(classid_t class_id);
+
 // Returns the kFFi<type>Cid for the recognized load/store method [kind].
 classid_t RecognizedMethodTypeArgCid(MethodRecognizer::Kind kind);
 
 AlignmentType RecognizedMethodAlignment(MethodRecognizer::Kind kind);
 
+MethodRecognizer::Kind FfiLoad(const NativeType& native_type);
+MethodRecognizer::Kind FfiStore(const NativeType& native_type);
+
 }  // namespace ffi
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 7b9bac9..f510129 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -19,12 +19,25 @@
 #define Z (zone_)
 #define IG (thread_->isolate_group())
 
+static bool SupportsCoverage() {
+#if defined(PRODUCT)
+  return false;
+#else
+  return !CompilerState::Current().is_aot();
+#endif
+}
+
 Fragment& Fragment::operator+=(const Fragment& other) {
-  if (entry == NULL) {
+  if (entry == nullptr) {
     entry = other.entry;
     current = other.current;
-  } else if (current != NULL && other.entry != NULL) {
-    current->LinkTo(other.entry);
+  } else if (other.entry != nullptr) {
+    if (current != nullptr) {
+      current->LinkTo(other.entry);
+    }
+    // Although [other.entry] could be unreachable (if this fragment is
+    // closed), there could be a yield continuation point in the middle of
+    // [other] fragment so [other.current] is still reachable.
     current = other.current;
   }
   return *this;
@@ -868,6 +881,19 @@
   return nsm;
 }
 
+Fragment BaseFlowGraphBuilder::ThrowException(TokenPosition position) {
+  Fragment instructions;
+  Value* exception = Pop();
+  instructions += Fragment(new (Z) ThrowInstr(InstructionSource(position),
+                                              GetNextDeoptId(), exception))
+                      .closed();
+  // Use its side effect of leaving a constant on the stack (does not change
+  // the graph).
+  NullConstant();
+
+  return instructions;
+}
+
 Fragment BaseFlowGraphBuilder::AssertBool(TokenPosition position) {
   Value* value = Pop();
   AssertBooleanInstr* instr = new (Z)
@@ -987,14 +1013,23 @@
   ASSERT(signatures.IsInstantiated());
   ASSERT(signatures.Length() == 2);
 
-  const AbstractType& dart_type = AbstractType::Handle(signatures.TypeAt(0));
-  const AbstractType& native_type = AbstractType::Handle(signatures.TypeAt(1));
+  const auto& dart_type =
+      FunctionType::Cast(AbstractType::Handle(signatures.TypeAt(0)));
+  const auto& native_type =
+      FunctionType::Cast(AbstractType::Handle(signatures.TypeAt(1)));
 
-  ASSERT(dart_type.IsFunctionType() && native_type.IsFunctionType());
-  const Function& target =
-      Function::ZoneHandle(compiler::ffi::TrampolineFunction(
-          FunctionType::Cast(dart_type), FunctionType::Cast(native_type),
-          is_leaf));
+  // AbiSpecificTypes can have an incomplete mapping.
+  const char* error = nullptr;
+  compiler::ffi::NativeFunctionTypeFromFunctionType(zone_, native_type, &error);
+  if (error != nullptr) {
+    const auto& language_error = Error::Handle(
+        LanguageError::New(String::Handle(String::New(error, Heap::kOld)),
+                           Report::kError, Heap::kOld));
+    Report::LongJump(language_error);
+  }
+
+  const Function& target = Function::ZoneHandle(
+      compiler::ffi::TrampolineFunction(dart_type, native_type, is_leaf));
 
   Fragment code;
   // Store the pointer in the context, we cannot load the untagged address
@@ -1125,7 +1160,7 @@
   call_hook += Constant(closure);
   call_hook += Constant(function_name);
   call_hook += LoadLocal(entry_point_num);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     call_hook += Constant(closure);
   } else {
     call_hook += Constant(Function::ZoneHandle(Z, closure.function()));
@@ -1138,25 +1173,11 @@
   return call_hook;
 }
 
-static bool SupportsCoverage() {
-#if defined(PRODUCT)
-  return false;
-#else
-  return !CompilerState::Current().is_aot();
-#endif
-}
-
 Fragment BaseFlowGraphBuilder::ClosureCall(TokenPosition position,
                                            intptr_t type_args_len,
                                            intptr_t argument_count,
                                            const Array& argument_names) {
-  Fragment result;
-
-  if (SupportsCoverage()) {
-    const intptr_t coverage_index = GetCoverageIndexFor(position);
-    result <<= new (Z) RecordCoverageInstr(coverage_array(), coverage_index,
-                                           InstructionSource(position));
-  }
+  Fragment result = RecordCoverage(position);
   const intptr_t total_count =
       (type_args_len > 0 ? 1 : 0) + argument_count +
       /*closure (bare instructions) or function (otherwise)*/ 1;
@@ -1249,24 +1270,45 @@
   return Fragment(instr);
 }
 
-intptr_t BaseFlowGraphBuilder::GetCoverageIndexFor(TokenPosition token_pos) {
+Fragment BaseFlowGraphBuilder::RecordCoverage(TokenPosition position) {
+  return RecordCoverageImpl(position, false /** is_branch_coverage **/);
+}
+
+Fragment BaseFlowGraphBuilder::RecordBranchCoverage(TokenPosition position) {
+  return RecordCoverageImpl(position, true /** is_branch_coverage **/);
+}
+
+Fragment BaseFlowGraphBuilder::RecordCoverageImpl(TokenPosition position,
+                                                  bool is_branch_coverage) {
+  Fragment instructions;
+  if (!SupportsCoverage()) return instructions;
+  if (!position.IsReal()) return instructions;
+  if (is_branch_coverage && !IG->branch_coverage()) return instructions;
+
+  const intptr_t coverage_index =
+      GetCoverageIndexFor(position.EncodeCoveragePosition(is_branch_coverage));
+  instructions <<= new (Z) RecordCoverageInstr(coverage_array(), coverage_index,
+                                               InstructionSource(position));
+  return instructions;
+}
+
+intptr_t BaseFlowGraphBuilder::GetCoverageIndexFor(intptr_t encoded_position) {
   if (coverage_array_.IsNull()) {
-    // We have not yet created coverage_array, this is the first time
-    // we are building the graph for this function. Collect coverage
-    // positions.
+    // We have not yet created coverage_array, this is the first time we are
+    // building the graph for this function. Collect coverage positions.
     for (intptr_t i = 0; i < coverage_array_positions_.length(); i++) {
-      if (coverage_array_positions_.At(i) == token_pos) {
+      if (coverage_array_positions_.At(i) == encoded_position) {
         return 2 * i + 1;
       }
     }
     const auto index = 2 * coverage_array_positions_.length() + 1;
-    coverage_array_positions_.Add(token_pos);
+    coverage_array_positions_.Add(encoded_position);
     return index;
   }
 
   for (intptr_t i = 0; i < coverage_array_.Length(); i += 2) {
-    if (TokenPosition::Deserialize(Smi::Value(
-            static_cast<SmiPtr>(coverage_array_.At(i)))) == token_pos) {
+    if (Smi::Value(static_cast<SmiPtr>(coverage_array_.At(i))) ==
+        encoded_position) {
       return i + 1;
     }
   }
@@ -1290,7 +1332,7 @@
 
   Smi& value = Smi::Handle();
   for (intptr_t i = 0; i < coverage_array_positions_.length(); i++) {
-    value = Smi::New(coverage_array_positions_[i].Serialize());
+    value = Smi::New(coverage_array_positions_[i]);
     coverage_array_.SetAt(2 * i, value);
     value = Smi::New(0);  // no coverage recorded.
     coverage_array_.SetAt(2 * i + 1, value);
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index ee7e7ce..37651ab 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -166,7 +166,6 @@
 
   const Array& coverage_array() const { return coverage_array_; }
 
-  intptr_t GetCoverageIndexFor(TokenPosition token_pos);
   void FinalizeCoverageArray();
 
   Fragment LoadField(const Field& field, bool calls_initializer);
@@ -349,6 +348,7 @@
   Fragment TestAnyTypeArgs(Fragment present, Fragment absent);
 
   JoinEntryInstr* BuildThrowNoSuchMethod();
+  Fragment ThrowException(TokenPosition position);
 
   Fragment AssertBool(TokenPosition position);
   Fragment BooleanNegate();
@@ -471,6 +471,10 @@
   // Pops double value and applies unary math operation.
   Fragment MathUnary(MathUnaryInstr::MathUnaryKind kind);
 
+  // Records coverage for this position, if the current VM mode supports it.
+  Fragment RecordCoverage(TokenPosition position);
+  Fragment RecordBranchCoverage(TokenPosition position);
+
   // Returns whether this function has a saved arguments descriptor array.
   bool has_saved_args_desc_array() {
     return function_.HasSavedArgumentsDescriptor();
@@ -484,6 +488,8 @@
 
  protected:
   intptr_t AllocateBlockId() { return ++last_used_block_id_; }
+  Fragment RecordCoverageImpl(TokenPosition position, bool is_branch_coverage);
+  intptr_t GetCoverageIndexFor(intptr_t encoded_position);
 
   const ParsedFunction* parsed_function_;
   const Function& function_;
@@ -504,7 +510,7 @@
   const bool inlining_unchecked_entry_;
   const Array& saved_args_desc_array_;
 
-  GrowableArray<TokenPosition> coverage_array_positions_;
+  GrowableArray<intptr_t> coverage_array_positions_;
   Array& coverage_array_;
 
   friend class StreamingFlowGraphBuilder;
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 6bf2d87..00c2160 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -6,6 +6,7 @@
 
 #include "vm/closure_functions_cache.h"
 #include "vm/compiler/ffi/callback.h"
+#include "vm/compiler/ffi/recognized_method.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"  // For dart::FlowGraphBuilder::SimpleInstanceOfType.
 #include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
@@ -364,7 +365,7 @@
           intptr_t argument_count;
           instructions += BuildArguments(
               &argument_names, &argument_count,
-              /* positional_parameter_count = */ NULL);  // read arguments.
+              /* positional_parameter_count = */ nullptr);  // read arguments.
           argument_count += 1;
 
           Class& parent_klass = GetSuperOrDie();
@@ -390,7 +391,7 @@
           intptr_t argument_count;
           instructions += BuildArguments(
               &argument_names, &argument_count,
-              /* positional_parameter_count = */ NULL);  // read arguments.
+              /* positional_parameter_count = */ nullptr);  // read arguments.
           argument_count += 1;
 
           const Function& target = Function::ZoneHandle(
@@ -487,7 +488,7 @@
     ASSERT(yield_continuations().is_empty() || !dart_function.IsGeneric());
 
     LocalVariable* fn_type_args = parsed_function()->function_type_arguments();
-    ASSERT(fn_type_args != NULL && closure != NULL);
+    ASSERT(fn_type_args != nullptr && closure != nullptr);
 
     if (dart_function.IsGeneric()) {
       prologue += LoadLocal(fn_type_args);
@@ -527,7 +528,8 @@
 
   // Prepend an entry corresponding to normal entry to the function.
   yield_continuations().InsertAt(
-      0, YieldContinuation(new (Z) DropTempsInstr(0, NULL), kInvalidTryIndex));
+      0,
+      YieldContinuation(new (Z) DropTempsInstr(0, nullptr), kInvalidTryIndex));
   yield_continuations()[0].entry->LinkTo(body.entry);
 
   // Load :await_jump_var into a temporary.
@@ -648,7 +650,7 @@
         ASSERT((function.HasOptionalParameters() &&
                 raw_parameter.owner() == scope) ||
                (!function.HasOptionalParameters() &&
-                raw_parameter.owner() == NULL));
+                raw_parameter.owner() == nullptr));
         ASSERT(!raw_parameter.is_captured());
 
         // Copy the parameter from the stack to the context.
@@ -1017,7 +1019,7 @@
       break;
   }
   UNREACHABLE();
-  return NULL;
+  return nullptr;
 }
 
 void StreamingFlowGraphBuilder::ParseKernelASTFunction() {
@@ -1239,52 +1241,52 @@
   return Fragment();
 }
 
-Fragment StreamingFlowGraphBuilder::BuildStatement() {
+Fragment StreamingFlowGraphBuilder::BuildStatement(TokenPosition* position) {
   intptr_t offset = ReaderOffset();
   Tag tag = ReadTag();  // read tag.
   switch (tag) {
     case kExpressionStatement:
-      return BuildExpressionStatement();
+      return BuildExpressionStatement(position);
     case kBlock:
-      return BuildBlock();
+      return BuildBlock(position);
     case kEmptyStatement:
       return BuildEmptyStatement();
     case kAssertBlock:
-      return BuildAssertBlock();
+      return BuildAssertBlock(position);
     case kAssertStatement:
-      return BuildAssertStatement();
+      return BuildAssertStatement(position);
     case kLabeledStatement:
-      return BuildLabeledStatement();
+      return BuildLabeledStatement(position);
     case kBreakStatement:
-      return BuildBreakStatement();
+      return BuildBreakStatement(position);
     case kWhileStatement:
-      return BuildWhileStatement();
+      return BuildWhileStatement(position);
     case kDoStatement:
-      return BuildDoStatement();
+      return BuildDoStatement(position);
     case kForStatement:
-      return BuildForStatement();
+      return BuildForStatement(position);
     case kForInStatement:
-      return BuildForInStatement(false);
+      return BuildForInStatement(false, position);
     case kAsyncForInStatement:
-      return BuildForInStatement(true);
+      return BuildForInStatement(true, position);
     case kSwitchStatement:
-      return BuildSwitchStatement();
+      return BuildSwitchStatement(position);
     case kContinueSwitchStatement:
-      return BuildContinueSwitchStatement();
+      return BuildContinueSwitchStatement(position);
     case kIfStatement:
-      return BuildIfStatement();
+      return BuildIfStatement(position);
     case kReturnStatement:
-      return BuildReturnStatement();
+      return BuildReturnStatement(position);
     case kTryCatch:
-      return BuildTryCatch();
+      return BuildTryCatch(position);
     case kTryFinally:
-      return BuildTryFinally();
+      return BuildTryFinally(position);
     case kYieldStatement:
-      return BuildYieldStatement();
+      return BuildYieldStatement(position);
     case kVariableDeclaration:
-      return BuildVariableDeclaration();
+      return BuildVariableDeclaration(position);
     case kFunctionDeclaration:
-      return BuildFunctionDeclaration(offset);
+      return BuildFunctionDeclaration(offset, position);
     default:
       ReportUnexpectedTag("statement", tag);
       UNREACHABLE();
@@ -1292,9 +1294,19 @@
   return Fragment();
 }
 
+Fragment StreamingFlowGraphBuilder::BuildStatementWithBranchCoverage(
+    TokenPosition* position) {
+  TokenPosition pos = TokenPosition::kNoSource;
+  Fragment statement = BuildStatement(&pos);
+  if (position != nullptr) *position = pos;
+  Fragment covered_statement = flow_graph_builder_->RecordBranchCoverage(pos);
+  covered_statement += statement;
+  return covered_statement;
+}
+
 void StreamingFlowGraphBuilder::ReportUnexpectedTag(const char* variant,
                                                     Tag tag) {
-  if ((flow_graph_builder_ == NULL) || (parsed_function() == NULL)) {
+  if ((flow_graph_builder_ == nullptr) || (parsed_function() == nullptr)) {
     KernelReaderHelper::ReportUnexpectedTag(variant, tag);
   } else {
     H.ReportError(script_, TokenPosition::kNoSource,
@@ -1627,11 +1639,13 @@
     const InferredTypeMetadata* result_type,
     bool use_unchecked_entry,
     const CallSiteAttributesMetadata* call_site_attrs,
-    bool receiver_is_not_smi) {
+    bool receiver_is_not_smi,
+    bool is_call_on_this) {
   return flow_graph_builder_->InstanceCall(
       position, name, kind, type_args_len, argument_count, argument_names,
       checked_argument_count, interface_target, tearoff_interface_target,
-      result_type, use_unchecked_entry, call_site_attrs, receiver_is_not_smi);
+      result_type, use_unchecked_entry, call_site_attrs, receiver_is_not_smi,
+      is_call_on_this);
 }
 
 Fragment StreamingFlowGraphBuilder::ThrowException(TokenPosition position) {
@@ -1870,6 +1884,10 @@
       type, variable->name(), AssertAssignableInstr::kParameterCheck);
 }
 
+Fragment StreamingFlowGraphBuilder::RecordCoverage(TokenPosition position) {
+  return flow_graph_builder_->RecordCoverage(position);
+}
+
 Fragment StreamingFlowGraphBuilder::EnterScope(
     intptr_t kernel_offset,
     const LocalScope** scope /* = nullptr */) {
@@ -1968,7 +1986,7 @@
                                                    intptr_t* argument_count,
                                                    intptr_t* positional_count) {
   intptr_t dummy;
-  if (argument_count == NULL) argument_count = &dummy;
+  if (argument_count == nullptr) argument_count = &dummy;
   *argument_count = ReadUInt();  // read arguments count.
 
   // List of types.
@@ -1976,7 +1994,7 @@
 
   {
     AlternativeReadingScope _(&reader_);
-    if (positional_count == NULL) positional_count = &dummy;
+    if (positional_count == nullptr) positional_count = &dummy;
     *positional_count = ReadListLength();  // read length of expression list
   }
   return BuildArgumentsFromActualArguments(argument_names);
@@ -1994,14 +2012,14 @@
 
   // List of named.
   list_length = ReadListLength();  // read list length.
-  if (argument_names != NULL && list_length > 0) {
+  if (argument_names != nullptr && list_length > 0) {
     *argument_names = Array::New(list_length, Heap::kOld);
   }
   for (intptr_t i = 0; i < list_length; ++i) {
     String& name =
         H.DartSymbolObfuscate(ReadStringReference());  // read ith name index.
     instructions += BuildExpression();                 // read ith expression.
-    if (argument_names != NULL) {
+    if (argument_names != nullptr) {
       argument_names->SetAt(i, name);
     }
   }
@@ -2015,7 +2033,7 @@
   // [NoSuchMethodError]s) and only emit [InvalidExpression]s in very special
   // situations (e.g. an invalid annotation).
   TokenPosition pos = ReadPosition();
-  if (position != NULL) *position = pos;
+  if (position != nullptr) *position = pos;
   const String& message = H.DartString(ReadStringReference());
   Tag tag = ReadTag();  // read (first part of) expression.
   if (tag == kSomething) {
@@ -2123,7 +2141,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildVariableSet(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   intptr_t variable_kernel_position = ReadUInt();  // read kernel position.
   ReadUInt();  // read relative variable index.
@@ -2133,7 +2151,7 @@
 Fragment StreamingFlowGraphBuilder::BuildVariableSet(uint8_t payload,
                                                      TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   intptr_t variable_kernel_position = ReadUInt();  // read kernel position.
   return BuildVariableSetImpl(position, variable_kernel_position);
@@ -2416,7 +2434,8 @@
   const TokenPosition position = ReadPosition();  // read position.
   if (p != nullptr) *p = position;
 
-  if (PeekTag() == kThisExpression) {
+  const bool is_call_on_this = PeekTag() == kThisExpression;
+  if (is_call_on_this) {
     is_unchecked_call = true;
   }
   instructions += BuildExpression();  // read receiver.
@@ -2460,7 +2479,8 @@
         Array::null_array(), kNumArgsChecked, interface_target,
         Function::null_function(),
         /*result_type=*/nullptr,
-        /*use_unchecked_entry=*/is_unchecked_call, &call_site_attributes);
+        /*use_unchecked_entry=*/is_unchecked_call, &call_site_attributes,
+        /*receiver_not_smi=*/false, is_call_on_this);
   }
 
   instructions += Drop();  // Drop result of the setter invocation.
@@ -2621,7 +2641,7 @@
 Fragment StreamingFlowGraphBuilder::BuildSuperPropertyGet(TokenPosition* p) {
   const intptr_t offset = ReaderOffset() - 1;     // Include the tag.
   const TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   const InferredTypeMetadata result_type =
       inferred_type_metadata_helper_.GetInferredType(offset);
@@ -2697,7 +2717,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildSuperPropertySet(TokenPosition* p) {
   const TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   Class& klass = GetSuperOrDie();
 
@@ -2764,7 +2784,7 @@
   const intptr_t offset = ReaderOffset() - 1;  // Include the tag.
 
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   const InferredTypeMetadata result_type =
       inferred_type_metadata_helper_.GetInferredType(offset);
@@ -2828,7 +2848,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildStaticSet(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   NameIndex target = ReadCanonicalNameReference();  // read target_reference.
   ASSERT(H.IsSetter(target));
@@ -2877,7 +2897,7 @@
   const bool is_invariant = (flags & kInstanceInvocationFlagInvariant) != 0;
 
   const TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   const DirectCallMetadata direct_call =
       direct_call_metadata_helper_.GetDirectTargetForMethodInvocation(offset);
@@ -2900,7 +2920,7 @@
   Fragment instructions;
 
   intptr_t type_args_len = 0;
-  LocalVariable* type_arguments_temp = NULL;
+  LocalVariable* type_arguments_temp = nullptr;
   {
     AlternativeReadingScope alt(&reader_);
     SkipExpression();                         // skip receiver
@@ -2924,7 +2944,8 @@
 
   // Take note of whether the invocation is against the receiver of the current
   // function: in this case, we may skip some type checks in the callee.
-  if ((PeekTag() == kThisExpression) && !is_dynamic) {
+  const bool is_call_on_this = (PeekTag() == kThisExpression) && !is_dynamic;
+  if (is_call_on_this) {
     is_unchecked_call = true;
   }
   instructions += BuildExpression();  // read receiver.
@@ -2941,8 +2962,8 @@
     ASSERT(type_args_len == 0);
     // "==" or "!=" with null on either side.
     instructions +=
-        BuildArguments(NULL /* named */, NULL /* arg count */,
-                       NULL /* positional arg count */);  // read arguments.
+        BuildArguments(nullptr /* named */, nullptr /* arg count */,
+                       nullptr /* positional arg count */);  // read arguments.
     SkipInterfaceMemberNameReference();  // read interface_target_reference.
     Token::Kind strict_cmp_kind =
         token_kind == Token::kEQ ? Token::kEQ_STRICT : Token::kNE_STRICT;
@@ -2950,11 +2971,11 @@
            StrictCompare(position, strict_cmp_kind, /*number_check = */ true);
   }
 
-  LocalVariable* receiver_temp = NULL;
+  LocalVariable* receiver_temp = nullptr;
   if (direct_call.check_receiver_for_null_) {
     // Duplicate receiver for CheckNull before it is consumed by PushArgument.
     receiver_temp = MakeTemporary();
-    if (type_arguments_temp != NULL) {
+    if (type_arguments_temp != nullptr) {
       // If call has type arguments then push them before pushing the receiver.
       // The stack will contain:
       //
@@ -3031,19 +3052,19 @@
                    argument_names, ICData::kNoRebind, &result_type,
                    type_args_len, /*use_unchecked_entry=*/is_unchecked_call);
   } else {
-    instructions +=
-        InstanceCall(position, *mangled_name, token_kind, type_args_len,
-                     argument_count, argument_names, checked_argument_count,
-                     *interface_target, Function::null_function(), &result_type,
-                     /*use_unchecked_entry=*/is_unchecked_call,
-                     &call_site_attributes, result_type.ReceiverNotInt());
+    instructions += InstanceCall(
+        position, *mangled_name, token_kind, type_args_len, argument_count,
+        argument_names, checked_argument_count, *interface_target,
+        Function::null_function(), &result_type,
+        /*use_unchecked_entry=*/is_unchecked_call, &call_site_attributes,
+        result_type.ReceiverNotInt(), is_call_on_this);
   }
 
   // Drop temporaries preserving result on the top of the stack.
-  ASSERT((receiver_temp != NULL) || (type_arguments_temp == NULL));
-  if (receiver_temp != NULL) {
-    const intptr_t num_temps =
-        (receiver_temp != NULL ? 1 : 0) + (type_arguments_temp != NULL ? 1 : 0);
+  ASSERT((receiver_temp != nullptr) || (type_arguments_temp == nullptr));
+  if (receiver_temp != nullptr) {
+    const intptr_t num_temps = (receiver_temp != nullptr ? 1 : 0) +
+                               (type_arguments_temp != nullptr ? 1 : 0);
     instructions += DropTempsPreserveTop(num_temps);
   }
 
@@ -3101,7 +3122,7 @@
 
   // Lookup the function in the closure.
   instructions += LoadLocal(variable);
-  if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     instructions += LoadNativeField(Slot::Closure_function());
   }
   if (parsed_function()->function().is_debuggable()) {
@@ -3164,7 +3185,7 @@
                               /*clear_temp=*/false);
     // Lookup the function in the closure.
     instructions += LoadLocal(receiver_temp);
-    if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+    if (!FLAG_precompiled_mode) {
       instructions += LoadNativeField(Slot::Closure_function());
     }
     if (parsed_function()->function().is_debuggable()) {
@@ -3250,7 +3271,7 @@
     TokenPosition* p) {
   const intptr_t offset = ReaderOffset() - 1;     // Include the tag.
   const TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   const InferredTypeMetadata result_type =
       inferred_type_metadata_helper_.GetInferredType(offset);
@@ -3374,7 +3395,7 @@
     intptr_t argument_count;
     instructions += BuildArguments(
         &argument_names, &argument_count,
-        /* positional_argument_count = */ NULL);  // read arguments.
+        /* positional_argument_count = */ nullptr);  // read arguments.
     ++argument_count;                             // include receiver
     SkipInterfaceMemberNameReference();           // interfaceTargetReference
     return instructions +
@@ -3388,7 +3409,7 @@
 Fragment StreamingFlowGraphBuilder::BuildStaticInvocation(TokenPosition* p) {
   const intptr_t offset = ReaderOffset() - 1;  // Include the tag.
   TokenPosition position = ReadPosition();     // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   const InferredTypeMetadata result_type =
       inferred_type_metadata_helper_.GetInferredType(offset);
@@ -3406,17 +3427,30 @@
   }
 
   const auto recognized_kind = target.recognized_kind();
-  if (recognized_kind == MethodRecognizer::kNativeEffect) {
-    return BuildNativeEffect();
-  } else if (recognized_kind == MethodRecognizer::kFfiAsFunctionInternal) {
-    return BuildFfiAsFunctionInternal();
-  } else if (CompilerState::Current().is_aot() &&
-             recognized_kind == MethodRecognizer::kFfiNativeCallbackFunction) {
-    return BuildFfiNativeCallbackFunction();
+  switch (recognized_kind) {
+    case MethodRecognizer::kNativeEffect:
+      return BuildNativeEffect();
+    case MethodRecognizer::kFfiAsFunctionInternal:
+      return BuildFfiAsFunctionInternal();
+    case MethodRecognizer::kFfiNativeCallbackFunction:
+      if (CompilerState::Current().is_aot()) {
+        return BuildFfiNativeCallbackFunction();
+      }
+      break;
+    case MethodRecognizer::kFfiLoadAbiSpecificInt:
+      return BuildLoadAbiSpecificInt(/*at_index=*/false);
+    case MethodRecognizer::kFfiLoadAbiSpecificIntAtIndex:
+      return BuildLoadAbiSpecificInt(/*at_index=*/true);
+    case MethodRecognizer::kFfiStoreAbiSpecificInt:
+      return BuildStoreAbiSpecificInt(/*at_index=*/false);
+    case MethodRecognizer::kFfiStoreAbiSpecificIntAtIndex:
+      return BuildStoreAbiSpecificInt(/*at_index=*/true);
+    default:
+      break;
   }
 
   Fragment instructions;
-  LocalVariable* instance_variable = NULL;
+  LocalVariable* instance_variable = nullptr;
 
   const bool special_case_unchecked_cast =
       klass.IsTopLevel() && (klass.library() == Library::InternalLibrary()) &&
@@ -3474,11 +3508,11 @@
 
   Array& argument_names = Array::ZoneHandle(Z);
   instructions +=
-      BuildArguments(&argument_names, NULL /* arg count */,
-                     NULL /* positional arg count */);  // read arguments.
+      BuildArguments(&argument_names, nullptr /* arg count */,
+                     nullptr /* positional arg count */);  // read arguments.
   ASSERT(!special_case ||
          target.AreValidArguments(type_args_len, argument_count, argument_names,
-                                  NULL));
+                                  nullptr));
 
   // Special case identical(x, y) call.
   // TODO(27590) consider moving this into the inliner and force inline it
@@ -3505,7 +3539,7 @@
 Fragment StreamingFlowGraphBuilder::BuildConstructorInvocation(
     TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   NameIndex kernel_name =
       ReadCanonicalNameReference();  // read target_reference.
@@ -3546,18 +3580,18 @@
   intptr_t argument_count;
   instructions += BuildArguments(
       &argument_names, &argument_count,
-      /* positional_argument_count = */ NULL);  // read arguments.
+      /* positional_argument_count = */ nullptr);  // read arguments.
 
   const Function& target = Function::ZoneHandle(
       Z, H.LookupConstructorByKernelConstructor(klass, kernel_name));
   ++argument_count;
   instructions += StaticCall(position, target, argument_count, argument_names,
-                             ICData::kStatic, /* result_type = */ NULL);
+                             ICData::kStatic, /* result_type = */ nullptr);
   return instructions + Drop();
 }
 
 Fragment StreamingFlowGraphBuilder::BuildNot(TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   TokenPosition operand_position = TokenPosition::kNoSource;
   Fragment instructions =
@@ -3655,7 +3689,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildLogicalExpression(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   TestFragment exits;
   exits.true_successor_addresses = new TestFragment::SuccessorAddressArray(2);
@@ -3692,7 +3726,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildConditionalExpression(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   TestFragment condition = TranslateConditionForControl();  // read condition.
 
@@ -3808,7 +3842,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildIsExpression(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   if (translation_helper_.info().kernel_binary_version() >= 38) {
     // We do not use the library mode for the type test, which is indicated by
@@ -3861,7 +3895,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildAsExpression(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   const uint8_t flags = ReadFlags();  // read flags.
   const bool is_type_error = (flags & kAsExpressionFlagTypeError) != 0;
@@ -3876,18 +3910,16 @@
     // We do not care whether the 'as' cast as implicitly added by the frontend
     // or explicitly written by the user, in both cases we use an assert
     // assignable.
-    instructions += LoadLocal(MakeTemporary());
     instructions += B->AssertAssignableLoadTypeArguments(
         position, type,
         is_type_error ? Symbols::Empty() : Symbols::InTypeCast(),
         AssertAssignableInstr::kInsertedByFrontend);
-    instructions += Drop();
   }
   return instructions;
 }
 
 Fragment StreamingFlowGraphBuilder::BuildTypeLiteral(TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   const AbstractType& type = T.BuildType();  // read type.
   Fragment instructions;
@@ -3911,14 +3943,14 @@
 
 Fragment StreamingFlowGraphBuilder::BuildThisExpression(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   return LoadLocal(parsed_function()->receiver_var());
 }
 
 Fragment StreamingFlowGraphBuilder::BuildRethrow(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   Fragment instructions = DebugStepCheck(position);
   instructions += LoadLocal(catch_block()->exception_var());
@@ -3930,7 +3962,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildThrow(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   Fragment instructions;
 
@@ -3947,7 +3979,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildListLiteral(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   const TypeArguments& type_arguments = T.BuildTypeArguments(1);  // read type.
   intptr_t length = ReadListLength();  // read list length.
@@ -3993,7 +4025,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildMapLiteral(TokenPosition* p) {
   TokenPosition position = ReadPosition();  // read position.
-  if (p != NULL) *p = position;
+  if (p != nullptr) *p = position;
 
   const TypeArguments& type_arguments =
       T.BuildTypeArguments(2);  // read key_type and value_type.
@@ -4050,8 +4082,8 @@
 Fragment StreamingFlowGraphBuilder::BuildLet(TokenPosition* p) {
   const TokenPosition position = ReadPosition();  // read position.
   if (p != nullptr) *p = position;
-  Fragment instructions = BuildVariableDeclaration();  // read variable.
-  instructions += BuildExpression();                   // read body.
+  Fragment instructions = BuildVariableDeclaration(nullptr);  // read variable.
+  instructions += BuildExpression();                          // read body.
   return instructions;
 }
 
@@ -4075,7 +4107,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildBigIntLiteral(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   const String& value =
       H.DartString(ReadStringReference());  // read index into string table.
@@ -4090,7 +4122,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildStringLiteral(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   return Constant(H.DartSymbolPlain(
       ReadStringReference()));  // read index into string table.
@@ -4098,7 +4130,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildIntLiteral(uint8_t payload,
                                                     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   int64_t value = static_cast<int32_t>(payload) - SpecializedIntLiteralBias;
   return IntConstant(value);
@@ -4106,7 +4138,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildIntLiteral(bool is_negative,
                                                     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   int64_t value = is_negative ? -static_cast<int64_t>(ReadUInt())
                               : ReadUInt();  // read value.
@@ -4115,7 +4147,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildDoubleLiteral(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   Double& constant = Double::ZoneHandle(
       Z, Double::NewCanonical(ReadDouble()));  // read double.
@@ -4124,20 +4156,20 @@
 
 Fragment StreamingFlowGraphBuilder::BuildBoolLiteral(bool value,
                                                      TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   return Constant(Bool::Get(value));
 }
 
 Fragment StreamingFlowGraphBuilder::BuildNullLiteral(TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   return Constant(Instance::ZoneHandle(Z, Instance::null()));
 }
 
 Fragment StreamingFlowGraphBuilder::BuildFutureNullValue(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
   const Class& future = Class::Handle(Z, IG->object_store()->future_class());
   ASSERT(!future.IsNull());
   const auto& error = future.EnsureIsFinalized(thread());
@@ -4170,7 +4202,7 @@
 
 Fragment StreamingFlowGraphBuilder::BuildPartialTearoffInstantiation(
     TokenPosition* position) {
-  if (position != NULL) *position = TokenPosition::kNoSource;
+  if (position != nullptr) *position = TokenPosition::kNoSource;
 
   // Create a copy of the closure.
 
@@ -4257,20 +4289,24 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildExpressionStatement() {
-  Fragment instructions = BuildExpression();  // read expression.
+Fragment StreamingFlowGraphBuilder::BuildExpressionStatement(
+    TokenPosition* position) {
+  Fragment instructions = BuildExpression(position);  // read expression.
   instructions += Drop();
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildBlock() {
+Fragment StreamingFlowGraphBuilder::BuildBlock(TokenPosition* position) {
   intptr_t offset = ReaderOffset() - 1;  // Include the tag.
 
   Fragment instructions;
 
   instructions += EnterScope(offset);
-  ReadPosition();                           // read file offset.
+  const TokenPosition pos = ReadPosition();  // read file offset.
+  if (position != nullptr) *position = pos;
+
   ReadPosition();                           // read file end offset.
+
   intptr_t list_length = ReadListLength();  // read number of statements.
   for (intptr_t i = 0; i < list_length; ++i) {
     if (instructions.is_open()) {
@@ -4288,7 +4324,7 @@
   return Fragment();
 }
 
-Fragment StreamingFlowGraphBuilder::BuildAssertBlock() {
+Fragment StreamingFlowGraphBuilder::BuildAssertBlock(TokenPosition* position) {
   if (!IG->asserts()) {
     SkipStatementList();
     return Fragment();
@@ -4302,7 +4338,8 @@
   intptr_t list_length = ReadListLength();  // read number of statements.
   for (intptr_t i = 0; i < list_length; ++i) {
     if (instructions.is_open()) {
-      instructions += BuildStatement();  // read ith statement.
+      // read ith statement.
+      instructions += BuildStatement(i == 0 ? position : nullptr);
     } else {
       SkipStatement();  // read ith statement.
     }
@@ -4312,7 +4349,8 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildAssertStatement() {
+Fragment StreamingFlowGraphBuilder::BuildAssertStatement(
+    TokenPosition* position) {
   if (!IG->asserts()) {
     SetOffset(ReaderOffset() - 1);  // Include the tag.
     SkipStatement();                // read this statement.
@@ -4330,7 +4368,7 @@
   //
   // The call to `_AssertionError._evaluateAssertion()` will take care of both
   // and returns a boolean.
-  instructions += BuildExpression();  // read condition.
+  instructions += BuildExpression(position);  // read condition.
 
   const TokenPosition condition_start_offset =
       ReadPosition();  // read condition start offset.
@@ -4338,6 +4376,7 @@
       ReadPosition();  // read condition end offset.
 
   instructions += EvaluateAssertion();
+  instructions += RecordCoverage(condition_start_offset);
   instructions += CheckBoolean(condition_start_offset);
   instructions += Constant(Bool::True());
   instructions += BranchIfEqual(&then, &otherwise, false);
@@ -4374,7 +4413,8 @@
   return Fragment(instructions.entry, then);
 }
 
-Fragment StreamingFlowGraphBuilder::BuildLabeledStatement() {
+Fragment StreamingFlowGraphBuilder::BuildLabeledStatement(
+    TokenPosition* position) {
   // There can be serveral cases:
   //
   //   * the body contains a break
@@ -4387,7 +4427,7 @@
   //    traversed.
 
   BreakableBlock block(flow_graph_builder_);
-  Fragment instructions = BuildStatement();  // read body.
+  Fragment instructions = BuildStatement(position);  // read body.
   if (block.HadJumper()) {
     if (instructions.is_open()) {
       instructions += Goto(block.destination());
@@ -4398,11 +4438,14 @@
   }
 }
 
-Fragment StreamingFlowGraphBuilder::BuildBreakStatement() {
-  TokenPosition position = ReadPosition();  // read position.
+Fragment StreamingFlowGraphBuilder::BuildBreakStatement(
+    TokenPosition* position) {
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
+
   intptr_t target_index = ReadUInt();       // read target index.
 
-  TryFinallyBlock* outer_finally = NULL;
+  TryFinallyBlock* outer_finally = nullptr;
   intptr_t target_context_depth = -1;
   JoinEntryInstr* destination = breakable_block()->BreakDestination(
       target_index, &outer_finally, &target_context_depth);
@@ -4410,8 +4453,8 @@
   Fragment instructions;
   // Break statement should pause before manipulation of context, which
   // will possibly cause debugger having incorrect context object.
-  if (NeedsDebugStepCheck(parsed_function()->function(), position)) {
-    instructions += DebugStepCheck(position);
+  if (NeedsDebugStepCheck(parsed_function()->function(), pos)) {
+    instructions += DebugStepCheck(pos);
   }
   instructions +=
       TranslateFinallyFinalizers(outer_finally, target_context_depth);
@@ -4421,12 +4464,15 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildWhileStatement() {
+Fragment StreamingFlowGraphBuilder::BuildWhileStatement(
+    TokenPosition* position) {
   ASSERT(block_expression_depth() == 0);  // no while in block-expr
   loop_depth_inc();
-  const TokenPosition position = ReadPosition();            // read position.
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
+
   TestFragment condition = TranslateConditionForControl();  // read condition.
-  const Fragment body = BuildStatement();                   // read body
+  const Fragment body = BuildStatementWithBranchCoverage();  // read body
 
   Fragment body_entry(condition.CreateTrueSuccessor(flow_graph_builder_));
   body_entry += body;
@@ -4438,7 +4484,7 @@
 
     Fragment loop(join);
     ASSERT(B->GetStackDepth() == 0);
-    loop += CheckStackOverflow(position);
+    loop += CheckStackOverflow(pos);
     loop.current->LinkTo(condition.entry);
 
     entry = Goto(join).entry;
@@ -4450,11 +4496,13 @@
   return Fragment(entry, condition.CreateFalseSuccessor(flow_graph_builder_));
 }
 
-Fragment StreamingFlowGraphBuilder::BuildDoStatement() {
+Fragment StreamingFlowGraphBuilder::BuildDoStatement(TokenPosition* position) {
   ASSERT(block_expression_depth() == 0);  // no do-while in block-expr
   loop_depth_inc();
-  const TokenPosition position = ReadPosition();  // read position.
-  Fragment body = BuildStatement();               // read body.
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
+
+  Fragment body = BuildStatementWithBranchCoverage();  // read body.
 
   if (body.is_closed()) {
     SkipExpression();  // read condition.
@@ -4467,7 +4515,7 @@
   JoinEntryInstr* join = BuildJoinEntry();
   Fragment loop(join);
   ASSERT(B->GetStackDepth() == 0);
-  loop += CheckStackOverflow(position);
+  loop += CheckStackOverflow(pos);
   loop += body;
   loop <<= condition.entry;
 
@@ -4479,10 +4527,11 @@
       condition.CreateFalseSuccessor(flow_graph_builder_));
 }
 
-Fragment StreamingFlowGraphBuilder::BuildForStatement() {
+Fragment StreamingFlowGraphBuilder::BuildForStatement(TokenPosition* position) {
   intptr_t offset = ReaderOffset() - 1;  // Include the tag.
 
-  const TokenPosition position = ReadPosition();  // read position.
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
 
   Fragment declarations;
 
@@ -4493,7 +4542,7 @@
 
   intptr_t list_length = ReadListLength();  // read number of variables.
   for (intptr_t i = 0; i < list_length; ++i) {
-    declarations += BuildVariableDeclaration();  // read ith variable.
+    declarations += BuildVariableDeclaration(nullptr);  // read ith variable.
   }
 
   Tag tag = ReadTag();  // Read first part of condition.
@@ -4517,7 +4566,7 @@
   }
 
   Fragment body(body_entry);
-  body += BuildStatement();  // read body.
+  body += BuildStatementWithBranchCoverage();  // read body.
 
   if (body.is_open()) {
     // We allocated a fresh context before the loop which contains captured
@@ -4535,7 +4584,7 @@
     body += Goto(join);
 
     Fragment loop(join);
-    loop += CheckStackOverflow(position);  // may have non-empty stack
+    loop += CheckStackOverflow(pos);  // may have non-empty stack
     if (condition.entry != nullptr) {
       loop <<= condition.entry;
     } else {
@@ -4558,10 +4607,14 @@
   return loop;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildForInStatement(bool async) {
+Fragment StreamingFlowGraphBuilder::BuildForInStatement(
+    bool async,
+    TokenPosition* position) {
   intptr_t offset = ReaderOffset() - 1;  // Include the tag.
 
-  const TokenPosition position = ReadPosition();  // read position.
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
+
   TokenPosition body_position = ReadPosition();   // read body position.
   intptr_t variable_kernel_position = ReaderOffset() + data_program_offset_;
   SkipVariableDeclaration();  // read variable.
@@ -4596,7 +4649,7 @@
   body += StoreLocal(TokenPosition::kNoSource,
                      LookupVariable(variable_kernel_position));
   body += Drop();
-  body += BuildStatement();  // read body.
+  body += BuildStatementWithBranchCoverage();  // read body.
   body += ExitScope(offset);
 
   if (body.is_open()) {
@@ -4605,7 +4658,7 @@
     body += Goto(join);
 
     Fragment loop(join);
-    loop += CheckStackOverflow(position);  // may have non-empty stack
+    loop += CheckStackOverflow(pos);  // may have non-empty stack
     loop += condition;
   } else {
     instructions += condition;
@@ -4616,8 +4669,11 @@
   return Fragment(instructions.entry, loop_exit);
 }
 
-Fragment StreamingFlowGraphBuilder::BuildSwitchStatement() {
-  ReadPosition();  // read position.
+Fragment StreamingFlowGraphBuilder::BuildSwitchStatement(
+    TokenPosition* position) {
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
+
   // We need the number of cases. So start by getting that, then go back.
   intptr_t offset = ReaderOffset();
   SkipExpression();                   // temporarily skip condition
@@ -4653,9 +4709,9 @@
     bool is_default = ReadBool();  // read is_default.
     if (is_default) default_case = i;
     Fragment& body_fragment = body_fragments[i] =
-        BuildStatement();  // read body.
+        BuildStatementWithBranchCoverage();  // read body.
 
-    if (body_fragment.entry == NULL) {
+    if (body_fragment.entry == nullptr) {
       // Make a NOP in order to ensure linking works properly.
       body_fragment = NullConstant();
       body_fragment += Drop();
@@ -4742,7 +4798,7 @@
         current_instructions += body_fragments[i];
       }
     } else {
-      JoinEntryInstr* body_join = NULL;
+      JoinEntryInstr* body_join = nullptr;
       if (block.HadJumper(i)) {
         body_join = block.DestinationDirect(i);
         body_fragments[i] = Fragment(body_join) + body_fragments[i];
@@ -4752,19 +4808,19 @@
         TargetEntryInstr* then;
         TargetEntryInstr* otherwise;
 
-        TokenPosition position = ReadPosition();  // read jth position.
+        const TokenPosition pos = ReadPosition();  // read jth position.
         current_instructions += Constant(
             Instance::ZoneHandle(Z, constant_reader_.ReadConstantExpression()));
         current_instructions += LoadLocal(scopes()->switch_variable);
         current_instructions +=
-            InstanceCall(position, Symbols::EqualOperator(), Token::kEQ,
+            InstanceCall(pos, Symbols::EqualOperator(), Token::kEQ,
                          /*argument_count=*/2,
                          /*checked_argument_count=*/2);
         current_instructions += BranchIfTrue(&then, &otherwise, false);
 
         Fragment then_fragment(then);
 
-        if (body_join != NULL) {
+        if (body_join != nullptr) {
           // There are several branches to the body, so we will make a goto to
           // the join block (the real body has already been prepended with a
           // join instruction).
@@ -4808,11 +4864,14 @@
   return Fragment(head_instructions.entry, current_instructions.current);
 }
 
-Fragment StreamingFlowGraphBuilder::BuildContinueSwitchStatement() {
-  TokenPosition position = ReadPosition();  // read position.
+Fragment StreamingFlowGraphBuilder::BuildContinueSwitchStatement(
+    TokenPosition* position) {
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
+
   intptr_t target_index = ReadUInt();       // read target index.
 
-  TryFinallyBlock* outer_finally = NULL;
+  TryFinallyBlock* outer_finally = nullptr;
   intptr_t target_context_depth = -1;
   JoinEntryInstr* entry = switch_block()->Destination(
       target_index, &outer_finally, &target_context_depth);
@@ -4821,25 +4880,26 @@
   instructions +=
       TranslateFinallyFinalizers(outer_finally, target_context_depth);
   if (instructions.is_open()) {
-    if (NeedsDebugStepCheck(parsed_function()->function(), position)) {
-      instructions += DebugStepCheck(position);
+    if (NeedsDebugStepCheck(parsed_function()->function(), pos)) {
+      instructions += DebugStepCheck(pos);
     }
     instructions += Goto(entry);
   }
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildIfStatement() {
-  ReadPosition();  // read position.
+Fragment StreamingFlowGraphBuilder::BuildIfStatement(TokenPosition* position) {
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
 
   TestFragment condition = TranslateConditionForControl();
 
   Fragment then_fragment(condition.CreateTrueSuccessor(flow_graph_builder_));
-  then_fragment += BuildStatement();  // read then.
+  then_fragment += BuildStatementWithBranchCoverage();  // read then.
 
   Fragment otherwise_fragment(
       condition.CreateFalseSuccessor(flow_graph_builder_));
-  otherwise_fragment += BuildStatement();  // read otherwise.
+  otherwise_fragment += BuildStatementWithBranchCoverage();  // read otherwise.
 
   if (then_fragment.is_open()) {
     if (otherwise_fragment.is_open()) {
@@ -4857,11 +4917,14 @@
   }
 }
 
-Fragment StreamingFlowGraphBuilder::BuildReturnStatement() {
-  TokenPosition position = ReadPosition();  // read position.
-  Tag tag = ReadTag();                      // read first part of expression.
+Fragment StreamingFlowGraphBuilder::BuildReturnStatement(
+    TokenPosition* position) {
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
 
-  bool inside_try_finally = try_finally_block() != NULL;
+  Tag tag = ReadTag();  // read first part of expression.
+
+  bool inside_try_finally = try_finally_block() != nullptr;
 
   Fragment instructions = tag == kNothing
                               ? NullConstant()
@@ -4873,10 +4936,10 @@
           scopes()->finally_return_variable;
       ASSERT(finally_return_variable != nullptr);
       const Function& function = parsed_function()->function();
-      if (NeedsDebugStepCheck(function, position)) {
-        instructions += DebugStepCheck(position);
+      if (NeedsDebugStepCheck(function, pos)) {
+        instructions += DebugStepCheck(pos);
       }
-      instructions += StoreLocal(position, finally_return_variable);
+      instructions += StoreLocal(pos, finally_return_variable);
       instructions += Drop();
       const intptr_t target_context_depth =
           finally_return_variable->is_captured()
@@ -4893,7 +4956,7 @@
         B->context_depth_ = saved_context_depth;
       }
     } else {
-      instructions += Return(position);
+      instructions += Return(pos);
     }
   } else {
     Pop();
@@ -4902,7 +4965,7 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildTryCatch() {
+Fragment StreamingFlowGraphBuilder::BuildTryCatch(TokenPosition* position) {
   ASSERT(block_expression_depth() == 0);  // no try-catch in block-expr
   InlineBailout("kernel::FlowgraphBuilder::VisitTryCatch");
 
@@ -4914,7 +4977,7 @@
   try_depth_inc();
   {
     TryCatchBlock block(flow_graph_builder_, try_handler_index);
-    try_body += BuildStatement();  // read body.
+    try_body += BuildStatementWithBranchCoverage(position);  // read body.
     try_body += Goto(after_try);
   }
   try_depth_dec();
@@ -4937,7 +5000,7 @@
   // Fill in the body of the catch.
   for (intptr_t i = 0; i < catch_count; ++i) {
     intptr_t catch_offset = ReaderOffset();          // Catch has no tag.
-    TokenPosition position = ReadPosition();         // read position.
+    TokenPosition pos = ReadPosition();              // read position.
     const AbstractType& type_guard = T.BuildType();  // read guard.
     handler_types.SetAt(i, type_guard);
 
@@ -4967,7 +5030,7 @@
       CatchBlock block(flow_graph_builder_, CurrentException(),
                        CurrentStackTrace(), try_handler_index);
 
-      catch_handler_body += BuildStatement();  // read body.
+      catch_handler_body += BuildStatementWithBranchCoverage();  // read body.
 
       // Note: ExitScope adjusts context_depth_ so even if catch_handler_body
       // is closed we still need to execute ExitScope for its side effect.
@@ -4994,9 +5057,9 @@
 
       catch_body += Constant(type_guard);
 
-      catch_body += InstanceCall(
-          position, Library::PrivateCoreLibName(Symbols::_instanceOf()),
-          Token::kIS, 4);
+      catch_body +=
+          InstanceCall(pos, Library::PrivateCoreLibName(Symbols::_instanceOf()),
+                       Token::kIS, 4);
 
       TargetEntryInstr* catch_entry;
       TargetEntryInstr* next_catch_entry;
@@ -5023,7 +5086,7 @@
   return Fragment(try_body.entry, after_try);
 }
 
-Fragment StreamingFlowGraphBuilder::BuildTryFinally() {
+Fragment StreamingFlowGraphBuilder::BuildTryFinally(TokenPosition* position) {
   ASSERT(block_expression_depth() == 0);  // no try-finally in block-expr
   // Note on streaming:
   // We only stream this TryFinally if we can stream everything inside it,
@@ -5068,7 +5131,7 @@
   {
     TryFinallyBlock tfb(flow_graph_builder_, finalizer_offset);
     TryCatchBlock tcb(flow_graph_builder_, try_handler_index);
-    try_body += BuildStatement();  // read body.
+    try_body += BuildStatementWithBranchCoverage(position);  // read body.
   }
   try_depth_dec();
 
@@ -5081,7 +5144,7 @@
     try_body += Goto(finally_entry);
 
     Fragment finally_body(finally_entry);
-    finally_body += BuildStatement();  // read finalizer.
+    finally_body += BuildStatementWithBranchCoverage();  // read finalizer.
     finally_body += Goto(after_try);
   }
 
@@ -5094,7 +5157,7 @@
                                           /* needs_stacktrace = */ false,
                                           /* is_synthesized = */ true);
   SetOffset(finalizer_offset);
-  finally_body += BuildStatement();  // read finalizer
+  finally_body += BuildStatementWithBranchCoverage();  // read finalizer
   if (finally_body.is_open()) {
     finally_body += LoadLocal(CurrentException());
     finally_body += LoadLocal(CurrentStackTrace());
@@ -5107,10 +5170,12 @@
   return Fragment(try_body.entry, after_try);
 }
 
-Fragment StreamingFlowGraphBuilder::BuildYieldStatement() {
-  TokenPosition position = ReadPosition();  // read position.
-  uint8_t flags = ReadByte();               // read flags.
+Fragment StreamingFlowGraphBuilder::BuildYieldStatement(
+    TokenPosition* position) {
+  const TokenPosition pos = ReadPosition();  // read position.
+  if (position != nullptr) *position = pos;
 
+  uint8_t flags = ReadByte();          // read flags.
   ASSERT(flags == kNativeYieldFlags);  // Must have been desugared.
 
   // Setup yield/continue point:
@@ -5137,11 +5202,11 @@
       StoreLocal(TokenPosition::kNoSource, scopes()->yield_context_variable);
   instructions += Drop();
   instructions += BuildExpression();  // read expression.
-  instructions += Return(position, new_yield_pos);
+  instructions += Return(pos, new_yield_pos);
 
   // Note: DropTempsInstr serves as an anchor instruction. It will not
   // be linked into the resulting graph.
-  DropTempsInstr* anchor = new (Z) DropTempsInstr(0, NULL);
+  DropTempsInstr* anchor = new (Z) DropTempsInstr(0, nullptr);
   yield_continuations().Add(YieldContinuation(anchor, CurrentTryIndex()));
 
   Fragment continuation(instructions.entry, anchor);
@@ -5181,7 +5246,7 @@
     rethrow += LoadLocal(exception_var);
     rethrow += LoadLocal(stack_trace_var);
 
-    rethrow += RethrowException(position, kInvalidTryIndex);
+    rethrow += RethrowException(pos, kInvalidTryIndex);
     Drop();
 
     // Set current to the end of the no_error branch.
@@ -5191,7 +5256,8 @@
   return continuation;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildVariableDeclaration() {
+Fragment StreamingFlowGraphBuilder::BuildVariableDeclaration(
+    TokenPosition* position) {
   intptr_t kernel_position_no_tag = ReaderOffset() + data_program_offset_;
   LocalVariable* variable = LookupVariable(kernel_position_no_tag);
 
@@ -5225,6 +5291,7 @@
   const TokenPosition debug_position = helper.equals_position_.IsReal()
                                            ? helper.equals_position_
                                            : helper.position_;
+  if (position != nullptr) *position = helper.position_;
   if (NeedsDebugStepCheck(stack(), debug_position)) {
     instructions = DebugStepCheck(debug_position) + instructions;
   }
@@ -5233,8 +5300,12 @@
   return instructions;
 }
 
-Fragment StreamingFlowGraphBuilder::BuildFunctionDeclaration(intptr_t offset) {
-  TokenPosition position = ReadPosition();
+Fragment StreamingFlowGraphBuilder::BuildFunctionDeclaration(
+    intptr_t offset,
+    TokenPosition* position) {
+  const TokenPosition pos = ReadPosition();
+  if (position != nullptr) *position = pos;
+
   const intptr_t variable_offset = ReaderOffset() + data_program_offset_;
 
   // Read variable declaration.
@@ -5263,10 +5334,10 @@
 
   helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
 
-  Fragment instructions = DebugStepCheck(position);
-  instructions += BuildFunctionNode(position, helper.name_index_,
+  Fragment instructions = DebugStepCheck(pos);
+  instructions += BuildFunctionNode(pos, helper.name_index_,
                                     has_valid_annotation, has_pragma, offset);
-  instructions += StoreLocal(position, LookupVariable(variable_offset));
+  instructions += StoreLocal(pos, LookupVariable(variable_offset));
   instructions += Drop();
   return instructions;
 }
@@ -5470,6 +5541,109 @@
   return code;
 }
 
+static void ReportIfNotNull(const char* error) {
+  if (error != nullptr) {
+    const auto& language_error = Error::Handle(
+        LanguageError::New(String::Handle(String::New(error, Heap::kOld)),
+                           Report::kError, Heap::kOld));
+    Report::LongJump(language_error);
+  }
+}
+
+Fragment StreamingFlowGraphBuilder::BuildLoadAbiSpecificInt(bool at_index) {
+  const intptr_t argument_count = ReadUInt();     // Read argument count.
+  ASSERT(argument_count == 2);                    // TypedDataBase, offset/index
+  const intptr_t list_length = ReadListLength();  // Read types list length.
+  ASSERT(list_length == 1);                       // AbiSpecificInt.
+  // Read types.
+  const TypeArguments& type_arguments = T.BuildTypeArguments(list_length);
+  const AbstractType& type_argument =
+      AbstractType::Handle(type_arguments.TypeAt(0));
+
+  // AbiSpecificTypes can have an incomplete mapping.
+  const char* error = nullptr;
+  const auto* native_type =
+      compiler::ffi::NativeType::FromAbstractType(zone_, type_argument, &error);
+  ReportIfNotNull(error);
+
+  Fragment code;
+  // Read positional argument count.
+  const intptr_t positional_count = ReadListLength();
+  ASSERT(positional_count == 2);
+  code += BuildExpression();  // Argument 1: typedDataBase.
+  code += BuildExpression();  // Argument 2: offsetInBytes or index.
+  if (at_index) {
+    code += IntConstant(native_type->SizeInBytes());
+    code += B->BinaryIntegerOp(Token::kMUL, kTagged, /* truncate= */ true);
+  }
+
+  // Skip (empty) named arguments list.
+  const intptr_t named_args_len = ReadListLength();
+  ASSERT(named_args_len == 0);
+
+  // This call site is not guaranteed to be optimized. So, do a call to the
+  // correct force optimized function instead of compiling the body.
+  MethodRecognizer::Kind kind = compiler::ffi::FfiLoad(*native_type);
+  const char* function_name = MethodRecognizer::KindToFunctionNameCString(kind);
+  const Library& ffi_library = Library::Handle(Z, Library::FfiLibrary());
+  const Function& target = Function::ZoneHandle(
+      Z, ffi_library.LookupFunctionAllowPrivate(
+             String::Handle(Z, String::New(function_name))));
+  Array& argument_names = Array::ZoneHandle(Z);
+  code += StaticCall(TokenPosition::kNoSource, target, argument_count,
+                     argument_names, ICData::kStatic);
+
+  return code;
+}
+
+Fragment StreamingFlowGraphBuilder::BuildStoreAbiSpecificInt(bool at_index) {
+  const intptr_t argument_count = ReadUInt();
+  ASSERT(argument_count == 3);
+  const intptr_t list_length = ReadListLength();
+  ASSERT(list_length == 1);
+  // Read types.
+  const TypeArguments& type_arguments = T.BuildTypeArguments(list_length);
+  const AbstractType& type_argument =
+      AbstractType::Handle(type_arguments.TypeAt(0));
+
+  // AbiSpecificTypes can have an incomplete mapping.
+  const char* error = nullptr;
+  const auto* native_type =
+      compiler::ffi::NativeType::FromAbstractType(zone_, type_argument, &error);
+  ReportIfNotNull(error);
+
+  Fragment code;
+  // Read positional argument count.
+  const intptr_t positional_count = ReadListLength();
+  ASSERT(positional_count == 3);
+  code += BuildExpression();  // Argument 1: typedDataBase.
+  code += BuildExpression();  // Argument 2: offsetInBytes or index.
+  if (at_index) {
+    code += IntConstant(native_type->SizeInBytes());
+    code += B->BinaryIntegerOp(Token::kMUL, kTagged, /* truncate= */ true);
+  }
+  code += BuildExpression();  // Argument 3: value
+
+  // Skip (empty) named arguments list.
+  const intptr_t named_args_len = ReadListLength();
+  ASSERT(named_args_len == 0);
+
+  // This call site is not guaranteed to be optimized. So, do a call to the
+  // correct force optimized function instead of compiling the body.
+  MethodRecognizer::Kind kind = compiler::ffi::FfiStore(*native_type);
+  const char* function_name = MethodRecognizer::KindToFunctionNameCString(kind);
+  const Library& ffi_library = Library::Handle(Z, Library::FfiLibrary());
+  const Function& target = Function::ZoneHandle(
+      Z, ffi_library.LookupFunctionAllowPrivate(
+             String::Handle(Z, String::New(function_name))));
+  ASSERT(!target.IsNull());
+  Array& argument_names = Array::ZoneHandle(Z);
+  code += StaticCall(TokenPosition::kNoSource, target, argument_count,
+                     argument_names, ICData::kStatic);
+
+  return code;
+}
+
 Fragment StreamingFlowGraphBuilder::BuildFfiAsFunctionInternal() {
   const intptr_t argc = ReadUInt();               // Read argument count.
   ASSERT(argc == 2);                              // Pointer, isLeaf.
@@ -5548,6 +5722,11 @@
       ReadListLength();  // Skip (empty) named arguments list.
   ASSERT(named_args_len == 0);
 
+  // AbiSpecificTypes can have an incomplete mapping.
+  const char* error = nullptr;
+  compiler::ffi::NativeFunctionTypeFromFunctionType(zone_, native_sig, &error);
+  ReportIfNotNull(error);
+
   const Function& result =
       Function::ZoneHandle(Z, compiler::ffi::NativeCallbackFunction(
                                   native_sig, target, exceptional_return));
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 3cd6257..8fe4c5c 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -68,8 +68,9 @@
   Fragment BuildInitializers(const Class& parent_class);
   FlowGraph* BuildGraphOfFunction(bool constructor);
 
-  Fragment BuildExpression(TokenPosition* position = NULL);
-  Fragment BuildStatement();
+  Fragment BuildExpression(TokenPosition* position = nullptr);
+  Fragment BuildStatement(TokenPosition* position = nullptr);
+  Fragment BuildStatementWithBranchCoverage(TokenPosition* position = nullptr);
 
   // Kernel offset:
   //   start of function expression -> end of function body statement
@@ -178,7 +179,7 @@
                       intptr_t argument_count,
                       const Array& argument_names,
                       ICData::RebindRule rebind_rule,
-                      const InferredTypeMetadata* result_type = NULL,
+                      const InferredTypeMetadata* result_type = nullptr,
                       intptr_t type_args_len = 0,
                       bool use_unchecked_entry = false);
   Fragment InstanceCall(TokenPosition position,
@@ -199,7 +200,8 @@
       const InferredTypeMetadata* result_type = nullptr,
       bool use_unchecked_entry = false,
       const CallSiteAttributesMetadata* call_site_attrs = nullptr,
-      bool receiver_is_not_smi = false);
+      bool receiver_is_not_smi = false,
+      bool is_call_on_this = false);
 
   Fragment ThrowException(TokenPosition position);
   Fragment BooleanNegate();
@@ -254,6 +256,7 @@
   Fragment BuildImplicitClosureCreation(const Function& target);
   Fragment CheckBoolean(TokenPosition position);
   Fragment CheckArgumentType(LocalVariable* variable, const AbstractType& type);
+  Fragment RecordCoverage(TokenPosition position);
   Fragment EnterScope(intptr_t kernel_offset,
                       const LocalScope** scope = nullptr);
   Fragment ExitScope(intptr_t kernel_offset);
@@ -331,26 +334,26 @@
   Fragment BuildLibraryPrefixAction(TokenPosition* position,
                                     const String& selector);
 
-  Fragment BuildExpressionStatement();
-  Fragment BuildBlock();
+  Fragment BuildExpressionStatement(TokenPosition* position);
+  Fragment BuildBlock(TokenPosition* position);
   Fragment BuildEmptyStatement();
-  Fragment BuildAssertBlock();
-  Fragment BuildAssertStatement();
-  Fragment BuildLabeledStatement();
-  Fragment BuildBreakStatement();
-  Fragment BuildWhileStatement();
-  Fragment BuildDoStatement();
-  Fragment BuildForStatement();
-  Fragment BuildForInStatement(bool async);
-  Fragment BuildSwitchStatement();
-  Fragment BuildContinueSwitchStatement();
-  Fragment BuildIfStatement();
-  Fragment BuildReturnStatement();
-  Fragment BuildTryCatch();
-  Fragment BuildTryFinally();
-  Fragment BuildYieldStatement();
-  Fragment BuildVariableDeclaration();
-  Fragment BuildFunctionDeclaration(intptr_t offset);
+  Fragment BuildAssertBlock(TokenPosition* position);
+  Fragment BuildAssertStatement(TokenPosition* position);
+  Fragment BuildLabeledStatement(TokenPosition* position);
+  Fragment BuildBreakStatement(TokenPosition* position);
+  Fragment BuildWhileStatement(TokenPosition* position);
+  Fragment BuildDoStatement(TokenPosition* position);
+  Fragment BuildForStatement(TokenPosition* position);
+  Fragment BuildForInStatement(bool async, TokenPosition* position);
+  Fragment BuildSwitchStatement(TokenPosition* position);
+  Fragment BuildContinueSwitchStatement(TokenPosition* position);
+  Fragment BuildIfStatement(TokenPosition* position);
+  Fragment BuildReturnStatement(TokenPosition* position);
+  Fragment BuildTryCatch(TokenPosition* position);
+  Fragment BuildTryFinally(TokenPosition* position);
+  Fragment BuildYieldStatement(TokenPosition* position);
+  Fragment BuildVariableDeclaration(TokenPosition* position);
+  Fragment BuildFunctionDeclaration(intptr_t offset, TokenPosition* position);
   Fragment BuildFunctionNode(TokenPosition parent_position,
                              StringIndex name_index,
                              bool has_valid_annotation,
@@ -360,6 +363,15 @@
   // Build flow graph for '_nativeEffect'.
   Fragment BuildNativeEffect();
 
+  // Build flow graph for '_loadAbiSpecificInt' and
+  // '_loadAbiSpecificIntAtIndex', '_storeAbiSpecificInt', and
+  // '_storeAbiSpecificIntAtIndex' call sites.
+  //
+  // The second argument is either offsetInBytes (at_index==false), or
+  // index (at_index==true).
+  Fragment BuildLoadAbiSpecificInt(bool at_index);
+  Fragment BuildStoreAbiSpecificInt(bool at_index);
+
   // Build FG for '_asFunctionInternal'. Reads an Arguments from the
   // Kernel buffer and pushes the resulting closure.
   Fragment BuildFfiAsFunctionInternal();
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index efd2f8e..dba179a 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -347,7 +347,8 @@
     const InferredTypeMetadata* result_type,
     bool use_unchecked_entry,
     const CallSiteAttributesMetadata* call_site_attrs,
-    bool receiver_is_not_smi) {
+    bool receiver_is_not_smi,
+    bool is_call_on_this) {
   const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0);
   InputsArray* arguments = GetArguments(total_count);
   InstanceCallInstr* call = new (Z) InstanceCallInstr(
@@ -360,6 +361,9 @@
   if (use_unchecked_entry) {
     call->set_entry_kind(Code::EntryKind::kUnchecked);
   }
+  if (is_call_on_this) {
+    call->mark_as_call_on_this();
+  }
   if (call_site_attrs != nullptr && call_site_attrs->receiver_type != nullptr &&
       call_site_attrs->receiver_type->IsInstantiated()) {
     call->set_receivers_static_type(call_site_attrs->receiver_type);
@@ -398,19 +402,6 @@
   return body;
 }
 
-Fragment FlowGraphBuilder::ThrowException(TokenPosition position) {
-  Fragment instructions;
-  Value* exception = Pop();
-  instructions += Fragment(new (Z) ThrowInstr(InstructionSource(position),
-                                              GetNextDeoptId(), exception))
-                      .closed();
-  // Use its side effect of leaving a constant on the stack (does not change
-  // the graph).
-  NullConstant();
-
-  return instructions;
-}
-
 Fragment FlowGraphBuilder::RethrowException(TokenPosition position,
                                             int catch_try_index) {
   Fragment instructions;
@@ -864,6 +855,16 @@
     case MethodRecognizer::kFfiStorePointer:
     case MethodRecognizer::kFfiFromAddress:
     case MethodRecognizer::kFfiGetAddress:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt8:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt16:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt32:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt64:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint8:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint16:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint32:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint64:
+    case MethodRecognizer::kFfiAsExternalTypedDataFloat:
+    case MethodRecognizer::kFfiAsExternalTypedDataDouble:
     case MethodRecognizer::kGetNativeField:
     case MethodRecognizer::kObjectEquals:
     case MethodRecognizer::kStringBaseLength:
@@ -926,7 +927,7 @@
     case MethodRecognizer::kDoubleFloorToInt:
       if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
 #if defined(TARGET_ARCH_X64)
-      return CompilerState::Current().is_aot();
+      return CompilerState::Current().is_aot() || FLAG_target_unknown_cpu;
 #elif defined(TARGET_ARCH_ARM64)
       return true;
 #else
@@ -1545,6 +1546,50 @@
       body += Constant(Bool::False());
 #endif  // defined(ARCH_IS_64_BIT)
     } break;
+    case MethodRecognizer::kFfiAsExternalTypedDataInt8:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt16:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt32:
+    case MethodRecognizer::kFfiAsExternalTypedDataInt64:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint8:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint16:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint32:
+    case MethodRecognizer::kFfiAsExternalTypedDataUint64:
+    case MethodRecognizer::kFfiAsExternalTypedDataFloat:
+    case MethodRecognizer::kFfiAsExternalTypedDataDouble: {
+      const classid_t ffi_type_arg_cid =
+          compiler::ffi::RecognizedMethodTypeArgCid(kind);
+      const classid_t external_typed_data_cid =
+          compiler::ffi::ElementExternalTypedDataCid(ffi_type_arg_cid);
+
+      auto class_table = thread_->isolate_group()->class_table();
+      ASSERT(class_table->HasValidClassAt(external_typed_data_cid));
+      const auto& typed_data_class =
+          Class::ZoneHandle(H.zone(), class_table->At(external_typed_data_cid));
+
+      // We assume that the caller has checked that the arguments are non-null
+      // and length is in the range [0, kSmiMax/elementSize].
+      ASSERT_EQUAL(function.NumParameters(), 2);
+      LocalVariable* arg_pointer = parsed_function_->RawParameterVariable(0);
+      LocalVariable* arg_length = parsed_function_->RawParameterVariable(1);
+
+      body += AllocateObject(TokenPosition::kNoSource, typed_data_class, 0);
+      LocalVariable* typed_data_object = MakeTemporary();
+
+      // Initialize the result's length field.
+      body += LoadLocal(typed_data_object);
+      body += LoadLocal(arg_length);
+      body += StoreNativeField(Slot::TypedDataBase_length(),
+                               StoreInstanceFieldInstr::Kind::kInitializing,
+                               kNoStoreBarrier);
+
+      // Initialize the result's data pointer field.
+      body += LoadLocal(typed_data_object);
+      body += LoadLocal(arg_pointer);
+      body += LoadNativeField(Slot::Pointer_data_field());
+      body += StoreNativeField(Slot::TypedDataBase_data_field(),
+                               StoreInstanceFieldInstr::Kind::kInitializing,
+                               kNoStoreBarrier);
+    } break;
     case MethodRecognizer::kGetNativeField: {
       auto& name = String::ZoneHandle(Z, function.name());
       // Note: This method is force optimized so we can push untagged, etc.
@@ -1769,7 +1814,7 @@
   if (auto const alloc = definition->AsAllocateClosure()) {
     return !alloc->known_function().IsNull();
   }
-  return definition->IsLoadLocal();
+  return definition->IsLoadLocal() || definition->IsAssertAssignable();
 }
 
 Fragment FlowGraphBuilder::EvaluateAssertion() {
@@ -3083,7 +3128,7 @@
 
   if (is_closure_call) {
     body += LoadLocal(closure);
-    if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+    if (!FLAG_precompiled_mode) {
       // Lookup the function in the closure.
       body += LoadNativeField(Slot::Closure_function());
     }
@@ -4430,7 +4475,14 @@
   Fragment function_body(instruction_cursor);
   function_body += CheckStackOverflowInPrologue(function.token_pos());
 
-  const auto& marshaller = *new (Z) compiler::ffi::CallMarshaller(Z, function);
+  const char* error = nullptr;
+  const auto marshaller_ptr =
+      compiler::ffi::CallMarshaller::FromFunction(Z, function, &error);
+  // AbiSpecific integers can be incomplete causing us to not know the calling
+  // convention. However, this is caught in asFunction in both JIT/AOT.
+  RELEASE_ASSERT(error == nullptr);
+  RELEASE_ASSERT(marshaller_ptr != nullptr);
+  const auto& marshaller = *marshaller_ptr;
 
   const bool signature_contains_handles = marshaller.ContainsHandles();
 
@@ -4576,8 +4628,14 @@
 }
 
 FlowGraph* FlowGraphBuilder::BuildGraphOfFfiCallback(const Function& function) {
-  const auto& marshaller =
-      *new (Z) compiler::ffi::CallbackMarshaller(Z, function);
+  const char* error = nullptr;
+  const auto marshaller_ptr =
+      compiler::ffi::CallbackMarshaller::FromFunction(Z, function, &error);
+  // AbiSpecific integers can be incomplete causing us to not know the calling
+  // convention. However, this is caught fromFunction in both JIT/AOT.
+  RELEASE_ASSERT(error == nullptr);
+  RELEASE_ASSERT(marshaller_ptr != nullptr);
+  const auto& marshaller = *marshaller_ptr;
 
   graph_entry_ =
       new (Z) GraphEntryInstr(*parsed_function_, Compiler::kNoOSRDeoptId);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 6dfc141..cb66e59 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -191,11 +191,11 @@
       const InferredTypeMetadata* result_type = nullptr,
       bool use_unchecked_entry = false,
       const CallSiteAttributesMetadata* call_site_attrs = nullptr,
-      bool receiver_is_not_smi = false);
+      bool receiver_is_not_smi = false,
+      bool is_call_on_this = false);
 
   Fragment FfiCall(const compiler::ffi::CallMarshaller& marshaller);
 
-  Fragment ThrowException(TokenPosition position);
   Fragment RethrowException(TokenPosition position, int catch_try_index);
   Fragment LoadLocal(LocalVariable* variable);
   Fragment IndirectGoto(intptr_t target_count);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 378ea73..86b49ff 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -3639,7 +3639,7 @@
   // TODO(dartbug.com/32292): accept unboxed parameters and return value
   // when FLAG_use_table_dispatch == false.
   if (FLAG_precompiled_mode && unboxing_info != nullptr &&
-      FLAG_use_table_dispatch && FLAG_use_bare_instructions) {
+      FLAG_use_table_dispatch) {
     for (intptr_t i = 0; i < unboxing_info->unboxed_args_info.length(); i++) {
       SetupUnboxingInfoOfParameter(function, i, unboxing_info);
     }
@@ -3658,7 +3658,7 @@
   // TODO(dartbug.com/32292): accept unboxed parameters and return value
   // when FLAG_use_table_dispatch == false.
   if (FLAG_precompiled_mode && unboxing_info != nullptr &&
-      FLAG_use_table_dispatch && FLAG_use_bare_instructions) {
+      FLAG_use_table_dispatch) {
     if (field_accessor.IsImplicitSetterFunction()) {
       for (intptr_t i = 0; i < unboxing_info->unboxed_args_info.length(); i++) {
         SetupUnboxingInfoOfParameter(field_accessor, i, unboxing_info);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index cfe75b0..35b2647 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -716,6 +716,7 @@
     kIsEliminatedMixin = 1 << 3,
     kFlagMixinDeclaration = 1 << 4,
     kHasConstConstructor = 1 << 5,
+    kIsMacro = 1 << 6,
   };
 
   explicit ClassHelper(KernelReaderHelper* helper)
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index 85ed2b5..18abb34 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -966,20 +966,10 @@
 }
 
 bool GraphIntrinsifier::Build_Integer_mod(FlowGraph* flow_graph) {
-#if defined(TARGET_ARCH_ARM)
-  if (!TargetCPUFeatures::can_divide()) {
-    return false;
-  }
-#endif
   return BuildBinarySmiOp(flow_graph, Token::kMOD);
 }
 
 bool GraphIntrinsifier::Build_Integer_truncDivide(FlowGraph* flow_graph) {
-#if defined(TARGET_ARCH_ARM)
-  if (!TargetCPUFeatures::can_divide()) {
-    return false;
-  }
-#endif
   return BuildBinarySmiOp(flow_graph, Token::kTRUNCDIV);
 }
 
@@ -1050,7 +1040,8 @@
   // [Intrinsifier::CanIntrinsifyFieldAccessor])
   auto zone = flow_graph->zone();
   const auto& function = flow_graph->function();
-  ASSERT(Intrinsifier::CanIntrinsifyFieldAccessor(function));
+  ASSERT(
+      Intrinsifier::CanIntrinsifyFieldAccessor(flow_graph->parsed_function()));
 
   auto& field = Field::Handle(zone, function.accessor_field());
   if (CompilerState::Current().should_clone_fields()) {
@@ -1072,12 +1063,10 @@
 
   // We only support cases where we do not have to create a box (whose
   // allocation could fail).
-  ASSERT(function.HasUnboxedReturnValue() ||
-         !FlowGraphCompiler::IsUnboxedField(field));
+  ASSERT(function.HasUnboxedReturnValue() || !slot.IsUnboxed());
 
   // We might need to unbox the field value before returning.
-  if (function.HasUnboxedReturnValue() &&
-      !FlowGraphCompiler::IsUnboxedField(field)) {
+  if (function.HasUnboxedReturnValue() && !slot.IsUnboxed()) {
     ASSERT(FLAG_precompiled_mode);
     field_value = builder.AddUnboxInstr(
         FlowGraph::ReturnRepresentationOf(flow_graph->function()),
@@ -1093,21 +1082,19 @@
   // [Intrinsifier::CanIntrinsifyFieldAccessor])
   auto zone = flow_graph->zone();
   const auto& function = flow_graph->function();
-  ASSERT(Intrinsifier::CanIntrinsifyFieldAccessor(function));
+  ASSERT(
+      Intrinsifier::CanIntrinsifyFieldAccessor(flow_graph->parsed_function()));
 
   auto& field = Field::Handle(zone, function.accessor_field());
   if (CompilerState::Current().should_clone_fields()) {
     field = field.CloneFromOriginal();
   }
   ASSERT(field.is_instance() && !field.is_final());
-  ASSERT(!function.HasUnboxedParameters() ||
-         FlowGraphCompiler::IsUnboxedField(field));
-
   const auto& slot = Slot::Get(field, &flow_graph->parsed_function());
+  ASSERT(!function.HasUnboxedParameters() || slot.IsUnboxed());
 
-  const auto barrier_mode = FlowGraphCompiler::IsUnboxedField(field)
-                                ? kNoStoreBarrier
-                                : kEmitStoreBarrier;
+  const auto barrier_mode =
+      slot.IsUnboxed() ? kNoStoreBarrier : kEmitStoreBarrier;
 
   flow_graph->CreateCommonConstants();
   GraphEntryInstr* graph_entry = flow_graph->graph_entry();
@@ -1118,14 +1105,13 @@
   auto value = builder.AddParameter(1, /*with_frame=*/false);
   VerifyParameterIsBoxed(&builder, 0);
 
-  if (!function.HasUnboxedParameters() &&
-      FlowGraphCompiler::IsUnboxedField(field)) {
+  if (!function.HasUnboxedParameters() && slot.IsUnboxed()) {
     // We do not support storing to possibly guarded fields in JIT in graph
     // intrinsics.
     ASSERT(FLAG_precompiled_mode);
-    value = builder.AddUnboxInstr(
-        FlowGraph::UnboxedFieldRepresentationOf(field), new Value(value),
-        /*is_checked=*/true);
+    value =
+        builder.AddUnboxInstr(slot.UnboxedRepresentation(), new Value(value),
+                              /*is_checked=*/true);
   }
 
   builder.AddInstruction(new (zone) StoreInstanceFieldInstr(
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index f343f73..072e8ca 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -25,7 +25,9 @@
 
 namespace compiler {
 
-bool Intrinsifier::CanIntrinsify(const Function& function) {
+bool Intrinsifier::CanIntrinsify(const ParsedFunction& parsed_function) {
+  const Function& function = parsed_function.function();
+
   if (FLAG_trace_intrinsifier) {
     THR_Print("CanIntrinsify %s ->", function.ToQualifiedCString());
   }
@@ -45,7 +47,8 @@
     }
     return false;
   }
-  if (!function.is_intrinsic() && !CanIntrinsifyFieldAccessor(function)) {
+  if (!function.is_intrinsic() &&
+      !CanIntrinsifyFieldAccessor(parsed_function)) {
     if (FLAG_trace_intrinsifier) {
       THR_Print("No, not intrinsic function.\n");
     }
@@ -73,7 +76,10 @@
   return true;
 }
 
-bool Intrinsifier::CanIntrinsifyFieldAccessor(const Function& function) {
+bool Intrinsifier::CanIntrinsifyFieldAccessor(
+    const ParsedFunction& parsed_function) {
+  const Function& function = parsed_function.function();
+
   const bool is_getter = function.IsImplicitGetterFunction();
   const bool is_setter = function.IsImplicitSetterFunction();
   if (!is_getter && !is_setter) return false;
@@ -97,11 +103,13 @@
   // We only graph intrinsify implicit instance getters/setter for now.
   if (!field.is_instance()) return false;
 
+  const auto& slot = Slot::Get(field, &parsed_function);
+
   if (is_getter) {
     // We don't support complex getter cases.
     if (field.is_late() || field.needs_load_guard()) return false;
 
-    if (FlowGraphCompiler::IsPotentialUnboxedField(field)) {
+    if (slot.IsPotentialUnboxed()) {
       if (function.HasUnboxedReturnValue()) {
         // In AOT mode: Unboxed fields contain the unboxed value and can be
         // returned in unboxed form.
@@ -136,7 +144,7 @@
     // avoid the need for boxing (which we cannot do in the intrinsic).
     if (function.HasUnboxedParameters()) {
       ASSERT(FLAG_precompiled_mode);
-      if (!FlowGraphCompiler::IsUnboxedField(field)) {
+      if (!slot.IsUnboxed()) {
         return false;
       }
     }
@@ -253,8 +261,7 @@
 // Returns true if fall-through code can be omitted.
 bool Intrinsifier::Intrinsify(const ParsedFunction& parsed_function,
                               FlowGraphCompiler* compiler) {
-  const Function& function = parsed_function.function();
-  if (!CanIntrinsify(function)) {
+  if (!CanIntrinsify(parsed_function)) {
     return false;
   }
 
@@ -262,14 +269,13 @@
     return compiler->intrinsic_slow_path_label()->IsUnused();
   }
 
+  const Function& function = parsed_function.function();
 #if !defined(HASH_IN_OBJECT_HEADER)
   // These two are more complicated on 32 bit platforms, where the
   // identity hash is not stored in the header of the object.  We
   // therefore don't intrinsify them, falling back on the native C++
   // implementations.
-  if (function.recognized_kind() == MethodRecognizer::kObject_getHash ||
-      function.recognized_kind() ==
-          MethodRecognizer::kObject_setHashIfNotSetYet) {
+  if (function.recognized_kind() == MethodRecognizer::kObject_getHash) {
     return false;
   }
 #endif
diff --git a/runtime/vm/compiler/intrinsifier.h b/runtime/vm/compiler/intrinsifier.h
index 835f73f..681b606 100644
--- a/runtime/vm/compiler/intrinsifier.h
+++ b/runtime/vm/compiler/intrinsifier.h
@@ -35,8 +35,8 @@
 
  private:
   friend class GraphIntrinsifier;  // For CanIntrinsifyFieldAccessor.
-  static bool CanIntrinsify(const Function& function);
-  static bool CanIntrinsifyFieldAccessor(const Function& function);
+  static bool CanIntrinsify(const ParsedFunction& parsed_function);
+  static bool CanIntrinsifyFieldAccessor(const ParsedFunction& parsed_function);
 };
 
 }  // namespace compiler
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index acdb7c6..ff96abb 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -94,7 +94,6 @@
 
     FLAG_background_compilation = false;
     FLAG_enable_mirrors = false;
-    FLAG_fields_may_be_reset = true;
     FLAG_interpret_irregexp = true;
     FLAG_lazy_dispatchers = false;
     FLAG_link_natives_lazily = true;
@@ -212,7 +211,7 @@
   ASSERT(thread->IsMutatorThread());
   const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
 
-  if (FLAG_enable_isolate_groups) {
+  {
     // Another isolate's mutator thread may have created [function] and
     // published it via an ICData, MegamorphicCache etc. Entering the lock below
     // is an acquire operation that pairs with the release operation when the
@@ -221,12 +220,6 @@
     SafepointReadRwLocker ml(thread, thread->isolate_group()->program_lock());
   }
 
-  // In single-isolate scenarios the lazy compile stub is only invoked if
-  // there's no existing code. In multi-isolate scenarios with shared JITed code
-  // we can end up in the lazy compile runtime entry here with code being
-  // installed.
-  ASSERT(!function.HasCode() || FLAG_enable_isolate_groups);
-
   // Will throw if compilation failed (e.g. with compile-time error).
   function.EnsureHasCode();
 }
@@ -511,6 +504,7 @@
 
       CompilerState compiler_state(thread(), /*is_aot=*/false, optimized(),
                                    CompilerState::ShouldTrace(function));
+      compiler_state.set_function(function);
 
       {
         // Extract type feedback before the graph is built, as the graph
@@ -584,10 +578,9 @@
           &speculative_policy, pass_state.inline_id_to_function,
           pass_state.inline_id_to_token_pos, pass_state.caller_inline_id,
           ic_data_array);
-      {
-        TIMELINE_DURATION(thread(), CompilerVerbose, "CompileGraph");
-        graph_compiler.CompileGraph();
-      }
+      pass_state.graph_compiler = &graph_compiler;
+      CompilerPass::GenerateCode(&pass_state);
+
       {
         TIMELINE_DURATION(thread(), CompilerVerbose, "FinalizeCompilation");
 
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.cc b/runtime/vm/compiler/jit/jit_call_specializer.cc
index 191e6bb..3afc611 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.cc
+++ b/runtime/vm/compiler/jit/jit_call_specializer.cc
@@ -162,57 +162,6 @@
   }
 }
 
-void JitCallSpecializer::VisitStoreInstanceField(
-    StoreInstanceFieldInstr* instr) {
-  if (instr->IsUnboxedDartFieldStore()) {
-    // Determine if this field should be unboxed based on the usage of getter
-    // and setter functions: The heuristic requires that the setter has a
-    // usage count of at least 1/kGetterSetterRatio of the getter usage count.
-    // This is to avoid unboxing fields where the setter is never or rarely
-    // executed.
-    const Field& field = instr->slot().field();
-    const String& field_name = String::Handle(Z, field.name());
-    const Class& owner = Class::Handle(Z, field.Owner());
-    const Function& getter =
-        Function::Handle(Z, owner.LookupGetterFunction(field_name));
-    const Function& setter =
-        Function::Handle(Z, owner.LookupSetterFunction(field_name));
-    bool unboxed_field = false;
-    if (!getter.IsNull() && !setter.IsNull()) {
-      if (field.is_double_initialized()) {
-        unboxed_field = true;
-      } else if ((setter.usage_counter() > 0) &&
-                 ((FLAG_getter_setter_ratio * setter.usage_counter()) >=
-                  getter.usage_counter())) {
-        unboxed_field = true;
-      }
-    }
-    if (!unboxed_field) {
-      if (FLAG_trace_optimization || FLAG_trace_field_guards) {
-        THR_Print("Disabling unboxing of %s\n", field.ToCString());
-        if (!setter.IsNull()) {
-          THR_Print("  setter usage count: %" Pd "\n", setter.usage_counter());
-        }
-        if (!getter.IsNull()) {
-          THR_Print("  getter usage count: %" Pd "\n", getter.usage_counter());
-        }
-      }
-      // We determined it's not beneficial for performance to unbox the
-      // field, therefore we mark it as boxed here.
-      //
-      // Calling `DisableFieldUnboxing` will cause transition the field to
-      // boxed and deoptimize dependent code.
-      //
-      // NOTE: It will also, as a side-effect, change our field clone's
-      // `is_unboxing_candidate()` bit. So we assume the compiler has so far
-      // not relied on this bit.
-      field.DisableFieldUnboxing();
-    } else {
-      flow_graph()->parsed_function().AddToGuardedFields(&field);
-    }
-  }
-}
-
 // Replace generic context allocation or cloning with a sequence of inlined
 // allocation and explicit initializing stores.
 // If context_value is not NULL then newly allocated context is a populated
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.h b/runtime/vm/compiler/jit/jit_call_specializer.h
index 8c743ed..ecbee73 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.h
+++ b/runtime/vm/compiler/jit/jit_call_specializer.h
@@ -27,7 +27,6 @@
   // Find a better place for them.
   virtual void VisitAllocateContext(AllocateContextInstr* instr);
   virtual void VisitCloneContext(CloneContextInstr* instr);
-  virtual void VisitStoreInstanceField(StoreInstanceFieldInstr* instr);
 
  private:
   virtual bool IsAllowedForInlining(intptr_t deopt_id) const;
diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc
index af01254..d847251 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -197,6 +197,12 @@
   return "?";
 }
 
+const char* MethodRecognizer::KindToFunctionNameCString(Kind kind) {
+  if (kind >= kUnknown && kind < kNumRecognizedMethods)
+    return recognized_methods[kind].function_name;
+  return "?";
+}
+
 // Is this method marked with the vm:recognized pragma?
 bool MethodRecognizer::IsMarkedAsRecognized(const Function& function,
                                             const char* kind) {
diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h
index e9a1067..3ea4247 100644
--- a/runtime/vm/compiler/method_recognizer.h
+++ b/runtime/vm/compiler/method_recognizer.h
@@ -52,6 +52,7 @@
 
   static intptr_t MethodKindToReceiverCid(Kind kind);
   static const char* KindToCString(Kind kind);
+  static const char* KindToFunctionNameCString(Kind kind);
 
   static bool IsMarkedAsRecognized(const Function& function,
                                    const char* kind = nullptr);
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 3ed3608..5cb46fc 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -191,28 +191,32 @@
   V(::, _asFunctionInternal, FfiAsFunctionInternal, 0x92ae104f)                \
   V(::, _nativeCallbackFunction, FfiNativeCallbackFunction, 0x3ff5ae9c)        \
   V(::, _nativeEffect, NativeEffect, 0x61e00b59)                               \
-  V(::, _loadInt8, FfiLoadInt8, 0x0f04dfd6)                                    \
-  V(::, _loadInt16, FfiLoadInt16, 0xec44312d)                                  \
-  V(::, _loadInt32, FfiLoadInt32, 0xee223fc3)                                  \
-  V(::, _loadInt64, FfiLoadInt64, 0xdeefbfa3)                                  \
-  V(::, _loadUint8, FfiLoadUint8, 0xe14e1cd1)                                  \
-  V(::, _loadUint16, FfiLoadUint16, 0x0cd65cea)                                \
-  V(::, _loadUint32, FfiLoadUint32, 0xf66e9055)                                \
-  V(::, _loadUint64, FfiLoadUint64, 0x0505fdcc)                                \
+  V(::, _loadAbiSpecificInt, FfiLoadAbiSpecificInt, 0x7807e872)                \
+  V(::, _loadAbiSpecificIntAtIndex, FfiLoadAbiSpecificIntAtIndex, 0x6aa4cab4)  \
+  V(::, _loadInt8, FfiLoadInt8, 0x0f04e397)                                    \
+  V(::, _loadInt16, FfiLoadInt16, 0xec4434ee)                                  \
+  V(::, _loadInt32, FfiLoadInt32, 0xee224384)                                  \
+  V(::, _loadInt64, FfiLoadInt64, 0xdeefc364)                                  \
+  V(::, _loadUint8, FfiLoadUint8, 0xe14e2092)                                  \
+  V(::, _loadUint16, FfiLoadUint16, 0x0cd660ab)                                \
+  V(::, _loadUint32, FfiLoadUint32, 0xf66e9416)                                \
+  V(::, _loadUint64, FfiLoadUint64, 0x0506018d)                                \
   V(::, _loadIntPtr, FfiLoadIntPtr, 0xebd9b43e)                                \
   V(::, _loadFloat, FfiLoadFloat, 0xf8d9845d)                                  \
   V(::, _loadFloatUnaligned, FfiLoadFloatUnaligned, 0xc8c8dfff)                \
   V(::, _loadDouble, FfiLoadDouble, 0xf70cc619)                                \
   V(::, _loadDoubleUnaligned, FfiLoadDoubleUnaligned, 0xc99ebd39)              \
   V(::, _loadPointer, FfiLoadPointer, 0x4e79d0fc)                              \
-  V(::, _storeInt8, FfiStoreInt8, 0xdf50af0c)                                  \
-  V(::, _storeInt16, FfiStoreInt16, 0xd84df332)                                \
-  V(::, _storeInt32, FfiStoreInt32, 0xfbe62c5d)                                \
-  V(::, _storeInt64, FfiStoreInt64, 0xf1d40d7a)                                \
-  V(::, _storeUint8, FfiStoreUint8, 0x056dd2f6)                                \
-  V(::, _storeUint16, FfiStoreUint16, 0xe2fdaade)                              \
-  V(::, _storeUint32, FfiStoreUint32, 0xe5d7e8c5)                              \
-  V(::, _storeUint64, FfiStoreUint64, 0xe2d93239)                              \
+  V(::, _storeAbiSpecificInt, FfiStoreAbiSpecificInt, 0xc70954c0)              \
+  V(::, _storeAbiSpecificIntAtIndex, FfiStoreAbiSpecificIntAtIndex, 0xc64efe4b)\
+  V(::, _storeInt8, FfiStoreInt8, 0xdf50b2cd)                                  \
+  V(::, _storeInt16, FfiStoreInt16, 0xd84df6f3)                                \
+  V(::, _storeInt32, FfiStoreInt32, 0xfbe6301e)                                \
+  V(::, _storeInt64, FfiStoreInt64, 0xf1d4113b)                                \
+  V(::, _storeUint8, FfiStoreUint8, 0x056dd6b7)                                \
+  V(::, _storeUint16, FfiStoreUint16, 0xe2fdae9f)                              \
+  V(::, _storeUint32, FfiStoreUint32, 0xe5d7ec86)                              \
+  V(::, _storeUint64, FfiStoreUint64, 0xe2d935fa)                              \
   V(::, _storeIntPtr, FfiStoreIntPtr, 0x080266a8)                              \
   V(::, _storeFloat, FfiStoreFloat, 0x6484f07e)                                \
   V(::, _storeFloatUnaligned, FfiStoreFloatUnaligned, 0x600a9203)              \
@@ -221,6 +225,16 @@
   V(::, _storePointer, FfiStorePointer, 0xea6b7751)                            \
   V(::, _fromAddress, FfiFromAddress, 0xfd8cb1cc)                              \
   V(Pointer, get:address, FfiGetAddress, 0x7cde87be)                           \
+  V(::, _asExternalTypedDataInt8, FfiAsExternalTypedDataInt8, 0x768a0698)      \
+  V(::, _asExternalTypedDataInt16, FfiAsExternalTypedDataInt16, 0xd09cf9c6)    \
+  V(::, _asExternalTypedDataInt32, FfiAsExternalTypedDataInt32, 0x38248946)    \
+  V(::, _asExternalTypedDataInt64, FfiAsExternalTypedDataInt64, 0xafaa47fb)    \
+  V(::, _asExternalTypedDataUint8, FfiAsExternalTypedDataUint8, 0x35228834)    \
+  V(::, _asExternalTypedDataUint16, FfiAsExternalTypedDataUint16, 0x89a51e3a)  \
+  V(::, _asExternalTypedDataUint32, FfiAsExternalTypedDataUint32, 0xd272dc41)  \
+  V(::, _asExternalTypedDataUint64, FfiAsExternalTypedDataUint64, 0x06be71c5)  \
+  V(::, _asExternalTypedDataFloat, FfiAsExternalTypedDataFloat, 0x6f465e0c)    \
+  V(::, _asExternalTypedDataDouble, FfiAsExternalTypedDataDouble, 0x40cdd9e1)  \
   V(::, _getNativeField, GetNativeField, 0xa0139b85)                           \
   V(::, reachabilityFence, ReachabilityFence, 0x619235c1)                      \
   V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x1dcaf73d)                          \
@@ -280,7 +294,6 @@
   V(_FunctionType, get:hashCode, FunctionType_getHashCode, 0x75e0d454)         \
   V(_FunctionType, ==, FunctionType_equality, 0x465868ae)                      \
   V(::, _getHash, Object_getHash, 0xc60ff758)                                  \
-  V(::, _setHashIfNotSetYet, Object_setHashIfNotSetYet, 0x4e17c2f5)            \
 
 #define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
   V(_IntegerImplementation, >, Integer_greaterThan, 0xf741693b)                \
diff --git a/runtime/vm/compiler/relocation.cc b/runtime/vm/compiler/relocation.cc
index 428a84f..08641a0 100644
--- a/runtime/vm/compiler/relocation.cc
+++ b/runtime/vm/compiler/relocation.cc
@@ -549,7 +549,7 @@
 }
 
 intptr_t CodeRelocator::AdjustPayloadOffset(intptr_t payload_offset) {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     return payload_offset;
   }
   return compiler::target::Instructions::HeaderSize() + payload_offset;
diff --git a/runtime/vm/compiler/relocation_test.cc b/runtime/vm/compiler/relocation_test.cc
index b698830..f361bd8 100644
--- a/runtime/vm/compiler/relocation_test.cc
+++ b/runtime/vm/compiler/relocation_test.cc
@@ -43,13 +43,11 @@
         safepoint_and_growth_scope(thread, SafepointLevel::kGC) {
     // So the relocator uses the correct instruction size layout.
     FLAG_precompiled_mode = true;
-    FLAG_use_bare_instructions = true;
 
     FLAG_lower_pc_relative_call_distance = -128;
     FLAG_upper_pc_relative_call_distance = 128;
   }
   ~RelocatorTestHelper() {
-    FLAG_use_bare_instructions = false;
     FLAG_precompiled_mode = false;
   }
 
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 3210c35..bc2daf8 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -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.
 
+#include "platform/thread_sanitizer.h"
+
 #include "vm/compiler/runtime_api.h"
 
 #include "vm/object.h"
@@ -97,7 +99,7 @@
 
 intptr_t ObjectHash(const Object& obj) {
   if (obj.IsNull()) {
-    return 2011;
+    return kNullIdentityHash;
   }
   if (obj.IsInstance()) {
     return Instance::Cast(obj).CanonicalizeHash();
@@ -793,7 +795,7 @@
 // Used for InstructionsSection and Instructions methods, since we don't
 // serialize Instructions objects in bare instructions mode, just payloads.
 DART_FORCE_INLINE static bool BareInstructionsPayloads() {
-  return FLAG_precompiled_mode && FLAG_use_bare_instructions;
+  return FLAG_precompiled_mode;
 }
 
 word InstructionsSection::HeaderSize() {
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 5ce613d..c7fd307 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -19,7 +19,9 @@
 // in compiler::target namespace.
 
 #include "platform/globals.h"
+#include "platform/thread_sanitizer.h"
 #include "platform/utils.h"
+
 #include "vm/allocation.h"
 #include "vm/bitfield.h"
 #include "vm/bss_relocs.h"
@@ -889,10 +891,14 @@
 
 class CompressedStackMaps : public AllStatic {
  public:
-  static word HeaderSize();
+  static word HeaderSize() { return ObjectHeaderSize() + PayloadHeaderSize(); }
   static word InstanceSize();
   static word InstanceSize(word payload_size);
   FINAL_CLASS();
+
+ private:
+  static word ObjectHeaderSize();
+  static word PayloadHeaderSize();
 };
 
 class LocalVarDescriptors : public AllStatic {
@@ -1059,6 +1065,15 @@
   FINAL_CLASS();
 };
 
+class TsanUtils : public AllStatic {
+ public:
+  static word setjmp_function_offset();
+  static word setjmp_buffer_offset();
+  static word exception_pc_offset();
+  static word exception_sp_offset();
+  static word exception_fp_offset();
+};
+
 class Thread : public AllStatic {
  public:
   static word api_top_scope_offset();
@@ -1122,6 +1137,8 @@
 
   static word callback_code_offset();
   static word callback_stack_return_offset();
+  static word tsan_utils_offset();
+  static word jump_to_frame_entry_point_offset();
 
   static word AllocateArray_entry_point_offset();
   static word write_barrier_code_offset();
@@ -1179,6 +1196,8 @@
   THREAD_XMM_CONSTANT_LIST(DECLARE_CONSTANT_OFFSET_GETTER)
 #undef DECLARE_CONSTANT_OFFSET_GETTER
 
+  static word random_offset();
+
   static word OffsetFromThread(const dart::Object& object);
   static intptr_t OffsetFromThread(const dart::RuntimeEntry* runtime_entry);
 };
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 494a811..5d764cf 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -39,10 +39,6 @@
     ExceptionHandlers_elements_start_offset = 12;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 20;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     8;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -246,11 +242,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 376;
+    Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    748;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     752;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    756;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
@@ -275,22 +271,22 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 204;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 788;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 792;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 144;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 800;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 816;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 792;
+    Thread_double_truncate_round_supported_offset = 796;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
@@ -299,14 +295,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    356;
+    360;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 352;
+    Thread_double_negate_address_offset = 356;
 static constexpr dart::compiler::target::word Thread_end_offset = 52;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    768;
+    772;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
@@ -318,21 +314,21 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 368;
+    Thread_float_absolute_address_offset = 372;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 364;
+    Thread_float_negate_address_offset = 368;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    360;
+    364;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 372;
+    Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    756;
+    760;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    784;
+    788;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 804;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 820;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -350,7 +346,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 336;
+    Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
@@ -373,16 +369,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 760;
+    Thread_predefined_symbols_address_offset = 348;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 764;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 764;
+    Thread_saved_shadow_call_stack_offset = 768;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    772;
+    776;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 328;
+    Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 28;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     56;
@@ -414,9 +410,22 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 776;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 780;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 780;
+    Thread_callback_stack_return_offset = 784;
+static constexpr dart::compiler::target::word Thread_random_offset = 800;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 328;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 808;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    4;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset = 8;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    12;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    16;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 12;
@@ -467,18 +476,16 @@
     UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 8;
+    MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 4;
+    MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        716, 720, 724, 728, 732, -1, 736, -1, 740, 744, -1, -1, -1, -1, -1, -1};
+        720, 724, 728, 732, 736, -1, 740, -1, 744, 748, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 12;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word Array_header_size = 12;
@@ -488,8 +495,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 4;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 12;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 8;
@@ -515,6 +524,8 @@
     8;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 20;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    24;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -528,7 +539,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 16;
+    MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 16;
 static constexpr dart::compiler::target::word Number_InstanceSize = 4;
@@ -560,7 +571,7 @@
     12;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 16;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 12;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 12;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 16;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 12;
@@ -588,10 +599,6 @@
     ExceptionHandlers_elements_start_offset = 24;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -800,11 +807,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 728;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1496;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     1504;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    1512;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -830,22 +837,22 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 264;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1592;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1624;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1584;
+    Thread_double_truncate_round_supported_offset = 1592;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
@@ -854,14 +861,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     448;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    688;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 680;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1536;
+    1544;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -873,22 +880,22 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 712;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 704;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 720;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1512;
+    1520;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1568;
+    1576;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1600;
+    1632;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -906,7 +913,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -929,16 +936,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 664;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1520;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1528;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1528;
+    Thread_saved_shadow_call_stack_offset = 1536;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1544;
+    1552;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 56;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     112;
@@ -971,9 +978,23 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1552;
+    1560;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1560;
+    Thread_callback_stack_return_offset = 1568;
+static constexpr dart::compiler::target::word Thread_random_offset = 1600;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1608;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    8;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset =
+    16;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    24;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    32;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -1025,19 +1046,17 @@
     UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 16;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, -1,   -1,   1440, 1448,
-        1456, 1464, 1472, -1,   1480, 1488, -1,   -1};
+        1416, 1424, 1432, 1440, -1,   -1,   1448, 1456,
+        1464, 1472, 1480, -1,   1488, 1496, -1,   -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 24;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -1047,8 +1066,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    16;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 24;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 16;
@@ -1074,6 +1095,8 @@
     16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    48;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -1087,7 +1110,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -1120,7 +1143,7 @@
     24;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 24;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 32;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 24;
@@ -1148,10 +1171,6 @@
     ExceptionHandlers_elements_start_offset = 12;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 20;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     8;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -1355,11 +1374,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 376;
+    Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    716;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     720;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    724;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
@@ -1384,22 +1403,22 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 204;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 756;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 760;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 144;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 768;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 784;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 760;
+    Thread_double_truncate_round_supported_offset = 764;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
@@ -1408,14 +1427,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    356;
+    360;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 352;
+    Thread_double_negate_address_offset = 356;
 static constexpr dart::compiler::target::word Thread_end_offset = 52;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    736;
+    740;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
@@ -1427,21 +1446,21 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 368;
+    Thread_float_absolute_address_offset = 372;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 364;
+    Thread_float_negate_address_offset = 368;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    360;
+    364;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 372;
+    Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    724;
+    728;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    752;
+    756;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 772;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 788;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -1459,7 +1478,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 336;
+    Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
@@ -1482,16 +1501,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 728;
+    Thread_predefined_symbols_address_offset = 348;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 732;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 732;
+    Thread_saved_shadow_call_stack_offset = 736;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    740;
+    744;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 328;
+    Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 28;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     56;
@@ -1523,9 +1542,22 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 744;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 748;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 748;
+    Thread_callback_stack_return_offset = 752;
+static constexpr dart::compiler::target::word Thread_random_offset = 768;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 328;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 776;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    4;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset = 8;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    12;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    16;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 12;
@@ -1576,11 +1608,9 @@
     UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 8;
+    MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 4;
+    MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -1594,8 +1624,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 4;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 12;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 8;
@@ -1621,6 +1653,8 @@
     8;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 20;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    24;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -1634,7 +1668,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 16;
+    MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 16;
 static constexpr dart::compiler::target::word Number_InstanceSize = 4;
@@ -1666,7 +1700,7 @@
     12;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 16;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 12;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 12;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 16;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 12;
@@ -1694,10 +1728,6 @@
     ExceptionHandlers_elements_start_offset = 24;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -1906,11 +1936,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 728;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1560;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     1568;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    1576;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -1936,22 +1966,22 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1640;
+    1648;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 264;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1656;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1688;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1648;
+    Thread_double_truncate_round_supported_offset = 1656;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
@@ -1960,14 +1990,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     448;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    688;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 680;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1600;
+    1608;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -1979,22 +2009,22 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 712;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 704;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 720;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1632;
+    1640;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1664;
+    1696;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -2012,7 +2042,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -2035,16 +2065,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 664;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1584;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1592;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1592;
+    Thread_saved_shadow_call_stack_offset = 1600;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1608;
+    1616;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 56;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     112;
@@ -2077,9 +2107,23 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1616;
+    1624;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1624;
+    Thread_callback_stack_return_offset = 1632;
+static constexpr dart::compiler::target::word Thread_random_offset = 1664;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1672;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    8;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset =
+    16;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    24;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    32;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -2131,20 +2175,18 @@
     UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 16;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488,
-        1496, 1504, 1512, 1520, -1,   -1,   -1,   -1,   1528, 1536, -1,
-        -1,   1544, 1552, 1560, -1,   -1,   -1,   -1,   -1,   -1};
+        1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496,
+        1504, 1512, 1520, 1528, -1,   -1,   -1,   -1,   1536, 1544, -1,
+        -1,   1552, 1560, 1568, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 24;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -2154,8 +2196,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    16;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 24;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 16;
@@ -2181,6 +2225,8 @@
     16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    48;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -2194,7 +2240,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -2227,7 +2273,7 @@
     24;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 24;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 32;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 24;
@@ -2255,10 +2301,6 @@
     ExceptionHandlers_elements_start_offset = 16;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -2464,11 +2506,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 728;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1496;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     1504;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    1512;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -2494,22 +2536,22 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 264;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1592;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1624;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1584;
+    Thread_double_truncate_round_supported_offset = 1592;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
@@ -2518,14 +2560,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     448;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    688;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 680;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1536;
+    1544;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -2537,22 +2579,22 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 712;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 704;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 720;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1512;
+    1520;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1568;
+    1576;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1600;
+    1632;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -2570,7 +2612,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -2593,16 +2635,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 664;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1520;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1528;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1528;
+    Thread_saved_shadow_call_stack_offset = 1536;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1544;
+    1552;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 56;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     112;
@@ -2635,9 +2677,23 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1552;
+    1560;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1560;
+    Thread_callback_stack_return_offset = 1568;
+static constexpr dart::compiler::target::word Thread_random_offset = 1600;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1608;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    8;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset =
+    16;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    24;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    32;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -2689,19 +2745,17 @@
     UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 12;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, -1,   -1,   1440, 1448,
-        1456, 1464, 1472, -1,   1480, 1488, -1,   -1};
+        1416, 1424, 1432, 1440, -1,   -1,   1448, 1456,
+        1464, 1472, 1480, -1,   1488, 1496, -1,   -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 24;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_header_size = 16;
@@ -2711,8 +2765,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 32;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    16;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 16;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 16;
@@ -2738,6 +2794,8 @@
     16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    48;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -2751,7 +2809,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -2784,7 +2842,7 @@
     16;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 16;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 24;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 16;
@@ -2812,10 +2870,6 @@
     ExceptionHandlers_elements_start_offset = 16;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -3021,11 +3075,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 728;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1560;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     1568;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    1576;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -3051,22 +3105,22 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1640;
+    1648;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 264;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1656;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1688;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1648;
+    Thread_double_truncate_round_supported_offset = 1656;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
@@ -3075,14 +3129,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     448;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    688;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 680;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1600;
+    1608;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -3094,22 +3148,22 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 712;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 704;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 720;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1632;
+    1640;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1664;
+    1696;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -3127,7 +3181,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -3150,16 +3204,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 664;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1584;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1592;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1592;
+    Thread_saved_shadow_call_stack_offset = 1600;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1608;
+    1616;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 56;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     112;
@@ -3192,9 +3246,23 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1616;
+    1624;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1624;
+    Thread_callback_stack_return_offset = 1632;
+static constexpr dart::compiler::target::word Thread_random_offset = 1664;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1672;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    8;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset =
+    16;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    24;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    32;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -3246,20 +3314,18 @@
     UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 12;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488,
-        1496, 1504, 1512, 1520, -1,   -1,   -1,   -1,   1528, 1536, -1,
-        -1,   1544, 1552, 1560, -1,   -1,   -1,   -1,   -1,   -1};
+        1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496,
+        1504, 1512, 1520, 1528, -1,   -1,   -1,   -1,   1536, 1544, -1,
+        -1,   1552, 1560, 1568, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 24;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_header_size = 16;
@@ -3269,8 +3335,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 32;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    16;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 16;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 16;
@@ -3296,6 +3364,8 @@
     16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    48;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -3309,7 +3379,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -3342,7 +3412,7 @@
     16;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 16;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 24;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 16;
@@ -3369,10 +3439,6 @@
     ExceptionHandlers_elements_start_offset = 12;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 20;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     8;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -3573,11 +3639,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 376;
+    Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    748;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     752;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    756;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
@@ -3602,22 +3668,22 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 204;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 788;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 792;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 144;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 800;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 816;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 792;
+    Thread_double_truncate_round_supported_offset = 796;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
@@ -3626,14 +3692,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    356;
+    360;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 352;
+    Thread_double_negate_address_offset = 356;
 static constexpr dart::compiler::target::word Thread_end_offset = 52;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    768;
+    772;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
@@ -3645,21 +3711,21 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 368;
+    Thread_float_absolute_address_offset = 372;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 364;
+    Thread_float_negate_address_offset = 368;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    360;
+    364;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 372;
+    Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    756;
+    760;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    784;
+    788;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 804;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 820;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -3677,7 +3743,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 336;
+    Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
@@ -3700,16 +3766,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 760;
+    Thread_predefined_symbols_address_offset = 348;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 764;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 764;
+    Thread_saved_shadow_call_stack_offset = 768;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    772;
+    776;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 328;
+    Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 28;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     56;
@@ -3741,9 +3807,22 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 776;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 780;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 780;
+    Thread_callback_stack_return_offset = 784;
+static constexpr dart::compiler::target::word Thread_random_offset = 800;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 328;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 808;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    4;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset = 8;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    12;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    16;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 12;
@@ -3794,18 +3873,16 @@
     UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 8;
+    MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 4;
+    MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        716, 720, 724, 728, 732, -1, 736, -1, 740, 744, -1, -1, -1, -1, -1, -1};
+        720, 724, 728, 732, 736, -1, 740, -1, 744, 748, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 12;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
 static constexpr dart::compiler::target::word Array_header_size = 12;
@@ -3815,8 +3892,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 4;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 12;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 8;
@@ -3842,6 +3921,8 @@
     8;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 20;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    24;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -3855,7 +3936,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 16;
+    MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 16;
 static constexpr dart::compiler::target::word Number_InstanceSize = 4;
@@ -3887,7 +3968,7 @@
     12;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 16;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 12;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 12;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 16;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 12;
@@ -3912,10 +3993,6 @@
     ExceptionHandlers_elements_start_offset = 24;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -4121,11 +4198,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 728;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1496;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     1504;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    1512;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -4151,22 +4228,22 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 264;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1592;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1624;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1584;
+    Thread_double_truncate_round_supported_offset = 1592;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
@@ -4175,14 +4252,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     448;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    688;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 680;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1536;
+    1544;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -4194,22 +4271,22 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 712;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 704;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 720;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1512;
+    1520;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1568;
+    1576;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1600;
+    1632;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -4227,7 +4304,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -4250,16 +4327,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 664;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1520;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1528;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1528;
+    Thread_saved_shadow_call_stack_offset = 1536;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1544;
+    1552;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 56;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     112;
@@ -4292,9 +4369,23 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1552;
+    1560;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1560;
+    Thread_callback_stack_return_offset = 1568;
+static constexpr dart::compiler::target::word Thread_random_offset = 1600;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1608;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    8;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset =
+    16;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    24;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    32;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -4346,19 +4437,17 @@
     UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 16;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, -1,   -1,   1440, 1448,
-        1456, 1464, 1472, -1,   1480, 1488, -1,   -1};
+        1416, 1424, 1432, 1440, -1,   -1,   1448, 1456,
+        1464, 1472, 1480, -1,   1488, 1496, -1,   -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 24;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -4368,8 +4457,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    16;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 24;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 16;
@@ -4395,6 +4486,8 @@
     16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    48;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -4408,7 +4501,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -4441,7 +4534,7 @@
     24;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 24;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 32;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 24;
@@ -4466,10 +4559,6 @@
     ExceptionHandlers_elements_start_offset = 12;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 20;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     8;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -4670,11 +4759,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 4;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 376;
+    Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    716;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     720;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    724;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
@@ -4699,22 +4788,22 @@
     Thread_allocate_object_slow_entry_point_offset = 296;
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 204;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 756;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 760;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 340;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 332;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 144;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 768;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 784;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 760;
+    Thread_double_truncate_round_supported_offset = 764;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 232;
@@ -4723,14 +4812,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     236;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    356;
+    360;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 352;
+    Thread_double_negate_address_offset = 356;
 static constexpr dart::compiler::target::word Thread_end_offset = 52;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    736;
+    740;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
@@ -4742,21 +4831,21 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 368;
+    Thread_float_absolute_address_offset = 372;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 364;
+    Thread_float_negate_address_offset = 368;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    360;
+    364;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 372;
+    Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    724;
+    728;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    752;
+    756;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 40;
-static constexpr dart::compiler::target::word Thread_isolate_group_offset = 772;
+static constexpr dart::compiler::target::word Thread_isolate_group_offset = 788;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     64;
 static constexpr dart::compiler::target::word
@@ -4774,7 +4863,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 336;
+    Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
@@ -4797,16 +4886,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 728;
+    Thread_predefined_symbols_address_offset = 348;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 732;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 732;
+    Thread_saved_shadow_call_stack_offset = 736;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    740;
+    744;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 328;
+    Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 28;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     56;
@@ -4838,9 +4927,22 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     32;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 36;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 744;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 748;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 748;
+    Thread_callback_stack_return_offset = 752;
+static constexpr dart::compiler::target::word Thread_random_offset = 768;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 328;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 776;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    4;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset = 8;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    12;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    16;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
 static constexpr dart::compiler::target::word Type_arguments_offset = 12;
@@ -4891,11 +4993,9 @@
     UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 8;
+    MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 4;
+    MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
@@ -4909,8 +5009,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 4;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 12;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 8;
@@ -4936,6 +5038,8 @@
     8;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 20;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    24;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -4949,7 +5053,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 16;
+    MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 16;
 static constexpr dart::compiler::target::word Number_InstanceSize = 4;
@@ -4981,7 +5085,7 @@
     12;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 16;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 12;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 12;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 16;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 16;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 12;
@@ -5006,10 +5110,6 @@
     ExceptionHandlers_elements_start_offset = 24;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -5215,11 +5315,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 728;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1560;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     1568;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    1576;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -5245,22 +5345,22 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1640;
+    1648;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 264;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1656;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1688;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1648;
+    Thread_double_truncate_round_supported_offset = 1656;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
@@ -5269,14 +5369,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     448;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    688;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 680;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1600;
+    1608;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -5288,22 +5388,22 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 712;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 704;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 720;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1632;
+    1640;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1664;
+    1696;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -5321,7 +5421,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -5344,16 +5444,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 664;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1584;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1592;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1592;
+    Thread_saved_shadow_call_stack_offset = 1600;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1608;
+    1616;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 56;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     112;
@@ -5386,9 +5486,23 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1616;
+    1624;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1624;
+    Thread_callback_stack_return_offset = 1632;
+static constexpr dart::compiler::target::word Thread_random_offset = 1664;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1672;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    8;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset =
+    16;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    24;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    32;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -5440,20 +5554,18 @@
     UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 16;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488,
-        1496, 1504, 1512, 1520, -1,   -1,   -1,   -1,   1528, 1536, -1,
-        -1,   1544, 1552, 1560, -1,   -1,   -1,   -1,   -1,   -1};
+        1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496,
+        1504, 1512, 1520, 1528, -1,   -1,   -1,   -1,   1536, 1544, -1,
+        -1,   1552, 1560, 1568, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 24;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -5463,8 +5575,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    16;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 24;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 16;
@@ -5490,6 +5604,8 @@
     16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    48;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -5503,7 +5619,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -5536,7 +5652,7 @@
     24;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 24;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 32;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 24;
@@ -5561,10 +5677,6 @@
     ExceptionHandlers_elements_start_offset = 16;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -5767,11 +5879,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 728;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1496;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     1504;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    1512;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -5797,22 +5909,22 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 264;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1592;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1624;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1584;
+    Thread_double_truncate_round_supported_offset = 1592;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
@@ -5821,14 +5933,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     448;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    688;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 680;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1536;
+    1544;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -5840,22 +5952,22 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 712;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 704;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 720;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1512;
+    1520;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1568;
+    1576;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1600;
+    1632;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -5873,7 +5985,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -5896,16 +6008,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 664;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1520;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1528;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1528;
+    Thread_saved_shadow_call_stack_offset = 1536;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1544;
+    1552;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 56;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     112;
@@ -5938,9 +6050,23 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1552;
+    1560;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1560;
+    Thread_callback_stack_return_offset = 1568;
+static constexpr dart::compiler::target::word Thread_random_offset = 1600;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1608;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    8;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset =
+    16;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    24;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    32;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -5992,19 +6118,17 @@
     UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 12;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, -1,   -1,   1440, 1448,
-        1456, 1464, 1472, -1,   1480, 1488, -1,   -1};
+        1416, 1424, 1432, 1440, -1,   -1,   1448, 1456,
+        1464, 1472, 1480, -1,   1488, 1496, -1,   -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 24;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_header_size = 16;
@@ -6014,8 +6138,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 32;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    16;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 16;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 16;
@@ -6041,6 +6167,8 @@
     16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    48;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -6054,7 +6182,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -6087,7 +6215,7 @@
     16;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 16;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 24;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 16;
@@ -6112,10 +6240,6 @@
     ExceptionHandlers_elements_start_offset = 16;
 static constexpr dart::compiler::target::word ExceptionHandlers_element_size =
     12;
-static constexpr dart::compiler::target::word
-    InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word InstructionsTable_element_size =
-    4;
 static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
     16;
 static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -6318,11 +6442,11 @@
 static constexpr dart::compiler::target::word String_length_offset = 8;
 static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    Thread_AllocateArray_entry_point_offset = 728;
+    Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1560;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     1568;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    1576;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -6348,22 +6472,22 @@
 static constexpr dart::compiler::target::word
     Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
-    1640;
+    1648;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 264;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1656;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1688;
 static constexpr dart::compiler::target::word
     Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    Thread_double_truncate_round_supported_offset = 1648;
+    Thread_double_truncate_round_supported_offset = 1656;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
@@ -6372,14 +6496,14 @@
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     448;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    688;
+    696;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 680;
+    Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1600;
+    1608;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -6391,22 +6515,22 @@
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 712;
+    Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 704;
+    Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    696;
+    704;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 720;
+    Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
-    1632;
+    1640;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word Thread_isolate_group_offset =
-    1664;
+    1696;
 static constexpr dart::compiler::target::word Thread_field_table_values_offset =
     128;
 static constexpr dart::compiler::target::word
@@ -6424,7 +6548,7 @@
 static constexpr dart::compiler::target::word
     Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -6447,16 +6571,16 @@
     Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 200;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 664;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1584;
+    Thread_predefined_symbols_address_offset = 672;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1592;
 static constexpr dart::compiler::target::word
-    Thread_saved_shadow_call_stack_offset = 1592;
+    Thread_saved_shadow_call_stack_offset = 1600;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1608;
+    1616;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    Thread_slow_type_test_entry_point_offset = 632;
+    Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 56;
 static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
     112;
@@ -6489,9 +6613,23 @@
     64;
 static constexpr dart::compiler::target::word Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1616;
+    1624;
 static constexpr dart::compiler::target::word
-    Thread_callback_stack_return_offset = 1624;
+    Thread_callback_stack_return_offset = 1632;
+static constexpr dart::compiler::target::word Thread_random_offset = 1664;
+static constexpr dart::compiler::target::word
+    Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word Thread_tsan_utils_offset = 1672;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_function_offset =
+    0;
+static constexpr dart::compiler::target::word TsanUtils_setjmp_buffer_offset =
+    8;
+static constexpr dart::compiler::target::word TsanUtils_exception_pc_offset =
+    16;
+static constexpr dart::compiler::target::word TsanUtils_exception_sp_offset =
+    24;
+static constexpr dart::compiler::target::word TsanUtils_exception_fp_offset =
+    32;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -6543,20 +6681,18 @@
     UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_expected_cid_offset = 16;
+    MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_target_offset = 8;
+    MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word WeakProperty_value_offset = 12;
 static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488,
-        1496, 1504, 1512, 1520, -1,   -1,   -1,   -1,   1528, 1536, -1,
-        -1,   1544, 1552, 1560, -1,   -1,   -1,   -1,   -1,   -1};
+        1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496,
+        1504, 1512, 1520, 1528, -1,   -1,   -1,   -1,   1536, 1544, -1,
+        -1,   1552, 1560, 1568, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AbstractType_InstanceSize = 24;
 static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
 static constexpr dart::compiler::target::word Array_header_size = 16;
@@ -6566,8 +6702,10 @@
 static constexpr dart::compiler::target::word Closure_InstanceSize = 32;
 static constexpr dart::compiler::target::word ClosureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
-static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
-    16;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word Context_header_size = 16;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word DynamicLibrary_InstanceSize = 16;
@@ -6593,6 +6731,8 @@
     16;
 static constexpr dart::compiler::target::word
     InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word InstructionsTable_InstanceSize =
+    48;
 static constexpr dart::compiler::target::word Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word KernelProgramInfo_InstanceSize =
@@ -6606,7 +6746,7 @@
 static constexpr dart::compiler::target::word Mint_InstanceSize = 16;
 static constexpr dart::compiler::target::word MirrorReference_InstanceSize = 16;
 static constexpr dart::compiler::target::word
-    MonomorphicSmiableCall_InstanceSize = 32;
+    MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word NativeArguments_StructSize = 32;
 static constexpr dart::compiler::target::word Number_InstanceSize = 8;
@@ -6639,7 +6779,7 @@
     16;
 static constexpr dart::compiler::target::word UnlinkedCall_InstanceSize = 32;
 static constexpr dart::compiler::target::word UnwindError_InstanceSize = 16;
-static constexpr dart::compiler::target::word UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word WeakProperty_InstanceSize = 24;
 static constexpr dart::compiler::target::word
     WeakSerializationReference_InstanceSize = 16;
@@ -6673,10 +6813,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 20;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 8;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 4;
 static constexpr dart::compiler::target::word
@@ -6907,11 +7043,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 376;
+    AOT_Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 748;
+    AOT_Thread_active_exception_offset = 752;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 752;
+    AOT_Thread_active_stacktrace_offset = 756;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
@@ -6937,24 +7073,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 204;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    788;
+    792;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 340;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     120;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 332;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    800;
+    816;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 792;
+    AOT_Thread_double_truncate_round_supported_offset = 796;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -6964,14 +7100,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 236;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 356;
+    AOT_Thread_double_abs_address_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 352;
+    AOT_Thread_double_negate_address_offset = 356;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 52;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 768;
+    AOT_Thread_execution_state_offset = 772;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
@@ -6983,22 +7119,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 368;
+    AOT_Thread_float_absolute_address_offset = 372;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 364;
+    AOT_Thread_float_negate_address_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 360;
+    AOT_Thread_float_not_address_offset = 364;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 372;
+    AOT_Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 756;
+    AOT_Thread_global_object_pool_offset = 760;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 784;
+    AOT_Thread_exit_through_ffi_offset = 788;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    804;
+    820;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 64;
 static constexpr dart::compiler::target::word
@@ -7016,7 +7152,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 336;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
@@ -7041,16 +7177,16 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 760;
+    AOT_Thread_predefined_symbols_address_offset = 348;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 764;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 764;
+    AOT_Thread_saved_shadow_call_stack_offset = 768;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 772;
+    AOT_Thread_safepoint_state_offset = 776;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 328;
+    AOT_Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     28;
 static constexpr dart::compiler::target::word
@@ -7085,9 +7221,24 @@
     AOT_Thread_write_barrier_mask_offset = 32;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 36;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    776;
+    780;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 780;
+    AOT_Thread_callback_stack_return_offset = 784;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 800;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 328;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    808;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 4;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 12;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 16;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -7151,18 +7302,16 @@
     AOT_UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 4;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word AOT_Code_entry_point_offset[] = {
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        716, 720, 724, 728, 732, -1, 736, -1, 740, 744, -1, -1, -1, -1, -1, -1};
+        720, 724, 728, 732, 736, -1, 740, -1, 744, 748, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     12;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
@@ -7174,7 +7323,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 8;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 4;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 12;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -7202,6 +7353,8 @@
     AOT_Instructions_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 20;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word
@@ -7219,7 +7372,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 16;
+    AOT_MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     16;
@@ -7258,7 +7411,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     16;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
@@ -7289,10 +7442,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 16;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 8;
 static constexpr dart::compiler::target::word
@@ -7524,11 +7673,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 728;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1496;
+    AOT_Thread_active_exception_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1504;
+    AOT_Thread_active_stacktrace_offset = 1512;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -7554,24 +7703,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     216;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 264;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1592;
+    1624;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1584;
+    AOT_Thread_double_truncate_round_supported_offset = 1592;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -7581,14 +7730,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 688;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 680;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1536;
+    AOT_Thread_execution_state_offset = 1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -7600,22 +7749,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 712;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 704;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 696;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 720;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1512;
+    AOT_Thread_global_object_pool_offset = 1520;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1568;
+    AOT_Thread_exit_through_ffi_offset = 1576;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1600;
+    1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -7633,7 +7782,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -7658,17 +7807,17 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 664;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1520;
+    1528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1528;
+    AOT_Thread_saved_shadow_call_stack_offset = 1536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1544;
+    AOT_Thread_safepoint_state_offset = 1552;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -7703,9 +7852,24 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1552;
+    1560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1560;
+    AOT_Thread_callback_stack_return_offset = 1568;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1600;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    1608;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 16;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 24;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -7769,11 +7933,9 @@
     AOT_UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     16;
@@ -7781,8 +7943,8 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, -1,   -1,   1440, 1448,
-        1456, 1464, 1472, -1,   1480, 1488, -1,   -1};
+        1416, 1424, 1432, 1440, -1,   -1,   1448, 1456,
+        1464, 1472, 1480, -1,   1488, 1496, -1,   -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
@@ -7794,7 +7956,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 16;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -7822,6 +7986,8 @@
     AOT_Instructions_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
@@ -7839,7 +8005,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -7878,7 +8044,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     32;
 static constexpr dart::compiler::target::word
@@ -7912,10 +8078,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 16;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 8;
 static constexpr dart::compiler::target::word
@@ -8147,11 +8309,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 728;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1560;
+    AOT_Thread_active_exception_offset = 1568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1568;
+    AOT_Thread_active_stacktrace_offset = 1576;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -8177,24 +8339,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1640;
+    1648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     216;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 264;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1656;
+    1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1648;
+    AOT_Thread_double_truncate_round_supported_offset = 1656;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -8204,14 +8366,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 688;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 680;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1600;
+    AOT_Thread_execution_state_offset = 1608;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -8223,22 +8385,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 712;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 704;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 696;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 720;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1576;
+    AOT_Thread_global_object_pool_offset = 1584;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1632;
+    AOT_Thread_exit_through_ffi_offset = 1640;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1664;
+    1696;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -8256,7 +8418,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -8281,17 +8443,17 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 664;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1584;
+    1592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1592;
+    AOT_Thread_saved_shadow_call_stack_offset = 1600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1608;
+    AOT_Thread_safepoint_state_offset = 1616;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -8326,9 +8488,24 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1616;
+    1624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1624;
+    AOT_Thread_callback_stack_return_offset = 1632;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1664;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    1672;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 16;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 24;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -8392,11 +8569,9 @@
     AOT_UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     16;
@@ -8404,9 +8579,9 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488,
-        1496, 1504, 1512, 1520, -1,   -1,   -1,   -1,   1528, 1536, -1,
-        -1,   1544, 1552, 1560, -1,   -1,   -1,   -1,   -1,   -1};
+        1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496,
+        1504, 1512, 1520, 1528, -1,   -1,   -1,   -1,   1536, 1544, -1,
+        -1,   1552, 1560, 1568, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
@@ -8418,7 +8593,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 16;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -8446,6 +8623,8 @@
     AOT_Instructions_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
@@ -8463,7 +8642,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -8502,7 +8681,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     32;
 static constexpr dart::compiler::target::word
@@ -8533,10 +8712,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 16;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 8;
 static constexpr dart::compiler::target::word
@@ -8767,11 +8942,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 728;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1496;
+    AOT_Thread_active_exception_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1504;
+    AOT_Thread_active_stacktrace_offset = 1512;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -8797,24 +8972,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     216;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 264;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1592;
+    1624;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1584;
+    AOT_Thread_double_truncate_round_supported_offset = 1592;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -8824,14 +8999,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 688;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 680;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1536;
+    AOT_Thread_execution_state_offset = 1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -8843,22 +9018,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 712;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 704;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 696;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 720;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1512;
+    AOT_Thread_global_object_pool_offset = 1520;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1568;
+    AOT_Thread_exit_through_ffi_offset = 1576;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1600;
+    1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -8876,7 +9051,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -8901,17 +9076,17 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 664;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1520;
+    1528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1528;
+    AOT_Thread_saved_shadow_call_stack_offset = 1536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1544;
+    AOT_Thread_safepoint_state_offset = 1552;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -8946,9 +9121,24 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1552;
+    1560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1560;
+    AOT_Thread_callback_stack_return_offset = 1568;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1600;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    1608;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 16;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 24;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -9012,11 +9202,9 @@
     AOT_UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     12;
@@ -9024,8 +9212,8 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, -1,   -1,   1440, 1448,
-        1456, 1464, 1472, -1,   1480, 1488, -1,   -1};
+        1416, 1424, 1432, 1440, -1,   -1,   1448, 1456,
+        1464, 1472, 1480, -1,   1488, 1496, -1,   -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
@@ -9037,7 +9225,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 16;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 16;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -9065,6 +9255,8 @@
     AOT_Instructions_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
@@ -9082,7 +9274,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -9121,7 +9313,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 16;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     24;
 static constexpr dart::compiler::target::word
@@ -9152,10 +9344,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 16;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 8;
 static constexpr dart::compiler::target::word
@@ -9386,11 +9574,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 728;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1560;
+    AOT_Thread_active_exception_offset = 1568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1568;
+    AOT_Thread_active_stacktrace_offset = 1576;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -9416,24 +9604,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1640;
+    1648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     216;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 264;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1656;
+    1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1648;
+    AOT_Thread_double_truncate_round_supported_offset = 1656;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -9443,14 +9631,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 688;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 680;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1600;
+    AOT_Thread_execution_state_offset = 1608;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -9462,22 +9650,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 712;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 704;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 696;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 720;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1576;
+    AOT_Thread_global_object_pool_offset = 1584;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1632;
+    AOT_Thread_exit_through_ffi_offset = 1640;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1664;
+    1696;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -9495,7 +9683,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -9520,17 +9708,17 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 664;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1584;
+    1592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1592;
+    AOT_Thread_saved_shadow_call_stack_offset = 1600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1608;
+    AOT_Thread_safepoint_state_offset = 1616;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -9565,9 +9753,24 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1616;
+    1624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1624;
+    AOT_Thread_callback_stack_return_offset = 1632;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1664;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    1672;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 16;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 24;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -9631,11 +9834,9 @@
     AOT_UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     12;
@@ -9643,9 +9844,9 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488,
-        1496, 1504, 1512, 1520, -1,   -1,   -1,   -1,   1528, 1536, -1,
-        -1,   1544, 1552, 1560, -1,   -1,   -1,   -1,   -1,   -1};
+        1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496,
+        1504, 1512, 1520, 1528, -1,   -1,   -1,   -1,   1536, 1544, -1,
+        -1,   1552, 1560, 1568, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
@@ -9657,7 +9858,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 16;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 16;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -9685,6 +9888,8 @@
     AOT_Instructions_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
@@ -9702,7 +9907,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -9741,7 +9946,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 16;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     24;
 static constexpr dart::compiler::target::word
@@ -9771,10 +9976,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 20;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 8;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 4;
 static constexpr dart::compiler::target::word
@@ -10001,11 +10202,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 376;
+    AOT_Thread_AllocateArray_entry_point_offset = 380;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 748;
+    AOT_Thread_active_exception_offset = 752;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 752;
+    AOT_Thread_active_stacktrace_offset = 756;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 128;
 static constexpr dart::compiler::target::word
@@ -10031,24 +10232,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 204;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    788;
+    792;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 340;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     120;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 332;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 336;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 276;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 144;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    800;
+    816;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 44;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 792;
+    AOT_Thread_double_truncate_round_supported_offset = 796;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     316;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -10058,14 +10259,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 236;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 356;
+    AOT_Thread_double_abs_address_offset = 360;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 352;
+    AOT_Thread_double_negate_address_offset = 356;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 52;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 768;
+    AOT_Thread_execution_state_offset = 772;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 260;
 static constexpr dart::compiler::target::word
@@ -10077,22 +10278,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 132;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 368;
+    AOT_Thread_float_absolute_address_offset = 372;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 364;
+    AOT_Thread_float_negate_address_offset = 368;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 360;
+    AOT_Thread_float_not_address_offset = 364;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 372;
+    AOT_Thread_float_zerow_address_offset = 376;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 756;
+    AOT_Thread_global_object_pool_offset = 760;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 784;
+    AOT_Thread_exit_through_ffi_offset = 788;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 40;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    804;
+    820;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 64;
 static constexpr dart::compiler::target::word
@@ -10110,7 +10311,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 216;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 336;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 340;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 152;
 static constexpr dart::compiler::target::word
@@ -10135,16 +10336,16 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     112;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 760;
+    AOT_Thread_predefined_symbols_address_offset = 348;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 764;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 764;
+    AOT_Thread_saved_shadow_call_stack_offset = 768;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 772;
+    AOT_Thread_safepoint_state_offset = 776;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 248;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 328;
+    AOT_Thread_slow_type_test_entry_point_offset = 332;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     28;
 static constexpr dart::compiler::target::word
@@ -10179,9 +10380,24 @@
     AOT_Thread_write_barrier_mask_offset = 32;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 36;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    776;
+    780;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 780;
+    AOT_Thread_callback_stack_return_offset = 784;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 800;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 328;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    808;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 4;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 12;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 16;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 8;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -10245,18 +10461,16 @@
     AOT_UnhandledException_stacktrace_offset = 8;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 4;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 12;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 4;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 4;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset = 8;
 static constexpr dart::compiler::target::word AOT_Code_entry_point_offset[] = {
     4, 12, 8, 16};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        716, 720, 724, 728, 732, -1, 736, -1, 740, 744, -1, -1, -1, -1, -1, -1};
+        720, 724, 728, 732, 736, -1, 740, -1, 744, 748, -1, -1, -1, -1, -1, -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     12;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
@@ -10268,7 +10482,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 8;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 4;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 12;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -10296,6 +10512,8 @@
     AOT_Instructions_UnalignedHeaderSize = 8;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 20;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 4;
 static constexpr dart::compiler::target::word
@@ -10313,7 +10531,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 16;
+    AOT_MonomorphicSmiableCall_InstanceSize = 12;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 20;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     16;
@@ -10352,7 +10570,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     16;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
@@ -10380,10 +10598,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 16;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 8;
 static constexpr dart::compiler::target::word
@@ -10611,11 +10825,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 728;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1496;
+    AOT_Thread_active_exception_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1504;
+    AOT_Thread_active_stacktrace_offset = 1512;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -10641,24 +10855,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     216;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 264;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1592;
+    1624;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1584;
+    AOT_Thread_double_truncate_round_supported_offset = 1592;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -10668,14 +10882,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 688;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 680;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1536;
+    AOT_Thread_execution_state_offset = 1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -10687,22 +10901,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 712;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 704;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 696;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 720;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1512;
+    AOT_Thread_global_object_pool_offset = 1520;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1568;
+    AOT_Thread_exit_through_ffi_offset = 1576;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1600;
+    1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -10720,7 +10934,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -10745,17 +10959,17 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 664;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1520;
+    1528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1528;
+    AOT_Thread_saved_shadow_call_stack_offset = 1536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1544;
+    AOT_Thread_safepoint_state_offset = 1552;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -10790,9 +11004,24 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1552;
+    1560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1560;
+    AOT_Thread_callback_stack_return_offset = 1568;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1600;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    1608;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 16;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 24;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -10856,11 +11085,9 @@
     AOT_UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     16;
@@ -10868,8 +11095,8 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, -1,   -1,   1440, 1448,
-        1456, 1464, 1472, -1,   1480, 1488, -1,   -1};
+        1416, 1424, 1432, 1440, -1,   -1,   1448, 1456,
+        1464, 1472, 1480, -1,   1488, 1496, -1,   -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
@@ -10881,7 +11108,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 16;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -10909,6 +11138,8 @@
     AOT_Instructions_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
@@ -10926,7 +11157,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -10965,7 +11196,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     32;
 static constexpr dart::compiler::target::word
@@ -10996,10 +11227,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 16;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 8;
 static constexpr dart::compiler::target::word
@@ -11227,11 +11454,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 728;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1560;
+    AOT_Thread_active_exception_offset = 1568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1568;
+    AOT_Thread_active_stacktrace_offset = 1576;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -11257,24 +11484,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1640;
+    1648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     216;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 264;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1656;
+    1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1648;
+    AOT_Thread_double_truncate_round_supported_offset = 1656;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -11284,14 +11511,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 688;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 680;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1600;
+    AOT_Thread_execution_state_offset = 1608;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -11303,22 +11530,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 712;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 704;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 696;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 720;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1576;
+    AOT_Thread_global_object_pool_offset = 1584;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1632;
+    AOT_Thread_exit_through_ffi_offset = 1640;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1664;
+    1696;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -11336,7 +11563,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -11361,17 +11588,17 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 664;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1584;
+    1592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1592;
+    AOT_Thread_saved_shadow_call_stack_offset = 1600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1608;
+    AOT_Thread_safepoint_state_offset = 1616;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -11406,9 +11633,24 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1616;
+    1624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1624;
+    AOT_Thread_callback_stack_return_offset = 1632;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1664;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    1672;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 16;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 24;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -11472,11 +11714,9 @@
     AOT_UnhandledException_stacktrace_offset = 16;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     16;
@@ -11484,9 +11724,9 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488,
-        1496, 1504, 1512, 1520, -1,   -1,   -1,   -1,   1528, 1536, -1,
-        -1,   1544, 1552, 1560, -1,   -1,   -1,   -1,   -1,   -1};
+        1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496,
+        1504, 1512, 1520, 1528, -1,   -1,   -1,   -1,   1536, 1544, -1,
+        -1,   1552, 1560, 1568, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
@@ -11498,7 +11738,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 16;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 24;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -11526,6 +11768,8 @@
     AOT_Instructions_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
@@ -11543,7 +11787,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 40;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -11582,7 +11826,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     32;
 static constexpr dart::compiler::target::word
@@ -11610,10 +11854,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 16;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 8;
 static constexpr dart::compiler::target::word
@@ -11840,11 +12080,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 728;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1496;
+    AOT_Thread_active_exception_offset = 1504;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1504;
+    AOT_Thread_active_stacktrace_offset = 1512;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -11870,24 +12110,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1576;
+    1584;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     216;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 264;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1592;
+    1624;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1584;
+    AOT_Thread_double_truncate_round_supported_offset = 1592;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -11897,14 +12137,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 688;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 680;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1536;
+    AOT_Thread_execution_state_offset = 1544;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -11916,22 +12156,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 712;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 704;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 696;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 720;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1512;
+    AOT_Thread_global_object_pool_offset = 1520;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1568;
+    AOT_Thread_exit_through_ffi_offset = 1576;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1600;
+    1632;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -11949,7 +12189,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -11974,17 +12214,17 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 664;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1520;
+    1528;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1528;
+    AOT_Thread_saved_shadow_call_stack_offset = 1536;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1544;
+    AOT_Thread_safepoint_state_offset = 1552;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -12019,9 +12259,24 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1552;
+    1560;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1560;
+    AOT_Thread_callback_stack_return_offset = 1568;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1600;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    1608;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 16;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 24;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -12085,11 +12340,9 @@
     AOT_UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     12;
@@ -12097,8 +12350,8 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, -1,   -1,   1440, 1448,
-        1456, 1464, 1472, -1,   1480, 1488, -1,   -1};
+        1416, 1424, 1432, 1440, -1,   -1,   1448, 1456,
+        1464, 1472, 1480, -1,   1488, 1496, -1,   -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
@@ -12110,7 +12363,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 16;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 16;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -12138,6 +12393,8 @@
     AOT_Instructions_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
@@ -12155,7 +12412,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -12194,7 +12451,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 16;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     24;
 static constexpr dart::compiler::target::word
@@ -12222,10 +12479,6 @@
 static constexpr dart::compiler::target::word
     AOT_ExceptionHandlers_element_size = 12;
 static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_elements_start_offset = 40;
-static constexpr dart::compiler::target::word
-    AOT_InstructionsTable_element_size = 4;
-static constexpr dart::compiler::target::word
     AOT_ObjectPool_elements_start_offset = 16;
 static constexpr dart::compiler::target::word AOT_ObjectPool_element_size = 8;
 static constexpr dart::compiler::target::word
@@ -12452,11 +12705,11 @@
 static constexpr dart::compiler::target::word
     AOT_SubtypeTestCache_cache_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_Thread_AllocateArray_entry_point_offset = 728;
+    AOT_Thread_AllocateArray_entry_point_offset = 736;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_exception_offset = 1560;
+    AOT_Thread_active_exception_offset = 1568;
 static constexpr dart::compiler::target::word
-    AOT_Thread_active_stacktrace_offset = 1568;
+    AOT_Thread_active_stacktrace_offset = 1576;
 static constexpr dart::compiler::target::word
     AOT_Thread_array_write_barrier_code_offset = 232;
 static constexpr dart::compiler::target::word
@@ -12482,24 +12735,24 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_allocate_object_slow_stub_offset = 384;
 static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
-    1640;
+    1648;
 static constexpr dart::compiler::target::word
-    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+    AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 664;
 static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
     216;
 static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 208;
 static constexpr dart::compiler::target::word
-    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+    AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 648;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_entry_point_offset = 528;
 static constexpr dart::compiler::target::word
     AOT_Thread_call_to_runtime_stub_offset = 264;
 static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
-    1656;
+    1688;
 static constexpr dart::compiler::target::word
     AOT_Thread_dispatch_table_array_offset = 88;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_truncate_round_supported_offset = 1648;
+    AOT_Thread_double_truncate_round_supported_offset = 1656;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
     608;
 static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
@@ -12509,14 +12762,14 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_deoptimize_stub_offset = 448;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_abs_address_offset = 688;
+    AOT_Thread_double_abs_address_offset = 696;
 static constexpr dart::compiler::target::word
-    AOT_Thread_double_negate_address_offset = 680;
+    AOT_Thread_double_negate_address_offset = 688;
 static constexpr dart::compiler::target::word AOT_Thread_end_offset = 104;
 static constexpr dart::compiler::target::word
     AOT_Thread_enter_safepoint_stub_offset = 488;
 static constexpr dart::compiler::target::word
-    AOT_Thread_execution_state_offset = 1600;
+    AOT_Thread_execution_state_offset = 1608;
 static constexpr dart::compiler::target::word
     AOT_Thread_exit_safepoint_stub_offset = 496;
 static constexpr dart::compiler::target::word
@@ -12528,22 +12781,22 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_fix_callers_target_code_offset = 240;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_absolute_address_offset = 712;
+    AOT_Thread_float_absolute_address_offset = 720;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_negate_address_offset = 704;
+    AOT_Thread_float_negate_address_offset = 712;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_not_address_offset = 696;
+    AOT_Thread_float_not_address_offset = 704;
 static constexpr dart::compiler::target::word
-    AOT_Thread_float_zerow_address_offset = 720;
+    AOT_Thread_float_zerow_address_offset = 728;
 static constexpr dart::compiler::target::word
-    AOT_Thread_global_object_pool_offset = 1576;
+    AOT_Thread_global_object_pool_offset = 1584;
 static constexpr dart::compiler::target::word
     AOT_Thread_invoke_dart_code_stub_offset = 256;
 static constexpr dart::compiler::target::word
-    AOT_Thread_exit_through_ffi_offset = 1632;
+    AOT_Thread_exit_through_ffi_offset = 1640;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 80;
 static constexpr dart::compiler::target::word AOT_Thread_isolate_group_offset =
-    1664;
+    1696;
 static constexpr dart::compiler::target::word
     AOT_Thread_field_table_values_offset = 128;
 static constexpr dart::compiler::target::word
@@ -12561,7 +12814,7 @@
 static constexpr dart::compiler::target::word
     AOT_Thread_switchable_call_miss_stub_offset = 408;
 static constexpr dart::compiler::target::word
-    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+    AOT_Thread_no_scope_native_wrapper_entry_point_offset = 656;
 static constexpr dart::compiler::target::word
     AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word
@@ -12586,17 +12839,17 @@
 static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
     200;
 static constexpr dart::compiler::target::word
-    AOT_Thread_predefined_symbols_address_offset = 664;
+    AOT_Thread_predefined_symbols_address_offset = 672;
 static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
-    1584;
+    1592;
 static constexpr dart::compiler::target::word
-    AOT_Thread_saved_shadow_call_stack_offset = 1592;
+    AOT_Thread_saved_shadow_call_stack_offset = 1600;
 static constexpr dart::compiler::target::word
-    AOT_Thread_safepoint_state_offset = 1608;
+    AOT_Thread_safepoint_state_offset = 1616;
 static constexpr dart::compiler::target::word
     AOT_Thread_slow_type_test_stub_offset = 472;
 static constexpr dart::compiler::target::word
-    AOT_Thread_slow_type_test_entry_point_offset = 632;
+    AOT_Thread_slow_type_test_entry_point_offset = 640;
 static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
     56;
 static constexpr dart::compiler::target::word
@@ -12631,9 +12884,24 @@
     AOT_Thread_write_barrier_mask_offset = 64;
 static constexpr dart::compiler::target::word AOT_Thread_heap_base_offset = 72;
 static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
-    1616;
+    1624;
 static constexpr dart::compiler::target::word
-    AOT_Thread_callback_stack_return_offset = 1624;
+    AOT_Thread_callback_stack_return_offset = 1632;
+static constexpr dart::compiler::target::word AOT_Thread_random_offset = 1664;
+static constexpr dart::compiler::target::word
+    AOT_Thread_jump_to_frame_entry_point_offset = 632;
+static constexpr dart::compiler::target::word AOT_Thread_tsan_utils_offset =
+    1672;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_function_offset = 0;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_setjmp_buffer_offset = 8;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_pc_offset = 16;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_sp_offset = 24;
+static constexpr dart::compiler::target::word
+    AOT_TsanUtils_exception_fp_offset = 32;
 static constexpr dart::compiler::target::word
     AOT_TimelineStream_enabled_offset = 16;
 static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -12697,11 +12965,9 @@
     AOT_UnhandledException_stacktrace_offset = 12;
 static constexpr dart::compiler::target::word AOT_UserTag_tag_offset = 16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_expected_cid_offset = 16;
+    AOT_MonomorphicSmiableCall_expected_cid_offset = 8;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_entrypoint_offset = 24;
-static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_target_offset = 8;
+    AOT_MonomorphicSmiableCall_entrypoint_offset = 16;
 static constexpr dart::compiler::target::word AOT_WeakProperty_key_offset = 8;
 static constexpr dart::compiler::target::word AOT_WeakProperty_value_offset =
     12;
@@ -12709,9 +12975,9 @@
     8, 24, 16, 32};
 static constexpr dart::compiler::target::word
     AOT_Thread_write_barrier_wrappers_thread_offset[] = {
-        1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488,
-        1496, 1504, 1512, 1520, -1,   -1,   -1,   -1,   1528, 1536, -1,
-        -1,   1544, 1552, 1560, -1,   -1,   -1,   -1,   -1,   -1};
+        1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496,
+        1504, 1512, 1520, 1528, -1,   -1,   -1,   -1,   1536, 1544, -1,
+        -1,   1552, 1560, 1568, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word AOT_AbstractType_InstanceSize =
     24;
 static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
@@ -12723,7 +12989,9 @@
 static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
 static constexpr dart::compiler::target::word
-    AOT_CompressedStackMaps_HeaderSize = 16;
+    AOT_CompressedStackMaps_ObjectHeaderSize = 8;
+static constexpr dart::compiler::target::word
+    AOT_CompressedStackMaps_PayloadHeaderSize = 4;
 static constexpr dart::compiler::target::word AOT_Context_header_size = 16;
 static constexpr dart::compiler::target::word AOT_Double_InstanceSize = 16;
 static constexpr dart::compiler::target::word AOT_DynamicLibrary_InstanceSize =
@@ -12751,6 +13019,8 @@
     AOT_Instructions_UnalignedHeaderSize = 16;
 static constexpr dart::compiler::target::word
     AOT_InstructionsSection_UnalignedHeaderSize = 40;
+static constexpr dart::compiler::target::word
+    AOT_InstructionsTable_InstanceSize = 48;
 static constexpr dart::compiler::target::word AOT_Int32x4_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Integer_InstanceSize = 8;
 static constexpr dart::compiler::target::word
@@ -12768,7 +13038,7 @@
 static constexpr dart::compiler::target::word AOT_MirrorReference_InstanceSize =
     16;
 static constexpr dart::compiler::target::word
-    AOT_MonomorphicSmiableCall_InstanceSize = 32;
+    AOT_MonomorphicSmiableCall_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_Namespace_InstanceSize = 24;
 static constexpr dart::compiler::target::word AOT_NativeArguments_StructSize =
     32;
@@ -12807,7 +13077,7 @@
 static constexpr dart::compiler::target::word AOT_UnlinkedCall_InstanceSize =
     32;
 static constexpr dart::compiler::target::word AOT_UnwindError_InstanceSize = 16;
-static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_UserTag_InstanceSize = 32;
 static constexpr dart::compiler::target::word AOT_WeakProperty_InstanceSize =
     24;
 static constexpr dart::compiler::target::word
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 88ab5b2..1328b23 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -51,7 +51,6 @@
   ARRAY(Context, variable_offset)                                              \
   ARRAY(ContextScope, element_offset)                                          \
   ARRAY(ExceptionHandlers, element_offset)                                     \
-  ARRAY(InstructionsTable, element_offset)                                     \
   ARRAY(ObjectPool, element_offset)                                            \
   ARRAY(OneByteString, element_offset)                                         \
   ARRAY(TypeArguments, type_at_offset)                                         \
@@ -61,7 +60,6 @@
   ARRAY_SIZEOF(Context, InstanceSize, variable_offset)                         \
   ARRAY_SIZEOF(ContextScope, InstanceSize, element_offset)                     \
   ARRAY_SIZEOF(ExceptionHandlers, InstanceSize, element_offset)                \
-  ARRAY_SIZEOF(InstructionsTable, InstanceSize, element_offset)                \
   ARRAY_SIZEOF(ObjectPool, InstanceSize, element_offset)                       \
   ARRAY_SIZEOF(OneByteString, InstanceSize, element_offset)                    \
   ARRAY_SIZEOF(TypeArguments, InstanceSize, type_at_offset)                    \
@@ -286,6 +284,14 @@
   FIELD(Thread, heap_base_offset)                                              \
   FIELD(Thread, callback_code_offset)                                          \
   FIELD(Thread, callback_stack_return_offset)                                  \
+  FIELD(Thread, random_offset)                                                 \
+  FIELD(Thread, jump_to_frame_entry_point_offset)                              \
+  FIELD(Thread, tsan_utils_offset)                                             \
+  FIELD(TsanUtils, setjmp_function_offset)                                     \
+  FIELD(TsanUtils, setjmp_buffer_offset)                                       \
+  FIELD(TsanUtils, exception_pc_offset)                                        \
+  FIELD(TsanUtils, exception_sp_offset)                                        \
+  FIELD(TsanUtils, exception_fp_offset)                                        \
   FIELD(TimelineStream, enabled_offset)                                        \
   FIELD(TwoByteString, data_offset)                                            \
   FIELD(Type, arguments_offset)                                                \
@@ -323,7 +329,6 @@
   FIELD(UserTag, tag_offset)                                                   \
   FIELD(MonomorphicSmiableCall, expected_cid_offset)                           \
   FIELD(MonomorphicSmiableCall, entrypoint_offset)                             \
-  FIELD(MonomorphicSmiableCall, target_offset)                                 \
   FIELD(WeakProperty, key_offset)                                              \
   FIELD(WeakProperty, value_offset)                                            \
   RANGE(Code, entry_point_offset, CodeEntryKind, CodeEntryKind::kNormal,       \
@@ -343,7 +348,9 @@
   SIZEOF(Closure, InstanceSize, UntaggedClosure)                               \
   SIZEOF(ClosureData, InstanceSize, UntaggedClosureData)                       \
   SIZEOF(CodeSourceMap, HeaderSize, UntaggedCodeSourceMap)                     \
-  SIZEOF(CompressedStackMaps, HeaderSize, UntaggedCompressedStackMaps)         \
+  SIZEOF(CompressedStackMaps, ObjectHeaderSize, UntaggedCompressedStackMaps)   \
+  SIZEOF(CompressedStackMaps, PayloadHeaderSize,                               \
+         UntaggedCompressedStackMaps::Payload)                                 \
   SIZEOF(Context, header_size, UntaggedContext)                                \
   SIZEOF(Double, InstanceSize, UntaggedDouble)                                 \
   SIZEOF(DynamicLibrary, InstanceSize, UntaggedDynamicLibrary)                 \
@@ -363,6 +370,7 @@
   SIZEOF(Instructions, UnalignedHeaderSize, UntaggedInstructions)              \
   SIZEOF(InstructionsSection, UnalignedHeaderSize,                             \
          UntaggedInstructionsSection)                                          \
+  SIZEOF(InstructionsTable, InstanceSize, UntaggedInstructionsTable)           \
   SIZEOF(Int32x4, InstanceSize, UntaggedInt32x4)                               \
   SIZEOF(Integer, InstanceSize, UntaggedInteger)                               \
   SIZEOF(KernelProgramInfo, InstanceSize, UntaggedKernelProgramInfo)           \
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index 210001c..c4d5c98 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -48,6 +48,67 @@
   __ Ret();
 }
 
+void StubCodeCompiler::GenerateInitLateStaticFieldStub(Assembler* assembler,
+                                                       bool is_final) {
+  const Register kResultReg = InitStaticFieldABI::kResultReg;
+  const Register kFunctionReg = InitLateStaticFieldInternalRegs::kFunctionReg;
+  const Register kFieldReg = InitStaticFieldABI::kFieldReg;
+  const Register kAddressReg = InitLateStaticFieldInternalRegs::kAddressReg;
+  const Register kScratchReg = InitLateStaticFieldInternalRegs::kScratchReg;
+
+  __ EnterStubFrame();
+
+  __ Comment("Calling initializer function");
+  __ PushRegister(kFieldReg);
+  __ LoadCompressedFieldFromOffset(
+      kFunctionReg, kFieldReg, target::Field::initializer_function_offset());
+  if (!FLAG_precompiled_mode) {
+    __ LoadCompressedFieldFromOffset(CODE_REG, kFunctionReg,
+                                     target::Function::code_offset());
+    // Load a GC-safe value for the arguments descriptor (unused but tagged).
+    __ LoadImmediate(ARGS_DESC_REG, 0);
+  }
+  __ Call(FieldAddress(kFunctionReg, target::Function::entry_point_offset()));
+  __ MoveRegister(kResultReg, CallingConventions::kReturnReg);
+  __ PopRegister(kFieldReg);
+  __ LoadStaticFieldAddress(kAddressReg, kFieldReg, kScratchReg);
+
+  Label throw_exception;
+  if (is_final) {
+    __ Comment("Checking that initializer did not set late final field");
+    __ LoadFromOffset(kScratchReg, kAddressReg, 0);
+    __ CompareObject(kScratchReg, SentinelObject());
+    __ BranchIf(NOT_EQUAL, &throw_exception);
+  }
+
+  __ StoreToOffset(kResultReg, kAddressReg, 0);
+  __ LeaveStubFrame();
+  __ Ret();
+
+  if (is_final) {
+#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
+    // We are jumping over LeaveStubFrame so restore LR state to match one
+    // at the jump point.
+    __ set_lr_state(compiler::LRState::OnEntry().EnterFrame());
+#endif  // defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64)
+    __ Bind(&throw_exception);
+    __ PushObject(NullObject());  // Make room for (unused) result.
+    __ PushRegister(kFieldReg);
+    __ CallRuntime(kLateFieldAssignedDuringInitializationErrorRuntimeEntry,
+                   /*argument_count=*/1);
+    __ Breakpoint();
+  }
+}
+
+void StubCodeCompiler::GenerateInitLateStaticFieldStub(Assembler* assembler) {
+  GenerateInitLateStaticFieldStub(assembler, /*is_final=*/false);
+}
+
+void StubCodeCompiler::GenerateInitLateFinalStaticFieldStub(
+    Assembler* assembler) {
+  GenerateInitLateStaticFieldStub(assembler, /*is_final=*/true);
+}
+
 void StubCodeCompiler::GenerateInitInstanceFieldStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ PushObject(NullObject());  // Make room for result.
@@ -82,7 +143,7 @@
   __ LoadCompressedFieldFromOffset(
       kFunctionReg, InitInstanceFieldABI::kFieldReg,
       target::Field::initializer_function_offset());
-  if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     __ LoadCompressedFieldFromOffset(CODE_REG, kFunctionReg,
                                      target::Function::code_offset());
     // Load a GC-safe value for the arguments descriptor (unused but tagged).
@@ -675,7 +736,7 @@
 void StubCodeCompiler::GenerateSlowTypeTestStub(Assembler* assembler) {
   Label done, call_runtime;
 
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     __ LoadFromOffset(CODE_REG, THR,
                       target::Thread::slow_type_test_stub_offset());
   }
@@ -807,13 +868,9 @@
       // entry point in bare instructions mode or to 0 otherwise (to catch
       // misuse). This overwrites the scratch register, but there are no more
       // boxed fields.
-      if (FLAG_use_bare_instructions) {
-        __ LoadFromSlot(AllocateClosureABI::kScratchReg,
-                        AllocateClosureABI::kFunctionReg,
-                        Slot::Function_entry_point());
-      } else {
-        __ LoadImmediate(AllocateClosureABI::kScratchReg, 0);
-      }
+      __ LoadFromSlot(AllocateClosureABI::kScratchReg,
+                      AllocateClosureABI::kFunctionReg,
+                      Slot::Function_entry_point());
       __ StoreToSlotNoBarrier(AllocateClosureABI::kScratchReg,
                               AllocateClosureABI::kResultReg,
                               Slot::Closure_entry_point());
@@ -1015,12 +1072,6 @@
 #undef EMIT_BOX_ALLOCATION
 
 void StubCodeCompiler::GenerateBoxDoubleStub(Assembler* assembler) {
-#if defined(TARGET_ARCH_ARM)
-  if (!TargetCPUFeatures::vfp_supported()) {
-    __ Breakpoint();
-    return;
-  }
-#endif  // defined(TARGET_ARCH_ARM)
   Label call_runtime;
   if (!FLAG_use_slow_path && FLAG_inline_alloc) {
     __ TryAllocate(compiler::DoubleClass(), &call_runtime,
@@ -1043,12 +1094,6 @@
 }
 
 void StubCodeCompiler::GenerateDoubleToIntegerStub(Assembler* assembler) {
-#if defined(TARGET_ARCH_ARM)
-  if (!TargetCPUFeatures::vfp_supported()) {
-    __ Breakpoint();
-    return;
-  }
-#endif  // defined(TARGET_ARCH_ARM)
   __ EnterStubFrame();
   __ StoreUnboxedDouble(DoubleToIntegerStubABI::kInputReg, THR,
                         target::Thread::unboxed_double_runtime_arg_offset());
diff --git a/runtime/vm/compiler/stub_code_compiler.h b/runtime/vm/compiler/stub_code_compiler.h
index 58f52ce..fc28901 100644
--- a/runtime/vm/compiler/stub_code_compiler.h
+++ b/runtime/vm/compiler/stub_code_compiler.h
@@ -151,6 +151,11 @@
   static intptr_t WordOffsetFromFpToCpuRegister(Register cpu_register);
 
  private:
+  // Common function for generating InitLateStaticField and
+  // InitLateFinalStaticField stubs.
+  static void GenerateInitLateStaticFieldStub(Assembler* assembler,
+                                              bool is_final);
+
   // Common function for generating InitLateInstanceField and
   // InitLateFinalInstanceField stubs.
   static void GenerateInitLateInstanceFieldStub(Assembler* assembler,
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index eefb057..e31e943 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -140,7 +140,7 @@
 
   // Restore the global object pool after returning from runtime (old space is
   // moving, so the GOP could have been relocated).
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   }
 
@@ -161,13 +161,6 @@
     intptr_t self_code_stub_offset_from_thread,
     bool allow_return,
     std::function<void()> perform_runtime_call) {
-  // If the target CPU does not support VFP the caller should always use the
-  // non-FPU stub.
-  if (save_fpu_registers && !TargetCPUFeatures::vfp_supported()) {
-    __ Breakpoint();
-    return;
-  }
-
   // We want the saved registers to appear like part of the caller's frame, so
   // we push them before calling EnterStubFrame.
   RegisterSet all_registers;
@@ -604,7 +597,7 @@
 
   // Restore the global object pool after returning from runtime (old space is
   // moving, so the GOP could have been relocated).
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   }
 
@@ -825,7 +818,6 @@
     }
   }
 
-  if (TargetCPUFeatures::vfp_supported()) {
     ASSERT(kFpuRegisterSize == 4 * target::kWordSize);
     if (kNumberOfDRegisters > 16) {
       __ vstmd(DB_W, SP, D16, kNumberOfDRegisters - 16);
@@ -833,9 +825,6 @@
     } else {
       __ vstmd(DB_W, SP, D0, kNumberOfDRegisters);
     }
-  } else {
-    __ AddImmediate(SP, -kNumberOfFpuRegisters * kFpuRegisterSize);
-  }
 
   __ mov(R0, Operand(SP));  // Pass address of saved registers block.
   bool is_lazy =
@@ -1278,7 +1267,7 @@
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
     __ LoadImmediate(CODE_REG, 0);  // GC safe value into CODE_REG.
   } else {
@@ -1845,7 +1834,7 @@
   const Register kClsReg = R1;
   const Register kTagsReg = R2;
 
-  if (!FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     __ ldr(CODE_REG,
            Address(THR, target::Thread::call_to_runtime_stub_offset()));
   }
@@ -2659,8 +2648,7 @@
   // the corresponding slot in the current cache entry.
 
   // NOTFP must be preserved for bare payloads, otherwise CODE_REG.
-  const bool use_bare_payloads =
-      FLAG_precompiled_mode && FLAG_use_bare_instructions;
+  const bool use_bare_payloads = FLAG_precompiled_mode;
   // For this, we choose the register that need not be preserved of the pair.
   const Register kNullReg = use_bare_payloads ? CODE_REG : NOTFP;
   __ LoadObject(kNullReg, NullObject());
@@ -2926,7 +2914,7 @@
   __ StoreToOffset(R2, THR, target::Thread::top_exit_frame_info_offset());
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
     __ set_constant_pool_allowed(true);
   } else {
@@ -3150,7 +3138,7 @@
   // illegal class id was found, the target is a cache miss handler that can
   // be invoked as a normal Dart function.
   __ ldr(R0, FieldAddress(IP, base + target::kWordSize));
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     __ ldr(CODE_REG, FieldAddress(R0, target::Function::code_offset()));
   }
   __ ldr(ARGS_DESC_REG,
@@ -3196,7 +3184,7 @@
   __ b(&loop);
 
   __ Bind(&found);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     const intptr_t entry_offset =
         target::ICData::EntryPointIndexFor(1) * target::kWordSize;
     __ LoadCompressed(R0, Address(R8, entry_offset));
@@ -3225,34 +3213,20 @@
     Assembler* assembler) {
   __ LoadClassIdMayBeSmi(IP, R0);
 
-  // expected_cid_ should come right after target_
-  ASSERT(target::MonomorphicSmiableCall::expected_cid_offset() ==
-         target::MonomorphicSmiableCall::target_offset() + target::kWordSize);
   // entrypoint_ should come right after expected_cid_
   ASSERT(target::MonomorphicSmiableCall::entrypoint_offset() ==
          target::MonomorphicSmiableCall::expected_cid_offset() +
              target::kWordSize);
 
-  if (FLAG_use_bare_instructions) {
-    // Simultaneously load the expected cid into R2 and the entrypoint into R3.
-    __ ldrd(
-        R2, R3, R9,
-        target::MonomorphicSmiableCall::expected_cid_offset() - kHeapObjectTag);
-    __ cmp(R2, Operand(IP));
-    __ Branch(Address(THR, target::Thread::switchable_call_miss_entry_offset()),
-              NE);
-    __ bx(R3);
-  } else {
-    // Simultaneously load the target into R2 and the expected cid into R3.
-    __ ldrd(R2, R3, R9,
-            target::MonomorphicSmiableCall::target_offset() - kHeapObjectTag);
-    __ mov(CODE_REG, Operand(R2));
-    __ cmp(R3, Operand(IP));
-    __ Branch(Address(THR, target::Thread::switchable_call_miss_entry_offset()),
-              NE);
-    __ LoadField(IP, FieldAddress(R2, target::Code::entry_point_offset()));
-    __ bx(IP);
-  }
+  // Note: this stub is only used in AOT mode, hence the direct (bare) call.
+  // Simultaneously load the expected cid into R2 and the entrypoint into R3.
+  __ ldrd(
+      R2, R3, R9,
+      target::MonomorphicSmiableCall::expected_cid_offset() - kHeapObjectTag);
+  __ cmp(R2, Operand(IP));
+  __ Branch(Address(THR, target::Thread::switchable_call_miss_entry_offset()),
+            NE);
+  __ bx(R3);
 }
 
 static void CallSwitchableCallMissRuntimeEntry(Assembler* assembler,
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 54196b7..af8d3c5 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -150,15 +150,14 @@
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
-  __ LoadImmediate(R2, 0);
-  __ StoreToOffset(R2, THR, target::Thread::exit_through_ffi_offset());
+  __ StoreToOffset(ZR, THR, target::Thread::exit_through_ffi_offset());
 
   // Reset exit frame information in Isolate's mutator thread structure.
   __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
 
   // Restore the global object pool after returning from runtime (old space is
   // moving, so the GOP could have been relocated).
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   }
 
@@ -722,15 +721,14 @@
   __ StoreToOffset(R2, THR, target::Thread::vm_tag_offset());
 
   // Mark that the thread has not exited generated Dart code.
-  __ LoadImmediate(R2, 0);
-  __ StoreToOffset(R2, THR, target::Thread::exit_through_ffi_offset());
+  __ StoreToOffset(ZR, THR, target::Thread::exit_through_ffi_offset());
 
   // Reset exit frame information in Isolate's mutator thread structure.
   __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
 
   // Restore the global object pool after returning from runtime (old space is
   // moving, so the GOP could have been relocated).
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   }
 
@@ -1389,8 +1387,7 @@
 
   __ LoadFromOffset(R6, THR, target::Thread::exit_through_ffi_offset());
   __ Push(R6);
-  __ LoadImmediate(R6, 0);
-  __ StoreToOffset(R6, THR, target::Thread::exit_through_ffi_offset());
+  __ StoreToOffset(ZR, THR, target::Thread::exit_through_ffi_offset());
 
   __ LoadFromOffset(R6, THR, target::Thread::top_exit_frame_info_offset());
   __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
@@ -1440,7 +1437,7 @@
   __ b(&push_arguments, LT);
   __ Bind(&done_push_arguments);
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
     __ mov(CODE_REG, ZR);  // GC-safe value into CODE_REG.
   } else {
@@ -2006,7 +2003,7 @@
 void StubCodeCompiler::GenerateAllocateObjectSlowStub(Assembler* assembler) {
   const Register kTagsToClsIdReg = R2;
 
-  if (!FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     __ ldr(CODE_REG,
            Address(THR, target::Thread::call_to_runtime_stub_offset()));
   }
@@ -3113,7 +3110,7 @@
   __ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ SetupGlobalPoolAndDispatchTable();
   } else {
     __ LoadPoolPointer();
@@ -3224,8 +3221,8 @@
 
   __ Bind(&reference_compare);
   __ CompareObjectRegisters(left, right);
-  // None of the branches above go directly here to avoid generating a conditional 
-  // branch to a ret instruction.
+  // None of the branches above go directly here to avoid generating a
+  // conditional branch to a ret instruction.
   // This is an attempt to work-around a possible CPU on Exynos 2100 SoC.
   // See https://github.com/flutter/flutter/issues/88261
   __ ret();
@@ -3335,7 +3332,7 @@
   __ ldr(R1, FieldAddress(R0, target::Function::entry_point_offset()));
   __ ldr(ARGS_DESC_REG,
          FieldAddress(R5, target::CallSiteData::arguments_descriptor_offset()));
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     __ LoadCompressed(CODE_REG,
                       FieldAddress(R0, target::Function::code_offset()));
   }
@@ -3388,7 +3385,7 @@
   __ b(&loop);
 
   __ Bind(&found);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     const intptr_t entry_offset =
         target::ICData::EntryPointIndexFor(1) * target::kCompressedWordSize;
     __ LoadCompressed(R1,
@@ -3422,30 +3419,16 @@
   Label miss;
   __ LoadClassIdMayBeSmi(IP0, R0);
 
-  if (FLAG_use_bare_instructions) {
-    __ LoadField(
-        IP1, FieldAddress(
-                 R5, target::MonomorphicSmiableCall::expected_cid_offset()));
-    __ LoadField(
-        R1,
-        FieldAddress(R5, target::MonomorphicSmiableCall::entrypoint_offset()));
-    __ cmp(IP0, Operand(IP1));
-    __ b(&miss, NE);
-    __ br(R1);
-  } else {
-    __ LoadField(
-        IP1, FieldAddress(
-                 R5, target::MonomorphicSmiableCall::expected_cid_offset()));
-    __ LoadField(
-        CODE_REG,
-        FieldAddress(R5, target::MonomorphicSmiableCall::target_offset()));
-    __ LoadField(
-        R1,
-        FieldAddress(R5, target::MonomorphicSmiableCall::entrypoint_offset()));
-    __ cmp(IP0, Operand(IP1));
-    __ b(&miss, NE);
-    __ br(R1);
-  }
+  // Note: this stub is only used in AOT mode, hence the direct (bare) call.
+  __ LoadField(
+      IP1,
+      FieldAddress(R5, target::MonomorphicSmiableCall::expected_cid_offset()));
+  __ LoadField(
+      R1,
+      FieldAddress(R5, target::MonomorphicSmiableCall::entrypoint_offset()));
+  __ cmp(IP0, Operand(IP1));
+  __ b(&miss, NE);
+  __ br(R1);
 
   __ Bind(&miss);
   __ ldr(IP0,
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 12079e9..ae87dca 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -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.
 
+#include <setjmp.h>
+
 #include "vm/compiler/runtime_api.h"
 #include "vm/globals.h"
 
@@ -58,6 +60,102 @@
   __ Bind(&done);
 }
 
+// In TSAN mode the runtime will throw an exception using an intermediary
+// longjmp() call to unwind the C frames in a way that TSAN can understand.
+//
+// This wrapper will setup a [jmp_buf] on the stack and initialize it to be a
+// target for a possible longjmp(). In the exceptional case we'll forward
+// control of execution to the usual JumpToFrame stub.
+//
+// In non-TSAN mode this will do nothing and the runtime will call the
+// JumpToFrame stub directly.
+//
+// The callback [fun] may be invoked with a modified [RSP] due to allocating
+// a [jmp_buf] allocating structure on the stack (as well as the saved old
+// [Thread::tsan_utils_->setjmp_buffer_]).
+static void WithExceptionCatchingTrampoline(Assembler* assembler,
+                                            std::function<void()> fun) {
+#if defined(USING_THREAD_SANITIZER)
+  const Register kTsanUtilsReg = RAX;
+
+  // Reserve space for arguments and align frame before entering C++ world.
+  const intptr_t kJumpBufferSize = sizeof(jmp_buf);
+  // Save & Restore the volatile CPU registers across the setjmp() call.
+  const RegisterSet volatile_registers(
+      CallingConventions::kVolatileCpuRegisters & ~(1 << RAX),
+      /*fpu_registers=*/0);
+
+  const Register kSavedRspReg = R12;
+  COMPILE_ASSERT(IsCalleeSavedRegister(kSavedRspReg));
+  // We rely on THR being preserved across the setjmp() call.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+
+  Label do_native_call;
+
+  // Save old jmp_buf.
+  __ movq(kTsanUtilsReg, Address(THR, target::Thread::tsan_utils_offset()));
+  __ pushq(Address(kTsanUtilsReg, target::TsanUtils::setjmp_buffer_offset()));
+
+  // Allocate jmp_buf struct on stack & remember pointer to it on the
+  // [Thread::tsan_utils_->setjmp_buffer] (which exceptions.cc will longjmp()
+  // to)
+  __ AddImmediate(RSP, Immediate(-kJumpBufferSize));
+  __ movq(Address(kTsanUtilsReg, target::TsanUtils::setjmp_buffer_offset()),
+          RSP);
+
+  // Call setjmp() with a pointer to the allocated jmp_buf struct.
+  __ MoveRegister(CallingConventions::kArg1Reg, RSP);
+  __ PushRegisters(volatile_registers);
+  if (OS::ActivationFrameAlignment() > 1) {
+    __ MoveRegister(kSavedRspReg, RSP);
+    __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
+  }
+  __ movq(kTsanUtilsReg, Address(THR, target::Thread::tsan_utils_offset()));
+  __ CallCFunction(
+      Address(kTsanUtilsReg, target::TsanUtils::setjmp_function_offset()),
+      /*restore_rsp=*/true);
+  if (OS::ActivationFrameAlignment() > 1) {
+    __ MoveRegister(RSP, kSavedRspReg);
+  }
+  __ PopRegisters(volatile_registers);
+
+  // We are the target of a longjmp() iff setjmp() returns non-0.
+  __ CompareImmediate(RAX, 0);
+  __ BranchIf(EQUAL, &do_native_call);
+
+  // We are the target of a longjmp: Cleanup the stack and tail-call the
+  // JumpToFrame stub which will take care of unwinding the stack and hand
+  // execution to the catch entry.
+  __ AddImmediate(RSP, Immediate(kJumpBufferSize));
+  __ movq(kTsanUtilsReg, Address(THR, target::Thread::tsan_utils_offset()));
+  __ popq(Address(kTsanUtilsReg, target::TsanUtils::setjmp_buffer_offset()));
+
+  __ movq(CallingConventions::kArg1Reg,
+          Address(kTsanUtilsReg, target::TsanUtils::exception_pc_offset()));
+  __ movq(CallingConventions::kArg2Reg,
+          Address(kTsanUtilsReg, target::TsanUtils::exception_sp_offset()));
+  __ movq(CallingConventions::kArg3Reg,
+          Address(kTsanUtilsReg, target::TsanUtils::exception_fp_offset()));
+  __ MoveRegister(CallingConventions::kArg4Reg, THR);
+  __ jmp(Address(THR, target::Thread::jump_to_frame_entry_point_offset()));
+
+  // We leave the created [jump_buf] structure on the stack as well as the
+  // pushed old [Thread::tsan_utils_->setjmp_buffer_].
+  __ Bind(&do_native_call);
+  __ MoveRegister(kSavedRspReg, RSP);
+#endif  // defined(USING_THREAD_SANITIZER)
+
+  fun();
+
+#if defined(USING_THREAD_SANITIZER)
+  __ MoveRegister(RSP, kSavedRspReg);
+  __ AddImmediate(RSP, Immediate(kJumpBufferSize));
+  const Register kTsanUtilsReg2 = kSavedRspReg;
+  __ movq(kTsanUtilsReg2, Address(THR, target::Thread::tsan_utils_offset()));
+  __ popq(Address(kTsanUtilsReg2, target::TsanUtils::setjmp_buffer_offset()));
+#endif  // defined(USING_THREAD_SANITIZER)
+}
+
 // Input parameters:
 //   RSP : points to return address.
 //   RSP + 8 : address of last argument in argument array.
@@ -99,51 +197,54 @@
   // Mark that the thread is executing VM code.
   __ movq(Assembler::VMTagAddress(), RBX);
 
-  // Reserve space for arguments and align frame before entering C++ world.
-  __ subq(RSP, Immediate(target::NativeArguments::StructSize()));
-  if (OS::ActivationFrameAlignment() > 1) {
-    __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
-  }
+  WithExceptionCatchingTrampoline(assembler, [&]() {
+    // Reserve space for arguments and align frame before entering C++ world.
+    __ subq(RSP, Immediate(target::NativeArguments::StructSize()));
+    if (OS::ActivationFrameAlignment() > 1) {
+      __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
+    }
 
-  // Pass target::NativeArguments structure by value and call runtime.
-  __ movq(Address(RSP, thread_offset), THR);  // Set thread in NativeArgs.
-  // There are no runtime calls to closures, so we do not need to set the tag
-  // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
-  __ movq(Address(RSP, argc_tag_offset),
-          R10);  // Set argc in target::NativeArguments.
-  // Compute argv.
-  __ leaq(RAX,
-          Address(RBP, R10, TIMES_8,
-                  target::frame_layout.param_end_from_fp * target::kWordSize));
-  __ movq(Address(RSP, argv_offset),
-          RAX);  // Set argv in target::NativeArguments.
-  __ addq(RAX,
-          Immediate(1 * target::kWordSize));  // Retval is next to 1st argument.
-  __ movq(Address(RSP, retval_offset),
-          RAX);  // Set retval in target::NativeArguments.
+    // Pass target::NativeArguments structure by value and call runtime.
+    __ movq(Address(RSP, thread_offset), THR);  // Set thread in NativeArgs.
+    // There are no runtime calls to closures, so we do not need to set the tag
+    // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
+    __ movq(Address(RSP, argc_tag_offset),
+            R10);  // Set argc in target::NativeArguments.
+    // Compute argv.
+    __ leaq(RAX, Address(RBP, R10, TIMES_8,
+                         target::frame_layout.param_end_from_fp *
+                             target::kWordSize));
+    __ movq(Address(RSP, argv_offset),
+            RAX);  // Set argv in target::NativeArguments.
+    __ addq(
+        RAX,
+        Immediate(1 * target::kWordSize));  // Retval is next to 1st argument.
+    __ movq(Address(RSP, retval_offset),
+            RAX);  // Set retval in target::NativeArguments.
 #if defined(DART_TARGET_OS_WINDOWS)
-  ASSERT(target::NativeArguments::StructSize() >
-         CallingConventions::kRegisterTransferLimit);
-  __ movq(CallingConventions::kArg1Reg, RSP);
+    ASSERT(target::NativeArguments::StructSize() >
+           CallingConventions::kRegisterTransferLimit);
+    __ movq(CallingConventions::kArg1Reg, RSP);
 #endif
-  __ CallCFunction(RBX);
+    __ CallCFunction(RBX);
 
-  // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+    // Mark that the thread is executing Dart code.
+    __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
-  // Mark that the thread has not exited generated Dart code.
-  __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
+    // Mark that the thread has not exited generated Dart code.
+    __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
+            Immediate(0));
 
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
+    // Reset exit frame information in Isolate's mutator thread structure.
+    __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
+            Immediate(0));
 
-  // Restore the global object pool after returning from runtime (old space is
-  // moving, so the GOP could have been relocated).
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
-  }
+    // Restore the global object pool after returning from runtime (old space is
+    // moving, so the GOP could have been relocated).
+    if (FLAG_precompiled_mode) {
+      __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
+    }
+  });
 
   __ LeaveStubFrame();
 
@@ -565,7 +666,7 @@
 // Input parameters:
 //   RSP : points to return address.
 //   RSP + 8 : address of return value.
-//   RAX : address of first argument in argument array.
+//   R13 : address of first argument in argument array.
 //   RBX : address of the native function to call.
 //   R10 : argc_tag including number of arguments and function kind.
 static void GenerateCallNativeWithWrapperStub(Assembler* assembler,
@@ -605,49 +706,51 @@
   // Mark that the thread is executing native code.
   __ movq(Assembler::VMTagAddress(), RBX);
 
-  // Reserve space for the native arguments structure passed on the stack (the
-  // outgoing pointer parameter to the native arguments structure is passed in
-  // RDI) and align frame before entering the C++ world.
-  __ subq(RSP, Immediate(target::NativeArguments::StructSize()));
-  if (OS::ActivationFrameAlignment() > 1) {
-    __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
-  }
+  WithExceptionCatchingTrampoline(assembler, [&]() {
+    // Reserve space for the native arguments structure passed on the stack (the
+    // outgoing pointer parameter to the native arguments structure is passed in
+    // RDI) and align frame before entering the C++ world.
+    __ subq(RSP, Immediate(target::NativeArguments::StructSize()));
+    if (OS::ActivationFrameAlignment() > 1) {
+      __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
+    }
 
-  // Pass target::NativeArguments structure by value and call native function.
-  __ movq(Address(RSP, thread_offset), THR);  // Set thread in NativeArgs.
-  __ movq(Address(RSP, argc_tag_offset),
-          R10);  // Set argc in target::NativeArguments.
-  __ movq(Address(RSP, argv_offset),
-          RAX);  // Set argv in target::NativeArguments.
-  __ leaq(RAX,
-          Address(RBP, 2 * target::kWordSize));  // Compute return value addr.
-  __ movq(Address(RSP, retval_offset),
-          RAX);  // Set retval in target::NativeArguments.
+    // Pass target::NativeArguments structure by value and call native function.
+    __ movq(Address(RSP, thread_offset), THR);  // Set thread in NativeArgs.
+    __ movq(Address(RSP, argc_tag_offset),
+            R10);  // Set argc in target::NativeArguments.
+    __ movq(Address(RSP, argv_offset),
+            R13);  // Set argv in target::NativeArguments.
+    __ leaq(RAX,
+            Address(RBP, 2 * target::kWordSize));  // Compute return value addr.
+    __ movq(Address(RSP, retval_offset),
+            RAX);  // Set retval in target::NativeArguments.
 
-  // Pass the pointer to the target::NativeArguments.
-  __ movq(CallingConventions::kArg1Reg, RSP);
-  // Pass pointer to function entrypoint.
-  __ movq(CallingConventions::kArg2Reg, RBX);
+    // Pass the pointer to the target::NativeArguments.
+    __ movq(CallingConventions::kArg1Reg, RSP);
+    // Pass pointer to function entrypoint.
+    __ movq(CallingConventions::kArg2Reg, RBX);
 
-  __ movq(RAX, wrapper_address);
-  __ CallCFunction(RAX);
+    __ movq(RAX, wrapper_address);
+    __ CallCFunction(RAX);
 
-  // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+    // Mark that the thread is executing Dart code.
+    __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
 
-  // Mark that the thread has not exited generated Dart code.
-  __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
-          Immediate(0));
+    // Mark that the thread has not exited generated Dart code.
+    __ movq(Address(THR, target::Thread::exit_through_ffi_offset()),
+            Immediate(0));
 
-  // Reset exit frame information in Isolate's mutator thread structure.
-  __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
-          Immediate(0));
+    // Reset exit frame information in Isolate's mutator thread structure.
+    __ movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
+            Immediate(0));
 
-  // Restore the global object pool after returning from runtime (old space is
-  // moving, so the GOP could have been relocated).
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
-  }
+    // Restore the global object pool after returning from runtime (old space is
+    // moving, so the GOP could have been relocated).
+    if (FLAG_precompiled_mode) {
+      __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
+    }
+  });
 
   __ LeaveStubFrame();
   __ ret();
@@ -1366,7 +1469,7 @@
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
     __ xorq(CODE_REG, CODE_REG);  // GC-safe value into CODE_REG.
   } else {
@@ -1935,7 +2038,7 @@
 void StubCodeCompiler::GenerateAllocateObjectSlowStub(Assembler* assembler) {
   const Register kTagsToClsIdReg = R8;
 
-  if (!FLAG_use_bare_instructions) {
+  if (!FLAG_precompiled_mode) {
     __ movq(CODE_REG,
             Address(THR, target::Thread::call_to_runtime_stub_offset()));
   }
@@ -3052,7 +3155,7 @@
           Immediate(0));
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     __ movq(PP, Address(THR, target::Thread::global_object_pool_offset()));
   } else {
     __ LoadPoolPointer(PP);
@@ -3274,7 +3377,7 @@
   __ movq(R10, FieldAddress(
                    RBX, target::CallSiteData::arguments_descriptor_offset()));
   __ movq(RCX, FieldAddress(RAX, target::Function::entry_point_offset()));
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     __ LoadCompressed(CODE_REG,
                       FieldAddress(RAX, target::Function::code_offset()));
   }
@@ -3329,7 +3432,7 @@
   __ jmp(&loop);
 
   __ Bind(&found);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     const intptr_t entry_offset =
         target::ICData::EntryPointIndexFor(1) * target::kCompressedWordSize;
     __ LoadCompressed(RCX, Address(R13, entry_offset));
@@ -3362,14 +3465,9 @@
   __ Bind(&have_cid);
   __ cmpq(RAX, RCX);
   __ j(NOT_EQUAL, &miss, Assembler::kNearJump);
-  if (FLAG_use_bare_instructions) {
-    __ jmp(
-        FieldAddress(RBX, target::MonomorphicSmiableCall::entrypoint_offset()));
-  } else {
-    __ movq(CODE_REG,
-            FieldAddress(RBX, target::MonomorphicSmiableCall::target_offset()));
-    __ jmp(FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  }
+  // Note: this stub is only used in AOT mode, hence the direct (bare) call.
+  __ jmp(
+      FieldAddress(RBX, target::MonomorphicSmiableCall::entrypoint_offset()));
 
   __ Bind(&miss);
   __ jmp(Address(THR, target::Thread::switchable_call_miss_entry_offset()));
diff --git a/runtime/vm/compiler/write_barrier_elimination_test.cc b/runtime/vm/compiler/write_barrier_elimination_test.cc
index 936d432..1275b14 100644
--- a/runtime/vm/compiler/write_barrier_elimination_test.cc
+++ b/runtime/vm/compiler/write_barrier_elimination_test.cc
@@ -298,8 +298,59 @@
       },
       kMoveGlob));
 
-  EXPECT(store1->ShouldEmitStoreBarrier());
-  EXPECT(store2->ShouldEmitStoreBarrier());
+  EXPECT(!store1->ShouldEmitStoreBarrier());
+  EXPECT(!store2->ShouldEmitStoreBarrier());
+}
+
+ISOLATE_UNIT_TEST_CASE(IRTest_WriteBarrierElimination_LoadLateStaticField) {
+  DEBUG_ONLY(
+      SetFlagScope<bool> sfs(&FLAG_trace_write_barrier_elimination, true));
+  const char* kScript = R"(
+    class A {
+    }
+
+    class B {
+    }
+
+    class C {
+      C(this.a, this.b);
+      A a;
+      B b;
+    }
+
+    late var x = new B();
+
+    foo(A a) => C(a, x);
+
+    main() { foo(A()); }
+    )";
+
+  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+
+  Invoke(root_library, "main");
+
+  const auto& function = Function::Handle(GetFunction(root_library, "foo"));
+  TestPipeline pipeline(function, CompilerPass::kJIT);
+  FlowGraph* flow_graph = pipeline.RunPasses({});
+
+  auto entry = flow_graph->graph_entry()->normal_entry();
+  EXPECT(entry != nullptr);
+
+  StoreInstanceFieldInstr* store1 = nullptr;
+  StoreInstanceFieldInstr* store2 = nullptr;
+
+  ILMatcher cursor(flow_graph, entry);
+  RELEASE_ASSERT(cursor.TryMatch(
+      {
+          kMatchAndMoveAllocateObject,
+          kMatchAndMoveLoadStaticField,
+          {kMatchAndMoveStoreInstanceField, &store1},
+          {kMatchAndMoveStoreInstanceField, &store2},
+      },
+      kMoveGlob));
+
+  EXPECT(!store1->ShouldEmitStoreBarrier());
+  EXPECT(!store2->ShouldEmitStoreBarrier());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 6adbe81..c774203 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -412,10 +412,17 @@
 
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
-  static const Register kFieldReg = R0;
+  static const Register kFieldReg = R2;
   static const Register kResultReg = R0;
 };
 
+// Registers used inside the implementation of InitLateStaticFieldStub.
+struct InitLateStaticFieldInternalRegs {
+  static const Register kFunctionReg = R0;
+  static const Register kAddressReg = R3;
+  static const Register kScratchReg = R4;
+};
+
 // ABI for InitInstanceFieldStub.
 struct InitInstanceFieldABI {
   static const Register kInstanceReg = R1;
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 28ac726..7947a60 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -251,10 +251,17 @@
 
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
-  static const Register kFieldReg = R0;
+  static const Register kFieldReg = R2;
   static const Register kResultReg = R0;
 };
 
+// Registers used inside the implementation of InitLateStaticFieldStub.
+struct InitLateStaticFieldInternalRegs {
+  static const Register kFunctionReg = R0;
+  static const Register kAddressReg = R3;
+  static const Register kScratchReg = R4;
+};
+
 // ABI for InitInstanceFieldStub.
 struct InitInstanceFieldABI {
   static const Register kInstanceReg = R1;
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 5f9c331..4a497730 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -148,10 +148,17 @@
 
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
-  static const Register kFieldReg = EAX;
+  static const Register kFieldReg = EDX;
   static const Register kResultReg = EAX;
 };
 
+// Registers used inside the implementation of InitLateStaticFieldStub.
+struct InitLateStaticFieldInternalRegs {
+  static const Register kFunctionReg = EAX;
+  static const Register kAddressReg = ECX;
+  static const Register kScratchReg = EDI;
+};
+
 // ABI for InitInstanceFieldStub.
 struct InitInstanceFieldABI {
   static const Register kInstanceReg = EBX;
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index eb24c81..3e7f3c5 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -223,10 +223,17 @@
 
 // ABI for InitStaticFieldStub.
 struct InitStaticFieldABI {
-  static const Register kFieldReg = RAX;
+  static const Register kFieldReg = RDX;
   static const Register kResultReg = RAX;
 };
 
+// Registers used inside the implementation of InitLateStaticFieldStub.
+struct InitLateStaticFieldInternalRegs {
+  static const Register kFunctionReg = RAX;
+  static const Register kAddressReg = RCX;
+  static const Register kScratchReg = RSI;
+};
+
 // ABI for InitInstanceFieldStub.
 struct InitInstanceFieldABI {
   static const Register kInstanceReg = RBX;
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index 6d300fb..284b62d 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -49,7 +49,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, use_vfp, true, "Use vfp instructions if supported");
 DEFINE_FLAG(bool, use_neon, true, "Use neon instructions if supported");
 DEFINE_FLAG(bool,
             use_integer_division,
@@ -104,7 +103,6 @@
 }
 
 bool HostCPUFeatures::integer_division_supported_ = false;
-bool HostCPUFeatures::vfp_supported_ = false;
 bool HostCPUFeatures::neon_supported_ = false;
 bool HostCPUFeatures::hardfp_supported_ = false;
 const char* HostCPUFeatures::hardware_ = NULL;
@@ -121,7 +119,6 @@
   hardware_ = "";
   // When the VM is targetted to ARMv7, pretend that the CPU is ARMv7 even if
   // the CPU is actually AArch64.
-  vfp_supported_ = FLAG_use_vfp;
   integer_division_supported_ = FLAG_use_integer_division;
   neon_supported_ = FLAG_use_neon;
   hardfp_supported_ = false;
@@ -151,15 +148,6 @@
 #endif
   }
 
-#if defined(DART_RUN_IN_QEMU_ARMv7)
-  vfp_supported_ = true;
-#else
-  // Has floating point unit.
-  vfp_supported_ =
-      (CpuInfo::FieldContains(kCpuInfoFeatures, "vfp") || is_arm64) &&
-      FLAG_use_vfp;
-#endif
-
   // Has integer division.
   // Special cases:
   // - Qualcomm Krait CPUs (QCT APQ8064) in Nexus 4 and 7 incorrectly report
@@ -198,7 +186,7 @@
   }
   neon_supported_ =
       (CpuInfo::FieldContains(kCpuInfoFeatures, "neon") || is_arm64) &&
-      FLAG_use_vfp && FLAG_use_neon;
+      FLAG_use_neon;
 
 // Use the cross-compiler's predefined macros to determine whether we should
 // use the hard or soft float ABI.
@@ -232,8 +220,7 @@
   hardware_ = CpuInfo::GetCpuModel();
 
   integer_division_supported_ = FLAG_use_integer_division;
-  vfp_supported_ = FLAG_use_vfp;
-  neon_supported_ = FLAG_use_vfp && FLAG_use_neon;
+  neon_supported_ = FLAG_use_neon;
   hardfp_supported_ = FLAG_sim_use_hardfp;
 #if defined(DEBUG)
   initialized_ = true;
diff --git a/runtime/vm/cpu_arm.h b/runtime/vm/cpu_arm.h
index 2eaf4aa..a6cb9d7 100644
--- a/runtime/vm/cpu_arm.h
+++ b/runtime/vm/cpu_arm.h
@@ -10,6 +10,7 @@
 #endif
 
 #include "vm/allocation.h"
+#include "vm/flags.h"
 #include "vm/simulator.h"
 
 namespace dart {
@@ -32,11 +33,7 @@
   }
   static bool integer_division_supported() {
     DEBUG_ASSERT(initialized_);
-    return integer_division_supported_;
-  }
-  static bool vfp_supported() {
-    DEBUG_ASSERT(initialized_);
-    return vfp_supported_;
+    return integer_division_supported_ && !FLAG_target_unknown_cpu;
   }
   static bool neon_supported() {
     DEBUG_ASSERT(initialized_);
@@ -56,10 +53,6 @@
     DEBUG_ASSERT(initialized_);
     integer_division_supported_ = supported;
   }
-  static void set_vfp_supported(bool supported) {
-    DEBUG_ASSERT(initialized_);
-    vfp_supported_ = supported;
-  }
   static void set_neon_supported(bool supported) {
     DEBUG_ASSERT(initialized_);
     neon_supported_ = supported;
@@ -69,7 +62,6 @@
  private:
   static const char* hardware_;
   static bool integer_division_supported_;
-  static bool vfp_supported_;
   static bool neon_supported_;
   static bool hardfp_supported_;
   static intptr_t store_pc_read_offset_;
@@ -86,10 +78,6 @@
   static bool integer_division_supported() {
     return HostCPUFeatures::integer_division_supported();
   }
-  static bool vfp_supported() { return HostCPUFeatures::vfp_supported(); }
-  static bool can_divide() {
-    return integer_division_supported() || vfp_supported();
-  }
   static bool neon_supported() { return HostCPUFeatures::neon_supported(); }
   static bool hardfp_supported() { return HostCPUFeatures::hardfp_supported(); }
   static const char* hardware() { return HostCPUFeatures::hardware(); }
diff --git a/runtime/vm/cpu_arm64.h b/runtime/vm/cpu_arm64.h
index 5fa7b2e..3e793ef 100644
--- a/runtime/vm/cpu_arm64.h
+++ b/runtime/vm/cpu_arm64.h
@@ -10,6 +10,7 @@
 #endif
 
 #include "vm/allocation.h"
+#include "vm/flags.h"
 #include "vm/simulator.h"
 
 namespace dart {
diff --git a/runtime/vm/cpu_ia32.h b/runtime/vm/cpu_ia32.h
index f622c1f..0fe8ba0 100644
--- a/runtime/vm/cpu_ia32.h
+++ b/runtime/vm/cpu_ia32.h
@@ -30,15 +30,15 @@
   }
   static bool sse4_1_supported() {
     DEBUG_ASSERT(initialized_);
-    return sse4_1_supported_ && FLAG_use_sse41;
+    return sse4_1_supported_ && FLAG_use_sse41 && !FLAG_target_unknown_cpu;
   }
   static bool popcnt_supported() {
     DEBUG_ASSERT(initialized_);
-    return popcnt_supported_;
+    return popcnt_supported_ && !FLAG_target_unknown_cpu;
   }
   static bool abm_supported() {
     DEBUG_ASSERT(initialized_);
-    return abm_supported_;
+    return abm_supported_ && !FLAG_target_unknown_cpu;
   }
 
  private:
diff --git a/runtime/vm/cpu_x64.h b/runtime/vm/cpu_x64.h
index d0d1a14..c444be8 100644
--- a/runtime/vm/cpu_x64.h
+++ b/runtime/vm/cpu_x64.h
@@ -30,15 +30,15 @@
   }
   static bool sse4_1_supported() {
     DEBUG_ASSERT(initialized_);
-    return sse4_1_supported_ && FLAG_use_sse41;
+    return sse4_1_supported_ && FLAG_use_sse41 && !FLAG_target_unknown_cpu;
   }
   static bool popcnt_supported() {
     DEBUG_ASSERT(initialized_);
-    return popcnt_supported_;
+    return popcnt_supported_ && !FLAG_target_unknown_cpu;
   }
   static bool abm_supported() {
     DEBUG_ASSERT(initialized_);
-    return abm_supported_;
+    return abm_supported_ && !FLAG_target_unknown_cpu;
   }
 
  private:
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index ced30ca..9f78ed8 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -7,6 +7,7 @@
 
 #include "vm/dart.h"
 
+#include "platform/thread_sanitizer.h"
 #include "vm/app_snapshot.h"
 #include "vm/code_observers.h"
 #include "vm/compiler/runtime_offsets_extracted.h"
@@ -15,6 +16,9 @@
 #include "vm/dart_api_state.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
+#if defined(DART_PRECOMPILED_RUNTIME) && defined(DART_TARGET_OS_LINUX)
+#include "vm/elf.h"
+#endif
 #include "vm/flags.h"
 #include "vm/handles.h"
 #include "vm/heap/become.h"
@@ -40,12 +44,20 @@
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/thread_interrupter.h"
 #include "vm/thread_pool.h"
 #include "vm/timeline.h"
 #include "vm/virtual_memory.h"
 #include "vm/zone.h"
 
+#if defined(USING_THREAD_SANITIZER)
+// TODO(https://github.com/dart-lang/sdk/issues/46699): Remove.
+// TODO(https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=83298): Remove.
+#include "unicode/uchar.h"
+#include "unicode/uniset.h"
+#endif
+
 namespace dart {
 
 DECLARE_FLAG(bool, print_class_table);
@@ -66,6 +78,8 @@
 Dart_FileCloseCallback Dart::file_close_callback_ = NULL;
 Dart_EntropySource Dart::entropy_source_callback_ = NULL;
 Dart_GCEventCallback Dart::gc_event_callback_ = nullptr;
+Dart_PostTaskCallback Dart::post_task_callback_ = nullptr;
+void* Dart::post_task_data_ = nullptr;
 
 // Structure for managing read-only global handles allocation used for
 // creating global read-only handles that are pre created and initialized
@@ -256,7 +270,16 @@
                      Dart_EntropySource entropy_source,
                      Dart_GetVMServiceAssetsArchive get_service_assets,
                      bool start_kernel_isolate,
-                     Dart_CodeObserver* observer) {
+                     Dart_CodeObserver* observer,
+                     Dart_PostTaskCallback post_task,
+                     void* post_task_data) {
+#if defined(USING_THREAD_SANITIZER)
+  // Trigger lazy initialization in ICU to avoid spurious TSAN warning.
+  // TODO(https://github.com/dart-lang/sdk/issues/46699): Remove.
+  // TODO(https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=83298): Remove.
+  u_getPropertyValueEnum(UCHAR_SCRIPT, "foo");
+#endif
+
   CheckOffsets();
 
   if (!Flags::Initialized()) {
@@ -291,6 +314,8 @@
   set_thread_exit_callback(thread_exit);
   SetFileCallbacks(file_open, file_read, file_write, file_close);
   set_entropy_source_callback(entropy_source);
+  set_post_task_callback(post_task);
+  set_post_task_data(post_task_data);
   OS::Init();
   NOT_IN_PRODUCT(CodeObservers::Init());
   if (observer != nullptr) {
@@ -298,6 +323,16 @@
   }
   start_time_micros_ = OS::GetCurrentMonotonicMicros();
   VirtualMemory::Init();
+
+#if defined(DART_PRECOMPILED_RUNTIME) && defined(DART_TARGET_OS_LINUX)
+  if (VirtualMemory::PageSize() > kElfPageSize) {
+    return Utils::SCreate(
+        "Incompatible page size for AOT compiled ELF: expected at most %" Pd
+        ", got %" Pd "",
+        kElfPageSize, VirtualMemory::PageSize());
+  }
+#endif
+
   OSThread::Init();
   Zone::Init();
 #if defined(SUPPORT_TIMELINE)
@@ -306,6 +341,7 @@
 #endif
   IsolateGroup::Init();
   Isolate::InitVM();
+  UserTags::Init();
   PortMap::Init();
   FreeListElement::Init();
   ForwardingCorpse::Init();
@@ -518,18 +554,21 @@
                  Dart_EntropySource entropy_source,
                  Dart_GetVMServiceAssetsArchive get_service_assets,
                  bool start_kernel_isolate,
-                 Dart_CodeObserver* observer) {
+                 Dart_CodeObserver* observer,
+                 Dart_PostTaskCallback post_task,
+                 void* post_task_data) {
   if (!init_state_.SetInitializing()) {
     return Utils::StrDup(
         "Bad VM initialization state, "
         "already initialized or "
         "multiple threads initializing the VM.");
   }
-  char* retval = DartInit(vm_isolate_snapshot, instructions_snapshot,
-                          create_group, initialize_isolate, shutdown, cleanup,
-                          cleanup_group, thread_exit, file_open, file_read,
-                          file_write, file_close, entropy_source,
-                          get_service_assets, start_kernel_isolate, observer);
+  char* retval =
+      DartInit(vm_isolate_snapshot, instructions_snapshot, create_group,
+               initialize_isolate, shutdown, cleanup, cleanup_group,
+               thread_exit, file_open, file_read, file_write, file_close,
+               entropy_source, get_service_assets, start_kernel_isolate,
+               observer, post_task, post_task_data);
   if (retval != NULL) {
     init_state_.ResetInitializing();
     return retval;
@@ -582,6 +621,14 @@
 
 // This waits until only the VM isolate remains in the list.
 void Dart::WaitForIsolateShutdown() {
+  int64_t start_time = 0;
+  if (FLAG_trace_shutdown) {
+    start_time = UptimeMillis();
+    OS::PrintErr("[+%" Pd64
+                 "ms] SHUTDOWN: Waiting for service "
+                 "and kernel isolates to shutdown\n",
+                 start_time);
+  }
   ASSERT(!Isolate::creation_enabled_);
   MonitorLocker ml(Isolate::isolate_creation_monitor_);
   intptr_t num_attempts = 0;
@@ -592,6 +639,25 @@
       if (num_attempts > 10) {
         DumpAliveIsolates(num_attempts, /*only_application_isolates=*/false);
       }
+      if (FLAG_trace_shutdown) {
+        OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: %" Pd
+                     " time out waiting for "
+                     "service and kernel isolates to shutdown\n",
+                     UptimeMillis(), num_attempts);
+      }
+    }
+  }
+  if (FLAG_trace_shutdown) {
+    int64_t stop_time = UptimeMillis();
+    OS::PrintErr("[+%" Pd64
+                 "ms] SHUTDOWN: Done waiting for service "
+                 "and kernel isolates to shutdown\n",
+                 stop_time);
+    if ((stop_time - start_time) > 500) {
+      OS::PrintErr("[+%" Pd64
+                   "ms] SHUTDOWN: waited too long for service "
+                   "and kernel isolates to shutdown\n",
+                   (stop_time - start_time));
     }
   }
 
@@ -642,6 +708,10 @@
                    UptimeMillis());
     }
     WaitForApplicationIsolateShutdown();
+    if (FLAG_trace_shutdown) {
+      OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Done shutting down app isolates\n",
+                   UptimeMillis());
+    }
   }
 
   // Shutdown the kernel isolate.
@@ -658,12 +728,8 @@
   }
   ServiceIsolate::Shutdown();
 
-  // Wait for the remaining isolate (service isolate) to shutdown
+  // Wait for the remaining isolate (service/kernel isolate) to shutdown
   // before shutting down the thread pool.
-  if (FLAG_trace_shutdown) {
-    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Waiting for isolate shutdown\n",
-                 UptimeMillis());
-  }
   WaitForIsolateShutdown();
 
 #if !defined(PRODUCT)
@@ -696,6 +762,10 @@
   thread_pool_->Shutdown();
   delete thread_pool_;
   thread_pool_ = NULL;
+  if (FLAG_trace_shutdown) {
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Done deleting thread pool\n",
+                 UptimeMillis());
+  }
 
   Api::Cleanup();
   delete predefined_handles_;
@@ -733,6 +803,7 @@
   vm_isolate_ = NULL;
   ASSERT(Isolate::IsolateListLength() == 0);
   PortMap::Cleanup();
+  UserTags::Cleanup();
   IsolateGroup::Cleanup();
   ICData::Cleanup();
   SubtypeTestCache::Cleanup();
@@ -779,6 +850,8 @@
   Service::SetEmbedderStreamCallbacks(NULL, NULL);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   VirtualMemory::Cleanup();
+  post_task_callback_ = nullptr;
+  post_task_data_ = nullptr;
   return NULL;
 }
 
@@ -1103,6 +1176,8 @@
       ADD_ISOLATE_GROUP_FLAG(use_field_guards, use_field_guards,
                              FLAG_use_field_guards);
       ADD_ISOLATE_GROUP_FLAG(use_osr, use_osr, FLAG_use_osr);
+      ADD_ISOLATE_GROUP_FLAG(branch_coverage, branch_coverage,
+                             FLAG_branch_coverage);
     }
 
 // Generated code must match the host architecture and ABI.
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 9d0cdf1..a8c4a56 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -44,7 +44,9 @@
                     Dart_EntropySource entropy_source,
                     Dart_GetVMServiceAssetsArchive get_service_assets,
                     bool start_kernel_isolate,
-                    Dart_CodeObserver* observer);
+                    Dart_CodeObserver* observer,
+                    Dart_PostTaskCallback post_task,
+                    void* post_task_data);
 
   // Returns null if cleanup succeeds, otherwise returns an error message
   // (caller owns error message and has to free it).
@@ -123,6 +125,14 @@
   static void set_thread_exit_callback(Dart_ThreadExitCallback cback) {
     thread_exit_callback_ = cback;
   }
+  static Dart_PostTaskCallback post_task_callback() {
+    return post_task_callback_;
+  }
+  static void set_post_task_callback(Dart_PostTaskCallback cback) {
+    post_task_callback_ = cback;
+  }
+  static void* post_task_data() { return post_task_data_; }
+  static void set_post_task_data(void* data) { post_task_data_ = data; }
   static void SetFileCallbacks(Dart_FileOpenCallback file_open,
                                Dart_FileReadCallback file_read,
                                Dart_FileWriteCallback file_write,
@@ -174,7 +184,9 @@
                         Dart_EntropySource entropy_source,
                         Dart_GetVMServiceAssetsArchive get_service_assets,
                         bool start_kernel_isolate,
-                        Dart_CodeObserver* observer);
+                        Dart_CodeObserver* observer,
+                        Dart_PostTaskCallback post_task,
+                        void* post_task_data);
 
   static constexpr const char* kVmIsolateName = "vm-isolate";
 
@@ -194,6 +206,8 @@
   static Dart_FileCloseCallback file_close_callback_;
   static Dart_EntropySource entropy_source_callback_;
   static Dart_GCEventCallback gc_event_callback_;
+  static Dart_PostTaskCallback post_task_callback_;
+  static void* post_task_data_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 1c7026a..fe7dcc4 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1211,14 +1211,14 @@
         "Invalid Dart_InitializeParams version.");
   }
 
-  return Dart::Init(params->vm_snapshot_data, params->vm_snapshot_instructions,
-                    params->create_group, params->initialize_isolate,
-                    params->shutdown_isolate, params->cleanup_isolate,
-                    params->cleanup_group, params->thread_exit,
-                    params->file_open, params->file_read, params->file_write,
-                    params->file_close, params->entropy_source,
-                    params->get_service_assets, params->start_kernel_isolate,
-                    params->code_observer);
+  return Dart::Init(
+      params->vm_snapshot_data, params->vm_snapshot_instructions,
+      params->create_group, params->initialize_isolate,
+      params->shutdown_isolate, params->cleanup_isolate, params->cleanup_group,
+      params->thread_exit, params->file_open, params->file_read,
+      params->file_write, params->file_close, params->entropy_source,
+      params->get_service_assets, params->start_kernel_isolate,
+      params->code_observer, params->post_task, params->post_task_data);
 }
 
 DART_EXPORT char* Dart_Cleanup() {
@@ -1463,13 +1463,6 @@
 
   *error = nullptr;
 
-  if (!FLAG_enable_isolate_groups) {
-    *error = Utils::StrDup(
-        "Lightweight isolates need to be explicitly enabled by passing "
-        "--enable-isolate-groups.");
-    return nullptr;
-  }
-
   Isolate* isolate;
   isolate = CreateWithinExistingIsolateGroup(member->group(), name, error);
   if (isolate != nullptr) {
@@ -2070,6 +2063,16 @@
   return true;
 }
 
+DART_EXPORT void Dart_RunTask(Dart_Task task) {
+  Thread* T = Thread::Current();
+  Isolate* I = T == nullptr ? nullptr : T->isolate();
+  CHECK_NO_ISOLATE(I);
+  API_TIMELINE_BEGIN_END(T);
+  ThreadPool::Task* task_impl = reinterpret_cast<ThreadPool::Task*>(task);
+  task_impl->Run();
+  delete task_impl;
+}
+
 DART_EXPORT Dart_Handle Dart_HandleMessage() {
   Thread* T = Thread::Current();
   Isolate* I = T->isolate();
@@ -6202,14 +6205,6 @@
 #endif
 }
 
-DART_EXPORT void Dart_SetNativeServiceStreamCallback(
-    Dart_NativeStreamConsumer consumer,
-    const char* stream_id) {
-#if !defined(PRODUCT)
-  Service::SetNativeServiceStreamCallback(consumer, stream_id);
-#endif
-}
-
 DART_EXPORT char* Dart_ServiceSendDataEvent(const char* stream_id,
                                             const char* event_kind,
                                             const uint8_t* bytes,
@@ -6279,6 +6274,20 @@
 #endif
 }
 
+DART_EXPORT bool Dart_SetEnabledTimelineCategory(const char* categories) {
+#if defined(SUPPORT_TIMELINE)
+  bool result = false;
+  if (categories != nullptr) {
+    char* carray = Utils::SCreate("[%s]", categories);
+    result = Service::EnableTimelineStreams(carray);
+    free(carray);
+  }
+  return result;
+#else
+  return false;
+#endif
+}
+
 DART_EXPORT int64_t Dart_TimelineGetMicros() {
   return OS::GetCurrentMonotonicMicros();
 }
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 7074ded..02cbfa3 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -7854,7 +7854,8 @@
                "'foo1:///.dart_tool");
 }
 
-void NewNativePort_send123(Dart_Port dest_port_id, Dart_CObject* message) {
+static void NewNativePort_send123(Dart_Port dest_port_id,
+                                  Dart_CObject* message) {
   // Gets a send port message.
   EXPECT_NOTNULL(message);
   EXPECT_EQ(Dart_CObject_kArray, message->type);
@@ -7869,7 +7870,8 @@
                    response);
 }
 
-void NewNativePort_send321(Dart_Port dest_port_id, Dart_CObject* message) {
+static void NewNativePort_send321(Dart_Port dest_port_id,
+                                  Dart_CObject* message) {
   // Gets a null message.
   EXPECT_NOTNULL(message);
   EXPECT_EQ(Dart_CObject_kArray, message->type);
@@ -7978,8 +7980,8 @@
   EXPECT(Dart_CloseNativePort(port_id2));
 }
 
-void NewNativePort_sendInteger123(Dart_Port dest_port_id,
-                                  Dart_CObject* message) {
+static void NewNativePort_sendInteger123(Dart_Port dest_port_id,
+                                         Dart_CObject* message) {
   // Gets a send port message.
   EXPECT_NOTNULL(message);
   EXPECT_EQ(Dart_CObject_kArray, message->type);
@@ -7990,8 +7992,8 @@
                    123);
 }
 
-void NewNativePort_sendInteger321(Dart_Port dest_port_id,
-                                  Dart_CObject* message) {
+static void NewNativePort_sendInteger321(Dart_Port dest_port_id,
+                                         Dart_CObject* message) {
   // Gets a null message.
   EXPECT_NOTNULL(message);
   EXPECT_EQ(Dart_CObject_kArray, message->type);
@@ -8053,8 +8055,132 @@
   EXPECT(Dart_CloseNativePort(port_id2));
 }
 
-void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id,
-                                     Dart_CObject* message) {
+static void NewNativePort_Transferrable1(Dart_Port dest_port_id,
+                                         Dart_CObject* message) {
+  // Gets a send port message.
+  EXPECT_NOTNULL(message);
+  EXPECT_EQ(Dart_CObject_kTypedData, message->type);
+  EXPECT_EQ(Dart_TypedData_kUint8, message->value.as_typed_data.type);
+  EXPECT_EQ(10, message->value.as_typed_data.length);
+  EXPECT_EQ(42, message->value.as_typed_data.values[0]);
+  free(message->value.as_typed_data.values);
+}
+
+static void NewNativePort_Transferrable2(Dart_Port dest_port_id,
+                                         Dart_CObject* message) {
+  // Gets a send port message.
+  EXPECT_NOTNULL(message);
+  EXPECT_EQ(Dart_CObject_kArray, message->type);
+  EXPECT_EQ(1, message->value.as_array.length);
+  Dart_CObject* cobj = message->value.as_array.values[0];
+  EXPECT_EQ(Dart_CObject_kTypedData, cobj->type);
+  EXPECT_EQ(Dart_TypedData_kUint8, cobj->value.as_typed_data.type);
+  EXPECT_EQ(10, cobj->value.as_typed_data.length);
+  EXPECT_EQ(42, cobj->value.as_typed_data.values[0]);
+  free(cobj->value.as_typed_data.values);
+}
+
+TEST_CASE(DartAPI_NativePortPostTransferrableTypedData) {
+  const char* kScriptChars =
+      "import 'dart:typed_data';\n"
+      "import 'dart:isolate';\n"
+      "void callPort(SendPort port1, SendPort port2) {\n"
+      "  final td1 ="
+      "     TransferableTypedData.fromList([Uint8List(10)..[0] = 42]);\n"
+      "  final td2 ="
+      "     TransferableTypedData.fromList([Uint8List(10)..[0] = 42]);\n"
+      "  port1.send(td1);\n"
+      "  port2.send([td2]);\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_EnterScope();
+
+  Dart_Port port_id1 =
+      Dart_NewNativePort("Port123", NewNativePort_Transferrable1, true);
+  Dart_Port port_id2 =
+      Dart_NewNativePort("Port321", NewNativePort_Transferrable2, true);
+
+  Dart_Handle send_port1 = Dart_NewSendPort(port_id1);
+  EXPECT_VALID(send_port1);
+  Dart_Handle send_port2 = Dart_NewSendPort(port_id2);
+  EXPECT_VALID(send_port2);
+
+  // Test first port.
+  Dart_Handle dart_args[2];
+  dart_args[0] = send_port1;
+  dart_args[1] = send_port2;
+  Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 2, dart_args);
+  EXPECT_VALID(result);
+  result = Dart_RunLoop();
+  EXPECT_VALID(result);
+
+  Dart_ExitScope();
+
+  // Delete the native ports.
+  EXPECT(Dart_CloseNativePort(port_id1));
+  EXPECT(Dart_CloseNativePort(port_id2));
+}
+
+static const intptr_t kSendLength = 16;
+
+static void NewNativePort_ExternalTypedData(Dart_Port dest_port_id,
+                                            Dart_CObject* message) {
+  // Gets a send port message.
+  EXPECT_NOTNULL(message);
+  EXPECT_EQ(Dart_CObject_kTypedData, message->type);
+  EXPECT_EQ(Dart_TypedData_kUint8, message->value.as_typed_data.type);
+  EXPECT_EQ(kSendLength, message->value.as_typed_data.length);
+  for (intptr_t i = 0; i < kSendLength; i++) {
+    EXPECT_EQ((0x41 + i), message->value.as_typed_data.values[i]);
+  }
+}
+
+static void FinalizeTypedData(void* isolate_callback_data, void* peer) {
+  delete[] reinterpret_cast<int8_t*>(peer);
+}
+
+TEST_CASE(DartAPI_NativePortPostExternalTypedData) {
+  int8_t* extTypedData = new int8_t[kSendLength];
+  for (int i = 0; i < kSendLength; i++) {
+    extTypedData[i] = 0x41 + i;
+  }
+  const char* kScriptChars =
+      "import 'dart:typed_data';\n"
+      "import 'dart:isolate';\n"
+      "void callPort(SendPort port, Uint8List data) {\n"
+      "  port.send(data);\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_EnterScope();
+
+  Dart_Port port_id =
+      Dart_NewNativePort("Port123", NewNativePort_ExternalTypedData, true);
+
+  Dart_Handle send_port = Dart_NewSendPort(port_id);
+  EXPECT_VALID(send_port);
+
+  Dart_Handle extdata = Dart_NewExternalTypedDataWithFinalizer(
+      Dart_TypedData_kUint8, extTypedData, kSendLength, extTypedData,
+      kSendLength, FinalizeTypedData);
+  EXPECT_VALID(extdata);
+
+  // Test first port.
+  Dart_Handle dart_args[2];
+  dart_args[0] = send_port;
+  dart_args[1] = extdata;
+  Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 2, dart_args);
+  EXPECT_VALID(result);
+  result = Dart_RunLoop();
+  EXPECT_VALID(result);
+
+  Dart_ExitScope();
+
+  // Delete the native ports.
+  EXPECT(Dart_CloseNativePort(port_id));
+}
+
+static void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id,
+                                            Dart_CObject* message) {
   EXPECT_NOTNULL(message);
 
   if ((message->type == Dart_CObject_kArray) &&
@@ -8104,8 +8230,8 @@
   EXPECT(Dart_CloseNativePort(port_id1));
 }
 
-void NewNativePort_nativeReceiveInteger(Dart_Port dest_port_id,
-                                        Dart_CObject* message) {
+static void NewNativePort_nativeReceiveInteger(Dart_Port dest_port_id,
+                                               Dart_CObject* message) {
   EXPECT_NOTNULL(message);
 
   if ((message->type == Dart_CObject_kArray) &&
@@ -9323,6 +9449,84 @@
   EXPECT_EQ(frequency1, frequency2);
 }
 
+TEST_CASE(DartAPI_TimelineCategories) {
+  bool result;
+  {
+    result = Dart_SetEnabledTimelineCategory("all");
+    EXPECT_EQ(true, result);
+    JSONStream js;
+    JSONObject obj(&js);
+    JSONArray jstream(&obj, "available");
+    Timeline::PrintFlagsToJSONArray(&jstream);
+    const char* js_str = js.ToCString();
+#define TIMELINE_STREAM_CHECK(name, fuchsia_name)                              \
+  EXPECT_SUBSTRING(#name, js_str);
+    TIMELINE_STREAM_LIST(TIMELINE_STREAM_CHECK)
+#undef TIMELINE_STREAM_CHECK
+  }
+
+  {
+    result = Dart_SetEnabledTimelineCategory(nullptr);
+    EXPECT_EQ(false, result);
+    result = Dart_SetEnabledTimelineCategory("GC,api,compiler");
+    EXPECT_EQ(false, result);
+  }
+
+  {
+    result = Dart_SetEnabledTimelineCategory("GC,API,Compiler");
+    EXPECT_EQ(true, result);
+    JSONStream js;
+    JSONObject obj(&js);
+    JSONArray jstream(&obj, "available");
+    Timeline::PrintFlagsToJSONArray(&jstream);
+    const char* js_str = js.ToCString();
+    EXPECT_SUBSTRING("GC", js_str);
+    EXPECT_SUBSTRING("API", js_str);
+    EXPECT_SUBSTRING("Compiler", js_str);
+    EXPECT_NOTSUBSTRING("CompilerVerbose", js_str);
+    EXPECT_NOTSUBSTRING("Debugger", js_str);
+    EXPECT_NOTSUBSTRING("Embedder", js_str);
+    EXPECT_NOTSUBSTRING("Isolate", js_str);
+    EXPECT_NOTSUBSTRING("VM", js_str);
+  }
+
+  {
+    result = Dart_SetEnabledTimelineCategory("Isolate");
+    EXPECT_EQ(true, result);
+    JSONStream js;
+    JSONObject obj(&js);
+    JSONArray jstream(&obj, "available");
+    Timeline::PrintFlagsToJSONArray(&jstream);
+    const char* js_str = js.ToCString();
+    EXPECT_NOTSUBSTRING("GC", js_str);
+    EXPECT_NOTSUBSTRING("API", js_str);
+    EXPECT_NOTSUBSTRING("Compiler", js_str);
+    EXPECT_NOTSUBSTRING("CompilerVerbose", js_str);
+    EXPECT_NOTSUBSTRING("Debugger", js_str);
+    EXPECT_NOTSUBSTRING("Embedder", js_str);
+    EXPECT_SUBSTRING("Isolate", js_str);
+    EXPECT_NOTSUBSTRING("VM", js_str);
+  }
+
+  {
+    result = Dart_SetEnabledTimelineCategory("");
+    EXPECT_EQ(true, result);
+    JSONStream js;
+    JSONObject obj(&js);
+    JSONArray jstream(&obj, "available");
+    Timeline::PrintFlagsToJSONArray(&jstream);
+    const char* js_str = js.ToCString();
+    EXPECT_NOTSUBSTRING("GC", js_str);
+    EXPECT_NOTSUBSTRING("API", js_str);
+    EXPECT_NOTSUBSTRING("Compiler", js_str);
+    EXPECT_NOTSUBSTRING("CompilerVerbose", js_str);
+    EXPECT_NOTSUBSTRING("Debugger", js_str);
+    EXPECT_NOTSUBSTRING("Embedder", js_str);
+    EXPECT_NOTSUBSTRING("Isolate", js_str);
+    EXPECT_NOTSUBSTRING("VM", js_str);
+  }
+}
+
 static void HintFreedNative(Dart_NativeArguments args) {
   int64_t size = 0;
   EXPECT_VALID(Dart_GetNativeIntegerArgument(args, 0, &size));
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 650cbd2..46df59f 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -107,16 +107,14 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
     UNREACHABLE();
 #else
-    if (FLAG_use_bare_instructions) {
-      Thread* thread = Thread::Current();
-      thread->set_global_object_pool(
-          thread->isolate_group()->object_store()->global_object_pool());
-      const DispatchTable* dispatch_table = thread->isolate()->dispatch_table();
-      if (dispatch_table != nullptr) {
-        thread->set_dispatch_table_array(dispatch_table->ArrayOrigin());
-      }
-      ASSERT(thread->global_object_pool() != Object::null());
+    Thread* thread = Thread::Current();
+    thread->set_global_object_pool(
+        thread->isolate_group()->object_store()->global_object_pool());
+    const DispatchTable* dispatch_table = thread->isolate()->dispatch_table();
+    if (dispatch_table != nullptr) {
+      thread->set_dispatch_table_array(dispatch_table->ArrayOrigin());
     }
+    ASSERT(thread->global_object_pool() != Object::null());
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   }
 
@@ -179,14 +177,13 @@
 #if defined(USING_SIMULATOR)
   return bit_copy<ObjectPtr, int64_t>(Simulator::Current()->Call(
       static_cast<intptr_t>(stub),
-      ((FLAG_precompiled_mode && FLAG_use_bare_instructions)
-           ? static_cast<intptr_t>(entry_point)
-           : reinterpret_cast<intptr_t>(&code)),
+      FLAG_precompiled_mode ? static_cast<intptr_t>(entry_point)
+                            : reinterpret_cast<intptr_t>(&code),
       reinterpret_cast<intptr_t>(&arguments_descriptor),
       reinterpret_cast<intptr_t>(&arguments),
       reinterpret_cast<intptr_t>(thread)));
 #else
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     return static_cast<ObjectPtr>(
         (reinterpret_cast<invokestub_bare_instructions>(stub))(
             entry_point, arguments_descriptor, arguments, thread));
@@ -679,24 +676,6 @@
   return result.ptr();
 }
 
-// On success, returns an InstancePtr.  On failure, an ErrorPtr.
-ObjectPtr DartLibraryCalls::IdentityHashCode(const Instance& object) {
-  const int kNumArguments = 1;
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const Library& libcore = Library::Handle(zone, Library::CoreLibrary());
-  ASSERT(!libcore.IsNull());
-  const Function& function = Function::Handle(
-      zone, libcore.LookupFunctionAllowPrivate(Symbols::identityHashCode()));
-  ASSERT(!function.IsNull());
-  const Array& args = Array::Handle(zone, Array::New(kNumArguments));
-  args.SetAt(0, object);
-  const Object& result =
-      Object::Handle(zone, DartEntry::InvokeFunction(function, args));
-  ASSERT(result.IsInstance() || result.IsError());
-  return result.ptr();
-}
-
 ObjectPtr DartLibraryCalls::LookupHandler(Dart_Port port_id) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 6ec9067..4f650a8 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -285,9 +285,6 @@
   // On success, returns an InstancePtr. On failure, an ErrorPtr.
   static ObjectPtr Equals(const Instance& left, const Instance& right);
 
-  // On success, returns an InstancePtr. On failure, an ErrorPtr.
-  static ObjectPtr IdentityHashCode(const Instance& object);
-
   // Returns the handler if one has been registered for this port id.
   static ObjectPtr LookupHandler(Dart_Port port_id);
 
diff --git a/runtime/vm/dwarf.cc b/runtime/vm/dwarf.cc
index 4f98848..d661bd7 100644
--- a/runtime/vm/dwarf.cc
+++ b/runtime/vm/dwarf.cc
@@ -717,6 +717,26 @@
     function_stack.Clear();
     token_positions.Clear();
 
+    // CodeSourceMap might start in the following way:
+    //
+    //   ChangePosition function.token_pos()
+    //   AdvancePC 0
+    //   ChangePosition x
+    //   AdvancePC y
+    //
+    // This entry is emitted to ensure correct symbolization of
+    // function listener frames produced by async unwinding.
+    // (See EmitFunctionEntrySourcePositionDescriptorIfNeeded).
+    // Directly interpreting this sequence would cause us to emit
+    // multiple with the same pc into line number table and different
+    // position information. To avoid this will make an adjustment for
+    // the second record we emit: if position x is a synthetic one we will
+    // simply drop the second record, if position x is real then we will
+    // emit row with a slightly adjusted PC (by 1 byte). This would not
+    // affect symbolization (you can't have a call that is 1 byte long)
+    // but will avoid line number table entries with the same PC.
+    bool function_entry_position_was_emitted = false;
+
     int32_t current_pc_offset = 0;
     function_stack.Add(&root_function);
     token_positions.Add(kNoDwarfPositionInfo);
@@ -740,9 +760,30 @@
           const intptr_t file = LookupScript(script);
           const intptr_t line = token_positions.Last().line();
           const intptr_t column = token_positions.Last().column();
-          writer->EmitRow(file, line, column, asm_name, current_pc_offset);
+          intptr_t pc_offset_adjustment = 0;
+          bool should_emit = true;
+
+          // If we are at the function entry and have already emitted a row
+          // then adjust current_pc_offset to avoid duplicated entries.
+          // See the comment below which explains why this code is here.
+          if (current_pc_offset == 0 && function_entry_position_was_emitted) {
+            pc_offset_adjustment = 1;
+            // Ignore synthetic positions. Function entry position gives
+            // more information anyway.
+            should_emit = !(line == 0 && column == 0);
+          }
+
+          if (should_emit) {
+            writer->EmitRow(file, line, column, asm_name,
+                            current_pc_offset + pc_offset_adjustment);
+          }
 
           current_pc_offset += arg1;
+          if (arg1 == 0) {  // Special case of AdvancePC 0.
+            ASSERT(current_pc_offset == 0);
+            ASSERT(!function_entry_position_was_emitted);
+            function_entry_position_was_emitted = true;
+          }
           break;
         }
         case CodeSourceMapOps::kPushFunction: {
diff --git a/runtime/vm/elf.h b/runtime/vm/elf.h
index 579c49f..3bf980d 100644
--- a/runtime/vm/elf.h
+++ b/runtime/vm/elf.h
@@ -5,14 +5,30 @@
 #ifndef RUNTIME_VM_ELF_H_
 #define RUNTIME_VM_ELF_H_
 
+#include "platform/globals.h"
+
+#if defined(DART_PRECOMPILER)
 #include "vm/allocation.h"
 #include "vm/compiler/runtime_api.h"
 #include "vm/datastream.h"
 #include "vm/growable_array.h"
 #include "vm/zone.h"
+#endif
 
 namespace dart {
 
+// The max page size on all supported architectures. Used to determine
+// the alignment of load segments, so that they are guaranteed page-aligned,
+// and no ELF section or segment should have a larger alignment.
+#if defined(DART_TARGET_OS_LINUX) && defined(TARGET_ARCH_ARM64)
+// Some Linux distributions on ARM64 select 64 KB page size.
+// Follow LLVM (https://reviews.llvm.org/D25079) and set maximum page size
+// to 64 KB for ARM64 Linux builds.
+static constexpr intptr_t kElfPageSize = 64 * KB;
+#else
+static constexpr intptr_t kElfPageSize = 16 * KB;
+#endif
+
 #if defined(DART_PRECOMPILER)
 
 class Dwarf;
@@ -33,10 +49,7 @@
 
   Elf(Zone* zone, BaseWriteStream* stream, Type type, Dwarf* dwarf = nullptr);
 
-  // The max page size on all supported architectures. Used to determine
-  // the alignment of load segments, so that they are guaranteed page-aligned,
-  // and no ELF section or segment should have a larger alignment.
-  static constexpr intptr_t kPageSize = 16 * KB;
+  static constexpr intptr_t kPageSize = kElfPageSize;
 
   bool IsStripped() const { return dwarf_ == nullptr; }
 
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 2ea7550..fc6e47b 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -2,9 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include <setjmp.h>
+
 #include "vm/exceptions.h"
 
 #include "platform/address_sanitizer.h"
+#include "platform/thread_sanitizer.h"
 
 #include "lib/stacktrace.h"
 
@@ -612,13 +615,6 @@
   // in the previous frames.
   StackResource::Unwind(thread);
 
-  // Call a stub to set up the exception object in kExceptionObjectReg,
-  // to set up the stacktrace object in kStackTraceObjectReg, and to
-  // continue execution at the given pc in the given frame.
-  typedef void (*ExcpHandler)(uword, uword, uword, Thread*);
-  ExcpHandler func =
-      reinterpret_cast<ExcpHandler>(StubCode::JumpToFrame().EntryPoint());
-
   // Unpoison the stack before we tear it down in the generated stub code.
   uword current_sp = OSThread::GetCurrentStackPointer() - 1024;
   ASAN_UNPOISON(reinterpret_cast<void*>(current_sp),
@@ -635,7 +631,27 @@
   // The shadow call stack register will be restored by the JumpToFrame stub.
 #endif
 
+  // TODO(b/209838275): Re-enable this once g3 build rules for gen_snapshot are
+  // working with TSAN.
+#if 0  // defined(USING_THREAD_SANITIZER)
+  if (thread->exit_through_ffi() == Thread::kExitThroughRuntimeCall) {
+    auto tsan_utils = thread->tsan_utils();
+    tsan_utils->exception_pc = program_counter;
+    tsan_utils->exception_sp = stack_pointer;
+    tsan_utils->exception_fp = frame_pointer;
+    longjmp(*(tsan_utils->setjmp_buffer), 1);
+  }
+#endif  // defined(USING_THREAD_SANITIZER)
+
+  // Call a stub to set up the exception object in kExceptionObjectReg,
+  // to set up the stacktrace object in kStackTraceObjectReg, and to
+  // continue execution at the given pc in the given frame.
+  typedef void (*ExcpHandler)(uword, uword, uword, Thread*);
+  ExcpHandler func =
+      reinterpret_cast<ExcpHandler>(StubCode::JumpToFrame().EntryPoint());
+
   func(program_counter, stack_pointer, frame_pointer, thread);
+
 #endif
   UNREACHABLE();
 }
@@ -696,8 +712,9 @@
   if (exception.IsNull()) {
     exception ^=
         Exceptions::Create(Exceptions::kNullThrown, Object::empty_array());
-  } else if (exception.ptr() == object_store->out_of_memory() ||
-             exception.ptr() == object_store->stack_overflow()) {
+  } else if (existing_stacktrace.IsNull() &&
+             (exception.ptr() == object_store->out_of_memory() ||
+              exception.ptr() == object_store->stack_overflow())) {
     use_preallocated_stacktrace = true;
   }
   // Find the exception handler and determine if the handler needs a
@@ -729,11 +746,17 @@
     }
   } else {
     if (!existing_stacktrace.IsNull()) {
-      // If we have an existing stack trace then this better be a rethrow. The
-      // reverse is not necessarily true (e.g. Dart_PropagateError can cause
-      // a rethrow being called without an existing stacktrace.)
-      ASSERT(is_rethrow);
       stacktrace = existing_stacktrace.ptr();
+      // If this is not a rethrow, it's a "throw with stacktrace".
+      // Set an Error object's stackTrace field if needed.
+      if (!is_rethrow) {
+        const Field& stacktrace_field =
+            Field::Handle(zone, LookupStackTraceField(exception));
+        if (!stacktrace_field.IsNull() &&
+            (exception.GetField(stacktrace_field) == Object::null())) {
+          exception.SetField(stacktrace_field, stacktrace);
+        }
+      }
     } else {
       // Get stacktrace field of class Error to determine whether we have a
       // subclass of Error which carries around its stack trace.
@@ -917,6 +940,13 @@
   ThrowExceptionHelper(thread, exception, stacktrace, true);
 }
 
+void Exceptions::ThrowWithStackTrace(Thread* thread,
+                                     const Instance& exception,
+                                     const Instance& stacktrace) {
+  // Null object is a valid exception object.
+  ThrowExceptionHelper(thread, exception, stacktrace, false);
+}
+
 void Exceptions::PropagateError(const Error& error) {
   ASSERT(!error.IsNull());
   Thread* thread = Thread::Current();
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 090615c..89090a6 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -32,6 +32,9 @@
   DART_NORETURN static void ReThrow(Thread* thread,
                                     const Instance& exception,
                                     const Instance& stacktrace);
+  DART_NORETURN static void ThrowWithStackTrace(Thread* thread,
+                                                const Instance& exception,
+                                                const Instance& stacktrace);
   DART_NORETURN static void PropagateError(const Error& error);
 
   // Propagate an error to the entry frame, skipping over Dart frames.
diff --git a/runtime/vm/experimental_features.cc b/runtime/vm/experimental_features.cc
index c907f0c..f272686 100644
--- a/runtime/vm/experimental_features.cc
+++ b/runtime/vm/experimental_features.cc
@@ -6,7 +6,7 @@
 // Instead modify 'tools/experimental_features.yaml' and run
 // 'dart tools/generate_experimental_flags.dart' to update.
 //
-// Current version: 2.15.0
+// Current version: 2.16.0
 
 #include "vm/experimental_features.h"
 
diff --git a/runtime/vm/experimental_features.h b/runtime/vm/experimental_features.h
index c1db176..020ba59 100644
--- a/runtime/vm/experimental_features.h
+++ b/runtime/vm/experimental_features.h
@@ -6,7 +6,7 @@
 // Instead modify 'tools/experimental_features.yaml' and run
 // 'dart tools/generate_experimental_flags.dart' to update.
 //
-// Current version: 2.15.0
+// Current version: 2.16.0
 
 #ifndef RUNTIME_VM_EXPERIMENTAL_FEATURES_H_
 #define RUNTIME_VM_EXPERIMENTAL_FEATURES_H_
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index a9628b4..cccfdfb 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -66,7 +66,6 @@
     "Use --[no-]dwarf-stack-traces instead.")                                  \
   P(lazy_async_stacks, bool, true, "Reconstruct async stacks from listeners")  \
   P(lazy_dispatchers, bool, true, "Generate dispatchers lazily")               \
-  P(use_bare_instructions, bool, true, "Enable bare instructions mode.")       \
   R(dedup_instructions, true, bool, false,                                     \
     "Canonicalize instructions when precompiling.")
 
@@ -124,12 +123,8 @@
   P(enable_mirrors, bool, true,                                                \
     "Disable to make importing dart:mirrors an error.")                        \
   P(enable_ffi, bool, true, "Disable to make importing dart:ffi an error.")    \
-  P(fields_may_be_reset, bool, false,                                          \
-    "Don't optimize away static field initialization")                         \
   P(force_clone_compiler_objects, bool, false,                                 \
     "Force cloning of objects needed in compiler (ICData and Field).")         \
-  P(getter_setter_ratio, int, 13,                                              \
-    "Ratio of getter/setter usage used for double field unboxing heuristics")  \
   P(guess_icdata_cid, bool, true,                                              \
     "Artificially create type feedback for arithmetic etc. operations")        \
   P(huge_method_cutoff_in_tokens, int, 20000,                                  \
@@ -196,9 +191,10 @@
   P(retain_code_objects, bool, true,                                           \
     "Serialize all code objects even if not otherwise "                        \
     "needed in the precompiled runtime.")                                      \
-  P(enable_isolate_groups, bool, true, "Enable isolate group support.")        \
   P(show_invisible_frames, bool, false,                                        \
     "Show invisible frames in stack traces.")                                  \
+  P(target_unknown_cpu, bool, false,                                           \
+    "Generate code for a generic CPU, unknown at compile time")                \
   D(trace_cha, bool, false, "Trace CHA operations")                            \
   R(trace_field_guards, false, bool, false, "Trace changes in field's cids.")  \
   D(trace_ic, bool, false, "Trace IC handling")                                \
@@ -252,6 +248,7 @@
   D(support_rr, bool, false, "Support running within RR.")                     \
   P(verify_entry_points, bool, false,                                          \
     "Throw API error on invalid member access throuh native API. See "         \
-    "entry_point_pragma.md")
+    "entry_point_pragma.md")                                                   \
+  C(branch_coverage, false, false, bool, false, "Enable branch coverage")
 
 #endif  // RUNTIME_VM_FLAG_LIST_H_
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index 49dadd2..d35d1e5 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -466,20 +466,6 @@
     PrintFlags();
   }
 
-  // TODO(dartbug.com/36097): Support for isolate groups in JIT mode is
-  // in-development. We will start with very conservative settings. As we make
-  // more of our compiler, runtime as well as generated code re-entrant we'll
-  // graudally remove those restrictions.
-
-#if !defined(DART_PRCOMPILED_RUNTIME)
-  if (!FLAG_precompiled_mode && FLAG_enable_isolate_groups) {
-    // Our compiler should not make rely on a global field being initialized at
-    // compile-time, since that compiled code might be re-used in another
-    // isolate that has not yet initialized the global field.
-    FLAG_fields_may_be_reset = true;
-  }
-#endif  // !defined(DART_PRCOMPILED_RUNTIME)
-
   initialized_ = true;
   return NULL;
 }
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index 2e63f76..46cd706 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -73,8 +73,10 @@
 
 #if defined(PRODUCT)
 #define NOT_IN_PRODUCT(code)
+#define ONLY_IN_PRODUCT(code) code
 #else  // defined(PRODUCT)
 #define NOT_IN_PRODUCT(code) code
+#define ONLY_IN_PRODUCT(code)
 #endif  // defined(PRODUCT)
 
 #if defined(DART_PRECOMPILED_RUNTIME) && defined(DART_PRECOMPILER)
@@ -87,13 +89,9 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
 #define NOT_IN_PRECOMPILED(code)
-#else
-#define NOT_IN_PRECOMPILED(code) code
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#if defined(DART_PRECOMPILED_RUNTIME)
 #define ONLY_IN_PRECOMPILED(code) code
 #else
+#define NOT_IN_PRECOMPILED(code) code
 #define ONLY_IN_PRECOMPILED(code)
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index 2c816a6..aacbf87 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -310,7 +310,7 @@
             ASSERT_NOTNULL(zone),
             initial_size) {}
 
-  // There is a current use of the copy constructor in CSEInstructionMap
+  // There is a current use of the copy constructor in CSEInstructionSet
   // (compiler/backend/redundancy_elimination.cc), so work is needed if we
   // want to disallow it.
   DirectChainedHashMap(const DirectChainedHashMap& other)
diff --git a/runtime/vm/heap/compactor.cc b/runtime/vm/heap/compactor.cc
index a4bd219..2051b0c 100644
--- a/runtime/vm/heap/compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -117,21 +117,30 @@
   forwarding_page_ = reinterpret_cast<ForwardingPage*>(object_end_);
 }
 
+struct Partition {
+  OldPage* head;
+  OldPage* tail;
+};
+
 class CompactorTask : public ThreadPool::Task {
  public:
   CompactorTask(IsolateGroup* isolate_group,
                 GCCompactor* compactor,
                 ThreadBarrier* barrier,
+                RelaxedAtomic<intptr_t>* next_planning_task,
+                RelaxedAtomic<intptr_t>* next_sliding_task,
                 RelaxedAtomic<intptr_t>* next_forwarding_task,
-                OldPage* head,
-                OldPage** tail,
+                intptr_t num_tasks,
+                Partition* partitions,
                 FreeList* freelist)
       : isolate_group_(isolate_group),
         compactor_(compactor),
         barrier_(barrier),
+        next_planning_task_(next_planning_task),
+        next_sliding_task_(next_sliding_task),
         next_forwarding_task_(next_forwarding_task),
-        head_(head),
-        tail_(tail),
+        num_tasks_(num_tasks),
+        partitions_(partitions),
         freelist_(freelist),
         free_page_(NULL),
         free_current_(0),
@@ -150,9 +159,11 @@
   IsolateGroup* isolate_group_;
   GCCompactor* compactor_;
   ThreadBarrier* barrier_;
+  RelaxedAtomic<intptr_t>* next_planning_task_;
+  RelaxedAtomic<intptr_t>* next_sliding_task_;
   RelaxedAtomic<intptr_t>* next_forwarding_task_;
-  OldPage* head_;
-  OldPage** tail_;
+  intptr_t num_tasks_;
+  Partition* partitions_;
   FreeList* freelist_;
   OldPage* free_page_;
   uword free_current_;
@@ -184,8 +195,8 @@
   if (num_pages < num_tasks) {
     num_tasks = num_pages;
   }
-  OldPage** heads = new OldPage*[num_tasks];
-  OldPage** tails = new OldPage*[num_tasks];
+
+  Partition* partitions = new Partition[num_tasks];
 
   {
     const intptr_t pages_per_task = num_pages / num_tasks;
@@ -195,8 +206,8 @@
     OldPage* prev = NULL;
     while (task_index < num_tasks) {
       if (page_index % pages_per_task == 0) {
-        heads[task_index] = page;
-        tails[task_index] = NULL;
+        partitions[task_index].head = page;
+        partitions[task_index].tail = NULL;
         if (prev != NULL) {
           prev->set_next(NULL);
         }
@@ -232,29 +243,34 @@
                                    page->object_end() - page->object_start());
 
         // The compactor slides down: add the empty pages to the beginning.
-        page->set_next(heads[task_index]);
-        heads[task_index] = page;
+        page->set_next(partitions[task_index].head);
+        partitions[task_index].head = page;
       }
     }
   }
 
   {
-    ThreadBarrier barrier(num_tasks, heap_->barrier(), heap_->barrier_done());
+    ThreadBarrier* barrier = new ThreadBarrier(num_tasks, 1);
+    RelaxedAtomic<intptr_t> next_planning_task = {0};
+    RelaxedAtomic<intptr_t> next_sliding_task = {0};
     RelaxedAtomic<intptr_t> next_forwarding_task = {0};
 
     for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
       if (task_index < (num_tasks - 1)) {
         // Begin compacting on a helper thread.
         Dart::thread_pool()->Run<CompactorTask>(
-            thread()->isolate_group(), this, &barrier, &next_forwarding_task,
-            heads[task_index], &tails[task_index], freelist);
+            thread()->isolate_group(), this, barrier, &next_planning_task,
+            &next_sliding_task, &next_forwarding_task, num_tasks, partitions,
+            freelist);
       } else {
         // Last worker is the main thread.
-        CompactorTask task(thread()->isolate_group(), this, &barrier,
-                           &next_forwarding_task, heads[task_index],
-                           &tails[task_index], freelist);
+        CompactorTask task(thread()->isolate_group(), this, barrier,
+                           &next_planning_task, &next_sliding_task,
+                           &next_forwarding_task, num_tasks, partitions,
+                           freelist);
         task.RunEnteredIsolateGroup();
-        barrier.Exit();
+        barrier->Sync();
+        barrier->Release();
       }
     }
   }
@@ -289,7 +305,7 @@
   }
 
   for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
-    ASSERT(tails[task_index] != NULL);
+    ASSERT(partitions[task_index].tail != NULL);
   }
 
   {
@@ -304,7 +320,7 @@
 
     // Free empty pages.
     for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
-      OldPage* page = tails[task_index]->next();
+      OldPage* page = partitions[task_index].tail->next();
       while (page != NULL) {
         OldPage* next = page->next();
         heap_->old_space()->IncreaseCapacityInWordsLocked(
@@ -316,18 +332,22 @@
 
     // Re-join the heap.
     for (intptr_t task_index = 0; task_index < num_tasks - 1; task_index++) {
-      tails[task_index]->set_next(heads[task_index + 1]);
+      partitions[task_index].tail->set_next(partitions[task_index + 1].head);
     }
-    tails[num_tasks - 1]->set_next(NULL);
-    heap_->old_space()->pages_ = pages = heads[0];
-    heap_->old_space()->pages_tail_ = tails[num_tasks - 1];
+    partitions[num_tasks - 1].tail->set_next(NULL);
+    heap_->old_space()->pages_ = pages = partitions[0].head;
+    heap_->old_space()->pages_tail_ = partitions[num_tasks - 1].tail;
 
-    delete[] heads;
-    delete[] tails;
+    delete[] partitions;
   }
 }
 
 void CompactorTask::Run() {
+  if (!barrier_->TryEnter()) {
+    barrier_->Release();
+    return;
+  }
+
   bool result =
       Thread::EnterIsolateGroupAsHelper(isolate_group_, Thread::kCompactorTask,
                                         /*bypass_safepoint=*/true);
@@ -338,7 +358,8 @@
   Thread::ExitIsolateGroupAsHelper(/*bypass_safepoint=*/true);
 
   // This task is done. Notify the original thread.
-  barrier_->Exit();
+  barrier_->Sync();
+  barrier_->Release();
 }
 
 void CompactorTask::RunEnteredIsolateGroup() {
@@ -346,26 +367,34 @@
   Thread* thread = Thread::Current();
 #endif
   {
-    {
-      TIMELINE_FUNCTION_GC_DURATION(thread, "Plan");
-      free_page_ = head_;
-      free_current_ = free_page_->object_start();
-      free_end_ = free_page_->object_end();
+    while (true) {
+      intptr_t planning_task = next_planning_task_->fetch_add(1u);
+      if (planning_task >= num_tasks_) break;
 
-      for (OldPage* page = head_; page != NULL; page = page->next()) {
+      TIMELINE_FUNCTION_GC_DURATION(thread, "Plan");
+      OldPage* head = partitions_[planning_task].head;
+      free_page_ = head;
+      free_current_ = head->object_start();
+      free_end_ = head->object_end();
+
+      for (OldPage* page = head; page != NULL; page = page->next()) {
         PlanPage(page);
       }
     }
 
     barrier_->Sync();
 
-    {
-      TIMELINE_FUNCTION_GC_DURATION(thread, "Slide");
-      free_page_ = head_;
-      free_current_ = free_page_->object_start();
-      free_end_ = free_page_->object_end();
+    while (true) {
+      intptr_t sliding_task = next_sliding_task_->fetch_add(1u);
+      if (sliding_task >= num_tasks_) break;
 
-      for (OldPage* page = head_; page != NULL; page = page->next()) {
+      TIMELINE_FUNCTION_GC_DURATION(thread, "Slide");
+      OldPage* head = partitions_[sliding_task].head;
+      free_page_ = head;
+      free_current_ = head->object_start();
+      free_end_ = head->object_end();
+
+      for (OldPage* page = head; page != NULL; page = page->next()) {
         SlidePage(page);
       }
 
@@ -377,7 +406,7 @@
       }
 
       ASSERT(free_page_ != NULL);
-      *tail_ = free_page_;  // Last live page.
+      partitions_[sliding_task].tail = free_page_;  // Last live page.
     }
 
     // Heap: Regular pages already visited during sliding. Code and image pages
@@ -434,8 +463,6 @@
           more_forwarding_tasks = false;
       }
     }
-
-    barrier_->Sync();
   }
 }
 
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 9c8269b..fe3956d 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -48,8 +48,6 @@
       is_vm_isolate_(is_vm_isolate),
       new_space_(this, max_new_gen_semi_words),
       old_space_(this, max_old_gen_words),
-      barrier_(),
-      barrier_done_(),
       read_only_(false),
       last_gc_was_old_space_(false),
       assume_scavenge_will_fail_(false),
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 04e8a62..2360700 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -288,9 +288,6 @@
   IsolateGroup* isolate_group() const { return isolate_group_; }
   bool is_vm_isolate() const { return is_vm_isolate_; }
 
-  Monitor* barrier() const { return &barrier_; }
-  Monitor* barrier_done() const { return &barrier_done_; }
-
   void SetupImagePage(void* pointer, uword size, bool is_executable) {
     old_space_.SetupImagePage(pointer, size, is_executable);
   }
@@ -379,9 +376,6 @@
   WeakTable* new_weak_tables_[kNumWeakSelectors];
   WeakTable* old_weak_tables_[kNumWeakSelectors];
 
-  mutable Monitor barrier_;
-  mutable Monitor barrier_done_;
-
   // GC stats collection.
   GCStats stats_;
 
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index b30bf66..c45765c 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -574,9 +574,6 @@
 };
 
 VM_UNIT_TEST_CASE(CleanupBequestNeverReceived) {
-  // This test uses features from isolate groups
-  FLAG_enable_isolate_groups = true;
-
   const char* TEST_MESSAGE = "hello, world";
   Dart_Isolate parent = TestCase::CreateTestIsolate("parent");
   EXPECT_EQ(parent, Dart_CurrentIsolate());
@@ -608,9 +605,6 @@
 }
 
 VM_UNIT_TEST_CASE(ReceivesSendAndExitMessage) {
-  // This test uses features from isolate groups
-  FLAG_enable_isolate_groups = true;
-
   const char* TEST_MESSAGE = "hello, world";
   Dart_Isolate parent = TestCase::CreateTestIsolate("parent");
   EXPECT_EQ(parent, Dart_CurrentIsolate());
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index a2f7477..43b4c62 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -35,6 +35,7 @@
         work_list_(marking_stack),
         deferred_work_list_(deferred_marking_stack),
         delayed_weak_properties_(WeakProperty::null()),
+        tail_(WeakProperty::null()),
         marked_bytes_(0),
         marked_micros_(0) {
     ASSERT(thread_->isolate_group() == isolate_group);
@@ -50,7 +51,7 @@
   bool ProcessPendingWeakProperties() {
     bool more_to_mark = false;
     WeakPropertyPtr cur_weak = delayed_weak_properties_;
-    delayed_weak_properties_ = WeakProperty::null();
+    tail_ = delayed_weak_properties_ = WeakProperty::null();
     while (cur_weak != WeakProperty::null()) {
       WeakPropertyPtr next_weak =
           cur_weak->untag()->next_.Decompress(cur_weak->heap_base());
@@ -154,6 +155,9 @@
     ASSERT(raw_weak->untag()->next_ ==
            CompressedWeakPropertyPtr(WeakProperty::null()));
     raw_weak->untag()->next_ = delayed_weak_properties_;
+    if (delayed_weak_properties_ == WeakProperty::null()) {
+      tail_ = raw_weak;
+    }
     delayed_weak_properties_ = raw_weak;
   }
 
@@ -228,6 +232,26 @@
     return work_list_.WaitForWork(num_busy);
   }
 
+  void Flush(WeakPropertyPtr* head, WeakPropertyPtr* tail) {
+    work_list_.Flush();
+    deferred_work_list_.Flush();
+    if (*head == WeakProperty::null()) {
+      *head = delayed_weak_properties_;
+      *tail = tail_;
+    } else {
+      (*tail)->untag()->next_ = delayed_weak_properties_;
+      *tail = tail_;
+    }
+    tail_ = delayed_weak_properties_ = WeakProperty::null();
+  }
+
+  void Adopt(WeakPropertyPtr head, WeakPropertyPtr tail) {
+    ASSERT(delayed_weak_properties_ == WeakProperty::null());
+    ASSERT(tail_ == WeakProperty::null());
+    delayed_weak_properties_ = head;
+    tail_ = tail;
+  }
+
   void AbandonWork() {
     work_list_.AbandonWork();
     deferred_work_list_.AbandonWork();
@@ -302,6 +326,7 @@
   MarkerWorkList work_list_;
   MarkerWorkList deferred_work_list_;
   WeakPropertyPtr delayed_weak_properties_;
+  WeakPropertyPtr tail_;
   uintptr_t marked_bytes_;
   int64_t marked_micros_;
 
@@ -542,6 +567,11 @@
         num_busy_(num_busy) {}
 
   virtual void Run() {
+    if (!barrier_->TryEnter()) {
+      barrier_->Release();
+      return;
+    }
+
     bool result = Thread::EnterIsolateGroupAsHelper(
         isolate_group_, Thread::kMarkerTask, /*bypass_safepoint=*/true);
     ASSERT(result);
@@ -550,8 +580,8 @@
 
     Thread::ExitIsolateGroupAsHelper(/*bypass_safepoint=*/true);
 
-    // This task is done. Notify the original thread.
-    barrier_->Exit();
+    barrier_->Sync();
+    barrier_->Release();
   }
 
   void RunEnteredIsolateGroup() {
@@ -561,6 +591,7 @@
       int64_t start = OS::GetCurrentMonotonicMicros();
 
       // Phase 1: Iterate over roots and drain marking stack in tasks.
+      num_busy_->fetch_add(1u);
       marker_->IterateRoots(visitor_);
 
       visitor_->ProcessDeferredMarking();
@@ -603,7 +634,6 @@
 
       // Phase 2: deferred marking.
       visitor_->ProcessDeferredMarking();
-      visitor_->FinalizeMarking();
       barrier_->Sync();
 
       // Phase 3: Weak processing and statistics.
@@ -615,7 +645,6 @@
         THR_Print("Task marked %" Pd " bytes in %" Pd64 " micros.\n",
                   visitor_->marked_bytes(), visitor_->marked_micros());
       }
-      barrier_->Sync();
     }
   }
 
@@ -754,13 +783,31 @@
   ResetSlices();
   for (intptr_t i = 0; i < num_tasks; i++) {
     ASSERT(visitors_[i] == NULL);
-    visitors_[i] = new SyncMarkingVisitor(
+    SyncMarkingVisitor* visitor = new SyncMarkingVisitor(
         isolate_group_, page_space, &marking_stack_, &deferred_marking_stack_);
+    visitors_[i] = visitor;
 
-    // Begin marking on a helper thread.
-    bool result = Dart::thread_pool()->Run<ConcurrentMarkTask>(
-        this, isolate_group_, page_space, visitors_[i]);
-    ASSERT(result);
+    if (i < (num_tasks - 1)) {
+      // Begin marking on a helper thread.
+      bool result = Dart::thread_pool()->Run<ConcurrentMarkTask>(
+          this, isolate_group_, page_space, visitor);
+      ASSERT(result);
+    } else {
+      // Last worker is the main thread, which will only mark roots.
+      TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "ConcurrentMark");
+      int64_t start = OS::GetCurrentMonotonicMicros();
+      IterateRoots(visitor);
+      int64_t stop = OS::GetCurrentMonotonicMicros();
+      visitor->AddMicros(stop - start);
+      if (FLAG_log_marker_tasks) {
+        THR_Print("Task marked %" Pd " bytes in %" Pd64 " micros.\n",
+                  visitor->marked_bytes(), visitor->marked_micros());
+      }
+      // Continue non-root marking concurrently.
+      bool result = Dart::thread_pool()->Run<ConcurrentMarkTask>(
+          this, isolate_group_, page_space, visitor);
+      ASSERT(result);
+    }
   }
 
   isolate_group_->DeferredMarkLiveTemporaries();
@@ -801,11 +848,16 @@
       marked_bytes_ += visitor.marked_bytes();
       marked_micros_ += visitor.marked_micros();
     } else {
-      ThreadBarrier barrier(num_tasks, heap_->barrier(), heap_->barrier_done());
+      ThreadBarrier* barrier = new ThreadBarrier(num_tasks, 1);
+
       ResetSlices();
       // Used to coordinate draining among tasks; all start out as 'busy'.
-      RelaxedAtomic<uintptr_t> num_busy(num_tasks);
+      RelaxedAtomic<uintptr_t> num_busy = 0;
       // Phase 1: Iterate over roots and drain marking stack in tasks.
+
+      WeakPropertyPtr head = WeakProperty::null();
+      WeakPropertyPtr tail = WeakProperty::null();
+
       for (intptr_t i = 0; i < num_tasks; ++i) {
         SyncMarkingVisitor* visitor = visitors_[i];
         // Visitors may or may not have already been created depending on
@@ -816,23 +868,33 @@
                                      &marking_stack_, &deferred_marking_stack_);
           visitors_[i] = visitor;
         }
+        // Move all work from local blocks to the global list. Any given
+        // visitor might not get to run if it fails to reach TryEnter soon
+        // enough, and we must fail to visit objects but they're sitting in
+        // such a visitor's local blocks.
+        visitor->Flush(&head, &tail);
+        // Need to move weak property list too.
+
         if (i < (num_tasks - 1)) {
           // Begin marking on a helper thread.
           bool result = Dart::thread_pool()->Run<ParallelMarkTask>(
-              this, isolate_group_, &marking_stack_, &barrier, visitor,
+              this, isolate_group_, &marking_stack_, barrier, visitor,
               &num_busy);
           ASSERT(result);
         } else {
           // Last worker is the main thread.
-          ParallelMarkTask task(this, isolate_group_, &marking_stack_, &barrier,
+          visitor->Adopt(head, tail);
+          ParallelMarkTask task(this, isolate_group_, &marking_stack_, barrier,
                                 visitor, &num_busy);
           task.RunEnteredIsolateGroup();
-          barrier.Exit();
+          barrier->Sync();
+          barrier->Release();
         }
       }
 
       for (intptr_t i = 0; i < num_tasks; i++) {
         SyncMarkingVisitor* visitor = visitors_[i];
+        visitor->FinalizeMarking();
         marked_bytes_ += visitor->marked_bytes();
         marked_micros_ += visitor->marked_micros();
         delete visitor;
diff --git a/runtime/vm/heap/pointer_block.h b/runtime/vm/heap/pointer_block.h
index 5ef6dc2..fb10fa6 100644
--- a/runtime/vm/heap/pointer_block.h
+++ b/runtime/vm/heap/pointer_block.h
@@ -195,6 +195,17 @@
     local_output_->Push(raw_obj);
   }
 
+  void Flush() {
+    if (!local_output_->IsEmpty()) {
+      stack_->PushBlock(local_output_);
+      local_output_ = stack_->PopEmptyBlock();
+    }
+    if (!local_input_->IsEmpty()) {
+      stack_->PushBlock(local_input_);
+      local_input_ = stack_->PopEmptyBlock();
+    }
+  }
+
   bool WaitForWork(RelaxedAtomic<uintptr_t>* num_busy) {
     ASSERT(local_input_->IsEmpty());
     Block* new_work = stack_->WaitForWork(num_busy);
diff --git a/runtime/vm/heap/safepoint.h b/runtime/vm/heap/safepoint.h
index d002189..42fd7d4c 100644
--- a/runtime/vm/heap/safepoint.h
+++ b/runtime/vm/heap/safepoint.h
@@ -76,6 +76,7 @@
   void BlockForSafepoint(Thread* T);
 
   bool IsOwnedByTheThread(Thread* thread) {
+    MonitorLocker ml(threads_lock());
     for (intptr_t level = 0; level < SafepointLevel::kNumLevels; ++level) {
       if (handlers_[level]->owner_ == thread) {
         return true;
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 592627b..8c736b2 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -165,21 +165,25 @@
       return;
     }
 
+    // Explicit ifdefs because the compiler does not eliminate the unused
+    // relaxed load.
+#if defined(DEBUG)
     // Validate 'this' is a typed data view.
     const uword view_header = ReadHeaderRelaxed(view);
     ASSERT(!IsForwarding(view_header) || view->IsOldObject());
     ASSERT(IsTypedDataViewClassId(view->GetClassIdMayBeSmi()));
 
-    // Validate that the backing store is not a forwarding word.
+    // Validate that the backing store is not a forwarding word. There is a data
+    // race reader the backing store's header unless there is only one worker.
     TypedDataBasePtr td = view->untag()->typed_data();
     ASSERT(td->IsHeapObject());
-    const uword td_header = ReadHeaderRelaxed(td);
-    ASSERT(!IsForwarding(td_header) || td->IsOldObject());
-
     if (!parallel) {
-      // When there is only one worker, there is no data race.
+      const uword td_header = ReadHeaderRelaxed(td);
+      ASSERT(!IsForwarding(td_header) || td->IsOldObject());
+
       ASSERT_EQUAL(IsExternalTypedDataClassId(td->GetClassId()), is_external);
     }
+#endif
 
     // If we have external typed data we can simply return since the backing
     // store lives in C-heap and will not move.
@@ -188,9 +192,11 @@
     }
 
     // Now we update the inner pointer.
+#if defined(DEBUG)
     if (!parallel) {
       ASSERT(IsTypedDataClassId(td->GetClassId()));
     }
+#endif
     view->untag()->RecomputeDataFieldForInternalTypedData();
   }
 
@@ -276,10 +282,7 @@
   }
 
   void Finalize() {
-    if (scavenger_->abort_) {
-      promoted_list_.AbandonWork();
-      delayed_weak_properties_ = WeakProperty::null();
-    } else {
+    if (!scavenger_->abort_) {
       ASSERT(!HasWork());
 
       for (NewPage* page = head_; page != nullptr; page = page->next()) {
@@ -287,14 +290,19 @@
         page->RecordSurvivors();
       }
 
-      promoted_list_.Finalize();
-
       MournWeakProperties();
     }
     page_space_->ReleaseLock(freelist_);
     thread_ = nullptr;
   }
 
+  void FinalizePromotion() { promoted_list_.Finalize(); }
+
+  void AbandonWork() {
+    promoted_list_.AbandonWork();
+    delayed_weak_properties_ = WeakProperty::null();
+  }
+
   NewPage* head() const { return head_; }
   NewPage* tail() const { return tail_; }
 
@@ -557,6 +565,11 @@
         num_busy_(num_busy) {}
 
   virtual void Run() {
+    if (!barrier_->TryEnter()) {
+      barrier_->Release();
+      return;
+    }
+
     bool result = Thread::EnterIsolateGroupAsHelper(
         isolate_group_, Thread::kScavengerTask, /*bypass_safepoint=*/true);
     ASSERT(result);
@@ -565,13 +578,14 @@
 
     Thread::ExitIsolateGroupAsHelper(/*bypass_safepoint=*/true);
 
-    // This task is done. Notify the original thread.
-    barrier_->Exit();
+    barrier_->Sync();
+    barrier_->Release();
   }
 
   void RunEnteredIsolateGroup() {
     TIMELINE_FUNCTION_GC_DURATION(Thread::Current(), "ParallelScavenge");
 
+    num_busy_->fetch_add(1u);
     visitor_->ProcessRoots();
 
     // Phase 1: Copying.
@@ -612,9 +626,10 @@
       barrier_->Sync();
     } while (more_to_scavenge);
 
+    ASSERT(!visitor_->HasWork());
+
     // Phase 2: Weak processing, statistics.
     visitor_->Finalize();
-    barrier_->Sync();
   }
 
  private:
@@ -1671,6 +1686,7 @@
   }
   visitor.Finalize();
 
+  visitor.FinalizePromotion();
   to_->AddList(visitor.head(), visitor.tail());
   return visitor.bytes_promoted();
 }
@@ -1680,8 +1696,8 @@
   const intptr_t num_tasks = FLAG_scavenger_tasks;
   ASSERT(num_tasks > 0);
 
-  ThreadBarrier barrier(num_tasks, heap_->barrier(), heap_->barrier_done());
-  RelaxedAtomic<uintptr_t> num_busy = num_tasks;
+  ThreadBarrier* barrier = new ThreadBarrier(num_tasks, 1);
+  RelaxedAtomic<uintptr_t> num_busy = 0;
 
   ParallelScavengerVisitor** visitors =
       new ParallelScavengerVisitor*[num_tasks];
@@ -1692,21 +1708,28 @@
     if (i < (num_tasks - 1)) {
       // Begin scavenging on a helper thread.
       bool result = Dart::thread_pool()->Run<ParallelScavengerTask>(
-          heap_->isolate_group(), &barrier, visitors[i], &num_busy);
+          heap_->isolate_group(), barrier, visitors[i], &num_busy);
       ASSERT(result);
     } else {
       // Last worker is the main thread.
-      ParallelScavengerTask task(heap_->isolate_group(), &barrier, visitors[i],
+      ParallelScavengerTask task(heap_->isolate_group(), barrier, visitors[i],
                                  &num_busy);
       task.RunEnteredIsolateGroup();
-      barrier.Exit();
+      barrier->Sync();
+      barrier->Release();
     }
   }
 
   for (intptr_t i = 0; i < num_tasks; i++) {
-    to_->AddList(visitors[i]->head(), visitors[i]->tail());
-    bytes_promoted += visitors[i]->bytes_promoted();
-    delete visitors[i];
+    ParallelScavengerVisitor* visitor = visitors[i];
+    if (abort_) {
+      visitor->AbandonWork();
+    } else {
+      visitor->FinalizePromotion();
+    }
+    to_->AddList(visitor->head(), visitor->tail());
+    bytes_promoted += visitor->bytes_promoted();
+    delete visitor;
   }
 
   delete[] visitors;
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 3d97c84..e812345 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -56,7 +56,6 @@
     // (unless splitting into multiple outputs and there are no Code objects
     // in this particular output), but is guaranteed empty otherwise (the
     // instructions follow the InstructionsSection object instead).
-    ASSERT(FLAG_use_bare_instructions || layout->payload_length_ == 0);
     ASSERT(raw_value <=
            size - InstructionsSection::InstanceSize(layout->payload_length_));
     return layout;
@@ -238,6 +237,12 @@
   return offset;
 }
 
+intptr_t ImageWriter::SizeInSnapshotForBytes(intptr_t length) {
+  // We are just going to write it out as a string.
+  return compiler::target::String::InstanceSize(
+      length * OneByteString::kBytesPerElement);
+}
+
 intptr_t ImageWriter::SizeInSnapshot(ObjectPtr raw_object) {
   const classid_t cid = raw_object->GetClassId();
 
@@ -281,13 +286,21 @@
 }
 
 uint32_t ImageWriter::GetDataOffsetFor(ObjectPtr raw_object) {
-  intptr_t snap_size = SizeInSnapshot(raw_object);
-  intptr_t offset = next_data_offset_;
+  const intptr_t snap_size = SizeInSnapshot(raw_object);
+  const intptr_t offset = next_data_offset_;
   next_data_offset_ += snap_size;
   objects_.Add(ObjectData(raw_object));
   return offset;
 }
 
+uint32_t ImageWriter::AddBytesToData(uint8_t* bytes, intptr_t length) {
+  const intptr_t snap_size = SizeInSnapshotForBytes(length);
+  const intptr_t offset = next_data_offset_;
+  next_data_offset_ += snap_size;
+  objects_.Add(ObjectData(bytes, length));
+  return offset;
+}
+
 intptr_t ImageWriter::GetTextObjectCount() const {
   return instructions_.length();
 }
@@ -440,9 +453,24 @@
     // the VM snapshot's text image.
     heap->SetObjectId(data.insns_->ptr(), 0);
   }
-  for (intptr_t i = 0; i < objects_.length(); i++) {
-    ObjectData& data = objects_[i];
-    data.obj_ = &Object::Handle(zone_, data.raw_obj_);
+  for (auto& data : objects_) {
+    if (data.is_object) {
+      data.obj = &Object::Handle(zone_, data.raw_obj);
+    }
+  }
+
+  // Once we have everything handlified we are going to do convert raw bytes
+  // to string objects. String is used for simplicity as a bit container,
+  // can't use TypedData because it has an internal pointer (data_) field.
+  for (auto& data : objects_) {
+    if (!data.is_object) {
+      const auto bytes = data.bytes;
+      data.obj = &Object::Handle(
+          zone_, OneByteString::New(bytes.buf, bytes.length, Heap::kOld));
+      data.is_object = true;
+      String::Cast(*data.obj).Hash();
+      free(bytes.buf);
+    }
   }
 
   // Needs to happen before WriteText, as we add information about the
@@ -485,8 +513,9 @@
 
   // Heap page objects start here.
 
-  for (intptr_t i = 0; i < objects_.length(); i++) {
-    const Object& obj = *objects_[i].obj_;
+  for (auto entry : objects_) {
+    ASSERT(entry.is_object);
+    const Object& obj = *entry.obj;
 #if defined(DART_PRECOMPILER)
     AutoTraceImage(obj, section_start, stream);
 #endif
@@ -499,10 +528,9 @@
     if (obj.IsCompressedStackMaps()) {
       const CompressedStackMaps& map = CompressedStackMaps::Cast(obj);
       const intptr_t payload_size = map.payload_size();
-      stream->WriteTargetWord(map.ptr()->untag()->flags_and_size_);
-      ASSERT_EQUAL(stream->Position() - object_start,
-                   compiler::target::CompressedStackMaps::HeaderSize());
-      stream->WriteBytes(map.ptr()->untag()->data(), payload_size);
+      stream->WriteFixed<uint32_t>(
+          map.ptr()->untag()->payload()->flags_and_size);
+      stream->WriteBytes(map.ptr()->untag()->payload()->data(), payload_size);
     } else if (obj.IsCodeSourceMap()) {
       const CodeSourceMap& map = CodeSourceMap::Cast(obj);
       stream->WriteTargetWord(map.Length());
@@ -599,8 +627,7 @@
 }
 
 void ImageWriter::WriteText(bool vm) {
-  const bool bare_instruction_payloads =
-      FLAG_precompiled_mode && FLAG_use_bare_instructions;
+  const bool bare_instruction_payloads = FLAG_precompiled_mode;
 
   // Start snapshot at page boundary.
   if (!EnterSection(ProgramSection::Text, vm, ImageWriter::kTextAlignment)) {
@@ -1568,20 +1595,18 @@
 
 #if defined(DART_PRECOMPILED_RUNTIME)
 uword ImageReader::GetBareInstructionsAt(uint32_t offset) const {
-  ASSERT(FLAG_use_bare_instructions);
   ASSERT(Utils::IsAligned(offset, Instructions::kBarePayloadAlignment));
   return reinterpret_cast<uword>(instructions_image_) + offset;
 }
 
 uword ImageReader::GetBareInstructionsEnd() const {
-  ASSERT(FLAG_use_bare_instructions);
   Image image(instructions_image_);
   return reinterpret_cast<uword>(image.object_start()) + image.object_size();
 }
 #endif
 
 InstructionsPtr ImageReader::GetInstructionsAt(uint32_t offset) const {
-  ASSERT(!FLAG_precompiled_mode || !FLAG_use_bare_instructions);
+  ASSERT(!FLAG_precompiled_mode);
   ASSERT(Utils::IsAligned(offset, kObjectAlignment));
 
   ObjectPtr result = UntaggedObject::FromAddr(
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index fc2bbdd..730b861 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -251,13 +251,8 @@
     if (FLAG_precompiled_mode) {
       // We reserve space for the initial InstructionsSection object. It is
       // manually serialized since it includes offsets to other snapshot parts.
-      // In bare instructions mode, it contains all the payloads and so we
-      // start after the header, whereas in non-bare mode, it contains no
-      // payload and Instructions start after it.
-      next_text_offset_ +=
-          FLAG_use_bare_instructions
-              ? compiler::target::InstructionsSection::HeaderSize()
-              : compiler::target::InstructionsSection::InstanceSize(0);
+      // It contains all the payloads which start directly after the header.
+      next_text_offset_ += compiler::target::InstructionsSection::HeaderSize();
     }
 #endif
     objects_.Clear();
@@ -277,6 +272,8 @@
   int32_t GetTextOffsetFor(InstructionsPtr instructions, CodePtr code);
   uint32_t GetDataOffsetFor(ObjectPtr raw_object);
 
+  uint32_t AddBytesToData(uint8_t* bytes, intptr_t length);
+
   void Write(NonStreamingWriteStream* clustered_stream, bool vm);
   intptr_t data_size() const { return next_data_offset_; }
   intptr_t text_size() const { return next_text_offset_; }
@@ -359,12 +356,20 @@
   };
 
   struct ObjectData {
-    explicit ObjectData(ObjectPtr raw_obj) : raw_obj_(raw_obj) {}
+    explicit ObjectData(ObjectPtr raw_obj)
+        : raw_obj(raw_obj), is_object(true) {}
+    ObjectData(uint8_t* buf, intptr_t length)
+        : bytes({buf, length}), is_object(false) {}
 
     union {
-      ObjectPtr raw_obj_;
-      const Object* obj_;
+      struct {
+        uint8_t* buf;
+        intptr_t length;
+      } bytes;
+      ObjectPtr raw_obj;
+      const Object* obj;
     };
+    bool is_object;
   };
 
   // Methods abstracting out the particulars of the underlying concrete writer.
@@ -452,6 +457,8 @@
   friend class SnapshotTextObjectNamer;  // For InstructionsData.
 
  private:
+  static intptr_t SizeInSnapshotForBytes(intptr_t length);
+
   DISALLOW_COPY_AND_ASSIGN(ImageWriter);
 };
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 9103b35..a48a622 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -62,6 +62,7 @@
 
 DECLARE_FLAG(bool, print_metrics);
 DECLARE_FLAG(bool, trace_service);
+DECLARE_FLAG(bool, trace_shutdown);
 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger);
 
 // Reload flags.
@@ -488,6 +489,19 @@
 }
 
 void IsolateGroup::Shutdown() {
+  char* name;
+  // We retrieve the flag value once to avoid the compiler complaining about the
+  // possibly uninitialized value of name, as the compiler is unaware that when
+  // the flag variable is non-const, it is set once during VM initialization and
+  // never changed after, and that modification never runs concurrently with
+  // this method.
+  const bool trace_shutdown = FLAG_trace_shutdown;
+
+  if (trace_shutdown) {
+    name = Utils::StrDup(source()->name);
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutdown starting for group %s\n",
+                 Dart::UptimeMillis(), name);
+  }
   // Ensure to join all threads before waiting for pending GC tasks (the thread
   // pool can trigger idle notification, which can start new GC tasks).
   //
@@ -529,11 +543,28 @@
   // After this isolate group has died we might need to notify a pending
   // `Dart_Cleanup()` call.
   {
+    if (trace_shutdown) {
+      OS::PrintErr("[+%" Pd64
+                   "ms] SHUTDOWN: Notifying "
+                   "isolate group shutdown (%s)\n",
+                   Dart::UptimeMillis(), name);
+    }
     MonitorLocker ml(Isolate::isolate_creation_monitor_);
     if (!Isolate::creation_enabled_ &&
         !IsolateGroup::HasApplicationIsolateGroups()) {
       ml.Notify();
     }
+    if (trace_shutdown) {
+      OS::PrintErr("[+%" Pd64
+                   "ms] SHUTDOWN: Done Notifying "
+                   "isolate group shutdown (%s)\n",
+                   Dart::UptimeMillis(), name);
+    }
+  }
+  if (trace_shutdown) {
+    OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Done shutdown for group %s\n",
+                 Dart::UptimeMillis(), name);
+    free(name);
   }
 }
 
@@ -1390,9 +1421,6 @@
     } else if (msg_handler.IsNull()) {
       // If the port has been closed then the message will be dropped at this
       // point. Make sure to post to the delivery failure port in that case.
-      if (message->RedirectToDeliveryFailurePort()) {
-        PortMap::PostMessage(std::move(message));
-      }
     } else {
       // The handler closure which was used to successfully handle the message.
     }
@@ -2372,6 +2400,18 @@
                                                    std::memory_order_release));
 }
 
+class StreamableSampleFilter : public SampleFilter {
+ public:
+  explicit StreamableSampleFilter(Dart_Port port)
+      : SampleFilter(port, kNoTaskFilter, -1, -1) {}
+
+  bool FilterSample(Sample* sample) override {
+    const UserTag& tag =
+        UserTag::Handle(UserTag::FindTagById(sample->user_tag()));
+    return tag.streamable();
+  }
+};
+
 void Isolate::ProcessFreeSampleBlocks(Thread* thread) {
   SampleBlock* head = free_block_list_.exchange(nullptr);
   if (head == nullptr) {
@@ -2398,11 +2438,14 @@
     SampleBlockListProcessor buffer(head);
     StackZone zone(thread);
     HandleScope handle_scope(thread);
+    StreamableSampleFilter filter(main_port());
     Profile profile;
-    profile.Build(thread, nullptr, &buffer);
-    ServiceEvent event(this, ServiceEvent::kCpuSamples);
-    event.set_cpu_profile(&profile);
-    Service::HandleEvent(&event);
+    profile.Build(thread, &filter, &buffer);
+    if (profile.sample_count() > 0) {
+      ServiceEvent event(this, ServiceEvent::kCpuSamples);
+      event.set_cpu_profile(&profile);
+      Service::HandleEvent(&event);
+    }
   }
 
   do {
@@ -2646,14 +2689,16 @@
       // The current thread is running on the isolate group's thread pool.
       // So we cannot safely delete the isolate group (and it's pool).
       // Instead we will destroy the isolate group on the VM-global pool.
+      if (FLAG_trace_shutdown) {
+        OS::PrintErr("[+%" Pd64 "ms] : Scheduling shutdown on VM pool %s\n",
+                     Dart::UptimeMillis(), isolate_group->source()->name);
+      }
       Dart::thread_pool()->Run<ShutdownGroupTask>(isolate_group);
     }
   } else {
-    if (FLAG_enable_isolate_groups) {
-      // TODO(dartbug.com/36097): An isolate just died. A significant amount of
-      // memory might have become unreachable. We should evaluate how to best
-      // inform the GC about this situation.
-    }
+    // TODO(dartbug.com/36097): An isolate just died. A significant amount of
+    // memory might have become unreachable. We should evaluate how to best
+    // inform the GC about this situation.
   }
 }  // namespace dart
 
@@ -2818,11 +2863,6 @@
   auto thread = Thread::Current();
   StoppedMutatorsScope stopped_mutators_scope(thread);
 
-  if (thread->IsMutatorThread() && !FLAG_enable_isolate_groups) {
-    single_current_mutator->Call();
-    return;
-  }
-
   if (thread->IsAtSafepoint()) {
     RELEASE_ASSERT(safepoint_handler()->IsOwnedByTheThread(thread));
     single_current_mutator->Call();
@@ -3344,7 +3384,8 @@
 // done atomically.
 void Isolate::RegisterServiceExtensionHandler(const String& name,
                                               const Instance& closure) {
-  if (Isolate::IsSystemIsolate(this)) {
+  // Don't allow for service extensions to be registered for internal isolates.
+  if (Isolate::IsVMInternalIsolate(this)) {
     return;
   }
   GrowableObjectArray& handlers =
@@ -3548,6 +3589,11 @@
   return group->source()->flags.is_system_isolate;
 }
 
+bool Isolate::IsVMInternalIsolate(const Isolate* isolate) {
+  return isolate->is_kernel_isolate() || isolate->is_service_isolate() ||
+         (Dart::vm_isolate() == isolate);
+}
+
 void Isolate::KillLocked(LibMsgId msg_id) {
   Dart_CObject kill_msg;
   Dart_CObject* list_values[4];
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 5d2f636..1048e4e 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -163,7 +163,9 @@
     load_vmservice_library, false)                                             \
   V(NONPRODUCT, use_osr, UseOsr, use_osr, FLAG_use_osr)                        \
   V(NONPRODUCT, snapshot_is_dontneed_safe, SnapshotIsDontNeedSafe,             \
-    snapshot_is_dontneed_safe, false)
+    snapshot_is_dontneed_safe, false)                                          \
+  V(NONPRODUCT, branch_coverage, BranchCoverage, branch_coverage,              \
+    FLAG_branch_coverage)
 
 #define BOOL_ISOLATE_FLAG_LIST_DEFAULT_GETTER(V)                               \
   V(PRODUCT, copy_parent_code, CopyParentCode, copy_parent_code, false)        \
@@ -482,6 +484,11 @@
         ShouldLoadVmServiceBit::update(value, isolate_group_flags_);
   }
 
+  void set_asserts(bool value) {
+    isolate_group_flags_ =
+        EnableAssertsBit::update(value, isolate_group_flags_);
+  }
+
 #if !defined(PRODUCT)
 #if !defined(DART_PRECOMPILED_RUNTIME)
   bool HasAttemptedReload() const {
@@ -791,7 +798,8 @@
   V(Obfuscate)                                                                 \
   V(UseFieldGuards)                                                            \
   V(UseOsr)                                                                    \
-  V(SnapshotIsDontNeedSafe)
+  V(SnapshotIsDontNeedSafe)                                                    \
+  V(BranchCoverage)
 
   // Isolate group specific flags.
   enum FlagBits {
@@ -1396,6 +1404,7 @@
   static bool IsSystemIsolate(const Isolate* isolate) {
     return IsolateGroup::IsSystemIsolateGroup(isolate->group());
   }
+  static bool IsVMInternalIsolate(const Isolate* isolate);
 
   HandlerInfoCache* handler_info_cache() { return &handler_info_cache_; }
 
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index 2003591..2b8afac 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -104,7 +104,8 @@
       barrier_->Sync();
     }
     Thread::ExitIsolateAsHelper();
-    barrier_->Exit();
+    barrier_->Sync();
+    barrier_->Release();
   }
 
  private:
@@ -125,24 +126,24 @@
 // compiler and/or CPU could reorder operations to make the tasks observe the
 // round update *before* the interrupt is set.
 TEST_CASE(StackLimitInterrupts) {
-  auto heap = thread->isolate_group()->heap();
-  ThreadBarrier barrier(InterruptChecker::kTaskCount + 1, heap->barrier(),
-                        heap->barrier_done());
+  ThreadBarrier* barrier = new ThreadBarrier(InterruptChecker::kTaskCount + 1,
+                                             InterruptChecker::kTaskCount + 1);
   // Start all tasks. They will busy-wait until interrupted in the first round.
   for (intptr_t task = 0; task < InterruptChecker::kTaskCount; task++) {
-    Dart::thread_pool()->Run<InterruptChecker>(thread, &barrier);
+    Dart::thread_pool()->Run<InterruptChecker>(thread, barrier);
   }
   // Wait for all tasks to get ready for the first round.
-  barrier.Sync();
+  barrier->Sync();
   for (intptr_t i = 0; i < InterruptChecker::kIterations; ++i) {
     thread->ScheduleInterrupts(Thread::kVMInterrupt);
     // Wait for all tasks to observe the interrupt.
-    barrier.Sync();
+    barrier->Sync();
     // Continue with next round.
     uword interrupts = thread->GetAndClearInterrupts();
     EXPECT((interrupts & Thread::kVMInterrupt) != 0);
   }
-  barrier.Exit();
+  barrier->Sync();
+  barrier->Release();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 01b6c5f..dfac508 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -164,16 +164,16 @@
     JSONObject data(&jsobj, "data");
     PrintRequest(&data, this);
     if (details_format != NULL) {
-      va_list args;
-      va_start(args, details_format);
-      intptr_t len = Utils::VSNPrint(NULL, 0, details_format, args);
-      va_end(args);
+      va_list measure_args;
+      va_start(measure_args, details_format);
+      intptr_t len = Utils::VSNPrint(NULL, 0, details_format, measure_args);
+      va_end(measure_args);
 
       char* buffer = Thread::Current()->zone()->Alloc<char>(len + 1);
-      va_list args2;
-      va_start(args2, details_format);
-      Utils::VSNPrint(buffer, (len + 1), details_format, args2);
-      va_end(args2);
+      va_list print_args;
+      va_start(print_args, details_format);
+      Utils::VSNPrint(buffer, (len + 1), details_format, print_args);
+      va_end(print_args);
       data.AddProperty("details", buffer);
     }
   }
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 46d20ec..891a2b7 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
 
 // Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 74;
-static const uint32_t kMaxSupportedKernelFormatVersion = 74;
+static const uint32_t kMinSupportedKernelFormatVersion = 75;
+static const uint32_t kMaxSupportedKernelFormatVersion = 75;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 6236cf3..39689f6 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1588,6 +1588,25 @@
       fields_[0]->set_is_nullable(true);
     }
 
+    // Check that subclasses of AbiSpecificInteger have a mapping for the
+    // current ABI.
+    //
+    // TODO(https://github.com/dart-lang/language/issues/1889): If we make
+    // kernel know about the target platform, we can move this check to the
+    // frontend.
+    const auto& super_class = Class::Handle(Z, klass.SuperClass());
+    if (!super_class.IsNull() &&
+        super_class.UserVisibleName() == Symbols::AbiSpecificInteger().ptr() &&
+        Library::Handle(Z, super_class.library()).url() ==
+            Symbols::DartFfi().ptr()) {
+      const char* error = nullptr;
+      compiler::ffi::NativeType::FromAbstractType(
+          Z, AbstractType::Handle(Z, klass.DeclarationType()), &error);
+      if (error != nullptr) {
+        H.ReportError("%s", error);
+      }
+    }
+
     // Due to ReadVMAnnotations(), the klass may have been loaded at this point
     // (loading the class while evaluating annotations).
     if (klass.is_loaded()) {
@@ -1952,6 +1971,7 @@
   }
   function.set_kernel_offset(procedure_offset);
   function.set_is_extension_member(is_extension_member);
+  function.set_is_redirecting_factory(procedure_helper.IsRedirectingFactory());
   if ((library.is_dart_scheme() &&
        H.IsPrivate(procedure_helper.canonical_name_)) ||
       (function.is_static() && (library.ptr() == Library::InternalLibrary()))) {
diff --git a/runtime/vm/malloc_hooks_tcmalloc.cc b/runtime/vm/malloc_hooks_tcmalloc.cc
index 438e477..3dc3639 100644
--- a/runtime/vm/malloc_hooks_tcmalloc.cc
+++ b/runtime/vm/malloc_hooks_tcmalloc.cc
@@ -341,7 +341,11 @@
 bool MallocHooks::GetStats(intptr_t* used,
                            intptr_t* capacity,
                            const char** implementation) {
+#if defined(DART_USE_MALLINFO2)
+  struct mallinfo2 info = mallinfo2();
+#else
   struct mallinfo info = mallinfo();
+#endif  // defined(DART_USE_MALLINFO2)
   *used = info.uordblks;
   *capacity = *used + info.fordblks;
   *implementation = "tcmalloc";
diff --git a/runtime/vm/malloc_hooks_unsupported.cc b/runtime/vm/malloc_hooks_unsupported.cc
index 9650cff..5b666d1 100644
--- a/runtime/vm/malloc_hooks_unsupported.cc
+++ b/runtime/vm/malloc_hooks_unsupported.cc
@@ -70,7 +70,11 @@
   }
 #endif
 #if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_ANDROID)
+#if defined(DART_USE_MALLINFO2)
+  struct mallinfo2 info = mallinfo2();
+#else
   struct mallinfo info = mallinfo();
+#endif  // defined(DART_USE_MALLINFO2)
   *used = info.uordblks;
   *capacity = *used + info.fordblks;
   *implementation = "unknown";
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index e4430e6..0f2d2e4 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -20,49 +20,32 @@
                  uint8_t* snapshot,
                  intptr_t snapshot_length,
                  MessageFinalizableData* finalizable_data,
-                 Priority priority,
-                 Dart_Port delivery_failure_port)
+                 Priority priority)
     : dest_port_(dest_port),
-      delivery_failure_port_(delivery_failure_port),
       payload_(snapshot),
       snapshot_length_(snapshot_length),
       finalizable_data_(finalizable_data),
       priority_(priority) {
-  ASSERT((priority == kNormalPriority) ||
-         (delivery_failure_port == kIllegalPort));
   ASSERT(IsSnapshot());
 }
 
-Message::Message(Dart_Port dest_port,
-                 ObjectPtr raw_obj,
-                 Priority priority,
-                 Dart_Port delivery_failure_port)
-    : dest_port_(dest_port),
-      delivery_failure_port_(delivery_failure_port),
-      payload_(raw_obj),
-      priority_(priority) {
+Message::Message(Dart_Port dest_port, ObjectPtr raw_obj, Priority priority)
+    : dest_port_(dest_port), payload_(raw_obj), priority_(priority) {
   ASSERT(!raw_obj->IsHeapObject() || raw_obj->untag()->InVMIsolateHeap());
-  ASSERT((priority == kNormalPriority) ||
-         (delivery_failure_port == kIllegalPort));
   ASSERT(IsRaw());
 }
 
 Message::Message(Dart_Port dest_port,
                  PersistentHandle* handle,
-                 Priority priority,
-                 Dart_Port delivery_failure_port)
+                 Priority priority)
     : dest_port_(dest_port),
-      delivery_failure_port_(delivery_failure_port),
       payload_(handle),
       snapshot_length_(kPersistentHandleSnapshotLen),
       priority_(priority) {
-  ASSERT((priority == kNormalPriority) ||
-         (delivery_failure_port == kIllegalPort));
   ASSERT(IsPersistentHandle());
 }
 
 Message::~Message() {
-  ASSERT(delivery_failure_port_ == kIllegalPort);
   if (IsSnapshot()) {
     free(payload_.snapshot_);
   }
@@ -74,15 +57,6 @@
   }
 }
 
-bool Message::RedirectToDeliveryFailurePort() {
-  if (delivery_failure_port_ == kIllegalPort) {
-    return false;
-  }
-  dest_port_ = delivery_failure_port_;
-  delivery_failure_port_ = kIllegalPort;
-  return true;
-}
-
 intptr_t Message::Id() const {
   // Messages are allocated on the C heap. Use the raw address as the id.
   return reinterpret_cast<intptr_t>(this);
@@ -179,9 +153,6 @@
   tail_ = nullptr;
   while (cur != nullptr) {
     std::unique_ptr<Message> next(cur->next_);
-    if (cur->RedirectToDeliveryFailurePort()) {
-      PortMap::PostMessage(std::move(cur));
-    }
     cur = std::move(next);
   }
 }
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index bbdf5f9..4c82bdf 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -56,20 +56,13 @@
           uint8_t* snapshot,
           intptr_t snapshot_length,
           MessageFinalizableData* finalizable_data,
-          Priority priority,
-          Dart_Port delivery_failure_port = kIllegalPort);
+          Priority priority);
 
   // Message objects can also carry RawObject pointers for Smis and objects in
   // the VM heap. This is indicated by setting the len_ field to 0.
-  Message(Dart_Port dest_port,
-          ObjectPtr raw_obj,
-          Priority priority,
-          Dart_Port delivery_failure_port = kIllegalPort);
+  Message(Dart_Port dest_port, ObjectPtr raw_obj, Priority priority);
 
-  Message(Dart_Port dest_port,
-          PersistentHandle* handle,
-          Priority priority,
-          Dart_Port delivery_failure_port = kIllegalPort);
+  Message(Dart_Port dest_port, PersistentHandle* handle, Priority priority);
 
   ~Message();
 
@@ -119,8 +112,6 @@
     return snapshot_length_ == kPersistentHandleSnapshotLen;
   }
 
-  bool RedirectToDeliveryFailurePort();
-
   void DropFinalizers() {
     if (finalizable_data_ != nullptr) {
       finalizable_data_->DropFinalizers();
@@ -138,7 +129,6 @@
 
   Message* next_ = nullptr;
   Dart_Port dest_port_;
-  Dart_Port delivery_failure_port_;
   union Payload {
     Payload(uint8_t* snapshot) : snapshot_(snapshot) {}
     Payload(ObjectPtr raw_obj) : raw_obj_(raw_obj) {}
diff --git a/runtime/vm/message_snapshot.cc b/runtime/vm/message_snapshot.cc
index 4733db0..afc2bc3 100644
--- a/runtime/vm/message_snapshot.cc
+++ b/runtime/vm/message_snapshot.cc
@@ -2133,6 +2133,19 @@
           reinterpret_cast<uint8_t*>(finalizable_data.data), length));
     }
   }
+
+  void ReadNodesApi(ApiMessageDeserializer* d) {
+    intptr_t count = d->ReadUnsigned();
+    for (intptr_t i = 0; i < count; i++) {
+      Dart_CObject* data = d->Allocate(Dart_CObject_kTypedData);
+      data->value.as_typed_data.length = d->ReadUnsigned();
+      data->value.as_typed_data.type = Dart_TypedData_kUint8;
+      FinalizableData finalizable_data = d->finalizable_data()->Get();
+      data->value.as_typed_data.values =
+          reinterpret_cast<uint8_t*>(finalizable_data.data);
+      d->AssignRef(data);
+    }
+  }
 };
 
 class Simd128MessageSerializationCluster : public MessageSerializationCluster {
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index e272c5c..6fd3ef4 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1036,7 +1036,7 @@
         empty_compressed_stackmaps_,
         static_cast<CompressedStackMapsPtr>(address + kHeapObjectTag));
     empty_compressed_stackmaps_->StoreNonPointer(
-        &empty_compressed_stackmaps_->untag()->flags_and_size_, 0);
+        &empty_compressed_stackmaps_->untag()->payload()->flags_and_size, 0);
     empty_compressed_stackmaps_->SetCanonical();
   }
 
@@ -1344,8 +1344,13 @@
         // Some classes have identity hash codes that depend on their contents,
         // not per object.
         ASSERT(!obj->IsStringInstance());
-        if (!obj->IsMint() && !obj->IsDouble() && !obj->IsRawNull() &&
-            !obj->IsBool()) {
+        if (obj == Object::null()) {
+          Object::SetCachedHashIfNotSet(obj, kNullIdentityHash);
+        } else if (obj == Object::bool_true().ptr()) {
+          Object::SetCachedHashIfNotSet(obj, kTrueIdentityHash);
+        } else if (obj == Object::bool_false().ptr()) {
+          Object::SetCachedHashIfNotSet(obj, kFalseIdentityHash);
+        } else if (!obj->IsMint() && !obj->IsDouble()) {
           counter_ += 2011;  // The year Dart was announced and a prime.
           counter_ &= 0x3fffffff;
           if (counter_ == 0) counter_++;
@@ -7483,7 +7488,7 @@
 
 FunctionPtr Function::implicit_closure_function() const {
   if (IsClosureFunction() || IsDispatcherOrImplicitAccessor() ||
-      IsFieldInitializer() || IsFfiTrampoline()) {
+      IsFieldInitializer() || IsFfiTrampoline() || IsMethodExtractor()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(data());
@@ -7553,12 +7558,31 @@
          kFfiHandleCid;
 }
 
+// Keep consistent with BaseMarshaller::IsCompound.
 bool Function::FfiCSignatureReturnsStruct() const {
   ASSERT(IsFfiTrampoline());
-  const FunctionType& c_signature = FunctionType::Handle(FfiCSignature());
-  const auto& return_type = AbstractType::Handle(c_signature.result_type());
-  const bool predefined = IsFfiTypeClassId(return_type.type_class_id());
-  return !predefined;
+  Zone* zone = Thread::Current()->zone();
+  const auto& c_signature = FunctionType::Handle(zone, FfiCSignature());
+  const auto& type = AbstractType::Handle(zone, c_signature.result_type());
+  if (IsFfiTypeClassId(type.type_class_id())) {
+    return false;
+  }
+  const auto& cls = Class::Handle(zone, type.type_class());
+  const auto& superClass = Class::Handle(zone, cls.SuperClass());
+  const bool is_abi_specific_int =
+      String::Handle(zone, superClass.UserVisibleName())
+          .Equals(Symbols::AbiSpecificInteger());
+  if (is_abi_specific_int) {
+    return false;
+  }
+#ifdef DEBUG
+  const bool is_struct = String::Handle(zone, superClass.UserVisibleName())
+                             .Equals(Symbols::Struct());
+  const bool is_union = String::Handle(zone, superClass.UserVisibleName())
+                            .Equals(Symbols::Union());
+  ASSERT(is_struct || is_union);
+#endif
+  return true;
 }
 
 int32_t Function::FfiCallbackId() const {
@@ -9508,15 +9532,6 @@
   return target.ptr();
 }
 
-intptr_t Function::ComputeClosureHash() const {
-  ASSERT(IsClosureFunction());
-  const Class& cls = Class::Handle(Owner());
-  uintptr_t result = String::Handle(name()).Hash();
-  result += String::Handle(InternalSignature()).Hash();
-  result += String::Handle(cls.Name()).Hash();
-  return result;
-}
-
 void FunctionType::Print(NameVisibility name_visibility,
                          BaseTextBuffer* printer) const {
   if (IsNull()) {
@@ -9600,6 +9615,10 @@
   return true;
 }
 
+bool Function::IsPrivate() const {
+  return Library::IsPrivate(String::Handle(name()));
+}
+
 ClassPtr Function::Owner() const {
   ASSERT(untag()->owner() != Object::null());
   if (untag()->owner()->IsClass()) {
@@ -10144,8 +10163,7 @@
   }
 
   // If table dispatch is disabled, all instance calls use switchable calls.
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-        FLAG_use_table_dispatch)) {
+  if (!(FLAG_precompiled_mode && FLAG_use_table_dispatch)) {
     return true;
   }
 
@@ -14556,21 +14574,27 @@
   StoreNonPointer(&untag()->end_pc_, value);
 }
 
-void InstructionsTable::set_descriptors(const Array& value) const {
-  untag()->set_descriptors(value.ptr());
+void InstructionsTable::set_code_objects(const Array& value) const {
+  untag()->set_code_objects(value.ptr());
+}
+
+void InstructionsTable::set_rodata(uword value) const {
+  StoreNonPointer(
+      &untag()->rodata_,
+      reinterpret_cast<const UntaggedInstructionsTable::Data*>(value));
 }
 
 InstructionsTablePtr InstructionsTable::New(intptr_t length,
                                             uword start_pc,
-                                            uword end_pc) {
+                                            uword end_pc,
+                                            uword rodata) {
   ASSERT(Object::instructions_table_class() != Class::null());
   ASSERT(length >= 0);
   ASSERT(start_pc <= end_pc);
-  ASSERT(Utils::IsAligned(start_pc, kPayloadAlignment));
   Thread* thread = Thread::Current();
   InstructionsTable& result = InstructionsTable::Handle(thread->zone());
   {
-    uword size = InstructionsTable::InstanceSize(length);
+    uword size = InstructionsTable::InstanceSize();
     ObjectPtr raw =
         Object::Allocate(InstructionsTable::kClassId, size, Heap::kOld,
                          InstructionsTable::ContainsCompressedPointers());
@@ -14578,31 +14602,20 @@
     result ^= raw;
     result.set_length(length);
   }
-  const Array& descriptors =
+  const Array& code_objects =
       (length == 0) ? Object::empty_array()
                     : Array::Handle(Array::New(length, Heap::kOld));
-  result.set_descriptors(descriptors);
+  result.set_code_objects(code_objects);
   result.set_start_pc(start_pc);
   result.set_end_pc(end_pc);
+  result.set_rodata(rodata);
   return result.ptr();
 }
 
-void InstructionsTable::SetEntryAt(intptr_t index,
-                                   uword payload_start,
-                                   bool has_monomorphic_entrypoint,
-                                   ObjectPtr descriptor) const {
-  ASSERT((0 <= index) && (index < length()));
-  ASSERT(ContainsPc(payload_start));
-  ASSERT(Utils::IsAligned(payload_start, kPayloadAlignment));
-
-  const uint32_t pc_offset = ConvertPcToOffset(payload_start);
-  ASSERT((index == 0) || (PcOffsetAt(index - 1) <= pc_offset));
-  ASSERT((pc_offset & kHasMonomorphicEntrypointFlag) == 0);
-
-  untag()->data()[index] =
-      pc_offset |
-      (has_monomorphic_entrypoint ? kHasMonomorphicEntrypointFlag : 0);
-  descriptors()->untag()->set_element(index, descriptor);
+void InstructionsTable::SetCodeAt(intptr_t index, CodePtr code) const {
+  ASSERT((0 <= index) &&
+         (index < Smi::Value(code_objects()->untag()->length())));
+  code_objects()->untag()->set_element(index, code);
 }
 
 bool InstructionsTable::ContainsPc(InstructionsTablePtr table, uword pc) {
@@ -14619,21 +14632,25 @@
   return pc_offset;
 }
 
-intptr_t InstructionsTable::FindEntry(InstructionsTablePtr table, uword pc) {
+intptr_t InstructionsTable::FindEntry(InstructionsTablePtr table,
+                                      uword pc,
+                                      intptr_t start_index /* = 0 */) {
   // This can run in the middle of GC and must not allocate handles.
   NoSafepointScope no_safepoint;
   if (!InstructionsTable::ContainsPc(table, pc)) return -1;
   const uint32_t pc_offset = InstructionsTable::ConvertPcToOffset(table, pc);
-  intptr_t lo = 0;
-  intptr_t hi = InstructionsTable::length(table) - 1;
+
+  const auto rodata = table.untag()->rodata_;
+  const auto entries = rodata->entries();
+  intptr_t lo = start_index;
+  intptr_t hi = rodata->length - 1;
   while (lo <= hi) {
     intptr_t mid = (hi - lo + 1) / 2 + lo;
     ASSERT(mid >= lo);
     ASSERT(mid <= hi);
-    if (pc_offset < InstructionsTable::PcOffsetAt(table, mid)) {
+    if (pc_offset < entries[mid].pc_offset) {
       hi = mid - 1;
-    } else if ((mid != hi) &&
-               (pc_offset >= InstructionsTable::PcOffsetAt(table, mid + 1))) {
+    } else if ((mid != hi) && (pc_offset >= entries[mid + 1].pc_offset)) {
       lo = mid + 1;
     } else {
       return mid;
@@ -14642,22 +14659,66 @@
   return -1;
 }
 
-ObjectPtr InstructionsTable::DescriptorAt(InstructionsTablePtr table,
-                                          intptr_t index) {
-  ASSERT((0 <= index) && (index < InstructionsTable::length(table)));
-  return table->untag()->descriptors()->untag()->element(index);
+const UntaggedCompressedStackMaps::Payload*
+InstructionsTable::GetCanonicalStackMap(InstructionsTablePtr table) {
+  const auto rodata = table.untag()->rodata_;
+  return rodata->canonical_stack_map_entries_offset != 0
+             ? rodata->StackMapAt(rodata->canonical_stack_map_entries_offset)
+             : nullptr;
 }
 
-uword InstructionsTable::PayloadStartAt(InstructionsTablePtr table,
-                                        intptr_t index) {
-  return InstructionsTable::start_pc(table) +
-         InstructionsTable::PcOffsetAt(table, index);
+const UntaggedCompressedStackMaps::Payload* InstructionsTable::FindStackMap(
+    InstructionsTablePtr table,
+    uword pc,
+    uword* start_pc) {
+  // This can run in the middle of GC and must not allocate handles.
+  NoSafepointScope no_safepoint;
+  const intptr_t idx = FindEntry(table, pc);
+  if (idx != -1) {
+    const auto rodata = table.untag()->rodata_;
+    const auto entries = rodata->entries();
+    *start_pc = InstructionsTable::start_pc(table) + entries[idx].pc_offset;
+    return rodata->StackMapAt(entries[idx].stack_map_offset);
+  }
+  return 0;
 }
 
-uword InstructionsTable::EntryPointAt(intptr_t index) const {
-  return PayloadStartAt(index) + (HasMonomorphicEntryPointAt(index)
-                                      ? Instructions::kPolymorphicEntryOffsetAOT
-                                      : 0);
+CodePtr InstructionsTable::FindCode(InstructionsTablePtr table, uword pc) {
+  // This can run in the middle of GC and must not allocate handles.
+  NoSafepointScope no_safepoint;
+  if (!InstructionsTable::ContainsPc(table, pc)) return Code::null();
+
+  const auto rodata = table.untag()->rodata_;
+
+  const auto pc_offset = InstructionsTable::ConvertPcToOffset(table, pc);
+
+  if (pc_offset <= rodata->entries()[rodata->first_entry_with_code].pc_offset) {
+    return StubCode::UnknownDartCode().ptr();
+  }
+
+  const auto idx =
+      FindEntry(table, pc, table.untag()->rodata_->first_entry_with_code);
+  if (idx != -1) {
+    const intptr_t code_index = idx - rodata->first_entry_with_code;
+    ASSERT(code_index >= 0);
+    ASSERT(code_index <
+           Smi::Value(table.untag()->code_objects()->untag()->length()));
+    ObjectPtr result =
+        table.untag()->code_objects()->untag()->element(code_index);
+    ASSERT(result->IsCode());
+    // Note: can't use Code::RawCast(...) here because it allocates handles
+    // in DEBUG mode.
+    return static_cast<CodePtr>(result);
+  }
+
+  return Code::null();
+}
+
+uword InstructionsTable::EntryPointAt(intptr_t code_index) const {
+  ASSERT(0 <= code_index);
+  ASSERT(code_index < static_cast<intptr_t>(rodata()->length));
+  return InstructionsTable::start_pc(this->ptr()) +
+         rodata()->entries()[code_index].pc_offset;
 }
 
 const char* InstructionsTable::ToCString() const {
@@ -14953,7 +15014,7 @@
 
 uword CompressedStackMaps::Hash() const {
   NoSafepointScope scope;
-  uint8_t* data = UnsafeMutableNonPointer(&untag()->data()[0]);
+  uint8_t* data = UnsafeMutableNonPointer(&untag()->payload()->data()[0]);
   uint8_t* end = data + payload_size();
   uint32_t hash = payload_size();
   for (uint8_t* cursor = data; cursor < end; cursor++) {
@@ -14962,140 +15023,11 @@
   return FinalizeHash(hash, kHashBits);
 }
 
-CompressedStackMaps::Iterator::Iterator(const CompressedStackMaps& maps,
-                                        const CompressedStackMaps& global_table)
-    : maps_(maps),
-      bits_container_(maps_.UsesGlobalTable() ? global_table : maps_) {
-  ASSERT(!maps_.IsNull());
-  ASSERT(!bits_container_.IsNull());
-  ASSERT(!maps_.IsGlobalTable());
-  ASSERT(!maps_.UsesGlobalTable() || bits_container_.IsGlobalTable());
-}
-
-CompressedStackMaps::Iterator::Iterator(Thread* thread,
-                                        const CompressedStackMaps& maps)
-    : CompressedStackMaps::Iterator(
-          maps,
-          // Only look up the global table if the map will end up using it.
-          maps.UsesGlobalTable() ? CompressedStackMaps::Handle(
-                                       thread->zone(),
-                                       thread->isolate_group()
-                                           ->object_store()
-                                           ->canonicalized_stack_map_entries())
-                                 : Object::null_compressed_stackmaps()) {}
-
-CompressedStackMaps::Iterator::Iterator(const CompressedStackMaps::Iterator& it)
-    : maps_(it.maps_),
-      bits_container_(it.bits_container_),
-      next_offset_(it.next_offset_),
-      current_pc_offset_(it.current_pc_offset_),
-      current_global_table_offset_(it.current_global_table_offset_),
-      current_spill_slot_bit_count_(it.current_spill_slot_bit_count_),
-      current_non_spill_slot_bit_count_(it.current_spill_slot_bit_count_),
-      current_bits_offset_(it.current_bits_offset_) {}
-
-bool CompressedStackMaps::Iterator::MoveNext() {
-  if (next_offset_ >= maps_.payload_size()) {
-    return false;
-  }
-
-  NoSafepointScope scope;
-  ReadStream stream(maps_.untag()->data(), maps_.payload_size(), next_offset_);
-
-  auto const pc_delta = stream.ReadLEB128();
-  ASSERT(pc_delta <= (kMaxUint32 - current_pc_offset_));
-  current_pc_offset_ += pc_delta;
-
-  // Table-using CSMs have a table offset after the PC offset delta, whereas
-  // the post-delta part of inlined entries has the same information as
-  // global table entries.
-  if (maps_.UsesGlobalTable()) {
-    current_global_table_offset_ = stream.ReadLEB128();
-    ASSERT(current_global_table_offset_ < bits_container_.payload_size());
-
-    // Since generally we only use entries in the GC and the GC only needs
-    // the rest of the entry information if the PC offset matches, we lazily
-    // load and cache the information stored in the global object when it is
-    // actually requested.
-    current_spill_slot_bit_count_ = -1;
-    current_non_spill_slot_bit_count_ = -1;
-    current_bits_offset_ = -1;
-
-    next_offset_ = stream.Position();
-  } else {
-    current_spill_slot_bit_count_ = stream.ReadLEB128();
-    ASSERT(current_spill_slot_bit_count_ >= 0);
-
-    current_non_spill_slot_bit_count_ = stream.ReadLEB128();
-    ASSERT(current_non_spill_slot_bit_count_ >= 0);
-
-    const auto stackmap_bits =
-        current_spill_slot_bit_count_ + current_non_spill_slot_bit_count_;
-    const uintptr_t stackmap_size =
-        Utils::RoundUp(stackmap_bits, kBitsPerByte) >> kBitsPerByteLog2;
-    ASSERT(stackmap_size <= (maps_.payload_size() - stream.Position()));
-
-    current_bits_offset_ = stream.Position();
-    next_offset_ = current_bits_offset_ + stackmap_size;
-  }
-
-  return true;
-}
-
-intptr_t CompressedStackMaps::Iterator::Length() const {
-  EnsureFullyLoadedEntry();
-  return current_spill_slot_bit_count_ + current_non_spill_slot_bit_count_;
-}
-intptr_t CompressedStackMaps::Iterator::SpillSlotBitCount() const {
-  EnsureFullyLoadedEntry();
-  return current_spill_slot_bit_count_;
-}
-
-bool CompressedStackMaps::Iterator::IsObject(intptr_t bit_index) const {
-  EnsureFullyLoadedEntry();
-  ASSERT(bit_index >= 0 && bit_index < Length());
-  const intptr_t byte_index = bit_index >> kBitsPerByteLog2;
-  const intptr_t bit_remainder = bit_index & (kBitsPerByte - 1);
-  uint8_t byte_mask = 1U << bit_remainder;
-  const intptr_t byte_offset = current_bits_offset_ + byte_index;
-  NoSafepointScope scope;
-  return (bits_container_.untag()->data()[byte_offset] & byte_mask) != 0;
-}
-
-void CompressedStackMaps::Iterator::LazyLoadGlobalTableEntry() const {
-  ASSERT(maps_.UsesGlobalTable());
-  ASSERT(HasLoadedEntry());
-  ASSERT(current_global_table_offset_ < bits_container_.payload_size());
-
-  NoSafepointScope scope;
-  ReadStream stream(bits_container_.untag()->data(),
-                    bits_container_.payload_size(),
-                    current_global_table_offset_);
-
-  current_spill_slot_bit_count_ = stream.ReadLEB128();
-  ASSERT(current_spill_slot_bit_count_ >= 0);
-
-  current_non_spill_slot_bit_count_ = stream.ReadLEB128();
-  ASSERT(current_non_spill_slot_bit_count_ >= 0);
-
-  const auto stackmap_bits = Length();
-  const uintptr_t stackmap_size =
-      Utils::RoundUp(stackmap_bits, kBitsPerByte) >> kBitsPerByteLog2;
-  ASSERT(stackmap_size <= (bits_container_.payload_size() - stream.Position()));
-
-  current_bits_offset_ = stream.Position();
-}
-
-void CompressedStackMaps::Iterator::WriteToBuffer(BaseTextBuffer* buffer,
-                                                  const char* separator) const {
-  CompressedStackMaps::Iterator it(*this);
-  // If we haven't loaded an entry yet, do so (but don't skip the current
-  // one if we have!)
-  if (!it.HasLoadedEntry()) {
-    if (!it.MoveNext()) return;
-  }
+void CompressedStackMaps::WriteToBuffer(BaseTextBuffer* buffer,
+                                        const char* separator) const {
+  auto it = iterator(Thread::Current());
   bool first_entry = true;
-  do {
+  while (it.MoveNext()) {
     if (!first_entry) {
       buffer->AddString(separator);
     }
@@ -15104,7 +15036,16 @@
       buffer->AddString(it.IsObject(i) ? "1" : "0");
     }
     first_entry = false;
-  } while (it.MoveNext());
+  }
+}
+
+CompressedStackMaps::Iterator<CompressedStackMaps>
+CompressedStackMaps::iterator(Thread* thread) const {
+  return Iterator<CompressedStackMaps>(
+      *this, CompressedStackMaps::Handle(
+                 thread->zone(), thread->isolate_group()
+                                     ->object_store()
+                                     ->canonicalized_stack_map_entries()));
 }
 
 CompressedStackMapsPtr CompressedStackMaps::New(const void* payload,
@@ -15134,12 +15075,13 @@
     NoSafepointScope no_safepoint;
     result ^= raw;
     result.StoreNonPointer(
-        &result.untag()->flags_and_size_,
+        &result.untag()->payload()->flags_and_size,
         UntaggedCompressedStackMaps::GlobalTableBit::encode(is_global_table) |
             UntaggedCompressedStackMaps::UsesTableBit::encode(
                 uses_global_table) |
             UntaggedCompressedStackMaps::SizeField::encode(size));
-    auto cursor = result.UnsafeMutableNonPointer(result.untag()->data());
+    auto cursor =
+        result.UnsafeMutableNonPointer(result.untag()->payload()->data());
     memcpy(cursor, payload, size);  // NOLINT
   }
 
@@ -15154,10 +15096,9 @@
     return "CompressedStackMaps()";
   }
   auto const t = Thread::Current();
-  CompressedStackMaps::Iterator it(t, *this);
   ZoneTextBuffer buffer(t->zone(), 100);
   buffer.AddString("CompressedStackMaps(");
-  it.WriteToBuffer(&buffer, ", ");
+  WriteToBuffer(&buffer, ", ");
   buffer.AddString(")");
   return buffer.buffer();
 }
@@ -15527,7 +15468,6 @@
   result ^= Object::Allocate(
       MonomorphicSmiableCall::kClassId, MonomorphicSmiableCall::InstanceSize(),
       Heap::kOld, MonomorphicSmiableCall::ContainsCompressedPointers());
-  result.untag()->set_target(target.ptr());
   result.StoreNonPointer(&result.untag()->expected_cid_, expected_cid);
   result.StoreNonPointer(&result.untag()->entrypoint_, target.EntryPoint());
   return result.ptr();
@@ -16902,7 +16842,7 @@
 
 ObjectPoolPtr Code::GetObjectPool() const {
 #if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     return IsolateGroup::Current()->object_store()->global_object_pool();
   }
 #endif
@@ -18979,8 +18919,45 @@
   return DartLibraryCalls::HashCode(*this);
 }
 
-ObjectPtr Instance::IdentityHashCode() const {
-  return DartLibraryCalls::IdentityHashCode(*this);
+// Keep in sync with AsmIntrinsifier::Object_getHash.
+IntegerPtr Instance::IdentityHashCode(Thread* thread) const {
+  if (IsInteger()) return Integer::Cast(*this).ptr();
+
+#if defined(HASH_IN_OBJECT_HEADER)
+  intptr_t hash = Object::GetCachedHash(ptr());
+#else
+  intptr_t hash = thread->heap()->GetHash(ptr());
+#endif
+  if (hash == 0) {
+    if (IsNull()) {
+      hash = kNullIdentityHash;
+    } else if (IsBool()) {
+      hash = Bool::Cast(*this).value() ? kTrueIdentityHash : kFalseIdentityHash;
+    } else if (IsDouble()) {
+      double val = Double::Cast(*this).value();
+      if ((val >= kMinInt64RepresentableAsDouble) &&
+          (val <= kMaxInt64RepresentableAsDouble)) {
+        int64_t ival = static_cast<int64_t>(val);
+        if (static_cast<double>(ival) == val) {
+          return Integer::New(ival);
+        }
+      }
+
+      uint64_t uval = bit_cast<uint64_t>(val);
+      hash = ((uval >> 32) ^ (uval)) & kSmiMax;
+    } else {
+      do {
+        hash = thread->random()->NextUInt32() & 0x3FFFFFFF;
+      } while (hash == 0);
+    }
+
+#if defined(HASH_IN_OBJECT_HEADER)
+    hash = Object::SetCachedHashIfNotSet(ptr(), hash);
+#else
+    hash = thread->heap()->SetHashIfNotSet(ptr(), hash);
+#endif
+  }
+  return Smi::New(hash);
 }
 
 bool Instance::CanonicalizeEquals(const Instance& other) const {
@@ -19042,7 +19019,7 @@
 
 uint32_t Instance::CanonicalizeHash() const {
   if (GetClassId() == kNullCid) {
-    return 2011;  // Matches null_patch.dart.
+    return kNullIdentityHash;
   }
   Thread* thread = Thread::Current();
   uint32_t hash = thread->heap()->GetCanonicalHash(ptr());
@@ -25441,7 +25418,7 @@
     // Implicit instance closures are not unique, so combine function's hash
     // code, delayed type arguments hash code (if generic), and identityHashCode
     // of cached receiver.
-    result = static_cast<uint32_t>(func.ComputeClosureHash());
+    result = static_cast<uint32_t>(func.Hash());
     if (func.IsGeneric()) {
       const TypeArguments& delayed_type_args =
           TypeArguments::Handle(zone, delayed_type_arguments());
@@ -25450,23 +25427,15 @@
     const Context& context = Context::Handle(zone, this->context());
     const Instance& receiver =
         Instance::Handle(zone, Instance::RawCast(context.At(0)));
-    const Object& receiverHash =
-        Object::Handle(zone, receiver.IdentityHashCode());
-    if (receiverHash.IsError()) {
-      Exceptions::PropagateError(Error::Cast(receiverHash));
-      UNREACHABLE();
-    }
-    result = CombineHashes(
-        result, Integer::Cast(receiverHash).AsTruncatedUint32Value());
+    const Integer& receiverHash =
+        Integer::Handle(zone, receiver.IdentityHashCode(thread));
+    result = CombineHashes(result, receiverHash.AsTruncatedUint32Value());
   } else {
     // Explicit closures and implicit static closures are unique,
     // so identityHashCode of closure object is good enough.
-    const Object& identityHash = Object::Handle(zone, this->IdentityHashCode());
-    if (identityHash.IsError()) {
-      Exceptions::PropagateError(Error::Cast(identityHash));
-      UNREACHABLE();
-    }
-    result = Integer::Cast(identityHash).AsTruncatedUint32Value();
+    const Integer& identityHash =
+        Integer::Handle(zone, this->IdentityHashCode(thread));
+    result = identityHash.AsTruncatedUint32Value();
   }
   return FinalizeHash(result, String::kHashBits);
 }
@@ -25510,8 +25479,7 @@
     result.untag()->set_function(function.ptr());
     result.untag()->set_context(context.ptr());
 #if defined(DART_PRECOMPILED_RUNTIME)
-    result.set_entry_point(FLAG_use_bare_instructions ? function.entry_point()
-                                                      : 0);
+    result.set_entry_point(function.entry_point());
 #endif
   }
   return result.ptr();
@@ -25851,6 +25819,15 @@
       // A visible frame ends any gap we might be in.
       in_gap = false;
 
+      // Zero pc_offset can only occur in the frame produced by the async
+      // unwinding and it corresponds to the next future listener in the
+      // chain. This function is not yet called (it will be called when
+      // the future completes) hence pc_offset is set to 0. This frame
+      // is very different from other frames which have pc_offsets
+      // corresponding to call- or yield-sites in the generated code and
+      // should be handled specially.
+      const bool is_future_listener = pc_offset == 0;
+
 #if defined(DART_PRECOMPILED_RUNTIME)
       // When printing non-symbolic frames, we normally print call
       // addresses, not return addresses, by subtracting one from the PC to
@@ -25861,7 +25838,6 @@
       // is invoked with the value of the resolved future. Thus, we must
       // report the return address, as returning a value before the closure
       // payload will cause failures to decode the frame using DWARF info.
-      const bool is_future_listener = pc_offset == 0;
       const uword call_addr = is_future_listener ? pc : pc - 1;
 
       if (FLAG_dwarf_stack_traces_mode) {
@@ -25887,7 +25863,11 @@
       }
 #endif
 
-      if (code.is_optimized() && stack_trace.expand_inlined()) {
+      if (code.is_optimized() && stack_trace.expand_inlined() &&
+          (FLAG_precompiled_mode || !is_future_listener)) {
+        // Note: In AOT mode EmitFunctionEntrySourcePositionDescriptorIfNeeded
+        // will take care of emitting a descriptor that would allow us to
+        // symbolize stack frame with 0 offset.
         code.GetInlinedFunctionsAtReturnAddress(pc_offset, &inlined_functions,
                                                 &inlined_token_positions);
         ASSERT(inlined_functions.length() >= 1);
@@ -25901,7 +25881,8 @@
         continue;
       }
 
-      auto const pos = code.GetTokenIndexOfPC(pc);
+      auto const pos = is_future_listener ? function.token_pos()
+                                          : code.GetTokenIndexOfPC(pc);
       PrintSymbolicStackFrame(zone, &buffer, function, pos, frame_index);
       frame_index++;
     }
@@ -26203,6 +26184,7 @@
     result ^= raw;
   }
   result.set_label(label);
+  result.set_streamable(UserTags::IsTagNameStreamable(label.ToCString()));
   AddTagToIsolate(thread, result);
   return result.ptr();
 }
@@ -26224,10 +26206,13 @@
   return result.ptr();
 }
 
-UserTagPtr UserTag::FindTagInIsolate(Thread* thread, const String& label) {
-  Isolate* isolate = thread->isolate();
+UserTagPtr UserTag::FindTagInIsolate(Isolate* isolate,
+                                     Thread* thread,
+                                     const String& label) {
   Zone* zone = thread->zone();
-  ASSERT(isolate->tag_table() != GrowableObjectArray::null());
+  if (isolate->tag_table() == GrowableObjectArray::null()) {
+    return UserTag::null();
+  }
   const GrowableObjectArray& tag_table =
       GrowableObjectArray::Handle(zone, isolate->tag_table());
   UserTag& other = UserTag::Handle(zone);
@@ -26244,6 +26229,11 @@
   return UserTag::null();
 }
 
+UserTagPtr UserTag::FindTagInIsolate(Thread* thread, const String& label) {
+  Isolate* isolate = thread->isolate();
+  return FindTagInIsolate(isolate, thread, label);
+}
+
 void UserTag::AddTagToIsolate(Thread* thread, const UserTag& tag) {
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index df0932e..67a9e89 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2014,7 +2014,6 @@
 
 class MonomorphicSmiableCall : public Object {
  public:
-  CodePtr target() const { return untag()->target(); }
   classid_t expected_cid() const { return untag()->expected_cid_; }
 
   static intptr_t InstanceSize() {
@@ -2028,10 +2027,6 @@
     return OFFSET_OF(UntaggedMonomorphicSmiableCall, expected_cid_);
   }
 
-  static intptr_t target_offset() {
-    return OFFSET_OF(UntaggedMonomorphicSmiableCall, target_);
-  }
-
   static intptr_t entrypoint_offset() {
     return OFFSET_OF(UntaggedMonomorphicSmiableCall, entrypoint_);
   }
@@ -2709,6 +2704,8 @@
                                 intptr_t num_free_fun_type_params = kAllFree,
                                 TrailPtr trail = nullptr) const;
 
+  bool IsPrivate() const;
+
   ClassPtr Owner() const;
   void set_owner(const Object& value) const;
   ClassPtr origin() const;
@@ -2950,8 +2947,6 @@
   // invalid (e.g., mismatched argument shapes after a reload).
   FunctionPtr ImplicitClosureTarget(Zone* zone) const;
 
-  intptr_t ComputeClosureHash() const;
-
   FunctionPtr ForwardingTarget() const;
   void SetForwardingTarget(const Function& target) const;
 
@@ -3180,8 +3175,8 @@
   // run.
   bool ForceOptimize() const {
     return IsFfiFromAddress() || IsFfiGetAddress() || IsFfiLoad() ||
-           IsFfiStore() || IsFfiTrampoline() || IsTypedDataViewFactory() ||
-           IsUtf8Scan() || IsGetNativeField();
+           IsFfiStore() || IsFfiTrampoline() || IsFfiAsExternalTypedData() ||
+           IsTypedDataViewFactory() || IsUtf8Scan() || IsGetNativeField();
   }
 
   bool CanBeInlined() const;
@@ -3513,6 +3508,12 @@
     return kind == MethodRecognizer::kFfiGetAddress;
   }
 
+  bool IsFfiAsExternalTypedData() const {
+    const auto kind = recognized_kind();
+    return MethodRecognizer::kFfiAsExternalTypedDataInt8 <= kind &&
+           kind <= MethodRecognizer::kFfiAsExternalTypedDataDouble;
+  }
+
   bool IsGetNativeField() const {
     const auto kind = recognized_kind();
     return kind == MethodRecognizer::kGetNativeField;
@@ -3700,6 +3701,9 @@
   //   element 2 * i + 1 is coverage hit (zero meaning code was not hit)
   ArrayPtr GetCoverageArray() const;
 
+  // Outputs this function's service ID to the provided JSON object.
+  void AddFunctionServiceId(const JSONObject& obj) const;
+
   // Sets deopt reason in all ICData-s with given deopt_id.
   void SetDeoptReasonForAll(intptr_t deopt_id, ICData::DeoptReasonId reason);
 
@@ -3794,7 +3798,8 @@
   V(PolymorphicTarget, is_polymorphic_target)                                  \
   V(HasPragma, has_pragma)                                                     \
   V(IsSynthetic, is_synthetic)                                                 \
-  V(IsExtensionMember, is_extension_member)
+  V(IsExtensionMember, is_extension_member)                                    \
+  V(IsRedirectingFactory, is_redirecting_factory)
 // Bit that is updated after function is constructed, has to be updated in
 // concurrent-safe manner.
 #define FOR_EACH_FUNCTION_VOLATILE_KIND_BIT(V) V(Inlinable, is_inlinable)
@@ -5445,7 +5450,8 @@
   // _not_ at the start of the payload.
   static const intptr_t kBarePayloadAlignment = 4;
 
-  // In non-bare mode, we align the payloads on word boundaries.
+  // When instructions reside in the heap we align the payloads on word
+  // boundaries.
   static const intptr_t kNonBarePayloadAlignment = kWordSize;
 
   // In the precompiled runtime when running in bare instructions mode,
@@ -5454,9 +5460,7 @@
 
   static intptr_t HeaderSize() {
 #if defined(DART_PRECOMPILED_RUNTIME)
-    if (FLAG_use_bare_instructions) {
-      UNREACHABLE();
-    }
+    UNREACHABLE();
 #endif
     return Utils::RoundUp(sizeof(UntaggedInstructions),
                           kNonBarePayloadAlignment);
@@ -5470,18 +5474,14 @@
 
   static intptr_t InstanceSize(intptr_t size) {
 #if defined(DART_PRECOMPILED_RUNTIME)
-    if (FLAG_use_bare_instructions) {
-      UNREACHABLE();
-    }
+    UNREACHABLE();
 #endif
     return RoundedAllocationSize(HeaderSize() + size);
   }
 
   static InstructionsPtr FromPayloadStart(uword payload_start) {
 #if defined(DART_PRECOMPILED_RUNTIME)
-    if (FLAG_use_bare_instructions) {
-      UNREACHABLE();
-    }
+    UNREACHABLE();
 #endif
     return static_cast<InstructionsPtr>(payload_start - HeaderSize() +
                                         kHeapObjectTag);
@@ -5492,9 +5492,19 @@
   }
 
   static bool Equals(InstructionsPtr a, InstructionsPtr b) {
-    if (Size(a) != Size(b)) return false;
+    // This method should only be called on non-null Instructions objects.
+    ASSERT_EQUAL(a->GetClassId(), kInstructionsCid);
+    ASSERT_EQUAL(b->GetClassId(), kInstructionsCid);
+    // Don't include the object header tags wholesale in the comparison,
+    // because the GC tags may differ in JIT mode. In fact, we can skip checking
+    // the object header entirely, as we're guaranteed that the cids match,
+    // because there are no subclasses for the Instructions class, and the sizes
+    // should match if the content size encoded in size_and_flags_ matches.
+    if (a->untag()->size_and_flags_ != b->untag()->size_and_flags_) {
+      return false;
+    }
     NoSafepointScope no_safepoint;
-    return memcmp(a->untag(), b->untag(), InstanceSize(Size(a))) == 0;
+    return memcmp(a->untag()->data(), b->untag()->data(), Size(a)) == 0;
   }
 
   uint32_t Hash() const {
@@ -5580,58 +5590,29 @@
 // Used in AOT in bare instructions mode.
 class InstructionsTable : public Object {
  public:
-  static const intptr_t kBytesPerElement = sizeof(uint32_t);
-  static const intptr_t kMaxElements = kIntptrMax / kBytesPerElement;
-
-  static const uint32_t kHasMonomorphicEntrypointFlag = 0x1;
-  static const uint32_t kPayloadAlignment = Instructions::kBarePayloadAlignment;
-  static const uint32_t kPayloadMask = ~(kPayloadAlignment - 1);
-  COMPILE_ASSERT((kPayloadMask & kHasMonomorphicEntrypointFlag) == 0);
-
-  struct ArrayTraits {
-    static intptr_t elements_start_offset() {
-      return sizeof(UntaggedInstructionsTable);
-    }
-    static constexpr intptr_t kElementSize = kBytesPerElement;
-  };
-
-  static intptr_t InstanceSize() {
-    ASSERT_EQUAL(sizeof(UntaggedInstructionsTable),
-                 OFFSET_OF_RETURNED_VALUE(UntaggedInstructionsTable, data));
-    return 0;
-  }
-  static intptr_t InstanceSize(intptr_t len) {
-    ASSERT(0 <= len && len <= kMaxElements);
-    return RoundedAllocationSize(sizeof(UntaggedInstructionsTable) +
-                                 len * kBytesPerElement);
-  }
+  static intptr_t InstanceSize() { return sizeof(UntaggedInstructionsTable); }
 
   static InstructionsTablePtr New(intptr_t length,
                                   uword start_pc,
-                                  uword end_pc);
+                                  uword end_pc,
+                                  uword rodata);
 
-  void SetEntryAt(intptr_t index,
-                  uword payload_start,
-                  bool has_monomorphic_entrypoint,
-                  ObjectPtr descriptor) const;
+  void SetCodeAt(intptr_t index, CodePtr code) const;
 
   bool ContainsPc(uword pc) const { return ContainsPc(ptr(), pc); }
   static bool ContainsPc(InstructionsTablePtr table, uword pc);
 
-  // Looks for the entry in the [table] by the given [pc].
-  // Returns index of an entry which contains [pc], or -1 if not found.
-  static intptr_t FindEntry(InstructionsTablePtr table, uword pc);
+  static CodePtr FindCode(InstructionsTablePtr table, uword pc);
 
-  intptr_t length() const { return InstructionsTable::length(this->ptr()); }
-  static intptr_t length(InstructionsTablePtr table) {
-    return table->untag()->length_;
-  }
+  static const UntaggedCompressedStackMaps::Payload*
+  FindStackMap(InstructionsTablePtr table, uword pc, uword* start_pc);
 
-  // Returns descriptor object for the entry with given index.
-  ObjectPtr DescriptorAt(intptr_t index) const {
-    return InstructionsTable::DescriptorAt(this->ptr(), index);
+  static const UntaggedCompressedStackMaps::Payload* GetCanonicalStackMap(
+      InstructionsTablePtr table);
+
+  const UntaggedInstructionsTable::Data* rodata() const {
+    return ptr()->untag()->rodata_;
   }
-  static ObjectPtr DescriptorAt(InstructionsTablePtr table, intptr_t index);
 
   // Returns start address of the instructions entry with given index.
   uword PayloadStartAt(intptr_t index) const {
@@ -5653,34 +5634,26 @@
     return table->untag()->end_pc_;
   }
 
-  ArrayPtr descriptors() const { return untag()->descriptors_; }
-
-  static uint32_t DataAt(InstructionsTablePtr table, intptr_t index) {
-    ASSERT((0 <= index) && (index < InstructionsTable::length(table)));
-    return table->untag()->data()[index];
-  }
-  uint32_t PcOffsetAt(intptr_t index) const {
-    return InstructionsTable::PcOffsetAt(this->ptr(), index);
-  }
-  static uint32_t PcOffsetAt(InstructionsTablePtr table, intptr_t index) {
-    return DataAt(table, index) & kPayloadMask;
-  }
-  bool HasMonomorphicEntryPointAt(intptr_t index) const {
-    return (DataAt(this->ptr(), index) & kHasMonomorphicEntrypointFlag) != 0;
-  }
+  ArrayPtr code_objects() const { return untag()->code_objects_; }
 
   void set_length(intptr_t value) const;
   void set_start_pc(uword value) const;
   void set_end_pc(uword value) const;
-  void set_descriptors(const Array& value) const;
+  void set_code_objects(const Array& value) const;
+  void set_rodata(uword rodata) const;
 
   uint32_t ConvertPcToOffset(uword pc) const {
     return InstructionsTable::ConvertPcToOffset(this->ptr(), pc);
   }
   static uint32_t ConvertPcToOffset(InstructionsTablePtr table, uword pc);
 
+  static intptr_t FindEntry(InstructionsTablePtr table,
+                            uword pc,
+                            intptr_t start_index = 0);
+
   FINAL_HEAP_OBJECT_IMPLEMENTATION(InstructionsTable, Object);
   friend class Class;
+  friend class Deserializer;
 };
 
 class LocalVarDescriptors : public Object {
@@ -5910,13 +5883,16 @@
   uintptr_t payload_size() const { return PayloadSizeOf(ptr()); }
   static uintptr_t PayloadSizeOf(const CompressedStackMapsPtr raw) {
     return UntaggedCompressedStackMaps::SizeField::decode(
-        raw->untag()->flags_and_size_);
+        raw->untag()->payload()->flags_and_size);
   }
 
+  const uint8_t* data() const { return ptr()->untag()->payload()->data(); }
+
   // Methods to allow use with PointerKeyValueTrait to create sets of CSMs.
   bool Equals(const CompressedStackMaps& other) const {
     // All of the table flags and payload size must match.
-    if (untag()->flags_and_size_ != other.untag()->flags_and_size_) {
+    if (untag()->payload()->flags_and_size !=
+        other.untag()->payload()->flags_and_size) {
       return false;
     }
     NoSafepointScope no_safepoint;
@@ -5924,7 +5900,10 @@
   }
   uword Hash() const;
 
-  static intptr_t HeaderSize() { return sizeof(UntaggedCompressedStackMaps); }
+  static intptr_t HeaderSize() {
+    return sizeof(UntaggedCompressedStackMaps) +
+           sizeof(UntaggedCompressedStackMaps::Payload);
+  }
   static intptr_t UnroundedSize(CompressedStackMapsPtr maps) {
     return UnroundedSize(CompressedStackMaps::PayloadSizeOf(maps));
   }
@@ -5932,8 +5911,6 @@
     return HeaderSize() + length;
   }
   static intptr_t InstanceSize() {
-    ASSERT_EQUAL(sizeof(UntaggedCompressedStackMaps),
-                 OFFSET_OF_RETURNED_VALUE(UntaggedCompressedStackMaps, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t length) {
@@ -5943,13 +5920,13 @@
   bool UsesGlobalTable() const { return UsesGlobalTable(ptr()); }
   static bool UsesGlobalTable(const CompressedStackMapsPtr raw) {
     return UntaggedCompressedStackMaps::UsesTableBit::decode(
-        raw->untag()->flags_and_size_);
+        raw->untag()->payload()->flags_and_size);
   }
 
   bool IsGlobalTable() const { return IsGlobalTable(ptr()); }
   static bool IsGlobalTable(const CompressedStackMapsPtr raw) {
     return UntaggedCompressedStackMaps::GlobalTableBit::decode(
-        raw->untag()->flags_and_size_);
+        raw->untag()->payload()->flags_and_size);
   }
 
   static CompressedStackMapsPtr NewInlined(const void* payload, intptr_t size) {
@@ -5968,17 +5945,128 @@
                /*uses_global_table=*/false);
   }
 
+  class RawPayloadHandle {
+   public:
+    RawPayloadHandle() {}
+    RawPayloadHandle(const RawPayloadHandle&) = default;
+    RawPayloadHandle& operator=(const RawPayloadHandle&) = default;
+
+    const UntaggedCompressedStackMaps::Payload* payload() const {
+      return payload_;
+    }
+    bool IsNull() const { return payload_ == nullptr; }
+
+    RawPayloadHandle& operator=(
+        const UntaggedCompressedStackMaps::Payload* payload) {
+      payload_ = payload;
+      return *this;
+    }
+
+    RawPayloadHandle& operator=(const CompressedStackMaps& maps) {
+      ASSERT(!maps.IsNull());
+      payload_ = maps.untag()->payload();
+      return *this;
+    }
+
+    RawPayloadHandle& operator=(CompressedStackMapsPtr maps) {
+      ASSERT(maps != CompressedStackMaps::null());
+      payload_ = maps.untag()->payload();
+      return *this;
+    }
+
+    uintptr_t payload_size() const {
+      return UntaggedCompressedStackMaps::SizeField::decode(
+          payload()->flags_and_size);
+    }
+    const uint8_t* data() const { return payload()->data(); }
+
+    bool UsesGlobalTable() const {
+      return UntaggedCompressedStackMaps::UsesTableBit::decode(
+          payload()->flags_and_size);
+    }
+
+    bool IsGlobalTable() const {
+      return UntaggedCompressedStackMaps::GlobalTableBit::decode(
+          payload()->flags_and_size);
+    }
+
+   private:
+    const UntaggedCompressedStackMaps::Payload* payload_ = nullptr;
+  };
+
+  template <typename PayloadHandle>
   class Iterator {
    public:
-    Iterator(const CompressedStackMaps& maps,
-             const CompressedStackMaps& global_table);
-    Iterator(Thread* thread, const CompressedStackMaps& maps);
+    Iterator(const PayloadHandle& maps, const PayloadHandle& global_table)
+        : maps_(maps),
+          bits_container_(maps.UsesGlobalTable() ? global_table : maps) {
+      ASSERT(!maps_.IsNull());
+      ASSERT(!bits_container_.IsNull());
+      ASSERT(!maps_.IsGlobalTable());
+      ASSERT(!maps_.UsesGlobalTable() || bits_container_.IsGlobalTable());
+    }
 
-    explicit Iterator(const CompressedStackMaps::Iterator& it);
+    Iterator(const Iterator& it)
+        : maps_(it.maps_),
+          bits_container_(it.bits_container_),
+          next_offset_(it.next_offset_),
+          current_pc_offset_(it.current_pc_offset_),
+          current_global_table_offset_(it.current_global_table_offset_),
+          current_spill_slot_bit_count_(it.current_spill_slot_bit_count_),
+          current_non_spill_slot_bit_count_(it.current_spill_slot_bit_count_),
+          current_bits_offset_(it.current_bits_offset_) {}
 
     // Loads the next entry from [maps_], if any. If [maps_] is the null value,
     // this always returns false.
-    bool MoveNext();
+    bool MoveNext() {
+      if (next_offset_ >= maps_.payload_size()) {
+        return false;
+      }
+
+      NoSafepointScope scope;
+      ReadStream stream(maps_.data(), maps_.payload_size(), next_offset_);
+
+      auto const pc_delta = stream.ReadLEB128();
+      ASSERT(pc_delta <= (kMaxUint32 - current_pc_offset_));
+      current_pc_offset_ += pc_delta;
+
+      // Table-using CSMs have a table offset after the PC offset delta, whereas
+      // the post-delta part of inlined entries has the same information as
+      // global table entries.
+      // See comments in UntaggedCompressedStackMaps for description of
+      // encoding.
+      if (maps_.UsesGlobalTable()) {
+        current_global_table_offset_ = stream.ReadLEB128();
+        ASSERT(current_global_table_offset_ < bits_container_.payload_size());
+
+        // Since generally we only use entries in the GC and the GC only needs
+        // the rest of the entry information if the PC offset matches, we lazily
+        // load and cache the information stored in the global object when it is
+        // actually requested.
+        current_spill_slot_bit_count_ = -1;
+        current_non_spill_slot_bit_count_ = -1;
+        current_bits_offset_ = -1;
+
+        next_offset_ = stream.Position();
+      } else {
+        current_spill_slot_bit_count_ = stream.ReadLEB128();
+        ASSERT(current_spill_slot_bit_count_ >= 0);
+
+        current_non_spill_slot_bit_count_ = stream.ReadLEB128();
+        ASSERT(current_non_spill_slot_bit_count_ >= 0);
+
+        const auto stackmap_bits =
+            current_spill_slot_bit_count_ + current_non_spill_slot_bit_count_;
+        const uintptr_t stackmap_size =
+            Utils::RoundUp(stackmap_bits, kBitsPerByte) >> kBitsPerByteLog2;
+        ASSERT(stackmap_size <= (maps_.payload_size() - stream.Position()));
+
+        current_bits_offset_ = stream.Position();
+        next_offset_ = current_bits_offset_ + stackmap_size;
+      }
+
+      return true;
+    }
 
     // Finds the entry with the given PC offset starting at the current position
     // of the iterator. If [maps_] is the null value, this always returns false.
@@ -6002,21 +6090,56 @@
     }
 
     // Returns the bit length of the loaded entry.
-    intptr_t Length() const;
+    intptr_t Length() const {
+      EnsureFullyLoadedEntry();
+      return current_spill_slot_bit_count_ + current_non_spill_slot_bit_count_;
+    }
     // Returns the number of spill slot bits of the loaded entry.
-    intptr_t SpillSlotBitCount() const;
+    intptr_t SpillSlotBitCount() const {
+      EnsureFullyLoadedEntry();
+      return current_spill_slot_bit_count_;
+    }
     // Returns whether the stack entry represented by the offset contains
-    // a tagged objecet.
-    bool IsObject(intptr_t bit_offset) const;
-
-    void WriteToBuffer(BaseTextBuffer* buffer, const char* separator) const;
+    // a tagged object.
+    bool IsObject(intptr_t bit_index) const {
+      EnsureFullyLoadedEntry();
+      ASSERT(bit_index >= 0 && bit_index < Length());
+      const intptr_t byte_index = bit_index >> kBitsPerByteLog2;
+      const intptr_t bit_remainder = bit_index & (kBitsPerByte - 1);
+      uint8_t byte_mask = 1U << bit_remainder;
+      const intptr_t byte_offset = current_bits_offset_ + byte_index;
+      NoSafepointScope scope;
+      return (bits_container_.data()[byte_offset] & byte_mask) != 0;
+    }
 
    private:
     bool HasLoadedEntry() const { return next_offset_ > 0; }
 
     // Caches the corresponding values from the global table in the mutable
     // fields. We lazily load these as some clients only need the PC offset.
-    void LazyLoadGlobalTableEntry() const;
+    void LazyLoadGlobalTableEntry() const {
+      ASSERT(maps_.UsesGlobalTable());
+      ASSERT(HasLoadedEntry());
+      ASSERT(current_global_table_offset_ < bits_container_.payload_size());
+
+      NoSafepointScope scope;
+      ReadStream stream(bits_container_.data(), bits_container_.payload_size(),
+                        current_global_table_offset_);
+
+      current_spill_slot_bit_count_ = stream.ReadLEB128();
+      ASSERT(current_spill_slot_bit_count_ >= 0);
+
+      current_non_spill_slot_bit_count_ = stream.ReadLEB128();
+      ASSERT(current_non_spill_slot_bit_count_ >= 0);
+
+      const auto stackmap_bits = Length();
+      const uintptr_t stackmap_size =
+          Utils::RoundUp(stackmap_bits, kBitsPerByte) >> kBitsPerByteLog2;
+      ASSERT(stackmap_size <=
+             (bits_container_.payload_size() - stream.Position()));
+
+      current_bits_offset_ = stream.Position();
+    }
 
     void EnsureFullyLoadedEntry() const {
       ASSERT(HasLoadedEntry());
@@ -6026,8 +6149,8 @@
       }
     }
 
-    const CompressedStackMaps& maps_;
-    const CompressedStackMaps& bits_container_;
+    const PayloadHandle& maps_;
+    const PayloadHandle& bits_container_;
 
     uintptr_t next_offset_ = 0;
     uint32_t current_pc_offset_ = 0;
@@ -6043,6 +6166,10 @@
     friend class StackMapEntry;
   };
 
+  Iterator<CompressedStackMaps> iterator(Thread* thread) const;
+
+  void WriteToBuffer(BaseTextBuffer* buffer, const char* separator) const;
+
  private:
   static CompressedStackMapsPtr New(const void* payload,
                                     intptr_t size,
@@ -6276,6 +6403,10 @@
 #endif
   }
 
+  static uword UncheckedEntryPointOf(const CodePtr code) {
+    return code->untag()->unchecked_entry_point_;
+  }
+
   // Returns the unchecked entry point of [instructions()].
   uword UncheckedEntryPoint() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -7505,7 +7636,7 @@
   virtual ObjectPtr HashCode() const;
 
   // Equivalent to invoking identityHashCode with this instance.
-  ObjectPtr IdentityHashCode() const;
+  IntegerPtr IdentityHashCode(Thread* thread) const;
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(UntaggedInstance));
@@ -9752,6 +9883,7 @@
   friend class Symbols;
   friend class Utf8;
   friend class OneByteStringMessageSerializationCluster;
+  friend class Deserializer;
 };
 
 class TwoByteString : public AllStatic {
@@ -10053,6 +10185,11 @@
   friend class Symbols;
 };
 
+// Matches null_patch.dart / bool_patch.dart.
+static constexpr intptr_t kNullIdentityHash = 2011;
+static constexpr intptr_t kTrueIdentityHash = 1231;
+static constexpr intptr_t kFalseIdentityHash = 1237;
+
 // Class Bool implements Dart core class bool.
 class Bool : public Instance {
  public:
@@ -10071,7 +10208,7 @@
   }
 
   virtual uint32_t CanonicalizeHash() const {
-    return ptr() == True().ptr() ? 1231 : 1237;
+    return ptr() == True().ptr() ? kTrueIdentityHash : kFalseIdentityHash;
   }
 
  private:
@@ -11893,6 +12030,12 @@
     ASSERT(t < UserTags::kUserTagIdOffset + UserTags::kMaxUserTags);
     StoreNonPointer(&untag()->tag_, t);
   }
+
+  bool streamable() const { return untag()->streamable(); }
+  void set_streamable(bool streamable) {
+    StoreNonPointer(&untag()->streamable_, streamable);
+  }
+
   static intptr_t tag_offset() { return OFFSET_OF(UntaggedUserTag, tag_); }
 
   StringPtr label() const { return untag()->label(); }
@@ -11908,6 +12051,9 @@
 
   static bool TagTableIsFull(Thread* thread);
   static UserTagPtr FindTagById(uword tag_id);
+  static UserTagPtr FindTagInIsolate(Isolate* isolate,
+                                     Thread* thread,
+                                     const String& label);
 
  private:
   static UserTagPtr FindTagInIsolate(Thread* thread, const String& label);
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index f7fe7fe..d24df33 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -248,22 +248,36 @@
   Object::PrintJSONImpl(stream, ref);
 }
 
-static void AddFunctionServiceId(const JSONObject& jsobj,
-                                 const Function& f,
-                                 const Class& cls) {
-  ASSERT(!cls.IsNull());
+void Function::AddFunctionServiceId(const JSONObject& jsobj) const {
+  Class& cls = Class::Handle(Owner());
   // Special kinds of functions use indices in their respective lists.
   intptr_t id = -1;
   const char* selector = NULL;
-  if (f.IsNonImplicitClosureFunction()) {
-    id = ClosureFunctionsCache::FindClosureIndex(f);
+  // Regular functions known to their owner use their name (percent-encoded).
+  String& name = String::Handle(this->name());
+
+  if (IsNonImplicitClosureFunction()) {
+    id = ClosureFunctionsCache::FindClosureIndex(*this);
     selector = "closures";
-  } else if (f.IsImplicitClosureFunction()) {
-    id = cls.FindImplicitClosureFunctionIndex(f);
+  } else if (IsImplicitClosureFunction()) {
+    id = cls.FindImplicitClosureFunctionIndex(*this);
     selector = "implicit_closures";
-  } else if (f.IsNoSuchMethodDispatcher() || f.IsInvokeFieldDispatcher()) {
-    id = cls.FindInvocationDispatcherFunctionIndex(f);
+  } else if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher()) {
+    id = cls.FindInvocationDispatcherFunctionIndex(*this);
     selector = "dispatchers";
+  } else if (IsFieldInitializer()) {
+    name ^= Field::NameFromInit(name);
+    const char* encoded_field_name = String::EncodeIRI(name);
+    if (cls.IsTopLevel()) {
+      const auto& library = Library::Handle(cls.library());
+      const auto& private_key = String::Handle(library.private_key());
+      jsobj.AddFixedServiceId("libraries/%s/field_inits/%s",
+                              private_key.ToCString(), encoded_field_name);
+    } else {
+      jsobj.AddFixedServiceId("classes/%" Pd "/field_inits/%s", cls.id(),
+                              encoded_field_name);
+    }
+    return;
   }
   if (id != -1) {
     ASSERT(selector != NULL);
@@ -278,10 +292,8 @@
     }
     return;
   }
-  // Regular functions known to their owner use their name (percent-encoded).
-  String& name = String::Handle(f.name());
   Thread* thread = Thread::Current();
-  if (Resolver::ResolveFunction(thread->zone(), cls, name) == f.ptr()) {
+  if (Resolver::ResolveFunction(thread->zone(), cls, name) == ptr()) {
     const char* encoded_name = String::EncodeIRI(name);
     if (cls.IsTopLevel()) {
       const auto& library = Library::Handle(cls.library());
@@ -297,7 +309,7 @@
   // Oddball functions (not known to their owner) fall back to use the object
   // id ring. Current known examples are signature functions of closures
   // and stubs like 'megamorphic_call_miss'.
-  jsobj.AddServiceId(f);
+  jsobj.AddServiceId(*this);
 }
 
 void Function::PrintJSONImpl(JSONStream* stream, bool ref) const {
@@ -308,7 +320,7 @@
   ASSERT(err.IsNull());
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Function", ref);
-  AddFunctionServiceId(jsobj, *this, cls);
+  AddFunctionServiceId(jsobj);
   const char* user_name = UserVisibleNameCString();
   const String& vm_name = String::Handle(name());
   AddNameProperties(&jsobj, user_name, vm_name.ToCString());
@@ -825,7 +837,6 @@
   if (ref) {
     return;
   }
-  jsobj.AddProperty("_target", Code::Handle(target()));
 }
 
 void CallSiteData::PrintJSONImpl(JSONStream* stream, bool ref) const {
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 33bede3..9fc1c99 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -103,8 +103,8 @@
                               EMIT_FIELD_INIT,
                               EMIT_FIELD_INIT)
 #undef EMIT_FIELD_INIT
-          unused_field_(0)  // Just to prevent a trailing comma.
-{
+      // Just to prevent a trailing comma.
+      unused_field_(0) {
   for (ObjectPtr* current = from(); current <= to(); current++) {
     *current = Object::null();
   }
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 3b308c6..03125b2 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -215,6 +215,8 @@
   RW(Code, assert_boolean_stub)                                                \
   RW(Code, instance_of_stub)                                                   \
   RW(Code, init_static_field_stub)                                             \
+  RW(Code, init_late_static_field_stub)                                        \
+  RW(Code, init_late_final_static_field_stub)                                  \
   RW(Code, init_instance_field_stub)                                           \
   RW(Code, init_late_instance_field_stub)                                      \
   RW(Code, init_late_final_instance_field_stub)                                \
@@ -296,6 +298,8 @@
   DO(re_throw_stub, ReThrow)                                                   \
   DO(assert_boolean_stub, AssertBoolean)                                       \
   DO(init_static_field_stub, InitStaticField)                                  \
+  DO(init_late_static_field_stub, InitLateStaticField)                         \
+  DO(init_late_final_static_field_stub, InitLateFinalStaticField)              \
   DO(init_instance_field_stub, InitInstanceField)                              \
   DO(init_late_instance_field_stub, InitLateInstanceField)                     \
   DO(init_late_final_instance_field_stub, InitLateFinalInstanceField)          \
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index c8cbcec..b2dce5c 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -4545,13 +4545,14 @@
     ElideJSONSubstring("libraries", buffer, buffer);
     ElideJSONSubstring("_List@", buffer, buffer);
     ElideJSONSubstring("_TypeParameter@", buffer, buffer);
+    StripTokenPositions(buffer);
     EXPECT_SUBSTRING(
         "{\"type\":\"@Instance\",\"_vmType\":\"Array\",\"class\":{\"type\":\"@"
         "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"_List\",\"_vmName\":"
         "\"\",\"location\":{\"type\":\"SourceLocation\",\"script\":{\"type\":"
         "\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core-patch\\/"
-        "array.dart\",\"_kind\":\"kernel\"},\"tokenPos\":248,\"endTokenPos\":"
-        "7917},\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
+        "array.dart\",\"_kind\":\"kernel\"}},"
+        "\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
         "\"name\":\"dart.core\",\"uri\":\"dart:core\"},\"typeParameters\":[{"
         "\"type\":\"@"
         "Instance\",\"_vmType\":\"TypeParameter\",\"class\":{\"type\":\"@"
@@ -4559,8 +4560,8 @@
         "vmName\":\"\",\"location\":{\"type\":"
         "\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
         "\"id\":\"\",\"uri\":\"dart:core-patch\\/"
-        "type_patch.dart\",\"_kind\":\"kernel\"},\"tokenPos\":1749,"
-        "\"endTokenPos\":1894},\"library\":{\"type\":\"@Library\",\"fixedId\":"
+        "type_patch.dart\",\"_kind\":\"kernel\"}},"
+        "\"library\":{\"type\":\"@Library\",\"fixedId\":"
         "true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":\"dart:core\"}},"
         "\"identityHashCode\":",
         buffer);
@@ -4572,8 +4573,8 @@
         "\"Null\",\"location\":{\"type\":\"SourceLocation\",\"script\":{"
         "\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:"
         "core\\/"
-        "null.dart\",\"_kind\":\"kernel\"},\"tokenPos\":925,\"endTokenPos\":"
-        "1165},\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
+        "null.dart\",\"_kind\":\"kernel\"}},"
+        "\"library\":{\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\","
         "\"name\":\"dart.core\",\"uri\":\"dart:core\"}},\"kind\":\"Null\","
         "\"fixedId\":true,\"id\":\"\",\"valueAsString\":\"null\"}}]},"
         "\"identityHashCode\":0,\"kind\":\"List\",\"id\":\"\",\"length\":0}",
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index aab5dec..f1f721b 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -9,6 +9,9 @@
 #include "platform/atomic.h"
 #include "vm/allocation.h"
 #include "vm/code_patcher.h"
+#if !defined(DART_PRECOMPILED_RUNTIME)
+#include "vm/compiler/compiler_state.h"
+#endif
 #include "vm/debugger.h"
 #include "vm/instructions.h"
 #include "vm/isolate.h"
@@ -247,7 +250,6 @@
 ProcessedSampleBuffer* SampleBlockListProcessor::BuildProcessedSampleBuffer(
     SampleFilter* filter,
     ProcessedSampleBuffer* buffer) {
-  ASSERT(filter != NULL);
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -264,7 +266,6 @@
 ProcessedSampleBuffer* SampleBlockBuffer::BuildProcessedSampleBuffer(
     SampleFilter* filter,
     ProcessedSampleBuffer* buffer) {
-  ASSERT(filter != NULL);
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
@@ -1263,6 +1264,11 @@
       StackFrame::DumpCurrentTrace();
     } else if (thread->execution_state() == Thread::kThreadInVM) {
       StackFrame::DumpCurrentTrace();
+#if !defined(DART_PRECOMPILED_RUNTIME)
+      if (thread->HasCompilerState()) {
+        thread->compiler_state().ReportCrash();
+      }
+#endif
     }
   }
 }
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index c82c0f9..52903dc 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -170,7 +170,19 @@
   func->AddProperty("_kind", KindToCString(kind()));
 }
 
-void ProfileFunction::PrintToJSONArray(JSONArray* functions) {
+void ProfileFunction::PrintToJSONArray(JSONArray* functions,
+                                       bool print_only_ids) {
+  if (print_only_ids) {
+    JSONObject obj(functions);
+    if (kind() == kDartFunction) {
+      ASSERT(!function_.IsNull());
+      obj.AddProperty("type", "@Object");
+      function_.AddFunctionServiceId(obj);
+    } else {
+      PrintToJSONObject(&obj);
+    }
+    return;
+  }
   JSONObject obj(functions);
   obj.AddProperty("type", "ProfileFunction");
   obj.AddProperty("kind", KindToCString(kind()));
@@ -943,12 +955,12 @@
     if (!FilterSamples()) {
       return;
     }
-
     Setup();
     BuildCodeTable();
     FinalizeCodeIndexes();
     BuildFunctionTable();
     PopulateFunctionTicks();
+    SanitizeMinMaxTimes();
   }
 
  private:
@@ -1050,7 +1062,6 @@
       TickExitFrame(sample->vm_tag(), sample_index, sample);
       thread_->CheckForSafepoint();
     }
-    SanitizeMinMaxTimes();
   }
 
   void FinalizeCodeIndexes() {
@@ -1728,10 +1739,16 @@
   PrintProfileJSON(&obj, include_code_samples);
 }
 
-void Profile::PrintProfileJSON(JSONObject* obj, bool include_code_samples) {
+void Profile::PrintProfileJSON(JSONObject* obj,
+                               bool include_code_samples,
+                               bool is_event) {
   ScopeTimer sw("Profile::PrintProfileJSON", FLAG_trace_profiler);
   Thread* thread = Thread::Current();
-  obj->AddProperty("type", "CpuSamples");
+  if (is_event) {
+    obj->AddProperty("type", "CpuSamplesEvent");
+  } else {
+    obj->AddProperty("type", "CpuSamples");
+  }
   PrintHeaderJSON(obj);
   if (include_code_samples) {
     JSONArray codes(obj, "_codes");
@@ -1760,7 +1777,7 @@
     for (intptr_t i = 0; i < functions_->length(); i++) {
       ProfileFunction* function = functions_->At(i);
       ASSERT(function != NULL);
-      function->PrintToJSONArray(&functions);
+      function->PrintToJSONArray(&functions, is_event);
       thread->CheckForSafepoint();
     }
   }
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h
index a9df89b..13a29fa 100644
--- a/runtime/vm/profiler_service.h
+++ b/runtime/vm/profiler_service.h
@@ -171,7 +171,7 @@
 
   static const char* KindToCString(Kind kind);
 
-  void PrintToJSONArray(JSONArray* functions);
+  void PrintToJSONArray(JSONArray* functions, bool print_only_ids = false);
 
   // Returns true if the call was successful and |pfsp| is set.
   bool GetSinglePosition(ProfileFunctionSourcePosition* pfsp);
@@ -385,7 +385,9 @@
   ProfileCode* GetCodeFromPC(uword pc, int64_t timestamp);
 
   void PrintProfileJSON(JSONStream* stream, bool include_code_samples);
-  void PrintProfileJSON(JSONObject* obj, bool include_code_samples);
+  void PrintProfileJSON(JSONObject* obj,
+                        bool include_code_samples,
+                        bool is_event = false);
 
   ProfileFunction* FindFunction(const Function& function);
 
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 02a5657..9d57230 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -454,7 +454,8 @@
 
 class StackMapEntry : public ZoneAllocated {
  public:
-  StackMapEntry(Zone* zone, const CompressedStackMaps::Iterator& it)
+  StackMapEntry(Zone* zone,
+                const CompressedStackMaps::Iterator<CompressedStackMaps>& it)
       : maps_(CompressedStackMaps::Handle(zone, it.maps_.ptr())),
         bits_container_(
             CompressedStackMaps::Handle(zone, it.bits_container_.ptr())),
@@ -525,7 +526,7 @@
   }
   const uint8_t* PayloadData() const {
     ASSERT(!Thread::Current()->IsAtSafepoint());
-    return bits_container_.ptr()->untag()->data() + bits_offset_;
+    return bits_container_.ptr()->untag()->payload()->data() + bits_offset_;
   }
 
   const CompressedStackMaps& maps_;
@@ -582,8 +583,8 @@
 
     void VisitCode(const Code& code) {
       compressed_stackmaps_ = code.compressed_stackmaps();
-      CompressedStackMaps::Iterator it(compressed_stackmaps_,
-                                       old_global_table_);
+      CompressedStackMaps::Iterator<CompressedStackMaps> it(
+          compressed_stackmaps_, old_global_table_);
       while (it.MoveNext()) {
         auto const entry = new (zone_) StackMapEntry(zone_, it);
         auto const index = entry_indices_.LookupValue(entry);
@@ -705,7 +706,8 @@
         return Object::empty_compressed_stackmaps().ptr();
       }
       MallocWriteStream new_payload(maps.payload_size());
-      CompressedStackMaps::Iterator it(maps, old_global_table_);
+      CompressedStackMaps::Iterator<CompressedStackMaps> it(maps,
+                                                            old_global_table_);
       intptr_t last_offset = 0;
       while (it.MoveNext()) {
         StackMapEntry entry(zone_, it);
@@ -897,7 +899,7 @@
           pool_(ObjectPool::Handle(zone)) {
       auto& gop = ObjectPool::Handle(
           zone, isolate_group->object_store()->global_object_pool());
-      ASSERT_EQUAL(!gop.IsNull(), FLAG_use_bare_instructions);
+      ASSERT(!gop.IsNull());
       DedupPool(gop);
     }
 
@@ -935,8 +937,7 @@
   // objects and other objects in the snapshots (these references are otherwise
   // implicit and go through global object pool). This information is needed
   // to produce more informative snapshot profile.
-  if (!FLAG_use_bare_instructions ||
-      FLAG_write_v8_snapshot_profile_to != nullptr ||
+  if (FLAG_write_v8_snapshot_profile_to != nullptr ||
       FLAG_trace_precompiler_to != nullptr) {
     WalkProgram(thread->zone(), thread->isolate_group(), &visitor);
   }
@@ -1160,14 +1161,11 @@
 // The instruction deduplication naturally causes us to have a one-to-many
 // relationship between Instructions and Code objects.
 //
-// In AOT bare instructions mode frames only have PCs. However, the runtime
-// needs e.g. stack maps from the [Code] to scan such a frame. So we ensure that
-// instructions of code objects are only deduplicated if the metadata in the
-// code is the same. The runtime can then pick any code object corresponding to
-// the PC in the frame and use the metadata.
-//
-// In AOT non-bare instructions mode frames are expanded, like in JIT, and
-// contain the unique code object.
+// In AOT frames only have PCs. However, the runtime needs e.g. stack maps from
+// the [Code] to scan such a frame. So we ensure that instructions of code
+// objects are only deduplicated if the metadata in the code is the same.
+// The runtime can then pick any code object corresponding to the PC in the
+// frame and use the metadata.
 #if defined(DART_PRECOMPILER)
 class CodeKeyValueTrait {
  public:
@@ -1273,6 +1271,82 @@
           code_(Code::Handle(zone)),
           instructions_(Instructions::Handle(zone)) {}
 
+    // Relink the program graph to eliminate references to the non-canonical
+    // Code objects. We want to arrive to the graph where Code objects
+    // and Instruction objects are in one-to-one relationship.
+    void PostProcess(IsolateGroup* isolate_group) {
+      const intptr_t canonical_count = canonical_objects_.Length();
+
+      auto& static_calls_array = Array::Handle(zone_);
+      auto& static_calls_table_entry = Object::Handle(zone_);
+
+      auto should_canonicalize = [&](const Object& obj) {
+        return CanCanonicalize(Code::Cast(obj)) && !obj.InVMIsolateHeap();
+      };
+
+      auto process_pool = [&](const ObjectPool& pool) {
+        if (pool.IsNull()) {
+          return;
+        }
+
+        auto& object = Object::Handle(zone_);
+        for (intptr_t i = 0; i < pool.Length(); i++) {
+          auto const type = pool.TypeAt(i);
+          if (type != ObjectPool::EntryType::kTaggedObject) continue;
+          object = pool.ObjectAt(i);
+          if (object.IsCode() && should_canonicalize(object)) {
+            object = Canonicalize(Code::Cast(object));
+            pool.SetObjectAt(i, object);
+          }
+        }
+      };
+
+      auto& pool = ObjectPool::Handle(zone_);
+
+      auto it = canonical_objects_.GetIterator();
+      while (auto canonical_code = it.Next()) {
+        static_calls_array = (*canonical_code)->static_calls_target_table();
+        if (!static_calls_array.IsNull()) {
+          StaticCallsTable static_calls(static_calls_array);
+          for (auto& view : static_calls) {
+            static_calls_table_entry =
+                view.Get<Code::kSCallTableCodeOrTypeTarget>();
+            if (static_calls_table_entry.IsCode() &&
+                should_canonicalize(static_calls_table_entry)) {
+              static_calls_table_entry =
+                  Canonicalize(Code::Cast(static_calls_table_entry));
+              view.Set<Code::kSCallTableCodeOrTypeTarget>(
+                  static_calls_table_entry);
+            }
+          }
+        }
+
+        pool = (*canonical_code)->object_pool();
+        process_pool(pool);
+      }
+
+      auto object_store = isolate_group->object_store();
+
+      const auto& dispatch_table_entries =
+          Array::Handle(zone_, object_store->dispatch_table_code_entries());
+      if (!dispatch_table_entries.IsNull()) {
+        auto& code = Code::Handle(zone_);
+        for (intptr_t i = 0; i < dispatch_table_entries.Length(); i++) {
+          code ^= dispatch_table_entries.At(i);
+          if (should_canonicalize(code)) {
+            code ^= Canonicalize(code);
+            dispatch_table_entries.SetAt(i, code);
+          }
+        }
+      }
+
+      // If there's a global object pool, add any visitable objects.
+      pool = object_store->global_object_pool();
+      process_pool(pool);
+
+      RELEASE_ASSERT(canonical_count == canonical_objects_.Length());
+    }
+
     void VisitFunction(const Function& function) {
       if (!function.HasCode()) return;
       code_ = function.CurrentCode();
@@ -1280,12 +1354,13 @@
       // ProgramWalker, but as long as the deduplication process is idempotent,
       // the cached entry points won't change during the second visit.
       VisitCode(code_);
-      function.SetInstructionsSafe(code_);  // Update cached entry point.
+      function.SetInstructionsSafe(canonical_);  // Update cached entry point.
     }
 
     void VisitCode(const Code& code) {
+      canonical_ = code.ptr();
       if (code.IsDisabled()) return;
-      canonical_ = Dedup(code);
+      canonical_ = Canonicalize(code);
       instructions_ = canonical_.instructions();
       code.SetActiveInstructionsSafe(instructions_,
                                      code.UncheckedEntryPointOffset());
@@ -1295,15 +1370,24 @@
    private:
     bool CanCanonicalize(const Code& code) const { return !code.IsDisabled(); }
 
+    CodePtr Canonicalize(const Code& code) {
+      canonical_ = Dedup(code);
+      if (!code.is_discarded() && canonical_.is_discarded()) {
+        canonical_.set_is_discarded(false);
+      }
+      return canonical_.ptr();
+    }
+
     Code& canonical_;
     Code& code_;
     Instructions& instructions_;
   };
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     StackZone stack_zone(thread);
     DedupInstructionsWithSameMetadataVisitor visitor(thread->zone());
     WalkProgram(thread->zone(), thread->isolate_group(), &visitor);
+    visitor.PostProcess(thread->isolate_group());
     return;
   }
 #endif  // defined(DART_PRECOMPILER)
@@ -1329,25 +1413,6 @@
 
   // Reduces binary size but obfuscates profiler results.
   if (FLAG_dedup_instructions) {
-    // In non-bare mode (unused atm) dedupping instructions would cause us to
-    // loose the ability to uniquely map a PC to a given UnlinkedCall object,
-    // since two code objects might point to the same deduped instructions
-    // object but might have two different UnlinkedCall objects in their pool.
-    //
-    // In bare mode this cannot happen because different UnlinkedCall objects
-    // would get different indices into the (global) object pool, therefore
-    // making the instructions different.
-    //
-    // (When transitioning the switchable call site we loose track of the args
-    // descriptor. Since we need it for further transitions we currently save it
-    // via a PC -> UnlinkedCall mapping).
-    //
-    // We therfore disable the instruction deduplication in product-non-bare
-    // mode (which is unused atm).
-#if defined(PRODUCT)
-    if (FLAG_precompiled_mode && !FLAG_use_bare_instructions) return;
-#endif
-
     DedupInstructions(thread);
   }
 }
@@ -1389,10 +1454,6 @@
     MergeAssignment(obj_, id);
     obj_ = code.compressed_stackmaps();
     MergeAssignment(obj_, id);
-    if (!FLAG_use_bare_instructions) {
-      obj_ = code.object_pool();
-      MergeAssignment(obj_, id);
-    }
   }
 
   void MergeAssignment(const Object& obj, intptr_t id) {
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 2deada7..c32aa1e 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -115,13 +115,6 @@
       instance_size = InstructionsSection::InstanceSize(section_size);
       break;
     }
-    case kInstructionsTableCid: {
-      const InstructionsTablePtr raw_instructions_table =
-          static_cast<const InstructionsTablePtr>(this);
-      intptr_t length = raw_instructions_table->untag()->length_;
-      instance_size = InstructionsTable::InstanceSize(length);
-      break;
-    }
     case kContextCid: {
       const ContextPtr raw_context = static_cast<const ContextPtr>(this);
       intptr_t num_variables = raw_context->untag()->num_variables_;
@@ -540,7 +533,7 @@
 COMPRESSED_VISITOR(LibraryPrefix)
 REGULAR_VISITOR(SingleTargetCache)
 REGULAR_VISITOR(UnlinkedCall)
-REGULAR_VISITOR(MonomorphicSmiableCall)
+NULL_VISITOR(MonomorphicSmiableCall)
 REGULAR_VISITOR(ICData)
 REGULAR_VISITOR(MegamorphicCache)
 COMPRESSED_VISITOR(ApiError)
@@ -575,7 +568,7 @@
         Smi::Value(raw_obj->untag()->length()))
 VARIABLE_COMPRESSED_VISITOR(ContextScope, raw_obj->untag()->num_variables_)
 NULL_VISITOR(Sentinel)
-VARIABLE_VISITOR(InstructionsTable, raw_obj->untag()->length_)
+REGULAR_VISITOR(InstructionsTable)
 NULL_VISITOR(Mint)
 NULL_VISITOR(Double)
 NULL_VISITOR(Float32x4)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 986cb2d..b0b62cd 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1864,22 +1864,6 @@
   friend class Image;
 };
 
-class UntaggedInstructionsTable : public UntaggedObject {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(InstructionsTable);
-
-  POINTER_FIELD(ArrayPtr, descriptors)
-  VISIT_FROM(descriptors)
-  VISIT_TO(descriptors)
-
-  intptr_t length_;
-  uword start_pc_;
-  uword end_pc_;
-
-  // Variable length data follows here.
-  uint32_t* data() { OPEN_ARRAY_START(uint32_t, uint32_t); }
-  const uint32_t* data() const { OPEN_ARRAY_START(uint32_t, uint32_t); }
-};
-
 class UntaggedPcDescriptors : public UntaggedObject {
  public:
 // The macro argument V is passed two arguments, the raw name of the enum value
@@ -2002,75 +1986,130 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(CompressedStackMaps);
   VISIT_NOTHING();
 
-  // The most significant bits are the length of the encoded payload, in bytes.
-  // The low bits determine the expected payload contents, as described below.
-  uint32_t flags_and_size_;
+ public:
+  struct Payload {
+    // The most significant bits are the length of the encoded payload, in
+    // bytes (excluding the header itself). The low bits determine the
+    // expected payload contents, as described below.
+    uint32_t flags_and_size;
 
-  // Variable length data follows here. The contents of the payload depend on
-  // the type of CompressedStackMaps (CSM) being represented. There are three
-  // major types of CSM:
-  //
-  // 1) GlobalTableBit = false, UsesTableBit = false: CSMs that include all
-  //    information about the stack maps. The payload for these contain tightly
-  //    packed entries with the following information:
-  //
-  //   * A header containing the following three pieces of information:
-  //     * An unsigned integer representing the PC offset as a delta from the
-  //       PC offset of the previous entry (from 0 for the first entry).
-  //     * An unsigned integer representing the number of bits used for
-  //       spill slot entries.
-  //     * An unsigned integer representing the number of bits used for other
-  //       entries.
-  //   * The body containing the bits for the stack map. The length of the body
-  //     in bits is the sum of the spill slot and non-spill slot bit counts.
-  //
-  // 2) GlobalTableBit = false, UsesTableBit = true: CSMs where the majority of
-  //    the stack map information has been offloaded and canonicalized into a
-  //    global table. The payload contains tightly packed entries with the
-  //    following information:
-  //
-  //   * A header containing just an unsigned integer representing the PC offset
-  //     delta as described above.
-  //   * The body is just an unsigned integer containing the offset into the
-  //     payload for the global table.
-  //
-  // 3) GlobalTableBit = true, UsesTableBit = false: A CSM implementing the
-  //    global table. Here, the payload contains tightly packed entries with
-  //    the following information:
-  //
-  //   * A header containing the following two pieces of information:
-  //     * An unsigned integer representing the number of bits used for
-  //       spill slot entries.
-  //     * An unsigned integer representing the number of bits used for other
-  //       entries.
-  //   * The body containing the bits for the stack map. The length of the body
-  //     in bits is the sum of the spill slot and non-spill slot bit counts.
-  //
-  // In all types of CSM, each unsigned integer is LEB128 encoded, as generally
-  // they tend to fit in a single byte or two. Thus, entry headers are not a
-  // fixed length, and currently there is no random access of entries.  In
-  // addition, PC offsets are currently encoded as deltas, which also inhibits
-  // random access without accessing previous entries. That means to find an
-  // entry for a given PC offset, a linear search must be done where the payload
-  // is decoded up to the entry whose PC offset is >= the given PC.
+    // Variable length data follows here. The contents of the payload depend on
+    // the type of CompressedStackMaps (CSM) being represented. There are three
+    // major types of CSM:
+    //
+    // 1) GlobalTableBit = false, UsesTableBit = false: CSMs that include all
+    //    information about the stack maps. The payload for these contain
+    //    tightly packed entries with the following information:
+    //
+    //   * A header containing the following three pieces of information:
+    //     * An unsigned integer representing the PC offset as a delta from the
+    //       PC offset of the previous entry (from 0 for the first entry).
+    //     * An unsigned integer representing the number of bits used for
+    //       spill slot entries.
+    //     * An unsigned integer representing the number of bits used for other
+    //       entries.
+    //   * The body containing the bits for the stack map. The length of
+    //     the body in bits is the sum of the spill slot and non-spill slot
+    //     bit counts.
+    //
+    // 2) GlobalTableBit = false, UsesTableBit = true: CSMs where the majority
+    //    of the stack map information has been offloaded and canonicalized into
+    //    a global table. The payload contains tightly packed entries with the
+    //    following information:
+    //
+    //   * A header containing just an unsigned integer representing the PC
+    //     offset delta as described above.
+    //   * The body is just an unsigned integer containing the offset into the
+    //     payload for the global table.
+    //
+    // 3) GlobalTableBit = true, UsesTableBit = false: A CSM implementing the
+    //    global table. Here, the payload contains tightly packed entries with
+    //    the following information:
+    //
+    //   * A header containing the following two pieces of information:
+    //     * An unsigned integer representing the number of bits used for
+    //       spill slot entries.
+    //     * An unsigned integer representing the number of bits used for other
+    //       entries.
+    //   * The body containing the bits for the stack map. The length of the
+    //     body in bits is the sum of the spill slot and non-spill slot bit
+    //     counts.
+    //
+    // In all types of CSM, each unsigned integer is LEB128 encoded, as
+    // generally they tend to fit in a single byte or two. Thus, entry headers
+    // are not a fixed length, and currently there is no random access of
+    // entries.  In addition, PC offsets are currently encoded as deltas, which
+    // also inhibits random access without accessing previous entries. That
+    // means to find an entry for a given PC offset, a linear search must be
+    // done where the payload is decoded up to the entry whose PC offset
+    // is greater or equal to the given PC.
 
-  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
-  const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); }
+    uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
+    const uint8_t* data() const { OPEN_ARRAY_START(uint8_t, uint8_t); }
+  };
+  static_assert(sizeof(Payload) == sizeof(uint32_t));
+
+ private:
+  // We are using OPEN_ARRAY_START rather than embedding Payload directly into
+  // the UntaggedCompressedStackMaps as a field because that would introduce a
+  // padding at the end of UntaggedCompressedStackMaps - so we would not be
+  // able to use sizeof(UntaggedCompressedStackMaps) as the size of the header
+  // anyway.
+  Payload* payload() { OPEN_ARRAY_START(Payload, uint32_t); }
+  const Payload* payload() const { OPEN_ARRAY_START(Payload, uint32_t); }
 
   class GlobalTableBit : public BitField<uint32_t, bool, 0, 1> {};
   class UsesTableBit
       : public BitField<uint32_t, bool, GlobalTableBit::kNextBit, 1> {};
-  class SizeField : public BitField<uint32_t,
-                                    uint32_t,
-                                    UsesTableBit::kNextBit,
-                                    sizeof(flags_and_size_) * kBitsPerByte -
-                                        UsesTableBit::kNextBit> {};
+  class SizeField
+      : public BitField<uint32_t,
+                        uint32_t,
+                        UsesTableBit::kNextBit,
+                        sizeof(Payload::flags_and_size) * kBitsPerByte -
+                            UsesTableBit::kNextBit> {};
 
   friend class Object;
   friend class ImageWriter;
   friend class StackMapEntry;
 };
 
+class UntaggedInstructionsTable : public UntaggedObject {
+  RAW_HEAP_OBJECT_IMPLEMENTATION(InstructionsTable);
+
+  POINTER_FIELD(ArrayPtr, code_objects)
+  VISIT_FROM(code_objects)
+  VISIT_TO(code_objects)
+
+  struct DataEntry {
+    uint32_t pc_offset;
+    uint32_t stack_map_offset;
+  };
+  static_assert(sizeof(DataEntry) == sizeof(uint32_t) * 2);
+
+  struct Data {
+    uint32_t canonical_stack_map_entries_offset;
+    uint32_t length;
+    uint32_t first_entry_with_code;
+    uint32_t padding;
+
+    const DataEntry* entries() const { OPEN_ARRAY_START(DataEntry, uint32_t); }
+
+    const UntaggedCompressedStackMaps::Payload* StackMapAt(
+        intptr_t offset) const {
+      return reinterpret_cast<UntaggedCompressedStackMaps::Payload*>(
+          reinterpret_cast<uword>(this) + offset);
+    }
+  };
+  static_assert(sizeof(Data) == sizeof(uint32_t) * 4);
+
+  intptr_t length_;
+  const Data* rodata_;
+  uword start_pc_;
+  uword end_pc_;
+
+  friend class Deserializer;
+};
+
 class UntaggedLocalVarDescriptors : public UntaggedObject {
  public:
   enum VarInfoKind {
@@ -2273,13 +2312,10 @@
 
 class UntaggedMonomorphicSmiableCall : public UntaggedObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(MonomorphicSmiableCall);
-  POINTER_FIELD(CodePtr,
-                target);  // Entrypoint PC in bare mode, Code in non-bare mode.
-  VISIT_FROM(target)
-  VISIT_TO(target)
+  VISIT_NOTHING();
+
   uword expected_cid_;
   uword entrypoint_;
-  ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 // Abstract base class for RawICData/RawMegamorphicCache
@@ -3247,10 +3283,14 @@
   // Isolate unique tag.
   uword tag_;
 
+  // Should CPU samples with this tag be streamed?
+  bool streamable_;
+
   friend class Object;
 
  public:
   uword tag() const { return tag_; }
+  bool streamable() const { return streamable_; }
 };
 
 class UntaggedFutureOr : public UntaggedInstance {
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 186f510..e59f439 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -97,14 +97,14 @@
   F(UnlinkedCall, target_name_)                                                \
   F(UnlinkedCall, args_descriptor_)                                            \
   F(MonomorphicSmiableCall, expected_cid_)                                     \
-  F(MonomorphicSmiableCall, target_)                                           \
+  F(MonomorphicSmiableCall, entrypoint_)                                       \
   F(CallSiteData, target_name_)                                                \
   F(CallSiteData, args_descriptor_)                                            \
   F(ICData, target_name_)                                                      \
   F(ICData, args_descriptor_)                                                  \
   F(ICData, entries_)                                                          \
   F(ICData, owner_)                                                            \
-  F(InstructionsTable, descriptors_)                                           \
+  F(InstructionsTable, code_objects_)                                          \
   F(MegamorphicCache, target_name_)                                            \
   F(MegamorphicCache, args_descriptor_)                                        \
   F(MegamorphicCache, buckets_)                                                \
diff --git a/runtime/vm/reverse_pc_lookup_cache.cc b/runtime/vm/reverse_pc_lookup_cache.cc
index dc7390a..77d4716 100644
--- a/runtime/vm/reverse_pc_lookup_cache.cc
+++ b/runtime/vm/reverse_pc_lookup_cache.cc
@@ -11,10 +11,9 @@
 
 namespace dart {
 
-ObjectPtr ReversePc::FindCodeDescriptorInGroup(IsolateGroup* group,
-                                               uword pc,
-                                               bool is_return_address,
-                                               uword* code_start) {
+CodePtr ReversePc::FindCodeInGroup(IsolateGroup* group,
+                                   uword pc,
+                                   bool is_return_address) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   // This can run in the middle of GC and must not allocate handles.
   NoSafepointScope no_safepoint;
@@ -31,30 +30,80 @@
   for (intptr_t i = 0; i < tables_length; i++) {
     InstructionsTablePtr table = static_cast<InstructionsTablePtr>(
         tables->untag()->data()->untag()->element(i));
-    intptr_t index = InstructionsTable::FindEntry(table, pc);
-    if (index >= 0) {
-      *code_start = InstructionsTable::PayloadStartAt(table, index);
-      return InstructionsTable::DescriptorAt(table, index);
+    CodePtr code = InstructionsTable::FindCode(table, pc);
+    if (code != Code::null()) {
+      return code;
+    }
+  }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+  return Code::null();
+}
+
+const UntaggedCompressedStackMaps::Payload* ReversePc::FindStackMapInGroup(
+    IsolateGroup* group,
+    uword pc,
+    bool is_return_address,
+    uword* code_start,
+    const UntaggedCompressedStackMaps::Payload** global_table) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  // This can run in the middle of GC and must not allocate handles.
+  NoSafepointScope no_safepoint;
+
+  if (is_return_address) {
+    pc--;
+  }
+
+  // This expected number of tables is low (one per loading unit), so we go
+  // through them linearly. If this changes, would could sort the table list
+  // during deserialization and binary search for the table.
+  GrowableObjectArrayPtr tables = group->object_store()->instructions_tables();
+  intptr_t tables_length = Smi::Value(tables->untag()->length());
+  for (intptr_t i = 0; i < tables_length; i++) {
+    InstructionsTablePtr table = static_cast<InstructionsTablePtr>(
+        tables->untag()->data()->untag()->element(i));
+    auto map = InstructionsTable::FindStackMap(table, pc, code_start);
+    if (map != nullptr) {
+      // Take global table from the first table.
+      table = static_cast<InstructionsTablePtr>(
+          tables->untag()->data()->untag()->element(0));
+      *global_table = InstructionsTable::GetCanonicalStackMap(table);
+      return map;
     }
   }
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
   *code_start = 0;
-  return Object::null();
+  return nullptr;
 }
 
-ObjectPtr ReversePc::FindCodeDescriptor(IsolateGroup* group,
-                                        uword pc,
-                                        bool is_return_address,
-                                        uword* code_start) {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+const UntaggedCompressedStackMaps::Payload* ReversePc::FindStackMap(
+    IsolateGroup* group,
+    uword pc,
+    bool is_return_address,
+    uword* code_start,
+    const UntaggedCompressedStackMaps::Payload** global_table) {
+  ASSERT(FLAG_precompiled_mode);
   NoSafepointScope no_safepoint;
 
-  ObjectPtr code_descriptor =
-      FindCodeDescriptorInGroup(group, pc, is_return_address, code_start);
-  if (code_descriptor == Object::null()) {
-    code_descriptor = FindCodeDescriptorInGroup(Dart::vm_isolate_group(), pc,
-                                                is_return_address, code_start);
+  auto map = FindStackMapInGroup(group, pc, is_return_address, code_start,
+                                 global_table);
+  if (map == nullptr) {
+    map = FindStackMapInGroup(Dart::vm_isolate_group(), pc, is_return_address,
+                              code_start, global_table);
+  }
+  return map;
+}
+
+CodePtr ReversePc::FindCode(IsolateGroup* group,
+                            uword pc,
+                            bool is_return_address) {
+  ASSERT(FLAG_precompiled_mode);
+  NoSafepointScope no_safepoint;
+
+  auto code_descriptor = FindCodeInGroup(group, pc, is_return_address);
+  if (code_descriptor == Code::null()) {
+    code_descriptor =
+        FindCodeInGroup(Dart::vm_isolate_group(), pc, is_return_address);
   }
   return code_descriptor;
 }
@@ -62,47 +111,10 @@
 CodePtr ReversePc::Lookup(IsolateGroup* group,
                           uword pc,
                           bool is_return_address) {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+  ASSERT(FLAG_precompiled_mode);
   NoSafepointScope no_safepoint;
 
-  uword code_start;
-  ObjectPtr code_descriptor =
-      FindCodeDescriptor(group, pc, is_return_address, &code_start);
-  if (code_descriptor != Object::null()) {
-    if (!code_descriptor->IsCode()) {
-      ASSERT(StubCode::UnknownDartCode().PayloadStart() == 0);
-      ASSERT(StubCode::UnknownDartCode().Size() == kUwordMax);
-      ASSERT(StubCode::UnknownDartCode().IsFunctionCode());
-      ASSERT(StubCode::UnknownDartCode().IsUnknownDartCode());
-      code_descriptor = StubCode::UnknownDartCode().ptr();
-    }
-  }
-  return static_cast<CodePtr>(code_descriptor);
-}
-
-CompressedStackMapsPtr ReversePc::FindCompressedStackMaps(
-    IsolateGroup* group,
-    uword pc,
-    bool is_return_address,
-    uword* code_start) {
-  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
-  NoSafepointScope no_safepoint;
-
-  ObjectPtr code_descriptor =
-      FindCodeDescriptor(group, pc, is_return_address, code_start);
-  if (code_descriptor != Object::null()) {
-    if (code_descriptor->IsCode()) {
-      CodePtr code = static_cast<CodePtr>(code_descriptor);
-      ASSERT(*code_start == Code::PayloadStartOf(code));
-      return code->untag()->compressed_stackmaps();
-    } else {
-      ASSERT(code_descriptor->IsCompressedStackMaps());
-      return static_cast<CompressedStackMapsPtr>(code_descriptor);
-    }
-  }
-
-  *code_start = 0;
-  return CompressedStackMaps::null();
+  return FindCode(group, pc, is_return_address);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/reverse_pc_lookup_cache.h b/runtime/vm/reverse_pc_lookup_cache.h
index e214747..21aef18 100644
--- a/runtime/vm/reverse_pc_lookup_cache.h
+++ b/runtime/vm/reverse_pc_lookup_cache.h
@@ -7,6 +7,7 @@
 
 #include "vm/allocation.h"
 #include "vm/globals.h"
+#include "vm/raw_object.h"
 #include "vm/tagged_pointer.h"
 
 namespace dart {
@@ -22,24 +23,27 @@
   // given isolate |group| and vm isolate group.
   static CodePtr Lookup(IsolateGroup* group, uword pc, bool is_return_address);
 
-  // Looks for CompressedStackMaps corresponding to |pc| in the
-  // given isolate |group| and vm isolate group.
-  // Sets |code_start| to the beginning of the instructions corresponding
-  // to |pc| (like Code::PayloadStart()).
-  static CompressedStackMapsPtr FindCompressedStackMaps(IsolateGroup* group,
-                                                        uword pc,
-                                                        bool is_return_address,
-                                                        uword* code_start);
+  static const UntaggedCompressedStackMaps::Payload* FindStackMap(
+      IsolateGroup* group,
+      uword pc,
+      bool is_return_address,
+      uword* code_start,
+      const UntaggedCompressedStackMaps::Payload** global_table);
 
  private:
-  static ObjectPtr FindCodeDescriptorInGroup(IsolateGroup* group,
-                                             uword pc,
-                                             bool is_return_address,
-                                             uword* code_start);
-  static ObjectPtr FindCodeDescriptor(IsolateGroup* group,
-                                      uword pc,
-                                      bool is_return_address,
-                                      uword* code_start);
+  static const UntaggedCompressedStackMaps::Payload* FindStackMapInGroup(
+      IsolateGroup* group,
+      uword pc,
+      bool is_return_address,
+      uword* code_start,
+      const UntaggedCompressedStackMaps::Payload** global_table);
+
+  static CodePtr FindCodeInGroup(IsolateGroup* group,
+                                 uword pc,
+                                 bool is_return_address);
+  static CodePtr FindCode(IsolateGroup* group,
+                          uword pc,
+                          bool is_return_address);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 549dd9b..c693c02 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -869,9 +869,6 @@
         new_cache.WriteEntryToBuffer(zone, &buffer, colliding_index, "      ");
         THR_Print("%s\n", buffer.buffer());
       }
-      if (!FLAG_enable_isolate_groups) {
-        FATAL("Duplicate subtype test cache entry");
-      }
       if (old_result.ptr() != result.ptr()) {
         FATAL("Existing subtype test cache entry has result %s, not %s",
               old_result.ToCString(), result.ToCString());
@@ -1246,9 +1243,6 @@
   const Code& target_code = Code::Handle(zone, target_function.EnsureHasCode());
   // Before patching verify that we are not repeatedly patching to the same
   // target.
-  ASSERT(FLAG_enable_isolate_groups ||
-         target_code.ptr() != CodePatcher::GetStaticCallTargetAt(
-                                  caller_frame->pc(), caller_code));
   if (target_code.ptr() !=
       CodePatcher::GetStaticCallTargetAt(caller_frame->pc(), caller_code)) {
     GcSafepointOperationScope safepoint(thread);
@@ -3018,10 +3012,6 @@
         current_target_code.EntryPoint(),
         current_target_code.is_optimized() ? "optimized" : "unoptimized");
   }
-  // With isolate groups enabled, it is possible that the target code
-  // has been deactivated just now(as a result of re-optimizatin for example),
-  // which will result in another run through FixCallersTarget.
-  ASSERT(!current_target_code.IsDisabled() || FLAG_enable_isolate_groups);
   arguments.SetReturn(current_target_code);
 #else
   UNREACHABLE();
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index a75737e..50238aa 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -72,6 +72,231 @@
             "Print a message when an isolate is paused but there is no "
             "debugger attached.");
 
+static void PrintInvalidParamError(JSONStream* js, const char* param) {
+#if !defined(PRODUCT)
+  js->PrintError(kInvalidParams, "%s: invalid '%s' parameter: %s", js->method(),
+                 param, js->LookupParam(param));
+#endif
+}
+
+// TODO(johnmccutchan): Split into separate file and write unit tests.
+class MethodParameter {
+ public:
+  MethodParameter(const char* name, bool required)
+      : name_(name), required_(required) {}
+
+  virtual ~MethodParameter() {}
+
+  virtual bool Validate(const char* value) const { return true; }
+
+  virtual bool ValidateObject(const Object& value) const { return true; }
+
+  const char* name() const { return name_; }
+
+  bool required() const { return required_; }
+
+  virtual void PrintError(const char* name,
+                          const char* value,
+                          JSONStream* js) const {
+    PrintInvalidParamError(js, name);
+  }
+
+  virtual void PrintErrorObject(const char* name,
+                                const Object& value,
+                                JSONStream* js) const {
+    PrintInvalidParamError(js, name);
+  }
+
+ private:
+  const char* name_;
+  bool required_;
+};
+
+class NoSuchParameter : public MethodParameter {
+ public:
+  explicit NoSuchParameter(const char* name) : MethodParameter(name, false) {}
+
+  virtual bool Validate(const char* value) const { return (value == NULL); }
+
+  virtual bool ValidateObject(const Object& value) const {
+    return value.IsNull();
+  }
+};
+
+#define ISOLATE_PARAMETER new IdParameter("isolateId", true)
+#define ISOLATE_GROUP_PARAMETER new IdParameter("isolateGroupId", true)
+#define NO_ISOLATE_PARAMETER new NoSuchParameter("isolateId")
+#define RUNNABLE_ISOLATE_PARAMETER new RunnableIsolateParameter("isolateId")
+
+class EnumListParameter : public MethodParameter {
+ public:
+  EnumListParameter(const char* name, bool required, const char* const* enums)
+      : MethodParameter(name, required), enums_(enums) {}
+
+  virtual bool Validate(const char* value) const {
+    return ElementCount(value) >= 0;
+  }
+
+  const char** Parse(char* value) const {
+    const char* kJsonChars = " \t\r\n[,]";
+
+    // Make a writeable copy of the value.
+    intptr_t element_count = ElementCount(value);
+    if (element_count < 0) {
+      return nullptr;
+    }
+    intptr_t element_pos = 0;
+
+    // Allocate our element array.  +1 for NULL terminator.
+    // The caller is reponsible for deleting this memory.
+    char** elements = new char*[element_count + 1];
+    elements[element_count] = NULL;
+
+    // Parse the string destructively.  Build the list of elements.
+    while (element_pos < element_count) {
+      // Skip to the next element.
+      value += strspn(value, kJsonChars);
+
+      intptr_t len = strcspn(value, kJsonChars);
+      ASSERT(len > 0);  // We rely on the parameter being validated already.
+      value[len] = '\0';
+      elements[element_pos++] = value;
+
+      // Advance.  +1 for null terminator.
+      value += (len + 1);
+    }
+    return const_cast<const char**>(elements);
+  }
+
+ private:
+  // For now observatory enums are ascii letters plus underscore.
+  static bool IsEnumChar(char c) {
+    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
+            (c == '_'));
+  }
+
+  // Returns number of elements in the list.  -1 on parse error.
+  intptr_t ElementCount(const char* value) const {
+    const char* kJsonWhitespaceChars = " \t\r\n";
+    if (value == NULL) {
+      return -1;
+    }
+    const char* cp = value;
+    cp += strspn(cp, kJsonWhitespaceChars);
+    if (*cp++ != '[') {
+      // Missing initial [.
+      return -1;
+    }
+    bool closed = false;
+    bool element_allowed = true;
+    intptr_t element_count = 0;
+    while (true) {
+      // Skip json whitespace.
+      cp += strspn(cp, kJsonWhitespaceChars);
+      switch (*cp) {
+        case '\0':
+          return closed ? element_count : -1;
+        case ']':
+          closed = true;
+          cp++;
+          break;
+        case ',':
+          if (element_allowed) {
+            return -1;
+          }
+          element_allowed = true;
+          cp++;
+          break;
+        default:
+          if (!element_allowed) {
+            return -1;
+          }
+          bool valid_enum = false;
+          const char* id_start = cp;
+          while (IsEnumChar(*cp)) {
+            cp++;
+          }
+          if (cp == id_start) {
+            // Empty identifier, something like this [,].
+            return -1;
+          }
+          intptr_t id_len = cp - id_start;
+          if (enums_ != NULL) {
+            for (intptr_t i = 0; enums_[i] != NULL; i++) {
+              intptr_t len = strlen(enums_[i]);
+              if (len == id_len && strncmp(id_start, enums_[i], len) == 0) {
+                element_count++;
+                valid_enum = true;
+                element_allowed = false;  // we need a comma first.
+                break;
+              }
+            }
+          }
+          if (!valid_enum) {
+            return -1;
+          }
+          break;
+      }
+    }
+  }
+
+  const char* const* enums_;
+};
+
+#if defined(SUPPORT_TIMELINE)
+static const char* const timeline_streams_enum_names[] = {
+    "all",
+#define DEFINE_NAME(name, unused) #name,
+    TIMELINE_STREAM_LIST(DEFINE_NAME)
+#undef DEFINE_NAME
+        NULL};
+
+static const MethodParameter* const set_vm_timeline_flags_params[] = {
+    NO_ISOLATE_PARAMETER,
+    new EnumListParameter("recordedStreams",
+                          false,
+                          timeline_streams_enum_names),
+    NULL,
+};
+
+static bool HasStream(const char** recorded_streams, const char* stream) {
+  while (*recorded_streams != NULL) {
+    if ((strstr(*recorded_streams, "all") != NULL) ||
+        (strstr(*recorded_streams, stream) != NULL)) {
+      return true;
+    }
+    recorded_streams++;
+  }
+  return false;
+}
+
+bool Service::EnableTimelineStreams(char* categories_list) {
+  const EnumListParameter* recorded_streams_param =
+      static_cast<const EnumListParameter*>(set_vm_timeline_flags_params[1]);
+  const char** streams = recorded_streams_param->Parse(categories_list);
+  if (streams == nullptr) {
+    return false;
+  }
+
+#define SET_ENABLE_STREAM(name, unused)                                        \
+  Timeline::SetStream##name##Enabled(HasStream(streams, #name));
+  TIMELINE_STREAM_LIST(SET_ENABLE_STREAM);
+#undef SET_ENABLE_STREAM
+
+  delete[] streams;
+
+#if !defined(PRODUCT)
+  // Notify clients that the set of subscribed streams has been updated.
+  if (Service::timeline_stream.enabled()) {
+    ServiceEvent event(ServiceEvent::kTimelineStreamSubscriptionsUpdate);
+    Service::HandleEvent(&event);
+  }
+#endif
+
+  return true;
+}
+#endif  // defined(SUPPORT_TIMELINE)
+
 #ifndef PRODUCT
 // The name of this of this vm as reported by the VM service protocol.
 static char* vm_name = NULL;
@@ -220,20 +445,6 @@
   return object.ptr();
 }
 
-static void PrintMissingParamError(JSONStream* js, const char* param) {
-  js->PrintError(kInvalidParams, "%s expects the '%s' parameter", js->method(),
-                 param);
-}
-
-static void PrintInvalidParamError(JSONStream* js, const char* param) {
-  js->PrintError(kInvalidParams, "%s: invalid '%s' parameter: %s", js->method(),
-                 param, js->LookupParam(param));
-}
-
-static void PrintUnrecognizedMethodError(JSONStream* js) {
-  js->PrintError(kMethodNotFound, NULL);
-}
-
 static void PrintSuccess(JSONStream* js) {
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "Success");
@@ -430,39 +641,6 @@
   return class_table->At(cid);
 }
 
-// TODO(johnmccutchan): Split into separate file and write unit tests.
-class MethodParameter {
- public:
-  MethodParameter(const char* name, bool required)
-      : name_(name), required_(required) {}
-
-  virtual ~MethodParameter() {}
-
-  virtual bool Validate(const char* value) const { return true; }
-
-  virtual bool ValidateObject(const Object& value) const { return true; }
-
-  const char* name() const { return name_; }
-
-  bool required() const { return required_; }
-
-  virtual void PrintError(const char* name,
-                          const char* value,
-                          JSONStream* js) const {
-    PrintInvalidParamError(js, name);
-  }
-
-  virtual void PrintErrorObject(const char* name,
-                                const Object& value,
-                                JSONStream* js) const {
-    PrintInvalidParamError(js, name);
-  }
-
- private:
-  const char* name_;
-  bool required_;
-};
-
 class DartStringParameter : public MethodParameter {
  public:
   DartStringParameter(const char* name, bool required)
@@ -483,17 +661,6 @@
   }
 };
 
-class NoSuchParameter : public MethodParameter {
- public:
-  explicit NoSuchParameter(const char* name) : MethodParameter(name, false) {}
-
-  virtual bool Validate(const char* value) const { return (value == NULL); }
-
-  virtual bool ValidateObject(const Object& value) const {
-    return value.IsNull();
-  }
-};
-
 class BoolParameter : public MethodParameter {
  public:
   BoolParameter(const char* name, bool required)
@@ -632,11 +799,6 @@
   }
 };
 
-#define ISOLATE_PARAMETER new IdParameter("isolateId", true)
-#define ISOLATE_GROUP_PARAMETER new IdParameter("isolateGroupId", true)
-#define NO_ISOLATE_PARAMETER new NoSuchParameter("isolateId")
-#define RUNNABLE_ISOLATE_PARAMETER new RunnableIsolateParameter("isolateId")
-
 class EnumParameter : public MethodParameter {
  public:
   EnumParameter(const char* name, bool required, const char* const* enums)
@@ -673,118 +835,6 @@
   return values[i];
 }
 
-class EnumListParameter : public MethodParameter {
- public:
-  EnumListParameter(const char* name, bool required, const char* const* enums)
-      : MethodParameter(name, required), enums_(enums) {}
-
-  virtual bool Validate(const char* value) const {
-    return ElementCount(value) >= 0;
-  }
-
-  const char** Parse(Zone* zone, const char* value_in) const {
-    const char* kJsonChars = " \t\r\n[,]";
-
-    // Make a writeable copy of the value.
-    char* value = zone->MakeCopyOfString(value_in);
-    intptr_t element_count = ElementCount(value);
-    intptr_t element_pos = 0;
-
-    // Allocate our element array.  +1 for NULL terminator.
-    char** elements = zone->Alloc<char*>(element_count + 1);
-    elements[element_count] = NULL;
-
-    // Parse the string destructively.  Build the list of elements.
-    while (element_pos < element_count) {
-      // Skip to the next element.
-      value += strspn(value, kJsonChars);
-
-      intptr_t len = strcspn(value, kJsonChars);
-      ASSERT(len > 0);  // We rely on the parameter being validated already.
-      value[len] = '\0';
-      elements[element_pos++] = value;
-
-      // Advance.  +1 for null terminator.
-      value += (len + 1);
-    }
-    return const_cast<const char**>(elements);
-  }
-
- private:
-  // For now observatory enums are ascii letters plus underscore.
-  static bool IsEnumChar(char c) {
-    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
-            (c == '_'));
-  }
-
-  // Returns number of elements in the list.  -1 on parse error.
-  intptr_t ElementCount(const char* value) const {
-    const char* kJsonWhitespaceChars = " \t\r\n";
-    if (value == NULL) {
-      return -1;
-    }
-    const char* cp = value;
-    cp += strspn(cp, kJsonWhitespaceChars);
-    if (*cp++ != '[') {
-      // Missing initial [.
-      return -1;
-    }
-    bool closed = false;
-    bool element_allowed = true;
-    intptr_t element_count = 0;
-    while (true) {
-      // Skip json whitespace.
-      cp += strspn(cp, kJsonWhitespaceChars);
-      switch (*cp) {
-        case '\0':
-          return closed ? element_count : -1;
-        case ']':
-          closed = true;
-          cp++;
-          break;
-        case ',':
-          if (element_allowed) {
-            return -1;
-          }
-          element_allowed = true;
-          cp++;
-          break;
-        default:
-          if (!element_allowed) {
-            return -1;
-          }
-          bool valid_enum = false;
-          const char* id_start = cp;
-          while (IsEnumChar(*cp)) {
-            cp++;
-          }
-          if (cp == id_start) {
-            // Empty identifier, something like this [,].
-            return -1;
-          }
-          intptr_t id_len = cp - id_start;
-          if (enums_ != NULL) {
-            for (intptr_t i = 0; enums_[i] != NULL; i++) {
-              intptr_t len = strlen(enums_[i]);
-              if (len == id_len && strncmp(id_start, enums_[i], len) == 0) {
-                element_count++;
-                valid_enum = true;
-                element_allowed = false;  // we need a comma first.
-                break;
-              }
-            }
-          }
-          if (!valid_enum) {
-            return -1;
-          }
-          break;
-      }
-    }
-  }
-
-  const char* const* enums_;
-};
-
 typedef void (*ServiceMethodEntry)(Thread* thread, JSONStream* js);
 
 struct ServiceMethodDescriptor {
@@ -793,6 +843,15 @@
   const MethodParameter* const* parameters;
 };
 
+static void PrintMissingParamError(JSONStream* js, const char* param) {
+  js->PrintError(kInvalidParams, "%s expects the '%s' parameter", js->method(),
+                 param);
+}
+
+static void PrintUnrecognizedMethodError(JSONStream* js) {
+  js->PrintError(kMethodNotFound, NULL);
+}
+
 // TODO(johnmccutchan): Do we reject unexpected parameters?
 static bool ValidateParameters(const MethodParameter* const* parameters,
                                JSONStream* js) {
@@ -1133,14 +1192,6 @@
   }
   PostEvent(event->isolate(), stream_id, event->KindAsCString(), &js,
             enter_safepoint);
-
-  // Post event to the native Service Stream handlers if set.
-  if (event->stream_info() != nullptr &&
-      event->stream_info()->consumer() != nullptr) {
-    auto length = js.buffer()->length();
-    event->stream_info()->consumer()(
-        reinterpret_cast<uint8_t*>(js.buffer()->buffer()), length);
-  }
 }
 
 void Service::PostEvent(Isolate* isolate,
@@ -1328,17 +1379,6 @@
   stream_cancel_callback_ = cancel_callback;
 }
 
-void Service::SetNativeServiceStreamCallback(Dart_NativeStreamConsumer consumer,
-                                             const char* stream_id) {
-  for (auto stream : streams_) {
-    if (stream->id() == stream_id) {
-      stream->set_consumer(consumer);
-    }
-  }
-  // Enable stream.
-  ListenStream(stream_id);
-}
-
 void Service::SetGetServiceAssetsCallback(
     Dart_GetVMServiceAssetsArchive get_service_assets) {
   get_service_assets_callback_ = get_service_assets;
@@ -1751,6 +1791,18 @@
     }
     return field.ptr();
   }
+  if (strcmp(parts[2], "field_inits") == 0) {
+    // Field initializer ids look like: "classes/17/field_inits/name"
+    const auto& field = Field::Handle(klass.LookupField(id));
+    if (field.IsNull() || (field.is_late() && !field.has_initializer())) {
+      return Object::sentinel().ptr();
+    }
+    const auto& function = Function::Handle(field.EnsureInitializerFunction());
+    if (function.IsNull()) {
+      return Object::sentinel().ptr();
+    }
+    return function.ptr();
+  }
   if (strcmp(parts[2], "functions") == 0) {
     // Function ids look like: "classes/17/functions/name"
 
@@ -1843,6 +1895,10 @@
     // Library field ids look like: "libraries/17/fields/name"
     return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
   }
+  if (strcmp(parts[2], "field_inits") == 0) {
+    // Library field ids look like: "libraries/17/field_inits/name"
+    return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+  }
   if (strcmp(parts[2], "functions") == 0) {
     // Library function ids look like: "libraries/17/functions/name"
     return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
@@ -1912,6 +1968,9 @@
   if (strcmp(parts[2], "closures") == 0) {
     // Closure ids look like: "classes/17/closures/11"
     return LookupClassMembers(thread, cls, parts, num_parts);
+  } else if (strcmp(parts[2], "field_inits") == 0) {
+    // Field initializer ids look like: "classes/17/field_inits/name"
+    return LookupClassMembers(thread, cls, parts, num_parts);
   } else if (strcmp(parts[2], "fields") == 0) {
     // Field ids look like: "classes/17/fields/name"
     return LookupClassMembers(thread, cls, parts, num_parts);
@@ -3349,23 +3408,28 @@
     return;
   }
 
-  const char* reports_str = js->LookupParam("reports");
+  char* reports_str = Utils::StrDup(js->LookupParam("reports"));
   const EnumListParameter* reports_parameter =
       static_cast<const EnumListParameter*>(get_source_report_params[1]);
-  const char** reports = reports_parameter->Parse(thread->zone(), reports_str);
+  const char** reports = reports_parameter->Parse(reports_str);
+  const char** riter = reports;
   intptr_t report_set = 0;
-  while (*reports != NULL) {
-    if (strcmp(*reports, SourceReport::kCallSitesStr) == 0) {
+  while (*riter != NULL) {
+    if (strcmp(*riter, SourceReport::kCallSitesStr) == 0) {
       report_set |= SourceReport::kCallSites;
-    } else if (strcmp(*reports, SourceReport::kCoverageStr) == 0) {
+    } else if (strcmp(*riter, SourceReport::kCoverageStr) == 0) {
       report_set |= SourceReport::kCoverage;
-    } else if (strcmp(*reports, SourceReport::kPossibleBreakpointsStr) == 0) {
+    } else if (strcmp(*riter, SourceReport::kPossibleBreakpointsStr) == 0) {
       report_set |= SourceReport::kPossibleBreakpoints;
-    } else if (strcmp(*reports, SourceReport::kProfileStr) == 0) {
+    } else if (strcmp(*riter, SourceReport::kProfileStr) == 0) {
       report_set |= SourceReport::kProfile;
     }
-    reports++;
+    riter++;
   }
+  if (reports != nullptr) {
+    delete[] reports;
+  }
+  free(reports_str);
 
   SourceReport::CompileMode compile_mode = SourceReport::kNoCompile;
   if (BoolParameter::Parse(js->LookupParam("forceCompile"), false)) {
@@ -3803,34 +3867,6 @@
   }
 }
 
-static const char* const timeline_streams_enum_names[] = {
-    "all",
-#define DEFINE_NAME(name, unused) #name,
-    TIMELINE_STREAM_LIST(DEFINE_NAME)
-#undef DEFINE_NAME
-        NULL};
-
-static const MethodParameter* const set_vm_timeline_flags_params[] = {
-    NO_ISOLATE_PARAMETER,
-    new EnumListParameter("recordedStreams",
-                          false,
-                          timeline_streams_enum_names),
-    NULL,
-};
-
-#if defined(SUPPORT_TIMELINE)
-static bool HasStream(const char** recorded_streams, const char* stream) {
-  while (*recorded_streams != NULL) {
-    if ((strstr(*recorded_streams, "all") != NULL) ||
-        (strstr(*recorded_streams, stream) != NULL)) {
-      return true;
-    }
-    recorded_streams++;
-  }
-  return false;
-}
-#endif
-
 static void SetVMTimelineFlags(Thread* thread, JSONStream* js) {
 #if !defined(SUPPORT_TIMELINE)
   PrintSuccess(js);
@@ -3839,23 +3875,9 @@
   ASSERT(isolate != NULL);
   StackZone zone(thread);
 
-  const EnumListParameter* recorded_streams_param =
-      static_cast<const EnumListParameter*>(set_vm_timeline_flags_params[1]);
-
-  const char* recorded_streams_str = js->LookupParam("recordedStreams");
-  const char** recorded_streams =
-      recorded_streams_param->Parse(thread->zone(), recorded_streams_str);
-
-#define SET_ENABLE_STREAM(name, unused)                                        \
-  Timeline::SetStream##name##Enabled(HasStream(recorded_streams, #name));
-  TIMELINE_STREAM_LIST(SET_ENABLE_STREAM);
-#undef SET_ENABLE_STREAM
-
-  // Notify clients that the set of subscribed streams has been updated.
-  if (Service::timeline_stream.enabled()) {
-    ServiceEvent event(ServiceEvent::kTimelineStreamSubscriptionsUpdate);
-    Service::HandleEvent(&event);
-  }
+  char* recorded_streams = Utils::StrDup(js->LookupParam("recordedStreams"));
+  Service::EnableTimelineStreams(recorded_streams);
+  free(recorded_streams);
 
   PrintSuccess(js);
 #endif
@@ -4501,7 +4523,7 @@
   event.set_embedder_kind(event_kind);
   event.set_embedder_stream_id(stream_id);
   event.set_bytes(bytes, bytes_len);
-  Service::HandleEvent(&event);
+  Service::HandleEvent(&event, /*enter_safepoint=*/false);
 }
 
 void Service::SendLogEvent(Isolate* isolate,
@@ -5142,6 +5164,44 @@
   PrintSuccess(js);
 }
 
+static const MethodParameter* const set_isolate_pause_mode_params[] = {
+    ISOLATE_PARAMETER,
+    new EnumParameter("exceptionPauseMode", false, exception_pause_mode_names),
+    new BoolParameter("shouldPauseOnExit", false),
+    nullptr,
+};
+
+static void SetIsolatePauseMode(Thread* thread, JSONStream* js) {
+  bool state_changed = false;
+  const char* exception_pause_mode = js->LookupParam("exceptionPauseMode");
+  if (exception_pause_mode != nullptr) {
+    Dart_ExceptionPauseInfo info =
+        EnumMapper(exception_pause_mode, exception_pause_mode_names,
+                   exception_pause_mode_values);
+    if (info == kInvalidExceptionPauseInfo) {
+      PrintInvalidParamError(js, "exceptionPauseMode");
+      return;
+    }
+    Isolate* isolate = thread->isolate();
+    isolate->debugger()->SetExceptionPauseInfo(info);
+    state_changed = true;
+  }
+
+  const char* pause_isolate_on_exit = js->LookupParam("shouldPauseOnExit");
+  if (pause_isolate_on_exit != nullptr) {
+    bool enable = BoolParameter::Parse(pause_isolate_on_exit, false);
+    thread->isolate()->message_handler()->set_should_pause_on_exit(enable);
+    state_changed = true;
+  }
+
+  if (state_changed && Service::debug_stream.enabled()) {
+    ServiceEvent event(thread->isolate(),
+                       ServiceEvent::kDebuggerSettingsUpdate);
+    Service::HandleEvent(&event);
+  }
+  PrintSuccess(js);
+}
+
 static const MethodParameter* const set_breakpoint_state_params[] = {
     ISOLATE_PARAMETER,
     new IdParameter("breakpointId", true),
@@ -5558,6 +5618,8 @@
     set_breakpoint_state_params },
   { "setExceptionPauseMode", SetExceptionPauseMode,
     set_exception_pause_mode_params },
+  { "setIsolatePauseMode", SetIsolatePauseMode,
+    set_isolate_pause_mode_params },
   { "setFlag", SetFlag,
     set_flags_params },
   { "setLibraryDebuggable", SetLibraryDebuggable,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index c3fe1f2..f625b94 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 52
+#define SERVICE_PROTOCOL_MINOR_VERSION 55
 
 class Array;
 class EmbedderServiceHandler;
@@ -75,15 +75,9 @@
   void set_enabled(bool value) { enabled_ = value; }
   bool enabled() const { return enabled_; }
 
-  void set_consumer(Dart_NativeStreamConsumer consumer) {
-    callback_ = consumer;
-  }
-  Dart_NativeStreamConsumer consumer() const { return callback_; }
-
  private:
   const char* id_;
   bool enabled_;
-  Dart_NativeStreamConsumer callback_;
 };
 
 class Service : public AllStatic {
@@ -116,9 +110,6 @@
       Dart_ServiceStreamListenCallback listen_callback,
       Dart_ServiceStreamCancelCallback cancel_callback);
 
-  static void SetNativeServiceStreamCallback(Dart_NativeStreamConsumer consumer,
-                                             const char* stream_id);
-
   static void SetGetServiceAssetsCallback(
       Dart_GetVMServiceAssetsArchive get_service_assets);
 
@@ -161,6 +152,10 @@
                         const Instance& id,
                         const Error& error);
 
+  // Enable/Disable timeline categories.
+  // Returns True if the categories were successfully enabled, False otherwise.
+  static bool EnableTimelineStreams(char* categories_list);
+
   // Well-known streams.
   static StreamInfo vm_stream;
   static StreamInfo isolate_stream;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index ba4add1..2c22e5f 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.52
+# Dart VM Service Protocol 3.55
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.52_ of the Dart VM Service Protocol. This
+This document describes of _version 3.55_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -79,6 +79,7 @@
   - [setVMName](#setvmname)
   - [setVMTimelineFlags](#setvmtimelineflags)
   - [streamCancel](#streamcancel)
+  - [streamCpuSamplesWithUserTag](#streamcpusampleswithusertag)
   - [streamListen](#streamlisten)
 - [Public Types](#public-types)
   - [AllocationProfile](#allocationprofile)
@@ -1378,6 +1379,7 @@
 ### setExceptionPauseMode
 
 ```
+@deprecated('Use setIsolatePauseMode instead')
 Success|Sentinel setExceptionPauseMode(string isolateId,
                                        ExceptionPauseMode mode)
 ```
@@ -1394,6 +1396,31 @@
 If _isolateId_ refers to an isolate which has exited, then the
 _Collected_ [Sentinel](#sentinel) is returned.
 
+### setIsolatePauseMode
+
+```
+Success|Sentinel setIsolatePauseMode(string isolateId,
+                                     ExceptionPauseMode exceptionPauseMode [optional],
+                                     bool shouldPauseOnExit [optional])
+```
+
+The _setIsolatePauseMode_ RPC is used to control if or when an isolate will
+pause due to a change in execution state.
+
+The _shouldPauseOnExit_ parameter specify whether the target isolate should pause on exit.
+
+The _setExceptionPauseMode_ RPC is used to control if an isolate pauses when
+an exception is thrown.
+
+mode | meaning
+---- | -------
+None | Do not pause isolate on thrown exceptions
+Unhandled | Pause isolate on unhandled exceptions
+All  | Pause isolate on all thrown exceptions
+
+If _isolateId_ refers to an isolate which has exited, then the
+_Collected_ [Sentinel](#sentinel) is returned.
+
 ### setFlag
 
 ```
@@ -1420,6 +1447,7 @@
    provided value. If set to false when the profiler is already running, the
    profiler will be stopped but may not free its sample buffer depending on
    platform limitations.
+ * Isolate pause settings will only be applied to newly spawned isolates.
 
 See [Success](#success).
 
@@ -1509,6 +1537,19 @@
 
 See [Success](#success).
 
+### streamCpuSamplesWithUserTag
+
+```
+Success streamCpuSamplesWithUserTag(string[] userTags)
+```
+
+The _streamCpuSamplesWithUserTag_ RPC allows for clients to specify which CPU
+samples collected by the profiler should be sent over the `Profiler` stream.
+When called, the VM will stream `CpuSamples` events containing `CpuSample`'s
+collected while a user tag contained in `userTags` was active.
+
+See [Success](#success).
+
 ### streamListen
 
 ```
@@ -1960,6 +2001,46 @@
 
 See [getCpuSamples](#getcpusamples) and [CpuSample](#cpusample).
 
+### CpuSamplesEvent
+
+```
+class CpuSamplesEvent {
+  // The sampling rate for the profiler in microseconds.
+  int samplePeriod;
+
+  // The maximum possible stack depth for samples.
+  int maxStackDepth;
+
+  // The number of samples returned.
+  int sampleCount;
+
+  // The timespan the set of returned samples covers, in microseconds (deprecated).
+  //
+  // Note: this property is deprecated and will always return -1. Use `timeExtentMicros`
+  // instead.
+  int timeSpan;
+
+  // The start of the period of time in which the returned samples were
+  // collected.
+  int timeOriginMicros;
+
+  // The duration of time covered by the returned samples.
+  int timeExtentMicros;
+
+  // The process ID for the VM.
+  int pid;
+
+  // A list of references to functions seen in the relevant samples. These references can
+  // be looked up using the indicies provided in a `CpuSample` `stack` to determine
+  // which function was on the stack.
+  (@Object|NativeFunction)[] functions;
+
+  // A list of samples collected in the range
+  // `[timeOriginMicros, timeOriginMicros + timeExtentMicros]`
+  CpuSample[] samples;
+}
+```
+
 ### CpuSample
 
 ```
@@ -2224,7 +2305,7 @@
   string previousTag [optional];
 
   // A CPU profile containing recent samples.
-  CpuSamples cpuSamples [optional];
+  CpuSamplesEvent cpuSamples [optional];
 }
 ```
 
@@ -4235,4 +4316,8 @@
 3.50 | Added `returnType`, `parameters`, and `typeParameters` to `@Instance`, and `implicit` to `@Function`. Added `Parameter` type.
 3.51 | Added optional `reportLines` parameter to `getSourceReport` RPC.
 3.52 | Added `lookupResolvedPackageUris` and `lookupPackageUris` RPCs and `UriList` type.
+3.53 | Added `setIsolatePauseMode` RPC.
+3.54 | Added `CpuSamplesEvent`, updated `cpuSamples` property on `Event` to have type `CpuSamplesEvent`.
+3.55 | Added `streamCpuSamplesWithUserTag` RPC.
+
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service_event.cc b/runtime/vm/service_event.cc
index 85740cf..9e4f399 100644
--- a/runtime/vm/service_event.cc
+++ b/runtime/vm/service_event.cc
@@ -20,7 +20,9 @@
     : ServiceEvent(isolate_group, nullptr, event_kind) {}
 
 ServiceEvent::ServiceEvent(Isolate* isolate, EventKind event_kind)
-    : ServiceEvent(isolate->group(), isolate, event_kind) {}
+    : ServiceEvent(isolate != nullptr ? isolate->group() : nullptr,
+                   isolate,
+                   event_kind) {}
 
 ServiceEvent::ServiceEvent(IsolateGroup* isolate_group,
                            Isolate* isolate,
@@ -52,14 +54,14 @@
   // over the service.
   ASSERT(isolate_ != Dart::vm_isolate());
 
-  // System isolates should never post service events. However, the Isolate
+  // VM internal isolates should never post service events. However, the Isolate
   // service object uses a service event to represent the current running state
   // of the isolate, so we need to allow for system isolates to create resume
   // and none events for this purpose. The resume event represents a running
   // isolate and the none event is returned for an isolate that has not yet
   // been marked as runnable (see "pauseEvent" in Isolate::PrintJSON).
-  ASSERT(isolate == NULL || !Isolate::IsSystemIsolate(isolate) ||
-         (Isolate::IsSystemIsolate(isolate) &&
+  ASSERT(isolate == NULL || !Isolate::IsVMInternalIsolate(isolate) ||
+         (Isolate::IsVMInternalIsolate(isolate) &&
           (event_kind == ServiceEvent::kResume ||
            event_kind == ServiceEvent::kNone ||
            // VM service can print Observatory information to Stdout or Stderr
@@ -307,7 +309,8 @@
 
   if (kind() == kCpuSamples) {
     JSONObject cpu_profile(&jsobj, "cpuSamples");
-    cpu_profile_->PrintProfileJSON(&cpu_profile, false);
+    cpu_profile_->PrintProfileJSON(&cpu_profile, /*include_code_samples=*/false,
+                                   /*is_event=*/true);
   }
 }
 
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 2800565..751bb7e 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -105,16 +105,16 @@
 }
 
 static ArrayPtr EvalF(Dart_Handle lib, const char* fmt, ...) {
-  va_list args;
-  va_start(args, fmt);
-  intptr_t len = Utils::VSNPrint(NULL, 0, fmt, args);
-  va_end(args);
+  va_list messure_args;
+  va_start(messure_args, fmt);
+  intptr_t len = Utils::VSNPrint(NULL, 0, fmt, messure_args);
+  va_end(messure_args);
 
   char* buffer = Thread::Current()->zone()->Alloc<char>(len + 1);
-  va_list args2;
-  va_start(args2, fmt);
-  Utils::VSNPrint(buffer, (len + 1), fmt, args2);
-  va_end(args2);
+  va_list print_args;
+  va_start(print_args, fmt);
+  Utils::VSNPrint(buffer, (len + 1), fmt, print_args);
+  va_end(print_args);
 
   return Eval(lib, buffer);
 }
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index d17cb92..8dd8013 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -916,25 +916,21 @@
 
 // Accessors for VFP register state.
 DART_FORCE_INLINE void Simulator::set_sregister(SRegister reg, float value) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   sregisters_[reg] = bit_cast<int32_t, float>(value);
 }
 
 DART_FORCE_INLINE float Simulator::get_sregister(SRegister reg) const {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   return bit_cast<float, int32_t>(sregisters_[reg]);
 }
 
 DART_FORCE_INLINE void Simulator::set_dregister(DRegister reg, double value) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   dregisters_[reg] = bit_cast<int64_t, double>(value);
 }
 
 DART_FORCE_INLINE double Simulator::get_dregister(DRegister reg) const {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   return bit_cast<double, int64_t>(dregisters_[reg]);
 }
@@ -958,25 +954,21 @@
 }
 
 void Simulator::set_sregister_bits(SRegister reg, int32_t value) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   sregisters_[reg] = value;
 }
 
 int32_t Simulator::get_sregister_bits(SRegister reg) const {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
   return sregisters_[reg];
 }
 
 void Simulator::set_dregister_bits(DRegister reg, int64_t value) {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   dregisters_[reg] = value;
 }
 
 int64_t Simulator::get_dregister_bits(DRegister reg) const {
-  ASSERT(TargetCPUFeatures::vfp_supported());
   ASSERT((reg >= 0) && (reg < kNumberOfDRegisters));
   return dregisters_[reg];
 }
@@ -1500,7 +1492,6 @@
         set_register(R3, icount_);
         set_register(IP, icount_);
         set_register(LR, icount_);
-        if (TargetCPUFeatures::vfp_supported()) {
           double zap_dvalue = static_cast<double>(icount_);
           // Do not zap D0, as it may contain a float result.
           for (int i = D1; i <= D7; i++) {
@@ -1513,7 +1504,6 @@
             set_dregister(static_cast<DRegister>(i), zap_dvalue);
           }
 #endif
-        }
 
         // Return.
         set_pc(saved_lr);
@@ -3519,7 +3509,6 @@
 
   // Setup parameters.
   if (fp_args) {
-    ASSERT(TargetCPUFeatures::vfp_supported());
     set_sregister(S0, bit_cast<float, int32_t>(parameter0));
     set_sregister(S1, bit_cast<float, int32_t>(parameter1));
     set_sregister(S2, bit_cast<float, int32_t>(parameter2));
@@ -3569,7 +3558,6 @@
   double d14_val = 0.0;
   double d15_val = 0.0;
 
-  if (TargetCPUFeatures::vfp_supported()) {
     d8_val = get_dregister(D8);
     d9_val = get_dregister(D9);
     d10_val = get_dregister(D10);
@@ -3578,7 +3566,6 @@
     d13_val = get_dregister(D13);
     d14_val = get_dregister(D14);
     d15_val = get_dregister(D15);
-  }
 
   // Setup the callee-saved registers with a known value. To be able to check
   // that they are preserved properly across dart execution.
@@ -3595,7 +3582,6 @@
   set_register(R11, callee_saved_value);
 
   double callee_saved_dvalue = 0.0;
-  if (TargetCPUFeatures::vfp_supported()) {
     callee_saved_dvalue = static_cast<double>(icount_);
     set_dregister(D8, callee_saved_dvalue);
     set_dregister(D9, callee_saved_dvalue);
@@ -3605,7 +3591,6 @@
     set_dregister(D13, callee_saved_dvalue);
     set_dregister(D14, callee_saved_dvalue);
     set_dregister(D15, callee_saved_dvalue);
-  }
 
   // Start the simulation
   Execute();
@@ -3622,7 +3607,6 @@
   ASSERT(callee_saved_value == get_register(R10));
   ASSERT(callee_saved_value == get_register(R11));
 
-  if (TargetCPUFeatures::vfp_supported()) {
     ASSERT(callee_saved_dvalue == get_dregister(D8));
     ASSERT(callee_saved_dvalue == get_dregister(D9));
     ASSERT(callee_saved_dvalue == get_dregister(D10));
@@ -3631,7 +3615,6 @@
     ASSERT(callee_saved_dvalue == get_dregister(D13));
     ASSERT(callee_saved_dvalue == get_dregister(D14));
     ASSERT(callee_saved_dvalue == get_dregister(D15));
-  }
 
   // Restore callee-saved registers with the original value.
   set_register(R4, r4_val);
@@ -3645,7 +3628,6 @@
   set_register(R10, r10_val);
   set_register(R11, r11_val);
 
-  if (TargetCPUFeatures::vfp_supported()) {
     set_dregister(D8, d8_val);
     set_dregister(D9, d9_val);
     set_dregister(D10, d10_val);
@@ -3654,13 +3636,11 @@
     set_dregister(D13, d13_val);
     set_dregister(D14, d14_val);
     set_dregister(D15, d15_val);
-  }
 
   // Restore the SP register and return R1:R0.
   set_register(SP, sp_before_call);
   int64_t return_value;
   if (fp_return) {
-    ASSERT(TargetCPUFeatures::vfp_supported());
     return_value = bit_cast<int64_t, double>(get_dregister(D0));
   } else {
     return_value = Utils::LowHighTo64Bits(get_register(R0), get_register(R1));
@@ -3696,14 +3676,14 @@
   // Restore pool pointer.
   int32_t code =
       *reinterpret_cast<int32_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
-  int32_t pp = (FLAG_precompiled_mode && FLAG_use_bare_instructions)
+  int32_t pp = FLAG_precompiled_mode
                    ? static_cast<int32_t>(thread->global_object_pool())
                    : *reinterpret_cast<int32_t*>(
                          (code + Code::object_pool_offset() - kHeapObjectTag));
 
   set_register(CODE_REG, code);
   set_register(PP, pp);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     set_register(DISPATCH_TABLE_REG,
                  reinterpret_cast<int32_t>(thread->dispatch_table_array()));
   }
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index b3c53a8..056678d 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -3741,7 +3741,7 @@
   // Restore pool pointer.
   int64_t code =
       *reinterpret_cast<int64_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
-  int64_t pp = (FLAG_precompiled_mode && FLAG_use_bare_instructions)
+  int64_t pp = FLAG_precompiled_mode
                    ? static_cast<int64_t>(thread->global_object_pool())
                    : *reinterpret_cast<int64_t*>(
                          code + Code::object_pool_offset() - kHeapObjectTag);
@@ -3752,7 +3752,7 @@
       NULL, HEAP_BITS,
       (thread->write_barrier_mask() << 32) | (thread->heap_base() >> 32));
   set_register(NULL, NULL_REG, static_cast<int64_t>(Object::null()));
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     set_register(NULL, DISPATCH_TABLE_REG,
                  reinterpret_cast<int64_t>(thread->dispatch_table_array()));
   }
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index ede8d64..b826aa9 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -105,7 +105,7 @@
       return true;
   }
   if (func.is_abstract() || func.IsImplicitConstructor() ||
-      func.is_synthetic()) {
+      func.is_synthetic() || func.is_redirecting_factory()) {
     return true;
   }
   if (func.IsNonImplicitClosureFunction() &&
@@ -115,6 +115,36 @@
     // function failed to compile.
     return true;
   }
+
+  // There is an idiom where static utility classes are given a private
+  // constructor to prevent the the class from being instantiated. Ignore these
+  // constructors so that they don't lower the coverage rate. See #47021.
+  SafepointReadRwLocker ml(thread_, thread_->isolate_group()->program_lock());
+  if (func.kind() == UntaggedFunction::kConstructor &&
+      func.NumParameters() == func.NumImplicitParameters() &&
+      func.IsPrivate()) {
+    // Check that the class has no non-static members and no subclasses.
+    Class& cls = Class::Handle(func.Owner());
+    GrowableObjectArray& subclasses =
+        GrowableObjectArray::Handle(cls.direct_subclasses());
+    if (cls.is_abstract() && !cls.HasInstanceFields() &&
+        (subclasses.IsNull() || subclasses.Length() == 0)) {
+      // Check that the constructor is the only non-static function.
+      Array& clsFuncs = Array::Handle(cls.functions());
+      Function& otherFunc = Function::Handle();
+      intptr_t numNonStaticFunctions = 0;
+      for (intptr_t i = 0; i < clsFuncs.Length(); ++i) {
+        otherFunc ^= clsFuncs.At(i);
+        if (!otherFunc.IsStaticFunction()) {
+          ++numNonStaticFunctions;
+        }
+      }
+      if (numNonStaticFunctions == 1) {
+        return true;
+      }
+    }
+  }
+
   return false;
 }
 
@@ -232,6 +262,27 @@
   return line;
 }
 
+bool SourceReport::ShouldCoverageSkipCallSite(const ICData* ic_data) {
+  if (ic_data == NULL) return true;
+  if (!ic_data->is_static_call()) return false;
+  Function& func = Function::Handle(ic_data->GetTargetAt(0));
+
+  // Ignore calls to the LateError functions. These are used to throw errors to
+  // do with late variables. These errors shouldn't be hit in working code, so
+  // shouldn't count against the coverage total.
+  // See https://github.com/dart-lang/coverage/issues/341
+  if (late_error_class_id_ == ClassId::kIllegalCid) {
+    const Class& lateErrorClass =
+        Class::Handle(Library::LookupCoreClass(Symbols::LateError()));
+    late_error_class_id_ = lateErrorClass.id();
+  }
+  Class& cls = Class::Handle(func.Owner());
+  if (late_error_class_id_ == cls.id()) {
+    return true;
+  }
+  return false;
+}
+
 void SourceReport::PrintCoverageData(JSONObject* jsobj,
                                      const Function& function,
                                      const Code& code) {
@@ -285,7 +336,7 @@
     HANDLESCOPE(thread());
     ASSERT(iter.DeoptId() < ic_data_array->length());
     const ICData* ic_data = (*ic_data_array)[iter.DeoptId()];
-    if (ic_data != NULL) {
+    if (!ShouldCoverageSkipCallSite(ic_data)) {
       const TokenPosition& token_pos = iter.TokenPos();
       update_coverage(token_pos, ic_data->AggregateCount() > 0);
     }
@@ -295,11 +346,14 @@
   const Array& coverage_array = Array::Handle(function.GetCoverageArray());
   if (!coverage_array.IsNull()) {
     for (intptr_t i = 0; i < coverage_array.Length(); i += 2) {
-      const TokenPosition token_pos = TokenPosition::Deserialize(
-          Smi::Value(Smi::RawCast(coverage_array.At(i))));
-      const bool was_executed =
-          Smi::Value(Smi::RawCast(coverage_array.At(i + 1))) != 0;
-      update_coverage(token_pos, was_executed);
+      bool is_branch_coverage;
+      const TokenPosition token_pos = TokenPosition::DecodeCoveragePosition(
+          Smi::Value(Smi::RawCast(coverage_array.At(i))), &is_branch_coverage);
+      if (!is_branch_coverage) {
+        const bool was_executed =
+            Smi::Value(Smi::RawCast(coverage_array.At(i + 1))) != 0;
+        update_coverage(token_pos, was_executed);
+      }
     }
   }
 
diff --git a/runtime/vm/source_report.h b/runtime/vm/source_report.h
index 070ca0a..874f682 100644
--- a/runtime/vm/source_report.h
+++ b/runtime/vm/source_report.h
@@ -66,6 +66,7 @@
   bool IsReportRequested(ReportKind report_kind);
   bool ShouldSkipFunction(const Function& func);
   bool ShouldSkipField(const Field& field);
+  bool ShouldCoverageSkipCallSite(const ICData* ic_data);
   intptr_t GetScriptIndex(const Script& script);
   bool ScriptIsLoadedByLibrary(const Script& script, const Library& lib);
   intptr_t GetTokenPosOrLine(const Script& script,
@@ -139,6 +140,7 @@
   GrowableArray<ScriptTableEntry*> script_table_entries_;
   DirectChainedHashMap<ScriptTableTrait> script_table_;
   intptr_t next_script_index_;
+  intptr_t late_error_class_id_ = ClassId::kIllegalCid;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index 00c4c2e..2670ac6 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -819,6 +819,306 @@
       buffer);
 }
 
+ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_Issue47017_Assert) {
+  // WARNING: This MUST be big enough for the serialised JSON string.
+  const int kBufferSize = 1024;
+  char buffer[kBufferSize];
+  const char* kScript =
+      "void foo(Object? bar) {\n"
+      "  assert(bar == null);\n"
+      "}\n"
+      "void main() {\n"
+      "  foo(null);\n"
+      "}\n";
+
+  Library& lib = Library::Handle();
+  const bool old_asserts = IsolateGroup::Current()->asserts();
+  IsolateGroup::Current()->set_asserts(true);
+  lib ^= ExecuteScript(kScript);
+  IsolateGroup::Current()->set_asserts(old_asserts);
+  ASSERT(!lib.IsNull());
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
+
+  SourceReport report(SourceReport::kCoverage, SourceReport::kForceCompile);
+  JSONStream js;
+  report.PrintJSON(&js, script);
+  const char* json_str = js.ToCString();
+  ASSERT(strlen(json_str) < kBufferSize);
+  ElideJSONSubstring("classes", json_str, buffer);
+  ElideJSONSubstring("libraries", buffer, buffer);
+  EXPECT_STREQ(
+      "{\"type\":\"SourceReport\",\"ranges\":["
+
+      // Foo is hit, and the assert is hit.
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":47,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[0,33],\"misses\":[]}},"
+
+      // Main is hit.
+      "{\"scriptIndex\":0,\"startPos\":49,\"endPos\":76,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[49,65],\"misses\":[]}}],"
+
+      // Only one script in the script table.
+      "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
+      buffer);
+}
+
+ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_Issue47021_StaticOnlyClasses) {
+  // WARNING: This MUST be big enough for the serialised JSON string.
+  const int kBufferSize = 2048;
+  char buffer[kBufferSize];
+  const char* kScript =
+      "abstract class AllStatic {\n"
+      "  AllStatic._();\n"
+      "  static int test() => 123;\n"
+      "  static int foo = 456;\n"
+      "}\n"
+      "class NotAbstract {\n"
+      "  NotAbstract._();\n"
+      "  static int test() => 123;\n"
+      "  static int foo = 456;\n"
+      "}\n"
+      "abstract class NotConstructor {\n"
+      "  void _() {}\n"
+      "  static int test() => 123;\n"
+      "}\n"
+      "abstract class NotPrivate {\n"
+      "  NotPrivate();\n"
+      "  static int test() => 123;\n"
+      "}\n"
+      "abstract class HasParams {\n"
+      "  HasParams._(int i);\n"
+      "  static int test() => 123;\n"
+      "}\n"
+      "abstract class HasFields {\n"
+      "  HasFields._();\n"
+      "  static int test() => 123;\n"
+      "  int foo = 0;\n"
+      "}\n"
+      "abstract class HasNonStaticFunction {\n"
+      "  HasNonStaticFunction._();\n"
+      "  static int test() => 123;\n"
+      "  int foo() => 456;\n"
+      "}\n"
+      "abstract class HasSubclass {\n"
+      "  HasSubclass._();\n"
+      "  static int test() => 123;\n"
+      "  static int foo = 456;\n"
+      "}\n"
+      "abstract class Subclass extends HasSubclass {\n"
+      "  Subclass() : super._();\n"
+      "}\n"
+      "void main() {\n"
+      "  AllStatic.test();\n"
+      "  NotAbstract.test();\n"
+      "  NotConstructor.test();\n"
+      "  NotPrivate.test();\n"
+      "  HasParams.test();\n"
+      "  HasFields.test();\n"
+      "  HasNonStaticFunction.test();\n"
+      "  HasSubclass.test();\n"
+      "}\n";
+
+  Library& lib = Library::Handle();
+  lib ^= ExecuteScript(kScript);
+  ASSERT(!lib.IsNull());
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
+
+  SourceReport report(SourceReport::kCoverage, SourceReport::kForceCompile);
+  JSONStream js;
+  report.PrintJSON(&js, script);
+  const char* json_str = js.ToCString();
+  ASSERT(strlen(json_str) < kBufferSize);
+  ElideJSONSubstring("classes", json_str, buffer);
+  ElideJSONSubstring("libraries", buffer, buffer);
+  EXPECT_STREQ(
+      "{\"type\":\"SourceReport\",\"ranges\":["
+
+      // Subclass() is missed.
+      "{\"scriptIndex\":0,\"startPos\":775,\"endPos\":797,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[775,794]}},"
+
+      // AllStatic.test() is hit. AllStatic._() is ignored (would be pos: 29).
+      "{\"scriptIndex\":0,\"startPos\":46,\"endPos\":70,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[46],\"misses\":[]}},"
+
+      // HasSubclass._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":656,\"endPos\":671,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[656]}},"
+
+      // HasSubclass.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":675,\"endPos\":699,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[675],\"misses\":[]}},"
+
+      // HasParams._(int i) is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":370,\"endPos\":388,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[370]}},"
+
+      // HasParams.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":392,\"endPos\":416,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[392],\"misses\":[]}},"
+
+      // NotAbstract._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":120,\"endPos\":135,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[120]}},"
+
+      // NotAbstract.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":139,\"endPos\":163,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[139],\"misses\":[]}},"
+
+      // HasFields._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":449,\"endPos\":462,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[449]}},"
+
+      // HasFields.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":466,\"endPos\":490,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[466],\"misses\":[]}},"
+
+      // NotPrivate() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":297,\"endPos\":309,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[297]}},"
+
+      // NotPrivate.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":313,\"endPos\":337,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[313],\"misses\":[]}},"
+
+      // HasNonStaticFunction._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":549,\"endPos\":573,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[549]}},"
+
+      // HasNonStaticFunction.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":577,\"endPos\":601,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[577],\"misses\":[]}},"
+
+      // HasNonStaticFunction.foo() is missed.
+      "{\"scriptIndex\":0,\"startPos\":605,\"endPos\":621,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[605]}},"
+
+      // NotConstructor._() is missed, not ignored.
+      "{\"scriptIndex\":0,\"startPos\":225,\"endPos\":235,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[225]}},"
+
+      // NotConstructor.test() is hit.
+      "{\"scriptIndex\":0,\"startPos\":239,\"endPos\":263,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[239],\"misses\":[]}},"
+
+      // Main is hit.
+      "{\"scriptIndex\":0,\"startPos\":801,\"endPos\":996,\"compiled\":true,"
+      "\"coverage\":{\"hits\":"
+      "[801,827,849,874,895,915,935,966,988],\"misses\":[]}}],"
+
+      // Only one script in the script table.
+      "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
+      buffer);
+}
+
+ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_IssueCov341_LateFinalVars) {
+  // https://github.com/dart-lang/coverage/issues/341
+  // WARNING: This MUST be big enough for the serialised JSON string.
+  const int kBufferSize = 1024;
+  char buffer[kBufferSize];
+  const char* kScript =
+      "int foo(bool bar) {\n"
+      "  late final int baz;\n"
+      "  if (bar) {\n"
+      "    baz = 123;\n"
+      "  } else {\n"
+      "    baz = 456;\n"
+      "  }\n"
+      "  return baz;\n"
+      "}\n"
+      "main() {\n"
+      "  foo(true);\n"
+      "  foo(false);\n"
+      "}\n";
+
+  Library& lib = Library::Handle();
+  lib ^= ExecuteScript(kScript);
+  ASSERT(!lib.IsNull());
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
+
+  SourceReport report(SourceReport::kCoverage, SourceReport::kForceCompile);
+  JSONStream js;
+  report.PrintJSON(&js, script);
+  const char* json_str = js.ToCString();
+  ASSERT(strlen(json_str) < kBufferSize);
+  ElideJSONSubstring("classes", json_str, buffer);
+  ElideJSONSubstring("libraries", buffer, buffer);
+  EXPECT_STREQ(
+      "{\"type\":\"SourceReport\",\"ranges\":["
+
+      // foo is hit, but the late variable sets and gets are ignored.
+      "{\"scriptIndex\":0,\"startPos\":0,\"endPos\":114,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[0],\"misses\":[]}},"
+
+      // Main is hit.
+      "{\"scriptIndex\":0,\"startPos\":116,\"endPos\":152,\"compiled\":true,\""
+      "coverage\":{\"hits\":[116,127,140],\"misses\":[]}}],"
+
+      // Only one script in the script table.
+      "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
+      buffer);
+}
+
+ISOLATE_UNIT_TEST_CASE(SourceReport_Regress95008_RedirectingFactory) {
+  // WARNING: This MUST be big enough for the serialised JSON string.
+  const int kBufferSize = 1024;
+  char buffer[kBufferSize];
+  const char* kScript = R"(
+class A {
+  A();
+  factory A.foo(int i) = B; // LINE_A
+}
+
+class B extends A {
+  int i;
+  B(this.i); // LINE_B
+}
+
+main() {
+  A.foo(42);
+}
+)";
+
+  Library& lib = Library::Handle();
+  lib ^= ExecuteScript(kScript);
+  ASSERT(!lib.IsNull());
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
+
+  SourceReport report(SourceReport::kCoverage);
+  JSONStream js;
+  report.PrintJSON(&js, script);
+  const char* json_str = js.ToCString();
+  ASSERT(strlen(json_str) < kBufferSize);
+  ElideJSONSubstring("classes", json_str, buffer);
+  ElideJSONSubstring("libraries", buffer, buffer);
+  EXPECT_STREQ(
+      "{\"type\":\"SourceReport\",\"ranges\":["
+
+      // A()
+      "{\"scriptIndex\":0,\"startPos\":13,\"endPos\":16,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[13],\"misses\":[]}},"
+
+      // B()
+      "{\"scriptIndex\":0,\"startPos\":90,\"endPos\":99,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[90],\"misses\":[]}},"
+
+      // main
+      "{\"scriptIndex\":0,\"startPos\":114,\"endPos\":136,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[114,127],\"misses\":[]}}],"
+
+      // Only one script in the script table.
+      "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
+      buffer);
+}
+
 #endif  // !PRODUCT
 
 }  // namespace dart
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 2e35cce..55eebc9 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -93,11 +93,11 @@
   compiler::target::frame_layout = default_frame_layout;
   runtime_frame_layout = default_frame_layout;
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     compiler::target::frame_layout = bare_instructions_frame_layout;
   }
 #if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     compiler::target::frame_layout = invalid_frame_layout;
     runtime_frame_layout = bare_instructions_frame_layout;
   }
@@ -105,7 +105,7 @@
 }
 
 bool StackFrame::IsBareInstructionsDartFrame() const {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     return false;
   }
   NoSafepointScope no_safepoint;
@@ -123,7 +123,7 @@
 }
 
 bool StackFrame::IsBareInstructionsStubFrame() const {
-  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+  if (!FLAG_precompiled_mode) {
     return false;
   }
   NoSafepointScope no_safepoint;
@@ -141,7 +141,7 @@
 }
 
 bool StackFrame::IsStubFrame() const {
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     return IsBareInstructionsStubFrame();
   }
 
@@ -205,13 +205,18 @@
   // helper functions to the raw object interface.
   NoSafepointScope no_safepoint;
   Code code;
-  CompressedStackMaps maps;
+
+  CompressedStackMaps::RawPayloadHandle maps;
+  CompressedStackMaps::RawPayloadHandle global_table;
+
   uword code_start;
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    maps = ReversePc::FindCompressedStackMaps(isolate_group(), pc(),
-                                              /*is_return_address=*/true,
-                                              &code_start);
+  if (FLAG_precompiled_mode) {
+    const UntaggedCompressedStackMaps::Payload* global_table_payload;
+    maps = ReversePc::FindStackMap(isolate_group(), pc(),
+                                   /*is_return_address=*/true, &code_start,
+                                   &global_table_payload);
+    global_table = global_table_payload;
   } else {
     ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
         fp() + (runtime_frame_layout.code_from_fp * kWordSize)));
@@ -221,8 +226,12 @@
     if (pc_marker->IsHeapObject() && (pc_marker->GetClassId() == kCodeCid)) {
       code ^= pc_marker;
       code_start = code.PayloadStart();
+      ASSERT(code.compressed_stackmaps() != CompressedStackMaps::null());
       maps = code.compressed_stackmaps();
-      ASSERT(!maps.IsNull());
+      if (maps.UsesGlobalTable()) {
+        global_table =
+            isolate_group()->object_store()->canonicalized_stack_map_entries();
+      }
     } else {
       ASSERT(pc_marker == Object::null());
     }
@@ -231,11 +240,8 @@
   if (!maps.IsNull()) {
     // Optimized frames have a stack map. We need to visit the frame based
     // on the stack map.
-    CompressedStackMaps global_table;
-
-    global_table =
-        isolate_group()->object_store()->canonicalized_stack_map_entries();
-    CompressedStackMaps::Iterator it(maps, global_table);
+    CompressedStackMaps::Iterator<CompressedStackMaps::RawPayloadHandle> it(
+        maps, global_table);
     const uint32_t pc_offset = pc() - code_start;
     if (it.Find(pc_offset)) {
       ObjectPtr* first = reinterpret_cast<ObjectPtr*>(sp());
@@ -290,7 +296,7 @@
     // to an osr function. In each of these cases, all stack slots contain
     // tagged pointers, so fall through.
 #if defined(DEBUG)
-    if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       ASSERT(IsStubFrame());
     } else {
       ASSERT(!code.is_optimized() ||
@@ -337,7 +343,7 @@
 
 CodePtr StackFrame::GetCodeObject() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     NoSafepointScope no_safepoint;
     CodePtr code = ReversePc::Lookup(isolate_group(), pc(),
                                      /*is_return_address=*/true);
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 1cb2a07..6303447 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -195,20 +195,18 @@
     Precompiler* precompiler = Precompiler::Instance();
 
     compiler::ObjectPoolBuilder* wrapper =
-        FLAG_use_bare_instructions && precompiler != NULL
-            ? precompiler->global_object_pool_builder()
-            : &object_pool_builder;
+        precompiler != NULL ? precompiler->global_object_pool_builder()
+                            : &object_pool_builder;
 
-    const auto pool_attachment =
-        FLAG_precompiled_mode && FLAG_use_bare_instructions
-            ? Code::PoolAttachment::kNotAttachPool
-            : Code::PoolAttachment::kAttachPool;
+    const auto pool_attachment = FLAG_precompiled_mode
+                                     ? Code::PoolAttachment::kNotAttachPool
+                                     : Code::PoolAttachment::kAttachPool;
 
     auto zone = thread->zone();
     auto object_store = thread->isolate_group()->object_store();
     auto& allocate_object_stub = Code::ZoneHandle(zone);
     auto& allocate_object_parametrized_stub = Code::ZoneHandle(zone);
-    if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    if (FLAG_precompiled_mode) {
       allocate_object_stub = object_store->allocate_object_stub();
       allocate_object_parametrized_stub =
           object_store->allocate_object_parametrized_stub();
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index 64b36a9..fa7b06b 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -127,6 +127,8 @@
   V(ExitSafepoint)                                                             \
   V(CallNativeThroughSafepoint)                                                \
   V(InitStaticField)                                                           \
+  V(InitLateStaticField)                                                       \
+  V(InitLateFinalStaticField)                                                  \
   V(InitInstanceField)                                                         \
   V(InitLateInstanceField)                                                     \
   V(InitLateFinalInstanceField)                                                \
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 673f26e..a60edfa 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -401,11 +401,6 @@
     // cases.
     if (thread->IsAtSafepoint()) {
       RELEASE_ASSERT(group->safepoint_handler()->IsOwnedByTheThread(thread));
-      // In DEBUG mode the snapshot writer also calls this method inside a
-      // safepoint.
-#if !defined(DEBUG)
-      RELEASE_ASSERT(FLAG_enable_isolate_groups || !USING_PRODUCT);
-#endif
       data = object_store->symbol_table();
       CanonicalStringSet table(&key, &value, &data);
       symbol ^= table.GetOrNull(str);
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index ee81b99..75bb968 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -16,6 +16,7 @@
 
 // One-character symbols are added implicitly.
 #define PREDEFINED_SYMBOLS_LIST(V)                                             \
+  V(AbiSpecificInteger, "AbiSpecificInteger")                                  \
   V(AbstractClassInstantiationError, "AbstractClassInstantiationError")        \
   V(AllocateInvocationMirror, "_allocateInvocationMirror")                     \
   V(AllocateInvocationMirrorForClosure, "_allocateInvocationMirrorForClosure") \
@@ -109,6 +110,7 @@
   V(ExternalOneByteString, "_ExternalOneByteString")                           \
   V(ExternalTwoByteString, "_ExternalTwoByteString")                           \
   V(FallThroughError, "FallThroughError")                                      \
+  V(FfiAbiSpecificMapping, "_FfiAbiSpecificMapping")                           \
   V(FfiBool, "Bool")                                                           \
   V(FfiCallback, "_FfiCallback")                                               \
   V(FfiDouble, "Double")                                                       \
@@ -124,6 +126,7 @@
   V(FfiIntPtr, "IntPtr")                                                       \
   V(FfiNativeFunction, "NativeFunction")                                       \
   V(FfiNativeType, "NativeType")                                               \
+  V(FfiNativeTypes, "nativeTypes")                                             \
   V(FfiPointer, "Pointer")                                                     \
   V(FfiStructLayout, "_FfiStructLayout")                                       \
   V(FfiStructLayoutArray, "_FfiInlineArray")                                   \
@@ -441,7 +444,6 @@
   V(current_position, ":current_position")                                     \
   V(dynamic_assert_assignable_stc_check,                                       \
     ":dynamic_assert_assignable_stc_check")                                    \
-  V(identityHashCode, "identityHashCode")                                      \
   V(index_temp, ":index_temp")                                                 \
   V(is_sync, ":is_sync")                                                       \
   V(isPaused, "isPaused")                                                      \
@@ -468,9 +470,11 @@
   V(vm_notify_debugger_on_exception, "vm:notify-debugger-on-exception")        \
   V(vm_recognized, "vm:recognized")                                            \
   V(vm_trace_entrypoints, "vm:testing.unsafe.trace-entrypoints-fn")            \
+  V(vm_ffi_abi_specific_mapping, "vm:ffi:abi-specific-mapping")                \
   V(vm_ffi_struct_fields, "vm:ffi:struct-fields")                              \
   V(vm_unsafe_no_interrupts, "vm:unsafe:no-interrupts")                        \
-  V(vm_external_name, "vm:external-name")
+  V(vm_external_name, "vm:external-name")                                      \
+  V(vm_testing_print_flow_graph, "vm:testing:print-flow-graph")
 
 // Contains a list of frequently used strings in a canonicalized form. This
 // list is kept in the vm_isolate in order to share the copy across isolates
diff --git a/runtime/vm/tags.cc b/runtime/vm/tags.cc
index ba981ee..483eaba 100644
--- a/runtime/vm/tags.cc
+++ b/runtime/vm/tags.cc
@@ -12,6 +12,9 @@
 
 namespace dart {
 
+MallocGrowableArray<const char*> UserTags::subscribed_tags_(4);
+Mutex* UserTags::subscribed_tags_lock_ = nullptr;
+
 const char* VMTag::TagName(uword tag) {
   if (IsNativeEntryTag(tag)) {
     const uint8_t* native_reverse_lookup = NativeEntry::ResolveSymbol(tag);
@@ -148,4 +151,55 @@
   return label.ToCString();
 }
 
+void UserTags::AddStreamableTagName(const char* tag) {
+  MutexLocker ml(subscribed_tags_lock_);
+  // Check this tag isn't already in the subscription list.
+  for (intptr_t i = 0; i < subscribed_tags_.length(); ++i) {
+    if (strcmp(tag, subscribed_tags_.At(i)) == 0) {
+      return;
+    }
+  }
+  subscribed_tags_.Add(strdup(tag));
+}
+
+void UserTags::RemoveStreamableTagName(const char* tag) {
+  MutexLocker ml(subscribed_tags_lock_);
+  bool found = false;
+  for (intptr_t i = 0; i < subscribed_tags_.length(); ++i) {
+    if (strcmp(tag, subscribed_tags_.At(i)) == 0) {
+      free(const_cast<char*>(subscribed_tags_.At(i)));
+      subscribed_tags_.RemoveAt(i);
+      found = true;
+      break;
+    }
+  }
+  ASSERT(found);
+}
+
+bool UserTags::IsTagNameStreamable(const char* tag) {
+  MutexLocker ml(subscribed_tags_lock_);
+  for (intptr_t i = 0; i < subscribed_tags_.length(); ++i) {
+    if (strcmp(tag, subscribed_tags_.At(i)) == 0) {
+      return true;
+    }
+  }
+  return false;
+}
+
+void UserTags::Init() {
+  subscribed_tags_lock_ = new Mutex();
+}
+
+void UserTags::Cleanup() {
+  {
+    MutexLocker ml(subscribed_tags_lock_);
+    for (intptr_t i = 0; i < subscribed_tags_.length(); ++i) {
+      free(const_cast<char*>(subscribed_tags_.At(i)));
+    }
+    subscribed_tags_.Clear();
+  }
+  delete subscribed_tags_lock_;
+  subscribed_tags_lock_ = nullptr;
+}
+
 }  // namespace dart
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
index 8e270ab..5343096 100644
--- a/runtime/vm/tags.h
+++ b/runtime/vm/tags.h
@@ -5,7 +5,9 @@
 #ifndef RUNTIME_VM_TAGS_H_
 #define RUNTIME_VM_TAGS_H_
 
+#include "platform/growable_array.h"
 #include "vm/allocation.h"
+#include "vm/os_thread.h"
 #include "vm/thread_stack_resource.h"
 
 namespace dart {
@@ -113,6 +115,15 @@
     return (tag_id >= kUserTagIdOffset) &&
            (tag_id < kUserTagIdOffset + kMaxUserTags);
   }
+  static void AddStreamableTagName(const char* tag);
+  static void RemoveStreamableTagName(const char* tag);
+  static bool IsTagNameStreamable(const char* tag);
+  static void Init();
+  static void Cleanup();
+
+ private:
+  static Mutex* subscribed_tags_lock_;
+  static MallocGrowableArray<const char*> subscribed_tags_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 78feea8..6efc403 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -15,6 +15,7 @@
 #include "vm/message_handler.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
 #include "vm/os_thread.h"
 #include "vm/profiler.h"
 #include "vm/runtime_entry.h"
@@ -48,6 +49,8 @@
     delete api_reusable_scope_;
     api_reusable_scope_ = NULL;
   }
+
+  DO_IF_TSAN(delete tsan_utils_);
 }
 
 #if defined(DEBUG)
@@ -86,6 +89,7 @@
       api_top_scope_(NULL),
       double_truncate_round_supported_(
           TargetCPUFeatures::double_truncate_round_supported() ? 1 : 0),
+      tsan_utils_(DO_IF_TSAN(new TsanUtils()) DO_IF_NOT_TSAN(nullptr)),
       task_kind_(kUnknownTask),
       dart_stream_(NULL),
       thread_lock_(),
@@ -723,12 +727,28 @@
                                      ValidationPolicy::kDontValidateFrames,
                                      this, cross_thread_policy);
   RestoreWriteBarrierInvariantVisitor visitor(isolate_group(), this, op);
+  ObjectStore* object_store = isolate_group()->object_store();
   bool scan_next_dart_frame = false;
   for (StackFrame* frame = frames_iterator.NextFrame(); frame != NULL;
        frame = frames_iterator.NextFrame()) {
     if (frame->IsExitFrame()) {
       scan_next_dart_frame = true;
-    } else if (frame->IsDartFrame(/*validate=*/false)) {
+    } else if (frame->IsEntryFrame()) {
+      /* Continue searching. */
+    } else if (frame->IsStubFrame()) {
+      const uword pc = frame->pc();
+      if (Code::ContainsInstructionAt(
+              object_store->init_late_static_field_stub(), pc) ||
+          Code::ContainsInstructionAt(
+              object_store->init_late_final_static_field_stub(), pc) ||
+          Code::ContainsInstructionAt(
+              object_store->init_late_instance_field_stub(), pc) ||
+          Code::ContainsInstructionAt(
+              object_store->init_late_final_instance_field_stub(), pc)) {
+        scan_next_dart_frame = true;
+      }
+    } else {
+      ASSERT(frame->IsDartFrame(/*validate=*/false));
       if (scan_next_dart_frame) {
         frame->VisitObjectPointers(&visitor);
       }
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 6824dd8..ed9e9b7 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -9,6 +9,8 @@
 #error "Should not include runtime"
 #endif
 
+#include <setjmp.h>
+
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "platform/atomic.h"
@@ -198,6 +200,8 @@
   V(uword, deoptimize_entry_, StubCode::Deoptimize().EntryPoint(), 0)          \
   V(uword, call_native_through_safepoint_entry_point_,                         \
     StubCode::CallNativeThroughSafepoint().EntryPoint(), 0)                    \
+  V(uword, jump_to_frame_entry_point_, StubCode::JumpToFrame().EntryPoint(),   \
+    0)                                                                         \
   V(uword, slow_type_test_entry_point_, StubCode::SlowTypeTest().EntryPoint(), \
     0)
 
@@ -257,6 +261,35 @@
   kNumLevels,
 };
 
+// Accessed from generated code.
+struct TsanUtils {
+  // Used to allow unwinding runtime C frames using longjmp() when throwing
+  // exceptions. This allows triggering the normal TSAN shadow stack unwinding
+  // implementation.
+  // -> See https://dartbug.com/47472#issuecomment-948235479 for details.
+  void* setjmp_function = reinterpret_cast<void*>(&setjmp);
+  jmp_buf* setjmp_buffer = nullptr;
+  uword exception_pc = 0;
+  uword exception_sp = 0;
+  uword exception_fp = 0;
+
+  static intptr_t setjmp_function_offset() {
+    return OFFSET_OF(TsanUtils, setjmp_function);
+  }
+  static intptr_t setjmp_buffer_offset() {
+    return OFFSET_OF(TsanUtils, setjmp_buffer);
+  }
+  static intptr_t exception_pc_offset() {
+    return OFFSET_OF(TsanUtils, exception_pc);
+  }
+  static intptr_t exception_sp_offset() {
+    return OFFSET_OF(TsanUtils, exception_sp);
+  }
+  static intptr_t exception_fp_offset() {
+    return OFFSET_OF(TsanUtils, exception_fp);
+  }
+};
+
 // A VM thread; may be executing Dart code or performing helper tasks like
 // garbage collection or compilation. The Thread structure associated with
 // a thread is allocated by EnsureInit before entering an isolate, and destroyed
@@ -441,6 +474,13 @@
     return OFFSET_OF(Thread, double_truncate_round_supported_);
   }
 
+  static intptr_t tsan_utils_offset() { return OFFSET_OF(Thread, tsan_utils_); }
+
+#if defined(USING_THREAD_SANITIZER)
+  uword exit_through_ffi() const { return exit_through_ffi_; }
+  TsanUtils* tsan_utils() const { return tsan_utils_; }
+#endif  // defined(USING_THREAD_SANITIZER)
+
   // The isolate that this thread is operating on, or nullptr if none.
   Isolate* isolate() const { return isolate_; }
   static intptr_t isolate_offset() { return OFFSET_OF(Thread, isolate_); }
@@ -474,8 +514,10 @@
   // Has |this| exited Dart code?
   bool HasExitedDartCode() const;
 
+  bool HasCompilerState() const { return compiler_state_ != nullptr; }
+
   CompilerState& compiler_state() {
-    ASSERT(compiler_state_ != nullptr);
+    ASSERT(HasCompilerState());
     return *compiler_state_;
   }
 
@@ -988,6 +1030,7 @@
   void InitVMConstants();
 
   Random* random() { return &thread_random_; }
+  static intptr_t random_offset() { return OFFSET_OF(Thread, thread_random_); }
 
   uint64_t* GetFfiMarshalledArguments(intptr_t size) {
     if (ffi_marshalled_arguments_size_ < size) {
@@ -1096,6 +1139,9 @@
   uword exit_through_ffi_ = 0;
   ApiLocalScope* api_top_scope_;
   uint8_t double_truncate_round_supported_;
+  ALIGN8 Random thread_random_;
+
+  TsanUtils* tsan_utils_ = nullptr;
 
   // ---- End accessed from generated code. ----
 
@@ -1133,8 +1179,6 @@
 
   ErrorPtr sticky_error_;
 
-  Random thread_random_;
-
   intptr_t ffi_marshalled_arguments_size_ = 0;
   uint64_t* ffi_marshalled_arguments_;
 
diff --git a/runtime/vm/thread_barrier.h b/runtime/vm/thread_barrier.h
index 0b422f7..810a711 100644
--- a/runtime/vm/thread_barrier.h
+++ b/runtime/vm/thread_barrier.h
@@ -46,71 +46,55 @@
 //
 class ThreadBarrier {
  public:
-  explicit ThreadBarrier(intptr_t num_threads,
-                         Monitor* monitor,
-                         Monitor* done_monitor)
-      : num_threads_(num_threads),
-        monitor_(monitor),
-        remaining_(num_threads),
-        parity_(false),
-        done_monitor_(done_monitor),
-        done_(false) {
-    ASSERT(remaining_ > 0);
+  explicit ThreadBarrier(intptr_t num_threads, intptr_t initial = 0)
+      : ref_count_(num_threads),
+        monitor_(),
+        participating_(initial),
+        remaining_(initial),
+        generation_(0) {}
+
+  bool TryEnter() {
+    MonitorLocker ml(&monitor_);
+    if (generation_ != 0) {
+      return false;
+    }
+    remaining_++;
+    participating_++;
+    return true;
   }
 
   void Sync() {
-    MonitorLocker ml(monitor_);
-    ASSERT(remaining_ > 0);
-    if (--remaining_ > 0) {
-      // I'm not last to arrive; wait until next round.
-      bool old_parity = parity_;
-      while (parity_ == old_parity) {
+    MonitorLocker ml(&monitor_);
+    const intptr_t g = generation_;
+    remaining_--;
+    if (remaining_ == 0) {
+      // I'm last, advance to the next generation and wake the others.
+      generation_++;
+      remaining_ = participating_;
+      ml.NotifyAll();
+    } else {
+      // Waiting for others.
+      while (g == generation_) {
         ml.Wait();
       }
-    } else {
-      // Last one to arrive initiates the next round.
-      remaining_ = num_threads_;
-      parity_ = !parity_;
-      // Tell everyone else about the new round.
-      ml.NotifyAll();
     }
   }
 
-  void Exit() {
-    bool last = false;
-    {
-      MonitorLocker ml(monitor_);
-      ASSERT(remaining_ > 0);
-      last = (--remaining_ == 0);
+  void Release() {
+    intptr_t old = ref_count_.fetch_sub(1, std::memory_order_acq_rel);
+    ASSERT(old > 0);
+    if (old == 1) {
+      delete this;
     }
-    if (last) {
-      // Last one to exit sets done_.
-      MonitorLocker ml(done_monitor_);
-      ASSERT(!done_);
-      done_ = true;
-      // Tell the destructor in case it's already waiting.
-      ml.Notify();
-    }
-  }
-
-  ~ThreadBarrier() {
-    MonitorLocker ml(done_monitor_);
-    // Wait for everyone to exit before destroying the monitors.
-    while (!done_) {
-      ml.Wait();
-    }
-    ASSERT(remaining_ == 0);
   }
 
  private:
-  const intptr_t num_threads_;
+  std::atomic<intptr_t> ref_count_;
 
-  Monitor* monitor_;
+  Monitor monitor_;
+  intptr_t participating_;
   intptr_t remaining_;
-  bool parity_;
-
-  Monitor* done_monitor_;  // TODO(koda): Try to optimize this away.
-  bool done_;
+  intptr_t generation_;
 
   DISALLOW_COPY_AND_ASSIGN(ThreadBarrier);
 };
diff --git a/runtime/vm/thread_barrier_test.cc b/runtime/vm/thread_barrier_test.cc
index c937eeb2..48e4020 100644
--- a/runtime/vm/thread_barrier_test.cc
+++ b/runtime/vm/thread_barrier_test.cc
@@ -20,7 +20,7 @@
       RandomSleep();
       barrier_->Sync();
     }
-    barrier_->Exit();
+    barrier_->Release();
   }
 
  private:
@@ -40,21 +40,14 @@
   static const intptr_t kNumTasks = 5;
   static const intptr_t kNumRounds = 500;
 
-  Monitor* monitor = new Monitor();
-  Monitor* monitor_done = new Monitor();
-  {
-    ThreadBarrier barrier(kNumTasks + 1, monitor, monitor_done);
-    for (intptr_t i = 0; i < kNumTasks; ++i) {
-      Dart::thread_pool()->Run<FuzzTask>(kNumRounds, &barrier, i + 1);
-    }
-    for (intptr_t i = 0; i < kNumRounds; ++i) {
-      barrier.Sync();
-    }
-    barrier.Exit();
+  ThreadBarrier* barrier = new ThreadBarrier(kNumTasks + 1, kNumTasks + 1);
+  for (intptr_t i = 0; i < kNumTasks; ++i) {
+    Dart::thread_pool()->Run<FuzzTask>(kNumRounds, barrier, i + 1);
   }
-
-  delete monitor_done;
-  delete monitor;
+  for (intptr_t i = 0; i < kNumRounds; ++i) {
+    barrier->Sync();
+  }
+  barrier->Release();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/thread_pool.cc b/runtime/vm/thread_pool.cc
index 93df2ff..f450555 100644
--- a/runtime/vm/thread_pool.cc
+++ b/runtime/vm/thread_pool.cc
@@ -82,6 +82,22 @@
 }
 
 bool ThreadPool::RunImpl(std::unique_ptr<Task> task) {
+  Dart_PostTaskCallback post_task = Dart::post_task_callback();
+  if (post_task != nullptr) {
+    {
+      MonitorLocker ml(&pool_monitor_);
+      if (shutting_down_) {
+        return false;
+      }
+    }
+    Dart_TaskData data;
+    data.priority = Dart_TaskPriority_Default;
+    data.time_point = 0;
+    post_task(Dart::post_task_data(),
+              reinterpret_cast<Dart_Task>(task.release()), data);
+    return true;
+  }
+
   Worker* new_worker = nullptr;
   {
     MonitorLocker ml(&pool_monitor_);
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index ab0d62a..13f4ab9 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -349,14 +349,16 @@
                                             va_list args) {
   ASSERT(i >= 0);
   ASSERT(i < length_);
-  va_list args2;
-  va_copy(args2, args);
-  intptr_t len = Utils::VSNPrint(NULL, 0, fmt, args);
-  va_end(args);
+  va_list measure_args;
+  va_copy(measure_args, args);
+  intptr_t len = Utils::VSNPrint(NULL, 0, fmt, measure_args);
+  va_end(measure_args);
 
   char* buffer = reinterpret_cast<char*>(malloc(len + 1));
-  Utils::VSNPrint(buffer, (len + 1), fmt, args2);
-  va_end(args2);
+  va_list print_args;
+  va_copy(print_args, args);
+  Utils::VSNPrint(buffer, (len + 1), fmt, print_args);
+  va_end(print_args);
 
   SetArgument(i, name, buffer);
 }
@@ -546,6 +548,7 @@
   va_list args;
   va_start(args, fmt);
   arguments_.FormatArgument(i, name, fmt, args);
+  va_end(args);
 }
 
 void TimelineEvent::Complete() {
@@ -846,6 +849,7 @@
   va_list args;
   va_start(args, fmt);
   arguments_.FormatArgument(i, name, fmt, args);
+  va_end(args);
 }
 
 void TimelineEventScope::StealArguments(TimelineEvent* event) {
@@ -1441,7 +1445,9 @@
   JSONArray events(js);
   for (intptr_t i = 0; i < length(); i++) {
     const TimelineEvent* event = At(i);
-    events.AddValue(event);
+    if (event->IsValid()) {
+      events.AddValue(event);
+    }
   }
 }
 #endif
diff --git a/runtime/vm/token_position.cc b/runtime/vm/token_position.cc
index 14f7058..88b27c1 100644
--- a/runtime/vm/token_position.cc
+++ b/runtime/vm/token_position.cc
@@ -21,6 +21,19 @@
   return static_cast<int32_t>(value_);
 }
 
+intptr_t TokenPosition::EncodeCoveragePosition(bool is_branch_coverage) {
+  // Normal coverage positions are encoded as 2 * pos, and branch coverage are
+  // encoded as 2 * pos + 1.
+  intptr_t encoded_position = 2 * static_cast<intptr_t>(value_);
+  return is_branch_coverage ? encoded_position + 1 : encoded_position;
+}
+
+TokenPosition TokenPosition::DecodeCoveragePosition(intptr_t encoded_position,
+                                                    bool* is_branch_coverage) {
+  *is_branch_coverage = ((encoded_position % 2) == 1);
+  return TokenPosition(encoded_position / 2);
+}
+
 #define DEFINE_VALUES(name, value)                                             \
   const TokenPosition TokenPosition::k##name(value);
 SENTINEL_TOKEN_DESCRIPTORS(DEFINE_VALUES);
diff --git a/runtime/vm/token_position.h b/runtime/vm/token_position.h
index 8dcf100..6778726 100644
--- a/runtime/vm/token_position.h
+++ b/runtime/vm/token_position.h
@@ -202,6 +202,13 @@
     return TokenPosition((kLastPos - 1) - value);
   }
 
+  // Encode the token position for storage in the coverage array.
+  intptr_t EncodeCoveragePosition(bool is_branch_coverage);
+
+  // Decode a token position that was stored in the coverage array.
+  static TokenPosition DecodeCoveragePosition(intptr_t encoded_position,
+                                              bool* is_branch_coverage);
+
   const char* ToCString() const;
 
  private:
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 6b1780f..785e536 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -255,7 +255,7 @@
   ASSERT(!type_class.IsNull());
 
   auto& slow_tts_stub = Code::ZoneHandle(zone);
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (FLAG_precompiled_mode) {
     slow_tts_stub = thread->isolate_group()->object_store()->slow_tts_stub();
   }
 
@@ -273,9 +273,8 @@
 
             const char* name = namer_.StubNameForType(type);
             const auto pool_attachment =
-                FLAG_use_bare_instructions
-                    ? Code::PoolAttachment::kNotAttachPool
-                    : Code::PoolAttachment::kAttachPool;
+                FLAG_precompiled_mode ? Code::PoolAttachment::kNotAttachPool
+                                      : Code::PoolAttachment::kAttachPool;
 
             Code& code = Code::Handle(thread->zone());
             auto install_code_fun = [&]() {
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index e96548eb7..a2478ad 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -667,7 +667,7 @@
   return Api::NewHandle(thread, val.ptr());
 }
 
-#if !defined(PRODUCT)
+#if !defined(PRODUCT) && defined(TARGET_ARCH_IA32)
 static bool IsHex(int c) {
   return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f');
 }
@@ -695,6 +695,8 @@
   code_.set_owner(function);
   code_.set_exception_handlers(Object::empty_exception_handlers());
 #ifndef PRODUCT
+  // Disassemble relative since code addresses are not stable from run to run.
+  SetFlagScope<bool> sfs(&FLAG_disassemble_relative, true);
   uword start = code_.PayloadStart();
   if (FLAG_disassemble) {
     OS::PrintErr("Code for test '%s' {\n", name_);
@@ -703,7 +705,9 @@
   }
   Disassembler::Disassemble(start, start + assembler_->CodeSize(), disassembly_,
                             DISASSEMBLY_SIZE);
-  // Blank out big hex constants, since they are not stable from run to run.
+#if defined(TARGET_ARCH_IA32)
+  // Blank out absolute addressing constants, since they are not stable from run
+  // to run.
   bool in_hex_constant = false;
   for (char* p = disassembly_; *p != '\0'; p++) {
     if (in_hex_constant) {
@@ -713,13 +717,14 @@
         in_hex_constant = false;
       }
     } else {
-      if (*p == '0' && *(p + 1) == 'x' && IsHex(*(p + 2)) && IsHex(*(p + 3)) &&
+      if (*p == '[' && *(p + 1) == '0' && *(p + 2) == 'x' && IsHex(*(p + 3)) &&
           IsHex(*(p + 4))) {
-        p++;
+        p += 2;
         in_hex_constant = true;
       }
     }
   }
+#endif  // TARGET_ARCH_IA32
 #endif  // !PRODUCT
 }
 
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 7bc9f23..bc86b9e 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -587,8 +587,8 @@
   // Assemble test and set code_.
   void Assemble();
 
-  // Disassembly of the code with large constants blanked out.
-  char* BlankedDisassembly() { return disassembly_; }
+  // Disassembly of the code with relative branch/jump targets.
+  char* RelativeDisassembly() { return disassembly_; }
 
  private:
   const char* name_;
diff --git a/runtime/vm/v8_snapshot_writer.cc b/runtime/vm/v8_snapshot_writer.cc
index 1a224df..2aaf1cb 100644
--- a/runtime/vm/v8_snapshot_writer.cc
+++ b/runtime/vm/v8_snapshot_writer.cc
@@ -279,6 +279,7 @@
   va_list args;
   va_start(args, fmt);
   const char* str = OS::VSCreate(zone_, fmt, args);
+  va_end(args);
   if (auto const kv = index_map_.Lookup(str)) {
     return kv->value;
   }
diff --git a/runtime/vm/virtual_memory_posix.cc b/runtime/vm/virtual_memory_posix.cc
index b2717df..72235ff 100644
--- a/runtime/vm/virtual_memory_posix.cc
+++ b/runtime/vm/virtual_memory_posix.cc
@@ -138,7 +138,7 @@
         nullptr, PROT_NONE, allocated_size, kCompressedHeapPageSize,
         allocated_size + kCompressedHeapPageSize,
         MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE);
-    if (address == MAP_FAILED) continue;
+    if (address == nullptr) continue;
 
     MemoryRegion region(address, allocated_size);
     region = ClipToAlignedRegion(region, kCompressedHeapAlignment);
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index 0574603..6525627 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -6,6 +6,8 @@
 # Run dartanalyzer.dart on the Dart VM. This script assumes the Dart repo's
 # directory structure.
 
+echo "Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'." 1>&2
+
 function follow_links() {
   file="$1"
   while [ -h "$file" ]; do
diff --git a/sdk/bin/dartanalyzer.bat b/sdk/bin/dartanalyzer.bat
index efa3a6a..122e9b3 100644
--- a/sdk/bin/dartanalyzer.bat
+++ b/sdk/bin/dartanalyzer.bat
@@ -3,6 +3,8 @@
 REM for details. All rights reserved. Use of this source code is governed by a
 REM BSD-style license that can be found in the LICENSE file.
 
+echo Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'. 1>&2
+
 setlocal
 rem Handle the case where dart-sdk/bin has been symlinked to.
 set DIR_NAME_WITH_SLASH=%~dp0
diff --git a/sdk/bin/dartanalyzer_sdk b/sdk/bin/dartanalyzer_sdk
index 88f4deb..bb7b84a 100755
--- a/sdk/bin/dartanalyzer_sdk
+++ b/sdk/bin/dartanalyzer_sdk
@@ -6,6 +6,8 @@
 # Run dartanalyzer.dart on the Dart VM. This script assumes the Dart SDK's
 # directory structure.
 
+echo "Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'." 1>&2
+
 function follow_links() {
   file="$1"
   while [ -h "$file" ]; do
diff --git a/sdk/bin/dartanalyzer_sdk.bat b/sdk/bin/dartanalyzer_sdk.bat
index 57dd538..7b1e03b 100644
--- a/sdk/bin/dartanalyzer_sdk.bat
+++ b/sdk/bin/dartanalyzer_sdk.bat
@@ -3,6 +3,8 @@
 REM for details. All rights reserved. Use of this source code is governed by a
 REM BSD-style license that can be found in the LICENSE file.
 
+echo Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'. 1>&2
+
 setlocal
 rem Handle the case where dart-sdk/bin has been symlinked to.
 set DIR_NAME_WITH_SLASH=%~dp0
diff --git a/sdk/bin/dartdoc b/sdk/bin/dartdoc
index e9584c1..b7817c8 100755
--- a/sdk/bin/dartdoc
+++ b/sdk/bin/dartdoc
@@ -3,6 +3,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.
 
+echo "Warning: 'dartdoc' is deprecated. Please use 'dart doc'." 1>&2
+
 function follow_links() {
   file="$1"
   while [ -h "$file" ]; do
@@ -23,4 +25,4 @@
 
 # We are running the snapshot in the built SDK.
 DART="$BIN_DIR/dart"
-exec "$DART" "--packages=$BIN_DIR/resources/dartdoc/.packages" "$SNAPSHOT" "$@"
+exec "$DART" "--packages=$BIN_DIR/resources/dartdoc/.packages" "$SNAPSHOT" "--resources-dir=$BIN_DIR/resources/dartdoc/resources/" "$@"
diff --git a/sdk/bin/dartdoc.bat b/sdk/bin/dartdoc.bat
index 876eb0e..ea32a87 100644
--- a/sdk/bin/dartdoc.bat
+++ b/sdk/bin/dartdoc.bat
@@ -3,6 +3,8 @@
 REM for details. All rights reserved. Use of this source code is governed by a
 REM BSD-style license that can be found in the LICENSE file.
 
+echo Warning: 'dartdoc' is deprecated. Please use 'dart doc'. 1>&2
+
 setlocal
 rem Handle the case where dart-sdk/bin has been symlinked to.
 set DIR_NAME_WITH_SLASH=%~dp0
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index b63102a..fdb4de0 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -1715,8 +1715,39 @@
   /// following the redirect.
   ///
   /// All headers added to the request will be added to the redirection
-  /// request(s). However, any body send with the request will not be
-  /// part of the redirection request(s).
+  /// request(s) except when forwarding sensitive headers like
+  /// "Authorization", "WWW-Authenticate", and "Cookie". Those headers
+  /// will be skipped if following a redirect to a domain that is not a
+  /// subdomain match or exact match of the initial domain.
+  /// For example, a redirect from "foo.com" to either "foo.com" or
+  /// "sub.foo.com" will forward the sensitive headers, but a redirect to
+  /// "bar.com" will not.
+  ///
+  /// Any body send with the request will not be part of the redirection
+  /// request(s).
+  ///
+  /// For precise control of redirect handling, set this property to `false`
+  /// and make a separate HTTP request to process the redirect. For example:
+  ///
+  /// ```dart
+  /// final client = HttpClient();
+  /// var uri = Uri.parse("http://localhost/");
+  /// var request = await client.getUrl(uri);
+  /// request.followRedirects = false;
+  /// var response = await request.close();
+  /// while (response.isRedirect) {
+  ///   response.drain();
+  ///   final location = response.headers.value(HttpHeaders.locationHeader);
+  ///   if (location != null) {
+  ///     uri = uri.resolve(location);
+  ///     request = await client.getUrl(uri);
+  ///     // Set the body or headers as desired.
+  ///     request.followRedirects = false;
+  ///     response = await request.close();
+  ///   }
+  /// }
+  /// // Do something with the final response.
+  /// ```
   bool followRedirects = true;
 
   /// Set this property to the maximum number of redirects to follow
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 6c9c786..622c662 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -667,7 +667,7 @@
       }
     }
     return _httpClient
-        ._openUrlFromRequest(method, url, _httpRequest)
+        ._openUrlFromRequest(method, url, _httpRequest, isRedirect: true)
         .then((request) {
       request._responseRedirects
         ..addAll(redirects)
@@ -751,7 +751,8 @@
       return drain().then((_) {
         return _httpClient
             ._openUrlFromRequest(
-                _httpRequest.method, _httpRequest.uri, _httpRequest)
+                _httpRequest.method, _httpRequest.uri, _httpRequest,
+                isRedirect: false)
             .then((request) => request.close());
       });
     }
@@ -2715,8 +2716,31 @@
     });
   }
 
+  static bool _isSubdomain(Uri subdomain, Uri domain) {
+    return (subdomain.scheme == domain.scheme &&
+        subdomain.port == domain.port &&
+        (subdomain.host == domain.host ||
+            subdomain.host.endsWith("." + domain.host)));
+  }
+
+  static bool _shouldCopyHeaderOnRedirect(
+      String headerKey, Uri originalUrl, Uri redirectUri) {
+    if (_isSubdomain(redirectUri, originalUrl)) {
+      return true;
+    }
+
+    const nonRedirectHeaders = [
+      "authorization",
+      "www-authenticate",
+      "cookie",
+      "cookie2"
+    ];
+    return !nonRedirectHeaders.contains(headerKey.toLowerCase());
+  }
+
   Future<_HttpClientRequest> _openUrlFromRequest(
-      String method, Uri uri, _HttpClientRequest previous) {
+      String method, Uri uri, _HttpClientRequest previous,
+      {required bool isRedirect}) {
     // If the new URI is relative (to either '/' or some sub-path),
     // construct a full URI from the previous one.
     Uri resolved = previous.uri.resolveUri(uri);
@@ -2728,7 +2752,9 @@
         ..maxRedirects = previous.maxRedirects;
       // Copy headers.
       for (var header in previous.headers._headers.keys) {
-        if (request.headers[header] == null) {
+        if (request.headers[header] == null &&
+            (!isRedirect ||
+                _shouldCopyHeaderOnRedirect(header, resolved, previous.uri))) {
           request.headers.set(header, previous.headers[header]!);
         }
       }
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart
index 2a991c9..b9cf805 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart
@@ -195,11 +195,6 @@
   }
 }
 
-@patch
-void _rethrow(Object error, StackTrace stackTrace) {
-  JS('', 'throw #', dart.createErrorWithStack(error, stackTrace));
-}
-
 /// Used by the compiler to implement `async*` functions.
 ///
 /// This is inspired by _AsyncStarStreamController in dart-lang/sdk's
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
index e07844b..6b133cb 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -282,6 +282,12 @@
 
   @patch
   StackTrace? get stackTrace => dart.stackTraceForError(this);
+
+  @patch
+  static Never _throw(Object error, StackTrace stackTrace) {
+    JS("", "throw #", dart.createErrorWithStack(error, stackTrace));
+    throw "unreachable";
+  }
 }
 
 @patch
@@ -592,9 +598,7 @@
   }
 
   static String _stringFromJSArray(
-      /*=JSArray<int>*/ list,
-      int start,
-      int? endOrNull) {
+      /*=JSArray<int>*/ list, int start, int? endOrNull) {
     int len = list.length;
     int end = RangeError.checkValidRange(start, endOrNull, len);
     if (start > 0 || end < len) {
@@ -2901,7 +2905,7 @@
    * The [radix] argument must be an integer in the range 2 to 36.
    */
   String toRadixString(int radix) {
-    if (radix > 36) throw RangeError.range(radix, 2, 36);
+    if (radix < 2 || radix > 36) throw RangeError.range(radix, 2, 36);
 
     if (_used == 0) return "0";
 
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
index 4960213..413116c 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
@@ -475,13 +475,13 @@
 class RawSocket {
   @patch
   static Future<RawSocket> connect(dynamic host, int port,
-      {dynamic sourceAddress, Duration? timeout}) {
+      {dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) {
     throw UnsupportedError("RawSocket constructor");
   }
 
   @patch
   static Future<ConnectionTask<RawSocket>> startConnect(dynamic host, int port,
-      {dynamic sourceAddress}) {
+      {dynamic sourceAddress, int sourcePort = 0}) {
     throw UnsupportedError("RawSocket constructor");
   }
 }
@@ -490,13 +490,13 @@
 class Socket {
   @patch
   static Future<Socket> _connect(dynamic host, int port,
-      {dynamic sourceAddress, Duration? timeout}) {
+      {dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) {
     throw UnsupportedError("Socket constructor");
   }
 
   @patch
   static Future<ConnectionTask<Socket>> _startConnect(dynamic host, int port,
-      {dynamic sourceAddress}) {
+      {dynamic sourceAddress, int sourcePort = 0}) {
     throw UnsupportedError("Socket constructor");
   }
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/js_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/js_patch.dart
index 033b303..96a972f 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/js_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/js_patch.dart
@@ -9,7 +9,7 @@
 
 import 'dart:_js_helper' show patch, NoReifyGeneric, Primitives;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show JavaScriptObject;
+import 'dart:_interceptors' show LegacyJavaScriptObject;
 import 'dart:_runtime' as dart;
 
 @patch
@@ -368,7 +368,8 @@
     int ms = JS('!', '#.getTime()', o);
     return DateTime.fromMillisecondsSinceEpoch(ms);
   } else if (o is _DartObject &&
-      !identical(dart.getReifiedType(o), dart.typeRep<JavaScriptObject>())) {
+      !identical(
+          dart.getReifiedType(o), dart.typeRep<LegacyJavaScriptObject>())) {
     return o._dartObj;
   } else {
     return _wrapToDart(o);
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/rtti.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/rtti.dart
index 9e99b26..f359d52 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/rtti.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/rtti.dart
@@ -92,13 +92,13 @@
         return JS('', '#.constructor', obj);
       }
       var result = JS('', '#[#]', obj, _extensionType);
-      if (result == null) return typeRep<JavaScriptObject>();
+      if (result == null) return typeRep<LegacyJavaScriptObject>();
       return result;
     case "function":
       // All Dart functions and callable classes must set _runtimeType
       var result = JS('', '#[#]', obj, _runtimeType);
       if (result != null) return result;
-      return typeRep<JavaScriptObject>();
+      return typeRep<LegacyJavaScriptObject>();
     case "undefined":
       return JS('', '#', Null);
     case "number":
@@ -109,7 +109,7 @@
       return JS('', '#', String);
     case "symbol":
     default:
-      return typeRep<JavaScriptObject>();
+      return typeRep<LegacyJavaScriptObject>();
   }
 }
 
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
index 6ff9de7..af599c3 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/runtime.dart
@@ -11,13 +11,12 @@
 import 'dart:_debugger' show stackTraceMapper, trackCall;
 import 'dart:_foreign_helper' show JS, JSExportName, rest, spread;
 import 'dart:_interceptors'
-    show JSArray, jsNull, JSFunction, NativeError, JavaScriptObject;
+    show JSArray, jsNull, JSFunction, NativeError, LegacyJavaScriptObject;
 import 'dart:_internal' as internal show LateError, Symbol;
 import 'dart:_js_helper'
     show
         AssertionErrorImpl,
         BooleanConversionAssertionError,
-        CastErrorImpl,
         DartIterator,
         DeferredNotLoadedError,
         TypeErrorImpl,
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index 9904b5c..9452ed3 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -164,7 +164,7 @@
 
 @notNull
 bool _isJsObject(obj) =>
-    JS('!', '# === #', getReifiedType(obj), typeRep<JavaScriptObject>());
+    JS('!', '# === #', getReifiedType(obj), typeRep<LegacyJavaScriptObject>());
 
 /// Asserts that [f] is a native JS functions and returns it if so.
 ///
@@ -1503,16 +1503,17 @@
     }
 
     // Even though lazy and anonymous JS types are natural subtypes of
-    // JavaScriptObject, JS types should be treated as mutual subtypes of each
-    // other. This allows users to be able to interface with both extension
-    // types on JavaScriptObject and package:js using the same object.
+    // LegacyJavaScriptObject, JS types should be treated as mutual subtypes of
+    // each other. This allows users to be able to interface with both extension
+    // types on LegacyJavaScriptObject and package:js using the same object.
     //
     // Therefore, the following relationships hold true:
     //
-    // JavaScriptObject <: package:js types
-    // package:js types <: JavaScriptObject
+    // LegacyJavaScriptObject <: package:js types
+    // package:js types <: LegacyJavaScriptObject
 
-    if (_isInterfaceSubtype(t1, typeRep<JavaScriptObject>(), strictMode) &&
+    if (_isInterfaceSubtype(
+            t1, typeRep<LegacyJavaScriptObject>(), strictMode) &&
         // TODO: Since package:js types are instances of PackageJSType and
         // we don't have a mechanism to determine if *some* package:js type
         // implements t2. This will possibly require keeping a map of these
@@ -1522,7 +1523,8 @@
       return true;
     }
 
-    if (_isInterfaceSubtype(typeRep<JavaScriptObject>(), t2, strictMode) &&
+    if (_isInterfaceSubtype(
+            typeRep<LegacyJavaScriptObject>(), t2, strictMode) &&
         _isInterfaceSubtype(t1, _pkgJSTypeForSubtyping, strictMode)) {
       return true;
     }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
index 01921c0..8e700e5 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
@@ -81,14 +81,21 @@
 /// interop library.
 abstract class JSObject {}
 
+/// Superclass of all interop objects and native types defined in the web
+/// libraries.
+///
+/// This is the class static interop classes erase to and the class interop
+/// extension types should use as the on-type.
+class JavaScriptObject extends Interceptor {
+  const JavaScriptObject();
+}
+
 /// Interceptor base class for JavaScript objects not recognized as some more
 /// specific native type.
-
-/// Unlike dart2js, ddc does not intercept JS objects, so this is only used as
-/// an on-type for JS interop extension types. All JS interop objects should be
-/// castable to this type.
-abstract class JavaScriptObject extends Interceptor implements JSObject {
-  const JavaScriptObject();
+///
+/// Note that this used to be `JavaScriptObject`.
+class LegacyJavaScriptObject extends JavaScriptObject implements JSObject {
+  const LegacyJavaScriptObject();
 }
 
 /// Interceptor for plain JavaScript objects created as JavaScript object
@@ -96,7 +103,7 @@
 ///
 /// Note that this isn't being used today in ddc. Instead of using interceptors,
 /// we have other type logic to distinguish JS types.
-class PlainJavaScriptObject extends JavaScriptObject {
+class PlainJavaScriptObject extends LegacyJavaScriptObject {
   const PlainJavaScriptObject();
 }
 
@@ -106,7 +113,7 @@
 /// This class also serves as a fallback for unknown JavaScript exceptions.
 /// Note that this isn't being used today in ddc. Instead of using interceptors,
 /// we have other type logic to distinguish JS types.
-class UnknownJavaScriptObject extends JavaScriptObject {
+class UnknownJavaScriptObject extends LegacyJavaScriptObject {
   const UnknownJavaScriptObject();
 }
 
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
index c32af9b..3fc8f51 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -699,15 +699,6 @@
   String toString() => _message;
 }
 
-/// Thrown by the 'as' operator if the cast isn't valid.
-class CastErrorImpl extends Error implements CastError, TypeError {
-  final String _message;
-
-  CastErrorImpl(this._message);
-
-  String toString() => _message;
-}
-
 class FallThroughErrorImplementation extends FallThroughError {
   String toString() => "Switch case fall-through.";
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index 293a271..4888baf 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -704,10 +704,3 @@
   Iterator<T> get iterator =>
       new _SyncStarIterator<T>(JS('', '#()', _outerHelper));
 }
-
-@patch
-void _rethrow(Object error, StackTrace stackTrace) {
-  error = wrapException(error);
-  JS('void', '#.stack = #', error, stackTrace.toString());
-  JS('void', 'throw #', error);
-}
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index 5726f96..6d4d129 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -22,7 +22,8 @@
         Primitives,
         quoteStringForRegExp,
         getTraceFromException,
-        RuntimeError;
+        RuntimeError,
+        wrapException;
 
 import 'dart:_foreign_helper' show JS;
 import 'dart:_native_typed_data' show NativeUint8List;
@@ -187,6 +188,14 @@
 
   @patch
   StackTrace? get stackTrace => Primitives.extractStackTrace(this);
+
+  @patch
+  static Never _throw(Object error, StackTrace stackTrace) {
+    error = wrapException(error);
+    JS('void', '#.stack = #', error, stackTrace.toString());
+    JS('', 'throw #', error);
+    throw "unreachable";
+  }
 }
 
 @patch
@@ -2807,7 +2816,7 @@
   ///
   /// The [radix] argument must be an integer in the range 2 to 36.
   String toRadixString(int radix) {
-    if (radix > 36) throw new RangeError.range(radix, 2, 36);
+    if (radix < 2 || radix > 36) throw RangeError.range(radix, 2, 36);
 
     if (_used == 0) return "0";
 
diff --git a/sdk/lib/_internal/js_runtime/lib/interceptors.dart b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
index 5a062ab..bda0ac3 100644
--- a/sdk/lib/_internal/js_runtime/lib/interceptors.dart
+++ b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
@@ -399,16 +399,28 @@
   operator []=(int index, E value);
 }
 
-/// The interface implemented by JavaScript objects.  These are methods in
-/// addition to the regular Dart Object methods like [Object.hashCode].
+/// The interface implemented by JavaScript objects.
 ///
-/// This is the type that should be exported by a JavaScript interop library.
+/// These are methods in addition to the regular Dart Object methods like
+/// [Object.hashCode]. This is the type that should be exported by a JavaScript
+/// interop library.
 abstract class JSObject {}
 
+/// Superclass of all interop objects and native types defined in the web
+/// libraries.
+///
+/// This is the class static interop classes erase to and the class interop
+/// extension types should use as the on-type.
+class JavaScriptObject extends Interceptor {
+  const JavaScriptObject();
+}
+
 /// Interceptor base class for JavaScript objects not recognized as some more
 /// specific native type.
-class JavaScriptObject extends Interceptor implements JSObject {
-  const JavaScriptObject();
+///
+/// Note that this used to be `JavaScriptObject`.
+class LegacyJavaScriptObject extends JavaScriptObject implements JSObject {
+  const LegacyJavaScriptObject();
 
   // It would be impolite to stash a property on the object.
   int get hashCode => 0;
@@ -421,7 +433,7 @@
 
 /// Interceptor for plain JavaScript objects created as JavaScript object
 /// literals or `new Object()`.
-class PlainJavaScriptObject extends JavaScriptObject {
+class PlainJavaScriptObject extends LegacyJavaScriptObject {
   const PlainJavaScriptObject();
 }
 
@@ -429,7 +441,7 @@
 /// non-trivial prototype chain.
 ///
 /// This class also serves as a fallback for unknown JavaScript exceptions.
-class UnknownJavaScriptObject extends JavaScriptObject {
+class UnknownJavaScriptObject extends LegacyJavaScriptObject {
   const UnknownJavaScriptObject();
 }
 
@@ -437,7 +449,7 @@
 /// been converted to JavaScript functions.
 /// These interceptor methods are not always used as the JavaScript function
 /// object has also been mangled to support Dart function calling conventions.
-class JavaScriptFunction extends JavaScriptObject implements Function {
+class JavaScriptFunction extends LegacyJavaScriptObject implements Function {
   const JavaScriptFunction();
 
   String toString() {
diff --git a/sdk/lib/_internal/js_runtime/lib/io_patch.dart b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
index 6a88d0f..ae50e7b 100644
--- a/sdk/lib/_internal/js_runtime/lib/io_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
@@ -475,13 +475,13 @@
 class RawSocket {
   @patch
   static Future<RawSocket> connect(dynamic host, int port,
-      {dynamic sourceAddress, Duration? timeout}) {
+      {dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) {
     throw new UnsupportedError("RawSocket constructor");
   }
 
   @patch
   static Future<ConnectionTask<RawSocket>> startConnect(dynamic host, int port,
-      {dynamic sourceAddress}) {
+      {dynamic sourceAddress, int sourcePort = 0}) {
     throw new UnsupportedError("RawSocket constructor");
   }
 }
@@ -490,13 +490,13 @@
 class Socket {
   @patch
   static Future<Socket> _connect(dynamic host, int port,
-      {dynamic sourceAddress, Duration? timeout}) {
+      {dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) {
     throw new UnsupportedError("Socket constructor");
   }
 
   @patch
   static Future<ConnectionTask<Socket>> _startConnect(dynamic host, int port,
-      {dynamic sourceAddress}) {
+      {dynamic sourceAddress, int sourcePort = 0}) {
     throw new UnsupportedError("Socket constructor");
   }
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index ff38ff8..d41e511 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -262,15 +262,35 @@
 }
 
 class Primitives {
+  static Object? _identityHashCodeProperty;
+
   static int objectHashCode(object) {
-    int? hash = JS('int|Null', r'#.$identityHash', object);
+    Object property =
+        _identityHashCodeProperty ??= _computeIdentityHashCodeProperty();
+    int? hash = JS('int|Null', r'#[#]', object, property);
     if (hash == null) {
       hash = JS('int', '(Math.random() * 0x3fffffff) | 0');
-      JS('void', r'#.$identityHash = #', object, hash);
+      JS('void', r'#[#] = #', object, property, hash);
     }
     return JS('int', '#', hash);
   }
 
+  static Object _computeIdentityHashCodeProperty() =>
+      JS_GET_FLAG('LEGACY_JAVASCRIPT')
+          ? _computeIdentityHashCodePropertyLegacy()
+          : _computeIdentityHashCodePropertyModern();
+
+  static Object _computeIdentityHashCodePropertyLegacy() {
+    if (JS<bool>('bool', 'typeof Symbol == "function"') ||
+        JS<bool>('bool', 'typeof Symbol() == "symbol"')) {
+      return _computeIdentityHashCodePropertyModern();
+    }
+    return r'$identityHashCode';
+  }
+
+  static Object _computeIdentityHashCodePropertyModern() =>
+      JS('', 'Symbol("identityHashCode")');
+
   static int? parseInt(String source, int? radix) {
     checkString(source);
     var re = JS('', r'/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i');
@@ -395,19 +415,21 @@
 
     var interceptor = getInterceptor(object);
     if (identical(interceptor, JS_INTERCEPTOR_CONSTANT(Interceptor)) ||
+        identical(interceptor, JS_INTERCEPTOR_CONSTANT(JavaScriptObject)) ||
         object is UnknownJavaScriptObject) {
       // Try to do better.  If we do not find something better, fallthrough to
-      // Dart-type based name that leave the name as 'UnknownJavaScriptObject'
-      // or 'Interceptor' (or the minified versions thereof).
+      // Dart-type based name that leave the name as 'UnknownJavaScriptObject',
+      // 'Interceptor', or 'JavaScriptObject' (or their minified versions).
       //
       // When we get here via the UnknownJavaScriptObject test (for JavaScript
       // objects from outside the program), the object's constructor has a
       // better name that 'UnknownJavaScriptObject'.
       //
-      // When we get here the Interceptor test (for Native classes that are
-      // declared in the Dart program but have been 'folded' into Interceptor),
-      // the native class's constructor name is better than the generic
-      // 'Interceptor' (an abstract class).
+      // When we get here via either the Interceptor or JavaScriptObject test
+      // (for Native classes that are declared in the Dart program but have been
+      // 'folded' into one of those interceptors), the native class's
+      // constructor name is better than the generic 'Interceptor' or
+      // 'JavaScriptObject'.
 
       // Try the [constructorNameFallback]. This gets the constructor name for
       // any browser (used by [getNativeInterceptor]).
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index 8ce0776..d681626 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -17,14 +17,14 @@
 class RawSocket {
   @patch
   static Future<RawSocket> connect(dynamic host, int port,
-      {dynamic sourceAddress, Duration? timeout}) {
-    return _RawSocket.connect(host, port, sourceAddress, timeout);
+      {dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) {
+    return _RawSocket.connect(host, port, sourceAddress, sourcePort, timeout);
   }
 
   @patch
   static Future<ConnectionTask<RawSocket>> startConnect(dynamic host, int port,
-      {dynamic sourceAddress}) {
-    return _RawSocket.startConnect(host, port, sourceAddress);
+      {dynamic sourceAddress, int sourcePort = 0}) {
+    return _RawSocket.startConnect(host, port, sourceAddress, sourcePort);
   }
 }
 
@@ -654,7 +654,7 @@
   }
 
   static Future<ConnectionTask<_NativeSocket>> startConnect(
-      dynamic host, int port, dynamic sourceAddress) {
+      dynamic host, int port, dynamic sourceAddress, int sourcePort) {
     // Looks up [sourceAddress] to one or more IP addresses,
     // then tries connecting to each one until a connection succeeds.
     // Attempts are staggered by a minimum delay, so a new
@@ -666,6 +666,7 @@
       host = escapeLinkLocalAddress(host);
     }
     _throwOnBadPort(port);
+    _throwOnBadPort(sourcePort);
     _InternetAddress? source;
     if (sourceAddress != null) {
       if (sourceAddress is _InternetAddress) {
@@ -682,7 +683,7 @@
 
     return new Future.value(host).then<ConnectionTask<_NativeSocket>>((host) {
       if (host is _InternetAddress) {
-        return tryConnectToResolvedAddresses(host, port, source,
+        return tryConnectToResolvedAddresses(host, port, source, sourcePort,
             Stream.value(<_InternetAddress>[host]), stackTrace);
       }
       final hostname = host as String;
@@ -700,7 +701,7 @@
               : lookupAsStream(hostname);
 
       return tryConnectToResolvedAddresses(
-          host, port, source, stream, stackTrace);
+          host, port, source, sourcePort, stream, stackTrace);
     });
   }
 
@@ -708,6 +709,7 @@
       dynamic host,
       int port,
       _InternetAddress? source,
+      int sourcePort,
       Stream<List<InternetAddress>> addresses,
       StackTrace callerStackTrace) {
     // Completer for result.
@@ -758,10 +760,16 @@
             connectionResult is OSError);
       } else {
         final address_ = address as _InternetAddress;
-        if (source == null) {
+        if (source == null && sourcePort == 0) {
           connectionResult = socket.nativeCreateConnect(
               address_._in_addr, port, address_._scope_id);
         } else {
+          // allow specified port without address
+          if (source == null) {
+            source = address_.type == InternetAddressType.IPv4
+                ? _InternetAddress.anyIPv4
+                : _InternetAddress.anyIPv6;
+          }
           if (source.type != InternetAddressType.IPv4 &&
               source.type != InternetAddressType.IPv6) {
             return SocketException(
@@ -773,8 +781,8 @@
                 "${InternetAddressType.IPv6} but was ${source.type}",
                 address: address);
           }
-          connectionResult = socket.nativeCreateBindConnect(
-              address_._in_addr, port, source._in_addr, address_._scope_id);
+          connectionResult = socket.nativeCreateBindConnect(address_._in_addr,
+              port, source._in_addr, sourcePort, address_._scope_id);
         }
         assert(connectionResult == true || connectionResult is OSError);
       }
@@ -935,9 +943,9 @@
     return new ConnectionTask<_NativeSocket>._(result.future, onCancel);
   }
 
-  static Future<_NativeSocket> connect(
-      dynamic host, int port, dynamic sourceAddress, Duration? timeout) {
-    return startConnect(host, port, sourceAddress)
+  static Future<_NativeSocket> connect(dynamic host, int port,
+      dynamic sourceAddress, int sourcePort, Duration? timeout) {
+    return startConnect(host, port, sourceAddress, sourcePort)
         .then((ConnectionTask<_NativeSocket> task) {
       Future<_NativeSocket> socketFuture = task.socket;
       if (timeout != null) {
@@ -1396,7 +1404,8 @@
 
         if (i == errorEvent) {
           if (!isClosing) {
-            reportError(nativeGetError(), null, "");
+            final err = nativeGetError();
+            reportError(err, null, err.message);
           }
         } else if (!isClosed) {
           // If the connection is closed right after it's accepted, there's a
@@ -1652,8 +1661,8 @@
   @pragma("vm:external-name", "Socket_CreateUnixDomainConnect")
   external nativeCreateUnixDomainConnect(String addr, _Namespace namespace);
   @pragma("vm:external-name", "Socket_CreateBindConnect")
-  external nativeCreateBindConnect(
-      Uint8List addr, int port, Uint8List sourceAddr, int scope_id);
+  external nativeCreateBindConnect(Uint8List addr, int port,
+      Uint8List sourceAddr, int sourcePort, int scope_id);
   @pragma("vm:external-name", "Socket_CreateUnixDomainBindConnect")
   external nativeCreateUnixDomainBindConnect(
       String addr, String sourceAddr, _Namespace namespace);
@@ -1791,9 +1800,9 @@
   // Flag to handle Ctrl-D closing of stdio on Mac OS.
   bool _isMacOSTerminalInput = false;
 
-  static Future<RawSocket> connect(
-      dynamic host, int port, dynamic sourceAddress, Duration? timeout) {
-    return _NativeSocket.connect(host, port, sourceAddress, timeout)
+  static Future<RawSocket> connect(dynamic host, int port,
+      dynamic sourceAddress, int sourcePort, Duration? timeout) {
+    return _NativeSocket.connect(host, port, sourceAddress, sourcePort, timeout)
         .then((socket) {
       if (!const bool.fromEnvironment("dart.vm.product")) {
         _SocketProfile.collectNewSocket(
@@ -1804,8 +1813,8 @@
   }
 
   static Future<ConnectionTask<_RawSocket>> startConnect(
-      dynamic host, int port, dynamic sourceAddress) {
-    return _NativeSocket.startConnect(host, port, sourceAddress)
+      dynamic host, int port, dynamic sourceAddress, int sourcePort) {
+    return _NativeSocket.startConnect(host, port, sourceAddress, sourcePort)
         .then((ConnectionTask<_NativeSocket> nativeTask) {
       final Future<_RawSocket> raw =
           nativeTask.socket.then((_NativeSocket nativeSocket) {
@@ -2015,16 +2024,19 @@
 class Socket {
   @patch
   static Future<Socket> _connect(dynamic host, int port,
-      {dynamic sourceAddress, Duration? timeout}) {
+      {dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) {
     return RawSocket.connect(host, port,
-            sourceAddress: sourceAddress, timeout: timeout)
+            sourceAddress: sourceAddress,
+            sourcePort: sourcePort,
+            timeout: timeout)
         .then((socket) => new _Socket(socket));
   }
 
   @patch
   static Future<ConnectionTask<Socket>> _startConnect(dynamic host, int port,
-      {dynamic sourceAddress}) {
-    return RawSocket.startConnect(host, port, sourceAddress: sourceAddress)
+      {dynamic sourceAddress, int sourcePort = 0}) {
+    return RawSocket.startConnect(host, port,
+            sourceAddress: sourceAddress, sourcePort: sourcePort)
         .then((rawTask) {
       Future<Socket> socket =
           rawTask.socket.then((rawSocket) => new _Socket(rawSocket));
diff --git a/sdk/lib/_internal/vm/bin/vmservice_io.dart b/sdk/lib/_internal/vm/bin/vmservice_io.dart
index fbedb80..3df0e4c 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_io.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_io.dart
@@ -123,10 +123,11 @@
         stderrSub.cancel();
         completer.complete();
       } else {
+        final error = result['error'] ?? event;
+        final stacktrace = result['stacktrace'] ?? '';
         stderrSub.cancel();
         completer.completeError(
-          'Could not start Observatory HTTP server',
-        );
+            'Could not start Observatory HTTP server:\n$error\n$stacktrace\n');
       }
     });
     try {
diff --git a/sdk/lib/_internal/vm/lib/array.dart b/sdk/lib/_internal/vm/lib/array.dart
index c897b67..ba48fbe 100644
--- a/sdk/lib/_internal/vm/lib/array.dart
+++ b/sdk/lib/_internal/vm/lib/array.dart
@@ -61,8 +61,11 @@
   factory _List._ofGrowableList(_GrowableList<E> elements) {
     final int length = elements.length;
     final list = _List<E>(length);
-    for (int i = 0; i < length; i++) {
-      list[i] = elements[i];
+    // TODO(30102): Remove this loop zero-trip guard.
+    if (length > 0) {
+      for (int i = 0; i < length; i++) {
+        list[i] = elements[i];
+      }
     }
     return list;
   }
@@ -70,8 +73,11 @@
   factory _List._ofList(_List<E> elements) {
     final int length = elements.length;
     final list = _List<E>(length);
-    for (int i = 0; i < length; i++) {
-      list[i] = elements[i];
+    // TODO(30102): Remove this loop zero-trip guard.
+    if (length > 0) {
+      for (int i = 0; i < length; i++) {
+        list[i] = elements[i];
+      }
     }
     return list;
   }
@@ -79,8 +85,11 @@
   factory _List._ofImmutableList(_ImmutableList<E> elements) {
     final int length = elements.length;
     final list = _List<E>(length);
-    for (int i = 0; i < length; i++) {
-      list[i] = elements[i];
+    // TODO(30102): Remove this loop zero-trip guard.
+    if (length > 0) {
+      for (int i = 0; i < length; i++) {
+        list[i] = elements[i];
+      }
     }
     return list;
   }
diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart
index 4e56a79..363ae71 100644
--- a/sdk/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk/lib/_internal/vm/lib/async_patch.dart
@@ -245,10 +245,6 @@
 }
 
 @patch
-@pragma("vm:external-name", "Async_rethrow")
-external void _rethrow(Object error, StackTrace stackTrace);
-
-@patch
 class _StreamImpl<T> {
   /// The closure implementing the async-generator body that is creating events
   /// for this stream.
diff --git a/sdk/lib/_internal/vm/lib/bigint_patch.dart b/sdk/lib/_internal/vm/lib/bigint_patch.dart
index f040c45..9ab2e2f 100644
--- a/sdk/lib/_internal/vm/lib/bigint_patch.dart
+++ b/sdk/lib/_internal/vm/lib/bigint_patch.dart
@@ -2493,7 +2493,7 @@
    * The [radix] argument must be an integer in the range 2 to 36.
    */
   String toRadixString(int radix) {
-    if (radix > 36) throw new RangeError.range(radix, 2, 36);
+    if (radix < 2 || radix > 36) throw new RangeError.range(radix, 2, 36);
 
     if (_used == 0) return "0";
 
diff --git a/sdk/lib/_internal/vm/lib/core_patch.dart b/sdk/lib/_internal/vm/lib/core_patch.dart
index 3118350..0d1d4a8 100644
--- a/sdk/lib/_internal/vm/lib/core_patch.dart
+++ b/sdk/lib/_internal/vm/lib/core_patch.dart
@@ -53,8 +53,6 @@
 
 import "dart:isolate" show Isolate;
 
-import "dart:math" show Random;
-
 import "dart:typed_data"
     show Endian, Uint8List, Int64List, Uint16List, Uint32List;
 
diff --git a/sdk/lib/_internal/vm/lib/date_patch.dart b/sdk/lib/_internal/vm/lib/date_patch.dart
index 249399a..d404a16 100644
--- a/sdk/lib/_internal/vm/lib/date_patch.dart
+++ b/sdk/lib/_internal/vm/lib/date_patch.dart
@@ -33,7 +33,7 @@
   static const _MONTH_INDEX = 7;
   static const _YEAR_INDEX = 8;
 
-  List? __parts;
+  List<int>? __parts;
 
   @patch
   DateTime.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch,
@@ -191,7 +191,7 @@
     return list;
   }
 
-  get _parts {
+  List<int> get _parts {
     return __parts ??= _computeUpperPart(_localDateInUtcMicros);
   }
 
@@ -282,7 +282,7 @@
         _flooredDivision(year - 1601, 400);
   }
 
-  static bool _isLeapYear(y) {
+  static bool _isLeapYear(int y) {
     // (y % 16 == 0) matches multiples of 400, and is faster than % 400.
     return (y % 4 == 0) && ((y % 16 == 0) || (y % 100 != 0));
   }
diff --git a/sdk/lib/_internal/vm/lib/errors_patch.dart b/sdk/lib/_internal/vm/lib/errors_patch.dart
index 0e3a676..aaaf11f 100644
--- a/sdk/lib/_internal/vm/lib/errors_patch.dart
+++ b/sdk/lib/_internal/vm/lib/errors_patch.dart
@@ -21,6 +21,10 @@
 
   @pragma("vm:entry-point")
   StackTrace? _stackTrace;
+
+  @patch
+  @pragma("vm:external-name", "Error_throwWithStackTrace")
+  external static Never _throw(Object error, StackTrace stackTrace);
 }
 
 class _AssertionError extends Error implements AssertionError {
diff --git a/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart b/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart
index 426a170..92e23c1 100644
--- a/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_native_type_patch.dart
@@ -55,6 +55,7 @@
 @pragma("vm:entry-point")
 class Uint64 extends _NativeInteger {}
 
+// TODO(http://dartbug.com/47938): Implement as AbiSpecificInteger.
 @patch
 @pragma("vm:entry-point")
 class IntPtr extends _NativeInteger {}
diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart
index 3f7276b..73d08b7 100644
--- a/sdk/lib/_internal/vm/lib/ffi_patch.dart
+++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart
@@ -4,7 +4,7 @@
 
 // All imports must be in all FFI patch files to not depend on the order
 // the patches are applied.
-import "dart:_internal" show patch;
+import "dart:_internal" show patch, has63BitSmis;
 import 'dart:typed_data';
 import 'dart:isolate';
 
@@ -21,8 +21,51 @@
   Double: 8,
 };
 
+// Keep consistent with pkg/vm/lib/transformations/ffi/abi.dart.
 @pragma("vm:prefer-inline")
-int get _intPtrSize => (const [8, 4, 4])[_abi()];
+int get _intPtrSize => (const [
+      4, // androidArm,
+      8, // androidArm64,
+      4, // androidIA32,
+      8, // androidX64,
+      8, // fuchsiaArm64,
+      8, // fuchsiaX64,
+      4, // iosArm,
+      8, // iosArm64,
+      8, // iosX64,
+      4, // linuxArm,
+      8, // linuxArm64,
+      4, // linuxIA32,
+      8, // linuxX64,
+      8, // macosArm64,
+      8, // macosX64,
+      8, // windowsArm64,
+      4, // windowsIA32,
+      8, // windowsX64,
+    ])[_abi()];
+
+@pragma("vm:prefer-inline")
+int get _smiMax {
+  // See runtime/vm/globals.h for how smiMax is calculated.
+  final smiBits = has63BitSmis ? 62 : 30;
+  return (1 << smiBits) - 1;
+}
+
+@pragma("vm:prefer-inline")
+void _checkExternalTypedDataLength(int length, int elementSize) {
+  final maxElements = _smiMax ~/ elementSize;
+  if (length < 0 || length > maxElements) {
+    throw ArgumentError("length must be in the range [0, $maxElements].");
+  }
+}
+
+@pragma("vm:prefer-inline")
+void _checkPointerAlignment(int address, int elementSize) {
+  if (address & (elementSize - 1) != 0) {
+    throw ArgumentError("Pointer address must be aligned to a multiple of "
+        "the element size ($elementSize).");
+  }
+}
 
 @patch
 int sizeOf<T extends NativeType>() {
@@ -42,8 +85,46 @@
 external DS _asFunctionInternal<DS extends Function, NS extends Function>(
     Pointer<NativeFunction<NS>> ptr, bool isLeaf);
 
-@pragma("vm:external-name", "Ffi_asExternalTypedData")
-external dynamic _asExternalTypedData(Pointer ptr, int count);
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataInt8")
+external Int8List _asExternalTypedDataInt8(Pointer<Int8> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataInt16")
+external Int16List _asExternalTypedDataInt16(Pointer<Int16> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataInt32")
+external Int32List _asExternalTypedDataInt32(Pointer<Int32> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataInt64")
+external Int64List _asExternalTypedDataInt64(Pointer<Int64> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataUint8")
+external Uint8List _asExternalTypedDataUint8(Pointer<Uint8> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataUint16")
+external Uint16List _asExternalTypedDataUint16(Pointer<Uint16> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataUint32")
+external Uint32List _asExternalTypedDataUint32(Pointer<Uint32> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataUint64")
+external Uint64List _asExternalTypedDataUint64(Pointer<Uint64> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataFloat")
+external Float32List _asExternalTypedDataFloat(Pointer<Float> ptr, int length);
+
+@pragma("vm:recognized", "other")
+@pragma("vm:external-name", "Ffi_asExternalTypedDataDouble")
+external Float64List _asExternalTypedDataDouble(
+    Pointer<Double> ptr, int length);
 
 // Returns a Function object for a native callback.
 //
@@ -147,6 +228,23 @@
     "Recognized method: IR graph is built in the flow graph builder.")
 external int _abi();
 
+@patch
+@pragma("vm:entry-point")
+class Abi {
+  @patch
+  @pragma("vm:prefer-inline")
+  factory Abi.current() => values[_abi()];
+}
+
+@pragma("vm:entry-point")
+class _FfiAbiSpecificMapping {
+  /// Indexed by [_abi].
+  @pragma("vm:entry-point")
+  final List<Object> nativeTypes;
+
+  const _FfiAbiSpecificMapping(this.nativeTypes);
+}
+
 /// Copies data byte-wise from [source] to [target].
 ///
 /// [source] and [target] should either be [Pointer] or [TypedData].
@@ -195,34 +293,42 @@
 // allocating a Pointer with in elementAt/offsetBy. Allocating these pointers
 // and GCing new spaces takes a lot of the benchmark time. The next speedup is
 // getting rid of these allocations by inlining these functions.
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadInt8")
 external int _loadInt8(Object typedDataBase, int offsetInBytes);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadInt16")
 external int _loadInt16(Object typedDataBase, int offsetInBytes);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadInt32")
 external int _loadInt32(Object typedDataBase, int offsetInBytes);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadInt64")
 external int _loadInt64(Object typedDataBase, int offsetInBytes);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadUint8")
 external int _loadUint8(Object typedDataBase, int offsetInBytes);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadUint16")
 external int _loadUint16(Object typedDataBase, int offsetInBytes);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadUint32")
 external int _loadUint32(Object typedDataBase, int offsetInBytes);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadUint64")
 external int _loadUint64(Object typedDataBase, int offsetInBytes);
@@ -232,6 +338,14 @@
 external int _loadIntPtr(Object typedDataBase, int offsetInBytes);
 
 @pragma("vm:recognized", "other")
+external int _loadAbiSpecificInt<T extends AbiSpecificInteger>(
+    Object typedDataBase, int offsetInBytes);
+
+@pragma("vm:recognized", "other")
+external int _loadAbiSpecificIntAtIndex<T extends AbiSpecificInteger>(
+    Object typedDataBase, int index);
+
+@pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_loadFloat")
 external double _loadFloat(Object typedDataBase, int offsetInBytes);
 
@@ -252,34 +366,42 @@
 external Pointer<S> _loadPointer<S extends NativeType>(
     Object typedDataBase, int offsetInBytes);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeInt8")
 external void _storeInt8(Object typedDataBase, int offsetInBytes, int value);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeInt16")
 external void _storeInt16(Object typedDataBase, int offsetInBytes, int value);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeInt32")
 external void _storeInt32(Object typedDataBase, int offsetInBytes, int value);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeInt64")
 external void _storeInt64(Object typedDataBase, int offsetInBytes, int value);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeUint8")
 external void _storeUint8(Object typedDataBase, int offsetInBytes, int value);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeUint16")
 external void _storeUint16(Object typedDataBase, int offsetInBytes, int value);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeUint32")
 external void _storeUint32(Object typedDataBase, int offsetInBytes, int value);
 
+@pragma("vm:entry-point")
 @pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeUint64")
 external void _storeUint64(Object typedDataBase, int offsetInBytes, int value);
@@ -289,6 +411,14 @@
 external void _storeIntPtr(Object typedDataBase, int offsetInBytes, int value);
 
 @pragma("vm:recognized", "other")
+external int _storeAbiSpecificInt<T extends AbiSpecificInteger>(
+    Object typedDataBase, int offsetInBytes, int value);
+
+@pragma("vm:recognized", "other")
+external int _storeAbiSpecificIntAtIndex<T extends AbiSpecificInteger>(
+    Object typedDataBase, int index, int value);
+
+@pragma("vm:recognized", "other")
 @pragma("vm:external-name", "Ffi_storeFloat")
 external void _storeFloat(
     Object typedDataBase, int offsetInBytes, double value);
@@ -359,6 +489,16 @@
         Pointer<Pointer<S>> pointer, int index) =>
     Pointer.fromAddress(pointer.address + _intPtrSize * index);
 
+@pragma("vm:prefer-inline")
+@pragma("vm:entry-point")
+T _checkAbiSpecificIntegerMapping<T>(T? object) {
+  if (object == null) {
+    throw ArgumentError(
+        'AbiSpecificInteger is missing mapping for "${Abi.current()}".');
+  }
+  return object;
+}
+
 extension NativeFunctionPointer<NF extends Function>
     on Pointer<NativeFunction<NF>> {
   @patch
@@ -386,7 +526,13 @@
   operator []=(int index, int value) => _storeInt8(this, index, value);
 
   @patch
-  Int8List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Int8List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Int8>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 1);
+    _checkPointerAlignment(address, 1);
+    return _asExternalTypedDataInt8(this, length);
+  }
 }
 
 extension Int16Pointer on Pointer<Int16> {
@@ -403,7 +549,13 @@
   operator []=(int index, int value) => _storeInt16(this, 2 * index, value);
 
   @patch
-  Int16List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Int16List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Int16>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 2);
+    _checkPointerAlignment(address, 2);
+    return _asExternalTypedDataInt16(this, length);
+  }
 }
 
 extension Int32Pointer on Pointer<Int32> {
@@ -420,7 +572,13 @@
   operator []=(int index, int value) => _storeInt32(this, 4 * index, value);
 
   @patch
-  Int32List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Int32List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Int32>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 4);
+    _checkPointerAlignment(address, 4);
+    return _asExternalTypedDataInt32(this, length);
+  }
 }
 
 extension Int64Pointer on Pointer<Int64> {
@@ -437,7 +595,13 @@
   operator []=(int index, int value) => _storeInt64(this, 8 * index, value);
 
   @patch
-  Int64List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Int64List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Int64>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 8);
+    _checkPointerAlignment(address, 8);
+    return _asExternalTypedDataInt64(this, length);
+  }
 }
 
 extension Uint8Pointer on Pointer<Uint8> {
@@ -454,7 +618,13 @@
   operator []=(int index, int value) => _storeUint8(this, index, value);
 
   @patch
-  Uint8List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Uint8List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Uint8>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 1);
+    _checkPointerAlignment(address, 1);
+    return _asExternalTypedDataUint8(this, length);
+  }
 }
 
 extension Uint16Pointer on Pointer<Uint16> {
@@ -471,7 +641,13 @@
   operator []=(int index, int value) => _storeUint16(this, 2 * index, value);
 
   @patch
-  Uint16List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Uint16List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Uint16>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 2);
+    _checkPointerAlignment(address, 2);
+    return _asExternalTypedDataUint16(this, length);
+  }
 }
 
 extension Uint32Pointer on Pointer<Uint32> {
@@ -488,7 +664,13 @@
   operator []=(int index, int value) => _storeUint32(this, 4 * index, value);
 
   @patch
-  Uint32List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Uint32List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Uint32>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 4);
+    _checkPointerAlignment(address, 4);
+    return _asExternalTypedDataUint32(this, length);
+  }
 }
 
 extension Uint64Pointer on Pointer<Uint64> {
@@ -505,7 +687,13 @@
   operator []=(int index, int value) => _storeUint64(this, 8 * index, value);
 
   @patch
-  Uint64List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Uint64List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Uint64>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 8);
+    _checkPointerAlignment(address, 8);
+    return _asExternalTypedDataUint64(this, length);
+  }
 }
 
 extension IntPtrPointer on Pointer<IntPtr> {
@@ -537,7 +725,13 @@
   operator []=(int index, double value) => _storeFloat(this, 4 * index, value);
 
   @patch
-  Float32List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Float32List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Float>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 4);
+    _checkPointerAlignment(address, 4);
+    return _asExternalTypedDataFloat(this, length);
+  }
 }
 
 extension DoublePointer on Pointer<Double> {
@@ -554,7 +748,13 @@
   operator []=(int index, double value) => _storeDouble(this, 8 * index, value);
 
   @patch
-  Float64List asTypedList(int elements) => _asExternalTypedData(this, elements);
+  Float64List asTypedList(int length) {
+    ArgumentError.checkNotNull(this, "Pointer<Double>");
+    ArgumentError.checkNotNull(length, "length");
+    _checkExternalTypedDataLength(length, 8);
+    _checkPointerAlignment(address, 8);
+    return _asExternalTypedDataDouble(this, length);
+  }
 }
 
 extension BoolPointer on Pointer<Bool> {
@@ -778,6 +978,25 @@
       throw "UNREACHABLE: This case should have been rewritten in the CFE.";
 }
 
+extension AbiSpecificIntegerPointer<T extends AbiSpecificInteger>
+    on Pointer<T> {
+  @patch
+  int get value =>
+      throw "UNREACHABLE: This case should have been rewritten in the CFE.";
+
+  @patch
+  void set value(int value) =>
+      throw "UNREACHABLE: This case should have been rewritten in the CFE.";
+
+  @patch
+  int operator [](int index) =>
+      throw "UNREACHABLE: This case should have been rewritten in the CFE.";
+
+  @patch
+  void operator []=(int index, int value) =>
+      throw "UNREACHABLE: This case should have been rewritten in the CFE.";
+}
+
 extension PointerArray<T extends NativeType> on Array<Pointer<T>> {
   @patch
   Pointer<T> operator [](int index) =>
@@ -802,14 +1021,28 @@
   @patch
   T operator [](int index) {
     throw ArgumentError(
-        "S ($T) should be a subtype of Struct at compile-time.");
+        "T ($T) should be a subtype of Struct at compile-time.");
   }
 }
 
 extension UnionArray<T extends Union> on Array<T> {
   @patch
   T operator [](int index) {
-    throw ArgumentError("S ($T) should be a subtype of Union at compile-time.");
+    throw ArgumentError("T ($T) should be a subtype of Union at compile-time.");
+  }
+}
+
+extension AbiSpecificIntegerArray on Array<AbiSpecificInteger> {
+  @patch
+  int operator [](int index) {
+    throw ArgumentError(
+        "Receiver should be a subtype of AbiSpecificInteger at compile-time.");
+  }
+
+  @patch
+  void operator []=(int index, int value) {
+    throw ArgumentError(
+        "Receiver should be a subtype of AbiSpecificInteger at compile-time.");
   }
 }
 
diff --git a/sdk/lib/_internal/vm/lib/growable_array.dart b/sdk/lib/_internal/vm/lib/growable_array.dart
index 516996f..c6d9e46 100644
--- a/sdk/lib/_internal/vm/lib/growable_array.dart
+++ b/sdk/lib/_internal/vm/lib/growable_array.dart
@@ -110,7 +110,10 @@
   // Specialization of List.empty constructor for growable == true.
   // Used by pkg/vm/lib/transformations/list_factory_specializer.dart.
   @pragma("vm:prefer-inline")
-  factory _GrowableList.empty() => _GrowableList(0);
+  factory _GrowableList.empty() {
+    // Specialization of `return _GrowableList(0);`.
+    return _GrowableList<T>._withData(_emptyList);
+  }
 
   // Specialization of List.filled constructor for growable == true.
   // Used by pkg/vm/lib/transformations/list_factory_specializer.dart.
@@ -154,43 +157,61 @@
 
   factory _GrowableList._ofList(_List<T> elements) {
     final int length = elements.length;
-    final list = _GrowableList<T>(length);
-    for (int i = 0; i < length; i++) {
-      list[i] = elements[i];
+    if (length > 0) {
+      final data = _List(_adjustedCapacity(length));
+      for (int i = 0; i < length; i++) {
+        data[i] = elements[i];
+      }
+      final list = _GrowableList<T>._withData(data);
+      list._setLength(length);
+      return list;
     }
-    return list;
+    return _GrowableList<T>.empty();
   }
 
   factory _GrowableList._ofGrowableList(_GrowableList<T> elements) {
     final int length = elements.length;
-    final list = _GrowableList<T>(length);
-    for (int i = 0; i < length; i++) {
-      list[i] = elements[i];
+    if (length > 0) {
+      final data = _List(_adjustedCapacity(length));
+      for (int i = 0; i < length; i++) {
+        data[i] = elements[i];
+      }
+      final list = _GrowableList<T>._withData(data);
+      list._setLength(length);
+      return list;
     }
-    return list;
+    return _GrowableList<T>.empty();
   }
 
   factory _GrowableList._ofImmutableList(_ImmutableList<T> elements) {
     final int length = elements.length;
-    final list = _GrowableList<T>(length);
-    for (int i = 0; i < length; i++) {
-      list[i] = elements[i];
+    if (length > 0) {
+      final data = _List(_adjustedCapacity(length));
+      for (int i = 0; i < length; i++) {
+        data[i] = elements[i];
+      }
+      final list = _GrowableList<T>._withData(data);
+      list._setLength(length);
+      return list;
     }
-    return list;
+    return _GrowableList<T>.empty();
   }
 
   factory _GrowableList._ofEfficientLengthIterable(
       EfficientLengthIterable<T> elements) {
     final int length = elements.length;
-    final list = _GrowableList<T>(length);
     if (length > 0) {
+      final data = _List(_adjustedCapacity(length));
       int i = 0;
       for (var element in elements) {
-        list[i++] = element;
+        data[i++] = element;
       }
       if (i != length) throw ConcurrentModificationError(elements);
+      final list = _GrowableList<T>._withData(data);
+      list._setLength(length);
+      return list;
     }
-    return list;
+    return _GrowableList<T>.empty();
   }
 
   factory _GrowableList._ofOther(Iterable<T> elements) {
@@ -358,11 +379,13 @@
       // Use shared empty list as backing.
       return _emptyList;
     }
-    // Round up size to the next odd number, since this is free
-    // because of alignment requirements of the GC.
-    return new _List(capacity | 1);
+    return _List(_adjustedCapacity(capacity));
   }
 
+  // Round up size to the next odd number, since this is free
+  // because of alignment requirements of the GC.
+  static int _adjustedCapacity(int capacity) => capacity | 1;
+
   // Grow from 0 to 3, and then double + 1.
   int _nextCapacity(int old_capacity) => (old_capacity * 2) | 3;
 
@@ -501,14 +524,22 @@
   }
 
   List<T> toList({bool growable: true}) {
+    // TODO(sra): We should be able to replace the following with:
+    //
+    //     return growable
+    //         ? _GrowableList<T>._ofGrowableList(this)
+    //         : _List<T>._ofGrowableList(this);
+    //
+    // However, the extra call causes a 5% regression in `ListCopy.toList.2`.
+
     final length = this.length;
     if (growable) {
       if (length > 0) {
-        final list = new _List(length);
+        final data = new _List(_adjustedCapacity(length));
         for (int i = 0; i < length; i++) {
-          list[i] = this[i];
+          data[i] = this[i];
         }
-        final result = new _GrowableList<T>._withData(list);
+        final result = new _GrowableList<T>._withData(data);
         result._setLength(length);
         return result;
       }
diff --git a/sdk/lib/_internal/vm/lib/object_patch.dart b/sdk/lib/_internal/vm/lib/object_patch.dart
index 3a7b6bb..d0398a2 100644
--- a/sdk/lib/_internal/vm/lib/object_patch.dart
+++ b/sdk/lib/_internal/vm/lib/object_patch.dart
@@ -9,14 +9,6 @@
 @pragma("vm:external-name", "Object_getHash")
 external int _getHash(obj);
 
-/// Set hash code associated with the object if it is not set yet
-/// and return the current hash code. See [Object._objectHashCode]
-/// for why this function needs to check for already set hash code.
-@pragma("vm:recognized", "asm-intrinsic")
-@pragma("vm:exact-result-type", "dart:core#_Smi")
-@pragma("vm:external-name", "Object_setHashIfNotSetYet")
-external int _setHashIfNotSetYet(obj, int hash);
-
 @patch
 @pragma("vm:entry-point")
 class Object {
@@ -28,31 +20,9 @@
   @pragma("vm:external-name", "Object_equals")
   external bool operator ==(Object other);
 
-  // Helpers used to implement hashCode. If a hashCode is used, we remember it
-  // in a weak table in the VM (32 bit) or in the header of the object (64
-  // bit). A new hashCode value is calculated using a random number generator.
-  static final _hashCodeRnd = new Random();
-
-  static int _objectHashCode(obj) {
-    var result = _getHash(obj);
-    if (result == 0) {
-      // We want the hash to be a Smi value greater than 0.
-      do {
-        result = _hashCodeRnd.nextInt(0x40000000);
-      } while (result == 0);
-
-      // Caveat: we might be interrupted by vm-service which then
-      // can initialize [this] object's hash code, that is why we need to
-      // return the return value of [_setHashIfNotSetYet] rather than
-      // returning [result] itself.
-      return _setHashIfNotSetYet(obj, result);
-    }
-    return result;
-  }
-
   @patch
-  int get hashCode => _objectHashCode(this);
-  int get _identityHashCode => _objectHashCode(this);
+  int get hashCode => _getHash(this);
+  int get _identityHashCode => _getHash(this);
 
   @patch
   @pragma("vm:external-name", "Object_toString")
diff --git a/sdk/lib/async/broadcast_stream_controller.dart b/sdk/lib/async/broadcast_stream_controller.dart
index c2db270..bed1f7d 100644
--- a/sdk/lib/async/broadcast_stream_controller.dart
+++ b/sdk/lib/async/broadcast_stream_controller.dart
@@ -254,7 +254,6 @@
     } else {
       stackTrace ??= AsyncError.defaultStackTrace(error);
     }
-    if (stackTrace == null) throw "unreachable"; // TODO(40088)
     _sendError(error, stackTrace);
   }
 
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 2283ba7..ea6c234 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -1097,7 +1097,6 @@
   } else {
     stackTrace ??= AsyncError.defaultStackTrace(error);
   }
-  if (stackTrace == null) throw "unreachable"; // TODO(40088).
   result._completeError(error, stackTrace);
 }
 
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index 52664b3..c3dc65b 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -29,7 +29,6 @@
     } else {
       stackTrace ??= AsyncError.defaultStackTrace(error);
     }
-    if (stackTrace == null) throw "unreachable"; // TODO(40088)
     _completeError(error, stackTrace);
   }
 
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 7121af8..cacc72c 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -18,12 +18,54 @@
 ///
 /// This controller allows sending data, error and done events on
 /// its [stream].
+///
 /// This class can be used to create a simple stream that others
 /// can listen on, and to push events to that stream.
 ///
 /// It's possible to check whether the stream is paused or not, and whether
 /// it has subscribers or not, as well as getting a callback when either of
 /// these change.
+///
+/// Example:
+/// ```dart
+/// final streamController = StreamController(
+///   onPause: () => print('Paused'),
+///   onResume: () => print('Resumed'),
+///   onCancel: () => print('Cancelled'),
+///   onListen: () => print('Listens'),
+/// );
+///
+/// streamController.stream.listen(
+///   (event) => print('Event: $event'),
+///   onDone: () => print('Done'),
+///   onError: (error) => print(error),
+/// );
+/// ```
+/// To check whether there is a subscriber on the stream, use [hasListener].
+/// ```dart continued
+/// var hasListener = streamController.hasListener; // true
+/// ```
+/// To send data events to the stream, use [add] or [addStream].
+/// ```dart continued
+/// streamController.add(999);
+/// final stream = Stream<int>.periodic(
+///     const Duration(milliseconds: 200), (count) => count * count).take(4);
+/// await streamController.addStream(stream);
+/// ```
+/// To send an error event to the stream, use [addError] or [addStream].
+/// ```dart continued
+/// streamController.addError(Exception('Issue 101'));
+/// await streamController.addStream(Stream.error(Exception('Issue 404')));
+/// ```
+/// To check whether the stream is closed, use [isClosed].
+/// ```dart continued
+/// var isClosed = streamController.isClosed; // false
+/// ```
+/// To close the stream, use [close].
+/// ```dart continued
+/// await streamController.close();
+/// isClosed = streamController.isClosed; // true
+/// ```
 abstract class StreamController<T> implements StreamSink<T> {
   /// The stream that this controller is controlling.
   Stream<T> get stream;
@@ -286,7 +328,7 @@
 /// or microtask. This means that if it throws, the error will be reported as
 /// uncaught as soon as possible.
 /// This is one reason to add the event as the last thing in the original event
-/// handler - any action done after adding the event will delay the report of
+/// handler – any action done after adding the event will delay the report of
 /// errors in the event listener callbacks.
 ///
 /// If an event is added in a setting that isn't known to be another event,
@@ -565,7 +607,6 @@
     } else {
       stackTrace ??= AsyncError.defaultStackTrace(error);
     }
-    if (stackTrace == null) throw "unreachable"; // TODO(40088)
     _addError(error, stackTrace);
   }
 
diff --git a/sdk/lib/async/timer.dart b/sdk/lib/async/timer.dart
index 973a543..a77bdfa 100644
--- a/sdk/lib/async/timer.dart
+++ b/sdk/lib/async/timer.dart
@@ -4,7 +4,7 @@
 
 part of dart.async;
 
-/// A count-down timer that can be configured to fire once or repeatedly.
+/// A countdown timer that can be configured to fire once or repeatedly.
 ///
 /// The timer counts down from the specified duration to 0.
 /// When the timer reaches 0, the timer invokes the specified callback function.
@@ -17,27 +17,33 @@
 /// following example (taking advantage of the multiplication operator of
 /// the [Duration] class):
 /// ```dart
-/// const timeout = Duration(seconds: 3);
-/// const ms = Duration(milliseconds: 1);
-///
-/// Timer startTimeout([int? milliseconds]) {
-///   var duration = milliseconds == null ? timeout : ms * milliseconds;
-///   return Timer(duration, handleTimeout);
+/// void main() {
+///   scheduleTimeout(5 * 1000); // 5 seconds.
 /// }
-/// ...
+///
+/// Timer scheduleTimeout([int milliseconds = 10000]) =>
+///     Timer(Duration(milliseconds: milliseconds), handleTimeout);
+///
 /// void handleTimeout() {  // callback function
-///   ...
+///   // Do some work.
 /// }
 /// ```
-/// Note: If Dart code using [Timer] is compiled to JavaScript, the finest
+/// **Note:** If Dart code using [Timer] is compiled to JavaScript, the finest
 /// granularity available in the browser is 4 milliseconds.
 ///
-/// See [Stopwatch] for measuring elapsed time.
+/// See also:
+/// * [Stopwatch] for measuring elapsed time.
 abstract class Timer {
   /// Creates a new timer.
   ///
   /// The [callback] function is invoked after the given [duration].
   ///
+  /// Example:
+  /// ```dart
+  /// final timer =
+  ///     Timer(const Duration(seconds: 5), () => print('Timer finished'));
+  /// // Outputs after 5 seconds: "Timer finished".
+  /// ```
   factory Timer(Duration duration, void Function() callback) {
     if (Zone.current == Zone.root) {
       // No need to bind the callback. We know that the root's timer will
@@ -64,6 +70,24 @@
   /// scheduled for - even if the actual callback was delayed.
   ///
   /// [duration] must a non-negative [Duration].
+  ///
+  /// Example:
+  /// ```dart
+  /// var counter = 3;
+  /// Timer.periodic(const Duration(seconds: 2), (timer) {
+  ///   print(timer.tick);
+  ///   counter--;
+  ///   if (counter == 0) {
+  ///     print('Cancel timer');
+  ///     timer.cancel();
+  ///   }
+  /// });
+  /// // Outputs:
+  /// // 1
+  /// // 2
+  /// // 3
+  /// // "Cancel timer"
+  /// ```
   factory Timer.periodic(Duration duration, void callback(Timer timer)) {
     if (Zone.current == Zone.root) {
       // No need to bind the callback. We know that the root's timer will
@@ -77,6 +101,11 @@
   /// Runs the given [callback] asynchronously as soon as possible.
   ///
   /// This function is equivalent to `new Timer(Duration.zero, callback)`.
+  ///
+  /// Example:
+  /// ```dart
+  /// Timer.run(() => print('timer run'));
+  /// ```
   static void run(void Function() callback) {
     new Timer(Duration.zero, callback);
   }
@@ -86,6 +115,14 @@
   /// Once a [Timer] has been canceled, the callback function will not be called
   /// by the timer. Calling [cancel] more than once on a [Timer] is allowed, and
   /// will have no further effect.
+  ///
+  /// Example:
+  /// ```dart
+  /// final timer =
+  ///     Timer(const Duration(seconds: 5), () => print('Timer finished'));
+  /// // Cancel timer, callback never called.
+  /// timer.cancel();
+  /// ```
   void cancel();
 
   /// The number of durations preceding the most recent timer event.
@@ -99,6 +136,25 @@
   /// and no callback is invoked for them.
   /// The [tick] count reflects the number of durations that have passed and
   /// not the number of callback invocations that have happened.
+  ///
+  /// Example:
+  /// ```dart
+  /// final stopwatch = Stopwatch()..start();
+  /// Timer.periodic(const Duration(seconds: 1), (timer) {
+  ///   print(timer.tick);
+  ///   if (timer.tick == 1) {
+  ///     while (stopwatch.elapsedMilliseconds < 4500) {
+  ///       // Run uninterrupted for another 3.5 seconds!
+  ///       // The latest due tick after that is the 4-second tick.
+  ///     }
+  ///   } else {
+  ///     timer.cancel();
+  ///   }
+  /// });
+  /// // Outputs:
+  /// // 1
+  /// // 4
+  /// ```
   int get tick;
 
   /// Returns whether the timer is still active.
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index e206152..43e377a 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -797,7 +797,7 @@
 
   /// Registers the given callback in this zone.
   ///
-  /// Similar to [registerCallback] but with a unary callback.
+  /// Similar to [registerCallback] but with a binary callback.
   ZoneBinaryCallback<R, T1, T2> registerBinaryCallback<R, T1, T2>(
       R callback(T1 arg1, T2 arg2));
 
@@ -1410,12 +1410,10 @@
 
 void _rootHandleError(Object error, StackTrace stackTrace) {
   _schedulePriorityAsyncCallback(() {
-    _rethrow(error, stackTrace);
+    Error.throwWithStackTrace(error, stackTrace);
   });
 }
 
-external void _rethrow(Object error, StackTrace stackTrace);
-
 R _rootRun<R>(Zone? self, ZoneDelegate? parent, Zone zone, R f()) {
   if (identical(Zone._current, zone)) return f();
 
@@ -1669,7 +1667,7 @@
   // Methods that can be customized by the zone specification.
 
   void handleUncaughtError(Object error, StackTrace stackTrace) {
-    _rootHandleUncaughtError(null, null, this, error, stackTrace);
+    _rootHandleError(error, stackTrace);
   }
 
   Zone fork(
diff --git a/sdk/lib/collection/collections.dart b/sdk/lib/collection/collections.dart
index 9b43996..1137f52 100644
--- a/sdk/lib/collection/collections.dart
+++ b/sdk/lib/collection/collections.dart
@@ -8,6 +8,17 @@
 ///
 /// The source of the elements may be a [List] or any [Iterable] with
 /// efficient [Iterable.length] and [Iterable.elementAt].
+///
+/// ```dart
+/// final numbers = <int>[10, 20, 30];
+/// final unmodifiableListView = UnmodifiableListView(numbers);
+///
+/// // Insert new elements into the original list.
+/// numbers.addAll([40, 50]);
+/// print(unmodifiableListView); // [10, 20, 30, 40, 50]
+///
+/// unmodifiableListView.remove(20); // Throws.
+/// ```
 class UnmodifiableListView<E> extends UnmodifiableListBase<E> {
   final Iterable<E> _source;
 
diff --git a/sdk/lib/collection/hash_map.dart b/sdk/lib/collection/hash_map.dart
index 5aa9504..e8a5a9b 100644
--- a/sdk/lib/collection/hash_map.dart
+++ b/sdk/lib/collection/hash_map.dart
@@ -18,6 +18,8 @@
 
 /// A hash-table based implementation of [Map].
 ///
+/// The [HashMap] is unordered (the order of iteration is not guaranteed).
+///
 /// The keys of a `HashMap` must have consistent [Object.==]
 /// and [Object.hashCode] implementations. This means that the `==` operator
 /// must define a stable equivalence relation on the keys (reflexive,
@@ -25,11 +27,94 @@
 /// must be the same for objects that are considered equal by `==`.
 ///
 /// Iterating the map's keys, values or entries (through [forEach])
-/// may happen in any order.
-/// The iteration order only changes when the map is modified.
-/// Values are iterated in the same order as their associated keys,
+/// may happen in any order. The iteration order only changes when the map is
+/// modified. Values are iterated in the same order as their associated keys,
 /// so iterating the [keys] and [values] in parallel
 /// will give matching key and value pairs.
+///
+/// **Notice:**
+/// Do not modify a map (add or remove keys) while an operation
+/// is being performed on that map, for example in functions
+/// called during a [forEach] or [putIfAbsent] call,
+/// or while iterating the map ([keys], [values] or [entries]).
+///
+/// Example:
+/// ```dart
+/// final Map<int, String> planets = HashMap(); // Is a HashMap
+/// ```
+/// To add data to a map, use [operator[]=], [addAll] or [addEntries].
+/// ```dart continued
+/// planets[3] = 'Earth';
+/// planets.addAll({4: 'Mars'});
+/// final gasGiants = {6: 'Jupiter', 5: 'Saturn'};
+/// planets.addEntries(gasGiants.entries);
+/// print(planets); // fx {5: Saturn, 6: Jupiter, 3: Earth, 4: Mars}
+/// ```
+/// To check if the map is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of map entries, use [length].
+/// ```dart continued
+/// final isEmpty = planets.isEmpty; // false
+/// final length = planets.length; // 4
+/// ```
+/// The [forEach] iterates through all entries of a map.
+/// ```dart continued
+/// planets.forEach((key, value) {
+///   print('$key \t $value');
+///   // 5        Saturn
+///   // 4        Mars
+///   // 3        Earth
+///   // 6        Jupiter
+/// });
+/// ```
+/// To check whether the map has an entry with a specific key, use [containsKey].
+/// ```dart continued
+/// final keyOneExists = planets.containsKey(4); // true
+/// final keyFiveExists = planets.containsKey(1); // false
+/// ```dart continued
+/// To check whether the map has an entry with a specific value,
+/// use [containsValue].
+/// ```dart continued
+/// final marsExists = planets.containsValue('Mars'); // true
+/// final venusExists = planets.containsValue('Venus'); // false
+/// ```
+/// To remove an entry with a specific key, use [remove].
+/// ```dart continued
+/// final removeValue = planets.remove(5);
+/// print(removeValue); // Jupiter
+/// print(planets); // fx {4: Mars, 3: Earth, 5: Saturn}
+/// ```
+/// To remove multiple entries at the same time, based on their keys and values,
+/// use [removeWhere].
+/// ```dart continued
+/// planets.removeWhere((key, value) => key == 5);
+/// print(planets); // fx {3: Earth, 4: Mars}
+/// ```
+/// To conditionally add or modify a value for a specific key, depending on
+/// whether there already is an entry with that key,
+/// use [putIfAbsent] or [update].
+/// ```dart continued
+/// planets.update(4, (v) => 'Saturn');
+/// planets.update(8, (v) => '', ifAbsent: () => 'Neptune');
+/// planets.putIfAbsent(4, () => 'Another Saturn');
+/// print(planets); // fx {4: Saturn, 8: Neptune, 3: Earth}
+/// ```
+/// To update the values of all keys, based on the existing key and value,
+/// use [updateAll].
+/// ```dart continued
+/// planets.updateAll((key, value) => 'X');
+/// print(planets); // fx {8: X, 3: X, 4: X}
+/// ```
+/// To remove all entries and empty the map, use [clear].
+/// ```dart continued
+/// planets.clear();
+/// print(planets); // {}
+/// print(planets.isEmpty); // true
+/// ```
+///
+/// **See also:**
+/// * [Map], the general interface of key/value pair collections.
+/// * [LinkedHashMap] iterates in key insertion order.
+/// * [SplayTreeMap] iterates the keys in sorted order.
 abstract class HashMap<K, V> implements Map<K, V> {
   /// Creates an unordered hash-table based [Map].
   ///
@@ -37,21 +122,32 @@
   /// values, the iteration order is unspecified except that it will stay the
   /// same as long as the map isn't changed.
   ///
-  /// If [equals] is provided, it is used to compare the keys in the table with
+  /// If [equals] is provided, it is used to compare the keys in the map with
   /// new keys. If [equals] is omitted, the key's own [Object.==] is used
   /// instead.
   ///
-  /// Similar, if [hashCode] is provided, it is used to produce a hash value
-  /// for keys in order to place them in the hash table. If it is omitted, the
-  /// key's own [Object.hashCode] is used.
+  /// Similarly, if [hashCode] is provided, it is used to produce a hash value
+  /// for keys in order to place them in the map. If [hashCode] is omitted,
+  /// the key's own [Object.hashCode] is used.
   ///
-  /// If using methods like [operator []], [remove] and [containsKey] together
-  /// with a custom equality and hashcode, an extra `isValidKey` function
-  /// can be supplied. This function is called before calling [equals] or
-  /// [hashCode] with an argument that may not be a [K] instance, and if the
-  /// call returns false, the key is assumed to not be in the set.
-  /// The [isValidKey] function defaults to just testing if the object is a
-  /// [K] instance.
+  /// The used `equals` and `hashCode` method should always be consistent,
+  /// so that if `equals(a, b)`, then `hashCode(a) == hashCode(b)`. The hash
+  /// of an object, or what it compares equal to, should not change while the
+  /// object is a key in the map. If it does change, the result is
+  /// unpredictable.
+  ///
+  /// If you supply one of [equals] and [hashCode],
+  /// you should generally also supply the other.
+  ///
+  /// Some [equals] or [hashCode] functions might not work for all objects.
+  /// If [isValidKey] is supplied, it's used to check a potential key
+  /// which is not necessarily an instance of [K], like the arguments to
+  /// [operator []], [remove] and [containsKey], which are typed as `Object?`.
+  /// If [isValidKey] returns `false`, for an object, the [equals] and
+  /// [hashCode] functions are not called, and no key equal to that object
+  /// is assumed to be in the map.
+  /// The [isValidKey] function defaults to just testing if the object is an
+  /// instance of [K].
   ///
   /// Example:
   /// ```dart template:expression
@@ -59,27 +155,18 @@
   ///                  hashCode: (int e) => e % 5)
   /// ```
   /// This example map does not need an `isValidKey` function to be passed.
-  /// The default function accepts only `int` values, which can safely be
+  /// The default function accepts precisely `int` values, which can safely be
   /// passed to both the `equals` and `hashCode` functions.
   ///
   /// If neither `equals`, `hashCode`, nor `isValidKey` is provided,
   /// the default `isValidKey` instead accepts all keys.
-  /// The default equality and hashcode operations are assumed to work on all
+  /// The default equality and hashcode operations are known to work on all
   /// objects.
   ///
   /// Likewise, if `equals` is [identical], `hashCode` is [identityHashCode]
   /// and `isValidKey` is omitted, the resulting map is identity based,
   /// and the `isValidKey` defaults to accepting all keys.
   /// Such a map can be created directly using [HashMap.identity].
-  ///
-  /// The used `equals` and `hashCode` method should always be consistent,
-  /// so that if `equals(a, b)` then `hashCode(a) == hashCode(b)`. The hash
-  /// of an object, or what it compares equal to, should not change while the
-  /// object is a key in the map. If it does change, the result is
-  /// unpredictable.
-  ///
-  /// If you supply one of [equals] and [hashCode],
-  /// you should generally also to supply the other.
   external factory HashMap(
       {bool Function(K, K)? equals,
       int Function(K)? hashCode,
@@ -87,7 +174,10 @@
 
   /// Creates an unordered identity-based map.
   ///
-  /// Effectively a shorthand for:
+  /// Keys of this map are considered equal only to the same object,
+  /// and do not use [Object.==] at all.
+  ///
+  /// Effectively shorthand for:
   /// ```dart
   /// HashMap<K, V>(equals: identical, hashCode: identityHashCode)
   /// ```
@@ -97,6 +187,11 @@
   ///
   /// The keys must all be instances of [K] and the values of [V].
   /// The [other] map itself can have any type.
+  /// ```dart
+  /// final baseMap = {1: 'A', 2: 'B', 3: 'C'};
+  /// final fromBaseMap = HashMap<int, String>.from(baseMap);
+  /// print(fromBaseMap); // {1: A, 2: B, 3: C}
+  /// ```
   factory HashMap.from(Map<dynamic, dynamic> other) {
     HashMap<K, V> result = HashMap<K, V>();
     other.forEach((dynamic k, dynamic v) {
@@ -106,6 +201,12 @@
   }
 
   /// Creates a [HashMap] that contains all key/value pairs of [other].
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, String>{1: 'A', 2: 'B', 3: 'C'};
+  /// final mapOf = HashMap<num, Object>.of(baseMap);
+  /// print(mapOf); // {1: A, 2: B, 3: C}
+  /// ```
   factory HashMap.of(Map<K, V> other) => HashMap<K, V>()..addAll(other);
 
   /// Creates a [HashMap] where the keys and values are computed from the
@@ -117,8 +218,15 @@
   /// The keys of the key/value pairs do not need to be unique. The last
   /// occurrence of a key will simply overwrite any previous value.
   ///
-  /// If no values are specified for [key] and [value] the default is the
+  /// If no values are specified for [key] and [value], the default is the
   /// identity function.
+  /// Example:
+  /// ```dart
+  /// final numbers = [11, 12, 13, 14];
+  /// final mapFromIterable = HashMap<int, int>.fromIterable(numbers,
+  ///     key: (i) => i, value: (i) => i * i);
+  /// print(mapFromIterable); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   factory HashMap.fromIterable(Iterable iterable,
       {K Function(dynamic element)? key, V Function(dynamic element)? value}) {
     HashMap<K, V> map = HashMap<K, V>();
@@ -135,6 +243,14 @@
   /// overwrites the previous value.
   ///
   /// It is an error if the two [Iterable]s don't have the same length.
+  /// Example:
+  /// ```dart
+  /// final keys = ['Mercury', 'Venus', 'Earth', 'Mars'];
+  /// final values = [0.06, 0.81, 1, 0.11];
+  /// final mapFromIterables = HashMap.fromIterables(keys, values);
+  /// print(mapFromIterables);
+  /// // {Earth: 1, Mercury: 0.06, Mars: 0.11, Venus: 0.81}
+  /// ```
   factory HashMap.fromIterables(Iterable<K> keys, Iterable<V> values) {
     HashMap<K, V> map = HashMap<K, V>();
     MapBase._fillMapWithIterables(map, keys, values);
@@ -148,6 +264,13 @@
   ///
   /// If multiple [entries] have the same key,
   /// later occurrences overwrite the earlier ones.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = [11, 12, 13, 14];
+  /// final map = HashMap.fromEntries(numbers.map((i) => MapEntry(i, i * i)));
+  /// print(map); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   @Since("2.1")
   factory HashMap.fromEntries(Iterable<MapEntry<K, V>> entries) =>
       HashMap<K, V>()..addEntries(entries);
diff --git a/sdk/lib/collection/hash_set.dart b/sdk/lib/collection/hash_set.dart
index ee8fed0..bd8860c 100644
--- a/sdk/lib/collection/hash_set.dart
+++ b/sdk/lib/collection/hash_set.dart
@@ -10,46 +10,117 @@
 /// and hashCode implementations. This means that the equals operation
 /// must define a stable equivalence relation on the elements (reflexive,
 /// symmetric, transitive, and consistent over time), and that the hashCode
-/// must consistent with equality, so that the same for objects that are
+/// must be consistent with equality, so that it's the same for objects that are
 /// considered equal.
 ///
 /// Most simple operations on `HashSet` are done in (potentially amortized)
 /// constant time: [add], [contains], [remove], and [length], provided the hash
 /// codes of objects are well distributed.
 ///
-/// The iteration order of the set is not specified and depends on
-/// the hashcodes of the provided elements. However, the order is stable:
+/// **The iteration order of the set is not specified and depends on
+/// the hashcodes of the provided elements.** However, the order is stable:
 /// multiple iterations over the same set produce the same order, as long as
 /// the set is not modified.
+///
+/// **Note:**
+/// Do not modify a set (add or remove elements) while an operation
+/// is being performed on that set, for example in functions
+/// called during a [forEach] or [containsAll] call,
+/// or while iterating the set.
+///
+/// Do not modify elements in a way which changes their equality (and thus their
+/// hash code) while they are in the set. Some specialized kinds of sets may be
+/// more permissive with regards to equality, in which case they should document
+/// their different behavior and restrictions.
+///
+/// Example:
+/// ```dart
+/// final letters = HashSet<String>();
+/// ```
+/// To add data to a set, use  [add] or [addAll].
+/// ```dart continued
+/// letters.add('A');
+/// letters.addAll({'B', 'C', 'D'});
+/// ```
+/// To check if the set is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of elements in the set, use [length].
+/// ```dart continued
+/// print(letters.isEmpty); // false
+/// print(letters.length); // 4
+/// print(letters); // fx {A, D, C, B}
+/// ```
+/// To check whether the set has an element with a specific value,
+/// use [contains].
+/// ```dart continued
+/// final bExists = letters.contains('B'); // true
+/// ```
+/// The [forEach] method calls a function with each element of the set.
+/// ```dart continued
+/// letters.forEach(print);
+/// // A
+/// // D
+/// // C
+/// // B
+/// ```
+/// To make a copy of the set, use [toSet].
+/// ```dart continued
+/// final anotherSet = letters.toSet();
+/// print(anotherSet); // fx {A, C, D, B}
+/// ```
+/// To remove an element, use [remove].
+/// ```dart continued
+/// final removedValue = letters.remove('A'); // true
+/// print(letters); // fx {B, C, D}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere] or
+/// [removeAll].
+/// ```dart continued
+/// letters.removeWhere((element) => element.startsWith('B'));
+/// print(letters); // fx {D, C}
+/// ```
+/// To removes all elements in this set that do not meet a condition,
+/// use [retainWhere].
+/// ```dart continued
+/// letters.retainWhere((element) => element.contains('C'));
+/// print(letters); // {C}
+/// ```
+/// To remove all elements and empty the set, use [clear].
+/// ```dart continued
+/// letters.clear();
+/// print(letters.isEmpty); // true
+/// print(letters); // {}
+/// ```
+/// **See also:**
+/// * [Set] is the general interface of collection where each object can
+/// occur only once.
+/// * [LinkedHashSet] objects stored based on insertion order.
+/// * [SplayTreeSet] iterates the objects in sorted order.
 abstract class HashSet<E> implements Set<E> {
   /// Create a hash set using the provided [equals] as equality.
   ///
   /// The provided [equals] must define a stable equivalence relation, and
-  /// [hashCode] must be consistent with [equals]. If the [equals] or [hashCode]
-  /// methods won't work on all objects, but only on some instances of E, the
-  /// [isValidKey] predicate can be used to restrict the keys that the functions
-  /// are applied to.
-  /// Any key for which [isValidKey] returns false is automatically assumed
-  /// to not be in the set when asking `contains`.
+  /// [hashCode] must be consistent with [equals].
   ///
   /// If [equals] or [hashCode] are omitted, the set uses
   /// the elements' intrinsic [Object.==] and [Object.hashCode].
   ///
   /// If you supply one of [equals] and [hashCode],
-  /// you should generally also to supply the other.
+  /// you should generally also supply the other.
   ///
-  /// If the supplied `equals` or `hashCode` functions won't work on all [E]
-  /// objects, and the map will be used in a setting where a non-`E` object
-  /// is passed to, e.g., `contains`, then the [isValidKey] function should
-  /// also be supplied.
-  ///
-  /// If [isValidKey] is omitted, it defaults to testing if the object is an
-  /// [E] instance. That means that:
+  /// Some [equals] or [hashCode] functions might not work for all objects.
+  /// If [isValidKey] is supplied, it's used to check a potential element
+  /// which is not necessarily an instance of [E], like the argument to
+  /// [contains] which is typed as `Object?`.
+  /// If [isValidKey] returns `false`, for an object, the [equals] and
+  /// [hashCode] functions are not called, and no key equal to that object
+  /// is assumed to be in the map.
+  /// The [isValidKey] function defaults to just testing if the object is an
+  /// instance of [E], which means that:
   /// ```dart template:expression
   /// HashSet<int>(equals: (int e1, int e2) => (e1 - e2) % 5 == 0,
   ///              hashCode: (int e) => e % 5)
   /// ```
-  /// does not need an `isValidKey` argument, because it defaults to only
+  /// does not need an `isValidKey` argument because it defaults to only
   /// accepting `int` values which are accepted by both `equals` and `hashCode`.
   ///
   /// If neither `equals`, `hashCode`, nor `isValidKey` is provided,
@@ -68,7 +139,7 @@
 
   /// Creates an unordered identity-based set.
   ///
-  /// Effectively a shorthand for:
+  /// Effectively shorthand for:
   /// ```dart
   /// HashSet<E>(equals: identical, hashCode: identityHashCode)
   /// ```
@@ -89,6 +160,12 @@
   /// Set<SubType> subSet =
   ///     HashSet<SubType>.from(superSet.whereType<SubType>());
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[10, 20, 30];
+  /// final hashSetFrom = HashSet<int>.from(numbers);
+  /// print(hashSetFrom); // fx {20, 10, 30}
+  /// ```
   factory HashSet.from(Iterable<dynamic> elements) {
     HashSet<E> result = HashSet<E>();
     for (final e in elements) {
@@ -99,15 +176,21 @@
 
   /// Create a hash set containing all [elements].
   ///
-  /// Creates a hash set as by `new HashSet<E>()` and adds all given [elements]
+  /// Creates a hash set as by `HashSet<E>()` and adds all given [elements]
   /// to the set. The elements are added in order. If [elements] contains
   /// two entries that are equal, but not identical, then the first one is
   /// the one in the resulting set.
+  /// Example:
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final hashSetOf = HashSet<num>.of(baseSet);
+  /// print(hashSetOf); // fx {3, 1, 2}
+  /// ```
   factory HashSet.of(Iterable<E> elements) => HashSet<E>()..addAll(elements);
 
   /// Provides an iterator that iterates over the elements of this set.
   ///
   /// The order of iteration is unspecified,
-  /// but consistent between changes to the set.
+  /// but is consistent between changes to the set.
   Iterator<E> get iterator;
 }
diff --git a/sdk/lib/collection/linked_hash_map.dart b/sdk/lib/collection/linked_hash_map.dart
index cfab8f3..9ee9d30 100644
--- a/sdk/lib/collection/linked_hash_map.dart
+++ b/sdk/lib/collection/linked_hash_map.dart
@@ -4,21 +4,112 @@
 
 part of dart.collection;
 
-/// A hash-table based implementation of [Map].
+/// An insertion-ordered [Map] with expected constant-time lookup.
+///
+/// A non-constant map literal, like `{"a": 42, "b": 7}`, is a `LinkedHashMap`.
+///
+/// The [keys], [values] and [entries] are iterated in key insertion order.
+///
+/// The map uses a hash-table to look up entries, so keys must have
+/// suitable implementations of [Object.operator==] and [Object.hashCode].
+/// If the hash codes are not well-distributed, the performance of map
+/// operations may suffer.
 ///
 /// The insertion order of keys is remembered,
 /// and keys are iterated in the order they were inserted into the map.
-/// Values are iterated in their corresponding key's order.
+/// Values and entries are iterated in their corresponding key's order.
 /// Changing a key's value, when the key is already in the map,
 /// does not change the iteration order,
 /// but removing the key and adding it again
 /// will make it be last in the iteration order.
 ///
+/// **Notice:**
+/// Do not modify a map (add or remove keys) while an operation
+/// is being performed on that map, for example in functions
+/// called during a [forEach] or [putIfAbsent] call,
+/// or while iterating the map ([keys], [values] or [entries]).
+///
 /// The keys of a `LinkedHashMap` must have consistent [Object.==]
 /// and [Object.hashCode] implementations. This means that the `==` operator
 /// must define a stable equivalence relation on the keys (reflexive,
 /// symmetric, transitive, and consistent over time), and that `hashCode`
 /// must be the same for objects that are considered equal by `==`.
+///
+/// Example:
+///
+/// ```dart
+/// final planetsByDiameter = {0.949: 'Venus'}; // A new LinkedHashMap
+/// ```
+/// To add data to a map, use [operator[]=], [addAll] or [addEntries].
+/// ```dart continued
+/// planetsByDiameter[1] = 'Earth';
+/// planetsByDiameter.addAll({0.532: 'Mars', 11.209: 'Jupiter'});
+/// ```
+/// To check if the map is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of map entries, use [length].
+/// ```dart continued
+/// print(planetsByDiameter.isEmpty); // false
+/// print(planetsByDiameter.length); // 4
+/// print(planetsByDiameter);
+/// // {0.949: Venus, 1.0: Earth, 0.532: Mars, 11.209: Jupiter}
+/// ```
+/// The [forEach] method calls a function for each key/value entry of the map.
+/// ```dart continued
+/// planetsByDiameter.forEach((key, value) {
+///   print('$key \t $value');
+///   // 0.949    Venus
+///   // 1.0      Earth
+///   // 0.532    Mars
+///   // 11.209   Jupiter
+/// });
+/// ```
+/// To check whether the map has an entry with a specific key, use [containsKey].
+/// ```dart continued
+/// final keyOneExists = planetsByDiameter.containsKey(1); // true
+/// final keyFiveExists = planetsByDiameter.containsKey(5); // false
+/// ```
+/// To check whether the map has an entry with a specific value,
+/// use [containsValue].
+/// ```dart continued
+/// final earthExists = planetsByDiameter.containsValue('Earth'); // true
+/// final saturnExists =  planetsByDiameter.containsValue('Saturn'); // false
+/// ```
+/// To remove an entry with a specific key, use [remove].
+/// ```dart continued
+/// final removedValue = planetsByDiameter.remove(1);
+/// print(removedValue); // Earth
+/// print(planetsByDiameter); // {0.949: Venus, 0.532: Mars, 11.209: Jupiter}
+/// ```
+/// To remove multiple entries at the same time, based on their keys and values,
+/// use [removeWhere].
+/// ```dart continued
+/// planetsByDiameter.removeWhere((key, value) => key == 0.949);
+/// print(planetsByDiameter); // {0.532: Mars, 11.209: Jupiter}
+/// ```
+/// To conditionally add or modify a value for a specific key, depending on
+/// whether there already is an entry with that key,
+/// use [putIfAbsent] or [update].
+/// ```dart continued
+/// planetsByDiameter.update(0.949, (v) => 'Venus', ifAbsent: () => 'Venus');
+/// planetsByDiameter.putIfAbsent(0.532, () => "Another Mars if needed");
+/// print(planetsByDiameter); // {0.532: Mars, 11.209: Jupiter, 0.949: Venus}
+/// ```
+/// To update the values of all keys, based on the existing key and value,
+/// use [updateAll].
+/// ```dart continued
+/// planetsByDiameter.updateAll((key, value) => 'X');
+/// print(planetsByDiameter); // {0.532: X, 11.209: X, 0.949: X}
+/// ```
+/// To remove all entries and empty the map, use [clear].
+/// ```dart continued
+/// planetsByDiameter.clear();
+/// print(planetsByDiameter); // {}
+/// print(planetsByDiameter.isEmpty); // true
+/// ```
+/// **See also:**
+/// * [Map], the general interface of key/value pair collections.
+/// * [HashMap] is unordered (the order of iteration is not guaranteed).
+/// * [SplayTreeMap] iterates the keys in sorted order.
 abstract class LinkedHashMap<K, V> implements Map<K, V> {
   /// Creates an insertion-ordered hash-table based [Map].
   ///
@@ -26,25 +117,35 @@
   /// new keys. If [equals] is omitted, the key's own [Object.==] is used
   /// instead.
   ///
-  /// Similar, if [hashCode] is provided, it is used to produce a hash value
+  /// Similarly, if [hashCode] is provided, it is used to produce a hash value
   /// for keys in order to place them in the hash table. If it is omitted, the
   /// key's own [Object.hashCode] is used.
   ///
-  /// If using methods like [operator []], [remove] and [containsKey] together
-  /// with a custom equality and hashcode, an extra `isValidKey` function
-  /// can be supplied. This function is called before calling [equals] or
-  /// [hashCode] with an argument that may not be a [K] instance, and if the
-  /// call returns false, the key is assumed to not be in the set.
-  /// The [isValidKey] function defaults to just testing if the object is a
-  /// [K] instance.
+  /// The used `equals` and `hashCode` method should always be consistent,
+  /// so that if `equals(a, b)` then `hashCode(a) == hashCode(b)`. The hash
+  /// of an object, or what it compares equal to, should not change while the
+  /// object is in the table. If it does change, the result is unpredictable.
+  ///
+  /// If you supply one of [equals] or [hashCode],
+  /// you should generally also supply the other.
+  ///
+  /// Some [equals] or [hashCode] functions might not work for all objects.
+  /// If [isValidKey] is supplied, it's used to check a potential key
+  /// which is not necessarily an instance of [K], like the arguments to
+  /// [operator []], [remove] and [containsKey], which are typed as `Object?`.
+  /// If [isValidKey] returns `false`, for an object, the [equals] and
+  /// [hashCode] functions are not called, and no key equal to that object
+  /// is assumed to be in the map.
+  /// The [isValidKey] function defaults to just testing if the object is an
+  /// instance of [K].
   ///
   /// Example:
   /// ```dart template:expression
-  /// LinkedHashMap<int,int>(equals: (int a, int b) => (b - a) % 5 == 0,
-  ///                        hashCode: (int e) => e % 5)
+  /// LikedHashMap<int,int>(equals: (int a, int b) => (b - a) % 5 == 0,
+  ///                       hashCode: (int e) => e % 5)
   /// ```
   /// This example map does not need an `isValidKey` function to be passed.
-  /// The default function accepts only `int` values, which can safely be
+  /// The default function accepts precisely `int` values, which can safely be
   /// passed to both the `equals` and `hashCode` functions.
   ///
   /// If neither `equals`, `hashCode`, nor `isValidKey` is provided,
@@ -56,14 +157,6 @@
   /// and `isValidKey` is omitted, the resulting map is identity based,
   /// and the `isValidKey` defaults to accepting all keys.
   /// Such a map can be created directly using [LinkedHashMap.identity].
-  ///
-  /// The used `equals` and `hashCode` method should always be consistent,
-  /// so that if `equals(a, b)` then `hashCode(a) == hashCode(b)`. The hash
-  /// of an object, or what it compares equal to, should not change while the
-  /// object is in the table. If it does change, the result is unpredictable.
-  ///
-  /// If you supply one of [equals] and [hashCode],
-  /// you should generally also to supply the other.
   external factory LinkedHashMap(
       {bool Function(K, K)? equals,
       int Function(K)? hashCode,
@@ -71,7 +164,7 @@
 
   /// Creates an insertion-ordered identity-based map.
   ///
-  /// Effectively a shorthand for:
+  /// Effectively shorthand for:
   /// ```dart template:expression
   /// LinkedHashMap<K, V>(equals: identical,
   ///                     hashCode: identityHashCode)
@@ -82,6 +175,12 @@
   ///
   /// The keys must all be instances of [K] and the values to [V].
   /// The [other] map itself can have any type.
+  /// Example:
+  /// ```dart
+  /// final baseMap = <num, Object>{1: 'A', 2: 'B', 3: 'C'};
+  /// final fromBaseMap = LinkedHashMap<int, String>.from(baseMap);
+  /// print(fromBaseMap); // {1: A, 2: B, 3: C}
+  /// ```
   factory LinkedHashMap.from(Map<dynamic, dynamic> other) {
     LinkedHashMap<K, V> result = LinkedHashMap<K, V>();
     other.forEach((dynamic k, dynamic v) {
@@ -91,20 +190,33 @@
   }
 
   /// Creates a [LinkedHashMap] that contains all key value pairs of [other].
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, String> {3: 'A', 2: 'B', 1: 'C', 4: 'D'};
+  /// final mapOf = LinkedHashMap<num, Object>.of(baseMap);
+  /// print(mapOf); // {3: A, 2: B, 1: C, 4: D}
+  /// ```
   factory LinkedHashMap.of(Map<K, V> other) =>
       LinkedHashMap<K, V>()..addAll(other);
 
   /// Creates a [LinkedHashMap] where the keys and values are computed from the
   /// [iterable].
   ///
-  /// For each element of the [iterable] this constructor computes a key/value
-  /// pair, by applying [key] and [value] respectively.
+  /// For each element of the [iterable], this constructor computes a key/value
+  /// pair by applying [key] and [value] respectively.
   ///
   /// The keys of the key/value pairs do not need to be unique. The last
   /// occurrence of a key will simply overwrite any previous value.
   ///
-  /// If no values are specified for [key] and [value] the default is the
-  /// identity function.
+  /// If no values are specified for [key] and [value], the default is the
+  /// both default to the identity function.
+  /// Example:
+  /// ```dart
+  /// final numbers = [11, 12, 13, 14];
+  /// final mapFromIterable =
+  ///     LinkedHashMap.fromIterable(numbers, key: (i) => i, value: (i) => i * i);
+  /// print(mapFromIterable); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   factory LinkedHashMap.fromIterable(Iterable iterable,
       {K Function(dynamic element)? key, V Function(dynamic element)? value}) {
     LinkedHashMap<K, V> map = LinkedHashMap<K, V>();
@@ -121,6 +233,14 @@
   /// overwrites the previous value.
   ///
   /// It is an error if the two [Iterable]s don't have the same length.
+  /// Example:
+  /// ```dart
+  /// final values = [0.06, 0.81, 1, 0.11];
+  /// final keys = ['Mercury', 'Venus', 'Earth', 'Mars'];
+  /// final mapFromIterables = LinkedHashMap.fromIterables(keys, values);
+  /// print(mapFromIterables);
+  /// // {Mercury: 0.06, Venus: 0.81, Earth: 1, Mars: 0.11}
+  /// ```
   factory LinkedHashMap.fromIterables(Iterable<K> keys, Iterable<V> values) {
     LinkedHashMap<K, V> map = LinkedHashMap<K, V>();
     MapBase._fillMapWithIterables(map, keys, values);
@@ -134,6 +254,12 @@
   ///
   /// If multiple [entries] have the same key,
   /// later occurrences overwrite the earlier ones.
+  /// Example:
+  /// ```dart
+  /// final numbers = [11, 12, 13, 14];
+  /// final map = LinkedHashMap.fromEntries(numbers.map((i) => MapEntry(i, i * i)));
+  /// print(map); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   @Since("2.1")
   factory LinkedHashMap.fromEntries(Iterable<MapEntry<K, V>> entries) =>
       LinkedHashMap<K, V>()..addEntries(entries);
diff --git a/sdk/lib/collection/linked_hash_set.dart b/sdk/lib/collection/linked_hash_set.dart
index 43d9a52..fd21777 100644
--- a/sdk/lib/collection/linked_hash_set.dart
+++ b/sdk/lib/collection/linked_hash_set.dart
@@ -6,7 +6,9 @@
 
 /// A [LinkedHashSet] is a hash-table based [Set] implementation.
 ///
-/// The `LinkedHashSet` also keep track of the order that elements were inserted
+/// The default implementation of [Set] is [LinkedHashSet].
+///
+/// The `LinkedHashSet` also keeps track of the order that elements were inserted
 /// in, and iteration happens in first-to-last insertion order.
 ///
 /// The elements of a `LinkedHashSet` must have consistent [Object.==]
@@ -19,47 +21,115 @@
 /// An element that was added after another will occur later in the iteration.
 /// Adding an element that is already in the set
 /// does not change its position in the iteration order,
-/// but removing an element and adding it again,
+/// but removing an element and adding it again
 /// will make it the last element of an iteration.
 ///
 /// Most simple operations on `HashSet` are done in (potentially amortized)
 /// constant time: [add], [contains], [remove], and [length], provided the hash
-/// codes of objects are well distributed..
+/// codes of objects are well distributed.
+///
+/// **Note:**
+/// Do not modify a set (add or remove elements) while an operation
+/// is being performed on that set, for example in functions
+/// called during a [forEach] or [containsAll] call,
+/// or while iterating the set.
+///
+/// Do not modify elements in a way which changes their equality (and thus their
+/// hash code) while they are in the set. Some specialized kinds of sets may be
+/// more permissive with regards to equality, in which case they should document
+/// their different behavior and restrictions.
+///
+/// Example:
+/// ```dart
+/// final planets = <String>{}; // LinkedHashSet
+/// ```
+/// To add data to a set, use [add] or [addAll].
+/// ```dart continued
+/// final uranusAdded = planets.add('Uranus'); // true
+/// planets.addAll({'Venus', 'Mars', 'Earth', 'Jupiter'});
+/// print(planets); // {Uranus, Venus, Mars, Earth, Jupiter}
+/// ```
+/// To check if the set is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of elements in the set, use [length].
+/// ```dart continued
+/// print(planets.isEmpty); // false
+/// print(planets.length); // 5
+/// ```
+/// To check whether the set has an element with a specific value,
+/// use [contains].
+/// ```dart continued
+/// final marsExists = planets.contains('Mars'); // true
+/// ```
+/// The [forEach] method calls a function with each element of the set.
+/// ```dart continued
+/// planets.forEach(print);
+/// // Uranus
+/// // Venus
+/// // Mars
+/// // Earth
+/// // Jupiter
+/// ```
+///
+/// To make a copy of the set, use [toSet].
+/// ```dart continued
+/// final copySet = planets.toSet();
+/// print(copySet); // {Uranus, Venus, Mars, Earth, Jupiter}
+/// ```
+/// To remove an element, use [remove].
+/// ```dart continued
+/// final removedValue = planets.remove('Mars'); // Mars
+/// print(planets); // {Uranus, Venus, Earth, Jupiter}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere] or
+/// [removeAll].
+/// ```dart continued
+/// planets.removeWhere((element) => element.startsWith('E'));
+/// print(planets); // {Uranus, Venus, Jupiter}
+/// ```
+/// To removes all elements in this set that do not meet a condition,
+/// use [retainWhere].
+/// ```dart continued
+/// planets.retainWhere((element) => element.contains('Jupiter'));
+/// print(planets); // {Jupiter}
+/// ```dart continued
+/// To remove all elements and empty the set, use [clear].
+/// ```dart continued
+/// planets.clear();
+/// print(planets.isEmpty); // true
+/// print(planets); // {}
+/// ```
+/// **See also:**
+/// * [Set] is the general interface of collection where each object can
+/// occur only once.
+/// * [HashSet] the order of the objects in the iteration is not guaranteed.
+/// * [SplayTreeSet] iterates the objects in sorted order.
 abstract class LinkedHashSet<E> implements Set<E> {
   /// Create an insertion-ordered hash set using the provided
   /// [equals] and [hashCode].
   ///
   /// The provided [equals] must define a stable equivalence relation, and
-  /// [hashCode] must be consistent with [equals]. If the [equals] or [hashCode]
-  /// methods won't work on all objects, but only on some instances of E, the
-  /// [isValidKey] predicate can be used to restrict the keys that the functions
-  /// are applied to.
-  /// Any key for which [isValidKey] returns false is automatically assumed
-  /// to not be in the set when asking `contains`.
-  ///
-  /// If [equals] or [hashCode] are omitted, the set uses
-  /// the elements' intrinsic [Object.==] and [Object.hashCode],
-  /// and [isValidKey] is ignored since these operations are assumed
-  /// to work on all objects.
+  /// [hashCode] must be consistent with [equals].
   ///
   /// If you supply one of [equals] and [hashCode],
-  /// you should generally also to supply the other.
+  /// you should generally also supply the other.
   ///
-  /// If the supplied `equals` or `hashCode` functions won't work on all [E]
-  /// objects, and the map will be used in a setting where a non-`E` object
-  /// is passed to, e.g., `contains`, then the [isValidKey] function should
-  /// also be supplied.
-  ///
-  /// If [isValidKey] is omitted, it defaults to testing if the object is an
-  /// [E] instance. That means that:
+  /// Some [equals] or [hashCode] functions might not work for all objects.
+  /// If [isValidKey] is supplied, it's used to check a potential element
+  /// which is not necessarily an instance of [E], like the argument to
+  /// [contains] which is typed as `Object?`.
+  /// If [isValidKey] returns `false`, for an object, the [equals] and
+  /// [hashCode] functions are not called, and no key equal to that object
+  /// is assumed to be in the map.
+  /// The [isValidKey] function defaults to just testing if the object is an
+  /// instance of [E], which means that:
   /// ```dart template:expression
   /// LinkedHashSet<int>(equals: (int e1, int e2) => (e1 - e2) % 5 == 0,
-  ///                    hashCode: (int e) => e % 5)
+  ///                    hashCode: (int e) => e % 5);
   /// ```
   /// does not need an `isValidKey` argument, because it defaults to only
   /// accepting `int` values which are accepted by both `equals` and `hashCode`.
   ///
-  /// If neither `equals`, `hashCode`, nor `isValidKey` is provided,
+  /// If neither `equals`, `hashCode`, nor `isValidKey` are provided,
   /// the default `isValidKey` instead accepts all values.
   /// The default equality and hashcode operations are assumed to work on all
   /// objects.
@@ -75,7 +145,7 @@
 
   /// Creates an insertion-ordered identity-based set.
   ///
-  /// Effectively a shorthand for:
+  /// Effectively shorthand for:
   /// ```dart
   /// LinkedHashSet<E>(equals: identical, hashCode: identityHashCode)
   /// ```
@@ -83,7 +153,7 @@
 
   /// Create a linked hash set containing all [elements].
   ///
-  /// Creates a linked hash set as by `new LinkedHashSet<E>()` and adds each
+  /// Creates a linked hash set as by `LinkedHashSet<E>()` and adds each
   /// element of `elements` to this set in the order they are iterated.
   ///
   /// All the [elements] should be instances of [E].
@@ -94,6 +164,12 @@
   /// Iterable<SuperType> tmp = superSet.where((e) => e is SubType);
   /// Set<SubType> subSet = LinkedHashSet<SubType>.from(tmp);
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[10, 20, 30];
+  /// final setFrom = LinkedHashSet<int>.from(numbers);
+  /// print(setFrom); // {10, 20, 30}
+  /// ```
   factory LinkedHashSet.from(Iterable<dynamic> elements) {
     LinkedHashSet<E> result = LinkedHashSet<E>();
     for (final element in elements) {
@@ -104,8 +180,14 @@
 
   /// Create a linked hash set from [elements].
   ///
-  /// Creates a linked hash set as by `new LinkedHashSet<E>()` and adds each
+  /// Creates a linked hash set as by `LinkedHashSet<E>()` and adds each
   /// element of `elements` to this set in the order they are iterated.
+  /// Example:
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final setOf = LinkedHashSet<num>.of(baseSet);
+  /// print(setOf); // {1, 2, 3}
+  /// ```
   factory LinkedHashSet.of(Iterable<E> elements) =>
       LinkedHashSet<E>()..addAll(elements);
 
diff --git a/sdk/lib/collection/linked_list.dart b/sdk/lib/collection/linked_list.dart
index 3e77646..516deee 100644
--- a/sdk/lib/collection/linked_list.dart
+++ b/sdk/lib/collection/linked_list.dart
@@ -28,6 +28,56 @@
 ///
 /// A `LinkedList` also allows constant time adding and removing at either end,
 /// and a constant time length getter.
+///
+/// Example:
+/// ```dart
+/// class EntryItem extends LinkedListEntry<EntryItem> {
+///   final int id;
+///   final String text;
+///   EntryItem(this.id, this.text);
+///
+///   @override
+///   String toString() {
+///     return '$id : $text';
+///   }
+/// }
+///
+/// void main(){
+///   final linkedList = LinkedList<EntryItem>();
+///   linkedList.addAll(
+///       [EntryItem(1, 'A'), EntryItem(2, 'B'), EntryItem(3, 'C')]);
+///   print(linkedList.first); // 1 : A
+///   print(linkedList.last); // 3 : C
+///
+///   // Add new item after first item.
+///   linkedList.first.insertAfter(EntryItem(15, 'E'));
+///   // Add new item before last item.
+///   linkedList.last.insertBefore(EntryItem(10, 'D'));
+///   // Iterate items.
+///   for (var entry in linkedList) {
+///     print(entry);
+///     // 1 : A
+///     // 15 : E
+///     // 2 : B
+///     // 10 : D
+///     // 3 : C
+///   }
+///
+///   // Remove item using index from list.
+///   linkedList.elementAt(2).unlink();
+///   print(linkedList); // (1 : A, 15 : E, 10 : D, 3 : C)
+///   // Remove first item.
+///   linkedList.first.unlink();
+///   print(linkedList); // (15 : E, 10 : D, 3 : C)
+///   // Remove last item from list.
+///   linkedList.remove(linkedList.last);
+///   print(linkedList); // (15 : E, 10 : D)
+///   // Remove all items.
+///   linkedList.clear();
+///   print(linkedList.length); // 0
+///   print(linkedList.isEmpty); // true
+/// }
+/// ```
 class LinkedList<E extends LinkedListEntry<E>> extends Iterable<E> {
   int _modificationCount = 0;
   int _length = 0;
@@ -47,7 +97,7 @@
     _insertBefore(_first, entry, updateFirst: false);
   }
 
-  /// Add [entries] to the end of the linked list.
+  /// Adds [entries] to the end of the linked list.
   void addAll(Iterable<E> entries) {
     entries.forEach(add);
   }
@@ -239,7 +289,7 @@
 
   /// The successor of this element in its linked list.
   ///
-  /// The value is  `null` if there is no successor in the linked list,
+  /// The value is `null` if there is no successor in the linked list,
   /// or if this entry is not currently in any list.
   E? get next {
     if (_list == null || identical(_list!.first, _next)) return null;
diff --git a/sdk/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
index b0ab270..b8673b1 100644
--- a/sdk/lib/collection/maps.dart
+++ b/sdk/lib/collection/maps.dart
@@ -200,7 +200,7 @@
 /// Basic implementation of an unmodifiable [Map].
 ///
 /// This class has a basic implementation of all but two of the members of
-/// an umodifiable [Map].
+/// an unmodifiable [Map].
 /// A simple unmodifiable `Map` class can be implemented by extending this
 /// class and implementing `keys` and `operator[]`.
 ///
@@ -376,6 +376,17 @@
 /// A wrapper around a `Map` that forwards all members to the map provided in
 /// the constructor, except for operations that modify the map.
 /// Modifying operations throw instead.
+///
+/// ```dart
+/// final baseMap = <int, String>{1: 'Mars', 2: 'Mercury', 3: 'Venus'};
+/// final unmodifiableMapView = UnmodifiableMapView(baseMap);
+///
+/// // Remove an entry from the original map.
+/// baseMap.remove(3);
+/// print(unmodifiableMapView); // {1: Mars, 2: Mercury}
+///
+/// unmodifiableMapView.remove(1); // Throws.
+/// ```
 class UnmodifiableMapView<K, V> extends MapView<K, V>
     with _UnmodifiableMapMixin<K, V> {
   UnmodifiableMapView(Map<K, V> map) : super(map);
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index dcdecb4..fa8b785 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -9,12 +9,29 @@
 /// an [Iterator].
 ///
 /// It is generally not allowed to modify the queue (add or remove entries)
-/// while an operation on the queue is being performed, for example during a
+/// while an operation in the queue is being performed, for example during a
 /// call to [forEach].
 /// Modifying the queue while it is being iterated will most likely break the
 /// iteration.
 /// This goes both for using the [iterator] directly, or for iterating an
 /// `Iterable` returned by a method like [map] or [where].
+///
+/// Example:
+/// ```dart
+/// final queue = Queue<int>(); // ListQueue() by default
+/// print(queue.runtimeType); // ListQueue
+///
+/// // Adding items to queue
+/// queue.addAll([1, 2, 3]);
+/// queue.addFirst(0);
+/// queue.addLast(10);
+/// print(queue); // {0, 1, 2, 3, 10}
+///
+/// // Removing items from queue
+/// queue.removeFirst();
+/// queue.removeLast();
+/// print(queue); // {1, 2, 3}
+/// ```
 abstract class Queue<E> implements EfficientLengthIterable<E> {
   /// Creates a queue.
   factory Queue() = ListQueue<E>;
@@ -45,16 +62,16 @@
   /// Any time the queue would produce an element that is not a [T],
   /// the element access will throw.
   ///
-  /// Any time a [T] value is attempted stored into the adapted queue,
-  /// the store will throw unless the value is also an instance of [S].
+  /// When a [T] value is stored into the adapted queue,
+  /// the operation will throw unless the value is also an instance of [S].
   ///
   /// If all accessed elements of [source] are actually instances of [T],
-  /// and if all elements stored into the returned queue are actually instance
+  /// and if all elements stored into the returned queue are actually instances
   /// of [S],
   /// then the returned queue can be used as a `Queue<T>`.
   ///
   /// Methods which accept `Object?` as argument, like [contains] and [remove],
-  /// will pass the argument directly to the this queue's method
+  /// will pass the argument directly to this queue's method
   /// without any checks.
   static Queue<T> castFrom<S, T>(Queue<S> source) => CastQueue<S, T>(source);
 
@@ -65,8 +82,8 @@
   /// that is not an instance of [R], the access will throw instead.
   ///
   /// Elements added to the queue (e.g., by using [addFirst] or [addAll])
-  /// must be instance of [R] to be valid arguments to the adding function,
-  /// and they must be instances of [E] as well to be accepted by
+  /// must be instances of [R] to be valid arguments to the adding function,
+  /// and they must also be instances of [E] to be accepted by
   /// this queue as well.
   ///
   /// Methods which accept `Object?` as argument, like [contains] and [remove],
@@ -95,7 +112,7 @@
   /// Adds [value] at the end of the queue.
   void add(E value);
 
-  /// Remove a single instance of [value] from the queue.
+  /// Removes a single instance of [value] from the queue.
   ///
   /// Returns `true` if a value was removed, or `false` if the queue
   /// contained no element equal to [value].
@@ -437,7 +454,7 @@
   /// [DoubleLinkedQueueEntry.previousEntry()].
   ///
   /// The [action] function can use methods on [DoubleLinkedQueueEntry] to
-  /// remove the entry or it can insert elements before or after then entry.
+  /// remove the entry or it can insert elements before or after the entry.
   /// If the current entry is removed, iteration continues with the entry that
   /// was following the current entry when [action] was called. Any elements
   /// inserted after the current element before it is removed will not be
@@ -509,6 +526,63 @@
 /// amortized constant time add operations.
 ///
 /// The structure is efficient for any queue or stack usage.
+///
+/// Example:
+/// ```dart
+/// final queue = ListQueue<int>();
+/// ```
+/// To add objects to a queue, use [add], [addAll], [addFirst] or[addLast].
+/// ```dart continued
+/// queue.add(5);
+/// queue.addFirst(0);
+/// queue.addLast(10);
+/// queue.addAll([1, 2, 3]);
+/// print(queue); // {0, 5, 10, 1, 2, 3}
+/// ```
+/// To check if the queue is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of queue entries, use [length].
+/// ```dart continued
+/// final isEmpty = queue.isEmpty; // false
+/// final queueSize = queue.length; // 6
+/// ```
+/// To get first or last item from queue, use [first] or [last].
+/// ```dart continued
+/// final first = queue.first; // 0
+/// final last = queue.last; // 3
+/// ```
+/// To get item value using index, use [elementAt].
+/// ```dart continued
+/// final itemAt = queue.elementAt(2); // 10
+/// ```
+/// To convert queue to list, call [toList].
+/// ```dart continued
+/// final numbers = queue.toList();
+/// print(numbers); // [0, 5, 10, 1, 2, 3]
+/// ```
+/// To remove item from queue, call [remove], [removeFirst] or [removeLast].
+/// ```dart continued
+/// queue.remove(10);
+/// queue.removeFirst();
+/// queue.removeLast();
+/// print(queue); // {5, 1, 2}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere].
+/// ```dart continued
+/// queue.removeWhere((element) => element == 1);
+/// print(queue); // {5, 2}
+/// ```
+/// To remove all elements in this queue that do not meet a condition,
+/// use [retainWhere].
+/// ```dart continued
+/// queue.retainWhere((element) => element < 4);
+/// print(queue); // {2}
+/// ```
+/// To remove all items and empty the set, use [clear].
+/// ```dart continued
+/// queue.clear();
+/// print(queue.isEmpty); // true
+/// print(queue); // {}
+/// ```
 class ListQueue<E> extends ListIterable<E> implements Queue<E> {
   static const int _INITIAL_CAPACITY = 8;
   List<E?> _table;
@@ -548,6 +622,12 @@
   /// Queue<SubType> subQueue =
   ///     ListQueue<SubType>.from(superQueue.whereType<SubType>());
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[10, 20, 30];
+  /// final queue = ListQueue<int>.from(numbers);
+  /// print(queue); // {10, 20, 30}
+  /// ```
   factory ListQueue.from(Iterable<dynamic> elements) {
     if (elements is List<dynamic>) {
       int length = elements.length;
@@ -575,6 +655,12 @@
   ///
   /// The elements are added to the queue, as by [addLast], in the order given
   /// by `elements.iterator`.
+  /// Example:
+  /// ```dart
+  /// final baseQueue = ListQueue.of([1.0, 2.0, 3.0]); // A ListQueue<double>
+  /// final numQueue = ListQueue<num>.of(baseQueue);
+  /// print(numQueue); // {1.0, 2.0, 3.0}
+  /// ```
   factory ListQueue.of(Iterable<E> elements) =>
       ListQueue<E>()..addAll(elements);
 
diff --git a/sdk/lib/collection/set.dart b/sdk/lib/collection/set.dart
index 81ca0a8..f59b56d 100644
--- a/sdk/lib/collection/set.dart
+++ b/sdk/lib/collection/set.dart
@@ -400,6 +400,17 @@
 ///
 /// Methods that could change the set, such as [add] and [remove],
 /// must not be called.
+///
+/// ```dart
+/// final baseSet = <String>{'Mars', 'Mercury', 'Earth', 'Venus'};
+/// final unmodifiableSetView = UnmodifiableSetView(baseSet);
+///
+/// // Remove an element from the original set.
+/// baseSet.remove('Venus');
+/// print(unmodifiableSetView); // {Mars, Mercury, Earth}
+///
+/// unmodifiableSetView.remove('Earth'); // Throws.
+/// ```
 @Since("2.12")
 class UnmodifiableSetView<E> extends SetBase<E> with _UnmodifiableSetMixin<E> {
   final Set<E> _source;
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index 5770c5b..1ab21db 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -54,7 +54,7 @@
   // Number of elements in the splay tree.
   int _count = 0;
 
-  /// Counter incremented whenever the keys in the map changes.
+  /// Counter incremented whenever the keys in the map change.
   ///
   /// Used to detect concurrent modifications.
   int _modificationCount = 0;
@@ -310,6 +310,86 @@
 /// using the `compare` function on an argument value that may not be a [K]
 /// value. If omitted, the `isValidKey` function defaults to testing if the
 /// value is a [K].
+///
+/// **Notice:**
+/// Do not modify a map (add or remove keys) while an operation
+/// is being performed on that map, for example in functions
+/// called during a [forEach] or [putIfAbsent] call,
+/// or while iterating the map ([keys], [values] or [entries]).
+///
+/// Example:
+/// ```dart
+/// final planetsByMass = SplayTreeMap<double, String>((a, b) => a.compareTo(b));
+/// ```
+/// To add data to a map, use [operator[]=], [addAll] or [addEntries].
+/// ```
+/// planetsByMass[0.06] = 'Mercury';
+/// planetsByMass
+///     .addAll({0.81: 'Venus', 1.0: 'Earth', 0.11: 'Mars', 317.83: 'Jupiter'});
+/// ```
+/// To check if the map is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of map entries, use [length].
+/// ```
+/// print(planetsByMass.isEmpty); // false
+/// print(planetsByMass.length); // 5
+/// ```
+/// The [forEach] method calls a function for each key/value entry of the map.
+/// ```
+/// planetsByMass.forEach((key, value) {
+///   print('$key \t $value');
+///   // 0.06    Mercury
+///   // 0.11    Mars
+///   // 0.81    Venus
+///   // 1.0     Earth
+///   // 317.83  Jupiter
+/// });
+/// ```
+/// To check whether the map has an entry with a specific key, use [containsKey].
+/// ```
+/// final keyOneExists = planetsByMass.containsKey(1.0); // true
+/// final keyFiveExists = planetsByMass.containsKey(5); // false
+/// ```
+/// To check whether the map has an entry with a specific value,
+/// use [containsValue].
+/// ```
+/// final earthExists = planetsByMass.containsValue('Earth'); // true
+/// final plutoExists = planetsByMass.containsValue('Pluto'); // false
+/// ```
+/// To remove an entry with a specific key, use [remove].
+/// ```
+/// final removedValue = planetsByMass.remove(1.0);
+/// print(removedValue); // Earth
+/// ```
+/// To remove multiple entries at the same time, based on their keys and values,
+/// use [removeWhere].
+/// ```
+/// planetsByMass.removeWhere((key, value) => key <= 1);
+/// print(planetsByMass); // {317.83: Jupiter}
+/// ```
+/// To conditionally add or modify a value for a specific key, depending on
+/// whether there already is an entry with that key,
+/// use [putIfAbsent] or [update].
+/// ```
+/// planetsByMass.update(1, (v) => '', ifAbsent: () => 'Earth');
+/// planetsByMass.putIfAbsent(317.83, () => 'Another Jupiter');
+/// print(planetsByMass); // {1.0: Earth, 317.83: Jupiter}
+/// ```
+/// To update the values of all keys, based on the existing key and value,
+/// use [updateAll].
+/// ```
+/// planetsByMass.updateAll((key, value) => 'X');
+/// print(planetsByMass); // {1.0: X, 317.83: X}
+/// ```
+/// To remove all entries and empty the map, use [clear].
+/// ```
+/// planetsByMass.clear();
+/// print(planetsByMass.isEmpty); // false
+/// print(planetsByMass); // {}
+/// ```
+/// **See also:**
+/// * [Map], the general interface of key/value pair collections.
+/// * [HashMap] is unordered (the order of iteration is not guaranteed).
+/// * [LinkedHashMap] iterates in key insertion order.
 class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>>
     with MapMixin<K, V> {
   _SplayTreeMapNode<K, V>? _root;
@@ -327,6 +407,12 @@
   ///
   /// The keys must all be instances of [K] and the values of [V].
   /// The [other] map itself can have any type.
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, Object>{3: 'C', 1: 'A', 2: 'B'};
+  /// final fromBaseMap = SplayTreeMap<int, String>.from(baseMap);
+  /// print(fromBaseMap); // {1: A, 2: B, 3: C}
+  /// ```
   factory SplayTreeMap.from(Map<dynamic, dynamic> other,
       [int Function(K key1, K key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -341,6 +427,12 @@
   }
 
   /// Creates a [SplayTreeMap] that contains all key/value pairs of [other].
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, String>{3: 'A', 2: 'B', 1: 'C', 4: 'D'};
+  /// final mapOf = SplayTreeMap<num, Object>.of(baseMap);
+  /// print(mapOf); // {1: C, 2: B, 3: A, 4: D}
+  /// ```
   factory SplayTreeMap.of(Map<K, V> other,
           [int Function(K key1, K key2)? compare,
           bool Function(dynamic potentialKey)? isValidKey]) =>
@@ -355,8 +447,16 @@
   /// The keys of the key/value pairs do not need to be unique. The last
   /// occurrence of a key will simply overwrite any previous value.
   ///
-  /// If no functions are specified for [key] and [value] the default is to
+  /// If no functions are specified for [key] and [value], the default is to
   /// use the iterable value itself.
+  /// Example:
+  /// ```dart
+  /// final numbers = [12, 11, 14, 13];
+  /// final mapFromIterable =
+  ///     SplayTreeMap<int, int>.fromIterable(numbers,
+  ///         key: (i) => i, value: (i) => i * i);
+  /// print(mapFromIterable); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   factory SplayTreeMap.fromIterable(Iterable iterable,
       {K Function(dynamic element)? key,
       V Function(dynamic element)? value,
@@ -376,6 +476,13 @@
   /// overwrites the previous value.
   ///
   /// It is an error if the two [Iterable]s don't have the same length.
+  /// Example:
+  /// ```dart
+  /// final keys = ['1', '2', '3', '4'];
+  /// final values = ['A', 'B', 'C', 'D'];
+  /// final mapFromIterables = SplayTreeMap.fromIterables(keys, values);
+  /// print(mapFromIterables); // {1: A, 2: B, 3: C, 4: D}
+  /// ```
   factory SplayTreeMap.fromIterables(Iterable<K> keys, Iterable<V> values,
       [int Function(K key1, K key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -772,6 +879,74 @@
 /// [Comparable], and are compared using their [Comparable.compareTo] method.
 /// Non-comparable objects (including `null`) will not work as an element
 /// in that case.
+///
+/// **Note:**
+/// Do not modify a set (add or remove elements) while an operation
+/// is being performed on that set, for example in functions
+/// called during a [forEach] or [containsAll] call,
+/// or while iterating the set.
+///
+/// Do not modify elements in a way which changes their equality (and thus their
+/// hash code) while they are in the set. Some specialized kinds of sets may be
+/// more permissive with regards to equality, in which case they should document
+/// their different behavior and restrictions.
+///
+/// Example:
+/// ```dart
+/// final planets = SplayTreeSet<String>((a, b) => a.compareTo(b));
+/// ```
+/// To add data to a set, use [add] or [addAll].
+/// ```
+/// planets.add('Neptune');
+/// planets.addAll({'Venus', 'Mars', 'Earth', 'Jupiter'});
+/// print(planets); // {Earth, Jupiter, Mars, Neptune, Venus}
+/// ```
+/// To check if the set is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of elements in the set, use [length].
+/// ```
+/// final isEmpty = planets.isEmpty; // false
+/// final length = planets.length; // 5
+/// ```
+/// To check whether the set contains a specific element, use [contains].
+/// ```
+/// final marsExists = planets.contains('Mars'); // true
+/// ```
+/// To get element value using index, use [elementAt].
+/// ```
+/// final elementAt = planets.elementAt(1);
+/// print(elementAt); // Jupiter
+/// ```
+/// To make a copy of set, use [toSet].
+/// ```
+/// final copySet = planets.toSet(); // a `SplayTreeSet` with the same ordering.
+/// print(copySet); // {Earth, Jupiter, Mars, Neptune, Venus}
+/// ```
+/// To remove an element, use [remove].
+/// ```
+/// final removedValue = planets.remove('Mars'); // true
+/// print(planets); // {Earth, Jupiter, Neptune, Venus}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere].
+/// ```
+/// planets.removeWhere((element) => element.startsWith('J'));
+/// print(planets); // {Earth, Neptune, Venus}
+/// ```
+/// To removes all elements in this set that do not meet a condition,
+/// use [retainWhere].
+/// ```
+/// planets.retainWhere((element) => element.contains('Earth'));
+/// print(planets); // {Earth}
+/// ```
+/// To remove all elements and empty the set, use [clear].
+/// ```
+/// planets.clear();
+/// print(planets.isEmpty); // true
+/// print(planets); // {}
+/// ```
+/// **See also:**
+/// * [Set] is a base-class for collection of objects.
+/// * [HashSet] the order of the objects in the iterations is not guaranteed.
+/// * [LinkedHashSet] objects stored based on insertion order.
 class SplayTreeSet<E> extends _SplayTree<E, _SplayTreeSetNode<E>>
     with IterableMixin<E>, SetMixin<E> {
   _SplayTreeSetNode<E>? _root;
@@ -788,7 +963,7 @@
   /// work on all `E` instances.
   ///
   /// For operations that add elements to the set, the user is supposed to not
-  /// pass in objects that doesn't work with the compare function.
+  /// pass in objects that don't work with the compare function.
   ///
   /// The methods [contains], [remove], [lookup], [removeAll] or [retainAll]
   /// are typed to accept any object(s), and the [isValidKey] test can used to
@@ -809,7 +984,7 @@
 
   /// Creates a [SplayTreeSet] that contains all [elements].
   ///
-  /// The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`.
+  /// The set works as if created by `SplayTreeSet<E>(compare, isValidKey)`.
   ///
   /// All the [elements] should be instances of [E] and valid arguments to
   /// [compare].
@@ -820,6 +995,12 @@
   /// Set<SubType> subSet =
   ///     SplayTreeSet<SubType>.from(superSet.whereType<SubType>());
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[20, 30, 10];
+  /// final setFrom = SplayTreeSet<int>.from(numbers);
+  /// print(setFrom); // {10, 20, 30}
+  /// ```
   factory SplayTreeSet.from(Iterable elements,
       [int Function(E key1, E key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -838,6 +1019,12 @@
   /// The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`.
   ///
   /// All the [elements] should be valid as arguments to the [compare] function.
+  /// Example:
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final setOf = SplayTreeSet<num>.of(baseSet);
+  /// print(setOf); // {1, 2, 3}
+  /// ```
   factory SplayTreeSet.of(Iterable<E> elements,
           [int Function(E key1, E key2)? compare,
           bool Function(dynamic potentialKey)? isValidKey]) =>
diff --git a/sdk/lib/convert/ascii.dart b/sdk/lib/convert/ascii.dart
index 9f62c2d..30a9599 100644
--- a/sdk/lib/convert/ascii.dart
+++ b/sdk/lib/convert/ascii.dart
@@ -35,7 +35,7 @@
   /// Encoders will not accept invalid (non ASCII) characters.
   const AsciiCodec({bool allowInvalid = false}) : _allowInvalid = allowInvalid;
 
-  /// The name of this codec, "us-ascii".
+  /// The name of this codec is "us-ascii".
   String get name => "us-ascii";
 
   Uint8List encode(String source) => encoder.convert(source);
@@ -103,7 +103,15 @@
   Stream<List<int>> bind(Stream<String> stream) => super.bind(stream);
 }
 
-/// This class converts strings of only ASCII characters to bytes.
+/// Converts strings of only ASCII characters to bytes.
+///
+/// Example:
+/// ```dart import:typed_data
+/// const asciiEncoder = AsciiEncoder();
+/// const sample = 'Dart';
+/// final asciiValues = asciiEncoder.convert(sample);
+/// print(asciiValues); // [68, 97, 114, 116]
+/// ```
 class AsciiEncoder extends _UnicodeSubsetEncoder {
   const AsciiEncoder() : super(_asciiMask);
 }
@@ -195,6 +203,29 @@
   Stream<String> bind(Stream<List<int>> stream) => super.bind(stream);
 }
 
+/// Converts ASCII bytes to string.
+///
+/// Example:
+/// ```dart
+/// const asciiDecoder = AsciiDecoder();
+/// final asciiValues = [68, 97, 114, 116];
+/// final result = asciiDecoder.convert(asciiValues);
+/// print(result); // Dart
+/// ```
+/// Throws a [FormatException] if [bytes] contains values that are not
+/// in the range 0 .. 127, and [allowInvalid] is `false` (the default).
+///
+/// If [allowInvalid] is `true`, any byte outside the range 0..127 is replaced
+/// by the Unicode replacement character, U+FFFD ('�').
+///
+/// Example with `allowInvalid` set to true:
+/// ```dart
+/// const asciiDecoder = AsciiDecoder(allowInvalid: true);
+/// final asciiValues = [68, 97, 114, 116, 20, 0xFF];
+/// final result = asciiDecoder.convert(asciiValues);
+/// print(result); // Dart �
+/// print(result.codeUnits.last.toRadixString(16)); // fffd
+/// ```
 class AsciiDecoder extends _UnicodeSubsetDecoder {
   const AsciiDecoder({bool allowInvalid = false})
       : super(allowInvalid, _asciiMask);
diff --git a/sdk/lib/convert/base64.dart b/sdk/lib/convert/base64.dart
index c4420c6..23fa301 100644
--- a/sdk/lib/convert/base64.dart
+++ b/sdk/lib/convert/base64.dart
@@ -223,6 +223,14 @@
 /// Encodes lists of bytes using base64 or base64url encoding.
 ///
 /// The results are ASCII strings using a restricted alphabet.
+///
+/// Example:
+/// ```dart
+/// final base64Encoder = base64.encoder;
+/// const sample = 'Dart is open source';
+/// final encodedSample = base64Encoder.convert(sample.codeUnits);
+/// print(encodedSample); // RGFydCBpcyBvcGVuIHNvdXJjZQ==
+/// ```
 class Base64Encoder extends Converter<List<int>, String> {
   final bool _urlSafe;
 
@@ -295,7 +303,7 @@
   /// Returns a [Uint8List] of the ASCII codes of the encoded data.
   ///
   /// If the input, including left over [_state] from earlier encodings,
-  /// are not a multiple of three bytes, then the partial state is stored
+  /// is not a multiple of three bytes, then the partial state is stored
   /// back into [_state].
   /// If [isLast] is true, partial state is encoded in the output instead,
   /// with the necessary padding.
@@ -469,6 +477,20 @@
 /// This decoder accepts both base64 and base64url ("url-safe") encodings.
 ///
 /// The encoding is required to be properly padded.
+///
+/// Throws a [FormatException] if the input is not valid base64 data.
+///
+/// Example:
+/// ```dart
+/// final base64Decoder = base64.decoder;
+/// const base64Bytes = 'RGFydCBpcyBvcGVuIHNvdXJjZQ==';
+/// final decodedBytes = base64Decoder.convert(base64Bytes);
+/// // decodedBytes: [68, 97, 114, 116, 32, 105, 115, 32, 111, 112, 101, 110,
+/// // 32, 115, 111, 117, 114, 99, 101]
+///
+/// // Print as string using UTF-8 decoder
+/// print(utf8.decode(decodedBytes)); // Dart is open source
+/// ```
 class Base64Decoder extends Converter<String, List<int>> {
   const Base64Decoder();
 
@@ -726,7 +748,7 @@
   /// it needs when input is valid, and at least enough bytes to reach the error
   /// when input is invalid.
   ///
-  /// Never count more than two padding sequences since any more than that
+  /// Never count more than two padding sequences as any more than that
   /// will raise an error anyway, and we only care about being precise for
   /// successful conversions.
   static int _trimPaddingChars(String input, int start, int end) {
@@ -777,7 +799,7 @@
   /// only call this function after having seen at least one `=` or `%`
   /// character.
   /// If the number of missing characters is not 3 or 0, we have seen (at least)
-  /// a `%` character and expects the rest of the `%3D` sequence, and a `=` is
+  /// a `%` character and expect the rest of the `%3D` sequence, and a `=` is
   /// not allowed. When missing 3 characters, either `=` or `%` is allowed.
   ///
   /// When the value is 0, no more padding (or any other character) is allowed.
diff --git a/sdk/lib/convert/html_escape.dart b/sdk/lib/convert/html_escape.dart
index 69b63a0..ced0a4a7 100644
--- a/sdk/lib/convert/html_escape.dart
+++ b/sdk/lib/convert/html_escape.dart
@@ -26,7 +26,7 @@
 
 /// HTML escape modes.
 ///
-/// Allows specifying a mode for HTML escaping that depend on the context
+/// Allows specifying a mode for HTML escaping that depends on the context
 /// where the escaped result is going to be used.
 /// The relevant contexts are:
 ///
@@ -38,6 +38,38 @@
 ///
 /// Custom escape modes can be created using the [HtmlEscapeMode.HtmlEscapeMode]
 /// constructor.
+///
+/// Example:
+/// ```dart
+/// const htmlEscapeMode = HtmlEscapeMode(
+///   name: 'custom',
+///   escapeLtGt: true,
+///   escapeQuot: false,
+///   escapeApos: false,
+///   escapeSlash: false,
+///  );
+///
+/// const HtmlEscape htmlEscape = HtmlEscape(htmlEscapeMode);
+/// String unescaped = 'Text & subject';
+/// String escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Text &amp; subject
+///
+/// unescaped = '10 > 1 and 1 < 10';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // 10 &gt; 1 and 1 &lt; 10
+///
+/// unescaped = "Single-quoted: 'text'";
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Single-quoted: 'text'
+///
+/// unescaped = 'Double-quoted: "text"';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Double-quoted: "text"
+///
+/// unescaped = 'Path: /system/';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Path: /system/
+/// ```
 class HtmlEscapeMode {
   final String _name;
 
@@ -56,13 +88,13 @@
   /// [the Open Web Application Security Project](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content)
   final bool escapeSlash;
 
-  /// Default escaping mode which escape all characters.
+  /// Default escaping mode, which escapes all characters.
   ///
   /// The result of such an escaping is usable both in element content and
   /// in any attribute value.
   ///
   /// The escaping only works for elements with normal HTML content,
-  /// and not for, for example, script or style element content,
+  /// and not, for example, for script or style element content,
   /// which require escapes matching their particular content syntax.
   static const HtmlEscapeMode unknown =
       HtmlEscapeMode._('unknown', true, true, true, true);
@@ -85,14 +117,14 @@
   ///
   /// Escapes single quotes (`'`) but not double quotes (`"`),
   /// and escapes `<` and `>` characters because they are not allowed
-  /// in strict XHTML attributes
+  /// in strict XHTML attributes.
   static const HtmlEscapeMode sqAttribute =
       HtmlEscapeMode._('attribute', true, false, true, false);
 
   /// Escaping mode for text going into HTML element content.
   ///
   /// The escaping only works for elements with normal HTML content,
-  /// and not for, for example, script or style element content,
+  /// and not, for example, for script or style element content,
   /// which require escapes matching their particular content syntax.
   ///
   /// Escapes `<` and `>` characters.
@@ -120,13 +152,13 @@
 
 /// Converter which escapes characters with special meaning in HTML.
 ///
-/// The converter finds characters that are significant in HTML source and
+/// The converter finds characters that are significant in the HTML source and
 /// replaces them with corresponding HTML entities.
 ///
 /// The characters that need escaping in HTML are:
 ///
-/// * `&` (ampersand) always need to be escaped.
-/// * `<` (less than) and '>' (greater than) when inside an element.
+/// * `&` (ampersand) always needs to be escaped.
+/// * `<` (less than) and `>` (greater than) when inside an element.
 /// * `"` (quote) when inside a double-quoted attribute value.
 /// * `'` (apostrophe) when inside a single-quoted attribute value.
 ///       Apostrophe is escaped as `&#39;` instead of `&apos;` since
@@ -137,6 +169,30 @@
 /// Escaping `>` (greater than) isn't necessary, but the result is often
 /// found to be easier to read if greater-than is also escaped whenever
 /// less-than is.
+///
+/// Example:
+/// ```dart
+/// const HtmlEscape htmlEscape = HtmlEscape();
+/// String unescaped = 'Text & subject';
+/// String escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Text &amp; subject
+///
+/// unescaped = '10 > 1 and 1 < 10';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // 10 &gt; 1 and 1 &lt; 10
+///
+/// unescaped = "Single-quoted: 'text'";
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Single-quoted: &#39;text&#39;
+///
+/// unescaped = 'Double-quoted: "text"';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Double-quoted: &quot;text&quot;
+///
+/// unescaped = 'Path: /system/';
+/// escaped = htmlEscape.convert(unescaped);
+/// print(escaped); // Path: &#47;system&#47;
+/// ```
 class HtmlEscape extends Converter<String, String> {
   /// The [HtmlEscapeMode] used by the converter.
   final HtmlEscapeMode mode;
@@ -145,7 +201,7 @@
   ///
   /// If [mode] is provided as either [HtmlEscapeMode.attribute] or
   /// [HtmlEscapeMode.element], only the corresponding subset of HTML
-  /// characters are escaped.
+  /// characters is escaped.
   /// The default is to escape all HTML characters.
   const HtmlEscape([this.mode = HtmlEscapeMode.unknown]);
 
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index a4aeb6a..cc9afdc 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -76,6 +76,39 @@
 ///
 /// Shorthand for `json.encode`. Useful if a local variable shadows the global
 /// [json] constant.
+///
+/// Example:
+/// ```dart
+/// const data = {'text': 'foo', 'value': 2, 'status': false, 'extra': null};
+/// final String jsonString = jsonEncode(data);
+/// print(jsonString); // {"text":"foo","value":2,"status":false,"extra":null}
+/// ```
+///
+/// Example of converting an otherwise unsupported object to a
+/// custom JSON format:
+///
+/// ```dart
+/// class CustomClass {
+///   final String text;
+///   final int value;
+///   CustomClass({required this.text, required this.value});
+///   CustomClass.fromJson(Map<String, dynamic> json)
+///       : text = json['text'],
+///         value = json['value'];
+///
+///   static Map<String, dynamic> toJson(CustomClass value) =>
+///       {'text': value.text, 'value': value.value};
+/// }
+///
+/// void main() {
+///   final CustomClass cc = CustomClass(text: 'Dart', value: 123);
+///   final jsonText = jsonEncode({'cc': cc},
+///       toEncodable: (Object? value) => value is CustomClass
+///           ? CustomClass.toJson(value)
+///           : throw UnsupportedError('Cannot convert to JSON: $value'));
+///   print(jsonText); // {"cc":{"text":"Dart","value":123}}
+/// }
+/// ```
 String jsonEncode(Object? object,
         {Object? toEncodable(Object? nonEncodable)?}) =>
     json.encode(object, toEncodable: toEncodable);
@@ -91,6 +124,32 @@
 ///
 /// Shorthand for `json.decode`. Useful if a local variable shadows the global
 /// [json] constant.
+///
+/// Example:
+/// ```dart
+/// const jsonString =
+///     '{"text": "foo", "value": 1, "status": false, "extra": null}';
+///
+/// final data = jsonDecode(jsonString);
+/// print(data['text']); // foo
+/// print(data['value']); // 1
+/// print(data['status']); // false
+/// print(data['extra']); // null
+///
+/// const jsonArray = '''
+///   [{"text": "foo", "value": 1, "status": true},
+///    {"text": "bar", "value": 2, "status": false}]
+/// ''';
+///
+/// final List<dynamic> dataList = jsonDecode(jsonArray);
+/// print(dataList[0]); // {text: foo, value: 1, status: true}
+/// print(dataList[1]); // {text: bar, value: 2, status: false}
+///
+/// final item = dataList[0];
+/// print(item['text']); // foo
+/// print(item['value']); // 1
+/// print(item['status']); // false
+/// ```
 dynamic jsonDecode(String source,
         {Object? reviver(Object? key, Object? value)?}) =>
     json.decode(source, reviver: reviver);
@@ -185,6 +244,30 @@
 }
 
 /// This class converts JSON objects to strings.
+///
+/// Example:
+///
+/// ```dart
+/// const JsonEncoder encoder = JsonEncoder();
+/// const data = {'text': 'foo', 'value': '2'};
+///
+/// final String jsonString = encoder.convert(data);
+/// print(jsonString); // {"text":"foo","value":"2"}
+/// ```
+///
+/// Example of pretty-printed output:
+///
+/// ```dart
+/// const JsonEncoder encoder = JsonEncoder.withIndent('  ');
+///
+/// const data = {'text': 'foo', 'value': '2'};
+/// final String jsonString = encoder.convert(data);
+/// print(jsonString);
+/// // {
+/// //   "text": "foo",
+/// //   "value": "2"
+/// // }
+/// ```
 class JsonEncoder extends Converter<Object?, String> {
   /// The string used for indention.
   ///
@@ -478,6 +561,29 @@
 /// A JSON input must be the JSON encoding of a single JSON value,
 /// which can be a list or map containing other values.
 ///
+/// Throws [FormatException] if the input is not valid JSON text.
+///
+/// Example:
+/// ```dart
+/// const JsonDecoder decoder = JsonDecoder();
+///
+/// const String jsonString = '''
+///   {
+///     "data": [{"text": "foo", "value": 1 },
+///              {"text": "bar", "value": 2 }],
+///     "text": "Dart"
+///   }
+/// ''';
+///
+/// final Map<String, dynamic> object = decoder.convert(jsonString);
+///
+/// final item = object['data'][0];
+/// print(item['text']); // foo
+/// print(item['value']); // 1
+///
+/// print(object['text']); // Dart
+/// ```
+///
 /// When used as a [StreamTransformer], the input stream may emit
 /// multiple strings. The concatenation of all of these strings must
 /// be a valid JSON encoding of a single JSON value.
diff --git a/sdk/lib/convert/latin1.dart b/sdk/lib/convert/latin1.dart
index f396682..76b2dbd 100644
--- a/sdk/lib/convert/latin1.dart
+++ b/sdk/lib/convert/latin1.dart
@@ -63,12 +63,48 @@
 }
 
 /// This class converts strings of only ISO Latin-1 characters to bytes.
+///
+/// Example:
+/// ```dart
+/// final latin1Encoder = latin1.encoder;
+///
+/// const sample = 'àáâãäå';
+/// final encoded = latin1Encoder.convert(sample);
+/// print(encoded); // [224, 225, 226, 227, 228, 229]
+/// ```
 class Latin1Encoder extends _UnicodeSubsetEncoder {
   const Latin1Encoder() : super(_latin1Mask);
 }
 
 /// This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
 /// to a string.
+///
+/// Example:
+/// ```dart
+/// final latin1Decoder = latin1.decoder;
+///
+/// const encodedBytes = [224, 225, 226, 227, 228, 229];
+/// final decoded = latin1Decoder.convert(encodedBytes);
+/// print(decoded); // àáâãäå
+///
+/// // Hexadecimal values as source
+/// const hexBytes = [0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5];
+/// final decodedHexBytes = latin1Decoder.convert(hexBytes);
+/// print(decodedHexBytes); // àáâãäå
+/// ```
+/// Throws a [FormatException] if the encoded input contains values that are
+/// not in the range 0 .. 255 and [allowInvalid] is false ( the default ).
+///
+/// If [allowInvalid] is true, invalid bytes are converted
+/// to Unicode Replacement character U+FFFD (�).
+///
+/// Example with `allowInvalid` set to true:
+/// ```dart
+/// const latin1Decoder = Latin1Decoder(allowInvalid: true);
+/// const encodedBytes = [300];
+/// final decoded = latin1Decoder.convert(encodedBytes);
+/// print(decoded); // �
+/// ```
 class Latin1Decoder extends _UnicodeSubsetDecoder {
   /// Instantiates a new [Latin1Decoder].
   ///
diff --git a/sdk/lib/convert/line_splitter.dart b/sdk/lib/convert/line_splitter.dart
index 85f0ab6..2e01ae6 100644
--- a/sdk/lib/convert/line_splitter.dart
+++ b/sdk/lib/convert/line_splitter.dart
@@ -10,12 +10,31 @@
 
 /// A [StreamTransformer] that splits a [String] into individual lines.
 ///
-/// A line is terminated by either a CR (U+000D), a LF (U+000A), a
-/// CR+LF sequence (DOS line ending),
-/// and a final non-empty line can be ended by the end of the string.
+/// A line is terminated by either:
+/// * a CR, carriage return: U+000D ('\r')
+/// * a LF, line feed (Unix line break): U+000A ('\n') or
+/// * a CR+LF sequence (DOS/Windows line break), and
+/// * a final non-empty line can be ended by the end of the input.
 ///
-/// The returned lines do not contain the line terminators.
-
+/// The resulting lines do not contain the line terminators.
+///
+/// Example:
+/// ```dart
+/// const splitter = LineSplitter();
+/// const sampleText =
+///     'Dart is: \r an object-oriented \n class-based \n garbage-collected '
+///     '\r\n language with C-style syntax \r\n';
+///
+/// final sampleTextLines = splitter.convert(sampleText);
+/// for (var i = 0; i < sampleTextLines.length; i++) {
+///   print('$i: ${sampleTextLines[i]}');
+/// }
+/// // 0: Dart is:
+/// // 1:  an object-oriented
+/// // 2:  class-based
+/// // 3:  garbage-collected
+/// // 4:  language with C-style syntax
+/// ```
 class LineSplitter extends StreamTransformerBase<String, String> {
   const LineSplitter();
 
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index 57a2dac..47f2647 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -40,7 +40,7 @@
   const Utf8Codec({bool allowMalformed = false})
       : _allowMalformed = allowMalformed;
 
-  /// The name of this codec, "utf-8".
+  /// The name of this codec is "utf-8".
   String get name => "utf-8";
 
   /// Decodes the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
@@ -49,7 +49,7 @@
   /// If the [codeUnits] start with the encoding of a
   /// [unicodeBomCharacterRune], that character is discarded.
   ///
-  /// If [allowMalformed] is `true` the decoder replaces invalid (or
+  /// If [allowMalformed] is `true`, the decoder replaces invalid (or
   /// unterminated) character sequences with the Unicode Replacement character
   /// `U+FFFD` (�). Otherwise it throws a [FormatException].
   ///
@@ -74,6 +74,14 @@
 
 /// This class converts strings to their UTF-8 code units (a list of
 /// unsigned 8-bit integers).
+///
+/// Example:
+/// ```dart
+/// final utf8Encoder = utf8.encoder;
+/// const sample = 'Îñţérñåţîöñåļîžåţîờñ';
+/// final encodedSample = utf8Encoder.convert(sample);
+/// print(encodedSample);
+/// ```
 class Utf8Encoder extends Converter<String, List<int>> {
   const Utf8Encoder();
 
@@ -148,10 +156,10 @@
   /// writes it to [_buffer].
   ///
   /// Returns true if the [nextCodeUnit] was combined with the
-  /// [leadingSurrogate]. If it wasn't then nextCodeUnit was not a trailing
+  /// [leadingSurrogate]. If it wasn't, then nextCodeUnit was not a trailing
   /// surrogate and has not been written yet.
   ///
-  /// It is safe to pass 0 for [nextCodeUnit] in which case a replacement
+  /// It is safe to pass 0 for [nextCodeUnit], in which case a replacement
   /// character is written to represent the unpaired lead surrogate.
   bool _writeSurrogate(int leadingSurrogate, int nextCodeUnit) {
     if (_isTailSurrogate(nextCodeUnit)) {
@@ -285,6 +293,31 @@
 
 /// This class converts UTF-8 code units (lists of unsigned 8-bit integers)
 /// to a string.
+///
+/// Example:
+/// ```dart
+/// final utf8Decoder = utf8.decoder;
+/// const encodedBytes = [
+///   195, 142, 195, 177, 197, 163, 195, 169, 114, 195, 177, 195, 165, 197,
+///   163, 195, 174, 195, 182, 195, 177, 195, 165, 196, 188, 195, 174, 197,
+///   190, 195, 165, 197, 163, 195, 174, 225, 187, 157, 195, 177];
+///
+/// final decodedBytes = utf8Decoder.convert(encodedBytes);
+/// print(decodedBytes); // Îñţérñåţîöñåļîžåţîờñ
+/// ```
+/// Throws a [FormatException] if the encoded input contains
+/// invalid UTF-8 byte sequences and [allowMalformed] is `false` (the default).
+///
+/// If [allowMalformed] is `true`, invalid byte sequences are converted into
+/// one or more Unicode replacement characters, U+FFFD ('�').
+///
+/// Example with `allowMalformed` set to true:
+/// ```dart
+/// const utf8Decoder = Utf8Decoder(allowMalformed: true);
+/// const encodedBytes = [0xFF];
+/// final decodedBytes = utf8Decoder.convert(encodedBytes);
+/// print(decodedBytes); // �
+/// ```
 class Utf8Decoder extends Converter<List<int>, String> {
   final bool _allowMalformed;
 
@@ -293,7 +326,7 @@
   /// The optional [allowMalformed] argument defines how [convert] deals
   /// with invalid or unterminated character sequences.
   ///
-  /// If it is `true` [convert] replaces invalid (or unterminated) character
+  /// If it is `true`, [convert] replaces invalid (or unterminated) character
   /// sequences with the Unicode Replacement character `U+FFFD` (�). Otherwise
   /// it throws a [FormatException].
   const Utf8Decoder({bool allowMalformed = false})
@@ -302,7 +335,7 @@
   /// Converts the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
   /// corresponding string.
   ///
-  /// Uses the code units from [start] to, but no including, [end].
+  /// Uses the code units from [start] to, but not including, [end].
   /// If [end] is omitted, it defaults to `codeUnits.length`.
   ///
   /// If the [codeUnits] start with the encoding of a
diff --git a/sdk/lib/core/annotations.dart b/sdk/lib/core/annotations.dart
index 4b7140b..1c2a416 100644
--- a/sdk/lib/core/annotations.dart
+++ b/sdk/lib/core/annotations.dart
@@ -159,7 +159,7 @@
 ///
 /// For example:
 ///
-/// ```dart template:none
+/// ```dart template:top
 /// @pragma('Tool:pragma-name', [param1, param2, ...])
 /// class Foo { }
 ///
diff --git a/sdk/lib/core/date_time.dart b/sdk/lib/core/date_time.dart
index 2281fd8..0bd6884 100644
--- a/sdk/lib/core/date_time.dart
+++ b/sdk/lib/core/date_time.dart
@@ -9,94 +9,111 @@
 /// DateTimes can represent time values that are at a distance of at most
 /// 100,000,000 days from epoch (1970-01-01 UTC): -271821-04-20 to 275760-09-13.
 ///
-/// Create a DateTime object by using one of the constructors
+/// Create a `DateTime` object by using one of the constructors
 /// or by parsing a correctly formatted string,
 /// which complies with a subset of ISO 8601.
-/// Note that hours are specified between 0 and 23,
+/// **Note:** hours are specified between 0 and 23,
 /// as in a 24-hour clock.
-/// For example:
 ///
+/// For example:
 /// ```dart
-/// var now = DateTime.now();
-/// var berlinWallFell = DateTime.utc(1989, 11, 9);
-/// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");  // 8:18pm
+/// final now = DateTime.now();
+/// final berlinWallFell = DateTime.utc(1989, 11, 9);
+/// final moonLanding = DateTime.parse('1969-07-20 20:18:04Z'); // 8:18pm
 /// ```
 ///
-/// A DateTime object is anchored either in the UTC time zone
+/// A `DateTime` object is anchored either in the UTC time zone
 /// or in the local time zone of the current computer
 /// when the object is created.
 ///
 /// Once created, neither the value nor the time zone
-/// of a DateTime object may be changed.
+/// of a `DateTime` object may be changed.
 ///
 /// You can use properties to get
-/// the individual units of a DateTime object.
-///
-/// ```dart
-/// assert(berlinWallFell.month == 11);
-/// assert(moonLanding.hour == 20);
+/// the individual units of a `DateTime` object.
 /// ```
-///
+/// print(berlinWallFell.year); // 1989
+/// print(berlinWallFell.month); // 11
+/// print(berlinWallFell.day); // 9
+/// print(moonLanding.hour); // 20
+/// print(moonLanding.minute); // 18
+/// ```
 /// For convenience and readability,
-/// the DateTime class provides a constant for each day and month
+/// the `DateTime` class provides a constant for each `day` and `month`
 /// name - for example, [august] and [friday].
 /// You can use these constants to improve code readability:
-///
 /// ```dart
-/// var berlinWallFell = DateTime.utc(1989, DateTime.november, 9);
+/// final berlinWallFell = DateTime.utc(1989, DateTime.november, 9);
+/// print(DateTime.november); // 11
+/// assert(berlinWallFell.month == DateTime.november);
 /// assert(berlinWallFell.weekday == DateTime.thursday);
 /// ```
 ///
-/// Day and month values begin at 1, and the week starts on Monday.
+/// `Day` and `month` values begin at 1, and the week starts on `Monday`.
 /// That is, the constants [january] and [monday] are both 1.
 ///
 /// ## Working with UTC and local time
 ///
-/// A DateTime object is in the local time zone
+/// A `DateTime` object is in the local time zone
 /// unless explicitly created in the UTC time zone.
+/// Use [isUtc] to determine whether a `DateTime` object is based in UTC.
 ///
 /// ```dart
-/// var dDay = DateTime.utc(1944, 6, 6);
-/// ```
+/// final dDay = DateTime.utc(1944, 6, 6);
+/// print(dDay.isUtc); // true
 ///
-/// Use [isUtc] to determine whether a DateTime object is based in UTC.
+/// final dDayLocal = DateTime(1944, 6, 6);
+/// print(dDayLocal.isUtc); // false
+/// ```
 /// Use the methods [toLocal] and [toUtc]
 /// to get the equivalent date/time value specified in the other time zone.
+/// ```
+/// final localDay = dDay.toLocal(); // e.g. 1944-06-06 02:00:00.000
+/// print(localDay.isUtc); // false
+///
+/// final utcFromLocal = localDay.toUtc(); // 1944-06-06 00:00:00.000Z
+/// print(utcFromLocal.isUtc); // true
+/// ```
 /// Use [timeZoneName] to get an abbreviated name of the time zone
-/// for the DateTime object.
+/// for the `DateTime` object.
+/// ```
+/// print(dDay.timeZoneName); // UTC
+/// print(localDay.timeZoneName); // e.g. EET
+/// ```
 /// To find the difference
-/// between UTC and the time zone of a DateTime object
+/// between UTC and the time zone of a `DateTime` object
 /// call [timeZoneOffset].
+/// ```
+/// print(dDay.timeZoneOffset); // 0:00:00.000000
+/// print(localDay.timeZoneOffset); // e.g. 2:00:00.000000
+/// ```
 ///
 /// ## Comparing DateTime objects
 ///
-/// The DateTime class contains several handy methods,
-/// such as [isAfter], [isBefore], and [isAtSameMomentAs],
-/// for comparing DateTime objects.
-///
-/// ```dart
-/// assert(berlinWallFell.isAfter(moonLanding) == true);
-/// assert(berlinWallFell.isBefore(moonLanding) == false);
+/// The `DateTime` class contains methods for comparing `DateTime`s
+/// chronologically, such as [isAfter], [isBefore], and [isAtSameMomentAs].
+/// ```
+/// print(berlinWallFell.isAfter(moonLanding)); // true
+/// print(berlinWallFell.isBefore(moonLanding)); // false
+/// print(dDay.isAtSameMomentAs(localDay)); // true
 /// ```
 ///
 /// ## Using DateTime with Duration
 ///
 /// Use the [add] and [subtract] methods with a [Duration] object
-/// to create a DateTime object based on another.
-/// For example, to find the date that is sixty days (24 * 60 hours) after today,
-/// write:
-///
+/// to create a `DateTime` object based on another.
+/// For example, to find the point in time that is 36 hours after now,
+/// you can write:
 /// ```dart
-/// var now = DateTime.now();
-/// var sixtyDaysFromNow = now.add(const Duration(days: 60));
+/// final now = DateTime.now();
+/// final later = now.add(const Duration(hours: 36));
 /// ```
 ///
-/// To find out how much time is between two DateTime objects use
+/// To find out how much time is between two `DateTime` objects use
 /// [difference], which returns a [Duration] object:
-///
-/// ```dart
-/// var difference = berlinWallFell.difference(moonLanding);
-/// assert(difference.inDays == 7416);
+/// ```
+/// final difference = berlinWallFell.difference(moonLanding);
+/// print(difference.inDays); // 7416
 /// ```
 ///
 /// The difference between two dates in different time zones
@@ -111,13 +128,11 @@
 ///
 /// ## Other resources
 ///
-/// See [Duration] to represent a span of time.
-/// See [Stopwatch] to measure timespans.
-///
-/// The DateTime class does not provide internationalization.
-/// To internationalize your code, use
-/// the [intl](https://pub.dev/packages/intl) package.
-///
+///  * See [Duration] to represent a span of time.
+///  * See [Stopwatch] to measure timespans.
+///  * The `DateTime` class does not provide internationalization.
+///  To internationalize your code, use
+///  the [intl](https://pub.dev/packages/intl) package.
 class DateTime implements Comparable<DateTime> {
   // Weekday constants that are returned by [weekday] method:
   static const int monday = 1;
@@ -154,20 +169,22 @@
   /// True if this [DateTime] is set to UTC time.
   ///
   /// ```dart
-  /// var dDay = DateTime.utc(1944, 6, 6);
-  /// assert(dDay.isUtc);
-  /// ```
+  /// final dDay = DateTime.utc(1944, 6, 6);
+  /// print(dDay.isUtc); // true
   ///
+  /// final local = DateTime(1944, 6, 6);
+  /// print(local.isUtc); // false
+  /// ```
   final bool isUtc;
 
   /// Constructs a [DateTime] instance specified in the local time zone.
   ///
   /// For example,
-  /// to create a DateTime object representing the 7th of September 2017,
+  /// to create a `DateTime` object representing the 7th of September 2017,
   /// 5:30pm
   ///
   /// ```dart
-  /// var dentistAppointment = DateTime(2017, 9, 7, 17, 30);
+  /// final dentistAppointment = DateTime(2017, 9, 7, 17, 30);
   /// ```
   DateTime(int year,
       [int month = 1,
@@ -183,10 +200,10 @@
   /// Constructs a [DateTime] instance specified in the UTC time zone.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.utc(1969, 7, 20, 20, 18, 04);
+  /// final moonLanding = DateTime.utc(1969, 7, 20, 20, 18, 04);
   /// ```
   ///
-  /// When dealing with dates or historic events prefer to use UTC DateTimes,
+  /// When dealing with dates or historic events, preferably use UTC DateTimes,
   /// since they are unaffected by daylight-saving changes and are unaffected
   /// by the local timezone.
   DateTime.utc(int year,
@@ -204,7 +221,7 @@
   /// local time zone.
   ///
   /// ```dart
-  /// var thisInstant = DateTime.now();
+  /// final now = DateTime.now();
   /// ```
   DateTime.now() : this._now();
 
@@ -212,7 +229,7 @@
   ///
   /// Throws a [FormatException] if the input string cannot be parsed.
   ///
-  /// The function parses a subset of ISO 8601
+  /// The function parses a subset of ISO 8601,
   /// which includes the subset accepted by RFC 3339.
   ///
   /// The accepted inputs are currently:
@@ -233,7 +250,7 @@
   ///   possibly separated from the previous by a space.
   ///   The time zone is either 'z' or 'Z', or it is a signed two digit hour
   ///   part and an optional two digit minute part. The sign must be either
-  ///   "+" or "-", and can not be omitted.
+  ///   "+" or "-", and cannot be omitted.
   ///   The minutes may be separated from the hours by a ':'.
   ///   Examples: "Z", "-10", "+01:30", "+1130".
   ///
@@ -354,23 +371,33 @@
   /// The constructed [DateTime] represents
   /// 1970-01-01T00:00:00Z + [millisecondsSinceEpoch] ms in the given
   /// time zone (local or UTC).
+  /// ```dart
+  /// final newYearsDay =
+  ///     DateTime.fromMillisecondsSinceEpoch(1640979000000, isUtc:true);
+  /// print(newYearsDay); // 2022-01-01 10:00:00.000Z
+  /// ```
   external DateTime.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch,
       {bool isUtc = false});
 
   /// Constructs a new [DateTime] instance
   /// with the given [microsecondsSinceEpoch].
   ///
-  /// If [isUtc] is false then the date is in the local time zone.
+  /// If [isUtc] is false, then the date is in the local time zone.
   ///
   /// The constructed [DateTime] represents
   /// 1970-01-01T00:00:00Z + [microsecondsSinceEpoch] us in the given
   /// time zone (local or UTC).
+  /// ```dart
+  /// final newYearsEve =
+  ///     DateTime.fromMicrosecondsSinceEpoch(1640901600000000, isUtc:true);
+  /// print(newYearsEve); // 2021-12-31 19:30:00.000Z
+  /// ```
   external DateTime.fromMicrosecondsSinceEpoch(int microsecondsSinceEpoch,
       {bool isUtc = false});
 
   /// Constructs a new [DateTime] instance with the given value.
   ///
-  /// If [isUtc] is false then the date is in the local time zone.
+  /// If [isUtc] is false, then the date is in the local time zone.
   DateTime._withValue(this._value, {required this.isUtc}) {
     if (millisecondsSinceEpoch.abs() > _maxMillisecondsSinceEpoch ||
         (millisecondsSinceEpoch.abs() == _maxMillisecondsSinceEpoch &&
@@ -386,11 +413,12 @@
   /// same time zone (UTC or local).
   ///
   /// ```dart
-  /// var dDayUtc = DateTime.utc(1944, 6, 6);
-  /// var dDayLocal = dDayUtc.toLocal();
+  /// final dDayUtc = DateTime.utc(1944, 6, 6);
+  /// final dDayLocal = dDayUtc.toLocal();
   ///
   /// // These two dates are at the same moment, but are in different zones.
   /// assert(dDayUtc != dDayLocal);
+  /// print(dDayUtc != dDayLocal); // true
   /// ```
   ///
   /// See [isAtSameMomentAs] for a comparison that compares moments in time
@@ -403,17 +431,17 @@
   /// of whether the time is in UTC or in the local time zone.
   ///
   /// ```dart
-  /// var now = DateTime.now();
-  /// var earlier = now.subtract(const Duration(seconds: 5));
-  /// assert(earlier.isBefore(now));
-  /// assert(!now.isBefore(now));
+  /// final now = DateTime.now();
+  /// final earlier = now.subtract(const Duration(seconds: 5));
+  /// print(earlier.isBefore(now)); // true
+  /// print(!now.isBefore(now)); // true
   ///
   /// // This relation stays the same, even when changing timezones.
-  /// assert(earlier.isBefore(now.toUtc()));
-  /// assert(earlier.toUtc().isBefore(now));
+  /// print(earlier.isBefore(now.toUtc())); // true
+  /// print(earlier.toUtc().isBefore(now)); // true
   ///
-  /// assert(!now.toUtc().isBefore(now));
-  /// assert(!now.isBefore(now.toUtc()));
+  /// print(!now.toUtc().isBefore(now)); // true
+  /// print(!now.isBefore(now.toUtc())); // true
   /// ```
   external bool isBefore(DateTime other);
 
@@ -423,17 +451,17 @@
   /// of whether the time is in UTC or in the local time zone.
   ///
   /// ```dart
-  /// var now = DateTime.now();
-  /// var later = now.add(const Duration(seconds: 5));
-  /// assert(later.isAfter(now));
-  /// assert(!now.isBefore(now));
+  /// final now = DateTime.now();
+  /// final later = now.add(const Duration(seconds: 5));
+  /// print(later.isAfter(now)); // true
+  /// print(!now.isBefore(now)); // true
   ///
   /// // This relation stays the same, even when changing timezones.
-  /// assert(later.isAfter(now.toUtc()));
-  /// assert(later.toUtc().isAfter(now));
+  /// print(later.isAfter(now.toUtc())); // true
+  /// print(later.toUtc().isAfter(now)); // true
   ///
-  /// assert(!now.toUtc().isAfter(now));
-  /// assert(!now.isAfter(now.toUtc()));
+  /// print(!now.toUtc().isAfter(now)); // true
+  /// print(!now.isAfter(now.toUtc())); // true
   /// ```
   external bool isAfter(DateTime other);
 
@@ -443,26 +471,38 @@
   /// time zone.
   ///
   /// ```dart
-  /// var now = DateTime.now();
-  /// var later = now.add(const Duration(seconds: 5));
-  /// assert(!later.isAtSameMomentAs(now));
-  /// assert(now.isAtSameMomentAs(now));
+  /// final now = DateTime.now();
+  /// final later = now.add(const Duration(seconds: 5));
+  /// print(!later.isAtSameMomentAs(now)); // true
+  /// print(now.isAtSameMomentAs(now)); // true
   ///
   /// // This relation stays the same, even when changing timezones.
-  /// assert(!later.isAtSameMomentAs(now.toUtc()));
-  /// assert(!later.toUtc().isAtSameMomentAs(now));
+  /// print(!later.isAtSameMomentAs(now.toUtc())); // true
+  /// print(!later.toUtc().isAtSameMomentAs(now)); // true
   ///
-  /// assert(now.toUtc().isAtSameMomentAs(now));
-  /// assert(now.isAtSameMomentAs(now.toUtc()));
+  /// print(now.toUtc().isAtSameMomentAs(now)); // true
+  /// print(now.isAtSameMomentAs(now.toUtc())); // true
   /// ```
   external bool isAtSameMomentAs(DateTime other);
 
   /// Compares this DateTime object to [other],
   /// returning zero if the values are equal.
   ///
-  /// Returns a negative value if this DateTime [isBefore] [other]. It returns 0
-  /// if it [isAtSameMomentAs] [other], and returns a positive value otherwise
-  /// (when this [isAfter] [other]).
+  /// A [compareTo] function returns:
+  ///  * a negative value if this DateTime [isBefore] [other].
+  ///  * `0` if this DateTime [isAtSameMomentAs] [other], and
+  ///  * a positive value otherwise (when this DateTime [isAfter] [other]).
+  ///
+  /// ```dart
+  /// final now = DateTime.now();
+  /// final future = now.add(const Duration(days: 2));
+  /// final past = now.subtract(const Duration(days: 2));
+  /// final newDate = now.toUtc();
+  ///
+  /// print(now.compareTo(future)); // -1
+  /// print(now.compareTo(past)); // 1
+  /// print(now.compareTo(newDate)); // 0
+  /// ```
   external int compareTo(DateTime other);
 
   int get hashCode => (_value ^ (_value >> 30)) & 0x3FFFFFFF;
@@ -569,6 +609,11 @@
   ///   0, then this part is omitted.
   ///
   /// The resulting string can be parsed back using [parse].
+  /// ```dart
+  /// final moonLanding = DateTime.utc(1969, 7, 20, 20, 18, 04);
+  /// final isoDate = moonLanding.toIso8601String();
+  /// print(isoDate); // 1969-07-20T20:18:04.000Z
+  /// ```
   String toIso8601String() {
     String y =
         (year >= -9999 && year <= 9999) ? _fourDigits(year) : _sixDigits(year);
@@ -589,8 +634,8 @@
   /// Returns a new [DateTime] instance with [duration] added to [this].
   ///
   /// ```dart
-  /// var today = DateTime.now();
-  /// var fiftyDaysFromNow = today.add(const Duration(days: 50));
+  /// final today = DateTime.now();
+  /// final fiftyDaysFromNow = today.add(const Duration(days: 50));
   /// ```
   ///
   /// Notice that the duration being added is actually 50 * 24 * 60 * 60
@@ -604,8 +649,8 @@
   /// Returns a new [DateTime] instance with [duration] subtracted from [this].
   ///
   /// ```dart
-  /// DateTime today = DateTime.now();
-  /// DateTime fiftyDaysAgo = today.subtract(const Duration(days: 50));
+  /// final today = DateTime.now();
+  /// final fiftyDaysAgo = today.subtract(const Duration(days: 50));
   /// ```
   ///
   /// Notice that the duration being subtracted is actually 50 * 24 * 60 * 60
@@ -622,11 +667,11 @@
   /// The returned [Duration] will be negative if [other] occurs after [this].
   ///
   /// ```dart
-  /// var berlinWallFell = DateTime.utc(1989, DateTime.november, 9);
-  /// var dDay = DateTime.utc(1944, DateTime.june, 6);
+  /// final berlinWallFell = DateTime.utc(1989, DateTime.november, 9);
+  /// final dDay = DateTime.utc(1944, DateTime.june, 6);
   ///
-  /// Duration difference = berlinWallFell.difference(dDay);
-  /// assert(difference.inDays == 16592);
+  /// final difference = berlinWallFell.difference(dDay);
+  /// print(difference.inDays); // 16592
   /// ```
   ///
   /// The difference is measured in seconds and fractions of seconds.
@@ -639,9 +684,10 @@
   /// For example, in Australia, similar code using local time instead of UTC:
   ///
   /// ```dart
-  /// var berlinWallFell = DateTime(1989, DateTime.november, 9);
-  /// var dDay = DateTime(1944, DateTime.june, 6);
-  /// Duration difference = berlinWallFell.difference(dDay);
+  /// final berlinWallFell = DateTime(1989, DateTime.november, 9);
+  /// final dDay = DateTime(1944, DateTime.june, 6);
+  /// final difference = berlinWallFell.difference(dDay);
+  /// print(difference.inDays); // 16591
   /// assert(difference.inDays == 16592);
   /// ```
   /// will fail because the difference is actually 16591 days and 23 hours, and
@@ -707,21 +753,39 @@
   /// Note, that JavaScript, Python and C return the difference between UTC and
   /// local time. Java, C# and Ruby return the difference between local time and
   /// UTC.
+  ///
+  /// For example, using local time in San Francisco, United States:
+  /// ```dart
+  /// final dateUS = DateTime.parse('2021-11-01 20:18:04Z').toLocal();
+  /// print(dateUS); // 2021-11-01 13:18:04.000
+  /// print(dateUS.timeZoneName); // PDT ( Pacific Daylight Time )
+  /// print(dateUS.timeZoneOffset.inHours); // -7
+  /// print(dateUS.timeZoneOffset.inMinutes); // -420
+  /// ```
+  ///
+  /// For example, using local time in Canberra, Australia:
+  /// ```dart
+  /// final dateAus = DateTime.parse('2021-11-01 20:18:04Z').toLocal();
+  /// print(dateAus); // 2021-11-02 07:18:04.000
+  /// print(dateAus.timeZoneName); // AEDT ( Australian Eastern Daylight Time )
+  /// print(dateAus.timeZoneOffset.inHours); // 11
+  /// print(dateAus.timeZoneOffset.inMinutes); // 660
+  /// ```
   external Duration get timeZoneOffset;
 
   /// The year.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.year == 1969);
+  /// final moonLanding = DateTime.parse('1969-07-20 20:18:04Z');
+  /// print(moonLanding.year); // 1969
   /// ```
   external int get year;
 
   /// The month `[1..12]`.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.month == 7);
+  /// final moonLanding = DateTime.parse('1969-07-20 20:18:04Z');
+  /// print(moonLanding.month); // 7
   /// assert(moonLanding.month == DateTime.july);
   /// ```
   external int get month;
@@ -729,48 +793,48 @@
   /// The day of the month `[1..31]`.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.day == 20);
+  /// final moonLanding = DateTime.parse('1969-07-20 20:18:04Z');
+  /// print(moonLanding.day); // 20
   /// ```
   external int get day;
 
   /// The hour of the day, expressed as in a 24-hour clock `[0..23]`.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.hour == 20);
+  /// final moonLanding = DateTime.parse('1969-07-20 20:18:04Z');
+  /// print(moonLanding.hour); // 20
   /// ```
   external int get hour;
 
   /// The minute `[0...59]`.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.minute == 18);
+  /// final moonLanding = DateTime.parse('1969-07-20 20:18:04Z');
+  /// print(moonLanding.minute); // 18
   /// ```
   external int get minute;
 
   /// The second `[0...59]`.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.second == 4);
+  /// final moonLanding = DateTime.parse('1969-07-20 20:18:04Z');
+  /// print(moonLanding.second); // 4
   /// ```
   external int get second;
 
   /// The millisecond `[0...999]`.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.millisecond == 0);
+  /// final date = DateTime.parse('1970-01-01 05:01:01.234567Z');
+  /// print(date.millisecond); // 234
   /// ```
   external int get millisecond;
 
   /// The microsecond `[0...999]`.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.microsecond == 0);
+  /// final date = DateTime.parse('1970-01-01 05:01:01.234567Z');
+  /// print(date.microsecond); // 567
   /// ```
   external int get microsecond;
 
@@ -780,8 +844,8 @@
   /// a week starts with Monday, which has the value 1.
   ///
   /// ```dart
-  /// var moonLanding = DateTime.parse("1969-07-20 20:18:04Z");
-  /// assert(moonLanding.weekday == 7);
+  /// final moonLanding = DateTime.parse('1969-07-20 20:18:04Z');
+  /// print(moonLanding.weekday); // 7
   /// assert(moonLanding.weekday == DateTime.sunday);
   /// ```
   external int get weekday;
diff --git a/sdk/lib/core/double.dart b/sdk/lib/core/double.dart
index 2bf8104..7c04f358 100644
--- a/sdk/lib/core/double.dart
+++ b/sdk/lib/core/double.dart
@@ -16,6 +16,11 @@
 ///
 /// It is a compile-time error for a class to attempt to extend or implement
 /// double.
+///
+/// **See also:**
+/// * [num] the super class for [double].
+/// * [Numbers](https://dart.dev/guides/language/numbers) in
+/// [A tour of the Dart language](https://dart.dev/guides/language/language-tour).
 abstract class double extends num {
   static const double nan = 0.0 / 0.0;
   static const double infinity = 1.0 / 0.0;
@@ -54,7 +59,14 @@
   ///  `(3.5).round() == 4` and `(-3.5).round() == -4`.
   ///
   /// Throws an [UnsupportedError] if this number is not finite
-  /// (NaN or an infinity), .
+  /// (NaN or an infinity).
+  /// ```dart
+  /// print(3.0.round()); // 3
+  /// print(3.25.round()); // 3
+  /// print(3.5.round()); // 4
+  /// print(3.75.round()); // 4
+  /// print((-3.5).round()); // -4
+  /// ```
   int round();
 
   /// Returns the greatest integer no greater than this number.
@@ -62,15 +74,31 @@
   /// Rounds the number towards negative infinity.
   ///
   /// Throws an [UnsupportedError] if this number is not finite
-  /// (NaN or infinity), .
+  /// (NaN or infinity).
+  /// ```dart
+  /// print(1.99999.floor()); // 1
+  /// print(2.0.floor()); // 2
+  /// print(2.99999.floor()); // 2
+  /// print((-1.99999).floor()); // -2
+  /// print((-2.0).floor()); // -2
+  /// print((-2.00001).floor()); // -3
+  /// ```
   int floor();
 
-  /// Returns the least integer which is not smaller than this number.
+  /// Returns the least integer that is not smaller than this number.
   ///
   /// Rounds the number towards infinity.
   ///
   /// Throws an [UnsupportedError] if this number is not finite
-  /// (NaN or an infinity), .
+  /// (NaN or an infinity).
+  /// ```dart
+  /// print(1.99999.ceil()); // 2
+  /// print(2.0.ceil()); // 2
+  /// print(2.00001.ceil()); // 3
+  /// print((-1.99999).ceil()); // -1
+  /// print((-2.0).ceil()); // -2
+  /// print((-2.00001).ceil()); // -2
+  /// ```
   int ceil();
 
   /// Returns the integer obtained by discarding any fractional
@@ -79,7 +107,15 @@
   /// Rounds the number towards zero.
   ///
   /// Throws an [UnsupportedError] if this number is not finite
-  /// (NaN or an infinity), .
+  /// (NaN or an infinity).
+  /// ```dart
+  /// print(2.00001.truncate()); // 2
+  /// print(1.99999.truncate()); // 1
+  /// print(0.5.truncate()); // 0
+  /// print((-0.5).truncate()); // 0
+  /// print((-1.5).truncate()); // -1
+  /// print((-2.5).truncate()); // -2
+  /// ```
   int truncate();
 
   /// Returns the integer double value closest to `this`.
@@ -92,8 +128,15 @@
   ///
   /// For the purpose of rounding, `-0.0` is considered to be below `0.0`,
   /// and `-0.0` is therefore considered closer to negative numbers than `0.0`.
-  /// This means that for a value, `d` in the range `-0.5 < d < 0.0`,
+  /// This means that for a value `d` in the range `-0.5 < d < 0.0`,
   /// the result is `-0.0`.
+  /// ```dart
+  /// print(3.0.roundToDouble()); // 3.0
+  /// print(3.25.roundToDouble()); // 3.0
+  /// print(3.5.roundToDouble()); // 4.0
+  /// print(3.75.roundToDouble()); // 4.0
+  /// print((-3.5).roundToDouble()); // -4.0
+  /// ```
   double roundToDouble();
 
   /// Returns the greatest integer double value no greater than `this`.
@@ -103,6 +146,14 @@
   ///
   /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
   /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`.
+  /// ```dart
+  /// print(1.99999.floorToDouble()); // 1.0
+  /// print(2.0.floorToDouble()); // 2.0
+  /// print(2.99999.floorToDouble()); // 2.0
+  /// print((-1.99999).floorToDouble()); // -2.0
+  /// print((-2.0).floorToDouble()); // -2.0
+  /// print((-2.00001).floorToDouble()); // -3.0
+  /// ```
   double floorToDouble();
 
   /// Returns the least integer double value no smaller than `this`.
@@ -112,6 +163,14 @@
   ///
   /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
   /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`.
+  /// ```dart
+  /// print(1.99999.ceilToDouble()); // 2.0
+  /// print(2.0.ceilToDouble()); // 2.0
+  /// print(2.00001.ceilToDouble()); // 3.0
+  /// print((-1.99999).ceilToDouble()); // -1.0
+  /// print((-2.0).ceilToDouble()); // -2.0
+  /// print((-2.00001).ceilToDouble()); // -2.0
+  /// ```
   double ceilToDouble();
 
   /// Returns the integer double value obtained by discarding any fractional
@@ -123,6 +182,15 @@
   /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
   /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and
   /// in the range `0.0 < d < 1.0` it will return 0.0.
+  /// ```dart
+  /// print(2.5.truncateToDouble()); // 2.0
+  /// print(2.00001.truncateToDouble()); // 2.0
+  /// print(1.99999.truncateToDouble()); // 1.0
+  /// print(0.5.truncateToDouble()); // 0.0
+  /// print((-0.5).truncateToDouble()); // -0.0
+  /// print((-1.5).truncateToDouble()); // -1.0
+  /// print((-2.5).truncateToDouble()); // -2.0
+  /// ```
   double truncateToDouble();
 
   /// Provide a representation of this [double] value.
@@ -139,7 +207,7 @@
   /// `d` is NaN).
   String toString();
 
-  /// Parse [source] as an double literal and return its value.
+  /// Parse [source] as a double literal and return its value.
   ///
   /// Accepts an optional sign (`+` or `-`) followed by either the characters
   /// "Infinity", the characters "NaN" or a floating-point representation.
@@ -176,9 +244,23 @@
   external static double parse(String source,
       [@deprecated double onError(String source)?]);
 
-  /// Parse [source] as an double literal and return its value.
+  /// Parse [source] as a double literal and return its value.
   ///
-  /// Like [parse] except that this function returns `null` for invalid inputs
+  /// Like [parse], except that this function returns `null` for invalid inputs
   /// instead of throwing.
+  ///
+  /// Example:
+  /// ```dart
+  /// var value = double.tryParse('3.14'); // 3.14
+  /// value = double.tryParse('  3.14 \xA0'); // 3.14
+  /// value = double.tryParse('0.'); // 0.0
+  /// value = double.tryParse('.0'); // 0.0
+  /// value = double.tryParse('-1.e3'); // -1000.0
+  /// value = double.tryParse('1234E+7'); // 12340000000.0
+  /// value = double.tryParse('+.12e-9'); // 1.2e-10
+  /// value = double.tryParse('-NaN'); // NaN
+  /// value = double.tryParse('0xFF'); // null
+  /// value = double.tryParse(double.infinity.toString()); // Infinity
+  /// ```
   external static double? tryParse(String source);
 }
diff --git a/sdk/lib/core/duration.dart b/sdk/lib/core/duration.dart
index 1e6b729..11fc5c8 100644
--- a/sdk/lib/core/duration.dart
+++ b/sdk/lib/core/duration.dart
@@ -12,7 +12,7 @@
 ///
 /// Durations are context independent. For example, a duration of 2 days is
 /// always 48 hours, even when it is added to a `DateTime` just when the
-/// time zone is about to do a daylight-savings switch. (See [DateTime.add]).
+/// time zone is about to make a daylight-savings switch. (See [DateTime.add]).
 ///
 /// Despite the same name, a `Duration` object does not implement "Durations"
 /// as specified by ISO 8601. In particular, a duration object does not keep
@@ -20,34 +20,69 @@
 /// only uses these arguments to compute the length of the corresponding time
 /// interval.
 ///
-/// To create a new Duration object, use this class's single constructor
+/// To create a new `Duration` object, use this class's single constructor
 /// giving the appropriate arguments:
 /// ```dart
-/// var fastestMarathon = const Duration(hours: 2, minutes: 3, seconds: 2);
+/// const fastestMarathon = Duration(hours: 2, minutes: 3, seconds: 2);
 /// ```
-/// The [Duration] is the sum of all individual parts.
-/// This means that individual parts can be larger than the next-bigger unit.
-/// For example, [inMinutes] can be greater than 59.
-/// ```dart
-/// const fastestMarathon = const Duration(hours: 2, minutes: 3, seconds: 2);
-/// assert(fastestMarathon.inMinutes == 123);
-/// ```
-/// All individual parts are allowed to be negative.
+/// The [Duration] represents a single number of microseconds,
+/// which is the sum of all the individual arguments to the constructor.
 ///
+/// Properties can access that single number in different ways.
+/// For example the [inMinutes] gives the number of whole minutes
+/// in the total duration, which includes the minutes that were provided
+/// as "hours" to the constructor, and can be larger than 59.
+///
+/// ```dart
+/// const fastestMarathon = Duration(hours: 2, minutes: 3, seconds: 2);
+/// print(fastestMarathon.inDays); // 0
+/// print(fastestMarathon.inHours); // 2
+/// print(fastestMarathon.inMinutes); // 123
+/// print(fastestMarathon.inSeconds); // 7382
+/// print(fastestMarathon.inMilliseconds); // 7382000
+/// ```
+/// The duration can be negative, in which case
+/// all the properties derived from the duration are also non-positive.
+/// ```dart
+/// const overDayAgo = Duration(days: -1, hours: -10);
+/// print(overDayAgo.inDays); // -1
+/// print(overDayAgo.inHours); // -34
+/// print(overDayAgo.inMinutes); // -2040
+/// ```
 /// Use one of the properties, such as [inDays],
-/// to retrieve the integer value of the Duration in the specified time unit.
+/// to retrieve the integer value of the `Duration` in the specified time unit.
 /// Note that the returned value is rounded down.
 /// For example,
 /// ```dart
-/// var aLongWeekend = const Duration(hours: 88);
-/// assert(aLongWeekend.inDays == 3);
+/// const aLongWeekend = Duration(hours: 88);
+/// print(aLongWeekend.inDays); // 3
 /// ```
 /// This class provides a collection of arithmetic
 /// and comparison operators,
 /// plus a set of constants useful for converting time units.
+/// ```dart
+/// const firstHalf = Duration(minutes: 45); // 00:45:00.000000
+/// const secondHalf = Duration(minutes: 45); // 00:45:00.000000
+/// const overTime = Duration(minutes: 30); // 00:30:00.000000
+/// final maxGameTime = firstHalf + secondHalf + overTime;
+/// print(maxGameTime.inMinutes); // 120
 ///
-/// See [DateTime] to represent a point in time.
-/// See [Stopwatch] to measure time-spans.
+/// // The duration of the firstHalf and secondHalf is the same, returns 0.
+/// var result = firstHalf.compareTo(secondHalf);
+/// print(result); // 0
+///
+/// // Duration of overTime is shorter than firstHalf, returns < 0.
+/// result = overTime.compareTo(firstHalf);
+/// print(result); // < 0
+///
+/// // Duration of secondHalf is longer than overTime, returns > 0.
+/// result = secondHalf.compareTo(overTime);
+/// print(result); // > 0
+/// ```
+///
+/// **See also:**
+/// * [DateTime] to represent a point in time.
+/// * [Stopwatch] to measure time-spans.
 class Duration implements Comparable<Duration> {
   /// The number of microseconds per millisecond.
   static const int microsecondsPerMillisecond = 1000;
@@ -130,6 +165,11 @@
   /// and it might lose precision.
   ///
   /// All arguments are 0 by default.
+  /// ```dart
+  /// const duration = Duration(days: 1, hours: 8, minutes: 56, seconds: 59,
+  ///   milliseconds: 30, microseconds: 10);
+  /// print(duration); // 32:56:59.030010
+  /// ```
   const Duration(
       {int days = 0,
       int hours = 0,
@@ -193,41 +233,69 @@
   bool operator >=(Duration other) => this._duration >= other._duration;
 
   /// The number of entire days spanned by this [Duration].
+  ///
+  /// For example, a duration of four days and three hours
+  /// has four entire days.
+  /// ```dart
+  /// const duration = Duration(days: 4, hours: 3);
+  /// print(duration.inDays); // 4
+  /// ```
   int get inDays => _duration ~/ Duration.microsecondsPerDay;
 
   /// The number of entire hours spanned by this [Duration].
   ///
   /// The returned value can be greater than 23.
-  /// For example a duration of four days and three hours
+  /// For example, a duration of four days and three hours
   /// has 99 entire hours.
+  /// ```dart
+  /// const duration = Duration(days: 4, hours: 3);
+  /// print(duration.inHours); // 99
+  /// ```
   int get inHours => _duration ~/ Duration.microsecondsPerHour;
 
   /// The number of whole minutes spanned by this [Duration].
   ///
   /// The returned value can be greater than 59.
-  /// For example a duration of three hours and 12 minutes
+  /// For example, a duration of three hours and 12 minutes
   /// has 192 minutes.
+  /// ```dart
+  /// const duration = Duration(hours: 3, minutes: 12);
+  /// print(duration.inMinutes); // 192
+  /// ```
   int get inMinutes => _duration ~/ Duration.microsecondsPerMinute;
 
   /// The number of whole seconds spanned by this [Duration].
   ///
   /// The returned value can be greater than 59.
-  /// For example a duration of three minutes and 12 seconds
+  /// For example, a duration of three minutes and 12 seconds
   /// has 192 seconds.
+  /// ```dart
+  /// const duration = Duration(minutes: 3, seconds: 12);
+  /// print(duration.inSeconds); // 192
+  /// ```
   int get inSeconds => _duration ~/ Duration.microsecondsPerSecond;
 
   /// The number of whole milliseconds spanned by this [Duration].
   ///
   /// The returned value can be greater than 999.
-  /// For example a duration of three seconds and 125 milliseconds
+  /// For example, a duration of three seconds and 125 milliseconds
   /// has 3125 milliseconds.
+  /// ```dart
+  /// const duration = Duration(seconds: 3, milliseconds: 125);
+  /// print(duration.inMilliseconds); // 3125
+  /// ```
   int get inMilliseconds => _duration ~/ Duration.microsecondsPerMillisecond;
 
   /// The number of whole microseconds spanned by this [Duration].
   ///
   /// The returned value can be greater than 999999.
-  /// For example a duration of three seconds, 125 milliseconds and
+  /// For example, a duration of three seconds, 125 milliseconds and
   /// 369 microseconds has 3125369 microseconds.
+  /// ```dart
+  /// const duration = Duration(seconds: 3, milliseconds: 125,
+  ///     microseconds: 369);
+  /// print(duration.inMicroseconds); // 3125369
+  /// ```
   int get inMicroseconds => _duration;
 
   /// Whether this [Duration] has the same length as [other].
@@ -255,11 +323,11 @@
   /// Returns a string with hours, minutes, seconds, and microseconds, in the
   /// following format: `H:MM:SS.mmmmmm`. For example,
   /// ```dart
-  /// var d = Duration(days: 1, hours: 1, minutes: 33, microseconds: 500);
-  /// d.toString();  // "25:33:00.000500"
+  /// var d = const Duration(days: 1, hours: 1, minutes: 33, microseconds: 500);
+  /// print(d.toString()); // 25:33:00.000500
   ///
-  /// d = Duration(days: 0, hours: 1, minutes: 10, microseconds: 500);
-  /// d.toString();  // "1:10:00.000500"
+  /// d = const Duration(hours: 1, minutes: 10, microseconds: 500);
+  /// print(d.toString()); // 1:10:00.000500
   /// ```
   String toString() {
     var microseconds = inMicroseconds;
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 3770a2b..6190c83 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -92,6 +92,23 @@
   /// trace filled in the first time they are thrown by a `throw`
   /// expression.
   external StackTrace? get stackTrace;
+
+  /// Throws [error] with associated stack trace [stackTrace].
+  ///
+  /// If [error] extends [Error] and has not yet been thrown,
+  /// its [stackTrace] is set as well, just as if it was thrown by a `throw`.
+  /// The actual stack trace captured along with the [error],
+  /// or set on [error] if it is an [Error],
+  /// may not be the [stackTrace] object itself,
+  /// but will be a stack trace with the same content.
+  @Since("2.16")
+  static Never throwWithStackTrace(Object error, StackTrace stackTrace) {
+    checkNotNullable(error, "error");
+    checkNotNullable(stackTrace, "stackTrace");
+    _throw(error, stackTrace);
+  }
+
+  external static Never _throw(Object error, StackTrace stackTrace);
 }
 
 /// Error thrown by the runtime system when an assert statement fails.
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index ccf2775..32c6682 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -20,6 +20,11 @@
 /// operands to 32-bit integers when compiled to JavaScript.
 ///
 /// Classes cannot extend, implement, or mix in `int`.
+///
+/// **See also:**
+/// * [num] the super class for [int].
+/// * [Numbers](https://dart.dev/guides/language/numbers) in
+/// [A tour of the Dart language](https://dart.dev/guides/language/language-tour).
 abstract class int extends num {
   /// Returns the integer value of the given environment declaration [name].
   ///
@@ -59,6 +64,11 @@
   ///
   /// If both operands are negative, the result is negative, otherwise
   /// the result is non-negative.
+  /// ```dart
+  /// print((2 & 1).toRadixString(2)); // 0010 & 0001 -> 0000
+  /// print((3 & 1).toRadixString(2)); // 0011 & 0001 -> 0001
+  /// print((10 & 2).toRadixString(2)); // 1010 & 0010 -> 0010
+  /// ```
   int operator &(int other);
 
   /// Bit-wise or operator.
@@ -69,6 +79,13 @@
   ///
   /// If both operands are non-negative, the result is non-negative,
   /// otherwise the result is negative.
+  ///
+  /// Example:
+  /// ```dart
+  /// print((2 | 1).toRadixString(2)); // 0010 | 0001 -> 0011
+  /// print((3 | 1).toRadixString(2)); // 0011 | 0001 -> 0011
+  /// print((10 | 2).toRadixString(2)); // 1010 | 0010 -> 1010
+  /// ```
   int operator |(int other);
 
   /// Bit-wise exclusive-or operator.
@@ -79,6 +96,13 @@
   ///
   /// If the operands have the same sign, the result is non-negative,
   /// otherwise the result is negative.
+  ///
+  /// Example:
+  /// ```dart
+  /// print((2 ^ 1).toRadixString(2)); //  0010 ^ 0001 -> 0011
+  /// print((3 ^ 1).toRadixString(2)); //  0011 ^ 0001 -> 0010
+  /// print((10 ^ 2).toRadixString(2)); //  1010 ^ 0010 -> 1000
+  /// ```
   int operator ^(int other);
 
   /// The bit-wise negate operator.
@@ -99,15 +123,31 @@
   /// mask.
   ///
   /// It is an error if [shiftAmount] is negative.
+  ///
+  /// Example:
+  /// ```dart
+  /// print((3 << 1).toRadixString(2)); // 0011 -> 0110
+  /// print((9 << 2).toRadixString(2)); // 1001 -> 100100
+  /// print((10 << 3).toRadixString(2)); // 1010 -> 1010000
+  /// ```
   int operator <<(int shiftAmount);
 
   /// Shift the bits of this integer to the right by [shiftAmount].
   ///
   /// Shifting to the right makes the number smaller and drops the least
   /// significant bits, effectively doing an integer division by
-  ///`pow(2, shiftIndex)`.
+  /// `pow(2, shiftIndex)`.
   ///
   /// It is an error if [shiftAmount] is negative.
+  ///
+  /// Example:
+  /// ```dart
+  /// print((3 >> 1).toRadixString(2)); // 0011 -> 0001
+  /// print((9 >> 2).toRadixString(2)); // 1001 -> 0010
+  /// print((10 >> 3).toRadixString(2)); // 1010 -> 0001
+  /// print((-6 >> 2).toRadixString); // 111...1010 -> 111...1110 == -2
+  /// print((-85 >> 3).toRadixString); // 111...10101011 -> 111...11110101 == -11
+  /// ```
   int operator >>(int shiftAmount);
 
   /// Bitwise unsigned right shift by [shiftAmount] bits.
@@ -117,6 +157,13 @@
   /// and zero-bits are shifted in as the new most significant bits.
   ///
   /// The [shiftAmount] must be non-negative.
+  ///
+  /// Example:
+  /// ```dart
+  /// print((3 >>> 1).toRadixString(2)); // 0011 -> 0001
+  /// print((9 >>> 2).toRadixString(2)); // 1001 -> 0010
+  /// print(((-9) >>> 2).toRadixString(2)); // 111...1011 -> 001...1110 (> 0)
+  /// ```
   int operator >>>(int shiftAmount);
 
   /// Returns this integer to the power of [exponent] modulo [modulus].
@@ -144,6 +191,15 @@
   /// For any integer `x`, `x.gcd(x)` is `x.abs()`.
   ///
   /// If both `this` and `other` is zero, the result is also zero.
+  ///
+  /// Example:
+  /// ```dart
+  /// print(4.gcd(2)); // 2
+  /// print(8.gcd(4)); // 4
+  /// print(10.gcd(12)); // 2
+  /// print(10.gcd(0)); // 10
+  /// print((-2).gcd(-3)); // 1
+  /// ```
   int gcd(int other);
 
   /// Returns true if and only if this integer is even.
@@ -196,8 +252,8 @@
   int toUnsigned(int width);
 
   /// Returns the least significant [width] bits of this integer, extending the
-  /// highest retained bit to the sign.  This is the same as truncating the value
-  /// to fit in [width] bits using an signed 2-s complement representation.  The
+  /// highest retained bit to the sign. This is the same as truncating the value
+  /// to fit in [width] bits using an signed 2-s complement representation. The
   /// returned value has the same bit value in all positions higher than [width].
   ///
   /// ```dart
@@ -276,9 +332,28 @@
   /// Converts [this] to a string representation in the given [radix].
   ///
   /// In the string representation, lower-case letters are used for digits above
-  /// '9', with 'a' being 10 an 'z' being 35.
+  /// '9', with 'a' being 10 and 'z' being 35.
   ///
   /// The [radix] argument must be an integer in the range 2 to 36.
+  ///
+  /// Example:
+  /// ```dart
+  /// // Binary (base 2).
+  /// print(12.toRadixString(2)); // 1100
+  /// print(31.toRadixString(2)); // 11111
+  /// print(2021.toRadixString(2)); // 11111100101
+  /// print((-12).toRadixString(2)); // -1100
+  /// // Octal (base 8).
+  /// print(12.toRadixString(8)); // 14
+  /// print(31.toRadixString(8)); // 37
+  /// print(2021.toRadixString(8)); // 3745
+  /// // Hexadecimal (base 16).
+  /// print(12.toRadixString(16)); // c
+  /// print(31.toRadixString(16)); // 1f
+  /// print(2021.toRadixString(16)); // 7e5
+  /// // Base 36.
+  /// print((35 * 36 + 1).toRadixString(36)); // z1
+  /// ```
   String toRadixString(int radix);
 
   /// Parse [source] as a, possibly signed, integer literal and return its value.
@@ -309,6 +384,7 @@
   ///
   /// Instead of throwing and immediately catching the [FormatException],
   /// instead use [tryParse] to handle a parsing error.
+  ///
   /// Example:
   /// ```dart
   /// var value = int.tryParse(text);
@@ -333,5 +409,29 @@
   ///
   /// Like [parse] except that this function returns `null` where a
   /// similar call to [parse] would throw a [FormatException].
+  ///
+  /// Example:
+  /// ```dart
+  /// print(int.tryParse('2021')); // 2021
+  /// print(int.tryParse('1f')); // null
+  /// // From binary (base 2) value.
+  /// print(int.tryParse('1100', radix: 2)); // 12
+  /// print(int.tryParse('00011111', radix: 2)); // 31
+  /// print(int.tryParse('011111100101', radix: 2)); // 2021
+  /// // From octal (base 8) value.
+  /// print(int.tryParse('14', radix: 8)); // 12
+  /// print(int.tryParse('37', radix: 8)); // 31
+  /// print(int.tryParse('3745', radix: 8)); // 2021
+  /// // From hexadecimal (base 16) value.
+  /// print(int.tryParse('c', radix: 16)); // 12
+  /// print(int.tryParse('1f', radix: 16)); // 31
+  /// print(int.tryParse('7e5', radix: 16)); // 2021
+  /// // From base 35 value.
+  /// print(int.tryParse('y1', radix: 35)); // 1191 == 34 * 35 + 1
+  /// print(int.tryParse('z1', radix: 35)); // null
+  /// // From base 36 value.
+  /// print(int.tryParse('y1', radix: 36)); // 1225 == 34 * 36 + 1
+  /// print(int.tryParse('z1', radix: 36)); // 1261 == 35 * 36 + 1
+  /// ```
   external static int? tryParse(String source, {int? radix});
 }
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 0b42ab7..41d7e23 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -162,6 +162,13 @@
   /// The returned iterable will provide the same elements as this iterable,
   /// and, after that, the elements of [other], in the same order as in the
   /// original iterables.
+  ///
+  /// Example:
+  /// ```dart
+  /// var planets = <String>['Earth', 'Jupiter'];
+  /// var updated = planets.followedBy(['Mars', 'Venus']);
+  /// print(updated); // (Earth, Jupiter, Mars, Venus)
+  /// ```
   Iterable<E> followedBy(Iterable<E> other) {
     var self = this; // TODO(lrn): Remove when we can promote `this`.
     if (self is EfficientLengthIterable<E>) {
@@ -189,13 +196,24 @@
   /// For example, [elementAt] may call `toElement` only once.
   ///
   /// Equivalent to:
-  /// ```dart
+  /// ```
   /// Iterable<T> map<T>(T toElement(E e)) sync* {
   ///   for (var value in this) {
   ///     yield toElement(value);
   ///   }
   /// }
   /// ```
+  /// Example:
+  /// ```dart import:convert
+  /// var products = jsonDecode('''
+  /// [
+  ///   {"name": "Screwdriver", "price": 42.00},
+  ///   {"name": "Wingnut", "price": 0.50}
+  /// ]
+  /// ''');
+  /// var values = products.map((product) => product['price'] as double);
+  /// var totalPrice = values.fold(0.0, (a, b) => a + b); // 42.5.
+  /// ```
   Iterable<T> map<T>(T toElement(E e)) => MappedIterable<E, T>(this, toElement);
 
   /// Returns a new lazy [Iterable] with all elements that satisfy the
@@ -210,6 +228,14 @@
   /// Iterating will not cache results, and thus iterating multiple times over
   /// the returned [Iterable] may invoke the supplied
   /// function [test] multiple times on the same element.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// var result = numbers.where((x) => x < 5); // (1, 2, 3)
+  /// result = numbers.where((x) => x > 5); // (6, 7)
+  /// result = numbers.where((x) => x.isEven); // (2, 6)
+  /// ```
   Iterable<E> where(bool test(E element)) => WhereIterable<E>(this, test);
 
   /// Returns a new lazy [Iterable] with all elements that have type [T].
@@ -233,17 +259,18 @@
   ///
   /// Example:
   /// ```dart
-  /// var pairs = [[1, 2], [3, 4]];
-  /// var flattened = pairs.expand((pair) => pair).toList();
-  /// print(flattened); // => [1, 2, 3, 4];
+  /// Iterable<int> count(int n) sync* {
+  ///   for (var i = 1; i <= n; i++) {
+  ///     yield i;
+  ///    }
+  ///  }
   ///
-  /// var input = [1, 2, 3];
-  /// var duplicated = input.expand((i) => [i, i]).toList();
-  /// print(duplicated); // => [1, 1, 2, 2, 3, 3]
+  /// var numbers = [1, 3, 0, 2];
+  /// print(numbers.expand(count)); // (1, 1, 2, 3, 1, 2)
   /// ```
   ///
   /// Equivalent to:
-  /// ```dart
+  /// ```
   /// Iterable<T> expand<T>(Iterable<T> toElements(E e)) sync* {
   ///   for (var value in this) {
   ///     yield* toElements(value);
@@ -267,6 +294,15 @@
   /// (see [Set.identity]) that its `contains` uses.
   /// Likewise the `Iterable` returned by a [Map.keys] call
   /// should use the same equality that the `Map` uses for keys.
+  ///
+  /// Example:
+  /// ```dart
+  /// final gasPlanets = <int, String>{1: 'Jupiter', 2: 'Saturn'};
+  /// final containsOne = gasPlanets.keys.contains(1); // true
+  /// final containsFive = gasPlanets.keys.contains(5); // false
+  /// final containsJupiter = gasPlanets.values.contains('Jupiter'); // true
+  /// final containsMercury = gasPlanets.values.contains('Mercury'); // false
+  /// ```
   bool contains(Object? element) {
     for (E e in this) {
       if (e == element) return true;
@@ -275,6 +311,16 @@
   }
 
   /// Invokes [action] on each element of this iterable in iteration order.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 6, 7];
+  /// numbers.forEach(print);
+  /// // 1
+  /// // 2
+  /// // 6
+  /// // 7
+  /// ```
   void forEach(void action(E element)) {
     for (E element in this) action(element);
   }
@@ -288,7 +334,7 @@
   /// Otherwise this method starts with the first element from the iterator,
   /// and then combines it with the remaining elements in iteration order,
   /// as if by:
-  /// ```dart
+  /// ```
   /// E value = iterable.first;
   /// iterable.skip(1).forEach((element) {
   ///   value = combine(value, element);
@@ -297,7 +343,9 @@
   /// ```
   /// Example of calculating the sum of an iterable:
   /// ```dart
-  /// iterable.reduce((value, element) => value + element);
+  /// final numbers = <double>[10, 2, 5, 0.5];
+  /// final result = numbers.reduce((value, element) => value + element);
+  /// print(result); // 17.5
   /// ```
   E reduce(E combine(E value, E element)) {
     Iterator<E> iterator = this.iterator;
@@ -317,7 +365,7 @@
   /// Uses [initialValue] as the initial value,
   /// then iterates through the elements and updates the value with
   /// each element using the [combine] function, as if by:
-  /// ```dart
+  /// ```
   /// var value = initialValue;
   /// for (E element in this) {
   ///   value = combine(value, element);
@@ -326,7 +374,11 @@
   /// ```
   /// Example of calculating the sum of an iterable:
   /// ```dart
-  /// iterable.fold(0, (prev, element) => prev + element);
+  /// final numbers = <double>[10, 2, 5, 0.5];
+  /// const initialValue = 100.0;
+  /// final result = numbers.fold<double>(
+  ///     initialValue, (previousValue, element) => previousValue + element);
+  /// print(result); // 117.5
   /// ```
   T fold<T>(T initialValue, T combine(T previousValue, E element)) {
     var value = initialValue;
@@ -338,6 +390,14 @@
   ///
   /// Checks every element in iteration order, and returns `false` if
   /// any of them make [test] return `false`, otherwise returns `true`.
+  ///
+  /// Example:
+  /// ```dart
+  /// final planetsByMass = <double, String>{0.06: 'Mercury', 0.81: 'Venus',
+  ///   0.11: 'Mars'};
+  /// // Checks whether all keys are smaller than 1.
+  /// final every = planetsByMass.keys.every((key) => key < 1.0); // true
+  /// ```
   bool every(bool test(E element)) {
     for (E element in this) {
       if (!test(element)) return false;
@@ -351,6 +411,13 @@
   /// converts each one to a [String] by calling [Object.toString],
   /// and then concatenates the strings, with the
   /// [separator] string interleaved between the elements.
+  ///
+  /// Example:
+  /// ```dart
+  /// final planetsByMass = <double, String>{0.06: 'Mercury', 0.81: 'Venus',
+  ///   0.11: 'Mars'};
+  /// final joinedNames = planetsByMass.values.join('-'); // Mercury-Venus-Mars
+  /// ```
   String join([String separator = ""]) {
     Iterator<E> iterator = this.iterator;
     if (!iterator.moveNext()) return "";
@@ -373,6 +440,13 @@
   ///
   /// Checks every element in iteration order, and returns `true` if
   /// any of them make [test] return `true`, otherwise returns false.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// var result = numbers.any((element) => element >= 5); // true;
+  /// result = numbers.any((element) => element >= 10); // false;
+  /// ```
   bool any(bool test(E element)) {
     for (E element in this) {
       if (test(element)) return true;
@@ -384,6 +458,14 @@
   ///
   /// The elements are in iteration order.
   /// The list is fixed-length if [growable] is false.
+  ///
+  /// Example:
+  /// ```dart
+  /// final planets = <int, String>{1: 'Mercury', 2: 'Venus', 3: 'Mars'};
+  /// final keysList = planets.keys.toList(growable: false); // [1, 2, 3]
+  /// final valuesList =
+  ///     planets.values.toList(growable: false); // [Mercury, Venus, Mars]
+  /// ```
   List<E> toList({bool growable = true}) {
     return List<E>.of(this, growable: growable);
   }
@@ -395,6 +477,12 @@
   /// or it contains one or more elements that are equal.
   /// The order of the elements in the set is not guaranteed to be the same
   /// as for the iterable.
+  ///
+  /// Example:
+  /// ```dart
+  /// final planets = <int, String>{1: 'Mercury', 2: 'Venus', 3: 'Mars'};
+  /// final valueSet = planets.values.toSet(); // {Mercury, Venus, Mars}
+  /// ```
   Set<E> toSet() => Set<E>.of(this);
 
   /// Returns the number of elements in [this].
@@ -415,11 +503,25 @@
   /// Whether this collection has no elements.
   ///
   /// May be computed by checking if `iterator.moveNext()` returns `false`.
+  ///
+  /// Example:
+  /// ```dart
+  /// final emptyList = <int>[];
+  /// print(emptyList.isEmpty); // true;
+  /// print(emptyList.iterator.moveNext()); // false
+  /// ```
   bool get isEmpty => !iterator.moveNext();
 
   /// Whether this collection has at least one element.
   ///
   /// May be computed by checking if `iterator.moveNext()` returns `true`.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>{1, 2, 3};
+  /// print(numbers.isNotEmpty); // true;
+  /// print(numbers.iterator.moveNext()); // true
+  /// ```
   bool get isNotEmpty => !isEmpty;
 
   /// Returns a lazy iterable of the [count] first elements of this iterable.
@@ -431,6 +533,13 @@
   /// elements have been seen.
   ///
   /// The `count` must not be negative.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// final result = numbers.take(4); // (1, 2, 3, 5)
+  /// final takeAll = numbers.take(100); // (1, 2, 3, 5, 6, 7)
+  /// ```
   Iterable<E> take(int count) {
     return TakeIterable<E>(this, count);
   }
@@ -443,6 +552,15 @@
   /// The elements can be computed by stepping through [iterator] until an
   /// element is found where `test(element)` is false. At that point,
   /// the returned iterable stops (its `moveNext()` returns false).
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// var result = numbers.takeWhile((x) => x < 5); // (1, 2, 3)
+  /// result = numbers.takeWhile((x) => x != 3); // (1, 2)
+  /// result = numbers.takeWhile((x) => x != 4); // (1, 2, 3, 5, 6, 7)
+  /// result = numbers.takeWhile((x) => x.isOdd); // (1)
+  /// ```
   Iterable<E> takeWhile(bool test(E value)) {
     return TakeWhileIterable<E>(this, test);
   }
@@ -460,6 +578,13 @@
   /// through earlier elements, for example when iterating a [List].
   /// Such iterables are allowed to ignore the initial skipped elements.
   ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// final result = numbers.skip(4); // (6, 7)
+  /// final skipAll = numbers.skip(100); // () - no elements.
+  /// ```
+  ///
   /// The [count] must not be negative.
   Iterable<E> skip(int count) {
     return SkipIterable<E>(this, count);
@@ -475,6 +600,15 @@
   /// true. If all elements satisfy `test` the resulting iterable is empty,
   /// otherwise it iterates the remaining elements in their original order,
   /// starting with the first element for which `test(element)` returns `false`.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// var result = numbers.skipWhile((x) => x < 5); // (5, 6, 7)
+  /// result = numbers.skipWhile((x) => x != 3); // (3, 5, 6, 7)
+  /// result = numbers.skipWhile((x) => x != 4); // ()
+  /// result = numbers.skipWhile((x) => x.isOdd); // (2, 3, 5, 6, 7)
+  /// ```
   Iterable<E> skipWhile(bool test(E value)) {
     return SkipWhileIterable<E>(this, test);
   }
@@ -527,6 +661,15 @@
   ///
   /// Iterates through elements and returns the first to satisfy [test].
   ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// var result = numbers.firstWhere((element) => element < 5); // 1
+  /// result = numbers.firstWhere((element) => element > 5); // 6
+  /// result =
+  ///     numbers.firstWhere((element) => element > 10, orElse: () => -1); // -1
+  /// ```
+  ///
   /// If no element satisfies [test], the result of invoking the [orElse]
   /// function is returned.
   /// If [orElse] is omitted, it defaults to throwing a [StateError].
@@ -547,6 +690,15 @@
   /// checks `test(element)` for each,
   /// and finally returns that last one that matched.
   ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// var result = numbers.lastWhere((element) => element < 5); // 3
+  /// result = numbers.lastWhere((element) => element > 5); // 7
+  /// result = numbers.lastWhere((element) => element > 10,
+  ///     orElse: () => -1); // -1
+  /// ```
+  ///
   /// If no element satisfies [test], the result of invoking the [orElse]
   /// function is returned.
   /// If [orElse] is omitted, it defaults to throwing a [StateError].
@@ -571,6 +723,22 @@
   /// If more than one matching element is found, throws [StateError].
   /// If no matching element is found, returns the result of [orElse].
   /// If [orElse] is omitted, it defaults to throwing a [StateError].
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[2, 2, 10];
+  /// var result = numbers.singleWhere((element) => element > 5); // 10
+  /// ```
+  /// When no matching element is found, the result of calling [orElse] is
+  /// returned instead.
+  /// ```dart continued
+  /// result = numbers.singleWhere((element) => element == 1,
+  ///     orElse: () => -1); // -1
+  /// ```
+  /// There must not be more than one matching element.
+  /// ```dart continued
+  /// result = numbers.singleWhere((element) => element == 2); // Throws Error.
+  /// ```
   E singleWhere(bool test(E element), {E orElse()?}) {
     late E result;
     bool foundMatching = false;
@@ -597,6 +765,12 @@
   /// May iterate through the elements in iteration order, ignoring the
   /// first [index] elements and then returning the next.
   /// Some iterables may have a more efficient way to find the element.
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 5, 6, 7];
+  /// final elementAt = numbers.elementAt(4); // 6
+  /// ```
   E elementAt(int index) {
     RangeError.checkNotNegative(index, "index");
     int elementIndex = 0;
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index 1c51340..bc3ac77 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -9,11 +9,14 @@
 /// Subclasses of this class implement different kinds of lists.
 /// The most common kinds of lists are:
 ///
-/// * Fixed-length list.
+/// * **Fixed-length list**
+///
 ///   An error occurs when attempting to use operations
 ///   that can change the length of the list.
 ///
-/// * Growable list. Full implementation of the API defined in this class.
+/// * **Growable list**
+///
+///   Full implementation of the API defined in this class.
 ///
 /// The default growable list, as created by `[]`, keeps
 /// an internal buffer, and grows that buffer when necessary. This guarantees
@@ -23,18 +26,78 @@
 /// operation will need to immediately increase the buffer capacity.
 /// Other list implementations may have different performance behavior.
 ///
-/// The following code illustrates that some List implementations support
-/// only a subset of the API.
+/// Example of fixed-length list:
 /// ```dart
-/// var fixedLengthList = List<int>.filled(5, 0);
-/// fixedLengthList.length = 0;  // Error
-/// fixedLengthList.add(499);    // Error
+/// final fixedLengthList = List<int>.filled(5, 0); // Creates fixed-length list.
+/// print(fixedLengthList); // [0, 0, 0, 0, 0]
 /// fixedLengthList[0] = 87;
-/// var growableList = [1, 2];
-/// growableList.length = 0;
-/// growableList.add(499);
-/// growableList[0] = 87;
+/// fixedLengthList.setAll(1, [1, 2, 3]);
+/// print(fixedLengthList); // [87, 1, 2, 3, 0]
+/// // Fixed length list length can't be changed or increased
+/// fixedLengthList.length = 0;  // Throws
+/// fixedLengthList.add(499);    // Throws
 /// ```
+///
+/// Example of growable list:
+/// ```dart
+/// final growableList = <String>['A', 'B']; // Creates growable list.
+/// ```
+/// To add data to the growable list, use [operator[]=], [add] or [addAll].
+/// ```
+/// growableList[0] = 'G';
+/// print(growableList); // [G, B]
+/// growableList.add('X');
+/// growableList.addAll({'C', 'B'});
+/// print(growableList); // [G, B, X, C, B]
+/// ```
+/// To check whether, and where, the element is in the list, use [indexOf] or
+/// [lastIndexOf].
+/// ```
+/// final indexA = growableList.indexOf('A'); // -1 (not in the list)
+/// final firstIndexB = growableList.indexOf('B'); // 1
+/// final lastIndexB = growableList.lastIndexOf('B'); // 4
+/// ```
+/// To remove an element from the growable list, use [remove], [removeAt],
+/// [removeLast], [removeRange] or [removeWhere].
+/// ```
+/// growableList.remove('C');
+/// growableList.removeLast();
+/// print(growableList); // [G, B, X]
+/// ```
+/// To insert an element at position in the list, use [insert] or [insertAll].
+/// ```
+/// growableList.insert(1, 'New');
+/// print(growableList); // [G, New, B, X]
+/// ```
+/// To replace a range of elements in the list, use [fillRange], [replaceRange]
+/// or [setRange].
+/// ```
+/// growableList.replaceRange(0, 2, ['AB', 'A']);
+/// print(growableList); // [AB, A, B, X]
+/// growableList.fillRange(2, 4, 'F');
+/// print(growableList); // [AB, A, F, F]
+/// ```
+/// To sort the elements of the list, use [sort].
+/// ```
+/// growableList.sort((a, b) => a.compareTo(b));
+/// print(growableList); // [A, AB, F, F]
+/// ```
+/// To shuffle the elements of this list randomly, use [shuffle].
+/// ```
+/// growableList.shuffle();
+/// print(growableList); // e.g. [AB, F, A, F]
+/// ```
+/// To find the first element satisfying some predicate, or give a default
+/// value if none do, use [firstWhere].
+/// ```
+/// bool isVowel(String char) => char.length == 1 && "AEIOU".contains(char);
+/// final firstVowel = growableList.firstWhere(isVowel, orElse: () => ''); // ''
+/// ```
+/// There are similar [lastWhere] and [singleWhere] methods.
+///
+/// A list is an [Iterable] and supports all its methods, including
+/// [where], [map], [whereType] and [toList].
+///
 /// Lists are [Iterable]. Iteration occurs over values in index order. Changing
 /// the values does not affect iteration, but changing the valid
 /// indices&mdash;that is, changing the list's length&mdash;between iteration
@@ -52,7 +115,7 @@
 abstract class List<E> implements EfficientLengthIterable<E> {
   /// Creates a list of the given length.
   ///
-  /// **NOTICE**: This constructor cannot be used in null-safe code.
+  /// **NOTE**: This constructor cannot be used in null-safe code.
   /// Use [List.filled] to create a non-empty list.
   /// This requires a fill value to initialize the list elements with.
   /// To create an empty list, use `[]` for a growable list or
@@ -93,7 +156,7 @@
   ///
   /// Example:
   /// ```dart
-  /// List<int>.filled(3, 0, growable: true); // [0, 0, 0]
+  /// final zeroList = List<int>.filled(3, 0, growable: true); // [0, 0, 0]
   /// ```
   ///
   /// The created list is fixed-length if [growable] is false (the default)
@@ -106,16 +169,16 @@
   ///
   /// All elements of the created list share the same [fill] value.
   /// ```dart
-  /// var shared = List.filled(3, []);
+  /// final shared = List.filled(3, []);
   /// shared[0].add(499);
-  /// print(shared);  // => [[499], [499], [499]]
+  /// print(shared);  // [[499], [499], [499]]
   /// ```
   /// You can use [List.generate] to create a list with a fixed length
   /// and a new object at each position.
   /// ```dart
-  /// var unique = List.generate(3, (_) => []);
+  /// final unique = List.generate(3, (_) => []);
   /// unique[0].add(499);
-  /// print(unique); // => [[499], [], []]
+  /// print(unique); // [[499], [], []]
   /// ```
   external factory List.filled(int length, E fill, {bool growable = false});
 
@@ -124,6 +187,13 @@
   /// If [growable] is `false`, which is the default,
   /// the list is a fixed-length list of length zero.
   /// If [growable] is `true`, the list is growable and equivalent to `<E>[]`.
+  /// ```dart
+  /// final growableList = List.empty(growable: true); // []
+  /// growableList.add(1); // [1]
+  ///
+  /// final fixedLengthList = List.empty(growable: false);
+  /// fixedLengthList.add(1); // error
+  /// ```
   @Since("2.9")
   external factory List.empty({bool growable = false});
 
@@ -132,12 +202,24 @@
   /// The [Iterator] of [elements] provides the order of the elements.
   ///
   /// All the [elements] should be instances of [E].
+  ///
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[1, 2, 3];
+  /// final listFrom = List<int>.from(numbers);
+  /// print(listFrom); // [1, 2, 3]
+  /// ```
   /// The `elements` iterable itself may have any element type, so this
   /// constructor can be used to down-cast a `List`, for example as:
-  /// ```dart
-  /// List<dynamic> dynList = ...some JSON value...;
-  /// List<Map<String, dynamic>> fooList =
-  ///     List.from(dynList.where((x) => x is Map && x["kind"] == "foo"));
+  /// ```dart import:convert
+  /// const jsonArray = '''
+  ///   [{"text": "foo", "value": 1, "status": true},
+  ///    {"text": "bar", "value": 2, "status": false}]
+  /// ''';
+  /// final List<dynamic> dynamicList = jsonDecode(jsonArray);
+  /// final List<Map<String, dynamic>> fooData =
+  ///     List.from(dynamicList.where((x) => x is Map && x['text'] == 'foo'));
+  /// print(fooData); // [{text: foo, value: 1, status: true}]
   /// ```
   ///
   /// This constructor creates a growable list when [growable] is true;
@@ -150,6 +232,11 @@
   ///
   /// This constructor creates a growable list when [growable] is true;
   /// otherwise, it returns a fixed-length list.
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3];
+  /// final listOf = List<num>.of(numbers);
+  /// print(listOf); // [1, 2, 3]
+  /// ```
   external factory List.of(Iterable<E> elements, {bool growable = true});
 
   /// Generates a list of values.
@@ -158,7 +245,13 @@
   /// calling [generator] for each index in the range `0` .. `length - 1`
   /// in increasing order.
   /// ```dart
-  /// List<int>.generate(3, (int index) => index * index); // [0, 1, 4]
+  /// final growableList =
+  ///     List<int>.generate(3, (int index) => index * index, growable: true);
+  /// print(growableList); // [0, 1, 4]
+  ///
+  /// final fixedLengthList =
+  ///     List<int>.generate(3, (int index) => index * index, growable: false);
+  /// print(fixedLengthList); // [0, 1, 4]
   /// ```
   /// The created list is fixed-length if [growable] is set to false.
   ///
@@ -173,6 +266,11 @@
   /// An unmodifiable list cannot have its length or elements changed.
   /// If the elements are themselves immutable, then the resulting list
   /// is also immutable.
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3];
+  /// final unmodifiableList = List.unmodifiable(numbers); // [1, 2, 3]
+  /// unmodifiableList[1] = 87; // Throws.
+  /// ```
   external factory List.unmodifiable(Iterable elements);
 
   /// Adapts [source] to be a `List<T>`.
@@ -203,7 +301,7 @@
   /// If [start] is omitted, it defaults to zero.
   /// If [end] is omitted, it defaults to [source].length.
   ///
-  /// If [source] and [target] is the same list, overlapping source and target
+  /// If [source] and [target] are the same list, overlapping source and target
   /// ranges are respected so that the target range ends up containing the
   /// initial content of the source range.
   /// Otherwise the order of element copying is not guaranteed.
@@ -262,8 +360,8 @@
   /// that is not an instance of [R], the access will throw instead.
   ///
   /// Elements added to the list (e.g., by using [add] or [addAll])
-  /// must be instance of [R] to be valid arguments to the adding function,
-  /// and they must be instances of [E] as well to be accepted by
+  /// must be instances of [R] to be valid arguments to the adding function,
+  /// and they must also be instances of [E] to be accepted by
   /// this list as well.
   ///
   /// Methods which accept `Object?` as argument, like [contains] and [remove],
@@ -289,64 +387,120 @@
   /// less than [length].
   void operator []=(int index, E value);
 
-  /// Updates the first position of the list to contain [value].
+  /// The first element of the list.
   ///
-  /// Equivalent to `theList[0] = value;`.
+  /// The list must be non-empty when accessing its first element.
   ///
-  /// The list must be non-empty.
+  /// The first element of a list can be modified, unlike an [Iterable].
+  /// A `list.first` is equivalent to `list[0]`,
+  /// both for getting and setting the value.
+  ///
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3];
+  /// print(numbers.first); // 1
+  /// numbers.first = 10;
+  /// print(numbers.first); // 10
+  /// numbers.clear();
+  /// numbers.first; // Throws.
+  /// ```
   void set first(E value);
 
-  /// Updates the last position of the list to contain [value].
+  /// The last element of the list.
   ///
-  /// Equivalent to `theList[theList.length - 1] = value;`.
+  /// The list must be non-empty when accessing its last element.
   ///
-  /// The list must be non-empty.
+  /// The last element of a list can be modified, unlike an [Iterable].
+  /// A `list.last` is equivalent to `theList[theList.length - 1]`,
+  /// both for getting and setting the value.
+  ///
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3];
+  /// print(numbers.last); // 3
+  /// numbers.last = 10;
+  /// print(numbers.last); // 10
+  /// numbers.clear();
+  /// numbers.last; // Throws.
+  /// ```
   void set last(E value);
 
   /// The number of objects in this list.
   ///
   /// The valid indices for a list are `0` through `length - 1`.
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3];
+  /// print(numbers.length); // 3
+  /// ```
   int get length;
 
-  /// Changes the length of this list.
+  /// Setting the `length` changes the number of elements in the list.
   ///
   /// The list must be growable.
   /// If [newLength] is greater than current length,
   /// new entries are initialized to `null`,
   /// so [newLength] must not be greater than the current length
   /// if the element type [E] is non-nullable.
+  ///
+  /// ```dart
+  /// final maybeNumbers = <int?>[1, null, 3];
+  /// maybeNumbers.length = 5;
+  /// print(maybeNumbers); // [1, null, 3, null, null]
+  /// maybeNumbers.length = 2;
+  /// print(maybeNumbers); // [1, null]
+  ///
+  /// final numbers = <int>[1, 2, 3];
+  /// numbers.length = 1;
+  /// print(numbers); // [1]
+  /// numbers.length = 5; // Throws, cannot add `null`s.
+  /// ```
   set length(int newLength);
 
   /// Adds [value] to the end of this list,
   /// extending the length by one.
   ///
   /// The list must be growable.
+  ///
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3];
+  /// numbers.add(4);
+  /// print(numbers); // [1, 2, 3, 4]
+  /// ```
   void add(E value);
 
   /// Appends all objects of [iterable] to the end of this list.
   ///
   /// Extends the length of the list by the number of objects in [iterable].
   /// The list must be growable.
+  ///
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3];
+  /// numbers.addAll([4, 5, 6]);
+  /// print(numbers); // [1, 2, 3, 4, 5, 6]
+  /// ```
   void addAll(Iterable<E> iterable);
 
   /// An [Iterable] of the objects in this list in reverse order.
+  /// ```dart
+  /// final numbers = <String>['two', 'three', 'four'];
+  /// final reverseOrder = numbers.reversed;
+  /// print(reverseOrder.toList()); // [four, three, two]
+  /// ```
   Iterable<E> get reversed;
 
   /// Sorts this list according to the order specified by the [compare] function.
   ///
   /// The [compare] function must act as a [Comparator].
   /// ```dart
-  /// var numbers = ['two', 'three', 'four'];
+  /// final numbers = <String>['two', 'three', 'four'];
   /// // Sort from shortest to longest.
   /// numbers.sort((a, b) => a.length.compareTo(b.length));
-  /// print(numbers);  // [two, four, three]
+  /// print(numbers); // [two, four, three]
   /// ```
   /// The default [List] implementations use [Comparable.compare] if
   /// [compare] is omitted.
   /// ```dart
-  /// List<int> nums = [13, 2, -11];
-  /// nums.sort();
-  /// print(nums);  // [-11, 2, 13]
+  /// final numbers = <int>[13, 2, -11, 0];
+  /// numbers.sort();
+  /// print(numbers); // [-11, 0, 2, 13]
   /// ```
   /// In that case, the elements of the list must be [Comparable] to
   /// each other.
@@ -356,13 +510,18 @@
   /// The sort function is not guaranteed to be stable, so distinct objects
   /// that compare as equal may occur in any order in the result:
   /// ```dart
-  /// var numbers = ['one', 'two', 'three', 'four'];
+  /// final numbers = <String>['one', 'two', 'three', 'four'];
   /// numbers.sort((a, b) => a.length.compareTo(b.length));
-  /// print(numbers);  // [one, two, four, three] OR [two, one, four, three]
+  /// print(numbers); // [one, two, four, three] OR [two, one, four, three]
   /// ```
   void sort([int compare(E a, E b)?]);
 
   /// Shuffles the elements of this list randomly.
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 4, 5];
+  /// numbers.shuffle();
+  /// print(numbers); // [1, 3, 4, 5, 2] OR some other random result.
+  /// ```
   void shuffle([Random? random]);
 
   /// The first index of [element] in this list.
@@ -371,13 +530,15 @@
   /// The first time an object `o` is encountered so that `o == element`,
   /// the index of `o` is returned.
   /// ```dart
-  /// var notes = ['do', 're', 'mi', 're'];
-  /// notes.indexOf('re');    // 1
-  /// notes.indexOf('re', 2); // 3
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// print(notes.indexOf('re')); // 1
+  ///
+  /// final indexWithStart = notes.indexOf('re', 2); // 3
   /// ```
   /// Returns -1 if [element] is not found.
   /// ```dart
-  /// notes.indexOf('fa');    // -1
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// final index = notes.indexOf('fa'); // -1
   /// ```
   int indexOf(E element, [int start = 0]);
 
@@ -388,14 +549,15 @@
   /// the index of `o` is returned.
   ///
   /// ```dart
-  /// var notes = ['do', 're', 'mi', 're'];
-  /// notes.indexWhere((note) => note.startsWith('r'));       // 1
-  /// notes.indexWhere((note) => note.startsWith('r'), 2);    // 3
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// final first = notes.indexWhere((note) => note.startsWith('r')); // 1
+  /// final second = notes.indexWhere((note) => note.startsWith('r'), 2); // 3
   /// ```
   ///
   /// Returns -1 if [element] is not found.
   /// ```dart
-  /// notes.indexWhere((note) => note.startsWith('k'));    // -1
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// final index = notes.indexWhere((note) => note.startsWith('k')); // -1
   /// ```
   int indexWhere(bool test(E element), [int start = 0]);
 
@@ -407,14 +569,17 @@
   /// If [start] is omitted, it defaults to the [length] of the list.
   ///
   /// ```dart
-  /// var notes = ['do', 're', 'mi', 're'];
-  /// notes.lastIndexWhere((note) => note.startsWith('r'));       // 3
-  /// notes.lastIndexWhere((note) => note.startsWith('r'), 2);    // 1
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// final first = notes.lastIndexWhere((note) => note.startsWith('r')); // 3
+  /// final second = notes.lastIndexWhere((note) => note.startsWith('r'),
+  ///     2); // 1
   /// ```
   ///
   /// Returns -1 if [element] is not found.
   /// ```dart
-  /// notes.lastIndexWhere((note) => note.startsWith('k'));    // -1
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// final index = notes.lastIndexWhere((note) => note.startsWith('k'));
+  /// print(index); // -1
   /// ```
   int lastIndexWhere(bool test(E element), [int? start]);
 
@@ -425,23 +590,33 @@
   /// The first time an object `o` is encountered so that `o == element`,
   /// the index of `o` is returned.
   /// ```dart
-  /// var notes = ['do', 're', 'mi', 're'];
-  /// notes.lastIndexOf('re', 2); // 1
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// const startIndex = 2;
+  /// final index = notes.lastIndexOf('re', startIndex); // 1
   /// ```
   /// If [start] is not provided, this method searches from the end of the
   /// list.
   /// ```dart
-  /// notes.lastIndexOf('re');  // 3
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// final index = notes.lastIndexOf('re'); // 3
   /// ```
   /// Returns -1 if [element] is not found.
   /// ```dart
-  /// notes.lastIndexOf('fa');  // -1
+  /// final notes = <String>['do', 're', 'mi', 're'];
+  /// final index = notes.lastIndexOf('fa'); // -1
   /// ```
   int lastIndexOf(E element, [int? start]);
 
   /// Removes all objects from this list; the length of the list becomes zero.
   ///
   /// The list must be growable.
+  ///
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3];
+  /// numbers.clear();
+  /// print(numbers.length); // 0
+  /// print(numbers); // []
+  /// ```
   void clear();
 
   /// Inserts [element] at position [index] in this list.
@@ -451,6 +626,13 @@
   ///
   /// The list must be growable.
   /// The [index] value must be non-negative and no greater than [length].
+  ///
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 4];
+  /// const index = 2;
+  /// numbers.insert(index, 10);
+  /// print(numbers); // [1, 2, 10, 3, 4]
+  /// ```
   void insert(int index, E element);
 
   /// Inserts all objects of [iterable] at position [index] in this list.
@@ -460,17 +642,18 @@
   ///
   /// The list must be growable.
   /// The [index] value must be non-negative and no greater than [length].
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 4];
+  /// final insertItems = [10, 11];
+  /// numbers.insertAll(2, insertItems);
+  /// print(numbers); // [1, 2, 10, 11, 3, 4]
+  /// ```
   void insertAll(int index, Iterable<E> iterable);
 
   /// Overwrites elements with the objects of [iterable].
   ///
   /// The elements of [iterable] are written into this list,
   /// starting at position [index].
-  /// ```dart
-  /// var list = ['a', 'b', 'c', 'd'];
-  /// list.setAll(1, ['bee', 'sea']);
-  /// list.join(', '); // 'a, bee, sea, d'
-  /// ```
   /// This operation does not increase the length of the list.
   ///
   /// The [index] must be non-negative and no greater than [length].
@@ -480,24 +663,30 @@
   ///
   /// If `iterable` is based on this list, its values may change _during_ the
   /// `setAll` operation.
+  /// ```dart
+  /// final list = <String>['a', 'b', 'c', 'd'];
+  /// list.setAll(1, ['bee', 'sea']);
+  /// print(list); // [a, bee, sea, d]
+  /// ```
   void setAll(int index, Iterable<E> iterable);
 
   /// Removes the first occurrence of [value] from this list.
   ///
   /// Returns true if [value] was in the list, false otherwise.
+  /// The list must be growable.
+  ///
   /// ```dart
-  /// var parts = ['head', 'shoulders', 'knees', 'toes'];
-  /// parts.remove('head'); // true
-  /// parts.join(', ');     // 'shoulders, knees, toes'
+  /// final parts = <String>['head', 'shoulders', 'knees', 'toes'];
+  /// final retVal = parts.remove('head'); // true
+  /// print(parts); // [shoulders, knees, toes]
   /// ```
   /// The method has no effect if [value] was not in the list.
   /// ```dart
+  /// final parts = <String>['shoulders', 'knees', 'toes'];
   /// // Note: 'head' has already been removed.
-  /// parts.remove('head'); // false
-  /// parts.join(', ');     // 'shoulders, knees, toes'
+  /// final retVal = parts.remove('head'); // false
+  /// print(parts); // [shoulders, knees, toes]
   /// ```
-  ///
-  /// The list must be growable.
   bool remove(Object? value);
 
   /// Removes the object at position [index] from this list.
@@ -508,22 +697,31 @@
   /// Returns the removed value.
   ///
   /// The [index] must be in the range `0 ≤ index < length`.
-  ///
   /// The list must be growable.
+  /// ```dart
+  /// final parts = <String>['head', 'shoulder', 'knees', 'toes'];
+  /// final retVal = parts.removeAt(2); // knees
+  /// print(parts); // [head, shoulder, toes]
+  /// ```
   E removeAt(int index);
 
   /// Removes and returns the last object in this list.
   ///
   /// The list must be growable and non-empty.
+  /// ```dart
+  /// final parts = <String>['head', 'shoulder', 'knees', 'toes'];
+  /// final retVal = parts.removeLast(); // toes
+  /// print(parts); // [head, shoulder, knees]
+  /// ```
   E removeLast();
 
   /// Removes all objects from this list that satisfy [test].
   ///
   /// An object `o` satisfies [test] if `test(o)` is true.
   /// ```dart
-  /// var numbers = ['one', 'two', 'three', 'four'];
+  /// final numbers = <String>['one', 'two', 'three', 'four'];
   /// numbers.removeWhere((item) => item.length == 3);
-  /// numbers.join(', '); // 'three, four'
+  /// print(numbers); // [three, four]
   /// ```
   /// The list must be growable.
   void removeWhere(bool test(E element));
@@ -532,9 +730,9 @@
   ///
   /// An object `o` satisfies [test] if `test(o)` is true.
   /// ```dart
-  /// var numbers = ['one', 'two', 'three', 'four'];
+  /// final numbers = <String>['one', 'two', 'three', 'four'];
   /// numbers.retainWhere((item) => item.length == 3);
-  /// numbers.join(', '); // 'one, two'
+  /// print(numbers); // [one, two]
   /// ```
   /// The list must be growable.
   void retainWhere(bool test(E element));
@@ -556,18 +754,19 @@
   /// order as they occur in this list.
   ///
   /// ```dart
-  /// var colors = ["red", "green", "blue", "orange", "pink"];
+  /// final colors = <String>['red', 'green', 'blue', 'orange', 'pink'];
   /// print(colors.sublist(1, 3)); // [green, blue]
   /// ```
   ///
   /// If [end] is omitted, it defaults to the [length] of this list.
   ///
   /// ```dart
-  /// print(colors.sublist(1)); // [green, blue, orange, pink]
+  /// final colors = <String>['red', 'green', 'blue', 'orange', 'pink'];
+  /// print(colors.sublist(3)); // [orange, pink]
   /// ```
   ///
   /// The `start` and `end` positions must satisfy the relations
-  /// 0 ≤ `start` ≤ `end` ≤ [length]
+  /// 0 ≤ `start` ≤ `end` ≤ [length].
   /// If `end` is equal to `start`, then the returned list is empty.
   List<E> sublist(int start, [int? end]);
 
@@ -586,11 +785,12 @@
   /// ends early if it reaches the end of the list early
   /// (if `end`, or even `start`, becomes greater than [length]).
   /// ```dart
-  /// List<String> colors = ['red', 'green', 'blue', 'orange', 'pink'];
-  /// Iterable<String> range = colors.getRange(1, 4);
-  /// range.join(', ');  // 'green, blue, orange'
-  /// colors.length = 3;
-  /// range.join(', ');  // 'green, blue'
+  /// final colors = <String>['red', 'green', 'blue', 'orange', 'pink'];
+  /// final firstRange = colors.getRange(0, 3);
+  /// print(firstRange.join(', ')); // red, green, blue
+  ///
+  /// final secondRange = colors.getRange(2, 5);
+  /// print(secondRange.join(', ')); // blue, orange, pink
   /// ```
   Iterable<E> getRange(int start, int end);
 
@@ -599,12 +799,13 @@
   /// Copies the objects of [iterable], skipping [skipCount] objects first,
   /// into the range from [start], inclusive, to [end], exclusive, of this list.
   /// ```dart
-  /// var list1 = [1, 2, 3, 4];
-  /// var list2 = [5, 6, 7, 8, 9];
+  /// final list1 = <int>[1, 2, 3, 4];
+  /// final list2 = <int>[5, 6, 7, 8, 9];
   /// // Copies the 4th and 5th items in list2 as the 2nd and 3rd items
   /// // of list1.
-  /// list1.setRange(1, 3, list2, 3);
-  /// list1.join(', '); // '1, 8, 9, 4'
+  /// const skipCount = 3;
+  /// list1.setRange(1, 3, list2, skipCount);
+  /// print(list1); // [1, 8, 9, 4]
   /// ```
   /// The provided range, given by [start] and [end], must be valid.
   /// A range from [start] to [end] is valid if 0 ≤ `start` ≤ `end` ≤ [length].
@@ -632,6 +833,11 @@
   /// An empty range (with `end == start`) is valid.
   ///
   /// The list must be growable.
+  /// ```dart
+  /// final numbers = <int>[1, 2, 3, 4, 5];
+  /// numbers.removeRange(1, 4);
+  /// print(numbers); // [1, 5]
+  /// ```
   void removeRange(int start, int end);
 
   /// Overwrites a range of elements with [fillValue].
@@ -643,16 +849,16 @@
   /// A range from [start] to [end] is valid if 0 ≤ `start` ≤ `end` ≤ [length].
   /// An empty range (with `end == start`) is valid.
   ///
-  /// Example:
-  /// ```dart
-  /// var list = List.filled(5, -1);
-  /// print(list); //  [-1, -1, -1, -1, -1]
-  /// list.fillRange(1, 3, 4);
-  /// print(list); //  [-1, 4, 4, -1, -1]
-  /// ```
-  ///
   /// If the element type is not nullable, the [fillValue] must be provided and
   /// must be non-`null`.
+  ///
+  /// Example:
+  /// ```dart
+  /// final words = List.filled(5, 'old');
+  /// print(words); // [old, old, old, old, old]
+  /// words.fillRange(1, 3, 'new');
+  /// print(words); // [old, new, new, old, old]
+  /// ```
   void fillRange(int start, int end, [E? fillValue]);
 
   /// Replaces a range of elements with the elements of [replacements].
@@ -660,9 +866,10 @@
   /// Removes the objects in the range from [start] to [end],
   /// then inserts the elements of [replacements] at [start].
   /// ```dart
-  /// var list = [1, 2, 3, 4, 5];
-  /// list.replaceRange(1, 4, [6, 7]);
-  /// list.join(', '); // '1, 6, 7, 5'
+  /// final numbers = <int>[1, 2, 3, 4, 5];
+  /// final replacements = [6, 7];
+  /// numbers.replaceRange(1, 4, replacements);
+  /// print(numbers); // [1, 6, 7, 5]
   /// ```
   /// The provided range, given by [start] and [end], must be valid.
   /// A range from [start] to [end] is valid if 0 ≤ `start` ≤ `end` ≤ [length].
@@ -671,8 +878,11 @@
   /// The operation `list.replaceRange(start, end, replacements)`
   /// is roughly equivalent to:
   /// ```dart
-  /// list.removeRange(start, end);
-  /// list.insertAll(start, replacements);
+  /// final numbers = <int>[1, 2, 3, 4, 5];
+  /// numbers.removeRange(1, 4);
+  /// final replacements = [6, 7];
+  /// numbers.insertAll(1, replacements);
+  /// print(numbers); // [1, 6, 7, 5]
   /// ```
   /// but may be more efficient.
   ///
@@ -688,7 +898,7 @@
   /// as values. The `Map.keys` [Iterable] iterates the indices of this list
   /// in numerical order.
   /// ```dart
-  /// var words = ['fee', 'fi', 'fo', 'fum'];
+  /// var words = <String>['fee', 'fi', 'fo', 'fum'];
   /// var map = words.asMap();  // {0: fee, 1: fi, 2: fo, 3: fum}
   /// map.keys.toList(); // [0, 1, 2, 3]
   /// ```
diff --git a/sdk/lib/core/map.dart b/sdk/lib/core/map.dart
index 164b6f2..f6c6caf 100644
--- a/sdk/lib/core/map.dart
+++ b/sdk/lib/core/map.dart
@@ -51,6 +51,11 @@
   /// A `LinkedHashMap` requires the keys to implement compatible
   /// `operator==` and `hashCode`.
   /// It iterates in key insertion order.
+  /// ```dart
+  /// final planets = <num, String>{1: 'Mercury', 2: 'Venus', 3: 'Earth', 4: 'Mars'};
+  /// final mapFrom = Map<int, String>.from(planets);
+  /// print(mapFrom); // {1: Mercury, 2: Venus, 3: Earth, 4: Mars}
+  /// ```
   factory Map.from(Map other) = LinkedHashMap<K, V>.from;
 
   /// Creates a [LinkedHashMap] with the same keys and values as [other].
@@ -58,6 +63,11 @@
   /// A `LinkedHashMap` requires the keys to implement compatible
   /// `operator==` and `hashCode`, and it allows `null` as a key.
   /// It iterates in key insertion order.
+  /// ```dart
+  /// final planets = <int, String>{1: 'Mercury', 2: 'Venus', 3: 'Earth'};
+  /// final mapOf = Map<num, String>.of(planets);
+  /// print(mapOf); // {1: Mercury, 2: Venus, 3: Earth}
+  /// ```
   factory Map.of(Map<K, V> other) = LinkedHashMap<K, V>.of;
 
   /// Creates an unmodifiable hash-based map containing the entries of [other].
@@ -72,6 +82,11 @@
   ///
   /// The resulting map behaves like the result of [Map.from],
   /// except that the map returned by this constructor is not modifiable.
+  /// ```dart
+  /// final planets = <int, String>{1: 'Mercury', 2: 'Venus', 3: 'Earth'};
+  /// final unmodifiableMap = Map.unmodifiable(planets);
+  /// unmodifiableMap[4] = 'Mars'; // Throws
+  /// ```
   external factory Map.unmodifiable(Map<dynamic, dynamic> other);
 
   /// Creates an identity map with the default implementation, [LinkedHashMap].
@@ -100,11 +115,11 @@
   /// The keys of `map` are the `list` values converted to strings,
   /// and the values of the `map` are the squares of the `list` values:
   /// ```dart
-  /// List<int> list = [1, 2, 3];
-  /// var map = Map<String, int>.fromIterable(list,
+  /// final numbers = <int>[1, 2, 3];
+  /// final map = Map<String, int>.fromIterable(numbers,
   ///     key: (item) => item.toString(),
   ///     value: (item) => item * item);
-  /// // map is {"1": 1, "2": 4, "3": 9}
+  /// print(map); // {1: 1, 2: 4, 3: 9}
   /// ```
   /// If no values are specified for [key] and [value],
   /// the default is the identity function.
@@ -114,8 +129,9 @@
   /// In the following example, the keys and corresponding values of `map`
   /// are the `list` values directly:
   /// ```dart
-  /// var map = Map<int, int>.fromIterable(list);
-  /// // map is {1: 1, 2: 2, 3: 3}
+  /// final numbers = <int>[1, 2, 3];
+  /// final map = Map.fromIterable(numbers);
+  /// print(map); // {1: 1, 2: 2, 3: 3}
   /// ```
   /// The keys computed by the source [iterable] do not need to be unique.
   /// The last occurrence of a key will overwrite
@@ -134,10 +150,10 @@
   /// The map construction iterates over [keys] and [values] simultaneously,
   /// and adds an entry to the map for each pair of key and value.
   /// ```dart
-  /// List<String> letters = ['b', 'c'];
-  /// List<String> words = ['bad', 'cat'];
-  /// var map = Map.fromIterables(letters, words);
-  /// // map is {"b": "bad", "c": "cat"}
+  /// final rings = <bool>[false, false, true, true];
+  /// final planets = <String>{'Earth', 'Mars', 'Jupiter', 'Saturn'};
+  /// final map = Map<String, bool>.fromIterables(planets, rings);
+  /// print(map); // {Earth: false, Mars: false, Jupiter: true, Saturn: true}
   /// ```
   /// If [keys] contains the same object multiple times,
   /// the value of the last occurrence overwrites any previous value.
@@ -183,6 +199,12 @@
   /// ```dart
   /// <K, V>{for (var e in entries) e.key: e.value}
   /// ```
+  /// Example:
+  /// ```dart
+  /// final moonCount = <String, int>{'Mercury': 0, 'Venus': 0, 'Earth': 1,
+  ///   'Mars': 2, 'Jupiter': 79, 'Saturn': 82, 'Uranus': 27, 'Neptune': 14};
+  /// final map = Map.fromEntries(moonCount.entries);
+  /// ```
   factory Map.fromEntries(Iterable<MapEntry<K, V>> entries) =>
       <K, V>{}..addEntries(entries);
 
@@ -211,12 +233,24 @@
   ///
   /// Returns true if any of the values in the map are equal to `value`
   /// according to the `==` operator.
+  /// ```dart
+  /// final moonCount = <String, int>{'Mercury': 0, 'Venus': 0, 'Earth': 1,
+  ///   'Mars': 2, 'Jupiter': 79, 'Saturn': 82, 'Uranus': 27, 'Neptune': 14 };
+  /// final moons3 = moonCount.containsValue(3); // false
+  /// final moons82 = moonCount.containsValue(82); // true
+  /// ```
   bool containsValue(Object? value);
 
   /// Whether this map contains the given [key].
   ///
   /// Returns true if any of the keys in the map are equal to `key`
   /// according to the equality used by the map.
+  /// ```dart
+  /// final moonCount = <String, int>{'Mercury': 0, 'Venus': 0, 'Earth': 1,
+  ///   'Mars': 2, 'Jupiter': 79, 'Saturn': 82, 'Uranus': 27, 'Neptune': 14 };
+  /// final containsUranus = moonCount.containsKey('Uranus'); // true
+  /// final containsPluto = moonCount.containsKey('Pluto'); // false
+  /// ```
   bool containsKey(Object? key);
 
   /// The value for the given [key], or `null` if [key] is not in the map.
@@ -248,6 +282,17 @@
   ///
   /// The operation is equivalent to doing `this[entry.key] = entry.value`
   /// for each [MapEntry] of the iterable.
+  /// ```dart
+  /// final planets = <int, String>{1: 'Mercury', 2: 'Venus',
+  ///   3: 'Earth', 4: 'Mars'};
+  /// final gasGiants = <int, String>{5: 'Jupiter', 6: 'Saturn'};
+  /// final iceGiants = <int, String>{7: 'Uranus', 8: 'Neptune'};
+  /// planets.addEntries(gasGiants.entries);
+  /// planets.addEntries(iceGiants.entries);
+  /// print(planets);
+  /// // {1: Mercury, 2: Venus, 3: Earth, 4: Mars, 5: Jupiter, 6: Saturn,
+  /// //  7: Uranus, 8: Neptune}
+  /// ```
   void addEntries(Iterable<MapEntry<K, V>> newEntries);
 
   /// Updates the value for the provided [key].
@@ -261,15 +306,38 @@
   /// and adds the key with the returned value to the map.
   ///
   /// If the key is not present, [ifAbsent] must be provided.
+  /// ```dart
+  /// final planetsFromSun = <int, String>{1: 'Mercury', 2: 'unknown',
+  ///   3: 'Earth'};
+  /// // Update value for known key value 2.
+  /// planetsFromSun.update(2, (value) => 'Venus');
+  /// print(planetsFromSun); // {1: Mercury, 2: Venus, 3: Earth}
+  ///
+  /// final largestPlanets = <int, String>{1: 'Jupiter', 2: 'Saturn',
+  ///   3: 'Neptune'};
+  /// // Key value 8 is missing from list, add it using [ifAbsent].
+  /// largestPlanets.update(8, (value) => 'New', ifAbsent: () => 'Mercury');
+  /// print(largestPlanets); // {1: Jupiter, 2: Saturn, 3: Neptune, 8: Mercury}
+  /// ```
   V update(K key, V update(V value), {V ifAbsent()?});
 
   /// Updates all values.
   ///
   /// Iterates over all entries in the map and updates them with the result
   /// of invoking [update].
+  /// ```dart
+  /// final terrestrial = <int, String>{1: 'Mercury', 2: 'Venus', 3: 'Earth'};
+  /// terrestrial.updateAll((key, value) => value.toUpperCase());
+  /// print(terrestrial); // {1: MERCURY, 2: VENUS, 3: EARTH}
+  /// ```
   void updateAll(V update(K key, V value));
 
   /// Removes all entries of this map that satisfy the given [test].
+  /// ```dart
+  /// final terrestrial = <int, String>{1: 'Mercury', 2: 'Venus', 3: 'Earth'};
+  /// terrestrial.removeWhere((key, value) => value.startsWith('E'));
+  /// print(terrestrial); // {1: Mercury, 2: Venus}
+  /// ```
   void removeWhere(bool test(K key, V value));
 
   /// Look up the value of [key], or add a new entry if it isn't there.
@@ -278,13 +346,18 @@
   /// Otherwise calls [ifAbsent] to get a new value, associates [key] to
   /// that value, and then returns the new value.
   /// ```dart
-  /// Map<String, int> scores = {'Bob': 36};
-  /// for (var key in ['Bob', 'Rohan', 'Sophena']) {
-  ///   scores.putIfAbsent(key, () => key.length);
+  /// final diameters = <num, String>{1.0: 'Earth'};
+  /// final otherDiameters = <double, String>{0.383: 'Mercury', 0.949: 'Venus'};
+  ///
+  /// for (final item in otherDiameters.entries) {
+  ///   diameters.putIfAbsent(item.key, () => item.value);
   /// }
-  /// scores['Bob'];      // 36
-  /// scores['Rohan'];    //  5
-  /// scores['Sophena'];  //  7
+  /// print(diameters); // {1.0: Earth, 0.383: Mercury, 0.949: Venus}
+  ///
+  /// // If the key already exists, the current value is returned.
+  /// final result = diameters.putIfAbsent(0.383, () => 'Random');
+  /// print(result); // Mercury
+  /// print(diameters); // {1.0: Earth, 0.383: Mercury, 0.949: Venus}
   /// ```
   /// Calling [ifAbsent] must not add or remove keys from the map.
   V putIfAbsent(K key, V ifAbsent());
@@ -296,6 +369,11 @@
   /// The operation is equivalent to doing `this[key] = value` for each key
   /// and associated value in other. It iterates over [other], which must
   /// therefore not change during the iteration.
+  /// ```dart
+  /// final planets = <int, String>{1: 'Mercury', 2: 'Earth'};
+  /// planets.addAll({5: 'Jupiter', 6: 'Saturn'});
+  /// print(planets); // {1: Mercury, 2: Earth, 5: Jupiter, 6: Saturn}
+  /// ```
   void addAll(Map<K, V> other);
 
   /// Removes [key] and its associated value, if present, from the map.
@@ -305,16 +383,37 @@
   ///
   /// Note that some maps allow `null` as a value,
   /// so a returned `null` value doesn't always mean that the key was absent.
+  /// ```dart
+  /// final terrestrial = <int, String>{1: 'Mercury', 2: 'Venus', 3: 'Earth'};
+  /// final removedValue = terrestrial.remove(2); // Venus
+  /// print(terrestrial); // {1: Mercury, 3: Earth}
+  /// ```
   V? remove(Object? key);
 
   /// Removes all entries from the map.
   ///
   /// After this, the map is empty.
+  /// ```dart
+  /// final planets = <int, String>{1: 'Mercury', 2: 'Venus', 3: 'Earth'};
+  /// planets.clear(); // {}
+  /// ```
   void clear();
 
   /// Applies [action] to each key/value pair of the map.
   ///
   /// Calling `action` must not add or remove keys from the map.
+  /// ```dart
+  /// final planetsByMass = <num, String>{0.81: 'Venus', 1: 'Earth',
+  ///   0.11: 'Mars', 17.15: 'Neptune'};
+  ///
+  /// planetsByMass.forEach((key, value) {
+  ///   print('$key: $value');
+  ///   // 0.81: Venus
+  ///   // 1: Earth
+  ///   // 0.11: Mars
+  ///   // 17.15: Neptune
+  /// });
+  /// ```
   void forEach(void action(K key, V value));
 
   /// The keys of [this].
diff --git a/sdk/lib/core/num.dart b/sdk/lib/core/num.dart
index eab5eb9..4da3b29 100644
--- a/sdk/lib/core/num.dart
+++ b/sdk/lib/core/num.dart
@@ -8,6 +8,13 @@
 ///
 /// It is a compile-time error for any type other than [int] or [double]
 /// to attempt to extend or implement `num`.
+///
+/// **See also:**
+/// * [int]: An integer number.
+/// * [double]: A double-precision floating point number.
+/// * [Numbers](https://dart.dev/guides/language/numbers) in
+/// [A tour of the Dart language](https://dart.dev/guides/language/language-tour).
+
 abstract class num implements Comparable<num> {
   /// Test whether this value is numerically equal to `other`.
   ///
@@ -65,7 +72,7 @@
   /// NaN return false.
   ///
   /// This function imposes a complete ordering for doubles. When using
-  /// `compareTo` the following properties hold:
+  /// `compareTo`, the following properties hold:
   ///
   /// - All NaN values are considered equal, and greater than any numeric value.
   /// - -0.0 is less than 0.0 (and the integer 0), but greater than any non-zero
@@ -113,7 +120,7 @@
   /// Multiplies this number by [other].
   ///
   /// The result is an [int], as described by [int.*],
-  /// if both this number and [other] is an integer,
+  /// if both this number and [other] are integers,
   /// otherwise the result is a [double].
   num operator *(num other);
 
@@ -125,7 +132,7 @@
   /// `a == b * q + r` and `0 <= r < b.abs()`.
   ///
   /// The Euclidean division is only defined for integers, but can be easily
-  /// extended to work with doubles. In that case `q` is stil an integer,
+  /// extended to work with doubles. In that case, `q` is still an integer,
   /// but `r` may have a non-integer value that still satisfies `0 <= r < |b|`.
   ///
   /// The sign of the returned value `r` is always positive.
@@ -133,9 +140,17 @@
   /// See [remainder] for the remainder of the truncating division.
   ///
   /// The result is an [int], as described by [int.%],
-  /// if both this number and [other] is an integer,
+  /// if both this number and [other] are integers,
   /// otherwise the result is a [double].
-  num operator %(num other);
+  ///
+  /// Example:
+  /// ```dart
+  /// print(5 % 3); // 2
+  /// print(-5 % 3); // 1
+  /// print(5 % -3); // 2
+  /// print(-5 % -3); // 1
+  /// ```
+ num operator %(num other);
 
   /// Divides this number by [other].
   double operator /(num other);
@@ -146,11 +161,11 @@
   /// Truncating division is division where a fractional result
   /// is converted to an integer by rounding towards zero.
   ///
-  /// If both operands are [int]s then [other] must not be zero.
+  /// If both operands are [int]s, then [other] must not be zero.
   /// Then `a ~/ b` corresponds to `a.remainder(b)`
   /// such that `a == (a ~/ b) * b + a.remainder(b)`.
   ///
-  /// If either operand is a [double] then the other operand is converted
+  /// If either operand is a [double], then the other operand is converted
   /// to a double before performing the division and truncation of the result.
   /// Then `a ~/ b` is equivalent to `(a / b).truncate()`.
   /// This means that the intermediate result of the double division
@@ -164,7 +179,7 @@
   /// numbers numerical value (the result of subtracting the
   /// number from zero), if that value *exists*.
   ///
-  /// Negating a double gives a number with same magnitude
+  /// Negating a double gives a number with the same magnitude
   /// as the original value (`number.abs() == (-number).abs()`),
   /// and the opposite sign (`-(number.sign) == (-number).sign`).
   ///
@@ -179,11 +194,20 @@
   ///
   /// The result `r` of this operation satisfies:
   /// `this == (this ~/ other) * other + r`.
-  /// As a consequence the remainder `r` has the same sign as the divider `this`.
+  /// As a consequence, the remainder `r` has the same sign as the divider
+  /// `this`.
   ///
   /// The result is an [int], as described by [int.remainder],
-  /// if both this number and [other] is an integer,
+  /// if both this number and [other] are integers,
   /// otherwise the result is a [double].
+  ///
+  /// Example:
+  /// ```dart
+  /// print(5.remainder(3)); // 2
+  /// print(-5.remainder(3)); // -2
+  /// print(5.remainder(-3)); // 2
+  /// print(-5.remainder(-3)); // -2
+  /// ```
   num remainder(num other);
 
   /// Whether this number is numerically smaller than [other].
@@ -256,6 +280,11 @@
   /// and `-value` if the value is negative.
   ///
   /// Integer overflow may cause the result of `-value` to stay negative.
+  ///
+  /// ```dart
+  /// print((2).abs()); // 2
+  /// print((-2.5).abs()); // 2.5
+  /// ```
   num abs();
 
   /// Negative one, zero or positive one depending on the sign and
@@ -336,7 +365,7 @@
   ///
   /// For the purpose of rounding, `-0.0` is considered to be below `0.0`,
   /// and `-0.0` is therefore considered closer to negative numbers than `0.0`.
-  /// This means that for a value, `d` in the range `-0.5 < d < 0.0`,
+  /// This means that for a value `d` in the range `-0.5 < d < 0.0`,
   /// the result is `-0.0`.
   double roundToDouble();
 
@@ -377,6 +406,14 @@
   ///
   /// The arguments [lowerLimit] and [upperLimit] must form a valid range where
   /// `lowerLimit.compareTo(upperLimit) <= 0`.
+  ///
+  /// Example:
+  /// ```dart
+  /// var result = 10.5.clamp(5, 10.0); // 10.0
+  /// result = 0.75.clamp(5, 10.0); // 5
+  /// result = (-10).clamp(-5, 5.0); // -5
+  /// result = (-0.0).clamp(-5, 5.0); // -0.0
+  /// ```
   num clamp(num lowerLimit, num upperLimit);
 
   /// Truncates this [num] to an integer and returns the result as an [int].
@@ -396,11 +433,11 @@
   /// before computing the string representation,
   /// as by [toDouble].
   ///
-  /// If the absolute value of `this` is greater then or equal to `10^21` then
+  /// If the absolute value of `this` is greater than or equal to `10^21`, then
   /// this methods returns an exponential representation computed by
   /// `this.toStringAsExponential()`. Otherwise the result
   /// is the closest string representation with exactly [fractionDigits] digits
-  /// after the decimal point. If [fractionDigits] equals 0 then the decimal
+  /// after the decimal point. If [fractionDigits] equals 0, then the decimal
   /// point is omitted.
   ///
   /// The parameter [fractionDigits] must be an integer satisfying:
@@ -422,13 +459,13 @@
   /// Converts this number to a [double]
   /// before computing the string representation.
   ///
-  /// If [fractionDigits] is given then it must be an integer satisfying:
+  /// If [fractionDigits] is given, then it must be an integer satisfying:
   /// `0 <= fractionDigits <= 20`. In this case the string contains exactly
   /// [fractionDigits] after the decimal point. Otherwise, without the parameter,
   /// the returned string uses the shortest number of digits that accurately
   /// represent this number.
   ///
-  /// If [fractionDigits] equals 0 then the decimal point is omitted.
+  /// If [fractionDigits] equals 0, then the decimal point is omitted.
   /// Examples:
   /// ```dart
   /// 1.toStringAsExponential();       // 1e+0
@@ -461,7 +498,7 @@
   /// ```
   String toStringAsPrecision(int precision);
 
-  /// The shortest string that correctly represent this number number.
+  /// The shortest string that correctly represents this number.
   ///
   /// All [double]s in the range `10^-6` (inclusive) to `10^21` (exclusive)
   /// are converted to their decimal representation with at least one digit
@@ -517,6 +554,22 @@
   /// The [onError] parameter is deprecated and will be removed.
   /// Instead of `num.parse(string, (string) { ... })`,
   /// you should use `num.tryParse(string) ?? (...)`.
+  ///
+  /// Examples:
+  /// ```dart
+  /// var value = num.parse('2021'); // 2021
+  /// value = num.parse('3.14'); // 3.14
+  /// value = num.parse('  3.14 \xA0'); // 3.14
+  /// value = num.parse('0.'); // 0.0
+  /// value = num.parse('.0'); // 0.0
+  /// value = num.parse('-1.e3'); // -1000.0
+  /// value = num.parse('1234E+7'); // 12340000000.0
+  /// value = num.parse('+.12e-9'); // 1.2e-10
+  /// value = num.parse('-NaN'); // NaN
+  /// value = num.parse('0xFF'); // 255
+  /// value = num.parse(double.infinity.toString()); // Infinity
+  /// value = num.parse('1f'); // Throws.
+  /// ```
   static num parse(String input, [@deprecated num onError(String input)?]) {
     num? result = tryParse(input);
     if (result != null) return result;
@@ -526,8 +579,24 @@
 
   /// Parses a string containing a number literal into a number.
   ///
-  /// Like [parse] except that this function returns `null` for invalid inputs
+  /// Like [parse], except that this function returns `null` for invalid inputs
   /// instead of throwing.
+  ///
+  /// Examples:
+  /// ```dart
+  /// var value = num.tryParse('2021'); // 2021
+  /// value = num.tryParse('3.14'); // 3.14
+  /// value = num.tryParse('  3.14 \xA0'); // 3.14
+  /// value = num.tryParse('0.'); // 0.0
+  /// value = num.tryParse('.0'); // 0.0
+  /// value = num.tryParse('-1.e3'); // -1000.0
+  /// value = num.tryParse('1234E+7'); // 12340000000.0
+  /// value = num.tryParse('+.12e-9'); // 1.2e-10
+  /// value = num.tryParse('-NaN'); // NaN
+  /// value = num.tryParse('0xFF'); // 255
+  /// value = num.tryParse(double.infinity.toString()); // Infinity
+  /// value = num.tryParse('1f'); // null
+  /// ```
   static num? tryParse(String input) {
     String source = input.trim();
     // TODO(lrn): Optimize to detect format and result type in one check.
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index d94a58f..9880ea6 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -13,8 +13,8 @@
 /// elements are treated as being the same for any operation on the set.
 ///
 /// The default [Set] implementation, [LinkedHashSet], considers objects
-/// indistinguishable if they are equal with regard to
-/// operator [Object.==].
+/// indistinguishable if they are equal with regard to [Object.==] and
+/// [Object.hashCode].
 ///
 /// Iterating over elements of a set may be either unordered
 /// or ordered in some way. Examples:
@@ -57,7 +57,7 @@
   /// All the [elements] should be instances of [E].
   /// The `elements` iterable itself can have any type,
   /// so this constructor can be used to down-cast a `Set`, for example as:
-  /// ```dart
+  /// ```
   /// Set<SuperType> superSet = ...;
   /// Set<SubType> subSet =
   ///     Set<SubType>.from(superSet.where((e) => e is SubType));
@@ -68,6 +68,11 @@
   ///
   /// The set is equivalent to one created by
   /// `LinkedHashSet<E>.from(elements)`.
+  /// ```dart
+  /// final numbers = <num>{10, 20, 30};
+  /// final setFrom = Set<int>.from(numbers);
+  /// print(setFrom); // {10, 20, 30}
+  /// ```
   factory Set.from(Iterable elements) = LinkedHashSet<E>.from;
 
   /// Creates a [Set] from [elements].
@@ -78,12 +83,21 @@
   ///
   /// The set is equivalent to one created by
   /// `LinkedHashSet<E>.of(elements)`.
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final setOf = Set<num>.of(baseSet);
+  /// print(setOf); // {1, 2, 3}
+  /// ```
   factory Set.of(Iterable<E> elements) = LinkedHashSet<E>.of;
 
   /// Creates an unmodifiable [Set] from [elements].
   ///
   /// The new set behaves like the result of [Set.of],
   /// except that the set returned by this constructor is not modifiable.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final unmodifiableSet = Set.unmodifiable(characters);
+  /// ```
   @Since("2.12")
   factory Set.unmodifiable(Iterable<E> elements) =>
       UnmodifiableSetView<E>(<E>{...elements});
@@ -103,7 +117,7 @@
   /// the store will throw unless the value is also an instance of [S].
   ///
   /// If all accessed elements of [source] are actually instances of [T],
-  /// and if all elements added to the returned set are actually instance
+  /// and if all elements added to the returned set are actually instances
   /// of [S],
   /// then the returned set can be used as a `Set<T>`.
   ///
@@ -121,7 +135,7 @@
   /// that is not an instance of [R], the access will throw instead.
   ///
   /// Elements added to the set (e.g., by using [add] or [addAll])
-  /// must be instance of [R] to be valid arguments to the adding function,
+  /// must be instances of [R] to be valid arguments to the adding function,
   /// and they must be instances of [E] as well to be accepted by
   /// this set as well.
   ///
@@ -140,6 +154,11 @@
   Iterator<E> get iterator;
 
   /// Whether [value] is in the set.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final containsB = characters.contains('B'); // true
+  /// final containsD = characters.contains('D'); // false
+  /// ```
   bool contains(Object? value);
 
   /// Adds [value] to the set.
@@ -149,18 +168,23 @@
   ///
   /// Example:
   /// ```dart
-  /// var set = Set();
-  /// var time1 = DateTime.fromMillisecondsSinceEpoch(0);
-  /// var time2 = DateTime.fromMillisecondsSinceEpoch(0);
+  /// final dateTimes = <DateTime>{};
+  /// final time1 = DateTime.fromMillisecondsSinceEpoch(0);
+  /// final time2 = DateTime.fromMillisecondsSinceEpoch(0);
   /// // time1 and time2 are equal, but not identical.
   /// assert(time1 == time2);
   /// assert(!identical(time1, time2));
-  /// set.add(time1);  // => true.
+  /// final time1Added = dateTimes.add(time1);
+  /// print(time1Added); // true
   /// // A value equal to time2 exists already in the set, and the call to
   /// // add doesn't change the set.
-  /// set.add(time2);  // => false.
-  /// assert(set.length == 1);
-  /// assert(identical(time1, set.first));
+  /// final time2Added = dateTimes.add(time2);
+  /// print(time2Added); // false
+  ///
+  /// print(dateTimes); // {1970-01-01 02:00:00.000}
+  /// assert(dateTimes.length == 1);
+  /// assert(identical(time1, dateTimes.first));
+  /// print(dateTimes.length);
   /// ```
   bool add(E value);
 
@@ -168,12 +192,23 @@
   ///
   /// Equivalent to adding each element in [elements] using [add],
   /// but some collections may be able to optimize it.
+  /// ```dart
+  /// final characters = <String>{'A', 'B'};
+  /// characters.addAll({'A', 'B', 'C'});
+  /// print(characters); // {A, B, C}
+  /// ```
   void addAll(Iterable<E> elements);
 
   /// Removes [value] from the set.
   ///
   /// Returns `true` if [value] was in the set, and `false` if not.
   /// The method has no effect if [value] was not in the set.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final didRemoveB = characters.remove('B'); // true
+  /// final didRemoveD = characters.remove('D'); // false
+  /// print(characters); // {A, C}
+  /// ```
   bool remove(Object? value);
 
   /// If an object equal to [object] is in the set, return it.
@@ -188,9 +223,21 @@
   /// rather than being based on an actual object instance,
   /// then there may not be a specific object instance representing the
   /// set element.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final containsB = characters.lookup('B');
+  /// print(containsB); // B
+  /// final containsD = characters.lookup('D');
+  /// print(containsD); // null
+  /// ```
   E? lookup(Object? object);
 
   /// Removes each element of [elements] from this set.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.removeAll({'A', 'B', 'X'});
+  /// print(characters); // {C}
+  /// ```
   void removeAll(Iterable<Object?> elements);
 
   /// Removes all elements of this set that are not elements in [elements].
@@ -199,36 +246,85 @@
   /// set that is equal to it (according to `this.contains`), and if so, the
   /// equal element in this set is retained, and elements that are not equal
   /// to any element in [elements] are removed.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.retainAll({'A', 'B', 'X'});
+  /// print(characters); // {A, B}
+  /// ```
   void retainAll(Iterable<Object?> elements);
 
   /// Removes all elements of this set that satisfy [test].
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.removeWhere((element) => element.startsWith('B'));
+  /// print(characters); // {A, C}
+  /// ```
   void removeWhere(bool test(E element));
 
   /// Removes all elements of this set that fail to satisfy [test].
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.retainWhere(
+  ///     (element) => element.startsWith('B') || element.startsWith('C'));
+  /// print(characters); // {B, C}
+  /// ```
   void retainWhere(bool test(E element));
 
   /// Whether this set contains all the elements of [other].
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// final containsAB = characters.containsAll({'A', 'B'});
+  /// print(containsAB); // true
+  /// final containsAD = characters.containsAll({'A', 'D'});
+  /// print(containsAD); // false
+  /// ```
   bool containsAll(Iterable<Object?> other);
 
   /// Creates a new set which is the intersection between this set and [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] that
   /// are also elements of [other] according to `other.contains`.
+  /// ```dart
+  /// final characters1 = <String>{'A', 'B', 'C'};
+  /// final characters2 = <String>{'A', 'E', 'F'};
+  /// final unionSet = characters1.intersection(characters2);
+  /// print(unionSet); // {A}
+  /// ```
   Set<E> intersection(Set<Object?> other);
 
   /// Creates a new set which contains all the elements of this set and [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] and
   /// all the elements of [other].
+  /// ```dart
+  /// final characters1 = <String>{'A', 'B', 'C'};
+  /// final characters2 = <String>{'A', 'E', 'F'};
+  /// final unionSet1 = characters1.union(characters2);
+  /// print(unionSet1); // {A, B, C, E, F}
+  /// final unionSet2 = characters2.union(characters1);
+  /// print(unionSet2); // {A, E, F, B, C}
+  /// ```
   Set<E> union(Set<E> other);
 
   /// Creates a new set with the elements of this that are not in [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] that
   /// are not elements of [other] according to `other.contains`.
+  /// ```dart
+  /// final characters1 = <String>{'A', 'B', 'C'};
+  /// final characters2 = <String>{'A', 'E', 'F'};
+  /// final differenceSet1 = characters1.difference(characters2);
+  /// print(differenceSet1); // {B, C}
+  /// final differenceSet2 = characters2.difference(characters1);
+  /// print(differenceSet2); // {E, F}
+  /// ```
   Set<E> difference(Set<Object?> other);
 
   /// Removes all elements from the set.
+  /// ```dart
+  /// final characters = <String>{'A', 'B', 'C'};
+  /// characters.clear(); // {}
+  /// ```
   void clear();
 
   /// Creates a [Set] with the same elements and behavior as this `Set`.
diff --git a/sdk/lib/core/stopwatch.dart b/sdk/lib/core/stopwatch.dart
index 45da67e..959fcbe 100644
--- a/sdk/lib/core/stopwatch.dart
+++ b/sdk/lib/core/stopwatch.dart
@@ -4,7 +4,47 @@
 
 part of dart.core;
 
-/// A simple stopwatch interface to measure elapsed time.
+/// A stopwatch which measures time while it's running.
+///
+/// A stopwatch is either running or stopped.
+/// It measures the elapsed time that passes while the stopwatch is running.
+///
+/// When a stopwatch is initially created, it is stopped and has measured no
+/// elapsed time.
+///
+/// The elapsed time can be accessed in various formats using
+/// [elapsed], [elapsedMilliseconds], [elapsedMicroseconds] or [elapsedTicks].
+///
+/// The stopwatch is started by calling [start].
+///
+/// Example:
+/// ```dart
+/// final stopwatch = Stopwatch();
+/// print(stopwatch.elapsedMilliseconds); // 0
+/// print(stopwatch.isRunning); // false
+/// stopwatch.start();
+/// print(stopwatch.isRunning); // true
+/// ```
+/// To stop or pause the stopwatch, use [stop].
+/// Use [start] to continue again when only pausing temporarily.
+/// ```
+/// stopwatch.stop();
+/// print(stopwatch.isRunning); // false
+/// Duration elapsed = stopwatch.elapsed;
+/// await Future.delayed(const Duration(seconds: 1));
+/// assert(stopwatch.elapsed == elapsed); // No measured time elapsed.
+/// stopwatch.start(); // Continue measuring.
+/// ```
+/// The [reset] method sets the elapsed time back to zero.
+/// It can be called whether the stopwatch is running or not,
+/// and doesn't change whether it's running.
+/// ```
+/// // Do some work.
+/// stopwatch.stop();
+/// print(stopwatch.elapsedMilliseconds); // Likely > 0.
+/// stopwatch.reset();
+/// print(stopwatch.elapsedMilliseconds); // 0
+/// ```
 class Stopwatch {
   /// Cached frequency of the system in Hz (ticks per second).
   ///
@@ -22,7 +62,7 @@
   /// The following example shows how to start a [Stopwatch]
   /// immediately after allocation.
   /// ```dart
-  /// var stopwatch = Stopwatch()..start();
+  /// final stopwatch = Stopwatch()..start();
   /// ```
   Stopwatch() {
     _frequency; // Ensures initialization before using any method.
@@ -33,7 +73,7 @@
 
   /// Starts the [Stopwatch].
   ///
-  /// The [elapsed] count is increasing monotonically. If the [Stopwatch] has
+  /// The [elapsed] count increases monotonically. If the [Stopwatch] has
   /// been stopped, then calling start again restarts it without resetting the
   /// [elapsed] count.
   ///
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index ca31986..8764498 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -8,7 +8,7 @@
 ///
 /// Strings are mainly used to represent text. A character may be represented by
 /// multiple code points, each code point consisting of one or two code
-/// units. For example the Papua New Guinea flag character requires four code
+/// units. For example, the Papua New Guinea flag character requires four code
 /// units to represent two code points, but should be treated like a single
 /// character: "🇵🇬". Platforms that do not support the flag character may show
 /// the letters "PG" instead. If the code points are swapped, it instead becomes
@@ -35,41 +35,49 @@
 /// Strings are immutable. Although you cannot change a string, you can perform
 /// an operation on a string which creates a new string:
 /// ```dart
-/// var string = 'Dart is fun';
-/// var newString = string.substring(0, 5);
+/// const string = 'Dart is fun';
+/// print(string.substring(0, 4)); // 'Dart'
 /// ```
 /// You can use the plus (`+`) operator to concatenate strings:
 /// ```dart
-/// 'Dart ' + 'is ' + 'fun!'; // 'Dart is fun!'
+/// const string = 'Dart ' + 'is ' + 'fun!';
+/// print(string); // 'Dart is fun!'
 /// ```
 /// Adjacent string literals are concatenated automatically:
 /// ```dart
-/// 'Dart ' 'is ' 'fun!';    // 'Dart is fun!'
+/// const string = 'Dart ' 'is ' 'fun!';
+/// print(string); // 'Dart is fun!'
 /// ```
 /// You can use `${}` to interpolate the value of Dart expressions
 /// within strings. The curly braces can be omitted when evaluating identifiers:
 /// ```dart
-/// var string = 'dartlang';
-/// '$string has ${string.length} letters'; // 'dartlang has 8 letters'
+/// const string = 'dartlang';
+/// print('$string has ${string.length} letters'); // dartlang has 8 letters
 /// ```
 /// A string is represented by a sequence of Unicode UTF-16 code units
 /// accessible through the [codeUnitAt] or the [codeUnits] members:
 /// ```dart
-/// var string = 'Dart';
-/// string.codeUnitAt(0); // 68
-/// string.codeUnits;     // [68, 97, 114, 116]
+/// const string = 'Dart';
+/// final firstCodeUnit = string.codeUnitAt(0);
+/// print(firstCodeUnit); // 68, aka U+0044, the code point for 'D'.
+/// final allCodeUnits = string.codeUnits;
+/// print(allCodeUnits); // [68, 97, 114, 116]
 /// ```
-/// The string representation of code units is accessible through the index
-/// operator:
+/// A string representation of the individual code units is accessible through
+/// the index operator:
 /// ```dart
-/// string[0];            // 'D'
+/// const string = 'Dart';
+/// final charAtIndex = string[0];
+/// print(charAtIndex); // 'D'
 /// ```
 /// The characters of a string are encoded in UTF-16. Decoding UTF-16, which
 /// combines surrogate pairs, yields Unicode code points. Following a similar
-/// terminology to Go, we use the name 'rune' for an integer representing a
+/// terminology to Go, Dart uses the name 'rune' for an integer representing a
 /// Unicode code point. Use the [runes] property to get the runes of a string:
 /// ```dart
-/// string.runes.toList(); // [68, 97, 114, 116]
+/// const string = 'Dart';
+/// final runes = string.runes.toList();
+/// print(runes); // [68, 97, 114, 116]
 /// ```
 /// For a character outside the Basic Multilingual Plane (plane 0) that is
 /// composed of a surrogate pair, [runes] combines the pair and returns a
@@ -78,34 +86,38 @@
 /// pair: `0xD834` and `0xDD1E`. Using [codeUnits] returns the surrogate pair,
 /// and using `runes` returns their combined value:
 /// ```dart
-/// var clef = '\u{1D11E}';
-/// clef.codeUnits;         // [0xD834, 0xDD1E]
-/// clef.runes.toList();    // [0x1D11E]
+/// const clef = '\u{1D11E}';
+/// for (final item in clef.codeUnits) {
+///   print(item.toRadixString(16));
+///   // d834
+///   // dd1e
+/// }
+/// for (final item in clef.runes) {
+///   print(item.toRadixString(16)); // 1d11e
+/// }
 /// ```
 /// The `String` class cannot be extended or implemented. Attempting to do so
 /// yields a compile-time error.
 ///
 /// ## Other resources
 ///
-/// See [StringBuffer] to efficiently build a string incrementally. See
-/// [RegExp] to work with regular expressions.
-///
-/// Also see:
-///
+/// * [StringBuffer] to efficiently build a string incrementally.
+/// * [RegExp] to work with regular expressions.
 /// * [Strings and regular expressions](https://dart.dev/guides/libraries/library-tour#strings-and-regular-expressions)
 @pragma('vm:entry-point')
 abstract class String implements Comparable<String>, Pattern {
   /// Allocates a new string containing the specified [charCodes].
   ///
-  /// The [charCodes] can be both UTF-16 code units or runes.
+  /// The [charCodes] can be both UTF-16 code units and runes.
   /// If a char-code value is 16-bit, it is used as a code unit:
   /// ```dart
-  /// String.fromCharCodes([68]); // 'D'
+  /// final string = String.fromCharCodes([68]);
+  /// print(string); // D
   /// ```
   /// If a char-code value is greater than 16-bits, it is decomposed into a
   /// surrogate pair:
   /// ```dart
-  /// var clef = String.fromCharCodes([0x1D11E]);
+  /// final clef = String.fromCharCodes([0x1D11E]);
   /// clef.codeUnitAt(0); // 0xD834
   /// clef.codeUnitAt(1); // 0xDD1E
   /// ```
@@ -224,7 +236,7 @@
   /// a positive value if `this` is ordered after `other`,
   /// or zero if `this` and `other` are equivalent.
   ///
-  /// The ordering is the same as the ordering of the code points at the first
+  /// The ordering is the same as the ordering of the code units at the first
   /// position where the two strings differ.
   /// If one string is a prefix of the other,
   /// then the shorter string is ordered before the longer string.
@@ -232,28 +244,39 @@
   /// regard to the ordering.
   /// Ordering does not check for Unicode equivalence.
   /// The comparison is case sensitive.
+  /// ```dart
+  /// var relation = 'Dart'.compareTo('Go');
+  /// print(relation); // < 0
+  /// relation = 'Go'.compareTo('Forward');
+  /// print(relation); // > 0
+  /// relation = 'Forward'.compareTo('Forward');
+  /// print(relation); // 0
+  /// ```
   int compareTo(String other);
 
   /// Whether this string ends with [other].
   ///
   /// For example:
   /// ```dart
-  /// 'Dart'.endsWith('t'); // true
+  /// const string = 'Dart is open source';
+  /// print(string.endsWith('urce')); // true
   /// ```
   bool endsWith(String other);
 
   /// Whether this string starts with a match of [pattern].
   ///
   /// ```dart
-  /// var string = 'Dart';
-  /// string.startsWith('D');                       // true
-  /// string.startsWith(RegExp(r'[A-Z][a-z]')); // true
+  /// const string = 'Dart is open source';
+  /// print(string.startsWith('Dar')); // true
+  /// print(string.startsWith(RegExp(r'[A-Z][a-z]'))); // true
   /// ```
   /// If [index] is provided, this method checks if the substring starting
   /// at that index starts with a match of [pattern]:
   /// ```dart
-  /// string.startsWith('art', 1);                  // true
-  /// string.startsWith(RegExp(r'\w{3}'));      // true
+  /// const string = 'Dart';
+  /// print(string.startsWith('art', 0)); // false
+  /// print(string.startsWith('art', 1)); // true
+  /// print(string.startsWith(RegExp(r'\w{3}'), 2)); // false
   /// ```
   /// [index] must not be negative or greater than [length].
   ///
@@ -262,21 +285,23 @@
   /// The pattern works on the string as a whole, and does not extract
   /// a substring starting at [index] first:
   /// ```dart
-  /// string.startsWith(RegExp(r'^art'), 1);    // false
-  /// string.startsWith(RegExp(r'art'), 1);     // true
+  /// const string = 'Dart';
+  /// print(string.startsWith(RegExp(r'^art'), 1)); // false
+  /// print(string.startsWith(RegExp(r'art'), 1)); // true
   /// ```
   bool startsWith(Pattern pattern, [int index = 0]);
 
   /// Returns the position of the first match of [pattern] in this string,
   /// starting at [start], inclusive:
   /// ```dart
-  /// var string = 'Dartisans';
-  /// string.indexOf('art');                     // 1
-  /// string.indexOf(RegExp(r'[A-Z][a-z]')); // 0
+  /// const string = 'Dartisans';
+  /// print(string.indexOf('art')); // 1
+  /// print(string.indexOf(RegExp(r'[A-Z][a-z]'))); // 0
   /// ```
   /// Returns -1 if no match is found:
   /// ```dart
-  /// string.indexOf(RegExp(r'dart'));       // -1
+  /// const string = 'Dartisans';
+  /// string.indexOf(RegExp(r'dart')); // -1
   /// ```
   /// The [start] must be non-negative and not greater than [length].
   int indexOf(Pattern pattern, [int start = 0]);
@@ -285,13 +310,14 @@
   ///
   /// Finds a match of pattern by searching backward starting at [start]:
   /// ```dart
-  /// var string = 'Dartisans';
-  /// string.lastIndexOf('a');                    // 6
-  /// string.lastIndexOf(RegExp(r'a(r|n)'));      // 6
+  /// const string = 'Dartisans';
+  /// print(string.lastIndexOf('a')); // 6
+  /// print(string.lastIndexOf(RegExp(r'a(r|n)'))); // 6
   /// ```
   /// Returns -1 if [pattern] could not be found in this string.
   /// ```dart
-  /// string.lastIndexOf(RegExp(r'DART'));        // -1
+  /// const string = 'Dartisans';
+  /// print(string.lastIndexOf(RegExp(r'DART'))); // -1
   /// ```
   /// If [start] is omitted, search starts from the end of the string.
   /// If supplied, [start] must be non-negative and not greater than [length].
@@ -307,17 +333,17 @@
   ///
   /// Example:
   /// ```dart
-  /// 'dart' + 'lang'; // 'dartlang'
+  /// const string = 'dart' + 'lang'; // 'dartlang'
   /// ```
   String operator +(String other);
 
-  /// The substring of this string from [start],inclusive, to [end], exclusive.
+  /// The substring of this string from [start], inclusive, to [end], exclusive.
   ///
   /// Example:
   /// ```dart
-  /// var string = 'dartlang';
-  /// string.substring(1);    // 'artlang'
-  /// string.substring(1, 4); // 'art'
+  /// const string = 'dartlang';
+  /// var result = string.substring(1); // 'artlang'
+  /// result = string.substring(1, 4); // 'art'
   /// ```
   ///
   /// Both [start] and [end] must be non-negative and no greater than [length], and
@@ -329,13 +355,14 @@
   /// If the string contains leading or trailing whitespace, a new string with no
   /// leading and no trailing whitespace is returned:
   /// ```dart
-  /// '\tDart is fun\n'.trim(); // 'Dart is fun'
+  /// final trimmed = '\tDart is fun\n'.trim();
+  /// print(trimmed); // 'Dart is fun'
   /// ```
   /// Otherwise, the original string itself is returned:
   /// ```dart
-  /// var str1 = 'Dart';
-  /// var str2 = str1.trim();
-  /// identical(str1, str2);    // true
+  /// const string1 = 'Dart';
+  /// final string2 = string1.trim(); // 'Dart'
+  /// print(identical(string1, string2)); // true
   /// ```
   /// Whitespace is defined by the Unicode White_Space property (as defined in
   /// version 6.2 or later) and the BOM character, 0xFEFF.
@@ -364,11 +391,19 @@
   /// The string without any leading whitespace.
   ///
   /// As [trim], but only removes leading whitespace.
+  /// ```dart
+  /// final string = ' Dart '.trimLeft();
+  /// print(string); // 'Dart '
+  /// ```
   String trimLeft();
 
   /// The string without any trailing whitespace.
   ///
   /// As [trim], but only removes trailing whitespace.
+  /// ```dart
+  /// final string = ' Dart '.trimRight();
+  /// print(string); // ' Dart'
+  /// ```
   String trimRight();
 
   /// Creates a new string by concatenating this string with itself a number
@@ -377,6 +412,11 @@
   /// The result of `str * n` is equivalent to
   /// `str + str + ...`(n times)`... + str`.
   ///
+  /// ```dart
+  /// const string = 'Dart';
+  /// final multiplied = string * 3;
+  /// print(multiplied); // 'DartDartDart'
+  /// ```
   /// Returns an empty string if [times] is zero or negative.
   String operator *(int times);
 
@@ -385,6 +425,14 @@
   /// Returns a new string that prepends [padding] onto this string
   /// one time for each position the length is less than [width].
   ///
+  /// ```dart
+  /// const string = 'D';
+  /// print(string.padLeft(4)); // '   D'
+  /// print(string.padLeft(2, 'x')); // 'xD'
+  /// print(string.padLeft(4, 'y')); // 'yyyD'
+  /// print(string.padLeft(4, '>>')); // '>>>>>>D'
+  /// ```
+  ///
   /// If [width] is already smaller than or equal to `this.length`,
   /// no padding is added. A negative `width` is treated as zero.
   ///
@@ -393,7 +441,7 @@
   /// padding is a longer string representing a single character, like
   /// `"&nbsp;"` or `"\u{10002}`".
   /// In that case, the user should make sure that `this.length` is
-  /// the correct measure of the strings length.
+  /// the correct measure of the string's length.
   String padLeft(int width, [String padding = ' ']);
 
   /// Pads this string on the right if it is shorter than [width].
@@ -401,6 +449,14 @@
   /// Returns a new string that appends [padding] after this string
   /// one time for each position the length is less than [width].
   ///
+  /// ```dart
+  /// const string = 'D';
+  /// print(string.padRight(4)); // 'D    '
+  /// print(string.padRight(2, 'x')); // 'Dx'
+  /// print(string.padRight(4, 'y')); // 'Dyyy'
+  /// print(string.padRight(4, '>>')); // 'D>>>>>>'
+  /// ```
+  ///
   /// If [width] is already smaller than or equal to `this.length`,
   /// no padding is added. A negative `width` is treated as zero.
   ///
@@ -409,22 +465,23 @@
   /// padding is a longer string representing a single character, like
   /// `"&nbsp;"` or `"\u{10002}`".
   /// In that case, the user should make sure that `this.length` is
-  /// the correct measure of the strings length.
+  /// the correct measure of the string's length.
   String padRight(int width, [String padding = ' ']);
 
   /// Whether this string contains a match of [other].
   ///
   /// Example:
   /// ```dart
-  /// var string = 'Dart strings';
-  /// string.contains('D');                     // true
-  /// string.contains(RegExp(r'[A-Z]'));    // true
+  /// const string = 'Dart strings';
+  /// final containsD = string.contains('D'); // true
+  /// final containsUpperCase = string.contains(RegExp(r'[A-Z]')); // true
   /// ```
   /// If [startIndex] is provided, this method matches only at or after that
   /// index:
   /// ```dart
-  /// string.contains('D', 1);                  // false
-  /// string.contains(RegExp(r'[A-Z]'), 1); // false
+  /// const string = 'Dart strings';
+  /// final containsD = string.contains(RegExp('D'), 0); // true
+  /// final caseSensitive = string.contains(RegExp(r'[A-Z]'), 1); // false
   /// ```
   /// The [startIndex] must not be negative or greater than [length].
   bool contains(Pattern other, [int startIndex = 0]);
@@ -437,12 +494,21 @@
   /// Example:
   /// ```dart
   /// '0.0001'.replaceFirst(RegExp(r'0'), ''); // '.0001'
-  /// '0.0001'.replaceFirst(RegExp(r'0'), '7', 1); // '0.7001'
+  /// '0.0001'.replaceFirst(RegExp(r'0'), '7', 1);  // '0.7001'
   /// ```
   String replaceFirst(Pattern from, String to, [int startIndex = 0]);
 
   /// Replace the first occurrence of [from] in this string.
   ///
+  /// ```dart
+  /// const string = 'Dart is fun';
+  /// print(string.replaceFirstMapped(
+  ///     'fun', (m) => 'open source')); // Dart is open source
+  ///
+  /// print(string.replaceFirstMapped(
+  ///     RegExp(r'\w(\w*)'), (m) => '<${m[0]}-${m[1]}>')); // <Dart-art> is fun
+  /// ```
+  ///
   /// Returns a new string, which is this string
   /// except that the first match of [from], starting from [startIndex],
   /// is replaced by the result of calling [replace] with the match object.
@@ -460,7 +526,7 @@
   /// 'resume'.replaceAll(RegExp(r'e'), 'é'); // 'résumé'
   /// ```
   /// Notice that the [replace] string is not interpreted. If the replacement
-  /// depends on the match (for example on a [RegExp]'s capture groups), use
+  /// depends on the match (for example, on a [RegExp]'s capture groups), use
   /// the [replaceAllMapped] method instead.
   String replaceAll(Pattern from, String replace);
 
@@ -479,11 +545,12 @@
   /// The function defined below converts each word in a string to simplified
   /// 'pig latin' using [replaceAllMapped]:
   /// ```dart
-  /// pigLatin(String words) => words.replaceAllMapped(
+  /// String pigLatin(String words) => words.replaceAllMapped(
   ///     RegExp(r'\b(\w*?)([aeiou]\w*)', caseSensitive: false),
   ///     (Match m) => "${m[2]}${m[1]}${m[1]!.isEmpty ? 'way' : 'ay'}");
   ///
-  ///     pigLatin('I have a secret now!'); // 'Iway avehay away ecretsay ownay!'
+  /// final result = pigLatin('I have a secret now!');
+  /// print(result); // 'Iway avehay away ecretsay ownay!'
   /// ```
   String replaceAllMapped(Pattern from, String Function(Match match) replace);
 
@@ -493,6 +560,12 @@
   /// ```dart
   /// this.substring(0, start) + replacement + this.substring(end)
   /// ```
+  /// Example:
+  /// ```dart
+  /// const string = 'Dart is fun';
+  /// final result = string.replaceRange(8, null, 'open source');
+  /// print(result); // Dart is open source
+  /// ```
   /// The [start] and [end] indices must specify a valid range of this string.
   /// That is `0 <= start <= end <= this.length`.
   /// If [end] is `null`, it defaults to [length].
@@ -505,8 +578,9 @@
   /// and returns the list of the substrings between the matches,
   /// before the first match, and after the last match.
   /// ```dart
-  /// var string = "Hello world!";
-  /// string.split(" ");                      // ["Hello", "world!"];
+  /// const string = 'Hello world!';
+  /// final splitted = string.split(' ');
+  /// print(splitted); // [Hello, world!];
   /// ```
   /// If the pattern doesn't match this string at all,
   /// the result is always a list containing only the original string.
@@ -525,22 +599,22 @@
   /// then the empty substring between the two matches is not
   /// included in the result.
   /// ```dart
-  /// var string = "abba";
-  /// var re = RegExp(r"b*");
+  /// const string = 'abba';
+  /// final re = RegExp(r'b*');
   /// // re.allMatches(string) will find four matches:
   /// // * empty match before first "a".
   /// // * match of "bb"
   /// // * empty match after "bb", before second "a"
   /// // * empty match after second "a".
-  /// print(string.split(re));  // ["a", "a"]
+  /// print(string.split(re)); // [a, a]
   /// ```
   ///
   /// A non-empty match at the start or end of the string, or after another
   /// match, is not treated specially, and will introduce empty substrings
   /// in the result:
   /// ```dart
-  /// var string = "abbaa";
-  /// string.split("a"); // ["", "bb", "", ""]
+  /// const string = 'abbaa';
+  /// final splitted = string.split('a'); // ['', 'bb', '', '']
   /// ```
   ///
   /// If this string is the empty string, the result is an empty list
@@ -549,34 +623,40 @@
   /// (It is still a list containing the original empty string `[""]`
   /// if the pattern doesn't match).
   /// ```dart
-  /// var string = "";
-  /// string.split("");                       // []
-  /// string.split("a");                      // [""]
+  /// const string = '';
+  /// print(string.split('')); // []
+  /// print(string.split('a')); // []
   /// ```
   ///
   /// Splitting with an empty pattern splits the string into single-code unit
   /// strings.
   /// ```dart
-  /// var string = "Pub";
-  /// string.split("");                       // ["P", "u", "b"]
+  /// const string = 'Pub';
+  /// print(string.split('')); // [P, u, b]
   ///
   /// // Same as:
-  /// [for (var unit in string.codeUnits)
-  ///     String.fromCharCode(unit)];         // ["P", "u", "b"]
+  /// var codeUnitStrings = [
+  ///   for (final unit in string.codeUnits) String.fromCharCode(unit)
+  /// ];
+  /// print(codeUnitStrings); // [P, u, b]
   /// ```
   ///
   /// Splitting happens at UTF-16 code unit boundaries,
   /// and not at rune (Unicode code point) boundaries:
   /// ```dart
   /// // String made up of two code units, but one rune.
-  /// var string = '\u{1D11E}';
-  /// string.split('');  // ["\ud834", "\udd1e"] - 2 unpaired surrogate values
+  /// const string = '\u{1D11E}';
+  /// final splitted = string.split('');
+  /// print(splitted); // ['\ud834', '\udd1e'] - 2 unpaired surrogate values
   /// ```
   /// To get a list of strings containing the individual runes of a string,
   /// you should not use split.
   /// You can instead get a string for each rune as follows:
   /// ```dart
-  /// [for (var run in string.runes) String.fromCharCode(rune)]
+  /// const string = '\u{1F642}';
+  /// for (final rune in string.runes) {
+  ///   print(String.fromCharCode(rune));
+  /// }
   /// ```
   List<String> split(Pattern pattern);
 
@@ -600,9 +680,10 @@
   ///
   /// Then all the converted parts are concatenated into the resulting string.
   /// ```dart
-  /// 'Eats shoots leaves'.splitMapJoin((RegExp(r'shoots')),
-  ///     onMatch:    (m) => '${m[0]}',  // (or no onMatch at all)
-  ///     onNonMatch: (n) => '*'); // Result: "*shoots*"
+  /// final result = 'Eats shoots leaves'.splitMapJoin(RegExp(r'shoots'),
+  ///     onMatch: (m) => '${m[0]}', // (or no onMatch at all)
+  ///     onNonMatch: (n) => '*');
+  /// print(result); // *shoots*
   /// ```
   String splitMapJoin(Pattern pattern,
       {String Function(Match)? onMatch, String Function(String)? onNonMatch});
@@ -622,7 +703,7 @@
   /// If the string is already in all lower case, this method returns `this`.
   /// ```dart
   /// 'ALPHABET'.toLowerCase(); // 'alphabet'
-  /// 'abc'.toLowerCase();      // 'abc'
+  /// 'abc'.toLowerCase(); // 'abc'
   /// ```
   /// This function uses the language independent Unicode mapping and thus only
   /// works in some languages.
@@ -634,7 +715,7 @@
   /// If the string is already in all upper case, this method returns `this`.
   /// ```dart
   /// 'alphabet'.toUpperCase(); // 'ALPHABET'
-  /// 'ABC'.toUpperCase();      // 'ABC'
+  /// 'ABC'.toUpperCase(); // 'ABC'
   /// ```
   /// This function uses the language independent Unicode mapping and thus only
   /// works in some languages.
@@ -706,7 +787,7 @@
   ///
   /// When created, there is no [current] value.
   /// A [moveNext] will use the rune starting at [index] the current value,
-  /// and a [movePrevious] will use the rune ending just before [index] as the
+  /// and a [movePrevious] will use the rune ending just before [index] as
   /// the current value.
   ///
   /// The [index] position must not be in the middle of a surrogate pair.
diff --git a/sdk/lib/core/string_buffer.dart b/sdk/lib/core/string_buffer.dart
index 9f5a615..675dcd3 100644
--- a/sdk/lib/core/string_buffer.dart
+++ b/sdk/lib/core/string_buffer.dart
@@ -9,8 +9,71 @@
 /// Allows for the incremental building of a string using `write*()` methods.
 /// The strings are concatenated to a single string only when [toString] is
 /// called.
+///
+/// Example:
+/// ```dart
+/// final buffer = StringBuffer('DART');
+/// print(buffer.length); // 4
+/// ```
+/// To add the string representation of an object, as returned by
+/// [Object.toString], to the buffer, use [write].
+/// Is also used for adding a string directly.
+/// ```
+/// buffer.write(' is open source');
+/// print(buffer.length); // 19
+/// print(buffer); // DART is open source
+///
+/// const int dartYear = 2011;
+/// buffer
+///   ..write(' since ') // Writes a string.
+///   ..write(dartYear); // Writes an int.
+/// print(buffer); // DART is open source since 2011
+/// print(buffer.length); // 30
+/// ```
+/// To add a newline after the object's string representation, use [writeln].
+/// Calling [writeln] with no argument adds a single newline to the buffer.
+/// ```
+/// buffer.writeln(); // Contains "DART is open source since 2011\n".
+/// buffer.writeln('-' * (buffer.length - 1)); // 30 '-'s and a newline.
+/// print(buffer.length); // 62
+/// ```
+/// To write multiple objects to the buffer, use [writeAll].
+/// ```
+/// const separator = '-';
+/// buffer.writeAll(['Dart', 'is', 'fun!'], separator);
+/// print(buffer.length); // 74
+/// print(buffer);
+/// // DART is open source since 2011
+/// // ------------------------------
+/// // Dart-is-fun!
+/// ```
+/// To add the string representation of a Unicode code point, `charCode`,
+/// to the buffer, use [writeCharCode].
+/// ```
+/// buffer.writeCharCode(0x0A); // LF (line feed)
+/// buffer.writeCharCode(0x44); // 'D'
+/// buffer.writeCharCode(0x61); // 'a'
+/// buffer.writeCharCode(0x72); // 'r'
+/// buffer.writeCharCode(0x74); // 't'
+/// print(buffer.length); // 79
+/// ```
+/// To convert the content to a single string, use [toString].
+/// ```
+/// final text = buffer.toString();
+/// print(text);
+/// // DART is open source since 2011
+/// // ------------------------------
+/// // Dart-is-fun!
+/// // Dart
+/// ```
+/// To clear the buffer, so that it can be reused, use [clear].
+/// ```
+/// buffer.clear();
+/// print(buffer.isEmpty); // true
+/// print(buffer.length); // 0
+/// ```
 class StringBuffer implements StringSink {
-  /// Creates the string buffer with an initial content.
+  /// Creates a string buffer containing the provided [content].
   external StringBuffer([Object content = ""]);
 
   /// Returns the length of the content that has been accumulated so far.
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 3e24c54..cd38662 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -26,20 +26,92 @@
 
 /// A parsed URI, such as a URL.
 ///
-/// **See also:**
+/// To create a URI with specific components, use [new Uri]:
+/// ```dart
+/// var httpsUri = Uri(
+///     scheme: 'https',
+///     host: 'dart.dev',
+///     path: '/guides/libraries/library-tour',
+///     fragment: 'numbers');
+/// print(httpsUri); // https://dart.dev/guides/libraries/library-tour#numbers
 ///
+/// httpsUri = Uri(
+///     scheme: 'https',
+///     host: 'example.com',
+///     path: '/page/',
+///     queryParameters: {'search': 'blue', 'limit': '10'});
+/// print(httpsUri); // https://example.com/page/?search=blue&limit=10
+///
+/// final mailtoUri = Uri(
+///     scheme: 'mailto',
+///     path: 'John.Doe@example.com',
+///     queryParameters: {'subject': 'Example'});
+/// print(mailtoUri); // mailto:John.Doe@example.com?subject=Example
+/// ```
+///
+/// ## HTTP and HTTPS URI
+/// To create a URI with https scheme, use [Uri.https] or [Uri.http]:
+/// ```dart
+/// final httpsUri = Uri.https('example.com', 'api/fetch', {'limit': '10'});
+/// print(httpsUri); // https://example.com/api/fetch?limit=10
+/// ```
+/// ## File URI
+/// To create a URI from file path, use [Uri.file]:
+/// ```dart
+/// final fileUriUnix =
+///     Uri.file(r'/home/myself/images/image.png', windows: false);
+/// print(fileUriUnix); // file:///home/myself/images/image.png
+///
+/// final fileUriWindows =
+///     Uri.file(r'C:\Users\myself\Documents\image.png', windows: true);
+/// print(fileUriWindows); // file:///C:/Users/myself/Documents/image.png
+/// ```
+/// If the URI is not a file URI, calling this throws [UnsupportedError].
+///
+/// ## Directory URI
+/// Like [Uri.file] except that a non-empty URI path ends in a slash.
+/// ```dart
+/// final fileDirectory =
+///     Uri.directory('/home/myself/data/image', windows: false);
+/// print(fileDirectory); // file:///home/myself/data/image/
+///
+/// final fileDirectoryWindows = Uri.directory('/data/images', windows: true);
+/// print(fileDirectoryWindows); //  file:///data/images/
+/// ```
+///
+/// ## URI from string
+/// To create a URI from string, use [Uri.parse] or [Uri.tryParse]:
+/// ```dart
+/// final uri = Uri.parse(
+///     'https://dart.dev/guides/libraries/library-tour#utility-classes');
+/// print(uri); // https://dart.dev
+/// print(uri.isScheme('https')); // true
+/// print(uri.origin); // https://dart.dev
+/// print(uri.host); // dart.dev
+/// print(uri.authority); // dart.dev
+/// print(uri.port); // 443
+/// print(uri.path); // guides/libraries/library-tour
+/// print(uri.pathSegments); // [guides, libraries, library-tour]
+/// print(uri.fragment); // utility-classes
+/// print(uri.hasQuery); // false
+/// print(uri.data); // null
+/// ```
+///
+/// **See also:**
 /// * [URIs][uris] in the [library tour][libtour]
-/// * [RFC-3986](http://tools.ietf.org/html/rfc3986)
+/// * [RFC-3986](https://tools.ietf.org/html/rfc3986)
+/// * [RFC-2396](https://tools.ietf.org/html/rfc2396)
+/// * [RFC-2045](https://tools.ietf.org/html/rfc2045)
 ///
 /// [uris]: https://dart.dev/guides/libraries/library-tour#uris
 /// [libtour]: https://dart.dev/guides/libraries/library-tour
 abstract class Uri {
   /// The natural base URI for the current platform.
   ///
-  /// When running in a browser this is the current URL of the current page
+  /// When running in a browser, this is the current URL of the current page
   /// (from `window.location.href`).
   ///
-  /// When not running in a browser this is the file URI referencing
+  /// When not running in a browser, this is the file URI referencing
   /// the current working directory.
   external static Uri get base;
 
@@ -93,7 +165,7 @@
   /// When [query] is used, the provided string should be a valid URI query,
   /// but invalid characters, other than general delimiters,
   /// will be escaped if necessary.
-  /// When [queryParameters] is used the query is built from the
+  /// When [queryParameters] is used, the query is built from the
   /// provided map. Each key and value in the map is percent-encoded
   /// and joined using equal and ampersand characters.
   /// A value in the map must be either a string, or an [Iterable] of strings,
@@ -110,8 +182,24 @@
   ///
   /// The fragment component is set through [fragment].
   /// It should be a valid URI fragment, but invalid characters other than
-  /// general delimiters, are escaped if necessary.
+  /// general delimiters are escaped if necessary.
   /// If [fragment] is omitted or `null`, the URI has no fragment part.
+  ///
+  /// Example:
+  /// ```dart
+  /// final httpsUri = Uri(
+  ///     scheme: 'https',
+  ///     host: 'dart.dev',
+  ///     path: 'guides/libraries/library-tour',
+  ///     fragment: 'numbers');
+  /// print(httpsUri); // https://dart.dev/guides/libraries/library-tour#numbers
+  ///
+  /// final mailtoUri = Uri(
+  ///     scheme: 'mailto',
+  ///     path: 'John.Doe@example.com',
+  ///     queryParameters: {'subject': 'Example'});
+  /// print(mailtoUri); // mailto:John.Doe@example.com?subject=Example
+  /// ```
   factory Uri(
       {String? scheme,
       String? userInfo,
@@ -125,20 +213,19 @@
 
   /// Creates a new `http` URI from authority, path and query.
   ///
-  /// Examples:
-  ///
+  /// Example:
   /// ```dart
-  /// // http://example.org/path?q=dart.
-  /// Uri.http("example.org", "/path", { "q" : "dart" });
+  /// var uri = Uri.http('example.org', '/path', { 'q' : 'dart' });
+  /// print(uri); // http://example.org/path?q=dart
   ///
-  /// // http://user:pass@localhost:8080
-  /// Uri.http("user:pass@localhost:8080", "");
+  /// uri = Uri.http('user:password@localhost:8080', '');
+  /// print(uri); // http://user:password@localhost:8080
   ///
-  /// // http://example.org/a%20b
-  /// Uri.http("example.org", "a b");
+  /// uri = Uri.http('example.org', 'a b');
+  /// print(uri); // http://example.org/a%20b
   ///
-  /// // http://example.org/a%252F
-  /// Uri.http("example.org", "/a%2F");
+  /// uri = Uri.http('example.org', '/a%2F');
+  /// print(uri); // http://example.org/a%252F
   /// ```
   ///
   /// The `scheme` is always set to `http`.
@@ -161,6 +248,21 @@
   ///
   /// This constructor is the same as [Uri.http] except for the scheme
   /// which is set to `https`.
+  ///
+  /// Example:
+  /// ```dart
+  /// var uri = Uri.https('example.org', '/path', {'q': 'dart'});
+  /// print(uri); // https://example.org/path?q=dart
+  ///
+  /// uri = Uri.https('user:password@localhost:8080', '');
+  /// print(uri); // https://user:password@localhost:8080
+  ///
+  /// uri = Uri.https('example.org', 'a b');
+  /// print(uri); // https://example.org/a%20b
+  ///
+  /// uri = Uri.https('example.org', '/a%2F');
+  /// print(uri); // https://example.org/a%252F
+  /// ```
   factory Uri.https(String authority, String unencodedPath,
       [Map<String, dynamic>? queryParameters]) = _Uri.https;
 
@@ -171,7 +273,7 @@
   /// This path is interpreted using either Windows or non-Windows
   /// semantics.
   ///
-  /// With non-Windows semantics the slash (`/`) is used to separate
+  /// With non-Windows semantics, the slash (`/`) is used to separate
   /// path segments in the input [path].
   ///
   /// With Windows semantics, backslash (`\`) and forward-slash (`/`)
@@ -182,14 +284,14 @@
   /// If the path starts with a path separator, an absolute URI (with the
   /// `file` scheme and an empty authority) is created.
   /// Otherwise a relative URI reference with no scheme or authority is created.
-  /// One exception from this rule is that when Windows semantics is used
+  /// One exception to this rule is that when Windows semantics is used
   /// and the path starts with a drive letter followed by a colon (":") and a
   /// path separator, then an absolute URI is created.
   ///
   /// The default for whether to use Windows or non-Windows semantics
-  /// determined from the platform Dart is running on. When running in
+  /// is determined from the platform Dart is running on. When running in
   /// the standalone VM, this is detected by the VM based on the
-  /// operating system. When running in a browser non-Windows semantics
+  /// operating system. When running in a browser, non-Windows semantics
   /// is always used.
   ///
   /// To override the automatic detection of which semantics to use pass
@@ -197,51 +299,49 @@
   /// semantics and passing `false` will use non-Windows semantics.
   ///
   /// Examples using non-Windows semantics:
-  ///
   /// ```dart
   /// // xxx/yyy
-  /// Uri.file("xxx/yyy", windows: false);
+  /// Uri.file('xxx/yyy', windows: false);
   ///
   /// // xxx/yyy/
-  /// Uri.file("xxx/yyy/", windows: false);
+  /// Uri.file('xxx/yyy/', windows: false);
   ///
   /// // file:///xxx/yyy
-  /// Uri.file("/xxx/yyy", windows: false);
+  /// Uri.file('/xxx/yyy', windows: false);
   ///
   /// // file:///xxx/yyy/
-  /// Uri.file("/xxx/yyy/", windows: false);
+  /// Uri.file('/xxx/yyy/', windows: false);
   ///
   /// // C%3A
-  /// Uri.file("C:", windows: false);
+  /// Uri.file('C:', windows: false);
   /// ```
   ///
   /// Examples using Windows semantics:
-  ///
   /// ```dart
   /// // xxx/yyy
-  /// Uri.file(r"xxx\yyy", windows: true);
+  /// Uri.file(r'xxx\yyy', windows: true);
   ///
   /// // xxx/yyy/
-  /// Uri.file(r"xxx\yyy\", windows: true);
+  /// Uri.file(r'xxx\yyy\', windows: true);
   ///
   /// file:///xxx/yyy
-  /// Uri.file(r"\xxx\yyy", windows: true);
+  /// Uri.file(r'\xxx\yyy', windows: true);
   ///
   /// file:///xxx/yyy/
-  /// Uri.file(r"\xxx\yyy/", windows: true);
+  /// Uri.file(r'\xxx\yyy/', windows: true);
   ///
   /// // file:///C:/xxx/yyy
-  /// Uri.file(r"C:\xxx\yyy", windows: true);
+  /// Uri.file(r'C:\xxx\yyy', windows: true);
   ///
   /// // This throws an error. A path with a drive letter, but no following
   /// // path, is not allowed.
-  /// Uri.file(r"C:", windows: true);
+  /// Uri.file(r'C:', windows: true);
   ///
   /// // This throws an error. A path with a drive letter is not absolute.
-  /// Uri.file(r"C:xxx\yyy", windows: true);
+  /// Uri.file(r'C:xxx\yyy', windows: true);
   ///
   /// // file://server/share/file
-  /// Uri.file(r"\\server\share\file", windows: true);
+  /// Uri.file(r'\\server\share\file', windows: true);
   /// ```
   ///
   /// If the path passed is not a valid file path, an error is thrown.
@@ -252,17 +352,27 @@
   /// If [path] is not empty, and it doesn't end in a directory separator,
   /// then a slash is added to the returned URI's path.
   /// In all other cases, the result is the same as returned by `Uri.file`.
+  ///
+  /// Example:
+  /// ```dart
+  /// final fileDirectory = Uri.directory('data/images', windows: false);
+  /// print(fileDirectory); // data/images/
+  ///
+  /// final fileDirectoryWindows =
+  ///    Uri.directory(r'C:\data\images', windows: true);
+  /// print(fileDirectoryWindows); // file:///C:/data/images/
+  /// ```
   factory Uri.directory(String path, {bool? windows}) = _Uri.directory;
 
   /// Creates a `data:` URI containing the [content] string.
   ///
-  /// Converts the content to a bytes using [encoding] or the charset specified
+  /// Converts the content to bytes using [encoding] or the charset specified
   /// in [parameters] (defaulting to US-ASCII if not specified or unrecognized),
   /// then encodes the bytes into the resulting data URI.
   ///
-  /// Defaults to encoding using percent-encoding (any non-ASCII or non-URI-valid
-  /// bytes is replaced by a percent encoding). If [base64] is true, the bytes
-  /// are instead encoded using [base64].
+  /// Defaults to encoding using percent-encoding (any non-ASCII or
+  /// non-URI-valid bytes is replaced by a percent encoding). If [base64] is
+  /// true, the bytes are instead encoded using [base64].
   ///
   /// If [encoding] is not provided and [parameters] has a `charset` entry,
   /// that name is looked up using [Encoding.getByName],
@@ -280,6 +390,16 @@
   /// as an omitted `charset` parameter defaults to meaning `US-ASCII`.
   ///
   /// To read the content back, use [UriData.contentAsString].
+  ///
+  /// Example:
+  /// ```dart
+  /// final uri = Uri.dataFromString(
+  ///   'example content',
+  ///   mimeType: 'text/plain',
+  ///   parameters: <String, String>{'search': 'file', 'max': '10'},
+  /// );
+  /// print(uri); // data:;search=name;max=10,example%20content
+  /// ```
   factory Uri.dataFromString(String content,
       {String? mimeType,
       Encoding? encoding,
@@ -307,6 +427,12 @@
   /// in the data URI, the character is percent-escaped. If the character is
   /// non-ASCII, it is first UTF-8 encoded and then the bytes are percent
   /// encoded.
+  ///
+  /// Example:
+  /// ```dart
+  /// final uri = Uri.dataFromBytes([68, 97, 114, 116]);
+  /// print(uri); // data:application/octet-stream;base64,RGFydA==
+  /// ```
   factory Uri.dataFromBytes(List<int> bytes,
       {String mimeType = "application/octet-stream",
       Map<String, String>? parameters,
@@ -336,7 +462,7 @@
 
   /// The user info part of the authority component.
   ///
-  /// Th value is the empty string if there is no user info in the
+  /// The value is the empty string if there is no user info in the
   /// authority component.
   String get userInfo;
 
@@ -363,7 +489,7 @@
   ///
   /// The path is the actual substring of the URI representing the path,
   /// and it is encoded where necessary. To get direct access to the decoded
-  /// path use [pathSegments].
+  /// path, use [pathSegments].
   ///
   /// The path value is the empty string if there is no path component.
   String get path;
@@ -372,7 +498,7 @@
   ///
   /// The value is the actual substring of the URI representing the query part,
   /// and it is encoded where necessary.
-  /// To get direct access to the decoded query use [queryParameters].
+  /// To get direct access to the decoded query, use [queryParameters].
   ///
   /// The value is the empty string if there is no query component.
   String get query;
@@ -385,8 +511,8 @@
 
   /// The URI path split into its segments.
   ///
-  /// Each of the segments in the list have been decoded.
-  /// If the path is empty the empty list will
+  /// Each of the segments in the list has been decoded.
+  /// If the path is empty, the empty list will
   /// be returned. A leading slash `/` does not affect the segments returned.
   ///
   /// The list is unmodifiable and will throw [UnsupportedError] on any
@@ -395,10 +521,11 @@
 
   /// The URI query split into a map according to the rules
   /// specified for FORM post in the [HTML 4.01 specification section
-  /// 17.13.4](http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4 "HTML 4.01 section 17.13.4").
+  /// 17.13.4](https://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4
+  /// "HTML 4.01 section 17.13.4").
   ///
   /// Each key and value in the resulting map has been decoded.
-  /// If there is no query the empty map is returned.
+  /// If there is no query, the empty map is returned.
   ///
   /// Keys in the query string that have no value are mapped to the
   /// empty string.
@@ -407,20 +534,36 @@
   /// The [queryParametersAll] getter can provide a map
   /// that maps keys to all of their values.
   ///
+  /// Example:
+  /// ```dart import:convert
+  /// final uri =
+  ///     Uri.parse('https://example.com/api/fetch?limit=10,20,30&max=100');
+  /// print(jsonEncode(uri.queryParameters));
+  /// // {"limit":"10,20,30","max":"100"}
+  /// ```
+  ///
   /// The map is unmodifiable.
   Map<String, String> get queryParameters;
 
   /// Returns the URI query split into a map according to the rules
   /// specified for FORM post in the [HTML 4.01 specification section
-  /// 17.13.4](http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4 "HTML 4.01 section 17.13.4").
+  /// 17.13.4](https://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4
+  /// "HTML 4.01 section 17.13.4").
   ///
   /// Each key and value in the resulting map has been decoded. If there is no
-  /// query the map is empty.
+  /// query, the map is empty.
   ///
   /// Keys are mapped to lists of their values. If a key occurs only once,
   /// its value is a singleton list. If a key occurs with no value, the
   /// empty string is used as the value for that occurrence.
   ///
+  /// Example:
+  /// ```dart import:convert
+  /// final uri =
+  ///     Uri.parse('https://example.com/api/fetch?limit=10,20,30&max=100');
+  /// print(jsonEncode(uri.queryParameters)); // {"limit":"10,20,30","max":"100"}
+  /// ```
+  ///
   /// The map and the lists it contains are unmodifiable.
   Map<String, List<String>> get queryParametersAll;
 
@@ -462,7 +605,7 @@
   /// It is an error if the scheme is not "http" or "https", or if the host name
   /// is missing or empty.
   ///
-  /// See: http://www.w3.org/TR/2011/WD-html5-20110405/origin-0.html#origin
+  /// See: https://www.w3.org/TR/2011/WD-html5-20110405/origin-0.html#origin
   String get origin;
 
   /// Whether the scheme of this [Uri] is [scheme].
@@ -472,8 +615,11 @@
   ///
   /// Example:
   /// ```dart
-  /// var uri = Uri.parse("http://example.com/");
-  /// print(uri.isScheme("HTTP"));  // Prints true.
+  /// var uri = Uri.parse('http://example.com');
+  /// print(uri.isScheme('HTTP')); // true
+  ///
+  /// final uriNoScheme = Uri(host: 'example.com');
+  /// print(uriNoScheme.isScheme('HTTP')); // false
   /// ```
   ///
   /// An empty [scheme] string matches a URI with no scheme
@@ -485,22 +631,22 @@
   /// The returned path has either Windows or non-Windows
   /// semantics.
   ///
-  /// For non-Windows semantics the slash ("/") is used to separate
+  /// For non-Windows semantics, the slash ("/") is used to separate
   /// path segments.
   ///
-  /// For Windows semantics the backslash ("\\") separator is used to
+  /// For Windows semantics, the backslash ("\\") separator is used to
   /// separate path segments.
   ///
-  /// If the URI is absolute the path starts with a path separator
+  /// If the URI is absolute, the path starts with a path separator
   /// unless Windows semantics is used and the first path segment is a
-  /// drive letter. When Windows semantics is used a host component in
+  /// drive letter. When Windows semantics is used, a host component in
   /// the uri in interpreted as a file server and a UNC path is
   /// returned.
   ///
   /// The default for whether to use Windows or non-Windows semantics
-  /// determined from the platform Dart is running on. When running in
-  /// the standalone VM this is detected by the VM based on the
-  /// operating system. When running in a browser non-Windows semantics
+  /// is determined from the platform Dart is running on. When running in
+  /// the standalone VM, this is detected by the VM based on the
+  /// operating system. When running in a browser, non-Windows semantics
   /// is always used.
   ///
   /// To override the automatic detection of which semantics to use pass
@@ -508,10 +654,10 @@
   /// semantics and passing `false` will use non-Windows semantics.
   ///
   /// If the URI ends with a slash (i.e. the last path component is
-  /// empty) the returned file path will also end with a slash.
+  /// empty), the returned file path will also end with a slash.
   ///
-  /// With Windows semantics URIs starting with a drive letter cannot
-  /// be relative to the current drive on the designated drive. That is
+  /// With Windows semantics, URIs starting with a drive letter cannot
+  /// be relative to the current drive on the designated drive. That is,
   /// for the URI `file:///c:abc` calling `toFilePath` will throw as a
   /// path segment cannot contain colon on Windows.
   ///
@@ -536,10 +682,10 @@
   ///                               // cannot contain colon on Windows.
   /// Uri.parse("file://server/share/file");  // \\server\share\file
   /// ```
-  /// If the URI is not a file URI calling this throws
+  /// If the URI is not a file URI, calling this throws
   /// [UnsupportedError].
   ///
-  /// If the URI cannot be converted to a file path calling this throws
+  /// If the URI cannot be converted to a file path, calling this throws
   /// [UnsupportedError].
   // TODO(lrn): Deprecate and move functionality to File class or similar.
   // The core libraries should not worry about the platform.
@@ -576,31 +722,35 @@
   /// Each part that is not provided will default to the corresponding
   /// value from this `Uri` instead.
   ///
-  /// This method is different from [Uri.resolve] which overrides in a
+  /// This method is different from [Uri.resolve], which overrides in a
   /// hierarchical manner,
   /// and can instead replace each part of a `Uri` individually.
   ///
   /// Example:
   /// ```dart
-  /// Uri uri1 = Uri.parse("a://b@c:4/d/e?f#g");
-  /// Uri uri2 = uri1.replace(scheme: "A", path: "D/E/E", fragment: "G");
-  /// print(uri2);  // prints "a://b@c:4/D/E/E?f#G"
+  /// final uri1 = Uri.parse(
+  ///     'http://dart.dev/guides/libraries/library-tour#utility-classes');
+  ///
+  /// final uri2 = uri1.replace(
+  ///     scheme: 'https',
+  ///     path: 'guides/libraries/library-tour',
+  ///     fragment: 'uris');
+  /// print(uri2); // https://dart.dev/guides/libraries/library-tour#uris
   /// ```
   /// This method acts similarly to using the `Uri` constructor with
   /// some of the arguments taken from this `Uri`. Example:
-  /// ```dart
-  /// Uri uri3 = Uri(
-  ///     scheme: "A",
+  /// ``` dart continued
+  /// final Uri uri3 = Uri(
+  ///     scheme: 'https',
   ///     userInfo: uri1.userInfo,
   ///     host: uri1.host,
-  ///     port: uri1.port,
-  ///     path: "D/E/E",
+  ///     port: uri2.port,
+  ///     path: '/guides/language/language-tour',
   ///     query: uri1.query,
-  ///     fragment: "G");
-  /// print(uri3);  // prints "a://b@c:4/D/E/E?f#G"
-  /// print(uri2 == uri3);  // prints true.
+  ///     fragment: null);
+  /// print(uri3); // https://dart.dev/guides/language/language-tour
   /// ```
-  /// Using this method can be seen as a shorthand for the `Uri` constructor
+  /// Using this method can be seen as shorthand for the `Uri` constructor
   /// call above, but may also be slightly faster because the parts taken
   /// from this `Uri` need not be checked for validity again.
   Uri replace(
@@ -617,6 +767,13 @@
   /// Creates a `Uri` that differs from this only in not having a fragment.
   ///
   /// If this `Uri` does not have a fragment, it is itself returned.
+  ///
+  /// Example:
+  /// ```dart
+  /// final uri =
+  ///     Uri.parse('https://example.org:8080/foo/bar#frag').removeFragment();
+  /// print(uri); // https://example.org:8080/foo/bar
+  /// ```
   Uri removeFragment();
 
   /// Resolve [reference] as an URI relative to `this`.
@@ -629,16 +786,17 @@
   /// See [resolveUri] for details.
   Uri resolve(String reference);
 
-  /// Resolve [reference] as an URI relative to `this`.
+  /// Resolve [reference] as a URI relative to `this`.
   ///
   /// Returns the resolved URI.
   ///
   /// The algorithm "Transform Reference" for resolving a reference is described
-  /// in [RFC-3986 Section 5](http://tools.ietf.org/html/rfc3986#section-5 "RFC-1123").
+  /// in [RFC-3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5
+  /// "RFC-1123").
   ///
   /// Updated to handle the case where the base URI is just a relative path -
-  /// that is: when it has no scheme and no authority and the path does not start
-  /// with a slash.
+  /// that is: when it has no scheme and no authority and the path does not
+  /// start with a slash.
   /// In that case, the paths are combined without removing leading "..", and
   /// an empty path is not converted to "/".
   Uri resolveUri(Uri reference);
@@ -648,7 +806,7 @@
   /// A normalized path does not contain `.` segments or non-leading `..`
   /// segments.
   /// Only a relative path with no scheme or authority may contain
-  /// leading `..` segments,
+  /// leading `..` segments;
   /// a path that starts with `/` will also drop any leading `..` segments.
   ///
   /// This uses the same normalization strategy as `Uri().resolve(this)`.
@@ -666,6 +824,15 @@
   ///
   /// If the [uri] string is not valid as a URI or URI reference,
   /// a [FormatException] is thrown.
+  ///
+  /// Example:
+  /// ```dart
+  /// final uri =
+  ///     Uri.parse('https://example.com/api/fetch?limit=10,20,30&max=100');
+  /// print(uri); // https://example.com/api/fetch?limit=10,20,30&max=100
+  ///
+  /// Uri.parse('::Not valid URI::'); // Throws FormatException.
+  /// ```
   static Uri parse(String uri, [int start = 0, int? end]) {
     // This parsing will not validate percent-encoding, IPv6, etc.
     // When done splitting into parts, it will call, e.g., [_makeFragment]
@@ -963,6 +1130,17 @@
   /// of [uri], and only the substring from `start` to `end` is parsed as a URI.
   ///
   /// Returns `null` if the [uri] string is not valid as a URI or URI reference.
+  ///
+  /// Example:
+  /// ```dart
+  /// final uri = Uri.tryParse(
+  ///     'https://dart.dev/guides/libraries/library-tour#utility-classes', 0,
+  ///     16);
+  /// print(uri); // https://dart.dev
+  ///
+  /// var notUri = Uri.tryParse('::Not valid URI::');
+  /// print(notUri); // null
+  /// ```
   static Uri? tryParse(String uri, [int start = 0, int? end]) {
     // TODO: Optimize to avoid throwing-and-recatching.
     try {
@@ -977,19 +1155,26 @@
   ///
   /// All characters except uppercase and lowercase letters, digits and
   /// the characters `-_.!~*'()` are percent-encoded. This is the
-  /// set of characters specified in RFC 2396 and the which is
+  /// set of characters specified in RFC 2396 and which is
   /// specified for the encodeUriComponent in ECMA-262 version 5.1.
   ///
-  /// When manually encoding path segments or query components remember
+  /// When manually encoding path segments or query components, remember
   /// to encode each part separately before building the path or query
   /// string.
   ///
   /// For encoding the query part consider using
   /// [encodeQueryComponent].
   ///
-  /// To avoid the need for explicitly encoding use the [pathSegments]
+  /// To avoid the need for explicitly encoding, use the [pathSegments]
   /// and [queryParameters] optional named arguments when constructing
   /// a [Uri].
+  ///
+  /// Example:
+  /// ```dart
+  /// const request = 'http://example.com/search=Dart';
+  /// final encoded = Uri.encodeComponent(request);
+  /// print(encoded); // http%3A%2F%2Fexample.com%2Fsearch%3DDart
+  /// ```
   static String encodeComponent(String component) {
     return _Uri._uriEncode(_Uri._unreserved2396Table, component, utf8, false);
   }
@@ -1024,7 +1209,7 @@
    * [queryParameters] optional named arguments when constructing a
    * [Uri].
    *
-   * See http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 for more
+   * See https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 for more
    * details.
    */
   static String encodeQueryComponent(String component,
@@ -1035,14 +1220,21 @@
   /// Decodes the percent-encoding in [encodedComponent].
   ///
   /// Note that decoding a URI component might change its meaning as
-  /// some of the decoded characters could be characters with are
+  /// some of the decoded characters could be characters which are
   /// delimiters for a given URI component type. Always split a URI
   /// component using the delimiters for the component before decoding
   /// the individual parts.
   ///
-  /// For handling the [path] and [query] components consider using
+  /// For handling the [path] and [query] components, consider using
   /// [pathSegments] and [queryParameters] to get the separated and
   /// decoded component.
+  ///
+  /// Example:
+  /// ```dart
+  /// final decoded =
+  ///     Uri.decodeComponent('http%3A%2F%2Fexample.com%2Fsearch%3DDart');
+  /// print(decoded); // http://example.com/search=Dart
+  /// ```
   static String decodeComponent(String encodedComponent) {
     return _Uri._uriDecode(
         encodedComponent, 0, encodedComponent.length, utf8, false);
@@ -1066,7 +1258,14 @@
   /// All characters except uppercase and lowercase letters, digits and
   /// the characters `!#$&'()*+,-./:;=?@_~` are percent-encoded. This
   /// is the set of characters specified in in ECMA-262 version 5.1 for
-  /// the encodeURI function .
+  /// the encodeURI function.
+  ///
+  /// Example:
+  /// ```dart
+  /// final encoded =
+  ///     Uri.encodeFull('https://example.com/api/query?search= dart is');
+  /// print(encoded); // https://example.com/api/query?search=%20dart%20is
+  /// ```
   static String encodeFull(String uri) {
     return _Uri._uriEncode(_Uri._encodeFullTable, uri, utf8, false);
   }
@@ -1075,24 +1274,41 @@
   ///
   /// Note that decoding a full URI might change its meaning as some of
   /// the decoded characters could be reserved characters. In most
-  /// cases an encoded URI should be parsed into components using
+  /// cases, an encoded URI should be parsed into components using
   /// [Uri.parse] before decoding the separate components.
+  ///
+  /// Example:
+  /// ```dart
+  /// final decoded =
+  ///     Uri.decodeFull('https://example.com/api/query?search=%20dart%20is');
+  /// print(decoded); // https://example.com/api/query?search= dart is
+  /// ```
   static String decodeFull(String uri) {
     return _Uri._uriDecode(uri, 0, uri.length, utf8, false);
   }
 
   /// Splits the [query] into a map according to the rules
   /// specified for FORM post in the [HTML 4.01 specification section
-  /// 17.13.4](http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4 "HTML 4.01 section 17.13.4").
+  /// 17.13.4](https://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4
+  /// "HTML 4.01 section 17.13.4").
   ///
   /// Each key and value in the returned map has been decoded. If the [query]
-  /// is the empty string an empty map is returned.
+  /// is the empty string, an empty map is returned.
   ///
   /// Keys in the query string that have no value are mapped to the
   /// empty string.
   ///
-  /// Each query component will be decoded using [encoding]. The default encoding
-  /// is UTF-8.
+  /// Each query component will be decoded using [encoding]. The default
+  /// encoding is UTF-8.
+  ///
+  /// Example:
+  /// ```dart import:convert
+  /// final queryStringMap =
+  ///     Uri.splitQueryString('limit=10&max=100&search=Dart%20is%20fun');
+  /// print(jsonEncode(queryStringMap));
+  /// // {"limit":"10","max":"100","search":"Dart is fun"}
+  ///
+  /// ```
   static Map<String, String> splitQueryString(String query,
       {Encoding encoding = utf8}) {
     return query.split("&").fold({}, (map, element) {
@@ -1170,7 +1386,7 @@
   /// representation.
   ///
   /// Acts on the substring from [start] to [end]. If [end] is omitted, it
-  /// defaults ot the end of the string.
+  /// defaults to the end of the string.
   ///
   /// Some examples of IPv6 addresses:
   ///  * `::1`
@@ -1188,7 +1404,7 @@
     //  - The last two parts may be replaced by an IPv4 "dotted-quad" address.
 
     // Helper function for reporting a badly formatted IPv6 address.
-    void error(String msg, [position]) {
+    void error(String msg, int? position) {
       throw FormatException('Illegal IPv6 address, $msg', host, position);
     }
 
@@ -1204,7 +1420,7 @@
       return value;
     }
 
-    if (host.length < 2) error('address is too short');
+    if (host.length < 2) error('address is too short', null);
     List<int> parts = [];
     bool wildcardSeen = false;
     // Set if seeing a ".", suggesting that there is an IPv4 address.
@@ -1238,7 +1454,7 @@
         seenDot = true;
       }
     }
-    if (parts.length == 0) error('too few parts');
+    if (parts.length == 0) error('too few parts', null);
     bool atEnd = (partStart == end);
     bool isLastWildcard = (parts.last == -1);
     if (atEnd && !isLastWildcard) {
@@ -1255,10 +1471,10 @@
     }
     if (wildcardSeen) {
       if (parts.length > 7) {
-        error('an address with a wildcard must have less than 7 parts');
+        error('an address with a wildcard must have less than 7 parts', null);
       }
     } else if (parts.length != 8) {
-      error('an address without a wildcard must contain exactly 8 parts');
+      error('an address without a wildcard must contain exactly 8 parts', null);
     }
     List<int> bytes = Uint8List(16);
     for (int i = 0, index = 0; i < parts.length; i++) {
@@ -2181,7 +2397,7 @@
 
   /// Performs RFC 3986 Percent-Encoding Normalization.
   ///
-  /// Returns a replacement string that should be replace the original escape.
+  /// Returns a replacement string that should replace the original escape.
   /// Returns null if no replacement is necessary because the escape is
   /// not for an unreserved character and is already non-lower-case.
   ///
@@ -2266,12 +2482,12 @@
   }
 
   /// Runs through component checking that each character is valid and
-  /// normalize percent escapes.
+  /// normalizes percent escapes.
   ///
   /// Uses [charTable] to check if a non-`%` character is allowed.
   /// Each `%` character must be followed by two hex digits.
-  /// If the hex-digits are lower case letters, they are converted to
-  /// upper case.
+  /// If the hex-digits are lowercase letters, they are converted to
+  /// uppercase.
   ///
   /// Returns `null` if the original content was already normalized.
   static String? _normalize(
@@ -2430,7 +2646,7 @@
   /// Removing the ".." from a "bar/foo/.." sequence results in "bar/"
   /// (trailing "/"). If the entire path is removed (because it contains as
   /// many ".." segments as real segments), the result is "./".
-  /// This is different from an empty string, which represents "no path",
+  /// This is different from an empty string, which represents "no path"
   /// when you resolve it against a base URI with a path with a non-empty
   /// final segment.
   static String _normalizeRelativePath(String path, bool allowScheme) {
@@ -2811,7 +3027,7 @@
   /// If [plusToSpace] is `true`, plus characters will be converted to spaces.
   ///
   /// The decoder will create a byte-list of the percent-encoded parts, and then
-  /// decode the byte-list using [encoding]. The default encodings UTF-8.
+  /// decode the byte-list using [encoding]. The default encoding is UTF-8.
   static String _uriDecode(
       String text, int start, int end, Encoding encoding, bool plusToSpace) {
     assert(0 <= start);
@@ -3115,7 +3331,7 @@
 /// Data URIs are non-hierarchical URIs that can contain any binary data.
 /// They are defined by [RFC 2397](https://tools.ietf.org/html/rfc2397).
 ///
-/// This class allows parsing the URI text and extracting individual parts of the
+/// This class allows parsing the URI text, extracting individual parts of the
 /// URI, as well as building the URI text from structured parts.
 class UriData {
   static const int _noScheme = -1;
@@ -3137,7 +3353,7 @@
   /// The first separator ends the mime type. We don't bother with finding
   /// the '/' inside the mime type.
   ///
-  /// Each two separators after that marks a parameter key and value.
+  /// Each two separators after that mark a parameter key and value.
   ///
   /// If there is a single separator left, it ends the "base64" marker.
   ///
@@ -3244,7 +3460,7 @@
   /// until just before the ',' before the data, or before a `;base64,`
   /// marker.
   ///
-  /// Of an [indices] list is passed, separator indices are stored in that
+  /// If an [indices] list is passed, separator indices are stored in that
   /// list.
   static void _writeUri(
       String? mimeType,
@@ -3335,7 +3551,7 @@
   /// it valid, and existing escapes are case normalized.
   ///
   /// Accessing the individual parts may fail later if they turn out to have
-  /// content that can't be decoded successfully as a string, for example if
+  /// content that cannot be decoded successfully as a string, for example if
   /// existing percent escapes represent bytes that cannot be decoded
   /// by the chosen [Encoding] (see [contentAsString]).
   ///
@@ -3410,7 +3626,7 @@
   /// If the parameters of the media type contains a `charset` parameter
   /// then this returns its value, otherwise it returns `US-ASCII`,
   /// which is the default charset for data URIs.
-  /// If the value contain non-ASCII percent escapes, they are decoded as UTF-8.
+  /// If the values contain non-ASCII percent escapes, they are decoded as UTF-8.
   ///
   /// If the MIME type representation in the URI text contains URI escapes,
   /// they are unescaped in the returned string.
@@ -3497,7 +3713,7 @@
   /// If the content is Base64 encoded, it will be decoded to bytes and then
   /// decoded to a string using [encoding].
   /// If encoding is omitted, the value of a `charset` parameter is used
-  /// if it is recognized by [Encoding.getByName], otherwise it defaults to
+  /// if it is recognized by [Encoding.getByName]; otherwise it defaults to
   /// the [ascii] encoding, which is the default encoding for data URIs
   /// that do not specify an encoding.
   ///
@@ -3725,7 +3941,7 @@
 // Initial state for scheme validation.
 const int _schemeStart = 20;
 
-/// Transition tables used to scan a URI to determine its structure.
+/// Transition tables are used to scan a URI to determine its structure.
 ///
 /// The tables represent a state machine with output.
 ///
@@ -3740,13 +3956,13 @@
 /// and a 3-bit index into the output table.
 ///
 /// For URI scanning, only characters in the range U+0020 through U+007E are
-/// interesting, all characters outside that range are treated the same.
-/// The tables only contain 96 entries, representing that characters in the
+/// interesting; all characters outside that range are treated the same.
+/// The tables only contain 96 entries, representing the characters in the
 /// interesting range, plus one more to represent all values outside the range.
 /// The character entries are stored in one `Uint8List` per state, with the
 /// transition for a character at position `character ^ 0x60`,
 /// which maps the range U+0020 .. U+007F into positions 0 .. 95.
-/// All remaining characters are mapped to position 31 (`0x7f ^ 0x60`) which
+/// All remaining characters are mapped to position 31 (`0x7f ^ 0x60`), which
 /// represents the transition for all remaining characters.
 final List<Uint8List> _scannerTables = _createTables();
 
diff --git a/sdk/lib/ffi/abi.dart b/sdk/lib/ffi/abi.dart
new file mode 100644
index 0000000..f5cba04
--- /dev/null
+++ b/sdk/lib/ffi/abi.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.ffi;
+
+/// An application binary interface (ABI).
+///
+/// An ABI defines the memory layout of data
+/// and the function call protocol for native code.
+/// It is usually defined by the an operating system for each
+/// architecture that operating system runs on.
+///
+/// The Dart VM can run on a variety of operating systems and architectures.
+/// Supported ABIs are represented by `Abi` objects.
+/// See [values] for all the supported ABIs.
+class Abi {
+  /// The application binary interface for Android on the Arm architecture.
+  static const androidArm = _androidArm;
+
+  /// The application binary interface for Android on the Arm64 architecture.
+  static const androidArm64 = _androidArm64;
+
+  /// The application binary interface for Android on the IA32 architecture.
+  static const androidIA32 = _androidIA32;
+
+  /// The application binary interface for android on the X64 architecture.
+  static const androidX64 = _androidX64;
+
+  /// The application binary interface for Fuchsia on the Arm64 architecture.
+  static const fuchsiaArm64 = _fuchsiaArm64;
+
+  /// The application binary interface for Fuchsia on the X64 architecture.
+  static const fuchsiaX64 = _fuchsiaX64;
+
+  /// The application binary interface for iOS on the Arm architecture.
+  static const iosArm = _iosArm;
+
+  /// The application binary interface for iOS on the Arm64 architecture.
+  static const iosArm64 = _iosArm64;
+
+  /// The application binary interface for iOS on the X64 architecture.
+  static const iosX64 = _iosX64;
+
+  /// The application binary interface for Linux on the Arm architecture.
+  ///
+  /// Does not distinguish between hard and soft fp. Currently, no uses of Abi
+  /// require this distinction.
+  static const linuxArm = _linuxArm;
+
+  /// The application binary interface for linux on the Arm64 architecture.
+  static const linuxArm64 = _linuxArm64;
+
+  /// The application binary interface for linux on the IA32 architecture.
+  static const linuxIA32 = _linuxIA32;
+
+  /// The application binary interface for linux on the X64 architecture.
+  static const linuxX64 = _linuxX64;
+
+  /// The application binary interface for MacOS on the Arm64 architecture.
+  static const macosArm64 = _macosArm64;
+
+  /// The application binary interface for MacOS on the X64 architecture.
+  static const macosX64 = _macosX64;
+
+  /// The application binary interface for Windows on the Arm64 architecture.
+  static const windowsArm64 = _windowsArm64;
+
+  /// The application binary interface for Windows on the IA32 architecture.
+  static const windowsIA32 = _windowsIA32;
+
+  /// The application binary interface for Windows on the X64 architecture.
+  static const windowsX64 = _windowsX64;
+
+  /// The ABIs that the DartVM can run on.
+  ///
+  /// Does not contain a `macosIA32`. We have stopped supporting 32-bit MacOS.
+  ///
+  /// Includes [windowsArm64], even though it is currently not supported.
+  /// Support has been requested for Flutter.
+  /// https://github.com/flutter/flutter/issues/53120
+  // TODO(http://dartbug.com/47824): Remove the above comment when supported.
+  static const values = [
+    androidArm,
+    androidArm64,
+    androidIA32,
+    androidX64,
+    fuchsiaArm64,
+    fuchsiaX64,
+    iosArm,
+    iosArm64,
+    iosX64,
+    linuxArm,
+    linuxArm64,
+    linuxIA32,
+    linuxX64,
+    macosArm64,
+    macosX64,
+    windowsArm64,
+    windowsIA32,
+    windowsX64,
+  ];
+
+  /// The ABI the Dart VM is currently running on.
+  external factory Abi.current();
+
+  /// A string representation of this ABI.
+  ///
+  /// The string is equal to the 'on' part from `Platform.version` and
+  /// `dart --version`.
+  @override
+  String toString() => '${_os.name}_${_architecture.name}';
+
+  /// The operating system of this [Abi].
+  final _OS _os;
+
+  /// The architecture of this [Abi].
+  final _Architecture _architecture;
+
+  /// The constructor is private so that we can use [Abi.values] as opaque
+  /// tokens.
+  const Abi._(this._architecture, this._os);
+
+  static const _androidArm = Abi._(_Architecture.arm, _OS.android);
+  static const _androidArm64 = Abi._(_Architecture.arm64, _OS.android);
+  static const _androidIA32 = Abi._(_Architecture.ia32, _OS.android);
+  static const _androidX64 = Abi._(_Architecture.x64, _OS.android);
+  static const _fuchsiaArm64 = Abi._(_Architecture.arm64, _OS.fuchsia);
+  static const _fuchsiaX64 = Abi._(_Architecture.x64, _OS.fuchsia);
+  static const _iosArm = Abi._(_Architecture.arm, _OS.ios);
+  static const _iosArm64 = Abi._(_Architecture.arm64, _OS.ios);
+  static const _iosX64 = Abi._(_Architecture.x64, _OS.ios);
+  static const _linuxArm = Abi._(_Architecture.arm, _OS.linux);
+  static const _linuxArm64 = Abi._(_Architecture.arm64, _OS.linux);
+  static const _linuxIA32 = Abi._(_Architecture.ia32, _OS.linux);
+  static const _linuxX64 = Abi._(_Architecture.x64, _OS.linux);
+  static const _macosArm64 = Abi._(_Architecture.arm64, _OS.macos);
+  static const _macosX64 = Abi._(_Architecture.x64, _OS.macos);
+  static const _windowsArm64 = Abi._(_Architecture.arm64, _OS.windows);
+  static const _windowsIA32 = Abi._(_Architecture.ia32, _OS.windows);
+  static const _windowsX64 = Abi._(_Architecture.x64, _OS.windows);
+}
+
+/// The hardware architectures the Dart VM runs on.
+enum _Architecture {
+  arm,
+  arm64,
+  ia32,
+  x64,
+}
+
+/// The operating systems the Dart VM runs on.
+enum _OS {
+  android,
+  fuchsia,
+  ios,
+  linux,
+  macos,
+  windows,
+}
diff --git a/sdk/lib/ffi/abi_specific.dart b/sdk/lib/ffi/abi_specific.dart
new file mode 100644
index 0000000..560044a
--- /dev/null
+++ b/sdk/lib/ffi/abi_specific.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.ffi;
+
+/// The supertype of all [Abi]-specific integer types.
+///
+/// [Abi]-specific integers should extend this class and annotate it with
+/// [AbiSpecificIntegerMapping] to declare the integer size and signedness
+/// for [Abi.values].
+///
+/// For example:
+///
+/// ```
+/// /// Represents a `uintptr_t` in C.
+/// ///
+/// /// [UintPtr] is not constructible in the Dart code and serves purely as
+/// /// marker in type signatures.
+/// @AbiSpecificIntegerMapping({
+///   Abi.androidArm: Uint32(),
+///   Abi.androidArm64: Uint64(),
+///   Abi.androidIA32: Uint32(),
+///   Abi.androidX64: Uint64(),
+///   Abi.fuchsiaArm64: Uint64(),
+///   Abi.fuchsiaX64: Uint64(),
+///   Abi.iosArm: Uint32(),
+///   Abi.iosArm64: Uint64(),
+///   Abi.linuxArm: Uint32(),
+///   Abi.linuxArm64: Uint64(),
+///   Abi.linuxIA32: Uint32(),
+///   Abi.linuxX64: Uint64(),
+///   Abi.macosArm64: Uint64(),
+///   Abi.macosX64: Uint64(),
+///   Abi.windowsIA32: Uint32(),
+///   Abi.windowsX64: Uint64(),
+/// })
+/// class UintPtr extends AbiSpecificInteger {
+///   const UintPtr();
+/// }
+/// ```
+class AbiSpecificInteger extends NativeType {
+  const AbiSpecificInteger();
+}
+
+/// Mapping for a subtype of [AbiSpecificInteger].
+///
+/// See documentation on [AbiSpecificInteger].
+class AbiSpecificIntegerMapping {
+  final Map<Abi, NativeType> mapping;
+
+  const AbiSpecificIntegerMapping(this.mapping);
+}
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index fa98c88..eba4ea8 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -15,12 +15,14 @@
 import 'dart:isolate';
 import 'dart:typed_data';
 
-part "native_type.dart";
-part "allocation.dart";
-part "annotations.dart";
-part "dynamic_library.dart";
-part "struct.dart";
-part "union.dart";
+part 'abi.dart';
+part 'abi_specific.dart';
+part 'native_type.dart';
+part 'allocation.dart';
+part 'annotations.dart';
+part 'dynamic_library.dart';
+part 'struct.dart';
+part 'union.dart';
 
 /// Number of bytes used by native type T.
 ///
@@ -29,12 +31,12 @@
 /// This function must be invoked with a compile-time constant [T].
 external int sizeOf<T extends NativeType>();
 
-/// Represents a pointer into the native C memory corresponding to "NULL", e.g.
+/// Represents a pointer into the native C memory corresponding to 'NULL', e.g.
 /// a pointer with address 0.
 final Pointer<Never> nullptr = Pointer.fromAddress(0);
 
 /// Represents a pointer into the native C memory. Cannot be extended.
-@pragma("vm:entry-point")
+@pragma('vm:entry-point')
 class Pointer<T extends NativeType> extends NativeType {
   /// Construction from raw integer.
   external factory Pointer.fromAddress(int ptr);
@@ -56,7 +58,7 @@
   /// Does not accept dynamic invocations -- where the type of the receiver is
   /// [dynamic].
   external static Pointer<NativeFunction<T>> fromFunction<T extends Function>(
-      @DartRepresentationOf("T") Function f,
+      @DartRepresentationOf('T') Function f,
       [Object? exceptionalReturn]);
 
   /// Access to the raw pointer value.
@@ -150,7 +152,7 @@
     on Pointer<NativeFunction<NF>> {
   /// Convert to Dart function, automatically marshalling the arguments
   /// and return value.
-  external DF asFunction<@DartRepresentationOf("NF") DF extends Function>(
+  external DF asFunction<@DartRepresentationOf('NF') DF extends Function>(
       {bool isLeaf: false});
 }
 
@@ -737,6 +739,22 @@
   external T operator [](int index);
 }
 
+/// Extension on [Pointer] specialized for the type argument
+/// [AbiSpecificInteger].
+extension AbiSpecificIntegerPointer<T extends AbiSpecificInteger>
+    on Pointer<T> {
+  /// The integer at [address].
+  external int get value;
+
+  external void set value(int value);
+
+  /// The integer at `address + sizeOf<T>() * index`.
+  external int operator [](int index);
+
+  /// The integer at `address + sizeOf<T>() * index`.
+  external void operator []=(int index, int value);
+}
+
 /// Bounds checking indexing methods on [Array]s of [Pointer].
 extension PointerArray<T extends NativeType> on Array<Pointer<T>> {
   external Pointer<T> operator [](int index);
@@ -763,6 +781,13 @@
   external void operator []=(int index, Array<T> value);
 }
 
+/// Bounds checking indexing methods on [Array]s of [AbiSpecificInteger].
+extension AbiSpecificIntegerArray on Array<AbiSpecificInteger> {
+  external int operator [](int index);
+
+  external void operator []=(int index, int value);
+}
+
 /// Extension to retrieve the native `Dart_Port` from a [SendPort].
 extension NativePort on SendPort {
   /// The native port of this [SendPort].
@@ -826,8 +851,8 @@
 /// Annotation to be used for marking an external function as FFI native.
 ///
 /// Example:
-///```dart template:none
-/// @FfiNative<Int64 Function(Int64, Int64)>("FfiNative_Sum", isLeaf:true)
+///```dart template:top
+/// @FfiNative<Int64 Function(Int64, Int64)>('FfiNative_Sum', isLeaf:true)
 /// external int sum(int a, int b);
 ///```
 /// Calling such functions will throw an exception if no resolver
@@ -844,7 +869,7 @@
 
 // Bootstrapping native for getting the FFI native C function pointer to look
 // up the FFI resolver.
-@pragma("vm:external-name", "Ffi_GetFfiNativeResolver")
+@pragma('vm:external-name', 'Ffi_GetFfiNativeResolver')
 external Pointer<NativeFunction<IntPtr Function(Handle, Handle, IntPtr)>>
     _get_ffi_native_resolver<T extends NativeFunction>();
 
diff --git a/sdk/lib/ffi/ffi_sources.gni b/sdk/lib/ffi/ffi_sources.gni
index 4152f91..b725fe0 100644
--- a/sdk/lib/ffi/ffi_sources.gni
+++ b/sdk/lib/ffi/ffi_sources.gni
@@ -6,6 +6,8 @@
   "ffi.dart",
 
   # The above file needs to be first as it lists the parts below.
+  "abi.dart",
+  "abi_specific.dart",
   "allocation.dart",
   "annotations.dart",
   "dynamic_library.dart",
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 0a3a46e..182872b 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -57,7 +57,7 @@
         applyExtension;
 import 'dart:_interceptors'
     show
-        Interceptor,
+        JavaScriptObject,
         JavaScriptFunction,
         JSExtendableArray,
         JSUInt31,
@@ -176,7 +176,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class AbstractWorker extends Interceptor implements EventTarget {
+abstract class AbstractWorker extends JavaScriptObject implements EventTarget {
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() {
     throw new UnsupportedError("Not supported");
@@ -469,7 +469,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AccessibleNodeList")
-class AccessibleNodeList extends Interceptor {
+class AccessibleNodeList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AccessibleNodeList._() {
     throw new UnsupportedError("Not supported");
@@ -705,7 +705,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AnimationEffectReadOnly")
-class AnimationEffectReadOnly extends Interceptor {
+class AnimationEffectReadOnly extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimationEffectReadOnly._() {
     throw new UnsupportedError("Not supported");
@@ -785,7 +785,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AnimationEffectTimingReadOnly")
-class AnimationEffectTimingReadOnly extends Interceptor {
+class AnimationEffectTimingReadOnly extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimationEffectTimingReadOnly._() {
     throw new UnsupportedError("Not supported");
@@ -869,7 +869,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AnimationTimeline")
-class AnimationTimeline extends Interceptor {
+class AnimationTimeline extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimationTimeline._() {
     throw new UnsupportedError("Not supported");
@@ -1226,7 +1226,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AuthenticatorResponse")
-class AuthenticatorResponse extends Interceptor {
+class AuthenticatorResponse extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AuthenticatorResponse._() {
     throw new UnsupportedError("Not supported");
@@ -1329,7 +1329,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BackgroundFetchFetch")
-class BackgroundFetchFetch extends Interceptor {
+class BackgroundFetchFetch extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory BackgroundFetchFetch._() {
     throw new UnsupportedError("Not supported");
@@ -1342,7 +1342,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BackgroundFetchManager")
-class BackgroundFetchManager extends Interceptor {
+class BackgroundFetchManager extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory BackgroundFetchManager._() {
     throw new UnsupportedError("Not supported");
@@ -1449,7 +1449,7 @@
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#barprop
 @deprecated // standard
 @Native("BarProp")
-class BarProp extends Interceptor {
+class BarProp extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory BarProp._() {
     throw new UnsupportedError("Not supported");
@@ -1462,7 +1462,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BarcodeDetector")
-class BarcodeDetector extends Interceptor {
+class BarcodeDetector extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory BarcodeDetector._() {
     throw new UnsupportedError("Not supported");
@@ -1582,7 +1582,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Blob")
-class Blob extends Interceptor {
+class Blob extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Blob._() {
     throw new UnsupportedError("Not supported");
@@ -1649,7 +1649,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BluetoothRemoteGATTDescriptor")
-class BluetoothRemoteGattDescriptor extends Interceptor {
+class BluetoothRemoteGattDescriptor extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory BluetoothRemoteGattDescriptor._() {
     throw new UnsupportedError("Not supported");
@@ -1671,7 +1671,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Body")
-class Body extends Interceptor {
+class Body extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Body._() {
     throw new UnsupportedError("Not supported");
@@ -1896,7 +1896,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BudgetState")
-class BudgetState extends Interceptor {
+class BudgetState extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory BudgetState._() {
     throw new UnsupportedError("Not supported");
@@ -2006,7 +2006,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CacheStorage")
-class CacheStorage extends Interceptor {
+class CacheStorage extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CacheStorage._() {
     throw new UnsupportedError("Not supported");
@@ -2299,7 +2299,7 @@
  * * [CanvasGradient](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvasgradient) from W3C.
  */
 @Native("CanvasGradient")
-class CanvasGradient extends Interceptor {
+class CanvasGradient extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CanvasGradient._() {
     throw new UnsupportedError("Not supported");
@@ -2350,7 +2350,7 @@
  * * [CanvasPattern](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvaspattern) from W3C.
  */
 @Native("CanvasPattern")
-class CanvasPattern extends Interceptor {
+class CanvasPattern extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CanvasPattern._() {
     throw new UnsupportedError("Not supported");
@@ -2367,7 +2367,7 @@
 }
 
 @Native("CanvasRenderingContext2D")
-class CanvasRenderingContext2D extends Interceptor
+class CanvasRenderingContext2D extends JavaScriptObject
     implements CanvasRenderingContext {
   // To suppress missing implicit constructor warnings.
   factory CanvasRenderingContext2D._() {
@@ -3017,7 +3017,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class ChildNode extends Interceptor {
+abstract class ChildNode extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ChildNode._() {
     throw new UnsupportedError("Not supported");
@@ -3034,7 +3034,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Client")
-class Client extends Interceptor {
+class Client extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Client._() {
     throw new UnsupportedError("Not supported");
@@ -3055,7 +3055,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Clients")
-class Clients extends Interceptor {
+class Clients extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Clients._() {
     throw new UnsupportedError("Not supported");
@@ -3232,7 +3232,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CookieStore")
-class CookieStore extends Interceptor {
+class CookieStore extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CookieStore._() {
     throw new UnsupportedError("Not supported");
@@ -3260,7 +3260,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Coordinates")
-class Coordinates extends Interceptor {
+class Coordinates extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Coordinates._() {
     throw new UnsupportedError("Not supported");
@@ -3285,7 +3285,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Credential")
-class Credential extends Interceptor {
+class Credential extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Credential._() {
     throw new UnsupportedError("Not supported");
@@ -3300,7 +3300,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CredentialUserData")
-class CredentialUserData extends Interceptor {
+class CredentialUserData extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CredentialUserData._() {
     throw new UnsupportedError("Not supported");
@@ -3316,7 +3316,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CredentialsContainer")
-class CredentialsContainer extends Interceptor {
+class CredentialsContainer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CredentialsContainer._() {
     throw new UnsupportedError("Not supported");
@@ -3356,7 +3356,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Native("Crypto")
-class Crypto extends Interceptor {
+class Crypto extends JavaScriptObject {
   TypedData getRandomValues(TypedData array) {
     return _getRandomValues(array);
   }
@@ -3382,7 +3382,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CryptoKey")
-class CryptoKey extends Interceptor {
+class CryptoKey extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CryptoKey._() {
     throw new UnsupportedError("Not supported");
@@ -3402,7 +3402,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CSS")
-class Css extends Interceptor {
+class Css extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Css._() {
     throw new UnsupportedError("Not supported");
@@ -3850,7 +3850,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CSSRule")
-class CssRule extends Interceptor {
+class CssRule extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CssRule._() {
     throw new UnsupportedError("Not supported");
@@ -3960,7 +3960,8 @@
 //   CSSPropertyNames.in
 
 @Native("CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties")
-class CssStyleDeclaration extends Interceptor with CssStyleDeclarationBase {
+class CssStyleDeclaration extends JavaScriptObject
+    with CssStyleDeclarationBase {
   factory CssStyleDeclaration() => new CssStyleDeclaration.css('');
 
   factory CssStyleDeclaration.css(String css) {
@@ -7060,6 +7061,14 @@
     setProperty('font-weight', value, '');
   }
 
+  /** Gets the value of "gap" */
+  String get gap => getPropertyValue('gap');
+
+  /** Sets the value of "gap" */
+  set gap(String value) {
+    setProperty('gap', value, '');
+  }
+
   /** Gets the value of "grid" */
   String get grid => getPropertyValue('grid');
 
@@ -7996,6 +8005,14 @@
     setProperty('right', value, '');
   }
 
+  /** Gets the value of "row-gap" */
+  String get rowGap => getPropertyValue('row-gap');
+
+  /** Sets the value of "row-gap" */
+  set rowGap(String value) {
+    setProperty('row-gap', value, '');
+  }
+
   /** Gets the value of "rtl-ordering" */
   String get rtlOrdering => getPropertyValue('rtl-ordering');
 
@@ -8725,7 +8742,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CSSStyleValue")
-class CssStyleValue extends Interceptor {
+class CssStyleValue extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CssStyleValue._() {
     throw new UnsupportedError("Not supported");
@@ -8749,7 +8766,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CSSTransformComponent")
-class CssTransformComponent extends Interceptor {
+class CssTransformComponent extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CssTransformComponent._() {
     throw new UnsupportedError("Not supported");
@@ -8880,7 +8897,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CSSVariableReferenceValue")
-class CssVariableReferenceValue extends Interceptor {
+class CssVariableReferenceValue extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CssVariableReferenceValue._() {
     throw new UnsupportedError("Not supported");
@@ -8936,7 +8953,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CustomElementRegistry")
-class CustomElementRegistry extends Interceptor {
+class CustomElementRegistry extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CustomElementRegistry._() {
     throw new UnsupportedError("Not supported");
@@ -9104,7 +9121,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DataTransfer")
-class DataTransfer extends Interceptor {
+class DataTransfer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DataTransfer._() {
     throw new UnsupportedError("Not supported");
@@ -9144,16 +9161,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DataTransferItem")
-class DataTransferItem extends Interceptor {
+class DataTransferItem extends JavaScriptObject {
   Entry getAsEntry() {
     Entry entry = _webkitGetAsEntry() as Entry;
 
-    if (entry.isFile!)
+    if (entry.isFile!) {
       applyExtension('FileEntry', entry);
-    else if (entry.isDirectory!)
+      applyExtension('webkitFileSystemFileEntry', entry);
+      applyExtension('FileSystemFileEntry', entry);
+    } else if (entry.isDirectory!) {
       applyExtension('DirectoryEntry', entry);
-    else
+      applyExtension('webkitFileSystemDirectoryEntry', entry);
+      applyExtension('FileSystemDirectoryEntry', entry);
+    } else {
       applyExtension('Entry', entry);
+      applyExtension('webkitFileSystemEntry', entry);
+      applyExtension('FileSystemEntry', entry);
+    }
 
     return entry;
   }
@@ -9179,7 +9203,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DataTransferItemList")
-class DataTransferItemList extends Interceptor {
+class DataTransferItemList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DataTransferItemList._() {
     throw new UnsupportedError("Not supported");
@@ -9298,7 +9322,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DeprecatedStorageInfo")
-class DeprecatedStorageInfo extends Interceptor {
+class DeprecatedStorageInfo extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DeprecatedStorageInfo._() {
     throw new UnsupportedError("Not supported");
@@ -9321,7 +9345,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DeprecatedStorageQuota")
-class DeprecatedStorageQuota extends Interceptor {
+class DeprecatedStorageQuota extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DeprecatedStorageQuota._() {
     throw new UnsupportedError("Not supported");
@@ -9385,7 +9409,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DetectedBarcode")
-class DetectedBarcode extends Interceptor {
+class DetectedBarcode extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DetectedBarcode._() {
     throw new UnsupportedError("Not supported");
@@ -9408,7 +9432,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DetectedFace")
-class DetectedFace extends Interceptor {
+class DetectedFace extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DetectedFace._() {
     throw new UnsupportedError("Not supported");
@@ -9428,7 +9452,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DetectedText")
-class DetectedText extends Interceptor {
+class DetectedText extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DetectedText._() {
     throw new UnsupportedError("Not supported");
@@ -9450,7 +9474,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DeviceAcceleration")
-class DeviceAcceleration extends Interceptor {
+class DeviceAcceleration extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DeviceAcceleration._() {
     throw new UnsupportedError("Not supported");
@@ -9532,7 +9556,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DeviceRotationRate")
-class DeviceRotationRate extends Interceptor {
+class DeviceRotationRate extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DeviceRotationRate._() {
     throw new UnsupportedError("Not supported");
@@ -9580,7 +9604,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.
 
-@Native("DirectoryEntry")
+@Native(
+    "DirectoryEntry,webkitFileSystemDirectoryEntry,FileSystemDirectoryEntry")
 class DirectoryEntry extends Entry {
   /**
    * Create a new directory with the specified `path`. If `exclusive` is true,
@@ -9595,6 +9620,9 @@
   DirectoryReader createReader() {
     DirectoryReader reader = _createReader();
     applyExtension('DirectoryReader', reader);
+    applyExtension('WebKitDirectoryReader', reader);
+    applyExtension('webkitFileSystemDirectoryReader', reader);
+    applyExtension('FileSystemDirectoryReader', reader);
     return reader;
   }
 
@@ -9715,6 +9743,8 @@
     var completer = new Completer<Entry>();
     __getFile(path, options, (value) {
       applyExtension('FileEntry', value);
+      applyExtension('webkitFileSystemFileEntry', value);
+      applyExtension('FileSystemFileEntry', value);
       completer.complete(value);
     }, (error) {
       completer.completeError(error);
@@ -9741,8 +9771,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.
 
-@Native("DirectoryReader")
-class DirectoryReader extends Interceptor {
+@Native(
+    "DirectoryReader,WebKitDirectoryReader,webkitFileSystemDirectoryReader,FileSystemDirectoryReader")
+class DirectoryReader extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DirectoryReader._() {
     throw new UnsupportedError("Not supported");
@@ -9757,10 +9788,18 @@
     _readEntries((values) {
       values.forEach((value) {
         applyExtension('Entry', value);
+        applyExtension('webkitFileSystemEntry', value);
+        applyExtension('FileSystemEntry', value);
         Entry entry = value as Entry;
-        if (entry.isFile!)
+        if (entry.isFile!) {
           applyExtension('FileEntry', entry);
-        else if (entry.isDirectory!) applyExtension('DirectoryEntry', entry);
+          applyExtension('webkitFileSystemFileEntry', entry);
+          applyExtension('FileSystemFileEntry', entry);
+        } else if (entry.isDirectory!) {
+          applyExtension('DirectoryEntry', entry);
+          applyExtension('webkitFileSystemDirectoryEntry', entry);
+          applyExtension('FileSystemDirectoryEntry', entry);
+        }
       });
       completer.complete(new List<Entry>.from(values));
     }, (error) {
@@ -10584,7 +10623,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DocumentOrShadowRoot")
-class DocumentOrShadowRoot extends Interceptor {
+class DocumentOrShadowRoot extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DocumentOrShadowRoot._() {
     throw new UnsupportedError("Not supported");
@@ -10634,7 +10673,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMError")
-class DomError extends Interceptor {
+class DomError extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomError._() {
     throw new UnsupportedError("Not supported");
@@ -10660,7 +10699,7 @@
 
 @Unstable()
 @Native("DOMException")
-class DomException extends Interceptor {
+class DomException extends JavaScriptObject {
   static const String INDEX_SIZE = 'IndexSizeError';
   static const String HIERARCHY_REQUEST = 'HierarchyRequestError';
   static const String WRONG_DOCUMENT = 'WrongDocumentError';
@@ -10719,7 +10758,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMImplementation")
-class DomImplementation extends Interceptor {
+class DomImplementation extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomImplementation._() {
     throw new UnsupportedError("Not supported");
@@ -10741,7 +10780,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Iterator")
-class DomIterator extends Interceptor {
+class DomIterator extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomIterator._() {
     throw new UnsupportedError("Not supported");
@@ -10976,7 +11015,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMMatrixReadOnly")
-class DomMatrixReadOnly extends Interceptor {
+class DomMatrixReadOnly extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomMatrixReadOnly._() {
     throw new UnsupportedError("Not supported");
@@ -11122,7 +11161,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMParser")
-class DomParser extends Interceptor {
+class DomParser extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomParser._() {
     throw new UnsupportedError("Not supported");
@@ -11215,7 +11254,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMPointReadOnly")
-class DomPointReadOnly extends Interceptor {
+class DomPointReadOnly extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomPointReadOnly._() {
     throw new UnsupportedError("Not supported");
@@ -11286,7 +11325,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMQuad")
-class DomQuad extends Interceptor {
+class DomQuad extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomQuad._() {
     throw new UnsupportedError("Not supported");
@@ -11366,7 +11405,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ClientRectList,DOMRectList")
-class DomRectList extends Interceptor
+class DomRectList extends JavaScriptObject
     with ListMixin<Rectangle>, ImmutableListMixin<Rectangle>
     implements List<Rectangle>, JavaScriptIndexingBehavior<Rectangle> {
   // To suppress missing implicit constructor warnings.
@@ -11426,7 +11465,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMRectReadOnly")
-class DomRectReadOnly extends Interceptor implements Rectangle {
+class DomRectReadOnly extends JavaScriptObject implements Rectangle {
   // NOTE! All code below should be common with RectangleBase.
   String toString() {
     return 'Rectangle ($left, $top) $width x $height';
@@ -11616,7 +11655,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMStringList")
-class DomStringList extends Interceptor
+class DomStringList extends JavaScriptObject
     with ListMixin<String>, ImmutableListMixin<String>
     implements List<String>, JavaScriptIndexingBehavior<String> {
   // To suppress missing implicit constructor warnings.
@@ -11676,7 +11715,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMStringMap")
-class DomStringMap extends Interceptor {
+class DomStringMap extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomStringMap._() {
     throw new UnsupportedError("Not supported");
@@ -11693,7 +11732,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DOMTokenList")
-class DomTokenList extends Interceptor {
+class DomTokenList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DomTokenList._() {
     throw new UnsupportedError("Not supported");
@@ -13099,13 +13138,9 @@
   /**
    * Allows access to all custom data attributes (data-*) set on this element.
    *
-   * The keys for the map must follow these rules:
-   *
-   * * The name must not begin with 'xml'.
-   * * The name cannot contain a semi-colon (';').
-   * * The name cannot contain any capital letters.
-   *
-   * Any keys from markup will be converted to camel-cased keys in the map.
+   * Any data attributes in the markup will be converted to camel-cased keys
+   * in the map based on [these conversion
+   * rules](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset).
    *
    * For example, HTML specified as:
    *
@@ -13117,6 +13152,8 @@
    *
    * See also:
    *
+   * * [HTML data-* attributes naming
+       restrictions](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*)
    * * [Custom data
    *   attributes](http://dev.w3.org/html5/spec-preview/global-attributes.html#custom-data-attribute)
    */
@@ -15319,8 +15356,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.
 
-@Native("Entry")
-class Entry extends Interceptor {
+@Native("Entry,webkitFileSystemEntry,FileSystemEntry")
+class Entry extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Entry._() {
     throw new UnsupportedError("Not supported");
@@ -15378,6 +15415,8 @@
     var completer = new Completer<Entry>();
     _getParent((value) {
       applyExtension('Entry', value);
+      applyExtension('webkitFileSystemEntry', value);
+      applyExtension('FileSystemEntry', value);
       completer.complete(value);
     }, (error) {
       completer.completeError(error);
@@ -15476,7 +15515,7 @@
 // WARNING: Do not edit - generated code.
 
 @Native("Event,InputEvent,SubmitEvent")
-class Event extends Interceptor {
+class Event extends JavaScriptObject {
   // In JS, canBubble and cancelable are technically required parameters to
   // init*Event. In practice, though, if they aren't provided they simply
   // default to false (since that's Boolean(undefined)).
@@ -15783,7 +15822,7 @@
  * for compile-time type checks and a more concise API.
  */
 @Native("EventTarget")
-class EventTarget extends Interceptor {
+class EventTarget extends JavaScriptObject {
   // Custom element created callback.
   EventTarget._created();
 
@@ -15883,7 +15922,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("External")
-class External extends Interceptor {
+class External extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory External._() {
     throw new UnsupportedError("Not supported");
@@ -15898,7 +15937,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("FaceDetector")
-class FaceDetector extends Interceptor {
+class FaceDetector extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory FaceDetector._() {
     throw new UnsupportedError("Not supported");
@@ -16078,7 +16117,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-@Native("FileEntry")
+@Native("FileEntry,webkitFileSystemFileEntry,FileSystemFileEntry")
 class FileEntry extends Entry {
   // To suppress missing implicit constructor warnings.
   factory FileEntry._() {
@@ -16122,7 +16161,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("FileList")
-class FileList extends Interceptor
+class FileList extends JavaScriptObject
     with ListMixin<File>, ImmutableListMixin<File>
     implements List<File>, JavaScriptIndexingBehavior<File> {
   // To suppress missing implicit constructor warnings.
@@ -16297,8 +16336,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @SupportedBrowser(SupportedBrowser.CHROME)
-@Native("DOMFileSystem")
-class FileSystem extends Interceptor {
+@Native("DOMFileSystem,WebKitFileSystem,webkitFileSystem,FileSystem")
+class FileSystem extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory FileSystem._() {
     throw new UnsupportedError("Not supported");
@@ -16464,7 +16503,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("FontFace")
-class FontFace extends Interceptor {
+class FontFace extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory FontFace._() {
     throw new UnsupportedError("Not supported");
@@ -16597,7 +16636,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("FontFaceSource")
-class FontFaceSource extends Interceptor {
+class FontFaceSource extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory FontFaceSource._() {
     throw new UnsupportedError("Not supported");
@@ -16638,7 +16677,7 @@
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Native("FormData")
-class FormData extends Interceptor {
+class FormData extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory FormData._() {
     throw new UnsupportedError("Not supported");
@@ -16772,7 +16811,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Gamepad")
-class Gamepad extends Interceptor {
+class Gamepad extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Gamepad._() {
     throw new UnsupportedError("Not supported");
@@ -16805,7 +16844,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("GamepadButton")
-class GamepadButton extends Interceptor {
+class GamepadButton extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory GamepadButton._() {
     throw new UnsupportedError("Not supported");
@@ -16847,7 +16886,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("GamepadPose")
-class GamepadPose extends Interceptor {
+class GamepadPose extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory GamepadPose._() {
     throw new UnsupportedError("Not supported");
@@ -16875,7 +16914,7 @@
 
 @Unstable()
 @Native("Geolocation")
-class Geolocation extends Interceptor {
+class Geolocation extends JavaScriptObject {
   Future<Geoposition> getCurrentPosition(
       {bool? enableHighAccuracy, Duration? timeout, Duration? maximumAge}) {
     var options = {};
@@ -17037,7 +17076,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Position,GeolocationPosition")
-class Geoposition extends Interceptor {
+class Geoposition extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Geoposition._() {
     throw new UnsupportedError("Not supported");
@@ -17488,7 +17527,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Headers")
-class Headers extends Interceptor {
+class Headers extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Headers._() {
     throw new UnsupportedError("Not supported");
@@ -17561,7 +17600,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("History")
-class History extends Interceptor implements HistoryBase {
+class History extends JavaScriptObject implements HistoryBase {
   /**
    * Checks if the State APIs are supported on the current platform.
    *
@@ -17635,7 +17674,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("HTMLCollection")
-class HtmlCollection extends Interceptor
+class HtmlCollection extends JavaScriptObject
     with ListMixin<Node>, ImmutableListMixin<Node>
     implements List<Node>, JavaScriptIndexingBehavior<Node> {
   // To suppress missing implicit constructor warnings.
@@ -17893,7 +17932,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("HTMLHyperlinkElementUtils")
-class HtmlHyperlinkElementUtils extends Interceptor {
+class HtmlHyperlinkElementUtils extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory HtmlHyperlinkElementUtils._() {
     throw new UnsupportedError("Not supported");
@@ -18817,7 +18856,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("IdleDeadline")
-class IdleDeadline extends Interceptor {
+class IdleDeadline extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory IdleDeadline._() {
     throw new UnsupportedError("Not supported");
@@ -18839,7 +18878,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ImageBitmap")
-class ImageBitmap extends Interceptor {
+class ImageBitmap extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ImageBitmap._() {
     throw new UnsupportedError("Not supported");
@@ -18856,7 +18895,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ImageBitmapRenderingContext")
-class ImageBitmapRenderingContext extends Interceptor {
+class ImageBitmapRenderingContext extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ImageBitmapRenderingContext._() {
     throw new UnsupportedError("Not supported");
@@ -18871,7 +18910,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ImageCapture")
-class ImageCapture extends Interceptor {
+class ImageCapture extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ImageCapture._() {
     throw new UnsupportedError("Not supported");
@@ -18914,7 +18953,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ImageData")
-class ImageData extends Interceptor {
+class ImageData extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ImageData._() {
     throw new UnsupportedError("Not supported");
@@ -19035,7 +19074,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("InputDeviceCapabilities")
-class InputDeviceCapabilities extends Interceptor {
+class InputDeviceCapabilities extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory InputDeviceCapabilities._() {
     throw new UnsupportedError("Not supported");
@@ -19891,7 +19930,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("IntersectionObserver")
-class IntersectionObserver extends Interceptor {
+class IntersectionObserver extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory IntersectionObserver._() {
     throw new UnsupportedError("Not supported");
@@ -19942,7 +19981,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("IntersectionObserverEntry")
-class IntersectionObserverEntry extends Interceptor {
+class IntersectionObserverEntry extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory IntersectionObserverEntry._() {
     throw new UnsupportedError("Not supported");
@@ -20358,7 +20397,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Location")
-class Location extends Interceptor implements LocationBase {
+class Location extends JavaScriptObject implements LocationBase {
   // To suppress missing implicit constructor warnings.
   factory Location._() {
     throw new UnsupportedError("Not supported");
@@ -20483,7 +20522,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaCapabilities")
-class MediaCapabilities extends Interceptor {
+class MediaCapabilities extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaCapabilities._() {
     throw new UnsupportedError("Not supported");
@@ -20512,7 +20551,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaCapabilitiesInfo")
-class MediaCapabilitiesInfo extends Interceptor {
+class MediaCapabilitiesInfo extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaCapabilitiesInfo._() {
     throw new UnsupportedError("Not supported");
@@ -20529,7 +20568,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaDeviceInfo")
-class MediaDeviceInfo extends Interceptor {
+class MediaDeviceInfo extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaDeviceInfo._() {
     throw new UnsupportedError("Not supported");
@@ -20766,7 +20805,7 @@
 
 @Unstable()
 @Native("MediaError")
-class MediaError extends Interceptor {
+class MediaError extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaError._() {
     throw new UnsupportedError("Not supported");
@@ -20852,7 +20891,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaKeyStatusMap")
-class MediaKeyStatusMap extends Interceptor {
+class MediaKeyStatusMap extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaKeyStatusMap._() {
     throw new UnsupportedError("Not supported");
@@ -20869,7 +20908,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaKeySystemAccess")
-class MediaKeySystemAccess extends Interceptor {
+class MediaKeySystemAccess extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaKeySystemAccess._() {
     throw new UnsupportedError("Not supported");
@@ -20892,7 +20931,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaKeys")
-class MediaKeys extends Interceptor {
+class MediaKeys extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaKeys._() {
     throw new UnsupportedError("Not supported");
@@ -20913,7 +20952,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaKeysPolicy")
-class MediaKeysPolicy extends Interceptor {
+class MediaKeysPolicy extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaKeysPolicy._() {
     throw new UnsupportedError("Not supported");
@@ -20934,7 +20973,7 @@
 
 @Unstable()
 @Native("MediaList")
-class MediaList extends Interceptor {
+class MediaList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaList._() {
     throw new UnsupportedError("Not supported");
@@ -20957,7 +20996,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaMetadata")
-class MediaMetadata extends Interceptor {
+class MediaMetadata extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaMetadata._() {
     throw new UnsupportedError("Not supported");
@@ -21106,7 +21145,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaSession")
-class MediaSession extends Interceptor {
+class MediaSession extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaSession._() {
     throw new UnsupportedError("Not supported");
@@ -21135,7 +21174,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MediaSettingsRange")
-class MediaSettingsRange extends Interceptor {
+class MediaSettingsRange extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MediaSettingsRange._() {
     throw new UnsupportedError("Not supported");
@@ -21444,7 +21483,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MemoryInfo")
-class MemoryInfo extends Interceptor {
+class MemoryInfo extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MemoryInfo._() {
     throw new UnsupportedError("Not supported");
@@ -21502,7 +21541,7 @@
 
 @Unstable()
 @Native("MessageChannel")
-class MessageChannel extends Interceptor {
+class MessageChannel extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MessageChannel._() {
     throw new UnsupportedError("Not supported");
@@ -21715,7 +21754,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Metadata")
-class Metadata extends Interceptor {
+class Metadata extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Metadata._() {
     throw new UnsupportedError("Not supported");
@@ -21865,7 +21904,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MIDIInputMap")
-class MidiInputMap extends Interceptor with MapMixin<String, dynamic> {
+class MidiInputMap extends JavaScriptObject with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory MidiInputMap._() {
     throw new UnsupportedError("Not supported");
@@ -21971,7 +22010,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MIDIOutputMap")
-class MidiOutputMap extends Interceptor with MapMixin<String, dynamic> {
+class MidiOutputMap extends JavaScriptObject with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory MidiOutputMap._() {
     throw new UnsupportedError("Not supported");
@@ -22068,7 +22107,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MimeType")
-class MimeType extends Interceptor {
+class MimeType extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MimeType._() {
     throw new UnsupportedError("Not supported");
@@ -22087,7 +22126,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MimeTypeArray")
-class MimeTypeArray extends Interceptor
+class MimeTypeArray extends JavaScriptObject
     with ListMixin<MimeType>, ImmutableListMixin<MimeType>
     implements List<MimeType>, JavaScriptIndexingBehavior<MimeType> {
   // To suppress missing implicit constructor warnings.
@@ -22452,7 +22491,7 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Native("MutationObserver,WebKitMutationObserver")
-class MutationObserver extends Interceptor {
+class MutationObserver extends JavaScriptObject {
   void disconnect() native;
 
   void _observe(Node target, [Map? options]) {
@@ -22557,7 +22596,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MutationRecord")
-class MutationRecord extends Interceptor {
+class MutationRecord extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory MutationRecord._() {
     throw new UnsupportedError("Not supported");
@@ -22590,7 +22629,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NavigationPreloadManager")
-class NavigationPreloadManager extends Interceptor {
+class NavigationPreloadManager extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NavigationPreloadManager._() {
     throw new UnsupportedError("Not supported");
@@ -22863,7 +22902,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NavigatorAutomationInformation")
-class NavigatorAutomationInformation extends Interceptor {
+class NavigatorAutomationInformation extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NavigatorAutomationInformation._() {
     throw new UnsupportedError("Not supported");
@@ -22876,7 +22915,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NavigatorConcurrentHardware")
-class NavigatorConcurrentHardware extends Interceptor {
+class NavigatorConcurrentHardware extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NavigatorConcurrentHardware._() {
     throw new UnsupportedError("Not supported");
@@ -22889,7 +22928,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NavigatorCookies")
-class NavigatorCookies extends Interceptor {
+class NavigatorCookies extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NavigatorCookies._() {
     throw new UnsupportedError("Not supported");
@@ -22901,7 +22940,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class NavigatorID extends Interceptor {
+abstract class NavigatorID extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NavigatorID._() {
     throw new UnsupportedError("Not supported");
@@ -22925,7 +22964,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class NavigatorLanguage extends Interceptor {
+abstract class NavigatorLanguage extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NavigatorLanguage._() {
     throw new UnsupportedError("Not supported");
@@ -22939,7 +22978,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class NavigatorOnLine extends Interceptor {
+abstract class NavigatorOnLine extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NavigatorOnLine._() {
     throw new UnsupportedError("Not supported");
@@ -22952,7 +22991,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NavigatorUserMediaError")
-class NavigatorUserMediaError extends Interceptor {
+class NavigatorUserMediaError extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NavigatorUserMediaError._() {
     throw new UnsupportedError("Not supported");
@@ -23223,13 +23262,13 @@
   }
 
   /**
-   * Inserts all of the nodes into this node directly before refChild.
+   * Inserts all of the nodes into this node directly before child.
    *
    * See also:
    *
    * * [insertBefore]
    */
-  void insertAllBefore(Iterable<Node> newNodes, Node refChild) {
+  void insertAllBefore(Iterable<Node> newNodes, Node child) {
     if (newNodes is _ChildNodeListLazy) {
       _ChildNodeListLazy otherList = newNodes;
       if (identical(otherList._this, this)) {
@@ -23238,11 +23277,11 @@
 
       // Optimized route for copying between nodes.
       for (var i = 0, len = otherList.length; i < len; ++i) {
-        this.insertBefore(otherList._this.firstChild!, refChild);
+        this.insertBefore(otherList._this.firstChild!, child);
       }
     } else {
       for (var node in newNodes) {
-        this.insertBefore(node, refChild);
+        this.insertBefore(node, child);
       }
     }
   }
@@ -23525,7 +23564,9 @@
   bool hasChildNodes() native;
 
   /**
-   * Inserts all of the nodes into this node directly before refChild.
+   * Inserts the given node into this node directly before child.
+   * If child is `null`, then the given node is inserted at the end
+   * of this node's child nodes.
    *
    * ## Other resources
    *
@@ -23546,7 +23587,7 @@
 
 @Unstable()
 @Native("NodeFilter")
-class NodeFilter extends Interceptor {
+class NodeFilter extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NodeFilter._() {
     throw new UnsupportedError("Not supported");
@@ -23580,7 +23621,7 @@
 
 @Unstable()
 @Native("NodeIterator")
-class NodeIterator extends Interceptor {
+class NodeIterator extends JavaScriptObject {
   factory NodeIterator(Node root, int whatToShow) {
     return document._createNodeIterator(root, whatToShow, null);
   }
@@ -23608,7 +23649,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NodeList,RadioNodeList")
-class NodeList extends Interceptor
+class NodeList extends JavaScriptObject
     with ListMixin<Node>, ImmutableListMixin<Node>
     implements List<Node>, JavaScriptIndexingBehavior<Node> {
   // To suppress missing implicit constructor warnings.
@@ -23669,7 +23710,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NonDocumentTypeChildNode")
-class NonDocumentTypeChildNode extends Interceptor {
+class NonDocumentTypeChildNode extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NonDocumentTypeChildNode._() {
     throw new UnsupportedError("Not supported");
@@ -23684,7 +23725,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NonElementParentNode")
-class NonElementParentNode extends Interceptor {
+class NonElementParentNode extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NonElementParentNode._() {
     throw new UnsupportedError("Not supported");
@@ -23697,7 +23738,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NoncedElement")
-class NoncedElement extends Interceptor {
+class NoncedElement extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory NoncedElement._() {
     throw new UnsupportedError("Not supported");
@@ -24038,7 +24079,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OffscreenCanvasRenderingContext2D")
-class OffscreenCanvasRenderingContext2D extends Interceptor
+class OffscreenCanvasRenderingContext2D extends JavaScriptObject
     implements _CanvasPath {
   // To suppress missing implicit constructor warnings.
   factory OffscreenCanvasRenderingContext2D._() {
@@ -24482,7 +24523,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OverconstrainedError")
-class OverconstrainedError extends Interceptor {
+class OverconstrainedError extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory OverconstrainedError._() {
     throw new UnsupportedError("Not supported");
@@ -24536,7 +24577,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PaintRenderingContext2D")
-class PaintRenderingContext2D extends Interceptor implements _CanvasPath {
+class PaintRenderingContext2D extends JavaScriptObject implements _CanvasPath {
   // To suppress missing implicit constructor warnings.
   factory PaintRenderingContext2D._() {
     throw new UnsupportedError("Not supported");
@@ -24693,7 +24734,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PaintSize")
-class PaintSize extends Interceptor {
+class PaintSize extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PaintSize._() {
     throw new UnsupportedError("Not supported");
@@ -24777,7 +24818,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class ParentNode extends Interceptor {
+abstract class ParentNode extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ParentNode._() {
     throw new UnsupportedError("Not supported");
@@ -24847,7 +24888,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Path2D")
-class Path2D extends Interceptor implements _CanvasPath {
+class Path2D extends JavaScriptObject implements _CanvasPath {
   // To suppress missing implicit constructor warnings.
   factory Path2D._() {
     throw new UnsupportedError("Not supported");
@@ -24901,7 +24942,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PaymentAddress")
-class PaymentAddress extends Interceptor {
+class PaymentAddress extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PaymentAddress._() {
     throw new UnsupportedError("Not supported");
@@ -24934,7 +24975,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PaymentInstruments")
-class PaymentInstruments extends Interceptor {
+class PaymentInstruments extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PaymentInstruments._() {
     throw new UnsupportedError("Not supported");
@@ -24965,7 +25006,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PaymentManager")
-class PaymentManager extends Interceptor {
+class PaymentManager extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PaymentManager._() {
     throw new UnsupportedError("Not supported");
@@ -25101,7 +25142,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PaymentResponse")
-class PaymentResponse extends Interceptor {
+class PaymentResponse extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PaymentResponse._() {
     throw new UnsupportedError("Not supported");
@@ -25177,7 +25218,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PerformanceEntry")
-class PerformanceEntry extends Interceptor {
+class PerformanceEntry extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PerformanceEntry._() {
     throw new UnsupportedError("Not supported");
@@ -25232,7 +25273,7 @@
 
 @Unstable()
 @Native("PerformanceNavigation")
-class PerformanceNavigation extends Interceptor {
+class PerformanceNavigation extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PerformanceNavigation._() {
     throw new UnsupportedError("Not supported");
@@ -25286,7 +25327,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PerformanceObserver")
-class PerformanceObserver extends Interceptor {
+class PerformanceObserver extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PerformanceObserver._() {
     throw new UnsupportedError("Not supported");
@@ -25323,7 +25364,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PerformanceObserverEntryList")
-class PerformanceObserverEntryList extends Interceptor {
+class PerformanceObserverEntryList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PerformanceObserverEntryList._() {
     throw new UnsupportedError("Not supported");
@@ -25399,7 +25440,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PerformanceServerTiming")
-class PerformanceServerTiming extends Interceptor {
+class PerformanceServerTiming extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PerformanceServerTiming._() {
     throw new UnsupportedError("Not supported");
@@ -25417,7 +25458,7 @@
 
 @Unstable()
 @Native("PerformanceTiming")
-class PerformanceTiming extends Interceptor {
+class PerformanceTiming extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PerformanceTiming._() {
     throw new UnsupportedError("Not supported");
@@ -25488,7 +25529,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Permissions")
-class Permissions extends Interceptor {
+class Permissions extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Permissions._() {
     throw new UnsupportedError("Not supported");
@@ -25521,7 +25562,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PhotoCapabilities")
-class PhotoCapabilities extends Interceptor {
+class PhotoCapabilities extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PhotoCapabilities._() {
     throw new UnsupportedError("Not supported");
@@ -25557,7 +25598,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Plugin")
-class Plugin extends Interceptor {
+class Plugin extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Plugin._() {
     throw new UnsupportedError("Not supported");
@@ -25580,7 +25621,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PluginArray")
-class PluginArray extends Interceptor
+class PluginArray extends JavaScriptObject
     with ListMixin<Plugin>, ImmutableListMixin<Plugin>
     implements List<Plugin>, JavaScriptIndexingBehavior<Plugin> {
   // To suppress missing implicit constructor warnings.
@@ -25745,7 +25786,7 @@
 
 @Unstable()
 @Native("PositionError,GeolocationPositionError")
-class PositionError extends Interceptor {
+class PositionError extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PositionError._() {
     throw new UnsupportedError("Not supported");
@@ -25797,7 +25838,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Presentation")
-class Presentation extends Interceptor {
+class Presentation extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Presentation._() {
     throw new UnsupportedError("Not supported");
@@ -25924,7 +25965,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PresentationReceiver")
-class PresentationReceiver extends Interceptor {
+class PresentationReceiver extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PresentationReceiver._() {
     throw new UnsupportedError("Not supported");
@@ -26128,7 +26169,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PushManager")
-class PushManager extends Interceptor {
+class PushManager extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PushManager._() {
     throw new UnsupportedError("Not supported");
@@ -26162,7 +26203,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PushMessageData")
-class PushMessageData extends Interceptor {
+class PushMessageData extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PushMessageData._() {
     throw new UnsupportedError("Not supported");
@@ -26181,7 +26222,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PushSubscription")
-class PushSubscription extends Interceptor {
+class PushSubscription extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PushSubscription._() {
     throw new UnsupportedError("Not supported");
@@ -26203,7 +26244,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PushSubscriptionOptions")
-class PushSubscriptionOptions extends Interceptor {
+class PushSubscriptionOptions extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PushSubscriptionOptions._() {
     throw new UnsupportedError("Not supported");
@@ -26269,7 +26310,7 @@
 
 @Unstable()
 @Native("Range")
-class Range extends Interceptor {
+class Range extends JavaScriptObject {
   factory Range() => document.createRange();
 
   factory Range.fromPoint(Point point) =>
@@ -26377,7 +26418,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("RelatedApplication")
-class RelatedApplication extends Interceptor {
+class RelatedApplication extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory RelatedApplication._() {
     throw new UnsupportedError("Not supported");
@@ -26447,7 +26488,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ReportBody")
-class ReportBody extends Interceptor {
+class ReportBody extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ReportBody._() {
     throw new UnsupportedError("Not supported");
@@ -26458,7 +26499,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ReportingObserver")
-class ReportingObserver extends Interceptor {
+class ReportingObserver extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ReportingObserver._() {
     throw new UnsupportedError("Not supported");
@@ -26495,7 +26536,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ResizeObserver")
-class ResizeObserver extends Interceptor {
+class ResizeObserver extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ResizeObserver._() {
     throw new UnsupportedError("Not supported");
@@ -26526,7 +26567,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ResizeObserverEntry")
-class ResizeObserverEntry extends Interceptor {
+class ResizeObserverEntry extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ResizeObserverEntry._() {
     throw new UnsupportedError("Not supported");
@@ -26541,7 +26582,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("RTCCertificate")
-class RtcCertificate extends Interceptor {
+class RtcCertificate extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory RtcCertificate._() {
     throw new UnsupportedError("Not supported");
@@ -26744,7 +26785,7 @@
 
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Native("RTCIceCandidate,mozRTCIceCandidate")
-class RtcIceCandidate extends Interceptor {
+class RtcIceCandidate extends JavaScriptObject {
   factory RtcIceCandidate(Map dictionary) {
     var constructorName = JS('', 'window[#]', 'RTCIceCandidate');
     return JS('RtcIceCandidate', 'new #(#)', constructorName,
@@ -26772,7 +26813,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("RTCLegacyStatsReport")
-class RtcLegacyStatsReport extends Interceptor {
+class RtcLegacyStatsReport extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory RtcLegacyStatsReport._() {
     throw new UnsupportedError("Not supported");
@@ -27106,7 +27147,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("RTCRtpContributingSource")
-class RtcRtpContributingSource extends Interceptor {
+class RtcRtpContributingSource extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory RtcRtpContributingSource._() {
     throw new UnsupportedError("Not supported");
@@ -27121,7 +27162,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("RTCRtpReceiver")
-class RtcRtpReceiver extends Interceptor {
+class RtcRtpReceiver extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory RtcRtpReceiver._() {
     throw new UnsupportedError("Not supported");
@@ -27136,7 +27177,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("RTCRtpSender")
-class RtcRtpSender extends Interceptor {
+class RtcRtpSender extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory RtcRtpSender._() {
     throw new UnsupportedError("Not supported");
@@ -27150,7 +27191,7 @@
 
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Native("RTCSessionDescription,mozRTCSessionDescription")
-class RtcSessionDescription extends Interceptor {
+class RtcSessionDescription extends JavaScriptObject {
   factory RtcSessionDescription(Map dictionary) {
     var constructorName = JS('', 'window[#]', 'RTCSessionDescription');
     return JS('RtcSessionDescription', 'new #(#)', constructorName,
@@ -27174,7 +27215,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("RTCStatsReport")
-class RtcStatsReport extends Interceptor with MapMixin<String, dynamic> {
+class RtcStatsReport extends JavaScriptObject with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory RtcStatsReport._() {
     throw new UnsupportedError("Not supported");
@@ -27242,7 +27283,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("RTCStatsResponse")
-class RtcStatsResponse extends Interceptor {
+class RtcStatsResponse extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory RtcStatsResponse._() {
     throw new UnsupportedError("Not supported");
@@ -27281,7 +27322,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Screen")
-class Screen extends Interceptor {
+class Screen extends JavaScriptObject {
   Rectangle get available =>
       new Rectangle(_availLeft!, _availTop!, _availWidth!, _availHeight!);
   // To suppress missing implicit constructor warnings.
@@ -27400,7 +27441,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ScrollState")
-class ScrollState extends Interceptor {
+class ScrollState extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ScrollState._() {
     throw new UnsupportedError("Not supported");
@@ -27645,7 +27686,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Selection")
-class Selection extends Interceptor {
+class Selection extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Selection._() {
     throw new UnsupportedError("Not supported");
@@ -28050,7 +28091,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SharedArrayBuffer")
-class SharedArrayBuffer extends Interceptor {
+class SharedArrayBuffer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SharedArrayBuffer._() {
     throw new UnsupportedError("Not supported");
@@ -28370,7 +28411,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SpeechGrammar")
-class SpeechGrammar extends Interceptor {
+class SpeechGrammar extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SpeechGrammar._() {
     throw new UnsupportedError("Not supported");
@@ -28395,7 +28436,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SpeechGrammarList")
-class SpeechGrammarList extends Interceptor
+class SpeechGrammarList extends JavaScriptObject
     with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar>
     implements List<SpeechGrammar>, JavaScriptIndexingBehavior<SpeechGrammar> {
   // To suppress missing implicit constructor warnings.
@@ -28649,7 +28690,7 @@
 
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Native("SpeechRecognitionAlternative")
-class SpeechRecognitionAlternative extends Interceptor {
+class SpeechRecognitionAlternative extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionAlternative._() {
     throw new UnsupportedError("Not supported");
@@ -28733,7 +28774,7 @@
 
 @SupportedBrowser(SupportedBrowser.CHROME, '25')
 @Native("SpeechRecognitionResult")
-class SpeechRecognitionResult extends Interceptor {
+class SpeechRecognitionResult extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionResult._() {
     throw new UnsupportedError("Not supported");
@@ -28933,7 +28974,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SpeechSynthesisVoice")
-class SpeechSynthesisVoice extends Interceptor {
+class SpeechSynthesisVoice extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisVoice._() {
     throw new UnsupportedError("Not supported");
@@ -28956,7 +28997,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("StaticRange")
-class StaticRange extends Interceptor {
+class StaticRange extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory StaticRange._() {
     throw new UnsupportedError("Not supported");
@@ -28998,7 +29039,7 @@
  */
 @Unstable()
 @Native("Storage")
-class Storage extends Interceptor with MapMixin<String, String> {
+class Storage extends JavaScriptObject with MapMixin<String, String> {
   void addAll(Map<String, String> other) {
     other.forEach((k, v) {
       this[k] = v;
@@ -29146,7 +29187,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("StorageManager")
-class StorageManager extends Interceptor {
+class StorageManager extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory StorageManager._() {
     throw new UnsupportedError("Not supported");
@@ -29217,7 +29258,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("StyleMedia")
-class StyleMedia extends Interceptor {
+class StyleMedia extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory StyleMedia._() {
     throw new UnsupportedError("Not supported");
@@ -29249,7 +29290,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("StylePropertyMapReadonly")
-class StylePropertyMapReadonly extends Interceptor {
+class StylePropertyMapReadonly extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory StylePropertyMapReadonly._() {
     throw new UnsupportedError("Not supported");
@@ -29268,7 +29309,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("StyleSheet")
-class StyleSheet extends Interceptor {
+class StyleSheet extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory StyleSheet._() {
     throw new UnsupportedError("Not supported");
@@ -29317,7 +29358,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SyncManager")
-class SyncManager extends Interceptor {
+class SyncManager extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SyncManager._() {
     throw new UnsupportedError("Not supported");
@@ -29867,7 +29908,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TextDetector")
-class TextDetector extends Interceptor {
+class TextDetector extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TextDetector._() {
     throw new UnsupportedError("Not supported");
@@ -29918,7 +29959,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TextMetrics")
-class TextMetrics extends Interceptor {
+class TextMetrics extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TextMetrics._() {
     throw new UnsupportedError("Not supported");
@@ -30049,7 +30090,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TextTrackCueList")
-class TextTrackCueList extends Interceptor
+class TextTrackCueList extends JavaScriptObject
     with ListMixin<TextTrackCue>, ImmutableListMixin<TextTrackCue>
     implements List<TextTrackCue>, JavaScriptIndexingBehavior<TextTrackCue> {
   // To suppress missing implicit constructor warnings.
@@ -30212,7 +30253,7 @@
 
 @Unstable()
 @Native("TimeRanges")
-class TimeRanges extends Interceptor {
+class TimeRanges extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TimeRanges._() {
     throw new UnsupportedError("Not supported");
@@ -30259,7 +30300,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Touch")
-class Touch extends Interceptor {
+class Touch extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Touch._() {
     throw new UnsupportedError("Not supported");
@@ -30389,7 +30430,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TouchList")
-class TouchList extends Interceptor
+class TouchList extends JavaScriptObject
     with ListMixin<Touch>, ImmutableListMixin<Touch>
     implements List<Touch>, JavaScriptIndexingBehavior<Touch> {
   // To suppress missing implicit constructor warnings.
@@ -30452,7 +30493,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TrackDefault")
-class TrackDefault extends Interceptor {
+class TrackDefault extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TrackDefault._() {
     throw new UnsupportedError("Not supported");
@@ -30496,7 +30537,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TrackDefaultList")
-class TrackDefaultList extends Interceptor {
+class TrackDefaultList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TrackDefaultList._() {
     throw new UnsupportedError("Not supported");
@@ -30638,7 +30679,7 @@
 
 @Unstable()
 @Native("TreeWalker")
-class TreeWalker extends Interceptor {
+class TreeWalker extends JavaScriptObject {
   factory TreeWalker(Node root, int whatToShow) {
     return document._createTreeWalker(root, whatToShow, null);
   }
@@ -30676,7 +30717,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TrustedHTML")
-class TrustedHtml extends Interceptor {
+class TrustedHtml extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TrustedHtml._() {
     throw new UnsupportedError("Not supported");
@@ -30691,7 +30732,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TrustedScriptURL")
-class TrustedScriptUrl extends Interceptor {
+class TrustedScriptUrl extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TrustedScriptUrl._() {
     throw new UnsupportedError("Not supported");
@@ -30704,7 +30745,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("TrustedURL")
-class TrustedUrl extends Interceptor {
+class TrustedUrl extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TrustedUrl._() {
     throw new UnsupportedError("Not supported");
@@ -30798,7 +30839,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("UnderlyingSourceBase")
-class UnderlyingSourceBase extends Interceptor {
+class UnderlyingSourceBase extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory UnderlyingSourceBase._() {
     throw new UnsupportedError("Not supported");
@@ -30838,7 +30879,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("URL")
-class Url extends Interceptor {
+class Url extends JavaScriptObject {
   static String createObjectUrl(blob_OR_source_OR_stream) => JS(
       'String',
       '(self.URL || self.webkitURL).createObjectURL(#)',
@@ -30912,7 +30953,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("URLSearchParams")
-class UrlSearchParams extends Interceptor {
+class UrlSearchParams extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory UrlSearchParams._() {
     throw new UnsupportedError("Not supported");
@@ -30947,7 +30988,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class UrlUtilsReadOnly extends Interceptor {
+abstract class UrlUtilsReadOnly extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory UrlUtilsReadOnly._() {
     throw new UnsupportedError("Not supported");
@@ -30989,7 +31030,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VRCoordinateSystem")
-class VRCoordinateSystem extends Interceptor {
+class VRCoordinateSystem extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VRCoordinateSystem._() {
     throw new UnsupportedError("Not supported");
@@ -31099,7 +31140,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VRDisplayCapabilities")
-class VRDisplayCapabilities extends Interceptor {
+class VRDisplayCapabilities extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VRDisplayCapabilities._() {
     throw new UnsupportedError("Not supported");
@@ -31145,7 +31186,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VREyeParameters")
-class VREyeParameters extends Interceptor {
+class VREyeParameters extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VREyeParameters._() {
     throw new UnsupportedError("Not supported");
@@ -31162,7 +31203,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VRFrameData")
-class VRFrameData extends Interceptor {
+class VRFrameData extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VRFrameData._() {
     throw new UnsupportedError("Not supported");
@@ -31203,7 +31244,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VRPose")
-class VRPose extends Interceptor {
+class VRPose extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VRPose._() {
     throw new UnsupportedError("Not supported");
@@ -31290,7 +31331,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VRStageBounds")
-class VRStageBounds extends Interceptor {
+class VRStageBounds extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VRStageBounds._() {
     throw new UnsupportedError("Not supported");
@@ -31303,7 +31344,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VRStageBoundsPoint")
-class VRStageBoundsPoint extends Interceptor {
+class VRStageBoundsPoint extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VRStageBoundsPoint._() {
     throw new UnsupportedError("Not supported");
@@ -31318,7 +31359,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VRStageParameters")
-class VRStageParameters extends Interceptor {
+class VRStageParameters extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VRStageParameters._() {
     throw new UnsupportedError("Not supported");
@@ -31335,7 +31376,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ValidityState")
-class ValidityState extends Interceptor {
+class ValidityState extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ValidityState._() {
     throw new UnsupportedError("Not supported");
@@ -31429,7 +31470,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VideoPlaybackQuality")
-class VideoPlaybackQuality extends Interceptor {
+class VideoPlaybackQuality extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VideoPlaybackQuality._() {
     throw new UnsupportedError("Not supported");
@@ -31448,7 +31489,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VideoTrack")
-class VideoTrack extends Interceptor {
+class VideoTrack extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VideoTrack._() {
     throw new UnsupportedError("Not supported");
@@ -31595,7 +31636,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("VTTRegion")
-class VttRegion extends Interceptor {
+class VttRegion extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VttRegion._() {
     throw new UnsupportedError("Not supported");
@@ -33338,7 +33379,12 @@
     var completer = new Completer<FileSystem>();
     __requestFileSystem(type, size, (value) {
       applyExtension('DOMFileSystem', value);
+      applyExtension('WebKitFileSystem', value);
+      applyExtension('webkitFileSystem', value);
+      applyExtension('FileSystem', value);
       applyExtension('DirectoryEntry', value.root);
+      applyExtension('webkitFileSystemDirectoryEntry', value.root);
+      applyExtension('FileSystemDirectoryEntry', value.root);
       completer.complete(value);
     }, (error) {
       completer.completeError(error);
@@ -33756,7 +33802,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class WindowBase64 extends Interceptor {
+abstract class WindowBase64 extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory WindowBase64._() {
     throw new UnsupportedError("Not supported");
@@ -34026,7 +34072,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WorkletAnimation")
-class WorkletAnimation extends Interceptor {
+class WorkletAnimation extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory WorkletAnimation._() {
     throw new UnsupportedError("Not supported");
@@ -34057,7 +34103,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WorkletGlobalScope")
-class WorkletGlobalScope extends Interceptor {
+class WorkletGlobalScope extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory WorkletGlobalScope._() {
     throw new UnsupportedError("Not supported");
@@ -34070,7 +34116,7 @@
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
 @deprecated // experimental
 @Native("XPathEvaluator")
-class XPathEvaluator extends Interceptor {
+class XPathEvaluator extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory XPathEvaluator._() {
     throw new UnsupportedError("Not supported");
@@ -34098,7 +34144,7 @@
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathExpression
 @deprecated // experimental
 @Native("XPathExpression")
-class XPathExpression extends Interceptor {
+class XPathExpression extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory XPathExpression._() {
     throw new UnsupportedError("Not supported");
@@ -34113,7 +34159,7 @@
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathNSResolver
 @deprecated // experimental
 @Native("XPathNSResolver")
-class XPathNSResolver extends Interceptor {
+class XPathNSResolver extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory XPathNSResolver._() {
     throw new UnsupportedError("Not supported");
@@ -34129,7 +34175,7 @@
 // http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult
 @deprecated // experimental
 @Native("XPathResult")
-class XPathResult extends Interceptor {
+class XPathResult extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory XPathResult._() {
     throw new UnsupportedError("Not supported");
@@ -34191,7 +34237,7 @@
 // http://domparsing.spec.whatwg.org/#the-xmlserializer-interface
 @deprecated // stable
 @Native("XMLSerializer")
-class XmlSerializer extends Interceptor {
+class XmlSerializer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory XmlSerializer._() {
     throw new UnsupportedError("Not supported");
@@ -34214,7 +34260,7 @@
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @deprecated // nonstandard
 @Native("XSLTProcessor")
-class XsltProcessor extends Interceptor {
+class XsltProcessor extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory XsltProcessor._() {
     throw new UnsupportedError("Not supported");
@@ -34274,7 +34320,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Bluetooth")
-abstract class _Bluetooth extends Interceptor {
+abstract class _Bluetooth extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _Bluetooth._() {
     throw new UnsupportedError("Not supported");
@@ -34285,7 +34331,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BluetoothCharacteristicProperties")
-abstract class _BluetoothCharacteristicProperties extends Interceptor {
+abstract class _BluetoothCharacteristicProperties extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _BluetoothCharacteristicProperties._() {
     throw new UnsupportedError("Not supported");
@@ -34318,7 +34364,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BluetoothRemoteGATTServer")
-abstract class _BluetoothRemoteGATTServer extends Interceptor {
+abstract class _BluetoothRemoteGATTServer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _BluetoothRemoteGATTServer._() {
     throw new UnsupportedError("Not supported");
@@ -34329,7 +34375,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BluetoothRemoteGATTService")
-abstract class _BluetoothRemoteGATTService extends Interceptor {
+abstract class _BluetoothRemoteGATTService extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _BluetoothRemoteGATTService._() {
     throw new UnsupportedError("Not supported");
@@ -34340,7 +34386,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BluetoothUUID")
-abstract class _BluetoothUUID extends Interceptor {
+abstract class _BluetoothUUID extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _BluetoothUUID._() {
     throw new UnsupportedError("Not supported");
@@ -34351,7 +34397,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("BudgetService")
-class _BudgetService extends Interceptor {
+class _BudgetService extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _BudgetService._() {
     throw new UnsupportedError("Not supported");
@@ -34371,7 +34417,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Cache")
-abstract class _Cache extends Interceptor {
+abstract class _Cache extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _Cache._() {
     throw new UnsupportedError("Not supported");
@@ -34381,7 +34427,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class _CanvasPath extends Interceptor {
+abstract class _CanvasPath extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _CanvasPath._() {
     throw new UnsupportedError("Not supported");
@@ -34415,7 +34461,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("CSSRuleList")
-class _CssRuleList extends Interceptor
+class _CssRuleList extends JavaScriptObject
     with ListMixin<CssRule>, ImmutableListMixin<CssRule>
     implements List<CssRule>, JavaScriptIndexingBehavior<CssRule> {
   // To suppress missing implicit constructor warnings.
@@ -34476,7 +34522,7 @@
 
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Native("DOMFileSystemSync")
-abstract class _DOMFileSystemSync extends Interceptor {
+abstract class _DOMFileSystemSync extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _DOMFileSystemSync._() {
     throw new UnsupportedError("Not supported");
@@ -34498,7 +34544,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("DirectoryReaderSync")
-abstract class _DirectoryReaderSync extends Interceptor {
+abstract class _DirectoryReaderSync extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _DirectoryReaderSync._() {
     throw new UnsupportedError("Not supported");
@@ -34683,7 +34729,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EntrySync")
-abstract class _EntrySync extends Interceptor {
+abstract class _EntrySync extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _EntrySync._() {
     throw new UnsupportedError("Not supported");
@@ -34705,7 +34751,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("FileReaderSync")
-abstract class _FileReaderSync extends Interceptor {
+abstract class _FileReaderSync extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _FileReaderSync._() {
     throw new UnsupportedError("Not supported");
@@ -34722,7 +34768,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("FileWriterSync")
-abstract class _FileWriterSync extends Interceptor {
+abstract class _FileWriterSync extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _FileWriterSync._() {
     throw new UnsupportedError("Not supported");
@@ -34733,7 +34779,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("GamepadList")
-class _GamepadList extends Interceptor
+class _GamepadList extends JavaScriptObject
     with ListMixin<Gamepad?>, ImmutableListMixin<Gamepad?>
     implements List<Gamepad?>, JavaScriptIndexingBehavior<Gamepad?> {
   // To suppress missing implicit constructor warnings.
@@ -34795,7 +34841,7 @@
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
 @deprecated // deprecated
 @Native("HTMLAllCollection")
-abstract class _HTMLAllCollection extends Interceptor {
+abstract class _HTMLAllCollection extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _HTMLAllCollection._() {
     throw new UnsupportedError("Not supported");
@@ -34906,7 +34952,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Mojo")
-abstract class _Mojo extends Interceptor {
+abstract class _Mojo extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _Mojo._() {
     throw new UnsupportedError("Not supported");
@@ -34917,7 +34963,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MojoHandle")
-abstract class _MojoHandle extends Interceptor {
+abstract class _MojoHandle extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _MojoHandle._() {
     throw new UnsupportedError("Not supported");
@@ -34981,7 +35027,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("MojoWatcher")
-abstract class _MojoWatcher extends Interceptor {
+abstract class _MojoWatcher extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _MojoWatcher._() {
     throw new UnsupportedError("Not supported");
@@ -34992,7 +35038,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("NFC")
-abstract class _NFC extends Interceptor {
+abstract class _NFC extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _NFC._() {
     throw new UnsupportedError("Not supported");
@@ -35005,7 +35051,7 @@
 // http://dom.spec.whatwg.org/#namednodemap
 @deprecated // deprecated
 @Native("NamedNodeMap,MozNamedAttrMap")
-class _NamedNodeMap extends Interceptor
+class _NamedNodeMap extends JavaScriptObject
     with ListMixin<Node>, ImmutableListMixin<Node>
     implements List<Node>, JavaScriptIndexingBehavior<Node> {
   // To suppress missing implicit constructor warnings.
@@ -35078,7 +35124,7 @@
 
 @deprecated // nonstandard
 @Native("PagePopupController")
-abstract class _PagePopupController extends Interceptor {
+abstract class _PagePopupController extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _PagePopupController._() {
     throw new UnsupportedError("Not supported");
@@ -35097,7 +35143,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Report")
-class _Report extends Interceptor {
+class _Report extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _Report._() {
     throw new UnsupportedError("Not supported");
@@ -35195,7 +35241,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SpeechRecognitionResultList")
-class _SpeechRecognitionResultList extends Interceptor
+class _SpeechRecognitionResultList extends JavaScriptObject
     with
         ListMixin<SpeechRecognitionResult>,
         ImmutableListMixin<SpeechRecognitionResult>
@@ -35259,7 +35305,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("StyleSheetList")
-class _StyleSheetList extends Interceptor
+class _StyleSheetList extends JavaScriptObject
     with ListMixin<StyleSheet>, ImmutableListMixin<StyleSheet>
     implements List<StyleSheet>, JavaScriptIndexingBehavior<StyleSheet> {
   // To suppress missing implicit constructor warnings.
@@ -35321,7 +35367,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SubtleCrypto")
-abstract class _SubtleCrypto extends Interceptor {
+abstract class _SubtleCrypto extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _SubtleCrypto._() {
     throw new UnsupportedError("Not supported");
@@ -35343,7 +35389,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBAlternateInterface")
-abstract class _USBAlternateInterface extends Interceptor {
+abstract class _USBAlternateInterface extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBAlternateInterface._() {
     throw new UnsupportedError("Not supported");
@@ -35362,7 +35408,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBConfiguration")
-abstract class _USBConfiguration extends Interceptor {
+abstract class _USBConfiguration extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBConfiguration._() {
     throw new UnsupportedError("Not supported");
@@ -35403,7 +35449,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBDevice")
-abstract class _USBDevice extends Interceptor {
+abstract class _USBDevice extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBDevice._() {
     throw new UnsupportedError("Not supported");
@@ -35414,7 +35460,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBEndpoint")
-abstract class _USBEndpoint extends Interceptor {
+abstract class _USBEndpoint extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBEndpoint._() {
     throw new UnsupportedError("Not supported");
@@ -35436,7 +35482,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBInTransferResult")
-abstract class _USBInTransferResult extends Interceptor {
+abstract class _USBInTransferResult extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBInTransferResult._() {
     throw new UnsupportedError("Not supported");
@@ -35458,7 +35504,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBInterface")
-abstract class _USBInterface extends Interceptor {
+abstract class _USBInterface extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBInterface._() {
     throw new UnsupportedError("Not supported");
@@ -35475,7 +35521,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBIsochronousInTransferPacket")
-abstract class _USBIsochronousInTransferPacket extends Interceptor {
+abstract class _USBIsochronousInTransferPacket extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBIsochronousInTransferPacket._() {
     throw new UnsupportedError("Not supported");
@@ -35502,7 +35548,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBIsochronousInTransferResult")
-abstract class _USBIsochronousInTransferResult extends Interceptor {
+abstract class _USBIsochronousInTransferResult extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBIsochronousInTransferResult._() {
     throw new UnsupportedError("Not supported");
@@ -35531,7 +35577,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBIsochronousOutTransferPacket")
-abstract class _USBIsochronousOutTransferPacket extends Interceptor {
+abstract class _USBIsochronousOutTransferPacket extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBIsochronousOutTransferPacket._() {
     throw new UnsupportedError("Not supported");
@@ -35558,7 +35604,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBIsochronousOutTransferResult")
-abstract class _USBIsochronousOutTransferResult extends Interceptor {
+abstract class _USBIsochronousOutTransferResult extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBIsochronousOutTransferResult._() {
     throw new UnsupportedError("Not supported");
@@ -35578,7 +35624,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("USBOutTransferResult")
-abstract class _USBOutTransferResult extends Interceptor {
+abstract class _USBOutTransferResult extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _USBOutTransferResult._() {
     throw new UnsupportedError("Not supported");
@@ -35602,7 +35648,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class _WindowTimers extends Interceptor {
+abstract class _WindowTimers extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _WindowTimers._() {
     throw new UnsupportedError("Not supported");
@@ -35625,7 +35671,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WorkerLocation")
-abstract class _WorkerLocation extends Interceptor implements UrlUtilsReadOnly {
+abstract class _WorkerLocation extends JavaScriptObject
+    implements UrlUtilsReadOnly {
   // To suppress missing implicit constructor warnings.
   factory _WorkerLocation._() {
     throw new UnsupportedError("Not supported");
@@ -35658,7 +35705,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("Worklet")
-abstract class _Worklet extends Interceptor {
+abstract class _Worklet extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _Worklet._() {
     throw new UnsupportedError("Not supported");
diff --git a/sdk/lib/html/doc/WORKAROUNDS.md b/sdk/lib/html/doc/WORKAROUNDS.md
index 39a1c06..154c891 100644
--- a/sdk/lib/html/doc/WORKAROUNDS.md
+++ b/sdk/lib/html/doc/WORKAROUNDS.md
@@ -19,14 +19,46 @@
 As mentioned above, there exists stale interfaces. While some of these may be
 fixed in the source code, many might not.
 
-In order to circumvent this, you can use the `js_util` library, like
-`getProperty`, `setProperty`, `callMethod`, and `callConstructor`.
+In order to work around this, you can use the annotation `@staticInterop` from
+`package:js`.
 
 Let’s look at an example. `FileReader` is a `dart:html` interface that is
 missing the API `readAsBinaryString` ([#42834][]). We can work around this by
 doing something like the following:
 
 ```dart
+@JS()
+library workarounds;
+
+import 'dart:html';
+
+import 'package:async_helper/async_minitest.dart';
+import 'package:expect/expect.dart';
+import 'package:js/js.dart';
+
+@JS()
+@staticInterop
+class JSFileReader {}
+
+extension JSFileReaderExtension on JSFileReader {
+  external void readAsBinaryString(Blob blob);
+}
+
+void main() async {
+  var reader = new FileReader();
+  reader.onLoad.listen(expectAsync((event) {
+    String result = reader.result as String;
+    Expect.equals(result, '00000000');
+  }));
+  var jsReader = reader as JSFileReader;
+  jsReader.readAsBinaryString(new Blob(['00000000']));
+}
+```
+
+Alternatively, you can directly use the `js_util` library, using the methods
+`getProperty`, `setProperty`, `callMethod`, and `callConstructor`.
+
+```dart
 import 'dart:html';
 import 'dart:js_util' as js_util;
 
@@ -46,9 +78,37 @@
 }
 ```
 
-In the case where the API is missing a constructor, we can use
-`callConstructor`. For example, instead of using the factory constructor for
-`KeyboardEvent`, we can do the following:
+In the case where the API is missing a constructor, we can define a constructor
+within a `@staticInterop` class. Note that constructors, `external` or
+otherwise, are disallowed in extensions currently. For example:
+
+```dart
+@JS()
+library workarounds;
+
+import 'dart:js_util' as js_util;
+
+import 'package:expect/expect.dart';
+import 'package:js/js.dart';
+
+@JS('KeyboardEvent')
+@staticInterop
+class JSKeyboardEvent {
+  external JSKeyboardEvent(String typeArg, Object keyboardEventInit);
+}
+
+extension JSKeyboardEventExtension on JSKeyboardEvent {
+  external String get key;
+}
+
+void main() {
+  var event = JSKeyboardEvent('KeyboardEvent',
+      js_util.jsify({'key': 'A'}));
+  Expect.equals(event.key, 'A');
+}
+```
+
+or with `js_util`'s `callConstructor`:
 
 ```dart
 import 'dart:html';
@@ -73,11 +133,45 @@
 `USBDevice` ([#42200][]) due to historical reasons. These native interfaces are
 marked with `@Native`, are private, and have no attributes associated with them.
 Therefore, unlike other `@Native` objects, we can’t access any of the APIs or
-attributes associated with this interface. We can use the `js_util` library
-again to circumvent this issue. For example, we can manipulate a
-`_SubtleCrypto` object:
+attributes associated with this interface. We can again either use the
+`@staticInterop` annotation or use the `js_util` library to circumvent this
+issue. For example, we can abstract a `_SubtleCrypto` object:
 
 ```dart
+@JS()
+library workarounds;
+
+import 'dart:html';
+import 'dart:js_util' as js_util;
+import 'dart:typed_data';
+
+import 'package:js/js.dart';
+
+@JS()
+external Crypto get crypto;
+
+@JS()
+@staticInterop
+class JSSubtleCrypto {}
+
+extension JSSubtleCryptoExtension on JSSubtleCrypto {
+  external dynamic digest(String algorithm, Uint8List data);
+  Future<ByteBuffer> digestFuture(String algorithm, Uint8List data) =>
+      js_util.promiseToFuture(digest(algorithm, data));
+}
+
+void main() async {
+  var subtle = crypto.subtle! as JSSubtleCrypto;
+  var digest = await subtle.digestFuture('SHA-256', Uint8List(16));
+}
+```
+
+or with `js_util`:
+
+```dart
+@JS()
+library workarounds;
+
 import 'dart:html';
 import 'dart:js_util' as js_util;
 import 'dart:typed_data';
@@ -96,10 +190,17 @@
 }
 ```
 
-What you shouldn’t do is attempt to cast these native objects using your own JS
-interop types, e.g.
+## Workarounds to Avoid
+
+### Using non-`@staticInterop` `package:js` types
+
+Avoid casting these native objects to non-`@staticInterop` `package:js` types
+e.g.
 
 ```dart
+@JS()
+library workarounds;
+
 import 'dart:html';
 
 import 'package:js/js.dart';
@@ -115,14 +216,40 @@
 }
 ```
 
-With the above, you’ll see a type error:
+With the above, you’ll see a static error:
 
-`Uncaught TypeError: Instance of 'SubtleCrypto': type 'Interceptor' is not a subtype of type 'SubtleCrypto'`
+`Error: Non-static JS interop class 'SubtleCrypto' conflicts with natively supported class '_SubtleCrypto' in 'dart:html'.`
 
 This is because the types in the `@Native` annotation are reserved and the above
 leads to namespace conflicts between the `@Native` type and the user JS interop
-type in the compiler. These `@Native` types inherit the `Interceptor` class,
-which is why you see the message above.
+type in the compiler. `@staticInterop` classes, however, don't have this issue.
+
+### Using extensions on `@Native` types
+
+One alternative that seems viable is to use a static extension on the `@Native`
+type in `dart:html` directly, e.g.
+
+```dart
+extension FileReaderExtension on FileReader {
+  external void readAsBinaryString(Blob blob);
+}
+```
+
+This may work fine, as long as `FileReader` does not add `readAsBinaryString`.
+In the case where this API is added to the class, Dart will [prioritize][] that
+instance method over the extension method you wrote. This may lead to issues,
+like a type error when the signatures between the two methods are incompatible,
+or confusing runtime behavior.
+
+Furthermore, you may come across API conflicts with other users who have also
+defined extension methods on these `@Native` types.
+
+To avoid the above, it's recommended you stick with `@staticInterop`.
+
+In the future, when views/extension types are introduced to the language, this
+guidance will likely change so that you can directly use views on `@Native`
+types.
 
 [#42834]: https://github.com/dart-lang/sdk/issues/42834
 [#42200]: https://github.com/dart-lang/sdk/issues/42200
+[prioritize]: https://github.com/dart-lang/language/blob/master/accepted/2.7/static-extension-methods/feature-specification.md#member-conflict-resolution
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index ad56eea..e26356c 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -75,7 +75,7 @@
 import 'dart:typed_data';
 import 'dart:_js_helper' show Creates, Returns, JSName, Native;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor, JSExtendableArray;
+import 'dart:_interceptors' show JavaScriptObject, JSExtendableArray;
 import 'dart:_js_helper' show convertDartClosureToJS;
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -205,7 +205,7 @@
 
 @Unstable()
 @Native("IDBCursor")
-class Cursor extends Interceptor {
+class Cursor extends JavaScriptObject {
   Future delete() {
     try {
       return _completeRequest(_delete());
@@ -448,7 +448,7 @@
 @SupportedBrowser(SupportedBrowser.IE, '10')
 @Unstable()
 @Native("IDBFactory")
-class IdbFactory extends Interceptor {
+class IdbFactory extends JavaScriptObject {
   /**
    * Checks to see if Indexed DB is supported on the current platform.
    */
@@ -554,7 +554,7 @@
 
 @Unstable()
 @Native("IDBIndex")
-class Index extends Interceptor {
+class Index extends JavaScriptObject {
   Future<int> count([key_OR_range]) {
     try {
       var request = _count(key_OR_range);
@@ -696,7 +696,7 @@
 
 @Unstable()
 @Native("IDBKeyRange")
-class KeyRange extends Interceptor {
+class KeyRange extends JavaScriptObject {
   factory KeyRange.only(/*Key*/ value) =>
       _KeyRangeFactoryProvider.createKeyRange_only(value);
 
@@ -747,7 +747,7 @@
 
 @Unstable()
 @Native("IDBObjectStore")
-class ObjectStore extends Interceptor {
+class ObjectStore extends JavaScriptObject {
   Future add(value, [key]) {
     try {
       var request;
@@ -1012,7 +1012,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("IDBObservation")
-class Observation extends Interceptor {
+class Observation extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Observation._() {
     throw new UnsupportedError("Not supported");
@@ -1029,7 +1029,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("IDBObserver")
-class Observer extends Interceptor {
+class Observer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Observer._() {
     throw new UnsupportedError("Not supported");
@@ -1058,7 +1058,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("IDBObserverChanges")
-class ObserverChanges extends Interceptor {
+class ObserverChanges extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ObserverChanges._() {
     throw new UnsupportedError("Not supported");
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index fbe663b..5d38bd8 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -644,7 +644,7 @@
 ///
 /// Example:
 ///
-/// ```dart template:none
+/// ```dart template:top
 /// class Two<A, B> {}
 ///
 /// print(extractTypeArguments<List>(<int>[], <T>() => new Set<T>()));
@@ -658,7 +658,7 @@
 /// The type argument T is important to choose which specific type parameter
 /// list in [instance]'s type hierarchy is being extracted. Consider:
 ///
-/// ```dart template:none
+/// ```dart template:top
 /// class A<T> {}
 /// class B<T> {}
 ///
diff --git a/sdk/lib/io/directory.dart b/sdk/lib/io/directory.dart
index 7fb3ed5..cbda1c3 100644
--- a/sdk/lib/io/directory.dart
+++ b/sdk/lib/io/directory.dart
@@ -233,20 +233,28 @@
   /// Returns a `Future<Directory>` that completes
   /// with a [Directory] for the renamed directory.
   ///
-  /// If [newPath] identifies an existing directory, that directory is
-  /// removed first.
+  /// If [newPath] identifies an existing directory, then the behavior is
+  /// platform-specific. On all platforms, the future completes with an
+  /// [FileSystemException] if the existing directory is not empty. On POSIX
+  /// systems, if [newPath] identifies an existing empty directory then that
+  /// directory is deleted before this directory is renamed.
+  ///
   /// If [newPath] identifies an existing file, the operation
-  /// fails and the future completes with an exception.
+  /// fails and the future completes with a [FileSystemException].
   Future<Directory> rename(String newPath);
 
   /// Synchronously renames this directory.
   ///
   /// Returns a [Directory] for the renamed directory.
   ///
-  /// If [newPath] identifies an existing directory, that directory is
-  /// removed first.
+  /// If [newPath] identifies an existing directory, then the behavior is
+  /// platform-specific. On all platforms, a [FileSystemException] is thrown
+  /// if the existing directory is not empty. On POSIX systems, if [newPath]
+  /// identifies an existing empty directory then that directory is deleted
+  /// before this directory is renamed.
+  ///
   /// If [newPath] identifies an existing file the operation
-  /// fails and an exception is thrown.
+  /// fails and a [FileSystemException] is thrown.
   Directory renameSync(String newPath);
 
   /// A [Directory] whose path is the absolute path of [this].
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index 4eedcf8..ca14f1f 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -93,6 +93,9 @@
 
   /// Calls the operating system's `stat()` function (or equivalent) on [path].
   ///
+  /// If [path] is a symbolic link then it is resolved and results for the
+  /// resulting file are returned.
+  ///
   /// Returns a [FileStat] object containing the data returned by `stat()`.
   /// If the call fails, returns a [FileStat] object with [FileStat.type] set to
   /// [FileSystemEntityType.notFound] and the other fields invalid.
@@ -123,6 +126,9 @@
   /// Asynchronously calls the operating system's `stat()` function (or
   /// equivalent) on [path].
   ///
+  /// If [path] is a symbolic link then it is resolved and results for the
+  /// resulting file are returned.
+  ///
   /// Returns a [Future] which completes with the same results as [statSync].
   static Future<FileStat> stat(String path) {
     final IOOverrides? overrides = IOOverrides.current;
@@ -356,6 +362,9 @@
   /// Returns a `Future<FileStat>` object containing the data returned by
   /// `stat()`.
   ///
+  /// If [path] is a symbolic link then it is resolved and results for the
+  /// resulting file are returned.
+  ///
   /// If the call fails, completes the future with a [FileStat] object
   /// with `.type` set to [FileSystemEntityType.notFound] and the other fields
   /// invalid.
@@ -367,6 +376,9 @@
   ///
   /// Returns a [FileStat] object containing the data returned by `stat()`.
   ///
+  /// If [path] is a symbolic link then it is resolved and results for the
+  /// resulting file are returned.
+  ///
   /// If the call fails, returns a [FileStat] object with `.type` set to
   /// [FileSystemEntityType.notFound] and the other fields invalid.
   FileStat statSync() => FileStat.statSync(path);
diff --git a/sdk/lib/io/overrides.dart b/sdk/lib/io/overrides.dart
index 65e7acf..a124c76 100644
--- a/sdk/lib/io/overrides.dart
+++ b/sdk/lib/io/overrides.dart
@@ -81,16 +81,21 @@
 
       // Socket
       Future<Socket> Function(dynamic, int,
-              {dynamic sourceAddress, Duration? timeout})?
+              {dynamic sourceAddress, int sourcePort, Duration? timeout})?
           socketConnect,
       Future<ConnectionTask<Socket>> Function(dynamic, int,
-              {dynamic sourceAddress})?
+              {dynamic sourceAddress, int sourcePort})?
           socketStartConnect,
 
       // ServerSocket
       Future<ServerSocket> Function(dynamic, int,
               {int backlog, bool v6Only, bool shared})?
-          serverSocketBind}) {
+          serverSocketBind,
+
+      // Standard Streams
+      Stdin Function()? stdin,
+      Stdout Function()? stdout,
+      Stdout Function()? stderr}) {
     IOOverrides overrides = new _IOOverridesScope(
       // Directory
       createDirectory,
@@ -124,6 +129,11 @@
 
       // ServerSocket
       serverSocketBind,
+
+      // Standard streams
+      stdin,
+      stdout,
+      stderr,
     );
     return _asyncRunZoned<R>(body, zoneValues: {_ioOverridesToken: overrides});
   }
@@ -259,9 +269,9 @@
   /// When this override is installed, this functions overrides the behavior of
   /// `Socket.connect(...)`.
   Future<Socket> socketConnect(host, int port,
-      {sourceAddress, Duration? timeout}) {
+      {sourceAddress, int sourcePort = 0, Duration? timeout}) {
     return Socket._connect(host, port,
-        sourceAddress: sourceAddress, timeout: timeout);
+        sourceAddress: sourceAddress, sourcePort: sourcePort, timeout: timeout);
   }
 
   /// Asynchronously returns a [ConnectionTask] that connects to the given host
@@ -270,8 +280,9 @@
   /// When this override is installed, this functions overrides the behavior of
   /// `Socket.startConnect(...)`.
   Future<ConnectionTask<Socket>> socketStartConnect(host, int port,
-      {sourceAddress}) {
-    return Socket._startConnect(host, port, sourceAddress: sourceAddress);
+      {sourceAddress, int sourcePort = 0}) {
+    return Socket._startConnect(host, port,
+        sourceAddress: sourceAddress, sourcePort: sourcePort);
   }
 
   // ServerSocket
@@ -286,6 +297,32 @@
     return ServerSocket._bind(address, port,
         backlog: backlog, v6Only: v6Only, shared: shared);
   }
+
+  // Standard streams
+
+  /// The standard input stream of data read by this program.
+  ///
+  /// When this override is installed, this getter overrides the behavior of
+  /// the top-level `stdin` getter.
+  Stdin get stdin {
+    return _stdin;
+  }
+
+  /// The standard output stream of data written by this program.
+  ///
+  /// When this override is installed, this getter overrides the behavior of
+  /// the top-level `stdout` getter.
+  Stdout get stdout {
+    return _stdout;
+  }
+
+  /// The standard output stream of errors written by this program.
+  ///
+  /// When this override is installed, this getter overrides the behavior of
+  /// the top-level `stderr` getter.
+  Stdout get stderr {
+    return _stderr;
+  }
 }
 
 class _IOOverridesScope extends IOOverrides {
@@ -319,14 +356,21 @@
 
   // Socket
   Future<Socket> Function(dynamic, int,
-      {dynamic sourceAddress, Duration? timeout})? _socketConnect;
+      {dynamic sourceAddress,
+      int sourcePort,
+      Duration? timeout})? _socketConnect;
   Future<ConnectionTask<Socket>> Function(dynamic, int,
-      {dynamic sourceAddress})? _socketStartConnect;
+      {dynamic sourceAddress, int sourcePort})? _socketStartConnect;
 
   // ServerSocket
   Future<ServerSocket> Function(dynamic, int,
       {int backlog, bool v6Only, bool shared})? _serverSocketBind;
 
+  // Standard streams
+  Stdin Function()? _stdin;
+  Stdout Function()? _stdout;
+  Stdout Function()? _stderr;
+
   _IOOverridesScope(
     // Directory
     this._createDirectory,
@@ -360,6 +404,11 @@
 
     // ServerSocket
     this._serverSocketBind,
+
+    // Standard streams
+    this._stdin,
+    this._stdout,
+    this._stderr,
   );
 
   // Directory
@@ -472,30 +521,34 @@
   // Socket
   @override
   Future<Socket> socketConnect(host, int port,
-      {sourceAddress, Duration? timeout}) {
+      {sourceAddress, int sourcePort = 0, Duration? timeout}) {
     if (_socketConnect != null) {
       return _socketConnect!(host, port,
           sourceAddress: sourceAddress, timeout: timeout);
     }
     if (_previous != null) {
       return _previous!.socketConnect(host, port,
-          sourceAddress: sourceAddress, timeout: timeout);
+          sourceAddress: sourceAddress,
+          sourcePort: sourcePort,
+          timeout: timeout);
     }
     return super.socketConnect(host, port,
-        sourceAddress: sourceAddress, timeout: timeout);
+        sourceAddress: sourceAddress, sourcePort: sourcePort, timeout: timeout);
   }
 
   @override
   Future<ConnectionTask<Socket>> socketStartConnect(host, int port,
-      {sourceAddress}) {
+      {sourceAddress, int sourcePort = 0}) {
     if (_socketStartConnect != null) {
-      return _socketStartConnect!(host, port, sourceAddress: sourceAddress);
+      return _socketStartConnect!(host, port,
+          sourceAddress: sourceAddress, sourcePort: sourcePort);
     }
     if (_previous != null) {
-      return _previous!
-          .socketStartConnect(host, port, sourceAddress: sourceAddress);
+      return _previous!.socketStartConnect(host, port,
+          sourceAddress: sourceAddress, sourcePort: sourcePort);
     }
-    return super.socketStartConnect(host, port, sourceAddress: sourceAddress);
+    return super.socketStartConnect(host, port,
+        sourceAddress: sourceAddress, sourcePort: sourcePort);
   }
 
   // ServerSocket
@@ -514,4 +567,21 @@
     return super.serverSocketBind(address, port,
         backlog: backlog, v6Only: v6Only, shared: shared);
   }
+
+  // Standard streams
+
+  @override
+  Stdin get stdin {
+    return _stdin?.call() ?? _previous?.stdin ?? super.stdin;
+  }
+
+  @override
+  Stdout get stdout {
+    return _stdout?.call() ?? _previous?.stdout ?? super.stdout;
+  }
+
+  @override
+  Stdout get stderr {
+    return _stderr?.call() ?? _previous?.stderr ?? super.stderr;
+  }
 }
diff --git a/sdk/lib/io/platform.dart b/sdk/lib/io/platform.dart
index 06dd98f..93bcbd4 100644
--- a/sdk/lib/io/platform.dart
+++ b/sdk/lib/io/platform.dart
@@ -75,9 +75,12 @@
 
   /// Get the name of the current locale.
   ///
-  /// The result should include a language and country code
-  /// (e.g. "en_US", "de_AT") and may include a character set
-  /// (e.g. "en_US.UTF-8").
+  /// The result usually consists of
+  ///  - a language (e.g., "en"), or
+  ///  - a language and country code (e.g. "en_US", "de_AT"), or
+  ///  - a language, country code and character set (e.g. "en_US.UTF-8").
+  ///
+  /// On macOS and iOS, the locale is taken from CFLocaleGetIdentifier.
   ///
   /// On Linux and Fushia, the locale is taken from the "LANG" environment
   /// variable, which may be set to any value. For example:
@@ -202,11 +205,6 @@
   /// Provides a new list every time the value is read.
   static List<String> get executableArguments => _Platform.executableArguments;
 
-  /// This returns `null`, as `packages/` directories are no longer supported.
-  ///
-  @Deprecated('packages/ directory resolution is not supported in Dart 2')
-  static String? get packageRoot => null; // TODO(mfairhurst): remove this
-
   /// The `--packages` flag passed to the executable used to run the script
   /// in this isolate.
   ///
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 26cb3ef..3c102c5 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -589,19 +589,22 @@
   /// be a [String] or an [InternetAddress]. If a [String] is passed it must
   /// hold a numeric IP address.
   ///
+  /// The [sourcePort] defines the local port to bind to. If [sourcePort] is
+  /// not specified or zero, a port will be chosen.
+  ///
   /// The argument [timeout] is used to specify the maximum allowed time to wait
   /// for a connection to be established. If [timeout] is longer than the system
   /// level timeout duration, a timeout may occur sooner than specified in
   /// [timeout]. On timeout, a [SocketException] is thrown and all ongoing
   /// connection attempts to [host] are cancelled.
   external static Future<RawSocket> connect(host, int port,
-      {sourceAddress, Duration? timeout});
+      {sourceAddress, int sourcePort = 0, Duration? timeout});
 
   /// Like [connect], but returns a [Future] that completes with a
   /// [ConnectionTask] that can be cancelled if the [RawSocket] is no
   /// longer needed.
   external static Future<ConnectionTask<RawSocket>> startConnect(host, int port,
-      {sourceAddress});
+      {sourceAddress, int sourcePort = 0});
 
   /// The number of received and non-read bytes in the socket that can be read.
   int available();
@@ -758,40 +761,46 @@
   /// be a [String] or an [InternetAddress]. If a [String] is passed it must
   /// hold a numeric IP address.
   ///
+  /// The [sourcePort] defines the local port to bind to. If [sourcePort] is
+  /// not specified or zero, a port will be chosen.
+  ///
   /// The argument [timeout] is used to specify the maximum allowed time to wait
   /// for a connection to be established. If [timeout] is longer than the system
   /// level timeout duration, a timeout may occur sooner than specified in
   /// [timeout]. On timeout, a [SocketException] is thrown and all ongoing
   /// connection attempts to [host] are cancelled.
   static Future<Socket> connect(host, int port,
-      {sourceAddress, Duration? timeout}) {
+      {sourceAddress, int sourcePort = 0, Duration? timeout}) {
     final IOOverrides? overrides = IOOverrides.current;
     if (overrides == null) {
       return Socket._connect(host, port,
-          sourceAddress: sourceAddress, timeout: timeout);
+          sourceAddress: sourceAddress,
+          sourcePort: sourcePort,
+          timeout: timeout);
     }
     return overrides.socketConnect(host, port,
-        sourceAddress: sourceAddress, timeout: timeout);
+        sourceAddress: sourceAddress, sourcePort: sourcePort, timeout: timeout);
   }
 
   /// Like [connect], but returns a [Future] that completes with a
   /// [ConnectionTask] that can be cancelled if the [Socket] is no
   /// longer needed.
   static Future<ConnectionTask<Socket>> startConnect(host, int port,
-      {sourceAddress}) {
+      {sourceAddress, int sourcePort = 0}) {
     final IOOverrides? overrides = IOOverrides.current;
     if (overrides == null) {
-      return Socket._startConnect(host, port, sourceAddress: sourceAddress);
+      return Socket._startConnect(host, port,
+          sourceAddress: sourceAddress, sourcePort: sourcePort);
     }
     return overrides.socketStartConnect(host, port,
-        sourceAddress: sourceAddress);
+        sourceAddress: sourceAddress, sourcePort: sourcePort);
   }
 
   external static Future<Socket> _connect(host, int port,
-      {sourceAddress, Duration? timeout});
+      {sourceAddress, int sourcePort = 0, Duration? timeout});
 
   external static Future<ConnectionTask<Socket>> _startConnect(host, int port,
-      {sourceAddress});
+      {sourceAddress, int sourcePort = 0});
 
   /// Destroys the socket in both directions.
   ///
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index 0ea8448..42b7bc2 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -362,9 +362,9 @@
   String toString() => "StdioType: $name";
 }
 
-Stdin? _stdin;
-Stdout? _stdout;
-Stdout? _stderr;
+final Stdin _stdin = _StdIOUtils._getStdioInputStream(_stdinFD);
+final Stdout _stdout = _StdIOUtils._getStdioOutputStream(_stdoutFD);
+final Stdout _stderr = _StdIOUtils._getStdioOutputStream(_stderrFD);
 
 // These may be set to different values by the embedder by calling
 // _setStdioFDs when initializing dart:io.
@@ -381,7 +381,7 @@
 
 /// The standard input stream of data read by this program.
 Stdin get stdin {
-  return _stdin ??= _StdIOUtils._getStdioInputStream(_stdinFD);
+  return IOOverrides.current?.stdin ?? _stdin;
 }
 
 /// The standard output stream of data written by this program.
@@ -390,7 +390,7 @@
 /// result in an unhandled asynchronous error unless there is an error handler
 /// on `done`.
 Stdout get stdout {
-  return _stdout ??= _StdIOUtils._getStdioOutputStream(_stdoutFD);
+  return IOOverrides.current?.stdout ?? _stdout;
 }
 
 /// The standard output stream of errors written by this program.
@@ -399,7 +399,7 @@
 /// result in an unhandled asynchronous error unless there is an error handler
 /// on `done`.
 Stdout get stderr {
-  return _stderr ??= _StdIOUtils._getStdioOutputStream(_stderrFD);
+  return IOOverrides.current?.stderr ?? _stderr;
 }
 
 /// Whether a stream is attached to a file, pipe, terminal, or
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 438e967..48c046f 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -18,8 +18,8 @@
 /// {@category VM}
 library dart.isolate;
 
-import "dart:async";
 import "dart:_internal" show Since;
+import "dart:async";
 import "dart:typed_data" show ByteBuffer, TypedData, Uint8List;
 
 part "capability.dart";
@@ -158,13 +158,6 @@
   /// is a sure way to hang your program.
   external static Isolate get current;
 
-  /// The package root of the current isolate, if any.
-  ///
-  /// This getter returns `null`, as the `packages/` directory is not supported
-  /// in Dart 2.
-  @Deprecated('packages/ directory resolution is not supported in Dart 2.')
-  external static Future<Uri?> get packageRoot;
-
   /// The location of the package configuration of the current isolate, if any.
   ///
   /// If the isolate has not been setup for package resolution,
diff --git a/sdk/lib/js/_js_annotations.dart b/sdk/lib/js/_js_annotations.dart
index b110632..2e24deb 100644
--- a/sdk/lib/js/_js_annotations.dart
+++ b/sdk/lib/js/_js_annotations.dart
@@ -18,10 +18,10 @@
   const _Anonymous();
 }
 
-// class _StaticInterop {
-//   const _StaticInterop();
-// }
+class _StaticInterop {
+  const _StaticInterop();
+}
 
 const _Anonymous anonymous = _Anonymous();
 
-// const _StaticInterop staticInterop = _StaticInterop();
+const _StaticInterop staticInterop = _StaticInterop();
diff --git a/sdk/lib/js_util/js_util.dart b/sdk/lib/js_util/js_util.dart
index 7842a32..fcd668c 100644
--- a/sdk/lib/js_util/js_util.dart
+++ b/sdk/lib/js_util/js_util.dart
@@ -245,7 +245,7 @@
 
 /// Converts a JavaScript Promise to a Dart [Future].
 ///
-/// ```dart template:none
+/// ```dart template:top
 /// @JS()
 /// external Promise<num> get threePromise; // Resolves to 3
 ///
diff --git a/sdk/lib/math/math.dart b/sdk/lib/math/math.dart
index ad1da4d..d9e3f75 100644
--- a/sdk/lib/math/math.dart
+++ b/sdk/lib/math/math.dart
@@ -8,6 +8,71 @@
 /// ```dart
 /// import 'dart:math';
 /// ```
+///
+/// ## Random
+/// [Random] is a generator of [bool], [int] or [double] values.
+/// ```dart
+/// var intValue = Random().nextInt(10); // Value is >= 0.0 and < 1.0.
+/// var doubleValue = Random().nextDouble(); // Value is >= 0.0 and < 1.0.
+/// var boolValue = Random().nextBool(); // true or false, with equal chance.
+/// ```
+///
+/// ## Point
+/// [Point] is a utility class for representing two-dimensional positions.
+/// ```dart
+/// var leftTop = const Point(0, 0);
+/// var rightBottom = const Point(200, 400);
+/// ```
+///
+/// ## Rectangle
+/// [Rectangle] is a class for representing two-dimensional axis-aligned
+/// rectangles whose properties are immutable.
+///
+/// Create a rectangle spanned by the points.
+/// ```dart
+/// var leftTop = const Point(20, 50);
+/// var rightBottom = const Point(300, 600);
+/// var rectangle = Rectangle.fromPoints(leftTop, rightBottom);
+/// print(rectangle.left); // 20
+/// print(rectangle.top); // 50
+/// print(rectangle.right); // 300
+/// print(rectangle.bottom); // 600
+/// ```
+///
+/// Create a rectangle spanned by `(left, top)` and
+/// `(left+width, top+height)`.
+/// ```dart
+/// var rectangle = const Rectangle(20, 50, 300, 600);
+/// print(rectangle.left); // 20
+/// print(rectangle.top); // 50
+/// print(rectangle.right); // 320
+/// print(rectangle.bottom); // 650
+/// ```
+///
+/// ## MutableRectangle
+/// [MutableRectangle] is a class for representing two-dimensional axis-aligned
+/// rectangles with mutable properties.
+///
+/// Create a mutable rectangle spanned by `(left, top)` and
+/// `(left+width, top+height)`.
+/// ```dart
+/// var rectangle = MutableRectangle(20, 50, 300, 600);
+/// print(rectangle); // Rectangle (20, 50) 300 x 600
+/// print(rectangle.left); // 20
+/// print(rectangle.top); // 50
+/// print(rectangle.right); // 320
+/// print(rectangle.bottom); // 650
+///
+/// // Change rectangle width and height.
+/// rectangle.width = 200;
+/// rectangle.height = 100;
+/// print(rectangle); // Rectangle (20, 50) 200 x 100
+/// print(rectangle.left); // 20
+/// print(rectangle.top); // 50
+/// print(rectangle.right); // 220
+/// print(rectangle.bottom); // 150
+/// ```
+///
 /// {@category Core}
 library dart.math;
 
@@ -101,7 +166,7 @@
 ///
 /// - if `y` is zero (0.0 or -0.0), the result is always 1.0.
 /// - if `x` is 1.0, the result is always 1.0.
-/// - otherwise, if either `x` or `y` is NaN then the result is NaN.
+/// - otherwise, if either `x` or `y` is NaN, then the result is NaN.
 /// - if `x` is negative (but not -0.0) and `y` is a finite non-integer, the
 ///   result is NaN.
 /// - if `x` is Infinity and `y` is negative, the result is 0.0.
@@ -165,6 +230,16 @@
 /// value.
 ///
 /// Returns -0.0 if [x] is -0.0, and NaN if [x] is otherwise negative or NaN.
+/// ```dart
+/// var result = sqrt(9.3);
+/// print(result); // 3.0495901363953815
+/// result = sqrt(2);
+/// print(result); // 1.4142135623730951
+/// result = sqrt(0);
+/// print(result); // 0.0
+/// result = sqrt(-2.2);
+/// print(result); // NaN
+/// ```
 external double sqrt(num x);
 
 /// Converts [x] to a [double] and returns the natural exponent, [e],
diff --git a/sdk/lib/math/point.dart b/sdk/lib/math/point.dart
index df26e9a..1291e23 100644
--- a/sdk/lib/math/point.dart
+++ b/sdk/lib/math/point.dart
@@ -5,6 +5,12 @@
 part of dart.math;
 
 /// A utility class for representing two-dimensional positions.
+///
+/// Example:
+/// ```dart
+/// var leftTop = const Point(0, 0);
+/// var rightBottom = const Point(200, 400);
+/// ```
 class Point<T extends num> {
   final T x;
   final T y;
@@ -21,6 +27,12 @@
   /// Returns `true` if [other] is a [Point] with [x] and [y]
   /// coordinates equal to the corresponding coordinates of this point,
   /// and `false` otherwise.
+  ///
+  /// Example:
+  /// ```dart
+  /// var result = const Point(0, 0) == const Point(0, 0); // true
+  /// result = const Point(1.0, 0) == const Point(-1.0, 0); // false
+  /// ```
   bool operator ==(Object other) =>
       other is Point && x == other.x && y == other.y;
 
@@ -29,6 +41,12 @@
   /// Add [other] to `this`, as if both points were vectors.
   ///
   /// Returns the resulting "vector" as a Point.
+  ///
+  /// Example:
+  /// ```dart
+  /// var point = const Point(10, 100) + const Point(10, 10); // Point(20, 110)
+  /// point = const Point(-10, -20) + const Point(10, 100); // Point(0, 80)
+  /// ```
   Point<T> operator +(Point<T> other) {
     return Point<T>((x + other.x) as T, (y + other.y) as T);
   }
@@ -36,26 +54,57 @@
   /// Subtract [other] from `this`, as if both points were vectors.
   ///
   /// Returns the resulting "vector" as a Point.
+  ///
+  /// Example:
+  /// ```dart
+  /// var point = const Point(10, 100) - const Point(10, 10); // Point(0, 90)
+  /// point = const Point(-10, -20) - const Point(10, 100); // Point(-110, -120)
+  /// ```
   Point<T> operator -(Point<T> other) {
     return Point<T>((x - other.x) as T, (y - other.y) as T);
   }
 
   /// Scale this point by [factor] as if it were a vector.
   ///
-  /// *Important* *Note*: This function accepts a `num` as its argument only so
+  /// **Important Note**: This function accepts a `num` as its argument only so
   /// that you can scale `Point<double>` objects by an `int` factor. Because the
   /// `*` operator always returns the same type of `Point` as it is called on,
   /// passing in a double [factor] on a `Point<int>` _causes_ _a_
   /// _runtime_ _error_.
+  ///
+  /// Example:
+  /// ```dart
+  /// // Integer values.
+  /// var point = const Point(10, 100) * 10; // Point(100, 1000)
+  /// point = const Point(-10, -100) * 5; // Point(-50, -500)
+  /// // Double values.
+  /// var doublePoint = Point(10.0, 100.0) * 1.5; // Point(15.0, 150.0)
+  /// // Runtime error due the invalid type cast.
+  /// var newPoint = const Point(10, 100) * 1.5; // Throws.
+  /// ```
   Point<T> operator *(num /*T|int*/ factor) {
     return Point<T>((x * factor) as T, (y * factor) as T);
   }
 
   /// Get the straight line (Euclidean) distance between the origin (0, 0) and
   /// this point.
+  ///
+  /// Example:
+  /// ```dart
+  /// var magnitude = const Point(0, 0).magnitude; // 0.0
+  /// magnitude = const Point(10, 0).magnitude;  // 10.0
+  /// magnitude = const Point(0, -10).magnitude; // 10.0
+  /// magnitude = const Point(10, 10).magnitude;  // 14.142135623730951
+  /// ```
   double get magnitude => sqrt(x * x + y * y);
 
   /// Returns the distance between `this` and [other].
+  /// ```dart
+  /// var distanceTo = const Point(0, 0).distanceTo(const Point(0, 0)); // 0.0
+  /// distanceTo = const Point(0, 0).distanceTo(const Point(10, 0)); // 10.0
+  /// distanceTo = const Point(0, 0).distanceTo(const Point(0, -10)); // 10.0
+  /// distanceTo = const Point(-10, 0).distanceTo(const Point(100, 0)); // 110.0
+  /// ```
   double distanceTo(Point<T> other) {
     var dx = x - other.x;
     var dy = y - other.y;
@@ -66,6 +115,18 @@
   ///
   /// Squared distances can be used for comparisons when the actual value is not
   /// required.
+  ///
+  /// Example:
+  /// ```dart
+  /// var squaredDistance =
+  ///     const Point(0, 0).squaredDistanceTo(const Point(0, 0)); // 0.0
+  /// squaredDistance =
+  ///     const Point(0, 0).squaredDistanceTo(const Point(10, 0)); // 100
+  /// squaredDistance =
+  ///     const Point(0, 0).squaredDistanceTo(const Point(0, -10)); // 100
+  /// squaredDistance =
+  ///     const Point(-10, 0).squaredDistanceTo(const Point(100, 0)); // 12100
+  /// ```
   T squaredDistanceTo(Point<T> other) {
     var dx = x - other.x;
     var dy = y - other.y;
diff --git a/sdk/lib/math/rectangle.dart b/sdk/lib/math/rectangle.dart
index 1fe8ea9..fd7d783 100644
--- a/sdk/lib/math/rectangle.dart
+++ b/sdk/lib/math/rectangle.dart
@@ -11,7 +11,7 @@
 /// computer graphics.
 ///
 /// See also:
-///    [W3C Coordinate Systems Specification](http://www.w3.org/TR/SVG/coords.html#InitialCoordinateSystem).
+///    [W3C Coordinate Systems Specification](https://www.w3.org/TR/SVG/coords.html#InitialCoordinateSystem).
 ///
 /// The rectangle is the set of points with representable coordinates greater
 /// than or equal to left/top, and with distance to left/top no greater than
@@ -135,6 +135,15 @@
   ///
   /// If `width` and `height` are zero, the "rectangle" comprises only the
   /// single point `(left, top)`.
+  ///
+  /// Example:
+  /// ```dart
+  /// var rectangle = const Rectangle(20, 50, 300, 600);
+  /// print(rectangle.left); // 20
+  /// print(rectangle.top); // 50
+  /// print(rectangle.right); // 320
+  /// print(rectangle.bottom); // 650
+  /// ```
   const Rectangle(this.left, this.top, T width, T height)
       : width = (width < 0)
             ? (width == double.negativeInfinity ? 0.0 : (-width * 0)) as dynamic
@@ -154,6 +163,19 @@
   /// (which can happen if one or both is a double),
   /// the actual right edge might be slightly off from `max(a.x, b.x)`.
   /// Similar for the y-coordinates and the bottom edge.
+  ///
+  /// Example:
+  /// ```dart
+  /// var leftTop = const Point(20, 50);
+  /// var rightBottom = const Point(300, 600);
+  ///
+  /// var rectangle = Rectangle.fromPoints(leftTop, rightBottom);
+  /// print(rectangle); // Rectangle (20, 50) 280 x 550
+  /// print(rectangle.left); // 20
+  /// print(rectangle.top); // 50
+  /// print(rectangle.right); // 300
+  /// print(rectangle.bottom); // 600
+  /// ```
   factory Rectangle.fromPoints(Point<T> a, Point<T> b) {
     T left = min(a.x, b.x);
     T width = (max(a.x, b.x) - left) as T;
@@ -191,6 +213,26 @@
   ///
   /// If `width` and `height` are zero, the "rectangle" comprises only the
   /// single point `(left, top)`.
+  ///
+  /// Example:
+  /// ```dart
+  /// var rectangle = MutableRectangle(20, 50, 300, 600);
+  /// print(rectangle); // Rectangle (20, 50) 300 x 600
+  /// print(rectangle.left); // 20
+  /// print(rectangle.top); // 50
+  /// print(rectangle.right); // 320
+  /// print(rectangle.bottom); // 650
+  ///
+  /// // Change rectangle width and height.
+  /// rectangle.width = 200;
+  /// rectangle.height = 100;
+  ///
+  /// print(rectangle); // Rectangle (20, 50) 200 x 100
+  /// print(rectangle.left); // 20
+  /// print(rectangle.top); // 50
+  /// print(rectangle.right); // 220
+  /// print(rectangle.bottom); // 150
+  /// ```
   MutableRectangle(this.left, this.top, T width, T height)
       : this._width =
             (width < 0) ? _clampToZero<T>(width) : (width + 0 as dynamic),
@@ -207,6 +249,18 @@
   /// (which can happen if one or both is a double),
   /// the actual right edge might be slightly off from `max(a.x, b.x)`.
   /// Similar for the y-coordinates and the bottom edge.
+  ///
+  /// Example:
+  /// ```dart
+  /// var leftTop = const Point(20, 50);
+  /// var rightBottom = const Point(300, 600);
+  /// var rectangle = MutableRectangle.fromPoints(leftTop, rightBottom);
+  /// print(rectangle); // Rectangle (20, 50) 280 x 550
+  /// print(rectangle.left); // 20
+  /// print(rectangle.top); // 50
+  /// print(rectangle.right); // 300
+  /// print(rectangle.bottom); // 600
+  /// ```
   factory MutableRectangle.fromPoints(Point<T> a, Point<T> b) {
     T left = min(a.x, b.x);
     T width = (max(a.x, b.x) - left) as T;
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index aa97d19..9b2e992 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -17,7 +17,7 @@
 import 'dart:html_common';
 import 'dart:_js_helper' show Creates, Returns, JSName, Native;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor;
+import 'dart:_interceptors' show JavaScriptObject;
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:svg library.
@@ -66,7 +66,7 @@
 
 @Unstable()
 @Native("SVGAngle")
-class Angle extends Interceptor {
+class Angle extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Angle._() {
     throw new UnsupportedError("Not supported");
@@ -196,7 +196,7 @@
 
 @Unstable()
 @Native("SVGAnimatedAngle")
-class AnimatedAngle extends Interceptor {
+class AnimatedAngle extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedAngle._() {
     throw new UnsupportedError("Not supported");
@@ -212,7 +212,7 @@
 
 @Unstable()
 @Native("SVGAnimatedBoolean")
-class AnimatedBoolean extends Interceptor {
+class AnimatedBoolean extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedBoolean._() {
     throw new UnsupportedError("Not supported");
@@ -230,7 +230,7 @@
 
 @Unstable()
 @Native("SVGAnimatedEnumeration")
-class AnimatedEnumeration extends Interceptor {
+class AnimatedEnumeration extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedEnumeration._() {
     throw new UnsupportedError("Not supported");
@@ -248,7 +248,7 @@
 
 @Unstable()
 @Native("SVGAnimatedInteger")
-class AnimatedInteger extends Interceptor {
+class AnimatedInteger extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedInteger._() {
     throw new UnsupportedError("Not supported");
@@ -266,7 +266,7 @@
 
 @Unstable()
 @Native("SVGAnimatedLength")
-class AnimatedLength extends Interceptor {
+class AnimatedLength extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedLength._() {
     throw new UnsupportedError("Not supported");
@@ -282,7 +282,7 @@
 
 @Unstable()
 @Native("SVGAnimatedLengthList")
-class AnimatedLengthList extends Interceptor {
+class AnimatedLengthList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedLengthList._() {
     throw new UnsupportedError("Not supported");
@@ -298,7 +298,7 @@
 
 @Unstable()
 @Native("SVGAnimatedNumber")
-class AnimatedNumber extends Interceptor {
+class AnimatedNumber extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedNumber._() {
     throw new UnsupportedError("Not supported");
@@ -316,7 +316,7 @@
 
 @Unstable()
 @Native("SVGAnimatedNumberList")
-class AnimatedNumberList extends Interceptor {
+class AnimatedNumberList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedNumberList._() {
     throw new UnsupportedError("Not supported");
@@ -332,7 +332,7 @@
 
 @Unstable()
 @Native("SVGAnimatedPreserveAspectRatio")
-class AnimatedPreserveAspectRatio extends Interceptor {
+class AnimatedPreserveAspectRatio extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedPreserveAspectRatio._() {
     throw new UnsupportedError("Not supported");
@@ -348,7 +348,7 @@
 
 @Unstable()
 @Native("SVGAnimatedRect")
-class AnimatedRect extends Interceptor {
+class AnimatedRect extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedRect._() {
     throw new UnsupportedError("Not supported");
@@ -364,7 +364,7 @@
 
 @Unstable()
 @Native("SVGAnimatedString")
-class AnimatedString extends Interceptor {
+class AnimatedString extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedString._() {
     throw new UnsupportedError("Not supported");
@@ -382,7 +382,7 @@
 
 @Unstable()
 @Native("SVGAnimatedTransformList")
-class AnimatedTransformList extends Interceptor {
+class AnimatedTransformList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AnimatedTransformList._() {
     throw new UnsupportedError("Not supported");
@@ -1785,7 +1785,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Unstable()
-abstract class FilterPrimitiveStandardAttributes extends Interceptor {
+abstract class FilterPrimitiveStandardAttributes extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory FilterPrimitiveStandardAttributes._() {
     throw new UnsupportedError("Not supported");
@@ -1806,7 +1806,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Unstable()
-abstract class FitToViewBox extends Interceptor {
+abstract class FitToViewBox extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory FitToViewBox._() {
     throw new UnsupportedError("Not supported");
@@ -1986,7 +1986,7 @@
 
 @Unstable()
 @Native("SVGLength")
-class Length extends Interceptor {
+class Length extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Length._() {
     throw new UnsupportedError("Not supported");
@@ -2038,7 +2038,7 @@
 
 @Unstable()
 @Native("SVGLengthList")
-class LengthList extends Interceptor
+class LengthList extends JavaScriptObject
     with ListMixin<Length>, ImmutableListMixin<Length>
     implements List<Length> {
   // To suppress missing implicit constructor warnings.
@@ -2271,7 +2271,7 @@
 
 @Unstable()
 @Native("SVGMatrix")
-class Matrix extends Interceptor {
+class Matrix extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Matrix._() {
     throw new UnsupportedError("Not supported");
@@ -2347,7 +2347,7 @@
 
 @Unstable()
 @Native("SVGNumber")
-class Number extends Interceptor {
+class Number extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Number._() {
     throw new UnsupportedError("Not supported");
@@ -2363,7 +2363,7 @@
 
 @Unstable()
 @Native("SVGNumberList")
-class NumberList extends Interceptor
+class NumberList extends JavaScriptObject
     with ListMixin<Number>, ImmutableListMixin<Number>
     implements List<Number> {
   // To suppress missing implicit constructor warnings.
@@ -2514,7 +2514,7 @@
 
 @Unstable()
 @Native("SVGPoint")
-class Point extends Interceptor {
+class Point extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Point._() {
     throw new UnsupportedError("Not supported");
@@ -2536,7 +2536,7 @@
 
 @Unstable()
 @Native("SVGPointList")
-class PointList extends Interceptor {
+class PointList extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PointList._() {
     throw new UnsupportedError("Not supported");
@@ -2620,7 +2620,7 @@
 
 @Unstable()
 @Native("SVGPreserveAspectRatio")
-class PreserveAspectRatio extends Interceptor {
+class PreserveAspectRatio extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PreserveAspectRatio._() {
     throw new UnsupportedError("Not supported");
@@ -2702,7 +2702,7 @@
 
 @Unstable()
 @Native("SVGRect")
-class Rect extends Interceptor {
+class Rect extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Rect._() {
     throw new UnsupportedError("Not supported");
@@ -2846,7 +2846,7 @@
 
 @Unstable()
 @Native("SVGStringList")
-class StringList extends Interceptor
+class StringList extends JavaScriptObject
     with ListMixin<String>, ImmutableListMixin<String>
     implements List<String> {
   // To suppress missing implicit constructor warnings.
@@ -3619,7 +3619,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Unstable()
-abstract class Tests extends Interceptor {
+abstract class Tests extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Tests._() {
     throw new UnsupportedError("Not supported");
@@ -3791,7 +3791,7 @@
 
 @Unstable()
 @Native("SVGTransform")
-class Transform extends Interceptor {
+class Transform extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Transform._() {
     throw new UnsupportedError("Not supported");
@@ -3835,7 +3835,7 @@
 
 @Unstable()
 @Native("SVGTransformList")
-class TransformList extends Interceptor
+class TransformList extends JavaScriptObject
     with ListMixin<Transform>, ImmutableListMixin<Transform>
     implements List<Transform> {
   // To suppress missing implicit constructor warnings.
@@ -3917,7 +3917,7 @@
 
 @Unstable()
 @Native("SVGUnitTypes")
-class UnitTypes extends Interceptor {
+class UnitTypes extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory UnitTypes._() {
     throw new UnsupportedError("Not supported");
@@ -3934,7 +3934,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Unstable()
-abstract class UriReference extends Interceptor {
+abstract class UriReference extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory UriReference._() {
     throw new UnsupportedError("Not supported");
@@ -4013,7 +4013,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Unstable()
-abstract class ZoomAndPan extends Interceptor {
+abstract class ZoomAndPan extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ZoomAndPan._() {
     throw new UnsupportedError("Not supported");
diff --git a/sdk/lib/vmservice/client.dart b/sdk/lib/vmservice/client.dart
index 65a72ba..7ce9c51 100644
--- a/sdk/lib/vmservice/client.dart
+++ b/sdk/lib/vmservice/client.dart
@@ -20,9 +20,12 @@
   set name(String? n) => _name = (n ?? defaultClientName);
   late String _name;
 
-  /// A set streamIds which describes the streams the client is connected to
+  /// The set of streams the client is subscribed to.
   final streams = <String>{};
 
+  /// The set of user tags that the client wants to receive CPU samples for.
+  final profilerUserTagFilters = <String>{};
+
   /// Services registered and their aliases
   /// key: service
   /// value: alias
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index ed389a7..5af3cfd 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -228,6 +228,8 @@
 
   final devfs = DevFS();
 
+  final _profilerUserTagSubscriptions = <String>{};
+
   Uri? get ddsUri => _ddsUri;
   Uri? _ddsUri;
 
@@ -300,7 +302,7 @@
         _vmCancelStream(streamId);
       }
     }
-
+    _cleanupUnusedUserTagSubscriptions();
     for (final service in client.services.keys) {
       _eventMessageHandler(
           'Service',
@@ -336,10 +338,35 @@
     }
   }
 
+  void _profilerEventMessageHandler(Client client, Response event) {
+    final eventJson = event.decodeJson() as Map<String, dynamic>;
+    final eventData = eventJson['params']!['event']!;
+    if (eventData['kind']! != 'CpuSamples') {
+      client.post(event);
+      return;
+    }
+    final cpuSamplesEvent = eventData['cpuSamples']!;
+    final updatedSamples = cpuSamplesEvent['samples']!
+        .where(
+          (s) => client.profilerUserTagFilters.contains(s['userTag']),
+        )
+        .toList();
+    if (updatedSamples.isEmpty) {
+      return;
+    }
+    cpuSamplesEvent['samples'] = updatedSamples;
+    cpuSamplesEvent['sampleCount'] = updatedSamples.length;
+    client.post(Response.json(eventJson));
+  }
+
   void _eventMessageHandler(String streamId, Response event) {
     for (final client in clients) {
       if (client.sendEvents && client.streams.contains(streamId)) {
-        client.post(event);
+        if (streamId == 'Profiler') {
+          _profilerEventMessageHandler(client, event);
+        } else {
+          client.post(event);
+        }
       }
     }
   }
@@ -665,6 +692,57 @@
     return encodeResult(message, protocols);
   }
 
+  void _cleanupUnusedUserTagSubscriptions() {
+    final unsubscribeableTags = <String>[];
+    for (final subscribedTag in _profilerUserTagSubscriptions) {
+      bool hasSubscriber = false;
+      for (final c in clients) {
+        if (c.profilerUserTagFilters.contains(subscribedTag)) {
+          hasSubscriber = true;
+          break;
+        }
+      }
+      if (!hasSubscriber) {
+        unsubscribeableTags.add(subscribedTag);
+      }
+    }
+    if (unsubscribeableTags.isNotEmpty) {
+      _profilerUserTagSubscriptions.removeAll(unsubscribeableTags);
+      _removeUserTagsFromStreamableSampleList(unsubscribeableTags);
+    }
+  }
+
+  Future<String> _streamCpuSamplesWithUserTag(Message message) async {
+    if (!message.params.containsKey('userTags')) {
+      return encodeRpcError(message, kInvalidParams,
+          details: "Missing required parameter 'userTags'.");
+    }
+
+    // TODO(bkonyi): handle "subscribe all" case.
+    final client = message.client!;
+    final tags = message.params['userTags']!.cast<String>().toSet();
+    final newTags = tags.difference(_profilerUserTagSubscriptions);
+
+    // Clear the previously set user tag subscriptions for the client and
+    // update with the new list of user tags.
+    client.profilerUserTagFilters.clear();
+    _profilerUserTagSubscriptions.addAll(tags);
+    client.profilerUserTagFilters.addAll(tags);
+
+    // If any previously unseen user tag is provided, let the VM know that
+    // samples with that user tag should be streamed on the Profiler stream.
+    if (newTags.isNotEmpty) {
+      _addUserTagsToStreamableSampleList(newTags.toList());
+    }
+
+    // Some user tags may no longer be of any interest to the existing clients.
+    // Check that all user tags have at least one client interested in them,
+    // otherwise notify the VM that we're no longer interested in samples with
+    // those user tags.
+    _cleanupUnusedUserTagSubscriptions();
+    return encodeSuccess(message);
+  }
+
   Future<Response?> routeRequest(VMService _, Message message) async {
     final response = await _routeRequestImpl(message);
     if (response == null) {
@@ -695,6 +773,9 @@
       if (message.method == 'getSupportedProtocols') {
         return await _getSupportedProtocols(message);
       }
+      if (message.method == 'streamCpuSamplesWithUserTag') {
+        return await _streamCpuSamplesWithUserTag(message);
+      }
       if (devfs.shouldHandleMessage(message)) {
         return await devfs.handleMessage(message);
       }
@@ -759,3 +840,9 @@
 /// Get the bytes to the tar archive.
 @pragma("vm:external-name", "VMService_RequestAssets")
 external Uint8List _requestAssets();
+
+@pragma("vm:external-name", "VMService_AddUserTagsToStreamableSampleList")
+external void _addUserTagsToStreamableSampleList(List<String> userTags);
+
+@pragma("vm:external-name", "VMService_RemoveUserTagsFromStreamableSampleList")
+external void _removeUserTagsFromStreamableSampleList(List<String> userTags);
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 506f9e6..a7db2d5 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -13,7 +13,7 @@
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor;
+import 'dart:_interceptors' show JavaScriptObject;
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
@@ -81,7 +81,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AudioBuffer")
-class AudioBuffer extends Interceptor {
+class AudioBuffer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AudioBuffer._() {
     throw new UnsupportedError("Not supported");
@@ -268,7 +268,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AudioListener")
-class AudioListener extends Interceptor {
+class AudioListener extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AudioListener._() {
     throw new UnsupportedError("Not supported");
@@ -343,7 +343,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AudioParam")
-class AudioParam extends Interceptor {
+class AudioParam extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AudioParam._() {
     throw new UnsupportedError("Not supported");
@@ -379,7 +379,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AudioParamMap")
-class AudioParamMap extends Interceptor with MapMixin<String, dynamic> {
+class AudioParamMap extends JavaScriptObject with MapMixin<String, dynamic> {
   // To suppress missing implicit constructor warnings.
   factory AudioParamMap._() {
     throw new UnsupportedError("Not supported");
@@ -495,7 +495,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AudioTrack")
-class AudioTrack extends Interceptor {
+class AudioTrack extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AudioTrack._() {
     throw new UnsupportedError("Not supported");
@@ -589,7 +589,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("AudioWorkletProcessor")
-class AudioWorkletProcessor extends Interceptor {
+class AudioWorkletProcessor extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AudioWorkletProcessor._() {
     throw new UnsupportedError("Not supported");
@@ -1196,7 +1196,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("PeriodicWave")
-class PeriodicWave extends Interceptor {
+class PeriodicWave extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory PeriodicWave._() {
     throw new UnsupportedError("Not supported");
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 072cfae..473059f 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -15,7 +15,7 @@
 import 'dart:_js_helper'
     show Creates, JSName, Native, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor, JSExtendableArray;
+import 'dart:_interceptors' show JavaScriptObject, JSExtendableArray;
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:web_gl library.
@@ -26,7 +26,7 @@
 
 @Unstable()
 @Native("WebGLActiveInfo")
-class ActiveInfo extends Interceptor {
+class ActiveInfo extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ActiveInfo._() {
     throw new UnsupportedError("Not supported");
@@ -43,7 +43,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("ANGLEInstancedArrays,ANGLE_instanced_arrays")
-class AngleInstancedArrays extends Interceptor {
+class AngleInstancedArrays extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory AngleInstancedArrays._() {
     throw new UnsupportedError("Not supported");
@@ -68,7 +68,7 @@
 
 @Unstable()
 @Native("WebGLBuffer")
-class Buffer extends Interceptor {
+class Buffer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Buffer._() {
     throw new UnsupportedError("Not supported");
@@ -79,7 +79,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLCanvas")
-class Canvas extends Interceptor {
+class Canvas extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Canvas._() {
     throw new UnsupportedError("Not supported");
@@ -97,7 +97,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLColorBufferFloat")
-class ColorBufferFloat extends Interceptor {
+class ColorBufferFloat extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ColorBufferFloat._() {
     throw new UnsupportedError("Not supported");
@@ -108,7 +108,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLCompressedTextureASTC")
-class CompressedTextureAstc extends Interceptor {
+class CompressedTextureAstc extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureAstc._() {
     throw new UnsupportedError("Not supported");
@@ -175,7 +175,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLCompressedTextureATC,WEBGL_compressed_texture_atc")
-class CompressedTextureAtc extends Interceptor {
+class CompressedTextureAtc extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureAtc._() {
     throw new UnsupportedError("Not supported");
@@ -192,7 +192,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLCompressedTextureETC1,WEBGL_compressed_texture_etc1")
-class CompressedTextureETC1 extends Interceptor {
+class CompressedTextureETC1 extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureETC1._() {
     throw new UnsupportedError("Not supported");
@@ -205,7 +205,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLCompressedTextureETC")
-class CompressedTextureEtc extends Interceptor {
+class CompressedTextureEtc extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureEtc._() {
     throw new UnsupportedError("Not supported");
@@ -236,7 +236,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLCompressedTexturePVRTC,WEBGL_compressed_texture_pvrtc")
-class CompressedTexturePvrtc extends Interceptor {
+class CompressedTexturePvrtc extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CompressedTexturePvrtc._() {
     throw new UnsupportedError("Not supported");
@@ -255,7 +255,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLCompressedTextureS3TC,WEBGL_compressed_texture_s3tc")
-class CompressedTextureS3TC extends Interceptor {
+class CompressedTextureS3TC extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureS3TC._() {
     throw new UnsupportedError("Not supported");
@@ -274,7 +274,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLCompressedTextureS3TCsRGB")
-class CompressedTextureS3TCsRgb extends Interceptor {
+class CompressedTextureS3TCsRgb extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureS3TCsRgb._() {
     throw new UnsupportedError("Not supported");
@@ -319,7 +319,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLDebugRendererInfo,WEBGL_debug_renderer_info")
-class DebugRendererInfo extends Interceptor {
+class DebugRendererInfo extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DebugRendererInfo._() {
     throw new UnsupportedError("Not supported");
@@ -334,7 +334,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLDebugShaders,WEBGL_debug_shaders")
-class DebugShaders extends Interceptor {
+class DebugShaders extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DebugShaders._() {
     throw new UnsupportedError("Not supported");
@@ -347,7 +347,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLDepthTexture,WEBGL_depth_texture")
-class DepthTexture extends Interceptor {
+class DepthTexture extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DepthTexture._() {
     throw new UnsupportedError("Not supported");
@@ -360,7 +360,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLDrawBuffers,WEBGL_draw_buffers")
-class DrawBuffers extends Interceptor {
+class DrawBuffers extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory DrawBuffers._() {
     throw new UnsupportedError("Not supported");
@@ -374,7 +374,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTsRGB,EXT_sRGB")
-class EXTsRgb extends Interceptor {
+class EXTsRgb extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory EXTsRgb._() {
     throw new UnsupportedError("Not supported");
@@ -393,7 +393,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTBlendMinMax,EXT_blend_minmax")
-class ExtBlendMinMax extends Interceptor {
+class ExtBlendMinMax extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ExtBlendMinMax._() {
     throw new UnsupportedError("Not supported");
@@ -408,7 +408,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTColorBufferFloat")
-class ExtColorBufferFloat extends Interceptor {
+class ExtColorBufferFloat extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ExtColorBufferFloat._() {
     throw new UnsupportedError("Not supported");
@@ -419,7 +419,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTColorBufferHalfFloat")
-class ExtColorBufferHalfFloat extends Interceptor {
+class ExtColorBufferHalfFloat extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ExtColorBufferHalfFloat._() {
     throw new UnsupportedError("Not supported");
@@ -430,7 +430,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTDisjointTimerQuery")
-class ExtDisjointTimerQuery extends Interceptor {
+class ExtDisjointTimerQuery extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ExtDisjointTimerQuery._() {
     throw new UnsupportedError("Not supported");
@@ -479,7 +479,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTDisjointTimerQueryWebGL2")
-class ExtDisjointTimerQueryWebGL2 extends Interceptor {
+class ExtDisjointTimerQueryWebGL2 extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ExtDisjointTimerQueryWebGL2._() {
     throw new UnsupportedError("Not supported");
@@ -501,7 +501,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTFragDepth,EXT_frag_depth")
-class ExtFragDepth extends Interceptor {
+class ExtFragDepth extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ExtFragDepth._() {
     throw new UnsupportedError("Not supported");
@@ -512,7 +512,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTShaderTextureLOD,EXT_shader_texture_lod")
-class ExtShaderTextureLod extends Interceptor {
+class ExtShaderTextureLod extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ExtShaderTextureLod._() {
     throw new UnsupportedError("Not supported");
@@ -523,7 +523,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("EXTTextureFilterAnisotropic,EXT_texture_filter_anisotropic")
-class ExtTextureFilterAnisotropic extends Interceptor {
+class ExtTextureFilterAnisotropic extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ExtTextureFilterAnisotropic._() {
     throw new UnsupportedError("Not supported");
@@ -539,7 +539,7 @@
 
 @Unstable()
 @Native("WebGLFramebuffer")
-class Framebuffer extends Interceptor {
+class Framebuffer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Framebuffer._() {
     throw new UnsupportedError("Not supported");
@@ -550,7 +550,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLGetBufferSubDataAsync")
-class GetBufferSubDataAsync extends Interceptor {
+class GetBufferSubDataAsync extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory GetBufferSubDataAsync._() {
     throw new UnsupportedError("Not supported");
@@ -566,7 +566,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLLoseContext,WebGLExtensionLoseContext,WEBGL_lose_context")
-class LoseContext extends Interceptor {
+class LoseContext extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory LoseContext._() {
     throw new UnsupportedError("Not supported");
@@ -581,7 +581,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OESElementIndexUint,OES_element_index_uint")
-class OesElementIndexUint extends Interceptor {
+class OesElementIndexUint extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory OesElementIndexUint._() {
     throw new UnsupportedError("Not supported");
@@ -592,7 +592,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OESStandardDerivatives,OES_standard_derivatives")
-class OesStandardDerivatives extends Interceptor {
+class OesStandardDerivatives extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory OesStandardDerivatives._() {
     throw new UnsupportedError("Not supported");
@@ -605,7 +605,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OESTextureFloat,OES_texture_float")
-class OesTextureFloat extends Interceptor {
+class OesTextureFloat extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory OesTextureFloat._() {
     throw new UnsupportedError("Not supported");
@@ -616,7 +616,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OESTextureFloatLinear,OES_texture_float_linear")
-class OesTextureFloatLinear extends Interceptor {
+class OesTextureFloatLinear extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory OesTextureFloatLinear._() {
     throw new UnsupportedError("Not supported");
@@ -627,7 +627,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OESTextureHalfFloat,OES_texture_half_float")
-class OesTextureHalfFloat extends Interceptor {
+class OesTextureHalfFloat extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory OesTextureHalfFloat._() {
     throw new UnsupportedError("Not supported");
@@ -640,7 +640,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OESTextureHalfFloatLinear,OES_texture_half_float_linear")
-class OesTextureHalfFloatLinear extends Interceptor {
+class OesTextureHalfFloatLinear extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory OesTextureHalfFloatLinear._() {
     throw new UnsupportedError("Not supported");
@@ -651,7 +651,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("OESVertexArrayObject,OES_vertex_array_object")
-class OesVertexArrayObject extends Interceptor {
+class OesVertexArrayObject extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory OesVertexArrayObject._() {
     throw new UnsupportedError("Not supported");
@@ -677,7 +677,7 @@
 
 @Unstable()
 @Native("WebGLProgram")
-class Program extends Interceptor {
+class Program extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Program._() {
     throw new UnsupportedError("Not supported");
@@ -688,7 +688,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLQuery")
-class Query extends Interceptor {
+class Query extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Query._() {
     throw new UnsupportedError("Not supported");
@@ -700,7 +700,7 @@
 
 @Unstable()
 @Native("WebGLRenderbuffer")
-class Renderbuffer extends Interceptor {
+class Renderbuffer extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Renderbuffer._() {
     throw new UnsupportedError("Not supported");
@@ -714,7 +714,8 @@
 @SupportedBrowser(SupportedBrowser.FIREFOX)
 @Unstable()
 @Native("WebGLRenderingContext")
-class RenderingContext extends Interceptor implements CanvasRenderingContext {
+class RenderingContext extends JavaScriptObject
+    implements CanvasRenderingContext {
   // To suppress missing implicit constructor warnings.
   factory RenderingContext._() {
     throw new UnsupportedError("Not supported");
@@ -1356,7 +1357,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGL2RenderingContext")
-class RenderingContext2 extends Interceptor
+class RenderingContext2 extends JavaScriptObject
     implements _WebGL2RenderingContextBase, _WebGLRenderingContextBase {
   // To suppress missing implicit constructor warnings.
   factory RenderingContext2._() {
@@ -2834,7 +2835,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLSampler")
-class Sampler extends Interceptor {
+class Sampler extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Sampler._() {
     throw new UnsupportedError("Not supported");
@@ -2845,7 +2846,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLShader")
-class Shader extends Interceptor {
+class Shader extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Shader._() {
     throw new UnsupportedError("Not supported");
@@ -2856,7 +2857,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLShaderPrecisionFormat")
-class ShaderPrecisionFormat extends Interceptor {
+class ShaderPrecisionFormat extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory ShaderPrecisionFormat._() {
     throw new UnsupportedError("Not supported");
@@ -2873,7 +2874,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLSync")
-class Sync extends Interceptor {
+class Sync extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Sync._() {
     throw new UnsupportedError("Not supported");
@@ -2884,7 +2885,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLTexture")
-class Texture extends Interceptor {
+class Texture extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory Texture._() {
     throw new UnsupportedError("Not supported");
@@ -2903,7 +2904,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLTimerQueryEXT")
-class TimerQueryExt extends Interceptor {
+class TimerQueryExt extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TimerQueryExt._() {
     throw new UnsupportedError("Not supported");
@@ -2914,7 +2915,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLTransformFeedback")
-class TransformFeedback extends Interceptor {
+class TransformFeedback extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory TransformFeedback._() {
     throw new UnsupportedError("Not supported");
@@ -2925,7 +2926,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLUniformLocation")
-class UniformLocation extends Interceptor {
+class UniformLocation extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory UniformLocation._() {
     throw new UnsupportedError("Not supported");
@@ -2936,7 +2937,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLVertexArrayObject")
-class VertexArrayObject extends Interceptor {
+class VertexArrayObject extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VertexArrayObject._() {
     throw new UnsupportedError("Not supported");
@@ -2947,7 +2948,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGLVertexArrayObjectOES")
-class VertexArrayObjectOes extends Interceptor {
+class VertexArrayObjectOes extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory VertexArrayObjectOes._() {
     throw new UnsupportedError("Not supported");
@@ -4161,7 +4162,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("WebGL2RenderingContextBase")
-abstract class _WebGL2RenderingContextBase extends Interceptor
+abstract class _WebGL2RenderingContextBase extends JavaScriptObject
     implements _WebGLRenderingContextBase {
   // To suppress missing implicit constructor warnings.
   factory _WebGL2RenderingContextBase._() {
@@ -4174,7 +4175,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-abstract class _WebGLRenderingContextBase extends Interceptor {
+abstract class _WebGLRenderingContextBase extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory _WebGLRenderingContextBase._() {
     throw new UnsupportedError("Not supported");
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index 863ba21..584b15a 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -19,7 +19,7 @@
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor;
+import 'dart:_interceptors' show JavaScriptObject;
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
@@ -72,7 +72,7 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
 @Native("Database")
-class SqlDatabase extends Interceptor {
+class SqlDatabase extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SqlDatabase._() {
     throw new UnsupportedError("Not supported");
@@ -165,7 +165,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SQLError")
-class SqlError extends Interceptor {
+class SqlError extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SqlError._() {
     throw new UnsupportedError("Not supported");
@@ -196,7 +196,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SQLResultSet")
-class SqlResultSet extends Interceptor {
+class SqlResultSet extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SqlResultSet._() {
     throw new UnsupportedError("Not supported");
@@ -213,7 +213,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @Native("SQLResultSetRowList")
-class SqlResultSetRowList extends Interceptor
+class SqlResultSetRowList extends JavaScriptObject
     with ListMixin<Map>, ImmutableListMixin<Map>
     implements List<Map> {
   // To suppress missing implicit constructor warnings.
@@ -282,7 +282,7 @@
 // http://www.w3.org/TR/webdatabase/#sqltransaction
 @deprecated // deprecated
 @Native("SQLTransaction")
-class SqlTransaction extends Interceptor {
+class SqlTransaction extends JavaScriptObject {
   // To suppress missing implicit constructor warnings.
   factory SqlTransaction._() {
     throw new UnsupportedError("Not supported");
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 94cd7c1..277a778 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -24,6 +24,7 @@
 Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
+Language/Types/Interface_Types/subtype_t27: Skip # https://github.com/dart-lang/sdk/issues/42641
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t01: SkipByDesign # Non-JS-interop external members are not supported
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t02: SkipByDesign # Non-JS-interop external members are not supported
 LanguageFeatures/Abstract-external-fields/static_analysis_external_A01_t03: SkipByDesign # Non-JS-interop external members are not supported
@@ -53,8 +54,6 @@
 LibTest/core/int/parse_A01_t02: SkipByDesign # uses integer literal not representable as JavaScript number
 LibTest/core/int/remainder_A01_t03: SkipByDesign # Division by zero is not an error in JavaScript
 LibTest/ffi/*: SkipByDesign # dart:ffi is not supported
-LibTest/html/HttpRequest/responseText_A01_t02: Skip # https://github.com/dart-lang/co19/issues/932
-LibTest/html/HttpRequestUpload/*: Skip # https://github.com/dart-lang/co19/issues/932
 LibTest/io/*: SkipByDesign # dart:io not supported.
 LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
 LibTest/mirrors/*: SkipByDesign # dart:mirrors is not supported
diff --git a/tests/co19/co19-dartdevc.status b/tests/co19/co19-dartdevc.status
index 7e761f2..3458c5c 100644
--- a/tests/co19/co19-dartdevc.status
+++ b/tests/co19/co19-dartdevc.status
@@ -50,8 +50,6 @@
 LibTest/core/int/parse_A01_t02: SkipByDesign # big integers cannot be represented in JavaScript
 LibTest/core/int/remainder_A01_t03: SkipByDesign # Division by zero is not an error in JavaScript
 LibTest/ffi/*: SkipByDesign # dart:ffi is not supported
-LibTest/html/HttpRequest/responseText_A01_t02: Skip # https://github.com/dart-lang/co19/issues/932
-LibTest/html/HttpRequestUpload/*: Skip # https://github.com/dart-lang/co19/issues/932
 LibTest/io/*: SkipByDesign # dart:io not supported.
 LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
 LibTest/mirrors/*: SkipByDesign # dart:mirrors is not supported
diff --git a/tests/co19_2/co19_2-dart2js.status b/tests/co19_2/co19_2-dart2js.status
index c5d8002..a63fb39 100644
--- a/tests/co19_2/co19_2-dart2js.status
+++ b/tests/co19_2/co19_2-dart2js.status
@@ -20,6 +20,7 @@
 Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Libraries_and_Scripts/top_level_syntax_t01: SkipByDesign # Non-JS-interop external members are not supported
 Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: SkipByDesign # binary '~' produces different results in JavaScript and Dart
+Language/Types/Interface_Types/subtype_t27: Skip # https://github.com/dart-lang/sdk/issues/42641
 LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: SkipByDesign # microseconds are not supported in JavaScript
 LibTest/core/DateTime/microsecond_A01_t01: SkipByDesign # microseconds are not supported in JavaScript
 LibTest/core/DateTime/microsecondsSinceEpoch_A01_t01: SkipByDesign # microseconds are not supported in JavaScript
diff --git a/tests/corelib/bigint_test.dart b/tests/corelib/bigint_test.dart
index 93b6c16..39b8cdd 100644
--- a/tests/corelib/bigint_test.dart
+++ b/tests/corelib/bigint_test.dart
@@ -228,8 +228,10 @@
   var m = BigInt.parse(
       "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
       radix: 16);
-  var r = BigInt.parse("95929095851002583825372225918533539673793386278"
-                       "360575987103577151530201707061", radix: 10);
+  var r = BigInt.parse(
+      "95929095851002583825372225918533539673793386278"
+      "360575987103577151530201707061",
+      radix: 10);
   test(x, m, r);
 }
 
@@ -830,18 +832,10 @@
     }
   }
 
-  var illegalRadices = [-1, 0, 1, 37];
-  for (var radix in illegalRadices) {
-    try {
-      new BigInt.from(42).toRadixString(radix);
-      Expect.fail("Exception expected");
-    } on ArgumentError catch (e) {
-      // Nothing to do.
-    }
-  }
-
   // Try large numbers (regression test for issue 15316).
   var bignums = [
+    BigInt.parse("0x8"),
+    BigInt.parse("0x80"),
     BigInt.parse("0x80000000"),
     BigInt.parse("0x100000000"),
     BigInt.parse("0x10000000000000"),
@@ -871,6 +865,18 @@
           bignum, result, "${bignum.toRadixString(16)} -> $digits/$radix");
     }
   }
+
+  const illegalRadices = [-2, -1, 0, 1, 37];
+  for (final bignum in bignums) {
+    for (final radix in illegalRadices) {
+      try {
+        bignum.toRadixString(radix);
+        Expect.fail("Exception expected for .toRadixString($radix)");
+      } on ArgumentError catch (e) {
+        // Nothing to do.
+      }
+    }
+  }
 }
 
 testToString() {
diff --git a/tests/corelib/error_throw_with_stacktrace_test.dart b/tests/corelib/error_throw_with_stacktrace_test.dart
new file mode 100644
index 0000000..e74c80c
--- /dev/null
+++ b/tests/corelib/error_throw_with_stacktrace_test.dart
@@ -0,0 +1,210 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+// Test of Error.throwWithStackTrace.
+
+main() {
+  // Ensure `systemStack` is different from any other stack tracek.
+  var systemStack = (() => StackTrace.current)();
+
+  // Test that an error can be thrown with a system stack trace..
+  {
+    var error = ArgumentError("e1");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e1.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e1.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e1.3");
+      Expect.isNotNull(error.stackTrace, "e1.4");
+      Expect.equals("$systemStack", "${error.stackTrace}", "e1.5");
+    }
+  }
+
+  // Test that an error can be thrown with a user-created stack trace..
+  {
+    var stringStack = StackTrace.fromString("Nonce");
+    var error = ArgumentError("e2");
+    try {
+      Error.throwWithStackTrace(error, stringStack);
+      Expect.fail("Didn't throw: e2.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e2.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$stringStack", "$s", "e2.3");
+      Expect.isNotNull(error.stackTrace, "e2.4");
+      Expect.equals("$stringStack", "${error.stackTrace}", "e2.5");
+    }
+  }
+
+  // Test that a non-error object can be thrown too.
+  {
+    var exception = FormatException("e3");
+    try {
+      Error.throwWithStackTrace(exception, systemStack);
+      Expect.fail("Didn't throw: e3.1");
+    } on Exception catch (e, s) {
+      Expect.identical(exception, e, "e3.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e3.3");
+    }
+  }
+
+  // Test that an [Error] not extending {Error} can be thrown,
+  // but doesn't (and cannot) set the stack trace.
+  {
+    var error = CustomError("e4");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e4.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e4.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e4.3");
+      Expect.isNull(error.stackTrace, "e4.4");
+    }
+  }
+
+  // Test that an already set stack trace isn't changed.
+  {
+    var error = ArgumentError("e5");
+    StackTrace? originalStack;
+    try {
+      throw error;
+    } on Error catch (e) {
+      originalStack = e.stackTrace;
+    }
+    Expect.isNotNull(originalStack);
+    Expect.notIdentical(originalStack, systemStack);
+    Expect.notEquals("$originalStack", "");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e5.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e5.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e5.3");
+      // Expect the already-set stack trace to stay.
+      Expect.isNotNull(error.stackTrace, "e5.4");
+      Expect.equals("$originalStack", "${error.stackTrace}", "e5.5");
+    }
+  }
+
+  // Works with OutOfMemoryError.
+  {
+    var error = const OutOfMemoryError();
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } on Error catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  // Works with StackOverflowError.
+  {
+    var error = const StackOverflowError();
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } on Error catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  // Also for live, captured, StackOverflowError.
+  {
+    Object error;
+    Never foo() => foo() + 1;
+    try {
+      foo(); // Force stack overflow.
+    } catch (e, s) {
+      error = e;
+    }
+    // Some platforms might use another error than StackOverflowError.
+    // Should work with whichever object gets here.
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  asyncTest(() async {
+    var theFuture = Future.value(null);
+
+    // Test that throwing inside an asynchronous context can be caught.
+    {
+      var error = ArgumentError("e6");
+      try {
+        await theFuture;
+        Error.throwWithStackTrace(error, systemStack);
+        Expect.fail("Didn't throw: e6.1");
+        await theFuture;
+      } on Error catch (e, s) {
+        Expect.identical(error, e, "e6.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e6.3");
+        Expect.isNotNull(error.stackTrace, "e6.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e6.5");
+      }
+    }
+
+    // Test that throwing in asynchronous context can be locally uncaught.
+    {
+      asyncStart();
+      var error = ArgumentError("e7");
+      var future = () async {
+        await theFuture;
+        Error.throwWithStackTrace(error, systemStack);
+        Expect.fail("Didn't throw: e7.1");
+        await theFuture;
+        return null; // Force future type to Future<dynamic>
+      }();
+      future.catchError((e, s) {
+        Expect.identical(error, e, "e7.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e7.3");
+        Expect.isNotNull(error.stackTrace, "e7.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e7.5");
+        asyncEnd();
+      });
+    }
+
+    // Test throwing an uncaught async error caught by the Zone.
+    {
+      asyncStart();
+      var error = ArgumentError("e8");
+      await runZonedGuarded(() {
+        // Make an uncaught asynchronous error.
+        (() async {
+          await theFuture;
+          Error.throwWithStackTrace(error, systemStack);
+          Expect.fail("Didn't throw: e8.1");
+          await theFuture;
+        }());
+      }, (e, s) {
+        Expect.identical(error, e, "e8.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e8.3");
+        Expect.isNotNull(error.stackTrace, "e8.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e8.5");
+        asyncEnd();
+      });
+    }
+  });
+}
+
+class CustomError implements Error {
+  final String message;
+  CustomError(this.message);
+  StackTrace? get stackTrace => null;
+  String toString() => "CustomError: $message";
+}
diff --git a/tests/corelib_2/bigint_test.dart b/tests/corelib_2/bigint_test.dart
index 053ddea..24b7ebd 100644
--- a/tests/corelib_2/bigint_test.dart
+++ b/tests/corelib_2/bigint_test.dart
@@ -230,8 +230,10 @@
   var m = BigInt.parse(
       "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
       radix: 16);
-  var r = BigInt.parse("95929095851002583825372225918533539673793386278"
-                       "360575987103577151530201707061", radix: 10);
+  var r = BigInt.parse(
+      "95929095851002583825372225918533539673793386278"
+      "360575987103577151530201707061",
+      radix: 10);
   test(x, m, r);
 }
 
@@ -832,18 +834,10 @@
     }
   }
 
-  var illegalRadices = [-1, 0, 1, 37];
-  for (var radix in illegalRadices) {
-    try {
-      new BigInt.from(42).toRadixString(radix);
-      Expect.fail("Exception expected");
-    } on ArgumentError catch (e) {
-      // Nothing to do.
-    }
-  }
-
   // Try large numbers (regression test for issue 15316).
   var bignums = [
+    BigInt.parse("0x8"),
+    BigInt.parse("0x80"),
     BigInt.parse("0x80000000"),
     BigInt.parse("0x100000000"),
     BigInt.parse("0x10000000000000"),
@@ -873,6 +867,18 @@
           bignum, result, "${bignum.toRadixString(16)} -> $digits/$radix");
     }
   }
+
+  const illegalRadices = [-2, -1, 0, 1, 37];
+  for (final bignum in bignums) {
+    for (final radix in illegalRadices) {
+      try {
+        bignum.toRadixString(radix);
+        Expect.fail("Exception expected for .toRadixString($radix)");
+      } on ArgumentError catch (e) {
+        // Nothing to do.
+      }
+    }
+  }
 }
 
 testToString() {
diff --git a/tests/corelib_2/error_throw_with_stacktrace_test.dart b/tests/corelib_2/error_throw_with_stacktrace_test.dart
new file mode 100644
index 0000000..d6c3b59
--- /dev/null
+++ b/tests/corelib_2/error_throw_with_stacktrace_test.dart
@@ -0,0 +1,211 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+// Test of Error.throwWithStackTrace.
+main() {
+  // Ensure `systemStack` is different from any other stack tracek.
+  var systemStack = (() => StackTrace.current)();
+
+  // Test that an error can be thrown with a system stack trace..
+  {
+    var error = ArgumentError("e1");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e1.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e1.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e1.3");
+      Expect.isNotNull(error.stackTrace, "e1.4");
+      Expect.equals("$systemStack", "${error.stackTrace}", "e1.5");
+    }
+  }
+
+  // Test that an error can be thrown with a user-created stack trace..
+  {
+    var stringStack = StackTrace.fromString("Nonce");
+    var error = ArgumentError("e2");
+    try {
+      Error.throwWithStackTrace(error, stringStack);
+      Expect.fail("Didn't throw: e2.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e2.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$stringStack", "$s", "e2.3");
+      Expect.isNotNull(error.stackTrace, "e2.4");
+      Expect.equals("$stringStack", "${error.stackTrace}", "e2.5");
+    }
+  }
+
+  // Test that a non-error object can be thrown too.
+  {
+    var exception = FormatException("e3");
+    try {
+      Error.throwWithStackTrace(exception, systemStack);
+      Expect.fail("Didn't throw: e3.1");
+    } on Exception catch (e, s) {
+      Expect.identical(exception, e, "e3.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e3.3");
+    }
+  }
+
+  // Test that an [Error] not extending {Error} can be thrown,
+  // but doesn't (and cannot) set the stack trace.
+  {
+    var error = CustomError("e4");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e4.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e4.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e4.3");
+      Expect.isNull(error.stackTrace, "e4.4");
+    }
+  }
+
+  // Test that an already set stack trace isn't changed.
+  {
+    var error = ArgumentError("e5");
+    StackTrace originalStack;
+    try {
+      throw error;
+    } on Error catch (e) {
+      originalStack = e.stackTrace;
+    }
+    Expect.isNotNull(originalStack);
+    Expect.notIdentical(originalStack, systemStack);
+    Expect.notEquals("$originalStack", "");
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+      Expect.fail("Didn't throw: e5.1");
+    } on Error catch (e, s) {
+      Expect.identical(error, e, "e5.2");
+      // No not expect *identical* stack trace objects.
+      Expect.equals("$systemStack", "$s", "e5.3");
+      // Expect the already-set stack trace to stay.
+      Expect.isNotNull(error.stackTrace, "e5.4");
+      Expect.equals("$originalStack", "${error.stackTrace}", "e5.5");
+    }
+  }
+
+  // Works with OutOfMemoryError.
+  {
+    var error = const OutOfMemoryError();
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } on Error catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  // Works with StackOverflowError.
+  {
+    var error = const StackOverflowError();
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } on Error catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  // Also for live, captured, StackOverflowError.
+  {
+    Object error;
+    int foo() => foo() + 1;
+    try {
+      foo(); // Force stack overflow.
+    } catch (e, s) {
+      error = e;
+    }
+    // Some platforms might use another error than StackOverflowError.
+    // Should work with whichever object gets here.
+    try {
+      Error.throwWithStackTrace(error, systemStack);
+    } catch (e, s) {
+      Expect.identical(error, e);
+      Expect.equals("$systemStack", "$s");
+    }
+  }
+
+  asyncTest(() async {
+    var theFuture = Future.value(null);
+
+    // Test that throwing inside an asynchronous context can be caught.
+    {
+      var error = ArgumentError("e6");
+      try {
+        await theFuture;
+        Error.throwWithStackTrace(error, systemStack);
+        Expect.fail("Didn't throw: e6.1");
+        await theFuture;
+      } on Error catch (e, s) {
+        Expect.identical(error, e, "e6.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e6.3");
+        Expect.isNotNull(error.stackTrace, "e6.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e6.5");
+      }
+    }
+
+    // Test that throwing in asynchronous context can be locally uncaught.
+    {
+      asyncStart();
+      var error = ArgumentError("e7");
+      var future = () async {
+        await theFuture;
+        Error.throwWithStackTrace(error, systemStack);
+        Expect.fail("Didn't throw: e7.1");
+        await theFuture;
+        return null; // Force future type to Future<dynamic>
+      }();
+      future.catchError((e, s) {
+        Expect.identical(error, e, "e7.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e7.3");
+        Expect.isNotNull(error.stackTrace, "e7.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e7.5");
+        asyncEnd();
+      });
+    }
+
+    // Test throwing an uncaught async error caught by the Zone.
+    {
+      asyncStart();
+      var error = ArgumentError("e8");
+      await runZonedGuarded(() {
+        // Make an uncaught asynchronous error.
+        (() async {
+          await theFuture;
+          Error.throwWithStackTrace(error, systemStack);
+          Expect.fail("Didn't throw: e8.1");
+          await theFuture;
+        }());
+      }, (e, s) {
+        Expect.identical(error, e, "e8.2");
+        // No not expect *identical* stack trace objects.
+        Expect.equals("$systemStack", "$s", "e8.3");
+        Expect.isNotNull(error.stackTrace, "e8.4");
+        Expect.equals("$systemStack", "${error.stackTrace}", "e8.5");
+        asyncEnd();
+      });
+    }
+  });
+}
+
+class CustomError implements Error {
+  final String message;
+  CustomError(this.message);
+  StackTrace get stackTrace => null;
+  String toString() => "CustomError: $message";
+}
diff --git a/tests/ffi/abi_specific_int_incomplete_aot_test.dart b/tests/ffi/abi_specific_int_incomplete_aot_test.dart
new file mode 100644
index 0000000..0b77d43
--- /dev/null
+++ b/tests/ffi/abi_specific_int_incomplete_aot_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+// We want at least 1 mapping to satisfy the static checks.
+const notTestingOn = Abi.fuchsiaArm64;
+
+@AbiSpecificIntegerMapping({
+  notTestingOn: Int8(),
+})
+class Incomplete extends AbiSpecificInteger {
+  const Incomplete();
+}
+
+void main() {
+  // Any use that causes the class to be used, causes a compile-time error
+  // during loading of the class.
+  nullptr.cast<Incomplete>(); //# 1: compile-time error
+}
diff --git a/tests/ffi/abi_specific_int_incomplete_jit_test.dart b/tests/ffi/abi_specific_int_incomplete_jit_test.dart
new file mode 100644
index 0000000..2ecb4c9
--- /dev/null
+++ b/tests/ffi/abi_specific_int_incomplete_jit_test.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
+
+// We want at least 1 mapping to satisfy the static checks.
+const notTestingOn = Abi.fuchsiaArm64;
+
+@AbiSpecificIntegerMapping({
+  notTestingOn: Int8(),
+})
+class Incomplete extends AbiSpecificInteger {
+  const Incomplete();
+}
+
+void main() {
+  if (Abi.current() == notTestingOn) {
+    return;
+  }
+  testSizeOf();
+  testStoreLoad();
+  testStoreLoadIndexed();
+  testStruct();
+  testInlineArray();
+  testInlineArray2();
+  testAsFunction();
+  testFromFunction();
+}
+
+void testSizeOf() {
+  Expect.throws(() {
+    sizeOf<Incomplete>();
+  });
+}
+
+void testStoreLoad() {
+  final p = calloc<Int64>().cast<Incomplete>();
+  Expect.throws(() {
+    p.value = 10;
+  });
+  Expect.throws(() {
+    p.value;
+  });
+  calloc.free(p);
+}
+
+void testStoreLoadIndexed() {
+  final p = calloc<Int64>().cast<Incomplete>();
+  Expect.throws(() {
+    p[0] = 10;
+  });
+  Expect.throws(() {
+    p[1];
+  });
+  calloc.free(p);
+}
+
+class IncompleteStruct extends Struct {
+  @Incomplete()
+  external int a0;
+
+  @Incomplete()
+  external int a1;
+}
+
+void testStruct() {
+  final p = calloc<Int64>(2).cast<IncompleteStruct>();
+  Expect.throws(() {
+    p.ref.a0 = 1;
+  });
+  Expect.throws(() {
+    p.ref.a0;
+  });
+  calloc.free(p);
+}
+
+class IncompleteArrayStruct extends Struct {
+  @Array(100)
+  external Array<Incomplete> a0;
+}
+
+void testInlineArray() {
+  final p = calloc<Int64>(100).cast<IncompleteArrayStruct>();
+  final array = p.ref.a0;
+  Expect.throws(() {
+    array[3] = 4;
+  });
+  Expect.throws(() {
+    array[3];
+  });
+  calloc.free(p);
+}
+
+const _dim1 = 8;
+const _dim2 = 4;
+
+class IncompleteArrayArrayStruct extends Struct {
+  @Array(_dim1, _dim2)
+  external Array<Array<Incomplete>> a0;
+}
+
+void testInlineArray2() {
+  final p = calloc<Int64>(100).cast<IncompleteArrayArrayStruct>();
+  Expect.throws(() {
+    p.elementAt(3);
+  });
+  calloc.free(p);
+}
+
+void testAsFunction() {
+  Expect.throws(() {
+    nullptr
+        .cast<NativeFunction<Int32 Function(Incomplete)>>()
+        .asFunction<int Function(int)>();
+  });
+  Expect.throws(() {
+    nullptr
+        .cast<NativeFunction<Incomplete Function(Int32)>>()
+        .asFunction<int Function(int)>();
+  });
+  Expect.throws(() {
+    nullptr
+        .cast<NativeFunction<Int32 Function(IncompleteArrayStruct)>>()
+        .asFunction<int Function(IncompleteArrayStruct)>();
+  });
+  Expect.throws(() {
+    nullptr
+        .cast<NativeFunction<IncompleteArrayStruct Function()>>()
+        .asFunction<IncompleteArrayStruct Function()>();
+  });
+}
+
+int myIncr(int a) => a + 1;
+
+IncompleteArrayStruct myIncompleteReturn() =>
+    nullptr.cast<IncompleteArrayStruct>().ref;
+
+int myIncompleteArg(IncompleteArrayStruct a) => 5;
+
+void testFromFunction() {
+  Expect.throws(() {
+    Pointer.fromFunction<Incomplete Function(Int32)>(myIncr, 3);
+  });
+  Expect.throws(() {
+    Pointer.fromFunction<Int32 Function(Incomplete)>(myIncr, 3);
+  });
+  Expect.throws(() {
+    Pointer.fromFunction<IncompleteArrayStruct Function()>(myIncompleteReturn);
+  });
+  Expect.throws(() {
+    Pointer.fromFunction<Int32 Function(IncompleteArrayStruct)>(
+        myIncompleteArg, 3);
+  });
+}
diff --git a/tests/ffi/abi_specific_int_test.dart b/tests/ffi/abi_specific_int_test.dart
new file mode 100644
index 0000000..266655c
--- /dev/null
+++ b/tests/ffi/abi_specific_int_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
+
+import 'abi_specific_ints.dart';
+
+void main() {
+  testSizeOf();
+  testStoreLoad();
+  testStoreLoadIndexed();
+  testStruct();
+  testInlineArray();
+  testInlineArray2();
+}
+
+void testSizeOf() {
+  final size = sizeOf<WChar>();
+  if (Platform.isWindows) {
+    Expect.equals(2, size);
+  } else {
+    Expect.equals(4, size);
+  }
+}
+
+void testStoreLoad() {
+  final p = calloc<WChar>();
+  p.value = 10;
+  Expect.equals(10, p.value);
+  calloc.free(p);
+}
+
+void testStoreLoadIndexed() {
+  final p = calloc<WChar>(2);
+  p[0] = 10;
+  p[1] = 3;
+  Expect.equals(10, p[0]);
+  Expect.equals(3, p[1]);
+  calloc.free(p);
+}
+
+class WCharStruct extends Struct {
+  @WChar()
+  external int a0;
+
+  @WChar()
+  external int a1;
+}
+
+void testStruct() {
+  final p = calloc<WCharStruct>();
+  p.ref.a0 = 1;
+  Expect.equals(1, p.ref.a0);
+  p.ref.a0 = 2;
+  Expect.equals(2, p.ref.a0);
+  calloc.free(p);
+}
+
+class WCharArrayStruct extends Struct {
+  @Array(100)
+  external Array<WChar> a0;
+}
+
+void testInlineArray() {
+  final p = calloc<WCharArrayStruct>();
+  final array = p.ref.a0;
+  for (int i = 0; i < 100; i++) {
+    array[i] = i;
+  }
+  for (int i = 0; i < 100; i++) {
+    Expect.equals(i, array[i]);
+  }
+  calloc.free(p);
+}
+
+const _dim0 = 3;
+const _dim1 = 8;
+const _dim2 = 4;
+
+class WCharArrayArrayStruct extends Struct {
+  @Array(_dim1, _dim2)
+  external Array<Array<WChar>> a0;
+}
+
+void testInlineArray2() {
+  int someValue(int a, int b, int c) => a * 1337 + b * 42 + c;
+  final p = calloc<WCharArrayArrayStruct>(_dim0);
+  for (int i0 = 0; i0 < _dim0; i0++) {
+    final array = p.elementAt(i0).ref.a0;
+    for (int i1 = 0; i1 < _dim1; i1++) {
+      final array2 = array[i1];
+      for (int i2 = 0; i2 < _dim2; i2++) {
+        array2[i2] = someValue(i0, i1, i2);
+      }
+    }
+  }
+  for (int i0 = 0; i0 < _dim0; i0++) {
+    final array = p.elementAt(i0).ref.a0;
+    for (int i1 = 0; i1 < _dim1; i1++) {
+      final array2 = array[i1];
+      for (int i2 = 0; i2 < _dim2; i2++) {
+        Expect.equals(someValue(i0, i1, i2), array2[i2]);
+      }
+    }
+  }
+  calloc.free(p);
+}
diff --git a/tests/ffi/abi_specific_ints.dart b/tests/ffi/abi_specific_ints.dart
new file mode 100644
index 0000000..94e05a4
--- /dev/null
+++ b/tests/ffi/abi_specific_ints.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+
+// TODO(dacoharkes): These should move to `package:ffi`.
+
+// `int` in C.
+typedef Int = Int32;
+
+// `unsigned int` in C.
+typedef UnsignedInt = Uint32;
+
+// `size_t` in C.
+typedef Size = UintPtr;
+
+// `ssize_t` in C.
+typedef SSize = IntPtr;
+
+// `off_t` in C.
+typedef Off = Long;
+
+/// Represents a native unsigned pointer-sized integer in C.
+///
+/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint64(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint64(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+
+/// `long` in C.
+///
+/// [Long] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Int32(),
+  Abi.androidArm64: Int64(),
+  Abi.androidIA32: Int32(),
+  Abi.androidX64: Int64(),
+  Abi.fuchsiaArm64: Int64(),
+  Abi.fuchsiaX64: Int64(),
+  Abi.iosArm: Int32(),
+  Abi.iosArm64: Int64(),
+  Abi.iosX64: Int64(),
+  Abi.linuxArm: Int32(),
+  Abi.linuxArm64: Int64(),
+  Abi.linuxIA32: Int32(),
+  Abi.linuxX64: Int64(),
+  Abi.macosArm64: Int64(),
+  Abi.macosX64: Int64(),
+  Abi.windowsArm64: Int32(),
+  Abi.windowsIA32: Int32(),
+  Abi.windowsX64: Int32(),
+})
+class Long extends AbiSpecificInteger {
+  const Long();
+}
+
+/// `unsigned long` in C.
+///
+/// [UnsignedLong] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint32(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint32(),
+})
+class UnsignedLong extends AbiSpecificInteger {
+  const UnsignedLong();
+}
+
+/// `wchar_t` in C.
+///
+/// The signedness of `wchar_t` is undefined in C. Here, it is exposed as an
+/// unsigned integer.
+///
+/// [WChar] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint32(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint32(),
+  Abi.fuchsiaArm64: Uint32(),
+  Abi.fuchsiaX64: Uint32(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint32(),
+  Abi.iosX64: Uint32(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint32(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint32(),
+  Abi.macosArm64: Uint32(),
+  Abi.macosX64: Uint32(),
+  Abi.windowsArm64: Uint16(),
+  Abi.windowsIA32: Uint16(),
+  Abi.windowsX64: Uint16(),
+})
+class WChar extends AbiSpecificInteger {
+  const WChar();
+}
diff --git a/tests/ffi/abi_test.dart b/tests/ffi/abi_test.dart
new file mode 100644
index 0000000..15c6776
--- /dev/null
+++ b/tests/ffi/abi_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+
+void main() {
+  testCurrent();
+  testPlatformVersionCompatibility();
+}
+
+void testCurrent() {
+  final currentAbi = Abi.current();
+  Expect.isTrue(Abi.values.contains(currentAbi));
+}
+
+void testPlatformVersionCompatibility() {
+  final abiStringFromPlatformVersion = Platform.version.split('"')[1];
+  final abiStringFromCurrent = Abi.current().toString();
+  Expect.equals(abiStringFromPlatformVersion, abiStringFromCurrent);
+}
diff --git a/tests/ffi/c_types_test.dart b/tests/ffi/c_types_test.dart
new file mode 100644
index 0000000..d423c2c
--- /dev/null
+++ b/tests/ffi/c_types_test.dart
@@ -0,0 +1,134 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Tests the sizes of c types from https://dartbug.com/36140.
+//
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import 'dart:io' show Platform;
+
+import 'abi_specific_ints.dart';
+import 'ffi_test_helpers.dart';
+
+void main() {
+  printSizes();
+  testSizes();
+  testIntAssumptions();
+  testSizeTAssumptions();
+  testLongAssumptions();
+  testOffTAssumptions();
+  testWCharTAssumptions();
+}
+
+class CType {
+  final int ffiSize;
+  final String modifier;
+  final String type;
+
+  CType(this.ffiSize, this.type, [this.modifier = ""]);
+
+  String get cRepresentation => "$modifier $type".trim();
+
+  String get _getSizeName => "FfiSizeOf_$modifier\_$type";
+
+  int Function() get sizeFunction => ffiTestFunctions
+      .lookupFunction<Uint64 Function(), int Function()>(_getSizeName);
+
+  int get size => sizeFunction();
+
+  String toString() => cRepresentation;
+}
+
+final intptr_t = CType(sizeOf<IntPtr>(), "intptr_t");
+final uintptr_t = CType(sizeOf<UintPtr>(), "uintptr_t");
+final int_ = CType(sizeOf<Int>(), "int");
+final uint = CType(sizeOf<UnsignedInt>(), "int", "unsigned");
+final long = CType(sizeOf<Long>(), "long");
+final ulong = CType(sizeOf<UnsignedLong>(), "long", "unsigned");
+final wchar_t = CType(sizeOf<WChar>(), "wchar_t");
+final size_t = CType(sizeOf<Size>(), "size_t");
+final ssize_t = CType(sizeOf<SSize>(), "ssize_t");
+final off_t = CType(sizeOf<Off>(), "off_t");
+
+final cTypes = [
+  intptr_t,
+  uintptr_t,
+  int_,
+  uint,
+  long,
+  ulong,
+  wchar_t,
+  size_t,
+  ssize_t,
+  off_t
+];
+
+void printSizes() {
+  cTypes.forEach((element) {
+    print("${element.cRepresentation.padRight(20)}: ${element.size}");
+  });
+}
+
+void testSizes() {
+  cTypes.forEach((element) {
+    Expect.equals(element.size, element.ffiSize);
+  });
+}
+
+void testIntAssumptions() {
+  Expect.equals(4, int_.size);
+  Expect.equals(4, uint.size);
+}
+
+void testSizeTAssumptions() {
+  Expect.equals(intptr_t.size, size_t.size);
+  Expect.equals(intptr_t.size, ssize_t.size);
+}
+
+void testLongAssumptions() {
+  if (Platform.isWindows) {
+    Expect.equals(4, long.size);
+    Expect.equals(4, ulong.size);
+  } else {
+    Expect.equals(intptr_t.size, long.size);
+    Expect.equals(intptr_t.size, ulong.size);
+  }
+}
+
+void testOffTAssumptions() {
+  Expect.equals(long.size, off_t.size);
+}
+
+void testWCharTAssumptions() {
+  final bool isSigned = wCharMinValue() != 0;
+  print("wchar_t isSigned $isSigned");
+  if (Platform.isWindows) {
+    Expect.equals(2, wchar_t.size);
+    if (isSigned) {
+      Expect.equals(-0x8000, wCharMinValue());
+      Expect.equals(0x7fff, wCharMaxValue());
+    } else {
+      Expect.equals(0, wCharMinValue());
+      Expect.equals(0xffff, wCharMaxValue());
+    }
+  } else {
+    Expect.equals(4, wchar_t.size);
+    if (isSigned) {
+      Expect.equals(-0x80000000, wCharMinValue());
+      Expect.equals(0x7fffffff, wCharMaxValue());
+    } else {
+      Expect.equals(0, wCharMinValue());
+      Expect.equals(0xffffffff, wCharMaxValue());
+    }
+  }
+}
+
+int Function() wCharMinValue = ffiTestFunctions
+    .lookupFunction<Uint64 Function(), int Function()>('WCharMinValue');
+
+int Function() wCharMaxValue = ffiTestFunctions
+    .lookupFunction<Uint64 Function(), int Function()>('WCharMaxValue');
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index 5335837..b119eb8 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -14,8 +14,15 @@
 [ $mode == debug ]
 function_callbacks_structs_by_value_generated_test: Pass, Slow
 
+[ $mode == product ]
+regress_47594_test: Skip # Profiler is not available in Product.
+
 [ $system == android ]
 *: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
+regress_47594_test: Skip # DartDev is not available on Android.
+
+[ $system == windows ]
+regress_47594_test: Skip # DynamicLibrary.process() is not available on Windows.
 
 [ $compiler != dart2analyzer && $compiler != fasta && $runtime != dart_precompiled && $runtime != vm ]
 *: SkipByDesign # FFI is a VM-only feature. (This test suite is part of the default set.)
@@ -40,3 +47,9 @@
 
 [ $compiler == dart2analyzer || $compiler == fasta ]
 vmspecific_enable_ffi_test: SkipByDesign # This is a check for VM only.
+
+[ $compiler == dartkp || $arch == arm64 && $system == fuchsia ]
+abi_specific_int_incomplete_jit_test: SkipByDesign # Only intended to run in JIT mode.
+
+[ $compiler != dartkp || $arch == arm64 && $system == fuchsia ]
+abi_specific_int_incomplete_aot_test: SkipByDesign # Only intended to run in AOT mode.
diff --git a/tests/ffi/function_callbacks_structs_by_value_generated_test.dart b/tests/ffi/function_callbacks_structs_by_value_generated_test.dart
index 232b7a5..2276d2f 100644
--- a/tests/ffi/function_callbacks_structs_by_value_generated_test.dart
+++ b/tests/ffi/function_callbacks_structs_by_value_generated_test.dart
@@ -16,6 +16,9 @@
 import "package:expect/expect.dart";
 import "package:ffi/ffi.dart";
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 import 'callback_tests_utils.dart';
 
 import 'dylib_utils.dart';
@@ -366,6 +369,12 @@
           passUint8Struct1ByteBool, false),
       passUint8Struct1ByteBoolAfterCallback),
   CallbackTest.withCheck(
+      "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned",
+      Pointer.fromFunction<
+              PassWCharStructInlineArrayIntUintPtrx2LongUnsignedType>(
+          passWCharStructInlineArrayIntUintPtrx2LongUnsigned, 0),
+      passWCharStructInlineArrayIntUintPtrx2LongUnsignedAfterCallback),
+  CallbackTest.withCheck(
       "ReturnStruct1ByteInt",
       Pointer.fromFunction<ReturnStruct1ByteIntType>(returnStruct1ByteInt),
       returnStruct1ByteIntAfterCallback),
@@ -7891,6 +7900,84 @@
   Expect.equals(1 % 2 != 0, result);
 }
 
+typedef PassWCharStructInlineArrayIntUintPtrx2LongUnsignedType = WChar Function(
+    WChar, StructInlineArrayInt, UintPtr, UintPtr, Long, UnsignedLong);
+
+// Global variables to be able to test inputs after callback returned.
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a0 = 0;
+StructInlineArrayInt passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1 =
+    Pointer<StructInlineArrayInt>.fromAddress(0).ref;
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a2 = 0;
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a3 = 0;
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a4 = 0;
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a5 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+int passWCharStructInlineArrayIntUintPtrx2LongUnsignedResult = 0;
+
+int passWCharStructInlineArrayIntUintPtrx2LongUnsignedCalculateResult() {
+  int result = 0;
+
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a0;
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[0];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[1];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[2];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[3];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[4];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[5];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[6];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[7];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[8];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[9];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a2;
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a3;
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a4;
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a5;
+
+  passWCharStructInlineArrayIntUintPtrx2LongUnsignedResult = result;
+
+  return result;
+}
+
+/// Returning a wchar.
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned(
+    int a0, StructInlineArrayInt a1, int a2, int a3, int a4, int a5) {
+  print(
+      "passWCharStructInlineArrayIntUintPtrx2LongUnsigned(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5})");
+
+  // In legacy mode, possibly return null.
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned throwing on purpose!");
+  }
+
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a0 = a0;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1 = a1;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a2 = a2;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a3 = a3;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a4 = a4;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a5 = a5;
+
+  final result =
+      passWCharStructInlineArrayIntUintPtrx2LongUnsignedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passWCharStructInlineArrayIntUintPtrx2LongUnsignedAfterCallback() {
+  final result =
+      passWCharStructInlineArrayIntUintPtrx2LongUnsignedCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(120, result);
+}
+
 typedef ReturnStruct1ByteIntType = Struct1ByteInt Function(Int8);
 
 // Global variables to be able to test inputs after callback returned.
diff --git a/tests/ffi/function_callbacks_test.dart b/tests/ffi/function_callbacks_test.dart
index a2caaeb..27b4d44 100644
--- a/tests/ffi/function_callbacks_test.dart
+++ b/tests/ffi/function_callbacks_test.dart
@@ -11,7 +11,6 @@
 // VMOptions=--use-slow-path --stacktrace-every=100
 // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code
 // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code --stacktrace-every=100
-// VMOptions=--use-bare-instructions=false
 // VMOptions=--dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects
 // SharedObjects=ffi_test_functions
 
diff --git a/tests/ffi/function_structs_by_value_generated_compounds.dart b/tests/ffi/function_structs_by_value_generated_compounds.dart
index 2f41b75..439e9a34 100644
--- a/tests/ffi/function_structs_by_value_generated_compounds.dart
+++ b/tests/ffi/function_structs_by_value_generated_compounds.dart
@@ -7,6 +7,9 @@
 
 import 'dart:ffi';
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 class Struct1ByteBool extends Struct {
   @Bool()
   external bool a0;
@@ -1257,3 +1260,10 @@
 
   String toString() => "(${a0}, ${a1}, ${a2})";
 }
+
+class StructInlineArrayInt extends Struct {
+  @Array(10)
+  external Array<WChar> a0;
+
+  String toString() => "(${[for (var i0 = 0; i0 < 10; i0 += 1) a0[i0]]})";
+}
diff --git a/tests/ffi/function_structs_by_value_generated_leaf_test.dart b/tests/ffi/function_structs_by_value_generated_leaf_test.dart
index 2067463..283faad 100644
--- a/tests/ffi/function_structs_by_value_generated_leaf_test.dart
+++ b/tests/ffi/function_structs_by_value_generated_leaf_test.dart
@@ -16,6 +16,9 @@
 import "package:expect/expect.dart";
 import "package:ffi/ffi.dart";
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 import 'dylib_utils.dart';
 
 // Reuse the compound classes.
@@ -89,6 +92,7 @@
     testPassUint8Boolx9Struct10BytesHomogeneousBoolBoolLeaf();
     testPassUint8Boolx9Struct10BytesInlineArrayBoolBoolLeaf();
     testPassUint8Struct1ByteBoolLeaf();
+    testPassWCharStructInlineArrayIntUintPtrx2LongUnsignedLeaf();
     testReturnStruct1ByteIntLeaf();
     testReturnStruct3BytesHomogeneousUint8Leaf();
     testReturnStruct3BytesInt2ByteAlignedLeaf();
@@ -5461,6 +5465,50 @@
   calloc.free(a1Pointer);
 }
 
+final passWCharStructInlineArrayIntUintPtrx2LongUnsignedLeaf = ffiTestFunctions
+    .lookupFunction<
+            WChar Function(WChar, StructInlineArrayInt, UintPtr, UintPtr, Long,
+                UnsignedLong),
+            int Function(int, StructInlineArrayInt, int, int, int, int)>(
+        "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned",
+        isLeaf: true);
+
+/// Returning a wchar.
+void testPassWCharStructInlineArrayIntUintPtrx2LongUnsignedLeaf() {
+  int a0;
+  final a1Pointer = calloc<StructInlineArrayInt>();
+  final StructInlineArrayInt a1 = a1Pointer.ref;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+
+  a0 = 1;
+  a1.a0[0] = 2;
+  a1.a0[1] = 3;
+  a1.a0[2] = 4;
+  a1.a0[3] = 5;
+  a1.a0[4] = 6;
+  a1.a0[5] = 7;
+  a1.a0[6] = 8;
+  a1.a0[7] = 9;
+  a1.a0[8] = 10;
+  a1.a0[9] = 11;
+  a2 = 12;
+  a3 = 13;
+  a4 = 14;
+  a5 = 15;
+
+  final result = passWCharStructInlineArrayIntUintPtrx2LongUnsignedLeaf(
+      a0, a1, a2, a3, a4, a5);
+
+  print("result = $result");
+
+  Expect.equals(120, result);
+
+  calloc.free(a1Pointer);
+}
+
 final returnStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
     Struct1ByteInt Function(Int8),
     Struct1ByteInt Function(int)>("ReturnStruct1ByteInt", isLeaf: true);
diff --git a/tests/ffi/function_structs_by_value_generated_test.dart b/tests/ffi/function_structs_by_value_generated_test.dart
index 463118d..1f4c5d3 100644
--- a/tests/ffi/function_structs_by_value_generated_test.dart
+++ b/tests/ffi/function_structs_by_value_generated_test.dart
@@ -16,6 +16,9 @@
 import "package:expect/expect.dart";
 import "package:ffi/ffi.dart";
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 import 'dylib_utils.dart';
 
 // Reuse the compound classes.
@@ -89,6 +92,7 @@
     testPassUint8Boolx9Struct10BytesHomogeneousBoolBool();
     testPassUint8Boolx9Struct10BytesInlineArrayBoolBool();
     testPassUint8Struct1ByteBool();
+    testPassWCharStructInlineArrayIntUintPtrx2LongUnsigned();
     testReturnStruct1ByteInt();
     testReturnStruct3BytesHomogeneousUint8();
     testReturnStruct3BytesInt2ByteAligned();
@@ -5385,6 +5389,49 @@
   calloc.free(a1Pointer);
 }
 
+final passWCharStructInlineArrayIntUintPtrx2LongUnsigned =
+    ffiTestFunctions.lookupFunction<
+        WChar Function(
+            WChar, StructInlineArrayInt, UintPtr, UintPtr, Long, UnsignedLong),
+        int Function(int, StructInlineArrayInt, int, int, int,
+            int)>("PassWCharStructInlineArrayIntUintPtrx2LongUnsigned");
+
+/// Returning a wchar.
+void testPassWCharStructInlineArrayIntUintPtrx2LongUnsigned() {
+  int a0;
+  final a1Pointer = calloc<StructInlineArrayInt>();
+  final StructInlineArrayInt a1 = a1Pointer.ref;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+
+  a0 = 1;
+  a1.a0[0] = 2;
+  a1.a0[1] = 3;
+  a1.a0[2] = 4;
+  a1.a0[3] = 5;
+  a1.a0[4] = 6;
+  a1.a0[5] = 7;
+  a1.a0[6] = 8;
+  a1.a0[7] = 9;
+  a1.a0[8] = 10;
+  a1.a0[9] = 11;
+  a2 = 12;
+  a3 = 13;
+  a4 = 14;
+  a5 = 15;
+
+  final result = passWCharStructInlineArrayIntUintPtrx2LongUnsigned(
+      a0, a1, a2, a3, a4, a5);
+
+  print("result = $result");
+
+  Expect.equals(120, result);
+
+  calloc.free(a1Pointer);
+}
+
 final returnStruct1ByteInt = ffiTestFunctions.lookupFunction<
     Struct1ByteInt Function(Int8),
     Struct1ByteInt Function(int)>("ReturnStruct1ByteInt");
diff --git a/tests/ffi/generator/c_types.dart b/tests/ffi/generator/c_types.dart
index d0825f6..bb92bc4 100644
--- a/tests/ffi/generator/c_types.dart
+++ b/tests/ffi/generator/c_types.dart
@@ -18,6 +18,10 @@
 const intptr = FundamentalType(PrimitiveType.intptr);
 const float = FundamentalType(PrimitiveType.float);
 const double_ = FundamentalType(PrimitiveType.double_);
+const long = FundamentalType(PrimitiveType.long);
+const ulong = FundamentalType(PrimitiveType.ulong);
+const uintptr = FundamentalType(PrimitiveType.uintptr);
+const wchar = FundamentalType(PrimitiveType.wchar);
 
 enum PrimitiveType {
   bool_,
@@ -32,25 +36,96 @@
   intptr,
   float,
   double_,
+  long,
+  ulong,
+  uintptr,
+  wchar,
 }
 
-const primitiveNames = [
-  "bool",
-  "int8",
-  "int16",
-  "int32",
-  "int64",
-  "uint8",
-  "uint16",
-  "uint32",
-  "uint64",
-  "intptr",
-  "float",
-  "double",
-];
+const primitiveNames = {
+  PrimitiveType.bool_: "bool",
+  PrimitiveType.int8: "int8",
+  PrimitiveType.int16: "int16",
+  PrimitiveType.int32: "int32",
+  PrimitiveType.int64: "int64",
+  PrimitiveType.uint8: "uint8",
+  PrimitiveType.uint16: "uint16",
+  PrimitiveType.uint32: "uint32",
+  PrimitiveType.uint64: "uint64",
+  PrimitiveType.intptr: "intptr",
+  PrimitiveType.float: "float",
+  PrimitiveType.double_: "double",
+  PrimitiveType.long: "long",
+  PrimitiveType.ulong: "ulong",
+  PrimitiveType.uintptr: "uintptr",
+  PrimitiveType.wchar: "wchar",
+};
 
-const intptrSize = -1;
-const primitiveSizesInBytes = [1, 1, 2, 4, 8, 1, 2, 4, 8, intptrSize, 4, 8];
+final primitiveCType = {
+  PrimitiveType.bool_: "bool",
+  PrimitiveType.int8: "int8_t",
+  PrimitiveType.int16: "int16_t",
+  PrimitiveType.int32: "int32_t",
+  PrimitiveType.int64: "int64_t",
+  PrimitiveType.uint8: "uint8_t",
+  PrimitiveType.uint16: "uint16_t",
+  PrimitiveType.uint32: "uint32_t",
+  PrimitiveType.uint64: "uint64_t",
+  PrimitiveType.intptr: "intptr",
+  PrimitiveType.float: "float",
+  PrimitiveType.double_: "double",
+  // People should use explicit sizes. But we also want to test `long`.
+  // Surpressing lint.
+  PrimitiveType.long: "/* NOLINT(runtime/int) */long",
+  PrimitiveType.ulong: "/* NOLINT(runtime/int) */unsigned long",
+  PrimitiveType.uintptr: "uintptr_t",
+  PrimitiveType.wchar: "wchar_t",
+};
+
+final primitiveDartCType = {
+  PrimitiveType.bool_: "Bool",
+  PrimitiveType.int8: "Int8",
+  PrimitiveType.int16: "Int16",
+  PrimitiveType.int32: "Int32",
+  PrimitiveType.int64: "Int64",
+  PrimitiveType.uint8: "Uint8",
+  PrimitiveType.uint16: "Uint16",
+  PrimitiveType.uint32: "Uint32",
+  PrimitiveType.uint64: "Uint64",
+  PrimitiveType.intptr: "Intptr",
+  PrimitiveType.float: "Float",
+  PrimitiveType.double_: "Double",
+  PrimitiveType.long: "Long",
+  PrimitiveType.ulong: "UnsignedLong",
+  PrimitiveType.uintptr: "UintPtr",
+  PrimitiveType.wchar: "WChar",
+};
+
+/// Sizes equal on all platforms.
+const primitiveSizesInBytes = {
+  PrimitiveType.bool_: 1,
+  PrimitiveType.int8: 1,
+  PrimitiveType.int16: 2,
+  PrimitiveType.int32: 4,
+  PrimitiveType.int64: 8,
+  PrimitiveType.uint8: 1,
+  PrimitiveType.uint16: 2,
+  PrimitiveType.uint32: 4,
+  PrimitiveType.uint64: 8,
+  PrimitiveType.float: 4,
+  PrimitiveType.double_: 8,
+};
+
+const primitivesUnsigned = {
+  PrimitiveType.bool_,
+  PrimitiveType.uint8,
+  PrimitiveType.uint16,
+  PrimitiveType.uint32,
+  PrimitiveType.uint64,
+  PrimitiveType.uintptr,
+  PrimitiveType.ulong,
+  PrimitiveType.wchar,
+};
 
 abstract class CType {
   String get cType;
@@ -90,18 +165,13 @@
   bool get isOnlyFloatingPoint => isFloatingPoint;
   bool get isOnlyInteger => isInteger;
   bool get isOnlyBool => isBool;
-  bool get isUnsigned =>
-      primitive == PrimitiveType.bool_ ||
-      primitive == PrimitiveType.uint8 ||
-      primitive == PrimitiveType.uint16 ||
-      primitive == PrimitiveType.uint32 ||
-      primitive == PrimitiveType.uint64;
+  bool get isUnsigned => primitivesUnsigned.contains(primitive);
   bool get isSigned => !isUnsigned;
 
-  String get name => primitiveNames[primitive.index];
+  String get name => primitiveNames[primitive]!;
 
-  String get cType => "${name}${isInteger ? "_t" : ""}";
-  String get dartCType => name.upperCaseFirst();
+  String get cType => primitiveCType[primitive]!;
+  String get dartCType => primitiveDartCType[primitive]!;
   String get dartType {
     if (isInteger) return 'int';
     if (isOnlyFloatingPoint) return 'double';
@@ -110,12 +180,12 @@
   }
 
   String get dartStructFieldAnnotation => "@${dartCType}()";
-  bool get hasSize => primitive != PrimitiveType.intptr;
+  bool get hasSize => primitiveSizesInBytes.containsKey(primitive);
   int get size {
     if (!hasSize) {
       throw "Size unknown.";
     }
-    return primitiveSizesInBytes[primitive.index];
+    return primitiveSizesInBytes[primitive]!;
   }
 }
 
diff --git a/tests/ffi/generator/structs_by_value_tests_configuration.dart b/tests/ffi/generator/structs_by_value_tests_configuration.dart
index a5d62af..9179d50 100644
--- a/tests/ffi/generator/structs_by_value_tests_configuration.dart
+++ b/tests/ffi/generator/structs_by_value_tests_configuration.dart
@@ -422,6 +422,18 @@
       bool_,
       """
 Returning a bool."""),
+  FunctionType(
+      [
+        wchar,
+        structArrayWChar,
+        uintptr,
+        uintptr,
+        long,
+        ulong,
+      ],
+      wchar,
+      """
+Returning a wchar."""),
 ];
 
 final functionsStructReturn = [
@@ -672,6 +684,7 @@
   union12bytesInt,
   union16bytesFloat,
   union16bytesFloat2,
+  structArrayWChar,
 ];
 
 final struct1byteBool = StructType([bool_]);
@@ -863,3 +876,6 @@
 /// This union has homogenous floats of different sizes.
 final union16bytesFloat2 =
     UnionType([struct8bytesFloat, struct12bytesFloat, struct16bytesFloat]);
+
+/// This struct contains an AbiSpecificInt type.
+final structArrayWChar = StructType([FixedLengthArrayType(wchar, 10)]);
diff --git a/tests/ffi/generator/structs_by_value_tests_generator.dart b/tests/ffi/generator/structs_by_value_tests_generator.dart
index 51de2db..4c260b9 100644
--- a/tests/ffi/generator/structs_by_value_tests_generator.dart
+++ b/tests/ffi/generator/structs_by_value_tests_generator.dart
@@ -399,7 +399,7 @@
     switch (this.runtimeType) {
       case FundamentalType:
         final this_ = this as FundamentalType;
-        if (this_.isInteger) {
+        if (this_.isInteger || this_.isBool) {
           return "CHECK_EQ(${expected}, ${actual});";
         }
         assert(this_.isFloatingPoint);
@@ -426,7 +426,7 @@
     switch (this.runtimeType) {
       case FundamentalType:
         final this_ = this as FundamentalType;
-        if (this_.isInteger) {
+        if (this_.isInteger || this_.isBool) {
           return "CHECK_EQ(0, ${actual});";
         }
         assert(this_.isFloatingPoint);
@@ -921,6 +921,9 @@
 $dartVersion
 
 import 'dart:ffi';
+
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
 """;
 }
 
@@ -929,7 +932,7 @@
   return Platform.script
       .resolve(
           "../../$folder/function_structs_by_value_generated_compounds.dart")
-      .path;
+      .toFilePath();
 }
 
 Future<void> writeDartCompounds() async {
@@ -964,6 +967,9 @@
 import "package:expect/expect.dart";
 import "package:ffi/ffi.dart";
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 import 'dylib_utils.dart';
 
 // Reuse the compound classes.
@@ -1001,7 +1007,7 @@
   return Platform.script
       .resolve(
           "../../$folder/function_structs_by_value_generated${suffix}_test.dart")
-      .path;
+      .toFilePath();
 }
 
 headerDartCallbackTest({required bool isNnbd, required int copyrightYear}) {
@@ -1023,6 +1029,9 @@
 import "package:expect/expect.dart";
 import "package:ffi/ffi.dart";
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 import 'callback_tests_utils.dart';
 
 import 'dylib_utils.dart';
@@ -1067,7 +1076,7 @@
   return Platform.script
       .resolve(
           "../../$folder/function_callbacks_structs_by_value_generated_test.dart")
-      .path;
+      .toFilePath();
 }
 
 headerC({required int copyrightYear}) {
@@ -1128,7 +1137,7 @@
 
 final ccPath = Platform.script
     .resolve("../../../runtime/bin/ffi_test/ffi_test_functions_generated.cc")
-    .path;
+    .toFilePath();
 
 void printUsage() {
   print("""
diff --git a/tests/ffi/regress_47594_test.dart b/tests/ffi/regress_47594_test.dart
new file mode 100644
index 0000000..abd6628
--- /dev/null
+++ b/tests/ffi/regress_47594_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Regression test for http://dartbug.com/47594.
+// FFI leaf calls did not mark the thread for the transition and would cause
+// the stack walker to segfault when it was unable to interpret the frame.
+//
+// VMOptions=--deterministic --enable-vm-service --profiler
+
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+
+final strerror = DynamicLibrary.process()
+    .lookupFunction<Pointer<Utf8> Function(Int32), Pointer<Utf8> Function(int)>(
+        'strerror',
+        isLeaf: true);
+
+void main() {
+  for (var i = 0; i < 10000; i++) strerror(0).toDartString();
+}
diff --git a/tests/ffi/regress_47673_2_test.dart b/tests/ffi/regress_47673_2_test.dart
new file mode 100644
index 0000000..9048521
--- /dev/null
+++ b/tests/ffi/regress_47673_2_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+class A extends Struct {
+  @Array.multi([16])
+  external Array<Int8> a;
+
+  // This should not crash the FFI transform.
+  @Array.multi([16]) //# 1: compile-time error
+  external Array<Unknown> b; //# 1: compile-time error
+}
+
+main() {}
diff --git a/tests/ffi/regress_47673_test.dart b/tests/ffi/regress_47673_test.dart
new file mode 100644
index 0000000..b372e09
--- /dev/null
+++ b/tests/ffi/regress_47673_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+typedef T = Int64;
+
+class A extends Struct {
+  @Array.multi([16])
+  external Array<T> b;
+}
+
+main() {}
diff --git a/tests/ffi/snapshot_test.dart b/tests/ffi/snapshot_test.dart
index b27b88b..29a870d 100644
--- a/tests/ffi/snapshot_test.dart
+++ b/tests/ffi/snapshot_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Checks that the VM throws an appropriate exception when FFI objects are
 // passed between isolates.
 
diff --git a/tests/ffi/vmspecific_function_callbacks_test.dart b/tests/ffi/vmspecific_function_callbacks_test.dart
index 6d192a9..0e70e23 100644
--- a/tests/ffi/vmspecific_function_callbacks_test.dart
+++ b/tests/ffi/vmspecific_function_callbacks_test.dart
@@ -5,8 +5,6 @@
 //
 // Dart test program for testing dart:ffi function pointers with callbacks.
 //
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--stacktrace-every=100
 // VMOptions=--write-protect-code --no-dual-map-code
 // VMOptions=--write-protect-code --no-dual-map-code --stacktrace-every=100
diff --git a/tests/ffi/vmspecific_static_checks_test.dart b/tests/ffi/vmspecific_static_checks_test.dart
index e77b941..ba7f5ab 100644
--- a/tests/ffi/vmspecific_static_checks_test.dart
+++ b/tests/ffi/vmspecific_static_checks_test.dart
@@ -848,3 +848,35 @@
   @Array.multi([2, 2, 2, 2, 2, 2, -1]) //# 1802: compile-time error
   external Array<Uint8> inlineArray; //# 1802: compile-time error
 }
+
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: IntPtr(), //# 1900: compile-time error
+  Abi.androidIA32: AbiSpecificInteger1(), //# 1901: compile-time error
+})
+@AbiSpecificIntegerMapping({}) //# 1902: compile-time error
+class AbiSpecificInteger1 extends AbiSpecificInteger {
+  const AbiSpecificInteger1();
+
+  int get a => 4; //# 1910: compile-time error
+
+  external int b; //# 1911: compile-time error
+}
+
+class AbiSpecificInteger2
+    implements AbiSpecificInteger //# 1903: compile-time error
+{
+  const AbiSpecificInteger2();
+}
+
+class AbiSpecificInteger3
+    extends AbiSpecificInteger1 //# 1904: compile-time error
+{
+  const AbiSpecificInteger3();
+}
+
+class AbiSpecificInteger4
+    implements AbiSpecificInteger1 //# 1905: compile-time error
+{
+  const AbiSpecificInteger4();
+}
diff --git a/tests/ffi_2/abi_specific_int_incomplete_aot_test.dart b/tests/ffi_2/abi_specific_int_incomplete_aot_test.dart
new file mode 100644
index 0000000..8429652
--- /dev/null
+++ b/tests/ffi_2/abi_specific_int_incomplete_aot_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+// We want at least 1 mapping to satisfy the static checks.
+const notTestingOn = Abi.fuchsiaArm64;
+
+@AbiSpecificIntegerMapping({
+  notTestingOn: Int8(),
+})
+class Incomplete extends AbiSpecificInteger {
+  const Incomplete();
+}
+
+void main() {
+  // Any use that causes the class to be used, causes a compile-time error
+  // during loading of the class.
+  nullptr.cast<Incomplete>(); //# 1: compile-time error
+}
diff --git a/tests/ffi_2/abi_specific_int_incomplete_jit_test.dart b/tests/ffi_2/abi_specific_int_incomplete_jit_test.dart
new file mode 100644
index 0000000..b507ed9
--- /dev/null
+++ b/tests/ffi_2/abi_specific_int_incomplete_jit_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
+
+// We want at least 1 mapping to satisfy the static checks.
+const notTestingOn = Abi.fuchsiaArm64;
+
+@AbiSpecificIntegerMapping({
+  notTestingOn: Int8(),
+})
+class Incomplete extends AbiSpecificInteger {
+  const Incomplete();
+}
+
+void main() {
+  if (Abi.current() == notTestingOn) {
+    return;
+  }
+  testSizeOf();
+  testStoreLoad();
+  testStoreLoadIndexed();
+  testStruct();
+  testInlineArray();
+  testInlineArray2();
+  testAsFunction();
+  testFromFunction();
+}
+
+void testSizeOf() {
+  Expect.throws(() {
+    sizeOf<Incomplete>();
+  });
+}
+
+void testStoreLoad() {
+  final p = calloc<Int64>().cast<Incomplete>();
+  Expect.throws(() {
+    p.value = 10;
+  });
+  Expect.throws(() {
+    p.value;
+  });
+  calloc.free(p);
+}
+
+void testStoreLoadIndexed() {
+  final p = calloc<Int64>().cast<Incomplete>();
+  Expect.throws(() {
+    p[0] = 10;
+  });
+  Expect.throws(() {
+    p[1];
+  });
+  calloc.free(p);
+}
+
+class IncompleteStruct extends Struct {
+  @Incomplete()
+  int a0;
+
+  @Incomplete()
+  int a1;
+}
+
+void testStruct() {
+  final p = calloc<Int64>(2).cast<IncompleteStruct>();
+  Expect.throws(() {
+    p.ref.a0 = 1;
+  });
+  Expect.throws(() {
+    p.ref.a0;
+  });
+  calloc.free(p);
+}
+
+class IncompleteArrayStruct extends Struct {
+  @Array(100)
+  Array<Incomplete> a0;
+}
+
+void testInlineArray() {
+  final p = calloc<Int64>(100).cast<IncompleteArrayStruct>();
+  final array = p.ref.a0;
+  Expect.throws(() {
+    array[3] = 4;
+  });
+  Expect.throws(() {
+    array[3];
+  });
+  calloc.free(p);
+}
+
+const _dim1 = 8;
+const _dim2 = 4;
+
+class IncompleteArrayArrayStruct extends Struct {
+  @Array(_dim1, _dim2)
+  Array<Array<Incomplete>> a0;
+}
+
+void testInlineArray2() {
+  final p = calloc<Int64>(100).cast<IncompleteArrayArrayStruct>();
+  Expect.throws(() {
+    p.elementAt(3);
+  });
+  calloc.free(p);
+}
+
+void testAsFunction() {
+  Expect.throws(() {
+    nullptr
+        .cast<NativeFunction<Int32 Function(Incomplete)>>()
+        .asFunction<int Function(int)>();
+  });
+  Expect.throws(() {
+    nullptr
+        .cast<NativeFunction<Incomplete Function(Int32)>>()
+        .asFunction<int Function(int)>();
+  });
+  Expect.throws(() {
+    nullptr
+        .cast<NativeFunction<Int32 Function(IncompleteArrayStruct)>>()
+        .asFunction<int Function(IncompleteArrayStruct)>();
+  });
+  Expect.throws(() {
+    nullptr
+        .cast<NativeFunction<IncompleteArrayStruct Function()>>()
+        .asFunction<IncompleteArrayStruct Function()>();
+  });
+}
+
+int myIncr(int a) => a + 1;
+
+IncompleteArrayStruct myIncompleteReturn() =>
+    nullptr.cast<IncompleteArrayStruct>().ref;
+
+int myIncompleteArg(IncompleteArrayStruct a) => 5;
+
+void testFromFunction() {
+  Expect.throws(() {
+    Pointer.fromFunction<Incomplete Function(Int32)>(myIncr, 3);
+  });
+  Expect.throws(() {
+    Pointer.fromFunction<Int32 Function(Incomplete)>(myIncr, 3);
+  });
+  Expect.throws(() {
+    Pointer.fromFunction<IncompleteArrayStruct Function()>(myIncompleteReturn);
+  });
+  Expect.throws(() {
+    Pointer.fromFunction<Int32 Function(IncompleteArrayStruct)>(
+        myIncompleteArg, 3);
+  });
+}
diff --git a/tests/ffi_2/abi_specific_int_test.dart b/tests/ffi_2/abi_specific_int_test.dart
new file mode 100644
index 0000000..152c159
--- /dev/null
+++ b/tests/ffi_2/abi_specific_int_test.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
+
+import 'abi_specific_ints.dart';
+
+void main() {
+  testSizeOf();
+  testStoreLoad();
+  testStoreLoadIndexed();
+  testStruct();
+  testInlineArray();
+  testInlineArray2();
+}
+
+void testSizeOf() {
+  final size = sizeOf<WChar>();
+  if (Platform.isWindows) {
+    Expect.equals(2, size);
+  } else {
+    Expect.equals(4, size);
+  }
+}
+
+void testStoreLoad() {
+  final p = calloc<WChar>();
+  p.value = 10;
+  Expect.equals(10, p.value);
+  calloc.free(p);
+}
+
+void testStoreLoadIndexed() {
+  final p = calloc<WChar>(2);
+  p[0] = 10;
+  p[1] = 3;
+  Expect.equals(10, p[0]);
+  Expect.equals(3, p[1]);
+  calloc.free(p);
+}
+
+class WCharStruct extends Struct {
+  @WChar()
+  int a0;
+
+  @WChar()
+  int a1;
+}
+
+void testStruct() {
+  final p = calloc<WCharStruct>();
+  p.ref.a0 = 1;
+  Expect.equals(1, p.ref.a0);
+  p.ref.a0 = 2;
+  Expect.equals(2, p.ref.a0);
+  calloc.free(p);
+}
+
+class WCharArrayStruct extends Struct {
+  @Array(100)
+  Array<WChar> a0;
+}
+
+void testInlineArray() {
+  final p = calloc<WCharArrayStruct>();
+  final array = p.ref.a0;
+  for (int i = 0; i < 100; i++) {
+    array[i] = i;
+  }
+  for (int i = 0; i < 100; i++) {
+    Expect.equals(i, array[i]);
+  }
+  calloc.free(p);
+}
+
+const _dim0 = 3;
+const _dim1 = 8;
+const _dim2 = 4;
+
+class WCharArrayArrayStruct extends Struct {
+  @Array(_dim1, _dim2)
+  Array<Array<WChar>> a0;
+}
+
+void testInlineArray2() {
+  int someValue(int a, int b, int c) => a * 1337 + b * 42 + c;
+  final p = calloc<WCharArrayArrayStruct>(_dim0);
+  for (int i0 = 0; i0 < _dim0; i0++) {
+    final array = p.elementAt(i0).ref.a0;
+    for (int i1 = 0; i1 < _dim1; i1++) {
+      final array2 = array[i1];
+      for (int i2 = 0; i2 < _dim2; i2++) {
+        array2[i2] = someValue(i0, i1, i2);
+      }
+    }
+  }
+  for (int i0 = 0; i0 < _dim0; i0++) {
+    final array = p.elementAt(i0).ref.a0;
+    for (int i1 = 0; i1 < _dim1; i1++) {
+      final array2 = array[i1];
+      for (int i2 = 0; i2 < _dim2; i2++) {
+        Expect.equals(someValue(i0, i1, i2), array2[i2]);
+      }
+    }
+  }
+  calloc.free(p);
+}
diff --git a/tests/ffi_2/abi_specific_ints.dart b/tests/ffi_2/abi_specific_ints.dart
new file mode 100644
index 0000000..91c9875
--- /dev/null
+++ b/tests/ffi_2/abi_specific_ints.dart
@@ -0,0 +1,124 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import 'dart:ffi';
+
+// TODO(dacoharkes): These should move to `package:ffi`.
+
+/// Represents a native unsigned pointer-sized integer in C.
+///
+/// [UintPtr] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint64(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint64(),
+})
+class UintPtr extends AbiSpecificInteger {
+  const UintPtr();
+}
+
+/// `long` in C.
+///
+/// [Long] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Int32(),
+  Abi.androidArm64: Int64(),
+  Abi.androidIA32: Int32(),
+  Abi.androidX64: Int64(),
+  Abi.fuchsiaArm64: Int64(),
+  Abi.fuchsiaX64: Int64(),
+  Abi.iosArm: Int32(),
+  Abi.iosArm64: Int64(),
+  Abi.iosX64: Int64(),
+  Abi.linuxArm: Int32(),
+  Abi.linuxArm64: Int64(),
+  Abi.linuxIA32: Int32(),
+  Abi.linuxX64: Int64(),
+  Abi.macosArm64: Int64(),
+  Abi.macosX64: Int64(),
+  Abi.windowsArm64: Int32(),
+  Abi.windowsIA32: Int32(),
+  Abi.windowsX64: Int32(),
+})
+class Long extends AbiSpecificInteger {
+  const Long();
+}
+
+/// `unsigned long` in C.
+///
+/// [UnsignedLong] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint64(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint64(),
+  Abi.fuchsiaArm64: Uint64(),
+  Abi.fuchsiaX64: Uint64(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint64(),
+  Abi.iosX64: Uint64(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint64(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint64(),
+  Abi.macosArm64: Uint64(),
+  Abi.macosX64: Uint64(),
+  Abi.windowsArm64: Uint32(),
+  Abi.windowsIA32: Uint32(),
+  Abi.windowsX64: Uint32(),
+})
+class UnsignedLong extends AbiSpecificInteger {
+  const UnsignedLong();
+}
+
+/// `wchar_t` in C.
+///
+/// The signedness of `wchar_t` is undefined in C. Here, it is exposed as an
+/// unsigned integer.
+///
+/// [WChar] is not constructible in the Dart code and serves purely as marker in
+/// type signatures.
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: Uint32(),
+  Abi.androidIA32: Uint32(),
+  Abi.androidX64: Uint32(),
+  Abi.fuchsiaArm64: Uint32(),
+  Abi.fuchsiaX64: Uint32(),
+  Abi.iosArm: Uint32(),
+  Abi.iosArm64: Uint32(),
+  Abi.iosX64: Uint32(),
+  Abi.linuxArm: Uint32(),
+  Abi.linuxArm64: Uint32(),
+  Abi.linuxIA32: Uint32(),
+  Abi.linuxX64: Uint32(),
+  Abi.macosArm64: Uint32(),
+  Abi.macosX64: Uint32(),
+  Abi.windowsArm64: Uint16(),
+  Abi.windowsIA32: Uint16(),
+  Abi.windowsX64: Uint16(),
+})
+class WChar extends AbiSpecificInteger {
+  const WChar();
+}
diff --git a/tests/ffi_2/abi_test.dart b/tests/ffi_2/abi_test.dart
new file mode 100644
index 0000000..d9c152e
--- /dev/null
+++ b/tests/ffi_2/abi_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:expect/expect.dart';
+
+void main() {
+  testCurrent();
+  testPlatformVersionCompatibility();
+}
+
+void testCurrent() {
+  final currentAbi = Abi.current();
+  Expect.isTrue(Abi.values.contains(currentAbi));
+}
+
+void testPlatformVersionCompatibility() {
+  final abiStringFromPlatformVersion = Platform.version.split('"')[1];
+  final abiStringFromCurrent = Abi.current().toString();
+  Expect.equals(abiStringFromPlatformVersion, abiStringFromCurrent);
+}
diff --git a/tests/ffi_2/c_types_test.dart b/tests/ffi_2/c_types_test.dart
new file mode 100644
index 0000000..fa762bd
--- /dev/null
+++ b/tests/ffi_2/c_types_test.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Tests the sizes of c types from https://dartbug.com/36140.
+//
+// SharedObjects=ffi_test_functions
+
+// @dart = 2.9
+
+import 'dart:ffi';
+
+import "package:expect/expect.dart";
+import 'dart:io' show Platform;
+
+import 'abi_specific_ints.dart';
+import 'ffi_test_helpers.dart';
+
+void main() {
+  printSizes();
+  testSizes();
+  testLongAssumptions();
+  testWCharTAssumptions();
+}
+
+class CType {
+  final int ffiSize;
+  final String modifier;
+  final String type;
+
+  CType(this.ffiSize, this.type, [this.modifier = ""]);
+
+  String get cRepresentation => "$modifier $type".trim();
+
+  String get _getSizeName => "FfiSizeOf_$modifier\_$type";
+
+  int Function() get sizeFunction => ffiTestFunctions
+      .lookupFunction<Uint64 Function(), int Function()>(_getSizeName);
+
+  int get size => sizeFunction();
+
+  String toString() => cRepresentation;
+}
+
+final intptr_t = CType(sizeOf<IntPtr>(), "intptr_t");
+final uintptr_t = CType(sizeOf<UintPtr>(), "uintptr_t");
+final long = CType(sizeOf<Long>(), "long");
+final ulong = CType(sizeOf<UnsignedLong>(), "long", "unsigned");
+final wchar_t = CType(sizeOf<WChar>(), "wchar_t");
+
+final cTypes = [
+  intptr_t,
+  uintptr_t,
+  long,
+  ulong,
+  wchar_t,
+];
+
+void printSizes() {
+  cTypes.forEach((element) {
+    print("${element.cRepresentation.padRight(20)}: ${element.size}");
+  });
+}
+
+void testSizes() {
+  cTypes.forEach((element) {
+    Expect.equals(element.size, element.ffiSize);
+  });
+}
+
+void testLongAssumptions() {
+  if (Platform.isWindows) {
+    Expect.equals(4, long.size);
+    Expect.equals(4, ulong.size);
+  } else {
+    Expect.equals(intptr_t.size, long.size);
+    Expect.equals(intptr_t.size, ulong.size);
+  }
+}
+
+void testWCharTAssumptions() {
+  final bool isSigned = wCharMinValue() != 0;
+  print("wchar_t isSigned $isSigned");
+  if (Platform.isWindows) {
+    Expect.equals(2, wchar_t.size);
+    if (isSigned) {
+      Expect.equals(-0x8000, wCharMinValue());
+      Expect.equals(0x7fff, wCharMaxValue());
+    } else {
+      Expect.equals(0, wCharMinValue());
+      Expect.equals(0xffff, wCharMaxValue());
+    }
+  } else {
+    Expect.equals(4, wchar_t.size);
+    if (isSigned) {
+      Expect.equals(-0x80000000, wCharMinValue());
+      Expect.equals(0x7fffffff, wCharMaxValue());
+    } else {
+      Expect.equals(0, wCharMinValue());
+      Expect.equals(0xffffffff, wCharMaxValue());
+    }
+  }
+}
+
+int Function() wCharMinValue = ffiTestFunctions
+    .lookupFunction<Uint64 Function(), int Function()>('WCharMinValue');
+
+int Function() wCharMaxValue = ffiTestFunctions
+    .lookupFunction<Uint64 Function(), int Function()>('WCharMaxValue');
diff --git a/tests/ffi_2/ffi_2.status b/tests/ffi_2/ffi_2.status
index 5335837..b119eb8 100644
--- a/tests/ffi_2/ffi_2.status
+++ b/tests/ffi_2/ffi_2.status
@@ -14,8 +14,15 @@
 [ $mode == debug ]
 function_callbacks_structs_by_value_generated_test: Pass, Slow
 
+[ $mode == product ]
+regress_47594_test: Skip # Profiler is not available in Product.
+
 [ $system == android ]
 *: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
+regress_47594_test: Skip # DartDev is not available on Android.
+
+[ $system == windows ]
+regress_47594_test: Skip # DynamicLibrary.process() is not available on Windows.
 
 [ $compiler != dart2analyzer && $compiler != fasta && $runtime != dart_precompiled && $runtime != vm ]
 *: SkipByDesign # FFI is a VM-only feature. (This test suite is part of the default set.)
@@ -40,3 +47,9 @@
 
 [ $compiler == dart2analyzer || $compiler == fasta ]
 vmspecific_enable_ffi_test: SkipByDesign # This is a check for VM only.
+
+[ $compiler == dartkp || $arch == arm64 && $system == fuchsia ]
+abi_specific_int_incomplete_jit_test: SkipByDesign # Only intended to run in JIT mode.
+
+[ $compiler != dartkp || $arch == arm64 && $system == fuchsia ]
+abi_specific_int_incomplete_aot_test: SkipByDesign # Only intended to run in AOT mode.
diff --git a/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart b/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart
index d593bd1..f4100fb 100644
--- a/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart
+++ b/tests/ffi_2/function_callbacks_structs_by_value_generated_test.dart
@@ -18,6 +18,9 @@
 import "package:expect/expect.dart";
 import "package:ffi/ffi.dart";
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 import 'callback_tests_utils.dart';
 
 import 'dylib_utils.dart';
@@ -368,6 +371,12 @@
           passUint8Struct1ByteBool, false),
       passUint8Struct1ByteBoolAfterCallback),
   CallbackTest.withCheck(
+      "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned",
+      Pointer.fromFunction<
+              PassWCharStructInlineArrayIntUintPtrx2LongUnsignedType>(
+          passWCharStructInlineArrayIntUintPtrx2LongUnsigned, 0),
+      passWCharStructInlineArrayIntUintPtrx2LongUnsignedAfterCallback),
+  CallbackTest.withCheck(
       "ReturnStruct1ByteInt",
       Pointer.fromFunction<ReturnStruct1ByteIntType>(returnStruct1ByteInt),
       returnStruct1ByteIntAfterCallback),
@@ -8153,6 +8162,88 @@
   Expect.equals(1 % 2 != 0, result);
 }
 
+typedef PassWCharStructInlineArrayIntUintPtrx2LongUnsignedType = WChar Function(
+    WChar, StructInlineArrayInt, UintPtr, UintPtr, Long, UnsignedLong);
+
+// Global variables to be able to test inputs after callback returned.
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a0 = 0;
+StructInlineArrayInt passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1 =
+    Pointer<StructInlineArrayInt>.fromAddress(0).ref;
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a2 = 0;
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a3 = 0;
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a4 = 0;
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a5 = 0;
+
+// Result variable also global, so we can delete it after the callback.
+int passWCharStructInlineArrayIntUintPtrx2LongUnsignedResult = 0;
+
+int passWCharStructInlineArrayIntUintPtrx2LongUnsignedCalculateResult() {
+  int result = 0;
+
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a0;
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[0];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[1];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[2];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[3];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[4];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[5];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[6];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[7];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[8];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1.a0[9];
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a2;
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a3;
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a4;
+  result += passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a5;
+
+  passWCharStructInlineArrayIntUintPtrx2LongUnsignedResult = result;
+
+  return result;
+}
+
+/// Returning a wchar.
+int passWCharStructInlineArrayIntUintPtrx2LongUnsigned(
+    int a0, StructInlineArrayInt a1, int a2, int a3, int a4, int a5) {
+  print(
+      "passWCharStructInlineArrayIntUintPtrx2LongUnsigned(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5})");
+
+  // In legacy mode, possibly return null.
+  if (a0 == 84) {
+    print("returning null!");
+    return null;
+  }
+
+  // In both nnbd and legacy mode, possibly throw.
+  if (a0 == 42 || a0 == 84) {
+    print("throwing!");
+    throw Exception(
+        "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned throwing on purpose!");
+  }
+
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a0 = a0;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a1 = a1;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a2 = a2;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a3 = a3;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a4 = a4;
+  passWCharStructInlineArrayIntUintPtrx2LongUnsigned_a5 = a5;
+
+  final result =
+      passWCharStructInlineArrayIntUintPtrx2LongUnsignedCalculateResult();
+
+  print("result = $result");
+
+  return result;
+}
+
+void passWCharStructInlineArrayIntUintPtrx2LongUnsignedAfterCallback() {
+  final result =
+      passWCharStructInlineArrayIntUintPtrx2LongUnsignedCalculateResult();
+
+  print("after callback result = $result");
+
+  Expect.equals(120, result);
+}
+
 typedef ReturnStruct1ByteIntType = Struct1ByteInt Function(Int8);
 
 // Global variables to be able to test inputs after callback returned.
diff --git a/tests/ffi_2/function_callbacks_test.dart b/tests/ffi_2/function_callbacks_test.dart
index cb1b055..cd1d793 100644
--- a/tests/ffi_2/function_callbacks_test.dart
+++ b/tests/ffi_2/function_callbacks_test.dart
@@ -13,7 +13,6 @@
 // VMOptions=--use-slow-path --stacktrace-every=100
 // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code
 // VMOptions=--use-slow-path --write-protect-code --no-dual-map-code --stacktrace-every=100
-// VMOptions=--use-bare-instructions=false
 // VMOptions=--dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects
 // SharedObjects=ffi_test_functions
 
diff --git a/tests/ffi_2/function_structs_by_value_generated_compounds.dart b/tests/ffi_2/function_structs_by_value_generated_compounds.dart
index 8b7931f..6908177 100644
--- a/tests/ffi_2/function_structs_by_value_generated_compounds.dart
+++ b/tests/ffi_2/function_structs_by_value_generated_compounds.dart
@@ -9,6 +9,9 @@
 
 import 'dart:ffi';
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 class Struct1ByteBool extends Struct {
   @Bool()
   bool a0;
@@ -1259,3 +1262,10 @@
 
   String toString() => "(${a0}, ${a1}, ${a2})";
 }
+
+class StructInlineArrayInt extends Struct {
+  @Array(10)
+  Array<WChar> a0;
+
+  String toString() => "(${[for (var i0 = 0; i0 < 10; i0 += 1) a0[i0]]})";
+}
diff --git a/tests/ffi_2/function_structs_by_value_generated_leaf_test.dart b/tests/ffi_2/function_structs_by_value_generated_leaf_test.dart
index 3a75d81..7c64296 100644
--- a/tests/ffi_2/function_structs_by_value_generated_leaf_test.dart
+++ b/tests/ffi_2/function_structs_by_value_generated_leaf_test.dart
@@ -18,6 +18,9 @@
 import "package:expect/expect.dart";
 import "package:ffi/ffi.dart";
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 import 'dylib_utils.dart';
 
 // Reuse the compound classes.
@@ -91,6 +94,7 @@
     testPassUint8Boolx9Struct10BytesHomogeneousBoolBoolLeaf();
     testPassUint8Boolx9Struct10BytesInlineArrayBoolBoolLeaf();
     testPassUint8Struct1ByteBoolLeaf();
+    testPassWCharStructInlineArrayIntUintPtrx2LongUnsignedLeaf();
     testReturnStruct1ByteIntLeaf();
     testReturnStruct3BytesHomogeneousUint8Leaf();
     testReturnStruct3BytesInt2ByteAlignedLeaf();
@@ -5463,6 +5467,50 @@
   calloc.free(a1Pointer);
 }
 
+final passWCharStructInlineArrayIntUintPtrx2LongUnsignedLeaf = ffiTestFunctions
+    .lookupFunction<
+            WChar Function(WChar, StructInlineArrayInt, UintPtr, UintPtr, Long,
+                UnsignedLong),
+            int Function(int, StructInlineArrayInt, int, int, int, int)>(
+        "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned",
+        isLeaf: true);
+
+/// Returning a wchar.
+void testPassWCharStructInlineArrayIntUintPtrx2LongUnsignedLeaf() {
+  int a0;
+  final a1Pointer = calloc<StructInlineArrayInt>();
+  final StructInlineArrayInt a1 = a1Pointer.ref;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+
+  a0 = 1;
+  a1.a0[0] = 2;
+  a1.a0[1] = 3;
+  a1.a0[2] = 4;
+  a1.a0[3] = 5;
+  a1.a0[4] = 6;
+  a1.a0[5] = 7;
+  a1.a0[6] = 8;
+  a1.a0[7] = 9;
+  a1.a0[8] = 10;
+  a1.a0[9] = 11;
+  a2 = 12;
+  a3 = 13;
+  a4 = 14;
+  a5 = 15;
+
+  final result = passWCharStructInlineArrayIntUintPtrx2LongUnsignedLeaf(
+      a0, a1, a2, a3, a4, a5);
+
+  print("result = $result");
+
+  Expect.equals(120, result);
+
+  calloc.free(a1Pointer);
+}
+
 final returnStruct1ByteIntLeaf = ffiTestFunctions.lookupFunction<
     Struct1ByteInt Function(Int8),
     Struct1ByteInt Function(int)>("ReturnStruct1ByteInt", isLeaf: true);
diff --git a/tests/ffi_2/function_structs_by_value_generated_test.dart b/tests/ffi_2/function_structs_by_value_generated_test.dart
index f817df0..ef24ad2 100644
--- a/tests/ffi_2/function_structs_by_value_generated_test.dart
+++ b/tests/ffi_2/function_structs_by_value_generated_test.dart
@@ -18,6 +18,9 @@
 import "package:expect/expect.dart";
 import "package:ffi/ffi.dart";
 
+// Reuse the AbiSpecificInts.
+import 'abi_specific_ints.dart';
+
 import 'dylib_utils.dart';
 
 // Reuse the compound classes.
@@ -91,6 +94,7 @@
     testPassUint8Boolx9Struct10BytesHomogeneousBoolBool();
     testPassUint8Boolx9Struct10BytesInlineArrayBoolBool();
     testPassUint8Struct1ByteBool();
+    testPassWCharStructInlineArrayIntUintPtrx2LongUnsigned();
     testReturnStruct1ByteInt();
     testReturnStruct3BytesHomogeneousUint8();
     testReturnStruct3BytesInt2ByteAligned();
@@ -5387,6 +5391,49 @@
   calloc.free(a1Pointer);
 }
 
+final passWCharStructInlineArrayIntUintPtrx2LongUnsigned =
+    ffiTestFunctions.lookupFunction<
+        WChar Function(
+            WChar, StructInlineArrayInt, UintPtr, UintPtr, Long, UnsignedLong),
+        int Function(int, StructInlineArrayInt, int, int, int,
+            int)>("PassWCharStructInlineArrayIntUintPtrx2LongUnsigned");
+
+/// Returning a wchar.
+void testPassWCharStructInlineArrayIntUintPtrx2LongUnsigned() {
+  int a0;
+  final a1Pointer = calloc<StructInlineArrayInt>();
+  final StructInlineArrayInt a1 = a1Pointer.ref;
+  int a2;
+  int a3;
+  int a4;
+  int a5;
+
+  a0 = 1;
+  a1.a0[0] = 2;
+  a1.a0[1] = 3;
+  a1.a0[2] = 4;
+  a1.a0[3] = 5;
+  a1.a0[4] = 6;
+  a1.a0[5] = 7;
+  a1.a0[6] = 8;
+  a1.a0[7] = 9;
+  a1.a0[8] = 10;
+  a1.a0[9] = 11;
+  a2 = 12;
+  a3 = 13;
+  a4 = 14;
+  a5 = 15;
+
+  final result = passWCharStructInlineArrayIntUintPtrx2LongUnsigned(
+      a0, a1, a2, a3, a4, a5);
+
+  print("result = $result");
+
+  Expect.equals(120, result);
+
+  calloc.free(a1Pointer);
+}
+
 final returnStruct1ByteInt = ffiTestFunctions.lookupFunction<
     Struct1ByteInt Function(Int8),
     Struct1ByteInt Function(int)>("ReturnStruct1ByteInt");
diff --git a/tests/ffi_2/regress_47594_test.dart b/tests/ffi_2/regress_47594_test.dart
new file mode 100644
index 0000000..abd6628
--- /dev/null
+++ b/tests/ffi_2/regress_47594_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Regression test for http://dartbug.com/47594.
+// FFI leaf calls did not mark the thread for the transition and would cause
+// the stack walker to segfault when it was unable to interpret the frame.
+//
+// VMOptions=--deterministic --enable-vm-service --profiler
+
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+
+final strerror = DynamicLibrary.process()
+    .lookupFunction<Pointer<Utf8> Function(Int32), Pointer<Utf8> Function(int)>(
+        'strerror',
+        isLeaf: true);
+
+void main() {
+  for (var i = 0; i < 10000; i++) strerror(0).toDartString();
+}
diff --git a/tests/ffi_2/regress_47673_2_test.dart b/tests/ffi_2/regress_47673_2_test.dart
new file mode 100644
index 0000000..2258af8
--- /dev/null
+++ b/tests/ffi_2/regress_47673_2_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+// @dart=2.9
+
+import 'dart:ffi';
+
+class A extends Struct {
+  @Array.multi([16])
+  Array<Int8> a;
+
+  // This should not crash the FFI transform.
+  @Array.multi([16]) //# 1: compile-time error
+  Array<Unknown> b; //# 1: compile-time error
+}
+
+main() {}
diff --git a/tests/ffi_2/regress_47673_test.dart b/tests/ffi_2/regress_47673_test.dart
new file mode 100644
index 0000000..9044ed5
--- /dev/null
+++ b/tests/ffi_2/regress_47673_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+// @dart=2.9
+
+import 'dart:ffi';
+
+typedef T = Int64; //# 1: compile-time error
+
+class A extends Struct {
+  @Array.multi([16])
+  Array<Int8> a;
+
+  // In language version 2.12 we do not support non-function typedefs.
+  // This should not crash the FFI transform.
+  @Array.multi([16]) //# 1: compile-time error
+  Array<T> b; //# 1: compile-time error
+}
+
+main() {}
diff --git a/tests/ffi_2/snapshot_test.dart b/tests/ffi_2/snapshot_test.dart
index 7574cea..0452b5b 100644
--- a/tests/ffi_2/snapshot_test.dart
+++ b/tests/ffi_2/snapshot_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Checks that the VM throws an appropriate exception when FFI objects are
 // passed between isolates.
 
diff --git a/tests/ffi_2/vmspecific_function_callbacks_test.dart b/tests/ffi_2/vmspecific_function_callbacks_test.dart
index e86bb95..63bcc67 100644
--- a/tests/ffi_2/vmspecific_function_callbacks_test.dart
+++ b/tests/ffi_2/vmspecific_function_callbacks_test.dart
@@ -7,8 +7,6 @@
 // Dart test program for testing dart:ffi function pointers with callbacks.
 //
 // SharedObjects=ffi_test_functions
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--stacktrace-every=100
 // VMOptions=--use-slow-path
 // VMOptions=--use-slow-path --stacktrace-every=100
diff --git a/tests/ffi_2/vmspecific_static_checks_test.dart b/tests/ffi_2/vmspecific_static_checks_test.dart
index 165b25c..ecb15cb 100644
--- a/tests/ffi_2/vmspecific_static_checks_test.dart
+++ b/tests/ffi_2/vmspecific_static_checks_test.dart
@@ -847,3 +847,35 @@
   @Array.multi([2, 2, 2, 2, 2, 2, -1]) //# 1802: compile-time error
   Array<Uint8> inlineArray; //# 1802: compile-time error
 }
+
+@AbiSpecificIntegerMapping({
+  Abi.androidArm: Uint32(),
+  Abi.androidArm64: IntPtr(), //# 1900: compile-time error
+  Abi.androidIA32: AbiSpecificInteger1(), //# 1901: compile-time error
+})
+@AbiSpecificIntegerMapping({}) //# 1902: compile-time error
+class AbiSpecificInteger1 extends AbiSpecificInteger {
+  const AbiSpecificInteger1();
+
+  int get a => 4; //# 1910: compile-time error
+
+  int b; //# 1911: compile-time error
+}
+
+class AbiSpecificInteger2
+    implements AbiSpecificInteger //# 1903: compile-time error
+{
+  const AbiSpecificInteger2();
+}
+
+class AbiSpecificInteger3
+    extends AbiSpecificInteger1 //# 1904: compile-time error
+{
+  const AbiSpecificInteger3();
+}
+
+class AbiSpecificInteger4
+    implements AbiSpecificInteger1 //# 1905: compile-time error
+{
+  const AbiSpecificInteger4();
+}
diff --git a/tests/language/deferred/split_constants_canonicalization_test.dart b/tests/language/deferred/split_constants_canonicalization_test.dart
index 02d5c6e..8617f03 100644
--- a/tests/language/deferred/split_constants_canonicalization_test.dart
+++ b/tests/language/deferred/split_constants_canonicalization_test.dart
@@ -2,9 +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.
 
-// VMOptions=--use_bare_instructions=false
-// VMOptions=--use_bare_instructions=true
-
 import "package:expect/expect.dart";
 import "split_constants_canonicalization_a.dart" deferred as a;
 import "split_constants_canonicalization_b.dart" deferred as b;
diff --git a/tests/language/generic/typedef_test.dart b/tests/language/generic/typedef_test.dart
index 09dce80..d97bf8f 100644
--- a/tests/language/generic/typedef_test.dart
+++ b/tests/language/generic/typedef_test.dart
@@ -38,23 +38,23 @@
 main() {
   dynamic d = (int x, int y) => x + y;
   Expect.isTrue(d is A<int>);
-  Expect.equals((d as A<int>)(1, 2), 3);
+  Expect.equals((d as A<int>)(1, 2), 3); // Promotes `d` to `A<int>`.
 
   Expect.isFalse(d is B);
   Expect.throws(() => d as B);
 
-  d = <S>(S x, S y) => x is String ? x : y;
-  Expect.isFalse(d is A);
+  d = <S>(S x, S y) => x is String ? x : y; // Instantiates function literal.
+  Expect.isFalse(d is A); // `A<int>` is not a subtype of `A<dynamic>`.
   Expect.throws(() => d as A);
 
+  d = (<S>(S x, S y) => x is String ? x : y) as dynamic; // No instantiation.
   Expect.isTrue(d is B);
-  // TODO(jmesserly): Analyzer incorrectly rejects this form:
-  // Expect.equals((d as B)<int>(1, 2), 2);
+  Expect.equals((d as B)<int>(1, 2), 2);
+
   B b = d;
   Expect.equals(b<int>(1, 2), 2);
   Expect.equals(b<String>('a', 'b'), 'a');
 
-
   new G<int, String>().test();
   new G<String, String>().test();
 }
diff --git a/tests/language/regress/regress23244_test.dart b/tests/language/regress/regress23244_test.dart
index 6a25b57..24a1d9b 100644
--- a/tests/language/regress/regress23244_test.dart
+++ b/tests/language/regress/regress23244_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test case for http://dartbug.com/23244
 import 'dart:async';
 import 'dart:isolate';
diff --git a/tests/language/super/regress47698_test.dart b/tests/language/super/regress47698_test.dart
new file mode 100644
index 0000000..bce31aa
--- /dev/null
+++ b/tests/language/super/regress47698_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Regression test for https://github.com/dart-lang/sdk/issues/47698.
+
+// Exposes a class field.
+class A {
+  int i;
+  A(this.i);
+}
+
+// Exposes a getter/setter pair.
+class B {
+  int _j;
+  int get j => _j;
+  set j(int x) => _j = x;
+  B(this._j);
+}
+
+// A super class field used in constructor as getter and setter.
+class C extends A {
+  C(int val) : super(val) {
+    var x = super.i + 10; // Getter is used first.
+    super.i = x + 100; // Boom! Missing setter.
+  }
+}
+
+class D extends A {
+  D(int val) : super(val) {
+    super.i = 100; // Setter is used first.
+    super.i = super.i + 10 + val; // Boom! Missing getter.
+  }
+}
+
+// Actual super getter and setter used in constructor
+class E extends B {
+  E(int val) : super(val) {
+    var x = super.j + 10; // Getter is used first.
+    super.j = x + 100; // Boom! Missing setter.
+  }
+}
+
+class F extends B {
+  F(int val) : super(val) {
+    super.j = 100; // Setter is used first.
+    super.j = super.j + 10 + val; // Boom! Missing getter.
+  }
+}
+
+void main() {
+  var c = C(1);
+  Expect.equals(c.i, 111);
+  var d = D(1);
+  Expect.equals(d.i, 111);
+  var e = E(1);
+  Expect.equals(e.j, 111);
+  var f = F(1);
+  Expect.equals(f.j, 111);
+}
diff --git a/tests/language/variable/initializer_super_last_test.dart b/tests/language/variable/initializer_super_last_test.dart
index 7e2b0b8..6bb1022 100644
--- a/tests/language/variable/initializer_super_last_test.dart
+++ b/tests/language/variable/initializer_super_last_test.dart
@@ -40,7 +40,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -48,7 +48,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -56,7 +56,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -64,7 +64,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -72,7 +72,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -83,7 +83,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -94,7 +94,7 @@
       : x = x,
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -102,7 +102,7 @@
       : x = x,
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -133,7 +133,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -141,7 +141,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -149,7 +149,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -157,7 +157,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -165,7 +165,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -176,7 +176,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -187,7 +187,7 @@
       : x = x,
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -195,7 +195,7 @@
       : x = x,
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
diff --git a/tests/language/vm/optimized_guarded_field_isolates_test.dart b/tests/language/vm/optimized_guarded_field_isolates_test.dart
index 9278ea9..facc699 100644
--- a/tests/language/vm/optimized_guarded_field_isolates_test.dart
+++ b/tests/language/vm/optimized_guarded_field_isolates_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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--optimization_counter_threshold=100 --no-background_compilation
 
 // Test field type tracking and field list-length tracking in the presence of
diff --git a/tests/language/vm/regress_flutter_89584_test.dart b/tests/language/vm/regress_flutter_89584_test.dart
index 7fa3a2e..2dd0e3e 100644
--- a/tests/language/vm/regress_flutter_89584_test.dart
+++ b/tests/language/vm/regress_flutter_89584_test.dart
@@ -6,9 +6,6 @@
 // https://github.com/flutter/flutter/issues/89584.
 // Verifies a Field::RecordStore is not done before all fields populated.
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:typed_data';
 
diff --git a/tests/language_2/deferred/split_constants_canonicalization_test.dart b/tests/language_2/deferred/split_constants_canonicalization_test.dart
index d3df883..a13d2ff 100644
--- a/tests/language_2/deferred/split_constants_canonicalization_test.dart
+++ b/tests/language_2/deferred/split_constants_canonicalization_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--use_bare_instructions=false
-// VMOptions=--use_bare_instructions=true
-
 import "package:expect/expect.dart";
 import "split_constants_canonicalization_a.dart" deferred as a;
 import "split_constants_canonicalization_b.dart" deferred as b;
diff --git a/tests/language_2/regress/regress23244_test.dart b/tests/language_2/regress/regress23244_test.dart
index 1fb8a80..e3669e7 100644
--- a/tests/language_2/regress/regress23244_test.dart
+++ b/tests/language_2/regress/regress23244_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test case for http://dartbug.com/23244
 import 'dart:async';
 import 'dart:isolate';
diff --git a/tests/language_2/super/regress47698_test.dart b/tests/language_2/super/regress47698_test.dart
new file mode 100644
index 0000000..770878e
--- /dev/null
+++ b/tests/language_2/super/regress47698_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+import "package:expect/expect.dart";
+
+// Regression test for https://github.com/dart-lang/sdk/issues/47698.
+
+// Exposes a class field.
+class A {
+  int i;
+  A(this.i);
+}
+
+// Exposes a getter/setter pair.
+class B {
+  int _j;
+  int get j => _j;
+  set j(int x) => _j = x;
+  B(this._j);
+}
+
+// A super class field used in constructor as getter and setter.
+class C extends A {
+  C(int val) : super(val) {
+    var x = super.i + 10; // Getter is used first.
+    super.i = x + 100; // Boom! Missing setter.
+  }
+}
+
+class D extends A {
+  D(int val) : super(val) {
+    super.i = 100; // Setter is used first.
+    super.i = super.i + 10 + val; // Boom! Missing getter.
+  }
+}
+
+// Actual super getter and setter used in constructor
+class E extends B {
+  E(int val) : super(val) {
+    var x = super.j + 10; // Getter is used first.
+    super.j = x + 100; // Boom! Missing setter.
+  }
+}
+
+class F extends B {
+  F(int val) : super(val) {
+    super.j = 100; // Setter is used first.
+    super.j = super.j + 10 + val; // Boom! Missing getter.
+  }
+}
+
+void main() {
+  var c = C(1);
+  Expect.equals(c.i, 111);
+  var d = D(1);
+  Expect.equals(d.i, 111);
+  var e = E(1);
+  Expect.equals(e.j, 111);
+  var f = F(1);
+  Expect.equals(f.j, 111);
+}
diff --git a/tests/language_2/variable/initializer_super_last_test.dart b/tests/language_2/variable/initializer_super_last_test.dart
index a466562..bdc36e7 100644
--- a/tests/language_2/variable/initializer_super_last_test.dart
+++ b/tests/language_2/variable/initializer_super_last_test.dart
@@ -42,7 +42,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -50,7 +50,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -58,7 +58,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -66,7 +66,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -74,7 +74,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -85,7 +85,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -96,7 +96,7 @@
       : x = x,
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -104,7 +104,7 @@
       : x = x,
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -135,7 +135,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -143,7 +143,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x;
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -151,7 +151,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -159,7 +159,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -167,7 +167,7 @@
       : //
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -178,7 +178,7 @@
       : //
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         x = x,
         //^
         // [cfe] Can't have initializers after 'super'.
@@ -189,7 +189,7 @@
       : x = x,
         super(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
@@ -197,7 +197,7 @@
       : x = x,
         super.named(),
 //      ^^^^^
-// [analyzer] COMPILE_TIME_ERROR.INVALID_SUPER_INVOCATION
+// [analyzer] COMPILE_TIME_ERROR.SUPER_INVOCATION_NOT_LAST
         assert(x == x);
 //      ^
 // [cfe] Can't have initializers after 'super'.
diff --git a/tests/language_2/vm/optimized_guarded_field_isolates_test.dart b/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
index be65d88..6a505bb 100644
--- a/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
+++ b/tests/language_2/vm/optimized_guarded_field_isolates_test.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--optimization_counter_threshold=100 --no-background_compilation
 
 // Test field type tracking and field list-length tracking in the presence of
diff --git a/tests/language_2/vm/regress_flutter_89584_test.dart b/tests/language_2/vm/regress_flutter_89584_test.dart
index be08ce9..1fa00e7 100644
--- a/tests/language_2/vm/regress_flutter_89584_test.dart
+++ b/tests/language_2/vm/regress_flutter_89584_test.dart
@@ -8,9 +8,6 @@
 // https://github.com/flutter/flutter/issues/89584.
 // Verifies a Field::RecordStore is not done before all fields populated.
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:typed_data';
 
diff --git a/tests/lib/html/js_interop_constructor_name/error1_test.dart b/tests/lib/html/js_interop_constructor_name/error1_test.dart
index a12be51..d464c18 100644
--- a/tests/lib/html/js_interop_constructor_name/error1_test.dart
+++ b/tests/lib/html/js_interop_constructor_name/error1_test.dart
@@ -12,9 +12,14 @@
   setUpJS();
   test('dom-is-js', () {
     var e = confuse(new html.DivElement());
-    // Currently, HTML types are not [JavaScriptObject]s. We could change that
-    // by having HTML types extend JavaScriptObject, in which case we would
-    // change this expectation.
+    // Currently, HTML types are not `LegacyJavaScriptObject`s, so therefore
+    // they cannot be used with the usual `package:js` types.
     expect(e is HTMLDivElement, isFalse);
   });
+  test('dom-is-static-js', () {
+    var e = confuse(new html.DivElement());
+    // However, HTML types are `JavaScriptObject`s, so they can be used with
+    // static `package:js` types, using `@staticInterop`.
+    expect(e is StaticHTMLDivElement, isTrue);
+  });
 }
diff --git a/tests/lib/html/js_interop_constructor_name/error2_test.dart b/tests/lib/html/js_interop_constructor_name/error2_test.dart
index 365e418..e2ef8d3 100644
--- a/tests/lib/html/js_interop_constructor_name/error2_test.dart
+++ b/tests/lib/html/js_interop_constructor_name/error2_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.
 
-import 'dart:html' as html;
-
 import 'package:expect/minitest.dart';
 
 import 'util.dart';
@@ -16,5 +14,6 @@
     // to Interceptor, but should be added to the class that implements all
     // the JS-interop methods.
     expect(e is HTMLDivElement, isFalse);
+    expect(e is StaticHTMLDivElement, isFalse);
   });
 }
diff --git a/tests/lib/html/js_interop_constructor_name/method_test.dart b/tests/lib/html/js_interop_constructor_name/method_test.dart
index 9781829..3d3099f 100644
--- a/tests/lib/html/js_interop_constructor_name/method_test.dart
+++ b/tests/lib/html/js_interop_constructor_name/method_test.dart
@@ -30,4 +30,14 @@
     var e = confuse(new html.DivElement());
     Expect.type<html.DivElement>(e.clone(false));
   });
+
+  test('js-call-static-js-method', () {
+    StaticHTMLDivElement e = confuse(makeDiv('hello'));
+    expect(e.bar(), equals('hello'));
+  });
+
+  test('dom-call-static-js-method', () {
+    StaticHTMLDivElement e = confuse(new html.DivElement());
+    Expect.type<html.DivElement>(e.cloneNode(false));
+  });
 }
diff --git a/tests/lib/html/js_interop_constructor_name/util.dart b/tests/lib/html/js_interop_constructor_name/util.dart
index 3ec4563..135518d 100644
--- a/tests/lib/html/js_interop_constructor_name/util.dart
+++ b/tests/lib/html/js_interop_constructor_name/util.dart
@@ -20,6 +20,15 @@
   external String bar();
 }
 
+@JS('Foo.HTMLDivElement')
+@staticInterop
+class StaticHTMLDivElement {}
+
+extension StaticHTMLDivElementExtension on StaticHTMLDivElement {
+  external String bar();
+  external StaticHTMLDivElement cloneNode(bool? deep);
+}
+
 @pragma('dart2js:noInline')
 @pragma('dart2js:assumeDynamic')
 confuse(x) => x;
diff --git a/tests/lib/isolate/bool_from_environment_default_value_test.dart b/tests/lib/isolate/bool_from_environment_default_value_test.dart
index fb9d49b..42975ed 100644
--- a/tests/lib/isolate/bool_from_environment_default_value_test.dart
+++ b/tests/lib/isolate/bool_from_environment_default_value_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/capability_test.dart b/tests/lib/isolate/capability_test.dart
index fd6c4d3..589c5c6 100644
--- a/tests/lib/isolate/capability_test.dart
+++ b/tests/lib/isolate/capability_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib/isolate/compile_time_error_test.dart b/tests/lib/isolate/compile_time_error_test.dart
index 21197fa..3eeb36f 100644
--- a/tests/lib/isolate/compile_time_error_test.dart
+++ b/tests/lib/isolate/compile_time_error_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that errors thrown from isolates are
 // processed correctly and don't result in crashes.
 
@@ -16,9 +13,9 @@
 
 class TestClass {
   TestClass.named(num this.fld1)
-  // Should cause a compilation error (for the spawned isolate). It is a
-  // runtime error for the test.
-    : fld2 = this.fld1 // //# 01: compile-time error
+      // Should cause a compilation error (for the spawned isolate). It is a
+      // runtime error for the test.
+      : fld2 = this.fld1 // //# 01: compile-time error
   ;
   late num fld1;
   late num fld2;
diff --git a/tests/lib/isolate/count_test.dart b/tests/lib/isolate/count_test.dart
index cc96b3f..8c82091 100644
--- a/tests/lib/isolate/count_test.dart
+++ b/tests/lib/isolate/count_test.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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 library CountTest;
 
diff --git a/tests/lib/isolate/cross_isolate_message_test.dart b/tests/lib/isolate/cross_isolate_message_test.dart
index ede3792..b9ba881 100644
--- a/tests/lib/isolate/cross_isolate_message_test.dart
+++ b/tests/lib/isolate/cross_isolate_message_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can communicate to isolates
 // other than the main isolate.
 
diff --git a/tests/lib/isolate/deferred_in_isolate2_test.dart b/tests/lib/isolate/deferred_in_isolate2_test.dart
index 52e5428..e63ce8f 100644
--- a/tests/lib/isolate/deferred_in_isolate2_test.dart
+++ b/tests/lib/isolate/deferred_in_isolate2_test.dart
@@ -2,13 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library deferred_in_isolate2_test;
 
 import 'dart:isolate';
-import 'dart:async';
 import 'package:async_helper/async_minitest.dart';
 
 import 'deferred_in_isolate2_lib.dart' deferred as lib;
diff --git a/tests/lib/isolate/deferred_in_isolate_test.dart b/tests/lib/isolate/deferred_in_isolate_test.dart
index d44f075..496b064 100644
--- a/tests/lib/isolate/deferred_in_isolate_test.dart
+++ b/tests/lib/isolate/deferred_in_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that deferred libraries are supported from isolates other than the root
 // isolate.
 
diff --git a/tests/lib/isolate/enum_const_test.dart b/tests/lib/isolate/enum_const_test.dart
index 0a57f13..292ba89 100644
--- a/tests/lib/isolate/enum_const_test.dart
+++ b/tests/lib/isolate/enum_const_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/error_at_spawn_test.dart b/tests/lib/isolate/error_at_spawn_test.dart
index c22f41e..4f5b373 100644
--- a/tests/lib/isolate/error_at_spawn_test.dart
+++ b/tests/lib/isolate/error_at_spawn_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/error_at_spawnuri_test.dart b/tests/lib/isolate/error_at_spawnuri_test.dart
index 6d0e073..f74c881 100644
--- a/tests/lib/isolate/error_at_spawnuri_test.dart
+++ b/tests/lib/isolate/error_at_spawnuri_test.dart
@@ -2,13 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_at_spawnuri;
 
 import "dart:isolate";
-import "dart:async";
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/error_exit_at_spawn_test.dart b/tests/lib/isolate/error_exit_at_spawn_test.dart
index 9543025..603bcb6 100644
--- a/tests/lib/isolate/error_exit_at_spawn_test.dart
+++ b/tests/lib/isolate/error_exit_at_spawn_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/error_exit_at_spawnuri_test.dart b/tests/lib/isolate/error_exit_at_spawnuri_test.dart
index cf32b98..6e9a5a8 100644
--- a/tests/lib/isolate/error_exit_at_spawnuri_test.dart
+++ b/tests/lib/isolate/error_exit_at_spawnuri_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_exit_at_spawnuri;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/exit_at_spawn_test.dart b/tests/lib/isolate/exit_at_spawn_test.dart
index 4a2574e..119ca7e 100644
--- a/tests/lib/isolate/exit_at_spawn_test.dart
+++ b/tests/lib/isolate/exit_at_spawn_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/exit_at_spawnuri_test.dart b/tests/lib/isolate/exit_at_spawnuri_test.dart
index 5bb9ed8..f415c66 100644
--- a/tests/lib/isolate/exit_at_spawnuri_test.dart
+++ b/tests/lib/isolate/exit_at_spawnuri_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/fast_copy_during_initial_message_test.dart b/tests/lib/isolate/fast_copy_during_initial_message_test.dart
index 375de09..4741fd7 100644
--- a/tests/lib/isolate/fast_copy_during_initial_message_test.dart
+++ b/tests/lib/isolate/fast_copy_during_initial_message_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:isolate";
 
diff --git a/tests/lib/isolate/function_send1_test.dart b/tests/lib/isolate/function_send1_test.dart
index 1955c96..5743aa1 100644
--- a/tests/lib/isolate/function_send1_test.dart
+++ b/tests/lib/isolate/function_send1_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/function_send_test.dart b/tests/lib/isolate/function_send_test.dart
index cd5ee40..ad90779 100644
--- a/tests/lib/isolate/function_send_test.dart
+++ b/tests/lib/isolate/function_send_test.dart
@@ -2,20 +2,15 @@
 // 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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:isolate";
-import "dart:io";
 import "dart:async";
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
-
 void toplevel(port, message) {
   port.send("toplevel:$message");
 }
@@ -65,38 +60,17 @@
   // Sendables are top-level functions and static functions only.
   testSendable("toplevel", toplevel);
   testSendable("static", C.staticFunc);
-  // Unsendables are any closure - instance methods or function expression.
-  var c = new C();
-  testUnsendable("instance method", c.instanceMethod);
-  testUnsendable("static context expression", createFuncToplevel());
-  testUnsendable("static context expression", C.createFuncStatic());
-  testUnsendable("initializer context expression", c.initializer);
-  testUnsendable("constructor context expression", c.body);
-  testUnsendable("instance method context expression", c.createFuncMember());
 
   // The result of `toplevel.call` and `staticFunc.call` may or may not be
   // identical to `toplevel` and `staticFunc` respectively. If they are not
   // equal, they may or may not be considered toplevel/static functions anyway,
   // and therefore sendable. The VM and dart2js currently disagree on whether
   // `toplevel` and `toplevel.call` are identical, both allow them to be sent.
-  // If this is ever specified to something else, use:
-  //     testUnsendable("toplevel.call", toplevel.call);
-  //     testUnsendable("static.call", C.staticFunc.call);
-  // instead.
   // These two tests should be considered canaries for accidental behavior
   // change rather than requirements.
   testSendable("toplevel", toplevel.call);
   testSendable("static", C.staticFunc.call);
 
-  // Callable objects are sendable if general objects are (VM yes, dart2js no).
-  // It's unspecified whether arbitrary objects can be sent. If it is specified,
-  // add a test that `new Callable()` is either sendable or unsendable.
-
-  // The call method of a callable object is a closure holding the object,
-  // not a top-level or static function, so it should be blocked, just as
-  // a normal method.
-  testUnsendable("callable object", new Callable().call);
-
   asyncEnd();
   return;
 }
@@ -179,51 +153,6 @@
   initPort.send(singleMessagePort(callFunc));
 }
 
-void testUnsendable(name, func) {
-  // Isolate group support does allow sending closures.
-  if (isolateGroupsEnabled) return;
-
-  asyncStart();
-  Isolate.spawn(nop, func).then<void>((v) => throw "allowed spawn direct?",
-      onError: (e, s) {
-    asyncEnd();
-  });
-  asyncStart();
-  Isolate.spawn(nop, [func]).then<void>((v) => throw "allowed spawn wrapped?",
-      onError: (e, s) {
-    asyncEnd();
-  });
-
-  asyncStart();
-  var noReply = new RawReceivePort((_) {
-    throw "Unexpected message: $_";
-  });
-  Expect.throws(() {
-    noReply.sendPort.send(func);
-  }, (_) => true, "send direct");
-  Expect.throws(() {
-    noReply.sendPort.send([func]);
-  }, (_) => true, "send wrapped");
-  scheduleMicrotask(() {
-    noReply.close();
-    asyncEnd();
-  });
-
-  // Try sending through other isolate.
-  asyncStart();
-  echoPort((v) {
-    Expect.equals(0, v);
-  }).then((p) {
-    try {
-      p.send(func);
-    } finally {
-      p.send(0); //   Closes echo port.
-    }
-  }).then<void>((p) => throw "unreachable 2", onError: (e, s) {
-    asyncEnd();
-  });
-}
-
 void nop(_) {}
 
 void callFunc(message) {
diff --git a/tests/lib/isolate/handle_error2_test.dart b/tests/lib/isolate/handle_error2_test.dart
index 8e36364..22d86f9 100644
--- a/tests/lib/isolate/handle_error2_test.dart
+++ b/tests/lib/isolate/handle_error2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/handle_error3_test.dart b/tests/lib/isolate/handle_error3_test.dart
index 170f130..743b1c8 100644
--- a/tests/lib/isolate/handle_error3_test.dart
+++ b/tests/lib/isolate/handle_error3_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/handle_error_test.dart b/tests/lib/isolate/handle_error_test.dart
index a453072..c2298b3 100644
--- a/tests/lib/isolate/handle_error_test.dart
+++ b/tests/lib/isolate/handle_error_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/illegal_msg_function_test.dart b/tests/lib/isolate/illegal_msg_function_test.dart
deleted file mode 100644
index 62cbe70..0000000
--- a/tests/lib/isolate/illegal_msg_function_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--no-enable-isolate-groups
-
-library illegal_msg_function_test;
-
-import "dart:isolate";
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-echo(sendPort) {
-  var port = new ReceivePort();
-  sendPort.send(port.sendPort);
-  port.listen((msg) {
-    sendPort.send("echoing ${msg(1)}}");
-  });
-}
-
-void main() {
-  asyncStart();
-
-  final port = new ReceivePort();
-
-  // Ignore returned Future.
-  Isolate.spawn(echo, port.sendPort);
-
-  port.first.then((_snd) {
-    SendPort snd = _snd;
-    int function(x) => x + 2;
-    try {
-      snd.send(function);
-    } catch (e) {
-      // Expected behavior.
-      port.close();
-      asyncEnd();
-      return;
-    }
-    Expect.fail("Should not be reached. Message sending didn't throw.");
-  });
-}
diff --git a/tests/lib/isolate/illegal_msg_mirror_test.dart b/tests/lib/isolate/illegal_msg_mirror_test.dart
index a15572d..fdc4ffb 100644
--- a/tests/lib/isolate/illegal_msg_mirror_test.dart
+++ b/tests/lib/isolate/illegal_msg_mirror_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library illegal_msg_mirror_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/int32_length_overflow_test.dart b/tests/lib/isolate/int32_length_overflow_test.dart
index 85e2bd7..3502ce9 100644
--- a/tests/lib/isolate/int32_length_overflow_test.dart
+++ b/tests/lib/isolate/int32_length_overflow_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "dart:typed_data";
diff --git a/tests/lib/isolate/int_from_environment_default_value_test.dart b/tests/lib/isolate/int_from_environment_default_value_test.dart
index af7ccac..cb598ee 100644
--- a/tests/lib/isolate/int_from_environment_default_value_test.dart
+++ b/tests/lib/isolate/int_from_environment_default_value_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib/isolate/isolate_complex_messages_test.dart b/tests/lib/isolate/isolate_complex_messages_test.dart
index bbf728d..74a3a1a 100644
--- a/tests/lib/isolate/isolate_complex_messages_test.dart
+++ b/tests/lib/isolate/isolate_complex_messages_test.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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing isolate communication with
 // complex messages.
diff --git a/tests/lib/isolate/isolate_current_test.dart b/tests/lib/isolate/isolate_current_test.dart
index 1c2f1bb..3701fdd 100644
--- a/tests/lib/isolate/isolate_current_test.dart
+++ b/tests/lib/isolate/isolate_current_test.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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 library isolate_current_test;
 
diff --git a/tests/lib/isolate/isolate_import_test.dart b/tests/lib/isolate/isolate_import_test.dart
index 781e13c..d286c89 100644
--- a/tests/lib/isolate/isolate_import_test.dart
+++ b/tests/lib/isolate/isolate_import_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library IsolateImportNegativeTest;
 
 // Omitting the following import is an error:
diff --git a/tests/lib/isolate/issue_21398_parent_isolate1_test.dart b/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
index 6a0b458..1b15b8b 100644
--- a/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
+++ b/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib/isolate/issue_21398_parent_isolate2_test.dart b/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
index feee51b..0fe1043 100644
--- a/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
+++ b/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib/isolate/issue_21398_parent_isolate_test.dart b/tests/lib/isolate/issue_21398_parent_isolate_test.dart
index 5264827..891ccf8 100644
--- a/tests/lib/isolate/issue_21398_parent_isolate_test.dart
+++ b/tests/lib/isolate/issue_21398_parent_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib/isolate/issue_22778_test.dart b/tests/lib/isolate/issue_22778_test.dart
index 28107cc..51f5a19 100644
--- a/tests/lib/isolate/issue_22778_test.dart
+++ b/tests/lib/isolate/issue_22778_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/issue_24243_parent_isolate_test.dart b/tests/lib/isolate/issue_24243_parent_isolate_test.dart
index c38e5e4..84b2201 100644
--- a/tests/lib/isolate/issue_24243_parent_isolate_test.dart
+++ b/tests/lib/isolate/issue_24243_parent_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:collection';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/issue_35626_test.dart b/tests/lib/isolate/issue_35626_test.dart
index 2b392ad..e943c54 100644
--- a/tests/lib/isolate/issue_35626_test.dart
+++ b/tests/lib/isolate/issue_35626_test.dart
@@ -2,16 +2,14 @@
 // 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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Tests that sets of enums can be set through ports.
 // https://github.com/dart-lang/sdk/issues/35626
 
 library spawn_tests;
 
-import "dart:io";
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/issue_6610_test.dart b/tests/lib/isolate/issue_6610_test.dart
index 962955e..96cc5e8f 100644
--- a/tests/lib/isolate/issue_6610_test.dart
+++ b/tests/lib/isolate/issue_6610_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Testing that Isolate.spawn copies the source code of the parent isolate,
 // rather than rereading the parent's source URI.
 // https://github.com/dart-lang/sdk/issues/6610
diff --git a/tests/lib/isolate/kill2_test.dart b/tests/lib/isolate/kill2_test.dart
index 9391fc8..53e5c10 100644
--- a/tests/lib/isolate/kill2_test.dart
+++ b/tests/lib/isolate/kill2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/kill_infinite_loop_in_initializer_test.dart b/tests/lib/isolate/kill_infinite_loop_in_initializer_test.dart
index 1d41541..41f4dce 100644
--- a/tests/lib/isolate/kill_infinite_loop_in_initializer_test.dart
+++ b/tests/lib/isolate/kill_infinite_loop_in_initializer_test.dart
@@ -2,15 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test against out-of-band messages being blocked during lazy
 // static field initialization.
 
 import "dart:isolate";
-import "dart:async";
-import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
 dynamic staticFieldWithBadInitializer = badInitializer();
diff --git a/tests/lib/isolate/kill_self_synchronously_test.dart b/tests/lib/isolate/kill_self_synchronously_test.dart
index 19f3a2e..b405d30 100644
--- a/tests/lib/isolate/kill_self_synchronously_test.dart
+++ b/tests/lib/isolate/kill_self_synchronously_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:io";
 
diff --git a/tests/lib/isolate/kill_self_test.dart b/tests/lib/isolate/kill_self_test.dart
index 157b30f..c482439 100644
--- a/tests/lib/isolate/kill_self_test.dart
+++ b/tests/lib/isolate/kill_self_test.dart
@@ -2,12 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
-import "package:expect/expect.dart";
+
 import "package:async_helper/async_helper.dart";
 
 isomain1(replyPort) {
diff --git a/tests/lib/isolate/kill_test.dart b/tests/lib/isolate/kill_test.dart
index 07e0dfe8..5b65c04 100644
--- a/tests/lib/isolate/kill_test.dart
+++ b/tests/lib/isolate/kill_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/large_byte_data_leak_test.dart b/tests/lib/isolate/large_byte_data_leak_test.dart
index 9797a54..ee19255 100644
--- a/tests/lib/isolate/large_byte_data_leak_test.dart
+++ b/tests/lib/isolate/large_byte_data_leak_test.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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:async";
 import "dart:developer" show UserTag;
diff --git a/tests/lib/isolate/large_byte_data_test.dart b/tests/lib/isolate/large_byte_data_test.dart
index 8a78238..d9e3d24 100644
--- a/tests/lib/isolate/large_byte_data_test.dart
+++ b/tests/lib/isolate/large_byte_data_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "dart:typed_data";
diff --git a/tests/lib/isolate/mandel_isolate_test.dart b/tests/lib/isolate/mandel_isolate_test.dart
index 50d564a..9aa5d5e 100644
--- a/tests/lib/isolate/mandel_isolate_test.dart
+++ b/tests/lib/isolate/mandel_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library MandelIsolateTest;
 
 import 'dart:async';
diff --git a/tests/lib/isolate/message2_test.dart b/tests/lib/isolate/message2_test.dart
index fd7550c..1c15990 100644
--- a/tests/lib/isolate/message2_test.dart
+++ b/tests/lib/isolate/message2_test.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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
diff --git a/tests/lib/isolate/message3_test.dart b/tests/lib/isolate/message3_test.dart
index 6809c95..a40ece1 100644
--- a/tests/lib/isolate/message3_test.dart
+++ b/tests/lib/isolate/message3_test.dart
@@ -2,13 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing serialization of messages.
-// VMOptions=--enable_type_checks --enable_asserts --enable-isolate-groups
-// VMOptions=--enable_type_checks --enable_asserts --no-enable-isolate-groups
+// VMOptions=--enable_type_checks --enable_asserts
 
 library MessageTest;
 
@@ -21,9 +19,6 @@
 import 'package:expect/expect.dart';
 import 'dart:typed_data';
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
-
 void echoMain(msg) {
   SendPort replyTo = msg[0];
   SendPort pong = msg[1];
@@ -414,14 +409,10 @@
     Expect.equals(42, x.fun()); //     //# fun: continued
   }); //                               //# fun: continued
 
-  if (isolateGroupsEnabled) {
-    ping.send(new E(new E(E.fooFun).instanceFun));
-    checks.add((x) {
-      Expect.equals(1234, (x as E).fun());
-    });
-  } else {
-    Expect.throws(() => ping.send(new E(new E(E.fooFun).instanceFun)));
-  }
+  ping.send(new E(new E(E.fooFun).instanceFun));
+  checks.add((x) {
+    Expect.equals(1234, (x as E).fun());
+  });
 
   F nonConstF = new F();
   ping.send(nonConstF);
diff --git a/tests/lib/isolate/message4_test.dart b/tests/lib/isolate/message4_test.dart
index 4644ddb..b593770 100644
--- a/tests/lib/isolate/message4_test.dart
+++ b/tests/lib/isolate/message4_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing serialization of messages with static
 // native functions.
 
diff --git a/tests/lib/isolate/message_const_type_arguments_1_test.dart b/tests/lib/isolate/message_const_type_arguments_1_test.dart
index e5133aa..b31c5e7 100644
--- a/tests/lib/isolate/message_const_type_arguments_1_test.dart
+++ b/tests/lib/isolate/message_const_type_arguments_1_test.dart
@@ -2,14 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // https://github.com/dart-lang/sdk/issues/35778
 
 import "dart:async";
 import "dart:isolate";
-import "dart:typed_data";
+
 import "package:expect/expect.dart";
 
 void child(replyPort) {
diff --git a/tests/lib/isolate/message_const_type_arguments_2_test.dart b/tests/lib/isolate/message_const_type_arguments_2_test.dart
index 002aa6e..382cbeb 100644
--- a/tests/lib/isolate/message_const_type_arguments_2_test.dart
+++ b/tests/lib/isolate/message_const_type_arguments_2_test.dart
@@ -2,14 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // https://github.com/dart-lang/sdk/issues/35778
 
 import "dart:async";
 import "dart:isolate";
-import "dart:typed_data";
+
 import "package:expect/expect.dart";
 
 void child(replyPort) {
diff --git a/tests/lib/isolate/message_enum_test.dart b/tests/lib/isolate/message_enum_test.dart
index 801afd4d..6f5a145 100644
--- a/tests/lib/isolate/message_enum_test.dart
+++ b/tests/lib/isolate/message_enum_test.dart
@@ -2,12 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
+import "dart:isolate";
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import "dart:isolate";
 
 enum Foo { BAR, BAZ }
 
diff --git a/tests/lib/isolate/message_test.dart b/tests/lib/isolate/message_test.dart
index 8a7ec69..0f5ba46 100644
--- a/tests/lib/isolate/message_test.dart
+++ b/tests/lib/isolate/message_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
 
diff --git a/tests/lib/isolate/mint_maker_test.dart b/tests/lib/isolate/mint_maker_test.dart
index c4b25ec..59eb9b0 100644
--- a/tests/lib/isolate/mint_maker_test.dart
+++ b/tests/lib/isolate/mint_maker_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library MintMakerTest;
 
 import 'dart:async';
diff --git a/tests/lib/isolate/native_wrapper_message_test.dart b/tests/lib/isolate/native_wrapper_message_test.dart
index 366a84b..bc9ed01 100644
--- a/tests/lib/isolate/native_wrapper_message_test.dart
+++ b/tests/lib/isolate/native_wrapper_message_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:nativewrappers';
 import 'package:expect/expect.dart';
diff --git a/tests/lib/isolate/nested_spawn2_test.dart b/tests/lib/isolate/nested_spawn2_test.dart
index d335909..c4a4f57 100644
--- a/tests/lib/isolate/nested_spawn2_test.dart
+++ b/tests/lib/isolate/nested_spawn2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can spawn other isolates and
 // that the nested isolates can communicate with the main once the spawner has
 // disappeared.
diff --git a/tests/lib/isolate/nested_spawn_test.dart b/tests/lib/isolate/nested_spawn_test.dart
index 0bc8c77..0074c5f 100644
--- a/tests/lib/isolate/nested_spawn_test.dart
+++ b/tests/lib/isolate/nested_spawn_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can spawn other isolates.
 
 library NestedSpawnTest;
diff --git a/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart b/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
index b361171..4568afe 100644
--- a/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
+++ b/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:io';
diff --git a/tests/lib/isolate/object_leak_test.dart b/tests/lib/isolate/object_leak_test.dart
index b8b94b4..4fd195d 100644
--- a/tests/lib/isolate/object_leak_test.dart
+++ b/tests/lib/isolate/object_leak_test.dart
@@ -2,17 +2,14 @@
 // 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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test for http://dartbug.com/18942
 
 library LeakTest;
 
+import 'dart:isolate';
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'dart:isolate';
-import 'dart:async';
 
 class A {
   var x = 0;
diff --git a/tests/lib/isolate/ondone_test.dart b/tests/lib/isolate/ondone_test.dart
index f378855..ddcb49e 100644
--- a/tests/lib/isolate/ondone_test.dart
+++ b/tests/lib/isolate/ondone_test.dart
@@ -2,11 +2,9 @@
 // for details. All rights reserved. Use of this source is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
+
 import "package:async_helper/async_helper.dart";
 
 void isomain(SendPort replyPort) {
diff --git a/tests/lib/isolate/package_config_test.dart b/tests/lib/isolate/package_config_test.dart
index a2cfece..faffc35 100644
--- a/tests/lib/isolate/package_config_test.dart
+++ b/tests/lib/isolate/package_config_test.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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--trace_shutdown
+
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/package_resolve_test.dart b/tests/lib/isolate/package_resolve_test.dart
index 50686a3..3199de7 100644
--- a/tests/lib/isolate/package_resolve_test.dart
+++ b/tests/lib/isolate/package_resolve_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/package_root_test.dart b/tests/lib/isolate/package_root_test.dart
index 390df69..7d6e7b6 100644
--- a/tests/lib/isolate/package_root_test.dart
+++ b/tests/lib/isolate/package_root_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/pause_test.dart b/tests/lib/isolate/pause_test.dart
index 1e97f00a..f8c64ec 100644
--- a/tests/lib/isolate/pause_test.dart
+++ b/tests/lib/isolate/pause_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib/isolate/ping_pause_test.dart b/tests/lib/isolate/ping_pause_test.dart
index 48ad135..c29e594 100644
--- a/tests/lib/isolate/ping_pause_test.dart
+++ b/tests/lib/isolate/ping_pause_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/ping_test.dart b/tests/lib/isolate/ping_test.dart
index 4371a4c0..fe92a57 100644
--- a/tests/lib/isolate/ping_test.dart
+++ b/tests/lib/isolate/ping_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/port_test.dart b/tests/lib/isolate/port_test.dart
index 937d75e..a0ec0f5 100644
--- a/tests/lib/isolate/port_test.dart
+++ b/tests/lib/isolate/port_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test properties of ports.
 
 library PortTest;
diff --git a/tests/lib/isolate/raw_port_test.dart b/tests/lib/isolate/raw_port_test.dart
index 6f24212..51ccdc0 100644
--- a/tests/lib/isolate/raw_port_test.dart
+++ b/tests/lib/isolate/raw_port_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test RawReceivePort.
 
 library raw_port_test;
diff --git a/tests/lib/isolate/regress_34752_test.dart b/tests/lib/isolate/regress_34752_test.dart
index ed870a6..e96cf8d 100644
--- a/tests/lib/isolate/regress_34752_test.dart
+++ b/tests/lib/isolate/regress_34752_test.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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Verifies that large BigInt can be passed through a message port and
 // simple arithmetic operations still work after that.
diff --git a/tests/lib/isolate/regress_flutter_22796_test.dart b/tests/lib/isolate/regress_flutter_22796_test.dart
index 1cab5f1..1e6fc13 100644
--- a/tests/lib/isolate/regress_flutter_22796_test.dart
+++ b/tests/lib/isolate/regress_flutter_22796_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Verifies that large typed data can be passed in a field through message port.
 // This is a regression test for
 // https://github.com/flutter/flutter/issues/22796.
diff --git a/tests/lib/isolate/request_reply_test.dart b/tests/lib/isolate/request_reply_test.dart
index 54d4d7c..4d910b4 100644
--- a/tests/lib/isolate/request_reply_test.dart
+++ b/tests/lib/isolate/request_reply_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library RequestReplyTest;
 
 import 'dart:isolate';
diff --git a/tests/lib/isolate/resolve_package_uri_test.dart b/tests/lib/isolate/resolve_package_uri_test.dart
index 9ea1d03..00d9ddb 100644
--- a/tests/lib/isolate/resolve_package_uri_test.dart
+++ b/tests/lib/isolate/resolve_package_uri_test.dart
@@ -2,13 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test for faulty encoding of `Isolate.resolvePackageUri` by
 // dart2js.
 
-import 'dart:async';
 import 'dart:isolate';
 
 main() {
diff --git a/tests/lib/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart b/tests/lib/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart
deleted file mode 100644
index eb3cbf7..0000000
--- a/tests/lib/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-import 'dart:isolate';
-
-final PACKAGE_URI = "package:foo/bar.dart";
-
-main([args, port]) async {
-  if (port != null) {
-    testPackageResolution(port);
-    return;
-  }
-  var p = new RawReceivePort();
-  Isolate.spawnUri(Platform.script, [], p.sendPort,
-      automaticPackageResolution: true);
-  p.handler = (msg) {
-    p.close();
-    if (msg is! List) {
-      print(msg.runtimeType);
-      throw "Failure return from spawned isolate:\n\n$msg";
-    }
-    if (msg[0] != null) {
-      throw "Bad package root in child isolate: ${msg[0]}.\n"
-          "Expected: null";
-    }
-    if (msg[1] != null) {
-      throw "Package path not matching: ${msg[1]}\n"
-          "Expected: null";
-    }
-    print("SUCCESS");
-  };
-  print("Spawning isolate's package root: ${await Isolate.packageRoot}");
-}
-
-testPackageResolution(port) async {
-  try {
-    var packageRootStr = Platform.packageRoot;
-    var packageConfigStr = Platform.packageConfig;
-    var packageRoot = await Isolate.packageRoot;
-    var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(PACKAGE_URI));
-    print("Spawned isolate's package root flag: $packageRootStr");
-    print("Spawned isolate's package config flag: $packageConfigStr");
-    print("Spawned isolate's loaded package root: $packageRoot");
-    print("Spawned isolate's resolved package path: $resolvedPkg");
-    port.send([packageRoot?.toString(), resolvedPkg?.toString()]);
-  } catch (e, s) {
-    port.send("$e\n$s\n");
-  }
-}
diff --git a/tests/lib/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart b/tests/lib/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
index dee6d10..4b2eba6 100644
--- a/tests/lib/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
+++ b/tests/lib/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
@@ -32,16 +32,13 @@
     }
     print("SUCCESS");
   };
-  print("Spawning isolate's package root: ${await Isolate.packageRoot}");
 }
 
 testPackageResolution(port) async {
   try {
-    var packageRootStr = Platform.packageRoot;
     var packageConfigStr = Platform.packageConfig;
     var packageConfig = await Isolate.packageConfig;
     var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(PACKAGE_URI));
-    print("Spawned isolate's package root flag: $packageRootStr");
     print("Spawned isolate's package config flag: $packageConfigStr");
     print("Spawned isolate's loaded package config: $packageConfig");
     print("Spawned isolate's resolved package path: $resolvedPkg");
diff --git a/tests/lib/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart b/tests/lib/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
index 5866729..1242b21 100644
--- a/tests/lib/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
+++ b/tests/lib/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
@@ -31,12 +31,10 @@
 
 testBadResolvePackage(port) async {
   try {
-    var packageRootStr = Platform.packageRoot;
     var packageConfigStr = Platform.packageConfig;
     var packageConfig = await Isolate.packageConfig;
     var badPackageUri = Uri.parse("package:asdf/qwerty.dart");
     var resolvedPkg = await Isolate.resolvePackageUri(badPackageUri);
-    print("Spawned isolate's package root flag: $packageRootStr");
     print("Spawned isolate's package config flag: $packageConfigStr");
     print("Spawned isolate's loaded package config: $packageConfig");
     print("Spawned isolate's resolved package path: $resolvedPkg");
diff --git a/tests/lib/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart b/tests/lib/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
index 50686a3..3199de7 100644
--- a/tests/lib/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
+++ b/tests/lib/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/scenarios/package_relative_root/package_relative_root_test.dart b/tests/lib/isolate/scenarios/package_relative_root/package_relative_root_test.dart
index 034881b..47f4d3d 100644
--- a/tests/lib/isolate/scenarios/package_relative_root/package_relative_root_test.dart
+++ b/tests/lib/isolate/scenarios/package_relative_root/package_relative_root_test.dart
@@ -7,8 +7,8 @@
 import 'dart:io';
 import 'dart:isolate';
 
-import "package:foo/foo.dart";
 import "package:bar/bar.dart";
+import "package:foo/foo.dart";
 
 var CONFIG_URI = "package:bar/spawned_packages/";
 
@@ -18,8 +18,7 @@
     return;
   }
   var p = new RawReceivePort();
-  Isolate.spawnUri(Platform.script, [], p.sendPort,
-      packageRoot: Uri.parse(CONFIG_URI));
+  Isolate.spawnUri(Platform.script, [], p.sendPort);
   p.handler = (msg) {
     p.close();
     if (msg is! List) {
@@ -45,11 +44,9 @@
 
 testCorrectBarPackage(port) async {
   try {
-    var packageRootStr = Platform.packageRoot;
     var packageConfigStr = Platform.packageConfig;
     var packageConfig = await Isolate.packageConfig;
     var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI));
-    print("Spawned isolate's package root flag: $packageRootStr");
     print("Spawned isolate's package config flag: $packageConfigStr");
     print("Spawned isolate's loaded package config: $packageConfig");
     print("Spawned isolate's resolved package path: $resolvedPkg");
diff --git a/tests/lib/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart b/tests/lib/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
index 9e5b603..6118d26 100644
--- a/tests/lib/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
+++ b/tests/lib/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
@@ -45,11 +45,9 @@
 
 testCorrectBarPackage(port) async {
   try {
-    var packageRootStr = Platform.packageRoot;
     var packageConfigStr = Platform.packageConfig;
     var packageConfig = await Isolate.packageConfig;
     var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI));
-    print("Spawned isolate's package root flag: $packageRootStr");
     print("Spawned isolate's package config flag: $packageConfigStr");
     print("Spawned isolate's loaded package config: $packageConfig");
     print("Spawned isolate's resolved package path: $resolvedPkg");
diff --git a/tests/lib/isolate/send_private_test.dart b/tests/lib/isolate/send_private_test.dart
index 8ed717f..57df312 100644
--- a/tests/lib/isolate/send_private_test.dart
+++ b/tests/lib/isolate/send_private_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib/isolate/simple_message_test.dart b/tests/lib/isolate/simple_message_test.dart
index f0310af..2ca65cb 100644
--- a/tests/lib/isolate/simple_message_test.dart
+++ b/tests/lib/isolate/simple_message_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates are spawned.
 
 library IsolateNegativeTest;
diff --git a/tests/lib/isolate/spawn_function_custom_class_test.dart b/tests/lib/isolate/spawn_function_custom_class_test.dart
index 0046cef..0fa9156 100644
--- a/tests/lib/isolate/spawn_function_custom_class_test.dart
+++ b/tests/lib/isolate/spawn_function_custom_class_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Create a user-defined class in a new isolate.
 //
 // Regression test for vm bug 2235: We were forgetting to finalize
diff --git a/tests/lib/isolate/spawn_function_test.dart b/tests/lib/isolate/spawn_function_test.dart
index bd8d1c1..3f1d3c0 100644
--- a/tests/lib/isolate/spawn_function_test.dart
+++ b/tests/lib/isolate/spawn_function_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a function.
 library spawn_tests;
 
diff --git a/tests/lib/isolate/spawn_generic_test.dart b/tests/lib/isolate/spawn_generic_test.dart
index 109f2a8..3f5f88f 100644
--- a/tests/lib/isolate/spawn_generic_test.dart
+++ b/tests/lib/isolate/spawn_generic_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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Check that Isolate.spawn is generic.
 library spawn_generic;
 
 import "dart:isolate";
 import "dart:async";
+
 import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
 
 void isomain(num args) {
   print(args);
diff --git a/tests/lib/isolate/spawn_uri_exported_main_test.dart b/tests/lib/isolate/spawn_uri_exported_main_test.dart
index 837486e..1c3efe6 100644
--- a/tests/lib/isolate/spawn_uri_exported_main_test.dart
+++ b/tests/lib/isolate/spawn_uri_exported_main_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/spawn_uri_fail_test.dart b/tests/lib/isolate/spawn_uri_fail_test.dart
index 6c9dc98..8d46548 100644
--- a/tests/lib/isolate/spawn_uri_fail_test.dart
+++ b/tests/lib/isolate/spawn_uri_fail_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:io";
 import "dart:isolate";
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart b/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
index 02521b6..445edc1 100644
--- a/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
+++ b/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 /// Tests that Isolate.spawnUri completes with an error when the given URI
 /// doesn't resolve to an existing resource.
 ///
diff --git a/tests/lib/isolate/spawn_uri_missing_test.dart b/tests/lib/isolate/spawn_uri_missing_test.dart
index 19344ba..42f2c78 100644
--- a/tests/lib/isolate/spawn_uri_missing_test.dart
+++ b/tests/lib/isolate/spawn_uri_missing_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 /// Tests that Isolate.spanUri completes with an error when the given URI
 /// doesn't resolve to an existing resource.
 library test.isolate.spawn_uri_missing_test;
diff --git a/tests/lib/isolate/spawn_uri_multi_test.dart b/tests/lib/isolate/spawn_uri_multi_test.dart
index d5fdc46..2984fca 100644
--- a/tests/lib/isolate/spawn_uri_multi_test.dart
+++ b/tests/lib/isolate/spawn_uri_multi_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Negative test to make sure that we are reaching all assertions.
 library spawn_tests;
 
diff --git a/tests/lib/isolate/spawn_uri_nested_vm_test.dart b/tests/lib/isolate/spawn_uri_nested_vm_test.dart
index 0847cf6..8a1b6d5 100644
--- a/tests/lib/isolate/spawn_uri_nested_vm_test.dart
+++ b/tests/lib/isolate/spawn_uri_nested_vm_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of nested spawning of isolates from a URI
 library NestedSpawnUriLibrary;
 
diff --git a/tests/lib/isolate/spawn_uri_test.dart b/tests/lib/isolate/spawn_uri_test.dart
index 28d7bce..2df4a52 100644
--- a/tests/lib/isolate/spawn_uri_test.dart
+++ b/tests/lib/isolate/spawn_uri_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a URI
 library spawn_tests;
 
diff --git a/tests/lib/isolate/spawn_uri_vm_test.dart b/tests/lib/isolate/spawn_uri_vm_test.dart
index 3832b42..a3b8f61 100644
--- a/tests/lib/isolate/spawn_uri_vm_test.dart
+++ b/tests/lib/isolate/spawn_uri_vm_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a URI
 library spawn_tests;
 
diff --git a/tests/lib/isolate/start_paused_test.dart b/tests/lib/isolate/start_paused_test.dart
index c9b2b57..e7a0b84 100644
--- a/tests/lib/isolate/start_paused_test.dart
+++ b/tests/lib/isolate/start_paused_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library start_paused_test;
 
 import "dart:isolate";
diff --git a/tests/lib/isolate/static_function_test.dart b/tests/lib/isolate/static_function_test.dart
index 0708dc3..aa60edd 100644
--- a/tests/lib/isolate/static_function_test.dart
+++ b/tests/lib/isolate/static_function_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test starting isolate with static functions (and toplevel ones, for sanity).
 
 library static_function_test;
@@ -116,9 +113,6 @@
 }
 
 void main([args, port]) {
-  final bool isolateGroupsEnabled =
-      Platform.executableArguments.contains('--enable-isolate-groups');
-
   asyncStart();
   // Sanity check.
   spawnTest("function", function, "TOP");
@@ -138,31 +132,17 @@
   spawnTest("lib._class._function", lib.privateClassFunction, "_LIB");
   spawnTest("lib._class._function", lib.privateClassAndFunction, "_LIBPRIVATE");
 
-  if (isolateGroupsEnabled) {
-    spawnTest("static closure", staticClosure, "WHAT?");
-    spawnTest("dynamic closure", dynamicClosure, "WHAT??");
-    spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
-    spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
-    spawnTest(
-        "initializer closure", new C().constructorInitializerClosure, "Init?");
-    spawnTest(
-        "constructor closure", new C().constructorBodyClosure, "bodyClosure?");
-    spawnTest("named constructor closure", new C().namedConstructorBodyClosure,
-        "namedBodyClosure?");
-    spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");
-  } else {
-    // Negative tests
-    functionFailTest("static closure", staticClosure);
-    functionFailTest("dynamic closure", dynamicClosure);
-    functionFailTest("named dynamic closure", namedDynamicClosure);
-    functionFailTest("instance closure", new C().instanceClosure);
-    functionFailTest(
-        "initializer closure", new C().constructorInitializerClosure);
-    functionFailTest("constructor closure", new C().constructorBodyClosure);
-    functionFailTest(
-        "named constructor closure", new C().namedConstructorBodyClosure);
-    functionFailTest("instance method", new C().instanceMethod);
-  }
+  spawnTest("static closure", staticClosure, "WHAT?");
+  spawnTest("dynamic closure", dynamicClosure, "WHAT??");
+  spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
+  spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
+  spawnTest(
+      "initializer closure", new C().constructorInitializerClosure, "Init?");
+  spawnTest(
+      "constructor closure", new C().constructorBodyClosure, "bodyClosure?");
+  spawnTest("named constructor closure", new C().namedConstructorBodyClosure,
+      "namedBodyClosure?");
+  spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");
 
   asyncEnd();
 }
diff --git a/tests/lib/isolate/string_from_environment_default_value_test.dart b/tests/lib/isolate/string_from_environment_default_value_test.dart
index 78b2feb..165e044 100644
--- a/tests/lib/isolate/string_from_environment_default_value_test.dart
+++ b/tests/lib/isolate/string_from_environment_default_value_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib/isolate/timer_isolate_test.dart b/tests/lib/isolate/timer_isolate_test.dart
index 58e93c5..a34005a 100644
--- a/tests/lib/isolate/timer_isolate_test.dart
+++ b/tests/lib/isolate/timer_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library multiple_timer_test;
 
 import 'dart:isolate';
diff --git a/tests/lib/isolate/timer_multiple_isolates_test.dart b/tests/lib/isolate/timer_multiple_isolates_test.dart
index 3f7d8f3..0e47a88 100644
--- a/tests/lib/isolate/timer_multiple_isolates_test.dart
+++ b/tests/lib/isolate/timer_multiple_isolates_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library timer_multiple_isolates_test;
 
 import 'dart:isolate';
diff --git a/tests/lib/isolate/transferable_failed_to_send_test.dart b/tests/lib/isolate/transferable_failed_to_send_test.dart
index c1d714a..f399576 100644
--- a/tests/lib/isolate/transferable_failed_to_send_test.dart
+++ b/tests/lib/isolate/transferable_failed_to_send_test.dart
@@ -2,16 +2,14 @@
 // 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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:io" show ServerSocket;
 import "dart:isolate";
 import "dart:typed_data" show ByteData;
 
 import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
 
 void main() async {
   final port = new ReceivePort();
diff --git a/tests/lib/isolate/transferable_test.dart b/tests/lib/isolate/transferable_test.dart
index 2264c8c..419c2b6 100644
--- a/tests/lib/isolate/transferable_test.dart
+++ b/tests/lib/isolate/transferable_test.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.
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:async";
 import "dart:collection";
diff --git a/tests/lib/isolate/typed_message_test.dart b/tests/lib/isolate/typed_message_test.dart
index 38e24d0..a0327ea 100644
--- a/tests/lib/isolate/typed_message_test.dart
+++ b/tests/lib/isolate/typed_message_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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // Dart test program for testing isolate communication with
 // typed objects.
 
diff --git a/tests/lib/isolate/unresolved_ports_test.dart b/tests/lib/isolate/unresolved_ports_test.dart
index 7707fab..9ac7995 100644
--- a/tests/lib/isolate/unresolved_ports_test.dart
+++ b/tests/lib/isolate/unresolved_ports_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // spawns multiple isolates and sends unresolved ports between them.
 library unresolved_ports;
 
diff --git a/tests/lib/isolate/vm_rehash_test.dart b/tests/lib/isolate/vm_rehash_test.dart
index f5a0a73..7b1b6c4 100644
--- a/tests/lib/isolate/vm_rehash_test.dart
+++ b/tests/lib/isolate/vm_rehash_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib/isolate/weak_property_message_1_test.dart b/tests/lib/isolate/weak_property_message_1_test.dart
index 4946222..b475bd3 100644
--- a/tests/lib/isolate/weak_property_message_1_test.dart
+++ b/tests/lib/isolate/weak_property_message_1_test.dart
@@ -4,9 +4,6 @@
 
 // See https://github.com/dart-lang/sdk/issues/25559
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib/isolate/weak_property_message_2_test.dart b/tests/lib/isolate/weak_property_message_2_test.dart
index fd0dbc6..0b572e7 100644
--- a/tests/lib/isolate/weak_property_message_2_test.dart
+++ b/tests/lib/isolate/weak_property_message_2_test.dart
@@ -4,9 +4,6 @@
 
 // See https://github.com/dart-lang/sdk/issues/25559
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import "dart:developer";
 import "dart:isolate";
 
diff --git a/tests/lib/js/external_extension_members_test.dart b/tests/lib/js/external_extension_members_test.dart
index 823861c..7f98c7d 100644
--- a/tests/lib/js/external_extension_members_test.dart
+++ b/tests/lib/js/external_extension_members_test.dart
@@ -35,6 +35,7 @@
   external set annotatedSetter(_);
 
   external num getField();
+  external void setField10([optionalArgument = 10]);
   @JS('toString')
   external String extToString();
   external dynamic getFirstEl(list);
@@ -72,6 +73,10 @@
       return this.field;
     }
 
+    Foo.prototype.setField10 = function(optionalArgument) {
+      this.field = optionalArgument;
+    }
+
     Foo.prototype.getFirstEl = function(list) {
       return list[0];
     }
@@ -128,6 +133,24 @@
     expect(foo.otherSumFn(10, 5), equals(15));
   });
 
+  // TODO(41375): Remove if JS interop default value arguments are disallowed.
+  test('optional arguments', () {
+    var foo = Foo(42);
+    expect(foo.field, equals(42));
+
+    foo.setField10();
+    expect(foo.field, equals(10));
+    foo.setField10(6);
+    expect(foo.field, equals(6));
+
+    // Test using tearoffs
+    var setF = foo.setField10;
+    setF();
+    expect(foo.field, equals(10));
+    setF(6);
+    expect(foo.field, equals(6));
+  });
+
   test('module class', () {
     var bar = Bar(5);
     expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index ccc6171..46bdedf 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -11,6 +11,9 @@
 developer/timeline_test: Skip # Not supported
 isolate/issue_24243_parent_isolate_test: Skip # Requires checked mode
 
+[ $runtime == d8 ]
+js/js_util/javascriptobject_extensions_test.dart: SkipByDesign # Uses dart:html.
+
 [ $runtime == dart_precompiled ]
 isolate/package_config_getter_test: SkipByDesign # AOT mode doesn't preserve package structure.
 
diff --git a/tests/lib_2/html/js_interop_constructor_name/error1_test.dart b/tests/lib_2/html/js_interop_constructor_name/error1_test.dart
index f28cc09..19f516c 100644
--- a/tests/lib_2/html/js_interop_constructor_name/error1_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name/error1_test.dart
@@ -14,9 +14,14 @@
   setUpJS();
   test('dom-is-js', () {
     var e = confuse(new html.DivElement());
-    // Currently, HTML types are not [JavaScriptObject]s. We could change that
-    // by having HTML types extend JavaScriptObject, in which case we would
-    // change this expectation.
+    // Currently, HTML types are not `LegacyJavaScriptObject`s, so therefore
+    // they cannot be used with the usual `package:js` types.
     expect(e is HTMLDivElement, isFalse);
   });
+  test('dom-is-static-js', () {
+    var e = confuse(new html.DivElement());
+    // However, HTML types are `JavaScriptObject`s, so they can be used with
+    // static `package:js` types, using `@staticInterop`.
+    expect(e is StaticHTMLDivElement, isTrue);
+  });
 }
diff --git a/tests/lib_2/html/js_interop_constructor_name/error2_test.dart b/tests/lib_2/html/js_interop_constructor_name/error2_test.dart
index 078a870..85b5117 100644
--- a/tests/lib_2/html/js_interop_constructor_name/error2_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name/error2_test.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-import 'dart:html' as html;
-
 import 'package:expect/minitest.dart';
 
 import 'util.dart';
@@ -18,5 +16,6 @@
     // to Interceptor, but should be added to the class that implements all
     // the JS-interop methods.
     expect(e is HTMLDivElement, isFalse);
+    expect(e is StaticHTMLDivElement, isFalse);
   });
 }
diff --git a/tests/lib_2/html/js_interop_constructor_name/method_test.dart b/tests/lib_2/html/js_interop_constructor_name/method_test.dart
index a7fd842..251bf8d 100644
--- a/tests/lib_2/html/js_interop_constructor_name/method_test.dart
+++ b/tests/lib_2/html/js_interop_constructor_name/method_test.dart
@@ -32,4 +32,14 @@
     var e = confuse(new html.DivElement());
     Expect.type<html.DivElement>(e.clone(false));
   });
+
+  test('js-call-static-js-method', () {
+    StaticHTMLDivElement e = confuse(makeDiv('hello'));
+    expect(e.bar(), equals('hello'));
+  });
+
+  test('dom-call-static-js-method', () {
+    StaticHTMLDivElement e = confuse(new html.DivElement());
+    Expect.type<html.DivElement>(e.cloneNode(false));
+  });
 }
diff --git a/tests/lib_2/html/js_interop_constructor_name/util.dart b/tests/lib_2/html/js_interop_constructor_name/util.dart
index c98f612..bdb5602 100644
--- a/tests/lib_2/html/js_interop_constructor_name/util.dart
+++ b/tests/lib_2/html/js_interop_constructor_name/util.dart
@@ -22,6 +22,15 @@
   external String bar();
 }
 
+@JS('Foo.HTMLDivElement')
+@staticInterop
+class StaticHTMLDivElement {}
+
+extension StaticHTMLDivElementExtension on StaticHTMLDivElement {
+  external String bar();
+  external StaticHTMLDivElement cloneNode(bool deep);
+}
+
 @pragma('dart2js:noInline')
 @pragma('dart2js:assumeDynamic')
 confuse(x) => x;
diff --git a/tests/lib_2/isolate/bool_from_environment_default_value_test.dart b/tests/lib_2/isolate/bool_from_environment_default_value_test.dart
index fe0bd39..aaa2feb 100644
--- a/tests/lib_2/isolate/bool_from_environment_default_value_test.dart
+++ b/tests/lib_2/isolate/bool_from_environment_default_value_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/capability_test.dart b/tests/lib_2/isolate/capability_test.dart
index 5f4ef37..a6570c5 100644
--- a/tests/lib_2/isolate/capability_test.dart
+++ b/tests/lib_2/isolate/capability_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib_2/isolate/compile_time_error_test.dart b/tests/lib_2/isolate/compile_time_error_test.dart
index da85090..88a37d7 100644
--- a/tests/lib_2/isolate/compile_time_error_test.dart
+++ b/tests/lib_2/isolate/compile_time_error_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that errors thrown from isolates are
 // processed correctly and don't result in crashes.
 
@@ -18,9 +15,9 @@
 
 class TestClass {
   TestClass.named(num this.fld1)
-  // Should cause a compilation error (for the spawned isolate). It is a
-  // runtime error for the test.
-    : fld2 = this.fld1 // //# 01: compile-time error
+      // Should cause a compilation error (for the spawned isolate). It is a
+      // runtime error for the test.
+      : fld2 = this.fld1 // //# 01: compile-time error
   ;
   num fld1;
   num fld2;
diff --git a/tests/lib_2/isolate/count_test.dart b/tests/lib_2/isolate/count_test.dart
index e351ef9..90d3d4e 100644
--- a/tests/lib_2/isolate/count_test.dart
+++ b/tests/lib_2/isolate/count_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 library CountTest;
 
diff --git a/tests/lib_2/isolate/cross_isolate_message_test.dart b/tests/lib_2/isolate/cross_isolate_message_test.dart
index 59b9ed6..7d23e24 100644
--- a/tests/lib_2/isolate/cross_isolate_message_test.dart
+++ b/tests/lib_2/isolate/cross_isolate_message_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can communicate to isolates
 // other than the main isolate.
 
diff --git a/tests/lib_2/isolate/deferred_in_isolate2_test.dart b/tests/lib_2/isolate/deferred_in_isolate2_test.dart
index 0db87c3..7f1cb88 100644
--- a/tests/lib_2/isolate/deferred_in_isolate2_test.dart
+++ b/tests/lib_2/isolate/deferred_in_isolate2_test.dart
@@ -4,13 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library deferred_in_isolate2_test;
 
 import 'dart:isolate';
-import 'dart:async';
 import 'package:async_helper/async_minitest.dart';
 
 import 'deferred_in_isolate2_lib.dart' deferred as lib;
diff --git a/tests/lib_2/isolate/deferred_in_isolate_test.dart b/tests/lib_2/isolate/deferred_in_isolate_test.dart
index 25d9fcf4..42ae7e2 100644
--- a/tests/lib_2/isolate/deferred_in_isolate_test.dart
+++ b/tests/lib_2/isolate/deferred_in_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test that deferred libraries are supported from isolates other than the root
 // isolate.
 
diff --git a/tests/lib_2/isolate/enum_const_test.dart b/tests/lib_2/isolate/enum_const_test.dart
index b93202d..09e3d2d 100644
--- a/tests/lib_2/isolate/enum_const_test.dart
+++ b/tests/lib_2/isolate/enum_const_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/error_at_spawn_test.dart b/tests/lib_2/isolate/error_at_spawn_test.dart
index 7eab826..0847d2f 100644
--- a/tests/lib_2/isolate/error_at_spawn_test.dart
+++ b/tests/lib_2/isolate/error_at_spawn_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/error_at_spawnuri_test.dart b/tests/lib_2/isolate/error_at_spawnuri_test.dart
index 8d7254d..0329798 100644
--- a/tests/lib_2/isolate/error_at_spawnuri_test.dart
+++ b/tests/lib_2/isolate/error_at_spawnuri_test.dart
@@ -4,13 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_at_spawnuri;
 
 import "dart:isolate";
-import "dart:async";
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/error_exit_at_spawn_test.dart b/tests/lib_2/isolate/error_exit_at_spawn_test.dart
index 17f5cd6..83f29d1 100644
--- a/tests/lib_2/isolate/error_exit_at_spawn_test.dart
+++ b/tests/lib_2/isolate/error_exit_at_spawn_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/error_exit_at_spawnuri_test.dart b/tests/lib_2/isolate/error_exit_at_spawnuri_test.dart
index 8b43578..b4b5831 100644
--- a/tests/lib_2/isolate/error_exit_at_spawnuri_test.dart
+++ b/tests/lib_2/isolate/error_exit_at_spawnuri_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library error_exit_at_spawnuri;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/exit_at_spawn_test.dart b/tests/lib_2/isolate/exit_at_spawn_test.dart
index ca8cfa5..203ea66 100644
--- a/tests/lib_2/isolate/exit_at_spawn_test.dart
+++ b/tests/lib_2/isolate/exit_at_spawn_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/exit_at_spawnuri_test.dart b/tests/lib_2/isolate/exit_at_spawnuri_test.dart
index f6f4919..cc4000a 100644
--- a/tests/lib_2/isolate/exit_at_spawnuri_test.dart
+++ b/tests/lib_2/isolate/exit_at_spawnuri_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library exit_at_spawn;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/fast_copy_during_initial_message_test.dart b/tests/lib_2/isolate/fast_copy_during_initial_message_test.dart
index 15c3978..8111991 100644
--- a/tests/lib_2/isolate/fast_copy_during_initial_message_test.dart
+++ b/tests/lib_2/isolate/fast_copy_during_initial_message_test.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:isolate";
 
diff --git a/tests/lib_2/isolate/function_send1_test.dart b/tests/lib_2/isolate/function_send1_test.dart
index 2acd91b..c4defba 100644
--- a/tests/lib_2/isolate/function_send1_test.dart
+++ b/tests/lib_2/isolate/function_send1_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/function_send_test.dart b/tests/lib_2/isolate/function_send_test.dart
index 1f208e7..d3ac5fd 100644
--- a/tests/lib_2/isolate/function_send_test.dart
+++ b/tests/lib_2/isolate/function_send_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:isolate";
 import "dart:io";
@@ -15,9 +14,6 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
-
 void toplevel(port, message) {
   port.send("toplevel:$message");
 }
@@ -68,38 +64,17 @@
   // Sendables are top-level functions and static functions only.
   testSendable("toplevel", toplevel);
   testSendable("static", C.staticFunc);
-  // Unsendables are any closure - instance methods or function expression.
-  var c = new C();
-  testUnsendable("instance method", c.instanceMethod);
-  testUnsendable("static context expression", createFuncToplevel());
-  testUnsendable("static context expression", C.createFuncStatic());
-  testUnsendable("initializer context expression", c.initializer);
-  testUnsendable("constructor context expression", c.body);
-  testUnsendable("instance method context expression", c.createFuncMember());
 
   // The result of `toplevel.call` and `staticFunc.call` may or may not be
   // identical to `toplevel` and `staticFunc` respectively. If they are not
   // equal, they may or may not be considered toplevel/static functions anyway,
   // and therefore sendable. The VM and dart2js currently disagree on whether
   // `toplevel` and `toplevel.call` are identical, both allow them to be sent.
-  // If this is ever specified to something else, use:
-  //     testUnsendable("toplevel.call", toplevel.call);
-  //     testUnsendable("static.call", C.staticFunc.call);
-  // instead.
   // These two tests should be considered canaries for accidental behavior
   // change rather than requirements.
   testSendable("toplevel", toplevel.call);
   testSendable("static", C.staticFunc.call);
 
-  // Callable objects are sendable if general objects are (VM yes, dart2js no).
-  // It's unspecified whether arbitrary objects can be sent. If it is specified,
-  // add a test that `new Callable()` is either sendable or unsendable.
-
-  // The call method of a callable object is a closure holding the object,
-  // not a top-level or static function, so it should be blocked, just as
-  // a normal method.
-  testUnsendable("callable object", new Callable().call);
-
   asyncEnd();
   return;
 }
@@ -182,51 +157,6 @@
   initPort.send(singleMessagePort(callFunc));
 }
 
-void testUnsendable(name, func) {
-  // Isolate group support does allow sending closures.
-  if (isolateGroupsEnabled) return;
-
-  asyncStart();
-  Isolate.spawn(nop, func).then((v) => throw "allowed spawn direct?",
-      onError: (e, s) {
-    asyncEnd();
-  });
-  asyncStart();
-  Isolate.spawn(nop, [func]).then((v) => throw "allowed spawn wrapped?",
-      onError: (e, s) {
-    asyncEnd();
-  });
-
-  asyncStart();
-  var noReply = new RawReceivePort((_) {
-    throw "Unexpected message: $_";
-  });
-  Expect.throws(() {
-    noReply.sendPort.send(func);
-  }, null, "send direct");
-  Expect.throws(() {
-    noReply.sendPort.send([func]);
-  }, null, "send wrapped");
-  scheduleMicrotask(() {
-    noReply.close();
-    asyncEnd();
-  });
-
-  // Try sending through other isolate.
-  asyncStart();
-  echoPort((v) {
-    Expect.equals(0, v);
-  }).then((p) {
-    try {
-      p.send(func);
-    } finally {
-      p.send(0); //   Closes echo port.
-    }
-  }).then((p) => throw "unreachable 2", onError: (e, s) {
-    asyncEnd();
-  });
-}
-
 void nop(_) {}
 
 void callFunc(message) {
diff --git a/tests/lib_2/isolate/handle_error2_test.dart b/tests/lib_2/isolate/handle_error2_test.dart
index 0a09262..33fa371 100644
--- a/tests/lib_2/isolate/handle_error2_test.dart
+++ b/tests/lib_2/isolate/handle_error2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/handle_error3_test.dart b/tests/lib_2/isolate/handle_error3_test.dart
index 4d4db96..f6d3c9b7 100644
--- a/tests/lib_2/isolate/handle_error3_test.dart
+++ b/tests/lib_2/isolate/handle_error3_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/handle_error_test.dart b/tests/lib_2/isolate/handle_error_test.dart
index cbc707f..c095862 100644
--- a/tests/lib_2/isolate/handle_error_test.dart
+++ b/tests/lib_2/isolate/handle_error_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library handle_error_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/illegal_msg_function_test.dart b/tests/lib_2/isolate/illegal_msg_function_test.dart
deleted file mode 100644
index dbd3699..0000000
--- a/tests/lib_2/isolate/illegal_msg_function_test.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-// VMOptions=--no-enable-isolate-groups
-
-library illegal_msg_function_test;
-
-import "dart:isolate";
-
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-echo(sendPort) {
-  var port = new ReceivePort();
-  sendPort.send(port.sendPort);
-  port.listen((msg) {
-    sendPort.send("echoing ${msg(1)}}");
-  });
-}
-
-void main() {
-  asyncStart();
-
-  final port = new ReceivePort();
-
-  // Ignore returned Future.
-  Isolate.spawn(echo, port.sendPort);
-
-  port.first.then((_snd) {
-    SendPort snd = _snd;
-    int function(x) => x + 2;
-    try {
-      snd.send(function);
-    } catch (e) {
-      // Expected behavior.
-      port.close();
-      asyncEnd();
-      return;
-    }
-    Expect.fail("Should not be reached. Message sending didn't throw.");
-  });
-}
diff --git a/tests/lib_2/isolate/illegal_msg_mirror_test.dart b/tests/lib_2/isolate/illegal_msg_mirror_test.dart
index ada58e9..0e4fa15 100644
--- a/tests/lib_2/isolate/illegal_msg_mirror_test.dart
+++ b/tests/lib_2/isolate/illegal_msg_mirror_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library illegal_msg_mirror_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/int32_length_overflow_test.dart b/tests/lib_2/isolate/int32_length_overflow_test.dart
index 9d97252..bccdb54 100644
--- a/tests/lib_2/isolate/int32_length_overflow_test.dart
+++ b/tests/lib_2/isolate/int32_length_overflow_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "dart:typed_data";
diff --git a/tests/lib_2/isolate/int_from_environment_default_value_test.dart b/tests/lib_2/isolate/int_from_environment_default_value_test.dart
index fdf1c67..f30c852 100644
--- a/tests/lib_2/isolate/int_from_environment_default_value_test.dart
+++ b/tests/lib_2/isolate/int_from_environment_default_value_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib_2/isolate/isolate_complex_messages_test.dart b/tests/lib_2/isolate/isolate_complex_messages_test.dart
index 6599829..e044aae 100644
--- a/tests/lib_2/isolate/isolate_complex_messages_test.dart
+++ b/tests/lib_2/isolate/isolate_complex_messages_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing isolate communication with
 // complex messages.
diff --git a/tests/lib_2/isolate/isolate_current_test.dart b/tests/lib_2/isolate/isolate_current_test.dart
index c5d1432..99b2efe 100644
--- a/tests/lib_2/isolate/isolate_current_test.dart
+++ b/tests/lib_2/isolate/isolate_current_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 library isolate_current_test;
 
diff --git a/tests/lib_2/isolate/isolate_import_test.dart b/tests/lib_2/isolate/isolate_import_test.dart
index 02f5276..9a2a569 100644
--- a/tests/lib_2/isolate/isolate_import_test.dart
+++ b/tests/lib_2/isolate/isolate_import_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library IsolateImportNegativeTest;
 
 // Omitting the following import is an error:
diff --git a/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart b/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
index 314d563..3188cdd 100644
--- a/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
+++ b/tests/lib_2/isolate/issue_21398_parent_isolate1_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib_2/isolate/issue_21398_parent_isolate2_test.dart b/tests/lib_2/isolate/issue_21398_parent_isolate2_test.dart
index a22fcb5..62e802d 100644
--- a/tests/lib_2/isolate/issue_21398_parent_isolate2_test.dart
+++ b/tests/lib_2/isolate/issue_21398_parent_isolate2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib_2/isolate/issue_21398_parent_isolate_test.dart b/tests/lib_2/isolate/issue_21398_parent_isolate_test.dart
index 86f28b4..6772cd0 100644
--- a/tests/lib_2/isolate/issue_21398_parent_isolate_test.dart
+++ b/tests/lib_2/isolate/issue_21398_parent_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import "package:expect/expect.dart";
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/lib_2/isolate/issue_22778_test.dart b/tests/lib_2/isolate/issue_22778_test.dart
index 6675134..a21fdf3 100644
--- a/tests/lib_2/isolate/issue_22778_test.dart
+++ b/tests/lib_2/isolate/issue_22778_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/issue_24243_parent_isolate_test.dart b/tests/lib_2/isolate/issue_24243_parent_isolate_test.dart
index 7def95e..d292e8b 100644
--- a/tests/lib_2/isolate/issue_24243_parent_isolate_test.dart
+++ b/tests/lib_2/isolate/issue_24243_parent_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:collection';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/issue_35626_test.dart b/tests/lib_2/isolate/issue_35626_test.dart
index 83c371c..57a6cb3 100644
--- a/tests/lib_2/isolate/issue_35626_test.dart
+++ b/tests/lib_2/isolate/issue_35626_test.dart
@@ -4,16 +4,14 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Tests that sets of enums can be set through ports.
 // https://github.com/dart-lang/sdk/issues/35626
 
 library spawn_tests;
 
-import "dart:io";
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/kill2_test.dart b/tests/lib_2/isolate/kill2_test.dart
index e363a3d..0ee1d62 100644
--- a/tests/lib_2/isolate/kill2_test.dart
+++ b/tests/lib_2/isolate/kill2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/kill_infinite_loop_in_initializer_test.dart b/tests/lib_2/isolate/kill_infinite_loop_in_initializer_test.dart
index 591b187..5b5a92b 100644
--- a/tests/lib_2/isolate/kill_infinite_loop_in_initializer_test.dart
+++ b/tests/lib_2/isolate/kill_infinite_loop_in_initializer_test.dart
@@ -4,15 +4,10 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test against out-of-band messages being blocked during lazy
 // static field initialization.
 
 import "dart:isolate";
-import "dart:async";
-import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
 dynamic staticFieldWithBadInitializer = badInitializer();
diff --git a/tests/lib_2/isolate/kill_self_synchronously_test.dart b/tests/lib_2/isolate/kill_self_synchronously_test.dart
index 74edac1..d8eb448 100644
--- a/tests/lib_2/isolate/kill_self_synchronously_test.dart
+++ b/tests/lib_2/isolate/kill_self_synchronously_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:io";
 
diff --git a/tests/lib_2/isolate/kill_self_test.dart b/tests/lib_2/isolate/kill_self_test.dart
index 0ea47b5..8f01f26 100644
--- a/tests/lib_2/isolate/kill_self_test.dart
+++ b/tests/lib_2/isolate/kill_self_test.dart
@@ -4,12 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
-import "package:expect/expect.dart";
+
 import "package:async_helper/async_helper.dart";
 
 isomain1(replyPort) {
diff --git a/tests/lib_2/isolate/kill_test.dart b/tests/lib_2/isolate/kill_test.dart
index dd53477..4966bba 100644
--- a/tests/lib_2/isolate/kill_test.dart
+++ b/tests/lib_2/isolate/kill_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/large_byte_data_leak_test.dart b/tests/lib_2/isolate/large_byte_data_leak_test.dart
index 76fafd5..fda98f7 100644
--- a/tests/lib_2/isolate/large_byte_data_leak_test.dart
+++ b/tests/lib_2/isolate/large_byte_data_leak_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:async";
 import "dart:developer" show UserTag;
diff --git a/tests/lib_2/isolate/large_byte_data_test.dart b/tests/lib_2/isolate/large_byte_data_test.dart
index ff55e0a..be1ce00 100644
--- a/tests/lib_2/isolate/large_byte_data_test.dart
+++ b/tests/lib_2/isolate/large_byte_data_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "dart:typed_data";
diff --git a/tests/lib_2/isolate/mandel_isolate_test.dart b/tests/lib_2/isolate/mandel_isolate_test.dart
index 1d75cb2..249b366 100644
--- a/tests/lib_2/isolate/mandel_isolate_test.dart
+++ b/tests/lib_2/isolate/mandel_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library MandelIsolateTest;
 
 import 'dart:async';
diff --git a/tests/lib_2/isolate/message2_test.dart b/tests/lib_2/isolate/message2_test.dart
index 81892d4..76ac027 100644
--- a/tests/lib_2/isolate/message2_test.dart
+++ b/tests/lib_2/isolate/message2_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
diff --git a/tests/lib_2/isolate/message3_test.dart b/tests/lib_2/isolate/message3_test.dart
index 4eb2c6b..37ddee5 100644
--- a/tests/lib_2/isolate/message3_test.dart
+++ b/tests/lib_2/isolate/message3_test.dart
@@ -4,13 +4,11 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Dart test program for testing serialization of messages.
-// VMOptions=--enable_type_checks --enable_asserts --enable-isolate-groups
-// VMOptions=--enable_type_checks --enable_asserts --no-enable-isolate-groups
+// VMOptions=--enable_type_checks --enable_asserts
 
 library MessageTest;
 
@@ -23,9 +21,6 @@
 import 'package:expect/expect.dart';
 import 'dart:typed_data';
 
-final bool isolateGroupsEnabled =
-    Platform.executableArguments.contains('--enable-isolate-groups');
-
 void echoMain(msg) {
   SendPort replyTo = msg[0];
   SendPort pong = msg[1];
@@ -416,14 +411,10 @@
     Expect.equals(42, x.fun()); //     //# fun: continued
   }); //                               //# fun: continued
 
-  if (isolateGroupsEnabled) {
-    ping.send(new E(new E(null).instanceFun));
-    checks.add((x) {
-      Expect.equals(1234, (x as E).fun());
-    });
-  } else {
-    Expect.throws(() => ping.send(new E(new E(null).instanceFun)));
-  }
+  ping.send(new E(new E(null).instanceFun));
+  checks.add((x) {
+    Expect.equals(1234, (x as E).fun());
+  });
 
   F nonConstF = new F();
   ping.send(nonConstF);
diff --git a/tests/lib_2/isolate/message4_test.dart b/tests/lib_2/isolate/message4_test.dart
index 045cde1..425ebb6 100644
--- a/tests/lib_2/isolate/message4_test.dart
+++ b/tests/lib_2/isolate/message4_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing serialization of messages with static
 // native functions.
 
diff --git a/tests/lib_2/isolate/message_const_type_arguments_1_test.dart b/tests/lib_2/isolate/message_const_type_arguments_1_test.dart
index 8e3144e..c189ecf 100644
--- a/tests/lib_2/isolate/message_const_type_arguments_1_test.dart
+++ b/tests/lib_2/isolate/message_const_type_arguments_1_test.dart
@@ -4,14 +4,11 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // https://github.com/dart-lang/sdk/issues/35778
 
 import "dart:async";
 import "dart:isolate";
-import "dart:typed_data";
+
 import "package:expect/expect.dart";
 
 void child(replyPort) {
diff --git a/tests/lib_2/isolate/message_const_type_arguments_2_test.dart b/tests/lib_2/isolate/message_const_type_arguments_2_test.dart
index 87c76ab..cc2a7e3 100644
--- a/tests/lib_2/isolate/message_const_type_arguments_2_test.dart
+++ b/tests/lib_2/isolate/message_const_type_arguments_2_test.dart
@@ -4,14 +4,11 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // https://github.com/dart-lang/sdk/issues/35778
 
 import "dart:async";
 import "dart:isolate";
-import "dart:typed_data";
+
 import "package:expect/expect.dart";
 
 void child(replyPort) {
diff --git a/tests/lib_2/isolate/message_enum_test.dart b/tests/lib_2/isolate/message_enum_test.dart
index 5487f73..4c34b38 100644
--- a/tests/lib_2/isolate/message_enum_test.dart
+++ b/tests/lib_2/isolate/message_enum_test.dart
@@ -4,12 +4,10 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
+import "dart:isolate";
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
-import "dart:isolate";
 
 enum Foo { BAR, BAZ }
 
diff --git a/tests/lib_2/isolate/message_test.dart b/tests/lib_2/isolate/message_test.dart
index 7ca930a..8189027 100644
--- a/tests/lib_2/isolate/message_test.dart
+++ b/tests/lib_2/isolate/message_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing serialization of messages.
 // VMOptions=--enable_type_checks --enable_asserts
 
diff --git a/tests/lib_2/isolate/mint_maker_test.dart b/tests/lib_2/isolate/mint_maker_test.dart
index 9b1b15c..397d60b 100644
--- a/tests/lib_2/isolate/mint_maker_test.dart
+++ b/tests/lib_2/isolate/mint_maker_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library MintMakerTest;
 
 import 'dart:async';
diff --git a/tests/lib_2/isolate/native_wrapper_message_test.dart b/tests/lib_2/isolate/native_wrapper_message_test.dart
index 4c91d647..1cbf323 100644
--- a/tests/lib_2/isolate/native_wrapper_message_test.dart
+++ b/tests/lib_2/isolate/native_wrapper_message_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:isolate';
 import 'dart:nativewrappers';
 import 'package:expect/expect.dart';
diff --git a/tests/lib_2/isolate/nested_spawn2_test.dart b/tests/lib_2/isolate/nested_spawn2_test.dart
index 5c0c8be..9b93cb9 100644
--- a/tests/lib_2/isolate/nested_spawn2_test.dart
+++ b/tests/lib_2/isolate/nested_spawn2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can spawn other isolates and
 // that the nested isolates can communicate with the main once the spawner has
 // disappeared.
diff --git a/tests/lib_2/isolate/nested_spawn_test.dart b/tests/lib_2/isolate/nested_spawn_test.dart
index 050f383..4483df1 100644
--- a/tests/lib_2/isolate/nested_spawn_test.dart
+++ b/tests/lib_2/isolate/nested_spawn_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates can spawn other isolates.
 
 library NestedSpawnTest;
diff --git a/tests/lib_2/isolate/non_fatal_exception_in_timer_callback_test.dart b/tests/lib_2/isolate/non_fatal_exception_in_timer_callback_test.dart
index 03db0b8..d1a1d32 100644
--- a/tests/lib_2/isolate/non_fatal_exception_in_timer_callback_test.dart
+++ b/tests/lib_2/isolate/non_fatal_exception_in_timer_callback_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:io';
diff --git a/tests/lib_2/isolate/object_leak_test.dart b/tests/lib_2/isolate/object_leak_test.dart
index 719b8d8..8602ca0 100644
--- a/tests/lib_2/isolate/object_leak_test.dart
+++ b/tests/lib_2/isolate/object_leak_test.dart
@@ -4,17 +4,14 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test for http://dartbug.com/18942
 
 library LeakTest;
 
+import 'dart:isolate';
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import 'dart:isolate';
-import 'dart:async';
 
 class A {
   var x = 0;
diff --git a/tests/lib_2/isolate/ondone_test.dart b/tests/lib_2/isolate/ondone_test.dart
index bc5d363..1b8421f 100644
--- a/tests/lib_2/isolate/ondone_test.dart
+++ b/tests/lib_2/isolate/ondone_test.dart
@@ -4,11 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
+
 import "package:async_helper/async_helper.dart";
 
 void isomain(SendPort replyPort) {
diff --git a/tests/lib_2/isolate/package_config_test.dart b/tests/lib_2/isolate/package_config_test.dart
index 264aba2..fe0725d 100644
--- a/tests/lib_2/isolate/package_config_test.dart
+++ b/tests/lib_2/isolate/package_config_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // VMOptions=--trace_shutdown
+
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/package_resolve_test.dart b/tests/lib_2/isolate/package_resolve_test.dart
index c36c430..057c5df 100644
--- a/tests/lib_2/isolate/package_resolve_test.dart
+++ b/tests/lib_2/isolate/package_resolve_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/package_root_test.dart b/tests/lib_2/isolate/package_root_test.dart
index a8ef249..0902696 100644
--- a/tests/lib_2/isolate/package_root_test.dart
+++ b/tests/lib_2/isolate/package_root_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/pause_test.dart b/tests/lib_2/isolate/pause_test.dart
index 240229e..5649705 100644
--- a/tests/lib_2/isolate/pause_test.dart
+++ b/tests/lib_2/isolate/pause_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib_2/isolate/ping_pause_test.dart b/tests/lib_2/isolate/ping_pause_test.dart
index 2c14c4f..8f9ffa0 100644
--- a/tests/lib_2/isolate/ping_pause_test.dart
+++ b/tests/lib_2/isolate/ping_pause_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/ping_test.dart b/tests/lib_2/isolate/ping_test.dart
index 8f191b5..c182e48 100644
--- a/tests/lib_2/isolate/ping_test.dart
+++ b/tests/lib_2/isolate/ping_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "dart:async";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/port_test.dart b/tests/lib_2/isolate/port_test.dart
index b46a048..76e2411 100644
--- a/tests/lib_2/isolate/port_test.dart
+++ b/tests/lib_2/isolate/port_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test properties of ports.
 library PortTest;
 
diff --git a/tests/lib_2/isolate/raw_port_test.dart b/tests/lib_2/isolate/raw_port_test.dart
index 08c1cc9..0f4634f 100644
--- a/tests/lib_2/isolate/raw_port_test.dart
+++ b/tests/lib_2/isolate/raw_port_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test RawReceivePort.
 
 library raw_port_test;
diff --git a/tests/lib_2/isolate/regress_34752_test.dart b/tests/lib_2/isolate/regress_34752_test.dart
index 8fe3c74..c630609 100644
--- a/tests/lib_2/isolate/regress_34752_test.dart
+++ b/tests/lib_2/isolate/regress_34752_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 // Verifies that large BigInt can be passed through a message port and
 // simple arithmetic operations still work after that.
diff --git a/tests/lib_2/isolate/regress_flutter_22796_test.dart b/tests/lib_2/isolate/regress_flutter_22796_test.dart
index 72200b8..35fd6b3 100644
--- a/tests/lib_2/isolate/regress_flutter_22796_test.dart
+++ b/tests/lib_2/isolate/regress_flutter_22796_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Verifies that large typed data can be passed in a field through message port.
 // This is a regression test for
 // https://github.com/flutter/flutter/issues/22796.
diff --git a/tests/lib_2/isolate/request_reply_test.dart b/tests/lib_2/isolate/request_reply_test.dart
index a2a0f53..23e55ed 100644
--- a/tests/lib_2/isolate/request_reply_test.dart
+++ b/tests/lib_2/isolate/request_reply_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library RequestReplyTest;
 
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/resolve_package_uri_test.dart b/tests/lib_2/isolate/resolve_package_uri_test.dart
index ce53991..d47c9d7 100644
--- a/tests/lib_2/isolate/resolve_package_uri_test.dart
+++ b/tests/lib_2/isolate/resolve_package_uri_test.dart
@@ -4,13 +4,9 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Regression test for faulty encoding of `Isolate.resolvePackageUri` by
 // dart2js.
 
-import 'dart:async';
 import 'dart:isolate';
 
 main() {
diff --git a/tests/lib_2/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart b/tests/lib_2/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart
deleted file mode 100644
index 53ae200..0000000
--- a/tests/lib_2/isolate/scenarios/automatic_resolution_root/package_resolve_test.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-import 'dart:io';
-import 'dart:isolate';
-
-final PACKAGE_URI = "package:foo/bar.dart";
-
-main([args, port]) async {
-  if (port != null) {
-    testPackageResolution(port);
-    return;
-  }
-  var p = new RawReceivePort();
-  Isolate.spawnUri(Platform.script, [], p.sendPort,
-      automaticPackageResolution: true);
-  p.handler = (msg) {
-    p.close();
-    if (msg is! List) {
-      print(msg.runtimeType);
-      throw "Failure return from spawned isolate:\n\n$msg";
-    }
-    if (msg[0] != null) {
-      throw "Bad package root in child isolate: ${msg[0]}.\n"
-          "Expected: null";
-    }
-    if (msg[1] != null) {
-      throw "Package path not matching: ${msg[1]}\n"
-          "Expected: null";
-    }
-    print("SUCCESS");
-  };
-  print("Spawning isolate's package root: ${await Isolate.packageRoot}");
-}
-
-testPackageResolution(port) async {
-  try {
-    var packageRootStr = Platform.packageRoot;
-    var packageConfigStr = Platform.packageConfig;
-    var packageRoot = await Isolate.packageRoot;
-    var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(PACKAGE_URI));
-    print("Spawned isolate's package root flag: $packageRootStr");
-    print("Spawned isolate's package config flag: $packageConfigStr");
-    print("Spawned isolate's loaded package root: $packageRoot");
-    print("Spawned isolate's resolved package path: $resolvedPkg");
-    port.send([packageRoot?.toString(), resolvedPkg?.toString()]);
-  } catch (e, s) {
-    port.send("$e\n$s\n");
-  }
-}
diff --git a/tests/lib_2/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart b/tests/lib_2/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
index 4e3cbbd..ccd9088 100644
--- a/tests/lib_2/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
+++ b/tests/lib_2/isolate/scenarios/automatic_resolution_spec/package_resolve_test.dart
@@ -34,16 +34,13 @@
     }
     print("SUCCESS");
   };
-  print("Spawning isolate's package root: ${await Isolate.packageRoot}");
 }
 
 testPackageResolution(port) async {
   try {
-    var packageRootStr = Platform.packageRoot;
     var packageConfigStr = Platform.packageConfig;
     var packageConfig = await Isolate.packageConfig;
     var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(PACKAGE_URI));
-    print("Spawned isolate's package root flag: $packageRootStr");
     print("Spawned isolate's package config flag: $packageConfigStr");
     print("Spawned isolate's loaded package config: $packageConfig");
     print("Spawned isolate's resolved package path: $resolvedPkg");
diff --git a/tests/lib_2/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart b/tests/lib_2/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
index a17f089..ccc4856 100644
--- a/tests/lib_2/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
+++ b/tests/lib_2/isolate/scenarios/bad_resolve_package/bad_resolve_package_test.dart
@@ -33,12 +33,10 @@
 
 testBadResolvePackage(port) async {
   try {
-    var packageRootStr = Platform.packageRoot;
     var packageConfigStr = Platform.packageConfig;
     var packageConfig = await Isolate.packageConfig;
     var badPackageUri = Uri.parse("package:asdf/qwerty.dart");
     var resolvedPkg = await Isolate.resolvePackageUri(badPackageUri);
-    print("Spawned isolate's package root flag: $packageRootStr");
     print("Spawned isolate's package config flag: $packageConfigStr");
     print("Spawned isolate's loaded package config: $packageConfig");
     print("Spawned isolate's resolved package path: $resolvedPkg");
diff --git a/tests/lib_2/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart b/tests/lib_2/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
index c36c430..057c5df 100644
--- a/tests/lib_2/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
+++ b/tests/lib_2/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/scenarios/package_relative_root/package_relative_root_test.dart b/tests/lib_2/isolate/scenarios/package_relative_root/package_relative_root_test.dart
index 49ee784..03f1e0b 100644
--- a/tests/lib_2/isolate/scenarios/package_relative_root/package_relative_root_test.dart
+++ b/tests/lib_2/isolate/scenarios/package_relative_root/package_relative_root_test.dart
@@ -9,8 +9,8 @@
 import 'dart:io';
 import 'dart:isolate';
 
-import "package:foo/foo.dart";
 import "package:bar/bar.dart";
+import "package:foo/foo.dart";
 
 var CONFIG_URI = "package:bar/spawned_packages/";
 
@@ -20,8 +20,7 @@
     return;
   }
   var p = new RawReceivePort();
-  Isolate.spawnUri(Platform.script, [], p.sendPort,
-      packageRoot: Uri.parse(CONFIG_URI));
+  Isolate.spawnUri(Platform.script, [], p.sendPort);
   p.handler = (msg) {
     p.close();
     if (msg is! List) {
@@ -47,11 +46,9 @@
 
 testCorrectBarPackage(port) async {
   try {
-    var packageRootStr = Platform.packageRoot;
     var packageConfigStr = Platform.packageConfig;
     var packageConfig = await Isolate.packageConfig;
     var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI));
-    print("Spawned isolate's package root flag: $packageRootStr");
     print("Spawned isolate's package config flag: $packageConfigStr");
     print("Spawned isolate's loaded package config: $packageConfig");
     print("Spawned isolate's resolved package path: $resolvedPkg");
diff --git a/tests/lib_2/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart b/tests/lib_2/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
index a4c96d6..c8c7ea6 100644
--- a/tests/lib_2/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
+++ b/tests/lib_2/isolate/scenarios/package_relative_spec/package_relative_spec_test.dart
@@ -47,11 +47,9 @@
 
 testCorrectBarPackage(port) async {
   try {
-    var packageRootStr = Platform.packageRoot;
     var packageConfigStr = Platform.packageConfig;
     var packageConfig = await Isolate.packageConfig;
     var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(CONFIG_URI));
-    print("Spawned isolate's package root flag: $packageRootStr");
     print("Spawned isolate's package config flag: $packageConfigStr");
     print("Spawned isolate's loaded package config: $packageConfig");
     print("Spawned isolate's resolved package path: $resolvedPkg");
diff --git a/tests/lib_2/isolate/send_private_test.dart b/tests/lib_2/isolate/send_private_test.dart
index 645c12b..f265187 100644
--- a/tests/lib_2/isolate/send_private_test.dart
+++ b/tests/lib_2/isolate/send_private_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 import "package:expect/expect.dart";
 
diff --git a/tests/lib_2/isolate/simple_message_test.dart b/tests/lib_2/isolate/simple_message_test.dart
index f5a394c..6cd8da0 100644
--- a/tests/lib_2/isolate/simple_message_test.dart
+++ b/tests/lib_2/isolate/simple_message_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Dart test program for testing that isolates are spawned.
 
 library IsolateNegativeTest;
diff --git a/tests/lib_2/isolate/spawn_function_custom_class_test.dart b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
index 0e9ad2b..fbbdf69 100644
--- a/tests/lib_2/isolate/spawn_function_custom_class_test.dart
+++ b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Create a user-defined class in a new isolate.
 //
 // Regression test for vm bug 2235: We were forgetting to finalize
diff --git a/tests/lib_2/isolate/spawn_function_test.dart b/tests/lib_2/isolate/spawn_function_test.dart
index b12246e..5071ffa 100644
--- a/tests/lib_2/isolate/spawn_function_test.dart
+++ b/tests/lib_2/isolate/spawn_function_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a function.
 library spawn_tests;
 
diff --git a/tests/lib_2/isolate/spawn_generic_test.dart b/tests/lib_2/isolate/spawn_generic_test.dart
index 05ea808..7305917 100644
--- a/tests/lib_2/isolate/spawn_generic_test.dart
+++ b/tests/lib_2/isolate/spawn_generic_test.dart
@@ -4,16 +4,13 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Check that Isolate.spawn is generic.
 library spawn_generic;
 
 import "dart:isolate";
 import "dart:async";
+
 import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
 
 void isomain(num args) {
   print(args);
diff --git a/tests/lib_2/isolate/spawn_uri_exported_main_test.dart b/tests/lib_2/isolate/spawn_uri_exported_main_test.dart
index 463181f..d378cb0 100644
--- a/tests/lib_2/isolate/spawn_uri_exported_main_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_exported_main_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:isolate";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/spawn_uri_fail_test.dart b/tests/lib_2/isolate/spawn_uri_fail_test.dart
index 9b5346f..45b39ba 100644
--- a/tests/lib_2/isolate/spawn_uri_fail_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_fail_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:io";
 import "dart:isolate";
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/spawn_uri_missing_from_isolate_test.dart b/tests/lib_2/isolate/spawn_uri_missing_from_isolate_test.dart
index 204fa9c..dfd0305 100644
--- a/tests/lib_2/isolate/spawn_uri_missing_from_isolate_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_missing_from_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 /// Tests that Isolate.spawnUri completes with an error when the given URI
 /// doesn't resolve to an existing resource.
 ///
diff --git a/tests/lib_2/isolate/spawn_uri_missing_test.dart b/tests/lib_2/isolate/spawn_uri_missing_test.dart
index fe27ff0..99e70b0 100644
--- a/tests/lib_2/isolate/spawn_uri_missing_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_missing_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 /// Tests that Isolate.spanUri completes with an error when the given URI
 /// doesn't resolve to an existing resource.
 library test.isolate.spawn_uri_missing_test;
diff --git a/tests/lib_2/isolate/spawn_uri_multi_test.dart b/tests/lib_2/isolate/spawn_uri_multi_test.dart
index dc50328..7d22284 100644
--- a/tests/lib_2/isolate/spawn_uri_multi_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_multi_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Negative test to make sure that we are reaching all assertions.
 library spawn_tests;
 
diff --git a/tests/lib_2/isolate/spawn_uri_nested_vm_test.dart b/tests/lib_2/isolate/spawn_uri_nested_vm_test.dart
index 81e5882..facefde 100644
--- a/tests/lib_2/isolate/spawn_uri_nested_vm_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_nested_vm_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of nested spawning of isolates from a URI
 library NestedSpawnUriLibrary;
 
diff --git a/tests/lib_2/isolate/spawn_uri_test.dart b/tests/lib_2/isolate/spawn_uri_test.dart
index 88e99bf..e85fbc6 100644
--- a/tests/lib_2/isolate/spawn_uri_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a URI
 library spawn_tests;
 
diff --git a/tests/lib_2/isolate/spawn_uri_vm_test.dart b/tests/lib_2/isolate/spawn_uri_vm_test.dart
index 536b912..429b62b 100644
--- a/tests/lib_2/isolate/spawn_uri_vm_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_vm_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Example of spawning an isolate from a URI
 library spawn_tests;
 
diff --git a/tests/lib_2/isolate/start_paused_test.dart b/tests/lib_2/isolate/start_paused_test.dart
index 7ee4993..e066a93 100644
--- a/tests/lib_2/isolate/start_paused_test.dart
+++ b/tests/lib_2/isolate/start_paused_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library start_paused_test;
 
 import "dart:isolate";
diff --git a/tests/lib_2/isolate/static_function_test.dart b/tests/lib_2/isolate/static_function_test.dart
index 23a18fe..cccae39 100644
--- a/tests/lib_2/isolate/static_function_test.dart
+++ b/tests/lib_2/isolate/static_function_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // Test starting isolate with static functions (and toplevel ones, for sanity).
 
 library static_function_test;
@@ -118,9 +115,6 @@
 }
 
 void main([args, port]) {
-  final bool isolateGroupsEnabled =
-      Platform.executableArguments.contains('--enable-isolate-groups');
-
   asyncStart();
   // Sanity check.
   spawnTest("function", function, "TOP");
@@ -140,31 +134,17 @@
   spawnTest("lib._class._function", lib.privateClassFunction, "_LIB");
   spawnTest("lib._class._function", lib.privateClassAndFunction, "_LIBPRIVATE");
 
-  if (isolateGroupsEnabled) {
-    spawnTest("static closure", staticClosure, "WHAT?");
-    spawnTest("dynamic closure", dynamicClosure, "WHAT??");
-    spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
-    spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
-    spawnTest(
-        "initializer closure", new C().constructorInitializerClosure, "Init?");
-    spawnTest(
-        "constructor closure", new C().constructorBodyClosure, "bodyClosure?");
-    spawnTest("named constructor closure", new C().namedConstructorBodyClosure,
-        "namedBodyClosure?");
-    spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");
-  } else {
-    // Negative tests
-    functionFailTest("static closure", staticClosure);
-    functionFailTest("dynamic closure", dynamicClosure);
-    functionFailTest("named dynamic closure", namedDynamicClosure);
-    functionFailTest("instance closure", new C().instanceClosure);
-    functionFailTest(
-        "initializer closure", new C().constructorInitializerClosure);
-    functionFailTest("constructor closure", new C().constructorBodyClosure);
-    functionFailTest(
-        "named constructor closure", new C().namedConstructorBodyClosure);
-    functionFailTest("instance method", new C().instanceMethod);
-  }
+  spawnTest("static closure", staticClosure, "WHAT?");
+  spawnTest("dynamic closure", dynamicClosure, "WHAT??");
+  spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
+  spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
+  spawnTest(
+      "initializer closure", new C().constructorInitializerClosure, "Init?");
+  spawnTest(
+      "constructor closure", new C().constructorBodyClosure, "bodyClosure?");
+  spawnTest("named constructor closure", new C().namedConstructorBodyClosure,
+      "namedBodyClosure?");
+  spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");
 
   asyncEnd();
 }
diff --git a/tests/lib_2/isolate/string_from_environment_default_value_test.dart b/tests/lib_2/isolate/string_from_environment_default_value_test.dart
index f920f65..1a9a550 100644
--- a/tests/lib_2/isolate/string_from_environment_default_value_test.dart
+++ b/tests/lib_2/isolate/string_from_environment_default_value_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/timer_isolate_test.dart b/tests/lib_2/isolate/timer_isolate_test.dart
index 07485a6..9f87aa5 100644
--- a/tests/lib_2/isolate/timer_isolate_test.dart
+++ b/tests/lib_2/isolate/timer_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library multiple_timer_test;
 
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/timer_multiple_isolates_test.dart b/tests/lib_2/isolate/timer_multiple_isolates_test.dart
index 0321a8b..d8b6fb7 100644
--- a/tests/lib_2/isolate/timer_multiple_isolates_test.dart
+++ b/tests/lib_2/isolate/timer_multiple_isolates_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library timer_multiple_isolates_test;
 
 import 'dart:isolate';
diff --git a/tests/lib_2/isolate/transferable_failed_to_send_test.dart b/tests/lib_2/isolate/transferable_failed_to_send_test.dart
index 8f339585..b0ac3f4 100644
--- a/tests/lib_2/isolate/transferable_failed_to_send_test.dart
+++ b/tests/lib_2/isolate/transferable_failed_to_send_test.dart
@@ -4,16 +4,14 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:io" show ServerSocket;
 import "dart:isolate";
 import "dart:typed_data" show ByteData;
 
 import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
 
 void main() async {
   final port = new ReceivePort();
diff --git a/tests/lib_2/isolate/transferable_test.dart b/tests/lib_2/isolate/transferable_test.dart
index 26cb2e0..5d8ed4d 100644
--- a/tests/lib_2/isolate/transferable_test.dart
+++ b/tests/lib_2/isolate/transferable_test.dart
@@ -4,9 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups --no-enable-fast-object-copy
-// VMOptions=--enable-isolate-groups --enable-fast-object-copy
-// VMOptions=--no-enable-isolate-groups
+// VMOptions=--no-enable-fast-object-copy
+// VMOptions=--enable-fast-object-copy
 
 import "dart:async";
 import "dart:collection";
diff --git a/tests/lib_2/isolate/typed_message_test.dart b/tests/lib_2/isolate/typed_message_test.dart
index 3b30415..77c76d0 100644
--- a/tests/lib_2/isolate/typed_message_test.dart
+++ b/tests/lib_2/isolate/typed_message_test.dart
@@ -4,8 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
 // Dart test program for testing isolate communication with
 // typed objects.
 
diff --git a/tests/lib_2/isolate/unresolved_ports_test.dart b/tests/lib_2/isolate/unresolved_ports_test.dart
index 408a26e..5147909 100644
--- a/tests/lib_2/isolate/unresolved_ports_test.dart
+++ b/tests/lib_2/isolate/unresolved_ports_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 // spawns multiple isolates and sends unresolved ports between them.
 library unresolved_ports;
 
diff --git a/tests/lib_2/isolate/vm_rehash_test.dart b/tests/lib_2/isolate/vm_rehash_test.dart
index 3813b67..2709901 100644
--- a/tests/lib_2/isolate/vm_rehash_test.dart
+++ b/tests/lib_2/isolate/vm_rehash_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/lib_2/isolate/weak_property_message_1_test.dart b/tests/lib_2/isolate/weak_property_message_1_test.dart
index b58e261..f5889fb 100644
--- a/tests/lib_2/isolate/weak_property_message_1_test.dart
+++ b/tests/lib_2/isolate/weak_property_message_1_test.dart
@@ -6,9 +6,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/lib_2/isolate/weak_property_message_2_test.dart b/tests/lib_2/isolate/weak_property_message_2_test.dart
index 353a8f5..517ae34 100644
--- a/tests/lib_2/isolate/weak_property_message_2_test.dart
+++ b/tests/lib_2/isolate/weak_property_message_2_test.dart
@@ -6,9 +6,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--no-enable-isolate-groups
-// VMOptions=--enable-isolate-groups
-
 import "dart:developer";
 import "dart:isolate";
 
diff --git a/tests/lib_2/js/external_extension_members_test.dart b/tests/lib_2/js/external_extension_members_test.dart
index b1b0cfe..34cc509 100644
--- a/tests/lib_2/js/external_extension_members_test.dart
+++ b/tests/lib_2/js/external_extension_members_test.dart
@@ -32,6 +32,7 @@
   external set annotatedSetter(_);
 
   external num getField();
+  external void setField10([optionalArgument = 10]);
   @JS('toString')
   external String extToString();
   external dynamic getFirstEl(list);
@@ -71,6 +72,10 @@
       return this.field;
     }
 
+    Foo.prototype.setField10 = function(optionalArgument) {
+      this.field = optionalArgument;
+    }
+
     Foo.prototype.getFirstEl = function(list) {
       return list[0];
     }
@@ -110,6 +115,24 @@
     expect(foo.otherSumFn(10, 5), equals(15));
   });
 
+  // TODO(41375): Remove if JS interop default value arguments are disallowed.
+  test('optional arguments', () {
+    var foo = Foo(42);
+    expect(foo.getField(), equals(42));
+
+    foo.setField10();
+    expect(foo.getField(), equals(10));
+    foo.setField10(6);
+    expect(foo.getField(), equals(6));
+
+    // Test using tearoffs
+    var setF = foo.setField10;
+    setF();
+    expect(foo.getField(), equals(10));
+    setF(6);
+    expect(foo.getField(), equals(6));
+  });
+
   test('module class', () {
     var bar = Bar(5);
     expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index d79f2ba..bef1d69 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -11,6 +11,9 @@
 developer/timeline_test: Skip # Not supported
 isolate/issue_24243_parent_isolate_test: Skip # Requires checked mode
 
+[ $runtime == d8 ]
+js/js_util/javascriptobject_extensions_test.dart: SkipByDesign # Uses dart:html.
+
 [ $runtime == dart_precompiled ]
 isolate/package_config_getter_test: SkipByDesign # AOT mode doesn't preserve package structure.
 
diff --git a/tests/modular/cross_module_constant_with_mixin/a.dart b/tests/modular/cross_module_constant_with_mixin/a.dart
new file mode 100644
index 0000000..3e1b8b9
--- /dev/null
+++ b/tests/modular/cross_module_constant_with_mixin/a.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 't.dart';
+
+String _defaultStringy(String t) => t.toLowerCase();
+
+class A {
+  A({
+    double d = 3.14,
+    StringyFunction<String> s = _defaultStringy,
+  }) : this.factoryConstructor(d: d, s: s);
+
+  A.factoryConstructor({
+    double d = 3.14,
+    StringyFunction<String> s = _defaultStringy,
+  })  : d = d,
+        _s = s;
+
+  String doStringy(String i) => _s(i);
+
+  final double d;
+  final StringyFunction<String> _s;
+}
diff --git a/tests/modular/cross_module_constant_with_mixin/b.dart b/tests/modular/cross_module_constant_with_mixin/b.dart
new file mode 100644
index 0000000..03b89b8
--- /dev/null
+++ b/tests/modular/cross_module_constant_with_mixin/b.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'a.dart';
+import 'm.dart';
+
+class B extends A with M {
+  B({double d = 2.71}) : super(d: d);
+}
diff --git a/tests/modular/cross_module_constant_with_mixin/m.dart b/tests/modular/cross_module_constant_with_mixin/m.dart
new file mode 100644
index 0000000..e4f4935
--- /dev/null
+++ b/tests/modular/cross_module_constant_with_mixin/m.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'a.dart';
+
+mixin M on A {
+  m1() {}
+}
diff --git a/tests/modular/cross_module_constant_with_mixin/main.dart b/tests/modular/cross_module_constant_with_mixin/main.dart
new file mode 100644
index 0000000..8daaa4e
--- /dev/null
+++ b/tests/modular/cross_module_constant_with_mixin/main.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+import 'b.dart';
+
+main() {
+  var bInst = B();
+  Expect.equals(2.71, bInst.d);
+  Expect.equals('default', bInst.doStringy('DEFAULT'));
+}
diff --git a/tests/modular/cross_module_constant_with_mixin/modules.yaml b/tests/modular/cross_module_constant_with_mixin/modules.yaml
new file mode 100644
index 0000000..54b3cdf
--- /dev/null
+++ b/tests/modular/cross_module_constant_with_mixin/modules.yaml
@@ -0,0 +1,9 @@
+# Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+dependencies:
+  main: [a, b, m, expect]
+  b: [a, m]
+  m: a
+  a: t
diff --git a/tests/modular/cross_module_constant_with_mixin/t.dart b/tests/modular/cross_module_constant_with_mixin/t.dart
new file mode 100644
index 0000000..ab0db0e
--- /dev/null
+++ b/tests/modular/cross_module_constant_with_mixin/t.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+typedef StringyFunction<T> = String Function(T item);
diff --git a/tests/modular/static_interop_erasure/.packages b/tests/modular/static_interop_erasure/.packages
new file mode 100644
index 0000000..fce126f
--- /dev/null
+++ b/tests/modular/static_interop_erasure/.packages
@@ -0,0 +1 @@
+js:../../../pkg/js/lib
diff --git a/tests/modular/static_interop_erasure/main.dart b/tests/modular/static_interop_erasure/main.dart
new file mode 100644
index 0000000..80ccc3b
--- /dev/null
+++ b/tests/modular/static_interop_erasure/main.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'static_interop.dart';
+
+void main() {
+  setUp();
+  var staticJs = StaticJSClass.factory();
+}
diff --git a/tests/modular/static_interop_erasure/modules.yaml b/tests/modular/static_interop_erasure/modules.yaml
new file mode 100644
index 0000000..6d1a988
--- /dev/null
+++ b/tests/modular/static_interop_erasure/modules.yaml
@@ -0,0 +1,9 @@
+# Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+#
+# Test that modular compilation still works with static interop classes that
+# contain factories.
+dependencies:
+  main: static_interop
+  static_interop: js
diff --git a/tests/modular/static_interop_erasure/static_interop.dart b/tests/modular/static_interop_erasure/static_interop.dart
new file mode 100644
index 0000000..a5c93c4
--- /dev/null
+++ b/tests/modular/static_interop_erasure/static_interop.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@JS()
+library static_interop;
+
+import 'package:js/js.dart';
+
+@JS()
+external void eval(String code);
+
+@JS('JSClass')
+@staticInterop
+class StaticJSClass {
+  external StaticJSClass();
+  factory StaticJSClass.factory() {
+    return StaticJSClass();
+  }
+}
+
+void setUp() {
+  eval('''function JSClass() {}''');
+}
diff --git a/tests/standalone/fields_may_be_reset_test.dart b/tests/standalone/fields_may_be_reset_test.dart
deleted file mode 100644
index 3ab6fc6..0000000
--- a/tests/standalone/fields_may_be_reset_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--fields_may_be_reset
-
-main() {
-  print("Okay");
-}
diff --git a/tests/standalone/io/directory_rename_test.dart b/tests/standalone/io/directory_rename_test.dart
new file mode 100644
index 0000000..de14cea
--- /dev/null
+++ b/tests/standalone/io/directory_rename_test.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Directory rename test.
+
+import "dart:io";
+
+import "package:expect/expect.dart";
+import 'test_utils.dart' show withTempDir;
+
+testRenameToNewPath() async {
+  await withTempDir('testRenameToNewPath', (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+
+    dir1.renameSync("${tempDir.path}/dir2");
+    Expect.isTrue(Directory("${tempDir.path}/dir2").existsSync());
+  });
+}
+
+testRenamePath() async {
+  // Verifies that the returned directory has the correct path.
+  await withTempDir('testRenameToNewPath', (Directory tempDir) async {
+    final oldDir = Directory("${tempDir.path}/dir1");
+    oldDir.createSync();
+
+    final newDir = oldDir.renameSync("${tempDir.path}/dir2");
+
+    Expect.isTrue(
+        oldDir.path == "${tempDir.path}/dir1",
+        "${oldDir.path} != '${tempDir.path}/dir1'"
+        "- path should not be updated");
+    Expect.isTrue(
+        newDir.path == "${tempDir.path}/dir2",
+        "${newDir.path} != '${tempDir.path}/dir2'"
+        "- path should be updated");
+  });
+}
+
+testRenameToSamePath() async {
+  await withTempDir('testRenameToSamePath', (Directory tempDir) async {
+    final dir = Directory("${tempDir.path}/dir");
+    dir.createSync();
+    final file = File("${dir.path}/file");
+    file.createSync();
+
+    dir.renameSync(dir.path);
+    Expect.isTrue(file.existsSync());
+  });
+}
+
+testRenameToExistingFile() async {
+  await withTempDir('testRenameToExistingFile', (Directory tempDir) async {
+    final dir = Directory("${tempDir.path}/dir");
+    dir.createSync();
+    final file = File("${tempDir.path}/file");
+    file.createSync();
+
+    // Overwriting an exsting file is not allowed.
+    try {
+      dir.renameSync(file.path);
+      Expect.fail('Directory.rename should fail to rename a non-directory');
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError!.message.contains('file already exists'),
+            'Unexpected error: $e');
+      } else if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError!.message.contains('Not a directory'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+testRenameToExistingEmptyDirectory() async {
+  await withTempDir('testRenameToExistingEmptyDirectory',
+      (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+    File("${dir1.path}/file").createSync();
+
+    final dir2 = Directory("${tempDir.path}/dir2");
+    dir2.createSync();
+
+    try {
+      dir1.renameSync(dir2.path);
+      // Verify that the file contained in dir1 has been moved.
+      if (Platform.isWindows) {
+        Expect.fail(
+            'Directory.rename should fail to rename over an existing directory '
+            'on Windows');
+      } else {
+        Expect.isTrue(File("${dir2.path}/file").existsSync());
+      }
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError!.message.contains('file already exists'));
+      } else {
+        Expect.fail('Directory.rename should allow moves to empty directories');
+      }
+    }
+  });
+}
+
+testRenameToExistingNonEmptyDirectory() async {
+  await withTempDir('testRenameToExistingNonEmptyDirectory',
+      (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+    File("${dir1.path}/file1").createSync();
+
+    final dir2 = Directory("${tempDir.path}/dir2");
+    dir2.createSync();
+    File("${dir2.path}/file2").createSync();
+
+    try {
+      dir1.renameSync(dir2.path);
+      Expect.fail(
+          'Directory.rename should fail to rename a non-empty directory');
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError!.message.contains('file already exists'),
+            'Unexpected error: $e');
+      } else if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError!.message.contains('Directory not empty'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+testRenameButActuallyFile() async {
+  await withTempDir('testRenameButActuallyFile', (Directory tempDir) async {
+    final file = File("${tempDir.path}/file");
+    file.createSync();
+    final dir = Directory(file.path);
+    try {
+      dir.renameSync("${tempDir.path}/dir");
+      Expect.fail("Expected a failure to rename the file.");
+    } on FileSystemException catch (e) {
+      Expect.isTrue(
+          e.message.contains('Rename failed'), 'Unexpected error: $e');
+      if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError!.message.contains('Not a directory'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+main() async {
+  await testRenameToNewPath();
+  await testRenamePath();
+  await testRenameToSamePath();
+  await testRenameToExistingFile();
+  await testRenameToExistingEmptyDirectory();
+  await testRenameToExistingNonEmptyDirectory();
+  await testRenameButActuallyFile();
+}
diff --git a/tests/standalone/io/directory_test.dart b/tests/standalone/io/directory_test.dart
index 5c39405..c6f6e81 100644
--- a/tests/standalone/io/directory_test.dart
+++ b/tests/standalone/io/directory_test.dart
@@ -582,36 +582,6 @@
   });
 }
 
-testRename() {
-  var temp1 = Directory.systemTemp.createTempSync('directory_test');
-  var temp2 = Directory.systemTemp.createTempSync('directory_test');
-  var temp3 = temp1.renameSync(temp2.path);
-  Expect.isFalse(temp1.existsSync());
-  Expect.isTrue(temp2.existsSync());
-  Expect.equals(temp3.path, temp2.path);
-
-  var temp4 = temp2.renameSync(temp1.path);
-  Expect.isFalse(temp3.existsSync());
-  Expect.isFalse(temp2.existsSync());
-  Expect.isTrue(temp1.existsSync());
-  Expect.isTrue(temp4.existsSync());
-  Expect.equals(temp1.path, temp4.path);
-
-  String foo = '${temp4.path}/foo';
-  String bar = '${temp4.path}/bar';
-  new File(foo).createSync();
-  try {
-    new Directory(foo).renameSync(bar);
-    Expect.fail('Directory.rename should fail to rename a non-directory');
-  } on FileSystemException catch (e) {
-    if (Platform.isLinux || Platform.isMacOS) {
-      Expect.isTrue(e.osError!.message.contains('Not a directory'));
-    }
-  }
-
-  temp1.deleteSync(recursive: true);
-}
-
 main() {
   DirectoryTest.testMain();
   NestedTempDirectoryTest.testMain();
@@ -621,5 +591,4 @@
   testCreateExisting();
   testCreateDirExistingFileSync();
   testCreateDirExistingFile();
-  testRename();
 }
diff --git a/tests/standalone/io/echo_server_stream_test.dart b/tests/standalone/io/echo_server_stream_test.dart
index 6da8ca2..ffbeba2 100644
--- a/tests/standalone/io/echo_server_stream_test.dart
+++ b/tests/standalone/io/echo_server_stream_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Echo server test program to test socket streams.
 //
 // VMOptions=
diff --git a/tests/standalone/io/file_stat_test.dart b/tests/standalone/io/file_stat_test.dart
index 86054da..8cc3e0e 100644
--- a/tests/standalone/io/file_stat_test.dart
+++ b/tests/standalone/io/file_stat_test.dart
@@ -19,11 +19,16 @@
   Expect.equals(FileSystemEntityType.notFound, fileStat.type);
   Expect.equals(FileSystemEntityType.notFound, fileStatDirect.type);
   file.writeAsStringSync("Dart IO library test of FileStat");
+  Link link = new Link(join(directory.path, "link"));
+  link.createSync(file.path);
   new Timer(const Duration(seconds: 2), () {
     file.readAsStringSync();
     directory.listSync();
     FileStat fileStat = FileStat.statSync(file.path);
     FileStat fileStatDirect = file.statSync();
+    FileStat linkStat = FileStat.statSync(link.path);
+    FileStat linkStatDirect = link.statSync();
+
     Expect.equals(FileSystemEntityType.file, fileStat.type);
     Expect.equals(32, fileStat.size);
     Expect.equals(FileSystemEntityType.file, fileStatDirect.type);
@@ -44,6 +49,13 @@
           directoryStat.changed.compareTo(directoryStat.accessed) < 0);
     }
     Expect.equals(7 << 6, directoryStat.mode & (7 << 6)); // Includes +urwx.
+
+    // Verify that statSync resolves the link.
+    Expect.equals(FileSystemEntityType.file, linkStat.type);
+    Expect.equals(32, linkStat.size);
+    Expect.equals(FileSystemEntityType.file, linkStatDirect.type);
+    Expect.equals(32, linkStatDirect.size);
+
     directory.deleteSync(recursive: true);
   });
 }
diff --git a/tests/standalone/io/file_system_watcher_large_set_test.dart b/tests/standalone/io/file_system_watcher_large_set_test.dart
index 2a4ed9d..07873a7 100644
--- a/tests/standalone/io/file_system_watcher_large_set_test.dart
+++ b/tests/standalone/io/file_system_watcher_large_set_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--delayed-filewatch-callback --enable-isolate-groups
-// VMOptions=--delayed-filewatch-callback --no-enable-isolate-groups
+// VMOptions=--delayed-filewatch-callback
 
 // Verifies that cancelling subscription from inside of the event handler
 // works as expected, does not result in crash or hang.
diff --git a/tests/standalone/io/file_system_watcher_test.dart b/tests/standalone/io/file_system_watcher_test.dart
index dae7f9d..e629e56 100644
--- a/tests/standalone/io/file_system_watcher_test.dart
+++ b/tests/standalone/io/file_system_watcher_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/http_advanced_test.dart b/tests/standalone/io/http_advanced_test.dart
index 87553d9..344e0da 100644
--- a/tests/standalone/io/http_advanced_test.dart
+++ b/tests/standalone/io/http_advanced_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone/io/http_basic_test.dart b/tests/standalone/io/http_basic_test.dart
index acc6eb5..9d001b0 100644
--- a/tests/standalone/io/http_basic_test.dart
+++ b/tests/standalone/io/http_basic_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=--trace_shutdown
 // VMOptions=--trace_shutdown --short_socket_read
 // VMOptions=--trace_shutdown --short_socket_write
diff --git a/tests/standalone/io/http_read_test.dart b/tests/standalone/io/http_read_test.dart
index b6f4a7e..584a7e1 100644
--- a/tests/standalone/io/http_read_test.dart
+++ b/tests/standalone/io/http_read_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone/io/http_redirect_test.dart b/tests/standalone/io/http_redirect_test.dart
index f68e32f..1a19222 100644
--- a/tests/standalone/io/http_redirect_test.dart
+++ b/tests/standalone/io/http_redirect_test.dart
@@ -7,7 +7,7 @@
 import "dart:async";
 import "dart:io";
 
-Future<HttpServer> setupServer() {
+Future<HttpServer> setupServer({Uri? targetServer}) {
   final completer = new Completer<HttpServer>();
   HttpServer.bind("127.0.0.1", 0).then((server) {
     var handlers = new Map<String, Function>();
@@ -128,6 +128,8 @@
     // Setup redirect checking headers.
     addRequestHandler("/src", (HttpRequest request, HttpResponse response) {
       Expect.equals("value", request.headers.value("X-Request-Header"));
+      Expect.isNotNull(request.headers.value("Authorization"),
+          "expected 'Authorization' header to be set");
       response.headers.set(
           HttpHeaders.locationHeader, "http://127.0.0.1:${server.port}/target");
       response.statusCode = HttpStatus.movedPermanently;
@@ -135,9 +137,24 @@
     });
     addRequestHandler("/target", (HttpRequest request, HttpResponse response) {
       Expect.equals("value", request.headers.value("X-Request-Header"));
+      Expect.isNotNull(request.headers.value("Authorization"),
+          "expected 'Authorization' header to be set");
       response.close();
     });
 
+    if (targetServer != null) {
+      addRequestHandler("/src-crossdomain",
+          (HttpRequest request, HttpResponse response) {
+        Expect.equals("value", request.headers.value("X-Request-Header"));
+        Expect.isNotNull(request.headers.value("Authorization"),
+            "expected 'Authorization' header to be set");
+        response.headers
+            .set(HttpHeaders.locationHeader, targetServer.toString());
+        response.statusCode = HttpStatus.movedPermanently;
+        response.close();
+      });
+    }
+
     // Setup redirect for 301 where POST should not redirect.
     addRequestHandler("/301src", (HttpRequest request, HttpResponse response) {
       Expect.equals("POST", request.method);
@@ -183,6 +200,36 @@
   return completer.future;
 }
 
+// A second HTTP server used to validate that redirect requests accross domains
+// do *not* include security-related headers.
+Future<HttpServer> setupTargetServer() {
+  final completer = new Completer<HttpServer>();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    var handlers = new Map<String, Function>();
+    addRequestHandler(
+        String path, void handler(HttpRequest request, HttpResponse response)) {
+      handlers[path] = handler;
+    }
+
+    server.listen((HttpRequest request) {
+      if (request.uri.path == "/target") {
+        Expect.equals("value", request.headers.value("X-Request-Header"));
+        Expect.isNull(request.headers.value("Authorization"),
+            "expected 'Authorization' header to be removed on redirect");
+        request.response.close();
+      } else {
+        request.listen((_) {}, onDone: () {
+          request.response.statusCode = 404;
+          request.response.close();
+        });
+      }
+    });
+
+    completer.complete(server);
+  });
+  return completer.future;
+}
+
 void checkRedirects(int redirectCount, HttpClientResponse response) {
   if (redirectCount < 2) {
     Expect.isTrue(response.redirects.isEmpty);
@@ -250,6 +297,7 @@
         .then((HttpClientRequest request) {
       request.followRedirects = false;
       request.headers.add("X-Request-Header", "value");
+      request.headers.add("Authorization", "Basic ...");
       return request.close();
     }).then(handleResponse);
   });
@@ -282,6 +330,7 @@
         .getUrl(Uri.parse("http://127.0.0.1:${server.port}/src"))
         .then((HttpClientRequest request) {
       request.headers.add("X-Request-Header", "value");
+      request.headers.add("Authorization", "Basic ...");
       return request.close();
     }).then((HttpClientResponse response) {
       response.listen((_) => Expect.fail("Response data not expected"),
@@ -294,6 +343,33 @@
   });
 }
 
+void testCrossDomainAutoRedirectWithHeaders() {
+  setupTargetServer().then((targetServer) {
+    setupServer(
+            targetServer:
+                Uri.parse("http://127.0.0.1:${targetServer.port}/target"))
+        .then((server) {
+      HttpClient client = new HttpClient();
+
+      client
+          .getUrl(Uri.parse("http://127.0.0.1:${server.port}/src-crossdomain"))
+          .then((HttpClientRequest request) {
+        request.headers.add("X-Request-Header", "value");
+        request.headers.add("Authorization", "Basic ...");
+        return request.close();
+      }).then((HttpClientResponse response) {
+        response.listen((_) => Expect.fail("Response data not expected"),
+            onDone: () {
+          Expect.equals(1, response.redirects.length);
+          targetServer.close();
+          server.close();
+          client.close();
+        });
+      });
+    });
+  });
+}
+
 void testAutoRedirect301POST() {
   setupServer().then((server) {
     HttpClient client = new HttpClient();
@@ -441,6 +517,7 @@
   testManualRedirectWithHeaders();
   testAutoRedirect();
   testAutoRedirectWithHeaders();
+  testCrossDomainAutoRedirectWithHeaders();
   testAutoRedirect301POST();
   testAutoRedirect303POST();
   testAutoRedirectLimit();
diff --git a/tests/standalone/io/io_override_test.dart b/tests/standalone/io/io_override_test.dart
index 03c41af..fdd49ba 100644
--- a/tests/standalone/io/io_override_test.dart
+++ b/tests/standalone/io/io_override_test.dart
@@ -161,12 +161,12 @@
 }
 
 Future<Socket> socketConnect(dynamic host, int port,
-    {dynamic sourceAddress, Duration? timeout}) {
+    {dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) {
   throw "";
 }
 
 Future<ConnectionTask<Socket>> socketStartConnect(dynamic host, int port,
-    {dynamic sourceAddress}) {
+    {dynamic sourceAddress, int sourcePort = 0}) {
   throw "";
 }
 
@@ -175,7 +175,30 @@
   throw "";
 }
 
+class StdinMock extends Stream<List<int>> implements Stdin {
+  bool echoMode = false;
+  bool lineMode = false;
+  bool get hasTerminal => throw "";
+  bool get supportsAnsiEscapes => throw "";
+
+  int readByteSync() => throw "";
+  String readLineSync(
+          {Encoding encoding = systemEncoding, bool retainNewlines = false}) =>
+      throw "";
+  StreamSubscription<List<int>> listen(void onData(List<int> event)?,
+      {Function? onError, void onDone()?, bool? cancelOnError}) {
+    throw "";
+  }
+}
+
+class StdoutMock implements Stdout {
+  Never noSuchMethod(Invocation i) => throw "";
+}
+
 Future<Null> ioOverridesRunTest() async {
+  StdoutMock stdoutMock = StdoutMock();
+  StdoutMock stderrMock = StdoutMock();
+
   Future<Null> f = IOOverrides.runZoned(
     () async {
       Expect.isTrue(new Directory("directory") is DirectoryMock);
@@ -197,6 +220,9 @@
       asyncExpectThrows(() async => await Socket.connect(null, 0));
       asyncExpectThrows(() async => await Socket.startConnect(null, 0));
       asyncExpectThrows(() async => await ServerSocket.bind(null, 0));
+      Expect.isTrue(stdin is StdinMock);
+      Expect.identical(stdout, stdoutMock);
+      Expect.identical(stderr, stderrMock);
     },
     createDirectory: DirectoryMock.createDirectory,
     getCurrentDirectory: DirectoryMock.getCurrent,
@@ -215,6 +241,9 @@
     socketConnect: socketConnect,
     socketStartConnect: socketStartConnect,
     serverSocketBind: serverSocketBind,
+    stdin: () => StdinMock(),
+    stdout: () => stdoutMock,
+    stderr: () => stderrMock,
   );
   Expect.isFalse(new Directory("directory") is DirectoryMock);
   Expect.isTrue(new Directory("directory") is Directory);
diff --git a/tests/standalone/io/pipe_server_test.dart b/tests/standalone/io/pipe_server_test.dart
index 52d93b6..c2a1b93 100644
--- a/tests/standalone/io/pipe_server_test.dart
+++ b/tests/standalone/io/pipe_server_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // OtherResources=readline_test1.dat
 //
 // VMOptions=
diff --git a/tests/standalone/io/platform_locale_name_test.dart b/tests/standalone/io/platform_locale_name_test.dart
index 611623d..aa5c2b9 100644
--- a/tests/standalone/io/platform_locale_name_test.dart
+++ b/tests/standalone/io/platform_locale_name_test.dart
@@ -8,11 +8,12 @@
 
 main() {
   // Match patterns like:
-  //    "en-US"                 (Android, iOS, MacOS, Windows)
+  //    "en"                    (MacOS)
+  //    "en-US"                 (Android, iOS, Windows)
   //    "en_US", "en_US.UTF-8"  (Linux)
   //    "ESP-USA"               (theoretically possible)
   // Assumes that the platform has a reasonably configured locale.
-  var localePattern = RegExp(r"[A-Za-z]{2,4}[_-][A-Za-z]{2}");
+  var localePattern = RegExp(r"[A-Za-z]{2,4}([_-][A-Za-z]{2})?");
   var localeName = Platform.localeName;
   Expect.isNotNull(
       localePattern.matchAsPrefix(localeName),
diff --git a/tests/standalone/io/platform_test.dart b/tests/standalone/io/platform_test.dart
index ace9d85..3729439 100644
--- a/tests/standalone/io/platform_test.dart
+++ b/tests/standalone/io/platform_test.dart
@@ -2,16 +2,24 @@
 // 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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
-import "dart:async";
 import "dart:io";
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
+final executableSuffix = Platform.isWindows ? '.exe' : '';
+final jitExecutableName = 'dart$executableSuffix';
+final aotExecutableName = 'dart_precompiled_runtime$executableSuffix';
+
+bool hasJitOrAotExecutableName(String executable) =>
+    executable.endsWith(jitExecutableName) ||
+    executable.endsWith(aotExecutableName);
+
+bool isRunningFromSource() =>
+    Platform.executable.endsWith(jitExecutableName) &&
+    Platform.script.toFilePath().endsWith('.dart');
+
 test() {
   Expect.isTrue(Platform.numberOfProcessors > 0);
   var os = Platform.operatingSystem;
@@ -27,13 +35,10 @@
   Expect.isTrue(hostname is String && hostname != "");
   var environment = Platform.environment;
   Expect.isTrue(environment is Map<String, String>);
-  if (!Platform.isWindows) {
-    Expect.isTrue(Platform.executable.endsWith('dart'));
-    Expect.isTrue(Platform.resolvedExecutable.endsWith('dart'));
-  } else {
-    Expect.isTrue(Platform.executable.endsWith('dart.exe'));
-    Expect.isTrue(Platform.resolvedExecutable.endsWith('dart.exe'));
-  }
+
+  Expect.isTrue(hasJitOrAotExecutableName(Platform.executable));
+  Expect.isTrue(hasJitOrAotExecutableName(Platform.resolvedExecutable));
+
   if (!Platform.isWindows) {
     Expect.isTrue(Platform.resolvedExecutable.startsWith('/'));
   } else {
@@ -46,9 +51,11 @@
   // Move directory to be sure script is correct.
   var oldDir = Directory.current;
   Directory.current = Directory.current.parent;
-  Expect.isTrue(
-      Platform.script.path.endsWith('tests/standalone/io/platform_test.dart'));
-  Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  if (isRunningFromSource()) {
+    Expect.isTrue(Platform.script.path
+        .endsWith('tests/standalone/io/platform_test.dart'));
+    Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  }
 }
 
 void f(reply) {
@@ -62,7 +69,7 @@
 testIsolate() {
   asyncStart();
   ReceivePort port = new ReceivePort();
-  var remote = Isolate.spawn(f, port.sendPort);
+  Isolate.spawn(f, port.sendPort);
   port.first.then((results) {
     Expect.equals(Platform.executable, results["Platform.executable"]);
 
@@ -70,7 +77,10 @@
     // SpawnFunction retains the script url of the parent which in this
     // case was a relative path.
     Expect.equals("file", uri.scheme);
-    Expect.isTrue(uri.path.endsWith('tests/standalone/io/platform_test.dart'));
+    if (isRunningFromSource()) {
+      Expect.isTrue(
+          uri.path.endsWith('tests/standalone/io/platform_test.dart'));
+    }
     Expect.listEquals(
         Platform.executableArguments, results["Platform.executableArguments"]);
     asyncEnd();
diff --git a/tests/standalone/io/raw_synchronous_socket_test.dart b/tests/standalone/io/raw_synchronous_socket_test.dart
index 50cb0f2..96f4511 100644
--- a/tests/standalone/io/raw_synchronous_socket_test.dart
+++ b/tests/standalone/io/raw_synchronous_socket_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone/io/shared_socket_test.dart b/tests/standalone/io/shared_socket_test.dart
index 3195b63..39eb4d1 100644
--- a/tests/standalone/io/shared_socket_test.dart
+++ b/tests/standalone/io/shared_socket_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/standalone/io/socket_close_test.dart b/tests/standalone/io/socket_close_test.dart
index 72a15de..38cc0d6 100644
--- a/tests/standalone/io/socket_close_test.dart
+++ b/tests/standalone/io/socket_close_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone/io/socket_finalizer_test.dart b/tests/standalone/io/socket_finalizer_test.dart
index c82be22..5dfca94 100644
--- a/tests/standalone/io/socket_finalizer_test.dart
+++ b/tests/standalone/io/socket_finalizer_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // This test checks that sockets belonging to an isolate are properly cleaned up
 // when the isolate shuts down abnormally. If the socket is not properly cleaned
 // up, the test will time out.
diff --git a/tests/standalone/io/socket_local_port_test.dart b/tests/standalone/io/socket_local_port_test.dart
new file mode 100644
index 0000000..f7251ec
--- /dev/null
+++ b/tests/standalone/io/socket_local_port_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import "dart:io";
+
+import "package:expect/expect.dart";
+
+Future testCustomPortIPv4() async {
+  String clientAddress = "127.0.0.1";
+  int customLocalPort = 50988;
+  String serverAddress = clientAddress;
+  int port = 50989;
+
+  testCustomPort(serverAddress, port, clientAddress, customLocalPort);
+}
+
+Future testCustomPortIPv6() async {
+  String clientAddress = "::1";
+  int customLocalPort = 50988;
+  String serverAddress = clientAddress;
+  int port = 50989;
+
+  testCustomPort(serverAddress, port, clientAddress, customLocalPort);
+}
+
+Future testCustomPortIPv4NoSourceAddress() async {
+  String expectedClientAddress = "127.0.0.1";
+  int customLocalPort = 50988;
+  String serverAddress = expectedClientAddress;
+  int port = 50989;
+
+  testCustomPort(serverAddress, port, expectedClientAddress, customLocalPort);
+}
+
+Future testCustomPortIPv6NoSourceAddress() async {
+  String expectedClientAddress = "::1";
+  int customLocalPort = 50988;
+  String serverAddress = expectedClientAddress;
+  int port = 50989;
+
+  testCustomPort(serverAddress, port, expectedClientAddress, customLocalPort);
+}
+
+Future testNoCustomPortIPv4() async {
+  String host = "127.0.0.1";
+  String clientAddress = host;
+  int serverPort = 39998;
+
+  await testNoCustomPortNoSourceAddress(host, serverPort, clientAddress);
+}
+
+Future testNoCustomPortIPv6() async {
+  String host = "::1";
+  String clientAddress = host;
+  int serverPort = 39998;
+
+  await testNoCustomPortNoSourceAddress(host, serverPort, clientAddress);
+}
+
+Future testNoCustomPortNoSourceAddressIPv4() async {
+  String host = "127.0.0.1";
+  String expectedAddress = host;
+  int serverPort = 39998;
+
+  await testNoCustomPortNoSourceAddress(host, serverPort, expectedAddress);
+}
+
+Future testNoCustomPortNoSourceAddressIPv6() async {
+  String host = "::1";
+  String expectedAddress = host;
+  int serverPort = 39998;
+
+  await testNoCustomPortNoSourceAddress(host, serverPort, expectedAddress);
+}
+
+// Core functionality
+void testCustomPort(
+    String host, int port, String sourceAddress, int sourcePort) async {
+  var server = await ServerSocket.bind(host, port);
+  server.listen((client) {
+    Expect.equals(server.port, port);
+    Expect.equals(client.remotePort, sourcePort);
+    Expect.equals(client.address.address, sourceAddress);
+    client.destroy();
+  });
+
+  Socket s = await Socket.connect(host, port,
+      sourceAddress: sourceAddress, sourcePort: sourcePort);
+  s.destroy();
+  server.close();
+}
+
+Future testCustomPortNoSourceAddress(
+    String host, int port, String expectedAddress, int sourcePort) async {
+  Completer completer = new Completer();
+  var server = await ServerSocket.bind(host, port);
+
+  server.listen((client) {
+    Expect.equals(server.port, port);
+    Expect.equals(client.remotePort, sourcePort);
+    Expect.equals(client.address.address, expectedAddress);
+    client.destroy();
+    completer.complete();
+  });
+
+  Socket s = await Socket.connect(host, port, sourcePort: sourcePort);
+  s.destroy();
+  server.close();
+
+  return completer.future;
+}
+
+Future testNoCustomPort(String host, int port, String sourceAddress) async {
+  Completer completer = new Completer();
+  var server = await ServerSocket.bind(host, port);
+  Socket.connect(host, port, sourceAddress: sourceAddress).then((clientSocket) {
+    server.listen((client) {
+      Expect.equals(server.port, port);
+      Expect.equals(client.remotePort, clientSocket.port);
+      Expect.equals(client.address.address, sourceAddress);
+
+      client.destroy();
+      completer.complete();
+    });
+
+    clientSocket.destroy();
+    server.close();
+  });
+
+  return completer.future;
+}
+
+Future testNoCustomPortNoSourceAddress(
+    String host, int port, String expectedAddress) async {
+  Completer completer = new Completer();
+  var server = await ServerSocket.bind(host, port);
+  Socket.connect(host, port).then((clientSocket) {
+    server.listen((client) {
+      Expect.equals(server.port, port);
+      Expect.equals(client.remotePort, clientSocket.port);
+      Expect.equals(client.address.address, expectedAddress);
+      clientSocket.destroy();
+      client.destroy();
+      server.close();
+      completer.complete();
+    });
+  });
+  return completer.future;
+}
+
+Future main() async {
+  await testCustomPortIPv4();
+  await testCustomPortIPv6();
+
+  await testNoCustomPortIPv4();
+  await testNoCustomPortIPv6();
+
+  await testNoCustomPortNoSourceAddressIPv4();
+  await testNoCustomPortNoSourceAddressIPv6();
+}
diff --git a/tests/standalone/io/socket_many_connections_test.dart b/tests/standalone/io/socket_many_connections_test.dart
index 0140df7..5ed8d9d1 100644
--- a/tests/standalone/io/socket_many_connections_test.dart
+++ b/tests/standalone/io/socket_many_connections_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Test creating a large number of socket connections.
 library ServerTest;
 
diff --git a/tests/standalone/io/stdio_socket_finalizer_test.dart b/tests/standalone/io/stdio_socket_finalizer_test.dart
index c33da51..a35f0d5 100644
--- a/tests/standalone/io/stdio_socket_finalizer_test.dart
+++ b/tests/standalone/io/stdio_socket_finalizer_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // This test checks that stdin is *not* closed when an Isolate leaks it.
 
 import 'dart:async';
diff --git a/tests/standalone/io/wait_for_event_isolate_test.dart b/tests/standalone/io/wait_for_event_isolate_test.dart
index ce624e2..5948ea3 100644
--- a/tests/standalone/io/wait_for_event_isolate_test.dart
+++ b/tests/standalone/io/wait_for_event_isolate_test.dart
@@ -2,12 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
-import 'dart:cli';
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/standalone/packages_file_test.dart b/tests/standalone/packages_file_test.dart
index 99c2ab5..57fe3bf 100644
--- a/tests/standalone/packages_file_test.dart
+++ b/tests/standalone/packages_file_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:convert" show json;
@@ -986,8 +983,7 @@
         "  config: $config\n"
         "  main  : $mainFile\n"
         "  args  : ${args.map((x) => '"$x"').join(" ")}\n"
-        ") : expect {\n${expect.keys.map((k) =>
-           '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
+        ") : expect {\n${expect.keys.map((k) => '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
         "}";
   }
 }
diff --git a/tests/standalone/regress_26031_test.dart b/tests/standalone/regress_26031_test.dart
index 60dd89b..c8a8e0a 100644
--- a/tests/standalone/regress_26031_test.dart
+++ b/tests/standalone/regress_26031_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/standalone/regress_28854_1_test.dart b/tests/standalone/regress_28854_1_test.dart
index 30b304a..80c831b 100644
--- a/tests/standalone/regress_28854_1_test.dart
+++ b/tests/standalone/regress_28854_1_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library regress;
 
 import 'dart:isolate';
diff --git a/tests/standalone/regress_28854_2_test.dart b/tests/standalone/regress_28854_2_test.dart
index 21395c1..169bb09 100644
--- a/tests/standalone/regress_28854_2_test.dart
+++ b/tests/standalone/regress_28854_2_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library regress;
 
 import 'dart:isolate';
diff --git a/tests/standalone/standalone_kernel.status b/tests/standalone/standalone_kernel.status
index a628ff4..a958509 100644
--- a/tests/standalone/standalone_kernel.status
+++ b/tests/standalone/standalone_kernel.status
@@ -91,7 +91,6 @@
 io/http_server_close_response_after_error_test: Skip # Flaky.
 io/http_shutdown_test: Skip # Flaky.
 io/https_client_certificate_test: Crash
-io/platform_test: Crash
 io/raw_datagram_socket_test: Skip # Flaky.
 io/raw_secure_server_closing_test: Skip # Flaky
 io/raw_socket_test: Crash
diff --git a/tests/standalone/standalone_precompiled.status b/tests/standalone/standalone_precompiled.status
index f6c27d2..536731b 100644
--- a/tests/standalone/standalone_precompiled.status
+++ b/tests/standalone/standalone_precompiled.status
@@ -21,7 +21,6 @@
 io/named_pipe_script_test: Skip
 io/namespace_test: Skip # Issue 33168
 io/platform_resolved_executable_test: Skip
-io/platform_test: RuntimeError # Expects to be running from 'dart' instead of 'dart_precompiled_runtime'
 io/print_sync_test: Skip
 io/process_check_arguments_test: Skip
 io/process_detached_test: Skip
diff --git a/tests/standalone/typed_array_int64_uint64_test.dart b/tests/standalone/typed_array_int64_uint64_test.dart
index 7b57986..e22036b 100644
--- a/tests/standalone/typed_array_int64_uint64_test.dart
+++ b/tests/standalone/typed_array_int64_uint64_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing native typed arrays, int64 and uint64 only.
 
 // Library tag to be able to run in html test framework.
diff --git a/tests/standalone/typed_array_test.dart b/tests/standalone/typed_array_test.dart
index 6e4c6c3..305d736 100644
--- a/tests/standalone/typed_array_test.dart
+++ b/tests/standalone/typed_array_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing native float and int arrays.  64-bit int arrays
 // are in a separate test.
 
diff --git a/tests/standalone/typed_data_isolate_test.dart b/tests/standalone/typed_data_isolate_test.dart
index 2573ada..a95b9db 100644
--- a/tests/standalone/typed_data_isolate_test.dart
+++ b/tests/standalone/typed_data_isolate_test.dart
@@ -2,9 +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.
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing typed data.
 
 // Library tag to be able to run in html test framework.
diff --git a/tests/standalone_2/fields_may_be_reset_test.dart b/tests/standalone_2/fields_may_be_reset_test.dart
deleted file mode 100644
index 7e7f00a..0000000
--- a/tests/standalone_2/fields_may_be_reset_test.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-// VMOptions=--fields_may_be_reset
-
-main() {
-  print("Okay");
-}
diff --git a/tests/standalone_2/io/directory_rename_test.dart b/tests/standalone_2/io/directory_rename_test.dart
new file mode 100644
index 0000000..5f47913
--- /dev/null
+++ b/tests/standalone_2/io/directory_rename_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Directory rename test.
+
+// @dart = 2.9
+
+import "dart:io";
+
+import "package:expect/expect.dart";
+import 'test_utils.dart' show withTempDir;
+
+testRenameToNewPath() async {
+  await withTempDir('testRenameToNewPath', (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+
+    dir1.renameSync("${tempDir.path}/dir2");
+    Expect.isTrue(Directory("${tempDir.path}/dir2").existsSync());
+  });
+}
+
+testRenamePath() async {
+  // Verifies that the returned directory has the correct path.
+  await withTempDir('testRenameToNewPath', (Directory tempDir) async {
+    final oldDir = Directory("${tempDir.path}/dir1");
+    oldDir.createSync();
+
+    final newDir = oldDir.renameSync("${tempDir.path}/dir2");
+
+    Expect.isTrue(
+        oldDir.path == "${tempDir.path}/dir1",
+        "${oldDir.path} != '${tempDir.path}/dir1'"
+        "- path should not be updated");
+    Expect.isTrue(
+        newDir.path == "${tempDir.path}/dir2",
+        "${newDir.path} != '${tempDir.path}/dir2'"
+        "- path should be updated");
+  });
+}
+
+testRenameToSamePath() async {
+  await withTempDir('testRenameToSamePath', (Directory tempDir) async {
+    final dir = Directory("${tempDir.path}/dir");
+    dir.createSync();
+    final file = File("${dir.path}/file");
+    file.createSync();
+
+    dir.renameSync(dir.path);
+    Expect.isTrue(file.existsSync());
+  });
+}
+
+testRenameToExistingFile() async {
+  await withTempDir('testRenameToExistingFile', (Directory tempDir) async {
+    final dir = Directory("${tempDir.path}/dir");
+    dir.createSync();
+    final file = File("${tempDir.path}/file");
+    file.createSync();
+
+    // Overwriting an exsting file is not allowed.
+    try {
+      dir.renameSync(file.path);
+      Expect.fail('Directory.rename should fail to rename a non-directory');
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError.message.contains('file already exists'),
+            'Unexpected error: $e');
+      } else if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError.message.contains('Not a directory'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+testRenameToExistingEmptyDirectory() async {
+  await withTempDir('testRenameToExistingEmptyDirectory',
+      (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+    File("${dir1.path}/file").createSync();
+
+    final dir2 = Directory("${tempDir.path}/dir2");
+    dir2.createSync();
+
+    try {
+      dir1.renameSync(dir2.path);
+      // Verify that the file contained in dir1 has been moved.
+      if (Platform.isWindows) {
+        Expect.fail(
+            'Directory.rename should fail to rename over an existing directory '
+            'on Windows');
+      } else {
+        Expect.isTrue(File("${dir2.path}/file").existsSync());
+      }
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError.message.contains('file already exists'));
+      } else {
+        Expect.fail('Directory.rename should allow moves to empty directories');
+      }
+    }
+  });
+}
+
+testRenameToExistingNonEmptyDirectory() async {
+  await withTempDir('testRenameToExistingNonEmptyDirectory',
+      (Directory tempDir) async {
+    final dir1 = Directory("${tempDir.path}/dir1");
+    dir1.createSync();
+    File("${dir1.path}/file1").createSync();
+
+    final dir2 = Directory("${tempDir.path}/dir2");
+    dir2.createSync();
+    File("${dir2.path}/file2").createSync();
+
+    try {
+      dir1.renameSync(dir2.path);
+      Expect.fail(
+          'Directory.rename should fail to rename a non-empty directory');
+    } on FileSystemException catch (e) {
+      if (Platform.isWindows) {
+        Expect.isTrue(e.osError.message.contains('file already exists'),
+            'Unexpected error: $e');
+      } else if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError.message.contains('Directory not empty'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+testRenameButActuallyFile() async {
+  await withTempDir('testRenameButActuallyFile', (Directory tempDir) async {
+    final file = File("${tempDir.path}/file");
+    file.createSync();
+    final dir = Directory(file.path);
+    try {
+      dir.renameSync("${tempDir.path}/dir");
+      Expect.fail("Expected a failure to rename the file.");
+    } on FileSystemException catch (e) {
+      Expect.isTrue(
+          e.message.contains('Rename failed'), 'Unexpected error: $e');
+      if (Platform.isLinux || Platform.isMacOS) {
+        Expect.isTrue(e.osError.message.contains('Not a directory'),
+            'Unexpected error: $e');
+      }
+    }
+  });
+}
+
+main() async {
+  await testRenameToNewPath();
+  await testRenamePath();
+  await testRenameToSamePath();
+  await testRenameToExistingFile();
+  await testRenameToExistingEmptyDirectory();
+  await testRenameToExistingNonEmptyDirectory();
+  await testRenameButActuallyFile();
+}
diff --git a/tests/standalone_2/io/directory_test.dart b/tests/standalone_2/io/directory_test.dart
index 91acf75..f0dad53 100644
--- a/tests/standalone_2/io/directory_test.dart
+++ b/tests/standalone_2/io/directory_test.dart
@@ -585,37 +585,6 @@
   });
 }
 
-testRename() {
-  var temp1 = Directory.systemTemp.createTempSync('directory_test');
-  var temp2 = Directory.systemTemp.createTempSync('directory_test');
-  var temp3 = temp1.renameSync(temp2.path);
-  Expect.isFalse(temp1.existsSync());
-  Expect.isTrue(temp2.existsSync());
-  Expect.equals(temp3.path, temp2.path);
-
-  var temp4 = temp2.renameSync(temp1.path);
-  Expect.isFalse(temp3.existsSync());
-  Expect.isFalse(temp2.existsSync());
-  Expect.isTrue(temp1.existsSync());
-  Expect.isTrue(temp4.existsSync());
-  Expect.equals(temp1.path, temp4.path);
-
-  String foo = '${temp4.path}/foo';
-  String bar = '${temp4.path}/bar';
-  new File(foo).createSync();
-  try {
-    new Directory(foo).renameSync(bar);
-    Expect.fail('Directory.rename should fail to rename a non-directory');
-  } catch (e) {
-    Expect.isTrue(e is FileSystemException);
-    if (Platform.isLinux || Platform.isMacOS) {
-      Expect.isTrue(e.osError.message.contains('Not a directory'));
-    }
-  }
-
-  temp1.deleteSync(recursive: true);
-}
-
 main() {
   DirectoryTest.testMain();
   NestedTempDirectoryTest.testMain();
@@ -625,5 +594,4 @@
   testCreateExisting();
   testCreateDirExistingFileSync();
   testCreateDirExistingFile();
-  testRename();
 }
diff --git a/tests/standalone_2/io/echo_server_stream_test.dart b/tests/standalone_2/io/echo_server_stream_test.dart
index e0449a3..1cfb36d 100644
--- a/tests/standalone_2/io/echo_server_stream_test.dart
+++ b/tests/standalone_2/io/echo_server_stream_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Echo server test program to test socket streams.
 //
 // VMOptions=
diff --git a/tests/standalone_2/io/file_stat_test.dart b/tests/standalone_2/io/file_stat_test.dart
index 9af5190..48b05b2 100644
--- a/tests/standalone_2/io/file_stat_test.dart
+++ b/tests/standalone_2/io/file_stat_test.dart
@@ -21,11 +21,16 @@
   Expect.equals(FileSystemEntityType.notFound, fileStat.type);
   Expect.equals(FileSystemEntityType.notFound, fileStatDirect.type);
   file.writeAsStringSync("Dart IO library test of FileStat");
+  Link link = new Link(join(directory.path, "link"));
+  link.createSync(file.path);
   new Timer(const Duration(seconds: 2), () {
     file.readAsStringSync();
     directory.listSync();
     FileStat fileStat = FileStat.statSync(file.path);
     FileStat fileStatDirect = file.statSync();
+    FileStat linkStat = FileStat.statSync(link.path);
+    FileStat linkStatDirect = link.statSync();
+
     Expect.equals(FileSystemEntityType.file, fileStat.type);
     Expect.equals(32, fileStat.size);
     Expect.equals(FileSystemEntityType.file, fileStatDirect.type);
@@ -46,6 +51,13 @@
           .isTrue(directoryStat.changed.compareTo(directoryStat.accessed) < 0);
     }
     Expect.equals(7 << 6, directoryStat.mode & (7 << 6)); // Includes +urwx.
+
+    // Verify that statSync resolves the link.
+    Expect.equals(FileSystemEntityType.file, linkStat.type);
+    Expect.equals(32, linkStat.size);
+    Expect.equals(FileSystemEntityType.file, linkStatDirect.type);
+    Expect.equals(32, linkStatDirect.size);
+
     directory.deleteSync(recursive: true);
   });
 }
@@ -53,8 +65,7 @@
 Future testStatAsync() {
   return Directory.systemTemp.createTemp('dart_file_stat').then((directory) {
     File file = new File(join(directory.path, "file"));
-    return FileStat
-        .stat(file.path)
+    return FileStat.stat(file.path)
         .then((fileStat) =>
             Expect.equals(FileSystemEntityType.notFound, fileStat.type))
         .then((_) => file.stat())
diff --git a/tests/standalone_2/io/file_system_watcher_large_set_test.dart b/tests/standalone_2/io/file_system_watcher_large_set_test.dart
index 326d201..9240759 100644
--- a/tests/standalone_2/io/file_system_watcher_large_set_test.dart
+++ b/tests/standalone_2/io/file_system_watcher_large_set_test.dart
@@ -2,8 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// VMOptions=--delayed-filewatch-callback --enable-isolate-groups
-// VMOptions=--delayed-filewatch-callback --no-enable-isolate-groups
+// VMOptions=--delayed-filewatch-callback
 
 // Verifies that cancelling subscription from inside of the event handler
 // works as expected, does not result in crash or hang.
diff --git a/tests/standalone_2/io/file_system_watcher_test.dart b/tests/standalone_2/io/file_system_watcher_test.dart
index bde35ce..b3e79db 100644
--- a/tests/standalone_2/io/file_system_watcher_test.dart
+++ b/tests/standalone_2/io/file_system_watcher_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone_2/io/http_advanced_test.dart b/tests/standalone_2/io/http_advanced_test.dart
index 10b6a5b..0d5c80f 100644
--- a/tests/standalone_2/io/http_advanced_test.dart
+++ b/tests/standalone_2/io/http_advanced_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone_2/io/http_basic_test.dart b/tests/standalone_2/io/http_basic_test.dart
index 1cae05b..8d96875 100644
--- a/tests/standalone_2/io/http_basic_test.dart
+++ b/tests/standalone_2/io/http_basic_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=--trace_shutdown
 // VMOptions=--trace_shutdown --short_socket_read
 // VMOptions=--trace_shutdown --short_socket_write
diff --git a/tests/standalone_2/io/http_read_test.dart b/tests/standalone_2/io/http_read_test.dart
index 120e9ff..cc42d71 100644
--- a/tests/standalone_2/io/http_read_test.dart
+++ b/tests/standalone_2/io/http_read_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone_2/io/http_redirect_test.dart b/tests/standalone_2/io/http_redirect_test.dart
index e168b11..e851045 100644
--- a/tests/standalone_2/io/http_redirect_test.dart
+++ b/tests/standalone_2/io/http_redirect_test.dart
@@ -9,7 +9,7 @@
 import "dart:async";
 import "dart:io";
 
-Future<HttpServer> setupServer() {
+Future<HttpServer> setupServer({Uri targetServer}) {
   Completer completer = new Completer<HttpServer>();
   HttpServer.bind("127.0.0.1", 0).then((server) {
     var handlers = new Map<String, Function>();
@@ -130,6 +130,8 @@
     // Setup redirect checking headers.
     addRequestHandler("/src", (HttpRequest request, HttpResponse response) {
       Expect.equals("value", request.headers.value("X-Request-Header"));
+      Expect.isNotNull(request.headers.value("Authorization"),
+          "expected 'Authorization' header to be set");
       response.headers.set(
           HttpHeaders.locationHeader, "http://127.0.0.1:${server.port}/target");
       response.statusCode = HttpStatus.movedPermanently;
@@ -137,9 +139,24 @@
     });
     addRequestHandler("/target", (HttpRequest request, HttpResponse response) {
       Expect.equals("value", request.headers.value("X-Request-Header"));
+      Expect.isNotNull(request.headers.value("Authorization"),
+          "expected 'Authorization' header to be set");
       response.close();
     });
 
+    if (targetServer != null) {
+      addRequestHandler("/src-crossdomain",
+          (HttpRequest request, HttpResponse response) {
+        Expect.equals("value", request.headers.value("X-Request-Header"));
+        Expect.isNotNull(request.headers.value("Authorization"),
+            "expected 'Authorization' header to be set");
+        response.headers
+            .set(HttpHeaders.locationHeader, targetServer.toString());
+        response.statusCode = HttpStatus.movedPermanently;
+        response.close();
+      });
+    }
+
     // Setup redirect for 301 where POST should not redirect.
     addRequestHandler("/301src", (HttpRequest request, HttpResponse response) {
       Expect.equals("POST", request.method);
@@ -185,6 +202,36 @@
   return completer.future;
 }
 
+// A second HTTP server used to validate that redirect requests accross domains
+// do *not* include security-related headers.
+Future<HttpServer> setupTargetServer() {
+  Completer completer = new Completer<HttpServer>();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    var handlers = new Map<String, Function>();
+    addRequestHandler(
+        String path, void handler(HttpRequest request, HttpResponse response)) {
+      handlers[path] = handler;
+    }
+
+    server.listen((HttpRequest request) {
+      if (request.uri.path == "/target") {
+        Expect.equals("value", request.headers.value("X-Request-Header"));
+        Expect.isNull(request.headers.value("Authorization"),
+            "expected 'Authorization' header to be removed on redirect");
+        request.response.close();
+      } else {
+        request.listen((_) {}, onDone: () {
+          request.response.statusCode = 404;
+          request.response.close();
+        });
+      }
+    });
+
+    completer.complete(server);
+  });
+  return completer.future;
+}
+
 void checkRedirects(int redirectCount, HttpClientResponse response) {
   if (redirectCount < 2) {
     Expect.isTrue(response.redirects.isEmpty);
@@ -252,6 +299,7 @@
         .then((HttpClientRequest request) {
       request.followRedirects = false;
       request.headers.add("X-Request-Header", "value");
+      request.headers.add("Authorization", "Basic ...");
       return request.close();
     }).then(handleResponse);
   });
@@ -284,6 +332,7 @@
         .getUrl(Uri.parse("http://127.0.0.1:${server.port}/src"))
         .then((HttpClientRequest request) {
       request.headers.add("X-Request-Header", "value");
+      request.headers.add("Authorization", "Basic ...");
       return request.close();
     }).then((HttpClientResponse response) {
       response.listen((_) => Expect.fail("Response data not expected"),
@@ -296,6 +345,33 @@
   });
 }
 
+void testCrossDomainAutoRedirectWithHeaders() {
+  setupTargetServer().then((targetServer) {
+    setupServer(
+            targetServer:
+                Uri.parse("http://127.0.0.1:${targetServer.port}/target"))
+        .then((server) {
+      HttpClient client = new HttpClient();
+
+      client
+          .getUrl(Uri.parse("http://127.0.0.1:${server.port}/src-crossdomain"))
+          .then((HttpClientRequest request) {
+        request.headers.add("X-Request-Header", "value");
+        request.headers.add("Authorization", "Basic ...");
+        return request.close();
+      }).then((HttpClientResponse response) {
+        response.listen((_) => Expect.fail("Response data not expected"),
+            onDone: () {
+          Expect.equals(1, response.redirects.length);
+          targetServer.close();
+          server.close();
+          client.close();
+        });
+      });
+    });
+  });
+}
+
 void testAutoRedirect301POST() {
   setupServer().then((server) {
     HttpClient client = new HttpClient();
@@ -443,6 +519,7 @@
   testManualRedirectWithHeaders();
   testAutoRedirect();
   testAutoRedirectWithHeaders();
+  testCrossDomainAutoRedirectWithHeaders();
   testAutoRedirect301POST();
   testAutoRedirect303POST();
   testAutoRedirectLimit();
diff --git a/tests/standalone_2/io/io_override_test.dart b/tests/standalone_2/io/io_override_test.dart
index 54f0eb4..e7d9a81 100644
--- a/tests/standalone_2/io/io_override_test.dart
+++ b/tests/standalone_2/io/io_override_test.dart
@@ -161,12 +161,12 @@
 }
 
 Future<Socket> socketConnect(host, int port,
-    {sourceAddress, Duration timeout}) {
+    {sourceAddress, int sourcePort, Duration timeout}) {
   return null;
 }
 
 Future<ConnectionTask<Socket>> socketStartConnect(host, int port,
-    {sourceAddress}) {
+    {sourceAddress, int sourcePort}) {
   return null;
 }
 
@@ -175,7 +175,30 @@
   return null;
 }
 
+class StdinMock extends Stream<List<int>> implements Stdin {
+  bool echoMode = false;
+  bool lineMode = false;
+  bool get hasTerminal => throw "";
+  bool get supportsAnsiEscapes => throw "";
+
+  int readByteSync() => throw "";
+  String readLineSync(
+          {Encoding encoding = systemEncoding, bool retainNewlines = false}) =>
+      throw "";
+  StreamSubscription<List<int>> listen(void onData(List<int> event),
+      {Function onError, void onDone(), bool cancelOnError}) {
+    throw "";
+  }
+}
+
+class StdoutMock implements Stdout {
+  void noSuchMethod(Invocation i) => throw "";
+}
+
 Future<Null> ioOverridesRunTest() async {
+  StdoutMock stdoutMock = StdoutMock();
+  StdoutMock stderrMock = StdoutMock();
+
   Future<Null> f = IOOverrides.runZoned(
     () async {
       Expect.isTrue(new Directory("directory") is DirectoryMock);
@@ -196,6 +219,9 @@
       Expect.isNull(Socket.connect(null, 0));
       Expect.isNull(Socket.startConnect(null, 0));
       Expect.isNull(ServerSocket.bind(null, 0));
+      Expect.isTrue(stdin is StdinMock);
+      Expect.identical(stdout, stdoutMock);
+      Expect.identical(stderr, stderrMock);
     },
     createDirectory: DirectoryMock.createDirectory,
     getCurrentDirectory: DirectoryMock.getCurrent,
@@ -214,6 +240,9 @@
     socketConnect: socketConnect,
     socketStartConnect: socketStartConnect,
     serverSocketBind: serverSocketBind,
+    stdin: () => StdinMock(),
+    stdout: () => stdoutMock,
+    stderr: () => stderrMock,
   );
   Expect.isFalse(new Directory("directory") is DirectoryMock);
   Expect.isTrue(new Directory("directory") is Directory);
diff --git a/tests/standalone_2/io/pipe_server_test.dart b/tests/standalone_2/io/pipe_server_test.dart
index 4628c69..f01e9c1 100644
--- a/tests/standalone_2/io/pipe_server_test.dart
+++ b/tests/standalone_2/io/pipe_server_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // OtherResources=readline_test1.dat
 //
 // VMOptions=
diff --git a/tests/standalone_2/io/platform_locale_name_test.dart b/tests/standalone_2/io/platform_locale_name_test.dart
index 5ad27ed..b615930 100644
--- a/tests/standalone_2/io/platform_locale_name_test.dart
+++ b/tests/standalone_2/io/platform_locale_name_test.dart
@@ -10,11 +10,12 @@
 
 main() {
   // Match patterns like:
-  //    "en-US"                 (Android, iOS, MacOS, Windows)
+  //    "en"                    (MacOS)
+  //    "en-US"                 (Android, iOS, Windows)
   //    "en_US", "en_US.UTF-8"  (Linux)
   //    "ESP-USA"               (theoretically possible)
   // Assumes that the platform has a reasonably configured locale.
-  var localePattern = RegExp(r"[A-Za-z]{2,4}[_-][A-Za-z]{2}");
+  var localePattern = RegExp(r"[A-Za-z]{2,4}([_-][A-Za-z]{2})?");
   var localeName = Platform.localeName;
   Expect.isNotNull(
       localePattern.matchAsPrefix(localeName),
diff --git a/tests/standalone_2/io/platform_test.dart b/tests/standalone_2/io/platform_test.dart
index 2ddc45d..e58632d 100644
--- a/tests/standalone_2/io/platform_test.dart
+++ b/tests/standalone_2/io/platform_test.dart
@@ -4,16 +4,24 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
-import "dart:async";
 import "dart:io";
 import "dart:isolate";
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
+final executableSuffix = Platform.isWindows ? '.exe' : '';
+final jitExecutableName = 'dart$executableSuffix';
+final aotExecutableName = 'dart_precompiled_runtime$executableSuffix';
+
+bool hasJitOrAotExecutableName(String executable) =>
+    executable.endsWith(jitExecutableName) ||
+    executable.endsWith(aotExecutableName);
+
+bool isRunningFromSource() =>
+    Platform.executable.endsWith(jitExecutableName) &&
+    Platform.script.toFilePath().endsWith('.dart');
+
 test() {
   Expect.isTrue(Platform.numberOfProcessors > 0);
   var os = Platform.operatingSystem;
@@ -29,13 +37,10 @@
   Expect.isTrue(hostname is String && hostname != "");
   var environment = Platform.environment;
   Expect.isTrue(environment is Map<String, String>);
-  if (!Platform.isWindows) {
-    Expect.isTrue(Platform.executable.endsWith('dart'));
-    Expect.isTrue(Platform.resolvedExecutable.endsWith('dart'));
-  } else {
-    Expect.isTrue(Platform.executable.endsWith('dart.exe'));
-    Expect.isTrue(Platform.resolvedExecutable.endsWith('dart.exe'));
-  }
+
+  Expect.isTrue(hasJitOrAotExecutableName(Platform.executable));
+  Expect.isTrue(hasJitOrAotExecutableName(Platform.resolvedExecutable));
+
   if (!Platform.isWindows) {
     Expect.isTrue(Platform.resolvedExecutable.startsWith('/'));
   } else {
@@ -48,9 +53,11 @@
   // Move directory to be sure script is correct.
   var oldDir = Directory.current;
   Directory.current = Directory.current.parent;
-  Expect.isTrue(Platform.script.path
-      .endsWith('tests/standalone_2/io/platform_test.dart'));
-  Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  if (isRunningFromSource()) {
+    Expect.isTrue(Platform.script.path
+        .endsWith('tests/standalone_2/io/platform_test.dart'));
+    Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
+  }
 }
 
 void f(reply) {
@@ -64,7 +71,7 @@
 testIsolate() {
   asyncStart();
   ReceivePort port = new ReceivePort();
-  var remote = Isolate.spawn(f, port.sendPort);
+  Isolate.spawn(f, port.sendPort);
   port.first.then((results) {
     Expect.equals(Platform.executable, results["Platform.executable"]);
 
@@ -72,8 +79,10 @@
     // SpawnFunction retains the script url of the parent which in this
     // case was a relative path.
     Expect.equals("file", uri.scheme);
-    Expect.isTrue(
-        uri.path.endsWith('tests/standalone_2/io/platform_test.dart'));
+    if (isRunningFromSource()) {
+      Expect.isTrue(
+          uri.path.endsWith('tests/standalone_2/io/platform_test.dart'));
+    }
     Expect.listEquals(
         Platform.executableArguments, results["Platform.executableArguments"]);
     asyncEnd();
diff --git a/tests/standalone_2/io/raw_synchronous_socket_test.dart b/tests/standalone_2/io/raw_synchronous_socket_test.dart
index 9e5b6bb..3e8a86b 100644
--- a/tests/standalone_2/io/raw_synchronous_socket_test.dart
+++ b/tests/standalone_2/io/raw_synchronous_socket_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
diff --git a/tests/standalone_2/io/shared_socket_test.dart b/tests/standalone_2/io/shared_socket_test.dart
index 6a12132..6cf7641 100644
--- a/tests/standalone_2/io/shared_socket_test.dart
+++ b/tests/standalone_2/io/shared_socket_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:io';
 import 'dart:isolate';
diff --git a/tests/standalone_2/io/socket_close_test.dart b/tests/standalone_2/io/socket_close_test.dart
index f9ad2d0..f509bc4 100644
--- a/tests/standalone_2/io/socket_close_test.dart
+++ b/tests/standalone_2/io/socket_close_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // VMOptions=
 // VMOptions=--short_socket_read
 // VMOptions=--short_socket_write
diff --git a/tests/standalone_2/io/socket_finalizer_test.dart b/tests/standalone_2/io/socket_finalizer_test.dart
index ecd8de3..a449270 100644
--- a/tests/standalone_2/io/socket_finalizer_test.dart
+++ b/tests/standalone_2/io/socket_finalizer_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // This test checks that sockets belonging to an isolate are properly cleaned up
 // when the isolate shuts down abnormally. If the socket is not properly cleaned
 // up, the test will time out.
diff --git a/tests/standalone_2/io/socket_local_port_test.dart b/tests/standalone_2/io/socket_local_port_test.dart
new file mode 100644
index 0000000..f7251ec
--- /dev/null
+++ b/tests/standalone_2/io/socket_local_port_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import "dart:io";
+
+import "package:expect/expect.dart";
+
+Future testCustomPortIPv4() async {
+  String clientAddress = "127.0.0.1";
+  int customLocalPort = 50988;
+  String serverAddress = clientAddress;
+  int port = 50989;
+
+  testCustomPort(serverAddress, port, clientAddress, customLocalPort);
+}
+
+Future testCustomPortIPv6() async {
+  String clientAddress = "::1";
+  int customLocalPort = 50988;
+  String serverAddress = clientAddress;
+  int port = 50989;
+
+  testCustomPort(serverAddress, port, clientAddress, customLocalPort);
+}
+
+Future testCustomPortIPv4NoSourceAddress() async {
+  String expectedClientAddress = "127.0.0.1";
+  int customLocalPort = 50988;
+  String serverAddress = expectedClientAddress;
+  int port = 50989;
+
+  testCustomPort(serverAddress, port, expectedClientAddress, customLocalPort);
+}
+
+Future testCustomPortIPv6NoSourceAddress() async {
+  String expectedClientAddress = "::1";
+  int customLocalPort = 50988;
+  String serverAddress = expectedClientAddress;
+  int port = 50989;
+
+  testCustomPort(serverAddress, port, expectedClientAddress, customLocalPort);
+}
+
+Future testNoCustomPortIPv4() async {
+  String host = "127.0.0.1";
+  String clientAddress = host;
+  int serverPort = 39998;
+
+  await testNoCustomPortNoSourceAddress(host, serverPort, clientAddress);
+}
+
+Future testNoCustomPortIPv6() async {
+  String host = "::1";
+  String clientAddress = host;
+  int serverPort = 39998;
+
+  await testNoCustomPortNoSourceAddress(host, serverPort, clientAddress);
+}
+
+Future testNoCustomPortNoSourceAddressIPv4() async {
+  String host = "127.0.0.1";
+  String expectedAddress = host;
+  int serverPort = 39998;
+
+  await testNoCustomPortNoSourceAddress(host, serverPort, expectedAddress);
+}
+
+Future testNoCustomPortNoSourceAddressIPv6() async {
+  String host = "::1";
+  String expectedAddress = host;
+  int serverPort = 39998;
+
+  await testNoCustomPortNoSourceAddress(host, serverPort, expectedAddress);
+}
+
+// Core functionality
+void testCustomPort(
+    String host, int port, String sourceAddress, int sourcePort) async {
+  var server = await ServerSocket.bind(host, port);
+  server.listen((client) {
+    Expect.equals(server.port, port);
+    Expect.equals(client.remotePort, sourcePort);
+    Expect.equals(client.address.address, sourceAddress);
+    client.destroy();
+  });
+
+  Socket s = await Socket.connect(host, port,
+      sourceAddress: sourceAddress, sourcePort: sourcePort);
+  s.destroy();
+  server.close();
+}
+
+Future testCustomPortNoSourceAddress(
+    String host, int port, String expectedAddress, int sourcePort) async {
+  Completer completer = new Completer();
+  var server = await ServerSocket.bind(host, port);
+
+  server.listen((client) {
+    Expect.equals(server.port, port);
+    Expect.equals(client.remotePort, sourcePort);
+    Expect.equals(client.address.address, expectedAddress);
+    client.destroy();
+    completer.complete();
+  });
+
+  Socket s = await Socket.connect(host, port, sourcePort: sourcePort);
+  s.destroy();
+  server.close();
+
+  return completer.future;
+}
+
+Future testNoCustomPort(String host, int port, String sourceAddress) async {
+  Completer completer = new Completer();
+  var server = await ServerSocket.bind(host, port);
+  Socket.connect(host, port, sourceAddress: sourceAddress).then((clientSocket) {
+    server.listen((client) {
+      Expect.equals(server.port, port);
+      Expect.equals(client.remotePort, clientSocket.port);
+      Expect.equals(client.address.address, sourceAddress);
+
+      client.destroy();
+      completer.complete();
+    });
+
+    clientSocket.destroy();
+    server.close();
+  });
+
+  return completer.future;
+}
+
+Future testNoCustomPortNoSourceAddress(
+    String host, int port, String expectedAddress) async {
+  Completer completer = new Completer();
+  var server = await ServerSocket.bind(host, port);
+  Socket.connect(host, port).then((clientSocket) {
+    server.listen((client) {
+      Expect.equals(server.port, port);
+      Expect.equals(client.remotePort, clientSocket.port);
+      Expect.equals(client.address.address, expectedAddress);
+      clientSocket.destroy();
+      client.destroy();
+      server.close();
+      completer.complete();
+    });
+  });
+  return completer.future;
+}
+
+Future main() async {
+  await testCustomPortIPv4();
+  await testCustomPortIPv6();
+
+  await testNoCustomPortIPv4();
+  await testNoCustomPortIPv6();
+
+  await testNoCustomPortNoSourceAddressIPv4();
+  await testNoCustomPortNoSourceAddressIPv6();
+}
diff --git a/tests/standalone_2/io/socket_many_connections_test.dart b/tests/standalone_2/io/socket_many_connections_test.dart
index 0e665dc..4944c33 100644
--- a/tests/standalone_2/io/socket_many_connections_test.dart
+++ b/tests/standalone_2/io/socket_many_connections_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Test creating a large number of socket connections.
 library ServerTest;
 
diff --git a/tests/standalone_2/io/stdio_socket_finalizer_test.dart b/tests/standalone_2/io/stdio_socket_finalizer_test.dart
index 7cc1b64..1a36dd8 100644
--- a/tests/standalone_2/io/stdio_socket_finalizer_test.dart
+++ b/tests/standalone_2/io/stdio_socket_finalizer_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // This test checks that stdin is *not* closed when an Isolate leaks it.
 
 import 'dart:async';
diff --git a/tests/standalone_2/io/wait_for_event_isolate_test.dart b/tests/standalone_2/io/wait_for_event_isolate_test.dart
index a22ce25..7cad2c2 100644
--- a/tests/standalone_2/io/wait_for_event_isolate_test.dart
+++ b/tests/standalone_2/io/wait_for_event_isolate_test.dart
@@ -4,12 +4,8 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:async';
 import 'dart:isolate';
-import 'dart:cli';
 
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/standalone_2/packages_file_test.dart b/tests/standalone_2/packages_file_test.dart
index a527ab4..26f9346 100644
--- a/tests/standalone_2/packages_file_test.dart
+++ b/tests/standalone_2/packages_file_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import "dart:async";
 import "dart:io";
 import "dart:convert" show json;
@@ -988,8 +985,7 @@
         "  config: $config\n"
         "  main  : $mainFile\n"
         "  args  : ${args.map((x) => '"$x"').join(" ")}\n"
-        ") : expect {\n${expect.keys.map((k) =>
-           '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
+        ") : expect {\n${expect.keys.map((k) => '  "$k"'.padRight(6) + ":${json.encode(expect[k])}\n").join()}"
         "}";
   }
 }
diff --git a/tests/standalone_2/regress_26031_test.dart b/tests/standalone_2/regress_26031_test.dart
index 933f5b9..0c7b705 100644
--- a/tests/standalone_2/regress_26031_test.dart
+++ b/tests/standalone_2/regress_26031_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 import 'dart:io';
 import 'dart:isolate';
 
diff --git a/tests/standalone_2/regress_28854_1_test.dart b/tests/standalone_2/regress_28854_1_test.dart
index fdc3cc1..f2c7cba 100644
--- a/tests/standalone_2/regress_28854_1_test.dart
+++ b/tests/standalone_2/regress_28854_1_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library regress;
 
 import 'dart:isolate';
diff --git a/tests/standalone_2/regress_28854_2_test.dart b/tests/standalone_2/regress_28854_2_test.dart
index d05b294..24d6282 100644
--- a/tests/standalone_2/regress_28854_2_test.dart
+++ b/tests/standalone_2/regress_28854_2_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-
 library regress;
 
 import 'dart:isolate';
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 548f99c..77236ea 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -93,7 +93,6 @@
 io/http_server_close_response_after_error_test: Skip # Flaky.
 io/http_shutdown_test: Skip # Flaky.
 io/https_client_certificate_test: Crash
-io/platform_test: Crash
 io/raw_datagram_socket_test: Skip # Flaky.
 io/raw_secure_server_closing_test: Skip # Flaky
 io/raw_socket_test: Crash
diff --git a/tests/standalone_2/standalone_2_precompiled.status b/tests/standalone_2/standalone_2_precompiled.status
index cf466ae..07c20e7 100644
--- a/tests/standalone_2/standalone_2_precompiled.status
+++ b/tests/standalone_2/standalone_2_precompiled.status
@@ -18,7 +18,6 @@
 io/named_pipe_script_test: Skip
 io/namespace_test: Skip # Issue 33168
 io/platform_resolved_executable_test: Skip
-io/platform_test: RuntimeError # Expects to be running from 'dart' instead of 'dart_precompiled_runtime'
 io/print_sync_test: Skip
 io/process_check_arguments_test: Skip
 io/process_detached_test: Skip
diff --git a/tests/standalone_2/typed_array_int64_uint64_test.dart b/tests/standalone_2/typed_array_int64_uint64_test.dart
index 3eb3833..c394748 100644
--- a/tests/standalone_2/typed_array_int64_uint64_test.dart
+++ b/tests/standalone_2/typed_array_int64_uint64_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing native typed arrays, int64 and uint64 only.
 
 // Library tag to be able to run in html test framework.
diff --git a/tests/standalone_2/typed_array_test.dart b/tests/standalone_2/typed_array_test.dart
index 94be7ec..9557f01b 100644
--- a/tests/standalone_2/typed_array_test.dart
+++ b/tests/standalone_2/typed_array_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing native float and int arrays.  64-bit int arrays
 // are in a separate test.
 
diff --git a/tests/standalone_2/typed_data_isolate_test.dart b/tests/standalone_2/typed_data_isolate_test.dart
index 0868696..c3b4c30 100644
--- a/tests/standalone_2/typed_data_isolate_test.dart
+++ b/tests/standalone_2/typed_data_isolate_test.dart
@@ -4,9 +4,6 @@
 
 // @dart = 2.9
 
-// VMOptions=--enable-isolate-groups
-// VMOptions=--no-enable-isolate-groups
-//
 // Dart test program for testing typed data.
 
 // Library tag to be able to run in html test framework.
diff --git a/tests/web/47691_test.dart b/tests/web/47691_test.dart
new file mode 100644
index 0000000..db8ae9d
--- /dev/null
+++ b/tests/web/47691_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class LoadElements {
+  List call() => [];
+}
+
+class ViewModel {
+  ViewModel(this._loadElements);
+
+  final LoadElements _loadElements;
+
+  void init() {
+    final elements = _loadElements();
+    for (final element in elements) {
+      Expect.identical(element, element);
+    }
+  }
+}
+
+void main() {
+  ViewModel(LoadElements()).init();
+}
diff --git a/tests/web/dart2js.status b/tests/web/dart2js.status
index 9faa92a..826b784 100644
--- a/tests/web/dart2js.status
+++ b/tests/web/dart2js.status
@@ -24,12 +24,16 @@
 [ $compiler == dart2js && $runtime == chrome && $csp ]
 deferred/load_in_correct_order_test: SkipByDesign # Purposely uses `eval`
 
+[ $compiler == dart2js && $runtime == d8 ]
+internal/object_members_test: SkipByDesign # Browser test
+
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 consistent_index_error_string_test: Slow, Pass # Issue 25940
 
 [ $compiler == dart2js && $csp ]
 deferred_custom_loader_test: SkipByDesign # Issue 25683
 deferred_fail_and_retry_test: SkipByDesign # Uses eval to simulate failed loading.
+internal/object_members_test: SkipByDesign # Uses eval for interop
 
 [ $compiler == dart2js && !$host_checked ]
 dummy_compiler_test: Slow, Pass # Issue 32439. self-hosting doesn't work with CFE yet.
diff --git a/tests/web/dummy_compiler_test.dart b/tests/web/dummy_compiler_test.dart
deleted file mode 100644
index 53d4c20..0000000
--- a/tests/web/dummy_compiler_test.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Tests that the dart2js compiler can be run in a js engine.  This ensures that
-// the internal compiler APIs have no dependency on dart:io.
-library dummy_compiler;
-
-import 'dart:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/compiler.dart';
-
-import 'mock_libraries.dart';
-
-String libProvider(Uri uri) {
-  if (uri.path.endsWith(".platform")) {
-    return DEFAULT_PLATFORM_CONFIG;
-  }
-  if (uri.path.endsWith("/core.dart")) {
-    return buildLibrarySource(DEFAULT_CORE_LIBRARY);
-  } else if (uri.path.endsWith('core_patch.dart')) {
-    return DEFAULT_PATCH_CORE_SOURCE;
-  } else if (uri.path.endsWith('internal.dart')) {
-    return buildLibrarySource(DEFAULT_INTERNAL_LIBRARY);
-  } else if (uri.path.endsWith('interceptors.dart')) {
-    return buildLibrarySource(DEFAULT_INTERCEPTORS_LIBRARY);
-  } else if (uri.path.endsWith('js_helper.dart')) {
-    return buildLibrarySource(DEFAULT_JS_HELPER_LIBRARY);
-  } else if (uri.path.endsWith('/async.dart')) {
-    return buildLibrarySource(DEFAULT_ASYNC_LIBRARY);
-  } else {
-    return "library lib${uri.path.replaceAll('/', '.')};";
-  }
-}
-
-Future<String> provider(Uri uri) {
-  String source;
-  if (uri.scheme == "main") {
-    source = "main() {}";
-  } else if (uri.scheme == "lib") {
-    source = libProvider(uri);
-  } else {
-    throw "unexpected URI $uri";
-  }
-  return new Future.value(source);
-}
-
-void handler(Uri uri, int begin, int end, String message, Diagnostic kind) {
-  if (uri == null) {
-    print('$kind: $message');
-  } else {
-    print('$uri:$begin:$end: $kind: $message');
-  }
-}
-
-main() {
-  asyncStart();
-  Future<CompilationResult> result = compile(new Uri(scheme: 'main'),
-      new Uri(scheme: 'lib', path: '/'), provider, handler);
-  result.then((CompilationResult result) {
-    if (!result.isSuccess) {
-      throw 'Compilation failed';
-    }
-  }, onError: (e, s) {
-    throw 'Compilation failed: $e\n$s';
-  }).then(asyncSuccess);
-}
diff --git a/tests/web/internal/javascriptobject_extensions_test.dart b/tests/web/internal/javascriptobject_extensions_test.dart
index 4edd79d..90ad415 100644
--- a/tests/web/internal/javascriptobject_extensions_test.dart
+++ b/tests/web/internal/javascriptobject_extensions_test.dart
@@ -12,9 +12,14 @@
 import 'package:expect/expect.dart' show hasUnsoundNullSafety;
 import 'package:expect/minitest.dart';
 
-import 'dart:typed_data';
+import 'dart:html' show Window;
+import 'dart:typed_data' show ByteBuffer;
 import 'dart:_interceptors'
-    show JavaScriptObject, UnknownJavaScriptObject, JSObject;
+    show
+        LegacyJavaScriptObject,
+        JavaScriptObject,
+        UnknownJavaScriptObject,
+        JSObject;
 
 @JS()
 external void eval(String code);
@@ -46,6 +51,11 @@
 @JS('arrayBuffer')
 external dynamic get arrayBufferDynamic;
 
+external Window get window;
+
+@JS('window')
+external dynamic get windowDynamic;
+
 // Extension on JavaScriptObject. In the future, when extension types are
 // introduced, this will be explicitly disallowed.
 extension JavaScriptObjectExtension on JavaScriptObject {
@@ -112,19 +122,33 @@
   expect(javaScriptObject is DartClass, false);
   runtimeIsAndAs<DartClass>(javaScriptObject, false);
 
-  // Native objects cannot be casted to or from JavaScriptObject.
+  // Web Native classes are subclasses of JavaScriptObject, but not
+  // LegacyJavaScriptObject.
+  expect(window is JavaScriptObject, true);
+  runtimeIsAndAs<JavaScriptObject>(window, true);
+  runtimeIsAndAs<JavaScriptObject>(windowDynamic, true);
+  javaScriptObject = jsObj as JavaScriptObject;
+  expect(javaScriptObject is Window, false);
+  runtimeIsAndAs<Window>(javaScriptObject, false);
+
+  expect(window is LegacyJavaScriptObject, false);
+  runtimeIsAndAs<LegacyJavaScriptObject>(window, false);
+  runtimeIsAndAs<LegacyJavaScriptObject>(windowDynamic, false);
+  var legacyJavaScriptObject = jsObj as LegacyJavaScriptObject;
+  expect(legacyJavaScriptObject is Window, false);
+  runtimeIsAndAs<Window>(legacyJavaScriptObject, false);
+
+  // Non-web Native classes like those in `dart:typed_data` are not subclasses
+  // of JavaScriptObject.
   expect(arrayBuffer is JavaScriptObject, false);
   runtimeIsAndAs<JavaScriptObject>(arrayBuffer, false);
+  runtimeIsAndAs<JavaScriptObject>(arrayBufferDynamic, false);
   expect(javaScriptObject is ByteBuffer, false);
   runtimeIsAndAs<ByteBuffer>(javaScriptObject, false);
 
-  // Dynamic native objects are intercepted and cannot be casted to
-  // JavaScriptObject.
-  runtimeIsAndAs<JavaScriptObject>(arrayBufferDynamic, false);
-
   // Make sure `Object` methods work with JavaScriptObject like they do with JS
   // interop objects.
-  expect(anonymousObj == javaScriptObject, true);
+  expect(javaScriptObject == jsObj, true);
   expect(javaScriptObject.hashCode, isNotNull);
   expect(javaScriptObject.toString, isNotNull);
   expect(javaScriptObject.noSuchMethod, isNotNull);
diff --git a/tests/web/internal/mock_libraries.dart b/tests/web/internal/mock_libraries.dart
deleted file mode 100644
index d279e0c..0000000
--- a/tests/web/internal/mock_libraries.dart
+++ /dev/null
@@ -1,463 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Library for creating mock versions of platform and internal libraries.
-
-library mock_libraries;
-
-const DEFAULT_PLATFORM_CONFIG = """
-[libraries]
-core:core/core.dart
-async:async/async.dart
-_js_helper:_internal/js_runtime/lib/js_helper.dart
-_interceptors:_internal/js_runtime/lib/interceptors.dart
-_internal:internal/internal.dart
-""";
-
-String buildLibrarySource(Map<String, String> elementMap,
-    [Map<String, String> additionalElementMap = const <String, String>{}]) {
-  Map<String, String> map = new Map<String, String>.from(elementMap);
-  if (additionalElementMap != null) {
-    map.addAll(additionalElementMap);
-  }
-  StringBuffer sb = new StringBuffer();
-  map.values.forEach((String element) {
-    sb.write('$element\n');
-  });
-  return sb.toString();
-}
-
-const Map<String, String> DEFAULT_CORE_LIBRARY = const <String, String>{
-  '<imports>': '''
-import 'dart:_internal' as internal;
-''',
-  'bool': 'class bool {}',
-  'Comparator': 'abstract class Comparator<T> {}',
-  'DateTime': r'''
-      class DateTime {
-        DateTime(year);
-        DateTime.utc(year);
-      }''',
-  'Deprecated': r'''
-      class Deprecated extends Object {
-        final String expires;
-        const Deprecated(this.expires);
-      }''',
-  'deprecated': 'const Object deprecated = const Deprecated("next release");',
-  'double': r'''
-      abstract class double extends num {
-        static var nan = 0;
-        static parse(s) {}
-      }''',
-  'Enum': r'''
-      abstract class Enum {
-        int get index;
-      }''',
-  'Function': r'''
-      class Function {
-        static apply(Function fn, List positional, [Map named]) => null;
-      }''',
-  'identical': 'bool identical(Object a, Object b) { return true; }',
-  'int': 'abstract class int extends num { }',
-  'Iterable': '''
-      abstract class Iterable<E> {
-          Iterator<E> get iterator => null;
-      }''',
-  'Iterator': '''
-      abstract class Iterator<E> {
-          E get current => null;
-      }''',
-  'LinkedHashMap': r'''
-      class LinkedHashMap<K, V> implements Map<K, V> {
-      }''',
-  'List': r'''
-      class List<E> extends Iterable<E> {
-        var length;
-        List([length]);
-        List.filled(length, element);
-        E get first => null;
-        E get last => null;
-        E get single => null;
-        E removeLast() => null;
-        E removeAt(i) => null;
-        E elementAt(i) => null;
-        E singleWhere(f) => null;
-      }''',
-  'Map': 'abstract class Map<K,V> {}',
-  'Null': 'class Null {}',
-  'num': r'''
-      abstract class num {
-        operator +(_);
-        operator *(_);
-        operator -();
-      }''',
-  'print': 'print(var obj) {}',
-  'proxy': 'const proxy = 0;',
-  'Object': r'''
-      class Object {
-        const Object();
-        operator ==(other) { return true; }
-        get hashCode => throw "Object.hashCode not implemented.";
-        String toString() { return null; }
-        noSuchMethod(im) { throw im; }
-      }''',
-  'StackTrace': 'abstract class StackTrace {}',
-  'String': 'class String implements Pattern {}',
-  'Symbol': '''
-      abstract class Symbol {
-        const factory Symbol(String name) = internal.Symbol;
-      }
-      ''',
-  'Type': 'class Type {}',
-  'Pattern': 'abstract class Pattern {}',
-  '_genericNoSuchMethod': '_genericNoSuchMethod(a,b,c,d,e) {}',
-  '_unresolvedConstructorError': '_unresolvedConstructorError(a,b,c,d,e) {}',
-  '_malformedTypeError': '_malformedTypeError(message) {}',
-};
-
-const Map<String, String> DEFAULT_INTERNAL_LIBRARY = const <String, String>{
-  '<imports>': '''
-import 'dart:core' as core;
-''',
-  'Symbol': '''
-class Symbol implements core.Symbol {
-  final core.String _name;
-
-  const Symbol(this._name);
-  Symbol.validated(this._name);
-}
-''',
-};
-
-const String DEFAULT_PATCH_CORE_SOURCE = r'''
-import 'dart:_js_helper';
-import 'dart:_interceptors';
-import 'dart:async';
-
-@patch
-class LinkedHashMap<K, V> {
-  factory LinkedHashMap._empty() => null;
-  factory LinkedHashMap._literal(elements) => null;
-  static _makeEmpty() => null;
-  static _makeLiteral(elements) => null;
-}
-''';
-
-const Map<String, String> DEFAULT_JS_HELPER_LIBRARY = const <String, String>{
-  'assertTest': 'assertTest(a) {}',
-  'assertThrow': 'assertThrow(a) {}',
-  'assertHelper': 'assertHelper(a) {}',
-  'assertUnreachable': 'assertUnreachable() {}',
-  'assertIsSubtype': 'assertIsSubtype(subtype, supertype, message) {}',
-  'assertSubtype': 'assertSubtype(object, isField, checks, asField) {}',
-  'assertSubtypeOfRuntimeType': 'assertSubtypeOfRuntimeType(object, type) {}',
-  'asyncHelper': 'asyncHelper(object, asyncBody, completer) {}',
-  'boolConversionCheck': 'boolConversionCheck(x) {}',
-  'boolTypeCast': 'boolTypeCast(value) {}',
-  'boolTypeCheck': 'boolTypeCheck(value) {}',
-  'checkSubtype': 'checkSubtype(object, isField, checks, asField) {}',
-  'checkSubtypeOfRuntimeType': 'checkSubtypeOfRuntimeType(o, t) {}',
-  'BoundClosure': r'''abstract class BoundClosure extends Closure {
-    var self;
-    var target;
-    var receiver;
-  }''',
-  'buildFunctionType': r'''buildFunctionType(returnType, parameterTypes,
-                            optionalParameterTypes) {
-            return new RuntimeFunctionType();
-          }''',
-  'buildInterfaceType': '''buildInterfaceType(rti, typeArguments) {
-                             if (rti == null) return new RuntimeTypePlain();
-                             return new RuntimeTypeGeneric();
-                           }''',
-  'buildNamedFunctionType':
-      r'''buildNamedFunctionType(returnType, parameterTypes,
-                                 namedParameters) {
-            return new RuntimeFunctionType();
-          }''',
-  'checkFunctionSubtype':
-      r'''checkFunctionSubtype(var target, String signatureName,
-                               String contextName, var context,
-                               var typeArguments) {}''',
-  'checkMalformedType': 'checkMalformedType(value, message) {}',
-  'checkInt': 'checkInt(value) {}',
-  'checkNum': 'checkNum(value) {}',
-  'checkString': 'checkString(value) {}',
-  'Closure': 'abstract class Closure implements Function { }',
-  'closureFromTearOff':
-      r'''closureFromTearOff(receiver, functions, reflectionInfo,
-                             isStatic, jsArguments, name) {}''',
-  'computeSignature':
-      'computeSignature(var signature, var context, var contextName) {}',
-  'ConstantMap': 'class ConstantMap<K, V> {}',
-  'ConstantProtoMap': 'class ConstantProtoMap<K, V> {}',
-  'ConstantStringMap': 'class ConstantStringMap<K, V> {}',
-  'createInvocationMirror': 'createInvocationMirror(a0, a1, a2, a3, a4, a5) {}',
-  'createRuntimeType': 'createRuntimeType(a) {}',
-  'doubleTypeCast': 'doubleTypeCast(value) {}',
-  'doubleTypeCheck': 'doubleTypeCheck(value) {}',
-  'functionSubtypeCast':
-      r'''functionSubtypeCast(Object object, String signatureName,
-                              String contextName, var context) {}''',
-  'functionTypeTestMetaHelper': r'''
-      functionTypeTestMetaHelper() {
-        buildFunctionType(null, null, null);
-        buildNamedFunctionType(null, null, null);
-        buildInterfaceType(null, null);
-      }''',
-  'functionTypeTest': r'functionTypeTest(f, t) {}',
-  'functionTypeCast': r'functionTypeCast(f, t) { return f; }',
-  'functionTypeCheck': r'functionTypeCheck(f, t) { return f; }',
-  'futureOrTest': r'futureOrTest(f, t) {}',
-  'futureOrCast': r'futureOrCast(f, t) { return f; }',
-  'futureOrCheck': r'futureOrCheck(f, t) { return f; }',
-  'getFallThroughError': 'getFallThroughError() {}',
-  'getIsolateAffinityTag': 'getIsolateAffinityTag(_) {}',
-  'getRuntimeTypeArgumentIntercepted':
-      'getRuntimeTypeArgumentIntercepted(interceptor, target, substitutionName, index) {}',
-  'getRuntimeTypeArgument':
-      'getRuntimeTypeArgument(target, substitutionName, index) {}',
-  'getRuntimeTypeArguments':
-      'getRuntimeTypeArguments(target, substitutionName) {}',
-  'getRuntimeTypeInfo': 'getRuntimeTypeInfo(a) {}',
-  'getTraceFromException': 'getTraceFromException(exception) {}',
-  'getTypeArgumentByIndex': 'getTypeArgumentByIndex(target, index) {}',
-  'GeneralConstantMap': 'class GeneralConstantMap {}',
-  'iae': 'iae(x) { throw x; } ioore(x) { throw x; }',
-  'Instantiation1': 'class Instantiation1<T1> extends Closure {}',
-  'Instantiation2': 'class Instantiation2<T1,T2> extends Closure {}',
-  'Instantiation3': 'class Instantiation3<T1,T2,T3> extends Closure {}',
-  'interceptedTypeCast': 'interceptedTypeCast(value, property) {}',
-  'interceptedTypeCheck': 'interceptedTypeCheck(value, property) {}',
-  'intTypeCast': 'intTypeCast(value) {}',
-  'intTypeCheck': 'intTypeCheck(value) {}',
-  'isJsIndexable': 'isJsIndexable(a, b) {}',
-  'JavaScriptIndexingBehavior': 'abstract class JavaScriptIndexingBehavior {}',
-  'JSInvocationMirror': r'''
-  class JSInvocationMirror {
-    get typeArguments => null;
-  }''',
-  'listSuperNativeTypeCast': 'listSuperNativeTypeCast(value) {}',
-  'listSuperNativeTypeCheck': 'listSuperNativeTypeCheck(value) {}',
-  'listSuperTypeCast': 'listSuperTypeCast(value) {}',
-  'listSuperTypeCheck': 'listSuperTypeCheck(value) {}',
-  'listTypeCast': 'listTypeCast(value) {}',
-  'listTypeCheck': 'listTypeCheck(value) {}',
-  'makeLiteralMap': 'makeLiteralMap(List keyValuePairs) {}',
-  'Native': 'class Native {}',
-  'numberOrStringSuperNativeTypeCast':
-      'numberOrStringSuperNativeTypeCast(value) {}',
-  'numberOrStringSuperNativeTypeCheck':
-      'numberOrStringSuperNativeTypeCheck(value) {}',
-  'numberOrStringSuperTypeCast': 'numberOrStringSuperTypeCast(value) {}',
-  'numberOrStringSuperTypeCheck': 'numberOrStringSuperTypeCheck(value) {}',
-  'numTypeCast': 'numTypeCast(value) {}',
-  'numTypeCheck': 'numTypeCheck(value) {}',
-  '_Patch': 'class _Patch { final tag; const _Patch(this.tag); }',
-  'patch': 'const patch = const _Patch(null);',
-  'patch_full': 'const patch_full = const _Patch("full");',
-  'patch_lazy': 'const patch_lazy = const _Patch("lazy");',
-  'patch_startup': 'const patch_startup = const _Patch("startup");',
-  'propertyTypeCast': 'propertyTypeCast(x) {}',
-  'propertyTypeCheck': 'propertyTypeCheck(value, property) {}',
-  'requiresPreamble': 'requiresPreamble() {}',
-  'RuntimeFunctionType': 'class RuntimeFunctionType {}',
-  'RuntimeTypeGeneric': 'class RuntimeTypeGeneric {}',
-  'RuntimeTypePlain': 'class RuntimeTypePlain {}',
-  'S': 'S() {}',
-  'setRuntimeTypeInfo': 'setRuntimeTypeInfo(a, b) {}',
-  'stringSuperNativeTypeCast': 'stringSuperNativeTypeCast(value) {}',
-  'stringSuperNativeTypeCheck': 'stringSuperNativeTypeCheck(value) {}',
-  'stringSuperTypeCast': 'stringSuperTypeCast(value) {}',
-  'stringSuperTypeCheck': 'stringSuperTypeCheck(value) {}',
-  'stringTypeCast': 'stringTypeCast(x) {}',
-  'stringTypeCheck': 'stringTypeCheck(x) {}',
-  'subtypeCast': 'subtypeCast(object, isField, checks, asField) {}',
-  'subtypeOfRuntimeTypeCast': 'subtypeOfRuntimeTypeCast(object, type) {}',
-  'checkConcurrentModificationError':
-      'checkConcurrentModificationError(collection) {}',
-  'throwConcurrentModificationError':
-      'throwConcurrentModificationError(collection) {}',
-  'throwCyclicInit': 'throwCyclicInit(staticName) {}',
-  'throwExpression': 'throwExpression(e) {}',
-  'throwNoSuchMethod':
-      'throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}',
-  'throwUnsupportedError': 'throwUnsupportedError(message) {}',
-  'throwTypeError': 'throwTypeError(message) {}',
-  'unwrapException': 'unwrapException(e) {}',
-  'voidTypeCheck': 'voidTypeCheck(value) {}',
-  'wrapException': 'wrapException(x) { return x; }',
-  'badMain': 'badMain() { throw "bad main"; }',
-  'missingMain': 'missingMain() { throw "missing main"; }',
-  'mainHasTooManyParameters': 'mainHasTooManyParameters() '
-      '{ throw "main has too many parameters"; }',
-};
-
-const Map<String, String> DEFAULT_FOREIGN_HELPER_LIBRARY =
-    const <String, String>{
-  'JS': r'''
-      dynamic JS(String typeDescription, String codeTemplate,
-        [var arg0, var arg1, var arg2, var arg3, var arg4, var arg5, var arg6,
-         var arg7, var arg8, var arg9, var arg10, var arg11]) {}''',
-};
-
-const Map<String, String> DEFAULT_INTERCEPTORS_LIBRARY = const <String, String>{
-  'findIndexForNativeSubclassType': 'findIndexForNativeSubclassType(type) {}',
-  'getDispatchProperty': 'getDispatchProperty(o) {}',
-  'getInterceptor': 'getInterceptor(x) {}',
-  'getNativeInterceptor': 'getNativeInterceptor(x) {}',
-  'initializeDispatchProperty': 'initializeDispatchProperty(f,p,i) {}',
-  'initializeDispatchPropertyCSP': 'initializeDispatchPropertyCSP(f,p,i) {}',
-  'Interceptor': r'''
-      class Interceptor {
-        toString() {}
-        bool operator==(other) => identical(this, other);
-        get hashCode => throw "Interceptor.hashCode not implemented.";
-        noSuchMethod(im) { throw im; }
-      }''',
-  'JSArray': r'''
-          class JSArray<E> extends Interceptor implements List<E>, JSIndexable {
-            JSArray();
-            factory JSArray.typed(a) => a;
-            var length;
-            operator[](index) => this[index];
-            operator[]=(index, value) { this[index] = value; }
-            add(value) { this[length] = value; }
-            insert(index, value) {}
-            E get first => this[0];
-            E get last => this[0];
-            E get single => this[0];
-            E removeLast() => this[0];
-            E removeAt(index) => this[0];
-            E elementAt(index) => this[0];
-            E singleWhere(f) => this[0];
-            Iterator<E> get iterator => null;
-          }''',
-  'JSBool': 'class JSBool extends Interceptor implements bool {}',
-  'JSDouble': 'class JSDouble extends JSNumber implements double {}',
-  'JSExtendableArray': 'class JSExtendableArray extends JSMutableArray {}',
-  'JSFixedArray': 'class JSFixedArray extends JSMutableArray {}',
-  'JSFunction':
-      'abstract class JSFunction extends Interceptor implements Function {}',
-  'JSIndexable': r'''
-      abstract class JSIndexable {
-        get length;
-        operator[](index);
-      }''',
-  'JSInt': r'''
-       class JSInt extends JSNumber implements int {
-         operator~() => this;
-       }''',
-  'JSMutableArray':
-      'class JSMutableArray extends JSArray implements JSMutableIndexable {}',
-  'JSUnmodifiableArray': 'class JSUnmodifiableArray extends JSArray {}',
-  'JSMutableIndexable':
-      'abstract class JSMutableIndexable extends JSIndexable {}',
-  'JSPositiveInt': 'class JSPositiveInt extends JSInt {}',
-  'JSNull': r'''
-      class JSNull extends Interceptor {
-        bool operator==(other) => identical(null, other);
-        get hashCode => throw "JSNull.hashCode not implemented.";
-        String toString() => 'Null';
-        Type get runtimeType => null;
-        noSuchMethod(x) => super.noSuchMethod(x);
-      }''',
-  'JSNumber': r'''
-      class JSNumber extends Interceptor implements num {
-        // All these methods return a number to please type inferencing.
-        operator-() => (this is JSInt) ? 42 : 42.2;
-        operator +(other) => (this is JSInt) ? 42 : 42.2;
-        operator -(other) => (this is JSInt) ? 42 : 42.2;
-        operator ~/(other) => _tdivFast(other);
-        operator /(other) => (this is JSInt) ? 42 : 42.2;
-        operator *(other) => (this is JSInt) ? 42 : 42.2;
-        operator %(other) => (this is JSInt) ? 42 : 42.2;
-        operator <<(other) => _shlPositive(other);
-        operator >>(other) {
-          return _shrBothPositive(other) + _shrReceiverPositive(other) +
-            _shrOtherPositive(other);
-        }
-        operator |(other) => 42;
-        operator &(other) => 42;
-        operator ^(other) => 42;
-
-        operator >(other) => !identical(this, other);
-        operator >=(other) => !identical(this, other);
-        operator <(other) => !identical(this, other);
-        operator <=(other) => !identical(this, other);
-        operator ==(other) => identical(this, other);
-        get hashCode => throw "JSNumber.hashCode not implemented.";
-
-        // We force side effects on _tdivFast to mimic the shortcomings of
-        // the effect analysis: because the `_tdivFast` implementation of
-        // the core library has calls that may not already be analyzed,
-        // the analysis will conclude that `_tdivFast` may have side
-        // effects.
-        _tdivFast(other) => new List()..length = 42;
-        _shlPositive(other) => 42;
-        _shrBothPositive(other) => 42;
-        _shrReceiverPositive(other) => 42;
-        _shrOtherPositive(other) => 42;
-
-        abs() => (this is JSInt) ? 42 : 42.2;
-        remainder(other) => (this is JSInt) ? 42 : 42.2;
-        truncate() => 42;
-      }''',
-  'JSString': r'''
-      class JSString extends Interceptor implements String, JSIndexable {
-        split(pattern) => [];
-        int get length => 42;
-        operator[](index) {}
-        toString() {}
-        operator+(other) => this;
-        codeUnitAt(index) => 42;
-      }''',
-  'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',
-  'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',
-  'ObjectInterceptor': 'class ObjectInterceptor {}',
-  'JavaScriptObject': 'class JavaScriptObject {}',
-  'PlainJavaScriptObject': 'class PlainJavaScriptObject {}',
-  'UnknownJavaScriptObject': 'class UnknownJavaScriptObject {}',
-  'JavaScriptFunction': 'class JavaScriptFunction {}',
-};
-
-const Map<String, String> DEFAULT_ASYNC_LIBRARY = const <String, String>{
-  'DeferredLibrary': 'class DeferredLibrary {}',
-  'Future': '''
-      class Future<T> {
-        Future.value([value]);
-      }
-      ''',
-  'Stream': 'class Stream<T> {}',
-  'Completer': 'class Completer<T> {}',
-  'StreamIterator': 'class StreamIterator<T> {}',
-};
-
-/// These members are only needed when async/await is used.
-const Map<String, String> ASYNC_AWAIT_LIBRARY = const <String, String>{
-  '_wrapJsFunctionForAsync': '_wrapJsFunctionForAsync(f) {}',
-  '_asyncHelper': '_asyncHelper(o, f, c) {}',
-  '_SyncStarIterable': 'class _SyncStarIterable {}',
-  '_IterationMarker': 'class _IterationMarker {}',
-  '_AsyncStarStreamController': 'class _AsyncStarStreamController {}',
-  '_asyncStarHelper': '_asyncStarHelper(x, y, z) {}',
-  '_streamOfController': '_streamOfController(x) {}',
-};
-
-const String DEFAULT_MIRRORS_SOURCE = r'''
-import 'dart:_js_mirrors' as js;
-class Comment {}
-class MirrorSystem {}
-class MirrorsUsed {
-  final targets;
-  const MirrorsUsed({this.targets});
-}
-void reflectType(Type t) => js.disableTreeShaking();
-''';
-
-const String DEFAULT_JS_MIRRORS_SOURCE = r'''
-disableTreeShaking(){}
-preserveMetadata(){}
-preserveLibraryNames(){}
-''';
diff --git a/tests/web/internal/object_members_test.dart b/tests/web/internal/object_members_test.dart
new file mode 100644
index 0000000..02092eb
--- /dev/null
+++ b/tests/web/internal/object_members_test.dart
@@ -0,0 +1,80 @@
+// 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.
+
+// Make sure `Object` methods work as expected with `dart:html` and interop
+// types. The expectations here aren't guarantees that they should work a
+// particular way, but rather a way to monitor regressions/changes.
+
+@JS()
+library object_members_test;
+
+import 'package:js/js.dart';
+import 'package:expect/minitest.dart';
+
+import 'dart:html';
+import 'dart:_interceptors' show JSObject;
+
+@JS()
+external void eval(String code);
+
+@JS()
+class JSClass {
+  external JSClass();
+}
+
+void main() {
+  eval(r'''
+    function JSClass() {}
+  ''');
+
+  // `dart:html` type.
+  var div = document.createElement('div');
+  expect(div == div, true);
+  expect(div == DomPointReadOnly(), false);
+  // Ensure that we get a random hash for each new instance. It should be
+  // improbable for this to fail across many runs if the hash is
+  // non-deterministic.
+  var hashCode = div.hashCode;
+  var attempts = 0;
+  var maxAttempts = 1000;
+  while (div.hashCode == hashCode && attempts < maxAttempts) {
+    div = document.createElement('div');
+    attempts++;
+  }
+  expect(attempts > 0 && attempts != maxAttempts, isTrue);
+  expect(div.toString, isNotNull);
+  expect(div.toString(), 'div');
+  expect(div.noSuchMethod, isNotNull);
+  var noSuchMethodErrorThrown = true;
+  try {
+    (div as dynamic).triggerNoSuchMethod();
+    noSuchMethodErrorThrown = false;
+  } catch (_) {}
+  expect(noSuchMethodErrorThrown, isTrue);
+  expect(div.runtimeType, DivElement);
+
+  // `toString` for `dart:html` types that do not have an overridden `toString`
+  // should look up the type through the proto.
+  expect(window.navigator.toString(), "Instance of 'Navigator'");
+
+  // Interop type.
+  var js = JSClass();
+  expect(js == js, true);
+  expect(js == JSClass(), false);
+  // TODO(srujzs): Modify this once interop has random hash codes.
+  hashCode = js.hashCode;
+  expect(hashCode, 0);
+  expect(hashCode, js.hashCode);
+  expect(js.toString, isNotNull);
+  // Should forward to underlying `toString` call.
+  expect(js.toString(), '[object Object]');
+  expect(js.noSuchMethod, isNotNull);
+  noSuchMethodErrorThrown = true;
+  try {
+    (js as dynamic).triggerNoSuchMethod();
+    noSuchMethodErrorThrown = false;
+  } catch (_) {}
+  expect(noSuchMethodErrorThrown, isTrue);
+  expect(js.runtimeType, JSObject);
+}
diff --git a/tests/web/internal/rti/js_interop_subtype_test.dart b/tests/web/internal/rti/js_interop_subtype_test.dart
index 66010da..ffcb31c 100644
--- a/tests/web/internal/rti/js_interop_subtype_test.dart
+++ b/tests/web/internal/rti/js_interop_subtype_test.dart
@@ -17,6 +17,6 @@
   eval(r'''
       function JSClass() {}
       ''');
-  Expect.type<JavaScriptObject>(JSClass());
-  Expect.type<List<JavaScriptObject>>(<JSClass>[]);
+  Expect.type<LegacyJavaScriptObject>(JSClass());
+  Expect.type<List<LegacyJavaScriptObject>>(<JSClass>[]);
 }
diff --git a/tests/web/native/error_safeToString_test.dart b/tests/web/native/error_safeToString_test.dart
index ecb3544..333b9c7 100644
--- a/tests/web/native/error_safeToString_test.dart
+++ b/tests/web/native/error_safeToString_test.dart
@@ -7,7 +7,7 @@
 import 'dart:_interceptors'
     show
         Interceptor,
-        JavaScriptObject,
+        LegacyJavaScriptObject,
         PlainJavaScriptObject,
         UnknownJavaScriptObject;
 
diff --git a/tests/web/native/jsobject_test.dart b/tests/web/native/jsobject_test.dart
index 0b769d0..5604920 100644
--- a/tests/web/native/jsobject_test.dart
+++ b/tests/web/native/jsobject_test.dart
@@ -8,7 +8,7 @@
     show
         JSObject, // The interface, which may be re-exported by a
         // js-interop library.
-        JavaScriptObject, //   The interceptor abstract class.
+        LegacyJavaScriptObject, //   The interceptor abstract class.
         PlainJavaScriptObject, //     The interceptor concrete class.
         UnknownJavaScriptObject, //     The interceptor concrete class.
         Interceptor;
@@ -47,21 +47,21 @@
 static_test() {
   var x = makeA();
   Expect.isTrue(x is JSObject);
-  Expect.isTrue(x is JavaScriptObject);
+  Expect.isTrue(x is LegacyJavaScriptObject);
   Expect.isTrue(x is PlainJavaScriptObject);
   Expect.isTrue(x is! UnknownJavaScriptObject);
   Expect.equals(JSObject, x.runtimeType);
 
   x = makeB();
   Expect.isTrue(x is JSObject);
-  Expect.isTrue(x is JavaScriptObject);
+  Expect.isTrue(x is LegacyJavaScriptObject);
   Expect.isTrue(x is! PlainJavaScriptObject);
   Expect.isTrue(x is UnknownJavaScriptObject);
   Expect.equals(JSObject, x.runtimeType);
 
   x = makeQ();
   Expect.isFalse(x is JSObject);
-  Expect.isFalse(x is JavaScriptObject);
+  Expect.isFalse(x is LegacyJavaScriptObject);
   Expect.isFalse(x is PlainJavaScriptObject);
   Expect.isFalse(x is UnknownJavaScriptObject);
   Expect.isFalse(x.runtimeType == JSObject);
@@ -71,27 +71,27 @@
 dynamic_test() {
   var x = makeA();
   var isJSObject = new Is<JSObject>().check;
-  var isJavaScriptObject = new Is<JavaScriptObject>().check;
+  var isLegacyJavaScriptObject = new Is<LegacyJavaScriptObject>().check;
   var isPlainJavaScriptObject = new Is<PlainJavaScriptObject>().check;
   var isUnknownJavaScriptObject = new Is<UnknownJavaScriptObject>().check;
   var isQ = new Is<Q>().check;
 
   Expect.isTrue(isJSObject(x));
-  Expect.isTrue(isJavaScriptObject(x));
+  Expect.isTrue(isLegacyJavaScriptObject(x));
   Expect.isTrue(isPlainJavaScriptObject(x));
   Expect.isTrue(!isUnknownJavaScriptObject(x));
   Expect.equals(JSObject, x.runtimeType);
 
   x = makeB();
   Expect.isTrue(isJSObject(x));
-  Expect.isTrue(isJavaScriptObject(x));
+  Expect.isTrue(isLegacyJavaScriptObject(x));
   Expect.isTrue(!isPlainJavaScriptObject(x));
   Expect.isTrue(isUnknownJavaScriptObject(x));
   Expect.equals(JSObject, x.runtimeType);
 
   x = makeQ();
   Expect.isFalse(isJSObject(x));
-  Expect.isFalse(isJavaScriptObject(x));
+  Expect.isFalse(isLegacyJavaScriptObject(x));
   Expect.isFalse(isPlainJavaScriptObject(x));
   Expect.isFalse(isUnknownJavaScriptObject(x));
   Expect.isTrue(isQ(x));
diff --git a/tests/web/native/static_interop_erasure/factory_stub_test.dart b/tests/web/native/static_interop_erasure/factory_stub_test.dart
new file mode 100644
index 0000000..71fe516
--- /dev/null
+++ b/tests/web/native/static_interop_erasure/factory_stub_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that factory methods with bodies are stubbed correctly in static interop
+// type erasure.
+
+@JS()
+library factory_stub_test;
+
+import 'dart:_interceptors' show JavaScriptObject;
+
+import 'package:js/js.dart';
+
+import '../native_testing.dart';
+import '../native_testing.dart' as native_testing;
+
+NativeClass makeNativeClass() native;
+
+@Native('NativeClass')
+class NativeClass extends JavaScriptObject {
+  factory NativeClass() => makeNativeClass();
+}
+
+@JS('NativeClass')
+@staticInterop
+class StaticNativeClass {
+  external StaticNativeClass();
+  factory StaticNativeClass.redirectingFactory() = StaticNativeClass;
+  factory StaticNativeClass.simpleFactory() => StaticNativeClass();
+  factory StaticNativeClass.factoryWithParam(
+          StaticNativeClass staticNativeClass) =>
+      staticNativeClass;
+  // This and `StaticNativeClassCopy.nestedFactory` exist to ensure that we
+  // cover the case where invocations on factories are visible before their
+  // declarations in the AST. This will test whether we correctly create the
+  // stub even if we haven't visited the declaration yet.
+  factory StaticNativeClass.nestedFactory() {
+    StaticNativeClassCopy.nestedFactory();
+    return StaticNativeClass();
+  }
+}
+
+@JS('NativeClass')
+@staticInterop
+class StaticNativeClassCopy {
+  external StaticNativeClassCopy();
+  factory StaticNativeClassCopy.nestedFactory() {
+    StaticNativeClass.simpleFactory();
+    return StaticNativeClassCopy();
+  }
+}
+
+void main() {
+  nativeTesting();
+  native_testing.JS('', r'''
+    (function(){
+      function NativeClass() {}
+      self.NativeClass = NativeClass;
+      self.makeNativeClass = function(){return new NativeClass()};
+      self.nativeConstructor(NativeClass);
+    })()
+  ''');
+  applyTestExtensions(['NativeClass']);
+
+  // Make the Native class live.
+  NativeClass();
+  // Invoke factories and ensure they're typed correctly through assignment.
+  StaticNativeClass staticNativeClass = StaticNativeClass.redirectingFactory();
+  staticNativeClass = StaticNativeClass.simpleFactory();
+  staticNativeClass = StaticNativeClass.factoryWithParam(staticNativeClass);
+  staticNativeClass = StaticNativeClass.nestedFactory();
+}
diff --git a/tests/web/native/static_interop_erasure/type_test.dart b/tests/web/native/static_interop_erasure/type_test.dart
new file mode 100644
index 0000000..c3081b8
--- /dev/null
+++ b/tests/web/native/static_interop_erasure/type_test.dart
@@ -0,0 +1,244 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that the type and subtyping relationships between static interop,
+// non-static interop, and Native classes are well-formed.
+
+@JS()
+library type_test;
+
+import 'dart:_interceptors' show JavaScriptObject;
+
+import 'package:expect/expect.dart' show hasUnsoundNullSafety;
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart';
+
+import '../native_testing.dart';
+import '../native_testing.dart' as native_testing;
+
+NativeClass makeNativeClass() native;
+
+@Native('NativeClass')
+class NativeClass extends JavaScriptObject {
+  factory NativeClass() => makeNativeClass();
+}
+
+@JS('NativeClass')
+@staticInterop
+class StaticNativeClass {
+  external StaticNativeClass();
+}
+
+@JS()
+class JSClass {
+  external JSClass();
+}
+
+@JS('JSClass')
+@staticInterop
+class StaticJSClass {
+  external StaticJSClass();
+}
+
+@JS()
+@anonymous
+class AnonymousClass {
+  external factory();
+}
+
+@JS()
+@staticInterop
+class GenericStaticJSClass<T> {}
+
+NativeClass returnNativeClass() => throw '';
+
+StaticNativeClass returnStaticNativeClass() => throw '';
+
+JSClass returnJSClass() => throw '';
+
+StaticJSClass returnStaticJSClass() => throw '';
+
+AnonymousClass returnAnonymousClass() => throw '';
+
+GenericStaticJSClass<int> returnGenericStaticJSClassInt() => throw '';
+
+StaticJSClass? returnNullableStaticJSClass() => throw '';
+
+void main() {
+  nativeTesting();
+  native_testing.JS('', r'''
+    (function(){
+      function NativeClass() {}
+      self.NativeClass = NativeClass;
+      self.makeNativeClass = function(){return new NativeClass()};
+      self.nativeConstructor(NativeClass);
+      function JSClass() {}
+      self.JSClass = JSClass;
+    })()
+  ''');
+  applyTestExtensions(['NativeClass']);
+
+  var nativeClass = NativeClass();
+  var staticNativeClass = StaticNativeClass();
+  var jsClass = JSClass();
+  var staticJsClass = StaticJSClass();
+  var anonymousClass = AnonymousClass();
+
+  // Test that nullability of the type is respected in erasure.
+  expect(null is StaticJSClass?, true);
+  expect(confuse(null) is StaticJSClass?, true);
+  expect(() => null as StaticJSClass?, returnsNormally);
+  expect(null is StaticJSClass, false);
+  expect(confuse(null) is StaticJSClass, false);
+  expect(() => null as StaticJSClass,
+      hasUnsoundNullSafety ? returnsNormally : throws);
+
+  // Native objects can be interop'd with static interop classes.
+  expect(nativeClass is StaticNativeClass, true);
+  expect(confuse(nativeClass) is StaticNativeClass, true);
+  expect(() => nativeClass as StaticNativeClass, returnsNormally);
+
+  expect(staticNativeClass is NativeClass, true);
+  expect(confuse(staticNativeClass) is NativeClass, true);
+  expect(() => staticNativeClass as NativeClass, returnsNormally);
+
+  // Likewise, non-native JS objects can be interop'd with static interop
+  // classes as well.
+  expect(jsClass is StaticJSClass, true);
+  expect(confuse(jsClass) is StaticJSClass, true);
+  expect(() => jsClass as StaticJSClass, returnsNormally);
+
+  expect(staticJsClass is JSClass, true);
+  expect(confuse(staticJsClass) is JSClass, true);
+  expect(() => staticJsClass as JSClass, returnsNormally);
+
+  expect(anonymousClass is StaticJSClass, true);
+  expect(confuse(anonymousClass) is StaticJSClass, true);
+  expect(() => anonymousClass as StaticJSClass, returnsNormally);
+
+  expect(staticJsClass is AnonymousClass, true);
+  expect(confuse(staticJsClass) is AnonymousClass, true);
+  expect(() => staticJsClass as AnonymousClass, returnsNormally);
+
+  // With erasure, all static interop classes become the same type, so you can
+  // cast either interop or native objects to them regardless of the underlying
+  // class.
+  expect(staticNativeClass is StaticJSClass, true);
+  expect(confuse(staticNativeClass) is StaticJSClass, true);
+  expect(() => staticNativeClass as StaticJSClass, returnsNormally);
+
+  expect(staticJsClass is StaticNativeClass, true);
+  expect(confuse(staticJsClass) is StaticNativeClass, true);
+  expect(() => staticJsClass as StaticNativeClass, returnsNormally);
+
+  expect(nativeClass is StaticJSClass, true);
+  expect(confuse(nativeClass) is StaticJSClass, true);
+  expect(() => nativeClass as StaticJSClass, returnsNormally);
+
+  expect(jsClass is StaticNativeClass, true);
+  expect(confuse(jsClass) is StaticNativeClass, true);
+  expect(() => jsClass as StaticNativeClass, returnsNormally);
+
+  expect(anonymousClass is StaticNativeClass, true);
+  expect(confuse(anonymousClass) is StaticNativeClass, true);
+  expect(() => anonymousClass as StaticNativeClass, returnsNormally);
+
+  // You cannot, however, always cast from a static interop type to an interop
+  // type or a native type. That will depend on whether the object is an interop
+  // object or a native object.
+  expect(staticNativeClass is JSClass, false);
+  expect(confuse(staticNativeClass) is JSClass, false);
+  expect(() => staticNativeClass as JSClass, throws);
+
+  expect(staticNativeClass is AnonymousClass, false);
+  expect(confuse(staticNativeClass) is AnonymousClass, false);
+  expect(() => staticNativeClass as AnonymousClass, throws);
+
+  expect(staticJsClass is NativeClass, false);
+  expect(confuse(staticJsClass) is NativeClass, false);
+  expect(() => staticJsClass as NativeClass, throws);
+
+  // Subtyping rules.
+
+  // Note that erasure ignores all static class type parameters so this
+  // comparison becomes
+  // `JavaScriptObject Function() is JavaScriptObject Function()`. This behavior
+  // is similar to non-static interop classes.
+  expect(
+      returnGenericStaticJSClassInt is GenericStaticJSClass<String> Function(),
+      true);
+  expect(
+      confuse(returnGenericStaticJSClassInt) is GenericStaticJSClass<String>
+          Function(),
+      true);
+  expect(
+      () => returnGenericStaticJSClassInt as GenericStaticJSClass<String>
+          Function(),
+      returnsNormally);
+
+  // Test that nullability is respected.
+  expect(returnStaticJSClass is StaticJSClass? Function(), true);
+  expect(confuse(returnStaticJSClass) is StaticJSClass? Function(), true);
+  expect(returnNullableStaticJSClass is StaticJSClass Function(),
+      hasUnsoundNullSafety);
+  expect(confuse(returnNullableStaticJSClass) is StaticJSClass Function(),
+      hasUnsoundNullSafety);
+
+  // static interop class A <: static interop class A
+  expect(returnStaticNativeClass is StaticNativeClass Function(), true);
+  expect(
+      confuse(returnStaticNativeClass) is StaticNativeClass Function(), true);
+  expect(returnStaticJSClass is StaticJSClass Function(), true);
+  expect(confuse(returnStaticJSClass) is StaticJSClass Function(), true);
+
+  // static interop class A <: static interop class B
+  expect(returnStaticNativeClass is StaticJSClass Function(), true);
+  expect(confuse(returnStaticNativeClass) is StaticJSClass Function(), true);
+  expect(returnStaticJSClass is StaticNativeClass Function(), true);
+  expect(confuse(returnStaticJSClass) is StaticNativeClass Function(), true);
+
+  // static interop class !<: native class
+  expect(returnStaticNativeClass is NativeClass Function(), false);
+  expect(confuse(returnStaticNativeClass) is NativeClass Function(), false);
+  expect(returnStaticJSClass is NativeClass Function(), false);
+  expect(confuse(returnStaticJSClass) is NativeClass Function(), false);
+
+  // static interop class !<: package:js class
+  expect(returnStaticNativeClass is JSClass Function(), false);
+  expect(confuse(returnStaticNativeClass) is JSClass Function(), false);
+  expect(returnStaticJSClass is JSClass Function(), false);
+  expect(confuse(returnStaticJSClass) is JSClass Function(), false);
+
+  // static interop class !<: anonymous class
+  expect(returnStaticNativeClass is AnonymousClass Function(), false);
+  expect(confuse(returnStaticNativeClass) is AnonymousClass Function(), false);
+  expect(returnStaticJSClass is AnonymousClass Function(), false);
+  expect(confuse(returnStaticJSClass) is AnonymousClass Function(), false);
+
+  // native class <: static interop class
+  expect(returnNativeClass is StaticJSClass Function(), true);
+  expect(confuse(returnNativeClass) is StaticJSClass Function(), true);
+  expect(returnNativeClass is StaticNativeClass Function(), true);
+  expect(confuse(returnNativeClass) is StaticNativeClass Function(), true);
+
+  // package:js class <: static interop class
+  // TODO(46456): The runtime check using `confuse` does not fail, whereas the
+  // compile-time check does on dart2js.
+  // expect(returnJSClass is StaticJSClass Function(), true);
+  expect(confuse(returnJSClass) is StaticJSClass Function(), true);
+  // TODO(46456): The runtime check using `confuse` does not fail, whereas the
+  // compile-time check does on dart2js.
+  // expect(returnJSClass is StaticNativeClass Function(), true);
+  expect(confuse(returnJSClass) is StaticNativeClass Function(), true);
+
+  // anonymous class <: static interop class
+  // TODO(46456): The runtime check using `confuse` does not fail, whereas the
+  // compile-time check does on dart2js.
+  // expect(returnAnonymousClass is StaticJSClass Function(), true);
+  expect(confuse(returnAnonymousClass) is StaticJSClass Function(), true);
+  // TODO(46456): The runtime check using `confuse` does not fail, whereas the
+  // compile-time check does on dart2js.
+  // expect(returnAnonymousClass is StaticNativeClass Function(), true);
+  expect(confuse(returnAnonymousClass) is StaticNativeClass Function(), true);
+}
diff --git a/tests/web/native/static_interop_erasure/use_erased_type_members_test.dart b/tests/web/native/static_interop_erasure/use_erased_type_members_test.dart
new file mode 100644
index 0000000..99c446d
--- /dev/null
+++ b/tests/web/native/static_interop_erasure/use_erased_type_members_test.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that a static interop class can be used in place of a Native class and
+// its static members work as expected post-erasure.
+
+@JS()
+library use_erased_type_members_test;
+
+import 'dart:_interceptors' show JavaScriptObject;
+
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart';
+
+import '../native_testing.dart';
+import '../native_testing.dart' as native_testing;
+
+NativeClass makeNativeClass() native;
+
+@Native('NativeClass')
+class NativeClass extends JavaScriptObject {
+  factory NativeClass() => makeNativeClass();
+}
+
+@JS()
+@staticInterop
+class Parent {}
+
+extension ParentExtension on Parent {
+  external String parentExternalField;
+  external String get parentExternalGetSet;
+  external set parentExternalGetSet(String val);
+  external String parentExternalMethod();
+
+  String get parentGetSet => this.parentExternalGetSet;
+  set parentGetSet(String val) => this.parentExternalGetSet = val;
+  String parentMethod() => 'parentMethod';
+}
+
+@JS()
+@staticInterop
+class Interface {}
+
+extension InterfaceExtension on Interface {
+  external String interfaceExternalField;
+  external String get interfaceExternalGetSet;
+  external set interfaceExternalGetSet(String val);
+  external String interfaceExternalMethod();
+
+  String get interfaceGetSet => this.interfaceExternalGetSet;
+  set interfaceGetSet(String val) => this.interfaceExternalGetSet = val;
+  String interfaceMethod() => 'interfaceMethod';
+}
+
+@JS('NativeClass')
+@staticInterop
+class StaticJSClass extends Parent implements Interface {
+  external StaticJSClass();
+  external StaticJSClass.namedConstructor();
+  external factory StaticJSClass.externalFactory();
+  factory StaticJSClass.redirectingFactory() = StaticJSClass;
+
+  external static String externalStaticField;
+  external static String get externalStaticGetSet;
+  external static set externalStaticGetSet(String val);
+  external static String externalStaticMethod();
+}
+
+extension StaticJSClassExtension on StaticJSClass {
+  external String externalField;
+  external String get externalGetSet;
+  external set externalGetSet(String val);
+  external String externalMethod();
+
+  String get getSet => this.externalGetSet;
+  set getSet(String val) => this.externalGetSet = val;
+  String method() => 'method';
+}
+
+void main() {
+  nativeTesting();
+  native_testing.JS('', r'''
+    (function(){
+      function NativeClass() {
+        this.externalField = 'externalField';
+        this.externalGetSet = this.externalField;
+        this.externalMethod = function() { return 'externalMethod'; };
+
+        this.parentExternalField = 'parentExternalField';
+        this.parentExternalGetSet = this.parentExternalField;
+        this.parentExternalMethod = function() {
+          return 'parentExternalMethod';
+        };
+
+        this.interfaceExternalField = 'interfaceExternalField';
+        this.interfaceExternalGetSet = this.interfaceExternalField;
+        this.interfaceExternalMethod = function() {
+          return 'interfaceExternalMethod';
+        };
+      }
+      NativeClass.externalStaticField = 'externalStaticField';
+      NativeClass.externalStaticGetSet = NativeClass.externalStaticField;
+      NativeClass.externalStaticMethod = function() {
+        return 'externalStaticMethod';
+      };
+      self.NativeClass = NativeClass;
+      self.makeNativeClass = function(){return new NativeClass()};
+      self.nativeConstructor(NativeClass);
+    })()
+  ''');
+  applyTestExtensions(['NativeClass']);
+
+  // NativeClass needs to be live, so it can be correctly intercepted.
+  NativeClass();
+  // Invoke constructors and ensure they're typed correctly.
+  StaticJSClass staticJs = StaticJSClass();
+  staticJs = StaticJSClass.namedConstructor();
+  staticJs = StaticJSClass.externalFactory();
+  staticJs = StaticJSClass.redirectingFactory();
+
+  // Invoke external static members.
+  expect(StaticJSClass.externalStaticField, 'externalStaticField');
+  StaticJSClass.externalStaticGetSet = 'externalStaticGetSet';
+  expect(StaticJSClass.externalStaticGetSet, 'externalStaticGetSet');
+  expect(StaticJSClass.externalStaticMethod(), 'externalStaticMethod');
+
+  // Use extension members.
+  expect(staticJs.externalField, 'externalField');
+  staticJs.externalGetSet = 'externalGetSet';
+  expect(staticJs.externalGetSet, 'externalGetSet');
+  expect(staticJs.externalMethod(), 'externalMethod');
+
+  staticJs.getSet = 'getSet';
+  expect(staticJs.getSet, 'getSet');
+  expect(staticJs.method(), 'method');
+
+  // Use parent extension members.
+  expect(staticJs.parentExternalField, 'parentExternalField');
+  staticJs.parentExternalGetSet = 'parentExternalGetSet';
+  expect(staticJs.parentExternalGetSet, 'parentExternalGetSet');
+  expect(staticJs.parentExternalMethod(), 'parentExternalMethod');
+
+  staticJs.parentGetSet = 'parentGetSet';
+  expect(staticJs.parentGetSet, 'parentGetSet');
+  expect(staticJs.parentMethod(), 'parentMethod');
+
+  // Use interface extension members.
+  expect(staticJs.interfaceExternalField, 'interfaceExternalField');
+  staticJs.interfaceExternalGetSet = 'interfaceExternalGetSet';
+  expect(staticJs.interfaceExternalGetSet, 'interfaceExternalGetSet');
+  expect(staticJs.interfaceExternalMethod(), 'interfaceExternalMethod');
+
+  staticJs.interfaceGetSet = 'interfaceGetSet';
+  expect(staticJs.interfaceGetSet, 'interfaceGetSet');
+  expect(staticJs.interfaceMethod(), 'interfaceMethod');
+}
diff --git a/tests/web_2/47691_test.dart b/tests/web_2/47691_test.dart
new file mode 100644
index 0000000..7de21ae
--- /dev/null
+++ b/tests/web_2/47691_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.7
+
+import 'package:expect/expect.dart';
+
+class LoadElements {
+  List call() => [];
+}
+
+class ViewModel {
+  ViewModel(this._loadElements);
+
+  final LoadElements _loadElements;
+
+  void init() {
+    final elements = _loadElements();
+    for (final element in elements) {
+      Expect.identical(element, element);
+    }
+  }
+}
+
+void main() {
+  ViewModel(LoadElements()).init();
+}
diff --git a/tests/web_2/dart2js_2.status b/tests/web_2/dart2js_2.status
index 9faa92a..826b784 100644
--- a/tests/web_2/dart2js_2.status
+++ b/tests/web_2/dart2js_2.status
@@ -24,12 +24,16 @@
 [ $compiler == dart2js && $runtime == chrome && $csp ]
 deferred/load_in_correct_order_test: SkipByDesign # Purposely uses `eval`
 
+[ $compiler == dart2js && $runtime == d8 ]
+internal/object_members_test: SkipByDesign # Browser test
+
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 consistent_index_error_string_test: Slow, Pass # Issue 25940
 
 [ $compiler == dart2js && $csp ]
 deferred_custom_loader_test: SkipByDesign # Issue 25683
 deferred_fail_and_retry_test: SkipByDesign # Uses eval to simulate failed loading.
+internal/object_members_test: SkipByDesign # Uses eval for interop
 
 [ $compiler == dart2js && !$host_checked ]
 dummy_compiler_test: Slow, Pass # Issue 32439. self-hosting doesn't work with CFE yet.
diff --git a/tests/web_2/dummy_compiler_test.dart b/tests/web_2/dummy_compiler_test.dart
deleted file mode 100644
index 1f66dca..0000000
--- a/tests/web_2/dummy_compiler_test.dart
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.7
-
-// Tests that the dart2js compiler can be run in a js engine.  This ensures that
-// the internal compiler APIs have no dependency on dart:io.
-library dummy_compiler;
-
-import 'dart:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/compiler.dart';
-
-import 'mock_libraries.dart';
-
-String libProvider(Uri uri) {
-  if (uri.path.endsWith(".platform")) {
-    return DEFAULT_PLATFORM_CONFIG;
-  }
-  if (uri.path.endsWith("/core.dart")) {
-    return buildLibrarySource(DEFAULT_CORE_LIBRARY);
-  } else if (uri.path.endsWith('core_patch.dart')) {
-    return DEFAULT_PATCH_CORE_SOURCE;
-  } else if (uri.path.endsWith('internal.dart')) {
-    return buildLibrarySource(DEFAULT_INTERNAL_LIBRARY);
-  } else if (uri.path.endsWith('interceptors.dart')) {
-    return buildLibrarySource(DEFAULT_INTERCEPTORS_LIBRARY);
-  } else if (uri.path.endsWith('js_helper.dart')) {
-    return buildLibrarySource(DEFAULT_JS_HELPER_LIBRARY);
-  } else if (uri.path.endsWith('/async.dart')) {
-    return buildLibrarySource(DEFAULT_ASYNC_LIBRARY);
-  } else {
-    return "library lib${uri.path.replaceAll('/', '.')};";
-  }
-}
-
-Future<String> provider(Uri uri) {
-  String source;
-  if (uri.scheme == "main") {
-    source = "main() {}";
-  } else if (uri.scheme == "lib") {
-    source = libProvider(uri);
-  } else {
-    throw "unexpected URI $uri";
-  }
-  return new Future.value(source);
-}
-
-void handler(Uri uri, int begin, int end, String message, Diagnostic kind) {
-  if (uri == null) {
-    print('$kind: $message');
-  } else {
-    print('$uri:$begin:$end: $kind: $message');
-  }
-}
-
-main() {
-  asyncStart();
-  Future<CompilationResult> result = compile(new Uri(scheme: 'main'),
-      new Uri(scheme: 'lib', path: '/'), provider, handler);
-  result.then((CompilationResult result) {
-    if (!result.isSuccess) {
-      throw 'Compilation failed';
-    }
-  }, onError: (e, s) {
-    throw 'Compilation failed: $e\n$s';
-  }).then(asyncSuccess);
-}
diff --git a/tests/web_2/internal/javascriptobject_extensions_test.dart b/tests/web_2/internal/javascriptobject_extensions_test.dart
index 6189667..dc912cd 100644
--- a/tests/web_2/internal/javascriptobject_extensions_test.dart
+++ b/tests/web_2/internal/javascriptobject_extensions_test.dart
@@ -11,9 +11,14 @@
 import 'package:js/js_util.dart';
 import 'package:expect/minitest.dart';
 
-import 'dart:typed_data';
+import 'dart:html' show Window;
+import 'dart:typed_data' show ByteBuffer;
 import 'dart:_interceptors'
-    show JavaScriptObject, UnknownJavaScriptObject, JSObject;
+    show
+        LegacyJavaScriptObject,
+        JavaScriptObject,
+        UnknownJavaScriptObject,
+        JSObject;
 
 @JS()
 external void eval(String code);
@@ -45,6 +50,11 @@
 @JS('arrayBuffer')
 external dynamic get arrayBufferDynamic;
 
+external Window get window;
+
+@JS('window')
+external dynamic get windowDynamic;
+
 // Extension on JavaScriptObject. In the future, when extension types are
 // introduced, this will be explicitly disallowed.
 extension JavaScriptObjectExtension on JavaScriptObject {
@@ -109,19 +119,33 @@
   expect(javaScriptObject is DartClass, false);
   runtimeIsAndAs<DartClass>(javaScriptObject, false);
 
-  // Native objects cannot be casted to or from JavaScriptObject.
+  // Web Native classes are subclasses of JavaScriptObject, but not
+  // LegacyJavaScriptObject.
+  expect(window is JavaScriptObject, true);
+  runtimeIsAndAs<JavaScriptObject>(window, true);
+  runtimeIsAndAs<JavaScriptObject>(windowDynamic, true);
+  javaScriptObject = jsObj as JavaScriptObject;
+  expect(javaScriptObject is Window, false);
+  runtimeIsAndAs<Window>(javaScriptObject, false);
+
+  expect(window is LegacyJavaScriptObject, false);
+  runtimeIsAndAs<LegacyJavaScriptObject>(window, false);
+  runtimeIsAndAs<LegacyJavaScriptObject>(windowDynamic, false);
+  var legacyJavaScriptObject = jsObj as LegacyJavaScriptObject;
+  expect(legacyJavaScriptObject is Window, false);
+  runtimeIsAndAs<Window>(legacyJavaScriptObject, false);
+
+  // Non-web Native classes like those in `dart:typed_data` are not subclasses
+  // of JavaScriptObject.
   expect(arrayBuffer is JavaScriptObject, false);
   runtimeIsAndAs<JavaScriptObject>(arrayBuffer, false);
+  runtimeIsAndAs<JavaScriptObject>(arrayBufferDynamic, false);
   expect(javaScriptObject is ByteBuffer, false);
   runtimeIsAndAs<ByteBuffer>(javaScriptObject, false);
 
-  // Dynamic native objects are intercepted and cannot be casted to
-  // JavaScriptObject.
-  runtimeIsAndAs<JavaScriptObject>(arrayBufferDynamic, false);
-
   // Make sure `Object` methods work with JavaScriptObject like they do with JS
   // interop objects.
-  expect(anonymousObj == javaScriptObject, true);
+  expect(javaScriptObject == jsObj, true);
   expect(javaScriptObject.hashCode, isNotNull);
   expect(javaScriptObject.toString, isNotNull);
   expect(javaScriptObject.noSuchMethod, isNotNull);
diff --git a/tests/web_2/internal/mock_libraries.dart b/tests/web_2/internal/mock_libraries.dart
deleted file mode 100644
index 9aa36ad..0000000
--- a/tests/web_2/internal/mock_libraries.dart
+++ /dev/null
@@ -1,417 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.7
-
-// Library for creating mock versions of platform and internal libraries.
-
-library mock_libraries;
-
-const DEFAULT_PLATFORM_CONFIG = """
-[libraries]
-core:core/core.dart
-async:async/async.dart
-_js_helper:_internal/js_runtime/lib/js_helper.dart
-_interceptors:_internal/js_runtime/lib/interceptors.dart
-_internal:internal/internal.dart
-""";
-
-String buildLibrarySource(Map<String, String> elementMap,
-    [Map<String, String> additionalElementMap = const <String, String>{}]) {
-  Map<String, String> map = new Map<String, String>.from(elementMap);
-  if (additionalElementMap != null) {
-    map.addAll(additionalElementMap);
-  }
-  StringBuffer sb = new StringBuffer();
-  map.values.forEach((String element) {
-    sb.write('$element\n');
-  });
-  return sb.toString();
-}
-
-const Map<String, String> DEFAULT_CORE_LIBRARY = const <String, String>{
-  '<imports>': '''
-import 'dart:_internal' as internal;
-''',
-  'bool': 'class bool {}',
-  'Comparator': 'abstract class Comparator<T> {}',
-  'DateTime': r'''
-      class DateTime {
-        DateTime(year);
-        DateTime.utc(year);
-      }''',
-  'Deprecated': r'''
-      class Deprecated extends Object {
-        final String expires;
-        const Deprecated(this.expires);
-      }''',
-  'deprecated': 'const Object deprecated = const Deprecated("next release");',
-  'double': r'''
-      abstract class double extends num {
-        static var nan = 0;
-        static parse(s) {}
-      }''',
-  'Function': r'''
-      class Function {
-        static apply(Function fn, List positional, [Map named]) => null;
-      }''',
-  'identical': 'bool identical(Object a, Object b) { return true; }',
-  'int': 'abstract class int extends num { }',
-  'Iterable': '''
-      abstract class Iterable<E> {
-          Iterator<E> get iterator => null;
-      }''',
-  'Iterator': '''
-      abstract class Iterator<E> {
-          E get current => null;
-      }''',
-  'LinkedHashMap': r'''
-      class LinkedHashMap<K, V> implements Map<K, V> {
-      }''',
-  'List': r'''
-      class List<E> extends Iterable<E> {
-        var length;
-        List([length]);
-        List.filled(length, element);
-        E get first => null;
-        E get last => null;
-        E get single => null;
-        E removeLast() => null;
-        E removeAt(i) => null;
-        E elementAt(i) => null;
-        E singleWhere(f) => null;
-      }''',
-  'Map': 'abstract class Map<K,V> {}',
-  'Null': 'class Null {}',
-  'num': r'''
-      abstract class num {
-        operator +(_);
-        operator *(_);
-        operator -();
-      }''',
-  'print': 'print(var obj) {}',
-  'proxy': 'const proxy = 0;',
-  'Object': r'''
-      class Object {
-        const Object();
-        operator ==(other) { return true; }
-        get hashCode => throw "Object.hashCode not implemented.";
-        String toString() { return null; }
-        noSuchMethod(im) { throw im; }
-      }''',
-  'StackTrace': 'abstract class StackTrace {}',
-  'String': 'class String implements Pattern {}',
-  'Symbol': '''
-      abstract class Symbol {
-        const factory Symbol(String name) = internal.Symbol;
-      }
-      ''',
-  'Type': 'class Type {}',
-  'Pattern': 'abstract class Pattern {}',
-  '_genericNoSuchMethod': '_genericNoSuchMethod(a,b,c,d,e) {}',
-  '_unresolvedConstructorError': '_unresolvedConstructorError(a,b,c,d,e) {}',
-  '_malformedTypeError': '_malformedTypeError(message) {}',
-};
-
-const Map<String, String> DEFAULT_INTERNAL_LIBRARY = const <String, String>{
-  '<imports>': '''
-import 'dart:core' as core;
-''',
-  'Symbol': '''
-class Symbol implements core.Symbol {
-  final core.String _name;
-
-  const Symbol(this._name);
-  Symbol.validated(this._name);
-}
-''',
-};
-
-const String DEFAULT_PATCH_CORE_SOURCE = r'''
-import 'dart:_js_helper';
-import 'dart:_interceptors';
-import 'dart:async';
-
-@patch
-class LinkedHashMap<K, V> {
-  factory LinkedHashMap._empty() => null;
-  factory LinkedHashMap._literal(elements) => null;
-  static _makeEmpty() => null;
-  static _makeLiteral(elements) => null;
-}
-''';
-
-const Map<String, String> DEFAULT_JS_HELPER_LIBRARY = const <String, String>{
-  'assertTest': 'assertTest(a) {}',
-  'assertThrow': 'assertThrow(a) {}',
-  'assertHelper': 'assertHelper(a) {}',
-  'assertUnreachable': 'assertUnreachable() {}',
-  'assertSubtype': 'assertSubtype(object, isField, checks, asField) {}',
-  'asyncHelper': 'asyncHelper(object, asyncBody, completer) {}',
-  'boolConversionCheck': 'boolConversionCheck(x) {}',
-  'checkSubtype': 'checkSubtype(object, isField, checks, asField) {}',
-  'BoundClosure': r'''abstract class BoundClosure extends Closure {
-    var self;
-    var target;
-    var receiver;
-  }''',
-  'buildFunctionType': r'''buildFunctionType(returnType, parameterTypes,
-                            optionalParameterTypes) {
-            return new RuntimeFunctionType();
-          }''',
-  'buildInterfaceType': '''buildInterfaceType(rti, typeArguments) {
-                             if (rti == null) return new RuntimeTypePlain();
-                             return new RuntimeTypeGeneric();
-                           }''',
-  'buildNamedFunctionType':
-      r'''buildNamedFunctionType(returnType, parameterTypes,
-                                 namedParameters) {
-            return new RuntimeFunctionType();
-          }''',
-  'checkFunctionSubtype':
-      r'''checkFunctionSubtype(var target, String signatureName,
-                               String contextName, var context,
-                               var typeArguments) {}''',
-  'checkMalformedType': 'checkMalformedType(value, message) {}',
-  'checkInt': 'checkInt(value) {}',
-  'checkNum': 'checkNum(value) {}',
-  'checkString': 'checkString(value) {}',
-  'Closure': 'abstract class Closure implements Function { }',
-  'closureFromTearOff':
-      r'''closureFromTearOff(receiver, functions, reflectionInfo,
-                             isStatic, jsArguments, name) {}''',
-  'computeSignature':
-      'computeSignature(var signature, var context, var contextName) {}',
-  'ConstantMap': 'class ConstantMap<K, V> {}',
-  'ConstantProtoMap': 'class ConstantProtoMap<K, V> {}',
-  'ConstantStringMap': 'class ConstantStringMap<K, V> {}',
-  'createInvocationMirror': 'createInvocationMirror(a0, a1, a2, a3, a4, a5) {}',
-  'createRuntimeType': 'createRuntimeType(a) {}',
-  'functionSubtypeCast':
-      r'''functionSubtypeCast(Object object, String signatureName,
-                              String contextName, var context) {}''',
-  'functionTypeTestMetaHelper': r'''
-      functionTypeTestMetaHelper() {
-        buildFunctionType(null, null, null);
-        buildNamedFunctionType(null, null, null);
-        buildInterfaceType(null, null);
-      }''',
-  'getFallThroughError': 'getFallThroughError() {}',
-  'getIsolateAffinityTag': 'getIsolateAffinityTag(_) {}',
-  'getRuntimeTypeArguments':
-      'getRuntimeTypeArguments(target, substitutionName) {}',
-  'getRuntimeTypeInfo': 'getRuntimeTypeInfo(a) {}',
-  'getTraceFromException': 'getTraceFromException(exception) {}',
-  'GeneralConstantMap': 'class GeneralConstantMap {}',
-  'iae': 'iae(x) { throw x; } ioore(x) { throw x; }',
-  'Instantiation1': 'class Instantiation1<T1> extends Closure {}',
-  'Instantiation2': 'class Instantiation2<T1,T2> extends Closure {}',
-  'Instantiation3': 'class Instantiation3<T1,T2,T3> extends Closure {}',
-  'interceptedTypeCast': 'interceptedTypeCast(value, property) {}',
-  'interceptedTypeCheck': 'interceptedTypeCheck(value, property) {}',
-  'isJsIndexable': 'isJsIndexable(a, b) {}',
-  'JavaScriptIndexingBehavior': 'abstract class JavaScriptIndexingBehavior {}',
-  'JSInvocationMirror': r'''
-  class JSInvocationMirror {
-    get typeArguments => null;
-  }''',
-  'makeLiteralMap': 'makeLiteralMap(List keyValuePairs) {}',
-  'Native': 'class Native {}',
-  '_Patch': 'class _Patch { final tag; const _Patch(this.tag); }',
-  'patch': 'const patch = const _Patch(null);',
-  'patch_full': 'const patch_full = const _Patch("full");',
-  'patch_lazy': 'const patch_lazy = const _Patch("lazy");',
-  'patch_startup': 'const patch_startup = const _Patch("startup");',
-  'requiresPreamble': 'requiresPreamble() {}',
-  'RuntimeFunctionType': 'class RuntimeFunctionType {}',
-  'RuntimeTypeGeneric': 'class RuntimeTypeGeneric {}',
-  'RuntimeTypePlain': 'class RuntimeTypePlain {}',
-  'S': 'S() {}',
-  'setRuntimeTypeInfo': 'setRuntimeTypeInfo(a, b) {}',
-  'subtypeOfRuntimeTypeCast': 'subtypeOfRuntimeTypeCast(object, type) {}',
-  'checkConcurrentModificationError':
-      'checkConcurrentModificationError(collection) {}',
-  'throwConcurrentModificationError':
-      'throwConcurrentModificationError(collection) {}',
-  'throwCyclicInit': 'throwCyclicInit(staticName) {}',
-  'throwExpression': 'throwExpression(e) {}',
-  'throwNoSuchMethod':
-      'throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}',
-  'throwUnsupportedError': 'throwUnsupportedError(message) {}',
-  'unwrapException': 'unwrapException(e) {}',
-  'voidTypeCheck': 'voidTypeCheck(value) {}',
-  'wrapException': 'wrapException(x) { return x; }',
-  'badMain': 'badMain() { throw "bad main"; }',
-  'missingMain': 'missingMain() { throw "missing main"; }',
-  'mainHasTooManyParameters': 'mainHasTooManyParameters() '
-      '{ throw "main has too many parameters"; }',
-};
-
-const Map<String, String> DEFAULT_FOREIGN_HELPER_LIBRARY =
-    const <String, String>{
-  'JS': r'''
-      dynamic JS(String typeDescription, String codeTemplate,
-        [var arg0, var arg1, var arg2, var arg3, var arg4, var arg5, var arg6,
-         var arg7, var arg8, var arg9, var arg10, var arg11]) {}''',
-};
-
-const Map<String, String> DEFAULT_INTERCEPTORS_LIBRARY = const <String, String>{
-  'findIndexForNativeSubclassType': 'findIndexForNativeSubclassType(type) {}',
-  'getDispatchProperty': 'getDispatchProperty(o) {}',
-  'getInterceptor': 'getInterceptor(x) {}',
-  'getNativeInterceptor': 'getNativeInterceptor(x) {}',
-  'initializeDispatchProperty': 'initializeDispatchProperty(f,p,i) {}',
-  'initializeDispatchPropertyCSP': 'initializeDispatchPropertyCSP(f,p,i) {}',
-  'Interceptor': r'''
-      class Interceptor {
-        toString() {}
-        bool operator==(other) => identical(this, other);
-        get hashCode => throw "Interceptor.hashCode not implemented.";
-        noSuchMethod(im) { throw im; }
-      }''',
-  'JSArray': r'''
-          class JSArray<E> extends Interceptor implements List<E>, JSIndexable {
-            JSArray();
-            factory JSArray.typed(a) => a;
-            var length;
-            operator[](index) => this[index];
-            operator[]=(index, value) { this[index] = value; }
-            add(value) { this[length] = value; }
-            insert(index, value) {}
-            E get first => this[0];
-            E get last => this[0];
-            E get single => this[0];
-            E removeLast() => this[0];
-            E removeAt(index) => this[0];
-            E elementAt(index) => this[0];
-            E singleWhere(f) => this[0];
-            Iterator<E> get iterator => null;
-          }''',
-  'JSBool': 'class JSBool extends Interceptor implements bool {}',
-  'JSDouble': 'class JSDouble extends JSNumber implements double {}',
-  'JSExtendableArray': 'class JSExtendableArray extends JSMutableArray {}',
-  'JSFixedArray': 'class JSFixedArray extends JSMutableArray {}',
-  'JSFunction':
-      'abstract class JSFunction extends Interceptor implements Function {}',
-  'JSIndexable': r'''
-      abstract class JSIndexable {
-        get length;
-        operator[](index);
-      }''',
-  'JSInt': r'''
-       class JSInt extends JSNumber implements int {
-         operator~() => this;
-       }''',
-  'JSMutableArray':
-      'class JSMutableArray extends JSArray implements JSMutableIndexable {}',
-  'JSUnmodifiableArray': 'class JSUnmodifiableArray extends JSArray {}',
-  'JSMutableIndexable':
-      'abstract class JSMutableIndexable extends JSIndexable {}',
-  'JSPositiveInt': 'class JSPositiveInt extends JSInt {}',
-  'JSNull': r'''
-      class JSNull extends Interceptor {
-        bool operator==(other) => identical(null, other);
-        get hashCode => throw "JSNull.hashCode not implemented.";
-        String toString() => 'Null';
-        Type get runtimeType => null;
-        noSuchMethod(x) => super.noSuchMethod(x);
-      }''',
-  'JSNumber': r'''
-      class JSNumber extends Interceptor implements num {
-        // All these methods return a number to please type inferencing.
-        operator-() => (this is JSInt) ? 42 : 42.2;
-        operator +(other) => (this is JSInt) ? 42 : 42.2;
-        operator -(other) => (this is JSInt) ? 42 : 42.2;
-        operator ~/(other) => _tdivFast(other);
-        operator /(other) => (this is JSInt) ? 42 : 42.2;
-        operator *(other) => (this is JSInt) ? 42 : 42.2;
-        operator %(other) => (this is JSInt) ? 42 : 42.2;
-        operator <<(other) => _shlPositive(other);
-        operator >>(other) {
-          return _shrBothPositive(other) + _shrReceiverPositive(other) +
-            _shrOtherPositive(other);
-        }
-        operator |(other) => 42;
-        operator &(other) => 42;
-        operator ^(other) => 42;
-
-        operator >(other) => !identical(this, other);
-        operator >=(other) => !identical(this, other);
-        operator <(other) => !identical(this, other);
-        operator <=(other) => !identical(this, other);
-        operator ==(other) => identical(this, other);
-        get hashCode => throw "JSNumber.hashCode not implemented.";
-
-        // We force side effects on _tdivFast to mimic the shortcomings of
-        // the effect analysis: because the `_tdivFast` implementation of
-        // the core library has calls that may not already be analyzed,
-        // the analysis will conclude that `_tdivFast` may have side
-        // effects.
-        _tdivFast(other) => new List()..length = 42;
-        _shlPositive(other) => 42;
-        _shrBothPositive(other) => 42;
-        _shrReceiverPositive(other) => 42;
-        _shrOtherPositive(other) => 42;
-
-        abs() => (this is JSInt) ? 42 : 42.2;
-        remainder(other) => (this is JSInt) ? 42 : 42.2;
-        truncate() => 42;
-      }''',
-  'JSString': r'''
-      class JSString extends Interceptor implements String, JSIndexable {
-        split(pattern) => [];
-        int get length => 42;
-        operator[](index) {}
-        toString() {}
-        operator+(other) => this;
-        codeUnitAt(index) => 42;
-      }''',
-  'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',
-  'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',
-  'ObjectInterceptor': 'class ObjectInterceptor {}',
-  'JavaScriptObject': 'class JavaScriptObject {}',
-  'PlainJavaScriptObject': 'class PlainJavaScriptObject {}',
-  'UnknownJavaScriptObject': 'class UnknownJavaScriptObject {}',
-  'JavaScriptFunction': 'class JavaScriptFunction {}',
-};
-
-const Map<String, String> DEFAULT_ASYNC_LIBRARY = const <String, String>{
-  'DeferredLibrary': 'class DeferredLibrary {}',
-  'Future': '''
-      class Future<T> {
-        Future.value([value]);
-      }
-      ''',
-  'Stream': 'class Stream<T> {}',
-  'Completer': 'class Completer<T> {}',
-  'StreamIterator': 'class StreamIterator<T> {}',
-};
-
-/// These members are only needed when async/await is used.
-const Map<String, String> ASYNC_AWAIT_LIBRARY = const <String, String>{
-  '_wrapJsFunctionForAsync': '_wrapJsFunctionForAsync(f) {}',
-  '_asyncHelper': '_asyncHelper(o, f, c) {}',
-  '_SyncStarIterable': 'class _SyncStarIterable {}',
-  '_IterationMarker': 'class _IterationMarker {}',
-  '_AsyncStarStreamController': 'class _AsyncStarStreamController {}',
-  '_asyncStarHelper': '_asyncStarHelper(x, y, z) {}',
-  '_streamOfController': '_streamOfController(x) {}',
-};
-
-const String DEFAULT_MIRRORS_SOURCE = r'''
-import 'dart:_js_mirrors' as js;
-class Comment {}
-class MirrorSystem {}
-class MirrorsUsed {
-  final targets;
-  const MirrorsUsed({this.targets});
-}
-void reflectType(Type t) => js.disableTreeShaking();
-''';
-
-const String DEFAULT_JS_MIRRORS_SOURCE = r'''
-disableTreeShaking(){}
-preserveMetadata(){}
-preserveLibraryNames(){}
-''';
diff --git a/tests/web_2/internal/object_members_test.dart b/tests/web_2/internal/object_members_test.dart
new file mode 100644
index 0000000..02092eb
--- /dev/null
+++ b/tests/web_2/internal/object_members_test.dart
@@ -0,0 +1,80 @@
+// 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.
+
+// Make sure `Object` methods work as expected with `dart:html` and interop
+// types. The expectations here aren't guarantees that they should work a
+// particular way, but rather a way to monitor regressions/changes.
+
+@JS()
+library object_members_test;
+
+import 'package:js/js.dart';
+import 'package:expect/minitest.dart';
+
+import 'dart:html';
+import 'dart:_interceptors' show JSObject;
+
+@JS()
+external void eval(String code);
+
+@JS()
+class JSClass {
+  external JSClass();
+}
+
+void main() {
+  eval(r'''
+    function JSClass() {}
+  ''');
+
+  // `dart:html` type.
+  var div = document.createElement('div');
+  expect(div == div, true);
+  expect(div == DomPointReadOnly(), false);
+  // Ensure that we get a random hash for each new instance. It should be
+  // improbable for this to fail across many runs if the hash is
+  // non-deterministic.
+  var hashCode = div.hashCode;
+  var attempts = 0;
+  var maxAttempts = 1000;
+  while (div.hashCode == hashCode && attempts < maxAttempts) {
+    div = document.createElement('div');
+    attempts++;
+  }
+  expect(attempts > 0 && attempts != maxAttempts, isTrue);
+  expect(div.toString, isNotNull);
+  expect(div.toString(), 'div');
+  expect(div.noSuchMethod, isNotNull);
+  var noSuchMethodErrorThrown = true;
+  try {
+    (div as dynamic).triggerNoSuchMethod();
+    noSuchMethodErrorThrown = false;
+  } catch (_) {}
+  expect(noSuchMethodErrorThrown, isTrue);
+  expect(div.runtimeType, DivElement);
+
+  // `toString` for `dart:html` types that do not have an overridden `toString`
+  // should look up the type through the proto.
+  expect(window.navigator.toString(), "Instance of 'Navigator'");
+
+  // Interop type.
+  var js = JSClass();
+  expect(js == js, true);
+  expect(js == JSClass(), false);
+  // TODO(srujzs): Modify this once interop has random hash codes.
+  hashCode = js.hashCode;
+  expect(hashCode, 0);
+  expect(hashCode, js.hashCode);
+  expect(js.toString, isNotNull);
+  // Should forward to underlying `toString` call.
+  expect(js.toString(), '[object Object]');
+  expect(js.noSuchMethod, isNotNull);
+  noSuchMethodErrorThrown = true;
+  try {
+    (js as dynamic).triggerNoSuchMethod();
+    noSuchMethodErrorThrown = false;
+  } catch (_) {}
+  expect(noSuchMethodErrorThrown, isTrue);
+  expect(js.runtimeType, JSObject);
+}
diff --git a/tests/web_2/internal/rti/js_interop_subtype_test.dart b/tests/web_2/internal/rti/js_interop_subtype_test.dart
index 66010da..ffcb31c 100644
--- a/tests/web_2/internal/rti/js_interop_subtype_test.dart
+++ b/tests/web_2/internal/rti/js_interop_subtype_test.dart
@@ -17,6 +17,6 @@
   eval(r'''
       function JSClass() {}
       ''');
-  Expect.type<JavaScriptObject>(JSClass());
-  Expect.type<List<JavaScriptObject>>(<JSClass>[]);
+  Expect.type<LegacyJavaScriptObject>(JSClass());
+  Expect.type<List<LegacyJavaScriptObject>>(<JSClass>[]);
 }
diff --git a/tests/web_2/native/error_safeToString_test.dart b/tests/web_2/native/error_safeToString_test.dart
index cc9acbc..c4d9df0 100644
--- a/tests/web_2/native/error_safeToString_test.dart
+++ b/tests/web_2/native/error_safeToString_test.dart
@@ -9,7 +9,7 @@
 import 'dart:_interceptors'
     show
         Interceptor,
-        JavaScriptObject,
+        LegacyJavaScriptObject,
         PlainJavaScriptObject,
         UnknownJavaScriptObject;
 
diff --git a/tests/web_2/native/jsobject_test.dart b/tests/web_2/native/jsobject_test.dart
index 5b8ed68..3631f85 100644
--- a/tests/web_2/native/jsobject_test.dart
+++ b/tests/web_2/native/jsobject_test.dart
@@ -10,7 +10,7 @@
     show
         JSObject, // The interface, which may be re-exported by a
         // js-interop library.
-        JavaScriptObject, //   The interceptor abstract class.
+        LegacyJavaScriptObject, //   The interceptor abstract class.
         PlainJavaScriptObject, //     The interceptor concrete class.
         UnknownJavaScriptObject, //     The interceptor concrete class.
         Interceptor;
@@ -49,21 +49,21 @@
 static_test() {
   var x = makeA();
   Expect.isTrue(x is JSObject);
-  Expect.isTrue(x is JavaScriptObject);
+  Expect.isTrue(x is LegacyJavaScriptObject);
   Expect.isTrue(x is PlainJavaScriptObject);
   Expect.isTrue(x is! UnknownJavaScriptObject);
   Expect.equals(JSObject, x.runtimeType);
 
   x = makeB();
   Expect.isTrue(x is JSObject);
-  Expect.isTrue(x is JavaScriptObject);
+  Expect.isTrue(x is LegacyJavaScriptObject);
   Expect.isTrue(x is! PlainJavaScriptObject);
   Expect.isTrue(x is UnknownJavaScriptObject);
   Expect.equals(JSObject, x.runtimeType);
 
   x = makeQ();
   Expect.isFalse(x is JSObject);
-  Expect.isFalse(x is JavaScriptObject);
+  Expect.isFalse(x is LegacyJavaScriptObject);
   Expect.isFalse(x is PlainJavaScriptObject);
   Expect.isFalse(x is UnknownJavaScriptObject);
   Expect.isFalse(x.runtimeType == JSObject);
@@ -73,27 +73,27 @@
 dynamic_test() {
   var x = makeA();
   var isJSObject = new Is<JSObject>().check;
-  var isJavaScriptObject = new Is<JavaScriptObject>().check;
+  var isLegacyJavaScriptObject = new Is<LegacyJavaScriptObject>().check;
   var isPlainJavaScriptObject = new Is<PlainJavaScriptObject>().check;
   var isUnknownJavaScriptObject = new Is<UnknownJavaScriptObject>().check;
   var isQ = new Is<Q>().check;
 
   Expect.isTrue(isJSObject(x));
-  Expect.isTrue(isJavaScriptObject(x));
+  Expect.isTrue(isLegacyJavaScriptObject(x));
   Expect.isTrue(isPlainJavaScriptObject(x));
   Expect.isTrue(!isUnknownJavaScriptObject(x));
   Expect.equals(JSObject, x.runtimeType);
 
   x = makeB();
   Expect.isTrue(isJSObject(x));
-  Expect.isTrue(isJavaScriptObject(x));
+  Expect.isTrue(isLegacyJavaScriptObject(x));
   Expect.isTrue(!isPlainJavaScriptObject(x));
   Expect.isTrue(isUnknownJavaScriptObject(x));
   Expect.equals(JSObject, x.runtimeType);
 
   x = makeQ();
   Expect.isFalse(isJSObject(x));
-  Expect.isFalse(isJavaScriptObject(x));
+  Expect.isFalse(isLegacyJavaScriptObject(x));
   Expect.isFalse(isPlainJavaScriptObject(x));
   Expect.isFalse(isUnknownJavaScriptObject(x));
   Expect.isTrue(isQ(x));
diff --git a/tests/web_2/native/static_interop_erasure/factory_stub_test.dart b/tests/web_2/native/static_interop_erasure/factory_stub_test.dart
new file mode 100644
index 0000000..8aba8f4
--- /dev/null
+++ b/tests/web_2/native/static_interop_erasure/factory_stub_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.7
+
+// Test that factory methods with bodies are stubbed correctly in static interop
+// type erasure.
+
+@JS()
+library factory_stub_test;
+
+import 'dart:_interceptors' show JavaScriptObject;
+
+import 'package:js/js.dart';
+
+import '../native_testing.dart';
+import '../native_testing.dart' as native_testing;
+
+NativeClass makeNativeClass() native;
+
+@Native('NativeClass')
+class NativeClass extends JavaScriptObject {
+  factory NativeClass() => makeNativeClass();
+}
+
+@JS('NativeClass')
+@staticInterop
+class StaticNativeClass {
+  external StaticNativeClass();
+  factory StaticNativeClass.redirectingFactory() = StaticNativeClass;
+  factory StaticNativeClass.simpleFactory() => StaticNativeClass();
+  factory StaticNativeClass.factoryWithParam(
+          StaticNativeClass staticNativeClass) =>
+      staticNativeClass;
+  // This and `StaticNativeClassCopy.nestedFactory` exist to ensure that we
+  // cover the case where invocations on factories are visible before their
+  // declarations in the AST. This will test whether we correctly create the
+  // stub even if we haven't visited the declaration yet.
+  factory StaticNativeClass.nestedFactory() {
+    StaticNativeClassCopy.nestedFactory();
+    return StaticNativeClass();
+  }
+}
+
+@JS('NativeClass')
+@staticInterop
+class StaticNativeClassCopy {
+  external StaticNativeClassCopy();
+  factory StaticNativeClassCopy.nestedFactory() {
+    StaticNativeClass.simpleFactory();
+    return StaticNativeClassCopy();
+  }
+}
+
+void main() {
+  nativeTesting();
+  native_testing.JS('', r'''
+    (function(){
+      function NativeClass() {}
+      self.NativeClass = NativeClass;
+      self.makeNativeClass = function(){return new NativeClass()};
+      self.nativeConstructor(NativeClass);
+    })()
+  ''');
+  applyTestExtensions(['NativeClass']);
+
+  // Make the Native class live.
+  NativeClass();
+  // Invoke factories and ensure they're typed correctly through assignment.
+  StaticNativeClass staticNativeClass = StaticNativeClass.redirectingFactory();
+  staticNativeClass = StaticNativeClass.simpleFactory();
+  staticNativeClass = StaticNativeClass.factoryWithParam(staticNativeClass);
+  staticNativeClass = StaticNativeClass.nestedFactory();
+}
diff --git a/tests/web_2/native/static_interop_erasure/type_test.dart b/tests/web_2/native/static_interop_erasure/type_test.dart
new file mode 100644
index 0000000..5d85ebb
--- /dev/null
+++ b/tests/web_2/native/static_interop_erasure/type_test.dart
@@ -0,0 +1,226 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.7
+
+// Test that the type and subtyping relationships between static interop,
+// non-static interop, and Native classes are well-formed.
+
+@JS()
+library type_test;
+
+import 'dart:_interceptors' show JavaScriptObject;
+
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart';
+
+import '../native_testing.dart';
+import '../native_testing.dart' as native_testing;
+
+NativeClass makeNativeClass() native;
+
+@Native('NativeClass')
+class NativeClass extends JavaScriptObject {
+  factory NativeClass() => makeNativeClass();
+}
+
+@JS('NativeClass')
+@staticInterop
+class StaticNativeClass {
+  external StaticNativeClass();
+}
+
+@JS()
+class JSClass {
+  external JSClass();
+}
+
+@JS('JSClass')
+@staticInterop
+class StaticJSClass {
+  external StaticJSClass();
+}
+
+@JS()
+@anonymous
+class AnonymousClass {
+  external factory();
+}
+
+@JS()
+@staticInterop
+class GenericStaticJSClass<T> {}
+
+NativeClass returnNativeClass() => throw '';
+
+StaticNativeClass returnStaticNativeClass() => throw '';
+
+JSClass returnJSClass() => throw '';
+
+StaticJSClass returnStaticJSClass() => throw '';
+
+AnonymousClass returnAnonymousClass() => throw '';
+
+GenericStaticJSClass<int> returnGenericStaticJSClassInt() => throw '';
+
+void main() {
+  nativeTesting();
+  native_testing.JS('', r'''
+    (function(){
+      function NativeClass() {}
+      self.NativeClass = NativeClass;
+      self.makeNativeClass = function(){return new NativeClass()};
+      self.nativeConstructor(NativeClass);
+      function JSClass() {}
+      self.JSClass = JSClass;
+    })()
+  ''');
+  applyTestExtensions(['NativeClass']);
+
+  var nativeClass = NativeClass();
+  var staticNativeClass = StaticNativeClass();
+  var jsClass = JSClass();
+  var staticJsClass = StaticJSClass();
+  var anonymousClass = AnonymousClass();
+
+  // Native objects can be interop'd with static interop classes.
+  expect(nativeClass is StaticNativeClass, true);
+  expect(confuse(nativeClass) is StaticNativeClass, true);
+  expect(() => nativeClass as StaticNativeClass, returnsNormally);
+
+  expect(staticNativeClass is NativeClass, true);
+  expect(confuse(staticNativeClass) is NativeClass, true);
+  expect(() => staticNativeClass as NativeClass, returnsNormally);
+
+  // Likewise, non-native JS objects can be interop'd with static interop
+  // classes as well.
+  expect(jsClass is StaticJSClass, true);
+  expect(confuse(jsClass) is StaticJSClass, true);
+  expect(() => jsClass as StaticJSClass, returnsNormally);
+
+  expect(staticJsClass is JSClass, true);
+  expect(confuse(staticJsClass) is JSClass, true);
+  expect(() => staticJsClass as JSClass, returnsNormally);
+
+  expect(anonymousClass is StaticJSClass, true);
+  expect(confuse(anonymousClass) is StaticJSClass, true);
+  expect(() => anonymousClass as StaticJSClass, returnsNormally);
+
+  expect(staticJsClass is AnonymousClass, true);
+  expect(confuse(staticJsClass) is AnonymousClass, true);
+  expect(() => staticJsClass as AnonymousClass, returnsNormally);
+
+  // With erasure, all static interop classes become the same type, so you can
+  // cast either interop or native objects to them regardless of the underlying
+  // class.
+  expect(staticNativeClass is StaticJSClass, true);
+  expect(confuse(staticNativeClass) is StaticJSClass, true);
+  expect(() => staticNativeClass as StaticJSClass, returnsNormally);
+
+  expect(staticJsClass is StaticNativeClass, true);
+  expect(confuse(staticJsClass) is StaticNativeClass, true);
+  expect(() => staticJsClass as StaticNativeClass, returnsNormally);
+
+  expect(nativeClass is StaticJSClass, true);
+  expect(confuse(nativeClass) is StaticJSClass, true);
+  expect(() => nativeClass as StaticJSClass, returnsNormally);
+
+  expect(jsClass is StaticNativeClass, true);
+  expect(confuse(jsClass) is StaticNativeClass, true);
+  expect(() => jsClass as StaticNativeClass, returnsNormally);
+
+  expect(anonymousClass is StaticNativeClass, true);
+  expect(confuse(anonymousClass) is StaticNativeClass, true);
+  expect(() => anonymousClass as StaticNativeClass, returnsNormally);
+
+  // You cannot, however, always cast from a static interop type to an interop
+  // type or a native type. That will depend on whether the object is an interop
+  // object or a native object.
+  expect(staticNativeClass is JSClass, false);
+  expect(confuse(staticNativeClass) is JSClass, false);
+  expect(() => staticNativeClass as JSClass, throws);
+
+  expect(staticNativeClass is AnonymousClass, false);
+  expect(confuse(staticNativeClass) is AnonymousClass, false);
+  expect(() => staticNativeClass as AnonymousClass, throws);
+
+  expect(staticJsClass is NativeClass, false);
+  expect(confuse(staticJsClass) is NativeClass, false);
+  expect(() => staticJsClass as NativeClass, throws);
+
+  // Subtyping rules.
+
+  // Note that erasure ignores all static class type parameters so this
+  // comparison becomes
+  // `JavaScriptObject Function() is JavaScriptObject Function()`. This behavior
+  // is similar to non-static interop classes.
+  expect(
+      returnGenericStaticJSClassInt is GenericStaticJSClass<String> Function(),
+      true);
+  expect(
+      confuse(returnGenericStaticJSClassInt) is GenericStaticJSClass<String>
+          Function(),
+      true);
+  expect(
+      () => returnGenericStaticJSClassInt as GenericStaticJSClass<String>
+          Function(),
+      returnsNormally);
+
+  // static interop class A <: static interop class A
+  expect(returnStaticNativeClass is StaticNativeClass Function(), true);
+  expect(
+      confuse(returnStaticNativeClass) is StaticNativeClass Function(), true);
+  expect(returnStaticJSClass is StaticJSClass Function(), true);
+  expect(confuse(returnStaticJSClass) is StaticJSClass Function(), true);
+
+  // static interop class A <: static interop class B
+  expect(returnStaticNativeClass is StaticJSClass Function(), true);
+  expect(confuse(returnStaticNativeClass) is StaticJSClass Function(), true);
+  expect(returnStaticJSClass is StaticNativeClass Function(), true);
+  expect(confuse(returnStaticJSClass) is StaticNativeClass Function(), true);
+
+  // static interop class !<: native class
+  expect(returnStaticNativeClass is NativeClass Function(), false);
+  expect(confuse(returnStaticNativeClass) is NativeClass Function(), false);
+  expect(returnStaticJSClass is NativeClass Function(), false);
+  expect(confuse(returnStaticJSClass) is NativeClass Function(), false);
+
+  // static interop class !<: package:js class
+  expect(returnStaticNativeClass is JSClass Function(), false);
+  expect(confuse(returnStaticNativeClass) is JSClass Function(), false);
+  expect(returnStaticJSClass is JSClass Function(), false);
+  expect(confuse(returnStaticJSClass) is JSClass Function(), false);
+
+  // static interop class !<: anonymous class
+  expect(returnStaticNativeClass is AnonymousClass Function(), false);
+  expect(confuse(returnStaticNativeClass) is AnonymousClass Function(), false);
+  expect(returnStaticJSClass is AnonymousClass Function(), false);
+  expect(confuse(returnStaticJSClass) is AnonymousClass Function(), false);
+
+  // native class <: static interop class
+  expect(returnNativeClass is StaticJSClass Function(), true);
+  expect(confuse(returnNativeClass) is StaticJSClass Function(), true);
+  expect(returnNativeClass is StaticNativeClass Function(), true);
+  expect(confuse(returnNativeClass) is StaticNativeClass Function(), true);
+
+  // package:js class <: static interop class
+  // TODO(46456): The runtime check using `confuse` does not fail, whereas the
+  // compile-time check does on dart2js.
+  // expect(returnJSClass is StaticJSClass Function(), true);
+  expect(confuse(returnJSClass) is StaticJSClass Function(), true);
+  // TODO(46456): The runtime check using `confuse` does not fail, whereas the
+  // compile-time check does on dart2js.
+  // expect(returnJSClass is StaticNativeClass Function(), true);
+  expect(confuse(returnJSClass) is StaticNativeClass Function(), true);
+
+  // anonymous class <: static interop class
+  // TODO(46456): The runtime check using `confuse` does not fail, whereas the
+  // compile-time check does on dart2js.
+  // expect(returnAnonymousClass is StaticJSClass Function(), true);
+  expect(confuse(returnAnonymousClass) is StaticJSClass Function(), true);
+  // TODO(46456): The runtime check using `confuse` does not fail, whereas the
+  // compile-time check does on dart2js.
+  // expect(returnAnonymousClass is StaticNativeClass Function(), true);
+  expect(confuse(returnAnonymousClass) is StaticNativeClass Function(), true);
+}
diff --git a/tests/web_2/native/static_interop_erasure/use_erased_type_members_test.dart b/tests/web_2/native/static_interop_erasure/use_erased_type_members_test.dart
new file mode 100644
index 0000000..22ad0c3
--- /dev/null
+++ b/tests/web_2/native/static_interop_erasure/use_erased_type_members_test.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.7
+
+// Test that a static interop class can be used in place of a Native class and
+// its static members work as expected post-erasure.
+
+@JS()
+library use_erased_type_members_test;
+
+import 'dart:_interceptors' show JavaScriptObject;
+
+import 'package:expect/minitest.dart';
+import 'package:js/js.dart';
+
+import '../native_testing.dart';
+import '../native_testing.dart' as native_testing;
+
+NativeClass makeNativeClass() native;
+
+@Native('NativeClass')
+class NativeClass extends JavaScriptObject {
+  factory NativeClass() => makeNativeClass();
+}
+
+@JS()
+@staticInterop
+class Parent {}
+
+extension ParentExtension on Parent {
+  external String get parentExternalGetSet;
+  external set parentExternalGetSet(String val);
+  external String parentExternalMethod();
+
+  String get parentGetSet => this.parentExternalGetSet;
+  set parentGetSet(String val) => this.parentExternalGetSet = val;
+  String parentMethod() => 'parentMethod';
+}
+
+@JS()
+@staticInterop
+class Interface {}
+
+extension InterfaceExtension on Interface {
+  external String get interfaceExternalGetSet;
+  external set interfaceExternalGetSet(String val);
+  external String interfaceExternalMethod();
+
+  String get interfaceGetSet => this.interfaceExternalGetSet;
+  set interfaceGetSet(String val) => this.interfaceExternalGetSet = val;
+  String interfaceMethod() => 'interfaceMethod';
+}
+
+@JS('NativeClass')
+@staticInterop
+class StaticJSClass extends Parent implements Interface {
+  external StaticJSClass();
+  external StaticJSClass.namedConstructor();
+  external factory StaticJSClass.externalFactory();
+  factory StaticJSClass.redirectingFactory() = StaticJSClass;
+
+  external static String get externalStaticGetSet;
+  external static set externalStaticGetSet(String val);
+  external static String externalStaticMethod();
+}
+
+extension StaticJSClassExtension on StaticJSClass {
+  external String get externalGetSet;
+  external set externalGetSet(String val);
+  external String externalMethod();
+
+  String get getSet => this.externalGetSet;
+  set getSet(String val) => this.externalGetSet = val;
+  String method() => 'method';
+}
+
+void main() {
+  nativeTesting();
+  native_testing.JS('', r'''
+    (function(){
+      function NativeClass() {
+        this.externalGetSet = '';
+        this.externalMethod = function() { return 'externalMethod'; };
+
+        this.parentExternalGetSet = '';
+        this.parentExternalMethod = function() {
+          return 'parentExternalMethod';
+        };
+
+        this.interfaceExternalGetSet = '';
+        this.interfaceExternalMethod = function() {
+          return 'interfaceExternalMethod';
+        };
+      }
+      NativeClass.externalStaticField = 'externalStaticField';
+      NativeClass.externalStaticGetSet = NativeClass.externalStaticField;
+      NativeClass.externalStaticMethod = function() {
+        return 'externalStaticMethod';
+      };
+      self.NativeClass = NativeClass;
+      self.makeNativeClass = function(){return new NativeClass()};
+      self.nativeConstructor(NativeClass);
+    })()
+  ''');
+  applyTestExtensions(['NativeClass']);
+
+  // NativeClass needs to be live, so it can be correctly intercepted.
+  NativeClass();
+  // Invoke constructors and ensure they're typed correctly.
+  StaticJSClass staticJs = StaticJSClass();
+  staticJs = StaticJSClass.namedConstructor();
+  staticJs = StaticJSClass.externalFactory();
+  staticJs = StaticJSClass.redirectingFactory();
+
+  // Invoke external static members.
+  StaticJSClass.externalStaticGetSet = 'externalStaticGetSet';
+  expect(StaticJSClass.externalStaticGetSet, 'externalStaticGetSet');
+  expect(StaticJSClass.externalStaticMethod(), 'externalStaticMethod');
+
+  // Use extension members.
+  staticJs.externalGetSet = 'externalGetSet';
+  expect(staticJs.externalGetSet, 'externalGetSet');
+  expect(staticJs.externalMethod(), 'externalMethod');
+
+  staticJs.getSet = 'getSet';
+  expect(staticJs.getSet, 'getSet');
+  expect(staticJs.method(), 'method');
+
+  // Use parent extension members.
+  staticJs.parentExternalGetSet = 'parentExternalGetSet';
+  expect(staticJs.parentExternalGetSet, 'parentExternalGetSet');
+  expect(staticJs.parentExternalMethod(), 'parentExternalMethod');
+
+  staticJs.parentGetSet = 'parentGetSet';
+  expect(staticJs.parentGetSet, 'parentGetSet');
+  expect(staticJs.parentMethod(), 'parentMethod');
+
+  // Use interface extension members.
+  staticJs.interfaceExternalGetSet = 'interfaceExternalGetSet';
+  expect(staticJs.interfaceExternalGetSet, 'interfaceExternalGetSet');
+  expect(staticJs.interfaceExternalMethod(), 'interfaceExternalMethod');
+
+  staticJs.interfaceGetSet = 'interfaceGetSet';
+  expect(staticJs.interfaceGetSet, 'interfaceGetSet');
+  expect(staticJs.interfaceMethod(), 'interfaceMethod');
+}
diff --git a/tools/VERSION b/tools/VERSION
index 6ac463f..b022ca2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL stable
 MAJOR 2
-MINOR 15
-PATCH 1
+MINOR 16
+PATCH 0
 PRERELEASE 0
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 5bd718b..58f136d 100755
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -227,7 +227,6 @@
                local_path,
                remote_path,
                recursive=False,
-               public=False,
                multithread=False):
         assert remote_path.startswith('gs://')
 
@@ -235,8 +234,6 @@
             args = ['-m', 'cp']
         else:
             args = ['cp']
-        if public:
-            args += ['-a', 'public-read']
         if recursive:
             args += ['-R']
         args += [local_path, remote_path]
diff --git a/tools/bots/dart_sdk.py b/tools/bots/dart_sdk.py
index 0451f7b..934906f 100755
--- a/tools/bots/dart_sdk.py
+++ b/tools/bots/dart_sdk.py
@@ -79,7 +79,7 @@
 def CreateUploadAPIDocs():
     dartdoc_dir = BuildRootPath('gen-dartdocs')
     dartdoc_zip = BuildRootPath('dartdocs-api.zip')
-    if CHANNEL == bot_utils.Channel.TRY:
+    if CHANNEL == bot_utils.Channel.TRY or DART_EXPERIMENTAL_BUILD == '1':
         BuildDartdocAPIDocs(dartdoc_dir)
     else:
         UploadApiLatestFile()
@@ -117,7 +117,6 @@
         dir_name,
         dartdocs_destination_gcsdir,
         recursive=True,
-        public=True,
         multithread=True)
 
 
@@ -185,7 +184,7 @@
 
 def DartArchiveFile(local_path, remote_path, checksum_files=False):
     gsutil = bot_utils.GSUtil()
-    gsutil.upload(local_path, remote_path, public=True)
+    gsutil.upload(local_path, remote_path)
     if checksum_files:
         # 'local_path' may have a different filename than 'remote_path'. So we need
         # to make sure the *.md5sum file contains the correct name.
@@ -194,10 +193,10 @@
         mangled_filename = remote_path[remote_path.rfind('/') + 1:]
         local_md5sum = bot_utils.CreateMD5ChecksumFile(local_path,
                                                        mangled_filename)
-        gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True)
+        gsutil.upload(local_md5sum, remote_path + '.md5sum')
         local_sha256 = bot_utils.CreateSha256ChecksumFile(
             local_path, mangled_filename)
-        gsutil.upload(local_sha256, remote_path + '.sha256sum', public=True)
+        gsutil.upload(local_sha256, remote_path + '.sha256sum')
 
 
 def Run(command, env=None):
@@ -223,12 +222,13 @@
 
     BUILD_OS = utils.GuessOS()
     BUILDER_NAME = os.environ.get('BUILDBOT_BUILDERNAME')
+    DART_EXPERIMENTAL_BUILD = os.environ.get('DART_EXPERIMENTAL_BUILD')
     CHANNEL = bot_utils.GetChannelFromName(BUILDER_NAME)
 
     if command == 'api_docs':
         if BUILD_OS == 'linux':
             CreateUploadAPIDocs()
-    elif CHANNEL != bot_utils.Channel.TRY:
+    elif CHANNEL != bot_utils.Channel.TRY and DART_EXPERIMENTAL_BUILD != '1':
         for arch in archs:
             print('Create and upload sdk zip for ' + arch)
             sdk_path = BuildRootPath('dart-sdk', arch=arch)
diff --git a/tools/bots/flutter/analyze_flutter_flutter.sh b/tools/bots/flutter/analyze_flutter_flutter.sh
index d040021..fbfb264 100755
--- a/tools/bots/flutter/analyze_flutter_flutter.sh
+++ b/tools/bots/flutter/analyze_flutter_flutter.sh
@@ -36,9 +36,7 @@
 $dart --enable-asserts dev/bots/analyze.dart --dart-sdk $sdk
 
 # Test flutter's use of data-driven fixes.
-pushd packages/flutter/test_fixes
-../../../bin/dart fix --compare-to-golden
-popd
+$dart fix packages/flutter/test_fixes --compare-to-golden
 
 # Analyze the sample code in dartdoc snippets.
-./bin/dart dev/bots/analyze_sample_code.dart
+PUB_CACHE=$checkout/.pub_cache $dart dev/bots/analyze_sample_code.dart
diff --git a/tools/bots/flutter/analyze_flutter_gallery.sh b/tools/bots/flutter/analyze_flutter_gallery.sh
new file mode 100755
index 0000000..38dd5f7
--- /dev/null
+++ b/tools/bots/flutter/analyze_flutter_gallery.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyze Dart code in the flutter/gallery repo.
+
+set -ex
+
+checkout=$(pwd)
+dart=$checkout/out/ReleaseX64/dart-sdk/bin/dart
+sdk=$checkout/out/ReleaseX64/dart-sdk
+tmpdir=$(mktemp -d)
+cleanup() {
+  rm -rf "$tmpdir"
+}
+trap cleanup EXIT HUP INT QUIT TERM PIPE
+cd "$tmpdir"
+
+# install flutter
+git clone --single-branch -vv https://github.com/flutter/flutter
+export PATH="$PATH":"$tmpdir/flutter/bin"
+flutter --version
+
+git clone --single-branch -vv \
+  https://dart.googlesource.com/external/github.com/flutter/gallery
+
+cd gallery
+
+# analyze
+echo Analyzing...
+
+flutter packages get
+$dart analyze --fatal-infos
diff --git a/tools/bots/flutter/compile_flutter.sh b/tools/bots/flutter/compile_flutter.sh
index 511855c..35d271f 100755
--- a/tools/bots/flutter/compile_flutter.sh
+++ b/tools/bots/flutter/compile_flutter.sh
@@ -73,6 +73,7 @@
 pushd src
 git clone --single-branch --depth=1 -vv \
     https://dart.googlesource.com/external/github.com/flutter/engine flutter
+mkdir -p third_party
 pushd third_party
 ln -s $checkout dart
 popd  # third_party
diff --git a/tools/bots/get_builder_status.dart b/tools/bots/get_builder_status.dart
index d66167f..6abf4ef 100755
--- a/tools/bots/get_builder_status.dart
+++ b/tools/bots/get_builder_status.dart
@@ -8,8 +8,6 @@
 // These cloud functions write a success/failure result to the
 // builder table based on the approvals in Firestore.
 
-// @dart = 2.9
-
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
@@ -20,27 +18,26 @@
 const numAttempts = 20;
 const failuresPerConfiguration = 20;
 
-/*late*/ bool useStagingDatabase;
+late bool useStagingDatabase;
 
 Uri get _queryUrl {
-  var project = useStagingDatabase ? 'dart-ci-staging' : 'dart-ci';
+  final project = useStagingDatabase ? 'dart-ci-staging' : 'dart-ci';
   return Uri.https('firestore.googleapis.com',
       '/v1/projects/$project/databases/(default)/documents:runQuery');
 }
 
-/*late*/ String builder;
-/*late*/ String builderBase;
-/*late*/ int buildNumber;
-/*late*/ String token;
-/*late*/ http.Client client;
+late String builder;
+late String builderBase;
+late int buildNumber;
+late String token;
+late http.Client client;
 
 String get buildTable => builder.endsWith('-try') ? 'try_builds' : 'builds';
 String get resultsTable => builder.endsWith('-try') ? 'try_results' : 'results';
 
 bool booleanFieldOrFalse(Map<String, dynamic> document, String field) {
-  Map<String, dynamic> fieldObject = document['fields'][field];
-  if (fieldObject == null) return false;
-  return fieldObject['booleanValue'] ?? false;
+  final fieldObject = document['fields'][field];
+  return fieldObject?['booleanValue'] ?? false;
 }
 
 void usage(ArgParser parser) {
@@ -56,12 +53,12 @@
 }
 
 Future<String> readGcloudAuthToken(String path) async {
-  String token = await File(path).readAsString();
-  return token.split("\n").first;
+  final token = await File(path).readAsString();
+  return token.split('\n').first;
 }
 
-main(List<String> args) async {
-  final parser = new ArgParser();
+void main(List<String> args) async {
+  final parser = ArgParser();
   parser.addFlag('help', help: 'Show the program usage.', negatable: false);
   parser.addOption('auth_token',
       abbr: 'a', help: 'Authorization token with cloud-platform scope');
@@ -75,9 +72,9 @@
     usage(parser);
   }
 
-  useStagingDatabase = options['staging'] /*!*/;
-  builder = options['builder'] /*!*/;
-  buildNumber = int.parse(options['build_number'] /*!*/);
+  useStagingDatabase = options['staging'];
+  builder = options['builder'];
+  buildNumber = int.parse(options['build_number']);
   builderBase = builder.replaceFirst(RegExp('-try\$'), '');
   if (options['auth_token'] == null) {
     print('Option "--auth_token (-a)" is required\n');
@@ -85,83 +82,60 @@
   }
   token = await readGcloudAuthToken(options['auth_token']);
   client = http.Client();
-  for (int count = 0; count < numAttempts; ++count) {
-    if (count > 0) {
-      await Future.delayed(Duration(seconds: 10));
-    }
-    final response = await runFirestoreQuery(buildQuery());
-    if (response.statusCode == HttpStatus.ok) {
-      final documents = jsonDecode(response.body);
-      final document = documents.first['document'];
-      if (document != null) {
-        bool success = booleanFieldOrFalse(document, 'success');
-        bool completed = booleanFieldOrFalse(document, 'completed');
-        if (completed) {
-          print(success
-              ? 'No new unapproved failures'
-              : 'There are new unapproved failures on this build');
-          if (builder.endsWith('-try')) exit(success ? 0 : 1);
-          final configurations = await getConfigurations();
-          final failures = await fetchActiveFailures(configurations);
-          if (failures.isNotEmpty) {
-            print('There are unapproved failures');
-            printActiveFailures(failures);
-            exit(1);
-          } else {
-            print('There are no unapproved failures');
-            exit(0);
-          }
-        }
-        String chunks =
-            (document['fields']['num_chunks'] ?? const {})['integerValue'];
-        String processedChunks = (document['fields']['processed_chunks'] ??
-            const {})['integerValue'];
-        if (processedChunks != null) {
-          print([
-            'Received',
-            processedChunks,
-            if (chunks != null) ...['out of', chunks],
-            'chunks.'
-          ].join(' '));
-        }
-      } else {
-        print('No results received for build $buildNumber of $builder');
-      }
-    } else {
-      print('HTTP status ${response.statusCode} received '
-          'when fetching build data');
-    }
+  final response = await runFirestoreQuery(buildQuery());
+  if (response.statusCode != HttpStatus.ok) {
+    print('HTTP status ${response.statusCode} received '
+        'when fetching build data');
+    exit(2);
   }
-  print('No status received for build $buildNumber of $builder '
-      'after $numAttempts attempts, with 10 second waits.');
-  exit(2);
+  final documents = jsonDecode(response.body);
+  final document = documents.first['document'];
+  if (document == null) {
+    print('No results received for build $buildNumber of $builder');
+    exit(2);
+  }
+  final success = booleanFieldOrFalse(document, 'success');
+  print(success
+      ? 'No new unapproved failures'
+      : 'There are new unapproved failures on this build');
+  if (builder.endsWith('-try')) exit(success ? 0 : 1);
+  final configurations = await getConfigurations();
+  final failures = await fetchActiveFailures(configurations);
+  if (failures.isNotEmpty) {
+    print('There are unapproved failures');
+    printActiveFailures(failures);
+    exit(1);
+  } else {
+    print('There are no unapproved failures');
+    exit(0);
+  }
 }
 
 Future<List<String>> getConfigurations() async {
   final response = await runFirestoreQuery(configurationsQuery());
-  if (response.statusCode == HttpStatus.ok) {
-    final documents = jsonDecode(response.body);
-    final groups = <String /*!*/ >{
-      for (Map document in documents)
-        if (document.containsKey('document'))
-          document['document']['name'].split('/').last
-    };
-    return groups.toList();
+  if (response.statusCode != HttpStatus.ok) {
+    print('Could not fetch configurations for $builderBase');
+    return [];
   }
-  print('Could not fetch configurations for $builderBase');
-  return [];
+  final documents = jsonDecode(response.body);
+  final groups = <String>{
+    for (Map document in documents)
+      if (document.containsKey('document'))
+        document['document']['name'].split('/').last
+  };
+  return groups.toList();
 }
 
 Map<int, Future<String>> commitHashes = {};
 Future<String> commitHash(int index) =>
     commitHashes.putIfAbsent(index, () => fetchCommitHash(index));
 
-Future<String /*!*/ > fetchCommitHash(int index) async {
+Future<String> fetchCommitHash(int index) async {
   final response = await runFirestoreQuery(commitQuery(index));
   if (response.statusCode == HttpStatus.ok) {
     final document = jsonDecode(response.body).first['document'];
     if (document != null) {
-      return document['name'] /*!*/ .split('/').last;
+      return document['name'].split('/').last;
     }
   }
   print('Could not fetch commit with index $index');
@@ -169,7 +143,7 @@
 }
 
 Future<Map<String, List<Map<String, dynamic>>>> fetchActiveFailures(
-    List<String /*!*/ > configurations) async {
+    List<String> configurations) async {
   final failures = <String, List<Map<String, dynamic>>>{};
   for (final configuration in configurations) {
     final response =
@@ -197,9 +171,9 @@
 }
 
 void printActiveFailures(Map<String, List<Map<String, dynamic>>> failures) {
-  for (final configuration in failures.keys) {
+  failures.forEach((configuration, failureList) {
     print('($configuration):');
-    for (final failure in failures[configuration]) {
+    for (final failure in failureList) {
       print([
         '    ',
         failure['name'],
@@ -217,7 +191,7 @@
         ]
       ].join(''));
     }
-  }
+  });
 }
 
 Future<http.Response> runFirestoreQuery(String query) {
diff --git a/tools/bots/post_results_to_pubsub.dart b/tools/bots/post_results_to_pubsub.dart
deleted file mode 100644
index 774dec9..0000000
--- a/tools/bots/post_results_to_pubsub.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Post results from Dart tryjobs and CI builders to Cloud Pub/Sub.
-//
-// Reads a results.json input file, sends only the changed results from
-// that file to the Pub/Sub channel 'results' in the 'dart-ci' project.
-// Multiple messages are sent if there are more than 100 changed results,
-// so the cloud function only needs to process 100 records within its time
-// limit of 60s. Because of this, we never approach the limit of 10 MB
-// base64-encoded data bytes per message.
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:http/http.dart' as http;
-
-void usage(ArgParser parser, {exitCode = 0}) {
-  print('''
-Usage: post_results_to_pubsub.dart [OPTIONS]
-Posts Dart CI results as messages to Google Cloud Pub/Sub
-
-The options are as follows:
-
-${parser.usage}''');
-  exit(exitCode);
-}
-
-const resultsPerMessage = 50;
-
-Uri _postUrl(String project) => Uri.https(
-    'pubsub.googleapis.com', 'v1/projects/$project/topics/results:publish');
-
-main(List<String> args) async {
-  final parser = new ArgParser();
-  parser.addFlag('help', help: 'Show the program usage.', negatable: false);
-  parser.addOption('auth_token',
-      abbr: 'a',
-      help: 'Authorization token with a scope including pubsub publish.');
-  parser.addOption('result_file',
-      abbr: 'f', help: 'File containing the results to send');
-  parser.addOption('id', abbr: 'i', help: 'Buildbucket ID of this build');
-  parser.addOption('base_revision', help: 'A try build\'s patch base');
-  parser.addFlag('staging',
-      abbr: 's', help: 'Publish to the staging system', defaultsTo: false);
-
-  final options = parser.parse(args);
-  if (options['help']) {
-    usage(parser);
-  }
-
-  if (options['result_file'] == null) {
-    print('Error: option "result_file" is required.\n');
-    usage(parser, exitCode: 1);
-  }
-
-  if (options['auth_token'] == null) {
-    print('Error: option "auth_token" is required.\n');
-    usage(parser, exitCode: 1);
-  }
-
-  final project = options['staging'] ? "dart-ci-staging" : "dart-ci";
-
-  final client = http.Client();
-
-  final lines = await File(options['result_file']).readAsLines();
-  final token = await File(options['auth_token']).readAsString();
-  final buildbucketID = options['id'];
-  final baseRevision = options['base_revision'];
-  if (lines.isEmpty) {
-    print('No results in input file');
-    return;
-  }
-
-  // TODO(karlklose): parse and validate data before sending it.
-
-  final changedPattern = '"changed":true';
-  List<String> changedResults =
-      lines.where((change) => change.contains(changedPattern)).toList();
-  // We need to send at least one result, to save build metadata to Firestore.
-  // Send an unchanged result - the cloud function filters these out.
-  if (changedResults.isEmpty) changedResults = lines.sublist(0, 1);
-
-  final chunks = <List<String>>[];
-  var position = 0;
-  final lastFullChunkStart = changedResults.length - resultsPerMessage;
-  while (position <= lastFullChunkStart) {
-    chunks.add(changedResults.sublist(position, position += resultsPerMessage));
-  }
-  if (position < changedResults.length)
-    chunks.add(changedResults.sublist(position));
-
-  // Send pubsub messages.
-  for (final chunk in chunks) {
-    // Space messages out to reduce scaling problems
-    const chunkDelay = Duration(seconds: 2);
-    if (chunk != chunks.first) {
-      await Future.delayed(chunkDelay);
-    }
-    final message = '[\n${chunk.join(",\n")}\n]';
-    final base64data = base64Encode(utf8.encode(message.toString()));
-    final attributes = {
-      if (chunk == chunks.last) 'num_chunks': chunks.length.toString(),
-      if (buildbucketID != null) 'buildbucket_id': buildbucketID,
-      if (baseRevision != null) 'base_revision': baseRevision,
-    };
-    final jsonMessage = jsonEncode({
-      'messages': [
-        {'attributes': attributes, 'data': base64data}
-      ]
-    });
-    final headers = {'Authorization': 'Bearer $token'};
-    final postUrl = _postUrl(project);
-    final response =
-        await client.post(postUrl, headers: headers, body: jsonMessage);
-
-    print('Sent pubsub message containing ${chunk.length} results');
-    print('Status ${response.statusCode}');
-    print('Response: ${response.body}');
-  }
-  print('Number of Pub/Sub messages sent: ${chunks.length}');
-  client.close();
-}
diff --git a/tools/bots/pub_integration_test.py b/tools/bots/pub_integration_test.py
index 371ed1a..f80c554 100755
--- a/tools/bots/pub_integration_test.py
+++ b/tools/bots/pub_integration_test.py
@@ -31,7 +31,7 @@
 
     (options, args) = parser.parse_args()
 
-    arch = 'XARM64' if options.arch == 'arm64' else 'X64'
+    arch = 'ARM64' if options.arch == 'arm64' else 'X64'
     mode = ('Debug' if options.mode == 'debug' else 'Release')
 
     out_dir = 'xcodebuild' if sys.platform == 'darwin' else 'out'
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index a960fa8..ed2057e 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -424,6 +424,17 @@
         "use-sdk": true
       }
     },
+    "web-unittest-asserts-legacy-(linux|mac|win)": {
+      "options": {
+        "builder-tag": "web-legacy",
+        "compiler": "dartk",
+        "enable-asserts": true,
+        "mode": "release",
+        "runtime": "vm",
+        "timeout": 240,
+        "use-sdk": true
+      }
+    },
     "unittest-asserts-(debug|product|release)-(linux|mac|win)": {
       "options": {
         "compiler": "dartk",
@@ -533,10 +544,7 @@
     },
     "dart2js-(linux|mac|win)-chrome": {
       "options": {
-        "use-sdk": true,
-        "dart2js-options": [
-          "--canary"
-        ]
+        "use-sdk": true
       }
     },
     "dart2js-(linux|mac|win)-chrome-unsound": {
@@ -680,10 +688,20 @@
         ]
       }
     },
-    "dart2js-modern-(linux|mac|win)-d8": {
+    "dart2js-canary-(linux|mac|win)-d8": {
       "options": {
-        "builder-tag": "dart2js_modern",
-        "use-sdk": true,
+        "builder-tag": "dart2js_canary",
+        "host-checked": true,
+        "timeout": 240,
+        "dart2js-options": [
+          "--canary"
+        ]
+      }
+    },
+    "dart2js-canary-(linux|mac|win)-chrome": {
+      "options": {
+        "host-checked": true,
+        "timeout": 240,
         "dart2js-options": [
           "--canary"
         ]
@@ -782,7 +800,8 @@
     },
     "dartkp-linux-(debug|product|release)-simarm-crossword": {
       "options": {
-        "builder-tag": "crossword"
+        "builder-tag": "crossword",
+        "use-elf": true
       }
     },
     "dartkp-weak-asserts-linux-(debug|product|release)-simarm-crossword": {
@@ -826,21 +845,6 @@
         "vm-options": []
       }
     },
-    "dartkp-no-bare-(linux|mac|win)-(debug|product|release)-(x64|x64c)": {
-      "options": {
-        "vm-options": [
-          "--no-use-bare-instructions"
-        ]
-      }
-    },
-    "dartkp-no-bare-(linux|mac|win)-(debug|product|release)-(simarm|simarm64|simarm64c)": {
-      "options": {
-        "vm-options": [
-          "--no-use-bare-instructions"
-        ],
-        "use-elf": true
-      }
-    },
     "dartk-(linux|mac|win)-(debug|product|release)-(ia32|x64|x64c)": {},
     "dartk-fuchsia-(debug|product|release)-(x64|x64c)": {},
     "dartk-linux-debug-(ia32|x64)-canary": {
@@ -1548,36 +1552,6 @@
     },
     {
       "builders": [
-        "vm-kernel-precomp-bare-linux-release-x64",
-        "vm-kernel-precomp-bare-linux-release-x64c",
-        "vm-kernel-precomp-bare-linux-release-simarm",
-        "vm-kernel-precomp-bare-linux-release-simarm64",
-        "vm-kernel-precomp-bare-linux-release-simarm64c"
-      ],
-      "meta": {
-        "description": "This configuration is used by the vm kernel precomp builders using bare instructions."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": [
-            "runtime",
-            "dart_precompiled_runtime"
-          ]
-        },
-        {
-          "name": "vm tests",
-          "arguments": [
-            "-ndartkp-no-bare-${system}-${mode}-${arch}"
-          ],
-          "fileset": "vm-kernel",
-          "shards": 10
-        }
-      ]
-    },
-    {
-      "builders": [
         "vm-kernel-precomp-obfuscate-linux-release-x64",
         "vm-kernel-precomp-obfuscate-linux-release-x64c"
       ],
@@ -2432,6 +2406,62 @@
     },
     {
       "builders": [
+        "dart2js-canary-x64"
+      ],
+      "meta": {
+        "description": "dart2js canary tests."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "create_sdk",
+            "dart2js_bot"
+          ]
+        },
+        {
+          "name": "dart2js canary d8 tests",
+          "arguments": [
+            "-ndart2js-canary-linux-d8",
+            "language",
+            "corelib",
+            "web"
+          ],
+          "shards": 6,
+          "fileset": "web_platform_hostasserts_nnbd"
+        },
+        {
+          "name": "dart2js canary chrome tests",
+          "arguments": [
+            "-ndart2js-canary-linux-chrome",
+            "web"
+          ],
+          "shards": 3,
+          "fileset": "web_platform_hostasserts_nnbd"
+        },
+        {
+          "name": "dart2js canary lib tests",
+          "arguments": [
+            "-ndart2js-canary-linux-chrome",
+            "lib"
+          ],
+          "shards": 3,
+          "fileset": "web_platform_hostasserts_nnbd"
+        },
+        {
+          "name": "dart2js canary co19 tests",
+          "arguments": [
+            "-ndart2js-canary-linux-chrome",
+            "co19"
+          ],
+          "shards": 6,
+          "fileset": "web_platform_hostasserts_nnbd"
+        }
+      ]
+    },
+    {
+      "builders": [
         "dart2js-unit-linux-x64-release"
       ],
       "meta": {
@@ -2446,6 +2476,17 @@
           ]
         },
         {
+          "name": "dart2js legacy modular tests",
+          "script": "out/ReleaseX64/dart-sdk/bin/dart",
+          "testRunner": true,
+          "arguments": [
+            "pkg/compiler/tool/modular_test_suite_legacy.dart",
+            "-nweb-unittest-asserts-legacy-linux",
+            "--verbose",
+            "--use-sdk"
+          ]
+        },
+        {
           "name": "dart2js modular tests",
           "script": "out/ReleaseX64/dart-sdk/bin/dart",
           "testRunner": true,
@@ -2667,13 +2708,6 @@
           ]
         },
         {
-          "name": "dart2js --canary smoke tests",
-          "arguments": [
-            "-ndart2js-modern-linux-d8",
-            "web_2"
-          ]
-        },
-        {
           "name": "dart2js d8 fragment merging tests",
           "arguments": [
             "-ndart2js-minified-hostasserts-weak-max-fragments-linux-x64-d8",
@@ -3722,6 +3756,10 @@
         {
           "name": "analyze flutter/plugins",
           "script": "tools/bots/flutter/analyze_flutter_plugins.sh"
+        },
+        {
+          "name": "analyze flutter/gallery",
+          "script": "tools/bots/flutter/analyze_flutter_gallery.sh"
         }
       ]
     },
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index 75f7375..2fb96f0 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -184,8 +184,12 @@
     out/ReleaseIA32/run_vm_tests --dfe=out/ReleaseIA32/kernel-service.dart.snapshot --sound-null-safety UseDartApi
     out/ReleaseIA32/dart --profile-period=10000 --packages=.packages benchmarks/Example/dart2/Example.dart
     out/ReleaseIA32/dart --sound-null-safety --profile-period=10000 --packages=.packages benchmarks/Example/dart/Example.dart
+    out/ReleaseIA32/dart benchmarks/NativeCall/dart2/NativeCall.dart
+    out/ReleaseIA32/dart --sound-null-safety benchmarks/NativeCall/dart/NativeCall.dart
     out/ReleaseIA32/dart benchmarks/FfiBoringssl/dart2/FfiBoringssl.dart
     out/ReleaseIA32/dart --sound-null-safety benchmarks/FfiBoringssl/dart/FfiBoringssl.dart
+    out/ReleaseIA32/dart benchmarks/FfiAsTypedList/dart2/FfiAsTypedList.dart
+    out/ReleaseIA32/dart --sound-null-safety benchmarks/FfiAsTypedList/dart/FfiAsTypedList.dart
     out/ReleaseIA32/dart benchmarks/FfiCall/dart2/FfiCall.dart
     out/ReleaseIA32/dart --sound-null-safety benchmarks/FfiCall/dart/FfiCall.dart
     out/ReleaseIA32/dart benchmarks/FfiMemory/dart2/FfiMemory.dart
diff --git a/tools/dom/docs.json b/tools/dom/docs.json
new file mode 100644
index 0000000..e1a453b
--- /dev/null
+++ b/tools/dom/docs.json
@@ -0,0 +1,5227 @@
+{
+  "dart.dom.html": {
+    "AbstractWorker": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [AbstractWorker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [AbstractWorker]."
+        ]
+      }
+    },
+    "ApplicationCache": {
+      "comment": [
+        "/**",
+        " * ApplicationCache is accessed via [Window.applicationCache].",
+        " */"
+      ],
+      "members": {
+        "cachedEvent": [
+          "/**",
+          "   * Static factory designed to expose `cached` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "checkingEvent": [
+          "/**",
+          "   * Static factory designed to expose `checking` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "downloadingEvent": [
+          "/**",
+          "   * Static factory designed to expose `downloading` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "noupdateEvent": [
+          "/**",
+          "   * Static factory designed to expose `noupdate` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "obsoleteEvent": [
+          "/**",
+          "   * Static factory designed to expose `obsolete` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncached": [
+          "/// Stream of `cached` events handled by this [ApplicationCache]."
+        ],
+        "onchecking": [
+          "/// Stream of `checking` events handled by this [ApplicationCache]."
+        ],
+        "ondownloading": [
+          "/// Stream of `downloading` events handled by this [ApplicationCache]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [ApplicationCache]."
+        ],
+        "onnoupdate": [
+          "/// Stream of `noupdate` events handled by this [ApplicationCache]."
+        ],
+        "onobsolete": [
+          "/// Stream of `obsolete` events handled by this [ApplicationCache]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [ApplicationCache]."
+        ],
+        "onupdateready": [
+          "/// Stream of `updateready` events handled by this [ApplicationCache]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "updatereadyEvent": [
+          "/**",
+          "   * Static factory designed to expose `updateready` events to event",
+          "   * handlers that are not necessarily instances of [ApplicationCache].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "CanvasGradient": {
+      "comment": [
+        "/**",
+        " * An opaque canvas object representing a gradient.",
+        " *",
+        " * Created by calling the methods",
+        " * [CanvasRenderingContext2D.createLinearGradient] or",
+        " * [CanvasRenderingContext2D.createRadialGradient] on a",
+        " * [CanvasRenderingContext2D] object.",
+        " *",
+        " * Example usage:",
+        " *",
+        " *     var canvas = new CanvasElement(width: 600, height: 600);",
+        " *     var ctx = canvas.context2D;",
+        " *     ctx.clearRect(0, 0, 600, 600);",
+        " *     ctx.save();",
+        " *     // Create radial gradient.",
+        " *     CanvasGradient gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, 600);",
+        " *     gradient.addColorStop(0, '#000');",
+        " *     gradient.addColorStop(1, 'rgb(255, 255, 255)');",
+        " *     // Assign gradients to fill.",
+        " *     ctx.fillStyle = gradient;",
+        " *     // Draw a rectangle with a gradient fill.",
+        " *     ctx.fillRect(0, 0, 600, 600);",
+        " *     ctx.save();",
+        " *     document.body.children.add(canvas);",
+        " *",
+        " * See also:",
+        " *",
+        " * * [CanvasGradient](https://developer.mozilla.org/en-US/docs/DOM/CanvasGradient) from MDN.",
+        " * * [CanvasGradient](https://html.spec.whatwg.org/multipage/scripting.html#canvasgradient)",
+        " *   from WHATWG.",
+        " * * [CanvasGradient](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvasgradient) from W3C.",
+        " */"
+      ],
+      "members": {
+        "addColorStop": [
+          "/**",
+          "   * Adds a color stop to this gradient at the offset.",
+          "   *",
+          "   * The [offset] can range between 0.0 and 1.0.",
+          "   *",
+          "   * See also:",
+          "   *",
+          "   * * [Multiple Color Stops](https://developer.mozilla.org/en-US/docs/CSS/linear-gradient#Gradient_with_multiple_color_stops) from MDN.",
+          "   */"
+        ]
+      }
+    },
+    "CanvasPattern": {
+      "comment": [
+        "/**",
+        " * An opaque object representing a pattern of image, canvas, or video.",
+        " *",
+        " * Created by calling [CanvasRenderingContext2D.createPattern] on a",
+        " * [CanvasRenderingContext2D] object.",
+        " *",
+        " * Example usage:",
+        " *",
+        " *     var canvas = new CanvasElement(width: 600, height: 600);",
+        " *     var ctx = canvas.context2D;",
+        " *     var img = new ImageElement();",
+        " *     // Image src needs to be loaded before pattern is applied.",
+        " *     img.onLoad.listen((event) {",
+        " *       // When the image is loaded, create a pattern",
+        " *       // from the ImageElement.",
+        " *       CanvasPattern pattern = ctx.createPattern(img, 'repeat');",
+        " *       ctx.rect(0, 0, canvas.width, canvas.height);",
+        " *       ctx.fillStyle = pattern;",
+        " *       ctx.fill();",
+        " *     });",
+        " *     img.src = \"images/foo.jpg\";",
+        " *     document.body.children.add(canvas);",
+        " *",
+        " * See also:",
+        " * * [CanvasPattern](https://developer.mozilla.org/en-US/docs/DOM/CanvasPattern) from MDN.",
+        " * * [CanvasPattern](https://html.spec.whatwg.org/multipage/scripting.html#canvaspattern)",
+        " *   from WHATWG.",
+        " * * [CanvasPattern](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvaspattern) from W3C.",
+        " */"
+      ]
+    },
+    "CanvasRenderingContext": {
+      "comment": [
+        "/**",
+        " * A rendering context for a canvas element.",
+        " *",
+        " * This context is extended by [CanvasRenderingContext2D] and",
+        " * [WebGLRenderingContext].",
+        " */"
+      ],
+      "members": {
+        "canvas": [
+          "/// Reference to the canvas element to which this context belongs."
+        ]
+      }
+    },
+    "CanvasRenderingContext2D": {
+      "members": {
+        "currentPath": [
+          "/**",
+          "   * The current default path of this canvas context, if there is one.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Current default",
+          "   *   path](https://html.spec.whatwg.org/multipage/scripting.html#current-default-path)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "imageSmoothingEnabled": [
+          "/**",
+          "   * Whether images and patterns on this canvas will be smoothed when this",
+          "   * canvas is scaled.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Image",
+          "   *   smoothing](https://html.spec.whatwg.org/multipage/scripting.html#image-smoothing)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "webkitBackingStorePixelRatio": [
+          "/**",
+          "   * The ratio between this canvas' backing store dimensions and the canvas'",
+          "   * logical dimensions.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [High DPI Canvas",
+          "   *   tutorial](http://www.html5rocks.com/en/tutorials/canvas/hidpi/)",
+          "   *   from HTML5Rocks.",
+          "   */"
+        ]
+      }
+    },
+    "Clipboard": {
+      "members": {
+        "getData": [
+          "/**",
+          "   * Gets the data for the specified type.",
+          "   *",
+          "   * The data is only available from within a drop operation (such as an",
+          "   * [Element.onDrop] event) and will return null before the event is",
+          "   * triggered.",
+          "   *",
+          "   * Data transfer is prohibited across domains. If a drag originates",
+          "   * from content from another domain or protocol (HTTP vs HTTPS) then the",
+          "   * data cannot be accessed.",
+          "   *",
+          "   * The [type] can have values such as:",
+          "   *",
+          "   * * `'Text'`",
+          "   * * `'URL'`",
+          "   */"
+        ]
+      }
+    },
+    "DedicatedWorkerGlobalScope": {
+      "members": {
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [DedicatedWorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [DedicatedWorkerGlobalScope]."
+        ]
+      }
+    },
+    "Document": {
+      "comment": [
+        "/**",
+        " * The base class for all documents.",
+        " *",
+        " * Each web page loaded in the browser has its own [Document] object, which is",
+        " * typically an [HtmlDocument].",
+        " *",
+        " * If you aren't comfortable with DOM concepts, see the Dart tutorial",
+        " * [Target 2: Connect Dart & HTML](http://www.dartlang.org/docs/tutorials/connect-dart-html/).",
+        " */"
+      ],
+      "members": {
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Document]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [Document]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [Document]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [Document]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Document]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Document]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Document]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Document]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [Document]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [Document]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Document]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [Document]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [Document]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [Document]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [Document]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [Document]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [Document]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [Document]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Document]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Document]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Document]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Document]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Document]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Document]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Document]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Document]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Document]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Document]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Document]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Document]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Document]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Document]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Document]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Document]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [Document]."
+        ],
+        "onreadystatechange": [
+          "/// Stream of `readystatechange` events handled by this [Document]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Document]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Document]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Document]."
+        ],
+        "onsecuritypolicyviolation": [
+          "/// Stream of `securitypolicyviolation` events handled by this [Document]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Document]."
+        ],
+        "onselectionchange": [
+          "/// Stream of `selectionchange` events handled by this [Document]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [Document]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Document]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Document]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Document]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Document]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Document]."
+        ],
+        "onwebkitfullscreenchange": [
+          "/// Stream of `fullscreenchange` events handled by this [Document]."
+        ],
+        "onwebkitfullscreenerror": [
+          "/// Stream of `fullscreenerror` events handled by this [Document]."
+        ],
+        "onwebkitpointerlockchange": [
+          "/// Stream of `pointerlockchange` events handled by this [Document]."
+        ],
+        "onwebkitpointerlockerror": [
+          "/// Stream of `pointerlockerror` events handled by this [Document]."
+        ],
+        "querySelector": [
+          "/**",
+          "   * Finds the first descendant element of this document that matches the",
+          "   * specified group of selectors.",
+          "   *",
+          "   * Unless your webpage contains multiple documents, the top-level",
+          "   * [querySelector]",
+          "   * method behaves the same as this method, so you should use it instead to",
+          "   * save typing a few characters.",
+          "   *",
+          "   * [selectors] should be a string using CSS selector syntax.",
+          "   *",
+          "   *     var element1 = document.querySelector('.className');",
+          "   *     var element2 = document.querySelector('#id');",
+          "   *",
+          "   * For details about CSS selector syntax, see the",
+          "   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
+          "   */"
+        ],
+        "readystatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `readystatechange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "securitypolicyviolationEvent": [
+          "/**",
+          "   * Static factory designed to expose `securitypolicyviolation` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectionchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectionchange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitpointerlockchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `pointerlockchange` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitpointerlockerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `pointerlockerror` events to event",
+          "   * handlers that are not necessarily instances of [Document].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "DocumentFragment": {
+      "members": {
+        "querySelector": [
+          "/**",
+          "   * Finds the first descendant element of this document fragment that matches",
+          "   * the specified group of selectors.",
+          "   *",
+          "   * [selectors] should be a string using CSS selector syntax.",
+          "   *",
+          "   *     var element1 = fragment.querySelector('.className');",
+          "   *     var element2 = fragment.querySelector('#id');",
+          "   *",
+          "   * For details about CSS selector syntax, see the",
+          "   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
+          "   */"
+        ]
+      }
+    },
+    "Element": {
+      "comment": [
+        "/**",
+        " * An abstract class, which all HTML elements extend.",
+        " */"
+      ],
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecopyEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecopy` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecutEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecut` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforepasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforepaste` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "changeEvent": [
+          "/**",
+          "   * Static factory designed to expose `change` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "contextmenuEvent": [
+          "/**",
+          "   * Static factory designed to expose `contextmenu` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "copyEvent": [
+          "/**",
+          "   * Static factory designed to expose `copy` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "cutEvent": [
+          "/**",
+          "   * Static factory designed to expose `cut` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dblclickEvent": [
+          "/**",
+          "   * Static factory designed to expose `doubleclick` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragendEvent": [
+          "/**",
+          "   * A stream of `dragend` events fired when an element completes a drag",
+          "   * operation.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "dragenterEvent": [
+          "/**",
+          "   * A stream of `dragenter` events fired when a dragged object is first dragged",
+          "   * over an element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "dragEvent": [
+          "/**",
+          "   * A stream of `drag` events fired when an element is currently being dragged.",
+          "   *",
+          "   * A `drag` event is added to this stream as soon as the drag begins.",
+          "   * A `drag` event is also added to this stream at intervals while the drag",
+          "   * operation is still ongoing.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "draggable": [
+          "/**",
+          "   * Indicates whether the element can be dragged and dropped.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "dragleaveEvent": [
+          "/**",
+          "   * A stream of `dragleave` events fired when an object being dragged over an",
+          "   * element leaves the element's target area.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "dragoverEvent": [
+          "/**",
+          "   * A stream of `dragover` events fired when a dragged object is currently",
+          "   * being dragged over an element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "dragstartEvent": [
+          "/**",
+          "   * A stream of `dragstart` events for a dragged element whose drag has begun.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "dropEvent": [
+          "/**",
+          "   * A stream of `drop` events fired when a dragged object is dropped on an",
+          "   * element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "getBoundingClientRect": [
+          "/**",
+          "   * Returns the smallest bounding rectangle that encompasses this element's",
+          "   * padding, scrollbar, and border.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Element.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)",
+          "   *   from MDN.",
+          "   * * [The getBoundingClientRect()",
+          "   *   method](http://www.w3.org/TR/cssom-view/#the-getclientrects()-and-getboundingclientrect()-methods)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "getClientRects": [
+          "/**",
+          "   * Returns a list of bounding rectangles for each box associated with this",
+          "   * element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Element.getClientRects](https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)",
+          "   *   from MDN.",
+          "   * * [The getClientRects()",
+          "   *   method](http://www.w3.org/TR/cssom-view/#the-getclientrects()-and-getboundingclientrect()-methods)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "getDestinationInsertionPoints": [
+          "/**",
+          "   * Returns a list of shadow DOM insertion points to which this element is",
+          "   * distributed.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Shadow DOM",
+          "   *   specification](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "getElementsByClassName": [
+          "/**",
+          "   * Returns a list of nodes with the given class name inside this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [getElementsByClassName](https://developer.mozilla.org/en-US/docs/Web/API/document.getElementsByClassName)",
+          "   *   from MDN.",
+          "   * * [DOM specification](http://www.w3.org/TR/domcore/) from W3C.",
+          "   */"
+        ],
+        "hidden": [
+          "/**",
+          "   * Indicates whether the element is not relevant to the page's current state.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Hidden attribute",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#the-hidden-attribute)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "inputEvent": [
+          "/**",
+          "   * Static factory designed to expose `input` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "inputMethodContext": [
+          "/**",
+          "   * The current state of IME composition.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Input method editor",
+          "   *   specification](http://www.w3.org/TR/ime-api/) from W3C.",
+          "   */"
+        ],
+        "invalidEvent": [
+          "/**",
+          "   * Static factory designed to expose `invalid` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keydownEvent": [
+          "/**",
+          "   * Static factory designed to expose `keydown` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keypressEvent": [
+          "/**",
+          "   * Static factory designed to expose `keypress` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keyupEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyup` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousedownEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousedown` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseenter` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseleave` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousemoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousemove` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseout` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseover` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseupEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseup` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Element]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [Element]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [Element]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [Element]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Element]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Element]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Element]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Element]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [Element]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [Element]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Element]."
+        ],
+        "ondrag": [
+          "/**",
+          "   * A stream of `drag` events fired when this element currently being dragged.",
+          "   *",
+          "   * A `drag` event is added to this stream as soon as the drag begins.",
+          "   * A `drag` event is also added to this stream at intervals while the drag",
+          "   * operation is still ongoing.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "ondragend": [
+          "/**",
+          "   * A stream of `dragend` events fired when this element completes a drag",
+          "   * operation.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "ondragenter": [
+          "/**",
+          "   * A stream of `dragenter` events fired when a dragged object is first dragged",
+          "   * over this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "ondragleave": [
+          "/**",
+          "   * A stream of `dragleave` events fired when an object being dragged over this",
+          "   * element leaves this element's target area.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "ondragover": [
+          "/**",
+          "   * A stream of `dragover` events fired when a dragged object is currently",
+          "   * being dragged over this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "ondragstart": [
+          "/**",
+          "   * A stream of `dragstart` events fired when this element starts being",
+          "   * dragged.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "ondrop": [
+          "/**",
+          "   * A stream of `drop` events fired when a dragged object is dropped on this",
+          "   * element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Element]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Element]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Element]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Element]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Element]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Element]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Element]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Element]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Element]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Element]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Element]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Element]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Element]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Element]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Element]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Element]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [Element]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Element]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Element]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Element]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Element]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [Element]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Element]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Element]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Element]."
+        ],
+        "ontouchenter": [
+          "/// Stream of `touchenter` events handled by this [Element]."
+        ],
+        "ontouchleave": [
+          "/// Stream of `touchleave` events handled by this [Element]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Element]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Element]."
+        ],
+        "ontransitionend": [
+          "/// Stream of `transitionend` events handled by this [Element]."
+        ],
+        "onwebkitfullscreenchange": [
+          "/// Stream of `fullscreenchange` events handled by this [Element]."
+        ],
+        "onwebkitfullscreenerror": [
+          "/// Stream of `fullscreenerror` events handled by this [Element]."
+        ],
+        "pasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `paste` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "pseudo": [
+          "/**",
+          "   * The name of this element's custom pseudo-element.",
+          "   *",
+          "   * This value must begin with an x and a hyphen, `x-`, to be considered valid.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Using custom pseudo",
+          "   *   elements](http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)",
+          "   *   from HTML5Rocks.",
+          "   * * [Custom pseudo-elements](http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "querySelector": [
+          "/**",
+          "   * Finds the first descendant element of this element that matches the",
+          "   * specified group of selectors.",
+          "   *",
+          "   * [selectors] should be a string using CSS selector syntax.",
+          "   *",
+          "   *     // Gets the first descendant with the class 'classname'",
+          "   *     var element = element.querySelector('.className');",
+          "   *     // Gets the element with id 'id'",
+          "   *     var element = element.querySelector('#id');",
+          "   *     // Gets the first descendant [ImageElement]",
+          "   *     var img = element.querySelector('img');",
+          "   *",
+          "   * For details about CSS selector syntax, see the",
+          "   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
+          "   */"
+        ],
+        "resetEvent": [
+          "/**",
+          "   * Static factory designed to expose `reset` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "scrollByLines": [
+          "/**",
+          "   * Scrolls the element by a number of lines.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.scrollByLines](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollByLines)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "scrollByPages": [
+          "/**",
+          "   * Scrolls the element by a number of pages.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.scrollByPages](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollByPages)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "scrollEvent": [
+          "/**",
+          "   * Static factory designed to expose `scroll` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "searchEvent": [
+          "/**",
+          "   * Static factory designed to expose `search` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectEvent": [
+          "/**",
+          "   * Static factory designed to expose `select` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectstart` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "submitEvent": [
+          "/**",
+          "   * Static factory designed to expose `submit` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchcancelEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchcancel` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchendEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchend` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchenter` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchleave` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchmoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchmove` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "touchstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `touchstart` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "translate": [
+          "/**",
+          "   * Specifies whether this element's text content changes when the page is",
+          "   * localized.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The translate",
+          "   *   attribute](https://html.spec.whatwg.org/multipage/dom.html#the-translate-attribute)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "webkitdropzone": [
+          "/**",
+          "   * A set of space-separated keywords that specify what kind of data this",
+          "   * Element accepts on drop and what to do with that data.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Drag and drop",
+          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
+          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Drag and drop",
+          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "webkitfullscreenchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `fullscreenchange` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitfullscreenerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `fullscreenerror` events to event",
+          "   * handlers that are not necessarily instances of [Element].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitGetRegionFlowRanges": [
+          "/**",
+          "   * Returns an array of ranges of fragments in the flow.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [CSS regions and exclusions",
+          "   *   tutorial](http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.",
+          "   * * [Regions](http://webplatform.adobe.com/regions/) from Adobe.",
+          "   * * [CSS regions specification](http://www.w3.org/TR/css3-regions/) from W3C.",
+          "   */"
+        ],
+        "webkitRegionOverset": [
+          "/**",
+          "   * The current state of this region.",
+          "   *",
+          "   * If `\"empty\"`, then there is no content in this region.",
+          "   * If `\"fit\"`, then content fits into this region, and more content can be",
+          "   * added. If `\"overset\"`, then there is more content than can be fit into this",
+          "   * region.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [CSS regions and exclusions",
+          "   *   tutorial](http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.",
+          "   * * [Regions](http://webplatform.adobe.com/regions/) from Adobe.",
+          "   * * [CSS regions specification](http://www.w3.org/TR/css3-regions/) from W3C.",
+          "   */"
+        ],
+        "webkitRequestFullscreen": [
+          "/**",
+          "   * Displays this element fullscreen.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Fullscreen",
+          "   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)",
+          "   *   from MDN.",
+          "   * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.",
+          "   */"
+        ],
+        "webkitRequestPointerLock": [
+          "/**",
+          "   * Locks the mouse pointer to this element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Pointer lock and first person shooter",
+          "   *   controls](http://www.html5rocks.com/en/tutorials/pointerlock/intro/)",
+          "   *   tutorial from HTML5Rocks.",
+          "   * * [Pointer lock specification](http://www.w3.org/TR/pointerlock/)",
+          "   *   from W3C.",
+          "   */"
+        ]
+      }
+    },
+    "Event": {
+      "members": {
+        "AT_TARGET": [
+          "/**",
+          "   * This event is being handled by the event target.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Target phase](http://www.w3.org/TR/DOM-Level-3-Events/#target-phase)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "BUBBLING_PHASE": [
+          "/**",
+          "   * This event is bubbling up through the target's ancestors.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Bubble phase](http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "CAPTURING_PHASE": [
+          "/**",
+          "   * This event is propagating through the target's ancestors, starting from the",
+          "   * document.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Bubble phase](http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "clipboardData": [
+          "/**",
+          "   * Access to the system's clipboard data during copy, cut, and paste events.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [clipboardData specification](http://www.w3.org/TR/clipboard-apis/#attributes)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "path": [
+          "/**",
+          "   * This event's path, taking into account shadow DOM.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Shadow DOM extensions to",
+          "   *   Event](http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event)",
+          "   *   from W3C.",
+          "   */"
+        ]
+      }
+    },
+    "EventSource": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [EventSource]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [EventSource]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [EventSource]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [EventSource].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "FileReader": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadendEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadend` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [FileReader]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [FileReader]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [FileReader]."
+        ],
+        "onloadend": [
+          "/// Stream of `loadend` events handled by this [FileReader]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [FileReader]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [FileReader]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [FileReader].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "FileWriter": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [FileWriter]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [FileWriter]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [FileWriter]."
+        ],
+        "onwrite": [
+          "/// Stream of `write` events handled by this [FileWriter]."
+        ],
+        "onwriteend": [
+          "/// Stream of `writeend` events handled by this [FileWriter]."
+        ],
+        "onwritestart": [
+          "/// Stream of `writestart` events handled by this [FileWriter]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writeendEvent": [
+          "/**",
+          "   * Static factory designed to expose `writeend` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writeEvent": [
+          "/**",
+          "   * Static factory designed to expose `write` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "writestartEvent": [
+          "/**",
+          "   * Static factory designed to expose `writestart` events to event",
+          "   * handlers that are not necessarily instances of [FileWriter].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "HTMLAreaElement": {
+      "comment": [
+        "/**",
+        " * DOM Area Element, which links regions of an image map with a hyperlink.",
+        " *",
+        " * The element can also define an uninteractive region of the map.",
+        " *",
+        " * See also:",
+        " *",
+        " * * [`<area>`](https://developer.mozilla.org/en-US/docs/HTML/Element/area)",
+        " * on MDN.",
+        " */"
+      ]
+    },
+    "HTMLBodyElement": {
+      "members": {
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "hashchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `hashchange` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "offlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `offline` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [BodyElement]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [BodyElement]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [BodyElement]."
+        ],
+        "onhashchange": [
+          "/// Stream of `hashchange` events handled by this [BodyElement]."
+        ],
+        "onlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `online` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [BodyElement]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [BodyElement]."
+        ],
+        "onoffline": [
+          "/// Stream of `offline` events handled by this [BodyElement]."
+        ],
+        "ononline": [
+          "/// Stream of `online` events handled by this [BodyElement]."
+        ],
+        "onpopstate": [
+          "/// Stream of `popstate` events handled by this [BodyElement]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [BodyElement]."
+        ],
+        "onstorage": [
+          "/// Stream of `storage` events handled by this [BodyElement]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [BodyElement]."
+        ],
+        "popstateEvent": [
+          "/**",
+          "   * Static factory designed to expose `popstate` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "storageEvent": [
+          "/**",
+          "   * Static factory designed to expose `storage` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [BodyElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "HTMLCanvasElement": {
+      "members": {
+        "height": [
+          "/// The height of this canvas element in CSS pixels."
+        ],
+        "onwebglcontextlost": [
+          "/// Stream of `webglcontextlost` events handled by this [CanvasElement]."
+        ],
+        "onwebglcontextrestored": [
+          "/// Stream of `webglcontextrestored` events handled by this [CanvasElement]."
+        ],
+        "webglcontextlostEvent": [
+          "/**",
+          "   * Static factory designed to expose `webglcontextlost` events to event",
+          "   * handlers that are not necessarily instances of [CanvasElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webglcontextrestoredEvent": [
+          "/**",
+          "   * Static factory designed to expose `webglcontextrestored` events to event",
+          "   * handlers that are not necessarily instances of [CanvasElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "width": [
+          "/// The width of this canvas element in CSS pixels."
+        ]
+      }
+    },
+    "HTMLDivElement": {
+      "comment": [
+        "/**",
+        " * A generic container for content on an HTML page;",
+        " * corresponds to the &lt;div&gt; tag.",
+        " *",
+        " * The [DivElement] is a generic container and does not have any semantic",
+        " * significance. It is functionally similar to [SpanElement].",
+        " *",
+        " * The [DivElement] is a block-level element, as opposed to [SpanElement],",
+        " * which is an inline-level element.",
+        " *",
+        " * Example usage:",
+        " *",
+        " *     DivElement div = new DivElement();",
+        " *     div.text = 'Here's my new DivElem",
+        " *     document.body.elements.add(elem);",
+        " *",
+        " * See also:",
+        " *",
+        " * * [HTML `<div>` element](http://www.w3.org/TR/html-markup/div.html) from W3C.",
+        " * * [Block-level element](http://www.w3.org/TR/CSS2/visuren.html#block-boxes) from W3C.",
+        " * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.",
+        " */"
+      ]
+    },
+    "HTMLFormElement": {
+      "members": {
+        "autocompleteerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `autocompleteerror` events to event",
+          "   * handlers that are not necessarily instances of [FormElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "autocompleteEvent": [
+          "/**",
+          "   * Static factory designed to expose `autocomplete` events to event",
+          "   * handlers that are not necessarily instances of [FormElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onautocomplete": [
+          "/// Stream of `autocomplete` events handled by this [FormElement]."
+        ],
+        "onautocompleteerror": [
+          "/// Stream of `autocompleteerror` events handled by this [FormElement]."
+        ]
+      }
+    },
+    "HTMLHRElement": {
+      "comment": [
+        "/**",
+        " * An `<hr>` tag.",
+        " */"
+      ]
+    },
+    "HTMLInputElement": {
+      "members": {
+        "onwebkitSpeechChange": [
+          "/// Stream of `speechchange` events handled by this [InputElement]."
+        ],
+        "webkitSpeechChangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechchange` events to event",
+          "   * handlers that are not necessarily instances of [InputElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "HTMLMediaElement": {
+      "members": {
+        "canplayEvent": [
+          "/**",
+          "   * Static factory designed to expose `canplay` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "canplaythroughEvent": [
+          "/**",
+          "   * Static factory designed to expose `canplaythrough` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "durationchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `durationchange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "emptiedEvent": [
+          "/**",
+          "   * Static factory designed to expose `emptied` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadeddataEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadeddata` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadedmetadataEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadedmetadata` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncanplay": [
+          "/// Stream of `canplay` events handled by this [MediaElement]."
+        ],
+        "oncanplaythrough": [
+          "/// Stream of `canplaythrough` events handled by this [MediaElement]."
+        ],
+        "ondurationchange": [
+          "/// Stream of `durationchange` events handled by this [MediaElement]."
+        ],
+        "onemptied": [
+          "/// Stream of `emptied` events handled by this [MediaElement]."
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaElement]."
+        ],
+        "onloadeddata": [
+          "/// Stream of `loadeddata` events handled by this [MediaElement]."
+        ],
+        "onloadedmetadata": [
+          "/// Stream of `loadedmetadata` events handled by this [MediaElement]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [MediaElement]."
+        ],
+        "onpause": [
+          "/// Stream of `pause` events handled by this [MediaElement]."
+        ],
+        "onplay": [
+          "/// Stream of `play` events handled by this [MediaElement]."
+        ],
+        "onplaying": [
+          "/// Stream of `playing` events handled by this [MediaElement]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [MediaElement]."
+        ],
+        "onratechange": [
+          "/// Stream of `ratechange` events handled by this [MediaElement]."
+        ],
+        "onseeked": [
+          "/// Stream of `seeked` events handled by this [MediaElement]."
+        ],
+        "onseeking": [
+          "/// Stream of `seeking` events handled by this [MediaElement]."
+        ],
+        "onshow": [
+          "/// Stream of `show` events handled by this [MediaElement]."
+        ],
+        "onstalled": [
+          "/// Stream of `stalled` events handled by this [MediaElement]."
+        ],
+        "onsuspend": [
+          "/// Stream of `suspend` events handled by this [MediaElement]."
+        ],
+        "ontimeupdate": [
+          "/// Stream of `timeupdate` events handled by this [MediaElement]."
+        ],
+        "onvolumechange": [
+          "/// Stream of `volumechange` events handled by this [MediaElement]."
+        ],
+        "onwaiting": [
+          "/// Stream of `waiting` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeyadded": [
+          "/// Stream of `keyadded` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeyerror": [
+          "/// Stream of `keyerror` events handled by this [MediaElement]."
+        ],
+        "onwebkitkeymessage": [
+          "/// Stream of `keymessage` events handled by this [MediaElement]."
+        ],
+        "onwebkitneedkey": [
+          "/// Stream of `needkey` events handled by this [MediaElement]."
+        ],
+        "pauseEvent": [
+          "/**",
+          "   * Static factory designed to expose `pause` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "playEvent": [
+          "/**",
+          "   * Static factory designed to expose `play` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "playingEvent": [
+          "/**",
+          "   * Static factory designed to expose `playing` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "ratechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `ratechange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "seekedEvent": [
+          "/**",
+          "   * Static factory designed to expose `seeked` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "seekingEvent": [
+          "/**",
+          "   * Static factory designed to expose `seeking` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "showEvent": [
+          "/**",
+          "   * Static factory designed to expose `show` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "stalledEvent": [
+          "/**",
+          "   * Static factory designed to expose `stalled` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "suspendEvent": [
+          "/**",
+          "   * Static factory designed to expose `suspend` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "timeupdateEvent": [
+          "/**",
+          "   * Static factory designed to expose `timeupdate` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "volumechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `volumechange` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "waitingEvent": [
+          "/**",
+          "   * Static factory designed to expose `waiting` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyaddedEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyadded` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyerror` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeymessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `keymessage` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitneedkeyEvent": [
+          "/**",
+          "   * Static factory designed to expose `needkey` events to event",
+          "   * handlers that are not necessarily instances of [MediaElement].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "HTMLMenuElement": {
+      "comment": [
+        "/**",
+        " * An HTML <menu> element.",
+        " *",
+        " * A <menu> element represents an unordered list of menu commands.",
+        " *",
+        " * See also:",
+        " *",
+        " *  * [Menu Element](https://developer.mozilla.org/en-US/docs/HTML/Element/menu) from MDN.",
+        " *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.",
+        " */"
+      ]
+    },
+    "MediaKeySession": {
+      "members": {
+        "onwebkitkeyadded": [
+          "/// Stream of `keyadded` events handled by this [MediaKeySession]."
+        ],
+        "onwebkitkeyerror": [
+          "/// Stream of `keyerror` events handled by this [MediaKeySession]."
+        ],
+        "onwebkitkeymessage": [
+          "/// Stream of `keymessage` events handled by this [MediaKeySession]."
+        ],
+        "webkitkeyaddedEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyadded` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeyerrorEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyerror` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitkeymessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `keymessage` events to event",
+          "   * handlers that are not necessarily instances of [MediaKeySession].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MediaStream": {
+      "members": {
+        "addtrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `addtrack` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddtrack": [
+          "/// Stream of `addtrack` events handled by this [MediaStream]."
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaStream]."
+        ],
+        "onremovetrack": [
+          "/// Stream of `removetrack` events handled by this [MediaStream]."
+        ],
+        "removetrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `removetrack` events to event",
+          "   * handlers that are not necessarily instances of [MediaStream].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MediaStreamTrack": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "muteEvent": [
+          "/**",
+          "   * Static factory designed to expose `mute` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [MediaStreamTrack]."
+        ],
+        "onmute": [
+          "/// Stream of `mute` events handled by this [MediaStreamTrack]."
+        ],
+        "onunmute": [
+          "/// Stream of `unmute` events handled by this [MediaStreamTrack]."
+        ],
+        "unmuteEvent": [
+          "/**",
+          "   * Static factory designed to expose `unmute` events to event",
+          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "MessagePort": {
+      "members": {
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [MessagePort].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [MessagePort]."
+        ]
+      }
+    },
+    "MIDIAccess": {
+      "members": {
+        "connectEvent": [
+          "/**",
+          "   * Static factory designed to expose `connect` events to event",
+          "   * handlers that are not necessarily instances of [MidiAccess].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "disconnectEvent": [
+          "/**",
+          "   * Static factory designed to expose `disconnect` events to event",
+          "   * handlers that are not necessarily instances of [MidiAccess].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onconnect": [
+          "/// Stream of `connect` events handled by this [MidiAccess]."
+        ],
+        "ondisconnect": [
+          "/// Stream of `disconnect` events handled by this [MidiAccess]."
+        ]
+      }
+    },
+    "MIDIInput": {
+      "members": {
+        "midimessageEvent": [
+          "/**",
+          "   * Static factory designed to expose `midimessage` events to event",
+          "   * handlers that are not necessarily instances of [MidiInput].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onmidimessage": [
+          "/// Stream of `midimessage` events handled by this [MidiInput]."
+        ]
+      }
+    },
+    "MIDIPort": {
+      "members": {
+        "disconnectEvent": [
+          "/**",
+          "   * Static factory designed to expose `disconnect` events to event",
+          "   * handlers that are not necessarily instances of [MidiPort].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "ondisconnect": [
+          "/// Stream of `disconnect` events handled by this [MidiPort]."
+        ]
+      }
+    },
+    "MouseEvent": {
+      "members": {
+        "fromElement": [
+          "/**",
+          "   * The nonstandard way to access the element that the mouse comes",
+          "   * from in the case of a `mouseover` event.",
+          "   *",
+          "   * This member is deprecated and not cross-browser compatible; use",
+          "   * relatedTarget to get the same information in the standard way.",
+          "   */"
+        ],
+        "toElement": [
+          "/**",
+          "   * The nonstandard way to access the element that the mouse goes",
+          "   * to in the case of a `mouseout` event.",
+          "   *",
+          "   * This member is deprecated and not cross-browser compatible; use",
+          "   * relatedTarget to get the same information in the standard way.",
+          "   */"
+        ]
+      }
+    },
+    "Node": {
+      "members": {
+        "appendChild": [
+          "/**",
+          "   * Adds a node to the end of the child [nodes] list of this node.",
+          "   *",
+          "   * If the node already exists in this document, it will be removed from its",
+          "   * current parent node, then added to this node.",
+          "   *",
+          "   * This method is more efficient than `nodes.add`, and is the preferred",
+          "   * way of appending a child node.",
+          "   */"
+        ],
+        "childNodes": [
+          "/**",
+          "   * A list of this node's children.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "cloneNode": [
+          "/**",
+          "   * Returns a copy of this node.",
+          "   *",
+          "   * If [deep] is `true`, then all of this node's children and descendents are",
+          "   * copied as well. If [deep] is `false`, then only this node is copied.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.cloneNode](https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "contains": [
+          "/**",
+          "   * Returns true if this node contains the specified node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.contains](https://developer.mozilla.org/en-US/docs/Web/API/Node.contains)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "firstChild": [
+          "/**",
+          "   * The first child of this node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.firstChild](https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "hasChildNodes": [
+          "/**",
+          "   * Returns true if this node has any children.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.hasChildNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "insertBefore": [
+          "/**",
+          "   * Inserts the given node into this node directly before child.",
+          "   * If child is `null`, then the given node is inserted at the end",
+          "   * of this node's child nodes.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.insertBefore](https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "lastChild": [
+          "/**",
+          "   * The last child of this node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.lastChild](https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "nextSibling": [
+          "/**",
+          "   * The next sibling node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.nextSibling](https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "nodeName": [
+          "/**",
+          "   * The name of this node.",
+          "   *",
+          "   * This varies by this node's [nodeType].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.nodeName](https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)",
+          "   *   from MDN. This page contains a table of [nodeName] values for each",
+          "   *   [nodeType].",
+          "   */"
+        ],
+        "nodeType": [
+          "/**",
+          "   * The type of node.",
+          "   *",
+          "   * This value is one of:",
+          "   *",
+          "   * * [ATTRIBUTE_NODE] if this node is an attribute.",
+          "   * * [CDATA_SECTION_NODE] if this node is a [CDataSection].",
+          "   * * [COMMENT_NODE] if this node is a [Comment].",
+          "   * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].",
+          "   * * [DOCUMENT_NODE] if this node is a [Document].",
+          "   * * [DOCUMENT_TYPE_NODE] if this node is a [_DocumentType] node.",
+          "   * * [ELEMENT_NODE] if this node is an [Element].",
+          "   * * [ENTITY_NODE] if this node is an entity.",
+          "   * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.",
+          "   * * [NOTATION_NODE] if this node is a notation.",
+          "   * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].",
+          "   * * [TEXT_NODE] if this node is a [Text] node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.nodeType](https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "nodeValue": [
+          "/**",
+          "   * The value of this node.",
+          "   *",
+          "   * This varies by this type's [nodeType].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.nodeValue](https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)",
+          "   *   from MDN. This page contains a table of [nodeValue] values for each",
+          "   *   [nodeType].",
+          "   */"
+        ],
+        "ownerDocument": [
+          "/**",
+          "   * The document this node belongs to.",
+          "   *",
+          "   * Returns null if this node does not belong to any document.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.ownerDocument](https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "parentElement": [
+          "/**",
+          "   * The parent element of this node.",
+          "   *",
+          "   * Returns null if this node either does not have a parent or its parent is",
+          "   * not an element.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.parentElement](https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "parentNode": [
+          "/**",
+          "   * The parent node of this node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.parentNode](https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "previousSibling": [
+          "/**",
+          "   * The previous sibling node.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.previousSibling](https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "textContent": [
+          "/**",
+          "   * All text within this node and its descendents.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Node.textContent](https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent)",
+          "   *   from MDN.",
+          "   */"
+        ]
+      }
+    },
+    "Notification": {
+      "members": {
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "displayEvent": [
+          "/**",
+          "   * Static factory designed to expose `display` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Notification]."
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [Notification]."
+        ],
+        "ondisplay": [
+          "/// Stream of `display` events handled by this [Notification]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Notification]."
+        ],
+        "onshow": [
+          "/// Stream of `show` events handled by this [Notification]."
+        ],
+        "showEvent": [
+          "/**",
+          "   * Static factory designed to expose `show` events to event",
+          "   * handlers that are not necessarily instances of [Notification].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "Performance": {
+      "members": {
+        "onwebkitresourcetimingbufferfull": [
+          "/// Stream of `resourcetimingbufferfull` events handled by this [Performance]."
+        ],
+        "webkitresourcetimingbufferfullEvent": [
+          "/**",
+          "   * Static factory designed to expose `resourcetimingbufferfull` events to event",
+          "   * handlers that are not necessarily instances of [Performance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCDataChannel": {
+      "members": {
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [RtcDataChannel]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [RtcDataChannel]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [RtcDataChannel]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [RtcDataChannel]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [RtcDataChannel].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCDTMFSender": {
+      "members": {
+        "ontonechange": [
+          "/// Stream of `tonechange` events handled by this [RtcDtmfSender]."
+        ],
+        "tonechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `tonechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcDtmfSender].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "RTCPeerConnection": {
+      "members": {
+        "addstreamEvent": [
+          "/**",
+          "   * Static factory designed to expose `addstream` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "datachannelEvent": [
+          "/**",
+          "   * Static factory designed to expose `datachannel` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "icecandidateEvent": [
+          "/**",
+          "   * Static factory designed to expose `icecandidate` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "iceconnectionstatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `iceconnectionstatechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "negotiationneededEvent": [
+          "/**",
+          "   * Static factory designed to expose `negotiationneeded` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddstream": [
+          "/// Stream of `addstream` events handled by this [RtcPeerConnection]."
+        ],
+        "ondatachannel": [
+          "/// Stream of `datachannel` events handled by this [RtcPeerConnection]."
+        ],
+        "onicecandidate": [
+          "/// Stream of `icecandidate` events handled by this [RtcPeerConnection]."
+        ],
+        "oniceconnectionstatechange": [
+          "/// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection]."
+        ],
+        "onnegotiationneeded": [
+          "/// Stream of `negotiationneeded` events handled by this [RtcPeerConnection]."
+        ],
+        "onremovestream": [
+          "/// Stream of `removestream` events handled by this [RtcPeerConnection]."
+        ],
+        "onsignalingstatechange": [
+          "/// Stream of `signalingstatechange` events handled by this [RtcPeerConnection]."
+        ],
+        "ontrack": [
+          "/// Stream of `track` events handled by this [RtcPeerConnection]."
+        ],
+        "removestreamEvent": [
+          "/**",
+          "   * Static factory designed to expose `removestream` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "signalingstatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `signalingstatechange` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "trackEvent": [
+          "/**",
+          "   * Static factory designed to expose `track` events to event",
+          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "SharedWorkerGlobalScope": {
+      "members": {
+        "connectEvent": [
+          "/**",
+          "   * Static factory designed to expose `connect` events to event",
+          "   * handlers that are not necessarily instances of [SharedWorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onconnect": [
+          "/// Stream of `connect` events handled by this [SharedWorkerGlobalScope]."
+        ]
+      }
+    },
+    "SpeechRecognition": {
+      "members": {
+        "audioendEvent": [
+          "/**",
+          "   * Static factory designed to expose `audioend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "audiostartEvent": [
+          "/**",
+          "   * Static factory designed to expose `audiostart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endEvent": [
+          "/**",
+          "   * Static factory designed to expose `end` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "nomatchEvent": [
+          "/**",
+          "   * Static factory designed to expose `nomatch` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaudioend": [
+          "/// Stream of `audioend` events handled by this [SpeechRecognition]."
+        ],
+        "onaudiostart": [
+          "/// Stream of `audiostart` events handled by this [SpeechRecognition]."
+        ],
+        "onend": [
+          "/// Stream of `end` events handled by this [SpeechRecognition]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [SpeechRecognition]."
+        ],
+        "onnomatch": [
+          "/// Stream of `nomatch` events handled by this [SpeechRecognition]."
+        ],
+        "onresult": [
+          "/// Stream of `result` events handled by this [SpeechRecognition]."
+        ],
+        "onsoundend": [
+          "/// Stream of `soundend` events handled by this [SpeechRecognition]."
+        ],
+        "onsoundstart": [
+          "/// Stream of `soundstart` events handled by this [SpeechRecognition]."
+        ],
+        "onspeechend": [
+          "/// Stream of `speechend` events handled by this [SpeechRecognition]."
+        ],
+        "onspeechstart": [
+          "/// Stream of `speechstart` events handled by this [SpeechRecognition]."
+        ],
+        "onstart": [
+          "/// Stream of `start` events handled by this [SpeechRecognition]."
+        ],
+        "resultEvent": [
+          "/**",
+          "   * Static factory designed to expose `result` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "soundendEvent": [
+          "/**",
+          "   * Static factory designed to expose `soundend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "soundstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `soundstart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "speechendEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechend` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "speechstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `speechstart` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "startEvent": [
+          "/**",
+          "   * Static factory designed to expose `start` events to event",
+          "   * handlers that are not necessarily instances of [SpeechRecognition].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "SpeechSynthesisUtterance": {
+      "members": {
+        "boundaryEvent": [
+          "/**",
+          "   * Static factory designed to expose `boundary` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "endEvent": [
+          "/**",
+          "   * Static factory designed to expose `end` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "markEvent": [
+          "/**",
+          "   * Static factory designed to expose `mark` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onboundary": [
+          "/// Stream of `boundary` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onend": [
+          "/// Stream of `end` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onmark": [
+          "/// Stream of `mark` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onpause": [
+          "/// Stream of `pause` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onresume": [
+          "/// Stream of `resume` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "onstart": [
+          "/// Stream of `start` events handled by this [SpeechSynthesisUtterance]."
+        ],
+        "pauseEvent": [
+          "/**",
+          "   * Static factory designed to expose `pause` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resumeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resume` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "startEvent": [
+          "/**",
+          "   * Static factory designed to expose `start` events to event",
+          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "TextTrack": {
+      "members": {
+        "cuechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `cuechange` events to event",
+          "   * handlers that are not necessarily instances of [TextTrack].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncuechange": [
+          "/// Stream of `cuechange` events handled by this [TextTrack]."
+        ]
+      }
+    },
+    "TextTrackCue": {
+      "members": {
+        "enterEvent": [
+          "/**",
+          "   * Static factory designed to expose `enter` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackCue].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "exitEvent": [
+          "/**",
+          "   * Static factory designed to expose `exit` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackCue].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onenter": [
+          "/// Stream of `enter` events handled by this [TextTrackCue]."
+        ],
+        "onexit": [
+          "/// Stream of `exit` events handled by this [TextTrackCue]."
+        ]
+      }
+    },
+    "TextTrackList": {
+      "members": {
+        "addtrackEvent": [
+          "/**",
+          "   * Static factory designed to expose `addtrack` events to event",
+          "   * handlers that are not necessarily instances of [TextTrackList].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaddtrack": [
+          "/// Stream of `addtrack` events handled by this [TextTrackList]."
+        ]
+      }
+    },
+    "WebSocket": {
+      "comment": [
+        "/**",
+        " * Use the WebSocket interface to connect to a WebSocket,",
+        " * and to send and receive data on that WebSocket.",
+        " *",
+        " * To use a WebSocket in your web app, first create a WebSocket object,",
+        " * passing the WebSocket URL as an argument to the constructor.",
+        " *",
+        " *     var webSocket = new WebSocket('ws://127.0.0.1:1337/ws');",
+        " *",
+        " * To send data on the WebSocket, use the [send] method.",
+        " *",
+        " *     if (webSocket != null && webSocket.readyState == WebSocket.OPEN) {",
+        " *       webSocket.send(data);",
+        " *     } else {",
+        " *       print('WebSocket not connected, message $data not sent');",
+        " *     }",
+        " *",
+        " * To receive data on the WebSocket, register a listener for message events.",
+        " *",
+        " *     webSocket.onMessage.listen((MessageEvent e) {",
+        " *       receivedData(e.data);",
+        " *     });",
+        " *",
+        " * The message event handler receives a [MessageEvent] object",
+        " * as its sole argument.",
+        " * You can also define open, close, and error handlers,",
+        " * as specified by [Event]s.",
+        " *",
+        " * For more information, see the",
+        " * [WebSockets](http://www.dartlang.org/docs/library-tour/#html-websockets)",
+        " * section of the library tour and",
+        " * [Introducing WebSockets](http://www.html5rocks.com/en/tutorials/websockets/basics/),",
+        " * an HTML5Rocks.com tutorial.",
+        " */"
+      ],
+      "members": {
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [WebSocket]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [WebSocket]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [WebSocket]."
+        ],
+        "onopen": [
+          "/// Stream of `open` events handled by this [WebSocket]."
+        ],
+        "openEvent": [
+          "/**",
+          "   * Static factory designed to expose `open` events to event",
+          "   * handlers that are not necessarily instances of [WebSocket].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "send": [
+          "/**",
+          "   * Transmit data to the server over this connection.",
+          "   *",
+          "   * This method accepts data of type [Blob], [ByteBuffer], [String], or",
+          "   * [TypedData]. Named variants [sendBlob], [sendByteBuffer], [sendString],",
+          "   * or [sendTypedData], in contrast, only accept data of the specified type.",
+          "   */"
+        ]
+      }
+    },
+    "Window": {
+      "comment": [
+        "/**",
+        " * Top-level container for the current browser tab or window.",
+        " *",
+        " * In a web browser, each window has a [Window] object, but within the context",
+        " * of a script, this object represents only the current window.",
+        " * Each other window, tab, and iframe has its own [Window] object.",
+        " *",
+        " * Each window contains a [Document] object, which contains all of the window's",
+        " * content.",
+        " *",
+        " * Use the top-level `window` object to access the current window.",
+        " * For example:",
+        " *",
+        " *     // Draw a scene when the window repaints.",
+        " *     drawScene(num delta) {...}",
+        " *     window.animationFrame.then(drawScene);.",
+        " *",
+        " *     // Write to the console.",
+        " *     window.console.log('Jinkies!');",
+        " *     window.console.error('Jeepers!');",
+        " *",
+        " * **Note:** This class represents only the current window, while [WindowBase]",
+        " * is a representation of any window, including other tabs, windows, and frames.",
+        " *",
+        " * ## See also",
+        " *",
+        " * * [WindowBase]",
+        " *",
+        " * ## Other resources",
+        " *",
+        " * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.",
+        " * * [Window](http://www.w3.org/TR/Window/) from the W3C.",
+        " */"
+      ],
+      "members": {
+        "alert": [
+          "/**",
+          "   * Displays a modal alert to the user.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [User prompts](https://html.spec.whatwg.org/multipage/webappapis.html#user-prompts)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "applicationCache": [
+          "/**",
+          "   * The application cache for this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [A beginner's guide to using the application",
+          "   *   cache](http://www.html5rocks.com/en/tutorials/appcache/beginner)",
+          "   *   from HTML5Rocks.",
+          "   * * [Application cache",
+          "   *   API](https://html.spec.whatwg.org/multipage/browsers.html#application-cache-api)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "confirm": [
+          "/**",
+          "   * Displays a modal OK/Cancel prompt to the user.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [User prompts](https://html.spec.whatwg.org/multipage/webappapis.html#user-prompts)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "crypto": [
+          "/**",
+          "   * Entrypoint for the browser's cryptographic functions.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Web cryptography API](http://www.w3.org/TR/WebCryptoAPI/) from W3C.",
+          "   */"
+        ],
+        "CSS": [
+          "/**",
+          "   * Entrypoint for CSS-related functions.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The CSS interface](http://dev.w3.org/csswg/css-conditional/#the-css-interface) from W3C.",
+          "   */"
+        ],
+        "defaultStatus": [
+          "/// *Deprecated*."
+        ],
+        "defaultstatus": [
+          "/// *Deprecated*."
+        ],
+        "devicemotionEvent": [
+          "/**",
+          "   * Static factory designed to expose `devicemotion` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "deviceorientationEvent": [
+          "/**",
+          "   * Static factory designed to expose `deviceorientation` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "devicePixelRatio": [
+          "/**",
+          "   * The ratio between physical pixels and logical CSS pixels.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [devicePixelRatio](http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html)",
+          "   *   from quirksmode.",
+          "   * * [More about devicePixelRatio](http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html)",
+          "   *   from quirksmode.",
+          "   */"
+        ],
+        "DOMContentLoadedEvent": [
+          "/**",
+          "   * Static factory designed to expose `contentloaded` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "find": [
+          "/**",
+          "   * Finds text in this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.find](https://developer.mozilla.org/en-US/docs/Web/API/Window.find)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "getMatchedCSSRules": [
+          "/**",
+          "   * Returns all CSS rules that apply to the element's pseudo-element.",
+          "   */"
+        ],
+        "getSelection": [
+          "/**",
+          "   * Returns the currently selected text.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.getSelection](https://developer.mozilla.org/en-US/docs/Web/API/Window.getSelection)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "hashchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `hashchange` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "history": [
+          "/**",
+          "   * The current session history for this window's newest document.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Loading web pages](https://html.spec.whatwg.org/multipage/browsers.html)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "innerHeight": [
+          "/**",
+          "   * The height of the viewport including scrollbars.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.innerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window/innerHeight)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "innerWidth": [
+          "/**",
+          "   * The width of the viewport including scrollbars.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.innerWidth](https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "localStorage": [
+          "/**",
+          "   * Storage for this window that persists across sessions.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [DOM storage guide](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage)",
+          "   *   from MDN.",
+          "   * * [The past, present & future of local storage for web",
+          "   *   applications](http://diveintohtml5.info/storage.html) from Dive Into HTML5.",
+          "   * * [Local storage specification](http://www.w3.org/TR/webstorage/#the-localstorage-attribute)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "locationbar": [
+          "/**",
+          "   * This window's location bar, which displays the URL.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface",
+          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "matchMedia": [
+          "/**",
+          "   * Returns a list of media queries for the given query string.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Testing media",
+          "   *   queries](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Testing_media_queries)",
+          "   *   from MDN.",
+          "   * * [The MediaQueryList",
+          "   *   specification](http://www.w3.org/TR/cssom-view/#the-mediaquerylist-interface) from W3C.",
+          "   */"
+        ],
+        "menubar": [
+          "/**",
+          "   * This window's menu bar, which displays menu commands.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface",
+          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "moveBy": [
+          "/**",
+          "   * Moves this window.",
+          "   *",
+          "   * x and y can be negative.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.moveBy](https://developer.mozilla.org/en-US/docs/Web/API/Window.moveBy)",
+          "   *   from MDN.",
+          "   * * [Window.moveBy](http://dev.w3.org/csswg/cssom-view/#dom-window-moveby) from W3C.",
+          "   */"
+        ],
+        "name": [
+          "/**",
+          "   * The name of this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.name](https://developer.mozilla.org/en-US/docs/Web/API/Window/name)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "navigator": [
+          "/**",
+          "   * The user agent accessing this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The navigator",
+          "   *   object](https://html.spec.whatwg.org/multipage/webappapis.html#the-navigator-object)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "offlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `offline` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "offscreenBuffering": [
+          "/**",
+          "   * Whether objects are drawn offscreen before being displayed.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [offscreenBuffering](https://webplatform.github.io/docs/dom/HTMLElement/offscreenBuffering/)",
+          "   *   from WebPlatform.org.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Window]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [Window]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [Window]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [Window]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [Window]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [Window]."
+        ],
+        "ondevicemotion": [
+          "/// Stream of `devicemotion` events handled by this [Window]."
+        ],
+        "ondeviceorientation": [
+          "/// Stream of `deviceorientation` events handled by this [Window]."
+        ],
+        "onDOMContentLoaded": [
+          "/// Stream of `contentloaded` events handled by this [Window]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [Window]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [Window]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [Window]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [Window]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [Window]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [Window]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [Window]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Window]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [Window]."
+        ],
+        "onhashchange": [
+          "/// Stream of `hashchange` events handled by this [Window]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [Window]."
+        ],
+        "oninvalid": [
+          "/// Stream of `invalid` events handled by this [Window]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [Window]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [Window]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [Window]."
+        ],
+        "onlineEvent": [
+          "/**",
+          "   * Static factory designed to expose `online` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [Window]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [Window]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [Window]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [Window]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [Window]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [Window]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [Window]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [Window]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [Window]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [Window]."
+        ],
+        "onoffline": [
+          "/// Stream of `offline` events handled by this [Window]."
+        ],
+        "ononline": [
+          "/// Stream of `online` events handled by this [Window]."
+        ],
+        "onpagehide": [
+          "/// Stream of `pagehide` events handled by this [Window]."
+        ],
+        "onpageshow": [
+          "/// Stream of `pageshow` events handled by this [Window]."
+        ],
+        "onpopstate": [
+          "/// Stream of `popstate` events handled by this [Window]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [Window]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [Window]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [Window]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [Window]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [Window]."
+        ],
+        "onstorage": [
+          "/// Stream of `storage` events handled by this [Window]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [Window]."
+        ],
+        "ontouchcancel": [
+          "/// Stream of `touchcancel` events handled by this [Window]."
+        ],
+        "ontouchend": [
+          "/// Stream of `touchend` events handled by this [Window]."
+        ],
+        "ontouchmove": [
+          "/// Stream of `touchmove` events handled by this [Window]."
+        ],
+        "ontouchstart": [
+          "/// Stream of `touchstart` events handled by this [Window]."
+        ],
+        "ontransitionend": [
+          "/// Stream of `transitionend` events handled by this [Window]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [Window]."
+        ],
+        "onwebkitAnimationEnd": [
+          "/// Stream of `animationend` events handled by this [Window]."
+        ],
+        "onwebkitAnimationIteration": [
+          "/// Stream of `animationiteration` events handled by this [Window]."
+        ],
+        "onwebkitAnimationStart": [
+          "/// Stream of `animationstart` events handled by this [Window]."
+        ],
+        "openDatabase": [
+          "/// *Deprecated.*"
+        ],
+        "outerHeight": [
+          "/**",
+          "   * The height of this window including all user interface elements.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.outerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerHeight)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "outerWidth": [
+          "/**",
+          "   * The width of the window including all user interface elements.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.outerWidth](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerWidth)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "pagehideEvent": [
+          "/**",
+          "   * Static factory designed to expose `pagehide` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "pageshowEvent": [
+          "/**",
+          "   * Static factory designed to expose `pageshow` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "pageXOffset": [
+          "/**",
+          "   * The distance this window has been scrolled horizontally.",
+          "   *",
+          "   * This attribute is an alias for [scrollX].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface",
+          "   *   specification](http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   * * [scrollX and",
+          "   *   pageXOffset](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "pageYOffset": [
+          "/**",
+          "   * The distance this window has been scrolled vertically.",
+          "   *",
+          "   * This attribute is an alias for [scrollY].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface",
+          "   *   specification](http://www.w3.org/TR/cssom-view/#screen) from W3C.",
+          "   * * [scrollY and",
+          "   *   pageYOffset](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "performance": [
+          "/**",
+          "   * Timing and navigation data for this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Measuring page load speed with navigation",
+          "   *   timeing](http://www.html5rocks.com/en/tutorials/webperformance/basics/)",
+          "   *   from HTML5Rocks.",
+          "   * * [Navigation timing",
+          "   *   specification](http://www.w3.org/TR/navigation-timing/) from W3C.",
+          "   */"
+        ],
+        "PERSISTENT": [
+          "/**",
+          "   * Indicates that file system data cannot be cleared unless given user",
+          "   * permission.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Exploring the FileSystem",
+          "   *   APIs](http://www.html5rocks.com/en/tutorials/file/filesystem/)",
+          "   *   from HTML5Rocks.",
+          "   * * [File API](http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "popstateEvent": [
+          "/**",
+          "   * Static factory designed to expose `popstate` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "print": [
+          "/**",
+          "   * Opens the print dialog for this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.print](https://developer.mozilla.org/en-US/docs/Web/API/Window.print)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "resizeBy": [
+          "/**",
+          "   * Resizes this window by an offset.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.resizeBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/resizeBy)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeTo": [
+          "/**",
+          "   * Resizes this window to a specific width and height.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.resizeTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/resizeTo)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "screen": [
+          "/**",
+          "   * Information about the screen displaying this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "screenLeft": [
+          "/**",
+          "   * The distance from the left side of the screen to the left side of this",
+          "   * window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "screenTop": [
+          "/**",
+          "   * The distance from the top of the screen to the top of this window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "screenX": [
+          "/**",
+          "   * The distance from the left side of the screen to the mouse pointer.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "screenY": [
+          "/**",
+          "   * The distance from the top of the screen to the mouse pointer.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "scroll": [
+          "/**",
+          "   * Scrolls the page horizontally and vertically to a specific point.",
+          "   *",
+          "   * This method is identical to [scrollTo].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "scrollbars": [
+          "/**",
+          "   * This window's scroll bars.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface",
+          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "scrollBy": [
+          "/**",
+          "   * Scrolls the page horizontally and vertically by an offset.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "scrollTo": [
+          "/**",
+          "   * Scrolls the page horizontally and vertically to a specific point.",
+          "   *",
+          "   * This method is identical to [scroll].",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "self": [
+          "/**",
+          "   * The current window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.self](https://developer.mozilla.org/en-US/docs/Web/API/Window.self)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "sessionStorage": [
+          "/**",
+          "   * Storage for this window that is cleared when this session ends.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [DOM storage",
+          "   *   guide](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage)",
+          "   *   from MDN.",
+          "   * * [The past, present & future of local storage for web",
+          "   *   applications](http://diveintohtml5.info/storage.html) from Dive Into HTML5.",
+          "   * * [Local storage",
+          "   *   specification](http://www.w3.org/TR/webstorage/#dom-sessionstorage) from W3C.",
+          "   */"
+        ],
+        "showModalDialog": [
+          "/**",
+          "   * Opens a new page as a modal dialog.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Dialogs implemented using separate",
+          "   *   documents](http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "speechSynthesis": [
+          "/**",
+          "   * Access to speech synthesis in the browser.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Web speech",
+          "   *   specification](https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "status": [
+          "/// *Deprecated*."
+        ],
+        "statusbar": [
+          "/**",
+          "   * This window's status bar.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface",
+          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "stop": [
+          "/**",
+          "   * Stops the window from loading.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [The Window",
+          "   *   object](http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-window-object)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "storageEvent": [
+          "/**",
+          "   * Static factory designed to expose `storage` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "styleMedia": [
+          "/**",
+          "   * Access to CSS media queries.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [StyleMedia class",
+          "   *   reference](https://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/StyleMedia/)",
+          "   *   from Safari Developer Library.",
+          "   */"
+        ],
+        "TEMPORARY": [
+          "/**",
+          "   * Indicates that file system data can be cleared at any time.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Exploring the FileSystem",
+          "   *   APIs](http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.",
+          "   * * [File API](http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "toolbar": [
+          "/**",
+          "   * This window's tool bar.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Browser interface",
+          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
+          "   *   from WHATWG.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationEndEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationend` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationIterationEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationiteration` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitAnimationStartEvent": [
+          "/**",
+          "   * Static factory designed to expose `animationstart` events to event",
+          "   * handlers that are not necessarily instances of [Window].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "webkitResolveLocalFileSystemURL": [
+          "/**",
+          "   * Asynchronously retrieves a local filesystem entry.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Obtaining access to file system entry",
+          "   *   points](http://www.w3.org/TR/file-system-api/#obtaining-access-to-file-system-entry-points)",
+          "   * from W3C.",
+          "   */"
+        ],
+        "window": [
+          "/**",
+          "   * The current window.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [Window.window](https://developer.mozilla.org/en-US/docs/Web/API/Window.window)",
+          "   *   from MDN.",
+          "   */"
+        ]
+      }
+    },
+    "Worker": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Worker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "messageEvent": [
+          "/**",
+          "   * Static factory designed to expose `message` events to event",
+          "   * handlers that are not necessarily instances of [Worker].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Worker]."
+        ],
+        "onmessage": [
+          "/// Stream of `message` events handled by this [Worker]."
+        ]
+      }
+    },
+    "WorkerGlobalScope": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [WorkerGlobalScope].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [WorkerGlobalScope]."
+        ]
+      }
+    },
+    "XMLHttpRequest": {
+      "members": {
+        "abort": [
+          "/**",
+          "   * Stop the current request.",
+          "   *",
+          "   * The request can only be stopped if readyState is `HEADERS_RECEIVED` or",
+          "   * `LOADING`. If this method is not in the process of being sent, the method",
+          "   * has no effect.",
+          "   */"
+        ],
+        "getAllResponseHeaders": [
+          "/**",
+          "   * Retrieve all the response headers from a request.",
+          "   *",
+          "   * `null` if no headers have been received. For multipart requests,",
+          "   * `getAllResponseHeaders` will return the response headers for the current",
+          "   * part of the request.",
+          "   *",
+          "   * See also [HTTP response",
+          "   * headers](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields)",
+          "   * for a list of common response headers.",
+          "   */"
+        ],
+        "getResponseHeader": [
+          "/**",
+          "   * Return the response header named `header`, or null if not found.",
+          "   *",
+          "   * See also [HTTP response",
+          "   * headers](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields)",
+          "   * for a list of common response headers.",
+          "   */"
+        ],
+        "onreadystatechange": [
+          "/// Stream of `readystatechange` events handled by this [HttpRequest].",
+          "/**",
+          "   * Event listeners to be notified every time the [HttpRequest]",
+          "   * object's `readyState` changes values.",
+          "   */"
+        ],
+        "open": [
+          "/**",
+          "   * Specify the desired `url`, and `method` to use in making the request.",
+          "   *",
+          "   * By default the request is done asynchronously, with no user or password",
+          "   * authentication information. If `async` is false, the request will be send",
+          "   * synchronously.",
+          "   *",
+          "   * Calling `open` again on a currently active request is equivalent to",
+          "   * calling `abort`.",
+          "   *",
+          "   * Note: Most simple HTTP requests can be accomplished using the [getString],",
+          "   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this",
+          "   * `open` method is intended only for more complex HTTP requests where",
+          "   * finer-grained control is needed.",
+          "   */"
+        ],
+        "overrideMimeType": [
+          "/**",
+          "   * Specify a particular MIME type (such as `text/xml`) desired for the",
+          "   * response.",
+          "   *",
+          "   * This value must be set before the request has been sent. See also the list",
+          "   * of [IANA Official MIME types](https://www.iana.org/assignments/media-types/media-types.xhtml).",
+          "   */"
+        ],
+        "readyState": [
+          "/**",
+          "   * Indicator of the current state of the request:",
+          "   *",
+          "   * <table>",
+          "   *   <tr>",
+          "   *     <td>Value</td>",
+          "   *     <td>State</td>",
+          "   *     <td>Meaning</td>",
+          "   *   </tr>",
+          "   *   <tr>",
+          "   *     <td>0</td>",
+          "   *     <td>unsent</td>",
+          "   *     <td><code>open()</code> has not yet been called</td>",
+          "   *   </tr>",
+          "   *   <tr>",
+          "   *     <td>1</td>",
+          "   *     <td>opened</td>",
+          "   *     <td><code>send()</code> has not yet been called</td>",
+          "   *   </tr>",
+          "   *   <tr>",
+          "   *     <td>2</td>",
+          "   *     <td>headers received</td>",
+          "   *     <td><code>sent()</code> has been called; response headers and <code>status</code> are available</td>",
+          "   *   </tr>",
+          "   *   <tr>",
+          "   *     <td>3</td> <td>loading</td> <td><code>responseText</code> holds some data</td>",
+          "   *   </tr>",
+          "   *   <tr>",
+          "   *     <td>4</td> <td>done</td> <td>request is complete</td>",
+          "   *   </tr>",
+          "   * </table>",
+          "   */"
+        ],
+        "readystatechangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `readystatechange` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "response": [
+          "/**",
+          "   * The data received as a reponse from the request.",
+          "   *",
+          "   * The data could be in the",
+          "   * form of a [String], [ByteBuffer], [Document], [Blob], or json (also a",
+          "   * [String]). `null` indicates request failure.",
+          "   */"
+        ],
+        "responseText": [
+          "/**",
+          "   * The response in String form or empty String on failure.",
+          "   */"
+        ],
+        "responseType": [
+          "/**",
+          "   * [String] telling the server the desired response format.",
+          "   *",
+          "   * Default is `String`.",
+          "   * Other options are one of 'arraybuffer', 'blob', 'document', 'json',",
+          "   * 'text'. Some newer browsers will throw NS_ERROR_DOM_INVALID_ACCESS_ERR if",
+          "   * `responseType` is set while performing a synchronous request.",
+          "   *",
+          "   * See also: [MDN",
+          "   * responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype)",
+          "   */"
+        ],
+        "responseXML": [
+          "/**",
+          "   * The request response, or null on failure.",
+          "   *",
+          "   * The response is processed as",
+          "   * `text/xml` stream, unless responseType = 'document' and the request is",
+          "   * synchronous.",
+          "   */"
+        ],
+        "send": [
+          "/**",
+          "   * Send the request with any given `data`.",
+          "   *",
+          "   * Note: Most simple HTTP requests can be accomplished using the [getString],",
+          "   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this",
+          "   * `send` method is intended only for more complex HTTP requests where",
+          "   * finer-grained control is needed.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [XMLHttpRequest.send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)",
+          "   *   from MDN.",
+          "   */"
+        ],
+        "setRequestHeader": [
+          "/**",
+          "   * Sets the value of an HTTP request header.",
+          "   *",
+          "   * This method should be called after the request is opened, but before",
+          "   * the request is sent.",
+          "   *",
+          "   * Multiple calls with the same header will combine all their values into a",
+          "   * single header.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [XMLHttpRequest.setRequestHeader](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#setRequestHeader())",
+          "   *   from MDN.",
+          "   * * [The setRequestHeader()",
+          "   *   method](http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "status": [
+          "/**",
+          "   * The HTTP result code from the request (200, 404, etc).",
+          "   * See also: [HTTP Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)",
+          "   */"
+        ],
+        "statusText": [
+          "/**",
+          "   * The request response string (such as \\\"OK\\\").",
+          "   * See also: [HTTP Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)",
+          "   */"
+        ],
+        "timeout": [
+          "/**",
+          "   * Length of time in milliseconds before a request is automatically",
+          "   * terminated.",
+          "   *",
+          "   * When the time has passed, a [HttpRequestEventTarget.timeoutEvent] is",
+          "   * dispatched.",
+          "   *",
+          "   * If [timeout] is set to 0, then the request will not time out.",
+          "   *",
+          "   * ## Other resources",
+          "   *",
+          "   * * [XMLHttpRequest.timeout](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-timeout)",
+          "   *   from MDN.",
+          "   * * [The timeout attribute](http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)",
+          "   *   from W3C.",
+          "   */"
+        ],
+        "upload": [
+          "/**",
+          "   * [EventTarget] that can hold listeners to track the progress of the request.",
+          "   */"
+        ],
+        "withCredentials": [
+          "/**",
+          "   * True if cross-site requests should use credentials such as cookies",
+          "   * or authorization headers; false otherwise.",
+          "   *",
+          "   * This value is ignored for same-site requests.",
+          "   */"
+        ],
+        "XMLHttpRequest": [
+          "/**",
+          "   * General constructor for any type of request (GET, POST, etc).",
+          "   *",
+          "   * This call is used in conjunction with [open]:",
+          "   *",
+          "   *     var request = new HttpRequest();",
+          "   *     request.open('GET', 'http://dartlang.org');",
+          "   *     request.onLoad.listen((event) => print(",
+          "   *         'Request complete ${event.target.reponseText}'));",
+          "   *     request.send();",
+          "   *",
+          "   * is the (more verbose) equivalent of",
+          "   *",
+          "   *     HttpRequest.getString('http://dartlang.org').then(",
+          "   *         (result) => print('Request complete: $result'));",
+          "   */"
+        ]
+      }
+    },
+    "XMLHttpRequestEventTarget": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadendEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadend` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `loadstart` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onloadend": [
+          "/// Stream of `loadend` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onloadstart": [
+          "/// Stream of `loadstart` events handled by this [HttpRequestEventTarget]."
+        ],
+        "onprogress": [
+          "/// Stream of `progress` events handled by this [HttpRequestEventTarget]."
+        ],
+        "ontimeout": [
+          "/// Stream of `timeout` events handled by this [HttpRequestEventTarget]."
+        ],
+        "progressEvent": [
+          "/**",
+          "   * Static factory designed to expose `progress` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "timeoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `timeout` events to event",
+          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    }
+  },
+  "dart.dom.indexed_db": {
+    "IDBDatabase": {
+      "comment": [
+        "/**",
+        " * An indexed database object for storing client-side data",
+        " * in web apps.",
+        " */"
+      ],
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "closeEvent": [
+          "/**",
+          "   * Static factory designed to expose `close` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Database]."
+        ],
+        "onclose": [
+          "/// Stream of `close` events handled by this [Database]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Database]."
+        ],
+        "onversionchange": [
+          "/// Stream of `versionchange` events handled by this [Database]."
+        ],
+        "versionchangeEvent": [
+          "/**",
+          "   * Static factory designed to expose `versionchange` events to event",
+          "   * handlers that are not necessarily instances of [Database].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBOpenDBRequest": {
+      "members": {
+        "blockedEvent": [
+          "/**",
+          "   * Static factory designed to expose `blocked` events to event",
+          "   * handlers that are not necessarily instances of [OpenDBRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onblocked": [
+          "/// Stream of `blocked` events handled by this [OpenDBRequest]."
+        ],
+        "onupgradeneeded": [
+          "/// Stream of `upgradeneeded` events handled by this [OpenDBRequest]."
+        ],
+        "upgradeneededEvent": [
+          "/**",
+          "   * Static factory designed to expose `upgradeneeded` events to event",
+          "   * handlers that are not necessarily instances of [OpenDBRequest].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBRequest": {
+      "members": {
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Request].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Request]."
+        ],
+        "onsuccess": [
+          "/// Stream of `success` events handled by this [Request]."
+        ],
+        "successEvent": [
+          "/**",
+          "   * Static factory designed to expose `success` events to event",
+          "   * handlers that are not necessarily instances of [Request].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    },
+    "IDBTransaction": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "completeEvent": [
+          "/**",
+          "   * Static factory designed to expose `complete` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [Transaction].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [Transaction]."
+        ],
+        "oncomplete": [
+          "/// Stream of `complete` events handled by this [Transaction]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [Transaction]."
+        ]
+      }
+    }
+  },
+  "dart.dom.svg": {
+    "SVGElementInstance": {
+      "members": {
+        "abortEvent": [
+          "/**",
+          "   * Static factory designed to expose `abort` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecopyEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecopy` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforecutEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforecut` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "beforepasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `beforepaste` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "blurEvent": [
+          "/**",
+          "   * Static factory designed to expose `blur` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "changeEvent": [
+          "/**",
+          "   * Static factory designed to expose `change` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "clickEvent": [
+          "/**",
+          "   * Static factory designed to expose `click` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "contextmenuEvent": [
+          "/**",
+          "   * Static factory designed to expose `contextmenu` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "copyEvent": [
+          "/**",
+          "   * Static factory designed to expose `copy` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "cutEvent": [
+          "/**",
+          "   * Static factory designed to expose `cut` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dblclickEvent": [
+          "/**",
+          "   * Static factory designed to expose `doubleclick` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragendEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragend` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragenter` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragEvent": [
+          "/**",
+          "   * Static factory designed to expose `drag` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragleave` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragover` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dragstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `dragstart` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "dropEvent": [
+          "/**",
+          "   * Static factory designed to expose `drop` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "errorEvent": [
+          "/**",
+          "   * Static factory designed to expose `error` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "focusEvent": [
+          "/**",
+          "   * Static factory designed to expose `focus` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "inputEvent": [
+          "/**",
+          "   * Static factory designed to expose `input` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keydownEvent": [
+          "/**",
+          "   * Static factory designed to expose `keydown` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keypressEvent": [
+          "/**",
+          "   * Static factory designed to expose `keypress` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "keyupEvent": [
+          "/**",
+          "   * Static factory designed to expose `keyup` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "loadEvent": [
+          "/**",
+          "   * Static factory designed to expose `load` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousedownEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousedown` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseenterEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseenter` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseleaveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseleave` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousemoveEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousemove` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoutEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseout` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseoverEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseover` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mouseupEvent": [
+          "/**",
+          "   * Static factory designed to expose `mouseup` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "mousewheelEvent": [
+          "/**",
+          "   * Static factory designed to expose `mousewheel` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onabort": [
+          "/// Stream of `abort` events handled by this [ElementInstance]."
+        ],
+        "onbeforecopy": [
+          "/// Stream of `beforecopy` events handled by this [ElementInstance]."
+        ],
+        "onbeforecut": [
+          "/// Stream of `beforecut` events handled by this [ElementInstance]."
+        ],
+        "onbeforepaste": [
+          "/// Stream of `beforepaste` events handled by this [ElementInstance]."
+        ],
+        "onblur": [
+          "/// Stream of `blur` events handled by this [ElementInstance]."
+        ],
+        "onchange": [
+          "/// Stream of `change` events handled by this [ElementInstance]."
+        ],
+        "onclick": [
+          "/// Stream of `click` events handled by this [ElementInstance]."
+        ],
+        "oncontextmenu": [
+          "/// Stream of `contextmenu` events handled by this [ElementInstance]."
+        ],
+        "oncopy": [
+          "/// Stream of `copy` events handled by this [ElementInstance]."
+        ],
+        "oncut": [
+          "/// Stream of `cut` events handled by this [ElementInstance]."
+        ],
+        "ondblclick": [
+          "/// Stream of `doubleclick` events handled by this [ElementInstance]."
+        ],
+        "ondrag": [
+          "/// Stream of `drag` events handled by this [ElementInstance]."
+        ],
+        "ondragend": [
+          "/// Stream of `dragend` events handled by this [ElementInstance]."
+        ],
+        "ondragenter": [
+          "/// Stream of `dragenter` events handled by this [ElementInstance]."
+        ],
+        "ondragleave": [
+          "/// Stream of `dragleave` events handled by this [ElementInstance]."
+        ],
+        "ondragover": [
+          "/// Stream of `dragover` events handled by this [ElementInstance]."
+        ],
+        "ondragstart": [
+          "/// Stream of `dragstart` events handled by this [ElementInstance]."
+        ],
+        "ondrop": [
+          "/// Stream of `drop` events handled by this [ElementInstance]."
+        ],
+        "onerror": [
+          "/// Stream of `error` events handled by this [ElementInstance]."
+        ],
+        "onfocus": [
+          "/// Stream of `focus` events handled by this [ElementInstance]."
+        ],
+        "oninput": [
+          "/// Stream of `input` events handled by this [ElementInstance]."
+        ],
+        "onkeydown": [
+          "/// Stream of `keydown` events handled by this [ElementInstance]."
+        ],
+        "onkeypress": [
+          "/// Stream of `keypress` events handled by this [ElementInstance]."
+        ],
+        "onkeyup": [
+          "/// Stream of `keyup` events handled by this [ElementInstance]."
+        ],
+        "onload": [
+          "/// Stream of `load` events handled by this [ElementInstance]."
+        ],
+        "onmousedown": [
+          "/// Stream of `mousedown` events handled by this [ElementInstance]."
+        ],
+        "onmouseenter": [
+          "/// Stream of `mouseenter` events handled by this [ElementInstance]."
+        ],
+        "onmouseleave": [
+          "/// Stream of `mouseleave` events handled by this [ElementInstance]."
+        ],
+        "onmousemove": [
+          "/// Stream of `mousemove` events handled by this [ElementInstance]."
+        ],
+        "onmouseout": [
+          "/// Stream of `mouseout` events handled by this [ElementInstance]."
+        ],
+        "onmouseover": [
+          "/// Stream of `mouseover` events handled by this [ElementInstance]."
+        ],
+        "onmouseup": [
+          "/// Stream of `mouseup` events handled by this [ElementInstance]."
+        ],
+        "onmousewheel": [
+          "/// Stream of `mousewheel` events handled by this [ElementInstance]."
+        ],
+        "onpaste": [
+          "/// Stream of `paste` events handled by this [ElementInstance]."
+        ],
+        "onreset": [
+          "/// Stream of `reset` events handled by this [ElementInstance]."
+        ],
+        "onresize": [
+          "/// Stream of `resize` events handled by this [ElementInstance]."
+        ],
+        "onscroll": [
+          "/// Stream of `scroll` events handled by this [ElementInstance]."
+        ],
+        "onsearch": [
+          "/// Stream of `search` events handled by this [ElementInstance]."
+        ],
+        "onselect": [
+          "/// Stream of `select` events handled by this [ElementInstance]."
+        ],
+        "onselectstart": [
+          "/// Stream of `selectstart` events handled by this [ElementInstance]."
+        ],
+        "onsubmit": [
+          "/// Stream of `submit` events handled by this [ElementInstance]."
+        ],
+        "onunload": [
+          "/// Stream of `unload` events handled by this [ElementInstance]."
+        ],
+        "pasteEvent": [
+          "/**",
+          "   * Static factory designed to expose `paste` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resetEvent": [
+          "/**",
+          "   * Static factory designed to expose `reset` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "resizeEvent": [
+          "/**",
+          "   * Static factory designed to expose `resize` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "scrollEvent": [
+          "/**",
+          "   * Static factory designed to expose `scroll` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "searchEvent": [
+          "/**",
+          "   * Static factory designed to expose `search` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectEvent": [
+          "/**",
+          "   * Static factory designed to expose `select` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "selectstartEvent": [
+          "/**",
+          "   * Static factory designed to expose `selectstart` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "submitEvent": [
+          "/**",
+          "   * Static factory designed to expose `submit` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "unloadEvent": [
+          "/**",
+          "   * Static factory designed to expose `unload` events to event",
+          "   * handlers that are not necessarily instances of [ElementInstance].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ]
+      }
+    }
+  },
+  "dart.dom.web_audio": {
+    "AudioBufferSourceNode": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [AudioBufferSourceNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [AudioBufferSourceNode]."
+        ]
+      }
+    },
+    "AudioContext": {
+      "members": {
+        "completeEvent": [
+          "/**",
+          "   * Static factory designed to expose `complete` events to event",
+          "   * handlers that are not necessarily instances of [AudioContext].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "oncomplete": [
+          "/// Stream of `complete` events handled by this [AudioContext]."
+        ]
+      }
+    },
+    "OscillatorNode": {
+      "members": {
+        "endedEvent": [
+          "/**",
+          "   * Static factory designed to expose `ended` events to event",
+          "   * handlers that are not necessarily instances of [OscillatorNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onended": [
+          "/// Stream of `ended` events handled by this [OscillatorNode]."
+        ]
+      }
+    },
+    "ScriptProcessorNode": {
+      "members": {
+        "audioprocessEvent": [
+          "/**",
+          "   * Static factory designed to expose `audioprocess` events to event",
+          "   * handlers that are not necessarily instances of [ScriptProcessorNode].",
+          "   *",
+          "   * See [EventStreamProvider] for usage information.",
+          "   */"
+        ],
+        "onaudioprocess": [
+          "/// Stream of `audioprocess` events handled by this [ScriptProcessorNode].",
+          "/**",
+          "   * Get a Stream that fires events when AudioProcessingEvents occur.",
+          "   * This particular stream is special in that it only allows one listener to a",
+          "   * given stream. Converting the returned [Stream.asBroadcastStream] will",
+          "   * likely ruin the soft-real-time properties which which these events are",
+          "   * fired and can be processed.",
+          "   */"
+        ]
+      }
+    }
+  },
+  "dart.dom.web_gl": {
+    "WebGLContextAttributes": {
+      "comment": [
+        "/**",
+        " * The properties of a WebGL rendering context.",
+        " *",
+        " * If [alpha] is `true`, then the context has an alpha channel.",
+        " *",
+        " * If [antialias] is `true`, then antialiasing is performed by the browser, but",
+        " * only if the browser's implementation of WebGL supports antialiasing.",
+        " *",
+        " * If [depth] is `true`, then the context has a depth buffer of at least 16",
+        " * bits.",
+        " *",
+        " * If [premultipliedAlpha] is `true`, then the context's colors are assumed to",
+        " * be premultiplied. This means that color values are assumed to have  been",
+        " * multiplied by their alpha values. If [alpha] is `false`, then this flag is",
+        " * ignored.",
+        " *",
+        " * If [preserveDrawingBuffer] is `false`, then all contents of the context are",
+        " * cleared. If `true`, then all values will remain until changed or cleared.",
+        " *",
+        " * If [stencil] is `true`, then the context has a stencil buffer of at least 8",
+        " * bits.",
+        " */"
+      ]
+    },
+    "WebGLRenderingContext": {
+      "members": {
+      }
+    }
+  },
+  "dart.dom.web_sql": {
+    "Database": {
+      "members": {
+        "changeVersion": [
+          "/**",
+          "   * Atomically update the database version to [newVersion], asynchronously",
+          "   * running [callback] on the [SqlTransaction] representing this",
+          "   * [changeVersion] transaction.",
+          "   *",
+          "   * If [callback] runs successfully, then [successCallback] is called.",
+          "   * Otherwise, [errorCallback] is called.",
+          "   *",
+          "   * [oldVersion] should match the database's current [version] exactly.",
+          "   *",
+          "   * See also:",
+          "   *",
+          "   * * [Database.changeVersion](http://www.w3.org/TR/webdatabase/#dom-database-changeversion) from W3C.",
+          "   */"
+        ]
+      }
+    }
+  }
+}
diff --git a/tools/dom/docs/bin/docs.dart b/tools/dom/docs/bin/docs.dart
deleted file mode 100644
index 147401f..0000000
--- a/tools/dom/docs/bin/docs.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This program reads the HTML libraries from [LIB_PATH] and outputs their
- * documentation to [JSON_PATH].
- */
-
-import 'dart:io';
-import 'dart:async';
-
-import 'package:path/path.dart' as path;
-
-import '../lib/docs.dart';
-
-final String json_path = Platform.script.resolve('../docs.json').toFilePath();
-final String lib_uri = Platform.script.resolve('../../../../sdk').toString();
-
-main() {
-  print('Converting HTML docs from $lib_uri to $json_path.');
-
-  convert(lib_uri, json_path).then((bool anyErrors) {
-    print('Converted HTML docs ${anyErrors ? "with": "without"}'
-        ' errors.');
-  });
-}
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
deleted file mode 100644
index 83d7a05..0000000
--- a/tools/dom/docs/docs.json
+++ /dev/null
@@ -1,5225 +0,0 @@
-{
-  "dart.dom.html": {
-    "AbstractWorker": {
-      "members": {
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [AbstractWorker].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [AbstractWorker]."
-        ]
-      }
-    },
-    "ApplicationCache": {
-      "comment": [
-        "/**",
-        " * ApplicationCache is accessed via [Window.applicationCache].",
-        " */"
-      ],
-      "members": {
-        "cachedEvent": [
-          "/**",
-          "   * Static factory designed to expose `cached` events to event",
-          "   * handlers that are not necessarily instances of [ApplicationCache].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "checkingEvent": [
-          "/**",
-          "   * Static factory designed to expose `checking` events to event",
-          "   * handlers that are not necessarily instances of [ApplicationCache].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "downloadingEvent": [
-          "/**",
-          "   * Static factory designed to expose `downloading` events to event",
-          "   * handlers that are not necessarily instances of [ApplicationCache].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [ApplicationCache].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "noupdateEvent": [
-          "/**",
-          "   * Static factory designed to expose `noupdate` events to event",
-          "   * handlers that are not necessarily instances of [ApplicationCache].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "obsoleteEvent": [
-          "/**",
-          "   * Static factory designed to expose `obsolete` events to event",
-          "   * handlers that are not necessarily instances of [ApplicationCache].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "oncached": [
-          "/// Stream of `cached` events handled by this [ApplicationCache]."
-        ],
-        "onchecking": [
-          "/// Stream of `checking` events handled by this [ApplicationCache]."
-        ],
-        "ondownloading": [
-          "/// Stream of `downloading` events handled by this [ApplicationCache]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [ApplicationCache]."
-        ],
-        "onnoupdate": [
-          "/// Stream of `noupdate` events handled by this [ApplicationCache]."
-        ],
-        "onobsolete": [
-          "/// Stream of `obsolete` events handled by this [ApplicationCache]."
-        ],
-        "onprogress": [
-          "/// Stream of `progress` events handled by this [ApplicationCache]."
-        ],
-        "onupdateready": [
-          "/// Stream of `updateready` events handled by this [ApplicationCache]."
-        ],
-        "progressEvent": [
-          "/**",
-          "   * Static factory designed to expose `progress` events to event",
-          "   * handlers that are not necessarily instances of [ApplicationCache].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "updatereadyEvent": [
-          "/**",
-          "   * Static factory designed to expose `updateready` events to event",
-          "   * handlers that are not necessarily instances of [ApplicationCache].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "CanvasGradient": {
-      "comment": [
-        "/**",
-        " * An opaque canvas object representing a gradient.",
-        " *",
-        " * Created by calling the methods",
-        " * [CanvasRenderingContext2D.createLinearGradient] or",
-        " * [CanvasRenderingContext2D.createRadialGradient] on a",
-        " * [CanvasRenderingContext2D] object.",
-        " *",
-        " * Example usage:",
-        " *",
-        " *     var canvas = new CanvasElement(width: 600, height: 600);",
-        " *     var ctx = canvas.context2D;",
-        " *     ctx.clearRect(0, 0, 600, 600);",
-        " *     ctx.save();",
-        " *     // Create radial gradient.",
-        " *     CanvasGradient gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, 600);",
-        " *     gradient.addColorStop(0, '#000');",
-        " *     gradient.addColorStop(1, 'rgb(255, 255, 255)');",
-        " *     // Assign gradients to fill.",
-        " *     ctx.fillStyle = gradient;",
-        " *     // Draw a rectangle with a gradient fill.",
-        " *     ctx.fillRect(0, 0, 600, 600);",
-        " *     ctx.save();",
-        " *     document.body.children.add(canvas);",
-        " *",
-        " * See also:",
-        " *",
-        " * * [CanvasGradient](https://developer.mozilla.org/en-US/docs/DOM/CanvasGradient) from MDN.",
-        " * * [CanvasGradient](https://html.spec.whatwg.org/multipage/scripting.html#canvasgradient)",
-        " *   from WHATWG.",
-        " * * [CanvasGradient](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvasgradient) from W3C.",
-        " */"
-      ],
-      "members": {
-        "addColorStop": [
-          "/**",
-          "   * Adds a color stop to this gradient at the offset.",
-          "   *",
-          "   * The [offset] can range between 0.0 and 1.0.",
-          "   *",
-          "   * See also:",
-          "   *",
-          "   * * [Multiple Color Stops](https://developer.mozilla.org/en-US/docs/CSS/linear-gradient#Gradient_with_multiple_color_stops) from MDN.",
-          "   */"
-        ]
-      }
-    },
-    "CanvasPattern": {
-      "comment": [
-        "/**",
-        " * An opaque object representing a pattern of image, canvas, or video.",
-        " *",
-        " * Created by calling [CanvasRenderingContext2D.createPattern] on a",
-        " * [CanvasRenderingContext2D] object.",
-        " *",
-        " * Example usage:",
-        " *",
-        " *     var canvas = new CanvasElement(width: 600, height: 600);",
-        " *     var ctx = canvas.context2D;",
-        " *     var img = new ImageElement();",
-        " *     // Image src needs to be loaded before pattern is applied.",
-        " *     img.onLoad.listen((event) {",
-        " *       // When the image is loaded, create a pattern",
-        " *       // from the ImageElement.",
-        " *       CanvasPattern pattern = ctx.createPattern(img, 'repeat');",
-        " *       ctx.rect(0, 0, canvas.width, canvas.height);",
-        " *       ctx.fillStyle = pattern;",
-        " *       ctx.fill();",
-        " *     });",
-        " *     img.src = \"images/foo.jpg\";",
-        " *     document.body.children.add(canvas);",
-        " *",
-        " * See also:",
-        " * * [CanvasPattern](https://developer.mozilla.org/en-US/docs/DOM/CanvasPattern) from MDN.",
-        " * * [CanvasPattern](https://html.spec.whatwg.org/multipage/scripting.html#canvaspattern)",
-        " *   from WHATWG.",
-        " * * [CanvasPattern](http://www.w3.org/TR/2010/WD-2dcontext-20100304/#canvaspattern) from W3C.",
-        " */"
-      ]
-    },
-    "CanvasRenderingContext": {
-      "comment": [
-        "/**",
-        " * A rendering context for a canvas element.",
-        " *",
-        " * This context is extended by [CanvasRenderingContext2D] and",
-        " * [WebGLRenderingContext].",
-        " */"
-      ],
-      "members": {
-        "canvas": [
-          "/// Reference to the canvas element to which this context belongs."
-        ]
-      }
-    },
-    "CanvasRenderingContext2D": {
-      "members": {
-        "currentPath": [
-          "/**",
-          "   * The current default path of this canvas context, if there is one.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Current default",
-          "   *   path](https://html.spec.whatwg.org/multipage/scripting.html#current-default-path)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "imageSmoothingEnabled": [
-          "/**",
-          "   * Whether images and patterns on this canvas will be smoothed when this",
-          "   * canvas is scaled.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Image",
-          "   *   smoothing](https://html.spec.whatwg.org/multipage/scripting.html#image-smoothing)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "webkitBackingStorePixelRatio": [
-          "/**",
-          "   * The ratio between this canvas' backing store dimensions and the canvas'",
-          "   * logical dimensions.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [High DPI Canvas",
-          "   *   tutorial](http://www.html5rocks.com/en/tutorials/canvas/hidpi/)",
-          "   *   from HTML5Rocks.",
-          "   */"
-        ]
-      }
-    },
-    "Clipboard": {
-      "members": {
-        "getData": [
-          "/**",
-          "   * Gets the data for the specified type.",
-          "   *",
-          "   * The data is only available from within a drop operation (such as an",
-          "   * [Element.onDrop] event) and will return null before the event is",
-          "   * triggered.",
-          "   *",
-          "   * Data transfer is prohibited across domains. If a drag originates",
-          "   * from content from another domain or protocol (HTTP vs HTTPS) then the",
-          "   * data cannot be accessed.",
-          "   *",
-          "   * The [type] can have values such as:",
-          "   *",
-          "   * * `'Text'`",
-          "   * * `'URL'`",
-          "   */"
-        ]
-      }
-    },
-    "DedicatedWorkerGlobalScope": {
-      "members": {
-        "messageEvent": [
-          "/**",
-          "   * Static factory designed to expose `message` events to event",
-          "   * handlers that are not necessarily instances of [DedicatedWorkerGlobalScope].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onmessage": [
-          "/// Stream of `message` events handled by this [DedicatedWorkerGlobalScope]."
-        ]
-      }
-    },
-    "Document": {
-      "comment": [
-        "/**",
-        " * The base class for all documents.",
-        " *",
-        " * Each web page loaded in the browser has its own [Document] object, which is",
-        " * typically an [HtmlDocument].",
-        " *",
-        " * If you aren't comfortable with DOM concepts, see the Dart tutorial",
-        " * [Target 2: Connect Dart & HTML](http://www.dartlang.org/docs/tutorials/connect-dart-html/).",
-        " */"
-      ],
-      "members": {
-        "onabort": [
-          "/// Stream of `abort` events handled by this [Document]."
-        ],
-        "onbeforecopy": [
-          "/// Stream of `beforecopy` events handled by this [Document]."
-        ],
-        "onbeforecut": [
-          "/// Stream of `beforecut` events handled by this [Document]."
-        ],
-        "onbeforepaste": [
-          "/// Stream of `beforepaste` events handled by this [Document]."
-        ],
-        "onblur": [
-          "/// Stream of `blur` events handled by this [Document]."
-        ],
-        "onchange": [
-          "/// Stream of `change` events handled by this [Document]."
-        ],
-        "onclick": [
-          "/// Stream of `click` events handled by this [Document]."
-        ],
-        "oncontextmenu": [
-          "/// Stream of `contextmenu` events handled by this [Document]."
-        ],
-        "oncopy": [
-          "/// Stream of `copy` events handled by this [Document]."
-        ],
-        "oncut": [
-          "/// Stream of `cut` events handled by this [Document]."
-        ],
-        "ondblclick": [
-          "/// Stream of `doubleclick` events handled by this [Document]."
-        ],
-        "ondrag": [
-          "/// Stream of `drag` events handled by this [Document]."
-        ],
-        "ondragend": [
-          "/// Stream of `dragend` events handled by this [Document]."
-        ],
-        "ondragenter": [
-          "/// Stream of `dragenter` events handled by this [Document]."
-        ],
-        "ondragleave": [
-          "/// Stream of `dragleave` events handled by this [Document]."
-        ],
-        "ondragover": [
-          "/// Stream of `dragover` events handled by this [Document]."
-        ],
-        "ondragstart": [
-          "/// Stream of `dragstart` events handled by this [Document]."
-        ],
-        "ondrop": [
-          "/// Stream of `drop` events handled by this [Document]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [Document]."
-        ],
-        "onfocus": [
-          "/// Stream of `focus` events handled by this [Document]."
-        ],
-        "oninput": [
-          "/// Stream of `input` events handled by this [Document]."
-        ],
-        "oninvalid": [
-          "/// Stream of `invalid` events handled by this [Document]."
-        ],
-        "onkeydown": [
-          "/// Stream of `keydown` events handled by this [Document]."
-        ],
-        "onkeypress": [
-          "/// Stream of `keypress` events handled by this [Document]."
-        ],
-        "onkeyup": [
-          "/// Stream of `keyup` events handled by this [Document]."
-        ],
-        "onload": [
-          "/// Stream of `load` events handled by this [Document]."
-        ],
-        "onmousedown": [
-          "/// Stream of `mousedown` events handled by this [Document]."
-        ],
-        "onmouseenter": [
-          "/// Stream of `mouseenter` events handled by this [Document]."
-        ],
-        "onmouseleave": [
-          "/// Stream of `mouseleave` events handled by this [Document]."
-        ],
-        "onmousemove": [
-          "/// Stream of `mousemove` events handled by this [Document]."
-        ],
-        "onmouseout": [
-          "/// Stream of `mouseout` events handled by this [Document]."
-        ],
-        "onmouseover": [
-          "/// Stream of `mouseover` events handled by this [Document]."
-        ],
-        "onmouseup": [
-          "/// Stream of `mouseup` events handled by this [Document]."
-        ],
-        "onmousewheel": [
-          "/// Stream of `mousewheel` events handled by this [Document]."
-        ],
-        "onpaste": [
-          "/// Stream of `paste` events handled by this [Document]."
-        ],
-        "onreadystatechange": [
-          "/// Stream of `readystatechange` events handled by this [Document]."
-        ],
-        "onreset": [
-          "/// Stream of `reset` events handled by this [Document]."
-        ],
-        "onscroll": [
-          "/// Stream of `scroll` events handled by this [Document]."
-        ],
-        "onsearch": [
-          "/// Stream of `search` events handled by this [Document]."
-        ],
-        "onsecuritypolicyviolation": [
-          "/// Stream of `securitypolicyviolation` events handled by this [Document]."
-        ],
-        "onselect": [
-          "/// Stream of `select` events handled by this [Document]."
-        ],
-        "onselectionchange": [
-          "/// Stream of `selectionchange` events handled by this [Document]."
-        ],
-        "onselectstart": [
-          "/// Stream of `selectstart` events handled by this [Document]."
-        ],
-        "onsubmit": [
-          "/// Stream of `submit` events handled by this [Document]."
-        ],
-        "ontouchcancel": [
-          "/// Stream of `touchcancel` events handled by this [Document]."
-        ],
-        "ontouchend": [
-          "/// Stream of `touchend` events handled by this [Document]."
-        ],
-        "ontouchmove": [
-          "/// Stream of `touchmove` events handled by this [Document]."
-        ],
-        "ontouchstart": [
-          "/// Stream of `touchstart` events handled by this [Document]."
-        ],
-        "onwebkitfullscreenchange": [
-          "/// Stream of `fullscreenchange` events handled by this [Document]."
-        ],
-        "onwebkitfullscreenerror": [
-          "/// Stream of `fullscreenerror` events handled by this [Document]."
-        ],
-        "onwebkitpointerlockchange": [
-          "/// Stream of `pointerlockchange` events handled by this [Document]."
-        ],
-        "onwebkitpointerlockerror": [
-          "/// Stream of `pointerlockerror` events handled by this [Document]."
-        ],
-        "querySelector": [
-          "/**",
-          "   * Finds the first descendant element of this document that matches the",
-          "   * specified group of selectors.",
-          "   *",
-          "   * Unless your webpage contains multiple documents, the top-level",
-          "   * [querySelector]",
-          "   * method behaves the same as this method, so you should use it instead to",
-          "   * save typing a few characters.",
-          "   *",
-          "   * [selectors] should be a string using CSS selector syntax.",
-          "   *",
-          "   *     var element1 = document.querySelector('.className');",
-          "   *     var element2 = document.querySelector('#id');",
-          "   *",
-          "   * For details about CSS selector syntax, see the",
-          "   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
-          "   */"
-        ],
-        "readystatechangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `readystatechange` events to event",
-          "   * handlers that are not necessarily instances of [Document].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "securitypolicyviolationEvent": [
-          "/**",
-          "   * Static factory designed to expose `securitypolicyviolation` events to event",
-          "   * handlers that are not necessarily instances of [Document].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "selectionchangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `selectionchange` events to event",
-          "   * handlers that are not necessarily instances of [Document].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitpointerlockchangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `pointerlockchange` events to event",
-          "   * handlers that are not necessarily instances of [Document].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitpointerlockerrorEvent": [
-          "/**",
-          "   * Static factory designed to expose `pointerlockerror` events to event",
-          "   * handlers that are not necessarily instances of [Document].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "DocumentFragment": {
-      "members": {
-        "querySelector": [
-          "/**",
-          "   * Finds the first descendant element of this document fragment that matches",
-          "   * the specified group of selectors.",
-          "   *",
-          "   * [selectors] should be a string using CSS selector syntax.",
-          "   *",
-          "   *     var element1 = fragment.querySelector('.className');",
-          "   *     var element2 = fragment.querySelector('#id');",
-          "   *",
-          "   * For details about CSS selector syntax, see the",
-          "   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
-          "   */"
-        ]
-      }
-    },
-    "Element": {
-      "comment": [
-        "/**",
-        " * An abstract class, which all HTML elements extend.",
-        " */"
-      ],
-      "members": {
-        "abortEvent": [
-          "/**",
-          "   * Static factory designed to expose `abort` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "beforecopyEvent": [
-          "/**",
-          "   * Static factory designed to expose `beforecopy` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "beforecutEvent": [
-          "/**",
-          "   * Static factory designed to expose `beforecut` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "beforepasteEvent": [
-          "/**",
-          "   * Static factory designed to expose `beforepaste` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "blurEvent": [
-          "/**",
-          "   * Static factory designed to expose `blur` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "changeEvent": [
-          "/**",
-          "   * Static factory designed to expose `change` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "clickEvent": [
-          "/**",
-          "   * Static factory designed to expose `click` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "contextmenuEvent": [
-          "/**",
-          "   * Static factory designed to expose `contextmenu` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "copyEvent": [
-          "/**",
-          "   * Static factory designed to expose `copy` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "cutEvent": [
-          "/**",
-          "   * Static factory designed to expose `cut` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dblclickEvent": [
-          "/**",
-          "   * Static factory designed to expose `doubleclick` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dragendEvent": [
-          "/**",
-          "   * A stream of `dragend` events fired when an element completes a drag",
-          "   * operation.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "dragenterEvent": [
-          "/**",
-          "   * A stream of `dragenter` events fired when a dragged object is first dragged",
-          "   * over an element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "dragEvent": [
-          "/**",
-          "   * A stream of `drag` events fired when an element is currently being dragged.",
-          "   *",
-          "   * A `drag` event is added to this stream as soon as the drag begins.",
-          "   * A `drag` event is also added to this stream at intervals while the drag",
-          "   * operation is still ongoing.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "draggable": [
-          "/**",
-          "   * Indicates whether the element can be dragged and dropped.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "dragleaveEvent": [
-          "/**",
-          "   * A stream of `dragleave` events fired when an object being dragged over an",
-          "   * element leaves the element's target area.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "dragoverEvent": [
-          "/**",
-          "   * A stream of `dragover` events fired when a dragged object is currently",
-          "   * being dragged over an element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "dragstartEvent": [
-          "/**",
-          "   * A stream of `dragstart` events for a dragged element whose drag has begun.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "dropEvent": [
-          "/**",
-          "   * A stream of `drop` events fired when a dragged object is dropped on an",
-          "   * element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "focusEvent": [
-          "/**",
-          "   * Static factory designed to expose `focus` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "getBoundingClientRect": [
-          "/**",
-          "   * Returns the smallest bounding rectangle that encompasses this element's",
-          "   * padding, scrollbar, and border.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Element.getBoundingClientRect](https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect)",
-          "   *   from MDN.",
-          "   * * [The getBoundingClientRect()",
-          "   *   method](http://www.w3.org/TR/cssom-view/#the-getclientrects()-and-getboundingclientrect()-methods)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "getClientRects": [
-          "/**",
-          "   * Returns a list of bounding rectangles for each box associated with this",
-          "   * element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Element.getClientRects](https://developer.mozilla.org/en-US/docs/Web/API/Element.getClientRects)",
-          "   *   from MDN.",
-          "   * * [The getClientRects()",
-          "   *   method](http://www.w3.org/TR/cssom-view/#the-getclientrects()-and-getboundingclientrect()-methods)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "getDestinationInsertionPoints": [
-          "/**",
-          "   * Returns a list of shadow DOM insertion points to which this element is",
-          "   * distributed.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Shadow DOM",
-          "   *   specification](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "getElementsByClassName": [
-          "/**",
-          "   * Returns a list of nodes with the given class name inside this element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [getElementsByClassName](https://developer.mozilla.org/en-US/docs/Web/API/document.getElementsByClassName)",
-          "   *   from MDN.",
-          "   * * [DOM specification](http://www.w3.org/TR/domcore/) from W3C.",
-          "   */"
-        ],
-        "hidden": [
-          "/**",
-          "   * Indicates whether the element is not relevant to the page's current state.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Hidden attribute",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#the-hidden-attribute)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "inputEvent": [
-          "/**",
-          "   * Static factory designed to expose `input` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "inputMethodContext": [
-          "/**",
-          "   * The current state of IME composition.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Input method editor",
-          "   *   specification](http://www.w3.org/TR/ime-api/) from W3C.",
-          "   */"
-        ],
-        "invalidEvent": [
-          "/**",
-          "   * Static factory designed to expose `invalid` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "keydownEvent": [
-          "/**",
-          "   * Static factory designed to expose `keydown` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "keypressEvent": [
-          "/**",
-          "   * Static factory designed to expose `keypress` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "keyupEvent": [
-          "/**",
-          "   * Static factory designed to expose `keyup` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadEvent": [
-          "/**",
-          "   * Static factory designed to expose `load` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mousedownEvent": [
-          "/**",
-          "   * Static factory designed to expose `mousedown` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseenterEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseenter` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseleaveEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseleave` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mousemoveEvent": [
-          "/**",
-          "   * Static factory designed to expose `mousemove` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseoutEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseout` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseoverEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseover` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseupEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseup` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onabort": [
-          "/// Stream of `abort` events handled by this [Element]."
-        ],
-        "onbeforecopy": [
-          "/// Stream of `beforecopy` events handled by this [Element]."
-        ],
-        "onbeforecut": [
-          "/// Stream of `beforecut` events handled by this [Element]."
-        ],
-        "onbeforepaste": [
-          "/// Stream of `beforepaste` events handled by this [Element]."
-        ],
-        "onblur": [
-          "/// Stream of `blur` events handled by this [Element]."
-        ],
-        "onchange": [
-          "/// Stream of `change` events handled by this [Element]."
-        ],
-        "onclick": [
-          "/// Stream of `click` events handled by this [Element]."
-        ],
-        "oncontextmenu": [
-          "/// Stream of `contextmenu` events handled by this [Element]."
-        ],
-        "oncopy": [
-          "/// Stream of `copy` events handled by this [Element]."
-        ],
-        "oncut": [
-          "/// Stream of `cut` events handled by this [Element]."
-        ],
-        "ondblclick": [
-          "/// Stream of `doubleclick` events handled by this [Element]."
-        ],
-        "ondrag": [
-          "/**",
-          "   * A stream of `drag` events fired when this element currently being dragged.",
-          "   *",
-          "   * A `drag` event is added to this stream as soon as the drag begins.",
-          "   * A `drag` event is also added to this stream at intervals while the drag",
-          "   * operation is still ongoing.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "ondragend": [
-          "/**",
-          "   * A stream of `dragend` events fired when this element completes a drag",
-          "   * operation.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "ondragenter": [
-          "/**",
-          "   * A stream of `dragenter` events fired when a dragged object is first dragged",
-          "   * over this element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "ondragleave": [
-          "/**",
-          "   * A stream of `dragleave` events fired when an object being dragged over this",
-          "   * element leaves this element's target area.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "ondragover": [
-          "/**",
-          "   * A stream of `dragover` events fired when a dragged object is currently",
-          "   * being dragged over this element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "ondragstart": [
-          "/**",
-          "   * A stream of `dragstart` events fired when this element starts being",
-          "   * dragged.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "ondrop": [
-          "/**",
-          "   * A stream of `drop` events fired when a dragged object is dropped on this",
-          "   * element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [Element]."
-        ],
-        "onfocus": [
-          "/// Stream of `focus` events handled by this [Element]."
-        ],
-        "oninput": [
-          "/// Stream of `input` events handled by this [Element]."
-        ],
-        "oninvalid": [
-          "/// Stream of `invalid` events handled by this [Element]."
-        ],
-        "onkeydown": [
-          "/// Stream of `keydown` events handled by this [Element]."
-        ],
-        "onkeypress": [
-          "/// Stream of `keypress` events handled by this [Element]."
-        ],
-        "onkeyup": [
-          "/// Stream of `keyup` events handled by this [Element]."
-        ],
-        "onload": [
-          "/// Stream of `load` events handled by this [Element]."
-        ],
-        "onmousedown": [
-          "/// Stream of `mousedown` events handled by this [Element]."
-        ],
-        "onmouseenter": [
-          "/// Stream of `mouseenter` events handled by this [Element]."
-        ],
-        "onmouseleave": [
-          "/// Stream of `mouseleave` events handled by this [Element]."
-        ],
-        "onmousemove": [
-          "/// Stream of `mousemove` events handled by this [Element]."
-        ],
-        "onmouseout": [
-          "/// Stream of `mouseout` events handled by this [Element]."
-        ],
-        "onmouseover": [
-          "/// Stream of `mouseover` events handled by this [Element]."
-        ],
-        "onmouseup": [
-          "/// Stream of `mouseup` events handled by this [Element]."
-        ],
-        "onmousewheel": [
-          "/// Stream of `mousewheel` events handled by this [Element]."
-        ],
-        "onpaste": [
-          "/// Stream of `paste` events handled by this [Element]."
-        ],
-        "onreset": [
-          "/// Stream of `reset` events handled by this [Element]."
-        ],
-        "onscroll": [
-          "/// Stream of `scroll` events handled by this [Element]."
-        ],
-        "onsearch": [
-          "/// Stream of `search` events handled by this [Element]."
-        ],
-        "onselect": [
-          "/// Stream of `select` events handled by this [Element]."
-        ],
-        "onselectstart": [
-          "/// Stream of `selectstart` events handled by this [Element]."
-        ],
-        "onsubmit": [
-          "/// Stream of `submit` events handled by this [Element]."
-        ],
-        "ontouchcancel": [
-          "/// Stream of `touchcancel` events handled by this [Element]."
-        ],
-        "ontouchend": [
-          "/// Stream of `touchend` events handled by this [Element]."
-        ],
-        "ontouchenter": [
-          "/// Stream of `touchenter` events handled by this [Element]."
-        ],
-        "ontouchleave": [
-          "/// Stream of `touchleave` events handled by this [Element]."
-        ],
-        "ontouchmove": [
-          "/// Stream of `touchmove` events handled by this [Element]."
-        ],
-        "ontouchstart": [
-          "/// Stream of `touchstart` events handled by this [Element]."
-        ],
-        "ontransitionend": [
-          "/// Stream of `transitionend` events handled by this [Element]."
-        ],
-        "onwebkitfullscreenchange": [
-          "/// Stream of `fullscreenchange` events handled by this [Element]."
-        ],
-        "onwebkitfullscreenerror": [
-          "/// Stream of `fullscreenerror` events handled by this [Element]."
-        ],
-        "pasteEvent": [
-          "/**",
-          "   * Static factory designed to expose `paste` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "pseudo": [
-          "/**",
-          "   * The name of this element's custom pseudo-element.",
-          "   *",
-          "   * This value must begin with an x and a hyphen, `x-`, to be considered valid.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Using custom pseudo",
-          "   *   elements](http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-custom-pseduo)",
-          "   *   from HTML5Rocks.",
-          "   * * [Custom pseudo-elements](http://www.w3.org/TR/shadow-dom/#custom-pseudo-elements)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "querySelector": [
-          "/**",
-          "   * Finds the first descendant element of this element that matches the",
-          "   * specified group of selectors.",
-          "   *",
-          "   * [selectors] should be a string using CSS selector syntax.",
-          "   *",
-          "   *     // Gets the first descendant with the class 'classname'",
-          "   *     var element = element.querySelector('.className');",
-          "   *     // Gets the element with id 'id'",
-          "   *     var element = element.querySelector('#id');",
-          "   *     // Gets the first descendant [ImageElement]",
-          "   *     var img = element.querySelector('img');",
-          "   *",
-          "   * For details about CSS selector syntax, see the",
-          "   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).",
-          "   */"
-        ],
-        "resetEvent": [
-          "/**",
-          "   * Static factory designed to expose `reset` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "scrollByLines": [
-          "/**",
-          "   * Scrolls the element by a number of lines.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.scrollByLines](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollByLines)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "scrollByPages": [
-          "/**",
-          "   * Scrolls the element by a number of pages.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.scrollByPages](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollByPages)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "scrollEvent": [
-          "/**",
-          "   * Static factory designed to expose `scroll` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "searchEvent": [
-          "/**",
-          "   * Static factory designed to expose `search` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "selectEvent": [
-          "/**",
-          "   * Static factory designed to expose `select` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "selectstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `selectstart` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "submitEvent": [
-          "/**",
-          "   * Static factory designed to expose `submit` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "touchcancelEvent": [
-          "/**",
-          "   * Static factory designed to expose `touchcancel` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "touchendEvent": [
-          "/**",
-          "   * Static factory designed to expose `touchend` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "touchenterEvent": [
-          "/**",
-          "   * Static factory designed to expose `touchenter` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "touchleaveEvent": [
-          "/**",
-          "   * Static factory designed to expose `touchleave` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "touchmoveEvent": [
-          "/**",
-          "   * Static factory designed to expose `touchmove` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "touchstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `touchstart` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "translate": [
-          "/**",
-          "   * Specifies whether this element's text content changes when the page is",
-          "   * localized.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The translate",
-          "   *   attribute](https://html.spec.whatwg.org/multipage/dom.html#the-translate-attribute)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "webkitdropzone": [
-          "/**",
-          "   * A set of space-separated keywords that specify what kind of data this",
-          "   * Element accepts on drop and what to do with that data.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Drag and drop",
-          "   *   sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/dnd/basics)",
-          "   *   based on [the tutorial](http://www.html5rocks.com/en/tutorials/dnd/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Drag and drop",
-          "   *   specification](https://html.spec.whatwg.org/multipage/interaction.html#dnd)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "webkitfullscreenchangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `fullscreenchange` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitfullscreenerrorEvent": [
-          "/**",
-          "   * Static factory designed to expose `fullscreenerror` events to event",
-          "   * handlers that are not necessarily instances of [Element].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitGetRegionFlowRanges": [
-          "/**",
-          "   * Returns an array of ranges of fragments in the flow.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [CSS regions and exclusions",
-          "   *   tutorial](http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.",
-          "   * * [Regions](http://webplatform.adobe.com/regions/) from Adobe.",
-          "   * * [CSS regions specification](http://www.w3.org/TR/css3-regions/) from W3C.",
-          "   */"
-        ],
-        "webkitRegionOverset": [
-          "/**",
-          "   * The current state of this region.",
-          "   *",
-          "   * If `\"empty\"`, then there is no content in this region.",
-          "   * If `\"fit\"`, then content fits into this region, and more content can be",
-          "   * added. If `\"overset\"`, then there is more content than can be fit into this",
-          "   * region.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [CSS regions and exclusions",
-          "   *   tutorial](http://www.html5rocks.com/en/tutorials/regions/adobe/) from HTML5Rocks.",
-          "   * * [Regions](http://webplatform.adobe.com/regions/) from Adobe.",
-          "   * * [CSS regions specification](http://www.w3.org/TR/css3-regions/) from W3C.",
-          "   */"
-        ],
-        "webkitRequestFullscreen": [
-          "/**",
-          "   * Displays this element fullscreen.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Fullscreen",
-          "   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)",
-          "   *   from MDN.",
-          "   * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.",
-          "   */"
-        ],
-        "webkitRequestPointerLock": [
-          "/**",
-          "   * Locks the mouse pointer to this element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Pointer lock and first person shooter",
-          "   *   controls](http://www.html5rocks.com/en/tutorials/pointerlock/intro/)",
-          "   *   tutorial from HTML5Rocks.",
-          "   * * [Pointer lock specification](http://www.w3.org/TR/pointerlock/)",
-          "   *   from W3C.",
-          "   */"
-        ]
-      }
-    },
-    "Event": {
-      "members": {
-        "AT_TARGET": [
-          "/**",
-          "   * This event is being handled by the event target.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Target phase](http://www.w3.org/TR/DOM-Level-3-Events/#target-phase)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "BUBBLING_PHASE": [
-          "/**",
-          "   * This event is bubbling up through the target's ancestors.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Bubble phase](http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "CAPTURING_PHASE": [
-          "/**",
-          "   * This event is propagating through the target's ancestors, starting from the",
-          "   * document.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Bubble phase](http://www.w3.org/TR/DOM-Level-3-Events/#bubble-phase)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "clipboardData": [
-          "/**",
-          "   * Access to the system's clipboard data during copy, cut, and paste events.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [clipboardData specification](http://www.w3.org/TR/clipboard-apis/#attributes)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "path": [
-          "/**",
-          "   * This event's path, taking into account shadow DOM.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Shadow DOM extensions to",
-          "   *   Event](http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event)",
-          "   *   from W3C.",
-          "   */"
-        ]
-      }
-    },
-    "EventSource": {
-      "members": {
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [EventSource].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "messageEvent": [
-          "/**",
-          "   * Static factory designed to expose `message` events to event",
-          "   * handlers that are not necessarily instances of [EventSource].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [EventSource]."
-        ],
-        "onmessage": [
-          "/// Stream of `message` events handled by this [EventSource]."
-        ],
-        "onopen": [
-          "/// Stream of `open` events handled by this [EventSource]."
-        ],
-        "openEvent": [
-          "/**",
-          "   * Static factory designed to expose `open` events to event",
-          "   * handlers that are not necessarily instances of [EventSource].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "FileReader": {
-      "members": {
-        "abortEvent": [
-          "/**",
-          "   * Static factory designed to expose `abort` events to event",
-          "   * handlers that are not necessarily instances of [FileReader].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [FileReader].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadendEvent": [
-          "/**",
-          "   * Static factory designed to expose `loadend` events to event",
-          "   * handlers that are not necessarily instances of [FileReader].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadEvent": [
-          "/**",
-          "   * Static factory designed to expose `load` events to event",
-          "   * handlers that are not necessarily instances of [FileReader].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `loadstart` events to event",
-          "   * handlers that are not necessarily instances of [FileReader].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onabort": [
-          "/// Stream of `abort` events handled by this [FileReader]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [FileReader]."
-        ],
-        "onload": [
-          "/// Stream of `load` events handled by this [FileReader]."
-        ],
-        "onloadend": [
-          "/// Stream of `loadend` events handled by this [FileReader]."
-        ],
-        "onloadstart": [
-          "/// Stream of `loadstart` events handled by this [FileReader]."
-        ],
-        "onprogress": [
-          "/// Stream of `progress` events handled by this [FileReader]."
-        ],
-        "progressEvent": [
-          "/**",
-          "   * Static factory designed to expose `progress` events to event",
-          "   * handlers that are not necessarily instances of [FileReader].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "FileWriter": {
-      "members": {
-        "abortEvent": [
-          "/**",
-          "   * Static factory designed to expose `abort` events to event",
-          "   * handlers that are not necessarily instances of [FileWriter].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [FileWriter].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onabort": [
-          "/// Stream of `abort` events handled by this [FileWriter]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [FileWriter]."
-        ],
-        "onprogress": [
-          "/// Stream of `progress` events handled by this [FileWriter]."
-        ],
-        "onwrite": [
-          "/// Stream of `write` events handled by this [FileWriter]."
-        ],
-        "onwriteend": [
-          "/// Stream of `writeend` events handled by this [FileWriter]."
-        ],
-        "onwritestart": [
-          "/// Stream of `writestart` events handled by this [FileWriter]."
-        ],
-        "progressEvent": [
-          "/**",
-          "   * Static factory designed to expose `progress` events to event",
-          "   * handlers that are not necessarily instances of [FileWriter].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "writeendEvent": [
-          "/**",
-          "   * Static factory designed to expose `writeend` events to event",
-          "   * handlers that are not necessarily instances of [FileWriter].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "writeEvent": [
-          "/**",
-          "   * Static factory designed to expose `write` events to event",
-          "   * handlers that are not necessarily instances of [FileWriter].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "writestartEvent": [
-          "/**",
-          "   * Static factory designed to expose `writestart` events to event",
-          "   * handlers that are not necessarily instances of [FileWriter].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "HTMLAreaElement": {
-      "comment": [
-        "/**",
-        " * DOM Area Element, which links regions of an image map with a hyperlink.",
-        " *",
-        " * The element can also define an uninteractive region of the map.",
-        " *",
-        " * See also:",
-        " *",
-        " * * [`<area>`](https://developer.mozilla.org/en-US/docs/HTML/Element/area)",
-        " * on MDN.",
-        " */"
-      ]
-    },
-    "HTMLBodyElement": {
-      "members": {
-        "blurEvent": [
-          "/**",
-          "   * Static factory designed to expose `blur` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "focusEvent": [
-          "/**",
-          "   * Static factory designed to expose `focus` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "hashchangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `hashchange` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadEvent": [
-          "/**",
-          "   * Static factory designed to expose `load` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "messageEvent": [
-          "/**",
-          "   * Static factory designed to expose `message` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "offlineEvent": [
-          "/**",
-          "   * Static factory designed to expose `offline` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onblur": [
-          "/// Stream of `blur` events handled by this [BodyElement]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [BodyElement]."
-        ],
-        "onfocus": [
-          "/// Stream of `focus` events handled by this [BodyElement]."
-        ],
-        "onhashchange": [
-          "/// Stream of `hashchange` events handled by this [BodyElement]."
-        ],
-        "onlineEvent": [
-          "/**",
-          "   * Static factory designed to expose `online` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onload": [
-          "/// Stream of `load` events handled by this [BodyElement]."
-        ],
-        "onmessage": [
-          "/// Stream of `message` events handled by this [BodyElement]."
-        ],
-        "onoffline": [
-          "/// Stream of `offline` events handled by this [BodyElement]."
-        ],
-        "ononline": [
-          "/// Stream of `online` events handled by this [BodyElement]."
-        ],
-        "onpopstate": [
-          "/// Stream of `popstate` events handled by this [BodyElement]."
-        ],
-        "onresize": [
-          "/// Stream of `resize` events handled by this [BodyElement]."
-        ],
-        "onstorage": [
-          "/// Stream of `storage` events handled by this [BodyElement]."
-        ],
-        "onunload": [
-          "/// Stream of `unload` events handled by this [BodyElement]."
-        ],
-        "popstateEvent": [
-          "/**",
-          "   * Static factory designed to expose `popstate` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "resizeEvent": [
-          "/**",
-          "   * Static factory designed to expose `resize` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "storageEvent": [
-          "/**",
-          "   * Static factory designed to expose `storage` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "unloadEvent": [
-          "/**",
-          "   * Static factory designed to expose `unload` events to event",
-          "   * handlers that are not necessarily instances of [BodyElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "HTMLCanvasElement": {
-      "members": {
-        "height": [
-          "/// The height of this canvas element in CSS pixels."
-        ],
-        "onwebglcontextlost": [
-          "/// Stream of `webglcontextlost` events handled by this [CanvasElement]."
-        ],
-        "onwebglcontextrestored": [
-          "/// Stream of `webglcontextrestored` events handled by this [CanvasElement]."
-        ],
-        "webglcontextlostEvent": [
-          "/**",
-          "   * Static factory designed to expose `webglcontextlost` events to event",
-          "   * handlers that are not necessarily instances of [CanvasElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webglcontextrestoredEvent": [
-          "/**",
-          "   * Static factory designed to expose `webglcontextrestored` events to event",
-          "   * handlers that are not necessarily instances of [CanvasElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "width": [
-          "/// The width of this canvas element in CSS pixels."
-        ]
-      }
-    },
-    "HTMLDivElement": {
-      "comment": [
-        "/**",
-        " * A generic container for content on an HTML page;",
-        " * corresponds to the &lt;div&gt; tag.",
-        " *",
-        " * The [DivElement] is a generic container and does not have any semantic",
-        " * significance. It is functionally similar to [SpanElement].",
-        " *",
-        " * The [DivElement] is a block-level element, as opposed to [SpanElement],",
-        " * which is an inline-level element.",
-        " *",
-        " * Example usage:",
-        " *",
-        " *     DivElement div = new DivElement();",
-        " *     div.text = 'Here's my new DivElem",
-        " *     document.body.elements.add(elem);",
-        " *",
-        " * See also:",
-        " *",
-        " * * [HTML `<div>` element](http://www.w3.org/TR/html-markup/div.html) from W3C.",
-        " * * [Block-level element](http://www.w3.org/TR/CSS2/visuren.html#block-boxes) from W3C.",
-        " * * [Inline-level element](http://www.w3.org/TR/CSS2/visuren.html#inline-boxes) from W3C.",
-        " */"
-      ]
-    },
-    "HTMLFormElement": {
-      "members": {
-        "autocompleteerrorEvent": [
-          "/**",
-          "   * Static factory designed to expose `autocompleteerror` events to event",
-          "   * handlers that are not necessarily instances of [FormElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "autocompleteEvent": [
-          "/**",
-          "   * Static factory designed to expose `autocomplete` events to event",
-          "   * handlers that are not necessarily instances of [FormElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onautocomplete": [
-          "/// Stream of `autocomplete` events handled by this [FormElement]."
-        ],
-        "onautocompleteerror": [
-          "/// Stream of `autocompleteerror` events handled by this [FormElement]."
-        ]
-      }
-    },
-    "HTMLHRElement": {
-      "comment": [
-        "/**",
-        " * An `<hr>` tag.",
-        " */"
-      ]
-    },
-    "HTMLInputElement": {
-      "members": {
-        "onwebkitSpeechChange": [
-          "/// Stream of `speechchange` events handled by this [InputElement]."
-        ],
-        "webkitSpeechChangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `speechchange` events to event",
-          "   * handlers that are not necessarily instances of [InputElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "HTMLMediaElement": {
-      "members": {
-        "canplayEvent": [
-          "/**",
-          "   * Static factory designed to expose `canplay` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "canplaythroughEvent": [
-          "/**",
-          "   * Static factory designed to expose `canplaythrough` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "durationchangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `durationchange` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "emptiedEvent": [
-          "/**",
-          "   * Static factory designed to expose `emptied` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "endedEvent": [
-          "/**",
-          "   * Static factory designed to expose `ended` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadeddataEvent": [
-          "/**",
-          "   * Static factory designed to expose `loadeddata` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadedmetadataEvent": [
-          "/**",
-          "   * Static factory designed to expose `loadedmetadata` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `loadstart` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "oncanplay": [
-          "/// Stream of `canplay` events handled by this [MediaElement]."
-        ],
-        "oncanplaythrough": [
-          "/// Stream of `canplaythrough` events handled by this [MediaElement]."
-        ],
-        "ondurationchange": [
-          "/// Stream of `durationchange` events handled by this [MediaElement]."
-        ],
-        "onemptied": [
-          "/// Stream of `emptied` events handled by this [MediaElement]."
-        ],
-        "onended": [
-          "/// Stream of `ended` events handled by this [MediaElement]."
-        ],
-        "onloadeddata": [
-          "/// Stream of `loadeddata` events handled by this [MediaElement]."
-        ],
-        "onloadedmetadata": [
-          "/// Stream of `loadedmetadata` events handled by this [MediaElement]."
-        ],
-        "onloadstart": [
-          "/// Stream of `loadstart` events handled by this [MediaElement]."
-        ],
-        "onpause": [
-          "/// Stream of `pause` events handled by this [MediaElement]."
-        ],
-        "onplay": [
-          "/// Stream of `play` events handled by this [MediaElement]."
-        ],
-        "onplaying": [
-          "/// Stream of `playing` events handled by this [MediaElement]."
-        ],
-        "onprogress": [
-          "/// Stream of `progress` events handled by this [MediaElement]."
-        ],
-        "onratechange": [
-          "/// Stream of `ratechange` events handled by this [MediaElement]."
-        ],
-        "onseeked": [
-          "/// Stream of `seeked` events handled by this [MediaElement]."
-        ],
-        "onseeking": [
-          "/// Stream of `seeking` events handled by this [MediaElement]."
-        ],
-        "onshow": [
-          "/// Stream of `show` events handled by this [MediaElement]."
-        ],
-        "onstalled": [
-          "/// Stream of `stalled` events handled by this [MediaElement]."
-        ],
-        "onsuspend": [
-          "/// Stream of `suspend` events handled by this [MediaElement]."
-        ],
-        "ontimeupdate": [
-          "/// Stream of `timeupdate` events handled by this [MediaElement]."
-        ],
-        "onvolumechange": [
-          "/// Stream of `volumechange` events handled by this [MediaElement]."
-        ],
-        "onwaiting": [
-          "/// Stream of `waiting` events handled by this [MediaElement]."
-        ],
-        "onwebkitkeyadded": [
-          "/// Stream of `keyadded` events handled by this [MediaElement]."
-        ],
-        "onwebkitkeyerror": [
-          "/// Stream of `keyerror` events handled by this [MediaElement]."
-        ],
-        "onwebkitkeymessage": [
-          "/// Stream of `keymessage` events handled by this [MediaElement]."
-        ],
-        "onwebkitneedkey": [
-          "/// Stream of `needkey` events handled by this [MediaElement]."
-        ],
-        "pauseEvent": [
-          "/**",
-          "   * Static factory designed to expose `pause` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "playEvent": [
-          "/**",
-          "   * Static factory designed to expose `play` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "playingEvent": [
-          "/**",
-          "   * Static factory designed to expose `playing` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "progressEvent": [
-          "/**",
-          "   * Static factory designed to expose `progress` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "ratechangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `ratechange` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "seekedEvent": [
-          "/**",
-          "   * Static factory designed to expose `seeked` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "seekingEvent": [
-          "/**",
-          "   * Static factory designed to expose `seeking` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "showEvent": [
-          "/**",
-          "   * Static factory designed to expose `show` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "stalledEvent": [
-          "/**",
-          "   * Static factory designed to expose `stalled` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "suspendEvent": [
-          "/**",
-          "   * Static factory designed to expose `suspend` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "timeupdateEvent": [
-          "/**",
-          "   * Static factory designed to expose `timeupdate` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "volumechangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `volumechange` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "waitingEvent": [
-          "/**",
-          "   * Static factory designed to expose `waiting` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitkeyaddedEvent": [
-          "/**",
-          "   * Static factory designed to expose `keyadded` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitkeyerrorEvent": [
-          "/**",
-          "   * Static factory designed to expose `keyerror` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitkeymessageEvent": [
-          "/**",
-          "   * Static factory designed to expose `keymessage` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitneedkeyEvent": [
-          "/**",
-          "   * Static factory designed to expose `needkey` events to event",
-          "   * handlers that are not necessarily instances of [MediaElement].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "HTMLMenuElement": {
-      "comment": [
-        "/**",
-        " * An HTML <menu> element.",
-        " *",
-        " * A <menu> element represents an unordered list of menu commands.",
-        " *",
-        " * See also:",
-        " *",
-        " *  * [Menu Element](https://developer.mozilla.org/en-US/docs/HTML/Element/menu) from MDN.",
-        " *  * [Menu Element](http://www.w3.org/TR/html5/the-menu-element.html#the-menu-element) from the W3C.",
-        " */"
-      ]
-    },
-    "MediaKeySession": {
-      "members": {
-        "onwebkitkeyadded": [
-          "/// Stream of `keyadded` events handled by this [MediaKeySession]."
-        ],
-        "onwebkitkeyerror": [
-          "/// Stream of `keyerror` events handled by this [MediaKeySession]."
-        ],
-        "onwebkitkeymessage": [
-          "/// Stream of `keymessage` events handled by this [MediaKeySession]."
-        ],
-        "webkitkeyaddedEvent": [
-          "/**",
-          "   * Static factory designed to expose `keyadded` events to event",
-          "   * handlers that are not necessarily instances of [MediaKeySession].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitkeyerrorEvent": [
-          "/**",
-          "   * Static factory designed to expose `keyerror` events to event",
-          "   * handlers that are not necessarily instances of [MediaKeySession].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitkeymessageEvent": [
-          "/**",
-          "   * Static factory designed to expose `keymessage` events to event",
-          "   * handlers that are not necessarily instances of [MediaKeySession].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "MediaStream": {
-      "members": {
-        "addtrackEvent": [
-          "/**",
-          "   * Static factory designed to expose `addtrack` events to event",
-          "   * handlers that are not necessarily instances of [MediaStream].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "endedEvent": [
-          "/**",
-          "   * Static factory designed to expose `ended` events to event",
-          "   * handlers that are not necessarily instances of [MediaStream].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onaddtrack": [
-          "/// Stream of `addtrack` events handled by this [MediaStream]."
-        ],
-        "onended": [
-          "/// Stream of `ended` events handled by this [MediaStream]."
-        ],
-        "onremovetrack": [
-          "/// Stream of `removetrack` events handled by this [MediaStream]."
-        ],
-        "removetrackEvent": [
-          "/**",
-          "   * Static factory designed to expose `removetrack` events to event",
-          "   * handlers that are not necessarily instances of [MediaStream].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "MediaStreamTrack": {
-      "members": {
-        "endedEvent": [
-          "/**",
-          "   * Static factory designed to expose `ended` events to event",
-          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "muteEvent": [
-          "/**",
-          "   * Static factory designed to expose `mute` events to event",
-          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onended": [
-          "/// Stream of `ended` events handled by this [MediaStreamTrack]."
-        ],
-        "onmute": [
-          "/// Stream of `mute` events handled by this [MediaStreamTrack]."
-        ],
-        "onunmute": [
-          "/// Stream of `unmute` events handled by this [MediaStreamTrack]."
-        ],
-        "unmuteEvent": [
-          "/**",
-          "   * Static factory designed to expose `unmute` events to event",
-          "   * handlers that are not necessarily instances of [MediaStreamTrack].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "MessagePort": {
-      "members": {
-        "messageEvent": [
-          "/**",
-          "   * Static factory designed to expose `message` events to event",
-          "   * handlers that are not necessarily instances of [MessagePort].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onmessage": [
-          "/// Stream of `message` events handled by this [MessagePort]."
-        ]
-      }
-    },
-    "MIDIAccess": {
-      "members": {
-        "connectEvent": [
-          "/**",
-          "   * Static factory designed to expose `connect` events to event",
-          "   * handlers that are not necessarily instances of [MidiAccess].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "disconnectEvent": [
-          "/**",
-          "   * Static factory designed to expose `disconnect` events to event",
-          "   * handlers that are not necessarily instances of [MidiAccess].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onconnect": [
-          "/// Stream of `connect` events handled by this [MidiAccess]."
-        ],
-        "ondisconnect": [
-          "/// Stream of `disconnect` events handled by this [MidiAccess]."
-        ]
-      }
-    },
-    "MIDIInput": {
-      "members": {
-        "midimessageEvent": [
-          "/**",
-          "   * Static factory designed to expose `midimessage` events to event",
-          "   * handlers that are not necessarily instances of [MidiInput].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onmidimessage": [
-          "/// Stream of `midimessage` events handled by this [MidiInput]."
-        ]
-      }
-    },
-    "MIDIPort": {
-      "members": {
-        "disconnectEvent": [
-          "/**",
-          "   * Static factory designed to expose `disconnect` events to event",
-          "   * handlers that are not necessarily instances of [MidiPort].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "ondisconnect": [
-          "/// Stream of `disconnect` events handled by this [MidiPort]."
-        ]
-      }
-    },
-    "MouseEvent": {
-      "members": {
-        "fromElement": [
-          "/**",
-          "   * The nonstandard way to access the element that the mouse comes",
-          "   * from in the case of a `mouseover` event.",
-          "   *",
-          "   * This member is deprecated and not cross-browser compatible; use",
-          "   * relatedTarget to get the same information in the standard way.",
-          "   */"
-        ],
-        "toElement": [
-          "/**",
-          "   * The nonstandard way to access the element that the mouse goes",
-          "   * to in the case of a `mouseout` event.",
-          "   *",
-          "   * This member is deprecated and not cross-browser compatible; use",
-          "   * relatedTarget to get the same information in the standard way.",
-          "   */"
-        ]
-      }
-    },
-    "Node": {
-      "members": {
-        "appendChild": [
-          "/**",
-          "   * Adds a node to the end of the child [nodes] list of this node.",
-          "   *",
-          "   * If the node already exists in this document, it will be removed from its",
-          "   * current parent node, then added to this node.",
-          "   *",
-          "   * This method is more efficient than `nodes.add`, and is the preferred",
-          "   * way of appending a child node.",
-          "   */"
-        ],
-        "childNodes": [
-          "/**",
-          "   * A list of this node's children.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "cloneNode": [
-          "/**",
-          "   * Returns a copy of this node.",
-          "   *",
-          "   * If [deep] is `true`, then all of this node's children and descendents are",
-          "   * copied as well. If [deep] is `false`, then only this node is copied.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.cloneNode](https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "contains": [
-          "/**",
-          "   * Returns true if this node contains the specified node.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.contains](https://developer.mozilla.org/en-US/docs/Web/API/Node.contains)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "firstChild": [
-          "/**",
-          "   * The first child of this node.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.firstChild](https://developer.mozilla.org/en-US/docs/Web/API/Node.firstChild)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "hasChildNodes": [
-          "/**",
-          "   * Returns true if this node has any children.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.hasChildNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node.hasChildNodes)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "insertBefore": [
-          "/**",
-          "   * Inserts all of the nodes into this node directly before refChild.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.insertBefore](https://developer.mozilla.org/en-US/docs/Web/API/Node.insertBefore)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "lastChild": [
-          "/**",
-          "   * The last child of this node.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.lastChild](https://developer.mozilla.org/en-US/docs/Web/API/Node.lastChild)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "nextSibling": [
-          "/**",
-          "   * The next sibling node.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.nextSibling](https://developer.mozilla.org/en-US/docs/Web/API/Node.nextSibling)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "nodeName": [
-          "/**",
-          "   * The name of this node.",
-          "   *",
-          "   * This varies by this node's [nodeType].",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.nodeName](https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeName)",
-          "   *   from MDN. This page contains a table of [nodeName] values for each",
-          "   *   [nodeType].",
-          "   */"
-        ],
-        "nodeType": [
-          "/**",
-          "   * The type of node.",
-          "   *",
-          "   * This value is one of:",
-          "   *",
-          "   * * [ATTRIBUTE_NODE] if this node is an attribute.",
-          "   * * [CDATA_SECTION_NODE] if this node is a [CDataSection].",
-          "   * * [COMMENT_NODE] if this node is a [Comment].",
-          "   * * [DOCUMENT_FRAGMENT_NODE] if this node is a [DocumentFragment].",
-          "   * * [DOCUMENT_NODE] if this node is a [Document].",
-          "   * * [DOCUMENT_TYPE_NODE] if this node is a [_DocumentType] node.",
-          "   * * [ELEMENT_NODE] if this node is an [Element].",
-          "   * * [ENTITY_NODE] if this node is an entity.",
-          "   * * [ENTITY_REFERENCE_NODE] if this node is an entity reference.",
-          "   * * [NOTATION_NODE] if this node is a notation.",
-          "   * * [PROCESSING_INSTRUCTION_NODE] if this node is a [ProcessingInstruction].",
-          "   * * [TEXT_NODE] if this node is a [Text] node.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.nodeType](https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "nodeValue": [
-          "/**",
-          "   * The value of this node.",
-          "   *",
-          "   * This varies by this type's [nodeType].",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.nodeValue](https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeValue)",
-          "   *   from MDN. This page contains a table of [nodeValue] values for each",
-          "   *   [nodeType].",
-          "   */"
-        ],
-        "ownerDocument": [
-          "/**",
-          "   * The document this node belongs to.",
-          "   *",
-          "   * Returns null if this node does not belong to any document.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.ownerDocument](https://developer.mozilla.org/en-US/docs/Web/API/Node.ownerDocument)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "parentElement": [
-          "/**",
-          "   * The parent element of this node.",
-          "   *",
-          "   * Returns null if this node either does not have a parent or its parent is",
-          "   * not an element.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.parentElement](https://developer.mozilla.org/en-US/docs/Web/API/Node.parentElement)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "parentNode": [
-          "/**",
-          "   * The parent node of this node.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.parentNode](https://developer.mozilla.org/en-US/docs/Web/API/Node.parentNode)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "previousSibling": [
-          "/**",
-          "   * The previous sibling node.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.previousSibling](https://developer.mozilla.org/en-US/docs/Web/API/Node.previousSibling)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "textContent": [
-          "/**",
-          "   * All text within this node and its descendents.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Node.textContent](https://developer.mozilla.org/en-US/docs/Web/API/Node.textContent)",
-          "   *   from MDN.",
-          "   */"
-        ]
-      }
-    },
-    "Notification": {
-      "members": {
-        "clickEvent": [
-          "/**",
-          "   * Static factory designed to expose `click` events to event",
-          "   * handlers that are not necessarily instances of [Notification].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "closeEvent": [
-          "/**",
-          "   * Static factory designed to expose `close` events to event",
-          "   * handlers that are not necessarily instances of [Notification].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "displayEvent": [
-          "/**",
-          "   * Static factory designed to expose `display` events to event",
-          "   * handlers that are not necessarily instances of [Notification].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [Notification].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onclick": [
-          "/// Stream of `click` events handled by this [Notification]."
-        ],
-        "onclose": [
-          "/// Stream of `close` events handled by this [Notification]."
-        ],
-        "ondisplay": [
-          "/// Stream of `display` events handled by this [Notification]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [Notification]."
-        ],
-        "onshow": [
-          "/// Stream of `show` events handled by this [Notification]."
-        ],
-        "showEvent": [
-          "/**",
-          "   * Static factory designed to expose `show` events to event",
-          "   * handlers that are not necessarily instances of [Notification].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "Performance": {
-      "members": {
-        "onwebkitresourcetimingbufferfull": [
-          "/// Stream of `resourcetimingbufferfull` events handled by this [Performance]."
-        ],
-        "webkitresourcetimingbufferfullEvent": [
-          "/**",
-          "   * Static factory designed to expose `resourcetimingbufferfull` events to event",
-          "   * handlers that are not necessarily instances of [Performance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "RTCDataChannel": {
-      "members": {
-        "closeEvent": [
-          "/**",
-          "   * Static factory designed to expose `close` events to event",
-          "   * handlers that are not necessarily instances of [RtcDataChannel].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [RtcDataChannel].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "messageEvent": [
-          "/**",
-          "   * Static factory designed to expose `message` events to event",
-          "   * handlers that are not necessarily instances of [RtcDataChannel].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onclose": [
-          "/// Stream of `close` events handled by this [RtcDataChannel]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [RtcDataChannel]."
-        ],
-        "onmessage": [
-          "/// Stream of `message` events handled by this [RtcDataChannel]."
-        ],
-        "onopen": [
-          "/// Stream of `open` events handled by this [RtcDataChannel]."
-        ],
-        "openEvent": [
-          "/**",
-          "   * Static factory designed to expose `open` events to event",
-          "   * handlers that are not necessarily instances of [RtcDataChannel].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "RTCDTMFSender": {
-      "members": {
-        "ontonechange": [
-          "/// Stream of `tonechange` events handled by this [RtcDtmfSender]."
-        ],
-        "tonechangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `tonechange` events to event",
-          "   * handlers that are not necessarily instances of [RtcDtmfSender].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "RTCPeerConnection": {
-      "members": {
-        "addstreamEvent": [
-          "/**",
-          "   * Static factory designed to expose `addstream` events to event",
-          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "datachannelEvent": [
-          "/**",
-          "   * Static factory designed to expose `datachannel` events to event",
-          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "icecandidateEvent": [
-          "/**",
-          "   * Static factory designed to expose `icecandidate` events to event",
-          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "iceconnectionstatechangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `iceconnectionstatechange` events to event",
-          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "negotiationneededEvent": [
-          "/**",
-          "   * Static factory designed to expose `negotiationneeded` events to event",
-          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onaddstream": [
-          "/// Stream of `addstream` events handled by this [RtcPeerConnection]."
-        ],
-        "ondatachannel": [
-          "/// Stream of `datachannel` events handled by this [RtcPeerConnection]."
-        ],
-        "onicecandidate": [
-          "/// Stream of `icecandidate` events handled by this [RtcPeerConnection]."
-        ],
-        "oniceconnectionstatechange": [
-          "/// Stream of `iceconnectionstatechange` events handled by this [RtcPeerConnection]."
-        ],
-        "onnegotiationneeded": [
-          "/// Stream of `negotiationneeded` events handled by this [RtcPeerConnection]."
-        ],
-        "onremovestream": [
-          "/// Stream of `removestream` events handled by this [RtcPeerConnection]."
-        ],
-        "onsignalingstatechange": [
-          "/// Stream of `signalingstatechange` events handled by this [RtcPeerConnection]."
-        ],
-        "ontrack": [
-          "/// Stream of `track` events handled by this [RtcPeerConnection]."
-        ],
-        "removestreamEvent": [
-          "/**",
-          "   * Static factory designed to expose `removestream` events to event",
-          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "signalingstatechangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `signalingstatechange` events to event",
-          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "trackEvent": [
-          "/**",
-          "   * Static factory designed to expose `track` events to event",
-          "   * handlers that are not necessarily instances of [RtcPeerConnection].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "SharedWorkerGlobalScope": {
-      "members": {
-        "connectEvent": [
-          "/**",
-          "   * Static factory designed to expose `connect` events to event",
-          "   * handlers that are not necessarily instances of [SharedWorkerGlobalScope].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onconnect": [
-          "/// Stream of `connect` events handled by this [SharedWorkerGlobalScope]."
-        ]
-      }
-    },
-    "SpeechRecognition": {
-      "members": {
-        "audioendEvent": [
-          "/**",
-          "   * Static factory designed to expose `audioend` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "audiostartEvent": [
-          "/**",
-          "   * Static factory designed to expose `audiostart` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "endEvent": [
-          "/**",
-          "   * Static factory designed to expose `end` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "nomatchEvent": [
-          "/**",
-          "   * Static factory designed to expose `nomatch` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onaudioend": [
-          "/// Stream of `audioend` events handled by this [SpeechRecognition]."
-        ],
-        "onaudiostart": [
-          "/// Stream of `audiostart` events handled by this [SpeechRecognition]."
-        ],
-        "onend": [
-          "/// Stream of `end` events handled by this [SpeechRecognition]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [SpeechRecognition]."
-        ],
-        "onnomatch": [
-          "/// Stream of `nomatch` events handled by this [SpeechRecognition]."
-        ],
-        "onresult": [
-          "/// Stream of `result` events handled by this [SpeechRecognition]."
-        ],
-        "onsoundend": [
-          "/// Stream of `soundend` events handled by this [SpeechRecognition]."
-        ],
-        "onsoundstart": [
-          "/// Stream of `soundstart` events handled by this [SpeechRecognition]."
-        ],
-        "onspeechend": [
-          "/// Stream of `speechend` events handled by this [SpeechRecognition]."
-        ],
-        "onspeechstart": [
-          "/// Stream of `speechstart` events handled by this [SpeechRecognition]."
-        ],
-        "onstart": [
-          "/// Stream of `start` events handled by this [SpeechRecognition]."
-        ],
-        "resultEvent": [
-          "/**",
-          "   * Static factory designed to expose `result` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "soundendEvent": [
-          "/**",
-          "   * Static factory designed to expose `soundend` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "soundstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `soundstart` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "speechendEvent": [
-          "/**",
-          "   * Static factory designed to expose `speechend` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "speechstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `speechstart` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "startEvent": [
-          "/**",
-          "   * Static factory designed to expose `start` events to event",
-          "   * handlers that are not necessarily instances of [SpeechRecognition].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "SpeechSynthesisUtterance": {
-      "members": {
-        "boundaryEvent": [
-          "/**",
-          "   * Static factory designed to expose `boundary` events to event",
-          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "endEvent": [
-          "/**",
-          "   * Static factory designed to expose `end` events to event",
-          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "markEvent": [
-          "/**",
-          "   * Static factory designed to expose `mark` events to event",
-          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onboundary": [
-          "/// Stream of `boundary` events handled by this [SpeechSynthesisUtterance]."
-        ],
-        "onend": [
-          "/// Stream of `end` events handled by this [SpeechSynthesisUtterance]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [SpeechSynthesisUtterance]."
-        ],
-        "onmark": [
-          "/// Stream of `mark` events handled by this [SpeechSynthesisUtterance]."
-        ],
-        "onpause": [
-          "/// Stream of `pause` events handled by this [SpeechSynthesisUtterance]."
-        ],
-        "onresume": [
-          "/// Stream of `resume` events handled by this [SpeechSynthesisUtterance]."
-        ],
-        "onstart": [
-          "/// Stream of `start` events handled by this [SpeechSynthesisUtterance]."
-        ],
-        "pauseEvent": [
-          "/**",
-          "   * Static factory designed to expose `pause` events to event",
-          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "resumeEvent": [
-          "/**",
-          "   * Static factory designed to expose `resume` events to event",
-          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "startEvent": [
-          "/**",
-          "   * Static factory designed to expose `start` events to event",
-          "   * handlers that are not necessarily instances of [SpeechSynthesisUtterance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "TextTrack": {
-      "members": {
-        "cuechangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `cuechange` events to event",
-          "   * handlers that are not necessarily instances of [TextTrack].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "oncuechange": [
-          "/// Stream of `cuechange` events handled by this [TextTrack]."
-        ]
-      }
-    },
-    "TextTrackCue": {
-      "members": {
-        "enterEvent": [
-          "/**",
-          "   * Static factory designed to expose `enter` events to event",
-          "   * handlers that are not necessarily instances of [TextTrackCue].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "exitEvent": [
-          "/**",
-          "   * Static factory designed to expose `exit` events to event",
-          "   * handlers that are not necessarily instances of [TextTrackCue].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onenter": [
-          "/// Stream of `enter` events handled by this [TextTrackCue]."
-        ],
-        "onexit": [
-          "/// Stream of `exit` events handled by this [TextTrackCue]."
-        ]
-      }
-    },
-    "TextTrackList": {
-      "members": {
-        "addtrackEvent": [
-          "/**",
-          "   * Static factory designed to expose `addtrack` events to event",
-          "   * handlers that are not necessarily instances of [TextTrackList].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onaddtrack": [
-          "/// Stream of `addtrack` events handled by this [TextTrackList]."
-        ]
-      }
-    },
-    "WebSocket": {
-      "comment": [
-        "/**",
-        " * Use the WebSocket interface to connect to a WebSocket,",
-        " * and to send and receive data on that WebSocket.",
-        " *",
-        " * To use a WebSocket in your web app, first create a WebSocket object,",
-        " * passing the WebSocket URL as an argument to the constructor.",
-        " *",
-        " *     var webSocket = new WebSocket('ws://127.0.0.1:1337/ws');",
-        " *",
-        " * To send data on the WebSocket, use the [send] method.",
-        " *",
-        " *     if (webSocket != null && webSocket.readyState == WebSocket.OPEN) {",
-        " *       webSocket.send(data);",
-        " *     } else {",
-        " *       print('WebSocket not connected, message $data not sent');",
-        " *     }",
-        " *",
-        " * To receive data on the WebSocket, register a listener for message events.",
-        " *",
-        " *     webSocket.onMessage.listen((MessageEvent e) {",
-        " *       receivedData(e.data);",
-        " *     });",
-        " *",
-        " * The message event handler receives a [MessageEvent] object",
-        " * as its sole argument.",
-        " * You can also define open, close, and error handlers,",
-        " * as specified by [Event]s.",
-        " *",
-        " * For more information, see the",
-        " * [WebSockets](http://www.dartlang.org/docs/library-tour/#html-websockets)",
-        " * section of the library tour and",
-        " * [Introducing WebSockets](http://www.html5rocks.com/en/tutorials/websockets/basics/),",
-        " * an HTML5Rocks.com tutorial.",
-        " */"
-      ],
-      "members": {
-        "closeEvent": [
-          "/**",
-          "   * Static factory designed to expose `close` events to event",
-          "   * handlers that are not necessarily instances of [WebSocket].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [WebSocket].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "messageEvent": [
-          "/**",
-          "   * Static factory designed to expose `message` events to event",
-          "   * handlers that are not necessarily instances of [WebSocket].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onclose": [
-          "/// Stream of `close` events handled by this [WebSocket]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [WebSocket]."
-        ],
-        "onmessage": [
-          "/// Stream of `message` events handled by this [WebSocket]."
-        ],
-        "onopen": [
-          "/// Stream of `open` events handled by this [WebSocket]."
-        ],
-        "openEvent": [
-          "/**",
-          "   * Static factory designed to expose `open` events to event",
-          "   * handlers that are not necessarily instances of [WebSocket].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "send": [
-          "/**",
-          "   * Transmit data to the server over this connection.",
-          "   *",
-          "   * This method accepts data of type [Blob], [ByteBuffer], [String], or",
-          "   * [TypedData]. Named variants [sendBlob], [sendByteBuffer], [sendString],",
-          "   * or [sendTypedData], in contrast, only accept data of the specified type.",
-          "   */"
-        ]
-      }
-    },
-    "Window": {
-      "comment": [
-        "/**",
-        " * Top-level container for the current browser tab or window.",
-        " *",
-        " * In a web browser, each window has a [Window] object, but within the context",
-        " * of a script, this object represents only the current window.",
-        " * Each other window, tab, and iframe has its own [Window] object.",
-        " *",
-        " * Each window contains a [Document] object, which contains all of the window's",
-        " * content.",
-        " *",
-        " * Use the top-level `window` object to access the current window.",
-        " * For example:",
-        " *",
-        " *     // Draw a scene when the window repaints.",
-        " *     drawScene(num delta) {...}",
-        " *     window.animationFrame.then(drawScene);.",
-        " *",
-        " *     // Write to the console.",
-        " *     window.console.log('Jinkies!');",
-        " *     window.console.error('Jeepers!');",
-        " *",
-        " * **Note:** This class represents only the current window, while [WindowBase]",
-        " * is a representation of any window, including other tabs, windows, and frames.",
-        " *",
-        " * ## See also",
-        " *",
-        " * * [WindowBase]",
-        " *",
-        " * ## Other resources",
-        " *",
-        " * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.",
-        " * * [Window](http://www.w3.org/TR/Window/) from the W3C.",
-        " */"
-      ],
-      "members": {
-        "alert": [
-          "/**",
-          "   * Displays a modal alert to the user.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [User prompts](https://html.spec.whatwg.org/multipage/webappapis.html#user-prompts)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "applicationCache": [
-          "/**",
-          "   * The application cache for this window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [A beginner's guide to using the application",
-          "   *   cache](http://www.html5rocks.com/en/tutorials/appcache/beginner)",
-          "   *   from HTML5Rocks.",
-          "   * * [Application cache",
-          "   *   API](https://html.spec.whatwg.org/multipage/browsers.html#application-cache-api)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "confirm": [
-          "/**",
-          "   * Displays a modal OK/Cancel prompt to the user.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [User prompts](https://html.spec.whatwg.org/multipage/webappapis.html#user-prompts)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "crypto": [
-          "/**",
-          "   * Entrypoint for the browser's cryptographic functions.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Web cryptography API](http://www.w3.org/TR/WebCryptoAPI/) from W3C.",
-          "   */"
-        ],
-        "CSS": [
-          "/**",
-          "   * Entrypoint for CSS-related functions.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The CSS interface](http://dev.w3.org/csswg/css-conditional/#the-css-interface) from W3C.",
-          "   */"
-        ],
-        "defaultStatus": [
-          "/// *Deprecated*."
-        ],
-        "defaultstatus": [
-          "/// *Deprecated*."
-        ],
-        "devicemotionEvent": [
-          "/**",
-          "   * Static factory designed to expose `devicemotion` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "deviceorientationEvent": [
-          "/**",
-          "   * Static factory designed to expose `deviceorientation` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "devicePixelRatio": [
-          "/**",
-          "   * The ratio between physical pixels and logical CSS pixels.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [devicePixelRatio](http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html)",
-          "   *   from quirksmode.",
-          "   * * [More about devicePixelRatio](http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html)",
-          "   *   from quirksmode.",
-          "   */"
-        ],
-        "DOMContentLoadedEvent": [
-          "/**",
-          "   * Static factory designed to expose `contentloaded` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "find": [
-          "/**",
-          "   * Finds text in this window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.find](https://developer.mozilla.org/en-US/docs/Web/API/Window.find)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "getMatchedCSSRules": [
-          "/**",
-          "   * Returns all CSS rules that apply to the element's pseudo-element.",
-          "   */"
-        ],
-        "getSelection": [
-          "/**",
-          "   * Returns the currently selected text.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.getSelection](https://developer.mozilla.org/en-US/docs/Web/API/Window.getSelection)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "hashchangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `hashchange` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "history": [
-          "/**",
-          "   * The current session history for this window's newest document.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Loading web pages](https://html.spec.whatwg.org/multipage/browsers.html)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "innerHeight": [
-          "/**",
-          "   * The height of the viewport including scrollbars.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.innerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window/innerHeight)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "innerWidth": [
-          "/**",
-          "   * The width of the viewport including scrollbars.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.innerWidth](https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "localStorage": [
-          "/**",
-          "   * Storage for this window that persists across sessions.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [DOM storage guide](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage)",
-          "   *   from MDN.",
-          "   * * [The past, present & future of local storage for web",
-          "   *   applications](http://diveintohtml5.info/storage.html) from Dive Into HTML5.",
-          "   * * [Local storage specification](http://www.w3.org/TR/webstorage/#the-localstorage-attribute)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "locationbar": [
-          "/**",
-          "   * This window's location bar, which displays the URL.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Browser interface",
-          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "matchMedia": [
-          "/**",
-          "   * Returns a list of media queries for the given query string.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Testing media",
-          "   *   queries](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Testing_media_queries)",
-          "   *   from MDN.",
-          "   * * [The MediaQueryList",
-          "   *   specification](http://www.w3.org/TR/cssom-view/#the-mediaquerylist-interface) from W3C.",
-          "   */"
-        ],
-        "menubar": [
-          "/**",
-          "   * This window's menu bar, which displays menu commands.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Browser interface",
-          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "messageEvent": [
-          "/**",
-          "   * Static factory designed to expose `message` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "moveBy": [
-          "/**",
-          "   * Moves this window.",
-          "   *",
-          "   * x and y can be negative.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.moveBy](https://developer.mozilla.org/en-US/docs/Web/API/Window.moveBy)",
-          "   *   from MDN.",
-          "   * * [Window.moveBy](http://dev.w3.org/csswg/cssom-view/#dom-window-moveby) from W3C.",
-          "   */"
-        ],
-        "name": [
-          "/**",
-          "   * The name of this window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.name](https://developer.mozilla.org/en-US/docs/Web/API/Window/name)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "navigator": [
-          "/**",
-          "   * The user agent accessing this window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The navigator",
-          "   *   object](https://html.spec.whatwg.org/multipage/webappapis.html#the-navigator-object)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "offlineEvent": [
-          "/**",
-          "   * Static factory designed to expose `offline` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "offscreenBuffering": [
-          "/**",
-          "   * Whether objects are drawn offscreen before being displayed.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [offscreenBuffering](https://webplatform.github.io/docs/dom/HTMLElement/offscreenBuffering/)",
-          "   *   from WebPlatform.org.",
-          "   */"
-        ],
-        "onabort": [
-          "/// Stream of `abort` events handled by this [Window]."
-        ],
-        "onblur": [
-          "/// Stream of `blur` events handled by this [Window]."
-        ],
-        "onchange": [
-          "/// Stream of `change` events handled by this [Window]."
-        ],
-        "onclick": [
-          "/// Stream of `click` events handled by this [Window]."
-        ],
-        "oncontextmenu": [
-          "/// Stream of `contextmenu` events handled by this [Window]."
-        ],
-        "ondblclick": [
-          "/// Stream of `doubleclick` events handled by this [Window]."
-        ],
-        "ondevicemotion": [
-          "/// Stream of `devicemotion` events handled by this [Window]."
-        ],
-        "ondeviceorientation": [
-          "/// Stream of `deviceorientation` events handled by this [Window]."
-        ],
-        "onDOMContentLoaded": [
-          "/// Stream of `contentloaded` events handled by this [Window]."
-        ],
-        "ondrag": [
-          "/// Stream of `drag` events handled by this [Window]."
-        ],
-        "ondragend": [
-          "/// Stream of `dragend` events handled by this [Window]."
-        ],
-        "ondragenter": [
-          "/// Stream of `dragenter` events handled by this [Window]."
-        ],
-        "ondragleave": [
-          "/// Stream of `dragleave` events handled by this [Window]."
-        ],
-        "ondragover": [
-          "/// Stream of `dragover` events handled by this [Window]."
-        ],
-        "ondragstart": [
-          "/// Stream of `dragstart` events handled by this [Window]."
-        ],
-        "ondrop": [
-          "/// Stream of `drop` events handled by this [Window]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [Window]."
-        ],
-        "onfocus": [
-          "/// Stream of `focus` events handled by this [Window]."
-        ],
-        "onhashchange": [
-          "/// Stream of `hashchange` events handled by this [Window]."
-        ],
-        "oninput": [
-          "/// Stream of `input` events handled by this [Window]."
-        ],
-        "oninvalid": [
-          "/// Stream of `invalid` events handled by this [Window]."
-        ],
-        "onkeydown": [
-          "/// Stream of `keydown` events handled by this [Window]."
-        ],
-        "onkeypress": [
-          "/// Stream of `keypress` events handled by this [Window]."
-        ],
-        "onkeyup": [
-          "/// Stream of `keyup` events handled by this [Window]."
-        ],
-        "onlineEvent": [
-          "/**",
-          "   * Static factory designed to expose `online` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onload": [
-          "/// Stream of `load` events handled by this [Window]."
-        ],
-        "onmessage": [
-          "/// Stream of `message` events handled by this [Window]."
-        ],
-        "onmousedown": [
-          "/// Stream of `mousedown` events handled by this [Window]."
-        ],
-        "onmouseenter": [
-          "/// Stream of `mouseenter` events handled by this [Window]."
-        ],
-        "onmouseleave": [
-          "/// Stream of `mouseleave` events handled by this [Window]."
-        ],
-        "onmousemove": [
-          "/// Stream of `mousemove` events handled by this [Window]."
-        ],
-        "onmouseout": [
-          "/// Stream of `mouseout` events handled by this [Window]."
-        ],
-        "onmouseover": [
-          "/// Stream of `mouseover` events handled by this [Window]."
-        ],
-        "onmouseup": [
-          "/// Stream of `mouseup` events handled by this [Window]."
-        ],
-        "onmousewheel": [
-          "/// Stream of `mousewheel` events handled by this [Window]."
-        ],
-        "onoffline": [
-          "/// Stream of `offline` events handled by this [Window]."
-        ],
-        "ononline": [
-          "/// Stream of `online` events handled by this [Window]."
-        ],
-        "onpagehide": [
-          "/// Stream of `pagehide` events handled by this [Window]."
-        ],
-        "onpageshow": [
-          "/// Stream of `pageshow` events handled by this [Window]."
-        ],
-        "onpopstate": [
-          "/// Stream of `popstate` events handled by this [Window]."
-        ],
-        "onreset": [
-          "/// Stream of `reset` events handled by this [Window]."
-        ],
-        "onresize": [
-          "/// Stream of `resize` events handled by this [Window]."
-        ],
-        "onscroll": [
-          "/// Stream of `scroll` events handled by this [Window]."
-        ],
-        "onsearch": [
-          "/// Stream of `search` events handled by this [Window]."
-        ],
-        "onselect": [
-          "/// Stream of `select` events handled by this [Window]."
-        ],
-        "onstorage": [
-          "/// Stream of `storage` events handled by this [Window]."
-        ],
-        "onsubmit": [
-          "/// Stream of `submit` events handled by this [Window]."
-        ],
-        "ontouchcancel": [
-          "/// Stream of `touchcancel` events handled by this [Window]."
-        ],
-        "ontouchend": [
-          "/// Stream of `touchend` events handled by this [Window]."
-        ],
-        "ontouchmove": [
-          "/// Stream of `touchmove` events handled by this [Window]."
-        ],
-        "ontouchstart": [
-          "/// Stream of `touchstart` events handled by this [Window]."
-        ],
-        "ontransitionend": [
-          "/// Stream of `transitionend` events handled by this [Window]."
-        ],
-        "onunload": [
-          "/// Stream of `unload` events handled by this [Window]."
-        ],
-        "onwebkitAnimationEnd": [
-          "/// Stream of `animationend` events handled by this [Window]."
-        ],
-        "onwebkitAnimationIteration": [
-          "/// Stream of `animationiteration` events handled by this [Window]."
-        ],
-        "onwebkitAnimationStart": [
-          "/// Stream of `animationstart` events handled by this [Window]."
-        ],
-        "openDatabase": [
-          "/// *Deprecated.*"
-        ],
-        "outerHeight": [
-          "/**",
-          "   * The height of this window including all user interface elements.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.outerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerHeight)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "outerWidth": [
-          "/**",
-          "   * The width of the window including all user interface elements.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.outerWidth](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerWidth)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "pagehideEvent": [
-          "/**",
-          "   * Static factory designed to expose `pagehide` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "pageshowEvent": [
-          "/**",
-          "   * Static factory designed to expose `pageshow` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "pageXOffset": [
-          "/**",
-          "   * The distance this window has been scrolled horizontally.",
-          "   *",
-          "   * This attribute is an alias for [scrollX].",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The Screen interface",
-          "   *   specification](http://www.w3.org/TR/cssom-view/#screen) from W3C.",
-          "   * * [scrollX and",
-          "   *   pageXOffset](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollX)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "pageYOffset": [
-          "/**",
-          "   * The distance this window has been scrolled vertically.",
-          "   *",
-          "   * This attribute is an alias for [scrollY].",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The Screen interface",
-          "   *   specification](http://www.w3.org/TR/cssom-view/#screen) from W3C.",
-          "   * * [scrollY and",
-          "   *   pageYOffset](https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "performance": [
-          "/**",
-          "   * Timing and navigation data for this window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Measuring page load speed with navigation",
-          "   *   timeing](http://www.html5rocks.com/en/tutorials/webperformance/basics/)",
-          "   *   from HTML5Rocks.",
-          "   * * [Navigation timing",
-          "   *   specification](http://www.w3.org/TR/navigation-timing/) from W3C.",
-          "   */"
-        ],
-        "PERSISTENT": [
-          "/**",
-          "   * Indicates that file system data cannot be cleared unless given user",
-          "   * permission.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Exploring the FileSystem",
-          "   *   APIs](http://www.html5rocks.com/en/tutorials/file/filesystem/)",
-          "   *   from HTML5Rocks.",
-          "   * * [File API](http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "popstateEvent": [
-          "/**",
-          "   * Static factory designed to expose `popstate` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "print": [
-          "/**",
-          "   * Opens the print dialog for this window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.print](https://developer.mozilla.org/en-US/docs/Web/API/Window.print)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "resizeBy": [
-          "/**",
-          "   * Resizes this window by an offset.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.resizeBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/resizeBy)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "resizeEvent": [
-          "/**",
-          "   * Static factory designed to expose `resize` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "resizeTo": [
-          "/**",
-          "   * Resizes this window to a specific width and height.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.resizeTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/resizeTo)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "screen": [
-          "/**",
-          "   * Information about the screen displaying this window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "screenLeft": [
-          "/**",
-          "   * The distance from the left side of the screen to the left side of this",
-          "   * window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "screenTop": [
-          "/**",
-          "   * The distance from the top of the screen to the top of this window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "screenX": [
-          "/**",
-          "   * The distance from the left side of the screen to the mouse pointer.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "screenY": [
-          "/**",
-          "   * The distance from the top of the screen to the mouse pointer.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The Screen interface specification](http://www.w3.org/TR/cssom-view/#screen)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "scroll": [
-          "/**",
-          "   * Scrolls the page horizontally and vertically to a specific point.",
-          "   *",
-          "   * This method is identical to [scrollTo].",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "scrollbars": [
-          "/**",
-          "   * This window's scroll bars.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Browser interface",
-          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "scrollBy": [
-          "/**",
-          "   * Scrolls the page horizontally and vertically by an offset.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "scrollTo": [
-          "/**",
-          "   * Scrolls the page horizontally and vertically to a specific point.",
-          "   *",
-          "   * This method is identical to [scroll].",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "self": [
-          "/**",
-          "   * The current window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.self](https://developer.mozilla.org/en-US/docs/Web/API/Window.self)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "sessionStorage": [
-          "/**",
-          "   * Storage for this window that is cleared when this session ends.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [DOM storage",
-          "   *   guide](https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage)",
-          "   *   from MDN.",
-          "   * * [The past, present & future of local storage for web",
-          "   *   applications](http://diveintohtml5.info/storage.html) from Dive Into HTML5.",
-          "   * * [Local storage",
-          "   *   specification](http://www.w3.org/TR/webstorage/#dom-sessionstorage) from W3C.",
-          "   */"
-        ],
-        "showModalDialog": [
-          "/**",
-          "   * Opens a new page as a modal dialog.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Dialogs implemented using separate",
-          "   *   documents](http://www.w3.org/html/wg/drafts/html/master/webappapis.html#dialogs-implemented-using-separate-documents)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "speechSynthesis": [
-          "/**",
-          "   * Access to speech synthesis in the browser.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Web speech",
-          "   *   specification](https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "status": [
-          "/// *Deprecated*."
-        ],
-        "statusbar": [
-          "/**",
-          "   * This window's status bar.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Browser interface",
-          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "stop": [
-          "/**",
-          "   * Stops the window from loading.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [The Window",
-          "   *   object](http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-window-object)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "storageEvent": [
-          "/**",
-          "   * Static factory designed to expose `storage` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "styleMedia": [
-          "/**",
-          "   * Access to CSS media queries.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [StyleMedia class",
-          "   *   reference](https://developer.apple.com/library/safari/documentation/SafariDOMAdditions/Reference/StyleMedia/)",
-          "   *   from Safari Developer Library.",
-          "   */"
-        ],
-        "TEMPORARY": [
-          "/**",
-          "   * Indicates that file system data can be cleared at any time.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Exploring the FileSystem",
-          "   *   APIs](http://www.html5rocks.com/en/tutorials/file/filesystem/) from HTML5Rocks.",
-          "   * * [File API](http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "toolbar": [
-          "/**",
-          "   * This window's tool bar.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Browser interface",
-          "   *   elements](https://html.spec.whatwg.org/multipage/browsers.html#browser-interface-elements)",
-          "   *   from WHATWG.",
-          "   */"
-        ],
-        "unloadEvent": [
-          "/**",
-          "   * Static factory designed to expose `unload` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitAnimationEndEvent": [
-          "/**",
-          "   * Static factory designed to expose `animationend` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitAnimationIterationEvent": [
-          "/**",
-          "   * Static factory designed to expose `animationiteration` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitAnimationStartEvent": [
-          "/**",
-          "   * Static factory designed to expose `animationstart` events to event",
-          "   * handlers that are not necessarily instances of [Window].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "webkitResolveLocalFileSystemURL": [
-          "/**",
-          "   * Asynchronously retrieves a local filesystem entry.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Obtaining access to file system entry",
-          "   *   points](http://www.w3.org/TR/file-system-api/#obtaining-access-to-file-system-entry-points)",
-          "   * from W3C.",
-          "   */"
-        ],
-        "window": [
-          "/**",
-          "   * The current window.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [Window.window](https://developer.mozilla.org/en-US/docs/Web/API/Window.window)",
-          "   *   from MDN.",
-          "   */"
-        ]
-      }
-    },
-    "Worker": {
-      "members": {
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [Worker].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "messageEvent": [
-          "/**",
-          "   * Static factory designed to expose `message` events to event",
-          "   * handlers that are not necessarily instances of [Worker].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [Worker]."
-        ],
-        "onmessage": [
-          "/// Stream of `message` events handled by this [Worker]."
-        ]
-      }
-    },
-    "WorkerGlobalScope": {
-      "members": {
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [WorkerGlobalScope].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [WorkerGlobalScope]."
-        ]
-      }
-    },
-    "XMLHttpRequest": {
-      "members": {
-        "abort": [
-          "/**",
-          "   * Stop the current request.",
-          "   *",
-          "   * The request can only be stopped if readyState is `HEADERS_RECEIVED` or",
-          "   * `LOADING`. If this method is not in the process of being sent, the method",
-          "   * has no effect.",
-          "   */"
-        ],
-        "getAllResponseHeaders": [
-          "/**",
-          "   * Retrieve all the response headers from a request.",
-          "   *",
-          "   * `null` if no headers have been received. For multipart requests,",
-          "   * `getAllResponseHeaders` will return the response headers for the current",
-          "   * part of the request.",
-          "   *",
-          "   * See also [HTTP response",
-          "   * headers](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields)",
-          "   * for a list of common response headers.",
-          "   */"
-        ],
-        "getResponseHeader": [
-          "/**",
-          "   * Return the response header named `header`, or null if not found.",
-          "   *",
-          "   * See also [HTTP response",
-          "   * headers](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields)",
-          "   * for a list of common response headers.",
-          "   */"
-        ],
-        "onreadystatechange": [
-          "/// Stream of `readystatechange` events handled by this [HttpRequest].",
-          "/**",
-          "   * Event listeners to be notified every time the [HttpRequest]",
-          "   * object's `readyState` changes values.",
-          "   */"
-        ],
-        "open": [
-          "/**",
-          "   * Specify the desired `url`, and `method` to use in making the request.",
-          "   *",
-          "   * By default the request is done asynchronously, with no user or password",
-          "   * authentication information. If `async` is false, the request will be send",
-          "   * synchronously.",
-          "   *",
-          "   * Calling `open` again on a currently active request is equivalent to",
-          "   * calling `abort`.",
-          "   *",
-          "   * Note: Most simple HTTP requests can be accomplished using the [getString],",
-          "   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this",
-          "   * `open` method is intended only for more complex HTTP requests where",
-          "   * finer-grained control is needed.",
-          "   */"
-        ],
-        "overrideMimeType": [
-          "/**",
-          "   * Specify a particular MIME type (such as `text/xml`) desired for the",
-          "   * response.",
-          "   *",
-          "   * This value must be set before the request has been sent. See also the list",
-          "   * of [IANA Official MIME types](https://www.iana.org/assignments/media-types/media-types.xhtml).",
-          "   */"
-        ],
-        "readyState": [
-          "/**",
-          "   * Indicator of the current state of the request:",
-          "   *",
-          "   * <table>",
-          "   *   <tr>",
-          "   *     <td>Value</td>",
-          "   *     <td>State</td>",
-          "   *     <td>Meaning</td>",
-          "   *   </tr>",
-          "   *   <tr>",
-          "   *     <td>0</td>",
-          "   *     <td>unsent</td>",
-          "   *     <td><code>open()</code> has not yet been called</td>",
-          "   *   </tr>",
-          "   *   <tr>",
-          "   *     <td>1</td>",
-          "   *     <td>opened</td>",
-          "   *     <td><code>send()</code> has not yet been called</td>",
-          "   *   </tr>",
-          "   *   <tr>",
-          "   *     <td>2</td>",
-          "   *     <td>headers received</td>",
-          "   *     <td><code>sent()</code> has been called; response headers and <code>status</code> are available</td>",
-          "   *   </tr>",
-          "   *   <tr>",
-          "   *     <td>3</td> <td>loading</td> <td><code>responseText</code> holds some data</td>",
-          "   *   </tr>",
-          "   *   <tr>",
-          "   *     <td>4</td> <td>done</td> <td>request is complete</td>",
-          "   *   </tr>",
-          "   * </table>",
-          "   */"
-        ],
-        "readystatechangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `readystatechange` events to event",
-          "   * handlers that are not necessarily instances of [HttpRequest].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "response": [
-          "/**",
-          "   * The data received as a reponse from the request.",
-          "   *",
-          "   * The data could be in the",
-          "   * form of a [String], [ByteBuffer], [Document], [Blob], or json (also a",
-          "   * [String]). `null` indicates request failure.",
-          "   */"
-        ],
-        "responseText": [
-          "/**",
-          "   * The response in String form or empty String on failure.",
-          "   */"
-        ],
-        "responseType": [
-          "/**",
-          "   * [String] telling the server the desired response format.",
-          "   *",
-          "   * Default is `String`.",
-          "   * Other options are one of 'arraybuffer', 'blob', 'document', 'json',",
-          "   * 'text'. Some newer browsers will throw NS_ERROR_DOM_INVALID_ACCESS_ERR if",
-          "   * `responseType` is set while performing a synchronous request.",
-          "   *",
-          "   * See also: [MDN",
-          "   * responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype)",
-          "   */"
-        ],
-        "responseXML": [
-          "/**",
-          "   * The request response, or null on failure.",
-          "   *",
-          "   * The response is processed as",
-          "   * `text/xml` stream, unless responseType = 'document' and the request is",
-          "   * synchronous.",
-          "   */"
-        ],
-        "send": [
-          "/**",
-          "   * Send the request with any given `data`.",
-          "   *",
-          "   * Note: Most simple HTTP requests can be accomplished using the [getString],",
-          "   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this",
-          "   * `send` method is intended only for more complex HTTP requests where",
-          "   * finer-grained control is needed.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [XMLHttpRequest.send](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#send%28%29)",
-          "   *   from MDN.",
-          "   */"
-        ],
-        "setRequestHeader": [
-          "/**",
-          "   * Sets the value of an HTTP request header.",
-          "   *",
-          "   * This method should be called after the request is opened, but before",
-          "   * the request is sent.",
-          "   *",
-          "   * Multiple calls with the same header will combine all their values into a",
-          "   * single header.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [XMLHttpRequest.setRequestHeader](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#setRequestHeader())",
-          "   *   from MDN.",
-          "   * * [The setRequestHeader()",
-          "   *   method](http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "status": [
-          "/**",
-          "   * The HTTP result code from the request (200, 404, etc).",
-          "   * See also: [HTTP Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)",
-          "   */"
-        ],
-        "statusText": [
-          "/**",
-          "   * The request response string (such as \\\"OK\\\").",
-          "   * See also: [HTTP Status Codes](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)",
-          "   */"
-        ],
-        "timeout": [
-          "/**",
-          "   * Length of time in milliseconds before a request is automatically",
-          "   * terminated.",
-          "   *",
-          "   * When the time has passed, a [HttpRequestEventTarget.timeoutEvent] is",
-          "   * dispatched.",
-          "   *",
-          "   * If [timeout] is set to 0, then the request will not time out.",
-          "   *",
-          "   * ## Other resources",
-          "   *",
-          "   * * [XMLHttpRequest.timeout](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-timeout)",
-          "   *   from MDN.",
-          "   * * [The timeout attribute](http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute)",
-          "   *   from W3C.",
-          "   */"
-        ],
-        "upload": [
-          "/**",
-          "   * [EventTarget] that can hold listeners to track the progress of the request.",
-          "   */"
-        ],
-        "withCredentials": [
-          "/**",
-          "   * True if cross-site requests should use credentials such as cookies",
-          "   * or authorization headers; false otherwise.",
-          "   *",
-          "   * This value is ignored for same-site requests.",
-          "   */"
-        ],
-        "XMLHttpRequest": [
-          "/**",
-          "   * General constructor for any type of request (GET, POST, etc).",
-          "   *",
-          "   * This call is used in conjunction with [open]:",
-          "   *",
-          "   *     var request = new HttpRequest();",
-          "   *     request.open('GET', 'http://dartlang.org');",
-          "   *     request.onLoad.listen((event) => print(",
-          "   *         'Request complete ${event.target.reponseText}'));",
-          "   *     request.send();",
-          "   *",
-          "   * is the (more verbose) equivalent of",
-          "   *",
-          "   *     HttpRequest.getString('http://dartlang.org').then(",
-          "   *         (result) => print('Request complete: $result'));",
-          "   */"
-        ]
-      }
-    },
-    "XMLHttpRequestEventTarget": {
-      "members": {
-        "abortEvent": [
-          "/**",
-          "   * Static factory designed to expose `abort` events to event",
-          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadendEvent": [
-          "/**",
-          "   * Static factory designed to expose `loadend` events to event",
-          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadEvent": [
-          "/**",
-          "   * Static factory designed to expose `load` events to event",
-          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `loadstart` events to event",
-          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onabort": [
-          "/// Stream of `abort` events handled by this [HttpRequestEventTarget]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [HttpRequestEventTarget]."
-        ],
-        "onload": [
-          "/// Stream of `load` events handled by this [HttpRequestEventTarget]."
-        ],
-        "onloadend": [
-          "/// Stream of `loadend` events handled by this [HttpRequestEventTarget]."
-        ],
-        "onloadstart": [
-          "/// Stream of `loadstart` events handled by this [HttpRequestEventTarget]."
-        ],
-        "onprogress": [
-          "/// Stream of `progress` events handled by this [HttpRequestEventTarget]."
-        ],
-        "ontimeout": [
-          "/// Stream of `timeout` events handled by this [HttpRequestEventTarget]."
-        ],
-        "progressEvent": [
-          "/**",
-          "   * Static factory designed to expose `progress` events to event",
-          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "timeoutEvent": [
-          "/**",
-          "   * Static factory designed to expose `timeout` events to event",
-          "   * handlers that are not necessarily instances of [HttpRequestEventTarget].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    }
-  },
-  "dart.dom.indexed_db": {
-    "IDBDatabase": {
-      "comment": [
-        "/**",
-        " * An indexed database object for storing client-side data",
-        " * in web apps.",
-        " */"
-      ],
-      "members": {
-        "abortEvent": [
-          "/**",
-          "   * Static factory designed to expose `abort` events to event",
-          "   * handlers that are not necessarily instances of [Database].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "closeEvent": [
-          "/**",
-          "   * Static factory designed to expose `close` events to event",
-          "   * handlers that are not necessarily instances of [Database].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [Database].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onabort": [
-          "/// Stream of `abort` events handled by this [Database]."
-        ],
-        "onclose": [
-          "/// Stream of `close` events handled by this [Database]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [Database]."
-        ],
-        "onversionchange": [
-          "/// Stream of `versionchange` events handled by this [Database]."
-        ],
-        "versionchangeEvent": [
-          "/**",
-          "   * Static factory designed to expose `versionchange` events to event",
-          "   * handlers that are not necessarily instances of [Database].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "IDBOpenDBRequest": {
-      "members": {
-        "blockedEvent": [
-          "/**",
-          "   * Static factory designed to expose `blocked` events to event",
-          "   * handlers that are not necessarily instances of [OpenDBRequest].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onblocked": [
-          "/// Stream of `blocked` events handled by this [OpenDBRequest]."
-        ],
-        "onupgradeneeded": [
-          "/// Stream of `upgradeneeded` events handled by this [OpenDBRequest]."
-        ],
-        "upgradeneededEvent": [
-          "/**",
-          "   * Static factory designed to expose `upgradeneeded` events to event",
-          "   * handlers that are not necessarily instances of [OpenDBRequest].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "IDBRequest": {
-      "members": {
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [Request].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [Request]."
-        ],
-        "onsuccess": [
-          "/// Stream of `success` events handled by this [Request]."
-        ],
-        "successEvent": [
-          "/**",
-          "   * Static factory designed to expose `success` events to event",
-          "   * handlers that are not necessarily instances of [Request].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    },
-    "IDBTransaction": {
-      "members": {
-        "abortEvent": [
-          "/**",
-          "   * Static factory designed to expose `abort` events to event",
-          "   * handlers that are not necessarily instances of [Transaction].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "completeEvent": [
-          "/**",
-          "   * Static factory designed to expose `complete` events to event",
-          "   * handlers that are not necessarily instances of [Transaction].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [Transaction].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onabort": [
-          "/// Stream of `abort` events handled by this [Transaction]."
-        ],
-        "oncomplete": [
-          "/// Stream of `complete` events handled by this [Transaction]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [Transaction]."
-        ]
-      }
-    }
-  },
-  "dart.dom.svg": {
-    "SVGElementInstance": {
-      "members": {
-        "abortEvent": [
-          "/**",
-          "   * Static factory designed to expose `abort` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "beforecopyEvent": [
-          "/**",
-          "   * Static factory designed to expose `beforecopy` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "beforecutEvent": [
-          "/**",
-          "   * Static factory designed to expose `beforecut` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "beforepasteEvent": [
-          "/**",
-          "   * Static factory designed to expose `beforepaste` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "blurEvent": [
-          "/**",
-          "   * Static factory designed to expose `blur` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "changeEvent": [
-          "/**",
-          "   * Static factory designed to expose `change` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "clickEvent": [
-          "/**",
-          "   * Static factory designed to expose `click` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "contextmenuEvent": [
-          "/**",
-          "   * Static factory designed to expose `contextmenu` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "copyEvent": [
-          "/**",
-          "   * Static factory designed to expose `copy` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "cutEvent": [
-          "/**",
-          "   * Static factory designed to expose `cut` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dblclickEvent": [
-          "/**",
-          "   * Static factory designed to expose `doubleclick` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dragendEvent": [
-          "/**",
-          "   * Static factory designed to expose `dragend` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dragenterEvent": [
-          "/**",
-          "   * Static factory designed to expose `dragenter` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dragEvent": [
-          "/**",
-          "   * Static factory designed to expose `drag` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dragleaveEvent": [
-          "/**",
-          "   * Static factory designed to expose `dragleave` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dragoverEvent": [
-          "/**",
-          "   * Static factory designed to expose `dragover` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dragstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `dragstart` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "dropEvent": [
-          "/**",
-          "   * Static factory designed to expose `drop` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "errorEvent": [
-          "/**",
-          "   * Static factory designed to expose `error` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "focusEvent": [
-          "/**",
-          "   * Static factory designed to expose `focus` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "inputEvent": [
-          "/**",
-          "   * Static factory designed to expose `input` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "keydownEvent": [
-          "/**",
-          "   * Static factory designed to expose `keydown` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "keypressEvent": [
-          "/**",
-          "   * Static factory designed to expose `keypress` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "keyupEvent": [
-          "/**",
-          "   * Static factory designed to expose `keyup` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "loadEvent": [
-          "/**",
-          "   * Static factory designed to expose `load` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mousedownEvent": [
-          "/**",
-          "   * Static factory designed to expose `mousedown` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseenterEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseenter` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseleaveEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseleave` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mousemoveEvent": [
-          "/**",
-          "   * Static factory designed to expose `mousemove` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseoutEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseout` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseoverEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseover` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mouseupEvent": [
-          "/**",
-          "   * Static factory designed to expose `mouseup` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "mousewheelEvent": [
-          "/**",
-          "   * Static factory designed to expose `mousewheel` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onabort": [
-          "/// Stream of `abort` events handled by this [ElementInstance]."
-        ],
-        "onbeforecopy": [
-          "/// Stream of `beforecopy` events handled by this [ElementInstance]."
-        ],
-        "onbeforecut": [
-          "/// Stream of `beforecut` events handled by this [ElementInstance]."
-        ],
-        "onbeforepaste": [
-          "/// Stream of `beforepaste` events handled by this [ElementInstance]."
-        ],
-        "onblur": [
-          "/// Stream of `blur` events handled by this [ElementInstance]."
-        ],
-        "onchange": [
-          "/// Stream of `change` events handled by this [ElementInstance]."
-        ],
-        "onclick": [
-          "/// Stream of `click` events handled by this [ElementInstance]."
-        ],
-        "oncontextmenu": [
-          "/// Stream of `contextmenu` events handled by this [ElementInstance]."
-        ],
-        "oncopy": [
-          "/// Stream of `copy` events handled by this [ElementInstance]."
-        ],
-        "oncut": [
-          "/// Stream of `cut` events handled by this [ElementInstance]."
-        ],
-        "ondblclick": [
-          "/// Stream of `doubleclick` events handled by this [ElementInstance]."
-        ],
-        "ondrag": [
-          "/// Stream of `drag` events handled by this [ElementInstance]."
-        ],
-        "ondragend": [
-          "/// Stream of `dragend` events handled by this [ElementInstance]."
-        ],
-        "ondragenter": [
-          "/// Stream of `dragenter` events handled by this [ElementInstance]."
-        ],
-        "ondragleave": [
-          "/// Stream of `dragleave` events handled by this [ElementInstance]."
-        ],
-        "ondragover": [
-          "/// Stream of `dragover` events handled by this [ElementInstance]."
-        ],
-        "ondragstart": [
-          "/// Stream of `dragstart` events handled by this [ElementInstance]."
-        ],
-        "ondrop": [
-          "/// Stream of `drop` events handled by this [ElementInstance]."
-        ],
-        "onerror": [
-          "/// Stream of `error` events handled by this [ElementInstance]."
-        ],
-        "onfocus": [
-          "/// Stream of `focus` events handled by this [ElementInstance]."
-        ],
-        "oninput": [
-          "/// Stream of `input` events handled by this [ElementInstance]."
-        ],
-        "onkeydown": [
-          "/// Stream of `keydown` events handled by this [ElementInstance]."
-        ],
-        "onkeypress": [
-          "/// Stream of `keypress` events handled by this [ElementInstance]."
-        ],
-        "onkeyup": [
-          "/// Stream of `keyup` events handled by this [ElementInstance]."
-        ],
-        "onload": [
-          "/// Stream of `load` events handled by this [ElementInstance]."
-        ],
-        "onmousedown": [
-          "/// Stream of `mousedown` events handled by this [ElementInstance]."
-        ],
-        "onmouseenter": [
-          "/// Stream of `mouseenter` events handled by this [ElementInstance]."
-        ],
-        "onmouseleave": [
-          "/// Stream of `mouseleave` events handled by this [ElementInstance]."
-        ],
-        "onmousemove": [
-          "/// Stream of `mousemove` events handled by this [ElementInstance]."
-        ],
-        "onmouseout": [
-          "/// Stream of `mouseout` events handled by this [ElementInstance]."
-        ],
-        "onmouseover": [
-          "/// Stream of `mouseover` events handled by this [ElementInstance]."
-        ],
-        "onmouseup": [
-          "/// Stream of `mouseup` events handled by this [ElementInstance]."
-        ],
-        "onmousewheel": [
-          "/// Stream of `mousewheel` events handled by this [ElementInstance]."
-        ],
-        "onpaste": [
-          "/// Stream of `paste` events handled by this [ElementInstance]."
-        ],
-        "onreset": [
-          "/// Stream of `reset` events handled by this [ElementInstance]."
-        ],
-        "onresize": [
-          "/// Stream of `resize` events handled by this [ElementInstance]."
-        ],
-        "onscroll": [
-          "/// Stream of `scroll` events handled by this [ElementInstance]."
-        ],
-        "onsearch": [
-          "/// Stream of `search` events handled by this [ElementInstance]."
-        ],
-        "onselect": [
-          "/// Stream of `select` events handled by this [ElementInstance]."
-        ],
-        "onselectstart": [
-          "/// Stream of `selectstart` events handled by this [ElementInstance]."
-        ],
-        "onsubmit": [
-          "/// Stream of `submit` events handled by this [ElementInstance]."
-        ],
-        "onunload": [
-          "/// Stream of `unload` events handled by this [ElementInstance]."
-        ],
-        "pasteEvent": [
-          "/**",
-          "   * Static factory designed to expose `paste` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "resetEvent": [
-          "/**",
-          "   * Static factory designed to expose `reset` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "resizeEvent": [
-          "/**",
-          "   * Static factory designed to expose `resize` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "scrollEvent": [
-          "/**",
-          "   * Static factory designed to expose `scroll` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "searchEvent": [
-          "/**",
-          "   * Static factory designed to expose `search` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "selectEvent": [
-          "/**",
-          "   * Static factory designed to expose `select` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "selectstartEvent": [
-          "/**",
-          "   * Static factory designed to expose `selectstart` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "submitEvent": [
-          "/**",
-          "   * Static factory designed to expose `submit` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "unloadEvent": [
-          "/**",
-          "   * Static factory designed to expose `unload` events to event",
-          "   * handlers that are not necessarily instances of [ElementInstance].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ]
-      }
-    }
-  },
-  "dart.dom.web_audio": {
-    "AudioBufferSourceNode": {
-      "members": {
-        "endedEvent": [
-          "/**",
-          "   * Static factory designed to expose `ended` events to event",
-          "   * handlers that are not necessarily instances of [AudioBufferSourceNode].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onended": [
-          "/// Stream of `ended` events handled by this [AudioBufferSourceNode]."
-        ]
-      }
-    },
-    "AudioContext": {
-      "members": {
-        "completeEvent": [
-          "/**",
-          "   * Static factory designed to expose `complete` events to event",
-          "   * handlers that are not necessarily instances of [AudioContext].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "oncomplete": [
-          "/// Stream of `complete` events handled by this [AudioContext]."
-        ]
-      }
-    },
-    "OscillatorNode": {
-      "members": {
-        "endedEvent": [
-          "/**",
-          "   * Static factory designed to expose `ended` events to event",
-          "   * handlers that are not necessarily instances of [OscillatorNode].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onended": [
-          "/// Stream of `ended` events handled by this [OscillatorNode]."
-        ]
-      }
-    },
-    "ScriptProcessorNode": {
-      "members": {
-        "audioprocessEvent": [
-          "/**",
-          "   * Static factory designed to expose `audioprocess` events to event",
-          "   * handlers that are not necessarily instances of [ScriptProcessorNode].",
-          "   *",
-          "   * See [EventStreamProvider] for usage information.",
-          "   */"
-        ],
-        "onaudioprocess": [
-          "/// Stream of `audioprocess` events handled by this [ScriptProcessorNode].",
-          "/**",
-          "   * Get a Stream that fires events when AudioProcessingEvents occur.",
-          "   * This particular stream is special in that it only allows one listener to a",
-          "   * given stream. Converting the returned [Stream.asBroadcastStream] will",
-          "   * likely ruin the soft-real-time properties which which these events are",
-          "   * fired and can be processed.",
-          "   */"
-        ]
-      }
-    }
-  },
-  "dart.dom.web_gl": {
-    "WebGLContextAttributes": {
-      "comment": [
-        "/**",
-        " * The properties of a WebGL rendering context.",
-        " *",
-        " * If [alpha] is `true`, then the context has an alpha channel.",
-        " *",
-        " * If [antialias] is `true`, then antialiasing is performed by the browser, but",
-        " * only if the browser's implementation of WebGL supports antialiasing.",
-        " *",
-        " * If [depth] is `true`, then the context has a depth buffer of at least 16",
-        " * bits.",
-        " *",
-        " * If [premultipliedAlpha] is `true`, then the context's colors are assumed to",
-        " * be premultiplied. This means that color values are assumed to have  been",
-        " * multiplied by their alpha values. If [alpha] is `false`, then this flag is",
-        " * ignored.",
-        " *",
-        " * If [preserveDrawingBuffer] is `false`, then all contents of the context are",
-        " * cleared. If `true`, then all values will remain until changed or cleared.",
-        " *",
-        " * If [stencil] is `true`, then the context has a stencil buffer of at least 8",
-        " * bits.",
-        " */"
-      ]
-    },
-    "WebGLRenderingContext": {
-      "members": {
-      }
-    }
-  },
-  "dart.dom.web_sql": {
-    "Database": {
-      "members": {
-        "changeVersion": [
-          "/**",
-          "   * Atomically update the database version to [newVersion], asynchronously",
-          "   * running [callback] on the [SqlTransaction] representing this",
-          "   * [changeVersion] transaction.",
-          "   *",
-          "   * If [callback] runs successfully, then [successCallback] is called.",
-          "   * Otherwise, [errorCallback] is called.",
-          "   *",
-          "   * [oldVersion] should match the database's current [version] exactly.",
-          "   *",
-          "   * See also:",
-          "   *",
-          "   * * [Database.changeVersion](http://www.w3.org/TR/webdatabase/#dom-database-changeversion) from W3C.",
-          "   */"
-        ]
-      }
-    }
-  }
-}
diff --git a/tools/dom/docs/docs.status b/tools/dom/docs/docs.status
deleted file mode 100644
index a502066..0000000
--- a/tools/dom/docs/docs.status
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright (c) 2013, 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.
-
-# docs.dart is a tool that only runs on the VM
-[ $compiler == dart2js ]
-*: Skip
diff --git a/tools/dom/docs/lib/docs.dart b/tools/dom/docs/lib/docs.dart
deleted file mode 100644
index ed9ecc6..0000000
--- a/tools/dom/docs/lib/docs.dart
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (c) 2013, 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.
-
-/**
- * A library for extracting the documentation from the various HTML libraries
- * ([dart:html], [dart:svg], [dart:web_audio], [dart:indexed_db]) and saving
- * those documentation comments to a JSON file.
- */
-
-library docs;
-
-import '../../../../sdk/lib/_internal/dartdoc/lib/src/dart2js_mirrors.dart';
-import '../../../../pkg/compiler/lib/src/mirrors/source_mirrors.dart';
-import '../../../../pkg/compiler/lib/src/mirrors/mirrors_util.dart';
-import '../../../../sdk/lib/_internal/dartdoc/lib/dartdoc.dart';
-import '../../../../sdk/lib/_internal/dartdoc/lib/src/json_serializer.dart';
-import '../../../../utils/apidoc/lib/metadata.dart';
-import 'dart:async';
-import 'dart:io';
-
-/// The various HTML libraries.
-const List<String> HTML_LIBRARY_NAMES = const [
-  'dart:html',
-  'dart:indexed_db',
-  'dart:svg',
-  'dart:web_audio',
-  'dart:web_gl',
-  'dart:web_sql'
-];
-/**
- * Converts the libraries in [HTML_LIBRARY_NAMES] to a json file at [jsonPath]
- * given the library path at [libUri].
- *
- * The json output looks like:
- *     {
- *       $library_name: {
- *         $interface_name: {
- *           comment: "$comment"
- *           members: {
- *             $member: [
- *               [$comment1line1,
- *                $comment1line2,
- *                ...],
- *               ...
- *             ],
- *             ...
- *           }
- *         },
- *         ...
- *       },
- *       ...
- *     }
- *
- * Completes to true if any errors were encountered, false otherwise.
- */
-Future<bool> convert(String libUri, String jsonPath) {
-  var paths = <String>[];
-  for (var libraryName in HTML_LIBRARY_NAMES) {
-    paths.add(libraryName);
-  }
-
-  return analyze(paths, libUri, options: ['--preserve-comments'])
-      .then((MirrorSystem mirrors) {
-    var convertedJson = _generateJsonFromLibraries(mirrors);
-    return _exportJsonToFile(convertedJson, jsonPath);
-  });
-}
-
-Future<bool> _exportJsonToFile(Map convertedJson, String jsonPath) {
-  return new Future.sync(() {
-    final jsonFile = new File(jsonPath);
-    var writeJson = prettySerialize(convertedJson);
-
-    var outputStream = jsonFile.openWrite();
-    outputStream.writeln(writeJson);
-    outputStream.close();
-    return outputStream.done.then((_) => false);
-  });
-}
-
-Map _generateJsonFromLibraries(MirrorSystem mirrors) {
-  var convertedJson = {};
-
-  // Sort the libraries by name (not key).
-  var sortedLibraries = new List<LibraryMirror>.from(mirrors.libraries.values
-      .where((e) => HTML_LIBRARY_NAMES.indexOf(e.uri.toString()) >= 0))
-    ..sort((x, y) => x.uri
-        .toString()
-        .toUpperCase()
-        .compareTo(y.uri.toString().toUpperCase()));
-
-  for (LibraryMirror libMirror in sortedLibraries) {
-    print('Extracting documentation from ${libMirror.simpleName}.');
-
-    var libraryJson = {};
-    var sortedClasses = _sortAndFilterMirrors(
-        classesOf(libMirror.declarations).toList(),
-        ignoreDocsEditable: true);
-
-    for (ClassMirror classMirror in sortedClasses) {
-      print(' class: $classMirror');
-      var classJson = {};
-      var sortedMembers =
-          _sortAndFilterMirrors(membersOf(classMirror.declarations).toList());
-
-      var membersJson = {};
-      for (var memberMirror in sortedMembers) {
-        print('  member: $memberMirror');
-        var memberDomName = domNames(memberMirror)[0];
-        var memberComment = _splitCommentsByNewline(
-            computeUntrimmedCommentAsList(memberMirror));
-
-        // Remove interface name from Dom Name.
-        if (memberDomName.indexOf('.') >= 0) {
-          memberDomName =
-              memberDomName.substring(memberDomName.indexOf('.') + 1);
-        }
-
-        if (!memberComment.isEmpty) {
-          membersJson.putIfAbsent(memberDomName, () => memberComment);
-        }
-      }
-
-      // Only include the comment if DocsEditable is set.
-      var classComment =
-          _splitCommentsByNewline(computeUntrimmedCommentAsList(classMirror));
-      if (!classComment.isEmpty &&
-          findMetadata(classMirror.metadata, 'DocsEditable') != null) {
-        classJson.putIfAbsent('comment', () => classComment);
-      }
-      if (!membersJson.isEmpty) {
-        classJson.putIfAbsent('members', () => membersJson);
-      }
-
-      if (!classJson.isEmpty) {
-        libraryJson.putIfAbsent(domNames(classMirror)[0], () => classJson);
-      }
-    }
-
-    if (!libraryJson.isEmpty) {
-      convertedJson.putIfAbsent(nameOf(libMirror), () => libraryJson);
-    }
-  }
-
-  return convertedJson;
-}
-
-/// Filter out mirrors that are private, or which are not part of this docs
-/// process. That is, ones without the DocsEditable annotation.
-/// If [ignoreDocsEditable] is true, relax the restriction on @DocsEditable().
-/// This is to account for classes that are defined in a template, but whose
-/// members are generated.
-List<DeclarationMirror> _sortAndFilterMirrors(List<DeclarationMirror> mirrors,
-    {ignoreDocsEditable: false}) {
-  var filteredMirrors = mirrors
-      .where((DeclarationMirror c) =>
-          !domNames(c).isEmpty &&
-          !displayName(c).startsWith('_') &&
-          (!ignoreDocsEditable
-              ? (findMetadata(c.metadata, 'DocsEditable') != null)
-              : true))
-      .toList();
-
-  filteredMirrors.sort((x, y) =>
-      domNames(x)[0].toUpperCase().compareTo(domNames(y)[0].toUpperCase()));
-
-  return filteredMirrors;
-}
-
-List<String> _splitCommentsByNewline(List<String> comments) {
-  var out = [];
-
-  comments.forEach((c) {
-    out.addAll(c.split(new RegExp('\n')));
-  });
-
-  return out;
-}
-
-/// Given the class mirror, returns the names found or an empty list.
-List<String> domNames(DeclarationMirror mirror) {
-  var domNameMetadata = findMetadata(mirror.metadata, 'DomName');
-
-  if (domNameMetadata != null) {
-    var domNames = <String>[];
-    var tags = domNameMetadata.getField(#name);
-    for (var s in tags.reflectee.split(',')) {
-      domNames.add(s.trim());
-    }
-
-    if (domNames.length == 1 && domNames[0] == 'none') return <String>[];
-    return domNames;
-  } else {
-    return <String>[];
-  }
-}
diff --git a/tools/dom/docs/test/docs_test.dart b/tools/dom/docs/test/docs_test.dart
deleted file mode 100644
index 015f8e9..0000000
--- a/tools/dom/docs/test/docs_test.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2013, 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 docs_test;
-
-import 'dart:io';
-
-import 'package:unittest/unittest.dart';
-import 'package:path/path.dart' as path;
-
-import '../bin/docs.dart';
-import '../lib/docs.dart';
-
-final testJsonPath = Platform.script.resolve('test.json').toFilePath();
-
-main() {
-  // Some tests take more than the default 20 second unittest timeout.
-  unittestConfiguration.timeout = null;
-  group('docs', () {
-    var oldJson = new File(json_path);
-    var testJson = new File(testJsonPath);
-
-    tearDown(() {
-      // Clean up.
-      if (testJson.existsSync()) {
-        testJson.deleteSync();
-      }
-      assert(!testJson.existsSync());
-    });
-
-    test('Ensure that docs.json is up to date', () {
-      // We should find a json file where we expect it.
-      expect(oldJson.existsSync(), isTrue);
-
-      // Save the last modified time to check it at the end.
-      var oldJsonModified = oldJson.lastModifiedSync();
-
-      // There should be no test file yet.
-      if (testJson.existsSync()) testJson.deleteSync();
-      assert(!testJson.existsSync());
-
-      expect(
-          convert(lib_uri, testJsonPath).then((bool anyErrors) {
-            expect(anyErrors, isFalse);
-
-            // We should have a file now.
-            expect(testJson.existsSync(), isTrue);
-
-            // Ensure that there's nothing different between the new JSON and old.
-            expect(testJson.readAsStringSync(),
-                equals(oldJson.readAsStringSync()));
-
-            // Ensure that the old JSON file didn't actually change.
-            expect(oldJsonModified, equals(oldJson.lastModifiedSync()));
-          }),
-          completes);
-    });
-  });
-}
diff --git a/tools/dom/dom.py b/tools/dom/dom.py
index f986d3f..9fcdf99 100755
--- a/tools/dom/dom.py
+++ b/tools/dom/dom.py
@@ -64,20 +64,6 @@
     compile_dart2js(argv.pop(0), True)
 
 
-def docs():
-    return call([
-        os.path.join(dart_out_dir, 'dart-sdk', 'bin', 'dart'),
-        '--package-root=%s' % os.path.join(dart_out_dir, 'packages/'),
-        os.path.join('tools', 'dom', 'docs', 'bin', 'docs.dart'),
-    ])
-
-
-def test_docs():
-    return call([
-        os.path.join('tools', 'test.py'), '--mode=release', '--checked', 'docs'
-    ])
-
-
 def compile_dart2js(dart_file, checked):
     out_file = dart_file + '.js'
     dart2js_path = os.path.join(dart_out_dir, 'dart-sdk', 'bin', 'dart2js')
@@ -187,10 +173,8 @@
     'analyze': [analyze, 'Run the dart analyzer'],
     'build': [build, 'Build dart in release mode'],
     'dart2js': [dart2js, 'Run dart2js on the .dart file specified'],
-    'docs': [docs, 'Generates docs.json'],
     'gen': [gen, 'Re-generate DOM generated files (run go.sh)'],
     'size_check': [size_check, 'Check the size of dart2js compiled Swarm'],
-    'test_docs': [test_docs, 'Tests docs.dart'],
     'test_chrome': [
         test_chrome, 'Run tests in checked mode in Chrome.\n'
         '\t\tOptionally provide name of test to run.'
diff --git a/tools/dom/scripts/CSSPropertyNames.in b/tools/dom/scripts/CSSPropertyNames.in
index 39b49ad..8947335 100644
--- a/tools/dom/scripts/CSSPropertyNames.in
+++ b/tools/dom/scripts/CSSPropertyNames.in
@@ -288,7 +288,8 @@
 -webkit-column-break-inside
 -webkit-column-count
 column-fill
--webkit-column-gap
+column-gap
+-webkit-column-gap alias_for=column-gap
 -webkit-column-rule
 -webkit-column-rule-color
 -webkit-column-rule-style
@@ -321,6 +322,7 @@
 justify-content
 -webkit-justify-content alias_for=justify-content
 -webkit-font-size-delta
+gap
 grid-auto-columns
 grid-auto-flow
 grid-auto-rows
@@ -387,6 +389,7 @@
 -webkit-perspective-origin-x
 -webkit-perspective-origin-y
 -webkit-print-color-adjust
+row-gap
 -webkit-rtl-ordering
 -webkit-ruby-position
 -webkit-text-combine
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 1319e95..dd31046 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -124,9 +124,9 @@
     generator.CleanupOperationArguments(webkit_database)
 
     emitters = multiemitter.MultiEmitter(logging_level)
-    metadata = DartMetadata(
-        os.path.join(current_dir, '..', 'dom.json'),
-        os.path.join(current_dir, '..', 'docs', 'docs.json'), logging_level)
+    metadata = DartMetadata(os.path.join(current_dir, '..', 'dom.json'),
+                            os.path.join(current_dir, '..', 'docs.json'),
+                            logging_level)
     renamer = HtmlRenamer(webkit_database, metadata)
     type_registry = TypeRegistry(webkit_database, renamer)
 
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index bcc36f3..6ac22ce 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -293,8 +293,23 @@
         'CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties',
         'ApplicationCache':
         'ApplicationCache,DOMApplicationCache,OfflineResourceList',
+        'DirectoryEntry':
+        #Chrome         Edge/Opera
+        'DirectoryEntry,webkitFileSystemDirectoryEntry,FileSystemDirectoryEntry',
+        'DirectoryReader':
+        #Chrome          Edge                  Opera
+        'DirectoryReader,WebKitDirectoryReader,webkitFileSystemDirectoryReader,FileSystemDirectoryReader',
+        'DOMFileSystem':
+        #Chrome        Edge             Opera
+        'DOMFileSystem,WebKitFileSystem,webkitFileSystem,FileSystem',
+        'Entry':
+        #Chrome Edge
+        'Entry,webkitFileSystemEntry,FileSystemEntry',
         'Event':
         'Event,InputEvent,SubmitEvent',  # Workaround for issue 40901.
+        'FileEntry':
+        #Chrome    Edge
+        'FileEntry,webkitFileSystemFileEntry,FileSystemFileEntry',
         'HTMLTableCellElement':
         'HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement',
         'GainNode':
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 7e84e7c..30fa1af 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -268,6 +268,8 @@
             'getDirectory': [''],
             'getFile': [
                 'applyExtension(\'FileEntry\', value);',
+                'applyExtension(\'webkitFileSystemFileEntry\', value);',
+                'applyExtension(\'FileSystemFileEntry\', value);',
             ]
         },
         'Entry': {
@@ -276,6 +278,8 @@
             ],
             'getParent': [
                 'applyExtension(\'Entry\', value);',
+                'applyExtension(\'webkitFileSystemEntry\', value);',
+                'applyExtension(\'FileSystemEntry\', value);',
             ]
         },
         'FileEntry': {
@@ -291,7 +295,12 @@
         'Window': {
             'webkitRequestFileSystem': [
                 'applyExtension(\'DOMFileSystem\', value);',
+                'applyExtension(\'WebKitFileSystem\', value);',
+                'applyExtension(\'webkitFileSystem\', value);',
+                'applyExtension(\'FileSystem\', value);',
                 'applyExtension(\'DirectoryEntry\', value.root);',
+                'applyExtension(\'webkitFileSystemDirectoryEntry\', value.root);',
+                'applyExtension(\'FileSystemDirectoryEntry\', value.root);',
             ]
         },
     })
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 9fa35dc..63d913e 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -732,7 +732,7 @@
         if mixins:
             mixins_str = ' with ' + ', '.join(mixins)
             if not base_class:
-                base_class = 'Interceptor'
+                base_class = 'JavaScriptObject'
             elif (base_class == 'NativeFieldWrapperClass2' and
                   self._options.dart_js_interop and
                   not (isinstance(self._backend, Dart2JSBackend))):
@@ -1831,7 +1831,7 @@
         pass
 
     def RootClassName(self):
-        return 'Interceptor'
+        return 'JavaScriptObject'
 
     def OmitOperationOverrides(self):
         return True
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index b3dc526..c185ef7 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -45,7 +45,7 @@
     findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord,
     makeLeafDispatchRecord, registerGlobalObject, applyExtension;
 import 'dart:_interceptors' show
-    Interceptor, JavaScriptFunction, JSExtendableArray, JSUInt31,
+    JavaScriptObject, JavaScriptFunction, JSExtendableArray, JSUInt31,
     findInterceptorConstructorForType,
     findConstructorForNativeSubclassType,
     getNativeInterceptor,
diff --git a/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate b/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
index 8373820..2bfbeeb 100644
--- a/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
@@ -83,7 +83,7 @@
 import 'dart:typed_data';
 import 'dart:_js_helper' show Creates, Returns, JSName, Native;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor, JSExtendableArray;
+import 'dart:_interceptors' show JavaScriptObject, JSExtendableArray;
 
 import 'dart:_js_helper' show convertDartClosureToJS;
 
diff --git a/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate b/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
index e2f72ee..c7f153a 100644
--- a/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
@@ -21,7 +21,7 @@
 import 'dart:html_common';
 import 'dart:_js_helper' show Creates, Returns, JSName, Native;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor;
+import 'dart:_interceptors' show JavaScriptObject;
 
 part '$AUXILIARY_DIR/shared_SVGFactoryProviders.dart';
 
diff --git a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
index 31437b3..44c468f 100644
--- a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
@@ -20,6 +20,6 @@
     Creates, JavaScriptIndexingBehavior, JSName, Native, Returns,
     convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor;
+import 'dart:_interceptors' show JavaScriptObject;
 
 $!GENERATED_DART_FILES
diff --git a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
index 8780f3a..5b2fc8cf 100644
--- a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
@@ -18,6 +18,6 @@
 import 'dart:typed_data';
 import 'dart:_js_helper' show Creates, JSName, Native, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor, JSExtendableArray;
+import 'dart:_interceptors' show JavaScriptObject, JSExtendableArray;
 
 $!GENERATED_DART_FILES
diff --git a/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
index 8877f95..9c25d0a 100644
--- a/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
@@ -26,6 +26,6 @@
 import 'dart:_js_helper' show applyExtension, convertDartClosureToJS, Creates,
     JSName, Native, JavaScriptIndexingBehavior, Returns;
 import 'dart:_foreign_helper' show JS;
-import 'dart:_interceptors' show Interceptor;
+import 'dart:_interceptors' show JavaScriptObject;
 
 $!GENERATED_DART_FILES
diff --git a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index 914faca..7aade98 100644
--- a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -3139,6 +3139,15 @@
     setProperty('font-weight', value, '');
   }
 
+  /** Gets the value of "gap" */
+  String get gap =>
+    getPropertyValue('gap');
+
+  /** Sets the value of "gap" */
+  set gap(String value) {
+    setProperty('gap', value, '');
+  }
+
   /** Gets the value of "grid" */
   String get grid =>
     getPropertyValue('grid');
@@ -4192,6 +4201,15 @@
     setProperty('right', value, '');
   }
 
+  /** Gets the value of "row-gap" */
+  String get rowGap =>
+    getPropertyValue('row-gap');
+
+  /** Sets the value of "row-gap" */
+  set rowGap(String value) {
+    setProperty('row-gap', value, '');
+  }
+
   /** Gets the value of "rtl-ordering" */
   String get rtlOrdering =>
     getPropertyValue('rtl-ordering');
diff --git a/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate b/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate
index ca64994..42e643d 100644
--- a/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate
@@ -9,12 +9,19 @@
   Entry getAsEntry() {
     Entry entry = _webkitGetAsEntry() $#NULLSAFECAST(as Entry);
 
-    if (entry.isFile$NULLASSERT)
+    if (entry.isFile$NULLASSERT) {
       applyExtension('FileEntry', entry);
-    else if (entry.isDirectory$NULLASSERT)
+      applyExtension('webkitFileSystemFileEntry', entry);
+      applyExtension('FileSystemFileEntry', entry);
+    } else if (entry.isDirectory$NULLASSERT) {
       applyExtension('DirectoryEntry', entry);
-    else
+      applyExtension('webkitFileSystemDirectoryEntry', entry);
+      applyExtension('FileSystemDirectoryEntry', entry);
+    } else {
       applyExtension('Entry', entry);
+      applyExtension('webkitFileSystemEntry', entry);
+      applyExtension('FileSystemEntry', entry);
+    }
 
     return entry;
   }
diff --git a/tools/dom/templates/html/impl/impl_DirectoryEntry.darttemplate b/tools/dom/templates/html/impl/impl_DirectoryEntry.darttemplate
index 98cced4..1e31f90 100644
--- a/tools/dom/templates/html/impl/impl_DirectoryEntry.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DirectoryEntry.darttemplate
@@ -19,6 +19,9 @@
   DirectoryReader createReader() {
     DirectoryReader reader = _createReader();
     applyExtension('DirectoryReader', reader);
+    applyExtension('WebKitDirectoryReader', reader);
+    applyExtension('webkitFileSystemDirectoryReader', reader);
+    applyExtension('FileSystemDirectoryReader', reader);
     return reader;
   }
 
diff --git a/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate b/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate
index b643159..ab4f199 100644
--- a/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate
@@ -12,11 +12,18 @@
     _readEntries((values) {
       values.forEach((value) {
         applyExtension('Entry', value);
+        applyExtension('webkitFileSystemEntry', value);
+        applyExtension('FileSystemEntry', value);
         Entry entry = value as Entry;
-        if (entry.isFile$NULLASSERT)
+        if (entry.isFile$NULLASSERT) {
           applyExtension('FileEntry', entry);
-        else if (entry.isDirectory$NULLASSERT)
+          applyExtension('webkitFileSystemFileEntry', entry);
+          applyExtension('FileSystemFileEntry', entry);
+        } else if (entry.isDirectory$NULLASSERT) {
           applyExtension('DirectoryEntry', entry);
+          applyExtension('webkitFileSystemDirectoryEntry', entry);
+          applyExtension('FileSystemDirectoryEntry', entry);
+        }
       });
       completer.complete(new List<Entry>.from(values));
     }, (error) {
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 8ced8e6..046addf 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -756,13 +756,9 @@
   /**
    * Allows access to all custom data attributes (data-*) set on this element.
    *
-   * The keys for the map must follow these rules:
-   *
-   * * The name must not begin with 'xml'.
-   * * The name cannot contain a semi-colon (';').
-   * * The name cannot contain any capital letters.
-   *
-   * Any keys from markup will be converted to camel-cased keys in the map.
+   * Any data attributes in the markup will be converted to camel-cased keys
+   * in the map based on [these conversion
+   * rules](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset).
    *
    * For example, HTML specified as:
    *
@@ -774,6 +770,8 @@
    *
    * See also:
    *
+   * * [HTML data-* attributes naming
+       restrictions](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*)
    * * [Custom data
    *   attributes](http://dev.w3.org/html5/spec-preview/global-attributes.html#custom-data-attribute)
    */
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index 23092f5..a411fd9 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -220,13 +220,13 @@
   }
 
   /**
-   * Inserts all of the nodes into this node directly before refChild.
+   * Inserts all of the nodes into this node directly before child.
    *
    * See also:
    *
    * * [insertBefore]
    */
-  void insertAllBefore(Iterable<Node> newNodes, Node refChild) {
+  void insertAllBefore(Iterable<Node> newNodes, Node child) {
     if (newNodes is _ChildNodeListLazy) {
       _ChildNodeListLazy otherList = newNodes;
       if (identical(otherList._this, this)) {
@@ -235,11 +235,11 @@
 
       // Optimized route for copying between nodes.
       for (var i = 0, len = otherList.length; i < len; ++i) {
-        this.insertBefore(otherList._this.firstChild$NULLASSERT, refChild);
+        this.insertBefore(otherList._this.firstChild$NULLASSERT, child);
       }
     } else {
       for (var node in newNodes) {
-        this.insertBefore(node, refChild);
+        this.insertBefore(node, child);
       }
     }
   }
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 971d422..3ca32be 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -103,7 +103,7 @@
 # default 'language' "category" with code generated for both CFE and Analyzer,
 # while other categories can be tailored more specifically.
 
-current-version: '2.15.0'
+current-version: '2.16.0'
 
 features:
   variance:
@@ -131,6 +131,9 @@
   super-parameters:
     help: "Super-Initializer Parameters"
 
+  macros:
+    help: "Static meta-programming"
+
 # Experiment flag only used for testing.
   test-experiment:
     help: >-
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 066eb2c..d6c7b56 100644
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -56,6 +56,7 @@
     packageDirectory('runtime/observatory_2'),
     packageDirectory(
         'runtime/observatory_2/tests/service_2/observatory_test_package_2'),
+    packageDirectory('pkg/vm_service/test/test_package'),
     packageDirectory('sdk/lib/_internal/sdk_library_metadata'),
     packageDirectory('third_party/devtools/devtools_server'),
     packageDirectory('third_party/devtools/devtools_shared'),
diff --git a/tools/gn.py b/tools/gn.py
index dccae52..fe4718d 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -215,6 +215,9 @@
                                     (gn_args['target_cpu'] != 'arm') and
                                     sanitizer == 'none')
 
+    # Use mallinfo2 if specified on the command line
+    gn_args['dart_use_mallinfo2'] = args.use_mallinfo2
+
     if gn_args['target_os'] == 'linux':
         if gn_args['target_cpu'] == 'arm':
             # Default to -mfloat-abi=hard and -mfpu=neon for arm on Linux as we're
@@ -490,6 +493,11 @@
         '-s',
         type=str,
         help='Comma-separated list of arch=/path/to/sysroot mappings')
+    parser.add_argument('--use-mallinfo2',
+                        help='Use mallinfo2 to collect malloc stats.',
+                        default=False,
+                        dest='use_mallinfo2',
+                        action='store_true')
 
 
 def AddCommonConfigurationArgs(parser):
diff --git a/tools/linux_dist_support/upload_debian_packages.py b/tools/linux_dist_support/upload_debian_packages.py
index d2f7151..ab3c911 100755
--- a/tools/linux_dist_support/upload_debian_packages.py
+++ b/tools/linux_dist_support/upload_debian_packages.py
@@ -22,7 +22,7 @@
     remote_tarfile = '/'.join(
         [namer.src_directory(revision),
          os.path.basename(tarfile)])
-    gsutil.upload(tarfile, remote_tarfile, public=True)
+    gsutil.upload(tarfile, remote_tarfile)
     # Archive all files except the tar file to the linux packages dir
     for entry in os.listdir(builddir):
         full_path = os.path.join(builddir, entry)
@@ -31,7 +31,7 @@
         if full_path != tarfile:
             package_dir = namer.linux_packages_directory(revision)
             remote_file = '/'.join([package_dir, os.path.basename(entry)])
-            gsutil.upload(full_path, remote_file, public=True)
+            gsutil.upload(full_path, remote_file)
 
 
 if __name__ == '__main__':
diff --git a/tools/package_deps/bin/package_deps.dart b/tools/package_deps/bin/package_deps.dart
index d0a8abc..38cca34 100644
--- a/tools/package_deps/bin/package_deps.dart
+++ b/tools/package_deps/bin/package_deps.dart
@@ -321,6 +321,7 @@
         // Skip 'pkg/analyzer_cli/test/data'.
         // Skip 'pkg/front_end/test/id_testing/data/'.
         // Skip 'pkg/front_end/test/language_versioning/data/'.
+        // Skip 'pkg/front_end/outline_extraction_testcases/'.
         if (name == 'data' && path.split(entity.parent.path).contains('test')) {
           continue;
         }
@@ -335,6 +336,11 @@
           continue;
         }
 
+        // Skip 'pkg/front_end/outline_extraction_testcases'.
+        if (name == 'outline_extraction_testcases') {
+          continue;
+        }
+
         if (!name.startsWith('.')) {
           _collectDartFiles(entity, files);
         }
diff --git a/tools/promote.py b/tools/promote.py
index 966b735..4d32d19 100755
--- a/tools/promote.py
+++ b/tools/promote.py
@@ -152,30 +152,30 @@
         remove_gs_directory(to_loc)
         has_signed = exists(from_loc)
         if has_signed:
-            Gsutil(['-m', 'cp', '-a', 'public-read', '-R', from_loc, to_loc])
+            Gsutil(['-m', 'cp', '-R', from_loc, to_loc])
             # Because gsutil copies differently to existing directories, we need
             # to use the base directory for the next recursive copy.
             to_loc = release_namer.base_directory(to_revision)
 
         # Copy the unsigned sdk directory without clobbering signed files.
         from_loc = raw_namer.sdk_directory(revision)
-        Gsutil(['-m', 'cp', '-n', '-a', 'public-read', '-R', from_loc, to_loc])
+        Gsutil(['-m', 'cp', '-n', '-R', from_loc, to_loc])
 
         # Copy api-docs zipfile.
         from_loc = raw_namer.apidocs_zipfilepath(revision)
         to_loc = release_namer.apidocs_zipfilepath(to_revision)
-        Gsutil(['-m', 'cp', '-a', 'public-read', from_loc, to_loc])
+        Gsutil(['-m', 'cp', from_loc, to_loc])
 
         # Copy linux deb and src packages.
         from_loc = raw_namer.linux_packages_directory(revision)
         to_loc = release_namer.linux_packages_directory(to_revision)
         remove_gs_directory(to_loc)
-        Gsutil(['-m', 'cp', '-a', 'public-read', '-R', from_loc, to_loc])
+        Gsutil(['-m', 'cp', '-R', from_loc, to_loc])
 
         # Copy VERSION file.
         from_loc = raw_namer.version_filepath(revision)
         to_loc = release_namer.version_filepath(to_revision)
-        Gsutil(['cp', '-a', 'public-read', from_loc, to_loc])
+        Gsutil(['cp', from_loc, to_loc])
 
     promote(revision)
     promote('latest')
diff --git a/tools/verify_docs/README.md b/tools/verify_docs/README.md
index a79aa7c..41be863 100644
--- a/tools/verify_docs/README.md
+++ b/tools/verify_docs/README.md
@@ -1,19 +1,20 @@
-## Whats' this?
+## What’s this?
 
 A tool to validate the documentation comments for the `dart:` libraries.
 
 ## Running the tool
 
-To validate all the dart: libraries, run:
+To validate all the `dart:` libraries, run:
 
 ```
 dart tools/verify_docs/bin/verify_docs.dart
 ```
 
-Or to validate an individual library (async, collection, js_util, ...), run:
+Or to validate an individual library (async, collection, js_util, ...), run either of:
 
 ```
 dart tools/verify_docs/bin/verify_docs.dart sdk/lib/<lib-name>
+dart tools/verify_docs/bin/verify_docs.dart dart:<lib-name>
 ```
 
 The tool should be run from the root of the sdk repository.
@@ -22,68 +23,104 @@
 
 ### What gets analyzed
 
-This tool will walk all dartdoc api docs looking for code samples in doc comments.
+This tool will walk all DartDoc API docs looking for code samples in doc comments.
 It will analyze any code sample in a `dart` code fence. For example:
 
-> ```dart
-> print('hello world!');
-> ```
+> ````dart
+> /// ```dart
+> /// print('hello world!');
+> /// ```
+> ````
 
-By default, an import for that library is added to the sample being analyzed (i.e.,
-`import 'dart:async";`).
+By default, an import for that library is added to the sample being analyzed, e.g., `import 'dart:async";`.
 
 ### Excluding code samples from analysis
 
 In order to exclude a code sample from analysis, change it to a plain code fence style:
 
-> ```
-> print("I'm not analyzed :(");
-> ```
-
-### Specifying additional imports
-
-In order to reference code from other Dart core libraries, you can either explicitly add
-the import to the code sample - in-line in the sample - or use a directive on the same
-line as the code fence. The directive style looks like:
-
-> ```dart import:async
-> print('hello world ${Timer()}');
-> ```
-
-Multiple imports can be specified like this if desired (i.e., "```dart import:async import:convert").
+> ````dart
+> /// ```
+> /// print("I'm not analyzed :(");
+> /// ```
+> ````
 
 ### Specifying templates
 
 The analysis tool can inject the code sample into a template before analyzing the
-sample. This allows the author to focus on the import parts of the API being
+sample. This allows the author to focus on the important parts of the API being
 documented with less boilerplate in the generated docs.
 
+The template includes an automatic import of the library containing the example, so an example in, say, the documentation of `StreamController.add` would have `dart:async` imported automatically.
+
 The tool will try and automatically detect the right template to use based on
 code patterns within the sample itself. In order to explicitly indicate which template
 to use, you can specify it as part of the code fence line. For example:
 
-> ```dart template:main
-> print('hello world ${Timer()}');
+> ```dart
+> /// ```dart template:main
+> /// print('hello world ${Timer()}');
+> /// ```
 > ```
 
-The three current templates are:
-- `none`: do not wrap the code sample in any template
-- `main`: wrap the code sample in a simple main() method
-- `expression`: wrap the code sample in a statement within a main() method
+The current templates are:
 
-For most code sample, the auto-detection code will select `template:main` or
+- `none`: Do not wrap the code sample in any template, including no imports.
+- `top`: The code sample is top level code, preceded only by imports.
+- `main`: The code sample is one or more statements in a simple asynchronous  `main()` function.
+- `expression`: The code sample is an expression within a simple asynchronous `main()` method.
+
+For most code samples, the auto-detection code will select `template:main` or
 `template:expression`.
 
+If the example contains any `library` declarations, the template becomes `none`.
+
+### Specifying additional imports
+
+If your example contains any `library`, the default import of the current library is omitted. To avoid that, you can declare extra automatic imports in the code fence like:
+
+> ````dart
+> /// ```dart import:async
+> /// print('hello world ${Timer()}');
+> /// ```
+> ````
+
+Multiple imports can be specified like this if desired, e.g., "```` ```dart import:async import:convert````".
+
+Does not work if combined with `template:none`, whether the `none` template is specified explicitly or auto-detected.
+
+### Splitting examples
+
+Some examples may be split into separate code blocks, but should be seen
+as continuing the same running example.
+
+If the following code blocks are marked as `continued` as shown below, they
+are included into the previous code block instead of being treated as a new
+example.
+
+> ````dart
+> /// ```dart
+> /// var list = [1, 2, 3];
+> /// ```
+> /// And then you can also do the following:
+> /// ```dart continued
+> /// list.forEach(print);
+> /// ```
+> ````
+
+A `continued` code block cannot have any other flags in the fence.
+
 ### Including additional code for analysis
 
 You can declare code that should be included in the analysis but not shown in
 the API docs by adding a comment "// Examples can assume:" to the file (usually
 at the top of the file, after the imports), following by one or more
-commented-out lines of code. That code is included verbatim in the analysis. For
-example:
+commented-out lines of code. That code is included verbatim in the analysis, at top-level after the automatic imports. Does not work with `template:none`.
+
+For example:
 
 ```dart
 // Examples can assume:
 // final BuildContext context;
 // final String userAvatarUrl;
 ```
+
diff --git a/tools/verify_docs/bin/verify_docs.dart b/tools/verify_docs/bin/verify_docs.dart
old mode 100644
new mode 100755
index 085223f..8cba35f
--- a/tools/verify_docs/bin/verify_docs.dart
+++ b/tools/verify_docs/bin/verify_docs.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.
 
+// Read the ../README.md file for the recognized syntax.
+
 import 'dart:collection';
 import 'dart:io';
 
@@ -20,10 +22,10 @@
 import 'package:analyzer/src/util/comment.dart';
 import 'package:path/path.dart' as path;
 
+final libDir = Directory(path.join('sdk', 'lib'));
 void main(List<String> args) async {
-  final libDir = Directory('sdk/lib');
   if (!libDir.existsSync()) {
-    print('Please run this tool from the root of the sdk repo.');
+    print('Please run this tool from the root of the sdk repository.');
     exit(1);
   }
 
@@ -37,7 +39,7 @@
 
   final coreLibraries = args.isEmpty
       ? libDir.listSync().whereType<Directory>().toList()
-      : args.map((arg) => Directory(arg)).toList();
+      : args.map(parseArg).toList();
   coreLibraries.sort((a, b) => a.path.compareTo(b.path));
 
   // Skip some dart: libraries.
@@ -172,9 +174,9 @@
     var offset = text.indexOf(sampleStart);
     while (offset != -1) {
       // Collect template directives, like "```dart import:async".
-      final codeFenceSuffix = text.substring(
-          offset + sampleStart.length, text.indexOf('\n', offset));
-      final directives = Set.unmodifiable(codeFenceSuffix.trim().split(' '));
+      final codeFenceSuffix = text
+          .substring(offset + sampleStart.length, text.indexOf('\n', offset))
+          .trim();
 
       offset = text.indexOf('\n', offset) + 1;
       final end = text.indexOf(sampleEnd, offset);
@@ -183,73 +185,128 @@
       snippet = snippet.substring(0, snippet.lastIndexOf('\n'));
 
       List<String> lines = snippet.split('\n');
-
-      samples.add(
-        CodeSample(
-          lines.map((e) => '  ${cleanDocLine(e)}').join('\n'),
-          coreLibName: coreLibName,
-          directives: directives,
-          lineStartOffset: commentLineStart +
-              text.substring(0, offset - 1).split('\n').length -
-              1,
-        ),
-      );
+      var startLineNumber = commentLineStart +
+          text.substring(0, offset - 1).split('\n').length -
+          1;
+      if (codeFenceSuffix == "continued") {
+        if (samples.isEmpty) {
+          throw "Continued code block without previous code";
+        }
+        samples.last = samples.last.append(lines, startLineNumber);
+      } else {
+        final directives = Set.unmodifiable(codeFenceSuffix.split(' '));
+        samples.add(
+          CodeSample(
+            [for (var e in lines) '  ${cleanDocLine(e)}'],
+            coreLibName: coreLibName,
+            directives: directives,
+            lineStartOffset: startLineNumber,
+          ),
+        );
+      }
 
       offset = text.indexOf(sampleStart, offset);
     }
   }
 
-  Future validateCodeSample(CodeSample sample) async {
-    var text = sample.text;
-    final lines = sample.text.split('\n').map((l) => l.trim()).toList();
+  // RegExp detecting various top-level declarations or `main(`.
+  //
+  // If the top-level declaration is `library` or `import`,
+  // then match 1 (`libdecl`) will be non-null.
+  // This is a sign that no auto-imports should be added.
+  //
+  // If an import declaration is included in the sample, no
+  // assumed-declarations are added.
+  // Use the `import:foo` template to import other `dart:` libraries
+  // instead of writing them explicitly to.
+  //
+  // Captures:
+  // 1/libdecl: Non-null if mathcing a `library` declaration.
+  // 2: Internal use, quote around import URI.
+  // 3/importuri: Import URI.
+  final _toplevelDeclarationRE = RegExp(r'^\s*(?:'
+      r'library\b(?<libdecl>)|'
+      r'''import (['"])(?<importuri>.*?)\2|'''
+      r'class\b|mixin\b|enum\b|extension\b|typedef\b|.*\bmain\('
+      r')');
 
-    final hasImports = text.contains("import '") || text.contains('import "');
+  validateCodeSample(CodeSample sample) async {
+    final lines = sample.lines;
 
-    // One of 'none', 'main', or 'expression'.
-    String? template;
+    // The default imports includes the library itself
+    // and any import directives.
+    Set<String> autoImports = sample.imports;
 
-    if (sample.hasTemplateDirective) {
-      template = sample.templateDirective;
+    // One of 'none', 'top, 'main', or 'expression'.
+    String template;
+
+    bool hasImport = false;
+
+    final templateDirective = sample.templateDirective;
+    if (templateDirective != null) {
+      template = templateDirective;
     } else {
-      // If there's no explicit template, auto-detect one.
-      if (lines.any((line) =>
-          line.startsWith('class ') ||
-          line.startsWith('enum ') ||
-          line.startsWith('extension '))) {
+      // Scan lines for top-level declarations.
+      bool hasTopDeclaration = false;
+      bool hasLibraryDeclaration = false;
+      for (var line in lines) {
+        var topDeclaration = _toplevelDeclarationRE.firstMatch(line);
+        if (topDeclaration != null) {
+          hasTopDeclaration = true;
+          hasLibraryDeclaration |=
+              (topDeclaration.namedGroup("libdecl") != null);
+          var importDecl = topDeclaration.namedGroup("importuri");
+          if (importDecl != null) {
+            hasImport = true;
+            if (importDecl.startsWith('dart:')) {
+              // Remove explicit imports from automatic imports
+              // to avoid duplicate import warnings.
+              autoImports.remove(importDecl.substring('dart:'.length));
+            }
+          }
+        }
+      }
+      if (hasLibraryDeclaration) {
         template = 'none';
-      } else if (lines
-          .any((line) => line.startsWith('main(') || line.contains(' main('))) {
-        template = 'none';
+      } else if (hasTopDeclaration) {
+        template = 'top';
       } else if (lines.length == 1 && !lines.first.trim().endsWith(';')) {
+        // If single line with no trailing `;`, assume expression.
         template = 'expression';
       } else {
+        // Otherwise default to `main`.
         template = 'main';
       }
     }
 
-    final assumptions = sampleAssumptions ?? '';
+    var buffer = StringBuffer();
 
-    if (!hasImports) {
-      if (template == 'none') {
-        // just use the sample text as is
-      } else if (template == 'main') {
-        text = "${assumptions}main() async {\n${text.trimRight()}\n}\n";
-      } else if (template == 'expression') {
-        text = "${assumptions}main() async {\n${text.trimRight()}\n;\n}\n";
-      } else {
-        throw 'unexpected template directive: $template';
+    if (template != 'none') {
+      for (var library in autoImports) {
+        buffer.writeln("import 'dart:$library';");
       }
-
-      for (final directive
-          in sample.directives.where((str) => str.startsWith('import:'))) {
-        final libName = directive.substring('import:'.length);
-        text = "import 'dart:$libName';\n$text";
-      }
-
-      if (sample.coreLibName != 'internal') {
-        text = "import 'dart:${sample.coreLibName}';\n$text";
+      if (!hasImport) {
+        buffer.write(sampleAssumptions ?? '');
       }
     }
+    if (template == 'none' || template == 'top') {
+      buffer.writeAllLines(lines);
+    } else if (template == 'main') {
+      buffer
+        ..writeln('void main() async {')
+        ..writeAllLines(lines)
+        ..writeln('}');
+    } else if (template == 'expression') {
+      assert(lines.length >= 1);
+      buffer
+        ..writeln('void main() async =>')
+        ..writeAllLines(lines.take(lines.length - 1))
+        ..writeln("${lines.last.trimRight()};");
+    } else {
+      throw 'unexpected template directive: $template';
+    }
+
+    final text = buffer.toString();
 
     final result = await analysisHelper.resolveFile(text);
 
@@ -311,8 +368,7 @@
         print('');
 
         // Print out the code sample.
-        print(sample.text
-            .split('\n')
+        print(sample.lines
             .map((line) =>
                 '  >${line.length >= 5 ? line.substring(5) : line.trimLeft()}')
             .join('\n'));
@@ -337,27 +393,63 @@
 }
 
 class CodeSample {
+  /// Currently valid template names.
+  static const validTemplates = ['none', 'top', 'main', 'expression'];
+
   final String coreLibName;
   final Set<String> directives;
-  final String text;
+  final List<String> lines;
   final int lineStartOffset;
 
   CodeSample(
-    this.text, {
+    this.lines, {
     required this.coreLibName,
     this.directives = const {},
     required this.lineStartOffset,
   });
 
+  String get text => lines.join('\n');
+
   bool get hasTemplateDirective => templateDirective != null;
 
+  /// The specified template, or `null` if no template is specified.
+  ///
+  /// A specified template must be of [validTemplates].
   String? get templateDirective {
     const prefix = 'template:';
 
-    String? match = directives.cast<String?>().firstWhere(
-        (directive) => directive!.startsWith(prefix),
-        orElse: () => null);
-    return match == null ? match : match.substring(prefix.length);
+    for (var directive in directives) {
+      if (directive.startsWith(prefix)) {
+        var result = directive.substring(prefix.length);
+        if (!validTemplates.contains(result)) {
+          throw "Invalid template name: $result";
+        }
+        return result;
+      }
+    }
+    return null;
+  }
+
+  /// The implicit or explicitly requested imports.
+  Set<String> get imports => {
+        if (coreLibName != 'internal' && coreLibName != 'core') coreLibName,
+        for (var directive in directives)
+          if (directive.startsWith('import:'))
+            directive.substring('import:'.length)
+      };
+
+  /// Creates a new code sample by appending [lines] to this sample.
+  ///
+  /// The new sample only differs from this sample in that it has
+  /// more lines appended, first `this.lines`, then a gap of `  //` lines
+  /// and then [lines].
+  CodeSample append(List<String> lines, int lineStartOffset) {
+    var gapSize = lineStartOffset - (this.lineStartOffset + this.lines.length);
+    return CodeSample(
+        [...this.lines, for (var i = 0; i < gapSize; i++) "  //", ...lines],
+        coreLibName: coreLibName,
+        directives: directives,
+        lineStartOffset: this.lineStartOffset);
   }
 }
 
@@ -422,3 +514,35 @@
     return await analysisSession.getResolvedUnit(samplePath);
   }
 }
+
+// Helper function to make things easier to read.
+extension on StringBuffer {
+  /// Write every line, right-trimmed, of [lines] with a newline after.
+  void writeAllLines(Iterable<String> lines) {
+    for (var line in lines) {
+      this.writeln(line.trimRight());
+    }
+  }
+}
+
+/// Interprets [arg] as directory containing a platform library.
+///
+/// If [arg] is `dart:foo`, the directory is the default directory for
+/// the `dart:foo` library source.
+/// Otherwise, if [arg] is a directory (relative to the current directory)
+/// which exists, that is the result.
+/// Otherwise, if [arg] is the name of a platform library,
+/// like `foo` where `dart:foo` is a platform library,
+/// the result is the default directory for that library's source.
+/// Otherwise it's treated as a directory relative to the current directory,
+/// which doesn't exist (but that's what the error will refer to).
+Directory parseArg(String arg) {
+  if (arg.startsWith('dart:')) {
+    return Directory(path.join(libDir.path, arg.substring('dart:'.length)));
+  }
+  var dir = Directory(arg);
+  if (dir.existsSync()) return dir;
+  var relDir = Directory(path.join(libDir.path, arg));
+  if (relDir.existsSync()) return relDir;
+  return dir;
+}
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index da80743..5d93e80 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -49,11 +49,16 @@
   abs_output = rebase_path(out)
 
   prebuilt_dart_action(target_name) {
-    deps = invoker.deps + [ "../compiler:compile_dart2js_platform" ]
+    deps = invoker.deps + [
+             "../compiler:compile_dart2js_platform",
+             "../compiler:compile_dart2js_platform_unsound",
+           ]
 
     inputs = [
       "$root_out_dir/dart2js_platform.dill",
+      "$root_out_dir/dart2js_platform_unsound.dill",
       "$root_out_dir/dart2js_outline.dill",
+      "$root_out_dir/dart2js_outline_unsound.dill",
     ]
     outputs = [ out ]